summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vscode/tasks.json22
-rwxr-xr-xclasses/api.php2
-rwxr-xr-xclasses/article.php4
-rw-r--r--classes/config.php14
-rw-r--r--classes/counters.php38
-rwxr-xr-xclasses/db.php8
-rw-r--r--classes/db/migrations.php49
-rw-r--r--classes/debug.php47
-rw-r--r--classes/digest.php4
-rw-r--r--classes/diskcache.php6
-rwxr-xr-xclasses/feeditem/atom.php8
-rwxr-xr-xclasses/feeditem/common.php2
-rwxr-xr-xclasses/feeditem/rss.php2
-rw-r--r--classes/feedparser.php14
-rwxr-xr-xclasses/feeds.php42
-rw-r--r--classes/handler.php6
-rwxr-xr-xclasses/handler/public.php26
-rw-r--r--classes/mailer.php15
-rw-r--r--classes/plugin.php14
-rwxr-xr-xclasses/pluginhost.php75
-rwxr-xr-xclasses/pref/feeds.php16
-rwxr-xr-xclasses/pref/filters.php15
-rw-r--r--classes/pref/prefs.php42
-rw-r--r--classes/prefs.php6
-rwxr-xr-xclasses/rpc.php13
-rwxr-xr-xclasses/rssutils.php39
-rw-r--r--classes/urlhelper.php103
-rw-r--r--classes/userhelper.php160
-rw-r--r--composer.json16
-rw-r--r--composer.lock341
-rw-r--r--include/functions.php3
-rwxr-xr-xinclude/login_form.php22
-rw-r--r--index.php4
-rw-r--r--js/PrefFeedTree.js13
-rw-r--r--js/PrefFilterTree.js11
-rw-r--r--phpstan.neon2
-rwxr-xr-xplugins/af_comics/init.php5
-rw-r--r--plugins/af_psql_trgm/init.php98
-rw-r--r--plugins/af_readability/composer.json17
-rw-r--r--plugins/af_readability/composer.lock392
-rwxr-xr-xplugins/af_readability/init.php4
-rw-r--r--plugins/af_readability/vendor/composer/InstalledVersions.php76
-rw-r--r--plugins/af_readability/vendor/composer/autoload_psr4.php5
-rw-r--r--plugins/af_readability/vendor/composer/autoload_static.php29
-rw-r--r--plugins/af_readability/vendor/composer/installed.json403
-rw-r--r--plugins/af_readability/vendor/composer/installed.php57
-rw-r--r--plugins/af_readability/vendor/composer/platform_check.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.github/workflows/main.yml42
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.gitignore3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml13
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml48
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/Makefile21
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/README.md88
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/composer.json33
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/docker-compose.yml156
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/docker/php/Dockerfile18
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/docker/php/build.Dockerfile56
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Configuration.php77
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMAttr.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCdataSection.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCharacterData.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMComment.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocument.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentFragment.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentType.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMElement.php40
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntity.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntityReference.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNode.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNodeList.php2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNotation.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMProcessingInstruction.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMText.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeTrait.php69
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeUtility.php36
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/ParseException.php2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/src/Readability.php832
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/ConfigurationTest.php4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/ReadabilityTest.php75
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/TestPage.php18
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/001/expected.html18
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/002/expected.html197
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/003-metadata-preferred/expected.html1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/004-metadata-space-separated-properties/expected.html1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected-metadata.json10
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected.html2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected.html317
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/source.html1025
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-metadata.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected.html87
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/source.html1275
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json12
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json10
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json12
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json14
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html63
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html14
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html36
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html37503
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-images.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected.html108
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/source.html683
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html13
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html24
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html17
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html15
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html32
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-images.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/source.html19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-images.json5
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected.html527
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/source.html868
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected.html56
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/source.html485
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html92
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html112
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html13
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json23
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html262
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected.html24
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/source.html2518
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected.html458
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/source.html742
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-images.json16
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected.html297
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/source.html1369
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html26
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html9
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json13
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html220
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html15
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html139
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/source.html14
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json34
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html271
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-images.json19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected.html524
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/source.html740
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-images.json12
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected.html343
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/source.html1277
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected.html1108
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/source.html3868
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-images.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected.html8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/source.html21
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html39
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json10
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html17
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html25
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json22
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html211
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json22
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html211
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html31
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html1012
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html57
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-images.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected.html102
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/source.html2012
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html230
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html906
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html6200
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected.html738
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/source.html979
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected.html19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/source.html33
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html77
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html52
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html14
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected.html26
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/source.html35
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html62
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html72
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-images.json11
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected.html267
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/source.html1638
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-images.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected.html214
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/source.html3896
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json10
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html106
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/source.html19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html14
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html7
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-images.json4
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected.html179
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/source.html1659
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html56
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html30
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html15
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected.html93
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/source.html400
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html13
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html159
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected.html178
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/source.html259
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected.html309
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/source.html1319
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-images.json3
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected.html107
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/source.html2043
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html5
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html9
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html25
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-images.json47
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected.html3107
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/source.html7228
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-images.json53
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-metadata.json8
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected.html354
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/source.html3757
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json1
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html256
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html52
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html78
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html19
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html41
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json2
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html6
-rw-r--r--plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html16
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/LICENSE20
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/composer.json68
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php87
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php92
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php107
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php22
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/HostInterface.php51
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php48
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PathInterface.php90
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PortInterface.php22
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php227
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php147
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php88
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriException.php20
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriInterface.php292
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php40
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php20
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php20
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php46
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php20
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Idna/Idna.php212
-rw-r--r--plugins/af_readability/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php113
-rw-r--r--plugins/af_readability/vendor/league/uri/LICENSE20
-rw-r--r--plugins/af_readability/vendor/league/uri/composer.json107
-rw-r--r--plugins/af_readability/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php30
-rw-r--r--plugins/af_readability/vendor/league/uri/src/Http.php335
-rw-r--r--plugins/af_readability/vendor/league/uri/src/HttpFactory.php25
-rw-r--r--plugins/af_readability/vendor/league/uri/src/Uri.php1333
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriInfo.php215
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriResolver.php376
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriString.php467
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriTemplate.php134
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriTemplate/Expression.php329
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriTemplate/Template.php126
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriTemplate/VarSpecifier.php96
-rw-r--r--plugins/af_readability/vendor/league/uri/src/UriTemplate/VariableBag.php114
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/.gitattributes8
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/.gitignore5
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/.php_cs.dist14
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/.scrutinizer.yml41
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/.travis.yml47
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/CREDITS11
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/LICENSE.txt66
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/README.md254
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/RELEASE.md153
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/UPGRADING.md21
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/bin/entities.php26
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/composer.json42
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/example.php32
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/phpunit.xml.dist8
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5.php246
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php619
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php2236
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php10
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php41
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php61
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php705
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php114
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php33
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php87
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/ParseError.php10
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/README.md53
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Scanner.php416
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php334
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php1191
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php127
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php183
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php1533
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php553
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md33
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php99
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php142
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/ElementsTest.php485
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/utf-8.html9
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/windows-1252.html9
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.html10
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.php492
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/CharacterReferenceTest.php44
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/DOMTreeBuilderTest.php743
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStack.php116
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStackError.php7
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/InstructionProcessorMock.php26
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/ScannerTest.php184
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TokenizerTest.php978
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TreeBuildingRulesTest.php118
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/UTF8UtilsTest.php28
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/OutputRulesTest.php652
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/TraverserTest.php136
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/HTML5/TestCase.php23
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/benchmark/example.html6403
-rw-r--r--plugins/af_readability/vendor/masterminds/html5/test/benchmark/run.php29
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/.gitignore2
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/.pullapprove.yml7
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/LICENSE (renamed from vendor/symfony/polyfill-ctype/LICENSE)12
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/README.md10
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/composer.json35
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/RequestFactoryInterface.php18
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/ResponseFactoryInterface.php18
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php24
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/StreamFactoryInterface.php45
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php34
-rw-r--r--plugins/af_readability/vendor/psr/http-factory/src/UriFactoryInterface.php17
-rw-r--r--plugins/af_readability/vendor/psr/http-message/CHANGELOG.md36
-rw-r--r--plugins/af_readability/vendor/psr/http-message/LICENSE19
-rw-r--r--plugins/af_readability/vendor/psr/http-message/README.md13
-rw-r--r--plugins/af_readability/vendor/psr/http-message/composer.json26
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/MessageInterface.php187
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/RequestInterface.php129
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/ResponseInterface.php68
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/ServerRequestInterface.php261
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/StreamInterface.php158
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/UploadedFileInterface.php123
-rw-r--r--plugins/af_readability/vendor/psr/http-message/src/UriInterface.php323
-rwxr-xr-xplugins/af_redditimgur/init.php47
-rw-r--r--plugins/auth_internal/init.php12
-rw-r--r--plugins/auth_remote/init.php2
-rwxr-xr-xplugins/cache_starred_images/init.php8
-rw-r--r--prefs.php7
-rw-r--r--sql/mysql/migrations/147.sql2
-rw-r--r--sql/mysql/schema.sql3
-rw-r--r--sql/pgsql/migrations/147.sql4
-rw-r--r--themes/compact.css3
-rw-r--r--themes/compact_night.css3
-rw-r--r--themes/light-high-contrast.css3
-rw-r--r--themes/light.css3
-rw-r--r--themes/light/cdm.less1
-rw-r--r--themes/light/tt-rss.less2
-rw-r--r--themes/night.css3
-rw-r--r--themes/night_blue.css3
-rwxr-xr-xupdate.php172
-rwxr-xr-xupdate_daemon2.php4
-rw-r--r--utils/phpstan-watcher.sh18
-rw-r--r--vendor/beberlei/assert/.github/workflows/ci.yml64
-rw-r--r--vendor/beberlei/assert/composer.json14
-rw-r--r--vendor/beberlei/assert/lib/Assert/Assert.php36
-rw-r--r--vendor/beberlei/assert/lib/Assert/Assertion.php1173
-rw-r--r--vendor/beberlei/assert/lib/Assert/AssertionChain.php71
-rw-r--r--vendor/beberlei/assert/lib/Assert/AssertionFailedException.php8
-rw-r--r--vendor/beberlei/assert/lib/Assert/InvalidArgumentException.php19
-rw-r--r--vendor/beberlei/assert/lib/Assert/LazyAssertion.php210
-rw-r--r--vendor/beberlei/assert/lib/Assert/LazyAssertionException.php9
-rw-r--r--vendor/beberlei/assert/lib/Assert/functions.php32
-rw-r--r--vendor/beberlei/assert/phpstan-code.neon3
-rw-r--r--vendor/beberlei/assert/phpstan-tests.neon10
-rwxr-xr-x[l---------]vendor/bin/phpunit124
-rw-r--r--vendor/chillerlan/php-qrcode/.github/FUNDING.yml1
-rw-r--r--vendor/chillerlan/php-qrcode/.github/workflows/tests.yml27
-rw-r--r--vendor/chillerlan/php-qrcode/.gitignore2
-rw-r--r--vendor/chillerlan/php-qrcode/.phan/config.php55
-rw-r--r--vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php6744
-rw-r--r--vendor/chillerlan/php-qrcode/.scrutinizer.yml11
-rw-r--r--vendor/chillerlan/php-qrcode/.travis.yml24
-rw-r--r--vendor/chillerlan/php-qrcode/README.md364
-rw-r--r--vendor/chillerlan/php-qrcode/composer.json19
-rw-r--r--vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php2
-rw-r--r--vendor/chillerlan/php-qrcode/examples/QRImageWithText.php30
-rw-r--r--vendor/chillerlan/php-qrcode/examples/image.php9
-rw-r--r--vendor/chillerlan/php-qrcode/examples/imageWithLogo.php4
-rw-r--r--vendor/chillerlan/php-qrcode/examples/svg.php1
-rw-r--r--vendor/chillerlan/php-qrcode/phpdoc.xml11
-rw-r--r--vendor/chillerlan/php-qrcode/phpmd.xml34
-rw-r--r--vendor/chillerlan/php-qrcode/phpunit.xml19
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php29
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/Byte.php15
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/Kanji.php23
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php84
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/Number.php35
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php120
-rw-r--r--vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php53
-rwxr-xr-x[-rw-r--r--]vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php165
-rw-r--r--vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php40
-rw-r--r--vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php28
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php3
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QRImage.php65
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QRImagick.php20
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php47
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php57
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php3
-rw-r--r--vendor/chillerlan/php-qrcode/src/Output/QRString.php16
-rwxr-xr-x[-rw-r--r--]vendor/chillerlan/php-qrcode/src/QRCode.php205
-rw-r--r--vendor/chillerlan/php-qrcode/src/QRCodeException.php7
-rw-r--r--vendor/chillerlan/php-qrcode/src/QROptions.php73
-rw-r--r--vendor/chillerlan/php-qrcode/src/QROptionsTrait.php203
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php29
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php22
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php110
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php35
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php29
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php29
-rwxr-xr-x[-rw-r--r--]vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php281
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php29
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php22
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php36
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php78
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php52
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php64
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php135
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php58
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/custom45
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/fpdfbin0 -> 2859 bytes
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/gif1
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/html31
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/imagickbin0 -> 348 bytes
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/jpg1
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/json1
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/png1
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/svg1
-rw-r--r--vendor/chillerlan/php-qrcode/tests/Output/samples/text29
-rwxr-xr-x[-rw-r--r--]vendor/chillerlan/php-qrcode/tests/QRCodeTest.php162
-rw-r--r--vendor/chillerlan/php-qrcode/tests/QROptionsTest.php142
-rw-r--r--vendor/chillerlan/php-qrcode/tests/QRTestAbstract.php72
-rw-r--r--vendor/chillerlan/php-settings-container/.github/FUNDING.yml2
-rw-r--r--vendor/chillerlan/php-settings-container/.github/workflows/tests.yml105
-rw-r--r--vendor/chillerlan/php-settings-container/.gitignore6
-rw-r--r--vendor/chillerlan/php-settings-container/.phan/config.php54
-rw-r--r--vendor/chillerlan/php-settings-container/.scrutinizer.yml9
-rw-r--r--vendor/chillerlan/php-settings-container/.travis.yml18
-rw-r--r--vendor/chillerlan/php-settings-container/README.md42
-rw-r--r--vendor/chillerlan/php-settings-container/composer.json18
-rw-r--r--vendor/chillerlan/php-settings-container/docs/Readme.md13
-rw-r--r--vendor/chillerlan/php-settings-container/examples/advanced.php15
-rw-r--r--vendor/chillerlan/php-settings-container/examples/simple.php1
-rw-r--r--vendor/chillerlan/php-settings-container/phpdoc.xml20
-rw-r--r--vendor/chillerlan/php-settings-container/phpmd.xml35
-rw-r--r--vendor/chillerlan/php-settings-container/phpunit.xml44
-rw-r--r--vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php46
-rw-r--r--vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php32
-rw-r--r--vendor/chillerlan/php-settings-container/tests/ContainerTest.php78
-rw-r--r--vendor/chillerlan/php-settings-container/tests/TestContainer.php4
-rw-r--r--vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php22
-rw-r--r--vendor/composer/ClassLoader.php123
-rw-r--r--vendor/composer/InstalledVersions.php517
-rw-r--r--vendor/composer/LICENSE2
-rw-r--r--vendor/composer/autoload_classmap.php87
-rw-r--r--vendor/composer/autoload_files.php17
-rw-r--r--vendor/composer/autoload_psr4.php4
-rw-r--r--vendor/composer/autoload_real.php2
-rw-r--r--vendor/composer/autoload_static.php123
-rw-r--r--vendor/composer/installed.json363
-rw-r--r--vendor/composer/installed.php809
-rw-r--r--vendor/composer/platform_check.php26
-rw-r--r--vendor/j4mie/idiorm/.gitattributes5
-rw-r--r--vendor/j4mie/idiorm/.gitignore7
-rw-r--r--vendor/j4mie/idiorm/.travis.yml42
-rw-r--r--vendor/j4mie/idiorm/idiorm.php18
-rw-r--r--vendor/j4mie/idiorm/phpunit.xml12
-rw-r--r--vendor/j4mie/idiorm/test/CacheIntegrationTest.php43
-rw-r--r--vendor/j4mie/idiorm/test/CacheTest.php42
-rw-r--r--vendor/j4mie/idiorm/test/CacheTest53.php82
-rw-r--r--vendor/j4mie/idiorm/test/ConfigTest.php125
-rw-r--r--vendor/j4mie/idiorm/test/ConfigTest53.php36
-rw-r--r--vendor/j4mie/idiorm/test/IdiormResultSetTest.php81
-rw-r--r--vendor/j4mie/idiorm/test/MulitpleConnectionTest.php52
-rw-r--r--vendor/j4mie/idiorm/test/ORMTest.php185
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php32
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php582
-rw-r--r--vendor/j4mie/idiorm/test/QueryBuilderTest.php696
-rw-r--r--vendor/j4mie/idiorm/test/bootstrap.php126
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile182
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/README.md23
-rw-r--r--vendor/j4mie/idiorm/test/docker_for_php52/php.ini1342
-rw-r--r--vendor/nikic/php-parser/README.md4
-rwxr-xr-x[-rw-r--r--]vendor/nikic/php-parser/bin/php-parse0
-rw-r--r--vendor/nikic/php-parser/grammar/php5.y10
-rw-r--r--vendor/nikic/php-parser/grammar/php7.y20
-rw-r--r--vendor/nikic/php-parser/grammar/phpyLang.php8
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php10
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php9
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php4
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php13
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php4
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php16
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php2
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php25
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php2
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php8
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php1863
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php9
-rw-r--r--vendor/paragonie/constant_time_encoding/.gitignore2
-rw-r--r--vendor/paragonie/constant_time_encoding/.travis.yml24
-rw-r--r--vendor/paragonie/constant_time_encoding/LICENSE.txt2
-rw-r--r--vendor/paragonie/constant_time_encoding/README.md8
-rw-r--r--vendor/paragonie/constant_time_encoding/composer.json5
-rw-r--r--vendor/paragonie/constant_time_encoding/phpunit.xml.dist13
-rw-r--r--vendor/paragonie/constant_time_encoding/psalm.xml9
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base32.php78
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base32Hex.php2
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base64.php71
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php2
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php2
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php2
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Binary.php11
-rw-r--r--vendor/paragonie/constant_time_encoding/src/EncoderInterface.php2
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Encoding.php36
-rw-r--r--vendor/paragonie/constant_time_encoding/src/Hex.php47
-rw-r--r--vendor/paragonie/constant_time_encoding/src/RFC4648.php31
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php49
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base32Test.php50
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php34
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php34
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base64Test.php79
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php58
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/EncodingTest.php307
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/HexTest.php39
-rw-r--r--vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php84
-rw-r--r--vendor/phpdocumentor/type-resolver/src/TypeResolver.php2
-rw-r--r--vendor/phpstan/phpstan/README.md19
-rw-r--r--vendor/phpstan/phpstan/composer.json7
-rwxr-xr-x[-rw-r--r--]vendor/phpstan/phpstan/phpstan0
-rwxr-xr-x[-rw-r--r--]vendor/phpstan/phpstan/phpstan.pharbin19215905 -> 21218944 bytes
-rw-r--r--vendor/phpstan/phpstan/phpstan.phar.asc26
-rwxr-xr-x[-rw-r--r--]vendor/phpunit/phpunit/phpunit0
-rw-r--r--vendor/sebastian/environment/ChangeLog.md7
-rw-r--r--vendor/sebastian/environment/LICENSE2
-rw-r--r--vendor/sebastian/environment/README.md1
-rw-r--r--vendor/sebastian/environment/src/Console.php10
-rw-r--r--vendor/sebastian/environment/src/Runtime.php8
-rw-r--r--vendor/spomky-labs/otphp/.github/CONTRIBUTING.md25
-rw-r--r--vendor/spomky-labs/otphp/.github/ISSUE_TEMPLATE.md16
-rw-r--r--vendor/spomky-labs/otphp/.github/PULL_REQUEST_TEMPLATE.md21
-rw-r--r--vendor/spomky-labs/otphp/.github/stale.yml17
-rw-r--r--vendor/spomky-labs/otphp/SECURITY.md88
-rw-r--r--vendor/spomky-labs/otphp/composer.json4
-rw-r--r--vendor/spomky-labs/otphp/src/ParameterTrait.php2
-rw-r--r--vendor/symfony/polyfill-ctype/Ctype.php232
-rw-r--r--vendor/symfony/polyfill-ctype/README.md12
-rw-r--r--vendor/symfony/polyfill-ctype/bootstrap.php50
-rw-r--r--vendor/symfony/polyfill-ctype/bootstrap80.php46
-rw-r--r--vendor/symfony/polyfill-ctype/composer.json41
-rw-r--r--vendor/thecodingmachine/safe/README.md6
-rw-r--r--vendor/thecodingmachine/safe/composer.json39
-rw-r--r--vendor/thecodingmachine/safe/deprecated/Exceptions/MysqliException.php (renamed from vendor/thecodingmachine/safe/generated/Exceptions/MysqliException.php)0
-rw-r--r--vendor/thecodingmachine/safe/deprecated/Exceptions/PasswordException.php (renamed from vendor/thecodingmachine/safe/generated/Exceptions/PasswordException.php)4
-rw-r--r--vendor/thecodingmachine/safe/deprecated/array.php301
-rw-r--r--vendor/thecodingmachine/safe/deprecated/datetime.php36
-rw-r--r--vendor/thecodingmachine/safe/deprecated/functionsList.php15
-rw-r--r--vendor/thecodingmachine/safe/deprecated/mysqli.php (renamed from vendor/thecodingmachine/safe/generated/mysqli.php)20
-rw-r--r--vendor/thecodingmachine/safe/deprecated/password.php (renamed from vendor/thecodingmachine/safe/generated/password.php)1
-rw-r--r--vendor/thecodingmachine/safe/deprecated/strings.php677
-rw-r--r--vendor/thecodingmachine/safe/docker-compose.yml7
-rw-r--r--vendor/thecodingmachine/safe/generated/Exceptions/GettextException.php (renamed from vendor/thecodingmachine/safe/generated/Exceptions/PdfException.php)2
-rw-r--r--vendor/thecodingmachine/safe/generated/Exceptions/IngresiiException.php11
-rw-r--r--vendor/thecodingmachine/safe/generated/Exceptions/MsqlException.php11
-rw-r--r--vendor/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php11
-rw-r--r--vendor/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php11
-rw-r--r--vendor/thecodingmachine/safe/generated/apache.php68
-rw-r--r--vendor/thecodingmachine/safe/generated/array.php419
-rw-r--r--vendor/thecodingmachine/safe/generated/bzip2.php5
-rw-r--r--vendor/thecodingmachine/safe/generated/calendar.php21
-rw-r--r--vendor/thecodingmachine/safe/generated/classobj.php8
-rw-r--r--vendor/thecodingmachine/safe/generated/com.php113
-rw-r--r--vendor/thecodingmachine/safe/generated/cubrid.php1691
-rw-r--r--vendor/thecodingmachine/safe/generated/curl.php430
-rw-r--r--vendor/thecodingmachine/safe/generated/datetime.php625
-rw-r--r--vendor/thecodingmachine/safe/generated/dir.php37
-rw-r--r--vendor/thecodingmachine/safe/generated/eio.php97
-rw-r--r--vendor/thecodingmachine/safe/generated/errorfunc.php10
-rw-r--r--vendor/thecodingmachine/safe/generated/exec.php171
-rw-r--r--vendor/thecodingmachine/safe/generated/fileinfo.php26
-rw-r--r--vendor/thecodingmachine/safe/generated/filesystem.php455
-rw-r--r--vendor/thecodingmachine/safe/generated/filter.php30
-rw-r--r--vendor/thecodingmachine/safe/generated/ftp.php251
-rw-r--r--vendor/thecodingmachine/safe/generated/funchand.php20
-rw-r--r--vendor/thecodingmachine/safe/generated/functionsList.php389
-rw-r--r--vendor/thecodingmachine/safe/generated/gettext.php27
-rw-r--r--vendor/thecodingmachine/safe/generated/gmp.php64
-rw-r--r--vendor/thecodingmachine/safe/generated/gnupg.php20
-rw-r--r--vendor/thecodingmachine/safe/generated/hash.php18
-rw-r--r--vendor/thecodingmachine/safe/generated/ibase.php42
-rw-r--r--vendor/thecodingmachine/safe/generated/iconv.php33
-rw-r--r--vendor/thecodingmachine/safe/generated/image.php1133
-rw-r--r--vendor/thecodingmachine/safe/generated/imap.php1104
-rw-r--r--vendor/thecodingmachine/safe/generated/info.php253
-rw-r--r--vendor/thecodingmachine/safe/generated/ingres-ii.php720
-rw-r--r--vendor/thecodingmachine/safe/generated/json.php35
-rw-r--r--vendor/thecodingmachine/safe/generated/ldap.php841
-rw-r--r--vendor/thecodingmachine/safe/generated/libxml.php43
-rw-r--r--vendor/thecodingmachine/safe/generated/mbstring.php236
-rw-r--r--vendor/thecodingmachine/safe/generated/misc.php126
-rw-r--r--vendor/thecodingmachine/safe/generated/msql.php443
-rw-r--r--vendor/thecodingmachine/safe/generated/mysqlndMs.php119
-rw-r--r--vendor/thecodingmachine/safe/generated/mysqlndQc.php103
-rw-r--r--vendor/thecodingmachine/safe/generated/network.php247
-rw-r--r--vendor/thecodingmachine/safe/generated/oci8.php512
-rw-r--r--vendor/thecodingmachine/safe/generated/opcache.php15
-rw-r--r--vendor/thecodingmachine/safe/generated/openssl.php878
-rw-r--r--vendor/thecodingmachine/safe/generated/outcontrol.php151
-rw-r--r--vendor/thecodingmachine/safe/generated/pcntl.php209
-rw-r--r--vendor/thecodingmachine/safe/generated/pcre.php36
-rw-r--r--vendor/thecodingmachine/safe/generated/pdf.php1553
-rw-r--r--vendor/thecodingmachine/safe/generated/pgsql.php986
-rw-r--r--vendor/thecodingmachine/safe/generated/posix.php504
-rw-r--r--vendor/thecodingmachine/safe/generated/ps.php2
-rw-r--r--vendor/thecodingmachine/safe/generated/pspell.php194
-rw-r--r--vendor/thecodingmachine/safe/generated/readline.php44
-rw-r--r--vendor/thecodingmachine/safe/generated/rrd.php167
-rw-r--r--vendor/thecodingmachine/safe/generated/sem.php300
-rw-r--r--vendor/thecodingmachine/safe/generated/session.php219
-rw-r--r--vendor/thecodingmachine/safe/generated/shmop.php39
-rw-r--r--vendor/thecodingmachine/safe/generated/simplexml.php94
-rw-r--r--vendor/thecodingmachine/safe/generated/sockets.php224
-rw-r--r--vendor/thecodingmachine/safe/generated/sodium.php316
-rw-r--r--vendor/thecodingmachine/safe/generated/spl.php61
-rw-r--r--vendor/thecodingmachine/safe/generated/ssh2.php108
-rw-r--r--vendor/thecodingmachine/safe/generated/stream.php287
-rw-r--r--vendor/thecodingmachine/safe/generated/strings.php782
-rw-r--r--vendor/thecodingmachine/safe/generated/swoole.php40
-rw-r--r--vendor/thecodingmachine/safe/generated/uodbc.php477
-rw-r--r--vendor/thecodingmachine/safe/generated/url.php90
-rw-r--r--vendor/thecodingmachine/safe/generated/xml.php711
-rw-r--r--vendor/thecodingmachine/safe/generated/yaml.php18
-rw-r--r--vendor/thecodingmachine/safe/generated/zip.php93
-rw-r--r--vendor/thecodingmachine/safe/generated/zlib.php224
-rw-r--r--vendor/thecodingmachine/safe/lib/DateTime.php2
-rw-r--r--vendor/thecodingmachine/safe/lib/DateTimeImmutable.php30
-rw-r--r--vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php6
-rw-r--r--vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php2
-rw-r--r--vendor/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php (renamed from vendor/thecodingmachine/safe/generated/Exceptions/SimplexmlException.php)2
-rw-r--r--vendor/thecodingmachine/safe/lib/special_cases.php178
-rw-r--r--vendor/thecodingmachine/safe/phpunit.xml.dist14
-rw-r--r--vendor/thecodingmachine/safe/rector-migrate.php (renamed from vendor/thecodingmachine/safe/rector-migrate-0.7.php)393
-rw-r--r--vendor/thecodingmachine/safe/tests/DateTimeImmutableTest.php21
-rw-r--r--vendor/webmozart/assert/.editorconfig12
-rw-r--r--vendor/webmozart/assert/.github/workflows/ci.yaml120
-rw-r--r--vendor/webmozart/assert/.php_cs24
-rw-r--r--vendor/webmozart/assert/CHANGELOG.md17
-rw-r--r--vendor/webmozart/assert/README.md4
-rw-r--r--vendor/webmozart/assert/composer.json20
-rw-r--r--vendor/webmozart/assert/psalm.xml14
-rw-r--r--vendor/webmozart/assert/src/Assert.php38
-rw-r--r--vendor/webmozart/assert/src/Mixin.php2551
745 files changed, 116495 insertions, 61220 deletions
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 393e5af86..0039fef88 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -2,6 +2,28 @@
"version": "2.0.0",
"tasks": [
{
+ "type": "shell",
+ "label": "phpstan 8.1 (watcher)",
+ "isBackground": true,
+ "problemMatcher": {
+ "fileLocation": ["relative", "${workspaceRoot}"],
+ "owner": "phpstan-watcher-8.1",
+ "pattern": {
+ "regexp": "^/app/(.*?):([0-9\\?]*):(.*)$",
+ "file": 1,
+ "line": 2,
+ "message": 3
+ },
+ "background": {
+ "activeOnStart": true,
+ "beginsPattern": "Using configuration file",
+ "endsPattern": "All done"
+
+ }
+ },
+ "command": "${workspaceRoot}/utils/phpstan-watcher.sh",
+ },
+ {
"type": "gulp",
"task": "default",
"problemMatcher": [],
diff --git a/classes/api.php b/classes/api.php
index b17114693..0e873856f 100755
--- a/classes/api.php
+++ b/classes/api.php
@@ -286,7 +286,7 @@ class API extends Handler {
$sth = $this->pdo->prepare("UPDATE ttrss_user_entries SET
$field = $set_to $additional_fields
WHERE ref_id IN ($article_qmarks) AND owner_uid = ?");
- $sth->execute(array_merge($article_ids, [$_SESSION['uid']]));
+ $sth->execute([...$article_ids, $_SESSION['uid']]);
$num_updated = $sth->rowCount();
diff --git a/classes/article.php b/classes/article.php
index e113ed219..17a40ca4f 100755
--- a/classes/article.php
+++ b/classes/article.php
@@ -177,7 +177,7 @@ class Article extends Handler_Protected {
$sth = $this->pdo->prepare("UPDATE ttrss_user_entries SET
score = ? WHERE ref_id IN ($ids_qmarks) AND owner_uid = ?");
- $sth->execute(array_merge([$score], $ids, [$_SESSION['uid']]));
+ $sth->execute([$score, ...$ids, $_SESSION['uid']]);
print json_encode(["id" => $ids, "score" => $score]);
}
@@ -507,7 +507,7 @@ class Article extends Handler_Protected {
WHERE ref_id IN ($ids_qmarks) AND owner_uid = ?");
}
- $sth->execute(array_merge($ids, [$owner_uid]));
+ $sth->execute([...$ids, $owner_uid]);
}
/**
diff --git a/classes/config.php b/classes/config.php
index cc089b7ba..a4a42a60a 100644
--- a/classes/config.php
+++ b/classes/config.php
@@ -6,7 +6,7 @@ class Config {
const T_STRING = 2;
const T_INT = 3;
- const SCHEMA_VERSION = 146;
+ const SCHEMA_VERSION = 147;
/** override default values, defined below in _DEFAULTS[], prefixing with _ENVVAR_PREFIX:
*
@@ -189,6 +189,9 @@ class Config {
/** http user agent (changing this is not recommended) */
const HTTP_USER_AGENT = "HTTP_USER_AGENT";
+ /** delay updates for this feed if received HTTP 429 (Too Many Requests) for this amount of seconds (base value, actual delay is base...base*2) */
+ const HTTP_429_THROTTLE_INTERVAL = "HTTP_429_THROTTLE_INTERVAL";
+
/** default values for all global configuration options */
private const _DEFAULTS = [
Config::DB_TYPE => [ "pgsql", Config::T_STRING ],
@@ -245,6 +248,7 @@ class Config {
Config::AUTH_MIN_INTERVAL => [ 5, Config::T_INT ],
Config::HTTP_USER_AGENT => [ 'Tiny Tiny RSS/%s (https://tt-rss.org/)',
Config::T_STRING ],
+ Config::HTTP_429_THROTTLE_INTERVAL => [ 3600, Config::T_INT ],
];
/** @var Config|null */
@@ -461,9 +465,11 @@ class Config {
/** generates reference self_url_path (no trailing slash) */
static function make_self_url() : string {
$proto = self::is_server_https() ? 'https' : 'http';
- $self_url_path = $proto . '://' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
+
+ $self_url_path = $proto . '://' . $_SERVER["HTTP_HOST"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$self_url_path = preg_replace("/\w+\.php(\?.*$)?$/", "", $self_url_path);
+ #$self_url_path = preg_replace("/(\?.*$)?$/", "", $self_url_path);
if (substr($self_url_path, -1) === "/") {
return substr($self_url_path, 0, -1);
@@ -518,8 +524,8 @@ class Config {
array_push($errors, "Please don't run this script as root.");
}
- if (version_compare(PHP_VERSION, '7.1.0', '<')) {
- array_push($errors, "PHP version 7.1.0 or newer required. You're using " . PHP_VERSION . ".");
+ if (version_compare(PHP_VERSION, '7.4.0', '<')) {
+ array_push($errors, "PHP version 7.4.0 or newer required. You're using " . PHP_VERSION . ".");
}
if (!class_exists("UConverter")) {
diff --git a/classes/counters.php b/classes/counters.php
index 8756b5acf..bc4d2d4a3 100644
--- a/classes/counters.php
+++ b/classes/counters.php
@@ -5,13 +5,13 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
static function get_all(): array {
- return array_merge(
- self::get_global(),
- self::get_virt(),
- self::get_labels(),
- self::get_feeds(),
- self::get_cats()
- );
+ return [
+ ...self::get_global(),
+ ...self::get_virt(),
+ ...self::get_labels(),
+ ...self::get_feeds(),
+ ...self::get_cats(),
+ ];
}
/**
@@ -20,13 +20,13 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
static function get_conditional(array $feed_ids = null, array $label_ids = null): array {
- return array_merge(
- self::get_global(),
- self::get_virt(),
- self::get_labels($label_ids),
- self::get_feeds($feed_ids),
- self::get_cats(is_array($feed_ids) ? Feeds::_cats_of($feed_ids, $_SESSION["uid"], true) : null)
- );
+ return [
+ ...self::get_global(),
+ ...self::get_virt(),
+ ...self::get_labels($label_ids),
+ ...self::get_feeds($feed_ids),
+ ...self::get_cats(is_array($feed_ids) ? Feeds::_cats_of($feed_ids, $_SESSION["uid"], true) : null)
+ ];
}
/**
@@ -93,11 +93,7 @@ class Counters {
ue.feed_id = f.id AND
ue.owner_uid = ?");
- $sth->execute(array_merge(
- [$_SESSION['uid']],
- $cat_ids,
- [$_SESSION['uid']]
- ));
+ $sth->execute([$_SESSION['uid'], ...$cat_ids, $_SESSION['uid']]);
} else {
$sth = $pdo->prepare("SELECT fc.id,
@@ -170,7 +166,7 @@ class Counters {
WHERE f.id = ue.feed_id AND ue.owner_uid = ? AND f.id IN ($feed_ids_qmarks)
GROUP BY f.id");
- $sth->execute(array_merge([$_SESSION['uid']], $feed_ids));
+ $sth->execute([$_SESSION['uid'], ...$feed_ids]);
} else {
$sth = $pdo->prepare("SELECT f.id,
f.title,
@@ -319,7 +315,7 @@ class Counters {
LEFT JOIN ttrss_user_entries AS u1 ON u1.ref_id = article_id AND u1.owner_uid = ?
WHERE ttrss_labels2.owner_uid = ? AND ttrss_labels2.id IN ($label_ids_qmarks)
GROUP BY ttrss_labels2.id, ttrss_labels2.caption");
- $sth->execute(array_merge([$_SESSION["uid"], $_SESSION["uid"]], $label_ids));
+ $sth->execute([$_SESSION["uid"], $_SESSION["uid"], ...$label_ids]);
} else {
$sth = $pdo->prepare("SELECT id,
caption,
diff --git a/classes/db.php b/classes/db.php
index 2cc89f5ba..4331b662e 100755
--- a/classes/db.php
+++ b/classes/db.php
@@ -17,8 +17,12 @@ class Db
}
}
- static function NOW(): string {
- return date("Y-m-d H:i:s", time());
+ /**
+ * @param int $delta adjust generated timestamp by this value in seconds (either positive or negative)
+ * @return string
+ */
+ static function NOW(int $delta = 0): string {
+ return date("Y-m-d H:i:s", time() + $delta);
}
private function __clone() {
diff --git a/classes/db/migrations.php b/classes/db/migrations.php
index aecd9186c..ffce2af5f 100644
--- a/classes/db/migrations.php
+++ b/classes/db/migrations.php
@@ -1,33 +1,15 @@
<?php
class Db_Migrations {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var string */
- private $base_filename = "schema.sql";
-
- /** @var string */
- private $base_path;
-
- /** @var string */
- private $migrations_path;
-
- /** @var string */
- private $migrations_table;
-
- /** @var bool */
- private $base_is_latest;
-
- /** @var PDO */
- private $pdo;
-
- /** @var int */
- private $cached_version = 0;
-
- /** @var int */
- private $cached_max_version = 0;
-
- /** @var int */
- private $max_version_override;
+ private string $base_filename = "schema.sql";
+ private string $base_path;
+ private string $migrations_path;
+ private string $migrations_table;
+ private bool $base_is_latest;
+ private PDO $pdo;
+ private int $cached_version = 0;
+ private int $cached_max_version = 0;
+ private int $max_version_override;
function __construct() {
$this->pdo = Db::pdo();
@@ -207,14 +189,11 @@ class Db_Migrations {
$filename = "{$this->base_path}/{$this->base_filename}";
if (file_exists($filename)) {
- $lines = array_filter(preg_split("/[\r\n]/", file_get_contents($filename)),
- function ($line) {
- return strlen(trim($line)) > 0 && strpos($line, "--") !== 0;
- });
-
- return array_filter(explode(";", implode("", $lines)), function ($line) {
- return strlen(trim($line)) > 0 && !in_array(strtolower($line), ["begin", "commit"]);
- });
+ $lines = array_filter(preg_split("/[\r\n]/", file_get_contents($filename)),
+ fn($line) => strlen(trim($line)) > 0 && strpos($line, "--") !== 0);
+
+ return array_filter(explode(";", implode("", $lines)),
+ fn($line) => strlen(trim($line)) > 0 && !in_array(strtolower($line), ["begin", "commit"]));
} else {
user_error("Requested schema file ${filename} not found.", E_USER_ERROR);
diff --git a/classes/debug.php b/classes/debug.php
index fbdf260e0..40fa27377 100644
--- a/classes/debug.php
+++ b/classes/debug.php
@@ -12,44 +12,31 @@ class Debug {
Debug::LOG_EXTENDED,
];
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
/**
* @deprecated
- * @var int
*/
- public static $LOG_DISABLED = self::LOG_DISABLED;
+ public static int $LOG_DISABLED = self::LOG_DISABLED;
/**
* @deprecated
- * @var int
*/
- public static $LOG_NORMAL = self::LOG_NORMAL;
+ public static int $LOG_NORMAL = self::LOG_NORMAL;
/**
* @deprecated
- * @var int
*/
- public static $LOG_VERBOSE = self::LOG_VERBOSE;
+ public static int $LOG_VERBOSE = self::LOG_VERBOSE;
/**
* @deprecated
- * @var int
*/
- public static $LOG_EXTENDED = self::LOG_EXTENDED;
+ public static int $LOG_EXTENDED = self::LOG_EXTENDED;
- /** @var bool */
- private static $enabled = false;
+ private static bool $enabled = false;
+ private static bool $quiet = false;
+ private static ?string $logfile = null;
- /** @var bool */
- private static $quiet = false;
-
- /** @var string|null */
- private static $logfile = null;
-
- /**
- * @var int Debug::LOG_*
- */
- private static $loglevel = self::LOG_NORMAL;
+ private static int $loglevel = self::LOG_NORMAL;
public static function set_logfile(string $logfile): void {
self::$logfile = $logfile;
@@ -68,7 +55,7 @@ class Debug {
}
/**
- * @param int $level Debug::LOG_*
+ * @param Debug::LOG_* $level
*/
public static function set_loglevel(int $level): void {
self::$loglevel = $level;
@@ -82,7 +69,21 @@ class Debug {
}
/**
- * @param int $level Debug::LOG_*
+ * @param int $level integer loglevel value
+ * @return Debug::LOG_* if valid, warn and return LOG_DISABLED otherwise
+ */
+ public static function map_loglevel(int $level) : int {
+ if (in_array($level, self::ALL_LOG_LEVELS)) {
+ /** @phpstan-ignore-next-line */
+ return $level;
+ } else {
+ user_error("Passed invalid debug log level: $level", E_USER_WARNING);
+ return self::LOG_DISABLED;
+ }
+ }
+
+ /**
+ * @param Debug::LOG_* $level log level
*/
public static function log(string $message, int $level = Debug::LOG_NORMAL): bool {
diff --git a/classes/digest.php b/classes/digest.php
index 15203166b..3e943e6dd 100644
--- a/classes/digest.php
+++ b/classes/digest.php
@@ -163,9 +163,7 @@ class Digest
$article_labels_formatted = "";
if (is_array($article_labels) && count($article_labels) > 0) {
- $article_labels_formatted = implode(", ", array_map(function($a) {
- return $a[1];
- }, $article_labels));
+ $article_labels_formatted = implode(", ", array_map(fn($a) => $a[1], $article_labels));
}
$tpl->setVariable('FEED_TITLE', $line["feed_title"]);
diff --git a/classes/diskcache.php b/classes/diskcache.php
index 34bba25f1..01c713b99 100644
--- a/classes/diskcache.php
+++ b/classes/diskcache.php
@@ -1,15 +1,13 @@
<?php
class DiskCache {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var string */
- private $dir;
+ private string $dir;
/**
* https://stackoverflow.com/a/53662733
*
* @var array<string, string>
*/
- private $mimeMap = [
+ private array $mimeMap = [
'video/3gpp2' => '3g2',
'video/3gp' => '3gp',
'video/3gpp' => '3gp',
diff --git a/classes/feeditem/atom.php b/classes/feeditem/atom.php
index cac6d8c54..59bf403b3 100755
--- a/classes/feeditem/atom.php
+++ b/classes/feeditem/atom.php
@@ -43,7 +43,8 @@ class FeedItem_Atom extends FeedItem_Common {
$links = $this->elem->getElementsByTagName("link");
foreach ($links as $link) {
- if ($link && $link->hasAttribute("href") &&
+ /** @phpstan-ignore-next-line */
+ if ($link->hasAttribute("href") &&
(!$link->hasAttribute("rel")
|| $link->getAttribute("rel") == "alternate"
|| $link->getAttribute("rel") == "standout")) {
@@ -180,7 +181,8 @@ class FeedItem_Atom extends FeedItem_Common {
$encs = [];
foreach ($links as $link) {
- if ($link && $link->hasAttribute("href") && $link->hasAttribute("rel")) {
+ /** @phpstan-ignore-next-line */
+ if ($link->hasAttribute("href") && $link->hasAttribute("rel")) {
$base = $this->xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)", $link);
if ($link->getAttribute("rel") == "enclosure") {
@@ -199,7 +201,7 @@ class FeedItem_Atom extends FeedItem_Common {
}
}
- $encs = array_merge($encs, parent::get_enclosures());
+ array_push($encs, ...parent::get_enclosures());
return $encs;
}
diff --git a/classes/feeditem/common.php b/classes/feeditem/common.php
index 6a9be8aca..fde481179 100755
--- a/classes/feeditem/common.php
+++ b/classes/feeditem/common.php
@@ -189,7 +189,7 @@ abstract class FeedItem_Common extends FeedItem {
$tmp = [];
foreach ($cats as $rawcat) {
- $tmp = array_merge($tmp, explode(",", $rawcat));
+ array_push($tmp, ...explode(",", $rawcat));
}
$tmp = array_map(function($srccat) {
diff --git a/classes/feeditem/rss.php b/classes/feeditem/rss.php
index 7017d04e9..132eabff5 100755
--- a/classes/feeditem/rss.php
+++ b/classes/feeditem/rss.php
@@ -153,7 +153,7 @@ class FeedItem_RSS extends FeedItem_Common {
array_push($encs, $enc);
}
- $encs = array_merge($encs, parent::get_enclosures());
+ array_push($encs, ...parent::get_enclosures());
return $encs;
}
diff --git a/classes/feedparser.php b/classes/feedparser.php
index fc2489e2d..4b9c63f56 100644
--- a/classes/feedparser.php
+++ b/classes/feedparser.php
@@ -43,10 +43,8 @@ class FeedParser {
foreach (libxml_get_errors() as $error) {
if ($error->level == LIBXML_ERR_FATAL) {
// currently only the first error is reported
- if (!isset($this->error)) {
- $this->error = $this->format_error($error);
- }
- $this->libxml_errors[] = $this->format_error($error);
+ $this->error ??= Errors::format_libxml_error($error);
+ $this->libxml_errors[] = Errors::format_libxml_error($error);
}
}
}
@@ -87,9 +85,7 @@ class FeedParser {
$this->type = $this::FEED_ATOM;
break;
default:
- if (!isset($this->error)) {
- $this->error = "Unknown/unsupported feed type";
- }
+ $this->error ??= "Unknown/unsupported feed type";
return;
}
}
@@ -186,9 +182,7 @@ class FeedParser {
if ($this->link) $this->link = trim($this->link);
} else {
- if (!isset($this->error)) {
- $this->error = "Unknown/unsupported feed type";
- }
+ $this->error ??= "Unknown/unsupported feed type";
return;
}
}
diff --git a/classes/feeds.php b/classes/feeds.php
index a06486883..afcc97d81 100755
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -122,7 +122,7 @@ class Feeds extends Handler_Protected {
$feed_title = $qfh_ret[1];
$feed_site_url = $qfh_ret[2];
$last_error = $qfh_ret[3];
- $last_updated = strpos($qfh_ret[4], '1970-') === false ?
+ $last_updated = strpos($qfh_ret[4] ?? "", '1970-') === false ?
TimeHelper::make_local_datetime($qfh_ret[4], false) : __("Never");
$highlight_words = $qfh_ret[5];
$reply['first_id'] = $qfh_ret[6];
@@ -248,11 +248,12 @@ class Feeds extends Handler_Protected {
function ($result, $plugin) use (&$line, &$button_doc) {
if ($result && $button_doc->loadXML($result)) {
- /** @var DOMElement|null */
+ /** @var DOMElement|null $child */
$child = $button_doc->firstChild;
if ($child) {
do {
+ /** @var DOMElement|null $child */
$child->setAttribute('data-plugin-name', get_class($plugin));
} while ($child = $child->nextSibling);
@@ -271,11 +272,12 @@ class Feeds extends Handler_Protected {
function ($result, $plugin) use (&$line, &$button_doc) {
if ($result && $button_doc->loadXML($result)) {
- /** @var DOMElement|null */
+ /** @var DOMElement|null $child */
$child = $button_doc->firstChild;
if ($child) {
do {
+ /** @var DOMElement|null $child */
$child->setAttribute('data-plugin-name', get_class($plugin));
} while ($child = $child->nextSibling);
@@ -665,7 +667,7 @@ class Feeds extends Handler_Protected {
}
Debug::set_enabled(true);
- Debug::set_loglevel($xdebug);
+ Debug::set_loglevel(Debug::map_loglevel($xdebug));
$feed_id = (int)$_REQUEST["feed_id"];
$do_update = ($_REQUEST["action"] ?? "") == "do_update";
@@ -1936,8 +1938,8 @@ class Feeds extends Handler_Protected {
$sth->execute([$cat, $owner_uid]);
while ($line = $sth->fetch()) {
- array_push($rv, (int)$line["parent_cat"]);
- $rv = array_merge($rv, self::_get_parent_cats($line["parent_cat"], $owner_uid));
+ $cat = (int) $line["parent_cat"];
+ array_push($rv, $cat, ...self::_get_parent_cats($cat, $owner_uid));
}
return $rv;
@@ -1956,8 +1958,7 @@ class Feeds extends Handler_Protected {
$sth->execute([$cat, $owner_uid]);
while ($line = $sth->fetch()) {
- array_push($rv, $line["id"]);
- $rv = array_merge($rv, self::_get_child_cats($line["id"], $owner_uid));
+ array_push($rv, $line["id"], ...self::_get_child_cats($line["id"], $owner_uid));
}
return $rv;
@@ -1978,16 +1979,18 @@ class Feeds extends Handler_Protected {
$sth = $pdo->prepare("SELECT DISTINCT cat_id, fc.parent_cat FROM ttrss_feeds f LEFT JOIN ttrss_feed_categories fc
ON (fc.id = f.cat_id)
WHERE f.owner_uid = ? AND f.id IN ($feeds_qmarks)");
- $sth->execute(array_merge([$owner_uid], $feeds));
+ $sth->execute([$owner_uid, ...$feeds]);
$rv = [];
if ($row = $sth->fetch()) {
+ $cat_id = (int) $row["cat_id"];
+ $rv[] = $cat_id;
array_push($rv, (int)$row["cat_id"]);
- if ($with_parents && $row["parent_cat"])
- $rv = array_merge($rv,
- self::_get_parent_cats($row["cat_id"], $owner_uid));
+ if ($with_parents && $row["parent_cat"]) {
+ array_push($rv, ...self::_get_parent_cats($cat_id, $owner_uid));
+ }
}
$rv = array_unique($rv);
@@ -2357,8 +2360,11 @@ class Feeds extends Handler_Protected {
$k = mb_strtolower($k);
array_push($search_query_leftover, $not ? "!$k" : $k);
} else {
- array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER(".$pdo->quote("%$k%").")
- OR UPPER(ttrss_entries.content) $not LIKE UPPER(".$pdo->quote("%$k%")."))");
+ $k = mb_strtolower($k);
+ array_push($search_query_leftover, $not ? "-$k" : $k);
+
+ //array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER(".$pdo->quote("%$k%").")
+ // OR UPPER(ttrss_entries.content) $not LIKE UPPER(".$pdo->quote("%$k%")."))");
}
if (!$not) array_push($search_words, $k);
@@ -2380,12 +2386,16 @@ class Feeds extends Handler_Protected {
array_push($query_keywords,
"(tsvector_combined @@ to_tsquery($search_language, $tsquery))");
- }
+ } else {
+ $ft_query = $pdo->quote(implode(" ", $search_query_leftover));
+ array_push($query_keywords,
+ "MATCH (ttrss_entries.title, ttrss_entries.content) AGAINST ($ft_query IN BOOLEAN MODE)");
+ }
}
if (count($query_keywords) > 0)
- $search_query_part = implode("AND", $query_keywords);
+ $search_query_part = implode("AND ", $query_keywords);
else
$search_query_part = "false";
diff --git a/classes/handler.php b/classes/handler.php
index 806c9cfbe..5b54570d8 100644
--- a/classes/handler.php
+++ b/classes/handler.php
@@ -1,11 +1,9 @@
<?php
class Handler implements IHandler {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var PDO */
- protected $pdo;
+ protected PDO $pdo;
/** @var array<int|string, mixed> */
- protected $args;
+ protected array $args;
/**
* @param array<int|string, mixed> $args
diff --git a/classes/handler/public.php b/classes/handler/public.php
index 3fef4c2b9..ea0972f6b 100755
--- a/classes/handler/public.php
+++ b/classes/handler/public.php
@@ -76,7 +76,7 @@ class Handler_Public extends Handler {
"/public.php?op=rss&id=$feed&key=" .
Feeds::_get_access_key($feed, false, $owner_uid);
- if (!$feed_site_url) $feed_site_url = get_self_url_prefix();
+ if (!$feed_site_url) $feed_site_url = Config::get_self_url();
if ($format == 'atom') {
$tpl = new Templator();
@@ -87,7 +87,7 @@ class Handler_Public extends Handler {
$tpl->setVariable('VERSION', Config::get_version(), true);
$tpl->setVariable('FEED_URL', htmlspecialchars($feed_self_url), true);
- $tpl->setVariable('SELF_URL', htmlspecialchars(get_self_url_prefix()), true);
+ $tpl->setVariable('SELF_URL', htmlspecialchars(Config::get_self_url()), true);
while ($line = $result->fetch()) {
$line["content_preview"] = Sanitizer::sanitize(truncate_string(strip_tags($line["content"]), 100, '...'));
@@ -134,7 +134,7 @@ class Handler_Public extends Handler {
$tpl->setVariable('ARTICLE_AUTHOR', htmlspecialchars($line['author']), true);
- $tpl->setVariable('ARTICLE_SOURCE_LINK', htmlspecialchars($line['site_url'] ? $line["site_url"] : get_self_url_prefix()), true);
+ $tpl->setVariable('ARTICLE_SOURCE_LINK', htmlspecialchars($line['site_url'] ? $line["site_url"] : Config::get_self_url()), true);
$tpl->setVariable('ARTICLE_SOURCE_TITLE', htmlspecialchars($line['feed_title'] ?? $feed_title), true);
foreach ($line["tags"] as $tag) {
@@ -219,6 +219,11 @@ class Handler_Public extends Handler {
if (!empty($line['note'])) $article['note'] = $line['note'];
if (!empty($line['author'])) $article['author'] = $line['author'];
+ $article['source'] = [
+ 'link' => $line['site_url'] ? $line["site_url"] : Config::get_self_url(),
+ 'title' => $line['feed_title'] ?? $feed_title
+ ];
+
if (count($line["tags"]) > 0) {
$article['tags'] = array();
@@ -312,7 +317,7 @@ class Handler_Public extends Handler {
$login, $user_id);
if (!$redirect_url)
- $redirect_url = get_self_url_prefix() . "/index.php";
+ $redirect_url = Config::get_self_url() . "/index.php";
header("Location: " . $redirect_url);
} else {
@@ -389,11 +394,11 @@ class Handler_Public extends Handler {
if (UserHelper::authenticate($login, $password)) {
$_POST["password"] = "";
- if (get_schema_version() >= 120) {
+ if (Config::get_schema_version() >= 120) {
$_SESSION["language"] = get_pref(Prefs::USER_LANGUAGE, $_SESSION["uid"]);
}
- $_SESSION["ref_schema_version"] = get_schema_version();
+ $_SESSION["ref_schema_version"] = Config::get_schema_version();
$_SESSION["bw_limit"] = !!clean($_POST["bw_limit"] ?? false);
$_SESSION["safe_mode"] = $safe_mode;
@@ -412,8 +417,7 @@ class Handler_Public extends Handler {
if (session_status() != PHP_SESSION_ACTIVE)
session_start();
- if (!isset($_SESSION["login_error_msg"]))
- $_SESSION["login_error_msg"] = __("Incorrect username or password");
+ $_SESSION["login_error_msg"] ??= __("Incorrect username or password");
}
$return = clean($_REQUEST['return']);
@@ -563,7 +567,7 @@ class Handler_Public extends Handler {
print_notice("Password reset instructions are being sent to your email address.");
$resetpass_token = sha1(get_random_bytes(128));
- $resetpass_link = get_self_url_prefix() . "/public.php?op=forgotpass&hash=" . $resetpass_token .
+ $resetpass_link = Config::get_self_url() . "/public.php?op=forgotpass&hash=" . $resetpass_token .
"&login=" . urlencode($login);
$tpl = new Templator();
@@ -785,7 +789,7 @@ class Handler_Public extends Handler {
$plugin_name = basename(clean($_REQUEST["plugin"]));
$method = clean($_REQUEST["pmethod"]);
- $host->load($plugin_name, PluginHost::KIND_USER, 0);
+ $host->load($plugin_name, PluginHost::KIND_ALL, 0);
//$host->load_data();
$plugin = $host->get_plugin($plugin_name);
@@ -807,7 +811,7 @@ class Handler_Public extends Handler {
} else {
user_error("PluginHandler[PUBLIC]: Requested method '$method' of unknown plugin '$plugin_name'.", E_USER_WARNING);
header("Content-Type: text/json");
- print Errors::to_json(Errors::E_UNKNOWN_PLUGIN);
+ print Errors::to_json(Errors::E_UNKNOWN_PLUGIN, ['plugin' => $plugin_name]);
}
}
diff --git a/classes/mailer.php b/classes/mailer.php
index a15c8546b..ac5c641eb 100644
--- a/classes/mailer.php
+++ b/classes/mailer.php
@@ -1,8 +1,6 @@
<?php
class Mailer {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var string */
- private $last_error = "";
+ private string $last_error = "";
/**
* @param array<string, mixed> $params
@@ -45,16 +43,9 @@ class Mailer {
++$hooks_tried;
}
- $headers = [ "From: $from_combined" ];
+ $headers = [ "From: $from_combined", "Content-Type: text/plain; charset=UTF-8" ];
- if ($message_html) {
- $headers[] = "MIME-Version: 1.0";
- $headers[] = "Content-Type: text/html; charset=UTF-8";
- } else {
- $headers[] = "Content-Type: text/plain; charset=UTF-8";
- }
-
- $rc = mail($to_combined, $subject, $message, implode("\r\n", array_merge($headers, $additional_headers)));
+ $rc = mail($to_combined, $subject, $message, implode("\r\n", [...$headers, ...$additional_headers]));
if (!$rc) {
$this->set_error(error_get_last()['message'] ?? T_sprintf("Unknown error while sending mail. Hooks tried: %d.", $hooks_tried));
diff --git a/classes/plugin.php b/classes/plugin.php
index 39af6a9a1..f47ab1882 100644
--- a/classes/plugin.php
+++ b/classes/plugin.php
@@ -50,6 +50,11 @@ abstract class Plugin {
}
/** @return string */
+ function get_login_js() {
+ return "";
+ }
+
+ /** @return string */
function get_css() {
return "";
}
@@ -690,6 +695,15 @@ abstract class Plugin {
* @return array<mixed> - [0] - if set, url to redirect to
*/
function hook_post_logout($login, $user_id) {
+ user_error("Dummy method invoked.", E_USER_ERROR);
+
return [""];
}
+
+ /** Adds buttons to the right of default Login button
+ * @return void
+ */
+ function hook_loginform_additional_buttons() {
+ user_error("Dummy method invoked.", E_USER_ERROR);
+ }
}
diff --git a/classes/pluginhost.php b/classes/pluginhost.php
index 952d4df77..4b85bc216 100755
--- a/classes/pluginhost.php
+++ b/classes/pluginhost.php
@@ -1,49 +1,42 @@
<?php
class PluginHost {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var PDO|null */
- private $pdo = null;
+ private ?PDO $pdo = null;
/**
* separate handle for plugin data so transaction while saving wouldn't clash with possible main
* tt-rss code transactions; only initialized when first needed
- *
- * @var PDO|null
*/
- private $pdo_data = null;
+ private ?PDO $pdo_data = null;
/** @var array<string, array<int, array<int, Plugin>>> hook types -> priority levels -> Plugins */
- private $hooks = [];
+ private array $hooks = [];
/** @var array<string, Plugin> */
- private $plugins = [];
+ private array $plugins = [];
/** @var array<string, array<string, Plugin>> handler type -> method type -> Plugin */
- private $handlers = [];
+ private array $handlers = [];
/** @var array<string, array{'description': string, 'suffix': string, 'arghelp': string, 'class': Plugin}> command type -> details array */
- private $commands = [];
+ private array $commands = [];
/** @var array<string, array<string, mixed>> plugin name -> (potential profile array) -> key -> value */
- private $storage = [];
+ private array $storage = [];
/** @var array<int, array<int, array{'id': int, 'title': string, 'sender': Plugin, 'icon': string}>> */
- private $feeds = [];
+ private array $feeds = [];
/** @var array<string, Plugin> API method name, Plugin sender */
- private $api_methods = [];
+ private array $api_methods = [];
/** @var array<string, array<int, array{'action': string, 'description': string, 'sender': Plugin}>> */
- private $plugin_actions = [];
+ private array $plugin_actions = [];
- /** @var int|null */
- private $owner_uid = null;
+ private ?int $owner_uid = null;
- /** @var bool */
- private $data_loaded = false;
+ private bool $data_loaded = false;
- /** @var PluginHost|null */
- private static $instance = null;
+ private static ?PluginHost $instance = null;
const API_VERSION = 2;
const PUBLIC_METHOD_DELIMITER = "--";
@@ -203,6 +196,9 @@ class PluginHost {
/** @see Plugin::hook_post_logout() */
const HOOK_POST_LOGOUT = "hook_post_logout";
+ /** @see Plugin::hook_loginform_additional_buttons() */
+ const HOOK_LOGINFORM_ADDITIONAL_BUTTONS = "hook_loginform_additional_buttons";
+
const KIND_ALL = 1;
const KIND_SYSTEM = 2;
const KIND_USER = 3;
@@ -409,7 +405,7 @@ class PluginHost {
$tmp = [];
foreach (array_keys($this->hooks[$type]) as $prio) {
- $tmp = array_merge($tmp, $this->hooks[$type][$prio]);
+ array_push($tmp, ...$this->hooks[$type][$prio]);
}
return $tmp;
@@ -422,7 +418,7 @@ class PluginHost {
*/
function load_all(int $kind, int $owner_uid = null, bool $skip_init = false): void {
- $plugins = array_merge(glob("plugins/*"), glob("plugins.local/*"));
+ $plugins = [...(glob("plugins/*") ?: []), ...(glob("plugins.local/*") ?: [])];
$plugins = array_filter($plugins, "is_dir");
$plugins = array_map("basename", $plugins);
@@ -539,10 +535,7 @@ class PluginHost {
$method = strtolower($method);
if ($this->is_system($sender)) {
- if (!isset($this->handlers[$handler])) {
- $this->handlers[$handler] = [];
- }
-
+ $this->handlers[$handler] ??= [];
$this->handlers[$handler][$method] = $sender;
}
}
@@ -645,8 +638,7 @@ class PluginHost {
owner_uid= ? AND name = ?");
$sth->execute([$this->owner_uid, $plugin]);
- if (!isset($this->storage[$plugin]))
- $this->storage[$plugin] = [];
+ $this->storage[$plugin] ??= [];
$content = serialize($this->storage[$plugin]);
@@ -677,14 +669,8 @@ class PluginHost {
if ($profile_id) {
$idx = get_class($sender);
- if (!isset($this->storage[$idx])) {
- $this->storage[$idx] = [];
- }
-
- if (!isset($this->storage[$idx][$profile_id])) {
- $this->storage[$idx][$profile_id] = [];
- }
-
+ $this->storage[$idx] ??= [];
+ $this->storage[$idx][$profile_id] ??= [];
$this->storage[$idx][$profile_id][$name] = $value;
$this->save_data(get_class($sender));
@@ -699,9 +685,7 @@ class PluginHost {
function set(Plugin $sender, string $name, $value): void {
$idx = get_class($sender);
- if (!isset($this->storage[$idx]))
- $this->storage[$idx] = [];
-
+ $this->storage[$idx] ??= [];
$this->storage[$idx][$name] = $value;
$this->save_data(get_class($sender));
@@ -713,8 +697,7 @@ class PluginHost {
function set_array(Plugin $sender, array $params): void {
$idx = get_class($sender);
- if (!isset($this->storage[$idx]))
- $this->storage[$idx] = [];
+ $this->storage[$idx] ??= [];
foreach ($params as $name => $value)
$this->storage[$idx][$name] = $value;
@@ -852,11 +835,13 @@ class PluginHost {
function add_filter_action(Plugin $sender, string $action_name, string $action_desc): void {
$sender_class = get_class($sender);
- if (!isset($this->plugin_actions[$sender_class]))
- $this->plugin_actions[$sender_class] = [];
+ $this->plugin_actions[$sender_class] ??= [];
- array_push($this->plugin_actions[$sender_class],
- array("action" => $action_name, "description" => $action_desc, "sender" => $sender));
+ $this->plugin_actions[$sender_class][] = [
+ "action" => $action_name,
+ "description" => $action_desc,
+ "sender" => $sender,
+ ];
}
/**
diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index 03b70580b..6cf979b0a 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -172,7 +172,7 @@ class Pref_Feeds extends Handler_Protected {
if ($enable_cats) {
array_push($root['items'], $cat);
} else {
- $root['items'] = array_merge($root['items'], $cat['items']);
+ array_push($root['items'], ...$cat['items']);
}
$sth = $this->pdo->prepare("SELECT * FROM
@@ -202,7 +202,7 @@ class Pref_Feeds extends Handler_Protected {
if ($enable_cats) {
array_push($root['items'], $cat);
} else {
- $root['items'] = array_merge($root['items'], $cat['items']);
+ array_push($root['items'], ...$cat['items']);
}
}
}
@@ -848,7 +848,7 @@ class Pref_Feeds extends Handler_Protected {
if ($qpart) {
$sth = $this->pdo->prepare("UPDATE ttrss_feeds SET $qpart WHERE id IN ($feed_ids_qmarks)
AND owner_uid = ?");
- $sth->execute(array_merge($feed_ids, [$_SESSION['uid']]));
+ $sth->execute([...$feed_ids, $_SESSION['uid']]);
}
}
@@ -973,16 +973,6 @@ class Pref_Feeds extends Handler_Protected {
persist="true"
model="feedModel"
openOnClick="false">
- <script type="dojo/method" event="onClick" args="item">
- var id = String(item.id);
- var bare_id = id.substr(id.indexOf(':')+1);
-
- if (id.match('FEED:')) {
- CommonDialogs.editFeed(bare_id);
- } else if (id.match('CAT:')) {
- dijit.byId('feedTree').editCategory(bare_id, item);
- }
- </script>
</div>
</div>
</div>
diff --git a/classes/pref/filters.php b/classes/pref/filters.php
index 79dd78993..19ec8d39e 100755
--- a/classes/pref/filters.php
+++ b/classes/pref/filters.php
@@ -115,6 +115,7 @@ class Pref_Filters extends Handler_Protected {
$glue = $filter['match_any_rule'] ? " OR " : " AND ";
$scope_qpart = join($glue, $scope_qparts);
+ /** @phpstan-ignore-next-line */
if (!$scope_qpart) $scope_qpart = "true";
$rv = array();
@@ -537,7 +538,7 @@ class Pref_Filters extends Handler_Protected {
$sth = $this->pdo->prepare("DELETE FROM ttrss_filters2 WHERE id IN ($ids_qmarks)
AND owner_uid = ?");
- $sth->execute(array_merge($ids, [$_SESSION['uid']]));
+ $sth->execute([...$ids, $_SESSION['uid']]);
}
private function _save_rules_and_actions(int $filter_id): void {
@@ -703,14 +704,6 @@ class Pref_Filters extends Handler_Protected {
</div>
<div dojoType="fox.PrefFilterTree" id="filterTree" dndController="dijit.tree.dndSource"
betweenThreshold="5" model="filterModel" openOnClick="true">
- <script type="dojo/method" event="onClick" args="item">
- var id = String(item.id);
- var bare_id = id.substr(id.indexOf(':')+1);
-
- if (id.match('FILTER:')) {
- Filters.edit(bare_id);
- }
- </script>
</div>
</div>
<?php PluginHost::getInstance()->run_hooks(PluginHost::HOOK_PREFS_TAB, "prefFilters") ?>
@@ -788,11 +781,11 @@ class Pref_Filters extends Handler_Protected {
$sth = $this->pdo->prepare("UPDATE ttrss_filters2_rules
SET filter_id = ? WHERE filter_id IN ($ids_qmarks)");
- $sth->execute(array_merge([$base_id], $ids));
+ $sth->execute([$base_id, ...$ids]);
$sth = $this->pdo->prepare("UPDATE ttrss_filters2_actions
SET filter_id = ? WHERE filter_id IN ($ids_qmarks)");
- $sth->execute(array_merge([$base_id], $ids));
+ $sth->execute([$base_id, ...$ids]);
$sth = $this->pdo->prepare("DELETE FROM ttrss_filters2 WHERE id IN ($ids_qmarks)");
$sth->execute($ids);
diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php
index 8c044b49f..3285ce200 100644
--- a/classes/pref/prefs.php
+++ b/classes/pref/prefs.php
@@ -2,18 +2,17 @@
use chillerlan\QRCode;
class Pref_Prefs extends Handler_Protected {
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
/** @var array<Prefs::*, array<int, string>> */
- private $pref_help = [];
+ private array $pref_help = [];
/** @var array<string, array<int, string>> pref items are Prefs::*|Pref_Prefs::BLOCK_SEPARATOR (PHPStan was complaining) */
- private $pref_item_map = [];
+ private array $pref_item_map = [];
/** @var array<string, string> */
- private $pref_help_bottom = [];
+ private array $pref_help_bottom = [];
/** @var array<int, string> */
- private $pref_blacklist = [];
+ private array $pref_blacklist = [];
private const BLOCK_SEPARATOR = 'BLOCK_SEPARATOR';
@@ -26,7 +25,6 @@ class Pref_Prefs extends Handler_Protected {
const PI_ERR_PLUGIN_NOT_FOUND = "PI_ERR_PLUGIN_NOT_FOUND";
const PI_ERR_NO_WORKDIR = "PI_ERR_NO_WORKDIR";
- /** @param string $method */
function csrf_ignore(string $method) : bool {
$csrf_ignored = array("index", "updateself", "otpqrcode");
@@ -187,7 +185,7 @@ class Pref_Prefs extends Handler_Protected {
$boolean_prefs = explode(",", clean($_POST["boolean_prefs"]));
foreach ($boolean_prefs as $pref) {
- if (!isset($_POST[$pref])) $_POST[$pref] = 'false';
+ $_POST[$pref] ??= 'false';
}
$need_reload = false;
@@ -633,10 +631,11 @@ class Pref_Prefs extends Handler_Protected {
} else if ($pref_name == Prefs::USER_CSS_THEME) {
- $theme_files = array_map("basename",
- array_merge(glob("themes/*.php"),
- glob("themes/*.css"),
- glob("themes.local/*.css")));
+ $theme_files = array_map("basename", [
+ ...glob("themes/*.php") ?: [],
+ ...glob("themes/*.css") ?: [],
+ ...glob("themes.local/*.css") ?: [],
+ ]);
asort($theme_files);
@@ -869,18 +868,19 @@ class Pref_Prefs extends Handler_Protected {
$feed_handler_whitelist = [ "Af_Comics" ];
- $feed_handlers = array_merge(
- PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FEED_FETCHED),
- PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FEED_PARSED),
- PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FETCH_FEED));
+ $feed_handlers = [
+ ...PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FEED_FETCHED),
+ ...PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FEED_PARSED),
+ ...PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FETCH_FEED),
+ ];
- $feed_handlers = array_filter($feed_handlers, function($plugin) use ($feed_handler_whitelist) {
- return in_array(get_class($plugin), $feed_handler_whitelist) === false; });
+ $feed_handlers = array_filter($feed_handlers,
+ fn($plugin) => in_array(get_class($plugin), $feed_handler_whitelist) === false);
if (count($feed_handlers) > 0) {
print_error(
T_sprintf("The following plugins use per-feed content hooks. This may cause excessive data usage and origin server load resulting in a ban of your instance: <b>%s</b>" ,
- implode(", ", array_map(function($plugin) { return get_class($plugin); }, $feed_handlers))
+ implode(", ", array_map(fn($plugin) => get_class($plugin), $feed_handlers))
) . " (<a href='https://tt-rss.org/wiki/FeedHandlerPlugins' target='_blank'>".__("More info...")."</a>)"
);
}
@@ -1024,7 +1024,7 @@ class Pref_Prefs extends Handler_Protected {
}
function setplugins(): void {
- $plugins = array_filter($_REQUEST["plugins"], 'clean') ?? [];
+ $plugins = array_filter($_REQUEST["plugins"] ?? [], 'clean');
set_pref(Prefs::_ENABLED_PLUGINS, implode(",", $plugins));
}
@@ -1069,9 +1069,7 @@ class Pref_Prefs extends Handler_Protected {
}
}
- $rv = array_values(array_filter($rv, function ($item) {
- return $item["rv"]["need_update"];
- }));
+ $rv = array_values(array_filter($rv, fn($item) => $item["rv"]["need_update"]));
return $rv;
}
diff --git a/classes/prefs.php b/classes/prefs.php
index 7e6033f4d..378fea293 100644
--- a/classes/prefs.php
+++ b/classes/prefs.php
@@ -230,7 +230,7 @@ class Prefs {
}
}
- if (get_schema_version() >= 141) {
+ if (Config::get_schema_version() >= 141) {
// fill in any overrides from the database
$sth = $this->pdo->prepare("SELECT pref_name, value FROM ttrss_user_prefs2
WHERE owner_uid = :uid AND
@@ -265,7 +265,7 @@ class Prefs {
if ($this->_is_cached($pref_name, $owner_uid, $profile_id)) {
$cached_value = $this->_get_cache($pref_name, $owner_uid, $profile_id);
return Config::cast_to($cached_value, $type_hint);
- } else if (get_schema_version() >= 141) {
+ } else if (Config::get_schema_version() >= 141) {
$sth = $this->pdo->prepare("SELECT value FROM ttrss_user_prefs2
WHERE pref_name = :name AND owner_uid = :uid AND
(profile = :profile OR (:profile IS NULL AND profile IS NULL))");
@@ -390,7 +390,7 @@ class Prefs {
}
function migrate(int $owner_uid, ?int $profile_id): void {
- if (get_schema_version() < 141)
+ if (Config::get_schema_version() < 141)
return;
if (!$profile_id) $profile_id = null;
diff --git a/classes/rpc.php b/classes/rpc.php
index dbb54cec5..ef2cdfc49 100755
--- a/classes/rpc.php
+++ b/classes/rpc.php
@@ -77,7 +77,7 @@ class RPC extends Handler_Protected {
$sth = $this->pdo->prepare("DELETE FROM ttrss_user_entries
WHERE ref_id IN ($ids_qmarks) AND owner_uid = ?");
- $sth->execute(array_merge($ids, [$_SESSION['uid']]));
+ $sth->execute([...$ids, $_SESSION['uid']]);
Article::_purge_orphans();
@@ -364,7 +364,7 @@ class RPC extends Handler_Protected {
WHERE ref_id IN ($ids_qmarks) AND owner_uid = ?");
}
- $sth->execute(array_merge($ids, [$_SESSION['uid']]));
+ $sth->execute([...$ids, $_SESSION['uid']]);
}
/**
@@ -388,7 +388,7 @@ class RPC extends Handler_Protected {
WHERE ref_id IN ($ids_qmarks) AND owner_uid = ?");
}
- $sth->execute(array_merge($ids, [$_SESSION['uid']]));
+ $sth->execute([...$ids, $_SESSION['uid']]);
}
function log(): void {
@@ -753,12 +753,11 @@ class RPC extends Handler_Protected {
function hotkeyHelp(): void {
$info = self::get_hotkeys_info();
$imap = self::get_hotkeys_map();
- $omap = array();
+ $omap = [];
foreach ($imap[1] as $sequence => $action) {
- if (!isset($omap[$action])) $omap[$action] = array();
-
- array_push($omap[$action], $sequence);
+ $omap[$action] ??= [];
+ $omap[$action][] = $sequence;
}
?>
diff --git a/classes/rssutils.php b/classes/rssutils.php
index aec17d538..fe295417a 100755
--- a/classes/rssutils.php
+++ b/classes/rssutils.php
@@ -39,7 +39,7 @@ class RSSUtils {
// check icon files once every Config::get(Config::CACHE_MAX_DAYS) days
$icon_files = array_filter(glob(Config::get(Config::ICONS_DIR) . "/*.ico"),
- function($f) { return filemtime($f) < time() - 86400 * Config::get(Config::CACHE_MAX_DAYS); });
+ fn(string $f) => filemtime($f) < time() - 86400 * Config::get(Config::CACHE_MAX_DAYS));
foreach ($icon_files as $icon) {
$feed_id = basename($icon, ".ico");
@@ -447,7 +447,7 @@ class RSSUtils {
Debug::log("not using CURL due to open_basedir restrictions", Debug::LOG_VERBOSE);
}
- if (time() - strtotime($feed_obj->last_unconditional) > Config::get(Config::MAX_CONDITIONAL_INTERVAL)) {
+ if (time() - strtotime($feed_obj->last_unconditional ?? "") > Config::get(Config::MAX_CONDITIONAL_INTERVAL)) {
Debug::log("maximum allowed interval for conditional requests exceeded, forcing refetch", Debug::LOG_VERBOSE);
$force_refetch = true;
@@ -492,7 +492,7 @@ class RSSUtils {
// If-Modified-Since
if (UrlHelper::$fetch_last_error_code == 304) {
- Debug::log("source claims data not modified, nothing to do.", Debug::LOG_VERBOSE);
+ Debug::log("source claims data not modified (304), nothing to do.", Debug::LOG_VERBOSE);
$error_message = "";
$feed_obj->set([
@@ -503,6 +503,24 @@ class RSSUtils {
$feed_obj->save();
+ } else if (UrlHelper::$fetch_last_error_code == 429) {
+
+ // randomize interval using Config::HTTP_429_THROTTLE_INTERVAL as a base value (1-2x)
+ $http_429_throttle_interval = rand(Config::get(Config::HTTP_429_THROTTLE_INTERVAL),
+ Config::get(Config::HTTP_429_THROTTLE_INTERVAL)*2);
+
+ $error_message = UrlHelper::$fetch_last_error;
+
+ Debug::log("source claims we're requesting too often (429), throttling updates for $http_429_throttle_interval seconds.",
+ Debug::LOG_VERBOSE);
+
+ $feed_obj->set([
+ 'last_error' => $error_message . " (updates throttled for $http_429_throttle_interval seconds.)",
+ 'last_successful_update' => Db::NOW($http_429_throttle_interval),
+ 'last_updated' => Db::NOW($http_429_throttle_interval),
+ ]);
+
+ $feed_obj->save();
} else {
$error_message = UrlHelper::$fetch_last_error;
@@ -644,7 +662,7 @@ class RSSUtils {
print_r($item);
}
- if (ini_get("max_execution_time") > 0 && time() - $tstart >= ini_get("max_execution_time") * 0.7) {
+ if (ini_get("max_execution_time") > 0 && time() - $tstart >= ((float)ini_get("max_execution_time") * 0.7)) {
Debug::log("looks like there's too many articles to process at once, breaking out.", Debug::LOG_VERBOSE);
$pdo->commit();
break;
@@ -715,7 +733,7 @@ class RSSUtils {
$article_labels = Article::_get_labels($base_entry_id, $feed_obj->owner_uid);
$existing_tags = Article::_get_tags($base_entry_id, $feed_obj->owner_uid);
- $entry_tags = array_unique(array_merge($entry_tags, $existing_tags));
+ $entry_tags = array_unique([...$entry_tags, ...$existing_tags]);
} else {
$base_entry_id = false;
$entry_stored_hash = "";
@@ -847,7 +865,7 @@ class RSSUtils {
$pluginhost->run_hooks(PluginHost::HOOK_FILTER_TRIGGERED,
$feed, $feed_obj->owner_uid, $article, $matched_filters, $matched_rules, $article_filters);
- $matched_filter_ids = array_map(function($f) { return $f['id']; }, $matched_filters);
+ $matched_filter_ids = array_map(fn(array $f) => $f['id'], $matched_filters);
if (count($matched_filter_ids) > 0) {
$filter_objs = ORM::for_table('ttrss_filters2')
@@ -1172,8 +1190,7 @@ class RSSUtils {
// check for manual tags (we have to do it here since they're loaded from filters)
foreach ($article_filters as $f) {
if ($f["type"] == "tag") {
- $entry_tags = array_merge($entry_tags,
- FeedItem_Common::normalize_categories(explode(",", $f["param"])));
+ $entry_tags = [...$entry_tags, ...FeedItem_Common::normalize_categories(explode(",", $f["param"]))];
}
}
@@ -1778,12 +1795,10 @@ class RSSUtils {
owner_uid = ? AND enabled = true ORDER BY order_id, title");
$sth->execute([$owner_uid]);
- $check_cats = array_merge(
- Feeds::_get_parent_cats($cat_id, $owner_uid),
- [$cat_id]);
+ $check_cats = [...Feeds::_get_parent_cats($cat_id, $owner_uid), $cat_id];
$check_cats_str = join(",", $check_cats);
- $check_cats_fullids = array_map(function($a) { return "CAT:$a"; }, $check_cats);
+ $check_cats_fullids = array_map(fn(int $a) => "CAT:$a", $check_cats);
while ($line = $sth->fetch()) {
$filter_id = $line["id"];
diff --git a/classes/urlhelper.php b/classes/urlhelper.php
index bb51f5d06..dc47f5ad8 100644
--- a/classes/urlhelper.php
+++ b/classes/urlhelper.php
@@ -10,31 +10,14 @@ class UrlHelper {
"application/x-bittorrent" => [ "magnet" ],
];
- // TODO: class properties can be switched to PHP typing if/when the minimum PHP_VERSION is raised to 7.4.0+
- /** @var string */
- static $fetch_last_error;
-
- /** @var int */
- static $fetch_last_error_code;
-
- /** @var string */
- static $fetch_last_error_content;
-
- /** @var string */
- static $fetch_last_content_type;
-
- /** @var string */
- static $fetch_last_modified;
-
-
- /** @var string */
- static $fetch_effective_url;
-
- /** @var string */
- static $fetch_effective_ip_addr;
-
- /** @var bool */
- static $fetch_curl_used;
+ static string $fetch_last_error;
+ static int $fetch_last_error_code;
+ static string $fetch_last_error_content;
+ static string $fetch_last_content_type;
+ static string $fetch_last_modified;
+ static string $fetch_effective_url;
+ static string $fetch_effective_ip_addr;
+ static bool $fetch_curl_used;
/**
* @param array<string, string|int> $parts
@@ -207,32 +190,26 @@ class UrlHelper {
if ($nest > 10)
return false;
- if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
- $context_options = array(
- 'http' => array(
- 'header' => array(
- 'Connection: close'
- ),
- 'method' => 'HEAD',
- 'timeout' => $timeout,
- 'protocol_version'=> 1.1)
- );
-
- if (Config::get(Config::HTTP_PROXY)) {
- $context_options['http']['request_fulluri'] = true;
- $context_options['http']['proxy'] = Config::get(Config::HTTP_PROXY);
- }
+ $context_options = array(
+ 'http' => array(
+ 'header' => array(
+ 'Connection: close'
+ ),
+ 'method' => 'HEAD',
+ 'timeout' => $timeout,
+ 'protocol_version'=> 1.1)
+ );
+
+ if (Config::get(Config::HTTP_PROXY)) {
+ $context_options['http']['request_fulluri'] = true;
+ $context_options['http']['proxy'] = Config::get(Config::HTTP_PROXY);
+ }
- $context = stream_context_create($context_options);
+ $context = stream_context_create($context_options);
- // PHP 8 changed the second param from int to bool, but we still support PHP >= 7.1.0
- // @phpstan-ignore-next-line
- $headers = get_headers($url, 0, $context);
- } else {
- // PHP 8 changed the second param from int to bool, but we still support PHP >= 7.1.0
- // @phpstan-ignore-next-line
- $headers = get_headers($url, 0);
- }
+ // PHP 8 changed the second param from int to bool, but we still support PHP >= 7.4.0
+ // @phpstan-ignore-next-line
+ $headers = get_headers($url, 0, $context);
if (is_array($headers)) {
$headers = array_reverse($headers); // last one is the correct one
@@ -462,7 +439,11 @@ class UrlHelper {
}
if (!$contents) {
- self::$fetch_last_error = curl_errno($ch) . " " . curl_error($ch);
+ if (curl_errno($ch) === 0) {
+ self::$fetch_last_error = 'Successful response, but no content was received.';
+ } else {
+ self::$fetch_last_error = curl_errno($ch) . " " . curl_error($ch);
+ }
curl_close($ch);
return false;
}
@@ -543,6 +524,11 @@ class UrlHelper {
$data = @file_get_contents($url, false, $context);
+ if ($data === false) {
+ self::$fetch_last_error = "'file_get_contents' failed.";
+ return false;
+ }
+
foreach ($http_response_header as $header) {
if (strstr($header, ": ") !== false) {
list ($key, $value) = explode(": ", $header);
@@ -578,15 +564,20 @@ class UrlHelper {
return false;
}
- $is_gzipped = RSSUtils::is_gzipped($data);
+ if ($data) {
+ $is_gzipped = RSSUtils::is_gzipped($data);
- if ($is_gzipped && $data) {
- $tmp = @gzdecode($data);
+ if ($is_gzipped) {
+ $tmp = @gzdecode($data);
- if ($tmp) $data = $tmp;
- }
+ if ($tmp) $data = $tmp;
+ }
- return $data;
+ return $data;
+ } else {
+ self::$fetch_last_error = 'Successful response, but no content was received.';
+ return false;
+ }
}
}
diff --git a/classes/userhelper.php b/classes/userhelper.php
index 91e40665d..228bb14fb 100644
--- a/classes/userhelper.php
+++ b/classes/userhelper.php
@@ -17,6 +17,15 @@ class UserHelper {
self::HASH_ALGO_SHA1
];
+ const ACCESS_LEVELS = [
+ self::ACCESS_LEVEL_DISABLED,
+ self::ACCESS_LEVEL_READONLY,
+ self::ACCESS_LEVEL_USER,
+ self::ACCESS_LEVEL_POWERUSER,
+ self::ACCESS_LEVEL_ADMIN,
+ self::ACCESS_LEVEL_KEEP_CURRENT
+ ];
+
/** forbidden to login */
const ACCESS_LEVEL_DISABLED = -2;
@@ -32,6 +41,23 @@ class UserHelper {
/** has administrator permissions */
const ACCESS_LEVEL_ADMIN = 10;
+ /** used by self::user_modify() to keep current access level */
+ const ACCESS_LEVEL_KEEP_CURRENT = -1024;
+
+ /**
+ * @param int $level integer loglevel value
+ * @return UserHelper::ACCESS_LEVEL_* if valid, warn and return ACCESS_LEVEL_KEEP_CURRENT otherwise
+ */
+ public static function map_access_level(int $level) : int {
+ if (in_array($level, self::ACCESS_LEVELS)) {
+ /** @phpstan-ignore-next-line */
+ return $level;
+ } else {
+ user_error("Passed invalid user access level: $level", E_USER_WARNING);
+ return self::ACCESS_LEVEL_KEEP_CURRENT;
+ }
+ }
+
static function authenticate(string $login = null, string $password = null, bool $check_only = false, string $service = null): bool {
if (!Config::get(Config::SINGLE_USER_MODE)) {
$user_id = false;
@@ -133,7 +159,7 @@ class UserHelper {
if (empty($_SESSION["uid"])) {
if (Config::get(Config::AUTH_AUTO_LOGIN) && self::authenticate(null, null)) {
- $_SESSION["ref_schema_version"] = get_schema_version();
+ $_SESSION["ref_schema_version"] = Config::get_schema_version();
} else {
self::authenticate(null, null, true);
}
@@ -217,6 +243,7 @@ class UserHelper {
return substr(bin2hex(get_random_bytes(125)), 0, 250);
}
+ /** TODO: this should invoke UserHelper::user_modify() */
static function reset_password(int $uid, bool $format_output = false, string $new_password = ""): void {
$user = ORM::for_table('ttrss_users')->find_one($uid);
@@ -335,18 +362,14 @@ class UserHelper {
return null;
}
- static function is_default_password(): bool {
-
- /** @var Auth_Internal|false $authenticator -- this is only here to make check_password() visible to static analyzer */
- $authenticator = PluginHost::getInstance()->get_plugin($_SESSION["auth_module"]);
-
- if ($authenticator &&
- method_exists($authenticator, "check_password") &&
- $authenticator->check_password($_SESSION["uid"], "password")) {
-
- return true;
- }
- return false;
+ /**
+ * @param null|int $owner_uid if null, checks current user via session-specific auth module, if set works on internal database only
+ * @return bool
+ * @throws PDOException
+ * @throws Exception
+ */
+ static function is_default_password(?int $owner_uid = null): bool {
+ return self::user_has_password($owner_uid, 'password');
}
/**
@@ -380,4 +403,115 @@ class UserHelper {
else
return false;
}
+
+ /**
+ * @param string $login Login for new user (case-insensitive)
+ * @param string $password Password for new user (may not be blank)
+ * @param UserHelper::ACCESS_LEVEL_* $access_level Access level for new user
+ * @return bool true if user has been created
+ */
+ static function user_add(string $login, string $password, int $access_level) : bool {
+ $login = clean($login);
+
+ if ($login &&
+ $password &&
+ !self::find_user_by_login($login) &&
+ self::map_access_level((int)$access_level) != self::ACCESS_LEVEL_KEEP_CURRENT) {
+
+ $user = ORM::for_table('ttrss_users')->create();
+
+ $user->salt = self::get_salt();
+ $user->login = mb_strtolower($login);
+ $user->pwd_hash = self::hash_password($password, $user->salt);
+ $user->access_level = $access_level;
+ $user->created = Db::NOW();
+
+ return $user->save();
+ }
+
+ return false;
+ }
+
+ /**
+ * @param int $uid User ID to modify
+ * @param string $new_password set password to this value if its not blank
+ * @param UserHelper::ACCESS_LEVEL_* $access_level set user access level to this value if it is set (default ACCESS_LEVEL_KEEP_CURRENT)
+ * @return bool true if user record has been saved
+ *
+ * NOTE: $access_level is of mixed type because of intellephense
+ */
+ static function user_modify(int $uid, string $new_password = '', $access_level = self::ACCESS_LEVEL_KEEP_CURRENT) : bool {
+ $user = ORM::for_table('ttrss_users')->find_one($uid);
+
+ if ($user) {
+ if ($new_password != '') {
+ $new_salt = self::get_salt();
+ $pwd_hash = self::hash_password($new_password, $new_salt, self::HASH_ALGOS[0]);
+
+ $user->pwd_hash = $pwd_hash;
+ $user->salt = $new_salt;
+ }
+
+ if ($access_level != self::ACCESS_LEVEL_KEEP_CURRENT) {
+ $user->access_level = (int)$access_level;
+ }
+
+ return $user->save();
+ }
+
+ return false;
+ }
+
+ /**
+ * @param int $uid user ID to delete (this won't delete built-in admin user with UID 1)
+ * @return bool true if user has been deleted
+ */
+ static function user_delete(int $uid) : bool {
+ if ($uid != 1) {
+
+ $user = ORM::for_table('ttrss_users')->find_one($uid);
+
+ if ($user) {
+ // TODO: is it still necessary to split those queries?
+
+ ORM::for_table('ttrss_tags')
+ ->where('owner_uid', $uid)
+ ->delete_many();
+
+ ORM::for_table('ttrss_feeds')
+ ->where('owner_uid', $uid)
+ ->delete_many();
+
+ return $user->delete();
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param null|int $owner_uid if null, checks current user via session-specific auth module, if set works on internal database only
+ * @param string $password password to compare hash against
+ * @return bool
+ */
+ static function user_has_password(?int $owner_uid, string $password) : bool {
+ if ($owner_uid) {
+ $authenticator = new Auth_Internal();
+
+ return $authenticator->check_password($owner_uid, $password);
+ } else {
+ /** @var Auth_Internal|false $authenticator -- this is only here to make check_password() visible to static analyzer */
+ $authenticator = PluginHost::getInstance()->get_plugin($_SESSION["auth_module"]);
+
+ if ($authenticator &&
+ method_exists($authenticator, "check_password") &&
+ $authenticator->check_password($_SESSION["uid"], $password)) {
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
}
diff --git a/composer.json b/composer.json
index 0e0d1d418..5ed79e1e0 100644
--- a/composer.json
+++ b/composer.json
@@ -1,12 +1,22 @@
{
+ "config": {
+ "platform-check": false
+ },
+ "repositories": [
+ {
+ "name": "j4mie/idiorm",
+ "type": "vcs",
+ "url": "https://dev.tt-rss.org/fox/idiorm.git"
+ }
+ ],
"require": {
"spomky-labs/otphp": "^10.0",
- "chillerlan/php-qrcode": "^3.3",
+ "chillerlan/php-qrcode": "^4.3.3",
"mervick/material-design-icons": "^2.2",
- "j4mie/idiorm": "^1.5"
+ "j4mie/idiorm": "dev-master"
},
"require-dev": {
- "phpstan/phpstan": "^1.",
+ "phpstan/phpstan": "1.8.2",
"phpunit/phpunit": "9.5.16"
}
}
diff --git a/composer.lock b/composer.lock
index 1b8cf9f02..aa18e8ebc 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,38 +4,46 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "0c52fd6b8f33561f7c03f12df6f5480f",
+ "content-hash": "6beda4561e770d2f0c7c532c5e3693d3",
"packages": [
{
"name": "beberlei/assert",
- "version": "v3.2.2",
+ "version": "v3.3.2",
"source": {
"type": "git",
"url": "https://github.com/beberlei/assert.git",
- "reference": "5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01"
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/beberlei/assert/zipball/5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01",
- "reference": "5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01",
+ "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655",
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655",
"shasum": ""
},
"require": {
- "php": "^7"
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": "^7.0 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "*",
- "phpstan/phpstan-shim": "*",
- "phpunit/phpunit": ">=6.0.0 <8"
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
},
"type": "library",
"autoload": {
- "psr-4": {
- "Assert\\": "lib/Assert"
- },
"files": [
"lib/Assert/functions.php"
- ]
+ ],
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -59,30 +67,34 @@
"assertion",
"validation"
],
- "time": "2019-08-23T16:04:58+00:00"
+ "support": {
+ "issues": "https://github.com/beberlei/assert/issues",
+ "source": "https://github.com/beberlei/assert/tree/v3.3.2"
+ },
+ "time": "2021-12-16T21:41:27+00:00"
},
{
"name": "chillerlan/php-qrcode",
- "version": "3.4.1",
+ "version": "4.3.4",
"source": {
"type": "git",
"url": "https://github.com/chillerlan/php-qrcode.git",
- "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9"
+ "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/468603b687a5fe75c1ff33857a45f1726c7b95a9",
- "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9",
+ "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+ "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
"shasum": ""
},
"require": {
- "chillerlan/php-settings-container": "^1.2.2",
+ "chillerlan/php-settings-container": "^2.1.4",
"ext-mbstring": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
- "phan/phan": "^3.2.2",
- "phpunit/phpunit": "^8.5",
+ "phan/phan": "^5.3",
+ "phpunit/phpunit": "^9.5",
"setasign/fpdf": "^1.8.2"
},
"suggest": {
@@ -114,7 +126,7 @@
"homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
}
],
- "description": "A QR code generator. PHP 7.2+",
+ "description": "A QR code generator. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-qrcode",
"keywords": [
"phpqrcode",
@@ -123,6 +135,10 @@
"qrcode",
"qrcode-generator"
],
+ "support": {
+ "issues": "https://github.com/chillerlan/php-qrcode/issues",
+ "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.4"
+ },
"funding": [
{
"url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
@@ -133,28 +149,29 @@
"type": "ko_fi"
}
],
- "time": "2021-09-03T17:54:45+00:00"
+ "time": "2022-07-25T09:12:45+00:00"
},
{
"name": "chillerlan/php-settings-container",
- "version": "1.2.2",
+ "version": "2.1.4",
"source": {
"type": "git",
"url": "https://github.com/chillerlan/php-settings-container.git",
- "reference": "d1b5284d6eb3a767459738bb0b20073f0cb3eeaf"
+ "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/d1b5284d6eb3a767459738bb0b20073f0cb3eeaf",
- "reference": "d1b5284d6eb3a767459738bb0b20073f0cb3eeaf",
+ "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+ "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.4"
+ "phan/phan": "^5.3",
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
@@ -173,14 +190,19 @@
"homepage": "https://github.com/codemasher"
}
],
- "description": "A container class for immutable settings objects. Not a DI container. PHP 7.2+",
+ "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-settings-container",
"keywords": [
"PHP7",
"Settings",
+ "configuration",
"container",
"helper"
],
+ "support": {
+ "issues": "https://github.com/chillerlan/php-settings-container/issues",
+ "source": "https://github.com/chillerlan/php-settings-container"
+ },
"funding": [
{
"url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
@@ -191,21 +213,15 @@
"type": "ko_fi"
}
],
- "time": "2021-09-03T17:33:25+00:00"
+ "time": "2022-07-05T22:32:14+00:00"
},
{
"name": "j4mie/idiorm",
- "version": "v1.5.7",
+ "version": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/j4mie/idiorm.git",
- "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/j4mie/idiorm/zipball/d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
- "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
- "shasum": ""
+ "url": "https://dev.tt-rss.org/fox/idiorm.git",
+ "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb"
},
"require": {
"php": ">=5.2.0"
@@ -214,13 +230,18 @@
"ext-pdo_sqlite": "*",
"phpunit/phpunit": "^4.8"
},
+ "default-branch": true,
"type": "library",
"autoload": {
"classmap": [
"idiorm.php"
]
},
- "notification-url": "https://packagist.org/downloads/",
+ "scripts": {
+ "test": [
+ "phpunit -c ./phpunit.xml"
+ ]
+ },
"license": [
"BSD-2-Clause",
"BSD-3-Clause",
@@ -257,7 +278,7 @@
"issues": "https://github.com/j4mie/idiorm/issues",
"source": "https://github.com/j4mie/idiorm"
},
- "time": "2020-04-29T00:37:09+00:00"
+ "time": "2022-03-26T15:19:01+00:00"
},
{
"name": "mervick/material-design-icons",
@@ -304,16 +325,16 @@
},
{
"name": "paragonie/constant_time_encoding",
- "version": "v2.4.0",
+ "version": "v2.6.3",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c"
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
- "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938",
"shasum": ""
},
"require": {
@@ -367,20 +388,20 @@
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
"source": "https://github.com/paragonie/constant_time_encoding"
},
- "time": "2020-12-06T15:14:20+00:00"
+ "time": "2022-06-14T06:56:20+00:00"
},
{
"name": "spomky-labs/otphp",
- "version": "v10.0.1",
+ "version": "v10.0.3",
"source": {
"type": "git",
"url": "https://github.com/Spomky-Labs/otphp.git",
- "reference": "f44cce5a9db4b8da410215d992110482c931232f"
+ "reference": "9784d9f7c790eed26e102d6c78f12c754036c366"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f",
- "reference": "f44cce5a9db4b8da410215d992110482c931232f",
+ "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366",
+ "reference": "9784d9f7c790eed26e102d6c78f12c754036c366",
"shasum": ""
},
"require": {
@@ -388,7 +409,7 @@
"ext-mbstring": "*",
"paragonie/constant_time_encoding": "^2.0",
"php": "^7.2|^8.0",
- "thecodingmachine/safe": "^0.1.14|^1.0"
+ "thecodingmachine/safe": "^0.1.14|^1.0|^2.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.0",
@@ -398,7 +419,7 @@
"phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.12",
"phpunit/phpunit": "^8.0",
- "thecodingmachine/phpstan-safe-rule": "^1.0"
+ "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
@@ -440,52 +461,51 @@
],
"support": {
"issues": "https://github.com/Spomky-Labs/otphp/issues",
- "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1"
+ "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3"
},
- "time": "2020-01-28T09:24:19+00:00"
+ "time": "2022-03-17T08:00:35+00:00"
},
{
"name": "thecodingmachine/safe",
- "version": "v1.3.3",
+ "version": "v2.2.2",
"source": {
"type": "git",
"url": "https://github.com/thecodingmachine/safe.git",
- "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc"
+ "reference": "440284f9592c9df402832452a6871a8b3c48d97e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
- "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/440284f9592c9df402832452a6871a8b3c48d97e",
+ "reference": "440284f9592c9df402832452a6871a8b3c48d97e",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "php": "^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan": "^1.5",
+ "phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.2",
- "thecodingmachine/phpstan-strict-rules": "^0.12"
+ "thecodingmachine/phpstan-strict-rules": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.1-dev"
+ "dev-master": "2.2.x-dev"
}
},
"autoload": {
- "psr-4": {
- "Safe\\": [
- "lib/",
- "deprecated/",
- "generated/"
- ]
- },
"files": [
"deprecated/apc.php",
+ "deprecated/array.php",
+ "deprecated/datetime.php",
"deprecated/libevent.php",
+ "deprecated/password.php",
"deprecated/mssql.php",
"deprecated/stats.php",
+ "deprecated/strings.php",
"lib/special_cases.php",
+ "deprecated/mysqli.php",
"generated/apache.php",
"generated/apcu.php",
"generated/array.php",
@@ -506,6 +526,7 @@
"generated/fpm.php",
"generated/ftp.php",
"generated/funchand.php",
+ "generated/gettext.php",
"generated/gmp.php",
"generated/gnupg.php",
"generated/hash.php",
@@ -515,7 +536,6 @@
"generated/image.php",
"generated/imap.php",
"generated/info.php",
- "generated/ingres-ii.php",
"generated/inotify.php",
"generated/json.php",
"generated/ldap.php",
@@ -524,20 +544,14 @@
"generated/mailparse.php",
"generated/mbstring.php",
"generated/misc.php",
- "generated/msql.php",
"generated/mysql.php",
- "generated/mysqli.php",
- "generated/mysqlndMs.php",
- "generated/mysqlndQc.php",
"generated/network.php",
"generated/oci8.php",
"generated/opcache.php",
"generated/openssl.php",
"generated/outcontrol.php",
- "generated/password.php",
"generated/pcntl.php",
"generated/pcre.php",
- "generated/pdf.php",
"generated/pgsql.php",
"generated/posix.php",
"generated/ps.php",
@@ -548,7 +562,6 @@
"generated/sem.php",
"generated/session.php",
"generated/shmop.php",
- "generated/simplexml.php",
"generated/sockets.php",
"generated/sodium.php",
"generated/solr.php",
@@ -570,6 +583,13 @@
"generated/yaz.php",
"generated/zip.php",
"generated/zlib.php"
+ ],
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "deprecated/Exceptions/",
+ "generated/Exceptions/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -579,9 +599,9 @@
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
"support": {
"issues": "https://github.com/thecodingmachine/safe/issues",
- "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3"
+ "source": "https://github.com/thecodingmachine/safe/tree/v2.2.2"
},
- "time": "2020-10-28T17:51:34+00:00"
+ "time": "2022-07-20T17:46:34+00:00"
}
],
"packages-dev": [
@@ -716,16 +736,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v4.13.2",
+ "version": "v4.14.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077"
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
"shasum": ""
},
"require": {
@@ -766,9 +786,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
},
- "time": "2021-11-30T19:35:32+00:00"
+ "time": "2022-05-31T20:59:12+00:00"
},
{
"name": "phar-io/manifest",
@@ -993,16 +1013,16 @@
},
{
"name": "phpdocumentor/type-resolver",
- "version": "1.6.0",
+ "version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706"
+ "reference": "77a32518733312af16a44300404e945338981de3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706",
- "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
+ "reference": "77a32518733312af16a44300404e945338981de3",
"shasum": ""
},
"require": {
@@ -1037,9 +1057,9 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0"
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
},
- "time": "2022-01-04T19:58:01+00:00"
+ "time": "2022-03-15T21:29:03+00:00"
},
{
"name": "phpspec/prophecy",
@@ -1110,20 +1130,20 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.1.2",
+ "version": "1.8.2",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "bcea0ae85868a89d5789c75f012c93129f842934"
+ "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bcea0ae85868a89d5789c75f012c93129f842934",
- "reference": "bcea0ae85868a89d5789c75f012c93129f842934",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c53312ecc575caf07b0e90dee43883fdf90ca67c",
+ "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c",
"shasum": ""
},
"require": {
- "php": "^7.1|^8.0"
+ "php": "^7.2|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
@@ -1133,11 +1153,6 @@
"phpstan.phar"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
"autoload": {
"files": [
"bootstrap.php"
@@ -1148,6 +1163,10 @@
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "source": "https://github.com/phpstan/phpstan/tree/1.8.2"
+ },
"funding": [
{
"url": "https://github.com/ondrejmirtes",
@@ -1166,7 +1185,7 @@
"type": "tidelift"
}
],
- "time": "2021-11-09T12:41:09+00:00"
+ "time": "2022-07-20T09:57:31+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -1955,16 +1974,16 @@
},
{
"name": "sebastian/environment",
- "version": "5.1.3",
+ "version": "5.1.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
"shasum": ""
},
"require": {
@@ -2006,7 +2025,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
},
"funding": [
{
@@ -2014,7 +2033,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:52:38+00:00"
+ "time": "2022-04-03T09:37:03+00:00"
},
{
"name": "sebastian/exporter",
@@ -2554,88 +2573,6 @@
"time": "2020-09-28T06:39:44+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.25.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "[email protected]"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-10-20T20:35:02+00:00"
- },
- {
"name": "theseer/tokenizer",
"version": "1.2.1",
"source": {
@@ -2687,21 +2624,21 @@
},
{
"name": "webmozart/assert",
- "version": "1.10.0",
+ "version": "1.11.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
@@ -2739,17 +2676,19 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.10.0"
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
- "time": "2021-03-09T10:59:23+00:00"
+ "time": "2022-06-03T18:03:27+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {
+ "j4mie/idiorm": 20
+ },
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
- "plugin-api-version": "2.1.0"
+ "plugin-api-version": "2.0.0"
}
diff --git a/include/functions.php b/include/functions.php
index 82e08ddb3..a7b15c165 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -108,8 +108,7 @@
$valid_langs[$lang] = $t;
$lang = substr($lang, 0, 2);
- if (!isset($valid_langs[$lang]))
- $valid_langs[$lang] = $t;
+ $valid_langs[$lang] ??= $t;
}
// break up string into pieces (languages and q factors)
diff --git a/include/login_form.php b/include/login_form.php
index 2e0eb077f..a26a58cc9 100755
--- a/include/login_form.php
+++ b/include/login_form.php
@@ -32,6 +32,27 @@
<script type="text/javascript">
require({cache:{}});
</script>
+
+ <script type="text/javascript">
+ /* exported Plugins */
+ const Plugins = {};
+
+ <?php
+ foreach (PluginHost::getInstance()->get_plugins() as $n => $p) {
+ if (method_exists($p, "get_login_js")) {
+ $script = $p->get_login_js();
+
+ if ($script) {
+ echo "try {
+ $script
+ } catch (e) {
+ console.warn('failed to initialize plugin JS: $n', e);
+ }";
+ }
+ }
+ }
+ ?>
+ </script>
</head>
<body class="flat ttrss_utility ttrss_login css_loading">
@@ -175,6 +196,7 @@
<fieldset class="align-right">
<label> </label>
<?= \Controls\submit_tag(__('Log in')) ?>
+ <?php PluginHost::getInstance()->run_hooks(PluginHost::HOOK_LOGINFORM_ADDITIONAL_BUTTONS) ?>
</fieldset>
</form>
diff --git a/index.php b/index.php
index b1f3274f3..b7c039d7a 100644
--- a/index.php
+++ b/index.php
@@ -2,8 +2,8 @@
// we need a separate check here because functions.php might get parsed
// incorrectly before 5.3 because of :: syntax.
- if (version_compare(PHP_VERSION, '7.0.0', '<')) {
- print "<b>Fatal Error</b>: PHP version 7.0.0 or newer required. You're using " . PHP_VERSION . ".\n";
+ if (version_compare(PHP_VERSION, '7.4.0', '<')) {
+ print "<b>Fatal Error</b>: PHP version 7.4.0 or newer required. You're using " . PHP_VERSION . ".\n";
exit;
}
diff --git a/js/PrefFeedTree.js b/js/PrefFeedTree.js
index 0585173c9..85b262b6d 100644
--- a/js/PrefFeedTree.js
+++ b/js/PrefFeedTree.js
@@ -1,5 +1,5 @@
/* eslint-disable prefer-rest-params */
-/* global __, lib, dijit, define, dojo, CommonDialogs, Notify, Tables, xhrPost, xhr, fox, App */
+/* global __, lib, dijit, define, dojo, CommonDialogs, Notify, Tables, xhr, fox, App */
define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dojo/_base/array", "dojo/cookie"],
function (declare, domConstruct, checkBoxTree, array, cookie) {
@@ -14,6 +14,17 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dojo/_b
this.checkInactiveFeeds();
this.checkErrorFeeds();
});
+
+ dojo.connect(this, 'onClick', (item) => {
+ const id = String(item.id);
+ const bare_id = id.substr(id.indexOf(':')+1);
+
+ if (id.match('FEED:')) {
+ CommonDialogs.editFeed(bare_id);
+ } else if (id.match('CAT:')) {
+ dijit.byId('feedTree').editCategory(bare_id, item);
+ }
+ });
},
// save state in localStorage instead of cookies
// reference: https://stackoverflow.com/a/27968996
diff --git a/js/PrefFilterTree.js b/js/PrefFilterTree.js
index d4496b647..149261abd 100644
--- a/js/PrefFilterTree.js
+++ b/js/PrefFilterTree.js
@@ -1,5 +1,5 @@
/* eslint-disable prefer-rest-params */
-/* global __, define, lib, dijit, dojo, xhr, App, Notify */
+/* global __, define, lib, dijit, dojo, xhr, App, Notify, Filters */
define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], function (declare, domConstruct) {
@@ -10,6 +10,15 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree"], functio
dijit.byId('filterTree').hideOrShowFilterRules(
parseInt(localStorage.getItem("ttrss:hide-filter-rules"))
);
+
+ dojo.connect(this, 'onClick', (item) => {
+ const id = String(item.id);
+ const bare_id = id.substr(id.indexOf(':')+1);
+
+ if (id.match('FILTER:')) {
+ Filters.edit(bare_id);
+ }
+ });
},
_createTreeNode: function(args) {
const tnode = this.inherited(arguments);
diff --git a/phpstan.neon b/phpstan.neon
index 66c6caa50..2ca1ca2d3 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -1,5 +1,7 @@
parameters:
level: 6
+ parallel:
+ maximumNumberOfProcesses: 2
reportUnmatchedIgnoredErrors: false
ignoreErrors:
- '#Constant.*\b(SUBSTRING_FOR_DATE|SCHEMA_VERSION|SELF_USER_AGENT|LABEL_BASE_INDEX|PLUGIN_FEED_BASE_INDEX)\b.*not found#'
diff --git a/plugins/af_comics/init.php b/plugins/af_comics/init.php
index a9a8f3faa..0649cf92c 100755
--- a/plugins/af_comics/init.php
+++ b/plugins/af_comics/init.php
@@ -19,7 +19,10 @@ class Af_Comics extends Plugin {
require_once __DIR__ . "/filter_base.php";
- $filters = array_merge(glob(__DIR__ . "/filters.local/*.php"), glob(__DIR__ . "/filters/*.php"));
+ $filters = [
+ ...(glob(__DIR__ . "/filters.local/*.php") ?: []),
+ ...(glob(__DIR__ . "/filters/*.php") ?: []),
+ ];
$names = [];
foreach ($filters as $file) {
diff --git a/plugins/af_psql_trgm/init.php b/plugins/af_psql_trgm/init.php
index d12f50713..657b11934 100644
--- a/plugins/af_psql_trgm/init.php
+++ b/plugins/af_psql_trgm/init.php
@@ -23,8 +23,6 @@ class Af_Psql_Trgm extends Plugin {
$enable_globally = checkbox_to_sql_bool($_POST["enable_globally"] ?? "");
if ($similarity < 0) $similarity = 0;
- if ($similarity > 1) $similarity = 1;
-
if ($min_title_length < 0) $min_title_length = 0;
$similarity = sprintf("%.2f", $similarity);
@@ -65,24 +63,43 @@ class Af_Psql_Trgm extends Plugin {
print "<p>$title</p>";
- $sth = $this->pdo->prepare("SELECT ttrss_entries.id AS id,
- feed_id,
- ttrss_entries.title AS title,
- updated, link,
- ttrss_feeds.title AS feed_title,
- SIMILARITY(ttrss_entries.title, ?) AS sm
- FROM
- ttrss_entries, ttrss_user_entries LEFT JOIN ttrss_feeds ON (ttrss_feeds.id = feed_id)
- WHERE
- ttrss_entries.id = ref_id AND
- ttrss_user_entries.owner_uid = ? AND
- ttrss_entries.id != ? AND
- date_entered >= NOW() - INTERVAL '2 weeks'
- ORDER BY
- sm DESC, date_entered DESC
- LIMIT 10");
-
- $sth->execute([$title, $owner_uid, $id]);
+ if (Config::get(Config::DB_TYPE) == "pgsql") {
+ $sth = $this->pdo->prepare("SELECT ttrss_entries.id AS id,
+ feed_id,
+ ttrss_entries.title AS title,
+ updated, link,
+ ttrss_feeds.title AS feed_title,
+ SIMILARITY(ttrss_entries.title, :title) AS sm
+ FROM
+ ttrss_entries, ttrss_user_entries LEFT JOIN ttrss_feeds ON (ttrss_feeds.id = feed_id)
+ WHERE
+ ttrss_entries.id = ref_id AND
+ ttrss_user_entries.owner_uid = :owner_uid AND
+ ttrss_entries.id != :id AND
+ date_entered >= NOW() - INTERVAL '2 weeks'
+ ORDER BY
+ sm DESC, date_entered DESC
+ LIMIT 10");
+ } else {
+ $sth = $this->pdo->prepare("SELECT ttrss_entries.id AS id,
+ feed_id,
+ ttrss_entries.title AS title,
+ updated, link,
+ ttrss_feeds.title AS feed_title,
+ (MATCH (ttrss_entries.title) AGAINST (:title) / LENGTH(ttrss_entries.title)) AS sm
+ FROM
+ ttrss_entries, ttrss_user_entries LEFT JOIN ttrss_feeds ON (ttrss_feeds.id = feed_id)
+ WHERE
+ ttrss_entries.id = ref_id AND
+ ttrss_user_entries.owner_uid = :owner_uid AND
+ ttrss_entries.id != :id AND
+ date_entered >= DATE_SUB(NOW(), INTERVAL 2 WEEK)
+ ORDER BY
+ sm DESC, date_entered DESC
+ LIMIT 10");
+ }
+
+ $sth->execute(['title' => $title, "owner_uid" => $owner_uid, "id" => $id]);
print "<ul class='panel panel-scrollable'>";
@@ -140,9 +157,7 @@ class Af_Psql_Trgm extends Plugin {
title="<i class='material-icons'>extension</i> <?= __('Mark similar articles as read (af_psql_trgm)') ?>">
<?php
- if (Config::get(Config::DB_TYPE) != "pgsql") {
- print_error("Database type not supported.");
- } else {
+ if (Config::get(Config::DB_TYPE) == "pgsql") {
$res = $this->pdo->query("select 'similarity'::regproc");
if (!$res || !$res->fetch()) {
@@ -175,7 +190,11 @@ class Af_Psql_Trgm extends Plugin {
name="similarity" value="<?= htmlspecialchars($similarity) ?>">
<div dojoType='dijit.Tooltip' connectId='psql_trgm_similarity' position='below'>
- <?= __("PostgreSQL trigram extension returns string similarity as a floating point number (0-1). Setting it too low might produce false positives, zero disables checking.") ?>
+ <?php if (Config::get(Config::DB_TYPE) == "pgsql") { ?>
+ <?= __("PostgreSQL trigram extension returns string similarity as a floating point number (0-1). Setting it too low might produce false positives, zero disables checking.") ?>
+ <?php } else { ?>
+ <?= __("Setting this value too low might produce false positives, zero disables checking.") ?>
+ <?php } ?>
</div>
</fieldset>
@@ -264,10 +283,10 @@ class Af_Psql_Trgm extends Plugin {
function hook_article_filter($article) {
- if (Config::get(Config::DB_TYPE) != "pgsql") return $article;
-
- $res = $this->pdo->query("select 'similarity'::regproc");
- if (!$res || !$res->fetch()) return $article;
+ if (Config::get(Config::DB_TYPE) == "pgsql") {
+ $res = $this->pdo->query("select 'similarity'::regproc");
+ if (!$res || !$res->fetch()) return $article;
+ }
$enable_globally = $this->host->get($this, "enable_globally");
@@ -317,12 +336,23 @@ class Af_Psql_Trgm extends Plugin {
return $article;
} */
- $sth = $this->pdo->prepare("SELECT MAX(SIMILARITY(title, ?)) AS ms
- FROM ttrss_entries, ttrss_user_entries WHERE ref_id = id AND
- date_entered >= NOW() - interval '1 day' AND
- guid != ? AND
- owner_uid = ?");
- $sth->execute([$title_escaped, $entry_guid, $owner_uid]);
+ if (Config::get(Config::DB_TYPE) == "pgsql") {
+ $sth = $this->pdo->prepare("SELECT MAX(SIMILARITY(title, :title)) AS ms
+ FROM ttrss_entries, ttrss_user_entries WHERE ref_id = id AND
+ date_entered >= NOW() - interval '1 day' AND
+ guid != :guid AND
+ owner_uid = :uid");
+ } else {
+ $sth = $this->pdo->prepare("SELECT (MATCH(title) AGAINST (:title) / LENGTH(title)) AS ms
+ FROM ttrss_entries, ttrss_user_entries WHERE ref_id = id AND
+ date_entered >= DATE_SUB(NOW(), INTERVAL 1 DAY) AND
+ guid != :guid AND
+ owner_uid = :uid
+ ORDER BY ms DESC
+ LIMIT 1");
+ }
+
+ $sth->execute(['title' => $title_escaped, 'guid' => $entry_guid, 'uid' => $owner_uid]);
$row = $sth->fetch();
$similarity_result = $row['ms'];
diff --git a/plugins/af_readability/composer.json b/plugins/af_readability/composer.json
index f23f50db9..7a7eab59c 100644
--- a/plugins/af_readability/composer.json
+++ b/plugins/af_readability/composer.json
@@ -1,5 +1,20 @@
{
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "repositories": [
+ {
+ "name": "fivefilters/readability.php",
+ "type": "vcs",
+ "url": "https://dev.tt-rss.org/fox/readability-php.git"
+ },
+ {
+ "name": "masterminds/html5",
+ "type": "vcs",
+ "url": "https://dev.tt-rss.org/fox/html5-php.git"
+ }
+ ],
"require": {
- "fivefilters/readability.php": "^2.1"
+ "fivefilters/readability.php": "dev-master",
+ "psr/http-factory": "1.0.1"
}
}
diff --git a/plugins/af_readability/composer.lock b/plugins/af_readability/composer.lock
index 8001f054e..cbd60b592 100644
--- a/plugins/af_readability/composer.lock
+++ b/plugins/af_readability/composer.lock
@@ -4,43 +4,44 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "985d4bb2caa672420e280a0b2bbb4715",
+ "content-hash": "183ed768c66eb8f183350edf06c06a63",
"packages": [
{
"name": "fivefilters/readability.php",
- "version": "v2.1.0",
+ "version": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/fivefilters/readability.php.git",
- "reference": "7617a912b6c527909168f5d41d263792f171c42a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/fivefilters/readability.php/zipball/7617a912b6c527909168f5d41d263792f171c42a",
- "reference": "7617a912b6c527909168f5d41d263792f171c42a",
- "shasum": ""
+ "url": "https://dev.tt-rss.org/fox/readability-php.git",
+ "reference": "8ac5abdd497b37d2be4833bcf18d6819bba4d9c9"
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
"ext-xml": "*",
- "php": ">=7.0.0",
+ "league/uri": "^6.4",
+ "masterminds/html5": "2.7.x-dev@dev",
+ "php": ">=7.3.0",
"psr/log": "^1.0"
},
"require-dev": {
- "monolog/monolog": "^1.24",
- "phpunit/phpunit": "^6.5"
+ "monolog/monolog": "^2.3",
+ "phpunit/phpunit": "^9"
},
"suggest": {
"monolog/monolog": "Allow logging debug information"
},
+ "default-branch": true,
"type": "library",
"autoload": {
"psr-4": {
- "andreskrey\\Readability\\": "src/"
+ "fivefilters\\Readability\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "fivefilters\\Readability\\Test\\": "test"
}
},
- "notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
@@ -48,19 +49,364 @@
{
"name": "Andres Rey",
"email": "[email protected]",
- "role": "Lead Developer"
+ "role": "Original Developer"
+ },
+ {
+ "name": "Keyvan Minoukadeh",
+ "email": "[email protected]",
+ "homepage": "https://www.fivefilters.org",
+ "role": "Developer/Maintainer"
}
],
"description": "A PHP port of Readability.js",
- "homepage": "https://github.com/andreskrey/readability",
+ "homepage": "https://github.com/fivefilters/readability.php",
"keywords": [
"html",
"readability"
],
+ "time": "2022-07-31T06:02:47+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "6.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea",
+ "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "league/uri-interfaces": "^2.3",
+ "php": "^7.4 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v3.3.2",
+ "nyholm/psr7": "^1.5",
+ "php-http/psr7-integration-tests": "^1.1",
+ "phpstan/phpstan": "^1.2.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0.0",
+ "phpstan/phpstan-strict-rules": "^1.1.0",
+ "phpunit/phpunit": "^9.5.10",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "ext-intl": "Needed to improve host validation",
+ "league/uri-components": "Needed to easily manipulate URI objects",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "[email protected]",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri/issues",
+ "source": "https://github.com/thephpleague/uri/tree/6.7.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2022-06-29T09:48:18+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "[email protected]",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interface for URI representation",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "keywords": [
+ "rfc3986",
+ "rfc3987",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/uri-interfaces/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2021-06-28T04:27:21+00:00"
+ },
+ {
+ "name": "masterminds/html5",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://dev.tt-rss.org/fox/html5-php.git",
+ "reference": "1e0033a694ce576deba7c59c1da56c76e9e42109"
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7"
+ },
+ "default-branch": true,
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Masterminds\\HTML5\\Tests\\": "test/HTML5"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "[email protected]"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "dom",
+ "html",
+ "html5",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ],
+ "time": "2022-07-31T06:41:22+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/master"
+ },
+ "time": "2019-04-30T12:38:16+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
"support": {
- "source": "https://github.com/fivefilters/readability.php/tree/v2.1.0"
+ "source": "https://github.com/php-fig/http-message/tree/master"
},
- "time": "2019-07-22T21:42:25+00:00"
+ "time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/log",
@@ -115,9 +461,11 @@
],
"packages-dev": [],
"aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
+ "minimum-stability": "dev",
+ "stability-flags": {
+ "fivefilters/readability.php": 20
+ },
+ "prefer-stable": true,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
diff --git a/plugins/af_readability/init.php b/plugins/af_readability/init.php
index 7027db4a7..1deb1fc77 100755
--- a/plugins/af_readability/init.php
+++ b/plugins/af_readability/init.php
@@ -1,8 +1,8 @@
<?php
require_once __DIR__ . "/vendor/autoload.php";
-use \andreskrey\Readability\Readability;
-use \andreskrey\Readability\Configuration;
+use \fivefilters\Readability\Readability;
+use \fivefilters\Readability\Configuration;
class Af_Readability extends Plugin {
diff --git a/plugins/af_readability/vendor/composer/InstalledVersions.php b/plugins/af_readability/vendor/composer/InstalledVersions.php
index eb57e7a7e..8b617d5ba 100644
--- a/plugins/af_readability/vendor/composer/InstalledVersions.php
+++ b/plugins/af_readability/vendor/composer/InstalledVersions.php
@@ -23,41 +23,88 @@ use Composer\Semver\VersionParser;
class InstalledVersions
{
private static $installed = array (
- 'root' =>
+ 'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'aliases' =>
+ 'aliases' =>
array (
),
- 'reference' => 'a73e3bec45c5523910c711cf882976b71781ac9e',
+ 'reference' => 'a8b0bce008e23f9c47bf1f4de4d8e6886435071e',
'name' => '__root__',
),
- 'versions' =>
+ 'versions' =>
array (
- '__root__' =>
+ '__root__' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
- 'aliases' =>
+ 'aliases' =>
array (
),
- 'reference' => 'a73e3bec45c5523910c711cf882976b71781ac9e',
+ 'reference' => 'a8b0bce008e23f9c47bf1f4de4d8e6886435071e',
),
- 'fivefilters/readability.php' =>
+ 'fivefilters/readability.php' =>
array (
- 'pretty_version' => 'v2.1.0',
- 'version' => '2.1.0.0',
- 'aliases' =>
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '9999999-dev',
+ ),
+ 'reference' => '8ac5abdd497b37d2be4833bcf18d6819bba4d9c9',
+ ),
+ 'league/uri' =>
+ array (
+ 'pretty_version' => '6.7.1',
+ 'version' => '6.7.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2d7c87a0860f3126a39f44a8a9bf2fed402dcfea',
+ ),
+ 'league/uri-interfaces' =>
+ array (
+ 'pretty_version' => '2.3.0',
+ 'version' => '2.3.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
+ ),
+ 'masterminds/html5' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '2.7.x-dev',
+ ),
+ 'reference' => '1e0033a694ce576deba7c59c1da56c76e9e42109',
+ ),
+ 'psr/http-factory' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
+ ),
+ 'psr/http-message' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'aliases' =>
array (
),
- 'reference' => '7617a912b6c527909168f5d41d263792f171c42a',
+ 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
),
- 'psr/log' =>
+ 'psr/log' =>
array (
'pretty_version' => '1.1.4',
'version' => '1.1.4.0',
- 'aliases' =>
+ 'aliases' =>
array (
),
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
@@ -285,6 +332,7 @@ class InstalledVersions
$installed = array();
if (self::$canGetVendors) {
+ // @phpstan-ignore-next-line
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
diff --git a/plugins/af_readability/vendor/composer/autoload_psr4.php b/plugins/af_readability/vendor/composer/autoload_psr4.php
index 3efe88013..bda58c36e 100644
--- a/plugins/af_readability/vendor/composer/autoload_psr4.php
+++ b/plugins/af_readability/vendor/composer/autoload_psr4.php
@@ -6,6 +6,9 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
- 'andreskrey\\Readability\\' => array($vendorDir . '/fivefilters/readability.php/src'),
+ 'fivefilters\\Readability\\' => array($vendorDir . '/fivefilters/readability.php/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
+ 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'),
+ 'League\\Uri\\' => array($vendorDir . '/league/uri/src', $vendorDir . '/league/uri-interfaces/src'),
);
diff --git a/plugins/af_readability/vendor/composer/autoload_static.php b/plugins/af_readability/vendor/composer/autoload_static.php
index 0f4e7a4b9..a21b92886 100644
--- a/plugins/af_readability/vendor/composer/autoload_static.php
+++ b/plugins/af_readability/vendor/composer/autoload_static.php
@@ -7,18 +7,27 @@ namespace Composer\Autoload;
class ComposerStaticInitb44cc79a0eaef9cd9c2f2ac697cbe9c0
{
public static $prefixLengthsPsr4 = array (
- 'a' =>
+ 'f' =>
array (
- 'andreskrey\\Readability\\' => 23,
+ 'fivefilters\\Readability\\' => 24,
),
'P' =>
array (
'Psr\\Log\\' => 8,
+ 'Psr\\Http\\Message\\' => 17,
+ ),
+ 'M' =>
+ array (
+ 'Masterminds\\' => 12,
+ ),
+ 'L' =>
+ array (
+ 'League\\Uri\\' => 11,
),
);
public static $prefixDirsPsr4 = array (
- 'andreskrey\\Readability\\' =>
+ 'fivefilters\\Readability\\' =>
array (
0 => __DIR__ . '/..' . '/fivefilters/readability.php/src',
),
@@ -26,6 +35,20 @@ class ComposerStaticInitb44cc79a0eaef9cd9c2f2ac697cbe9c0
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
+ 'Psr\\Http\\Message\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-factory/src',
+ 1 => __DIR__ . '/..' . '/psr/http-message/src',
+ ),
+ 'Masterminds\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/masterminds/html5/src',
+ ),
+ 'League\\Uri\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/uri/src',
+ 1 => __DIR__ . '/..' . '/league/uri-interfaces/src',
+ ),
);
public static $classMap = array (
diff --git a/plugins/af_readability/vendor/composer/installed.json b/plugins/af_readability/vendor/composer/installed.json
index 916a0b1d9..9ce492622 100644
--- a/plugins/af_readability/vendor/composer/installed.json
+++ b/plugins/af_readability/vendor/composer/installed.json
@@ -2,42 +2,43 @@
"packages": [
{
"name": "fivefilters/readability.php",
- "version": "v2.1.0",
- "version_normalized": "2.1.0.0",
+ "version": "dev-master",
+ "version_normalized": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/fivefilters/readability.php.git",
- "reference": "7617a912b6c527909168f5d41d263792f171c42a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/fivefilters/readability.php/zipball/7617a912b6c527909168f5d41d263792f171c42a",
- "reference": "7617a912b6c527909168f5d41d263792f171c42a",
- "shasum": ""
+ "url": "https://dev.tt-rss.org/fox/readability-php.git",
+ "reference": "8ac5abdd497b37d2be4833bcf18d6819bba4d9c9"
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
"ext-xml": "*",
- "php": ">=7.0.0",
+ "league/uri": "^6.4",
+ "masterminds/html5": "2.7.x-dev@dev",
+ "php": ">=7.3.0",
"psr/log": "^1.0"
},
"require-dev": {
- "monolog/monolog": "^1.24",
- "phpunit/phpunit": "^6.5"
+ "monolog/monolog": "^2.3",
+ "phpunit/phpunit": "^9"
},
"suggest": {
"monolog/monolog": "Allow logging debug information"
},
- "time": "2019-07-22T21:42:25+00:00",
+ "time": "2022-07-31T06:02:47+00:00",
+ "default-branch": true,
"type": "library",
- "installation-source": "dist",
+ "installation-source": "source",
"autoload": {
"psr-4": {
- "andreskrey\\Readability\\": "src/"
+ "fivefilters\\Readability\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "fivefilters\\Readability\\Test\\": "test"
}
},
- "notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
@@ -45,19 +46,379 @@
{
"name": "Andres Rey",
"email": "[email protected]",
- "role": "Lead Developer"
+ "role": "Original Developer"
+ },
+ {
+ "name": "Keyvan Minoukadeh",
+ "email": "[email protected]",
+ "homepage": "https://www.fivefilters.org",
+ "role": "Developer/Maintainer"
}
],
"description": "A PHP port of Readability.js",
- "homepage": "https://github.com/andreskrey/readability",
+ "homepage": "https://github.com/fivefilters/readability.php",
"keywords": [
"html",
"readability"
],
+ "install-path": "../fivefilters/readability.php"
+ },
+ {
+ "name": "league/uri",
+ "version": "6.7.1",
+ "version_normalized": "6.7.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/2d7c87a0860f3126a39f44a8a9bf2fed402dcfea",
+ "reference": "2d7c87a0860f3126a39f44a8a9bf2fed402dcfea",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "league/uri-interfaces": "^2.3",
+ "php": "^7.4 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v3.3.2",
+ "nyholm/psr7": "^1.5",
+ "php-http/psr7-integration-tests": "^1.1",
+ "phpstan/phpstan": "^1.2.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0.0",
+ "phpstan/phpstan-strict-rules": "^1.1.0",
+ "phpunit/phpunit": "^9.5.10",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "ext-intl": "Needed to improve host validation",
+ "league/uri-components": "Needed to easily manipulate URI objects",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "time": "2022-06-29T09:48:18+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "[email protected]",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
"support": {
- "source": "https://github.com/fivefilters/readability.php/tree/v2.1.0"
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri/issues",
+ "source": "https://github.com/thephpleague/uri/tree/6.7.1"
},
- "install-path": "../fivefilters/readability.php"
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "install-path": "../league/uri"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "2.3.0",
+ "version_normalized": "2.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ },
+ "time": "2021-06-28T04:27:21+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "[email protected]",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interface for URI representation",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "keywords": [
+ "rfc3986",
+ "rfc3987",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/uri-interfaces/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "install-path": "../league/uri-interfaces"
+ },
+ {
+ "name": "masterminds/html5",
+ "version": "dev-master",
+ "version_normalized": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://dev.tt-rss.org/fox/html5-php.git",
+ "reference": "1e0033a694ce576deba7c59c1da56c76e9e42109"
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7"
+ },
+ "time": "2022-07-31T06:41:22+00:00",
+ "default-branch": true,
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "source",
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Masterminds\\HTML5\\Tests\\": "test/HTML5"
+ }
+ },
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "[email protected]"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "dom",
+ "html",
+ "html5",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ],
+ "install-path": "../masterminds/html5"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "time": "2019-04-30T12:38:16+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/master"
+ },
+ "install-path": "../psr/http-factory"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-08-06T14:39:51+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
+ "install-path": "../psr/http-message"
},
{
"name": "psr/log",
diff --git a/plugins/af_readability/vendor/composer/installed.php b/plugins/af_readability/vendor/composer/installed.php
index 64d46147e..48ffae0d7 100644
--- a/plugins/af_readability/vendor/composer/installed.php
+++ b/plugins/af_readability/vendor/composer/installed.php
@@ -6,7 +6,7 @@
'aliases' =>
array (
),
- 'reference' => 'a73e3bec45c5523910c711cf882976b71781ac9e',
+ 'reference' => 'a8b0bce008e23f9c47bf1f4de4d8e6886435071e',
'name' => '__root__',
),
'versions' =>
@@ -18,16 +18,63 @@
'aliases' =>
array (
),
- 'reference' => 'a73e3bec45c5523910c711cf882976b71781ac9e',
+ 'reference' => 'a8b0bce008e23f9c47bf1f4de4d8e6886435071e',
),
'fivefilters/readability.php' =>
array (
- 'pretty_version' => 'v2.1.0',
- 'version' => '2.1.0.0',
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '9999999-dev',
+ ),
+ 'reference' => '8ac5abdd497b37d2be4833bcf18d6819bba4d9c9',
+ ),
+ 'league/uri' =>
+ array (
+ 'pretty_version' => '6.7.1',
+ 'version' => '6.7.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2d7c87a0860f3126a39f44a8a9bf2fed402dcfea',
+ ),
+ 'league/uri-interfaces' =>
+ array (
+ 'pretty_version' => '2.3.0',
+ 'version' => '2.3.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
+ ),
+ 'masterminds/html5' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '2.7.x-dev',
+ ),
+ 'reference' => '1e0033a694ce576deba7c59c1da56c76e9e42109',
+ ),
+ 'psr/http-factory' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
+ ),
+ 'psr/http-message' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
'aliases' =>
array (
),
- 'reference' => '7617a912b6c527909168f5d41d263792f171c42a',
+ 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
),
'psr/log' =>
array (
diff --git a/plugins/af_readability/vendor/composer/platform_check.php b/plugins/af_readability/vendor/composer/platform_check.php
index f79e574be..580fa9609 100644
--- a/plugins/af_readability/vendor/composer/platform_check.php
+++ b/plugins/af_readability/vendor/composer/platform_check.php
@@ -4,8 +4,8 @@
$issues = array();
-if (!(PHP_VERSION_ID >= 70000)) {
- $issues[] = 'Your Composer dependencies require a PHP version ">= 7.0.0". You are running ' . PHP_VERSION . '.';
+if (!(PHP_VERSION_ID >= 70400)) {
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
}
if ($issues) {
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml
deleted file mode 100644
index 18e6b2054..000000000
--- a/plugins/af_readability/vendor/fivefilters/readability.php/.coveralls.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-coverage_clover: test/clover.xml
-json_path: test/coveralls-upload.json
-service_name: travis-ci \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes b/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes
index ea4dd8899..c08d816c2 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/.gitattributes
@@ -1 +1,2 @@
-test/* linguist-language=PHP \ No newline at end of file
+test/* linguist-language=PHP
+* text=auto eol=lf \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.github/workflows/main.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.github/workflows/main.yml
new file mode 100644
index 000000000..3682e6434
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/.github/workflows/main.yml
@@ -0,0 +1,42 @@
+# This is a basic workflow to help you get started with Actions
+
+name: CI
+
+# Controls when the workflow will run
+on:
+ # Triggers the workflow on push or pull request events but only for the master branch
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "build"
+ build:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ php: ['7.3', '7.4', '8']
+ libxml: ['2.9.4', '2.9.5', '2.9.10', '2.9.12']
+
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v2
+
+ # Runs a single command using the runners shell
+ #- name: Run a one-line script
+ # run: echo Hello, world!
+
+ # Runs a set of commands using the runners shell
+ - name: Run a multi-line script
+ run: |
+ composer install
+ docker build --build-arg PHP_VERSION=${{matrix.php}} --build-arg LIBXML_VERSION=${{matrix.libxml}} -t gh-action - < ./docker/php/Dockerfile
+ docker run --volume $PWD:/app --workdir="/app" --env XDEBUG_MODE=coverage gh-action php ./vendor/bin/phpunit --coverage-clover /app/test/clover.xml
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore b/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore
index 5608600f8..52b9f385e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/.gitignore
@@ -1,4 +1,5 @@
.idea/
vendor
composer.lock
-/test.* \ No newline at end of file
+/test.*
+/test/changed/ \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml
deleted file mode 100644
index f5ddf3ed9..000000000
--- a/plugins/af_readability/vendor/fivefilters/readability.php/.styleci.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-preset: recommended
-
-enabled:
- - concat_with_spaces
- - unalign_double_arrow
-
-disabled:
- - concat_without_spaces
- - align_double_arrow
- - simplified_null_return
- - cast_spaces
- - trailing_comma_in_multiline_array
- - phpdoc_align \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml b/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml
deleted file mode 100644
index 5c3bdd198..000000000
--- a/plugins/af_readability/vendor/fivefilters/readability.php/.travis.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-language: bash
-services: docker
-
-env:
- matrix:
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.9
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.8
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.7
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.6
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.5
- - PHP_VERSION=7.3 LIBXML_VERSION=2.9.4
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.9
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.8
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.7
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.6
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.5
- - PHP_VERSION=7.2 LIBXML_VERSION=2.9.4
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.9
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.8
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.7
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.6
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.5
- - PHP_VERSION=7.1 LIBXML_VERSION=2.9.4
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.9
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.8
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.7
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.6
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.5
- - PHP_VERSION=7.0 LIBXML_VERSION=2.9.4
-
-matrix:
- allow_failures:
- - env: LIBXML_VERSION=2.9.9
- - env: LIBXML_VERSION=2.9.8
- - env: LIBXML_VERSION=2.9.7
- - env: LIBXML_VERSION=2.9.6
- - env: LIBXML_VERSION=2.9.5
-
-install:
- - docker run --rm --volume $PWD:/app --workdir="/app" composer install
-
-script:
- - docker build --build-arg PHP_VERSION=${PHP_VERSION} --build-arg LIBXML_VERSION=${LIBXML_VERSION} -t travis-build - < ./docker/php/Dockerfile
- - docker run --volume $PWD:/app --workdir="/app" travis-build php ./vendor/bin/phpunit --coverage-clover /app/test/clover.xml
-
-after_script:
- - docker run --volume $PWD:/app --workdir="/app" composer require php-coveralls/php-coveralls:^2.0
- - docker run --volume $PWD:/app --workdir="/app" --env TRAVIS=${TRAVIS} --env TRAVIS_JOB_ID=${TRAVIS_JOB_ID} travis-build php ./vendor/php-coveralls/php-coveralls/bin/php-coveralls -v
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md b/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md
index cc420e3a8..fabdb5a52 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/AUTHORS.md
@@ -11,3 +11,4 @@ The AUTHORS/Contributors are (and/or have been):
* Sergiy Lavryk
* Pedro Amorim
* Malu Decks
+* Keyvan Minoukadeh
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md b/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md
index 345f71565..208083215 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/CONTRIBUTING.md
@@ -2,8 +2,9 @@
Contributions are **welcome** and will be fully **credited**.
-We accept contributions via Pull Requests on [Github](https://github.com/andreskrey/readability.php/).
+When it comes to the core article-extraction functionality, please contribute to [Mozilla's Readability](https://github.com/mozilla/readability/) repository, as we're trying to mirror that here.
+For anything else, we accept contributions via Pull Requests on [Github](https://github.com/fivefilters/readability.php/).
## Pull Requests
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/Makefile b/plugins/af_readability/vendor/fivefilters/readability.php/Makefile
index b3bf15040..c5123f171 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/Makefile
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/Makefile
@@ -1,28 +1,25 @@
.PHONY: test-all
-test-all: start test-7.3 test-7.2 test-7.1 test-7.0 stop
+test-all: start test-7.3 test-7.4 test-8 stop
test-7.3:
- docker-compose exec php-7.3-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
+ docker-compose exec php-7.3-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
-test-7.2:
- docker-compose exec php-7.2-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
+test-7.4:
+ docker-compose exec php-7.4-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
-test-7.1:
- docker-compose exec php-7.1-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
-
-test-7.0:
- docker-compose exec php-7.0-libxml-2.9.9 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
+test-8:
+ docker-compose exec php-8-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
start:
- docker-compose up -d php-7.3-libxml-2.9.9 php-7.2-libxml-2.9.9 php-7.1-libxml-2.9.9 php-7.0-libxml-2.9.9
+ docker-compose up -d php-7.3-libxml-2.9.10 php-7.4-libxml-2.9.10 php-8-libxml-2.9.10
stop:
docker-compose stop
test-all-versions:
- for php_version in 7.0 7.1 7.2 7.3; do \
- for libxml_version in 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9; do \
+ for php_version in 7.3 7.4 8; do \
+ for libxml_version in 2.9.4 2.9.5 2.9.10 2.9.12; do \
docker-compose up -d php-$$php_version-libxml-$$libxml_version; \
docker-compose exec php-$$php_version-libxml-$$libxml_version php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml; \
done \
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/README.md b/plugins/af_readability/vendor/fivefilters/readability.php/README.md
index b6b1e2922..c910714a3 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/README.md
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/README.md
@@ -1,32 +1,51 @@
# Readability.php
-[![Latest Stable Version](https://poser.pugx.org/andreskrey/readability.php/v/stable)](https://packagist.org/packages/andreskrey/readability.php) [![Build Status](https://travis-ci.org/andreskrey/readability.php.svg?branch=master)](https://travis-ci.org/andreskrey/readability.php) [![Coverage Status](https://coveralls.io/repos/github/andreskrey/readability.php/badge.svg?branch=master)](https://coveralls.io/github/andreskrey/readability.php/?branch=master) [![StyleCI](https://styleci.io/repos/71042668/shield?branch=master)](https://styleci.io/repos/71042668) [![Total Downloads](https://poser.pugx.org/andreskrey/readability.php/downloads)](https://packagist.org/packages/andreskrey/readability.php) [![Monthly Downloads](https://poser.pugx.org/andreskrey/readability.php/d/monthly)](https://packagist.org/packages/andreskrey/readability.php)
+
+## News (August 2021)
+
+Andres Rey, the [original developer](https://github.com/andreskrey/readability.php) of Readability.php has kindly let us take over maintenance and development of the project.
+
+Please bear with us while we catch up with [Readability.js](https://github.com/mozilla/readability) changes. There'll be a new release (3.0.0) when we're ready.
+
+For the changes we've made so far in this repository, please see our [blog post](https://www.fivefilters.org/2021/readability/).
+
+## About
+
+[![Latest Stable Version](https://poser.pugx.org/fivefilters/readability.php/v/stable)](https://packagist.org/packages/fivefilters/readability.php) [![Tests](https://github.com/fivefilters/readability.php/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/fivefilters/readability.php/actions/workflows/main.yml)
PHP port of *Mozilla's* **[Readability.js](https://github.com/mozilla/readability)**. Parses html text (usually news and other articles) and returns **title**, **author**, **main image** and **text content** without nav bars, ads, footers, or anything that isn't the main body of the text. Analyzes each node, gives them a score, and determines what's relevant and what can be discarded.
-![Screenshot](https://raw.githubusercontent.com/andreskrey/readability.php/assets/screenshot.png)
+![Screenshot](https://raw.githubusercontent.com/fivefilters/readability.php/assets/screenshot.png)
The project aim is to be a 1 to 1 port of Mozilla's version and to follow closely all changes introduced there, but there are some major differences on the structure. Most of the code is a 1:1 copy –even the comments were imported– but some functions and structures were adapted to suit better the PHP language.
-**Lead Developer**: Andres Rey
+**Original Developer**: Andres Rey
+
+**Developer/Maintainer**: FiveFilters.org
+
+## Code porting
+
+Master branch - Up to date on 26 August 2021, with the exception of a [piece of code](https://github.com/fivefilters/readability.php/commit/1c662465bded2ab3acf3b975a1315c8c45f0bf73#diff-b9b31807b1a39caec18ddc293e9c52931ba8b55191c61e6b77a623d699a599ffR1899) which doesn't produce the same results in PHP for us compard to the JS version. Perhaps there's an error, or some difference in the underlying code that affects this. If you know what's wrong, please feel free to drop us a note or submit a pull request. :)
+
+Version 2.1.0 - Up to date with Readability.js up to [19 Nov 2018](https://github.com/mozilla/readability/commit/876c81f710711ba2afb36dd83889d4c5b4fc2743).
## Requirements
-PHP 7.0+, ext-dom, ext-xml, and ext-mbstring. To install all this dependencies (in the rare case your system does not have them already), you could try something like this in *nix like environments:
+PHP 7.3+, ext-dom, ext-xml, and ext-mbstring. To install these dependencies (in the rare case your system does not have them already), you could try something like this in *nix like environments:
-`$ sudo apt-get install php7.1-xml php7.1-mbstring`
+`$ sudo apt-get install php7.4-xml php7.4-mbstring`
## How to use it
First you have to require the library using composer:
-`composer require andreskrey/readability.php`
+`composer require fivefilters/readability.php`
Then, create a Readability class and pass a Configuration class, feed the `parse()` function with your HTML and echo the variable:
```php
-use andreskrey\Readability\Readability;
-use andreskrey\Readability\Configuration;
-use andreskrey\Readability\ParseException;
+use fivefilters\Readability\Readability;
+use fivefilters\Readability\Configuration;
+use fivefilters\Readability\ParseException;
$readability = new Readability(new Configuration());
@@ -86,7 +105,7 @@ $configuration = new Configuration([
Then you pass this Configuration object to Readability. The following options are available. Remember to prepend `set` when calling them using native setters.
- **MaxTopCandidates**: default value `5`, max amount of top level candidates.
-- **WordThreshold**: default value `500`, minimum amount of characters to consider that the article was parsed successful.
+- **CharThreshold**: default value `500`, minimum amount of characters to consider that the article was parsed successful.
- **ArticleByLine**: default value `false`, search for the article byline and remove it from the text. It will be moved to the article metadata.
- **StripUnlikelyCandidates**: default value `true`, remove nodes that are unlikely to have relevant information. Useful for debugging or parsing complex or non-standard articles.
- **CleanConditionally**: default value `true`, remove certain nodes after parsing to return a cleaner result.
@@ -95,13 +114,15 @@ Then you pass this Configuration object to Readability. The following options ar
- **SubstituteEntities**: default value `false`, disables the `substituteEntities` flag of libxml. Will avoid substituting HTML entities. Like `&aacute;` to á.
- **NormalizeEntities**: default value `false`, converts UTF-8 characters to its HTML Entity equivalent. Useful to parse HTML with mixed encoding.
- **OriginalURL**: default value `http://fakehost`, original URL from the article used to fix relative URLs.
-- **SummonCthulhu**: default value `false`, remove all `<script>` nodes via regex. This is not ideal as it might break things, but might be the only solution to [libxml problems with unescaped javascript](https://github.com/andreskrey/readability.php#known-issues). If you're not parsing Javascript tutorials, it's recommended to always set this option as `true`.
+- **KeepClasses**: default value `false`, which removes all `class="..."` attribute values from HTML elements.
+- **Parser**: default value `html5`, which uses HTML5-PHP for parsing. Set to `libxml` to use that instead (not recommended for modern HTML documents).
+- **SummonCthulhu**: default value `false`, remove all `<script>` nodes via regex. This is not ideal as it might break things, but if you've set the parser to libxml (see above), it might be the only solution to [libxml problems with unescaped javascript](https://github.com/fivefilters/readability.php#known-libxml-parsing-issues).
### Debug log
Logging is optional and you will have to inject your own logger to save all the debugging messages. To do so, use a logger that implements the [PSR-3 logging interface](https://github.com/php-fig/log) and pass it to the configuration object. For example:
-```
+```php
// Using monolog
$log = new Logger('Readability');
@@ -116,7 +137,9 @@ In the log you will find information about the parsed nodes, why they were remov
Of course the main limitation is PHP. Websites that load the content through lazy loading, AJAX, or any type of javascript fueled call will be ignored (actually, *not ran*) and the resulting text will be incorrect, compared to the readability.js results. All the articles you want to parse with readability.php need to be complete and all the content should be in the HTML already.
-## Known Issues
+## Known libxml parsing issues
+
+Readability.php as of version 3.0.0 uses a HTML5 parser. Earlier versions used libxml. The issues below apply to libxml parsing, so if you're using an earlier version of Readability.php (pre 3.0.0), or if you've set the parser to libxml in the configuration, read on...
### Javascript spilling into the text body
@@ -153,7 +176,11 @@ Self closing tags like `<br />` get automatically expanded to `<br></br`. No way
## Dependencies
-Readability.php uses the [PSR Log](https://github.com/php-fig/log) interface to define the allowed type of loggers. [Monolog](https://github.com/Seldaek/monolog) is only required on development installations. (`--dev` option during `composer install`).
+Readability.php uses
+
+ * [HTML5-PHP](https://github.com/Masterminds/html5-php) to parse and serialise HTML.
+ * [PSR Log](https://github.com/php-fig/log) interface to define the allowed type of loggers.
+ * [Monolog](https://github.com/Seldaek/monolog) is only required on development installations. (`--dev` option during `composer install`).
## To-do
@@ -165,21 +192,44 @@ Readability.php uses the [PSR Log](https://github.com/php-fig/log) interface to
Readability parses all the text with DOMDocument, scans the text nodes and gives the a score, based on the amount of words, links and type of element. Then it selects the highest scoring element and creates a new DOMDocument with all its siblings. Each sibling is scored to discard useless elements, like nav bars, empty nodes, etc.
+## Security
+
+If you're going to use Readability with untrusted input (whether in HTML or DOM form), we **strongly** recommend you use a sanitizer library like [HTML Purifier](https://github.com/ezyang/htmlpurifier) to avoid script injection when you use
+the output of Readability. We would also recommend using [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to add further defense-in-depth
+restrictions to what you allow the resulting content to do. The Firefox integration of
+reader mode uses both of these techniques itself. Sanitizing unsafe content out of the input is explicitly not something we aim to do as part of Readability itself - there are other good sanitizer libraries out there, use them!
+
## Testing
-Any version of PHP installed locally should be enough to develop new features and add new test cases. If you want to be 100% sure that your change doesn't create any issues with other versions of PHP, you can use the provided Docker containers to test currently in 7.0, 7.1, and 7.2.
+Any version of PHP from 7.3 and above installed locally should be enough to develop new features and add new test cases. If you want to be 100% sure that your change doesn't create any issues with other versions of PHP, you can use the provided Docker containers to test currently in 7.3, 7.4, and 8.0.
-You'll need Docker and Docker Compose for this. To run all the tests in all the available versions just type the following command:
+You'll need Docker and Docker Compose for this. To run all the tests in the three PHP versions above, just type the following command:
```bash
make test-all
```
-This will start all the containers and run all the tests on every supported version of PHP. If you want to test against a specific version, you can use `make test-7.0`, `make test-7.1`, or `make test-7.2`.
+This will start all the containers and run all the tests on every supported version of PHP. If you want to test against a specific version, you can use `make test-7.3`, `make test-7.4`, or `make test-8`.
-## Code porting
+### Different versions of libxml
+
+If you want to test against supported versions of PHP *AND* multiple versions of libxml, run `test-all-versions`. This will test against PHP versions 7.3 to 8 and libxml versions 2.9.4, 2.9.5, 2.9.10, and 2.9.12. Normally you won't need to do this unless you think you've found a bug on an specific version of libxml.
+
+### Updating the expected tests
+
+If you've made an improvement to the code, you'll probably want to examine the Readability.php output for the test cases here. To do that, run the following command first from the root of the project folder:
+
+ docker-compose up -d php-7.4-libxml-2.9.10
+
+You should now have a docker image running with the project root folder mapped to /app/ on your Docker instance (see `docker-compose.yml`). Any changes to these files will be accessible from the Docker instance from now on.
+
+Next, create a folder in tests/ called /changed, then run the following command to run the test suite:
+
+ docker-compose exec -e output-changes=1 -e output-diff=1 php-7.4-libxml-2.9.10 php /app/vendor/phpunit/phpunit/phpunit --configuration /app/phpunit.xml
+
+The two environment variables (`output-changes=1` and `output-diff=1`) will result in new output for any failing test (along with a diff of changes) being written to the changed/ folder.
-Up to date with readability.js as of [19 Nov 2018](https://github.com/mozilla/readability/commit/876c81f710711ba2afb36dd83889d4c5b4fc2743).
+If you're happy the changes are okay, set `output-diff=0` and the diff files will no longer be written, making it easier to copy the new expected output files over to their corresponding locations in test-pages\.
## License
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/composer.json b/plugins/af_readability/vendor/fivefilters/readability.php/composer.json
index bf515682c..72706cca6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/composer.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/composer.json
@@ -1,35 +1,50 @@
{
- "name": "andreskrey/readability.php",
+ "name": "fivefilters/readability.php",
"type": "library",
"description": "A PHP port of Readability.js",
"keywords": ["readability", "html"],
- "homepage": "https://github.com/andreskrey/readability",
+ "homepage": "https://github.com/fivefilters/readability.php",
"license": "Apache-2.0",
+ "repositories": [
+ {
+ "name": "masterminds/html5",
+ "type": "vcs",
+ "url": "https://dev.tt-rss.org/fox/html5-php.git"
+ }
+ ],
"authors": [
{
"name": "Andres Rey",
"email": "[email protected]",
- "role": "Lead Developer"
+ "role": "Original Developer"
+ },
+ {
+ "name": "Keyvan Minoukadeh",
+ "email": "[email protected]",
+ "homepage": "https://www.fivefilters.org",
+ "role": "Developer/Maintainer"
}
],
"autoload": {
"psr-4": {
- "andreskrey\\Readability\\": "src/"
+ "fivefilters\\Readability\\": "src/"
}
},
"autoload-dev": {
- "psr-4": {"andreskrey\\Readability\\Test\\": "test"}
+ "psr-4": {"fivefilters\\Readability\\Test\\": "test"}
},
"require": {
- "php": ">=7.0.0",
+ "php": ">=7.3.0",
"ext-dom": "*",
"ext-xml": "*",
"ext-mbstring": "*",
- "psr/log": "^1.0"
+ "psr/log": "^1.0",
+ "masterminds/html5": "2.7.x-dev@dev",
+ "league/uri": "^6.4"
},
"require-dev": {
- "phpunit/phpunit": "^6.5",
- "monolog/monolog": "^1.24"
+ "phpunit/phpunit": "^9",
+ "monolog/monolog": "^2.3"
},
"suggest": {
"monolog/monolog": "Allow logging debug information"
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/docker-compose.yml b/plugins/af_readability/vendor/fivefilters/readability.php/docker-compose.yml
index e58b1b0bf..d26a5af74 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/docker-compose.yml
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/docker-compose.yml
@@ -1,196 +1,100 @@
version: '3'
services:
- php-7.0-libxml-2.9.4: &template
+ php-7.3-libxml-2.9.4: &template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.4
- PHP_VERSION: 7.0
+ PHP_VERSION: 7.3
volumes:
- ./:/app
tty: true
- php-7.0-libxml-2.9.5:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.5
- PHP_VERSION: 7.0
-
- php-7.0-libxml-2.9.6:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.6
- PHP_VERSION: 7.0
-
- php-7.0-libxml-2.9.7:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.7
- PHP_VERSION: 7.0
-
- php-7.0-libxml-2.9.8:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.8
- PHP_VERSION: 7.0
-
- php-7.0-libxml-2.9.9:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.9
- PHP_VERSION: 7.0
-
- php-7.1-libxml-2.9.4:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.4
- PHP_VERSION: 7.1
-
- php-7.1-libxml-2.9.5:
+ php-7.3-libxml-2.9.5:
<<: *template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.5
- PHP_VERSION: 7.1
-
- php-7.1-libxml-2.9.6:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.6
- PHP_VERSION: 7.1
-
- php-7.1-libxml-2.9.7:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.7
- PHP_VERSION: 7.1
+ PHP_VERSION: 7.3
- php-7.1-libxml-2.9.8:
+ php-7.3-libxml-2.9.10:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.8
- PHP_VERSION: 7.1
+ LIBXML_VERSION: 2.9.10
+ PHP_VERSION: 7.3
- php-7.1-libxml-2.9.9:
+ php-7.3-libxml-2.9.12:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.9
- PHP_VERSION: 7.1
+ LIBXML_VERSION: 2.9.12
+ PHP_VERSION: 7.3
- php-7.2-libxml-2.9.4:
+ php-7.4-libxml-2.9.4:
<<: *template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.4
- PHP_VERSION: 7.2
+ PHP_VERSION: 7.4
- php-7.2-libxml-2.9.5:
+ php-7.4-libxml-2.9.5:
<<: *template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.5
- PHP_VERSION: 7.2
+ PHP_VERSION: 7.4
- php-7.2-libxml-2.9.6:
+ php-7.4-libxml-2.9.10:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.6
- PHP_VERSION: 7.2
+ LIBXML_VERSION: 2.9.10
+ PHP_VERSION: 7.4
- php-7.2-libxml-2.9.7:
+ php-7.4-libxml-2.9.12:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.7
- PHP_VERSION: 7.2
+ LIBXML_VERSION: 2.9.12
+ PHP_VERSION: 7.4
- php-7.2-libxml-2.9.8:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.8
- PHP_VERSION: 7.2
-
- php-7.2-libxml-2.9.9:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.9
- PHP_VERSION: 7.2
-
- php-7.3-libxml-2.9.4:
+ php-8-libxml-2.9.4:
<<: *template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.4
- PHP_VERSION: 7.3
+ PHP_VERSION: 8
- php-7.3-libxml-2.9.5:
+ php-8-libxml-2.9.5:
<<: *template
build:
context: ./docker/php
args:
LIBXML_VERSION: 2.9.5
- PHP_VERSION: 7.3
-
- php-7.3-libxml-2.9.6:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.6
- PHP_VERSION: 7.3
+ PHP_VERSION: 8
- php-7.3-libxml-2.9.7:
+ php-8-libxml-2.9.10:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.7
- PHP_VERSION: 7.3
+ LIBXML_VERSION: 2.9.10
+ PHP_VERSION: 8
- php-7.3-libxml-2.9.8:
+ php-8-libxml-2.9.12:
<<: *template
build:
context: ./docker/php
args:
- LIBXML_VERSION: 2.9.8
- PHP_VERSION: 7.3
-
- php-7.3-libxml-2.9.9:
- <<: *template
- build:
- context: ./docker/php
- args:
- LIBXML_VERSION: 2.9.9
- PHP_VERSION: 7.3
+ LIBXML_VERSION: 2.9.12
+ PHP_VERSION: 8
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/Dockerfile b/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/Dockerfile
index 8971d1f1b..e19a366cb 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/Dockerfile
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/Dockerfile
@@ -1,8 +1,16 @@
+# Load pre-built image of PHP (php-cli) and libxml.
+# See https://hub.docker.com/r/fivefilters/php-libxml for supported versions
+# Use build.Dockerfile to compile new versions of PHP/libxml
+
+# For reference, default package versions for Ubuntu are:
+# Ubuntu 18.04 - php 7.2, libxml 2.9.4
+# Ubuntu 20.04 - php 7.4, libxml 2.9.10
+# Ubuntu 20.10 - php 7.4, libxml 2.9.10
+# Ubuntu 21.04 - php 7.4, libxml 2.9.10
+# Ubuntu 21.10 - php 8.0, libxml 2.9.10
+
ARG PHP_VERSION
ARG LIBXML_VERSION
-FROM andreskrey/php-${PHP_VERSION}:libxml-${LIBXML_VERSION}
-
-RUN pecl install xdebug && docker-php-ext-enable xdebug
+FROM fivefilters/php-libxml:php-${PHP_VERSION}-libxml-${LIBXML_VERSION}
-# Required by coveralls
-RUN apt-get install git -y
+RUN apt-get update \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/build.Dockerfile b/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/build.Dockerfile
new file mode 100644
index 000000000..270b6d99a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/docker/php/build.Dockerfile
@@ -0,0 +1,56 @@
+# Use this file to build a Docker image using the versions of PHP and Libxml specified.
+# We have pre-built images at https://hub.docker.com/r/fivefilters/php-libxml which are faster to load than building from this file.
+# To build using this file, use the following command from the root project folder (replace version of PHP/Libxml with the ones you want to use):
+# docker build --build-arg PHP_VERSION=7.4 --build-arg LIBXML_VERSION=2.9.12 -t php-libxml -f ./docker/php/Dockerfile .
+
+# To upload the image to Docker Hub, the tag (-t) value should be something like org/repo:tag, e.g. for us, fivefilters/php-libxml:php-8-libxml-2.9.12
+# The tag can be applied afterwards too, e.g. docker tag php-libxml org/repo:tag
+
+ARG PHP_VERSION=8
+FROM php:${PHP_VERSION}-cli
+
+# Install sqlite and libonig-dev (required for building PHP 7.4)
+RUN apt-get update && apt-get install -y libsqlite3-dev libonig-dev
+# Install libsodium (package doesn't work for some reason)
+RUN curl https://download.libsodium.org/libsodium/releases/LATEST.tar.gz -o /tmp/libsodium.tar.gz && \
+ cd /tmp && \
+ tar -xzf libsodium.tar.gz && \
+ cd libsodium-stable/ && \
+ ./configure && \
+ make && make check && \
+ make install
+# Install custom version of libxml2
+RUN apt-get install -y automake libtool unzip libssl-dev
+# Remove current version
+RUN apt-get remove -y libxml2
+# Download new version, configure and compile
+ARG LIBXML_VERSION=2.9.12
+RUN curl https://gitlab.gnome.org/GNOME/libxml2/-/archive/v$LIBXML_VERSION/libxml2-v$LIBXML_VERSION.zip -o /tmp/libxml.zip && \
+ cd /tmp && \
+ unzip libxml.zip && \
+ cd libxml2-v$LIBXML_VERSION && \
+ ./autogen.sh --libdir=/usr/lib/x86_64-linux-gnu && \
+ make && \
+ make install
+# Recompile PHP with the new libxml2 library
+RUN docker-php-source extract && \
+ cd /usr/src/php && \
+ ./configure \
+ --with-libxml \
+ --enable-mbstring \
+ --with-openssl \
+ --with-config-file-path=/usr/local/etc/php \
+ --with-config-file-scan-dir=/usr/local/etc/php/conf.d && \
+ make && make install && \
+ docker-php-source delete
+
+RUN apt-get update
+
+#RUN pecl install libsodium
+
+# Check if there's a pinned version of Xdebug for compatibility reasons
+ARG XDEBUG_VERSION
+RUN pecl install xdebug$(if [ ! ${XDEBUG_VERSION} = '' ]; then echo -${XDEBUG_VERSION} ; fi) && docker-php-ext-enable xdebug
+
+# Required by coveralls
+RUN apt-get install git -y
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Configuration.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Configuration.php
index 0632399c6..6d1f03fa7 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Configuration.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Configuration.php
@@ -1,6 +1,6 @@
<?php
-namespace andreskrey\Readability;
+namespace fivefilters\Readability;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
@@ -69,6 +69,21 @@ class Configuration
protected $originalURL = 'http://fakehost';
/**
+ * @var string
+ */
+ protected $parser = 'html5';
+
+ /**
+ * @var bool
+ */
+ protected $keepClasses = false;
+
+ /**
+ * @var bool
+ */
+ protected $disableJSONLD = false;
+
+ /**
* Configuration constructor.
*
* @param array $params
@@ -327,6 +342,66 @@ class Configuration
}
/**
+ * @return string
+ */
+ public function getParser()
+ {
+ return $this->parser;
+ }
+
+ /**
+ * @param string $parser
+ *
+ * @return $this
+ */
+ public function setParser($parser)
+ {
+ $this->parser = $parser;
+
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getKeepClasses()
+ {
+ return $this->keepClasses;
+ }
+
+ /**
+ * @param bool $keepClasses
+ *
+ * @return $this
+ */
+ public function setKeepClasses($keepClasses)
+ {
+ $this->keepClasses = $keepClasses;
+
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getDisableJSONLD()
+ {
+ return $this->disableJSONLD;
+ }
+
+ /**
+ * @param bool $disableJSONLD
+ *
+ * @return $this
+ */
+ public function setDisableJSONLD($disableJSONLD)
+ {
+ $this->disableJSONLD = $disableJSONLD;
+
+ return $this;
+ }
+
+ /**
* @return bool
*/
public function getSummonCthulhu()
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMAttr.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMAttr.php
index 91729f3b1..1bdf395e7 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMAttr.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMAttr.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMAttr extends \DOMAttr
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCdataSection.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCdataSection.php
index 4535e4e99..6ac3dcdfc 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCdataSection.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCdataSection.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMCdataSection extends \DOMCdataSection
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCharacterData.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCharacterData.php
index e4db11a06..b196979fc 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCharacterData.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMCharacterData.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMCharacterData extends \DOMCharacterData
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMComment.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMComment.php
index 13b004aff..3b691f486 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMComment.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMComment.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMComment extends \DOMComment
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocument.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocument.php
index 81e9c7de6..d91233807 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocument.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocument.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMDocument extends \DOMDocument
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentFragment.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentFragment.php
index bcb89468d..33a3f950a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentFragment.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentFragment.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMDocumentFragment extends \DOMDocumentFragment
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentType.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentType.php
index 18705a7a7..cf3cd0f88 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentType.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMDocumentType.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMDocumentType extends \DOMDocumentType
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMElement.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMElement.php
index c07670bf7..b0da84fb9 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMElement.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMElement.php
@@ -1,10 +1,46 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMElement extends \DOMElement
{
use NodeTrait;
+
+ /**
+ * Returns the child elements of this element.
+ *
+ * To get all child nodes, including non-element nodes like text and comment nodes, use childNodes.
+ *
+ * @return DOMNodeList
+ */
+ public function children()
+ {
+ $newList = new DOMNodeList();
+ foreach ($this->childNodes as $node) {
+ if ($node->nodeType === XML_ELEMENT_NODE) {
+ $newList->add($node);
+ }
+ }
+ return $newList;
+ }
+
+ /**
+ * Returns the Element immediately prior to the specified one in its parent's children list, or null if the specified element is the first one in the list.
+ *
+ * @see https://wiki.php.net/rfc/dom_living_standard_api
+ * @return DOMElement|null
+ */
+ public function previousElementSibling()
+ {
+ $previous = $this->previousSibling;
+ while ($previous) {
+ if ($previous->nodeType === XML_ELEMENT_NODE) {
+ return $previous;
+ }
+ $previous = $previous->previousSibling;
+ }
+ return null;
+ }
}
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntity.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntity.php
index 8493e7319..751b59c48 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntity.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntity.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMEntity extends \DOMEntity
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntityReference.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntityReference.php
index 32cecb75c..d6fd6d49c 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntityReference.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMEntityReference.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMEntityReference extends \DOMEntityReference
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNode.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNode.php
index 7c3c4f3a2..4a3ab0dc3 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNode.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNode.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
/**
* @method getAttribute($attribute)
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNodeList.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNodeList.php
index 5149c0b98..a718c00ce 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNodeList.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNodeList.php
@@ -1,6 +1,6 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
/**
* Class DOMNodeList.
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNotation.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNotation.php
index 2e888ce00..d276e42a4 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNotation.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMNotation.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMNotation extends \DOMNotation
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMProcessingInstruction.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMProcessingInstruction.php
index 9dd4c5c70..82c69cf01 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMProcessingInstruction.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMProcessingInstruction.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMProcessingInstruction extends \DOMProcessingInstruction
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMText.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMText.php
index 42c575b49..6a5716c92 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMText.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/DOM/DOMText.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Nodes\DOM;
+namespace fivefilters\Readability\Nodes\DOM;
-use andreskrey\Readability\Nodes\NodeTrait;
+use fivefilters\Readability\Nodes\NodeTrait;
class DOMText extends \DOMText
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeTrait.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeTrait.php
index 5198bbb5f..1e9e3d1ee 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeTrait.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeTrait.php
@@ -1,11 +1,11 @@
<?php
-namespace andreskrey\Readability\Nodes;
+namespace fivefilters\Readability\Nodes;
-use andreskrey\Readability\Nodes\DOM\DOMDocument;
-use andreskrey\Readability\Nodes\DOM\DOMElement;
-use andreskrey\Readability\Nodes\DOM\DOMNode;
-use andreskrey\Readability\Nodes\DOM\DOMText;
+use fivefilters\Readability\Nodes\DOM\DOMDocument;
+use fivefilters\Readability\Nodes\DOM\DOMElement;
+use fivefilters\Readability\Nodes\DOM\DOMNode;
+use fivefilters\Readability\Nodes\DOM\DOMText;
use DOMNodeList;
/**
@@ -38,7 +38,6 @@ trait NodeTrait
* @var array
*/
private $divToPElements = [
- 'a',
'blockquote',
'dl',
'div',
@@ -47,8 +46,7 @@ trait NodeTrait
'p',
'pre',
'table',
- 'ul',
- 'select',
+ 'ul'
];
/**
@@ -169,6 +167,7 @@ trait NodeTrait
*
* @return string
*/
+ #[\ReturnTypeWillChange]
public function getAttribute($attributeName)
{
if (!is_null($this->attributes)) {
@@ -187,6 +186,7 @@ trait NodeTrait
*
* @see getAttribute
*/
+ #[\ReturnTypeWillChange]
public function hasAttribute($attributeName)
{
if (!is_null($this->attributes)) {
@@ -240,19 +240,21 @@ trait NodeTrait
*/
public function getLinkDensity()
{
- $linkLength = 0;
$textLength = mb_strlen($this->getTextContent(true));
-
- if (!$textLength) {
+ if ($textLength === 0) {
return 0;
}
+ $linkLength = 0;
+
$links = $this->getAllLinks();
if ($links) {
/** @var DOMElement $link */
foreach ($links as $link) {
- $linkLength += mb_strlen($link->getTextContent(true));
+ $href = $link->getAttribute('href');
+ $coefficient = ($href && preg_match(NodeUtility::$regexps['hashUrl'], $href)) ? 0.3 : 1;
+ $linkLength += mb_strlen($link->getTextContent(true)) * $coefficient;
}
}
@@ -282,7 +284,7 @@ trait NodeTrait
// Look for a special ID
$id = $this->getAttribute('id');
- if (trim($id)) {
+ if (trim($id) !== '') {
if (preg_match(NodeUtility::$regexps['negative'], $id)) {
$weight -= 25;
}
@@ -302,41 +304,17 @@ trait NodeTrait
*
* @return string
*/
- public function getTextContent($normalize = false)
+ public function getTextContent($normalize = true)
{
- $nodeValue = $this->nodeValue;
+ $nodeValue = trim($this->textContent);
if ($normalize) {
- $nodeValue = trim(preg_replace('/\s{2,}/', ' ', $nodeValue));
+ $nodeValue = preg_replace(NodeUtility::$regexps['normalize'], ' ', $nodeValue);
}
return $nodeValue;
}
/**
- * Returns the children of the current node.
- *
- * @param bool $filterEmptyDOMText Filter empty DOMText nodes?
- *
- * @deprecated Use NodeUtility::filterTextNodes, function will be removed in version 3.0
- *
- * @return array
- */
- public function getChildren($filterEmptyDOMText = false)
- {
- @trigger_error('getChildren was replaced with NodeUtility::filterTextNodes and will be removed in version 3.0', E_USER_DEPRECATED);
-
- $ret = iterator_to_array($this->childNodes);
- if ($filterEmptyDOMText) {
- // Array values is used to discard the key order. Needs to be 0 to whatever without skipping any number
- $ret = array_values(array_filter($ret, function ($node) {
- return $node->nodeName !== '#text' || mb_strlen(trim($node->nodeValue));
- }));
- }
-
- return $ret;
- }
-
- /**
* Return an array indicating how many rows and columns this table has.
*
* @return array
@@ -374,7 +352,7 @@ trait NodeTrait
*/
public function createNode($originalNode, $tagName)
{
- $text = $originalNode->getTextContent();
+ $text = $originalNode->getTextContent(false);
$newNode = $originalNode->ownerDocument->createElement($tagName, $text);
return $newNode;
@@ -433,7 +411,7 @@ trait NodeTrait
}
/* @var DOMNode $child */
- return !($child->nodeType === XML_TEXT_NODE && !preg_match('/\S$/', $child->getTextContent()));
+ return !($child->nodeType === XML_TEXT_NODE && preg_match(NodeUtility::$regexps['hasContent'], $child->textContent));
});
}
@@ -508,13 +486,14 @@ trait NodeTrait
* In the original JS project they check if the node has the style display=none, which unfortunately
* in our case we have no way of knowing that. So we just check for the attribute hidden or "display: none".
*
- * Might be a good idea to check for classes or other attributes like 'aria-hidden'
- *
* @return bool
*/
public function isProbablyVisible()
{
- return !preg_match('/display:( )?none/', $this->getAttribute('style')) && !$this->hasAttribute('hidden');
+ return !preg_match('/display:( )?none/i', $this->getAttribute('style')) &&
+ !$this->hasAttribute('hidden') &&
+ //check for "fallback-image" so that wikimedia math images are displayed
+ (!$this->hasAttribute('aria-hidden') || $this->getAttribute('aria-hidden') !== 'true' || ($this->hasAttribute('class') && strpos($this->getAttribute('class'), 'fallback-image') !== false));
}
/**
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeUtility.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeUtility.php
index cbf78bae0..56de70517 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeUtility.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Nodes/NodeUtility.php
@@ -1,11 +1,11 @@
<?php
-namespace andreskrey\Readability\Nodes;
+namespace fivefilters\Readability\Nodes;
-use andreskrey\Readability\Nodes\DOM\DOMDocument;
-use andreskrey\Readability\Nodes\DOM\DOMElement;
-use andreskrey\Readability\Nodes\DOM\DOMNode;
-use andreskrey\Readability\Nodes\DOM\DOMNodeList;
+use fivefilters\Readability\Nodes\DOM\DOMDocument;
+use fivefilters\Readability\Nodes\DOM\DOMElement;
+use fivefilters\Readability\Nodes\DOM\DOMNode;
+use fivefilters\Readability\Nodes\DOM\DOMNodeList;
/**
* Class NodeUtility.
@@ -18,31 +18,43 @@ class NodeUtility
* @var array
*/
public static $regexps = [
- 'unlikelyCandidates' => '/-ad-|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|foot|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i',
- 'okMaybeItsACandidate' => '/and|article|body|column|main|shadow/i',
+ 'unlikelyCandidates' => '/-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i',
+ 'okMaybeItsACandidate' => '/and|article|body|column|content|main|shadow/i',
'extraneous' => '/print|archive|comment|discuss|e[\-]?mail|share|reply|all|login|sign|single|utility/i',
'byline' => '/byline|author|dateline|writtenby|p-author/i',
- 'replaceFonts' => '/<(\/?)font[^>]*>/gi',
+ 'replaceFonts' => '/<(\/?)font[^>]*>/i',
'normalize' => '/\s{2,}/',
'videos' => '/\/\/(www\.)?((dailymotion|youtube|youtube-nocookie|player\.vimeo|v\.qq)\.com|(archive|upload\.wikimedia)\.org|player\.twitch\.tv)/i',
+ 'shareElements' => '/(\b|_)(share|sharedaddy)(\b|_)/i',
'nextLink' => '/(next|weiter|continue|>([^\|]|$)|»([^\|]|$))/i',
'prevLink' => '/(prev|earl|old|new|<|«)/i',
+ 'tokenize' => '/\W+/',
'whitespace' => '/^\s*$/',
'hasContent' => '/\S$/',
'positive' => '/article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i',
- 'negative' => '/hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|tool|widget/i',
+ 'negative' => '/-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|foot|footer|footnote|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|tool|widget/i',
// \x{00A0} is the unicode version of &nbsp;
- 'onlyWhitespace' => '/\x{00A0}|\s+/u'
+ 'onlyWhitespace' => '/\x{00A0}|\s+/u',
+ 'hashUrl' => '/^#.+/',
+ 'srcsetUrl' => '/(\S+)(\s+[\d.]+[xw])?(\s*(?:,|$))/',
+ 'b64DataUrl' => '/^data:\s*([^\s;,]+)\s*;\s*base64\s*,/i',
+ // See: https://schema.org/Article
+ 'jsonLdArticleTypes' => '/^Article|AdvertiserContentArticle|NewsArticle|AnalysisNewsArticle|AskPublicNewsArticle|BackgroundNewsArticle|OpinionNewsArticle|ReportageNewsArticle|ReviewNewsArticle|Report|SatiricalArticle|ScholarlyArticle|MedicalScholarlyArticle|SocialMediaPosting|BlogPosting|LiveBlogPosting|DiscussionForumPosting|TechArticle|APIReference$/'
+
];
/**
+ * Finds the next node, starting from the given node, and ignoring
+ * whitespace in between. If the given node is an element, the same node is
+ * returned.
+ *
* Imported from the Element class on league\html-to-markdown.
*
* @param $node
*
- * @return DOMElement
+ * @return DOMNode
*/
- public static function nextElement($node)
+ public static function nextNode($node)
{
$next = $node;
while ($next
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/ParseException.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/ParseException.php
index 646c04a37..587da337f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/ParseException.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/ParseException.php
@@ -1,6 +1,6 @@
<?php
-namespace andreskrey\Readability;
+namespace fivefilters\Readability;
class ParseException extends \Exception
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/src/Readability.php b/plugins/af_readability/vendor/fivefilters/readability.php/src/Readability.php
index 6bcbf78d7..6407a9292 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/src/Readability.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/src/Readability.php
@@ -1,13 +1,16 @@
<?php
-namespace andreskrey\Readability;
+namespace fivefilters\Readability;
-use andreskrey\Readability\Nodes\DOM\DOMDocument;
-use andreskrey\Readability\Nodes\DOM\DOMElement;
-use andreskrey\Readability\Nodes\DOM\DOMNode;
-use andreskrey\Readability\Nodes\DOM\DOMText;
-use andreskrey\Readability\Nodes\NodeUtility;
+use fivefilters\Readability\Nodes\DOM\DOMDocument;
+use fivefilters\Readability\Nodes\DOM\DOMElement;
+use fivefilters\Readability\Nodes\DOM\DOMNode;
+use fivefilters\Readability\Nodes\DOM\DOMText;
+use fivefilters\Readability\Nodes\NodeUtility;
use Psr\Log\LoggerInterface;
+use \Masterminds\HTML5;
+use League\Uri\Http;
+use League\Uri\UriResolver;
/**
* Class Readability.
@@ -71,6 +74,14 @@ class Readability
protected $direction = null;
/**
+ * Base URI
+ * HTML5PHP doesn't appear to store it in the baseURI property like PHP's DOMDocument does when parsing with libxml
+ *
+ * @var string|null
+ */
+ protected $baseURI = null;
+
+ /**
* Configuration object.
*
* @var Configuration
@@ -85,6 +96,13 @@ class Readability
private $logger;
/**
+ * JSON-LD
+ *
+ * @var array
+ */
+ private $jsonld = [];
+
+ /**
* Collection of attempted text extractions.
*
* @var array
@@ -109,6 +127,11 @@ class Readability
/**
* @var array
*/
+ private $unlikelyRoles = ['menu', 'menubar', 'complementary', 'navigation', 'alert', 'alertdialog', 'dialog'];
+
+ /**
+ * @var array
+ */
private $alterToDIVExceptions = [
'div',
'article',
@@ -117,6 +140,17 @@ class Readability
];
/**
+ * @var array
+ */
+ private $htmlEscapeMap = [
+ 'lt' => '<',
+ 'gt' => '>',
+ 'amp' => '&',
+ 'quot' => '"',
+ 'apos' => '\'',
+ ];
+
+ /**
* Readability constructor.
*
* @param Configuration $configuration
@@ -154,6 +188,7 @@ class Readability
$this->getMainImage();
while (true) {
+ $this->logger->debug('Starting parse loop');
$root = $root->firstChild;
$elementsToScore = $this->getNodes($root);
@@ -195,7 +230,7 @@ class Readability
// No luck after removing flags, just return the longest text we found during the different loops
usort($this->attempts, function ($a, $b) {
- return $a['textLength'] < $b['textLength'];
+ return $b['textLength'] - $a['textLength'];
});
// But first check if we actually have something
@@ -215,6 +250,11 @@ class Readability
}
}
+ if (!$result) {
+ $this->logger->info('*** Parse failed :(');
+ return false;
+ }
+
$result = $this->postProcessContent($result);
// If we haven't found an excerpt in the article's metadata, use the article's
@@ -254,28 +294,54 @@ class Readability
// To avoid throwing a gazillion of errors on malformed HTMLs
libxml_use_internal_errors(true);
- $dom = new DOMDocument('1.0', 'utf-8');
+ //$html = preg_replace('/(<br[^>]*>[ \n\r\t]*){2,}/i', '</p><p>', $html);
+
+ if ($this->configuration->getParser() === 'html5') {
+ $this->logger->debug('[Loading] Using HTML5 parser...');
+ $html5 = new HTML5(['disable_html_ns' => true, 'target_document' => new DOMDocument('1.0', 'utf-8')]);
+ $dom = $html5->loadHTML($html);
+ //TODO: Improve this so it looks inside <html><head><base>, not just any <base>
+ $base = $dom->getElementsByTagName('base');
+ if ($base->length > 0) {
+ $base = $base->item(0);
+ $base = $base->getAttribute('href');
+ if ($base != '') {
+ $this->baseURI = $base;
+ }
+ }
+ } else {
+ $this->logger->debug('[Loading] Using libxml parser...');
+ $dom = new DOMDocument('1.0', 'utf-8');
+ if ($this->configuration->getNormalizeEntities()) {
+ $this->logger->debug('[Loading] Normalized entities via mb_convert_encoding.');
+ // Replace UTF-8 characters with the HTML Entity equivalent. Useful to fix html with mixed content
+ $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
+ }
+ }
if (!$this->configuration->getSubstituteEntities()) {
// Keep the original HTML entities
$dom->substituteEntities = false;
}
- if ($this->configuration->getNormalizeEntities()) {
- $this->logger->debug('[Loading] Normalized entities via mb_convert_encoding.');
- // Replace UTF-8 characters with the HTML Entity equivalent. Useful to fix html with mixed content
- $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
- }
-
if ($this->configuration->getSummonCthulhu()) {
$this->logger->debug('[Loading] Removed script tags via regex H̶͈̩̟̬̱͠E̡̨̬͔̳̜͢͠ ̡̧̯͉̩͙̩̹̞̠͎͈̹̥̠͞ͅͅC̶͉̞̘̖̝̗͓̬̯͍͉̤̬͢͢͞Ò̟̘͉͖͎͉̱̭̣̕M̴̯͈̻̱̱̣̗͈̠̙̲̥͘͞E̷̛͙̼̲͍͕̹͍͇̗̻̬̮̭̱̥͢Ş̛̟͔̙̜̤͇̮͍̙̝̀͘');
$html = preg_replace('/<script\b[^>]*>([\s\S]*?)<\/script>/', '', $html);
}
// Prepend the XML tag to avoid having issues with special characters. Should be harmless.
- $dom->loadHTML('<?xml encoding="UTF-8">' . $html);
+ if ($this->configuration->getParser() !== 'html5') {
+ $dom->loadHTML('<?xml encoding="UTF-8">' . $html);
+ $this->baseURI = $dom->baseURI;
+ }
$dom->encoding = 'UTF-8';
+ // Unwrap image from noscript
+ $this->unwrapNoscriptImages($dom);
+
+ // Extract JSON-LD metadata before removing scripts
+ $this->jsonld = $this->configuration->getDisableJSONLD() ? [] : $this->getJSONLD($dom);
+
$this->removeScripts($dom);
$this->prepDocument($dom);
@@ -286,6 +352,99 @@ class Readability
}
/**
+ * Try to extract metadata from JSON-LD object.
+ * For now, only Schema.org objects of type Article or its subtypes are supported.
+ *
+ * @param DOMDocument $dom
+ * @return Object with any metadata that could be extracted (possibly none)
+ */
+ private function getJSONLD(DOMDocument $dom)
+ {
+ $scripts = $this->_getAllNodesWithTag($dom, ['script']);
+
+ $jsonLdElement = $this->findNode($scripts, function ($el) {
+ return $el->getAttribute('type') === 'application/ld+json';
+ });
+
+ if ($jsonLdElement) {
+ try {
+ // Strip CDATA markers if present
+ $content = preg_replace('/^\s*<!\[CDATA\[|\]\]>\s*$/', '', $jsonLdElement->textContent);
+ $parsed = json_decode($content, true);
+ $metadata = [];
+ if (
+ !isset($parsed['@context']) ||
+ !is_string($parsed['@context']) ||
+ !preg_match('/^https?\:\/\/schema\.org$/', $parsed['@context'])
+ ) {
+ return $metadata;
+ }
+
+ if (!isset($parsed['@type']) && isset($parsed['@graph']) && is_array($parsed['@graph'])) {
+ $_found = null;
+ foreach ($parsed['@graph'] as $it) {
+ if (isset($it['@type']) && is_string($it['@type']) && preg_match(NodeUtility::$regexps['jsonLdArticleTypes'], $it['@type'])) {
+ $_found = $it;
+ }
+ }
+ $parsed = $_found;
+ }
+
+ if (
+ !$parsed ||
+ !isset($parsed['@type']) ||
+ !is_string($parsed['@type']) ||
+ !preg_match(NodeUtility::$regexps['jsonLdArticleTypes'], $parsed['@type'])
+ ) {
+ return $metadata;
+ }
+ if (isset($parsed['name']) && is_string($parsed['name'])) {
+ $metadata['title'] = trim($parsed['name']);
+ } elseif (isset($parsed['headline']) && is_string($parsed['headline'])) {
+ $metadata['title'] = trim($parsed['headline']);
+ }
+ if (isset($parsed['author'])) {
+ if (isset($parsed['author']['name']) && is_string($parsed['author']['name'])) {
+ $metadata['byline'] = trim($parsed['author']['name']);
+ } elseif (
+ is_array($parsed['author']) &&
+ isset($parsed['author'][0]) &&
+ is_array($parsed['author'][0]) &&
+ isset($parsed['author'][0]['name']) &&
+ is_string($parsed['author'][0]['name'])
+ ) {
+ $metadata['byline'] = array_filter($parsed['author'], function ($author) {
+ return is_array($author) && isset($author['name']) && is_string($author['name']);
+ });
+ $metadata['byline'] = array_map(function ($author) {
+ return trim($author['name']);
+ }, $metadata['byline']);
+ $metadata['byline'] = implode(', ', $metadata['byline']);
+ }
+ }
+ if (isset($parsed['description']) && is_string($parsed['description'])) {
+ $metadata['excerpt'] = trim($parsed['description']);
+ }
+ if (
+ isset($parsed['publisher']) &&
+ is_array($parsed['publisher']) &&
+ isset($parsed['publisher']['name']) &&
+ is_string($parsed['publisher']['name'])
+ ) {
+ $metadata['siteName'] = trim($parsed['publisher']['name']);
+ }
+ return $metadata;
+ } catch (\Exception $err) {
+ // The try-catch blocks are from the JS version. Not sure if there's anything
+ // here in the PHP version that would trigger an error or exception, so perhaps we can
+ // remove the try-catch blocks here (or at least translate errors to exceptions for this bit)
+ $this->logger->debug('[JSON-LD] Error parsing: ' . $err->getMessage());
+ }
+ }
+ return [];
+ }
+
+ /**
* Tries to guess relevant info from metadata of the html. Sets the results in the Readability properties.
*/
private function getMetadata()
@@ -304,19 +463,15 @@ class Readability
/* @var DOMNode $meta */
$elementName = $meta->getAttribute('name');
$elementProperty = $meta->getAttribute('property');
- $content = $meta->getAttribute('content');
+ $content = $meta->getAttribute('content');
$matches = null;
$name = null;
if ($elementProperty) {
if (preg_match($propertyPattern, $elementProperty, $matches)) {
- for ($i = count($matches) - 1; $i >= 0; $i--) {
- // Convert to lowercase, and remove any whitespace
- // so we can match below.
- $name = preg_replace('/\s/', '', mb_strtolower($matches[$i]));
- // multiple authors
- $values[$name] = trim($content);
- }
+ $name = preg_replace('/\s/', '', mb_strtolower($matches[0]));
+ // multiple authors
+ $values[$name] = trim($content);
}
}
@@ -349,7 +504,11 @@ class Readability
'twitter:title'
], array_keys($values)));
- $this->setTitle(isset($values[$key]) ? trim($values[$key]) : null);
+ if (isset($this->jsonld['title'])) {
+ $this->setTitle($this->jsonld['title']);
+ } else {
+ $this->setTitle(isset($values[$key]) ? trim($values[$key]) : null);
+ }
if (!$this->getTitle()) {
$this->setTitle($this->getArticleTitle());
@@ -362,7 +521,11 @@ class Readability
'author'
], array_keys($values)));
- $this->setAuthor(isset($values[$key]) ? $values[$key] : null);
+ if (isset($this->jsonld['byline'])) {
+ $this->setAuthor($this->jsonld['byline']);
+ } else {
+ $this->setAuthor(isset($values[$key]) ? $values[$key] : null);
+ }
// get description
$key = current(array_intersect([
@@ -375,7 +538,11 @@ class Readability
'twitter:description'
], array_keys($values)));
- $this->setExcerpt(isset($values[$key]) ? $values[$key] : null);
+ if (isset($this->jsonld['excerpt'])) {
+ $this->setExcerpt($this->jsonld['excerpt']);
+ } else {
+ $this->setExcerpt(isset($values[$key]) ? $values[$key] : null);
+ }
// get main image
$key = current(array_intersect([
@@ -390,7 +557,18 @@ class Readability
'og:site_name'
], array_keys($values)));
- $this->setSiteName(isset($values[$key]) ? $values[$key] : null);
+ if (isset($this->jsonld['siteName'])) {
+ $this->setSiteName($this->jsonld['siteName']);
+ } else {
+ $this->setSiteName(isset($values[$key]) ? $values[$key] : null);
+ }
+
+ // in many sites the meta value is escaped with HTML entities,
+ // so here we need to unescape it
+ $this->setTitle($this->unescapeHtmlEntities($this->getTitle()));
+ $this->setAuthor($this->unescapeHtmlEntities($this->getAuthor()));
+ $this->setExcerpt($this->unescapeHtmlEntities($this->getExcerpt()));
+ $this->setSiteName($this->unescapeHtmlEntities($this->getSiteName()));
}
/**
@@ -458,6 +636,37 @@ class Readability
}
/**
+ * Remove unnecessary nested elements
+ *
+ * @param DOMDocument $article
+ *
+ * @return void
+ */
+ private function simplifyNestedElements(DOMDocument $article)
+ {
+ $node = $article;
+
+ while ($node) {
+ if ($node->parentNode && in_array($node->nodeName, ['div', 'section']) && !($node->hasAttribute('id') && strpos($node->getAttribute('id'), 'readability') === 0)) {
+ if ($node->isElementWithoutContent()) {
+ $node = NodeUtility::removeAndGetNext($node);
+ continue;
+ } elseif ($node->hasSingleTagInsideElement('div') || $node->hasSingleTagInsideElement('section')) {
+ $child = $node->children()->item(0);
+ for ($i = 0; $i < $node->attributes->length; $i++) {
+ $child->setAttribute($node->attributes->item($i)->name, $node->attributes->item($i)->value);
+ }
+ $node->parentNode->replaceChild($child, $node);
+ $node = $child;
+ continue;
+ }
+ }
+
+ $node = NodeUtility::getNextNode($node);
+ }
+ }
+
+ /**
* Returns the title of the html. Prioritizes the title from the metadata against the title tag.
*
* @return string|null
@@ -491,7 +700,7 @@ class Readability
* I can assure you it works properly if you let the code run.
*/
if (preg_match('/ [\|\-\\\\\/>»] /i', $curTitle)) {
- $titleHadHierarchicalSeparators = (bool)preg_match('/ [\\\\\/>»] /', $curTitle);
+ $titleHadHierarchicalSeparators = (bool) preg_match('/ [\\\\\/>»] /', $curTitle);
$curTitle = preg_replace('/(.*)[\|\-\\\\\/>»] .*/i', '$1', $originalTitle);
$this->logger->info(sprintf('[Metadata] Found hierarchical separators in title, new title is: \'%s\'', $curTitle));
@@ -540,7 +749,7 @@ class Readability
}
}
- $curTitle = trim($curTitle);
+ $curTitle = preg_replace(NodeUtility::$regexps['normalize'], ' ', trim($curTitle));
/*
* If we now have 4 words or fewer as our title, and either no
@@ -572,6 +781,8 @@ class Readability
{
list($pathBase, $scheme, $prePath) = $this->getPathInfo($this->configuration->getOriginalURL());
+ $uri = trim($uri);
+
// If this is already an absolute URI, return it.
if (preg_match('/^[a-zA-Z][a-zA-Z0-9\+\-\.]*:/', $uri)) {
return $uri;
@@ -587,18 +798,23 @@ class Readability
return $prePath . $uri;
}
- // Dotslash relative URI.
- if (strpos($uri, './') === 0) {
- return $pathBase . substr($uri, 2);
- }
// Ignore hash URIs:
if (substr($uri, 0, 1) === '#') {
return $uri;
}
+ // Dotslash relative URI.
+ //if (strpos($uri, './') === 0) {
+ // return $pathBase . substr($uri, 2);
+ //}
+
+ $baseUri = Http::createFromString($pathBase);
+ $relativeUri = Http::createFromString($uri);
+ return (string)UriResolver::resolve($relativeUri, $baseUri);
+
// Standard relative URI; add entire path. pathBase already includes a
// trailing "/".
- return $pathBase . $uri;
+ //return $pathBase . $uri;
}
/**
@@ -611,13 +827,13 @@ class Readability
public function getPathInfo($url)
{
// Check for base URLs
- if ($this->dom->baseURI !== null) {
- if (substr($this->dom->baseURI, 0, 1) === '/') {
+ if ($this->baseURI !== null) {
+ if (substr($this->baseURI, 0, 1) === '/') {
// URLs starting with '/' override completely the URL defined in the link
- $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . $this->dom->baseURI;
+ $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . $this->baseURI;
} else {
// Otherwise just prepend the base to the actual path
- $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . dirname(parse_url($url, PHP_URL_PATH)) . '/' . rtrim($this->dom->baseURI, '/') . '/';
+ $pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . dirname(parse_url($url, PHP_URL_PATH)) . '/'.rtrim($this->baseURI, '/') . '/';
}
} else {
$pathBase = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . dirname(parse_url($url, PHP_URL_PATH)) . '/';
@@ -644,6 +860,8 @@ class Readability
$elementsToScore = [];
+ $shouldRemoveTitleHeader = true;
+
/*
* First, node prepping. Trash nodes that look cruddy (like ones with the
* class name "comment", etc), and turn divs into P tags where they have been
@@ -673,11 +891,20 @@ class Readability
continue;
}
+ if ($shouldRemoveTitleHeader && $this->headerDuplicatesTitle($node)) {
+ $this->logger->debug(sprintf('Removing header: %s', $node->getTextContent()));
+ $shouldRemoveTitleHeader = false;
+ $node = NodeUtility::removeAndGetNext($node);
+ continue;
+ }
+
// Remove unlikely candidates
if ($stripUnlikelyCandidates) {
if (
preg_match(NodeUtility::$regexps['unlikelyCandidates'], $matchString) &&
!preg_match(NodeUtility::$regexps['okMaybeItsACandidate'], $matchString) &&
+ !$node->hasAncestorTag( 'table') &&
+ !$node->hasAncestorTag( 'code') &&
$node->nodeName !== 'body' &&
$node->nodeName !== 'a'
) {
@@ -687,6 +914,12 @@ class Readability
}
}
+ if (in_array($node->getAttribute('role'), $this->unlikelyRoles)) {
+ $this->logger->debug(sprintf('Removing content with role %s - %s', $node->getAttribute('role'), $matchString));
+ $node = NodeUtility::removeAndGetNext($node);
+ continue;
+ }
+
// Remove DIV, SECTION, and HEADER nodes without any content(e.g. text, image, video, or iframe).
if (($node->nodeName === 'div' || $node->nodeName === 'section' || $node->nodeName === 'header' ||
$node->nodeName === 'h1' || $node->nodeName === 'h2' || $node->nodeName === 'h3' ||
@@ -753,6 +986,30 @@ class Readability
}
/**
+ * compares second text to first one
+ * 1 = same text, 0 = completely different text
+ * works the way that it splits both texts into words and then finds words that are unique in second text
+ * the result is given by the lower length of unique parts
+ *
+ * @param string $textA
+ * @param string $textB
+ *
+ * @return int 1 = same text, 0 = completely different text
+ */
+ private function textSimilarity(string $textA, string $textB) {
+ $tokensA = array_filter(preg_split(NodeUtility::$regexps['tokenize'], mb_strtolower($textA)));
+ $tokensB = array_filter(preg_split(NodeUtility::$regexps['tokenize'], mb_strtolower($textB)));
+ if (!count($tokensA) || !count($tokensB)) {
+ return 0;
+ }
+ $uniqTokensB = array_filter($tokensB, function ($token) use (&$tokensA) {
+ return !in_array($token, $tokensA);
+ });
+ $distanceB = mb_strlen(implode(' ', $uniqTokensB)) / mb_strlen(implode(' ', $tokensB));
+ return 1 - $distanceB;
+ }
+
+ /**
* Checks if the node is a byline.
*
* @param DOMNode $node
@@ -774,10 +1031,11 @@ class Readability
}
$rel = $node->getAttribute('rel');
+ $itemprop = $node->getAttribute("itemprop");
- if ($rel === 'author' || preg_match(NodeUtility::$regexps['byline'], $matchString) && $this->isValidByline($node->getTextContent())) {
- $this->logger->info(sprintf('[Metadata] Found article author: \'%s\'', $node->getTextContent()));
- $this->setAuthor(trim($node->getTextContent()));
+ if ($rel === 'author' || ($itemprop && strpos($itemprop, 'author') !== false) || preg_match(NodeUtility::$regexps['byline'], $matchString) && $this->isValidByline($node->getTextContent(false))) {
+ $this->logger->info(sprintf('[Metadata] Found article author: \'%s\'', $node->getTextContent(false)));
+ $this->setAuthor(trim($node->getTextContent(false)));
return true;
}
@@ -804,6 +1062,132 @@ class Readability
}
/**
+ * Converts some of the common HTML entities in string to their corresponding characters.
+ *
+ * @param string $str - a string to unescape.
+ * @return string without HTML entity.
+ */
+ private function unescapeHtmlEntities($str) {
+ if (!$str) {
+ return $str;
+ }
+
+ $htmlEscapeMap = $this->htmlEscapeMap;
+ $str = preg_replace_callback('/&(quot|amp|apos|lt|gt);/', function ($tag) use ($htmlEscapeMap) {
+ return $htmlEscapeMap[$tag[1]];
+ }, $str);
+ $str = preg_replace_callback('/&#(?:x([0-9a-z]{1,4})|([0-9]{1,4}));/i', function ($matches) {
+ $hex = $matches[1];
+ $numStr = $matches[2];
+ if ($hex !== '') {
+ $num = intval($hex, 16);
+ } else {
+ $num = intval($numStr, 10);
+ }
+ return mb_chr($num);
+ }, $str);
+ return $str;
+ }
+
+ /**
+ * Check if node is image, or if node contains exactly only one image
+ * whether as a direct child or as its descendants.
+ *
+ * @param DOMElement $node
+ */
+ private function isSingleImage(DOMElement $node) {
+ if ($node->tagName === 'img') {
+ return true;
+ }
+
+ if ($node->children()->length !== 1 || trim($node->textContent) !== '') {
+ return false;
+ }
+
+ return $this->isSingleImage($node->children()->item(0));
+ }
+
+ /**
+ * Find all <noscript> that are located after <img> nodes, and which contain only one
+ * <img> element. Replace the first image with the image from inside the <noscript> tag,
+ * and remove the <noscript> tag. This improves the quality of the images we use on
+ * some sites (e.g. Medium).
+ *
+ * @param DOMDocument $dom
+ */
+ private function unwrapNoscriptImages(DOMDocument $dom) {
+ // Find img without source or attributes that might contains image, and remove it.
+ // This is done to prevent a placeholder img is replaced by img from noscript in next step.
+ $imgs = iterator_to_array($dom->getElementsByTagName('img'));
+ array_walk($imgs, function ($img) {
+ for ($i = 0; $i < $img->attributes->length; $i++) {
+ $attr = $img->attributes->item($i);
+ switch ($attr->name) {
+ case 'src':
+ case 'srcset':
+ case 'data-src':
+ case 'data-srcset':
+ return;
+ }
+
+ if (preg_match('/\.(jpg|jpeg|png|webp)/i', $attr->value)) {
+ return;
+ }
+ }
+
+ $img->parentNode->removeChild($img);
+ });
+
+ // Next find noscript and try to extract its image
+ $noscripts = iterator_to_array($dom->getElementsByTagName('noscript'));
+ array_walk($noscripts, function ($noscript) use($dom) {
+ // Parse content of noscript and make sure it only contains image
+ // [PHP port] Could copy innerHTML support over for the commented lines below, but is it needed?
+ // var tmp = doc.createElement("div");
+ // tmp.innerHTML = noscript.innerHTML;
+ $tmp = $noscript->cloneNode(true);
+ $dom->importNode($tmp);
+ if (!$this->isSingleImage($tmp)) {
+ return;
+ }
+
+ // If noscript has previous sibling and it only contains image,
+ // replace it with noscript content. However we also keep old
+ // attributes that might contains image.
+ $prevElement = $noscript->previousElementSibling();
+ if ($prevElement && $this->isSingleImage($prevElement)) {
+ $prevImg = $prevElement;
+ if ($prevImg->tagName !== 'img') {
+ $prevImg = $prevElement->getElementsByTagName('img')->item(0);
+ }
+
+ $newImg = $tmp->getElementsByTagName('img')->item(0);
+ for ($i = 0; $i < $prevImg->attributes->length; $i++) {
+ $attr = $prevImg->attributes->item($i);
+ if ($attr->value === '') {
+ continue;
+ }
+
+ if ($attr->name === 'src' || $attr->name === 'srcset' || preg_match('/\.(jpg|jpeg|png|webp)/i', $attr->value)) {
+ if ($newImg->getAttribute($attr->name) === $attr->value) {
+ continue;
+ }
+
+ $attrName = $attr->name;
+ if ($newImg->hasAttribute($attrName)) {
+ $attrName = 'data-old-' . $attrName;
+ }
+
+ $newImg->setAttribute($attrName, $attr->value);
+ }
+ }
+
+ $noscript->parentNode->replaceChild($tmp->getFirstElementChild(), $prevElement);
+ }
+ });
+ }
+
+ /**
* Removes all the scripts of the html.
*
* @param DOMDocument $dom
@@ -841,7 +1225,7 @@ class Readability
* or non-whitespace. This leaves behind the first <br> in the chain
* (which will be replaced with a <p> later).
*/
- while (($next = NodeUtility::nextElement($next)) && ($next->nodeName === 'br')) {
+ while (($next = NodeUtility::nextNode($next)) && ($next->nodeName === 'br')) {
$this->logger->debug('[PrepDocument] Removing chain of BR nodes...');
$replaced = true;
@@ -864,7 +1248,7 @@ class Readability
while ($next) {
// If we've hit another <br><br>, we're done adding children to this <p>.
if ($next->nodeName === 'br') {
- $nextElem = NodeUtility::nextElement($next->nextSibling);
+ $nextElem = NodeUtility::nextNode($next->nextSibling);
if ($nextElem && $nextElem->nodeName === 'br') {
break;
}
@@ -882,10 +1266,14 @@ class Readability
$next = $sibling;
}
- while ($p->lastChild && $p->lastChild->isWhitespace()) {
+ while ($p && $p->lastChild && $p->lastChild->isWhitespace()) {
$p->removeChild($p->lastChild);
}
+ while ($p && $p->firstChild && $p->firstChild->isWhitespace()) {
+ $p->removeChild($p->firstChild);
+ }
+
if ($p->parentNode->tagName === 'p') {
NodeUtility::setNodeTag($p->parentNode, 'div');
}
@@ -893,11 +1281,11 @@ class Readability
}
// Replace font tags with span
- $fonts = $dom->getElementsByTagName('font');
- $length = $fonts->length;
+ $fonts = $this->_getAllNodesWithTag($dom, ['font']);
+ $length = count($fonts);
for ($i = 0; $i < $length; $i++) {
$this->logger->debug('[PrepDocument] Converting font tag into a span tag.');
- $font = $fonts->item($length - 1 - $i);
+ $font = $fonts[$length - 1 - $i];
NodeUtility::setNodeTag($font, 'span');
}
}
@@ -926,7 +1314,7 @@ class Readability
continue;
}
- $ancestors = $node->getNodeAncestors();
+ $ancestors = $node->getNodeAncestors(5);
// Exclude nodes with no ancestor
if (count($ancestors) === 0) {
@@ -1046,7 +1434,7 @@ class Readability
$parentOfTopCandidate = $topCandidate->parentNode;
// Check if we are actually dealing with a DOMNode and not a DOMDocument node or higher
- while ($parentOfTopCandidate->nodeName !== 'body' && $parentOfTopCandidate->nodeType === XML_ELEMENT_NODE) {
+ while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body' && $parentOfTopCandidate->nodeType === XML_ELEMENT_NODE) {
$listsContainingThisAncestor = 0;
for ($ancestorIndex = 0; $ancestorIndex < count($alternativeCandidateAncestors) && $listsContainingThisAncestor < $MINIMUM_TOPCANDIDATES; $ancestorIndex++) {
$listsContainingThisAncestor += (int)in_array($parentOfTopCandidate, $alternativeCandidateAncestors[$ancestorIndex]);
@@ -1076,7 +1464,7 @@ class Readability
$scoreThreshold = $lastScore / 3;
/* @var DOMElement $parentOfTopCandidate */
- while ($parentOfTopCandidate->nodeName !== 'body') {
+ while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body') {
$parentScore = $parentOfTopCandidate->contentScore;
if ($parentScore < $scoreThreshold) {
break;
@@ -1095,7 +1483,7 @@ class Readability
// If the top candidate is the only child, use parent instead. This will help sibling
// joining logic when adjacent content is actually located in parent's sibling node.
$parentOfTopCandidate = $topCandidate->parentNode;
- while ($parentOfTopCandidate->nodeName !== 'body' && count(NodeUtility::filterTextNodes($parentOfTopCandidate->childNodes)) === 1) {
+ while ($parentOfTopCandidate && $parentOfTopCandidate->nodeName !== 'body' && count(NodeUtility::filterTextNodes($parentOfTopCandidate->childNodes)) === 1) {
$topCandidate = $parentOfTopCandidate;
$parentOfTopCandidate = $topCandidate->parentNode;
}
@@ -1216,20 +1604,26 @@ class Readability
// visually linked to other content-ful elements (text, images, etc.).
$this->_markDataTables($article);
+ $this->_fixLazyImages($article);
+
// Clean out junk from the article content
$this->_cleanConditionally($article, 'form');
$this->_cleanConditionally($article, 'fieldset');
$this->_clean($article, 'object');
$this->_clean($article, 'embed');
- $this->_clean($article, 'h1');
$this->_clean($article, 'footer');
$this->_clean($article, 'link');
$this->_clean($article, 'aside');
// Clean out elements have "share" in their id/class combinations from final top candidates,
// which means we don't remove the top candidates even they have "share".
+
+ $shareElementThreshold = $this->configuration->getCharThreshold();
+
foreach ($article->childNodes as $child) {
- $this->_cleanMatchedNodes($child, '/share/i');
+ $this->_cleanMatchedNodes($child, function ($node, $matchString) use ($shareElementThreshold) {
+ return (preg_match(NodeUtility::$regexps['shareElements'], $matchString) && mb_strlen($node->textContent) < $shareElementThreshold);
+ });
}
/*
@@ -1237,6 +1631,7 @@ class Readability
* they are probably using it as a header and not a subheader,
* so remove it since we already extract the title separately.
*/
+ /*
$h2 = $article->getElementsByTagName('h2');
if ($h2->length === 1) {
$lengthSimilarRate = (mb_strlen($h2->item(0)->textContent) - mb_strlen($this->getTitle())) / max(mb_strlen($this->getTitle()), 1);
@@ -1253,6 +1648,7 @@ class Readability
}
}
}
+ */
$this->_clean($article, 'iframe');
$this->_clean($article, 'input');
@@ -1267,10 +1663,15 @@ class Readability
$this->_cleanConditionally($article, 'ul');
$this->_cleanConditionally($article, 'div');
+ // replace H1 with H2 as H1 should be only title that is displayed separately
+ foreach (iterator_to_array($article->getElementsByTagName('h1')) as $h1) {
+ NodeUtility::setNodeTag($h1, 'h2');
+ }
+
$this->_cleanExtraParagraphs($article);
foreach (iterator_to_array($article->getElementsByTagName('br')) as $br) {
- $next = $br->nextSibling;
+ $next = NodeUtility::nextNode($br->nextSibling);
if ($next && $next->nodeName === 'p') {
$this->logger->debug('[PrepArticle] Removing br node next to a p node.');
$br->parentNode->removeChild($br);
@@ -1357,6 +1758,84 @@ class Readability
}
/**
+ * convert images and figures that have properties like data-src into images that can be loaded without JS
+ *
+ * @param DOMDocument $article
+ *
+ * @return void
+ */
+ public function _fixLazyImages(DOMDocument $article)
+ {
+ $images = $this->_getAllNodesWithTag($article, ['img', 'picture', 'figure']);
+ foreach ($images as $elem) {
+ // In some sites (e.g. Kotaku), they put 1px square image as base64 data uri in the src attribute.
+ // So, here we check if the data uri is too short, just might as well remove it.
+ if ($elem->getAttribute('src') && preg_match(NodeUtility::$regexps['b64DataUrl'], $elem->getAttribute('src'), $parts)) {
+ // Make sure it's not SVG, because SVG can have a meaningful image in under 133 bytes.
+ if ($parts[1] === 'image/svg+xml') {
+ continue;
+ }
+
+ // Make sure this element has other attributes which contains image.
+ // If it doesn't, then this src is important and shouldn't be removed.
+ $srcCouldBeRemoved = false;
+ for ($i = 0; $i < $elem->attributes->length; $i++) {
+ $attr = $elem->attributes->item($i);
+ if ($attr->name === 'src') {
+ continue;
+ }
+
+ if (preg_match('/\.(jpg|jpeg|png|webp)/i', $attr->value)) {
+ $srcCouldBeRemoved = true;
+ break;
+ }
+ }
+
+ // Here we assume if image is less than 100 bytes (or 133B after encoded to base64)
+ // it will be too small, therefore it might be placeholder image.
+ if ($srcCouldBeRemoved) {
+ $b64starts = stripos($elem->getAttribute('src'), 'base64') + 7;
+ $b64length = strlen($elem->getAttribute('src')) - $b64starts;
+ if ($b64length < 133) {
+ $elem->removeAttribute('src');
+ }
+ }
+ }
+
+ // Don't remove if there's a src or srcset attribute, and there's no sign of 'lazy' loading in the class
+ // attribute value.
+ if (($elem->getAttribute('src') || $elem->getAttribute('srcset')) && mb_stripos($elem->getAttribute('class'), 'lazy') === false) {
+ continue;
+ }
+
+ for ($j = 0; $j < $elem->attributes->length; $j++) {
+ $attr = $elem->attributes->item($j);
+ if ($attr->name === 'src' || $attr->name === 'srcset' || $attr->name === 'alt') {
+ continue;
+ }
+ $copyTo = null;
+ if (preg_match('/\.(jpg|jpeg|png|webp)\s+\d/', $attr->value)) {
+ $copyTo = 'srcset';
+ } elseif (preg_match('/^\s*\S+\.(jpg|jpeg|png|webp)\S*\s*$/', $attr->value)) {
+ $copyTo = 'src';
+ }
+ if ($copyTo) {
+ //if this is an img or picture, set the attribute directly
+ if ($elem->tagName === 'img' || $elem->tagName === 'picture') {
+ $elem->setAttribute($copyTo, $attr->value);
+ } elseif ($elem->tagName === 'figure' && empty($this->_getAllNodesWithTag($elem, ['img', 'picture']))) {
+ //if the item is a <figure> that does not contain an image or picture, create one and place it inside the figure
+ //see the nytimes-3 testcase for an example
+ $img = $article->createElement('img');
+ $img->setAttribute($copyTo, $attr->value);
+ $elem->appendChild($img);
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Remove the style attribute on every e and under.
*
* @param $node DOMDocument|DOMNode
@@ -1390,20 +1869,20 @@ class Readability
}
/**
- * Clean out elements whose id/class combinations match specific string.
+ * Clean out elements that match the specified conditions
*
* @param $node DOMElement Node to clean
- * @param $regex string Match id/class combination.
+ * @param $filter callable Function determines whether a node should be removed
*
* @return void
**/
- public function _cleanMatchedNodes($node, $regex)
+ public function _cleanMatchedNodes($node, callable $filter)
{
$endOfSearchMarkerNode = NodeUtility::getNextNode($node, true);
$next = NodeUtility::getNextNode($node);
while ($next && $next !== $endOfSearchMarkerNode) {
- if (preg_match($regex, sprintf('%s %s', $next->getAttribute('class'), $next->getAttribute('id')))) {
- $this->logger->debug(sprintf('Removing matched node with regex: \'%s\', node class was: \'%s\', id: \'%s\'', $regex, $next->getAttribute('class'), $next->getAttribute('id')));
+ if ($filter($next, sprintf('%s %s', $next->getAttribute('class'), $next->getAttribute('id')))) {
+ $this->logger->debug(sprintf('Removing matched node, node class was: \'%s\', id: \'%s\'', $next->getAttribute('class'), $next->getAttribute('id')));
$next = NodeUtility::removeAndGetNext($next);
} else {
$next = NodeUtility::getNextNode($next);
@@ -1418,11 +1897,11 @@ class Readability
*/
public function _cleanExtraParagraphs(DOMDocument $article)
{
- $paragraphs = $article->getElementsByTagName('p');
- $length = $paragraphs->length;
+ $paragraphs = $this->_getAllNodesWithTag($article, ['p']);
+ $length = count($paragraphs);
for ($i = 0; $i < $length; $i++) {
- $paragraph = $paragraphs->item($length - 1 - $i);
+ $paragraph = $paragraphs[$length - 1 - $i];
$imgCount = $paragraph->getElementsByTagName('img')->length;
$embedCount = $paragraph->getElementsByTagName('embed')->length;
@@ -1438,6 +1917,19 @@ class Readability
}
}
+ private function getTextDensity($e, array $tags) {
+ $textLength = mb_strlen($e->getTextContent(true));
+ if ($textLength === 0) {
+ return 0;
+ }
+ $childrenLength = 0;
+ $children = $this->_getAllNodesWithTag($e, $tags);
+ foreach ($children as $child) {
+ $childrenLength += mb_strlen($child->getTextContent(true));
+ }
+ return $childrenLength / $textLength;
+ }
+
/**
* @param DOMDocument $article
* @param string $tag Tag to clean conditionally
@@ -1450,27 +1942,53 @@ class Readability
return;
}
- $isList = in_array($tag, ['ul', 'ol']);
-
/*
* Gather counts for other typical elements embedded within.
* Traverse backwards so we can remove nodes at the same time
* without effecting the traversal.
*/
- $DOMNodeList = $article->getElementsByTagName($tag);
- $length = $DOMNodeList->length;
+ $allNodesWithTag = $this->_getAllNodesWithTag($article, [$tag]);
+ $length = count($allNodesWithTag);
for ($i = 0; $i < $length; $i++) {
/** @var $node DOMElement */
- $node = $DOMNodeList->item($length - 1 - $i);
+ $node = $allNodesWithTag[$length - 1 - $i];
+
+ $isList = in_array($tag, ['ul', 'ol']);
+ /*
+ // Doesn't seem to work as expected
+ // compared to JS version: https://github.com/mozilla/readability/commit/3c833899866ffb1f9130767110197fd6f5c08d4c
+ if (!$isList) {
+ $listLength = 0;
+ $listNodes = $this->_getAllNodesWithTag($node, ['ul', 'ol']);
+ array_walk($listNodes, function ($list) use(&$listLength) {
+ $listLength += mb_strlen($list->getTextContent());
+ });
+ $nodeTextLength = mb_strlen($node->getTextContent());
+ if (!$nodeTextLength) {
+ $isList = true;
+ } else {
+ $isList = $listLength / $nodeTextLength > 0.9;
+ }
+ }
+ */
+
+ // First check if this node IS data table, in which case don't remove it.
+ if ($tag === 'table' && $node->isReadabilityDataTable()) {
+ continue;
+ }
- // First check if we're in a data table, in which case don't remove us.
+ // Next check if we're inside a data table, in which case don't remove it as well.
if ($node->hasAncestorTag('table', -1, function ($node) {
return $node->isReadabilityDataTable();
})) {
continue;
}
+ if ($node->hasAncestorTag('code')) {
+ continue;
+ }
+
$weight = 0;
if ($this->configuration->getWeightClasses()) {
$weight = $node->getClassWeight();
@@ -1483,7 +2001,7 @@ class Readability
continue;
}
- if (substr_count($node->getTextContent(), ',') < 10) {
+ if (substr_count($node->getTextContent(false), ',') < 10) {
/*
* If there are not very many commas, and the number of
* non-paragraph elements is more than paragraphs or other
@@ -1494,14 +2012,24 @@ class Readability
$img = $node->getElementsByTagName('img')->length;
$li = $node->getElementsByTagName('li')->length - 100;
$input = $node->getElementsByTagName('input')->length;
+ $headingDensity = $this->getTextDensity($node, ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);
$embedCount = 0;
- $embeds = $node->getElementsByTagName('embed');
+ $embeds = $this->_getAllNodesWithTag($node, ['object', 'embed', 'iframe']);
foreach ($embeds as $embedNode) {
- if (preg_match(NodeUtility::$regexps['videos'], $embedNode->C14N())) {
- $embedCount++;
+ for ($j = 0; $j < $embedNode->attributes->length; $j++) {
+ if (preg_match(NodeUtility::$regexps['videos'], $embedNode->attributes->item($j)->nodeValue)) {
+ continue 3;
+ }
+ }
+
+ // For embed with <object> tag, check inner HTML as well.
+ if ($embedNode->tagName === "object" && preg_match(NodeUtility::$regexps['videos'], $embedNode->C14N())) {
+ continue 2;
}
+
+ $embedCount++;
}
$linkDensity = $node->getLinkDensity();
@@ -1511,7 +2039,7 @@ class Readability
($img > 1 && $p / $img < 0.5 && !$node->hasAncestorTag('figure')) ||
(!$isList && $li > $p) ||
($input > floor($p / 3)) ||
- (!$isList && $contentLength < 25 && ($img === 0 || $img > 2) && !$node->hasAncestorTag('figure')) ||
+ (!$isList && $headingDensity < 0.9 && $contentLength < 25 && ($img === 0 || $img > 2) && !$node->hasAncestorTag('figure')) ||
(!$isList && $weight < 25 && $linkDensity > 0.2) ||
($weight >= 25 && $linkDensity > 0.5) ||
(($embedCount === 1 && $contentLength < 75) || $embedCount > 1);
@@ -1525,6 +2053,17 @@ class Readability
}
}
+ public function _getAllNodesWithTag($node, array $tagNames) {
+ $nodes = [];
+ foreach ($tagNames as $tag) {
+ $nodeList = $node->getElementsByTagName($tag);
+ foreach ($nodeList as $n) {
+ $nodes[] = $n;
+ }
+ }
+ return $nodes;
+ }
+
/**
* Clean a node of all elements of type "tag".
* (Unless it's a youtube/vimeo video. People love movies.).
@@ -1538,10 +2077,10 @@ class Readability
{
$isEmbed = in_array($tag, ['object', 'embed', 'iframe']);
- $DOMNodeList = $article->getElementsByTagName($tag);
- $length = $DOMNodeList->length;
+ $allNodesWithTag = $this->_getAllNodesWithTag($article, [$tag]);
+ $length = count($allNodesWithTag);
for ($i = 0; $i < $length; $i++) {
- $item = $DOMNodeList->item($length - 1 - $i);
+ $item = $allNodesWithTag[$length - 1 - $i];
// Allow youtube and vimeo videos through as people usually want to see those.
if ($isEmbed) {
@@ -1556,8 +2095,8 @@ class Readability
continue;
}
- // Then check the elements inside this element for the same.
- if (preg_match(NodeUtility::$regexps['videos'], $item->C14N())) {
+ // For embed with <object> tag, check inner HTML as well.
+ if ($item->tagName === 'object' && preg_match(NodeUtility::$regexps['videos'], $item->C14N())) {
continue;
}
}
@@ -1568,7 +2107,7 @@ class Readability
}
/**
- * Clean out spurious headers from an Element. Checks things like classnames and link density.
+ * Clean out spurious headers from an Element.
*
* @param DOMDocument $article
*
@@ -1576,25 +2115,43 @@ class Readability
**/
public function _cleanHeaders(DOMDocument $article)
{
- for ($headerIndex = 1; $headerIndex < 3; $headerIndex++) {
- $headers = $article->getElementsByTagName('h' . $headerIndex);
- /** @var $header DOMElement */
- foreach ($headers as $header) {
- $weight = 0;
- if ($this->configuration->getWeightClasses()) {
- $weight = $header->getClassWeight();
- }
+ $headingNodes = $this->_getAllNodesWithTag($article, ['h1', 'h2']);
+ /** @var $header DOMElement */
+ foreach ($headingNodes as $header) {
+ $weight = 0;
+ if ($this->configuration->getWeightClasses()) {
+ $weight = $header->getClassWeight();
+ }
+ $shouldRemove = $weight < 0;
- if ($weight < 0) {
- $this->logger->debug(sprintf('[PrepArticle] Removing H node with 0 or less weight. Content was: \'%s\'', substr($header->nodeValue, 0, 128)));
+ if ($shouldRemove) {
+ $this->logger->debug(sprintf('[PrepArticle] Removing H node with 0 or less weight. Content was: \'%s\'', substr($header->nodeValue, 0, 128)));
- NodeUtility::removeNode($header);
- }
+ NodeUtility::removeNode($header);
}
}
}
/**
+ * Check if this node is an H1 or H2 element whose content is mostly
+ * the same as the article title.
+ *
+ * @param DOMNode the node to check.
+ * @return boolean indicating whether this is a title-like header.
+ */
+ private function headerDuplicatesTitle($node) {
+ if ($node->nodeName !== 'h1' && $node->nodeName !== 'h2') {
+ return false;
+ }
+ if (!isset($this->title)) {
+ return false;
+ }
+ $heading = $node->getTextContent(false);
+ $this->logger->debug(sprintf('Evaluating similarity of header: %s"', $heading));
+ return $this->textSimilarity($this->title, $heading) > 0.75;
+ }
+
+ /**
* Removes the class="" attribute from every element in the given
* subtree.
*
@@ -1631,13 +2188,23 @@ class Readability
/** @var DOMElement $link */
$href = $link->getAttribute('href');
if ($href) {
- // Replace links with javascript: URIs with text content, since
+ // Remove links with javascript: URIs, since
// they won't work after scripts have been removed from the page.
if (strpos($href, 'javascript:') === 0) {
$this->logger->debug(sprintf('[PostProcess] Removing \'javascript:\' link. Content is: \'%s\'', substr($link->textContent, 0, 128)));
- $text = $article->createTextNode($link->textContent);
- $link->parentNode->replaceChild($text, $link);
+ // if the link only contains simple text content, it can be converted to a text node
+ if ($link->childNodes->length === 1 && $link->childNodes->item(0)->nodeType === XML_TEXT_NODE) {
+ $text = $article->createTextNode($link->textContent);
+ $link->parentNode->replaceChild($text, $link);
+ } else {
+ // if the link has multiple children, they should all be preserved
+ $container = $article->createElement('span');
+ while ($link->firstChild) {
+ $container->appendChild($link->firstChild);
+ }
+ $link->parentNode->replaceChild($container, $link);
+ }
} else {
$this->logger->debug(sprintf('[PostProcess] Converting link to absolute URI: \'%s\'', substr($href, 0, 128)));
@@ -1646,35 +2213,67 @@ class Readability
}
}
- foreach ($article->getElementsByTagName('img') as $img) {
- /** @var DOMElement $img */
- /*
- * Extract all possible sources of img url and select the first one on the list.
- */
- $url = [
- $img->getAttribute('src'),
- $img->getAttribute('data-src'),
- $img->getAttribute('data-original'),
- $img->getAttribute('data-orig'),
- $img->getAttribute('data-url')
- ];
-
- $src = array_filter($url);
- $src = reset($src);
+ $medias = $this->_getAllNodesWithTag($article, [
+ 'img', 'picture', 'figure', 'video', 'audio', 'source'
+ ]);
+
+ array_walk($medias, function ($media) {
+ $src = $media->getAttribute('src');
+ $poster = $media->getAttribute('poster');
+ $srcset = $media->getAttribute('srcset');
+
if ($src) {
$this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($src, 0, 128)));
- $img->setAttribute('src', $this->toAbsoluteURI($src));
+ $media->setAttribute('src', $this->toAbsoluteURI($src));
}
- }
+
+ if ($poster) {
+ $this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($poster, 0, 128)));
+
+ $media->setAttribute('poster', $this->toAbsoluteURI($poster));
+ }
+
+ if ($srcset) {
+ $newSrcset = preg_replace_callback(NodeUtility::$regexps['srcsetUrl'], function ($matches) {
+ $this->logger->debug(sprintf('[PostProcess] Converting image URL to absolute URI: \'%s\'', substr($matches[1], 0, 128)));
+
+ return $this->toAbsoluteURI($matches[1]) . $matches[2] . $matches[3];
+ }, $srcset);
+
+ $media->setAttribute('srcset', $newSrcset);
+ }
+ });
}
- $this->_cleanClasses($article);
+ $this->simplifyNestedElements($article);
+
+ if (!$this->configuration->getKeepClasses()) {
+ $this->_cleanClasses($article);
+ }
return $article;
}
/**
+ * Iterate over a NodeList, and return the first node that passes
+ * the supplied test function
+ *
+ * @param NodeList nodeList The NodeList.
+ * @param Function fn The test function.
+ * @return DOMNode|null
+ */
+ private function findNode(array $nodeList, callable $fn)
+ {
+ foreach ($nodeList as $node) {
+ if ($fn($node)) {
+ return $node;
+ }
+ }
+ return null;
+ }
+
+ /**
* @return null|string
*/
public function __toString()
@@ -1703,7 +2302,14 @@ class Readability
*/
public function getContent()
{
- return ($this->content instanceof DOMDocument) ? $this->content->C14N() : null;
+ if ($this->content instanceof DOMDocument) {
+ $html5 = new HTML5(['disable_html_ns' => true]);
+ // by using childNodes below we make sure HTML5PHP's serialiser
+ // doesn't output the <!DOCTYPE html> string at the start.
+ return $html5->saveHTML($this->content->childNodes);
+ } else {
+ return null;
+ }
}
/**
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/ConfigurationTest.php b/plugins/af_readability/vendor/fivefilters/readability.php/test/ConfigurationTest.php
index b3810ed73..d08065fab 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/ConfigurationTest.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/ConfigurationTest.php
@@ -1,8 +1,8 @@
<?php
-namespace andreskrey\Readability\Test;
+namespace fivefilters\Readability\Test;
-use andreskrey\Readability\Configuration;
+use fivefilters\Readability\Configuration;
use Monolog\Handler\NullHandler;
use Monolog\Logger;
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/ReadabilityTest.php b/plugins/af_readability/vendor/fivefilters/readability.php/test/ReadabilityTest.php
index ca208e894..dafd54021 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/ReadabilityTest.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/ReadabilityTest.php
@@ -1,10 +1,10 @@
<?php
-namespace andreskrey\Readability\Test;
+namespace fivefilters\Readability\Test;
-use andreskrey\Readability\Configuration;
-use andreskrey\Readability\ParseException;
-use andreskrey\Readability\Readability;
+use fivefilters\Readability\Configuration;
+use fivefilters\Readability\ParseException;
+use fivefilters\Readability\Readability;
/**
* Class ReadabilityTest.
@@ -33,7 +33,30 @@ class ReadabilityTest extends \PHPUnit\Framework\TestCase
$readability = new Readability($configuration);
$readability->parse($testPage->getSourceHTML());
- $this->assertSame($testPage->getExpectedHTML(), $readability->getContent(), 'Parsed text does not match the expected one.');
+ // Let's (crudely) remove whitespace between tags here to simplify comparison.
+ // This isn't used for output.
+ $from = ['/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/> </s'];
+ $to = ['>', '<', '\\1', '><'];
+ $expected_no_whitespace = preg_replace($from, $to, $testPage->getExpectedHTML());
+ $readability_no_whitespace = preg_replace($from, $to, $readability->getContent());
+
+ if (getenv('output-changes') && $expected_no_whitespace !== $readability_no_whitespace) {
+ @mkdir(__DIR__.'/changed/'.$testPage->getSlug());
+ $new_expected = __DIR__.'/changed/'.$testPage->getSlug().'/expected.html';
+ $old_expected = __DIR__.'/test-pages/'.$testPage->getSlug().'/expected.html';
+ //file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/readability.html', $readability_no_whitespace);
+ //file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/expected-current.html', $expected_no_whitespace);
+ file_put_contents($new_expected, $readability->getContent());
+ if (getenv('output-diff')) {
+ file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/diff-expected.txt', shell_exec(sprintf('diff -u -d %s %s', $old_expected, $new_expected)));
+ }
+
+ }
+
+ $this->assertSame($expected_no_whitespace, $readability_no_whitespace, 'Parsed text does not match the expected one.');
+
+ //$this->assertSame($testPage->getExpectedHTML(), $readability->getContent(), 'Parsed text does not match the expected one.');
+ //$this->assertXmlStringEqualsXmlString($testPage->getExpectedHTML(), $readability->getContent(), 'Parsed text does not match the expected one.');
}
/**
@@ -58,6 +81,26 @@ class ReadabilityTest extends \PHPUnit\Framework\TestCase
$readability = new Readability($configuration);
$readability->parse($testPage->getSourceHTML());
+ $metadata = [
+ 'Author' => $readability->getAuthor(),
+ 'Direction' => $readability->getDirection(),
+ 'Excerpt' => $readability->getExcerpt(),
+ 'Image' => $readability->getImage(),
+ 'Title' => $readability->getTitle(),
+ 'SiteName' => $readability->getSiteName()
+ ];
+
+ if (getenv('output-changes') && (array)$testPage->getExpectedMetadata() !== $metadata) {
+ @mkdir(__DIR__.'/changed/'.$testPage->getSlug());
+ $new_expected = __DIR__.'/changed/'.$testPage->getSlug().'/expected-metadata.json';
+ $old_expected = __DIR__.'/test-pages/'.$testPage->getSlug().'/expected-metadata.json';
+ //file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/expected-metadata-current.json', json_encode($testPage->getExpectedMetadata(), JSON_PRETTY_PRINT));
+ file_put_contents($new_expected, json_encode((object)$metadata, JSON_PRETTY_PRINT));
+ if (getenv('output-diff')) {
+ file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/diff-expected-metadata.txt', shell_exec(sprintf('diff -u -d %s %s', $old_expected, $new_expected)));
+ }
+ }
+
$this->assertSame($testPage->getExpectedMetadata()->Author, $readability->getAuthor(), 'Parsed Author does not match expected value.');
$this->assertSame($testPage->getExpectedMetadata()->Direction, $readability->getDirection(), 'Parsed Direction does not match expected value.');
$this->assertSame($testPage->getExpectedMetadata()->Excerpt, $readability->getExcerpt(), 'Parsed Excerpt does not match expected value.');
@@ -85,7 +128,18 @@ class ReadabilityTest extends \PHPUnit\Framework\TestCase
$readability = new Readability($configuration);
$readability->parse($testPage->getSourceHTML());
- $this->assertSame($testPage->getExpectedImages(), $readability->getImages());
+ if (getenv('output-changes') && $testPage->getExpectedImages() !== array_values($readability->getImages())) {
+ @mkdir(__DIR__.'/changed/'.$testPage->getSlug());
+ $new_expected = __DIR__.'/changed/'.$testPage->getSlug().'/expected-images.json';
+ $old_expected = __DIR__.'/test-pages/'.$testPage->getSlug().'/expected-images.json';
+ //file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/expected-images-current.json', json_encode($testPage->getExpectedImages(), JSON_PRETTY_PRINT));
+ file_put_contents($new_expected, json_encode(array_values($readability->getImages()), JSON_PRETTY_PRINT));
+ if (getenv('output-diff')) {
+ file_put_contents(__DIR__.'/changed/'.$testPage->getSlug().'/diff-expected-images.txt', shell_exec(sprintf('diff -u -d %s %s', $old_expected, $new_expected)));
+ }
+ }
+
+ $this->assertSame($testPage->getExpectedImages(), array_values($readability->getImages()));
}
/**
@@ -101,13 +155,14 @@ class ReadabilityTest extends \PHPUnit\Framework\TestCase
foreach (array_slice($testPages, 2) as $testPage) {
$testCasePath = $path . DIRECTORY_SEPARATOR . $testPage . DIRECTORY_SEPARATOR;
+ $slug = $testPage;
$source = file_get_contents($testCasePath . 'source.html');
- $expectedHTML = file_get_contents($testCasePath . 'expected.html');
- $expectedImages = json_decode(file_get_contents($testCasePath . 'expected-images.json'), true);
- $expectedMetadata = json_decode(file_get_contents($testCasePath . 'expected-metadata.json'));
+ $expectedHTML = file_exists($testCasePath . 'expected.html') ? file_get_contents($testCasePath . 'expected.html') : '';
+ $expectedImages = file_exists($testCasePath . 'expected-images.json') ? json_decode(file_get_contents($testCasePath . 'expected-images.json'), true) : [];
+ $expectedMetadata = file_exists($testCasePath . 'expected-metadata.json') ? json_decode(file_get_contents($testCasePath . 'expected-metadata.json')) : (object)[];
$configuration = file_exists($testCasePath . 'config.json') ? json_decode(file_get_contents($testCasePath . 'config.json'), true) : [];
- yield $testPage => [new TestPage($configuration, $source, $expectedHTML, $expectedImages, $expectedMetadata)];
+ yield $testPage => [new TestPage($slug, $configuration, $source, $expectedHTML, $expectedImages, $expectedMetadata)];
}
}
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/TestPage.php b/plugins/af_readability/vendor/fivefilters/readability.php/test/TestPage.php
index ed6f92e7c..8cce347cd 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/TestPage.php
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/TestPage.php
@@ -1,17 +1,19 @@
<?php
-namespace andreskrey\Readability\Test;
+namespace fivefilters\Readability\Test;
class TestPage
{
+ private $slug;
private $configuration;
private $sourceHTML;
private $expectedHTML;
private $expectedImages;
private $expectedMetadata;
- public function __construct($configuration, $sourceHTML, $expectedHTML, $expectedImages, $expectedMetadata)
+ public function __construct($slug, $configuration, $sourceHTML, $expectedHTML, $expectedImages, $expectedMetadata)
{
+ $this->slug = $slug;
$this->configuration = $configuration;
$this->sourceHTML = $sourceHTML;
$this->expectedHTML = $expectedHTML;
@@ -20,6 +22,14 @@ class TestPage
}
/**
+ * @return string
+ */
+ public function getSlug()
+ {
+ return $this->slug;
+ }
+
+ /**
* @return array
*/
public function getConfiguration()
@@ -28,7 +38,7 @@ class TestPage
}
/**
- * @return null
+ * @return string
*/
public function getSourceHTML()
{
@@ -36,7 +46,7 @@ class TestPage
}
/**
- * @return null
+ * @return string
*/
public function getExpectedHTML()
{
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/001/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/001/expected.html
index e05810ff7..0998436c5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/001/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/001/expected.html
@@ -1,4 +1,5 @@
-<section><p><strong>So finally you're <a href="http://fakehost/code/2013/testing-frontend-javascript-code-using-mocha-chai-and-sinon/">testing your frontend JavaScript code</a>? Great! The more you
+<section>
+ <p><strong>So finally you're <a href="http://fakehost/code/2013/testing-frontend-javascript-code-using-mocha-chai-and-sinon/">testing your frontend JavaScript code</a>? Great! The more you
write tests, the more confident you are with your code… but how much precisely?
That's where <a href="http://en.wikipedia.org/wiki/Code_coverage">code coverage</a> might
help.</strong>
@@ -15,9 +16,9 @@ help.</strong>
actually works…</p>
<blockquote>
<p>Drinking game for web devs:
- <br></br>(1) Think of a noun
- <br></br>(2) Google "&lt;noun&gt;.js"
- <br></br>(3) If a library with that name exists - drink</p>— Shay Friedman (@ironshay)
+ <br>(1) Think of a noun
+ <br>(2) Google "&lt;noun&gt;.js"
+ <br>(3) If a library with that name exists - drink</p>— Shay Friedman (@ironshay)
<a href="https://twitter.com/ironshay/statuses/370525864523743232">August 22, 2013</a>
</blockquote>
<p><strong><a href="http://blanketjs.org/">Blanket.js</a></strong> is an <em>easy to install, easy to configure,
@@ -105,13 +106,16 @@ describe("Cow", function() {
</code></pre>
<p><strong>Notes</strong>:</p>
- <ul><li>Notice the <code>data-cover</code> attribute we added to the script tag
+ <ul>
+ <li>Notice the <code>data-cover</code> attribute we added to the script tag
loading the source of our library;</li>
<li>The HTML test file <em>must</em> be served over HTTP for the adapter to
be loaded.</li>
- </ul><p>Running the tests now gives us something like this:</p>
+ </ul>
+ <p>Running the tests now gives us something like this:</p>
<p>
- <img alt="screenshot" src="http://fakehost/static/code/2013/blanket-coverage.png"></img></p>
+ <img alt="screenshot" src="http://fakehost/static/code/2013/blanket-coverage.png">
+ </p>
<p>As you can see, the report at the bottom highlights that we haven't actually
tested the case where an error is raised in case a target name is missing.
We've been informed of that, nothing more, nothing less. We simply know
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/002/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/002/expected.html
index 0525100d6..564f9a915 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/002/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/002/expected.html
@@ -1,4 +1,6 @@
-<div id="content-main"><article role="article"><p>For more than a decade the Web has used XMLHttpRequest (XHR) to achieve
+<div id="content-main">
+ <article role="article">
+ <p>For more than a decade the Web has used XMLHttpRequest (XHR) to achieve
asynchronous requests in JavaScript. While very useful, XHR is not a very
nice API. It suffers from lack of separation of concerns. The input, output
and state are all managed by interacting with one object, and state is
@@ -13,10 +15,12 @@
<p>The <a href="https://fetch.spec.whatwg.org">Fetch specification</a>, which
defines the API, nails down the semantics of a user agent fetching a resource.
This, combined with ServiceWorkers, is an attempt to:</p>
- <ol><li>Improve the offline experience.</li>
+ <ol>
+ <li>Improve the offline experience.</li>
<li>Expose the building blocks of the Web to the platform as part of the
<a href="https://extensiblewebmanifesto.org/">extensible web movement</a>.</li>
- </ol><p>As of this writing, the Fetch API is available in Firefox 39 (currently
+ </ol>
+ <p>As of this writing, the Fetch API is available in Firefox 39 (currently
Nightly) and Chrome 42 (currently dev). Github has a <a href="https://github.com/github/fetch">Fetch polyfill</a>.</p>
<h2>Feature detection</h2>
@@ -29,8 +33,7 @@
<p>The most useful, high-level part of the Fetch API is the <code>fetch()</code> function.
In its simplest form it takes a URL and returns a promise that resolves
to the response. The response is captured as a <code>Response</code> object.</p>
- <div>
- <div><pre>fetch<span>(</span><span>"/data.json"</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
+ <div><pre>fetch<span>(</span><span>"/data.json"</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
<span>// res instanceof Response == true.</span>
<span>if</span> <span>(</span>res.<span>ok</span><span>)</span> <span>{</span>
res.<span>json</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>data<span>)</span> <span>{</span>
@@ -42,10 +45,9 @@
<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
console.<span>log</span><span>(</span><span>"Fetch failed!"</span><span>,</span> e<span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>Submitting some parameters, it would look like this:</p>
- <div>
- <div><pre>fetch<span>(</span><span>"http://www.example.org/submit.php"</span><span>,</span> <span>{</span>
+ <div><pre>fetch<span>(</span><span>"http://www.example.org/submit.php"</span><span>,</span> <span>{</span>
method<span>:</span> <span>"POST"</span><span>,</span>
headers<span>:</span> <span>{</span>
<span>"Content-Type"</span><span>:</span> <span>"application/x-www-form-urlencoded"</span>
@@ -60,84 +62,84 @@
<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
alert<span>(</span><span>"Error submitting form!"</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>The <code>fetch()</code> function’s arguments are the same as those passed
to the
- <br></br><code>Request()</code> constructor, so you may directly pass arbitrarily
+ <br>
+<code>Request()</code> constructor, so you may directly pass arbitrarily
complex requests to <code>fetch()</code> as discussed below.</p>
<h2>Headers</h2>
<p>Fetch introduces 3 interfaces. These are <code>Headers</code>, <code>Request</code> and
- <br></br><code>Response</code>. They map directly to the underlying HTTP concepts,
+ <br>
+<code>Response</code>. They map directly to the underlying HTTP concepts,
but have
- <br></br>certain visibility filters in place for privacy and security reasons,
+ <br>certain visibility filters in place for privacy and security reasons,
such as
- <br></br>supporting CORS rules and ensuring cookies aren’t readable by third parties.</p>
+ <br>supporting CORS rules and ensuring cookies aren’t readable by third parties.</p>
<p>The <a href="https://fetch.spec.whatwg.org/#headers-class">Headers interface</a> is
a simple multi-map of names to values:</p>
- <div>
- <div><pre><span>var</span> content <span>=</span> <span>"Hello World"</span><span>;</span>
+ <div><pre><span>var</span> content <span>=</span> <span>"Hello World"</span><span>;</span>
<span>var</span> reqHeaders <span>=</span> <span>new</span> Headers<span>(</span><span>)</span><span>;</span>
reqHeaders.<span>append</span><span>(</span><span>"Content-Type"</span><span>,</span> <span>"text/plain"</span>
reqHeaders.<span>append</span><span>(</span><span>"Content-Length"</span><span>,</span> content.<span>length</span>.<span>toString</span><span>(</span><span>)</span><span>)</span><span>;</span>
reqHeaders.<span>append</span><span>(</span><span>"X-Custom-Header"</span><span>,</span> <span>"ProcessThisImmediately"</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>The same can be achieved by passing an array of arrays or a JS object
literal
- <br></br>to the constructor:</p>
- <div>
- <div><pre>reqHeaders <span>=</span> <span>new</span> Headers<span>(</span><span>{</span>
+ <br>to the constructor:</p>
+ <div><pre>reqHeaders <span>=</span> <span>new</span> Headers<span>(</span><span>{</span>
<span>"Content-Type"</span><span>:</span> <span>"text/plain"</span><span>,</span>
<span>"Content-Length"</span><span>:</span> content.<span>length</span>.<span>toString</span><span>(</span><span>)</span><span>,</span>
<span>"X-Custom-Header"</span><span>:</span> <span>"ProcessThisImmediately"</span><span>,</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>The contents can be queried and retrieved:</p>
- <div>
- <div><pre>console.<span>log</span><span>(</span>reqHeaders.<span>has</span><span>(</span><span>"Content-Type"</span><span>)</span><span>)</span><span>;</span> <span>// true</span>
+ <div><pre>console.<span>log</span><span>(</span>reqHeaders.<span>has</span><span>(</span><span>"Content-Type"</span><span>)</span><span>)</span><span>;</span> <span>// true</span>
console.<span>log</span><span>(</span>reqHeaders.<span>has</span><span>(</span><span>"Set-Cookie"</span><span>)</span><span>)</span><span>;</span> <span>// false</span>
reqHeaders.<span>set</span><span>(</span><span>"Content-Type"</span><span>,</span> <span>"text/html"</span><span>)</span><span>;</span>
reqHeaders.<span>append</span><span>(</span><span>"X-Custom-Header"</span><span>,</span> <span>"AnotherValue"</span><span>)</span><span>;</span>
+&nbsp;
console.<span>log</span><span>(</span>reqHeaders.<span>get</span><span>(</span><span>"Content-Length"</span><span>)</span><span>)</span><span>;</span> <span>// 11</span>
console.<span>log</span><span>(</span>reqHeaders.<span>getAll</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>)</span><span>;</span> <span>// ["ProcessThisImmediately", "AnotherValue"]</span>
+&nbsp;
reqHeaders.<span>delete</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>reqHeaders.<span>getAll</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>)</span><span>;</span> <span>// []</span></pre>
- </div></div>
+ </div>
<p>Some of these operations are only useful in ServiceWorkers, but they provide
- <br></br>a much nicer API to Headers.</p>
+ <br>a much nicer API to Headers.</p>
<p>Since Headers can be sent in requests, or received in responses, and have
various limitations about what information can and should be mutable, <code>Headers</code> objects
have a <strong>guard</strong> property. This is not exposed to the Web, but
it affects which mutation operations are allowed on the Headers object.
- <br></br>Possible values are:</p>
- <ul><li>“none”: default.</li>
+ <br>Possible values are:</p>
+ <ul>
+ <li>“none”: default.</li>
<li>“request”: guard for a Headers object obtained from a Request (<code>Request.headers</code>).</li>
<li>“request-no-cors”: guard for a Headers object obtained from a Request
created
- <br></br>with mode “no-cors”.</li>
+ <br>with mode “no-cors”.</li>
<li>“response”: naturally, for Headers obtained from Response (<code>Response.headers</code>).</li>
<li>“immutable”: Mostly used for ServiceWorkers, renders a Headers object
- <br></br>read-only.</li>
- </ul><p>The details of how each guard affects the behaviors of the Headers object
+ <br>read-only.</li>
+ </ul>
+ <p>The details of how each guard affects the behaviors of the Headers object
are
- <br></br>in the <a href="https://fetch.spec.whatwg.org">specification</a>. For example,
+ <br>in the <a href="https://fetch.spec.whatwg.org">specification</a>. For example,
you may not append or set a “request” guarded Headers’ “Content-Length”
header. Similarly, inserting “Set-Cookie” into a Response header is not
allowed so that ServiceWorkers may not set cookies via synthesized Responses.</p>
<p>All of the Headers methods throw TypeError if <code>name</code> is not a
<a href="https://fetch.spec.whatwg.org/#concept-header-name">valid HTTP Header name</a>. The mutation operations will throw TypeError
if there is an immutable guard. Otherwise they fail silently. For example:</p>
- <div>
- <div><pre><span>var</span> res <span>=</span> Response.<span>error</span><span>(</span><span>)</span><span>;</span>
+ <div><pre><span>var</span> res <span>=</span> Response.<span>error</span><span>(</span><span>)</span><span>;</span>
<span>try</span> <span>{</span>
res.<span>headers</span>.<span>set</span><span>(</span><span>"Origin"</span><span>,</span> <span>"http://mybank.com"</span><span>)</span><span>;</span>
<span>}</span> <span>catch</span><span>(</span>e<span>)</span> <span>{</span>
console.<span>log</span><span>(</span><span>"Cannot pretend to be a bank!"</span><span>)</span><span>;</span>
<span>}</span></pre>
- </div></div>
+ </div>
<h2>Request</h2>
@@ -146,34 +148,31 @@ console.<span>log</span><span>(</span>reqHeaders.<span>getAll</span><span>(</spa
a body, a request mode, credentials and cache hints.</p>
<p>The simplest Request is of course, just a URL, as you may do to GET a
resource.</p>
- <div>
- <div><pre><span>var</span> req <span>=</span> <span>new</span> Request<span>(</span><span>"/index.html"</span><span>)</span><span>;</span>
+ <div><pre><span>var</span> req <span>=</span> <span>new</span> Request<span>(</span><span>"/index.html"</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>req.<span>method</span><span>)</span><span>;</span> <span>// "GET"</span>
console.<span>log</span><span>(</span>req.<span>url</span><span>)</span><span>;</span> <span>// "http://example.com/index.html"</span></pre>
- </div></div>
+ </div>
<p>You may also pass a Request to the <code>Request()</code> constructor to
create a copy.
- <br></br>(This is not the same as calling the <code>clone()</code> method, which
+ <br>(This is not the same as calling the <code>clone()</code> method, which
is covered in
- <br></br>the “Reading bodies” section.).</p>
- <div>
- <div><pre><span>var</span> copy <span>=</span> <span>new</span> Request<span>(</span>req<span>)</span><span>;</span>
+ <br>the “Reading bodies” section.).</p>
+ <div><pre><span>var</span> copy <span>=</span> <span>new</span> Request<span>(</span>req<span>)</span><span>;</span>
console.<span>log</span><span>(</span>copy.<span>method</span><span>)</span><span>;</span> <span>// "GET"</span>
console.<span>log</span><span>(</span>copy.<span>url</span><span>)</span><span>;</span> <span>// "http://example.com/index.html"</span></pre>
- </div></div>
+ </div>
<p>Again, this form is probably only useful in ServiceWorkers.</p>
<p>The non-URL attributes of the <code>Request</code> can only be set by passing
initial
- <br></br>values as a second argument to the constructor. This argument is a dictionary.</p>
- <div>
- <div><pre><span>var</span> uploadReq <span>=</span> <span>new</span> Request<span>(</span><span>"/uploadImage"</span><span>,</span> <span>{</span>
+ <br>values as a second argument to the constructor. This argument is a dictionary.</p>
+ <div><pre><span>var</span> uploadReq <span>=</span> <span>new</span> Request<span>(</span><span>"/uploadImage"</span><span>,</span> <span>{</span>
method<span>:</span> <span>"POST"</span><span>,</span>
headers<span>:</span> <span>{</span>
<span>"Content-Type"</span><span>:</span> <span>"image/png"</span><span>,</span>
<span>}</span><span>,</span>
body<span>:</span> <span>"image data"</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>The Request’s mode is used to determine if cross-origin requests lead
to valid responses, and which properties on the response are readable.
Legal mode values are <code>"same-origin"</code>, <code>"no-cors"</code> (default)
@@ -181,15 +180,14 @@ console.<span>log</span><span>(</span>copy.<span>url</span><span>)</span><span>;
<p>The <code>"same-origin"</code> mode is simple, if a request is made to another
origin with this mode set, the result is simply an error. You could use
this to ensure that
- <br></br>a request is always being made to your origin.</p>
- <div>
- <div><pre><span>var</span> arbitraryUrl <span>=</span> document.<span>getElementById</span><span>(</span><span>"url-input"</span><span>)</span>.<span>value</span><span>;</span>
+ <br>a request is always being made to your origin.</p>
+ <div><pre><span>var</span> arbitraryUrl <span>=</span> document.<span>getElementById</span><span>(</span><span>"url-input"</span><span>)</span>.<span>value</span><span>;</span>
fetch<span>(</span>arbitraryUrl<span>,</span> <span>{</span> mode<span>:</span> <span>"same-origin"</span> <span>}</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
console.<span>log</span><span>(</span><span>"Response succeeded?"</span><span>,</span> res.<span>ok</span><span>)</span><span>;</span>
<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
console.<span>log</span><span>(</span><span>"Please enter a same-origin URL!"</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>The <code>"no-cors"</code> mode captures what the web platform does by default
for scripts you import from CDNs, images hosted on other domains, and so
on. First, it prevents the method from being anything other than “HEAD”,
@@ -202,20 +200,19 @@ fetch<span>(</span>arbitraryUrl<span>,</span> <span>{</span> mode<span>:</span>
<p><code>"cors"</code> mode is what you’ll usually use to make known cross-origin
requests to access various APIs offered by other vendors. These are expected
to adhere to
- <br></br>the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS">CORS protocol</a>.
+ <br>the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS">CORS protocol</a>.
Only a <a href="https://fetch.spec.whatwg.org/#concept-filtered-response-cors">limited set</a> of
headers is exposed in the Response, but the body is readable. For example,
you could get a list of Flickr’s <a href="https://www.flickr.com/services/api/flickr.interestingness.getList.html">most interesting</a> photos
today like this:</p>
- <div>
- <div><pre><span>var</span> u <span>=</span> <span>new</span> URLSearchParams<span>(</span><span>)</span><span>;</span>
+ <div><pre><span>var</span> u <span>=</span> <span>new</span> URLSearchParams<span>(</span><span>)</span><span>;</span>
u.<span>append</span><span>(</span><span>'method'</span><span>,</span> <span>'flickr.interestingness.getList'</span><span>)</span><span>;</span>
u.<span>append</span><span>(</span><span>'api_key'</span><span>,</span> <span>'&lt;insert api key here&gt;'</span><span>)</span><span>;</span>
u.<span>append</span><span>(</span><span>'format'</span><span>,</span> <span>'json'</span><span>)</span><span>;</span>
u.<span>append</span><span>(</span><span>'nojsoncallback'</span><span>,</span> <span>'1'</span><span>)</span><span>;</span>
+&nbsp;
<span>var</span> apiCall <span>=</span> fetch<span>(</span><span>'https://api.flickr.com/services/rest?'</span> <span>+</span> u<span>)</span><span>;</span>
+&nbsp;
apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>response<span>)</span> <span>{</span>
<span>return</span> response.<span>json</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>json<span>)</span> <span>{</span>
<span>// photo is a list of photos.</span>
@@ -226,25 +223,26 @@ apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>respon
console.<span>log</span><span>(</span>photo.<span>title</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>You may not read out the “Date” header since Flickr does not allow it
via
- <br></br><code>Access-Control-Expose-Headers</code>.</p>
- <div>
- <div><pre>response.<span>headers</span>.<span>get</span><span>(</span><span>"Date"</span><span>)</span><span>;</span> <span>// null</span></pre>
- </div></div>
+ <br>
+<code>Access-Control-Expose-Headers</code>.</p>
+ <div><pre>response.<span>headers</span>.<span>get</span><span>(</span><span>"Date"</span><span>)</span><span>;</span> <span>// null</span></pre>
+ </div>
<p>The <code>credentials</code> enumeration determines if cookies for the other
domain are
- <br></br>sent to cross-origin requests. This is similar to XHR’s <code>withCredentials</code>
- <br></br>flag, but tri-valued as <code>"omit"</code> (default), <code>"same-origin"</code> and <code>"include"</code>.</p>
+ <br>sent to cross-origin requests. This is similar to XHR’s <code>withCredentials</code>
+ <br>flag, but tri-valued as <code>"omit"</code> (default), <code>"same-origin"</code> and <code>"include"</code>.</p>
<p>The Request object will also give the ability to offer caching hints to
the user-agent. This is currently undergoing some <a href="https://github.com/slightlyoff/ServiceWorker/issues/585">security review</a>.
Firefox exposes the attribute, but it has no effect.</p>
<p>Requests have two read-only attributes that are relevant to ServiceWorkers
- <br></br>intercepting them. There is the string <code>referrer</code>, which is
+ <br>intercepting them. There is the string <code>referrer</code>, which is
set by the UA to be
- <br></br>the referrer of the Request. This may be an empty string. The other is
- <br></br><code>context</code> which is a rather <a href="https://fetch.spec.whatwg.org/#requestcredentials">large enumeration</a> defining
+ <br>the referrer of the Request. This may be an empty string. The other is
+ <br>
+<code>context</code> which is a rather <a href="https://fetch.spec.whatwg.org/#requestcredentials">large enumeration</a> defining
what sort of resource is being fetched. This could be “image” if the request
is from an
&lt;img&gt;tag in the controlled document, “worker” if it is an attempt to load a
@@ -265,39 +263,40 @@ apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>respon
The <code>url</code> attribute reflects the URL of the corresponding request.</p>
<p>Response also has a <code>type</code>, which is “basic”, “cors”, “default”,
“error” or
- <br></br>“opaque”.</p>
- <ul><li><code>"basic"</code>: normal, same origin response, with all headers exposed
+ <br>“opaque”.</p>
+ <ul>
+ <li><code>"basic"</code>: normal, same origin response, with all headers exposed
except
- <br></br>“Set-Cookie” and “Set-Cookie2″.</li>
+ <br>“Set-Cookie” and “Set-Cookie2″.</li>
<li><code>"cors"</code>: response was received from a valid cross-origin request.
<a href="https://fetch.spec.whatwg.org/#concept-filtered-response-cors">Certain headers and the body</a>may be accessed.</li>
<li><code>"error"</code>: network error. No useful information describing
the error is available. The Response’s status is 0, headers are empty and
immutable. This is the type for a Response obtained from <code>Response.error()</code>.</li>
<li><code>"opaque"</code>: response for “no-cors” request to cross-origin
- resource. <a href="https://fetch.spec.whatwg.org/#concept-filtered-response-opaque">Severely<br></br>
+ resource. <a href="https://fetch.spec.whatwg.org/#concept-filtered-response-opaque">Severely<br>
restricted</a>
</li>
- </ul><p>The “error” type results in the <code>fetch()</code> Promise rejecting with
+ </ul>
+ <p>The “error” type results in the <code>fetch()</code> Promise rejecting with
TypeError.</p>
<p>There are certain attributes that are useful only in a ServiceWorker scope.
The
- <br></br>idiomatic way to return a Response to an intercepted request in ServiceWorkers
+ <br>idiomatic way to return a Response to an intercepted request in ServiceWorkers
is:</p>
- <div>
- <div><pre>addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>event<span>)</span> <span>{</span>
+ <div><pre>addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>event<span>)</span> <span>{</span>
event.<span>respondWith</span><span>(</span><span>new</span> Response<span>(</span><span>"Response body"</span><span>,</span> <span>{</span>
headers<span>:</span> <span>{</span> <span>"Content-Type"</span> <span>:</span> <span>"text/plain"</span> <span>}</span>
<span>}</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>As you can see, Response has a two argument constructor, where both arguments
are optional. The first argument is a body initializer, and the second
is a dictionary to set the <code>status</code>, <code>statusText</code> and <code>headers</code>.</p>
<p>The static method <code>Response.error()</code> simply returns an error
response. Similarly, <code>Response.redirect(url, status)</code> returns
a Response resulting in
- <br></br>a redirect to <code>url</code>.</p>
+ <br>a redirect to <code>url</code>.</p>
<h2>Dealing with bodies</h2>
@@ -305,7 +304,8 @@ apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>respon
over it because of the various data types body may contain, but we will
cover it in detail now.</p>
<p>A body is an instance of any of the following types.</p>
- <ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer">ArrayBuffer</a>
+ <ul>
+ <li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer">ArrayBuffer</a>
</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView">ArrayBufferView</a> (Uint8Array
and friends)</li>
@@ -318,10 +318,12 @@ apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>respon
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/FormData">FormData</a> –
currently not supported by either Gecko or Blink. Firefox expects to ship
this in version 39 along with the rest of Fetch.</li>
- </ul><p>In addition, Request and Response both offer the following methods to
+ </ul>
+ <p>In addition, Request and Response both offer the following methods to
extract their body. These all return a Promise that is eventually resolved
with the actual content.</p>
- <ul><li><code>arrayBuffer()</code>
+ <ul>
+ <li><code>arrayBuffer()</code>
</li>
<li><code>blob()</code>
</li>
@@ -331,21 +333,20 @@ apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>respon
</li>
<li><code>formData()</code>
</li>
- </ul><p>This is a significant improvement over XHR in terms of ease of use of
+ </ul>
+ <p>This is a significant improvement over XHR in terms of ease of use of
non-text data!</p>
<p>Request bodies can be set by passing <code>body</code> parameters:</p>
- <div>
- <div><pre><span>var</span> form <span>=</span> <span>new</span> FormData<span>(</span>document.<span>getElementById</span><span>(</span><span>'login-form'</span><span>)</span><span>)</span><span>;</span>
+ <div><pre><span>var</span> form <span>=</span> <span>new</span> FormData<span>(</span>document.<span>getElementById</span><span>(</span><span>'login-form'</span><span>)</span><span>)</span><span>;</span>
fetch<span>(</span><span>"/login"</span><span>,</span> <span>{</span>
method<span>:</span> <span>"POST"</span><span>,</span>
body<span>:</span> form
<span>}</span><span>)</span></pre>
- </div></div>
+ </div>
<p>Responses take the first argument as the body.</p>
- <div>
- <div><pre><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>new</span> File<span>(</span><span>[</span><span>"chunk"</span><span>,</span> <span>"chunk"</span><span>]</span><span>,</span> <span>"archive.zip"</span><span>,</span>
+ <div><pre><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>new</span> File<span>(</span><span>[</span><span>"chunk"</span><span>,</span> <span>"chunk"</span><span>]</span><span>,</span> <span>"archive.zip"</span><span>,</span>
<span>{</span> type<span>:</span> <span>"application/zip"</span> <span>}</span><span>)</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>Both Request and Response (and by extension the <code>fetch()</code> function),
will try to intelligently <a href="https://fetch.spec.whatwg.org/#concept-bodyinit-extract">determine the content type</a>.
Request will also automatically set a “Content-Type” header if none is
@@ -356,18 +357,17 @@ fetch<span>(</span><span>"/login"</span><span>,</span> <span>{</span>
<p>It is important to realise that Request and Response bodies can only be
read once! Both interfaces have a boolean attribute <code>bodyUsed</code> to
determine if it is safe to read or not.</p>
- <div>
- <div><pre><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>"one time use"</span><span>)</span><span>;</span>
+ <div><pre><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>"one time use"</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
res.<span>text</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>v<span>)</span> <span>{</span>
console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
<span>}</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
+&nbsp;
res.<span>text</span><span>(</span><span>)</span>.<span>catch</span><span>(</span><span>function</span><span>(</span>e<span>)</span> <span>{</span>
console.<span>log</span><span>(</span><span>"Tried to read already consumed Response"</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<p>This decision allows easing the transition to an eventual <a href="https://streams.spec.whatwg.org/">stream-based</a> Fetch
API. The intention is to let applications consume data as it arrives, allowing
for JavaScript to deal with larger files like videos, and perform things
@@ -381,22 +381,21 @@ res.<span>text</span><span>(</span><span>)</span>.<span>catch</span><span>(</spa
will return a clone of the object, with a ‘new’ body. <code>clone()</code> MUST
be called before the body of the corresponding object has been used. That
is, <code>clone()</code> first, read later.</p>
- <div>
- <div><pre>addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>evt<span>)</span> <span>{</span>
+ <div><pre>addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>evt<span>)</span> <span>{</span>
<span>var</span> sheep <span>=</span> <span>new</span> Response<span>(</span><span>"Dolly"</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>sheep.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
<span>var</span> clone <span>=</span> sheep.<span>clone</span><span>(</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>clone.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
+&nbsp;
clone.<span>text</span><span>(</span><span>)</span><span>;</span>
console.<span>log</span><span>(</span>sheep.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
console.<span>log</span><span>(</span>clone.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
+&nbsp;
evt.<span>respondWith</span><span>(</span>cache.<span>add</span><span>(</span>sheep.<span>clone</span><span>(</span><span>)</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>e<span>)</span> <span>{</span>
<span>return</span> sheep<span>;</span>
<span>}</span><span>)</span><span>;</span>
<span>}</span><span>)</span><span>;</span></pre>
- </div></div>
+ </div>
<h2>Future improvements</h2>
@@ -409,7 +408,11 @@ res.<span>text</span><span>(</span><span>)</span>.<span>catch</span><span>(</spa
in the issues in the <a href="https://www.w3.org/Bugs/Public/buglist.cgi?product=WHATWG&amp;component=Fetch&amp;resolution=---">Fetch</a> and
<a href="https://github.com/slightlyoff/ServiceWorker/issues">ServiceWorker</a>specifications.</p>
<p>For a better web!</p>
- <p><em>The author would like to thank Andrea Marchesini, Anne van Kesteren and Ben<br></br>
+ <p><em>The author would like to thank Andrea Marchesini, Anne van Kesteren and Ben<br>
Kelly for helping with the specification and implementation.</em>
</p>
- </article></div> \ No newline at end of file
+
+ </article>
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/003-metadata-preferred/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/003-metadata-preferred/expected.html
index 6b03dd384..b282bddee 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/003-metadata-preferred/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/003-metadata-preferred/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Test document title</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/004-metadata-space-separated-properties/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/004-metadata-space-separated-properties/expected.html
index 6b03dd384..b282bddee 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/004-metadata-space-separated-properties/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/004-metadata-space-separated-properties/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Test document title</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected-metadata.json
index 9b2070388..eeccb9e70 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": "By Daniel Kahn Gillmor, Senior Staff Technologist, ACLU Speech, Privacy, and Technology Project",
- "Direction": "ltr",
- "Excerpt": "I don't use Facebook. I'm not technophobic — I'm a geek. I've been using email since the early 1990s, I have accounts on hundreds of services around the net, and I do software development and internet protocol design both for work and for fun. I believe that a globe-spanning communications network like the internet can be a positive social force, and I publish much of my own work on the open web.",
+ "Author": "Daniel Kahn Gillmor",
+ "Direction": null,
+ "Excerpt": "Facebook collects data about people who have never even opted in. But there are ways these non-users can protect themselves.",
"Image": "https:\/\/www.aclu.org\/sites\/default\/files\/styles\/metatag_og_image_1200x630\/public\/field_share_image\/web18-facebook-socialshare-1200x628-v02.png?itok=p77cQjOm",
- "Title": "Facebook Is Tracking Me Even Though I’m Not on Facebook",
+ "Title": "Facebook Is Tracking Me Even Though I\u2019m Not on Facebook",
"SiteName": "American Civil Liberties Union"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected.html
index 15801438e..8efcda5b0 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/aclu/expected.html
@@ -107,7 +107,7 @@
<strong>Opting out?</strong>
</h3>
<p>
- Some advertisers claim that you can "opt out" of their targeted advertising, and even offer <a href="http://optout.aboutads.info/">a centralized place meant to help you do so</a>. However, my experience with these tools isn't a positive one. They don't appear to work all of the time. (In a recent experiment I conducted, two advertisers’ opt-out mechanisms failed to take effect.) And while advertisers claim to allow the user to opt out of "interest-based ads," it's not clear that the opt-outs govern data collection itself, rather than just the use of the collected data for displaying ads. Moreover, opting out on their terms requires the use of third-party cookies, thereby enabling another mechanism that other advertisers can then exploit.
+ Some advertisers claim that you can "opt out" of their targeted advertising, and even offer <a href="http://optout.aboutads.info/">a centralized place meant to help you do so</a>.&nbsp;However, my experience with these tools isn't a positive one. They don't appear to work all of the time. (In a recent experiment I conducted, two advertisers’ opt-out mechanisms failed to take effect.) And while advertisers claim to allow the user to opt out of "interest-based ads," it's not clear that the opt-outs govern data collection itself, rather than just the use of the collected data for displaying ads. Moreover, opting out on their terms requires the use of third-party cookies, thereby enabling another mechanism that other advertisers can then exploit.
</p>
<p>
It's also not clear how they function over time: How frequently do I need to take these steps? Do they expire? How often should I check back to make sure I’m still opted out? I'd much prefer an approach requiring me to opt <em>in</em> to surveillance and targeting.
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-metadata.json
new file mode 100644
index 000000000..2f6df8f45
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Organization for Transformative Works",
+ "Direction": null,
+ "Excerpt": "An Archive of Our Own, a project of the Organization for Transformative Works",
+ "Image": null,
+ "Title": "Conversations with a Cryptid - Chapter 1 - AMournfulHowlInTheNight - \u50d5\u306e\u30d2\u30fc\u30ed\u30fc\u30a2\u30ab\u30c7\u30df\u30a2 | Boku no Hero Academia",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected.html
new file mode 100644
index 000000000..d1d1f93ce
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/expected.html
@@ -0,0 +1,317 @@
+<div role="article" id="chapters">
+ <h3 id="work">
+ Chapter Text
+ </h3>
+ <p>
+ Izuku was struggling to understand how he had even managed to get here, seated before the archvillain of Japan with only a sense of dread to keep him company. All Might sat concealed in an observation room, of the firm opinion that he could only aggravate the prisoner and he sent Izuku off with a strained smile. A vague haze hovered over Izuku’s memory. It started with a simple conversation gone astray on a long drive home.
+ </p>
+
+ <p>
+ “So, who is All For One? Do we know anything about him beyond what you told me before? He’s been imprisoned for months now.” Izuku remembered asking All Might from the backseat of the car as Detective Tsukauchi leisurely drove along a sprawling highway.
+ </p>
+ <p>
+ Playing on the car radio was an aftermath report of a villain attack in downtown Tokyo. Izuku caught the phrase “liquid body” from the female reporter before Detective Tsukauchi changed the channel.
+ </p>
+ <p>
+ “Nope. Still nothing. No one really wants to speak to him,” All Might had replied brightly. “He gives off polite airs, but he’s a piece of work.” All Might’s mostly obstructed shoulders in the front seat shrugged. “Not much you can do with someone like him. Everything that comes out is a threat or taunt.” All Might carefully waved his hand in a circular motion towards the side of his head.
+ </p>
+ <p>
+ “No one’s even made it through a full interview with him, from what I’ve heard,” Detective Tsukauchi added from behind the wheel. “He plays mind games with them. The prison also has a “no recent events” policy on any discussions with him as well. Just in case he ends up with ideas or has some means of communicating. Given that people only want to ask him about current events, it doesn’t leave much to talk about.”
+ </p>
+ <p>
+ “Wait, they still don’t know what Quirks he has?” Izuku asked exasperatedly. “They can’t if there’s still an information block on visits.”
+ </p>
+ <p>
+ “Nope. We have no idea what he can do. They can run DNA tests, but it’s not like anyone apart from him even knows how his Quirk works. They could get matches with any number of people, but if they’re not in a database then we can’t cross-reference them anyway. Even if they run an analysis, the data doesn’t mean anything without the ability to interpret it,” All Might gestured with a skeletal finger. “It’s a waste of time after the initial tests were conducted. They weren’t game to MRI him either, given he’s definitely got a Quirk that creates metal components.”
+ </p>
+ <p>
+ “No one’s bothered to ask him anything about… anything?” Izuku asked, dumbfounded. “He must be around two-hundred years old and people can’t think of a single non-current affairs thing to ask him?”
+ </p>
+ <p>
+ In some ways it was unfathomable that they’d let a potential resource go to waste. On the other hand, said potential resource had blown up a city, murdered numerous people and terrorised Japan for over a century. At the very least.
+ </p>
+ <p>
+ “Well, I tried to ask him about Shigaraki, but he didn’t say much of anything really. Some garbage about you being too dependent on me and him letting Shigaraki run wild and how he just wanted to be the ultimate evil,” All Might shrugged again. “He spends too much time talking about nothing.”
+ </p>
+ <p>
+ Izuku shifted his head onto his arm. “But, that’s not really nothing, is it?”
+ </p>
+ <p>
+ “What do you mean?” Izuku had the feeling that All Might would have been looking at him with the <i>you’re about to do something stupid aren’t you</i> expression that was thankfully becoming less common.
+ </p>
+ <p>
+ “Well, he clearly doesn’t know anything about us, All Might, if he thinks that you’re just going to let go of me after not even two years of being taught. Maybe Shigaraki was dependent on adult figures, but I don’t even remember my dad and mum’s been busy working and keeping the house together. I’ve never had a lot of adult supervision before,” Izuku laughed nervously. “I had to find ways to keep myself entertained. If anything, I’m on the disobedient side of the scale.” All Might outright giggled.
+ </p>
+ <p>
+ “I’ll say, especially after what happened with Overhaul. I’m surprised your mother let you leave the dorms again after that.”
+ </p>
+ <p>
+ “I’m surprised she didn’t withdraw and ground me until I was thirty.”
+ </p>
+ <p>
+ “Oh? That strict?” Tsukauchi asked.
+ </p>
+ <p>
+ “She has her moments,” Izuku smiled fondly. “Do you think she’d agree to me asking the archvillain of Japan about his Quirk?” Izuku asked, only partially joking. There was an itch at the back of his head, a feeling of something missing that poked and prodded at his senses.
+ </p>
+ <p>
+ All Might coughed and sprayed the dash with a fine red mist. “Absolutely not! I forbid it!”
+ </p>
+ <p>
+ “That’s exactly why I’m asking her and not you,” Izuku grinned from the backseat.
+ </p>
+ <p>
+ “He’s evil!”
+ </p>
+ <p>
+ “He’s ancient. You honestly don’t wonder about the sort of things someone with that life experience and Quirk would have run across to end up the way he did?”
+ </p>
+ <p>
+ “Nope, he made it perfectly clear that he always wanted to be the supreme evil,” All Might snipped through folded arms.
+ </p>
+ <p>
+ “Yeah, and I’ll just take his word for that, won’t I?” Izuku grinned. “If he does nothing but lie, then that’s probably one too, but there’s a grain of truth in there somewhere.”
+ </p>
+ <p>
+ “What would you even do? Harass him into telling you his life story?” All Might sighed.
+ </p>
+ <p>
+ “Not when I can kill him with kindness. Who knows, it might even be poisonous for him.”
+ </p>
+ <p>
+ “You’re explaining this to your mother. Teacher or not, I’m not being on the receiving end of this one.”
+ </p>
+ <p>
+ Izuku blinked for a moment. “You’ll let me?”
+ </p>
+ <p>
+ “I’m not entirely for it, but any prospective information on what influenced Shigaraki can only be a good thing. If anything goes south we can pull you out pretty easily. Just be aware of who and what you’re dealing with.” Struggling, All Might turned a serious look to Izuku around the side of the seat. “<i>Only</i> if your mother gives the okay.”
+ </p>
+ <p>
+ The conversation turned to school for the rest of the way.
+ </p>
+
+ <p>
+ It might have been curiosity or it might have been the nagging sensation that chewed at his brain for the three weeks that he researched the subject of the conversation. All For One was a cryptid. Mystical in more ways than one, he was only a rumour on a network that was two-hundred years old. There were whispers of a shadowy figure who once ruled Japan, intermingled with a string of conspiracies and fragmented events.
+ </p>
+ <p>
+ Izuku had even braved the dark web, poking and prodding at some of the seedier elements of the world wide web. The internet had rumours, but the dark web had stories.<br>
+ </p>
+ <p>
+ An implied yakuza wrote about his grandfather who lost a fire manipulation Quirk and his sanity without any reason. His grandfather had been institutionalised, crying and repeating “he took it, he took it” until his dying days. No one could console him.
+ </p>
+ <p>
+ Another user spoke of a nursing home where a room full of dementia residents inexplicably became docile and no longer used their Quirks on the increasingly disturbed staff. The nursing home erupted into flames just before a court case against them commenced.
+ </p>
+ <p>
+ A user with neon pink text spoke of how their great-great-great-great grandmother with a longevity Quirk had simply aged rapidly one day and passed away in her sleep, her face a mask of terror. No cause had ever been found.
+ </p>
+ <p>
+ A hacker provided a grainy CCTV recording of a heist and a scanned collection of documents from over a century ago, where there was a flash of light and entire bank vault had been emptied. What separated it from the usual robbery was that it contained a list containing confidential information on the Quirks of the First Generation. Izuku had greedily snavelled up and saved the video and documents to an external hard drive.
+ </p>
+ <p>
+ Paging through, Izuku saw someone recount how their Quirkless uncle had developed a warp Quirk and gone from rags to riches under a mysterious benefactor. A decade ago, the uncle had simply disappeared.
+ </p>
+ <p>
+ Numerous and terrifying, the stories were scattered nuggets of gold hidden across the web. They’d never last long, vanishing within hours of posting. Izuku bounced from proxy to proxy, fleeing from a series of deletions that seemed to follow Izuku’s aliased postings across snitch.ru, rabbit.az, aconspiracy.xfiles and their compatriots.
+ </p>
+ <p>
+ After thirty-two identity changes (all carefully logged in a separate notebook), a large amount of feigning communal interest in a lucky tabloid article on All For One which had been released at the start of the first of the three weeks, Izuku hung up his tinfoil hat and called it a month. He haphazardly tossed a bulging notebook into his bookshelf and lodged his hard drive in a gap containing seven others and went to dinner.
+ </p>
+ <p>
+ It took another week to present his research to All Might and Tsukauchi, whose jaws reached the proverbial floor.
+ </p>
+ <p>
+ “We never found any of this,” the Detective Tsukauchi exclaimed. “How did you find all of it?”
+ </p>
+ <p>
+ “I asked the right people. Turns out criminals have very long and very unforgiving memories,” Izuku explained through sunken eyes. “There’s more than this that could be linked to him, but these ones seem to be the most obvious.”
+ </p>
+ <p>
+ “They would do, you can’t be head of the underworld without making an army of enemies,” All Might agreed. “You know, if you can get any more information about these events, I think you’ll give people a lot of peace of mind.”
+ </p>
+ <p>
+ “Provided mum agrees to it.”
+ </p>
+ <p>
+ “Only if she agrees to it.”
+ </p>
+ <p>
+ It took another month to convince his mother, who eventually gave in once All Might provided an extremely comprehensive schedule of how the visitations and any resulting research would be carefully balanced against Izuku’s schoolwork and internship.
+ </p>
+
+ <p>
+ The day of the visit finally arrived, four months after the initial conversation, much to Izuku’s dismay.
+ </p>
+ <p>
+ Izuku remembered how he had arrived, with the Detective and All Might escorting him through its sterile, white innards. A list of rules rattled off at the gate, “no current affairs” was chief among them and an assertion that he’d be dragged from the room if need be if Izuku was to breach any of them. No smuggling of communication devices, no weapons, no Quirks, nothing that could compromise the prisoner’s secure status.
+ </p>
+ <p>
+ Heavily armoured and drilled guards leading him underground into the deepest bowels of the Tartarus complex.
+ </p>
+ <p>
+ Izuku understood the rules, dressed casually in a cotton t-shirt with “Shirt” printed across it in haphazard English and clutching at a carefully screened and utterly blank notebook.
+ </p>
+ <p>
+ Across from him, behind reinforced glass, the archvillain of Japan was bound and unmoving.
+ </p>
+ <p>
+ “Hello,” Izuku initiated uncertainly. His skin had been crawling the moment he crossed the threshold, a memory of the encounter and escape at the Kamino Ward months ago.
+ </p>
+ <p>
+ “Ah, All Might’s disciple,” drawled All For One, “is he too cowardly to come himself? Yet I don’t hear the garments of a hero.” With hardly a word out, All For One had already lunged for the figurative jugular.
+ </p>
+ <p>
+ A stray thought of <i>how does he know who I am if he’s blind and isn’t familiar with me?</i> whispered its way through Izuku’s head.
+ </p>
+ <p>
+ “Oh, no,” Izuku corrected hastily, almost relieved at the lack of any pretence, “I asked if I could talk to you. This isn’t exactly hero related.”
+ </p>
+ <p>
+ “I’m surprised he said yes.” While there was little by way of expression, Izuku could just about sense the contempt dripping from the prisoner’s tone. It wasn’t anything he wasn’t expecting. Kacchan had already said worse to him in earlier years. Water off a duck’s back.
+ </p>
+ <p>
+ “Well, he’s not my legal guardian, so I think you should be more surprised that mum said yes. She’s stricter with these things than All Might,” Izuku corrected again. “Mum gave the okay, but that was a stressful discussion.” And there it was, a miniscule twitch from the man opposite. A spasm more than anything else. <i>Interesting.</i> Pinned down as he was, the prisoner oozed irritation.
+ </p>
+ <p>
+ “At least your mother is a wise person. I wonder why the student doesn’t heed all of the advice of the teacher.” All For One’s tone didn’t indicate a question, so much as an implicit statement that All Might wasn’t worth listening to in any capacity. Kacchan would have hated the comparison, but the hostility had an almost comfortable familiarity. “He no doubt warned you off speaking to me, overprotective as he is, but here you are.”
+ </p>
+ <p>
+ Izuku found himself smiling at the thought of Kacchan’s outrage if he ever found out about the mental comparison as he replied. “I don’t think it’s normal for anyone my age to listen completely to their teachers. We pick and choose and run with what works best for us. He warned me, but I’m still here. Mum warned me as well, but I think she cared more about the time management aspect of it."
+ </p>
+ <p>
+ “Is that a recent development?” All For One probed.
+ </p>
+ <p>
+ “Not really. My old homeroom teacher told me not to bother applying to U.A.” His mother’s beaming face had carried Izuku through the cheerful and resolute signing of that application form.
+ </p>
+ <p>
+ “I see you followed their advice to the letter,” came the snide, dismissive reply.
+ </p>
+ <p>
+ Izuku hoisted up his legs and sat cross-legged in his seat. Leaning slightly forward as he did so as to better prop up his notebook.
+ </p>
+ <p>
+ “You’re a walking contrarian, aren’t you? All Might told me about his run ins with you. What someone does or doesn’t do really doesn’t matter to you, you’ll just find a way to rationalise it as a negative and go on the attack anyway. What you’re currently doing is drawing attention away from yourself and focusing it on me so you can withhold information.” Izuku flipped open his notebook and put pen to paper. “You’ve got something fairly big to hide and you diverting attention exposes that motivation as existing anyway. The only real questions here are what and why?” Izuku paused in mortification as the man opposite’s lips parted. “I just said that aloud, didn’t I?”
+ </p>
+ <p>
+ Of the responses Izuku had expected, it wasn’t laughter. Unrestrained, Izuku would have expected a violent outburst. In this situation, he would have expected another scathing comment. Instead, All For One laughed breathily, leaning into his bonds. Wheezingly he spoke, “I’ll have to change tactics, if that one’s too transparent for you. How refreshing.”
+ </p>
+ <p>
+ Doing his best not to glow a blinding red and simultaneously pale at the interest, Izuku carried on. “I add it to the list when you do. I’m not emotionally involved enough to really be impacted by what you’re saying. I know about you in theory, but that’s it. Maybe All Might has a history with you, but I don’t really know enough about you personally to…”
+ </p>
+ <p>
+ “Care,” All For One supplied, somewhat subdued as he struggled to breathe. “You’re only here to satisfy your curiosity as to whether or not the stories were true.”
+ </p>
+ <p>
+ Izuku nodded, scratching at his notebook with his left hand. “Yes and no, I’m actually here to ask you about how your Quirk works.” <i>For now.</i>
+ </p>
+ <p>
+ Another chortle, more restrained that the last.
+ </p>
+ <p>
+ "What makes you think others haven’t already asked?” Had All For One been unrestrained, Izuku could imagine the stereotypical scene of the villain confidently leaning back in some overblown chair in a secret lair, drink of choice in hand, if the tone of voice was any indication. Deflections aside, the man easily rose to each comment.
+ </p>
+ <p>
+ “Whether or not they asked it’s irrelevant if they can’t read the answers.” Answers didn’t matter if the people involved were too attached to read into the answers. If none of the interviewers had managed a full interview, then it seemed unlikely that any sort of effort was put into understanding the villain.
+ </p>
+ <p>
+ “And you think you can? What expertise do you hold above theirs?” Doubt and reprimand weighted the words. Oddly enough, had Izuku been any younger he could have mistaken the man for a disapproving parent rebuking an overly ambitious child. Albeit an extremely evil one.
+ </p>
+ <p>
+ Izuku inhaled shortly and went for it. “If there’s something I know, it’s Quirks and how they work. Maybe I don’t know you, but I don’t really need to. Quirks fall under broad categories of function. You can take and give, consent doesn’t seem to be a factor. You either can’t “see” certain types of Quirks or you need to have prior knowledge of it before you take it with what I know about your brother. Despite your <i>nom de guerre</i>, because we both know it’s not your real name, you have a history of giving multiple Quirks and causing brain damage to the receiver. You clearly aren’t impacted by those same restrictions, so it must either alter your brain mapping or adjust functions to allow for simultaneous use and storage. It also must isolate or categories the Quirks you stock, because from the few people who do remember you, you creating certain Quirks is always in the context of giving them to someone else meaning there’s probably an inherent immunity to stop it from tainting your own Quirk with a mutation,” Izuku mumbled, almost to himself. “The only thing really in question about your Quirk is the finer details and whether or not you need to maintain those features or if they’re inherent and your hard limit for holding Quirks.”
+ </p>
+ <p>
+ There was silence, for only a moment. “If only my hands were free, I would clap for such a thoughtful assessment. Clearly you’re not all brawn,” All For One positively purred. “Speculate away.” A wide and slightly unhinged smile was directed at Izuku.
+ </p>
+ <p>
+ It was all Izuku could do not to wince at the eagerness. An image of a nervous All Might, hidden in the observation room above with the grim-faced prison staff, came to mind.
+ </p>
+ <p>
+ “I note that you said thoughtful and not correct,” and Izuku breathed and unsteadily jotted it down in his notebook. “You don’t seem bothered by the guess.”
+ </p>
+ <p>
+ “Few people live long enough to question my Quirk, let alone have the talent to guess so thoughtfully at its functions. It seems we share a hobby.” There was something terribly keen in that voice that hadn’t been there before, twisting itself through the compliment.
+ </p>
+ <p>
+ “I suppose it helps that you’re playing along out of boredom,” Izuku verbally dodged, unease uncoiling itself from the back of his mind.
+ </p>
+ <p>
+ “I <i>was</i> playing along out of boredom,” All For One corrected smoothly. “Now, I’m curious. Admittedly, my prior assumptions of you weren’t generous, but I’ve been too hasty in my assessments before.”
+ </p>
+ <p>
+ “I’ll pack up and leave now if that’s the case,” Izuku replied with only half an ear on the conversation as the words on his page began to drastically expand to distract himself from the building anxiety.
+ </p>
+ <p>
+ “Sarcasm, so you do have characteristics of a normal teenager. Your willingness to maim yourself has often left me wondering…”
+ </p>
+ <p>
+ “You’re deflecting again,” Izuku observed. “I’m not sure if that’s a nervous habit for you or if you’re doing it because I’m close to being right about your Quirk. That being said, I don’t think you know what a normal teenager is if Shigaraki is any indication. He’s about seven years too late for his rebellious phase.”
+ </p>
+ <p>
+ “I’m hurt and offended,” came the amused reply.
+ </p>
+ <p>
+ “By how Shigaraki ended up or your parenting? You only have yourself to blame for both of them.”
+ </p>
+ <p>
+ “How harsh. Shigaraki is a product of society that birthed him. I can’t take credit for all of the hard work,” All For One laid out invitingly. Perhaps someone else would have risen to the bait, but Izuku was already packing his mental bags and heading for the door.
+ </p>
+ <p>
+ Clearly the prisoner’s anticipation had registered poorly with someone in the observation room, because a voice rang through the air. “Time’s up Midoriya-kun.”
+ </p>
+ <p>
+ “Okay!” Izuku called back and etched out his last thoughtful of words, untangled his legs and rose to his feet.
+ </p>
+ <p>
+ “What a shame, my visitations are always so short,” All For One spoke mournfully.
+ </p>
+ <p>
+ “Well, you did blow up half a city. They could have just let you suffocate instead. Same time next week, then?” Izuku offered brightly, notebook stuffed into a pocket and was followed out the door by wheezing laughter.
+ </p>
+ <p>
+ It was only after he had made it safely back to the communal room where All Might waited did he allow the spring to fade from his step and discard his nervous smile. Shuddering, he turned to All Might whose face was set in a grimace.
+ </p>
+ <p>
+ “I won’t say I told you so,” All Might offered, perched on the edge of his couch like a misshapen vulture.
+ </p>
+ <p>
+ “He’s… not really what I was expecting. I was expecting someone, more openly evil.” Izuku allowed himself to collapse into the leather of the seat. He shakily reached for the warm tea that had been clearly been prepared the moment Izuku left the cell. “I suppose he does it to lull people into a false sense of security. I didn’t understand how someone with only half a set of expressions could have “villain” written all over them until I met him.”
+ </p>
+ <p>
+ “He’s always been like that. He feigns concern and sympathy to lure in society’s outcasts. They’re easy targets,” All Might said through a mouthful of biscuit.
+ </p>
+ <p>
+ “Has he ever tried it on any of the One For All successors?”
+ </p>
+ <p>
+ “Not really, but you might have accidentally given him the incentive for it. He never had access to any of the One For All wielders while they were young.” All Might snorted, “not that it’ll make a difference with you”.
+ </p>
+ <p>
+ “I think he was trying to gauge me for a world view before the wardens ended it. I need more time to work out his response to the stuff on his Quirk.”
+ </p>
+ <p>
+ “He’s conversation starved since it’s solitary confinement. If what the people monitoring his brain activity said was true, you’re the most exciting thing to have happened to him in months. He replied after you left, said he was looking forward to it.”
+ </p>
+ <p>
+ “That’s pretty sad."
+ </p>
+ <p>
+ “It’s even sadder that we’re the only two members of the public who have had anything to do with him. Stain gets a pile of mail from his “fans”, but All For One has nothing,” All Might waved a tea spoon. “That’s what he gets.”
+ </p>
+ <p>
+ “Let’s get out of here and tell Detective Tsukauchi how it went.” Izuku gulped down his tea and headed for the exit, with him and All Might reaching it at roughly the same amount of time.
+ </p>
+ <p>
+ “At least your mum’s making katsudon for us tonight," was All Might's only optimistic comment.
+ </p>
+ <p>
+ Anxiety was still ebbing over Izuku after Tsukauchi had been debriefed in the car.
+ </p>
+ <p>
+ <i>“It seems we share a hobby.”</i> Haunted Izuku on the drive home. As if ripping someone’s Quirk from them and leaving them lying traumatised on the ground was just a fun pastime and not an act of grievous bodily harm.
+ </p>
+ <p>
+ And he’d be dealing with him again in another week.
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/source.html
new file mode 100644
index 000000000..5e1d866bd
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/archive-of-our-own/source.html
@@ -0,0 +1,1025 @@
+<!DOCTYPE html>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="x-ua-compatible" content="ie=edge" />
+ <script>
+ <![CDATA[
+ window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"f2edcff25e","applicationID":"190034","transactionName":"dgwMEkpfWVsHERpRXlQTFgNKQxpECgxC","queueTime":0,"applicationTime":151,"agent":""}
+ ]]>
+ </script>
+ <meta name="keywords" content="fanfiction, transformative works, otw, fair use, archive" />
+ <meta name="language" content="en-US" />
+ <meta name="subject" content="fandom" />
+ <meta name="description" content="An Archive of Our Own, a project of the Organization for Transformative Works" />
+ <meta name="distribution" content="GLOBAL" />
+ <meta name="classification" content="transformative works" />
+ <meta name="author" content="Organization for Transformative Works" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>
+ Conversations with a Cryptid - Chapter 1 - AMournfulHowlInTheNight - 僕のヒーローアカデミア | Boku no Hero Academia | My Hero Academia [Archive of Our Own]
+ </title>
+ <link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/skins/skin_873_archive_2_0/A.1_site_screen_.css.pagespeed.cf.zstKgD8I8e.css" />
+ <link rel="stylesheet" type="text/css" media="only screen and (max-width: 42em), handheld" href="/stylesheets/skins/skin_873_archive_2_0/A.5_site_narrow.handheld_.css.pagespeed.cf.8L0d7x-op8.css" />
+ <link rel="stylesheet" type="text/css" media="speech" href="/stylesheets/skins/skin_873_archive_2_0/A.6_site_speech_.css.pagespeed.cf.Ybb8bLK5Um.css" />
+ <link rel="stylesheet" type="text/css" media="print" href="/stylesheets/skins/skin_873_archive_2_0/A.7_site_print_.css.pagespeed.cf.ry3YZtf8Cz.css" /><!--[if IE 8]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/skins/skin_873_archive_2_0/8_site_screen_IE8_or_lower.css" /><![endif]-->
+ <!--[if IE 5]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/skins/skin_873_archive_2_0/9_site_screen_IE5.css" /><![endif]-->
+ <!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/skins/skin_873_archive_2_0/10_site_screen_IE6.css" /><![endif]-->
+ <!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/skins/skin_873_archive_2_0/11_site_screen_IE7.css" /><![endif]-->
+ <!--sandbox for developers -->
+
+ <script src="/javascripts/livevalidation_standalone.js.pagespeed.jm.oB__Z5piTe.js"></script>
+ <meta name="csrf-param" content="authenticity_token" />
+ <meta name="csrf-token" content="bN8HBcdvyL0UOkBQ1i6VKpYrU3B3p9SDgyEfw7VF91Emc96IFSfO1EsmbXGuF0NQ1iGv/rDIE6Qj/Q/c82uoyw==" />
+ </head>
+ <body class="logged-out">
+ <div id="outer" class="wrapper">
+ <ul id="skiplinks">
+ <li>
+ <a href="#main">Main Content</a>
+ </li>
+ </ul><!-- BEGIN BETA CAVEATS! -->
+ <noscript>
+ <p id="javascript-warning">
+ While we've done our best to make the core functionality of this site accessible without javascript, it will work better with it enabled. Please consider turning it on!
+ </p></noscript> <!-- END BETA CAVEATS! --> <!-- BEGIN header -->
+ <div id="header" class="region">
+ <h1 class="heading">
+ <a href="/"><span>Archive of Our Own</span> <sup>beta</sup>
+ <img alt="Archive of Our Own" class="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAqCAMAAAA3b6P4AAACslBMVEWXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACXAACpit0XAAAA5XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESFBUWFxgZGhscHR4fICEiIyQlJygpKissLi8wMTM0NTY3ODk6Ozw9PkBBQkNFR0hJSktMTU5PUFFSVFVWV1hZWltcXV5fY2RlZmhpamtsbW5vcHFyc3V2d3p7fX5/gIGCg4SFhoeIiouMjY6PkJGSlJWWl5iZmpucnZ6foKGipKWnqKmrrK2ur7CxsrO0tba3uLm6u7y9vr/AwsPFxsfIycrLzM7P0NLT1NXW19na29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+b1plRQAABBRJREFUSMedlvtb1FUQxgcEBMtQggUCxVACu1ApYmRmUqESkCkUREaS4h3JCDONEFPBoBQCJcDIGxkGKYGBkgGSAq4BARIXWWA//0c/7J39LvY0P82cd97nzJlzZuaIKvBRmVqmP/XOrrQNIbOVsNfyjq/3nYrs/1GlWjPe90v28wrgnOiDP7ddeN9WAE47O9DLQI6PksfDMWVjnfuDlCC3b4HbpYcOFjUC9UHKWywtQZNpjTmdgu60uSIis979HRr8bIT4YjVDqV6TFlPgVqjxjBegyM4MfSPepDsm9tAcb5mwHnpfMJmq39C+ZLQCytrfM3deUAylwWYL2+BTc4eICU4aNk/pLgm0DNQuqY+/Nk8zmuX0PmFx83V0eIiIyOPlmq3Wpw+tg1OG7Lk1c8YSzmZsqYhIhLp7pVLy3AugLUqnz73L15boHogUke1cW6ic+5n7QJvhLCLic4cTlmAGRIhdFhfdlcmPpUjCfSj3FpEZ9dQ5W6CFDPrLIc652rj2FWUi0f1wdZGI5DERbg56dlIvO6hyt1UTe8pEZKUa1JEiMVBhDu6GzbHc8LFZUSXHRUTC/oShBHG5DKkmbPUg1xPujSyxSba/sltEREJuA9tl0Qikz9JD8f1ovrjOVtvF7NexRqcsVgOfSIIW6pMDVe7z3zwLHDjFeSfb7GV/P6fXwrqATInuAvraWruB0U2bx4aenqKRJA/MMairhoAsCczr1TWH8dPLfO7w2VRtqKDZFFjsOHBY5JmNX549dzQ5ROQkLY9MQbZvKDCzNgHkGCvaLRGOznS2zQ6e2GJu7gXY7/3kiqQj52ubbo9C143asm2hLsrsD3jV8l2PAbcGsBRN9VuK7B+Gvc3N+WnDKEuqAtlz8FdT37J/5dhdk3vbxUb4Y23UusT08nZAobyTSDeoD8VUmKja3DCVcylk6LB5J7Qcts54Ncv13PVXDMQWLfC9o4SOMxqmd/TqocSKvZirTiIiTusM3NbM5aq9AGccPoYaB73jwn/ItWJ/xQ4RkTWVOupg4VqViEw7ApBTA5l6P9/T8LrV1veHA0RCirQANKU/q193KdZHEiUiMjc2vxUO2E9ml5MlXhn9ANRsVJmAWdUAjAaLiKoRaN9pRX6bdv9VjQD8FGv5HgNuAjS5ioj3Hd3jnyS+7RQfA+BSpONkMFwD5OvOVzEClZNmuV0hE/cAqqOmK7yjD4ENen1Jhpo+y6xt1SXmWoKNEtzS8qOn0Zi3jw7z1hg+BNCZ5m2z/DxmmFuZ7DKbATeBsYKgKX8/C6JNehjfmEZ3DlAb8YC/k1dVlrHx5LHaNNZ7GElzlQdJwOXaOA8REb9sSh2Myw5xn78s/0Fmpzc0V+TmVY1y2lP+h3jF5l9qvPpdnP4I/wITXDY67Xw1sAAAAABJRU5ErkJggg==" data-pagespeed-url-hash="4179492045" onload="pagespeed.CriticalImages.checkImageForCriticality(this);" /></a>
+ </h1>
+ <div id="login" class="dropdown">
+ <p class="user actions" role="menu">
+ <a id="login-dropdown" href="/users/login">Log In</a>
+ </p>
+ <div id="small_login" class="simple login">
+ <form id="new_user_session_small" class="new_user" action="/users/login" accept-charset="UTF-8" method="post" name="new_user_session_small">
+ <input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="IKnUNIOUNBcue2xgQNZzUM9IsxjXyzS4muUIvDSXT5pqBQ25UdwyfnFnQUE476Uqj0JPlhCk8586ORijcrkQAA==" />
+ <dl>
+ <dt>
+ <label for="user_session_login_small">User name or email:</label>
+ </dt>
+ <dd>
+ <input id="user_session_login_small" type="text" name="user[login]" />
+ </dd>
+ <dt>
+ <label for="user_session_password_small">Password:</label>
+ </dt>
+ <dd>
+ <input id="user_session_password_small" type="password" name="user[password]" />
+ </dd>
+ </dl>
+ <p class="submit actions">
+ <label for="user_remember_me_small" class="action"><input type="checkbox" name="user[remember_me]" id="user_remember_me_small" value="1" />Remember Me</label> <input type="submit" name="commit" value="Log In" />
+ </p>
+ </form>
+ <ul class="footnote actions">
+ <li>
+ <a href="/users/password/new">Forgot password?</a>
+ </li>
+ <li>
+ <a href="/invite_requests">Get an Invitation</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <h3 class="landmark heading">
+ Site Navigation
+ </h3>
+ <ul class="primary navigation actions" role="navigation">
+ <li class="dropdown">
+ <a href="/menu/fandoms">Fandoms</a>
+ <ul class="menu" role="menu">
+ <li>
+ <a href="/media">All Fandoms</a>
+ </li>
+ <li id="medium_5">
+ <a href="/media/Anime%20*a*%20Manga/fandoms">Anime &amp; Manga</a>
+ </li>
+ <li id="medium_3">
+ <a href="/media/Books%20*a*%20Literature/fandoms">Books &amp; Literature</a>
+ </li>
+ <li id="medium_4">
+ <a href="/media/Cartoons%20*a*%20Comics%20*a*%20Graphic%20Novels/fandoms">Cartoons &amp; Comics &amp; Graphic Novels</a>
+ </li>
+ <li id="medium_7">
+ <a href="/media/Celebrities%20*a*%20Real%20People/fandoms">Celebrities &amp; Real People</a>
+ </li>
+ <li id="medium_2">
+ <a href="/media/Movies/fandoms">Movies</a>
+ </li>
+ <li id="medium_6">
+ <a href="/media/Music%20*a*%20Bands/fandoms">Music &amp; Bands</a>
+ </li>
+ <li id="medium_8">
+ <a href="/media/Other%20Media/fandoms">Other Media</a>
+ </li>
+ <li id="medium_30198">
+ <a href="/media/Theater/fandoms">Theater</a>
+ </li>
+ <li id="medium_1">
+ <a href="/media/TV%20Shows/fandoms">TV Shows</a>
+ </li>
+ <li id="medium_476">
+ <a href="/media/Video%20Games/fandoms">Video Games</a>
+ </li>
+ <li id="medium_9971">
+ <a href="/media/Uncategorized%20Fandoms/fandoms">Uncategorized Fandoms</a>
+ </li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="/menu/browse">Browse</a>
+ <ul class="menu" role="menu">
+ <li>
+ <a href="/works">Works</a>
+ </li>
+ <li>
+ <a href="/bookmarks">Bookmarks</a>
+ </li>
+ <li>
+ <a href="/tags">Tags</a>
+ </li>
+ <li>
+ <a href="/collections">Collections</a>
+ </li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="/menu/search">Search</a>
+ <ul class="menu" role="menu">
+ <li>
+ <a href="/works/search">Works</a>
+ </li>
+ <li>
+ <a href="/bookmarks/search">Bookmarks</a>
+ </li>
+ <li>
+ <a href="/tags/search">Tags</a>
+ </li>
+ <li>
+ <a href="/people/search">People</a>
+ </li>
+ </ul>
+ </li>
+ <li class="dropdown">
+ <a href="/menu/about">About</a>
+ <ul class="menu" role="menu">
+ <li>
+ <a href="/about">About Us</a>
+ </li>
+ <li>
+ <a href="/admin_posts">News</a>
+ </li>
+ <li>
+ <a href="/faq">FAQ</a>
+ </li>
+ <li>
+ <a href="/wrangling_guidelines">Wrangling Guidelines</a>
+ </li>
+ <li>
+ <a href="/donate">Donate or Volunteer</a>
+ </li>
+ </ul>
+ </li>
+ <li class="search">
+ <form class="search" id="search" action="/works/search" accept-charset="UTF-8" method="get" name="search">
+ <input name="utf8" type="hidden" value="✓" />
+ <fieldset>
+ <legend>Search Works</legend>
+ <p>
+ <label class="landmark" for="site_search">Work Search:</label> <input class="text" id="site_search" aria-describedby="site_search_tooltip" type="text" name="work_search[query]" /> <span class="tip" role="tooltip" id="site_search_tooltip">tip: katekyou "alternate universe" sort:&gt;words</span> <span class="submit actions"><input type="submit" value="Search" class="button" /></span>
+ </p>
+ </fieldset>
+ </form>
+ </li>
+ </ul>
+ <div class="clear"></div>
+ </div><!-- END header -->
+ <div id="inner" class="wrapper">
+ <!-- BEGIN sidebar -->
+ <!-- END sidebar -->
+ <!-- BEGIN main -->
+ <div id="main" class="chapters-show region" role="main">
+ <div class="flash"></div><!--page description, messages-->
+ <!--/descriptions-->
+ <!--subnav-->
+ <!--/subnav-->
+ <!-- BEGIN work -->
+ <div class="work">
+ <p class="landmark">
+ <a name="top" id="top">&#160;</a>
+ </p><!-- BEGIN navigation -->
+ <h3 class="landmark heading">
+ Actions
+ </h3>
+ <ul class="work navigation actions" role="menu">
+ <li class="chapter entire">
+ <a href="/works/11808918?view_full_work=true">Entire Work</a>
+ </li>
+ <li class="chapter next">
+ <a href="/works/11808918/chapters/26796918#workskin">Next Chapter →</a>
+ </li>
+ <li class="chapter" aria-haspopup="true">
+ <noscript><a href="/works/11808918/navigate">Chapter Index</a></noscript> <a class="hidden" href="#">Chapter Index</a>
+ <ul id="chapter_index" class="expandable secondary hidden">
+ <li>
+ <form action="/works/11808918/chapters/26640231" accept-charset="UTF-8" method="get">
+ <input name="utf8" type="hidden" value="✓" />
+ <p>
+ <select name="selected_id" id="selected_id">
+ <option selected="selected" value="26640231">
+ 1. Greetings of a Cryptid
+ </option>
+ <option value="26796918">
+ 2. Quirk of a Cryptid
+ </option>
+ <option value="27214968">
+ 3. Motivations of a Cryptid
+ </option>
+ <option value="27703398">
+ 4. Hobbies of a Cryptid
+ </option>
+ <option value="28158585">
+ 5. Politics of a Cryptid
+ </option>
+ <option value="28393172">
+ 6. Interlude of a Successive Cryptid
+ </option>
+ <option value="28633304">
+ 7. Exasperation of a Cryptid
+ </option>
+ <option value="28907523">
+ 8. History of a Cryptid
+ </option>
+ <option value="28999791">
+ 9. Approach of a Cryptid
+ </option>
+ <option value="29259489">
+ 10. Corporations of a Cryptid
+ </option>
+ <option value="29796450">
+ 11. Fear of a Cryptid
+ </option>
+ <option value="29831925">
+ 12. Condition of a Cryptid
+ </option>
+ <option value="30029220">
+ 13. Escape of a Cryptid
+ </option>
+ <option value="30089508">
+ 14. Greetings of a Cryptid: Part 2
+ </option>
+ </select> <span class="submit actions"><input type="submit" name="commit" value="Go" /></span>
+ </p>
+ </form>
+ </li>
+ <li>
+ <a href="/works/11808918/navigate">Full-page index</a>
+ </li>
+ </ul>
+ </li>
+ <li class="comments" id="show_comments_link_top">
+ <a data-remote="true" href="/comments/show_comments?chapter_id=26640231">Comments</a>
+ </li>
+ <li class="share hidden">
+ <a class="modal" title="Share Work" aria-controls="#modal" href="#share">Share</a>
+ <div id="share">
+ <p class="note">
+ Copy and paste the following code to link back to this work (<kbd>CTRL A</kbd>/<kbd>CMD A</kbd> will select all), or use the Tweet or Tumblr links to share the work on your Twitter or Tumblr account.
+ </p>
+ <p>
+ <textarea cols="50" rows="4" id="embed_code">&lt;a href="https://archiveofourown.org/works/11808918"&gt;&lt;strong&gt;Conversations with a Cryptid&lt;/strong&gt;&lt;/a&gt; (67379 words) by &lt;a href="https://archiveofourown.org/users/AMournfulHowlInTheNight"&gt;&lt;strong&gt;AMournfulHowlInTheNight&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Chapters: 14/14&lt;br /&gt;Fandom: &lt;a href="https://archiveofourown.org/tags/%E5%83%95%E3%81%AE%E3%83%92%E3%83%BC%E3%83%AD%E3%83%BC%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%82%A2%20%7C%20Boku%20no%20Hero%20Academia%20%7C%20My%20Hero%20Academia"&gt;僕のヒーローアカデミア | Boku no Hero Academia | My Hero Academia&lt;/a&gt;&lt;br /&gt;Rating: General Audiences&lt;br /&gt;Warnings: No Archive Warnings Apply&lt;br /&gt;Relationships: Midoriya Izuku &amp; Yagi Toshinori | All Might, Midoriya Izuku &amp; Sensei | All For One&lt;br /&gt;Characters: Midoriya Izuku, Yagi Toshinori | All Might, Midoriya Inko, Sensei | All For One, Tsukauchi Naomasa, Shigaraki Tomura | Shimura Tenko, Bakugou Katsuki, Todoroki Shouto, Midoriya Hisashi&lt;br /&gt;Additional Tags: Meta, Alternate Universe - Canon Divergence&lt;br /&gt;Series: Part 1 of &lt;a href="https://archiveofourown.org/series/800334"&gt;Conversations with a Cryptid&lt;/a&gt;&lt;br /&gt;Summary: &lt;p&gt;The man was over a century old. There had to be more to it. In hindsight, it hadn’t been one of Izuku’s better ideas.&lt;/p&gt;</textarea>
+ </p>
+ <ul>
+ <li>
+ <a href="http://twitter.com/share" class="twitter-share-button" data-size="large" data-via="ao3org" data-text="Conversations with a Cryptid by AMournfulHowlInTheNight - 僕のヒーローアカデミア | Boku no Hero Academi..." data-url="https://archiveofourown.org/works/11808918">Tweet</a>
+ </li>
+ <li>
+ <a href="http://tumblr.com/widgets/share/tool?canonicalUrl=https%3A%2F%2Farchiveofourown.org%2Fworks%2F11808918&amp;title=Conversations%20with%20a%20Cryptid%20%2867379%20words%29%20by%20AMournfulHowlInTheNight%20%5BAO3%5D&amp;caption=Chapters%3A%2014%2F14%3Cbr%20%2F%3EFandom%3A%20%3Ca%20href%3D%22https%3A%2F%2Farchiveofourown.org%2Ftags%2F%25E5%2583%2595%25E3%2581%25AE%25E3%2583%2592%25E3%2583%25BC%25E3%2583%25AD%25E3%2583%25BC%25E3%2582%25A2%25E3%2582%25AB%25E3%2583%2587%25E3%2583%259F%25E3%2582%25A2%2520%257C%2520Boku%2520no%2520Hero%2520Academia%2520%257C%2520My%2520Hero%2520Academia%22%3E%E5%83%95%E3%81%AE%E3%83%92%E3%83%BC%E3%83%AD%E3%83%BC%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%82%A2%20%7C%20Boku%20no%20Hero%20Academia%20%7C%20My%20Hero%20Academia%3C%2Fa%3E%3Cbr%20%2F%3ERating%3A%20General%20Audiences%3Cbr%20%2F%3EWarnings%3A%20No%20Archive%20Warnings%20Apply%3Cbr%20%2F%3ERelationships%3A%20Midoriya%20Izuku%20%26%20Yagi%20Toshinori%20%7C%20All%20Might%2C%20Midoriya%20Izuku%20%26%20Sensei%20%7C%20All%20For%20One%3Cbr%20%2F%3ECharacters%3A%20Midoriya%20Izuku%2C%20Yagi%20Toshinori%20%7C%20All%20Might%2C%20Midoriya%20Inko%2C%20Sensei%20%7C%20All%20For%20One%2C%20Tsukauchi%20Naomasa%2C%20Shigaraki%20Tomura%20%7C%20Shimura%20Tenko%2C%20Bakugou%20Katsuki%2C%20Todoroki%20Shouto%2C%20Midoriya%20Hisashi%3Cbr%20%2F%3EAdditional%20Tags%3A%20Meta%2C%20Alternate%20Universe%20-%20Canon%20Divergence%3Cbr%20%2F%3ESeries%3A%20Part%201%20of%20%3Ca%20href%3D%22https%3A%2F%2Farchiveofourown.org%2Fseries%2F800334%22%3EConversations%20with%20a%20Cryptid%3C%2Fa%3E%3Cbr%20%2F%3ESummary%3A%20%3Cp%3EThe%20man%20was%20over%20a%20century%20old.%20There%20had%20to%20be%20more%20to%20it.%20In%20hindsight%2C%20it%20hadn%E2%80%99t%20been%20one%20of%20Izuku%E2%80%99s%20better%20ideas.%3C%2Fp%3E" title="Share on Tumblr" style="display:inline-block;text-indent:-9999px;overflow:hidden;width:81px;height:20px;background:url(//platform.tumblr.com/v1/share_1.png) top left no-repeat transparent;border-bottom:none" target="_blank">Share on Tumblr</a>
+ </li>
+ </ul>
+ </div>
+ </li>
+ <li class="download" aria-haspopup="true">
+ <a href="#">Download</a>
+ <ul class="expandable secondary">
+ <li>
+ <a href="/downloads/11808918/Conversations%20with%20a.azw3?updated_at=1585835284">AZW3</a>
+ </li>
+ <li>
+ <a href="/downloads/11808918/Conversations%20with%20a.epub?updated_at=1585835284">EPUB</a>
+ </li>
+ <li>
+ <a href="/downloads/11808918/Conversations%20with%20a.mobi?updated_at=1585835284">MOBI</a>
+ </li>
+ <li>
+ <a href="/downloads/11808918/Conversations%20with%20a.pdf?updated_at=1585835284">PDF</a>
+ </li>
+ <li>
+ <a href="/downloads/11808918/Conversations%20with%20a.html?updated_at=1585835284">HTML</a>
+ </li>
+ </ul>
+ </li>
+ </ul><!-- END navigation -->
+ <h3 class="landmark heading">
+ Work Header
+ </h3>
+ <div class="wrapper">
+ <dl class="work meta group" role="complementary">
+ <dt class="rating tags">
+ Rating:
+ </dt>
+ <dd class="rating tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/General%20Audiences/works">General Audiences</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="warning tags">
+ <a href="/tos_faq#tags">Archive Warning</a>:
+ </dt>
+ <dd class="warning tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/No%20Archive%20Warnings%20Apply/works">No Archive Warnings Apply</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="category tags">
+ Category:
+ </dt>
+ <dd class="category tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/Gen/works">Gen</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="fandom tags">
+ Fandom:
+ </dt>
+ <dd class="fandom tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/%E5%83%95%E3%81%AE%E3%83%92%E3%83%BC%E3%83%AD%E3%83%BC%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%82%A2%20%7C%20Boku%20no%20Hero%20Academia%20%7C%20My%20Hero%20Academia/works">僕のヒーローアカデミア | Boku no Hero Academia | My Hero Academia</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="relationship tags">
+ Relationships:
+ </dt>
+ <dd class="relationship tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/Midoriya%20Izuku%20*a*%20Yagi%20Toshinori%20%7C%20All%20Might/works">Midoriya Izuku &amp; Yagi Toshinori | All Might</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Midoriya%20Izuku%20*a*%20Sensei%20%7C%20All%20For%20One/works">Midoriya Izuku &amp; Sensei | All For One</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="character tags">
+ Characters:
+ </dt>
+ <dd class="character tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/Midoriya%20Izuku/works">Midoriya Izuku</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Yagi%20Toshinori%20%7C%20All%20Might/works">Yagi Toshinori | All Might</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Midoriya%20Inko/works">Midoriya Inko</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Sensei%20%7C%20All%20For%20One/works">Sensei | All For One</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Tsukauchi%20Naomasa/works">Tsukauchi Naomasa</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Shigaraki%20Tomura%20%7C%20Shimura%20Tenko/works">Shigaraki Tomura | Shimura Tenko</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Bakugou%20Katsuki/works">Bakugou Katsuki</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Todoroki%20Shouto/works">Todoroki Shouto</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Midoriya%20Hisashi/works">Midoriya Hisashi</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="freeform tags">
+ Additional Tags:
+ </dt>
+ <dd class="freeform tags">
+ <ul class="commas">
+ <li>
+ <a class="tag" href="/tags/Meta/works">Meta</a>
+ </li>
+ <li>
+ <a class="tag" href="/tags/Alternate%20Universe%20-%20Canon%20Divergence/works">Alternate Universe - Canon Divergence</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="language">
+ Language:
+ </dt>
+ <dd class="language">
+ English
+ </dd>
+ <dt class="series">
+ Series:
+ </dt>
+ <dd class="series">
+ <span class="series"><span class="position">Part 1 of the <a href="/series/800334">Conversations with a Cryptid</a> series</span> <a class="next" href="/works/13212258">Next Work →</a></span>
+ </dd>
+ <dt class="collections">
+ Collections:
+ </dt>
+ <dd class="collections">
+ <a href="/collections/Excellent_Completed_Gen_Fics">Excellent Completed Gen &amp; Platonic Fiction</a>, <a href="/collections/Dad_For_One">Dad For One</a>, <a href="/collections/My_mustread_fics">Miscellaneous Must-read Fics</a>, <a href="/collections/thelastreclist">The Last Rec List</a>, <a href="/collections/MHABestOf">Best of My Hero Academia</a>, <a href="/collections/DadForOneByAtrunis">Atrunis' Dad For One Collection</a>, <a href="/collections/The_Witchs_Woods">The Witch's Woods</a>, <a href="/collections/MoonPaws_Hoard_of_Dad_for_One_Fics">MoonPaw's Hoard of Dad for One Fics</a>, <a href="/collections/Creative_Chaos_Discord_Recs">Creative Chaos Discord Recs</a>, <a href="/collections/Fave_Good_LONG_Fics">Long Fics to Binge</a>
+ </dd>
+ <dt class="stats">
+ Stats:
+ </dt>
+ <dd class="stats">
+ <!-- end of cache -->
+ <dl class="stats">
+ <dt class="published">
+ Published:
+ </dt>
+ <dd class="published">
+ 2017-08-15
+ </dd>
+ <dt class="status">
+ Completed:
+ </dt>
+ <dd class="status">
+ 2017-12-26
+ </dd>
+ <dt class="words">
+ Words:
+ </dt>
+ <dd class="words">
+ 67379
+ </dd>
+ <dt class="chapters">
+ Chapters:
+ </dt>
+ <dd class="chapters">
+ 14/14
+ </dd>
+ <dt class="comments">
+ Comments:
+ </dt>
+ <dd class="comments">
+ 1664
+ </dd>
+ <dt class="kudos">
+ Kudos:
+ </dt>
+ <dd class="kudos">
+ 7142
+ </dd>
+ <dt class="bookmarks">
+ Bookmarks:
+ </dt>
+ <dd class="bookmarks">
+ <a href="/works/11808918/bookmarks">1648</a>
+ </dd>
+ <dt class="hits">
+ Hits:
+ </dt>
+ <dd class="hits">
+ 152759
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ </div><!-- BEGIN section where work skin applies -->
+ <div id="workskin">
+ <div class="preface group">
+ <h2 class="title heading">
+ Conversations with a Cryptid
+ </h2>
+ <h3 class="byline heading">
+ <a rel="author" href="/users/AMournfulHowlInTheNight/pseuds/AMournfulHowlInTheNight">AMournfulHowlInTheNight</a>
+ </h3>
+ <div class="summary module" role="complementary">
+ <h3 class="heading">
+ Summary:
+ </h3>
+ <blockquote class="userstuff">
+ <p>
+ The man was over a century old. There had to be more to it. In hindsight, it hadn’t been one of Izuku’s better ideas.
+ </p>
+ </blockquote>
+ </div>
+ <div class="notes module" role="complementary">
+ <h3 class="heading">
+ Notes:
+ </h3>
+ <p class="jump">
+ (See the end of the work for <a href="/chapters/30089508#work_endnotes">notes</a>.)
+ </p>
+ </div>
+ </div>
+ <div id="chapters">
+ <!-- This partial requires local variable 'chapter' -->
+ <div class="chapter" id="chapter-1">
+ <!-- chapter management -->
+ <div class="chapter preface group" role="complementary">
+ <h3 class="title">
+ <a href="/works/11808918/chapters/26640231">Chapter 1</a>: Greetings of a Cryptid
+ </h3><!-- only display byline if different from the main byline -->
+ </div><!--main content-->
+ <div class="userstuff module" role="article">
+ <h3 class="landmark heading" id="work">
+ Chapter Text
+ </h3>
+ <p>
+ Izuku was struggling to understand how he had even managed to get here, seated before the archvillain of Japan with only a sense of dread to keep him company. All Might sat concealed in an observation room, of the firm opinion that he could only aggravate the prisoner and he sent Izuku off with a strained smile. A vague haze hovered over Izuku’s memory. It started with a simple conversation gone astray on a long drive home.
+ </p>
+ <p>
+ &#160;
+ </p>
+ <p>
+ “So, who is All For One? Do we know anything about him beyond what you told me before? He’s been imprisoned for months now.” Izuku remembered asking All Might from the backseat of the car as Detective Tsukauchi leisurely drove along a sprawling highway.
+ </p>
+ <p>
+ Playing on the car radio was an aftermath report of a villain attack in downtown Tokyo. Izuku caught the phrase “liquid body” from the female reporter before Detective Tsukauchi changed the channel.
+ </p>
+ <p>
+ “Nope. Still nothing. No one really wants to speak to him,” All Might had replied brightly. “He gives off polite airs, but he’s a piece of work.” All Might’s mostly obstructed shoulders in the front seat shrugged. “Not much you can do with someone like him. Everything that comes out is a threat or taunt.” All Might carefully waved his hand in a circular motion towards the side of his head.
+ </p>
+ <p>
+ “No one’s even made it through a full interview with him, from what I’ve heard,” Detective Tsukauchi added from behind the wheel. “He plays mind games with them. The prison also has a “no recent events” policy on any discussions with him as well. Just in case he ends up with ideas or has some means of communicating. Given that people only want to ask him about current events, it doesn’t leave much to talk about.”
+ </p>
+ <p>
+ “Wait, they still don’t know what Quirks he has?” Izuku asked exasperatedly. “They can’t if there’s still an information block on visits.”
+ </p>
+ <p>
+ “Nope. We have no idea what he can do. They can run DNA tests, but it’s not like anyone apart from him even knows how his Quirk works. They could get matches with any number of people, but if they’re not in a database then we can’t cross-reference them anyway. Even if they run an analysis, the data doesn’t mean anything without the ability to interpret it,” All Might gestured with a skeletal finger. “It’s a waste of time after the initial tests were conducted. They weren’t game to MRI him either, given he’s definitely got a Quirk that creates metal components.”
+ </p>
+ <p>
+ “No one’s bothered to ask him anything about… anything?” Izuku asked, dumbfounded. “He must be around two-hundred years old and people can’t think of a single non-current affairs thing to ask him?”
+ </p>
+ <p>
+ In some ways it was unfathomable that they’d let a potential resource go to waste. On the other hand, said potential resource had blown up a city, murdered numerous people and terrorised Japan for over a century. At the very least.
+ </p>
+ <p>
+ “Well, I tried to ask him about Shigaraki, but he didn’t say much of anything really. Some garbage about you being too dependent on me and him letting Shigaraki run wild and how he just wanted to be the ultimate evil,” All Might shrugged again. “He spends too much time talking about nothing.”
+ </p>
+ <p>
+ Izuku shifted his head onto his arm. “But, that’s not really nothing, is it?”
+ </p>
+ <p>
+ “What do you mean?” Izuku had the feeling that All Might would have been looking at him with the <i>you’re about to do something stupid aren’t you</i> expression that was thankfully becoming less common.
+ </p>
+ <p>
+ “Well, he clearly doesn’t know anything about us, All Might, if he thinks that you’re just going to let go of me after not even two years of being taught. Maybe Shigaraki was dependent on adult figures, but I don’t even remember my dad and mum’s been busy working and keeping the house together. I’ve never had a lot of adult supervision before,” Izuku laughed nervously. “I had to find ways to keep myself entertained. If anything, I’m on the disobedient side of the scale.” All Might outright giggled.
+ </p>
+ <p>
+ “I’ll say, especially after what happened with Overhaul. I’m surprised your mother let you leave the dorms again after that.”
+ </p>
+ <p>
+ “I’m surprised she didn’t withdraw and ground me until I was thirty.”
+ </p>
+ <p>
+ “Oh? That strict?” Tsukauchi asked.
+ </p>
+ <p>
+ “She has her moments,” Izuku smiled fondly. “Do you think she’d agree to me asking the archvillain of Japan about his Quirk?” Izuku asked, only partially joking. There was an itch at the back of his head, a feeling of something missing that poked and prodded at his senses.
+ </p>
+ <p>
+ All Might coughed and sprayed the dash with a fine red mist. “Absolutely not! I forbid it!”
+ </p>
+ <p>
+ “That’s exactly why I’m asking her and not you,” Izuku grinned from the backseat.
+ </p>
+ <p>
+ “He’s evil!”
+ </p>
+ <p>
+ “He’s ancient. You honestly don’t wonder about the sort of things someone with that life experience and Quirk would have run across to end up the way he did?”
+ </p>
+ <p>
+ “Nope, he made it perfectly clear that he always wanted to be the supreme evil,” All Might snipped through folded arms.
+ </p>
+ <p>
+ “Yeah, and I’ll just take his word for that, won’t I?” Izuku grinned. “If he does nothing but lie, then that’s probably one too, but there’s a grain of truth in there somewhere.”
+ </p>
+ <p>
+ “What would you even do? Harass him into telling you his life story?” All Might sighed.
+ </p>
+ <p>
+ “Not when I can kill him with kindness. Who knows, it might even be poisonous for him.”
+ </p>
+ <p>
+ “You’re explaining this to your mother. Teacher or not, I’m not being on the receiving end of this one.”
+ </p>
+ <p>
+ Izuku blinked for a moment. “You’ll let me?”
+ </p>
+ <p>
+ “I’m not entirely for it, but any prospective information on what influenced Shigaraki can only be a good thing. If anything goes south we can pull you out pretty easily. Just be aware of who and what you’re dealing with.” Struggling, All Might turned a serious look to Izuku around the side of the seat. “<i>Only</i> if your mother gives the okay.”
+ </p>
+ <p>
+ The conversation turned to school for the rest of the way.
+ </p>
+ <p>
+ &#160;
+ </p>
+ <p>
+ It might have been curiosity or it might have been the nagging sensation that chewed at his brain for the three weeks that he researched the subject of the conversation. All For One was a cryptid. Mystical in more ways than one, he was only a rumour on a network that was two-hundred years old. There were whispers of a shadowy figure who once ruled Japan, intermingled with a string of conspiracies and fragmented events.
+ </p>
+ <p>
+ Izuku had even braved the dark web, poking and prodding at some of the seedier elements of the world wide web. The internet had rumours, but the dark web had stories.<br />
+ </p>
+ <p>
+ An implied yakuza wrote about his grandfather who lost a fire manipulation Quirk and his sanity without any reason. His grandfather had been institutionalised, crying and repeating “he took it, he took it” until his dying days. No one could console him.
+ </p>
+ <p>
+ Another user spoke of a nursing home where a room full of dementia residents inexplicably became docile and no longer used their Quirks on the increasingly disturbed staff. The nursing home erupted into flames just before a court case against them commenced.
+ </p>
+ <p>
+ A user with neon pink text spoke of how their great-great-great-great grandmother with a longevity Quirk had simply aged rapidly one day and passed away in her sleep, her face a mask of terror. No cause had ever been found.
+ </p>
+ <p>
+ A hacker provided a grainy CCTV recording of a heist and a scanned collection of documents from over a century ago, where there was a flash of light and entire bank vault had been emptied. What separated it from the usual robbery was that it contained a list containing confidential information on the Quirks of the First Generation. Izuku had greedily snavelled up and saved the video and documents to an external hard drive.
+ </p>
+ <p>
+ Paging through, Izuku saw someone recount how their Quirkless uncle had developed a warp Quirk and gone from rags to riches under a mysterious benefactor. A decade ago, the uncle had simply disappeared.
+ </p>
+ <p>
+ Numerous and terrifying, the stories were scattered nuggets of gold hidden across the web. They’d never last long, vanishing within hours of posting. Izuku bounced from proxy to proxy, fleeing from a series of deletions that seemed to follow Izuku’s aliased postings across snitch.ru, rabbit.az, aconspiracy.xfiles and their compatriots.
+ </p>
+ <p>
+ After thirty-two identity changes (all carefully logged in a separate notebook), a large amount of feigning communal interest in a lucky tabloid article on All For One which had been released at the start of the first of the three weeks, Izuku hung up his tinfoil hat and called it a month. He haphazardly tossed a bulging notebook into his bookshelf and lodged his hard drive in a gap containing seven others and went to dinner.
+ </p>
+ <p>
+ It took another week to present his research to All Might and Tsukauchi, whose jaws reached the proverbial floor.
+ </p>
+ <p>
+ “We never found any of this,” the Detective Tsukauchi exclaimed. “How did you find all of it?”
+ </p>
+ <p>
+ “I asked the right people. Turns out criminals have very long and very unforgiving memories,” Izuku explained through sunken eyes. “There’s more than this that could be linked to him, but these ones seem to be the most obvious.”
+ </p>
+ <p>
+ “They would do, you can’t be head of the underworld without making an army of enemies,” All Might agreed. “You know, if you can get any more information about these events, I think you’ll give people a lot of peace of mind.”
+ </p>
+ <p>
+ “Provided mum agrees to it.”
+ </p>
+ <p>
+ “Only if she agrees to it.”
+ </p>
+ <p>
+ It took another month to convince his mother, who eventually gave in once All Might provided an extremely comprehensive schedule of how the visitations and any resulting research would be carefully balanced against Izuku’s schoolwork and internship.
+ </p>
+ <p>
+ &#160;
+ </p>
+ <p>
+ The day of the visit finally arrived, four months after the initial conversation, much to Izuku’s dismay.
+ </p>
+ <p>
+ Izuku remembered how he had arrived, with the Detective and All Might escorting him through its sterile, white innards. A list of rules rattled off at the gate, “no current affairs” was chief among them and an assertion that he’d be dragged from the room if need be if Izuku was to breach any of them. No smuggling of communication devices, no weapons, no Quirks, nothing that could compromise the prisoner’s secure status.
+ </p>
+ <p>
+ Heavily armoured and drilled guards leading him underground into the deepest bowels of the Tartarus complex.
+ </p>
+ <p>
+ Izuku understood the rules, dressed casually in a cotton t-shirt with “Shirt” printed across it in haphazard English and clutching at a carefully screened and utterly blank notebook.
+ </p>
+ <p>
+ Across from him, behind reinforced glass, the archvillain of Japan was bound and unmoving.
+ </p>
+ <p>
+ “Hello,” Izuku initiated uncertainly. His skin had been crawling the moment he crossed the threshold, a memory of the encounter and escape at the Kamino Ward months ago.
+ </p>
+ <p>
+ “Ah, All Might’s disciple,” drawled All For One, “is he too cowardly to come himself? Yet I don’t hear the garments of a hero.” With hardly a word out, All For One had already lunged for the figurative jugular.
+ </p>
+ <p>
+ A stray thought of <i>how does he know who I am if he’s blind and isn’t familiar with me?</i> whispered its way through Izuku’s head.
+ </p>
+ <p>
+ “Oh, no,” Izuku corrected hastily, almost relieved at the lack of any pretence, “I asked if I could talk to you. This isn’t exactly hero related.”
+ </p>
+ <p>
+ “I’m surprised he said yes.” While there was little by way of expression, Izuku could just about sense the contempt dripping from the prisoner’s tone. It wasn’t anything he wasn’t expecting. Kacchan had already said worse to him in earlier years. Water off a duck’s back.
+ </p>
+ <p>
+ “Well, he’s not my legal guardian, so I think you should be more surprised that mum said yes. She’s stricter with these things than All Might,” Izuku corrected again. “Mum gave the okay, but that was a stressful discussion.” And there it was, a miniscule twitch from the man opposite. A spasm more than anything else. <i>Interesting.</i> Pinned down as he was, the prisoner oozed irritation.
+ </p>
+ <p>
+ “At least your mother is a wise person. I wonder why the student doesn’t heed all of the advice of the teacher.” All For One’s tone didn’t indicate a question, so much as an implicit statement that All Might wasn’t worth listening to in any capacity. Kacchan would have hated the comparison, but the hostility had an almost comfortable familiarity. “He no doubt warned you off speaking to me, overprotective as he is, but here you are.”
+ </p>
+ <p>
+ Izuku found himself smiling at the thought of Kacchan’s outrage if he ever found out about the mental comparison as he replied. “I don’t think it’s normal for anyone my age to listen completely to their teachers. We pick and choose and run with what works best for us. He warned me, but I’m still here. Mum warned me as well, but I think she cared more about the time management aspect of it."
+ </p>
+ <p>
+ “Is that a recent development?” All For One probed.
+ </p>
+ <p>
+ “Not really. My old homeroom teacher told me not to bother applying to U.A.” His mother’s beaming face had carried Izuku through the cheerful and resolute signing of that application form.
+ </p>
+ <p>
+ “I see you followed their advice to the letter,” came the snide, dismissive reply.
+ </p>
+ <p>
+ Izuku hoisted up his legs and sat cross-legged in his seat. Leaning slightly forward as he did so as to better prop up his notebook.
+ </p>
+ <p>
+ “You’re a walking contrarian, aren’t you? All Might told me about his run ins with you. What someone does or doesn’t do really doesn’t matter to you, you’ll just find a way to rationalise it as a negative and go on the attack anyway. What you’re currently doing is drawing attention away from yourself and focusing it on me so you can withhold information.” Izuku flipped open his notebook and put pen to paper. “You’ve got something fairly big to hide and you diverting attention exposes that motivation as existing anyway. The only real questions here are what and why?” Izuku paused in mortification as the man opposite’s lips parted. “I just said that aloud, didn’t I?”
+ </p>
+ <p>
+ Of the responses Izuku had expected, it wasn’t laughter. Unrestrained, Izuku would have expected a violent outburst. In this situation, he would have expected another scathing comment. Instead, All For One laughed breathily, leaning into his bonds. Wheezingly he spoke, “I’ll have to change tactics, if that one’s too transparent for you. How refreshing.”
+ </p>
+ <p>
+ Doing his best not to glow a blinding red and simultaneously pale at the interest, Izuku carried on. “I add it to the list when you do. I’m not emotionally involved enough to really be impacted by what you’re saying. I know about you in theory, but that’s it. Maybe All Might has a history with you, but I don’t really know enough about you personally to…”
+ </p>
+ <p>
+ “Care,” All For One supplied, somewhat subdued as he struggled to breathe. “You’re only here to satisfy your curiosity as to whether or not the stories were true.”
+ </p>
+ <p>
+ Izuku nodded, scratching at his notebook with his left hand. “Yes and no, I’m actually here to ask you about how your Quirk works.” <i>For now.</i>
+ </p>
+ <p>
+ Another chortle, more restrained that the last.
+ </p>
+ <p>
+ "What makes you think others haven’t already asked?” Had All For One been unrestrained, Izuku could imagine the stereotypical scene of the villain confidently leaning back in some overblown chair in a secret lair, drink of choice in hand, if the tone of voice was any indication. Deflections aside, the man easily rose to each comment.
+ </p>
+ <p>
+ “Whether or not they asked it’s irrelevant if they can’t read the answers.” Answers didn’t matter if the people involved were too attached to read into the answers. If none of the interviewers had managed a full interview, then it seemed unlikely that any sort of effort was put into understanding the villain.
+ </p>
+ <p>
+ “And you think you can? What expertise do you hold above theirs?” Doubt and reprimand weighted the words. Oddly enough, had Izuku been any younger he could have mistaken the man for a disapproving parent rebuking an overly ambitious child. Albeit an extremely evil one.
+ </p>
+ <p>
+ Izuku inhaled shortly and went for it. “If there’s something I know, it’s Quirks and how they work. Maybe I don’t know you, but I don’t really need to. Quirks fall under broad categories of function. You can take and give, consent doesn’t seem to be a factor. You either can’t “see” certain types of Quirks or you need to have prior knowledge of it before you take it with what I know about your brother. Despite your <i>nom de guerre</i>, because we both know it’s not your real name, you have a history of giving multiple Quirks and causing brain damage to the receiver. You clearly aren’t impacted by those same restrictions, so it must either alter your brain mapping or adjust functions to allow for simultaneous use and storage. It also must isolate or categories the Quirks you stock, because from the few people who do remember you, you creating certain Quirks is always in the context of giving them to someone else meaning there’s probably an inherent immunity to stop it from tainting your own Quirk with a mutation,” Izuku mumbled, almost to himself. “The only thing really in question about your Quirk is the finer details and whether or not you need to maintain those features or if they’re inherent and your hard limit for holding Quirks.”
+ </p>
+ <p>
+ There was silence, for only a moment. “If only my hands were free, I would clap for such a thoughtful assessment. Clearly you’re not all brawn,” All For One positively purred. “Speculate away.” A wide and slightly unhinged smile was directed at Izuku.
+ </p>
+ <p>
+ It was all Izuku could do not to wince at the eagerness. An image of a nervous All Might, hidden in the observation room above with the grim-faced prison staff, came to mind.
+ </p>
+ <p>
+ “I note that you said thoughtful and not correct,” and Izuku breathed and unsteadily jotted it down in his notebook. “You don’t seem bothered by the guess.”
+ </p>
+ <p>
+ “Few people live long enough to question my Quirk, let alone have the talent to guess so thoughtfully at its functions. It seems we share a hobby.” There was something terribly keen in that voice that hadn’t been there before, twisting itself through the compliment.
+ </p>
+ <p>
+ “I suppose it helps that you’re playing along out of boredom,” Izuku verbally dodged, unease uncoiling itself from the back of his mind.
+ </p>
+ <p>
+ “I <i>was</i> playing along out of boredom,” All For One corrected smoothly. “Now, I’m curious. Admittedly, my prior assumptions of you weren’t generous, but I’ve been too hasty in my assessments before.”
+ </p>
+ <p>
+ “I’ll pack up and leave now if that’s the case,” Izuku replied with only half an ear on the conversation as the words on his page began to drastically expand to distract himself from the building anxiety.
+ </p>
+ <p>
+ “Sarcasm, so you do have characteristics of a normal teenager. Your willingness to maim yourself has often left me wondering…”
+ </p>
+ <p>
+ “You’re deflecting again,” Izuku observed. “I’m not sure if that’s a nervous habit for you or if you’re doing it because I’m close to being right about your Quirk. That being said, I don’t think you know what a normal teenager is if Shigaraki is any indication. He’s about seven years too late for his rebellious phase.”
+ </p>
+ <p>
+ “I’m hurt and offended,” came the amused reply.
+ </p>
+ <p>
+ “By how Shigaraki ended up or your parenting? You only have yourself to blame for both of them.”
+ </p>
+ <p>
+ “How harsh. Shigaraki is a product of society that birthed him. I can’t take credit for all of the hard work,” All For One laid out invitingly. Perhaps someone else would have risen to the bait, but Izuku was already packing his mental bags and heading for the door.
+ </p>
+ <p>
+ Clearly the prisoner’s anticipation had registered poorly with someone in the observation room, because a voice rang through the air. “Time’s up Midoriya-kun.”
+ </p>
+ <p>
+ “Okay!” Izuku called back and etched out his last thoughtful of words, untangled his legs and rose to his feet.
+ </p>
+ <p>
+ “What a shame, my visitations are always so short,” All For One spoke mournfully.
+ </p>
+ <p>
+ “Well, you did blow up half a city. They could have just let you suffocate instead. Same time next week, then?” Izuku offered brightly, notebook stuffed into a pocket and was followed out the door by wheezing laughter.
+ </p>
+ <p>
+ It was only after he had made it safely back to the communal room where All Might waited did he allow the spring to fade from his step and discard his nervous smile. Shuddering, he turned to All Might whose face was set in a grimace.
+ </p>
+ <p>
+ “I won’t say I told you so,” All Might offered, perched on the edge of his couch like a misshapen vulture.
+ </p>
+ <p>
+ “He’s… not really what I was expecting. I was expecting someone, more openly evil.” Izuku allowed himself to collapse into the leather of the seat. He shakily reached for the warm tea that had been clearly been prepared the moment Izuku left the cell. “I suppose he does it to lull people into a false sense of security. I didn’t understand how someone with only half a set of expressions could have “villain” written all over them until I met him.”
+ </p>
+ <p>
+ “He’s always been like that. He feigns concern and sympathy to lure in society’s outcasts. They’re easy targets,” All Might said through a mouthful of biscuit.
+ </p>
+ <p>
+ “Has he ever tried it on any of the One For All successors?”
+ </p>
+ <p>
+ “Not really, but you might have accidentally given him the incentive for it. He never had access to any of the One For All wielders while they were young.” All Might snorted, “not that it’ll make a difference with you”.
+ </p>
+ <p>
+ “I think he was trying to gauge me for a world view before the wardens ended it. I need more time to work out his response to the stuff on his Quirk.”
+ </p>
+ <p>
+ “He’s conversation starved since it’s solitary confinement. If what the people monitoring his brain activity said was true, you’re the most exciting thing to have happened to him in months. He replied after you left, said he was looking forward to it.”
+ </p>
+ <p>
+ “That’s pretty sad."
+ </p>
+ <p>
+ “It’s even sadder that we’re the only two members of the public who have had anything to do with him. Stain gets a pile of mail from his “fans”, but All For One has nothing,” All Might waved a tea spoon. “That’s what he gets.”
+ </p>
+ <p>
+ “Let’s get out of here and tell Detective Tsukauchi how it went.” Izuku gulped down his tea and headed for the exit, with him and All Might reaching it at roughly the same amount of time.
+ </p>
+ <p>
+ “At least your mum’s making katsudon for us tonight," was All Might's only optimistic comment.
+ </p>
+ <p>
+ Anxiety was still ebbing over Izuku after Tsukauchi had been debriefed in the car.
+ </p>
+ <p>
+ <i>“It seems we share a hobby.”</i> Haunted Izuku on the drive home. As if ripping someone’s Quirk from them and leaving them lying traumatised on the ground was just a fun pastime and not an act of grievous bodily harm.
+ </p>
+ <p>
+ And he’d be dealing with him again in another week.
+ </p>
+ </div><!--/main-->
+ </div><!-- end of cache -->
+ </div>
+ </div><!-- END work skin -->
+ </div><!-- END work -->
+ <!-- BEGIN comment section -->
+ <!-- Gets embedded anywhere we need to list comments on a top-level commentable. We need the local variable "commentable" here. -->
+ <div id="feedback" class="feedback" role="complementary">
+ <h3 class="landmark heading">
+ Actions
+ </h3>
+ <ul class="actions" role="navigation">
+ <li>
+ <a href="#main">↑ Top</a>
+ </li>
+ <li>
+ <a href="/works/11808918/chapters/26796918#workskin">Next Chapter →</a>
+ </li>
+ <li>
+ <form id="new_kudo" action="/kudos" accept-charset="UTF-8" method="post" name="new_kudo">
+ <input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="aGSlsAQMFHzLlh5ck7GJ0oNBgrtQtpYZmXVgjk2RsxoiyHw91kQSFZSKM33riF+ow0t+NZfZUT45qXCRC7/sgA==" /> <input value="11808918" type="hidden" name="kudo[commentable_id]" id="kudo_commentable_id" /> <input value="Work" type="hidden" name="kudo[commentable_type]" id="kudo_commentable_type" /> <input type="submit" name="commit" value="Kudos ♥" id="kudo_submit" />
+ </form>
+ </li>
+ <li id="show_comments_link">
+ <a data-remote="true" href="/comments/show_comments?chapter_id=26640231">Comments (74)</a>
+ </li>
+ </ul>
+ <div id="kudos_message"></div>
+ <h3 class="landmark heading">
+ <a name="comments" id="comments">Comments</a>
+ </h3>
+ <div id="kudos">
+ <p class="kudos">
+ <a href="/users/KuroKitsuneNoYoko">KuroKitsuneNoYoko</a>, <a href="/users/Senpakuxkira">Senpakuxkira</a>, <a href="/users/jennyjenka">jennyjenka</a>, <a href="/users/nicarose24">nicarose24</a>, <a href="/users/Devilspawn2002">Devilspawn2002</a>, <a href="/users/fixatro">fixatro</a>, <a href="/users/FeltLikeWritingAndHereIAm">FeltLikeWritingAndHereIAm</a>, <a href="/users/ShareBearNat">ShareBearNat</a>, <a href="/users/Revolvers_and_violets">Revolvers_and_violets</a>, <a href="/users/girl_with_a_sword">girl_with_a_sword</a>, <a href="/users/PerrinOfApples">PerrinOfApples</a>, <a href="/users/Sky_King">Sky_King</a>, <a href="/users/gREat_unreST">gREat_unreST</a>, <a href="/users/Sayriel">Sayriel</a>, <a href="/users/SpaceJonah">SpaceJonah</a>, <a href="/users/Sofiacasdfg">Sofiacasdfg</a>, <a href="/users/thelackvoid">thelackvoid</a>, <a href="/users/WormhuskCrown">WormhuskCrown</a>, <a href="/users/Juiji">Juiji</a>, <a href="/users/Graykip">Graykip</a>, <a href="/users/Lunatsuki">Lunatsuki</a>, <a href="/users/KaitoKitsune">KaitoKitsune</a>, <a href="/users/ShadowYonni">ShadowYonni</a>, <a href="/users/A_regrettable_choice_of_words">A_regrettable_choice_of_words</a>, <a href="/users/Atriel">Atriel</a>, <a href="/users/Kiki_Inu_Page">Kiki_Inu_Page</a>, <a href="/users/Athi816">Athi816</a>, <a href="/users/Andrea_Victoria">Andrea_Victoria</a>, <a href="/users/LeafoftheFox">LeafoftheFox</a>, <a href="/users/Iateyourcookies">Iateyourcookies</a>, <a href="/users/AirQuotes">AirQuotes</a>, <a href="/users/octaviaxanadu">octaviaxanadu</a>, <a href="/users/DemiwitchWinchester">DemiwitchWinchester</a>, <a href="/users/November_Clouds">November_Clouds</a>, <a href="/users/LittleNovaStar">LittleNovaStar</a>, <a href="/users/Dolema">Dolema</a>, <a href="/users/yuki_27">yuki_27</a>, <a href="/users/TS4Life">TS4Life</a>, <a href="/users/prince_doomed">prince_doomed</a>, <a href="/users/MemeticWarfare">MemeticWarfare</a>, <a href="/users/Lethe_Rem">Lethe_Rem</a>, <a href="/users/improbablyamartian">improbablyamartian</a>, <a href="/users/charm13insomnia">charm13insomnia</a>, <a href="/users/Whoevenisshe">Whoevenisshe</a>, <a href="/users/Scaledraws">Scaledraws</a>, <a href="/users/Dawwnni">Dawwnni</a>, <a href="/users/loganesque">loganesque</a>, <a href="/users/lil_uno">lil_uno</a>, <a href="/users/kusibi21">kusibi21</a>, <a href="/users/derbelisca">derbelisca</a>, <a id="kudos_summary" href="/works/11808918/kudos">and 3711 more users</a> <span class="kudos_expanded hidden"><a href="/users/Aquamarine_Ocean">Aquamarine_Ocean</a>, <a href="/users/Noone_is_Perfect_Im_noone">Noone_is_Perfect_Im_noone</a>, <a href="/users/FireInYourDreams">FireInYourDreams</a>, <a href="/users/JaceTheAce34">JaceTheAce34</a>, <a href="/users/StallingforGreatness">StallingforGreatness</a>, <a href="/users/flushed_flue">flushed_flue</a>, <a href="/users/Kriegswolf">Kriegswolf</a>, <a href="/users/blue_birb">blue_birb</a>, <a href="/users/Krakenonkrack437">Krakenonkrack437</a>, <a href="/users/Goblin17">Goblin17</a>, <a href="/users/alchemicalApocalypse">alchemicalApocalypse</a>, <a href="/users/tunafishprincess">tunafishprincess</a>, <a href="/users/loving_1D_louiszaynniallharryliam">loving_1D_louiszaynniallharryliam</a>, <a href="/users/Briknanana">Briknanana</a>, <a href="/users/Jocelyn523">Jocelyn523</a>, <a href="/users/ImaDMS">ImaDMS</a>, <a href="/users/Ahriel_sinalas">Ahriel_sinalas</a>, <a href="/users/Moonyshewolf">Moonyshewolf</a>, <a href="/users/original_name_that_i_thought_of">original_name_that_i_thought_of</a>, <a href="/users/Silkesukkermaas">Silkesukkermaas</a>, <a href="/users/1existential_melon">1existential_melon</a>, <a href="/users/Embrexial">Embrexial</a>, <a href="/users/sophiekwat">sophiekwat</a>, <a href="/users/wisdoms_daughter">wisdoms_daughter</a>, <a href="/users/myabug01">myabug01</a>, <a href="/users/TsukiNona">TsukiNona</a>, <a href="/users/miraculousemily47">miraculousemily47</a>, <a href="/users/TheLivingParadox">TheLivingParadox</a>, <a href="/users/white_goddess">white_goddess</a>, <a href="/users/heartofthetardis">heartofthetardis</a>, <a href="/users/Kitkat886">Kitkat886</a>, <a href="/users/Soapdish">Soapdish</a>, <a href="/users/iStarryNights">iStarryNights</a>, <a href="/users/LogicalChocolate">LogicalChocolate</a>, <a href="/users/fukk_life">fukk_life</a>, <a href="/users/Color_Me_Curious">Color_Me_Curious</a>, <a href="/users/Alexhound">Alexhound</a>, <a href="/users/CrazyHope13">CrazyHope13</a>, <a href="/users/Domic6381">Domic6381</a>, <a href="/users/MPDPOP">MPDPOP</a>, <a href="/users/AvelineGardener">AvelineGardener</a>, <a href="/users/kissmeoverthegardengate">kissmeoverthegardengate</a>, <a href="/users/Vnersacc">Vnersacc</a>, <a href="/users/Meteora_Midoriya">Meteora_Midoriya</a>, <a href="/users/HypnosThanatosTwin">HypnosThanatosTwin</a>, <a href="/users/EmberRose1434">EmberRose1434</a>, <a href="/users/xanmanmurc">xanmanmurc</a>, <a href="/users/variegated_fox">variegated_fox</a>, <a href="/users/Severus_Prince_Slytherin">Severus_Prince_Slytherin</a>, <a href="/users/Happyowl626">Happyowl626</a>, <a href="/users/Harper_warc">Harper_warc</a>, <a href="/users/Even_the_darkest_light_shines">Even_the_darkest_light_shines</a>, <a href="/users/desertbrass">desertbrass</a>, <a href="/users/Aldwych">Aldwych</a>, <a href="/users/SomniumOfLight">SomniumOfLight</a>, <a href="/users/Painter40">Painter40</a>, <a href="/users/Shadowhope">Shadowhope</a>, <a href="/users/Dragon_Inherited">Dragon_Inherited</a>, <a href="/users/qyootea">qyootea</a>, <a href="/users/daeen">daeen</a>, <a href="/users/Anonymous_Nerb">Anonymous_Nerb</a>, <a href="/users/FalseTale48">FalseTale48</a>, <a href="/users/AsianAmu">AsianAmu</a>, <a href="/users/Flashbunny">Flashbunny</a>, <a href="/users/burningclaw2">burningclaw2</a>, <a href="/users/blender_bros">blender_bros</a>, <a href="/users/ScarletRoofs">ScarletRoofs</a>, <a href="/users/We_All_Live_Under_The_Same_Sky">We_All_Live_Under_The_Same_Sky</a>, <a href="/users/clydeboi">clydeboi</a>, <a href="/users/BethBirthstone">BethBirthstone</a>, <a href="/users/artisticDragon074639">artisticDragon074639</a>, <a href="/users/Spiritmusician">Spiritmusician</a>, <a href="/users/xochiquetzalq">xochiquetzalq</a>, <a href="/users/Quantumsouls">Quantumsouls</a>, <a href="/users/Margui_hope">Margui_hope</a>, <a href="/users/EchoBass">EchoBass</a>, <a href="/users/se34">se34</a>, <a href="/users/Felkros">Felkros</a>, <a href="/users/15mitchelln">15mitchelln</a>, <a href="/users/StarBreaker">StarBreaker</a>, <a href="/users/Maerit">Maerit</a>, <a href="/users/Spark_of_Resistance">Spark_of_Resistance</a>, <a href="/users/StarBrightOtaku">StarBrightOtaku</a>, <a href="/users/JadeDrake">JadeDrake</a>, <a href="/users/Cinniomon">Cinniomon</a>, <a href="/users/IQ_Of_KaminariDenki">IQ_Of_KaminariDenki</a>, <a href="/users/Pyrite_Alchemist">Pyrite_Alchemist</a>, <a href="/users/mimomu">mimomu</a>, <a href="/users/KierWrites">KierWrites</a>, <a href="/users/Flaminga_Bazinga">Flaminga_Bazinga</a>, <a href="/users/Eren_AckermanX">Eren_AckermanX</a>, <a href="/users/eyeball_kid">eyeball_kid</a>, <a href="/users/Ibreaktheverse">Ibreaktheverse</a>, <a href="/users/wherermysocks">wherermysocks</a>, <a href="/users/raspberryicecreampls">raspberryicecreampls</a>, <a href="/users/MusingWordsmith">MusingWordsmith</a>, <a href="/users/LlamaSenpai">LlamaSenpai</a>, <a href="/users/Firefly_xo">Firefly_xo</a>, <a href="/users/Nes">Nes</a>, <a href="/users/Demifailure">Demifailure</a>, <a href="/users/WillowedMist">WillowedMist</a>, <a href="/users/draconicTemplar">draconicTemplar</a>, <a href="/users/lilaclily00">lilaclily00</a>, <a href="/users/Aramet">Aramet</a>, <a href="/users/allseer15">allseer15</a>, <a href="/users/BluJay27">BluJay27</a>, <a href="/users/lulufan54321">lulufan54321</a>, <a href="/users/Happy_little_pill">Happy_little_pill</a>, <a href="/users/KittyWitty">KittyWitty</a>, <a href="/users/loligadi">loligadi</a>, <a href="/users/Bastardwithbadtaste">Bastardwithbadtaste</a>, <a href="/users/Hyteha">Hyteha</a>, <a href="/users/fieryangel9067">fieryangel9067</a>, <a href="/users/Ohboiohboi">Ohboiohboi</a>, <a href="/users/Evie31">Evie31</a>, <a href="/users/warmkettlesandflowerpetals">warmkettlesandflowerpetals</a>, <a href="/users/RunawayDeviant">RunawayDeviant</a>, <a href="/users/LokidottirBlack">LokidottirBlack</a>, <a href="/users/Senritsuka">Senritsuka</a>, <a href="/users/CyberRoses">CyberRoses</a>, <a href="/users/shewhosnarks">shewhosnarks</a>, <a href="/users/edelweiss123">edelweiss123</a>, <a href="/users/CosmicMerman">CosmicMerman</a>, <a href="/users/ATS3">ATS3</a>, <a href="/users/mattdarsh">mattdarsh</a>, <a href="/users/Nara93">Nara93</a>, <a href="/users/BluBerryPi">BluBerryPi</a>, <a href="/users/BrightShadow">BrightShadow</a>, <a href="/users/KYS112804">KYS112804</a>, <a href="/users/gogito167">gogito167</a>, <a href="/users/StarFisher91">StarFisher91</a>, <a href="/users/Little_Kiwi_33">Little_Kiwi_33</a>, <a href="/users/Linariel">Linariel</a>, <a href="/users/Kr15xxx">Kr15xxx</a>, <a href="/users/Nicoliiita150">Nicoliiita150</a>, <a href="/users/DeerMauve">DeerMauve</a>, <a href="/users/DreamOfStarsAndRoses">DreamOfStarsAndRoses</a>, <a href="/users/writerwithoutcause">writerwithoutcause</a>, <a href="/users/OrionRigel">OrionRigel</a>, <a href="/users/tavishramsus">tavishramsus</a>, <a href="/users/MikazukiNara">MikazukiNara</a>, <a href="/users/Sh1kaN4RU_iSnoIcE">Sh1kaN4RU_iSnoIcE</a>, <a href="/users/Potlood101">Potlood101</a>, <a href="/users/Royiah">Royiah</a>, <a href="/users/domino54">domino54</a>, <a href="/users/SlyStrike">SlyStrike</a>, <a href="/users/Nuhnu">Nuhnu</a>, <a href="/users/peachandwillow">peachandwillow</a>, <a href="/users/LavendarLlama">LavendarLlama</a>, <a href="/users/pinestripes">pinestripes</a>, <a href="/users/ItStartsWithZ">ItStartsWithZ</a>, <a href="/users/Numeri">Numeri</a>, <a href="/users/LivesOffFanfics">LivesOffFanfics</a>, <a href="/users/Geek_leak">Geek_leak</a>, <a href="/users/Surprise_And_Fear">Surprise_And_Fear</a>, <a href="/users/moon01234">moon01234</a>, <a href="/users/BankaiGetsuga">BankaiGetsuga</a>, <a href="/users/sassiiscute">sassiiscute</a>, <a href="/users/CaptainTardis">CaptainTardis</a>, <a href="/users/the17thmuse">the17thmuse</a>, <a href="/users/ForestTrespass">ForestTrespass</a>, <a href="/users/Punk_Wendy">Punk_Wendy</a>, <a href="/users/Nam_Channy">Nam_Channy</a>, <a href="/users/Shionosekai">Shionosekai</a>, <a href="/users/Desmid13">Desmid13</a>, <a href="/users/Itis4amAndINeedSleep">Itis4amAndINeedSleep</a>, <a href="/users/Bisexual_Bastard">Bisexual_Bastard</a>, <a href="/users/Aj2000">Aj2000</a>, <a href="/users/jazaa">jazaa</a>, <a href="/users/Guccieyebags">Guccieyebags</a>, <a href="/users/dhyetaX1999">dhyetaX1999</a>, <a href="/users/RoseAppleThai">RoseAppleThai</a>, <a href="/users/Kate_GoldenHeart">Kate_GoldenHeart</a>, <a href="/users/Somnios">Somnios</a>, <a href="/users/Chelipede">Chelipede</a>, <a href="/users/finfangirl">finfangirl</a>, <a href="/users/sibyllinesun">sibyllinesun</a>, <a href="/users/LostLurker">LostLurker</a>, <a href="/users/Sendcakesandcookies">Sendcakesandcookies</a>, <a href="/users/FrickinGwaine">FrickinGwaine</a>, <a href="/users/Starspawn">Starspawn</a>, <a href="/users/TwoDays_of_Summer">TwoDays_of_Summer</a>, <a href="/users/DoomsdayBeamXD">DoomsdayBeamXD</a>, <a href="/users/AccioWalnut">AccioWalnut</a>, <a href="/users/Aiden_hunter">Aiden_hunter</a>, <a href="/users/SavannahBanana314">SavannahBanana314</a>, <a href="/users/HunterR">HunterR</a>, <a href="/users/Johnblue">Johnblue</a>, <a href="/users/Zgirlly">Zgirlly</a>, <a href="/users/TheJStar6">TheJStar6</a>, <a href="/users/TrishFish7">TrishFish7</a>, <a href="/users/Daidaiiro">Daidaiiro</a>, <a href="/users/Itsc">Itsc</a>, <a href="/users/Jocoserious_Oddity">Jocoserious_Oddity</a>, <a href="/users/LihaneeNiess">LihaneeNiess</a>, <a href="/users/spedicorn">spedicorn</a>, <a href="/users/xorph">xorph</a>, <a href="/users/Nettle29">Nettle29</a>, <a href="/users/Exa65536">Exa65536</a>, <a href="/users/Esoulix">Esoulix</a>, <a href="/users/Naluforever3">Naluforever3</a>, <a href="/users/KnownParadox">KnownParadox</a>, <a href="/users/Quitalea">Quitalea</a>, <a href="/users/Kuro611">Kuro611</a>, <a href="/users/SeraphWithAShotgun">SeraphWithAShotgun</a>, <a href="/users/Writeous">Writeous</a>, <a href="/users/ASuperHugeNerd">ASuperHugeNerd</a>, <a href="/users/vanxuil">vanxuil</a>, <a href="/users/Sofia1502">Sofia1502</a>, <a href="/users/Xiolluc">Xiolluc</a>, <a href="/users/NiaKoks">NiaKoks</a>, <a href="/users/JaySlayz05">JaySlayz05</a>, <a href="/users/prythian">prythian</a>, <a href="/users/KaiaLavellan">KaiaLavellan</a>, <a href="/users/William_E_Cipher13">William_E_Cipher13</a>, <a href="/users/Periwinkle_petuniak">Periwinkle_petuniak</a>, <a href="/users/Milho">Milho</a>, <a href="/users/LadyoftheNight">LadyoftheNight</a>, <a href="/users/givemeyourname">givemeyourname</a>, <a href="/users/Emissary_of_Stuff">Emissary_of_Stuff</a>, <a href="/users/MiyukiOkami4">MiyukiOkami4</a>, <a href="/users/Uhohletsnot">Uhohletsnot</a>, <a href="/users/Keekry">Keekry</a>, <a href="/users/SaitamaSenpai">SaitamaSenpai</a>, <a href="/users/ebil_angel">ebil_angel</a>, <a href="/users/tigers1661">tigers1661</a>, <a href="/users/imnothere121">imnothere121</a>, <a href="/users/XxChronOblivionxX">XxChronOblivionxX</a>, <a href="/users/Koltrast">Koltrast</a>, <a href="/users/eusojgeraldo">eusojgeraldo</a>, <a href="/users/Ranubis">Ranubis</a>, <a href="/users/Arkham_Wyntier">Arkham_Wyntier</a>, <a href="/users/RainySoul">RainySoul</a>, <a href="/users/Izuka_Ren">Izuka_Ren</a>, <a href="/users/Popiplant">Popiplant</a>, <a href="/users/Doodlebotbop">Doodlebotbop</a>, <a href="/users/bloodinamug">bloodinamug</a>, <a href="/users/StopStealingMyShoes">StopStealingMyShoes</a>, <a href="/users/aquagirl555">aquagirl555</a>, <a href="/users/Theatrix">Theatrix</a>, <a href="/users/Aubri96">Aubri96</a>, <a href="/users/EscapingPerfection">EscapingPerfection</a>, <a href="/users/Arinna_Neo_Conquerra">Arinna_Neo_Conquerra</a>, <a href="/users/YeetYeet_NootNoot">YeetYeet_NootNoot</a>, <a href="/users/EternalDisc">EternalDisc</a>, <a href="/users/MaesHughes">MaesHughes</a>, <a href="/users/sophycroft">sophycroft</a>, <a href="/users/StellasVidere">StellasVidere</a>, <a href="/users/saya1998">saya1998</a>, <a href="/users/AnisEileen">AnisEileen</a>, <a href="/users/Addemiusinksoul">Addemiusinksoul</a>, <a href="/users/Stratagemini">Stratagemini</a>, <a href="/users/AkiraYuni">AkiraYuni</a>, <a href="/users/Mazongian">Mazongian</a>, <a href="/users/nekofangirl101">nekofangirl101</a>, <a href="/users/saeranisbaeran1030">saeranisbaeran1030</a>, <a href="/users/simple_velleity">simple_velleity</a>, <a href="/users/Jiryrig">Jiryrig</a>, <a href="/users/FanFicFan13">FanFicFan13</a>, <a href="/users/Dragons_Bane">Dragons_Bane</a>, <a href="/users/pointyellan">pointyellan</a>, <a href="/users/nodza">nodza</a>, <a href="/users/crionsmush">crionsmush</a>, <a href="/users/randomuser3">randomuser3</a>, <a href="/users/HyperionMalfoy">HyperionMalfoy</a>, <a href="/users/Samlikespigs">Samlikespigs</a>, <a href="/users/TeaGreen">TeaGreen</a>, <a href="/users/kitchensync">kitchensync</a>, <a href="/users/Claup_loves_pie">Claup_loves_pie</a>, <a href="/users/PirateDetective01">PirateDetective01</a>, <a href="/users/ChiakiBestGamer">ChiakiBestGamer</a>, <a href="/users/Allstarall">Allstarall</a>, <a href="/users/nicomad">nicomad</a>, <a href="/users/henderson28">henderson28</a>, <a href="/users/Sammyjoco">Sammyjoco</a>, <a href="/users/katachresis">katachresis</a>, <a href="/users/c_ssius">c_ssius</a>, <a href="/users/AnimeLover513">AnimeLover513</a>, <a href="/users/FallenShadow950">FallenShadow950</a>, <a href="/users/Eren_Agreste">Eren_Agreste</a>, <a href="/users/The_Mythical_Bookwyrm">The_Mythical_Bookwyrm</a>, <a href="/users/imhaving_yourbaby">imhaving_yourbaby</a>, <a href="/users/Zelando555">Zelando555</a>, <a href="/users/RowlettLesbian">RowlettLesbian</a>, <a href="/users/Bocchaneko">Bocchaneko</a>, <a href="/users/onewhodies">onewhodies</a>, <a href="/users/noflatsnosharps">noflatsnosharps</a>, <a href="/users/hanarsweater">hanarsweater</a>, <a href="/users/Discord_world">Discord_world</a>, <a href="/users/lionjazz45">lionjazz45</a>, <a href="/users/SwirlingDreams">SwirlingDreams</a>, <a href="/users/Animegirl317">Animegirl317</a>, <a href="/users/Spiritfox412">Spiritfox412</a>, <a href="/users/InsertEndCredits">InsertEndCredits</a>, <a href="/users/space_race">space_race</a>, <a href="/users/heart_of_the_devil">heart_of_the_devil</a>, <a href="/users/Karmania">Karmania</a>, <a href="/users/DarylSun">DarylSun</a>, <a href="/users/egwenechapters">egwenechapters</a>, <a href="/users/freakin_out">freakin_out</a>, <a href="/users/mOssiChryrz">mOssiChryrz</a>, <a href="/users/Kallen99">Kallen99</a>, <a href="/users/quinluna">quinluna</a>, <a href="/users/DarkkBluee">DarkkBluee</a>, <a href="/users/Foggydaysahead">Foggydaysahead</a>, <a href="/users/thechargrey">thechargrey</a>, <a href="/users/Sekkaii">Sekkaii</a>, <a href="/users/Tukata733">Tukata733</a>, <a href="/users/KittyMina3">KittyMina3</a>, <a href="/users/dropsofargent">dropsofargent</a>, <a href="/users/The_Dark_Side_Of_The_Moon74">The_Dark_Side_Of_The_Moon74</a>, <a href="/users/AikaStrum">AikaStrum</a>, <a href="/users/drippingmoonwax">drippingmoonwax</a>, <a href="/users/iremi678">iremi678</a>, <a href="/users/A_Crazy_Potato">A_Crazy_Potato</a>, <a href="/users/Zim">Zim</a>, <a href="/users/WhiteDoe">WhiteDoe</a>, <a href="/users/Jenson1990">Jenson1990</a>, <a href="/users/magic_cherry_pie">magic_cherry_pie</a>, <a href="/users/Anon42">Anon42</a>, <a href="/users/crossroadswrite">crossroadswrite</a>, <a href="/users/Bioslayer">Bioslayer</a>, <a href="/users/Markala">Markala</a>, <a href="/users/nog">nog</a>, <a href="/users/IceLily">IceLily</a>, <a href="/users/kattrina123">kattrina123</a>, <a href="/users/JessSprinkles">JessSprinkles</a>, <a href="/users/FenValkyrie">FenValkyrie</a>, <a href="/users/Sno0o0o0o0py">Sno0o0o0o0py</a>, <a href="/users/saraphynx">saraphynx</a>, <a href="/users/aWizardDidIt">aWizardDidIt</a>, <a href="/users/Lazy_Hitoshi">Lazy_Hitoshi</a>, <a href="/users/Sehri">Sehri</a>, <a href="/users/teenage_dystopian_book_nerd">teenage_dystopian_book_nerd</a>, <a href="/users/HellboundShadow">HellboundShadow</a>, <a href="/users/Aquila_Altair">Aquila_Altair</a>, <a href="/users/The_GrandWolf">The_GrandWolf</a>, <a href="/users/AnyMoreBrightIdeas">AnyMoreBrightIdeas</a>, <a href="/users/MidnightFenrir">MidnightFenrir</a>, <a href="/users/Bahey">Bahey</a>, <a href="/users/AriaPMDEoL">AriaPMDEoL</a>, <a href="/users/QueenQuinn">QueenQuinn</a>, <a href="/users/gaviotta1">gaviotta1</a>, <a href="/users/Exo7421">Exo7421</a>, <a href="/users/Catzooa">Catzooa</a>, <a href="/users/LumenWatch">LumenWatch</a>, <a href="/users/tatsuhiro">tatsuhiro</a>, <a href="/users/thebuttofexo">thebuttofexo</a>, <a href="/users/Iris_Nss">Iris_Nss</a>, <a href="/users/Blacknekopower">Blacknekopower</a>, <a href="/users/Sgcohn18">Sgcohn18</a>, <a href="/users/jaspeada0928">jaspeada0928</a>, <a href="/users/Spiritedaway1997">Spiritedaway1997</a>, <a href="/users/TheBrightNoise">TheBrightNoise</a>, <a href="/users/ultimatequeenoffandoms">ultimatequeenoffandoms</a>, <a href="/users/LokasennaHiddleston">LokasennaHiddleston</a>, <a href="/users/FreddieFerret">FreddieFerret</a>, <a href="/users/fannydespres">fannydespres</a>, <a href="/users/Wowza_subway">Wowza_subway</a>, <a href="/users/Melancholy_Pug">Melancholy_Pug</a>, <a href="/users/Galacti_Turtle">Galacti_Turtle</a>, <a href="/users/fififlame_mangafan">fififlame_mangafan</a>, <a href="/users/CyanRaven">CyanRaven</a>, <a href="/users/Cosmic_Spaceship">Cosmic_Spaceship</a>, <a href="/users/peacefulfaerie">peacefulfaerie</a>, <a href="/users/Shin_Akazawa">Shin_Akazawa</a>, <a href="/users/lucilu">lucilu</a>, <a href="/users/qori">qori</a>, <a href="/users/Silverstring">Silverstring</a>, <a href="/users/ireallydunno">ireallydunno</a>, <a href="/users/chokinghazard135">chokinghazard135</a>, <a href="/users/Lawrenciumbash42">Lawrenciumbash42</a>, <a href="/users/belbug210">belbug210</a>, <a href="/users/Crazycat289">Crazycat289</a>, <a href="/users/Disasternoj">Disasternoj</a>, <a href="/users/skywright">skywright</a>, <a href="/users/Klance_In_My_Pants">Klance_In_My_Pants</a>, <a href="/users/KinkyKatsudon">KinkyKatsudon</a>, <a href="/users/BokUgglan">BokUgglan</a>, <a href="/users/lurking_dragon">lurking_dragon</a>, <a href="/users/anary2002">anary2002</a>, <a href="/users/AkiseAru1010">AkiseAru1010</a>, <a href="/users/So_Yeah_Lolo">So_Yeah_Lolo</a>, <a href="/users/Dustier7">Dustier7</a>, <a href="/users/taytot777">taytot777</a>, <a href="/users/Zilluminate">Zilluminate</a>, <a href="/users/BlackPantherFandoms">BlackPantherFandoms</a>, <a href="/users/MidnightAvenger">MidnightAvenger</a>, <a href="/users/Pownbattle">Pownbattle</a>, <a href="/users/UltraQueenOfTheNerds">UltraQueenOfTheNerds</a>, <a href="/users/AlbiNora">AlbiNora</a>, <a href="/users/kixxy23">kixxy23</a>, <a href="/users/Cosmic_Colors">Cosmic_Colors</a>, <a href="/users/DumbBitchWitch">DumbBitchWitch</a>, <a href="/users/620_knock_on_wood_202525">620_knock_on_wood_202525</a>, <a href="/users/butthulu">butthulu</a>, <a href="/users/RamenNoodlesAndTeaPlease">RamenNoodlesAndTeaPlease</a>, <a href="/users/sapassde">sapassde</a>, <a href="/users/Livindina">Livindina</a>, <a href="/users/Quirky_Individual">Quirky_Individual</a>, <a href="/users/Peribow">Peribow</a>, <a href="/users/kittyissac">kittyissac</a>, <a href="/users/KinkyDeathMagic">KinkyDeathMagic</a>, <a href="/users/Curses">Curses</a>, <a href="/users/Mysifuss">Mysifuss</a>, <a href="/users/melon_bread">melon_bread</a>, <a href="/users/Scy2007yay">Scy2007yay</a>, <a href="/users/Fire_on_Ice">Fire_on_Ice</a>, <a href="/users/Nrlliyna">Nrlliyna</a>, <a href="/users/Puppetmaster13">Puppetmaster13</a>, <a href="/users/MeltedTeeth">MeltedTeeth</a>, <a href="/users/BlueBloodjay16">BlueBloodjay16</a>, <a href="/users/atrumnemus">atrumnemus</a>, <a href="/users/bookworm_94">bookworm_94</a>, <a href="/users/MrPrecedent">MrPrecedent</a>, <a href="/users/Silsmcginty">Silsmcginty</a>, <a href="/users/Atalante241">Atalante241</a>, <a href="/users/Juleswrites">Juleswrites</a>, <a href="/users/NoNameCrushedStar">NoNameCrushedStar</a>, <a href="/users/ayienne">ayienne</a>, <a href="/users/Alinicia">Alinicia</a>, <a href="/users/TyRose">TyRose</a>, <a href="/users/0and0the0only0one0that0is0not0working0">0and0the0only0one0that0is0not0working0</a>, <a href="/users/AnaDielle">AnaDielle</a>, <a href="/users/Shadowedred">Shadowedred</a>, <a href="/users/cyber_phobia">cyber_phobia</a>, <a href="/users/Melfog">Melfog</a>, <a href="/users/AyaVoltaire">AyaVoltaire</a>, <a href="/users/penpaulkon46">penpaulkon46</a>, <a href="/users/Jaided_x">Jaided_x</a>, <a href="/users/Joewue">Joewue</a>, <a href="/users/Louise_Tjadina">Louise_Tjadina</a>, <a href="/users/Ronnambi">Ronnambi</a>, <a href="/users/Ocean_On_Fire">Ocean_On_Fire</a>, <a href="/users/Acwellen">Acwellen</a>, <a href="/users/timelords_as_paladins">timelords_as_paladins</a>, <a href="/users/Laineygaynee">Laineygaynee</a>, <a href="/users/Kyran_Kandosa">Kyran_Kandosa</a>, <a href="/users/JohnDaDragon">JohnDaDragon</a>, <a href="/users/PandaCatXD">PandaCatXD</a>, <a href="/users/L_Anna">L_Anna</a>, <a href="/users/theNewDesire">theNewDesire</a>, <a href="/users/experimentaldrama">experimentaldrama</a>, <a href="/users/drpepper_and_takis_for_lunch">drpepper_and_takis_for_lunch</a>, <a href="/users/Shanter317">Shanter317</a>, <a href="/users/IceBlack">IceBlack</a>, <a href="/users/Missingjay">Missingjay</a>, <a href="/users/Silvershadowleaf">Silvershadowleaf</a>, <a href="/users/SioSpace">SioSpace</a>, <a href="/users/Yoshikitty">Yoshikitty</a>, <a href="/users/Noxilicious">Noxilicious</a>, <a href="/users/zitacica">zitacica</a>, <a href="/users/Ntchick">Ntchick</a>, <a href="/users/IsThatHowItsSpelled">IsThatHowItsSpelled</a>, <a href="/users/LadyDragonrain">LadyDragonrain</a>, <a href="/users/matchasoba">matchasoba</a>, <a href="/users/Ahlala">Ahlala</a>, <a href="/users/Cake55">Cake55</a>, <a href="/users/Tyto11">Tyto11</a>, <a href="/users/Zafar">Zafar</a>, <a href="/users/AstaraelDarkrahBlack">AstaraelDarkrahBlack</a>, <a href="/users/jrmyknx">jrmyknx</a>, <a href="/users/TheOsirisDeclaration">TheOsirisDeclaration</a>, <a href="/users/Ukelene">Ukelene</a>, <a href="/users/kickassdani">kickassdani</a>, <a href="/users/AnoosLord">AnoosLord</a>, <a href="/users/ruinjvpiter">ruinjvpiter</a>, <a href="/users/Neaislove">Neaislove</a>, <a href="/users/jt1993">jt1993</a>, <a href="/users/Choul__Gat">Choul__Gat</a>, <a href="/users/Jak8714">Jak8714</a>, <a href="/users/Akashi_Seijiro">Akashi_Seijiro</a>, <a href="/users/DarkWine">DarkWine</a>, <a href="/users/longsufferingsigh">longsufferingsigh</a>, <a href="/users/blazingpotato42">blazingpotato42</a>, <a href="/users/lovelysandlonelys">lovelysandlonelys</a>, <a href="/users/NobuMcshoot">NobuMcshoot</a>, <a href="/users/tsos">tsos</a>, <a href="/users/MCAAZ">MCAAZ</a>, <a href="/users/DeliciousJinx">DeliciousJinx</a>, <a href="/users/notdexterousatall">notdexterousatall</a>, <a href="/users/Violetta01">Violetta01</a>, <a href="/users/amball2000">amball2000</a>, <a href="/users/ShadowNic94">ShadowNic94</a>, <a href="/users/Selenite_Flowers">Selenite_Flowers</a>, <a href="/users/iamarosegarden">iamarosegarden</a>, <a href="/users/kazuaishi">kazuaishi</a>, <a href="/users/SpookyGhost47">SpookyGhost47</a>, <a href="/users/M3G">M3G</a>, <a href="/users/lillicat">lillicat</a>, <a href="/users/Newmoon1399">Newmoon1399</a>, <a href="/users/AshleyReveur">AshleyReveur</a>, <a href="/users/monsterinthetrees">monsterinthetrees</a>, <a href="/users/sorbetlion">sorbetlion</a>, <a href="/users/weeb_with_a_need">weeb_with_a_need</a>, <a href="/users/miyunariorio">miyunariorio</a>, <a href="/users/Vesca">Vesca</a>, <a href="/users/WindSage">WindSage</a>, <a href="/users/Patolemus">Patolemus</a>, <a href="/users/Winkerpie">Winkerpie</a>, <a href="/users/Kuzman">Kuzman</a>, <a href="/users/5p1d3y_91rl">5p1d3y_91rl</a>, <a href="/users/Moonpie372">Moonpie372</a>, <a href="/users/Elder_Cryptid">Elder_Cryptid</a>, <a href="/users/Mike439">Mike439</a>, <a href="/users/Cheycheywolf">Cheycheywolf</a>, <a href="/users/InugamiGuru">InugamiGuru</a>, <a href="/users/BlackRabbit95">BlackRabbit95</a>, <a href="/users/Androdom">Androdom</a>, <a href="/users/InfernalSodaPop">InfernalSodaPop</a>, <a href="/users/Vickypedia">Vickypedia</a>, <a href="/users/HarukaNana">HarukaNana</a>, <a href="/users/TeSs_SaMuRaI">TeSs_SaMuRaI</a>, <a href="/users/gossipmonger">gossipmonger</a>, <a href="/users/Hebecious">Hebecious</a>, <a href="/users/AwesomeAllison">AwesomeAllison</a>, <a href="/users/vaste">vaste</a>, <a href="/users/Rosely">Rosely</a>, <a href="/users/Tinyponytail">Tinyponytail</a>, <a href="/users/Coolmars500">Coolmars500</a>, <a href="/users/Buzzardonic">Buzzardonic</a>, <a href="/users/CaptainPotato">CaptainPotato</a>, <a href="/users/Sethyles">Sethyles</a>, <a href="/users/vikxx91">vikxx91</a>, <a href="/users/RandomPsychoticPerson">RandomPsychoticPerson</a>, <a href="/users/Arrii77">Arrii77</a>, <a href="/users/icecat">icecat</a>, <a href="/users/littlepenguin96">littlepenguin96</a>, <a href="/users/Mistike">Mistike</a>, <a href="/users/moi1">moi1</a>, <a href="/users/Abrinei">Abrinei</a>, <a href="/users/Hachimen">Hachimen</a>, <a href="/users/pawel111223">pawel111223</a>, <a href="/users/Shiny9Tails">Shiny9Tails</a>, <a href="/users/Perky">Perky</a>, <a href="/users/Demi_Wizard">Demi_Wizard</a>, <a href="/users/friedeggs">friedeggs</a>, <a href="/users/creepycrabs">creepycrabs</a>, <a href="/users/hungryliar">hungryliar</a>, <a href="/users/RBLynn">RBLynn</a>, <a href="/users/amber_glowbug">amber_glowbug</a>, <a href="/users/lane09">lane09</a>, <a href="/users/AnnAisu">AnnAisu</a>, <a href="/users/WolfenaxDart">WolfenaxDart</a>, <a href="/users/Ok_waIT_WHAT">Ok_waIT_WHAT</a>, <a href="/users/Francis_Pomodoro">Francis_Pomodoro</a>, <a href="/users/ExplodedChocobo">ExplodedChocobo</a>, <a href="/users/Biuebeiis">Biuebeiis</a>, <a href="/users/Susurra">Susurra</a>, <a href="/users/teapot_lighthouse">teapot_lighthouse</a>, <a href="/users/AlteraWinter">AlteraWinter</a>, <a href="/users/SleepyCallaLily">SleepyCallaLily</a>, <a href="/users/c0l0r_bl1nd_n355">c0l0r_bl1nd_n355</a>, <a href="/users/legendoftheotherside">legendoftheotherside</a>, <a href="/users/Pikabolt">Pikabolt</a>, <a href="/users/Ch_ee_rios">Ch_ee_rios</a>, <a href="/users/Scoobygirl45">Scoobygirl45</a>, <a href="/users/Sorreltail24">Sorreltail24</a>, <a href="/users/KittfoxHowlett">KittfoxHowlett</a>, <a href="/users/salsas100">salsas100</a>, <a href="/users/Foxdemonsrock">Foxdemonsrock</a>, <a href="/users/quivivraverra">quivivraverra</a>, <a href="/users/Amthyst">Amthyst</a>, <a href="/users/PunkAssKid">PunkAssKid</a>, <a href="/users/ichorsun">ichorsun</a>, <a href="/users/Samaren">Samaren</a>, <a href="/users/Ovlet">Ovlet</a>, <a href="/users/Tatrin">Tatrin</a>, <a href="/users/sftjinwoo">sftjinwoo</a>, <a href="/users/honeytt">honeytt</a>, <a href="/users/Randomfandoms389">Randomfandoms389</a>, <a href="/users/A_TopHat_for_two">A_TopHat_for_two</a>, <a href="/users/XRainbowXToadXPowerX">XRainbowXToadXPowerX</a>, <a href="/users/MsMilitaryPants">MsMilitaryPants</a>, <a href="/users/MinhAnh">MinhAnh</a>, <a href="/users/Aceto_Shiobana">Aceto_Shiobana</a>, <a href="/users/cytokines">cytokines</a>, <a href="/users/LegallyGrey">LegallyGrey</a>, <a href="/users/neko6ghost">neko6ghost</a>, <a href="/users/Bodardos">Bodardos</a>, <a href="/users/Blackbird3210">Blackbird3210</a>, <a href="/users/Troubledtoffee">Troubledtoffee</a>, <a href="/users/CloudofChange">CloudofChange</a>, <a href="/users/BoundlessBlood">BoundlessBlood</a>, <a href="/users/TheDragonTribes">TheDragonTribes</a>, <a href="/users/SpareBucketTurtle">SpareBucketTurtle</a>, <a href="/users/Cante_Merle">Cante_Merle</a>, <a href="/users/Zembu_Mirume">Zembu_Mirume</a>, <a href="/users/VODLIX">VODLIX</a>, <a href="/users/otomerson">otomerson</a>, <a href="/users/Unluck">Unluck</a>, <a href="/users/MagicKit">MagicKit</a>, <a href="/users/Less_Ginger">Less_Ginger</a>, <a href="/users/exquisitesarcasm">exquisitesarcasm</a>, <a href="/users/TaeWaifu123">TaeWaifu123</a>, <a href="/users/Chromo">Chromo</a>, <a href="/users/ishouldbe_sleeping">ishouldbe_sleeping</a>, <a href="/users/herchocolateeyes">herchocolateeyes</a>, <a href="/users/TwistedHilarity">TwistedHilarity</a>, <a href="/users/liffie">liffie</a>, <a href="/users/indecisivethings">indecisivethings</a>, <a href="/users/AirKat">AirKat</a>, <a href="/users/Crumbles_Of_Reality">Crumbles_Of_Reality</a>, <a href="/users/Friendly_Neighborhood_Loser">Friendly_Neighborhood_Loser</a>, <a href="/users/Lebellerose">Lebellerose</a>, <a href="/users/cyber_inkblot">cyber_inkblot</a>, <a href="/users/Cece_Summer">Cece_Summer</a>, <a href="/users/Lil_Sdum">Lil_Sdum</a>, <a href="/users/DotLibrarian">DotLibrarian</a>, <a href="/users/m_phoenix">m_phoenix</a>, <a href="/users/Nemocyte">Nemocyte</a>, <a href="/users/amberquartz">amberquartz</a>, <a href="/users/ColbaltBlueBird">ColbaltBlueBird</a>, <a href="/users/musicformiles">musicformiles</a>, <a href="/users/Membura">Membura</a>, <a href="/users/The_Nightshade_Serpent">The_Nightshade_Serpent</a>, <a href="/users/b_heapoft">b_heapoft</a>, <a href="/users/GabeTheWriter">GabeTheWriter</a>, <a href="/users/The_Dragon_Keeper">The_Dragon_Keeper</a>, <a href="/users/cherriesxpeaches">cherriesxpeaches</a>, <a href="/users/Tuttitay7">Tuttitay7</a>, <a href="/users/strider_gum">strider_gum</a>, <a href="/users/PrinceFins">PrinceFins</a>, <a href="/users/Miomie">Miomie</a>, <a href="/users/Markus_Antonius">Markus_Antonius</a>, <a href="/users/Sayaka194992">Sayaka194992</a>, <a href="/users/TheMexicanAttacker">TheMexicanAttacker</a>, <a href="/users/SamaritanSchtick">SamaritanSchtick</a>, <a href="/users/imprismed">imprismed</a>, <a href="/users/Jcjonesacp">Jcjonesacp</a>, <a href="/users/Yuurix3">Yuurix3</a>, <a href="/users/Rainwhen">Rainwhen</a>, <a href="/users/Banana_Breader">Banana_Breader</a>, <a href="/users/Oralain">Oralain</a>, <a href="/users/Garamoji">Garamoji</a>, <a href="/users/FloralDinosaur">FloralDinosaur</a>, <a href="/users/FieryLight">FieryLight</a>, <a href="/users/Screenlight">Screenlight</a>, <a href="/users/PachiiRiisu">PachiiRiisu</a>, <a href="/users/Darke13">Darke13</a>, <a href="/users/Kokujin">Kokujin</a>, <a href="/users/Lypten">Lypten</a>, <a href="/users/cadrack">cadrack</a>, <a href="/users/Pikapokemon101">Pikapokemon101</a>, <a href="/users/Fehrentie">Fehrentie</a>, <a href="/users/Themostawesomeninja_07">Themostawesomeninja_07</a>, <a href="/users/Haemin">Haemin</a>, <a href="/users/BangerHat">BangerHat</a>, <a href="/users/Tynamomaniac">Tynamomaniac</a>, <a href="/users/birdcatt">birdcatt</a>, <a href="/users/Rivas_gaby">Rivas_gaby</a>, <a href="/users/HolisticFlower">HolisticFlower</a>, <a href="/users/hikarinchan">hikarinchan</a>, <a href="/users/Sumeris">Sumeris</a>, <a href="/users/Happy_lil_Alex">Happy_lil_Alex</a>, <a href="/users/Shadow_hunter93">Shadow_hunter93</a>, <a href="/users/iamaba">iamaba</a>, <a href="/users/JustAnAgender">JustAnAgender</a>, <a href="/users/luminaessence">luminaessence</a>, <a href="/users/TheAnswerIsAlways42">TheAnswerIsAlways42</a>, <a href="/users/DREVtheProcrastinator">DREVtheProcrastinator</a>, <a href="/users/Sorceress_Of_Time">Sorceress_Of_Time</a>, <a href="/users/SlipScout">SlipScout</a>, <a href="/users/Sulfuric_animus">Sulfuric_animus</a>, <a href="/users/Vexximus">Vexximus</a>, <a href="/users/Secretkemi">Secretkemi</a>, <a href="/users/Wylder">Wylder</a>, <a href="/users/Nekoboii">Nekoboii</a>, <a href="/users/radioactivegumdrop">radioactivegumdrop</a>, <a href="/users/HisNameIsMyNM2">HisNameIsMyNM2</a>, <a href="/users/ravenarmegeddonsreaper">ravenarmegeddonsreaper</a>, <a href="/users/graveExcitement">graveExcitement</a>, <a href="/users/Shivnaka">Shivnaka</a>, <a href="/users/Shayde_In_Life">Shayde_In_Life</a>, <a href="/users/LaundryHamper">LaundryHamper</a>, <a href="/users/jay_somnia">jay_somnia</a>, <a href="/users/daekie">daekie</a>, <a href="/users/Lily_Nina_123">Lily_Nina_123</a>, <a href="/users/Tinnmal">Tinnmal</a>, <a href="/users/Gelsodo">Gelsodo</a>, <a href="/users/Okeydokeyokey">Okeydokeyokey</a>, <a href="/users/ShipperOfFandoms04">ShipperOfFandoms04</a>, <a href="/users/Dennisa22">Dennisa22</a>, <a href="/users/AromageSakura">AromageSakura</a>, <a href="/users/Logar3">Logar3</a>, <a href="/users/12Redsky34">12Redsky34</a>, <a href="/users/Celestial3">Celestial3</a>, <a href="/users/Duhkha">Duhkha</a>, <a href="/users/J_a_c_o_b_y_123">J_a_c_o_b_y_123</a>, <a href="/users/FadingRiver">FadingRiver</a>, <a href="/users/Soyvolon">Soyvolon</a>, <a href="/users/Ddkeac">Ddkeac</a>, <a href="/users/Rix1998">Rix1998</a>, <a href="/users/fallen_stars">fallen_stars</a>, <a href="/users/Queencraft">Queencraft</a>, <a href="/users/AutumnAgain">AutumnAgain</a>, <a href="/users/lifeisbeautifulandpretty">lifeisbeautifulandpretty</a>, <a href="/users/PatateDouce">PatateDouce</a>, <a href="/users/LadyAthos">LadyAthos</a>, <a href="/users/JustAGirlInFanland">JustAGirlInFanland</a>, <a href="/users/IcyShadow">IcyShadow</a>, <a href="/users/My_pet_pig_said_you_aint_shit">My_pet_pig_said_you_aint_shit</a>, <a href="/users/WhiteBishop">WhiteBishop</a>, <a href="/users/WassanT004">WassanT004</a>, <a href="/users/Canaria0">Canaria0</a>, <a href="/users/on_clockwork_wings">on_clockwork_wings</a>, <a href="/users/Pettanko_Tackle">Pettanko_Tackle</a>, <a href="/users/UniqueSpeciesOfGabby">UniqueSpeciesOfGabby</a>, <a href="/users/MiniSparkler">MiniSparkler</a>, <a href="/users/NinjaLuna">NinjaLuna</a>, <a href="/users/QuestDawnWolf">QuestDawnWolf</a>, <a href="/users/ChemicalFallOut5">ChemicalFallOut5</a>, <a href="/users/nerdpersonKT">nerdpersonKT</a>, <a href="/users/BlaiseVaguebakenekomata">BlaiseVaguebakenekomata</a>, <a href="/users/CharlesWaterloo">CharlesWaterloo</a>, <a href="/users/ToumeiKyoudai">ToumeiKyoudai</a>, <a href="/users/Kelo51">Kelo51</a>, <a href="/users/GratiaPuella">GratiaPuella</a>, <a href="/users/otakuninja14">otakuninja14</a>, <a href="/users/SoroTheAndroid">SoroTheAndroid</a>, <a href="/users/Under_a_fucking_cover">Under_a_fucking_cover</a>, <a href="/users/Voltron_Kpop_Trash">Voltron_Kpop_Trash</a>, <a href="/users/jonna594">jonna594</a>, <a href="/users/UranianUmbrella">UranianUmbrella</a>, <a href="/users/fortuna16">fortuna16</a>, <a href="/users/Random_Corpse">Random_Corpse</a>, <a href="/users/StaticTelevisiom">StaticTelevisiom</a>, <a href="/users/CBookWyrm">CBookWyrm</a>, <a href="/users/MissP">MissP</a>, <a href="/users/Yue_owo">Yue_owo</a>, <a href="/users/SlytherinXiao">SlytherinXiao</a>, <a href="/users/Galaxy_Kryptonite">Galaxy_Kryptonite</a>, <a href="/users/dolocia">dolocia</a>, <a href="/users/BlueUnicorn24">BlueUnicorn24</a>, <a href="/users/alertsacks">alertsacks</a>, <a href="/users/Cornonlecob">Cornonlecob</a>, <a href="/users/Rising_Fandoms">Rising_Fandoms</a>, <a href="/users/alyssglacias">alyssglacias</a>, <a href="/users/Ididntsignupforthesefeels">Ididntsignupforthesefeels</a>, <a href="/users/FangOfTheFrozenWinds">FangOfTheFrozenWinds</a>, <a href="/users/gilly45">gilly45</a>, <a href="/users/Rosewatery">Rosewatery</a>, <a href="/users/porqupique">porqupique</a>, <a href="/users/Bengnuih">Bengnuih</a>, <a href="/users/Digeridoodler">Digeridoodler</a>, <a href="/users/Wildsong">Wildsong</a>, <a href="/users/Marisul">Marisul</a>, <a href="/users/ReedRead0503">ReedRead0503</a>, <a href="/users/freakingbored123">freakingbored123</a>, <a href="/users/Hawkie_Bird_27">Hawkie_Bird_27</a>, <a href="/users/keysanddaydreaming">keysanddaydreaming</a>, <a href="/users/Halorrui">Halorrui</a>, <a href="/users/archer007">archer007</a>, <a href="/users/Ihatechairs">Ihatechairs</a>, <a href="/users/Orkiod_Inquisitor">Orkiod_Inquisitor</a>, <a href="/users/Aliceos">Aliceos</a>, <a href="/users/waxpet">waxpet</a>, <a href="/users/RedRoseLolly">RedRoseLolly</a>, <a href="/users/Nihulus">Nihulus</a>, <a href="/users/Hecate1412">Hecate1412</a>, <a href="/users/CurseOfAnAddict">CurseOfAnAddict</a>, <a href="/users/mossy_green">mossy_green</a>, <a href="/users/Aethelar">Aethelar</a>, <a href="/users/Delee">Delee</a>, <a href="/users/KelseyCake">KelseyCake</a>, <a href="/users/muuu">muuu</a>, <a href="/users/Shiro_Keyyu">Shiro_Keyyu</a>, <a href="/users/Xahn">Xahn</a>, <a href="/users/Pleasejustgivememyaccount">Pleasejustgivememyaccount</a>, <a href="/users/SevenCorvus">SevenCorvus</a>, <a href="/users/ThatFriendlySpiritAO">ThatFriendlySpiritAO</a>, <a href="/users/NeedsCaffeineRightNow">NeedsCaffeineRightNow</a>, <a href="/users/Imthecattoyoursun">Imthecattoyoursun</a>, <a href="/users/Colonel_Sarge">Colonel_Sarge</a>, <a href="/users/I_Are_Bagel_Jesus">I_Are_Bagel_Jesus</a>, <a href="/users/sonicreeper">sonicreeper</a>, <a href="/users/Tickleheart">Tickleheart</a>, <a href="/users/Geci10">Geci10</a>, <a href="/users/Kos926">Kos926</a>, <a href="/users/wantsweme">wantsweme</a>, <a href="/users/tediuminahamsterball">tediuminahamsterball</a>, <a href="/users/LaMonjaLoca">LaMonjaLoca</a>, <a href="/users/El8643">El8643</a>, <a href="/users/Zeera134">Zeera134</a>, <a href="/users/Stardust_girl">Stardust_girl</a>, <a href="/users/ijustlivehere">ijustlivehere</a>, <a href="/users/WaltzQueen">WaltzQueen</a>, <a href="/users/Lovelycatwrites">Lovelycatwrites</a>, <a href="/users/SoftLilBun">SoftLilBun</a>, <a href="/users/MushroomCat">MushroomCat</a>, <a href="/users/Uuu26">Uuu26</a>, <a href="/users/fisheyechain">fisheyechain</a>, <a href="/users/LordVile">LordVile</a>, <a href="/users/superfanman217">superfanman217</a>, <a href="/users/Zardriana_Wolf">Zardriana_Wolf</a>, <a href="/users/toppis">toppis</a>, <a href="/users/Mischievous_at_heart">Mischievous_at_heart</a>, <a href="/users/Lilawere">Lilawere</a>, <a href="/users/lokis_stalker007">lokis_stalker007</a>, <a href="/users/RauenMuninn">RauenMuninn</a>, <a href="/users/Klau">Klau</a>, <a href="/users/Cubbyhb1">Cubbyhb1</a>, <a href="/users/Kantler">Kantler</a>, <a href="/users/i_am_snowils_admiral">i_am_snowils_admiral</a>, <a href="/users/higher">higher</a>, <a href="/users/iris_sanders_athena">iris_sanders_athena</a>, <a href="/users/I_am_mad_platypus_78">I_am_mad_platypus_78</a>, <a href="/users/midnight_flame">midnight_flame</a>, <a href="/users/pocket_dinosaur">pocket_dinosaur</a>, <a href="/users/Cuddle_WhiteWolf">Cuddle_WhiteWolf</a>, <a href="/users/FrostingFlames">FrostingFlames</a>, <a href="/users/Akeylei">Akeylei</a>, <a href="/users/ExcuseMeSir">ExcuseMeSir</a>, <a href="/users/cottoncandychaos">cottoncandychaos</a>, <a href="/users/tacoboutfabulous">tacoboutfabulous</a>, <a href="/users/Travelerkino">Travelerkino</a>, <a href="/users/prettyshinyspoon">prettyshinyspoon</a>, <a href="/users/Zmora">Zmora</a>, <a href="/users/StolenChild">StolenChild</a>, <a href="/users/grievemill">grievemill</a>, <a href="/users/Rioinred">Rioinred</a>, <a href="/users/Porkii">Porkii</a>, <a href="/users/SakamotoItoe">SakamotoItoe</a>, <a href="/users/Thoracto">Thoracto</a>, <a href="/users/Esqueleto">Esqueleto</a>, <a href="/users/crypticColumnist">crypticColumnist</a>, <a href="/users/Dinadinu">Dinadinu</a>, <a href="/users/BeQuiet">BeQuiet</a>, <a href="/users/Rook2konig">Rook2konig</a>, <a href="/users/skeyewalker">skeyewalker</a>, <a href="/users/MiraMyth">MiraMyth</a>, <a href="/users/NightshadeArt">NightshadeArt</a>, <a href="/users/thelibrarianjesser">thelibrarianjesser</a>, <a href="/users/Zarakem">Zarakem</a>, <a href="/users/Witchylesbian">Witchylesbian</a>, <a href="/users/rogueofspace">rogueofspace</a>, <a href="/users/Irrya">Irrya</a>, <a href="/users/Lugiagirl98">Lugiagirl98</a>, <a href="/users/FelineHappier">FelineHappier</a>, <a href="/users/Sucidalwulf">Sucidalwulf</a>, <a href="/users/Akutiema21">Akutiema21</a>, <a href="/users/chav_i3">chav_i3</a>, <a href="/users/please_dont_bite">please_dont_bite</a>, <a href="/users/Nicowritesthings">Nicowritesthings</a>, <a href="/users/Dym">Dym</a>, <a href="/users/silverviolin069">silverviolin069</a>, <a href="/users/mirellian">mirellian</a>, <a href="/users/angel60003">angel60003</a>, <a href="/users/PitterPatterDripDrop">PitterPatterDripDrop</a>, <a href="/users/Lola9525">Lola9525</a>, <a href="/users/magitechxinc">magitechxinc</a>, <a href="/users/Era27">Era27</a>, <a href="/users/Basic_Hell">Basic_Hell</a>, <a href="/users/MiaHale">MiaHale</a>, <a href="/users/SimpleUserName">SimpleUserName</a>, <a href="/users/Starculler">Starculler</a>, <a href="/users/31RottenBananas">31RottenBananas</a>, <a href="/users/EbonyMara">EbonyMara</a>, <a href="/users/Thelastvoidwalker">Thelastvoidwalker</a>, <a href="/users/FuzzyLyra">FuzzyLyra</a>, <a href="/users/pagination">pagination</a>, <a href="/users/EmpressAelin">EmpressAelin</a>, <a href="/users/marshmall0">marshmall0</a>, <a href="/users/Amanell">Amanell</a>, <a href="/users/simbay">simbay</a>, <a href="/users/Eysetadeysta">Eysetadeysta</a>, <a href="/users/Paws">Paws</a>, <a href="/users/Jpyill">Jpyill</a>, <a href="/users/BluMnM">BluMnM</a>, <a href="/users/aplaceforthebirds">aplaceforthebirds</a>, <a href="/users/baby_watermelon_seed">baby_watermelon_seed</a>, <a href="/users/Gabrielle_Nightingale">Gabrielle_Nightingale</a>, <a href="/users/Dabududu">Dabududu</a>, <a href="/users/Chaosboundforgreatness">Chaosboundforgreatness</a>, <a href="/users/Jennosaur">Jennosaur</a>, <a href="/users/passer_by">passer_by</a>, <a href="/users/Archaic_Apathy">Archaic_Apathy</a>, <a href="/users/FuzzyAnkleSocks">FuzzyAnkleSocks</a>, <a href="/users/Idealism_Sits_Imprisoned">Idealism_Sits_Imprisoned</a>, <a href="/users/Antiquesdoll">Antiquesdoll</a>, <a href="/users/whichwayizup">whichwayizup</a>, <a href="/users/The_Loner">The_Loner</a>, <a href="/users/OmegaBlack">OmegaBlack</a>, <a href="/users/TheRomanEmpire13">TheRomanEmpire13</a>, <a href="/users/Rhythyml">Rhythyml</a>, <a href="/users/rainbowemperor">rainbowemperor</a>, <a href="/users/Reign0931">Reign0931</a>, <a href="/users/harpy81">harpy81</a>, <a href="/users/Linora">Linora</a>, <a href="/users/Kaichub">Kaichub</a>, <a href="/users/DesertArcanine">DesertArcanine</a>, <a href="/users/Simonthediamond003">Simonthediamond003</a>, <a href="/users/Herperlo_D">Herperlo_D</a>, <a href="/users/jaysayheyyy">jaysayheyyy</a>, <a href="/users/Noceur17">Noceur17</a>, <a href="/users/Yuhimitsu">Yuhimitsu</a>, <a href="/users/The_End_of_World">The_End_of_World</a>, <a href="/users/goldened">goldened</a>, <a href="/users/CKA3CKA">CKA3CKA</a>, <a href="/users/NeoAsh">NeoAsh</a>, <a href="/users/cannot_pick_a_username">cannot_pick_a_username</a>, <a href="/users/Lazymoon">Lazymoon</a>, <a href="/users/FireRose1203">FireRose1203</a>, <a href="/users/JustASandwich">JustASandwich</a>, <a href="/users/DistractedDisturber">DistractedDisturber</a>, <a href="/users/Zeivira">Zeivira</a>, <a href="/users/Tagchen7">Tagchen7</a>, <a href="/users/Atrocityyyyyyyy">Atrocityyyyyyyy</a>, <a href="/users/rangerbookwyrm">rangerbookwyrm</a>, <a href="/users/doodle_7">doodle_7</a>, <a href="/users/Ploughface">Ploughface</a>, <a href="/users/summerwithaniinit">summerwithaniinit</a>, <a href="/users/KingOfWhispers">KingOfWhispers</a>, <a href="/users/Luke_fan">Luke_fan</a>, <a href="/users/Turlmin">Turlmin</a>, <a href="/users/Artemis2226">Artemis2226</a>, <a href="/users/Touga">Touga</a>, <a href="/users/Snowy_Rain">Snowy_Rain</a>, <a href="/users/AverageDemonBoy">AverageDemonBoy</a>, <a href="/users/AnimeLucifer_7">AnimeLucifer_7</a>, <a href="/users/Auroa_wings1994">Auroa_wings1994</a>, <a href="/users/Nineveh">Nineveh</a>, <a href="/users/laurensanyal">laurensanyal</a>, <a href="/users/surreyality">surreyality</a>, <a href="/users/eve2000">eve2000</a>, <a href="/users/PopWhizFizz">PopWhizFizz</a>, <a href="/users/Shoto94">Shoto94</a>, <a href="/users/LyraTalus">LyraTalus</a>, <a href="/users/mikca">mikca</a>, <a href="/users/My_Life_Is_A_Mess">My_Life_Is_A_Mess</a>, <a href="/users/Valakain_Zeya">Valakain_Zeya</a>, <a href="/users/admanct">admanct</a>, <a href="/users/SilverDollar">SilverDollar</a>, <a href="/users/seizansha">seizansha</a>, <a href="/users/pop_tab">pop_tab</a>, <a href="/users/RoseMarie301">RoseMarie301</a>, <a href="/users/Teobot">Teobot</a>, <a href="/users/Nes22">Nes22</a>, <a href="/users/Alyssa6034">Alyssa6034</a>, <a href="/users/ikindier">ikindier</a>, <a href="/users/FushiaFlame">FushiaFlame</a>, <a href="/users/rkovyryalova">rkovyryalova</a>, <a href="/users/Just_Another_Fan_Here">Just_Another_Fan_Here</a>, <a href="/users/galitayuh">galitayuh</a>, <a href="/users/Lightbulbs">Lightbulbs</a>, <a href="/users/Echoless">Echoless</a>, <a href="/users/GengarsGhost">GengarsGhost</a>, <a href="/users/lunaballz">lunaballz</a>, <a href="/users/Angie_Dawn">Angie_Dawn</a>, <a href="/users/Bae_Of_The_Books">Bae_Of_The_Books</a>, <a href="/users/ChaChaOnIce">ChaChaOnIce</a>, <a href="/users/jeesongre">jeesongre</a>, <a href="/users/Shiarephic">Shiarephic</a>, <a href="/users/Celestial_Blackhole">Celestial_Blackhole</a>, <a href="/users/Asura_Hozuki">Asura_Hozuki</a>, <a href="/users/LadyDop">LadyDop</a>, <a href="/users/Mellie2605">Mellie2605</a>, <a href="/users/the_writing_wolf">the_writing_wolf</a>, <a href="/users/SoftCactus1601">SoftCactus1601</a>, <a href="/users/MicMicBungee">MicMicBungee</a>, <a href="/users/marmar1584">marmar1584</a>, <a href="/users/Sud0Command">Sud0Command</a>, <a href="/users/Mizurra">Mizurra</a>, <a href="/users/Rensa">Rensa</a>, <a href="/users/Skeet_sleet">Skeet_sleet</a>, <a href="/users/Marquis_Black">Marquis_Black</a>, <a href="/users/ElevenEvilOranges">ElevenEvilOranges</a>, <a href="/users/Yeaaboooiiii">Yeaaboooiiii</a>, <a href="/users/shitstuck">shitstuck</a>, <a href="/users/jeiroh">jeiroh</a>, <a href="/users/Misaki_Okui">Misaki_Okui</a>, <a href="/users/proximally">proximally</a>, <a href="/users/bloodfree">bloodfree</a>, <a href="/users/Joyfulldreams">Joyfulldreams</a>, <a href="/users/WailingWhaler">WailingWhaler</a>, <a href="/users/p12a57f">p12a57f</a>, <a href="/users/Loveless712">Loveless712</a>, <a href="/users/Storycatcher">Storycatcher</a>, <a href="/users/1benzy">1benzy</a>, <a href="/users/becausereasons7">becausereasons7</a>, <a href="/users/heart_to_pen_to_paper">heart_to_pen_to_paper</a>, <a href="/users/HobbiyMagic">HobbiyMagic</a>, <a href="/users/serene_saber">serene_saber</a>, <a href="/users/karalynevans">karalynevans</a>, <a href="/users/Wilcok">Wilcok</a>, <a href="/users/IXIAnubiaIXI">IXIAnubiaIXI</a>, <a href="/users/LokiLol">LokiLol</a>, <a href="/users/Vaasu">Vaasu</a>, <a href="/users/unicolala">unicolala</a>, <a href="/users/TitanWafflesaur">TitanWafflesaur</a>, <a href="/users/Hat_Lord_Ave">Hat_Lord_Ave</a>, <a href="/users/KingofTrees">KingofTrees</a>, <a href="/users/skmezzy">skmezzy</a>, <a href="/users/Jayme">Jayme</a>, <a href="/users/CheddarTheHedgehog">CheddarTheHedgehog</a>, <a href="/users/Kocineczka">Kocineczka</a>, <a href="/users/Nonexistentsouls">Nonexistentsouls</a>, <a href="/users/Nair_Dee">Nair_Dee</a>, <a href="/users/darkythepyrolover">darkythepyrolover</a>, <a href="/users/Lala32903">Lala32903</a>, <a href="/users/Weldenvarden">Weldenvarden</a>, <a href="/users/Bloodra">Bloodra</a>, <a href="/users/DragonDCelina">DragonDCelina</a>, <a href="/users/bubble_milktea">bubble_milktea</a>, <a href="/users/Books_Anime_Manga_Fandom">Books_Anime_Manga_Fandom</a>, <a href="/users/MayhapsSapphic">MayhapsSapphic</a>, <a href="/users/sworceress">sworceress</a>, <a href="/users/Devinely">Devinely</a>, <a href="/users/acardier">acardier</a>, <a href="/users/Miss_Writers_Block">Miss_Writers_Block</a>, <a href="/users/KittytheGamer293">KittytheGamer293</a>, <a href="/users/Jijabi">Jijabi</a>, <a href="/users/EldritchBloodGod">EldritchBloodGod</a>, <a href="/users/Maniak">Maniak</a>, <a href="/users/Tiswabley">Tiswabley</a>, <a href="/users/PLenni">PLenni</a>, <a href="/users/Fonderodin">Fonderodin</a>, <a href="/users/Tired_Potato_Here">Tired_Potato_Here</a>, <a href="/users/Kabob003">Kabob003</a>, <a href="/users/Nuclear_Equipped_Walking_Battle_Tank">Nuclear_Equipped_Walking_Battle_Tank</a>, <a href="/users/Phantomwolf5">Phantomwolf5</a>, <a href="/users/diequeeria">diequeeria</a>, <a href="/users/Maniaclove620">Maniaclove620</a>, <a href="/users/Dune_the_flower">Dune_the_flower</a>, <a href="/users/Molte27">Molte27</a>, <a href="/users/Na_Nashi">Na_Nashi</a>, <a href="/users/MidnightRaven67">MidnightRaven67</a>, <a href="/users/DoctorDonna24">DoctorDonna24</a>, <a href="/users/MaskedSlushie">MaskedSlushie</a>, <a href="/users/blueberry137">blueberry137</a>, <a href="/users/ValakikM">ValakikM</a>, <a href="/users/AnnaDaFujoshi">AnnaDaFujoshi</a>, <a href="/users/Top7879">Top7879</a>, <a href="/users/Ili_Dany">Ili_Dany</a>, <a href="/users/Cah">Cah</a>, <a href="/users/mirandasS">mirandasS</a>, <a href="/users/Arevere">Arevere</a>, <a href="/users/Kiwi26421">Kiwi26421</a>, <a href="/users/nahv">nahv</a>, <a href="/users/fernicious">fernicious</a>, <a href="/users/The_Capslock_Queen">The_Capslock_Queen</a>, <a href="/users/YoungWitch">YoungWitch</a>, <a href="/users/TheRookMaster">TheRookMaster</a>, <a href="/users/SherryRed">SherryRed</a>, <a href="/users/aanwayne">aanwayne</a>, <a href="/users/legionof1">legionof1</a>, <a href="/users/zthelightxavier">zthelightxavier</a>, <a href="/users/ERROR404CANNOTFUNCTION">ERROR404CANNOTFUNCTION</a>, <a href="/users/SlushyRain">SlushyRain</a>, <a href="/users/Phayn">Phayn</a>, <a href="/users/GoodAtFailing">GoodAtFailing</a>, <a href="/users/belarus">belarus</a>, <a href="/users/Fey_79">Fey_79</a>, <a href="/users/YokaiLuna">YokaiLuna</a>, <a href="/users/Xushi">Xushi</a>, <a href="/users/Opalsong">Opalsong</a>, <a href="/users/elektraeriseros">elektraeriseros</a>, <a href="/users/wyrdfish">wyrdfish</a>, <a href="/users/Kaitsune">Kaitsune</a>, <a href="/users/Yoonhoonie">Yoonhoonie</a>, <a href="/users/bIRB_soziopath">bIRB_soziopath</a>, <a href="/users/DysgraphicBean">DysgraphicBean</a>, <a href="/users/AnakinBiwalker">AnakinBiwalker</a>, <a href="/users/meri47">meri47</a>, <a href="/users/AoTTrash">AoTTrash</a>, <a href="/users/aldnoah22">aldnoah22</a>, <a href="/users/jellyfishdreams">jellyfishdreams</a>, <a href="/users/Holly_Batali">Holly_Batali</a>, <a href="/users/WizardForever99">WizardForever99</a>, <a href="/users/Verano">Verano</a>, <a href="/users/Connection">Connection</a>, <a href="/users/the_nerdy_fangirl">the_nerdy_fangirl</a>, <a href="/users/Pielover31415269">Pielover31415269</a>, <a href="/users/ShadowyCollection">ShadowyCollection</a>, <a href="/users/HeartlessReader">HeartlessReader</a>, <a href="/users/Ritsku">Ritsku</a>, <a href="/users/cRoNcRoN_masalimuotkongbuhay">cRoNcRoN_masalimuotkongbuhay</a>, <a href="/users/nahnashimura">nahnashimura</a>, <a href="/users/nightdotlight">nightdotlight</a>, <a href="/users/Yarnball1412">Yarnball1412</a>, <a href="/users/Claire_Dimlight">Claire_Dimlight</a>, <a href="/users/Grinding_To_Lvl_1000">Grinding_To_Lvl_1000</a>, <a href="/users/RinRin">RinRin</a>, <a href="/users/TheShonaXD">TheShonaXD</a>, <a href="/users/emairose">emairose</a>, <a href="/users/Crawler">Crawler</a>, <a href="/users/otaku_babyrae">otaku_babyrae</a>, <a href="/users/Chardinal">Chardinal</a>, <a href="/users/SpaceLittle666">SpaceLittle666</a>, <a href="/users/Alyss_C">Alyss_C</a>, <a href="/users/ChloeTheBold">ChloeTheBold</a>, <a href="/users/MoonPaw17">MoonPaw17</a>, <a href="/users/Gagarka">Gagarka</a>, <a href="/users/Paquerette_San">Paquerette_San</a>, <a href="/users/AwesomeBees">AwesomeBees</a>, <a href="/users/Themasterunicorn">Themasterunicorn</a>, <a href="/users/Brenden1k">Brenden1k</a>, <a href="/users/TheManwithoutaPlan">TheManwithoutaPlan</a>, <a href="/users/a_dot_dev">a_dot_dev</a>, <a href="/users/Space_Penguins">Space_Penguins</a>, <a href="/users/theultimatememe">theultimatememe</a>, <a href="/users/It_Got_Worse">It_Got_Worse</a>, <a href="/users/kkiwi">kkiwi</a>, <a href="/users/AwkwardAnna">AwkwardAnna</a>, <a href="/users/Internal_Screaming">Internal_Screaming</a>, <a href="/users/DarkWoods">DarkWoods</a>, <a href="/users/Niemand385">Niemand385</a>, <a href="/users/VioletTheGrimm">VioletTheGrimm</a>, <a href="/users/kurikun">kurikun</a>, <a href="/users/Rush_That_Speaks">Rush_That_Speaks</a>, <a href="/users/Chestnutcrown">Chestnutcrown</a>, <a href="/users/deadinsidebutliving">deadinsidebutliving</a>, <a href="/users/DarkHorse201">DarkHorse201</a>, <a href="/users/Murkysky">Murkysky</a>, <a href="/users/Zephyr_Cloe_Ambroise">Zephyr_Cloe_Ambroise</a>, <a href="/users/Rykan">Rykan</a>, <a href="/users/QuestioningSanity">QuestioningSanity</a>, <a href="/users/MiniMonster">MiniMonster</a>, <a href="/users/CitrusAndNostalgia">CitrusAndNostalgia</a>, <a href="/users/OptimisticRealist">OptimisticRealist</a>, <a href="/users/holy_roller_novocaine">holy_roller_novocaine</a>, <a href="/users/smolfocklis">smolfocklis</a>, <a href="/users/Suolainensilakka">Suolainensilakka</a>, <a href="/users/Riushin">Riushin</a>, <a href="/users/xHyding">xHyding</a>, <a href="/users/LanceyLove">LanceyLove</a>, <a href="/users/Levibearr">Levibearr</a>, <a href="/users/Exultation_of_the_Gryphon">Exultation_of_the_Gryphon</a>, <a href="/users/odrazy">odrazy</a>, <a href="/users/Diana_Wisperwind">Diana_Wisperwind</a>, <a href="/users/PuppetMaster55">PuppetMaster55</a>, <a href="/users/EmilyElizabethlil">EmilyElizabethlil</a>, <a href="/users/VerborgenImSchatten">VerborgenImSchatten</a>, <a href="/users/Avakeda">Avakeda</a>, <a href="/users/AlwaysInDreamLand">AlwaysInDreamLand</a>, <a href="/users/Emblemofthedigi">Emblemofthedigi</a>, <a href="/users/t_16">t_16</a>, <a href="/users/Tegamin">Tegamin</a>, <a href="/users/LexusOnIce">LexusOnIce</a>, <a href="/users/thehunterandtheangel">thehunterandtheangel</a>, <a href="/users/BeingAJackson">BeingAJackson</a>, <a href="/users/Frieria">Frieria</a>, <a href="/users/taelovent">taelovent</a>, <a href="/users/Kanekididnotdeserve">Kanekididnotdeserve</a>, <a href="/users/I_Ship_Everything_I_Can_See">I_Ship_Everything_I_Can_See</a>, <a href="/users/Mistborn7">Mistborn7</a>, <a href="/users/imgettingtiredofyou">imgettingtiredofyou</a>, <a href="/users/Dozy150">Dozy150</a>, <a href="/users/llamathing">llamathing</a>, <a href="/users/AlexKnight002">AlexKnight002</a>, <a href="/users/devilishqueen">devilishqueen</a>, <a href="/users/BorealLights">BorealLights</a>, <a href="/users/apathetica">apathetica</a>, <a href="/users/AChaoticMessNickCisheHere">AChaoticMessNickCisheHere</a>, <a href="/users/dtbaemy">dtbaemy</a>, <a href="/users/Vae_Pulchure">Vae_Pulchure</a>, <a href="/users/Mewsora">Mewsora</a>, <a href="/users/AnimagusChange">AnimagusChange</a>, <a href="/users/Actor_of_Pandora">Actor_of_Pandora</a>, <a href="/users/Karina_RR04">Karina_RR04</a>, <a href="/users/AbnormalMind777">AbnormalMind777</a>, <a href="/users/KaeTheAlien">KaeTheAlien</a>, <a href="/users/CinnaMonroe">CinnaMonroe</a>, <a href="/users/Relyt23">Relyt23</a>, <a href="/users/yasminlly">yasminlly</a>, <a href="/users/Thisisauername">Thisisauername</a>, <a href="/users/fElBiTeR">fElBiTeR</a>, <a href="/users/LadyNyx">LadyNyx</a>, <a href="/users/veritere">veritere</a>, <a href="/users/Chocoboharrison">Chocoboharrison</a>, <a href="/users/DIKXIPIX">DIKXIPIX</a>, <a href="/users/banifi">banifi</a>, <a href="/users/aHostileRainbow">aHostileRainbow</a>, <a href="/users/peachesandpatches">peachesandpatches</a>, <a href="/users/sneill_magic">sneill_magic</a>, <a href="/users/VovinBlack">VovinBlack</a>, <a href="/users/aaronhowser1">aaronhowser1</a>, <a href="/users/Itsumi">Itsumi</a>, <a href="/users/Kalira_Jones">Kalira_Jones</a>, <a href="/users/pnkssbtch">pnkssbtch</a>, <a href="/users/Artemis_Apollo1214">Artemis_Apollo1214</a>, <a href="/users/kilogramps">kilogramps</a>, <a href="/users/CallMeLex">CallMeLex</a>, <a href="/users/Crumbled">Crumbled</a>, <a href="/users/Coolc341">Coolc341</a>, <a href="/users/gandocaloca">gandocaloca</a>, <a href="/users/Warewolf12019">Warewolf12019</a>, <a href="/users/CrimsonFist99">CrimsonFist99</a>, <a href="/users/xavira">xavira</a>, <a href="/users/Buckleupbuttercup">Buckleupbuttercup</a>, <a href="/users/Allornothingpreferablynothing">Allornothingpreferablynothing</a>, <a href="/users/Otaku6337">Otaku6337</a>, <a href="/users/Ynius">Ynius</a>, <a href="/users/PeaTea">PeaTea</a>, <a href="/users/One_Called_Mike">One_Called_Mike</a>, <a href="/users/MintChocolateLeaves">MintChocolateLeaves</a>, <a href="/users/Lynette_6577">Lynette_6577</a>, <a href="/users/ThinkSmarterNotHarder">ThinkSmarterNotHarder</a>, <a href="/users/SSJ_Matt">SSJ_Matt</a>, <a href="/users/SurrealSupernaturalist">SurrealSupernaturalist</a>, <a href="/users/creamni">creamni</a>, <a href="/users/scribblepaws">scribblepaws</a>, <a href="/users/RainofNight">RainofNight</a>, <a href="/users/Qamar114">Qamar114</a>, <a href="/users/rikugou">rikugou</a>, <a href="/users/Se_raph">Se_raph</a>, <a href="/users/skrtskrt">skrtskrt</a>, <a href="/users/Pennyforyourthoughts">Pennyforyourthoughts</a>, <a href="/users/Voragine">Voragine</a>, <a href="/users/SideswipesSunshine42">SideswipesSunshine42</a>, <a href="/users/Purrs">Purrs</a>, <a href="/users/demonio">demonio</a>, <a href="/users/AngelCakeszee">AngelCakeszee</a>, <a href="/users/mai96">mai96</a>, <a href="/users/Rina_P_Wisteria">Rina_P_Wisteria</a>, <a href="/users/TacoSupreme23">TacoSupreme23</a>, <a href="/users/Aria_Verde">Aria_Verde</a>, <a href="/users/Alkanasynranem">Alkanasynranem</a>, <a href="/users/Tenshi7Nalata">Tenshi7Nalata</a>, <a href="/users/constellationdipper">constellationdipper</a>, <a href="/users/Nomo2001">Nomo2001</a>, <a href="/users/Manacats">Manacats</a>, <a href="/users/Xx14PinstripesxX">Xx14PinstripesxX</a>, <a href="/users/vrhov1234">vrhov1234</a>, <a href="/users/ChrysaTh99">ChrysaTh99</a>, <a href="/users/Roscuro69">Roscuro69</a>, <a href="/users/EmpressAnn">EmpressAnn</a>, <a href="/users/DoneWithLifeTM">DoneWithLifeTM</a>, <a href="/users/Digigal_transbian">Digigal_transbian</a>, <a href="/users/Castiels_wings">Castiels_wings</a>, <a href="/users/Celesteee">Celesteee</a>, <a href="/users/Mecha_Magici">Mecha_Magici</a>, <a href="/users/Sleepyloccocus_Nemui">Sleepyloccocus_Nemui</a>, <a href="/users/Floren">Floren</a>, <a href="/users/Kopoppin">Kopoppin</a>, <a href="/users/BLUKWolf">BLUKWolf</a>, <a href="/users/LinkRue">LinkRue</a>, <a href="/users/EmeraldSage">EmeraldSage</a>, <a href="/users/LesserFootrest">LesserFootrest</a>, <a href="/users/Gracelyn">Gracelyn</a>, <a href="/users/mrplatypus280">mrplatypus280</a>, <a href="/users/OWritingTrashO">OWritingTrashO</a>, <a href="/users/TwilightMind">TwilightMind</a>, <a href="/users/howls">howls</a>, <a href="/users/DamonSkyHartXV">DamonSkyHartXV</a>, <a href="/users/InTheNameofJustice">InTheNameofJustice</a>, <a href="/users/Tanukia">Tanukia</a>, <a href="/users/ElectricDragon64">ElectricDragon64</a>, <a href="/users/Azaneti">Azaneti</a>, <a href="/users/Gradoel">Gradoel</a>, <a href="/users/Snippity_Snappity">Snippity_Snappity</a>, <a href="/users/SpartanComforts">SpartanComforts</a>, <a href="/users/ShadowFoxDemon27">ShadowFoxDemon27</a>, <a href="/users/fangirl_of_glitter">fangirl_of_glitter</a>, <a href="/users/yenaduu">yenaduu</a>, <a href="/users/NyctoPhile01">NyctoPhile01</a>, <a href="/users/Me_and_my_fandoms">Me_and_my_fandoms</a>, <a href="/users/one_step_closer_to_death">one_step_closer_to_death</a>, <a href="/users/ADailyDoseOfAwesome">ADailyDoseOfAwesome</a>, <a href="/users/uuugghhhh">uuugghhhh</a>, <a href="/users/OhGodOhNoOhFuckImGayFuckOhNo">OhGodOhNoOhFuckImGayFuckOhNo</a>, <a href="/users/Kikuriki">Kikuriki</a>, <a href="/users/brokenbitch">brokenbitch</a>, <a href="/users/KYvi3">KYvi3</a>, <a href="/users/chenledawn">chenledawn</a>, <a href="/users/i_write_or_some_Shie">i_write_or_some_Shie</a>, <a href="/users/lavvyskies">lavvyskies</a>, <a href="/users/TenderSugar">TenderSugar</a>, <a href="/users/Kris_Shiro">Kris_Shiro</a>, <a href="/users/Stereolex">Stereolex</a>, <a href="/users/Student_Of_Accounting">Student_Of_Accounting</a>, <a href="/users/CrimsonComputer">CrimsonComputer</a>, <a href="/users/lunas_guard">lunas_guard</a>, <a href="/users/willowbeecat">willowbeecat</a>, <a href="/users/Yumantimatter">Yumantimatter</a>, <a href="/users/Koroby">Koroby</a>, <a href="/users/lamplady">lamplady</a>, <a href="/users/Seraphinit">Seraphinit</a>, <a href="/users/BillCipher322">BillCipher322</a>, <a href="/users/MangaManiac">MangaManiac</a>, <a href="/users/Sarcasm_Scarlet_n_Spite">Sarcasm_Scarlet_n_Spite</a>, <a href="/users/Power9987">Power9987</a>, <a href="/users/LeonLeonRevolution">LeonLeonRevolution</a>, <a href="/users/MaydayMarbear">MaydayMarbear</a>, <a href="/users/Lubieczytac">Lubieczytac</a>, <a href="/users/VioletaAsh">VioletaAsh</a>, <a href="/users/Artemis_Fandom_Things">Artemis_Fandom_Things</a>, <a href="/users/BitchImTired">BitchImTired</a>, <a href="/users/MyHeroAca_What">MyHeroAca_What</a>, <a href="/users/pentalion">pentalion</a>, <a href="/users/SeagullP">SeagullP</a>, <a href="/users/Anaghala">Anaghala</a>, <a href="/users/AryaZEvans">AryaZEvans</a>, <a href="/users/Fair_Strife">Fair_Strife</a>, <a href="/users/QTesseract">QTesseract</a>, <a href="/users/Minxiboo">Minxiboo</a>, <a href="/users/Goshikku">Goshikku</a>, <a href="/users/PanicGun">PanicGun</a>, <a href="/users/Bannana">Bannana</a>, <a href="/users/Mangakoibito">Mangakoibito</a>, <a href="/users/MrPJ98">MrPJ98</a>, <a href="/users/soffgluten">soffgluten</a>, <a href="/users/DDAM_818">DDAM_818</a>, <a href="/users/Rikkusho">Rikkusho</a>, <a href="/users/jcatgrl">jcatgrl</a>, <a href="/users/Alchemist_Cardona">Alchemist_Cardona</a>, <a href="/users/docmatoi">docmatoi</a>, <a href="/users/Nonbinari_Goat">Nonbinari_Goat</a>, <a href="/users/Bakuhatsuo">Bakuhatsuo</a>, <a href="/users/Drifting_17">Drifting_17</a>, <a href="/users/Egg_Yolkson">Egg_Yolkson</a>, <a href="/users/EtherealKnight21">EtherealKnight21</a>, <a href="/users/Art_de_musa">Art_de_musa</a>, <a href="/users/Hanayou343">Hanayou343</a>, <a href="/users/cosmicsdeku">cosmicsdeku</a>, <a href="/users/Eldritch_Prince">Eldritch_Prince</a>, <a href="/users/VolceVoice">VolceVoice</a>, <a href="/users/AnakinTheTrashKing">AnakinTheTrashKing</a>, <a href="/users/Elvwin">Elvwin</a>, <a href="/users/aramina">aramina</a>, <a href="/users/IceXChaos12">IceXChaos12</a>, <a href="/users/Needlegal67">Needlegal67</a>, <a href="/users/audy0529">audy0529</a>, <a href="/users/Cixi">Cixi</a>, <a href="/users/km207">km207</a>, <a href="/users/onierokinetic">onierokinetic</a>, <a href="/users/ForgottenLostAncient">ForgottenLostAncient</a>, <a href="/users/biscuitlevitation">biscuitlevitation</a>, <a href="/users/nerodiscord">nerodiscord</a>, <a href="/users/GlassySky">GlassySky</a>, <a href="/users/Pepepepepepepepepepe">Pepepepepepepepepepe</a>, <a href="/users/Jetfeather">Jetfeather</a>, <a href="/users/Shadows_Nuji">Shadows_Nuji</a>, <a href="/users/nimway">nimway</a>, <a href="/users/ChelseaTheReader">ChelseaTheReader</a>, <a href="/users/Voltrasin">Voltrasin</a>, <a href="/users/Aerun">Aerun</a>, <a href="/users/heretic">heretic</a>, <a href="/users/Autonomous_Automata">Autonomous_Automata</a>, <a href="/users/CloudyReality">CloudyReality</a>, <a href="/users/theredqueen">theredqueen</a>, <a href="/users/Amy_Croft">Amy_Croft</a>, <a href="/users/kenski">kenski</a>, <a href="/users/Ignis_Veridian">Ignis_Veridian</a>, <a href="/users/bichen">bichen</a>, <a href="/users/KageKitsune13">KageKitsune13</a>, <a href="/users/thaed">thaed</a>, <a href="/users/XXShadowXX">XXShadowXX</a>, <a href="/users/HeIsSoBlue">HeIsSoBlue</a>, <a href="/users/Rosedraquia">Rosedraquia</a>, <a href="/users/gKiArTu">gKiArTu</a>, <a href="/users/DaydreamingAce26">DaydreamingAce26</a>, <a href="/users/Nuar_Lexx">Nuar_Lexx</a>, <a href="/users/Desolate_Smog">Desolate_Smog</a>, <a href="/users/plush_anon">plush_anon</a>, <a href="/users/ClayFowl">ClayFowl</a>, <a href="/users/Jxereas">Jxereas</a>, <a href="/users/FINALLYOldEnoughToReadSmut">FINALLYOldEnoughToReadSmut</a>, <a href="/users/cherristained">cherristained</a>, <a href="/users/Catbell">Catbell</a>, <a href="/users/cookiethepirate">cookiethepirate</a>, <a href="/users/Thescottishpanda">Thescottishpanda</a>, <a href="/users/abstractfelin">abstractfelin</a>, <a href="/users/DesertPrincess">DesertPrincess</a>, <a href="/users/nyura_vanko">nyura_vanko</a>, <a href="/users/Nereus27">Nereus27</a>, <a href="/users/DigDoom">DigDoom</a>, <a href="/users/KiraDaughterofPoseidon">KiraDaughterofPoseidon</a>, <a href="/users/Sakurashark">Sakurashark</a>, <a href="/users/EvelynRose33284">EvelynRose33284</a>, <a href="/users/tuna_the_tuba">tuna_the_tuba</a>, <a href="/users/DarkBombayAngel">DarkBombayAngel</a>, <a href="/users/FeeFee11">FeeFee11</a>, <a href="/users/Yuurei">Yuurei</a>, <a href="/users/Aki_chan">Aki_chan</a>, <a href="/users/Anthos_NeVitore">Anthos_NeVitore</a>, <a href="/users/AeuyFael">AeuyFael</a>, <a href="/users/Vaultjumper">Vaultjumper</a>, <a href="/users/kitten_claws76">kitten_claws76</a>, <a href="/users/Fididdler">Fididdler</a>, <a href="/users/Debirulady">Debirulady</a>, <a href="/users/Naiadoodle">Naiadoodle</a>, <a href="/users/FangirlKatydid">FangirlKatydid</a>, <a href="/users/michigangeek14">michigangeek14</a>, <a href="/users/scripturiented">scripturiented</a>, <a href="/users/Jluke94">Jluke94</a>, <a href="/users/PrimalDragon">PrimalDragon</a>, <a href="/users/KyuubiDono">KyuubiDono</a>, <a href="/users/keircatenation">keircatenation</a>, <a href="/users/CJ_Riker">CJ_Riker</a>, <a href="/users/FatesHoldOnMe">FatesHoldOnMe</a>, <a href="/users/nightbeauty">nightbeauty</a>, <a href="/users/A_very_interesting_person">A_very_interesting_person</a>, <a href="/users/StrykingShadows">StrykingShadows</a>, <a href="/users/loki0191">loki0191</a>, <a href="/users/A_Herd_Of_Alpacas">A_Herd_Of_Alpacas</a>, <a href="/users/DatAnimeGirl">DatAnimeGirl</a>, <a href="/users/pelicandaughter">pelicandaughter</a>, <a href="/users/Jogo">Jogo</a>, <a href="/users/hibeef01">hibeef01</a>, <a href="/users/ShadowsIntoLight">ShadowsIntoLight</a>, <a href="/users/LadyDuoMaxwell">LadyDuoMaxwell</a>, <a href="/users/SkyWolf25">SkyWolf25</a>, <a href="/users/AccursedSith">AccursedSith</a>, <a href="/users/tempUser">tempUser</a>, <a href="/users/Oliffee">Oliffee</a>, <a href="/users/Kat151820">Kat151820</a>, <a href="/users/plamen">plamen</a>, <a href="/users/anonymouspotato22">anonymouspotato22</a>, <a href="/users/The_Local_Weeb">The_Local_Weeb</a>, <a href="/users/codebamboo">codebamboo</a>, <a href="/users/Seiberwing">Seiberwing</a>, <a href="/users/Alias_of_Apocalypse">Alias_of_Apocalypse</a>, <a href="/users/Premeditated_shitbag">Premeditated_shitbag</a>, <a href="/users/TheKursed">TheKursed</a>, <a href="/users/thefreeman">thefreeman</a>, <a href="/users/Runnika">Runnika</a>, <a href="/users/WizardsGirl">WizardsGirl</a>, <a href="/users/Mellownumel">Mellownumel</a>, <a href="/users/Zelda_Moony">Zelda_Moony</a>, <a href="/users/ses_12345678">ses_12345678</a>, <a href="/users/acebian">acebian</a>, <a href="/users/Dangerzone227">Dangerzone227</a>, <a href="/users/Respect_Potatoes">Respect_Potatoes</a>, <a href="/users/CorndogsDie">CorndogsDie</a>, <a href="/users/weredragon">weredragon</a>, <a href="/users/sonibreeze">sonibreeze</a>, <a href="/users/linesofreturninggeese">linesofreturninggeese</a>, <a href="/users/Pickles57">Pickles57</a>, <a href="/users/timidemi">timidemi</a>, <a href="/users/Fattailcat">Fattailcat</a>, <a href="/users/Otakuforlife19">Otakuforlife19</a>, <a href="/users/OurLadyTiptree">OurLadyTiptree</a>, <a href="/users/RiverWren">RiverWren</a>, <a href="/users/Winters_stars21">Winters_stars21</a>, <a href="/users/Nie">Nie</a>, <a href="/users/frariedogs91">frariedogs91</a>, <a href="/users/Spirit13">Spirit13</a>, <a href="/users/Purplepasta1987">Purplepasta1987</a>, <a href="/users/melborp">melborp</a>, <a href="/users/Serina_Leigh">Serina_Leigh</a>, <a href="/users/midnight_birds">midnight_birds</a>, <a href="/users/YunJun">YunJun</a>, <a href="/users/BlackCat666">BlackCat666</a>, <a href="/users/rosycheekedfish">rosycheekedfish</a>, <a href="/users/KillerByte">KillerByte</a>, <a href="/users/Gallimaufry256">Gallimaufry256</a>, <a href="/users/NappingIsAWayOfLife">NappingIsAWayOfLife</a>, <a href="/users/tamenetsi">tamenetsi</a>, <a href="/users/AconiteHemlock">AconiteHemlock</a>, <a href="/users/Crisstal">Crisstal</a>, <a href="/users/Dollmaker_Margatroid">Dollmaker_Margatroid</a>, <a href="/users/A_Reflective_Projection">A_Reflective_Projection</a>, <a href="/users/Mirlocke">Mirlocke</a>, <a href="/users/rosalini">rosalini</a>, <a href="/users/sailoryuda">sailoryuda</a>, <a href="/users/Zoanzon">Zoanzon</a>, <a href="/users/fluff_is_life">fluff_is_life</a>, <a href="/users/PorcelanaRota">PorcelanaRota</a>, <a href="/users/Tipot">Tipot</a>, <a href="/users/JamieGaylePiff">JamieGaylePiff</a>, <a href="/users/SnarkyAi">SnarkyAi</a>, <a href="/users/Shoujirou">Shoujirou</a>, <a href="/users/Looking_at_the_sky">Looking_at_the_sky</a>, <a href="/users/Localfujoshi">Localfujoshi</a>, <a href="/users/Doggyband">Doggyband</a>, <a href="/users/bnha_traaaash">bnha_traaaash</a>, <a href="/users/CuppiecakeZombie">CuppiecakeZombie</a>, <a href="/users/saintsaint">saintsaint</a>, <a href="/users/corrose">corrose</a>, <a href="/users/Cuore_senza_vita">Cuore_senza_vita</a>, <a href="/users/Sailingseas">Sailingseas</a>, <a href="/users/Yorozoya_shiroyasha">Yorozoya_shiroyasha</a>, <a href="/users/RanAkki">RanAkki</a>, <a href="/users/TheCurat0r">TheCurat0r</a>, <a href="/users/rowanseas">rowanseas</a>, <a href="/users/KidWestHope16">KidWestHope16</a>, <a href="/users/JajaLala">JajaLala</a>, <a href="/users/Azulira">Azulira</a>, <a href="/users/AbsoluteZero">AbsoluteZero</a>, <a href="/users/Miss_Nameless">Miss_Nameless</a>, <a href="/users/Unknownhero00">Unknownhero00</a>, <a href="/users/DancinOddball">DancinOddball</a>, <a href="/users/DrWhoFan">DrWhoFan</a>, <a href="/users/fictionismyaddiction98">fictionismyaddiction98</a>, <a href="/users/resd">resd</a>, <a href="/users/Asimar">Asimar</a>, <a href="/users/lildino">lildino</a>, <a href="/users/SquidCircle">SquidCircle</a>, <a href="/users/DandelionPuff">DandelionPuff</a>, <a href="/users/razzle_dazzle_lancey">razzle_dazzle_lancey</a>, <a href="/users/Lmic244">Lmic244</a>, <a href="/users/KittenInTheDust">KittenInTheDust</a>, <a href="/users/Guardian_de_historias">Guardian_de_historias</a>, <a href="/users/Emberontheashes517">Emberontheashes517</a>, <a href="/users/NovaAnang">NovaAnang</a>, <a href="/users/Thecaramelsecrets">Thecaramelsecrets</a>, <a href="/users/smoakberry">smoakberry</a>, <a href="/users/StarsEverywhereBitch">StarsEverywhereBitch</a>, <a href="/users/Lizzyfaber">Lizzyfaber</a>, <a href="/users/Why_is_a_user_name_necessary">Why_is_a_user_name_necessary</a>, <a href="/users/bearswithlazereyes">bearswithlazereyes</a>, <a href="/users/SurohSopsisofClouds">SurohSopsisofClouds</a>, <a href="/users/rainbow_haired_idiot">rainbow_haired_idiot</a>, <a href="/users/Kea2121312">Kea2121312</a>, <a href="/users/InTheMix">InTheMix</a>, <a href="/users/Aglio_Saggezza">Aglio_Saggezza</a>, <a href="/users/Swirlingflight">Swirlingflight</a>, <a href="/users/Saik0u">Saik0u</a>, <a href="/users/JusKIdding">JusKIdding</a>, <a href="/users/X_Well_Dang_X">X_Well_Dang_X</a>, <a href="/users/a_tortoise_with_3_cups">a_tortoise_with_3_cups</a>, <a href="/users/ame_colours">ame_colours</a>, <a href="/users/lavenderdreams">lavenderdreams</a>, <a href="/users/Pineapple_Hurt">Pineapple_Hurt</a>, <a href="/users/Crimmy">Crimmy</a>, <a href="/users/VixenTheWolf">VixenTheWolf</a>, <a href="/users/Artemis_Fortune">Artemis_Fortune</a>, <a href="/users/passiveAfficionado">passiveAfficionado</a>, <a href="/users/Yarn_Weaver">Yarn_Weaver</a>, <a href="/users/ehu123">ehu123</a>, <a href="/users/BarryAllenIsTheFlash">BarryAllenIsTheFlash</a>, <a href="/users/Sensoray">Sensoray</a>, <a href="/users/sarcasticwhaleshark">sarcasticwhaleshark</a>, <a href="/users/Birdeer">Birdeer</a>, <a href="/users/FreeElf">FreeElf</a>, <a href="/users/TheFearlessArmy">TheFearlessArmy</a>, <a href="/users/kaanna">kaanna</a>, <a href="/users/PuddingMeow">PuddingMeow</a>, <a href="/users/Psychedelic0Kitty">Psychedelic0Kitty</a>, <a href="/users/TramontAnna">TramontAnna</a>, <a href="/users/BluebottleTea">BluebottleTea</a>, <a href="/users/BU8BLES404">BU8BLES404</a>, <a href="/users/Starlightfantasy">Starlightfantasy</a>, <a href="/users/mistress_of_sarcasm">mistress_of_sarcasm</a>, <a href="/users/TopographicalMapOfUtah">TopographicalMapOfUtah</a>, <a href="/users/sparkypikachu">sparkypikachu</a>, <a href="/users/JackiSax">JackiSax</a>, <a href="/users/AvaSwan">AvaSwan</a>, <a href="/users/anniewallden">anniewallden</a>, <a href="/users/simplesongsmistress">simplesongsmistress</a>, <a href="/users/YesItWasAReference">YesItWasAReference</a>, <a href="/users/DGshoe">DGshoe</a>, <a href="/users/zanbandia">zanbandia</a>, <a href="/users/tinystargazer">tinystargazer</a>, <a href="/users/Markhyuck9900">Markhyuck9900</a>, <a href="/users/tadashicat">tadashicat</a>, <a href="/users/OctoberDays">OctoberDays</a>, <a href="/users/TheSirenix">TheSirenix</a>, <a href="/users/FictiveFeline">FictiveFeline</a>, <a href="/users/Shelbell19">Shelbell19</a>, <a href="/users/freyxama">freyxama</a>, <a href="/users/Broken_Arrow">Broken_Arrow</a>, <a href="/users/theSarcasticWench">theSarcasticWench</a>, <a href="/users/HelplessLemon">HelplessLemon</a>, <a href="/users/Beeslippers">Beeslippers</a>, <a href="/users/the_bookwyrm">the_bookwyrm</a>, <a href="/users/WalkingTheRoad">WalkingTheRoad</a>, <a href="/users/Sam41999">Sam41999</a>, <a href="/users/Stacimalibu">Stacimalibu</a>, <a href="/users/StarryKnight565">StarryKnight565</a>, <a href="/users/RecklessPrudence">RecklessPrudence</a>, <a href="/users/Prophesier_Key">Prophesier_Key</a>, <a href="/users/GreyDayMoon">GreyDayMoon</a>, <a href="/users/smolmenace">smolmenace</a>, <a href="/users/The_she_demons">The_she_demons</a>, <a href="/users/Myamissymoo">Myamissymoo</a>, <a href="/users/RinnyEC">RinnyEC</a>, <a href="/users/Red_Lego2x4">Red_Lego2x4</a>, <a href="/users/Rose_Of_Dusk">Rose_Of_Dusk</a>, <a href="/users/NotASloth">NotASloth</a>, <a href="/users/MysticFlamingo">MysticFlamingo</a>, <a href="/users/Baranor7">Baranor7</a>, <a href="/users/aloserkid">aloserkid</a>, <a href="/users/ShadowedGalaxy">ShadowedGalaxy</a>, <a href="/users/Tempest_Nemesis">Tempest_Nemesis</a>, <a href="/users/OnyxStitches">OnyxStitches</a>, <a href="/users/Troper_Nyaru">Troper_Nyaru</a>, <a href="/users/QingJynnBean_27">QingJynnBean_27</a>, <a href="/users/Blance_DuBois">Blance_DuBois</a>, <a href="/users/i_am_a_small_potato">i_am_a_small_potato</a>, <a href="/users/tobifog">tobifog</a>, <a href="/users/arch101">arch101</a>, <a href="/users/Tj123">Tj123</a>, <a href="/users/Wintermichael">Wintermichael</a>, <a href="/users/TheEndorCreeper">TheEndorCreeper</a>, <a href="/users/Whitetiger789">Whitetiger789</a>, <a href="/users/whod99">whod99</a>, <a href="/users/CheesusCrust">CheesusCrust</a>, <a href="/users/Scrivenger_Grimgar">Scrivenger_Grimgar</a>, <a href="/users/Zerph">Zerph</a>, <a href="/users/alkaidp">alkaidp</a>, <a href="/users/FunNerd">FunNerd</a>, <a href="/users/AnabelleRosenai">AnabelleRosenai</a>, <a href="/users/befuddle">befuddle</a>, <a href="/users/Dumpster_Closet">Dumpster_Closet</a>, <a href="/users/Acteae">Acteae</a>, <a href="/users/Chimeras_Hope">Chimeras_Hope</a>, <a href="/users/Kibokite">Kibokite</a>, <a href="/users/Dracovoce">Dracovoce</a>, <a href="/users/UmiMumi">UmiMumi</a>, <a href="/users/idnn927">idnn927</a>, <a href="/users/leggyleo">leggyleo</a>, <a href="/users/Wolfgirl85670">Wolfgirl85670</a>, <a href="/users/jaBeca_desafinada">jaBeca_desafinada</a>, <a href="/users/RadAceFriend">RadAceFriend</a>, <a href="/users/Alenari">Alenari</a>, <a href="/users/Lacila">Lacila</a>, <a href="/users/XiontheDragon">XiontheDragon</a>, <a href="/users/the_lost_Homestuck">the_lost_Homestuck</a>, <a href="/users/Maximilian_Alexander">Maximilian_Alexander</a>, <a href="/users/Comedy_Junky88">Comedy_Junky88</a>, <a href="/users/Poseidon95">Poseidon95</a>, <a href="/users/Kyonarai">Kyonarai</a>, <a href="/users/BlueLiliesStars">BlueLiliesStars</a>, <a href="/users/Marina_Rosette">Marina_Rosette</a>, <a href="/users/peacock_mami">peacock_mami</a>, <a href="/users/SpaceFarm">SpaceFarm</a>, <a href="/users/FairlyWicked">FairlyWicked</a>, <a href="/users/jelliefishies">jelliefishies</a>, <a href="/users/AnOverObsessedShipper">AnOverObsessedShipper</a>, <a href="/users/l_ermite">l_ermite</a>, <a href="/users/LilacAsteroid">LilacAsteroid</a>, <a href="/users/Seniorirish2">Seniorirish2</a>, <a href="/users/Verdantia">Verdantia</a>, <a href="/users/TheStoryWever">TheStoryWever</a>, <a href="/users/unreemarkable">unreemarkable</a>, <a href="/users/Theodore_Writes">Theodore_Writes</a>, <a href="/users/Rytsu">Rytsu</a>, <a href="/users/Kenaressa">Kenaressa</a>, <a href="/users/lethaltea">lethaltea</a>, <a href="/users/StarryNightConstellations">StarryNightConstellations</a>, <a href="/users/Porpoise_philosopher">Porpoise_philosopher</a>, <a href="/users/ForbiddenFandom">ForbiddenFandom</a>, <a href="/users/EmmaSaysHi">EmmaSaysHi</a>, <a href="/users/writingforFUNandbecauseBoredom">writingforFUNandbecauseBoredom</a>, <a href="/users/Seer_Of_Life">Seer_Of_Life</a>, <a href="/users/Dismallyadorable">Dismallyadorable</a>, <a href="/users/KanaSee">KanaSee</a>, <a href="/users/InTheSnow">InTheSnow</a>, <a href="/users/babbling_bedlamite">babbling_bedlamite</a>, <a href="/users/Chupilca">Chupilca</a>, <a href="/users/girlizzima">girlizzima</a>, <a href="/users/dearwhimsy">dearwhimsy</a>, <a href="/users/Delsark">Delsark</a>, <a href="/users/thebuildingsnotonfire">thebuildingsnotonfire</a>, <a href="/users/Elyra_the_Grey">Elyra_the_Grey</a>, <a href="/users/PinkieStyle">PinkieStyle</a>, <a href="/users/mxpiter">mxpiter</a>, <a href="/users/SpaceY787">SpaceY787</a>, <a href="/users/Sennica">Sennica</a>, <a href="/users/Kingdom_of_Ice">Kingdom_of_Ice</a>, <a href="/users/Seekingtheoblivion">Seekingtheoblivion</a>, <a href="/users/ashenRebirth">ashenRebirth</a>, <a href="/users/phoenixdaisy">phoenixdaisy</a>, <a href="/users/Walker4">Walker4</a>, <a href="/users/hopsus">hopsus</a>, <a href="/users/Im_super_trash_owo">Im_super_trash_owo</a>, <a href="/users/Dovakitten">Dovakitten</a>, <a href="/users/MiaoMi">MiaoMi</a>, <a href="/users/sunflowersafehaven">sunflowersafehaven</a>, <a href="/users/Scaradango">Scaradango</a>, <a href="/users/TheUnnamedSin">TheUnnamedSin</a>, <a href="/users/aqustd">aqustd</a>, <a href="/users/Missatatoperv">Missatatoperv</a>, <a href="/users/WrensThrenody">WrensThrenody</a>, <a href="/users/condonzack">condonzack</a>, <a href="/users/lue_n05">lue_n05</a>, <a href="/users/conned_by_connwaer">conned_by_connwaer</a>, <a href="/users/HikariFlower">HikariFlower</a>, <a href="/users/Hue_Scan">Hue_Scan</a>, <a href="/users/SpaceButterflies">SpaceButterflies</a>, <a href="/users/IridescentStars">IridescentStars</a>, <a href="/users/poisonred">poisonred</a>, <a href="/users/GoddamnItNoctis">GoddamnItNoctis</a>, <a href="/users/bleubirdsong">bleubirdsong</a>, <a href="/users/Gogle">Gogle</a>, <a href="/users/KyokiUzumaki">KyokiUzumaki</a>, <a href="/users/wintersnout">wintersnout</a>, <a href="/users/TheKillerQueen">TheKillerQueen</a>, <a href="/users/SamMason666">SamMason666</a>, <a href="/users/Midnight_Reader">Midnight_Reader</a>, <a href="/users/TrueLove17yugi_yami">TrueLove17yugi_yami</a>, <a href="/users/patronsaintoffuck">patronsaintoffuck</a>, <a href="/users/KRDiStort">KRDiStort</a>, <a href="/users/VardaKatsu">VardaKatsu</a>, <a href="/users/ImpassiveMoon">ImpassiveMoon</a>, <a href="/users/020_Serpens_1996">020_Serpens_1996</a>, <a href="/users/YokoHasagagua">YokoHasagagua</a>, <a href="/users/cunninglanguage">cunninglanguage</a>, <a href="/users/Silverwolf1211">Silverwolf1211</a>, <a href="/users/honorelle">honorelle</a>, <a href="/users/terribly_shy">terribly_shy</a>, <a href="/users/sprytfrysker">sprytfrysker</a>, <a href="/users/ProfessionalCranberry">ProfessionalCranberry</a>, <a href="/users/mayhavefakedit">mayhavefakedit</a>, <a href="/users/SilentReader_R">SilentReader_R</a>, <a href="/users/Umbreonpanda">Umbreonpanda</a>, <a href="/users/MadHat_Alice">MadHat_Alice</a>, <a href="/users/ObsessiveOddball">ObsessiveOddball</a>, <a href="/users/CrimsonMoonn">CrimsonMoonn</a>, <a href="/users/Kail_lizuc">Kail_lizuc</a>, <a href="/users/TheRedSun">TheRedSun</a>, <a href="/users/Zerafall">Zerafall</a>, <a href="/users/sparklingflare0214">sparklingflare0214</a>, <a href="/users/chachamaru43">chachamaru43</a>, <a href="/users/Serenity_Hime">Serenity_Hime</a>, <a href="/users/Mystic_Rising">Mystic_Rising</a>, <a href="/users/Army_7_Life">Army_7_Life</a>, <a href="/users/ArtisticKamenRider">ArtisticKamenRider</a>, <a href="/users/Blacksun321">Blacksun321</a>, <a href="/users/pleasant_pluviophile">pleasant_pluviophile</a>, <a href="/users/ktnow8y">ktnow8y</a>, <a href="/users/AngelsAreWatchingOverYou">AngelsAreWatchingOverYou</a>, <a href="/users/RiotStyle">RiotStyle</a>, <a href="/users/SomebodyNobodyEverybody">SomebodyNobodyEverybody</a>, <a href="/users/AmazingHefi">AmazingHefi</a>, <a href="/users/Raven_hart">Raven_hart</a>, <a href="/users/BearandtheBunny">BearandtheBunny</a>, <a href="/users/Rmbz">Rmbz</a>, <a href="/users/ArietteEpsilon">ArietteEpsilon</a>, <a href="/users/alexak">alexak</a>, <a href="/users/fracil_shvets">fracil_shvets</a>, <a href="/users/ApatheticAlways">ApatheticAlways</a>, <a href="/users/TobiasWraithwall">TobiasWraithwall</a>, <a href="/users/Captainloony007">Captainloony007</a>, <a href="/users/monny2404">monny2404</a>, <a href="/users/Raggabrash">Raggabrash</a>, <a href="/users/wassupyo">wassupyo</a>, <a href="/users/i_am_nervousness">i_am_nervousness</a>, <a href="/users/chanticleer">chanticleer</a>, <a href="/users/jumpwjoy">jumpwjoy</a>, <a href="/users/Stormslostradiant">Stormslostradiant</a>, <a href="/users/MamaOwl248">MamaOwl248</a>, <a href="/users/Xstone1">Xstone1</a>, <a href="/users/Ren_berries">Ren_berries</a>, <a href="/users/Isis_the_Sphinx">Isis_the_Sphinx</a>, <a href="/users/Plagues_Vengeance">Plagues_Vengeance</a>, <a href="/users/colourfulqueer">colourfulqueer</a>, <a href="/users/ThatOneDolphinLover">ThatOneDolphinLover</a>, <a href="/users/Silfrvarg">Silfrvarg</a>, <a href="/users/zaphire18">zaphire18</a>, <a href="/users/MediocreSavant">MediocreSavant</a>, <a href="/users/Harym42">Harym42</a>, <a href="/users/TheVoidIsHiring">TheVoidIsHiring</a>, <a href="/users/Wowza48">Wowza48</a>, <a href="/users/Naokikiri">Naokikiri</a>, <a href="/users/GuessMyname1306">GuessMyname1306</a>, <a href="/users/FlippedScript">FlippedScript</a>, <a href="/users/yandare_senpai">yandare_senpai</a>, <a href="/users/Punpun">Punpun</a>, <a href="/users/AlterNight">AlterNight</a>, <a href="/users/043912">043912</a>, <a href="/users/deerang2002">deerang2002</a>, <a href="/users/what_even_is_sleep">what_even_is_sleep</a>, <a href="/users/CloverLord">CloverLord</a>, <a href="/users/DeadPatrol">DeadPatrol</a>, <a href="/users/compass96">compass96</a>, <a href="/users/Usili">Usili</a>, <a href="/users/Scinn">Scinn</a>, <a href="/users/IrogicalArgument">IrogicalArgument</a>, <a href="/users/dekkaisdefyinggravity">dekkaisdefyinggravity</a>, <a href="/users/hmn92">hmn92</a>, <a href="/users/LilyLeaves">LilyLeaves</a>, <a href="/users/wintershope">wintershope</a>, <a href="/users/TabbyNundo">TabbyNundo</a>, <a href="/users/HandHelld">HandHelld</a>, <a href="/users/Twin2">Twin2</a>, <a href="/users/glueballs">glueballs</a>, <a href="/users/Salka24">Salka24</a>, <a href="/users/Magical_librarian">Magical_librarian</a>, <a href="/users/justsomebread">justsomebread</a>, <a href="/users/LastHope">LastHope</a>, <a href="/users/Ronnie_Lewis">Ronnie_Lewis</a>, <a href="/users/JesterCard">JesterCard</a>, <a href="/users/Nightfaaal">Nightfaaal</a>, <a href="/users/justalilfangirl">justalilfangirl</a>, <a href="/users/AmusedDevil">AmusedDevil</a>, <a href="/users/YumeFuragumento">YumeFuragumento</a>, <a href="/users/Paintmosi">Paintmosi</a>, <a href="/users/Zalewinds">Zalewinds</a>, <a href="/users/the_humdrum">the_humdrum</a>, <a href="/users/LordDoitsu">LordDoitsu</a>, <a href="/users/russian_space_geckos">russian_space_geckos</a>, <a href="/users/Olorisstra">Olorisstra</a>, <a href="/users/M1zushi">M1zushi</a>, <a href="/users/Fellfromthevoid">Fellfromthevoid</a>, <a href="/users/ninasafiri">ninasafiri</a>, <a href="/users/Guard1ans">Guard1ans</a>, <a href="/users/lyssippe">lyssippe</a>, <a href="/users/Math_Book">Math_Book</a>, <a href="/users/AppleFlapjack">AppleFlapjack</a>, <a href="/users/miscat">miscat</a>, <a href="/users/slytherinsdaughter">slytherinsdaughter</a>, <a href="/users/IceWolf92">IceWolf92</a>, <a href="/users/Gigas">Gigas</a>, <a href="/users/Zelezawui">Zelezawui</a>, <a href="/users/MasterofSwords7">MasterofSwords7</a>, <a href="/users/catfire13">catfire13</a>, <a href="/users/Caellen">Caellen</a>, <a href="/users/random0factor">random0factor</a>, <a href="/users/paracosim">paracosim</a>, <a href="/users/kate3248">kate3248</a>, <a href="/users/My_feets">My_feets</a>, <a href="/users/Alkirian">Alkirian</a>, <a href="/users/bisexualpirate">bisexualpirate</a>, <a href="/users/MakaChii">MakaChii</a>, <a href="/users/miikkuli">miikkuli</a>, <a href="/users/SchrodingersKat">SchrodingersKat</a>, <a href="/users/scarfshark">scarfshark</a>, <a href="/users/pandadictator">pandadictator</a>, <a href="/users/Candetrona">Candetrona</a>, <a href="/users/SeraphiraLilith">SeraphiraLilith</a>, <a href="/users/Pause143">Pause143</a>, <a href="/users/starlighted">starlighted</a>, <a href="/users/SaccharineSalt">SaccharineSalt</a>, <a href="/users/CaitieAHHHH">CaitieAHHHH</a>, <a href="/users/cerulai">cerulai</a>, <a href="/users/this_strangebewilderment">this_strangebewilderment</a>, <a href="/users/Nacho_Cheese">Nacho_Cheese</a>, <a href="/users/rune_ined">rune_ined</a>, <a href="/users/AsFarAsICouldSee">AsFarAsICouldSee</a>, <a href="/users/Adwen">Adwen</a>, <a href="/users/Miss_Write">Miss_Write</a>, <a href="/users/serotonus">serotonus</a>, <a href="/users/EvilZebra">EvilZebra</a>, <a href="/users/igoldengirl007">igoldengirl007</a>, <a href="/users/Tb22194">Tb22194</a>, <a href="/users/LudonarrativeDissonance">LudonarrativeDissonance</a>, <a href="/users/TheHollyTree">TheHollyTree</a>, <a href="/users/Ellarian">Ellarian</a>, <a href="/users/percyjackass">percyjackass</a>, <a href="/users/Ace_of_Spades">Ace_of_Spades</a>, <a href="/users/PastelCandy">PastelCandy</a>, <a href="/users/Ginger_Senpai">Ginger_Senpai</a>, <a href="/users/GunsAndMagic">GunsAndMagic</a>, <a href="/users/Kikiqueen">Kikiqueen</a>, <a href="/users/NyanzoYiffmada">NyanzoYiffmada</a>, <a href="/users/popcornpile">popcornpile</a>, <a href="/users/mangoisee">mangoisee</a>, <a href="/users/berkaa">berkaa</a>, <a href="/users/KirishiMom">KirishiMom</a>, <a href="/users/Akirama">Akirama</a>, <a href="/users/shakina">shakina</a>, <a href="/users/kim1131">kim1131</a>, <a href="/users/insidiousillusions">insidiousillusions</a>, <a href="/users/Luminarily">Luminarily</a>, <a href="/users/loveurselfmp3">loveurselfmp3</a>, <a href="/users/whymeiy">whymeiy</a>, <a href="/users/Dead_but_only_ironically">Dead_but_only_ironically</a>, <a href="/users/Kyuubi_Kuroba">Kyuubi_Kuroba</a>, <a href="/users/MYCOOKIESVENOMOUSYESTHEYBITE">MYCOOKIESVENOMOUSYESTHEYBITE</a>, <a href="/users/KaiTheAwesomeGuy">KaiTheAwesomeGuy</a>, <a href="/users/Neis">Neis</a>, <a href="/users/kuroiitami">kuroiitami</a>, <a href="/users/temperature_is_fake">temperature_is_fake</a>, <a href="/users/Brynhilde">Brynhilde</a>, <a href="/users/Veorie">Veorie</a>, <a href="/users/AnalogRain">AnalogRain</a>, <a href="/users/wodniw_a">wodniw_a</a>, <a href="/users/MySolitude">MySolitude</a>, <a href="/users/DragonMoon2995">DragonMoon2995</a>, <a href="/users/AshlinMerdew">AshlinMerdew</a>, <a href="/users/chabbit">chabbit</a>, <a href="/users/LOGO_Comics">LOGO_Comics</a>, <a href="/users/Tealeafcustom">Tealeafcustom</a>, <a href="/users/PsychaoticButterscotch">PsychaoticButterscotch</a>, <a href="/users/Kitsune243">Kitsune243</a>, <a href="/users/Batgirlbunny">Batgirlbunny</a>, <a href="/users/YggiDee">YggiDee</a>, <a href="/users/Mezzy2468">Mezzy2468</a>, <a href="/users/Sparsile">Sparsile</a>, <a href="/users/FianatOfAvalon">FianatOfAvalon</a>, <a href="/users/SkyeMist">SkyeMist</a>, <a href="/users/septemberisending">septemberisending</a>, <a href="/users/Slyaa_134">Slyaa_134</a>, <a href="/users/giovygio91">giovygio91</a>, <a href="/users/Mellisah">Mellisah</a>, <a href="/users/RumpleTheWanderer">RumpleTheWanderer</a>, <a href="/users/DeerShifter">DeerShifter</a>, <a href="/users/poetikat">poetikat</a>, <a href="/users/DementorsBane">DementorsBane</a>, <a href="/users/SierraToYourMist">SierraToYourMist</a>, <a href="/users/CriticalSecret">CriticalSecret</a>, <a href="/users/ThermicSine">ThermicSine</a>, <a href="/users/Monozuchan">Monozuchan</a>, <a href="/users/tomatoRenegade">tomatoRenegade</a>, <a href="/users/StyrofoamSickness">StyrofoamSickness</a>, <a href="/users/Wolfren13">Wolfren13</a>, <a href="/users/mamawerewolf">mamawerewolf</a>, <a href="/users/Dontjudgemyfanfichistory">Dontjudgemyfanfichistory</a>, <a href="/users/when_the_mayflowers_bloom">when_the_mayflowers_bloom</a>, <a href="/users/justsmilemore">justsmilemore</a>, <a href="/users/Kayl">Kayl</a>, <a href="/users/Lady_Genevieve">Lady_Genevieve</a>, <a href="/users/Ithilion">Ithilion</a>, <a href="/users/Hiepsfrog">Hiepsfrog</a>, <a href="/users/Renkades">Renkades</a>, <a href="/users/DragonRider53">DragonRider53</a>, <a href="/users/secondlandia">secondlandia</a>, <a href="/users/Slirry">Slirry</a>, <a href="/users/DawningFlower">DawningFlower</a>, <a href="/users/Madine_has_arrived20">Madine_has_arrived20</a>, <a href="/users/HoodedLord">HoodedLord</a>, <a href="/users/scrawly_times">scrawly_times</a>, <a href="/users/sunandmooniceandsnow">sunandmooniceandsnow</a>, <a href="/users/NutmegCucurbita">NutmegCucurbita</a>, <a href="/users/bravo">bravo</a>, <a href="/users/Leosworld">Leosworld</a>, <a href="/users/CureIcy">CureIcy</a>, <a href="/users/MajorSession">MajorSession</a>, <a href="/users/PhyreGirl">PhyreGirl</a>, <a href="/users/EmpressofFei">EmpressofFei</a>, <a href="/users/Haru_Kuwamine">Haru_Kuwamine</a>, <a href="/users/PixelKind">PixelKind</a>, <a href="/users/GingerKid1701">GingerKid1701</a>, <a href="/users/atwistedconundrum">atwistedconundrum</a>, <a href="/users/Soul_of_the_Kitsune">Soul_of_the_Kitsune</a>, <a href="/users/Silver_tenshi">Silver_tenshi</a>, <a href="/users/Shadowphoenix16">Shadowphoenix16</a>, <a href="/users/Sanemadness">Sanemadness</a>, <a href="/users/sceleris">sceleris</a>, <a href="/users/Crazy_wolf_2477">Crazy_wolf_2477</a>, <a href="/users/Jaggedheart">Jaggedheart</a>, <a href="/users/Rootin_Tootin_Toucan">Rootin_Tootin_Toucan</a>, <a href="/users/Redsparrow12">Redsparrow12</a>, <a href="/users/girlwithouttime">girlwithouttime</a>, <a href="/users/ChaosMage175">ChaosMage175</a>, <a href="/users/Delighted_to_Read_You">Delighted_to_Read_You</a>, <a href="/users/yaowoyorozu">yaowoyorozu</a>, <a href="/users/BiblioMatsuri">BiblioMatsuri</a>, <a href="/users/meridien313">meridien313</a>, <a href="/users/SallyJay">SallyJay</a>, <a href="/users/Apsire">Apsire</a>, <a href="/users/Jay_Bird6810">Jay_Bird6810</a>, <a href="/users/NamioftheSea">NamioftheSea</a>, <a href="/users/Lord_Miraak">Lord_Miraak</a>, <a href="/users/PendingPendulum">PendingPendulum</a>, <a href="/users/MidKnightOwl">MidKnightOwl</a>, <a href="/users/celibateHero">celibateHero</a>, <a href="/users/GhostTikTak">GhostTikTak</a>, <a href="/users/Masked_Victim">Masked_Victim</a>, <a href="/users/FriendlyObsessiveReader">FriendlyObsessiveReader</a>, <a href="/users/Fittonia">Fittonia</a>, <a href="/users/iwonderandiwander">iwonderandiwander</a>, <a href="/users/Andrake">Andrake</a>, <a href="/users/Jamica">Jamica</a>, <a href="/users/UltimateGamer101">UltimateGamer101</a>, <a href="/users/Blaiddsumu">Blaiddsumu</a>, <a href="/users/Trax369">Trax369</a>, <a href="/users/DubbLeohh">DubbLeohh</a>, <a href="/users/HikariNekoo">HikariNekoo</a>, <a href="/users/Ashallayndarkyn">Ashallayndarkyn</a>, <a href="/users/TheCheeseWitch">TheCheeseWitch</a>, <a href="/users/Vector_Arrows">Vector_Arrows</a>, <a href="/users/Lynn_kitsune">Lynn_kitsune</a>, <a href="/users/ShinkaAkira">ShinkaAkira</a>, <a href="/users/winterthur">winterthur</a>, <a href="/users/Idontknowisuckwithnames">Idontknowisuckwithnames</a>, <a href="/users/shunned_one">shunned_one</a>, <a href="/users/Bubblemuffles">Bubblemuffles</a>, <a href="/users/loatroll">loatroll</a>, <a href="/users/DemoiselleRouge">DemoiselleRouge</a>, <a href="/users/4annfals">4annfals</a>, <a href="/users/Feather_Qwill">Feather_Qwill</a>, <a href="/users/Sunny_yea">Sunny_yea</a>, <a href="/users/Chirolite">Chirolite</a>, <a href="/users/Emordnilap101">Emordnilap101</a>, <a href="/users/purple_lips">purple_lips</a>, <a href="/users/CantBelieveItsNotGay">CantBelieveItsNotGay</a>, <a href="/users/SkyBunny25">SkyBunny25</a>, <a href="/users/HoneyBadger97">HoneyBadger97</a>, <a href="/users/Alilaila">Alilaila</a>, <a href="/users/Tangibility">Tangibility</a>, <a href="/users/frozenintime">frozenintime</a>, <a href="/users/Prisca_Cosmo">Prisca_Cosmo</a>, <a href="/users/yada1993">yada1993</a>, <a href="/users/bluemoldxcalicocat">bluemoldxcalicocat</a>, <a href="/users/SeeMyShadows">SeeMyShadows</a>, <a href="/users/katyr0101">katyr0101</a>, <a href="/users/MsLilly">MsLilly</a>, <a href="/users/hi_im_whY">hi_im_whY</a>, <a href="/users/Zepheric">Zepheric</a>, <a href="/users/Before_i_sleep">Before_i_sleep</a>, <a href="/users/AuroraDragon">AuroraDragon</a>, <a href="/users/DacianaDrakul24">DacianaDrakul24</a>, <a href="/users/Reijade">Reijade</a>, <a href="/users/LazyCoffee">LazyCoffee</a>, <a href="/users/Koganei_chan0104">Koganei_chan0104</a>, <a href="/users/PwincessSapphire">PwincessSapphire</a>, <a href="/users/bookandtvlover465">bookandtvlover465</a>, <a href="/users/ChewyNemesis">ChewyNemesis</a>, <a href="/users/Aurelyn">Aurelyn</a>, <a href="/users/AthenasDragon138">AthenasDragon138</a>, <a href="/users/Onlyus">Onlyus</a>, <a href="/users/YellowWomanontheBrink">YellowWomanontheBrink</a>, <a href="/users/accord">accord</a>, <a href="/users/captainsatire">captainsatire</a>, <a href="/users/WordCubed">WordCubed</a>, <a href="/users/tybaltcapulet">tybaltcapulet</a>, <a href="/users/onwardforalways">onwardforalways</a>, <a href="/users/Brushstrokefox">Brushstrokefox</a>, <a href="/users/Hoxrns">Hoxrns</a>, <a href="/users/MynameisJodi">MynameisJodi</a>, <a href="/users/lazy_spectator">lazy_spectator</a>, <a href="/users/LameGayShark">LameGayShark</a>, <a href="/users/Lottie_Tsubasa">Lottie_Tsubasa</a>, <a href="/users/Ashtreemeadow">Ashtreemeadow</a>, <a href="/users/Raining_Leaves">Raining_Leaves</a>, <a href="/users/Artemis_Crimson">Artemis_Crimson</a>, <a href="/users/Anthem_of_Liones">Anthem_of_Liones</a>, <a href="/users/Shirokurobaku">Shirokurobaku</a>, <a href="/users/Deannaistirednnngh">Deannaistirednnngh</a>, <a href="/users/reinariel">reinariel</a>, <a href="/users/ORgasmicPigeon">ORgasmicPigeon</a>, <a href="/users/creativesm75">creativesm75</a>, <a href="/users/lizzpercush">lizzpercush</a>, <a href="/users/Catkyn">Catkyn</a>, <a href="/users/poisonedbymako">poisonedbymako</a>, <a href="/users/Harley_Q">Harley_Q</a>, <a href="/users/Psiiren">Psiiren</a>, <a href="/users/Mute_Madness">Mute_Madness</a>, <a href="/users/Ingeitum">Ingeitum</a>, <a href="/users/HarriedHermes">HarriedHermes</a>, <a href="/users/secret_werewolves">secret_werewolves</a>, <a href="/users/Socordiam">Socordiam</a>, <a href="/users/rigi">rigi</a>, <a href="/users/LadyImago">LadyImago</a>, <a href="/users/Glowfire">Glowfire</a>, <a href="/users/Moonpuzzle">Moonpuzzle</a>, <a href="/users/OrangeKe_2">OrangeKe_2</a>, <a href="/users/scorpioblueeyes">scorpioblueeyes</a>, <a href="/users/Mothmanisreal">Mothmanisreal</a>, <a href="/users/MightyMouse">MightyMouse</a>, <a href="/users/CosplayRaven">CosplayRaven</a>, <a href="/users/aroray">aroray</a>, <a href="/users/Assiduously_Haphazard">Assiduously_Haphazard</a>, <a href="/users/And_My_Axe_Girl">And_My_Axe_Girl</a>, <a href="/users/DaemonWolfe">DaemonWolfe</a>, <a href="/users/Nahjii">Nahjii</a>, <a href="/users/Musecal">Musecal</a>, <a href="/users/momomonstrosity_37">momomonstrosity_37</a>, <a href="/users/Pallascatevo">Pallascatevo</a>, <a href="/users/HeckinMotherYee">HeckinMotherYee</a>, <a href="/users/lucky1025">lucky1025</a>, <a href="/users/Della_Lupa">Della_Lupa</a>, <a href="/users/Rothinsel">Rothinsel</a>, <a href="/users/Skadi_The_Goddess_of_Winter">Skadi_The_Goddess_of_Winter</a>, <a href="/users/Asomewolf">Asomewolf</a>, <a href="/users/TheShippingGirl">TheShippingGirl</a>, <a href="/users/LizwiddaZ">LizwiddaZ</a>, <a href="/users/leilairan3">leilairan3</a>, <a href="/users/AllForPun">AllForPun</a>, <a href="/users/Lucidity">Lucidity</a>, <a href="/users/keiyos">keiyos</a>, <a href="/users/koneji">koneji</a>, <a href="/users/Redrayvn">Redrayvn</a>, <a href="/users/ben_jaded">ben_jaded</a>, <a href="/users/Mysterious_Prophetess">Mysterious_Prophetess</a>, <a href="/users/bootsandboulders">bootsandboulders</a>, <a href="/users/IfWishesWereHorses">IfWishesWereHorses</a>, <a href="/users/Shinju_Tori">Shinju_Tori</a>, <a href="/users/Goodminji">Goodminji</a>, <a href="/users/LDK">LDK</a>, <a href="/users/Aminaoi">Aminaoi</a>, <a href="/users/Starchaic">Starchaic</a>, <a href="/users/SonAsami">SonAsami</a>, <a href="/users/queenofugh">queenofugh</a>, <a href="/users/SuneaterKuvan">SuneaterKuvan</a>, <a href="/users/Dessmina">Dessmina</a>, <a href="/users/Lila_Vitoria">Lila_Vitoria</a>, <a href="/users/kimchiwrites">kimchiwrites</a>, <a href="/users/Nightfire_kVala">Nightfire_kVala</a>, <a href="/users/YourEndIsNye">YourEndIsNye</a>, <a href="/users/Dire_Kumori">Dire_Kumori</a>, <a href="/users/Howltriem">Howltriem</a>, <a href="/users/Raven_Iris">Raven_Iris</a>, <a href="/users/lord_ibau">lord_ibau</a>, <a href="/users/Mellifluous_Cadance">Mellifluous_Cadance</a>, <a href="/users/Stackerwlf">Stackerwlf</a>, <a href="/users/imprisonbabies">imprisonbabies</a>, <a href="/users/Unformal_Sorrelle">Unformal_Sorrelle</a>, <a href="/users/Inkillousionist">Inkillousionist</a>, <a href="/users/xenzen">xenzen</a>, <a href="/users/Nataliebe96">Nataliebe96</a>, <a href="/users/ninjaeris131">ninjaeris131</a>, <a href="/users/RhapsodicDorito">RhapsodicDorito</a>, <a href="/users/living_with_the_night">living_with_the_night</a>, <a href="/users/lightningstrikes">lightningstrikes</a>, <a href="/users/AwesomeOnly">AwesomeOnly</a>, <a href="/users/Texiliaz">Texiliaz</a>, <a href="/users/ERI_HIO">ERI_HIO</a>, <a href="/users/chipperdan">chipperdan</a>, <a href="/users/VictoryUlforce">VictoryUlforce</a>, <a href="/users/wei_wei_wei">wei_wei_wei</a>, <a href="/users/StrudelQueen">StrudelQueen</a>, <a href="/users/CrossBones">CrossBones</a>, <a href="/users/peachmlk">peachmlk</a>, <a href="/users/Im_happy_dammit">Im_happy_dammit</a>, <a href="/users/Justtochi">Justtochi</a>, <a href="/users/SilentUnicornSpeaks">SilentUnicornSpeaks</a>, <a href="/users/Alhenair">Alhenair</a>, <a href="/users/Jericoshost">Jericoshost</a>, <a href="/users/Imaginationzkey">Imaginationzkey</a>, <a href="/users/DoomsdayKitten">DoomsdayKitten</a>, <a href="/users/BookLover2401">BookLover2401</a>, <a href="/users/Heylel_27">Heylel_27</a>, <a href="/users/Snowfluff">Snowfluff</a>, <a href="/users/Dicove">Dicove</a>, <a href="/users/cyborg23">cyborg23</a>, <a href="/users/NeptunesMirror">NeptunesMirror</a>, <a href="/users/Adramaelim">Adramaelim</a>, <a href="/users/Book_Worm1414">Book_Worm1414</a>, <a href="/users/vannerrie">vannerrie</a>, <a href="/users/brieflydeepperson">brieflydeepperson</a>, <a href="/users/RianMoeru">RianMoeru</a>, <a href="/users/Yomion">Yomion</a>, <a href="/users/Swedishluck">Swedishluck</a>, <a href="/users/p3paula">p3paula</a>, <a href="/users/dhazellouise">dhazellouise</a>, <a href="/users/nuggle3">nuggle3</a>, <a href="/users/AgentWindsnap">AgentWindsnap</a>, <a href="/users/Rein">Rein</a>, <a href="/users/ShotgunWoman">ShotgunWoman</a>, <a href="/users/redhuntress26">redhuntress26</a>, <a href="/users/Martesh">Martesh</a>, <a href="/users/democord">democord</a>, <a href="/users/Diomedeidae">Diomedeidae</a>, <a href="/users/Aurbane">Aurbane</a>, <a href="/users/SenpenBanka">SenpenBanka</a>, <a href="/users/hermitcrabandproud">hermitcrabandproud</a>, <a href="/users/Eternal_Paradox001">Eternal_Paradox001</a>, <a href="/users/origami79">origami79</a>, <a href="/users/plastromeme">plastromeme</a>, <a href="/users/Seedling_lotus">Seedling_lotus</a>, <a href="/users/Werewolf_Alpha">Werewolf_Alpha</a>, <a href="/users/The_Girl_Who_Cried_Wolf">The_Girl_Who_Cried_Wolf</a>, <a href="/users/Daga000">Daga000</a>, <a href="/users/yeehawfam">yeehawfam</a>, <a href="/users/Sea_Nagatani">Sea_Nagatani</a>, <a href="/users/DJdjakko">DJdjakko</a>, <a href="/users/Trashreciptical">Trashreciptical</a>, <a href="/users/Hydrawolf">Hydrawolf</a>, <a href="/users/BlueNekomata">BlueNekomata</a>, <a href="/users/MakeBelieveMacy">MakeBelieveMacy</a>, <a href="/users/Kuro_freak_fanatic">Kuro_freak_fanatic</a>, <a href="/users/Wishdead">Wishdead</a>, <a href="/users/Hep0katti">Hep0katti</a>, <a href="/users/kyzalon">kyzalon</a>, <a href="/users/VampireJellybean15">VampireJellybean15</a>, <a href="/users/TheBookstore">TheBookstore</a>, <a href="/users/Silentshadow01">Silentshadow01</a>, <a href="/users/Reianon">Reianon</a>, <a href="/users/larryslarrie">larryslarrie</a>, <a href="/users/booping_the_snoot">booping_the_snoot</a>, <a href="/users/Sori13">Sori13</a>, <a href="/users/Vault166">Vault166</a>, <a href="/users/Usagi_chan">Usagi_chan</a>, <a href="/users/Arulan">Arulan</a>, <a href="/users/sleepy_willow">sleepy_willow</a>, <a href="/users/RYuuri27">RYuuri27</a>, <a href="/users/LexiAchieves">LexiAchieves</a>, <a href="/users/atypicalhypocrite">atypicalhypocrite</a>, <a href="/users/acomist">acomist</a>, <a href="/users/SkyArt">SkyArt</a>, <a href="/users/Trebor200008">Trebor200008</a>, <a href="/users/SethTheStitcher">SethTheStitcher</a>, <a href="/users/under_the_sea_dragon">under_the_sea_dragon</a>, <a href="/users/ilreies">ilreies</a>, <a href="/users/Nastish07">Nastish07</a>, <a href="/users/spacekid96">spacekid96</a>, <a href="/users/A_Wolf_Of_Ideas">A_Wolf_Of_Ideas</a>, <a href="/users/oliczek23">oliczek23</a>, <a href="/users/Nobody101">Nobody101</a>, <a href="/users/chrismarium">chrismarium</a>, <a href="/users/thejumpingbean14">thejumpingbean14</a>, <a href="/users/Genevive">Genevive</a>, <a href="/users/ArcaneCougar">ArcaneCougar</a>, <a href="/users/IndecisivePsyche">IndecisivePsyche</a>, <a href="/users/MothLarva">MothLarva</a>, <a href="/users/The_BloodyEagle">The_BloodyEagle</a>, <a href="/users/Ni_hilism">Ni_hilism</a>, <a href="/users/kipzzz">kipzzz</a>, <a href="/users/AnimeVampire">AnimeVampire</a>, <a href="/users/TheJadedPhoenix">TheJadedPhoenix</a>, <a href="/users/Its_Icecream_BB">Its_Icecream_BB</a>, <a href="/users/Alexe15">Alexe15</a>, <a href="/users/IronAngelOfAsguard">IronAngelOfAsguard</a>, <a href="/users/Baba_Yaga">Baba_Yaga</a>, <a href="/users/lamiahime">lamiahime</a>, <a href="/users/rutledgegirl">rutledgegirl</a>, <a href="/users/SaraBlake">SaraBlake</a>, <a href="/users/LoveHopes">LoveHopes</a>, <a href="/users/bookqueen15">bookqueen15</a>, <a href="/users/Rubiendz">Rubiendz</a>, <a href="/users/Shii">Shii</a>, <a href="/users/DaniKleine">DaniKleine</a>, <a href="/users/100shots100hits">100shots100hits</a>, <a href="/users/pan_demic">pan_demic</a>, <a href="/users/Possessedwolf">Possessedwolf</a>, <a href="/users/Bmorales">Bmorales</a>, <a href="/users/MalaMoon">MalaMoon</a>, <a href="/users/andreanna">andreanna</a>, <a href="/users/ImbalancedPhilosophy">ImbalancedPhilosophy</a>, <a href="/users/Micha247">Micha247</a>, <a href="/users/theaveragegatsby27">theaveragegatsby27</a>, <a href="/users/raven30142">raven30142</a>, <a href="/users/arwainian">arwainian</a>, <a href="/users/Honey_Apples">Honey_Apples</a>, <a href="/users/Calworks">Calworks</a>, <a href="/users/traviswj">traviswj</a>, <a href="/users/eternalblue">eternalblue</a>, <a href="/users/Deathlysilence">Deathlysilence</a>, <a href="/users/CAMIvH">CAMIvH</a>, <a href="/users/wolfshadow009">wolfshadow009</a>, <a href="/users/dekuquake">dekuquake</a>, <a href="/users/becamarquex">becamarquex</a>, <a href="/users/Dreamillusions">Dreamillusions</a>, <a href="/users/LabyrinthOfShadows">LabyrinthOfShadows</a>, <a href="/users/Penultimated">Penultimated</a>, <a href="/users/peachstems">peachstems</a>, <a href="/users/Gilraen_Euphemia_Amandil_Shirokaze">Gilraen_Euphemia_Amandil_Shirokaze</a>, <a href="/users/Kikenna">Kikenna</a>, <a href="/users/NightmareFlames">NightmareFlames</a>, <a href="/users/CarmineCranes">CarmineCranes</a>, <a href="/users/Spookmin">Spookmin</a>, <a href="/users/Annis_lau">Annis_lau</a>, <a href="/users/NihilistClarkKent">NihilistClarkKent</a>, <a href="/users/scienceside">scienceside</a>, <a href="/users/Luminoir">Luminoir</a>, <a href="/users/SupahJapah">SupahJapah</a>, <a href="/users/prettyboysylveon">prettyboysylveon</a>, <a href="/users/flamecranium">flamecranium</a>, <a href="/users/Lucy112358">Lucy112358</a>, <a href="/users/SIC_Prowl">SIC_Prowl</a>, <a href="/users/melodyxchii">melodyxchii</a>, <a href="/users/MissusMG">MissusMG</a>, <a href="/users/Netara">Netara</a>, <a href="/users/CIL78">CIL78</a>, <a href="/users/Illumihottie">Illumihottie</a>, <a href="/users/Katola">Katola</a>, <a href="/users/Chriko">Chriko</a>, <a href="/users/ScourgeFanatic101">ScourgeFanatic101</a>, <a href="/users/Letters2Elvinscend">Letters2Elvinscend</a>, <a href="/users/onsheka">onsheka</a>, <a href="/users/thrice_a_fool">thrice_a_fool</a>, <a href="/users/ImSoBored246">ImSoBored246</a>, <a href="/users/Willa_Night">Willa_Night</a>, <a href="/users/Drop_Dead_Inside">Drop_Dead_Inside</a>, <a href="/users/RandomUsername13">RandomUsername13</a>, <a href="/users/Uzulover">Uzulover</a>, <a href="/users/wendigogoboots">wendigogoboots</a>, <a href="/users/kunnskat">kunnskat</a>, <a href="/users/Hiroshi">Hiroshi</a>, <a href="/users/MissK">MissK</a>, <a href="/users/KagamiNoHikari">KagamiNoHikari</a>, <a href="/users/miloutic">miloutic</a>, <a href="/users/PlsLetMeSleep23">PlsLetMeSleep23</a>, <a href="/users/stellascribes">stellascribes</a>, <a href="/users/Ananda_Samsara">Ananda_Samsara</a>, <a href="/users/op_gryphon978">op_gryphon978</a>, <a href="/users/Weedzuku">Weedzuku</a>, <a href="/users/vixiveri">vixiveri</a>, <a href="/users/sleepyTree">sleepyTree</a>, <a href="/users/Calic_Rec">Calic_Rec</a>, <a href="/users/fonn">fonn</a>, <a href="/users/Lyquoritte">Lyquoritte</a>, <a href="/users/Monyas">Monyas</a>, <a href="/users/Omnipotentdogs">Omnipotentdogs</a>, <a href="/users/Blackmoontiger">Blackmoontiger</a>, <a href="/users/Usagi323">Usagi323</a>, <a href="/users/Rahtoro">Rahtoro</a>, <a href="/users/Livvy_london">Livvy_london</a>, <a href="/users/tillifer">tillifer</a>, <a href="/users/Opheliad">Opheliad</a>, <a href="/users/songofcirce">songofcirce</a>, <a href="/users/DelightfulSepsis">DelightfulSepsis</a>, <a href="/users/Wereder">Wereder</a>, <a href="/users/xRuiruiXxx">xRuiruiXxx</a>, <a href="/users/Verity58">Verity58</a>, <a href="/users/Racnarath">Racnarath</a>, <a href="/users/ghastlyGoodwill">ghastlyGoodwill</a>, <a href="/users/InsanityRed">InsanityRed</a>, <a href="/users/WarriorofAces">WarriorofAces</a>, <a href="/users/iconoclastic04">iconoclastic04</a>, <a href="/users/Justpassingthru">Justpassingthru</a>, <a href="/users/Rainofbrokenpromise">Rainofbrokenpromise</a>, <a href="/users/sweetie_24">sweetie_24</a>, <a href="/users/OmegaBeast27">OmegaBeast27</a>, <a href="/users/DraconaAria">DraconaAria</a>, <a href="/users/KazYrmir">KazYrmir</a>, <a href="/users/Sly_Helador">Sly_Helador</a>, <a href="/users/php30010">php30010</a>, <a href="/users/ladyasher13">ladyasher13</a>, <a href="/users/forgottenwhispers">forgottenwhispers</a>, <a href="/users/Amethyst_Moon">Amethyst_Moon</a>, <a href="/users/Slaayerr">Slaayerr</a>, <a href="/users/NagaTreeCrester">NagaTreeCrester</a>, <a href="/users/Lyneana">Lyneana</a>, <a href="/users/nightlilly">nightlilly</a>, <a href="/users/ohgodnowhhy">ohgodnowhhy</a>, <a href="/users/Owieeey">Owieeey</a>, <a href="/users/rayningnight">rayningnight</a>, <a href="/users/FlyingArtist">FlyingArtist</a>, <a href="/users/janazza">janazza</a>, <a href="/users/InsanityUnleashed">InsanityUnleashed</a>, <a href="/users/Fortify45">Fortify45</a>, <a href="/users/iaxyatz">iaxyatz</a>, <a href="/users/mandaknewthis">mandaknewthis</a>, <a href="/users/SaLtYrAiNbOwS">SaLtYrAiNbOwS</a>, <a href="/users/theuglyfriend">theuglyfriend</a>, <a href="/users/Winterfrostt">Winterfrostt</a>, <a href="/users/Maniacdreamer1998">Maniacdreamer1998</a>, <a href="/users/j99450">j99450</a>, <a href="/users/DAsObiQuiet">DAsObiQuiet</a>, <a href="/users/Swiny">Swiny</a>, <a href="/users/sarcasticforfunson">sarcasticforfunson</a>, <a href="/users/satisfice">satisfice</a>, <a href="/users/Matt_Phars">Matt_Phars</a>, <a href="/users/iAmDiaaa">iAmDiaaa</a>, <a href="/users/clamspeaks">clamspeaks</a>, <a href="/users/Ancer">Ancer</a>, <a href="/users/Chloe_has_2_hands">Chloe_has_2_hands</a>, <a href="/users/rabbitwords">rabbitwords</a>, <a href="/users/smallorderofcurlyfries">smallorderofcurlyfries</a>, <a href="/users/MrLackingSanity">MrLackingSanity</a>, <a href="/users/AnDeasAriana">AnDeasAriana</a>, <a href="/users/Ejrin">Ejrin</a>, <a href="/users/Rapture38">Rapture38</a>, <a href="/users/AkiraDaWolf">AkiraDaWolf</a>, <a href="/users/Astral_Throne">Astral_Throne</a>, <a href="/users/Silver_Shadow360">Silver_Shadow360</a>, <a href="/users/InfiniteToast">InfiniteToast</a>, <a href="/users/Kyotokiki">Kyotokiki</a>, <a href="/users/commonlyquixotic">commonlyquixotic</a>, <a href="/users/pointvee">pointvee</a>, <a href="/users/MentalNewt">MentalNewt</a>, <a href="/users/KH_Nobody">KH_Nobody</a>, <a href="/users/LordAlania">LordAlania</a>, <a href="/users/sofi16_1999">sofi16_1999</a>, <a href="/users/raindroproses">raindroproses</a>, <a href="/users/Sapphyre_Lorallen">Sapphyre_Lorallen</a>, <a href="/users/jaypeg">jaypeg</a>, <a href="/users/TykiTavi">TykiTavi</a>, <a href="/users/nakamotakoyaki">nakamotakoyaki</a>, <a href="/users/quillsoffire">quillsoffire</a>, <a href="/users/rubywings91">rubywings91</a>, <a href="/users/AmethystClearwater">AmethystClearwater</a>, <a href="/users/JonathanSporkTheSecond">JonathanSporkTheSecond</a>, <a href="/users/ShippingForALiving">ShippingForALiving</a>, <a href="/users/zombiepdb">zombiepdb</a>, <a href="/users/AwesomeAnimePrincess">AwesomeAnimePrincess</a>, <a href="/users/Lunatrix">Lunatrix</a>, <a href="/users/Kollaux">Kollaux</a>, <a href="/users/UssopTheLiar">UssopTheLiar</a>, <a href="/users/Hajime_Mitsoyo">Hajime_Mitsoyo</a>, <a href="/users/Percys_Panda_Pillow_Pet">Percys_Panda_Pillow_Pet</a>, <a href="/users/Korvidae_Rex">Korvidae_Rex</a>, <a href="/users/ForgettableFace">ForgettableFace</a>, <a href="/users/SavageSamurai">SavageSamurai</a>, <a href="/users/Zed_27">Zed_27</a>, <a href="/users/JulesShallRule">JulesShallRule</a>, <a href="/users/momochiaki">momochiaki</a>, <a href="/users/Emillest">Emillest</a>, <a href="/users/Pegasister60">Pegasister60</a>, <a href="/users/Hollow_Whisperings">Hollow_Whisperings</a>, <a href="/users/KitKatssie">KitKatssie</a>, <a href="/users/FlosEtIgnis">FlosEtIgnis</a>, <a href="/users/helianthemum">helianthemum</a>, <a href="/users/Shamsia">Shamsia</a>, <a href="/users/Scatterbone">Scatterbone</a>, <a href="/users/Daydreamer412">Daydreamer412</a>, <a href="/users/kappa_ta">kappa_ta</a>, <a href="/users/RoyalAdvisor13">RoyalAdvisor13</a>, <a href="/users/Azgats_Len">Azgats_Len</a>, <a href="/users/Moron1">Moron1</a>, <a href="/users/quietncryptic">quietncryptic</a>, <a href="/users/TrashZone">TrashZone</a>, <a href="/users/NoisyMuffin">NoisyMuffin</a>, <a href="/users/Vampsbware">Vampsbware</a>, <a href="/users/Bookspazz55">Bookspazz55</a>, <a href="/users/Pegistar5">Pegistar5</a>, <a href="/users/PhellDown">PhellDown</a>, <a href="/users/Ghostlanxx">Ghostlanxx</a>, <a href="/users/catarina566">catarina566</a>, <a href="/users/ANIME_IS_LIFE_bOI">ANIME_IS_LIFE_bOI</a>, <a href="/users/improbableZero">improbableZero</a>, <a href="/users/Silvalina">Silvalina</a>, <a href="/users/Setyourlazerstopew">Setyourlazerstopew</a>, <a href="/users/Elisye">Elisye</a>, <a href="/users/BlueRosariv">BlueRosariv</a>, <a href="/users/HuaFeiHua">HuaFeiHua</a>, <a href="/users/Lums_the_Hummus_Kid">Lums_the_Hummus_Kid</a>, <a href="/users/Smol_mushroom">Smol_mushroom</a>, <a href="/users/vindice">vindice</a>, <a href="/users/Paper_lily">Paper_lily</a>, <a href="/users/ShoetsuOtaku">ShoetsuOtaku</a>, <a href="/users/Momma">Momma</a>, <a href="/users/Lionan">Lionan</a>, <a href="/users/wnhy48">wnhy48</a>, <a href="/users/StaticBean227">StaticBean227</a>, <a href="/users/webtail">webtail</a>, <a href="/users/OrigamiSensei">OrigamiSensei</a>, <a href="/users/not_maddie">not_maddie</a>, <a href="/users/hellpudding">hellpudding</a>, <a href="/users/Baezetsu">Baezetsu</a>, <a href="/users/kanae1968">kanae1968</a>, <a href="/users/UserNameInstalling">UserNameInstalling</a>, <a href="/users/Pandaa123">Pandaa123</a>, <a href="/users/MaddAchinchilla">MaddAchinchilla</a>, <a href="/users/L_y_n">L_y_n</a>, <a href="/users/KairiOliver">KairiOliver</a>, <a href="/users/Goofy_Boss">Goofy_Boss</a>, <a href="/users/pen_and_pencil">pen_and_pencil</a>, <a href="/users/HautBanane">HautBanane</a>, <a href="/users/a_Strangers_Pov">a_Strangers_Pov</a>, <a href="/users/floofspring">floofspring</a>, <a href="/users/yonaka_tan">yonaka_tan</a>, <a href="/users/jeprose01">jeprose01</a>, <a href="/users/Code_Shikai_S">Code_Shikai_S</a>, <a href="/users/MysteryMystery">MysteryMystery</a>, <a href="/users/wraven881">wraven881</a>, <a href="/users/belle_jennichi">belle_jennichi</a>, <a href="/users/late_choco">late_choco</a>, <a href="/users/Perseus_Freedom">Perseus_Freedom</a>, <a href="/users/Howl_to_the_Moon">Howl_to_the_Moon</a>, <a href="/users/SayaRules">SayaRules</a>, <a href="/users/bsbluv28">bsbluv28</a>, <a href="/users/ZeroMotivationToWrite">ZeroMotivationToWrite</a>, <a href="/users/Simbjammin">Simbjammin</a>, <a href="/users/Ludicrously_Idiotic">Ludicrously_Idiotic</a>, <a href="/users/pervywisenerd">pervywisenerd</a>, <a href="/users/NoWarningSignNoAlibi">NoWarningSignNoAlibi</a>, <a href="/users/Phaes">Phaes</a>, <a href="/users/lilbabybirdie">lilbabybirdie</a>, <a href="/users/rainbowsinshadesofblue">rainbowsinshadesofblue</a>, <a href="/users/Kael_Vercorian">Kael_Vercorian</a>, <a href="/users/echotalia">echotalia</a>, <a href="/users/UnknownDevil666">UnknownDevil666</a>, <a href="/users/Sungsi">Sungsi</a>, <a href="/users/Just_Another_Introvert">Just_Another_Introvert</a>, <a href="/users/Foresthunter">Foresthunter</a>, <a href="/users/ProcrastinatorQueen">ProcrastinatorQueen</a>, <a href="/users/Aerdnanocte">Aerdnanocte</a>, <a href="/users/Strawbellie666">Strawbellie666</a>, <a href="/users/SevenRenny">SevenRenny</a>, <a href="/users/Axolotl_In_A_Bottle">Axolotl_In_A_Bottle</a>, <a href="/users/vasenrys">vasenrys</a>, <a href="/users/Ellibarrie">Ellibarrie</a>, <a href="/users/olympian_mystery">olympian_mystery</a>, <a href="/users/LordGrima">LordGrima</a>, <a href="/users/explorne">explorne</a>, <a href="/users/belawyn">belawyn</a>, <a href="/users/curledqueen">curledqueen</a>, <a href="/users/Darkdragonforge">Darkdragonforge</a>, <a href="/users/Fremontii">Fremontii</a>, <a href="/users/bee_official">bee_official</a>, <a href="/users/mangageek23">mangageek23</a>, <a href="/users/chocolettu">chocolettu</a>, <a href="/users/God_Of_Cake">God_Of_Cake</a>, <a href="/users/HereToSuffer">HereToSuffer</a>, <a href="/users/HunterOfTheWild">HunterOfTheWild</a>, <a href="/users/Kai_Lu">Kai_Lu</a>, <a href="/users/RoyalBard">RoyalBard</a>, <a href="/users/zephyr_dh">zephyr_dh</a>, <a href="/users/Blackhole_Called_Anime">Blackhole_Called_Anime</a>, <a href="/users/Mysana">Mysana</a>, <a href="/users/0ssian">0ssian</a>, <a href="/users/NingenShikkaku">NingenShikkaku</a>, <a href="/users/samlavie">samlavie</a>, <a href="/users/TenebrisDecora">TenebrisDecora</a>, <a href="/users/Serventa">Serventa</a>, <a href="/users/RedQueen">RedQueen</a>, <a href="/users/kinnoonnanoko">kinnoonnanoko</a>, <a href="/users/KnightofAwesome">KnightofAwesome</a>, <a href="/users/Liana_Alma">Liana_Alma</a>, <a href="/users/Sapphire_Arrow">Sapphire_Arrow</a>, <a href="/users/EstaJay">EstaJay</a>, <a href="/users/idiocypersonified">idiocypersonified</a>, <a href="/users/Millberry_5">Millberry_5</a>, <a href="/users/fireredrose95">fireredrose95</a>, <a href="/users/NotTheTomato">NotTheTomato</a>, <a href="/users/CactusInPots">CactusInPots</a>, <a href="/users/thisiscrasy">thisiscrasy</a>, <a href="/users/moriartyshouldseemeinacrown">moriartyshouldseemeinacrown</a>, <a href="/users/Isola">Isola</a>, <a href="/users/Firefang32942">Firefang32942</a>, <a href="/users/TheLadyVanora">TheLadyVanora</a>, <a href="/users/Itcamefromashes">Itcamefromashes</a>, <a href="/users/themysteriousinternetentity">themysteriousinternetentity</a>, <a href="/users/ReyRose">ReyRose</a>, <a href="/users/irradtional">irradtional</a>, <a href="/users/Tobiyolo">Tobiyolo</a>, <a href="/users/HillKleen">HillKleen</a>, <a href="/users/OnlyHereForTheCat">OnlyHereForTheCat</a>, <a href="/users/mandaley">mandaley</a>, <a href="/users/ConsumedFandomFrenzy">ConsumedFandomFrenzy</a>, <a href="/users/ArseniK19">ArseniK19</a>, <a href="/users/StormySkies95">StormySkies95</a>, <a href="/users/Noodlethoughts">Noodlethoughts</a>, <a href="/users/Thireven">Thireven</a>, <a href="/users/Valkyrian_Profiler">Valkyrian_Profiler</a>, <a href="/users/Rosey16">Rosey16</a>, <a href="/users/wolfshaman84">wolfshaman84</a>, <a href="/users/atolla">atolla</a>, <a href="/users/Imaon">Imaon</a>, <a href="/users/TwistedDisaster">TwistedDisaster</a>, <a href="/users/Dyute">Dyute</a>, <a href="/users/CuzImninjathatway">CuzImninjathatway</a>, <a href="/users/quietgalaxies">quietgalaxies</a>, <a href="/users/MerelOye">MerelOye</a>, <a href="/users/covirn">covirn</a>, <a href="/users/Oixys">Oixys</a>, <a href="/users/DarkinRed">DarkinRed</a>, <a href="/users/Sparkle9510">Sparkle9510</a>, <a href="/users/AlwaysSometimesKobold">AlwaysSometimesKobold</a>, <a href="/users/ChickenBrittle">ChickenBrittle</a>, <a href="/users/rrr98">rrr98</a>, <a href="/users/IlluminatingSceadugenga">IlluminatingSceadugenga</a>, <a href="/users/milquetoastttttt">milquetoastttttt</a>, <a href="/users/chillychill">chillychill</a>, <a href="/users/Mizukiyoru_Shiroko">Mizukiyoru_Shiroko</a>, <a href="/users/RainAmbrosius">RainAmbrosius</a>, <a href="/users/vickibla">vickibla</a>, <a href="/users/SickApothecary">SickApothecary</a>, <a href="/users/nkole12">nkole12</a>, <a href="/users/derevosky">derevosky</a>, <a href="/users/wickednotevil">wickednotevil</a>, <a href="/users/Grey_sky_BG90">Grey_sky_BG90</a>, <a href="/users/liuenhui">liuenhui</a>, <a href="/users/Ploiarium">Ploiarium</a>, <a href="/users/Vinny_Gunfetti">Vinny_Gunfetti</a>, <a href="/users/Paristandard">Paristandard</a>, <a href="/users/FancyTragedyCat">FancyTragedyCat</a>, <a href="/users/forrealthough">forrealthough</a>, <a href="/users/Irina2010med">Irina2010med</a>, <a href="/users/AnjuSchiffer">AnjuSchiffer</a>, <a href="/users/AceEntrope_y">AceEntrope_y</a>, <a href="/users/TheMagicPlok">TheMagicPlok</a>, <a href="/users/condulences">condulences</a>, <a href="/users/RuneShadow24">RuneShadow24</a>, <a href="/users/ryouseiteki">ryouseiteki</a>, <a href="/users/sententiae_bonae">sententiae_bonae</a>, <a href="/users/art_Dragon">art_Dragon</a>, <a href="/users/AFellowOtaku">AFellowOtaku</a>, <a href="/users/coobieduwang">coobieduwang</a>, <a href="/users/Kennedy1226">Kennedy1226</a>, <a href="/users/Hiruma">Hiruma</a>, <a href="/users/ArkofTime">ArkofTime</a>, <a href="/users/TimeLordLucario">TimeLordLucario</a>, <a href="/users/CAELandTAiyo">CAELandTAiyo</a>, <a href="/users/niln">niln</a>, <a href="/users/JaniceJade">JaniceJade</a>, <a href="/users/winter_368">winter_368</a>, <a href="/users/princessoro">princessoro</a>, <a href="/users/melono246">melono246</a>, <a href="/users/Assasin8">Assasin8</a>, <a href="/users/Sparky_crazymofo">Sparky_crazymofo</a>, <a href="/users/DarthPeezy">DarthPeezy</a>, <a href="/users/burningsaiyan">burningsaiyan</a>, <a href="/users/Torn_Pride_Flag">Torn_Pride_Flag</a>, <a href="/users/NightFireFury">NightFireFury</a>, <a href="/users/Just_Tired">Just_Tired</a>, <a href="/users/Monochrome13">Monochrome13</a>, <a href="/users/ThatOnePlatypus">ThatOnePlatypus</a>, <a href="/users/Dante_Morgan">Dante_Morgan</a>, <a href="/users/ReadingIsGreaterThanWriting">ReadingIsGreaterThanWriting</a>, <a href="/users/senna_robbins">senna_robbins</a>, <a href="/users/Snowleaper">Snowleaper</a>, <a href="/users/Coelum">Coelum</a>, <a href="/users/Kamu">Kamu</a>, <a href="/users/Sneaky_Commenter">Sneaky_Commenter</a>, <a href="/users/localcryptidkid">localcryptidkid</a>, <a href="/users/ableedingheart">ableedingheart</a>, <a href="/users/Lexus_night">Lexus_night</a>, <a href="/users/Night_Pixie">Night_Pixie</a>, <a href="/users/tinygrunt">tinygrunt</a>, <a href="/users/my_haikyuu_academia">my_haikyuu_academia</a>, <a href="/users/maplebee">maplebee</a>, <a href="/users/IvorySoda">IvorySoda</a>, <a href="/users/Amadeus_Erebus_Aurelianus">Amadeus_Erebus_Aurelianus</a>, <a href="/users/HikaruWinter">HikaruWinter</a>, <a href="/users/ErinLovesPotatoes">ErinLovesPotatoes</a>, <a href="/users/catsplosionxd">catsplosionxd</a>, <a href="/users/EsotericChaos">EsotericChaos</a>, <a href="/users/Huntershyren">Huntershyren</a>, <a href="/users/ShamrockTales">ShamrockTales</a>, <a href="/users/charlietheepic7">charlietheepic7</a>, <a href="/users/PlsLetMeSleeb">PlsLetMeSleeb</a>, <a href="/users/triangulumkel">triangulumkel</a>, <a href="/users/ValenNightstorm">ValenNightstorm</a>, <a href="/users/Jukki21">Jukki21</a>, <a href="/users/Dethia9">Dethia9</a>, <a href="/users/BrilliantCrow">BrilliantCrow</a>, <a href="/users/marouli">marouli</a>, <a href="/users/AceofCoins">AceofCoins</a>, <a href="/users/Phantom_of_Shipper">Phantom_of_Shipper</a>, <a href="/users/draconicPenartastic">draconicPenartastic</a>, <a href="/users/CloudDreamer">CloudDreamer</a>, <a href="/users/quietest">quietest</a>, <a href="/users/WeAreTheLegionOfTheBeast">WeAreTheLegionOfTheBeast</a>, <a href="/users/GhostlyDragon">GhostlyDragon</a>, <a href="/users/talesasoldasbelle">talesasoldasbelle</a>, <a href="/users/blueglassesgirl">blueglassesgirl</a>, <a href="/users/Howling_Sage">Howling_Sage</a>, <a href="/users/TheRechercheRambler">TheRechercheRambler</a>, <a href="/users/Guardian_Rex">Guardian_Rex</a>, <a href="/users/NickNackNyx">NickNackNyx</a>, <a href="/users/lazycros">lazycros</a>, <a href="/users/iamanawesometaco">iamanawesometaco</a>, <a href="/users/pnpclear">pnpclear</a>, <a href="/users/1sakichan2">1sakichan2</a>, <a href="/users/insertcleverjokehere">insertcleverjokehere</a>, <a href="/users/Salirael">Salirael</a>, <a href="/users/sailor_andromeda">sailor_andromeda</a>, <a href="/users/Eadmas">Eadmas</a>, <a href="/users/x0WhisperingWinds0x">x0WhisperingWinds0x</a>, <a href="/users/CanaaniteCabalist">CanaaniteCabalist</a>, <a href="/users/LilyMoon">LilyMoon</a>, <a href="/users/RubelliteGame">RubelliteGame</a>, <a href="/users/SannaSainity">SannaSainity</a>, <a href="/users/Yuechum">Yuechum</a>, <a href="/users/Dreamichigo">Dreamichigo</a>, <a href="/users/fightme">fightme</a>, <a href="/users/thatadhdkid">thatadhdkid</a>, <a href="/users/Nightmarenip">Nightmarenip</a>, <a href="/users/artisticallySuffering">artisticallySuffering</a>, <a href="/users/Evonnys">Evonnys</a>, <a href="/users/wulfy">wulfy</a>, <a href="/users/kittenwithclaws">kittenwithclaws</a>, <a href="/users/sofia30051">sofia30051</a>, <a href="/users/QueenofOblivion">QueenofOblivion</a>, <a href="/users/Plimsoll">Plimsoll</a>, <a href="/users/ehahsou">ehahsou</a>, <a href="/users/chai_kun">chai_kun</a>, <a href="/users/Kopper">Kopper</a>, <a href="/users/ManukaHoneyTea">ManukaHoneyTea</a>, <a href="/users/LadyTardis">LadyTardis</a>, <a href="/users/saintvmon">saintvmon</a>, <a href="/users/kota_bear">kota_bear</a>, <a href="/users/Curiositywillbemydownfall">Curiositywillbemydownfall</a>, <a href="/users/Sweettoothforpie">Sweettoothforpie</a>, <a href="/users/Sleeping_Sheep">Sleeping_Sheep</a>, <a href="/users/schwertlilie">schwertlilie</a>, <a href="/users/Ms_Guillotine">Ms_Guillotine</a>, <a href="/users/OnlyMilesToGo">OnlyMilesToGo</a>, <a href="/users/L_Bane">L_Bane</a>, <a href="/users/fisukisuki">fisukisuki</a>, <a href="/users/Verassi">Verassi</a>, <a href="/users/lunarrainbows">lunarrainbows</a>, <a href="/users/tatsuzukki">tatsuzukki</a>, <a href="/users/SimplyFox">SimplyFox</a>, <a href="/users/I_am_not_error">I_am_not_error</a>, <a href="/users/Shallowsmix">Shallowsmix</a>, <a href="/users/Akemi831Sato">Akemi831Sato</a>, <a href="/users/Dys">Dys</a>, <a href="/users/FindingZ">FindingZ</a>, <a href="/users/EanSovukau">EanSovukau</a>, <a href="/users/Alienea">Alienea</a>, <a href="/users/qwaszxedc9">qwaszxedc9</a>, <a href="/users/Beetpiece">Beetpiece</a>, <a href="/users/Tibki">Tibki</a>, <a href="/users/Tsu_Doh_Nimh">Tsu_Doh_Nimh</a>, <a href="/users/Fluffy_dragon_prince">Fluffy_dragon_prince</a>, <a href="/users/Flippy750">Flippy750</a>, <a href="/users/foxandfriends">foxandfriends</a>, <a href="/users/DuugaDuuga">DuugaDuuga</a>, <a href="/users/Healer99">Healer99</a>, <a href="/users/Messier_47">Messier_47</a>, <a href="/users/paprikaParade">paprikaParade</a>, <a href="/users/TheUselessReader">TheUselessReader</a>, <a href="/users/MisterScamandros">MisterScamandros</a>, <a href="/users/seawispy">seawispy</a>, <a href="/users/DarkElectron">DarkElectron</a>, <a href="/users/Linya333">Linya333</a>, <a href="/users/speakdontweep">speakdontweep</a>, <a href="/users/ThatOneInTheCornerWithTheBook">ThatOneInTheCornerWithTheBook</a>, <a href="/users/Chyme">Chyme</a>, <a href="/users/complexities">complexities</a>, <a href="/users/Caelismylife">Caelismylife</a>, <a href="/users/r3nlock">r3nlock</a>, <a href="/users/Sariau">Sariau</a>, <a href="/users/NobleAzure">NobleAzure</a>, <a href="/users/Bibliophage413">Bibliophage413</a>, <a href="/users/Shimura_Ootani">Shimura_Ootani</a>, <a href="/users/BoPeepWithNoSheep">BoPeepWithNoSheep</a>, <a href="/users/Infinitechange">Infinitechange</a>, <a href="/users/Comicsandslushies">Comicsandslushies</a>, <a href="/users/Hatchett">Hatchett</a>, <a href="/users/storiewriter">storiewriter</a>, <a href="/users/Byeouri">Byeouri</a>, <a href="/users/eepmeep">eepmeep</a>, <a href="/users/Miss_lollipop">Miss_lollipop</a>, <a href="/users/littlelock">littlelock</a>, <a href="/users/zourail">zourail</a>, <a href="/users/TriTaledKitsune">TriTaledKitsune</a>, <a href="/users/thecozydragon">thecozydragon</a>, <a href="/users/Koneko_san">Koneko_san</a>, <a href="/users/Eorendel">Eorendel</a>, <a href="/users/Atsuisora">Atsuisora</a>, <a href="/users/Racke">Racke</a>, <a href="/users/opaillya">opaillya</a>, <a href="/users/Sonder001">Sonder001</a>, <a href="/users/zeixx">zeixx</a>, <a href="/users/The_Na_In_Mina">The_Na_In_Mina</a>, <a href="/users/KillerBee">KillerBee</a>, <a href="/users/bulgecursed">bulgecursed</a>, <a href="/users/Kyu_Momo">Kyu_Momo</a>, <a href="/users/marcysama">marcysama</a>, <a href="/users/TerribleWriter">TerribleWriter</a>, <a href="/users/MochiMochiDohyon">MochiMochiDohyon</a>, <a href="/users/wilowisp">wilowisp</a>, <a href="/users/CeleryWilliams">CeleryWilliams</a>, <a href="/users/Rafflehaffle">Rafflehaffle</a>, <a href="/users/nightowlz">nightowlz</a>, <a href="/users/Greiver_Dhark">Greiver_Dhark</a>, <a href="/users/DorkLord">DorkLord</a>, <a href="/users/Malky">Malky</a>, <a href="/users/Daitoshi">Daitoshi</a>, <a href="/users/sleepingugly">sleepingugly</a>, <a href="/users/Isob3l">Isob3l</a>, <a href="/users/neuroticalien">neuroticalien</a>, <a href="/users/Ihniwid">Ihniwid</a>, <a href="/users/KrakenAntlers">KrakenAntlers</a>, <a href="/users/minorcharacter">minorcharacter</a>, <a href="/users/RLNN">RLNN</a>, <a href="/users/Astral_Firefrost">Astral_Firefrost</a>, <a href="/users/sh_04e">sh_04e</a>, <a href="/users/Maddy_Grace">Maddy_Grace</a>, <a href="/users/TheLordoftheDisc">TheLordoftheDisc</a>, <a href="/users/Phantom_of_Fenrir">Phantom_of_Fenrir</a>, <a href="/users/Mikadosenju">Mikadosenju</a>, <a href="/users/Brightness_Random">Brightness_Random</a>, <a href="/users/Ring_Apple">Ring_Apple</a>, <a href="/users/Yuilhan">Yuilhan</a>, <a href="/users/luciferTM">luciferTM</a>, <a href="/users/CloudE">CloudE</a>, <a href="/users/lucyfer35">lucyfer35</a>, <a href="/users/RakkiAnkh">RakkiAnkh</a>, <a href="/users/Guratta">Guratta</a>, <a href="/users/Pointedflower">Pointedflower</a>, <a href="/users/StuffHappens">StuffHappens</a>, <a href="/users/Nealex">Nealex</a>, <a href="/users/Skull1412">Skull1412</a>, <a href="/users/Ziatrix">Ziatrix</a>, <a href="/users/whyica">whyica</a>, <a href="/users/Cheshire_flower">Cheshire_flower</a>, <a href="/users/ScissorLord">ScissorLord</a>, <a href="/users/Alexisminas">Alexisminas</a>, <a href="/users/curtainsonfire">curtainsonfire</a>, <a href="/users/demonturtle">demonturtle</a>, <a href="/users/hookedonthesky">hookedonthesky</a>, <a href="/users/Lotus1">Lotus1</a>, <a href="/users/snow_and_cats">snow_and_cats</a>, <a href="/users/enamis">enamis</a>, <a href="/users/eRHa">eRHa</a>, <a href="/users/ElectraX12">ElectraX12</a>, <a href="/users/flickers_to_flames">flickers_to_flames</a>, <a href="/users/KattNapper">KattNapper</a>, <a href="/users/Kikaenao">Kikaenao</a>, <a href="/users/Ixempt">Ixempt</a>, <a href="/users/Hatsumei917">Hatsumei917</a>, <a href="/users/Pastelred">Pastelred</a>, <a href="/users/SpiritQuill">SpiritQuill</a>, <a href="/users/samvilric">samvilric</a>, <a href="/users/Lyra21">Lyra21</a>, <a href="/users/KoreanGal55555">KoreanGal55555</a>, <a href="/users/Krai_27">Krai_27</a>, <a href="/users/epiphanein">epiphanein</a>, <a href="/users/Meridian_Prime">Meridian_Prime</a>, <a href="/users/leewrites">leewrites</a>, <a href="/users/castawayastronaut">castawayastronaut</a>, <a href="/users/knowAll">knowAll</a>, <a href="/users/BurningShroud">BurningShroud</a>, <a href="/users/Sekishi">Sekishi</a>, <a href="/users/Fairly_Uncertain">Fairly_Uncertain</a>, <a href="/users/ingredeints">ingredeints</a>, <a href="/users/audire">audire</a>, <a href="/users/Uemangero">Uemangero</a>, <a href="/users/CassBerry">CassBerry</a>, <a href="/users/deviant_alpaca">deviant_alpaca</a>, <a href="/users/sherrysweet">sherrysweet</a>, <a href="/users/Shukkets">Shukkets</a>, <a href="/users/ckirkes2427">ckirkes2427</a>, <a href="/users/Jasminedreamsong">Jasminedreamsong</a>, <a href="/users/Jenaminya">Jenaminya</a>, <a href="/users/Elianlovescats">Elianlovescats</a>, <a href="/users/Mizudoriko">Mizudoriko</a>, <a href="/users/Booklover9477">Booklover9477</a>, <a href="/users/Guise_n_Disguise">Guise_n_Disguise</a>, <a href="/users/Eeveebattler4">Eeveebattler4</a>, <a href="/users/KashimSck">KashimSck</a>, <a href="/users/Greenapril">Greenapril</a>, <a href="/users/KingODunces">KingODunces</a>, <a href="/users/hanamaru025">hanamaru025</a>, <a href="/users/RebelPrincess">RebelPrincess</a>, <a href="/users/HannyBoo">HannyBoo</a>, <a href="/users/lariyats">lariyats</a>, <a href="/users/Jueru">Jueru</a>, <a href="/users/EggEmperor">EggEmperor</a>, <a href="/users/zombiebatgirl">zombiebatgirl</a>, <a href="/users/significantfoliage">significantfoliage</a>, <a href="/users/rowan1025">rowan1025</a>, <a href="/users/IronLucario2012">IronLucario2012</a>, <a href="/users/Evierl_Frost">Evierl_Frost</a>, <a href="/users/Neceros">Neceros</a>, <a href="/users/ashtreeowl">ashtreeowl</a>, <a href="/users/Emily_Elizabeth_Fowl">Emily_Elizabeth_Fowl</a>, <a href="/users/gins4n">gins4n</a>, <a href="/users/Phani">Phani</a>, <a href="/users/Myrddin767">Myrddin767</a>, <a href="/users/Haamulikka">Haamulikka</a>, <a href="/users/WickedBee">WickedBee</a>, <a href="/users/KitsuFae">KitsuFae</a>, <a href="/users/UnicorniaPunk">UnicorniaPunk</a>, <a href="/users/SuperIceLight">SuperIceLight</a>, <a href="/users/sechar">sechar</a>, <a href="/users/unexpected_side_effects">unexpected_side_effects</a>, <a href="/users/SainthRoux">SainthRoux</a>, <a href="/users/Mjah">Mjah</a>, <a href="/users/3AM_Sky">3AM_Sky</a>, <a href="/users/ManicMahou">ManicMahou</a>, <a href="/users/Raven1113">Raven1113</a>, <a href="/users/Zaya">Zaya</a>, <a href="/users/andromedia">andromedia</a>, <a href="/users/Some_Reader">Some_Reader</a>, <a href="/users/Metaphorical_Tables">Metaphorical_Tables</a>, <a href="/users/tenkei">tenkei</a>, <a href="/users/samoulto">samoulto</a>, <a href="/users/Mister_Ukki">Mister_Ukki</a>, <a href="/users/northpeach">northpeach</a>, <a href="/users/Cacti_Lord">Cacti_Lord</a>, <a href="/users/Ageisia">Ageisia</a>, <a href="/users/Scarper_Von_Hyde">Scarper_Von_Hyde</a>, <a href="/users/Waslala">Waslala</a>, <a href="/users/azinine">azinine</a>, <a href="/users/anodyneAvian">anodyneAvian</a>, <a href="/users/bat_teeth">bat_teeth</a>, <a href="/users/Merkitten">Merkitten</a>, <a href="/users/AnnabethLawliet">AnnabethLawliet</a>, <a href="/users/Blank09">Blank09</a>, <a href="/users/mildrice">mildrice</a>, <a href="/users/GrimSong19">GrimSong19</a>, <a href="/users/sherhi666">sherhi666</a>, <a href="/users/furiousbeluga">furiousbeluga</a>, <a href="/users/NonchalantxFish">NonchalantxFish</a>, <a href="/users/Modigar">Modigar</a>, <a href="/users/9exec">9exec</a>, <a href="/users/Lady_Ethelle">Lady_Ethelle</a>, <a href="/users/PsychologicalColors">PsychologicalColors</a>, <a href="/users/Gentrychild">Gentrychild</a>, <a href="/users/Isamaru">Isamaru</a>, <a href="/users/TheMoonOracle">TheMoonOracle</a>, <a href="/users/cloudynightstars">cloudynightstars</a>, <a href="/users/Sooshwoosh">Sooshwoosh</a>, <a href="/users/sebasent">sebasent</a>, <a href="/users/bearfighter">bearfighter</a>, <a href="/users/Kero13">Kero13</a>, <a href="/users/InfectedByTheInternet">InfectedByTheInternet</a>, <a href="/users/StrangeLady1331">StrangeLady1331</a>, <a href="/users/khattikeri">khattikeri</a>, <a href="/users/RiippleEffect">RiippleEffect</a>, <a href="/users/Cannot_think_of_a_cool_username">Cannot_think_of_a_cool_username</a>, <a href="/users/Nattyrose">Nattyrose</a>, <a href="/users/nightange1">nightange1</a>, <a href="/users/thefierydagger">thefierydagger</a>, <a href="/users/SlothOnCaffine">SlothOnCaffine</a>, <a href="/users/MeepDaLoop">MeepDaLoop</a>, <a href="/users/Georgia1727">Georgia1727</a>, <a href="/users/Serpensortia_parapluie">Serpensortia_parapluie</a>, <a href="/users/Axe_S">Axe_S</a>, <a href="/users/Graay">Graay</a>, <a href="/users/IndigoMay">IndigoMay</a>, <a href="/users/JNDC2090">JNDC2090</a>, <a href="/users/TheAmused">TheAmused</a>, <a href="/users/DragonWolfAZ">DragonWolfAZ</a>, <a href="/users/liketolaugh">liketolaugh</a>, <a href="/users/ewfte">ewfte</a>, <a href="/users/bimbambapboo">bimbambapboo</a>, <a href="/users/jacqui_may">jacqui_may</a>, <a href="/users/A_ToastToTheOutcasts">A_ToastToTheOutcasts</a>, <a href="/users/Shade_OKiller">Shade_OKiller</a>, <a href="/users/LittleLoaf">LittleLoaf</a>, <a href="/users/OrionRedde">OrionRedde</a>, <a href="/users/Anderein">Anderein</a>, <a href="/users/A_Conspiracy_of_Ravens">A_Conspiracy_of_Ravens</a>, <a href="/users/Shiba_Deku">Shiba_Deku</a>, <a href="/users/OnlyHitsuzen">OnlyHitsuzen</a>, <a href="/users/TheMagneticWitch">TheMagneticWitch</a>, <a href="/users/Greddb">Greddb</a>, <a href="/users/insomnnni">insomnnni</a>, <a href="/users/soy_un_sombrero">soy_un_sombrero</a>, <a href="/users/Jaxmyne">Jaxmyne</a>, <a href="/users/chococrumple">chococrumple</a>, <a href="/users/Madman044">Madman044</a>, <a href="/users/isadorator">isadorator</a>, <a href="/users/onlytorgato">onlytorgato</a>, <a href="/users/Da_Kaleidoscope">Da_Kaleidoscope</a>, <a href="/users/Delicious_Vice">Delicious_Vice</a>, <a href="/users/Wisteric">Wisteric</a>, <a href="/users/parchas">parchas</a>, <a href="/users/monster_bookworm">monster_bookworm</a>, <a href="/users/iluvscrewballandwoodstock">iluvscrewballandwoodstock</a>, <a href="/users/JoyWoods">JoyWoods</a>, <a href="/users/justyouwaitforit">justyouwaitforit</a>, <a href="/users/byrchgryffin">byrchgryffin</a>, <a href="/users/RiverGod">RiverGod</a>, <a href="/users/ThePackWantstheD">ThePackWantstheD</a>, <a href="/users/birdking">birdking</a>, <a href="/users/Neayss">Neayss</a>, <a href="/users/GravityIsALie">GravityIsALie</a>, <a href="/users/Kintaurus">Kintaurus</a>, <a href="/users/Snekpoetry">Snekpoetry</a>, <a href="/users/inucase">inucase</a>, <a href="/users/FauxPause">FauxPause</a>, <a href="/users/Sunrise_Flame">Sunrise_Flame</a>, <a href="/users/draconicshinx">draconicshinx</a>, <a href="/users/Readera">Readera</a>, <a href="/users/Hugggg">Hugggg</a>, <a href="/users/alech">alech</a>, <a href="/users/cryptidflavored">cryptidflavored</a>, <a href="/users/koutarogue">koutarogue</a>, <a href="/users/Kaileen">Kaileen</a>, <a href="/users/alllula">alllula</a>, <a href="/users/Cassidae">Cassidae</a>, <a href="/users/Luizalds">Luizalds</a>, <a href="/users/Xxkyoumi_chanxx">Xxkyoumi_chanxx</a>, <a href="/users/Kurokono_Tasuke">Kurokono_Tasuke</a>, <a href="/users/alamerysl">alamerysl</a>, <a href="/users/Anchi">Anchi</a>, <a href="/users/LilyWhite22">LilyWhite22</a>, <a href="/users/Nonbinary_pal">Nonbinary_pal</a>, <a href="/users/eeveelutionlover2000">eeveelutionlover2000</a>, <a href="/users/victuri">victuri</a>, <a href="/users/Ryuze">Ryuze</a>, <a href="/users/Lady_Mystra">Lady_Mystra</a>, <a href="/users/aneszto">aneszto</a>, <a href="/users/69Shirayuki96">69Shirayuki96</a>, <a href="/users/MuteTentailes">MuteTentailes</a>, <a href="/users/Merel">Merel</a>, <a href="/users/Gerbleshner">Gerbleshner</a>, <a href="/users/OriksGaming">OriksGaming</a>, <a href="/users/LostCure">LostCure</a>, <a href="/users/Ziel">Ziel</a>, <a href="/users/DropsOfSun">DropsOfSun</a>, <a href="/users/etherealtulip">etherealtulip</a>, <a href="/users/CalicoKitty402">CalicoKitty402</a>, <a href="/users/hispnaicin">hispnaicin</a>, <a href="/users/TabethaRasa">TabethaRasa</a>, <a href="/users/wstphl">wstphl</a>, <a href="/users/JudyBluff">JudyBluff</a>, <a href="/users/Astelinda">Astelinda</a>, <a href="/users/theThirteenthChild">theThirteenthChild</a>, <a href="/users/sunoa">sunoa</a>, <a href="/users/vereloj">vereloj</a>, <a href="/users/Nanook">Nanook</a>, <a href="/users/Tobalerone">Tobalerone</a>, <a href="/users/nothingseriously">nothingseriously</a>, <a href="/users/m00se">m00se</a>, <a href="/users/Aeondragon">Aeondragon</a>, <a href="/users/Quint_Polaris">Quint_Polaris</a>, <a href="/users/warpinator">warpinator</a>, <a href="/users/china_roses">china_roses</a>, <a href="/users/sablin27">sablin27</a>, <a href="/users/TanTales">TanTales</a>, <a href="/users/xibalbaolmec">xibalbaolmec</a>, <a href="/users/brawltogethernow">brawltogethernow</a>, <a href="/users/lesbianmina">lesbianmina</a>, <a href="/users/spontaneite">spontaneite</a>, <a href="/users/whodoyoudo">whodoyoudo</a>, <a href="/users/Hyacinthium">Hyacinthium</a>, <a href="/users/Mysterymew">Mysterymew</a>, <a href="/users/crimesandrhymes">crimesandrhymes</a>, <a href="/users/Fififire">Fififire</a>, <a href="/users/breakout1801">breakout1801</a>, <a href="/users/Cloy552">Cloy552</a>, <a href="/users/Mythplaced_Logic">Mythplaced_Logic</a>, <a href="/users/pink_disaster">pink_disaster</a>, <a href="/users/KittyChan">KittyChan</a>, <a href="/users/LunaKarma">LunaKarma</a>, <a href="/users/Aiyamey">Aiyamey</a>, <a href="/users/AoiMikans">AoiMikans</a>, <a href="/users/Luciola">Luciola</a>, <a href="/users/The_Phantom_Eyes">The_Phantom_Eyes</a>, <a href="/users/abrigosAzules">abrigosAzules</a>, <a href="/users/cluelesscreature">cluelesscreature</a>, <a href="/users/Sophiebybophie">Sophiebybophie</a>, <a href="/users/zntkilledme">zntkilledme</a>, <a href="/users/MagiaZenith">MagiaZenith</a>, <a href="/users/bbuttersworth">bbuttersworth</a>, <a href="/users/Avria">Avria</a>, <a href="/users/Jazlyn191">Jazlyn191</a>, <a href="/users/KnightAsphodel">KnightAsphodel</a>, <a href="/users/HockityPockity">HockityPockity</a>, <a href="/users/Lllllll687">Lllllll687</a>, <a href="/users/bombayneko">bombayneko</a>, <a href="/users/zoey_96">zoey_96</a>, <a href="/users/Guldberg">Guldberg</a>, <a href="/users/Die_Erlkonigin6083">Die_Erlkonigin6083</a>, <a href="/users/zion_a">zion_a</a>, <a href="/users/nhwaun1">nhwaun1</a>, <a href="/users/3ofClubs">3ofClubs</a>, <a href="/users/Uncharted_Constellations">Uncharted_Constellations</a>, <a href="/users/SilfarionOrchestra">SilfarionOrchestra</a>, <a href="/users/Cd1470">Cd1470</a>, <a href="/users/Xas">Xas</a>, <a href="/users/Candy284">Candy284</a>, <a href="/users/url02cabbadge">url02cabbadge</a>, <a href="/users/LuckyDreamer">LuckyDreamer</a>, <a href="/users/tinypurplegiraffe">tinypurplegiraffe</a>, <a href="/users/tsukihime1467">tsukihime1467</a>, <a href="/users/miraclegem">miraclegem</a>, <a href="/users/SweetScentences">SweetScentences</a>, <a href="/users/novelDaydreamer">novelDaydreamer</a>, <a href="/users/NomomoCutieXD">NomomoCutieXD</a>, <a href="/users/darkgrirmora97">darkgrirmora97</a>, <a href="/users/LazyPotatoo">LazyPotatoo</a>, <a href="/users/cecilquangdong">cecilquangdong</a>, <a href="/users/Pinlie">Pinlie</a>, <a href="/users/AdditionalStickers">AdditionalStickers</a>, <a href="/users/Estrella85">Estrella85</a>, <a href="/users/theisleisfullofnoises">theisleisfullofnoises</a>, <a href="/users/FerreFolkLurking">FerreFolkLurking</a>, <a href="/users/jadehml">jadehml</a>, <a href="/users/SunnyDFlower">SunnyDFlower</a>, <a href="/users/falterth">falterth</a>, <a href="/users/TheSecretUchiha">TheSecretUchiha</a>, <a href="/users/anony_mouse">anony_mouse</a>, <a href="/users/cynnix">cynnix</a>, <a href="/users/geneticus">geneticus</a>, <a href="/users/Alara16">Alara16</a>, <a href="/users/AvariceTel">AvariceTel</a>, <a href="/users/aseies">aseies</a>, <a href="/users/Wingwyrm">Wingwyrm</a>, <a href="/users/Unknownlight">Unknownlight</a>, <a href="/users/pikachurinn">pikachurinn</a>, <a href="/users/DeathFollowsMe">DeathFollowsMe</a>, <a href="/users/thegrinningcrow">thegrinningcrow</a>, <a href="/users/rrllao">rrllao</a>, <a href="/users/Kant">Kant</a>, <a href="/users/DilwynAwel">DilwynAwel</a>, <a href="/users/MythicalMind">MythicalMind</a>, <a href="/users/keikia">keikia</a>, <a href="/users/Quetoa">Quetoa</a>, <a href="/users/cupofkahvii">cupofkahvii</a>, <a href="/users/X59">X59</a>, <a href="/users/Orange_Clown">Orange_Clown</a>, <a href="/users/DistantConstellations">DistantConstellations</a>, <a href="/users/Reapergenesis32">Reapergenesis32</a>, <a href="/users/Luxurious_Hellgirl">Luxurious_Hellgirl</a>, <a href="/users/SurreptitiousLife">SurreptitiousLife</a>, <a href="/users/anandroidinatutu">anandroidinatutu</a>, <a href="/users/inherit">inherit</a>, <a href="/users/jimjams_fiddles">jimjams_fiddles</a>, <a href="/users/kpop_Itsgreat963">kpop_Itsgreat963</a>, <a href="/users/Hikaru211017">Hikaru211017</a>, <a href="/users/Deadbloodshiki62">Deadbloodshiki62</a>, <a href="/users/SerenityJay">SerenityJay</a>, <a href="/users/snickerdoodlles">snickerdoodlles</a>, <a href="/users/NobodyInWonderland">NobodyInWonderland</a>, <a href="/users/ChiwiTheKiwi">ChiwiTheKiwi</a>, <a href="/users/greenandsour">greenandsour</a>, <a href="/users/Nopedog">Nopedog</a>, <a href="/users/HahpEnds">HahpEnds</a>, <a href="/users/TheLoneWolf007">TheLoneWolf007</a>, <a href="/users/KidScrappy">KidScrappy</a>, <a href="/users/UselessQueer">UselessQueer</a>, <a href="/users/NowWithExtraSalt">NowWithExtraSalt</a>, <a href="/users/Yuu1412">Yuu1412</a>, <a href="/users/FranchezkaAntoinette">FranchezkaAntoinette</a>, <a href="/users/TheAnonFaerie">TheAnonFaerie</a>, <a href="/users/miraluna23">miraluna23</a>, <a href="/users/TheEmbodimentOfAwkwardness">TheEmbodimentOfAwkwardness</a>, <a href="/users/Im_a_ghost_i_guess">Im_a_ghost_i_guess</a>, <a href="/users/Tanya12">Tanya12</a>, <a href="/users/SunShark">SunShark</a>, <a href="/users/Jinx_Luck">Jinx_Luck</a>, <a href="/users/Evadark1">Evadark1</a>, <a href="/users/truecolorflame">truecolorflame</a>, <a href="/users/No_Naam">No_Naam</a>, <a href="/users/Selias">Selias</a>, <a href="/users/lillithschild">lillithschild</a>, <a href="/users/heiyue">heiyue</a>, <a href="/users/Zusanheim">Zusanheim</a>, <a href="/users/KisaragiMarru">KisaragiMarru</a>, <a href="/users/Waffleleaf">Waffleleaf</a>, <a href="/users/loorking">loorking</a>, <a href="/users/rosysea">rosysea</a>, <a href="/users/spossie9">spossie9</a>, <a href="/users/myfineasymptote">myfineasymptote</a>, <a href="/users/CircleCautious">CircleCautious</a>, <a href="/users/EquinePianist">EquinePianist</a>, <a href="/users/Loria_in_eternity">Loria_in_eternity</a>, <a href="/users/Dezara">Dezara</a>, <a href="/users/FanabstractedZing">FanabstractedZing</a>, <a href="/users/kaear">kaear</a>, <a href="/users/InverseAntagonism">InverseAntagonism</a>, <a href="/users/TheCrystalEevee">TheCrystalEevee</a>, <a href="/users/theinconceivabletruth">theinconceivabletruth</a>, <a href="/users/Kouen_chan">Kouen_chan</a>, <a href="/users/TheFaeDemon">TheFaeDemon</a>, <a href="/users/jelliedbeans">jelliedbeans</a>, <a href="/users/AxZi">AxZi</a>, <a href="/users/LightningPriestess">LightningPriestess</a>, <a href="/users/Jory0994">Jory0994</a>, <a href="/users/MarsBars626">MarsBars626</a>, <a href="/users/Kasplode">Kasplode</a>, <a href="/users/DisorganizedAuthor">DisorganizedAuthor</a>, <a href="/users/Kristtorn_drage">Kristtorn_drage</a>, <a href="/users/geneticMuralist">geneticMuralist</a>, <a href="/users/blueskies36">blueskies36</a>, <a href="/users/Angelmonster">Angelmonster</a>, <a href="/users/athylia">athylia</a>, <a href="/users/Cassia_alata">Cassia_alata</a>, <a href="/users/StarTrail">StarTrail</a>, <a href="/users/CodePurple">CodePurple</a>, <a href="/users/decipheringchaos">decipheringchaos</a>, <a href="/users/CharlotteDaBookworm">CharlotteDaBookworm</a>, <a href="/users/wrenchwench">wrenchwench</a>, <a href="/users/myvividreams">myvividreams</a>, <a href="/users/Scuutie">Scuutie</a>, <a href="/users/koolandkatty">koolandkatty</a>, <a href="/users/Yukionna13">Yukionna13</a>, <a href="/users/RamblingIntoTheDistance">RamblingIntoTheDistance</a>, <a href="/users/mischif">mischif</a>, <a href="/users/Rubles">Rubles</a>, <a href="/users/Hypaterin">Hypaterin</a>, <a href="/users/jamester56">jamester56</a>, <a href="/users/arinrowan">arinrowan</a>, <a href="/users/Aowly">Aowly</a>, <a href="/users/ThegreatH">ThegreatH</a>, <a href="/users/RiverScales">RiverScales</a>, <a href="/users/iguessso12">iguessso12</a>, <a href="/users/LMS616">LMS616</a>, <a href="/users/besotted">besotted</a>, <a href="/users/BlackValkyrie">BlackValkyrie</a>, <a href="/users/oxbonkus">oxbonkus</a>, <a href="/users/Sanzaki_Miya">Sanzaki_Miya</a>, <a href="/users/kendallnicola">kendallnicola</a>, <a href="/users/Zibeth">Zibeth</a>, <a href="/users/Ren_Heart">Ren_Heart</a>, <a href="/users/marguarita33">marguarita33</a>, <a href="/users/ebonyIllusion">ebonyIllusion</a>, <a href="/users/ThisCat">ThisCat</a>, <a href="/users/Niwasae">Niwasae</a>, <a href="/users/SSJSaphira">SSJSaphira</a>, <a href="/users/AkairoShikkoku">AkairoShikkoku</a>, <a href="/users/Guppygabby">Guppygabby</a>, <a href="/users/meshik">meshik</a>, <a href="/users/Carol96">Carol96</a>, <a href="/users/lineline15">lineline15</a>, <a href="/users/Angonoka">Angonoka</a>, <a href="/users/Cianidix">Cianidix</a>, <a href="/users/Tzi">Tzi</a>, <a href="/users/LastEmbers">LastEmbers</a>, <a href="/users/xama">xama</a>, <a href="/users/ShadowedAuthor">ShadowedAuthor</a>, <a href="/users/arcanesecrets">arcanesecrets</a>, <a href="/users/Benevemi">Benevemi</a>, <a href="/users/Vibvigvwrayf">Vibvigvwrayf</a>, <a href="/users/hostile_invasion">hostile_invasion</a>, <a href="/users/Fandoom_Heart">Fandoom_Heart</a>, <a href="/users/HannokiKaen">HannokiKaen</a>, <a href="/users/messalin">messalin</a>, <a href="/users/HecateKalivas">HecateKalivas</a>, <a href="/users/oriflamme">oriflamme</a>, <a href="/users/celdak18">celdak18</a>, <a href="/users/mahehe">mahehe</a>, <a href="/users/Sparkzey">Sparkzey</a>, <a href="/users/Moka_961">Moka_961</a>, <a href="/users/Grimdark_Arisen">Grimdark_Arisen</a>, <a href="/users/Saltywithwritersblock">Saltywithwritersblock</a>, <a href="/users/limpeelee">limpeelee</a>, <a href="/users/bbcat">bbcat</a>, <a href="/users/K_mimi135">K_mimi135</a>, <a href="/users/bittersblue">bittersblue</a>, <a href="/users/Solaris_Scantraxx">Solaris_Scantraxx</a>, <a href="/users/Idhren">Idhren</a>, <a href="/users/Chemarta">Chemarta</a>, <a href="/users/BBGR8">BBGR8</a>, <a href="/users/FreshDirt">FreshDirt</a>, <a href="/users/Ghostbutt33">Ghostbutt33</a>, <a href="/users/ChaseTheFreakinStars">ChaseTheFreakinStars</a>, <a href="/users/Pen_Name_Noyb">Pen_Name_Noyb</a>, <a href="/users/BleuFleur">BleuFleur</a>, <a href="/users/CallisaDawn">CallisaDawn</a>, <a href="/users/NewandOld">NewandOld</a>, <a href="/users/TacticianMark">TacticianMark</a>, <a href="/users/Asgardu">Asgardu</a>, <a href="/users/syac">syac</a>, <a href="/users/akelios">akelios</a>, <a href="/users/SealedDynasty">SealedDynasty</a>, <a href="/users/Swiftyue">Swiftyue</a>, <a href="/users/Levifold">Levifold</a>, <a href="/users/TempestKitsune">TempestKitsune</a>, <a href="/users/Dragon_Age_Fan">Dragon_Age_Fan</a>, <a href="/users/geraldAD">geraldAD</a>, <a href="/users/Sakilya">Sakilya</a>, <a href="/users/Irriella">Irriella</a>, <a href="/users/Yumemiru_hito">Yumemiru_hito</a>, <a href="/users/IllMadeKnight">IllMadeKnight</a>, <a href="/users/Jaybird_Wings">Jaybird_Wings</a>, <a href="/users/agentpiglet">agentpiglet</a>, <a href="/users/Flappycat03">Flappycat03</a>, <a href="/users/Kurvector">Kurvector</a>, <a href="/users/MidnightMixer">MidnightMixer</a>, <a href="/users/Advocate4BAMFs">Advocate4BAMFs</a>, <a href="/users/Cool_Rocks">Cool_Rocks</a>, <a href="/users/Amygdaloid07">Amygdaloid07</a>, <a href="/users/StarLost">StarLost</a>, <a href="/users/Ghlim">Ghlim</a>, <a href="/users/Renlu">Renlu</a>, <a href="/users/frodo_stole_my_ring">frodo_stole_my_ring</a>, <a href="/users/2Bmadeofglass">2Bmadeofglass</a>, <a href="/users/hydrandreams">hydrandreams</a>, <a href="/users/IncisiveRiposte">IncisiveRiposte</a>, <a href="/users/DUO_02">DUO_02</a>, <a href="/users/nex_et_nox">nex_et_nox</a>, <a href="/users/RandomGuy">RandomGuy</a>, <a href="/users/shakiya">shakiya</a>, <a href="/users/aika2020">aika2020</a>, <a href="/users/auPHE">auPHE</a>, <a href="/users/Hectopascal">Hectopascal</a>, <a href="/users/NicaMyth">NicaMyth</a>, <a href="/users/knightofdei">knightofdei</a>, <a href="/users/FunMoustache">FunMoustache</a>, <a href="/users/TheReadersGame">TheReadersGame</a>, <a href="/users/thatoneperson">thatoneperson</a>, <a href="/users/aniluv24">aniluv24</a>, <a href="/users/WorldMusic">WorldMusic</a>, <a href="/users/Mellosweet">Mellosweet</a>, <a href="/users/RikoJasmine">RikoJasmine</a>, <a href="/users/Deanlover1">Deanlover1</a>, <a href="/users/Tyranno">Tyranno</a>, <a href="/users/Ordin">Ordin</a>, <a href="/users/AkumaPrincess">AkumaPrincess</a>, <a href="/users/Sammykatza">Sammykatza</a>, <a href="/users/ChibiFelicia">ChibiFelicia</a>, <a href="/users/Brend839">Brend839</a>, <a href="/users/GrayWorld">GrayWorld</a>, <a href="/users/EllieInLove">EllieInLove</a>, <a href="/users/verboseDescription">verboseDescription</a>, <a href="/users/Edgedancer">Edgedancer</a>, <a href="/users/scapolice">scapolice</a>, <a href="/users/AvaTaggart">AvaTaggart</a>, <a href="/users/Sakurabankai">Sakurabankai</a>, <a href="/users/Lazerpie">Lazerpie</a>, <a href="/users/philona">philona</a>, <a href="/users/The_Pied_Piper">The_Pied_Piper</a>, <a href="/users/Jermani">Jermani</a>, <a href="/users/dwellin">dwellin</a>, <a href="/users/Spartaness">Spartaness</a>, <a href="/users/Sai_Cannopy">Sai_Cannopy</a>, <a href="/users/Valerii376">Valerii376</a>, <a href="/users/Blazeka">Blazeka</a>, <a href="/users/arysthaeniru">arysthaeniru</a>, <a href="/users/kat99421">kat99421</a>, <a href="/users/kpossibles">kpossibles</a>, <a href="/users/GavootTheScoot">GavootTheScoot</a>, <a href="/users/Tokoyonokuni">Tokoyonokuni</a>, <a href="/users/Shippo704">Shippo704</a>, <a href="/users/RichW">RichW</a>, <a href="/users/IRTooM">IRTooM</a>, <a href="/users/Aradow">Aradow</a>, <a href="/users/shvoop">shvoop</a>, <a href="/users/Starsilver">Starsilver</a>, <a href="/users/ATRM">ATRM</a>, <a href="/users/AnimeManiac">AnimeManiac</a>, <a href="/users/ria_green">ria_green</a>, <a href="/users/Shaydenthedude">Shaydenthedude</a>, <a href="/users/ajgryffindor">ajgryffindor</a>, <a href="/users/LovelyPrincess4">LovelyPrincess4</a>, <a href="/users/RedHeadsRock1010">RedHeadsRock1010</a>, <a href="/users/Angelcat8">Angelcat8</a>, <a href="/users/Pumpkin_Bunny">Pumpkin_Bunny</a>, <a href="/users/QuietStar">QuietStar</a>, <a href="/users/degreesofinsanity">degreesofinsanity</a>, <a href="/users/mabbofu">mabbofu</a>, <a href="/users/Soulykins">Soulykins</a>, <a href="/users/Geirhildur">Geirhildur</a>, <a href="/users/Cerokun">Cerokun</a>, <a href="/users/IncognitoPhenomenon">IncognitoPhenomenon</a>, <a href="/users/Photon51">Photon51</a>, <a href="/users/Wrath_of_Nature">Wrath_of_Nature</a>, <a href="/users/TorchPhoenix">TorchPhoenix</a>, <a href="/users/Shimanith">Shimanith</a>, <a href="/users/automn">automn</a>, <a href="/users/BonesOfBirdWings">BonesOfBirdWings</a>, <a href="/users/kazzarole">kazzarole</a>, <a href="/users/voldydoitsu">voldydoitsu</a>, <a href="/users/shipping_ruined_my_life">shipping_ruined_my_life</a>, <a href="/users/kitty2o1">kitty2o1</a>, <a href="/users/narikopathfinder">narikopathfinder</a>, <a href="/users/advait2003">advait2003</a>, <a href="/users/tunnelOFdawn">tunnelOFdawn</a>, <a href="/users/fantasprite">fantasprite</a>, <a href="/users/Talyara">Talyara</a>, <a href="/users/inuani">inuani</a>, <a href="/users/Lammstrellicon">Lammstrellicon</a>, <a href="/users/N7_Jam">N7_Jam</a>, <a href="/users/Absolem0">Absolem0</a>, <a href="/users/Myst_Silverhand">Myst_Silverhand</a>, <a href="/users/starlistic">starlistic</a>, <a href="/users/teacuptaako">teacuptaako</a>, <a href="/users/Crystallized_W">Crystallized_W</a>, <a href="/users/Heroman3003">Heroman3003</a>, <a href="/users/BlueWonder">BlueWonder</a>, <a href="/users/Colerate">Colerate</a>, <a href="/users/AbstractCows">AbstractCows</a>, <a href="/users/Victuuri_Road">Victuuri_Road</a>, <a href="/users/Yestering">Yestering</a>, <a href="/users/poisedwalrus">poisedwalrus</a>, <a href="/users/Rayvenfire12">Rayvenfire12</a>, <a href="/users/Kurohana806">Kurohana806</a>, <a href="/users/Telnan">Telnan</a>, <a href="/users/Elfhunter">Elfhunter</a>, <a href="/users/Diablotin">Diablotin</a>, <a href="/users/Anummel">Anummel</a>, <a href="/users/Jatynzel">Jatynzel</a>, <a href="/users/8bluebell8">8bluebell8</a>, <a href="/users/aniaorome">aniaorome</a>, <a href="/users/Foibles_and_Follies">Foibles_and_Follies</a>, <a href="/users/MaoCha">MaoCha</a>, <a href="/users/buru">buru</a>, <a href="/users/StarrLightning">StarrLightning</a>, <a href="/users/spacetimeenigma">spacetimeenigma</a>, <a href="/users/QueenKing">QueenKing</a>, <a href="/users/Annapods">Annapods</a>, <a href="/users/Eahei">Eahei</a>, <a href="/users/ArtisticEntropy">ArtisticEntropy</a>, <a href="/users/sidana27">sidana27</a>, <a href="/users/noes_cape">noes_cape</a>, <a href="/users/cinderous_scrivenings">cinderous_scrivenings</a>, <a href="/users/eolus">eolus</a>, <a href="/users/LuminousDelusions">LuminousDelusions</a>, <a href="/users/Rowlet">Rowlet</a>, <a href="/users/Heaven_is_a_place_on_earth">Heaven_is_a_place_on_earth</a>, <a href="/users/MikamiMoon">MikamiMoon</a>, <a href="/users/sheagar">sheagar</a>, <a href="/users/bbberry12">bbberry12</a>, <a href="/users/redhatter54">redhatter54</a>, <a href="/users/Freezing_Of_a_Heart">Freezing_Of_a_Heart</a>, <a href="/users/cacau1005">cacau1005</a>, <a href="/users/Ioeth">Ioeth</a>, <a href="/users/Purrtato">Purrtato</a>, <a href="/users/zoewinter1">zoewinter1</a>, <a href="/users/Okami_g">Okami_g</a>, <a href="/users/Mocha_and_Marx">Mocha_and_Marx</a>, <a href="/users/beantheredonethat">beantheredonethat</a>, <a href="/users/FeminineBrain">FeminineBrain</a>, <a href="/users/eeveepkmnfan">eeveepkmnfan</a>, <a href="/users/Seele">Seele</a>, <a href="/users/ToomanyOTPsbutI_love_all_of_them">ToomanyOTPsbutI_love_all_of_them</a>, <a href="/users/BlankFeathers">BlankFeathers</a>, <a href="/users/mia826">mia826</a>, <a href="/users/arcticapple">arcticapple</a>, <a href="/users/ITravelByTardis">ITravelByTardis</a>, <a href="/users/Too_Many_Usernames">Too_Many_Usernames</a>, <a href="/users/Happerry">Happerry</a>, <a href="/users/HowlingGuardian">HowlingGuardian</a>, <a href="/users/tearlessNevermore">tearlessNevermore</a>, <a href="/users/Azulish">Azulish</a>, <a href="/users/MlleKlausermans">MlleKlausermans</a>, <a href="/users/DPRenFTW">DPRenFTW</a>, <a href="/users/TiredRazzberry">TiredRazzberry</a>, <a href="/users/Elijah">Elijah</a>, <a href="/users/ultrabies">ultrabies</a>, <a href="/users/milifilou">milifilou</a>, <a href="/users/SeaCatAnna">SeaCatAnna</a>, <a href="/users/SapphireStream">SapphireStream</a>, <a href="/users/jjcc1113">jjcc1113</a>, <a href="/users/princesskel">princesskel</a>, <a href="/users/Maquette">Maquette</a>, <a href="/users/Locklain">Locklain</a>, <a href="/users/Animapower">Animapower</a>, <a href="/users/Saytherin">Saytherin</a>, <a href="/users/Canisse">Canisse</a>, <a href="/users/TSoL_iNSaNITY">TSoL_iNSaNITY</a>, <a href="/users/Janneia">Janneia</a>, <a href="/users/Unorganized_Shelf">Unorganized_Shelf</a>, <a href="/users/Lorical">Lorical</a>, <a href="/users/Levante">Levante</a>, <a href="/users/OHSQUASH">OHSQUASH</a>, <a href="/users/Jelaza">Jelaza</a>, <a href="/users/Anataeus">Anataeus</a>, <a href="/users/ladopa">ladopa</a>, <a href="/users/ChessKnight">ChessKnight</a>, <a href="/users/TediousLibrarian">TediousLibrarian</a>, <a href="/users/nykil">nykil</a>, <a href="/users/LeFang">LeFang</a>, <a href="/users/KnightPaco">KnightPaco</a>, <a href="/users/ChaoteToTheCore">ChaoteToTheCore</a>, <a href="/users/Rorb_Lalorb">Rorb_Lalorb</a>, <a href="/users/victorswreath">victorswreath</a>, <a href="/users/Harroc">Harroc</a>, <a href="/users/Riza_Wolf12">Riza_Wolf12</a>, <a href="/users/IDontEvenFandom">IDontEvenFandom</a>, <a href="/users/tsuwu">tsuwu</a>, <a href="/users/fistman_sunshine">fistman_sunshine</a>, <a href="/users/ArchaicNightfall">ArchaicNightfall</a>, <a href="/users/P_0TAT0_S">P_0TAT0_S</a>, <a href="/users/sa_turns">sa_turns</a>, <a href="/users/zenlove11">zenlove11</a>, <a href="/users/Stale_Goose">Stale_Goose</a>, <a href="/users/werewolvesRvalid">werewolvesRvalid</a>, <a href="/users/abbzeh">abbzeh</a>, <a href="/users/Lady_of_Bronze">Lady_of_Bronze</a>, <a href="/users/Crimson13">Crimson13</a>, <a href="/users/TheAmazingSpiderTeen">TheAmazingSpiderTeen</a>, <a href="/users/sevensages72000">sevensages72000</a>, <a href="/users/Juliedoo">Juliedoo</a>, <a href="/users/theshoutingslytherin">theshoutingslytherin</a>, <a href="/users/Sealunis">Sealunis</a>, <a href="/users/Rebeccaknowsyou">Rebeccaknowsyou</a>, <a href="/users/Rumorunderoath">Rumorunderoath</a>, <a href="/users/bibliofanatic">bibliofanatic</a>, <a href="/users/shadowalex2000">shadowalex2000</a>, <a href="/users/Eovin">Eovin</a>, <a href="/users/TiredSmolPrince">TiredSmolPrince</a>, <a href="/users/graeyre">graeyre</a>, <a href="/users/inkwellofstars">inkwellofstars</a>, <a href="/users/Gay_lover343">Gay_lover343</a>, <a href="/users/MinMin_Minah">MinMin_Minah</a>, <a href="/users/Acixs">Acixs</a>, <a href="/users/Nu_toamna">Nu_toamna</a>, <a href="/users/swag_canada">swag_canada</a>, <a href="/users/CrossBladeWing">CrossBladeWing</a>, <a href="/users/zegirlthatlikeslongstories">zegirlthatlikeslongstories</a>, <a href="/users/Soulborg63">Soulborg63</a>, <a href="/users/dytabytes">dytabytes</a>, <a href="/users/iluvcelebi">iluvcelebi</a>, <a href="/users/twinklehana">twinklehana</a>, <a href="/users/LadyMerlin">LadyMerlin</a>, <a href="/users/Illurine">Illurine</a>, <a href="/users/carpha">carpha</a>, <a href="/users/LuminatedEmber">LuminatedEmber</a>, <a href="/users/serinu">serinu</a>, <a href="/users/ZeeMastermind">ZeeMastermind</a>, <a href="/users/Yuu3">Yuu3</a>, <a href="/users/Voidless">Voidless</a>, <a href="/users/AbnormalVulpes">AbnormalVulpes</a>, <a href="/users/Chimeara">Chimeara</a>, <a href="/users/Risachi">Risachi</a>, <a href="/users/Interruptimoooooo">Interruptimoooooo</a>, <a href="/users/Ghostmilky">Ghostmilky</a>, <a href="/users/GambolVanguard">GambolVanguard</a>, <a href="/users/procrascarnations">procrascarnations</a>, <a href="/users/SilverPhoenixFlame">SilverPhoenixFlame</a>, <a href="/users/kookiepup12">kookiepup12</a>, <a href="/users/WillowWispFlame">WillowWispFlame</a>, <a href="/users/VioletLilies">VioletLilies</a>, <a href="/users/LlamaLamb72">LlamaLamb72</a>, <a href="/users/LectorEl">LectorEl</a>, <a href="/users/inanimaterambles">inanimaterambles</a>, <a href="/users/sunlightlover">sunlightlover</a>, <a href="/users/obliviouseloquence">obliviouseloquence</a>, <a href="/users/Ekgthe1st">Ekgthe1st</a>, <a href="/users/echol">echol</a>, <a href="/users/zarinthel">zarinthel</a>, <a href="/users/TheLennyBunny">TheLennyBunny</a>, <a href="/users/BookAddictAndLoner">BookAddictAndLoner</a>, <a href="/users/Lolle">Lolle</a>, <a href="/users/ameliafromafairytale">ameliafromafairytale</a>, <a href="/users/AllytheGreat">AllytheGreat</a>, <a href="/users/StandAloneFemale">StandAloneFemale</a>, <a href="/users/AstroGeko">AstroGeko</a>, <a href="/users/WhatTheDeafManHeard">WhatTheDeafManHeard</a>, <a href="/users/dixdozen">dixdozen</a>, <a href="/users/jenesaisrien">jenesaisrien</a>, <a href="/users/wovenstarlight">wovenstarlight</a>, <a href="/users/redrobin1989">redrobin1989</a>, <a href="/users/nessa11997">nessa11997</a>, <a href="/users/TophatsGalore">TophatsGalore</a>, <a href="/users/Keyrim">Keyrim</a>, <a href="/users/10scheherazade01">10scheherazade01</a>, <a href="/users/MadderRed">MadderRed</a>, <a href="/users/Atashi_wa_Kimi">Atashi_wa_Kimi</a>, <a href="/users/soarz">soarz</a>, <a href="/users/poetical_nonsense">poetical_nonsense</a>, <a href="/users/holdyholdy">holdyholdy</a>, <a href="/users/Guest182769">Guest182769</a>, <a href="/users/HowShouldIKnowboutLife">HowShouldIKnowboutLife</a>, <a href="/users/Momoirokitsune">Momoirokitsune</a>, <a href="/users/TheEdifier">TheEdifier</a>, <a href="/users/hrosanna">hrosanna</a>, <a href="/users/B0nk3rs">B0nk3rs</a>, <a href="/users/ArdentAspen2">ArdentAspen2</a>, <a href="/users/forbiddenSender">forbiddenSender</a>, <a href="/users/nxtelight">nxtelight</a>, <a href="/users/ColorfulGrey">ColorfulGrey</a>, <a href="/users/QueanKatt">QueanKatt</a>, <a href="/users/matterglob">matterglob</a>, <a href="/users/RubyChimera">RubyChimera</a>, <a href="/users/Silvermoon_of_Forestclan">Silvermoon_of_Forestclan</a>, <a href="/users/Obi_Sean_Kenobi">Obi_Sean_Kenobi</a>, <a href="/users/LunaLavenderSkies">LunaLavenderSkies</a>, <a href="/users/Oceans_pebble">Oceans_pebble</a>, <a href="/users/reol">reol</a>, <a href="/users/GoblinCatKC">GoblinCatKC</a>, <a href="/users/SnakeofMedusa">SnakeofMedusa</a>, <a href="/users/Eldritch_kun">Eldritch_kun</a>, <a href="/users/Menokai">Menokai</a>, <a href="/users/TheLachnessMonster">TheLachnessMonster</a>, <a href="/users/Eye_Heart">Eye_Heart</a>, <a href="/users/yaichi">yaichi</a>, <a href="/users/Silver777Tongue">Silver777Tongue</a>, <a href="/users/pohpohpotato">pohpohpotato</a>, <a href="/users/Flaremage">Flaremage</a>, <a href="/users/APhantomReader">APhantomReader</a>, <a href="/users/Kikialaxis">Kikialaxis</a>, <a href="/users/mikochan_noda">mikochan_noda</a>, <a href="/users/splazbee">splazbee</a>, <a href="/users/rossettes">rossettes</a>, <a href="/users/YepTheRebel">YepTheRebel</a>, <a href="/users/LeahElizabeth89">LeahElizabeth89</a>, <a href="/users/TiniGene">TiniGene</a>, <a href="/users/Mini_N">Mini_N</a>, <a href="/users/crabapplered">crabapplered</a>, <a href="/users/kaz_2y5_impala">kaz_2y5_impala</a>, <a href="/users/solarwings">solarwings</a>, <a href="/users/Sydeon">Sydeon</a>, <a href="/users/Lady_Lucirnaga">Lady_Lucirnaga</a>, <a href="/users/Dr_Valor">Dr_Valor</a>, <a href="/users/phantomwolf000">phantomwolf000</a>, <a href="/users/natsukyi">natsukyi</a>, <a href="/users/Maberry">Maberry</a>, <a href="/users/Feddlefew">Feddlefew</a>, <a href="/users/Symxalia">Symxalia</a>, <a href="/users/Wenzku">Wenzku</a>, <a href="/users/ubwPersona">ubwPersona</a>, <a href="/users/xane0">xane0</a>, <a href="/users/Knockoutroundabout">Knockoutroundabout</a>, <a href="/users/tabletoptime">tabletoptime</a>, <a href="/users/Dragonfire719">Dragonfire719</a>, <a href="/users/unsafestpear">unsafestpear</a>, <a href="/users/Gelatik">Gelatik</a>, <a href="/users/AiryAri">AiryAri</a>, <a href="/users/SimZim">SimZim</a>, <a href="/users/SpecialKai">SpecialKai</a>, <a href="/users/Devourer_of_Tales">Devourer_of_Tales</a>, <a href="/users/SugaSugar">SugaSugar</a>, <a href="/users/Lazy_Creativity">Lazy_Creativity</a>, <a href="/users/weslane">weslane</a>, <a href="/users/LepusCor">LepusCor</a>, <a href="/users/Sunnylighter">Sunnylighter</a>, <a href="/users/ShadowArchon">ShadowArchon</a>, <a href="/users/aeonastra">aeonastra</a>, <a href="/users/Rathenon">Rathenon</a>, <a href="/users/Antea21">Antea21</a>, <a href="/users/gearsky">gearsky</a>, <a href="/users/Haely_Potter">Haely_Potter</a>, <a href="/users/GoldGreen">GoldGreen</a>, <a href="/users/Ent">Ent</a>, <a href="/users/Trashworks">Trashworks</a>, <a href="/users/Mochikoenda">Mochikoenda</a>, <a href="/users/CaroBunny23">CaroBunny23</a>, <a href="/users/Lis_the_reader">Lis_the_reader</a>, <a href="/users/WerewolvesAreReal">WerewolvesAreReal</a>, <a href="/users/Crude_Mood">Crude_Mood</a>, <a href="/users/Celevon">Celevon</a>, <a href="/users/Tiamat851v5n">Tiamat851v5n</a>, <a href="/users/DrJ">DrJ</a>, <a href="/users/SelenaSkyheart">SelenaSkyheart</a>, <a href="/users/FlyingPotato63">FlyingPotato63</a>, <a href="/users/a_walnut">a_walnut</a>, <a href="/users/talcat">talcat</a>, <a href="/users/Grand_Marxc">Grand_Marxc</a>, <a href="/users/nbyk">nbyk</a>, <a href="/users/3dward">3dward</a>, <a href="/users/JebusCouch">JebusCouch</a>, <a href="/users/RMXStudio">RMXStudio</a>, <a href="/users/Sergito">Sergito</a>, <a href="/users/ThatPersonWhoExists">ThatPersonWhoExists</a>, <a href="/users/SheepySeconds">SheepySeconds</a>, <a href="/users/fox_lover">fox_lover</a>, <a href="/users/Tayto778">Tayto778</a>, <a href="/users/shio_san">shio_san</a>, <a href="/users/daiyu_amaya">daiyu_amaya</a>, <a href="/users/Noveloid505">Noveloid505</a>, <a href="/users/Castor_Raiden">Castor_Raiden</a>, <a href="/users/Fayah">Fayah</a>, <a href="/users/Vnovice7">Vnovice7</a>, <a href="/users/greenest_bean">greenest_bean</a>, <a href="/users/Mitsuhiku">Mitsuhiku</a>, <a href="/users/The_Button_Harlequin">The_Button_Harlequin</a>, <a href="/users/cookie_from_heck">cookie_from_heck</a>, <a href="/users/Ravelights">Ravelights</a>, <a href="/users/L1ghts55">L1ghts55</a>, <a href="/users/Xandynz">Xandynz</a>, <a href="/users/ekabw97">ekabw97</a>, <a href="/users/redhazel">redhazel</a>, <a href="/users/Despondent_Rat">Despondent_Rat</a>, <a href="/users/ShinXcrown">ShinXcrown</a>, <a href="/users/lunabyrd">lunabyrd</a>, <a href="/users/TheScienceCat">TheScienceCat</a>, <a href="/users/Zyxaliath">Zyxaliath</a>, <a href="/users/LadyAshetzi">LadyAshetzi</a>, <a href="/users/Hatelikingbatman">Hatelikingbatman</a>, <a href="/users/kageddd">kageddd</a>, <a href="/users/pjzza">pjzza</a>, <a href="/users/Pom_Rania">Pom_Rania</a>, <a href="/users/Shidake">Shidake</a>, <a href="/users/nokkochi">nokkochi</a>, <a href="/users/meowmeowmeow222">meowmeowmeow222</a>, <a href="/users/caeulio">caeulio</a>, <a href="/users/Lamellar">Lamellar</a>, <a href="/users/DeathByCocoa">DeathByCocoa</a>, <a href="/users/Annab23">Annab23</a>, <a href="/users/starless_ocean">starless_ocean</a>, <a href="/users/cigi">cigi</a>, <a href="/users/rnr4ev">rnr4ev</a>, <a href="/users/TiredMeis">TiredMeis</a>, <a href="/users/ardnajela">ardnajela</a>, <a href="/users/EternallyDescending">EternallyDescending</a>, <a href="/users/cherrylurker">cherrylurker</a>, <a href="/users/Chuchutu">Chuchutu</a>, <a href="/users/stephenc966">stephenc966</a>, <a href="/users/Lunar_Hikari">Lunar_Hikari</a>, <a href="/users/Reddiamond29">Reddiamond29</a>, <a href="/users/Reikey">Reikey</a>, <a href="/users/youlookhellafine">youlookhellafine</a>, <a href="/users/MoDSarah">MoDSarah</a>, <a href="/users/Dukeofnachos">Dukeofnachos</a>, <a href="/users/heybudster">heybudster</a>, <a href="/users/NoOneLeftStanding">NoOneLeftStanding</a>, <a href="/users/FelicitousVixen">FelicitousVixen</a>, <a href="/users/ZioWolfregent">ZioWolfregent</a>, <a href="/users/WaffleB0t">WaffleB0t</a>, <a href="/users/Savests">Savests</a>, <a href="/users/Sunny86">Sunny86</a>, <a href="/users/Mek_Night">Mek_Night</a>, <a href="/users/0Lazuli0">0Lazuli0</a>, <a href="/users/sugoid">sugoid</a>, <a href="/users/SammyLerma">SammyLerma</a>, <a href="/users/Ayacchii">Ayacchii</a>, <a href="/users/HybridKylin">HybridKylin</a>, <a href="/users/momoi">momoi</a>, <a href="/users/mymuffyincat">mymuffyincat</a>, <a href="/users/Wisetypewriter">Wisetypewriter</a>, <a href="/users/Kelton200143">Kelton200143</a>, <a href="/users/Wuga">Wuga</a>, <a href="/users/ShinyAltaria">ShinyAltaria</a>, <a href="/users/WinterRose21">WinterRose21</a>, <a href="/users/simgrim">simgrim</a>, <a href="/users/ch0bs">ch0bs</a>, <a href="/users/khepur">khepur</a>, <a href="/users/y_uu">y_uu</a>, <a href="/users/DeadHero">DeadHero</a>, <a href="/users/grimtidings">grimtidings</a>, <a href="/users/pine_ster">pine_ster</a>, <a href="/users/Femme_Fatality">Femme_Fatality</a>, <a href="/users/CrimsonCrystalConstellation">CrimsonCrystalConstellation</a>, <a href="/users/Faceball_95">Faceball_95</a>, <a href="/users/Fluffyladylady">Fluffyladylady</a>, <a href="/users/Lordlyhour">Lordlyhour</a>, <a href="/users/GoldenFalls">GoldenFalls</a>, <a href="/users/aloof_intheinternet">aloof_intheinternet</a>, <a href="/users/Spirit_Kin">Spirit_Kin</a>, <a href="/users/antara756">antara756</a>, <a href="/users/thousandstars">thousandstars</a>, <a href="/users/SwordZword">SwordZword</a>, <a href="/users/Evilkitten3">Evilkitten3</a>, <a href="/users/Suzy_Bro">Suzy_Bro</a>, <a href="/users/lesbianedgeworth">lesbianedgeworth</a>, <a href="/users/MathiasKejseren">MathiasKejseren</a>, <a href="/users/yihou">yihou</a>, <a href="/users/7thScythe">7thScythe</a>, <a href="/users/Secret_H">Secret_H</a>, <a href="/users/Resinpath">Resinpath</a>, <a href="/users/foible">foible</a>, <a href="/users/NameIt">NameIt</a>, <a href="/users/Sleepy_9000">Sleepy_9000</a>, <a href="/users/XxxBellaBellaxxX">XxxBellaBellaxxX</a>, <a href="/users/Shimmer">Shimmer</a>, <a href="/users/Rangrids">Rangrids</a>, <a href="/users/Beastrage">Beastrage</a>, <a href="/users/BJoker">BJoker</a>, <a href="/users/Tactile">Tactile</a>, <a href="/users/Maggisakura">Maggisakura</a>, <a href="/users/jitterbug0">jitterbug0</a>, <a href="/users/areyouserious">areyouserious</a>, <a href="/users/B_Cavendish">B_Cavendish</a>, <a href="/users/sunfirewings">sunfirewings</a>, <a href="/users/A_Normal_User">A_Normal_User</a>, <a href="/users/RandomCatStar">RandomCatStar</a>, <a href="/users/cicsummers">cicsummers</a>, <a href="/users/rhodonitewitch">rhodonitewitch</a>, <a href="/users/ariihen">ariihen</a>, <a href="/users/SweetAsLaffyTaffy">SweetAsLaffyTaffy</a>, <a href="/users/AyameEcho">AyameEcho</a>, <a href="/users/Sly_Slytherin_in_da_house">Sly_Slytherin_in_da_house</a>, <a href="/users/ToBeorNotto_Ohforgetit">ToBeorNotto_Ohforgetit</a>, <a href="/users/Geeneelee">Geeneelee</a>, <a href="/users/mochidrops">mochidrops</a>, <a href="/users/MemeDreams">MemeDreams</a>, <a href="/users/pinkpiano26">pinkpiano26</a>, <a href="/users/The_Truth_Or_Falsity">The_Truth_Or_Falsity</a>, <a href="/users/kenamailani">kenamailani</a>, <a href="/users/Bleak98">Bleak98</a>, <a href="/users/ChaoticallyAwkward">ChaoticallyAwkward</a>, <a href="/users/Acidwing">Acidwing</a>, <a href="/users/QTW">QTW</a>, <a href="/users/softgunch">softgunch</a>, <a href="/users/letspanic">letspanic</a>, <a href="/users/Oldseablues">Oldseablues</a>, <a href="/users/Kellakazoo">Kellakazoo</a>, <a href="/users/Minatos_Legacy">Minatos_Legacy</a>, <a href="/users/YouRanForIt">YouRanForIt</a>, <a href="/users/StealthyPeacock">StealthyPeacock</a>, <a href="/users/2tarOfMyHeart">2tarOfMyHeart</a> and <a href="/users/Katyuam">Katyuam</a></span> as well as 3381 guests left kudos on this work! <span class="kudos_expanded hidden"><a id="kudos_collapser" href="#">(collapse)</a></span>
+ </p>
+ </div>
+ <div id="add_comment_placeholder" title="top level comment">
+ <div id="add_comment">
+ <!-- expects the local variables comment, commentable, and button_name -->
+ <div class="post comment" id="comment_form_for_26640231">
+ <form id="comment_for_26640231" class="new_comment" action="/chapters/26640231/comments" accept-charset="UTF-8" method="post" name="comment_for_26640231">
+ <input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="mOIlmErw6PVov2WEmzPkwGCptUG6CxJzGM90CBL0PHrSTvwVmLjunDejSKXjCjK6IKNJz31k1VS4E2QXVNpj4A==" />
+ <fieldset>
+ <legend>Post Comment</legend>
+ <dl>
+ <dt class="landmark">
+ Note:
+ </dt>
+ <dd class="instructions comment_form">
+ All fields are required. Your email address will not be published.
+ </dd>
+ <dt>
+ <label for="comment_name_for_26640231">Name:</label>
+ </dt>
+ <dd>
+ <input id="comment_name_for_26640231" type="text" name="comment[name]" />
+ <script>
+ <![CDATA[
+ var validation_for_comment_name_for_26640231=new LiveValidation('comment_name_for_26640231',{wait:500,onlyOnBlur:false});validation_for_comment_name_for_26640231.add(Validate.Presence,{"failureMessage":"Please enter your name.","validMessage":""});
+ ]]>
+ </script>
+ </dd>
+ <dt>
+ <label for="comment_email_for_26640231">Email:</label>
+ </dt>
+ <dd>
+ <input id="comment_email_for_26640231" type="text" name="comment[email]" />
+ <script>
+ <![CDATA[
+ var validation_for_comment_email_for_26640231=new LiveValidation('comment_email_for_26640231',{wait:500,onlyOnBlur:false});validation_for_comment_email_for_26640231.add(Validate.Presence,{"failureMessage":"Please enter your email address.","validMessage":""});
+ ]]>
+ </script>
+ </dd>
+ </dl>
+ <p>
+ <label for="comment_content_for_26640231" class="landmark">Comment</label>
+ <textarea id="comment_content_for_26640231" class="comment_form observe_textlength" title="Enter Comment" name="comment[comment_content]"></textarea> <input type="hidden" id="controller_name_for_26640231" name="controller_name" value="chapters" />
+ </p>
+ <p class="character_counter">
+ <span id="comment_content_for_26640231_counter" class="value" data-maxlength="10000" aria-live="polite" aria-valuemax="10000" aria-valuenow="comment_content_for_26640231">10000</span> characters left
+ </p>
+ <script>
+ <![CDATA[
+ var validation_for_comment_content_for_26640231=new LiveValidation('comment_content_for_26640231',{wait:500,onlyOnBlur:false});validation_for_comment_content_for_26640231.add(Validate.Presence,{"failureMessage":"Brevity is the soul of wit, but we need your comment to have text in it.","validMessage":""});validation_for_comment_content_for_26640231.add(Validate.Length,{"maximum":"10000","tooLongMessage":"must be less than 10000 characters long."});
+ ]]>
+ </script>
+ <p class="submit actions">
+ <input type="submit" name="commit" value="Comment" id="comment_submit_for_26640231" data-disable-with="Please wait..." />
+ </p>
+ </fieldset>
+ </form>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div><!-- If we have javascript, here is where the comments will be spiffily inserted -->
+ <!-- If not, and show_comments is true, here is where the comments will be rendered -->
+ <div id="comments_placeholder" style="display:none;"></div>
+ </div><!-- END comments -->
+ <!-- END comment section -->
+ <div class="clear">
+ <!--presentational-->
+ </div>
+ </div><!-- END main -->
+ </div><!-- BEGIN footer -->
+ <div id="footer" role="contentinfo" class="region">
+ <h3 class="landmark heading">
+ Footer
+ </h3>
+ <ul class="navigation actions" role="navigation">
+ <li class="module group">
+ <h4 class="heading">
+ About the Archive
+ </h4>
+ <ul class="menu">
+ <li>
+ <a href="/site_map">Site Map</a>
+ </li>
+ <li>
+ <a href="/diversity">Diversity Statement</a>
+ </li>
+ <li>
+ <a href="/tos">Terms of Service</a>
+ </li>
+ <li>
+ <a href="/dmca">DMCA Policy</a>
+ </li>
+ </ul>
+ </li>
+ <li class="module group">
+ <h4 class="heading">
+ Contact Us
+ </h4>
+ <ul class="menu">
+ <li>
+ <a href="/abuse_reports/new">Report Abuse</a>
+ </li>
+ <li>
+ <a href="/support">Technical Support and Feedback</a>
+ </li>
+ </ul>
+ </li>
+ <li class="module group">
+ <h4 class="heading">
+ Development
+ </h4>
+ <ul class="menu">
+ <li>
+ <a href="https://github.com/otwcode/otwarchive/commits/v0.9.282.1">otwarchive v0.9.282.1</a>
+ </li>
+ <li>
+ <a href="/known_issues">Known Issues</a>
+ </li>
+ <li>
+ <a href="http://www.gnu.org/licenses/gpl-2.0.html" title="View License">GPL</a> by the <a href="http://transformativeworks.org/" title="The Organization for Transformative Works">OTW</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div><!-- END footer -->
+ </div><!-- check to see if this controller/action allow tinymce before we load the gigantor js; see application_helper -->
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-images.json
index b55555167..d14a5589d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-images.json
@@ -1,3 +1,4 @@
[
- "http:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-640x426.jpg"
+ "https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-640x215.jpg",
+ "https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-640x426.jpg"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-metadata.json
index 0594bf203..2cb17ec76 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": "by Dan Goodin - Apr 16, 2015 8:02 pm UTC",
+ "Author": "Dan Goodin - Apr 16, 2015 8:02 pm UTC",
"Direction": null,
"Excerpt": "Two-year-old bug exposes thousands of servers to crippling attack.",
- "Image": "http:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-640x426.jpg",
+ "Image": "https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-640x215.jpg",
"Title": "Just-released Minecraft exploit makes it easy to crash game servers",
"SiteName": "Ars Technica"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected.html
index 0aecf6e9f..905e0d157 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/expected.html
@@ -1,12 +1,40 @@
-<div itemprop="articleBody">
- <figure><img height="331" src="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" width="640"></img><figcaption>
- </figcaption></figure><p>A flaw in the wildly popular online game <em>Minecraft</em> makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.</p>
- <p>"I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a <a href="http://blog.ammaraskar.com/minecraft-vulnerability-advisory">blog post published Thursday</a>, 21 months, he said, after privately reporting the bug to <em>Minecraft</em> developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."</p>
- <p>The bug resides in the <a href="https://github.com/ammaraskar/pyCraft">networking internals of the <em>Minecraft </em>protocol</a>. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. <em>Minecraft</em> items can also store arbitrary metadata in a file format known as <a href="http://wiki.vg/NBT">Named Binary Tag (NBT)</a>, which allows complex data structures to be kept in hierarchical nests. Askar has released <a href="https://github.com/ammaraskar/pyCraft/tree/nbt_exploit">proof-of-concept attack code</a> he said exploits the vulnerability to crash any server hosting the game. Here's how it works.</p>
- <blockquote>
- <p>The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to <em>craft</em> a packet that is incredibly complex for the server to deserialize but trivial for us to generate.</p>
- <p>In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like.</p>
- <div> <pre><code data-lang="javascript"><span>rekt</span><span>:</span> <span>{</span>
+<div>
+ <header>
+ <h4>
+ Biz &amp; IT —
+ </h4>
+
+ <h2 itemprop="description">
+ Two-year-old bug exposes thousands of servers to crippling attack.
+ </h2>
+
+ </header>
+ <div itemprop="articleBody">
+ <figure>
+ <img src="https://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" alt="Just-released Minecraft exploit makes it easy to crash game servers">
+ <figcaption>
+
+ </figcaption>
+ </figure>
+
+ <p>
+ A flaw in the wildly popular online game <em>Minecraft</em> makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.
+ </p>
+ <p>
+ "I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a <a href="http://blog.ammaraskar.com/minecraft-vulnerability-advisory">blog post published Thursday</a>, 21 months, he said, after privately reporting the bug to <em>Minecraft</em> developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."
+ </p>
+ <p>
+ The bug resides in the <a href="https://github.com/ammaraskar/pyCraft">networking internals of the <em>Minecraft</em> protocol</a>. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. <em>Minecraft</em> items can also store arbitrary metadata in a file format known as <a href="http://wiki.vg/NBT">Named Binary Tag (NBT)</a>, which allows complex data structures to be kept in hierarchical nests. Askar has released <a href="https://github.com/ammaraskar/pyCraft/tree/nbt_exploit">proof-of-concept attack code</a> he said exploits the vulnerability to crash any server hosting the game. Here's how it works.
+ </p>
+ <blockquote>
+ <p>
+ The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to <em>craft</em> a packet that is incredibly complex for the server to deserialize but trivial for us to generate.
+ </p>
+ <p>
+ In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like.
+ </p>
+ <div>
+ <pre><code data-lang="javascript"><span>rekt</span><span>:</span> <span>{</span>
<span>list</span><span>:</span> <span>[</span>
<span>list</span><span>:</span> <span>[</span>
<span>list</span><span>:</span> <span>[</span>
@@ -31,14 +59,33 @@
<span>...</span>
<span>]</span>
<span>...</span>
-<span>}</span></code></pre> </div>
- <p>The root of the object, <code>rekt</code>, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of <code>10^5 * 300 = 30,000,000</code> lists.</p>
- <p>And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes.</p>
- <p>Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to <code>2^15 - 1</code>. Now that the length is a varint capable of storing integers up to <code>2^28</code>, our potential for attack has increased significantly.</p>
- <p>When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load.</p>
- <p>This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the <a href="http://wiki.vg/Protocol#Player_Block_Placement">0x08: Block Placement Packet</a> and <a href="http://wiki.vg/Protocol#Creative_Inventory_Action">0x10: Creative Inventory Action</a>.</p>
- <p>The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented.</p>
- <p>These were the fixes that I recommended to Mojang 2 years ago.</p>
- </blockquote>
- <p>Ars is asking Mojang for comment and will update this post if company officials respond.</p>
- </div> \ No newline at end of file
+<span>}</span></code></pre>
+ </div>
+ <p>
+ The root of the object, <code>rekt</code>, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of <code>10^5 * 300 = 30,000,000</code> lists.
+ </p>
+ <p>
+ And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes.
+ </p>
+ <p>
+ Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to <code>2^15 - 1</code>. Now that the length is a varint capable of storing integers up to <code>2^28</code>, our potential for attack has increased significantly.
+ </p>
+ <p>
+ When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load.
+ </p>
+ <p>
+ This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the <a href="http://wiki.vg/Protocol#Player_Block_Placement">0x08: Block Placement Packet</a> and <a href="http://wiki.vg/Protocol#Creative_Inventory_Action">0x10: Creative Inventory Action</a>.
+ </p>
+ <p>
+ The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented.
+ </p>
+ <p>
+ These were the fixes that I recommended to Mojang 2 years ago.
+ </p>
+ </blockquote>
+ <p>
+ Ars is asking Mojang for comment and will update this post if company officials respond.
+ </p>
+
+ </div>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/source.html
index cd6aed112..27630ef92 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/source.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ars-1/source.html
@@ -1,292 +1,373 @@
<!DOCTYPE html>
-<!--[if lt IE 7]> <html lang="en-us" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
-<!--[if IE 7]> <html lang="en-us" class="no-js lt-ie9 lt-ie8"> <![endif]-->
-<!--[if IE 8]> <html lang="en-us" class="no-js ie8 lt-ie9"> <![endif]-->
-<!--[if IE 9]> <html lang="en-us" class="no-js ie9"> <![endif]-->
-<!--[if gt IE 8]><!-->
-<html lang="en-us">
-<!--<![endif]-->
+<html lang="en-us" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us">
+ <head>
+ <title>
+ Just-released Minecraft exploit makes it easy to crash game servers | Ars Technica
+ </title>
+ <script type="text/javascript">
+ //<![CDATA[
+ ars = {"ASSETS":"https:\/\/cdn.arstechnica.net\/wp-content\/themes\/ars\/assets","HOME_URL":"https:\/\/arstechnica.com","LOGIN_URL":"https:\/\/arstechnica.com\/services\/login-desktop.html?v=1","CIVIS":"\/civis","THEME":"light","VIEW":"grid","MOBILE":false,"SUBSCRIBER":false,"PLUS_PLUS":false,"LOGGED":false,"USER_ID":null,"ENV":"production","AD":{"tags":["denial-of-service-attack","exploits","minecraft","vulnerabilities"],"channel":"information-technology","slug":"just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers","template_type":"article","queue":[],"server":"production"},"TOTAL":97063,"UNREAD":0,"RECENT":[1698939,1698645,1698804,1698783,1698769,1698663,1698682,1698690,1698667,1698588,1698619,1697597,1698183,1698597,1698540,1698542,1698370,1698442,1698274,1698421,1698346,1698367,1698356,1698294,1698335],"LOGINS":true,"CROSS":false,"PARSELY":"arstechnica.com","COMMENTS":false,"HOMEPAGE":false,"SITE":1,"READY":[],"SHOW_ADS":true,"IMG_PROXY":"https:\/\/cdn.arstechnica.net\/i\/","CATEGORY":"information-technology","PAGETITLE":"","ZEN_MODE":false};
+ //]]>
+ </script>
+ <link rel="stylesheet" type="text/css" media="all" href="https://cdn.arstechnica.net/wp-content/themes/ars/assets/css/main-130fcfcce0.css" />
+ <link rel="alternate" type="application/rss+xml" href="http://feeds.arstechnica.com/arstechnica/index/" />
+ <link rel="shortcut icon" href="https://cdn.arstechnica.net/favicon.ico" />
+ <link rel="icon" type="image/x-icon" href="https://cdn.arstechnica.net/favicon.ico" />
+ <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.arstechnica.net/wp-content/themes/ars/assets/img/ars-ios-icon-d9a45f558c.png" />
+ <link rel="mask-icon" href="https://cdn.arstechnica.net/wp-content/themes/ars/assets/img/ars-macos-safari-8997f76b21.svg" color="#ff4e00" />
+ <link rel="icon" sizes="192x192" href="https://cdn.arstechnica.net/wp-content/themes/ars/assets/img/material-ars-db41652381.png" />
+ <meta name="application-name" content="Ars Technica" />
+ <meta name="msapplication-starturl" content="http://arstechnica.com/" />
+ <meta name="msapplication-tooltip" content="Ars Technica: Serving the technologist for 1.2 decades" />
+ <meta name="msapplication-task" content="name=News;action-uri=http://arstechnica.com/;icon-uri=https://cdn.arstechnica.net/favicon.ico" />
+ <meta name="msapplication-task" content="name=Features;action-uri=http://arstechnica.com/features/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-features.ico" />
+ <meta name="msapplication-task" content="name=OpenForum;action-uri=http://arstechnica.com/civis/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-forum.ico" />
+ <meta name="msapplication-task" content="name=Subscribe;action-uri=http://arstechnica.com/subscriptions/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-subscribe.ico" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta name="advertising" content="ask" />
+ <meta property="fb:admins" content="592156917" />
+ <meta property="fb:admins" content="108943" />
+ <meta property="fb:pages" content="19374573752" />
+ <meta name="format-detection" content="telephone=no" />
+ <meta name="theme-color" content="#000000" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" /><!-- cache miss 581:single/meta:5a5daf59fa5245a64fe8615caa0b1d1b -->
+ <meta name="parsely-page" content="{&quot;title&quot;:&quot;Just-released Minecraft exploit makes it easy to crash game servers&quot;,&quot;link&quot;:&quot;https:\/\/arstechnica.com\/information-technology\/2015\/04\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/&quot;,&quot;type&quot;:&quot;post&quot;,&quot;author&quot;:&quot;Dan Goodin&quot;,&quot;post_id&quot;:648287,&quot;pub_date&quot;:&quot;2015-04-16T20:02:01Z&quot;,&quot;section&quot;:&quot;Biz &amp; IT&quot;,&quot;tags&quot;:[&quot;denial-of-service-attack&quot;,&quot;exploits&quot;,&quot;minecraft&quot;,&quot;vulnerabilities&quot;,&quot;type: report&quot;],&quot;image_url&quot;:&quot;https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-150x150.jpg&quot;}" />
+ <meta name="parsely-metadata" content="{&quot;type&quot;:&quot;report&quot;,&quot;title&quot;:&quot;Just-released Minecraft exploit makes it easy to crash game servers&quot;,&quot;post_id&quot;:648287,&quot;lower_deck&quot;:&quot;Two-year-old bug exposes thousands of servers to crippling attack.&quot;,&quot;image_url&quot;:&quot;https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-150x150.jpg&quot;,&quot;listing_image_url&quot;:&quot;https:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-300x150.jpg&quot;}" />
+ <link rel="canonical" href="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/" />
+ <link rel="amphtml" href="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?amp=1" />
+ <link rel="shorturl" href="https://arstechnica.com/?p=648287" />
+ <meta name="description" content="Two-year-old bug exposes thousands of servers to crippling attack." />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:url" content="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/" />
+ <meta name="twitter:title" content="Just-released Minecraft exploit makes it easy to crash game servers" />
+ <meta name="twitter:description" content="Two-year-old bug exposes thousands of servers to crippling attack." />
+ <meta name="twitter:site" content="@arstechnica" />
+ <meta name="twitter:domain" content="arstechnica.com" />
+ <meta property="og:site_name" content="Ars Technica" />
+ <meta name="twitter:image:src" content="https://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x215.jpg" />
+ <meta name="twitter:image:width" content="640" />
+ <meta name="twitter:image:height" content="215" />
+ <meta name="twitter:creator" content="@dangoodin001" />
+ <meta property="og:url" content="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/" />
+ <meta property="og:title" content="Just-released Minecraft exploit makes it easy to crash game servers" />
+ <meta property="og:image" content="https://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x215.jpg" />
+ <meta property="og:description" content="Two-year-old bug exposes thousands of servers to crippling attack." />
+ <meta property="og:type" content="article" /><!-- cache hit 581:single/header:5a5daf59fa5245a64fe8615caa0b1d1b -->
+ <!-- Google Tag Manager DataLayer -->
-<head>
- <title>Just-released Minecraft exploit makes it easy to crash game servers | Ars Technica</title>
- <script type="text/javascript">
- ars = {
- "ASSETS": "http:\/\/cdn.arstechnica.net\/wp-content\/themes\/arstechnica\/assets",
- "HOME_URL": "http:\/\/arstechnica.com",
- "LOGIN_URL": "https:\/\/arstechnica.com\/services\/login-desktop.html?v=1",
- "CIVIS": "\/civis",
- "THEME": "light",
- "VIEW": "grid",
- "MOBILE": false,
- "PREMIER": false,
- "LOGGED": false,
- "ENV": "production",
- "AD": {
- "kw": ["security", "int"],
- "zone": "int",
- "queue": []
- },
- "TOTAL": 68014,
- "UNREAD": 0,
- "RECENT": [659465, 659425, 659391, 659203, 659339, 659209, 659151, 659207, 659257, 659153, 657603, 659157, 659089, 659105, 658987, 658981, 658367, 658019, 658841, 658609, 658117, 658553, 658455, 657769, 658395],
- "LOGINS": true,
- "CROSS": false,
- "GEOALERTS": true,
- "PARSELY": "arstechnica.com",
- "COMMENTS": false,
- "HOMEPAGE": false,
- "COUNTRY": "us",
- "READY": [],
- "SHOW_ADS": true,
- "IMG_PROXY": "https:\/\/cdn.arstechnica.net\/i\/",
- "CATEGORY": "security"
- };
- </script>
- <!--[if lte IE 8]><script type="text/javascript" src="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/js/modernizr/modernizr.js"></script><![endif]-->
- <link rel="stylesheet" type="text/css" media="all" href="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/css/ars.min.55e632421d8225142fe8df15cdfe2a20.css"/>
- <link rel="alternate" type="application/rss+xml" href="http://feeds.arstechnica.com/arstechnica/index/"/>
- <link rel="shortcut icon" href="https://cdn.arstechnica.net/favicon.ico"/>
- <link rel="icon" type="image/x-icon" href="https://cdn.arstechnica.net/favicon.ico"/>
- <link rel="apple-touch-icon" sizes="180x180" href="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/images/ars-ios-icon.png"/>
- <link rel="icon" sizes="192x192" href="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/images/material-ars.png"/>
- <meta name="application-name" content="Ars Technica"/>
- <meta name="msapplication-starturl" content="http://arstechnica.com/"/>
- <meta name="msapplication-tooltip" content="Ars Technica: Serving the technologist for 1.2 decades"/>
- <meta name="msapplication-task" content="name=News;action-uri=http://arstechnica.com/;icon-uri=https://cdn.arstechnica.net/favicon.ico"/>
- <meta name="msapplication-task" content="name=Features;action-uri=http://arstechnica.com/features/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-features.ico"/>
- <meta name="msapplication-task" content="name=OpenForum;action-uri=http://arstechnica.com/civis/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-forum.ico"/>
- <meta name="msapplication-task" content="name=Subscribe;action-uri=http://arstechnica.com/subscriptions/;icon-uri=https://cdn.arstechnica.net/ie-jump-menu/jump-subscribe.ico"/>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <meta name="advertising" content="ask"/>
- <meta property="fb:admins" content="592156917"/>
- <meta name="format-detection" content="telephone=no"/>
- <meta name="theme-color" content="#000000"/>
- <meta name="viewport" content="width=1020"/>
- <!-- cache hit 459:single/meta:b3538aec37c1a165d2b4b62bd58e56e3 -->
- <meta name="parsely-page" content="{&quot;title&quot;:&quot;Just-released Minecraft exploit makes it easy to crash game servers&quot;,&quot;link&quot;:&quot;http:\/\/arstechnica.com\/security\/2015\/04\/16\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/&quot;,&quot;type&quot;:&quot;post&quot;,&quot;author&quot;:&quot;Dan Goodin&quot;,&quot;post_id&quot;:648287,&quot;pub_date&quot;:&quot;2015-04-16T20:02:01Z&quot;,&quot;section&quot;:&quot;Risk Assessment&quot;,&quot;tags&quot;:[&quot;denial-of-service-attack&quot;,&quot;exploits&quot;,&quot;minecraft&quot;,&quot;vulnerabilities&quot;,&quot;type: report&quot;],&quot;image_url&quot;:&quot;http:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-150x150.jpg&quot;}"/>
- <meta name="parsely-metadata" content="{&quot;type&quot;:&quot;report&quot;,&quot;title&quot;:&quot;Just-released Minecraft exploit makes it easy to crash game servers&quot;,&quot;post_id&quot;:648287,&quot;lower_deck&quot;:&quot;Two-year-old bug exposes thousands of servers to crippling attack.&quot;,&quot;image_url&quot;:&quot;http:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-150x150.jpg&quot;,&quot;listing_image_url&quot;:&quot;http:\/\/cdn.arstechnica.net\/wp-content\/uploads\/2015\/04\/server-crash-300x150.jpg&quot;}"/>
- <link rel="canonical" href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/"/>
- <link rel="shorturl" href="http://ars.to/1CSWnf5"/>
- <meta name="description" content="Two-year-old bug exposes thousands of servers to crippling attack."/>
- <meta name="twitter:card" content="summary_large_image"/>
- <meta name="twitter:url" content="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/"/>
- <meta name="twitter:title" content="Just-released Minecraft exploit makes it easy to crash game servers"/>
- <meta name="twitter:description" content="Two-year-old bug exposes thousands of servers to crippling attack."/>
- <meta name="twitter:site" content="@arstechnica"/>
- <meta name="twitter:domain" content="arstechnica.com"/>
- <meta property="og:site_name" content="Ars Technica"/>
- <meta name="twitter:image:src" content="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg"/>
- <meta name="twitter:image:width" content="640"/>
- <meta name="twitter:image:height" content="426"/>
- <meta name="twitter:creator" content="@dangoodin001"/>
- <meta property="og:url" content="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/"/>
- <meta property="og:title" content="Just-released Minecraft exploit makes it easy to crash game servers"/>
- <meta property="og:image" content="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg"/>
- <meta property="og:description" content="Two-year-old bug exposes thousands of servers to crippling attack."/>
- <meta property="og:type" content="article"/>
- <!-- cache hit 459:single/header:b3538aec37c1a165d2b4b62bd58e56e3 -->
- <script type="text/javascript" src="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/js/omniture/mbox.js"></script>
-</head>
+ <script>
+ <![CDATA[
+ window.dataLayer = window.dataLayer || [];
+ window.dataLayer.push({"event":"data-layer-loaded","user":{"ars_userId":undefined,"amg_userId":undefined,"uID":undefined,"sID":undefined,"loginStatus":false,"subscriberStatus":"none","infinityId":undefined,"registrationSource":undefined,"mdw_cnd_id":undefined,"monthlyVisits":undefined,"accessPaywall":undefined,"view":"grid","theme":"light","show_comments":false},"content":{"pageTemplate":"single","pageType":"article|report","contentCategory":"information-technology","section":"information technology","subsection":undefined,"contributor":"Dan Goodin","contentID":648287,"contentLength":835,"display":"Just-released Minecraft exploit makes it easy to crash game servers","contentSource":"web","pageAssets":undefined,"uniqueContentCount":undefined,"monthlyContentCount":undefined,"publishDate":"2015-04-16T20:02:01+00:00","modifiedDate":"2015-04-16T20:11:02+00:00","keywords":"denial of service attack|exploits|minecraft|vulnerabilities","dataSource":undefined},"marketing":{"campaignName":undefined,"circCampaignId":undefined,"internalCampaignId":undefined,"brand":"Ars Technica","certified_mrc_data":undefined,"condeNastId":undefined},"page":{"pID":undefined,"syndicatorUrl":undefined,"pageURL":"https:\/\/arstechnica.com\/?p=648287","canonical":"https:\/\/arstechnica.com\/information-technology\/2015\/04\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/","canonicalPathName":"\/information-technology\/2015\/04\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/"},"search":{"facets":undefined,"searchTerms":undefined},"site":{"appVersion":"1.0.0"}});
+ ]]>
+ </script><!-- End Google Tag Manager DataLayer -->
+ <!-- Google Tag Manager -->
-<body class="single single-post postid-648287 single-format-standard grid-view light blog-us">
- <div id="container">
- <header id="masthead">
- <aside id="ad-top">
- <div id="topBanner728x90_frame"></div>
- <script type="text/javascript">
- ars.AD.queue.push(['topBanner', {
- sz: '728x90',
- kws: [],
- collapse: true
- }]);
- </script>
- </aside>
- <h1><a href="http://arstechnica.com"><em>Ars</em>Technica</a></h1>
- <div id="profile">
- <!-- cache hit 459:header/site-toggle:f8ff57a97275618649c08b2cce8f06a6 -->
- <ul class="site-toggle">
- <li class="site-1 selected"><a href="http://arstechnica.com/?return">Ars Technica</a></li>
- <li class="site-3"><a href="http://arstechnica.co.uk">Ars Technica UK</a></li>
- </ul> <a href="/civis/ucp.php?mode=register" rel="nofollow">Register</a> <a id="login" href="http://arstechnica.com/civis/ucp.php?mode=login&amp;return_to=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" rel="nofollow">Log in</a> </div>
- <nav id="primary">
- <ul>
- <li id="home-icon"> <a href="/"><span>Home</span></a> </li>
- <li class="has-children"> <a href="#">Main Menu</a>
- <div id="main-menu" class="dropdown">
- <div id="sections">
- <ul class="cat-list">
- <li class="top-row even">
- <a class="cat-link" href="/information-technology"> <span class="cat-name">Information Technology</span> <span class="subheading cat-desc">Technology Lab</span> </a>
+ <script>
+ <![CDATA[
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+ })(window,document,'script','dataLayer','GTM-NLXNPCQ');
+ ]]>
+ </script><!-- End Google Tag Manager -->
+ <!-- OneTrust Cookies Consent Notice start -->
+
+ <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="b10882a1-8446-4e7d-bfb2-ce2c770ad910"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ function OptanonWrapper(){};
+ //]]>
+ </script>
+ <script src="https://cdn.cookielaw.org/opt-out/otCCPAiab.js" type="text/javascript" charset="UTF-8" ccpa-opt-out-ids="C0002,C0003,C0004,C0005" ccpa-opt-out-geo="ca" ccpa-opt-out-lspa="true"></script><!-- OneTrust Cookies Consent Notice end -->
+
+ <script src="https://www.googletagservices.com/tag/js/gpt.js" id="gpt-script" async="async"></script>
+ <script>
+ <![CDATA[
+ window.googletag=window.googletag||{};window.googletag.cmd=window.googletag.cmd||[];window.cns=window.cns||{};window.cns.queue=[];window.cns.async=function(s,c){cns.queue.push({service:s,callback:c})};window.sparrowQueue=window.sparrowQueue||[];
+ ]]>
+ </script>
+ <link rel="dns-prefetch" href="//aax.amazon-adsystem.com" />
+ <link rel="preconnect" href="//aax.amazon-adsystem.com" crossorigin="" />
+ <link rel="preconnect" href="https://mb.moatads.com" crossorigin="" />
+ <script src="https://c.amazon-adsystem.com/aax2/apstag.js" async="async"></script>
+ <script src="https://cdn.arstechnica.net/cns/prebid.min.js?v=1597375105"></script>
+ <script src="https://js-sec.indexww.com/ht/p/183973-93942139695505.js" async="async"></script>
+ <script src="https://z.moatads.com/condenastprebidheader987326845656/moatheader.js" async="async"></script>
+ <script>
+ <![CDATA[
+ window.cns.pageContext = {"contentType":"article","templateType":"article","channel":"information-technology","subChannel":"","slug":"just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers","server":"production","keywords":{"tags":["denial-of-service-attack","exploits","minecraft","vulnerabilities"],"cm":[],"platform":["wordpress"],"copilotid":""}};
+ ]]>
+ </script>
+ <script src="https://cdn.arstechnica.net/cns/ars-technica.min.js?v=1597375105"></script>
+ <script type="text/javascript" src="https://cdn.arstechnica.net/wp-content/themes/ars/assets/js/ars-32ecec341f.ads.us.js"></script>
+ </head>
+ <body class="post-template-default single single-post postid-648287 single-format-standard grid-view light blog-us">
+ <!-- Google Tag Manager (noscript) -->
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NLXNPCQ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) -->
+ <aside class="ad ad_crown" aria-label="Top of page advertisement"></aside>
+ <div class="site-wrapper">
+ <a class="screen-reader-text skip-link" href="#main" aria-label="Skip to main content">Skip to main content</a>
+ <header class="site-header">
+ <div class="header-left">
+ <a href="https://arstechnica.com" id="header-logo" title="Ars Technica Homepage"></a>
+ </div>
+ <div class="header-right">
+ <nav id="header-nav-primary">
+ <ul>
+ <li>
+ <a class="nav-link section-information-technology active" href="/information-technology/">Biz &amp; IT</a>
+ </li>
+ <li>
+ <a class="nav-link section-gadgets" href="/gadgets/">Tech</a>
+ </li>
+ <li>
+ <a class="nav-link section-science" href="/science/">Science</a>
+ </li>
+ <li>
+ <a class="nav-link section-tech-policy" href="/tech-policy/">Policy</a>
+ </li>
+ <li>
+ <a class="nav-link section-cars" href="/cars/">Cars</a>
+ </li>
+ <li>
+ <a class="nav-link section-gaming" href="/gaming/">Gaming &amp; Culture</a>
+ </li>
+ <li>
+ <a class="nav-link store" href="/store/">Store</a>
+ </li>
+ <li>
+ <a class="nav-link forums" href="/civis/">Forums</a>
+ </li>
+ </ul>
+ </nav><a href="/store/product/subscriptions/" class="header-highlight-link">Subscribe</a>
+ <div class="dropdown" id="header-search">
+ <a href="/search/" class="dropdown-toggle search-toggle" aria-label="Search" aria-expanded="false"></a>
+ <div class="dropdown-content">
+ <form action="/search/" method="get" id="search_form" name="search_form">
+ <input type="hidden" name="ie" value="UTF-8" /> <input type="text" name="q" id="hdr_search_input" value="" aria-label="Search..." placeholder="Search..." />
+ </form><a class="nav-search-close">Close</a>
+ </div>
+ </div>
+ <div class="dropdown dropdown-mega" id="header-burger">
+ <a href="#site-menu" class="dropdown-toggle" aria-label="Menu" aria-expanded="false"></a>
+ <div id="site-menu" class="dropdown-content">
+ <section class="burger-navigate">
+ <h3>
+ Navigate
+ </h3>
+ <ul>
+ <li>
+ <a class="nav-link store" href="/store/">Store</a>
</li>
- <li class="top-row odd">
- <a class="cat-link" href="/gadgets"> <span class="cat-name">Product News &amp; Reviews</span> <span class="subheading cat-desc">Gear &amp; Gadgets</span> </a>
+ <li>
+ <a class="nav-link subscribe" href="/store/product/subscriptions/">Subscribe</a>
</li>
- <li class="even">
- <a class="cat-link" href="/business"> <span class="cat-name">Business of Technology</span> <span class="subheading cat-desc">Ministry of Innovation</span> </a>
+ <li>
+ <a class="nav-link videos" href="http://video.arstechnica.com/">Videos</a>
</li>
- <li class="odd">
- <a class="cat-link" href="/security"> <span class="cat-name">Security &amp; Hacktivism</span> <span class="subheading cat-desc">Risk Assessment</span> </a>
+ <li>
+ <a class="nav-link section-features" href="/features/">Features</a>
</li>
- <li class="even">
- <a class="cat-link" href="/tech-policy"> <span class="cat-name">Civilization &amp; Discontents</span> <span class="subheading cat-desc">Law &amp; Disorder</span> </a>
+ <li>
+ <a class="nav-link section-reviews" href="/reviews/">Reviews</a>
</li>
- <li class="odd">
- <a class="cat-link" href="/apple"> <span class="cat-name">The Apple Ecosystem</span> <span class="subheading cat-desc">Infinite Loop</span> </a>
+ </ul>
+ <ul>
+ <li>
+ <a class="nav-link page-rss-feeds" href="/rss-feeds/">RSS Feeds</a>
</li>
- <li class="even">
- <a class="cat-link" href="/gaming"> <span class="cat-name">Gaming &amp; Entertainment</span> <span class="subheading cat-desc">Opposable Thumbs</span> </a>
+ <li>
+ <a class="nav-link mobile" href="/?view=mobile">Mobile Site</a>
</li>
- <li class="odd">
- <a class="cat-link" href="/science"> <span class="cat-name">Science &amp; Exploration</span> <span class="subheading cat-desc">The Scientific Method</span> </a>
+ </ul>
+ <ul>
+ <li>
+ <a class="nav-link page-about-us" href="/about-us/">About Ars</a>
+ </li>
+ <li>
+ <a class="nav-link page-staff-directory" href="/staff-directory/">Staff Directory</a>
</li>
- <li class="even">
- <a class="cat-link" href="/cars"> <span class="cat-name">All Things Automotive</span> <span class="subheading cat-desc">Cars Technica</span> </a>
+ <li>
+ <a class="nav-link page-contact-us" href="/contact-us/">Contact Us</a>
</li>
</ul>
- </div>
- <aside class="drop-extras">
- <style type="text/css">
- #layout-swap {
- margin-top: -6px;
- color: #808f95
- }
- </style>
- <aside id="layout-swap"> <span class="subheading">Layout:</span>
- <ul>
- <li class="grid active"> <a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=grid"><span>Grid View</span></a> </li>
- <li class="article"> <a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=archive"><span>Article View</span></a> </li>
- </ul>
- </aside>
- <h2 class="subheading notched">Site Theme</h2>
- <ul id="theme-switch">
- <li class="light active"> <a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?theme=light"><span class="subheading">Dark on light</span></a> </li>
- <li class="dark "> <a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?theme=dark"><span class="subheading">Light on dark</span></a> </li>
+ <ul>
+ <li>
+ <a class="nav-link page-advertise-with-us" href="/advertise-with-us/">Advertise with Ars</a>
+ </li>
+ <li>
+ <a class="nav-link page-reprints" href="/reprints/">Reprints</a>
+ </li>
</ul>
- <div id="explore-ars">
- <h2 class="subheading notched">Explore Ars</h2>
- <ul>
- <!-- <li><a href="/reviews/">Reviews</a></li> -->
- <li><a href="/video/">Video</a></li>
- <li><a href="/staff/">Staff Blogs</a></li>
- <li><a href="/features/">Feature Archive</a></li>
- <li><a href="/staff-directory/">Staff Directory</a></li>
- <li><a href="/contact-us/">Contact Us</a></li>
- </ul>
- </div>
- <div id="featured-disciplines">
- <h2 class="subheading notched">Featured Disciplines</h2>
- <ul>
- <li><a href="/discipline/photography/">Photography</a></li>
- <li><a href="/discipline/productivity/">Productivity</a></li>
- <li><a href="/discipline/cloud-2/">Cloud</a></li>
- <!-- <li><a href="/discipline/gadgets-3/">Gadgets</a></li> -->
- <li><a href="/discipline/tablets-2/">Tablets</a></li>
- </ul>
+ </section>
+ <section class="burger-filter">
+ <h3>
+ Filter by topic
+ </h3>
+ <ul id="burger-nav-primary">
+ <li>
+ <a class="nav-link section-information-technology active" href="/information-technology/">Biz &amp; IT</a>
+ </li>
+ <li>
+ <a class="nav-link section-gadgets" href="/gadgets/">Tech</a>
+ </li>
+ <li>
+ <a class="nav-link section-science" href="/science/">Science</a>
+ </li>
+ <li>
+ <a class="nav-link section-tech-policy" href="/tech-policy/">Policy</a>
+ </li>
+ <li>
+ <a class="nav-link section-cars" href="/cars/">Cars</a>
+ </li>
+ <li>
+ <a class="nav-link section-gaming" href="/gaming/">Gaming &amp; Culture</a>
+ </li>
+ <li>
+ <a class="nav-link store" href="/store/">Store</a>
+ </li>
+ <li>
+ <a class="nav-link forums" href="/civis/">Forums</a>
+ </li>
+ </ul>
+ </section>
+ <section class="burger-settings">
+ <h3>
+ Settings
+ </h3>
+ <div>
+ <div class="burger-layout">
+ <p>
+ Front page layout
+ </p>
+ <div class="burger-layout-grid">
+ <a rel="nofollow" href="http://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=grid" class=""><br />
+ Grid
+ <div class="faux-radio active"></div></a>
+ </div>
+ <div class="burger-layout-list">
+ <a rel="nofollow" href="http://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=archive" class=""><br />
+ List
+ <div class="faux-radio"></div></a>
+ </div>
+ </div>
+ <div class="burger-theme">
+ <p>
+ Site theme
+ </p>
+ <div class="burger-theme-light">
+ <a rel="nofollow" href="http://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?theme=light" class=""><span><span>Black on white</span></span>
+ <div class="faux-radio active"></div></a>
+ </div>
+ <div class="burger-theme-dark">
+ <a rel="nofollow" href="http://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?theme=dark" class=""><span><span>White on black</span></span>
+ <div class="faux-radio"></div></a>
+ </div>
+ </div>
</div>
- </aside>
+ </section>
</div>
- </li>
- <li class="has-children" id="my-stories"> <a href="#">My Stories: <span class="unread-count">0</span></a>
- <div class="dropdown">
- <nav class="my-stories-nav first">
- <h2 class="subheading notched">New Since Last Visit <span class="unread-count"></span></h2>
- <ol class="new-stories with-numbers"></ol>
- <footer><a class="subheading" href="#" id="more-unread-stories">See more news stories</a></footer>
- </nav>
- <nav class="my-stories-nav middle">
- <h2 class="subheading notched">We Recommend</h2>
- <ol class="recommendations"></ol>
- </nav>
- <nav class="my-stories-nav">
- <h2 class="subheading notched">My Discussions</h2>
- <p class="discussions disabled">Log in to track your discussions.</p>
- </nav>
+ </div>
+ <div class="dropdown dropdown-mega" id="header-account">
+ <a href="https://arstechnica.com/civis/ucp.php?mode=login&amp;return_to=%2Finformation-technology%2F2015%2F04%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" class="dropdown-toggle" aria-expanded="false">Sign in</a>
+ <div class="dropdown-content">
+ <section class="profile-activity">
+ <h3>
+ Comment activity
+ </h3>
+ <p>
+ Sign up or login to join the discussions!
+ </p>
+ </section>
+ <section class="profile-settings">
+ <form id="login-form" action="https://arstechnica.com/civis/ucp.php?mode=login" method="post" name="login-form">
+ <input type="text" name="username" id="username" placeholder="Username or Email" aria-label="Username or Email" /> <input type="password" name="password" id="password" placeholder="Password" aria-label="Password" /> <input type="submit" value="Submit" class="button button-orange button-wide" name="login" /> <label id="remember-label"><input type="checkbox" name="autologin" id="autologin" /> Stay logged in</label> <span>|</span> <a href="/civis/ucp.php?mode=sendpassword">Having trouble?</a> <input type="hidden" name="redirect" value="./ucp.php?mode=login&amp;autoredirect=1&amp;return_to=%2Finformation-technology%2F2015%2F04%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" /> <input type="hidden" name="return_to" value="/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/" />
+ </form>
+ <div class="register-account">
+ <span>Sign up to comment and more</span> <a href="https://arstechnica.com/civis/ucp.php?mode=register" class="signup-btn button button-wide">Sign up</a>
+ </div>
+ </section>
</div>
- </li>
- <li class="no-children"><a href="http://arstechnica.com/civis/">Forums</a></li>
- <li class="no-children subscribe"> <a href="/subscriptions/">Subscribe</a> </li>
- <li class="no-children"><a href="/jobs/">Jobs</a></li>
- <li class="no-children"><a href="/feature-series/chasing-brilliance/">Ars Consortium</a></li>
- <li id="search-container" class="right inactive">
- <a id="search-switch" href="/search/"></a>
- <form action="/search/" method="GET" id="search_form">
- <input type="hidden" name="ie" value="UTF-8"/>
- <input type="text" name="q" id="hdr_search_input" value=""/>
- <input type="submit" value=""/> </form>
- <style type="text/css">
- table.gstl_50.gssb_c {
- top: 30px !important;
- left: 0 !important;
- width: 100% !important;
- }
- </style>
- </li>
- </ul>
- </nav>
- </header>
- <section id="content" class="clearfix">
- <!-- cache hit 459:home/toppost:f3fda06d4fb35e8aa360e369ff702613 -->
- <h1 id="archive-head" class="subheading thick-divide-bottom">
- <a href="http://arstechnica.com/security/"> <span class="archive-name">Risk Assessment</span>
- <span class="divider"> / </span>
- <span class="archive-desc">Security &amp; Hacktivism</span>
- </a></h1>
- <script type="text/javascript">
- ars.ARTICLE = {
- "url": "http:\/\/arstechnica.com\/security\/2015\/04\/16\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/",
- "short_url": "http:\/\/ars.to\/1CSWnf5",
- "title": "Just-released Minecraft exploit makes it easy to crash game servers",
- "author": 329388,
- "id": 648287,
- "topic": 1280621,
- "pages": 1,
- "current_page": 1,
- "superscroll": false,
- "promoted": [],
- "single_page": false,
- "comments": 75,
- "fullwidth": false
- };
- </script>
- <article itemscope="" itemtype="http://schema.org/NewsArticle" class="standalone">
- <header>
- <h1 class="heading" itemprop="headline">Just-released <i>Minecraft</i> exploit makes it easy to crash game servers</h1>
- <h2 class="standalone-deck" itemprop="description">Two-year-old bug exposes thousands of servers to crippling attack.</h2>
- <div class="post-meta">
- <p class="byline" itemprop="author creator" itemscope="" itemtype="http://schema.org/Person"> by <a itemprop="url" href="http://arstechnica.com/author/dan-goodin/" rel="author"><span itemprop="name">Dan Goodin</span></a> - <span class="date" data-time="1429214521">Apr 16, 2015 8:02 pm UTC</span> </p>
- <div class="corner-info">
- <ul class="share-buttons">
- <li class="share-facebook">
- <a href="https://www.facebook.com/sharer.php?u=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" target="_blank" data-dialog="400:368"> <span class="share-text">Share</span> </a>
- </li>
- <li class="share-twitter">
- <a href="https://twitter.com/share?text=Just-released+Minecraft+exploit+makes+it+easy+to+crash+game+servers&amp;url=http%3A%2F%2Fars.to%2F1CSWnf5" target="_blank" data-dialog="364:250"> <span class="share-text">Tweet</span> </a>
- </li>
- <li class="share-google">
- <a href="https://plus.google.com/share?url=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" target="_blank" data-dialog="485:600"> <span class="share-text">Google</span> </a>
- </li>
- <li class="share-reddit">
- <a href="https://www.reddit.com/submit?url=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F&amp;title=Just-released+Minecraft+exploit+makes+it+easy+to+crash+game+servers" target="_blank"> <span class="share-text">Reddit</span> </a>
- </li>
- </ul> <a title="51 posters participating" class="comment-count" href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?comments=1"><span>75</span></a> </div>
</div>
- </header>
- <section id="article-guts">
- <div itemprop="articleBody" class="article-content clearfix">
- <figure class="intro-image image center full-width" style="width:640px"> <img src="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" width="640" height="331"/>
- <figcaption class="caption">
- <div class="caption-credit"> <a rel="nofollow" href="https://en.wikipedia.org/wiki/Kernel_panic#/media/File:Kernel-panic.jpg">Kevin</a> </div>
- </figcaption>
- </figure>
- <!-- cache hit 459:single/related:1ad28a5dc0a24868be6b031b5fdecb2e -->
- <!-- empty -->
- <p>A flaw in the wildly popular online game <em>Minecraft</em> makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.</p>
- <p>"I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a <a href="http://blog.ammaraskar.com/minecraft-vulnerability-advisory">blog post published Thursday</a>, 21 months, he said, after privately reporting the bug to <em>Minecraft</em> developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."</p>
- <p>The bug resides in the <a href="https://github.com/ammaraskar/pyCraft">networking internals of the <em>Minecraft </em>protocol</a>. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. <em>Minecraft</em> items can also store arbitrary metadata in a file format known as <a href="http://wiki.vg/NBT">Named Binary Tag (NBT)</a>, which allows complex data structures to be kept in hierarchical nests. Askar has released <a href="https://github.com/ammaraskar/pyCraft/tree/nbt_exploit">proof-of-concept attack code</a> he said exploits the vulnerability to crash any server hosting the game. Here's how it works.</p>
- <blockquote>
- <p>The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to <em>craft</em> a packet that is incredibly complex for the server to deserialize but trivial for us to generate.</p>
- <p>In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like.</p>
- <div class="highlight"> <pre><code class="language-javascript" data-lang="javascript"><span class="nx">rekt</span><span class="o">:</span> <span class="p">{</span>
+ </div>
+ </header>
+ <main id="main" class="content-wrapper">
+ <script type="text/javascript">
+ //<![CDATA[
+ ars.ARTICLE = {"url":"https:\/\/arstechnica.com\/information-technology\/2015\/04\/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers\/","short_url":"https:\/\/arstechnica.com\/?p=648287","title":"Just-released Minecraft exploit makes it easy to crash game servers","author":329388,"id":648287,"topic":1280621,"pages":1,"current_page":1,"superscroll":false,"promoted":[],"single_page":false,"comments":75,"fullwidth":false,"slug":"just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers","arsStaff":{"104481":{"name":"Aaron Zimmerman","title":"Copyeditor","staff":true},"1002":{"name":"Aurich Lawson","title":"Creative Director","staff":true},"509873":{"name":"Beth Mole","title":"Health Reporter","staff":true},"453791":{"name":"Cathleen O'Grady","title":"Contributing science reporter","staff":true},"102179":{"name":"Chris Lee","title":"Associate writer","staff":true},"821742":{"name":"Corey Gaskin","title":"Senior Commerce Writer","staff":true},"329388":{"name":"Dan Goodin","title":"Security Editor","staff":true},"254631":{"name":"Diana Gitig","title":"Associate Writer","staff":false},"25862":{"name":"Eric Bangeman","title":"Managing Editor","staff":true},"512413":{"name":"Eric Berger","title":"Senior Space Editor","staff":true},"46707":{"name":"Iljitsch van Beijnum","title":"Associate Writer","staff":false},"316010":{"name":"Jason Marlin","title":"Technical Director","staff":true},"746799":{"name":"Jennifer Ouellette","title":"Senior Writer","staff":true},"15365":{"name":"Jeremy Reimer","title":"Senior Niche Technology Historian","staff":false},"4086":{"name":"Jim Salter","title":"Technology Reporter","staff":true},"52979":{"name":"John Timmer","title":"Senior Science Editor","staff":true},"312082":{"name":"Jon Brodkin","title":"Senior IT Reporter","staff":true},"14317":{"name":"Jonathan M. Gitlin","title":"Automotive Editor","staff":true},"786739":{"name":"Kate Cox","title":"Tech Policy Reporter","staff":true},"998":{"name":"Ken Fisher","title":"Editor in Chief","staff":true},"440179":{"name":"Kerry Staurseth","title":"Associate Copyeditor","staff":true},"328283":{"name":"Kyle Orland","title":"Senior Gaming Editor","staff":true},"10243":{"name":"Lee Hutchinson","title":"Senior Technology Editor","staff":true},"173191":{"name":"Matthew Lasar","title":"Associate writer","staff":true},"182268":{"name":"Nate Anderson","title":"Deputy Editor","staff":true},"330533":{"name":"Nathan Mattise","title":"Features Editor","staff":true},"1991":{"name":"Ohrmazd","title":"","staff":false},"391727":{"name":"Ron Amadeo","title":"Reviews Editor","staff":true},"348927":{"name":"Sam Machkovech","title":"Tech Culture Editor","staff":true},"588289":{"name":"Samuel Axon","title":"Senior Reviews Editor","staff":true},"294205":{"name":"Scott K. Johnson","title":"Associate Writer","staff":true},"671621":{"name":"Steven Klein","title":"Developer","staff":false},"173910":{"name":"Timothy B. Lee","title":"Senior tech policy reporter","staff":true}},"tags":["denial-of-service-attack","exploits","minecraft","vulnerabilities"],"zen_mode":false,"vote_sentiments":[{"sentiment_id":"1","sentiment":"agree","direction":"positive","icon":null,"label":"Agree"},{"sentiment_id":"3","sentiment":"interesting","direction":"positive","icon":null,"label":"Interesting"},{"sentiment_id":"5","sentiment":"funny","direction":"positive","icon":null,"label":"Funny"},{"sentiment_id":"6","sentiment":"addsto","direction":"positive","icon":null,"label":"Adds to Story"},{"sentiment_id":"7","sentiment":"disagree","direction":"negative","icon":null,"label":"Disagree"},{"sentiment_id":"8","sentiment":"inaccurate","direction":"negative","icon":null,"label":"Inaccurate"},{"sentiment_id":"11","sentiment":"pointless","direction":"negative","icon":null,"label":"Doesn't Contribute"},{"sentiment_id":"12","sentiment":"abusive","direction":"negative","icon":null,"label":"Abusive"}]};
+ //]]>
+ </script>
+ <article itemscope="itemscope" itemtype="http://schema.org/NewsArticle" class="article-single standalone intro-default" id="">
+ <div class="column-wrapper">
+ <div class="left-column">
+ <header class="article-header">
+ <h4 class="post-upperdek">
+ Biz &amp; IT —
+ </h4>
+ <h1 itemprop="headline">
+ Just-released <i>Minecraft</i> exploit makes it easy to crash game servers
+ </h1>
+ <h2 itemprop="description">
+ Two-year-old bug exposes thousands of servers to crippling attack.
+ </h2>
+ <section class="post-meta">
+ <p class="byline" itemprop="author creator" itemscope="itemscope" itemtype="http://schema.org/Person">
+ <a itemprop="url" href="https://arstechnica.com/author/dan-goodin/" rel="author"><span itemprop="name">Dan Goodin</span></a> - <time class="date" data-time="1429214521" datetime="2015-04-16T20:02:01+00:00">Apr 16, 2015 8:02 pm UTC</time>
+ </p>
+ </section>
+ </header>
+ <section class="article-guts">
+ <div itemprop="articleBody" class="article-content post-page">
+ <figure class="intro-image intro-left">
+ <img src="https://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" alt="Just-released Minecraft exploit makes it easy to crash game servers" />
+ <figcaption class="caption">
+ <div class="caption-credit">
+ <a rel="nofollow" class="caption-link" href="https://en.wikipedia.org/wiki/Kernel_panic#/media/File:Kernel-panic.jpg">Kevin</a>
+ </div>
+ </figcaption>
+ </figure>
+ <aside id="social-left" class="social-left" aria-label="Read the comments or share this article">
+ <a title="51 posters participating" class="comment-count icon-comment-bubble-down" href="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?comments=1">
+ <h4 class="comment-count-before">
+ reader comments
+ </h4><span class="comment-count-number">75</span> <span class="visually-hidden">with 51 posters participating</span></a>
+ <div class="share-links">
+ <h4>
+ Share this story
+ </h4>
+ <ul>
+ <li>
+ <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287" target="_blank" class="social-icon share-facebook" title="Share on Facebook"><span class="visually-hidden">Share on Facebook</span></a>
+ </li>
+ <li>
+ <a href="https://twitter.com/share?text=Just-released+%3Ci%3EMinecraft%3C%2Fi%3E+exploit+makes+it+easy+to+crash+game+servers&amp;url=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287" target="_blank" class="social-icon share-twitter" title="Share on Twitter"><span class="visually-hidden">Share on Twitter</span></a>
+ </li>
+ <li>
+ <a href="https://www.reddit.com/submit?url=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287&amp;title=Just-released+%3Ci%3EMinecraft%3C%2Fi%3E+exploit+makes+it+easy+to+crash+game+servers" target="_blank" class="social-icon share-reddit" title="Share on Reddit"><span class="visually-hidden">Share on Reddit</span></a>
+ </li>
+ </ul>
+ </div>
+ </aside><!-- cache miss 581:single/related:5a5daf59fa5245a64fe8615caa0b1d1b --><!-- empty -->
+ <p>
+ A flaw in the wildly popular online game <em>Minecraft</em> makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.
+ </p>
+ <p>
+ "I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a <a href="http://blog.ammaraskar.com/minecraft-vulnerability-advisory">blog post published Thursday</a>, 21 months, he said, after privately reporting the bug to <em>Minecraft</em> developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."
+ </p>
+ <p>
+ The bug resides in the <a href="https://github.com/ammaraskar/pyCraft">networking internals of the <em>Minecraft</em> protocol</a>. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. <em>Minecraft</em> items can also store arbitrary metadata in a file format known as <a href="http://wiki.vg/NBT">Named Binary Tag (NBT)</a>, which allows complex data structures to be kept in hierarchical nests. Askar has released <a href="https://github.com/ammaraskar/pyCraft/tree/nbt_exploit">proof-of-concept attack code</a> he said exploits the vulnerability to crash any server hosting the game. Here's how it works.
+ </p>
+ <blockquote>
+ <p>
+ The vulnerability stems from the fact that the client is allowed to send the server information about certain slots. This, coupled with the NBT format’s nesting allows us to <em>craft</em> a packet that is incredibly complex for the server to deserialize but trivial for us to generate.
+ </p>
+ <p>
+ In my case, I chose to create lists within lists, down to five levels. This is a json representation of what it looks like.
+ </p>
+ <div class="highlight">
+ <pre><code class="language-javascript" data-lang="javascript"><span class="nx">rekt</span><span class="o">:</span> <span class="p">{</span>
<span class="nx">list</span><span class="o">:</span> <span class="p">[</span>
<span class="nx">list</span><span class="o">:</span> <span class="p">[</span>
<span class="nx">list</span><span class="o">:</span> <span class="p">[</span>
@@ -311,455 +392,243 @@
<span class="p">...</span>
<span class="p">]</span>
<span class="p">...</span>
-<span class="p">}</span></code></pre> </div>
- <p>The root of the object, <code>rekt</code>, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of <code>10^5 * 300 = 30,000,000</code> lists.</p>
- <p>And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes.</p>
- <p>Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to <code>2^15 - 1</code>. Now that the length is a varint capable of storing integers up to <code>2^28</code>, our potential for attack has increased significantly.</p>
- <p>When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load.</p>
- <p>This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the <a href="http://wiki.vg/Protocol#Player_Block_Placement">0x08: Block Placement Packet</a> and <a href="http://wiki.vg/Protocol#Creative_Inventory_Action">0x10: Creative Inventory Action</a>.</p>
- <p>The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented.</p>
- <p>These were the fixes that I recommended to Mojang 2 years ago.</p>
- </blockquote>
- <p>Ars is asking Mojang for comment and will update this post if company officials respond.</p>
+<span class="p">}</span></code></pre>
+ </div>
+ <p>
+ The root of the object, <code>rekt</code>, contains 300 lists. Each list has a list with 10 sublists, and each of those sublists has 10 of their own, up until 5 levels of recursion. That’s a total of <code>10^5 * 300 = 30,000,000</code> lists.
+ </p>
+ <p>
+ And this isn’t even the theoretical maximum for this attack. Just the nbt data for this payload is 26.6 megabytes. But luckily Minecraft implements a way to compress large packets, lucky us! zlib shrinks down our evil data to a mere 39 kilobytes.
+ </p>
+ <p>
+ Note: in previous versions of Minecraft, there was no protocol wide compression for big packets. Previously, NBT was sent compressed with gzip and prefixed with a signed short of its length, which reduced our maximum payload size to <code>2^15 - 1</code>. Now that the length is a varint capable of storing integers up to <code>2^28</code>, our potential for attack has increased significantly.
+ </p>
+ <p>
+ When the server will decompress our data, it’ll have 27 megs in a buffer somewhere in memory, but that isn’t the bit that’ll kill it. When it attempts to parse it into NBT, it’ll create java representations of the objects meaning suddenly, the sever is having to create several million java objects including ArrayLists. This runs the server out of memory and causes tremendous CPU load.
+ </p>
+ <p>
+ This vulnerability exists on almost all previous and current Minecraft versions as of 1.8.3, the packets used as attack vectors are the <a href="http://wiki.vg/Protocol#Player_Block_Placement">0x08: Block Placement Packet</a> and <a href="http://wiki.vg/Protocol#Creative_Inventory_Action">0x10: Creative Inventory Action</a>.
+ </p>
+ <p>
+ The fix for this vulnerability isn’t exactly that hard, the client should never really send a data structure as complex as NBT of arbitrary size and if it must, some form of recursion and size limits should be implemented.
+ </p>
+ <p>
+ These were the fixes that I recommended to Mojang 2 years ago.
+ </p>
+ </blockquote>
+ <p>
+ Ars is asking Mojang for comment and will update this post if company officials respond.
+ </p>
+ <div id="action_button_container"></div>
+ </div>
+ </section>
+ </div>
+ <div class="xrail">
+ <div class="xrail-content">
+ <aside class="ad ad_xrail ad_xrail_top" aria-label="Top sidebar advertisement"></aside>
+ <aside class="ad_native ad_native_xrail" aria-label="Sidebar native advertisement"></aside>
+ </div>
+ </div>
</div>
- <div class="article-expander">
- <p><a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/">Expand full story</a></p>
+ <div class="column-wrapper">
+ <div class="left-column">
+ <div id="social-footer">
+ <a title="51 posters participating" class="comment-count icon-comment-bubble-down" href="https://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?comments=1">
+ <h4 class="comment-count-before">
+ reader comments
+ </h4><span class="comment-count-number">75</span> <span class="visually-hidden">with 51 posters participating</span></a>
+ <div class="share-links">
+ <h4>
+ Share this story
+ </h4>
+ <ul>
+ <li>
+ <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287" target="_blank" class="social-icon share-facebook" title="Share on Facebook"><span class="visually-hidden">Share on Facebook</span></a>
+ </li>
+ <li>
+ <a href="https://twitter.com/share?text=Just-released+%3Ci%3EMinecraft%3C%2Fi%3E+exploit+makes+it+easy+to+crash+game+servers&amp;url=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287" target="_blank" class="social-icon share-twitter" title="Share on Twitter"><span class="visually-hidden">Share on Twitter</span></a>
+ </li>
+ <li>
+ <a href="https://www.reddit.com/submit?url=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D648287&amp;title=Just-released+%3Ci%3EMinecraft%3C%2Fi%3E+exploit+makes+it+easy+to+crash+game+servers" target="_blank" class="social-icon share-reddit" title="Share on Reddit"><span class="visually-hidden">Share on Reddit</span></a>
+ </li>
+ </ul>
+ </div>
+ </div><!-- cache hit 581:single/author:2814756d09510ff24ad530ca37a5a9a9 -->
+ <section class="article-author">
+ <a style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2018/10/Dang.jpg');" class="author-photo" href="/author/dan-goodin" tabindex="-1" role="presentation" aria-hidden="true"></a>
+ <div class="author-bio">
+ <section class="author-bio-top">
+ <a href="/author/dan-goodin" class="author-name">Dan Goodin</a> Dan is the Security Editor at Ars Technica, which he joined in 2012 after working for The Register, the Associated Press, Bloomberg News, and other publications.
+ </section>
+ <section class="author-social">
+ <strong>Email</strong> <a href="mailto:[email protected]">[email protected]</a> <span class="slashes">//</span> <strong>Twitter</strong> <a href="https://www.twitter.com/dangoodin001" target="_blank">@dangoodin001</a>
+ </section>
+ </div>
+ </section>
+ </div>
+ <div class="xrail"></div>
</div>
- </section>
- <div id="article-footer-wrap">
- <section id="comments-area">
- <a name="comments-bar"></a>
- <div class="comments-bar"> <a class="subheading comments-read-link" href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?comments=1"><span class="text">Reader comments</span> <span class="comment-count"><span proptype="">75</span></span></a> </div>
- <div id="comments-container"></div>
- <div id="comments-posting-container" class="thick-divide-bottom">
- <p id="reply">You must <a href="/civis/ucp.php?mode=login" class="vote_login">login or create an account</a> to comment.</p>
+ <div id="article-footer-wrap">
+ <aside class="ad ad_fullwidth fullwidth" aria-label="Full width advertisement"></aside>
+ <section id="comments-area" class="comments-area column-wrapper">
+ <div class="row comments-row left-column">
+ <a name="comments-bar" id="comments-bar"></a>
+ <div id="comments-container"></div>
+ <div id="comments-posting-container" class="thick-divide-bottom">
+ <p id="reply">
+ You must <a href="https://arstechnica.com/civis/ucp.php?mode=login&amp;return_to/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/" class="vote_login">login or create an account</a> to comment.
+ </p>
+ </div>
+ </div>
+ <div class="xrail xrail-comments">
+ <div class="xrail-content xrail-content-comments">
+ <aside class="ad ad_xrail ad_xrail_comments" aria-label="Comments sidebar advertisement"></aside>
+ </div>
+ </div>
+ </section>
+ <section class="inline-playlist">
+ <div class="ars-video-playlist">
+ <h3 class="ars-video-playlist-module-header">
+ Channel <span>Ars Technica</span>
+ </h3>
+ <div class="ars-video-playlist-module" data-playlist-id="arstechnica-channel-ars-information-technology" data-video-options="[]"></div>
+ </div>
+ </section>
+ <div class="prev-next-links">
+ <a href="https://arstechnica.com/tech-policy/2015/04/dozens-of-us-government-online-whistleblower-sites-not-secured-by-https/" rel="prev"><span class="arrow">←</span> Previous story</a> <a href="https://arstechnica.com/gaming/2015/04/hidden-files-suggest-street-fighters-ryu-may-come-to-smash-bros/" rel="next">Next story <span class="arrow">→</span></a>
</div>
- </section>
- <aside class="thin-divide-bottom">
- <ul class="share-buttons">
- <li class="share-facebook">
- <a href="https://www.facebook.com/sharer.php?u=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" target="_blank" data-dialog="400:368"> <span class="share-text">Share</span>
- <div class="share-count-container">
- <div class="share-count">-</div>
+ <footer id="article-footer">
+ <div id="recommendations-footer">
+ <div id="story-recommendations">
+ <div class="heading-column">
+ <h3>
+ Related Stories
+ </h3>
</div>
- </a>
- </li>
- <li class="share-twitter">
- <a href="https://twitter.com/share?text=Just-released+Minecraft+exploit+makes+it+easy+to+crash+game+servers&amp;url=http%3A%2F%2Fars.to%2F1CSWnf5" target="_blank" data-dialog="364:250"> <span class="share-text">Tweet</span>
- <div class="share-count-container">
- <div class="share-count">-</div>
+ <ul id="story-recs" class="rec-wrap"></ul>
+ </div>
+ <div id="sponsored-recommendations">
+ <div class="heading-column">
+ <h3>
+ Sponsored Stories
+ </h3><a href="http://www.outbrain.com/what-is/default/en" target="_blank">Powered by </a>
</div>
- </a>
- </li>
- <li class="share-google">
- <a href="https://plus.google.com/share?url=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F" target="_blank" data-dialog="485:600"> <span class="share-text">Google</span>
- <div class="share-count-container">
- <div class="share-count">-</div>
+ <ul id="outbrain-recs"></ul>
+ </div>
+ <div id="latest-stories">
+ <div class="heading-column">
+ <h3>
+ Today on Ars
+ </h3>
</div>
- </a>
+ <ul id="latest-recs" class="rec-wrap"></ul>
+ </div>
+ </div>
+ </footer>
+ </div>
+ </article>
+ </main>
+ <footer class="site-footer">
+ <nav class="nav-footer">
+ <section>
+ <ul>
+ <li>
+ <a href="/store/">Store</a>
</li>
- <li class="share-reddit">
- <a href="https://www.reddit.com/submit?url=http%3A%2F%2Farstechnica.com%2Fsecurity%2F2015%2F04%2F16%2Fjust-released-minecraft-exploit-makes-it-easy-to-crash-game-servers%2F&amp;title=Just-released+Minecraft+exploit+makes+it+easy+to+crash+game+servers" target="_blank"> <span class="share-text">Reddit</span>
- <div class="share-count-container">
- <div class="share-count">-</div>
- </div>
- </a>
+ <li>
+ <a href="/store/product/subscriptions/">Subscribe</a>
+ </li>
+ <li>
+ <a href="/about-us/">About Us</a>
+ </li>
+ <li>
+ <a href="/rss-feeds/">RSS Feeds</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://arstechnica.com/information-technology/2015/04/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=mobile">View Mobile Site</a>
</li>
</ul>
- </aside>
- <!-- cache hit 459:single/author:ec67ae7d8397f22698e2822e36453902 -->
- <section class="article-author clearfix-redux">
- <a href="/author/dan-goodin"><img width="47" height="47" src="http://cdn.arstechnica.net/wp-content/uploads/authors/Dan-Goodin-sq.jpg"/></a>
- <p><a href="/author/dan-goodin" class="author-name">Dan Goodin</a> / Dan is the Security Editor at Ars Technica, which he joined in 2012 after working for The Register, the Associated Press, Bloomberg News, and other publications.</p>
</section>
- <table class="post-links thick-divide-top thin-divide-bottom clearfix-redux" cellspacing="0" cellpadding="0" border="0" width="100%">
- <tbody>
- <tr>
- <td width="50%" class="subheading older"> <a href="http://arstechnica.com/tech-policy/2015/04/16/dozens-of-us-government-online-whistleblower-sites-not-secured-by-https/" rel="prev"><span class="arrow">←</span> Older Story</a> </td>
- <td class="subheading newer"> <a href="http://arstechnica.com/gaming/2015/04/16/hidden-files-suggest-street-fighters-ryu-may-come-to-smash-bros/" rel="next">Newer Story <span class="arrow">→</span></a> </td>
- </tr>
- </tbody>
- </table>
- <footer id="article-footer">
- <div id="instream300x255_frame"></div>
- <script type="text/javascript">
- ars.AD.queue.push(['instream', {
- sz: '300x255',
- kws: ["blogvertorial", "inStream"],
- collapse: true
- }]);
- </script>
- <h2 class="subheading notched">You May Also Like</h2>
- <ul id="recommendations" class="clearfix-redux">
- <!-- cache miss 459:single/sponsored-recs:885d56085f538f75cf5e9bcb302f399f -->
- </ul>
- </footer>
- </div>
- </article>
- <section id="article-sidebar" class="column-1 right">
- <!-- cache hit 459:column/article-bottom:b3538aec37c1a165d2b4b62bd58e56e3 -->
- <aside class="side-ad thick-divide-bottom">
- <div id="xrailTop300x250_frame"></div>
- <script type="text/javascript">
- ars.AD.queue.push(['xrailTop', {
- sz: '300x250',
- kws: ["top"],
- collapse: true
- }]);
- </script>
- </aside>
- <h2 id="recent-featured-title" class="subheading notched">Latest Feature Story</h2>
- <ul class="column">
- <li class="post" id="post-658367">
- <article class="in-column" data-post-id="658367">
- <a href="http://arstechnica.com/apple/2015/05/03/review-the-absolutely-optional-apple-watch-and-watch-os-1-0/" class="headline-image"> <img src="http://cdn.arstechnica.net/wp-content/uploads/2015/05/DSC00588-300x100.jpg" width="300" height="100"/>
- <h2 class="page-count subheading">Feature Story (7 pages)</h2>
- <h1 class="heading">Review: The absolutely optional Apple Watch and Watch OS 1.0</h1> </a>
- <p class="excerpt">A pragmatist's guide to a nice but not quite necessary gadget.</p>
- </article>
- </li>
- <aside class="thick-divide-top">
- <h2 class="subheading notched">Watch Ars Video</h2>
- <article class="in-column">
- <div class="column-video" data-player="2196096102001" data-video="4202322531001" data-key="AQ~~,AAAAlDCBGhk~,VcmqiTAuekrwPweJ20LLt7jwm8LxmhCE"> <img src="https://cdn.arstechnica.net/i/http://brightcove.vo.llnwd.net/v1/unsecured/media/636468927001/201504/641/636468927001_4202397654001_LG-G4.jpg?pubId=636468927001" width="300" height="169"/>
- <div class="column-video-overlay"></div>
- </div> <a href="http://arstechnica.com/gadgets/2015/04/28/hands-on-with-the-leather-backed-lg-g4/"><h1 class="heading videohead">Hands-on with the New LG G4</h1></a>
- <p class="excerpt">LG goes with a wild rear design and a Snapdragon 808.</p>
- </article>
- </aside>
- <li id="in-the-know">
- <h2 class="subheading notched">Stay in the know with</h2>
- <ul class="social clearfix">
- <li class="fb">
- <a href="https://www.facebook.com/arstechnica"></a>
- </li>
- <li class="twit">
- <a href="https://twitter.com/arstechnica"></a>
+ <section>
+ <ul>
+ <li>
+ <a href="/contact-us/">Contact Us</a>
</li>
- <li class="gplus">
- <a href="https://plus.google.com/+ArsTechnica/posts"></a>
+ <li>
+ <a href="/staff-directory/">Staff</a>
</li>
- <li class="email">
- <a href="http://arstechnica.us1.list-manage.com/subscribe?u=af7f013bad7e785d15aab736f&amp;id=0adf3ee3d9"></a>
+ <li>
+ <a href="/advertise-with-us/">Advertise with us</a>
</li>
- <li class="rss">
- <a href="/rss-feeds/"></a>
+ <li>
+ <a href="/reprints/">Reprints</a>
</li>
</ul>
- </li>
- <h2 class="subheading notched">Latest News</h2>
- <ol class="rail latest-stories">
- <li>
- <a href="http://arstechnica.com/information-technology/2015/05/04/microsoft-bangs-the-cybersecurity-drum-with-advanced-threat-analytics/">
- <h2>Protecting networks from your own employees</h2>
- <h1 class="heading">Microsoft bangs the cybersecurity drum with Advanced Threat Analytics</h1> </a>
- </li>
- <li>
- <a href="http://arstechnica.com/information-technology/2015/05/04/windows-update-for-business-brings-windows-updates-to-your-business/">
- <h2>WUB WUB WUB WUB</h2>
- <h1 class="heading">Windows Update for Business brings Windows updates to your business</h1> </a>
- </li>
- <li>
- <a href="http://arstechnica.com/security/2015/05/04/super-secretive-malware-wipes-hard-drive-to-prevent-analysis/">
- <h2>INITIATE SELF-DESTRUCT SEQUENCE</h2>
- <h1 class="heading">Super secretive malware wipes hard drive to prevent analysis</h1> </a>
- </li>
- <li>
- <a href="http://arstechnica.com/gaming/2015/05/04/failed-christian-shoe-promoter-makes-anti-gay-first-person-shooter/"> <img src="http://cdn.arstechnica.net/wp-content/uploads/2015/05/Screen-Shot-2015-05-04-at-2.45.22-PM-150x150.png" width="50" height="50"/>
- <h1 class="heading">Failed Christian shoe promoter makes anti-gay first-person shooter</h1> </a>
- </li>
- <li>
- <a href="http://arstechnica.com/information-technology/2015/05/04/prime-minister-of-singapore-shares-his-c-code-for-sudoku-solver/">
- <h2>#include stdio.h</h2>
- <h1 class="heading">Prime Minister of Singapore shares his C++ code for Sudoku solver</h1> </a>
- </li>
- <li>
- <a href="http://arstechnica.com/tech-policy/2015/05/04/9th-circuit-judges-rip-into-prenda-law-copyright-trolling-scheme/"> <img src="http://cdn.arstechnica.net/wp-content/uploads/2015/05/Screen-Shot-2015-05-04-at-11.09.05-AM-150x150.png" width="50" height="50"/>
- <h1 class="heading">9th Circuit judges rip into Prenda law copyright trolling scheme</h1> </a>
- </li>
- <div style="display:none">
- <div id="polar195x130_frame"></div>
- <script type="text/javascript">
- ars.AD.queue.push(['polar', {
- sz: '195x130',
- kws: [],
- collapse: true
- }]);
- </script>
+ </section>
+ <section class="footer-newsletter">
+ <div class="newsletter-wrapper">
+ <h3>
+ <a href="/newsletters/">Newsletter Signup</a>
+ </h3>
+ <p>
+ Join the Ars Orbital Transmission mailing list to get weekly updates delivered to your inbox.
+ </p><a class="button" href="/newsletters/">Sign me up →</a>
</div>
- </ol>
- <li>
- <aside class="side-ad">
- <div id="xrailBottom300x250_frame"></div>
- <script type="text/javascript">
- ars.AD.queue.push(['xrailBottom', {
- sz: '300x250',
- kws: ["bottom"],
- collapse: true
- }]);
- </script>
- </aside>
- </li>
- <li class="thick-divide-top thick-divide-bottom">
- <aside class="side-ad">
- <script type="text/javascript" language="JavaScript">
- // <![CDATA[
- google_ad_client = 'ca-conde_arstechnica';
- google_ad_channel = 'ars_technica_standard_a';
- google_language = 'en';
- google_ad_width = '300';
- google_ad_height = '250';
- google_ad_type = 'text';
- google_encoding = 'utf8';
- google_safe = 'high';
- google_adtest = 'off';
- google_ad_format = '';
- google_ad_section = 'default';
- // ]]>
- </script>
- <script type="text/javascript" src="//pagead2.googlesyndication.com/pagead/show_ads.js" language="JavaScript"></script>
- </aside>
- </li>
- </ul>
- </section>
- </section>
- <footer id="page-footer">
- <nav id="footer-nav" class="clearfix">
- <div class="nav-section">
- <h2 class="subheading">Site Links</h2>
- <ul>
- <li><a href="/about-us/">About Us</a></li>
- <li><a href="/advertise-with-us/">Advertise with us</a></li>
- <li><a href="/contact-us/">Contact Us</a></li>
- <li><a href="/reprints/">Reprints</a></li>
- </ul>
- <h2 class="subheading">Subscriptions</h2>
- <ul>
- <li><a href="/subscriptions/">Subscribe to Ars</a></li>
- </ul>
- </div>
- <div class="nav-section">
- <h2 class="subheading">More Reading</h2>
- <ul>
- <li><a href="/rss-feeds/">RSS Feeds</a></li>
- <li><a href="/newsletters/">Newsletters</a></li>
- </ul>
- </div>
- <div class="nav-section">
- <h2 class="subheading">Conde Nast Sites</h2>
- <ul class="conde-nast-sites">
- <li><a href="http://www.reddit.com/">Reddit</a></li>
- <li><a href="http://www.wired.com/">Wired</a></li>
- <li><a href="http://www.vanityfair.com/">Vanity Fair</a></li>
- <li><a href="http://www.style.com/">Style</a></li>
- <li><a href="http://www.details.com/">Details</a></li>
- </ul>
- <form method="get" action="#">
- <select id="mag_list" name="mag_list" onchange="(this.options[this.selectedIndex].value) ? (window.location = this.options[this.selectedIndex].value) : null">
- <option value="" selected="selected">Visit our sister sites</option>
- <option value="">- - - - - - - - - - - - - -</option>
- <option value="http://www.gq.com">GQ</option>
- <option value="http://www.concierge.com">Concierge</option>
- <option value="http://www.epicurious.com">Epicurious</option>
- <option value="http://men.style.com">Men.Style.com</option>
- <option value="http://www.style.com">Style.com</option>
- <option value="http://www.wired.com">Wired.com</option>
- <option value="http://www.lipstick.com">Lipstick.com</option>
- <option value="http://www.nutritiondata.com">NutritionData</option>
- <option value="http://www.allure.com">Allure</option>
- <option value="http://www.architecturaldigest.com">Architectural Digest</option>
- <option value="http://www.bonappetit.com">Bon Appétit</option>
- <option value="http://www.brides.com">Brides</option>
- <option value="http://www.portfolio.com">Condé Nast Portfolio</option>
- <option value="http://www.glamour.com">Glamour</option>
- <option value="http://www.golfdigest.com">Golf Digest</option>
- <option value="http://www.golfworld.com">Golf World</option>
- <option value="http://www.luckymag.com">Lucky</option>
- <option value="http://www.self.com">Self</option>
- <option value="http://www.teenvogue.com">Teen Vogue</option>
- <option value="http://www.newyorker.com">The New Yorker</option>
- <option value="http://www.vanityfair.com">Vanity Fair</option>
- <option value="http://www.wmagazine.com">W</option>
- </select>
- </form>
- <form method="get" action="#">
- <select size="1" id="sub_list" name="sub_list" onchange="(this.options[this.selectedIndex].value) ? (window.location = this.options[this.selectedIndex].value) : null">
- <option value="" selected="selected">Subscribe to a magazine</option>
- <option value="http://www.magazinestoresubscriptions.com?source=univdropdown">View All Titles</option>
- <option value="">- - - - - - - - - - - - - -</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Allure?source=SITEFOOTER">Allure</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_ArchitecturalDigest">Architectural Digest</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_BonAppetite?source=SITEFOOTER">Bon Appétit</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Brides?source=SITEFOOTER">Brides</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_CondeNastPortfolio?source=SITEFOOTER">Condé Nast Portfolio</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_CondeNastTraveler?source=SITEFOOTER">Condé Nast Traveler</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Details?source=SITEFOOTER">Details</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_ElegantBride?source=SITEFOOTER">Elegant Bride</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Glamour?source=SITEFOOTER">Glamour</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_GolfDigest?source=SITEFOOTER">Golf Digest</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_GolfWorld?source=SITEFOOTER">Golf World</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_GQ?source=SITEFOOTER">GQ</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Lucky?source=SITEFOOTER">Lucky</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_ModernBride?source=SITEFOOTER">Modern Bride</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Self?source=SITEFOOTER">Self</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_TeenVogue?source=SITEFOOTER">Teen Vogue</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_NewYorker?source=SITEFOOTER">The New Yorker</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_VanityFair?source=SITEFOOTER">Vanity Fair</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Vogue?source=SITEFOOTER">Vogue</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_W?source=SITEFOOTER">W</option>
- <option value="https://www.magazinestoresubscriptions.com/webapp/wcs/stores/servlet/Subscriptions_Wired?source=SITEFOOTER">Wired</option>
- </select>
- </form>
- </div>
- <div class="nav-section" id="mobile-site">
- <h2 class="subheading"><a href="http://arstechnica.com/security/2015/04/16/just-released-minecraft-exploit-makes-it-easy-to-crash-game-servers/?view=mobile">View Mobile Site</a></h2> </div>
- </nav>
- <p style="text-align:center;margin-top:30px;margin-bottom:0">
- <a href="http://condenast.com"><img src="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/images/condenast-logo.png" width="131" height="19"/></a>
- </p>
- <div id="copyright-terms"> © 2015 Condé Nast. All rights reserved
- <br/> Use of this Site constitutes acceptance of our <a href="http://www.condenast.com/privacy-policy" target="_blank">User Agreement</a> (effective 1/2/14) and <a href="http://www.condenast.com/privacy-policy#privacypolicy" target="_blank">Privacy Policy</a> (effective 1/2/14), and <a href="/amendment-to-conde-nast-user-agreement-privacy-policy/">Ars Technica Addendum (effective 5/17/2012)</a>
- <br/> <a href="http://www.condenast.com/privacy-policy#privacypolicy-california" target="_blank">Your California Privacy Rights</a>
- <br/> The material on this site may not be reproduced, distributed, transmitted, cached or otherwise used, except with the prior written permission of Condé Nast.
- <br/>
- <br/> <a href="http://www.condenast.com/privacy-policy#privacypolicy-optout" target="_blank">Ad Choices</a><img width="10" height="10" border="0" src="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/images/ad_choices_arrow.png"/> </div>
- </footer>
- </div>
- <script type="text/javascript" src="//www.google.com/jsapi?autoload={'modules':[{'name':'search','version':'1','packages':[],'language':'en'}]}"></script>
- <script type="text/javascript" src="http://cdn.arstechnica.net/wp-content/themes/arstechnica/assets/js/ars.min.4963c9cfd2e7a5799f3b8c40325988b4.js"></script>
- <!-- what the christ -->
- <script type="text/javascript" src="//www.googletagservices.com/tag/js/gpt.js"></script>
- <script type="text/javascript" src="http://cdn.arstechnica.net/ads/js/cn.dart.bun.min.js"></script>
- <script type="text/javascript">
- (function() {
- if ("CN" in window) {
- if (ars.MOBILE && "UAParser" in window) {
- var ua = new UAParser();
- if (ua.getOS().name == "Android" && ua.getBrowser().name == "Chrome") {
- return;
- }
- }
- CN.site.init({
- code: "ars",
- title: "Ars",
- name: ars.MOBILE ? "ars.mobile" : "ars",
- env: ars.ENV === "production" ? "PROD" : "DEV",
- debug: ars.ENV !== "production"
- });
- CN.dart.init({
- site: CN.site.name + '.dart',
- zone: ars.AD.zone,
- kws: ars.AD.kw,
- gptCallback: function(e) {
- ars.sda.ad_loaded(e);
- }
- });
- CN.dart.getCommon()["domDelay"]["defaultVal"] = 100;
- for (var i = 0; i &lt; ars.AD.queue.length; i++) {
- var ad = ars.AD.queue[i],
- id = ad[0],
- args = ad[1];
- if ($('#' + id + args.sz + "_frame").length) CN.dart.call(id, args);
- }
- ars.AD.queue = [];
- }
- })();
- </script>
- <script type="text/javascript">
- CN.ad.polar.article = function(Handlebars, depth0, helpers, partials, data) {
- this.compilerInfo = [4, '>= 1.0.0'];
- helpers = this.merge(helpers, Handlebars.helpers);
- data = data || {};
- var buffer = "",
- stack1, stack2, functionType = "function",
- escapeExpression = this.escapeExpression,
- self = this;
+ </section>
+ </nav>
+ <section class="footer-terms-logo">
+ <div class="cn-logo">
+ <a href="http://condenast.com/" class="icon icon-logo-cn-us" title="Visit Condé Nast"></a>
+ </div>
+ <p id="copyright-terms">
+ CNMN Collection<br />
+ WIRED Media Group<br />
+ © 2020 Condé Nast. All rights reserved. Use of and/or registration on any portion of this site constitutes acceptance of our <a href="https://www.condenast.com/user-agreement/">User Agreement</a> (updated 1/1/20) and <a href="https://www.condenast.com/privacy-policy/">Privacy Policy and Cookie Statement</a> (updated 1/1/20) and <a href="/amendment-to-conde-nast-user-agreement-privacy-policy/">Ars Technica Addendum</a> (effective 8/21/2018). Ars may earn compensation on sales from links on this site. <a href="/affiliate-link-policy/">Read our affiliate link policy</a>.<br />
+ <a href="https://www.condenast.com/privacy-policy/#california">Your California Privacy Rights</a> | <a id="ot-sdk-btn" class="ot-sdk-show-settings">Do Not Sell My Personal Information</a><br />
+ The material on this site may not be reproduced, distributed, transmitted, cached or otherwise used, except with the prior written permission of Condé Nast.<br />
+ <a href="https://www.condenast.com/online-behavioral-advertising-oba-and-how-to-opt-out-of-oba/#clickheretoreadmoreaboutonlinebehavioraladvertising(oba)">Ad Choices</a>
+ </p>
+ </section>
+ </footer>
+ </div>
+ <script type="text/javascript" src="https://cdn.arstechnica.net/wp-content/themes/ars/assets/js/main-fafdd8b108.js"></script> <!-- cache hit 581:single/javascript-footer:5a5daf59fa5245a64fe8615caa0b1d1b -->
+
+ <script async="async" type="application/javascript" src="https://embed.actionbutton.co/widget/widget.min.js"></script> <!-- Parse.ly start -->
+ <script id="parsely-cfg" src="//fpa-cdn.arstechnica.com/keys/arstechnica.com/p.js"></script> <!-- Parse.ly end -->
+
+ <script src="https://player.cnevids.com/interlude/arstechnica.js" async="async"></script>
+ <script id="conde-polar" src="https://cdn.mediavoice.com/nativeads/script/condenastcorporate/conde-asa-polar-master.js" async="async"></script>
+ <script>
+ <![CDATA[
- function program1(depth0, data) {
- var buffer = "",
- stack1;
- buffer += "\n &lt;span style=\"width:50px; height:50px; overflow:hidden; display:inline-block; float:left; margin:2px 10px 5px 0\">\n &lt;img src=\"" + escapeExpression(((stack1 = ((stack1 = depth0.image), stack1 == null || stack1 === false ? stack1 : stack1.href)), typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + "\" style=\"float:none; margin:0; height:50px; width:auto;\" />\n &lt;/span>\n ";
- return buffer;
- }
- buffer += "&lt;li>\n &lt;a href=\"";
- if (stack1 = helpers.link) {
- stack1 = stack1.call(depth0, {
- hash: {},
- data: data
- });
- } else {
- stack1 = depth0.link;
- stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1;
- }
- buffer += escapeExpression(stack1) + "\">\n &lt;h2 style=\"color:#00A3D3;\">Sponsored by: &lt;span style=\"text-transform:none;\">" + escapeExpression(((stack1 = ((stack1 = depth0.sponsor), stack1 == null || stack1 === false ? stack1 : stack1.name)), typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + "&lt;/span>&lt;/h2>\n ";
- stack2 = helpers['if'].call(depth0, ((stack1 = depth0.image), stack1 == null || stack1 === false ? stack1 : stack1.href), {
- hash: {},
- inverse: self.noop,
- fn: self.program(1, program1, data),
- data: data
- });
- if (stack2 || stack2 === 0) {
- buffer += stack2;
+ (function () {
+ function DQ() {
+ var queue = window.sparrowQueue;
+ this.push = fn => fn();
+ window.sparrowQueue = this;
+ while (queue.length) {
+ queue.shift()();
+ }
+ }
+ function e(t, e) {
+ var n, a, o;
+ a = !1, n = document.createElement("script"), n.type = "text/javascript", n.src = t, n.onload = n.onreadystatechange = function () {
+ a || this.readyState && "complete" != this.readyState || (a = !0, e ? e() : !0)
+ }, o = document.getElementsByTagName("script")[0], o.parentNode.insertBefore(n, o)
+ }
+ if (location.search.indexOf('no_sparrow') < 0) {
+ e("https://pixel.condenastdigital.com/config/v2/production/ars-technica.config.js", function () {
+ e("https://pixel.condenastdigital.com/sparrow.min.js", function () {
+ if (window.SparrowConfigV2) {
+ window.sparrow = new window.Sparrow(window.SparrowConfigV2);
+ new DQ();
}
- buffer += "\n &lt;h1 class=\"heading\">";
- if (stack2 = helpers.title) {
- stack2 = stack2.call(depth0, {
- hash: {},
- data: data
- });
- } else {
- stack2 = depth0.title;
- stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2;
- }
- buffer += escapeExpression(stack2) + "&lt;/h1>\n &lt;/a>\n&lt;/li>";
- return buffer;
- };
- </script>
- <!-- cache hit 459:single/javascript-footer:1ad28a5dc0a24868be6b031b5fdecb2e -->
- <noscript>
- <a href="http://www.omniture.com" title="Web Analytics"><img src="http://condenast.112.2o7.net/b/ss/condenet-dev/1/H.15.1--NS/0" height="1" width="1" border="0" alt="" /></a>
- </noscript>
- <!-- Google Analytics start -->
- <script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(
- ['_setAccount', 'UA-31997-1'], ['_setCustomVar', 1, 'view', "grid"], ['_setCustomVar', 2, 'theme', "light"], ['_setCustomVar', 3, 'logged_in', "false"], ['_setCustomVar', 4, 'show_comments', "false"], ['_setCustomVar', 5, 'is_premier', "false"], ['_trackPageview']);
- (function() {
- var ga = document.createElement('script');
- ga.type = 'text/javascript';
- ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(ga, s);
+ })
+ })
+ }
})();
- </script>
- <!-- Google Analytics end -->
- <!-- Parse.ly start -->
- <script type="text/javascript">
- (function(d) {
- var site = "arstechnica.com",
- b = d.body,
- e = d.createElement("div");
- e.innerHTML = '<span id="parsely-cfg" data-parsely-site="' + site + '"></span>';
- e.id = "parsely-root";
- e.style.display = "none";
- b.appendChild(e);
- })(document);
- (function(s, p, d) {
- var h = d.location.protocol,
- i = p + "-" + s,
- e = d.getElementById(i),
- r = d.getElementById(p + "-root"),
- u = h === "https:" ? "d1z2jf7jlzjs58.cloudfront.net" : "static." + p + ".com";
- if (e) return;
- e = d.createElement(s);
- e.id = i;
- e.async = true;
- e.src = h + "//" + u + "/p.js";
- r.appendChild(e);
- })("script", "parsely", document);
- </script>
- <!-- Parse.ly end -->
-</body>
-
+ ]]>
+ </script>
+ <script type="text/javascript" src="//s.skimresources.com/js/100098X1555750.skimlinks.js"></script>
+ </body>
</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json
index 5e3fa4120..51ed665a0 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected-images.json
@@ -1,6 +1,6 @@
-{
- "0": "http:\/\/fakehost\/test\/base\/foo\/bar\/baz.png",
- "2": "http:\/\/fakehost\/foo\/bar\/baz.png",
- "3": "http:\/\/test\/foo\/bar\/baz.png",
- "4": "https:\/\/test\/foo\/bar\/baz.png"
-} \ No newline at end of file
+[
+ "http:\/\/fakehost\/test\/base\/foo\/bar\/baz.png",
+ "http:\/\/fakehost\/foo\/bar\/baz.png",
+ "http:\/\/test\/foo\/bar\/baz.png",
+ "https:\/\/test\/foo\/bar\/baz.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html
index 14d23f672..1a8d41293 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element-relative/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@@ -17,11 +18,11 @@
<p><a href="http://test/foo/bar/baz.html">link</a></p>
<p><a href="https://test/foo/bar/baz.html">link</a></p>
<p>Images</p>
- <p><img src="http://fakehost/test/base/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/test/base/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/foo/bar/baz.png"></img></p>
- <p><img src="http://test/foo/bar/baz.png"></img></p>
- <p><img src="https://test/foo/bar/baz.png"></img></p>
+ <p><img src="http://fakehost/test/base/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/test/base/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/foo/bar/baz.png"></p>
+ <p><img src="http://test/foo/bar/baz.png"></p>
+ <p><img src="https://test/foo/bar/baz.png"></p>
<h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json
index c4a597eea..68c486489 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected-images.json
@@ -1,5 +1,5 @@
-{
- "0": "http:\/\/fakehost\/foo\/bar\/baz.png",
- "3": "http:\/\/test\/foo\/bar\/baz.png",
- "4": "https:\/\/test\/foo\/bar\/baz.png"
-} \ No newline at end of file
+[
+ "http:\/\/fakehost\/foo\/bar\/baz.png",
+ "http:\/\/test\/foo\/bar\/baz.png",
+ "https:\/\/test\/foo\/bar\/baz.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html
index 5037eb265..3a03ddb79 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url-base-element/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@@ -17,11 +18,11 @@
<p><a href="http://test/foo/bar/baz.html">link</a></p>
<p><a href="https://test/foo/bar/baz.html">link</a></p>
<p>Images</p>
- <p><img src="http://fakehost/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/foo/bar/baz.png"></img></p>
- <p><img src="http://test/foo/bar/baz.png"></img></p>
- <p><img src="https://test/foo/bar/baz.png"></img></p>
+ <p><img src="http://fakehost/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/foo/bar/baz.png"></p>
+ <p><img src="http://test/foo/bar/baz.png"></p>
+ <p><img src="https://test/foo/bar/baz.png"></p>
<h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json
index 1c28ae60c..e072ac11c 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected-images.json
@@ -1,6 +1,6 @@
-{
- "0": "http:\/\/fakehost\/test\/foo\/bar\/baz.png",
- "2": "http:\/\/fakehost\/foo\/bar\/baz.png",
- "3": "http:\/\/test\/foo\/bar\/baz.png",
- "4": "https:\/\/test\/foo\/bar\/baz.png"
-} \ No newline at end of file
+[
+ "http:\/\/fakehost\/test\/foo\/bar\/baz.png",
+ "http:\/\/fakehost\/foo\/bar\/baz.png",
+ "http:\/\/test\/foo\/bar\/baz.png",
+ "https:\/\/test\/foo\/bar\/baz.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html
index 36981e1e7..e9da69da3 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/base-url/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@@ -17,11 +18,11 @@
<p><a href="http://test/foo/bar/baz.html">link</a></p>
<p><a href="https://test/foo/bar/baz.html">link</a></p>
<p>Images</p>
- <p><img src="http://fakehost/test/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/test/foo/bar/baz.png"></img></p>
- <p><img src="http://fakehost/foo/bar/baz.png"></img></p>
- <p><img src="http://test/foo/bar/baz.png"></img></p>
- <p><img src="https://test/foo/bar/baz.png"></img></p>
+ <p><img src="http://fakehost/test/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/test/foo/bar/baz.png"></p>
+ <p><img src="http://fakehost/foo/bar/baz.png"></p>
+ <p><img src="http://test/foo/bar/baz.png"></p>
+ <p><img src="https://test/foo/bar/baz.png"></p>
<h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json
index 44bca8dce..5c50d84c8 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-images.json
@@ -1,7 +1,7 @@
-{
- "0": "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg",
- "1": "http:\/\/ichef.bbci.co.uk\/news\/555\/cpsprodpb\/462D\/production\/_84456971_gettyimages-167501087.jpg",
- "2": "http:\/\/ichef.bbci.co.uk\/news\/555\/media\/images\/76020000\/jpg\/_76020974_line976.jpg",
- "3": "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/6D3D\/production\/_84456972_p072315al-0500.jpg",
- "5": "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/142FD\/production\/_84458628_shirtreuters.jpg"
-} \ No newline at end of file
+[
+ "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg",
+ "http:\/\/ichef.bbci.co.uk\/news\/555\/cpsprodpb\/462D\/production\/_84456971_gettyimages-167501087.jpg",
+ "http:\/\/ichef.bbci.co.uk\/news\/555\/media\/images\/76020000\/jpg\/_76020974_line976.jpg",
+ "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/6D3D\/production\/_84456972_p072315al-0500.jpg",
+ "http:\/\/ichef-1.bbci.co.uk\/news\/555\/cpsprodpb\/142FD\/production\/_84458628_shirtreuters.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json
index 6af682f84..8d5937b38 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected-metadata.json
@@ -3,6 +3,6 @@
"Direction": null,
"Excerpt": "President Barack Obama tells the BBC his failure to pass \"common sense gun safety laws\" is the greatest frustration of his presidency.",
"Image": "http:\/\/ichef.bbci.co.uk\/news\/1024\/cpsprodpb\/3D8B\/production\/_84455751_84455749.jpg",
- "Title": "Obama admits US gun laws are his 'biggest frustration' - BBC News",
+ "Title": "Obama admits US gun laws are his 'biggest frustration'",
"SiteName": "BBC News"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html
index ca646fe80..1e3c6d30a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bbc-1/expected.html
@@ -1,5 +1,6 @@
<div property="articleBody">
- <p>President Barack Obama has admitted that his failure to pass "common sense gun safety laws" in the US is the greatest frustration of his presidency. </p><p>In an interview with the BBC, Mr Obama said it was "distressing" not to have made progress on the issue "even in the face of repeated mass killings".</p><p>He vowed to keep trying, but the BBC's North America editor Jon Sopel said the president did not sound very confident. </p><p>However, Mr Obama said race relations had improved during his presidency. </p><p>Hours after the interview, a gunman opened fire at a cinema in the US state of Louisiana, killing two people and injuring several others before shooting himself.</p><p>In a wide-ranging interview, President Obama also said:</p><ul><li>
+ <p>President Barack Obama has admitted that his failure to pass "common sense gun safety laws" in the US is the greatest frustration of his presidency. </p><p>In an interview with the BBC, Mr Obama said it was "distressing" not to have made progress on the issue "even in the face of repeated mass killings".</p><p>He vowed to keep trying, but the BBC's North America editor Jon Sopel said the president did not sound very confident. </p><p>However, Mr Obama said race relations had improved during his presidency. </p><p>Hours after the interview, a gunman opened fire at a cinema in the US state of Louisiana, killing two people and injuring several others before shooting himself.</p><p>In a wide-ranging interview, President Obama also said:</p><ul>
+<li>
<a href="http://www.bbc.co.uk/news/uk-politics-33647154">The UK must stay in the EU</a> to have influence on the world stage</li>
<li>He is confident the Iran nuclear deal will be passed by Congress </li>
<li>Syria needs a political solution in order to defeat the Islamic State group</li>
@@ -7,10 +8,14 @@
</li>
<li>He would defend his advocacy of gay rights following protests in Kenya</li>
<li>Despite racial tensions, the US is becoming more diverse and more tolerant</li>
-</ul><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646542">Read the full transcript of his interview</a></p><p>Mr Obama lands in Kenya later on Friday for his first visit since becoming president. </p><p>But with just 18 months left in power, he said gun control was the area where he has been "most frustrated and most stymied" since coming to power in 2009.</p><p>"If you look at the number of Americans killed since 9/11 by terrorism, it's less than 100. If you look at the number that have been killed by gun violence, it's in the tens of thousands," Mr Obama said. </p><figure><img alt="Gun control campaigners protest in McPhearson Square in Washington DC - 25 April 2013" datasrc="http://ichef.bbci.co.uk/news/976/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" height="549" src="http://ichef.bbci.co.uk/news/555/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" width="976"></img><figcaption><span>
+</ul><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646542">Read the full transcript of his interview</a></p><p>Mr Obama lands in Kenya later on Friday for his first visit since becoming president. </p><p>But with just 18 months left in power, he said gun control was the area where he has been "most frustrated and most stymied" since coming to power in 2009.</p><p>"If you look at the number of Americans killed since 9/11 by terrorism, it's less than 100. If you look at the number that have been killed by gun violence, it's in the tens of thousands," Mr Obama said. </p><figure><img src="http://ichef.bbci.co.uk/news/555/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" datasrc="http://ichef.bbci.co.uk/news/976/cpsprodpb/462D/production/_84456971_gettyimages-167501087.jpg" alt="Gun control campaigners protest in McPhearson Square in Washington DC - 25 April 2013" height="549" width="976">
+ <figcaption>
+ <span>
The president said he would continue fighting for greater gun control laws
</span>
- </figcaption></figure><p>"For us not to be able to resolve that issue has been something that is distressing," he added. </p><p>Mr Obama has pushed for stricter gun control throughout his presidency but has been unable to secure any significant changes to the laws. </p><p>After nine African-American churchgoers were killed in South Carolina in June, he admitted "politics in this town" meant there were few options available.</p><figure><img alt="line" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" height="2" src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" width="464"></img></figure><h2>Analysis: Jon Sopel, BBC News, Washington</h2><figure><img alt="President Barack Obama participates in an interview with Jon Sopel of BBC in the Roosevelt Room of the White House - 23 July 2015" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" height="549" src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" width="976"></img></figure><p>Nine months ago, the president seemed like a spent force, after taking a beating in the midterm elections, during which members of his own party were reluctant to campaign on his record. </p><p>But the man sat before me today was relaxed and confident, buoyed by a string of "wins" on healthcare, Cuba and Iran, after bitter and ongoing battles with his many critics. </p><p>The only body swerve the president performed was when I asked him <a href="http://www.bbc.co.uk/news/world-us-canada-33643168"> how many minds he had changed on the Iran nuclear deal </a>after an intense sell aimed at Gulf allies and members of US Congress who remain implacably opposed. </p><p>There was a momentary flicker across the president's face as if to say "You think you got me?" before his smile returned and he proceeded to talk about how Congress would come round.</p><p>But notably, he did not give a direct answer to that question, which leaves me with the impression that he has persuaded precisely zero.</p><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646875">Five things we learned from Obama interview</a></p><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646545">The presidential body swerve</a></p><figure><img alt="line" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" height="2" src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" width="464"></img></figure><p>On race relations, Mr Obama said recent concerns around policing and mass incarcerations were "legitimate and deserve intense attention" but insisted progress had been made. </p><p>Children growing up during the eight years of his presidency "will have a different view of race relations in this country and what's possible," he said. </p><p>"There are going to be tensions that arise. But if you look at my daughters' generation, they have an attitude about race that's entirely different than even my generation."</p><p>Talking about how he was feeling after his recent successes, he said "every president, every leader has strengths and weaknesses". </p><p>"One of my strengths is I have a pretty even temperament. I don't get too high when it's high and I don't get too low when it's low," he said. </p><figure><img alt="Customer looks at Obama shirts at a stall in Nairobi's Kibera slums, 23 July 2015" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" height="549" src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" width="976"></img><figcaption><span>
+ </figcaption></figure><p>"For us not to be able to resolve that issue has been something that is distressing," he added. </p><p>Mr Obama has pushed for stricter gun control throughout his presidency but has been unable to secure any significant changes to the laws. </p><p>After nine African-American churchgoers were killed in South Carolina in June, he admitted "politics in this town" meant there were few options available.</p><figure><img src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" alt="line" height="2" width="464"></figure><h2>Analysis: Jon Sopel, BBC News, Washington</h2><figure><img src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/6D3D/production/_84456972_p072315al-0500.jpg" alt="President Barack Obama participates in an interview with Jon Sopel of BBC in the Roosevelt Room of the White House - 23 July 2015" height="549" width="976"></figure><p>Nine months ago, the president seemed like a spent force, after taking a beating in the midterm elections, during which members of his own party were reluctant to campaign on his record. </p><p>But the man sat before me today was relaxed and confident, buoyed by a string of "wins" on healthcare, Cuba and Iran, after bitter and ongoing battles with his many critics. </p><p>The only body swerve the president performed was when I asked him <a href="http://www.bbc.co.uk/news/world-us-canada-33643168"> how many minds he had changed on the Iran nuclear deal </a>after an intense sell aimed at Gulf allies and members of US Congress who remain implacably opposed. </p><p>There was a momentary flicker across the president's face as if to say "You think you got me?" before his smile returned and he proceeded to talk about how Congress would come round.</p><p>But notably, he did not give a direct answer to that question, which leaves me with the impression that he has persuaded precisely zero.</p><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646875">Five things we learned from Obama interview</a></p><p><a href="http://www.bbc.co.uk/news/world-us-canada-33646545">The presidential body swerve</a></p><figure><img src="http://ichef.bbci.co.uk/news/555/media/images/76020000/jpg/_76020974_line976.jpg" datasrc="http://ichef.bbci.co.uk/news/464/media/images/76020000/jpg/_76020974_line976.jpg" alt="line" height="2" width="464"></figure><p>On race relations, Mr Obama said recent concerns around policing and mass incarcerations were "legitimate and deserve intense attention" but insisted progress had been made. </p><p>Children growing up during the eight years of his presidency "will have a different view of race relations in this country and what's possible," he said. </p><p>"There are going to be tensions that arise. But if you look at my daughters' generation, they have an attitude about race that's entirely different than even my generation."</p><p>Talking about how he was feeling after his recent successes, he said "every president, every leader has strengths and weaknesses". </p><p>"One of my strengths is I have a pretty even temperament. I don't get too high when it's high and I don't get too low when it's low," he said. </p><figure><img src="http://ichef-1.bbci.co.uk/news/555/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" datasrc="http://ichef-1.bbci.co.uk/news/976/cpsprodpb/142FD/production/_84458628_shirtreuters.jpg" alt="Customer looks at Obama shirts at a stall in Nairobi's Kibera slums, 23 July 2015" height="549" width="976">
+ <figcaption>
+ <span>
Kenya is getting ready to welcome the US president
</span>
</figcaption></figure><h2>Kenya trip</h2><p>Mr Obama was speaking to the BBC at the White House before departing for Kenya.</p><p>His father was Kenyan and the president is expected to meet relatives in Nairobi.</p><p>Mr Obama has faced criticism in the country after the US legalised gay marriage. However, in his interview, the president said he would not fall silent on the issue.</p><p>"I am not a fan of discrimination and bullying of anybody on the basis of race, on the basis of religion, on the basis of sexual orientation or gender," he said.</p><p>The president also admitted that some African governments, including Kenya's, needed to improve their records on human rights and democracy. However, he defended his decision to engage with and visit those governments. </p><p>"Well, they're not ideal institutions. But what we found is, is that when we combined blunt talk with engagement, that gives us the best opportunity to influence and open up space for civil society." </p><p>Mr Obama will become the first US president to address the African Union when he travels on to Ethiopia on Sunday.</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html
index ec3a02a43..20d9033a6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/blogger/expected.html
@@ -1,46 +1,73 @@
<div id="post-body-932306423056216142" itemprop="description articleBody"><p>
I've written a couple of posts in the past few months but they were all for <a href="http://blog.ioactive.com/search/label/Andrew%20Zonenberg">the blog at work</a> so I figured I'm long overdue for one on Silicon Exposed.</p><h2>
So what's a GreenPak?</h2>
- <p> Silego Technology is a fabless semiconductor company located in the SF Bay area, which makes (among other things) a line of programmable logic devices known as GreenPak. Their <a href="http://www.silego.com/products/greenpak5.html">5th generation parts</a> were just announced, but I started this project before that happened so I'm still targeting the <a href="http://www.silego.com/products/greenpak4.html">4th generation</a>.</p><p> GreenPak devices are kind of like itty bitty <a href="http://www.cypress.com/products/32-bit-arm-cortex-m-psoc">PSoCs</a> - they have a mixed signal fabric with an ADC, DACs, comparators, voltage references, plus a digital LUT/FF fabric and some typical digital MCU peripherals like counters and oscillators (but no CPU).</p><p> It's actually an interesting architecture - FPGAs (including some devices marketed as CPLDs) are a 2D array of LUTs connected via wires to adjacent cells, and true (product term) CPLDs are a star topology of AND-OR arrays connected by a crossbar. GreenPak, on the other hand, is a star topology of LUTs, flipflops, and analog/digital hard IP connected to a crossbar.</p><p> Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:</p><table readabilityDataTable="0"><tbody><tr><td>
- <a href="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s1600/block-diagram.png" imageanchor="1"><img height="512" src="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s640/block-diagram.png" width="640"></img></a>
+ <p> Silego Technology is a fabless semiconductor company located in the SF Bay area, which makes (among other things) a line of programmable logic devices known as GreenPak. Their <a href="http://www.silego.com/products/greenpak5.html">5th generation parts</a> were just announced, but I started this project before that happened so I'm still targeting the <a href="http://www.silego.com/products/greenpak4.html">4th generation</a>.</p><p> GreenPak devices are kind of like itty bitty <a href="http://www.cypress.com/products/32-bit-arm-cortex-m-psoc">PSoCs</a> - they have a mixed signal fabric with an ADC, DACs, comparators, voltage references, plus a digital LUT/FF fabric and some typical digital MCU peripherals like counters and oscillators (but no CPU).</p><p> It's actually an interesting architecture - FPGAs (including some devices marketed as CPLDs) are a 2D array of LUTs connected via wires to adjacent cells, and true (product term) CPLDs are a star topology of AND-OR arrays connected by a crossbar. GreenPak, on the other hand, is a star topology of LUTs, flipflops, and analog/digital hard IP connected to a crossbar.</p><p> Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:</p><table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s1600/block-diagram.png" imageanchor="1"><img height="512" src="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s640/block-diagram.png" width="640"></a>
</td>
- </tr><tr><td>SLG46620V block diagram (from device datasheet)</td>
- </tr></tbody></table><p>
- They're also tiny (the SLG46620V is a 20-pin 0.4mm pitch STQFN measuring 2x3 mm, and the lower gate count SLG46140V is a mere 1.6x2 mm) and probably the cheapest programmable logic device on the market - $0.50 in low volume and less than $0.40 in larger quantities.</p><p> The Vdd range of GreenPak4 is huge, more like what you'd expect from an MCU than an FPGA! It can run on anything from 1.8 to 5V, although performance is only specified at 1.8, 3.3, and 5V nominal voltages. There's also a dual-rail version that trades one of the GPIO pins for a second power supply pin, allowing you to interface to logic at two different voltage levels.</p><p> To support low-cost/space-constrained applications, they even have the configuration memory on die. It's one-time programmable and needs external Vpp to program (presumably Silego didn't want to waste die area on charge pumps that would only be used once) but has a SRAM programming mode for prototyping.</p><p> The best part is that the development software (GreenPak Designer) is free of charge and provided for all major operating systems including Linux! Unfortunately, the only supported design entry method is schematic entry and there's no way to write your design in a HDL.</p><p> While schematics may be fine for quick tinkering on really simple designs, they quickly get unwieldy. The nightmare of a circuit shown below is just a bunch of counters hooked up to LEDs that blink at various rates.</p><table readabilityDataTable="0"><tbody><tr><td>
- <a href="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s1600/schematic-from-hell.png" imageanchor="1"><img height="334" src="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s640/schematic-from-hell.png" width="640"></img></a>
+ </tr>
+ <tr>
+ <td>SLG46620V block diagram (from device datasheet)</td>
+ </tr>
+ </tbody>
+ </table><p>
+ They're also tiny (the SLG46620V is a 20-pin 0.4mm pitch STQFN measuring 2x3 mm, and the lower gate count SLG46140V is a mere 1.6x2 mm) and probably the cheapest programmable logic device on the market - $0.50 in low volume and less than $0.40 in larger quantities.</p><p> The Vdd range of GreenPak4 is huge, more like what you'd expect from an MCU than an FPGA! It can run on anything from 1.8 to 5V, although performance is only specified at 1.8, 3.3, and 5V nominal voltages. There's also a dual-rail version that trades one of the GPIO pins for a second power supply pin, allowing you to interface to logic at two different voltage levels.</p><p> To support low-cost/space-constrained applications, they even have the configuration memory on die. It's one-time programmable and needs external Vpp to program (presumably Silego didn't want to waste die area on charge pumps that would only be used once) but has a SRAM programming mode for prototyping.</p><p> The best part is that the development software (GreenPak Designer) is free of charge and provided for all major operating systems including Linux! Unfortunately, the only supported design entry method is schematic entry and there's no way to write your design in a HDL.</p><p> While schematics may be fine for quick tinkering on really simple designs, they quickly get unwieldy. The nightmare of a circuit shown below is just a bunch of counters hooked up to LEDs that blink at various rates.</p><table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s1600/schematic-from-hell.png" imageanchor="1"><img height="334" src="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s640/schematic-from-hell.png" width="640"></a>
</td>
- </tr><tr><td>Schematic from hell!</td>
- </tr></tbody></table><p>
+ </tr>
+ <tr>
+ <td>Schematic from hell!</td>
+ </tr>
+ </tbody>
+ </table><p>
As if this wasn't enough of a problem, the largest GreenPak4 device (the SLG46620V) is split into two halves with limited routing between them, and the GUI doesn't help the user manage this complexity at all - you have to draw your schematic in two halves and add "cross connections" between them.</p><p> The icing on the cake is that schematics are a pain to diff and collaborate on. Although GreenPak schematics are XML based, which is a touch better than binary, who wants to read a giant XML diff and try to figure out what's going on in the circuit?</p><p> This isn't going to be a post on the quirks of Silego's software, though - that would be boring. As it turns out, there's one more exciting feature of these chips that I didn't mention earlier: the configuration bitstream is 100% documented in the device datasheet! This is unheard of in the programmable logic world. As Nick of Arachnid Labs <a href="http://www.arachnidlabs.com/blog/2015/03/30/greenpak/">says</a>, the chip is "just dying for someone to write a VHDL or Verilog compiler for it". As you can probably guess by from the title of this post, I've been busy doing exactly that.</p><h2>
Great! How does it work?</h2>
- <p> Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, <a href="http://www.clifford.at/yosys/">Yosys</a>, and then make a place-and-route tool to turn that into a final netlist. The post-PAR netlist can then be loaded into GreenPak Designer in order to program the device.</p><p> The first step of the process is to run the "synth_greenpak4" Yosys flow on the Verilog source. This runs a generic RTL synthesis pass, then some coarse-grained extraction passes to infer shift register and counter cells from behavioral logic, and finally maps the remaining logic to LUT/FF cells and outputs a JSON-formatted netlist.</p><p> Once the design has been synthesized, my tool (named, surprisingly, gp4par) is then launched on the netlist. It begins by parsing the JSON and constructing a directed graph of cell objects in memory. A second graph, containing all of the primitives in the device and the legal connections between them, is then created based on the device specified on the command line. (As of now only the SLG46620V is supported; the SLG46621V can be added fairly easily but the SLG46140V has a slightly different microarchitecture which will require a bit more work to support.)</p><p> After the graphs are generated, each node in the netlist graph is assigned a numeric label identifying the type of cell and each node in the device graph is assigned a list of legal labels: for example, an I/O buffer site is legal for an input buffer, output buffer, or bidirectional buffer.</p><table readabilityDataTable="0"><tbody><tr><td>
- <a href="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s1600/graph-labels.png" imageanchor="1"><img height="141" src="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s400/graph-labels.png" width="400"></img></a>
+ <p> Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, <a href="http://www.clifford.at/yosys/">Yosys</a>, and then make a place-and-route tool to turn that into a final netlist. The post-PAR netlist can then be loaded into GreenPak Designer in order to program the device.</p><p> The first step of the process is to run the "synth_greenpak4" Yosys flow on the Verilog source. This runs a generic RTL synthesis pass, then some coarse-grained extraction passes to infer shift register and counter cells from behavioral logic, and finally maps the remaining logic to LUT/FF cells and outputs a JSON-formatted netlist.</p><p> Once the design has been synthesized, my tool (named, surprisingly, gp4par) is then launched on the netlist. It begins by parsing the JSON and constructing a directed graph of cell objects in memory. A second graph, containing all of the primitives in the device and the legal connections between them, is then created based on the device specified on the command line. (As of now only the SLG46620V is supported; the SLG46621V can be added fairly easily but the SLG46140V has a slightly different microarchitecture which will require a bit more work to support.)</p><p> After the graphs are generated, each node in the netlist graph is assigned a numeric label identifying the type of cell and each node in the device graph is assigned a list of legal labels: for example, an I/O buffer site is legal for an input buffer, output buffer, or bidirectional buffer.</p><table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s1600/graph-labels.png" imageanchor="1"><img height="141" src="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s400/graph-labels.png" width="400"></a>
</td>
- </tr><tr><td>Example labeling for a subset of the netlist and device graphs</td>
- </tr></tbody></table><p>
- The labeled nodes now need to be placed. The initial placement uses a simple greedy algorithm to create a valid (although not necessarily optimal or even routable) placement:</p><ol><li>Loop over the cells in the netlist. If any cell has a LOC constraint, which locks the cell to a specific physical site, attempt to assign the node to the specified site. If the specified node is the wrong type, doesn't exist, or is already used by another constrained node, the constraint is invalid so fail with an error.</li>
+ </tr>
+ <tr>
+ <td>Example labeling for a subset of the netlist and device graphs</td>
+ </tr>
+ </tbody>
+ </table><p>
+ The labeled nodes now need to be placed. The initial placement uses a simple greedy algorithm to create a valid (although not necessarily optimal or even routable) placement:</p><ol>
+ <li>Loop over the cells in the netlist. If any cell has a LOC constraint, which locks the cell to a specific physical site, attempt to assign the node to the specified site. If the specified node is the wrong type, doesn't exist, or is already used by another constrained node, the constraint is invalid so fail with an error.</li>
<li>Loop over all of the unconstrained cells in the netlist and assign them to the first unused site with the right label. If none are available, the design is too big for the device so fail with an error.</li>
</ol><p>
- Once the design is placed, the placement optimizer then loops over the design and attempts to improve it. A simulated annealing algorithm is used, where changes to the design are accepted unconditionally if they make the placement better, and with a random, gradually decreasing probability if they make it worse. The optimizer terminates when the design receives a perfect score (indicating an optimal placement) or if it stops making progress for several iterations. Each iteration does the following:</p><ol><li>Compute a score for the current design based on the number of unroutable nets, the amount of routing congestion (number of nets crossing between halves of the device), and static timing analysis (not yet implemented, always zero).</li>
+ Once the design is placed, the placement optimizer then loops over the design and attempts to improve it. A simulated annealing algorithm is used, where changes to the design are accepted unconditionally if they make the placement better, and with a random, gradually decreasing probability if they make it worse. The optimizer terminates when the design receives a perfect score (indicating an optimal placement) or if it stops making progress for several iterations. Each iteration does the following:</p><ol>
+ <li>Compute a score for the current design based on the number of unroutable nets, the amount of routing congestion (number of nets crossing between halves of the device), and static timing analysis (not yet implemented, always zero).</li>
<li>Make a list of nodes that contributed to this score in some way (having some attached nets unroutable, crossing to the other half of the device, or failing timing).</li>
<li>Remove nodes from the list that are LOC'd to a specific location since we're not allowed to move them.</li>
<li>Remove nodes from the list that have only one legal placement in the device (for example, oscillator hard IP) since there's nowhere else for them to go.</li>
<li>Pick a node from the remainder of the list at random. Call this our pivot.</li>
<li>Find a list of candidate placements for the pivot: </li>
- <ol><li>Consider all routable placements in the other half of the device.</li>
+ <ol>
+ <li>Consider all routable placements in the other half of the device.</li>
<li>If none were found, consider all routable placements anywhere in the device.</li>
<li>If none were found, consider all placements anywhere in the device even if they're not routable.</li>
- </ol><li>Pick one of the candidates at random and move the pivot to that location. If another cell in the netlist is already there, put it in the vacant site left by the pivot.</li>
+ </ol>
+ <li>Pick one of the candidates at random and move the pivot to that location. If another cell in the netlist is already there, put it in the vacant site left by the pivot.</li>
<li>Re-compute the score for the design. If it's better, accept this change and start the next iteration.</li>
<li>If the score is worse, accept it with a random probability which decreases as the iteration number goes up. If the change is not accepted, restore the previous placement.</li>
</ol><p>
- After optimization, the design is checked for routability. If any edges in the netlist graph don't correspond to edges in the device graph, the user probably asked for something impossible (for example, trying to hook a flipflop's output to a comparator's reference voltage input) so fail with an error.</p><p> The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:</p><ol><li>If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.</li>
+ After optimization, the design is checked for routability. If any edges in the netlist graph don't correspond to edges in the device graph, the user probably asked for something impossible (for example, trying to hook a flipflop's output to a comparator's reference voltage input) so fail with an error.</p><p> The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:</p><ol>
+ <li>If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.</li>
<li>If the source and destination are in the same half of the device, configure the destination's input mux appropriately and stop.</li>
<li>A cross-connection must be used. Check if we already used one to bring the source signal to the other half of the device. If found, configure the destination to route from that cross-connection and stop.</li>
<li>Check if we have any cross-connections left going in this direction. If they're all used, the design is unroutable due to congestion so fail with an error.</li>
<li>Pick the next unused cross-connection and configure it to route from the source. Configure the destination to route from the cross-connection and stop.</li>
</ol><p>
- Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:</p><ul><li>If any node has no loads, generate a warning</li>
+ Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:</p><ul>
+ <li>If any node has no loads, generate a warning</li>
<li>If an I/O buffer is connected to analog hard IP, fail with an error if it's not configured in analog mode.</li>
<li>Some signals (such as comparator inputs and oscillator power-down controls) are generated by a shared mux and fed to many loads. If different loads require conflicting settings for the shared mux, fail with an error.</li>
</ul><p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html
index e2f04c74b..b4a000f03 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/breitbart/expected.html
@@ -1,9 +1,15 @@
<div>
- <figure><div><p><img alt="Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016. / AFP / JIM WATSON (Photo credit should read JIM WATSON/AFP/Getty Images)" height="480" itemprop="image" src="http://media.breitbart.com/media/2016/11/GettyImages-621866810-640x480.jpg" width="640"></img></p><p>JIM WATSON/AFP/Getty Images</p>
+
+ <figure>
+ <div><p><img itemprop="image" src="http://media.breitbart.com/media/2016/11/GettyImages-621866810-640x480.jpg" alt="Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016. / AFP / JIM WATSON (Photo credit should read JIM WATSON/AFP/Getty Images)" width="640" height="480"></p><p>JIM WATSON/AFP/Getty Images</p>
</div>
- </figure> <time datetime="2016-12-22T10:43:37Z">22 Dec, 2016</time><time datetime="2016-12-22T18:59:12Z">22 Dec, 2016</time></div><div>
+ </figure>
+ <time datetime="2016-12-22T10:43:37Z">22 Dec, 2016</time>
+ <time datetime="2016-12-22T18:59:12Z">22 Dec, 2016</time>
+ </div><div>
+
<div id="EmailOptin">
<p><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
@@ -15,7 +21,7 @@
<p><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
</div>
- <p><span>The tweet from Vulture magazine reads, “</span><a href="https://twitter.com/hashtag/Hamilton?src=hash" rel="noopener" target="_blank"><span>#Hamilton</span></a><span> Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”</span></p>
+ <p><span>The tweet from Vulture magazine reads, “</span><a href="https://twitter.com/hashtag/Hamilton?src=hash" target="_blank" rel="noopener"><span>#Hamilton</span></a><span> Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”</span></p>
@@ -33,7 +39,7 @@
<p><span>Facebook believe that Emery, along with other Snopes writers, ABC News, and </span><a href="http://www.breitbart.com/tech/2016/12/16/flashback-weekly-standard-data-shows-politifact-has-it-out-for-republicans/"><span>Politifact</span></a><span> are impartial enough to label and silence what they believe to be “fake news” on social media. </span></p>
- <p><i><span>Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter </span></i><a href="http://twitter.com/lucasnolan_" rel="noopener" target="_blank"><i><span>@LucasNolan_</span></i></a><i><span> or email him at </span></i><a href="http://www.breitbart.com/wp-admin/blank"><i><span>[email protected]</span></i></a></p>
+ <p><i><span>Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter </span></i><a href="http://twitter.com/lucasnolan_" target="_blank" rel="noopener"><i><span>@LucasNolan_</span></i></a><i><span> or email him at </span></i><a href="http://www.breitbart.com/wp-admin/blank"><i><span>[email protected]</span></i></a></p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html
index c281eef90..520f8e803 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/expected.html
@@ -1,4 +1,4 @@
-<div id="gigya-share-btns-2_gig_containerParent" itemprop="articleBody">
+<div itemprop="articleBody" id="gigya-share-btns-2_gig_containerParent">
<p>Most people go to hotels for the pleasure of sleeping in a giant bed with clean white sheets and waking up to fresh towels in the morning.</p>
<p>But those towels and sheets might not be as clean as they look, according to the hotel bosses that responded to an online thread about the things hotel owners don’t want you to know.</p>
@@ -14,7 +14,7 @@
<div>
<div>
- <p><img alt="bandb2.jpg" height="423" src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/18/10/bandb2.jpg" title="bandb2.jpg" width="564"></img></p>
+ <p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/18/10/bandb2.jpg" alt="bandb2.jpg" title="bandb2.jpg" width="564" height="423"></p>
</div>
<div>
@@ -37,7 +37,7 @@
<div>
<div>
- <p><img alt="hotel-door-getty.jpg" height="423" src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/05/26/11/hotel-door-getty.jpg" title="hotel-door-getty.jpg" width="564"></img></p>
+ <p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/05/26/11/hotel-door-getty.jpg" alt="hotel-door-getty.jpg" title="hotel-door-getty.jpg" width="564" height="423"></p>
</div>
<div>
@@ -53,13 +53,10 @@
<div>
- <div>
- <p><img alt="luggage-3.jpg" height="423" src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2013/07/31/15/luggage-3.jpg" title="luggage-3.jpg" width="564"></img></p>
+ <p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2013/07/31/15/luggage-3.jpg" alt="luggage-3.jpg" title="luggage-3.jpg" width="564" height="423"></p>
</div>
-
- </div>
<p>3. Don’t use a wooden luggage rack</p>
@@ -70,7 +67,7 @@
<div>
<div>
- <p><img alt="Lifestyle-hotels.jpg" height="423" src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/04/13/11/Lifestyle-hotels.jpg" title="Lifestyle-hotels.jpg" width="564"></img></p>
+ <p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2015/04/13/11/Lifestyle-hotels.jpg" alt="Lifestyle-hotels.jpg" title="Lifestyle-hotels.jpg" width="564" height="423"></p>
</div>
<div>
@@ -91,20 +88,12 @@
- <div>
- <div>
-
- <div data-scald-gallery="3739501">
+ <div data-scald-gallery="3739501">
<h2><span></span>Business news in pictures</h2>
</div>
-
-
- </div>
- </div>
-
<h3>6. Mini bars almost always lose money</h3>
<p>Despite the snacks in the minibar seeming like the most overpriced food you have ever seen, hotel owners are still struggling to make a profit from those snacks. "Minibars almost always lose money, even when they charge $10 for a Diet Coke,” Sharon said.</p>
@@ -114,7 +103,7 @@
<div>
<div>
- <p><img alt="agenda7.jpg" height="423" src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/13/16/agenda7.jpg" title="agenda7.jpg" width="564"></img></p>
+ <p><img src="https://static.independent.co.uk/s3fs-public/styles/story_medium/public/thumbnails/image/2014/03/13/16/agenda7.jpg" alt="agenda7.jpg" title="agenda7.jpg" width="564" height="423"></p>
</div>
<div>
@@ -126,11 +115,14 @@
<p>7. Always made sure the hand towels are clean when you arrive</p>
<p>Forrest Jones made a discovery when he was helping out with the housekeepers. “You know where you almost always find a hand towel in any recently-vacated hotel room that was occupied by a guy? On the floor, next to the bed, about halfway down, maybe a little toward the foot of the bed. Same spot in the floor, next to almost every bed occupied by a man, in every room. I'll leave the rest to your imagination,” he said.</p>
- <meta content="2016-05-08T10:11:51+01:00" itemprop="datePublished"></meta><ul><li>
+ <meta itemprop="datePublished" content="2016-05-08T10:11:51+01:00">
+ <ul>
+ <li>
More about:
</li>
- <li><a href="http://fakehost/topic/Hotels" itemprop="keywords">Hotels</a></li>
- <li><a href="http://fakehost/topic/Hygiene" itemprop="keywords">Hygiene</a></li>
+ <li><a itemprop="keywords" href="http://fakehost/topic/Hotels">Hotels</a></li>
+ <li><a itemprop="keywords" href="http://fakehost/topic/Hygiene">Hygiene</a></li>
</ul>
- <p><a href="http://fakehost/syndication/reuse-permision-form?url=http://www.independent.co.uk/news/business/news/seven-secrets-that-hotel-owners-dont-want-you-to-know-10506160.html" target="_blank"><img src="http://fakehost/sites/all/themes/ines_themes/independent_theme/img/reuse.png" width="25"></img>Reuse content</a>
+
+ <p><a href="http://fakehost/syndication/reuse-permision-form?url=http://www.independent.co.uk/news/business/news/seven-secrets-that-hotel-owners-dont-want-you-to-know-10506160.html" target="_blank"><img src="http://fakehost/sites/all/themes/ines_themes/independent_theme/img/reuse.png" width="25">Reuse content</a>
</p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html
index 08840dc24..b08ca34e5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/bug-1255978/source.html
@@ -7,248 +7,6 @@
<!--<![endif]-->
<head>
- <style type="text/css" class="bc-style-2d3d4a83-ba40-464e-9bfb-2804b076bf67-default">
- .bc-iframe,
- .bc-iframe body {
- height: 100%;
- margin: 0;
- padding: 0;
- width: 100%
- }
-
- .bc-iframe body,
- .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default {
- background-color: #151B17
- }
-
- .bc-iframe .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default {
- background-color: transparent
- }
-
- .vjs-hidden {
- display: none
- } // Visually hidden offscreen,but accessible to screen readers. .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default *,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default :after,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default :before{box-sizing:inherit;font-size:inherit;color:inherit;line-height:inherit;margin:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default select{width:inherit}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default:-moz-full-screen{position:absolute}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default:-webkit-full-screen{width:100%!important;height:100%!important}@font-face{font-family:VideoJS;src:url(//vjs.zencdn.net/f/3/vjs.eot);src:url(//vjs.zencdn.net/f/3/vjs.eot?#iefix) format('embedded-opentype'),url(//vjs.zencdn.net/f/3/vjs.woff) format('woff'),url(//vjs.zencdn.net/f/3/vjs.ttf) format('truetype'),url(//vjs.zencdn.net/f/3/vjs.svg#icomoon) format('svg');font-weight:400;font-style:normal}@font-face{font-family:VideoJS;src:url(data:application/octet-stream;base64,d09GRk9UVE8AAA2kAAoAAAAADVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAACdMAAAnTVAEFP09TLzIAAArIAAAAYAAAAGAOkgMqY21hcAAACygAAABcAAAAXPqtrG5nYXNwAAALhAAAAAgAAAAIAAAAEGhlYWQAAAuMAAAANgAAADYDr5QBaGhlYQAAC8QAAAAkAAAAJAkgBTVobXR4AAAL6AAAAFgAAABYS54C2G1heHAAAAxAAAAABgAAAAYAFlAAbmFtZQAADEgAAAE5AAABOUQYtNZwb3N0AAANhAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA7+BwC+BsD+BgEHgoACXf/i4seCgAJd/+LiwwHi0UcBV76VAUdAAAA3Q8dAAAA4hEdAAAACR0AAAnKEgAXAQEIDxETFhsgJSovNDk+Q0hNUldcYWZrcGljb21vb25pY29tb29udTB1MXUyMHVFMDAwdUUwMDF1RTAwMnVFMDAzdUUwMDR1RTAwNXVFMDA2dUUwMDd1RTAwOHVFMDA5dUUwMEF1RTAwQnVFMDBDdUUwMER1RTAwRXVFMDFFdUUwMUZ1RTYwMAAAAgGJABQAFgIAAQAEAAcACgANAEUAVABzAJ0A/QGbAn0CkAOSA6IE2QURBV8GIQagB5QICAi4/pQO/pQO/pQO/JQO+pT6VBWL/DT7NPc0+1T7VCvr91T3VPs09zQF+zT9NBX7VPtU9zT7NPw0i4v4NPc0+zT3VPdUBQ73VPnUFfkU/BT9FPwUBQ73FPnUFffUi4v9lPvUiwX4VPmUFffUi4v9lPvUiwUO+CX6BRWlpaCCi2cIi/3QBYtndoJxpQj7hfeF+zSLi/gU9zSL94X3hQUO+Ln3bxV/i36QgpR4noupnp7c3Iv3GDrceJ6LqZ6enp6pi5549wr7C4v7VPsK+wuCgn6Gf4sI+yj5KhWlpaCCi2cIi/3QBYtndoJxpQj7hfeF+zSLi/gU9zSL94X3hQUO+WT3FBV+i3+QgpV4nYuqnp33F/cXi/dq+xf3F3idi6qenZ2eqoudeN06uPsBi/sHi/sHXvsBOTqCgX+Gf4sI+z/mFX+LfpCClHiei6mentzci/cYOtx4noupnp6enqmLnnj3CvsLi/tU+wr7C4KCfoZ/iwj7KPkqFaWloIKLZwiL/dAFi2d2gnGlCPuF94X7NIuL+BT3NIv3hfeFBQ7L+g6xFX+LfpCClHiei6menuPju/cIi/cQi/cQW/cIM+N4noupnp6enqmLnnj1IcX7IIv7Kov7KlH7ICEhCIKCfoZ/iwj7PuUVfot/kIKVeJ2Lqp6d9xf3F4v3avsX9xd4nYuqnp2dnqqLnXjdOrj7AYv7B4v7B177ATk6goF/hn+LCPs/5hV/i36QgpR4noupnp7c3Iv3GDrceJ6LqZ6enp6pi5549wr7C4v7VPsK+wuCgn6Gf4sI+yj5KhWlpaCCi2cIi/3QBYtndoJxpQj7hfeF+zSLi/gU9zSL94X3hQUO+JT6VBX71PyU99T8lPfU+JQFDvfyi/pUFRwFXouL/poc+qKLi/qaBRwE3fyTFYr3SITaYMKEl3ySf5RhqftZlvt5i/t4i/tjgGJtf4J8hIJ/YlSFPIj7SI77SJE9tFOUfpqFl4MItGv3Y4H3eIn3eY33WZW1q5eTmpGSmLbDktmM90gI/Nu6FYD3IUDe+xqL+w+LK/sDi/tFi/tG4/sD9yWL9wiL3OCX9yEI+x6LBYZXdWNci0KLftOL2Iv1qcG+i7iLqGqPUgj3HIsF+HKLFX/3IUHe+xuL+w6LK/sDi/tFi/tG4vsD9yWL9wiL3OCY9yEI+x6LBYVXdWNdi0KLftOL2Iv1qcG+i7iLp2qQUgj3HIsFDvcU+dQV+ZSLi/2U/ZSLBQ74FPnUFYtExFLSi9KLxMSL0ovSUsREi0SLUlKLRAj3pPsEFYtExFLSi9GLxcSL0ovRUcVFi0SLUlGLRQj3RPukFYtoqG6ui66LqKiLrouubqhoi2iLbm6LaAj7BPukFYtop26vi66LqKiLrouvbqdoi2eLb2+LZwj7pPsEFYuLi4uLi4toqG6ui66LqKiLrouLi4uLi4uLi4uLi4uubqhoi2iLbm6LaIuLi4uLiwj7pPcEFYuLi4uLi4toqG6ui6+Lp6iLrouLi4uLi4uLi4uLi4uvb6dni2iLbm+LZ4uLi4uLiwhr+LQVi4uLi4uLi1a2YMCLwIu2tovAi4uLi4uLi4uLi4uLi8BgtlaLVotgYItWi4uLi4uLCDP7pBWLY6trs4uzi6uri7OLs2urY4tji2tri2MIDvhU+BQVi/w0+zT3NPtU+1Qr6/dU91T7NPc0Bfp0+HQV+1T7VPc0+zT8NIuL+DT3NPs091T3VAUO+JT6FBX3r4v3eftOi/t6i/t6+3n7Tvuvi3CLcI1xjvsC+wL7F3f7E4gIi6YF0K3GyIvRi5WKlIqV+wjXQfcIi/cXi/d693n3TveviwgO+JT6VBX7r4v7eft5i/uvi/uv93n7efevi/evi/d593mL96+L96/7efd5+6+LCIv7lBX3IYv3B/sHi/shi/sh+wf7B/shi/shi/sH9weL9yGL9yH3B/cH9yGLCPfF/MUVOjn7AV77B4v7B4v7Abg63TncXvcBi/cHi/cHuPcB3dwIzkgFi4uLi4uL+xf7F4v7avcX+xfLTN9o5Yvli9+uy8r3F/cXi/dq+xf3FwjOzgXdOrj7AYv7B4v7B177ATk6CA759PeUFV6LYnhubQj8Q/dsBYyTjJOLlIuUipOKkwj4Q/dsBahttHi4i+OL09OL44vjQ9MzizOLQ0OLM4uCjIOMgwj8Q/tsBW6pYp5eizOLQ0OLM4sz00Pji7iLtJ6oqQj4Q/tsBYqDioOLgosz00Pji+OL09OL44vjQ9MziwgO+pT4VBWKznzOcMdxyGTDW7hcuVKvTqNOo0qWSopKikt9UHFQcVVlX11fXWhUdFB0UIBMjEwIjEyZTaRSpFKwV7dguGDAasR1xHTIgciMyIzHmcKjwqO9rrS3tbarvqHCmKyUro+vCIyLjYuMi66LqKeLr4uMi42LjQiLiwUl+z4VdFZpW2FjYWNabFZ2VnZSglKMUoxTmFihWKJcrGWzZbNtu3e+d7+CwYzCjMKXwKG9CKG8q7iysLGvuai8nr2ewJS/isCKvn+7drp2tmyuZq9mpl+eW51ck1iKWQiLiwWLiYuJi4qLaqRvq4iFaIFpfGsIDviU+lQV+6uL+3b7c4T7qZH3hvdM91b3dov3eov3Tvtdi/uLi1a2YMCLwIu2tovAi/ev+3n3efuviwiL/pQV96uL93b3c5L3qYX7hvtM+1b7dov7eov7Tvddi/eLi8BgtlaLVotgYItWi/uv93n7efeviwgO+pT39BWL91T7J6QFhZ2EnIOcCOH3Dfsc9xz7DTUFepN6k3iRCHP3JvtUi3P7JgV4hXqDeoMI+w3h+xz7HOH7DQWDeoR6hXkI+ydyi/tU9ydyBZF5knqUegg0+w33HPsc9w7iBZuDnIOdhQik+yf3VIuk9ycFnZGck5uTCPcONPcc9xw09w0FlJySnJGdCPcnpAX8lGsVRItSxIvSi9LExNKL0ovEUotEi0RSUkSLCA76lBT6lBWLDAoAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gADwP/A/8ADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABABIAAAADgAIAAIABgABACDgDuAf5gD//f//AAAAAAAg4ADgHuYA//3//wAB/+MgBB/1GhUAAwABAAAAAAAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAi7ha+V8PPPUACwQAAAAAAM+Zp8UAAAAAz5mnxQAA/7oFXgPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAVeAAAAAAVeAAEAAAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAAAAAAAgAAAAQAAAAEAADABAAAgAQAAAAEAAAABAAAAARAAAAEAADABV4AAAQAAIAEAAA4BAAAAAQAAAAEAAAABAAAAAQAACAEAAAABAAAAAAAUAAAFgAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoAKABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoAKABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff'),url(data:application/octet-stream;base64,AAEAAAALAIAAAwAwT1MvMg6SAyoAAAC8AAAAYGNtYXD6raxuAAABHAAAAFxnYXNwAAAAEAAAAXgAAAAIZ2x5Zu/tc60AAAGAAAAOQGhlYWQDr5QBAAAPwAAAADZoaGVhCSAFNQAAD/gAAAAkaG10eEueAtgAABAcAAAAWGxvY2EeBBsAAAAQdAAAAC5tYXhwAB8A5gAAEKQAAAAgbmFtZUQYtNYAABDEAAABOXBvc3QAAwAAAAASAAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAAPA/8D/wAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEAEgAAAAOAAgAAgAGAAEAIOAO4B/mAP/9//8AAAAAACDgAOAe5gD//f//AAH/4yAEH/UaFQADAAEAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAIAAP/ABAADwAAGAA0AAAERJwcnNycDBxchERc3BACgwGDAoKDAoP5goMADwP5goMBgwKD9YMCgAaCgwAAAAAABAMAAQANAA0AAAgAAEwkBwAKA/YADQP6A/oAAAgCAAEADgANAAAMABwAAEyERIQEhESGAAUD+wAHAAUD+wANA/QADAP0AAAABAAAADwHAA3EAEAAAAT4BHgEVERQOASYvASMRMzcBkQoRDQcHDREK8aCg8QNxCgcGEA78xA4QBgcK8QGA8QAAAgAAAA8CRwNxACMANAAAJSIuAicuATQ2Nz4BNCYnLgE0Njc+ATIWFx4BFAYHDgMjAz4BHgEVERQOASYvASMRMzcCJQUJCAgEBwcHBx4fHx4HBwcHBxISEgcsLS0sBAgICQWUChENBwcNEQrxoKDx2wIDBgMHEhISBx5NUE0eBxISEgcHBwcHLHF0cSwDBgMCApYKBwYQDvzEDhAGBwrxAYDxAAADAAAADwNwA3EAKABMAF0AACUiLgInLgE0Njc+ATQmJy4BNDY3PgEyFhceAxUUDgIHDgMjJyIuAicuATQ2Nz4BNCYnLgE0Njc+ATIWFx4BFAYHDgMjAz4BHgEVERQOASYvASMRMzcC0AUJCQgDBwcHBzExMTEHBwcHBxETEQcfLyARESAvHwMICQkEqwUJCAgEBwcHBx4fHx4HBwcHBxISEgcsLS0sBAgICQWUChENBwcNEQrxoKDxgAIEBQQHERMRBzJ7gnsyBxETEQcHCAgHHkdNVCsrVE1HHgQFBAJbAgMGAwcSEhIHHk1QTR4HEhISBwcHBwcscXRxLAMGAwIClgoHBhAO/MQOEAYHCvEBgPEAAAAEAAAADwRAA3EALQBWAHoAiwAAJSIuAicuATQ2Nz4DNTQuAicuATQ2Nz4BMhYXHgMVFA4CBw4DIyciLgInLgE0Njc+ATQmJy4BNDY3PgEyFhceAxUUDgIHDgMjJyIuAicuATQ2Nz4BNCYnLgE0Njc+ATIWFx4BFAYHDgMjAz4BHgEVERQOASYvASMRMzcDegUJCAgEBwcHByEzIhISIjMhBwcHBwcSEhIHKD0pFhYpPSgECAgJBaoFCQkIAwcHBwcxMTExBwcHBwcRExEHHy8gEREgLx8DCAkJBKsFCQgIBAcHBwceHx8eBwcHBwcSEhIHLC0tLAQICAkFlAoRDQcHDREK8aCg8SYCAwYDBxISEgchTFNaLi5aU0whBxISEgcHBwcHKFtlbDg4bGVbKAMGAwJaAgQFBAcRExEHMnuCezIHERMRBwcICAceR01UKytUTUceBAUEAlsCAwYDBxISEgceTVBNHgcSEhIHBwcHByxxdHEsAwYDAgKWCgcGEA78xA4QBgcK8QGA8QABAMD/wANAA8AAAwAACQMCAP7AAUABQAPA/gD+AAIAAAQAAP+6BV4DwAAEAEEAbACXAAATIREhEQE0LgInLgMnLgMjIg4CBw4DBw4DBx4DFx4DFx4DFz4DNz4DNz4DNSUuAyMiDgIVFB4CMzI+AjcjDgMjIi4CNTQ+AjMyHgIXMyEuAyMiDgIVFB4CMzI+AjcjDgMjIi4CNTQ+AjMyHgIXMwAFXvqiBN0ECxQQAwgJCQUQVX2cVlWfgFgQBAoKCAQPEwsEAQEECxMPBAgKCgQQWICfVVacfVUQBQkJCAMQFAsE/bkEIDhOMi5QOyIgPFY3K0k2IwSKAgoSGhIbIhMGCxUeExEbFAwCiAHeBCE3TjMtUDsiIDxWNixJNiIFigILEhoRGyITBgsVHhMQHBQMAogDwPv6BAb+AURjSjUUBQcGBgQLEAoEBAoQCwQGBgcFFDVKY0RDZEk1FQUHBgYDDBAKBQEBBQoQDAMGBgcFFTVJZEMvNVM5HyhLa0JDa0soHzpUNRMiGQ4ZKTYdKDspFAwXIhU1UzkfKEtrQkNrSygfOlQ1EyIZDhkpNh0oOykUDBciFQAAAAEAgABAA4ADQAADAAATIREhgAMA/QADQP0AAAAIADgAAAPAA8AAFAApAD4AUwB8AKUAzgDjAAABFB4CMzI+AjU0LgIjIg4CFQUUHgIzMj4CNTQuAiMiDgIVExQeAjMyPgI1NC4CIyIOAhUDFB4CMzI+AjU0LgIjIg4CFQU4AzEUHgIzMj4CNTgDMTgDMTQuAiMiDgIVOAMxJTgDMRQeAjMyPgI1OAMxOAMxNC4CIyIOAhU4AzEDOAMxFB4CMzI+AjU4AzE4AzE0LgIjIg4CFTgDMQMUHgIzMj4CNTQuAiMiDgIVAYAUIy4bGy4jFBQjLhsbLiMUARAUIi8bGi8iFRUiLxobLyIUsAoRGA0NGBEKChEYDQ0YEQpwChEXDg0XEQsLERcNDhcRCv7wChEYDQ0YEQoKERgNDRgRCv7wCxEXDQ4XEQoKERcODRcRCyAQGiMTFCMaDw8aIxQTIxoQWAsUGg8PGhQLCxQaDw8aFAsDQBsuIxQUIy4bGy4jFBQjLhtwGy8iFBQiLxsaLyIVFSIvGv7wDRgRCgoRGA0NGBEKChEYDf7wDRcRCwsRFw0OFxEKChEXDnANGBEKChEYDQ0YEQoKERgNcA0XEQsLERcNDhcRCgoRFw4CIBQjGg8PGiMUEyMaEBAaIxP+8A8aFAsLFBoPDxoUCwsUGg8AAAAAAgAA/8AEAAPAAAYADQAAAREnByc3JwEHFyERFzcBwKDAYMCgA+DAoP5goMABgP5goMBgwKAB4MCgAaCgwAAAAAEAAP/ABAADgAApAAABMh4CFRQOAiMiLgInDgMHNT4DNTwBLgE1LgM1ND4CMwIAaruLUFCLu2oKFBQUCilaXWAwGi4jFQEBLEYxG1CLu2oDgEFxmFZWmHFBAQECASkzHQoCGw0jKjEaBAcHBwQcSFJcMVaYcUEAAAMAAP/ABAADwAAUACkAYwAAASIOAhUUHgIzMj4CNTQuAiMRMh4CFRQOAiMiLgI1ND4CMwEOAyMiLgInLgM1ND4CNxc4AzEOARQWFx4DMzI+Ajc+ATQmJzceAxUUDgIHAgBqu4tQUIu7amq7i1BQi7tqNV1GKChGXTU1XUYoKEZdNQExHkdNVCsrVE1HHh8vIBERIC8fQzExMTEYNz1AIiJAPTcYMTExMUMfLyARESAvHwPAUIu7amq7i1BQi7tqaruLUP8AKEZdNTVdRigoRl01NV1GKP3PHy8gEREgLx8eR01UKytUTUceQzJ7gnsyFyUZDQ0ZJRcye4J7MkMeR01UKytUTUceAAEAAP/ABAADwABUAAABIg4CByU0PgE0NTwBLgE1JR4DMzI+AjU0LgIjIg4CFRwBHgEVBS4DIyIOAhUUHgIzMj4CNwUUDgEUFRQeAjMyPgI1NC4CIwNgESAdGgv+UQEBAQEBrwsaHSARITosGRksOiEhOiwZAQH+UQsaHSARITosGRksOiERIB0aCwGvAQEZLDohITosGRksOiEBAAcMEwvYAwYGBwMDBwYGA9gLEwwHGSw6ISE6LBkZLDohAwcGBgPYCxMMBxksOiEhOiwZBwwTC9gDBgYHAyE6LBkZLDohITosGQAAAAACACD/8AQAA7AAYAC8AAABNC4CJy4DJy4DJy4DByIOAgcOAwcOAwcOAxcUHgIXHgMXHgMXHgM3Mj4CNz4DNz4DNz4DNzoDMTI+AjUwPAI1MQcOAwcOAwcOAyciLgInLgMnLgMnLgM3ND4CNz4DNz4DNz4DFzIeAhceAxceAxceAwczBhYGFiMeAxcOAwcEAAYLEAoKGBwhEhEnKiwXFjAwMRgYMS8uFhYrJyQRER0aFggJDQgEAQYKDwkKFxofEBEkJykWFS0tLRcXLSwrFRUnJSIPEBwYFAgFCAYFAgEBAQENGBEKZggWGRwQDyMkJhQUKSorFRUqKigTEyUiHw8OGhYTBwgLBwMBBQkNCAgUGBoODx8iIxMSJyYoExUmJyQTECMfHgwOFxYQCAULBgQCAQEBAQEBAQgQFA0DBQkIBwHAGTIxMBYXLCklERIeGxYJCQ0JBAEGCw8JChgbIBERJigrFhYuLi8YGC4uLRUWKCYkEBAcGRUICQwIBAEGCg4JCRYaHREQIyYnFQ0ZGhsNChEXDgIBAQGqFCYjIQ8PGxcTCAgLBwQBBgkNCAkVGBsPDyEjJRMTKCkpFBQpKCYTEiMhHw4NGRUSBwgKBwMBBQkMCAgTFxkODh4hIhIRJSUmEwEBAQINFhELAQ0aGRkMAAAAAAIAAP/ABAADwAAeAD0AAAEiDgIHPgMzMh4CFRQeAjMyPgI1NC4CIxEyPgI3DgMjIi4CNTQuAiMiDgIVFB4CMwIAabiKUgMCQ3GVVVaYcUEPGiMUFCMaD1CLu2ppuIpSAwJDcZVVVphxQQ8aIxQUIxoPUIu7agPAToi2aFufdkRGeqNdFCMaDw8aIxRqu4tQ/ABOiLZoW592REZ6o10UIxoPDxojFGq7i1AAAAACAAD/wAQAA8AAQABVAAABNScuAyc3JwcuAy8BIwcOAwcnBxcOAw8BFRceAxcHFzceAx8BMzc+AzcXNyc+Az8BBSIuAjU0PgIzMh4CFRQOAiMEAJMCBQUGA1aIeQYNDQ4HGMAYBw4NDQZ5iFYDBgUFApOTAgUGBgNXiHoGDA0OBhnAGQYODQwGeohXAwYGBQKT/gAbLiMUFCMuGxsuIxQUIy4bAWDAGQYODQ0GeYhWAwYFBQOSkgMFBQYDVoh5Bg0NDgYZwBkGDg0MB3mIVwMGBQUDk5MDBQUGA1eIeQcMDQ4GGSAUIy4bGy4jFBQjLhsbLiMUAAAAAAEAAAAAAADWgo+QXw889QALBAAAAAAAz5mnxQAAAADPmafFAAD/ugVeA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABV4AAAAABV4AAQAAAAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAAACAAAABAAAAAQAAMAEAACABAAAAAQAAAAEAAAABEAAAAQAAMAFXgAABAAAgAQAADgEAAAABAAAAAQAAAAEAAAABAAAIAQAAAAEAAAAAAAAAAAKABQAHgA+AEwAYgCCANQBXgIkAjQDAAMOBAAEIARcBOAFVAZOBqQHIAAAAAEAAAAWAOQACAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgAoAGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgAoAGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype')}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default{box-sizing:content-box;color:#fff;font-family:sans-serif;font-size:14px;height:150px;overflow:hidden;position:relative;transition:cursor 4s;width:300px}.bc-iframe .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default{position:absolute;top:0;bottom:0;width:100%;height:100%}@media screen\0{.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js{box-sizing:content-box;color:#fff;font-family:sans-serif;font-size:14px;height:150px;overflow:hidden;position:relative;transition:cursor 4s;width:300px}.bc-iframe .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js{position:absolute;top:0;bottom:0;width:100%;height:100%}}.bc-iframe body{bottom:0;height:auto;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-user-inactive.vjs-fullscreen{cursor:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default:fullscreen{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.bc-iframe .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tech{display:none}.bc-wrap{transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js .vjs-tech{display:block;opacity:0;transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-plugins-ready .vjs-tech{opacity:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-poster{opacity:0;transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-plugins-ready .vjs-poster{opacity:1}.bc-wrap{background-size:contain;background-position:50% 50%;background-repeat:no-repeat}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-poster{background-repeat:no-repeat;background-position:center;background-size:contain;background-color:#151B17;height:100%;position:absolute;top:0;width:100%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started .vjs-poster{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-audio.vjs-has-started .vjs-poster{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-using-native-controls .vjs-poster{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-modal-dialog,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-modal-dialog-content{box-sizing:border-box;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.8)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-modal-dialog-content{font-size:12px;line-height:1.5;padding:20px 24px;z-index:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control.vjs-close-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-icon-cancel{font-family:VideoJS;font-weight:400;font-style:normal}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-share-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-spacer{-webkit-box-ordinal-group:5;-moz-box-ordinal-group:5;-webkit-order:5;-ms-flex-order:5;order:5}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button{background:rgba(0,0,0,.45);border-radius:21px;cursor:pointer;height:96px;left:23px;position:absolute;top:21px;width:144px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:before{content:'\e001';color:#fff;display:block;font-family:VideoJS;font-size:23px;line-height:27px;margin:36px auto;opacity:.8;text-align:center;width:23px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started .vjs-big-play-button{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-autoplay .vjs-big-play-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-autoplay .vjs-poster{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-controls-disabled .vjs-big-play-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-controls-disabled.vjs-controls-disabled .vjs-control-bar{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-using-native-controls .vjs-big-play-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-using-native-controls.vjs-using-native-controls .vjs-control-bar{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-text{background-color:transparent;border:0;height:0;width:0;display:block;overflow:hidden;text-indent:-9999px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-text:before{content:'';display:block;width:0;height:150%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started .vjs-control-bar{display:flex}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-controls-disabled .vjs-control-bar{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-using-native-controls .vjs-control-bar{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar{color:#fff;background-color:rgba(0,0,0,.45);border-top:1px solid #000;border-top:1px solid rgba(0,0,0,.6);bottom:0;box-sizing:border-box;left:0;right:0;height:50px;line-height:50px;position:absolute;transition:transform .5s,margin .5s;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;align-content:center;align-items:center}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-control-bar{margin-left:-18px;pointer-events:none;transform:translateY(50px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-time-divider{transition:width .5s,opacity .5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-time-divider{width:0;padding:0;opacity:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-progress-control{opacity:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-progress-control{transition:transform .5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-progress-control{transform:translateY(-28px);width:58px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default button{background:0 0;border:none;margin:0;padding:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control{box-sizing:border-box;cursor:pointer;width:58px;height:50px;flex:0 0 auto;align-self:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:before{display:block;font-family:VideoJS;font-size:24px;line-height:26px;margin:0 auto;opacity:.8;position:relative;text-align:center;top:13px;width:43px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-item:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar:focus{outline:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:focus:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:hover:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-item:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-item:hover{text-shadow:-1px 1px 20px #fff,1px -1px 20px #fff,-1px 1px 20px #fff,1px -1px 20px #fff}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:focus,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:hover,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder:focus:before{box-shadow:0 0 15px 3px #FFF}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-progress-holder:focus:before{box-shadow:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-control{order:5;flex:1 0 auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-current-time:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-duration:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-control:before{content:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-load-progress,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-progress,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-seek-handle{float:left;display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder{position:relative;height:4px;padding:24px 0 22px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder:before{content:"";display:block;background-color:#8b8e8c;background-color:rgba(255,255,255,.3);width:100%;height:4px;position:absolute}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-load-progress,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-progress{float:none;height:4px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-progress,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-level{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAYAAABWKLW/AAAAHElEQVQIW2P8//+/DyMj4xYGIGAEETABMAcmAADkAAtNi9y2WAAAAABJRU5ErkJggg==) repeat;background-color:#d52484}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-progress{margin-top:-4px;width:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-load-progress{background-color:rgba(255,255,255,.3)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-load-progress{width:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-control{order:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-control:before{content:'\e001'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-control.vjs-playing:before{content:'\e002'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-current-time,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-duration,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-time-divider{cursor:default;text-align:center}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-current-time{order:2}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-time-divider{width:4px;order:3}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-duration{order:4}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button{order:6}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button{order:8}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button:before{content:'\e008'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button:before{content:'\e00c'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-fullscreen-control{order:9}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-fullscreen-control:before{content:'\e000'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button&gt;.vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button&gt;.vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-current-time .vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-duration .vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-live-display .vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-control .vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button&gt;.vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-handle .vjs-control-text,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button&gt;.vjs-control-text{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-remaining-time{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-live-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-current-time,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-progress-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-time-divider,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live.vjs-ad-playing .vjs-live-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live.vjs-ad-playing .vjs-live-control .vjs-live-display{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-live-control{width:51px;order:5}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-live-control .vjs-live-display{margin:0 5px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-live-control{flex:1 0 auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-live-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-live-control .vjs-live-display,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live.vjs-ad-playing .vjs-current-time,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live.vjs-ad-playing .vjs-progress-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live.vjs-ad-playing .vjs-time-divider{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu{display:none;margin:0 -14px 60px -14px;position:absolute;overflow:visible;width:76px;list-style:none;padding:0;transition-property:width,height,opacity;transition-delay:.5s;opacity:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-content{background-color:rgba(0,0,0,.45)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button .vjs-menu.vjs-lock-showing,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button:active .vjs-menu,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-menu-button:hover .vjs-menu{display:block;bottom:0;opacity:1;transition-property:opacity;transition-delay:0s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu .vjs-menu-title{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu .vjs-menu-item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:24px;line-height:24px;display:block;text-align:center;padding:7px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu .vjs-menu-item.vjs-selected{background-color:#fff;background-color:rgba(255,255,255,.8);color:#000;color:rgba(0,0,0,.6)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-content{padding:0;margin:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;margin:0;padding:0;position:absolute;bottom:0;max-height:360px;overflow:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button .vjs-menu-content{width:140px;left:-32px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button .vjs-texttrack-settings{padding-bottom:7px;border-bottom:1px solid;border-color:#d52484}.vjs-modal-overlay{position:absolute;color:#fff;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:300;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.75);padding:45px 70px;text-align:left;letter-spacing:1px}@media only screen and (max-width :480px){.vjs-modal-overlay{padding:20px 35px}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-text-track-display{position:absolute;top:0;left:0;bottom:50px;right:0;pointer-events:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-text-track-display{bottom:33px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings{position:absolute;overflow:auto;top:45px;right:70px;bottom:50px;left:70px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-controls{position:absolute;bottom:0;left:70px;right:70px;padding:10px 0;text-align:right}@media only screen and (max-width:480px){.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-controls{left:35px;right:35px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings{top:20px;bottom:40px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-controls{padding:5px 0;bottom:0}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-tracksetting label{display:block;width:100px;margin-bottom:5px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-tracksetting&gt;div{margin-bottom:5px;min-height:20px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-tracksetting&gt;div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings label&gt;input{margin-right:10px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings input[type=button]{width:40px;height:40px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings .vjs-label{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-colors,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-font{box-sizing:border-box;float:left;width:50%;padding:3px;min-height:40px;min-width:280px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-colors:after,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-controls:after,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-font:after{clear:both}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksetting{margin-bottom:16px;min-height:20px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-opacity{margin-left:10px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksetting button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksetting input,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksetting select,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-tracksettings-controls button{margin-top:6px;font:inherit;border-radius:2px;background-color:#fff;padding:0 9px;line-height:24px;height:24px;border:none;color:#515151;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-edge-style select,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-font-family select{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings button{margin-right:10px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-caption-settings .vjs-done-button{margin-right:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-mute-control:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button:before{content:'\e006'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-mute-control.vjs-vol-0:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button.vjs-vol-0:before{content:'\e003'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-mute-control.vjs-vol-2:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button.vjs-vol-2:before{content:'\e005'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-mute-control.vjs-vol-1:before,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button.vjs-vol-1:before{content:'\e004'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button .vjs-menu{background-color:transparent;opacity:0;bottom:33px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button .vjs-menu-content{margin-right:0;background-color:rgba(0,0,0,.45);width:0;height:0;padding:0 10px;transform:translate(25px,0);transition-property:width,height;transition-delay:0s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button:active .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{height:87px;width:23px;padding:10px 0;overflow:visible}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button.vjs-menu-button:active .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button.vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button.vjs-menu-button:active .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button.vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button.vjs-menu-button:active .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button.vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-captions-button.vjs-menu-button:hover .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-chapters-button.vjs-menu-button:hover .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-subtitles-button.vjs-menu-button:hover .vjs-menu .vjs-menu-content{height:auto;box-sizing:content-box}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button .vjs-menu.vjs-lock-showing{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar:before{content:"";display:block;background-color:#8b8e8c;background-color:rgba(255,255,255,.3);position:absolute;box-shadow:0 0 15px 2px #fff}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar.vjs-slider-vertical.vjs-slider-vertical:before{width:3px;height:100%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar.vjs-slider-horizontal:before{width:100%;height:3px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar{position:relative;padding:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar.vjs-slider-vertical.vjs-slider-vertical{height:100%;width:3px;padding:0 10px 0 10px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar.vjs-slider-horizontal{height:3px;padding:10px 0 10px 0;width:100%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-level{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAYAAABWKLW/AAAAHElEQVQIW2P8//+/DyMj4xYGIGAEETABMAcmAADkAAtNi9y2WAAAAABJRU5ErkJggg==);background-color:#d52484;display:block;width:3px;background-repeat:repeat repeat;position:absolute;bottom:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-level.vjs-volume-level{height:100%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-handle{position:absolute;width:5px;background-color:#fff;left:100%;margin-top:-4px;height:5px;float:none;display:block;transform:rotate(45deg)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-loading-spinner{animation:rotation .6s infinite linear;border:6px solid rgba(255,255,255,.15);border-radius:100%;display:none;height:60px;left:50%;margin:-30px 0 0 -30px;position:absolute;top:50%;width:60px}.vjs-waiting.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-loading-spinner{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-loading-spinner:before{content:"";display:block;position:absolute;left:-6px;top:-6px;height:100%;width:100%;border-top:6px solid rgba(255,255,255,.8);border-left:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid transparent;border-radius:100%}@keyframes rotation{from{transform:rotate(0)}to{transform:rotate(359deg)}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-native .vjs-big-play-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-native .vjs-control-bar,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-native .vjs-loading-spinner,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-native .vjs-poster,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-native .vjs-text-track-display{display:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse{font-size:12px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .bc-wrap{filter:blur(10px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-big-play-button{width:156px;height:105px;top:17px;left:17px;position:absolute}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-control-bar{display:flex;height:33px;line-height:33px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control-bar,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-progress-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-time-divider{transition-delay:3s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control-bar{margin-left:-15px;pointer-events:none;transform:translateY(33px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-progress-control{transform:translateY(-19px);width:48px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-control{height:33px;width:48px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-control:before{font-size:16px;line-height:18px;opacity:.8;width:24px;text-align:center;top:8px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-progress-holder{padding:15px 0 14px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-menu{width:76px;margin:0 -14px 33px -14px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button:before{content:'\e006'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button.vjs-vol-0:before{content:'\e003'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button.vjs-vol-2:before{content:'\e005'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-volume-menu-button.vjs-vol-1:before{content:'\e004'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-fullscreen-control:before{content:'\e000'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.video-js:fullscreen .vjs-fullscreen-control:before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.video-js.vjs-fullscreen .vjs-fullscreen-control:before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-hidden{display:none}@media (max-width:480px){.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default:not(.vjs-has-started) .vjs-control-bar{visibility:hidden}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default *,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default :after,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default :before{-webkit-box-sizing:content-box}@-moz-document url-prefix(){.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar{width:100%;-moz-box-sizing:border-box}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started .vjs-control-bar,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-control-bar{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar{-webkit-backface-visibility:hidden;-webkit-transition:-webkit-transform .5s,margin .5s;-moz-transition:-moz-transform .5s,margin .5s;-ms-transition:-ms-transform .5s,margin .5s;-o-transition:-o-transform .5s,margin .5s;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;-webkit-box-pack:justify;-moz-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;-webkit-align-content:center;-ms-flex-line-pack:center;-webkit-box-align:center;-moz-box-align:center;-webkit-align-items:center;-ms-flex-align:center}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-control-bar{-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-ms-transform:translateY(50px);-o-transform:translateY(50px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-time-divider{-webkit-transition:width .5s,opacity .5s;-moz-transition:width .5s opacity .5s;-ms-transition:width .5s opacity .5s;-o-transition:width .5s opacity .5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control-bar .vjs-progress-control{-webkit-transition:-webkit-transform .5s;-moz-transition:-moz-transform .5s;-ms-transition:-ms-transform .5s;-o-transition:-o-transform .5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-has-started.vjs-user-inactive .vjs-progress-control{-webkit-transform:translateY(-28px);-moz-transform:translateY(-28px);-ms-transform:translateY(-28px);-o-transform:translateY(-28px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control{-moz-box-sizing:border-box;-webkit-box-flex:0;-moz-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;-webkit-align-self:auto;-ms-flex-item-align:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-control{-webkit-box-ordinal-group:5;-moz-box-ordinal-group:5;-webkit-order:5;-ms-flex-order:5;-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder{-webkit-user-select:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-play-control{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-webkit-order:1;-ms-flex-order:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-current-time{-webkit-box-ordinal-group:2;-moz-box-ordinal-group:2;-webkit-order:2;-ms-flex-order:2}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-time-divider{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;-webkit-order:3;-ms-flex-order:3}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-duration{-webkit-box-ordinal-group:4;-moz-box-ordinal-group:4;-webkit-order:4;-ms-flex-order:4}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-live-control{-webkit-box-ordinal-group:5;-moz-box-ordinal-group:5;-webkit-order:5;-ms-flex-order:5}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-live .vjs-live-control{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button{-webkit-box-ordinal-group:6;-moz-box-ordinal-group:6;-webkit-order:6;-ms-flex-order:6}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-captions-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-chapters-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-subtitles-button{-webkit-box-ordinal-group:8;-moz-box-ordinal-group:8;-webkit-order:8;-ms-flex-order:8}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-fullscreen-control{-webkit-box-ordinal-group:9;-moz-box-ordinal-group:9;-webkit-order:9;-ms-flex-order:9}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu{-webkit-transition-property:opacity;-moz-transition-property:opacity;-ms-transition-property:opacity;-o-transition-property:opacity;-webkit-transition-delay:.5s;-moz-transition-delay:.5s;-ms-transition-delay:.5s;-o-transition-delay:.5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu .vjs-menu-content{-webkit-transition-property:width,height;-moz-transition-property:width,height;-ms-transition-property:width,height;-o-transition-property:width,height;-webkit-transition-delay:.5s;-moz-transition-delay:.5s;-ms-transition-delay:.5s;-o-transition-delay:.5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button:active .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu-button:hover .vjs-menu .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-menu.vjs-lock-showing .vjs-menu-content{-webkit-transition-delay:0s;-moz-transition-delay:0s;-ms-transition-delay:0s;-o-transition-delay:0s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-menu-button .vjs-menu-content{-webkit-transform:translate(25px,0);-moz-transform:translate(25px,0);-ms-transform:translate(25px,0);-o-transform:translate(25px,0)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar{-webkit-user-select:none}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-handle{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .vjs-control-bar{display:flex;height:33px;line-height:33px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control-bar,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-progress-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-time-divider{-webkit-transition-delay:3s;-moz-transition-delay:3s;-ms-transition-delay:3s;-o-transition-delay:3s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control-bar{-webkit-transform:translateY(33px);-moz-transform:translateY(33px);-ms-transform:translateY(33px);-o-transform:translateY(33px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-progress-control{-webkit-transform:translateY(-19px);-moz-transform:translateY(-19px);-ms-transform:translateY(-19px);-o-transform:translateY(-19px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex .vjs-control,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex .vjs-time-divider{float:left}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex .vjs-control-bar{display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex.vjs-user-inactive .vjs-control-bar{margin-left:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.vjs-has-started.vjs-user-inactive .vjs-control-bar{margin-left:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex.vjs-has-started.vjs-user-inactive .vjs-progress-control{-moz-transition:-moz-transform .5s .5s,width .5s .5s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-no-flex .vjs-progress-control~.vjs-control{float:right}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:full-screen{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-webkit-full-screen{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-moz-full-screen{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-ms-fullscreen{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-webkit-full-screen .vjs-fullscreen-control::before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-moz-full-screen .vjs-fullscreen-control::before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-ms-fullscreen .vjs-fullscreen-control::before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:-ms-fullscreen .vjs-big-play-button{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js:full-screen .vjs-fullscreen-control::before{content:'\e00b'}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8.vjs-has-started.vjs-user-inactive .vjs-control-bar{bottom:-33px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8.vjs-has-started.vjs-user-inactive .vjs-progress-control{position:absolute;display:block;bottom:19px;width:100%!important}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-big-play-button,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-control-bar,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-menu,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-menu-button .vjs-menu-content{background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=45)";zoom:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-control .vjs-menu-content{background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=45)"}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-captions-button .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-chapters-button .vjs-menu-content,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-subtitles-button .vjs-menu-content{border-top:1px solid #000;border-left:1px solid #000;border-right:1px solid #000}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-progress-holder{background:0 0}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-load-progress{background:0 0;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3CFFFFFF,endColorstr=#3CFFFFFF)";zoom:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-bar{background:0 0;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1EFFFFFF,endColorstr=#1EFFFFFF)";zoom:1}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-bar{margin:24px 0 22px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse.ie8 .vjs-volume-bar{margin:15px 0 14px}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-bar{background:0 0;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1EFFFFFF,endColorstr=#1EFFFFFF)";zoom:1;position:relative;height:5px;width:100%;margin:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-bar:after{display:block;width:100%;height:5px;position:absolute;top:50%}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .vjs-volume-level{width:100%;left:0;height:5px;bottom:auto;float:none;display:block}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-poster img{display:block;margin:auto}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.ie8 .bc-wrap{display:none}.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:focus,.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-big-play-button:hover,.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-progress-holder:focus:before{border:2px solid #fff}.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:focus:before,.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-control:hover:before,.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-bar:focus,.ie8 .bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-volume-control:hover{border:2px solid #fff}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-loading-spinner{-moz-animation:rotation .6s infinite linear}@-moz-keyframes rotation{from{-moz-transform:rotate(0)}to{-moz-transform:rotate(359deg)}}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-loading-spinner{-webkit-animation:rotation .6s infinite linear}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(359deg)}}.bc-wrap{-webkit-transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.vjs-mouse .bc-wrap{-webkit-filter:blur(10px)}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default.video-js .vjs-tech{-webkit-transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-poster{-webkit-transition:opacity .35s}.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-dock-shelf,.bc-player-2d3d4a83-ba40-464e-9bfb-2804b076bf67_default .vjs-dock-text{display:none}.vjs-error-display{color:#fff;display:none;font-family:Helvetica,Arial,sans serif;font-size:16px;line-height:1.428}.vjs-error .vjs-error-display{display:block;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5)}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:14px}.vjs-errors-dialog{text-align:left;border:1px #999 solid;overflow:hidden;position:absolute;top:5%;bottom:5%;left:5%;right:5%;background:rgba(24,24,24,.8);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#CC000000, endColorstr=#CC000000)"}.vjs-errors-details{margin-top:15px}.vjs-errors-message{border:1px #999 solid;background-color:#2c2c2c;overflow:auto;margin-top:15px;padding:15px}.vjs-errors-ok-button-container{display:block;position:absolute;bottom:15px;left:15px;right:15px;text-align:center}.vjs-errors-ok-button{display:block;margin:0 auto;width:80px;height:36px;background-color:#000;border:1px #999 solid;border-radius:5px;color:#999;font-size:14px;cursor:pointer}.vjs-errors-ok-button:hover{border:1px #FFF solid;color:#CCC}.vjs-errors-content-container{overflow:auto;position:absolute;padding-bottom:15px;top:75px;left:15px;right:15px;bottom:61px}.vjs-errors-headline{font-size:22px;font-weight:700;margin-top:0}.vjs-errors-close-button{background-color:transparent;font-size:14px;font-weight:700;cursor:pointer;float:right;margin:5px;border:0;color:#999}.vjs-errors-close-button:before{content:'X'}.vjs-errors-close-button:hover{color:#FFF}.vjs-xs.vjs-error-display{font-size:14px;background-color:#000}.vjs-xs.vjs-error-display .vjs-errors-close-button,.vjs-xs.vjs-error-display .vjs-errors-details,.vjs-xs.vjs-error-display .vjs-errors-message{display:none}.vjs-xs .vjs-errors-content-container{top:15px}.vjs-xs .vjs-errors-headline{font-size:16px;font-weight:700}.vjs-xs .vjs-errors-dialog{border:none;top:0;bottom:0;left:0;right:0}@media (max-width:600px),(max-height:250px){.vjs-error-display{font-size:14px;background-color:#000}.vjs-error-display .vjs-errors-close-button,.vjs-error-display .vjs-errors-details,.vjs-error-display .vjs-errors-message{display:none}.vjs-error-display .vjs-errors-content-container{top:15px}.vjs-error-display .vjs-errors-headline{font-size:16px;font-weight:700}.vjs-error-display .vjs-errors-dialog{border:none;top:0;bottom:0;left:0;right:0}}@font-face{font-family:VideoJS;src:url(../fonts/VideoJS.eot?#iefix) format("eot")}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAA54AAoAAAAAFmgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWUZFeBWNtYXAAAAE0AAAAOgAAAUriMBC2Z2x5ZgAAAXAAAAouAAAPUFvx6AdoZWFkAAALoAAAACsAAAA2DIPpX2hoZWEAAAvMAAAAGAAAACQOogcgaG10eAAAC+QAAAAPAAAAfNkAAABsb2NhAAAL9AAAAEAAAABAMMg06m1heHAAAAw0AAAAHwAAACABMAB5bmFtZQAADFQAAAElAAACCtXH9aBwb3N0AAANfAAAAPwAAAGBZkSN43icY2BkZ2CcwMDKwMFSyPKMgYHhF4RmjmEIZzzHwMDEwMrMgBUEpLmmMDh8ZPwoxw7iLmSHCDOCCADvEAo+AAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD7K/f8PUvCREUTzM0DVAwEjG8OIBwCPdwbVAAB4nI1Xe1CU1xX/zv1eLItLln0JwrIfC7sJGET2hRJ2N1GUoBJE8AESQEEhmBHjaB7UuBMTO4GMaSu7aY3RNlOdRPNqO2pqRmuTaSZtR6JJILUZk00a/4imjpmiecB303O/XUgMJOPufvd+99xzzz33nN855y4HHH7EfrGfIxwHRiANvF/sH71I9BzHszmpW+rGOQOXxXE6YhI4PoMT8zkT4cDFuf1cwMrZJI5cglM0HKVv0MaUFDgIFfg9mJJCG+kbKn1JkqBOVaFOkuhLpARq8fu0Nnc9/zdvfY9PxXW4PdH0C6N+PCejhorxFjAqRjgFRXSINEARbBGsoxcFK7IJmr4OycFJnInL59zIXwxui80fkGRbEHyosMWaATJKUfCskmwJQsAWANkmnIGOhlf514h7U8HNIv3owoHB0WMt0Eb3sx0guLi5pq/8Ny1q6969fKR9X9GBV6dPv6dp04K99SOwtmyPl47ApRa6n4ZpP1yjr5fn7MmYP/vXLUJs715UguklHBaHOZHZmG1N9FAIW2mf0MqWCIdo/8RZ1yGfxKUldDcGIbFA7ICO+vqOMSPTh/ZrSqgHi/bB/O8E8Mnzp+M+acxfpsTShBwej26TiGxBn7m4eEIO+Rueu6Hj+IFBnh88cAEUEQ//nVLx5C7kf+yIR47QEe+eMlhz9SqsGbe3hh2R03NGzoY6O42Kz8l7fB6fAk6LYnTyFo/FYyT6GGyNx2Jx2sdH4rA1Fo/HyCXaFyOp8dhYBCfJb2NIn1ImE6CYNGmgSTb52DawJR6jfXEmDU4xyTEmpgHHOIStoxfjSGdkbsK2w2jbdMQG4sgAstEONgURYCwGHhEhhscioQaAhhCf7McifEQc0l6+mxj9nI+gmSdiQ0Zbm7gZnIO7GSMEXG6UDAVocxAV8GcEXCKg1a02RcTtwANWRGIAyElor6n/+ZU2yOB3+T77Hb1MLqhn4KHVnQBjJnqe9QZSon6Kc5DxAD2vMdPL/BXSmQGwspa67z9wLUjdi9TN7QC7lyyBr9rpt7uXVC1CMpyjKRoXnGPHTuiaPLsNdc2dbAFQLAooPkXEh33FodHl4XpC6sPCIa0ftUIhHSYXVSu5iME+DIXsbZJ51BeidCgajcai43jU9nVzoSn2dPqcFvSoxSzJzgRKAx47WMRxOrIj3Wf0+hndxhJTiOkSEqxar3b3RKM9hY64oxBA64ieURLvCfpkDb8siBdUJ1bgT+urJ5PGfewQrmm5R5+0HmfyIPySD7OYkT0WxRePah8oEiyjlxIP74thVoRTURpmL6QhGuWS+QDjdANXjIM8SQa/1w128ODx0Qp4aLMNg9+JL3joUn8AMxW+aLNiuKjarn4uyyTdXjOzZTsh21uwldUvJoYza+zELALfu3p1L8/3krtyZ0Ag058J3hxHghvbGZn0dHZy6Mim/7Blre4lpHd1c28yVqRViO153F2oIWoXCIKbL4Z0cM1iaQn9mI5KuV2SzEvWXJDMNtkANpMdQoDDhIdD4A/YrP6Aye9ysxyE+uOEAcTDorgvVZJjcua043PnZ/PmdDqcbibZlXOOT8uSo7Kof0YUn9GL+Jo17ficymxiTofC6znUso0DhAxs1Fo+kF+d36vLmgZ8mk5cdGv2mwYj5k3Dm9m3LhJ1aVRNm6HrTbLgYAoWXDhDd/u4PGy5CT+xGMdiaBovewUCF/1BiWNljI9MLn7jeScpg+WyH6mfU62eVDql7hsrmvx1ezp/YldE2LhjbkiDnAn8tGy/MW3IXRMYJduvq9HpmIcKuFt+JCtgdGEGKAcF6UacVwIYbVPGfw/+YuNBS4cx/CUHcnyfc+wRDMtTr72mMSBjT/yn/GKSdeDWQUCH6Xoqq5R10RE60gV6erUL0iCti16d0hZjxut4QI/rEpgSh6WjnJXdBXRg1GKCucGJPtFqM27aD1tOqqKonsQ2KsFSSmEpmvRlsR+TcD9OFwrqXxIclL4sJTnGMSuG8KpkZvKdeVIOKDyWSyPLV16/p1QMPbP8NihwUzr47bdnXtwtjdCvqqpO0H+pOvIl3Pzv46e5CT/tQjklXCXXym1AaWY7bzHLkuDMc7ldKCvgxzLn8wYkJLBhEDyK7MT8bTbwbkxbfp+3mKAGsmTBpabSIEECzMIcQlzOPAMKsxMs7uhsnxPLuofPDTc1hkuq6MX9j16YU7CqegcYHbmWYuvAP6tCS97tgWf7dlQvnl25YPavXLVZvrzQPeHCpZmzzEUVq/xzu5sChnSTPTW7oOYmh69z4zL/gk3b+O6hoa733uviP82vnFcbqWlc9tDmZa23LVzaV1yXURi+JX+28NeBuj3+O8IrQ080Vm1eWB4OKjPmrJu7c1udWynvKF6/vs479lSW9+5gZkn+dKfellNGDPllzeULustz+A0bPvhgw7lkvEUwn/N4Ty7U7nhGsEpFkOfy+kutbOh1JQxhVDJumoW11hnkPThznh6FFlhfT+ra1x9sF56kx5YuDzVY9PQYAYA7iblw4frQ4TPCk2MK/xGU3rlmze62trHz6lsko+v+So/do74PT8KVkpJfOErKcv8znrMGsHTNxoEkWy1mYgDB6XBbPaWsuiS6CryGaL6zCjaXBgvtkuyXBua1wOKnh+k7L9AvPnYWffxK18FcJbuosGf3/Jo7amY+CE1vppzY+UTrva0FXc1i55pKQ/YjVL187N5fCn1kW5uot/1hi+DiZ+5atnJR9E+prvydJ9ZZ5mwOpU5gM4KYysMBQ71UzPuMTl9QQOyUo5nwioeYCPjFklrbK6s6X+ypUZ6rum9+CZYzWRiBJfSP0xzzSmrg7f86g0DKVj/wwFzieD9rRfPGFbeKMl05pn5j9/rsQJJ2iEgRrpohlyBo3f4QK7Kl+EcAYZgAoNVmZWXK704YAa3FwBxgSGUOs5htvGRz4Sgj3yFkSJFBuv/sxu5yk998T8WDJzvv/2RX19HtTUW1S+wpKRKRjJ6zzz/1/OPdFdWGlAKbvzS4PHOtURikg9AGz0LbIB85S/cPOpoXvuue8/iV2H1vPTy3ddvOeZ37HGmO3OmSzVzR+NS53+84dHlFhXPLqtzSO+5ruHM2vXtBdxP87LOzKAD359j/INYIbyPabIi3Cq6Wa+SaGe78diIzu7qcblcAa6/fJRvNopXFJnO+U9KKM5bqH5LM0iQSVmpPCPDu7ZT4Aoubz3709EBTyrTDjyx8MQXgUH1nqm7TWng4TzE4i4AsKskBITXfSyC4Fkl5MxnJDiKSIDSJAsGvd1y+/eNDp2e+A+5d8HeiiunrTkT6TqWLIs+/QRoWr98s0qj8uuzLuS22Ytufg3rdTaHn1m46sfgGKHXt0MGnLaRHdnwN37tvHcWKo2V6lnPxL4UvUQcRdOzmZSQs8X5CH5OxXMXpkATuDz8Et0SH4uyCRR+TjmBDP1GvsVrWEGVzEj33YVQ9jAtIKpqsl/s/0xrocwAAeJxjYGRgYADig3cEzsTz23xl4GZnAIHLRucNkWl2BrA4BwMTiAIAF4IITwB4nGNgZGBgZwCChWASxGZkQAXyABOUANh4nGNnYGBgHyAMADa8ANoAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IHqHicY2BkYGCQZ8hlYGcAASYg5gJCBob/YD4DABbVAaoAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2P2XLCMAxFfYFspGUp3Te+IB9lHJF4cOzUS2n/voaEGR6qB+lKo+WITdhga/a/bRnDBFPMkCBFhhwF5ihxg1sssMQKa9xhg3s84BFPeMYLXvGGd3zgE9tZr/hveXKVkFYoSnoeHJXfRoWOqi54mo9ameNFdrK+dLSyaVf7oJQTlkhXpD3Z5XXhR/rUfQVuKXO91Jps4cLOS6/I5YL3XhodRRsVWZe4NnZOhWnSAWgxhMoEr6SmzZieF43Mk7ZOBdeCVGrp9Eu+54J2xhySplfB5XHwQLXUmT9KH6+kPnQ7ZYuIEzNyfs1DLU1VU4SWZ6LkXGHsD1ZKbMw=) format("woff"),url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMlGRXgUAAAEoAAAAVmNtYXDiMBC2AAAB/AAAAUpnbHlmW/HoBwAAA4gAAA9QaGVhZAyD6V8AAADQAAAANmhoZWEOogcgAAAArAAAACRobXR42QAAAAAAAYAAAAB8bG9jYTDINOoAAANIAAAAQG1heHABMAB5AAABCAAAACBuYW1l1cf1oAAAEtgAAAIKcG9zdGZEjeMAABTkAAABgQABAAAHAAAAAKEHAAAAAAAHAAABAAAAAAAAAAAAAAAAAAAAHwABAAAAAQAAwdxheF8PPPUACwcAAAAAANMyzzEAAAAA0zLPMQAAAAAHAAcAAAAACAACAAAAAAAAAAEAAAAfAG0ABwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQcAAZAABQAIBHEE5gAAAPoEcQTmAAADXABXAc4AAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA8QHxHgcAAAAAoQcAAAAAAAABAAAAAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAAAAAMAAAADAAAAHAABAAAAAABEAAMAAQAAABwABAAoAAAABgAEAAEAAgAA8R7//wAAAADxAf//AAAPAAABAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IHqAABAAAAAAWLBYsAAgAAAREBAlUDNgWL++oCCwAAAwAAAAAGawZrAAIADgAaAAAJAhMEAAMSAAUkABMCAAEmACc2ADcWABcGAALrAcD+QJX+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rgIwAVABUAGbCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAAAAAgAAAAAFQAWLAAMABwAAASERKQERIREBwAEr/tUCVQErAXUEFvvqBBYAAAAEAAAAAAYgBiAABgATACQAJwAAAS4BJxUXNjcGBxc+ATUmACcVFhIBBwEhESEBEQEGBxU+ATcXNwEHFwTQAWVVuAO7AidxJSgF/t/lpc77t18BYf6fASsBdQE+TF1OijuZX/1gnJwDgGSeK6W4GBhqW3FGnFT0AWM4mjT+9AHrX/6f/kD+iwH2/sI7HZoSRDGYXwSWnJwAAAEAAAAABKsF1gAFAAABESEBEQECCwEqAXb+igRg/kD+iwSq/osAAAACAAAAAAVmBdYABgAMAAABLgEnET4BAREhAREBBWUBZVRUZfwRASsBdf6LA4Bkniv9piueAUT+QP6LBKr+iwAAAwAAAAAGIAYPAAUADAAaAAATESEBEQEFLgEnET4BAxUWEhcGAgcVNgA3JgDgASsBdf6LAsUBZVVVZbqlzgMDzqXlASEFBf7fBGD+QP6LBKr+i+Bkniv9piueAvOaNP70tbX+9DSaOAFi9fUBYgAAAAQAAAAABYsFiwAFAAsAEQAXAAABIxEhNSMDMzUzNSEBIxUhESMDFTMVMxECC5YBduCWluD+igOA4AF2luDglgLr/oqWAgrglvyAlgF2AqCW4AF2AAQAAAAABYsFiwAFAAsAEQAXAAABMxUzESETIxUhESMBMzUzNSETNSMRITUBdeCW/org4AF2lgHAluD+ipaWAXYCVeABdgHAlgF2++rglgHA4P6KlgAAAAACAAAAAAXWBdYADwATAAABIQ4BBxEeARchPgE3ES4BAyERIQVA/IA/VQEBVT8DgD9VAQFVP/yAA4AF1QFVP/yAP1UBAVU/A4A/VfvsA4AAAAYAAAAABmsGawAHAAwAEwAbACAAKAAACQEmJw4BBwElLgEnAQUhATYSNyYFAQYCBxYXIQUeARcBMwEWFz4BNwECvgFkTlSH8GEBEgOONemh/u4C5f3QAXpcaAEB/BP+3VxoAQEOAjD95DXpoQESeP7dTlSH8GH+7gPwAmgSAQFYUP4nd6X2Pv4nS/1zZAEBk01NAfhk/v+TTUhLpfY+Adn+CBIBAVhQAdkAAAAFAAAAAAZrBdYADwATABcAGwAfAAABIQ4BBxEeARchPgE3ES4BASEVIQEhNSEFITUhNSE1IQXV+1ZAVAICVEAEqkBUAgJU+xYBKv7WAur9FgLqAcD+1gEq/RYC6gXVAVU//IA/VQEBVT8DgD9V/ayV/tWVlZWWlQADAAAAAAYgBdYADwAnAD8AAAEhDgEHER4BFyE+ATcRLgEBIzUjFTM1MxUUBgcjLgEnET4BNzMeARUFIzUjFTM1MxUOAQcjLgE1ETQ2NzMeARcFi/vqP1QCAlQ/BBY/VAICVP1rcJWVcCog4CAqAQEqIOAgKgILcJWVcAEqIOAgKiog4CAqAQXVAVU//IA/VQEBVT8DgD9V/fcl4CVKICoBASogASogKgEBKiBKJeAlSiAqAQEqIAEqICoBASogAAAGAAAAAAYgBPYAAwAHAAsADwATABcAABMzNSMRMzUjETM1IwEhNSERITUhERUhNeCVlZWVlZUBKwQV++sEFfvrBBUDNZb+QJUBwJX+QJb+QJUCVZWVAAAAAQAAAAAGIAZsAC4AAAEiBgcBNjQnAR4BMz4BNy4BJw4BBxQXAS4BIw4BBx4BFzI2NwEGBx4BFz4BNy4BBUArSh797AcHAg8eTixffwICf19ffwIH/fEeTixffwICf18sTh4CFAUBA3tcXHsDA3sCTx8bATcZNhkBNB0gAn9fX38CAn9fGxn+zRwgAn9fX38CIBz+yhcaXHsCAntcXXsAAAIAAAAABlkGawBDAE8AAAE2NCc3PgEnAy4BDwEmLwEuASchDgEPAQYHJyYGBwMGFh8BBhQXBw4BFxMeAT8BFh8BHgEXIT4BPwE2NxcWNjcTNiYnBS4BJz4BNx4BFw4BBasFBZ4KBgeWBxkNujpEHAMUD/7WDxQCHEU5ug0aB5UHBQudBQWdCwUHlQcaDbo5RRwCFA8BKg8UAhxFOboNGgeVBwUL/ThvlAIClG9vlAIClAM3JEokewkaDQEDDAkFSy0cxg4RAQERDsYcLUsFCQz+/QwbCXskSiR7CRoN/v0MCQVLLRzGDhEBAREOxhwtSwUJDAEDDBsJQQKUb2+UAgKUb2+UAAAAAAEAAAAABmsGawALAAATEgAFJAATAgAlBACVCAGmAT0BPQGmCAj+Wv7D/sP+WgOA/sP+WggIAaYBPQE9AaYICP5aAAAAAgAAAAAGawZrAAsAFwAAAQQAAxIABSQAEwIAASYAJzYANxYAFwYAA4D+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rgZrCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAAADAAAAAAZrBmsACwAXACMAAAEEAAMSAAUkABMCAAEmACc2ADcWABcGAAMOAQcuASc+ATceAQOA/sP+WggIAaYBPQE9AaYICP5a/sP9/q4GBgFS/f0BUgYG/q4dAn9fX38CAn9fX38Gawj+Wv7D/sP+WggIAaYBPQE9Aab6yAYBUv39AVIGBv6u/f3+rgJPX38CAn9fX38CAn8AAAAEAAAAAAYgBiAADwAbACUAKQAAASEOAQcRHgEXIT4BNxEuAQEjNSMVIxEzFTM1OwEhHgEXEQ4BByE3MzUjBYv76j9UAgJUPwQWP1QCAlT9a3CVcHCVcJYBKiAqAQEqIP7WcJWVBiACVD/76j9UAgJUPwQWP1T8gpWVAcC7uwEqIP7WICoBcOAAAgAAAAAGawZrAAsAFwAAAQQAAxIABSQAEwIAEwcJAScJATcJARcBA4D+w/5aCAgBpgE9AT0BpggI/lo4af70/vRpAQv+9WkBDAEMaf71BmsI/lr+w/7D/loICAGmAT0BPQGm/BFpAQv+9WkBDAEMaf71AQtp/vQAAQAAAAAF1ga2ABYAAAERCQERHgEXDgEHLgEnIxYAFzYANyYAA4D+iwF1vv0FBf2+vv0FlQYBUf7+AVEGBv6vBYsBKv6L/osBKgT9v779BQX9vv7+rwYGAVH+/gFRAAAAAQAAAAAFPwcAABQAAAERIyIGHQEhAyMRIREjETM1NDYzMgU/nVY8ASUn/v7O///QrZMG9P74SEi9/tj9CQL3ASjaus0AAAAABAAAAAAGjgcAADAARQBgAGwAAAEUHgMVFAcGBCMiJicmNTQ2NzYlLgE1NDcGIyImNTQ2Nz4BMyEHIx4BFRQOAycyNjc2NTQuAiMiBgcGFRQeAxMyPgI1NC4BLwEmLwImIyIOAxUUHgIBMxUjFSM1IzUzNTMDH0BbWkAwSP7qn4TlOSVZSoMBESAfFS4WlMtIP03TcAGiioNKTDFFRjGSJlAaNSI/akAqURkvFCs9WTY6a1s3Dg8THgocJU4QIDVob1M2RnF9A2vV1WnU1GkD5CRFQ1CATlpTenNTYDxHUYouUhIqQCkkMQTBlFKaNkJAWD+MWkhzRztAPiEbOWY6hn1SJyE7ZS5nZ1I0/JcaNF4+GTAkGCMLFx04Ag4kOF07Rms7HQNsbNvbbNkAAwAAAAAGgAZsAAMADgAqAAABESERARYGKwEiJjQ2MhYBESERNCYjIgYHBhURIRIQLwEhFSM+AzMyFgHd/rYBXwFnVAJSZGemZASP/rdRVj9VFQv+twIBAQFJAhQqR2c/q9AEj/whA98BMkliYpNhYfzd/cgCEml3RTMeM/3XAY8B8DAwkCAwOB/jAAABAAAAAAaUBgAAMQAAAQYHFhUUAg4BBCMgJxYzMjcuAScWMzI3LgE9ARYXLgE1NDcWBBcmNTQ2MzIXNjcGBzYGlENfAUyb1v7SrP7x4SMr4bBpph8hHCsqcJNETkJOLHkBW8YIvYaMYG1gJWldBWhiRQ4cgv797rdtkQSKAn1hBQsXsXUEJgMsjlNYS5WzCiYkhr1mFTlzPwoAAAABAAAAAAWABwAAIgAAARcOAQcGLgM1ESM1PgQ3PgE7AREhFSERFB4CNzYFMFAXsFlorXBOIahIckQwFAUBBwT0AU3+sg0gQzBOAc/tIz4BAjhceHg6AiDXGlddb1ctBQf+WPz9+h40NR4BAgABAAAAAAaABoAASgAAARQCBCMiJzY/AR4BMzI+ATU0LgEjIg4DFRQWFxY/ATY3NicmNTQ2MzIWFRQGIyImNz4CNTQmIyIGFRQXAwYXJgI1NBIkIAQSBoDO/p/Rb2s7EzYUaj15vmh34o5ptn9bK1BNHggIBgIGETPRqZepiWs9Sg4IJRc2Mj5WGWMRBM7+zgFhAaIBYc4DgNH+n84gXUfTJzmJ8JZyyH46YH2GQ2ieIAwgHxgGFxQ9WpfZpIOq7lc9I3VZHzJCclVJMf5eRmtbAXzp0QFhzs7+nwAABwAAAAAHAATPAA4AFwAqAD0AUABaAF0AAAERNh4CBw4BBwYmIycmNxY2NzYmBxEUBRY2Nz4BNy4BJyMGHwEeARcOARcWNjc+ATcuAScjBh8BHgEXFAYXFjY3PgE3LgEnIwYfAR4BFw4BBTM/ARUzESMGAyUVJwMchM2UWwgNq4JHrQgBAapUaAoJcWMBfiIhDiMrAQJLMB0BBAokNAIBPmMiIQ4iLAECSzAeAQUKJDQBP2MiIQ4iLAECSzAeAQUKJDQBAT75g+5B4arNLNIBJ44ByQL9BQ9mvYCKwA8FBQMDwwJVTGdzBf6VB8IHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvVJkAWUDDEf+tYP5AQAAAAEAAAAABiAGtgAbAAABBAADER4BFzMRITU2ADcWABcVIREzPgE3EQIAA4D+4v6FBwJ/X+D+1QYBJ97eAScG/tXgX38CB/6FBrUH/oX+4v32X38CAlWV3gEnBgb+2d6V/asCf18CCgEeAXsAAAAAEADGAAEAAAAAAAEABwAAAAEAAAAAAAIABwAHAAEAAAAAAAMABwAOAAEAAAAAAAQABwAVAAEAAAAAAAUACwAcAAEAAAAAAAYABwAnAAEAAAAAAAoAKwAuAAEAAAAAAAsAEwBZAAMAAQQJAAEADgBsAAMAAQQJAAIADgB6AAMAAQQJAAMADgCIAAMAAQQJAAQADgCWAAMAAQQJAAUAFgCkAAMAAQQJAAYADgC6AAMAAQQJAAoAVgDIAAMAAQQJAAsAJgEeVmlkZW9KU1JlZ3VsYXJWaWRlb0pTVmlkZW9KU1ZlcnNpb24gMS4wVmlkZW9KU0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAFYAaQBkAGUAbwBKAFMAUgBlAGcAdQBsAGEAcgBWAGkAZABlAG8ASgBTAFYAaQBkAGUAbwBKAFMAVgBlAHIAcwBpAG8AbgAgADEALgAwAFYAaQBkAGUAbwBKAFMARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgVhdWRpbwAAAAAA) format("truetype");font-weight:400;font-style:normal}.vjs-icon-play{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before{content:"\f101"}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:"\f102"}.vjs-icon-pause{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before{content:"\f103"}.vjs-icon-volume-mute{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before{content:"\f104"}.vjs-icon-volume-low{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before{content:"\f105"}.vjs-icon-volume-mid{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before{content:"\f106"}.vjs-icon-volume-high{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before{content:"\f107"}.vjs-icon-fullscreen-enter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before{content:"\f108"}.vjs-icon-fullscreen-exit{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before{content:"\f109"}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:"\f10a"}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:"\f10b"}.vjs-icon-subtitles{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before{content:"\f10c"}.vjs-icon-captions{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before{content:"\f10d"}.vjs-icon-chapters{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before{content:"\f10e"}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:"\f10f"}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:"\f110"}.vjs-icon-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before{content:"\f111"}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:"\f112"}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:"\f113"}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:"\f114"}.vjs-icon-cancel{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cancel:before{content:"\f115"}.vjs-icon-replay{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before{content:"\f116"}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:"\f117"}.vjs-icon-gplus{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-gplus:before{content:"\f118"}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:"\f119"}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:"\f11a"}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:"\f11b"}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:"\f11c"}.vjs-icon-audio-description{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before{content:"\f11d"}.vjs-icon-audio{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio:before{content:"\f11e"}.vjs-social-overlay{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:10px;letter-spacing:1px}.vjs-social-overlay .vjs-icon-facebook{background-color:#3b5998}.vjs-social-overlay .vjs-icon-gplus{background-color:#d53326}.vjs-social-overlay .vjs-icon-linkedin{background-color:#069}.vjs-social-overlay .vjs-icon-twitter{background-color:#55acee}.vjs-social-overlay .vjs-icon-tumblr{background-color:#29364b}.vjs-social-overlay .vjs-icon-pinterest{background-color:#c10218}.vjs-social-overlay a{color:#fff}.vjs-social-overlay .vjs-social-description,.vjs-social-overlay .vjs-social-title{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vjs-social-overlay .vjs-social-title{font-size:1.25em;font-weight:700;line-height:1.33333;margin-bottom:.33333em}.vjs-social-overlay .vjs-social-description{font-size:1em;font-weight:400;line-height:1.5;margin-bottom:1em}.vjs-social-overlay .vjs-social-share-links{margin:0 0 1em;overflow:auto}.vjs-social-overlay .vjs-social-share-link{border-radius:2px;float:left;font-size:1.16667em;line-height:1.07143;margin-right:.57143em;outline:0;padding:.42857em;text-decoration:none}.vjs-social-overlay .vjs-social-direct-link,.vjs-social-overlay .vjs-social-embed-code,.vjs-social-overlay .vjs-social-start-from{float:left;margin-bottom:.66667em}.vjs-social-overlay .vjs-social-direct-link .vjs-social-label-text,.vjs-social-overlay .vjs-social-embed-code .vjs-social-label-text,.vjs-social-overlay .vjs-social-start-from .vjs-social-label-text{display:block;margin-bottom:.16667em}.vjs-social-overlay .vjs-social-direct-link input,.vjs-social-overlay .vjs-social-embed-code input,.vjs-social-overlay .vjs-social-start-from input{border:0;color:#333;display:block;font-size:1em;padding:.5em .66667em;width:100%}.vjs-social-overlay .vjs-social-direct-link input.vjs-invalid,.vjs-social-overlay .vjs-social-embed-code input.vjs-invalid,.vjs-social-overlay .vjs-social-start-from input.vjs-invalid{background-color:red;color:#fff}.vjs-social-overlay .vjs-social-direct-link{padding-right:24px;width:80%}.vjs-social-overlay .vjs-social-start-from{width:20%}.vjs-social-overlay .vjs-social-embed-code{margin-bottom:.33333em;width:100%}.vjs-social-overlay.vjs-social-as-endscreen .vjs-restart{border:0;cursor:pointer;display:block;font-size:4em;margin:0 auto;outline:0;padding:0}.vjs-social-overlay.vjs-social-as-endscreen .vjs-restart:focus:before,.vjs-social-overlay.vjs-social-as-endscreen .vjs-restart:hover:before{text-shadow:1px -1px 20px #fff,-1px 1px 20px #fff}.vjs-social-overlay.vjs-social-as-endscreen.vjs-social-short-player .vjs-social-description{display:none}.vjs-button.vjs-share-control{cursor:pointer;font-weight:700}.vjs-button.vjs-share-control:hover{text-shadow:0 0 1em rgba(255,255,255,.5),0 0 1em rgba(255,255,255,.5),0 0 1em rgba(255,255,255,.5)}.vjs-dock-shelf .vjs-button.vjs-share-control{position:relative}.vjs-dock-shelf .vjs-button.vjs-share-control:before{position:relative;vertical-align:top}.vjs-dock-shelf .vjs-button.vjs-share-control span{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;vertical-align:top;text-decoration:underline;margin-left:2px}.vjs-social-overlay.vjs-social-small .vjs-social-direct-link{width:100%;padding-right:0}.vjs-social-overlay.vjs-social-small .vjs-social-share-links{margin-bottom:.33333em}.vjs-social-overlay.vjs-social-small .vjs-social-share-link{margin-bottom:.66667em}/*! videojs-overlay - v0.0.0 - 2014-4-26
- * Copyright (c) 2014 Brightcove * Licensed under the Apache-2.0 license. * * Customised for Indy/ES by Daniel Petrie. * */.vjs-overlay,
- .vjs-overlay.vjs-overlay-top-left {
- position: absolute;
- width: auto;
- background-color: transparent;
- top: 5px;
- left: 5px
- }
-
- .vjs-overlay.vjs-overlay-top {
- margin-left: -16.5%;
- left: 50%
- }
-
- .vjs-overlay.vjs-overlay-top-right {
- left: auto;
- right: 5px
- }
-
- .vjs-overlay.vjs-overlay-left {
- top: 50%;
- margin-top: -15px
- }
-
- .vjs-overlay.vjs-overlay-right {
- left: auto;
- right: 5px;
- top: 50%;
- margin-top: -15px
- }
-
- .vjs-overlay.vjs-overlay-bottom {
- margin-left: -16.5%;
- left: 50%;
- top: auto;
- bottom: 4.5em
- }
-
- .vjs-overlay.vjs-overlay-bottom-left {
- bottom: 4.5em;
- top: auto;
- left: 5px
- }
-
- .vjs-overlay.vjs-overlay-bottom-right {
- bottom: 4.5em;
- top: auto;
- left: auto;
- right: 5px
- }
-
- .vjs-social-overlay {
- z-index: 999
- }
-
- .vjs-ad-playing.vjs-ad-playing .vjs-progress-control {
- pointer-events: none
- }
-
- .vjs-ad-playing.vjs-ad-playing .vjs-play-progress {
- background-color: #ffe400
- }
-
- .vjs-ad-playing.vjs-ad-loading .vjs-loading-spinner {
- display: block
- }
-
- .vjs-ima3-ad-container {
- bottom: 0;
- left: 0;
- position: absolute;
- right: 0;
- top: 0
- }
-
- .vjs-ima3-ad-container,
- .vjs-ima3-click-tracker {
- pointer-events: none;
- left: -9999px
- }
-
- .vjs-ima3-flash-ad-container {
- left: 0
- }
-
- .vjs-ima3-ad-background {
- width: 100%;
- height: 100%;
- background-color: transparent;
- position: absolute;
- top: 0;
- left: 0
- }
-
- .vjs-ad-playing .vjs-ima3-ad-background {
- background-color: #000
- }
-
- .ima3-ad-loading.ima3-loading-spinner .vjs-loading-spinner {
- display: block
- }
-
- .vjs-ima3-flash.vjs-ad-playing .vjs-tech {
- opacity: 0
- }
-
- .vjs-ad-playing .vjs-ima3-ad-container,
- .vjs-ad-playing .vjs-ima3-click-tracker,
- .vjs-ima3-overlay .vjs-ima3-ad-container,
- .vjs-ima3-overlay .vjs-ima3-click-tracker {
- left: 0
- }
-
- .vjs-ima3-flash.vjs-ad-playing .vjs-ima3-ad-container,
- .vjs-ima3-flash.vjs-ima3-overlay .vjs-ima3-ad-container {
- cursor: pointer;
- pointer-events: auto
- }
-
- .vjs-mouse.vjs-ima3-html5.vjs-ad-playing .vjs-ima3-ad-container,
- .vjs-mouse.vjs-ima3-html5.vjs-ad-playing .vjs-ima3-click-tracker,
- .vjs-mouse.vjs-ima3-html5.vjs-ima3-overlay .vjs-ima3-ad-container,
- .vjs-mouse.vjs-ima3-html5.vjs-ima3-overlay .vjs-ima3-click-tracker {
- cursor: pointer;
- pointer-events: auto
- }
-
- .vjs-user-active.vjs-ad-playing.vjs-ima3-html5 .vjs-ima3-ad-container,
- .vjs-user-active.vjs-ad-playing.vjs-ima3-html5 .vjs-ima3-click-tracker,
- .vjs-user-active.vjs-ima3-overlay.vjs-ima3-html5 .vjs-ima3-ad-container,
- .vjs-user-active.vjs-ima3-overlay.vjs-ima3-html5 .vjs-ima3-click-tracker {
- cursor: pointer;
- pointer-events: auto
- }
-
- .vjs-ima3-html5.vjs-using-native-controls.vjs-ima3-paused.vjs-ima3-paused .vjs-ima3-ad-container,
- .vjs-ima3-html5.vjs-using-native-controls.vjs-ima3-paused.vjs-ima3-paused .vjs-ima3-click-tracker {
- pointer-events: none
- }
-
- .vjs-ima3-click-tracker {
- bottom: 0;
- left: 0;
- margin: 0;
- position: absolute;
- right: 0;
- top: 0
- }
-
- .vjs-ima3-overlay .vjs-ima3-click-tracker {
- top: auto;
- margin: 0 auto
- }
-
- .vjs-control-bar.vjs-control-bar.vjs-ad-control-bar.vjs-ad-control-bar {
- display: none
- }
-
- .vjs-ad-controls.vjs-ad-playing .vjs-control-bar.vjs-control-bar {
- display: none
- }
-
- .vjs-ad-controls.vjs-ad-playing.vjs-controls-disabled .vjs-ad-control-bar.vjs-ad-control-bar,
- .vjs-ad-controls.vjs-ad-playing.vjs-using-native-controls .vjs-ad-control-bar.vjs-ad-control-bar {
- display: none
- }
-
- .vjs-ad-playing .vjs-dock-shelf,
- .vjs-ad-playing .vjs-dock-text {
- display: none
- }
-
- .vjs-ad-controls.vjs-ad-playing .vjs-control-bar.vjs-ad-control-bar {
- display: -webkit-box;
- display: -moz-box;
- display: -ms-flexbox;
- display: -webkit-flex;
- display: flex
- }
-
- .vjs-ad-controls.vjs-ad-playing.vjs-no-flex .vjs-control-bar.vjs-ad-control-bar {
- display: table
- }
-
- .vjs-mouse .vjs-control-bar.vjs-ad-control-bar .vjs-progress-control:hover {
- height: .5em;
- top: -.5em
- }
-
- .vjs-mouse .vjs-control-bar.vjs-ad-control-bar .vjs-progress-control:hover .vjs-mouse-display,
- .vjs-mouse .vjs-control-bar.vjs-ad-control-bar .vjs-progress-control:hover .vjs-mouse-display:after,
- .vjs-mouse .vjs-progress-control:hover .vjs-play-progress:after {
- display: none
- }
-
- .vjs-ima3-flash.vjs-ad-loading .vjs-tech,
- .vjs-ima3-html5.vjs-ad-loading .vjs-tech {
- opacity: 0
- }
-
- .vjs-ima3-autoplay.vjs-ima3-not-playing-yet .vjs-poster,
- .vjs-ima3-autoplay.vjs-ima3-not-playing-yet .vjs-tech {
- opacity: 0
- }
-
- .vjs-ima3-html5.vjs-ad-playing .vjs-ad-control-bar .vjs-play-progress {
- transition: width 1s linear
- }
-
- .vjs-ima3-flash.vjs-ad-playing .vjs-ad-control-bar .vjs-play-progress {
- transition: width .25s linear
- }
-
- .vjs-ima3-html5.vjs-ad-playing .vjs-ad-control-bar .vjs-play-progress.vjs-play-progress-resetting {
- transition: width 0s linear
- }
-
- .vjs-ima3-flash.vjs-ad-playing .vjs-ad-control-bar .vjs-play-progress.vjs-play-progress-resetting {
- transition: width 0s linear
- }
- </style>
<title>The seven secrets that hotel owners don't want you to know | The Independent</title>
<link rel="manifest" href="/sites/all/themes/ines_themes/independent_theme/manifest.json" />
<!-- HEAD -->
@@ -599,34889 +357,6 @@
<script async="" src="http://seb.scorecardresearch.com/lookup.php"></script>
<script type="text/javascript" src="//impl.onscroll.com/onscroll/2016/09/1474295972056.js" async="" defer="defer"></script>
<script type="text/javascript" src="//impl.onscroll.com/onscroll/2016/09/1474981864827.js" async="" defer="defer"></script>
- <style type="text/css">
- .trc_rbox_container {
- direction: ltr;
- text-align: left
- }
-
- .trc_rbox_header {
- border-style: solid;
- border-width: 0
- }
-
- .in_trc_header {
- position: relative!important;
- float: right;
- margin: 0
- }
-
- #trc_rbox_css_loaded {
- overflow: hidden;
- width: 0;
- height: 0
- }
-
- .trc_rbox {
- margin-top: 0
- }
-
- .trc_rbox_div {
- margin: 0 0 3px;
- direction: ltr;
- padding: 0;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- overflow: auto;
- position: relative;
- width: auto;
- *width: auto;
- border: solid #CCC 1px
- }
-
- .loading-animation span {
- display: block
- }
-
- .videoCube {
- zoom: 1;
- cursor: pointer;
- float: none;
- overflow: hidden;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- -webkit-box-sizing: border-box
- }
-
- div.videoCube:hover,
- .videoCube_hover {
- cursor: pointer
- }
-
- .videoCube span.video-title:hover,
- .videoCube_hover span.video-title {
- text-decoration: underline
- }
-
- .videoCube a {
- text-decoration: none;
- border: 0;
- color: #000;
- cursor: pointer
- }
-
- .videoCube a:hover,
- .videoCube_hover a,
- .videoCube a:link,
- .videoCube a {
- text-decoration: none!important;
- outline: 0
- }
-
- .videoCube a .thumbBlock {
- float: left;
- display: block;
- overflow: hidden!important
- }
-
- .videoCube a img,
- .videoCube img {
- border: 0;
- _border: 0;
- display: block;
- margin: 0;
- height: auto;
- width: auto
- }
-
- .videoCube .video-label {
- display: block;
- overflow: hidden
- }
-
- .videoCube .video-title {
- width: auto!important;
- white-space: pre-wrap;
- white-space: -moz-pre-wrap;
- white-space: -o-pre-wrap;
- word-wrap: break-word
- }
-
- .videoCube .video-duration a {}
-
- .videoCube .video-duration {
- height: 0;
- float: left;
- position: relative;
- color: #fff;
- font-size: 11px
- }
-
- .videoCube .video-duration dt {
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- background-color: #000;
- opacity: .6;
- filter: alpha(opacity=60)
- }
-
- .videoCube span.video-label.trc_ellipsis {
- position: relative;
- overflow: hidden;
- display: -webkit-box;
- -webkit-box-orient: vertical
- }
-
- .videoCube span.video-label.trc-smart-ellipsis {
- position: relative;
- overflow: hidden
- }
-
- .videoCube span.video-label.trc-smart-ellipsis ins {
- display: inline-block;
- text-decoration: inherit
- }
-
- .videoCube span.video-label.trc-smart-ellipsis ins.lastLineEllipsis {
- display: block;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- word-wrap: normal
- }
-
- .sponsored-default .video-description {
- font-weight: 400;
- color: #000;
- font-size: 9px;
- max-height: 22px;
- *height: 22px;
- overflow: hidden;
- line-height: 9px
- }
-
- .video-duration.video-duration-detail div {
- color: #fff
- }
-
- .sponsored-default {
- background-color: #f7f6c6;
- padding-bottom: 0!important
- }
-
- .trc_rbox .sponsored {
- position: relative;
- display: block;
- overflow: visible;
- height: auto;
- width: auto;
- padding-right: 0;
- text-align: right;
- font-size: 9px
- }
-
- .sponsored-url {
- white-space: nowrap;
- float: left;
- overflow: hidden;
- width: 98%;
- height: auto;
- margin-top: 0;
- margin-left: 1px;
- padding-bottom: 2px;
- color: green;
- font-size: 9px;
- text-decoration: underline
- }
-
- .sponsored-default .video-title {
- height: 26px;
- font-size: 11px;
- line-height: 13px;
- max-height: 26px;
- *height: 26px
- }
-
- .sponsored-default .thumbBlock img {}
-
- .sponsored-default .thumbBlock {
- text-align: center;
- background-color: transparent
- }
-
- .trc_rbox_div {
- height: 410px
- }
-
- .videoCube {
- direction: ltr;
- font-size: 11px;
- margin: 0;
- color: #000;
- border-width: 0
- }
-
- .videoCube.vertical:first-child {
- border-top: 0;
- margin-top: 0
- }
-
- .videoCube.horizontal:first-child {
- border-left: 0;
- margin-left: 0
- }
-
- .trc_rbox .trc_rbox_div .videoCube.vertical {
- _margin-top: expression(this.previousSibling==null?'0': 'default')
- }
-
- .trc_rbox .trc_rbox_div .videoCube.horizontal {
- _margin-left: expression(this.previousSibling==null?'0': 'default')
- }
-
- div.videoCube:hover,
- .videoCube_hover {
- background-color: #EBF0FF;
- color: #000
- }
-
- .videoCube .thumbBlock {
- margin-right: 5px;
- margin-left: 1px;
- border-style: solid
- }
-
- .videoCube a img,
- .videoCube img {
- border-color: #ececec
- }
-
- .videoCube .overlayImg {}
-
- .videoCube .video-label-box {
- margin-left: 81px
- }
-
- .videoCube .video-label dt {
- font-weight: 700
- }
-
- .videoCube .video-title {
- height: auto;
- margin-bottom: 3px;
- white-space: normal
- }
-
- .videoCube .trc_inline_detail_spacer {
- display: inline-block;
- white-space: pre
- }
-
- .sponsored-default {
- padding-bottom: 0
- }
-
- .loading-animation {
- font-family: sans;
- font-size: 1.5em;
- text-align: center;
- color: gray;
- height: 100%
- }
-
- .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12px;
- font-weight: 700;
- text-decoration: none;
- color: #000
- }
-
- .trc_header_right_part {
- position: absolute;
- left: 50%;
- top: 0
- }
-
- .branding_div {
- overflow: visible;
- float: right
- }
-
- .branding_div img {
- height: 20px
- }
-
- .trc_pager div {
- float: left;
- font-family: sans;
- cursor: pointer;
- margin-left: 2px;
- margin-right: 2px
- }
-
- .trc_pager_prev,
- .trc_pager_next {}
-
- .trc_pager {
- font-weight: 400
- }
-
- .trc_pager_pages {
- display: block!important
- }
-
- .trc_related_container div.horizontal {
- float: left;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- -webkit-box-sizing: border-box
- }
-
- .trc_related_container div.vertical {}
-
- .trc_related_container DIV.videoCube.thumbnail_top .thumbBlock,
- .trc_related_container DIV.videoCube.thumbnail_bottom .thumbBlock {
- float: none
- }
-
- @media screen and (-webkit-min-device-pixel-ratio:0) {
- .sponsored-url {
- margin-top: 2px
- }
- }
-
- .vidiscovery-note {
- display: none
- }
-
- .pager_disabled {
- cursor: auto
- }
-
- .videoCube .thumbBlock .trc_sponsored_overlay_base {
- display: block;
- width: auto;
- margin-left: 0;
- position: absolute;
- color: #fff!important
- }
-
- .videoCube .thumbBlock .trc_sponsored_overlay {
- filter: alpha(opacity=60);
- opacity: .6;
- display: block;
- position: absolute;
- *left: 0
- }
-
- .videoCube .thumbBlock .trc_sponsored_overlay_base .sponsored {
- position: relative;
- display: block;
- overflow: visible;
- width: auto;
- text-align: center;
- padding: 0 5px;
- margin-top: 0
- }
-
- .videoCube .thumbBlock .trc_sponsored_overlay_base.round .trc_sponsored_overlay {
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px
- }
-
- .videoCube .thumbBlock .trc_sponsored_overlay_base.round {
- margin-left: 4px
- }
-
- .thumbnail-emblem {
- background-color: transparent;
- background-repeat: no-repeat;
- position: absolute;
- z-index: 50
- }
-
- .playerCube .thumbnail-overlay,
- .videoCube .thumbnail-overlay {
- position: absolute;
- background-color: transparent;
- background-repeat: no-repeat;
- z-index: 50
- }
-
- .videoCube:hover .thumbnail-overlay,
- .videoCube_hover .thumbnail-overlay {
- position: absolute;
- background-color: transparent;
- background-repeat: no-repeat;
- z-index: 50
- }
-
- .thumbnail_bottom {
- padding-bottom: 8px
- }
-
- .trc_pager_next img,
- trc_pager_next pager_disabled img,
- trc_pager_next:hover img {
- -moz-transform: scaleX(-1);
- -o-transform: scaleX(-1);
- -webkit-transform: scaleX(-1);
- transform: scaleX(-1);
- filter: FlipH;
- -ms-filter: "FlipH"
- }
-
- .trc_cover_iframe {
- position: absolute;
- z-index: 100000;
- top: 0;
- left: 0;
- background: #000;
- opacity: .4;
- filter: alpha(opacity=40);
- border: 0
- }
-
- .trc_lightbox_base {
- z-index: 100001;
- position: fixed
- }
-
- .trc_lightbox_overlay {
- background-color: transparent;
- position: absolute;
- z-index: 100002
- }
-
- .trc_lightbox_transparent {
- position: absolute;
- z-index: 100003
- }
-
- #trc_lightbox_header {
- font-family: "Trebuchet MS", Helvetica, sans-serif
- }
-
- .trc_whitebox {
- background-color: #fff;
- position: relative;
- z-index: 100004;
- padding: 0 20px 20px;
- margin: 0 auto;
- border: 2px solid #000;
- -moz-box-shadow: 3px 3px 20px #000;
- -webkit-box-shadow: 3px 3px 20px #000;
- box-shadow: 3px 3px 20px #000;
- -moz-box-sizing: content-box;
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px
- }
-
- .trc_whiteboxCloseButton {
- width: 32px;
- height: 32px;
- border: 0;
- position: absolute;
- right: -16px;
- top: -14px;
- cursor: pointer;
- background: url(//cdn.taboola.com/taboola-generic/close.png) no-repeat top left transparent;
- color: #fff;
- color: transparent;
- font-size: 0
- }
-
- .trc_related_container .logoDiv {
- font-family: Arial, Helvetica, sans-serif;
- white-space: nowrap;
- font-size: 9px
- }
-
- .trc_related_container .logoDiv a {
- font-size: 9px;
- text-decoration: none!important;
- color: #000;
- margin-right: 1px;
- vertical-align: text-bottom
- }
-
- .logoDiv a span:hover {
- text-decoration: underline
- }
-
- .trc_rbox_header .logoDiv {
- font-size: 1em
- }
-
- .trc_related_container .vertical-start-shade {
- background-image: url(//cdn.taboola.com/taboola-generic/shade-down.png);
- height: 10px;
- width: auto;
- position: absolute;
- z-index: 5
- }
-
- .trc_related_container .vertical-end-shade {
- background-image: url(//cdn.taboola.com/taboola-generic/shade-up.png);
- height: 10px;
- width: auto;
- position: absolute;
- z-index: 5
- }
-
- .trc_related_container .horizontal-start-shade {
- background-image: url(//cdn.taboola.com/taboola-generic/shade-right.png);
- height: auto;
- width: 10px;
- position: absolute;
- z-index: 5
- }
-
- .trc_related_container .horizontal-end-shade {
- background-image: url(//cdn.taboola.com/taboola-generic/shade-left.png);
- height: auto;
- width: 10px;
- position: absolute;
- z-index: 5
- }
-
- .trc_rbox_container.trc_expandable {
- overflow: hidden;
- max-height: 0;
- transition-property: max-height;
- -webkit-transition-property: max-height;
- -moz-transition-property: max-height;
- -o-transition-property: max-height;
- -webkit-transform: translateZ(0);
- -moz-transform: translateZ(0);
- -ms-transform: translateZ(0);
- -o-transform: translateZ(0);
- transform: translateZ(0)
- }
-
- DIV.trc_autoplaylist-box {
- margin: 6px auto 0;
- border: 0;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px;
- padding: 4px;
- font-family: "Trebuchet MS", Helvetica, sans-serif;
- width: 320px;
- background: #191919;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#191919', endColorstr='#393939');
- -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#191919, endColorstr=#393939)";
- background: -webkit-gradient(linear, left top, left bottom, from(#191919), to(#393939));
- background: -moz-linear-gradient(top, #191919, #393939);
- background: linear-gradient(top, #191919, #393939)
- }
-
- DIV.trc_autoplaylist-box .trc-next-up-header {
- font-size: 14px;
- color: #CCC;
- float: left;
- line-height: 31px;
- margin: 0 4px 0 6px;
- overflow: hidden;
- white-space: nowrap
- }
-
- DIV.trc_autoplaylist-box .trc-next-up-countdown {
- color: #fff;
- font-weight: 700;
- font-size: 15px;
- padding-left: 4px
- }
-
- DIV.trc_autoplaylist-box .nextup {
- cursor: pointer
- }
-
- DIV.trc_autoplaylist-box .nextup .thumbblock {
- border: solid #FEFEFE 1px;
- margin-right: 10px
- }
-
- DIV.trc_autoplaylist-box:hover .nextup .thumbblock SPAN.thumbnail-overlay {
- background-image: url(//cdn.taboola.com/taboola-generic/lightbox-overlay.png)
- }
-
- DIV.trc_autoplaylist-box .nextup .video-label-box {
- color: #fff;
- font-weight: 700;
- font-size: 12px;
- line-height: 14px
- }
-
- .trc-syndication-link {
- text-decoration: none;
- color: inherit
- }
-
- .playerCube {
- width: 100%;
- height: 100%;
- position: relative;
- cursor: pointer
- }
-
- .playerCube .thumbnail-overlay {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute
- }
-
- .trc_related_container .whatsThisSyndicated {
- position: absolute;
- cursor: pointer
- }
-
- .trc_related_container .whatsThisSyndicated.a-bottom-right,
- .trc_related_container .static-text.bottom-right {
- bottom: 0;
- right: 0
- }
-
- .trc_related_container .whatsThisSyndicated.a-top-right,
- .trc_related_container .static-text.top-right {
- top: 0;
- right: 0
- }
-
- .trc_related_container .whatsThisSyndicated.a-bottom-left,
- .trc_related_container .static-text.bottom-left {
- bottom: 0;
- left: 0
- }
-
- .trc_related_container .whatsThisSyndicated.a-top-left,
- .trc_related_container .static-text.top-left {
- top: 0;
- left: 0
- }
-
- .trc_related_container .videoCube .thumbBlock .branding {
- position: absolute;
- bottom: 0;
- z-index: 1;
- width: 100%;
- margin: 0;
- padding: 5px 0;
- text-align: center
- }
-
- .syndicatedItem .branding {
- margin: 0
- }
-
- .trc_related_container .videoCube .thumbBlock .static-text {
- position: absolute;
- z-index: 1;
- margin: 0;
- padding: 5px;
- background-color: #000;
- color: #fff;
- display: block;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: 400;
- text-align: left;
- text-decoration: none;
- opacity: .7
- }
-
- .trc_related_container .static-text.top {
- width: 100%;
- top: 0;
- padding: 5px 0
- }
-
- .trc_related_container .static-text.bottom {
- width: 100%;
- bottom: 0;
- padding: 2px 0
- }
-
- .trc-inplayer-rbox {
- background: #333;
- background: rgba(30, 30, 30, .9);
- *background: #333;
- bottom: 0;
- position: absolute;
- height: 300px;
- text-align: center
- }
-
- .trc-inplayer-rbox .trc_rbox_container {
- margin: 50px auto 0;
- width: 640px
- }
-
- .trc_rbox.trc-auto-size {
- width: 100%;
- height: 100%
- }
-
- .videoCube.thumbnail_under .thumbBlock {
- margin-left: 0;
- margin-right: 0
- }
-
- .videoCube.thumbnail_under .label-box-overlay {
- width: 100%;
- height: 100%;
- position: absolute;
- background: #000;
- opacity: .75;
- filter: alpha(opacity=75);
- top: 0;
- _display: none
- }
-
- .videoCube.thumbnail_under .video-labels-anchor {
- width: 100%;
- height: auto;
- position: absolute;
- z-index: 1;
- left: 0;
- bottom: 0;
- min-height: 2.58em;
- max-height: 2.58em;
- padding-top: 2px;
- padding-bottom: 2px;
- _background-color: #CECECE;
- -webkit-transition: all .2s linear;
- -moz-transition: all .2s linear;
- -ms-transition: all .2s linear;
- -o-transition: all .2s linear;
- transition: all .2s linear;
- line-height: 1.25em
- }
-
- .videoCube.thumbnail_under .video-labels-anchor span.video-title,
- .videoCube.thumbnail_under .video-labels-anchor span.branding {
- position: relative;
- z-index: 1;
- padding: 0 3px;
- margin: 0
- }
-
- .videoCube.thumbnail_under .video-title {
- min-height: 2.58em
- }
-
- .videoCube.thumbnail_under:hover .video-labels-anchor {
- opacity: 1;
- max-height: 6.45em
- }
-
- .trc-auto-size .trc_rbox_outer .trc_rbox_div {
- height: auto;
- width: auto
- }
-
- .trc-auto-size .trc_rbox_div .videoCube {
- height: auto
- }
-
- .trc-auto-size .trc_rbox_div .videoCube.trc-first-recommendation {
- margin-top: 0
- }
-
- .trc_rbox .trc_rbox_outer .trc_rbox_div .videoCube.trc-first-in-row {
- margin-left: 0
- }
-
- .trc_elastic .trc_rbox {
- width: auto
- }
-
- .trc_elastic .videoCube {
- overflow: hidden
- }
-
- .trc_elastic .videoCube .thumbBlock {
- display: block;
- background-color: transparent;
- background-position: center center;
- background-repeat: no-repeat;
- background-size: cover;
- position: absolute;
- display: inline-block;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- margin-left: 0;
- margin-right: 0
- }
-
- .trc_elastic .thumbBlock_holder {
- position: relative;
- width: 100%
- }
-
- .trc_elastic .thumbnail_start .thumbBlock_holder {
- float: left;
- margin-right: 10px
- }
-
- .trc_elastic .videoCube_aspect {
- width: 1px
- }
-
- .trc_elastic .trc_rbox .trc_rbox_div {
- height: auto
- }
-
- .trc_elastic .video-label-box {
- display: block
- }
-
- .trc_user_adChoice_btn {
- background: url(//cdn.taboola.com/libtrc/static/thumbnails/3aadbb71016ecd7a194bbe2791777e9a.png) no-repeat scroll 0 0 rgba(255, 255, 255, .7);
- border-radius: 0 0 0 5px;
- width: 16px;
- height: 16px;
- position: absolute;
- right: 0;
- top: 0;
- z-index: 9000;
- cursor: pointer;
- visibility: hidden
- }
-
- .trc_user_adChoice_anchor {
- width: 100%;
- height: 100%;
- position: absolute
- }
-
- .videoCube:hover .trc_user_adChoice_btn,
- .videoCube_hover .trc_user_adChoice_btn {
- visibility: visible
- }
-
- .trc_user_exclude_btn {
- background: url(//cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png) no-repeat scroll 0 0 transparent;
- width: 12px;
- height: 12px;
- position: absolute;
- right: 2px;
- top: 2px;
- z-index: 9000;
- cursor: pointer;
- visibility: hidden
- }
-
- .trc_undo_btn {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 11px;
- line-height: 14px;
- font-weight: 400;
- color: #36C;
- text-decoration: underline;
- cursor: pointer;
- position: absolute;
- right: 2px;
- top: 2px;
- padding: 0 1px;
- z-index: 11000;
- visibility: hidden
- }
-
- .videoCube:hover .trc_user_exclude_btn,
- .videoCube_hover .trc_user_exclude_btn,
- .trc_user_excluded.videoCube:hover .trc_undo_btn,
- .trc_user_excluded.videoCube_hover .trc_undo_btn,
- .trc_undo_btn.trc_anchor {
- visibility: visible
- }
-
- .videoCube.trc_user_excluded .trc_user_exclude_btn {
- visibility: hidden
- }
-
- .trc_fade {
- opacity: 0;
- filter: alpha(opacity=0);
- visibility: hidden;
- transition: opacity 500ms 0s, visibility 0s 500ms;
- -webkit-transition: opacity 500ms 0s, visibility 0s 500ms;
- -moz-transition: opacity 500ms 0s, visibility 0s 500ms;
- -o-transition: opacity 500ms 0s, visibility 0s 500ms;
- -ms-transition: opacity 500ms 0s, visibility 0s 500ms
- }
-
- .trc_fade.trc_in,
- .trc_user_excluded .trc_exclude_overlay {
- visibility: visible;
- opacity: 1;
- filter: alpha(opacity=100);
- transition-delay: 0s, 0s;
- -moz-transition-delay: 0s, 0s;
- -webkit-transition-delay: 0s, 0s;
- -o-transition-delay: 0s, 0s;
- -ms-transition-delay: 0s, 0s
- }
-
- .trc_excludable .trc_exclude_overlay {
- position: absolute;
- z-index: 10000;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- cursor: default;
- background-color: #fff
- }
-
- .videoCube.trc_excludable .trc_exclude_overlay.trc_fade {
- filter: alpha(opacity=80)\9
- }
-
- .videoCube.trc_user_excluded .trc_exclude_overlay {
- visibility: visible;
- opacity: .8;
- filter: alpha(opacity=80)
- }
-
- .videoCube.trc_user_excluded .thumbBlock {
- filter: url("data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg'&gt;&lt;filter id='grayscale'&gt;&lt;feColorMatrix type='matrix' values='0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0' /&gt;&lt;/filter&gt;&lt;/svg&gt;#grayscale");
- filter: gray;
- -webkit-filter: grayscale(100%)
- }
-
- .videoCube.trc_user_excluded:hover a .video-label-box .video-title,
- .videoCube_hover.trc_user_excluded a .video-label-box .video-title {
- text-decoration: none
- }
-
- .videoCube.trc_user_excluded a .video-label-box *,
- .videoCube.trc_user_excluded:hover a .video-label-box *,
- .videoCube_hover.trc_user_excluded a .video-label-box * {
- color: #000;
- overflow: hidden;
- -webkit-transition: color 500ms 0s;
- -moz-transition: color 500ms 0s;
- -ms-transition: color 500ms 0s;
- -o-transition: color 500ms 0s;
- transition: color 500ms 0s
- }
-
- .videoCube.trc_user_excluded a .video-label-box .label-box-overlay {
- background-color: #BBB;
- -webkit-transition: background-color 500ms 0s;
- -moz-transition: background-color 500ms 0s;
- -ms-transition: background-color 500ms 0s;
- -o-transition: background-color 500ms 0s;
- transition: background-color 500ms 0s
- }
-
- .videoCube.thumbnail_under.trc_user_excluded .video-labels-anchor,
- .videoCube.thumbnail_under.trc_user_excluded:hover .video-labels-anchor {
- max-height: none;
- -webkit-transition: none;
- -moz-transition: none;
- -ms-transition: none;
- -o-transition: none;
- transition: none
- }
-
- .trc_related_container .trc_clearer {
- clear: both;
- height: 0;
- overflow: hidden;
- font-size: 0;
- line-height: 0;
- visibility: hidden
- }
-
- .link-adc {
- float: right!important
- }
-
- .trc-widget-footer .link-adc a .trc_adc_wrapper,
- .trc_header_ext .link-adc a .trc_adc_wrapper {
- vertical-align: baseline;
- height: 15px;
- width: 19px;
- display: inline-block;
- position: relative
- }
-
- .trc-widget-footer .link-adc a .trc_adc_s_logo,
- .trc_header_ext .link-adc a .trc_adc_s_logo,
- .trc-widget-footer .link-adc a .trc_adc_b_logo,
- .trc_header_ext .link-adc a .trc_adc_b_logo {
- vertical-align: middle;
- height: 15px;
- display: inline-block;
- margin-top: -1px
- }
-
- .trc-widget-footer .link-adc a .trc_adc_s_logo,
- .trc_header_ext .link-adc a .trc_adc_s_logo {
- width: 19px;
- background: url(//cdn.taboola.com/libtrc/static/thumbnails/3aadbb71016ecd7a194bbe2791777e9a.png) no-repeat!important
- }
-
- .trc-widget-footer .link-adc a .trc_adc_b_logo,
- .trc_header_ext .link-adc a .trc_adc_b_logo {
- width: 77px;
- background: #fff url(//cdn.taboola.com/libtrc/static/thumbnails/0781f9c5a8637d1e162874f157460048.png) no-repeat!important;
- right: -1px;
- display: none;
- position: absolute
- }
-
- .trc_mobile_disclosure_link,
- .trc_mobile_attribution_link,
- .trc_mobile_adc_link {
- display: none
- }
-
- .trc_desktop_disclosure_link,
- .trc_desktop_attribution_link,
- .trc_desktop_adc_link {
- display: inline
- }
-
- @media screen and (max-width:767px) {
- .trc_mobile_disclosure_link {
- display: inline
- }
- .trc_mobile_attribution_link {
- display: inline
- }
- .trc_mobile_adc_link {
- display: inline
- }
- .trc_desktop_disclosure_link {
- display: none
- }
- .trc_desktop_attribution_link {
- display: none
- }
- .trc_desktop_adc_link {
- display: none
- }
- }
-
- .trc_in_iframe .trc_mobile_attribution_link,
- .trc_in_iframe .trc_mobile_disclosure_link {
- display: inline
- }
-
- .trc_in_iframe .trc_desktop_attribution_link,
- .trc_in_iframe .trc_desktop_disclosure_link {
- display: none
- }
-
- .trc_related_container .logoDiv,
- .trc_related_container .trc_header_ext .logoDiv {
- float: right
- }
-
- .trc_related_container .logoDiv+.logoDiv {
- margin-right: 2px
- }
-
- .trc_related_container .attribution-disclosure-link-sponsored,
- .trc_related_container .attribution-disclosure-link-hybrid {
- display: none
- }
-
- .trc_related_container .trc-content-sponsored .attribution-disclosure-link-sponsored {
- display: block
- }
-
- .trc_related_container .trc-content-hybrid .attribution-disclosure-link-hybrid {
- display: block
- }
-
- .trc_related_container .trc-widget-footer:hover a span,
- .trc_related_container .trc_header_ext:hover a span {
- text-decoration: underline!important
- }
-
- .logoDiv a span.trc_logos_v_align {
- display: inline-block!important;
- font-size: 15px!important;
- line-height: 1em!important;
- width: 0!important
- }
-
- .trc_related_container .trc_header_ext:hover a span.trc_logos_v_align,
- .trc_related_container .trc_header_ext:hover a span.trc_adc_wrapper,
- .trc_related_container .trc-widget-footer:hover a span.trc_logos_v_align,
- .trc_related_container .trc-widget-footer:hover a span.trc_adc_wrapper {
- text-decoration: none!important
- }
-
- .trc_related_container {
- clear: both
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-label,
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored,
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.sponsored-default:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_prev:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_prev,
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_pager div {
- font-family: serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .playerCube div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.syndicatedItem:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-label,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.sponsored-default:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .pager_enabled {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_counter {
- color: #000000;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .pager_disabled {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_prev:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_prev,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_pager div {
- font-family: serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .playerCube div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.syndicatedItem:hover,
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-label,
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored,
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.sponsored-default:hover,
- .ab_ab_thumbnails-d_3x3_size-round-20 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_prev:hover,
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_prev,
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_pager div {
- font-family: serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube:hover .thumbnail-overlay,
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .playerCube div.videoCube:hover,
- .ab_ab_thumbnails-d_3x3_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.syndicatedItem:hover,
- .ab_ab_thumbnails-d_3x3_size-round-20 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-a_abp-mode .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-a_abp-mode .video-label,
- .ab_thumbnails-a_abp-mode .sponsored,
- .ab_thumbnails-a_abp-mode .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 14.0px;
- font-weight: bold;
- text-decoration: none;
- color: #333;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0 0 6px 0;
- }
-
- .ab_thumbnails-a_abp-mode .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-a_abp-mode .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-a_abp-mode .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-a_abp-mode .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-a_abp-mode div.videoCube:hover,
- .ab_thumbnails-a_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-a_abp-mode .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-a_abp-mode div.sponsored-default:hover,
- .ab_thumbnails-a_abp-mode div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-a_abp-mode .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-a_abp-mode div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-a_abp-mode .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-a_abp-mode .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_prev:hover,
- .ab_thumbnails-a_abp-mode .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-a_abp-mode div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-a_abp-mode .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-a_abp-mode .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-a_abp-mode .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-a_abp-mode .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-a_abp-mode {
- width: 300px;
- _width: 300px;
- border-width: 1px 0 1px 0;
- border-style: solid;
- border-color: #CCC;
- padding: 5px 0px 5px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_prev,
- .ab_thumbnails-a_abp-mode .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-a_abp-mode .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-a_abp-mode .playerCube div.videoCube:hover,
- .ab_thumbnails-a_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-a_abp-mode .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-a_abp-mode div.syndicatedItem:hover,
- .ab_thumbnails-a_abp-mode div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-a_abp-mode div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d-2_row .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d-2_row .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d-2_row .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d-2_row .video-label,
- .ab_thumbnails-d-2_row .sponsored,
- .ab_thumbnails-d-2_row .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d-2_row .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d-2_row .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d-2_row .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d-2_row .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d-2_row .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d-2_row div.videoCube:hover,
- .ab_thumbnails-d-2_row div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d-2_row .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d-2_row div.sponsored-default:hover,
- .ab_thumbnails-d-2_row div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d-2_row .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d-2_row .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d-2_row .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d-2_row .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d-2_row div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d-2_row .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d-2_row .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_prev:hover,
- .ab_thumbnails-d-2_row .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d-2_row div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d-2_row .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d-2_row .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d-2_row .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d-2_row .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d-2_row .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d-2_row {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d-2_row .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d-2_row .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_prev,
- .ab_thumbnails-d-2_row .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d-2_row .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d-2_row .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d-2_row .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d-2_row .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d-2_row .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d-2_row .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d-2_row .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d-2_row .playerCube div.videoCube:hover,
- .ab_thumbnails-d-2_row div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d-2_row .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d-2_row div.syndicatedItem:hover,
- .ab_thumbnails-d-2_row div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d-2_row div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d-2_row .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d-2_row .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_3x3 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_3x3 .video-label,
- .ab_thumbnails-d_3x3 .sponsored,
- .ab_thumbnails-d_3x3 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_3x3 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_3x3 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_3x3 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_3x3 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_3x3 div.videoCube:hover,
- .ab_thumbnails-d_3x3 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_3x3 div.sponsored-default:hover,
- .ab_thumbnails-d_3x3 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_3x3 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_3x3 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_3x3 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_prev:hover,
- .ab_thumbnails-d_3x3 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_3x3 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_3x3 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_3x3 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_3x3 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_3x3 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_prev,
- .ab_thumbnails-d_3x3 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_3x3 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_3x3 .playerCube div.videoCube:hover,
- .ab_thumbnails-d_3x3 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3 div.syndicatedItem:hover,
- .ab_thumbnails-d_3x3 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_3x3 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 18.0px;
- line-height: 24.0px;
- font-weight: bold;
- max-height: 96.0px;
- *height: 96.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-label,
- .ab_thumbnails-d_3x3-bigger-titles .sponsored,
- .ab_thumbnails-d_3x3-bigger-titles .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.videoCube:hover,
- .ab_thumbnails-d_3x3-bigger-titles div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.sponsored-default:hover,
- .ab_thumbnails-d_3x3-bigger-titles div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_3x3-bigger-titles .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_prev:hover,
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_prev,
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_3x3-bigger-titles .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .playerCube div.videoCube:hover,
- .ab_thumbnails-d_3x3-bigger-titles div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.syndicatedItem:hover,
- .ab_thumbnails-d_3x3-bigger-titles div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-title {
- max-height: 72.0px;
- *height: 72.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 18.0px;
- line-height: 24.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_abp-mode .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_abp-mode .video-label,
- .ab_thumbnails-d_abp-mode .sponsored,
- .ab_thumbnails-d_abp-mode .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_abp-mode .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_abp-mode .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_abp-mode .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_abp-mode .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_abp-mode div.videoCube:hover,
- .ab_thumbnails-d_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_abp-mode .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_abp-mode div.sponsored-default:hover,
- .ab_thumbnails-d_abp-mode div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_abp-mode .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_abp-mode div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_abp-mode .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_abp-mode .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_prev:hover,
- .ab_thumbnails-d_abp-mode .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_abp-mode div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_abp-mode .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_abp-mode .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_abp-mode .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_abp-mode .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_abp-mode {
- width: 300px;
- _width: 300px;
- border-width: 1px 0px 1px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 10px 0px 10px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_prev,
- .ab_thumbnails-d_abp-mode .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_abp-mode .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_abp-mode .playerCube div.videoCube:hover,
- .ab_thumbnails-d_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_abp-mode .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_abp-mode div.syndicatedItem:hover,
- .ab_thumbnails-d_abp-mode div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_abp-mode div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-title {
- max-height: 44.0px;
- *height: 44.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_gb-read-more .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_gb-read-more .video-label,
- .ab_thumbnails-d_gb-read-more .sponsored,
- .ab_thumbnails-d_gb-read-more .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_gb-read-more .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_gb-read-more .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_gb-read-more .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_gb-read-more .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_gb-read-more div.videoCube:hover,
- .ab_thumbnails-d_gb-read-more div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_gb-read-more .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_gb-read-more div.sponsored-default:hover,
- .ab_thumbnails-d_gb-read-more div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_gb-read-more .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_gb-read-more div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_gb-read-more .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_gb-read-more .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_prev:hover,
- .ab_thumbnails-d_gb-read-more .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_gb-read-more div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_gb-read-more .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_gb-read-more {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_prev,
- .ab_thumbnails-d_gb-read-more .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_gb-read-more .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_gb-read-more .playerCube div.videoCube:hover,
- .ab_thumbnails-d_gb-read-more div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_gb-read-more .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_gb-read-more div.syndicatedItem:hover,
- .ab_thumbnails-d_gb-read-more div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_gb-read-more div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_row-read-more .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_row-read-more .video-label,
- .ab_thumbnails-d_row-read-more .sponsored,
- .ab_thumbnails-d_row-read-more .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_row-read-more .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_row-read-more .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_row-read-more .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_row-read-more .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_row-read-more div.videoCube:hover,
- .ab_thumbnails-d_row-read-more div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_row-read-more .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_row-read-more div.sponsored-default:hover,
- .ab_thumbnails-d_row-read-more div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_row-read-more .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_row-read-more div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_row-read-more .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_row-read-more .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_prev:hover,
- .ab_thumbnails-d_row-read-more .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_row-read-more div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_row-read-more .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_row-read-more .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_row-read-more .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_row-read-more .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_row-read-more {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_prev,
- .ab_thumbnails-d_row-read-more .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_row-read-more .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_row-read-more .playerCube div.videoCube:hover,
- .ab_thumbnails-d_row-read-more div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_row-read-more .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_row-read-more div.syndicatedItem:hover,
- .ab_thumbnails-d_row-read-more div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_row-read-more div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_size-round-10 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-10 .video-label,
- .ab_thumbnails-d_size-round-10 .sponsored,
- .ab_thumbnails-d_size-round-10 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_size-round-10 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_size-round-10 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_size-round-10 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_size-round-10 div.videoCube:hover,
- .ab_thumbnails-d_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_size-round-10 div.sponsored-default:hover,
- .ab_thumbnails-d_size-round-10 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-10 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_size-round-10 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_prev:hover,
- .ab_thumbnails-d_size-round-10 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-10 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_size-round-10 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_size-round-10 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_prev,
- .ab_thumbnails-d_size-round-10 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-10 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10 .playerCube div.videoCube:hover,
- .ab_thumbnails-d_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10 div.syndicatedItem:hover,
- .ab_thumbnails-d_size-round-10 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-label,
- .ab_thumbnails-d_size-round-10-factor .sponsored,
- .ab_thumbnails-d_size-round-10-factor .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_size-round-10-factor .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_size-round-10-factor .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.videoCube:hover,
- .ab_thumbnails-d_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10-factor .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.sponsored-default:hover,
- .ab_thumbnails-d_size-round-10-factor div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-10-factor .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10-factor .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_size-round-10-factor .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_prev:hover,
- .ab_thumbnails-d_size-round-10-factor .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_size-round-10-factor {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_prev,
- .ab_thumbnails-d_size-round-10-factor .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-10-factor .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-10-factor .playerCube div.videoCube:hover,
- .ab_thumbnails-d_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10-factor .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.syndicatedItem:hover,
- .ab_thumbnails-d_size-round-10-factor div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10-factor div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-d_size-round-20 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-20 .video-label,
- .ab_thumbnails-d_size-round-20 .sponsored,
- .ab_thumbnails-d_size-round-20 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-20 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-d_size-round-20 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-d_size-round-20 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-d_size-round-20 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-d_size-round-20 div.videoCube:hover,
- .ab_thumbnails-d_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-20 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-d_size-round-20 div.sponsored-default:hover,
- .ab_thumbnails-d_size-round-20 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-20 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-20 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-20 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-d_size-round-20 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_prev:hover,
- .ab_thumbnails-d_size-round-20 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-d_size-round-20 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-d_size-round-20 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-d_size-round-20 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_prev,
- .ab_thumbnails-d_size-round-20 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-d_size-round-20 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-d_size-round-20 .playerCube div.videoCube:hover,
- .ab_thumbnails-d_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-20 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-20 div.syndicatedItem:hover,
- .ab_thumbnails-d_size-round-20 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-20 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-label,
- .ab_thumbnails-h_1x3-landscape .sponsored,
- .ab_thumbnails-h_1x3-landscape .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-h_1x3-landscape .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-h_1x3-landscape .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-h_1x3-landscape div.videoCube:hover,
- .ab_thumbnails-h_1x3-landscape div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x3-landscape .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-h_1x3-landscape div.sponsored-default:hover,
- .ab_thumbnails-h_1x3-landscape div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x3-landscape .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x3-landscape div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x3-landscape .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-h_1x3-landscape .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_prev:hover,
- .ab_thumbnails-h_1x3-landscape .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x3-landscape div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-h_1x3-landscape .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-h_1x3-landscape {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_prev,
- .ab_thumbnails-h_1x3-landscape .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x3-landscape .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-h_1x3-landscape .playerCube div.videoCube:hover,
- .ab_thumbnails-h_1x3-landscape div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x3-landscape .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape div.syndicatedItem:hover,
- .ab_thumbnails-h_1x3-landscape div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x3-landscape div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-h_1x5 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x5 .video-label,
- .ab_thumbnails-h_1x5 .sponsored,
- .ab_thumbnails-h_1x5 .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-h_1x5 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-h_1x5 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-h_1x5 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-h_1x5 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-h_1x5 div.videoCube:hover,
- .ab_thumbnails-h_1x5 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-h_1x5 div.sponsored-default:hover,
- .ab_thumbnails-h_1x5 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x5 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x5 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-h_1x5 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_prev:hover,
- .ab_thumbnails-h_1x5 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x5 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x5 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-h_1x5 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-h_1x5 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-h_1x5 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_prev,
- .ab_thumbnails-h_1x5 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x5 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-h_1x5 .playerCube div.videoCube:hover,
- .ab_thumbnails-h_1x5 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5 div.syndicatedItem:hover,
- .ab_thumbnails-h_1x5 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-h_1x5 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-label,
- .ab_thumbnails-h_1x5-landscape .sponsored,
- .ab_thumbnails-h_1x5-landscape .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-h_1x5-landscape .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-h_1x5-landscape .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-h_1x5-landscape div.videoCube:hover,
- .ab_thumbnails-h_1x5-landscape div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5-landscape .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-h_1x5-landscape div.sponsored-default:hover,
- .ab_thumbnails-h_1x5-landscape div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x5-landscape .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5-landscape div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x5-landscape .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-h_1x5-landscape .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_prev:hover,
- .ab_thumbnails-h_1x5-landscape .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_1x5-landscape div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-h_1x5-landscape .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-h_1x5-landscape {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_prev,
- .ab_thumbnails-h_1x5-landscape .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_1x5-landscape .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-h_1x5-landscape .playerCube div.videoCube:hover,
- .ab_thumbnails-h_1x5-landscape div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5-landscape .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape div.syndicatedItem:hover,
- .ab_thumbnails-h_1x5-landscape div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5-landscape div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-h_abp-mode .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_abp-mode .video-label,
- .ab_thumbnails-h_abp-mode .sponsored,
- .ab_thumbnails-h_abp-mode .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-h_abp-mode .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-h_abp-mode .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-h_abp-mode .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-h_abp-mode .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-h_abp-mode div.videoCube:hover,
- .ab_thumbnails-h_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_abp-mode .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-h_abp-mode div.sponsored-default:hover,
- .ab_thumbnails-h_abp-mode div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_abp-mode .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_abp-mode div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_abp-mode .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-h_abp-mode .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_prev:hover,
- .ab_thumbnails-h_abp-mode .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-h_abp-mode div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-h_abp-mode .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-h_abp-mode .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_abp-mode .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-h_abp-mode .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-h_abp-mode {
- width: 300px;
- _width: 300px;
- border-width: 1px 1px 1px 1px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 10px 5px 10px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_prev,
- .ab_thumbnails-h_abp-mode .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-h_abp-mode .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-h_abp-mode .playerCube div.videoCube:hover,
- .ab_thumbnails-h_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_abp-mode .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-h_abp-mode div.syndicatedItem:hover,
- .ab_thumbnails-h_abp-mode div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_abp-mode div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-i_1x5 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-i_1x5 .video-label,
- .ab_thumbnails-i_1x5 .sponsored,
- .ab_thumbnails-i_1x5 .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-i_1x5 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-i_1x5 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-i_1x5 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-i_1x5 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-i_1x5 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-i_1x5 div.videoCube:hover,
- .ab_thumbnails-i_1x5 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-i_1x5 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-i_1x5 div.sponsored-default:hover,
- .ab_thumbnails-i_1x5 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-i_1x5 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-i_1x5 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-i_1x5 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-i_1x5 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-i_1x5 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_prev:hover,
- .ab_thumbnails-i_1x5 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-i_1x5 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-i_1x5 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-i_1x5 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-i_1x5 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-i_1x5 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-i_1x5 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_prev,
- .ab_thumbnails-i_1x5 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-i_1x5 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-i_1x5 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-i_1x5 .playerCube div.videoCube:hover,
- .ab_thumbnails-i_1x5 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-i_1x5 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-i_1x5 div.syndicatedItem:hover,
- .ab_thumbnails-i_1x5 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-i_1x5 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-i_1x5 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-k_abp-mode .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_abp-mode .video-label,
- .ab_thumbnails-k_abp-mode .sponsored,
- .ab_thumbnails-k_abp-mode .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-k_abp-mode .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-k_abp-mode .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-k_abp-mode .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-k_abp-mode .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-k_abp-mode div.videoCube:hover,
- .ab_thumbnails-k_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_abp-mode .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-k_abp-mode div.sponsored-default:hover,
- .ab_thumbnails-k_abp-mode div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_abp-mode .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_abp-mode div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_abp-mode .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-k_abp-mode .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_prev:hover,
- .ab_thumbnails-k_abp-mode .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_abp-mode div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_abp-mode .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-k_abp-mode .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_abp-mode .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-k_abp-mode .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-k_abp-mode {
- width: 300px;
- _width: 300px;
- border-width: 1px 1px 1px 1px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 8px 8px 0px 8px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_prev,
- .ab_thumbnails-k_abp-mode .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_abp-mode .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-k_abp-mode .playerCube div.videoCube:hover,
- .ab_thumbnails-k_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_abp-mode .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-k_abp-mode div.syndicatedItem:hover,
- .ab_thumbnails-k_abp-mode div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_abp-mode div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-k_backup .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-k_backup .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-k_backup .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_backup .video-label,
- .ab_thumbnails-k_backup .sponsored,
- .ab_thumbnails-k_backup .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-k_backup .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-k_backup .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-k_backup .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-k_backup .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-k_backup .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-k_backup div.videoCube:hover,
- .ab_thumbnails-k_backup div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_backup .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-k_backup div.sponsored-default:hover,
- .ab_thumbnails-k_backup div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-k_backup .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_backup .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_backup .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_backup .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_backup div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_backup .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_backup .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-k_backup .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_backup .trc_pager_prev:hover,
- .ab_thumbnails-k_backup .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_backup .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_backup .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_backup div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_backup .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-k_backup .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_backup .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-k_backup .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_backup .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-k_backup {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-k_backup .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_backup .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_backup .trc_pager_prev,
- .ab_thumbnails-k_backup .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-k_backup .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_backup .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_backup .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_backup .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-k_backup .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-k_backup .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-k_backup .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-k_backup .playerCube div.videoCube:hover,
- .ab_thumbnails-k_backup div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_backup .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-k_backup div.syndicatedItem:hover,
- .ab_thumbnails-k_backup div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_backup div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-k_backup .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-k_backup .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-k_size-round-10 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-10 .video-label,
- .ab_thumbnails-k_size-round-10 .sponsored,
- .ab_thumbnails-k_size-round-10 .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-k_size-round-10 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-k_size-round-10 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-k_size-round-10 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-k_size-round-10 div.videoCube:hover,
- .ab_thumbnails-k_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-k_size-round-10 div.sponsored-default:hover,
- .ab_thumbnails-k_size-round-10 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-10 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-k_size-round-10 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_prev:hover,
- .ab_thumbnails-k_size-round-10 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-10 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-k_size-round-10 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-k_size-round-10 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_prev,
- .ab_thumbnails-k_size-round-10 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-10 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10 .playerCube div.videoCube:hover,
- .ab_thumbnails-k_size-round-10 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10 div.syndicatedItem:hover,
- .ab_thumbnails-k_size-round-10 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-label,
- .ab_thumbnails-k_size-round-10-factor .sponsored,
- .ab_thumbnails-k_size-round-10-factor .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-k_size-round-10-factor .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-k_size-round-10-factor .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.videoCube:hover,
- .ab_thumbnails-k_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10-factor .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.sponsored-default:hover,
- .ab_thumbnails-k_size-round-10-factor div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-10-factor .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10-factor .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-k_size-round-10-factor .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_prev:hover,
- .ab_thumbnails-k_size-round-10-factor .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-k_size-round-10-factor {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_prev,
- .ab_thumbnails-k_size-round-10-factor .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-10-factor .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-10-factor .playerCube div.videoCube:hover,
- .ab_thumbnails-k_size-round-10-factor div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10-factor .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.syndicatedItem:hover,
- .ab_thumbnails-k_size-round-10-factor div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10-factor div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-k_size-round-20 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-20 .video-label,
- .ab_thumbnails-k_size-round-20 .sponsored,
- .ab_thumbnails-k_size-round-20 .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-20 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-k_size-round-20 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-k_size-round-20 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-k_size-round-20 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-k_size-round-20 div.videoCube:hover,
- .ab_thumbnails-k_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-20 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-k_size-round-20 div.sponsored-default:hover,
- .ab_thumbnails-k_size-round-20 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-20 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-20 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-20 .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-k_size-round-20 .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_prev:hover,
- .ab_thumbnails-k_size-round-20 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-k_size-round-20 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-k_size-round-20 .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-k_size-round-20 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_prev,
- .ab_thumbnails-k_size-round-20 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-k_size-round-20 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-k_size-round-20 .playerCube div.videoCube:hover,
- .ab_thumbnails-k_size-round-20 div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-20 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-20 div.syndicatedItem:hover,
- .ab_thumbnails-k_size-round-20 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-20 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .ab_thumbnails-rr_abp-mode .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode .video-label,
- .ab_thumbnails-rr_abp-mode .sponsored,
- .ab_thumbnails-rr_abp-mode .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 14.0px;
- font-weight: bold;
- text-decoration: none;
- color: #444444;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0 0 6px 0;
- }
-
- .ab_thumbnails-rr_abp-mode .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .ab_thumbnails-rr_abp-mode .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .ab_thumbnails-rr_abp-mode .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .ab_thumbnails-rr_abp-mode .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode div.videoCube:hover,
- .ab_thumbnails-rr_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-rr_abp-mode .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .ab_thumbnails-rr_abp-mode div.sponsored-default:hover,
- .ab_thumbnails-rr_abp-mode div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube:hover .thumbnail-overlay,
- .ab_thumbnails-rr_abp-mode .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-rr_abp-mode div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-rr_abp-mode .pager_enabled {
- color: #0056b3;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_counter {
- color: #000000;
- }
-
- .ab_thumbnails-rr_abp-mode .pager_disabled {
- color: #7d898f;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_prev:hover,
- .ab_thumbnails-rr_abp-mode .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_selected {
- color: #0056b3;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_unselected {
- color: #7d898f;
- }
-
- .ab_thumbnails-rr_abp-mode div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .ab_thumbnails-rr_abp-mode .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_sponsored_overlay {
- background-color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .ab_thumbnails-rr_abp-mode {
- width: 300px;
- _width: 300px;
- border-width: 1px 0 1px 0;
- border-style: solid;
- border-color: #CCC;
- padding: 5px 0px 5px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_prev,
- .ab_thumbnails-rr_abp-mode .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_pager div {
- font-family: serif;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube:hover .thumbnail-overlay,
- .ab_thumbnails-rr_abp-mode .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-label-box {
- text-align: left;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .ab_thumbnails-rr_abp-mode .playerCube div.videoCube:hover,
- .ab_thumbnails-rr_abp-mode div.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-rr_abp-mode .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .ab_thumbnails-rr_abp-mode div.syndicatedItem:hover,
- .ab_thumbnails-rr_abp-mode div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .ab_thumbnails-rr_abp-mode div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem {
- background-color: transparent;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .alternating-thumbnails-a .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- max-height: 76.0px;
- *height: 76.0px;
- color: #333;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .alternating-thumbnails-a .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .alternating-thumbnails-a .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .alternating-thumbnails-a .video-label,
- .alternating-thumbnails-a .sponsored,
- .alternating-thumbnails-a .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .alternating-thumbnails-a .trc_rbox_header {
- font-family: 'open sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #333333;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .alternating-thumbnails-a .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .alternating-thumbnails-a .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .alternating-thumbnails-a .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .alternating-thumbnails-a .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .alternating-thumbnails-a .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .alternating-thumbnails-a div.videoCube:hover,
- .alternating-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-a .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .alternating-thumbnails-a div.sponsored-default:hover,
- .alternating-thumbnails-a div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .alternating-thumbnails-a .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-a .videoCube:hover .thumbnail-overlay,
- .alternating-thumbnails-a .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .alternating-thumbnails-a .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .alternating-thumbnails-a .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .alternating-thumbnails-a div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .alternating-thumbnails-a .pager_enabled {
- color: #0056b3;
- }
-
- .alternating-thumbnails-a .trc_pager_counter {
- color: #000000;
- }
-
- .alternating-thumbnails-a .pager_disabled {
- color: #7d898f;
- }
-
- .alternating-thumbnails-a .trc_pager_prev:hover,
- .alternating-thumbnails-a .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .alternating-thumbnails-a .trc_pager_selected {
- color: #0056b3;
- }
-
- .alternating-thumbnails-a .trc_pager_unselected {
- color: #7d898f;
- }
-
- .alternating-thumbnails-a div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .alternating-thumbnails-a .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .alternating-thumbnails-a .video-label-box {
- text-align: left;
- }
-
- .alternating-thumbnails-a .trc_sponsored_overlay {
- background-color: black;
- }
-
- .alternating-thumbnails-a .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-a .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .alternating-thumbnails-a {
- width: 300px;
- _width: 300px;
- border-width: 0px;
- border-style: none;
- border-color: #000000;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .alternating-thumbnails-a .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .alternating-thumbnails-a .videoCube.horizontal {
- border-style: none;
- }
-
- .alternating-thumbnails-a .trc_pager_prev,
- .alternating-thumbnails-a .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .trc_pager div {
- font-family: serif;
- }
-
- .alternating-thumbnails-a .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-a .playerCube:hover .thumbnail-overlay,
- .alternating-thumbnails-a .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .alternating-thumbnails-a .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .alternating-thumbnails-a .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .alternating-thumbnails-a .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .alternating-thumbnails-a .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-label-box {
- text-align: left;
- }
-
- .alternating-thumbnails-a .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .alternating-thumbnails-a .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .alternating-thumbnails-a .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .alternating-thumbnails-a .playerCube div.videoCube:hover,
- .alternating-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-a .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .alternating-thumbnails-a div.syndicatedItem:hover,
- .alternating-thumbnails-a div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-a div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .alternating-thumbnails-a .syndicatedItem {
- background-color: transparent;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-title {
- max-height: 57.0px;
- *height: 57.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-a .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .alternating-thumbnails-a .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .alternating-thumbnails-a .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .alternating-thumbnails-b .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- max-height: 76.0px;
- *height: 76.0px;
- color: #333;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .alternating-thumbnails-b .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .alternating-thumbnails-b .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .alternating-thumbnails-b .video-label,
- .alternating-thumbnails-b .sponsored,
- .alternating-thumbnails-b .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .alternating-thumbnails-b .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .alternating-thumbnails-b .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .alternating-thumbnails-b .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .alternating-thumbnails-b .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .alternating-thumbnails-b .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .alternating-thumbnails-b .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .alternating-thumbnails-b div.videoCube:hover,
- .alternating-thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-b .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .alternating-thumbnails-b div.sponsored-default:hover,
- .alternating-thumbnails-b div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .alternating-thumbnails-b .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-b .videoCube:hover .thumbnail-overlay,
- .alternating-thumbnails-b .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .alternating-thumbnails-b .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .alternating-thumbnails-b .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .alternating-thumbnails-b div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .alternating-thumbnails-b .pager_enabled {
- color: #0056b3;
- }
-
- .alternating-thumbnails-b .trc_pager_counter {
- color: #000000;
- }
-
- .alternating-thumbnails-b .pager_disabled {
- color: #7d898f;
- }
-
- .alternating-thumbnails-b .trc_pager_prev:hover,
- .alternating-thumbnails-b .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .alternating-thumbnails-b .trc_pager_selected {
- color: #0056b3;
- }
-
- .alternating-thumbnails-b .trc_pager_unselected {
- color: #7d898f;
- }
-
- .alternating-thumbnails-b div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .alternating-thumbnails-b .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .alternating-thumbnails-b .video-label-box {
- text-align: left;
- }
-
- .alternating-thumbnails-b .trc_sponsored_overlay {
- background-color: black;
- }
-
- .alternating-thumbnails-b .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-b .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .alternating-thumbnails-b {
- width: 300px;
- _width: 300px;
- border-width: 0px;
- border-style: none;
- border-color: #000000;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .alternating-thumbnails-b .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .alternating-thumbnails-b .videoCube.horizontal {
- border-style: none;
- }
-
- .alternating-thumbnails-b .trc_pager_prev,
- .alternating-thumbnails-b .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .trc_pager div {
- font-family: serif;
- }
-
- .alternating-thumbnails-b .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-b .playerCube:hover .thumbnail-overlay,
- .alternating-thumbnails-b .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .alternating-thumbnails-b .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .alternating-thumbnails-b .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .alternating-thumbnails-b .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .alternating-thumbnails-b .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-label-box {
- text-align: left;
- }
-
- .alternating-thumbnails-b .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .alternating-thumbnails-b .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .alternating-thumbnails-b .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .alternating-thumbnails-b .playerCube div.videoCube:hover,
- .alternating-thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-b .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .alternating-thumbnails-b div.syndicatedItem:hover,
- .alternating-thumbnails-b div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .alternating-thumbnails-b div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .alternating-thumbnails-b .syndicatedItem {
- background-color: transparent;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-title {
- max-height: 57.0px;
- *height: 57.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .alternating-thumbnails-b .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .alternating-thumbnails-b .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .alternating-thumbnails-b .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .mobile-thumbnails-a .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .mobile-thumbnails-a .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .mobile-thumbnails-a .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .mobile-thumbnails-a .video-label,
- .mobile-thumbnails-a .sponsored,
- .mobile-thumbnails-a .sponsored-url {
- font-family: georgia, times, serif;
- }
-
- .mobile-thumbnails-a .trc_rbox_header {
- font-family: georgia, times, serif;
- font-size: 18.0px;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0 0 6px 0;
- }
-
- .mobile-thumbnails-a .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .mobile-thumbnails-a .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .mobile-thumbnails-a .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .mobile-thumbnails-a .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .mobile-thumbnails-a .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .mobile-thumbnails-a div.videoCube:hover,
- .mobile-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .mobile-thumbnails-a .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .mobile-thumbnails-a div.sponsored-default:hover,
- .mobile-thumbnails-a div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .mobile-thumbnails-a .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .mobile-thumbnails-a .videoCube:hover .thumbnail-overlay,
- .mobile-thumbnails-a .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .mobile-thumbnails-a .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .mobile-thumbnails-a .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .mobile-thumbnails-a div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .mobile-thumbnails-a .pager_enabled {
- color: #0056b3;
- }
-
- .mobile-thumbnails-a .trc_pager_counter {
- color: #000000;
- }
-
- .mobile-thumbnails-a .pager_disabled {
- color: #7d898f;
- }
-
- .mobile-thumbnails-a .trc_pager_prev:hover,
- .mobile-thumbnails-a .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .mobile-thumbnails-a .trc_pager_selected {
- color: #0056b3;
- }
-
- .mobile-thumbnails-a .trc_pager_unselected {
- color: #7d898f;
- }
-
- .mobile-thumbnails-a div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .mobile-thumbnails-a .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .mobile-thumbnails-a .video-label-box {
- text-align: left;
- }
-
- .mobile-thumbnails-a .trc_sponsored_overlay {
- background-color: black;
- }
-
- .mobile-thumbnails-a .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .mobile-thumbnails-a .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .mobile-thumbnails-a {
- width: 300px;
- _width: 300px;
- border-width: 0px;
- border-style: none;
- border-color: #000000;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .mobile-thumbnails-a .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .mobile-thumbnails-a .videoCube.horizontal {
- border-style: none;
- }
-
- .mobile-thumbnails-a .trc_pager_prev,
- .mobile-thumbnails-a .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .trc_pager div {
- font-family: serif;
- }
-
- .mobile-thumbnails-a .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .mobile-thumbnails-a .playerCube:hover .thumbnail-overlay,
- .mobile-thumbnails-a .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .mobile-thumbnails-a .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .mobile-thumbnails-a .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .mobile-thumbnails-a .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .mobile-thumbnails-a .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-label-box {
- text-align: left;
- }
-
- .mobile-thumbnails-a .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .mobile-thumbnails-a .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .mobile-thumbnails-a .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .mobile-thumbnails-a .playerCube div.videoCube:hover,
- .mobile-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .mobile-thumbnails-a .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .mobile-thumbnails-a div.syndicatedItem:hover,
- .mobile-thumbnails-a div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .mobile-thumbnails-a div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .mobile-thumbnails-a .syndicatedItem {
- background-color: transparent;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: georgia, times, serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .mobile-thumbnails-a .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: georgia, times, serif;
- background-image: null;
- text-align: left;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .mobile-thumbnails-a .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .mobile-thumbnails-a .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-a .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-a .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-a .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-a .video-label,
- .organic-thumbnails-a .sponsored,
- .organic-thumbnails-a .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .organic-thumbnails-a .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #333;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-a .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-a .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-a .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-a .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-a .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-a div.videoCube:hover,
- .organic-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-a .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-a div.sponsored-default:hover,
- .organic-thumbnails-a div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-a .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-a .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-a .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-a .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-a .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-a div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-a .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-a .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-a .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-a .trc_pager_prev:hover,
- .organic-thumbnails-a .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-a .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-a .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-a div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-a .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-a .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-a .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-a .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-a .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-a {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-a .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-a .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-a .trc_pager_prev,
- .organic-thumbnails-a .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-a .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-a .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-a .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-a .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-a .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-a .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-a .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-a .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-a .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-a .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-a .playerCube div.videoCube:hover,
- .organic-thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-a .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-a div.syndicatedItem:hover,
- .organic-thumbnails-a div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-a div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-a .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-a .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-a .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-a .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-b .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 18.0px;
- font-weight: bold;
- max-height: 54.0px;
- *height: 54.0px;
- color: #660046;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-b .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-b .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-b .video-label,
- .organic-thumbnails-b .sponsored,
- .organic-thumbnails-b .sponsored-url {
- font-family: 'Open Sans', sans-serif;
- }
-
- .organic-thumbnails-b .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-b .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-b .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-b .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-b .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-b .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-b div.videoCube:hover,
- .organic-thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-b .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-b div.sponsored-default:hover,
- .organic-thumbnails-b div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-b .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-b .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-b .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-b .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-b .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-b div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-b .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-b .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-b .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-b .trc_pager_prev:hover,
- .organic-thumbnails-b .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-b .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-b .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-b div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-b .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-b .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-b .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-b .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-b .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-b {
- width: 300px;
- _width: 300px;
- border-width: 0px;
- border-style: none;
- border-color: #000000;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-b .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-b .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-b .trc_pager_prev,
- .organic-thumbnails-b .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-b .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-b .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-b .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-b .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-b .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-b .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-b .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-b .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-b .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-b .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-b .playerCube div.videoCube:hover,
- .organic-thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-b .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-b div.syndicatedItem:hover,
- .organic-thumbnails-b div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-b div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-b .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-title {
- max-height: 37.0px;
- *height: 37.0px;
- color: #660046;
- font-family: 'Open Sans', sans-serif;
- font-size: 16.0px;
- line-height: 18.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-b .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans', sans-serif;
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-b .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-b .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-d .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-d .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-d .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-d .video-label,
- .organic-thumbnails-d .sponsored,
- .organic-thumbnails-d .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .organic-thumbnails-d .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-d .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-d .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-d .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-d .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-d .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-d div.videoCube:hover,
- .organic-thumbnails-d div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-d div.sponsored-default:hover,
- .organic-thumbnails-d div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-d .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-d .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-d .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-d .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-d div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-d .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-d .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-d .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-d .trc_pager_prev:hover,
- .organic-thumbnails-d .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-d .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-d .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-d div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-d .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-d .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-d .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-d .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-d {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-d .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-d .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-d .trc_pager_prev,
- .organic-thumbnails-d .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-d .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-d .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-d .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-d .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-d .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-d .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-d .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-d .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-d .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-d .playerCube div.videoCube:hover,
- .organic-thumbnails-d div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-d div.syndicatedItem:hover,
- .organic-thumbnails-d div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-d .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-d .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-d .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-d-2 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-d-2 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-d-2 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-d-2 .video-label,
- .organic-thumbnails-d-2 .sponsored,
- .organic-thumbnails-d-2 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-d-2 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-d-2 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-d-2 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-d-2 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-d-2 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-d-2 div.videoCube:hover,
- .organic-thumbnails-d-2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d-2 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-d-2 div.sponsored-default:hover,
- .organic-thumbnails-d-2 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-d-2 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d-2 .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-d-2 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-d-2 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-d-2 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-d-2 .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-d-2 .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-d-2 .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-d-2 .trc_pager_prev:hover,
- .organic-thumbnails-d-2 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-d-2 .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-d-2 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-d-2 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-d-2 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-d-2 .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-d-2 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-d-2 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d-2 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-d-2 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-d-2 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-d-2 .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-d-2 .trc_pager_prev,
- .organic-thumbnails-d-2 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-d-2 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d-2 .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-d-2 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-d-2 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-d-2 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-d-2 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-d-2 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-d-2 .playerCube div.videoCube:hover,
- .organic-thumbnails-d-2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d-2 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-d-2 div.syndicatedItem:hover,
- .organic-thumbnails-d-2 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-d-2 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-d-2 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-e .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-e .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-e .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-e .video-label,
- .organic-thumbnails-e .sponsored,
- .organic-thumbnails-e .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .organic-thumbnails-e .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-e .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-e .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-e .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-e .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-e .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-e div.videoCube:hover,
- .organic-thumbnails-e div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-e .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-e div.sponsored-default:hover,
- .organic-thumbnails-e div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-e .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-e .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-e .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-e .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-e .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-e div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-e .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-e .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-e .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-e .trc_pager_prev:hover,
- .organic-thumbnails-e .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-e .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-e .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-e div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-e .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-e .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-e .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-e .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-e .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-e {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-e .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-e .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-e .trc_pager_prev,
- .organic-thumbnails-e .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-e .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-e .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-e .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-e .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-e .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-e .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-e .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-e .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-e .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-e .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-e .playerCube div.videoCube:hover,
- .organic-thumbnails-e div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-e .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-e div.syndicatedItem:hover,
- .organic-thumbnails-e div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-e div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-e .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-e .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-e .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-e .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .organic-thumbnails-mobile .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .organic-thumbnails-mobile .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .organic-thumbnails-mobile .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .organic-thumbnails-mobile .video-label,
- .organic-thumbnails-mobile .sponsored,
- .organic-thumbnails-mobile .sponsored-url {
- font-family: georgia, times, serif;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header {
- font-family: georgia, times, serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .organic-thumbnails-mobile .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .organic-thumbnails-mobile .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .organic-thumbnails-mobile .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .organic-thumbnails-mobile .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .organic-thumbnails-mobile .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .organic-thumbnails-mobile div.videoCube:hover,
- .organic-thumbnails-mobile div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-mobile .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .organic-thumbnails-mobile div.sponsored-default:hover,
- .organic-thumbnails-mobile div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .organic-thumbnails-mobile .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-mobile .videoCube:hover .thumbnail-overlay,
- .organic-thumbnails-mobile .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-mobile .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .organic-thumbnails-mobile .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-mobile div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-mobile .pager_enabled {
- color: #0056b3;
- }
-
- .organic-thumbnails-mobile .trc_pager_counter {
- color: #000000;
- }
-
- .organic-thumbnails-mobile .pager_disabled {
- color: #7d898f;
- }
-
- .organic-thumbnails-mobile .trc_pager_prev:hover,
- .organic-thumbnails-mobile .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-mobile .trc_pager_selected {
- color: #0056b3;
- }
-
- .organic-thumbnails-mobile .trc_pager_unselected {
- color: #7d898f;
- }
-
- .organic-thumbnails-mobile div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .organic-thumbnails-mobile .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .organic-thumbnails-mobile .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-mobile .trc_sponsored_overlay {
- background-color: black;
- }
-
- .organic-thumbnails-mobile .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-mobile .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .organic-thumbnails-mobile {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .organic-thumbnails-mobile .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-mobile .videoCube.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-mobile .trc_pager_prev,
- .organic-thumbnails-mobile .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .trc_pager div {
- font-family: serif;
- }
-
- .organic-thumbnails-mobile .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-mobile .playerCube:hover .thumbnail-overlay,
- .organic-thumbnails-mobile .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .organic-thumbnails-mobile .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .organic-thumbnails-mobile .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .organic-thumbnails-mobile .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .organic-thumbnails-mobile .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-label-box {
- text-align: left;
- }
-
- .organic-thumbnails-mobile .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .organic-thumbnails-mobile .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .organic-thumbnails-mobile .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .organic-thumbnails-mobile .playerCube div.videoCube:hover,
- .organic-thumbnails-mobile div.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-mobile .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .organic-thumbnails-mobile div.syndicatedItem:hover,
- .organic-thumbnails-mobile div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .organic-thumbnails-mobile div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .organic-thumbnails-mobile .syndicatedItem {
- background-color: transparent;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: georgia, times, serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: georgia, times, serif;
- background-image: null;
- text-align: left;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .organic-thumbnails-mobile .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .organic-thumbnails-mobile .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .rbox-blended .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- text-decoration: none;
- }
-
- .rbox-blended .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .rbox-blended .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 1px;
- padding: 0;
- }
-
- .rbox-blended .videoCube .video-duration {
- left: 36px;
- display: block;
- }
-
- .rbox-blended .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .rbox-blended .video-label,
- .rbox-blended .sponsored,
- .rbox-blended .sponsored-url {
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .rbox-blended .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16px;
- font-weight: bold;
- text-decoration: none;
- color: black;
- border-width: 0;
- background: transparent;
- border-style: none none solid none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .rbox-blended .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .rbox-blended .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .rbox-blended .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .rbox-blended .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .rbox-blended .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 3px;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .rbox-blended div.videoCube:hover,
- .rbox-blended div.videoCube_hover {
- background-color: transparent;
- }
-
- .rbox-blended .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .rbox-blended div.sponsored-default:hover,
- .rbox-blended div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .rbox-blended .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .rbox-blended .videoCube:hover .thumbnail-overlay,
- .rbox-blended .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .rbox-blended .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .rbox-blended .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .rbox-blended div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .rbox-blended .pager_enabled {
- color: #0056b3;
- }
-
- .rbox-blended .trc_pager_counter {
- color: #000000;
- }
-
- .rbox-blended .pager_disabled {
- color: #7d898f;
- }
-
- .rbox-blended .trc_pager_prev:hover,
- .rbox-blended .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .rbox-blended .trc_pager_selected {
- color: #0056b3;
- }
-
- .rbox-blended .trc_pager_unselected {
- color: #7d898f;
- }
-
- .rbox-blended div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .rbox-blended .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .rbox-blended .video-label-box {
- text-align: left;
- }
-
- .rbox-blended .trc_sponsored_overlay {
- background-color: black;
- }
-
- .rbox-blended .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .rbox-blended .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .rbox-blended {
- width: 300px;
- _width: 300px;
- border-width: 0px;
- border-style: solid solid solid solid;
- border-color: #000000;
- padding: 0;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .rbox-blended .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .rbox-blended .videoCube.horizontal {
- border-style: none none none solid;
- }
-
- .rbox-blended .trc_pager_prev,
- .rbox-blended .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .trc_pager div {
- font-family: serif;
- }
-
- .rbox-blended .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .rbox-blended .playerCube:hover .thumbnail-overlay,
- .rbox-blended .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .rbox-blended .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .rbox-blended .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .rbox-blended .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .rbox-blended .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-label-box {
- text-align: left;
- }
-
- .rbox-blended .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .rbox-blended .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .rbox-blended .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .rbox-blended .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .rbox-blended .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .rbox-blended .playerCube div.videoCube:hover,
- .rbox-blended div.videoCube_hover {
- background-color: transparent;
- }
-
- .rbox-blended .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .rbox-blended div.syndicatedItem:hover,
- .rbox-blended div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .rbox-blended div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .rbox-blended .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .rbox-blended .videoCube.syndicatedItem.horizontal {
- border-style: none none none solid;
- }
-
- .rbox-blended .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .rbox-blended .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .rbox-blended .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .rbox-blended .videoCube.syndicatedItem .video-duration {
- display: block;
- left: 36px;
- }
-
- .rbox-blended .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .rbox-blended .syndicatedItem {
- background-color: transparent;
- }
-
- .rbox-blended .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .rbox-blended .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .rbox-blended .syndicatedItem .branding {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- text-align: left;
- }
-
- .rbox-blended .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: block;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .rbox-blended .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: block;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .rbox-blended .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .text-links-a .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: normal;
- font-weight: normal;
- max-height: 44.0px;
- *height: 44.0px;
- color: #281E1E;
- text-decoration: none;
- }
-
- .text-links-a .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .text-links-a .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: auto;
- border-width: 0;
- padding: 0;
- }
-
- .text-links-a .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .text-links-a .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .text-links-a .video-label,
- .text-links-a .sponsored,
- .text-links-a .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .text-links-a .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 26.0px;
- font-weight: 800;
- text-decoration: none;
- color: #281E1E;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0 0 0 0;
- }
-
- .text-links-a .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .text-links-a .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .text-links-a .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .text-links-a .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .text-links-a .videoCube {
- width: 48%;
- _width: 48%;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 3px 3px 3px 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .text-links-a div.videoCube:hover,
- .text-links-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .text-links-a .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .text-links-a div.sponsored-default:hover,
- .text-links-a div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .text-links-a .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .text-links-a .videoCube:hover .thumbnail-overlay,
- .text-links-a .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .text-links-a .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .text-links-a .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .text-links-a div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .text-links-a .pager_enabled {
- color: #0056b3;
- }
-
- .text-links-a .trc_pager_counter {
- color: #000000;
- }
-
- .text-links-a .pager_disabled {
- color: #7d898f;
- }
-
- .text-links-a .trc_pager_prev:hover,
- .text-links-a .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .text-links-a .trc_pager_selected {
- color: #0056b3;
- }
-
- .text-links-a .trc_pager_unselected {
- color: #7d898f;
- }
-
- .text-links-a div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .text-links-a .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .text-links-a .video-label-box {
- text-align: left;
- }
-
- .text-links-a .trc_sponsored_overlay {
- background-color: black;
- }
-
- .text-links-a .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .text-links-a .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .text-links-a {
- width: auto;
- _width: auto;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .text-links-a .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .text-links-a .videoCube.horizontal {
- border-style: none;
- }
-
- .text-links-a .trc_pager_prev,
- .text-links-a .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .trc_pager div {
- font-family: serif;
- }
-
- .text-links-a .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .text-links-a .playerCube:hover .thumbnail-overlay,
- .text-links-a .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .text-links-a .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .text-links-a .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .text-links-a .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .text-links-a .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-label-box {
- text-align: left;
- }
-
- .text-links-a .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .text-links-a .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .text-links-a .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .text-links-a .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .text-links-a .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .text-links-a .playerCube div.videoCube:hover,
- .text-links-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .text-links-a .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .text-links-a div.syndicatedItem:hover,
- .text-links-a div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .text-links-a div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .text-links-a .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .text-links-a .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .text-links-a .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .text-links-a .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .text-links-a .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .text-links-a .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .text-links-a .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .text-links-a .syndicatedItem {
- background-color: transparent;
- }
-
- .text-links-a .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-title {
- max-height: 44.0px;
- *height: 44.0px;
- color: #281E1E;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: normal;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .text-links-a .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .text-links-a .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .text-links-a .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .text-links-a .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .text-links-a .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-a .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .thumbnails-a .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-a .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-a .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-a .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-a .video-label,
- .thumbnails-a .sponsored,
- .thumbnails-a .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .thumbnails-a .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #333;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-a .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-a .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-a .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-a .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-a .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-a div.videoCube:hover,
- .thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-a .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-a div.sponsored-default:hover,
- .thumbnails-a div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-a .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-a .videoCube:hover .thumbnail-overlay,
- .thumbnails-a .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-a .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-a .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-a div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-a .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-a .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-a .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-a .trc_pager_prev:hover,
- .thumbnails-a .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-a .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-a .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-a div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-a .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-a .video-label-box {
- text-align: left;
- }
-
- .thumbnails-a .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-a .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-a .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-a {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-a .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-a .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-a .trc_pager_prev,
- .thumbnails-a .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-a .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-a .playerCube:hover .thumbnail-overlay,
- .thumbnails-a .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-a .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-a .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-a .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-a .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-a .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-a .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-a .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-a .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-a .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-a .playerCube div.videoCube:hover,
- .thumbnails-a div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-a .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-a div.syndicatedItem:hover,
- .thumbnails-a div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-a div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-a .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-a .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-a .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-a .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-a .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-a .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-a .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-a .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-a .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-b .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .thumbnails-b .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-b .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-b .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-b .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-b .video-label,
- .thumbnails-b .sponsored,
- .thumbnails-b .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .thumbnails-b .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #333;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-b .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-b .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-b .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-b .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-b .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-b div.videoCube:hover,
- .thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-b .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-b div.sponsored-default:hover,
- .thumbnails-b div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-b .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-b .videoCube:hover .thumbnail-overlay,
- .thumbnails-b .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-b .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-b .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-b div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-b .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-b .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-b .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-b .trc_pager_prev:hover,
- .thumbnails-b .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-b .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-b .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-b div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-b .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-b .video-label-box {
- text-align: left;
- }
-
- .thumbnails-b .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-b .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-b .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-b {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-b .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-b .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-b .trc_pager_prev,
- .thumbnails-b .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-b .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-b .playerCube:hover .thumbnail-overlay,
- .thumbnails-b .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-b .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-b .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-b .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-b .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-b .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-b .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-b .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-b .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-b .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-b .playerCube div.videoCube:hover,
- .thumbnails-b div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-b .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-b div.syndicatedItem:hover,
- .thumbnails-b div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-b div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-b .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-b .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-b .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-b .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-b .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-b .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-b .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-b .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-b .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-c .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .thumbnails-c .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-c .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-c .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-c .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-c .video-label,
- .thumbnails-c .sponsored,
- .thumbnails-c .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .thumbnails-c .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #444444;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-c .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-c .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-c .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-c .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-c .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-c div.videoCube:hover,
- .thumbnails-c div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-c .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-c div.sponsored-default:hover,
- .thumbnails-c div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-c .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-c .videoCube:hover .thumbnail-overlay,
- .thumbnails-c .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-c .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-c .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-c div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-c .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-c .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-c .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-c .trc_pager_prev:hover,
- .thumbnails-c .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-c .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-c .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-c div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-c .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-c .video-label-box {
- text-align: left;
- }
-
- .thumbnails-c .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-c .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-c .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-c {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-c .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-c .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-c .trc_pager_prev,
- .thumbnails-c .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-c .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-c .playerCube:hover .thumbnail-overlay,
- .thumbnails-c .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-c .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-c .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-c .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-c .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-c .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-c .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-c .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-c .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-c .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-c .playerCube div.videoCube:hover,
- .thumbnails-c div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-c .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-c div.syndicatedItem:hover,
- .thumbnails-c div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-c div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-c .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-c .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-c .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-c .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-c .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-c .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-c .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-c .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-c .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-d .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-d .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-d .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-d .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-d .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-d .video-label,
- .thumbnails-d .sponsored,
- .thumbnails-d .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-d .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-d .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-d .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-d .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-d .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-d .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-d div.videoCube:hover,
- .thumbnails-d div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-d div.sponsored-default:hover,
- .thumbnails-d div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-d .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d .videoCube:hover .thumbnail-overlay,
- .thumbnails-d .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-d .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-d .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-d div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-d .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-d .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-d .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-d .trc_pager_prev:hover,
- .thumbnails-d .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-d .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-d .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-d div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-d .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-d .video-label-box {
- text-align: left;
- }
-
- .thumbnails-d .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-d .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-d .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-d {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-d .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-d .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-d .trc_pager_prev,
- .thumbnails-d .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-d .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d .playerCube:hover .thumbnail-overlay,
- .thumbnails-d .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-d .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-d .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-d .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-d .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-d .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-d .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-d .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-d .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-d .playerCube div.videoCube:hover,
- .thumbnails-d div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-d div.syndicatedItem:hover,
- .thumbnails-d div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-d .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-d .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-d .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-d .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-d .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-d .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-d .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-d-2 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-d-2 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-d-2 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-d-2 .video-label,
- .thumbnails-d-2 .sponsored,
- .thumbnails-d-2 .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-d-2 .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-d-2 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-d-2 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-d-2 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-d-2 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-d-2 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-d-2 div.videoCube:hover,
- .thumbnails-d-2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d-2 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-d-2 div.sponsored-default:hover,
- .thumbnails-d-2 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-d-2 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d-2 .videoCube:hover .thumbnail-overlay,
- .thumbnails-d-2 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-d-2 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-d-2 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-d-2 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-d-2 .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-d-2 .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-d-2 .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-d-2 .trc_pager_prev:hover,
- .thumbnails-d-2 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-d-2 .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-d-2 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-d-2 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-d-2 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-d-2 .video-label-box {
- text-align: left;
- }
-
- .thumbnails-d-2 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-d-2 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-d-2 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-d-2 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-d-2 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-d-2 .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-d-2 .trc_pager_prev,
- .thumbnails-d-2 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-d-2 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d-2 .playerCube:hover .thumbnail-overlay,
- .thumbnails-d-2 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-d-2 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-d-2 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-d-2 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-d-2 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-d-2 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-d-2 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-d-2 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-d-2 .playerCube div.videoCube:hover,
- .thumbnails-d-2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d-2 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-d-2 div.syndicatedItem:hover,
- .thumbnails-d-2 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-d-2 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-d-2 .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-d-2 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-d-2 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-d-2 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-e .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- max-height: 88.0px;
- *height: 88.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-e .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-e .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-e .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-e .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-e .video-label,
- .thumbnails-e .sponsored,
- .thumbnails-e .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-e .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-e .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-e .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-e .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-e .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-e .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-e div.videoCube:hover,
- .thumbnails-e div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-e .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-e div.sponsored-default:hover,
- .thumbnails-e div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-e .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-e .videoCube:hover .thumbnail-overlay,
- .thumbnails-e .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-e .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-e .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-e div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-e .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-e .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-e .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-e .trc_pager_prev:hover,
- .thumbnails-e .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-e .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-e .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-e div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-e .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-e .video-label-box {
- text-align: left;
- }
-
- .thumbnails-e .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-e .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-e .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-e {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-e .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-e .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-e .trc_pager_prev,
- .thumbnails-e .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-e .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-e .playerCube:hover .thumbnail-overlay,
- .thumbnails-e .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-e .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-e .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-e .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-e .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-e .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-e .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-e .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-e .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-e .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-e .playerCube div.videoCube:hover,
- .thumbnails-e div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-e .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-e div.syndicatedItem:hover,
- .thumbnails-e div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-e div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-e .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-e .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-e .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-e .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-e .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-title {
- max-height: 66.0px;
- *height: 66.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 22.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-e .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-e .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-e .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-e .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-f-abp .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- max-height: 57.0px;
- *height: 57.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-f-abp .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-f-abp .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-f-abp .video-label,
- .thumbnails-f-abp .sponsored,
- .thumbnails-f-abp .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-f-abp .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-f-abp .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-f-abp .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-f-abp .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-f-abp .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-f-abp .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-f-abp div.videoCube:hover,
- .thumbnails-f-abp div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-f-abp .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-f-abp div.sponsored-default:hover,
- .thumbnails-f-abp div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-f-abp .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-f-abp .videoCube:hover .thumbnail-overlay,
- .thumbnails-f-abp .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-f-abp .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-f-abp .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-f-abp div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-f-abp .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-f-abp .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-f-abp .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-f-abp .trc_pager_prev:hover,
- .thumbnails-f-abp .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-f-abp .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-f-abp .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-f-abp div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-f-abp .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-f-abp .video-label-box {
- text-align: left;
- }
-
- .thumbnails-f-abp .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-f-abp .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-f-abp .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-f-abp {
- width: 300px;
- _width: 300px;
- border-width: 1px 0px 1px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 8px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-f-abp .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-f-abp .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-f-abp .trc_pager_prev,
- .thumbnails-f-abp .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-f-abp .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-f-abp .playerCube:hover .thumbnail-overlay,
- .thumbnails-f-abp .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-f-abp .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-f-abp .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-f-abp .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-f-abp .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-f-abp .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-f-abp .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-f-abp .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-f-abp .playerCube div.videoCube:hover,
- .thumbnails-f-abp div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-f-abp .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-f-abp div.syndicatedItem:hover,
- .thumbnails-f-abp div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-f-abp div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-f-abp .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-title {
- max-height: 38.0px;
- *height: 38.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-f-abp .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-f-abp .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-f-abp .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-g .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 16.0px;
- line-height: 19.0px;
- font-weight: 800;
- max-height: 59.0px;
- *height: 59.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-g .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-g .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-g .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-g .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-g .video-label,
- .thumbnails-g .sponsored,
- .thumbnails-g .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-g .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-g .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-g .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-g .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .video-uploader {
- font-size: 11px;
- font-weight: bold;
- text-decoration: none;
- color: #000;
- }
-
- .thumbnails-g .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-g .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-g .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-g div.videoCube:hover,
- .thumbnails-g div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-g .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-g div.sponsored-default:hover,
- .thumbnails-g div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-g .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-g .videoCube:hover .thumbnail-overlay,
- .thumbnails-g .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-g .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-g .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-g div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-g .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-g .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-g .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-g .trc_pager_prev:hover,
- .thumbnails-g .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-g .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-g .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-g div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-g .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-g .video-label-box {
- text-align: left;
- }
-
- .thumbnails-g .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-g .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-g .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-g {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-g .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-g .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-g .trc_pager_prev,
- .thumbnails-g .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-g .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-g .playerCube:hover .thumbnail-overlay,
- .thumbnails-g .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-g .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-g .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-g .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-g .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-g .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-g .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-g .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-g .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-g .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-g .playerCube div.videoCube:hover,
- .thumbnails-g div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-g .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-g div.syndicatedItem:hover,
- .thumbnails-g div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-g div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-g .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-g .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-g .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-g .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-g .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 16.0px;
- line-height: 19.0px;
- font-weight: 800;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-g .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-uploader {
- color: #000;
- font-size: 11px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-g .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-g .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-g .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-h .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-h .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-h .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-h .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-h .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-h .video-label,
- .thumbnails-h .sponsored,
- .thumbnails-h .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .thumbnails-h .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-h .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-h .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-h .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-h .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-h .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-h div.videoCube:hover,
- .thumbnails-h div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-h .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-h div.sponsored-default:hover,
- .thumbnails-h div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-h .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-h .videoCube:hover .thumbnail-overlay,
- .thumbnails-h .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-h .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-h .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-h div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-h .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-h .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-h .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-h .trc_pager_prev:hover,
- .thumbnails-h .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-h .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-h .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-h div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-h .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-h .video-label-box {
- text-align: left;
- }
-
- .thumbnails-h .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-h .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-h .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-h {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-h .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-h .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-h .trc_pager_prev,
- .thumbnails-h .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-h .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-h .playerCube:hover .thumbnail-overlay,
- .thumbnails-h .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-h .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-h .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-h .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-h .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-h .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-h .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-h .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-h .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-h .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-h .playerCube div.videoCube:hover,
- .thumbnails-h div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-h .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-h div.syndicatedItem:hover,
- .thumbnails-h div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-h div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-h .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-h .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-h .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-h .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-h .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-h .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-h .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-h .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-h .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .thumbnails-i .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- max-height: 76.0px;
- *height: 76.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-i .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-i .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-i .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-i .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-i .video-label,
- .thumbnails-i .sponsored,
- .thumbnails-i .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .thumbnails-i .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-i .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-i .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-i .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-i .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-i .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-i div.videoCube:hover,
- .thumbnails-i div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-i .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-i div.sponsored-default:hover,
- .thumbnails-i div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-i .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-i .videoCube:hover .thumbnail-overlay,
- .thumbnails-i .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-i .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-i .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-i div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-i .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-i .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-i .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-i .trc_pager_prev:hover,
- .thumbnails-i .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-i .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-i .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-i div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-i .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-i .video-label-box {
- text-align: left;
- }
-
- .thumbnails-i .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-i .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-i .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-i {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-i .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-i .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-i .trc_pager_prev,
- .thumbnails-i .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-i .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-i .playerCube:hover .thumbnail-overlay,
- .thumbnails-i .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-i .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-i .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-i .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-i .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-i .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-i .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-i .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-i .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-i .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-i .playerCube div.videoCube:hover,
- .thumbnails-i div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-i .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-i div.syndicatedItem:hover,
- .thumbnails-i div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-i div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-i .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-i .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-i .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-i .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-i .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-title {
- max-height: 57.0px;
- *height: 57.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 14.0px;
- line-height: 19.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-i .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-i .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-i .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-i .videoCube.thumbnail_start .thumbBlock_holder {
- width: 26%;
- _width: 26%;
- }
-
- .thumbnails-j .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 19.0px;
- font-weight: 800;
- max-height: 57.0px;
- *height: 57.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-j .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-j .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-j .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-j .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-j .video-label,
- .thumbnails-j .sponsored,
- .thumbnails-j .sponsored-url {
- font-family: 'Fira Sans', Helvetica, Arial;
- }
-
- .thumbnails-j .trc_rbox_header {
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 20.0px;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0 0 6px 0;
- }
-
- .thumbnails-j .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-j .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-j .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-j .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-j .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-j div.videoCube:hover,
- .thumbnails-j div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-j .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-j div.sponsored-default:hover,
- .thumbnails-j div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-j .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-j .videoCube:hover .thumbnail-overlay,
- .thumbnails-j .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-j .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-j .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-j div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-j .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-j .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-j .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-j .trc_pager_prev:hover,
- .thumbnails-j .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-j .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-j .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-j div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-j .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-j .video-label-box {
- text-align: left;
- }
-
- .thumbnails-j .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-j .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-j .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-j {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-j .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-j .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-j .trc_pager_prev,
- .thumbnails-j .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-j .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-j .playerCube:hover .thumbnail-overlay,
- .thumbnails-j .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-j .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-j .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-j .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-j .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-j .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-j .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-j .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-j .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-j .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-j .playerCube div.videoCube:hover,
- .thumbnails-j div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-j .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-j div.syndicatedItem:hover,
- .thumbnails-j div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-j div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-j .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-j .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-j .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-j .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-j .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-title {
- max-height: 38.0px;
- *height: 38.0px;
- color: #000000;
- font-family: 'Fira Sans', Helvetica, Arial;
- font-size: 17.0px;
- line-height: 19.0px;
- font-weight: 800;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-j .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-j .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Fira Sans', Helvetica, Arial;
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-j .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-j .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-k .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- max-height: 69.0px;
- *height: 69.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-k .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-k .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-k .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-k .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-k .video-label,
- .thumbnails-k .sponsored,
- .thumbnails-k .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .thumbnails-k .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-k .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-k .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-k .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-k .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-k .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-k div.videoCube:hover,
- .thumbnails-k div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-k .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-k div.sponsored-default:hover,
- .thumbnails-k div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-k .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-k .videoCube:hover .thumbnail-overlay,
- .thumbnails-k .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-k .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-k .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-k div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-k .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-k .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-k .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-k .trc_pager_prev:hover,
- .thumbnails-k .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-k .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-k .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-k div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-k .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-k .video-label-box {
- text-align: left;
- }
-
- .thumbnails-k .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-k .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-k .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-k {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-k .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-k .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-k .trc_pager_prev,
- .thumbnails-k .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-k .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-k .playerCube:hover .thumbnail-overlay,
- .thumbnails-k .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-k .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-k .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-k .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-k .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-k .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-k .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-k .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-k .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-k .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-k .playerCube div.videoCube:hover,
- .thumbnails-k div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-k .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-k div.syndicatedItem:hover,
- .thumbnails-k div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-k div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-k .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-k .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-k .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-k .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-k .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-title {
- max-height: 46.0px;
- *height: 46.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 17.0px;
- line-height: 23.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-k .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-k .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-k .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-k .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .thumbnails-rr .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .thumbnails-rr .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-rr .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-rr .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-rr .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-rr .video-label,
- .thumbnails-rr .sponsored,
- .thumbnails-rr .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .thumbnails-rr .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #444444;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-rr .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-rr .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-rr .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-rr .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-rr .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-rr div.videoCube:hover,
- .thumbnails-rr div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-rr div.sponsored-default:hover,
- .thumbnails-rr div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-rr .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr .videoCube:hover .thumbnail-overlay,
- .thumbnails-rr .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-rr .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-rr .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-rr .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-rr .trc_pager_prev:hover,
- .thumbnails-rr .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-rr .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-rr div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-rr .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-rr .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-rr .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-rr {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-rr .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr .trc_pager_prev,
- .thumbnails-rr .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-rr .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr .playerCube:hover .thumbnail-overlay,
- .thumbnails-rr .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-rr .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-rr .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-rr .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-rr .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-rr .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-rr .playerCube div.videoCube:hover,
- .thumbnails-rr div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-rr div.syndicatedItem:hover,
- .thumbnails-rr div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-rr .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-rr .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-rr .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-rr .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-rr .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-rr2 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- max-height: 80.0px;
- *height: 80.0px;
- color: #333;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-rr2 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-rr2 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-rr2 .video-label,
- .thumbnails-rr2 .sponsored,
- .thumbnails-rr2 .sponsored-url {
- font-family: 'Open Sans';
- }
-
- .thumbnails-rr2 .trc_rbox_header {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #444444;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-rr2 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-rr2 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-rr2 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-rr2 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-rr2 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-rr2 div.videoCube:hover,
- .thumbnails-rr2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr2 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-rr2 div.sponsored-default:hover,
- .thumbnails-rr2 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-rr2 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr2 .videoCube:hover .thumbnail-overlay,
- .thumbnails-rr2 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr2 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-rr2 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr2 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr2 .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-rr2 .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-rr2 .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-rr2 .trc_pager_prev:hover,
- .thumbnails-rr2 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr2 .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-rr2 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-rr2 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr2 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-rr2 .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr2 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-rr2 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-rr2 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-rr2 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-rr2 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr2 .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr2 .trc_pager_prev,
- .thumbnails-rr2 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-rr2 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr2 .playerCube:hover .thumbnail-overlay,
- .thumbnails-rr2 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr2 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-rr2 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-rr2 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-rr2 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr2 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-rr2 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr2 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-rr2 .playerCube div.videoCube:hover,
- .thumbnails-rr2 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr2 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-rr2 div.syndicatedItem:hover,
- .thumbnails-rr2 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr2 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-rr2 .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-title {
- max-height: 60.0px;
- *height: 60.0px;
- color: #333;
- font-family: 'Open Sans';
- font-size: 15.0px;
- line-height: 20.0px;
- font-weight: bold;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr2 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: bold;
- text-decoration: none;
- font-family: 'Open Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-rr2 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-rr2 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 40%;
- _width: 40%;
- }
-
- .thumbnails-rr3 .video-title {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 13.0px;
- line-height: 18.0px;
- font-weight: normal;
- max-height: 54.0px;
- *height: 54.0px;
- color: #000000;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .trc_rbox_div {
- width: auto;
- _width: 99%;
- height: 410px;
- border-width: 0;
- padding: 0;
- }
-
- .thumbnails-rr3 .videoCube .video-duration {
- left: 36px;
- display: none;
- }
-
- .thumbnails-rr3 .videoCube .video-label-box {
- margin-left: 0;
- margin-right: 0px;
- }
-
- .thumbnails-rr3 .video-label,
- .thumbnails-rr3 .sponsored,
- .thumbnails-rr3 .sponsored-url {
- font-family: 'Fira Sans';
- }
-
- .thumbnails-rr3 .trc_rbox_header {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 100%;
- font-weight: bold;
- text-decoration: none;
- color: #000000;
- border-width: 0;
- background: transparent;
- border-style: none;
- border-color: #D6D5D3;
- padding: 0;
- }
-
- .thumbnails-rr3 .sponsored-url {
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- color: green;
- }
-
- .thumbnails-rr3 .sponsored {
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- color: #9C9A9C;
- }
-
- .thumbnails-rr3 .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .sponsored-default .video-title {
- max-height: 2.58em;
- *height: 2.58em;
- }
-
- .thumbnails-rr3 .sponsored-default .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- }
-
- .thumbnails-rr3 .videoCube {
- width: auto;
- _width: auto;
- background-color: transparent;
- border-width: 1px;
- border-color: #D6D5D3;
- padding: 0;
- height: auto;
- margin-left: 0px;
- margin-top: 0px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- }
-
- .thumbnails-rr3 div.videoCube:hover,
- .thumbnails-rr3 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr3 .sponsored-default {
- background-color: #F7F6C6;
- }
-
- .thumbnails-rr3 div.sponsored-default:hover,
- .thumbnails-rr3 div.sponsored-default.videoCube_hover {
- background-color: inherit;
- }
-
- .thumbnails-rr3 .videoCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr3 .videoCube:hover .thumbnail-overlay,
- .thumbnails-rr3 .videoCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr3 .trc_rbox_border_elm {
- border-color: darkgray;
- }
-
- .thumbnails-rr3 .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr3 div.videoCube:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr3 .pager_enabled {
- color: #0056b3;
- }
-
- .thumbnails-rr3 .trc_pager_counter {
- color: #000000;
- }
-
- .thumbnails-rr3 .pager_disabled {
- color: #7d898f;
- }
-
- .thumbnails-rr3 .trc_pager_prev:hover,
- .thumbnails-rr3 .trc_pager_next:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr3 .trc_pager_selected {
- color: #0056b3;
- }
-
- .thumbnails-rr3 .trc_pager_unselected {
- color: #7d898f;
- }
-
- .thumbnails-rr3 div.trc_pager_pages div:hover {
- color: #6497ED;
- }
-
- .thumbnails-rr3 .trc_lightbox_overlay {
- background-color: #000000;
- opacity: 0.70;
- filter: alpha(opacity=70);
- }
-
- .thumbnails-rr3 .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr3 .trc_sponsored_overlay {
- background-color: black;
- }
-
- .thumbnails-rr3 .thumbnail-emblem {
- background-position: 5% 5%;
- }
-
- .thumbnails-rr3 .videoCube .sponsored {
- margin-top: -7px;
- }
-
- .thumbnails-rr3 {
- width: 300px;
- _width: 300px;
- border-width: 0px 0px 0px 0px;
- border-style: solid solid solid solid;
- border-color: #DFDFDF;
- padding: 0px 0px 0px 0px;
- border-radius: 0;
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- box-shadow: none;
- }
-
- .thumbnails-rr3 .videoCube.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr3 .videoCube.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr3 .trc_pager_prev,
- .thumbnails-rr3 .trc_pager_next {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .trc_pager_pages div {
- font-size: 12px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .trc_pager div {
- font-family: serif;
- }
-
- .thumbnails-rr3 .playerCube .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr3 .playerCube:hover .thumbnail-overlay,
- .thumbnails-rr3 .playerCube_hover .thumbnail-overlay {
- background-image: null;
- }
-
- .thumbnails-rr3 .playerCube .videoCube {
- background-color: transparent;
- border-color: #D6D5D3;
- border-width: 1px;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- margin-left: 0px;
- margin-top: 0px;
- padding: 3px;
- }
-
- .thumbnails-rr3 .playerCube .videoCube.horizontal {
- border-style: none none none none;
- }
-
- .thumbnails-rr3 .playerCube .videoCube .video-label-box {
- margin-left: 81px;
- margin-right: 0px;
- }
-
- .thumbnails-rr3 .playerCube .video-duration-detail {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-external-data {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-label-box {
- text-align: left;
- }
-
- .thumbnails-rr3 .playerCube .video-published-date {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-category {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-description {
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- line-height: 11px;
- font-weight: normal;
- text-decoration: none;
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .videoCube .video-duration {
- display: block;
- left: 36px;
- }
-
- .thumbnails-rr3 .playerCube .videoCube .thumbBlock {
- border-width: 0px;
- border-color: darkgray;
- }
-
- .thumbnails-rr3 .playerCube .video-rating {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-uploader {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-views {
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube .video-title {
- font-family: Arial, Helvetica, sans-serif;
- text-decoration: none;
- font-size: 14px;
- line-height: 17.5px;
- font-weight: bold;
- max-height: 2.58em;
- *height: 2.58em;
- color: black;
- }
-
- .thumbnails-rr3 .playerCube div.videoCube:hover,
- .thumbnails-rr3 div.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr3 .whatsThisSyndicated {
- font-family: Arial, Verdana, sans-serif;
- font-size: 9px;
- font-weight: normal;
- color: black;
- text-decoration: none;
- padding: 0;
- }
-
- .thumbnails-rr3 div.syndicatedItem:hover,
- .thumbnails-rr3 div.syndicatedItem.videoCube_hover {
- background-color: transparent;
- }
-
- .thumbnails-rr3 div.syndicatedItem:hover .thumbBlock {
- border-color: inherit;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem {
- background-color: transparent;
- border-color: #D6D5D3;
- border-radius: 0px;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-width: 1px;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem.horizontal {
- border-style: none;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .thumbBlock {
- border-color: darkgray;
- border-width: 0px;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .thumbnail-overlay {
- background-image: null;
- background-position: 5% 5%;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem.vertical {
- border-style: solid none none none;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .video-duration {
- display: none;
- left: 36px;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .video-label-box {
- margin-left: 0px;
- }
-
- .thumbnails-rr3 .syndicatedItem {
- background-color: transparent;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-description {
- max-height: 2.2em;
- *height: 2.2em;
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-size: 10px;
- font-weight: normal;
- line-height: 11px;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-title {
- max-height: 36.0px;
- *height: 36.0px;
- color: #000000;
- font-family: 'Fira Sans';
- font-size: 13.0px;
- line-height: 18.0px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .sponsored {
- color: #9C9A9C;
- font-size: 9px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .sponsored-url {
- color: green;
- font-size: 9px;
- font-weight: bold;
- text-decoration: underline;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-category {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-duration-detail {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-external-data {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-published-date {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-rating {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-uploader {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .video-views {
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- }
-
- .thumbnails-rr3 .syndicatedItem .branding {
- color: #999999;
- font-size: 11.0px;
- font-weight: normal;
- text-decoration: none;
- font-family: 'Fira Sans';
- background-image: null;
- text-align: left;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .thumbBlock .branding {
- text-align: left;
- background-color: transparent;
- display: none;
- left: 0px;
- color: black;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- background-image: null;
- }
-
- .thumbnails-rr3 .videoCube.syndicatedItem .thumbBlock .static-text {
- text-align: left;
- background-color: black;
- display: none;
- color: white;
- font-size: 10px;
- font-weight: normal;
- text-decoration: none;
- font-family: Arial, Helvetica, sans-serif;
- }
-
- .thumbnails-rr3 .videoCube.thumbnail_start .thumbBlock_holder {
- width: 34%;
- _width: 34%;
- }
-
- .thumbnails-h .trc_rbox_outer .videoCube {
- margin-bottom: 20px!important;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_ab_thumbnails-d_3x3_size-round-10 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube a {
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_ab_thumbnails-d_3x3_size-round-10 .video-label-box {
- height: 88.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .video-label-box .branding {
- display: block;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube a {
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-label-box {
- height: 88.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .video-label-box .branding {
- display: block;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-10-factor .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_ab_thumbnails-d_3x3_size-round-20 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube a {
- padding: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_ab_thumbnails-d_3x3_size-round-20 .video-label-box {
- height: 88.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .video-label-box .branding {
- display: block;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_ab_thumbnails-d_3x3_size-round-20 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-a_abp-mode img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-a_abp-mode [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .ab_thumbnails-a_abp-mode .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-a_abp-mode .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-a_abp-mode .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-a_abp-mode .video-label-box {
- height: 80.0px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-a_abp-mode .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-a_abp-mode .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-a_abp-mode .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .ab_thumbnails-a_abp-mode .trc_header_left_column {
- width: 48%;
- display: inline-block;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-a_abp-mode [class*=span] {
- float: none;
- }
-
- .ab_thumbnails-a_abp-mode [class*=span] {
- margin-left: 0;
- }
-
- .ab_thumbnails-a_abp-mode .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .ab_thumbnails-d-2_row img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d-2_row [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-d-2_row .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d-2_row .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d-2_row .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d-2_row .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d-2_row .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d-2_row .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d-2_row .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d-2_row .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d-2_row .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d-2_row .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d-2_row .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d-2_row .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_3x3 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_3x3 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-d_3x3 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_3x3 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_3x3 .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_3x3 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_3x3 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_3x3 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_3x3 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_3x3 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_3x3 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_3x3-bigger-titles [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_3x3-bigger-titles .video-label-box {
- height: 96.0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .syndicatedItem .branding {
- line-height: 24.0px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_3x3-bigger-titles .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_abp-mode img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_abp-mode [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-d_abp-mode .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_abp-mode .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_abp-mode .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_abp-mode .video-label-box {
- height: 66.0px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_abp-mode .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_abp-mode .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_abp-mode .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_abp-mode .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_abp-mode .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_gb-read-more img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_gb-read-more [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/05309722c1e32f9dbeddcbd010e1ea7f.png) no-repeat;
- height: 33px;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 33px;
- }
-
- .ab_thumbnails-d_gb-read-more .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_gb-read-more .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_gb-read-more .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_gb-read-more .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_gb-read-more .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_gb-read-more .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_gb-read-more .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_gb-read-more .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .tbl-read-more-box .tbl-read-more-btn {
- background-color: #EEEEEE!important;
- border-color: #ec1a2e !important;
- color: #222222 !important;
- font-weight: bold;
- font-size: 20px !important;
- text-transform: uppercase;
- font-family: 'Fira Sans', Helvetica, Arial !important;
- }
-
- .ab_thumbnails-d_row-read-more img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_row-read-more [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-d_row-read-more .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_row-read-more .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_row-read-more .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_row-read-more .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_row-read-more .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_row-read-more .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_row-read-more .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_row-read-more .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_row-read-more .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_size-round-10 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_size-round-10 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/05309722c1e32f9dbeddcbd010e1ea7f.png) no-repeat;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-10 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_size-round-10 .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_size-round-10 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-10 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_size-round-10 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-10 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_size-round-10-factor [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/05309722c1e32f9dbeddcbd010e1ea7f.png) no-repeat;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_size-round-10-factor .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_size-round-10-factor .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-10-factor .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_size-round-10-factor .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-10-factor .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-d_size-round-20 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-d_size-round-20 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/05309722c1e32f9dbeddcbd010e1ea7f.png) no-repeat;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 33px;
- }
-
- .ab_thumbnails-d_size-round-20 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-20 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-d_size-round-20 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-d_size-round-20 .video-label-box {
- height: 88.0px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-d_size-round-20 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-d_size-round-20 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-d_size-round-20 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 33px;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-d_size-round-20 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-h_1x3-landscape [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-h_1x3-landscape .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x3-landscape .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-h_1x3-landscape .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-h_1x3-landscape .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x3-landscape .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-h_1x3-landscape .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x3-landscape .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-h_1x5 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-h_1x5 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_div {
- margin-bottom: 0;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-h_1x5 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x5 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-h_1x5 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_outer .videoCube {
- margin-bottom: 10px;
- }
-
- .ab_thumbnails-h_1x5 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-h_1x5 .video-label-box {
- height: 76.0px;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin-bottom: 0;
- }
-
- .ab_thumbnails-h_1x5 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x5 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-h_1x5 .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-h_1x5 .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x5 .videoCube .video-label-box {
- margin-top: 0px;
- }
-
- .ab_thumbnails-h_1x5 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-h_1x5-landscape [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-h_1x5-landscape .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x5-landscape .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-h_1x5-landscape .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-h_1x5-landscape .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_1x5-landscape .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-h_1x5-landscape .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_1x5-landscape .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-h_abp-mode img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-h_abp-mode [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_div {
- margin-bottom: 0;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-h_abp-mode .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_abp-mode .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_outer .videoCube {
- margin-bottom: 10px;
- }
-
- .ab_thumbnails-h_abp-mode .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-h_abp-mode .video-label-box {
- height: 76.0px;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin-bottom: 0;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-h_abp-mode .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-h_abp-mode .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-h_abp-mode .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-h_abp-mode .videoCube .video-label-box {
- margin-top: 0px;
- }
-
- .ab_thumbnails-h_abp-mode .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-i_1x5 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-i_1x5 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_div {
- margin-bottom: 0;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-i_1x5 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-i_1x5 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-i_1x5 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_outer .videoCube {
- margin-bottom: 10px;
- }
-
- .ab_thumbnails-i_1x5 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-i_1x5 .video-label-box {
- height: 76.0px;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin-bottom: 0;
- }
-
- .ab_thumbnails-i_1x5 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-i_1x5 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-i_1x5 .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-i_1x5 .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-i_1x5 .videoCube .video-label-box {
- margin-top: 0px;
- }
-
- .ab_thumbnails-i_1x5 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-k_abp-mode img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-k_abp-mode [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-k_abp-mode .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_abp-mode .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-k_abp-mode .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-k_abp-mode .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-k_abp-mode .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_abp-mode .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-k_abp-mode .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-k_abp-mode .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_abp-mode .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-k_backup img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-k_backup [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-k_backup .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_backup .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-k_backup .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-k_backup .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-k_backup .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-k_backup .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-k_backup .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-k_backup .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_backup .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-k_backup .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-k_backup .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_backup .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-k_size-round-10 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-k_size-round-10 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-10 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-k_size-round-10 .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-k_size-round-10 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-10 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-k_size-round-10 .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-10 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-k_size-round-10-factor [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-k_size-round-10-factor .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-k_size-round-10-factor .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-10-factor .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-k_size-round-10-factor .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-10-factor .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-k_size-round-20 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-k_size-round-20 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .ab_thumbnails-k_size-round-20 .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-20 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-k_size-round-20 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-k_size-round-20 .video-label-box {
- height: 69.0px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-k_size-round-20 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-k_size-round-20 .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-k_size-round-20 .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-k_size-round-20 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .ab_thumbnails-rr_abp-mode img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .ab_thumbnails-rr_abp-mode [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .ab_thumbnails-rr_abp-mode .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-rr_abp-mode .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube a {
- padding: 0;
- }
-
- .ab_thumbnails-rr_abp-mode .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .ab_thumbnails-rr_abp-mode .video-label-box {
- height: 80.0px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .ab_thumbnails-rr_abp-mode .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .ab_thumbnails-rr_abp-mode .video-label-box .branding {
- display: block;
- }
-
- .ab_thumbnails-rr_abp-mode .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_header_left_column {
- width: 48%;
- display: inline-block;
- background: transparent;
- height: auto;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .ab_thumbnails-rr_abp-mode [class*=span] {
- float: none;
- }
-
- .ab_thumbnails-rr_abp-mode [class*=span] {
- margin-left: 0;
- }
-
- .ab_thumbnails-rr_abp-mode .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .alternating-thumbnails-a img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .alternating-thumbnails-a [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .alternating-thumbnails-a {
- background-color: #E6E5E1;
- }
-
- .alternating-thumbnails-a .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/89c73d279107ecb611aaf1272968c2c3.jpg) no-repeat;
- height: 21px;
- background-color: #fff;
- }
-
- .alternating-thumbnails-a .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 21px;
- }
-
- .alternating-thumbnails-a .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 21px;
- }
-
- .alternating-thumbnails-a .logoDiv a {
- font-size: 100%;
- }
-
- .alternating-thumbnails-a .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .alternating-thumbnails-a .videoCube a {
- padding: 0;
- }
-
- .alternating-thumbnails-a .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .alternating-thumbnails-a .video-label-box {
- height: 76.0px;
- }
-
- .alternating-thumbnails-a .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .alternating-thumbnails-a .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .alternating-thumbnails-a .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .alternating-thumbnails-a .video-label-box .branding {
- display: block;
- }
-
- .alternating-thumbnails-a .syndicatedItem .branding {
- line-height: 19.0px;
- }
-
- .alternating-thumbnails-a .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 21px;
- }
-
- .alternating-thumbnails-a .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .alternating-thumbnails-a .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .alternating-thumbnails-b img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .alternating-thumbnails-b [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .alternating-thumbnails-b .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/b2ddfe997f5b03be3a198485dff6a117.jpg) no-repeat;
- height: 21px;
- }
-
- .alternating-thumbnails-b .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 21px;
- }
-
- .alternating-thumbnails-b .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 21px;
- }
-
- .alternating-thumbnails-b .logoDiv a {
- font-size: 100%;
- }
-
- .alternating-thumbnails-b .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .alternating-thumbnails-b .videoCube a {
- padding: 0;
- }
-
- .alternating-thumbnails-b .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .alternating-thumbnails-b .video-label-box {
- height: 76.0px;
- }
-
- .alternating-thumbnails-b .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .alternating-thumbnails-b .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .alternating-thumbnails-b .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .alternating-thumbnails-b .video-label-box .branding {
- display: block;
- }
-
- .alternating-thumbnails-b .syndicatedItem .branding {
- line-height: 19.0px;
- }
-
- .alternating-thumbnails-b .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 21px;
- }
-
- .alternating-thumbnails-b .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .alternating-thumbnails-b [class*=span] {
- float: none;
- }
-
- .alternating-thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .alternating-thumbnails-b .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .alternating-thumbnails-b [class*=span] {
- float: none;
- }
-
- .alternating-thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .alternating-thumbnails-b [class*=span] {
- float: none;
- }
-
- .alternating-thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .alternating-thumbnails-b [class*=span] {
- float: none;
- }
-
- .alternating-thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .mobile-thumbnails-a img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .mobile-thumbnails-a [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .mobile-thumbnails-a .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .mobile-thumbnails-a .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .mobile-thumbnails-a .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .mobile-thumbnails-a .logoDiv a {
- font-size: 100%;
- }
-
- .mobile-thumbnails-a .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .mobile-thumbnails-a .videoCube a {
- padding: 0;
- }
-
- .mobile-thumbnails-a .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .mobile-thumbnails-a .video-label-box {
- height: 88.0px;
- }
-
- .mobile-thumbnails-a .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .mobile-thumbnails-a .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .mobile-thumbnails-a .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .mobile-thumbnails-a .video-label-box .branding {
- display: block;
- }
-
- .mobile-thumbnails-a .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .mobile-thumbnails-a .trc_header_left_column {
- width: 48%;
- display: inline-block;
- background: transparent;
- height: auto;
- }
-
- .mobile-thumbnails-a .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .mobile-thumbnails-a [class*=span] {
- float: none;
- }
-
- .mobile-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .mobile-thumbnails-a .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .mobile-thumbnails-a [class*=span] {
- float: none;
- }
-
- .mobile-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .mobile-thumbnails-a [class*=span] {
- float: none;
- }
-
- .mobile-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .mobile-thumbnails-a [class*=span] {
- float: none;
- }
-
- .mobile-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-a img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .organic-thumbnails-a .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .organic-thumbnails-a .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-a .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .organic-thumbnails-a .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-a .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-a .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-a .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-a .video-label-box {
- height: 80.0px;
- }
-
- .organic-thumbnails-a .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-a .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .organic-thumbnails-a .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .organic-thumbnails-a .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-a .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .organic-thumbnails-a .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-a .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-a .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-a [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-b img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-b [class*=span] {
- float: none;
- margin-left: 0px;
- }
-
- .organic-thumbnails-b {
- margin-left: 10px;
- margin-top: 10px;
- }
-
- .organic-thumbnails-b .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: none;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .organic-thumbnails-b .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .organic-thumbnails-b .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .organic-thumbnails-b .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-b .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-b .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-b .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-b .video-label-box {
- height: 88.0px;
- }
-
- .organic-thumbnails-b .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-b .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- padding: 0 0 1px 0;
- }
-
- .organic-thumbnails-b .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- color: #8c4074;
- }
-
- .organic-thumbnails-b .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-b .syndicatedItem .branding {
- line-height: 18.0px;
- }
-
- .organic-thumbnails-b .trc_header_left_column {
- background: transparent;
- height: auto;
- }
-
- .organic-thumbnails-b .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-b [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-b .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .organic-thumbnails-b .trc_rbox_div {
- overflow: visible;
- }
-
- .trc_elastic .organic-thumbnails-b {
- overflow: visible !important;
- }
-
- .organic-thumbnails-b .trc_rbox_outer .trc_rbox_div .labelText {
- position: absolute;
- top: -10px;
- left: 2%;
- padding: 3px 10px;
- margin-left: 0;
- color: #fff;
- font-weight: 800;
- z-index: 999;
- font-size: 12px;
- font-family: 'Open Sans', sans serif;
- line-height: 15px;
- text-transform: uppercase;
- background: #660046;
- }
-
- .trc_ie8 .organic-thumbnails-b .thumbBlock_holder,
- .trc_ie8 .organic-thumbnails-b .videoCube .thumbBlock,
- .trc_ie9 .organic-thumbnails-b .thumbBlock_holder,
- .trc_ie9 .organic-thumbnails-b .videoCube .thumbBlock {
- height: 146px;
- }
-
- .organic-thumbnails-d img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-d [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .organic-thumbnails-d .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/ed8d020f1859e413beba34e1dde6b3ee.png) no-repeat;
- height: 26px;
- }
-
- .organic-thumbnails-d .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 26px;
- }
-
- .organic-thumbnails-d .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 26px;
- }
-
- .organic-thumbnails-d .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-d .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-d .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-d .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-d .video-label-box {
- height: 88.0px;
- }
-
- .organic-thumbnails-d .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-d .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .organic-thumbnails-d .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .organic-thumbnails-d .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-d .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .organic-thumbnails-d .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 26px;
- }
-
- .organic-thumbnails-d .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-d .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .organic-thumbnails-d-2 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-d-2 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .organic-thumbnails-d-2 .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-d-2 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-d-2 .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-d-2 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-d-2 .video-label-box {
- height: 88.0px;
- }
-
- .organic-thumbnails-d-2 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-d-2 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .organic-thumbnails-d-2 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .organic-thumbnails-d-2 .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-d-2 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .organic-thumbnails-d-2 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-d-2 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .organic-thumbnails-e img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-e [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .organic-thumbnails-e .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .organic-thumbnails-e .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-e .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .organic-thumbnails-e .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-e .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-e .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-e .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-e .video-label-box {
- height: 88.0px;
- }
-
- .organic-thumbnails-e .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-e .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .organic-thumbnails-e .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .organic-thumbnails-e .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-e .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .organic-thumbnails-e .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-e .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-e .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .organic-thumbnails-mobile img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .organic-thumbnails-mobile [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .organic-thumbnails-mobile .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-mobile .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .organic-thumbnails-mobile .videoCube a {
- padding: 0;
- }
-
- .organic-thumbnails-mobile .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .organic-thumbnails-mobile .video-label-box {
- height: 88.0px;
- }
-
- .organic-thumbnails-mobile .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .organic-thumbnails-mobile .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .organic-thumbnails-mobile .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .organic-thumbnails-mobile .video-label-box .branding {
- display: block;
- }
-
- .organic-thumbnails-mobile .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .organic-thumbnails-mobile .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .organic-thumbnails-mobile [class*=span] {
- float: none;
- }
-
- .organic-thumbnails-mobile [class*=span] {
- margin-left: 0;
- }
-
- .organic-thumbnails-mobile .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
- /* override bootstrap default span definitions */
-
- .text-links-a [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .text-links-a .trc_rbox_header {
- line-height: 24px;
- position: relative;
- display: inline-block;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .text-links-a .trc_rbox_header .trc_rbox_header_span:after {
- content: ' ';
- display: block;
- background: #EC1A2E;
- height: 5px;
- width: 50px;
- margin-bottom: 18px;
- }
-
- .text-links-a .trc_rbox_header_span .trc_header_right_column {
- position: absolute;
- width: 48%;
- left: 52%;
- top: 0;
- background: transparent;
- height: auto;
- }
-
- .text-links-a .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- position: relative;
- z-index: 1;
- }
-
- .text-links-a .logoDiv a {
- font-size: 100%;
- }
-
- .text-links-a .logoDiv a span {
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .text-links-a .syndicatedItem .video-title .branding {
- line-height: 1.3em;
- }
-
- .text-links-a .trc_rbox_div .videoCube.horizontal {
- clear: left;
- }
-
- .text-links-a .trc_rbox_div .videoCube.trc_tl_right_col {
- float: none;
- clear: right;
- margin-left: auto;
- }
-
- .text-links-a .videoCube:hover span.branding,
- .text-links-a .videoCube_hover span.branding {
- text-decoration: none;
- }
-
- .text-links-a .trc_rbox_div .videoCube.thumbnail_none a {
- display: list-item;
- list-style: disc outside none;
- vertical-align: top;
- overflow: visible;
- margin-left: 25px;
- padding: 0;
- color: #EC1A2E;
- font-size: 25px;
- line-height: 20px;
- }
-
- .text-links-a .videoCube .video-label-box {
- display: inline-block!important;
- vertical-align: top;
- width: 100%;
- *margin-top: -3px;
- min-height: 22.0px;
- }
-
- .text-links-a .trc_rbox_div .videoCube:hover .video-title {
- text-decoration: none;
- color: #EC1A2E;
- }
-
- .text-links-a .trc_header_left_column {
- display: inline-block;
- width: auto;
- background: transparent;
- height: auto;
- }
-
- .text-links-a .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .text-links-a .syndicatedItem .branding {
- line-height: normal;
- }
-
- .text-links-a .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .thumbnails-a img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-a [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-a .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-a .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-a .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-a .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-a .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-a .videoCube a {
- padding: 0;
- }
-
- .thumbnails-a .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-a .video-label-box {
- height: 80.0px;
- }
-
- .thumbnails-a .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-a .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-a .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-a .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-a .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .thumbnails-a .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-a .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-a .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-a [class*=span] {
- float: none;
- }
-
- .thumbnails-a [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-b img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-b [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-b .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-b .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-b .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-b .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-b .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-b .videoCube a {
- padding: 0;
- }
-
- .thumbnails-b .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-b .video-label-box {
- height: 80.0px;
- }
-
- .thumbnails-b .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-b .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-b .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-b .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-b .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .thumbnails-b .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-b .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-b [class*=span] {
- float: none;
- }
-
- .thumbnails-b [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-b .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-c img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-c [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-c .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-c .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-c .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-c .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-c .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-c .videoCube a {
- padding: 0;
- }
-
- .thumbnails-c .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-c .video-label-box {
- height: 80.0px;
- }
-
- .thumbnails-c .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-c .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-c .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-c .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-c .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .thumbnails-c .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-c .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-c [class*=span] {
- float: none;
- }
-
- .thumbnails-c [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-c .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-d img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-d [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-d .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/05309722c1e32f9dbeddcbd010e1ea7f.png) no-repeat;
- height: 33px;
- }
-
- .thumbnails-d .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 33px;
- }
-
- .thumbnails-d .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 33px;
- }
-
- .thumbnails-d .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-d .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-d .videoCube a {
- padding: 0;
- }
-
- .thumbnails-d .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-d .video-label-box {
- height: 88.0px;
- }
-
- .thumbnails-d .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-d .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-d .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-d .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-d .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .thumbnails-d .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 33px;
- }
-
- .thumbnails-d .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-d .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-d-2 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-d-2 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-d-2 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-d-2 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-d-2 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-d-2 .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-d-2 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-d-2 .videoCube a {
- padding: 0;
- }
-
- .thumbnails-d-2 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-d-2 .video-label-box {
- height: 88.0px;
- }
-
- .thumbnails-d-2 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-d-2 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-d-2 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-d-2 .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-d-2 .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .thumbnails-d-2 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-d-2 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-d-2 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-e img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-e [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-e .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-e .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-e .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-e .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-e .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-e .videoCube a {
- padding: 0;
- }
-
- .thumbnails-e .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-e .video-label-box {
- height: 88.0px;
- }
-
- .thumbnails-e .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-e .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-e .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-e .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-e .syndicatedItem .branding {
- line-height: 22.0px;
- }
-
- .thumbnails-e .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-e .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-e .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-f-abp img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-f-abp [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-f-abp {
- background-color: #f9f9f9
- }
-
- .thumbnails-f-abp .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/91516fd3ede6940f91c3472c0a0841e5.png) no-repeat;
- height: 24px;
- }
-
- .thumbnails-f-abp .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 24px;
- }
-
- .thumbnails-f-abp .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 24px;
- }
-
- .thumbnails-f-abp .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-f-abp .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .trc_elastic .thumbnails-f-abp .trc_rbox_outer .trc_rbox_div .videoCube {
- margin-bottom: 0;
- }
-
- .thumbnails-f-abp .videoCube a {
- padding: 0;
- }
-
- .thumbnails-f-abp .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-f-abp .video-label-box {
- height: 57.0px;
- }
-
- .thumbnails-f-abp .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-f-abp .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-f-abp .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-f-abp .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-f-abp .syndicatedItem .branding {
- line-height: 19.0px;
- }
-
- .thumbnails-f-abp .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 24px;
- }
-
- .thumbnails-f-abp .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-f-abp .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-g img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-g [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-g .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: none;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .thumbnails-g .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .thumbnails-g .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .thumbnails-g .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-g .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11px;
- }
-
- .thumbnails-g .videoCube a {
- padding: 0;
- }
-
- .thumbnails-g .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-g .trc_rbox_outer .videoCube .video-label-box {
- height: 58.0px;
- }
-
- .thumbnails-g .videoCube .video-label-box {
- padding: 0 20px;
- }
-
- .thumbnails-g .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- padding-top: 5px;
- }
-
- .thumbnails-g .videoCube:hover .video-label-box .video-title {
- text-decoration: none;
- }
-
- .thumbnails-g .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-g .syndicatedItem .branding {
- line-height: 16.0px;
- }
-
- .thumbnails-g .trc_header_left_column {
- background: transparent;
- height: auto;
- }
-
- .thumbnails-g .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-g .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .thumbnails-g .video-label-box .video-uploader {
- font-family: 'Fira Sans', Helvetica, Arial;
- line-height: 16px;
- display: block;
- text-align: left;
- font-size: 12px;
- margin-top: -12px;
- position: absolute;
- padding: 0px 5px;
- color: #FFF;
- background-color: #880090;
- }
-
- .thumbnails-g .videoCube .video-label-box:hover .video-title {
- color: #239716;
- }
-
- .trc_elastic .thumbnails-g .trc_rbox_outer .videoCube {
- margin-bottom: 0px;
- }
-
- .thumbnails-h img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-h [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-h .trc_rbox_div {
- margin-bottom: 0;
- }
-
- .thumbnails-h .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-h .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-h .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-h .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-h .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-h .videoCube a {
- padding: 0;
- }
-
- .thumbnails-h .trc_rbox_outer .videoCube {
- margin-bottom: 10px;
- }
-
- .thumbnails-h .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-h .video-label-box {
- height: 76.0px;
- }
-
- .thumbnails-h .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin-bottom: 0;
- }
-
- .thumbnails-h .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-h .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-h .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .thumbnails-h .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-h .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-h .videoCube .video-label-box {
- margin-top: 0px;
- }
-
- .thumbnails-h .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-i img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-i [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-i .trc_rbox_div {
- margin-bottom: 0;
- }
-
- .thumbnails-i .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-i .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-i .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-i .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-i .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-i .videoCube a {
- padding: 0;
- }
-
- .thumbnails-i .trc_rbox_outer .videoCube {
- margin-bottom: 10px;
- }
-
- .thumbnails-i .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-i .video-label-box {
- height: 76.0px;
- }
-
- .thumbnails-i .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin-bottom: 0;
- }
-
- .thumbnails-i .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-i .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-i .syndicatedItem .branding {
- line-height: 19.0px;
- }
-
- .thumbnails-i .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-i .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-i .videoCube .video-label-box {
- margin-top: 0px;
- }
-
- .thumbnails-i .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-j img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-j [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-j .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: transparent;
- height: auto;
- }
-
- .thumbnails-j .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: auto;
- }
-
- .thumbnails-j .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: normal;
- }
-
- .thumbnails-j .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-j .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-j .videoCube a {
- padding: 0;
- }
-
- .thumbnails-j .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-j .video-label-box {
- height: 62.0px;
- }
-
- .thumbnails-j .videoCube .video-label-box {
- padding: 20px 20px 0;
- }
-
- .thumbnails-j .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-j .videoCube:hover .video-label-box .video-title {
- text-decoration: none;
- }
-
- .thumbnails-j .videoCube .video-label-box .video-title:hover {
- color: #7199D7;
- }
-
- .thumbnails-j .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-j .syndicatedItem .branding {
- line-height: 19.0px;
- }
-
- .thumbnails-j .trc_header_left_column {
- width: 48%;
- display: inline-block;
- background: transparent;
- height: auto;
- }
-
- .thumbnails-j .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-j .trc_rbox_header .trc_header_ext {
- position: relative;
- top: auto;
- right: auto;
- }
-
- .thumbnails-j .videoCube {
- box-shadow: 0 1px 20px rgba(0, 0, 0, .12);
- background: #fff;
- }
-
- .thumbnails-j .videoCube .video-label-box .video-title::before {
- content: '';
- margin-left: 10px;
- display: inline;
- }
-
- @media screen and (min-width: 1240px) {
- .trc_elastic .thumbnails-j .trc_rbox_div .videoCube {
- margin-left: 20px;
- width: calc(25% - 20px);
- }
- .trc_elastic .thumbnails-j .trc_rbox_outer {
- margin-left: -20px;
- }
- }
-
- @media screen and (max-width: 1239px) and (min-width: 930px) {
- .trc_elastic .thumbnails-j .trc_rbox_outer {
- margin-left: -20px;
- }
- .trc_elastic .thumbnails-j .trc_rbox_div .videoCube {
- margin-left: 20px;
- width: calc(33.33333% - 20px);
- }
- }
-
- @media screen and (max-width: 620px) and (min-width: 929px) {
- .trc_elastic .thumbnails-j .trc_rbox_outer {
- margin-left: -20px;
- }
- .trc_elastic .thumbnails-j .trc_rbox_div .videoCube {
- margin-left: 20px;
- width: calc(50% - 20px);
- }
- }
-
- .thumbnails-k img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-k [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-k .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-k .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-k .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-k .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-k .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-k .videoCube a {
- padding: 0;
- }
-
- .thumbnails-k .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-k .video-label-box {
- height: 69.0px;
- }
-
- .thumbnails-k .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-k .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-k .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-k .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-k .syndicatedItem .branding {
- line-height: 23.0px;
- }
-
- .thumbnails-k .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-k .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-k .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-rr img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-rr [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-rr .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-rr .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-rr .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-rr .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-rr .videoCube a {
- padding: 0;
- }
-
- .thumbnails-rr .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-rr .video-label-box {
- height: 80.0px;
- }
-
- .thumbnails-rr .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-rr .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-rr .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-rr .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-rr .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .thumbnails-rr .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-rr .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr [class*=span] {
- float: none;
- }
-
- .thumbnails-rr [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr2 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-rr2 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-rr2 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/0b766547f84e83c67d3decdc0b3851f0.png) no-repeat;
- height: 27px;
- }
-
- .thumbnails-rr2 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-rr2 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 27px;
- }
-
- .thumbnails-rr2 .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr2 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-rr2 .videoCube a {
- padding: 0;
- }
-
- .thumbnails-rr2 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-rr2 .video-label-box {
- height: 80.0px;
- }
-
- .thumbnails-rr2 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-rr2 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-rr2 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-rr2 .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-rr2 .syndicatedItem .branding {
- line-height: 20.0px;
- }
-
- .thumbnails-rr2 .trc_header_left_column {
- width: 100%;
- display: inline-block;
- background: transparent;
- height: 27px;
- }
-
- .thumbnails-rr2 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr2 [class*=span] {
- float: none;
- }
-
- .thumbnails-rr2 [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr2 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
-
- .thumbnails-rr2 [class*=span] {
- float: none;
- }
-
- .thumbnails-rr2 [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr2 [class*=span] {
- float: none;
- }
-
- .thumbnails-rr2 [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr2 [class*=span] {
- float: none;
- }
-
- .thumbnails-rr2 [class*=span] {
- margin-left: 0;
- }
-
- .thumbnails-rr3 img {
- max-width: none;
- }
- /* override bootstrap default span definitions */
-
- .thumbnails-rr3 [class*=span] {
- float: none;
- margin-left: 0;
- }
-
- .thumbnails-rr3 .trc_rbox_header {
- line-height: 1.2em;
- position: relative;
- display: inline-block;
- width: 100%;
- background: url(http://cdn.taboolasyndication.com/libtrc/static/thumbnails/4e2d1e48dbb06f6c68d88368d83cb926.png) no-repeat;
- height: 28px;
- }
-
- .thumbnails-rr3 .trc_rbox_header_span .trc_header_right_column {
- display: none;
- background: transparent;
- height: 28px;
- }
-
- .thumbnails-rr3 .trc_rbox_header .logoDiv {
- font-size: inherit;
- line-height: 28px;
- }
-
- .thumbnails-rr3 .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr3 .logoDiv a span {
- display: inline;
- color: #000000;
- font-weight: normal;
- font-size: 11.0px;
- }
-
- .thumbnails-rr3 .videoCube a {
- padding: 0;
- }
-
- .thumbnails-rr3 .thumbBlock {
- margin: 0;
- }
-
- .trc_elastic .thumbnails-rr3 .video-label-box {
- height: 54.0px;
- }
-
- .thumbnails-rr3 .videoCube .video-label-box {
- margin-top: 5px;
- }
-
- .thumbnails-rr3 .videoCube .video-label-box .video-title {
- text-decoration: none;
- margin: 0;
- }
-
- .thumbnails-rr3 .videoCube:hover .video-label-box .video-title {
- text-decoration: underline;
- }
-
- .thumbnails-rr3 .video-label-box .branding {
- display: block;
- }
-
- .thumbnails-rr3 .syndicatedItem .branding {
- line-height: 18.0px;
- }
-
- .thumbnails-rr3 .trc_header_left_column {
- display: inline-block;
- width: 100%;
- background: transparent;
- height: 28px;
- }
-
- .thumbnails-rr3 .trc_rbox_header .logoDiv a {
- font-size: 100%;
- }
-
- .thumbnails-rr3 .trc_rbox_header .trc_header_ext {
- position: absolute;
- top: 0;
- right: 0;
- }
- </style>
<script src="http://s.skimresources.com/js/44681X1528610.skimlinks.js" async=""></script>
<script id="georiot" src="http://cdn.georiot.com/snippet.js" async=""></script>
<script src="http://native.sharethrough.com/assets/sfp.js" async=""></script>
@@ -35747,2384 +622,6 @@
<script src="http://partner.googleadservices.com/gpt/pubads_impl_105.js" async=""></script>
<script async="" type="text/javascript" charset="UTF-8" src="http://cdn.gigya.com/js/gigya.services.socialize.plugins.reactions.min.js?lang=en"></script>
<link rel="prefetch" href="http://tpc.googlesyndication.com/safeframe/1-0-5/html/container.html" />
- <style type="text/css">
- .gig-comments-container *.gig-badge-moderators {
- color: #00AEEF;
- }
-
- .gig-comments-container *.gig-badge-moderators.gig-badge-border {
- border-color: #00AEEF;
- }
-
- .gig-comments-container *.gig-comment-username-badge-moderators {
- color: #00AEEF;
- }
-
- .gig-comments-container *.gig-badge-experts {
- color: #828282;
- }
-
- .gig-comments-container *.gig-badge-experts.gig-badge-border {
- border-color: #828282;
- }
-
- .gig-comments-container *.gig-comment-username-badge-experts {
- color: #000000;
- }
-
- .gig-comments-container *.gig-badge-journalists {
- color: #7A3CC6;
- }
-
- .gig-comments-container *.gig-badge-journalists.gig-badge-border {
- border-color: #7A3CC6;
- }
-
- .gig-comments-container *.gig-comment-username-badge-journalists {
- color: #000000;
- }
-
- .gig-comments-container *.gig-badge-staff {
- color: #39B54A;
- }
-
- .gig-comments-container *.gig-badge-staff.gig-badge-border {
- border-color: #39B54A;
- }
-
- .gig-comments-container *.gig-comment-username-badge-staff {
- color: #000000;
- }
-
- .gig-comments-container *.gig-badge-pick {
- color: #009CDC;
- background-image: url(http://cdn3.gigya.com/gs/i/comments2/editors_pick_x2.png);
- background-size: 17px 17px;
- }
-
- .gig-comments-container *.gig-badge-pick.gig-badge-border {
- border-color: #009CDC;
- }
-
- .gig-comments-container *.gig-comment-badge-pick {
- background-color: #E5F8FF;
- }
- </style>
- <style type="text/css">
- .gig-comments-container *,
- *.gig-comments-container {
- word-wrap: break-word;
- padding: 0px;
- margin: 0px;
- color: inherit;
- text-decoration: none;
- width: auto;
- float: none;
- font-family: arial;
- color: #333333;
- position: static;
- text-align: left;
- vertical-align: baseline;
- -moz-box-sizing: content-box;
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- }
-
- .gig-comments-container input {
- outline: none
- }
-
- .gig-comments-container .gig-composebox-summary-input {
- font-weight: bold;
- }
-
- .gig-comments-container .gig-composebox-summary-input.gig-comments-placeholder {
- font-weight: bold;
- }
-
- .gig-comments-container .gig-comments-placeholder {
- color: #999;
- opacity: 1
- }
-
- .gig-comments-container input:-moz-placeholder {
- color: #585858;
- opacity: 1
- }
-
- .gig-comments-container input::-moz-placeholder {
- color: #585858;
- opacity: 1
- }
-
- .gig-comments-container input::-webkit-input-placeholder {
- color: #585858;
- opacity: 1
- }
-
- .gig-comments-container input:-moz-placeholder {
- color: #585858;
- opacity: 1
- }
-
- *.gig-comments-container u {
- text-decoration: underline
- }
-
- .gig-comments-container li {
- margin: 0;
- padding: 0;
- list-style-type: none
- }
-
- .gig-comments-container ul {
- margin: 0;
- padding: 0;
- }
-
- *.gig-composebox-textarea ul,
- .gig-comment-body ul {
- padding-left: 20px;
- }
-
- *.gig-composebox-textarea li,
- .gig-comment-body li {
- list-style-type: disc
- }
-
- .gig-comments-container * {}
-
- *.gig-comments-container-progress {
- width: 100%;
- height: 38px;
- background-repeat: no-repeat;
- background-position: center center;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/progress_ani_gif_x1.gif')
- }
-
- .gig-comments-hires-icons *.gig-comments-container-progress {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/progress_ani_gif_x2.gif')
- }
-
- *.gig-clearfix {
- clear: both
- }
-
- *.gig-comments-header {
- overflow: hidden;
- border-bottom: 1px solid #EBEBEB;
- margin-bottom: 8px;
- padding-bottom: 8px;
- }
-
- *.gig-comments-count {
- font-size: 16px;
- font-weight: bold;
- }
-
- *.gig-comments-header-right {
- float: right;
- }
-
- *.gig-comments-header-left {
- float: left;
- }
-
- *.gig-comments-linksContainer {
- display: inline-block;
- }
-
- *.gig-comments-linksContainer li,
- *.gig-comments-linksContainer a,
- *.gig-comments-linksContainer li a:hover,
- *.gig-comments-linksContainer a:active,
- *.gig-comments-linksContainer a:visited,
- *.gig-comments-linksContainer a:link {
- color: #999999;
- cursor: pointer;
- display: inline-block;
- }
-
- *.gig-comments-linksContainer li {
- margin-right: 3px;
- }
-
- *.gig-comments-linksContainer li:after {
- content: " ";
- width: 2px;
- height: 2px;
- background-color: #999999;
- vertical-align: middle;
- margin-left: 3px;
- display: inline-block;
- }
-
- *.gig-comments-linksContainer *.gig-comments-link-lastVisible:after {
- content: "";
- margin: 0;
- display: none;
- }
-
- *.gig-comments-linksContainer *.gig-comments-link-lastVisible {
- margin-right: 0;
- }
-
- *.gig-comment {
- width: 100%;
- }
-
- *.gig-comment * {
- color: #999999;
- }
-
- *.gig-comment .gig-comment-content {
- padding-left: 6px;
- transition-property: background-color, padding;
- }
-
- *.gig-comment-newComment .gig-comment-content {
- padding: 6px;
- background-color: #CEFAD3;
- border-radius: 4px;
- }
-
- *.gig-comment-summary {
- display: inline-block;
- font-size: 13px;
- font-weight: bold;
- vertical-align: top;
- color: #333333;
- font-size: 14px;
- }
-
- *.gig-comment-photo {
- float: left;
- width: 37px;
- height: 37px;
- }
-
- *.gig-comment-providerLogo {
- text-align: right;
- }
-
- *.gig-comment-providerLogo img {
- width: 14px;
- height: 14px;
- margin-top: -11px;
- margin-right: -3px;
- display: inline-block;
- }
-
- *.gig-comment-data {
- padding-left: 41px;
- }
-
- *.gig-comment-header {
- overflow: hidden;
- margin-bottom: 6px;
- }
-
- *.gig-comment-header-right {
- float: right;
- }
-
- *.gig-comment-time {
- font-size: 11px;
- display: inline-block;
- margin: 2px 0 0 10px;
- float: right;
- }
-
- *.gig-comment-username {
- font-weight: bold;
- color: #333333;
- margin-right: 6px;
- display: inline-block;
- }
-
- *.gig-comment-body,
- .gig-comment-body * {
- color: #585858;
- line-height: 18px;
- }
-
- *.gig-comment-footer,
- *.gig-comment-replies {
- padding-left: 6px
- }
-
- *.gig-comment-replies {
- transition-property: max-height;
- overflow: hidden;
- }
-
- *.gig-comment-replies-collapsed {
- display: none;
- }
-
- *.gig-comment-footer {
- font-size: 11px;
- overflow: hidden;
- border-bottom: 1px solid #EBEBEB;
- margin: 10px 0;
- padding-bottom: 10px;
- }
-
- *.gig-comment[data-level="0"]:last-of-type *.gig-comment-footer:last-ch {
- border-bottom: none;
- }
-
- *.gig-comment-footer-left {
- float: left;
- }
-
- *.gig-comment-footer li {
- cursor: pointer;
- }
-
- *.gig-comment .gig-comment-replybox {
- display: none;
- background-color: #F6F6F6;
- padding: 4px 6px;
- }
-
- *.gig-comment .gig-comment-replybox-open {
- display: block;
- margin-bottom: 10px;
- }
-
- *.gig-comment .gig-composebox-title,
- *.gig-comment .gig-composebox-title * {
- font-weight: normal;
- font-style: italic;
- color: #333333
- }
-
- *.gig-comment *.gig-composebox-username {
- font-weight: bold;
- }
-
- *.gig-comment-repliesArrow div {
- display: inline-block
- }
-
- *.gig-comment-repliesArrow-img {
- margin: 0 1px 0 6px;
- width: 9px;
- height: 9px;
- margin-right: 3px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Reply_Arrow_x1.png');
- background-repeat: no-repeat;
- background-position: 0px 3px;
- }
-
- .gig-comments-hires-icons *.gig-comment-repliesArrow-img {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Reply_Arrow_x2.png');
- }
-
- *.gig-comment-repliesArrow .gig-comment-repliesArrow-img {}
-
- *.gig-comment-repliesArrow-collapsed .gig-comment-repliesArrow-img {
- -webkit-transform: rotate(270deg);
- transform: rotate(270deg);
- }
-
- *.gig-comment-status {
- display: none;
- border-radius: 3px;
- color: #FFFFFF;
- padding: 2px 8px;
- border-radius: 3px;
- margin-bottom: 6px;
- }
-
- *.gig-comment-body a:link {
- color: #007ACF;
- text-decoration: underline;
- }
-
- *.gig-comment-body a:visited {
- color: #61007d;
- text-decoration: underline;
- }
-
- *.gig-comment-status-info {
- display: inline-block;
- background-color: #64B46F;
- }
-
- *.gig-comment-status-error {
- display: inline-block;
- background-color: #D0605F;
- margin-bottom: 6px;
- }
-
- *.gig-comment-viaProvider {
- display: inline-block;
- font-style: italic;
- margin: 0 12px;
- padding: 0 0 0 12px;
- background-repeat: no-repeat;
- background-position: left center;
- }
-
- *.gig-comment-viaProvider-facebook {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2//providers/Facebook_9x9_x1.png');
- }
-
- .gig-comments-hires-icons *.gig-comment-viaProvider-facebook {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2//providers/Facebook_9x9_x2.png');
- }
-
- .gig-comments-hires-icons *.gig-loginbox-provider {
- background-size: 15px;
- }
-
- img.gig-comment-img {
- border-radius: 3px;
- }
-
- *.gig-comment-footer-right {
- float: right;
- }
-
- *.gig-comment-footer-right div {
- display: inline-block;
- height: 17px;
- line-height: 16px;
- vertical-align: bottom;
- }
-
- *.gig-comment-vote-pos,
- *.gig-comment-vote-neg {
- cursor: pointer;
- background-repeat: no-repeat;
- background-position: 0 0;
- padding-left: 14px;
- }
-
- *.gig-comment-vote-with-value {
- padding-left: 17px;
- }
-
- *.gig-comment-vote-total {
- margin-right: 5px;
- }
-
- *.gig-comment-vote-pos {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_x1.png')
- }
-
- .gig-comments-hires-icons *.gig-comment-vote-pos {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_x2.png')
- }
-
- *.gig-comment-vote-pos-down {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_pressed_x1.png')
- }
-
- .gig-comments-hires-icons *.gig-comment-vote-pos-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_pressed_x2.png')
- }
-
- *.gig-comment-vote-neg {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_x1.png');
- margin-left: 15px;
- position: relative;
- background-position: 0 3px;
- }
-
- .gig-comments-hires-icons *.gig-comment-vote-neg {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_x2.png');
- }
-
- *.gig-comment-vote-posneg *.gig-comment-vote-neg {
- margin-left: 2px;
- }
-
- *.gig-comment-vote-neg-down {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_pressed_x1.png')
- }
-
- .gig-comments-hires-icons *.gig-comment-vote-neg-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_pressed_x2.png')
- }
-
- *.gig-comment-flag {
- margin: 0 15px;
- vertical-align: top;
- display: inline-block;
- width: 14px;
- height: 14px;
- visibility: hidden;
- cursor: pointer;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Flag_Icon_x1.png')
- }
-
- .gig-comments-hires-icons *.gig-comment-flag {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Flag_Icon_x2.png')
- }
-
- *.gig-comment-flag-submitted {
- cursor: default;
- visibility: visible;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Flag_Icon_Submitted_x1.png')
- }
-
- .gig-comments-hires-icons *.gig-comment-flag-submitted {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Flag_Icon_Submitted_x2.png')
- }
-
- *.gig-comments-more {
- cursor: pointer;
- border-radius: 3px;
- line-height: 38px;
- border: 1px solid #F7F6F6;
- background-color: #F9F9F9;
- text-align: center;
- }
-
- *.gig-comments-more:hover {
- background-color: #E5E5E5
- }
-
- *.gig-comments-more-progress {
- cursor: default;
- width: 100%;
- height: 38px;
- background-repeat: no-repeat;
- background-position: center center;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/progress_ani_gif_x2.gif')
- }
-
- .gig-comments-hires-icons *.gig-comments-more-progress {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/progress_ani_gif_x2.gif')
- }
-
- *.gig-comments-more-progress:hover {
- background-color: #F9F9F9;
- }
-
- *.gig-comments-dialog {
- min-width: 367px;
- min-height: 140px;
- border: 6px solid #858585;
- border-radius: 5px;
- background-color: #FFFFFF;
- }
-
- *.gig-comments-dialog-close {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x1.png');
- width: 15px;
- height: 15px;
- float: right;
- cursor: pointer;
- }
-
- .gig-comments-hires-icons *.gig-comments-dialog-close {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x2.png');
- background-size: contain;
- }
-
- *.gig-comments-dialog-caption-container {
- overflow: hidden;
- background-color: #f3f3f3;
- padding: 5px 5px 5px 12px;
- overflow: auto;
- zoom: 1;
- font-size: 14px;
- font-weight: bold;
- color: #4d4d4d;
- }
-
- *.gig-comments-dialog-caption {
- display: inline-block;
- float: left;
- }
-
- *.gig-comments-dialog-body {
- padding: 24px 12px 12px 12px;
- }
-
- *.gig-comments-dialog-buttons {
- margin-top: 12px;
- text-align: right;
- margin: 20px;
- }
-
- *.gig-comments-dialog-text {
- margin-bottom: 10px;
- }
-
- *.gig-comments-dialog-textbox-container {
- float: left
- }
-
- *.gig-comments-dialog-textbox {
- width: 260px;
- color: #4D4D4D;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0 4px;
- background-color: white;
- border: 1px solid #C0C0C0;
- height: 24px;
- box-shadow: inset 0 0 4px #DCDCDC;
- -moz-box-shadow: inset 0 0 4px #DCDCDC;
- -webkit-box-shadow: inset 0 0 4px #DCDCDC;
- }
-
- *.gig-comments-dialog-subscribe-okIcon {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/ok_icon_x1.png');
- width: 14px;
- height: 14px;
- position: relative;
- top: 2px;
- margin-right: 2px;
- display: inline-block;
- }
-
- .gig-comments-hires-icons *.gig-comments-dialog-subscribe-okIcon {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/ok_icon_x2.png');
- }
-
- *.gig-comments-dialog-button {
- line-height: 22px;
- font-size: 12px;
- margin-left: 7px;
- font-weight: bold;
- min-width: 50px;
- position: relative;
- border-radius: 3px;
- color: #4d4d4d;
- cursor: pointer;
- font-size: 11px;
- padding: 0 5px;
- border: 1px solid #C5C7C7;
- display: inline-block;
- zoom: 1;
- vertical-align: middle;
- text-align: center;
- box-shadow: 0 0 2px RGBA(0, 0, 0, 0.15);
- -webkit-box-shadow: 0 0 2px RGBA(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 2px RGBA(0, 0, 0, 0.15);
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFF", endColorstr="#EAEBEB");
- background: linear-gradient(top, #FFFFFF, #EAEBEB);
- background: -ms-linear-gradient(top left, #FFFFFF, #EAEBEB);
- background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#EAEBEB));
- background: -moz-linear-gradient(top, #FFFFFF, #EAEBEB)
- }
- }
- *.gig-comments-dialog-button:hover {
- color: #b4b4b4;
- cursor: default;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#EBEBEB", endColorstr="#FFFFFF");
- background: linear-gradient(top, #EBEBEB, #FFFFFF);
- background: -ms-linear-gradient(top left, #EBEBEB, #FFFFFF);
- background: -webkit-gradient(linear, left top, left bottom, from(#EBEBEB), to(#FFFFFF));
- background: -moz-linear-gradient(top, #EBEBEB, #FFFFFF)
- }
- *.gig-comments-dialog-error {
- color: #ce585a;
- font-size: 11px;
- margin-top: 5px;
- clear: both;
- }
- *.gig-comments-dialog-textbox-button {}
- *.gig-composebox {
- margin-bottom: 23px;
- }
- *.gig-composebox-login {}
- *.gig-composebox-login div {
- display: inline-block;
- line-height: 30px;
- font-weight: bold;
- }
- *.gig-composebox-or {
- margin: 0 10px;
- }
- *.gig-composebox-social-login,
- *.gig-composebox-guest-login,
- *.gig-composebox-site-login {
- border-radius: 3px;
- cursor: pointer;
- padding: 0 15px;
- font-size: 14px;
- box-shadow: inset 1px 1px #fff;
- border: solid 1px #e2e2e2;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#f5f5f5", endColorstr="#f1f1f0");
- background: linear-gradient(top, #f5f5f5, #f1f1f0);
- background: -ms-linear-gradient(top left, #f5f5f5, #f1f1f0);
- background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f1f1f0));
- background: -moz-linear-gradient(top, #f5f5f5, #f1f1f0);
- }
- *.gig-composebox-social-login:hover,
- *.gig-composebox-guest-login:hover,
- *.gig-composebox-site-login:hover {
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#EFEFEF", endColorstr="#E1E1E1");
- background: linear-gradient(top, #EFEFEF, #E1E1E1);
- background: -ms-linear-gradient(top left, #EFEFEF, #E1E1E1);
- background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#E1E1E1));
- background: -moz-linear-gradient(top, #EFEFEF, #E1E1E1);
- }
- *.gig-composebox-social-login {
- padding: 0 9px;
- background-repeat: no-repeat;
- background-position: right center;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#f5f5f5", endColorstr="#f1f1f0");
- background: linear-gradient(top, #f5f5f5, #f1f1f0);
- background: -ms-linear-gradient(top left, #f5f5f5, #f1f1f0);
- background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f1f1f0));
- background: -moz-linear-gradient(top, #f5f5f5, #f1f1f0);
- }
- *.gig-composebox-social-login:hover {
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#EFEFEF", endColorstr="#E1E1E1");
- background: linear-gradient(top, #EFEFEF, #E1E1E1);
- background: -ms-linear-gradient(top left, #EFEFEF, #E1E1E1);
- background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#E1E1E1));
- background: -moz-linear-gradient(top, #EFEFEF, #E1E1E1);
- }
- *.gig-composebox-login-icon {
- background-position: center;
- display: inline-block;
- width: 36px;
- height: 17px;
- margin: 0 7px;
- vertical-align: middle;
- background-repeat: no-repeat;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Login-icons-fb_tw_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-login-icon {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Login-icons-fb_tw_x2.png')
- }
- *.gig-composebox-login-drop-icon {
- background-position: center;
- display: inline-block;
- width: 9px;
- height: 17px;
- vertical-align: middle;
- background-repeat: no-repeat;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Login_icons_arrow_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-login-drop-icon {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Login_icons_arrow_x2.png')
- }
- *.gig-composebox-header {
- transition-property: max-height;
- overflow: hidden;
- margin-bottom: 4px;
- }
- .gig-composebox-open *.gig-composebox-header {
- margin-bottom: 4px;
- }
- .gig-comments-reviews .gig-composebox-header,
- .gig-comments-reviews .gig-composebox-open .gig-composebox-header {
- max-height: none;
- }
- *.gig-composebox-header-left {
- float: left;
- }
- *.gig-composebox-header-right {
- float: right;
- }
- *.gig-composebox-header-right *,
- *.gig-composebox-header-left * {
- vertical-align: bottom;
- }
- *.gig-composebox-title,
- *.gig-composebox-name {
- display: inline-block;
- font-size: 14px;
- font-weight: bold;
- margin: 0 5px 0 0;
- }
- *.gig-composebox-logout {
- cursor: pointer;
- display: inline-block;
- font-size: 11px;
- color: #999999;
- }
- *.gig-composebox-logout span {
- font-size: 12px;
- color: #0796c6
- }
- *.gig-composebox-logout:hover span {
- text-decoration: underline
- }
- *.gig-comment-replybox *.gig-composebox-close {
- display: inline-block;
- margin-left: 5px;
- cursor: pointer;
- width: 15px;
- height: 15px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x1.png');
- background-position: center;
- background-repeat: no-repeat;
- }
- .gig-comments-hires-icons *.gig-comment-replybox *.gig-composebox-close {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x2.png');
- background-size: contain;
- }
- *.gig-comment-replybox *.gig-composebox-close:hover {
- background-color: #ebebeb;
- }
- *.gig-composebox-follow {
- font-size: 13px;
- cursor: pointer;
- display: inline-block;
- color: #919191;
- padding-left: 12px;
- background-repeat: no-repeat;
- background-position: left center;
- background-size: 8px 8px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Follow_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-follow {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Follow_x2.png')
- }
- *.gig-composebox-following {
- background-size: 8px 8px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Following_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-following {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Following_x2.png')
- }
- *.gig-composebox-following:hover {
- background-size: 8px 8px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Unfollow_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-following:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Unfollow_x2.png')
- }
- *.gig-composebox-photo {
- float: left;
- width: 37px;
- height: 37px
- }
- *.gig-composebox-data {
- padding-left: 47px;
- }
- *.gig-comments-composebox *.gig-composebox-data {
- margin-bottom: 20px;
- }
- *.gig-composebox-footer {
- display: none;
- overflow: hidden;
- margin-top: 4px;
- }
- .gig-composebox-open *.gig-composebox-footer {
- display: block;
- }
- *.gig-composebox-footer-left,
- *.gig-composebox-footer-right {
- padding: 2px 0;
- }
- *.gig-composebox-footer-left {
- float: left;
- }
- *.gig-composebox-footer-right {
- float: right;
- }
- *.gig-composebox-cancel {
- cursor: pointer;
- padding: 0 18px;
- font-size: 14px;
- font-weight: bold;
- color: #484848;
- display: inline-block;
- line-height: 28px;
- border-radius: 3px;
- background-color: #484848;
- box-shadow: 1px 1px rgba(255, 255, 255, 0.4) inset;
- border: 1px solid #bfbfbf;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#e2e2e2", endColorstr=" #bfbfbf");
- background: linear-gradient(top, #e2e2e2, #bfbfbf);
- background: -ms-linear-gradient(top left, #e2e2e2, #bfbfbf);
- background: -webkit-gradient(linear, left top, left bottom, from(#e2e2e2), to( #bfbfbf));
- background: -moz-linear-gradient(top, #e2e2e2, #bfbfbf);
- margin-right: 6px;
- }
- *.gig-composebox-cancel:hover {
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#e2e2e2", endColorstr=" #bfbfbf");
- background: linear-gradient(top, #e2e2e2, #bfbfbf);
- background: -ms-linear-gradient(top left, #e2e2e2, #bfbfbf);
- background: -webkit-gradient(linear, left top, left bottom, from(#e2e2e2), to( #bfbfbf));
- background: -moz-linear-gradient(top, #e2e2e2, #bfbfbf);
- }
- *.gig-composebox-post {
- cursor: pointer;
- padding: 0 18px;
- font-size: 14px;
- font-weight: bold;
- color: #FFFFFF;
- display: inline-block;
- line-height: 28px;
- border-radius: 3px;
- background-color: #D8D8D8;
- box-shadow: 1px 1px rgba(255, 255, 255, 0.4) inset;
- border: 1px solid #51AE48;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#88cb82", endColorstr="#72c26d");
- background: linear-gradient(top, #88cb82, #72c26d);
- background: -ms-linear-gradient(top left, #88cb82, #72c26d);
- background: -webkit-gradient(linear, left top, left bottom, from(#88cb82), to(#72c26d));
- background: -moz-linear-gradient(top, #88cb82, #72c26d);
- }
- *.gig-comments-button {
- cursor: -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- -o-user-select: none;
- }
- *.gig-composebox-post:hover {
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#7AB574", endColorstr="#68AF63");
- background: linear-gradient(top, #7AB574, #68AF63);
- background: -ms-linear-gradient(top left, #7AB574, #68AF63);
- background: -webkit-gradient(linear, left top, left bottom, from(#7AB574), to(#68AF63));
- background: -moz-linear-gradient(top, #7AB574, #68AF63);
- }
- *.gig-composebox-postAnonymously {
- display: inline-block;
- }
- *.gig-composebox-anon-text {
- vertical-align: middle;
- display: inline-block;
- font-family: arial;
- font-size: 12px;
- color: #999999;
- padding: 0 10px 0 5px;
- }
- *.gig-composebox-anon-checkbox {
- vertical-align: middle;
- }
- *.gig-composebox-summary {
- display: none;
- padding: 9px;
- }
- .gig-composebox-open *.gig-composebox-summary {
- display: block;
- margin-bottom: 5px;
- }
- *.gig-composebox-summary input {
- width: 100%;
- border: none;
- color: #585858;
- }
- *.gig-composebox-editor {
- text-align: right;
- padding: 0 9px 9px 9px;
- }
- *.gig-composebox-editor-with-sidebar {
- padding: 0 29px 9px 9px;
- }
- *.gig-composebox-editor,
- *.gig-composebox-summary {
- background-color: #FFFFFF;
- border: 1px solid #D5D5D5;
- border-radius: 3px;
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.05) inset;
- border: solid 1px #d5d5d5;
- }
- *.gig-composebox-textarea {
- line-height: 18px;
- transition-property: min-height;
- text-align: left;
- cursor: text;
- min-height: 17px;
- resize: none;
- border: none;
- margin-top: 9px;
- outline: none
- }
- *.gig-composebox-textarea,
- *.gig-composebox-textarea * {
- color: #585858;
- font-size: 14px;
- }
- textarea.gig-composebox-textarea {
- overflow: hidden;
- width: 100%;
- display: block;
- height: 17px;
- }
- .gig-composebox-open textarea.gig-composebox-textarea {
- height: 65px;
- }
- .gig-composebox-open *.gig-composebox-textarea {
- min-height: 69px;
- }
- *.gig-composebox-textarea,
- *.gig-composebox-textarea *,
- *.gig-composebox-summary input {
- font-size: 12px;
- }
- *.gig-composebox-textarea:empty:not(:focus):before {
- color: #999;
- content: attr(data-placeholder);
- }
- ul.gig-composebox-sidebar {
- display: none;
- background-color: #FFFFFF;
- float: right;
- margin-right: -29px;
- }
- ul.gig-composebox-sidebar {
- transition-property: opacity;
- opacity: 0;
- }
- .gig-composebox-open *.gig-composebox-sidebar {
- opacity: 1;
- display: inline-block;
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-button {
- background-size: 18px 18px;
- }
- *.gig-composebox-sidebar-button {
- border-radius: 0px;
- background-color: #f0f0f0;
- width: 29px;
- height: 29px;
- display: block;
- background-color: #F7F3F7;
- }
- *.gig-composebox-sidebar-button:last-child:nth-child(-n+2) {
- border-radius: 0 0 0 3px;
- }
- *.gig-composebox-sidebar-button:hover,
- *.gig-composebox-sidebar-button-down {
- background-color: #f1f1f1;
- box-shadow: inset 0 0 9px rgba(0, 0, 0, .26);
- }
- *.gig-composebox-sidebar-font {
- cursor: pointer;
- width: 29px;
- height: 29px;
- background-repeat: no-repeat;
- background-position: center;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_up_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-font {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_up_x2.png')
- }
- *.gig-composebox-sidebar-font:hover,
- *.gig-composebox-sidebar-font.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-font:hover,
- .gig-comments-hires-icons *.gig-composebox-sidebar-font.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_hover_x2.png')
- }
- *.gig-composebox-sidebar-tag {
- cursor: pointer;
- width: 29px;
- height: 29px;
- background-repeat: no-repeat;
- background-position: center;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/User_tagging_up_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-tag {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/User_tagging_up_x2.png')
- }
- *.gig-composebox-sidebar-tag:hover,
- *.gig-composebox-sidebar-tag.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/User_tagging_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-tag:hover,
- *.gig-composebox-sidebar-tag.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/User_tagging_hover_x1.png')
- }
- *.gig-composebox-sidebar-media {
- cursor: pointer;
- width: 29px;
- height: 29px;
- background-repeat: no-repeat;
- background-position: center;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Media_up_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-media {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Media_up_x2.png')
- }
- *.gig-composebox-sidebar-media:hover,
- *.gig-composebox-sidebar-media.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Media_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-sidebar-media:hover,
- .gig-comments-hires-icons *.gig-composebox-sidebar-media.gig-composebox-sidebar-button-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Media_hover_x2.png')
- }
- *.gig-composebox-field-error {
- border: 1px solid #F9888E;
- }
- *.gig-composebox-error {
- border-radius: 3px;
- color: #FFFFFF;
- text-align: center;
- line-height: 22px;
- background: #F9888E;
- margin-bottom: 7px;
- display: none;
- font-weight: bold;
- font-size: 13px;
- }
- *.gig-composebox-postAnonymously {
- cursor: pointer;
- vertical-align: top;
- padding-top: 4px;
- }
- *.gig-comments-checkbox {
- width: 10px;
- height: 10px;
- border: 1px solid #C6C6C6;
- display: inline-block;
- border-radius: 1px;
- background-color: #fff;
- box-shadow: 0 0 5px rgba(189, 189, 189, 0.25) inset
- }
- *.gig-comments-checkbox-checked {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/shareToProviders/checkmark_x1.png');
- background-position: center;
- background-repeat: no-repeat;
- }
- .gig-comments-hires-icons *.gig-comments-checkbox-checked {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/shareToProviders/checkmark_x2.png');
- }
- *.gig-selfreview-header {
- overflow: hidden;
- }
- *.gig-selfreview-header-left {
- float: left;
- }
- *.gig-selfreview-header-right {
- float: right;
- }
- *.gig-selfreview-summary-container,
- *.gig-selfreview-body-container {
- background-color: #EDEDED;
- margin: 5px 0;
- padding: 6px 10px;
- border-radius: 3px;
- }
- *.gig-selfreview-field-title {
- font-weight: bold;
- margin: 0 7px 0 0;
- }
- *.gig-selfreview-nameAndLogout {
- padding: 0 0 0 47px;
- height: 37px;
- }
- *.gig-selfreview-yourReview {
- font-weight: bold;
- color: #919191;
- margin-bottom: 3px;
- }
- *.gig-selfreview-ratings {
- margin: 5px 0
- }
- *.gig-selfreview-rating .gig-comment-rating-value {
- margin-left: 2px;
- }
- *.gig-selfreview-rating-_overall .gig-comment-rating-value {
- margin-left: 0px;
- }
- *.gig-selfreview-rating-_overall.gig-selfreview-rating {
- margin-bottom: 5px;
- }
- *.gig-comments-guestbox {
- transition-property: max-height;
- background-color: #FFFFFF;
- border: 1px solid #E2E2E2;
- border-radius: 0 3px 3px 3px;
- overflow: hidden;
- width: 150px;
- font-size: 10px;
- color: #919191;
- padding: 0 13px 0 13px
- }
- *.gig-comments-guestbox input {
- width: 150px;
- border-radius: 3px;
- height: 24px;
- line-height: 22px;
- color: #919191;
- border: 1px solid #C0C0C0;
- padding-left: 2px;
- }
- *.gig-guestbox-fields {
- margin: 16px 0 0px;
- }
- *.gig-guestbox-nickname {
- margin: 0px 0 10px;
- }
- *.gig-guestbox-text {
- font-size: 10px;
- margin: 5px 0;
- }
- *.gig-guestbox-ok {
- margin-bottom: 8px;
- float: right;
- display: inline-block;
- cursor: pointer;
- padding: 0 9px;
- font-weight: bold;
- color: #222121;
- text-shadow: 0 2px rgba(255, 255, 255, .4);
- line-height: 22px;
- border-radius: 3px;
- background-color: #f2f2f2;
- box-shadow: 0 1px 3px rgba(0, 0, 0, .25), inset 0 0 2px rgba(255, 255, 255, .24);
- border: solid 1px #c4c7cd;
- }
- *.gig-guestbox-error {
- margin-left: 4px;
- display: inline-block;
- color: #e70707;
- font-size: 10px;
- width: 100px;
- float: left;
- margin-bottom: 8px;
- }
- *.gig-comments-loginbox {
- transition-property: max-height;
- background-color: #FFFFFF;
- border: 1px solid #E2E2E2;
- border-radius: 0 0 3px 3px;
- overflow: hidden;
- min-width: 115px;
- font-size: 10px;
- color: #919191;
- }
- *.gig-comments-loginbox-open {}
- *.gig-loginbox-provider {
- background-repeat: no-repeat;
- background-position: left center;
- margin-left: 9px;
- padding: 8px 8px 8px 22px;
- cursor: pointer;
- border-bottom: 1px solid #EAEAEA
- }
- *.gig-loginbox-provider:last-child {
- border-bottom: none;
- }
- *.gig-loginbox-provider:hover {
- background-color: #F9F9F9
- }
- *.gig-loginbox-provider[data-provider=more] {
- padding-left: 0px
- }
- *.gig-signinbox-provider {
- margin-left: 8px;
- padding: 8px 8px 8px 1px;
- cursor: default;
- border-bottom: 1px solid #EAEAEA
- }
- *.gig-comments-usertaggingbox {
- width: 290px;
- border-radius: 3px;
- background-color: #FFF;
- border: solid 1px #d5d5d5;
- font-family: arial;
- }
- *.gig-usertagging-title {
- color: #666666;
- background-color: #F4F4F4;
- font-size: 10px;
- border-radius: 2px;
- padding: 7px;
- font-family: inherit;
- }
- *.gig-usertagging-suggestions {
- list-style-type: none;
- margin: 0;
- padding: 0px;
- font-family: inherit;
- font-size: 12px;
- }
- *.gig-usertagging-suggestions li {
- cursor: pointer;
- padding-left: 8px;
- border-top: solid 1px #eaeaea;
- height: 18px;
- padding-top: 4px;
- padding-bottom: 4px;
- }
- *.gig-usertagging-suggestions li *.gig-usertagging-username {
- margin-left: 8px;
- vertical-align: top;
- line-height: 20px;
- }
- *.gig-usertagging-suggestions li *.gig-usertagging-userimage {
- border-radius: 3px;
- width: 18px;
- height: 18px;
- }
- *.gig-usertagging-suggestions li.gig-usertagging-selected {
- background-color: #f9f9f9;
- }
- *.gig-usertagging-tag {
- -webkit-appearance: none;
- border-radius: 8px 9px 9px 8px / 8px 8px 10px 10px;
- background-color: #d5e4f2;
- border-style: none;
- padding: 0px 4px 0px 4px;
- }
- *.gig-composebox-share {
- vertical-align: top;
- overflow: hidden;
- background-color: #F4F4F4;
- border-radius: 3px;
- padding-left: 4px;
- }
- *.gig-comment .gig-composebox-share {
- border: 1px solid #E8E8E8
- }
- *.gig-composebox-share-text {
- line-height: 26px;
- vertical-align: top;
- display: inline-block;
- color: #999999;
- }
- *.gig-composebox-share-providers {
- display: inline-block;
- }
- *.gig-comments-share-provider {
- display: none;
- height: 18px;
- width: 36px;
- background-position: 23px center;
- padding: 4px 3px;
- background-repeat: no-repeat;
- cursor: pointer;
- border-right: 1px solid #FFFFFF;
- }
- .gig-comments-hires-icons *.gig-comments-share-provider {
- background-size: 16px 16px
- }
- *.gig-comments-share-provider-shown {
- display: inline-block;
- }
- *.gig-comments-share-more {
- cursor: pointer;
- vertical-align: top;
- padding: 4px;
- display: inline-block;
- height: 18px;
- width: 16px;
- background-position: center;
- background-repeat: no-repeat;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/sharetoProviders/Share_More_providers_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-share-more {
- background-size: 8px 8px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/sharetoProviders/Share_More_providers_x2.png')
- }
- *.gig-comments-share-provider-checkbox {
- margin-top: 3px;
- }
- *.gig-composebox-morebox {
- width: 265px;
- border: 5px solid #858585;
- border-radius: 3px;
- }
- *.gig-composebox-morebox-caption {
- background-color: #F3F3F3;
- overflow: hidden;
- line-height: 15px;
- padding: 3px;
- }
- *.gig-composebox-morebox-title {
- margin-left: 3px;
- font-weight: bold;
- float: left;
- background-color: #F3F3F3;
- overflow: hidden;
- color: #4D4D4D;
- }
- *.gig-composebox-morebox-close {
- float: right;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x1.png');
- width: 15px;
- height: 15px;
- cursor: pointer;
- background-position: center;
- background-repeat: no-repeat;
- }
- .gig-comments-hires-icons *.gig-composebox-morebox-close {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x2.png');
- background-size: contain;
- }
- *.gig-composebox-morebox *.gig-composebox-morebox-providers {
- padding: 0 6px;
- background-color: #FFFFFF;
- }
- *.gig-composebox-morebox *.gig-composebox-morebox-providers li {
- padding-left: 18px;
- margin: 4px 0;
- width: 105px;
- display: inline-block;
- background-repeat: no-repeat;
- cursor: pointer;
- background-size: 14px;
- }
- *.gig-comments-sortbox {
- margin-top: 9px;
- border-radius: 3px;
- background-color: #fff;
- box-shadow: -1px 2px 1px rgba(35, 31, 32, .07);
- border: solid 1px #b0b0b0;
- padding: 3px 8px;
- display: inline-block;
- }
- *.gig-comments-sortbox:before {
- content: "";
- width: 13px;
- right: 12px;
- height: 7px;
- display: inline-block;
- position: absolute;
- top: -7px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sort_dropdown_triangle_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-sortbox:before {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sort_dropdown_triangle_x2.png')
- }
- *.gig-comments-sortbox li {
- color: #999999;
- cursor: pointer;
- min-width: 80px;
- padding: 7px 5px;
- border-bottom: 1px solid #EAEAEA;
- }
- *.gig-comments-sortbox li:last-child {
- border-bottom: none
- }
- *.gig-comments-sortbox li:hover {
- color: #848484;
- background-color: #F4F4F4;
- }
- *.gig-comments-sortbox-selected {
- font-weight: bold
- }
- *.gig-comments-fontbox {
- padding-right: 8px;
- padding-top: 7px;
- transition: opacity 0.25s;
- opacity: 0;
- }
- *.gig-comments-fontbox ul:after {
- content: "";
- width: 8px;
- height: 13px;
- display: inline-block;
- position: absolute;
- right: 1px;
- top: 12px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sidebar_box_thub_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-fontbox ul:after {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sidebar_box_thub_x2.png')
- }
- *.gig-comments-fontbox ul {
- padding: 2px;
- width: 69px;
- background-color: #FFFFFF;
- border: 1px solid #B0B0B0;
- border-radius: 2px;
- cursor: pointer;
- }
- *.gig-comments-fontbox li {
- border: 1px none #EEEEEE;
- width: 33px;
- height: 33px;
- display: inline-block;
- background-position: center;
- background-repeat: no-repeat
- }
- *.gig-comments-fontbox *.gig-composebox-font-bold {
- border-right-style: solid;
- border-bottom-style: solid;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_bold_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-fontbox *.gig-composebox-font-bold {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_bold_x2.png')
- }
- *.gig-comments-fontbox *.gig-composebox-font-italic {
- border-bottom-style: solid;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_italic_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-fontbox *.gig-composebox-font-italic {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_italic_x2.png')
- }
- *.gig-comments-fontbox *.gig-composebox-font-underline {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_underline_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-fontbox *.gig-composebox-font-underline {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_underline_x2.png')
- }
- *.gig-comments-fontbox *.gig-composebox-font-bullets {
- border-left-style: solid;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_align_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-fontbox *.gig-composebox-font-bullets {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rich_Text_align_x2.png')
- }
- *.gig-comments-mediabox {
- padding-right: 8px;
- transition: opacity 0.25s;
- opacity: 0;
- }
- *.gig-mediabox-fields {
- padding: 12px 6px 10px;
- width: 382px;
- border: solid 1px #b0b0b0;
- border-radius: 2px;
- background-color: #fff;
- -webkit-box-shadow: -1px 2px 1px rgba(35, 31, 32, .07);
- -moz-box-shadow: -1px 2px 1px rgba(35, 31, 32, .07);
- box-shadow: -1px 2px 1px rgba(35, 31, 32, .07);
- }
- *.gig-mediabox-fields:after {
- content: "";
- width: 8px;
- height: 13px;
- position: absolute;
- display: inline-block;
- right: 1px;
- top: 12px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sidebar_box_thub_x1.png')
- }
- .gig-comments-hires-icons *.gig-mediabox-fields:after {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sidebar_box_thub_x2.png')
- }
- *.gig-mediabox-url {
- vertical-align: top;
- padding-left: 8px;
- margin-bottom: 10px;
- margin-right: 5px;
- width: 307px;
- height: 28px;
- border-radius: 3px;
- background-color: #fff;
- -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- -moz-box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- border: solid 1px #d5d5d5;
- }
- *.gig-mediabox-url:empty:before {
- color: #585858;
- content: attr(data-placeholder);
- }
- *.gig-mediabox-ok {
- vertical-align: top;
- cursor: pointer;
- text-align: center;
- display: inline-block;
- font-weight: bold;
- font-size: 14px;
- color: #333333;
- line-height: 28px;
- width: 57px;
- height: 28px;
- border-radius: 3px;
- background-color: #f2f2f1;
- box-shadow: inset 1px 1px #fff;
- -moz-box-shadow: inset 1px 1px #fff;
- -webkit-box-shadow: inset 1px 1px #fff;
- border: solid 1px #d5d5d5;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#f5f5f5", endColorstr="#f1f1f0");
- background: linear-gradient(top, #f5f5f5, #f1f1f0);
- background: -ms-linear-gradient(top left, #f5f5f5, #f1f1f0);
- background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#f1f1f0));
- background: -moz-linear-gradient(top, #f5f5f5, #f1f1f0);
- }
- *.gig-mediabox-ok:hover {
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#efefef", endColorstr=" #e9e9e9");
- background: linear-gradient(top, #efefef, #e9e9e9);
- background: -ms-linear-gradient(top left, #efefef, #e9e9e9);
- background: -webkit-gradient(linear, left top, left bottom, from(#efefef), to( #e9e9e9));
- background: -moz-linear-gradient(top, #efefef, #e9e9e9);
- }
- *.gig-mediabox-text {
- font-family: arial;
- font-size: 12px;
- color: #666666;
- line-height: 14px;
- }
- *.gig-composebox-media-display {
- margin-bottom: 12px;
- }
- *.gig-media-caption {
- font-family: arial;
- font-size: 12px;
- color: #666666;
- line-height: 17px;
- margin: 4px 12px 0px 1px;
- }
- *.gig-media-caption-text {
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- word-wrap: normal;
- }
- *.gig-media-caption-url {
- display: block;
- padding-left: 23px;
- text-decoration: underline;
- word-wrap: normal;
- color: #0796c6;
- cursor: pointer;
- font-size: 12px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- vertical-align: text-top;
- background-repeat: no-repeat;
- background-position: left;
- background-size: contain;
- }
- *.gig-media-thumbnail {
- height: 303px;
- }
- *.gig-media-thumbnail-image {
- margin: auto;
- display: block;
- }
- *.gig-media-overlay {
- position: relative;
- top: -303px;
- height: 0px;
- }
- *.gig-media-play {
- display: none;
- opacity: 0.85;
- width: 75px;
- height: 45px;
- border-radius: 10px;
- background-color: #545454;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_play_x1.png');
- background-position: center center;
- background-repeat: no-repeat;
- cursor: pointer;
- position: relative;
- box-shadow: 0 -1px 3px rgba(0, 0, 0, .4), inset 0 1px rgba(255, 255, 255, .29);
- -moz-box-shadow: 0 -1px 3px rgba(0, 0, 0, .4), inset 0 1px rgba(255, 255, 255, .29);
- -webkit-box-shadow: 0 -1px 3px rgba(0, 0, 0, .4), inset 0 1px rgba(255, 255, 255, .29);
- }
- .gig-comments-hires-icons *.gig-media-play {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_play_x2.png');
- }
- *.gig-media-play:hover {
- background-color: #666565;
- }
- *.gig-media-cancel {
- cursor: pointer;
- margin-top: -18px;
- margin-right: 0px;
- float: right;
- width: 13px;
- height: 13px;
- border-radius: 2px;
- background-color: #c9c6c6;
- box-shadow: inset 0 0 9px rgba(0, 0, 0, .26);
- -moz - box-shadow: inset 0 0 9px rgba(0, 0, 0, .26);
- -webkit - box-shadow: inset 0 0 9px rgba(0, 0, 0, .26);
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_close_icon_x1.png');
- background-position: center center;
- background-repeat: no-repeat;
- }
- .gig-comments-hires-icons *.gig-media-cancel {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_close_icon_x2.png');
- }
- *.gig-media-cancel:hover {
- background-color: #ebebeb;
- }
- *.gig-comment-mediaitem {
- margin-top: 7px;
- }
- *.gig-comment-content .gig-media-thumbnail-image {
- margin-left: 0px;
- margin-right: 0px;
- }
- *.gig-comment-content .gig-media-caption {
- margin: 8px 12px 0px 0px;
- }
- *.gig-composebox-media-preview {
- padding-left: 4px;
- padding-right: 4px;
- border-radius: 0px 0px 3px 3px;
- background-color: #fff;
- -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- -moz-box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- box-shadow: inset 0 0 5px rgba(0, 0, 0, .15);
- border: solid 1px #d5d5d5;
- border-top: none;
- padding-top: 23px;
- padding-bottom: 5px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_loader_gif_x1.gif');
- background-repeat: no-repeat;
- background-position: center center;
- }
- .gig-comments-hires-icons *.gig-composebox-media-preview {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/media_loader_gif_x2.gif');
- }
- *.gig-composebox-editor-with-media {
- border-radius: 3px 3px 0px 0px;
- }
- *.gig-comments-mediaplayer-dimmer {
- top: 0px;
- left: 0px;
- height: 100%;
- width: 100%;
- transition: opacity 0.25s;
- position: fixed;
- filter: 'alpha(opacity=50)';
- background-color: black;
- }
- *.gig-comments-mediaplayer {
- top: 50%;
- left: 50%;
- transition: opacity 0.25s;
- padding-left: 18px;
- padding-right: 18px;
- position: fixed;
- background-color: #ffffff;
- border-radius: 3px;
- }
- *.gig-comments-mediaplayer-top {
- height: 14px;
- padding-top: 3px;
- padding-bottom-2px;
- padding-right: 3px;
- }
- *.gig-comments-mediaplayer-top .gig-media-cancel {
- margin-right: -18px;
- padding-right: 0px;
- margin-top: 0px;
- }
- *.gig-comments-mediaplayer-bottom {
- margin: 5px 0px 5px 0px;
- background-color: #d5d6d6;
- border-radius: 3px;
- }
- *.gig-comments-mediaplayer-caption {
- background-size: contain;
- background-repeat: no-repeat;
- background-position: left;
- font-size: 13px;
- font-family: arial;
- padding-left: 23px;
- line-height: 17px;
- }
- *.gig-comments-updates {
- transition-property: opacity, height;
- height: 0;
- opacity: 0;
- visibility: hidden;
- border-radius: 3px;
- background-color: #90D890;
- }
- *.gig-comments-updates-visible {
- opacity: 1;
- visibility: visible;
- height: 25px;
- margin: 5px 0;
- }
- *.gig-comments-updates-text {
- text-align: center;
- line-height: 25px;
- color: #FFFFFF;
- font-weight: bold;
- }
- *.gig-comments-updates-link {
- cursor: pointer;
- font-size: 12px;
- color: #FFFFFF;
- }
- *.gig-comments-updates-full {
- text-align: right;
- }
- *.gig-comments-updates-full .gig-comments-updates-link {
- display: inline-block;
- line-height: 25px;
- top: -25px;
- position: relative;
- margin-right: 11px;
- padding-left: 15px;
- background-repeat: no-repeat;
- background-position: left center;
- background-size: 11px 11px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Pause_Stream_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-updates-full .gig-comments-updates-link {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Pause_Stream_x2.png')
- }
- *.gig-comments-updates-full .gig-comments-updates-link:hover {
- background-size: 11px 11px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Pause_Stream_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-updates-full .gig-comments-updates-link:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Pause_Stream_hover_x2.png')
- }
- *.gig-comments-updates-full.gig-comments-updates-paused .gig-comments-updates-link {
- background-size: 11px 11px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Resume_Stream_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-updates-full.gig-comments-updates-paused .gig-comments-updates-link {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Resume_Stream_x2.png')
- }
- *.gig-comments-updates-full.gig-comments-updates-paused .gig-comments-updates-link:hover {
- background-size: 11px 11px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Resume_Stream_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-comments-updates-full.gig-comments-updates-paused .gig-comments-updates-link:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Resume_Stream_hover_x2.png')
- }
- *.gig-comments-updates-countonly {
- text-align: center;
- }
- *.gig-comments-updates-countonly .gig-comments-updates-text {
- display: inline-block
- }
- *.gig-comments-updates-countonly .gig-comments-updates-link {
- display: inline-block;
- margin-left: 5px;
- font-weight: bold;
- text-decoration: underline;
- }
- *.gig-comments-updates-countonly .gig-comments-updates-link:hover {
- text-decoration: none;
- }
- *.gig-comment-title * {
- vertical-align: bottom;
- display: inline-block;
- }
- *.gig-comment-title {
- margin-bottom: 8px;
- }
- *.gig-comment-rating-drop {
- margin: 0 3px;
- cursor: pointer;
- width: 13px;
- height: 14px;
- 0 7px 0 2px;
- vertical-align: bottom;
- background-repeat: no-repeat;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rating_Drop_Icon_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-rating-drop {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rating_Drop_Icon_x1.png')
- }
- *.gig-comment-rating-drop:hover,
- *.gig-comment-rating-drop-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rating_Drop_Icon_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-rating-drop:hover,
- *.gig-comment-rating-drop-down {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Rating_Drop_Icon_hover_x1.png')
- }
- *.gig-comment-rating-title,
- *.gig-comment-rating-value,
- *.gig-composebox-rating-title,
- *.gig-composebox-rating-value {
- display: inline-block;
- vertical-align: top;
- }
- *.gig-comment-rating-title {
- margin: 0 10px 0 0;
- vertical-align: bottom;
- min-width: 53px;
- }
- *.gig-composebox-rating-value {
- margin-left: 3px;
- }
- *.gig-composebox-rating-title {
- margin-right: 10px;
- vertical-align: bottom;
- }
- *.gig-comment-rating-star,
- *.gig-composebox-rating-star,
- *.gig-selfreview-rating-star {
- display: inline-block;
- vertical-align: bottom;
- background-repeat: no-repeat;
- padding-right: 3px;
- width: 16px;
- height: 16px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_gray_small_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-rating-star,
- .gig-comments-hires-icons *.gig-composebox-rating-star,
- .gig-comments-hires-icons *.gig-selfreview-rating-star {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_gray_small_x2.png')
- }
- *.gig-comment-rating-star-full,
- *.gig-composebox-rating-star-full,
- *.gig-selfreview-rating-star-full {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_yellow_small_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-rating-star-full,
- .gig-comments-hires-icons *.gig-composebox-rating-star-full,
- .gig-comments-hires-icons *.gig-selfreview-rating-star-full {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_yellow_small_x2.png')
- }
- *.gig-comment-rating-dimensions {
- display: inline-block;
- margin-top: 9px;
- position: absolute;
- padding: 10px;
- background-color: #FFFFFF;
- box-shadow: -1px 2px 1px rgba(35, 31, 32, .07);
- border: 1px solid #B0B0B0;
- border-radius: 2px;
- white-space: nowrap
- }
- *.gig-comment-rating-dimensions:before {
- margin-left: -7px;
- content: "";
- width: 13px;
- height: 7px;
- display: inline-block;
- position: absolute;
- top: -7px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sort_dropdown_triangle_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-rating-dimensions:before {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Sort_dropdown_triangle_x2.png')
- }
- *.gig-composebox-rating-star {
- cursor: pointer;
- }
- *.gig-composebox-ratings {
- margin-bottom: 5px;
- }
- *.gig-composebox-rating-_overall .gig-composebox-rating-value {
- margin-left: 0
- }
- *.gig-composebox-rating-_overall {
- font-weight: bold;
- margin: 5px 0;
- }
- *.gig-composebox-rating-_overall .gig-composebox-rating-star,
- *.gig-composebox-rating-_overall.gig-composebox-field-error:hover .gig-composebox-rating-star,
- *.gig-selfreview-rating-_overall .gig-selfreview-rating-star {
- padding-right: 4px;
- width: 21px;
- height: 20px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_gray_big_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-rating-_overall .gig-composebox-rating-star,
- .gig-comments-hires-icons *.gig-composebox-rating-_overall.gig-composebox-field-error:hover .gig-composebox-rating-star,
- .gig-comments-hires-icons *.gig-selfreview-rating-_overall .gig-selfreview-rating-star {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_gray_big_x2.png')
- }
- *.gig-composebox-rating-_overall .gig-composebox-rating-star-full,
- *.gig-composebox-rating-_overall.gig-composebox-field-error:hover .gig-composebox-rating-star-full,
- *.gig-selfreview-rating-_overall .gig-selfreview-rating-star-full {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_yellow_big_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-rating-_overall .gig-composebox-rating-star-full,
- .gig-comments-hires-icons *.gig-composebox-rating-_overall.gig-composebox-field-error:hover .gig-comments-hires-icons .gig-composebox-rating-star-full,
- .gig-comments-hires-icons *.gig-selfreview-rating-_overall .gig-selfreview-rating-star-full {
- background-size: contain;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_yellow_big_x2.png')
- }
- *.gig-composebox-rating-_overall.gig-composebox-field-error {
- border: none;
- }
- *.gig-composebox-rating-_overall.gig-composebox-field-error .gig-composebox-rating-star {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_red_big_x1.png')
- }
- .gig-comments-hires-icons *.gig-composebox-rating-_overall.gig-composebox-field-error .gig-composebox-rating-star {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Star_red_big_x2.png')
- }
- *.gig-comment-colored-background {
- border-radius: 4px;
- padding: 3px 6px 6px 6px;
- }
- div.gig-comment-pinned-background {
- background-color: #fffcd2;
- }
- *.gig-comment-withBadges *.gig-comment-header-right {
- text-align: right;
- }
- *.gig-comment-withBadges *.gig-comment-username {
- margin-bottom: 5px;
- }
- *.gig-composebox-withBadges *.gig-composebox-logout {
- display: block;
- }
- *.gig-composebox-withBadges *.gig-composebox-header-right {
- text-align: right;
- margin-bottom: 4px;
- }
- *.gig-composebox-withBadges *.gig-composebox-title {
- position: relative;
- bottom: 7px;
- }
- *.gig-comment-commentBadge {
- display: inline-block;
- font-size: 11px;
- font-weight: bold;
- background-repeat: no-repeat;
- padding-right: 22px;
- background-position: right;
- height: 17px;
- line-height: 17px;
- }
- *.gig-comment-userBadge {
- margin-bottom: 5px;
- margin-right: 6px;
- display: inline-block;
- font-size: 11px;
- font-weight: bold;
- line-height: 15px;
- }
- *.gig-badge-border {
- border: 1px solid;
- border-radius: 2px;
- padding: 0px 5px;
- }
- *.gig-comment .gig-comment-editbox {
- display: none;
- background-color: #F6F6F6;
- padding: 4px 6px 4px 6px;
- margin-left: -41px;
- }
- *.gig-comment .gig-comment-editbox .gig-composebox-ratings * {
- color: #585858;
- }
- *.gig-comment .gig-comment-editbox-open {
- display: block;
- margin-bottom: 10px;
- }
- *.gig-comment-editbox *.gig-composebox-close {
- display: inline-block;
- margin-left: 5px;
- cursor: pointer;
- width: 15px;
- height: 15px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x1.png');
- background-position: center;
- background-repeat: no-repeat;
- }
- .gig-comments-hires-icons *.gig-comment-editbox *.gig-composebox-close {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/close_icon_x2.png');
- background-size: contain;
- }
- *.gig-comment-editbox *.gig-composebox-close:hover {
- background-color: #ebebeb;
- }
- *.gig-comment-edited {
- font-size: 11px;
- display: inline-block;
- margin: 2px 0 0 5px;
- float: right;
- font-style: italic;
- color: #999999
- }
- *.gig-comment-data-removed {
- margin-left: -41px;
- }
- *.gig-comment-data-removed .gig-comment-content {
- padding-left: 0px;
- }
- *.gig-comment-data-removed .gig-comment-body {
- color: #999999;
- font-size: 12px;
- font-style: italic;
- line-height: 16.5px;
- }
- *.gig-comment-data-removed .gig-comment-footer {
- margin: 4px 0px 10px;
- padding-left: 0px;
- }
- *.gig-comment-data-removed .gig-comment-footer .gig-comment-footer-left .gig-comment-flag {
- display: none;
- }
- *.gig-comment-data-removed .gig-comment-footer-right,
- *.gig-comment-data-removed .gig-comment-header {
- display: none;
- }
- *.gig-comment-data-removed .gig-comment-replyLink,
- *.gig-comment-data-removed .gig-comment-likeLink,
- *.gig-comment-data-removed .gig-comment-shareLink,
- *.gig-comment-data-removed .gig-comment-deleteLink,
- *.gig-comment-data-removed .gig-comment-editLink {
- display: none;
- }
- *.gig-comment-data-removed .gig-comment-content {
- transition: none;
- -webkit-transition: none
- }
- *.gig-comment-data-removed .gig-comment-content {
- transition: none;
- -webkit-transition: none
- }
- *.gig-comment-title-removed {
- display: none;
- }
- *.gig-comment-photo-removed {
- display: none;
- }
- .gig-comments-container * {
- font-size: 12px;
- transition: none 500ms cubic-bezier(0.785, 0.135, 0.15, 0.86);
- -webkit-transition: none 500ms cubic-bezier(0.785, 0.135, 0.15, 0.86)
- }
- *.gig-comments-linksContainer li:hover,
- *.gig-comments-linksContainer a:hover {
- text-decoration: underline;
- text-decoration-skip: all
- }
- *.gig-comment-vote-pos:hover {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-vote-pos:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_hover_x2.png')
- }
- *.gig-comment-vote-neg:hover {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_hover_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-vote-neg:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_hover_x2.png')
- }
- *.gig-comment-footer li:hover,
- *.gig-comment-repliesArrow:hover div {
- text-decoration: underline
- }
- *.gig-comment-self-data:hover *.gig-comment-flag,
- *.gig-comment-flag-visible {
- visibility: visible;
- }
- *.gig-comment-vote-pos-down:hover {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_pressed_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-vote-pos-down:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_up_pressed_x2.png')
- }
- *.gig-comment-vote-neg-down:hover {
- background-size: 14px 14px;
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_pressed_x1.png')
- }
- .gig-comments-hires-icons *.gig-comment-vote-neg-down:hover {
- background-image: url('http://cdn3.gigya.com/gs/i/comments2/Thumbs_down_pressed_x2.png')
- }
- </style>
- <style type="text/css">
- .gig-bar-container *,
- div.gig-reactions-container,
- .gig-reactions-container span,
- .gig-reactions-container a:hover,
- .gig-reactions-container a:visited,
- .gig-reactions-container a:link,
- .gig-reactions-container a:active {
- font-size: 12px;
- border: none;
- padding: 0px;
- margin: 0px;
- color: inherit;
- text-decoration: none;
- width: auto;
- float: none;
- -moz-border-radius: 0;
- border-radius: 0;
- font-family: arial;
- font-size: 10px;
- color: #4D4D4D;
- background: none
- }
-
- table.gig-reactions-container {
- border-collapse: separate;
- }
-
- div.gig-button-container {
- padding: 0 5px 0 0;
- display: inline-block;
- vertical-align: top;
- margin-bottom: 5px;
- }
-
- div.gig-button-container-vertical {
- padding: 0 0 5px 0
- }
-
- [gigid="showShareBarUI"] .gig-button-container-twitter-tweet &gt;
- div {
- display: inline;
- }
-
- div.gig-button {
- cursor: pointer;
- }
-
- div.gig-button-disabled {
- cursor: default;
- }
-
- div.gig-counter {
- margin: 0 auto;
- position: relative;
- zoom: 1;
- }
-
- span.gig-counter-text {
- display: block;
- position: relative;
- font-weight: bold;
- zoom: 1
- }
-
- td.gig-button-td {
- vertical-align: middle
- }
-
- *.gig-bar-container img {
- display: block
- }
-
- div.gig-button-container-twitter-tweet iframe,
- div.gig-button-container-twitter-hashtag iframe,
- div.gig-button-container-twitter-mention iframe {
- display: block
- }
-
- div.gig-button-container-pinterest-pinit {
- height: 20px;
- }
-
- div.gig-button-container-pinterest-pinit a {
- cursor: pointer;
- }
-
- div.gig-button-container-pinterest-pinit.gig-button-container-count-right {
- width: 80px;
- }
-
- div.gig-button-container-pinterest-pinit.gig-button-container-count-top.gig-button-container-vertical {
- position: relative;
- height: 50px;
- }
-
- div.gig-button-container-pinterest-pinit.gig-button-container-count-top.gig-button-container-vertical &gt;
- div {
- position: absolute;
- bottom: 2px;
- }
-
- div.gig-counter-top {
- margin-bottom: 1px;
- }
-
- div.gig-counter-right {
- margin-left: 1px;
- }
-
- div.gig-button-count-top table {
- margin: 0 auto;
- text-align: center;
- }
-
- div.gig-bar-button-icon {
- position: absolute;
- padding-top: 1px;
- }
-
- span.gig-bar-button-text {
- padding-left: 19px;
- white-space: nowrap;
- zoom: 1;
- }
-
- a.gig-bar-button,
- a:hover.gig-bar-button,
- a:link.gig-bar-button,
- a:active.gig-bar-button,
- a:visited.gig-bar-button {
- white-space: nowrap;
- line-height: 18px;
- position: relative;
- border-radius: 3px;
- color: #4d4d4d;
- cursor: pointer;
- font-size: 11px;
- padding: 0 5px;
- border: 1px solid #C5C7C7;
- display: inline-block;
- zoom: 1;
- vertical-align: middle;
- text-align: center;
- }
-
- a.gig-bar-button,
- a:link.gig-bar-button,
- a:active.gig-bar-button,
- a:visited.gig-bar-button {
- background: #FFFFFF;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFF", endColorstr="#EAEBEB");
- background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#EAEBEB));
- background: -moz-linear-gradient(top, #FFFFFF, #EAEBEB)
- }
-
- a:hover.gig-bar-button,
- a.gig-bar-button-down,
- a:link.gig-bar-button-down,
- a:active.gig-bar-button-down,
- a:visited.gig-bar-button-down {
- background: #EAEBEB;
- filter: progid: DXImageTransform.Microsoft.gradient(startColorstr="#EAEBEB", endColorstr="#FFFFFF");
- background: -webkit-gradient(linear, left top, left bottom, from(#EAEBEB), to(#FFFFFF));
- background: -moz-linear-gradient(top, #EAEBEB, #FFFFFF)
- }
- </style>
- <style type="text/css">
- div.gig-button-text {
- white-space: nowrap;
- font-size: 11px;
- color: #333333;
- padding: 0 3px 0 3px;
- }
-
- span.gig-counter-text-right {
- left: 1px;
- font-size: 11px;
- line-height: 20px;
- }
-
- span.gig-counter-text-top {
- top: -2px;
- font-size: 14px
- }
-
- div.gig-button-container-facebook-like-count-right {
- height: 20px
- }
-
- div.gig-button-container-facebook-like-count-top {
- height: 62px
- }
-
- div.gig-button-container-facebook-send {
- height: 20px
- }
- </style>
<script async="" type="text/javascript" charset="UTF-8" src="http://cdn.gigya.com/js/gigya.services.socialize.plugins.simpleshare.min.js"></script>
<script async="" type="text/javascript" charset="UTF-8" src="http://cdn1.gigya.com/js/gigya.services.socialize.plugins.shareCounts.min.js"></script>
</head>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html
index 46a3f3212..d1e6dc0bf 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/buzzfeed-1/expected.html
@@ -12,22 +12,20 @@
<p>She added: “They never stood a chance of saving her. She burned and crashed.”</p>
</div>
<div id="superlist_3758406_5547140" rel:buzz_num="3">
- <div>
<div>
<div>
- <p><img height="412" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" width="203"></img></p>
+ <p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" height="412" width="203"></p>
</div>
<p>Facebook</p>
</div>
<div>
<div>
- <p><img height="412" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" width="412"></img></p>
+ <p><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" height="412" width="412"></p>
</div>
<p>Facebook</p>
</div>
</div>
- </div>
<div id="superlist_3758406_5547284" rel:buzz_num="4">
<p>West Mercia police <a href="https://www.westmercia.police.uk/article/9500/Warning-Issued-As-Shrewsbury-Woman-Dies-After-Taking-Suspected-Diet-Pills">said the tablets were believed to contain dinitrophenol</a>, known as DNP, which is a highly toxic industrial chemical. </p>
<p>“We are undoubtedly concerned over the origin and sale of these pills and are working with partner agencies to establish where they were bought from and how they were advertised,” said chief inspector Jennifer Mattinson from the West Mercia police.</p>
@@ -36,6 +34,7 @@
</div>
<div id="superlist_3758406_5547219" rel:buzz_num="5">
<h2>Fiona Parry issued a plea for people to stay away from pills containing the chemical.</h2>
+
<p>“[Eloise] just never really understood how dangerous the tablets that she took were,” she said. “Most of us don’t believe that a slimming tablet could possibly kill us.</p>
<p>“DNP is not a miracle slimming pill. It is a deadly toxin.”</p>
</div>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-images.json
new file mode 100644
index 000000000..8a74adf2f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-images.json
@@ -0,0 +1,6 @@
+[
+ "https:\/\/cdn.citylab.com\/media\/img\/citylab\/2019\/04\/mr1\/facebook.jpg?1556645448",
+ "https:\/\/cdn.citylab.com\/media\/img\/citylab\/2019\/04\/mr1\/300.jpg?mod=1556645448",
+ "https:\/\/cdn.theatlantic.com\/assets\/media\/img\/posts\/2019\/04\/AP_8912060228\/cbd32b0e1.jpg",
+ "https:\/\/cdn.theatlantic.com\/assets\/media\/img\/posts\/2019\/04\/AP_945361213236\/888fdd750.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-metadata.json
new file mode 100644
index 000000000..6ec809e6b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Sarah Archer",
+ "Direction": null,
+ "Excerpt": "The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.",
+ "Image": "https:\/\/cdn.citylab.com\/media\/img\/citylab\/2019\/04\/mr1\/facebook.jpg?1556645448",
+ "Title": "The Modern Ambitions Behind Neon",
+ "SiteName": "CityLab"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected.html
new file mode 100644
index 000000000..2ad9f8673
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/expected.html
@@ -0,0 +1,108 @@
+<article itemscope="itemscope" itemtype="https://schema.org/NewsArticle" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <meta itemprop="datePublished" content="2019-04-30T13:39:00-04:00">
+ <meta itemprop="dateModified" content="2019-04-30T13:40:00-04:00">
+ <meta itemprop="mainEntityOfPage" content="https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/">
+
+ <figure itemprop="image" itemscope="itemscope" itemtype="http://schema.org/ImageObject">
+ <picture><source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/940.jpg?mod=1556645448" media="(min-width: 1024px)"> <source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/lead_large.jpg?mod=1556645448" media="(min-width: 576px)"></picture>
+ <meta itemprop="height" content="128">
+ <meta itemprop="width" content="300">
+ <meta itemprop="url" content="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448"><picture><source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" media="(max-width: 575px)"><img src="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" alt srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448"></picture>
+ <figcaption>
+ <span itemprop="caption">The Moulin Rouge cabaret in Paris</span> <span itemprop="creator">Benoit Tessier/Reuters</span>
+ </figcaption>
+ </figure>
+ <div>
+ <h2 itemprop="headline">
+ Why Neon Is the Ultimate Symbol of the 20th Century
+ </h2>
+
+ </div>
+ <h2 itemprop="description">
+ The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.
+ </h2>
+
+ <section id="article-section-1">
+ <p>
+ In the summer of 1898, the Scottish chemist Sir William Ramsay made a discovery that would eventually give the Moulin Rouge in Paris, the Las Vegas Strip, and New York’s Times Square their perpetual nighttime glow. Using the boiling point of argon as a reference point, Ramsay and his colleague Morris W. Travers isolated three more noble gases and gave them evocative Greek names: neon, krypton, and xenon. In so doing, the scientists bestowed a label of permanent novelty on the most famous of the trio—neon, which translates as “new.” This discovery was the foundation on which the French engineer Georges Claude crafted a new form of illumination over the next decade. He designed glass tubes in which neon gas could be trapped, then electrified, to create a light that glowed reliably for more than 1,000 hours.
+ </p>
+ <p>
+ In the 2012 book <em>L’être et le Néon</em>, <a href="https://mitpress.mit.edu/books/being-and-neonness-translation-and-content-revised-augmented-and-updated-edition-luis-de-miranda">which has been newly translated into English by Michael Wells</a>, the philosopher Luis de Miranda weaves a history of neon lighting as both artifact and metaphor. <em>Being and Neonness</em>, as the book is called in its English edition, isn’t a typical material history. There are no photographs. Even de Miranda’s own example of a neon deli sign spotted in Paris is re-created typographically, with text in all caps and dashes forming the border of the sign, as one might attempt on Twitter. Fans of Miami Beach’s restored Art Deco hotels and California’s bowling alleys might be disappointed by the lack of glossy historical images. Nonetheless, de Miranda makes a convincing case for neon as a symbol of the grand modern ambitions of the 20th century.
+ </p>
+
+ <p>
+ De Miranda beautifully evokes the notion of neon lighting as an icon of the 1900s in his introduction: “When we hear the word <em>neon</em>, an image pops into our heads: a combination of light, colors, symbols, and glass. This image is itself a mood. It carries an atmosphere. It speaks … of the essence of cities, of the poetry of nights, of the 20th century.” When neon lights debuted in Europe, they seemed dazzlingly futuristic. But their husky physicality started becoming obsolete by the 1960s, thanks in part to the widespread use of plastic for fluorescent signs. Neon signs exist today, though they’ve been eclipsed by newer technologies such as digital billboards, and they remain charmingly analog: Signs must be made by hand because there’s no cost-effective way to mass-produce them.
+ </p>
+ <p>
+ In the 1910s, neon started being used for cosmopolitan flash in Paris at precisely the time and place where the first great modernist works were being created. De Miranda’s recounting of the ingenuity emerging from the French capital a century ago is thrilling to contemplate: the cubist art of Pablo Picasso, the radically deconstructed fashions of Coco Chanel, the stream-of-consciousness poetry of Gertrude Stein, and the genre-defying music of Claude Debussy—all of which heralded a new age of culture for Europe and for the world.
+ </p>
+ </section>
+
+ <section id="article-section-2">
+ <p>
+ Amid this artistic groundswell, Georges Claude premiered his neon lights at the <a href="https://www.mondial-paris.com/en/visiteur/auto">Paris Motor Show</a> in December 1910, captivating visitors with 40-foot-tall tubes affixed to the building’s exterior. The lights shone orange-red because neon, by itself, produces that color. <em>Neon lighting</em> is a catchall term that describes the technology of glass tubing that contains gas or chemicals that glow when electrified. For example, neon fabricators use carbon dioxide to make white, and mercury to make blue. Claude acknowledged at the time that neon didn’t produce the ideal color for a standard light bulb and insisted that it posed no commercial threat to incandescent bulbs.
+ </p>
+ <p>
+ Of course, the very quality that made neon fixtures a poor choice for interior lighting made them perfect for signs, de Miranda notes. The first of the neon signs was switched on in 1912, advertising a barbershop on Paris’s Boulevard Montmartre, and eventually they were adopted by cinemas and nightclubs. While Claude had a monopoly on neon lighting throughout the 1920s, the leaking of trade secrets and the expiration of a series of patents broke his hold on the rapidly expanding technology.
+ </p>
+ </section>
+
+ <section id="article-section-3">
+ <p>
+ In the following decades, neon’s nonstop glow and vibrant colors turned ordinary buildings and surfaces into 24/7 billboards for businesses, large and small, that wanted to convey a sense of always being open. The first examples of neon in the United States debuted in Los Angeles, where the Packard Motor Car Company commissioned two large blue-and-orange <span>Packard</span> signs that literally stopped traffic because they distracted motorists. The lighting also featured heavily at the Chicago Century of Progress Exposition in 1933 and at the 1939 World’s Fair in New York. At the latter event, a massive neon sign reading <span>Futurama</span> lit the way to a General Motors exhibition that heralded “The World of Tomorrow.”
+ </p>
+ <figure>
+ <picture><img alt data-srcset="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_8912060228/cbd32b0e1.jpg" src="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_8912060228/cbd32b0e1.jpg"></picture>
+ <figcaption>
+ Workers remove a hammer and sickle from a neon sign that reads “Glory to Communism,” visible on the roof of the Communist-run electricity-board headquarters in Czechoslovakia in 1989. (AP)
+ </figcaption>
+ </figure>
+ <p>
+ De Miranda points out that businesses weren’t alone in embracing neon’s ability to spread messages effectively. By the middle of the century, the lighting was being adopted for more political purposes. “In the 1960s, the Soviets deployed a vast ‘neonization’ of the Eastern bloc capitals to emulate capitalist metropolises,” de Miranda writes. “Because consumer shops were rare in the Polish capital [of Warsaw], they did not hesitate to illuminate the façades of public buildings.” In other words, as opposed to the sole use of the more obvious forms of propaganda via posters or slogans, the mass introduction of neon lighting was a way of getting citizens of Communist cities to see their surroundings with the pizzazz and nighttime glamour of major Western capitals.
+ </p>
+ </section>
+
+ <section id="article-section-4">
+ <p>
+ Neon, around this time, began to be phased out, thanks to cheaper and less labor-intensive alternatives. In addition, the global economic downturn of the 1970s yielded a landscape in which older, flickering neon signs, which perhaps their owners couldn’t afford to fix or replace, came to look like symbols of decline. Where such signs were once sophisticated and novel, they now seemed dated and even seedy.
+ </p>
+ <section>
+ <h2>
+ Cities are changing fast. Keep up with the <b>CityLab Daily</b> newsletter.
+ </h2><label for="promo-email-input-email">The best way to follow issues you care about.</label>
+
+ </section>
+ <p>
+ De Miranda understands this evolution by zooming out and looking at the 1900s as the “neon century.” The author draws a parallel between the physical form of neon lights, which again are essentially containers for electrified gases, and that of a glass capsule—suggesting they are a kind of message in a bottle from a time before the First World War. “Since then, [neon lights] have witnessed all the transformations that have created the world we live in,” de Miranda writes. “Today, they sometimes seem to maintain a hybrid status, somewhere between junkyards and museums, not unlike European capitals themselves.”
+ </p>
+ <figure>
+ <picture><img alt data-srcset="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_945361213236/888fdd750.jpg" src="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_945361213236/888fdd750.jpg"></picture>
+ <figcaption>
+ Martin Wartman, a student at Northern Kentucky University, works on a neon sign at the Neonworks of Cincinnati workshop connected to the American Sign Museum, in 2016. (John Minchillo / AP)
+ </figcaption>
+ </figure>
+ <p>
+ Another mark of neon’s hybridity: Its obsolescence started just as some contemporary artists began using the lights in their sculptures. Bruce Nauman’s 1968 work <em><a href="https://www.stedelijk.nl/en/collection/1097-bruce-nauman-my-name-as-though-it-were-written-on-the-surface-of-the-moon">My Name as Though It Were Written on the Surface of the Moon</a></em> poked fun at the space race—another symbol of 20th-century technological innovation whose moment has passed. The piece uses blue “neon” letters (mercury, actually) to spell out the name “bruce” in lowercase cursive, with each character repeated several times as if to convey a person speaking slowly in outer space. The British artist Tracey Emin has made <a href="https://www.artsy.net/collection/tracey-emin-neon-sculptures-and-prints">sculptures</a> that resemble neon Valentine’s Day candies: They read as garish and sentimental confections with pink, heart-shaped frames that surround blue text fragments. Drawing on the nostalgia-inducing quality of neon, the sculptures’ messages are redolent of old-fashioned movie dialogue, with titles such as “You Loved Me Like a Distant Star” and “The Kiss Was Beautiful.”
+ </p>
+ <p>
+ Seeing neon lighting tamed in the context of a gallery display fits comfortably with de Miranda’s notion that neon technology is like a time capsule from another age. In museums, works of neon art and design coexist with objects that were ahead of their own time in years past—a poignant fate for a technology that made its name advertising “The World of Tomorrow.” Yet today neon is also experiencing a kind of craft revival. The fact that it can’t be mass-produced has made its fabrication something akin to a cherished artisanal technique. Bars and restaurants hire firms such as Let There Be Neon in Manhattan, or <a href="https://www.instagram.com/theneonqueen/">the L.A.-based master neon artist Lisa Schulte</a>, to create custom signs and works of art. Neon’s story even continues to glow from inside museums such as California’s <a href="https://www.neonmona.org/">Museum of Neon Art</a> and the Neon Museum in Las Vegas. If it can still be a vital medium for artists and designers working today, “neonness” need not only be trapped in the past. It might also capture the mysterious glow of the near future—just as it did a century ago.
+ </p>
+ <p>
+ <em>This article originally appeared on <a href="https://www.theatlantic.com/entertainment/archive/2019/04/being-and-neonness-neon-lights-symbol-20th-century/588184/">The Atlantic</a>.</em>
+ </p>
+ </section>
+ <section data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/author-article.cf4e8e0b143f.css">
+ <h4>
+ About the Author
+ </h4>
+ <div itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
+ <h5 itemprop="name">
+ <a href="https://www.citylab.com/authors/sarah-archer/">Sarah Archer</a>
+ </h5>
+
+ <p itemprop="description">
+ <a href="https://www.citylab.com/authors/sarah-archer/" data-omni-click="inherit">Sarah Archer</a> is the author of <em>The Midcentury Kitchen</em>.
+ </p>
+ </div>
+ </section>
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/source.html
new file mode 100644
index 000000000..710206187
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/citylab-1/source.html
@@ -0,0 +1,683 @@
+<!DOCTYPE html>
+<html lang="en" class="no-js" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <title>
+ A Brief History of Neon Signage - CityLab
+ </title>
+ <link rel="preload" as="font" crossorigin="" type="font/woff2" href="https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-Bold.087e7099415d.woff2" onload="performance.mark(&quot;citylab_pfdintextcondpro_loaded&quot;)" />
+ <link rel="preload" as="font" crossorigin="" type="font/woff2" href="https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/DalaFloda-Bold.e4a83f9528a6.woff2" onload="performance.mark(&quot;citylab_dala_loaded&quot;)" />
+ <style>
+ <![CDATA[
+ html{-webkit-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}@font-face{font-family:PFDINTextCondPro;font-stretch:normal;font-style:normal;font-weight:400;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-Regular.e3d3da5ff930.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-Regular.91850a57ef05.woff) format("woff")}@font-face{font-family:PFDINTextCondPro;font-stretch:normal;font-style:italic;font-weight:400;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-RegularItalic.5dbd98ad4797.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-RegularItalic.5da1a95ee80a.woff) format("woff")}@font-face{font-family:PFDINTextCondPro;font-stretch:normal;font-style:normal;font-weight:700;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-Bold.087e7099415d.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-Bold.2ffc3c8a5a27.woff) format("woff")}@font-face{font-family:PFDINTextCondPro;font-stretch:normal;font-style:italic;font-weight:700;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-BoldItalic.f3c72529a50c.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/PFDINTextCondPro-BoldItalic.9468cbb520b6.woff) format("woff")}@font-face{font-family:Dala Floda Web;font-stretch:normal;font-style:normal;font-weight:700;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/DalaFloda-Bold.e4a83f9528a6.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/DalaFloda-Bold.51f469f66a2e.woff) format("woff")}@font-face{font-family:Dala Floda Web;font-stretch:normal;font-style:italic;font-weight:700;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/DalaFloda-BoldItalic.f4ec64769a00.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/DalaFloda-BoldItalic.8b3e2184bf49.woff) format("woff")}@font-face{font-family:Roboto;font-stretch:normal;font-style:normal;font-weight:400;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/Roboto-Regular-webfont.33b16009b506.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/Roboto-Regular-webfont.3e5675c89f97.woff) format("woff")}@font-face{font-family:Roboto Slab;font-stretch:normal;font-style:normal;font-weight:700;src:url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/RobotoSlab-Bold-webfont.da1b352a7ba8.woff2) format("woff2"),url(https://cdn.citylab.com/static/a/frontend/dist/citylab/fonts/RobotoSlab-Bold-webfont.4d4a1b7008c2.woff) format("woff")}html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}main{display:block}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}input{overflow:visible}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}details{display:block}summary{display:list-item}menu{display:block}canvas{display:inline-block}template{display:none}[hidden]{display:none}a{color:#000;text-decoration:none;text-decoration:underline}a:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){a:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}blockquote{margin:1em 0}@media (min-width:49em){blockquote{padding:0 24px}}blockquote p{border-left:1px solid #b6b6b6;margin:0;padding:16px}body{font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;font-size:16px;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media (min-width:36em){body{font-size:18px}}@media (min-width:64em){body{font-size:20px}}figure{margin:0}.gsc-above-wrapper-area{height:110px}.gsc-above-wrapper-area table{height:100%;margin:0}h1,h2,h3,h4,h5,h6{font-family:Dala Floda Web,Georgia,Times,serif;line-height:1.125;margin:0}h1{font-size:48px}h2{font-size:40px}h3{font-size:36px}h4{font-size:32px}h5{font-size:28px}h6{font-size:20px}img{vertical-align:middle}.pullquote{font-family:Dala Floda Web,Georgia,Times,serif;font-size:24px;line-height:1.25;margin:1em 0;text-align:center}.pullquote:after,.pullquote:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;background-position-x:50%;background-repeat:no-repeat;background-size:80%;margin:0 auto;width:100%}.pullquote:before{background-position-y:100%;border-bottom:1px solid #b6b6b6;margin-bottom:24px}.pullquote:after{border-top:1px solid #b6b6b6;margin-top:24px}table,table.tg{border-collapse:collapse;border-spacing:0;margin:16px 0}table.tg td,table td{border-style:solid;border-width:1px;font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;font-size:14px;overflow:hidden;padding:8px 4px;word-break:normal}table.tg th,table th{border-style:solid;border-width:1px;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:14px;font-weight:400;overflow:hidden;padding:8px 4px;word-break:normal}.l-404:first-child{margin-top:16px}.l-404__message{margin-bottom:24px}.l-article__content{margin:0 auto;max-width:548px}@media (min-width:64em){.l-article__content{max-width:620px}}.l-article__hed{font-size:36px;line-height:1;margin-bottom:24px}@media (min-width:49em){.l-article__hed{font-size:40px}}@media (min-width:64em){.l-article__hed{font-size:48px;margin-bottom:8px}}.l-article__dek{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:18px;font-weight:700;line-height:1.375}@media (min-width:36em){.l-article__dek{display:block}}@media (min-width:64em){.l-article__dek{border-top:1px solid #b6b6b6;font-size:20px;padding:24px 0 0}}.l-article__byline{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:14px;font-weight:700;text-transform:uppercase}.l-article__meta{margin:0 auto 24px;max-width:660px}@media (min-width:75em){.l-article__meta{max-width:none}}.s-cms-content figure[style] picture{background-color:#f3f3f3}.s-cms-content img[data-srcset]{-webkit-transition:all 1s;transition:all 1s}.s-cms-content aside.series-ask-citylab{font-size:.95em;margin:1em}.s-cms-content figure{margin-bottom:16px;margin-top:16px}.s-cms-content figure img{height:auto;width:100%}.s-cms-content figcaption{color:#777;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:14px;font-weight:400}.s-cms-content .c-lead-image__attribution{font-family:PFDINTextCondPro,Arial,sans-serif}.s-cms-content table,.s-cms-content table.tg{width:100%!important}.s-cms-content table.tg tr:nth-child(2n),.s-cms-content table tr:nth-child(2n){background:#ececec}.s-cms-content table.tg td.tg-amwm,.s-cms-content table.tg th,.s-cms-content table td.tg-amwm,.s-cms-content table th{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:16px;font-weight:700}.s-cms-content table.tg td,.s-cms-content table td{border:0;font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;text-align:left}.s-cms-content .c-article-links,.s-cms-content .c-print-superscript{display:none}.s-cms-content .full-bleed{margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);max-width:none!important}@media (min-width:55.25em){.s-cms-content .full-bleed{margin-left:calc(50% - (50vw - 155px));margin-right:calc(50% - (50vw - 155px))}}.s-cms-content .full-bleed figcaption{margin:4px auto 0;max-width:960px;padding:0 16px}.s-cms-content h3,.s-cms-content h4{font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;margin:8px 0}.s-cms-content h4{font-size:24px}.s-cms-content iframe[src*="https://esrimedia.maps.arcgis.com/"]{padding:8px}.o-small-container{margin:0 auto;max-width:548px}@media (min-width:64em){.o-small-container{max-width:620px}}.oembed{margin-bottom:32px;position:relative}.oembed:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;left:0;margin:0 auto;position:absolute;right:0;-webkit-transform:translateY(100%);transform:translateY(100%);width:80%}.oembed figure{margin:0}.special-report{border:1px solid #b6b6b6;margin:0 auto;max-width:300px;padding:0 16px 16px;text-align:center}.special-report>*{font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700}.special-report a{color:#000;text-decoration:none}.special-report a:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.special-report a:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.special-report h4{font-size:20px}.special-report hr{display:none}.special-report img{width:100%}.special-report .go{margin-top:16px;text-transform:uppercase}.special-report .go a{background-color:#000;border:2px solid #000;border-radius:50%;color:#fff;line-height:1;padding:8px;position:relative}.special-report .go a:after{border:2px solid #fff;border-radius:50%;content:"";display:block;height:100%;left:0;position:absolute;top:0;width:100%}.special-report .go a:hover{background-color:#fff;border-color:#fff;color:#000;text-decoration:none}.special-report .go a:hover:after{border-color:#000}.special-report .module-tag{background-color:#000;color:#fff;display:inline-block;font-size:20px;padding:8px;text-transform:uppercase}.c-editors-note{font-size:14px;font-style:italic}.c-editors-note__date{display:block}.c-editors-note__date-label{color:#109b54}.c-foundation-line{border-top:1px solid #b6b6b6;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;line-height:1.25}.gsc-control-cse table,.gsc-control-cse td{border-style:none}.l-header{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 auto;max-width:940px}@media (min-width:36em){.l-header{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}@media (min-width:64em){.l-header{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.l-header:not(.l-header--homepage){border-bottom:1px solid #b6b6b6}}.l-main{margin:16px auto;max-width:940px}@media (min-width:64em){.l-main{margin-top:0}}.l-masthead{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.l-sponsored{background-color:#000;display:none;min-width:310px}@media (min-width:55.25em){.l-sponsored{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:310px;flex-basis:310px;-ms-flex-negative:0;flex-shrink:0}}.l-sponsored__inner{height:100vh;max-width:310px;position:fixed;width:100%}.l-sponsored__label{color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:12px;font-weight:700;margin:0;padding:1em;text-align:center;text-transform:uppercase}@media (min-width:55.25em){.l-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}}@media (min-width:55.25em){.l-content{-ms-flex-preferred-size:100%;flex-basis:100%}}.l-content__inner{margin:16px 8px 0}@media (min-width:36em){.l-content__inner{margin:16px 16px 0}}@media (min-width:55.25em){.l-content__inner{margin-top:32px}}.c-about{color:#fff;font-size:12px;margin:32px auto 0;text-align:center;width:280px}@media (min-width:36em){.c-about{margin-top:96px;width:292px}}.c-about__item{margin:0}.c-about__item:not(:last-child){margin-bottom:16px}gpt-ad,gpt-placeholder{display:block}.c-ad{display:block;width:100%}.c-ad.ad-loaded:before{color:#b6b6b6;content:"Advertisement";display:block;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;font-weight:700;letter-spacing:1.3px;line-height:2;text-align:center;text-transform:uppercase}.c-ad img{height:auto;width:100%}.c-ad--bleed{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}@media (min-width:55.25em){.c-ad--bleed{margin-left:calc(50% - (50vw - 155px));margin-right:calc(50% - (50vw - 155px))}}@media (min-width:55.25em){.c-ad--bleed{width:auto}}.c-ad--shade.ad-loaded{background:#b6b6b6;padding:16px 0}.c-ad--shade.ad-loaded:before{color:#000}.c-ad--presented-by.ad-loaded:before{content:""}.c-ad--article-logo.ad-loaded{width:auto}.c-ad-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:24px;width:100%}.c-ad--background.ad-loaded{background:#b6b6b6;padding:16px 0}.c-ad--background.ad-loaded:before{color:#000}@media (min-width:55.25em){.c-ad--container--sans-sidebar{display:none}}gpt-ad.ad-loaded.is-unlabeled:before{content:""!important}.c-author-header{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:24px;padding-top:16px}@media (min-width:36em){.c-author-header{-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:48px}}@media (min-width:64em){.c-author-header{-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:64px;padding-top:0}}.c-author-header__picture{margin-bottom:16px}@media (min-width:36em){.c-author-header__picture{margin-bottom:0;margin-right:16px}}.c-author-header__content{text-align:center}@media (min-width:36em){.c-author-header__content{-ms-flex-preferred-size:calc(100% - 216px);flex-basis:calc(100% - 216px);text-align:left}}.c-author-header__title{font-size:40px;line-height:1;margin-bottom:16px}@media (min-width:36em){.c-author-header__title{font-size:48px}}@media (min-width:64em){.c-author-header__title{font-size:60px}}.c-author-header__list{display:-webkit-box;display:-ms-flexbox;display:flex;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:16px;font-weight:700;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1;list-style:none;margin:0 0 16px;padding:0;text-transform:uppercase}@media (min-width:36em){.c-author-header__list{font-size:18px;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}}@media (min-width:64em){.c-author-header__list{font-size:20px}}.c-author-header__item{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex}.c-author-header__item:not(:last-child):after{content:"/";margin:0 16px}.c-author-header__bio{margin:0;text-align:left}@media (min-width:36em){.c-author-header__bio{font-size:18px}}.c-btn{border-radius:0;color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;line-height:1;position:relative;text-decoration:none;white-space:nowrap}.c-btn[disabled]{cursor:not-allowed;opacity:.8}.c-btn--signup,.c-btn--submit{background-color:#000;border:1px solid #000;cursor:pointer;padding:8px 16px}.c-btn--signup:hover,.c-btn--submit:hover{background-color:#fff;color:#000}.c-btn--footer{border-color:#fff}.c-btn--border-white{border:1px solid #fff;padding:8px 16px}.c-btn--border-white:hover{background-color:#fff;color:#000;text-decoration:none}.c-btn__loader{height:100%;left:0;position:absolute;top:0;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.is-loading .c-btn__loader{-webkit-transform:scale(1);transform:scale(1)}.c-btn--share{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:2px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;fill:#fff;font-size:14px;padding:8px 12px;text-transform:uppercase}.c-btn--facebook{background-color:#3b5998;color:#fff;text-decoration:none}.c-btn--facebook:hover{background-color:#2d4373;color:#fff;text-decoration:inherit}.c-btn--twitter{background-color:#1da1f2;color:#fff;text-decoration:none}.c-btn--twitter:hover{background-color:#0c85d0;color:#fff;text-decoration:inherit}.c-btn--more{background-color:#fff;color:#fff;text-decoration:none;border:1px solid #b6b6b6;fill:#000;padding:8px}.c-btn--more:hover{background-color:#e6e6e6;color:#fff;text-decoration:inherit}.c-btn__share-label{margin-top:4px}.c-btn--action-bar{background-color:#024637;border-radius:2px;color:#37ee67;letter-spacing:1px;padding:10px 12px 8px;text-transform:uppercase}.c-btn--action-bar:hover{background-color:#03785e;color:#37ee67;text-decoration:inherit}.c-btn--disqus-comments{background-color:#000;border:1px solid #000;cursor:pointer;display:block;font-size:20px;margin:0 auto;padding:16px 24px;position:relative;z-index:1}.c-btn--disqus-comments:hover{background-color:#fff;color:#000}.c-btn--pagination{background-color:#fff;color:#fff;text-decoration:none;border:1px solid #b6b6b6;color:#000;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:20px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;position:relative;width:100%}.c-btn--pagination:hover{background-color:#e6e6e6;color:#fff;text-decoration:inherit}.c-btn--pagination:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;left:0;margin:0 auto;position:absolute;right:0;-webkit-transform:translateY(100%);transform:translateY(100%);width:80%}.c-btn--pagination:hover{color:#000}.c-btn--pagination:not(:last-child){margin-bottom:32px}@media (min-width:36em){.c-btn--pagination:not(:last-child){margin-bottom:0;margin-right:24px}}@media (min-width:36em){.c-btn--pagination{margin:0 auto;max-width:300px}}.c-btn--more-stories{background-color:#fff;color:#fff;text-decoration:none;border:1px solid #b6b6b6;color:#000;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:20px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:16px;padding:24px;position:relative;width:100%}.c-btn--more-stories:hover{background-color:#e6e6e6;color:#fff;text-decoration:inherit}.c-btn--more-stories:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;left:0;margin:0 auto;position:absolute;right:0;-webkit-transform:translateY(100%);transform:translateY(100%);width:80%}.c-btn--more-stories:hover{color:#000}.c-btn--more-stories:not(:last-child){margin-bottom:32px}@media (min-width:36em){.c-btn--more-stories:not(:last-child){margin-bottom:0;margin-right:24px}}.c-byline{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:14px;font-weight:500;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;letter-spacing:1px;line-height:1.5;margin:0;text-transform:uppercase}@media (min-width:36em){.c-byline{font-size:16px}}.c-byline--most-popular{display:block}@media (min-width:49em){.c-byline--most-popular{display:-webkit-box;display:-ms-flexbox;display:flex}}.c-byline--homepage-item{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.c-byline--related-content,.c-byline--river{display:block}.c-byline--article__hed{display:block}.c-byline--article-most-popular{display:block}.c-byline__link--most-popular,.c-byline__link--related-content,.c-byline__link--river{display:block}@media (min-width:42.75em){.c-byline__link--homepage-item{color:#fff}}.c-byline__time--homepage-item{display:-webkit-box;display:-ms-flexbox;display:flex}.c-loader{-webkit-animation:a 1.5s infinite linear;animation:a 1.5s infinite linear;color:hsla(0,0%,71%,.6);height:16px;margin:0 28px;position:relative;text-indent:-9999em;-webkit-transform:skew(135deg);transform:skew(135deg);width:2px}@-webkit-keyframes a{0%,to{-webkit-box-shadow:-28px 0 #b6b6b6,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0 #b6b6b6,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0}12.5%{-webkit-box-shadow:-28px 0 hsla(0,0%,71%,.8),-20px 0 #b6b6b6,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0 hsla(0,0%,71%,.8),-20px 0 #b6b6b6,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0}25%{-webkit-box-shadow:-28px 0,-20px 0 hsla(0,0%,71%,.8),-12px 0 #b6b6b6,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0 hsla(0,0%,71%,.8),-12px 0 #b6b6b6,-4px 0,4px 0,12px 0,20px 0,28px 0}37.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0 hsla(0,0%,71%,.8),-4px 0 #b6b6b6,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0 hsla(0,0%,71%,.8),-4px 0 #b6b6b6,4px 0,12px 0,20px 0,28px 0}50%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0 hsla(0,0%,71%,.8),4px 0 #b6b6b6,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0 hsla(0,0%,71%,.8),4px 0 #b6b6b6,12px 0,20px 0,28px 0}62.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0 hsla(0,0%,71%,.8),12px 0 #b6b6b6,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0 hsla(0,0%,71%,.8),12px 0 #b6b6b6,20px 0,28px 0}75%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0 hsla(0,0%,71%,.8),20px 0 #b6b6b6,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0 hsla(0,0%,71%,.8),20px 0 #b6b6b6,28px 0}87.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0 hsla(0,0%,71%,.8),28px 0 #b6b6b6;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0 hsla(0,0%,71%,.8),28px 0 #b6b6b6}}@keyframes a{0%,to{-webkit-box-shadow:-28px 0 #b6b6b6,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0 #b6b6b6,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0}12.5%{-webkit-box-shadow:-28px 0 hsla(0,0%,71%,.8),-20px 0 #b6b6b6,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0 hsla(0,0%,71%,.8),-20px 0 #b6b6b6,-12px 0,-4px 0,4px 0,12px 0,20px 0,28px 0}25%{-webkit-box-shadow:-28px 0,-20px 0 hsla(0,0%,71%,.8),-12px 0 #b6b6b6,-4px 0,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0 hsla(0,0%,71%,.8),-12px 0 #b6b6b6,-4px 0,4px 0,12px 0,20px 0,28px 0}37.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0 hsla(0,0%,71%,.8),-4px 0 #b6b6b6,4px 0,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0 hsla(0,0%,71%,.8),-4px 0 #b6b6b6,4px 0,12px 0,20px 0,28px 0}50%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0 hsla(0,0%,71%,.8),4px 0 #b6b6b6,12px 0,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0 hsla(0,0%,71%,.8),4px 0 #b6b6b6,12px 0,20px 0,28px 0}62.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0 hsla(0,0%,71%,.8),12px 0 #b6b6b6,20px 0,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0 hsla(0,0%,71%,.8),12px 0 #b6b6b6,20px 0,28px 0}75%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0 hsla(0,0%,71%,.8),20px 0 #b6b6b6,28px 0;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0 hsla(0,0%,71%,.8),20px 0 #b6b6b6,28px 0}87.5%{-webkit-box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0 hsla(0,0%,71%,.8),28px 0 #b6b6b6;box-shadow:-28px 0,-20px 0,-12px 0,-4px 0,4px 0,12px 0,20px 0 hsla(0,0%,71%,.8),28px 0 #b6b6b6}}.c-featured{border:1px solid #b6b6b6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-bottom:16px;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;padding-bottom:16px;position:relative;text-align:center}.c-featured:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;margin:0 auto;position:absolute;width:100%}@media (min-width:36em){.c-featured{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:64em){.c-featured{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}.c-featured__list{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:auto;list-style:none;margin:0;padding:0}@media (min-width:36em){.c-featured__list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:100%}}.c-featured-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:16px}.c-featured-item:not(:last-child){border-bottom:1px dashed #b6b6b6}.c-featured-item__hed{-ms-flex-preferred-size:100%;flex-basis:100%;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;margin-bottom:4px}.c-featured__link--item{color:#000;text-decoration:none}.c-featured__link--item:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-featured__link--item:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-homepage-item__container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;line-height:1;margin-bottom:16px}@media (min-width:42.75em){.c-homepage-item__container{background-color:#000;color:#fff}}@media (min-width:36em){.c-homepage-item__container:last-child{margin-bottom:0}}@media (min-width:75em){.c-homepage-item__container--top{-ms-flex-preferred-size:calc(33.33333% - 0px);flex-basis:calc(33.33333% - 0px);margin-bottom:0;margin-right:16px}.c-homepage-item__container--top:last-child{margin-right:0}}@media (min-width:49em){.c-homepage-item__container--upper-mid{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}@media (min-width:36em){.c-homepage-item__container--upper-mid:nth-child(2){margin-bottom:0}}@media (min-width:49em){.c-homepage-item__container--upper-mid:nth-child(2){margin-bottom:16px}}.c-homepage-item__container--bottom{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px)}.c-homepage-item__container--bottom:nth-child(n+5){display:none}@media (min-width:42.75em){.c-homepage-item__container--bottom{-ms-flex-preferred-size:calc(50% - 8px);flex-basis:calc(50% - 8px);margin-right:16px}}@media (min-width:49em){.c-homepage-item__container--bottom{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);margin-right:0}}@media (min-width:55.25em){.c-homepage-item__container--bottom:nth-child(n+5){display:-webkit-box;display:-ms-flexbox;display:flex}}@media (min-width:36em){.c-homepage-item__container--bottom:nth-child(2n){margin-right:0}}.c-homepage-item__content{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;padding:8px}.c-homepage-item__title{color:#000;text-decoration:none;color:inherit;font-size:20px;margin:0 0 8px}.c-homepage-item__title:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-homepage-item__title:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-homepage-item__media{-ms-flex-preferred-size:144px;flex-basis:144px;-ms-flex-negative:0;flex-shrink:0;margin:0;max-width:144px;min-width:144px;padding-bottom:144px;position:relative}@media (min-width:49em){.c-homepage-item__media{-ms-flex-preferred-size:128px;flex-basis:128px;min-width:128px;padding-bottom:128px}}@media (min-width:64em){.c-homepage-item__media{-ms-flex-preferred-size:144px;flex-basis:144px;min-width:144px;padding-bottom:144px}}@media (min-width:75em){@supports ((-o-object-fit:cover) or (object-fit:cover)){.c-homepage-item__media--upper-mid{-ms-flex-preferred-size:192px;flex-basis:192px;max-width:none;padding-bottom:128px}}}.c-homepage-item__image{height:100%;width:100%}.c-homepage-item__media-object{display:block;height:100%;position:absolute;width:100%}.c-homepage-item__byline{font-size:10px}.c-hp{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-bottom:16px}@media (min-width:36em){.c-hp{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}.c-hp .c-byline{font-size:12px;line-height:1.125}@media (min-width:36em){.c-hp .c-byline{font-size:14px}}.c-hp-article-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-bottom:24px;width:100%}.c-hp--top{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.c-hp-promo-container{margin:0 auto 16px;width:100%}.c-hp-promo-container--top{margin-left:0;margin-right:0}@media (min-width:49em){.c-hp-promo-container--top{margin-bottom:24px}}@media (min-width:75em){.c-hp-promo-container--top{-ms-flex-preferred-size:calc(66.66667% - 0px);flex-basis:calc(66.66667% - 0px);margin-bottom:16px;-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}.c-hp-article-section--top{margin-bottom:16px}@media (min-width:42.75em){.c-hp-article-section--top{-ms-flex-preferred-size:calc(58.33333% - 0px);flex-basis:calc(58.33333% - 0px);margin-bottom:0;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}}@media (min-width:75em){.c-hp-article-section--top{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}}.c-hp-featured-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%}@media (min-width:42.75em){.c-hp-featured-container{-ms-flex-preferred-size:calc(41.66667% - 16px);flex-basis:calc(41.66667% - 16px);-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}@media (min-width:75em){.c-hp-featured-container{-ms-flex-preferred-size:calc(33.33333% - 16px);flex-basis:calc(33.33333% - 16px);margin-bottom:16px;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}.c-hp-featured-container .c-featured-item__hed{margin-bottom:0}.c-hp--upper-mid{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.c-hp-promo-container--upper-mid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;position:relative}@media (min-width:42.75em){.c-hp-promo-container--upper-mid{-ms-flex-preferred-size:calc(50% - 16px);flex-basis:calc(50% - 16px);-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media (min-width:49em){.c-hp-promo-container--upper-mid{margin-left:0;margin-right:16px;-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:42.75em){.c-hp-promo-container--upper-mid .c-promo--small{margin-bottom:0}}.c-hp-article-section--upper-mid{margin-bottom:0}@media (min-width:42.75em){.c-hp-article-section--upper-mid{-ms-flex-preferred-size:calc(50% - 0px);flex-basis:calc(50% - 0px)}}.c-hp--bottom{display:block}@media (min-width:49em){.c-hp--bottom{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}}@media (min-width:49em){.c-hp--bottom .c-ad-container{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.c-hp-article-section--bottom{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}@media (min-width:49em){.c-hp-article-section--bottom{-ms-flex-preferred-size:calc(50% - 0px);flex-basis:calc(50% - 0px);-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}@media (min-width:75em){.c-hp-article-section--bottom{-ms-flex-preferred-size:calc(33.33333% - 16px);flex-basis:calc(33.33333% - 16px);max-width:calc(33.33333% - 16px);-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}.c-icon{margin-right:4px}.c-icon--writers{height:10px;width:10px}.c-icon--share{height:16px;width:16px}.c-icon--more{margin-right:0}.c-icon--author-article{height:10px;width:10px}.c-icon--author-header{height:16px;width:16px}.c-icon--close{height:10px;width:10px}@media (min-width:36em){.c-icon--close{height:16px;width:16px}}#icon-logo{fill:inherit}#icon-logo .top{fill:currentColor}#icon-wordmark{fill:inherit}#icon-wordmark .dark{fill:currentColor}#icon-wordmark .light{fill:var(--wordmark-light)}.c-landing-header{padding:40px;text-align:center}@media (min-width:49em){.c-landing-header{padding:48px}}.c-landing-header--navigator{padding-bottom:0}.c-landing-header--partner-solutions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0 0 24px}@media (min-width:64em){.c-landing-header--partner-solutions{padding-bottom:48px}}.c-landing-header--partner-solutions .c-landing-header__title{margin-top:24px;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media (min-width:64em){.c-landing-header--partner-solutions .c-landing-header__title{margin-top:48px}}.c-landing-header--partner-solutions .c-landing-header__sub{background:#005aff;color:#fff;font-family:Roboto,sans-serif;font-size:12px;-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0;padding:8px;text-transform:uppercase}.c-landing-header__title{font-size:40px;line-height:1}@media (min-width:36em){.c-landing-header__title{font-size:48px}}@media (min-width:64em){.c-landing-header__title{font-size:60px}}.c-landing-header__dek{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:18px;font-weight:700;line-height:1.25;margin-top:16px}@media (min-width:64em){.c-landing-header__dek{font-size:20px;margin-top:24px}}.c-landing-header__sub{font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;line-height:1;padding:24px 8px;text-align:center}.c-lead-image{margin:0 auto 16px}@media (min-width:36em){.c-lead-image{margin-bottom:24px}}.c-lead-image__image{background-color:#b6b6b6;display:block;height:0;padding-bottom:42.66667%;position:relative}@media (min-width:36em){.c-lead-image__image{height:auto;padding-bottom:0}}.c-lead-image__img{left:0;position:absolute;top:0;height:100%;width:100%}@media (min-width:36em){.c-lead-image__img{position:relative}}.c-lead-image__credit{color:#777;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:14px;margin-top:4px}.c-lead-image__caption+.c-lead-image__attribution:before{content:" // "}.c-logo--footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-top:64px}@media (min-width:36em){.c-logo--footer{margin-top:96px}}@media (min-width:36em){.c-logo--action-bar{display:none}}.c-logo__link{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;height:34px;width:32px}.c-logo__icon{height:100%;width:auto}.c-logo__reference--footer{color:#fff;fill:#b6b6b6}.c-logo__reference--action-bar{color:#0ab961;fill:#0ab961}.c-masthead{border-top:1px solid #b6b6b6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;padding:16px 0}@media (min-width:36em){.c-masthead{-ms-flex-preferred-size:calc(50% - 8px);flex-basis:calc(50% - 8px);margin-right:16px}.c-masthead:nth-child(2n){margin-right:0}}@media (min-width:49em){.c-masthead{-ms-flex-preferred-size:calc(33.33333% - 10.66667px);flex-basis:calc(33.33333% - 10.66667px)}.c-masthead:nth-child(2n){margin-right:16px}.c-masthead:nth-child(3n){margin-right:0}}.c-masthead--see-all{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700}.c-masthead__img{height:52px;margin-right:16px;width:52px}.c-masthead__title{display:block;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;font-weight:700;line-height:1;margin-bottom:8px;text-transform:uppercase}.c-masthead__name{font-size:20px;margin-bottom:16px}.c-masthead__list{margin:0;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;font-weight:700;list-style:none;text-transform:uppercase}.c-masthead__item:not(:first-child):before{content:"/";margin:0 8px}.c-masthead__link{color:#000;text-decoration:none;text-decoration:underline}.c-masthead__link:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-masthead__link:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-masthead__link--name{text-decoration:none}.c-meta__byline{display:inline-block;list-style-type:none;margin:0;padding:0}.c-meta__byline:not(:last-child){margin-right:8px}.c-meta__byline--related-content{display:block}.c-meta__author{display:inline}.c-meta__author>a{color:#000}.c-meta__author:not(:last-child) span:after{content:" / "}.c-most-popular{border-bottom:1px solid #b6b6b6;border-top:1px solid #b6b6b6;margin-bottom:24px;margin-top:64px;position:relative}.c-most-popular:after{background-image:-webkit-gradient(linear,left top,right top,from(hsla(0,0%,100%,0)),color-stop(90%,#fff));background-image:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 90%);content:"";height:100%;pointer-events:none;position:absolute;right:0;top:0;width:20vw}@media (min-width:49em){.c-most-popular:after{content:normal}}@media (min-width:49em){.c-most-popular{border:1px solid #b6b6b6;-ms-flex-preferred-size:calc(50% - 16px);flex-basis:calc(50% - 16px);margin-top:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.c-most-popular:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";height:16px;pointer-events:none;display:block;position:relative;width:100%}}@media (min-width:75em){.c-most-popular{-ms-flex-preferred-size:calc(33.33333% - 16px);flex-basis:calc(33.33333% - 16px);margin-right:16px;margin-top:0;max-width:calc(33.33333% - 16px);-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}}.c-most-popular__title{background-color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700;line-height:1;left:0;padding-right:8px;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}@supports ((-webkit-transform:translateY(calc(-100% + 4px))) or (transform:translateY(calc(-100% + 4px)))){.c-most-popular__title{-webkit-transform:translateY(calc(-100% + 4px));transform:translateY(calc(-100% + 4px))}}.c-most-popular__title:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;margin-bottom:8px}@media (min-width:49em){.c-most-popular__title{left:50%;padding:0 4px;position:absolute;top:0;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.c-most-popular__title:before{content:normal}}.c-most-popular__container{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:auto;overflow-y:hidden;padding:16px 0;white-space:nowrap}.c-most-popular__container::-webkit-scrollbar,.c-most-popular__container::-webkit-scrollbar-thumb,.c-most-popular__container::-webkit-scrollbar-track{display:none}@media (min-width:49em){.c-most-popular__container{overflow:auto;padding:0;white-space:normal}}.c-most-popular__list{margin:0;padding:0;counter-reset:a;display:-webkit-box;display:-ms-flexbox;display:flex;list-style:none}@media (min-width:49em){.c-most-popular__list{display:block}}.c-most-popular__item{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:256px;flex-basis:256px;max-width:256px;min-width:256px;padding:16px 16px 16px 0;white-space:normal}.c-most-popular__item:not(:last-child){border-right:1px dashed #b6b6b6;margin-right:16px}.c-most-popular__item:before{content:counter(a);counter-increment:a;font-family:Dala Floda Web,Georgia,Times,serif;font-size:36px;line-height:13px;padding-right:16px}@media (min-width:49em){.c-most-popular__item:before{display:block;font-size:48px;line-height:1;margin-bottom:8px;padding-right:0}}@media (min-width:49em){.c-most-popular__item{display:block;max-width:100%;padding:16px;text-align:center;width:100%}.c-most-popular__item:not(:last-child){border-bottom:1px dashed #b6b6b6;border-right:0;margin-right:0}}.c-most-popular__hed{font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;font-size:16px;margin-bottom:4px}.c-most-popular__link{color:#000;text-decoration:none}.c-most-popular__link:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-most-popular__link:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-native{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;border:1px solid #005aff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;height:100%;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:16px;width:100%}.c-native:before{background-color:#005aff;color:#fff;content:"SPONSOR CONTENT";display:block;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:12px;font-weight:700;height:16px;letter-spacing:.8px;text-align:center;width:100%}.c-native__content{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:calc(100% - 324px);flex-basis:calc(100% - 324px);-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-family:Roboto,sans-serif;font-size:12px;padding:8px;position:relative;text-align:left;width:100%}@media (min-width:36em){.c-native__content{padding-left:16px}}.c-native__media{-ms-flex-preferred-size:144px;flex-basis:144px;-ms-flex-negative:0;flex-shrink:0;height:100%;margin:0;max-width:144px;padding-bottom:128px;position:relative}@media (min-width:49em){.c-native__media{-ms-flex-preferred-size:236px;flex-basis:236px;max-width:none;padding-bottom:148px}}@media (min-width:64em){.c-native__media{-ms-flex-preferred-size:300px;flex-basis:300px;padding-bottom:169px}}.c-native__advertiser,.c-native__dek,.c-native__title{margin:0;max-width:100%}.c-native__title{font-family:Roboto Slab,serif;font-size:20px;font-weight:700;line-height:1.125}@media (min-width:36em){.c-native__title{font-size:24px}}@media (min-width:75em){.c-native__title{font-size:32px}}.c-native__advertiser{margin-bottom:4px}.c-native__dek{display:none;line-height:1.5}@media (min-width:49em){.c-native__dek{display:block}}@media (min-width:64em){.c-native__dek{font-size:14px}}.c-native .c-native__image{height:100%;width:100%}.c-native__media-object{display:block;height:100%;position:absolute;width:100%}.c-native__link{max-width:100%;text-decoration:none}.c-native__link:hover{text-decoration:none}.s-native--hp-top{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}@media (min-width:36em){.s-native--hp-top{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media (min-width:36em){.s-native--hp-top .c-native{margin-bottom:0}}@media (min-width:49em){.s-native--hp-top .c-native{display:block}}@media (min-width:36em){.s-native--hp-top .c-native__content{padding-left:8px}}@media (min-width:49em){.s-native--hp-top .c-native__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);padding:8px 16px;text-align:center}}@media (min-width:49em){.s-native--hp-top .c-native__content:after{height:40px;-webkit-transform:translateX(0);transform:translateX(0)}}@media (min-width:36em){.s-native--hp-top .c-native__title{font-size:16px}}@media (min-width:49em){.s-native--hp-top .c-native__dek,.s-native--hp-top .c-native__media{display:none}}@media (min-width:36em){.s-native--hp-mid-inside .c-native-container{display:none}}@media (min-width:49em){.s-native--hp-mid-inside .c-native-container{display:block}}.s-native--hp-mid-inside .c-native{margin-bottom:0}@media (min-width:49em){.s-native--hp-mid-inside .c-native{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}}@media (min-width:36em){.s-native--hp-mid-inside .c-native__content{padding-left:8px}}@media (min-width:49em){.s-native--hp-mid-inside .c-native__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center}}@media (min-width:49em){.s-native--hp-mid-inside .c-native__content:after{left:100%;-webkit-transform:translateX(0);transform:translateX(0)}}@media (min-width:49em){.s-native--hp-mid-inside .c-native__media{-ms-flex-preferred-size:128px;flex-basis:128px;margin-right:0;padding-bottom:112px}}@media (min-width:64em){.s-native--hp-mid-inside .c-native__media{-ms-flex-preferred-size:144px;flex-basis:144px;min-width:144px;padding-bottom:128px}}@media (min-width:75em){@supports ((-o-object-fit:cover) or (object-fit:cover)){.s-native--hp-mid-inside .c-native__media{-ms-flex-preferred-size:192px;flex-basis:192px;max-width:none}}}@media (min-width:49em){.s-native--hp-mid-inside .c-native__title{font-size:18px}}.s-native--hp-mid-inside .c-native__dek{display:none}.s-native--hp-mid-outside .c-native-container{display:none}@media (min-width:36em){.s-native--hp-mid-outside .c-native-container{display:block}}@media (min-width:49em){.s-native--hp-mid-outside .c-native-container{display:none}}.s-native--hp-bottom .c-native-container{display:none}@media (min-width:36em){.s-native--hp-bottom .c-native-container{display:block}}.s-native--landing .c-native{margin:16px 0}@media (min-width:75em){.s-native--article .c-native__title{font-size:24px}}.c-nav{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:16px;font-weight:700;letter-spacing:1px;line-height:1;text-transform:uppercase}.c-nav--header{border-top:1px solid #b6b6b6;margin-top:8px;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;padding-top:8px;position:relative;width:100%}.c-nav--header:after{background-image:-webkit-gradient(linear,left top,right top,from(hsla(0,0%,100%,0)),color-stop(90%,#fff));background-image:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 90%);content:"";height:100%;pointer-events:none;position:absolute;right:0;top:0;width:80px}@media (min-width:36em){.c-nav--header:after{content:normal}}@media (min-width:36em){.c-nav--header{border-top:none;margin-top:0;padding-right:16px;padding-top:0;width:auto}}@media (min-width:64em){.c-nav--header{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0;padding-left:16px}}.c-nav--footer{font-size:12px;margin-top:64px}@media (min-width:36em){.c-nav--footer{margin-top:96px}}@media (min-width:49em){.c-nav--footer{font-size:14px}}.c-nav--navigator{padding:0 40px 40px}@media (min-width:49em){.c-nav--navigator{padding:0 48px 48px}}.c-nav__container--header{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.c-nav__container--header::-webkit-scrollbar,.c-nav__container--header::-webkit-scrollbar-thumb,.c-nav__container--header::-webkit-scrollbar-track{display:none}.c-nav__container--footer{display:-webkit-box;display:-ms-flexbox;display:flex;height:180px;margin:0 auto;max-width:320px}@media (min-width:36em){.c-nav__container--footer{max-width:none}}.c-nav__list{margin:0;padding:0;list-style:none}.c-nav__list--header{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;padding-right:40px}@media (min-width:36em){.c-nav__list--header{padding-right:0}}.c-nav__list--footer{-ms-flex-line-pack:distribute;align-content:space-around;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%}@media (min-width:36em){.c-nav__list--footer:after,.c-nav__list--footer:before{content:"";-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;width:100%}}.c-nav__list--navigator{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.c-nav__item:not(:last-child):after{color:#b6b6b6;content:"/";padding:0 8px}.c-nav__item--footer:not(:last-child):after{padding:0 16px}@media (min-width:36em){.c-nav__item--footer:not(:last-child):after{padding:0 24px}}@media (min-width:49em){.c-nav__item--footer:not(:last-child):after{padding:0 40px}}@media (min-width:55.25em) and (max-width:64em){.c-nav__item--footer:not(:last-child):after{padding:0 16px}}.c-nav__item--footer:nth-child(3n):after{content:normal}@media (min-width:36em){.c-nav__item--footer:nth-child(3n):after{content:"/"}}@media (min-width:36em){.c-nav__item--footer:nth-child(4n):after{content:normal}}@media (min-width:36em){.c-nav__item--footer:nth-child(n+5){-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media (min-width:36em){.c-nav__item--footer:nth-child(n+9){-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}}.c-nav__link{border-bottom:1px solid transparent;padding-bottom:4px;text-decoration:none}.c-nav__link:hover{text-decoration:none}.c-nav__link--header{border-color:#37ee67;display:inline-block}.c-nav__link--header:hover{color:#37ee67}.c-nav__link--footer{color:#fff}.c-nav__link--footer:hover{border-color:#37ee67;color:#fff}.c-nav__link--navigator{border-color:#37ee67;display:inline-block}.c-nav__link--navigator:hover{color:#37ee67}.c-newsletter{border-bottom:1px solid #b6b6b6;border-top:1px solid #b6b6b6;margin-bottom:24px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;padding:24px 0;position:relative;width:calc(100% - 0px)}.c-newsletter--cta{margin-top:64px}@media (min-width:49em){.c-newsletter--homepage{display:-webkit-box;display:-ms-flexbox;display:flex}}.c-newsletter--footer{border:0;margin:40px auto 0;max-width:600px;padding:0}@media (min-width:36em){.c-newsletter--footer{margin-top:96px}}.c-newsletter__title{background-color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700;line-height:1;left:0;padding-right:8px;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}@supports ((-webkit-transform:translateY(calc(-100% + 4px))) or (transform:translateY(calc(-100% + 4px)))){.c-newsletter__title{-webkit-transform:translateY(calc(-100% + 4px));transform:translateY(calc(-100% + 4px))}}.c-newsletter__title:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;margin-bottom:8px}.c-newsletter__cta{display:block;line-height:1.25;margin:0 0 16px}@media (min-width:49em){.c-newsletter__cta--homepage{-ms-flex-preferred-size:calc(41.66667% - 0px);flex-basis:calc(41.66667% - 0px);margin:0 16px 0 0}}@media (min-width:64em){.c-newsletter__cta--homepage{-ms-flex-preferred-size:calc(50% - 0px);flex-basis:calc(50% - 0px)}}.c-newsletter__cta--footer{color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;letter-spacing:1px;line-height:1;margin-bottom:32px;text-align:center;text-transform:uppercase}.c-newsletter__secondary-cta{color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;margin:32px 0 0;text-align:center}.c-newsletter__secondary-cta a{color:#fff}.c-newsletter__form{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}@media (min-width:49em){.c-newsletter__form--homepage{-ms-flex-preferred-size:calc(58.33333% - 0px);flex-basis:calc(58.33333% - 0px);-ms-flex-negative:0;flex-shrink:0}}@media (min-width:64em){.c-newsletter__form--homepage{-ms-flex-preferred-size:calc(50% - 0px);flex-basis:calc(50% - 0px)}}.c-newsletter__field{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #000;border-radius:0;color:#000;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;letter-spacing:1px;padding:8px}.c-newsletter__field:-moz-placeholder{color:#b6b6b6;text-transform:uppercase}.c-newsletter__field::-moz-placeholder{color:#b6b6b6;text-transform:uppercase}.c-newsletter__field:-ms-input-placeholder{color:#b6b6b6;text-transform:uppercase}.c-newsletter__field::-webkit-input-placeholder{color:#b6b6b6;text-transform:uppercase}.c-newsletter__field--email{-ms-flex-preferred-size:100%;flex-basis:100%;margin-right:4px}@media (min-width:36em){.c-newsletter__field--email{margin-right:8px}}.c-newsletter__field--footer{background-color:#000;border:none;border-bottom:1px solid #b6b6b6;color:#fff;padding-bottom:0}.c-newsletter__field--footer:-moz-placeholder{color:#fff}.c-newsletter__field--footer::-moz-placeholder{color:#fff}.c-newsletter__field--footer:-ms-input-placeholder{color:#fff}.c-newsletter__field--footer::-webkit-input-placeholder{color:#fff}.c-newsletter__alert{font-size:12px;left:0;padding:8px;position:absolute;top:100%;z-index:1}.c-newsletter__alert--success{background-color:#d4ffd4}.c-newsletter__alert--error{background-color:#ffd6db}.c-newsletter__static-form{margin-bottom:24px;padding:0 24px}.c-newsletter__static-form .c-newsletter__alert{position:inherit}.c-newsletter__static-form fieldset{border:0;border-bottom:1px solid #000;margin:16px 0 0;padding:0}.c-newsletter__static-form fieldset:last-of-type{border-bottom:none}.c-newsletter__static-checkbox-group input{float:right}.c-newsletter__static-checkbox-group label{font-family:PFDINTextCondPro,Arial,sans-serif;font-size:32px;font-weight:700;line-height:1}.c-newsletter__static-checkbox-group p{margin:0 0 15px}.c-newsletter__static-email-input{display:-webkit-box;display:-ms-flexbox;display:flex;margin:10px 0}.c-newsletter__static-email-input .c-newsletter__field--email{margin-right:4px}.c-newsletter--promo{background-color:#ececec;border:0;font-size:18px;margin-top:0;padding:24px;position:static}@media (min-width:36em){.c-newsletter--promo{font-size:20px}}.c-newsletter--promo .c-newsletter__title{background-color:transparent;position:static;-webkit-transform:none;transform:none}.c-newsletter--promo .c-newsletter__title:before{background-image:none;height:0;margin-bottom:0}.c-newsletter--promo .c-newsletter__title b{color:#24b361;font-weight:700}.c-newsletter__cta--promo{font-family:PFDINTextCondPro,Arial,sans-serif}.c-newsletter__cta--promo b{color:#24b361;font-weight:700}.c-newsletter__form--promo{-ms-flex-wrap:wrap;flex-wrap:wrap}@media (min-width:36em){.c-newsletter__form--promo{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.c-newsletter__field--promo{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);font-size:16px;margin-bottom:8px;margin-right:0}@media (min-width:36em){.c-newsletter__field--promo{-ms-flex-preferred-size:calc(75% - 0px);flex-basis:calc(75% - 0px);font-size:18px;margin-bottom:0;margin-right:8px}}.c-newsletter__submit--promo{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);font-size:16px}@media (min-width:36em){.c-newsletter__submit--promo{-ms-flex-preferred-size:calc(25% - 0px);flex-basis:calc(25% - 0px);font-size:18px}}.c-notification{background-color:#ff0;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:12px;font-weight:700;padding:8px;-webkit-transition:opacity 1s;transition:opacity 1s}@media (min-width:36em){.c-notification{font-size:16px;padding:16px}}.c-notification__container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 auto;max-width:940px}.c-notification__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:0}.c-notification__title{display:block;text-transform:uppercase}.c-notification__description{margin:0}.c-notification__close{background-color:transparent;border:0;cursor:pointer;height:10px;margin-left:8px;padding:0;width:10px}@media (min-width:36em){.c-notification__close{height:16px;margin-left:16px;width:16px}}.c-pagination{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 auto 32px;max-width:624px}@media (min-width:36em){.c-pagination{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.c-presented-by--with-rule{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media (min-width:36em){.c-presented-by--with-rule{position:relative}}.c-presented-by__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.c-presented-by__content--article-logo.child-loaded{border-bottom:1px solid #b6b6b6;border-top:1px solid #b6b6b6;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:24px;padding:24px 0}@media (min-width:36em){.c-presented-by__content--article-logo.child-loaded{-webkit-box-pack:left;-ms-flex-pack:left;justify-content:left}}.c-presented-by__content--landing.child-loaded{margin-top:16px}.c-presented-by__content.child-loaded:before{color:#b6b6b6;content:attr(data-label);font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;font-weight:700;letter-spacing:1px;margin-bottom:4px;text-transform:uppercase}.c-presented-by__content--article-logo.child-loaded:before{color:#000;font-size:16px;line-height:1.25;margin:0 8px 0 0}@media (min-width:36em){.c-presented-by__content--article-logo.child-loaded:before{font-size:18px;line-height:1.125}}.c-presented-by__rule{border:0;border-top:1px solid #b6b6b6;margin:10px 8px 0 0;width:100%}.c-presented-by__rule:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;width:72px}@media (min-width:36em){.c-presented-by__rule{margin-top:0}}@media (min-width:75em){.c-presented-by__rule{margin-right:0}}.c-presented-by__content--with-rule{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:0%;flex-basis:0%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;-ms-flex-wrap:wrap;flex-wrap:wrap}@media (min-width:36em){.c-presented-by__content--with-rule{background-color:#fff;padding-left:8px;position:absolute;right:0;top:50%;-webkit-transform:translateY(calc(-50% - 4px));transform:translateY(calc(-50% - 4px));width:92px}}@media (min-width:75em){.c-presented-by__content--with-rule{right:-92px}}.c-tmp-share-sponsored-container{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:24px;margin-top:24px}@media (min-width:36em){.c-tmp-share-sponsored-container{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.c-tmp-share-sponsored-container .c-share:not(.c-share--action-bar){margin-right:8px}.c-tmp-share-sponsored-container .c-presented-by{-ms-flex-preferred-size:100%;flex-basis:100%}.c-promo{margin-bottom:16px;position:relative}.c-promo:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;margin:0 auto;position:absolute;width:100%}.c-promo--landing{margin-bottom:32px}@media (min-width:49em){.c-promo--landing{margin-bottom:64px}}.c-promo--partner-solutions{border:1px solid #005aff;margin-bottom:0}.c-promo--partner-solutions:after{content:none}.c-promo--partner-solutions .c-promo__content{border:0;border-top:1px solid #005aff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.c-promo--partner-solutions .c-promo__content>*{max-width:100%}.c-promo--partner-solutions .c-promo__channel{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3;position:static;-webkit-transform:none;transform:none}.c-promo--partner-solutions .c-promo__hed{font-family:Roboto Slab,serif;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.c-promo--partner-solutions .c-promo__link--hed:hover{color:#000;text-decoration:underline}.c-promo--partner-solutions .c-promo__dek{font-family:Roboto,sans-serif;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.c-promo__content{border:1px solid #b6b6b6;border-top:0;padding:24px 48px 32px;position:relative}.c-promo__channel{left:0;position:absolute;right:0;text-align:center;top:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.c-promo__image{background-color:#f3f3f3;overflow:hidden;padding-bottom:61.93548%;position:relative}.c-promo__img{height:auto;width:100%}.c-promo__dek{display:none;font-size:20px;line-height:1.25;text-align:center}@media (min-width:55.25em){.c-promo__dek{display:block}}.c-promo__hed{font-size:24px;margin-bottom:8px;max-width:100%;text-align:center}@media (min-width:36em){.c-promo__hed{font-size:36px}}.c-promo__link--hed{color:#000;text-decoration:none}.c-promo__link--hed:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-promo__link--hed:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-promo--small{margin-bottom:24px}@media (min-width:36em){.c-promo--small .c-promo__content{font-size:24px}}.c-promo--small .c-promo__content .c-promo__hed{font-size:inherit}.c-promo--small .c-promo__content .c-promo__dek{display:none}.c-promo__img-link{height:100%;position:absolute;width:100%}.c-river-heading--partner-solutions{border-bottom:1px solid #005aff;color:#005aff;font-family:Roboto,sans-serif;font-size:12px;line-height:1;margin:0 0 16px;padding:24px 0;text-align:center;text-transform:uppercase}@media (min-width:64em){.c-river-heading--partner-solutions{margin-bottom:32px;padding:32px 0}}.c-river-item{margin-bottom:16px}.c-river-item--homepage .c-byline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}@media (min-width:36em){.c-river-item--homepage .c-byline__link{color:#fff}}.c-river-item--homepage .c-byline__time{margin-left:8px}@media (min-width:36em){.c-river-item--homepage{background-color:#000;color:#fff}}.c-river-item--sponsored{border:1px solid #005aff}.c-river-item--partner-solutions{border-bottom:1px solid #005aff;margin-bottom:16px;padding-bottom:16px}@media (min-width:64em){.c-river-item--partner-solutions{margin-bottom:32px;padding-bottom:32px}}.c-river-item--partner-solutions .c-river-item__link--kicker{background:none;color:#000;display:block;font-family:Roboto,sans-serif;font-size:12px;line-height:1;margin-bottom:8px;padding:0;text-transform:none}@media (min-width:64em){.c-river-item--partner-solutions .c-river-item__link--kicker{font-size:14px}}.c-river-item--partner-solutions .c-river-item__link:hover{color:#000;text-decoration:underline}.c-river-item__label{display:block;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:12px;font-weight:700;line-height:1;padding:4px;text-align:center;text-transform:uppercase}.c-river-item__label--sponsored{background-color:#005aff;color:#fff}.c-river-item__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.c-river-item__content{margin-left:8px}@media (min-width:64em){.c-river-item__content{margin-left:16px;width:calc(100% - 316px)}}.c-river-item__content--homepage{padding:8px 8px 8px 0}.c-river-item__content--sponsored{padding:16px 16px 16px 0;position:relative}.c-river-item__content--sponsored:before{background-image:repeating-linear-gradient(135deg,#005aff,#005aff 1px,transparent 2px,transparent 6px);content:"";display:block;width:16px;height:40px;left:0;position:absolute;top:16px;-webkit-transform:translateX(calc(-100% - 8px));transform:translateX(calc(-100% - 8px))}@media (-webkit-min-device-pixel-ratio:2),(min--moz-device-pixel-ratio:2),(min-resolution:2dppx),(min-resolution:192dpi){.c-river-item__content--sponsored:before{background-image:repeating-linear-gradient(135deg,#005aff,#005aff 1px,transparent 2px,transparent 6px)}}.c-river-item__link{color:#000;text-decoration:none}.c-river-item__link:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-river-item__link:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-river-item__link--kicker{background-color:#000;color:#fff;display:inline-block;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;line-height:1;padding:2px 4px 0;text-decoration:none;text-transform:uppercase;vertical-align:top}.c-river-item__link--kicker:hover{color:#fff;text-decoration:underline}@media (min-width:36em){.c-river-item__link--homepage{color:#fff}}.c-river-item__hed{background-color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700;line-height:1;background-color:transparent;margin-bottom:4px}@media (min-width:49em){.c-river-item__hed{font-size:28px}}@media (min-width:49em){.c-river-item__hed--homepage{font-size:24px}}.c-river-item__hed--partner-solutions{font-family:Roboto Slab,serif;font-size:16px;line-height:1.25}@media (min-width:36em){.c-river-item__hed--partner-solutions{font-size:24px}}@media (min-width:64em){.c-river-item__hed--partner-solutions{font-size:32px}}.c-river-item__dek{display:none;line-height:1.25;margin:0 0 4px}@media (min-width:49em){.c-river-item__dek{display:block}}.c-river-item__dek--homepage,.c-river-item__dek--partner-solutions{display:none}.c-river-item__img{width:144px}@media (min-width:64em){.c-river-item__img{width:300px}}.c-river-item__picture{display:block;height:144px}@media (min-width:64em){.c-river-item__picture{height:185px}}.c-search{border-bottom:1px solid #000;margin:24px 0;padding-bottom:8px}@media (min-width:64em){.c-search{margin:48px 0}}.c-search__icon{width:16px}@media (min-width:64em){.c-search__icon{width:24px}}.c-search__submit{background:#fff;border:none;cursor:pointer;padding:4px 0}.c-search__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;color:#000;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:24px;font-weight:700;padding-left:8px;width:calc(100% - 48px)}.c-search__input:-moz-placeholder{color:#b6b6b6}.c-search__input::-moz-placeholder{color:#b6b6b6}.c-search__input:-ms-input-placeholder{color:#b6b6b6}.c-search__input::-webkit-input-placeholder{color:#b6b6b6}@media (min-width:36em){.c-search__input{font-size:28px}}@media (min-width:64em){.c-search__input{font-size:32px}}.c-search-nav{-ms-flex-preferred-size:16px;flex-basis:16px;-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}@media (min-width:36em){.c-search-nav{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}.c-search-nav__link{fill:inherit;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex}.c-search-nav__link:hover{fill:#37ee67}.c-search-nav__icon{height:16px;width:16px}.c-share{margin-bottom:16px}@media (min-width:36em){.c-share{margin-bottom:0}}.c-share--action-bar{margin-bottom:0}@media (min-width:36em){.c-share--action-bar{margin-left:16px}}.c-share__list{margin:0;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;list-style:none}.c-share__item:not(:last-child){margin-right:8px}.c-share__item--more{position:relative}.c-more{background-color:#fff;border:1px solid #b6b6b6;border-radius:2px;display:none;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;left:50%;line-height:1;list-style:none;margin:0;padding:16px;position:absolute;top:0;-webkit-transform:translateX(-50%) translateY(calc(50% - 4px));transform:translateX(-50%) translateY(calc(50% - 4px));z-index:10000}.c-more:before{background-color:#fff;border-left:1px solid #b6b6b6;border-top:1px solid #b6b6b6;content:"";height:10px;left:50%;position:absolute;top:-2px;-webkit-transform:rotate(45deg) translateX(-50%);transform:rotate(45deg) translateX(-50%);width:10px}.c-more.is-active{display:block}.c-more__item:not(:last-child){margin-bottom:8px}.c-more__link{color:#000;text-decoration:none;display:block}.c-more__link:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-more__link:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-skip-link{display:none}@media (min-width:36em){.c-skip-link{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-transform:uppercase;z-index:1}.c-skip-link:active,.c-skip-link:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.c-skip-link:active,.c-skip-link:focus{height:100%;position:absolute;width:100%}}.c-social{border-bottom:1px solid #b6b6b6;border-top:1px solid #b6b6b6;-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);margin-bottom:24px;padding:24px 0}.c-social--footer{border:0;margin:64px 0 0;padding:0}@media (min-width:36em){.c-social--footer{margin-top:96px}}.c-social__cta{line-height:1.25;margin:0 0 16px;text-align:center}.c-social__list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 auto;padding:0;width:161px}@media (min-width:36em){.c-social__list{width:267px}}.c-social__item{display:-webkit-box;display:-ms-flexbox;display:flex}.c-social__link{fill:inherit;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;height:16px;width:16px}.c-social__link:hover{fill:#37ee67}.c-social__link--footer{fill:#fff}.c-social__icon{width:100%}.c-solutions{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1.5;list-style-type:none;margin-bottom:48px;padding:0}.c-solutions:after{width:80%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none}@media (max-width:35.9375em){.c-solutions{-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;overflow-x:scroll;overflow-y:hidden}.c-solutions:after{background-image:-webkit-gradient(linear,left top,right top,from(hsla(0,0%,59%,0)),color-stop(90%,#fff));background-image:linear-gradient(90deg,hsla(0,0%,59%,0),#fff 90%);content:"";height:115px;pointer-events:none;position:absolute;right:0;width:80px}}.c-solutions__item{background-size:cover;-ms-flex-preferred-size:24.5%;flex-basis:24.5%;height:115px;margin:1px;max-width:230px;min-width:115px}@media (max-width:35.9375em){.c-solutions__item{font-size:24px;min-width:230px}}@media (min-width:36em){.c-solutions__item{font-size:18px}}@media (min-width:64em){.c-solutions__item{font-size:24px}}.c-solutions__item a{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.3);color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-decoration:none;text-transform:uppercase;width:100%}.c-solutions__item a:hover{background:rgba(0,225,50,.4);color:#fff}.c-tag{background-color:#000;color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;line-height:1;padding:4px 8px;text-decoration:none;text-transform:uppercase}.c-tag:hover{color:#fff;text-decoration:underline}.c-tag__perspective{font-size:14px;padding-top:6px}@media (min-width:36em){.c-tag__perspective{font-size:16px}}@media (min-width:49em){.c-tag__perspective{font-size:18px}}.c-wordmark--header{-ms-flex-preferred-size:calc(100% - 16px);flex-basis:calc(100% - 16px);-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0;position:relative}@media (min-width:36em){.c-wordmark--header{border-bottom:1px solid #b6b6b6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0 16px;padding-bottom:16px}}@media (min-width:64em){.c-wordmark--header{border-bottom:none;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin:0 auto 0 0;padding:0 0 48px;position:relative}.c-wordmark--header:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;bottom:0;left:0;position:absolute;width:100%}}.c-wordmark--action-bar{display:none}@media (min-width:36em){.c-wordmark--action-bar{display:block}}.c-wordmark__link{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex}.c-wordmark__icon{--wordmark-light:$light;color:#0e9c54;fill:#0ab961;height:21px;width:122px}@media (min-width:36em){.c-wordmark__icon{height:32px;width:190px}}@media (min-width:64em){.c-wordmark__icon--header{max-width:100%}}.c-wordmark__icon--action-bar{width:122px}.c-writers{border-bottom:1px solid #b6b6b6;border-top:1px solid #b6b6b6;margin-bottom:24px;margin-top:64px;position:relative}.c-writers:after{background-image:-webkit-gradient(linear,left top,right top,from(hsla(0,0%,100%,0)),color-stop(90%,#fff));background-image:linear-gradient(90deg,hsla(0,0%,100%,0),#fff 90%);content:"";height:100%;pointer-events:none;position:absolute;right:0;top:0;width:20vw}@media (min-width:49em){.c-writers:after{content:normal}}@media (min-width:49em){.c-writers{-ms-flex-preferred-size:calc(100% - 0px);flex-basis:calc(100% - 0px);margin-top:40px;max-width:calc(100% - 0px);-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}}@media (min-width:75em){.c-writers{border:1px solid #b6b6b6;-ms-flex-preferred-size:calc(33.33333% - 16px);flex-basis:calc(33.33333% - 16px);margin-left:16px;margin-top:0;max-width:calc(33.33333% - 16px)}.c-writers:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";height:16px;pointer-events:none;display:block;position:relative;width:100%}}.c-writers__title{background-color:#fff;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700;line-height:1;left:0;padding-right:8px;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}@supports ((-webkit-transform:translateY(calc(-100% + 4px))) or (transform:translateY(calc(-100% + 4px)))){.c-writers__title{-webkit-transform:translateY(calc(-100% + 4px));transform:translateY(calc(-100% + 4px))}}.c-writers__title:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3Cpattern id='a' patternUnits='userSpaceOnUse' width='6' height='5' patternTransform='rotate(45)'%3E%3Cpath stroke='%23b6b6b6' stroke-width='2' d='M0 0v5'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%25' height='100%25' fill='url(%23a)'/%3E%3C/svg%3E");content:"";display:block;height:16px;pointer-events:none;margin-bottom:8px}@media (min-width:75em){.c-writers__title{left:50%;padding:0 4px;position:absolute;top:0;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.c-writers__title:before{content:normal}}.c-writers__container{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:auto;overflow-y:hidden;padding:16px 0;white-space:nowrap}.c-writers__container::-webkit-scrollbar,.c-writers__container::-webkit-scrollbar-thumb,.c-writers__container::-webkit-scrollbar-track{display:none}@media (min-width:49em){.c-writers__container{overflow:auto;padding:0;white-space:normal}}.c-writers__list{margin:0;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;list-style:none}@media (min-width:49em){.c-writers__list{-ms-flex-wrap:wrap;flex-wrap:wrap}}.c-writer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:256px;flex-basis:256px;max-width:256px;min-width:256px;padding:16px 16px 16px 0;white-space:normal}.c-writer:not(:last-child){border-right:1px dashed #b6b6b6;margin-right:16px}@media (min-width:49em){.c-writer:not(:last-child){margin-right:0}}@media (min-width:75em){.c-writer:not(:last-child){border-bottom:1px dashed #b6b6b6;border-right:0}}@media (min-width:49em){.c-writer:nth-child(-n+3){border-bottom:1px solid #b6b6b6}}@media (min-width:75em){.c-writer:nth-child(-n+3){border-bottom-style:dashed}}@media (min-width:49em){.c-writer:nth-child(3n){border-right:0}}@media (min-width:49em){.c-writer{-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%;max-width:33.33333%;min-width:auto;padding:16px;width:auto}}@media (min-width:55.25em) and (max-width:64em){.c-writer{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;text-align:center}.c-writer .c-writer__link--twitter{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.c-writer .c-writer__img{margin-right:0}}@media (min-width:75em){.c-writer{-ms-flex-preferred-size:auto;flex-basis:auto;max-width:100%;width:100%}}.c-writer--see-all{-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:20px;font-weight:700;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.c-writer__img{height:52px;margin-bottom:16px;margin-right:16px;width:52px}.c-writer__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.c-writer__name{font-size:20px;margin-bottom:16px}.c-writer__link{color:#000;text-decoration:none}.c-writer__link:hover{color:#37ee67;text-decoration:underline}@supports ((-webkit-text-decoration:underline #37ee67) or (text-decoration:underline #37ee67)){.c-writer__link:hover{color:inherit;-webkit-text-decoration:underline #37ee67;text-decoration:underline #37ee67}}.c-writer__link--twitter{fill:inherit;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;font-family:PFDINTextCondPro,Arial,sans-serif;font-size:10px;font-weight:700;letter-spacing:1px;line-height:1;margin-bottom:16px;text-decoration:underline;text-transform:uppercase}.c-writer__link--twitter:hover{fill:#37ee67}.c-writer__article-hed{font-family:Palatino,Palatino Linotype,Palatino LT STD,Book Antiqua,Georgia,serif;font-size:12px;font-weight:400;line-height:1.25}@media (min-width:55.25em){.c-writer__article-hed{font-size:16px}}.u-hidden{display:none!important}.u-lazy{-webkit-transition:all 1s;transition:all 1s}.lazyload{-webkit-filter:blur(4px);filter:blur(4px);opacity:0;-webkit-transform:scale(1.02);transform:scale(1.02)}.no-js .lazyload{-webkit-filter:none;filter:none;opacity:1;-webkit-transform:none;transform:none}.lazyloaded{-webkit-filter:none;filter:none;opacity:1;-webkit-transform:scale(1);transform:scale(1)}@supports ((-o-object-fit:cover) or (object-fit:cover)){.u-object-cover{-o-object-fit:cover;object-fit:cover}}@media print{@page{margin:1cm}h3{page-break-before:always}figure,img,ol,p,table,ul{page-break-inside:avoid}.c-about{color:#000;margin-top:24px}.c-logo--footer{margin-top:24px}.c-logo__reference--footer{color:initial;fill:initial}.c-wordmark--header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.c-wordmark--header:after{content:"www.citylab.com";font-family:PFDINTextCondPro,Arial,sans-serif;font-weight:700;margin:4px}.l-content__inner{margin:0}.l-footer{background-color:#fff;padding-bottom:24px}.l-header:after{border:1px solid #bbb;content:"Thank you for printing content from www.citylab.com. If you enjoy this piece, then please check back soon for our latest in urban-centric journalism.";display:block;font-style:italic;margin-bottom:8px;padding:8px}.o-small-container{max-width:none;width:100%}.s-cms-content .c-article-links{display:block}.s-cms-content .c-print-superscript{display:inline-block;font-size:80%;font-style:normal;font-weight:700;margin:1px}.c-action-bar,.c-ad,.c-article-most-popular,.c-ballyhoos,.c-disqus,.c-nav,.c-newsletter,.c-presented-by,.c-search-nav,.c-share,.c-social,.l-sponsored,.lazyload,.lazyloading,.s-outbrain{display:none}}
+ ]]>
+ </style>
+ <script src="https://cdn.citylab.com/static/a/frontend/dist/citylab/js/polyfill.c71e135c0fd0.js" nomodule=""></script>
+ <script>
+ <![CDATA[
+ document.documentElement.className=document.documentElement.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ "performance"in window&&"mark"in window.performance||(performance.mark=function(){})
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ "fonts"in document&&document.fonts.ready.then(function(n){performance.mark("citylab_fonts_loaded")})
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.CityLab={};window.CityLab.page_info= {"tall_ads_suppressed": false, "domain": "www.citylab.com", "disqus_identifier": "post_588400", "image": "https://cdn.citylab.com/media/img/citylab/2019/04/mr1/facebook.jpg?1556645448", "channels": ["design", "life"], "article_type": "citylab", "twitter_image": "", "canonical_url": "https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/", "is_amp": false, "is_freelance": false, "original_url": "https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/", "seo_title": "A Brief History of Neon Signage", "site_url": "https://www.citylab.com", "regions": ["New York"], "primary_channel": "design", "version": "1.0.0", "is_accounts": false, "share_dek": "", "is_instant": false, "share_title": "The Modern Ambitions Behind Neon", "description": "The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.", "tags": [], "is_404": false, "has_full_width_content": false, "kicker": "", "authors": ["Sarah Archer"], "date": "2019-04-30T13:39:00-04:00", "path": "/design/2019/04/neon-signage-20th-century-history/588400/", "cities": ["New York", "Paris"], "article_id": 588400, "countries": ["United States"], "url": "https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/", "is_sponsored": false, "title": "Why Neon Is the Ultimate Symbol of the 20th Century", "request": {"experiment_group": null, "experiment_id": null, "is_gdpr": false}, "og_type": "article", "report": "", "view": "article", "days_since_published": 0};window.CityLab.page_meta= {"grapeshot_last_updated": "2019-04-30T17:41:38.736330+00:00", "adtargeting": {"watson_categories": ["/style and fashion/body art", "/law, govt and politics/politics", "/society/unrest and war"], "grapeshot_segments": ["an_bankofamerica_negative", "an_fidelity_safe", "an_jpmc_safe", "an_ms_safe", "ap_alfaromeo_safe", "gs_entertain", "gs_entertain_arts", "gs_science", "gs_auto"]}, "article_last_updated": "2019-04-30T13:40:00-04:00", "watson": {"top_category": {"four": null, "full": "/style and fashion/body art", "one": "style and fashion", "three": null, "two": "body art"}, "entities": ["de Miranda", "Georges Claude"], "categories": ["/style and fashion/body art", "/law, govt and politics/politics", "/society/unrest and war"], "keywords": ["history of neon lighting", "neon deli sign", "neon gas", "philosopher Luis de Miranda", "neon", "widespread use", "New York\u2019s Times Square", "Miranda\u2019s own example", "neon lights", "contemporary artists", "notion of neon lighting", "Neon signs", "neon fixtures", "first great modernist works", "interior lighting", "border of the sign", "such signs", "word neon", "John Minchillo", "perpetual nighttime glow", "French capital", "poor choice", "noble gases", "Scottish chemist Sir William Ramsay", "de Miranda", "combination of light", "husky physicality", "French engineer", "Bruce Nauman", "boiling point of argon", "sole use", "reference point", "mass introduction of neon lighting", "cost-effective way", "music of Claude Debussy", "cubist art of Pablo Picasso", "Let There Be Neon", "Neon lighting", "new form of illumination", "produce them.In", "neon sign", "fluorescent signs", "Fans of Miami Beach", "Martin Wartman", "British artist Tracey Emin", "light", "20th century", "United States", "World\u2019s Fair", "vital medium"], "concepts": ["Neon", "Neon sign", "Light", "Signage", "Neon lighting", "Neon lamp"]}, "meta": {"content_headline": "why neon is the ultimate symbol of the 20th century", "content_platform": "web", "channels": "design, life", "first_published_time": "13:39", "last_updated_datetime": "2019-04-30T13:40:00-04:00", "social_title": "why neon is the ultimate symbol of the 20th century", "content_subtype": "citylab", "content_headline_character_count": 51, "top_category_tier_4": null, "top_category_tier_1": "style and fashion", "top_category_tier_3": null, "top_category_tier_2": "body art", "primary_channel": "design", "secondary_author": null, "primary_author": "sarah archer", "grapeshot_segments": "an_bankofamerica_negative,an_fidelity_safe,an_jpmc_safe,an_ms_safe,ap_alfaromeo_safe,gs_entertain,gs_entertain_arts,gs_science,gs_auto", "first_published_date": "2019-04-30", "editorial_categories": null, "is_404": false, "watson_categories": "/style and fashion/body art;/law, govt and politics/politics;/society/unrest and war", "authors": "sarah archer", "report": null, "content_headline_word_count": 10, "article_id": 588400, "social_description": "the once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.", "top_category_full": "/style and fashion/body art", "editorial_project": null, "content_headline_capitalized": "Why Neon Is the Ultimate Symbol of the 20th Century", "content_article_word_count": 1496, "first_published_datetime": "2019-04-30T13:39:00-04:00", "view": "amp"}, "watson_last_updated": "2019-04-30T17:41:39.685586+00:00", "article_word_count": 1496};window.CityLab.GTM={quantcastLabels: ["CityLab.Editorial.Title.Why Neon Is the Ultimate Symbol of the 20th Century", "CityLab.Editorial.Author.Sarah Archer", "CityLab.Editorial.Channel.design", "CityLab.Editorial.Channel.life"],simplereach:{is_404: false,conf: {"channels": ["design", "life"], "date": "2019-04-30T13:39:00-04:00", "title": "Why Neon Is the Ultimate Symbol of the 20th Century", "url": "https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/", "authors": ["sarah-archer"], "tags": [], "page_url": "https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/"} }}
+ ]]>
+ </script>
+ <link rel="manifest" href="https://cdn.citylab.com/static/a/frontend/citylab/manifest/manifest.3a606104fd2d.json" /><noscript>
+ <link rel="stylesheet" href="https://cdn.citylab.com/static/a/frontend/dist/citylab/css/no-js.f0eba3fa6040.css" media="screen" /></noscript><noscript><img src="https://atlanticmedia.122.2o7.net/b/ss/atlanticcities-prod/1/H.23.6--NS/0" height="1" width="1" border="0" alt="" /></noscript><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K92Z9D9" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+ <meta name="description" content="The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline." />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <meta name="ROBOTS" content="INDEX, FOLLOW" />
+ <link rel="icon" sizes="16x16" href="https://cdn.citylab.com/static/a/frontend/citylab/img/icons/favicon-32x32.c6270a7c48d1.png" />
+ <link rel="icon" sizes="32x32" href="https://cdn.citylab.com/static/a/frontend/citylab/img/icons/favicon-16x16.10c30d3dfe8e.png" />
+ <link rel="apple-touch-icon" sizes="192x192" href="https://cdn.citylab.com/static/a/frontend/citylab/img/icons/touch-icon-192x192.2f88c5610402.png" />
+ <meta name="theme-color" content="#000000" />
+ <meta name="application-name" content="CityLab" />
+ <meta name="msapplication-TileColor" content="#000000" />
+ <meta name="msapplication-TileImage" content="https://cdn.citylab.com/static/a/citylab/img/icons/tile-144.b81cb04aaf40.png" />
+ <meta property="fb:app_id" content="149043611894677" />
+ <meta property="fb:page_id" content="236061986423933" />
+ <meta property="fb:pages" content="236061986423933,1468531833474495,1061579677251147,457711054591520,370457103090695,29259828486,1631141167169115,148681772342453,1510507419185410,128344747344340,128377530562508" />
+ <link href="https://plus.google.com/+citylab/" rel="publisher" />
+ <meta name="p:domain_verify" content="60d0d25f4baabe8b6700f9af2a743afc" />
+ <link rel="alternate" type="application/rss+xml" title="CityLab RSS" href="/feeds/posts/" />
+ <link rel="canonical" href="https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/" />
+ <link rel="image_src" href="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/facebook.jpg?1556645448" />
+ <meta property="og:description" content="The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline." />
+ <meta property="og:image" content="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/facebook.jpg?1556645448" />
+ <meta property="og:locale" content="en_US" />
+ <meta property="og:site_name" content="CityLab" />
+ <meta property="og:title" content="The Modern Ambitions Behind Neon" />
+ <meta property="og:type" content="article" />
+ <meta property="og:url" content="https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:site" content="@CityLab" />
+ <meta name="theme-color" content="#0ab961" />
+ <script type="application/ld+json">
+ <![CDATA[
+ { "@context": "http://schema.org", "@type": "Organization", "name": "CityLab", "url": "https://www.citylab.com", "logo": "https://cdn.citylab.com/static/a/citylab/img/logos/logo_social_1200x630.png", "sameAs" : [ "https://www.facebook.com/thisiscitylab", "https://twitter.com/citylab", "https://plus.google.com/+citylab/posts" ] }
+ ]]>
+ </script>
+ <meta name="twitter:title" content="Why Neon Is the Ultimate Symbol of the 20th Century" />
+ <meta name="twitter:description" content="The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline." />
+ <meta name="twitter:image" content="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/facebook.jpg?1556645448" />
+ <meta property="author" content="Sarah Archer" />
+ <meta property="article:publisher" content="https://www.facebook.com/thisiscitylab" />
+ <meta property="ia:markup_url" content="https://www.citylab.com/facebook-instant/article/588400/" />
+ </head>
+ <body>
+ <div class="u-hidden">
+ <!--?xml version="1.0" encoding="UTF-8"?--><svg xmlns="http://www.w3.org/2000/svg">
+ <symbol id="icon-close" viewbox="0 0 16 16">
+ <path d="M8 9.525l6.16 6.159a1.076 1.076 0 0 0 1.524 0 1.078 1.078 0 0 0 0-1.525L9.524 8l6.16-6.16A1.078 1.078 0 1 0 14.16.317L8 6.476 1.84.315A1.078 1.078 0 1 0 .317 1.84L6.476 8l-6.16 6.16a1.078 1.078 0 1 0 1.525 1.524L8 9.524z"></path>
+ </symbol>
+ <symbol id="icon-facebook" viewbox="0 0 16 16">
+ <path d="M15.022 0H.877A.88.88 0 0 0 0 .883v14.234A.88.88 0 0 0 .877 16h7.615V9.804H6.42V7.389h2.072V5.61c0-2.067 1.255-3.192 3.087-3.192.877 0 1.631.065 1.851.095v2.16h-1.27c-.997 0-1.19.476-1.19 1.176v1.541h2.376l-.309 2.415H10.97V16h4.052a.88.88 0 0 0 .877-.883V.883A.88.88 0 0 0 15.022 0" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol id="icon-instagram" viewbox="0 0 16 16">
+ <path class="cls-1" d="M15.93 8.07v3.53a4.42 4.42 0 0 1-3.31 4.21 4.15 4.15 0 0 1-1 .14H4.45a4.26 4.26 0 0 1-3.88-2.34 4.11 4.11 0 0 1-.52-2.05C0 9.18 0 6.8.06 4.43A4.26 4.26 0 0 1 2.32.62 4.21 4.21 0 0 1 4.49.06h7.11a4.21 4.21 0 0 1 2.79 1.06 4.3 4.3 0 0 1 1.47 2.56 4.75 4.75 0 0 1 .07.82v3.57zM8 12.42A4.41 4.41 0 1 0 3.58 8 4.41 4.41 0 0 0 8 12.42zm6.18-9.7a.88.88 0 1 0-.89.88.89.89 0 0 0 .88-.89z"></path>
+ <circle class="cls-1" cx="7.99" cy="8.01" r="2.65"></circle>
+ </symbol>
+ <symbol id="icon-linkedin" viewbox="0 0 16 16">
+ <path d="M3.48 15.925H.341V5.085h3.07v10.84h.07zM1.842 3.738C.682 3.738 0 2.916 0 1.87 0 .822.75 0 1.91 0s1.843.822 1.843 1.87c0 .971-.75 1.868-1.91 1.868zM15.9 15.925h-3.548v-5.607c0-1.496-.546-2.468-1.774-2.468-.956 0-1.433.673-1.706 1.346-.068.225-.068.598-.068.897V16h-3.48s.068-9.944 0-10.916h3.48v1.72c.204-.748 1.296-1.795 3.07-1.795 2.184 0 3.958 1.57 3.958 4.935v5.981h.068z" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol id="icon-logo" viewbox="0 0 26 28">
+ <path class="top" d="M18.961 9.065h6.732C23.758 4.025 18.934.45 13.277.45 6.33.45.631 5.832.005 12.703H6.02c.614-3.541 3.659-6.235 7.328-6.235 2.242 0 4.247 1.008 5.613 2.597z"></path>
+ <path class="bottom" d="M25.73 18.768h-6.596c-1.365 1.706-3.448 2.798-5.786 2.798-3.739 0-6.827-2.798-7.36-6.437H0c.587 6.914 6.3 12.342 13.277 12.342 5.69 0 10.54-3.617 12.452-8.703"></path>
+ </symbol>
+ <symbol id="icon-more" viewbox="0 0 16 4">
+ <g fill-rule="evenodd">
+ <circle cx="2" cy="2" r="2"></circle>
+ <circle cx="8" cy="2" r="2"></circle>
+ <circle cx="14" cy="2" r="2"></circle>
+ </g>
+ </symbol>
+ <symbol id="icon-rss" viewbox="0 0 17 16">
+ <path d="M3.137 16a2.731 2.731 0 0 1-2.722-2.74 2.731 2.731 0 0 1 2.722-2.74 2.731 2.731 0 0 1 2.723 2.74A2.731 2.731 0 0 1 3.137 16zm11.816 0a1.366 1.366 0 0 1-1.36-1.37c0-7.335-4.529-11.89-11.817-11.89a1.366 1.366 0 0 1-1.36-1.37C.415.613 1.024 0 1.775 0c4.304 0 7.95 1.384 10.559 4.005 2.609 2.62 3.98 6.295 3.98 10.625 0 .757-.61 1.37-1.362 1.37zm-5.152 0a1.366 1.366 0 0 1-1.362-1.37c0-4.449-2.242-6.705-6.663-6.705a1.366 1.366 0 0 1-1.36-1.37c0-.756.609-1.37 1.36-1.37 5.964 0 9.386 3.442 9.386 9.444 0 .363-.143.712-.398.97A1.357 1.357 0 0 1 9.8 16z" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol id="icon-search" viewbox="0 0 14 14">
+ <path d="M14 12.935L9.716 8.71c.758-.933 1.082-1.996 1.082-3.294C10.798 2.425 8.381 0 5.4 0 2.418 0 0 2.425 0 5.416c0 2.991 2.418 5.416 5.4 5.416 1.299 0 2.285-.288 3.217-1.056L12.9 14 14 12.935zM1.08 5.415A4.326 4.326 0 0 1 5.4 1.082c2.384 0 4.318 1.94 4.318 4.333A4.325 4.325 0 0 1 5.4 9.75a4.326 4.326 0 0 1-4.32-4.334z" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol id="icon-twitter" viewbox="0 0 16 14">
+ <path d="M14.026 2.13A3.39 3.39 0 0 0 15.46.25c-.63.39-1.328.673-2.071.825A3.197 3.197 0 0 0 11.008 0C9.206 0 7.746 1.523 7.746 3.401c0 .267.029.527.084.776C5.12 4.035 2.716 2.68 1.107.623a3.497 3.497 0 0 0-.442 1.71 3.44 3.44 0 0 0 1.451 2.83A3.148 3.148 0 0 1 .64 4.739v.043c0 1.648 1.124 3.023 2.616 3.335a3.14 3.14 0 0 1-1.473.059c.415 1.351 1.62 2.334 3.047 2.362A6.377 6.377 0 0 1 0 11.946a8.96 8.96 0 0 0 5 1.528c6 0 9.281-5.183 9.281-9.678 0-.148-.003-.294-.01-.44A6.794 6.794 0 0 0 15.9 1.595a6.315 6.315 0 0 1-1.873.536z" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol id="icon-wordmark-white" viewbox="0 0 838 134">
+ <g fill-rule="nonzero">
+ <path d="M243 40.3h29.8V133H243zM94.8 42.5h33.5C118.7 17.7 94.6.2 66.5.2 31.9.2 3.5 26.7.4 60.4h30C33.5 43 48.6 29.8 66.9 29.8 78 29.7 88 34.7 94.8 42.5M128.5 90.2H95.7C88.9 98.6 78.5 104 66.9 104c-18.6 0-34-13.8-36.7-31.6H.4c2.9 34 31.4 60.7 66.1 60.7 28.3-.1 52.5-17.9 62-42.9M152.7.2h29.8V133h-29.8zM204.7.2h106.5v28H204.7zM400.7 66.7L362.3.2h-34.4l46.3 80V133h34.4V79.3zM415.7 68L454.9.2h-34.4l-22 38.1zM473.7.2h29.8V94h-29.8zM473.7 105.9h88.5v27h-88.5zM612.8 133L661.1.2h-31.7L581.1 133zM685 133h31.7L671 7.6l-15.6 44.1 10.5 28.7h-21l-10.4 28.4h41.7zM738.8.2h25.8V133h-25.8zM824.7 63.2c4.9-6.9 7.5-14.9 7.5-23.1 0-21.2-16.7-38.7-38-39.7L789 .2h-12.7v26.3h21c7.5 0 13.6 6.1 13.6 13.6s-6.1 13.6-13.6 13.6h-21v25.7h21c7.5 0 13.6 6.1 13.6 13.6s-6.1 13.6-13.6 13.6h-21V133h18.9l5.2-.3c20.6-1.6 36.7-19 36.7-39.6 0-10.8-4.4-20.9-12.4-28.5l-.6-.6.6-.8"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-wordmark" viewbox="0 0 122 21">
+ <g fill-rule="evenodd">
+ <path class="u-fill-green" d="M69.075 19.786h12.861V15.83H69.075z"></path>
+ <path class="dark" d="M35.257 20.046h4.326V6.476h-4.326z"></path>
+ <path d="M13.726 6.199H18.6C17.2 2.573 13.707 0 9.61 0 4.58 0 .454 3.873 0 8.817h4.355C4.8 6.269 7.005 4.33 9.662 4.33c1.623 0 3.075.725 4.064 1.868zM18.63 13.411h-4.775a5.366 5.366 0 0 1-4.19 2.014c-2.707 0-4.943-2.014-5.329-4.632H0c.425 4.975 4.562 8.88 9.614 8.88 4.12 0 7.632-2.602 9.016-6.262M22.305 19.442h4.329V0h-4.329zM29.5 4.103h15.481V0h-15.48zM58.07 9.74L52.486 0h-4.997l6.721 11.72v7.722h5.014l-.002-7.853zM60.063 9.934L65.76 0h-4.997l-3.2 5.582z" class="u-fill-green"></path>
+ <path class="light" d="M69.075 13.738h4.327V0h-4.327z"></path>
+ <path class="u-fill-green" d="M88.79 19.442L95.82 0h-4.607l-7.027 19.442z"></path>
+ <path class="dark" d="M99.443 19.792h4.605L97.414 1.44 95.14 7.89l1.521 4.208h-3.05L92.1 16.251h6.063z"></path>
+ <path class="u-fill-green" d="M107.21 19.442h3.749V0h-3.75zM119.991 9.23a5.82 5.82 0 0 0 1.093-3.39 5.809 5.809 0 0 0-5.519-5.812L114.811 0h-1.845v3.856h3.054c1.092 0 1.98.894 1.98 1.994a1.989 1.989 0 0 1-1.98 1.993.62.62 0 0 1-.086-.006l-.061.006h-2.907v3.765h3.054a1.99 1.99 0 0 1 1.98 1.995 1.989 1.989 0 0 1-1.98 1.993.674.674 0 0 1-.086-.006l-.061.006h-2.907v3.847h2.75l.752-.048c2.994-.24 5.34-2.784 5.34-5.794 0-1.579-.639-3.063-1.8-4.179l-.092-.088.075-.104"></path>
+ </g>
+ </symbol></svg>
+ </div>
+ <div class="l-wrapper">
+ <div class="l-content">
+ <section class="js-notifications"></section>
+ <div class="l-content__inner">
+ <header class="l-header l-header--article" role="banner">
+ <div class="c-wordmark c-wordmark--header">
+ <a href="#main-content" class="c-skip-link">Skip to content</a> <a class="c-wordmark__link" href="/" aria-label="CityLab"><svg class="c-wordmark__icon c-wordmark__icon--header" viewbox="0 0 122 21">
+ <use xlink:href="#icon-wordmark"></use></svg></a>
+ </div>
+ <nav class="c-nav c-nav--header" role="navigation" aria-label="Main Navigation">
+ <div class="c-nav__container c-nav__container--header">
+ <ul class="c-nav__list c-nav__list--header">
+ <li class="c-nav__item c-nav__item--header">
+ <a class="c-nav__link c-nav__link--header" href="/design/">Design</a>
+ </li>
+ <li class="c-nav__item c-nav__item--header">
+ <a class="c-nav__link c-nav__link--header" href="/transportation/">Transportation</a>
+ </li>
+ <li class="c-nav__item c-nav__item--header">
+ <a class="c-nav__link c-nav__link--header" href="/environment/">Environment</a>
+ </li>
+ <li class="c-nav__item c-nav__item--header">
+ <a class="c-nav__link c-nav__link--header" href="/equity/">Equity</a>
+ </li>
+ <li class="c-nav__item c-nav__item--header">
+ <a class="c-nav__link c-nav__link--header" href="/life/">Life</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ <div class="c-search-nav">
+ <a class="c-search-nav__link" href="/search" aria-label="Search"><svg class="c-search-nav__icon" viewbox="0 0 14 14">
+ <use xlink:href="#icon-search"></use></svg></a>
+ </div>
+ </header>
+ <main id="main-content" class="l-main" role="main">
+ <article class="l-article s-cms-content" itemscope="itemscope" itemtype="https://schema.org/NewsArticle">
+ <meta itemprop="datePublished" content="2019-04-30T13:39:00-04:00" />
+ <meta itemprop="dateModified" content="2019-04-30T13:40:00-04:00" />
+ <meta itemprop="mainEntityOfPage" content="https://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/" />
+ <div itemprop="publisher" itemscope="itemscope" itemtype="https://schema.org/Organization">
+ <meta itemprop="name" content="CityLab" />
+ <meta itemprop="url" content="https://www.citylab.com" />
+ <div itemprop="logo" itemscope="itemscope" itemtype="http://schema.org/ImageObject">
+ <meta itemprop="url" content="https://cdn.citylab.com/static/a/citylab/img/logos/logo_social_1200x630.png" />
+ </div>
+ </div>
+ <figure class="c-lead-image" itemprop="image" itemscope="itemscope" itemtype="http://schema.org/ImageObject">
+ <picture class="c-lead-image__image"><source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/940.jpg?mod=1556645448" media="(min-width: 1024px)" /> <source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/lead_large.jpg?mod=1556645448" media="(min-width: 576px)" /></picture>
+ <meta itemprop="height" content="128" />
+ <meta itemprop="width" content="300" />
+ <meta itemprop="url" content="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" /><picture class="c-lead-image__image"><source srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" media="(max-width: 575px)" /><img class="c-lead-image__img" srcset="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" alt="" itemprop="contentUrl" onload="performance.mark(&quot;citylab_lead_image_loaded&quot;)" /><noscript><img class="c-lead-image__img" src="https://cdn.citylab.com/media/img/citylab/2019/04/mr1/300.jpg?mod=1556645448" alt="" /></noscript></picture>
+ <figcaption class="c-lead-image__credit">
+ <span class="c-lead-image__caption" itemprop="caption">The Moulin Rouge cabaret in Paris</span> <span class="c-lead-image__attribution" itemprop="creator">Benoit Tessier/Reuters</span>
+ </figcaption>
+ </figure>
+ <div class="l-article__meta">
+ <h1 class="l-article__hed" itemprop="headline">
+ Why Neon Is the Ultimate Symbol of the 20th Century
+ </h1>
+ <div class="c-byline c-byline--article__hed">
+ <ol class="c-meta__byline c-meta__byline--article__hed">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article__hed" href="https://www.citylab.com/authors/sarah-archer/">Sarah Archer</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article__hed">1:39 PM ET</time></span>
+ </div>
+ </div>
+ <h2 class="l-article__dek o-small-container" itemprop="description">
+ The once-ubiquitous form of lighting was novel when it first emerged in the early 1900s, though it has since come to represent decline.
+ </h2>
+ <section class="c-tmp-share-sponsored-container o-small-container js-action-bar-active">
+ <div class="c-share c-share--">
+ <ul class="c-share__list">
+ <li class="c-share__item">
+ <a class="c-btn c-btn--share c-btn--facebook c-share__link" href="#" role="button" data-share="facebook"><svg class="c-icon c-icon--share" viewbox="0 0 16 16">
+ <use xlink:href="#icon-facebook"></use></svg> <span class="c-btn__share-label">Share</span></a>
+ </li>
+ <li class="c-share__item">
+ <a class="c-btn c-btn--share c-btn--twitter c-share__link" href="#" role="button" data-share="twitter" data-share-title="The Modern Ambitions Behind Neon"><svg class="c-icon c-icon--share" viewbox="0 0 16 16">
+ <use xlink:href="#icon-twitter"></use></svg> <span class="c-btn__share-label">Tweet</span></a>
+ </li>
+ <li class="c-share__item c-share__item--more">
+ <a class="c-btn c-btn--share c-btn--more" href="#" role="button" aria-label="More items"><svg class="c-icon c-icon--share c-icon--more" viewbox="0 0 16 4">
+ <use xlink:href="#icon-more"></use></svg></a>
+ <ul class="c-more">
+ <li class="c-more__item">
+ <a class="c-more__link c-share__link" href="#" data-share="linkedin">LinkedIn</a>
+ </li>
+ <li class="c-more__item">
+ <a class="c-more__link" href="mailto:?subject=Why%20Neon%20Is%20the%20Ultimate%20Symbol%20of%20the%2020th%20Century&amp;body=The%20once-ubiquitous%20form%20of%20lighting%20was%20novel%20when%20it%20first%20emerged%20in%20the%20early%201900s,%20though%20it%20has%20since%20come%20to%20represent%20decline.%0D%0A%20%0ARead%20More:%0Ahttps://www.citylab.com/design/2019/04/neon-signage-20th-century-history/588400/">Email</a>
+ </li>
+ <li class="c-more__item">
+ <a class="c-more__link c-share__link--print" href="#">Print</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </section>
+ <section class="s-article__section o-small-container" id="article-section-1">
+ <p>
+ In the summer of 1898, the Scottish chemist Sir William Ramsay made a discovery that would eventually give the Moulin Rouge in Paris, the Las Vegas Strip, and New York’s Times Square their perpetual nighttime glow. Using the boiling point of argon as a reference point, Ramsay and his colleague Morris W. Travers isolated three more noble gases and gave them evocative Greek names: neon, krypton, and xenon. In so doing, the scientists bestowed a label of permanent novelty on the most famous of the trio—neon, which translates as “new.” This discovery was the foundation on which the French engineer Georges Claude crafted a new form of illumination over the next decade. He designed glass tubes in which neon gas could be trapped, then electrified, to create a light that glowed reliably for more than 1,000 hours.
+ </p>
+ <p>
+ In the 2012 book <em>L’être et le Néon</em>, <a href="https://mitpress.mit.edu/books/being-and-neonness-translation-and-content-revised-augmented-and-updated-edition-luis-de-miranda">which has been newly translated into English by Michael Wells</a>, the philosopher Luis de Miranda weaves a history of neon lighting as both artifact and metaphor. <em>Being and Neonness</em>, as the book is called in its English edition, isn’t a typical material history. There are no photographs. Even de Miranda’s own example of a neon deli sign spotted in Paris is re-created typographically, with text in all caps and dashes forming the border of the sign, as one might attempt on Twitter. Fans of Miami Beach’s restored Art Deco hotels and California’s bowling alleys might be disappointed by the lack of glossy historical images. Nonetheless, de Miranda makes a convincing case for neon as a symbol of the grand modern ambitions of the 20th century.
+ </p>
+ <aside class="pullquote instapaper_ignore">
+ The very quality that made neon fixtures a poor choice for interior lighting made them perfect for signs.
+ </aside>
+ <p>
+ De Miranda beautifully evokes the notion of neon lighting as an icon of the 1900s in his introduction: “When we hear the word <em>neon</em>, an image pops into our heads: a combination of light, colors, symbols, and glass. This image is itself a mood. It carries an atmosphere. It speaks … of the essence of cities, of the poetry of nights, of the 20th century.” When neon lights debuted in Europe, they seemed dazzlingly futuristic. But their husky physicality started becoming obsolete by the 1960s, thanks in part to the widespread use of plastic for fluorescent signs. Neon signs exist today, though they’ve been eclipsed by newer technologies such as digital billboards, and they remain charmingly analog: Signs must be made by hand because there’s no cost-effective way to mass-produce them.
+ </p>
+ <p>
+ In the 1910s, neon started being used for cosmopolitan flash in Paris at precisely the time and place where the first great modernist works were being created. De Miranda’s recounting of the ingenuity emerging from the French capital a century ago is thrilling to contemplate: the cubist art of Pablo Picasso, the radically deconstructed fashions of Coco Chanel, the stream-of-consciousness poetry of Gertrude Stein, and the genre-defying music of Claude Debussy—all of which heralded a new age of culture for Europe and for the world.
+ </p>
+ </section>
+ <aside class="c-related-content u-full-width u-lazy lazyload" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/related-content.a8ad49998034.css">
+ <h4 class="c-related-content__title">
+ Recommended
+ </h4>
+ <div class="c-related-content__container">
+ <ul class="c-related-content__list">
+ <li class="c-related-content__item">
+ <a class="c-related-content__image" href="https://www.citylab.com/design/2014/07/remembering-pittsburghs-most-mesmerizing-sign/374553/"><picture><img class="c-related-content__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2014/07/ws1/144x144.jpg?mod=1494541269" alt="" /><noscript><img class="c-related-content__img" src="https://cdn.citylab.com/media/img/citylab/2014/07/ws1/144x144.jpg?mod=1494541269" alt="" /></noscript></picture></a>
+ <div class="c-related-content__content">
+ <h5 class="c-related-content__hed">
+ <a class="c-related-content__link" href="https://www.citylab.com/design/2014/07/remembering-pittsburghs-most-mesmerizing-sign/374553/">Remembering Pittsburgh's Most Mesmerizing Sign</a>
+ </h5>
+ <div class="c-byline c-byline--related-content">
+ <ol class="c-meta__byline c-meta__byline--related-content">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--related-content" href="https://www.citylab.com/authors/mark-byrnes/">Mark Byrnes</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--related-content">Jul 17, 2014</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-related-content__item">
+ <a class="c-related-content__image" href="https://www.citylab.com/life/2018/03/navigator-long-llive-the-deadmalls/555203/"><picture><img class="c-related-content__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2018/03/Screen_Shot_2018_03_09_at_5.22.15_PM/144x144.png?mod=1520634210" alt="" /><noscript><img class="c-related-content__img" src="https://cdn.citylab.com/media/img/citylab/2018/03/Screen_Shot_2018_03_09_at_5.22.15_PM/144x144.png?mod=1520634210" alt="" /></noscript></picture></a>
+ <div class="c-related-content__content">
+ <h5 class="c-related-content__hed">
+ <a class="c-related-content__link" href="https://www.citylab.com/life/2018/03/navigator-long-llive-the-deadmalls/555203/">Navigator: Ode To The Dead Mall</a>
+ </h5>
+ <div class="c-byline c-byline--related-content">
+ <ol class="c-meta__byline c-meta__byline--related-content">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--related-content" href="https://www.citylab.com/authors/tanvi-misra/">Tanvi Misra</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--related-content">Mar 9, 2018</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-related-content__item">
+ <a class="c-related-content__image" href="https://www.citylab.com/life/2017/08/art-of-making-a-neon-sign/537618/"><picture><img class="c-related-content__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2017/08/Screen_Shot_2017_08_22_at_6.42.43_PM/144x144.png?mod=1503441831" alt="" /><noscript><img class="c-related-content__img" src="https://cdn.citylab.com/media/img/citylab/2017/08/Screen_Shot_2017_08_22_at_6.42.43_PM/144x144.png?mod=1503441831" alt="" /></noscript></picture></a>
+ <div class="c-related-content__content">
+ <h5 class="c-related-content__hed">
+ <a class="c-related-content__link" href="https://www.citylab.com/life/2017/08/art-of-making-a-neon-sign/537618/">The Twists and Turns of Making a Neon Sign</a>
+ </h5>
+ <div class="c-byline c-byline--related-content">
+ <ol class="c-meta__byline c-meta__byline--related-content">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--related-content" href="https://www.citylab.com/authors/linda-poon/">Linda Poon</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--related-content">Aug 23, 2017</time></span>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </aside>
+ <section class="s-article__section o-small-container" id="article-section-2">
+ <p>
+ Amid this artistic groundswell, Georges Claude premiered his neon lights at the <a href="https://www.mondial-paris.com/en/visiteur/auto">Paris Motor Show</a> in December 1910, captivating visitors with 40-foot-tall tubes affixed to the building’s exterior. The lights shone orange-red because neon, by itself, produces that color. <em>Neon lighting</em> is a catchall term that describes the technology of glass tubing that contains gas or chemicals that glow when electrified. For example, neon fabricators use carbon dioxide to make white, and mercury to make blue. Claude acknowledged at the time that neon didn’t produce the ideal color for a standard light bulb and insisted that it posed no commercial threat to incandescent bulbs.
+ </p>
+ <p>
+ Of course, the very quality that made neon fixtures a poor choice for interior lighting made them perfect for signs, de Miranda notes. The first of the neon signs was switched on in 1912, advertising a barbershop on Paris’s Boulevard Montmartre, and eventually they were adopted by cinemas and nightclubs. While Claude had a monopoly on neon lighting throughout the 1920s, the leaking of trade secrets and the expiration of a series of patents broke his hold on the rapidly expanding technology.
+ </p>
+ </section>
+ <div class="ad-box-wrapper" data-pos="box"></div>
+ <section class="s-article__section o-small-container" id="article-section-3">
+ <p>
+ In the following decades, neon’s nonstop glow and vibrant colors turned ordinary buildings and surfaces into 24/7 billboards for businesses, large and small, that wanted to convey a sense of always being open. The first examples of neon in the United States debuted in Los Angeles, where the Packard Motor Car Company commissioned two large blue-and-orange <span class="smallcaps">Packard</span> signs that literally stopped traffic because they distracted motorists. The lighting also featured heavily at the Chicago Century of Progress Exposition in 1933 and at the 1939 World’s Fair in New York. At the latter event, a massive neon sign reading <span class="smallcaps">Futurama</span> lit the way to a General Motors exhibition that heralded “The World of Tomorrow.”
+ </p>
+ <figure style="max-width: 620.0px;">
+ <picture style="display: block; position:relative; width:100%; height:0; overflow:hidden; padding-bottom:66.4516129032%;"><img alt="" data-srcset="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_8912060228/cbd32b0e1.jpg" class="lazyload" style="position:absolute; width:100%; height:100%; top:0; left:0; border:0;" /></picture>
+ <figcaption class="caption">
+ Workers remove a hammer and sickle from a neon sign that reads “Glory to Communism,” visible on the roof of the Communist-run electricity-board headquarters in Czechoslovakia in 1989. (AP)
+ </figcaption>
+ </figure>
+ <p>
+ De Miranda points out that businesses weren’t alone in embracing neon’s ability to spread messages effectively. By the middle of the century, the lighting was being adopted for more political purposes. “In the 1960s, the Soviets deployed a vast ‘neonization’ of the Eastern bloc capitals to emulate capitalist metropolises,” de Miranda writes. “Because consumer shops were rare in the Polish capital [of Warsaw], they did not hesitate to illuminate the façades of public buildings.” In other words, as opposed to the sole use of the more obvious forms of propaganda via posters or slogans, the mass introduction of neon lighting was a way of getting citizens of Communist cities to see their surroundings with the pizzazz and nighttime glamour of major Western capitals.
+ </p>
+ </section>
+ <div class="ad-box-wrapper" data-pos="box"></div>
+ <section class="s-article__section o-small-container" id="article-section-4">
+ <p>
+ Neon, around this time, began to be phased out, thanks to cheaper and less labor-intensive alternatives. In addition, the global economic downturn of the 1970s yielded a landscape in which older, flickering neon signs, which perhaps their owners couldn’t afford to fix or replace, came to look like symbols of decline. Where such signs were once sophisticated and novel, they now seemed dated and even seedy.
+ </p>
+ <section class="c-newsletter c-newsletter--promo c-newsletter--cta">
+ <h2 class="c-newsletter__title">
+ Cities are changing fast. Keep up with the <b>CityLab Daily</b> newsletter.
+ </h2><label for="promo-email-input-email" class="c-newsletter__cta c-newsletter__cta--promo">The best way to follow issues you care about.</label>
+ <form id="promo-email" class="js-newsletter-form c-newsletter__form c-newsletter__form--promo" action="#" name="promo-email">
+ <input class="js-newsletter-field--email c-newsletter__field c-newsletter__field--email c-newsletter__field--promo" id="promo-email-input-email" name="email" type="email" placeholder="Email Address" aria-label="Email Address" /><input type="hidden" name="newsletters" value="7607485" /><input type="hidden" name="newsletterName" value="Today on CityLab" /> <button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--promo c-newsletter__submit--promo" type="submit" name="submit">Subscribe</button>
+ <div class="c-loader" role="status">
+ <button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--promo c-newsletter__submit--promo" type="submit" name="submit"><span class="c-btn__loader">Loading...</span></button>
+ </div><button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--promo c-newsletter__submit--promo" type="submit" name="submit"></button>
+ <div class="js-newsletter-message"></div>
+ </form>
+ </section>
+ <p>
+ De Miranda understands this evolution by zooming out and looking at the 1900s as the “neon century.” The author draws a parallel between the physical form of neon lights, which again are essentially containers for electrified gases, and that of a glass capsule—suggesting they are a kind of message in a bottle from a time before the First World War. “Since then, [neon lights] have witnessed all the transformations that have created the world we live in,” de Miranda writes. “Today, they sometimes seem to maintain a hybrid status, somewhere between junkyards and museums, not unlike European capitals themselves.”
+ </p>
+ <figure style="max-width: 620.0px;">
+ <picture style="display: block; position:relative; width:100%; height:0; overflow:hidden; padding-bottom:66.6129032258%;"><img alt="" data-srcset="https://cdn.theatlantic.com/assets/media/img/posts/2019/04/AP_945361213236/888fdd750.jpg" class="lazyload" style="position:absolute; width:100%; height:100%; top:0; left:0; border:0;" /></picture>
+ <figcaption class="caption">
+ Martin Wartman, a student at Northern Kentucky University, works on a neon sign at the Neonworks of Cincinnati workshop connected to the American Sign Museum, in 2016. (John Minchillo / AP)
+ </figcaption>
+ </figure>
+ <p>
+ Another mark of neon’s hybridity: Its obsolescence started just as some contemporary artists began using the lights in their sculptures. Bruce Nauman’s 1968 work <em><a href="https://www.stedelijk.nl/en/collection/1097-bruce-nauman-my-name-as-though-it-were-written-on-the-surface-of-the-moon">My Name as Though It Were Written on the Surface of the Moon</a></em> poked fun at the space race—another symbol of 20th-century technological innovation whose moment has passed. The piece uses blue “neon” letters (mercury, actually) to spell out the name “bruce” in lowercase cursive, with each character repeated several times as if to convey a person speaking slowly in outer space. The British artist Tracey Emin has made <a href="https://www.artsy.net/collection/tracey-emin-neon-sculptures-and-prints">sculptures</a> that resemble neon Valentine’s Day candies: They read as garish and sentimental confections with pink, heart-shaped frames that surround blue text fragments. Drawing on the nostalgia-inducing quality of neon, the sculptures’ messages are redolent of old-fashioned movie dialogue, with titles such as “You Loved Me Like a Distant Star” and “The Kiss Was Beautiful.”
+ </p>
+ <p>
+ Seeing neon lighting tamed in the context of a gallery display fits comfortably with de Miranda’s notion that neon technology is like a time capsule from another age. In museums, works of neon art and design coexist with objects that were ahead of their own time in years past—a poignant fate for a technology that made its name advertising “The World of Tomorrow.” Yet today neon is also experiencing a kind of craft revival. The fact that it can’t be mass-produced has made its fabrication something akin to a cherished artisanal technique. Bars and restaurants hire firms such as Let There Be Neon in Manhattan, or <a href="https://www.instagram.com/theneonqueen/">the L.A.-based master neon artist Lisa Schulte</a>, to create custom signs and works of art. Neon’s story even continues to glow from inside museums such as California’s <a href="https://www.neonmona.org/">Museum of Neon Art</a> and the Neon Museum in Las Vegas. If it can still be a vital medium for artists and designers working today, “neonness” need not only be trapped in the past. It might also capture the mysterious glow of the near future—just as it did a century ago.
+ </p>
+ <p>
+ <em>This article originally appeared on <a href="https://www.theatlantic.com/entertainment/archive/2019/04/being-and-neonness-neon-lights-symbol-20th-century/588184/">The Atlantic</a>.</em>
+ </p>
+ </section>
+ <section class="c-authors-article u-lazy lazyload" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/author-article.cf4e8e0b143f.css">
+ <h4 class="c-authors-article__about-title">
+ About the Author
+ </h4>
+ <section class="c-author-article" itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
+ <div class="c-author-article__content">
+ <h5 class="c-author-article__title" itemprop="name">
+ <a class="c-author-article__link" href="https://www.citylab.com/authors/sarah-archer/">Sarah Archer</a>
+ </h5>
+ <ul class="c-author-article__list">
+ <li class="c-author-article__item">
+ <svg class="c-icon c-icon--rss c-icon--author-article" viewbox="0 0 16 16">
+ <use xlink:href="#icon-rss"></use></svg> <a href="/feeds/author/sarah-archer/" itemprop="url">Feed</a>
+ </li>
+ </ul>
+ <p class="c-author-article__bio" itemprop="description">
+ <a href="https://www.citylab.com/authors/sarah-archer/" class="author-link" data-omni-click="inherit">Sarah Archer</a> is the author of <em>The Midcentury Kitchen</em>.
+ </p>
+ </div>
+ </section>
+ </section>
+ </article>
+ <section class="c-disqus lazyload" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/disqus.09fd7da024fd.css">
+ <button type="button" class="c-btn c-btn--disqus-comments js-load-disqus-comments">Expand Comments +</button>
+ <div id="disqus_thread" class="c-wrapper__disqus-comments"></div>
+ </section>
+ <div class="c-presented-by c-presented-by--article-logo">
+ <div class="c-presented-by__content c-presented-by__content--article-logo" data-label="with funding from"></div>
+ </div>
+ <section class="c-article-most-popular js-action-bar-disable u-lazy lazyload" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/article-most-popular.3a9846ccf46b.css">
+ <h2 class="c-article-most-popular__title">
+ Most Popular
+ </h2>
+ <div class="c-article-most-popular__container">
+ <ol class="c-article-most-popular__list">
+ <li class="c-article-most-popular__item">
+ <a href="https://www.citylab.com/transportation/2019/04/innisfil-transit-ride-hailing-bus-public-transportation-uber/588154/"><picture class="c-article-most-popular__picture"><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/RTS28UAK/thumb.jpg?mod=1556565008" media="(min-width: 1024px)" /><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/RTS28UAK/144x144.jpg?mod=1556565008" media="(max-width: 575px)" /><img class="c-article-most-popular__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/RTS28UAK/144x144.jpg?mod=1556565008" alt="A photo of an Uber Bus in Cairo, the company's new microtransit program." /><noscript><img class="c-article-most-popular__img" src="https://cdn.citylab.com/media/img/citylab/2019/04/RTS28UAK/144x144.jpg?mod=1556565008" alt="A photo of an Uber Bus in Cairo, the company's new microtransit program." /></noscript></picture></a>
+ <div class="c-article-most-popular__content">
+ <a class="c-article-most-popular__link c-article-most-popular__link--kicker" href="https://www.citylab.com/transportation/">Transportation</a>
+ <h3 class="c-article-most-popular__hed">
+ <a class="c-article-most-popular__link" href="https://www.citylab.com/transportation/2019/04/innisfil-transit-ride-hailing-bus-public-transportation-uber/588154/">‘Uber Was Supposed To Be Our Public Transit’</a>
+ </h3>
+ <p class="c-article-most-popular__dek">
+ Innisfil, Ontario, decided to partially subsidize ride-hailing trips rather than pay for a public bus system. It worked so well that now they have to raise fares and cap rides.
+ </p>
+ <div class="c-byline c-byline--article-most-popular">
+ <ol class="c-meta__byline c-meta__byline--article-most-popular">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article-most-popular" href="https://www.citylab.com/authors/laura-bliss/">Laura Bliss</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article-most-popular">Apr 29, 2019</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-article-most-popular__item">
+ <a href="https://www.citylab.com/environment/2015/10/a-13235-mile-road-trip-for-70-degree-weather-every-day/411406/"><picture class="c-article-most-popular__picture"><source data-srcset="https://cdn.citylab.com/media/img/citylab/2015/10/winter_forecast_2015_cold_weather_october_snow_rain_sleet_hail_el_nino/thumb.jpg?mod=1494536288" media="(min-width: 1024px)" /><source data-srcset="https://cdn.citylab.com/media/img/citylab/2015/10/winter_forecast_2015_cold_weather_october_snow_rain_sleet_hail_el_nino/144x144.jpg?mod=1494536288" media="(max-width: 575px)" /><img class="c-article-most-popular__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2015/10/winter_forecast_2015_cold_weather_october_snow_rain_sleet_hail_el_nino/144x144.jpg?mod=1494536288" alt="" /><noscript><img class="c-article-most-popular__img" src="https://cdn.citylab.com/media/img/citylab/2015/10/winter_forecast_2015_cold_weather_october_snow_rain_sleet_hail_el_nino/144x144.jpg?mod=1494536288" alt="" /></noscript></picture></a>
+ <div class="c-article-most-popular__content">
+ <a class="c-article-most-popular__link c-article-most-popular__link--kicker" href="https://www.citylab.com/environment/">Environment</a>
+ <h3 class="c-article-most-popular__hed">
+ <a class="c-article-most-popular__link" href="https://www.citylab.com/environment/2015/10/a-13235-mile-road-trip-for-70-degree-weather-every-day/411406/">A 13,235-Mile Road Trip for 70-Degree Weather Every Day</a>
+ </h3>
+ <p class="c-article-most-popular__dek">
+ This year-long journey across the U.S. keeps you at consistent high temperatures.
+ </p>
+ <div class="c-byline c-byline--article-most-popular">
+ <ol class="c-meta__byline c-meta__byline--article-most-popular">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article-most-popular" href="https://www.citylab.com/authors/john-metcalfe/">John Metcalfe</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article-most-popular">Oct 20, 2015</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-article-most-popular__item">
+ <a href="https://www.citylab.com/environment/2019/04/air-conditioning-climate-change-carbon-capture-technology/588403/"><picture class="c-article-most-popular__picture"><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Air_conditioning_Singapore/thumb.jpg?mod=1556646728" media="(min-width: 1024px)" /><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Air_conditioning_Singapore/144x144.jpg?mod=1556646728" media="(max-width: 575px)" /><img class="c-article-most-popular__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Air_conditioning_Singapore/144x144.jpg?mod=1556646728" alt="The outside of a large apartment building, dotted with air conditioners." /><noscript><img class="c-article-most-popular__img" src="https://cdn.citylab.com/media/img/citylab/2019/04/Air_conditioning_Singapore/144x144.jpg?mod=1556646728" alt="The outside of a large apartment building, dotted with air conditioners." /></noscript></picture></a>
+ <div class="c-article-most-popular__content">
+ <a class="c-article-most-popular__link c-article-most-popular__link--kicker" href="https://www.citylab.com/environment/">Environment</a>
+ <h3 class="c-article-most-popular__hed">
+ <a class="c-article-most-popular__link" href="https://www.citylab.com/environment/2019/04/air-conditioning-climate-change-carbon-capture-technology/588403/">What If Air Conditioning Could Help Stop Climate Change Instead of Causing It?</a>
+ </h3>
+ <p class="c-article-most-popular__dek">
+ Using technology currently in development, AC units in skyscrapers and homes could get turned into machines that pull carbon dioxide out of the atmosphere.
+ </p>
+ <div class="c-byline c-byline--article-most-popular">
+ <ol class="c-meta__byline c-meta__byline--article-most-popular">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article-most-popular" href="https://www.citylab.com/authors/matt-simon/">Matt Simon</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article-most-popular">1:57 PM ET</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-article-most-popular__item">
+ <a href="https://www.citylab.com/transportation/2019/04/texas-central-railway-high-speed-bullet-train-cost-route/587743/"><picture class="c-article-most-popular__picture"><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/shinkansen_flowers/thumb.jpg?mod=1556300630" media="(min-width: 1024px)" /><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/shinkansen_flowers/144x144.jpg?mod=1556300630" media="(max-width: 575px)" /><img class="c-article-most-popular__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/shinkansen_flowers/144x144.jpg?mod=1556300630" alt="A train traveling on an elevated platform." /><noscript><img class="c-article-most-popular__img" src="https://cdn.citylab.com/media/img/citylab/2019/04/shinkansen_flowers/144x144.jpg?mod=1556300630" alt="A train traveling on an elevated platform." /></noscript></picture></a>
+ <div class="c-article-most-popular__content">
+ <a class="c-article-most-popular__link c-article-most-popular__link--kicker" href="https://www.citylab.com/transportation/">Transportation</a>
+ <h3 class="c-article-most-popular__hed">
+ <a class="c-article-most-popular__link" href="https://www.citylab.com/transportation/2019/04/texas-central-railway-high-speed-bullet-train-cost-route/587743/">Texas High Speed Rail Faces a New Threat: Semantics</a>
+ </h3>
+ <p class="c-article-most-popular__dek">
+ A private company plans to break ground on a bullet train between Houston and Dallas in 2019. But opponents of the project have a new argument.
+ </p>
+ <div class="c-byline c-byline--article-most-popular">
+ <ol class="c-meta__byline c-meta__byline--article-most-popular">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article-most-popular" href="https://www.citylab.com/authors/laura-bliss/">Laura Bliss</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article-most-popular">Apr 26, 2019</time></span>
+ </div>
+ </div>
+ </li>
+ <li class="c-article-most-popular__item">
+ <a href="https://www.citylab.com/solutions/2019/04/lausanne-switzerland-design-workshop-place-de-la-riponne/587050/"><picture class="c-article-most-popular__picture"><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Riponne/thumb.jpg?mod=1556541985" media="(min-width: 1024px)" /><source data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Riponne/144x144.jpg?mod=1556541985" media="(max-width: 575px)" /><img class="c-article-most-popular__img u-lazy lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2019/04/Riponne/144x144.jpg?mod=1556541985" alt="" /><noscript><img class="c-article-most-popular__img" src="https://cdn.citylab.com/media/img/citylab/2019/04/Riponne/144x144.jpg?mod=1556541985" alt="" /></noscript></picture></a>
+ <div class="c-article-most-popular__content">
+ <a class="c-article-most-popular__link c-article-most-popular__link--kicker" href="https://www.citylab.com/solutions/">Solutions</a>
+ <h3 class="c-article-most-popular__hed">
+ <a class="c-article-most-popular__link" href="https://www.citylab.com/solutions/2019/04/lausanne-switzerland-design-workshop-place-de-la-riponne/587050/">In Switzerland, Everyone’s an Urban Planner</a>
+ </h3>
+ <p class="c-article-most-popular__dek">
+ To reimagine its largest public space, the Swiss city of Lausanne organized a citywide consultation and workshop that asked: Just who is the public?
+ </p>
+ <div class="c-byline c-byline--article-most-popular">
+ <ol class="c-meta__byline c-meta__byline--article-most-popular">
+ <li class="c-meta__author">
+ <span><a class="c-byline__link c-byline__link--article-most-popular" href="https://www.citylab.com/authors/feargus-osullivan/">Feargus O'Sullivan</a></span>
+ </li>
+ </ol><span><time class="c-byline__time c-byline__time--article-most-popular">7:00 AM ET</time></span>
+ </div>
+ </div>
+ </li>
+ </ol>
+ </div>
+ </section>
+ <div class="c-ballyhoos u-lazy lazyload" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/components/ballyhoo.d62a34a57fbc.css">
+ <div class="c-ballyhoo">
+ <a href="https://www.citylab.com/posts/maps/"><img class="c-ballyhoo__img lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_maps-2/hero.png?mod=1512597427" alt="" /><noscript><img class="c-ballyhoo__img" src="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_maps-2/hero.png?mod=1512597427" alt="" /></noscript></a>
+ <div class="c-ballyhoo__content">
+ <div class="c-ballyhoo__cta">
+ <a class="c-ballyhoo__link c-ballyhoo__link--cta" href="https://www.citylab.com/posts/maps/">Maps</a>
+ </div><a class="c-btn c-btn--border-white c-ballyhoo__btn" href="https://www.citylab.com/posts/maps/">Click Here</a>
+ </div>
+ </div>
+ <div class="c-ballyhoo">
+ <a href="https://www.citylab.com/newsletters/"><img class="c-ballyhoo__img lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_newsletter/hero.png?mod=1512597502" alt="" /><noscript><img class="c-ballyhoo__img" src="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_newsletter/hero.png?mod=1512597502" alt="" /></noscript></a>
+ <div class="c-ballyhoo__content">
+ <div class="c-ballyhoo__cta">
+ <a class="c-ballyhoo__link c-ballyhoo__link--cta" href="https://www.citylab.com/newsletters/">Newsletters</a>
+ </div><a class="c-btn c-btn--border-white c-ballyhoo__btn" href="https://www.citylab.com/newsletters/">Click Here</a>
+ </div>
+ </div>
+ <div class="c-ballyhoo">
+ <a href="https://www.facebook.com/thisiscitylab/"><img class="c-ballyhoo__img lazyload" data-srcset="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_facebook/hero.png?mod=1512597427" alt="" /><noscript><img class="c-ballyhoo__img" src="https://cdn.citylab.com/media/img/citylab/2017/12/ballyhoo_artboards_facebook/hero.png?mod=1512597427" alt="" /></noscript></a>
+ <div class="c-ballyhoo__content">
+ <div class="c-ballyhoo__cta">
+ <a class="c-ballyhoo__link c-ballyhoo__link--cta" href="https://www.facebook.com/thisiscitylab/">Facebook</a>
+ </div><a class="c-btn c-btn--border-white c-ballyhoo__btn" href="https://www.facebook.com/thisiscitylab/">Click Here</a>
+ </div>
+ </div>
+ </div>
+ <section class="c-action-bar js-action-bar u-hidden">
+ <div class="c-action-bar__container">
+ <div class="c-action-bar__section">
+ <div class="c-logo c-logo--action-bar">
+ <a class="c-logo__link" href="/" aria-label="CityLab"><svg class="c-logo__icon c-logo__icon--action-bar" viewbox="0 0 32 32">
+ <use class="c-logo__reference c-logo__reference--action-bar" xlink:href="#icon-logo"></use></svg></a>
+ </div>
+ <div class="c-wordmark c-wordmark--action-bar">
+ <a href="#main-content" class="c-skip-link">Skip to content</a> <a class="c-wordmark__link" href="/" aria-label="CityLab"><svg class="c-wordmark__icon c-wordmark__icon--action-bar" viewbox="0 0 122 21">
+ <use xlink:href="#icon-wordmark"></use></svg></a>
+ </div>
+ <div class="c-share c-share--action-bar">
+ <ul class="c-share__list">
+ <li class="c-share__item">
+ <a class="c-btn c-btn--share c-btn--facebook c-share__link" href="#" role="button" data-share="facebook"><svg class="c-icon c-icon--share" viewbox="0 0 16 16">
+ <use xlink:href="#icon-facebook"></use></svg> <span class="c-btn__share-label">Share</span></a>
+ </li>
+ <li class="c-share__item">
+ <a class="c-btn c-btn--share c-btn--twitter c-share__link" href="#" role="button" data-share="twitter" data-share-title="The Modern Ambitions Behind Neon"><svg class="c-icon c-icon--share" viewbox="0 0 16 16">
+ <use xlink:href="#icon-twitter"></use></svg> <span class="c-btn__share-label">Tweet</span></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="c-action-bar__section c-action-bar__section--next-story c-action-bar__section--most-popular">
+ <a class="c-btn c-btn--action-bar" href="https://www.citylab.com/transportation/2019/04/innisfil-transit-ride-hailing-bus-public-transportation-uber/588154/" role="button">Popular Now on CityLab »</a>
+ </div>
+ </div>
+ </section>
+ </main>
+ </div>
+ <footer class="l-footer lazyload" role="contentinfo" data-include="css:https://cdn.citylab.com/static/a/frontend/dist/citylab/css/layout/footer.26cd77fd51ec.css">
+ <div class="c-logo c-logo--footer">
+ <a class="c-logo__link" href="/" aria-label="CityLab"><svg class="c-logo__icon c-logo__icon--footer" viewbox="0 0 32 32">
+ <use class="c-logo__reference c-logo__reference--footer" xlink:href="#icon-logo"></use></svg></a>
+ </div>
+ <nav class="c-nav c-nav--footer" role="navigation" aria-label="Footer Navigation">
+ <div class="c-nav__container c-nav__container--footer">
+ <ul class="c-nav__list c-nav__list--footer">
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/special-report/">Special&#160;Reports</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/faq/">FAQ</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/masthead/">Masthead</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/solutions/">Solutions</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="https://www.theatlantic.com/store/">Store</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="http://atlanticmedia.com/">Atlantic&#160;Media</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="http://www.atlanticmedia.com/careers/">Jobs</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="https://www.citylab.com/saleskit">Media&#160;Kit</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/sponsored/">Partner Solutions</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/contact/">Contact&#160;Us</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/privacy-policy/">Privacy</a>
+ </li>
+ <li class="c-nav__item c-nav__item--footer">
+ <a class="c-nav__link c-nav__link--footer" href="/terms-conditions/">Terms&#160;&amp;&#160;Conditions</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ <div class="c-social c-social--footer">
+ <ul class="c-social__list">
+ <li class="c-social__item">
+ <a class="c-social__link c-social__link--footer" href="https://www.facebook.com/thisiscitylab" aria-label="Like us on Facebook" role="button"><svg class="c-social__icon" viewbox="0 0 16 16">
+ <use xlink:href="#icon-facebook"></use></svg></a>
+ </li>
+ <li class="c-social__item">
+ <a class="c-social__link c-social__link--footer" href="https://twitter.com/CityLab" aria-label="Follow us on Twitter" role="button"><svg class="c-social__icon" viewbox="0 0 16 16">
+ <use xlink:href="#icon-twitter"></use></svg></a>
+ </li>
+ <li class="c-social__item">
+ <a class="c-social__link c-social__link--footer" href="https://www.instagram.com/citylab/" aria-label="Follow us on Instagram" role="button"><svg class="c-social__icon" viewbox="0 0 16 16">
+ <use xlink:href="#icon-instagram"></use></svg></a>
+ </li>
+ <li class="c-social__item">
+ <a class="c-social__link c-social__link--footer" href="https://www.linkedin.com/company/citylab-com" aria-label="Connect with us on LinkedIn" role="button"><svg class="c-social__icon" viewbox="0 0 16 16">
+ <use xlink:href="#icon-linkedin"></use></svg></a>
+ </li>
+ <li class="c-social__item">
+ <a class="c-social__link c-social__link--footer" href="/feeds/posts/" aria-label="Subscribe to our RSS feed" role="button"><svg class="c-social__icon" viewbox="0 0 16 16">
+ <use xlink:href="#icon-rss"></use></svg></a>
+ </li>
+ </ul>
+ </div>
+ <section class="c-newsletter c-newsletter--footer c-newsletter--cta">
+ <label for="footer-email-input-email" class="c-newsletter__cta c-newsletter__cta--footer">Sign up for CityLab Daily:</label>
+ <form id="footer-email" class="js-newsletter-form c-newsletter__form c-newsletter__form--footer" action="#" name="footer-email">
+ <input class="js-newsletter-field--email c-newsletter__field c-newsletter__field--email c-newsletter__field--footer" id="footer-email-input-email" name="email" type="email" placeholder="Email Address" aria-label="Email Address" /> <input type="hidden" name="newsletters" value="7607485" /> <input type="hidden" name="newsletterName" value="Today on CityLab" /> <button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--footer c-newsletter__submit--footer" type="submit" name="submit">Sign Up</button>
+ <div class="c-loader" role="status">
+ <button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--footer c-newsletter__submit--footer" type="submit" name="submit"><span class="c-btn__loader">Loading...</span></button>
+ </div><button class="js-newsletter-form__btn c-btn c-btn--signup c-btn--footer c-newsletter__submit--footer" type="submit" name="submit"></button>
+ <div class="js-newsletter-message"></div>
+ </form>
+ <p class="c-newsletter__secondary-cta">
+ Subscribe to our other newsletters <a href="https://www.citylab.com/newsletters/">here</a>.
+ </p>
+ </section>
+ <section class="c-about">
+ <p class="c-about__item">
+ CityLab is committed to telling the story of the world’s cities: how they work, the challenges they face, and the solutions they need.
+ </p>
+ <p class="c-about__item">
+ Citylab.com © 2019 The Atlantic Monthly Group
+ </p>
+ </section>
+ </footer>
+ </div>
+ <aside class="l-sponsored" role="complementary">
+ <div class="l-sponsored__inner"></div>
+ </aside>
+ </div>
+ <script src="https://cdn.citylab.com/static/a/frontend/jspm_packages/system.822e0a71e40b.js" onload="performance.mark(&quot;citylab_systemjs_loaded&quot;)"></script>
+ <script>
+ <![CDATA[
+ function hasOwnProp(t,s){return Object.prototype.hasOwnProperty.call(t,s)}function entries(t,s){for(var a in t){if(hasOwnProp(t,a))s(a,t[a])}}var staticHashMap= {"js/bundle/lib": {"newsletter": "747250556035", "action-bar": "d468c0a4885f", "share": "767917b570f9", "child-load": "35d5afd81bb5", "debug": "f5b38d7f2830", "disqus": "0f2de7634a06"}, "js": {"polyfill": "c71e135c0fd0", "system": "a99bf9f54b8b", "bundle": "2d6ea566640d", "concrete": "7e454af0c511"}, "sw": {"sw": "841512067b29"}, "components": {"wordmark": "6c578bf4a8d5", "action-bar": "d284baf86cd9", "ad": "c475d92e204b", "newsletter-form": "b1c47d32486b", "share": "78198eff2776", "author-article": "302d3ebdf6b8", "loader": "985e6af068a5", "featured": "904a0a066926", "logo": "8539240bf828", "newsletter": "e46244103dcd", "native": "197799092c9d", "byline": "b4f131c38edb", "icons": "8c78c9f60481", "notification": "506f567a72b9", "writers": "110e476bcacb", "lead-image": "170464c20c5e", "special-report-item": "6bd0a0b51778", "promo": "f4cd63a7bb4f", "landing-header": "823e96571363", "author-header": "361b50dfce47", "about": "033b1b604744", "skip-link": "9d7d3101027e", "river-item": "21071cfe62cb", "_preview-dark": "b8bbfc29da4f", "search-nav": "36f9642a65e9", "pagination": "8b67d18c0b4b", "masthead": "ded9166dbe25", "disqus": "ec17841abbe5", "homepage-item": "394282204705", "search": "c6566c16bf3e", "related-content": "e411a6a2e6c4", "ballyhoo": "7f3a83aca57a", "_preview": "64756d2ee63a", "presented-by": "9a7c4ace5d22", "most-popular": "89a9947981a8", "article-most-popular": "fb96fa8983a6", "social": "991e186bf610", "author-perspective": "133e604b3cbf", "navigation": "622942b64494"}, "js/bundle": {"ads": "d41d8cd98f00"}};var systemjsMap={};entries(staticHashMap,function(t,s){entries(s,function(s,a){var n="dist/theatlantic/"+t+"/"+s;systemjsMap[n+".js"]=n+"."+a+".js"})});SystemJS.config({baseURL:"https://cdn.citylab.com/static/a/frontend/",map:systemjsMap})
+ ]]>
+ </script>
+ <script src="https://cdn.citylab.com/static/a/frontend/dist/citylab/js/concrete.7e454af0c511.js" onload="performance.mark(&quot;citylab_js_loaded&quot;)"></script>
+ <script>
+ <![CDATA[
+ SystemJS.set("pageInfo",SystemJS.newModule(window.CityLab.page_info))
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ SystemJS.set("adsConfig",SystemJS.newModule({"globals": {"src": "article", "byline": ["sarah-archer"], "title": "why-neon-is-the-ultimate-symbol-of-the-20th-century"}, "zone": "/4624/cities/channel_design", "krux": true, "perfUrl": "https://data-cdn.theatlantic.com/perf.gif", "adtest_domain": "citiestest", "lazy_load": 1, "outofpage": true, "gdpr": false}))
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ SystemJS.set("vendorConfig",SystemJS.newModule({gtm:"GTM-K92Z9D9"}))
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ SystemJS.import("citylab")
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ Promise.all( ["citylab/js/ads", "citylab/js/lib/newsletter", "citylab/js/lib/disqus", "citylab/js/lib/action-bar", "citylab/js/lib/share", "citylab/js/lib/child-load"].map(function(e){return SystemJS.import(e)})).then(function(){performance.mark("citylab_first_batch_dependencies_loaded")})
+ ]]>
+ </script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json
index be86a5838..328eca36b 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected-images.json
@@ -1,3 +1,3 @@
[
- "http:\/\/fakehost\/test\/hmhome.gif "
+ "http:\/\/fakehost\/test\/hmhome.gif"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html
index 8c1b8b121..f9c6e071f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/clean-links/expected.html
@@ -1,11 +1,12 @@
-<div>
- <div>
+<div>
<h3>Study Webtext</h3>
- <h2><span color="Maroon&#xA; " face="Lucida Handwriting ">"Bartleby the Scrivener: A Story of Wall-Street " </span>(1853) <br></br>
+ <h2><span face="Lucida Handwriting " color="Maroon
+ ">"Bartleby the Scrivener: A Story of Wall-Street " </span>(1853)&nbsp;<br>
Herman Melville</h2>
- <h2><a href="http://www.vcu.edu/engweb/webtexts/bartleby.html&#xA; " target="_blank "><img alt="To the story text without notes&#xA; " height="38 " src="http://fakehost/test/hmhome.gif " width="38 "></img></a>
+ <h2><a href="http://www.vcu.edu/engweb/webtexts/bartleby.html" target="_blank "><img src="http://fakehost/test/hmhome.gif" alt="To the story text without notes
+ " height="38 " width="38 "></a>
</h2>
- <h3>Prepared by <a href="http://www.vcu.edu/engweb ">Ann
+ <h3>Prepared by <a href="http://www.vcu.edu/engweb">Ann
Woodlief,</a> Virginia Commonwealth University</h3>
<h5>Click on text in red for hypertext notes and questions</h5>
I
@@ -1383,4 +1384,4 @@
</p>
<p> Ah
Bartleby! Ah humanity!</p>
- </div></div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json
index be68e3164..632df58ea 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": null,
+ "Author": "por \n \n \n César Salza",
"Direction": null,
"Excerpt": "Twitter Lite llega a 11 países de América Latina, para ayudar a los usuarios con mala señal de sus redes móviles.",
"Image": "https:\/\/cdn1.cnet.com\/img\/JumVcu1ZSLtPP8ui0UWaSlgi5RU=\/670x503\/2017\/12\/01\/b36ce794-e0b8-495c-a198-184923a8f4e9\/twitter-lite.jpg",
"Title": "Twitter Lite se estrena en México, Venezuela y otros nueve países",
"SiteName": "CNET en Español"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html
index 1b6351245..3adf9501c 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet-svg-classes/expected.html
@@ -1,23 +1,27 @@
-<div data-component="lazyloadImages" itemprop="articleBody">
- <figure section="shortcodeImage"><span><span itemprop="image" itemscope="" itemtype="https://schema.org/ImageObject"><img alt="twitter-lite" class="" height="0" src="https://cdn2.cnet.com/img/LI8y19stcvIQUdzbYdH4-DAigtc=/fit-in/570x0/2017/12/01/b36ce794-e0b8-495c-a198-184923a8f4e9/twitter-lite.jpg" width="570"></img><meta content="https://cdn2.cnet.com/img/LI8y19stcvIQUdzbYdH4-DAigtc=/fit-in/570x0/2017/12/01/b36ce794-e0b8-495c-a198-184923a8f4e9/twitter-lite.jpg" itemprop="url"></meta><meta content="0" itemprop="height"></meta><meta content="570" itemprop="width"></meta></span></span>
+<div itemprop="articleBody" data-component="lazyloadImages" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <figure section="shortcodeImage"><span><span itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><img src="https://cdn2.cnet.com/img/LI8y19stcvIQUdzbYdH4-DAigtc=/fit-in/570x0/2017/12/01/b36ce794-e0b8-495c-a198-184923a8f4e9/twitter-lite.jpg" class alt="twitter-lite" height="0" width="570"><meta itemprop="url" content="https://cdn2.cnet.com/img/LI8y19stcvIQUdzbYdH4-DAigtc=/fit-in/570x0/2017/12/01/b36ce794-e0b8-495c-a198-184923a8f4e9/twitter-lite.jpg"><meta itemprop="height" content="0"><meta itemprop="width" content="570"></span></span>
<figcaption><span><p>Twitter Lite estará disponible en Google Play Store en 11 países de América Latina.</p></span><span>
Twitter
- </span></figcaption></figure><p>Twitter ha dado a conocer que Twitter Lite llegará a un total de 24 nuevos países a partir de hoy, 11 de ellos de América Latina. </p>
- <p>Según explicó en un <a data-component="externalLink" href="https://blog.twitter.com/official/en_us/topics/product/2017/twitter-lite-in-the-google-play-store-in-24-more-countries.html#" target="_blank">comunicado</a> <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-estrena-twitter-lite/">Twitter Lite</a></span> ahora estará disponible en Bolivia, Brasil, Chile, Colombia, Costa Rica, Ecuador, México, Panamá, Perú, El Salvador y Venezuela.</p>
+ </span></figcaption>
+ </figure>
+ <p>Twitter ha dado a conocer que Twitter Lite llegará a un total de 24 nuevos países a partir de hoy, 11 de ellos de América Latina. </p>
+ <p>Según explicó en un <a href="https://blog.twitter.com/official/en_us/topics/product/2017/twitter-lite-in-the-google-play-store-in-24-more-countries.html#" target="_blank" data-component="externalLink">comunicado</a> <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-estrena-twitter-lite/">Twitter Lite</a></span> ahora estará disponible en Bolivia, Brasil, Chile, Colombia, Costa Rica, Ecuador, México, Panamá, Perú, El Salvador y Venezuela.</p>
<p>Twitter Lite es la versión ligera de la aplicación de la red social para Android, disponible en la Google Play Store. Con este app los usuarios que experimentan fallos de red o que viven en países con redes con poca velocidad de conexión como Venezuela podrán descargar los tuits de forma más rápida.</p>
<p>Entre sus novedades, Twitter Lite permite la carga rápida de tuits en redes 2G y 3G, y ofrece ayuda offline en caso de que pierdas tu conexión; a eso debemos sumar que minimiza el uso de datos y ofrece un modo de ahorro, en el que únicamente se descargan las fotos o videos de los tuits que quieres ver.</p>
<p>Además, el app ocupa menos espacio en tu teléfono móvil, al reducir a 3MB su peso.</p>
- <p>Twitter dio a conocer Twitter Lite en abril en India, y desde entonces ha estado trabajando para llevarlo a más países. La empresa en los últimos meses también se ha involucrado de forma definitiva en la <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-hemos-progresado-en-nuestra-batalla-contra-el-abuso/">eliminación de los abusos en la red social</a></span>, tomando medidas incluso en la <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-elimina-verificacion-a-cuentas-ofensivas/">verificación de cuentas.</a></span></p><svg><symbol id="play" viewbox="0 0 26.6 32"><path d="M0,2.6c0-2.4,1.6-3.3,3.7-2L25,13.7c2,1.3,2,3.2,0,4.5L3.7,31.4c-2,1.3-3.7,0.3-3.7-2C0,29.4,0,2.6,0,2.6z"></path></symbol><symbol id="pause" viewbox="0 0 26.6 32"><g><polygon points="16,32 26.5,32 26.5,8.8 26.5,0 16,0"></polygon><rect height="32" width="10.6" x="0.1" y="0"></rect></g></symbol><symbol id="playlist" viewbox="0 0 32 22.9"><g><circle cx="2.3" cy="20.6" r="2.3"></circle><circle cx="2.3" cy="11.4" r="2.3"></circle><circle cx="2.3" cy="2.3" r="2.3"></circle><path d="M32,1.1C32,0.5,31.5,0,30.9,0H10.3C9.7,0,9.1,0.5,9.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V1.1z"></path><path d="M32,10.3c0-0.6-0.5-1.1-1.1-1.1H10.3c-0.6,0-1.1,0.5-1.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V10.3z"></path><path d="M32,19.4c0-0.6-0.5-1.1-1.1-1.1H10.3c-0.6,0-1.1,0.5-1.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V19.4z"></path></g></symbol><symbol id="speaker-on" viewbox="0 0 32 28.1"><g><g><path d="M12.6,5L6.3,8.7H0.6C0.3,8.7,0,9,0,9.3V19c0,0.4,0.3,0.7,0.6,0.7h5.9l6.1,3.4c1.3,0.8,1.5,0.2,1.5-1.5V6.5C14.2,4.8,13.9,4.2,12.6,5z"></path></g><path d="M18,23.1v-2.8c2.6,0,4.7-2.8,4.7-6.2S20.6,7.8,18,7.8V5c4.2,0,7.5,4,7.5,9S22.1,23.1,18,23.1z"></path><path d="M21.3,28.1v-2.8c4.4,0,7.9-5,7.9-11.2S25.6,2.8,21.3,2.8V0C27.2,0,32,6.3,32,14C32,21.8,27.2,28.1,21.3,28.1z"></path></g></symbol><symbol id="speaker-off" viewbox="0 0 32 18.8"><g><g><path d="M12.6,0.4L6.3,4H0.6C0.3,4,0,4.3,0,4.7v9.7c0,0.4,0.3,0.7,0.6,0.7h5.9l6.1,3.4c1.3,0.8,1.5,0.2,1.5-1.5V1.8C14.2,0.2,13.9-0.5,12.6,0.4z"></path></g><polygon points="32,4.5 30.2,2.7 25.3,7.6 20.4,2.7 18.6,4.5 23.5,9.4 18.6,14.3 20.4,16.1 25.3,11.2 30.2,16.1 32,14.3 27.1,9.4 "></polygon></g></symbol><symbol id="captions" viewbox="0 0 32 16.2"><g><path d="M8.6,16.2c-1.2,0-2.4-0.2-3.4-0.6c-1.1-0.4-2-0.9-2.7-1.6c-0.8-0.7-1.4-1.6-1.8-2.6C0.2,10.4,0,9.3,0,8.1c0-1.2,0.2-2.3,0.7-3.3s1-1.8,1.8-2.6C3.2,1.5,4.1,1,5.2,0.6S7.4,0,8.6,0c1,0,1.9,0.1,2.7,0.4c0.8,0.3,1.4,0.6,2,1.1c0.6,0.4,1.1,0.9,1.4,1.5c0.4,0.5,0.7,1.1,0.9,1.6l-4.1,1.9c-0.1-0.3-0.2-0.6-0.4-0.9C11,5.3,10.8,5,10.5,4.8c-0.3-0.2-0.6-0.4-0.9-0.5c-0.3-0.1-0.7-0.2-1-0.2C8,4.2,7.5,4.3,7,4.5C6.6,4.7,6.2,5,5.8,5.3C5.5,5.7,5.2,6.1,5.1,6.5C4.9,7,4.8,7.5,4.8,8.1c0,0.5,0.1,1.1,0.3,1.5c0.2,0.5,0.4,0.9,0.8,1.2c0.3,0.4,0.7,0.6,1.2,0.8C7.5,11.9,8,12,8.6,12c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5c0.3-0.2,0.5-0.4,0.7-0.7c0.2-0.3,0.3-0.6,0.4-0.9l4.1,1.9c-0.2,0.5-0.5,1-0.9,1.6c-0.4,0.5-0.9,1-1.4,1.5c-0.6,0.4-1.2,0.8-2,1.1C10.5,16,9.6,16.2,8.6,16.2z"></path><path d="M24.9,16.2c-1.2,0-2.4-0.2-3.4-0.6c-1.1-0.4-2-0.9-2.7-1.6c-0.8-0.7-1.4-1.6-1.8-2.6c-0.4-1-0.7-2.1-0.7-3.3c0-1.2,0.2-2.3,0.7-3.3c0.4-1,1-1.8,1.8-2.6c0.8-0.7,1.7-1.3,2.7-1.7C22.6,0.2,23.7,0,24.9,0c1,0,1.9,0.1,2.7,0.4c0.8,0.3,1.4,0.6,2,1.1c0.6,0.4,1.1,0.9,1.4,1.5C31.5,3.5,31.8,4,32,4.5l-4.1,1.9c-0.1-0.3-0.2-0.6-0.4-0.9c-0.2-0.3-0.4-0.5-0.7-0.7c-0.3-0.2-0.6-0.4-0.9-0.5c-0.3-0.1-0.7-0.2-1-0.2c-0.6,0-1.1,0.1-1.5,0.3c-0.5,0.2-0.9,0.5-1.2,0.8c-0.3,0.4-0.6,0.8-0.8,1.2c-0.2,0.5-0.3,1-0.3,1.5c0,0.5,0.1,1.1,0.3,1.5c0.2,0.5,0.4,0.9,0.8,1.2c0.3,0.4,0.7,0.6,1.2,0.8c0.5,0.2,1,0.3,1.5,0.3c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5c0.3-0.2,0.5-0.4,0.7-0.7c0.2-0.3,0.3-0.6,0.4-0.9l4.1,1.9c-0.2,0.5-0.5,1-0.9,1.6c-0.4,0.5-0.9,1-1.4,1.5c-0.6,0.4-1.2,0.8-2,1.1C26.8,16,25.9,16.2,24.9,16.2z"></path></g></symbol><symbol id="fullscreen" viewbox="0 0 32 32"><g><g><polygon points="11.4,0 0,0 0,11.4 3.4,8 9.1,13.7 13.7,9.1 8,3.4 &#x9;&#x9;&#x9;"></polygon></g><g><polygon points="20.6,32 32,32 32,20.6 28.6,24 22.9,18.3 18.3,22.9 24,28.6 &#x9;&#x9;&#x9;"></polygon></g><g><polygon points="32,11.4 32,0 20.6,0 24,3.4 18.3,9.1 22.9,13.7 28.6,8 &#x9;&#x9;&#x9;"></polygon></g><g><polygon points="0,20.6 0,32 11.4,32 8,28.6 13.7,22.9 9.1,18.3 3.4,24 &#x9;&#x9;&#x9;"></polygon></g></g></symbol><symbol id="video" viewbox="0 0 32 22"><g><path d="M29,2.2c-0.7,0.2-4.6,3-7.9,5.3V2.1C21.1,1,20.1,0,19,0H2.1C1,0,0,1,0,2.1v17.7C0,21,1,22,2.1,22H19c1.2,0,2.1-1,2.1-2.1v-5.9c3.3,2.4,7.4,5.4,8.2,5.6c1.4,0.4,2.7-0.1,2.7-0.1V2.2C32,2.2,30.1,1.8,29,2.2z"></path></g></symbol></svg><div data-load-playlist="[{&quot;id&quot;:&quot;dc362fcb-cba9-4bf6-b62d-aa7e39a092c7&quot;,&quot;title&quot;:&quot;Google Assistant mejora, hay m\u00e1s cambios en Twitter y llega el OnePlus 5T&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #163] Esta semana hablamos de las caracter\u00edsticas del OnePlus 5T, las novedades de Google Assistant y los cambios que ha hecho Twitter a su proceso de verificaci\u00f3n.&quot;,&quot;slug&quot;:&quot;google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t&quot;,&quot;chapters&quot;:{&quot;data&quot;:[],&quot;paging&quot;:{&quot;total&quot;:0,&quot;limit&quot;:15,&quot;offset&quot;:0}},&quot;duration&quot;:489,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:&quot;&quot;,&quot;mpxRefId&quot;:&quot;38uKprB1_hIkwXffuj20eMptuapoWX4K&quot;,&quot;ratingVChip&quot;:&quot;TV-14&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;1c0fd1cb-c387-11e2-8208-0291187b029a&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;6a9b3b6b-575a-4b66-b4b2-4aedee01be6d&quot;,&quot;firstName&quot;:&quot;Gabriel&quot;,&quot;lastName&quot;:&quot;Sama&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:&quot;La semana&quot;},&quot;image&quot;:{&quot;id&quot;:&quot;70540d7a-cbc5-4563-ab86-b5549ef68168&quot;,&quot;filename&quot;:&quot;oneplus-5t-product-21.jpg&quot;,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-13 17:56:07&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;alt&quot;:&quot;oneplus-5t-product-21&quot;,&quot;credits&quot;:&quot;Andrew Hoyle\/CNET&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/EcEJ76YiEastX8yctETLURpwICc=\/2017\/11\/13\/70540d7a-cbc5-4563-ab86-b5549ef68168\/oneplus-5t-product-21.jpg&quot;,&quot;cropGravity&quot;:0,&quot;crop&quot;:null,&quot;typeName&quot;:&quot;content_image&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn1.cnet.com\/img\/xTOX9ZdBnxWFXxkzSLG6dBydTMg=\/fit-in\/194x109\/2017\/11\/13\/70540d7a-cbc5-4563-ab86-b5549ef68168\/oneplus-5t-product-21.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/17\/1098353731717\/es_lasemana16novFINAL_1265786_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t\/&quot;},{&quot;id&quot;:&quot;7097a578-8dc8-48b8-9bea-bc0dcabdb558&quot;,&quot;title&quot;:&quot;El \u0027bug\u0027 de MacOS High Sierra y la expansi\u00f3n de Huawei en Latinoam\u00e9rica&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #165] Apple solucion\u00f3 el problema de que se pod\u00eda acceder a algunas Mac sin contrase\u00f1a. Huawei adelant\u00f3 planes para la regi\u00f3n.&quot;,&quot;slug&quot;:&quot;bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:550,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1107731523514,&quot;mpxRefId&quot;:&quot;IwoiIhK2JgjRf8oj2sS99ClHB2K8w8uw&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;1934b65e-89f2-4449-ae15-61584288ed9d&quot;,&quot;name&quot;:&quot;macos-high-sierra-image&quot;,&quot;filename&quot;:&quot;macos-high-sierra-image.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/bmNGTUwxlWz6QUuj1pUj2G90QUE=\/2017\/09\/27\/1934b65e-89f2-4449-ae15-61584288ed9d\/macos-high-sierra-image.jpg&quot;,&quot;size&quot;:1306802,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-09-27 17:49:57&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-09-27 17:49:57&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;macos-high-sierra-image&quot;,&quot;cropGravity&quot;:0},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/C6S9ny6QsPl0M4RazJBreX1ZaO8=\/fit-in\/194x109\/2017\/09\/27\/1934b65e-89f2-4449-ae15-61584288ed9d\/macos-high-sierra-image.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/12\/01\/1107731523514\/es_lasemana1diciembre_1275504_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica\/&quot;},{&quot;id&quot;:&quot;41e31d24-ab17-445d-8841-ceb86ae9044f&quot;,&quot;title&quot;:&quot;Nuestros consejos para la temporada de ofertas&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #164] Nada de madrugar, hacer filas largas y estresarte. Esta semana te compartimos sugerencias puntuales para que le saques m\u00e1s jugo a las compras de Black Friday y Cyber Monday.&quot;,&quot;slug&quot;:&quot;consejos-ofertas-viernes-negro&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:441,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1102073923731,&quot;mpxRefId&quot;:&quot;5XzHm1c3DBSxFhifEcVyEyTaNwlg6R0a&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;154d2576-1ff8-41d8-ac2a-414450d5ee6c&quot;,&quot;name&quot;:&quot;viernesnegro&quot;,&quot;filename&quot;:&quot;viernesnegro.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/e6vO1LTPdKpSs3924nDWctNCZMY=\/2017\/11\/22\/154d2576-1ff8-41d8-ac2a-414450d5ee6c\/viernesnegro.jpg&quot;,&quot;size&quot;:278742,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-22 22:32:03&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-11-22 22:32:03&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;viernesnegro&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn4.cnet.com\/img\/fcY_4UWuEddB5TbPXMSaNvgfcec=\/fit-in\/194x109\/2017\/11\/22\/154d2576-1ff8-41d8-ac2a-414450d5ee6c\/viernesnegro.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/consejos-ofertas-viernes-negro.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/22\/1102073923731\/semana_nov22_1270073_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/consejos-ofertas-viernes-negro\/&quot;},{&quot;id&quot;:&quot;db8b62cc-68fc-4f96-8fbc-bcbe5d4f8a1c&quot;,&quot;title&quot;:&quot;El desembarco de Xiaomi en Espa\u00f1a y la previa del OnePlus 5T&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #162] La fabricante de celulares china llega a Espa\u00f1a con m\u00e1s de seis tel\u00e9fonos de menos de 300 euros, y el OnePlus 5T se presentar\u00e1 el 16 de noviembre en Estados Unidos.&quot;,&quot;slug&quot;:&quot;el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:500,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1093211715579,&quot;mpxRefId&quot;:&quot;APQJZKaXzbhmwxYJcFFg_AHYIHfLWNU6&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;96ec74ea-1acb-48be-b74e-816ba301d19a&quot;,&quot;name&quot;:&quot;oneplus-5t&quot;,&quot;filename&quot;:&quot;oneplus-5t.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/KK0CqnMaqMxZ9bC-3jbAiQhnutM=\/2017\/10\/30\/96ec74ea-1acb-48be-b74e-816ba301d19a\/oneplus-5t.jpg&quot;,&quot;caption&quot;:&quot;&lt;p>Una supuesta foto del OnePlus 5T filtrada en China.&lt;\/p>&quot;,&quot;size&quot;:41019,&quot;height&quot;:592,&quot;width&quot;:690,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-30 19:55:39&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-30 19:56:18&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;credits&quot;:&quot;Weibo&quot;,&quot;alt&quot;:&quot;oneplus-5t&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn2.cnet.com\/img\/9CtVwepYPv7fktP5LlCjoAjq0is=\/fit-in\/194x109\/2017\/10\/30\/96ec74ea-1acb-48be-b74e-816ba301d19a\/oneplus-5t.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/10\/1093211715579\/es_lasemana_9noviembre02_1259372_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t\/&quot;},{&quot;id&quot;:&quot;283c729a-eeeb-454b-ae03-d1d95229031d&quot;,&quot;title&quot;:&quot;Google Assistant habla espa\u00f1ol y el iPhone X presenta un nuevo idioma de dise\u00f1o&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #161] El asistente virtual de Google ahora domina el idioma de Cervantes, y el iPhone X inaugura nuevos gestos y un nuevo lenguaje de dise\u00f1o de la marca.&quot;,&quot;slug&quot;:&quot;google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:683,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1087923267594,&quot;mpxRefId&quot;:&quot;jCXv62P0jCNTJB3jKuthMzA3CV0ghejk&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;0d404b1c-30e9-4ccf-9901-d2125b2b23f2&quot;,&quot;name&quot;:&quot;iphone-x-67&quot;,&quot;filename&quot;:&quot;iphone-x-67.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/JoewZeNO5ePGyD5iGiD7VM32i9w=\/2017\/11\/03\/0d404b1c-30e9-4ccf-9901-d2125b2b23f2\/iphone-x-67.jpg&quot;,&quot;size&quot;:153088,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-03 16:19:37&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-11-03 16:19:37&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;iphone-x-67&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/6fdfuTdyxV3t7waWLSKyE6df3fY=\/fit-in\/194x109\/2017\/11\/03\/0d404b1c-30e9-4ccf-9901-d2125b2b23f2\/iphone-x-67.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/03\/1087923267594\/semananov2_1253191_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma\/&quot;},{&quot;id&quot;:&quot;a3c0de25-3d75-44b9-9c83-6925dbd3ebb2&quot;,&quot;title&quot;:&quot;La pantalla del Pixel 2 XL, la llave maestra de Amazon y el inminente iPhone X&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #160] Analizamos los problemas con el panel OLED del tel\u00e9fono de Google, los env\u00edos de Amazon entran en tu hogar y ya est\u00e1 a la puerta el nuevo tel\u00e9fono de Apple.&quot;,&quot;slug&quot;:&quot;la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:574,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1082906179568,&quot;mpxRefId&quot;:&quot;t4LPcFt8Hmm8Vg7U8o4s4_E0Xn_xqxAj&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;00597069-4f14-41dd-b1f1-e7bc413d4e17&quot;,&quot;name&quot;:&quot;Google Pixel 2 XL screen burn-in&quot;,&quot;filename&quot;:&quot;screen-problems-2405-001.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/zM13Oy086Lnor1efnDjx0mVca88=\/2017\/10\/23\/00597069-4f14-41dd-b1f1-e7bc413d4e17\/screen-problems-2405-001.jpg&quot;,&quot;caption&quot;:&quot;&lt;p>&lt;\/p>&quot;,&quot;size&quot;:1865911,&quot;height&quot;:1467,&quot;width&quot;:2200,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-23 19:09:04&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-23 19:09:23&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:1,&quot;credits&quot;:&quot;Josh Miller\/CNET&quot;,&quot;alt&quot;:&quot;Google Pixel 2 XL screen burn-in&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn4.cnet.com\/img\/XTHaIZ7ZBuXvKPKB5niFqcP_23M=\/fit-in\/194x109\/2017\/10\/23\/00597069-4f14-41dd-b1f1-e7bc413d4e17\/screen-problems-2405-001.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/27\/1082906179568\/es_lasemana27october_1247416_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x\/&quot;},{&quot;id&quot;:&quot;ae23b111-1e88-4edd-b1b5-dfed3e0cb061&quot;,&quot;title&quot;:&quot;Se consolida el hogar inteligente y aparece el fallo KRACK&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #159] Esta semana hablamos de la nueva plataforma de Samsung para el Internet de las Cosas, de la vulnerabilidad KRACK y de los nuevos tel\u00e9fonos en el mercado.&quot;,&quot;slug&quot;:&quot;la-semana-oct-19-cnet-espanol&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:691,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1077887555736,&quot;mpxRefId&quot;:&quot;H4gkX0JjbU6b4gxZOkirySjFp3Z845dA&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;6a9b3b6b-575a-4b66-b4b2-4aedee01be6d&quot;,&quot;firstName&quot;:&quot;Gabriel&quot;,&quot;lastName&quot;:&quot;Sama&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;d704b38b-cafe-414b-879b-459dd712796c&quot;,&quot;name&quot;:&quot;zte-axon-m-9755-024&quot;,&quot;filename&quot;:&quot;zte-axon-m-9755-024.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/VAqXY-db6xzcKly6P5BNqbaHpQw=\/2017\/10\/20\/d704b38b-cafe-414b-879b-459dd712796c\/zte-axon-m-9755-024.jpg&quot;,&quot;size&quot;:87148,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-20 16:33:13&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-20 16:33:13&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;zte-axon-m-9755-024&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/ReV56T1ZCShd3YWImeR2IWEqAXU=\/fit-in\/194x109\/2017\/10\/20\/d704b38b-cafe-414b-879b-459dd712796c\/zte-axon-m-9755-024.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/la-semana-oct-19-cnet-espanol.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/20\/1077887555736\/semana_oct19_1241505_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/la-semana-oct-19-cnet-espanol\/&quot;},{&quot;id&quot;:&quot;4cb73b8d-1b2f-40ef-bb98-6b093198c681&quot;,&quot;title&quot;:&quot;Un nuevo Kindle y se asoman las nuevas gafas VR de Oculus&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #158] Esta semana, lleg\u00f3 el Kindle Oasis impermeable, se anunciaron las Oculus Go y Santa Cruz para realidad virtual y hubo un problemita con la Google Home Mini.&quot;,&quot;slug&quot;:&quot;un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:422,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1072264259697,&quot;mpxRefId&quot;:&quot;8RTAYZ4ou1BgXXiybOYiclkJ6avdl6SM&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;4514916c-88c7-4c00-8324-9d522e0b3047&quot;,&quot;name&quot;:&quot;kindle-oasis-covers&quot;,&quot;filename&quot;:&quot;kindle-oasis-covers.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/el7STcxt2T02OoIFWp08KB2D1Bk=\/2017\/10\/05\/4514916c-88c7-4c00-8324-9d522e0b3047\/kindle-oasis-covers.jpg&quot;,&quot;caption&quot;:&quot;&lt;p>The optional covers start at $40 and come in nylon or leather.&lt;\/p>&quot;,&quot;size&quot;:4432570,&quot;height&quot;:3024,&quot;width&quot;:4032,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-05 19:52:22&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-05 19:53:38&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;startDate&quot;:{&quot;date&quot;:&quot;2017-10-11 13:00:00&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:1,&quot;credits&quot;:&quot;David Carnoy\/CNET&quot;,&quot;alt&quot;:&quot;kindle-oasis-covers&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/vDQrwxSq2oDqDHdtnPLwD_eJR98=\/fit-in\/194x109\/2017\/10\/05\/4514916c-88c7-4c00-8324-9d522e0b3047\/kindle-oasis-covers.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/13\/1072264259697\/es_lasemana12_oct_1235274_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman\/&quot;},{&quot;id&quot;:&quot;09051611-4cd7-4384-a459-b4a1050b5c1c&quot;,&quot;title&quot;:&quot;Google Pixel 2 y lo que nos dej\u00f3 la temporada de s\u00faper tel\u00e9fonos&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #157] La gigante de las b\u00fasquedas se anima con todo al hardware, y sus tel\u00e9fonos marcan el fin de una \u00e9poca de grandes anuncios.&quot;,&quot;slug&quot;:&quot;google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:598,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1064365123530,&quot;mpxRefId&quot;:&quot;Us3jKld5gPd3TfSG9QLLbD5jw_vdMyds&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;d077c3c0-c88f-492f-a8a2-8b043af04f0e&quot;,&quot;name&quot;:&quot;100417-google-pixel-2-7126&quot;,&quot;filename&quot;:&quot;100417-google-pixel-2-7126.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/BNbeNYmhimN2Z_KulzpEpn0l7AI=\/2017\/10\/05\/d077c3c0-c88f-492f-a8a2-8b043af04f0e\/100417-google-pixel-2-7126.jpg&quot;,&quot;size&quot;:52547,&quot;height&quot;:467,&quot;width&quot;:830,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-05 23:35:43&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-05 23:35:43&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;100417-google-pixel-2-7126&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn2.cnet.com\/img\/5-e1P5u3K43hFHiSjBjhdB3f1lI=\/fit-in\/194x109\/2017\/10\/05\/d077c3c0-c88f-492f-a8a2-8b043af04f0e\/100417-google-pixel-2-7126.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/06\/1064365123530\/semana_oct5_1229769_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos\/&quot;},{&quot;id&quot;:&quot;4bb8f3fd-304c-495e-8b83-57fcea47b89b&quot;,&quot;title&quot;:&quot;La avalancha de productos de Amazon, y tuits de 280 caracteres&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #156] Esta semana vimos nuevas bocinas de Amazon; una nueva c\u00e1mara GoPro y Twitter dijo que duplicar\u00e1 el l\u00edmite de caracteres en tuits.&quot;,&quot;slug&quot;:&quot;amazon-nuevos-productos-twitter-280-caracteres&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:673,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1057969219682,&quot;mpxRefId&quot;:&quot;IUOzQ0y6ps_ludp4UH9c1EZFCsJNA7X8&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;194498de-a074-4687-ab0d-d880d5ee05de&quot;,&quot;name&quot;:&quot;amazon-spot-1&quot;,&quot;filename&quot;:&quot;amazon-spot-1.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/MLV0Q7ERz3liDf123UtGhwIuMjU=\/2017\/09\/28\/194498de-a074-4687-ab0d-d880d5ee05de\/amazon-spot-1.jpg&quot;,&quot;size&quot;:850748,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-09-28 05:39:36&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-09-28 05:39:36&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;amazon-spot-1&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn1.cnet.com\/img\/0t12kUyxiPUjjBEvghADT8bfI1Q=\/fit-in\/194x109\/2017\/09\/28\/194498de-a074-4687-ab0d-d880d5ee05de\/amazon-spot-1.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/amazon-nuevos-productos-twitter-280-caracteres.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/09\/29\/1057969219682\/es_lasemana_28septiembre_1223993_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/amazon-nuevos-productos-twitter-280-caracteres\/&quot;}]">
- <div>
- <div> <svg><use aria-hidden="false" xlink:href="#play"></use></svg><svg><use aria-hidden="false" xlink:href="#pause"></use></svg><figure><img alt="" height="96" src="https://cdn1.cnet.com/img/mWcZaiA8Ngv61OQcpdoh6Ra9nY0=/170x96/2017/11/13/70540d7a-cbc5-4563-ab86-b5549ef68168/oneplus-5t-product-21.jpg" width="170"></img></figure></div>
+ <p>Twitter dio a conocer Twitter Lite en abril en India, y desde entonces ha estado trabajando para llevarlo a más países. La empresa en los últimos meses también se ha involucrado de forma definitiva en la <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-hemos-progresado-en-nuestra-batalla-contra-el-abuso/">eliminación de los abusos en la red social</a></span>, tomando medidas incluso en la <span section="shortcodeLink"><a href="http://fakehost/es/noticias/twitter-elimina-verificacion-a-cuentas-ofensivas/">verificación de cuentas.</a></span></p><svg><symbol id="play" viewBox="0 0 26.6 32"><path d="M0,2.6c0-2.4,1.6-3.3,3.7-2L25,13.7c2,1.3,2,3.2,0,4.5L3.7,31.4c-2,1.3-3.7,0.3-3.7-2C0,29.4,0,2.6,0,2.6z" /></symbol><symbol id="pause" viewBox="0 0 26.6 32"><g><polygon points="16,32 26.5,32 26.5,8.8 26.5,0 16,0" /><rect x="0.1" y="0" width="10.6" height="32" /></g></symbol><symbol id="playlist" viewBox="0 0 32 22.9"><g><circle cx="2.3" cy="20.6" r="2.3" /><circle cx="2.3" cy="11.4" r="2.3" /><circle cx="2.3" cy="2.3" r="2.3" /><path d="M32,1.1C32,0.5,31.5,0,30.9,0H10.3C9.7,0,9.1,0.5,9.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V1.1z" /><path d="M32,10.3c0-0.6-0.5-1.1-1.1-1.1H10.3c-0.6,0-1.1,0.5-1.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V10.3z" /><path d="M32,19.4c0-0.6-0.5-1.1-1.1-1.1H10.3c-0.6,0-1.1,0.5-1.1,1.1v2.3c0,0.6,0.5,1.1,1.1,1.1h20.6c0.6,0,1.1-0.5,1.1-1.1V19.4z" /></g></symbol><symbol id="speaker-on" viewBox="0 0 32 28.1"><g><g><path d="M12.6,5L6.3,8.7H0.6C0.3,8.7,0,9,0,9.3V19c0,0.4,0.3,0.7,0.6,0.7h5.9l6.1,3.4c1.3,0.8,1.5,0.2,1.5-1.5V6.5C14.2,4.8,13.9,4.2,12.6,5z" /></g><path d="M18,23.1v-2.8c2.6,0,4.7-2.8,4.7-6.2S20.6,7.8,18,7.8V5c4.2,0,7.5,4,7.5,9S22.1,23.1,18,23.1z" /><path d="M21.3,28.1v-2.8c4.4,0,7.9-5,7.9-11.2S25.6,2.8,21.3,2.8V0C27.2,0,32,6.3,32,14C32,21.8,27.2,28.1,21.3,28.1z" /></g></symbol><symbol id="speaker-off" viewBox="0 0 32 18.8"><g><g><path d="M12.6,0.4L6.3,4H0.6C0.3,4,0,4.3,0,4.7v9.7c0,0.4,0.3,0.7,0.6,0.7h5.9l6.1,3.4c1.3,0.8,1.5,0.2,1.5-1.5V1.8C14.2,0.2,13.9-0.5,12.6,0.4z" /></g><polygon points="32,4.5 30.2,2.7 25.3,7.6 20.4,2.7 18.6,4.5 23.5,9.4 18.6,14.3 20.4,16.1 25.3,11.2 30.2,16.1 32,14.3 27.1,9.4 " /></g></symbol><symbol id="captions" viewBox="0 0 32 16.2"><g><path d="M8.6,16.2c-1.2,0-2.4-0.2-3.4-0.6c-1.1-0.4-2-0.9-2.7-1.6c-0.8-0.7-1.4-1.6-1.8-2.6C0.2,10.4,0,9.3,0,8.1c0-1.2,0.2-2.3,0.7-3.3s1-1.8,1.8-2.6C3.2,1.5,4.1,1,5.2,0.6S7.4,0,8.6,0c1,0,1.9,0.1,2.7,0.4c0.8,0.3,1.4,0.6,2,1.1c0.6,0.4,1.1,0.9,1.4,1.5c0.4,0.5,0.7,1.1,0.9,1.6l-4.1,1.9c-0.1-0.3-0.2-0.6-0.4-0.9C11,5.3,10.8,5,10.5,4.8c-0.3-0.2-0.6-0.4-0.9-0.5c-0.3-0.1-0.7-0.2-1-0.2C8,4.2,7.5,4.3,7,4.5C6.6,4.7,6.2,5,5.8,5.3C5.5,5.7,5.2,6.1,5.1,6.5C4.9,7,4.8,7.5,4.8,8.1c0,0.5,0.1,1.1,0.3,1.5c0.2,0.5,0.4,0.9,0.8,1.2c0.3,0.4,0.7,0.6,1.2,0.8C7.5,11.9,8,12,8.6,12c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5c0.3-0.2,0.5-0.4,0.7-0.7c0.2-0.3,0.3-0.6,0.4-0.9l4.1,1.9c-0.2,0.5-0.5,1-0.9,1.6c-0.4,0.5-0.9,1-1.4,1.5c-0.6,0.4-1.2,0.8-2,1.1C10.5,16,9.6,16.2,8.6,16.2z" /><path d="M24.9,16.2c-1.2,0-2.4-0.2-3.4-0.6c-1.1-0.4-2-0.9-2.7-1.6c-0.8-0.7-1.4-1.6-1.8-2.6c-0.4-1-0.7-2.1-0.7-3.3c0-1.2,0.2-2.3,0.7-3.3c0.4-1,1-1.8,1.8-2.6c0.8-0.7,1.7-1.3,2.7-1.7C22.6,0.2,23.7,0,24.9,0c1,0,1.9,0.1,2.7,0.4c0.8,0.3,1.4,0.6,2,1.1c0.6,0.4,1.1,0.9,1.4,1.5C31.5,3.5,31.8,4,32,4.5l-4.1,1.9c-0.1-0.3-0.2-0.6-0.4-0.9c-0.2-0.3-0.4-0.5-0.7-0.7c-0.3-0.2-0.6-0.4-0.9-0.5c-0.3-0.1-0.7-0.2-1-0.2c-0.6,0-1.1,0.1-1.5,0.3c-0.5,0.2-0.9,0.5-1.2,0.8c-0.3,0.4-0.6,0.8-0.8,1.2c-0.2,0.5-0.3,1-0.3,1.5c0,0.5,0.1,1.1,0.3,1.5c0.2,0.5,0.4,0.9,0.8,1.2c0.3,0.4,0.7,0.6,1.2,0.8c0.5,0.2,1,0.3,1.5,0.3c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5c0.3-0.2,0.5-0.4,0.7-0.7c0.2-0.3,0.3-0.6,0.4-0.9l4.1,1.9c-0.2,0.5-0.5,1-0.9,1.6c-0.4,0.5-0.9,1-1.4,1.5c-0.6,0.4-1.2,0.8-2,1.1C26.8,16,25.9,16.2,24.9,16.2z" /></g></symbol><symbol id="fullscreen" viewBox="0 0 32 32"><g><g><polygon points="11.4,0 0,0 0,11.4 3.4,8 9.1,13.7 13.7,9.1 8,3.4 " /></g><g><polygon points="20.6,32 32,32 32,20.6 28.6,24 22.9,18.3 18.3,22.9 24,28.6 " /></g><g><polygon points="32,11.4 32,0 20.6,0 24,3.4 18.3,9.1 22.9,13.7 28.6,8 " /></g><g><polygon points="0,20.6 0,32 11.4,32 8,28.6 13.7,22.9 9.1,18.3 3.4,24 " /></g></g></symbol><symbol id="video" viewBox="0 0 32 22"><g><path d="M29,2.2c-0.7,0.2-4.6,3-7.9,5.3V2.1C21.1,1,20.1,0,19,0H2.1C1,0,0,1,0,2.1v17.7C0,21,1,22,2.1,22H19c1.2,0,2.1-1,2.1-2.1v-5.9c3.3,2.4,7.4,5.4,8.2,5.6c1.4,0.4,2.7-0.1,2.7-0.1V2.2C32,2.2,30.1,1.8,29,2.2z" /></g></symbol></svg>
+ <div data-load-playlist="[{&quot;id&quot;:&quot;dc362fcb-cba9-4bf6-b62d-aa7e39a092c7&quot;,&quot;title&quot;:&quot;Google Assistant mejora, hay m\u00e1s cambios en Twitter y llega el OnePlus 5T&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #163] Esta semana hablamos de las caracter\u00edsticas del OnePlus 5T, las novedades de Google Assistant y los cambios que ha hecho Twitter a su proceso de verificaci\u00f3n.&quot;,&quot;slug&quot;:&quot;google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t&quot;,&quot;chapters&quot;:{&quot;data&quot;:[],&quot;paging&quot;:{&quot;total&quot;:0,&quot;limit&quot;:15,&quot;offset&quot;:0}},&quot;duration&quot;:489,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:&quot;&quot;,&quot;mpxRefId&quot;:&quot;38uKprB1_hIkwXffuj20eMptuapoWX4K&quot;,&quot;ratingVChip&quot;:&quot;TV-14&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;1c0fd1cb-c387-11e2-8208-0291187b029a&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;6a9b3b6b-575a-4b66-b4b2-4aedee01be6d&quot;,&quot;firstName&quot;:&quot;Gabriel&quot;,&quot;lastName&quot;:&quot;Sama&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:&quot;La semana&quot;},&quot;image&quot;:{&quot;id&quot;:&quot;70540d7a-cbc5-4563-ab86-b5549ef68168&quot;,&quot;filename&quot;:&quot;oneplus-5t-product-21.jpg&quot;,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-13 17:56:07&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;alt&quot;:&quot;oneplus-5t-product-21&quot;,&quot;credits&quot;:&quot;Andrew Hoyle\/CNET&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/EcEJ76YiEastX8yctETLURpwICc=\/2017\/11\/13\/70540d7a-cbc5-4563-ab86-b5549ef68168\/oneplus-5t-product-21.jpg&quot;,&quot;cropGravity&quot;:0,&quot;crop&quot;:null,&quot;typeName&quot;:&quot;content_image&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn1.cnet.com\/img\/xTOX9ZdBnxWFXxkzSLG6dBydTMg=\/fit-in\/194x109\/2017\/11\/13\/70540d7a-cbc5-4563-ab86-b5549ef68168\/oneplus-5t-product-21.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/17\/1098353731717\/es_lasemana16novFINAL_1265786_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-assistant-mejora-hay-mas-cambios-en-twitter-y-llega-el-oneplus-5t\/&quot;},{&quot;id&quot;:&quot;7097a578-8dc8-48b8-9bea-bc0dcabdb558&quot;,&quot;title&quot;:&quot;El \u0027bug\u0027 de MacOS High Sierra y la expansi\u00f3n de Huawei en Latinoam\u00e9rica&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #165] Apple solucion\u00f3 el problema de que se pod\u00eda acceder a algunas Mac sin contrase\u00f1a. Huawei adelant\u00f3 planes para la regi\u00f3n.&quot;,&quot;slug&quot;:&quot;bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:550,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1107731523514,&quot;mpxRefId&quot;:&quot;IwoiIhK2JgjRf8oj2sS99ClHB2K8w8uw&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;1934b65e-89f2-4449-ae15-61584288ed9d&quot;,&quot;name&quot;:&quot;macos-high-sierra-image&quot;,&quot;filename&quot;:&quot;macos-high-sierra-image.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/bmNGTUwxlWz6QUuj1pUj2G90QUE=\/2017\/09\/27\/1934b65e-89f2-4449-ae15-61584288ed9d\/macos-high-sierra-image.jpg&quot;,&quot;size&quot;:1306802,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-09-27 17:49:57&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-09-27 17:49:57&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;macos-high-sierra-image&quot;,&quot;cropGravity&quot;:0},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/C6S9ny6QsPl0M4RazJBreX1ZaO8=\/fit-in\/194x109\/2017\/09\/27\/1934b65e-89f2-4449-ae15-61584288ed9d\/macos-high-sierra-image.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/12\/01\/1107731523514\/es_lasemana1diciembre_1275504_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/bug-de-macos-high-sierra-expansion-huawei-en-latinoamerica\/&quot;},{&quot;id&quot;:&quot;41e31d24-ab17-445d-8841-ceb86ae9044f&quot;,&quot;title&quot;:&quot;Nuestros consejos para la temporada de ofertas&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #164] Nada de madrugar, hacer filas largas y estresarte. Esta semana te compartimos sugerencias puntuales para que le saques m\u00e1s jugo a las compras de Black Friday y Cyber Monday.&quot;,&quot;slug&quot;:&quot;consejos-ofertas-viernes-negro&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:441,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1102073923731,&quot;mpxRefId&quot;:&quot;5XzHm1c3DBSxFhifEcVyEyTaNwlg6R0a&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;154d2576-1ff8-41d8-ac2a-414450d5ee6c&quot;,&quot;name&quot;:&quot;viernesnegro&quot;,&quot;filename&quot;:&quot;viernesnegro.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/e6vO1LTPdKpSs3924nDWctNCZMY=\/2017\/11\/22\/154d2576-1ff8-41d8-ac2a-414450d5ee6c\/viernesnegro.jpg&quot;,&quot;size&quot;:278742,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-22 22:32:03&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-11-22 22:32:03&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;viernesnegro&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn4.cnet.com\/img\/fcY_4UWuEddB5TbPXMSaNvgfcec=\/fit-in\/194x109\/2017\/11\/22\/154d2576-1ff8-41d8-ac2a-414450d5ee6c\/viernesnegro.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/consejos-ofertas-viernes-negro.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/22\/1102073923731\/semana_nov22_1270073_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/consejos-ofertas-viernes-negro\/&quot;},{&quot;id&quot;:&quot;db8b62cc-68fc-4f96-8fbc-bcbe5d4f8a1c&quot;,&quot;title&quot;:&quot;El desembarco de Xiaomi en Espa\u00f1a y la previa del OnePlus 5T&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #162] La fabricante de celulares china llega a Espa\u00f1a con m\u00e1s de seis tel\u00e9fonos de menos de 300 euros, y el OnePlus 5T se presentar\u00e1 el 16 de noviembre en Estados Unidos.&quot;,&quot;slug&quot;:&quot;el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:500,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1093211715579,&quot;mpxRefId&quot;:&quot;APQJZKaXzbhmwxYJcFFg_AHYIHfLWNU6&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;96ec74ea-1acb-48be-b74e-816ba301d19a&quot;,&quot;name&quot;:&quot;oneplus-5t&quot;,&quot;filename&quot;:&quot;oneplus-5t.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/KK0CqnMaqMxZ9bC-3jbAiQhnutM=\/2017\/10\/30\/96ec74ea-1acb-48be-b74e-816ba301d19a\/oneplus-5t.jpg&quot;,&quot;caption&quot;:&quot;<p>Una supuesta foto del OnePlus 5T filtrada en China.<\/p>&quot;,&quot;size&quot;:41019,&quot;height&quot;:592,&quot;width&quot;:690,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-30 19:55:39&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-30 19:56:18&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;credits&quot;:&quot;Weibo&quot;,&quot;alt&quot;:&quot;oneplus-5t&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn2.cnet.com\/img\/9CtVwepYPv7fktP5LlCjoAjq0is=\/fit-in\/194x109\/2017\/10\/30\/96ec74ea-1acb-48be-b74e-816ba301d19a\/oneplus-5t.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/10\/1093211715579\/es_lasemana_9noviembre02_1259372_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/el-desembarco-de-xiaomi-en-espana-y-la-previa-del-oneplus-5t\/&quot;},{&quot;id&quot;:&quot;283c729a-eeeb-454b-ae03-d1d95229031d&quot;,&quot;title&quot;:&quot;Google Assistant habla espa\u00f1ol y el iPhone X presenta un nuevo idioma de dise\u00f1o&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #161] El asistente virtual de Google ahora domina el idioma de Cervantes, y el iPhone X inaugura nuevos gestos y un nuevo lenguaje de dise\u00f1o de la marca.&quot;,&quot;slug&quot;:&quot;google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:683,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1087923267594,&quot;mpxRefId&quot;:&quot;jCXv62P0jCNTJB3jKuthMzA3CV0ghejk&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;0d404b1c-30e9-4ccf-9901-d2125b2b23f2&quot;,&quot;name&quot;:&quot;iphone-x-67&quot;,&quot;filename&quot;:&quot;iphone-x-67.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/JoewZeNO5ePGyD5iGiD7VM32i9w=\/2017\/11\/03\/0d404b1c-30e9-4ccf-9901-d2125b2b23f2\/iphone-x-67.jpg&quot;,&quot;size&quot;:153088,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-11-03 16:19:37&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-11-03 16:19:37&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;iphone-x-67&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/6fdfuTdyxV3t7waWLSKyE6df3fY=\/fit-in\/194x109\/2017\/11\/03\/0d404b1c-30e9-4ccf-9901-d2125b2b23f2\/iphone-x-67.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/11\/03\/1087923267594\/semananov2_1253191_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-assistant-habla-espanol-y-el-iphone-x-un-nuevo-idioma\/&quot;},{&quot;id&quot;:&quot;a3c0de25-3d75-44b9-9c83-6925dbd3ebb2&quot;,&quot;title&quot;:&quot;La pantalla del Pixel 2 XL, la llave maestra de Amazon y el inminente iPhone X&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #160] Analizamos los problemas con el panel OLED del tel\u00e9fono de Google, los env\u00edos de Amazon entran en tu hogar y ya est\u00e1 a la puerta el nuevo tel\u00e9fono de Apple.&quot;,&quot;slug&quot;:&quot;la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:574,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1082906179568,&quot;mpxRefId&quot;:&quot;t4LPcFt8Hmm8Vg7U8o4s4_E0Xn_xqxAj&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;00597069-4f14-41dd-b1f1-e7bc413d4e17&quot;,&quot;name&quot;:&quot;Google Pixel 2 XL screen burn-in&quot;,&quot;filename&quot;:&quot;screen-problems-2405-001.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/zM13Oy086Lnor1efnDjx0mVca88=\/2017\/10\/23\/00597069-4f14-41dd-b1f1-e7bc413d4e17\/screen-problems-2405-001.jpg&quot;,&quot;caption&quot;:&quot;<p><\/p>&quot;,&quot;size&quot;:1865911,&quot;height&quot;:1467,&quot;width&quot;:2200,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-23 19:09:04&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-23 19:09:23&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:1,&quot;credits&quot;:&quot;Josh Miller\/CNET&quot;,&quot;alt&quot;:&quot;Google Pixel 2 XL screen burn-in&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn4.cnet.com\/img\/XTHaIZ7ZBuXvKPKB5niFqcP_23M=\/fit-in\/194x109\/2017\/10\/23\/00597069-4f14-41dd-b1f1-e7bc413d4e17\/screen-problems-2405-001.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/27\/1082906179568\/es_lasemana27october_1247416_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/la-pantalla-de-pixel-2-xl-la-llave-maestra-de-amazon-y-el-inminente-iphone-x\/&quot;},{&quot;id&quot;:&quot;ae23b111-1e88-4edd-b1b5-dfed3e0cb061&quot;,&quot;title&quot;:&quot;Se consolida el hogar inteligente y aparece el fallo KRACK&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #159] Esta semana hablamos de la nueva plataforma de Samsung para el Internet de las Cosas, de la vulnerabilidad KRACK y de los nuevos tel\u00e9fonos en el mercado.&quot;,&quot;slug&quot;:&quot;la-semana-oct-19-cnet-espanol&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:691,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1077887555736,&quot;mpxRefId&quot;:&quot;H4gkX0JjbU6b4gxZOkirySjFp3Z845dA&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;6a9b3b6b-575a-4b66-b4b2-4aedee01be6d&quot;,&quot;firstName&quot;:&quot;Gabriel&quot;,&quot;lastName&quot;:&quot;Sama&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;d704b38b-cafe-414b-879b-459dd712796c&quot;,&quot;name&quot;:&quot;zte-axon-m-9755-024&quot;,&quot;filename&quot;:&quot;zte-axon-m-9755-024.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/VAqXY-db6xzcKly6P5BNqbaHpQw=\/2017\/10\/20\/d704b38b-cafe-414b-879b-459dd712796c\/zte-axon-m-9755-024.jpg&quot;,&quot;size&quot;:87148,&quot;height&quot;:900,&quot;width&quot;:1600,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-20 16:33:13&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-20 16:33:13&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;zte-axon-m-9755-024&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/ReV56T1ZCShd3YWImeR2IWEqAXU=\/fit-in\/194x109\/2017\/10\/20\/d704b38b-cafe-414b-879b-459dd712796c\/zte-axon-m-9755-024.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/la-semana-oct-19-cnet-espanol.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/20\/1077887555736\/semana_oct19_1241505_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/la-semana-oct-19-cnet-espanol\/&quot;},{&quot;id&quot;:&quot;4cb73b8d-1b2f-40ef-bb98-6b093198c681&quot;,&quot;title&quot;:&quot;Un nuevo Kindle y se asoman las nuevas gafas VR de Oculus&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #158] Esta semana, lleg\u00f3 el Kindle Oasis impermeable, se anunciaron las Oculus Go y Santa Cruz para realidad virtual y hubo un problemita con la Google Home Mini.&quot;,&quot;slug&quot;:&quot;un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:422,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1072264259697,&quot;mpxRefId&quot;:&quot;8RTAYZ4ou1BgXXiybOYiclkJ6avdl6SM&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;4514916c-88c7-4c00-8324-9d522e0b3047&quot;,&quot;name&quot;:&quot;kindle-oasis-covers&quot;,&quot;filename&quot;:&quot;kindle-oasis-covers.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/el7STcxt2T02OoIFWp08KB2D1Bk=\/2017\/10\/05\/4514916c-88c7-4c00-8324-9d522e0b3047\/kindle-oasis-covers.jpg&quot;,&quot;caption&quot;:&quot;<p>The optional covers start at $40 and come in nylon or leather.<\/p>&quot;,&quot;size&quot;:4432570,&quot;height&quot;:3024,&quot;width&quot;:4032,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-05 19:52:22&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-05 19:53:38&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;startDate&quot;:{&quot;date&quot;:&quot;2017-10-11 13:00:00&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:1,&quot;credits&quot;:&quot;David Carnoy\/CNET&quot;,&quot;alt&quot;:&quot;kindle-oasis-covers&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn3.cnet.com\/img\/vDQrwxSq2oDqDHdtnPLwD_eJR98=\/fit-in\/194x109\/2017\/10\/05\/4514916c-88c7-4c00-8324-9d522e0b3047\/kindle-oasis-covers.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/13\/1072264259697\/es_lasemana12_oct_1235274_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/un-nuevo-kindle-y-nuevas-gafas-vr-de-oculus-se-asoman\/&quot;},{&quot;id&quot;:&quot;09051611-4cd7-4384-a459-b4a1050b5c1c&quot;,&quot;title&quot;:&quot;Google Pixel 2 y lo que nos dej\u00f3 la temporada de s\u00faper tel\u00e9fonos&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #157] La gigante de las b\u00fasquedas se anima con todo al hardware, y sus tel\u00e9fonos marcan el fin de una \u00e9poca de grandes anuncios.&quot;,&quot;slug&quot;:&quot;google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:598,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1064365123530,&quot;mpxRefId&quot;:&quot;Us3jKld5gPd3TfSG9QLLbD5jw_vdMyds&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;d077c3c0-c88f-492f-a8a2-8b043af04f0e&quot;,&quot;name&quot;:&quot;100417-google-pixel-2-7126&quot;,&quot;filename&quot;:&quot;100417-google-pixel-2-7126.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/BNbeNYmhimN2Z_KulzpEpn0l7AI=\/2017\/10\/05\/d077c3c0-c88f-492f-a8a2-8b043af04f0e\/100417-google-pixel-2-7126.jpg&quot;,&quot;size&quot;:52547,&quot;height&quot;:467,&quot;width&quot;:830,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-10-05 23:35:43&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-10-05 23:35:43&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;100417-google-pixel-2-7126&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn2.cnet.com\/img\/5-e1P5u3K43hFHiSjBjhdB3f1lI=\/fit-in\/194x109\/2017\/10\/05\/d077c3c0-c88f-492f-a8a2-8b043af04f0e\/100417-google-pixel-2-7126.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/10\/06\/1064365123530\/semana_oct5_1229769_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/google-pixel-2-lo-que-nos-dejo-la-temporada-de-super-telefonos\/&quot;},{&quot;id&quot;:&quot;4bb8f3fd-304c-495e-8b83-57fcea47b89b&quot;,&quot;title&quot;:&quot;La avalancha de productos de Amazon, y tuits de 280 caracteres&quot;,&quot;description&quot;:&quot;[La semana en CNET en Espa\u00f1ol #156] Esta semana vimos nuevas bocinas de Amazon; una nueva c\u00e1mara GoPro y Twitter dijo que duplicar\u00e1 el l\u00edmite de caracteres en tuits.&quot;,&quot;slug&quot;:&quot;amazon-nuevos-productos-twitter-280-caracteres&quot;,&quot;chapters&quot;:&quot;&quot;,&quot;duration&quot;:673,&quot;hasCaptions&quot;:true,&quot;mpxId&quot;:1057969219682,&quot;mpxRefId&quot;:&quot;IUOzQ0y6ps_ludp4UH9c1EZFCsJNA7X8&quot;,&quot;ratingVChip&quot;:&quot;&quot;,&quot;primaryTopic&quot;:{&quot;id&quot;:&quot;&quot;},&quot;author&quot;:{&quot;id&quot;:&quot;272ff2eb-03d3-4e24-9b55-09f4633368f9&quot;,&quot;firstName&quot;:&quot;Mariana&quot;,&quot;lastName&quot;:&quot;Marcaletti&quot;},&quot;primaryCollection&quot;:{&quot;id&quot;:&quot;b45f7536-5ba2-40d8-a054-40341b279649&quot;,&quot;title&quot;:[&quot;La semana&quot;]},&quot;image&quot;:{&quot;id&quot;:&quot;194498de-a074-4687-ab0d-d880d5ee05de&quot;,&quot;name&quot;:&quot;amazon-spot-1&quot;,&quot;filename&quot;:&quot;amazon-spot-1.jpg&quot;,&quot;path&quot;:&quot;https:\/\/cnet4.cbsistatic.com\/img\/MLV0Q7ERz3liDf123UtGhwIuMjU=\/2017\/09\/28\/194498de-a074-4687-ab0d-d880d5ee05de\/amazon-spot-1.jpg&quot;,&quot;size&quot;:850748,&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;dateCreated&quot;:{&quot;date&quot;:&quot;2017-09-28 05:39:36&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;dateUpdated&quot;:{&quot;date&quot;:&quot;2017-09-28 05:39:36&quot;,&quot;timezone_type&quot;:3,&quot;timezone&quot;:&quot;UTC&quot;},&quot;needsModeration&quot;:0,&quot;mimeType&quot;:&quot;image\/jpeg&quot;,&quot;deleted&quot;:0,&quot;preferred&quot;:0,&quot;watermark&quot;:0,&quot;alt&quot;:&quot;amazon-spot-1&quot;},&quot;thumbnail&quot;:&quot;https:\/\/cdn1.cnet.com\/img\/0t12kUyxiPUjjBEvghADT8bfI1Q=\/fit-in\/194x109\/2017\/09\/28\/194498de-a074-4687-ab0d-d880d5ee05de\/amazon-spot-1.jpg&quot;,&quot;isVertical&quot;:false,&quot;m3u8&quot;:&quot;\/es\/videos\/manifest\/amazon-nuevos-productos-twitter-280-caracteres.m3u8&quot;,&quot;mp4&quot;:&quot;https:\/\/cnetmedia-a.akamaihd.net\/21923\/2017\/09\/29\/1057969219682\/es_lasemana_28septiembre_1223993_740.mp4&quot;,&quot;selector&quot;:&quot;\/es\/videos\/selector\/amazon-nuevos-productos-twitter-280-caracteres\/&quot;}]">
+ <div> <svg><use aria-hidden="false" xlink:href="#play" /></svg><svg><use aria-hidden="false" xlink:href="#pause" /></svg>
+ <figure><img src="https://cdn1.cnet.com/img/mWcZaiA8Ngv61OQcpdoh6Ra9nY0=/170x96/2017/11/13/70540d7a-cbc5-4563-ab86-b5549ef68168/oneplus-5t-product-21.jpg" alt height="96" width="170"></figure>
+ </div>
<p><span>
<span>Reproduciendo:</span> <span>Mira esto:</span> </span> Google Assistant mejora, hay más cambios en Twitter y... </p>
<p><span>
- 8:09 <svg><use aria-hidden="false" xlink:href="#video"></use></svg></span> </p>
+ 8:09 <svg><use aria-hidden="false" xlink:href="#video" /></svg></span> </p>
</div>
- </div>
- </div> \ No newline at end of file
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json
index 773cbb9f0..d51b85260 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": "Steven Musil",
+ "Author": "by \n\n \n Steven Musil\n \n\n\n January 18, 2017 11:00 PM PST\n \n \n \n \n \n \n\n \n @stevenmusil",
"Direction": null,
"Excerpt": "Facebook CEO says be a friend and have a shared vision, but scare them when you have to and move fast.",
"Image": "https:\/\/cnet3.cbsistatic.com\/img\/1JaRRjqhoGxDVkFxTRRWkZgyK2Q=\/670x503\/2014\/03\/21\/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e\/mark-zuckerberg-facebook-home-10671610x407.jpg",
"Title": "Zuckerberg offers peek at Facebook's acquisition strategies",
"SiteName": "CNET"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html
index 4f401dad0..f9a3b7421 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnet/expected.html
@@ -1,15 +1,17 @@
-<div data-component="lazyloadImages" itemprop="articleBody">
+<div itemprop="articleBody" data-component="lazyloadImages">
- <figure section="shortcodeImage"><span><span itemprop="image" itemscope="" itemtype="https://schema.org/ImageObject"><img alt="" class="" height="0" src="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" width="570"></img><meta content="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" itemprop="url"></meta><meta content="0" itemprop="height"></meta><meta content="570" itemprop="width"></meta></span></span>
+ <figure section="shortcodeImage"><span><span itemprop="image" itemscope itemtype="https://schema.org/ImageObject"><img src="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" class alt width="570" height="0"><meta itemprop="url" content="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg"><meta itemprop="height" content="0"><meta itemprop="width" content="570"></span></span>
<figcaption><span><p>Facebook CEO Mark Zuckerberg, the man with the acquisition plan.</p></span><span>Photo by James Martin/CNET
- </span></figcaption></figure><p>Anyone who has ever been involved in closing a billion-dollar acquisition deal will tell you that you don't go in without a clear, well thought out plan.</p>
+ </span></figcaption>
+ </figure>
+ <p>Anyone who has ever been involved in closing a billion-dollar acquisition deal will tell you that you don't go in without a clear, well thought out plan.</p>
<p>Facebook CEO Mark Zuckerberg knows a thing or two about how to seal the deal on blockbuster buys. After all, he's the man behind his company's <a href="https://www.cnet.com/news/facebook-closes-19-billion-deal-for-whatsapp/" target="_blank">$19 billion acquisition</a> of WhatsApp, he <a href="https://www.cnet.com/news/zuckerberg-did-1-billion-instagram-deal-on-his-own/" target="_blank">personally brokered</a> its $1 billion buyout of <a href="https://www.cnet.com/news/why-facebook-plunked-down-1-billion-to-buy-instagram/" target="_blank">Instagram</a> and closed the <a href="https://www.cnet.com/news/facebook-to-buy-oculus-for-2-billion/" target="_blank">$3 billion deal</a> to buy Oculus VR.</p>
- <p>Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday <a href="https://www.cnet.com/news/zenimax-sues-oculus-over-virtual-reality-rift-tech/">in a lawsuit with ZeniMax Media</a>, which accuses Oculus and Facebook of "misappropriating" trade secrets and copyright infringement. At the heart of the lawsuit is technology that helped create liftoff for virtual reality, one of the <a data-component="externalLink" href="http://www.cbsnews.com/videos/the-reality-of-the-virtual-world/" target="_blank">hottest gadget trends today.</a></p>
- <p>A key Facebook approach is building a long-term relationship with your target, Zuckerberg said at the trial. These deals don't just pop up over night, he said according to a transcript reviewed by <a data-component="externalLink" href="http://www.businessinsider.com/mark-zuckerberg-explains-facebooks-acquisition-strategy-2017-1" target="_blank">Business Insider</a>. They take time to cultivate. </p>
+ <p>Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday <a href="https://www.cnet.com/news/zenimax-sues-oculus-over-virtual-reality-rift-tech/">in a lawsuit with ZeniMax Media</a>, which accuses Oculus and Facebook of "misappropriating" trade secrets and copyright infringement. At the heart of the lawsuit is technology that helped create liftoff for virtual reality, one of the <a href="http://www.cbsnews.com/videos/the-reality-of-the-virtual-world/" target="_blank" data-component="externalLink">hottest gadget trends today.</a></p>
+ <p>A key Facebook approach is building a long-term relationship with your target, Zuckerberg said at the trial. These deals don't just pop up over night, he said according to a transcript reviewed by <a href="http://www.businessinsider.com/mark-zuckerberg-explains-facebooks-acquisition-strategy-2017-1" target="_blank" data-component="externalLink">Business Insider</a>. They take time to cultivate. </p>
<blockquote>
<p>I've been building relationships, at least in Instagram and the WhatsApp cases, for years with the founders and the people that are involved in these companies, which made [it] so that when it became time or when we thought it was the right time to move, we felt like we had a good amount of context and had good relationships so that we could move quickly, which was competitively important and why a lot of these acquisitions, I think, came to us instead of our competitors and ended up being very good acquisitions over time that a lot of competitors wished they had gotten instead. </p>
</blockquote>
@@ -32,7 +34,7 @@
- <p><em><strong>Tech Enabled:</strong> CNET chronicles tech's role in providing new kinds of accessibility. Check it out <a href="https://www.cnet.com/tech-enabled/">here</a>.</em><em><strong><br></br></strong></em></p>
+ <p><em><strong>Tech Enabled:</strong> CNET chronicles tech's role in providing new kinds of accessibility. Check it out <a href="https://www.cnet.com/tech-enabled/">here</a>.</em><em><strong><br></strong></em></p>
<p><em><strong>Technically Literate:</strong> Original works of short fiction with unique perspectives on tech, exclusively on CNET. <a href="https://www.cnet.com/technically-literate/">Here</a>.</em></p>
@@ -40,4 +42,5 @@
- </div> \ No newline at end of file
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html
index 552455fe8..368cf7737 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/cnn/expected.html
@@ -6,10 +6,11 @@
<p> The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs. </p>
<div id="smartassetcontainer">
- <div>
- <div>
- <div id="smartasset-article">
- <div>
+
+
+
+
+
<p>
Powered by SmartAsset.com
</p>
@@ -20,10 +21,6 @@
</div>
- </div>
- </div>
- </div>
- </div>
<p> Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries. </p>
<p> As the <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/publications/state-union-report" target="_blank">report states</a>: "[T]he birth lottery matters more in the U.S. than in most well-off countries." </p>
@@ -32,7 +29,7 @@
<p> The report also suggested the U.S. might not be the "jobs machine" it thinks it is, when compared to other countries. </p>
<p> It ranked near the bottom of the pack based on the levels of unemployment among men and women of prime working age. The study determined this by taking the ratio of employed men and women between the ages of 25 and 54 compared to the total population of each country. </p>
- <p> The overall rankings of the countries were as follows:<span> <br></br>1. Finland <span> <br></br>2. Norway<span> <br></br>3. Australia <span> <br></br>4. Canada<span> <br></br>5. Germany<span> <br></br>6. France<span> <br></br>7. United Kingdom <span> <br></br>8. Italy<span> <br></br>9. Spain<span> <br></br>10. United States </span></span>
+ <p> The overall rankings of the countries were as follows:<span> <br>1. Finland <span> <br>2. Norway<span> <br>3. Australia <span> <br>4. Canada<span> <br>5. Germany<span> <br>6. France<span> <br>7. United Kingdom <span> <br>8. Italy<span> <br>9. Spain<span> <br>10. United States </span></span>
</span>
</span>
</span>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html
index 6c3f15447..7fbd053c8 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/daringfireball-1/expected.html
@@ -1,16 +1,12 @@
<div id="Box">
-
-
-
- <div id="Main">
- <div>
-
+ <h2>About This Site</h2>
<p>Daring Fireball is written and produced by John Gruber.</p>
<p>
- <a href="http://fakehost/graphics/author/addison-bw.jpg"> <img alt="Photograph of the author." src="http://fakehost/graphics/author/addison-bw-425.jpg"></img></a>
- <br></br><em>Portrait by <a href="http://superbiate.com/inquiries/">George Del Barrio</a></em> </p>
+ <a href="http://fakehost/graphics/author/addison-bw.jpg"> <img src="http://fakehost/graphics/author/addison-bw-425.jpg" alt="Photograph of the author."></a>
+ <br><em>Portrait by <a href="http://superbiate.com/inquiries/">George Del Barrio</a></em> </p>
<h2>Mac Apps</h2>
- <ul><li><a href="http://www.barebones.com/products/bbedit/">BBEdit</a></li>
+ <ul>
+ <li><a href="http://www.barebones.com/products/bbedit/">BBEdit</a></li>
<li><a href="http://www.flyingmeat.com/acorn/">Acorn</a></li>
<li><a href="http://www.red-sweater.com/marsedit/">MarsEdit</a></li>
<li><a href="http://aged-and-distilled.com/napkin/">Napkin</a></li>
@@ -19,20 +15,16 @@
<li><a href="http://latenightsw.com/sd4/index.html">Script Debugger</a></li>
<li><a href="http://www.ambrosiasw.com/utilities/snapzprox/">Snapz Pro X</a></li>
<li><a href="http://nightly.webkit.org/">WebKit</a></li>
- </ul><h2>iPhone Apps</h2>
- <ul><li><a href="http://vesperapp.co/">Vesper</a></li>
- </ul><h2>Server Software</h2>
+ </ul>
+ <h2>iPhone Apps</h2>
+ <ul>
+ <li><a href="http://vesperapp.co/">Vesper</a></li>
+ </ul>
+ <h2>Server Software</h2>
<p>The Daring Fireball website is hosted by <a href="http://joyent.com/">Joyent</a>.</p>
<p>Articles and links are published through <a href="http://movabletype.org/">Movable Type</a>. In addition to my own SmartyPants and Markdown plug-ins, Daring Fireball uses several excellent Movable Type plug-ins, including Brad Choate’s <a href="http://bradchoate.com/weblog/2003/06/24/regular-expressions">MT-Regex</a> and <a href="http://bradchoate.com/weblog/2004/10/20/mtifempty">MT-IfEmpty</a>, and <a href="http://bumppo.net/projects/amputator/">Nat Irons’s Amputator</a>.</p>
<p>Stats are tracked using <a href="http://haveamint.com/">Mint</a>. Additional web nerdery, including the membership system, is fueled by <a href="http://perl.org/">Perl</a>, <a href="http://www.php.net/">PHP</a>, and <a href="http://www.mysql.com/">MySQL</a>.</p>
<h2>Web Standards</h2>
<p>Web standards are important, and Daring Fireball adheres to them. Specifically, Daring Fireball’s HTML markup should validate as either <a href="http://www.whatwg.org/specs/web-apps/current-work/">HTML 5</a> or XHTML 4.01 Transitional, its layout is constructed using <a href="http://jigsaw.w3.org/css-validator/validator?uri=http://daringfireball.net/css/fireball_screen.css">valid CSS</a>, and its syndicated feed is <a href="http://feedvalidator.org/check?url=http%3A%2F%2Fdaringfireball.net%2Findex.xml">valid Atom</a>.</p>
<p>If Daring Fireball looks goofy in your browser, you’re likely using a shitty browser that doesn’t support web standards. Internet Explorer, I’m looking in your direction. If you complain about this, I will laugh at you, because I do not care. If, however, you are using a modern, standards-compliant browser and have trouble viewing or reading Daring Fireball, please do let me know.</p>
- </div>
-
-
-
-
- </div>
-
- </div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-images.json
new file mode 100644
index 000000000..b85fb67d7
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-images.json
@@ -0,0 +1,6 @@
+[
+ "data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
+ "data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24'><path d='M512 512H0V0h512v512z'\/><\/svg>",
+ "data:image\/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTUxMiA1MTJIMFYwaDUxMnY1MTJ6Jy8+PC9zdmc+",
+ "data:image\/jpeg;base64,\/9j\/4AAQSkZJRgABAQEBLAEsAAD\/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj\/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj\/wAARCAH0AbYDAREAAhEBAxEB\/8QAHAAAAgMBAQEBAAAAAAAAAAAABAUCAwYBBwAI\/8QASRAAAgEDAgMGAwYEBAQFAwMFAQIDAAQREiEFMUEGEyJRYXEygZEUI0KhscEHUmLRM3Lh8BUkQ\/EIFjQ1glOiwkVjgyUmkrKz\/8QAGwEAAwEBAQEBAAAAAAAAAAAAAAECAwQFBgf\/xAA1EQACAgICAgEDAwEHBQEAAwAAAQIRAyESMQRBURMiYQUycYEGIzORobHRFELB4fAVUoLx\/9oADAMBAAIRAxEAPwD1G3lC9a8Hjs4LLnvCq896HAdgzcSKnGalx2FnW4lkc81tGArKDxI6uZFOcPgEwqG\/JxhtzWPFpjCBe7bmjaAsS665+VJx+APpLvbGcVpFfImCi7wTvV6DYRBcvnc7VLiOw6O6x1rLiUmfSXy43b51Sr2Ps8n\/AIiTifi5wSQN9\/aujDtnXgVI0PAgV4ZAP6B+lelDpA+zPdvT4I\/Ws8vo0xmGxmsjcLsB\/wAwtAUP2+GpYkCSjfepsYou9pjyqwZCmxF5yIIzvgvil3sAgZwKoCQNKvkR6H\/CJ8cQul81BrfB2zHN6PY7XwO2SNxS8t1CzGHYbzVfKowO4JmjAL9iWORgCtWIS3rpHkkgnGSOtIDG9qiGvLfG4NZ5PRcBhaDEK+1UiWScc6YCbivWpfQ0Hdl1LSYAJPPYVpjJkaiOWJ5AiTQs+caRKufpmtOSurJ4Sq6PP\/4n7r3bZB2GOuaif7lY10egdnLsJwCyGRkRL+leZmVCTCJb4E7nFckk2UVHiEaHJPzpK0FnV4mhOAarfYrD4LpXALeVWmwsm9ytQ2xlbXaBSM1DegKWvEJxkVkpjKheIpO9VdiPpLxG8qmxlcd4A2CKFkaETmvV0HcVSyWApm4npc5PKtI9gVycR1dMmuutEXYG96wf1rKYrC4LxicsaxeSh0Evfrp3xmnCbbHoBe+yxwNVdUc0kiXFMQrcELk4Hzo4HHZS96GYgZqq0AHPMc8z60kkBUkzBcA7k1URIr786\/izimAbBd4G5FQ4XsZyTiHiCqaniUFW15k75J8qFGwYW0xKZ5U3DRNlYZsg74ppUFl6zkHYkelOkFk2uiqnVn5UmkNFPfaxsazcfZaZ572tbPF5QeldGPo7sP7TZ8G\/9uh\/yD9K9CPSJZm+3vwQj3rLL6NMS2YnArI3DOHj79aTF6HxG1SxA0g33pdlIS3I++arQyFUSFNHmyQgcpKliZbp2GKY+ztAqNr\/AAuk0cWnH\/7efzrbC\/uMsy0ew3kxS1DA7nrmp87\/AAWYR7Gtg5e1gYncoDU+N\/hx\/gso4kCVYdcVuwMle8O7ziH2nvHyU06TnHvWdK7Az3aRcX9uo3AFTk7RcRpaj7oe1WiTr9aQCXiekBnlcRxL8THp\/c0m0k2yoxcnSFqXk9xEYoiYLQnZV2Z\/VjXBk8iUtLSPQhgjDbVstj4cjKSM5NYUbcgPtCZb7gZjuCXuLMgq7HLNGTuD7Eg+xr0PGy81xl2jh8nEovnHpmls7trfhltGzY0oBzpZ4qzz72yM3FMnAbeuZ40WVy3bSLuedJxSEGWhYKCSdq0jEQyivsYXNEoWBa9+qJnVWTxhyF8182SdRxWc8aHZQ3ESE3ORWPALB\/8AiX3nifw1axsakEHiSso0tT+m6HZWOIrvqaspY2guzk3ERpxrqIQt9B0Kbq9GQxO2a7seOkS3ZKG7IX4se9NiRclyHILEE1lNNdD0EpcgHANc80CK5LhjJsdjXRGOrQrCLZtWTiom2NMTSgjbFd9HCDDCEnH1pUAHcXBBIANGwBzIzEAHc+VKx0WrFhck74pAUSOynnsfI07GVLPpPWnfpDoZWMraQSd6VEsYJdquM04iLY7xG5HPkKdUMuMxK7Del\/I6KCXZwNxUsYbBFgb\/ACoSoRgO1i6eKyE9Sa1gehgf2m04UMWMP+UfpXcukSzL9vjvCPSscvo1xGN61nZuG8NGbhaTEx6\/KkwQLN1zUjEtwPvjVpAcxTEaHgnDhfcP08vHnNT2hN07NBY9kheSd3HIQ+M8tqqEeWiHOtnb3sjHZuFnnYE\/yjNKbjj\/AHMX1Ars7Fa8Fv8A7QkrvldJBWlDPji7sicuRqbztDBc2YhhDagc5O1T5XkwljcURW7N3wJtfDLVuvdr+ldGBVjj\/Ayd9uTWrAT3WN6lsDE9oRq4rCOorKfZcehtAMRD2rQkquJFijd5WCooySegpP8AI0r0YLiXEm4pebErbRn7tPP+o15+bK8jpdHqYcKxq32G2hxp\/F51lRbZorNQ65A3HpTogBvYwZ2wpyQVI5jGDWmDWVE5leJ2UX6utvCqtyUbV25ezxb2xdCrtL4ya55peikNFUAqQx9qzdIdDKN27vIrSLRIHfXzQ4I6VtGKZLBE4kZB42YUPHQWQueIADnmuacQsAfiITmTvWUYWxlX2zPXY10Rg0KyP23usnJwN6mUfgdlZ4m8nwbGolj+R2RF8zOFJyKSx1sZfqYpnmK3g6JZRc3xiGcEDrircExJ7KrfjBJVAdiedYTxNFWPre9BjB5msPphZyW73zvVKNJiGVldju8nrWcuykwcEON8YrsVeziA5sasDlRfwL+Sl4VJO1T2URiswZNWMY5CmkgLbiPu1waAsXzsANgM0NjQMulyc5232qbG2Eq3djw5IqbbdiBp55AcrzNWmPsZcHdn0ltz54rKWWSNVBGkihVlydqSkNxKZ8IRyrRbM2iSy4XbOKrsgwPahtfEm3860iejgX2m24dtaRf5R+ldq6J9mS7eH76IelY5e0jXHsyYwCMkVmvg1GHD42juF7xWTIyNSkfrTqg7Q7ZcjPSlISBJ+tQUJp1xKc0xsiKpCNz2NjP\/AA8EDmxoijOb2ek9mLbQHkYb4xmunGqVmEnZlu3ErrxDGpioGMCvO83ckgMk1zIXARiPOudQVbFYfDKyxnfOBWU0Fnt3Z7I4NaE\/\/SX9K9vCqgv4GW8Q1lMpgn1q2AllMp+JRUgJbzh6y3KysPEKlq3ZSdF2jSgFUIwPbTjOq4PDrdvCu8rDqegrk8jJ\/wBiO7xMX\/exHaHqRXMonVOQ1tpPGM7USEjVcPlxCM5pJiaBbp1a\/QAkMQc\/Q1ph\/wARE5v8JgvE5SWQDp1rvyLZ4SFkc6mQjOHFYTSRogwyFiM1jJehsa2zZjAzVRVEMX8VjUoc861TJM8co432rZNUB9dXCpHkYrDIrEL5py3i233FTjiaJUQil1EYO9byaSEy6VWcZHTpWSokoWPUQeQzVPekMZRQr+E561L\/ACFhmtQqjyrN2h9iviTKQ2kfKrixELez2jZQT12rPkytDy2XCeMEfKs3foGGRRI4xUtEhCWwQdR7VNWMrBGnblXT+TkOqo8v71LA+WNdzRYEmdYxsRmqAX3twNLHO3l50x0Ibm6UyYPPzo4lpUdtny+wPvUMQxSN3xtUokl9kDfFzoY0xrw+JYsE7HpUOJrGQ1NwiL6+lJIqxVfXoycVrFMl7BResoGMgVolaIMlxaTvL92J5mrSqz0cP7T0GwH\/ACsf+UfpXb6MjJdtlMl7Ci7s2APc1hkVtGuP2OLe2i4KgtbEBbgf41zga2bqAegHkKw8jyHjfDH\/AFZ1YcKmuczksvEEbVHeXRzzDPq\/I1zLPlW+TOj6WN6cUByz6mP221Rl6ywL3bj3Hwn6VrHyL\/ev+SH40f8AsdAd1aFommtXE8A5so3X\/MvMfpWqSkrg7MJJxdSRmpd5jmhAdC+lUI9M7BW2vg8LY5k\/rWuNXEwm9npPDoe7tSB1FdC0jH2YHtqNV+3mK8ryv3jZk4lCncb5rnbEGaS4wFOMVm67A9x4KMcKtlIxiNcfSvcx\/sRRdOd8dKpgLZ13NSABOm9IZnO1nFF4TwqSUEd8w0xr6+dZ5J8I2aYsbySo8fhLTTtI7EsxJJ864Um9nqtqKpDiE6QP3qzPsacNUySDHLrtWMmzWqRpJXEVurDYVMtIlK2Lra4abiWV30RtvWvibymfl\/biZXxQMkmCeVd+T9x4cTPS6zc\/d86m17KQ7t4XVAzE5x1rCbsZKS7eAHeskIX3V5LO3xbe9WpUKgOQPgajvTWRoKBZoJSmB71X1LEBTpKuxHhHWqjJFp0XWQzsRjyq3slhTlQmG\/KpSYvyfWzKWIztWnGtkvZN5jGcgED1pSQkwWfiDBsHpUfTstEYrhLmQFwB0xS48dAajhUSOo5elc8tFoayQoq5NRuxNFEUkayZotk1QxWSNkG4rJyoaQn1qF3NdhyHUmXUN9sUUBTcXaKnP60NAJ7niSq2Q\/yzQuylFsWXHFFfUoarjE0UAeFjMx5GqaBqh\/w+AADp51nVozbHMSgcuVS1RJ8xxvgYqdlA094sbYPMVQ0CS8VGMaqfHZZ2KX7QQfzptUgRc1uWA0g5qeQzL8QGLxuu9ax2jux\/tPRbIYtk9hXYZmU7UuI+N2bE7LIh\/MVlN1JM0xrTHQHeXTSMMFiST65rzctubbPThqJdcxFRkDNRQXYlu3x8OVx\/MMigpCw3HdyiRHMUq8nTl\/2pxbi7TLaUlTKbi3ivzrgVIbs80GySf5fI+nKuqGRT09P\/AHOTJhcNroWlGRyrqVZTghhgg1ru6Me1o9f\/AIdQ\/wD9vWpIG4P6104l9pzTf3M3cY0wVr6MvZ5t2vDPxCQLuDXjeY6yDZnhasrA7nzrm56BBSkJGcc+makPZ7fw8EWEIPRF\/Svfj+1FH0tAAE1AANxtmpA8Q7f8aHE+NtFC+YIPAuORNcmWXKX8Ho+PDhG\/kWWWFXPWlFGrYWkoJAzvSlouCs0XBQpYdPesGmzRqkEcd4ikYWMNudqznvQ4QfZXwZWZJJs\/hx57ZFdPiL7\/AOhy+c\/sou4u5+0EEcq7MqqR4cWJ4sNcgkdayekUaK3bMRBxWTGLr+Ikkjf2rPVgArFoPw02yb2fZQnG21RdASwhwcVSZIFdhNRG2DVReykytURQCMVrG\/QmDy88jz2FbIVledCk1doBfdTlgRqp6YJUVhTJvvmjjQ7J20fdvuSOopSj7FZruC3IjIVzvj2zXn5O7NExpdXZ7rOwNZxexszrcSVbgh261uoNohh0fEYlAIc1jKLDoIuEYE88V01s5QN3aIczQJCq\/nY9TjHKhPZaQkmd5SdsdKtfJoigQvnJzV8kWgvh6vG4z0O9S5IUjRWc\/iAJ28qhy9mLQ6SZe7\/es3IEime5JGF2rO7KoU3RLvyzvzq4utjSOW9gWIJ671LyM0pDy0gWJRkelLnZIfFoI23qokswvETqv25HxfvWsFo9DH+09Ds9rdfau4zMT223vwOuBisMvZtj6G3C7pHt4ZSSS4GQfPkfzrhzJKVnfidxoZzTd6pFZ6eijN8TLIxwG+VI0QlllJJzzq1voCj7SVODyo4lJjGG4h4hpivJNE2MJcfoH8x68xW+PJ6n\/mcuXDX3QPY+wlq1vwC1jkA1KuD1616ONVFI8yf7jVEYiIq30QuzAdp1UcQJFeN5kf7wJCKSVRnHOuTiIBuJApXzJo4tbGme8WJ1WMJON0HL2r349IshKeeKAAZaQGW7b8QPD+CTuhAkkBRTnG9D0rKirZ4EqsbltZyxOc+dcnCmelGWhrHjSM5wD9aqg7eg6zRS4DbYrObo0ghzJeQ2Nt4WyfKudv4N4RbexLAZLuZ7iYEqOQ86zOhr0PuzcpuJnjU7Ig5erV1+IvvZ5fn6iNuMW7GXNbZZfeeItGdKtHcjGfep5Foe2utkwRWcmIt+zsTnBrCTAou4NKE9agDK8S71CWQ4Ga1grWxaBYuIOgwTnHSreP4AKt1lu2zp+dJPj2FB62DrjX0rojL2JombMMMYolOhIEvbJhkqNv1pLJYPQjksm73DDrWymkNDK24ecAnGKHmQqLZ7FVGFFQ8pNFtrb6CDnOK5pzvsot4g7pCcE1EUrsdsyNzKROdRwehruxtLQy6C50jdsH3rOaTCjeXDEjV0NJo5BY+CSDmoeikC3EG2+aEMHSx1AtjbzqWyrLouHADLA5\/Wp5By0VS2mh\/CMetPk\/Ycg2xtznfFNMQwY6E35CmyRReXmJQFOKhxs0ii20AeRevrQ4mi0P440WPpmsuNMTZXPKqpscH0ppCB47g9DWq0FGXud70\/5\/3reL9nfBfaejWv+AvtXYYmI7Zf+5fKufJ+43xdAvCbjTbvGxI0NrHz51zZo8o\/wdmB1Kvkci+1SDDbVx2dPEvukjuIdWAaolaMnxFdDsBtVxVlitnJ2Iz7VolZn0RaVoznce9JxaKjJPs3vYPtw\/CmWC8LSWh2I5lfUVtgzOGn0c3keOp7XZ7PZ8RteIWYms5klRhtpNejakrR5ji4umecdrbh24rIkKs7LzAGa8zyMbnkpAxZa8N4veyFYbC5UDmzoVH1NC8ScnpEDSLsXxW4lBn7mJBuSXyRvyrReBNvbBaZ6vDeW8FsiO4AUYHWvQWOi+QDfcatYOSu+rkeho4JdhbZmOO9qlgjAjVcny51Mml0XGNnmvbzjtzxaKAqxKJuUG2axlPkjeMFEycSF3U75zWDZumMHLxp5HFV6NItXs7HN3GDIxZj05CspQrs6oSvSOwTyXtyE5qOeDyrF6NaQ04ncw2sccCsAcdNzWe2JSpWzR9jeGizgNyZFle5ODpzgCtsNxkji8lqcWNeIyLq8RFaZf3HhIQEI91jpWb6LHVviOPapexNnJLtVyKOAWCXFyrLms3GgMxxVg5Na40L2IGBEwB3BP0rrcftBM2HAI0EQzjNcE9MtMaXEqxqOXKtIvQMChnUsQpHOlOfySEyR6kJAztWHOnoGKLqERkNjka2jkvRNUCfaQnX0xWq2UkXwTJNzYVm20KgwRoFBXY1k3YCnilwUBAGa2grEZ10719Tc66o6QW0VNEUbI3HrU6KTNc88rEAHao7Obor1MviyaTKJrKGADUkIsjlXcE0pIGEiRcZGc0uIimU6vKk0NHYiVznnVRfoGRuJW08s58q1aEgNrXWdRx51FlxdBnD4cNjOwpqPIuxtI6JHjUM1osSJsUXJLvhDzrOUeI0y\/BEQ9qzLEE\/\/rjjO7\/vW8ejth+09Ft\/8Fa6zIw\/a\/fibVz5f3G+LoUWUvcXKPtjOGz5HY1HRqG3iNAToOpTuuK4pR4to9CE+Sslw7jCAd1LsfKpiU4X0B8VdZMspH1rSP4JbpGfkkQMfEufcVtFezCTBJbtk2H0ztQ7XRN\/II\/ETHybHsani0y+Q57O9rbzh12j287Lk777fMVvBtO0YZUn2e4cI7ZW91aQTtpEjjfIBIPvXWs2jkeEax9p0mDd1ctqHIHBFUs9kPC0EDi\/2lMyMwPkDg1pyvsjjQtuOKxxl4jJl\/iVnochpGf4l2piaNkfSCGwy+R86xeQ0jCzMXnG47sMHOGG2c71m5\/Jqo10KZJDjbEgPUVm\/wAGi\/JyIBTkdakdhvd6sHO+NvT1qkxWKr2B4vvGA35AfvScfk6ISXou4fcNa4d\/LJxsK58sWdEJJoDadrm9aR84LY9hWTXFUacb2bvsbf6LsWZfKEgqD0NaY7bo5c6SVjniKt3hI5b9a1yPdngoTRAifJGd6i0yhg02lMDbaiiWLppJNecU11Q0C3Vy5TY70pQGLJXZyc4NKNIGgFkUSZNdHK0QNrO9MOAu+3PNcs42WpEOJ8Qd0JXfHlShD0Mhwu8RpvAzct9VVmgvQro1ttcKY+eRXC47ExZxNw5YLitYiE\/2N5FJPWtlKirRKKIRkg7Gm3YFjz4GnUKhoVAN2C6kE52rSA6FgiKyYzvXQpaE0EMqhQGAzUCQ71LjlSUTnIKDK+kA49qqMLYWfTR90K2WKikK2uSpORmplCh1ZZb3rFgDy96ngJxGsBL7nfPIVlJUFWGIjHbG1OAEZIgCM4rZv0Kj6XSF2rBgBmcQnIPOtcb2UkWfahJGVxlieeeQrqi1QMKtLcMMtvXJl2Uiy4j0jpisUirM3Nvfj\/OP1raPR3R\/aeiQj7oV2GRhe1u\/E2rnyfuN8XQlUVmalnFLh7e0tJckxsSp9CDWGZLs6vHl6KLu2W7gE9udMnUCsuzqTp7M\/d3syKY5SdqqKsznIST3IJJ1P\/8AEgV0xic85Udgl7xMGfB8pFx\/91WoqjJy2cmglBGtCBzHUH5iji49oOafRclvltcYLEDOBzIquNoz5fI64ZeTIFRXOg8s+dAWazhnE3ijOWwCRkZ5UfkOxwnG5EfJkyOYINXbslxSL5+I\/aoI1lbOds+VaRl6Zm409Gc4jwySaV9L6mXJxnnQ0noLdCUW08QAkTY8j5+lS1RSYVYBlymSM7gHfFZtGiY0gTVGC\/MHFKgsOtlyc8ydqEBOa3WRGGOh3IquwTFd\/ZsEPdrqOnKjzP8ApUyiaQmJbtu4ZYl3ZfiYVzyx7OyOW4mh7ALJc9oLcLkqpLsfIAVeOO9HL5M6g7PTLmIE1lKWzx6Es8ISXI86yUtgVycuVbJ2KgGdjzFapIYrvNQOd8elOXQXsEVdQ1ZO1Y2JgV2zE+D51akLRZw9WcYYZIqJumNh8sHmNqmwT+SFtAI5CVXbpSk77HdhxujFH4c\/SsqtgCrxHUTkZpqAnsNtJwyYxTkmgTB7w6ck1UJWFCSSQiUHoNsVu42hh1u3fZHSs3ofRXeW4G42PmKuLsYveXxaWG461pxJod28wKg+dUoezChlbMgXlg4reEaJBb6TUdPStqvsaEd4pZtK74rFtGqRG0tWWQM+c+VZSY3EfWj6cBRmsJOzNqhh35jTPn0qOmTSIRSfaJQFHXetIty0AzXh6FR1NdCxKhoEuuFA523rKcePRa0LfsZikGCee9ZxmNjKFygAzWzjoR27nTuvWocQ7MuDrvkPm4\/WhI9CP7T0aL\/DFdlmRhO1f\/ub1y5P3G+LoUAVHo1oZwwwXvDms7oeBicMOanzFYZUbYnpmT4jctwK8a2ilM6rzLDHyqFV6OhSbRnuM3qTvrUbHnW2OFsiTpCeS6WNNQBI9K6VE55SPkvEBXc5IzvsKaj7Jsd8Kve7bCqrRMN4zup+X71NuL0TJWNAYZCPsuF1f9Inr\/SfP0O9UmpdEO12BtcNr\/lkQ4ORj61DKQxtXZRKutvENQ\/f9apL4BsY2yyNju8\/\/LpVKhNj2xVkhYDBfnvWiM2yE948bq4csUOCfQ0mNF0jxSjJJwTnGMij0CQP9ijILxE86hmisvjQ6EAzk9aXqg9hcS6ccqTXoYfCgPpmhMRC5tiRldmGwzTsZmeOcL2Bt4yTks5AyamSvo0jOuzVfw7tfsVg1wygGdyuSNwFH9zVYo0mzm8mV6NK90GY4IOK4pq2cgveUSTEczWCWxUVXCkYK5NbxYilLaSU7g1o5UM+m4ZlPFms55BMhHw1QMY\/KuZ5BUA3\/DlAOFGauM\/kTQHbW3ckYGDmrbvsEHlA4GrFRfwOiapHyyAaG2IrmhBBGB9KV7sPQrmsijhh9K15DQXaZGFIAIqZWOgie21pudzUxdMBPd2BTOcYrphILKrSNoW35U50xllxqUZOCvpRChWLVh7xyQM1vJohslwy6Rzhmxit18CkqHaXkcce7Va0RQumvu8n0R0O3opIKtbYPuxyayZZbcRBMEDArFpisqW5ETVnSb0JkjeaxscGqWN+yGg3h0+ls5AzVwXFho0FrOWXmK35oKLmkVzjOcVx5sqei0qArpF5gVlF2MS3s7R7DnXVF2iQaN5JjvkD1rOUkil2CW+97H5d4P1qkrZ3rUT0ZP8ADFdbMjCdp9+KSe9cuT9x0Y+hUKg0GdnE7WMzxrl4zqH0pOPJUOMuLPOOJyl5pTMS0mTkmufjTs6lIz96wLacn03rrxxrZnkYNHHpBRs4blWrZzlos2JUZJXHzpOasGg+xVokCnmp2NZylYJUqCGkIyBuD0IzUp0Ohpasl3GI5ziYrhWbcj0J6j338ieVdCd6Zk\/t2hhaL3DgSLkgYBB50JUNOx5AY4vBqO4BBOwPrT0hXZOe67t8Etttt1piALiXKtJHsSM4J\/aixq0fWV6GjbwjCnl1HrS9j9D7hWJreVVPiHiHmaHQrots5leYpJ4WHQ0IbbqwuVlhk0gjelIIuwyz8WOX1pJFN0MntSAupeflyNDjQlKykWIkbSU+KkgZr+EcAA7LXUNuh+5+\/i6nP4lP0rpjFKNHLlbfZiZWKu2WNefPbMvRXZTFpjvyrDjsY1UaiMCqJegqE6TyFTIVn11OgXpWM0xAizp54rBooGvHRxjIrSJItmIAPI71pQA8twAB0NCQyv7SBudzVBROO6DNjrSaa7At1qW35+tFWIqSQJN0I9KbstbGCMHVTWSsQBfgYJJ2rog9EsBWNpPENtqpvY7omtszDxMTSsQTBZrGOWc03KxaPPbWcxsa9RGj6HNlHLNu2or5U20tmbD4LUi4yBjFZ82ybG8OEB23pLYmwbiUjBOtZtOxoz8ksivzNNR+Cy6O5fG6Yq1ohoMs5HLAnI9axyP4AdwXTovxVwzlL0UgmK80jnvUbGTe6yuSdq2x66EL7hxI21dPSJLIlxE22+DXPLbLQts1\/wCehH\/7g\/Wt12jvX7T0VPgFdhiYTtL\/AO6Se9cmT9x0YuhYoqDQ1HZO3aYOirq1HGK1xK2Z5HR5z\/FDs7cdnuOyrJgwyeNGXlv0pZcXCRphy8kYGZtTcyDVKi27LIJVICOAd9h602iLGKBe7B\/2KxYzvL50r9AfKmttgfpTW+hWOLJNRRieW53wa6I\/kzZp4ohdW4DRqrjfVjmf2rXtGT0Kb67eIRRMA2jcY8jzxWbZaGrsk1qCpBYY3zSsdCaZ5I3K\/h50N0UD2U\/dyuoI0n15A+VLkTZp+BXHdxqDjwHfO2xobG9kuKS91dxyxnY9c4+VJscV6Jy38bAyuQAKcpCUaB17Z29k2B3hwceFc1Km70htI1fB+2lrcKizxMI3AOwyceeK1U2tNE\/TtXFj214rZM6ssmtCc+Hp7jpSbSdj4tqmehcDUSWuYmUxXMbRMeeCQcbVvHas5pqtM8zvrYiSQHmpI2rzJPbMkgGwtmMzHON6i1Yx1ECg5UmQ9lNxMRyFCAT3kkrtzIWiS0B223G7GuZoRZMoAxmmuwF1064xnGOdaLehUK558tgNWiiUgbvWDjJyKfH2VRersGyp\/Kk1Yi9ZJJTpzU1xCgy3jCnc6mpehh+hu7yBWTasdAM6sxwTvWkZElZJjj35+laaaIorW9wQGFLjQMPguA6eL5Una6GYex4frfLjYV6ikOTNLZRrGukfSnJ6MmWsVRieXlWXQgeWcjYU0hlLFpmABzS0NMJj4emMsAaHKkDOfYFZ8AH5Vk5UTZY1uYV8IGfKs7sYM0joSWBFZzjZaKTfFm0gZq4YgDLcSSjLZxW0cVCbClQZ3NGRehIKWVVTw+VcjuzWIts9+JQesgrph2jtf7T0BfgFdfRiYPtFvxOT3rkyfuZ04+gS1tpLiVY4ULuxAAFCi5OkU5KKtnqvZXhf\/l\/h8RvCBdzsBoBBxvXdih9NU+zknLm7MH\/F7TxHj09m4yDGdIB5MKjMrm0Xi1Gzwm+4fLDI4Y4x0Nc\/LizpTs5w+IKMsxPoVqXKwSoOJC7LjFR3tjPs8qV0xhtj8WfEAf5etaQohj+3GVAU7\/1j966E9GbJ3F1NBju8LgbYIpOVCqzO8TvmadXK\/iyR5edYvJZaiEwcSZFxnbOTvUKbHxosmvEkUkMcsQedVzHQpvZmjuw4Hh5EDqKfJ3sVGw4LIXgXIHiXSTz+tVd7QqLb8NIEj\/EGBzSaBdmS7RcTaIT92zGGI8h1NEYuUqsic0Mey9yivDdrFHNH+OGRcpIp5qR6jPtzrbE3CVoyn9yL+KcRgsOK\/ZrIyfZFnLW3efGqn8JPXnj1xVZpKrXpl+PyumbywgUqkyLpMm7D5VlJbNU2enfw+vTqlsHyykFl8wcdK1xNrRjlVqzPynXNIDkkk8687IqkzmRXbQAE4rFPYNl0oZdqZJUEBGSN6dsAO+iAG3M9KJOkACpEec\/SsxAl1eqAcnA9apIEJJrzU5UEEVqoeykitImlJJ2FaaH0EJZlmBAOKlyGEPZlQN8elRYrKQjJJpzvQ\/kB5wyBXRdY3rnnKhjOS30p4flWXKxAptBzJ3NUnQAl5BojOMVrGTFQilttc2TnPSujloSC1cxqAQOVQ18BQOsPdrsMCutNozKZphCCzEitVKxUAvfNK+AcCnxLSokA7776aG0kIugmMT42rNux1Y0S8UJsRUMloMtZVJGevlWUmTQS4Ryayk6KQuv4QV2G3lWcZNsvpAEFiC+o16GF2S2NYgqppA6V10iGVTRv3mV5Vz5JJFI4qtoOQeVcV7NI9lXDd+JW+3\/UFbxW0dz\/AGnoCDIAz0rrMRI3Zm64nxN3AAiLdcg1n9FykaLJxVGw4Z2a4d2ahN5NiW7\/AAljkJ8q6YY44lfsylKU3RmuL9o5JOJRTBhoik1cj+tSpNysrikqMtdzrxHtDcXrNlYoncY335fvS7k5AtRo804taSXV4xCg6mJrlkm2dMaoWXCLbfdAgkc96zat6ZdlKb9c58qTdATD6TkbEUl3oEG2TjGrJUDritF82S96JXXG44gUikZiOYBq7dE6F7ccDEiRGxUuLYconBcw3fhD+IeexqHBrbK5J9Em8I571NDK2kOSKErGTaXvBG3N1O+RzFWmyXRuOyuZLcxkgFCcZ6jyzWl6on8lvaZjZQzTJnBUY\/pJqqJvVGIaBZ0kDHMUgww\/ekrTtIy1VML4Pp4faRxFjttqOwrVNdkpA7P\/AMX7SAw7wxHc9D\/vFTJ26NsapWes8EnXVFCWGoDGOtS2VTo33ZAaO1GTyC+WMbVrj\/eZT\/aLZwTd3DKcoXP0zXFl3Js5V1RK1Yqxx1rkq2BdI2+9VQih2AJxToOgS8ww2NRIKAHtyy+dZ2goTcUsHkBGT6YraEwBeH8Icn7zNavLRaNLa8KCxgMMisZTG0cmt1gzyqVJskXyuS2AMitFRJT3LM4bpTb0A4sgqEYblXPJFB09woXnvyrOnYMBa7AYdaviAHf3KspA55rSKAAjkVic7ECtVaEyq4DNjAzVIRY0i6Mda6eJnQsvonl2UVotDB7LhcrSgnlnyq7bQ2x\/9gEUQJFc8k72TYouly\/hAzQikDJFLO2lEOOW9aNatho0NhbOgAJIIFcs2LsOWIqc7k1jLaoEduEGgZGTisoxZQvB0uQdt+VdeKXElqw63Ree1dEsroEthDRKeZ+lckpNjINEFikznlikuxx7AOFwF+KQd2QcPnHWurGuTR3N\/aer8L4Ye6R5FIY8s16EYGHIbTNFwmy14Tvm254qv2on9zPPe0vHXlVg7ghjtpG31FZSkaxR5xxziQYFI3DHq2eXyrJv0aL5KOxEzXd5xCFmz93y8q0x7siemU9pFSyRtLLqORWOR8UaQ2YOQmSUsTvnbNc\/8mxdEEQHIUkny5UuwB7yTIOG50IbYqu5pu6J1Np9TXRCKfZlKTXRNAgXGcbc8b1LWybAEd\/t7KT4WHKtWkoWZp7oJu00IrrkMBkehqYj\/JbbX7NjWdR\/Wplj9I1UrCpG1aWG1ZJV2UTgbLKM5PTNCXyHZ6B2WIiCB9s4NbRi6IbDe09t9rge17wDvFwPfpWiVuhJ6swkVld6cW00Tuux8W1FCcNk\/wDgV7dEC5nRU6iMZ\/M0rEoo0HCILSwhEdsg1+fP61DkaKNmu7LQM12GIOnmSaiO2VLo9H7Hp\/zd7MCF0wsQSdq3x+2c+V\/aCXCJqcx\/Dk4rhnK7aOYqjGk+dYLbH2VTyDJA51VEkERiN96Yj6eIhQcVjkdFA5cKpDDFYr5ArEQkPpVKQfyEwWoj3O4ocgTCzJGqjHlU27LsU36d6SFzWkRdgBgKdcmtUDRU8oXPnRQqIwyu7ZA9amUULoJZ2dQCDtWdUUVOGXfO9VQhdxFiF2A9K3ggsHgl2GrnV8aF7G0WgIDjOfOs2rFq9gNpEGGW3FejGOjJsJ0RhsbVDWxhMTKvLFaRRL2cuJx3WDSlEaF0MPfXGw8OazhBtjbpD6w4eiAEqM1u1SM7sNaFFOVxXn5tM0RQ+AD71yctmiQDdyAcjW0UhMS3c+mU71uo6skM4e5kwSaiYwuaYpjG4qaCyKSSTv3alVztkmrx43IcVs3nYXsfNHLFf8Q0GMeJFHPPrnpXpYcXHbOiU70jY8Rv4rcMFzrHLSM5rdujOjB9rONl3wytnTy6VlN2zWKo834vfakZmzjn4m\/bFZOjVIx16+py+rI5+VZvso0\/8PYsjiFwWZU0gEkfOunEvtbMMnaRmO19wHvHw+QDtvXFmps6MekZwHbJHKo\/Bf5OhgeQ2pNUMpuEJ3xTWtgQeET2+nH1qlJxZLjYqDG3PdS5HQE10JqWzB60WrLAPFpXVjGahwldLoLXYJd3IfwpWigK2Ux5WQMSdvyqntaKWtjKO5RsAEVhwRqpWM7CE3BTuzhgdhS42JujZcNDxXKnGFO\/h5A1skQ2ajiEIu+GltP30Y1D2oSoEZ2ytUEUkkCprc6mwMEmpbLA2k0zFW1KOuOYqHIdBlhErSBtQOT1FQ2i0b3s\/EY4HcgAAYyfWrj8kSNr2dxFwbikvwt3YX6mtIaiznyiWWdgDk1w8dWYkIZSTjfHnWdbEyeAW5CqJCogB70mIpvZAowOdc81ZSFNwxI33FSl8AyUMpA8IzjlSqgYUJmVRn86VEplTS7kDnQlRRxFLA77VaYyL24YZNWpFi29gAbAJrWIiu0TWRnIIpT0IYyQhAp64rnbGL7qUICGrWHRLEl7OWOFGc10wXsRRArMcDbHStgdje2uO7TDnfFYSx7HVgi3KounfNd8DFopa8KZY8qU6HGJ9DxMsd+VTC0NxOvdtK4x8NaX6Jqg6yuViAJxVJUS0OIeIjAxgiiT0R0Wm6LnY15udM2irJNG5XIbJPSvOpp2agN1GQhyADXXibfZmzPzj73Sa7k1Qh5w22CxgjY4zWE3sdBndKWCyZGTzAqVvQHpPY3gNvbWi3M1qjuyhlkdQSv\/AGr1cUFGPRokO+J3yWsDadPhGBnGflWtlUeZ8d4+jSYE+jfcE5BrJyNEmZninELdo2Zpgc+1TJouKZiOJzwu5wNug086ybNaYolk8Q7oNn3zUN\/Av5NJ2a4gkPCb1TKA7EHQFOfrW8GuDMpx+5GQ4tIZLhmJySeVcUncjoS0AliFxvS30UVKd\/P2o\/AF2AyAjel10NA+Wic4Jx5VS32JkZhFcKRKgz54qk2tolpPQFJw+2JyCw9K0WR+iHBdsktnbx7oKObYlFIpmhUjK1SnsdFVrCFYnFVJhFfA34ZJ3dygyV355qPY3tGztZ9G8u+TkEGtbIRseGus8CyIdx8Wwp9oKaAjw94phIijSSQcDY1HEfLYHxLhutxJGNJI32yDUSXsuLLOGWLl0AUA9CayaLs3NvCYoY4AM6dz6mr9UZt3s1dqEg7MzoGyZHGrby6Vr1BnPkexBJCMee3OuWVUZdkY108uWKxBlUkhVtqdE0TjuM8qTRJJiH+LeufIikRW3WTkBWV0OrIzWyxKSDg0+xUK5LghtOfaqSSCiVuyu+WP1okMLkkVUGKSHRWtwX8P51pFDs7Iqum+1bJUJspi0xnCj51lPQkHAAoSRWBQqv4FlJ8q2g2KhRLZaThN\/LrXTFsRV3fd51ruPSto\/gaRZGneDNDGLntZCdedq3jVGLroHmheTIHSm0NSotsbU8iM0LZLY0HDy4GxpzdE2cFsYsgjaub60kyqIBjG2d62i+XZNDSznGAScmieJMpMcQTLKNI515+SCRVkZ4DpJYCog+INCt7WIOSRWvMXYVCdtI2PKndgaXsjw+K54gTI+pUIz611eNBN2NKz1C4b7JYd0FJYjmOX\/avQSNbo857WTPJbuJZQmM6UAzkVElrZSfweOcV4m63Low2zgEDb51g2zetC+W\/1qQqoz46g0uQ0L7l2ZwZHAUDpiou32OgKaRQMKCTyH\/ek\/gEWcLukgldNsyKQSDVQdaJkvYDfsO8bw4rmfbNl0AlidjgD1o\/kZIYY7fWhaF2XKPD\/AG51LasaXoi66hvQ2MoeLDeEk5p3q0JogybEdRTUgordDzq+VsmtFLrlcYzVJqxEViKgEL4ulDlsVFqeFtTYG\/Wjb0ikh4nEYXtBiVdS8\/FWl6Djsf8AZntR3D6YIu\/6MGOkGmpUwlDkjccPubfiOruOYGsBjgqfI+oqrvoydotwC5Do0bA+4JqWNMY8Lt0WUydBuAB+1TW7G2NIYpXbwRvk\/wBNCTE2jQyxTJZfZljbKDLAjYk1s4vjRhNpiqexu2izHCOW65x+u351zSwyfRkLyJIWZJY2RvJhWDg49jIlAc+VL8EnBEAPShhRXPIFHPFc+RAStLtQxBO9YNfJRdcTqV9KatAxJMDJMQgxVxZLDbe2VVy2M0mOyF0Qdhg0JBYLHGysCSSPKtEmKy15cDFaXSEcTUxJHKsckr0NE5JzGvPHnmpSHYFJdAuVU5zW0IjJxLtlvzro40BCa3MgNCdBdkray0g53NEptgwKZMsFWuuOjFtlRgESksKutENnLF0LjkBmrjGhMfW+GIwBioydCSIXsQVSa4JNWamY4nP3RKiujEwo5Y3RO2a0lkXQcTS8Md9Oo4zXBlaKQbNK2nG9cyGwQxFpPEa0UhDDhVn9qvEhRCzMcACt8MObFR6rwLhsfDoES3iAIGpm6E+tetCCgqRqlQJ2gnfS32mRhp8QCnAPpV+ho807UcSZ1bu9SA7MR\/eok7ZaR5Vxqdmd+5DDzAFYy30arRnhdgSFnDL55NYJo0dlkV4rFhGqtnzov8DoHmbWcONK88aqXrYFbFYzqJZCOnU\/LpVLQmfNMJlyAfM5rKcdlR0UFcnbl5VKd9+hssVSMfrSY0XLj1zUv4GSGBvgUuugONErHbNKw7KXjIJJGKFIZQye2a0UrQmiIjUnYU7slk+72wAc8htR2DQuutQkCyIdAJzjr8q3hX9Sbd9FtikVwpARgQcYYcqmaaNYU0PrC0kS0WW2PiLYJHSoxptt\/BeSXGkb\/sxbSW1vqbaR\/wCbrtXQlRySdsPfu2ctNMMMPEg3GfSlYzVcFERt5BHlcAZLA4HqKa6JejU9mbES3nfyy95HENZXBGw96vHFXbInLVIDNnZ3EnEriLiS\/eyairxMNPpud6JKMr2Zu6ENzZShmNrcRSN0CSaGPyP96wlH4ZmicX2oqFuWkI6a9\/oayk5VTGX4BGKyvZLKpMgYzVDFd8SGPUVnOgAVnCgLjx6s59PKpaXGqEGo0koAztWD0DYRBEoxqFSpbAsllCDArRKxAGS7kiqEEMNKcsmkmCAijGQHcU\/wUwlAVBxUMkFu2YjbrVRHZXa2JY6iDnyrpg9FDG2tSZN+VXJjHC2aCIYFZWSCNCqtuKqIzPEhRrxXb0Yi29utmA5VqtoVCmK6cXAVScE9KmcuJfE1vDpvDud8VyZM1kpIvuiShBO1cjnb0MzPEoQZPOtoSYJkLZVjYYxVsr0aHh8wGkDfPOsJRcuhDc6WAyKPpP2FlEowQBzPLFL6YWeh9heCoIFuRJl2GM4Ow+depgxqMbNIr2am8uYLSDulLM4HTfUfOulFM837T8SjiiJcuWOSdJ5fX96ltFJHkPG+Ma52xO2kHcNtmsnI0SEd3d98gZlEijbw7\/U1LkmUlRnL5xnwDHpyrJrejRWCRzlW2Yk+R5Umr2MKE2lQTnX5g8qla6Kq+wcnJJDb9TTsn+SmOZoZQCQVPPenXJUAbkMuVOxrJqiyKthtyalUwvZehBO2aXQFobA3zSZR0EHOGz6Gp6AtChxuDnzNDXsQJcLpJyGO34etVGxMo0OSCgYA779Kq\/QUXRxlQNUm\/Ok6YE3tkmXxc6UZUJqypeFywnXAQ3mD1Fa877KTobdm1kX\/ABidAOdNClUhydo39pcwvGQ2Qhxgqd\/StuRg4tPRNEglkURRtITvjHOlfwGzdcHtlS1X7vuQdgNxVr8kNm84PDHb8AuZnUs5BAIJyPWto6VmUuzHWd5cf8NkaV3bU5GHAbA+dZObStiloXXTawdogdtygKn8sj9KynO0Qg6yYgFZIwDyOMjPuORrBzp7E2QuI4y+Ae6b+rdT7HpRcW\/gTBmiYHSy+meYoa4oSAru3IztXPOQ\/wCRU9uokBAwaVv2KxnZoiKPOspJjRbOV55xUxQWDGMyEitYxoTOxQiJh+dUxF0gAzjbas\/ZYtuWCbr9KpbAqW5ZtlG1HEh\/kthRnPjG1VFAhkigIANq0WjRF8TqnvVJgy43aKuC2KVCqwKS6Vn2INWkOhBK3h9K2Ut7MRXcwd4CRzraLvoRCx4eiHUeeetLJGyrGtu4gfB5VySgLs5e34xgGsVjt2OmKLiQyHAOc1044NjWipkZVyDWzhoLCuGXUizgEHas1jUWDVmjjmllKpGjM52VQMknyxW3FMk2HA+x147rNxWQ2yAg6FwXx652X8zVR8fds0jCts3J4jBaWC21voRV8AzuSfXzrpNaoz3GuJyW4ch0U8gV2PyFO6FR5\/xG\/Viwbxux5ybZqLLowvGpxMrIsKvg4BTZR\/eol1Ra0Y+5xE5BBx004rF6NBRcxHUWB\/Y1H8gBOxjbYnbyqtS0U7osgmBI54586loYQxLLsSfY1F+hgsib7VaYmtn1vMYWAbdD+VNpSEn8h\/hfBU59KwaaKRNWOcFT8qTq9jReN9t8+QGalqvZRcsZUDVpU9ATk0hfwTUYI+N2\/SlWgJtA7jI0K31qv5D8AslrJg65QM9M4o5UKj6O3TffVt060m2FB0cbEACPAxtmmlQfyGRQlY9UrAADOwq0qA+tFUHLgDJz51ToZo+ElQwMZjydsEVSJZq+C2MssyyP4VHLbGapJmcnSNfZIS4RASM4x51qvgzbNzff8p2fEJwjBScHYj2PUVtLSoyW2efQXLNZBZUEignmMH6jn71yzm6HLSKHiiYEwyaTzCy8x7MNj88Vhaa1\/wDf1MgmENo0MCrAZXHIj0qGn7AHkcMSGbw9D5Uo9isstmK+Enb6\/wCxVt12BVf4UZG37+1cuVe0OhBcFmc6frSTT7JLI5zGuDzpNCsp7\/W+kk0IQWjhWB1Zq7Gi4TAjKik3otI6\/jGayGIuJyFThSRW0FZIHbSvqGd62caQUPIWZogRWcexpF3eEKSa0oo6ZMLlTTSAX3M0j\/DvWqjXYFCSkDxbGm0DRNwmjehnP0ByMkbcxg1pBgBzXIj51vVggCfiWThTk1m4JmiiD95JLvqzmk4JILoutciTc5q4RSE3aG1vZT3FwkcULuzEAIoyST6VclS0JKz0LgPYKXQknFEFtyOk7sB645VjHA5bmaRj8m34facN4OGazt4I3xp7xvjPsTy+VdKjGP7S1FIncXYlQCdjvkgDcD3qv5H\/AAZ\/jfGIbNcoPFg4Zvi+gzik3Q0jE3t9czSNIkcecZLy56+XpSVjMte8SnmkZSneBNsQptUNtlJJGb4n9on8OoRoPwjwmolbLVITX0MaAEqM9d8VMqBWxXMwYkBSrDbzrNloX3CnO+Tj0xQigbBDYGfar7F0WhyBz3qXGxpk2BK7sBnzqdsZEoQDjJ9aL9CqjsLPC6gZYHbSN\/pSe+g6G8ajH3hycfAp3HuelZSiNO+i2M5ysQCDmQu31NQ\/aRX8hCRgEF9yeQXmanb2Oy5WXdSFwOYHIe5607p0In3bHdBz5sRimBNLaJjtGpP4iedVQFxgAA7tFUelHGw6IPIsWdi7eRp9IFsqklmlYB9h0A2oYJB9hbGVsHJNUkNuja8B4KjMsjjGkCtIxvbMZS+DY26BAqpv5VbZBtOznCHiVLq5GAd1FbQi1tmUpekH9ppddhMx28J5Cqn0TE874FiTh7MqqV1nIU+Ft+Y8j6VyS0VLom8PXPh5g+dc8lRkfFmiQ6T6jyzSTAAmLCVtOcHcfP8A3+VX7EE2kjYww5cqO0FnbrxqVPnkelc818jADaDfPyrJOiWimWzO+c4o5CYO8JHIAnNCZNE4UdV8Q5mnZSQbawZGWNLkX0XyqvdnHOhfArEd1bmYkYrSLoRdw3hul9R396pyBbHC2gVdhU2WUSW+52zVqQwGeNgCApFWmI5BbkjlWnMXRyW0xzFLkgF9yy5wa0dN2c7FF6cnCnatIRb2NfkVzRzSEjOR5Vsky00VR8Pcvvmqr2DkO7LhU0y4giMh5bdKmhdm57L\/AML5LwrccbuvskBziJPjPzIwKtQ+S1B+z0rhnD+F8EiEPC7WGPG3eMcsfXPOr\/g1UUgfiHE1jG2RKOshAC+n77UrGJ7rin4GlXUN9bJ8PrvQMR8b4y0ulVnZtuibGhsEhHe8QPegLpVwMtlP2oYIUXdy0spM0jPEPwBcA\/QfpS97K9CPiM0j5RUUIPwg4AqW7GkJpY20HBEW2edZvSLTEt5GjH7sFj\/M+wrNu+h7XYnuUAcaGyeuBSe+iugV8bAk7dM5qbGVEDoCPUU7+Q6IFSp3OKpb0BLYD98UNgEwxMcE+AEdf1qKCyxmWHAt+oOXbmf7Cl\/AHYYG3csVGfbNS9lBUF0WOlRsNtR5UnEAxAGGEJC8iw5sfIVm18AXqoXAxjyXy9TS6HYVCd9jlR+dOwGEQTGGAx1qkxUFpBFKo3xmqsNk14QpK93pOTvR2K6JtwVu8BxlfTekkPkPOEcKSNg7DGfOrj+SZSNPaoBhE2HI1d30Q0bPsvwxJJkYpqwetb4oGU2bSbKkL0A2xyrZmSEHaVscMmPXSazn0VE847LPiwnRhhC5OK5MnWxy6HQKumkHxc1PnWPemZFBjJ2POosCBtxpUnGdxTu0iHssit9x+lWlaFZKeNAOQqJQoOQBOVXlg1g0VZWzhlwSDWbv0FFEioNxS7A5GwYgNnFNIYbGY9OnYmkxPZ9KiketJSCgbuAzagTn9K1T9AFRJp5bU07GWGXAwOY61cYWMGedc4Jq+NDKtm5kUxMIi0qpzyqX2IDu5QGGMUIpGFe98G78uVdaj8GNFH2gMcnlXVFUqChjZhNJJwSa0SJ6HHAeAXnGb1Y7aCTQ22sLt8s06HGPI9b7M9muF9moGd9d1xAbMx6ew5D3oVI2jCgi84i95IykqqgYwG2AoNBDd8T0gxwxtIEGzEHT8sUrsdCSTiAWAvO8ClDyRST7UrGLLu\/e6bw28rIN9T7D6UXYCfiU4kcy3lzsnwo2QKTrtsavpGevL+OJS7PueShtTH2HIUrrsdWIJuLXcjd3aRtFGTgszfXNZcpM0UUtspa5mRiryfJdv1ovdCoruZ2WMKrkZ8yTmpmykLSxbLO2SfTYVG12OrYHM6hMKoGeW9FgkByZOwAHr51Mex9FeVY9fem\/wM+KZJxgdM0RYUSTKkCJQXPJ2GT7+lXyS0iaPmZj4UZmJO5PNjU2NIvgiCkO27Hy3+lQ2CJu+onvNwDjSDkfOl+GN\/JZCjytjYAZJx0FTIYXqFuQIsa8bDotLVh2RjmkXIcZ9RUv0h0MbeaMKpY4weRHWk2Og+NwVHiHnvTQ+w23U76WoQDqyTkS2McxVIljS3UKuM5IqhdjCHU+NsCjbJdIc8Mh1SDbO9awiRJnp3B4DDw5WCpgDOccvpXbFUjlfYWG1DJBGfWkAj7Uf+2TDzBrOfRUTzzgTAcNYr5muXL+0cv2hKTKDpJ26Vio2ZBEbmRdXUHDf3oatWDIPOFwPU1KRLPlvADzya3USGiu8uD3edQ9qiQjP3l041YbasWrLRRa3bsSBnFZSihhaz+DLHNKMaY2Ui4Pekcx0q2hFsd1obdvaokgCheIQMtWajQyyKcNyNaJAGoNeCT9KdAclTKnetYsBVcxvr25A1sqopE7dsNhxUyExkgBXIFYt30IXXkZ18sinEZ5dOCo2r1OAuwUSvGc5yKcVWgo3HYjs9xPtNKGtYZBaKRrlwNPtnzrVJsnjZ75wbhdr2c4WsdkjNIww8jnLMffoKvo0jHQHxHiD2skoZoEBGTud\/QedDdFJGYv+KsUCvJPobOkYC5z5VF+ihFd3zupVZkKDfSHJI9zyFK2MXXV9P8AZcwx26nO7Dxftik7rQ0tim4up2jDTSPI43A5D2wKQ9XsWXFw8hx92HXc48X1NJMekKLoqFLR6nb+dsb+gpfwMTzSkbKmk533x9ai\/gpFCtpRyrBmb8TdBU9Jh2L7iXWSUJY8snrWT30a9EFZ1UmRiBj4SdhQtE1ZWZUKnbUB1PKmmhUweTSSCMmlZWikjJ8hQmB8MkDA39edNu+wLipA0LkseZNT0OiccOlCxbCjm3mfIU+XsmvgreUjZc49ev8ApR2FHyeLQiruTtgdaUqSKT9DJNNtFoB1EbsfM1HYIHV8yHJOc5pP8jDLRRJINXLmc0m\/QwhF1y7bIDgCpfY0MoYVYZbcHlVUAbb2pXlyPyp1XQX8jyygIxqJOepNOibHMKaQoA3piGlqmRvzqlvshmh4NFqmQAZ3reC2ZSZ6Tcqltw6AqWDEAEV1PowRGPdBtipAQdr208Ll\/wAp\/Ss8nRUTzngPh4Tz5sawmvtHJ6OtnVtWcdGQztm55GxG9TasRRcKRz6VNUxAathsjlWsQZGRS586znEzsC4hB4ccqzLQNaw6WAycedZN29lBEkbKvUihNADKTrJUZPSrTok5IjaRkUqTArYMBjG\/vTSQwvhZYMASdPTNJ0ilsfoxCbc6gKK5JGPM71omIHlfzFaroaOR4WTce4NJoGMonQjntWLED3JXPnREDyu9XoBua9liizVdguwE3aC5EnEYprexQandvCG8gOtOML7K\/g94tUtODcKitLCPTbJ4QB+I\/KtHpFJCrjnHJAoEJAB8JYqfD67UpMaRmuI8VMEaiGNJpjsHcAE\/uKlv4KoQ8TnuQVMiRKW+LS5yPQdaHoBRdzufuoBCzHrnOk+tS+6RSS9i+SxnP\/qb5CP5IRn6nOBU18sd30Q7u3jQYjKr0csST606AWXd7bRRuBht+eQT9Klz0VxdiWW5M58CESEYBfc\/6VPK0VXyLrhGiXxyZ+dZsfYtuJGk+AAR+tS7e0UtaByGXxO3Llipb+RkTqcjSAPU70v5CjjL4dyo+dP2mgRWcdOZ50r+AI6d8ty6Ci36GdjBJLDHPAou+hUXJpXwgeHGT5mkOkSYtIwPIDZfSk5WOvRFotXMn50m17AnbxlFaYjGDge\/pT7FW6onIwGFz68t6KroZ1ANJON+YHrU6uh2GWx0xEnGWGPcVIBlts5x5UL8AxrbqNAxgHPyq0AwiXSQwJ22xQ9bD8Di0OkD86diHVthwABmqJGdvGSNquKIkzU9moc3CDHXlXRjRjNmr4vIW4hGgYroAGnO1XLshdBsX+GKCTM9uGxwmY\/0n9KzyPRcTzvs6S3BdTDfNZT3EUugrTXPejILikCKM9KQAV1Pk7Hl4TWiiAIJMsN8Votdgw2BM4zstYy2ZsqvkwueYrJoaKLVNTbgYrnkygua2DKBtijQgZrQxjYZosD42+caqObodHzWqEHGKfMRO3hRCNtxQgQwBUIAAc43qlTKBZuRNXQAesscetWrRVl+NWSTv5mqcrJBXu+4JUmk430CRH7aGPPNJQYxX2S7N3fE7lHezLREg6pThcZ58v3FetGPtkRdntpxHbR2dvEY4FGp2yefuev6Vb3\/AAapUC3HEILSBu9AeQ7RxknA9ccz7nnSvQ6Mnd8duLebCffT89vhVfQdaV0Nox3E+K3V5faGk7oj+nWc+WKi23RdJKwe5muApUTA52LSgajQ7BL2ykS2qwkTktIOeDjfzIFHoE3ZS725iB7kMR+MA7D9Kkr2AXGm4AZggj8y2r5VPfZV\/AqmigG+lpGzyAwtQWVTPMqHGiMHYKq7Ae9JyYkhbJAzAv8ACg3zn+9ZtKrKsWSsdegHLZ96E7HRTIp574PM5qLa7GU6gmCxJB2GarsXWzoBBznfpQ1QH256\/OlY6OKgZtiSDtSukFFjgL4V6bVNhSJlMDBIHmc0+kOiaqGcYzgdKXYFyqSSW9gKi1Yyy7jzoiAyF5486r4sSBCuJMtnOadhRbFz67chSqmOw5gNBxjAwNvSk9ISLIAQ4I2zz9AaSK\/kZQuc4U7cv2pp0L0NraYMuCMYG\/pV2IdW66kGDyFOtC9jWxJVwpGG54oQPaHltv4sEZrZbMWa\/sudMq6up51vjMpDzioH\/FRhgwIB2py7JXQwT\/DFUSZXtzvwuVf6T+lY5Oi4mL4VGI+AIwO2d6lr7QfRT3mX57VzOOjItY5jJBoihCu5YrK\/ln966EgRGNSd+lJhYzgcBQMjFc7ZnIpv5gBzGKiT+AQJazAPudjWEo2UOY5FZNt6xpjOFlB3FUkwRVLJ4eVNxaGCNcrnHI9aaQmz6O4B9apdiLGuVVeuKtRofYHLeliR58qtIZCGQ6\/SqaAOZToyOVSmIQcSEhfw8q6cdVsuJVAkpG2eVVJRK6Pc+F2MXDrWK3tIUVwMFiAGPv5e2a7\/AOBJJFHGeJJYWza2SJs+Jc5z6f6YobpAkYjiXFXuAzW9oTncsfCx9d+XzzUlGbuhKsOtiI3O+X5D59aT0MX99Aj4W8bvXB+Bjy\/IUv4GLbqOKNSzszNz6KB71LSKTE13cc+6ZcHfOr+1ZyZomAvLNI3iaVl6AucUtsKR9FDMVBZwoHUg4\/Palsdou+06MqZlydj4xmp5DUSE00khwDHgcv8AZqXJvoql7F1y8m+cHHrms2\/ka\/ACUfGQq6+eeVNpiKXGkfETU\/kpg7qNWWB+dNCPhsBnwg9Opp6A6GyQNs+QFTVhZdFu3i2wDsKl9j\/J0DQfXpTTsCaqCckk1LGiwKckYwDST0DDLQZYMR4U3FNfgC0x6vT160xUDSwBV5H1pVQWQihKuM7Y3OfPyo\/A\/RdqCqqrkk7nHSlYL8hcSkliD1xin2ATGCFA6Bt96KGMrVxkqBnPTzqhD7hsgLEZ9KZMkPrcagjHZga0qyXoeWWygHY\/rWsTNmn4CdM6bdfpWsTKQ84ggXjGV6gZ96cl9xK6GS7IKZJku3JI4bMR0Q\/pWOQ0iYjhUrf+XWLbZND6E+gaJgMc96zaMgwMBHk8qiIMXzSRgSZXJY7HyraNE0UwyjGM0NARe8CNiuSaFQPPcl8\/pUICiW9xIMLpXyq5pSChnaXo0\/EBWDiOi9bzW2Cc0+NAi93Dpgc6bGCSW4HXej+SWVhGXcbVPsGzsjZGPrW0RogYC2NJxTYy61g335+VQ2MbrFmPHSo6EwQ2IeTltV86QJBMfDlQfCKh5GUbjivGIrK3T7TJDC8mcDckD+kcyfWvcbrspIx3FOLwSeKytJnYfFNcHQF+ZH6Cpv4X+ZSVdmZ4nxmYRYFwskr\/AP0jnG\/5UndDpCWeD7vvbqTumYZYa9yKTikgsSzcQjs1ZbYSkNzIYEn6cqlypFVYtuTeXOhiNEf4dRJz8qiSbNFSB2trtWDykrttpODip62PRwTYzqjYsfCDqzj19KLFRHKsPG7LjpUPZV\/CPmeNQAoG45EVEnSopfkHlLAY1BTnOKztpDonHGGTfGnmf6jTVAUXDhixXJ26Cjl2x1oGAG55n2qWMGc4bffy25UxEBu2+T5gVWqF+C5MYz8IqRlqDBOFyfWkDJrGS2Tgmk9aGXaSB0FLYEol1AnmKSt7BhcQ+6ONs88VURFunHxfCOlMZ1o1ZR0PnT7QuilYyD6kHHpSSAjHFq8Q6mppjDVj8OB8R8\/Kq36AMt4yFPUDYU1pC7DreA4LLsR1oHYbbEhtvekNmkspNQUbnI6VomZDy1JGnV8PPUK1jfRmzT9n5i0+Djngj9xW0HbM5I0V9\/7x12UfpVS\/cQuhlnwCqJMf2\/OOEXB\/oNY5Oi4mHsXB7NQ\/1Gk+hPopC4QH86kzPu+KoRnanGIMU3c+SSK0URAkU7d5tmhxHRJgzN1rjy6ZNk9IBGT71iybB5cMSBTQ0dgBB3zirbTGwy0J7zxbCoe0IdQqSD\/eoHdEZEYnfO1JsVlMoZjgcqEiSyOIY8XPpVWWmSICDeixgpulSXyqlGykg0X2wOqjjYui6C9y29JqhB\/2xQByrNwYz7iXECZZJVto2kfIM0rkHHv\/ALFe5s0VCKd47p3e68W2cJsPTmaXfYwG4\/4NaBXmtoJJseFM5b3\/ANik6Q9sUcRv7a6TUIo7dQdlYFsepqXT2UtCe4SF1JtFLkZ1SsukD2FL+AuhfNPJERiR223PwgVLZSSBpL1c7hjvsW5fTrUOXwVFWVTSkjOpSOYGdvpUsoFklkc+E\/Raybb2UkdV2TxSOGPTpU2vY6JLcZOERAQNy1JsaOTTM641Zz\/KNqnl8jopdNI+E6j1osdFTEoAvU8hRaFRUYgNJkI1enl5VVhRW\/hxy38+tNCaJoceKQ+29Kx0FRR6upHlUtBZ0HS+hBluvpQgCFQkgEnJ8zQCJMBpAA8P60XrQi+D\/CBxzfOB1poGEW\/jJ6k7ZqltgXmNdJwRgbknpV6YugYou50+2aj2BfFCMZPIYycbmnxvYBLRZ3xjqRTaGE2kRB3G3SpSCxjEhUYG\/wAqKoAy3hXSxxzORtRQnYZZs0U4TGxGxoWgZpYWwijOCdq3T0ZGm7OKFmB+R9a2gZSNPcnPFBlQMKB71Uv3ELoYD4aYjHdv\/wD2i4z1QissnRUTCyr9k4LZxNjcZpLaFPSBe+wmKKMgOafYgVpFDFsjlmI86sBjw+yBGSKwyToTYfJbquDgA+1cU5WyGCzLp5Lms09k2CGIEksNya1uxoJigBXYVm2UXxQKo32NCdiYdCB51EhFjqSPSkpADHbNaLYgaSYxnd6pKyokYZHnJwcim4mlI+ltSQTtmtIgUEPGMHetaAlA7F9iOdTKKBh41lRvWVUItu76GJ83gWd15gZwp8gOtem2bC+a6NzJrbubePG0MaZkpW+xmeult2d\/uQXJ5leXlnGM+1KigIRwQAu4cjmScL9BgUugBbu+gOUtxoUHJAGTn59alyHVANzcgAFlYnmFfB+dS37KSFrzYfXKgXPINz96z12OmVzTQlgFQMfMVLaspJnCcAksFz+HrWcrRaI6ojlVDY65qbKJK8QO+nI\/D5\/Ok7D2RkuE6IAQeYzS\/Iz6LSTqckk9cUm60B82lXJUb+tGgopK5xvsKd2BXKmny500Lo5GpLZOcdBTYBisVTI3Y7AVLdAWQRaFGR4jufWjQglQAowMk00BUwKDxHep6DsshdjHt8ZOBnpVIA1VWCHAOT1pqohZeGAhbI35\/OqT0Ik0Q23ycZJqgCI49thk5G1NAXxxkvkjwDn60AFwpuCRjbYe9SAwhjGBuCR1oCxjbxDmBQkI4YtMpJ50qHY2spC2lThhmrUvRDXs2nZ4feqOpNdMDnkP3lDcUYMwDfCozzxzxTbXKhLoaD4c1RBke3ahuGPk7YrLJ0XFmG4uFSO1D7ppxmnjonL0Jrpgpwm486tr4ISBWZj0BzTQyEKFnAC9aUpUQaG0CIg6VyTdiBOIXscbYJz7Vg02yewZbpHA3qKoKLWRZDleXrTv4DoMjRRHtjNZjBbmTu98jFUrEyqO93xTcbEWm9ao4DBLm6IG5wPStYJhQsku3mfSDtXQo12WlQ\/4aiCFShYsRvnpWU3RTDHAVTWansBXcsckiuqLGga1nImII61UkJocwy6huN6jiIDSFjreVZVA6zSgn0IC8q7Ujd7BHtJXifXcd3E\/RAAxHl6D8zS3QaFcosEBVO8KqTqfWWY\/LkKFRW7AZu6fLLAhUDIOTkDzNT+RgGqEkmMqMfyruaVIdg8oaQ4LFc9OWPnUNDsFngSAEIEPm5Xf86h60irBwzgkjOnHMVP5GVmcfh0\/Pas2y6Po5UfYohcdSahpdDOyW+d9SDrsM\/Spoop8BbBJ+VKwouTSdhjbnmlQEXG53HsKa0x9kWAzsNPTnyoq+hFUyg4PPAyapOgZGMeMADb9ab+SQhR4uQzjr0pdof5CIuR22HruadUIJ04UkgDoOtOrGBTnLEDZcY386m\/gC63kCKzc9tvShaEycLl33yRzNNDGagYXB2B29TWvokLjjwFJ3PWmgLtOCBgn0FDAZ8M4fJfzCGDTt4mZjsPWuLzvNxeFieTJ\/RfJePG5ukaWDswsckEou9YRwXUxYJOehyfzr5jL\/ab6kJQWOm+nZ1R8fi07Lbns3PEss9ky3MROVjUESKM7bfi59Dn0r0\/A\/X\/HzpQyPjL8\/P8A7MZ4JR6KLSPYAjkN9utfQx6OZljw6l1DbJpNaFewrh8OCoG7Z6daVqKcpOl8jdvSNfwpntyGUDWRtn8O3OvnPM\/tTCDcPEXJ\/L6\/p8m8fDvc\/wDI5byL\/wCYoriaRiUzhm8iCDn0\/wBK8rw\/1PJHy8efyJt\/Lf5N54rxuEUbdMMlfoyPEZjO3hP\/AA2VBjNZz+CkYvjkEr8OtWHQVUF7FNiB0Ye9XRK32QQMTUsJDC0gz0rCcjPsMliZUOPKsExGV4kszXGQuR607URrZ9awMMFs+1ZOQMdWowviGaylJE0WTXCxJUoYmv7hXVNEgLN0HSt1HSlYEIBpAJ50mAWrE7VJILc28jxlgDitIyoaYFaW7CbDEgk1ry0WaezUog07VlIYZHGZiN9qxfYXRO6showorSMqCxNJYtFJkiu2ErGpBCPgb03EEhD9sIKy3crzXHMRBcgn1zzrZP5N6K7l57te8vNSDYrEAB9cUmm1sapAt7mRVydWThEQjA+Q50nsIgk9uwx3zhRz0nI+q0mMqkZwhEYVNI3J2ofQ0ASBxltwOmWxmoZSYOwc+KWQAfyxksT86h2UvwVyBSw8L456WH7Vm38FJHPCwOQQPMryqSitYU1nYMPXbFQMI7tFXUBnpy2qeuh0RDo\/hGAf6RihKw6K+57xjvgA450mrBHyxDWMnOD+dL2MnoGsgADHM0xFPdAMRg88mnXoD4IEm8yKpIRJvxH0xmlSTAJt1wrHAJqkhBEf+HgeVNL4CwKddLbDIXelVBZxScqoB2GCPU1PWgNFw7s1xK94fHc8NhW8if4hC47xT1BU4PzGa45fqfj45vFkfFr5NHilSkgy14BxJC32i0lt2XcrMNBIHPAPP35etLL+reNBL7rv4HHFJsYwcDvJwjRojRnxBjIozWX\/AO74kV97af8AAS8eSeiq64Xc2mhbqIoSfi5hvQEbV2+L52Dyv8GV\/wD3wZyg49jbsgJpL9obaJ5JJAdKqOgPP0Hqdq8\/9c8KflYY8FbT\/wBzbx8kYNqXs1xbEsEEdzC7EkymM5UYBwurGD5kjPLnXxuTxY4nx5Jtr16OxPluhxZ2d33Bk7hzEpO6kNtnnsc4rmn+n+RKH1IRtfgX1Ip02UcZtlvLZ7kD\/m0XJcDeVRzDeZA3B57EHO2Pf\/s\/+tTWReL5Du9J\/n4f\/g58+BVziJooC6Kq78sV9p5HkY\/GxPLmdRX\/AN\/\/AIcEYucqiaHhHC+4geWR4yrgBCrjUjDnlfI+4O3Wvj\/NeT9SxOc7jF9K\/wDVr3f86O+NY2ku\/Zd3gRsYKsMggdD\/AL3r5VRcJ8GdPYoguQ94xO+pjXZlp4y3GjccCuzcWIU\/FH4TnqOn+\/Svv\/7N+a\/L8JKT+6Gn\/wCP9DxPNx8Mlr2ZXt9dhIZEzuRivblXJI510U8Ak4ZxjgsUU76HTZhnBq4a0yZKwmXshw24UdxdaSBsM1dWT0Ze77OXVvIdEbOobAIHOoknQmyUFjPEoLROAPSueUX8ElkoJGGWs+LJFFxbozEld6xlYrImFU307Cs6sVlclzGPDyNHErsV38yupANaQgOtiwRKbvwSak55rWcElQ71scRxpoAPM+dc7WyaJoV7wKOdJokaCAd0CoFJIZR\/w0skk6L4YyAcetbQ3f4KWiyNNIAqnG9lBtrzHvWM4iGekaMk9KlKhWLLvBzvXXiY0K5B4utdBRk7m4jMmYtUp6yyLqJ+XlVWvR01rYOsyuxHdO7DkXGB9Keg2iYkdWIhjZWYYJUkE+Z9KX4QfyDyIwADzbdFzv8A3o\/gPYJJKxyowB0KkAj\/AH71DZRTr0LjKZPJnOTSt9DIMsOol31OB5VDKWyh3bfu1yDgcudZttlKiEkcoI1bnG+OQ9KTTRSIRpkgFBgeeazat7GEMyY0uwY52wOVJuxqyLW4DaiCOu3OihrZaqnRsD4fpR6FZADKAj4ydvekkP8AJJVGdgMDO9NJehHGTTjOd9yc0aD0DuPEEG5J3AHIVS2LoIZVCKFBwMZ2506EEcNtxPJo7xUdidJZSQT8uXvg1lmyrDHnLo0xY\/qOl2Ol7P3yrqAgZT4hpmBz7Vx\/\/r+MpU2U8MjOcRjkgublJkdXjIBUjcGu6GSOVcoO0YtNaZPh9rNfTxQWyF55m0KPU8z8t\/oaWbNDDB5JdIErdHqnZrhbcFhNvHcNIwYuWZcLvjIA6jI618L+o+avKyfU416PQxx4xo1MRhvYwtyupc52OCp9D0ry4ZXjmm+vYNP0URcDAiYcLmaUqxzBLgSL6A8mr1H468lc8Lv8E\/Up\/cLrnElvNbXCkDGCrDdWHLbzBrn8d5PFzxnFfcn\/APIqSUon3COGNY2EkTsUuJADcINtPkh88cz6n0r0\/wBd\/UnPL9CD+1d\/z\/6M8GOlbDY4CiqYtjvg\/X+1fPOdvZ1BVs8tuFWN2UgblTiiOacHcHQmk+x3Y30XEBouWSG8HwynZX9G\/vXc3i85VlfHJ6l8\/wA\/89mNSxbW18A8trHZzSjBjdOcZGcH09Dt+1T5\/m+Z5GSHjeX3HX8\/l\/P8rVFY4QScsfsHgkeFZHJOnIPPlXoTm4RbI42QuZjI2C6owGBjLH6Dy9ccq87JBTkpzaX+rNYvihbNCq29wqvKrpHrBXwud\/Tl1\/v0qvqpNKH+ppbfZrODXEkF3pQD78BfTfdf1\/Ou\/wDs55UvD8\/6Eup6\/r2mcXl41kxcvaLOIdjrzi12JZXCrn4SK\/RJYnJ3Z5Kmki+3\/hvCi574Iee1P6X5Cw1ewxVQFugMcsZp8H8iLl7K30enu76MhTyYE1S5r2JxTOP2f4rqwZLV08txn8qblNi4IHl7KzvICbWErjcCQZpd9ol4\/gEfsTqdme0cZ5aZAcfnUvHB9oX0wS77EgqVS2ucnbUOlL6UPgX0hJe\/w5uSpaJ5dY5Bo9qf04+mH0zN8Q\/h\/wAYiBYQd5nyBFHBAotDfgnAoIOHrFxThZWdFPiBB1euaHBNbRSElz2fvAxaK3bQTsM8hXM8RHCT6B7fgd2s4ZoZAetS8XpIX05D+K1miTHcMysORG4qeHH+ouEvZV3ckUbxmCQI5GoYODjlWkIpLaBJi+7QI7DRoAqnH4K\/kqt5W1YBqXiAMLXOF0gNq2xmoeB9oAd4bxmP3Jx71tjxSXY7RGOzmJOY2rbiwtHnUErySNjuiRuXYnb2wdqI7Ot6LHu9CaAxwTzQ7f6\/M0NhHZAyNpCoZEH0\/Xal6GwaWVFU90yNg+IBgcn1NTLXQ0CmVpCVYLg8lxn86QFc0cgUawUHPCjNJoaZUsTFQNGhfMnc\/KocUUmERukORrBI6ADak2PRF3z4u8IH9Oahp9jIKzA\/ET6YqdsqiakjkpY0mqAuVRjx+Hz3wKX8jI6NSFRqI8uVTVjIBMEqB4j+QopgXIviA8jyprb0DRwx+F\/MnIOKaXsTB+6bmu45Ek700DPiPvFXkDvjNNMTQVas8E0cqsAwbUB54pZMayxcJdMcZuL5I9J4LdQXUIORqI2B8jvXwPnYJ4Mji\/R6cvuSmumR7R8Dt+KwBCe7uUGElAzgeR8x+lV+n\/qOTxJWtxfaOeeNS7FfY3gU\/BONyXV+FKxxlYmU5DFtifkAdvWvQ\/U\/1SHlYFjw9t7sjHiads29wI5Cs8B8B2K+Rr5labizoSOJKIZAcnf8qTXJUMJaQm4SaF+7lHM4yDTxZZYXaJq9MPvJ1nlguokVeIICvfYzp8iM7EjfB5j6V6eT9VSUcmNff8\/H\/wB\/oRHF6fQHDbLCrSPIBhfEzHYjzJrx5ZJZJUttnR0ROFgKZJKylR7ZB\/8Ayp17\/BYUAmWwMdDWGyCi4jAGpdquEmBWvEHlg7qclpIsCNvNc\/CfbmPmK9GWRThFT7j0\/wAfH\/AuNbQwTVOBGoKgjd\/2FGfy+S4RIUaC4IYoEB0AN1yMFTXA8lbH2IL64X7fcaB4VjEY+uf3rqxxf07ejZR1Y2snJtYH1YYLseuQdjWflTljyY8ke0l\/ozGNO0zb2\/aLHdKxXvZVLqmd2AxqIHkCa\/WvE8yPk4YZY\/8Acr\/5\/wBTwsmJwk18Bq9oAPjiPyrp5ozLk7QWxxqVxRyQFy8bsj\/1CPlTtAWLxayb\/rqPcUWgstHELQ8p0phZYt1bt8M0Z\/8AkKKCyxZEbk6n2NAWSyDyoGfUAVyQxS\/4kSP\/AJlBpVYFLcPs2+K1gP8A\/GKXFfAFB4Jw4gg2cODzwMUcUBD\/AIBw3IItsY8nb+9L6cfgLIS9nrGT8Mi\/5W\/vRwQFf\/ljhxhaJkdg3MsQT+lVFcVSE0m7ZQeyXDwgRVXA5ZRTQ1aoEkil+yFtlWTuSV5Zi\/1pcWgpA8\/ZDUrd39l1EYBKkYpty9UJQSKF7ISZPeRWzDppcj9qlcvdD4o\/KE08vcd0jsqdFRcfn\/s1EpHRQNGHTxAxq3LVzP1pX8CO6myDOruOQeR9vkOZpN+2Vr0wqOR0XBRQoHQAfOhsSKHuC76UyT1Y9KLsf5OuMIS6ljUsZSoVtznB\/DneopdjRZp6Rpy2B5CkOyx0CY1FM03SGMeC2cPETNCWENxjMTMfAx\/lb+XPQ\/WvO8vy348o\/DNYY+cWyi5s57O4MV1E8Ei81dSK3xZ8eZXBktNdkbe2lvbpLa0jlnnkOESNSzMfb\/eK0e9BdD9OBx8NuRFxWXvWdD3sdo4JiONvGQQWHUDbpk15Xlef9PIox3XZtjxuUbD7DhXZh00snG0mIP3ryxMuT106B+tYS\/VVFdP\/AE\/4BYJL2L7jspdLKzW9xbPbahiV30Hf+nmT6DNa4f1bFki3LTQnjadDSz4NZxRIWCzlidfer4ZB\/lz4eXTf1rg8n9Qy\/VfF18HRjx1GmM5uzHBbmxWCASWcr5YS6jKFOeoO+Pnyrnx\/qzWVZJ9\/6EOH2uPoSR9iDZvJJxORZJF3EcR8LDodXMg+mK6vL\/W5qXDHGvyyIY0+xX2isYY4bG5t8rHJG0br\/K6nfHuCCPSvT\/TPJ+qnGT2ic8eLI8IvHgQKrfAcr7Vz\/q\/iKVZF10\/+Tq8LIpJ45Gu4ZxGO6PPfrk718rnwPGaThRO5vAL5FyNPI1MMT4NgloPW5CR5HP4WHpWDg26CjomWdQ6kMDScXF0waoh37ROFY+xp8FJWgqx5w5jLArAE5NceVcXQyfEQptHi+PXs22xGeXzrs8bHjivqdtdC3YRfcLkFuZ7Tx6sO8RGTkDcr58htSyuKlQ4TvTFttc96JDyAY43ztXNPHxpFSXwTeXIxUqJJRBEXn1dK0lKlQ29UPbfSI8YAI3rmkyaKOJXghtXkJ3Udegp4oOcki4xsQWVtd3KEpBJI7nWwVSzAeZ8q9mWKVUukXKcUqs0NmNEUccisGXKsp2I361z+VLFcHLaXo5op7GlkypcxyEDVoK4BxlTvj25V2Yf1LN4zjkx6a9eq+CZ41KLixlIZCCYHJ\/pbc\/I9a+h8D+1OPNNYs64v59f+jgy+HxVx2Cm7lx+E\/KvqfqM46Pvtj9UQ\/Kn9RhxPvtvnCh9qPqfgXE79siPxQY9jT5r4Cn8nftUH8ko9mo5x+BUz4XUHR51+dPnEKZNbxB8N5MvuKrlH5Fx\/BcnEJQPBxJh\/mzT5L5Dj+C5OK3g+HiCH3NHL8oVFicY4iPhuIX+Yqt\/gC1eN8TXmkTD3FG\/gCwdob9fitVPtRv4GTHaW4Hx2Z+VH9BbLB2oUf4lrIPai0PZIdqrX8UUootBbLF7UWB5mQf8AxotBb+C1O0fDWP8AjEe4o0F\/gvXjnDmH\/qF+YNMLPxDLcuzAyyAbbLz+Vc232zoqilZVDZyrv9cD9qWkFt7OtMrN4HIP82DtU37TAr7ovu7ny55NFP2OwgEJpTSNXm3T6U38AWSSIo1Mwc49aTYJHI5O8OMAA8+mKl7K6LGchcak046bn8qTfyxlYZpMNkIo3Az+dL8sY+7NsO+nwhIKjduvnXg\/ra1B\/wAnV470z0O2EHFOEx2\/EI1lTTpBPxL0yp6GvmVmyYMnLG6aLlFexPZ8Jm4Gt3DYLJcXs4ILxAllh6LtyLcz8hXveR+qOWKMV9rktmcMSbtlFhwa9vNxCwmU63SbwE55YzzORXlZM+OK3I6m6GC8Ne1GJ43RhudakZ9q4nmU\/wBrJ2OuE8KEuJroHuhkKPLNYz8iteh1QHxGyF0RHbqFvIho0rsJgOXs35H359uPOsiimtmsXw\/gptHLQrqyCux89q5cqqTFNU9DiOVbqE2lw2IyuFc792fP29KrDm19PI9evx\/6MWqfKJjr+xPdXfD7rwujZ8wGB2Ptj8jXpYc0vGzRn\/maSiskbRkAHjlKtsynB9K+yXHPD5TR5ycscrXaCbS9a2mLAkZHKvnfL8ThLg\/6HtQnHPBSQdaXhuZQ5O5OK4cmLgqIarRoHuB3Tgnpj\/WuBQ2CXRDglzI4u42A7tRs3Majt+m\/yrTPhVKQZKVM2lrwOz4lw63ngllVowBJCCpG2xAI3Hn1rz83kxw25Lb6+GZRbsNzFbwiJAI1XYKK8+3kdsYpuJWklGDgFhyr0ofbjo24pI1thJ90NTchzrjc+V8jlaM32pjFrfLcRYCXAOrp4xzPzH71phfNOL7RtB2qFyTAgeLntmqcGhsYwtoxjl1rCWyAhrlUUE\/9qz4NlJGev7trq6SAYMZbU3y3H7V6GLH9OLn7NapWPOA31wk6W805a1kkAZZN8D06ijNnlOHCTtHNKKTtGnexhnQlW7t8YBIzj3Arzk1dsOTQkLTW\/EhFOArq3uCMcx5iu2clxtGqpxtD62nDAefWuFO3TMpInNbGeVTCMknxeQ9a+x\/Rv16OLBLD5D3Fa\/K+DhzePb5R9hkXDoIsMxLnzYDH0rk8z+0HkZlxj9kfx2OGCMd9nOIRQtBIBHCpCkhlUBht0x+9c0P13ycNrHO9e9miwRk1aFV1FFE6CGRpEKA5Yb565r7n9P8AKjnxpJ26TOHNDi7qgfFd5kcxTDo5RYiJFAESBQBEigZzJ6E\/WgDneSD8b\/Wi2I++03CjAmk+tPk\/kKR3\/iF0vKd\/nT5y+RcUff8AE7sH\/EB91Bp\/Ul8i4o+\/4xcgeJYW90qvqyDgiJ4wT8dpbt8qPqv4QcDh4tAfi4fH8mIo+ovgXF\/J+Y3jbfrj1zn+9ZOzoOJGBH96oJPqd\/lSdAiYl0gLHG2r12AotdjqiyWZQwAxqB8+VEhLrZZ3i6cySZJ+Zov0xk\/jYKwbGN8tjahgvwXm0YwCZIWa3BwZFGpFPkccj71l9THz43s04yrlWiQzowqKiHqeZrTfbJOxjA2yxY8z0qdjHvZe3aW9ljMiJqQEk8lAzk14n60vtg3rZvg9m14TLZRYtnvJ+8UkArbeE7+r5\/KvnJ4sLuUm\/wDJUdEoyY5tFaJS8cyTAsXYpnO\/mDvXD5OP6knNO\/8Af\/Ipa0XWv3127A7lAyk8snmP0NU8Kfj1LTXv8fkeyy5u1hj0zRtIrfgGN\/mdvnvXHi8ZKaeS0vwN36IrfwTAa45rfCMqqrhuoPIjBxj0r144\/EyYvpxTW+\/f\/v8AgzqSdme4lK1vxANqDg4ZXXkynkRXO\/H4Lgzrx\/dEJu3SRTdxgh2wJR0Pk3z5H196z\/ct9mdV9rKo5sb8qzlEllXaBRPbRXy7vEBFL6r+E\/t9K7sM3khxfaCOvtMLxSMG71jYMN6+p\/SM7lj+m\/8At\/2ObyYbU0KruTTJkDNdnm4lOHL2h+Hk4z4vpk+EXOm4ZCf6hXieRjuNnoT07NPcT4gWQsMkda8uELlQoP0M+EwmLhok06e8bXjrnp+VZ+Q5P3pGc3cqNX2SvY7Nro3EmmNkXA5kkHoPma8fzscsiSiJIIv7pbiRyhMYY7DTk\/lUYcXGky13ZOz4fazESPcTEg7hVC4Pkc1cssovg4hKb9Glt4bNYgI5pw4\/+ooYZ+WK3xLwM6qUnB\/naOd\/UXoScZjbinASxAjlUiQajsjKdx58s1zY6xeQt\/a9GsXxZnZAlpEpE0Nw5YfAxyM8+YHrXdLCm9S1+L\/4Hbk+ghpGibQ6lTjbI\/3kVzzxSi\/uGqYJc3MrlljilfSFJKqWGCT5b9K2w+O5K0XGl2wHhWr7ewkDKwQnDAgjl51r5EXHH\/U0yNOOjQ8PgywbGMb15uWdHOx8vENO2reuPhJdBRTdrLxGWA20byzxnkgySp\/sd67PD8fNnbxwV2HOME+Qfb2V9AodrWRs8iuGA9dia6sn6R5mJXw\/2ZksuOT7G\/C7lJJDbO8a3PMRM4D\/ACB3rHxf0\/yJtqt\/l0\/8icsorYVcy6CV5Hr6Vl5kcnj\/AG5I0KCUtoS31ySWx\/Kf7fvXnwuTtm6VAQk+9jUHmv586+3\/ALN+Q+cYP4aOLy4\/a2XV9secfEUwIkUCOYoAiVoGRK+lOxECKBkGG9AECKBFbCgZWwoEVsKBoqbnQBUwxQFHgbTBvgbG\/Inl9KLZp+Cl5D3g+Ejq3ICk2CRIBVOrckjIHSgfZ2SMggkqMefKpGVOcshCswJ5kDB9hTtCosSZdWA5IHPG5zRf5CjWdhbt1u5yuloSFLagGDKTggg7Ee9fPfrn28ckXvZ1+O\/tcWb7jfZPhPGYHayiisLzYiSJdKMfJlH6j868Pw\/1jPglTfKP5KnjTPMuIWVzwviEtndIEmibB2JXHQjzHrX2fjeVDyYLLD2c0ouOjUfw\/iDG\/ncBiuiMbb4OSdvkK+f\/ALR5WlCC\/LOjx12abh9gvfSyEZJY18vlzOlE62FaJbWdJUYhgQQF29hRhyfcpfGyWr0QurkxgTSnMgYk42yc1fKWVtvtnTDGqL+C8RuZI7xu4mktTmTwpty6HlTcZwcYwdfJGWERjeWavKvhQOcFGGyt5ZA2+Yrb6ksGfhkSv8dP4OftaMfcv9ot7mADEts7OgPMDPiX9\/lW3LpPpnTH7Wn8kuF3QMIV91IIOOorDJHjOwyLZQZe6ldGJOk7etU48laJYdaMk6SQS\/BMpQnyzyPyOD8qWN8JpmbMXxIEMUIxJGSh9DX0H6ZJ486T9izLljYTwXs4vEIkur2RorQ50hCNcu\/TyHqflXo\/qH6jj8a4ds4sUG3aHFx2b4PcXdqtlw25tZcgNJFdHQFweasCST715Ef1GGSDUo7O1PJ7djePsj3FxE0sgubKM6yCMNkdCBzH\/avIzeQ1FuHb0VHJsmLeW5UFRhCS7MeQyf1rmnmUUo2D7sPhtUjQYHzPOuSWRtjsm8egEqC2RyPWkpW9is5cSzuEAmkVPCxXUd8YIz866l5E+PFhGKHvDOLcPnCx3MU1u527xH1DPngit8eH9Pyrjki4v5TIn9SO1sZK4jSW1n7ssuJInH4kOzAeYz9M1vl8SvFlhlTlDcX+CFK5Jr2eUcSSReKy2aNkxzGNfIYPP6VOJJwUvlHcq42MEvJbW1S3iijkjDaiZSZA3sD8PsK0WeNKLirXyZceTuwiG4eOU3NrqtLgrgiPZR5EDp+m1XOaglkSqS\/2Eo39r2h7I03ErW3ecaZ1XBOcq56nHMfnXneR5UctKqomK4MpiR45ND5DDoDXBMvsu+zyGVmAJjzkDz86jmqr2VeiT2kjD\/FfT0ANaQ8qUVSdEUBrYujgoxVs8wcH1raPmTXUmDoKt7MbmbLEtqJbc8v+1ZZM8pPk3sPwhss0qwpiQsAMb8wKqfmTyY1Ce0QopO0UTXBZgSD4h+eeX6Vxxgl0X2UrJniqhTsG0\/LGP2r6H+z0mvJxpfk5\/JX2MbGv0Q8o+NAjlHYHKYEaBETQBEjNAECKYyBFAiDCgCpqQytqBMqamMpb2pUDPz8Ci+JVJX+r+1F10albSAnwnLdADsPy3pX8AfB3VxqBJA\/3mi9hXwTM\/hLEgtnG4zii72C+EWR6GXJYnHM5zn50Ug36OKwOQgULjckUfgLNB2QbF3Op27yMEfI14X65D+6jJen\/ALnRgf3NM9RtJm7qKQbK4B9q+Ny4XjqXpnV3oB7T8HXjturwzCG9hQhG05Ei9FJ6eh9a9D9L\/UpeHJp7izKcOQo7BwvZSXcN6jRuJFVlfYg46iuv+0WRZvpzxu1T\/wBx4ItWay2DJNMSyKkSnWXYAbcvU5GOXka8XF4r8mPJaS7b\/wDuzpnJJfyGxR27cPifiIc3AGW7l9K6\/QEE1MJ4U3DHBtv8\/wDgj7k9Caa1jvLgzRR3MsMT\/eIwGk\/06tt\/St8WHLwcoxr8myzUuLNBPxJ5eFzxCMf4LKirggbYxgcq44wywkk9mNK+xfwe7D8ORSoxEdJ9RXZ5cPq+OpJbiOuM\/wCSri1ks8iTrgTqCFkPNh\/K3n6HpXJh8qTXCXRfRmLyFLOVBBrMQRTIzrj7w8wPQHb1xmvU1OFezSMnPsE4jNmWGbVv8J9fKlijpxFXaL7SfDc6yyQ0Q0CXtmL3jZB\/wn+9kx5DYj5n9a7MefhDm+0LpUaWKNSiqiqqAYVVGwHQCvKy5ZTm5S7ZKXwXrMsKyMcYzzx05V0JJLRtw0au1JeNTkDbIFef9XtNnM0L+KQi30PEMRscEDoaz\/c7NIsHiyUXPIis32UfS+FN+nKnHsQulnBYE9FA\/M\/2rpjDVFpUUB8YOc8hVNWA9seKf8n3c7EhCCp8gdiPp+ldmPybxSxT+Nf8GTx\/dcQLinD45eJSTKVDyABiBjI8xXJjztwUb6LukfMkFlAzxRKGAzqPxNj1rb67l9qRK2I7R5HE07NqGsfVt\/kNj9a2zzckotnQkujVcMkDW8RB2xXjzuMzGSD7iMMobG4H0pN3tkp0cs2kAxKBnpj9KxlV3E0CzGvMbA1g5bADmYJIuefi\/StYW1YHZf8AEcry1aQB6U+6B6Og460kxFJIDjyzn51SAo4dluIRhujE\/lX0n9n9+ZFfCZz+X+xj\/TjnX6C2krZ5QVNDFZxq1wS0x3EYHw+9fI\/qX6823iwa\/J2YvH9yM3x7tC8YK2sMfeHZXlGTnoMD1rg8D9Rz4pcMcnK37Ol4IT3IaR6zChl0iTSNQHLON6+9XWzyn26PiKYjhoAiRQDIEUICBoAgaAK2oAqagClxQgKm50BR+eFl1bn70nfGCBT7NNo+MuTsGDf0jYVNj6IEuN8EjmWPKkHZW8iYO7L64\/KgEiUeyfGWJGwz0pdjOQse8w2MDkB0p+gY94NcLbX8UzklFyrNuTvt864fO8eWfBKC7\/4LxzUZI9P4Ddh4RAxG3w+tfIxa\/wAOS7O2S9oLdzGxxtXnTxuDaY1tESUlkaQAB9IyfPHL8qhylSi+i4Iq+0y3GuP+VVGcdc7nz5bV0t8cUYLrtjSSfJhF+txeWiqNCR4xpUbn1Y+ftiso54RlUY1\/5FHTsqs+8aGHv5ZZVjH3aO+QmDjYdNsVpnzzmqb0huKT0MUKqNQJz0xXntuwoqtYnilaZE1JKDlEGT74r0\/HTUPuVpibXV9DC4Ro4YtZUxTKHQhgdQrkl4U8M05e+g5piLivdJPH9o3t2YJL5hTsT8tiPavX8KF3Fjhb0uzJ8XSS07+CUfewPpb5HmPcHPzqo4+M6ZqpJ00V2NzllGrNTlxksb8PId55epYRj5bn8zXLm+1KJDVjiOYIoGehya4nC2XFWDvOMHHMkA\/XO9dEVqjpa0aWz4jHFCihS8hGTkdK89xq9HE1bCHd7u3lDgDI8PoRuKmK+6xLTFqXIVdLHG2abhe0a0RmulKsCfce1OON2FCK4uPupHBySzFfYDA\/Wu6ENpGijskshSNNZyQo2pNW9EtFtvI8xMUe7Hb29alwS2xultmhU6kAdtWBjV61ycePRg3bE3aS8ENiwLYY+EGunxIOc1ouCtiixctwcTNnxzk7dQFAFdWX\/F4r0jpS2aDs9diW1CZ8SMR+ded5ePjKzDIqZp4iDDj61yRe9mTI28u5B3I8+tZTVO0XF2SM2keYqONlCu9uVPEIlBzkfqyiuvFjf02UlaL45sxKT8Rz+tZSjsT7JGXypcSSp5MHNUogX8OUG+Qj1b6ivoP7ON\/9Yl+Gc\/lf4bNPbBLeI3EuNR2jU+fnXsfr36pxX\/T4nv3\/AMHJ4+L\/ALmIuMX+BIJDl85z518fbb\/k7UjN8FgPE+NGV97e18Z8i5+Efv8ASvrv0Dwd\/XkuujHycnGPFezYV9aeaRNMCJ2oBESKAIGgCDCkBWaYFbc6QFbUwKmoApagZ+e0tlQagxx5Yzn3oRpRwlQAGkIPTwjP+lGkHZYUDrk6tONtqG7F0wbuQzAAA71NN6K\/JZL93HgLgZ+tFfIHIhkkMoUjc+lOvkB5wLgV5xYqLSS0JLY0vcBCPcGuLP52LxnWXT\/g1jilKPJG24dwfivDeHK96sOIzjMUwcgdCcV8j52fBmzOWH2dWO0qkMhc\/abXUf8AETY1hNfUjvtFVTKoJvBIRzArllDaNYh3B7cPCJCN2Oo1j5GRp0JjOdESMkHTjp51zRbboa7M\/HdKIWy2NDcj5Zx\/avQeNtmnFl8l4sbAupKY5cqjHj3siiP\/AB+G31Jah8F8jvDkry5Yr04y+nGscf8AMlY3J7D4+JNfKJGxjOwHIef51y5sk8k1zfRMoqOkAdoWD27K2AxXGfOu7xp\/3yT7KxKmIe1Rabhlrf8AWW2Ebn+tBzPqR+ldeWP99TKqm4md4dOQgJPLpUZoboqWjQcFuB\/wpZGIBLu3\/wB1ef5MP72l+BVYcLwPACdxWP06kawjsBvrrTGSNtwMkc66MeO2bS0h9wybvCJJW2boPKvPzxrUThfY++1jusR+EVxKLTIEN9daLhh0O9duPHcbN4bQruuJlE3PiJ5iumHj2zWMdi+5vTpKjdlVE38zua6IYvf8lKIZ9qLxopO561j9OnZFbNBwhO6iMh3dvyFcOaVukYTlboNmuEVCc4zWKTbJSMV2lvWup4YEOWY7gfQV7Ph4ljTmzoxxD71lteGxWyMAIgN\/Xqa58ac8jm\/Zquyjs7xEx3zozeF8HGetX5eDlBNEZFas3treAoN8npXhyx0+jmaJxzBbjOcahiolG4jiRuJiFkBOM8iPOnCF0aCWK4MnE8k\/Dgbn3J\/Su1wSxmi6DrK4D24AbGNs+1YZIVIiSLFnJzk+1Q4EnGlpqIDTs8UfiAaQ+BYmYjzx0\/Ourw\/Kl4k3kit01\/mZ5oqUaGPFL5mYvIBjGMDoPKuablJ23tkJejI8Vmlvrxba1GuWU6VHQep8hXo\/pvhS8rIor+oTkoK2anhXD04dZJBGdR+J3x8bHma\/RcOKOGChH0eXkm5ythJrYgic0gOGmBE0CIGkMgaAK2oArNAFTCmBWevWkB552r\/iNNwPjEtlacPtrhI8Bnm1Z1deVdUKSpJMwlt7Z54koiIGFCjqdya5ujqq+gnvo3+HxN7AVTYL8nzxK6Z71ifLPKih2UhSrLswA577mp\/gCm6d2PhXSR1I\/Slv0CKYz3anfGfPmaLHQ+7K3n2PiK9+AYZPCSd9J6V5H6v4jz4eUe4m\/j5KdemeuWF33mEBwAMf32r4KScDraF3EbAWeu7t89z\/ANSPGwHUj28q68Gfk0mHapiWSUIJwp54INdDinJGkB\/w24KRRnppHLoa87NC2xstvbpAhAxnp61OPG2wRjXuitxKjYAc6cjlv+2QK9mOO4po3Ox3\/ewgE+MDGP8AfzqZYeLIkt6B2ddXPbNaJMEPuGTqtlCcgcz+dcmSP95sxntsjxqcOmpWBGMEV3+HC86bHiKoCbzs\/eWYAkmVC8SsMgkZOn0yMjbfevWzR4ZFKtB5MG48o9mGiaKSNjaMwbGe5Y5YDrg\/iH51pn8fdo4sXmc9ZOx5wif\/APoyKCCNR\/WvEzw\/vmz0YLQQLjShGeu\/So+ns3iqF3Ern7sAbAHOK6MMNhNjDg3EcFVBzjl6Vz+Rg9nJI0y3o0bnJxzNeY8TsgT8Wut1bVjGx9vWuzBj9GuLToz0l4WcoDnLDl1FehHF7OitFUl1qKb51uz4z8h+Qq1jr+hX4HnCiJCGJOlOfqa4c+tGE5V0aGO+076tv0rz3iswoX8V4uscMgzggH1roweK5NGkY2ZvgzmfiqzSEEqc\/OvR8lKGJxidSVIYcYuCQcHz9cVz+PBAKLS5KXKMraT711zxpxoUujb8I4gGjUg14vkYaZzSQ3lu9Kh+eN65I4r0SuyN7efd7ZIxkH08qePFs1WxXYzZmuGIOoEkZ9F\/1rqyx+1L\/wC7L9BNncaY0G2joBtvWWSFsJUw2NzuWO3QVhJeiNHzy55UKIDqwj+ywM0hHesP\/wDEeVZzoxlK3oE4hfE6Uj1MzkKqKMkknGAOua28TxMnkZFjhtktqKtmw7Mdh72ztjc3fdC+mHiTVnul6Lnz86\/SPA\/TF4mPiu\/Z5ebyPqPXQ3fs7fDkEPs1d\/0pGPJA78C4gv8A0c+xpfTkHJA78Iv1520nyFLhL4DkgeSxuk+K3kH\/AMaXF\/A7RQ8Eo5xuPlRTC0VMrDmpHyoApkOlSzHCjqaai30DaRS8iadWtNOM51DFX9GZP1IkEcSIHQ60P4huKhwkhqSItSpjtFRxmkM\/PH8Q5B\/5p4gDviU11xqjE40awjDMJMdGb88CuU6tk4ZEZiExv0UYpp3oQfG8dzbRFQiPEhDrnd8E7genL5etZYsnJuD7RnGW9n0cuoELjT6AnFbp+jR7KZIsZdhqJ236UnsAaePB1adI54qWqGWWoRkReYHMAGkqfQ6Nx2Z4wTiCU4dcbk7kV8b+s\/pv0pfUgvtf+h3Ycn1I77Ru4ZVkiwdJBGN6+XaaZoZzjfBjEhlsw3dgeKMblRnmPT0r0\/H8jlqfZUZK9g9pdaFxnpRkx2zWvYJxG+whUnY7g+XnW2HDbsF2Za5udVydyQQV9vKvUhComl2ij7UUkGDs2\/tV\/TtB2Ei5yc5ycjFZ\/TEjQ20oWzhAIOEFefONzbOeW3Z9dzGS2cEb4yDXo+AqyjjpkOD3Zt7pXVsbg\/nmvX8nHzi\/wdD+6NGY7SG0t+0F7bXIa2dJdUc8I2KnxDI89+YxyrowyjlxpS7Pns2PhNovtrkfZAFlWQYLF1XTq38vOvI8zElmPX8Jt4lZY8x04BOMc81zKJ3qgDiE2oO2rGMY8\/et8UaIk\/R9wy80jAO4x1oz4jml2aKK8LjY15ssVEoheMDbyHrpNVj\/AHJFQ7M1bTMzNJv4VJx616U4pJI6m6LGYtcRxjAKqq1NVFsOVbNBBKIECqeXP1NcEoubs5m77I3F+QpwelEMNsEZ6fiJnlZWYnfOK9OGDgrNsaGfBZQjg9a5PJjaNbLuIyh4iV51GKNPYCbVqI2rrolmo4LceBMHwjYYrzPIhtmMh5Jcnu8DnXDHHshIqmmPcI+rbTjHqKuMdtG0SixlxHM5IyQ528thWmWO0v4GW2NyupUzkKBvUZIOrBjOO45jYe3WuVwIoMsnBl1tg6TsD51nNUqIm\/SGNxeYTcisIw5MzSol2K4ta2XGZuIXNo113P3cGGA0OfibfrjYe5r7z9CwLxcbnKP3P\/Q4vLuVJHoifxEsv+pY3K+xU\/vX0H\/UL4OH6bCU\/iDwdvjS7j94gf0NV9eIuEi9O3XAm53Mi+8Lf2p\/Wh8hxl8Fq9teAN\/+oKv+aNh+1P6sPkXGXwXxdq+BSkhOKWuRzDPj9aayRfTCmELxrg83w8QsW\/8A5Vp8l8kgnGls7\/hF5BYXdnHdSxFYpVdTpbGxp2vQM8ik7G\/xBdSkfE7G5j6g6CD+VNTyroiosBbsn\/EG2heEWHD54mbUy92uCaf1ci9f7C4R+TgT+IVpGI27OQtGvIIpA+WDR9af\/wDEfCPpg5452st2\/wCZ7JzEf06v7UfW+Yhw+GUy9s+IRZ+09mLyP1G\/7Uvr4\/cR8JfJ5t2it7LinE5r2ew4hC8zFiCvWplkxN2nRUVJCq3lyNJCKD6DH0rnOkIgjiGdTscfy7CivTGwGVEh4uunUsdxGQu+4YHP7fnWGXHyTcdMwyL2M7HiHfSJa3LiOY7JJyWT36BvyPpRgz\/UVPsUJ130HyQMjac6Mc9Q3rq\/Bun7RQ9oCzENkjrikAGkTRTKrZO+Sc1FUx9h9omljIhCkbhj51GTDHNBwn0yoTeOVo2PBuN95GoZgHzjGetfBeb4EsM3Fo9JNSXJdGqjuFaAHPTevKScXRJmONQiKVpIsKGOSOWDXo4ZXpmsJ6pmU4hcaiQSc9Qa9PFCjQQyzHvPnmu+MLRROWTvELDkDq+tTGNOgTJW7l9K4wW8jSmq2EtGi+1aRjlgY3rz\/p3swKHuyU052J89q7PDx1lQeidlcBcOCdhn1r2pK9G8XaFX8QZlbitjMQo7+1B5bEqxH6YrPFipNL0eP50PvFdtcBbNQNhqI\/euTJjfPZ2\/p7vF\/UL7\/Ma7n51jw2d7dIEvJw0bHqQNq3xY9kORTw+UhsA+tXngc8nZo7Sc4G9eXkgSFtLqXntWSjQ0Z+2PhbJPiYLjy3zXoT7OlsL4f47mWYjIUnB9ayy6iokZHqg15STXOomVi3idxpiOK6\/Hx3IpCm0b\/md9\/Su\/NGo7N4bHfDHIklB5BcbeZrzcy0htn0lzrhGcZ5ULHTHYAZPFgttit+ImzQcEl0qp5VweTExl2ORNqOOlcXGhEZpPumB+H9KcY7LT9FdvOEsWzuTGd\/c1U4XP+pZG2uNTbN+dOcNBY0tZGZiWJxXLOKS0RKXEYwXIHKueUDEp4jflIiEJLnZR5npXb+neL9XKrWkDHfD7cWllFDnJUeI+bHc\/nX2cEkqPOyS5SbCDVkEDRYis7UwogSR1oERY\/OiwK2x5D6UrHRWyr\/KKBURDMhyjuh\/pYihOgqyxb+9iOYry6Q+azMP3p8n8icY\/AQnaHjMQCpxa+X074n9ar6k17Yvpx+AiPtb2ijQsvFbrSoyWfBAHqSMVSy5PTJeOC7LF7bdoNBb7dFMgOkkxxuM88bVS8jKumJYoMqftjxVjmRbFz5m2Wn\/1WT8f5A8MTwRo5FcAvsP5cYpGhdCTz3bfbIwKa7CwTjrlUtpgTqSQ74wBTu9EZAgwpeQ6ycatx6Hr+deTmbw5Licy+Aqx4oyFbTiLHI2jl\/v5ivRxZ1kjbKjNw2uh2fiwrkqBn0P+lbo6FJPYK4JkGcA8gBSeyui0oiNpZ6NBfwfOxi+8ibxDcgbZri83xo5oP5R0+PlcHT6Zq+B8XE8CMzfhz9K+J8nxuEtHZJbPuMXQaNhmlgx0xGVukMqNhsMN816sHxZcZV2Z65Y75NehBGpO2k1xgZwTlTUzjTFZbw5gZvF+Hf51OVUtBJ6GLz5HPeuZQoyX5KFmzsSd2HWuvx4f3iAtt7jEYGdwSK9KSdm0HQF21xccL4VN+NHkjzn2NaY7jJ\/wed+oLpiTh85Nuysd1b9qy8jH91o0\/T5fY0wrvSI9hneudY7kd7kCTSlhzrohjoyvRbYtvnkOVY+REzbNBay4AGc15k4iQRNcJDCXkOw5DzrOGNydIpbFkLYiTc5wWOfWuqS2bWF279ymnOfM+dYzXJ2ZSley3vRjNTxEhPxKUv4emfpXf40F2XEHsjhy2NhyrfOm0oo2g9WNeHzBGlc88iuDNjekgbBJ5cPMgO2okDNaxhpNgmUl8sD0OKtRE2PeHyBUT\/eK4MsbbM2N0m361xuIHLu6KwMFyKcMdy2NfJCWbRasNzgKo8\/9704xuRVldq+oFSQMeXWqmq2OxrFNoGOWwrllGyJliXWkHJFS8dkhPCNN1xNJX3jhGvHTPSvov07CseO\/bOfPKo6NR9pTyr0rOE++0J5GgKPjcJ50WBAzx\/zCmBBpo\/5hQIr71TkaqOwog0qgfEPnQB1Elk\/w4pG8iENFE8ortgvEbu14aueI31nanoks6629kXJ\/KrWOTVkPNBdGb4h20sI0YcPhuL1xsHZe5jHrk5Y+2BSqK7ZLyt9IVC97VcZ2tybO3brCoiUf\/M+I\/WhTS6QcZS2zQWnBi0CDjF3PxOQb6Z3JiU+icifU0SyN6ZrHGojGGCK3BEEUcY\/oUCoqiiR38xTA8eW+lAAZMDPPlXTyJomLqQ4PhB+pNFiLLtftlkyElnG4x0IpSuvyElqgXhNwU0xMSNey\/wCYbEfMYrDyMf1Y\/wCxytBt3ClzHvjPnXm45OD6JsqsOKyWLC3uwXiztk7j2r18WVTRadO0PbWdJcSRNrUjAZf97VqdClaLwy5xpDHrttS09DRMEd5qA3Hn50vyNC7h183D+IyQMfu85UHqprw\/P8NSto9HFPnFMbXt+JM5PyryseGiroFWQEe9a8aGZ6ZiTht9yPWvRgjayu0c4cDGQQd6rLHaJbLtfdXBKk88gVCjyjsOVoKeRXXOdqxUaIKFmCONbbZHWuvBH7kx1ZbFJoklTqDmuuSfZcZFPHJRJwqBSclZyR7Ff9KqHZy+fXFMT25wWI57Z6UZFf8AQx8CdScS15MgjrUJUz0JyBw2cZ9610ujPsLtHwBnnXNminsnsdW7\/lXnTVACcRnMkoUE6F2G\/WtsEOKs1WkS1gZIJOMKKniOy8Sb4zWfEyJSyaY8g70QhbGmK7ttXQc8Zr0sUGik6IxHShA3J9KWVcpGqdItE2ghV6bbVm8d22K7Iztk6s4zRBUTZBXIOR0puOmPkMbe5KKmDvneuOeK2yX8jmCfUoNcUoUI+vbgEKoOOS08cPZd62VT3Qkhk0nbX+lVHG01ZKkmW2DFckkHyqMqspMMM+XbeseGhSeyp7hmYIvNvLfaujBg5yRN+z0PgfDxZcPRZB98\/jfP5D5CvoYRUVSPOyz5SDTCp\/DVmZW8CjkMUqGVmFc86ehWyPcr1GaWg2fC2VwdK7DcnkBQl6REsih2KLzi3CbXI75rqUf9O28X1bZR9T7VnPLix\/vdf7mDzyf7ULJe03Ev\/wBOs7WyT+Z171z8zgD6Vzy\/UYRX2R\/zIfKT+5ia4ueNcSkaOa+urgvzjgOgfPTjFEPJz5f2qgjD4RZZdkWPinMVsp5qg1ufc8v1rZY5Pc3ZusfyOrXglrZlTAilx+OQam\/Pl8q0UVHo2SS6QYRKdy2cdaYaInvBjDc6BkNU3PNAETLJQB5jcFWXwgbjnyrp2Qgdi652LDkCedK17HRbEWOxYIPIClYMDu0WC4IkJEMuMtjdG6N8qmOnRz5I0w2CcyBllAE8ezgcj\/UPQ1yeTh39Rf1MWvRG4ijuI8NnUORrmxylB6EmL7e4uOGzkqcodip5NXp48qmtGsZezTcOvI7xAYCQ34kY7rW\/ZrGSfYfspCsPcc80mi0xP2kDr9muhgMh0HT9R+9ZTipdnRgnVxAoL4sAM8sbV52bx0to6k7GsU2VG9efKA7FPEPDK\/LHPNduDpWaJgttJic7DB6VvlinHRLkXzOMIwPocVjBXaBSLI5fu9\/1qXC3oGwa5kI+EjHWurBHexWXiTWVbmGXJromtFJ0fcQGqyBPRwPqDURe9GHlO8exQrYkB89jWzjyVHn4p8JKRZI2FIzUKO6PVnL2Vht96pk2FwNtvisckRpjZJdERbrjavOlD7qGLQ33wDHA3NdTiuFjci1ZdSJ1y+fzqXCmwUrCg5zt0rncBWVzy5A3yK6MOJFJg0rYVABuBn2zXUlXQXsir4XOfQVPCxuVaIptg561VIXKw6CLvfAOZ5e9c03wVsmUgOTUrsu\/hwd63rVkxybout3B2PtvWGXG7s0chtaTDAVcVwZICsG4pfEA9MAnatvH8e9iyZKF9leOY2TI3I\/SurPgSaZjjm\/ZobObEWpjvivKyQt0dMWfGfrzwM0RgF2aLsJw03\/EjcyLmC2wTn8TdB+9ej42KtmGadKj0giu2zjIsD50WwpEGFKwKmXl50wdIT8S41DaM0duBcXI5qPhQ\/1H9h+Vc2byoYf3d\/BzSzOWo9Gcvrm4vSTf3BdeYhXaMf8Ax6\/PNeXl83Nl1HSMaRG1tpbs6LGDUo2aQ7Ivz\/YVeLw55NyNIwchxbcAiUZvJGmb+VfCn9zXoY\/Gxw3RtHEl2MliSJBHEion8qjFdBr10RYYpgcIoAgwosCBAJzTsCOnAxSsRBlx0ppgeThTgEMB5sa6GSWxyhSTzOPp86PYFqxxN45HAPvRS7Ffopu7T7RCyoUyNx50pJ9oUlaE0MrtH4WIuLfl\/UnkfPH6e1Wvu2jmYdDcRzx602PVfI\/2rgzYFH7o9CaJSgTJpdaxi3F2hIAaOS1dZIWKsu4IPKuzHl5Fp6H\/AA3in2tdDHTc9V6N7f2roUuRrGXyF36farWaBtmYeEnffoaT2bRuLsyEblHKsMEHkehqJxtHZGSTG1rc+EDrXm5cJpZ9dnWuedTjVMdi4sEcY6b867Y7iZtnDdgh1O4ByKaw9MiOXbRfHMDHkH3FQ8dPZqpWU3DkHbPKtMcRNhduyhU1Hl\/atHVUDZfeRvLwdrkEhY5VUDPTcE\/pUxic3kZLqPwJZNmPLzzW35OMrlYlAwPPY+hoSR0wyNqjqHVy5\/pUtUzpTtBcTYIHI1lJFph7SgIFbmRXK4btD5exVdXOg4yd9jXbjxJpM58mX0i6xmZzGD0GdumaxzwSVmmKeqDdZ1ZHTqeWaxhBdGiZB2LEAk71skkXaSInxOcVW+kS5UVyRvqBGoLyG1XGlo45ZW3ZdFE7fhJqddlxy0HMzWcWI0LXUmyKBkjPU1xuMckqk9A8jfQ\/7P8AYLivF7F2wsM+ksv2htOs9EH9zgV2Ysc5yfqJlLJxX5M7xjhF\/wAGvWteJWstrdLgmOVcEjzHQj1G1XPC0awzqS7IWsh1A7jHTFcWbFV6NuRC8jWWcqZcK45AZIqsNxjtdGOXIk6BLRH5AZBOSa0zTT2ggN0kIUgbkfKuD6dnQpDfgnCLrjF0Le1XYf4kjDwoPU1pjwvthKairPXeF8Pg4ZYx2tqPAnMnmx6k12JUcjbk7YQ3ypiZAnbfnQIizAAkkBQMkk4AHmTRdCb4q2ZbjPGmucwWDskHJ5uTP6L5D15n0ry\/J85L7Mf+ZyTk5vfQieRLdAkS5YnAUDJJrgx4Z5nYlb6HXCuAlsT8TGpuYg6D\/N\/avZweLHGt9nRDFW2PgFVQqhVUbAAYA9hXTZqQagKINzoDogaAKzQBw0AQNFgRNMVHCKQddniyTFt3Z8nodhiu1kBMbF056UB5Dz96jfY2XJA2kMyqpPItk0UKyaQoG3lB686VWF\/Aq4kht7pZ4cAZzsNs9RTjpmU1QFM\/cXCywZWKQalHl5iqoha0MLe4WRdQyPMeVcWTFxdk1Ra51DBxnl71klxeg6ApI9DakJDDeujHN+x3So0PBeJi7ZYLtgJh8LHbX7+tdMXyNIutMSdowkfGplRQA2lvfbnT40jpx5L0waGXC7VjPGvZ1KQX32oEZx1rCOOmU2L7ssH3yBW+ONaOfI\/bF7ticE8s1ulqjnfdjC3k1LjrnOaxlE6MbJyOGbbc5pxj7NbCrSGS5lWGLmeZ8h506t0Y5cvBWaq4s1\/4JPaxDYRHTk7kjf8AankVJHJik5uVmHYgqp64+dC7Ymct2UMVO6tsacl8AtESphlIxyO+1P8AcqNceWtMtgcE7HaolE6oyXaDu7muVH2ddb4+Edaw40+gySSQmukc3RR1Ksp06T0NdUahHZyN8mM4VEUYC7E4ya5JPmzqi0lSLl1Ead+f0qkqZqnQXa20k7hIlZ5G6D\/e1FLsmWT4NJYcFtraH\/mB3tw25IOAvoKZjJ8tME41CtqYNKZWTOQd8HaspwraMMmqob8HtoPs7s8MZfSrAsOWSf7U8cE+xQk26HViILfLxRRI3PKqBgVvGKj0jVmp4JdHvFJY7jnW8JWYzR6Xw+z4V2ksPsXG7K1vY0GUE6BtJ64PMZ9CK6lUkYNtbPMP4z9iOw3ZLhz3Nle3lrxaZSbbhySiUP6sGBZUHnn0FTPB9SLb1+f+PyV\/1LjUVs8e7K8Jk4vxWO21KJJs+JxkAYySRXl5YfbUdG+NtytmrH8OeJK5Ec9lp6HUf0xXN9NtnTY64X\/DqKFg\/EblpvNIVKj6nerWKu9j+obG0tILG3WC0hSGIclQY+fqfU1p0Q3ZaaAIMaBMouJY4ImlmcJGvxMf09SfKpnNQXKWkROSirZjuL8Ue+YocpaqciMc29W8z6chXieR5cs2o9HLKTltima4J0xxAtIxAAUZ38vU08HivIxJWafgXBlslFxcgPeEe4j9B6+texjxxxqoo6oQ4jjO9aFlTHANAyBNIRWx8qBkSaYED6UgImgCJ9KYESKAIk0hHi6zLjwgZJzk12v8EBUMg\/Dgt5Cl\/AggmV8qXAPUKNzSpj0VTRGM5UEHoOppK2JFMwEsDI5QMdx\/Nml3oTVigIZYnh\/EPvE\/cf78q0UrRh7B4JWhkyPmKcoqS2OhvE4dVYE4xtXDkjwdENEW55A28hSSsPyVuu2U2YdfKri32O6AeJSvPdySyMWYHGTz2ruj0VZG3mGcPzpONnTjzemFE45NlfPyrHi0dKkiLgyKRk56UftZE1yVC94W1gHmds8615ROZxadB\/diFAg543J5k1km5OzeNR0QaQIck48tsmtFGxSypaNL2QTvYpnA27zHnyAqorZx5ZcmamNMHSw22FLKvtF47++jzadDDJLE3OOQr9DUL5LfwDnZ+mPOqsQRJ441k6jCt7dDUftJl8nwjVyCPCfOlyaGpuLLViLhndiY4VDac41HNVFqq9lyk8lNjNLKXipkvI1hRy+67jJx51x58qxS4v2OORRVBlp2bubmC8lkubWBLWBpiGYkuBjwrgc9+tXhyRndFfXS0a\/+D\/ZbhHaHjVzFxeOWW3htXmVVlKZYFQMkb43NbYKySaYnmk+jWrZ8PtO9tbWyjhgDYxGuCfnzNcn11FtPo61jbVi7iXCl095Zg+o8q2U1Lohxa7MV2ogeJbbvAQ2s8x6VOToxyrSD+HnCyKNj9mib\/wC4\/wB6qH\/gzg\/vDoZcgA9K1OgaWFwV3yAc8\/KqTJkgfjX8UZ+Eo1r2dZGuyMG6Yalj\/wAo6n1O1bwy1s5ZJPSMPHw3ivGbLifaC\/kknit9LXFxO5Jd2YAKCebb8ugHtROU8itkqKj0em\/+GngUPGO03FLq9jMkNtaaQOgd2wPyVvrUYIRkm2jS2uj3r\/y\/w+3uGEdqTj+Y7VssUF0g5NoIbhPD5RpeCMD+k1XCL9E8mugC57H8NkU6JJIyeuQRWb8eDKWWSMl2j7N3HCUEwJltidnA5Vy5cDgrW0bQy8tMzM80cETyzMEjQZZj0\/ufSuac1CPKXRc5qCtmK4vxWS+k1HwQoToTnj1Pmxrw\/IzS8iVejjk3J2xHdXPPBIxzzW3jeJyapC7NR2Y4SbWIXl0n\/MuPAp\/6an\/8j+m1evSiuKOvHDirHxOBQaEC2DQBFiDuKAK2NAEKAIE0ARJoERJoGRLfSgXRwmgCJPzoA8N69Plyrv1RmGWvMaQwz0FZ99AHhygzpA9aLF6OZ1eJt88jikUj7ZCCABncDrQlT0FiriC91c94owM6v71UTGapgd7Dg60G1OOtE36I2c+hwpPhNKcOQmMAcjauTr0TVENWG3pV7DYvutpnJ867cbuNssHOxyfOtALYyehPy6UilJrosErIc86nipPZayyLmuV0RiMAl1yxxjSc4x6\/61H0ldj+q2fXBZ7MOCQVbB36HlVJJSIk2Lxlmyd8+da1RBuew5Q2ckZbEhcuB6DAqYv7mjOZqmTBB60ZFcWGN1NHnnaGIR8bv0A27zV9R\/rWMX0bz\/cKpFwARVogJsSrNoY+FxpPp61ExfgkEaNmD7EHBz0qO+iUmyyBtUd2m+8eR8jVpaNE6Nf2etMdn0uI2yBIwkUc18j7GuDzcLa+qv6kSe6O8QYx2VxpJAZNJx5GuTBL76EbH+BjaOK8Q55azZPq6V6eGfHkawVs9Nbg6kk6Rv6Vk4I7ORW3BhjZKFCloHI86\/i9YfZLPhLacFp5Fzj+gUp6iY5n0ZaxbF26+div5b\/tWsXtfwYR\/cW3F9FZQa5W0g8gNy3oK05aOiUlHsznE+MXN6jRjMVudu7U7t7n9qjnydJnLKbnZ92c4Mb+71SnEK7uw5+w9a0i30XCHI3Hb7iMdt2MsuFWqLFFJODoQ4ACDP6kVvKX2NCkqZ6B\/wCGRo+HcI4lcS6R9qmAyf5UX+7Gq8ZXAU9M9q4jd27xB2lVFxzJroomxS09vIv3F2ur1G1LTGHWImljIIWQf0NVL8kkOK3dknAL\/wC3SiOCOMly\/wCHy+eaU2km5dC5cdn5p7QcTN7OUjBW3Q+FT\/8A7H1r4\/yczzSqPRTk5O2Z+4lP4Tjy9B1NVgwcnSJDezHD1vLr7XcD7iFvAp\/G\/r7frgV63FQXE6cOO\/uZsmm6k0HRREzA4waLCj4vv6UCZWXoAiX286AIl6AIa80ARL0CIF6AId4M7UDPi+1AHNYoA8UTGrA3xz32FdzMmw6BsAlufQKKlgTZmJyzAegpewLBIQoyAP1pOwPgcjmfEd89faivkV2DcRAeDb8P6U6rZM9oGQd5AoP8op7ox7Fc0ZjkK\/Sruyuwy1m1ov8AMPXn61jkhRLL3OTke9Yr4F7A7oeJWXkdq3xvVFKgYj02+lb+hny8vWkBKQ7bULQtlXUDJJByKr+R9B9oe8jmi6um3uNxWb7srtACnO\/nzqiWOLG5ls47WeBsOjsR5EbbH0rBtqVomSPR+G3sXErFbiHrs6nmjdQa3UuUTL9rMZ2ui0cfuumtI3H0A\/asUdU9sSCF5CRGupuZx\/vaqRm2TSExDOoMeW3IfPrUSq6EvkpuJDIxaRiTWi0UER97bMJYsZ3zkZBHrWfJXsXs1XBrtrForu2AktZF0Sxefmp\/Y1jklLFLk9xfZMqeg3jarHa3AjYmMqrIT1U4I\/I15sYKGZU9AjYfwG0Nx+eN2AaSBlTP4jkHH0B+ld8F2a4nvZ76toMDarOiz42Y8qKCzyX\/AMQcAi4XwH1upv8A\/mtZ5V9uzPK+jyo3Zsb+Gbu+8P2VVCHYHII39KTmocZP4Oe2mJp+8uLhpZ2LOenQD08qxeRzegbbdsgU1yhFHM4A6murGqjQLezbcNiS1tFiTmPiPUnrWyo61GlRnu21133ELeAHaOPJHqT\/AKCpySpGM9yPT+xF0\/CuztnGhx4NZwcHJOa68WopEscX3aeWZAC2P6WolMqMTsXG3jjDhic+vWkpaG42aLgHaaVXjCyE6j051ccpEofJi\/4kdsH43etHbtptFIGBt3rDbWf2rwPP8760uEP2r\/Uw72zz6WXGeuTv6muLFG6K7KrSzn4rxOCwtRqmmbBONlHMk+gGTXsY8axouMeTo9Li7NrbwJDCCERdIzz96iUHJ2z0IySSSIPwRxyFT9JlcyluCyjkCPajgw5orbhdyv4m2p1JByRU9hc5zk5ouQvtKntLpc7Z+VHKQUiox3I5pmnzYOKK2Mw5xmnzftC4fkrMjDmjD5U+aBwItN55FPkhcWV98uTg0KcX7BwZITDTvVCaaOd8KKEeQxAggKPeux9mX8BSLoG3M7Z9aQrOyA4IB5UUuwJKNKb7daTD2QaUE+HxHl7UDJCIzRPqJACk7Uu+xP8AbQFA3hXzx+9WjAjfQ6o9Q6dRRdMSYuhcxSA9Ad6qSsoYqwZfMHH0rmlGuyGVTLqBB59KqDpjQGTyroWyjm2fT0oA6eVHfYFB5j+9XtCDLOXTKjZ5Heokk9FohdRCK7kQcgdS+x3FJPVktbCsj7NEBn4mP6VjJbJb2M+BcTl4Zch1BaJvDImfiHp6j\/SlGfF2ZyGvamS2u+IxTwyiRWtlDBdiCCefltTk4p8jVu0hFJIFGnG3RRy+nWoTlN\/gnsFmkJIyTq\/lB\/U1rDHxRSVF\/DLSOacfaDsRgL5E8s1GXJ6X+ZLlXRORwtxJEwA07bjr5VnCL4KXscVoI4VefZZzHJvE2zKeVatKUd+x99Gj4nIJOHZXdREiAnrjFebkxSx5o\/FEhvY66msQLq1fu7iGRJI28mBOPl5+hNaSnwxuXw0K36P1T2d4lDxvgtpxG3AVZ0yUznQw2ZfkQRXZFKS5I6Yz5K0MhHmnxZVnjv8A4jAjWnZ+DWglE00mjPi06VGrHlnIz6Vz+S+ELZlkkeJypjOTlvU15fNzezHplGg59\/St06Qwzg1r3nG4x\/KQB7mu3xpckxof3UctuxBX0BrdaO7sxd05vePPv8UgUew2qO2crdys38XEBHFpz92Bp0+1dKkauGjq3xl2O\/r1qXL5KSoKS4ZogmfzrNvQUgi9vms7LuUY9\/MuTv8ACh6e5\/T3rzPO8lxX0ovbOfLPk+KMzLIXcnJNedGNIyA5HwNZPov7mvW8XDSUmB61\/CHss1vwZuMXUeLm\/H3OfwwA7H\/5EZ9gPOuyrOjGuKs3jcO9KfE05FbcOH8opcQsqbhw\/lpUOypuGjqgo4hyKn4an8lLigsqbhaH8IoodlD8JT+UUUg5MGk4Mh\/BS4oOQLLwVDnC0OCHyYFNwMb4UfSpcCuYBPwEb4U1Lxj5gE3AGBOARS4UVzA5OBzqfCTijiw5JnjyZCnR9a9CjlLY\/wCrljl5VLBMkAC3i5Z2\/wBaPQyMmFUk4LHlRQvZWrBXwCC370\/Q+g1MacasqowccqNpUxasVRjEYI6MaI\/kw9hUeHjYVTQhNdxd3KR0NVF+hlto+RpJO1ZzjewaCH3XbnWEVQkCSghs9PSulPRXZUcY5YPWqC\/RBj8t+lNAV8+tV0gLIDgkHf5+VS1oaDrwa44JRnYaCfbcVC1aCR3P3cY671nLT6IfdBMKYALE5\/SspzUfyxVZKSUhTpOAPPp70oQbdsE2wQszErGDnzro1EaJd3oHvSTsbYRbsQQcY3+tYzTZmzkzmfikhOPEwGfPYCqTaxo0j0cu4jDK6nmhx7iqhJNWCYx4bfZi+zzklG2z5etVOKkqYNGi4WrQWUwY7q6fqa87NGsckyXo9G7CdqpuDW1zbbvAxEygH4Tyb\/8AE1HiZWouPwaYX91P2aq4\/idDZ2jzSRSMyjwoCBrboM9K6X5HFWzoyRUFbPJONcVvOO8SuOI8Tl7y5m3OOSKOSqOijkK8nyPIeZ2zh7diWVRqJIqYOtjOLHgFj0q3LQwvhpaGdJI\/jDa\/oCa9Hx3xhQ4K5IYT8bbuXM8edKk59QK2jmXTO6UaTaMf2eUPxESycly5P+\/Wmr5I5YI0rzxbgyACtXJfJ0bPlv40X7oM7DpyqHkgvY+MmGcJe5mkkuroItpBzQHeRz8KfufT3rDN5axwcq\/gyzPgu9nLu5knlkeRizOcknrXhRubuT7OVAbtq8PInmfIeddeDH9WfH0P8jfsTwA9qu1Vrw86ls1+9uWH4YV5gerZCj1b0r2ox1r+Bw2z9RRwRKqpGERFAVVXYKAMAD0A2rTgb2dMA6AGjiwsi1uPKhoLK2tlPSlQWVNbL5UqCyprQeQo4jsqa0FJodlbWgzsBSoLK2sgelFBZU1gPKjiFlD8PB6U6FZQ\/DR0FKh2Dvwz+mhoaZQ3CgfwilQ7PyfCCzBRso\/Oulv0ZlwXG53xyFRQyvUCzH9Kar2BWzjGQNPl5mjsZ9Gm2o0l+QYSjFVAyNjvR2IHijzasdshjVLo5W90fWx8YH6VVWF2C8Ujzk43prTKi\/QsQlXBG2OdNq0MOVwyg7kHnWMoNCIt4iRj29KcGNFBBNaehlbjbmaBUUnz5flV2q2MkhIcHpRdgNIV721mTmVGtdvKsZadlNaslbx6iDnAArGToy12iyd9AycAVMIX2OgeMSXMgVBn9hXQ2oofSCUiWIYH1xzqG7TbEmccZ\/1o2B9EcEZ86ib9EHLMauIAZzmTf6051GKNfQx43HidXA55B+tcnizttL5ITFGSrDBr0OykzU8E4i09s9vJ8Zxg+eK5fIxuUGo9ikmaXg8+kxOTkA4YenI\/ka8jFP6eZW9PRCb7QBxK47+7YI2qKIkKR18zV+RK3xXSNcuR5GQZ9sVyJW7RmREZbA8\/Sqc6WhJEp1xpUUsbvYy+2XE8APJgw\/8AtNelgl6Lh+5AnaIiHhcm3ichB+\/5CtopWdud1GvkC7MQBo5nPooqpezHCt2Ovs4PQVFM6S+2sTNMkcSqXbYZ5DzJPkNzQ0TKXFWwq8lRRHb23\/p48hTyLHqx9\/0wK8fNm+rK10ujglLm+TF8p+LB2G1TBCB3JSEk83\/IV7XiYuMb9sT0ansbfycFtpZYiyTXGCxU48I5D9TW88lSpHXix\/bb9mpj7bX6HadtuhNT9R\/JpwDIv4gX6AeJWq1lol4wu3\/iXepnvURxn2xVrM\/YvpDGD+J0f\/Xtl+Rp\/WT7QvptDGD+I3C5B97G6Gn9WDFwkg2Dttwab\/q6fc01KD9i4y+A+LtFwqXlcp9aacX7FsITiXDpfguY8+9FJ+wtlyvbyDwSofY0+AciWhGzpdTj1pODDkcNuDvnPtRxY+RB7XNLiFlZtPSlxCyBtBnAHrRxCz8S2zMx8PLHOtG60OrO3D63zk7bUmBFsAeE7e9D+R0Vr4mJK89hnrQwLiWxgkeHypXWhHFByF9fpRaHXwX2q5jlU9GNVG2jjyfuoEde7lB5CrVgqZVekMh5Gjsa0xOw3J50\/RoWQSYBXcjnUTWgLiSGByNqSXoRyUdRVLYWVNyOBn3oQylhjNXsDhG\/z8qaJsZcOl0TIeh2I86ymkXaDIMLGzHYA+fKuWVuRC7ATmaXP4eldS+1DoY8JUC5VBndSPfauZtykmRZKQYZvLNa0BRKdsenWhDK4\/fkaUloTLeEjPEIs8tdKb0X6NHxO2zwu\/dxuksSqfcsT+WK4\/Gjx5P8mXbozEq+fyrsizQlaTPBMrAnwnNaP5HZtLabvLcNFsJRz8vOvF83DwnzXTIaBnbD6Ryrm9WBONu8k9AKX7UJbGES58XyFc0n6HeylzqlYjcCt8a0AZCpM0XoTz9jXZ48v7z+hcP3IRdr5d7WAern9B+9dsFqzfPLaiMOzkPd8MU4+Mk70MvCtWM9OMn86k2YYWFnaEHaeZfFnmqdB89ifTArg83PX91H+pxZp8nS6QsZttW+a89L0Ygjt3hVAfi5+1dvj4+c0v8AMZEA3FyF5L+gFe2nUXIeOPKVDgEjGk4A5VzHorRwsx65FJgR1t1NIZ0Ow6mqEfd4fOpHZ8JWA5n60xaPjK3nTt9ASW4lXGljn3othotXiE64Ac0chUXx8YuU+GWRf8rEVXKhcbC4u0nEVHhvbhfZzTU36YuK+A6DtjxaMjTfzfM5q1ll8k\/TQwg\/iBxZMargN7qBVrNL2S8aDov4i8RHxMhPquar6rF9MMj\/AIj3h5pAfXBp\/VYnjR+aVYImnHLnWtewsgrb5PPG3oKQzqgyHnSYj47HYY9BRQE48s7DpyNMC3c6ccyaljCbQeOUHnqqsZy5U+QLfR4XOOVXX9DOOxdK2qI+3nT9Fp7FhxnFBocGxyM0AEB9WN6zCy5BqAU8z51L0JlLppO3KtQKCPFzxtTT9AQ9frT0ARbtgA7bVL+RoYX0quESPYMoZwPPyrOMUvuBlWBGoX8R3P8AapnIzsYcI\/8AXRD5VlVNE2TuRiVs1rXyNOgaTGT546UIbKoviwfapmLvRdwbe\/iyR8Y\/WjI3o0ZsuLxj\/wArGQc5Jl1e6oR\/auTHJfS\/\/sZLUjHyLgeWD0raD2UmVtGDnG3pmnypaGnsd9nbnZ7ZjzGU361n5EPqwddrYWFXJ0OTXmQV9kvRdYjKZPNqjLpgM\/hT22rjqxsqhGpx710w6DoPt18S79CfyNb+LTyf0Lx\/uRju0Mvf8ckUZxHiMY9Of616KdKy8jubNfZR9zaQx\/yoKH2dMFUUHWka+KaUZih3IP4m\/Cvz6+gNZZcixwc2RmnxjrtgV3I0szMx1EnUSfM14btybfbOP8AUrbc+fX0rSNoKB9emJmz4nOBtyFez4mLhG12xBvC4dMRlOxfl7f7\/AErfI90jswRpcmGHNZHQtHxoaAjjHlSGfU+2L+Tm\/XpSA5+tAHDypgRPnmkB9nlSA+z60DIlsH3pbQvR8GP\/AGpptCJd565qrA73mPKnYqOiU\/zVXIKPOch+YOOZzXd7MT748joOZpNAXgaUOeQ2qf5BJkNyfnin\/Aei5E0kDz51PasC9Fy48sZpd9D9MItB\/wAxIMbEA\/tV4u2c2dU0yviafd7c61ZiuxBKcA5FBotgLc9\/qKCiHXPKnXsLLImwMEbc6mdAEIdxtvUMT2fSuBOVONLAfOnFa\/gEqRXNGVAIzpO2f2NNPY31ZSRk1evQycOc7HnSdNCsY2EJlmGQSoNZN\/ApSDuL2fdFZ4h922FYfyn\/AFFZNEIr4U2L+Ek7Bsc\/Ws5dp\/kEFcQXTcOD1rofYAMh3O1KhlcWdftUz+RMu4P\/AOtiwBjWDSyu6Lelo2N+S\/Z5k\/CsqyH5qy\/rivJwTbjOH5TJrZlHGV9xyrui9iIxjIGKTYdFkLm3uklXoc1pCVlDjiTDKld9W6+xrh4cZtEPsLshhVrkyOm6GGyHEZHrsa5ktjJW4wTjoK3tqLQBqEJlzsEQsfpW\/hq5t\/gvG\/vTMPw9TecUDNuZJNX1Nek\/SFFts3yxSNC8qIzRRnDOB4VzyyeQ+dJW+jvbS7YJNxu2biUPC7VBcQrG5kmDFfGQPGvmBjG\/QVl5OKDg3P11\/wAnFO5XNlMrZIzzx9K8NIz7A521HQB8XP0FdmDF9SSXoLIQobq4WNNk5ZHQdTXtJ8V\/sVCPJ0h6FAACjAAwBWPs9DRw0h9kTyoA+3xSYEdzzp\/yI+\/SgZ8fypICO9OgONyo2K6PgM4pd9gRIyKNAQI32pdMf8HBnlv8qAO5+lMCBOPOpYI+1elFgYAgsSBsBzNeozmLYkIwfOp7Y+iUh6bCgNklGSSM46UvwBei5O+221TYdF4XxCkxlq+CWNz0Ok+x\/wBcURlUkzLNHRPiK\/dZI+VdT62cj7Mvd+Fjil6NlQCaL2URPn6U+wPkJBBHL0oq9CCo89OfnWUq9g\/kruxlUYZ22qod0hWWW0oZDkDOMMp6inJcRshcRd2QR8LfCaItMVn0IywPlvihjRoeGwhEXP8AvNZpezKbt0xozR6jFMAYZfCwoaXRIllgaw4oInOcMCrY2YdDWE7iU6aC+LDFy3pWrYR1sXORgigq7K4RljvvUZNkvRbwkgXkR\/qHOjIVJ+zbhO94fcxDJ1QsR6lfEP0rw8Uv75r5AyPMA4xyr0V2T7IxEDAxz6U5Id\/JORdSHbaoTqVsEw\/WZbK1YndSUPy3\/eqzR3yBjK1OFHoM15mTsFsKkbKryzWMNvYwi1HnyzW0k1ED7i8hi4VdFN2dO7X1LED9K38Jdv0NOjO2Drw371AktzyUkZVT6D8R\/wB711SyO6iJSfou4rdXbw6r2ZmlI0xwgBQgPmBt5bVUZW1Gy7tl3Z7h720bzTgd7KPxcwv+tcXneQpf3cekEnehhcNgEmuKKvRFAUj4XOfG\/wCQr2vGxcY\/liG\/DLfuYAzDDvufQdBWs3bpHbhhxj+WF8\/SoNrs+35cxT6CzhFICLDNKgOAU6C\/k+0+dIZ8BzyKYrOEDpSAgQaAPhQHo+PI0UBAj6VLWwI48qdAiBGOVTuhkTnnSoZ0nbH71Viow0MbsdyNPWvSbOVljMAcDYCkUV7sdvrSbGrL0Q7DnjFJ9gqCVUY386kf5L1XxBuvSgRPuwyFTtqGKn0J77OvmW03+MbMPUV1QfKKZwyjxdGY4guCd6frRcBc3XGdjTRZDlv\/AK0AffP8qYBFu22Kzkq2DLZEDxsu3LIqE6EARv3MoIzzwRjpW\/4GxooEsbR5BDbqfX\/e1Y3TsllVohMmnGP2qpMZpLcYto2I3Y5oRhJ7LOJBjASvxKc0pKh3sCvbgT2lpIf8RCUPtWM1or2W8VbU6t0ZQfyoi7iqBWLWPh\/tVDsjBjXvjGc+dRkTYnpk+GnF0hP8wFPKrLl0b6zcLKmvkGwfY\/8AevnuXHIpP5JZjtGFxnYbV6a\/cSVRczvVzeqD8hIXOV5Cse0HQRZbwzRHcghx8uf5GtZSbhZemMrc+FjvvtXmTEgpz4gDms4bex\/gLthtv7860yriqYdi\/j9yS0drHnOe8b9AP1NdWGLjD8sl7F0Mi2xBTDTfzDcJ7evrWnB\/9pSTGPD+H65BdXW\/VVP6mufPnUF9PH37Y260g+V8KWbmf94rgUbYgCVu8c5PhXdvfyr0PEw8ny9IWyfDYTdXZd\/gTxMOnoK9RtxV+2bYocn+B8M5yayOw4OVAH2AKQEetFDsiw25bUgI5pgcJz51LA5k0D6O74qrEc96QHBjOOlCA+IpiImk0Mgd\/ejYEW26VIEcbYzTQzh+VDsRjB19K9FoworHiG\/TaperAvRAQOdEiqLYwPzNR10HwXY8WOmcUVphHZeo60pEouUDu9XUCnQ10QAxclR8Lrkj2OK0xKrOfyUtMz3F0A7zHQ1o9Myh8CZhhzVGtFZOR7UCPsU6saRKA7gdKTRD\/bYWjHAO2SM1g3cqBIBulCzHHma6I\/tQ2GWDExA53XlWeT4Bdh8CAGcjYhqn2JqkOjtbxkeVP8mJObxRnPWOrlH0THqzPTsRIF6fF86yn0zoroaXniit8nnGKyxK4maADuregrX3RbRyHZyOnP8AKs8j0Q\/ghZNi5XGPiqcm4lyN3GxB6dK+eybkwXRlzt9RXqNezJkYgPEPInFVOTuhlyDce9ZyVRsbYTZ\/+sQeZKn2IqoP0W\/kMtiQvzrhmTe6C23lXPv+dRhVvYxhb7Ln0q8\/oBDxQ4uJ3\/FJIyk+gwABXXi2khpFvA7eN3d3XUUGwPLnS8ybx4vt9lPSHcjFYwR1GTXkdEAMpyD6cq2hsPQEzHRGvQrrPqa93BFKCSJTtj\/hkSxWcenm41E+tOXbPRxpKKoKNQy0cbbFAM+HKgCP4aQIhS9lI4xwPlRLoSKzzx86TGdWmhHx5c6EBHng9aOxneYo9kncbUwI0ARB25CjoD7Gc0n7ArPMCkP0QO4pDR\/\/2Q=="
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-metadata.json
new file mode 100644
index 000000000..a11bb0d5e
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus eaque totam provident obcaecati nisi praesentium iusto velit fuga debitis quidem ut repellat corrupti, eligendi inventore quibusdam perspiciatis delectus omnis pariatur excepturi quasi fugit? A adipisci natus nostrum, qui aperiam, at culpa corrupti autem enim earum vitae. Nostrum et officiis facere ex recusandae tenetur, delectus odit provident soluta id perferendis ducimus quibusdam corporis rerum voluptatem architecto sequi beatae quod mollitia voluptatibus earum tempora inventore ut. Deserunt reprehenderit recusandae nostrum, eaque fuga cum, repellat, perspiciatis ducimus in non consequatur ratione. Sint rerum necessitatibus deleniti odio earum voluptatum eos modi ab dolor minus.",
+ "Image": null,
+ "Title": "Document",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected.html
new file mode 100644
index 000000000..9ed1e6256
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/expected.html
@@ -0,0 +1,11 @@
+<div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of Metroid">
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus eaque totam provident obcaecati nisi praesentium iusto velit fuga debitis quidem ut repellat corrupti, eligendi inventore quibusdam perspiciatis delectus omnis pariatur excepturi quasi fugit? A adipisci natus nostrum, qui aperiam, at culpa corrupti autem enim earum vitae. Nostrum et officiis facere ex recusandae tenetur, delectus odit provident soluta id perferendis ducimus quibusdam corporis rerum voluptatem architecto sequi beatae quod mollitia voluptatibus earum tempora inventore ut. Deserunt reprehenderit recusandae nostrum, eaque fuga cum, repellat, perspiciatis ducimus in non consequatur ratione. Sint rerum necessitatibus deleniti odio earum voluptatum eos modi ab dolor minus.</p>
+ <img alt="Illustration for article titled The Spectacular Story Of Metroid" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w" srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w">
+ <p>Quae veniam recusandae vel cupiditate doloribus pariatur, dolorum saepe hic quos mollitia harum nihil molestias magni modi maiores? Ea accusamus velit vel doloremque pariatur voluptate? Consequuntur dolorum fugit facere architecto eveniet beatae eligendi rerum nisi maxime, voluptatum a repellendus perferendis dolores eius repudiandae accusamus animi eum esse adipisci voluptatibus incidunt necessitatibus! Adipisci id, quos libero dolor odit dignissimos et, cum explicabo est facere aliquid mollitia! Iure nihil nobis beatae quibusdam, dolor saepe reiciendis, exercitationem hic accusamus quasi commodi modi molestiae ipsum, maxime non nesciunt deserunt itaque quo cupiditate rerum ipsa ad minus vel quod. Earum dolorum velit aut minus hic?</p>
+ <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M512 512H0V0h512v512z'/></svg>">
+ <p>Quidem nam tempore ex harum repellat modi expedita quia rerum est ut ullam, quisquam repudiandae at dolorum. Sint atque fugit facere id blanditiis dolor omnis rem repudiandae, laboriosam unde delectus illo voluptate dolorem consectetur rerum expedita quas debitis deleniti iure amet. At sequi distinctio facere eaque, esse molestiae tenetur, unde sapiente fugit minus eos ex aperiam atque? Animi soluta, dolorem sequi doloremque pariatur in. Impedit, voluptates dolorem natus perspiciatis pariatur eligendi labore rerum facilis est error. Illum eveniet nostrum atque nobis molestiae expedita perferendis, esse ullam corrupti sit explicabo beatae. Sapiente aliquid nesciunt reiciendis incidunt cumque et officiis minus aliquam?</p>
+ <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTUxMiA1MTJIMFYwaDUxMnY1MTJ6Jy8+PC9zdmc+">
+ <p>Veritatis sit nostrum officiis alias ea quam nulla veniam eos, quidem nisi, magni molestias ut odio. Ea, mollitia nesciunt. Maiores iste quos quas sapiente sit at esse quidem? Laboriosam fugiat nobis voluptatum reiciendis aliquam excepturi ipsum? Perspiciatis expedita sit quod, optio assumenda veritatis culpa, neque explicabo distinctio facere incidunt magnam accusamus, quidem animi delectus doloremque vel molestiae a quae dolorem. Sit, at? Numquam possimus animi esse incidunt quos quibusdam. Ab sit eligendi laborum beatae maxime suscipit, obcaecati enim cum nam autem, dicta nobis corrupti ut aut nostrum ex excepturi perferendis, soluta veniam. Excepturi beatae suscipit enim dignissimos! Quam, esse praesentium!</p>
+ <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAH0AbYDAREAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABAUCAwYBBwAI/8QASRAAAgEDAgMGAwYEBAQFAwMFAQIDAAQREiEFMUEGEyJRYXEygZEUI0KhscEHUmLRM3Lh8BUkQ/EIFjQ1glOiwkVjgyUmkrKz/8QAGwEAAwEBAQEBAAAAAAAAAAAAAAECAwQFBgf/xAA1EQACAgICAgEDAwEHBQEAAwAAAQIRAyESMQRBURMiYQUycYEGIzORobHRFELB4fAVUoLx/9oADAMBAAIRAxEAPwD1G3lC9a8Hjs4LLnvCq896HAdgzcSKnGalx2FnW4lkc81tGArKDxI6uZFOcPgEwqG/JxhtzWPFpjCBe7bmjaAsS665+VJx+APpLvbGcVpFfImCi7wTvV6DYRBcvnc7VLiOw6O6x1rLiUmfSXy43b51Sr2Ps8n/AIiTifi5wSQN9/aujDtnXgVI0PAgV4ZAP6B+lelDpA+zPdvT4I/Ws8vo0xmGxmsjcLsB/wAwtAUP2+GpYkCSjfepsYou9pjyqwZCmxF5yIIzvgvil3sAgZwKoCQNKvkR6H/CJ8cQul81BrfB2zHN6PY7XwO2SNxS8t1CzGHYbzVfKowO4JmjAL9iWORgCtWIS3rpHkkgnGSOtIDG9qiGvLfG4NZ5PRcBhaDEK+1UiWScc6YCbivWpfQ0Hdl1LSYAJPPYVpjJkaiOWJ5AiTQs+caRKufpmtOSurJ4Sq6PP/4n7r3bZB2GOuaif7lY10egdnLsJwCyGRkRL+leZmVCTCJb4E7nFckk2UVHiEaHJPzpK0FnV4mhOAarfYrD4LpXALeVWmwsm9ytQ2xlbXaBSM1DegKWvEJxkVkpjKheIpO9VdiPpLxG8qmxlcd4A2CKFkaETmvV0HcVSyWApm4npc5PKtI9gVycR1dMmuutEXYG96wf1rKYrC4LxicsaxeSh0Evfrp3xmnCbbHoBe+yxwNVdUc0kiXFMQrcELk4Hzo4HHZS96GYgZqq0AHPMc8z60kkBUkzBcA7k1URIr786/izimAbBd4G5FQ4XsZyTiHiCqaniUFW15k75J8qFGwYW0xKZ5U3DRNlYZsg74ppUFl6zkHYkelOkFk2uiqnVn5UmkNFPfaxsazcfZaZ572tbPF5QeldGPo7sP7TZ8G/9uh/yD9K9CPSJZm+3vwQj3rLL6NMS2YnArI3DOHj79aTF6HxG1SxA0g33pdlIS3I++arQyFUSFNHmyQgcpKliZbp2GKY+ztAqNr/AAuk0cWnH/7efzrbC/uMsy0ew3kxS1DA7nrmp87/AAWYR7Gtg5e1gYncoDU+N/hx/gso4kCVYdcVuwMle8O7ziH2nvHyU06TnHvWdK7Az3aRcX9uo3AFTk7RcRpaj7oe1WiTr9aQCXiekBnlcRxL8THp/c0m0k2yoxcnSFqXk9xEYoiYLQnZV2Z/VjXBk8iUtLSPQhgjDbVstj4cjKSM5NYUbcgPtCZb7gZjuCXuLMgq7HLNGTuD7Eg+xr0PGy81xl2jh8nEovnHpmls7trfhltGzY0oBzpZ4qzz72yM3FMnAbeuZ40WVy3bSLuedJxSEGWhYKCSdq0jEQyivsYXNEoWBa9+qJnVWTxhyF8182SdRxWc8aHZQ3ESE3ORWPALB/8AiX3nifw1axsakEHiSso0tT+m6HZWOIrvqaspY2guzk3ERpxrqIQt9B0Kbq9GQxO2a7seOkS3ZKG7IX4se9NiRclyHILEE1lNNdD0EpcgHANc80CK5LhjJsdjXRGOrQrCLZtWTiom2NMTSgjbFd9HCDDCEnH1pUAHcXBBIANGwBzIzEAHc+VKx0WrFhck74pAUSOynnsfI07GVLPpPWnfpDoZWMraQSd6VEsYJdquM04iLY7xG5HPkKdUMuMxK7Del/I6KCXZwNxUsYbBFgb/ACoSoRgO1i6eKyE9Sa1gehgf2m04UMWMP+UfpXcukSzL9vjvCPSscvo1xGN61nZuG8NGbhaTEx6/KkwQLN1zUjEtwPvjVpAcxTEaHgnDhfcP08vHnNT2hN07NBY9kheSd3HIQ+M8tqqEeWiHOtnb3sjHZuFnnYE/yjNKbjj/AHMX1Ars7Fa8Fv8A7QkrvldJBWlDPji7sicuRqbztDBc2YhhDagc5O1T5XkwljcURW7N3wJtfDLVuvdr+ldGBVjj/Ayd9uTWrAT3WN6lsDE9oRq4rCOorKfZcehtAMRD2rQkquJFijd5WCooySegpP8AI0r0YLiXEm4pebErbRn7tPP+o15+bK8jpdHqYcKxq32G2hxp/F51lRbZorNQ65A3HpTogBvYwZ2wpyQVI5jGDWmDWVE5leJ2UX6utvCqtyUbV25ezxb2xdCrtL4ya55peikNFUAqQx9qzdIdDKN27vIrSLRIHfXzQ4I6VtGKZLBE4kZB42YUPHQWQueIADnmuacQsAfiITmTvWUYWxlX2zPXY10Rg0KyP23usnJwN6mUfgdlZ4m8nwbGolj+R2RF8zOFJyKSx1sZfqYpnmK3g6JZRc3xiGcEDrircExJ7KrfjBJVAdiedYTxNFWPre9BjB5msPphZyW73zvVKNJiGVldju8nrWcuykwcEON8YrsVeziA5sasDlRfwL+Sl4VJO1T2URiswZNWMY5CmkgLbiPu1waAsXzsANgM0NjQMulyc5232qbG2Eq3djw5IqbbdiBp55AcrzNWmPsZcHdn0ltz54rKWWSNVBGkihVlydqSkNxKZ8IRyrRbM2iSy4XbOKrsgwPahtfEm3860iejgX2m24dtaRf5R+ldq6J9mS7eH76IelY5e0jXHsyYwCMkVmvg1GHD42juF7xWTIyNSkfrTqg7Q7ZcjPSlISBJ+tQUJp1xKc0xsiKpCNz2NjP/AA8EDmxoijOb2ek9mLbQHkYb4xmunGqVmEnZlu3ErrxDGpioGMCvO83ckgMk1zIXARiPOudQVbFYfDKyxnfOBWU0Fnt3Z7I4NaE//SX9K9vCqgv4GW8Q1lMpgn1q2AllMp+JRUgJbzh6y3KysPEKlq3ZSdF2jSgFUIwPbTjOq4PDrdvCu8rDqegrk8jJ/wBiO7xMX/exHaHqRXMonVOQ1tpPGM7USEjVcPlxCM5pJiaBbp1a/QAkMQc/Q1ph/wARE5v8JgvE5SWQDp1rvyLZ4SFkc6mQjOHFYTSRogwyFiM1jJehsa2zZjAzVRVEMX8VjUoc861TJM8co432rZNUB9dXCpHkYrDIrEL5py3i233FTjiaJUQil1EYO9byaSEy6VWcZHTpWSokoWPUQeQzVPekMZRQr+E561L/ACFhmtQqjyrN2h9iviTKQ2kfKrixELez2jZQT12rPkytDy2XCeMEfKs3foGGRRI4xUtEhCWwQdR7VNWMrBGnblXT+TkOqo8v71LA+WNdzRYEmdYxsRmqAX3twNLHO3l50x0Ibm6UyYPPzo4lpUdtny+wPvUMQxSN3xtUokl9kDfFzoY0xrw+JYsE7HpUOJrGQ1NwiL6+lJIqxVfXoycVrFMl7BResoGMgVolaIMlxaTvL92J5mrSqz0cP7T0GwH/ACsf+UfpXb6MjJdtlMl7Ci7s2APc1hkVtGuP2OLe2i4KgtbEBbgf41zga2bqAegHkKw8jyHjfDH/AFZ1YcKmuczksvEEbVHeXRzzDPq/I1zLPlW+TOj6WN6cUByz6mP221Rl6ywL3bj3Hwn6VrHyL/ev+SH40f8AsdAd1aFommtXE8A5so3X/MvMfpWqSkrg7MJJxdSRmpd5jmhAdC+lUI9M7BW2vg8LY5k/rWuNXEwm9npPDoe7tSB1FdC0jH2YHtqNV+3mK8ryv3jZk4lCncb5rnbEGaS4wFOMVm67A9x4KMcKtlIxiNcfSvcx/sRRdOd8dKpgLZ13NSABOm9IZnO1nFF4TwqSUEd8w0xr6+dZ5J8I2aYsbySo8fhLTTtI7EsxJJ864Um9nqtqKpDiE6QP3qzPsacNUySDHLrtWMmzWqRpJXEVurDYVMtIlK2Lra4abiWV30RtvWvibymfl/biZXxQMkmCeVd+T9x4cTPS6zc/d86m17KQ7t4XVAzE5x1rCbsZKS7eAHeskIX3V5LO3xbe9WpUKgOQPgajvTWRoKBZoJSmB71X1LEBTpKuxHhHWqjJFp0XWQzsRjyq3slhTlQmG/KpSYvyfWzKWIztWnGtkvZN5jGcgED1pSQkwWfiDBsHpUfTstEYrhLmQFwB0xS48dAajhUSOo5elc8tFoayQoq5NRuxNFEUkayZotk1QxWSNkG4rJyoaQn1qF3NdhyHUmXUN9sUUBTcXaKnP60NAJ7niSq2Q/yzQuylFsWXHFFfUoarjE0UAeFjMx5GqaBqh/w+AADp51nVozbHMSgcuVS1RJ8xxvgYqdlA094sbYPMVQ0CS8VGMaqfHZZ2KX7QQfzptUgRc1uWA0g5qeQzL8QGLxuu9ax2jux/tPRbIYtk9hXYZmU7UuI+N2bE7LIh/MVlN1JM0xrTHQHeXTSMMFiST65rzctubbPThqJdcxFRkDNRQXYlu3x8OVx/MMigpCw3HdyiRHMUq8nTl/2pxbi7TLaUlTKbi3ivzrgVIbs80GySf5fI+nKuqGRT09P/AHOTJhcNroWlGRyrqVZTghhgg1ru6Me1o9f/AIdQ/wD9vWpIG4P6104l9pzTf3M3cY0wVr6MvZ5t2vDPxCQLuDXjeY6yDZnhasrA7nzrm56BBSkJGcc+makPZ7fw8EWEIPRF/Svfj+1FH0tAAE1AANxtmpA8Q7f8aHE+NtFC+YIPAuORNcmWXKX8Ho+PDhG/kWWWFXPWlFGrYWkoJAzvSlouCs0XBQpYdPesGmzRqkEcd4ikYWMNudqznvQ4QfZXwZWZJJs/hx57ZFdPiL7/AOhy+c/sou4u5+0EEcq7MqqR4cWJ4sNcgkdayekUaK3bMRBxWTGLr+Ikkjf2rPVgArFoPw02yb2fZQnG21RdASwhwcVSZIFdhNRG2DVReykytURQCMVrG/QmDy88jz2FbIVledCk1doBfdTlgRqp6YJUVhTJvvmjjQ7J20fdvuSOopSj7FZruC3IjIVzvj2zXn5O7NExpdXZ7rOwNZxexszrcSVbgh261uoNohh0fEYlAIc1jKLDoIuEYE88V01s5QN3aIczQJCq/nY9TjHKhPZaQkmd5SdsdKtfJoigQvnJzV8kWgvh6vG4z0O9S5IUjRWc/iAJ28qhy9mLQ6SZe7/es3IEime5JGF2rO7KoU3RLvyzvzq4utjSOW9gWIJ671LyM0pDy0gWJRkelLnZIfFoI23qokswvETqv25HxfvWsFo9DH+09Ds9rdfau4zMT223vwOuBisMvZtj6G3C7pHt4ZSSS4GQfPkfzrhzJKVnfidxoZzTd6pFZ6eijN8TLIxwG+VI0QlllJJzzq1voCj7SVODyo4lJjGG4h4hpivJNE2MJcfoH8x68xW+PJ6n/mcuXDX3QPY+wlq1vwC1jkA1KuD1616ONVFI8yf7jVEYiIq30QuzAdp1UcQJFeN5kf7wJCKSVRnHOuTiIBuJApXzJo4tbGme8WJ1WMJON0HL2r349IshKeeKAAZaQGW7b8QPD+CTuhAkkBRTnG9D0rKirZ4EqsbltZyxOc+dcnCmelGWhrHjSM5wD9aqg7eg6zRS4DbYrObo0ghzJeQ2Nt4WyfKudv4N4RbexLAZLuZ7iYEqOQ86zOhr0PuzcpuJnjU7Ig5erV1+IvvZ5fn6iNuMW7GXNbZZfeeItGdKtHcjGfep5Foe2utkwRWcmIt+zsTnBrCTAou4NKE9agDK8S71CWQ4Ga1grWxaBYuIOgwTnHSreP4AKt1lu2zp+dJPj2FB62DrjX0rojL2JombMMMYolOhIEvbJhkqNv1pLJYPQjksm73DDrWymkNDK24ecAnGKHmQqLZ7FVGFFQ8pNFtrb6CDnOK5pzvsot4g7pCcE1EUrsdsyNzKROdRwehruxtLQy6C50jdsH3rOaTCjeXDEjV0NJo5BY+CSDmoeikC3EG2+aEMHSx1AtjbzqWyrLouHADLA5/Wp5By0VS2mh/CMetPk/Ycg2xtznfFNMQwY6E35CmyRReXmJQFOKhxs0ii20AeRevrQ4mi0P440WPpmsuNMTZXPKqpscH0ppCB47g9DWq0FGXud70/5/3reL9nfBfaejWv+AvtXYYmI7Zf+5fKufJ+43xdAvCbjTbvGxI0NrHz51zZo8o/wdmB1Kvkci+1SDDbVx2dPEvukjuIdWAaolaMnxFdDsBtVxVlitnJ2Iz7VolZn0RaVoznce9JxaKjJPs3vYPtw/CmWC8LSWh2I5lfUVtgzOGn0c3keOp7XZ7PZ8RteIWYms5klRhtpNejakrR5ji4umecdrbh24rIkKs7LzAGa8zyMbnkpAxZa8N4veyFYbC5UDmzoVH1NC8ScnpEDSLsXxW4lBn7mJBuSXyRvyrReBNvbBaZ6vDeW8FsiO4AUYHWvQWOi+QDfcatYOSu+rkeho4JdhbZmOO9qlgjAjVcny51Mml0XGNnmvbzjtzxaKAqxKJuUG2axlPkjeMFEycSF3U75zWDZumMHLxp5HFV6NItXs7HN3GDIxZj05CspQrs6oSvSOwTyXtyE5qOeDyrF6NaQ04ncw2sccCsAcdNzWe2JSpWzR9jeGizgNyZFle5ODpzgCtsNxkji8lqcWNeIyLq8RFaZf3HhIQEI91jpWb6LHVviOPapexNnJLtVyKOAWCXFyrLms3GgMxxVg5Na40L2IGBEwB3BP0rrcftBM2HAI0EQzjNcE9MtMaXEqxqOXKtIvQMChnUsQpHOlOfySEyR6kJAztWHOnoGKLqERkNjka2jkvRNUCfaQnX0xWq2UkXwTJNzYVm20KgwRoFBXY1k3YCnilwUBAGa2grEZ10719Tc66o6QW0VNEUbI3HrU6KTNc88rEAHao7Obor1MviyaTKJrKGADUkIsjlXcE0pIGEiRcZGc0uIimU6vKk0NHYiVznnVRfoGRuJW08s58q1aEgNrXWdRx51FlxdBnD4cNjOwpqPIuxtI6JHjUM1osSJsUXJLvhDzrOUeI0y/BEQ9qzLEE//rjjO7/vW8ejth+09Ft/8Fa6zIw/a/fibVz5f3G+LoUWUvcXKPtjOGz5HY1HRqG3iNAToOpTuuK4pR4to9CE+Sslw7jCAd1LsfKpiU4X0B8VdZMspH1rSP4JbpGfkkQMfEufcVtFezCTBJbtk2H0ztQ7XRN/II/ETHybHsani0y+Q57O9rbzh12j287Lk777fMVvBtO0YZUn2e4cI7ZW91aQTtpEjjfIBIPvXWs2jkeEax9p0mDd1ctqHIHBFUs9kPC0EDi/2lMyMwPkDg1pyvsjjQtuOKxxl4jJl/iVnochpGf4l2piaNkfSCGwy+R86xeQ0jCzMXnG47sMHOGG2c71m5/Jqo10KZJDjbEgPUVm/wAGi/JyIBTkdakdhvd6sHO+NvT1qkxWKr2B4vvGA35AfvScfk6ISXou4fcNa4d/LJxsK58sWdEJJoDadrm9aR84LY9hWTXFUacb2bvsbf6LsWZfKEgqD0NaY7bo5c6SVjniKt3hI5b9a1yPdngoTRAifJGd6i0yhg02lMDbaiiWLppJNecU11Q0C3Vy5TY70pQGLJXZyc4NKNIGgFkUSZNdHK0QNrO9MOAu+3PNcs42WpEOJ8Qd0JXfHlShD0Mhwu8RpvAzct9VVmgvQro1ttcKY+eRXC47ExZxNw5YLitYiE/2N5FJPWtlKirRKKIRkg7Gm3YFjz4GnUKhoVAN2C6kE52rSA6FgiKyYzvXQpaE0EMqhQGAzUCQ71LjlSUTnIKDK+kA49qqMLYWfTR90K2WKikK2uSpORmplCh1ZZb3rFgDy96ngJxGsBL7nfPIVlJUFWGIjHbG1OAEZIgCM4rZv0Kj6XSF2rBgBmcQnIPOtcb2UkWfahJGVxlieeeQrqi1QMKtLcMMtvXJl2Uiy4j0jpisUirM3Nvfj/OP1raPR3R/aeiQj7oV2GRhe1u/E2rnyfuN8XQlUVmalnFLh7e0tJckxsSp9CDWGZLs6vHl6KLu2W7gE9udMnUCsuzqTp7M/d3syKY5SdqqKsznIST3IJJ1P/8AEgV0xic85Udgl7xMGfB8pFx/91WoqjJy2cmglBGtCBzHUH5iji49oOafRclvltcYLEDOBzIquNoz5fI64ZeTIFRXOg8s+dAWazhnE3ijOWwCRkZ5UfkOxwnG5EfJkyOYINXbslxSL5+I/aoI1lbOds+VaRl6Zm409Gc4jwySaV9L6mXJxnnQ0noLdCUW08QAkTY8j5+lS1RSYVYBlymSM7gHfFZtGiY0gTVGC/MHFKgsOtlyc8ydqEBOa3WRGGOh3IquwTFd/ZsEPdrqOnKjzP8ApUyiaQmJbtu4ZYl3ZfiYVzyx7OyOW4mh7ALJc9oLcLkqpLsfIAVeOO9HL5M6g7PTLmIE1lKWzx6Es8ISXI86yUtgVycuVbJ2KgGdjzFapIYrvNQOd8elOXQXsEVdQ1ZO1Y2JgV2zE+D51akLRZw9WcYYZIqJumNh8sHmNqmwT+SFtAI5CVXbpSk77HdhxujFH4c/SsqtgCrxHUTkZpqAnsNtJwyYxTkmgTB7w6ck1UJWFCSSQiUHoNsVu42hh1u3fZHSs3ofRXeW4G42PmKuLsYveXxaWG461pxJod28wKg+dUoezChlbMgXlg4reEaJBb6TUdPStqvsaEd4pZtK74rFtGqRG0tWWQM+c+VZSY3EfWj6cBRmsJOzNqhh35jTPn0qOmTSIRSfaJQFHXetIty0AzXh6FR1NdCxKhoEuuFA523rKcePRa0LfsZikGCee9ZxmNjKFygAzWzjoR27nTuvWocQ7MuDrvkPm4/WhI9CP7T0aL/DFdlmRhO1f/ub1y5P3G+LoUAVHo1oZwwwXvDms7oeBicMOanzFYZUbYnpmT4jctwK8a2ilM6rzLDHyqFV6OhSbRnuM3qTvrUbHnW2OFsiTpCeS6WNNQBI9K6VE55SPkvEBXc5IzvsKaj7Jsd8Kve7bCqrRMN4zup+X71NuL0TJWNAYZCPsuF1f9Inr/SfP0O9UmpdEO12BtcNr/lkQ4ORj61DKQxtXZRKutvENQ/f9apL4BsY2yyNju8//LpVKhNj2xVkhYDBfnvWiM2yE948bq4csUOCfQ0mNF0jxSjJJwTnGMij0CQP9ijILxE86hmisvjQ6EAzk9aXqg9hcS6ccqTXoYfCgPpmhMRC5tiRldmGwzTsZmeOcL2Bt4yTks5AyamSvo0jOuzVfw7tfsVg1wygGdyuSNwFH9zVYo0mzm8mV6NK90GY4IOK4pq2cgveUSTEczWCWxUVXCkYK5NbxYilLaSU7g1o5UM+m4ZlPFms55BMhHw1QMY/KuZ5BUA3/DlAOFGauM/kTQHbW3ckYGDmrbvsEHlA4GrFRfwOiapHyyAaG2IrmhBBGB9KV7sPQrmsijhh9K15DQXaZGFIAIqZWOgie21pudzUxdMBPd2BTOcYrphILKrSNoW35U50xllxqUZOCvpRChWLVh7xyQM1vJohslwy6Rzhmxit18CkqHaXkcce7Va0RQumvu8n0R0O3opIKtbYPuxyayZZbcRBMEDArFpisqW5ETVnSb0JkjeaxscGqWN+yGg3h0+ls5AzVwXFho0FrOWXmK35oKLmkVzjOcVx5sqei0qArpF5gVlF2MS3s7R7DnXVF2iQaN5JjvkD1rOUkil2CW+97H5d4P1qkrZ3rUT0ZP8ADFdbMjCdp9+KSe9cuT9x0Y+hUKg0GdnE7WMzxrl4zqH0pOPJUOMuLPOOJyl5pTMS0mTkmufjTs6lIz96wLacn03rrxxrZnkYNHHpBRs4blWrZzlos2JUZJXHzpOasGg+xVokCnmp2NZylYJUqCGkIyBuD0IzUp0Ohpasl3GI5ziYrhWbcj0J6j338ieVdCd6Zk/t2hhaL3DgSLkgYBB50JUNOx5AY4vBqO4BBOwPrT0hXZOe67t8Etttt1piALiXKtJHsSM4J/aixq0fWV6GjbwjCnl1HrS9j9D7hWJreVVPiHiHmaHQrots5leYpJ4WHQ0IbbqwuVlhk0gjelIIuwyz8WOX1pJFN0MntSAupeflyNDjQlKykWIkbSU+KkgZr+EcAA7LXUNuh+5+/i6nP4lP0rpjFKNHLlbfZiZWKu2WNefPbMvRXZTFpjvyrDjsY1UaiMCqJegqE6TyFTIVn11OgXpWM0xAizp54rBooGvHRxjIrSJItmIAPI71pQA8twAB0NCQyv7SBudzVBROO6DNjrSaa7At1qW35+tFWIqSQJN0I9KbstbGCMHVTWSsQBfgYJJ2rog9EsBWNpPENtqpvY7omtszDxMTSsQTBZrGOWc03KxaPPbWcxsa9RGj6HNlHLNu2or5U20tmbD4LUi4yBjFZ82ybG8OEB23pLYmwbiUjBOtZtOxoz8ksivzNNR+Cy6O5fG6Yq1ohoMs5HLAnI9axyP4AdwXTovxVwzlL0UgmK80jnvUbGTe6yuSdq2x66EL7hxI21dPSJLIlxE22+DXPLbLQts1/wCehH/7g/Wt12jvX7T0VPgFdhiYTtL/AO6Se9cmT9x0YuhYoqDQ1HZO3aYOirq1HGK1xK2Z5HR5z/FDs7cdnuOyrJgwyeNGXlv0pZcXCRphy8kYGZtTcyDVKi27LIJVICOAd9h602iLGKBe7B/2KxYzvL50r9AfKmttgfpTW+hWOLJNRRieW53wa6I/kzZp4ohdW4DRqrjfVjmf2rXtGT0Kb67eIRRMA2jcY8jzxWbZaGrsk1qCpBYY3zSsdCaZ5I3K/h50N0UD2U/dyuoI0n15A+VLkTZp+BXHdxqDjwHfO2xobG9kuKS91dxyxnY9c4+VJscV6Jy38bAyuQAKcpCUaB17Z29k2B3hwceFc1Km70htI1fB+2lrcKizxMI3AOwyceeK1U2tNE/TtXFj214rZM6ssmtCc+Hp7jpSbSdj4tqmehcDUSWuYmUxXMbRMeeCQcbVvHas5pqtM8zvrYiSQHmpI2rzJPbMkgGwtmMzHON6i1Yx1ECg5UmQ9lNxMRyFCAT3kkrtzIWiS0B223G7GuZoRZMoAxmmuwF1064xnGOdaLehUK558tgNWiiUgbvWDjJyKfH2VRersGyp/Kk1Yi9ZJJTpzU1xCgy3jCnc6mpehh+hu7yBWTasdAM6sxwTvWkZElZJjj35+laaaIorW9wQGFLjQMPguA6eL5Una6GYex4frfLjYV6ikOTNLZRrGukfSnJ6MmWsVRieXlWXQgeWcjYU0hlLFpmABzS0NMJj4emMsAaHKkDOfYFZ8AH5Vk5UTZY1uYV8IGfKs7sYM0joSWBFZzjZaKTfFm0gZq4YgDLcSSjLZxW0cVCbClQZ3NGRehIKWVVTw+VcjuzWIts9+JQesgrph2jtf7T0BfgFdfRiYPtFvxOT3rkyfuZ04+gS1tpLiVY4ULuxAAFCi5OkU5KKtnqvZXhf/l/h8RvCBdzsBoBBxvXdih9NU+zknLm7MH/F7TxHj09m4yDGdIB5MKjMrm0Xi1Gzwm+4fLDI4Y4x0Nc/LizpTs5w+IKMsxPoVqXKwSoOJC7LjFR3tjPs8qV0xhtj8WfEAf5etaQohj+3GVAU7/1j966E9GbJ3F1NBju8LgbYIpOVCqzO8TvmadXK/iyR5edYvJZaiEwcSZFxnbOTvUKbHxosmvEkUkMcsQedVzHQpvZmjuw4Hh5EDqKfJ3sVGw4LIXgXIHiXSTz+tVd7QqLb8NIEj/EGBzSaBdmS7RcTaIT92zGGI8h1NEYuUqsic0Mey9yivDdrFHNH+OGRcpIp5qR6jPtzrbE3CVoyn9yL+KcRgsOK/ZrIyfZFnLW3efGqn8JPXnj1xVZpKrXpl+PyumbywgUqkyLpMm7D5VlJbNU2enfw+vTqlsHyykFl8wcdK1xNrRjlVqzPynXNIDkkk8687IqkzmRXbQAE4rFPYNl0oZdqZJUEBGSN6dsAO+iAG3M9KJOkACpEec/SsxAl1eqAcnA9apIEJJrzU5UEEVqoeykitImlJJ2FaaH0EJZlmBAOKlyGEPZlQN8elRYrKQjJJpzvQ/kB5wyBXRdY3rnnKhjOS30p4flWXKxAptBzJ3NUnQAl5BojOMVrGTFQilttc2TnPSujloSC1cxqAQOVQ18BQOsPdrsMCutNozKZphCCzEitVKxUAvfNK+AcCnxLSokA7776aG0kIugmMT42rNux1Y0S8UJsRUMloMtZVJGevlWUmTQS4Ryayk6KQuv4QV2G3lWcZNsvpAEFiC+o16GF2S2NYgqppA6V10iGVTRv3mV5Vz5JJFI4qtoOQeVcV7NI9lXDd+JW+3/UFbxW0dz/AGnoCDIAz0rrMRI3Zm64nxN3AAiLdcg1n9FykaLJxVGw4Z2a4d2ahN5NiW7/AAljkJ8q6YY44lfsylKU3RmuL9o5JOJRTBhoik1cj+tSpNysrikqMtdzrxHtDcXrNlYoncY335fvS7k5AtRo804taSXV4xCg6mJrlkm2dMaoWXCLbfdAgkc96zat6ZdlKb9c58qTdATD6TkbEUl3oEG2TjGrJUDritF82S96JXXG44gUikZiOYBq7dE6F7ccDEiRGxUuLYconBcw3fhD+IeexqHBrbK5J9Em8I571NDK2kOSKErGTaXvBG3N1O+RzFWmyXRuOyuZLcxkgFCcZ6jyzWl6on8lvaZjZQzTJnBUY/pJqqJvVGIaBZ0kDHMUgww/ekrTtIy1VML4Pp4faRxFjttqOwrVNdkpA7P/AMX7SAw7wxHc9D/vFTJ26NsapWes8EnXVFCWGoDGOtS2VTo33ZAaO1GTyC+WMbVrj/eZT/aLZwTd3DKcoXP0zXFl3Js5V1RK1Yqxx1rkq2BdI2+9VQih2AJxToOgS8ww2NRIKAHtyy+dZ2goTcUsHkBGT6YraEwBeH8Icn7zNavLRaNLa8KCxgMMisZTG0cmt1gzyqVJskXyuS2AMitFRJT3LM4bpTb0A4sgqEYblXPJFB09woXnvyrOnYMBa7AYdaviAHf3KspA55rSKAAjkVic7ECtVaEyq4DNjAzVIRY0i6Mda6eJnQsvonl2UVotDB7LhcrSgnlnyq7bQ2x/9gEUQJFc8k72TYouly/hAzQikDJFLO2lEOOW9aNatho0NhbOgAJIIFcs2LsOWIqc7k1jLaoEduEGgZGTisoxZQvB0uQdt+VdeKXElqw63Ree1dEsroEthDRKeZ+lckpNjINEFikznlikuxx7AOFwF+KQd2QcPnHWurGuTR3N/aer8L4Ye6R5FIY8s16EYGHIbTNFwmy14Tvm254qv2on9zPPe0vHXlVg7ghjtpG31FZSkaxR5xxziQYFI3DHq2eXyrJv0aL5KOxEzXd5xCFmz93y8q0x7siemU9pFSyRtLLqORWOR8UaQ2YOQmSUsTvnbNc/8mxdEEQHIUkny5UuwB7yTIOG50IbYqu5pu6J1Np9TXRCKfZlKTXRNAgXGcbc8b1LWybAEd/t7KT4WHKtWkoWZp7oJu00IrrkMBkehqYj/JbbX7NjWdR/Wplj9I1UrCpG1aWG1ZJV2UTgbLKM5PTNCXyHZ6B2WIiCB9s4NbRi6IbDe09t9rge17wDvFwPfpWiVuhJ6swkVld6cW00Tuux8W1FCcNk/wDgV7dEC5nRU6iMZ/M0rEoo0HCILSwhEdsg1+fP61DkaKNmu7LQM12GIOnmSaiO2VLo9H7Hp/zd7MCF0wsQSdq3x+2c+V/aCXCJqcx/Dk4rhnK7aOYqjGk+dYLbH2VTyDJA51VEkERiN96Yj6eIhQcVjkdFA5cKpDDFYr5ArEQkPpVKQfyEwWoj3O4ocgTCzJGqjHlU27LsU36d6SFzWkRdgBgKdcmtUDRU8oXPnRQqIwyu7ZA9amUULoJZ2dQCDtWdUUVOGXfO9VQhdxFiF2A9K3ggsHgl2GrnV8aF7G0WgIDjOfOs2rFq9gNpEGGW3FejGOjJsJ0RhsbVDWxhMTKvLFaRRL2cuJx3WDSlEaF0MPfXGw8OazhBtjbpD6w4eiAEqM1u1SM7sNaFFOVxXn5tM0RQ+AD71yctmiQDdyAcjW0UhMS3c+mU71uo6skM4e5kwSaiYwuaYpjG4qaCyKSSTv3alVztkmrx43IcVs3nYXsfNHLFf8Q0GMeJFHPPrnpXpYcXHbOiU70jY8Rv4rcMFzrHLSM5rdujOjB9rONl3wytnTy6VlN2zWKo834vfakZmzjn4m/bFZOjVIx16+py+rI5+VZvso0/8PYsjiFwWZU0gEkfOunEvtbMMnaRmO19wHvHw+QDtvXFmps6MekZwHbJHKo/Bf5OhgeQ2pNUMpuEJ3xTWtgQeET2+nH1qlJxZLjYqDG3PdS5HQE10JqWzB60WrLAPFpXVjGahwldLoLXYJd3IfwpWigK2Ux5WQMSdvyqntaKWtjKO5RsAEVhwRqpWM7CE3BTuzhgdhS42JujZcNDxXKnGFO/h5A1skQ2ajiEIu+GltP30Y1D2oSoEZ2ytUEUkkCprc6mwMEmpbLA2k0zFW1KOuOYqHIdBlhErSBtQOT1FQ2i0b3s/EY4HcgAAYyfWrj8kSNr2dxFwbikvwt3YX6mtIaiznyiWWdgDk1w8dWYkIZSTjfHnWdbEyeAW5CqJCogB70mIpvZAowOdc81ZSFNwxI33FSl8AyUMpA8IzjlSqgYUJmVRn86VEplTS7kDnQlRRxFLA77VaYyL24YZNWpFi29gAbAJrWIiu0TWRnIIpT0IYyQhAp64rnbGL7qUICGrWHRLEl7OWOFGc10wXsRRArMcDbHStgdje2uO7TDnfFYSx7HVgi3KounfNd8DFopa8KZY8qU6HGJ9DxMsd+VTC0NxOvdtK4x8NaX6Jqg6yuViAJxVJUS0OIeIjAxgiiT0R0Wm6LnY15udM2irJNG5XIbJPSvOpp2agN1GQhyADXXibfZmzPzj73Sa7k1Qh5w22CxgjY4zWE3sdBndKWCyZGTzAqVvQHpPY3gNvbWi3M1qjuyhlkdQSv/AGr1cUFGPRokO+J3yWsDadPhGBnGflWtlUeZ8d4+jSYE+jfcE5BrJyNEmZninELdo2Zpgc+1TJouKZiOJzwu5wNug086ybNaYolk8Q7oNn3zUN/Av5NJ2a4gkPCb1TKA7EHQFOfrW8GuDMpx+5GQ4tIZLhmJySeVcUncjoS0AliFxvS30UVKd/P2o/AF2AyAjel10NA+Wic4Jx5VS32JkZhFcKRKgz54qk2tolpPQFJw+2JyCw9K0WR+iHBdsktnbx7oKObYlFIpmhUjK1SnsdFVrCFYnFVJhFfA34ZJ3dygyV355qPY3tGztZ9G8u+TkEGtbIRseGus8CyIdx8Wwp9oKaAjw94phIijSSQcDY1HEfLYHxLhutxJGNJI32yDUSXsuLLOGWLl0AUA9CayaLs3NvCYoY4AM6dz6mr9UZt3s1dqEg7MzoGyZHGrby6Vr1BnPkexBJCMee3OuWVUZdkY108uWKxBlUkhVtqdE0TjuM8qTRJJiH+LeufIikRW3WTkBWV0OrIzWyxKSDg0+xUK5LghtOfaqSSCiVuyu+WP1okMLkkVUGKSHRWtwX8P51pFDs7Iqum+1bJUJspi0xnCj51lPQkHAAoSRWBQqv4FlJ8q2g2KhRLZaThN/LrXTFsRV3fd51ruPSto/gaRZGneDNDGLntZCdedq3jVGLroHmheTIHSm0NSotsbU8iM0LZLY0HDy4GxpzdE2cFsYsgjaub60kyqIBjG2d62i+XZNDSznGAScmieJMpMcQTLKNI515+SCRVkZ4DpJYCog+INCt7WIOSRWvMXYVCdtI2PKndgaXsjw+K54gTI+pUIz611eNBN2NKz1C4b7JYd0FJYjmOX/avQSNbo857WTPJbuJZQmM6UAzkVElrZSfweOcV4m63Low2zgEDb51g2zetC+W/1qQqoz46g0uQ0L7l2ZwZHAUDpiou32OgKaRQMKCTyH/ek/gEWcLukgldNsyKQSDVQdaJkvYDfsO8bw4rmfbNl0AlidjgD1o/kZIYY7fWhaF2XKPD/AG51LasaXoi66hvQ2MoeLDeEk5p3q0JogybEdRTUgordDzq+VsmtFLrlcYzVJqxEViKgEL4ulDlsVFqeFtTYG/Wjb0ikh4nEYXtBiVdS8/FWl6Djsf8AZntR3D6YIu/6MGOkGmpUwlDkjccPubfiOruOYGsBjgqfI+oqrvoydotwC5Do0bA+4JqWNMY8Lt0WUydBuAB+1TW7G2NIYpXbwRvk/wBNCTE2jQyxTJZfZljbKDLAjYk1s4vjRhNpiqexu2izHCOW65x+u351zSwyfRkLyJIWZJY2RvJhWDg49jIlAc+VL8EnBEAPShhRXPIFHPFc+RAStLtQxBO9YNfJRdcTqV9KatAxJMDJMQgxVxZLDbe2VVy2M0mOyF0Qdhg0JBYLHGysCSSPKtEmKy15cDFaXSEcTUxJHKsckr0NE5JzGvPHnmpSHYFJdAuVU5zW0IjJxLtlvzro40BCa3MgNCdBdkray0g53NEptgwKZMsFWuuOjFtlRgESksKutENnLF0LjkBmrjGhMfW+GIwBioydCSIXsQVSa4JNWamY4nP3RKiujEwo5Y3RO2a0lkXQcTS8Md9Oo4zXBlaKQbNK2nG9cyGwQxFpPEa0UhDDhVn9qvEhRCzMcACt8MObFR6rwLhsfDoES3iAIGpm6E+tetCCgqRqlQJ2gnfS32mRhp8QCnAPpV+ho807UcSZ1bu9SA7MR/eok7ZaR5Vxqdmd+5DDzAFYy30arRnhdgSFnDL55NYJo0dlkV4rFhGqtnzov8DoHmbWcONK88aqXrYFbFYzqJZCOnU/LpVLQmfNMJlyAfM5rKcdlR0UFcnbl5VKd9+hssVSMfrSY0XLj1zUv4GSGBvgUuugONErHbNKw7KXjIJJGKFIZQye2a0UrQmiIjUnYU7slk+72wAc8htR2DQuutQkCyIdAJzjr8q3hX9Sbd9FtikVwpARgQcYYcqmaaNYU0PrC0kS0WW2PiLYJHSoxptt/BeSXGkb/sxbSW1vqbaR/wCbrtXQlRySdsPfu2ctNMMMPEg3GfSlYzVcFERt5BHlcAZLA4HqKa6JejU9mbES3nfyy95HENZXBGw96vHFXbInLVIDNnZ3EnEriLiS/eyairxMNPpud6JKMr2Zu6ENzZShmNrcRSN0CSaGPyP96wlH4ZmicX2oqFuWkI6a9/oayk5VTGX4BGKyvZLKpMgYzVDFd8SGPUVnOgAVnCgLjx6s59PKpaXGqEGo0koAztWD0DYRBEoxqFSpbAsllCDArRKxAGS7kiqEEMNKcsmkmCAijGQHcU/wUwlAVBxUMkFu2YjbrVRHZXa2JY6iDnyrpg9FDG2tSZN+VXJjHC2aCIYFZWSCNCqtuKqIzPEhRrxXb0Yi29utmA5VqtoVCmK6cXAVScE9KmcuJfE1vDpvDud8VyZM1kpIvuiShBO1cjnb0MzPEoQZPOtoSYJkLZVjYYxVsr0aHh8wGkDfPOsJRcuhDc6WAyKPpP2FlEowQBzPLFL6YWeh9heCoIFuRJl2GM4Ow+depgxqMbNIr2am8uYLSDulLM4HTfUfOulFM837T8SjiiJcuWOSdJ5fX96ltFJHkPG+Ma52xO2kHcNtmsnI0SEd3d98gZlEijbw7/U1LkmUlRnL5xnwDHpyrJrejRWCRzlW2Yk+R5Umr2MKE2lQTnX5g8qla6Kq+wcnJJDb9TTsn+SmOZoZQCQVPPenXJUAbkMuVOxrJqiyKthtyalUwvZehBO2aXQFobA3zSZR0EHOGz6Gp6AtChxuDnzNDXsQJcLpJyGO34etVGxMo0OSCgYA779Kq/QUXRxlQNUm/Ok6YE3tkmXxc6UZUJqypeFywnXAQ3mD1Fa877KTobdm1kX/ABidAOdNClUhydo39pcwvGQ2Qhxgqd/StuRg4tPRNEglkURRtITvjHOlfwGzdcHtlS1X7vuQdgNxVr8kNm84PDHb8AuZnUs5BAIJyPWto6VmUuzHWd5cf8NkaV3bU5GHAbA+dZObStiloXXTawdogdtygKn8sj9KynO0Qg6yYgFZIwDyOMjPuORrBzp7E2QuI4y+Ae6b+rdT7HpRcW/gTBmiYHSy+meYoa4oSAru3IztXPOQ/wCRU9uokBAwaVv2KxnZoiKPOspJjRbOV55xUxQWDGMyEitYxoTOxQiJh+dUxF0gAzjbas/ZYtuWCbr9KpbAqW5ZtlG1HEh/kthRnPjG1VFAhkigIANq0WjRF8TqnvVJgy43aKuC2KVCqwKS6Vn2INWkOhBK3h9K2Ut7MRXcwd4CRzraLvoRCx4eiHUeeetLJGyrGtu4gfB5VySgLs5e34xgGsVjt2OmKLiQyHAOc1044NjWipkZVyDWzhoLCuGXUizgEHas1jUWDVmjjmllKpGjM52VQMknyxW3FMk2HA+x147rNxWQ2yAg6FwXx652X8zVR8fds0jCts3J4jBaWC21voRV8AzuSfXzrpNaoz3GuJyW4ch0U8gV2PyFO6FR5/xG/Viwbxux5ybZqLLowvGpxMrIsKvg4BTZR/eol1Ra0Y+5xE5BBx004rF6NBRcxHUWB/Y1H8gBOxjbYnbyqtS0U7osgmBI54586loYQxLLsSfY1F+hgsib7VaYmtn1vMYWAbdD+VNpSEn8h/hfBU59KwaaKRNWOcFT8qTq9jReN9t8+QGalqvZRcsZUDVpU9ATk0hfwTUYI+N2/SlWgJtA7jI0K31qv5D8AslrJg65QM9M4o5UKj6O3TffVt060m2FB0cbEACPAxtmmlQfyGRQlY9UrAADOwq0qA+tFUHLgDJz51ToZo+ElQwMZjydsEVSJZq+C2MssyyP4VHLbGapJmcnSNfZIS4RASM4x51qvgzbNzff8p2fEJwjBScHYj2PUVtLSoyW2efQXLNZBZUEignmMH6jn71yzm6HLSKHiiYEwyaTzCy8x7MNj88Vhaa1/wDf1MgmENo0MCrAZXHIj0qGn7AHkcMSGbw9D5Uo9isstmK+Enb6/wCxVt12BVf4UZG37+1cuVe0OhBcFmc6frSTT7JLI5zGuDzpNCsp7/W+kk0IQWjhWB1Zq7Gi4TAjKik3otI6/jGayGIuJyFThSRW0FZIHbSvqGd62caQUPIWZogRWcexpF3eEKSa0oo6ZMLlTTSAX3M0j/DvWqjXYFCSkDxbGm0DRNwmjehnP0ByMkbcxg1pBgBzXIj51vVggCfiWThTk1m4JmiiD95JLvqzmk4JILoutciTc5q4RSE3aG1vZT3FwkcULuzEAIoyST6VclS0JKz0LgPYKXQknFEFtyOk7sB645VjHA5bmaRj8m34facN4OGazt4I3xp7xvjPsTy+VdKjGP7S1FIncXYlQCdjvkgDcD3qv5H/AAZ/jfGIbNcoPFg4Zvi+gzik3Q0jE3t9czSNIkcecZLy56+XpSVjMte8SnmkZSneBNsQptUNtlJJGb4n9on8OoRoPwjwmolbLVITX0MaAEqM9d8VMqBWxXMwYkBSrDbzrNloX3CnO+Tj0xQigbBDYGfar7F0WhyBz3qXGxpk2BK7sBnzqdsZEoQDjJ9aL9CqjsLPC6gZYHbSN/pSe+g6G8ajH3hycfAp3HuelZSiNO+i2M5ysQCDmQu31NQ/aRX8hCRgEF9yeQXmanb2Oy5WXdSFwOYHIe5607p0In3bHdBz5sRimBNLaJjtGpP4iedVQFxgAA7tFUelHGw6IPIsWdi7eRp9IFsqklmlYB9h0A2oYJB9hbGVsHJNUkNuja8B4KjMsjjGkCtIxvbMZS+DY26BAqpv5VbZBtOznCHiVLq5GAd1FbQi1tmUpekH9ppddhMx28J5Cqn0TE874FiTh7MqqV1nIU+Ft+Y8j6VyS0VLom8PXPh5g+dc8lRkfFmiQ6T6jyzSTAAmLCVtOcHcfP8A3+VX7EE2kjYww5cqO0FnbrxqVPnkelc818jADaDfPyrJOiWimWzO+c4o5CYO8JHIAnNCZNE4UdV8Q5mnZSQbawZGWNLkX0XyqvdnHOhfArEd1bmYkYrSLoRdw3hul9R396pyBbHC2gVdhU2WUSW+52zVqQwGeNgCApFWmI5BbkjlWnMXRyW0xzFLkgF9yy5wa0dN2c7FF6cnCnatIRb2NfkVzRzSEjOR5Vsky00VR8Pcvvmqr2DkO7LhU0y4giMh5bdKmhdm57L/AML5LwrccbuvskBziJPjPzIwKtQ+S1B+z0rhnD+F8EiEPC7WGPG3eMcsfXPOr/g1UUgfiHE1jG2RKOshAC+n77UrGJ7rin4GlXUN9bJ8PrvQMR8b4y0ulVnZtuibGhsEhHe8QPegLpVwMtlP2oYIUXdy0spM0jPEPwBcA/QfpS97K9CPiM0j5RUUIPwg4AqW7GkJpY20HBEW2edZvSLTEt5GjH7sFj/M+wrNu+h7XYnuUAcaGyeuBSe+iugV8bAk7dM5qbGVEDoCPUU7+Q6IFSp3OKpb0BLYD98UNgEwxMcE+AEdf1qKCyxmWHAt+oOXbmf7Cl/AHYYG3csVGfbNS9lBUF0WOlRsNtR5UnEAxAGGEJC8iw5sfIVm18AXqoXAxjyXy9TS6HYVCd9jlR+dOwGEQTGGAx1qkxUFpBFKo3xmqsNk14QpK93pOTvR2K6JtwVu8BxlfTekkPkPOEcKSNg7DGfOrj+SZSNPaoBhE2HI1d30Q0bPsvwxJJkYpqwetb4oGU2bSbKkL0A2xyrZmSEHaVscMmPXSazn0VE847LPiwnRhhC5OK5MnWxy6HQKumkHxc1PnWPemZFBjJ2POosCBtxpUnGdxTu0iHssit9x+lWlaFZKeNAOQqJQoOQBOVXlg1g0VZWzhlwSDWbv0FFEioNxS7A5GwYgNnFNIYbGY9OnYmkxPZ9KiketJSCgbuAzagTn9K1T9AFRJp5bU07GWGXAwOY61cYWMGedc4Jq+NDKtm5kUxMIi0qpzyqX2IDu5QGGMUIpGFe98G78uVdaj8GNFH2gMcnlXVFUqChjZhNJJwSa0SJ6HHAeAXnGb1Y7aCTQ22sLt8s06HGPI9b7M9muF9moGd9d1xAbMx6ew5D3oVI2jCgi84i95IykqqgYwG2AoNBDd8T0gxwxtIEGzEHT8sUrsdCSTiAWAvO8ClDyRST7UrGLLu/e6bw28rIN9T7D6UXYCfiU4kcy3lzsnwo2QKTrtsavpGevL+OJS7PueShtTH2HIUrrsdWIJuLXcjd3aRtFGTgszfXNZcpM0UUtspa5mRiryfJdv1ovdCoruZ2WMKrkZ8yTmpmykLSxbLO2SfTYVG12OrYHM6hMKoGeW9FgkByZOwAHr51Mex9FeVY9fem/wM+KZJxgdM0RYUSTKkCJQXPJ2GT7+lXyS0iaPmZj4UZmJO5PNjU2NIvgiCkO27Hy3+lQ2CJu+onvNwDjSDkfOl+GN/JZCjytjYAZJx0FTIYXqFuQIsa8bDotLVh2RjmkXIcZ9RUv0h0MbeaMKpY4weRHWk2Og+NwVHiHnvTQ+w23U76WoQDqyTkS2McxVIljS3UKuM5IqhdjCHU+NsCjbJdIc8Mh1SDbO9awiRJnp3B4DDw5WCpgDOccvpXbFUjlfYWG1DJBGfWkAj7Uf+2TDzBrOfRUTzzgTAcNYr5muXL+0cv2hKTKDpJ26Vio2ZBEbmRdXUHDf3oatWDIPOFwPU1KRLPlvADzya3USGiu8uD3edQ9qiQjP3l041YbasWrLRRa3bsSBnFZSihhaz+DLHNKMaY2Ui4Pekcx0q2hFsd1obdvaokgCheIQMtWajQyyKcNyNaJAGoNeCT9KdAclTKnetYsBVcxvr25A1sqopE7dsNhxUyExkgBXIFYt30IXXkZ18sinEZ5dOCo2r1OAuwUSvGc5yKcVWgo3HYjs9xPtNKGtYZBaKRrlwNPtnzrVJsnjZ75wbhdr2c4WsdkjNIww8jnLMffoKvo0jHQHxHiD2skoZoEBGTud/QedDdFJGYv+KsUCvJPobOkYC5z5VF+ihFd3zupVZkKDfSHJI9zyFK2MXXV9P8AZcwx26nO7Dxftik7rQ0tim4up2jDTSPI43A5D2wKQ9XsWXFw8hx92HXc48X1NJMekKLoqFLR6nb+dsb+gpfwMTzSkbKmk533x9ai/gpFCtpRyrBmb8TdBU9Jh2L7iXWSUJY8snrWT30a9EFZ1UmRiBj4SdhQtE1ZWZUKnbUB1PKmmhUweTSSCMmlZWikjJ8hQmB8MkDA39edNu+wLipA0LkseZNT0OiccOlCxbCjm3mfIU+XsmvgreUjZc49ev8ApR2FHyeLQiruTtgdaUqSKT9DJNNtFoB1EbsfM1HYIHV8yHJOc5pP8jDLRRJINXLmc0m/QwhF1y7bIDgCpfY0MoYVYZbcHlVUAbb2pXlyPyp1XQX8jyygIxqJOepNOibHMKaQoA3piGlqmRvzqlvshmh4NFqmQAZ3reC2ZSZ6Tcqltw6AqWDEAEV1PowRGPdBtipAQdr208Ll/wAp/Ss8nRUTzngPh4Tz5sawmvtHJ6OtnVtWcdGQztm55GxG9TasRRcKRz6VNUxAathsjlWsQZGRS586znEzsC4hB4ccqzLQNaw6WAycedZN29lBEkbKvUihNADKTrJUZPSrTok5IjaRkUqTArYMBjG/vTSQwvhZYMASdPTNJ0ilsfoxCbc6gKK5JGPM71omIHlfzFaroaOR4WTce4NJoGMonQjntWLED3JXPnREDyu9XoBua9liizVdguwE3aC5EnEYprexQandvCG8gOtOML7K/g94tUtODcKitLCPTbJ4QB+I/KtHpFJCrjnHJAoEJAB8JYqfD67UpMaRmuI8VMEaiGNJpjsHcAE/uKlv4KoQ8TnuQVMiRKW+LS5yPQdaHoBRdzufuoBCzHrnOk+tS+6RSS9i+SxnP/qb5CP5IRn6nOBU18sd30Q7u3jQYjKr0csST606AWXd7bRRuBht+eQT9Klz0VxdiWW5M58CESEYBfc/6VPK0VXyLrhGiXxyZ+dZsfYtuJGk+AAR+tS7e0UtaByGXxO3Llipb+RkTqcjSAPU70v5CjjL4dyo+dP2mgRWcdOZ50r+AI6d8ty6Ci36GdjBJLDHPAou+hUXJpXwgeHGT5mkOkSYtIwPIDZfSk5WOvRFotXMn50m17AnbxlFaYjGDge/pT7FW6onIwGFz68t6KroZ1ANJON+YHrU6uh2GWx0xEnGWGPcVIBlts5x5UL8AxrbqNAxgHPyq0AwiXSQwJ22xQ9bD8Di0OkD86diHVthwABmqJGdvGSNquKIkzU9moc3CDHXlXRjRjNmr4vIW4hGgYroAGnO1XLshdBsX+GKCTM9uGxwmY/0n9KzyPRcTzvs6S3BdTDfNZT3EUugrTXPejILikCKM9KQAV1Pk7Hl4TWiiAIJMsN8Votdgw2BM4zstYy2ZsqvkwueYrJoaKLVNTbgYrnkygua2DKBtijQgZrQxjYZosD42+caqObodHzWqEHGKfMRO3hRCNtxQgQwBUIAAc43qlTKBZuRNXQAesscetWrRVl+NWSTv5mqcrJBXu+4JUmk430CRH7aGPPNJQYxX2S7N3fE7lHezLREg6pThcZ58v3FetGPtkRdntpxHbR2dvEY4FGp2yefuev6Vb3/AAapUC3HEILSBu9AeQ7RxknA9ccz7nnSvQ6Mnd8duLebCffT89vhVfQdaV0Nox3E+K3V5faGk7oj+nWc+WKi23RdJKwe5muApUTA52LSgajQ7BL2ykS2qwkTktIOeDjfzIFHoE3ZS725iB7kMR+MA7D9Kkr2AXGm4AZggj8y2r5VPfZV/AqmigG+lpGzyAwtQWVTPMqHGiMHYKq7Ae9JyYkhbJAzAv8ACg3zn+9ZtKrKsWSsdegHLZ96E7HRTIp574PM5qLa7GU6gmCxJB2GarsXWzoBBznfpQ1QH256/OlY6OKgZtiSDtSukFFjgL4V6bVNhSJlMDBIHmc0+kOiaqGcYzgdKXYFyqSSW9gKi1Yyy7jzoiAyF5486r4sSBCuJMtnOadhRbFz67chSqmOw5gNBxjAwNvSk9ISLIAQ4I2zz9AaSK/kZQuc4U7cv2pp0L0NraYMuCMYG/pV2IdW66kGDyFOtC9jWxJVwpGG54oQPaHltv4sEZrZbMWa/sudMq6up51vjMpDzioH/FRhgwIB2py7JXQwT/DFUSZXtzvwuVf6T+lY5Oi4mL4VGI+AIwO2d6lr7QfRT3mX57VzOOjItY5jJBoihCu5YrK/ln966EgRGNSd+lJhYzgcBQMjFc7ZnIpv5gBzGKiT+AQJazAPudjWEo2UOY5FZNt6xpjOFlB3FUkwRVLJ4eVNxaGCNcrnHI9aaQmz6O4B9apdiLGuVVeuKtRofYHLeliR58qtIZCGQ6/SqaAOZToyOVSmIQcSEhfw8q6cdVsuJVAkpG2eVVJRK6Pc+F2MXDrWK3tIUVwMFiAGPv5e2a7/AOBJJFHGeJJYWza2SJs+Jc5z6f6YobpAkYjiXFXuAzW9oTncsfCx9d+XzzUlGbuhKsOtiI3O+X5D59aT0MX99Aj4W8bvXB+Bjy/IUv4GLbqOKNSzszNz6KB71LSKTE13cc+6ZcHfOr+1ZyZomAvLNI3iaVl6AucUtsKR9FDMVBZwoHUg4/Palsdou+06MqZlydj4xmp5DUSE00khwDHgcv8AZqXJvoql7F1y8m+cHHrms2/ka/ACUfGQq6+eeVNpiKXGkfETU/kpg7qNWWB+dNCPhsBnwg9Opp6A6GyQNs+QFTVhZdFu3i2wDsKl9j/J0DQfXpTTsCaqCckk1LGiwKckYwDST0DDLQZYMR4U3FNfgC0x6vT160xUDSwBV5H1pVQWQihKuM7Y3OfPyo/A/RdqCqqrkk7nHSlYL8hcSkliD1xin2ATGCFA6Bt96KGMrVxkqBnPTzqhD7hsgLEZ9KZMkPrcagjHZga0qyXoeWWygHY/rWsTNmn4CdM6bdfpWsTKQ84ggXjGV6gZ96cl9xK6GS7IKZJku3JI4bMR0Q/pWOQ0iYjhUrf+XWLbZND6E+gaJgMc96zaMgwMBHk8qiIMXzSRgSZXJY7HyraNE0UwyjGM0NARe8CNiuSaFQPPcl8/pUICiW9xIMLpXyq5pSChnaXo0/EBWDiOi9bzW2Cc0+NAi93Dpgc6bGCSW4HXej+SWVhGXcbVPsGzsjZGPrW0RogYC2NJxTYy61g335+VQ2MbrFmPHSo6EwQ2IeTltV86QJBMfDlQfCKh5GUbjivGIrK3T7TJDC8mcDckD+kcyfWvcbrspIx3FOLwSeKytJnYfFNcHQF+ZH6Cpv4X+ZSVdmZ4nxmYRYFwskr/AP0jnG/5UndDpCWeD7vvbqTumYZYa9yKTikgsSzcQjs1ZbYSkNzIYEn6cqlypFVYtuTeXOhiNEf4dRJz8qiSbNFSB2trtWDykrttpODip62PRwTYzqjYsfCDqzj19KLFRHKsPG7LjpUPZV/CPmeNQAoG45EVEnSopfkHlLAY1BTnOKztpDonHGGTfGnmf6jTVAUXDhixXJ26Cjl2x1oGAG55n2qWMGc4bffy25UxEBu2+T5gVWqF+C5MYz8IqRlqDBOFyfWkDJrGS2Tgmk9aGXaSB0FLYEol1AnmKSt7BhcQ+6ONs88VURFunHxfCOlMZ1o1ZR0PnT7QuilYyD6kHHpSSAjHFq8Q6mppjDVj8OB8R8/Kq36AMt4yFPUDYU1pC7DreA4LLsR1oHYbbEhtvekNmkspNQUbnI6VomZDy1JGnV8PPUK1jfRmzT9n5i0+Djngj9xW0HbM5I0V9/7x12UfpVS/cQuhlnwCqJMf2/OOEXB/oNY5Oi4mHsXB7NQ/1Gk+hPopC4QH86kzPu+KoRnanGIMU3c+SSK0URAkU7d5tmhxHRJgzN1rjy6ZNk9IBGT71iybB5cMSBTQ0dgBB3zirbTGwy0J7zxbCoe0IdQqSD/eoHdEZEYnfO1JsVlMoZjgcqEiSyOIY8XPpVWWmSICDeixgpulSXyqlGykg0X2wOqjjYui6C9y29JqhB/2xQByrNwYz7iXECZZJVto2kfIM0rkHHv/ALFe5s0VCKd47p3e68W2cJsPTmaXfYwG4/4NaBXmtoJJseFM5b3/ANik6Q9sUcRv7a6TUIo7dQdlYFsepqXT2UtCe4SF1JtFLkZ1SsukD2FL+AuhfNPJERiR223PwgVLZSSBpL1c7hjvsW5fTrUOXwVFWVTSkjOpSOYGdvpUsoFklkc+E/Raybb2UkdV2TxSOGPTpU2vY6JLcZOERAQNy1JsaOTTM641Zz/KNqnl8jopdNI+E6j1osdFTEoAvU8hRaFRUYgNJkI1enl5VVhRW/hxy38+tNCaJoceKQ+29Kx0FRR6upHlUtBZ0HS+hBluvpQgCFQkgEnJ8zQCJMBpAA8P60XrQi+D/CBxzfOB1poGEW/jJ6k7ZqltgXmNdJwRgbknpV6YugYou50+2aj2BfFCMZPIYycbmnxvYBLRZ3xjqRTaGE2kRB3G3SpSCxjEhUYG/wAqKoAy3hXSxxzORtRQnYZZs0U4TGxGxoWgZpYWwijOCdq3T0ZGm7OKFmB+R9a2gZSNPcnPFBlQMKB71Uv3ELoYD4aYjHdv/wD2i4z1QissnRUTCyr9k4LZxNjcZpLaFPSBe+wmKKMgOafYgVpFDFsjlmI86sBjw+yBGSKwyToTYfJbquDgA+1cU5WyGCzLp5Lms09k2CGIEksNya1uxoJigBXYVm2UXxQKo32NCdiYdCB51EhFjqSPSkpADHbNaLYgaSYxnd6pKyokYZHnJwcim4mlI+ltSQTtmtIgUEPGMHetaAlA7F9iOdTKKBh41lRvWVUItu76GJ83gWd15gZwp8gOtem2bC+a6NzJrbubePG0MaZkpW+xmeult2d/uQXJ5leXlnGM+1KigIRwQAu4cjmScL9BgUugBbu+gOUtxoUHJAGTn59alyHVANzcgAFlYnmFfB+dS37KSFrzYfXKgXPINz96z12OmVzTQlgFQMfMVLaspJnCcAksFz+HrWcrRaI6ojlVDY65qbKJK8QO+nI/D5/Ok7D2RkuE6IAQeYzS/Iz6LSTqckk9cUm60B82lXJUb+tGgopK5xvsKd2BXKmny500Lo5GpLZOcdBTYBisVTI3Y7AVLdAWQRaFGR4jufWjQglQAowMk00BUwKDxHep6DsshdjHt8ZOBnpVIA1VWCHAOT1pqohZeGAhbI35/OqT0Ik0Q23ycZJqgCI49thk5G1NAXxxkvkjwDn60AFwpuCRjbYe9SAwhjGBuCR1oCxjbxDmBQkI4YtMpJ50qHY2spC2lThhmrUvRDXs2nZ4feqOpNdMDnkP3lDcUYMwDfCozzxzxTbXKhLoaD4c1RBke3ahuGPk7YrLJ0XFmG4uFSO1D7ppxmnjonL0Jrpgpwm486tr4ISBWZj0BzTQyEKFnAC9aUpUQaG0CIg6VyTdiBOIXscbYJz7Vg02yewZbpHA3qKoKLWRZDleXrTv4DoMjRRHtjNZjBbmTu98jFUrEyqO93xTcbEWm9ao4DBLm6IG5wPStYJhQsku3mfSDtXQo12WlQ/4aiCFShYsRvnpWU3RTDHAVTWansBXcsckiuqLGga1nImII61UkJocwy6huN6jiIDSFjreVZVA6zSgn0IC8q7Ujd7BHtJXifXcd3E/RAAxHl6D8zS3QaFcosEBVO8KqTqfWWY/LkKFRW7AZu6fLLAhUDIOTkDzNT+RgGqEkmMqMfyruaVIdg8oaQ4LFc9OWPnUNDsFngSAEIEPm5Xf86h60irBwzgkjOnHMVP5GVmcfh0/Pas2y6Po5UfYohcdSahpdDOyW+d9SDrsM/Spoop8BbBJ+VKwouTSdhjbnmlQEXG53HsKa0x9kWAzsNPTnyoq+hFUyg4PPAyapOgZGMeMADb9ab+SQhR4uQzjr0pdof5CIuR22HruadUIJ04UkgDoOtOrGBTnLEDZcY386m/gC63kCKzc9tvShaEycLl33yRzNNDGagYXB2B29TWvokLjjwFJ3PWmgLtOCBgn0FDAZ8M4fJfzCGDTt4mZjsPWuLzvNxeFieTJ/RfJePG5ukaWDswsckEou9YRwXUxYJOehyfzr5jL/ab6kJQWOm+nZ1R8fi07Lbns3PEss9ky3MROVjUESKM7bfi59Dn0r0/A/X/HzpQyPjL8/P8A7MZ4JR6KLSPYAjkN9utfQx6OZljw6l1DbJpNaFewrh8OCoG7Z6daVqKcpOl8jdvSNfwpntyGUDWRtn8O3OvnPM/tTCDcPEXJ/L6/p8m8fDvc/wDI5byL/wCYoriaRiUzhm8iCDn0/wBK8rw/1PJHy8efyJt/Lf5N54rxuEUbdMMlfoyPEZjO3hP/AA2VBjNZz+CkYvjkEr8OtWHQVUF7FNiB0Ye9XRK32QQMTUsJDC0gz0rCcjPsMliZUOPKsExGV4kszXGQuR607URrZ9awMMFs+1ZOQMdWowviGaylJE0WTXCxJUoYmv7hXVNEgLN0HSt1HSlYEIBpAJ50mAWrE7VJILc28jxlgDitIyoaYFaW7CbDEgk1ry0WaezUog07VlIYZHGZiN9qxfYXRO6showorSMqCxNJYtFJkiu2ErGpBCPgb03EEhD9sIKy3crzXHMRBcgn1zzrZP5N6K7l57te8vNSDYrEAB9cUmm1sapAt7mRVydWThEQjA+Q50nsIgk9uwx3zhRz0nI+q0mMqkZwhEYVNI3J2ofQ0ASBxltwOmWxmoZSYOwc+KWQAfyxksT86h2UvwVyBSw8L456WH7Vm38FJHPCwOQQPMryqSitYU1nYMPXbFQMI7tFXUBnpy2qeuh0RDo/hGAf6RihKw6K+57xjvgA450mrBHyxDWMnOD+dL2MnoGsgADHM0xFPdAMRg88mnXoD4IEm8yKpIRJvxH0xmlSTAJt1wrHAJqkhBEf+HgeVNL4CwKddLbDIXelVBZxScqoB2GCPU1PWgNFw7s1xK94fHc8NhW8if4hC47xT1BU4PzGa45fqfj45vFkfFr5NHilSkgy14BxJC32i0lt2XcrMNBIHPAPP35etLL+reNBL7rv4HHFJsYwcDvJwjRojRnxBjIozWX/AO74kV97af8AAS8eSeiq64Xc2mhbqIoSfi5hvQEbV2+L52Dyv8GV/wD3wZyg49jbsgJpL9obaJ5JJAdKqOgPP0Hqdq8/9c8KflYY8FbT/wBzbx8kYNqXs1xbEsEEdzC7EkymM5UYBwurGD5kjPLnXxuTxY4nx5Jtr16OxPluhxZ2d33Bk7hzEpO6kNtnnsc4rmn+n+RKH1IRtfgX1Ip02UcZtlvLZ7kD/m0XJcDeVRzDeZA3B57EHO2Pf/s/+tTWReL5Du9J/n4f/g58+BVziJooC6Kq78sV9p5HkY/GxPLmdRX/AN//AIcEYucqiaHhHC+4geWR4yrgBCrjUjDnlfI+4O3Wvj/NeT9SxOc7jF9K/wDVr3f86O+NY2ku/Zd3gRsYKsMggdD/AL3r5VRcJ8GdPYoguQ94xO+pjXZlp4y3GjccCuzcWIU/FH4TnqOn+/Svv/7N+a/L8JKT+6Gn/wCP9DxPNx8Mlr2ZXt9dhIZEzuRivblXJI510U8Ak4ZxjgsUU76HTZhnBq4a0yZKwmXshw24UdxdaSBsM1dWT0Ze77OXVvIdEbOobAIHOoknQmyUFjPEoLROAPSueUX8ElkoJGGWs+LJFFxbozEld6xlYrImFU307Cs6sVlclzGPDyNHErsV38yupANaQgOtiwRKbvwSak55rWcElQ71scRxpoAPM+dc7WyaJoV7wKOdJokaCAd0CoFJIZR/w0skk6L4YyAcetbQ3f4KWiyNNIAqnG9lBtrzHvWM4iGekaMk9KlKhWLLvBzvXXiY0K5B4utdBRk7m4jMmYtUp6yyLqJ+XlVWvR01rYOsyuxHdO7DkXGB9Keg2iYkdWIhjZWYYJUkE+Z9KX4QfyDyIwADzbdFzv8A3o/gPYJJKxyowB0KkAj/AH71DZRTr0LjKZPJnOTSt9DIMsOol31OB5VDKWyh3bfu1yDgcudZttlKiEkcoI1bnG+OQ9KTTRSIRpkgFBgeeazat7GEMyY0uwY52wOVJuxqyLW4DaiCOu3OihrZaqnRsD4fpR6FZADKAj4ydvekkP8AJJVGdgMDO9NJehHGTTjOd9yc0aD0DuPEEG5J3AHIVS2LoIZVCKFBwMZ2506EEcNtxPJo7xUdidJZSQT8uXvg1lmyrDHnLo0xY/qOl2Ol7P3yrqAgZT4hpmBz7Vx//r+MpU2U8MjOcRjkgublJkdXjIBUjcGu6GSOVcoO0YtNaZPh9rNfTxQWyF55m0KPU8z8t/oaWbNDDB5JdIErdHqnZrhbcFhNvHcNIwYuWZcLvjIA6jI618L+o+avKyfU416PQxx4xo1MRhvYwtyupc52OCp9D0ry4ZXjmm+vYNP0URcDAiYcLmaUqxzBLgSL6A8mr1H468lc8Lv8E/Up/cLrnElvNbXCkDGCrDdWHLbzBrn8d5PFzxnFfcn/APIqSUon3COGNY2EkTsUuJADcINtPkh88cz6n0r0/wBd/UnPL9CD+1d/z/6M8GOlbDY4CiqYtjvg/X+1fPOdvZ1BVs8tuFWN2UgblTiiOacHcHQmk+x3Y30XEBouWSG8HwynZX9G/vXc3i85VlfHJ6l8/wA/89mNSxbW18A8trHZzSjBjdOcZGcH09Dt+1T5/m+Z5GSHjeX3HX8/l/P8rVFY4QScsfsHgkeFZHJOnIPPlXoTm4RbI42QuZjI2C6owGBjLH6Dy9ccq87JBTkpzaX+rNYvihbNCq29wqvKrpHrBXwud/Tl1/v0qvqpNKH+ppbfZrODXEkF3pQD78BfTfdf1/Ou/wDs55UvD8/6Eup6/r2mcXl41kxcvaLOIdjrzi12JZXCrn4SK/RJYnJ3Z5Kmki+3/hvCi574Iee1P6X5Cw1ewxVQFugMcsZp8H8iLl7K30enu76MhTyYE1S5r2JxTOP2f4rqwZLV08txn8qblNi4IHl7KzvICbWErjcCQZpd9ol4/gEfsTqdme0cZ5aZAcfnUvHB9oX0wS77EgqVS2ucnbUOlL6UPgX0hJe/w5uSpaJ5dY5Bo9qf04+mH0zN8Q/h/wAYiBYQd5nyBFHBAotDfgnAoIOHrFxThZWdFPiBB1euaHBNbRSElz2fvAxaK3bQTsM8hXM8RHCT6B7fgd2s4ZoZAetS8XpIX05D+K1miTHcMysORG4qeHH+ouEvZV3ckUbxmCQI5GoYODjlWkIpLaBJi+7QI7DRoAqnH4K/kqt5W1YBqXiAMLXOF0gNq2xmoeB9oAd4bxmP3Jx71tjxSXY7RGOzmJOY2rbiwtHnUErySNjuiRuXYnb2wdqI7Ot6LHu9CaAxwTzQ7f6/M0NhHZAyNpCoZEH0/Xal6GwaWVFU90yNg+IBgcn1NTLXQ0CmVpCVYLg8lxn86QFc0cgUawUHPCjNJoaZUsTFQNGhfMnc/KocUUmERukORrBI6ADak2PRF3z4u8IH9Oahp9jIKzA/ET6YqdsqiakjkpY0mqAuVRjx+Hz3wKX8jI6NSFRqI8uVTVjIBMEqB4j+QopgXIviA8jyprb0DRwx+F/MnIOKaXsTB+6bmu45Ek700DPiPvFXkDvjNNMTQVas8E0cqsAwbUB54pZMayxcJdMcZuL5I9J4LdQXUIORqI2B8jvXwPnYJ4Mji/R6cvuSmumR7R8Dt+KwBCe7uUGElAzgeR8x+lV+n/qOTxJWtxfaOeeNS7FfY3gU/BONyXV+FKxxlYmU5DFtifkAdvWvQ/U/1SHlYFjw9t7sjHiads29wI5Cs8B8B2K+Rr5labizoSOJKIZAcnf8qTXJUMJaQm4SaF+7lHM4yDTxZZYXaJq9MPvJ1nlguokVeIICvfYzp8iM7EjfB5j6V6eT9VSUcmNff8/H/wB/oRHF6fQHDbLCrSPIBhfEzHYjzJrx5ZJZJUttnR0ROFgKZJKylR7ZB/8Ayp17/BYUAmWwMdDWGyCi4jAGpdquEmBWvEHlg7qclpIsCNvNc/CfbmPmK9GWRThFT7j0/wAfH/AuNbQwTVOBGoKgjd/2FGfy+S4RIUaC4IYoEB0AN1yMFTXA8lbH2IL64X7fcaB4VjEY+uf3rqxxf07ejZR1Y2snJtYH1YYLseuQdjWflTljyY8ke0l/ozGNO0zb2/aLHdKxXvZVLqmd2AxqIHkCa/WvE8yPk4YZY/8Acr/5/wBTwsmJwk18Bq9oAPjiPyrp5ozLk7QWxxqVxRyQFy8bsj/1CPlTtAWLxayb/rqPcUWgstHELQ8p0phZYt1bt8M0Z/8AkKKCyxZEbk6n2NAWSyDyoGfUAVyQxS/4kSP/AJlBpVYFLcPs2+K1gP8A/GKXFfAFB4Jw4gg2cODzwMUcUBD/AIBw3IItsY8nb+9L6cfgLIS9nrGT8Mi/5W/vRwQFf/ljhxhaJkdg3MsQT+lVFcVSE0m7ZQeyXDwgRVXA5ZRTQ1aoEkil+yFtlWTuSV5Zi/1pcWgpA8/ZDUrd39l1EYBKkYpty9UJQSKF7ISZPeRWzDppcj9qlcvdD4o/KE08vcd0jsqdFRcfn/s1EpHRQNGHTxAxq3LVzP1pX8CO6myDOruOQeR9vkOZpN+2Vr0wqOR0XBRQoHQAfOhsSKHuC76UyT1Y9KLsf5OuMIS6ljUsZSoVtznB/DneopdjRZp6Rpy2B5CkOyx0CY1FM03SGMeC2cPETNCWENxjMTMfAx/lb+XPQ/WvO8vy348o/DNYY+cWyi5s57O4MV1E8Ei81dSK3xZ8eZXBktNdkbe2lvbpLa0jlnnkOESNSzMfb/eK0e9BdD9OBx8NuRFxWXvWdD3sdo4JiONvGQQWHUDbpk15Xlef9PIox3XZtjxuUbD7DhXZh00snG0mIP3ryxMuT106B+tYS/VVFdP/AE/4BYJL2L7jspdLKzW9xbPbahiV30Hf+nmT6DNa4f1bFki3LTQnjadDSz4NZxRIWCzlidfer4ZB/lz4eXTf1rg8n9Qy/VfF18HRjx1GmM5uzHBbmxWCASWcr5YS6jKFOeoO+Pnyrnx/qzWVZJ9/6EOH2uPoSR9iDZvJJxORZJF3EcR8LDodXMg+mK6vL/W5qXDHGvyyIY0+xX2isYY4bG5t8rHJG0br/K6nfHuCCPSvT/TPJ+qnGT2ic8eLI8IvHgQKrfAcr7Vz/q/iKVZF10/+Tq8LIpJ45Gu4ZxGO6PPfrk718rnwPGaThRO5vAL5FyNPI1MMT4NgloPW5CR5HP4WHpWDg26CjomWdQ6kMDScXF0waoh37ROFY+xp8FJWgqx5w5jLArAE5NceVcXQyfEQptHi+PXs22xGeXzrs8bHjivqdtdC3YRfcLkFuZ7Tx6sO8RGTkDcr58htSyuKlQ4TvTFttc96JDyAY43ztXNPHxpFSXwTeXIxUqJJRBEXn1dK0lKlQ29UPbfSI8YAI3rmkyaKOJXghtXkJ3Udegp4oOcki4xsQWVtd3KEpBJI7nWwVSzAeZ8q9mWKVUukXKcUqs0NmNEUccisGXKsp2I361z+VLFcHLaXo5op7GlkypcxyEDVoK4BxlTvj25V2Yf1LN4zjkx6a9eq+CZ41KLixlIZCCYHJ/pbc/I9a+h8D+1OPNNYs64v59f+jgy+HxVx2Cm7lx+E/KvqfqM46Pvtj9UQ/Kn9RhxPvtvnCh9qPqfgXE79siPxQY9jT5r4Cn8nftUH8ko9mo5x+BUz4XUHR51+dPnEKZNbxB8N5MvuKrlH5Fx/BcnEJQPBxJh/mzT5L5Dj+C5OK3g+HiCH3NHL8oVFicY4iPhuIX+Yqt/gC1eN8TXmkTD3FG/gCwdob9fitVPtRv4GTHaW4Hx2Z+VH9BbLB2oUf4lrIPai0PZIdqrX8UUootBbLF7UWB5mQf8AxotBb+C1O0fDWP8AjEe4o0F/gvXjnDmH/qF+YNMLPxDLcuzAyyAbbLz+Vc232zoqilZVDZyrv9cD9qWkFt7OtMrN4HIP82DtU37TAr7ovu7ny55NFP2OwgEJpTSNXm3T6U38AWSSIo1Mwc49aTYJHI5O8OMAA8+mKl7K6LGchcak046bn8qTfyxlYZpMNkIo3Az+dL8sY+7NsO+nwhIKjduvnXg/ra1B/wAnV470z0O2EHFOEx2/EI1lTTpBPxL0yp6GvmVmyYMnLG6aLlFexPZ8Jm4Gt3DYLJcXs4ILxAllh6LtyLcz8hXveR+qOWKMV9rktmcMSbtlFhwa9vNxCwmU63SbwE55YzzORXlZM+OK3I6m6GC8Ne1GJ43RhudakZ9q4nmU/wBrJ2OuE8KEuJroHuhkKPLNYz8iteh1QHxGyF0RHbqFvIho0rsJgOXs35H359uPOsiimtmsXw/gptHLQrqyCux89q5cqqTFNU9DiOVbqE2lw2IyuFc792fP29KrDm19PI9evx/6MWqfKJjr+xPdXfD7rwujZ8wGB2Ptj8jXpYc0vGzRn/maSiskbRkAHjlKtsynB9K+yXHPD5TR5ycscrXaCbS9a2mLAkZHKvnfL8ThLg/6HtQnHPBSQdaXhuZQ5O5OK4cmLgqIarRoHuB3Tgnpj/WuBQ2CXRDglzI4u42A7tRs3Majt+m/yrTPhVKQZKVM2lrwOz4lw63ngllVowBJCCpG2xAI3Hn1rz83kxw25Lb6+GZRbsNzFbwiJAI1XYKK8+3kdsYpuJWklGDgFhyr0ofbjo24pI1thJ90NTchzrjc+V8jlaM32pjFrfLcRYCXAOrp4xzPzH71phfNOL7RtB2qFyTAgeLntmqcGhsYwtoxjl1rCWyAhrlUUE/9qz4NlJGev7trq6SAYMZbU3y3H7V6GLH9OLn7NapWPOA31wk6W805a1kkAZZN8D06ijNnlOHCTtHNKKTtGnexhnQlW7t8YBIzj3Arzk1dsOTQkLTW/EhFOArq3uCMcx5iu2clxtGqpxtD62nDAefWuFO3TMpInNbGeVTCMknxeQ9a+x/Rv16OLBLD5D3Fa/K+DhzePb5R9hkXDoIsMxLnzYDH0rk8z+0HkZlxj9kfx2OGCMd9nOIRQtBIBHCpCkhlUBht0x+9c0P13ycNrHO9e9miwRk1aFV1FFE6CGRpEKA5Yb565r7n9P8AKjnxpJ26TOHNDi7qgfFd5kcxTDo5RYiJFAESBQBEigZzJ6E/WgDneSD8b/Wi2I++03CjAmk+tPk/kKR3/iF0vKd/nT5y+RcUff8AE7sH/EB91Bp/Ul8i4o+/4xcgeJYW90qvqyDgiJ4wT8dpbt8qPqv4QcDh4tAfi4fH8mIo+ovgXF/J+Y3jbfrj1zn+9ZOzoOJGBH96oJPqd/lSdAiYl0gLHG2r12AotdjqiyWZQwAxqB8+VEhLrZZ3i6cySZJ+Zov0xk/jYKwbGN8tjahgvwXm0YwCZIWa3BwZFGpFPkccj71l9THz43s04yrlWiQzowqKiHqeZrTfbJOxjA2yxY8z0qdjHvZe3aW9ljMiJqQEk8lAzk14n60vtg3rZvg9m14TLZRYtnvJ+8UkArbeE7+r5/KvnJ4sLuUm/wDJUdEoyY5tFaJS8cyTAsXYpnO/mDvXD5OP6knNO/8Af/Ipa0XWv3127A7lAyk8snmP0NU8Kfj1LTXv8fkeyy5u1hj0zRtIrfgGN/mdvnvXHi8ZKaeS0vwN36IrfwTAa45rfCMqqrhuoPIjBxj0r144/EyYvpxTW+/f/v8AgzqSdme4lK1vxANqDg4ZXXkynkRXO/H4Lgzrx/dEJu3SRTdxgh2wJR0Pk3z5H196z/ct9mdV9rKo5sb8qzlEllXaBRPbRXy7vEBFL6r+E/t9K7sM3khxfaCOvtMLxSMG71jYMN6+p/SM7lj+m/8At/2ObyYbU0KruTTJkDNdnm4lOHL2h+Hk4z4vpk+EXOm4ZCf6hXieRjuNnoT07NPcT4gWQsMkda8uELlQoP0M+EwmLhok06e8bXjrnp+VZ+Q5P3pGc3cqNX2SvY7Nro3EmmNkXA5kkHoPma8fzscsiSiJIIv7pbiRyhMYY7DTk/lUYcXGky13ZOz4fazESPcTEg7hVC4Pkc1cssovg4hKb9Glt4bNYgI5pw4/+ooYZ+WK3xLwM6qUnB/naOd/UXoScZjbinASxAjlUiQajsjKdx58s1zY6xeQt/a9GsXxZnZAlpEpE0Nw5YfAxyM8+YHrXdLCm9S1+L/4Hbk+ghpGibQ6lTjbI/3kVzzxSi/uGqYJc3MrlljilfSFJKqWGCT5b9K2w+O5K0XGl2wHhWr7ewkDKwQnDAgjl51r5EXHH/U0yNOOjQ8PgywbGMb15uWdHOx8vENO2reuPhJdBRTdrLxGWA20byzxnkgySp/sd67PD8fNnbxwV2HOME+Qfb2V9AodrWRs8iuGA9dia6sn6R5mJXw/2ZksuOT7G/C7lJJDbO8a3PMRM4D/ACB3rHxf0/yJtqt/l0/8icsorYVcy6CV5Hr6Vl5kcnj/AG5I0KCUtoS31ySWx/Kf7fvXnwuTtm6VAQk+9jUHmv586+3/ALN+Q+cYP4aOLy4/a2XV9secfEUwIkUCOYoAiVoGRK+lOxECKBkGG9AECKBFbCgZWwoEVsKBoqbnQBUwxQFHgbTBvgbG/Inl9KLZp+Cl5D3g+Ejq3ICk2CRIBVOrckjIHSgfZ2SMggkqMefKpGVOcshCswJ5kDB9hTtCosSZdWA5IHPG5zRf5CjWdhbt1u5yuloSFLagGDKTggg7Ee9fPfrn28ckXvZ1+O/tcWb7jfZPhPGYHayiisLzYiSJdKMfJlH6j868Pw/1jPglTfKP5KnjTPMuIWVzwviEtndIEmibB2JXHQjzHrX2fjeVDyYLLD2c0ouOjUfw/iDG/ncBiuiMbb4OSdvkK+f/ALR5WlCC/LOjx12abh9gvfSyEZJY18vlzOlE62FaJbWdJUYhgQQF29hRhyfcpfGyWr0QurkxgTSnMgYk42yc1fKWVtvtnTDGqL+C8RuZI7xu4mktTmTwpty6HlTcZwcYwdfJGWERjeWavKvhQOcFGGyt5ZA2+Yrb6ksGfhkSv8dP4OftaMfcv9ot7mADEts7OgPMDPiX9/lW3LpPpnTH7Wn8kuF3QMIV91IIOOorDJHjOwyLZQZe6ldGJOk7etU48laJYdaMk6SQS/BMpQnyzyPyOD8qWN8JpmbMXxIEMUIxJGSh9DX0H6ZJ486T9izLljYTwXs4vEIkur2RorQ50hCNcu/TyHqflXo/qH6jj8a4ds4sUG3aHFx2b4PcXdqtlw25tZcgNJFdHQFweasCST715Ef1GGSDUo7O1PJ7djePsj3FxE0sgubKM6yCMNkdCBzH/avIzeQ1FuHb0VHJsmLeW5UFRhCS7MeQyf1rmnmUUo2D7sPhtUjQYHzPOuSWRtjsm8egEqC2RyPWkpW9is5cSzuEAmkVPCxXUd8YIz866l5E+PFhGKHvDOLcPnCx3MU1u527xH1DPngit8eH9Pyrjki4v5TIn9SO1sZK4jSW1n7ssuJInH4kOzAeYz9M1vl8SvFlhlTlDcX+CFK5Jr2eUcSSReKy2aNkxzGNfIYPP6VOJJwUvlHcq42MEvJbW1S3iijkjDaiZSZA3sD8PsK0WeNKLirXyZceTuwiG4eOU3NrqtLgrgiPZR5EDp+m1XOaglkSqS/2Eo39r2h7I03ErW3ecaZ1XBOcq56nHMfnXneR5UctKqomK4MpiR45ND5DDoDXBMvsu+zyGVmAJjzkDz86jmqr2VeiT2kjD/FfT0ANaQ8qUVSdEUBrYujgoxVs8wcH1raPmTXUmDoKt7MbmbLEtqJbc8v+1ZZM8pPk3sPwhss0qwpiQsAMb8wKqfmTyY1Ce0QopO0UTXBZgSD4h+eeX6Vxxgl0X2UrJniqhTsG0/LGP2r6H+z0mvJxpfk5/JX2MbGv0Q8o+NAjlHYHKYEaBETQBEjNAECKYyBFAiDCgCpqQytqBMqamMpb2pUDPz8Ci+JVJX+r+1F10albSAnwnLdADsPy3pX8AfB3VxqBJA/3mi9hXwTM/hLEgtnG4zii72C+EWR6GXJYnHM5zn50Ug36OKwOQgULjckUfgLNB2QbF3Op27yMEfI14X65D+6jJen/ALnRgf3NM9RtJm7qKQbK4B9q+Ny4XjqXpnV3oB7T8HXjturwzCG9hQhG05Ei9FJ6eh9a9D9L/UpeHJp7izKcOQo7BwvZSXcN6jRuJFVlfYg46iuv+0WRZvpzxu1T/wBx4ItWay2DJNMSyKkSnWXYAbcvU5GOXka8XF4r8mPJaS7b/wDuzpnJJfyGxR27cPifiIc3AGW7l9K6/QEE1MJ4U3DHBtv8/wDgj7k9Caa1jvLgzRR3MsMT/eIwGk/06tt/St8WHLwcoxr8myzUuLNBPxJ5eFzxCMf4LKirggbYxgcq44wywkk9mNK+xfwe7D8ORSoxEdJ9RXZ5cPq+OpJbiOuM/wCSri1ks8iTrgTqCFkPNh/K3n6HpXJh8qTXCXRfRmLyFLOVBBrMQRTIzrj7w8wPQHb1xmvU1OFezSMnPsE4jNmWGbVv8J9fKlijpxFXaL7SfDc6yyQ0Q0CXtmL3jZB/wn+9kx5DYj5n9a7MefhDm+0LpUaWKNSiqiqqAYVVGwHQCvKy5ZTm5S7ZKXwXrMsKyMcYzzx05V0JJLRtw0au1JeNTkDbIFef9XtNnM0L+KQi30PEMRscEDoaz/c7NIsHiyUXPIis32UfS+FN+nKnHsQulnBYE9FA/M/2rpjDVFpUUB8YOc8hVNWA9seKf8n3c7EhCCp8gdiPp+ldmPybxSxT+Nf8GTx/dcQLinD45eJSTKVDyABiBjI8xXJjztwUb6LukfMkFlAzxRKGAzqPxNj1rb67l9qRK2I7R5HE07NqGsfVt/kNj9a2zzckotnQkujVcMkDW8RB2xXjzuMzGSD7iMMobG4H0pN3tkp0cs2kAxKBnpj9KxlV3E0CzGvMbA1g5bADmYJIuefi/StYW1YHZf8AEcry1aQB6U+6B6Og460kxFJIDjyzn51SAo4dluIRhujE/lX0n9n9+ZFfCZz+X+xj/TjnX6C2krZ5QVNDFZxq1wS0x3EYHw+9fI/qX6823iwa/J2YvH9yM3x7tC8YK2sMfeHZXlGTnoMD1rg8D9Rz4pcMcnK37Ol4IT3IaR6zChl0iTSNQHLON6+9XWzyn26PiKYjhoAiRQDIEUICBoAgaAK2oAqagClxQgKm50BR+eFl1bn70nfGCBT7NNo+MuTsGDf0jYVNj6IEuN8EjmWPKkHZW8iYO7L64/KgEiUeyfGWJGwz0pdjOQse8w2MDkB0p+gY94NcLbX8UzklFyrNuTvt864fO8eWfBKC7/4LxzUZI9P4Ddh4RAxG3w+tfIxa/wAOS7O2S9oLdzGxxtXnTxuDaY1tESUlkaQAB9IyfPHL8qhylSi+i4Iq+0y3GuP+VVGcdc7nz5bV0t8cUYLrtjSSfJhF+txeWiqNCR4xpUbn1Y+ftiso54RlUY1/5FHTsqs+8aGHv5ZZVjH3aO+QmDjYdNsVpnzzmqb0huKT0MUKqNQJz0xXntuwoqtYnilaZE1JKDlEGT74r0/HTUPuVpibXV9DC4Ro4YtZUxTKHQhgdQrkl4U8M05e+g5piLivdJPH9o3t2YJL5hTsT8tiPavX8KF3Fjhb0uzJ8XSS07+CUfewPpb5HmPcHPzqo4+M6ZqpJ00V2NzllGrNTlxksb8PId55epYRj5bn8zXLm+1KJDVjiOYIoGehya4nC2XFWDvOMHHMkA/XO9dEVqjpa0aWz4jHFCihS8hGTkdK89xq9HE1bCHd7u3lDgDI8PoRuKmK+6xLTFqXIVdLHG2abhe0a0RmulKsCfce1OON2FCK4uPupHBySzFfYDA/Wu6ENpGijskshSNNZyQo2pNW9EtFtvI8xMUe7Hb29alwS2xultmhU6kAdtWBjV61ycePRg3bE3aS8ENiwLYY+EGunxIOc1ouCtiixctwcTNnxzk7dQFAFdWX/F4r0jpS2aDs9diW1CZ8SMR+ded5ePjKzDIqZp4iDDj61yRe9mTI28u5B3I8+tZTVO0XF2SM2keYqONlCu9uVPEIlBzkfqyiuvFjf02UlaL45sxKT8Rz+tZSjsT7JGXypcSSp5MHNUogX8OUG+Qj1b6ivoP7ON/9Yl+Gc/lf4bNPbBLeI3EuNR2jU+fnXsfr36pxX/T4nv3/AMHJ4+L/ALmIuMX+BIJDl85z518fbb/k7UjN8FgPE+NGV97e18Z8i5+Efv8ASvrv0Dwd/XkuujHycnGPFezYV9aeaRNMCJ2oBESKAIGgCDCkBWaYFbc6QFbUwKmoApagZ+e0tlQagxx5Yzn3oRpRwlQAGkIPTwjP+lGkHZYUDrk6tONtqG7F0wbuQzAAA71NN6K/JZL93HgLgZ+tFfIHIhkkMoUjc+lOvkB5wLgV5xYqLSS0JLY0vcBCPcGuLP52LxnWXT/g1jilKPJG24dwfivDeHK96sOIzjMUwcgdCcV8j52fBmzOWH2dWO0qkMhc/abXUf8AETY1hNfUjvtFVTKoJvBIRzArllDaNYh3B7cPCJCN2Oo1j5GRp0JjOdESMkHTjp51zRbboa7M/HdKIWy2NDcj5Zx/avQeNtmnFl8l4sbAupKY5cqjHj3siiP/AB+G31Jah8F8jvDkry5Yr04y+nGscf8AMlY3J7D4+JNfKJGxjOwHIef51y5sk8k1zfRMoqOkAdoWD27K2AxXGfOu7xp/3yT7KxKmIe1Rabhlrf8AWW2Ebn+tBzPqR+ldeWP99TKqm4md4dOQgJPLpUZoboqWjQcFuB/wpZGIBLu3/wB1ef5MP72l+BVYcLwPACdxWP06kawjsBvrrTGSNtwMkc66MeO2bS0h9wybvCJJW2boPKvPzxrUThfY++1jusR+EVxKLTIEN9daLhh0O9duPHcbN4bQruuJlE3PiJ5iumHj2zWMdi+5vTpKjdlVE38zua6IYvf8lKIZ9qLxopO561j9OnZFbNBwhO6iMh3dvyFcOaVukYTlboNmuEVCc4zWKTbJSMV2lvWup4YEOWY7gfQV7Ph4ljTmzoxxD71lteGxWyMAIgN/Xqa58ac8jm/Zquyjs7xEx3zozeF8HGetX5eDlBNEZFas3treAoN8npXhyx0+jmaJxzBbjOcahiolG4jiRuJiFkBOM8iPOnCF0aCWK4MnE8k/Dgbn3J/Su1wSxmi6DrK4D24AbGNs+1YZIVIiSLFnJzk+1Q4EnGlpqIDTs8UfiAaQ+BYmYjzx0/Ourw/Kl4k3kit01/mZ5oqUaGPFL5mYvIBjGMDoPKuablJ23tkJejI8Vmlvrxba1GuWU6VHQep8hXo/pvhS8rIor+oTkoK2anhXD04dZJBGdR+J3x8bHma/RcOKOGChH0eXkm5ythJrYgic0gOGmBE0CIGkMgaAK2oArNAFTCmBWevWkB552r/iNNwPjEtlacPtrhI8Bnm1Z1deVdUKSpJMwlt7Z54koiIGFCjqdya5ujqq+gnvo3+HxN7AVTYL8nzxK6Z71ifLPKih2UhSrLswA577mp/gCm6d2PhXSR1I/Slv0CKYz3anfGfPmaLHQ+7K3n2PiK9+AYZPCSd9J6V5H6v4jz4eUe4m/j5KdemeuWF33mEBwAMf32r4KScDraF3EbAWeu7t89z/ANSPGwHUj28q68Gfk0mHapiWSUIJwp54INdDinJGkB/w24KRRnppHLoa87NC2xstvbpAhAxnp61OPG2wRjXuitxKjYAc6cjlv+2QK9mOO4po3Ox3/ewgE+MDGP8AfzqZYeLIkt6B2ddXPbNaJMEPuGTqtlCcgcz+dcmSP95sxntsjxqcOmpWBGMEV3+HC86bHiKoCbzs/eWYAkmVC8SsMgkZOn0yMjbfevWzR4ZFKtB5MG48o9mGiaKSNjaMwbGe5Y5YDrg/iH51pn8fdo4sXmc9ZOx5wif/APoyKCCNR/WvEzw/vmz0YLQQLjShGeu/So+ns3iqF3Ern7sAbAHOK6MMNhNjDg3EcFVBzjl6Vz+Rg9nJI0y3o0bnJxzNeY8TsgT8Wut1bVjGx9vWuzBj9GuLToz0l4WcoDnLDl1FehHF7OitFUl1qKb51uz4z8h+Qq1jr+hX4HnCiJCGJOlOfqa4c+tGE5V0aGO+076tv0rz3iswoX8V4uscMgzggH1roweK5NGkY2ZvgzmfiqzSEEqc/OvR8lKGJxidSVIYcYuCQcHz9cVz+PBAKLS5KXKMraT711zxpxoUujb8I4gGjUg14vkYaZzSQ3lu9Kh+eN65I4r0SuyN7efd7ZIxkH08qePFs1WxXYzZmuGIOoEkZ9F/1rqyx+1L/wC7L9BNncaY0G2joBtvWWSFsJUw2NzuWO3QVhJeiNHzy55UKIDqwj+ywM0hHesP/wDEeVZzoxlK3oE4hfE6Uj1MzkKqKMkknGAOua28TxMnkZFjhtktqKtmw7Mdh72ztjc3fdC+mHiTVnul6Lnz86/SPA/TF4mPiu/Z5ebyPqPXQ3fs7fDkEPs1d/0pGPJA78C4gv8A0c+xpfTkHJA78Iv1520nyFLhL4DkgeSxuk+K3kH/AMaXF/A7RQ8Eo5xuPlRTC0VMrDmpHyoApkOlSzHCjqaai30DaRS8iadWtNOM51DFX9GZP1IkEcSIHQ60P4huKhwkhqSItSpjtFRxmkM/PH8Q5B/5p4gDviU11xqjE40awjDMJMdGb88CuU6tk4ZEZiExv0UYpp3oQfG8dzbRFQiPEhDrnd8E7genL5etZYsnJuD7RnGW9n0cuoELjT6AnFbp+jR7KZIsZdhqJ236UnsAaePB1adI54qWqGWWoRkReYHMAGkqfQ6Nx2Z4wTiCU4dcbk7kV8b+s/pv0pfUgvtf+h3Ycn1I77Ru4ZVkiwdJBGN6+XaaZoZzjfBjEhlsw3dgeKMblRnmPT0r0/H8jlqfZUZK9g9pdaFxnpRkx2zWvYJxG+whUnY7g+XnW2HDbsF2Za5udVydyQQV9vKvUhComl2ij7UUkGDs2/tV/TtB2Ei5yc5ycjFZ/TEjQ20oWzhAIOEFefONzbOeW3Z9dzGS2cEb4yDXo+AqyjjpkOD3Zt7pXVsbg/nmvX8nHzi/wdD+6NGY7SG0t+0F7bXIa2dJdUc8I2KnxDI89+YxyrowyjlxpS7Pns2PhNovtrkfZAFlWQYLF1XTq38vOvI8zElmPX8Jt4lZY8x04BOMc81zKJ3qgDiE2oO2rGMY8/et8UaIk/R9wy80jAO4x1oz4jml2aKK8LjY15ssVEoheMDbyHrpNVj/AHJFQ7M1bTMzNJv4VJx616U4pJI6m6LGYtcRxjAKqq1NVFsOVbNBBKIECqeXP1NcEoubs5m77I3F+QpwelEMNsEZ6fiJnlZWYnfOK9OGDgrNsaGfBZQjg9a5PJjaNbLuIyh4iV51GKNPYCbVqI2rrolmo4LceBMHwjYYrzPIhtmMh5Jcnu8DnXDHHshIqmmPcI+rbTjHqKuMdtG0SixlxHM5IyQ528thWmWO0v4GW2NyupUzkKBvUZIOrBjOO45jYe3WuVwIoMsnBl1tg6TsD51nNUqIm/SGNxeYTcisIw5MzSol2K4ta2XGZuIXNo113P3cGGA0OfibfrjYe5r7z9CwLxcbnKP3P/Q4vLuVJHoifxEsv+pY3K+xU/vX0H/UL4OH6bCU/iDwdvjS7j94gf0NV9eIuEi9O3XAm53Mi+8Lf2p/Wh8hxl8Fq9teAN/+oKv+aNh+1P6sPkXGXwXxdq+BSkhOKWuRzDPj9aayRfTCmELxrg83w8QsW/8A5Vp8l8kgnGls7/hF5BYXdnHdSxFYpVdTpbGxp2vQM8ik7G/xBdSkfE7G5j6g6CD+VNTyroiosBbsn/EG2heEWHD54mbUy92uCaf1ci9f7C4R+TgT+IVpGI27OQtGvIIpA+WDR9af/wDEfCPpg5452st2/wCZ7JzEf06v7UfW+Yhw+GUy9s+IRZ+09mLyP1G/7Uvr4/cR8JfJ5t2it7LinE5r2ew4hC8zFiCvWplkxN2nRUVJCq3lyNJCKD6DH0rnOkIgjiGdTscfy7CivTGwGVEh4uunUsdxGQu+4YHP7fnWGXHyTcdMwyL2M7HiHfSJa3LiOY7JJyWT36BvyPpRgz/UVPsUJ130HyQMjac6Mc9Q3rq/Bun7RQ9oCzENkjrikAGkTRTKrZO+Sc1FUx9h9omljIhCkbhj51GTDHNBwn0yoTeOVo2PBuN95GoZgHzjGetfBeb4EsM3Fo9JNSXJdGqjuFaAHPTevKScXRJmONQiKVpIsKGOSOWDXo4ZXpmsJ6pmU4hcaiQSc9Qa9PFCjQQyzHvPnmu+MLRROWTvELDkDq+tTGNOgTJW7l9K4wW8jSmq2EtGi+1aRjlgY3rz/p3swKHuyU052J89q7PDx1lQeidlcBcOCdhn1r2pK9G8XaFX8QZlbitjMQo7+1B5bEqxH6YrPFipNL0eP50PvFdtcBbNQNhqI/euTJjfPZ2/p7vF/UL7/Ma7n51jw2d7dIEvJw0bHqQNq3xY9kORTw+UhsA+tXngc8nZo7Sc4G9eXkgSFtLqXntWSjQ0Z+2PhbJPiYLjy3zXoT7OlsL4f47mWYjIUnB9ayy6iokZHqg15STXOomVi3idxpiOK6/Hx3IpCm0b/md9/Su/NGo7N4bHfDHIklB5BcbeZrzcy0htn0lzrhGcZ5ULHTHYAZPFgttit+ImzQcEl0qp5VweTExl2ORNqOOlcXGhEZpPumB+H9KcY7LT9FdvOEsWzuTGd/c1U4XP+pZG2uNTbN+dOcNBY0tZGZiWJxXLOKS0RKXEYwXIHKueUDEp4jflIiEJLnZR5npXb+neL9XKrWkDHfD7cWllFDnJUeI+bHc/nX2cEkqPOyS5SbCDVkEDRYis7UwogSR1oERY/OiwK2x5D6UrHRWyr/KKBURDMhyjuh/pYihOgqyxb+9iOYry6Q+azMP3p8n8icY/AQnaHjMQCpxa+X074n9ar6k17Yvpx+AiPtb2ijQsvFbrSoyWfBAHqSMVSy5PTJeOC7LF7bdoNBb7dFMgOkkxxuM88bVS8jKumJYoMqftjxVjmRbFz5m2Wn/1WT8f5A8MTwRo5FcAvsP5cYpGhdCTz3bfbIwKa7CwTjrlUtpgTqSQ74wBTu9EZAgwpeQ6ycatx6Hr+deTmbw5Licy+Aqx4oyFbTiLHI2jl/v5ivRxZ1kjbKjNw2uh2fiwrkqBn0P+lbo6FJPYK4JkGcA8gBSeyui0oiNpZ6NBfwfOxi+8ibxDcgbZri83xo5oP5R0+PlcHT6Zq+B8XE8CMzfhz9K+J8nxuEtHZJbPuMXQaNhmlgx0xGVukMqNhsMN816sHxZcZV2Z65Y75NehBGpO2k1xgZwTlTUzjTFZbw5gZvF+Hf51OVUtBJ6GLz5HPeuZQoyX5KFmzsSd2HWuvx4f3iAtt7jEYGdwSK9KSdm0HQF21xccL4VN+NHkjzn2NaY7jJ/wed+oLpiTh85Nuysd1b9qy8jH91o0/T5fY0wrvSI9hneudY7kd7kCTSlhzrohjoyvRbYtvnkOVY+REzbNBay4AGc15k4iQRNcJDCXkOw5DzrOGNydIpbFkLYiTc5wWOfWuqS2bWF279ymnOfM+dYzXJ2ZSley3vRjNTxEhPxKUv4emfpXf40F2XEHsjhy2NhyrfOm0oo2g9WNeHzBGlc88iuDNjekgbBJ5cPMgO2okDNaxhpNgmUl8sD0OKtRE2PeHyBUT/eK4MsbbM2N0m361xuIHLu6KwMFyKcMdy2NfJCWbRasNzgKo8/9704xuRVldq+oFSQMeXWqmq2OxrFNoGOWwrllGyJliXWkHJFS8dkhPCNN1xNJX3jhGvHTPSvov07CseO/bOfPKo6NR9pTyr0rOE++0J5GgKPjcJ50WBAzx/zCmBBpo/5hQIr71TkaqOwog0qgfEPnQB1Elk/w4pG8iENFE8ortgvEbu14aueI31nanoks6629kXJ/KrWOTVkPNBdGb4h20sI0YcPhuL1xsHZe5jHrk5Y+2BSqK7ZLyt9IVC97VcZ2tybO3brCoiUf/M+I/WhTS6QcZS2zQWnBi0CDjF3PxOQb6Z3JiU+icifU0SyN6ZrHGojGGCK3BEEUcY/oUCoqiiR38xTA8eW+lAAZMDPPlXTyJomLqQ4PhB+pNFiLLtftlkyElnG4x0IpSuvyElqgXhNwU0xMSNey/wCYbEfMYrDyMf1Y/wCxytBt3ClzHvjPnXm45OD6JsqsOKyWLC3uwXiztk7j2r18WVTRadO0PbWdJcSRNrUjAZf97VqdClaLwy5xpDHrttS09DRMEd5qA3Hn50vyNC7h183D+IyQMfu85UHqprw/P8NSto9HFPnFMbXt+JM5PyryseGiroFWQEe9a8aGZ6ZiTht9yPWvRgjayu0c4cDGQQd6rLHaJbLtfdXBKk88gVCjyjsOVoKeRXXOdqxUaIKFmCONbbZHWuvBH7kx1ZbFJoklTqDmuuSfZcZFPHJRJwqBSclZyR7Ff9KqHZy+fXFMT25wWI57Z6UZFf8AQx8CdScS15MgjrUJUz0JyBw2cZ9610ujPsLtHwBnnXNminsnsdW7/lXnTVACcRnMkoUE6F2G/WtsEOKs1WkS1gZIJOMKKniOy8Sb4zWfEyJSyaY8g70QhbGmK7ttXQc8Zr0sUGik6IxHShA3J9KWVcpGqdItE2ghV6bbVm8d22K7Iztk6s4zRBUTZBXIOR0puOmPkMbe5KKmDvneuOeK2yX8jmCfUoNcUoUI+vbgEKoOOS08cPZd62VT3Qkhk0nbX+lVHG01ZKkmW2DFckkHyqMqspMMM+XbeseGhSeyp7hmYIvNvLfaujBg5yRN+z0PgfDxZcPRZB98/jfP5D5CvoYRUVSPOyz5SDTCp/DVmZW8CjkMUqGVmFc86ehWyPcr1GaWg2fC2VwdK7DcnkBQl6REsih2KLzi3CbXI75rqUf9O28X1bZR9T7VnPLix/vdf7mDzyf7ULJe03Ev/wBOs7WyT+Z171z8zgD6Vzy/UYRX2R/zIfKT+5ia4ueNcSkaOa+urgvzjgOgfPTjFEPJz5f2qgjD4RZZdkWPinMVsp5qg1ufc8v1rZY5Pc3ZusfyOrXglrZlTAilx+OQam/Pl8q0UVHo2SS6QYRKdy2cdaYaInvBjDc6BkNU3PNAETLJQB5jcFWXwgbjnyrp2Qgdi652LDkCedK17HRbEWOxYIPIClYMDu0WC4IkJEMuMtjdG6N8qmOnRz5I0w2CcyBllAE8ezgcj/UPQ1yeTh39Rf1MWvRG4ijuI8NnUORrmxylB6EmL7e4uOGzkqcodip5NXp48qmtGsZezTcOvI7xAYCQ34kY7rW/ZrGSfYfspCsPcc80mi0xP2kDr9muhgMh0HT9R+9ZTipdnRgnVxAoL4sAM8sbV52bx0to6k7GsU2VG9efKA7FPEPDK/LHPNduDpWaJgttJic7DB6VvlinHRLkXzOMIwPocVjBXaBSLI5fu9/1qXC3oGwa5kI+EjHWurBHexWXiTWVbmGXJromtFJ0fcQGqyBPRwPqDURe9GHlO8exQrYkB89jWzjyVHn4p8JKRZI2FIzUKO6PVnL2Vht96pk2FwNtvisckRpjZJdERbrjavOlD7qGLQ33wDHA3NdTiuFjci1ZdSJ1y+fzqXCmwUrCg5zt0rncBWVzy5A3yK6MOJFJg0rYVABuBn2zXUlXQXsir4XOfQVPCxuVaIptg561VIXKw6CLvfAOZ5e9c03wVsmUgOTUrsu/hwd63rVkxybout3B2PtvWGXG7s0chtaTDAVcVwZICsG4pfEA9MAnatvH8e9iyZKF9leOY2TI3I/SurPgSaZjjm/ZobObEWpjvivKyQt0dMWfGfrzwM0RgF2aLsJw03/EjcyLmC2wTn8TdB+9ej42KtmGadKj0giu2zjIsD50WwpEGFKwKmXl50wdIT8S41DaM0duBcXI5qPhQ/1H9h+Vc2byoYf3d/BzSzOWo9Gcvrm4vSTf3BdeYhXaMf8Ax6/PNeXl83Nl1HSMaRG1tpbs6LGDUo2aQ7Ivz/YVeLw55NyNIwchxbcAiUZvJGmb+VfCn9zXoY/Gxw3RtHEl2MliSJBHEion8qjFdBr10RYYpgcIoAgwosCBAJzTsCOnAxSsRBlx0ppgeThTgEMB5sa6GSWxyhSTzOPp86PYFqxxN45HAPvRS7Ffopu7T7RCyoUyNx50pJ9oUlaE0MrtH4WIuLfl/UnkfPH6e1Wvu2jmYdDcRzx602PVfI/2rgzYFH7o9CaJSgTJpdaxi3F2hIAaOS1dZIWKsu4IPKuzHl5Fp6H/AA3in2tdDHTc9V6N7f2roUuRrGXyF36farWaBtmYeEnffoaT2bRuLsyEblHKsMEHkehqJxtHZGSTG1rc+EDrXm5cJpZ9dnWuedTjVMdi4sEcY6b867Y7iZtnDdgh1O4ByKaw9MiOXbRfHMDHkH3FQ8dPZqpWU3DkHbPKtMcRNhduyhU1Hl/atHVUDZfeRvLwdrkEhY5VUDPTcE/pUxic3kZLqPwJZNmPLzzW35OMrlYlAwPPY+hoSR0wyNqjqHVy5/pUtUzpTtBcTYIHI1lJFph7SgIFbmRXK4btD5exVdXOg4yd9jXbjxJpM58mX0i6xmZzGD0GdumaxzwSVmmKeqDdZ1ZHTqeWaxhBdGiZB2LEAk71skkXaSInxOcVW+kS5UVyRvqBGoLyG1XGlo45ZW3ZdFE7fhJqddlxy0HMzWcWI0LXUmyKBkjPU1xuMckqk9A8jfQ/7P8AYLivF7F2wsM+ksv2htOs9EH9zgV2Ysc5yfqJlLJxX5M7xjhF/wAGvWteJWstrdLgmOVcEjzHQj1G1XPC0awzqS7IWsh1A7jHTFcWbFV6NuRC8jWWcqZcK45AZIqsNxjtdGOXIk6BLRH5AZBOSa0zTT2ggN0kIUgbkfKuD6dnQpDfgnCLrjF0Le1XYf4kjDwoPU1pjwvthKairPXeF8Pg4ZYx2tqPAnMnmx6k12JUcjbk7YQ3ypiZAnbfnQIizAAkkBQMkk4AHmTRdCb4q2ZbjPGmucwWDskHJ5uTP6L5D15n0ry/J85L7Mf+ZyTk5vfQieRLdAkS5YnAUDJJrgx4Z5nYlb6HXCuAlsT8TGpuYg6D/N/avZweLHGt9nRDFW2PgFVQqhVUbAAYA9hXTZqQagKINzoDogaAKzQBw0AQNFgRNMVHCKQddniyTFt3Z8nodhiu1kBMbF056UB5Dz96jfY2XJA2kMyqpPItk0UKyaQoG3lB686VWF/Aq4kht7pZ4cAZzsNs9RTjpmU1QFM/cXCywZWKQalHl5iqoha0MLe4WRdQyPMeVcWTFxdk1Ra51DBxnl71klxeg6ApI9DakJDDeujHN+x3So0PBeJi7ZYLtgJh8LHbX7+tdMXyNIutMSdowkfGplRQA2lvfbnT40jpx5L0waGXC7VjPGvZ1KQX32oEZx1rCOOmU2L7ssH3yBW+ONaOfI/bF7ticE8s1ulqjnfdjC3k1LjrnOaxlE6MbJyOGbbc5pxj7NbCrSGS5lWGLmeZ8h506t0Y5cvBWaq4s1/4JPaxDYRHTk7kjf8AankVJHJik5uVmHYgqp64+dC7Ymct2UMVO6tsacl8AtESphlIxyO+1P8AcqNceWtMtgcE7HaolE6oyXaDu7muVH2ddb4+Edaw40+gySSQmukc3RR1Ksp06T0NdUahHZyN8mM4VEUYC7E4ya5JPmzqi0lSLl1Ead+f0qkqZqnQXa20k7hIlZ5G6D/e1FLsmWT4NJYcFtraH/mB3tw25IOAvoKZjJ8tME41CtqYNKZWTOQd8HaspwraMMmqob8HtoPs7s8MZfSrAsOWSf7U8cE+xQk26HViILfLxRRI3PKqBgVvGKj0jVmp4JdHvFJY7jnW8JWYzR6Xw+z4V2ksPsXG7K1vY0GUE6BtJ64PMZ9CK6lUkYNtbPMP4z9iOw3ZLhz3Nle3lrxaZSbbhySiUP6sGBZUHnn0FTPB9SLb1+f+PyV/1LjUVs8e7K8Jk4vxWO21KJJs+JxkAYySRXl5YfbUdG+NtytmrH8OeJK5Ec9lp6HUf0xXN9NtnTY64X/DqKFg/EblpvNIVKj6nerWKu9j+obG0tILG3WC0hSGIclQY+fqfU1p0Q3ZaaAIMaBMouJY4ImlmcJGvxMf09SfKpnNQXKWkROSirZjuL8Ue+YocpaqciMc29W8z6chXieR5cs2o9HLKTltima4J0xxAtIxAAUZ38vU08HivIxJWafgXBlslFxcgPeEe4j9B6+texjxxxqoo6oQ4jjO9aFlTHANAyBNIRWx8qBkSaYED6UgImgCJ9KYESKAIk0hHi6zLjwgZJzk12v8EBUMg/Dgt5Cl/AggmV8qXAPUKNzSpj0VTRGM5UEHoOppK2JFMwEsDI5QMdx/Nml3oTVigIZYnh/EPvE/cf78q0UrRh7B4JWhkyPmKcoqS2OhvE4dVYE4xtXDkjwdENEW55A28hSSsPyVuu2U2YdfKri32O6AeJSvPdySyMWYHGTz2ruj0VZG3mGcPzpONnTjzemFE45NlfPyrHi0dKkiLgyKRk56UftZE1yVC94W1gHmds8615ROZxadB/diFAg543J5k1km5OzeNR0QaQIck48tsmtFGxSypaNL2QTvYpnA27zHnyAqorZx5ZcmamNMHSw22FLKvtF47++jzadDDJLE3OOQr9DUL5LfwDnZ+mPOqsQRJ441k6jCt7dDUftJl8nwjVyCPCfOlyaGpuLLViLhndiY4VDac41HNVFqq9lyk8lNjNLKXipkvI1hRy+67jJx51x58qxS4v2OORRVBlp2bubmC8lkubWBLWBpiGYkuBjwrgc9+tXhyRndFfXS0a/+D/ZbhHaHjVzFxeOWW3htXmVVlKZYFQMkb43NbYKySaYnmk+jWrZ8PtO9tbWyjhgDYxGuCfnzNcn11FtPo61jbVi7iXCl095Zg+o8q2U1Lohxa7MV2ogeJbbvAQ2s8x6VOToxyrSD+HnCyKNj9mib/wC4/wB6qH/gzg/vDoZcgA9K1OgaWFwV3yAc8/KqTJkgfjX8UZ+Eo1r2dZGuyMG6Yalj/wAo6n1O1bwy1s5ZJPSMPHw3ivGbLifaC/kknit9LXFxO5Jd2YAKCebb8ugHtROU8itkqKj0em/+GngUPGO03FLq9jMkNtaaQOgd2wPyVvrUYIRkm2jS2uj3r/y/w+3uGEdqTj+Y7VssUF0g5NoIbhPD5RpeCMD+k1XCL9E8mugC57H8NkU6JJIyeuQRWb8eDKWWSMl2j7N3HCUEwJltidnA5Vy5cDgrW0bQy8tMzM80cETyzMEjQZZj0/ufSuac1CPKXRc5qCtmK4vxWS+k1HwQoToTnj1Pmxrw/IzS8iVejjk3J2xHdXPPBIxzzW3jeJyapC7NR2Y4SbWIXl0n/MuPAp/6an/8j+m1evSiuKOvHDirHxOBQaEC2DQBFiDuKAK2NAEKAIE0ARJoERJoGRLfSgXRwmgCJPzoA8N69Plyrv1RmGWvMaQwz0FZ99AHhygzpA9aLF6OZ1eJt88jikUj7ZCCABncDrQlT0FiriC91c94owM6v71UTGapgd7Dg60G1OOtE36I2c+hwpPhNKcOQmMAcjauTr0TVENWG3pV7DYvutpnJ867cbuNssHOxyfOtALYyehPy6UilJrosErIc86nipPZayyLmuV0RiMAl1yxxjSc4x6/61H0ldj+q2fXBZ7MOCQVbB36HlVJJSIk2Lxlmyd8+da1RBuew5Q2ckZbEhcuB6DAqYv7mjOZqmTBB60ZFcWGN1NHnnaGIR8bv0A27zV9R/rWMX0bz/cKpFwARVogJsSrNoY+FxpPp61ExfgkEaNmD7EHBz0qO+iUmyyBtUd2m+8eR8jVpaNE6Nf2etMdn0uI2yBIwkUc18j7GuDzcLa+qv6kSe6O8QYx2VxpJAZNJx5GuTBL76EbH+BjaOK8Q55azZPq6V6eGfHkawVs9Nbg6kk6Rv6Vk4I7ORW3BhjZKFCloHI86/i9YfZLPhLacFp5Fzj+gUp6iY5n0ZaxbF26+div5b/tWsXtfwYR/cW3F9FZQa5W0g8gNy3oK05aOiUlHsznE+MXN6jRjMVudu7U7t7n9qjnydJnLKbnZ92c4Mb+71SnEK7uw5+w9a0i30XCHI3Hb7iMdt2MsuFWqLFFJODoQ4ACDP6kVvKX2NCkqZ6B/wCGRo+HcI4lcS6R9qmAyf5UX+7Gq8ZXAU9M9q4jd27xB2lVFxzJroomxS09vIv3F2ur1G1LTGHWImljIIWQf0NVL8kkOK3dknAL/wC3SiOCOMly/wCHy+eaU2km5dC5cdn5p7QcTN7OUjBW3Q+FT/8A7H1r4/yczzSqPRTk5O2Z+4lP4Tjy9B1NVgwcnSJDezHD1vLr7XcD7iFvAp/G/r7frgV63FQXE6cOO/uZsmm6k0HRREzA4waLCj4vv6UCZWXoAiX286AIl6AIa80ARL0CIF6AId4M7UDPi+1AHNYoA8UTGrA3xz32FdzMmw6BsAlufQKKlgTZmJyzAegpewLBIQoyAP1pOwPgcjmfEd89faivkV2DcRAeDb8P6U6rZM9oGQd5AoP8op7ox7Fc0ZjkK/Sruyuwy1m1ov8AMPXn61jkhRLL3OTke9Yr4F7A7oeJWXkdq3xvVFKgYj02+lb+hny8vWkBKQ7bULQtlXUDJJByKr+R9B9oe8jmi6um3uNxWb7srtACnO/nzqiWOLG5ls47WeBsOjsR5EbbH0rBtqVomSPR+G3sXErFbiHrs6nmjdQa3UuUTL9rMZ2ui0cfuumtI3H0A/asUdU9sSCF5CRGupuZx/vaqRm2TSExDOoMeW3IfPrUSq6EvkpuJDIxaRiTWi0UER97bMJYsZ3zkZBHrWfJXsXs1XBrtrForu2AktZF0Sxefmp/Y1jklLFLk9xfZMqeg3jarHa3AjYmMqrIT1U4I/I15sYKGZU9AjYfwG0Nx+eN2AaSBlTP4jkHH0B+ld8F2a4nvZ76toMDarOiz42Y8qKCzyX/AMQcAi4XwH1upv8A/mtZ5V9uzPK+jyo3Zsb+Gbu+8P2VVCHYHII39KTmocZP4Oe2mJp+8uLhpZ2LOenQD08qxeRzegbbdsgU1yhFHM4A6murGqjQLezbcNiS1tFiTmPiPUnrWyo61GlRnu21133ELeAHaOPJHqT/AKCpySpGM9yPT+xF0/CuztnGhx4NZwcHJOa68WopEscX3aeWZAC2P6WolMqMTsXG3jjDhic+vWkpaG42aLgHaaVXjCyE6j051ccpEofJi/4kdsH43etHbtptFIGBt3rDbWf2rwPP8760uEP2r/Uw72zz6WXGeuTv6muLFG6K7KrSzn4rxOCwtRqmmbBONlHMk+gGTXsY8axouMeTo9Li7NrbwJDCCERdIzz96iUHJ2z0IySSSIPwRxyFT9JlcyluCyjkCPajgw5orbhdyv4m2p1JByRU9hc5zk5ouQvtKntLpc7Z+VHKQUiox3I5pmnzYOKK2Mw5xmnzftC4fkrMjDmjD5U+aBwItN55FPkhcWV98uTg0KcX7BwZITDTvVCaaOd8KKEeQxAggKPeux9mX8BSLoG3M7Z9aQrOyA4IB5UUuwJKNKb7daTD2QaUE+HxHl7UDJCIzRPqJACk7Uu+xP8AbQFA3hXzx+9WjAjfQ6o9Q6dRRdMSYuhcxSA9Ad6qSsoYqwZfMHH0rmlGuyGVTLqBB59KqDpjQGTyroWyjm2fT0oA6eVHfYFB5j+9XtCDLOXTKjZ5Heokk9FohdRCK7kQcgdS+x3FJPVktbCsj7NEBn4mP6VjJbJb2M+BcTl4Zch1BaJvDImfiHp6j/SlGfF2ZyGvamS2u+IxTwyiRWtlDBdiCCefltTk4p8jVu0hFJIFGnG3RRy+nWoTlN/gnsFmkJIyTq/lB/U1rDHxRSVF/DLSOacfaDsRgL5E8s1GXJ6X+ZLlXRORwtxJEwA07bjr5VnCL4KXscVoI4VefZZzHJvE2zKeVatKUd+x99Gj4nIJOHZXdREiAnrjFebkxSx5o/FEhvY66msQLq1fu7iGRJI28mBOPl5+hNaSnwxuXw0K36P1T2d4lDxvgtpxG3AVZ0yUznQw2ZfkQRXZFKS5I6Yz5K0MhHmnxZVnjv8A4jAjWnZ+DWglE00mjPi06VGrHlnIz6Vz+S+ELZlkkeJypjOTlvU15fNzezHplGg59/St06Qwzg1r3nG4x/KQB7mu3xpckxof3UctuxBX0BrdaO7sxd05vePPv8UgUew2qO2crdys38XEBHFpz92Bp0+1dKkauGjq3xl2O/r1qXL5KSoKS4ZogmfzrNvQUgi9vms7LuUY9/MuTv8ACh6e5/T3rzPO8lxX0ovbOfLPk+KMzLIXcnJNedGNIyA5HwNZPov7mvW8XDSUmB61/CHss1vwZuMXUeLm/H3OfwwA7H/5EZ9gPOuyrOjGuKs3jcO9KfE05FbcOH8opcQsqbhw/lpUOypuGjqgo4hyKn4an8lLigsqbhaH8IoodlD8JT+UUUg5MGk4Mh/BS4oOQLLwVDnC0OCHyYFNwMb4UfSpcCuYBPwEb4U1Lxj5gE3AGBOARS4UVzA5OBzqfCTijiw5JnjyZCnR9a9CjlLY/wCrljl5VLBMkAC3i5Z2/wBaPQyMmFUk4LHlRQvZWrBXwCC370/Q+g1MacasqowccqNpUxasVRjEYI6MaI/kw9hUeHjYVTQhNdxd3KR0NVF+hlto+RpJO1ZzjewaCH3XbnWEVQkCSghs9PSulPRXZUcY5YPWqC/RBj8t+lNAV8+tV0gLIDgkHf5+VS1oaDrwa44JRnYaCfbcVC1aCR3P3cY671nLT6IfdBMKYALE5/SspzUfyxVZKSUhTpOAPPp70oQbdsE2wQszErGDnzro1EaJd3oHvSTsbYRbsQQcY3+tYzTZmzkzmfikhOPEwGfPYCqTaxo0j0cu4jDK6nmhx7iqhJNWCYx4bfZi+zzklG2z5etVOKkqYNGi4WrQWUwY7q6fqa87NGsckyXo9G7CdqpuDW1zbbvAxEygH4Tyb/8AE1HiZWouPwaYX91P2aq4/idDZ2jzSRSMyjwoCBrboM9K6X5HFWzoyRUFbPJONcVvOO8SuOI8Tl7y5m3OOSKOSqOijkK8nyPIeZ2zh7diWVRqJIqYOtjOLHgFj0q3LQwvhpaGdJI/jDa/oCa9Hx3xhQ4K5IYT8bbuXM8edKk59QK2jmXTO6UaTaMf2eUPxESycly5P+/Wmr5I5YI0rzxbgyACtXJfJ0bPlv40X7oM7DpyqHkgvY+MmGcJe5mkkuroItpBzQHeRz8KfufT3rDN5axwcq/gyzPgu9nLu5knlkeRizOcknrXhRubuT7OVAbtq8PInmfIeddeDH9WfH0P8jfsTwA9qu1Vrw86ls1+9uWH4YV5gerZCj1b0r2ox1r+Bw2z9RRwRKqpGERFAVVXYKAMAD0A2rTgb2dMA6AGjiwsi1uPKhoLK2tlPSlQWVNbL5UqCyprQeQo4jsqa0FJodlbWgzsBSoLK2sgelFBZU1gPKjiFlD8PB6U6FZQ/DR0FKh2Dvwz+mhoaZQ3CgfwilQ7PyfCCzBRso/Oulv0ZlwXG53xyFRQyvUCzH9Kar2BWzjGQNPl5mjsZ9Gm2o0l+QYSjFVAyNjvR2IHijzasdshjVLo5W90fWx8YH6VVWF2C8Ujzk43prTKi/QsQlXBG2OdNq0MOVwyg7kHnWMoNCIt4iRj29KcGNFBBNaehlbjbmaBUUnz5flV2q2MkhIcHpRdgNIV721mTmVGtdvKsZadlNaslbx6iDnAArGToy12iyd9AycAVMIX2OgeMSXMgVBn9hXQ2oofSCUiWIYH1xzqG7TbEmccZ/1o2B9EcEZ86ib9EHLMauIAZzmTf6051GKNfQx43HidXA55B+tcnizttL5ITFGSrDBr0OykzU8E4i09s9vJ8Zxg+eK5fIxuUGo9ikmaXg8+kxOTkA4YenI/ka8jFP6eZW9PRCb7QBxK47+7YI2qKIkKR18zV+RK3xXSNcuR5GQZ9sVyJW7RmREZbA8/Sqc6WhJEp1xpUUsbvYy+2XE8APJgw/8AtNelgl6Lh+5AnaIiHhcm3ichB+/5CtopWdud1GvkC7MQBo5nPooqpezHCt2Ovs4PQVFM6S+2sTNMkcSqXbYZ5DzJPkNzQ0TKXFWwq8lRRHb23/p48hTyLHqx9/0wK8fNm+rK10ujglLm+TF8p+LB2G1TBCB3JSEk83/IV7XiYuMb9sT0ansbfycFtpZYiyTXGCxU48I5D9TW88lSpHXix/bb9mpj7bX6HadtuhNT9R/JpwDIv4gX6AeJWq1lol4wu3/iXepnvURxn2xVrM/YvpDGD+J0f/Xtl+Rp/WT7QvptDGD+I3C5B97G6Gn9WDFwkg2Dttwab/q6fc01KD9i4y+A+LtFwqXlcp9aacX7FsITiXDpfguY8+9FJ+wtlyvbyDwSofY0+AciWhGzpdTj1pODDkcNuDvnPtRxY+RB7XNLiFlZtPSlxCyBtBnAHrRxCz8S2zMx8PLHOtG60OrO3D63zk7bUmBFsAeE7e9D+R0Vr4mJK89hnrQwLiWxgkeHypXWhHFByF9fpRaHXwX2q5jlU9GNVG2jjyfuoEde7lB5CrVgqZVekMh5Gjsa0xOw3J50/RoWQSYBXcjnUTWgLiSGByNqSXoRyUdRVLYWVNyOBn3oQylhjNXsDhG/z8qaJsZcOl0TIeh2I86ymkXaDIMLGzHYA+fKuWVuRC7ATmaXP4eldS+1DoY8JUC5VBndSPfauZtykmRZKQYZvLNa0BRKdsenWhDK4/fkaUloTLeEjPEIs8tdKb0X6NHxO2zwu/dxuksSqfcsT+WK4/Gjx5P8mXbozEq+fyrsizQlaTPBMrAnwnNaP5HZtLabvLcNFsJRz8vOvF83DwnzXTIaBnbD6Ryrm9WBONu8k9AKX7UJbGES58XyFc0n6HeylzqlYjcCt8a0AZCpM0XoTz9jXZ48v7z+hcP3IRdr5d7WAern9B+9dsFqzfPLaiMOzkPd8MU4+Mk70MvCtWM9OMn86k2YYWFnaEHaeZfFnmqdB89ifTArg83PX91H+pxZp8nS6QsZttW+a89L0Ygjt3hVAfi5+1dvj4+c0v8AMZEA3FyF5L+gFe2nUXIeOPKVDgEjGk4A5VzHorRwsx65FJgR1t1NIZ0Ow6mqEfd4fOpHZ8JWA5n60xaPjK3nTt9ASW4lXGljn3othotXiE64Ac0chUXx8YuU+GWRf8rEVXKhcbC4u0nEVHhvbhfZzTU36YuK+A6DtjxaMjTfzfM5q1ll8k/TQwg/iBxZMargN7qBVrNL2S8aDov4i8RHxMhPquar6rF9MMj/AIj3h5pAfXBp/VYnjR+aVYImnHLnWtewsgrb5PPG3oKQzqgyHnSYj47HYY9BRQE48s7DpyNMC3c6ccyaljCbQeOUHnqqsZy5U+QLfR4XOOVXX9DOOxdK2qI+3nT9Fp7FhxnFBocGxyM0AEB9WN6zCy5BqAU8z51L0JlLppO3KtQKCPFzxtTT9AQ9frT0ARbtgA7bVL+RoYX0quESPYMoZwPPyrOMUvuBlWBGoX8R3P8AapnIzsYcI/8AXRD5VlVNE2TuRiVs1rXyNOgaTGT546UIbKoviwfapmLvRdwbe/iyR8Y/WjI3o0ZsuLxj/wArGQc5Jl1e6oR/auTHJfS//sZLUjHyLgeWD0raD2UmVtGDnG3pmnypaGnsd9nbnZ7ZjzGU361n5EPqwddrYWFXJ0OTXmQV9kvRdYjKZPNqjLpgM/hT22rjqxsqhGpx710w6DoPt18S79CfyNb+LTyf0Lx/uRju0Mvf8ckUZxHiMY9Of616KdKy8jubNfZR9zaQx/yoKH2dMFUUHWka+KaUZih3IP4m/Cvz6+gNZZcixwc2RmnxjrtgV3I0szMx1EnUSfM14btybfbOP8AUrbc+fX0rSNoKB9emJmz4nOBtyFez4mLhG12xBvC4dMRlOxfl7f7/AErfI90jswRpcmGHNZHQtHxoaAjjHlSGfU+2L+Tm/XpSA5+tAHDypgRPnmkB9nlSA+z60DIlsH3pbQvR8GP/AGpptCJd565qrA73mPKnYqOiU/zVXIKPOch+YOOZzXd7MT748joOZpNAXgaUOeQ2qf5BJkNyfnin/Aei5E0kDz51PasC9Fy48sZpd9D9MItB/wAxIMbEA/tV4u2c2dU0yviafd7c61ZiuxBKcA5FBotgLc9/qKCiHXPKnXsLLImwMEbc6mdAEIdxtvUMT2fSuBOVONLAfOnFa/gEqRXNGVAIzpO2f2NNPY31ZSRk1evQycOc7HnSdNCsY2EJlmGQSoNZN/ApSDuL2fdFZ4h922FYfyn/AFFZNEIr4U2L+Ek7Bsc/Ws5dp/kEFcQXTcOD1rofYAMh3O1KhlcWdftUz+RMu4P/AOtiwBjWDSyu6Lelo2N+S/Z5k/CsqyH5qy/rivJwTbjOH5TJrZlHGV9xyrui9iIxjIGKTYdFkLm3uklXoc1pCVlDjiTDKld9W6+xrh4cZtEPsLshhVrkyOm6GGyHEZHrsa5ktjJW4wTjoK3tqLQBqEJlzsEQsfpW/hq5t/gvG/vTMPw9TecUDNuZJNX1Nek/SFFts3yxSNC8qIzRRnDOB4VzyyeQ+dJW+jvbS7YJNxu2biUPC7VBcQrG5kmDFfGQPGvmBjG/QVl5OKDg3P11/wAnFO5XNlMrZIzzx9K8NIz7A521HQB8XP0FdmDF9SSXoLIQobq4WNNk5ZHQdTXtJ8V/sVCPJ0h6FAACjAAwBWPs9DRw0h9kTyoA+3xSYEdzzp/yI+/SgZ8fypICO9OgONyo2K6PgM4pd9gRIyKNAQI32pdMf8HBnlv8qAO5+lMCBOPOpYI+1elFgYAgsSBsBzNeozmLYkIwfOp7Y+iUh6bCgNklGSSM46UvwBei5O+221TYdF4XxCkxlq+CWNz0Ok+x/wBcURlUkzLNHRPiK/dZI+VdT62cj7Mvd+Fjil6NlQCaL2URPn6U+wPkJBBHL0oq9CCo89OfnWUq9g/kruxlUYZ22qod0hWWW0oZDkDOMMp6inJcRshcRd2QR8LfCaItMVn0IywPlvihjRoeGwhEXP8AvNZpezKbt0xozR6jFMAYZfCwoaXRIllgaw4oInOcMCrY2YdDWE7iU6aC+LDFy3pWrYR1sXORgigq7K4RljvvUZNkvRbwkgXkR/qHOjIVJ+zbhO94fcxDJ1QsR6lfEP0rw8Uv75r5AyPMA4xyr0V2T7IxEDAxz6U5Id/JORdSHbaoTqVsEw/WZbK1YndSUPy3/eqzR3yBjK1OFHoM15mTsFsKkbKryzWMNvYwi1HnyzW0k1ED7i8hi4VdFN2dO7X1LED9K38Jdv0NOjO2Drw371AktzyUkZVT6D8R/wB711SyO6iJSfou4rdXbw6r2ZmlI0xwgBQgPmBt5bVUZW1Gy7tl3Z7h720bzTgd7KPxcwv+tcXneQpf3cekEnehhcNgEmuKKvRFAUj4XOfG/wCQr2vGxcY/liG/DLfuYAzDDvufQdBWs3bpHbhhxj+WF8/SoNrs+35cxT6CzhFICLDNKgOAU6C/k+0+dIZ8BzyKYrOEDpSAgQaAPhQHo+PI0UBAj6VLWwI48qdAiBGOVTuhkTnnSoZ0nbH71Viow0MbsdyNPWvSbOVljMAcDYCkUV7sdvrSbGrL0Q7DnjFJ9gqCVUY386kf5L1XxBuvSgRPuwyFTtqGKn0J77OvmW03+MbMPUV1QfKKZwyjxdGY4guCd6frRcBc3XGdjTRZDlv/AK0AffP8qYBFu22Kzkq2DLZEDxsu3LIqE6EARv3MoIzzwRjpW/4GxooEsbR5BDbqfX/e1Y3TsllVohMmnGP2qpMZpLcYto2I3Y5oRhJ7LOJBjASvxKc0pKh3sCvbgT2lpIf8RCUPtWM1or2W8VbU6t0ZQfyoi7iqBWLWPh/tVDsjBjXvjGc+dRkTYnpk+GnF0hP8wFPKrLl0b6zcLKmvkGwfY/8AevnuXHIpP5JZjtGFxnYbV6a/cSVRczvVzeqD8hIXOV5Cse0HQRZbwzRHcghx8uf5GtZSbhZemMrc+FjvvtXmTEgpz4gDms4bex/gLthtv7860yriqYdi/j9yS0drHnOe8b9AP1NdWGLjD8sl7F0Mi2xBTDTfzDcJ7evrWnB/9pSTGPD+H65BdXW/VVP6mufPnUF9PH37Y260g+V8KWbmf94rgUbYgCVu8c5PhXdvfyr0PEw8ny9IWyfDYTdXZd/gTxMOnoK9RtxV+2bYocn+B8M5yayOw4OVAH2AKQEetFDsiw25bUgI5pgcJz51LA5k0D6O74qrEc96QHBjOOlCA+IpiImk0Mgd/ejYEW26VIEcbYzTQzh+VDsRjB19K9FoworHiG/TaperAvRAQOdEiqLYwPzNR10HwXY8WOmcUVphHZeo60pEouUDu9XUCnQ10QAxclR8Lrkj2OK0xKrOfyUtMz3F0A7zHQ1o9Myh8CZhhzVGtFZOR7UCPsU6saRKA7gdKTRD/bYWjHAO2SM1g3cqBIBulCzHHma6I/tQ2GWDExA53XlWeT4Bdh8CAGcjYhqn2JqkOjtbxkeVP8mJObxRnPWOrlH0THqzPTsRIF6fF86yn0zoroaXniit8nnGKyxK4maADuregrX3RbRyHZyOnP8AKs8j0Q/ghZNi5XGPiqcm4lyN3GxB6dK+eybkwXRlzt9RXqNezJkYgPEPInFVOTuhlyDce9ZyVRsbYTZ/+sQeZKn2IqoP0W/kMtiQvzrhmTe6C23lXPv+dRhVvYxhb7Ln0q8/oBDxQ4uJ3/FJIyk+gwABXXi2khpFvA7eN3d3XUUGwPLnS8ybx4vt9lPSHcjFYwR1GTXkdEAMpyD6cq2hsPQEzHRGvQrrPqa93BFKCSJTtj/hkSxWcenm41E+tOXbPRxpKKoKNQy0cbbFAM+HKgCP4aQIhS9lI4xwPlRLoSKzzx86TGdWmhHx5c6EBHng9aOxneYo9kncbUwI0ARB25CjoD7Gc0n7ArPMCkP0QO4pDR//2Q==">
+</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/source.html
new file mode 100644
index 000000000..4d5ccac5a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/data-url-image/source.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8"></meta>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
+ <title>Document</title>
+</head>
+<body>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of Metroid" />
+ <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Natus eaque totam provident obcaecati nisi praesentium iusto velit fuga debitis quidem ut repellat corrupti, eligendi inventore quibusdam perspiciatis delectus omnis pariatur excepturi quasi fugit? A adipisci natus nostrum, qui aperiam, at culpa corrupti autem enim earum vitae. Nostrum et officiis facere ex recusandae tenetur, delectus odit provident soluta id perferendis ducimus quibusdam corporis rerum voluptatem architecto sequi beatae quod mollitia voluptatibus earum tempora inventore ut. Deserunt reprehenderit recusandae nostrum, eaque fuga cum, repellat, perspiciatis ducimus in non consequatur ratione. Sint rerum necessitatibus deleniti odio earum voluptatum eos modi ab dolor minus.</p>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of Metroid" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w"/>
+ <p>Quae veniam recusandae vel cupiditate doloribus pariatur, dolorum saepe hic quos mollitia harum nihil molestias magni modi maiores? Ea accusamus velit vel doloremque pariatur voluptate? Consequuntur dolorum fugit facere architecto eveniet beatae eligendi rerum nisi maxime, voluptatum a repellendus perferendis dolores eius repudiandae accusamus animi eum esse adipisci voluptatibus incidunt necessitatibus! Adipisci id, quos libero dolor odit dignissimos et, cum explicabo est facere aliquid mollitia! Iure nihil nobis beatae quibusdam, dolor saepe reiciendis, exercitationem hic accusamus quasi commodi modi molestiae ipsum, maxime non nesciunt deserunt itaque quo cupiditate rerum ipsa ad minus vel quod. Earum dolorum velit aut minus hic?</p>
+ <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M512 512H0V0h512v512z'/></svg>" />
+ <p>Quidem nam tempore ex harum repellat modi expedita quia rerum est ut ullam, quisquam repudiandae at dolorum. Sint atque fugit facere id blanditiis dolor omnis rem repudiandae, laboriosam unde delectus illo voluptate dolorem consectetur rerum expedita quas debitis deleniti iure amet. At sequi distinctio facere eaque, esse molestiae tenetur, unde sapiente fugit minus eos ex aperiam atque? Animi soluta, dolorem sequi doloremque pariatur in. Impedit, voluptates dolorem natus perspiciatis pariatur eligendi labore rerum facilis est error. Illum eveniet nostrum atque nobis molestiae expedita perferendis, esse ullam corrupti sit explicabo beatae. Sapiente aliquid nesciunt reiciendis incidunt cumque et officiis minus aliquam?</p>
+ <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTUxMiA1MTJIMFYwaDUxMnY1MTJ6Jy8+PC9zdmc+" />
+ <p>Veritatis sit nostrum officiis alias ea quam nulla veniam eos, quidem nisi, magni molestias ut odio. Ea, mollitia nesciunt. Maiores iste quos quas sapiente sit at esse quidem? Laboriosam fugiat nobis voluptatum reiciendis aliquam excepturi ipsum? Perspiciatis expedita sit quod, optio assumenda veritatis culpa, neque explicabo distinctio facere incidunt magnam accusamus, quidem animi delectus doloremque vel molestiae a quae dolorem. Sit, at? Numquam possimus animi esse incidunt quos quibusdam. Ab sit eligendi laborum beatae maxime suscipit, obcaecati enim cum nam autem, dicta nobis corrupti ut aut nostrum ex excepturi perferendis, soluta veniam. Excepturi beatae suscipit enim dignissimos! Quam, esse praesentium!</p>
+ <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAH0AbYDAREAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABAUCAwYBBwAI/8QASRAAAgEDAgMGAwYEBAQFAwMFAQIDAAQREiEFMUEGEyJRYXEygZEUI0KhscEHUmLRM3Lh8BUkQ/EIFjQ1glOiwkVjgyUmkrKz/8QAGwEAAwEBAQEBAAAAAAAAAAAAAAECAwQFBgf/xAA1EQACAgICAgEDAwEHBQEAAwAAAQIRAyESMQRBURMiYQUycYEGIzORobHRFELB4fAVUoLx/9oADAMBAAIRAxEAPwD1G3lC9a8Hjs4LLnvCq896HAdgzcSKnGalx2FnW4lkc81tGArKDxI6uZFOcPgEwqG/JxhtzWPFpjCBe7bmjaAsS665+VJx+APpLvbGcVpFfImCi7wTvV6DYRBcvnc7VLiOw6O6x1rLiUmfSXy43b51Sr2Ps8n/AIiTifi5wSQN9/aujDtnXgVI0PAgV4ZAP6B+lelDpA+zPdvT4I/Ws8vo0xmGxmsjcLsB/wAwtAUP2+GpYkCSjfepsYou9pjyqwZCmxF5yIIzvgvil3sAgZwKoCQNKvkR6H/CJ8cQul81BrfB2zHN6PY7XwO2SNxS8t1CzGHYbzVfKowO4JmjAL9iWORgCtWIS3rpHkkgnGSOtIDG9qiGvLfG4NZ5PRcBhaDEK+1UiWScc6YCbivWpfQ0Hdl1LSYAJPPYVpjJkaiOWJ5AiTQs+caRKufpmtOSurJ4Sq6PP/4n7r3bZB2GOuaif7lY10egdnLsJwCyGRkRL+leZmVCTCJb4E7nFckk2UVHiEaHJPzpK0FnV4mhOAarfYrD4LpXALeVWmwsm9ytQ2xlbXaBSM1DegKWvEJxkVkpjKheIpO9VdiPpLxG8qmxlcd4A2CKFkaETmvV0HcVSyWApm4npc5PKtI9gVycR1dMmuutEXYG96wf1rKYrC4LxicsaxeSh0Evfrp3xmnCbbHoBe+yxwNVdUc0kiXFMQrcELk4Hzo4HHZS96GYgZqq0AHPMc8z60kkBUkzBcA7k1URIr786/izimAbBd4G5FQ4XsZyTiHiCqaniUFW15k75J8qFGwYW0xKZ5U3DRNlYZsg74ppUFl6zkHYkelOkFk2uiqnVn5UmkNFPfaxsazcfZaZ572tbPF5QeldGPo7sP7TZ8G/9uh/yD9K9CPSJZm+3vwQj3rLL6NMS2YnArI3DOHj79aTF6HxG1SxA0g33pdlIS3I++arQyFUSFNHmyQgcpKliZbp2GKY+ztAqNr/AAuk0cWnH/7efzrbC/uMsy0ew3kxS1DA7nrmp87/AAWYR7Gtg5e1gYncoDU+N/hx/gso4kCVYdcVuwMle8O7ziH2nvHyU06TnHvWdK7Az3aRcX9uo3AFTk7RcRpaj7oe1WiTr9aQCXiekBnlcRxL8THp/c0m0k2yoxcnSFqXk9xEYoiYLQnZV2Z/VjXBk8iUtLSPQhgjDbVstj4cjKSM5NYUbcgPtCZb7gZjuCXuLMgq7HLNGTuD7Eg+xr0PGy81xl2jh8nEovnHpmls7trfhltGzY0oBzpZ4qzz72yM3FMnAbeuZ40WVy3bSLuedJxSEGWhYKCSdq0jEQyivsYXNEoWBa9+qJnVWTxhyF8182SdRxWc8aHZQ3ESE3ORWPALB/8AiX3nifw1axsakEHiSso0tT+m6HZWOIrvqaspY2guzk3ERpxrqIQt9B0Kbq9GQxO2a7seOkS3ZKG7IX4se9NiRclyHILEE1lNNdD0EpcgHANc80CK5LhjJsdjXRGOrQrCLZtWTiom2NMTSgjbFd9HCDDCEnH1pUAHcXBBIANGwBzIzEAHc+VKx0WrFhck74pAUSOynnsfI07GVLPpPWnfpDoZWMraQSd6VEsYJdquM04iLY7xG5HPkKdUMuMxK7Del/I6KCXZwNxUsYbBFgb/ACoSoRgO1i6eKyE9Sa1gehgf2m04UMWMP+UfpXcukSzL9vjvCPSscvo1xGN61nZuG8NGbhaTEx6/KkwQLN1zUjEtwPvjVpAcxTEaHgnDhfcP08vHnNT2hN07NBY9kheSd3HIQ+M8tqqEeWiHOtnb3sjHZuFnnYE/yjNKbjj/AHMX1Ars7Fa8Fv8A7QkrvldJBWlDPji7sicuRqbztDBc2YhhDagc5O1T5XkwljcURW7N3wJtfDLVuvdr+ldGBVjj/Ayd9uTWrAT3WN6lsDE9oRq4rCOorKfZcehtAMRD2rQkquJFijd5WCooySegpP8AI0r0YLiXEm4pebErbRn7tPP+o15+bK8jpdHqYcKxq32G2hxp/F51lRbZorNQ65A3HpTogBvYwZ2wpyQVI5jGDWmDWVE5leJ2UX6utvCqtyUbV25ezxb2xdCrtL4ya55peikNFUAqQx9qzdIdDKN27vIrSLRIHfXzQ4I6VtGKZLBE4kZB42YUPHQWQueIADnmuacQsAfiITmTvWUYWxlX2zPXY10Rg0KyP23usnJwN6mUfgdlZ4m8nwbGolj+R2RF8zOFJyKSx1sZfqYpnmK3g6JZRc3xiGcEDrircExJ7KrfjBJVAdiedYTxNFWPre9BjB5msPphZyW73zvVKNJiGVldju8nrWcuykwcEON8YrsVeziA5sasDlRfwL+Sl4VJO1T2URiswZNWMY5CmkgLbiPu1waAsXzsANgM0NjQMulyc5232qbG2Eq3djw5IqbbdiBp55AcrzNWmPsZcHdn0ltz54rKWWSNVBGkihVlydqSkNxKZ8IRyrRbM2iSy4XbOKrsgwPahtfEm3860iejgX2m24dtaRf5R+ldq6J9mS7eH76IelY5e0jXHsyYwCMkVmvg1GHD42juF7xWTIyNSkfrTqg7Q7ZcjPSlISBJ+tQUJp1xKc0xsiKpCNz2NjP/AA8EDmxoijOb2ek9mLbQHkYb4xmunGqVmEnZlu3ErrxDGpioGMCvO83ckgMk1zIXARiPOudQVbFYfDKyxnfOBWU0Fnt3Z7I4NaE//SX9K9vCqgv4GW8Q1lMpgn1q2AllMp+JRUgJbzh6y3KysPEKlq3ZSdF2jSgFUIwPbTjOq4PDrdvCu8rDqegrk8jJ/wBiO7xMX/exHaHqRXMonVOQ1tpPGM7USEjVcPlxCM5pJiaBbp1a/QAkMQc/Q1ph/wARE5v8JgvE5SWQDp1rvyLZ4SFkc6mQjOHFYTSRogwyFiM1jJehsa2zZjAzVRVEMX8VjUoc861TJM8co432rZNUB9dXCpHkYrDIrEL5py3i233FTjiaJUQil1EYO9byaSEy6VWcZHTpWSokoWPUQeQzVPekMZRQr+E561L/ACFhmtQqjyrN2h9iviTKQ2kfKrixELez2jZQT12rPkytDy2XCeMEfKs3foGGRRI4xUtEhCWwQdR7VNWMrBGnblXT+TkOqo8v71LA+WNdzRYEmdYxsRmqAX3twNLHO3l50x0Ibm6UyYPPzo4lpUdtny+wPvUMQxSN3xtUokl9kDfFzoY0xrw+JYsE7HpUOJrGQ1NwiL6+lJIqxVfXoycVrFMl7BResoGMgVolaIMlxaTvL92J5mrSqz0cP7T0GwH/ACsf+UfpXb6MjJdtlMl7Ci7s2APc1hkVtGuP2OLe2i4KgtbEBbgf41zga2bqAegHkKw8jyHjfDH/AFZ1YcKmuczksvEEbVHeXRzzDPq/I1zLPlW+TOj6WN6cUByz6mP221Rl6ywL3bj3Hwn6VrHyL/ev+SH40f8AsdAd1aFommtXE8A5so3X/MvMfpWqSkrg7MJJxdSRmpd5jmhAdC+lUI9M7BW2vg8LY5k/rWuNXEwm9npPDoe7tSB1FdC0jH2YHtqNV+3mK8ryv3jZk4lCncb5rnbEGaS4wFOMVm67A9x4KMcKtlIxiNcfSvcx/sRRdOd8dKpgLZ13NSABOm9IZnO1nFF4TwqSUEd8w0xr6+dZ5J8I2aYsbySo8fhLTTtI7EsxJJ864Um9nqtqKpDiE6QP3qzPsacNUySDHLrtWMmzWqRpJXEVurDYVMtIlK2Lra4abiWV30RtvWvibymfl/biZXxQMkmCeVd+T9x4cTPS6zc/d86m17KQ7t4XVAzE5x1rCbsZKS7eAHeskIX3V5LO3xbe9WpUKgOQPgajvTWRoKBZoJSmB71X1LEBTpKuxHhHWqjJFp0XWQzsRjyq3slhTlQmG/KpSYvyfWzKWIztWnGtkvZN5jGcgED1pSQkwWfiDBsHpUfTstEYrhLmQFwB0xS48dAajhUSOo5elc8tFoayQoq5NRuxNFEUkayZotk1QxWSNkG4rJyoaQn1qF3NdhyHUmXUN9sUUBTcXaKnP60NAJ7niSq2Q/yzQuylFsWXHFFfUoarjE0UAeFjMx5GqaBqh/w+AADp51nVozbHMSgcuVS1RJ8xxvgYqdlA094sbYPMVQ0CS8VGMaqfHZZ2KX7QQfzptUgRc1uWA0g5qeQzL8QGLxuu9ax2jux/tPRbIYtk9hXYZmU7UuI+N2bE7LIh/MVlN1JM0xrTHQHeXTSMMFiST65rzctubbPThqJdcxFRkDNRQXYlu3x8OVx/MMigpCw3HdyiRHMUq8nTl/2pxbi7TLaUlTKbi3ivzrgVIbs80GySf5fI+nKuqGRT09P/AHOTJhcNroWlGRyrqVZTghhgg1ru6Me1o9f/AIdQ/wD9vWpIG4P6104l9pzTf3M3cY0wVr6MvZ5t2vDPxCQLuDXjeY6yDZnhasrA7nzrm56BBSkJGcc+makPZ7fw8EWEIPRF/Svfj+1FH0tAAE1AANxtmpA8Q7f8aHE+NtFC+YIPAuORNcmWXKX8Ho+PDhG/kWWWFXPWlFGrYWkoJAzvSlouCs0XBQpYdPesGmzRqkEcd4ikYWMNudqznvQ4QfZXwZWZJJs/hx57ZFdPiL7/AOhy+c/sou4u5+0EEcq7MqqR4cWJ4sNcgkdayekUaK3bMRBxWTGLr+Ikkjf2rPVgArFoPw02yb2fZQnG21RdASwhwcVSZIFdhNRG2DVReykytURQCMVrG/QmDy88jz2FbIVledCk1doBfdTlgRqp6YJUVhTJvvmjjQ7J20fdvuSOopSj7FZruC3IjIVzvj2zXn5O7NExpdXZ7rOwNZxexszrcSVbgh261uoNohh0fEYlAIc1jKLDoIuEYE88V01s5QN3aIczQJCq/nY9TjHKhPZaQkmd5SdsdKtfJoigQvnJzV8kWgvh6vG4z0O9S5IUjRWc/iAJ28qhy9mLQ6SZe7/es3IEime5JGF2rO7KoU3RLvyzvzq4utjSOW9gWIJ671LyM0pDy0gWJRkelLnZIfFoI23qokswvETqv25HxfvWsFo9DH+09Ds9rdfau4zMT223vwOuBisMvZtj6G3C7pHt4ZSSS4GQfPkfzrhzJKVnfidxoZzTd6pFZ6eijN8TLIxwG+VI0QlllJJzzq1voCj7SVODyo4lJjGG4h4hpivJNE2MJcfoH8x68xW+PJ6n/mcuXDX3QPY+wlq1vwC1jkA1KuD1616ONVFI8yf7jVEYiIq30QuzAdp1UcQJFeN5kf7wJCKSVRnHOuTiIBuJApXzJo4tbGme8WJ1WMJON0HL2r349IshKeeKAAZaQGW7b8QPD+CTuhAkkBRTnG9D0rKirZ4EqsbltZyxOc+dcnCmelGWhrHjSM5wD9aqg7eg6zRS4DbYrObo0ghzJeQ2Nt4WyfKudv4N4RbexLAZLuZ7iYEqOQ86zOhr0PuzcpuJnjU7Ig5erV1+IvvZ5fn6iNuMW7GXNbZZfeeItGdKtHcjGfep5Foe2utkwRWcmIt+zsTnBrCTAou4NKE9agDK8S71CWQ4Ga1grWxaBYuIOgwTnHSreP4AKt1lu2zp+dJPj2FB62DrjX0rojL2JombMMMYolOhIEvbJhkqNv1pLJYPQjksm73DDrWymkNDK24ecAnGKHmQqLZ7FVGFFQ8pNFtrb6CDnOK5pzvsot4g7pCcE1EUrsdsyNzKROdRwehruxtLQy6C50jdsH3rOaTCjeXDEjV0NJo5BY+CSDmoeikC3EG2+aEMHSx1AtjbzqWyrLouHADLA5/Wp5By0VS2mh/CMetPk/Ycg2xtznfFNMQwY6E35CmyRReXmJQFOKhxs0ii20AeRevrQ4mi0P440WPpmsuNMTZXPKqpscH0ppCB47g9DWq0FGXud70/5/3reL9nfBfaejWv+AvtXYYmI7Zf+5fKufJ+43xdAvCbjTbvGxI0NrHz51zZo8o/wdmB1Kvkci+1SDDbVx2dPEvukjuIdWAaolaMnxFdDsBtVxVlitnJ2Iz7VolZn0RaVoznce9JxaKjJPs3vYPtw/CmWC8LSWh2I5lfUVtgzOGn0c3keOp7XZ7PZ8RteIWYms5klRhtpNejakrR5ji4umecdrbh24rIkKs7LzAGa8zyMbnkpAxZa8N4veyFYbC5UDmzoVH1NC8ScnpEDSLsXxW4lBn7mJBuSXyRvyrReBNvbBaZ6vDeW8FsiO4AUYHWvQWOi+QDfcatYOSu+rkeho4JdhbZmOO9qlgjAjVcny51Mml0XGNnmvbzjtzxaKAqxKJuUG2axlPkjeMFEycSF3U75zWDZumMHLxp5HFV6NItXs7HN3GDIxZj05CspQrs6oSvSOwTyXtyE5qOeDyrF6NaQ04ncw2sccCsAcdNzWe2JSpWzR9jeGizgNyZFle5ODpzgCtsNxkji8lqcWNeIyLq8RFaZf3HhIQEI91jpWb6LHVviOPapexNnJLtVyKOAWCXFyrLms3GgMxxVg5Na40L2IGBEwB3BP0rrcftBM2HAI0EQzjNcE9MtMaXEqxqOXKtIvQMChnUsQpHOlOfySEyR6kJAztWHOnoGKLqERkNjka2jkvRNUCfaQnX0xWq2UkXwTJNzYVm20KgwRoFBXY1k3YCnilwUBAGa2grEZ10719Tc66o6QW0VNEUbI3HrU6KTNc88rEAHao7Obor1MviyaTKJrKGADUkIsjlXcE0pIGEiRcZGc0uIimU6vKk0NHYiVznnVRfoGRuJW08s58q1aEgNrXWdRx51FlxdBnD4cNjOwpqPIuxtI6JHjUM1osSJsUXJLvhDzrOUeI0y/BEQ9qzLEE//rjjO7/vW8ejth+09Ft/8Fa6zIw/a/fibVz5f3G+LoUWUvcXKPtjOGz5HY1HRqG3iNAToOpTuuK4pR4to9CE+Sslw7jCAd1LsfKpiU4X0B8VdZMspH1rSP4JbpGfkkQMfEufcVtFezCTBJbtk2H0ztQ7XRN/II/ETHybHsani0y+Q57O9rbzh12j287Lk777fMVvBtO0YZUn2e4cI7ZW91aQTtpEjjfIBIPvXWs2jkeEax9p0mDd1ctqHIHBFUs9kPC0EDi/2lMyMwPkDg1pyvsjjQtuOKxxl4jJl/iVnochpGf4l2piaNkfSCGwy+R86xeQ0jCzMXnG47sMHOGG2c71m5/Jqo10KZJDjbEgPUVm/wAGi/JyIBTkdakdhvd6sHO+NvT1qkxWKr2B4vvGA35AfvScfk6ISXou4fcNa4d/LJxsK58sWdEJJoDadrm9aR84LY9hWTXFUacb2bvsbf6LsWZfKEgqD0NaY7bo5c6SVjniKt3hI5b9a1yPdngoTRAifJGd6i0yhg02lMDbaiiWLppJNecU11Q0C3Vy5TY70pQGLJXZyc4NKNIGgFkUSZNdHK0QNrO9MOAu+3PNcs42WpEOJ8Qd0JXfHlShD0Mhwu8RpvAzct9VVmgvQro1ttcKY+eRXC47ExZxNw5YLitYiE/2N5FJPWtlKirRKKIRkg7Gm3YFjz4GnUKhoVAN2C6kE52rSA6FgiKyYzvXQpaE0EMqhQGAzUCQ71LjlSUTnIKDK+kA49qqMLYWfTR90K2WKikK2uSpORmplCh1ZZb3rFgDy96ngJxGsBL7nfPIVlJUFWGIjHbG1OAEZIgCM4rZv0Kj6XSF2rBgBmcQnIPOtcb2UkWfahJGVxlieeeQrqi1QMKtLcMMtvXJl2Uiy4j0jpisUirM3Nvfj/OP1raPR3R/aeiQj7oV2GRhe1u/E2rnyfuN8XQlUVmalnFLh7e0tJckxsSp9CDWGZLs6vHl6KLu2W7gE9udMnUCsuzqTp7M/d3syKY5SdqqKsznIST3IJJ1P/8AEgV0xic85Udgl7xMGfB8pFx/91WoqjJy2cmglBGtCBzHUH5iji49oOafRclvltcYLEDOBzIquNoz5fI64ZeTIFRXOg8s+dAWazhnE3ijOWwCRkZ5UfkOxwnG5EfJkyOYINXbslxSL5+I/aoI1lbOds+VaRl6Zm409Gc4jwySaV9L6mXJxnnQ0noLdCUW08QAkTY8j5+lS1RSYVYBlymSM7gHfFZtGiY0gTVGC/MHFKgsOtlyc8ydqEBOa3WRGGOh3IquwTFd/ZsEPdrqOnKjzP8ApUyiaQmJbtu4ZYl3ZfiYVzyx7OyOW4mh7ALJc9oLcLkqpLsfIAVeOO9HL5M6g7PTLmIE1lKWzx6Es8ISXI86yUtgVycuVbJ2KgGdjzFapIYrvNQOd8elOXQXsEVdQ1ZO1Y2JgV2zE+D51akLRZw9WcYYZIqJumNh8sHmNqmwT+SFtAI5CVXbpSk77HdhxujFH4c/SsqtgCrxHUTkZpqAnsNtJwyYxTkmgTB7w6ck1UJWFCSSQiUHoNsVu42hh1u3fZHSs3ofRXeW4G42PmKuLsYveXxaWG461pxJod28wKg+dUoezChlbMgXlg4reEaJBb6TUdPStqvsaEd4pZtK74rFtGqRG0tWWQM+c+VZSY3EfWj6cBRmsJOzNqhh35jTPn0qOmTSIRSfaJQFHXetIty0AzXh6FR1NdCxKhoEuuFA523rKcePRa0LfsZikGCee9ZxmNjKFygAzWzjoR27nTuvWocQ7MuDrvkPm4/WhI9CP7T0aL/DFdlmRhO1f/ub1y5P3G+LoUAVHo1oZwwwXvDms7oeBicMOanzFYZUbYnpmT4jctwK8a2ilM6rzLDHyqFV6OhSbRnuM3qTvrUbHnW2OFsiTpCeS6WNNQBI9K6VE55SPkvEBXc5IzvsKaj7Jsd8Kve7bCqrRMN4zup+X71NuL0TJWNAYZCPsuF1f9Inr/SfP0O9UmpdEO12BtcNr/lkQ4ORj61DKQxtXZRKutvENQ/f9apL4BsY2yyNju8//LpVKhNj2xVkhYDBfnvWiM2yE948bq4csUOCfQ0mNF0jxSjJJwTnGMij0CQP9ijILxE86hmisvjQ6EAzk9aXqg9hcS6ccqTXoYfCgPpmhMRC5tiRldmGwzTsZmeOcL2Bt4yTks5AyamSvo0jOuzVfw7tfsVg1wygGdyuSNwFH9zVYo0mzm8mV6NK90GY4IOK4pq2cgveUSTEczWCWxUVXCkYK5NbxYilLaSU7g1o5UM+m4ZlPFms55BMhHw1QMY/KuZ5BUA3/DlAOFGauM/kTQHbW3ckYGDmrbvsEHlA4GrFRfwOiapHyyAaG2IrmhBBGB9KV7sPQrmsijhh9K15DQXaZGFIAIqZWOgie21pudzUxdMBPd2BTOcYrphILKrSNoW35U50xllxqUZOCvpRChWLVh7xyQM1vJohslwy6Rzhmxit18CkqHaXkcce7Va0RQumvu8n0R0O3opIKtbYPuxyayZZbcRBMEDArFpisqW5ETVnSb0JkjeaxscGqWN+yGg3h0+ls5AzVwXFho0FrOWXmK35oKLmkVzjOcVx5sqei0qArpF5gVlF2MS3s7R7DnXVF2iQaN5JjvkD1rOUkil2CW+97H5d4P1qkrZ3rUT0ZP8ADFdbMjCdp9+KSe9cuT9x0Y+hUKg0GdnE7WMzxrl4zqH0pOPJUOMuLPOOJyl5pTMS0mTkmufjTs6lIz96wLacn03rrxxrZnkYNHHpBRs4blWrZzlos2JUZJXHzpOasGg+xVokCnmp2NZylYJUqCGkIyBuD0IzUp0Ohpasl3GI5ziYrhWbcj0J6j338ieVdCd6Zk/t2hhaL3DgSLkgYBB50JUNOx5AY4vBqO4BBOwPrT0hXZOe67t8Etttt1piALiXKtJHsSM4J/aixq0fWV6GjbwjCnl1HrS9j9D7hWJreVVPiHiHmaHQrots5leYpJ4WHQ0IbbqwuVlhk0gjelIIuwyz8WOX1pJFN0MntSAupeflyNDjQlKykWIkbSU+KkgZr+EcAA7LXUNuh+5+/i6nP4lP0rpjFKNHLlbfZiZWKu2WNefPbMvRXZTFpjvyrDjsY1UaiMCqJegqE6TyFTIVn11OgXpWM0xAizp54rBooGvHRxjIrSJItmIAPI71pQA8twAB0NCQyv7SBudzVBROO6DNjrSaa7At1qW35+tFWIqSQJN0I9KbstbGCMHVTWSsQBfgYJJ2rog9EsBWNpPENtqpvY7omtszDxMTSsQTBZrGOWc03KxaPPbWcxsa9RGj6HNlHLNu2or5U20tmbD4LUi4yBjFZ82ybG8OEB23pLYmwbiUjBOtZtOxoz8ksivzNNR+Cy6O5fG6Yq1ohoMs5HLAnI9axyP4AdwXTovxVwzlL0UgmK80jnvUbGTe6yuSdq2x66EL7hxI21dPSJLIlxE22+DXPLbLQts1/wCehH/7g/Wt12jvX7T0VPgFdhiYTtL/AO6Se9cmT9x0YuhYoqDQ1HZO3aYOirq1HGK1xK2Z5HR5z/FDs7cdnuOyrJgwyeNGXlv0pZcXCRphy8kYGZtTcyDVKi27LIJVICOAd9h602iLGKBe7B/2KxYzvL50r9AfKmttgfpTW+hWOLJNRRieW53wa6I/kzZp4ohdW4DRqrjfVjmf2rXtGT0Kb67eIRRMA2jcY8jzxWbZaGrsk1qCpBYY3zSsdCaZ5I3K/h50N0UD2U/dyuoI0n15A+VLkTZp+BXHdxqDjwHfO2xobG9kuKS91dxyxnY9c4+VJscV6Jy38bAyuQAKcpCUaB17Z29k2B3hwceFc1Km70htI1fB+2lrcKizxMI3AOwyceeK1U2tNE/TtXFj214rZM6ssmtCc+Hp7jpSbSdj4tqmehcDUSWuYmUxXMbRMeeCQcbVvHas5pqtM8zvrYiSQHmpI2rzJPbMkgGwtmMzHON6i1Yx1ECg5UmQ9lNxMRyFCAT3kkrtzIWiS0B223G7GuZoRZMoAxmmuwF1064xnGOdaLehUK558tgNWiiUgbvWDjJyKfH2VRersGyp/Kk1Yi9ZJJTpzU1xCgy3jCnc6mpehh+hu7yBWTasdAM6sxwTvWkZElZJjj35+laaaIorW9wQGFLjQMPguA6eL5Una6GYex4frfLjYV6ikOTNLZRrGukfSnJ6MmWsVRieXlWXQgeWcjYU0hlLFpmABzS0NMJj4emMsAaHKkDOfYFZ8AH5Vk5UTZY1uYV8IGfKs7sYM0joSWBFZzjZaKTfFm0gZq4YgDLcSSjLZxW0cVCbClQZ3NGRehIKWVVTw+VcjuzWIts9+JQesgrph2jtf7T0BfgFdfRiYPtFvxOT3rkyfuZ04+gS1tpLiVY4ULuxAAFCi5OkU5KKtnqvZXhf/l/h8RvCBdzsBoBBxvXdih9NU+zknLm7MH/F7TxHj09m4yDGdIB5MKjMrm0Xi1Gzwm+4fLDI4Y4x0Nc/LizpTs5w+IKMsxPoVqXKwSoOJC7LjFR3tjPs8qV0xhtj8WfEAf5etaQohj+3GVAU7/1j966E9GbJ3F1NBju8LgbYIpOVCqzO8TvmadXK/iyR5edYvJZaiEwcSZFxnbOTvUKbHxosmvEkUkMcsQedVzHQpvZmjuw4Hh5EDqKfJ3sVGw4LIXgXIHiXSTz+tVd7QqLb8NIEj/EGBzSaBdmS7RcTaIT92zGGI8h1NEYuUqsic0Mey9yivDdrFHNH+OGRcpIp5qR6jPtzrbE3CVoyn9yL+KcRgsOK/ZrIyfZFnLW3efGqn8JPXnj1xVZpKrXpl+PyumbywgUqkyLpMm7D5VlJbNU2enfw+vTqlsHyykFl8wcdK1xNrRjlVqzPynXNIDkkk8687IqkzmRXbQAE4rFPYNl0oZdqZJUEBGSN6dsAO+iAG3M9KJOkACpEec/SsxAl1eqAcnA9apIEJJrzU5UEEVqoeykitImlJJ2FaaH0EJZlmBAOKlyGEPZlQN8elRYrKQjJJpzvQ/kB5wyBXRdY3rnnKhjOS30p4flWXKxAptBzJ3NUnQAl5BojOMVrGTFQilttc2TnPSujloSC1cxqAQOVQ18BQOsPdrsMCutNozKZphCCzEitVKxUAvfNK+AcCnxLSokA7776aG0kIugmMT42rNux1Y0S8UJsRUMloMtZVJGevlWUmTQS4Ryayk6KQuv4QV2G3lWcZNsvpAEFiC+o16GF2S2NYgqppA6V10iGVTRv3mV5Vz5JJFI4qtoOQeVcV7NI9lXDd+JW+3/UFbxW0dz/AGnoCDIAz0rrMRI3Zm64nxN3AAiLdcg1n9FykaLJxVGw4Z2a4d2ahN5NiW7/AAljkJ8q6YY44lfsylKU3RmuL9o5JOJRTBhoik1cj+tSpNysrikqMtdzrxHtDcXrNlYoncY335fvS7k5AtRo804taSXV4xCg6mJrlkm2dMaoWXCLbfdAgkc96zat6ZdlKb9c58qTdATD6TkbEUl3oEG2TjGrJUDritF82S96JXXG44gUikZiOYBq7dE6F7ccDEiRGxUuLYconBcw3fhD+IeexqHBrbK5J9Em8I571NDK2kOSKErGTaXvBG3N1O+RzFWmyXRuOyuZLcxkgFCcZ6jyzWl6on8lvaZjZQzTJnBUY/pJqqJvVGIaBZ0kDHMUgww/ekrTtIy1VML4Pp4faRxFjttqOwrVNdkpA7P/AMX7SAw7wxHc9D/vFTJ26NsapWes8EnXVFCWGoDGOtS2VTo33ZAaO1GTyC+WMbVrj/eZT/aLZwTd3DKcoXP0zXFl3Js5V1RK1Yqxx1rkq2BdI2+9VQih2AJxToOgS8ww2NRIKAHtyy+dZ2goTcUsHkBGT6YraEwBeH8Icn7zNavLRaNLa8KCxgMMisZTG0cmt1gzyqVJskXyuS2AMitFRJT3LM4bpTb0A4sgqEYblXPJFB09woXnvyrOnYMBa7AYdaviAHf3KspA55rSKAAjkVic7ECtVaEyq4DNjAzVIRY0i6Mda6eJnQsvonl2UVotDB7LhcrSgnlnyq7bQ2x/9gEUQJFc8k72TYouly/hAzQikDJFLO2lEOOW9aNatho0NhbOgAJIIFcs2LsOWIqc7k1jLaoEduEGgZGTisoxZQvB0uQdt+VdeKXElqw63Ree1dEsroEthDRKeZ+lckpNjINEFikznlikuxx7AOFwF+KQd2QcPnHWurGuTR3N/aer8L4Ye6R5FIY8s16EYGHIbTNFwmy14Tvm254qv2on9zPPe0vHXlVg7ghjtpG31FZSkaxR5xxziQYFI3DHq2eXyrJv0aL5KOxEzXd5xCFmz93y8q0x7siemU9pFSyRtLLqORWOR8UaQ2YOQmSUsTvnbNc/8mxdEEQHIUkny5UuwB7yTIOG50IbYqu5pu6J1Np9TXRCKfZlKTXRNAgXGcbc8b1LWybAEd/t7KT4WHKtWkoWZp7oJu00IrrkMBkehqYj/JbbX7NjWdR/Wplj9I1UrCpG1aWG1ZJV2UTgbLKM5PTNCXyHZ6B2WIiCB9s4NbRi6IbDe09t9rge17wDvFwPfpWiVuhJ6swkVld6cW00Tuux8W1FCcNk/wDgV7dEC5nRU6iMZ/M0rEoo0HCILSwhEdsg1+fP61DkaKNmu7LQM12GIOnmSaiO2VLo9H7Hp/zd7MCF0wsQSdq3x+2c+V/aCXCJqcx/Dk4rhnK7aOYqjGk+dYLbH2VTyDJA51VEkERiN96Yj6eIhQcVjkdFA5cKpDDFYr5ArEQkPpVKQfyEwWoj3O4ocgTCzJGqjHlU27LsU36d6SFzWkRdgBgKdcmtUDRU8oXPnRQqIwyu7ZA9amUULoJZ2dQCDtWdUUVOGXfO9VQhdxFiF2A9K3ggsHgl2GrnV8aF7G0WgIDjOfOs2rFq9gNpEGGW3FejGOjJsJ0RhsbVDWxhMTKvLFaRRL2cuJx3WDSlEaF0MPfXGw8OazhBtjbpD6w4eiAEqM1u1SM7sNaFFOVxXn5tM0RQ+AD71yctmiQDdyAcjW0UhMS3c+mU71uo6skM4e5kwSaiYwuaYpjG4qaCyKSSTv3alVztkmrx43IcVs3nYXsfNHLFf8Q0GMeJFHPPrnpXpYcXHbOiU70jY8Rv4rcMFzrHLSM5rdujOjB9rONl3wytnTy6VlN2zWKo834vfakZmzjn4m/bFZOjVIx16+py+rI5+VZvso0/8PYsjiFwWZU0gEkfOunEvtbMMnaRmO19wHvHw+QDtvXFmps6MekZwHbJHKo/Bf5OhgeQ2pNUMpuEJ3xTWtgQeET2+nH1qlJxZLjYqDG3PdS5HQE10JqWzB60WrLAPFpXVjGahwldLoLXYJd3IfwpWigK2Ux5WQMSdvyqntaKWtjKO5RsAEVhwRqpWM7CE3BTuzhgdhS42JujZcNDxXKnGFO/h5A1skQ2ajiEIu+GltP30Y1D2oSoEZ2ytUEUkkCprc6mwMEmpbLA2k0zFW1KOuOYqHIdBlhErSBtQOT1FQ2i0b3s/EY4HcgAAYyfWrj8kSNr2dxFwbikvwt3YX6mtIaiznyiWWdgDk1w8dWYkIZSTjfHnWdbEyeAW5CqJCogB70mIpvZAowOdc81ZSFNwxI33FSl8AyUMpA8IzjlSqgYUJmVRn86VEplTS7kDnQlRRxFLA77VaYyL24YZNWpFi29gAbAJrWIiu0TWRnIIpT0IYyQhAp64rnbGL7qUICGrWHRLEl7OWOFGc10wXsRRArMcDbHStgdje2uO7TDnfFYSx7HVgi3KounfNd8DFopa8KZY8qU6HGJ9DxMsd+VTC0NxOvdtK4x8NaX6Jqg6yuViAJxVJUS0OIeIjAxgiiT0R0Wm6LnY15udM2irJNG5XIbJPSvOpp2agN1GQhyADXXibfZmzPzj73Sa7k1Qh5w22CxgjY4zWE3sdBndKWCyZGTzAqVvQHpPY3gNvbWi3M1qjuyhlkdQSv/AGr1cUFGPRokO+J3yWsDadPhGBnGflWtlUeZ8d4+jSYE+jfcE5BrJyNEmZninELdo2Zpgc+1TJouKZiOJzwu5wNug086ybNaYolk8Q7oNn3zUN/Av5NJ2a4gkPCb1TKA7EHQFOfrW8GuDMpx+5GQ4tIZLhmJySeVcUncjoS0AliFxvS30UVKd/P2o/AF2AyAjel10NA+Wic4Jx5VS32JkZhFcKRKgz54qk2tolpPQFJw+2JyCw9K0WR+iHBdsktnbx7oKObYlFIpmhUjK1SnsdFVrCFYnFVJhFfA34ZJ3dygyV355qPY3tGztZ9G8u+TkEGtbIRseGus8CyIdx8Wwp9oKaAjw94phIijSSQcDY1HEfLYHxLhutxJGNJI32yDUSXsuLLOGWLl0AUA9CayaLs3NvCYoY4AM6dz6mr9UZt3s1dqEg7MzoGyZHGrby6Vr1BnPkexBJCMee3OuWVUZdkY108uWKxBlUkhVtqdE0TjuM8qTRJJiH+LeufIikRW3WTkBWV0OrIzWyxKSDg0+xUK5LghtOfaqSSCiVuyu+WP1okMLkkVUGKSHRWtwX8P51pFDs7Iqum+1bJUJspi0xnCj51lPQkHAAoSRWBQqv4FlJ8q2g2KhRLZaThN/LrXTFsRV3fd51ruPSto/gaRZGneDNDGLntZCdedq3jVGLroHmheTIHSm0NSotsbU8iM0LZLY0HDy4GxpzdE2cFsYsgjaub60kyqIBjG2d62i+XZNDSznGAScmieJMpMcQTLKNI515+SCRVkZ4DpJYCog+INCt7WIOSRWvMXYVCdtI2PKndgaXsjw+K54gTI+pUIz611eNBN2NKz1C4b7JYd0FJYjmOX/avQSNbo857WTPJbuJZQmM6UAzkVElrZSfweOcV4m63Low2zgEDb51g2zetC+W/1qQqoz46g0uQ0L7l2ZwZHAUDpiou32OgKaRQMKCTyH/ek/gEWcLukgldNsyKQSDVQdaJkvYDfsO8bw4rmfbNl0AlidjgD1o/kZIYY7fWhaF2XKPD/AG51LasaXoi66hvQ2MoeLDeEk5p3q0JogybEdRTUgordDzq+VsmtFLrlcYzVJqxEViKgEL4ulDlsVFqeFtTYG/Wjb0ikh4nEYXtBiVdS8/FWl6Djsf8AZntR3D6YIu/6MGOkGmpUwlDkjccPubfiOruOYGsBjgqfI+oqrvoydotwC5Do0bA+4JqWNMY8Lt0WUydBuAB+1TW7G2NIYpXbwRvk/wBNCTE2jQyxTJZfZljbKDLAjYk1s4vjRhNpiqexu2izHCOW65x+u351zSwyfRkLyJIWZJY2RvJhWDg49jIlAc+VL8EnBEAPShhRXPIFHPFc+RAStLtQxBO9YNfJRdcTqV9KatAxJMDJMQgxVxZLDbe2VVy2M0mOyF0Qdhg0JBYLHGysCSSPKtEmKy15cDFaXSEcTUxJHKsckr0NE5JzGvPHnmpSHYFJdAuVU5zW0IjJxLtlvzro40BCa3MgNCdBdkray0g53NEptgwKZMsFWuuOjFtlRgESksKutENnLF0LjkBmrjGhMfW+GIwBioydCSIXsQVSa4JNWamY4nP3RKiujEwo5Y3RO2a0lkXQcTS8Md9Oo4zXBlaKQbNK2nG9cyGwQxFpPEa0UhDDhVn9qvEhRCzMcACt8MObFR6rwLhsfDoES3iAIGpm6E+tetCCgqRqlQJ2gnfS32mRhp8QCnAPpV+ho807UcSZ1bu9SA7MR/eok7ZaR5Vxqdmd+5DDzAFYy30arRnhdgSFnDL55NYJo0dlkV4rFhGqtnzov8DoHmbWcONK88aqXrYFbFYzqJZCOnU/LpVLQmfNMJlyAfM5rKcdlR0UFcnbl5VKd9+hssVSMfrSY0XLj1zUv4GSGBvgUuugONErHbNKw7KXjIJJGKFIZQye2a0UrQmiIjUnYU7slk+72wAc8htR2DQuutQkCyIdAJzjr8q3hX9Sbd9FtikVwpARgQcYYcqmaaNYU0PrC0kS0WW2PiLYJHSoxptt/BeSXGkb/sxbSW1vqbaR/wCbrtXQlRySdsPfu2ctNMMMPEg3GfSlYzVcFERt5BHlcAZLA4HqKa6JejU9mbES3nfyy95HENZXBGw96vHFXbInLVIDNnZ3EnEriLiS/eyairxMNPpud6JKMr2Zu6ENzZShmNrcRSN0CSaGPyP96wlH4ZmicX2oqFuWkI6a9/oayk5VTGX4BGKyvZLKpMgYzVDFd8SGPUVnOgAVnCgLjx6s59PKpaXGqEGo0koAztWD0DYRBEoxqFSpbAsllCDArRKxAGS7kiqEEMNKcsmkmCAijGQHcU/wUwlAVBxUMkFu2YjbrVRHZXa2JY6iDnyrpg9FDG2tSZN+VXJjHC2aCIYFZWSCNCqtuKqIzPEhRrxXb0Yi29utmA5VqtoVCmK6cXAVScE9KmcuJfE1vDpvDud8VyZM1kpIvuiShBO1cjnb0MzPEoQZPOtoSYJkLZVjYYxVsr0aHh8wGkDfPOsJRcuhDc6WAyKPpP2FlEowQBzPLFL6YWeh9heCoIFuRJl2GM4Ow+depgxqMbNIr2am8uYLSDulLM4HTfUfOulFM837T8SjiiJcuWOSdJ5fX96ltFJHkPG+Ma52xO2kHcNtmsnI0SEd3d98gZlEijbw7/U1LkmUlRnL5xnwDHpyrJrejRWCRzlW2Yk+R5Umr2MKE2lQTnX5g8qla6Kq+wcnJJDb9TTsn+SmOZoZQCQVPPenXJUAbkMuVOxrJqiyKthtyalUwvZehBO2aXQFobA3zSZR0EHOGz6Gp6AtChxuDnzNDXsQJcLpJyGO34etVGxMo0OSCgYA779Kq/QUXRxlQNUm/Ok6YE3tkmXxc6UZUJqypeFywnXAQ3mD1Fa877KTobdm1kX/ABidAOdNClUhydo39pcwvGQ2Qhxgqd/StuRg4tPRNEglkURRtITvjHOlfwGzdcHtlS1X7vuQdgNxVr8kNm84PDHb8AuZnUs5BAIJyPWto6VmUuzHWd5cf8NkaV3bU5GHAbA+dZObStiloXXTawdogdtygKn8sj9KynO0Qg6yYgFZIwDyOMjPuORrBzp7E2QuI4y+Ae6b+rdT7HpRcW/gTBmiYHSy+meYoa4oSAru3IztXPOQ/wCRU9uokBAwaVv2KxnZoiKPOspJjRbOV55xUxQWDGMyEitYxoTOxQiJh+dUxF0gAzjbas/ZYtuWCbr9KpbAqW5ZtlG1HEh/kthRnPjG1VFAhkigIANq0WjRF8TqnvVJgy43aKuC2KVCqwKS6Vn2INWkOhBK3h9K2Ut7MRXcwd4CRzraLvoRCx4eiHUeeetLJGyrGtu4gfB5VySgLs5e34xgGsVjt2OmKLiQyHAOc1044NjWipkZVyDWzhoLCuGXUizgEHas1jUWDVmjjmllKpGjM52VQMknyxW3FMk2HA+x147rNxWQ2yAg6FwXx652X8zVR8fds0jCts3J4jBaWC21voRV8AzuSfXzrpNaoz3GuJyW4ch0U8gV2PyFO6FR5/xG/Viwbxux5ybZqLLowvGpxMrIsKvg4BTZR/eol1Ra0Y+5xE5BBx004rF6NBRcxHUWB/Y1H8gBOxjbYnbyqtS0U7osgmBI54586loYQxLLsSfY1F+hgsib7VaYmtn1vMYWAbdD+VNpSEn8h/hfBU59KwaaKRNWOcFT8qTq9jReN9t8+QGalqvZRcsZUDVpU9ATk0hfwTUYI+N2/SlWgJtA7jI0K31qv5D8AslrJg65QM9M4o5UKj6O3TffVt060m2FB0cbEACPAxtmmlQfyGRQlY9UrAADOwq0qA+tFUHLgDJz51ToZo+ElQwMZjydsEVSJZq+C2MssyyP4VHLbGapJmcnSNfZIS4RASM4x51qvgzbNzff8p2fEJwjBScHYj2PUVtLSoyW2efQXLNZBZUEignmMH6jn71yzm6HLSKHiiYEwyaTzCy8x7MNj88Vhaa1/wDf1MgmENo0MCrAZXHIj0qGn7AHkcMSGbw9D5Uo9isstmK+Enb6/wCxVt12BVf4UZG37+1cuVe0OhBcFmc6frSTT7JLI5zGuDzpNCsp7/W+kk0IQWjhWB1Zq7Gi4TAjKik3otI6/jGayGIuJyFThSRW0FZIHbSvqGd62caQUPIWZogRWcexpF3eEKSa0oo6ZMLlTTSAX3M0j/DvWqjXYFCSkDxbGm0DRNwmjehnP0ByMkbcxg1pBgBzXIj51vVggCfiWThTk1m4JmiiD95JLvqzmk4JILoutciTc5q4RSE3aG1vZT3FwkcULuzEAIoyST6VclS0JKz0LgPYKXQknFEFtyOk7sB645VjHA5bmaRj8m34facN4OGazt4I3xp7xvjPsTy+VdKjGP7S1FIncXYlQCdjvkgDcD3qv5H/AAZ/jfGIbNcoPFg4Zvi+gzik3Q0jE3t9czSNIkcecZLy56+XpSVjMte8SnmkZSneBNsQptUNtlJJGb4n9on8OoRoPwjwmolbLVITX0MaAEqM9d8VMqBWxXMwYkBSrDbzrNloX3CnO+Tj0xQigbBDYGfar7F0WhyBz3qXGxpk2BK7sBnzqdsZEoQDjJ9aL9CqjsLPC6gZYHbSN/pSe+g6G8ajH3hycfAp3HuelZSiNO+i2M5ysQCDmQu31NQ/aRX8hCRgEF9yeQXmanb2Oy5WXdSFwOYHIe5607p0In3bHdBz5sRimBNLaJjtGpP4iedVQFxgAA7tFUelHGw6IPIsWdi7eRp9IFsqklmlYB9h0A2oYJB9hbGVsHJNUkNuja8B4KjMsjjGkCtIxvbMZS+DY26BAqpv5VbZBtOznCHiVLq5GAd1FbQi1tmUpekH9ppddhMx28J5Cqn0TE874FiTh7MqqV1nIU+Ft+Y8j6VyS0VLom8PXPh5g+dc8lRkfFmiQ6T6jyzSTAAmLCVtOcHcfP8A3+VX7EE2kjYww5cqO0FnbrxqVPnkelc818jADaDfPyrJOiWimWzO+c4o5CYO8JHIAnNCZNE4UdV8Q5mnZSQbawZGWNLkX0XyqvdnHOhfArEd1bmYkYrSLoRdw3hul9R396pyBbHC2gVdhU2WUSW+52zVqQwGeNgCApFWmI5BbkjlWnMXRyW0xzFLkgF9yy5wa0dN2c7FF6cnCnatIRb2NfkVzRzSEjOR5Vsky00VR8Pcvvmqr2DkO7LhU0y4giMh5bdKmhdm57L/AML5LwrccbuvskBziJPjPzIwKtQ+S1B+z0rhnD+F8EiEPC7WGPG3eMcsfXPOr/g1UUgfiHE1jG2RKOshAC+n77UrGJ7rin4GlXUN9bJ8PrvQMR8b4y0ulVnZtuibGhsEhHe8QPegLpVwMtlP2oYIUXdy0spM0jPEPwBcA/QfpS97K9CPiM0j5RUUIPwg4AqW7GkJpY20HBEW2edZvSLTEt5GjH7sFj/M+wrNu+h7XYnuUAcaGyeuBSe+iugV8bAk7dM5qbGVEDoCPUU7+Q6IFSp3OKpb0BLYD98UNgEwxMcE+AEdf1qKCyxmWHAt+oOXbmf7Cl/AHYYG3csVGfbNS9lBUF0WOlRsNtR5UnEAxAGGEJC8iw5sfIVm18AXqoXAxjyXy9TS6HYVCd9jlR+dOwGEQTGGAx1qkxUFpBFKo3xmqsNk14QpK93pOTvR2K6JtwVu8BxlfTekkPkPOEcKSNg7DGfOrj+SZSNPaoBhE2HI1d30Q0bPsvwxJJkYpqwetb4oGU2bSbKkL0A2xyrZmSEHaVscMmPXSazn0VE847LPiwnRhhC5OK5MnWxy6HQKumkHxc1PnWPemZFBjJ2POosCBtxpUnGdxTu0iHssit9x+lWlaFZKeNAOQqJQoOQBOVXlg1g0VZWzhlwSDWbv0FFEioNxS7A5GwYgNnFNIYbGY9OnYmkxPZ9KiketJSCgbuAzagTn9K1T9AFRJp5bU07GWGXAwOY61cYWMGedc4Jq+NDKtm5kUxMIi0qpzyqX2IDu5QGGMUIpGFe98G78uVdaj8GNFH2gMcnlXVFUqChjZhNJJwSa0SJ6HHAeAXnGb1Y7aCTQ22sLt8s06HGPI9b7M9muF9moGd9d1xAbMx6ew5D3oVI2jCgi84i95IykqqgYwG2AoNBDd8T0gxwxtIEGzEHT8sUrsdCSTiAWAvO8ClDyRST7UrGLLu/e6bw28rIN9T7D6UXYCfiU4kcy3lzsnwo2QKTrtsavpGevL+OJS7PueShtTH2HIUrrsdWIJuLXcjd3aRtFGTgszfXNZcpM0UUtspa5mRiryfJdv1ovdCoruZ2WMKrkZ8yTmpmykLSxbLO2SfTYVG12OrYHM6hMKoGeW9FgkByZOwAHr51Mex9FeVY9fem/wM+KZJxgdM0RYUSTKkCJQXPJ2GT7+lXyS0iaPmZj4UZmJO5PNjU2NIvgiCkO27Hy3+lQ2CJu+onvNwDjSDkfOl+GN/JZCjytjYAZJx0FTIYXqFuQIsa8bDotLVh2RjmkXIcZ9RUv0h0MbeaMKpY4weRHWk2Og+NwVHiHnvTQ+w23U76WoQDqyTkS2McxVIljS3UKuM5IqhdjCHU+NsCjbJdIc8Mh1SDbO9awiRJnp3B4DDw5WCpgDOccvpXbFUjlfYWG1DJBGfWkAj7Uf+2TDzBrOfRUTzzgTAcNYr5muXL+0cv2hKTKDpJ26Vio2ZBEbmRdXUHDf3oatWDIPOFwPU1KRLPlvADzya3USGiu8uD3edQ9qiQjP3l041YbasWrLRRa3bsSBnFZSihhaz+DLHNKMaY2Ui4Pekcx0q2hFsd1obdvaokgCheIQMtWajQyyKcNyNaJAGoNeCT9KdAclTKnetYsBVcxvr25A1sqopE7dsNhxUyExkgBXIFYt30IXXkZ18sinEZ5dOCo2r1OAuwUSvGc5yKcVWgo3HYjs9xPtNKGtYZBaKRrlwNPtnzrVJsnjZ75wbhdr2c4WsdkjNIww8jnLMffoKvo0jHQHxHiD2skoZoEBGTud/QedDdFJGYv+KsUCvJPobOkYC5z5VF+ihFd3zupVZkKDfSHJI9zyFK2MXXV9P8AZcwx26nO7Dxftik7rQ0tim4up2jDTSPI43A5D2wKQ9XsWXFw8hx92HXc48X1NJMekKLoqFLR6nb+dsb+gpfwMTzSkbKmk533x9ai/gpFCtpRyrBmb8TdBU9Jh2L7iXWSUJY8snrWT30a9EFZ1UmRiBj4SdhQtE1ZWZUKnbUB1PKmmhUweTSSCMmlZWikjJ8hQmB8MkDA39edNu+wLipA0LkseZNT0OiccOlCxbCjm3mfIU+XsmvgreUjZc49ev8ApR2FHyeLQiruTtgdaUqSKT9DJNNtFoB1EbsfM1HYIHV8yHJOc5pP8jDLRRJINXLmc0m/QwhF1y7bIDgCpfY0MoYVYZbcHlVUAbb2pXlyPyp1XQX8jyygIxqJOepNOibHMKaQoA3piGlqmRvzqlvshmh4NFqmQAZ3reC2ZSZ6Tcqltw6AqWDEAEV1PowRGPdBtipAQdr208Ll/wAp/Ss8nRUTzngPh4Tz5sawmvtHJ6OtnVtWcdGQztm55GxG9TasRRcKRz6VNUxAathsjlWsQZGRS586znEzsC4hB4ccqzLQNaw6WAycedZN29lBEkbKvUihNADKTrJUZPSrTok5IjaRkUqTArYMBjG/vTSQwvhZYMASdPTNJ0ilsfoxCbc6gKK5JGPM71omIHlfzFaroaOR4WTce4NJoGMonQjntWLED3JXPnREDyu9XoBua9liizVdguwE3aC5EnEYprexQandvCG8gOtOML7K/g94tUtODcKitLCPTbJ4QB+I/KtHpFJCrjnHJAoEJAB8JYqfD67UpMaRmuI8VMEaiGNJpjsHcAE/uKlv4KoQ8TnuQVMiRKW+LS5yPQdaHoBRdzufuoBCzHrnOk+tS+6RSS9i+SxnP/qb5CP5IRn6nOBU18sd30Q7u3jQYjKr0csST606AWXd7bRRuBht+eQT9Klz0VxdiWW5M58CESEYBfc/6VPK0VXyLrhGiXxyZ+dZsfYtuJGk+AAR+tS7e0UtaByGXxO3Llipb+RkTqcjSAPU70v5CjjL4dyo+dP2mgRWcdOZ50r+AI6d8ty6Ci36GdjBJLDHPAou+hUXJpXwgeHGT5mkOkSYtIwPIDZfSk5WOvRFotXMn50m17AnbxlFaYjGDge/pT7FW6onIwGFz68t6KroZ1ANJON+YHrU6uh2GWx0xEnGWGPcVIBlts5x5UL8AxrbqNAxgHPyq0AwiXSQwJ22xQ9bD8Di0OkD86diHVthwABmqJGdvGSNquKIkzU9moc3CDHXlXRjRjNmr4vIW4hGgYroAGnO1XLshdBsX+GKCTM9uGxwmY/0n9KzyPRcTzvs6S3BdTDfNZT3EUugrTXPejILikCKM9KQAV1Pk7Hl4TWiiAIJMsN8Votdgw2BM4zstYy2ZsqvkwueYrJoaKLVNTbgYrnkygua2DKBtijQgZrQxjYZosD42+caqObodHzWqEHGKfMRO3hRCNtxQgQwBUIAAc43qlTKBZuRNXQAesscetWrRVl+NWSTv5mqcrJBXu+4JUmk430CRH7aGPPNJQYxX2S7N3fE7lHezLREg6pThcZ58v3FetGPtkRdntpxHbR2dvEY4FGp2yefuev6Vb3/AAapUC3HEILSBu9AeQ7RxknA9ccz7nnSvQ6Mnd8duLebCffT89vhVfQdaV0Nox3E+K3V5faGk7oj+nWc+WKi23RdJKwe5muApUTA52LSgajQ7BL2ykS2qwkTktIOeDjfzIFHoE3ZS725iB7kMR+MA7D9Kkr2AXGm4AZggj8y2r5VPfZV/AqmigG+lpGzyAwtQWVTPMqHGiMHYKq7Ae9JyYkhbJAzAv8ACg3zn+9ZtKrKsWSsdegHLZ96E7HRTIp574PM5qLa7GU6gmCxJB2GarsXWzoBBznfpQ1QH256/OlY6OKgZtiSDtSukFFjgL4V6bVNhSJlMDBIHmc0+kOiaqGcYzgdKXYFyqSSW9gKi1Yyy7jzoiAyF5486r4sSBCuJMtnOadhRbFz67chSqmOw5gNBxjAwNvSk9ISLIAQ4I2zz9AaSK/kZQuc4U7cv2pp0L0NraYMuCMYG/pV2IdW66kGDyFOtC9jWxJVwpGG54oQPaHltv4sEZrZbMWa/sudMq6up51vjMpDzioH/FRhgwIB2py7JXQwT/DFUSZXtzvwuVf6T+lY5Oi4mL4VGI+AIwO2d6lr7QfRT3mX57VzOOjItY5jJBoihCu5YrK/ln966EgRGNSd+lJhYzgcBQMjFc7ZnIpv5gBzGKiT+AQJazAPudjWEo2UOY5FZNt6xpjOFlB3FUkwRVLJ4eVNxaGCNcrnHI9aaQmz6O4B9apdiLGuVVeuKtRofYHLeliR58qtIZCGQ6/SqaAOZToyOVSmIQcSEhfw8q6cdVsuJVAkpG2eVVJRK6Pc+F2MXDrWK3tIUVwMFiAGPv5e2a7/AOBJJFHGeJJYWza2SJs+Jc5z6f6YobpAkYjiXFXuAzW9oTncsfCx9d+XzzUlGbuhKsOtiI3O+X5D59aT0MX99Aj4W8bvXB+Bjy/IUv4GLbqOKNSzszNz6KB71LSKTE13cc+6ZcHfOr+1ZyZomAvLNI3iaVl6AucUtsKR9FDMVBZwoHUg4/Palsdou+06MqZlydj4xmp5DUSE00khwDHgcv8AZqXJvoql7F1y8m+cHHrms2/ka/ACUfGQq6+eeVNpiKXGkfETU/kpg7qNWWB+dNCPhsBnwg9Opp6A6GyQNs+QFTVhZdFu3i2wDsKl9j/J0DQfXpTTsCaqCckk1LGiwKckYwDST0DDLQZYMR4U3FNfgC0x6vT160xUDSwBV5H1pVQWQihKuM7Y3OfPyo/A/RdqCqqrkk7nHSlYL8hcSkliD1xin2ATGCFA6Bt96KGMrVxkqBnPTzqhD7hsgLEZ9KZMkPrcagjHZga0qyXoeWWygHY/rWsTNmn4CdM6bdfpWsTKQ84ggXjGV6gZ96cl9xK6GS7IKZJku3JI4bMR0Q/pWOQ0iYjhUrf+XWLbZND6E+gaJgMc96zaMgwMBHk8qiIMXzSRgSZXJY7HyraNE0UwyjGM0NARe8CNiuSaFQPPcl8/pUICiW9xIMLpXyq5pSChnaXo0/EBWDiOi9bzW2Cc0+NAi93Dpgc6bGCSW4HXej+SWVhGXcbVPsGzsjZGPrW0RogYC2NJxTYy61g335+VQ2MbrFmPHSo6EwQ2IeTltV86QJBMfDlQfCKh5GUbjivGIrK3T7TJDC8mcDckD+kcyfWvcbrspIx3FOLwSeKytJnYfFNcHQF+ZH6Cpv4X+ZSVdmZ4nxmYRYFwskr/AP0jnG/5UndDpCWeD7vvbqTumYZYa9yKTikgsSzcQjs1ZbYSkNzIYEn6cqlypFVYtuTeXOhiNEf4dRJz8qiSbNFSB2trtWDykrttpODip62PRwTYzqjYsfCDqzj19KLFRHKsPG7LjpUPZV/CPmeNQAoG45EVEnSopfkHlLAY1BTnOKztpDonHGGTfGnmf6jTVAUXDhixXJ26Cjl2x1oGAG55n2qWMGc4bffy25UxEBu2+T5gVWqF+C5MYz8IqRlqDBOFyfWkDJrGS2Tgmk9aGXaSB0FLYEol1AnmKSt7BhcQ+6ONs88VURFunHxfCOlMZ1o1ZR0PnT7QuilYyD6kHHpSSAjHFq8Q6mppjDVj8OB8R8/Kq36AMt4yFPUDYU1pC7DreA4LLsR1oHYbbEhtvekNmkspNQUbnI6VomZDy1JGnV8PPUK1jfRmzT9n5i0+Djngj9xW0HbM5I0V9/7x12UfpVS/cQuhlnwCqJMf2/OOEXB/oNY5Oi4mHsXB7NQ/1Gk+hPopC4QH86kzPu+KoRnanGIMU3c+SSK0URAkU7d5tmhxHRJgzN1rjy6ZNk9IBGT71iybB5cMSBTQ0dgBB3zirbTGwy0J7zxbCoe0IdQqSD/eoHdEZEYnfO1JsVlMoZjgcqEiSyOIY8XPpVWWmSICDeixgpulSXyqlGykg0X2wOqjjYui6C9y29JqhB/2xQByrNwYz7iXECZZJVto2kfIM0rkHHv/ALFe5s0VCKd47p3e68W2cJsPTmaXfYwG4/4NaBXmtoJJseFM5b3/ANik6Q9sUcRv7a6TUIo7dQdlYFsepqXT2UtCe4SF1JtFLkZ1SsukD2FL+AuhfNPJERiR223PwgVLZSSBpL1c7hjvsW5fTrUOXwVFWVTSkjOpSOYGdvpUsoFklkc+E/Raybb2UkdV2TxSOGPTpU2vY6JLcZOERAQNy1JsaOTTM641Zz/KNqnl8jopdNI+E6j1osdFTEoAvU8hRaFRUYgNJkI1enl5VVhRW/hxy38+tNCaJoceKQ+29Kx0FRR6upHlUtBZ0HS+hBluvpQgCFQkgEnJ8zQCJMBpAA8P60XrQi+D/CBxzfOB1poGEW/jJ6k7ZqltgXmNdJwRgbknpV6YugYou50+2aj2BfFCMZPIYycbmnxvYBLRZ3xjqRTaGE2kRB3G3SpSCxjEhUYG/wAqKoAy3hXSxxzORtRQnYZZs0U4TGxGxoWgZpYWwijOCdq3T0ZGm7OKFmB+R9a2gZSNPcnPFBlQMKB71Uv3ELoYD4aYjHdv/wD2i4z1QissnRUTCyr9k4LZxNjcZpLaFPSBe+wmKKMgOafYgVpFDFsjlmI86sBjw+yBGSKwyToTYfJbquDgA+1cU5WyGCzLp5Lms09k2CGIEksNya1uxoJigBXYVm2UXxQKo32NCdiYdCB51EhFjqSPSkpADHbNaLYgaSYxnd6pKyokYZHnJwcim4mlI+ltSQTtmtIgUEPGMHetaAlA7F9iOdTKKBh41lRvWVUItu76GJ83gWd15gZwp8gOtem2bC+a6NzJrbubePG0MaZkpW+xmeult2d/uQXJ5leXlnGM+1KigIRwQAu4cjmScL9BgUugBbu+gOUtxoUHJAGTn59alyHVANzcgAFlYnmFfB+dS37KSFrzYfXKgXPINz96z12OmVzTQlgFQMfMVLaspJnCcAksFz+HrWcrRaI6ojlVDY65qbKJK8QO+nI/D5/Ok7D2RkuE6IAQeYzS/Iz6LSTqckk9cUm60B82lXJUb+tGgopK5xvsKd2BXKmny500Lo5GpLZOcdBTYBisVTI3Y7AVLdAWQRaFGR4jufWjQglQAowMk00BUwKDxHep6DsshdjHt8ZOBnpVIA1VWCHAOT1pqohZeGAhbI35/OqT0Ik0Q23ycZJqgCI49thk5G1NAXxxkvkjwDn60AFwpuCRjbYe9SAwhjGBuCR1oCxjbxDmBQkI4YtMpJ50qHY2spC2lThhmrUvRDXs2nZ4feqOpNdMDnkP3lDcUYMwDfCozzxzxTbXKhLoaD4c1RBke3ahuGPk7YrLJ0XFmG4uFSO1D7ppxmnjonL0Jrpgpwm486tr4ISBWZj0BzTQyEKFnAC9aUpUQaG0CIg6VyTdiBOIXscbYJz7Vg02yewZbpHA3qKoKLWRZDleXrTv4DoMjRRHtjNZjBbmTu98jFUrEyqO93xTcbEWm9ao4DBLm6IG5wPStYJhQsku3mfSDtXQo12WlQ/4aiCFShYsRvnpWU3RTDHAVTWansBXcsckiuqLGga1nImII61UkJocwy6huN6jiIDSFjreVZVA6zSgn0IC8q7Ujd7BHtJXifXcd3E/RAAxHl6D8zS3QaFcosEBVO8KqTqfWWY/LkKFRW7AZu6fLLAhUDIOTkDzNT+RgGqEkmMqMfyruaVIdg8oaQ4LFc9OWPnUNDsFngSAEIEPm5Xf86h60irBwzgkjOnHMVP5GVmcfh0/Pas2y6Po5UfYohcdSahpdDOyW+d9SDrsM/Spoop8BbBJ+VKwouTSdhjbnmlQEXG53HsKa0x9kWAzsNPTnyoq+hFUyg4PPAyapOgZGMeMADb9ab+SQhR4uQzjr0pdof5CIuR22HruadUIJ04UkgDoOtOrGBTnLEDZcY386m/gC63kCKzc9tvShaEycLl33yRzNNDGagYXB2B29TWvokLjjwFJ3PWmgLtOCBgn0FDAZ8M4fJfzCGDTt4mZjsPWuLzvNxeFieTJ/RfJePG5ukaWDswsckEou9YRwXUxYJOehyfzr5jL/ab6kJQWOm+nZ1R8fi07Lbns3PEss9ky3MROVjUESKM7bfi59Dn0r0/A/X/HzpQyPjL8/P8A7MZ4JR6KLSPYAjkN9utfQx6OZljw6l1DbJpNaFewrh8OCoG7Z6daVqKcpOl8jdvSNfwpntyGUDWRtn8O3OvnPM/tTCDcPEXJ/L6/p8m8fDvc/wDI5byL/wCYoriaRiUzhm8iCDn0/wBK8rw/1PJHy8efyJt/Lf5N54rxuEUbdMMlfoyPEZjO3hP/AA2VBjNZz+CkYvjkEr8OtWHQVUF7FNiB0Ye9XRK32QQMTUsJDC0gz0rCcjPsMliZUOPKsExGV4kszXGQuR607URrZ9awMMFs+1ZOQMdWowviGaylJE0WTXCxJUoYmv7hXVNEgLN0HSt1HSlYEIBpAJ50mAWrE7VJILc28jxlgDitIyoaYFaW7CbDEgk1ry0WaezUog07VlIYZHGZiN9qxfYXRO6showorSMqCxNJYtFJkiu2ErGpBCPgb03EEhD9sIKy3crzXHMRBcgn1zzrZP5N6K7l57te8vNSDYrEAB9cUmm1sapAt7mRVydWThEQjA+Q50nsIgk9uwx3zhRz0nI+q0mMqkZwhEYVNI3J2ofQ0ASBxltwOmWxmoZSYOwc+KWQAfyxksT86h2UvwVyBSw8L456WH7Vm38FJHPCwOQQPMryqSitYU1nYMPXbFQMI7tFXUBnpy2qeuh0RDo/hGAf6RihKw6K+57xjvgA450mrBHyxDWMnOD+dL2MnoGsgADHM0xFPdAMRg88mnXoD4IEm8yKpIRJvxH0xmlSTAJt1wrHAJqkhBEf+HgeVNL4CwKddLbDIXelVBZxScqoB2GCPU1PWgNFw7s1xK94fHc8NhW8if4hC47xT1BU4PzGa45fqfj45vFkfFr5NHilSkgy14BxJC32i0lt2XcrMNBIHPAPP35etLL+reNBL7rv4HHFJsYwcDvJwjRojRnxBjIozWX/AO74kV97af8AAS8eSeiq64Xc2mhbqIoSfi5hvQEbV2+L52Dyv8GV/wD3wZyg49jbsgJpL9obaJ5JJAdKqOgPP0Hqdq8/9c8KflYY8FbT/wBzbx8kYNqXs1xbEsEEdzC7EkymM5UYBwurGD5kjPLnXxuTxY4nx5Jtr16OxPluhxZ2d33Bk7hzEpO6kNtnnsc4rmn+n+RKH1IRtfgX1Ip02UcZtlvLZ7kD/m0XJcDeVRzDeZA3B57EHO2Pf/s/+tTWReL5Du9J/n4f/g58+BVziJooC6Kq78sV9p5HkY/GxPLmdRX/AN//AIcEYucqiaHhHC+4geWR4yrgBCrjUjDnlfI+4O3Wvj/NeT9SxOc7jF9K/wDVr3f86O+NY2ku/Zd3gRsYKsMggdD/AL3r5VRcJ8GdPYoguQ94xO+pjXZlp4y3GjccCuzcWIU/FH4TnqOn+/Svv/7N+a/L8JKT+6Gn/wCP9DxPNx8Mlr2ZXt9dhIZEzuRivblXJI510U8Ak4ZxjgsUU76HTZhnBq4a0yZKwmXshw24UdxdaSBsM1dWT0Ze77OXVvIdEbOobAIHOoknQmyUFjPEoLROAPSueUX8ElkoJGGWs+LJFFxbozEld6xlYrImFU307Cs6sVlclzGPDyNHErsV38yupANaQgOtiwRKbvwSak55rWcElQ71scRxpoAPM+dc7WyaJoV7wKOdJokaCAd0CoFJIZR/w0skk6L4YyAcetbQ3f4KWiyNNIAqnG9lBtrzHvWM4iGekaMk9KlKhWLLvBzvXXiY0K5B4utdBRk7m4jMmYtUp6yyLqJ+XlVWvR01rYOsyuxHdO7DkXGB9Keg2iYkdWIhjZWYYJUkE+Z9KX4QfyDyIwADzbdFzv8A3o/gPYJJKxyowB0KkAj/AH71DZRTr0LjKZPJnOTSt9DIMsOol31OB5VDKWyh3bfu1yDgcudZttlKiEkcoI1bnG+OQ9KTTRSIRpkgFBgeeazat7GEMyY0uwY52wOVJuxqyLW4DaiCOu3OihrZaqnRsD4fpR6FZADKAj4ydvekkP8AJJVGdgMDO9NJehHGTTjOd9yc0aD0DuPEEG5J3AHIVS2LoIZVCKFBwMZ2506EEcNtxPJo7xUdidJZSQT8uXvg1lmyrDHnLo0xY/qOl2Ol7P3yrqAgZT4hpmBz7Vx//r+MpU2U8MjOcRjkgublJkdXjIBUjcGu6GSOVcoO0YtNaZPh9rNfTxQWyF55m0KPU8z8t/oaWbNDDB5JdIErdHqnZrhbcFhNvHcNIwYuWZcLvjIA6jI618L+o+avKyfU416PQxx4xo1MRhvYwtyupc52OCp9D0ry4ZXjmm+vYNP0URcDAiYcLmaUqxzBLgSL6A8mr1H468lc8Lv8E/Up/cLrnElvNbXCkDGCrDdWHLbzBrn8d5PFzxnFfcn/APIqSUon3COGNY2EkTsUuJADcINtPkh88cz6n0r0/wBd/UnPL9CD+1d/z/6M8GOlbDY4CiqYtjvg/X+1fPOdvZ1BVs8tuFWN2UgblTiiOacHcHQmk+x3Y30XEBouWSG8HwynZX9G/vXc3i85VlfHJ6l8/wA/89mNSxbW18A8trHZzSjBjdOcZGcH09Dt+1T5/m+Z5GSHjeX3HX8/l/P8rVFY4QScsfsHgkeFZHJOnIPPlXoTm4RbI42QuZjI2C6owGBjLH6Dy9ccq87JBTkpzaX+rNYvihbNCq29wqvKrpHrBXwud/Tl1/v0qvqpNKH+ppbfZrODXEkF3pQD78BfTfdf1/Ou/wDs55UvD8/6Eup6/r2mcXl41kxcvaLOIdjrzi12JZXCrn4SK/RJYnJ3Z5Kmki+3/hvCi574Iee1P6X5Cw1ewxVQFugMcsZp8H8iLl7K30enu76MhTyYE1S5r2JxTOP2f4rqwZLV08txn8qblNi4IHl7KzvICbWErjcCQZpd9ol4/gEfsTqdme0cZ5aZAcfnUvHB9oX0wS77EgqVS2ucnbUOlL6UPgX0hJe/w5uSpaJ5dY5Bo9qf04+mH0zN8Q/h/wAYiBYQd5nyBFHBAotDfgnAoIOHrFxThZWdFPiBB1euaHBNbRSElz2fvAxaK3bQTsM8hXM8RHCT6B7fgd2s4ZoZAetS8XpIX05D+K1miTHcMysORG4qeHH+ouEvZV3ckUbxmCQI5GoYODjlWkIpLaBJi+7QI7DRoAqnH4K/kqt5W1YBqXiAMLXOF0gNq2xmoeB9oAd4bxmP3Jx71tjxSXY7RGOzmJOY2rbiwtHnUErySNjuiRuXYnb2wdqI7Ot6LHu9CaAxwTzQ7f6/M0NhHZAyNpCoZEH0/Xal6GwaWVFU90yNg+IBgcn1NTLXQ0CmVpCVYLg8lxn86QFc0cgUawUHPCjNJoaZUsTFQNGhfMnc/KocUUmERukORrBI6ADak2PRF3z4u8IH9Oahp9jIKzA/ET6YqdsqiakjkpY0mqAuVRjx+Hz3wKX8jI6NSFRqI8uVTVjIBMEqB4j+QopgXIviA8jyprb0DRwx+F/MnIOKaXsTB+6bmu45Ek700DPiPvFXkDvjNNMTQVas8E0cqsAwbUB54pZMayxcJdMcZuL5I9J4LdQXUIORqI2B8jvXwPnYJ4Mji/R6cvuSmumR7R8Dt+KwBCe7uUGElAzgeR8x+lV+n/qOTxJWtxfaOeeNS7FfY3gU/BONyXV+FKxxlYmU5DFtifkAdvWvQ/U/1SHlYFjw9t7sjHiads29wI5Cs8B8B2K+Rr5labizoSOJKIZAcnf8qTXJUMJaQm4SaF+7lHM4yDTxZZYXaJq9MPvJ1nlguokVeIICvfYzp8iM7EjfB5j6V6eT9VSUcmNff8/H/wB/oRHF6fQHDbLCrSPIBhfEzHYjzJrx5ZJZJUttnR0ROFgKZJKylR7ZB/8Ayp17/BYUAmWwMdDWGyCi4jAGpdquEmBWvEHlg7qclpIsCNvNc/CfbmPmK9GWRThFT7j0/wAfH/AuNbQwTVOBGoKgjd/2FGfy+S4RIUaC4IYoEB0AN1yMFTXA8lbH2IL64X7fcaB4VjEY+uf3rqxxf07ejZR1Y2snJtYH1YYLseuQdjWflTljyY8ke0l/ozGNO0zb2/aLHdKxXvZVLqmd2AxqIHkCa/WvE8yPk4YZY/8Acr/5/wBTwsmJwk18Bq9oAPjiPyrp5ozLk7QWxxqVxRyQFy8bsj/1CPlTtAWLxayb/rqPcUWgstHELQ8p0phZYt1bt8M0Z/8AkKKCyxZEbk6n2NAWSyDyoGfUAVyQxS/4kSP/AJlBpVYFLcPs2+K1gP8A/GKXFfAFB4Jw4gg2cODzwMUcUBD/AIBw3IItsY8nb+9L6cfgLIS9nrGT8Mi/5W/vRwQFf/ljhxhaJkdg3MsQT+lVFcVSE0m7ZQeyXDwgRVXA5ZRTQ1aoEkil+yFtlWTuSV5Zi/1pcWgpA8/ZDUrd39l1EYBKkYpty9UJQSKF7ISZPeRWzDppcj9qlcvdD4o/KE08vcd0jsqdFRcfn/s1EpHRQNGHTxAxq3LVzP1pX8CO6myDOruOQeR9vkOZpN+2Vr0wqOR0XBRQoHQAfOhsSKHuC76UyT1Y9KLsf5OuMIS6ljUsZSoVtznB/DneopdjRZp6Rpy2B5CkOyx0CY1FM03SGMeC2cPETNCWENxjMTMfAx/lb+XPQ/WvO8vy348o/DNYY+cWyi5s57O4MV1E8Ei81dSK3xZ8eZXBktNdkbe2lvbpLa0jlnnkOESNSzMfb/eK0e9BdD9OBx8NuRFxWXvWdD3sdo4JiONvGQQWHUDbpk15Xlef9PIox3XZtjxuUbD7DhXZh00snG0mIP3ryxMuT106B+tYS/VVFdP/AE/4BYJL2L7jspdLKzW9xbPbahiV30Hf+nmT6DNa4f1bFki3LTQnjadDSz4NZxRIWCzlidfer4ZB/lz4eXTf1rg8n9Qy/VfF18HRjx1GmM5uzHBbmxWCASWcr5YS6jKFOeoO+Pnyrnx/qzWVZJ9/6EOH2uPoSR9iDZvJJxORZJF3EcR8LDodXMg+mK6vL/W5qXDHGvyyIY0+xX2isYY4bG5t8rHJG0br/K6nfHuCCPSvT/TPJ+qnGT2ic8eLI8IvHgQKrfAcr7Vz/q/iKVZF10/+Tq8LIpJ45Gu4ZxGO6PPfrk718rnwPGaThRO5vAL5FyNPI1MMT4NgloPW5CR5HP4WHpWDg26CjomWdQ6kMDScXF0waoh37ROFY+xp8FJWgqx5w5jLArAE5NceVcXQyfEQptHi+PXs22xGeXzrs8bHjivqdtdC3YRfcLkFuZ7Tx6sO8RGTkDcr58htSyuKlQ4TvTFttc96JDyAY43ztXNPHxpFSXwTeXIxUqJJRBEXn1dK0lKlQ29UPbfSI8YAI3rmkyaKOJXghtXkJ3Udegp4oOcki4xsQWVtd3KEpBJI7nWwVSzAeZ8q9mWKVUukXKcUqs0NmNEUccisGXKsp2I361z+VLFcHLaXo5op7GlkypcxyEDVoK4BxlTvj25V2Yf1LN4zjkx6a9eq+CZ41KLixlIZCCYHJ/pbc/I9a+h8D+1OPNNYs64v59f+jgy+HxVx2Cm7lx+E/KvqfqM46Pvtj9UQ/Kn9RhxPvtvnCh9qPqfgXE79siPxQY9jT5r4Cn8nftUH8ko9mo5x+BUz4XUHR51+dPnEKZNbxB8N5MvuKrlH5Fx/BcnEJQPBxJh/mzT5L5Dj+C5OK3g+HiCH3NHL8oVFicY4iPhuIX+Yqt/gC1eN8TXmkTD3FG/gCwdob9fitVPtRv4GTHaW4Hx2Z+VH9BbLB2oUf4lrIPai0PZIdqrX8UUootBbLF7UWB5mQf8AxotBb+C1O0fDWP8AjEe4o0F/gvXjnDmH/qF+YNMLPxDLcuzAyyAbbLz+Vc232zoqilZVDZyrv9cD9qWkFt7OtMrN4HIP82DtU37TAr7ovu7ny55NFP2OwgEJpTSNXm3T6U38AWSSIo1Mwc49aTYJHI5O8OMAA8+mKl7K6LGchcak046bn8qTfyxlYZpMNkIo3Az+dL8sY+7NsO+nwhIKjduvnXg/ra1B/wAnV470z0O2EHFOEx2/EI1lTTpBPxL0yp6GvmVmyYMnLG6aLlFexPZ8Jm4Gt3DYLJcXs4ILxAllh6LtyLcz8hXveR+qOWKMV9rktmcMSbtlFhwa9vNxCwmU63SbwE55YzzORXlZM+OK3I6m6GC8Ne1GJ43RhudakZ9q4nmU/wBrJ2OuE8KEuJroHuhkKPLNYz8iteh1QHxGyF0RHbqFvIho0rsJgOXs35H359uPOsiimtmsXw/gptHLQrqyCux89q5cqqTFNU9DiOVbqE2lw2IyuFc792fP29KrDm19PI9evx/6MWqfKJjr+xPdXfD7rwujZ8wGB2Ptj8jXpYc0vGzRn/maSiskbRkAHjlKtsynB9K+yXHPD5TR5ycscrXaCbS9a2mLAkZHKvnfL8ThLg/6HtQnHPBSQdaXhuZQ5O5OK4cmLgqIarRoHuB3Tgnpj/WuBQ2CXRDglzI4u42A7tRs3Majt+m/yrTPhVKQZKVM2lrwOz4lw63ngllVowBJCCpG2xAI3Hn1rz83kxw25Lb6+GZRbsNzFbwiJAI1XYKK8+3kdsYpuJWklGDgFhyr0ofbjo24pI1thJ90NTchzrjc+V8jlaM32pjFrfLcRYCXAOrp4xzPzH71phfNOL7RtB2qFyTAgeLntmqcGhsYwtoxjl1rCWyAhrlUUE/9qz4NlJGev7trq6SAYMZbU3y3H7V6GLH9OLn7NapWPOA31wk6W805a1kkAZZN8D06ijNnlOHCTtHNKKTtGnexhnQlW7t8YBIzj3Arzk1dsOTQkLTW/EhFOArq3uCMcx5iu2clxtGqpxtD62nDAefWuFO3TMpInNbGeVTCMknxeQ9a+x/Rv16OLBLD5D3Fa/K+DhzePb5R9hkXDoIsMxLnzYDH0rk8z+0HkZlxj9kfx2OGCMd9nOIRQtBIBHCpCkhlUBht0x+9c0P13ycNrHO9e9miwRk1aFV1FFE6CGRpEKA5Yb565r7n9P8AKjnxpJ26TOHNDi7qgfFd5kcxTDo5RYiJFAESBQBEigZzJ6E/WgDneSD8b/Wi2I++03CjAmk+tPk/kKR3/iF0vKd/nT5y+RcUff8AE7sH/EB91Bp/Ul8i4o+/4xcgeJYW90qvqyDgiJ4wT8dpbt8qPqv4QcDh4tAfi4fH8mIo+ovgXF/J+Y3jbfrj1zn+9ZOzoOJGBH96oJPqd/lSdAiYl0gLHG2r12AotdjqiyWZQwAxqB8+VEhLrZZ3i6cySZJ+Zov0xk/jYKwbGN8tjahgvwXm0YwCZIWa3BwZFGpFPkccj71l9THz43s04yrlWiQzowqKiHqeZrTfbJOxjA2yxY8z0qdjHvZe3aW9ljMiJqQEk8lAzk14n60vtg3rZvg9m14TLZRYtnvJ+8UkArbeE7+r5/KvnJ4sLuUm/wDJUdEoyY5tFaJS8cyTAsXYpnO/mDvXD5OP6knNO/8Af/Ipa0XWv3127A7lAyk8snmP0NU8Kfj1LTXv8fkeyy5u1hj0zRtIrfgGN/mdvnvXHi8ZKaeS0vwN36IrfwTAa45rfCMqqrhuoPIjBxj0r144/EyYvpxTW+/f/v8AgzqSdme4lK1vxANqDg4ZXXkynkRXO/H4Lgzrx/dEJu3SRTdxgh2wJR0Pk3z5H196z/ct9mdV9rKo5sb8qzlEllXaBRPbRXy7vEBFL6r+E/t9K7sM3khxfaCOvtMLxSMG71jYMN6+p/SM7lj+m/8At/2ObyYbU0KruTTJkDNdnm4lOHL2h+Hk4z4vpk+EXOm4ZCf6hXieRjuNnoT07NPcT4gWQsMkda8uELlQoP0M+EwmLhok06e8bXjrnp+VZ+Q5P3pGc3cqNX2SvY7Nro3EmmNkXA5kkHoPma8fzscsiSiJIIv7pbiRyhMYY7DTk/lUYcXGky13ZOz4fazESPcTEg7hVC4Pkc1cssovg4hKb9Glt4bNYgI5pw4/+ooYZ+WK3xLwM6qUnB/naOd/UXoScZjbinASxAjlUiQajsjKdx58s1zY6xeQt/a9GsXxZnZAlpEpE0Nw5YfAxyM8+YHrXdLCm9S1+L/4Hbk+ghpGibQ6lTjbI/3kVzzxSi/uGqYJc3MrlljilfSFJKqWGCT5b9K2w+O5K0XGl2wHhWr7ewkDKwQnDAgjl51r5EXHH/U0yNOOjQ8PgywbGMb15uWdHOx8vENO2reuPhJdBRTdrLxGWA20byzxnkgySp/sd67PD8fNnbxwV2HOME+Qfb2V9AodrWRs8iuGA9dia6sn6R5mJXw/2ZksuOT7G/C7lJJDbO8a3PMRM4D/ACB3rHxf0/yJtqt/l0/8icsorYVcy6CV5Hr6Vl5kcnj/AG5I0KCUtoS31ySWx/Kf7fvXnwuTtm6VAQk+9jUHmv586+3/ALN+Q+cYP4aOLy4/a2XV9secfEUwIkUCOYoAiVoGRK+lOxECKBkGG9AECKBFbCgZWwoEVsKBoqbnQBUwxQFHgbTBvgbG/Inl9KLZp+Cl5D3g+Ejq3ICk2CRIBVOrckjIHSgfZ2SMggkqMefKpGVOcshCswJ5kDB9hTtCosSZdWA5IHPG5zRf5CjWdhbt1u5yuloSFLagGDKTggg7Ee9fPfrn28ckXvZ1+O/tcWb7jfZPhPGYHayiisLzYiSJdKMfJlH6j868Pw/1jPglTfKP5KnjTPMuIWVzwviEtndIEmibB2JXHQjzHrX2fjeVDyYLLD2c0ouOjUfw/iDG/ncBiuiMbb4OSdvkK+f/ALR5WlCC/LOjx12abh9gvfSyEZJY18vlzOlE62FaJbWdJUYhgQQF29hRhyfcpfGyWr0QurkxgTSnMgYk42yc1fKWVtvtnTDGqL+C8RuZI7xu4mktTmTwpty6HlTcZwcYwdfJGWERjeWavKvhQOcFGGyt5ZA2+Yrb6ksGfhkSv8dP4OftaMfcv9ot7mADEts7OgPMDPiX9/lW3LpPpnTH7Wn8kuF3QMIV91IIOOorDJHjOwyLZQZe6ldGJOk7etU48laJYdaMk6SQS/BMpQnyzyPyOD8qWN8JpmbMXxIEMUIxJGSh9DX0H6ZJ486T9izLljYTwXs4vEIkur2RorQ50hCNcu/TyHqflXo/qH6jj8a4ds4sUG3aHFx2b4PcXdqtlw25tZcgNJFdHQFweasCST715Ef1GGSDUo7O1PJ7djePsj3FxE0sgubKM6yCMNkdCBzH/avIzeQ1FuHb0VHJsmLeW5UFRhCS7MeQyf1rmnmUUo2D7sPhtUjQYHzPOuSWRtjsm8egEqC2RyPWkpW9is5cSzuEAmkVPCxXUd8YIz866l5E+PFhGKHvDOLcPnCx3MU1u527xH1DPngit8eH9Pyrjki4v5TIn9SO1sZK4jSW1n7ssuJInH4kOzAeYz9M1vl8SvFlhlTlDcX+CFK5Jr2eUcSSReKy2aNkxzGNfIYPP6VOJJwUvlHcq42MEvJbW1S3iijkjDaiZSZA3sD8PsK0WeNKLirXyZceTuwiG4eOU3NrqtLgrgiPZR5EDp+m1XOaglkSqS/2Eo39r2h7I03ErW3ecaZ1XBOcq56nHMfnXneR5UctKqomK4MpiR45ND5DDoDXBMvsu+zyGVmAJjzkDz86jmqr2VeiT2kjD/FfT0ANaQ8qUVSdEUBrYujgoxVs8wcH1raPmTXUmDoKt7MbmbLEtqJbc8v+1ZZM8pPk3sPwhss0qwpiQsAMb8wKqfmTyY1Ce0QopO0UTXBZgSD4h+eeX6Vxxgl0X2UrJniqhTsG0/LGP2r6H+z0mvJxpfk5/JX2MbGv0Q8o+NAjlHYHKYEaBETQBEjNAECKYyBFAiDCgCpqQytqBMqamMpb2pUDPz8Ci+JVJX+r+1F10albSAnwnLdADsPy3pX8AfB3VxqBJA/3mi9hXwTM/hLEgtnG4zii72C+EWR6GXJYnHM5zn50Ug36OKwOQgULjckUfgLNB2QbF3Op27yMEfI14X65D+6jJen/ALnRgf3NM9RtJm7qKQbK4B9q+Ny4XjqXpnV3oB7T8HXjturwzCG9hQhG05Ei9FJ6eh9a9D9L/UpeHJp7izKcOQo7BwvZSXcN6jRuJFVlfYg46iuv+0WRZvpzxu1T/wBx4ItWay2DJNMSyKkSnWXYAbcvU5GOXka8XF4r8mPJaS7b/wDuzpnJJfyGxR27cPifiIc3AGW7l9K6/QEE1MJ4U3DHBtv8/wDgj7k9Caa1jvLgzRR3MsMT/eIwGk/06tt/St8WHLwcoxr8myzUuLNBPxJ5eFzxCMf4LKirggbYxgcq44wywkk9mNK+xfwe7D8ORSoxEdJ9RXZ5cPq+OpJbiOuM/wCSri1ks8iTrgTqCFkPNh/K3n6HpXJh8qTXCXRfRmLyFLOVBBrMQRTIzrj7w8wPQHb1xmvU1OFezSMnPsE4jNmWGbVv8J9fKlijpxFXaL7SfDc6yyQ0Q0CXtmL3jZB/wn+9kx5DYj5n9a7MefhDm+0LpUaWKNSiqiqqAYVVGwHQCvKy5ZTm5S7ZKXwXrMsKyMcYzzx05V0JJLRtw0au1JeNTkDbIFef9XtNnM0L+KQi30PEMRscEDoaz/c7NIsHiyUXPIis32UfS+FN+nKnHsQulnBYE9FA/M/2rpjDVFpUUB8YOc8hVNWA9seKf8n3c7EhCCp8gdiPp+ldmPybxSxT+Nf8GTx/dcQLinD45eJSTKVDyABiBjI8xXJjztwUb6LukfMkFlAzxRKGAzqPxNj1rb67l9qRK2I7R5HE07NqGsfVt/kNj9a2zzckotnQkujVcMkDW8RB2xXjzuMzGSD7iMMobG4H0pN3tkp0cs2kAxKBnpj9KxlV3E0CzGvMbA1g5bADmYJIuefi/StYW1YHZf8AEcry1aQB6U+6B6Og460kxFJIDjyzn51SAo4dluIRhujE/lX0n9n9+ZFfCZz+X+xj/TjnX6C2krZ5QVNDFZxq1wS0x3EYHw+9fI/qX6823iwa/J2YvH9yM3x7tC8YK2sMfeHZXlGTnoMD1rg8D9Rz4pcMcnK37Ol4IT3IaR6zChl0iTSNQHLON6+9XWzyn26PiKYjhoAiRQDIEUICBoAgaAK2oAqagClxQgKm50BR+eFl1bn70nfGCBT7NNo+MuTsGDf0jYVNj6IEuN8EjmWPKkHZW8iYO7L64/KgEiUeyfGWJGwz0pdjOQse8w2MDkB0p+gY94NcLbX8UzklFyrNuTvt864fO8eWfBKC7/4LxzUZI9P4Ddh4RAxG3w+tfIxa/wAOS7O2S9oLdzGxxtXnTxuDaY1tESUlkaQAB9IyfPHL8qhylSi+i4Iq+0y3GuP+VVGcdc7nz5bV0t8cUYLrtjSSfJhF+txeWiqNCR4xpUbn1Y+ftiso54RlUY1/5FHTsqs+8aGHv5ZZVjH3aO+QmDjYdNsVpnzzmqb0huKT0MUKqNQJz0xXntuwoqtYnilaZE1JKDlEGT74r0/HTUPuVpibXV9DC4Ro4YtZUxTKHQhgdQrkl4U8M05e+g5piLivdJPH9o3t2YJL5hTsT8tiPavX8KF3Fjhb0uzJ8XSS07+CUfewPpb5HmPcHPzqo4+M6ZqpJ00V2NzllGrNTlxksb8PId55epYRj5bn8zXLm+1KJDVjiOYIoGehya4nC2XFWDvOMHHMkA/XO9dEVqjpa0aWz4jHFCihS8hGTkdK89xq9HE1bCHd7u3lDgDI8PoRuKmK+6xLTFqXIVdLHG2abhe0a0RmulKsCfce1OON2FCK4uPupHBySzFfYDA/Wu6ENpGijskshSNNZyQo2pNW9EtFtvI8xMUe7Hb29alwS2xultmhU6kAdtWBjV61ycePRg3bE3aS8ENiwLYY+EGunxIOc1ouCtiixctwcTNnxzk7dQFAFdWX/F4r0jpS2aDs9diW1CZ8SMR+ded5ePjKzDIqZp4iDDj61yRe9mTI28u5B3I8+tZTVO0XF2SM2keYqONlCu9uVPEIlBzkfqyiuvFjf02UlaL45sxKT8Rz+tZSjsT7JGXypcSSp5MHNUogX8OUG+Qj1b6ivoP7ON/9Yl+Gc/lf4bNPbBLeI3EuNR2jU+fnXsfr36pxX/T4nv3/AMHJ4+L/ALmIuMX+BIJDl85z518fbb/k7UjN8FgPE+NGV97e18Z8i5+Efv8ASvrv0Dwd/XkuujHycnGPFezYV9aeaRNMCJ2oBESKAIGgCDCkBWaYFbc6QFbUwKmoApagZ+e0tlQagxx5Yzn3oRpRwlQAGkIPTwjP+lGkHZYUDrk6tONtqG7F0wbuQzAAA71NN6K/JZL93HgLgZ+tFfIHIhkkMoUjc+lOvkB5wLgV5xYqLSS0JLY0vcBCPcGuLP52LxnWXT/g1jilKPJG24dwfivDeHK96sOIzjMUwcgdCcV8j52fBmzOWH2dWO0qkMhc/abXUf8AETY1hNfUjvtFVTKoJvBIRzArllDaNYh3B7cPCJCN2Oo1j5GRp0JjOdESMkHTjp51zRbboa7M/HdKIWy2NDcj5Zx/avQeNtmnFl8l4sbAupKY5cqjHj3siiP/AB+G31Jah8F8jvDkry5Yr04y+nGscf8AMlY3J7D4+JNfKJGxjOwHIef51y5sk8k1zfRMoqOkAdoWD27K2AxXGfOu7xp/3yT7KxKmIe1Rabhlrf8AWW2Ebn+tBzPqR+ldeWP99TKqm4md4dOQgJPLpUZoboqWjQcFuB/wpZGIBLu3/wB1ef5MP72l+BVYcLwPACdxWP06kawjsBvrrTGSNtwMkc66MeO2bS0h9wybvCJJW2boPKvPzxrUThfY++1jusR+EVxKLTIEN9daLhh0O9duPHcbN4bQruuJlE3PiJ5iumHj2zWMdi+5vTpKjdlVE38zua6IYvf8lKIZ9qLxopO561j9OnZFbNBwhO6iMh3dvyFcOaVukYTlboNmuEVCc4zWKTbJSMV2lvWup4YEOWY7gfQV7Ph4ljTmzoxxD71lteGxWyMAIgN/Xqa58ac8jm/Zquyjs7xEx3zozeF8HGetX5eDlBNEZFas3treAoN8npXhyx0+jmaJxzBbjOcahiolG4jiRuJiFkBOM8iPOnCF0aCWK4MnE8k/Dgbn3J/Su1wSxmi6DrK4D24AbGNs+1YZIVIiSLFnJzk+1Q4EnGlpqIDTs8UfiAaQ+BYmYjzx0/Ourw/Kl4k3kit01/mZ5oqUaGPFL5mYvIBjGMDoPKuablJ23tkJejI8Vmlvrxba1GuWU6VHQep8hXo/pvhS8rIor+oTkoK2anhXD04dZJBGdR+J3x8bHma/RcOKOGChH0eXkm5ythJrYgic0gOGmBE0CIGkMgaAK2oArNAFTCmBWevWkB552r/iNNwPjEtlacPtrhI8Bnm1Z1deVdUKSpJMwlt7Z54koiIGFCjqdya5ujqq+gnvo3+HxN7AVTYL8nzxK6Z71ifLPKih2UhSrLswA577mp/gCm6d2PhXSR1I/Slv0CKYz3anfGfPmaLHQ+7K3n2PiK9+AYZPCSd9J6V5H6v4jz4eUe4m/j5KdemeuWF33mEBwAMf32r4KScDraF3EbAWeu7t89z/ANSPGwHUj28q68Gfk0mHapiWSUIJwp54INdDinJGkB/w24KRRnppHLoa87NC2xstvbpAhAxnp61OPG2wRjXuitxKjYAc6cjlv+2QK9mOO4po3Ox3/ewgE+MDGP8AfzqZYeLIkt6B2ddXPbNaJMEPuGTqtlCcgcz+dcmSP95sxntsjxqcOmpWBGMEV3+HC86bHiKoCbzs/eWYAkmVC8SsMgkZOn0yMjbfevWzR4ZFKtB5MG48o9mGiaKSNjaMwbGe5Y5YDrg/iH51pn8fdo4sXmc9ZOx5wif/APoyKCCNR/WvEzw/vmz0YLQQLjShGeu/So+ns3iqF3Ern7sAbAHOK6MMNhNjDg3EcFVBzjl6Vz+Rg9nJI0y3o0bnJxzNeY8TsgT8Wut1bVjGx9vWuzBj9GuLToz0l4WcoDnLDl1FehHF7OitFUl1qKb51uz4z8h+Qq1jr+hX4HnCiJCGJOlOfqa4c+tGE5V0aGO+076tv0rz3iswoX8V4uscMgzggH1roweK5NGkY2ZvgzmfiqzSEEqc/OvR8lKGJxidSVIYcYuCQcHz9cVz+PBAKLS5KXKMraT711zxpxoUujb8I4gGjUg14vkYaZzSQ3lu9Kh+eN65I4r0SuyN7efd7ZIxkH08qePFs1WxXYzZmuGIOoEkZ9F/1rqyx+1L/wC7L9BNncaY0G2joBtvWWSFsJUw2NzuWO3QVhJeiNHzy55UKIDqwj+ywM0hHesP/wDEeVZzoxlK3oE4hfE6Uj1MzkKqKMkknGAOua28TxMnkZFjhtktqKtmw7Mdh72ztjc3fdC+mHiTVnul6Lnz86/SPA/TF4mPiu/Z5ebyPqPXQ3fs7fDkEPs1d/0pGPJA78C4gv8A0c+xpfTkHJA78Iv1520nyFLhL4DkgeSxuk+K3kH/AMaXF/A7RQ8Eo5xuPlRTC0VMrDmpHyoApkOlSzHCjqaai30DaRS8iadWtNOM51DFX9GZP1IkEcSIHQ60P4huKhwkhqSItSpjtFRxmkM/PH8Q5B/5p4gDviU11xqjE40awjDMJMdGb88CuU6tk4ZEZiExv0UYpp3oQfG8dzbRFQiPEhDrnd8E7genL5etZYsnJuD7RnGW9n0cuoELjT6AnFbp+jR7KZIsZdhqJ236UnsAaePB1adI54qWqGWWoRkReYHMAGkqfQ6Nx2Z4wTiCU4dcbk7kV8b+s/pv0pfUgvtf+h3Ycn1I77Ru4ZVkiwdJBGN6+XaaZoZzjfBjEhlsw3dgeKMblRnmPT0r0/H8jlqfZUZK9g9pdaFxnpRkx2zWvYJxG+whUnY7g+XnW2HDbsF2Za5udVydyQQV9vKvUhComl2ij7UUkGDs2/tV/TtB2Ei5yc5ycjFZ/TEjQ20oWzhAIOEFefONzbOeW3Z9dzGS2cEb4yDXo+AqyjjpkOD3Zt7pXVsbg/nmvX8nHzi/wdD+6NGY7SG0t+0F7bXIa2dJdUc8I2KnxDI89+YxyrowyjlxpS7Pns2PhNovtrkfZAFlWQYLF1XTq38vOvI8zElmPX8Jt4lZY8x04BOMc81zKJ3qgDiE2oO2rGMY8/et8UaIk/R9wy80jAO4x1oz4jml2aKK8LjY15ssVEoheMDbyHrpNVj/AHJFQ7M1bTMzNJv4VJx616U4pJI6m6LGYtcRxjAKqq1NVFsOVbNBBKIECqeXP1NcEoubs5m77I3F+QpwelEMNsEZ6fiJnlZWYnfOK9OGDgrNsaGfBZQjg9a5PJjaNbLuIyh4iV51GKNPYCbVqI2rrolmo4LceBMHwjYYrzPIhtmMh5Jcnu8DnXDHHshIqmmPcI+rbTjHqKuMdtG0SixlxHM5IyQ528thWmWO0v4GW2NyupUzkKBvUZIOrBjOO45jYe3WuVwIoMsnBl1tg6TsD51nNUqIm/SGNxeYTcisIw5MzSol2K4ta2XGZuIXNo113P3cGGA0OfibfrjYe5r7z9CwLxcbnKP3P/Q4vLuVJHoifxEsv+pY3K+xU/vX0H/UL4OH6bCU/iDwdvjS7j94gf0NV9eIuEi9O3XAm53Mi+8Lf2p/Wh8hxl8Fq9teAN/+oKv+aNh+1P6sPkXGXwXxdq+BSkhOKWuRzDPj9aayRfTCmELxrg83w8QsW/8A5Vp8l8kgnGls7/hF5BYXdnHdSxFYpVdTpbGxp2vQM8ik7G/xBdSkfE7G5j6g6CD+VNTyroiosBbsn/EG2heEWHD54mbUy92uCaf1ci9f7C4R+TgT+IVpGI27OQtGvIIpA+WDR9af/wDEfCPpg5452st2/wCZ7JzEf06v7UfW+Yhw+GUy9s+IRZ+09mLyP1G/7Uvr4/cR8JfJ5t2it7LinE5r2ew4hC8zFiCvWplkxN2nRUVJCq3lyNJCKD6DH0rnOkIgjiGdTscfy7CivTGwGVEh4uunUsdxGQu+4YHP7fnWGXHyTcdMwyL2M7HiHfSJa3LiOY7JJyWT36BvyPpRgz/UVPsUJ130HyQMjac6Mc9Q3rq/Bun7RQ9oCzENkjrikAGkTRTKrZO+Sc1FUx9h9omljIhCkbhj51GTDHNBwn0yoTeOVo2PBuN95GoZgHzjGetfBeb4EsM3Fo9JNSXJdGqjuFaAHPTevKScXRJmONQiKVpIsKGOSOWDXo4ZXpmsJ6pmU4hcaiQSc9Qa9PFCjQQyzHvPnmu+MLRROWTvELDkDq+tTGNOgTJW7l9K4wW8jSmq2EtGi+1aRjlgY3rz/p3swKHuyU052J89q7PDx1lQeidlcBcOCdhn1r2pK9G8XaFX8QZlbitjMQo7+1B5bEqxH6YrPFipNL0eP50PvFdtcBbNQNhqI/euTJjfPZ2/p7vF/UL7/Ma7n51jw2d7dIEvJw0bHqQNq3xY9kORTw+UhsA+tXngc8nZo7Sc4G9eXkgSFtLqXntWSjQ0Z+2PhbJPiYLjy3zXoT7OlsL4f47mWYjIUnB9ayy6iokZHqg15STXOomVi3idxpiOK6/Hx3IpCm0b/md9/Su/NGo7N4bHfDHIklB5BcbeZrzcy0htn0lzrhGcZ5ULHTHYAZPFgttit+ImzQcEl0qp5VweTExl2ORNqOOlcXGhEZpPumB+H9KcY7LT9FdvOEsWzuTGd/c1U4XP+pZG2uNTbN+dOcNBY0tZGZiWJxXLOKS0RKXEYwXIHKueUDEp4jflIiEJLnZR5npXb+neL9XKrWkDHfD7cWllFDnJUeI+bHc/nX2cEkqPOyS5SbCDVkEDRYis7UwogSR1oERY/OiwK2x5D6UrHRWyr/KKBURDMhyjuh/pYihOgqyxb+9iOYry6Q+azMP3p8n8icY/AQnaHjMQCpxa+X074n9ar6k17Yvpx+AiPtb2ijQsvFbrSoyWfBAHqSMVSy5PTJeOC7LF7bdoNBb7dFMgOkkxxuM88bVS8jKumJYoMqftjxVjmRbFz5m2Wn/1WT8f5A8MTwRo5FcAvsP5cYpGhdCTz3bfbIwKa7CwTjrlUtpgTqSQ74wBTu9EZAgwpeQ6ycatx6Hr+deTmbw5Licy+Aqx4oyFbTiLHI2jl/v5ivRxZ1kjbKjNw2uh2fiwrkqBn0P+lbo6FJPYK4JkGcA8gBSeyui0oiNpZ6NBfwfOxi+8ibxDcgbZri83xo5oP5R0+PlcHT6Zq+B8XE8CMzfhz9K+J8nxuEtHZJbPuMXQaNhmlgx0xGVukMqNhsMN816sHxZcZV2Z65Y75NehBGpO2k1xgZwTlTUzjTFZbw5gZvF+Hf51OVUtBJ6GLz5HPeuZQoyX5KFmzsSd2HWuvx4f3iAtt7jEYGdwSK9KSdm0HQF21xccL4VN+NHkjzn2NaY7jJ/wed+oLpiTh85Nuysd1b9qy8jH91o0/T5fY0wrvSI9hneudY7kd7kCTSlhzrohjoyvRbYtvnkOVY+REzbNBay4AGc15k4iQRNcJDCXkOw5DzrOGNydIpbFkLYiTc5wWOfWuqS2bWF279ymnOfM+dYzXJ2ZSley3vRjNTxEhPxKUv4emfpXf40F2XEHsjhy2NhyrfOm0oo2g9WNeHzBGlc88iuDNjekgbBJ5cPMgO2okDNaxhpNgmUl8sD0OKtRE2PeHyBUT/eK4MsbbM2N0m361xuIHLu6KwMFyKcMdy2NfJCWbRasNzgKo8/9704xuRVldq+oFSQMeXWqmq2OxrFNoGOWwrllGyJliXWkHJFS8dkhPCNN1xNJX3jhGvHTPSvov07CseO/bOfPKo6NR9pTyr0rOE++0J5GgKPjcJ50WBAzx/zCmBBpo/5hQIr71TkaqOwog0qgfEPnQB1Elk/w4pG8iENFE8ortgvEbu14aueI31nanoks6629kXJ/KrWOTVkPNBdGb4h20sI0YcPhuL1xsHZe5jHrk5Y+2BSqK7ZLyt9IVC97VcZ2tybO3brCoiUf/M+I/WhTS6QcZS2zQWnBi0CDjF3PxOQb6Z3JiU+icifU0SyN6ZrHGojGGCK3BEEUcY/oUCoqiiR38xTA8eW+lAAZMDPPlXTyJomLqQ4PhB+pNFiLLtftlkyElnG4x0IpSuvyElqgXhNwU0xMSNey/wCYbEfMYrDyMf1Y/wCxytBt3ClzHvjPnXm45OD6JsqsOKyWLC3uwXiztk7j2r18WVTRadO0PbWdJcSRNrUjAZf97VqdClaLwy5xpDHrttS09DRMEd5qA3Hn50vyNC7h183D+IyQMfu85UHqprw/P8NSto9HFPnFMbXt+JM5PyryseGiroFWQEe9a8aGZ6ZiTht9yPWvRgjayu0c4cDGQQd6rLHaJbLtfdXBKk88gVCjyjsOVoKeRXXOdqxUaIKFmCONbbZHWuvBH7kx1ZbFJoklTqDmuuSfZcZFPHJRJwqBSclZyR7Ff9KqHZy+fXFMT25wWI57Z6UZFf8AQx8CdScS15MgjrUJUz0JyBw2cZ9610ujPsLtHwBnnXNminsnsdW7/lXnTVACcRnMkoUE6F2G/WtsEOKs1WkS1gZIJOMKKniOy8Sb4zWfEyJSyaY8g70QhbGmK7ttXQc8Zr0sUGik6IxHShA3J9KWVcpGqdItE2ghV6bbVm8d22K7Iztk6s4zRBUTZBXIOR0puOmPkMbe5KKmDvneuOeK2yX8jmCfUoNcUoUI+vbgEKoOOS08cPZd62VT3Qkhk0nbX+lVHG01ZKkmW2DFckkHyqMqspMMM+XbeseGhSeyp7hmYIvNvLfaujBg5yRN+z0PgfDxZcPRZB98/jfP5D5CvoYRUVSPOyz5SDTCp/DVmZW8CjkMUqGVmFc86ehWyPcr1GaWg2fC2VwdK7DcnkBQl6REsih2KLzi3CbXI75rqUf9O28X1bZR9T7VnPLix/vdf7mDzyf7ULJe03Ev/wBOs7WyT+Z171z8zgD6Vzy/UYRX2R/zIfKT+5ia4ueNcSkaOa+urgvzjgOgfPTjFEPJz5f2qgjD4RZZdkWPinMVsp5qg1ufc8v1rZY5Pc3ZusfyOrXglrZlTAilx+OQam/Pl8q0UVHo2SS6QYRKdy2cdaYaInvBjDc6BkNU3PNAETLJQB5jcFWXwgbjnyrp2Qgdi652LDkCedK17HRbEWOxYIPIClYMDu0WC4IkJEMuMtjdG6N8qmOnRz5I0w2CcyBllAE8ezgcj/UPQ1yeTh39Rf1MWvRG4ijuI8NnUORrmxylB6EmL7e4uOGzkqcodip5NXp48qmtGsZezTcOvI7xAYCQ34kY7rW/ZrGSfYfspCsPcc80mi0xP2kDr9muhgMh0HT9R+9ZTipdnRgnVxAoL4sAM8sbV52bx0to6k7GsU2VG9efKA7FPEPDK/LHPNduDpWaJgttJic7DB6VvlinHRLkXzOMIwPocVjBXaBSLI5fu9/1qXC3oGwa5kI+EjHWurBHexWXiTWVbmGXJromtFJ0fcQGqyBPRwPqDURe9GHlO8exQrYkB89jWzjyVHn4p8JKRZI2FIzUKO6PVnL2Vht96pk2FwNtvisckRpjZJdERbrjavOlD7qGLQ33wDHA3NdTiuFjci1ZdSJ1y+fzqXCmwUrCg5zt0rncBWVzy5A3yK6MOJFJg0rYVABuBn2zXUlXQXsir4XOfQVPCxuVaIptg561VIXKw6CLvfAOZ5e9c03wVsmUgOTUrsu/hwd63rVkxybout3B2PtvWGXG7s0chtaTDAVcVwZICsG4pfEA9MAnatvH8e9iyZKF9leOY2TI3I/SurPgSaZjjm/ZobObEWpjvivKyQt0dMWfGfrzwM0RgF2aLsJw03/EjcyLmC2wTn8TdB+9ej42KtmGadKj0giu2zjIsD50WwpEGFKwKmXl50wdIT8S41DaM0duBcXI5qPhQ/1H9h+Vc2byoYf3d/BzSzOWo9Gcvrm4vSTf3BdeYhXaMf8Ax6/PNeXl83Nl1HSMaRG1tpbs6LGDUo2aQ7Ivz/YVeLw55NyNIwchxbcAiUZvJGmb+VfCn9zXoY/Gxw3RtHEl2MliSJBHEion8qjFdBr10RYYpgcIoAgwosCBAJzTsCOnAxSsRBlx0ppgeThTgEMB5sa6GSWxyhSTzOPp86PYFqxxN45HAPvRS7Ffopu7T7RCyoUyNx50pJ9oUlaE0MrtH4WIuLfl/UnkfPH6e1Wvu2jmYdDcRzx602PVfI/2rgzYFH7o9CaJSgTJpdaxi3F2hIAaOS1dZIWKsu4IPKuzHl5Fp6H/AA3in2tdDHTc9V6N7f2roUuRrGXyF36farWaBtmYeEnffoaT2bRuLsyEblHKsMEHkehqJxtHZGSTG1rc+EDrXm5cJpZ9dnWuedTjVMdi4sEcY6b867Y7iZtnDdgh1O4ByKaw9MiOXbRfHMDHkH3FQ8dPZqpWU3DkHbPKtMcRNhduyhU1Hl/atHVUDZfeRvLwdrkEhY5VUDPTcE/pUxic3kZLqPwJZNmPLzzW35OMrlYlAwPPY+hoSR0wyNqjqHVy5/pUtUzpTtBcTYIHI1lJFph7SgIFbmRXK4btD5exVdXOg4yd9jXbjxJpM58mX0i6xmZzGD0GdumaxzwSVmmKeqDdZ1ZHTqeWaxhBdGiZB2LEAk71skkXaSInxOcVW+kS5UVyRvqBGoLyG1XGlo45ZW3ZdFE7fhJqddlxy0HMzWcWI0LXUmyKBkjPU1xuMckqk9A8jfQ/7P8AYLivF7F2wsM+ksv2htOs9EH9zgV2Ysc5yfqJlLJxX5M7xjhF/wAGvWteJWstrdLgmOVcEjzHQj1G1XPC0awzqS7IWsh1A7jHTFcWbFV6NuRC8jWWcqZcK45AZIqsNxjtdGOXIk6BLRH5AZBOSa0zTT2ggN0kIUgbkfKuD6dnQpDfgnCLrjF0Le1XYf4kjDwoPU1pjwvthKairPXeF8Pg4ZYx2tqPAnMnmx6k12JUcjbk7YQ3ypiZAnbfnQIizAAkkBQMkk4AHmTRdCb4q2ZbjPGmucwWDskHJ5uTP6L5D15n0ry/J85L7Mf+ZyTk5vfQieRLdAkS5YnAUDJJrgx4Z5nYlb6HXCuAlsT8TGpuYg6D/N/avZweLHGt9nRDFW2PgFVQqhVUbAAYA9hXTZqQagKINzoDogaAKzQBw0AQNFgRNMVHCKQddniyTFt3Z8nodhiu1kBMbF056UB5Dz96jfY2XJA2kMyqpPItk0UKyaQoG3lB686VWF/Aq4kht7pZ4cAZzsNs9RTjpmU1QFM/cXCywZWKQalHl5iqoha0MLe4WRdQyPMeVcWTFxdk1Ra51DBxnl71klxeg6ApI9DakJDDeujHN+x3So0PBeJi7ZYLtgJh8LHbX7+tdMXyNIutMSdowkfGplRQA2lvfbnT40jpx5L0waGXC7VjPGvZ1KQX32oEZx1rCOOmU2L7ssH3yBW+ONaOfI/bF7ticE8s1ulqjnfdjC3k1LjrnOaxlE6MbJyOGbbc5pxj7NbCrSGS5lWGLmeZ8h506t0Y5cvBWaq4s1/4JPaxDYRHTk7kjf8AankVJHJik5uVmHYgqp64+dC7Ymct2UMVO6tsacl8AtESphlIxyO+1P8AcqNceWtMtgcE7HaolE6oyXaDu7muVH2ddb4+Edaw40+gySSQmukc3RR1Ksp06T0NdUahHZyN8mM4VEUYC7E4ya5JPmzqi0lSLl1Ead+f0qkqZqnQXa20k7hIlZ5G6D/e1FLsmWT4NJYcFtraH/mB3tw25IOAvoKZjJ8tME41CtqYNKZWTOQd8HaspwraMMmqob8HtoPs7s8MZfSrAsOWSf7U8cE+xQk26HViILfLxRRI3PKqBgVvGKj0jVmp4JdHvFJY7jnW8JWYzR6Xw+z4V2ksPsXG7K1vY0GUE6BtJ64PMZ9CK6lUkYNtbPMP4z9iOw3ZLhz3Nle3lrxaZSbbhySiUP6sGBZUHnn0FTPB9SLb1+f+PyV/1LjUVs8e7K8Jk4vxWO21KJJs+JxkAYySRXl5YfbUdG+NtytmrH8OeJK5Ec9lp6HUf0xXN9NtnTY64X/DqKFg/EblpvNIVKj6nerWKu9j+obG0tILG3WC0hSGIclQY+fqfU1p0Q3ZaaAIMaBMouJY4ImlmcJGvxMf09SfKpnNQXKWkROSirZjuL8Ue+YocpaqciMc29W8z6chXieR5cs2o9HLKTltima4J0xxAtIxAAUZ38vU08HivIxJWafgXBlslFxcgPeEe4j9B6+texjxxxqoo6oQ4jjO9aFlTHANAyBNIRWx8qBkSaYED6UgImgCJ9KYESKAIk0hHi6zLjwgZJzk12v8EBUMg/Dgt5Cl/AggmV8qXAPUKNzSpj0VTRGM5UEHoOppK2JFMwEsDI5QMdx/Nml3oTVigIZYnh/EPvE/cf78q0UrRh7B4JWhkyPmKcoqS2OhvE4dVYE4xtXDkjwdENEW55A28hSSsPyVuu2U2YdfKri32O6AeJSvPdySyMWYHGTz2ruj0VZG3mGcPzpONnTjzemFE45NlfPyrHi0dKkiLgyKRk56UftZE1yVC94W1gHmds8615ROZxadB/diFAg543J5k1km5OzeNR0QaQIck48tsmtFGxSypaNL2QTvYpnA27zHnyAqorZx5ZcmamNMHSw22FLKvtF47++jzadDDJLE3OOQr9DUL5LfwDnZ+mPOqsQRJ441k6jCt7dDUftJl8nwjVyCPCfOlyaGpuLLViLhndiY4VDac41HNVFqq9lyk8lNjNLKXipkvI1hRy+67jJx51x58qxS4v2OORRVBlp2bubmC8lkubWBLWBpiGYkuBjwrgc9+tXhyRndFfXS0a/+D/ZbhHaHjVzFxeOWW3htXmVVlKZYFQMkb43NbYKySaYnmk+jWrZ8PtO9tbWyjhgDYxGuCfnzNcn11FtPo61jbVi7iXCl095Zg+o8q2U1Lohxa7MV2ogeJbbvAQ2s8x6VOToxyrSD+HnCyKNj9mib/wC4/wB6qH/gzg/vDoZcgA9K1OgaWFwV3yAc8/KqTJkgfjX8UZ+Eo1r2dZGuyMG6Yalj/wAo6n1O1bwy1s5ZJPSMPHw3ivGbLifaC/kknit9LXFxO5Jd2YAKCebb8ugHtROU8itkqKj0em/+GngUPGO03FLq9jMkNtaaQOgd2wPyVvrUYIRkm2jS2uj3r/y/w+3uGEdqTj+Y7VssUF0g5NoIbhPD5RpeCMD+k1XCL9E8mugC57H8NkU6JJIyeuQRWb8eDKWWSMl2j7N3HCUEwJltidnA5Vy5cDgrW0bQy8tMzM80cETyzMEjQZZj0/ufSuac1CPKXRc5qCtmK4vxWS+k1HwQoToTnj1Pmxrw/IzS8iVejjk3J2xHdXPPBIxzzW3jeJyapC7NR2Y4SbWIXl0n/MuPAp/6an/8j+m1evSiuKOvHDirHxOBQaEC2DQBFiDuKAK2NAEKAIE0ARJoERJoGRLfSgXRwmgCJPzoA8N69Plyrv1RmGWvMaQwz0FZ99AHhygzpA9aLF6OZ1eJt88jikUj7ZCCABncDrQlT0FiriC91c94owM6v71UTGapgd7Dg60G1OOtE36I2c+hwpPhNKcOQmMAcjauTr0TVENWG3pV7DYvutpnJ867cbuNssHOxyfOtALYyehPy6UilJrosErIc86nipPZayyLmuV0RiMAl1yxxjSc4x6/61H0ldj+q2fXBZ7MOCQVbB36HlVJJSIk2Lxlmyd8+da1RBuew5Q2ckZbEhcuB6DAqYv7mjOZqmTBB60ZFcWGN1NHnnaGIR8bv0A27zV9R/rWMX0bz/cKpFwARVogJsSrNoY+FxpPp61ExfgkEaNmD7EHBz0qO+iUmyyBtUd2m+8eR8jVpaNE6Nf2etMdn0uI2yBIwkUc18j7GuDzcLa+qv6kSe6O8QYx2VxpJAZNJx5GuTBL76EbH+BjaOK8Q55azZPq6V6eGfHkawVs9Nbg6kk6Rv6Vk4I7ORW3BhjZKFCloHI86/i9YfZLPhLacFp5Fzj+gUp6iY5n0ZaxbF26+div5b/tWsXtfwYR/cW3F9FZQa5W0g8gNy3oK05aOiUlHsznE+MXN6jRjMVudu7U7t7n9qjnydJnLKbnZ92c4Mb+71SnEK7uw5+w9a0i30XCHI3Hb7iMdt2MsuFWqLFFJODoQ4ACDP6kVvKX2NCkqZ6B/wCGRo+HcI4lcS6R9qmAyf5UX+7Gq8ZXAU9M9q4jd27xB2lVFxzJroomxS09vIv3F2ur1G1LTGHWImljIIWQf0NVL8kkOK3dknAL/wC3SiOCOMly/wCHy+eaU2km5dC5cdn5p7QcTN7OUjBW3Q+FT/8A7H1r4/yczzSqPRTk5O2Z+4lP4Tjy9B1NVgwcnSJDezHD1vLr7XcD7iFvAp/G/r7frgV63FQXE6cOO/uZsmm6k0HRREzA4waLCj4vv6UCZWXoAiX286AIl6AIa80ARL0CIF6AId4M7UDPi+1AHNYoA8UTGrA3xz32FdzMmw6BsAlufQKKlgTZmJyzAegpewLBIQoyAP1pOwPgcjmfEd89faivkV2DcRAeDb8P6U6rZM9oGQd5AoP8op7ox7Fc0ZjkK/Sruyuwy1m1ov8AMPXn61jkhRLL3OTke9Yr4F7A7oeJWXkdq3xvVFKgYj02+lb+hny8vWkBKQ7bULQtlXUDJJByKr+R9B9oe8jmi6um3uNxWb7srtACnO/nzqiWOLG5ls47WeBsOjsR5EbbH0rBtqVomSPR+G3sXErFbiHrs6nmjdQa3UuUTL9rMZ2ui0cfuumtI3H0A/asUdU9sSCF5CRGupuZx/vaqRm2TSExDOoMeW3IfPrUSq6EvkpuJDIxaRiTWi0UER97bMJYsZ3zkZBHrWfJXsXs1XBrtrForu2AktZF0Sxefmp/Y1jklLFLk9xfZMqeg3jarHa3AjYmMqrIT1U4I/I15sYKGZU9AjYfwG0Nx+eN2AaSBlTP4jkHH0B+ld8F2a4nvZ76toMDarOiz42Y8qKCzyX/AMQcAi4XwH1upv8A/mtZ5V9uzPK+jyo3Zsb+Gbu+8P2VVCHYHII39KTmocZP4Oe2mJp+8uLhpZ2LOenQD08qxeRzegbbdsgU1yhFHM4A6murGqjQLezbcNiS1tFiTmPiPUnrWyo61GlRnu21133ELeAHaOPJHqT/AKCpySpGM9yPT+xF0/CuztnGhx4NZwcHJOa68WopEscX3aeWZAC2P6WolMqMTsXG3jjDhic+vWkpaG42aLgHaaVXjCyE6j051ccpEofJi/4kdsH43etHbtptFIGBt3rDbWf2rwPP8760uEP2r/Uw72zz6WXGeuTv6muLFG6K7KrSzn4rxOCwtRqmmbBONlHMk+gGTXsY8axouMeTo9Li7NrbwJDCCERdIzz96iUHJ2z0IySSSIPwRxyFT9JlcyluCyjkCPajgw5orbhdyv4m2p1JByRU9hc5zk5ouQvtKntLpc7Z+VHKQUiox3I5pmnzYOKK2Mw5xmnzftC4fkrMjDmjD5U+aBwItN55FPkhcWV98uTg0KcX7BwZITDTvVCaaOd8KKEeQxAggKPeux9mX8BSLoG3M7Z9aQrOyA4IB5UUuwJKNKb7daTD2QaUE+HxHl7UDJCIzRPqJACk7Uu+xP8AbQFA3hXzx+9WjAjfQ6o9Q6dRRdMSYuhcxSA9Ad6qSsoYqwZfMHH0rmlGuyGVTLqBB59KqDpjQGTyroWyjm2fT0oA6eVHfYFB5j+9XtCDLOXTKjZ5Heokk9FohdRCK7kQcgdS+x3FJPVktbCsj7NEBn4mP6VjJbJb2M+BcTl4Zch1BaJvDImfiHp6j/SlGfF2ZyGvamS2u+IxTwyiRWtlDBdiCCefltTk4p8jVu0hFJIFGnG3RRy+nWoTlN/gnsFmkJIyTq/lB/U1rDHxRSVF/DLSOacfaDsRgL5E8s1GXJ6X+ZLlXRORwtxJEwA07bjr5VnCL4KXscVoI4VefZZzHJvE2zKeVatKUd+x99Gj4nIJOHZXdREiAnrjFebkxSx5o/FEhvY66msQLq1fu7iGRJI28mBOPl5+hNaSnwxuXw0K36P1T2d4lDxvgtpxG3AVZ0yUznQw2ZfkQRXZFKS5I6Yz5K0MhHmnxZVnjv8A4jAjWnZ+DWglE00mjPi06VGrHlnIz6Vz+S+ELZlkkeJypjOTlvU15fNzezHplGg59/St06Qwzg1r3nG4x/KQB7mu3xpckxof3UctuxBX0BrdaO7sxd05vePPv8UgUew2qO2crdys38XEBHFpz92Bp0+1dKkauGjq3xl2O/r1qXL5KSoKS4ZogmfzrNvQUgi9vms7LuUY9/MuTv8ACh6e5/T3rzPO8lxX0ovbOfLPk+KMzLIXcnJNedGNIyA5HwNZPov7mvW8XDSUmB61/CHss1vwZuMXUeLm/H3OfwwA7H/5EZ9gPOuyrOjGuKs3jcO9KfE05FbcOH8opcQsqbhw/lpUOypuGjqgo4hyKn4an8lLigsqbhaH8IoodlD8JT+UUUg5MGk4Mh/BS4oOQLLwVDnC0OCHyYFNwMb4UfSpcCuYBPwEb4U1Lxj5gE3AGBOARS4UVzA5OBzqfCTijiw5JnjyZCnR9a9CjlLY/wCrljl5VLBMkAC3i5Z2/wBaPQyMmFUk4LHlRQvZWrBXwCC370/Q+g1MacasqowccqNpUxasVRjEYI6MaI/kw9hUeHjYVTQhNdxd3KR0NVF+hlto+RpJO1ZzjewaCH3XbnWEVQkCSghs9PSulPRXZUcY5YPWqC/RBj8t+lNAV8+tV0gLIDgkHf5+VS1oaDrwa44JRnYaCfbcVC1aCR3P3cY671nLT6IfdBMKYALE5/SspzUfyxVZKSUhTpOAPPp70oQbdsE2wQszErGDnzro1EaJd3oHvSTsbYRbsQQcY3+tYzTZmzkzmfikhOPEwGfPYCqTaxo0j0cu4jDK6nmhx7iqhJNWCYx4bfZi+zzklG2z5etVOKkqYNGi4WrQWUwY7q6fqa87NGsckyXo9G7CdqpuDW1zbbvAxEygH4Tyb/8AE1HiZWouPwaYX91P2aq4/idDZ2jzSRSMyjwoCBrboM9K6X5HFWzoyRUFbPJONcVvOO8SuOI8Tl7y5m3OOSKOSqOijkK8nyPIeZ2zh7diWVRqJIqYOtjOLHgFj0q3LQwvhpaGdJI/jDa/oCa9Hx3xhQ4K5IYT8bbuXM8edKk59QK2jmXTO6UaTaMf2eUPxESycly5P+/Wmr5I5YI0rzxbgyACtXJfJ0bPlv40X7oM7DpyqHkgvY+MmGcJe5mkkuroItpBzQHeRz8KfufT3rDN5axwcq/gyzPgu9nLu5knlkeRizOcknrXhRubuT7OVAbtq8PInmfIeddeDH9WfH0P8jfsTwA9qu1Vrw86ls1+9uWH4YV5gerZCj1b0r2ox1r+Bw2z9RRwRKqpGERFAVVXYKAMAD0A2rTgb2dMA6AGjiwsi1uPKhoLK2tlPSlQWVNbL5UqCyprQeQo4jsqa0FJodlbWgzsBSoLK2sgelFBZU1gPKjiFlD8PB6U6FZQ/DR0FKh2Dvwz+mhoaZQ3CgfwilQ7PyfCCzBRso/Oulv0ZlwXG53xyFRQyvUCzH9Kar2BWzjGQNPl5mjsZ9Gm2o0l+QYSjFVAyNjvR2IHijzasdshjVLo5W90fWx8YH6VVWF2C8Ujzk43prTKi/QsQlXBG2OdNq0MOVwyg7kHnWMoNCIt4iRj29KcGNFBBNaehlbjbmaBUUnz5flV2q2MkhIcHpRdgNIV721mTmVGtdvKsZadlNaslbx6iDnAArGToy12iyd9AycAVMIX2OgeMSXMgVBn9hXQ2oofSCUiWIYH1xzqG7TbEmccZ/1o2B9EcEZ86ib9EHLMauIAZzmTf6051GKNfQx43HidXA55B+tcnizttL5ITFGSrDBr0OykzU8E4i09s9vJ8Zxg+eK5fIxuUGo9ikmaXg8+kxOTkA4YenI/ka8jFP6eZW9PRCb7QBxK47+7YI2qKIkKR18zV+RK3xXSNcuR5GQZ9sVyJW7RmREZbA8/Sqc6WhJEp1xpUUsbvYy+2XE8APJgw/8AtNelgl6Lh+5AnaIiHhcm3ichB+/5CtopWdud1GvkC7MQBo5nPooqpezHCt2Ovs4PQVFM6S+2sTNMkcSqXbYZ5DzJPkNzQ0TKXFWwq8lRRHb23/p48hTyLHqx9/0wK8fNm+rK10ujglLm+TF8p+LB2G1TBCB3JSEk83/IV7XiYuMb9sT0ansbfycFtpZYiyTXGCxU48I5D9TW88lSpHXix/bb9mpj7bX6HadtuhNT9R/JpwDIv4gX6AeJWq1lol4wu3/iXepnvURxn2xVrM/YvpDGD+J0f/Xtl+Rp/WT7QvptDGD+I3C5B97G6Gn9WDFwkg2Dttwab/q6fc01KD9i4y+A+LtFwqXlcp9aacX7FsITiXDpfguY8+9FJ+wtlyvbyDwSofY0+AciWhGzpdTj1pODDkcNuDvnPtRxY+RB7XNLiFlZtPSlxCyBtBnAHrRxCz8S2zMx8PLHOtG60OrO3D63zk7bUmBFsAeE7e9D+R0Vr4mJK89hnrQwLiWxgkeHypXWhHFByF9fpRaHXwX2q5jlU9GNVG2jjyfuoEde7lB5CrVgqZVekMh5Gjsa0xOw3J50/RoWQSYBXcjnUTWgLiSGByNqSXoRyUdRVLYWVNyOBn3oQylhjNXsDhG/z8qaJsZcOl0TIeh2I86ymkXaDIMLGzHYA+fKuWVuRC7ATmaXP4eldS+1DoY8JUC5VBndSPfauZtykmRZKQYZvLNa0BRKdsenWhDK4/fkaUloTLeEjPEIs8tdKb0X6NHxO2zwu/dxuksSqfcsT+WK4/Gjx5P8mXbozEq+fyrsizQlaTPBMrAnwnNaP5HZtLabvLcNFsJRz8vOvF83DwnzXTIaBnbD6Ryrm9WBONu8k9AKX7UJbGES58XyFc0n6HeylzqlYjcCt8a0AZCpM0XoTz9jXZ48v7z+hcP3IRdr5d7WAern9B+9dsFqzfPLaiMOzkPd8MU4+Mk70MvCtWM9OMn86k2YYWFnaEHaeZfFnmqdB89ifTArg83PX91H+pxZp8nS6QsZttW+a89L0Ygjt3hVAfi5+1dvj4+c0v8AMZEA3FyF5L+gFe2nUXIeOPKVDgEjGk4A5VzHorRwsx65FJgR1t1NIZ0Ow6mqEfd4fOpHZ8JWA5n60xaPjK3nTt9ASW4lXGljn3othotXiE64Ac0chUXx8YuU+GWRf8rEVXKhcbC4u0nEVHhvbhfZzTU36YuK+A6DtjxaMjTfzfM5q1ll8k/TQwg/iBxZMargN7qBVrNL2S8aDov4i8RHxMhPquar6rF9MMj/AIj3h5pAfXBp/VYnjR+aVYImnHLnWtewsgrb5PPG3oKQzqgyHnSYj47HYY9BRQE48s7DpyNMC3c6ccyaljCbQeOUHnqqsZy5U+QLfR4XOOVXX9DOOxdK2qI+3nT9Fp7FhxnFBocGxyM0AEB9WN6zCy5BqAU8z51L0JlLppO3KtQKCPFzxtTT9AQ9frT0ARbtgA7bVL+RoYX0quESPYMoZwPPyrOMUvuBlWBGoX8R3P8AapnIzsYcI/8AXRD5VlVNE2TuRiVs1rXyNOgaTGT546UIbKoviwfapmLvRdwbe/iyR8Y/WjI3o0ZsuLxj/wArGQc5Jl1e6oR/auTHJfS//sZLUjHyLgeWD0raD2UmVtGDnG3pmnypaGnsd9nbnZ7ZjzGU361n5EPqwddrYWFXJ0OTXmQV9kvRdYjKZPNqjLpgM/hT22rjqxsqhGpx710w6DoPt18S79CfyNb+LTyf0Lx/uRju0Mvf8ckUZxHiMY9Of616KdKy8jubNfZR9zaQx/yoKH2dMFUUHWka+KaUZih3IP4m/Cvz6+gNZZcixwc2RmnxjrtgV3I0szMx1EnUSfM14btybfbOP8AUrbc+fX0rSNoKB9emJmz4nOBtyFez4mLhG12xBvC4dMRlOxfl7f7/AErfI90jswRpcmGHNZHQtHxoaAjjHlSGfU+2L+Tm/XpSA5+tAHDypgRPnmkB9nlSA+z60DIlsH3pbQvR8GP/AGpptCJd565qrA73mPKnYqOiU/zVXIKPOch+YOOZzXd7MT748joOZpNAXgaUOeQ2qf5BJkNyfnin/Aei5E0kDz51PasC9Fy48sZpd9D9MItB/wAxIMbEA/tV4u2c2dU0yviafd7c61ZiuxBKcA5FBotgLc9/qKCiHXPKnXsLLImwMEbc6mdAEIdxtvUMT2fSuBOVONLAfOnFa/gEqRXNGVAIzpO2f2NNPY31ZSRk1evQycOc7HnSdNCsY2EJlmGQSoNZN/ApSDuL2fdFZ4h922FYfyn/AFFZNEIr4U2L+Ek7Bsc/Ws5dp/kEFcQXTcOD1rofYAMh3O1KhlcWdftUz+RMu4P/AOtiwBjWDSyu6Lelo2N+S/Z5k/CsqyH5qy/rivJwTbjOH5TJrZlHGV9xyrui9iIxjIGKTYdFkLm3uklXoc1pCVlDjiTDKld9W6+xrh4cZtEPsLshhVrkyOm6GGyHEZHrsa5ktjJW4wTjoK3tqLQBqEJlzsEQsfpW/hq5t/gvG/vTMPw9TecUDNuZJNX1Nek/SFFts3yxSNC8qIzRRnDOB4VzyyeQ+dJW+jvbS7YJNxu2biUPC7VBcQrG5kmDFfGQPGvmBjG/QVl5OKDg3P11/wAnFO5XNlMrZIzzx9K8NIz7A521HQB8XP0FdmDF9SSXoLIQobq4WNNk5ZHQdTXtJ8V/sVCPJ0h6FAACjAAwBWPs9DRw0h9kTyoA+3xSYEdzzp/yI+/SgZ8fypICO9OgONyo2K6PgM4pd9gRIyKNAQI32pdMf8HBnlv8qAO5+lMCBOPOpYI+1elFgYAgsSBsBzNeozmLYkIwfOp7Y+iUh6bCgNklGSSM46UvwBei5O+221TYdF4XxCkxlq+CWNz0Ok+x/wBcURlUkzLNHRPiK/dZI+VdT62cj7Mvd+Fjil6NlQCaL2URPn6U+wPkJBBHL0oq9CCo89OfnWUq9g/kruxlUYZ22qod0hWWW0oZDkDOMMp6inJcRshcRd2QR8LfCaItMVn0IywPlvihjRoeGwhEXP8AvNZpezKbt0xozR6jFMAYZfCwoaXRIllgaw4oInOcMCrY2YdDWE7iU6aC+LDFy3pWrYR1sXORgigq7K4RljvvUZNkvRbwkgXkR/qHOjIVJ+zbhO94fcxDJ1QsR6lfEP0rw8Uv75r5AyPMA4xyr0V2T7IxEDAxz6U5Id/JORdSHbaoTqVsEw/WZbK1YndSUPy3/eqzR3yBjK1OFHoM15mTsFsKkbKryzWMNvYwi1HnyzW0k1ED7i8hi4VdFN2dO7X1LED9K38Jdv0NOjO2Drw371AktzyUkZVT6D8R/wB711SyO6iJSfou4rdXbw6r2ZmlI0xwgBQgPmBt5bVUZW1Gy7tl3Z7h720bzTgd7KPxcwv+tcXneQpf3cekEnehhcNgEmuKKvRFAUj4XOfG/wCQr2vGxcY/liG/DLfuYAzDDvufQdBWs3bpHbhhxj+WF8/SoNrs+35cxT6CzhFICLDNKgOAU6C/k+0+dIZ8BzyKYrOEDpSAgQaAPhQHo+PI0UBAj6VLWwI48qdAiBGOVTuhkTnnSoZ0nbH71Viow0MbsdyNPWvSbOVljMAcDYCkUV7sdvrSbGrL0Q7DnjFJ9gqCVUY386kf5L1XxBuvSgRPuwyFTtqGKn0J77OvmW03+MbMPUV1QfKKZwyjxdGY4guCd6frRcBc3XGdjTRZDlv/AK0AffP8qYBFu22Kzkq2DLZEDxsu3LIqE6EARv3MoIzzwRjpW/4GxooEsbR5BDbqfX/e1Y3TsllVohMmnGP2qpMZpLcYto2I3Y5oRhJ7LOJBjASvxKc0pKh3sCvbgT2lpIf8RCUPtWM1or2W8VbU6t0ZQfyoi7iqBWLWPh/tVDsjBjXvjGc+dRkTYnpk+GnF0hP8wFPKrLl0b6zcLKmvkGwfY/8AevnuXHIpP5JZjtGFxnYbV6a/cSVRczvVzeqD8hIXOV5Cse0HQRZbwzRHcghx8uf5GtZSbhZemMrc+FjvvtXmTEgpz4gDms4bex/gLthtv7860yriqYdi/j9yS0drHnOe8b9AP1NdWGLjD8sl7F0Mi2xBTDTfzDcJ7evrWnB/9pSTGPD+H65BdXW/VVP6mufPnUF9PH37Y260g+V8KWbmf94rgUbYgCVu8c5PhXdvfyr0PEw8ny9IWyfDYTdXZd/gTxMOnoK9RtxV+2bYocn+B8M5yayOw4OVAH2AKQEetFDsiw25bUgI5pgcJz51LA5k0D6O74qrEc96QHBjOOlCA+IpiImk0Mgd/ejYEW26VIEcbYzTQzh+VDsRjB19K9FoworHiG/TaperAvRAQOdEiqLYwPzNR10HwXY8WOmcUVphHZeo60pEouUDu9XUCnQ10QAxclR8Lrkj2OK0xKrOfyUtMz3F0A7zHQ1o9Myh8CZhhzVGtFZOR7UCPsU6saRKA7gdKTRD/bYWjHAO2SM1g3cqBIBulCzHHma6I/tQ2GWDExA53XlWeT4Bdh8CAGcjYhqn2JqkOjtbxkeVP8mJObxRnPWOrlH0THqzPTsRIF6fF86yn0zoroaXniit8nnGKyxK4maADuregrX3RbRyHZyOnP8AKs8j0Q/ghZNi5XGPiqcm4lyN3GxB6dK+eybkwXRlzt9RXqNezJkYgPEPInFVOTuhlyDce9ZyVRsbYTZ/+sQeZKn2IqoP0W/kMtiQvzrhmTe6C23lXPv+dRhVvYxhb7Ln0q8/oBDxQ4uJ3/FJIyk+gwABXXi2khpFvA7eN3d3XUUGwPLnS8ybx4vt9lPSHcjFYwR1GTXkdEAMpyD6cq2hsPQEzHRGvQrrPqa93BFKCSJTtj/hkSxWcenm41E+tOXbPRxpKKoKNQy0cbbFAM+HKgCP4aQIhS9lI4xwPlRLoSKzzx86TGdWmhHx5c6EBHng9aOxneYo9kncbUwI0ARB25CjoD7Gc0n7ArPMCkP0QO4pDR//2Q==" />
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html
index 93f4c92fe..e5a6261c0 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/different-sources-for-images/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@@ -8,11 +9,11 @@
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
<p>Images</p>
- <p><img src="https://test/foo/bar/src.jpg"></img></p>
- <p><img data-original="https://test/foo/bar/data-original.jpg" src="https://test/foo/bar/data-original.jpg"></img></p>
- <p><img data-orig="https://test/foo/bar/data-orig.jpg" src="https://test/foo/bar/data-orig.jpg"></img></p>
- <p><img data-url="https://test/foo/bar/data-url.jpg" src="https://test/foo/bar/data-url.jpg"></img></p>
- <p><img data-src="https://test/foo/bar/data-src.jpg" src="https://test/foo/bar/data-src.jpg"></img></p>
+ <p><img src="https://test/foo/bar/src.jpg"></p>
+ <p><img data-original="https://test/foo/bar/data-original.jpg" src="https://test/foo/bar/data-original.jpg"></p>
+ <p><img data-orig="https://test/foo/bar/data-orig.jpg" src="https://test/foo/bar/data-orig.jpg"></p>
+ <p><img data-url="https://test/foo/bar/data-url.jpg" src="https://test/foo/bar/data-url.jpg"></p>
+ <p><img data-src="https://test/foo/bar/data-src.jpg" src="https://test/foo/bar/data-src.jpg"></p>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-images.json
new file mode 100644
index 000000000..9a202b58e
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-images.json
@@ -0,0 +1,5 @@
+[
+ "https:\/\/aem.dropbox.com\/cms\/content\/dam\/dropbox\/tech-blog\/en-us\/2020\/11\/atf\/diagrams\/Techblog-ATF-Social.png",
+ "http:\/\/fakehost\/cms\/content\/dam\/dropbox\/tech-blog\/en-us\/2020\/11\/atf\/diagrams\/Techblog-ATF-720x844px-1.png",
+ "http:\/\/fakehost\/cms\/content\/dam\/dropbox\/tech-blog\/en-us\/2020\/11\/atf\/diagrams\/Techblog-ATF-720x225px-2.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-metadata.json
new file mode 100644
index 000000000..d3d991323
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Arun Sai Krishnan",
+ "Direction": null,
+ "Excerpt": "I joined Dropbox not long after graduating with a Master\u2019s degree in computer science. Aside from an internship, this was my first big-league engineering job. My team had already begun designing a critical internal service that most of our software would use: It would handle asynchronous computing requests behind the scenes, powering everything from dragging a file into a Dropbox folder to scheduling a marketing campaign.",
+ "Image": "https:\/\/aem.dropbox.com\/cms\/content\/dam\/dropbox\/tech-blog\/en-us\/2020\/11\/atf\/diagrams\/Techblog-ATF-Social.png",
+ "Title": "How we designed Dropbox\u2019s ATF - an async task framework",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected.html
new file mode 100644
index 000000000..e15acfa48
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/expected.html
@@ -0,0 +1,527 @@
+<div>
+ <div>
+ <p>
+ I joined Dropbox not long after graduating with a Master’s degree in computer science. Aside from an internship, this was my first big-league engineering job. My team had already begun designing a critical internal service that most of our software would use: It would handle asynchronous computing requests behind the scenes, powering everything from dragging a file into a Dropbox folder to scheduling a marketing campaign.
+ </p>
+ <p>
+ This Asynchronous Task Framework (ATF) would replace multiple bespoke async systems used by different engineering teams. It would reduce redundant development, incompatibilities, and reliance on legacy software. There were no open-source projects or buy-not-build solutions that worked well for our use case and scale, so we had to create our own. ATF is both an important and interesting challenge, though, so we were happy to design, build and deploy our own in-house service.
+ </p>
+ <p>
+ ATF not only had to work well, it had to work well at scale: It would be a foundational building block of Dropbox infrastructure. It would need to handle 10,000 async tasks per second from the start, and be architected for future growth. It would need to support nearly 100 unique async task types from the start, again with room to grow. There were at least two dozen engineering teams that would want to use it for entirely different parts of our codebase, for many products and services.&nbsp;
+ </p>
+ <p>
+ As any engineer would, we Googled to see what other companies with mega-scale services had done to handle async tasks. We were disappointed to find little material published by engineers who built supersized async services.
+ </p>
+ <p>
+ Now that ATF is deployed and currently serving 9,000 async tasks scheduled per second and in use by 28 engineering teams internally, we’re glad to fill that information gap. We’ve documented Dropbox ATF thoroughly, as a reference and guide for the engineering community seeking their own async solutions.
+ </p>
+ </div>
+ <div>
+ <p id="introduction">
+ <h2>
+ Introduction
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ Scheduling asynchronous tasks on-demand is a critical capability that powers many features and internal platforms at Dropbox. Async Task Framework (ATF) is the infrastructural system that supports this capability at Dropbox through a callback-based architecture. ATF enables developers to define callbacks, and schedule tasks that execute against these pre-defined callbacks.
+ </p>
+ <p>
+ Since its introduction over a year ago, ATF has gone on to become an important building block in the Dropbox infrastructure, used by nearly 30 internal teams across our codebase. It currently supports 100+ use cases which require either immediate or delayed task scheduling.&nbsp;
+ </p>
+ </div>
+ <div>
+ <p id="glossary">
+ <h2>
+ Glossary
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ Some basic terms repeatedly used in this post, defined as used in the context of this discussion.
+ </p>
+ <p>
+ <b>Lambda:</b> A callback implementing business logic.
+ </p>
+ <p>
+ <span><b>Task:</b> Unit of execution of a lambda. Each asynchronous job scheduled with ATF is a task.</span>
+ </p>
+ <p>
+ <span><b>Collection:</b> A labeled subset of tasks belonging to a lambda. If <span>send email</span> is implemented as a lambda, then <span>password reset email</span> and <span>marketing email</span> would be collections.</span>
+ </p>
+ <p>
+ <span><b>&nbsp;Priority:</b> Labels defining priority of execution of tasks within a lambda.&nbsp;</span>
+ </p>
+ </div>
+ <div>
+ <p id="features">
+ <h2>
+ Features
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ <b>Task scheduling</b><br>
+ Clients can schedule tasks to execute at a specified time. Tasks can be scheduled for immediate execution, or delayed to fit the use case.
+ </p>
+ <p>
+ <b>Priority based execution</b><br>
+ Tasks should be associated with a priority. Tasks with higher priority should get executed before tasks with a lower priority once they are ready for execution.
+ </p>
+ <p>
+ <b>Task gating</b><br>
+ ATF enables the the gating of tasks based on lambda, or a subset of tasks on a lambda based on collection. Tasks can be gated to be completely dropped or paused until a suitable time for execution.
+ </p>
+ <p>
+ <b>Track task status</b><br>
+ Clients can query the status of a scheduled task.
+ </p>
+ </div>
+ <div>
+ <p id="system-guarantees">
+ <h2>
+ System guarantees
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ <b>At-least once task execution<br></b> The ATF system guarantees that a task is executed at least once after being scheduled. Execution is said to be complete once the user-defined callback signals task completion to the ATF system.
+ </p>
+ <p>
+ <b>No concurrent task execution<br></b> The ATF system guarantees that at most one instance of a task will be actively executing at any given in point. This helps users write their callbacks without designing for concurrent execution of the same task from different locations.
+ </p>
+ <p>
+ <b>Isolation<br></b> Tasks in a given lambda are isolated from the tasks in other lambdas. This isolation spans across several dimensions, including worker capacity for task execution and resource use for task scheduling. Tasks on the same lambda but different priority levels are also isolated in their resource use for task scheduling.
+ </p>
+ <p>
+ <b>Delivery latency<br></b> 95% of tasks begin execution within five seconds from their scheduled execution time.
+ </p>
+ <p>
+ <b>High availability for task scheduling<br></b> The ATF service is 99.9% available to accept task scheduling requests from any client.
+ </p>
+ </div>
+ <div>
+ <p id="-lambda-requirements">
+ <h2>
+ Lambda requirements
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ Following are some restrictions we place on the callback logic (lambda):
+ </p>
+ <p>
+ <b>Idempotence</b><br>
+ A single task on a lambda can be executed multiple times within the ATF system. Developers should ensure that their lambda logic and correctness of task execution in clients are not affected by this.
+ </p>
+ <p>
+ <b>Resiliency</b><br>
+ Worker processes which execute tasks might die at any point during task execution. ATF retries abruptly interrupted tasks, which could also be retried on different hosts. Lambda owners must design their lambdas such that retries on different hosts do not affect lambda correctness.
+ </p>
+ <p>
+ <b>Terminal state handling<br></b> ATF retries tasks until they are signaled to be complete from the lambda logic. Client code can mark a task as successfully completed, fatally terminated, or retriable. It is critical that lambda owners design clients to signal task completion appropriately to avoid misbehavior such as infinite retries.&nbsp;
+ </p>
+ </div>
+ <div>
+ <p id="architecture">
+ <h2>
+ Architecture
+ </h2>
+ </p>
+ </div>
+ <div>
+ <figure>
+ <img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x844px-1.png" aria-hidden="false" alt="Async Task Framework (ATF) [Fig 1]" height="1688" width="1440">
+ <figcaption>
+ Async Task Framework (ATF) [Fig 1]
+ </figcaption>
+ </figure>
+ </div>
+ <div>
+ <p>
+ In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.)&nbsp;In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.) Dropbox <a href="https://dropbox.tech/infrastructure/courier-dropbox-migration-to-grpc">uses gRPC</a> for remote calls and our in-house <a href="https://dropbox.tech/infrastructure/reintroducing-edgestore">Edgestore</a> to store tasks.
+ </p>
+ <p>
+ ATF consists of the following components:&nbsp;
+ </p>
+ <ul>
+ <li>Frontend
+ </li>
+ <li>Task Store
+ </li>
+ <li>Store Consumer
+ </li>
+ <li>Queue
+ </li>
+ <li>Controller
+ </li>
+ <li>Executor
+ </li>
+ <li>Heartbeat and Status Controller (HSC)<span><br></span>
+ </li>
+ </ul>
+ <p>
+ <span><b>Frontend</b><br>
+ This is the service that schedules requests via an RPC interface. The frontend accepts RPC requests from clients and schedules tasks by interacting with ATF’s task store described below.</span><br>
+ </p>
+ <p>
+ <b>Task Store<br></b> ATF tasks are stored in and triggered from the task store. The task store could be any generic data store with indexed querying capability. In ATF’s case, We use our in-house metadata store Edgestore to power the task store. More details can be&nbsp;found in the <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">D</a><a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">ata</a> <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">M</a><a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">odel</a> section below.
+ </p>
+ <p>
+ <b>Store Consumer<br></b> The Store Consumer is a service that periodically polls the task store to find tasks that are ready for execution and pushes them onto the right queues, as described in the queue section below. These could be tasks that are newly ready for execution, or older tasks that are ready for execution again because they either failed in a retriable way on execution, or were dropped elsewhere within the ATF system.&nbsp;
+ </p>
+ <p>
+ Below is a simple walkthrough of the Store Consumer’s function:&nbsp;
+ </p>
+ </div>
+ <div>
+ <pre><code>repeat every second:
+ 1. poll tasks ready for execution from task store
+ 2. push tasks onto the right queues
+ 3. update task statuses</code></pre>
+ </div>
+ <div>
+ <p>
+ The Store Consumer polls tasks that failed in earlier execution attempts. This helps with the at-least-once guarantee that the ATF system provides. More details on how the Store Consumer polls new and previously failed tasks is presented in the <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=342792671048375002388848&amp;h2=Lifecycle-of-a-task">Lifecycle of a task</a> section below.
+ </p>
+ <p>
+ <b>Queue<br></b> ATF uses AWS <a href="https://aws.amazon.com/sqs/">Simple Queue Service</a> (SQS) to queue tasks internally. These queues act as a buffer between the Store Consumer and Controllers (described below). Each <span>&lt;lambda, priority&gt;</span> &nbsp;pair gets a dedicated SQS queue. The total number of SQS queues used by ATF is <span>#lambdas x #priorities</span>.
+ </p>
+ <p>
+ <b>Controller<br></b> Worker hosts are physical hosts dedicated for task execution. Each worker host has one controller process responsible for polling tasks from SQS queues in a background thread, and then pushing them onto process local buffered queues. The Controller is only aware of the lambdas it is serving and thus polls only the limited set of necessary queues.&nbsp;
+ </p>
+ <p>
+ The Controller serves tasks from its process local queue as a response to <span>NextWork</span> RPCs. This is the layer where execution level task prioritization occurs. The Controller has different process level queues for tasks of different priorities and can thus prioritize tasks in response to <span>NextWork</span> RPCs.
+ </p>
+ <p>
+ <b>Executor<br></b> The Executor is a process with multiple threads, responsible for the actual task execution. Each thread within an Executor process follows this simple loop:
+ </p>
+ </div>
+ <div>
+ <pre><code>while True:
+ w = get_next_work()
+ do_work(w)</code></pre>
+ </div>
+ <div>
+ <p>
+ Each worker host has a single Controller process and multiple executor processes. Both the Controller and Executors work in a “pull” model, in which active loops continuously long-poll for new work to be done.
+ </p>
+ <p>
+ <b>Heartbeat and Status Controller (HSC)</b><br>
+ The HSC serves RPCs for claiming a task for execution (<span>ClaimTask</span>), setting task status after execution (<span>SetResults</span>) and heartbeats during task execution (<span>Heartbeat</span>). <span>ClaimTask</span> requests originate from the Controllers in response to <span>NextWork</span> requests. <span>Heartbeat</span> and <span>SetResults</span> requests originate from executor processes during and after task execution. The HSC interacts with the task store to update the task status on the kind of request it receives.
+ </p>
+ </div>
+ <div>
+ <p id="data-model">
+ <h2>
+ Data model
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ ATF uses our in-house metadata store, Edgestore, as a task store. Edgestore objects can be Entities or Associations (<span>assoc</span>), each of which can have user-defined attributes. Associations are used to represent relationships between entities. Edgestore supports indexing only on attributes of associations.
+ </p>
+ <p>
+ Based on this design, we have two kinds of ATF-related objects in Edgestore. The ATF association stores scheduling information, such as the next scheduled timestamp at which the Store Consumer should poll a given task (either for the first time or for a retry). The ATF entity stores all task related information that is used to track the task state and payload for task execution. We query on associations from the Store Consumer in a pull model to pick up tasks ready for execution.
+ </p>
+ </div>
+ <div>
+ <p id="lifecycle-of-a-task">
+ <h2>
+ Lifecycle of a task
+ </h2>
+ </p>
+ </div>
+ <div>
+ <ol>
+ <li>Client performs a <span>Schedule</span> RPC call to <b>Frontend</b> with task information, including execution time.&nbsp;
+ </li>
+ <li>Frontend creates Edgestore <span>entity</span> and <span>assoc</span> for the task.&nbsp;
+ </li>
+ <li>When it is time to process the task, <b>Store Consumer</b> pulls the task from <b>Edgestore</b> and pushes it to a related <b>SQS</b> queue.&nbsp;
+ </li>
+ <li>
+ <b>Executor</b> makes <span>NextWork</span> RPC call to <b>Controller</b>, which pulls tasks from the <b>SQS</b> queue, makes a <span>ClaimTask</span> RPC to the HSC and then returns the task to the <b>Executor</b>.&nbsp;
+ </li>
+ <li>
+ <b>Executor</b> invokes the callback for the task. While processing, <b>Executor</b> performs <span>Heartbeat</span> RPC calls to <b>Heartbeat and Status Controller (HSC)</b>. Once processing is done, <b>Executor</b> performs <span>TaskStatus</span> RPC call to <b>HSC</b>.&nbsp;
+ </li>
+ <li>Upon getting <span>Heartbeat</span> and <span>TaskStatus</span> RPC calls, <b>HSC</b> updates the <b>Edgestore</b> entity and <span>assoc</span>.
+ </li>
+ </ol>
+ <p>
+ Every state update in the lifecycle of a task is accompanied by an update to the next trigger timestamp in the <span>assoc</span>. This ensures that the Store Consumer pulls the task again if there is no change in state of the task within the next trigger timestamp. This helps ATF achieve its at-least-once delivery guarantee by ensuring that no task is dropped.
+ </p>
+ <p>
+ Following are the task entity and association states in ATF and their corresponding timestamp updates:
+ </p>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <td>
+ <p>
+ <b>Entity status</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>Assoc status</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>next trigger timestamp in Assoc</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>Comment</b>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>new</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>new</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>scheduled_timestamp</span> of the task
+ </p>
+ </td>
+ <td>
+ <p>
+ Pick up new tasks that are ready.&nbsp;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>enqueued</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>enqueued_timestamp</span> + <span>enqueue_timeout</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue task if it has been in <span>enqueued</span> state for too long. This can happen if the queue loses data or the controller goes down after polling the queue and before the task is claimed.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>claimed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>claimed_timestamp</span> + <span>claim_timeout</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue if task is claimed but never transfered to <span>processing</span>. This can happen if Controller is down after claiming a task. Task status is changed to <span>enqueued</span> after re-enqueue.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>processing</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>heartbeat_timestamp</span> + <span>heartbeat_timeout</span>`
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue if task hasn’t sent <span>heartbeat</span> for too long. This can happen if Executor is down. Task status is changed to <span>enqueued</span> after re-enqueue.&nbsp;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>retriable failure</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ started
+ </p>
+ </td>
+ <td>
+ <p>
+ compute <span>next_timestamp</span> according to backoff logic
+ </p>
+ </td>
+ <td>
+ <p>
+ Exponential backoff for tasks with retriable failure.&nbsp;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>success</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>completed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ N/A
+ </p>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span>fatal_failure</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span>completed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ N/A
+ </p>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ The store consumer polls for tasks based on the following query:
+ </p>
+ <p>
+ <span>assoc_status= &amp;&amp; next_timestamp&lt;=time.now()<br></span>
+ </p>
+ <p>
+ Below is the state machine that defines task state transitions:&nbsp;<br>
+ </p>
+ </div>
+ <div>
+ <figure>
+ <img src="http://fakehost/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x225px-2.png" aria-hidden="false" alt="Task State Transitions [Fig 2]" height="450" width="1440">
+ </figure>
+ </div>
+ <div>
+ <p id="-achieving-guarantees">
+ <h2>
+ Achieving guarantees
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ <b>At-least-once task execution<br></b> At-least-once execution is guaranteed in ATF by retrying a task until it completes execution (which is signaled by a <span>Success</span> or a <span>FatalFailure</span> state). All ATF system errors are implicitly considered retriable failures, and lambda owners have an option of marking tasks with a <span>RetriableFailure</span> state. Tasks might be dropped from the ATF execution pipeline in different parts of the system through transient RPC failures and failures on dependencies like Edgestore or SQS. These transient failures at different parts of the system do not affect the at-least-once guarantee, though, because of the system of timeouts and re-polling from Store Consumer.
+ </p>
+ <p>
+ <b>No concurrent task execution<br></b> Concurrent task execution is avoided through a combination of two methods in ATF. First, tasks are explicitly claimed through an exclusive task state (<span>Claimed</span>) before starting execution. Once the task execution is complete, the task status is updated to one of <span>Success</span>, <span>FatalFailure</span> or <span>RetriableFailure</span>. A task can be claimed only if its existing task state is <span>Enqueued</span> (retried tasks go to the <span>Enqueued</span> state as well once they are re-pushed onto SQS).
+ </p>
+ <p>
+ However, there might be situations where once a long running task starts execution, its heartbeats might fail repeatedly yet the task execution continues. ATF would retry this task by polling it from the store consumer because the heartbeat timeouts would’ve expired. This task can then be claimed by another worker and lead to concurrent execution.&nbsp;<br>
+ </p>
+ <p>
+ To avoid this situation, there is a termination logic in the Executor processes whereby an Executor process terminates itself as soon as three consecutive heartbeat calls fail. Each heartbeat timeout is large enough to eclipse three consecutive heartbeat failures. This ensures that the Store Consumer cannot pull such tasks before the termination logic ends them—the second method that helps achieve this guarantee.
+ </p>
+ <p>
+ <b>Isolation<br></b> Isolation of lambdas is achieved through dedicated worker clusters, dedicated queues, and dedicated per-lambda scheduling quotas. In addition, isolation across different priorities within the same lambda is likewise achieved through dedicated queues and scheduling bandwidth.
+ </p>
+ <p>
+ <b>Delivery latency<br></b> ATF use cases do not require ultra-low task delivery latencies. Task delivery latencies on the order of a couple of seconds are acceptable. Tasks ready for execution are periodically polled by the Store Consumer and this period of polling largely controls the task delivery latency. Using this as a tuning lever, ATF can achieve different delivery latencies as required. Increasing poll frequency reduces task delivery latency and vice versa. Currently, we have calibrated ATF to poll for ready tasks once every two seconds.
+ </p>
+ </div>
+ <div>
+ <p id="ownership-model">
+ <h2>
+ Ownership model
+ </h2>
+ </p>
+ </div>
+ <p>
+ ATF is designed to be a self-serve framework for developers at Dropbox. The design is very intentional in driving an ownership model where lambda owners own all aspects of their lambdas’ operations. To promote this, all lambda worker clusters are owned by the lambda owners. They have full control over operations on these clusters, including code deployments and capacity management. Each executor process is bound to one lambda. Owners have the option of deploying multiple lambdas on their worker clusters simply by spawning new executor processes on their hosts.
+ </p>
+ <div>
+ <p id="-extending-atf">
+ <h2>
+ Extending ATF
+ </h2>
+ </p>
+ </div>
+ <div>
+ <p>
+ As described above, ATF provides an infrastructural building block for scheduling asynchronous tasks. With this foundation established, ATF can be extended to support more generic use cases and provide more features as a framework. Following are some examples of what could be built as an extension to ATF.&nbsp;
+ </p>
+ <p>
+ <b>Periodic task execution<br></b> Currently, ATF is a system for one-time task scheduling. Building support for periodic task execution as an extension to this framework would be useful in unlocking new capabilities for our clients.
+ </p>
+ <p>
+ <b>Better support for task chaining<br></b> Currently, it is possible to chain tasks on ATF by scheduling a task onto ATF that then schedules other tasks onto ATF during its execution. Although it is possible to do this in the current ATF setup, visibility and control on this chaining is absent at the framework level. Another natural extension here would be to better support task chaining through framework-level visibility and control, to make this use case a first class concept in the ATF model.
+ </p>
+ <p>
+ <b>Dead letter queues for misbehaving tasks<br></b> One common source of maintenance overhead we observe on ATF is that some tasks get stuck in infinite retry loops due to occasional bugs in lambda logic. This requires manual intervention from the ATF framework owners in some cases where there are a large number of tasks stuck in such loops, occupying a lot of the scheduling bandwidth in the system. Typical manual actions in response to such a situation include pausing execution of the lambdas with misbehaving tasks, or dropping them outright.
+ </p>
+ <p>
+ One way to reduce this operational overhead and provide an easy interface for lambda owners to recover from such incidents would be to create dead letter queues filled with such misbehaving tasks. The ATF framework could impose a maximum number of retries before tasks are pushed onto the dead letter queue. We could create and expose tools that make it easy to reschedule tasks from the dead letter queue back into the ATF system, once the associated lambda bugs are fixed.<br>
+ </p>
+ </div>
+ <div>
+ <p id="conclusion">
+ <h2>
+ Conclusion
+ </h2>
+ </p>
+ </div>
+ <p>
+ We hope this post helps engineers elsewhere to develop better async task frameworks of their own. Many thanks to everyone who worked on this project: Anirudh Jayakumar, Deepak Gupta, Dmitry Kopytkov, Koundinya Muppalla, Peng Kang, Rajiv Desai, Ryan Armstrong, Steve Rodrigues, Thomissa Comellas, Xiaonan Zhang and Yuhuan Du.<br>
+ &nbsp;
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/source.html
new file mode 100644
index 000000000..83f2b05bc
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/dropbox-blog/source.html
@@ -0,0 +1,868 @@
+<!DOCTYPE html>
+<html lang="en" xml:lang="en" data-cms-lang="en-us" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta charset="utf-8" />
+ <title>
+ How we designed Dropbox ATF: an async task framework - Dropbox
+ </title>
+ <meta name="data-tags" content="Async,Edgestore,Infrastructure,Task Scheduling" />
+ <meta name="data-tagTaxonomy" content="Async; Edgestore; Infrastructure; Task Scheduling;" />
+ <meta name="page-id" content="infrastructure-asynchronous-task-scheduling-at-dropbox" />
+ <meta name="topic" content="Infrastructure" />
+ <meta name="publishDate" content="2020-11-11 12:00:00.000-0600" />
+ <meta name="author" content="Arun Sai Krishnan" />
+ <link rel="canonical" href="https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" />
+ <link rel="icon" href="https://cfl.dropboxstatic.com/static/images/favicon-vflUeLeeY.ico" type="image/x-icon" />
+ <meta property="og:url" content="https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" />
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content="How we designed Dropbox’s ATF - an async task framework" />
+ <meta property="og:image" content="https://aem.dropbox.com/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-Social.png" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta content="width=device-width,initial-scale=1.0,user-scalable=no" name="viewport" />
+ <link rel="alternate" hreflang="en-us" href="https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" /><!-- /* Enable rebrand styles */
+<sly data-sly-use.inheritUtil="com.dropbox.aem.common.models.utils.InheritanceUtilUse"
+ data-sly-test.pageStyle="" /> -->
+ <link rel="stylesheet" href="/cms/etc.clientlibs/settings/wcm/designs/dropbox-common/clientlib-cms-common.757d73acbd22d3e2bf4eeb953c16c4d5.css" type="text/css" />
+ <link rel="stylesheet" href="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-all.fc2ae6db413129b3901dd5a89e64f347.css" type="text/css" /><!--Knotch Integration should be added in header-->
+
+ <script src="https://www.knotch-cdn.com/unit/latest/knotch.min.js" data-account="33c0d4ac-b5bc-4168-a95b-e963ec65974d" async="async"></script>
+ <link rel="stylesheet" href="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content.22c503f9a8a000fceab6a403af5ce96f.css" type="text/css" />
+ <style>
+ <![CDATA[
+ body.stormcrow-animate{opacity:1;}
+ ]]>
+ </style>
+ </head>
+ <body class="tech-blog-article-page__page stormcrow-animate" data-article-uuid="d4052e45-cbcb-4ebb-b834-eb377ab543e8">
+ <input type="hidden" id="wcmRunmode" name="wcmRunmode" value="publish,prod" />
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var attr = "tealium_event$cms".split(",");
+
+ var utag_data = {}
+ attr.forEach(function (item) {
+ if (item && item.indexOf("$") > -1)
+ utag_data[item.split("$")[0]] = item.split("$")[1];
+ })
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ (function (a, b, c, d) {
+ a = "\/\/tags.tiqcdn.com\/utag\/dropbox\/tech\u002Dblog\/prod\/utag.js";
+ b = document;
+ c = 'script';
+ d = b.createElement(c);
+ d.src = a;
+ d.type = 'text/java' + c;
+ d.async = true;
+ a = b.getElementsByTagName(c)[0];
+ a.parentNode.insertBefore(d, a);
+ })();
+ //]]>
+ </script>
+ <header class="dr-header">
+ <div class="dr-header__sticky-container">
+ <section class="dr-header__section dr-flex dr-flex--align-center dr-padding-right-40 dr-padding-left-40 dr-header__sticky-content-container dr-header__sticky-content-container--opened dr-container--surface">
+ <div class="dr-flex-1">
+ <a class="dr-link dr-link--no-underline dr-link--no-underline-hover dr-typography-t1" href="https://dropbox.tech/">Dropbox.Tech</a>
+ </div><button class="dr-header__item dr-nav__menu-toggle-button dr-button dr-hide-from-md dr-flex dr-flex-align-center dr-flex-justify-center" data-dr-tooltip="Menu" data-dr-tooltip-theme="white"><svg viewbox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg" class="dr-width-100 dr-height-100">
+ <rect x="0.501831" y="8" width="28" height="2" fill="white"></rect>
+ <rect x="0.500977" y="18" width="28" height="2" fill="white"></rect></svg></button>
+ <nav class="dr-show-block-from-md dr-nav__nav">
+ <button class="dr-button dr-nav__menu-close-button"><svg width="20" height="20" viewbox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.2875 2.15983L17.6683 0.566406L9.82597 8.28403L2.33211 0.909344L0.71294 2.50277L8.2068 9.87746L0.666992 17.2974L2.28617 18.8908L9.82597 11.4709L17.7143 19.2337L19.3334 17.6403L11.4451 9.87746L19.2875 2.15983Z" fill="white"></path></svg></button>
+ <ul class="dr-unstyled-list dr-typography-t2 dr-flex dr-nav__nav-list">
+ <li class="dr-header__item dr-position-relative dr-header__item--with-subnav dr-header__list-item">
+ <button class="dr-button dr-button--link dr-header__link--with-subnav">Topics</button>
+ <ul class="dr-unstyled-list dr-display-none dr-header__subnav dr-position-absolute dr-container--surface dr-padding-top-30 dr-padding-left-40 dr-padding-bottom-20 dr-padding-right-40 dr-font-weight-500">
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/application" class="dr-display-block dr-link dr-link--no-underline dr-container--application dr-link--primary">Application</a>
+ </li>
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/frontend" class="dr-display-block dr-link dr-link--no-underline dr-container--frontend dr-link--primary">Front End</a>
+ </li>
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/infrastructure" class="dr-display-block dr-link dr-link--no-underline dr-container--infrastructure dr-link--primary">Infrastructure</a>
+ </li>
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/machine-learning" class="dr-display-block dr-link dr-link--no-underline dr-container--machine-learning dr-link--primary">Machine Learning</a>
+ </li>
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/mobile" class="dr-display-block dr-link dr-link--no-underline dr-container--mobile dr-link--primary">Mobile</a>
+ </li>
+ <li class="dr-header__list-item dr-header__list-item--subnav">
+ <a href="https://dropbox.tech/security" class="dr-display-block dr-link dr-link--no-underline dr-container--security dr-link--primary">Security</a>
+ </li>
+ </ul>
+ </li>
+ <li class="dr-header__item dr-header__list-item">
+ <a href="https://dropbox.tech/developers" class="dr-link dr-link--no-underline dr-nav__main-category">Developers</a>
+ </li>
+ <li class="dr-header__item dr-header__list-item">
+ <a class="dr-link dr-link--no-underline dr-header__link" href="http://dropbox.com/jobs" target="_blank">Jobs</a>
+ </li>
+ </ul>
+ </nav><button data-dark-mode-switcher="" class="dr-header__item dr-header__dark-mode-switcher dr-button dr-button--link dr-cursor-pointer" data-dr-tooltip="Dark Mode" data-dr-tooltip-theme="white" type="button"><img alt="" height="30" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-all/resources/button_dark-mode-new.svg" width="30" class="dr-header__mode-image" /></button> <button class="dr-header__item dr-header__search-button dr-button dr-button--link dr-cursor-pointer" data-dr-tooltip="Search" data-dr-tooltip-theme="white" type="button"><img alt="" height="20" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-all/resources/button_search-new.svg" width="20" /></button> <!--search-result-page-only-->
+ <!--search-result-page-only-->
+ <div class="dr-header__search dr-display-none">
+ <button class="dr-header__search-close-button dr-header__item dr-button dr-button--link dr-cursor-pointer" type="button"><svg width="20" height="20" viewbox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.2875 2.15983L17.6683 0.566406L9.82597 8.28403L2.33211 0.909344L0.71294 2.50277L8.2068 9.87746L0.666992 17.2974L2.28617 18.8908L9.82597 11.4709L17.7143 19.2337L19.3334 17.6403L11.4451 9.87746L19.2875 2.15983Z" fill="white"></path></svg></button>
+ <div class="dr-header__search-form-container">
+ <form action="https://dropbox.tech/search-results.html" class="dr-header__search-form dr-container__content dr-width-100">
+ <input autocomplete="off" class="dr-header__search-input dr-typography-t3" name="q" placeholder="Search" required="true" type="text" />
+ <p class="dr-header__search-hint dr-margin-top-30 dr-margin-bottom-0 dr-typography-t5 dr-display-none">
+ // Press enter to search
+ </p>
+ </form>
+ </div>
+ </div>
+ </section>
+ </div>
+ </header>
+ <div class="dr-article-hero">
+ <div class="dr-article-hero__background-container dr-container--infrastructure">
+ <picture class="dr-article-hero__background dr-article-hero__background--regular"><source media="( max-width: 375px )" srcset="/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-375x150-light.png" /> <source media="( max-width: 376px ) and ( max-width: 1199px )" srcset="/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-1024x250-light.png" /> <img class="dr-article-hero__background-image" src="/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-1440x305-light.png" alt="" /></picture> <picture class="dr-article-hero__background dr-article-hero__background--dark"><source media="( max-width: 375px )" srcset="/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-375x150-dark.png" /> <source media="( max-width: 376px ) and ( max-width: 1199px )" srcset="/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-1024x250-dark.png" /> <img class="dr-article-hero__background-image" src="/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/header/Infrastructure-ATF-1440x305-dark.png" alt="" /></picture>
+ </div>
+ <section class="dr-container__content">
+ <h1 class="dr-display-inline dr-typography-t15 dr-container--surface dr-article-hero__title">
+ <span class="dr-article-hero__title-container dr-container--infrastructure">How we designed Dropbox ATF: an async task framework</span>
+ </h1>
+ <div class="dr-typography-no-space dr-margin-top-10 dr-margin-md-top-20">
+ <span class="dr-typography-t5">// By Arun Sai Krishnan • Nov 11, 2020</span>
+ </div>
+ </section>
+ </div>
+ <div class="dr-article-content">
+ <div class="dr-article-content__scroll-tracker-container dr-container--infrastructure">
+ <div class="dr-article-content__scroll-tracker"></div>
+ </div>
+ <div class="dr-container__content">
+ <div class="dr-article-content__content-container dr-padding-md-left-80 dr-padding-md-right-80 dr-typography-t12">
+ <nav class="dr-article-content__side-nav dr-article-content__side-nav--initial dr-typography-t5">
+ <ol class="dr-article-content__side-nav-list dr-margin-0">
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#introduction" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Introduction</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#glossary" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Glossary</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#features" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Features</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#system-guarantees" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">System guarantees</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#-lambda-requirements" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Lambda requirements</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#architecture" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Architecture</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#data-model" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Data model</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#lifecycle-of-a-task" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Lifecycle of a task</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#-achieving-guarantees" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Achieving guarantees</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#ownership-model" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Ownership model</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#-extending-atf" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Extending ATF</a>
+ </li>
+ <li class="dr-article-content__side-nav-list-item dr-margin-bottom-5">
+ <a href="#conclusion" class="dr-link dr-link--no-underline dr-article-content__side-nav-link">Conclusion</a>
+ </li>
+ </ol>
+ </nav>
+ <div class="dr-article-content__content">
+ <div class="aem-Grid aem-Grid--12 aem-Grid--default--12">
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ I joined Dropbox not long after graduating with a Master’s degree in computer science. Aside from an internship, this was my first big-league engineering job. My team had already begun designing a critical internal service that most of our software would use: It would handle asynchronous computing requests behind the scenes, powering everything from dragging a file into a Dropbox folder to scheduling a marketing campaign.
+ </p>
+ <p>
+ This Asynchronous Task Framework (ATF) would replace multiple bespoke async systems used by different engineering teams. It would reduce redundant development, incompatibilities, and reliance on legacy software. There were no open-source projects or buy-not-build solutions that worked well for our use case and scale, so we had to create our own. ATF is both an important and interesting challenge, though, so we were happy to design, build and deploy our own in-house service.
+ </p>
+ <p>
+ ATF not only had to work well, it had to work well at scale: It would be a foundational building block of Dropbox infrastructure. It would need to handle 10,000 async tasks per second from the start, and be architected for future growth. It would need to support nearly 100 unique async task types from the start, again with room to grow. There were at least two dozen engineering teams that would want to use it for entirely different parts of our codebase, for many products and services.&#160;
+ </p>
+ <p>
+ As any engineer would, we Googled to see what other companies with mega-scale services had done to handle async tasks. We were disappointed to find little material published by engineers who built supersized async services.
+ </p>
+ <p>
+ Now that ATF is deployed and currently serving 9,000 async tasks scheduled per second and in use by 28 engineering teams internally, we’re glad to fill that information gap. We’ve documented Dropbox ATF thoroughly, as a reference and guide for the engineering community seeking their own async solutions.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="introduction">
+ <h2 class="dr-article-content__section-title">
+ Introduction
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ Scheduling asynchronous tasks on-demand is a critical capability that powers many features and internal platforms at Dropbox. Async Task Framework (ATF) is the infrastructural system that supports this capability at Dropbox through a callback-based architecture. ATF enables developers to define callbacks, and schedule tasks that execute against these pre-defined callbacks.
+ </p>
+ <p>
+ Since its introduction over a year ago, ATF has gone on to become an important building block in the Dropbox infrastructure, used by nearly 30 internal teams across our codebase. It currently supports 100+ use cases which require either immediate or delayed task scheduling.&#160;
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="glossary">
+ <h2 class="dr-article-content__section-title">
+ Glossary
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ Some basic terms repeatedly used in this post, defined as used in the context of this discussion.
+ </p>
+ <p>
+ <b>Lambda:</b> A callback implementing business logic.
+ </p>
+ <p>
+ <span><b>Task:</b> Unit of execution of a lambda. Each asynchronous job scheduled with ATF is a task.</span>
+ </p>
+ <p>
+ <span><b>Collection:</b> A labeled subset of tasks belonging to a lambda. If <span class="dr-code">send email</span> is implemented as a lambda, then <span class="dr-code">password reset email</span> and <span class="dr-code">marketing email</span> would be collections.</span>
+ </p>
+ <p>
+ <span><b>&#160;Priority:</b> Labels defining priority of execution of tasks within a lambda.&#160;</span>
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="features">
+ <h2 class="dr-article-content__section-title">
+ Features
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ <b>Task scheduling</b><br />
+ Clients can schedule tasks to execute at a specified time. Tasks can be scheduled for immediate execution, or delayed to fit the use case.
+ </p>
+ <p>
+ <b>Priority based execution</b><br />
+ Tasks should be associated with a priority. Tasks with higher priority should get executed before tasks with a lower priority once they are ready for execution.
+ </p>
+ <p>
+ <b>Task gating</b><br />
+ ATF enables the the gating of tasks based on lambda, or a subset of tasks on a lambda based on collection. Tasks can be gated to be completely dropped or paused until a suitable time for execution.
+ </p>
+ <p>
+ <b>Track task status</b><br />
+ Clients can query the status of a scheduled task.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="system-guarantees">
+ <h2 class="dr-article-content__section-title">
+ System guarantees
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ <b>At-least once task execution<br /></b> The ATF system guarantees that a task is executed at least once after being scheduled. Execution is said to be complete once the user-defined callback signals task completion to the ATF system.
+ </p>
+ <p>
+ <b>No concurrent task execution<br /></b> The ATF system guarantees that at most one instance of a task will be actively executing at any given in point. This helps users write their callbacks without designing for concurrent execution of the same task from different locations.
+ </p>
+ <p>
+ <b>Isolation<br /></b> Tasks in a given lambda are isolated from the tasks in other lambdas. This isolation spans across several dimensions, including worker capacity for task execution and resource use for task scheduling. Tasks on the same lambda but different priority levels are also isolated in their resource use for task scheduling.
+ </p>
+ <p>
+ <b>Delivery latency<br /></b> 95% of tasks begin execution within five seconds from their scheduled execution time.
+ </p>
+ <p>
+ <b>High availability for task scheduling<br /></b> The ATF service is 99.9% available to accept task scheduling requests from any client.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="-lambda-requirements">
+ <h2 class="dr-article-content__section-title">
+ Lambda requirements
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ Following are some restrictions we place on the callback logic (lambda):
+ </p>
+ <p>
+ <b>Idempotence</b><br />
+ A single task on a lambda can be executed multiple times within the ATF system. Developers should ensure that their lambda logic and correctness of task execution in clients are not affected by this.
+ </p>
+ <p>
+ <b>Resiliency</b><br />
+ Worker processes which execute tasks might die at any point during task execution. ATF retries abruptly interrupted tasks, which could also be retried on different hosts. Lambda owners must design their lambdas such that retries on different hosts do not affect lambda correctness.
+ </p>
+ <p>
+ <b>Terminal state handling<br /></b> ATF retries tasks until they are signaled to be complete from the lambda logic. Client code can mark a task as successfully completed, fatally terminated, or retriable. It is critical that lambda owners design clients to signal task completion appropriately to avoid misbehavior such as infinite retries.&#160;
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="architecture">
+ <h2 class="dr-article-content__section-title">
+ Architecture
+ </h2>
+ </div>
+ </div>
+ <div class="image c04-image aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-image image cq-dd-image">
+ <figure class="dr-margin-0 dr-display-inline-block">
+ <img src="/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x844px-1.png" aria-hidden="false" alt="Async Task Framework (ATF) [Fig 1]" height="1688" width="1440" />
+ <figcaption class="dr-typography-t5 dr-color-ink-60">
+ Async Task Framework (ATF) [Fig 1]
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.)&#160;In this section, we describe the high-level architecture of ATF and give brief description of its different components. (See Fig. 1 above.) Dropbox <a href="https://dropbox.tech/infrastructure/courier-dropbox-migration-to-grpc">uses gRPC</a> for remote calls and our in-house <a href="https://dropbox.tech/infrastructure/reintroducing-edgestore">Edgestore</a> to store tasks.
+ </p>
+ <p>
+ ATF consists of the following components:&#160;
+ </p>
+ <ul>
+ <li>Frontend
+ </li>
+ <li>Task Store
+ </li>
+ <li>Store Consumer
+ </li>
+ <li>Queue
+ </li>
+ <li>Controller
+ </li>
+ <li>Executor
+ </li>
+ <li>Heartbeat and Status Controller (HSC)<span><br /></span>
+ </li>
+ </ul>
+ <p>
+ <span><b>Frontend</b><br />
+ This is the service that schedules requests via an RPC interface. The frontend accepts RPC requests from clients and schedules tasks by interacting with ATF’s task store described below.</span><br />
+ </p>
+ <p>
+ <b>Task Store<br /></b> ATF tasks are stored in and triggered from the task store. The task store could be any generic data store with indexed querying capability. In ATF’s case, We use our in-house metadata store Edgestore to power the task store. More details can be&#160;found in the <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">D</a><a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">ata</a> <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">M</a><a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=395988446153757833740421&amp;h2=Data-model">odel</a> section below.
+ </p>
+ <p>
+ <b>Store Consumer<br /></b> The Store Consumer is a service that periodically polls the task store to find tasks that are ready for execution and pushes them onto the right queues, as described in the queue section below. These could be tasks that are newly ready for execution, or older tasks that are ready for execution again because they either failed in a retriable way on execution, or were dropped elsewhere within the ATF system.&#160;
+ </p>
+ <p>
+ Below is a simple walkthrough of the Store Consumer’s function:&#160;
+ </p>
+ </div>
+ <div class="dr-code-container aem-GridColumn aem-GridColumn--default--12">
+ <button class="dr-code-container__copy-button dr-button dr-typography-t17">Copy</button>
+ <pre class="dr-code-container__pre"><code class="dr-code-container__code dr-typography-t5">repeat every second:
+ 1. poll tasks ready for execution from task store
+ 2. push tasks onto the right queues
+ 3. update task statuses</code></pre>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ The Store Consumer polls tasks that failed in earlier execution attempts. This helps with the at-least-once guarantee that the ATF system provides. More details on how the Store Consumer polls new and previously failed tasks is presented in the <a href="https://paper.dropbox.com/doc/How-we-designed-Dropboxs-ATF-an-async-task-framework--A~wmq5aW48OkHns4LzkM~o6zAg-cf95JuxevqilF2iWWATj6#:uid=342792671048375002388848&amp;h2=Lifecycle-of-a-task">Lifecycle of a task</a> section below.
+ </p>
+ <p>
+ <b>Queue<br /></b> ATF uses AWS <a href="https://aws.amazon.com/sqs/" style="background-color: rgb(255,255,255);">Simple Queue Service</a> (SQS) to queue tasks internally. These queues act as a buffer between the Store Consumer and Controllers (described below). Each <span class="dr-code">&lt;lambda, priority&gt;</span> &#160;pair gets a dedicated SQS queue. The total number of SQS queues used by ATF is <span class="dr-code">#lambdas x #priorities</span>.
+ </p>
+ <p>
+ <b>Controller<br /></b> Worker hosts are physical hosts dedicated for task execution. Each worker host has one controller process responsible for polling tasks from SQS queues in a background thread, and then pushing them onto process local buffered queues. The Controller is only aware of the lambdas it is serving and thus polls only the limited set of necessary queues.&#160;
+ </p>
+ <p>
+ The Controller serves tasks from its process local queue as a response to <span class="dr-code">NextWork</span> RPCs. This is the layer where execution level task prioritization occurs. The Controller has different process level queues for tasks of different priorities and can thus prioritize tasks in response to <span class="dr-code">NextWork</span> RPCs.
+ </p>
+ <p>
+ <b>Executor<br /></b> The Executor is a process with multiple threads, responsible for the actual task execution. Each thread within an Executor process follows this simple loop:
+ </p>
+ </div>
+ <div class="dr-code-container aem-GridColumn aem-GridColumn--default--12">
+ <button class="dr-code-container__copy-button dr-button dr-typography-t17">Copy</button>
+ <pre class="dr-code-container__pre"><code class="dr-code-container__code dr-typography-t5">while True:
+ w = get_next_work()
+ do_work(w)</code></pre>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ Each worker host has a single Controller process and multiple executor processes. Both the Controller and Executors work in a “pull” model, in which active loops continuously long-poll for new work to be done.
+ </p>
+ <p>
+ <b>Heartbeat and Status Controller (HSC)</b><br />
+ The HSC serves RPCs for claiming a task for execution (<span class="dr-code">ClaimTask</span>), setting task status after execution (<span class="dr-code">SetResults</span>) and heartbeats during task execution (<span class="dr-code">Heartbeat</span>). <span class="dr-code">ClaimTask</span> requests originate from the Controllers in response to <span class="dr-code">NextWork</span> requests. <span class="dr-code">Heartbeat</span> and <span class="dr-code">SetResults</span> requests originate from executor processes during and after task execution. The HSC interacts with the task store to update the task status on the kind of request it receives.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="data-model">
+ <h2 class="dr-article-content__section-title">
+ Data model
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ ATF uses our in-house metadata store, Edgestore, as a task store. Edgestore objects can be Entities or Associations (<span class="dr-code">assoc</span>), each of which can have user-defined attributes. Associations are used to represent relationships between entities. Edgestore supports indexing only on attributes of associations.
+ </p>
+ <p>
+ Based on this design, we have two kinds of ATF-related objects in Edgestore. The ATF association stores scheduling information, such as the next scheduled timestamp at which the Store Consumer should poll a given task (either for the first time or for a retry). The ATF entity stores all task related information that is used to track the task state and payload for task execution. We query on associations from the Store Consumer in a pull model to pick up tasks ready for execution.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="lifecycle-of-a-task">
+ <h2 class="dr-article-content__section-title">
+ Lifecycle of a task
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <ol>
+ <li>Client performs a <span class="dr-code">Schedule</span> RPC call to <b>Frontend</b> with task information, including execution time.&#160;
+ </li>
+ <li>Frontend creates Edgestore <span class="dr-code">entity</span> and <span class="dr-code">assoc</span> for the task.&#160;
+ </li>
+ <li>When it is time to process the task, <b>Store Consumer</b> pulls the task from <b>Edgestore</b> and pushes it to a related <b>SQS</b> queue.&#160;
+ </li>
+ <li>
+ <b>Executor</b> makes <span class="dr-code">NextWork</span> RPC call to <b>Controller</b>, which pulls tasks from the <b>SQS</b> queue, makes a <span class="dr-code">ClaimTask</span> RPC to the HSC and then returns the task to the <b>Executor</b>.&#160;
+ </li>
+ <li>
+ <b>Executor</b> invokes the callback for the task. While processing, <b>Executor</b> performs <span class="dr-code">Heartbeat</span> RPC calls to <b>Heartbeat and Status Controller (HSC)</b>. Once processing is done, <b>Executor</b> performs <span class="dr-code">TaskStatus</span> RPC call to <b>HSC</b>.&#160;
+ </li>
+ <li>Upon getting <span class="dr-code">Heartbeat</span> and <span class="dr-code">TaskStatus</span> RPC calls, <b>HSC</b> updates the <b>Edgestore</b> entity and <span class="dr-code">assoc</span>.
+ </li>
+ </ol>
+ <p>
+ Every state update in the lifecycle of a task is accompanied by an update to the next trigger timestamp in the <span class="dr-code">assoc</span>. This ensures that the Store Consumer pulls the task again if there is no change in state of the task within the next trigger timestamp. This helps ATF achieve its at-least-once delivery guarantee by ensuring that no task is dropped.
+ </p>
+ <p>
+ Following are the task entity and association states in ATF and their corresponding timestamp updates:
+ </p>
+ <table>
+ <tbody>
+ <tr>
+ <td>
+ <p>
+ <b>Entity status</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>Assoc status</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>next trigger timestamp in Assoc</b>
+ </p>
+ </td>
+ <td>
+ <p>
+ <b>Comment</b>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">new</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">new</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">scheduled_timestamp</span> of the task
+ </p>
+ </td>
+ <td>
+ <p>
+ Pick up new tasks that are ready.&#160;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">enqueued</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">enqueued_timestamp</span> + <span class="dr-code">enqueue_timeout</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue task if it has been in <span class="dr-code">enqueued</span> state for too long. This can happen if the queue loses data or the controller goes down after polling the queue and before the task is claimed.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">claimed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">claimed_timestamp</span> + <span class="dr-code">claim_timeout</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue if task is claimed but never transfered to <span class="dr-code">processing</span>. This can happen if Controller is down after claiming a task. Task status is changed to <span class="dr-code">enqueued</span> after re-enqueue.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">processing</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">started</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">heartbeat_timestamp</span> + <span class="dr-code">heartbeat_timeout</span>`
+ </p>
+ </td>
+ <td>
+ <p>
+ Re-enqueue if task hasn’t sent <span class="dr-code">heartbeat</span> for too long. This can happen if Executor is down. Task status is changed to <span class="dr-code">enqueued</span> after re-enqueue.&#160;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">retriable failure</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ started
+ </p>
+ </td>
+ <td>
+ <p>
+ compute <span class="dr-code">next_timestamp</span> according to backoff logic
+ </p>
+ </td>
+ <td>
+ <p>
+ Exponential backoff for tasks with retriable failure.&#160;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">success</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">completed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ N/A
+ </p>
+ </td>
+ <td>
+ <p>
+ &#160;
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <span class="dr-code">fatal_failure</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ <span class="dr-code">completed</span>
+ </p>
+ </td>
+ <td>
+ <p>
+ N/A
+ </p>
+ </td>
+ <td>
+ <p>
+ &#160;
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ The store consumer polls for tasks based on the following query:
+ </p>
+ <p>
+ <span class="dr-code">assoc_status= &amp;&amp; next_timestamp&lt;=time.now()<br /></span>
+ </p>
+ <p>
+ Below is the state machine that defines task state transitions:&#160;<br />
+ </p>
+ </div>
+ <div class="image c04-image aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-image image cq-dd-image">
+ <figure class="dr-margin-0 dr-display-inline-block">
+ <img src="/cms/content/dam/dropbox/tech-blog/en-us/2020/11/atf/diagrams/Techblog-ATF-720x225px-2.png" aria-hidden="false" alt="Task State Transitions [Fig 2]" height="450" width="1440" />
+ </figure>
+ </div>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="-achieving-guarantees">
+ <h2 class="dr-article-content__section-title">
+ Achieving guarantees
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ <b>At-least-once task execution<br /></b> At-least-once execution is guaranteed in ATF by retrying a task until it completes execution (which is signaled by a <span class="dr-code">Success</span> or a <span class="dr-code">FatalFailure</span> state). All ATF system errors are implicitly considered retriable failures, and lambda owners have an option of marking tasks with a <span class="dr-code">RetriableFailure</span> state. Tasks might be dropped from the ATF execution pipeline in different parts of the system through transient RPC failures and failures on dependencies like Edgestore or SQS. These transient failures at different parts of the system do not affect the at-least-once guarantee, though, because of the system of timeouts and re-polling from Store Consumer.
+ </p>
+ <p>
+ <b>No concurrent task execution<br /></b> Concurrent task execution is avoided through a combination of two methods in ATF. First, tasks are explicitly claimed through an exclusive task state (<span class="dr-code">Claimed</span>) before starting execution. Once the task execution is complete, the task status is updated to one of <span class="dr-code">Success</span>, <span class="dr-code">FatalFailure</span> or <span class="dr-code">RetriableFailure</span>. A task can be claimed only if its existing task state is <span class="dr-code">Enqueued</span> (retried tasks go to the <span class="dr-code">Enqueued</span> state as well once they are re-pushed onto SQS).
+ </p>
+ <p>
+ However, there might be situations where once a long running task starts execution, its heartbeats might fail repeatedly yet the task execution continues. ATF would retry this task by polling it from the store consumer because the heartbeat timeouts would’ve expired. This task can then be claimed by another worker and lead to concurrent execution.&#160;<br />
+ </p>
+ <p>
+ To avoid this situation, there is a termination logic in the Executor processes whereby an Executor process terminates itself as soon as three consecutive heartbeat calls fail. Each heartbeat timeout is large enough to eclipse three consecutive heartbeat failures. This ensures that the Store Consumer cannot pull such tasks before the termination logic ends them—the second method that helps achieve this guarantee.
+ </p>
+ <p>
+ <b>Isolation<br /></b> Isolation of lambdas is achieved through dedicated worker clusters, dedicated queues, and dedicated per-lambda scheduling quotas. In addition, isolation across different priorities within the same lambda is likewise achieved through dedicated queues and scheduling bandwidth.
+ </p>
+ <p>
+ <b>Delivery latency<br /></b> ATF use cases do not require ultra-low task delivery latencies. Task delivery latencies on the order of a couple of seconds are acceptable. Tasks ready for execution are periodically polled by the Store Consumer and this period of polling largely controls the task delivery latency. Using this as a tuning lever, ATF can achieve different delivery latencies as required. Increasing poll frequency reduces task delivery latency and vice versa. Currently, we have calibrated ATF to poll for ready tasks once every two seconds.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="ownership-model">
+ <h2 class="dr-article-content__section-title">
+ Ownership model
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ ATF is designed to be a self-serve framework for developers at Dropbox. The design is very intentional in driving an ownership model where lambda owners own all aspects of their lambdas’ operations. To promote this, all lambda worker clusters are owned by the lambda owners. They have full control over operations on these clusters, including code deployments and capacity management. Each executor process is bound to one lambda. Owners have the option of deploying multiple lambdas on their worker clusters simply by spawning new executor processes on their hosts.
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="-extending-atf">
+ <h2 class="dr-article-content__section-title">
+ Extending ATF
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ As described above, ATF provides an infrastructural building block for scheduling asynchronous tasks. With this foundation established, ATF can be extended to support more generic use cases and provide more features as a framework. Following are some examples of what could be built as an extension to ATF.&#160;
+ </p>
+ <p>
+ <b>Periodic task execution<br /></b> Currently, ATF is a system for one-time task scheduling. Building support for periodic task execution as an extension to this framework would be useful in unlocking new capabilities for our clients.
+ </p>
+ <p>
+ <b>Better support for task chaining<br /></b> Currently, it is possible to chain tasks on ATF by scheduling a task onto ATF that then schedules other tasks onto ATF during its execution. Although it is possible to do this in the current ATF setup, visibility and control on this chaining is absent at the framework level. Another natural extension here would be to better support task chaining through framework-level visibility and control, to make this use case a first class concept in the ATF model.
+ </p>
+ <p>
+ <b>Dead letter queues for misbehaving tasks<br /></b> One common source of maintenance overhead we observe on ATF is that some tasks get stuck in infinite retry loops due to occasional bugs in lambda logic. This requires manual intervention from the ATF framework owners in some cases where there are a large number of tasks stuck in such loops, occupying a lot of the scheduling bandwidth in the system. Typical manual actions in response to such a situation include pausing execution of the lambdas with misbehaving tasks, or dropping them outright.
+ </p>
+ <p>
+ One way to reduce this operational overhead and provide an easy interface for lambda owners to recover from such incidents would be to create dead letter queues filled with such misbehaving tasks. The ATF framework could impose a maximum number of retries before tasks are pushed onto the dead letter queue. We could create and expose tools that make it easy to reschedule tasks from the dead letter queue back into the ATF system, once the associated lambda bugs are fixed.<br />
+ </p>
+ </div>
+ <div class="section aem-GridColumn aem-GridColumn--default--12">
+ <div class="dr-article-content__section" id="conclusion">
+ <h2 class="dr-article-content__section-title">
+ Conclusion
+ </h2>
+ </div>
+ </div>
+ <div class="text parbase aem-GridColumn aem-GridColumn--default--12">
+ <p>
+ We hope this post helps engineers elsewhere to develop better async task frameworks of their own. Many thanks to everyone who worked on this project: Anirudh Jayakumar, Deepak Gupta, Dmitry Kopytkov, Koundinya Muppalla, Peng Kang, Rajiv Desai, Ryan Armstrong, Steve Rodrigues, Thomissa Comellas, Xiaonan Zhang and Yuhuan Du.<br />
+ &#160;
+ </p>
+ </div>
+ </div>
+ </div>
+ <hr class="dr-typography-t5 dr-margin-top-50 dr-article-content__divider" />
+ <div class="dr-typography-t5"></div>
+ <div class="dr-typography-t5 dr-margin-top-20">
+ // Tags<br />
+ <ul class="dr-unstyled-list dr-margin-top-10 dr-typography-t4">
+ <li class="dr-container--infrastructure dr-display-inline-block dr-margin-right-10 dr-margin-bottom-10">
+ <a class="dr-link dr-pill dr-pill--primary dr-link--no-underline" href="https://dropbox.tech/infrastructure">Infrastructure</a>
+ </li>
+ <li class="dr-display-inline-block dr-margin-right-10">
+ <a class="dr-link dr-pill dr-link--no-underline" href="https://dropbox.tech/tag-results.task-scheduling">Task Scheduling</a>
+ </li>
+ <li class="dr-display-inline-block dr-margin-right-10">
+ <a class="dr-link dr-pill dr-link--no-underline" href="https://dropbox.tech/tag-results.async">Async</a>
+ </li>
+ <li class="dr-display-inline-block dr-margin-right-10">
+ <a class="dr-link dr-pill dr-link--no-underline" href="https://dropbox.tech/tag-results.edgestore">Edgestore</a>
+ </li>
+ </ul>
+ </div>
+ <div class="dr-typography-t5 dr-margin-top-20 dr-hide-from-md">
+ // Copy link<br />
+ <div class="dr-article-content__social-links-tooltip dr-display-none">
+ Link copied
+ </div><button class="dr-button dr-button--link dr-link dr-link--no-underline dr-article-content__copy-link" data-dr-tooltip="Copy link"><img alt="Copy link" class="dr-display-block dr-invert-on-theme-dark" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content/resources/copy.svg" /></button>
+ </div>
+ <div class="dr-article-content__social-links">
+ <ul class="dr-article-content__social-links-list dr-unstyled-list">
+ <li class="dr-margin-bottom-20">
+ <div class="dr-article-content__social-links-tooltip dr-typography-t5 dr-display-none">
+ Link copied
+ </div><button class="dr-button dr-display-block dr-link dr-link--no-underline dr-article-content__copy-link dr-button--link" data-dr-tooltip="Copy link" data-dr-tooltip-position="cl" data-dr-tooltip-theme="bw"><img alt="Copy link" class="dr-display-block dr-invert-on-theme-dark" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content/resources/copy.svg" /></button>
+ </li>
+ <li class="dr-margin-bottom-20">
+ <a class="dr-link dr-display-block dr-link--no-underline dr-article-content__share-link dr-article-content__twitter-link" data-dr-tooltip="Share on Twitter" data-dr-tooltip-position="cl" data-dr-tooltip-theme="bw" href="https://twitter.com/intent/tweet/?text=How%20we%20designed%20Dropbox%20ATF%3A%20an%20async%20task%20framework&amp;url=https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" target="_blank"><img alt="Share on Twitter" class="dr-display-block dr-invert-on-theme-dark" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content/resources/twitter.svg" /></a>
+ </li>
+ <li class="dr-margin-bottom-20">
+ <a class="dr-link dr-display-block dr-link--no-underline dr-article-content__share-link dr-article-content__facebook-link" data-dr-tooltip="Share on Facebook" data-dr-tooltip-position="cl" data-dr-tooltip-theme="bw" href="https://facebook.com/sharer/sharer.php?u=https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" target="_blank"><img alt="Share on Facebook" class="dr-display-block dr-invert-on-theme-dark" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content/resources/facebook.svg" /></a>
+ </li>
+ <li>
+ <a class="dr-link dr-display-block dr-link--no-underline dr-article-content__share-link dr-article-content__linkedin-link" data-dr-tooltip="Share on Linkedin" data-dr-tooltip-position="cl" data-dr-tooltip-theme="bw" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox&amp;title=How%20we%20designed%20Dropbox%20ATF%3A%20an%20async%20task%20framework&amp;source=https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox" target="_blank"><img alt="Share on Linkedin" class="dr-display-block dr-invert-on-theme-dark" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content/resources/linkedin.svg" /></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="aem-Grid aem-Grid--12 aem-Grid--default--12">
+ <div class="plain-html c17-plain-html aem-GridColumn aem-GridColumn--default--12">
+ <div class="knotch_placeholder"></div>
+ </div>
+ </div>
+ <footer class="dr-footer">
+ <div class="dr-container--surface">
+ <section class="dr-container__content dr-footer__container">
+ <div class="dr-newsletter-subscription__succeed dr-display-none dr-typography-t5">
+ <hr class="dr-newsletter-subscription__form-divider" />
+ <div class="dr-margin-bottom-30 dr-margin-top-30">
+ <!--// Thanks for subscribing.-->
+ <div class="dr-show-block-from-lg">
+ <img src="/cms/content/dam/dropbox/tech-blog/en-us/subscribe/thanksforsubscribing_desktop.png" title="subscription__success" alt="subscription__success" />
+ </div>
+ <div class="dr-show-block-from-md dr-hide-from-lg dr-hide-from-sm">
+ <img src="/cms/content/dam/dropbox/tech-blog/en-us/subscribe/thanksforsubscribing_tablet.png" title="subscription__success" alt="subscription__success" />
+ </div>
+ <div class="dr-show-block-from-sm dr-hide-from-lg dr-hide-from-md">
+ <img src="/cms/content/dam/dropbox/tech-blog/en-us/subscribe/thanksforsubscribing_mobile.png" title="subscription__success" alt="subscription__success" />
+ </div>
+ </div>
+ <hr class="dr-newsletter-subscription__form-divider" />
+ </div>
+ <form role="form" class="dr-typography-t5 dr-newsletter-subscription__form" novalidate="">
+ <hr class="dr-newsletter-subscription__form-divider" />
+ <div class="dr-margin-top-30 dr-margin-bottom-30 dr-margin-md-top-10 dr-margin-md-bottom-10">
+ // Subscribe to email updates by category
+ </div>
+ <div class="dr-margin-left-25">
+ <p class="dr-newsletter-subscription__topic-error dr-display-none dr-color-tangerine">
+ Select at least one topic
+ </p><label class="dr-newsletter-subscription__form-label" for="newsletterForm.application"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.application" name="categories[ ]" type="checkbox" value="Application" data-mid="127814" />Application</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.frontend"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.frontend" name="categories[ ]" type="checkbox" value="Front End" data-mid="127842" />Front End</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.infrastructure"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.infrastructure" name="categories[ ]" type="checkbox" value="Infrastructure" data-mid="127826" />Infrastructure</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.machine-learning"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.machine-learning" name="categories[ ]" type="checkbox" value="Machine Learning" data-mid="127830" />Machine Learning</label><br class="dr-show-block-from-md" />
+ <label class="dr-newsletter-subscription__form-label" for="newsletterForm.mobile"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.mobile" name="categories[ ]" type="checkbox" value="Mobile" data-mid="127834" />Mobile</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.security"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.security" name="categories[ ]" type="checkbox" value="Security" data-mid="127838" />Security</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.developers"><input class="dr-newsletter-subscription__form-checkbox dr-input" id="newsletterForm.developers" name="categories[ ]" type="checkbox" value="Developers" data-mid="129642" />Developers</label> <label class="dr-newsletter-subscription__form-label" for="newsletterForm.all"><input class="dr-newsletter-subscription__form-checkbox dr-newsletter-subscription__form-checkbox--all dr-input" id="newsletterForm.all" type="checkbox" />All</label>
+ </div>
+ <p class="dr-newsletter-subscription__error dr-display-none dr-color-tangerine">
+ Error occurred!<br />
+ Please try again later
+ </p>
+ <p class="dr-newsletter-subscription__email-error dr-display-none dr-color-tangerine">
+ Enter a valid address
+ </p>
+ <div class="dr-newsletter-subscription__email-container dr-margin-bottom-20 dr-margin-top-40 dr-margin-md-top-0">
+ <div>
+ // Type your email address
+ </div><input autocomplete="off" class="dr-newsletter-subscription__form-input dr-flex-1" name="email" type="email" />
+ <div class="dr-newsletter-subscription__actions-container">
+ <div class="dr-newsletter-subscription__loading dr-display-none">
+ Submitting...
+ </div><button type="submit" disabled="disabled" class="dr-newsletter-subscription__form-submit dr-button dr-typography-t5">Subscribe</button>
+ </div>
+ </div>
+ <hr class="dr-newsletter-subscription__form-divider" />
+ </form>
+ <div class="dr-grid dr-grid--md-2">
+ <div>
+ <a href="https://dropbox.com" target="_blank" class="dr-margin-bottom-20 dr-display-block"><img alt="Dropbox" height="40" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-all/resources/logo_dropbox.svg" width="164" /></a>
+ </div>
+ <ul class="dr-footer-links dr-unstyled-list dr-typography-t10 dr-grid dr-grid--2 dr-grid--column-gap-15">
+ <li>
+ <a class="dr-link dr-link--no-underline" href="http://dropbox.com/jobs" target="_blank">Jobs</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://medium.com/@Dropbox" target="_blank">Medium</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://www.dropbox.com/privacy" target="_blank">Privacy</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://twitter.com/Dropbox" target="_blank">twitter</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://www.dropbox.com/terms" target="_blank">Terms</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://www.instagram.com/dropbox" target="_blank">Instagram</a>
+ </li>
+ <li>
+ <a class="dr-link dr-link--no-underline" href="https://blog.dropbox.com/" target="_blank">Work In Progress</a>
+ </li>
+ </ul>
+ </div>
+ </section>
+ </div>
+ </footer>
+ <div id="u04-snapengage-config" data-snapengage-widget-id="d5c1efed-d0ef-4fca-8c7d-faff398ad272" data-proactive-chat="false" style="display:none;"></div>
+ <script type="text/javascript" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-common/clientlib-cms-common.7f3cf4624fd698d8bfec572c3c993880.js"></script>
+ <script type="text/javascript" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-all.3230e3eaa6e5a90686710bfde829f620.js"></script>
+ <script type="text/javascript" src="/cms/etc.clientlibs/settings/wcm/designs/dropbox-tech-blog/clientlib-article-content.2c12dd2925c2dcad6bde22d2ff271137.js"></script>
+ <script type="application/javascript">
+ <![CDATA[
+ document.body.classList.remove('stormcrow-animate');
+ ]]>
+ </script> <noscript></noscript>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-metadata.json
new file mode 100644
index 000000000..f2764b362
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Bradley M. Kuhn (http:\/\/ebb.org\/bkuhn\/)",
+ "Direction": null,
+ "Excerpt": "The website of Bradley M. Kuhn, aka Brad, aka bkuhn. This site includes his GPG keys, resume, blog, projects list, software, interviews, speeches and writing.",
+ "Image": null,
+ "Title": "On Recent Controversial Events - Bradley M. Kuhn ( Brad ) ( bkuhn )",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected.html
new file mode 100644
index 000000000..a13415e45
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/expected.html
@@ -0,0 +1,56 @@
+<div id="contentWithSidebar">
+
+ <p>
+ Tuesday 15 October 2019 by Bradley M. Kuhn
+ </p>
+ <p>
+ The last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)'s public statements, to <a href="https://www.fsf.org/news/richard-m-stallman-resigns">his resignation from the Free Software Foundation (FSF)</a>, to the Epstein scandal and its connection to MIT. I've also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities.
+ </p>
+ <p>
+ I have been silent the last month because, until two days ago, I was an at-large member of <a href="https://www.fsf.org/about/staff-and-board">FSF's Board of Directors</a>, and a <a href="https://static.fsf.org/nosvn/fsf-amended-bylaws-current.pdf">Voting Member</a> of the FSF. As a member of FSF's two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis <a href="https://www.fsf.org/news/richard-m-stallman-resigns">come</a> <a href="https://www.fsf.org/news/fsf-and-gnu">directly</a> from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request.
+ </p>
+ <p>
+ The situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the <a href="https://sfconservancy.org/about/board/#bkuhn">Board of Directors</a>) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy's statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues.
+ </p>
+ <p>
+ I take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management's directives. Now that I've left the FSF Board of Directors, FSF's Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF's best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community's current crisis.
+ </p>
+ <p>
+ Firstly, all these events — from RMS' public comments on the MIT mailing list, to RMS' resignation from the FSF to RMS' discussions about the next steps for the GNU project — <em>seem</em> to many to have happened ridiculously quickly. But it wasn't actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me.
+ </p>
+ <p>
+ For the last two years, I had been a loud internal voice in the FSF leadership regarding RMS' Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed <a href="https://medium.com/@selamjie/remove-richard-stallman-fec6ec210794">Selam G.'s Medium post</a> raised an entirely new issue. <a href="https://web.archive.org/web/20161107050933/https://www.stallman.org/archives/2016-jul-oct.html#31_October_2016_(Down's_syndrome)">In</a> <a href="https://web.archive.org/web/20170202025227/https://www.stallman.org/archives/2016-nov-feb.html#14_December_2016_(Campaign_of_bull-headed_prudery)">fact</a>, <a href="https://web.archive.org/web/20170224174306/https://www.stallman.org/archives/2016-nov-feb.html#23_February_2017_(A_violent_sex_offender)">RMS'</a> <a href="https://web.archive.org/web/20170612074722/http://stallman.org/archives/2017-mar-jun.html#26_May_2017_(Prudish_ignorantism)">views</a> <a href="https://web.archive.org/web/20170616044924/https://www.stallman.org/archives/2017-mar-jun.html#13_June_2017_(Sex_offender_registry)">and</a> <a href="https://web.archive.org/web/20171020041022/http://stallman.org/archives/2017-jul-oct.html#10_October_2017_(Laws_against_having_sex_with_an_animal)">statements</a> <a href="https://web.archive.org/web/20180131020215/https://stallman.org/archives/2017-jul-oct.html#29_October_2017_(Pestering_women)">posted</a> <a href="https://web.archive.org/web/20180104112431/https://www.stallman.org/archives/2017-nov-feb.html#27_November_2017_(Roy_Moore's_relationships)">on</a> <a href="https://web.archive.org/web/20180509120046/https://stallman.org/archives/2018-mar-jun.html#30_April_2018_(UN_peacekeepers_in_South_Sudan)">stallman.org</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#17_July_2018_(The_bullshitter's_flirting)">about</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#21_August_2018_(Age_and_attraction)">sexual</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">morality</a> <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">escalated</a> <a href="https://web.archive.org/web/20181113161736/https://www.stallman.org/archives/2018-sep-dec.html#6_November_2018_(Sex_according_to_porn)">for</a> <a href="https://web.archive.org/web/20190325024048/https://stallman.org/archives/2019-jan-apr.html#14_February_2019_(Respecting_peoples_right_to_say_no)">the</a> <a href="https://www.stallman.org/archives/2019-may-aug.html#11_June_2019_(Stretching_meaning_of_terms)">worse</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#12_June_2019_(Declining_sex_rates)">over</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#30_July_2019_(Al_Franken)">the</a> <a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">last</a> <a href="https://web.archive.org/web/20191011023557/https://stallman.org/archives/2019-jul-oct.html#21_September_2019_(Sex_workers)">few</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">years</a>. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF's mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which <acronym title="in my opinion">IMO</acronym> didn't include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma.
+ </p>
+ <p>
+ IMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to <acronym title="Free and Open Source Software">FOSS</acronym>. (Indeed, I would not even be commenting on <em>this issue</em> if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with <a href="https://lwn.net/Articles/770966/">restraint, not with impunity</a>.
+ </p>
+ <p>
+ RMS has consistently argued that there was a campaign of “prudish intimidation” — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS' right to say what he believes, nor is it even about whether or not you agree or disagree with RMS' statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn't matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you're actively trying to advance. The message of universal software freedom is a radical cause; it's basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS' radical views about sexual morality.
+ </p>
+ <p>
+ And here is where I say the thing that may infuriate many but it's what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The <a href="https://www.fsf.org/about/">FSF's mission</a> is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission.
+ </p>
+ <p>
+ I'm admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">this “(re-)definition” of sexual assault</a>. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is <strong><a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">not a “frenzy”</a></strong>; it is a global movement by individuals who have been harmed seeking to hold both bad actors <em>and</em> society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the <a href="https://www.gnu.org/philosophy/freedom-or-power.en.html">essay that I co-wrote with RMS</a> and still find <a href="https://www.gnu.org/gnu/manifesto.en.html">many</a> <a href="https://www.gnu.org/philosophy/free-sw.html">of</a> <a href="https://www.gnu.org/philosophy/why-free.html">RMS'</a> <a href="https://www.gnu.org/philosophy/pragmatic.html">other</a> <a href="https://www.gnu.org/philosophy/microsoft-old.html">essays</a> <a href="https://www.gnu.org/philosophy/gpl-american-way.html">compelling</a>, <a href="https://www.gnu.org/licenses/why-not-lgpl.html">important</a>, <a href="https://www.gnu.org/philosophy/stallman-kth.en.html">and</a> <a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">relevant</a>.
+ </p>
+ <p>
+ I want the FSF to succeed in its mission and enter a new era of accomplishments. I've spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I've had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission.
+ </p>
+ <p>
+ As culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That's the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions.
+ </p>
+ <p>
+ Posted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn.
+ </p>
+
+
+ </div><p>
+ <code>#include &lt;std/disclaimer.h&gt;</code><br>
+ <code>use Standard::Disclaimer;</code><br>
+ <code>from standard import disclaimer</code><br>
+ <code>SELECT full_text FROM standard WHERE type = 'disclaimer';</code>
+ </p><p>
+ Both previously and presently, I have been employed by and/or done work for various organizations that also have views on Free, Libre, and Open Source Software. As should be blatantly obvious, this is my website, not theirs, so please do not assume views and opinions here belong to any such organization. Since I do co-own ebb.org with my wife, it may not be so obvious that these aren't her views and opinions, either.
+ </p><p>
+ ebb <sup>℠</sup> is a service mark of Bradley M. Kuhn.
+ </p> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/source.html
new file mode 100644
index 000000000..5daa2a094
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ebb-org/source.html
@@ -0,0 +1,485 @@
+<!DOCTYPE html>
+<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+ <title>
+ On Recent Controversial Events - Bradley M. Kuhn ( Brad ) ( bkuhn )
+ </title>
+ <meta content="Bradley M. Kuhn (http://ebb.org/bkuhn/)" name="author" />
+ <link href="http://ebb.org/bkuhn/rss.xml" rel="alternate" title="Whole Website RSS for Bradley M. Kuhn" type="application/rss+xml" />
+ <link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Blog RSS for Bradley M. Kuhn" type="application/rss+xml" />
+ <link href="http://ebb.org/bkuhn/blog/rss.xml" rel="alternate" title="Articles / Interviews RSS for Bradley M. Kuhn" type="application/rss+xml" />
+ <link href="/css/screen.css" rel="stylesheet" type="text/css" />
+ <link href="mailto:[email protected]" rel="made" />
+ <meta content="kuhn, brad, bradley, bkuhn, hacker, gnu, free, software, linux, unix, perl, liberal, pgp, gpg, geek, system, administrator, network, free software, developer, new york, NY, computer, open source, hacker, software, freedom, software freedom" http-equiv="Keywords" name="Keywords" />
+ <meta content="The website of Bradley M. Kuhn, aka Brad, aka bkuhn. This site includes his GPG keys, resume, blog, projects list, software, interviews, speeches and writing." http-equiv="Description" name="Description" />
+ </head>
+ <body>
+ <div id="site">
+ <div id="sidebar">
+ <div id="title">
+ <p>
+ <a href="/bkuhn">Bradley M. Kuhn</a> <a href="http://ebb.org/bkuhn/rss.xml"><img alt="[RSS of Whole Site]" border="0" src="/images/feed-icon-14x14.png" /></a>
+ </p>
+ </div>
+ <div id="menu">
+ <ul>
+ <li>
+ <a href="/bkuhn/contact">Contact</a>
+ </li>
+ <li>
+ <a href="/bkuhn/blog">Blog</a> &#160; <a href="http://ebb.org/bkuhn/blog/rss.xml"><img alt="[RSS of Blog]" border="0" src="/images/feed-icon-14x14.png" /></a>
+ </li>
+ <li>
+ <a href="http://identi.ca/bkuhn/">Pump.io Social Network</a>
+ </li><!-- %li= link_to("About", "/bkuhn/about") -->
+ <!-- %li= link_to("Speeches / Talks", "/bkuhn/speeches/") -->
+ <li>
+ <a href="/bkuhn/articles">Interviews / Articles</a> &#160; <a href="http://ebb.org/bkuhn/articles/rss.xml"><img alt="[RSS of Articles]" border="0" src="/images/feed-icon-14x14.png" /></a>
+ </li>
+ <li>
+ <a href="/bkuhn/code/">Software</a>
+ </li>
+ <li>
+ <a href="/bkuhn/resume">Résumé</a>
+ </li>
+ </ul>
+ </div>
+ <h2>
+ <a href="/bkuhn/tags">Tag</a> Cloud
+ </h2>
+ <ol id="tag-cloud">
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#accounting">accounting</a>
+ </li>
+ <li class="tier-4" title="24 posts">
+ <a href="/bkuhn/tags.html#advocacy">advocacy</a>
+ </li>
+ <li class="tier-4" title="16 posts">
+ <a href="/bkuhn/tags.html#agpl">agpl</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#android">android</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#apache">apache</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#apple">apple</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#apt">apt</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#artistic">artistic</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#asterisk">asterisk</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#automotive">automotive</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#autonomous">autonomous</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#award">award</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#bilski">bilski</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#canonical">canonical</a>
+ </li>
+ <li class="tier-3" title="7 posts">
+ <a href="/bkuhn/tags.html#cla">cla</a>
+ </li>
+ <li class="tier-5" title="39 posts">
+ <a href="/bkuhn/tags.html#community">community</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#compliance">compliance</a>
+ </li>
+ <li class="tier-4" title="15 posts">
+ <a href="/bkuhn/tags.html#conferences">conferences</a>
+ </li>
+ <li class="tier-5" title="37 posts">
+ <a href="/bkuhn/tags.html#conservancy">conservancy</a>
+ </li>
+ <li class="tier-3" title="8 posts">
+ <a href="/bkuhn/tags.html#copyleft">copyleft</a>
+ </li>
+ <li class="tier-5" title="56 posts">
+ <a href="/bkuhn/tags.html#copyright">copyright</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#cow-orking">cow-orking</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#cpp">cpp</a>
+ </li>
+ <li class="tier-3" title="9 posts">
+ <a href="/bkuhn/tags.html#debian">debian</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#denounce">denounce</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#development">development</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#diversity">diversity</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#emacs">emacs</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#encryption">encryption</a>
+ </li>
+ <li class="tier-3" title="10 posts">
+ <a href="/bkuhn/tags.html#enforcement">enforcement</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#exceptions">exceptions</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#faif">faif</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#fdl">fdl</a>
+ </li>
+ <li class="tier-4" title="11 posts">
+ <a href="/bkuhn/tags.html#for-profit">for-profit</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#fosdem">fosdem</a>
+ </li>
+ <li class="tier-4" title="13 posts">
+ <a href="/bkuhn/tags.html#fsf">fsf</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#gcc">gcc</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#git">git</a>
+ </li>
+ <li class="tier-4" title="13 posts">
+ <a href="/bkuhn/tags.html#gnome">gnome</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#gnu">gnu</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#google">google</a>
+ </li>
+ <li class="tier-6" title="107 posts">
+ <a href="/bkuhn/tags.html#gpl">gpl</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#gpl-compatibility">gpl-compatibility</a>
+ </li>
+ <li class="tier-5" title="47 posts">
+ <a href="/bkuhn/tags.html#gpl-enforcement">gpl-enforcement</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#gplv3">gplv3</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#guadec">guadec</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#identica">identica</a>
+ </li>
+ <li class="tier-4" title="17 posts">
+ <a href="/bkuhn/tags.html#infringement">infringement</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#java">java</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#javascript">javascript</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#jvm">jvm</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#launchpad">launchpad</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#ldap">ldap</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#lgpl">lgpl</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#libreoffice">libreoffice</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#libreplanet">libreplanet</a>
+ </li>
+ <li class="tier-6" title="72 posts">
+ <a href="/bkuhn/tags.html#licensing">licensing</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#lindows">lindows</a>
+ </li>
+ <li class="tier-4" title="11 posts">
+ <a href="/bkuhn/tags.html#linux">linux</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#maemo">maemo</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#mail">mail</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#meego">meego</a>
+ </li>
+ <li class="tier-4" title="17 posts">
+ <a href="/bkuhn/tags.html#microsoft">microsoft</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#mobile">mobile</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#moblin">moblin</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#mono">mono</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#motorola">motorola</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#mta">mta</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#mysql">mysql</a>
+ </li>
+ <li class="tier-4" title="13 posts">
+ <a href="/bkuhn/tags.html#net-services">net-services</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#nlp">nlp</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#nokia">nokia</a>
+ </li>
+ <li class="tier-4" title="23 posts">
+ <a href="/bkuhn/tags.html#non-profit">non-profit</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#np-complete">np-complete</a>
+ </li>
+ <li class="tier-3" title="7 posts">
+ <a href="/bkuhn/tags.html#open-core">open-core</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#open-foam">open-foam</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#oracle">oracle</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#parrot">parrot</a>
+ </li>
+ <li class="tier-4" title="16 posts">
+ <a href="/bkuhn/tags.html#patents">patents</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#perl">perl</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#perljvm">perljvm</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#permissive-license">permissive-license</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#piracy">piracy</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#podcast">podcast</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#podjango">podjango</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#poker">poker</a>
+ </li>
+ <li class="tier-4" title="14 posts">
+ <a href="/bkuhn/tags.html#politics">politics</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#postfix">postfix</a>
+ </li>
+ <li class="tier-4" title="13 posts">
+ <a href="/bkuhn/tags.html#proprietary">proprietary</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#qt">qt</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#replicant">replicant</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#requiem">requiem</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#rtlinux">rtlinux</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#scale">SCALE</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#sco">sco</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#scotus">scotus</a>
+ </li>
+ <li class="tier-3" title="5 posts">
+ <a href="/bkuhn/tags.html#security">security</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#sexism">sexism</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#sflc">sflc</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#slicing">slicing</a>
+ </li>
+ <li class="tier-3" title="7 posts">
+ <a href="/bkuhn/tags.html#social-justice">social-justice</a>
+ </li>
+ <li class="tier-3" title="6 posts">
+ <a href="/bkuhn/tags.html#software">software</a>
+ </li>
+ <li class="tier-6" title="108 posts">
+ <a href="/bkuhn/tags.html#software-freedom">software-freedom</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#speeches">speeches</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#stet">stet</a>
+ </li>
+ <li class="tier-2" title="4 posts">
+ <a href="/bkuhn/tags.html#talks">talks</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#tcl">tcl</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#teaching">teaching</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#tech-press">tech-press</a>
+ </li>
+ <li class="tier-5" title="35 posts">
+ <a href="/bkuhn/tags.html#technology">technology</a>
+ </li>
+ <li class="tier-2" title="2 posts">
+ <a href="/bkuhn/tags.html#thesis">thesis</a>
+ </li>
+ <li class="tier-3" title="5 posts">
+ <a href="/bkuhn/tags.html#trademarks">trademarks</a>
+ </li>
+ <li class="tier-3" title="10 posts">
+ <a href="/bkuhn/tags.html#ubuntu">ubuntu</a>
+ </li>
+ <li class="tier-1" title="1 post">
+ <a href="/bkuhn/tags.html#voip">voip</a>
+ </li>
+ <li class="tier-2" title="3 posts">
+ <a href="/bkuhn/tags.html#xen">xen</a>
+ </li>
+ </ol>
+ <h2>
+ Powered by
+ </h2><a href="https://gitorious.org/bkuhn/jekyll/source/HEAD:">A Very Old Fork of Jekyll</a> <a href="https://gitorious.org/bkuhn/website/source/HEAD:">"Source Code" for this site</a>
+ </div>
+ <div id="contentWithSidebar">
+ <div id="post">
+ <h1>
+ On Recent Controversial Events
+ </h1>
+ <p class="topAttributionWithDate">
+ Tuesday 15 October 2019 by Bradley M. Kuhn
+ </p>
+ <p>
+ The last 33 days have been unprecedentedly difficult for the software freedom community and for me personally. Folks have been emailing, phoning, texting, tagging me on social media (— the last of which has been funny, because all my social media accounts are placeholder accounts). But, just about everyone has urged me to comment on the serious issues that the software freedom community now faces. Until now, I have stayed silent regarding all these current topics: from Richard M. Stallman (RMS)'s public statements, to <a href="https://www.fsf.org/news/richard-m-stallman-resigns">his resignation from the Free Software Foundation (FSF)</a>, to the Epstein scandal and its connection to MIT. I've also avoided generally commenting on software freedom organizational governance during this period. I did this for good reason, which is explained below. However, in this blog post, I now share my primary comments on the matters that seem to currently be of the utmost attention of the Open Source and Free Software communities.
+ </p>
+ <p>
+ I have been silent the last month because, until two days ago, I was an at-large member of <a href="https://www.fsf.org/about/staff-and-board">FSF's Board of Directors</a>, and a <a href="https://static.fsf.org/nosvn/fsf-amended-bylaws-current.pdf">Voting Member</a> of the FSF. As a member of FSF's two leadership bodies, I was abiding by a reasonable request from the FSF management and my duty to the organization. Specifically, the FSF asked that all communication during the crisis <a href="https://www.fsf.org/news/richard-m-stallman-resigns">come</a> <a href="https://www.fsf.org/news/fsf-and-gnu">directly</a> from FSF officers and not from at-large directors and/or Voting Members. Furthermore, the FSF management asked all Directors and Voting Members to remain silent on this entire matter — even on issues only tangentially related to the current situation, and even when speaking in our own capacity (e.g., on our own blogs like this one). The FSF is an important organization, and I take any request from the FSF seriously — so I abided fully with their request.
+ </p>
+ <p>
+ The situation was further complicated because folks at my employer, Software Freedom Conservancy (where I also serve on the <a href="https://sfconservancy.org/about/board/#bkuhn">Board of Directors</a>) had strong opinions about this matter as well. Fortunately, the FSF and Conservancy both had already created clear protocols for what I should do if ever there was a disagreement or divergence of views between Conservancy and FSF. I therefore was recused fully from the planning, drafting, and timing of Conservancy's statement on this matter. I thank my colleagues at the Conservancy for working so carefully to keep me entirely outside the loop on their statement and to diligently assure that it was straight-forward for me to manage any potential organizational disagreements. I also thank those at the FSF who outlined clear protocols (ahead of time, back in March 2019) in case a situation like this ever came up. I also know my colleagues at Conservancy care deeply, as I do, about the health and welfare of the FSF and its mission of fighting for universal software freedom for all. None of us want, nor have, any substantive disagreement over software freedom issues.
+ </p>
+ <p>
+ I take very seriously my duty to the various organizations where I have (or have had) affiliations. More generally, I champion non-profit organizational transparency. Unfortunately, the current crisis left me in a quandary between the overarching goal of community transparency and abiding by FSF management's directives. Now that I've left the FSF Board of Directors, FSF's Voting Membership, and all my FSF volunteer roles (which ends my 22-year uninterrupted affiliation with the FSF), I can now comment on the substantive issues that face not just the FSF, but the Free Software community as a whole, while continuing to adhere to my past duty of acting in FSF's best interest. In other words, my affiliation with the FSF has come to an end for many good and useful reasons. The end to this affiliation allows me to speak directly about the core issues at the heart of the community's current crisis.
+ </p>
+ <p>
+ Firstly, all these events — from RMS' public comments on the MIT mailing list, to RMS' resignation from the FSF to RMS' discussions about the next steps for the GNU project — <em>seem</em> to many to have happened ridiculously quickly. But it wasn't actually fast at all. In fact, these events were culmination of issues that were slowly growing in concern to many people, including me.
+ </p>
+ <p>
+ For the last two years, I had been a loud internal voice in the FSF leadership regarding RMS' Free-Software-unrelated public statements; I felt strongly that it was in the best interest of the FSF to actively seek to limit such statements, and that it was my duty to FSF to speak out about this within the organization. Those who only learned of this story in the last month (understandably) believed <a href="https://medium.com/@selamjie/remove-richard-stallman-fec6ec210794">Selam G.'s Medium post</a> raised an entirely new issue. <a href="https://web.archive.org/web/20161107050933/https://www.stallman.org/archives/2016-jul-oct.html#31_October_2016_(Down's_syndrome)">In</a> <a href="https://web.archive.org/web/20170202025227/https://www.stallman.org/archives/2016-nov-feb.html#14_December_2016_(Campaign_of_bull-headed_prudery)">fact</a>, <a href="https://web.archive.org/web/20170224174306/https://www.stallman.org/archives/2016-nov-feb.html#23_February_2017_(A_violent_sex_offender)">RMS'</a> <a href="https://web.archive.org/web/20170612074722/http://stallman.org/archives/2017-mar-jun.html#26_May_2017_(Prudish_ignorantism)">views</a> <a href="https://web.archive.org/web/20170616044924/https://www.stallman.org/archives/2017-mar-jun.html#13_June_2017_(Sex_offender_registry)">and</a> <a href="https://web.archive.org/web/20171020041022/http://stallman.org/archives/2017-jul-oct.html#10_October_2017_(Laws_against_having_sex_with_an_animal)">statements</a> <a href="https://web.archive.org/web/20180131020215/https://stallman.org/archives/2017-jul-oct.html#29_October_2017_(Pestering_women)">posted</a> <a href="https://web.archive.org/web/20180104112431/https://www.stallman.org/archives/2017-nov-feb.html#27_November_2017_(Roy_Moore's_relationships)">on</a> <a href="https://web.archive.org/web/20180509120046/https://stallman.org/archives/2018-mar-jun.html#30_April_2018_(UN_peacekeepers_in_South_Sudan)">stallman.org</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#17_July_2018_(The_bullshitter's_flirting)">about</a> <a href="https://web.archive.org/web/20180911075211/https://www.stallman.org/archives/2018-jul-oct.html#21_August_2018_(Age_and_attraction)">sexual</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">morality</a> <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">escalated</a> <a href="https://web.archive.org/web/20181113161736/https://www.stallman.org/archives/2018-sep-dec.html#6_November_2018_(Sex_according_to_porn)">for</a> <a href="https://web.archive.org/web/20190325024048/https://stallman.org/archives/2019-jan-apr.html#14_February_2019_(Respecting_peoples_right_to_say_no)">the</a> <a href="https://www.stallman.org/archives/2019-may-aug.html#11_June_2019_(Stretching_meaning_of_terms)">worse</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#12_June_2019_(Declining_sex_rates)">over</a> <a href="https://web.archive.org/web/20190801201704/https://stallman.org/archives/2019-may-aug.html#30_July_2019_(Al_Franken)">the</a> <a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">last</a> <a href="https://web.archive.org/web/20191011023557/https://stallman.org/archives/2019-jul-oct.html#21_September_2019_(Sex_workers)">few</a> <a href="https://web.archive.org/web/20180924231708/https://stallman.org/archives/2018-jul-oct.html#23_September_2018_(Cody_Wilson)">years</a>. When the escalation started, I still considered RMS both a friend and colleague, and I attempted to argue with him at length to convince him that some of his positions were harmful to sexual assault survivors and those who are sex trafficked, and to the people who devote their lives in service to such individuals. More importantly to the FSF, I attempted to persuade RMS that launching a controversial campaign on sexual behavior and morality was counter to his and FSF's mission to advance software freedom, and told RMS that my duty as an FSF Director was to assure the best outcome for the FSF, which <acronym title="in my opinion">IMO</acronym> didn't include having a leader who made such statements. Not only is human sexual behavior not a topic on which RMS has adequate academic expertise, but also his positions appear to ignore significant research and widely available information on the subject. Many of his comments, while occasionally politically intriguing, lack empathy for people who experienced trauma.
+ </p>
+ <p>
+ IMO, this is not and has never been a Free Speech issue. I do believe freedom of speech links directly to software freedom: indeed, I see the freedom to publish software under Free licenses as almost a corollary to the freedom of speech. However, we do not need to follow leadership from those whose views we fundamentally disagree. Moreover, organizations need not and should not elevate spokespeople and leaders who speak regularly on unrelated issues that organizations find do not advance their mission, and/or that alienate important constituents. I, like many other software freedom leaders, curtail my public comments on issues not related to <acronym title="Free and Open Source Software">FOSS</acronym>. (Indeed, I would not even be commenting on <em>this issue</em> if it had not become a central issue of concern to the software freedom community.) Leaders have power, and they must exercise the power of their words with <a href="https://lwn.net/Articles/770966/">restraint, not with impunity</a>.
+ </p>
+ <p>
+ RMS has consistently argued that there was a campaign of “prudish intimidation” — seeking to keep him quiet about his views on sexuality. After years of conversing with RMS about how his non-software-freedom views were a distraction, an indulgence, and downright problematic, his general response was to make even more public comments of this nature. The issue is not about RMS' right to say what he believes, nor is it even about whether or not you agree or disagree with RMS' statements. The question is whether an organization should have a designated leader who is on a sustained, public campaign advocating about an unrelated issue that many consider controversial. It really doesn't matter what your view about the controversial issue is; a leader who refuses to stop talking loudly about unrelated issues eventually creates an untenable distraction from the radical activism you're actively trying to advance. The message of universal software freedom is a radical cause; it's basically impossible for one individual to effectively push forward two unrelated controversial agendas at once. In short, the radical message of software freedom became overshadowed by RMS' radical views about sexual morality.
+ </p>
+ <p>
+ And here is where I say the thing that may infuriate many but it's what I believe: I think RMS took a useful step by resigning some of his leadership roles at the FSF. I thank RMS for taking that step, and I wish the FSF Directors well in their efforts to assure that the FSF becomes a welcoming organization to all who care about universal software freedom. The <a href="https://www.fsf.org/about/">FSF's mission</a> is essential to our technological future, and we should all support that mission. I care deeply about that mission myself and have worked and will continue to work in our community in the best interest of the mission.
+ </p>
+ <p>
+ I'm admittedly struggling to find a way to work again with RMS, given his views on sexual morality and his behaviors stemming from those views. I explicitly do not agree with <a href="https://web.archive.org/web/20180919100154/https://stallman.org/antiglossary.html#assult">this “(re-)definition” of sexual assault</a>. Furthermore, I believe uninformed statements about sexual assault are irresponsible and cause harm to victims. #MeToo is <strong><a href="https://web.archive.org/web/20190903050208/https://stallman.org/archives/2019-jul-oct.html#27_August_2019_(Me-too_frenzy)">not a “frenzy”</a></strong>; it is a global movement by individuals who have been harmed seeking to hold both bad actors <em>and</em> society-at-large accountable for ignoring systemic wrongs. Nevertheless, I still am proud of the <a href="https://www.gnu.org/philosophy/freedom-or-power.en.html">essay that I co-wrote with RMS</a> and still find <a href="https://www.gnu.org/gnu/manifesto.en.html">many</a> <a href="https://www.gnu.org/philosophy/free-sw.html">of</a> <a href="https://www.gnu.org/philosophy/why-free.html">RMS'</a> <a href="https://www.gnu.org/philosophy/pragmatic.html">other</a> <a href="https://www.gnu.org/philosophy/microsoft-old.html">essays</a> <a href="https://www.gnu.org/philosophy/gpl-american-way.html">compelling</a>, <a href="https://www.gnu.org/licenses/why-not-lgpl.html">important</a>, <a href="https://www.gnu.org/philosophy/stallman-kth.en.html">and</a> <a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">relevant</a>.
+ </p>
+ <p>
+ I want the FSF to succeed in its mission and enter a new era of accomplishments. I've spent the last 22 years, without a break, dedicating substantial time, effort, care and loyalty to the various FSF roles that I've had: including employee, volunteer, at-large Director, and Voting Member. Even though my duties to the FSF are done, and my relationship with the FSF is no longer formal, I still think the FSF is a valuable institution worth helping and saving, specifically because the FSF was founded for a mission that I deeply support. And we should also realize that RMS — a human being (who is flawed like the rest of us) — invented that mission.
+ </p>
+ <p>
+ As culture change becomes more rapid, I hope we can find reasonable nuance and moderation on our complex analysis about people and their disparate views, while we also hold individuals fully accountable for their actions. That's the difficulty we face in the post-post-modern culture of the early twenty-first century. Most importantly, I believe we must find a way to stand firm for software freedom while also making a safe environment for victims of sexual assault, sexual abuse, gaslighting, and other deplorable actions.
+ </p>
+ <p class="bottomAttributionWithDate">
+ Posted on Tuesday 15 October 2019 at 09:11 by Bradley M. Kuhn.
+ </p>
+ <p class="comments">
+ Submit comments on this post to <a href="mailto:[email protected]">&lt;[email protected]&gt;</a>.
+ </p>
+ <div id="prevlink">
+ <a class="previous" href="/bkuhn/blog/2019/05/23/github-sponsors.html">← <strong>Previous</strong>: Chasing Quick Fixes To Sustainability</a>
+ </div>
+ </div>
+ </div>
+ <p id="footer"></p>
+ <hr />
+ <br />
+ <p>
+ <a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license"><img alt="Creative Commons License" src="http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png" style="border-width:10" /></a> This website and all documents on it are licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0/us/" rel="license">Creative Commons Attribution-Share Alike 3.0 United States License</a> .
+ </p>
+ <hr />
+ <p>
+ <code>#include &lt;std/disclaimer.h&gt;</code><br />
+ <code>use Standard::Disclaimer;</code><br />
+ <code>from standard import disclaimer</code><br />
+ <code>SELECT full_text FROM standard WHERE type = 'disclaimer';</code>
+ </p>
+ <p>
+ Both previously and presently, I have been employed by and/or done work for various organizations that also have views on Free, Libre, and Open Source Software. As should be blatantly obvious, this is my website, not theirs, so please do not assume views and opinions here belong to any such organization. Since I do co-own ebb.org with my wife, it may not be so obvious that these aren't her views and opinions, either.
+ </p>
+ <p align="right">
+ — bkuhn
+ </p>
+ <hr />
+ <p>
+ ebb <sup>℠</sup> is a service mark of Bradley M. Kuhn.
+ </p>
+ <address>
+ <a href="http://ebb.org/bkuhn/">Bradley M. Kuhn</a> <a href="mailto:[email protected]">&lt;[email protected]&gt;</a>
+ </address>
+ </div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html
index 397322e20..d73c3c52c 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-1/expected.html
@@ -2,15 +2,20 @@
<header>
- </header><div>
- <div>
+
+ </header>
+ <div>
<p>Glass cloche terrariums are not only appealing to the eye, but they also preserve a bit of nature in your home and serve as a simple, yet beautiful, piece of art. Closed terrariums are easy to care for, as they retain much of their own moisture and provide a warm environment with a consistent level of humidity. You won’t have to water the terrariums unless you see that the walls are not misting up. Small growing plants that don’t require a lot of light work best such as succulents, ferns, moss, even orchids.</p>
- <figure><img alt="Glass cloche terrariums" data-credit="Lucy Akins " longdesc="http://s3.amazonaws.com/photography.prod.demandstudios.com/16149374-814f-40bc-baf3-ca20f149f0ba.jpg" src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/16149374-814f-40bc-baf3-ca20f149f0ba.jpg" title="Glass cloche terrariums"></img></figure><figcaption> Glass cloche terrariums (Lucy Akins) </figcaption></div>
+ <figure> <img src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/16149374-814f-40bc-baf3-ca20f149f0ba.jpg" alt="Glass cloche terrariums" title="Glass cloche terrariums" data-credit="Lucy Akins " longdesc="http://s3.amazonaws.com/photography.prod.demandstudios.com/16149374-814f-40bc-baf3-ca20f149f0ba.jpg"> </figure>
+ <figcaption> Glass cloche terrariums (Lucy Akins) </figcaption>
+ </div>
+ <div id="relatedContentUpper" data-module="rcp_top">
+ <header class>
+ <h3>Other People Are Reading</h3> </header>
+
</div>
-
- <div>
- <div>
- <div> <p><span>What You'll Need:</span></p><ul><li>Cloche</li>
+ <div> <p><span>What You'll Need:</span></p><ul>
+ <li>Cloche</li>
<li>Planter saucer, small shallow dish or desired platform</li>
<li>Floral foam oasis</li>
<li>Ruler </li>
@@ -20,75 +25,78 @@
<li>Moss</li>
<li>Tweezers</li>
<li>Other small decorative items (optional)</li>
- </ul></div>
- </div>
- </div>
+ </ul>
+ </div>
<div>
- <div>
<div> <p><span>Step 1</span></p><p>Measure the circumference of your cloche and cut the foam oasis about 3/4 inch (2 cm) smaller. Place the foam oasis into a container full of water and allow to soak until it sinks to the bottom. Dig out a hole on the oasis large enough to fit your plant, being careful not to pierce all the way through to the bottom.</p>
</div>
- <figure><img alt="Dig a hole in the oasis." data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/fc249ef6-4d27-41b4-8c21-15f7a8512b50.jpg"></img></figure><figcaption> Dig a hole in the oasis. (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/fc249ef6-4d27-41b4-8c21-15f7a8512b50.jpg" alt="Dig a hole in the oasis." data-credit="Lucy Akins"> </figure>
+ <figcaption> Dig a hole in the oasis. (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 2</span></p><p>Insert your plant into the hole.</p>
</div>
- <figure><img alt="Orchid in foam oasis" data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/aae11d4d-a4aa-4251-a4d9-41023ebf6d84.jpg"></img></figure><figcaption> Orchid in foam oasis (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/aae11d4d-a4aa-4251-a4d9-41023ebf6d84.jpg" alt="Orchid in foam oasis" data-credit="Lucy Akins"> </figure>
+ <figcaption> Orchid in foam oasis (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 3</span></p><p>You can add various plants if you wish.</p>
</div>
- <figure><img alt="Various foliage" data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/7afdfa1e-da74-44b5-b89c-ca8123516272.jpg"></img></figure><figcaption> Various foliage (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/7afdfa1e-da74-44b5-b89c-ca8123516272.jpg" alt="Various foliage" data-credit="Lucy Akins"> </figure>
+ <figcaption> Various foliage (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 4</span></p><p>Using floral pins, attach enough moss around the oasis to cover it.</p>
</div>
- <figure><img alt="Attach moss." data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/4f6612c0-316a-4c74-bb03-cb4e778f6d72.jpg"></img></figure><figcaption> Attach moss. (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/4f6612c0-316a-4c74-bb03-cb4e778f6d72.jpg" alt="Attach moss." data-credit="Lucy Akins"> </figure>
+ <figcaption> Attach moss. (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 5</span></p><p>Gently place the cloche over the oasis. The glass may push some of the moss upward, exposing some of the foam.</p>
</div>
- <figure><img alt="Place cloche over oasis." data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/eeb1e0b4-e573-40a3-8db1-2c76f0b13b84.jpg"></img></figure><figcaption> Place cloche over oasis. (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/eeb1e0b4-e573-40a3-8db1-2c76f0b13b84.jpg" alt="Place cloche over oasis." data-credit="Lucy Akins"> </figure>
+ <figcaption> Place cloche over oasis. (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 6</span></p><p>Simply pull down the moss with tweezers or insert more moss to fill in the empty spaces.</p>
</div>
- <figure><img alt="Rearrange moss." data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/812d4649-4152-4363-97c0-f181d02e709a.jpg"></img></figure><figcaption> Rearrange moss. (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/812d4649-4152-4363-97c0-f181d02e709a.jpg" alt="Rearrange moss." data-credit="Lucy Akins"> </figure>
+ <figcaption> Rearrange moss. (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 7</span></p><p>You can use any platform you wish. In this case, a small saucer was used.</p>
</div>
- <figure><img alt="Place cloche on a platform to sit on." data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/0cb3988c-9318-47d6-bc9c-c798da1ede72.jpg"></img></figure><figcaption> Place cloche on a platform to sit on. (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/default/cme/photography.prod.demandstudios.com/0cb3988c-9318-47d6-bc9c-c798da1ede72.jpg" alt="Place cloche on a platform to sit on." data-credit="Lucy Akins"> </figure>
+ <figcaption> Place cloche on a platform to sit on. (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 8</span></p><p>This particular terrarium rests on a planter saucer and features a small white pumpkin.</p>
</div>
- <figure><img alt="Cloche placed on a terracotta saucer" data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/e3e18f0b-ab2c-4ffb-9988-a1ea63faef8b.jpg"></img></figure><figcaption> Cloche placed on a terracotta saucer (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/e3e18f0b-ab2c-4ffb-9988-a1ea63faef8b.jpg" alt="Cloche placed on a terracotta saucer" data-credit="Lucy Akins"> </figure>
+ <figcaption> Cloche placed on a terracotta saucer (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Step 9</span></p><p>This particular terrarium was placed on a wood slice and a little toy squirrel was placed inside to add a little whimsy.</p>
</div>
- <figure><img alt="Placed on a wooden slice" data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/2cd79f8d-0d16-4573-8861-e47fb74b0638.jpg"></img></figure><figcaption> Placed on a wooden slice (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/2cd79f8d-0d16-4573-8861-e47fb74b0638.jpg" alt="Placed on a wooden slice" data-credit="Lucy Akins"> </figure>
+ <figcaption> Placed on a wooden slice (Lucy Akins) </figcaption>
+ </div>
<div>
- <div>
<div> <p><span>Finished Terrarium</span></p><p>Displayed alone or in a group, these pretty arrangements allow you to add a little nature to your decor or tablescape.</p>
</div>
- <figure><img alt="Cloche terrarium" data-credit="Lucy Akins" src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/78670312-8636-4c42-a75c-3029f7aa6c73.jpg"></img></figure><figcaption> Cloche terrarium (Lucy Akins) </figcaption></div>
- </div>
+ <figure> <img src="http://img-aws.ehowcdn.com/640/cme/photography.prod.demandstudios.com/78670312-8636-4c42-a75c-3029f7aa6c73.jpg" alt="Cloche terrarium" data-credit="Lucy Akins"> </figure>
+ <figcaption> Cloche terrarium (Lucy Akins) </figcaption>
+ </div>
+
+
- <section data-module="rcp_tombstone" id="FeaturedTombstone"><h2>Featured</h2>
+ <section id="FeaturedTombstone" data-module="rcp_tombstone">
+ <h2>Featured</h2>
- </section></div> \ No newline at end of file
+ </section>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html
index ea7d138e1..48823ad84 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ehow-2/expected.html
@@ -1,58 +1,68 @@
-<section data-page-id="inlinetemplate" data-section="body" id="Body">
-
- <header>
- <div data-type="AuthorProfile">
+<div data-type="AuthorProfile">
<div>
- <p><a href="http://fakehost/contributor/gina_robertsgrey/" id="img-follow-tip" target="_top">
- <img data-failover="//img-aws.ehowcdn.com/60x60/ehow-cdn-assets/test15/media/images/authors/missing-author-image.png" onerror="var failover = this.getAttribute('data-failover');&#xA; if (failover) failover = failover.replace(/^https?:/,'');&#xA; var src = this.src ? this.src.replace(/^https?:/,'') : '';&#xA; if (src != failover){&#xA; this.src = failover;&#xA; }" src="http://img-aws.ehowcdn.com/60x60/cme/cme_public_images/www_demandstudios_com/sitelife.studiod.com/ver1.0/Content/images/store/9/2/d9dd6f61-b183-4893-927f-5b540e45be91.Small.jpg"></img></a></p>
+ <p><a id="img-follow-tip" href="http://fakehost/contributor/gina_robertsgrey/" target="_top">
+ <img src="http://img-aws.ehowcdn.com/60x60/cme/cme_public_images/www_demandstudios_com/sitelife.studiod.com/ver1.0/Content/images/store/9/2/d9dd6f61-b183-4893-927f-5b540e45be91.Small.jpg" data-failover="//img-aws.ehowcdn.com/60x60/ehow-cdn-assets/test15/media/images/authors/missing-author-image.png" onerror="var failover = this.getAttribute('data-failover');
+ if (failover) failover = failover.replace(/^https?:/,'');
+ var src = this.src ? this.src.replace(/^https?:/,'') : '';
+ if (src != failover){
+ this.src = failover;
+ }"> </a></p>
</div>
- <p><time datetime="2016-09-14T07:07:00-04:00" itemprop="dateModified">Last updated September 14, 2016</time></p>
+ <p><time datetime="2016-09-14T07:07:00-04:00" itemprop="dateModified">Last updated September 14, 2016</time>
+ </p>
- </div>
-
- </header><div>
- <article data-type="article"><div>
- <div>
+ </div><div>
+ <article data-type="article">
+ <div>
<div>
<p>Graduation parties are a great way to commemorate the years of hard work teens and college co-eds devote to education. They’re also costly for mom and dad.</p>
<p>The average cost of a graduation party in 2013 was a whopping $1,200, according to Graduationparty.com; $700 of that was allocated for food. However that budget was based on Midwestern statistics, and parties in urban areas like New York City are thought to have a much higher price tag.</p>
<p>Thankfully, there are plenty of creative ways to trim a little grad party fat without sacrificing any of the fun or celebratory spirit.</p>
</div>
- <figure><img alt="Graduation" data-credit="Mike Watson Images/Moodboard/Getty " data-pin-ehow-hover="true" data-pin-no-hover="true" longdesc="http://s3.amazonaws.com/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/2F/86/5547EF62-EAF5-4256-945D-0496F61C862F/5547EF62-EAF5-4256-945D-0496F61C862F.jpg" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/2F/86/5547EF62-EAF5-4256-945D-0496F61C862F/5547EF62-EAF5-4256-945D-0496F61C862F.jpg" title="Graduation"></img></figure><figcaption>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/2F/86/5547EF62-EAF5-4256-945D-0496F61C862F/5547EF62-EAF5-4256-945D-0496F61C862F.jpg" alt="Graduation" title="Graduation" data-credit="Mike Watson Images/Moodboard/Getty " longdesc="http://s3.amazonaws.com/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/2F/86/5547EF62-EAF5-4256-945D-0496F61C862F/5547EF62-EAF5-4256-945D-0496F61C862F.jpg" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
(Mike Watson Images/Moodboard/Getty)
- </figcaption></div>
- </div>
+ </figcaption>
+ </div>
<span>
<span>
<div>
-<div>
<p><span><p>Parties hosted at restaurants, clubhouses and country clubs eliminate the need to spend hours cleaning up once party guests have gone home. But that convenience comes with a price tag. A country club may charge as much as $2,000 for room rental and restaurant food and beverage will almost always cost more than food prepped and served at home.</p></span> </p>
- <figure><img alt="Save money hosting the party at home." data-credit="Thomas Jackson/Digital Vision/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/FE/CB/121569D2-6984-4B2F-83C4-9D2D9A27CBFE/121569D2-6984-4B2F-83C4-9D2D9A27CBFE.jpg"></img></figure><figcaption>
- Thomas Jackson/Digital Vision/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/FE/CB/121569D2-6984-4B2F-83C4-9D2D9A27CBFE/121569D2-6984-4B2F-83C4-9D2D9A27CBFE.jpg" alt="Save money hosting the party at home." data-credit="Thomas Jackson/Digital Vision/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Thomas Jackson/Digital Vision/Getty Images </figcaption>
</div>
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>Instead of hiring a DJ, use your iPod or Smartphone to spin the tunes. Both easily hook up to most speakers or mp3 compatible docks to play music from your music library. Or download Pandora, the free online radio app, and play hours of music for free.</p>
<p>Personalize the music with a playlist of the grad’s favorite songs or songs that were big hits during his or her years in school.</p></span> </p>
- <figure><img alt="Online radio can take the place of a hired DJ." data-credit="Spencer Platt/Getty Images News/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/DF/FC/A05B0252-BD73-4BC7-A09A-96F0A504FCDF/A05B0252-BD73-4BC7-A09A-96F0A504FCDF.jpg"></img></figure><figcaption>
- Spencer Platt/Getty Images News/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/DF/FC/A05B0252-BD73-4BC7-A09A-96F0A504FCDF/A05B0252-BD73-4BC7-A09A-96F0A504FCDF.jpg" alt="Online radio can take the place of a hired DJ." data-credit="Spencer Platt/Getty Images News/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Spencer Platt/Getty Images News/Getty Images </figcaption>
</div>
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>Avoid canned drinks, which guests often open, but don't finish. Serve pitchers of tap water with lemon and cucumber slices or sliced strawberries for an interesting and refreshing flavor. Opt for punches and non-alcoholic drinks for high school graduates that allow guests to dole out the exact amount they want to drink.</p></span> </p>
- <figure><img alt="Serve drinks in pitchers, not in cans." data-credit="evgenyb/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/EB/DB/8A04CCA7-3255-4225-B59A-C41441F8DBEB/8A04CCA7-3255-4225-B59A-C41441F8DBEB.jpg"></img></figure><figcaption>
- evgenyb/iStock/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/EB/DB/8A04CCA7-3255-4225-B59A-C41441F8DBEB/8A04CCA7-3255-4225-B59A-C41441F8DBEB.jpg" alt="Serve drinks in pitchers, not in cans." data-credit="evgenyb/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ evgenyb/iStock/Getty Images </figcaption>
</div>
</span>
@@ -60,65 +70,79 @@
<span>
<span>
<div>
-<div>
<p><span><p>Instead of inviting everyone you – and the graduate – know or ever knew, scale back the guest list. Forgo inviting guests that you or your grad haven't seen for eons. There is no reason to provide provisions for people who are essentially out of your lives. Sticking to a small, but personal, guest list allows more time to mingle with loved ones during the party, too.</p></span> </p>
- <figure><img alt="Limit guests to those close to the graduate." data-credit="Kane Skennar/Photodisc/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/94/10/08035476-0167-4A03-AADC-13A7E7AA1094/08035476-0167-4A03-AADC-13A7E7AA1094.jpg"></img></figure><figcaption>
- Kane Skennar/Photodisc/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/94/10/08035476-0167-4A03-AADC-13A7E7AA1094/08035476-0167-4A03-AADC-13A7E7AA1094.jpg" alt="Limit guests to those close to the graduate." data-credit="Kane Skennar/Photodisc/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Kane Skennar/Photodisc/Getty Images </figcaption>
</div>
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>See if your grad and his best friend, girlfriend or close family member would consider hosting a joint party. You can split some of the expenses, especially when the two graduates share mutual friends. You'll also have another parent to bounce ideas off of and to help you stick to your budget when you're tempted to splurge.</p></span> </p>
- <figure><img alt="Throw a joint bash for big savings." data-credit="Mike Watson Images/Moodboard/Getty" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/06/49/4AD62696-FC95-4DA2-8351-42740C7B4906/4AD62696-FC95-4DA2-8351-42740C7B4906.jpg"></img></figure><figcaption>
- Mike Watson Images/Moodboard/Getty </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/06/49/4AD62696-FC95-4DA2-8351-42740C7B4906/4AD62696-FC95-4DA2-8351-42740C7B4906.jpg" alt="Throw a joint bash for big savings." data-credit="Mike Watson Images/Moodboard/Getty" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Mike Watson Images/Moodboard/Getty </figcaption>
</div>
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>Skip carving stations of prime rib and jumbo shrimp as appetizers, especially for high school graduation parties. Instead, serve some of the graduate's favorite side dishes that are cost effective, like a big pot of spaghetti with breadsticks. Opt for easy and simple food such as pizza, finger food and mini appetizers. </p>
<p>Avoid pre-packaged foods and pre-made deli platters. These can be quite costly. Instead, make your own cheese and deli platters for less than half the cost of pre-made.</p></span> </p>
- <figure><img alt="Cost effective appetizers are just as satisfying as pre-made deli platters." data-credit="Mark Stout/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/D0/51/B6AED06C-5E19-4A26-9AAD-0E175F6251D0/B6AED06C-5E19-4A26-9AAD-0E175F6251D0.jpg"></img></figure><figcaption>
- Mark Stout/iStock/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/D0/51/B6AED06C-5E19-4A26-9AAD-0E175F6251D0/B6AED06C-5E19-4A26-9AAD-0E175F6251D0.jpg" alt="Cost effective appetizers are just as satisfying as pre-made deli platters." data-credit="Mark Stout/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Mark Stout/iStock/Getty Images </figcaption>
</div>
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>Instead of an evening dinner party, host a grad lunch or all appetizers party. Brunch and lunch fare or finger food costs less than dinner. Guests also tend to consume less alcohol in the middle of the day, which keeps cost down.</p></span> </p>
- <figure><img alt="A brunch gathering will cost less than a dinner party." data-credit="Mark Stout/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/35/B4/DD5FD05A-B631-4AFE-BC8F-FDACAD1EB435/DD5FD05A-B631-4AFE-BC8F-FDACAD1EB435.jpg"></img></figure><figcaption>
- Mark Stout/iStock/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/35/B4/DD5FD05A-B631-4AFE-BC8F-FDACAD1EB435/DD5FD05A-B631-4AFE-BC8F-FDACAD1EB435.jpg" alt="A brunch gathering will cost less than a dinner party." data-credit="Mark Stout/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ Mark Stout/iStock/Getty Images </figcaption>
+ </div>
+ <div id="relatedContentUpper" data-module="rcp_top">
+ <header class>
+ <h3>Other People Are Reading</h3>
+ </header>
+
</div>
-
</span>
</span>
<span>
<span>
<div>
-<div>
<p><span><p>Decorate your party in the graduate's current school colors or the colors of the school he or she will be headed to next. Décor that is not specifically graduation-themed may cost a bit less, and any leftovers can be re-used for future parties, picnics and events.</p></span> </p>
- <figure><img alt="Theme the party by color without graduation-specific decor." data-credit="jethuynh/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true" src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/A1/FA/2C368B34-8F6A-45F6-9DFC-0B0C4E33FAA1/2C368B34-8F6A-45F6-9DFC-0B0C4E33FAA1.jpg"></img></figure><figcaption>
- jethuynh/iStock/Getty Images </figcaption></div>
+ <figure>
+ <img src="http://img-aws.ehowcdn.com/640/cme/cme_public_images/www_ehow_com/cdn-write.demandstudios.com/upload/image/A1/FA/2C368B34-8F6A-45F6-9DFC-0B0C4E33FAA1/2C368B34-8F6A-45F6-9DFC-0B0C4E33FAA1.jpg" alt="Theme the party by color without graduation-specific decor." data-credit="jethuynh/iStock/Getty Images" data-pin-ehow-hover="true" data-pin-no-hover="true">
+ </figure>
+ <figcaption>
+ jethuynh/iStock/Getty Images </figcaption>
</div>
</span>
</span>
<h2>
- <a href="https://www.google.com/adsense/support/bin/request.py?contact=abg_afc&amp;url=http://ehow.com/&amp;hl=en&amp;client=ehow&amp;gl=US" target="_blank">Related Searches</a>
+ <a target="_blank" href="https://www.google.com/adsense/support/bin/request.py?contact=abg_afc&amp;url=http://ehow.com/&amp;hl=en&amp;client=ehow&amp;gl=US">Related Searches</a>
</h2>
<p>Promoted By Zergnet</p>
- </article></div>
-
- </section> \ No newline at end of file
+ </article>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html
index 327e6503c..4dc9164f9 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/embedded-videos/expected.html
@@ -1,19 +1,20 @@
<article>
+ <h2>Lorem</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- <h2>Videos</h2>
+
<p>At root</p>
- <iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" width="560"></iframe>
- <iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" width="560"></iframe>
- <iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/32246206?color=ffffff+title=0+byline=0+portrait=0" webkitallowfullscreen="" width="500"></iframe>
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen></iframe>
+ <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen></iframe>
+ <iframe src="https://player.vimeo.com/video/32246206?color=ffffff+title=0+byline=0+portrait=0" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
<p>In a paragraph</p>
- <p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" width="560"></iframe></p>
+ <p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen></iframe></p>
<p>In a div</p>
- <p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" width="560"></iframe></p>
+ <p><iframe width="560" height="315" src="https://www.youtube.com/embed/LtOGa5M8AuU" frameborder="0" allowfullscreen></iframe></p>
<h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json
index f3993407b..315467ff9 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected-images.json
@@ -1,14 +1,13 @@
[
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C943%2C0%2C0&quality=85&format=jpg&resize=1600%2C943&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Fd457f269d1400106a402302a310de800%2F205826071%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=9fa7b29452763464190c6edff6822489df516d1b",
- "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=45%2C45&quality=80&image_uri=http%3A%2F%2Fwww.blogcdn.com%2Fwww.engadget.com%2Fmedia%2F2016%2F03%2Fdevindra-engadget-headshot-small.jpg&client=cbc79c14efcebee57402&signature=e6ffba7468c380581b6589a70ce5d7c1ec40cd1d",
- "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&client=cbc79c14efcebee57402&signature=9bb08b52e12de8e4060f863a52c613489529818d",
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1067%2C0%2C0&quality=85&format=jpg&resize=1600%2C1067&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=c0f2d36259c2c1decfb60aae364527cda2560d4a",
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C949%2C0%2C0&quality=85&format=jpg&resize=1600%2C949&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&client=a1acac3e1b3290917d92&signature=9913883753141e7df322616bfe0bc41c6ecd80c8",
- "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&client=cbc79c14efcebee57402&signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce",
- "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&client=cbc79c14efcebee57402&signature=0adca80fc8ee26a7353be639082881450a5ad49f",
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8",
- "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&client=cbc79c14efcebee57402&signature=38c95635c7aad58a8a48038e05589f5cf35b1e28",
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7",
- "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&client=cbc79c14efcebee57402&signature=1e9bd192add2772bc842a34e67b7572cfd1b265a",
- "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1028%2C0%2C0&quality=85&format=jpg&resize=1600%2C1028&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&client=a1acac3e1b3290917d92&signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0"
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C943%2C0%2C0&quality=85&format=jpg&resize=1600%2C943&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Fd457f269d1400106a402302a310de800%2F205826071%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=9fa7b29452763464190c6edff6822489df516d1b",
+ "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&client=cbc79c14efcebee57402&signature=9bb08b52e12de8e4060f863a52c613489529818d",
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1067%2C0%2C0&quality=85&format=jpg&resize=1600%2C1067&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=c0f2d36259c2c1decfb60aae364527cda2560d4a",
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C949%2C0%2C0&quality=85&format=jpg&resize=1600%2C949&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&client=a1acac3e1b3290917d92&signature=9913883753141e7df322616bfe0bc41c6ecd80c8",
+ "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&client=cbc79c14efcebee57402&signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce",
+ "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&client=cbc79c14efcebee57402&signature=0adca80fc8ee26a7353be639082881450a5ad49f",
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&client=a1acac3e1b3290917d92&signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8",
+ "https:\/\/o.aolcdn.com\/images\/dims?thumbnail=980%2C653&quality=80&image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&client=cbc79c14efcebee57402&signature=38c95635c7aad58a8a48038e05589f5cf35b1e28",
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C900%2C0%2C0&quality=85&format=jpg&resize=1600%2C900&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&client=a1acac3e1b3290917d92&signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7",
+ "https:\/\/o.aolcdn.com\/images\/dims?resize=980%2C640&quality=100&image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&client=cbc79c14efcebee57402&signature=1e9bd192add2772bc842a34e67b7572cfd1b265a",
+ "https:\/\/o.aolcdn.com\/images\/dims?crop=1600%2C1028%2C0%2C0&quality=85&format=jpg&resize=1600%2C1028&image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&client=a1acac3e1b3290917d92&signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html
index 44a2afe0d..17496cc24 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/engadget/expected.html
@@ -1,39 +1,4 @@
-<div role="main"><nav data-behavior="ContextNav" data-context-nav-offset="200">
- </nav><header>
- <p>
-
- <h2> But only hardcore
- gamers will appreciate it. </h2>
- </p>
- <div>
- <div>
- <div>
-
- <div>
- <p><a href="http://fakehost/about/editors/devindra-hardawar/">
- <img src="https://o.aolcdn.com/images/dims?thumbnail=45%2C45&amp;quality=80&amp;image_uri=http%3A%2F%2Fwww.blogcdn.com%2Fwww.engadget.com%2Fmedia%2F2016%2F03%2Fdevindra-engadget-headshot-small.jpg&amp;client=cbc79c14efcebee57402&amp;signature=e6ffba7468c380581b6589a70ce5d7c1ec40cd1d"></img></a></p>
- </div>
-
- </div>
-
-
-
- </div>
- </div>
- </header><div data-behavior="BreakoutsHandler">
- <div>
-
- <div>
- <article><div data-behavior="trigger_contents_nav" id="page_body">
- <div>
-
- <div data-behavior="FitVids ">
-
-
- <div>
- <div>
- <div>
- <div data-behavior="Dropcap">
+<div data-behavior="Dropcap">
<p>The <a href="https://www.engadget.com/2017/06/13/the-xbox-one-x-is-aspirational-in-the-purest-sense-of-the-word/">Xbox
One X</a> is the ultimate video game system. It sports
more horsepower than any system ever. And it plays more
@@ -49,35 +14,22 @@
the $279 <a href="https://www.engadget.com/2016/08/02/xbox-one-s-review/">Xbox
One S</a>. </p>
- </div>
- </div>
- </div>
- </div>
-
- <div>
- <div>
- <div>
- <section><h4> Gallery: Xbox One
+ </div><section>
+ <h4> Gallery: Xbox One
X | 14 Photos </h4>
- <div data-behavior="lightbox_trigger" data-eng-bang="{&quot;gallery&quot;:803271,&quot;slide&quot;:7142088,&quot;index&quot;:0}" data-eng-mn="93511844" data-engadget-slideshow-id="803271"><p><a data-eng-bang="{&quot;gallery&quot;:803271,&quot;slide&quot;:7142088,&quot;index&quot;:0}" data-engadget-slide-id="7142088" data-index="0" href="#">
- <img src="https://o.aolcdn.com/images/dims?thumbnail=980%2C653&amp;quality=80&amp;image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&amp;client=cbc79c14efcebee57402&amp;signature=9bb08b52e12de8e4060f863a52c613489529818d"></img></a></p>
- </div>
- </section></div>
- </div>
- </div>
-
-
- <div>
- <div>
- <div>
+ <div data-behavior="lightbox_trigger" data-engadget-slideshow-id="803271" data-eng-bang="{&quot;gallery&quot;:803271,&quot;slide&quot;:7142088,&quot;index&quot;:0}" data-eng-mn="93511844"><p><a href="#" data-index="0" data-engadget-slide-id="7142088" data-eng-bang="{&quot;gallery&quot;:803271,&quot;slide&quot;:7142088,&quot;index&quot;:0}">
+ <img src="https://o.aolcdn.com/images/dims?thumbnail=980%2C653&amp;quality=80&amp;image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F208%2F8%2FS7142088%2Fslug%2Fl%2Fxbox-one-x-review-gallery-1-1.jpg&amp;client=cbc79c14efcebee57402&amp;signature=9bb08b52e12de8e4060f863a52c613489529818d">
+ </a></p>
+
+ </div>
+ </section><div>
<div>
-
- <div>
<div>
- <ul><li>Most
+ <ul>
+ <li>Most
powerful hardware ever in a home console
</li>
<li>Solid
@@ -86,10 +38,12 @@
<li>4K Blu-ray
drive is great for movie fans
</li>
- </ul></div>
+ </ul>
+ </div>
<div>
- <ul><li>Expensive
+ <ul>
+ <li>Expensive
</li>
<li>Not worth
it if you don’t have a 4K TV
@@ -97,9 +51,9 @@
<li>Still no VR
support
</li>
- </ul></div>
+ </ul>
+ </div>
</div>
- </div>
<div>
<p>As promised, the Xbox One X is the
@@ -108,17 +62,11 @@
PlayStation 4 Pro. 4K/HDR enhanced games look great, but
it’s lack of VR is disappointing in 2017.</p>
</div>
- </div>
- </div>
- </div>
- <div>
+ </div><div xmlns:xlink="http://www.w3.org/1999/xlink">
<div>
- <div>
- <div>
- <div>
<h3>Hardware</h3>
- <p><img alt="" data-credit="Devindra Hardawar/AOL" data-mep="2181678" src="https://o.aolcdn.com/images/dims?crop=1600%2C1067%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C1067&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=c0f2d36259c2c1decfb60aae364527cda2560d4a"></img></p>
+ <p><img data-credit="Devindra Hardawar/AOL" data-mep="2181678" src="https://o.aolcdn.com/images/dims?crop=1600%2C1067%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C1067&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F93beb86758ae1cf95721699e1e006e35%2F205826074%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B7.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=c0f2d36259c2c1decfb60aae364527cda2560d4a" alt></p>
<p>Despite all the power inside, the One X is
Microsoft's smallest console to date. It looks
similar to the Xbox One S, except it has an entirely
@@ -136,7 +84,7 @@
That additional horsepower means the Xbox One X can
run more games in full native 4K than the Sony's
console.</p>
- <p><img alt="" data-credit="Devindra Hardawar/AOL" data-mep="2182489" src="https://o.aolcdn.com/images/dims?crop=1600%2C949%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C949&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=9913883753141e7df322616bfe0bc41c6ecd80c8"></img></p>
+ <p><img data-credit="Devindra Hardawar/AOL" data-mep="2182489" src="https://o.aolcdn.com/images/dims?crop=1600%2C949%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C949&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F9ece7fdad1e7025dec06ac9bf98688d0%2F205826075%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B5.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=9913883753141e7df322616bfe0bc41c6ecd80c8" alt></p>
<p>Along the front, there's the slot-loading 4K Blu-ray
drive, a physical power button, a single USB port
and a controller pairing button. And around back,
@@ -147,22 +95,13 @@
Kinect around, you'll need to use a USB adapter to
plug it in.</p>
</div>
+ <div data-engadget-breakout-type="image">
+ <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&amp;client=cbc79c14efcebee57402&amp;signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce">
+ <figcaption><span>Devindra Hardawar/AOL</span>
+ </figcaption>
+ </figure>
</div>
- </div>
- </div>
<div>
- <div>
-
-
- <div data-engadget-breakout-type="image">
- <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1599%252C1043%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1043%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F8b98ec8f6649158fe7448ac2f2695ac5%252F205826072%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B6.jpg%26client%3Da1acac3e1b3290917d92%26signature%3D353dad1308f98c2c9dfc82c58a540a8b2f1fe63c&amp;client=cbc79c14efcebee57402&amp;signature=60b7c061460d0d45f5d367b8a9c62978af6b76ce"></img><figcaption><span>Devindra Hardawar/AOL</span>
- </figcaption></figure></div>
- </div>
- </div>
- <div>
- <div>
- <div>
- <div>
<p>The console's controller hasn't changed since its
last mini-upgrade with the Xbox One S. That revision
rounded out its seams, improved bumper performance
@@ -176,22 +115,13 @@
has rechargeable controllers.</p>
<h3>In use</h3>
</div>
+ <div data-engadget-breakout-type="image">
+ <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&amp;client=cbc79c14efcebee57402&amp;signature=0adca80fc8ee26a7353be639082881450a5ad49f">
+ <figcaption><span>Devindra Hardawar/AOL</span>
+ </figcaption>
+ </figure>
</div>
- </div>
- </div>
- <div>
- <div>
-
-
- <div data-engadget-breakout-type="image">
- <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C900%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C900%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252F1885534bd201fc37481b806645c1fc8b%252F205828119%252FXbox%252Bone%252BX%252Bscreenshot%252Bgallery%252B8.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Df63cf67c88b37fd9424855984e45f6b950c8c11a&amp;client=cbc79c14efcebee57402&amp;signature=0adca80fc8ee26a7353be639082881450a5ad49f"></img><figcaption><span>Devindra Hardawar/AOL</span>
- </figcaption></figure></div>
- </div>
- </div>
<div>
- <div>
- <div>
- <div>
<p>You won't find any major differences between the One
X and the last Xbox at first — aside from a more
dramatic startup sequence. Navigating the Xbox
@@ -223,36 +153,13 @@
times were on-par with what I've seen with the game
on the Xbox One S.</p>
</div>
- </div>
- </div>
- </div>
- <div>
- <div>
- <div data-engadget-breakout-type="e2ehero">
-
- <div>
- <div>
- <div>
- <div>
+ <div data-engadget-breakout-type="e2ehero">
- <figure><img src="https://o.aolcdn.com/images/dims?crop=1600%2C900%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C900&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8"></img><div>
- <div>
- <div>
-
- </div>
- </div>
- </div>
- </figure></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
+ <figure><img src="https://o.aolcdn.com/images/dims?crop=1600%2C900%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C900&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F8352a8a14e88e2ca2ba5be4d8381a055%2F205828115%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B1.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=d2ccb22e0eaabeb05bfe46e83dbe26fd07f01da8">
+
+ </figure>
+ </div>
<div>
- <div>
- <div>
- <div>
<p>You can also play in Performance mode, which bumps
the frame rate up to 60FPS and uses higher quality
graphical effects, while rendering it lower in
@@ -278,25 +185,17 @@
levels of bloom lighting and shadow detail.</p>
</div>
- </div>
- </div>
- </div>
- <div>
- <div>
- <div data-engadget-breakout-type="gallery">
- <section><h3> Gallery: Xbox
+ <section data-engadget-breakout-type="gallery">
+ <h3> Gallery: Xbox
One X screenshots | 9 Photos </h3>
- <div data-behavior="lightbox_trigger" data-eng-bang="{&quot;gallery&quot;:803330,&quot;slide&quot;:7142924}" data-eng-mn="93511844" data-engadget-slideshow-id="803330"><p><a data-eng-bang="{&quot;gallery&quot;:803330,&quot;slide&quot;:7142924}" data-engadget-slide-id="7142924" data-index="0" href="#">
- <img src="https://o.aolcdn.com/images/dims?thumbnail=980%2C653&amp;quality=80&amp;image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&amp;client=cbc79c14efcebee57402&amp;signature=38c95635c7aad58a8a48038e05589f5cf35b1e28"></img></a></p>
- </div>
- </section></div>
- </div>
- </div>
+ <div data-behavior="lightbox_trigger" data-engadget-slideshow-id="803330" data-eng-bang="{&quot;gallery&quot;:803330,&quot;slide&quot;:7142924}" data-eng-mn="93511844"><p><a href="#" data-index="0" data-engadget-slide-id="7142924" data-eng-bang="{&quot;gallery&quot;:803330,&quot;slide&quot;:7142924}">
+ <img src="https://o.aolcdn.com/images/dims?thumbnail=980%2C653&amp;quality=80&amp;image_uri=https%3A%2F%2Fs.blogcdn.com%2Fslideshows%2Fimages%2Fslides%2F714%2F292%2F4%2FS7142924%2Fslug%2Fl%2Fxbox-one-x-screenshot-gallery-2-1.jpg&amp;client=cbc79c14efcebee57402&amp;signature=38c95635c7aad58a8a48038e05589f5cf35b1e28">
+ </a></p>
+
+ </div>
+ </section>
<div>
- <div>
- <div>
- <div>
<p><em>Killer Instinct</em> and <em>Super Lucky's
Tale</em> run in 4K at a smooth 60FPS. They both
looked and played better than their standard
@@ -329,36 +228,13 @@
Basically, don't expect your entire 360 library to
get enhanced.</p>
</div>
- </div>
- </div>
- </div>
- <div>
- <div>
- <div data-engadget-breakout-type="e2ehero">
-
- <div>
- <div>
- <div>
- <div>
+ <div data-engadget-breakout-type="e2ehero">
- <figure><img src="https://o.aolcdn.com/images/dims?crop=1600%2C900%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C900&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7"></img><div>
- <div>
- <div>
-
- </div>
- </div>
- </div>
- </figure></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
+ <figure><img src="https://o.aolcdn.com/images/dims?crop=1600%2C900%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C900&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2Facb08903fbe26ad77b80db8c8e7e8fb1%2F205828118%2FXbox%2Bone%2BX%2Bscreenshot%2Bgallery%2B7.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=21630fa5ec6d8fdce2c35f7e1f652636a2d8efe7">
+
+ </figure>
+ </div>
<div>
- <div>
- <div>
- <div>
<p>Even if a game isn't specifically tuned for the new
console, Microsoft says you might still see some
performance improvements. The PlayStation 4 Pro,
@@ -376,7 +252,7 @@
more widely supported, but it would have been nice
to see Dolby's, too.</p>
<p>
- <iframe allowfullscreen="" frameborder="0" gesture="media" height="360" src="https://www.youtube.com/embed/c8aFcHFu8QM" width="640"></iframe>
+ <iframe allowfullscreen frameborder="0" gesture="media" height="360" src="https://www.youtube.com/embed/c8aFcHFu8QM" width="640"></iframe>
</p>
<p>And speaking of Dolby technology, Microsoft is also
highlighting Atmos support on the One X, just like
@@ -402,22 +278,13 @@
PlayStation VR.</p>
<h3>Pricing and the competition</h3>
</div>
+ <div data-engadget-breakout-type="image">
+ <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&amp;client=cbc79c14efcebee57402&amp;signature=1e9bd192add2772bc842a34e67b7572cfd1b265a">
+ <figcaption><span>Devindra Hardawar/AOL</span>
+ </figcaption>
+ </figure>
</div>
- </div>
- </div>
<div>
- <div>
-
-
- <div data-engadget-breakout-type="image">
- <figure><img src="https://o.aolcdn.com/images/dims?resize=980%2C640&amp;quality=100&amp;image_uri=https%3A%2F%2Fo.aolcdn.com%2Fimages%2Fdims%3Fcrop%3D1600%252C1027%252C0%252C0%26quality%3D85%26format%3Djpg%26resize%3D1600%252C1027%26image_uri%3Dhttp%253A%252F%252Fo.aolcdn.com%252Fhss%252Fstorage%252Fmidas%252Fa2c8ba1caccdbb9e0559797e5141eafd%252F205826078%252FXbox%252BOne%252BX%252Breview%252Bgallery%252B11.jpg%26client%3Da1acac3e1b3290917d92%26signature%3Da11bcddced805c6e3698f8ce0494102aef057265&amp;client=cbc79c14efcebee57402&amp;signature=1e9bd192add2772bc842a34e67b7572cfd1b265a"></img><figcaption><span>Devindra Hardawar/AOL</span>
- </figcaption></figure></div>
- </div>
- </div>
- <div>
- <div>
- <div>
- <div>
<p>The biggest knock against the Xbox One X is its $500
price. The PS4 Pro launched at $400 last year, and
there's a good chance we'll see plenty of deals
@@ -449,7 +316,7 @@
PC, you won't be missing out on much by ditching
consoles.</p>
<h3>Wrap-up</h3>
- <p><img alt="" data-credit="Devindra Hardawar/AOL" data-mep="2181681" src="https://o.aolcdn.com/images/dims?crop=1600%2C1028%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C1028&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0"></img></p>
+ <p><img data-credit="Devindra Hardawar/AOL" data-mep="2181681" src="https://o.aolcdn.com/images/dims?crop=1600%2C1028%2C0%2C0&amp;quality=85&amp;format=jpg&amp;resize=1600%2C1028&amp;image_uri=http%3A%2F%2Fo.aolcdn.com%2Fhss%2Fstorage%2Fmidas%2F5396460ef8b6bde7fb7272d9e66a7701%2F205826076%2FXbox%2BOne%2BX%2Breview%2Bgallery%2B9.jpg&amp;client=a1acac3e1b3290917d92&amp;signature=f5b5b4b986c2f8b5031a4469ae0ecec82aff65b0" alt></p>
<p>Ultimately, the Xbox One X offers some major
performance upgrades that gamers will notice --
especially if you're coming from an original Xbox
@@ -459,21 +326,6 @@
that will matter. It's exactly what the company
promised: the fastest game console ever made.</p>
</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </article></div>
- </div>
- </div>
-
- <p>
- <h2> From around the web </h2>
- </p>
-
-
- </div> \ No newline at end of file
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-images.json
new file mode 100644
index 000000000..a44968377
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-images.json
@@ -0,0 +1,3 @@
+[
+ "https:\/\/f.i.uol.com.br\/fotografia\/2018\/12\/21\/15454034955c1cfc67131dc_1545403495_3x2_rt.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-metadata.json
new file mode 100644
index 000000000..4d126413d
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Bruno (Henrique Zecchin) Rodrigues",
+ "Direction": null,
+ "Excerpt": "Na ocasi\u00e3o, t\u00e9cnico do Corinthians entregou r\u00e9plica do trof\u00e9u ao ex-presidente",
+ "Image": "https:\/\/f.i.uol.com.br\/fotografia\/2018\/12\/21\/15454034955c1cfc67131dc_1545403495_3x2_rt.jpg",
+ "Title": "Tite diz que errou ao levar ta\u00e7a da Libertadores a Lula em 2012",
+ "SiteName": "Folha de S.Paulo"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected.html
new file mode 100644
index 000000000..13f3ac3e3
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/expected.html
@@ -0,0 +1,24 @@
+<div data-share-text data-news-content-text data-disable-copy data-continue-reading data-continue-reading-hide-others=".js-continue-reading-hidden" itemprop="articleBody">
+ <p>
+ Após rechaçar <a href="https://www1.folha.uol.com.br/esporte/2018/12/tite-se-recusa-a-encontrar-bolsonaro-antes-da-disputa-da-copa-america.shtml">um encontro da seleção brasileira com o presidente eleito Jair</a> <a href="https://www1.folha.uol.com.br/esporte/2018/12/tite-se-recusa-a-encontrar-bolsonaro-antes-da-disputa-da-copa-america.shtml">Bolsonaro</a>, o técnico Tite declarou que errou ao levar a taça da Copa Libertadores de 2012, conquistada pelo Corinthians, ao ex-presidente Luiz Inácio Lula da Silva.
+ </p>
+ <p>
+ Ao lado de representantes do clube paulista, o atual comandante do Brasil ainda entregou uma réplica do troféu a Lula.
+ </p>
+ <p>
+ "Em 2012 eu errei. Ele não era presidente, mas fui ao Instituto e mandei felicitações por um aniversário. Não me posicionei politicamente. Não tenho partido político, tenho sim a torcida para que o Brasil seja melhor em igualdade social. E que nossas prioridades sejam educação e punição. Que seja dada a possibilidade de estudo ao garoto de São Braz, que não tem chão batido para ir à escola, ou da periferia de Caixas ou do morro do Rio de Janeiro. Seja dada a ele a prioridade de estudo e não a outras situações", falou Tite ao programa "Grande Círculo", que ainda irá ao ar no SporTV.
+ </p>
+ <p>
+ Na ocasião, Tite e outros representantes do Corinthians <a href="https://www1.folha.uol.com.br/poder/1124743-corinthians-leva-a-taca-da-libertadores-para-lula.shtml">foram ao Instituto Lula para mostrar a taça</a> original da Libertadores ao ex-presidente.
+ </p>
+
+ <p>
+ O assunto foi levantado&nbsp;porque recentemente Tite foi questionado se aceitaria um encontro da seleção brasileira com Bolsonaro em uma conquista de título ou <a href="https://www1.folha.uol.com.br/esporte/2018/12/selecao-brasileira-jogara-duas-vezes-em-sao-paulo-na-copa-america.shtml">antes da Copa América de 2019</a>, por exemplo. O treinador deixou claro que preferiria evitar esse tipo de formalidade.
+ </p>
+ <p>
+ Apesar disso, Tite não questionou a ação de Palmeiras e CBF, que <a href="https://www1.folha.uol.com.br/esporte/2018/12/cbf-usa-festa-do-palmeiras-para-se-aproximar-de-governo-bolsonaro.shtml">convidaram Bolsonaro para a festa do título do Campeonato Brasileiro</a>. O presidente eleito até levantou a taça conquistada pelo clube alviverde.
+ </p>
+ <p>
+ "Em 2012 eu fiz e errei. O protocolo e a situação gerada no jogo do Palmeiras são fatos de opinião pessoal. CBF e Palmeiras, enquanto instituições têm a opinião. Errei lá atrás, não faria com o presidente antes da Copa e nem agora porque entendo que misturar esporte e política não é legal. Fiz errado lá atrás? Sim. Faria de novo? Não", acrescentou o comandante.
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/source.html
new file mode 100644
index 000000000..03f749c1f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/folha/source.html
@@ -0,0 +1,2518 @@
+<!DOCTYPE html>
+<html lang="pt-BR" data-version="prod@5391c020" xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-BR">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <meta property="desliga:paywall" content="false" />
+ <title>
+ Tite diz que errou ao levar taça da Libertadores a Lula em 2012 - 21/12/2018 - Esporte - Folha
+ </title>
+ <meta name="description" content="Após rechaçar um encontro da seleção brasileira com o presidente eleito Jair Bolsonaro, o técnico Tite declarou que errou ao levar a taça da Copa Libertadores de 2012, conquistada pelo Corinthians, ao ex-presidente Luiz Inácio Lula da Silva." />
+ <meta name="keywords" content="Futebol, corinthians, libertadores, folha" />
+ <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
+ <link rel="canonical" href="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" />
+ <link rel="amphtml" href="https://www1.folha.uol.com.br/amp/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" /><!-- Open Graph Meta Tags -->
+ <meta property="og:description" content="Após rechaçar um encontro da seleção brasileira com o presidente eleito Jair Bolsonaro, o técnico Tite declarou que errou ao levar a taça da Copa Libertadores de 2012, conquistada pelo Corinthians, ao ex-presidente Luiz Inácio Lula da Silva." />
+ <meta property="og:image" content="https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_rt.jpg" />
+ <meta property="og:image:height" content="1600" />
+ <meta property="og:image:type" content="image/jpeg" />
+ <meta property="og:image:width" content="2400" />
+ <meta property="og:locale" content="pt_BR" />
+ <meta property="og:site_name" content="Folha de S.Paulo" />
+ <meta property="og:title" content="Tite diz que errou ao levar taça da Libertadores a Lula em 2012" />
+ <meta property="og:type" content="article" />
+ <meta property="og:url" content="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" />
+ <meta property="article:published_time" content="2018-12-21 12:55:00" />
+ <meta property="article:modified_time" content="2018-12-21 12:56:02" />
+ <meta property="article:section" content="Esporte" />
+ <meta property="article:tag" content="Folha de S.Paulo" />
+ <meta property="article:tag" content="Futebol" />
+ <meta property="article:tag" content="corinthians" />
+ <meta property="article:tag" content="libertadores" /><!-- /Open Graph Meta Tags -->
+ <!-- Twitter Meta Tags -->
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:image" content="https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_rt.jpg" />
+ <meta name="twitter:creator" content="folha" />
+ <meta name="twitter:description" content="Após rechaçar um encontro da seleção brasileira com o presidente eleito Jair Bolsonaro, o técnico Tite declarou que errou ao levar a taça da Copa Libertadores de 2012, conquistada pelo Corinthians, ao ex-presidente Luiz Inácio Lula da Silva." />
+ <meta name="twitter:site" content="folha" />
+ <meta name="twitter:title" content="Tite diz que errou ao levar taça da Libertadores a Lula em 2012 - 21/12/2018 - Esporte - Folha" /><!-- /Twitter Meta Tags -->
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="mobile-web-app-capable" content="yes" />
+ <link rel="manifest" href="/manifest.json" />
+ <link rel="apple-touch-icon" href="//f.i.uol.com.br/hunting/folha/1/common/icons/apple-touch-icon.png" />
+ <link rel="apple-touch-icon" sizes="76x76" href="//f.i.uol.com.br/hunting/folha/1/common/icons/touch-icon-ipad.png" />
+ <link rel="apple-touch-icon" sizes="120x120" href="//f.i.uol.com.br/hunting/folha/1/common/icons/touch-icon-iphone-retina.png" />
+ <link rel="apple-touch-icon" sizes="152x152" href="//f.i.uol.com.br/hunting/folha/1/common/icons/touch-icon-ipad-retina.png" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-640x1136.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-750x1294.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-1242x2148.png" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-1125x2436.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-1536x2048.png" media="(min-device-width: 768px) and (max-device-width: 1024px) and (-webkit-min-device-pixel-ratio: 2) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-1668x2224.png" media="(min-device-width: 834px) and (max-device-width: 834px) and (-webkit-min-device-pixel-ratio: 2) and (orientation: portrait)" />
+ <link rel="apple-touch-startup-image" href="//f.i.uol.com.br/hunting/folha/1/common/splash/launch-2048x2732.png" media="(min-device-width: 1024px) and (max-device-width: 1024px) and (-webkit-min-device-pixel-ratio: 2) and (orientation: portrait)" />
+ <link rel="icon" sizes="192x192" href="//f.i.uol.com.br/hunting/folha/1/common/icons/favicon-192.png" />
+ <link rel="shortcut icon" sizes="16x16 24x24 32x32 48x48 62x62" href="//f.i.uol.com.br/hunting/folha/1/common/icons/favicon.ico" />
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+ <meta name="apple-mobile-web-app-title" content="Folha de S.Paulo" />
+ <meta name="msapplication-TileImage" content="//f.i.uol.com.br/hunting/folha/1/common/icons/favicon-144.png" />
+ <meta name="msapplication-TileColor" content="#fff" />
+ <meta name="theme-color" content="#262626" />
+ <script>
+ <![CDATA[
+ //UOLTM
+ window.universal_variable = window.universal_variable || {};
+ window.universal_variable.dfp = {"custom_params":{"subchan":"","keyword":"corinthians"}};
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ //UOLTM
+ window.uolads = window.uolads || [];
+ window.UOLPD = window.UOLPD || {};
+ (function() {
+ var uv = window.universal_variable, up = window.UOLPD;
+ uv.aud = { userType: "none", loginType: "none", userGroup: "none" };
+ up.dataLayer = { "t": String(Math.round(Math.random()*9)+1), "swgt": "sub_na" };
+ //
+ function uoltm() {
+ var scr = document.createElement( "script" );
+ scr.async = true;
+ scr.src = "https://tm.jsuol.com.br/uoltm.js?id=1p0oxf";
+ var el = document.getElementsByTagName( "script" )[0];
+ el.parentNode.insertBefore( scr, el );
+ };
+ if ( document.cookie.indexOf( "folha_ga_userType" ) >= 0 ) {
+ var ck = {}, e = document.cookie.split(";");
+ for (var i = 0; i < e.length; i++) {
+ var a = e[i].split("=");
+ ck[a[0].replace(" ","")]=a[1];
+ }
+ uv.aud.userType = ck.folha_ga_userType;
+ uv.aud.loginType = ck.folha_ga_loginType;
+ uv.aud.userGroup = ck.folha_ga_userGroup;
+ up.dataLayer.swgt = ck.folha_ga_swgt;
+ uoltm();
+ }
+ else {
+ (function tryType( delay, times ) {
+ try {
+ uv.aud.userType = paywall.data.log_type;
+ uv.aud.loginType = paywall.data.origin;
+ uv.aud.userGroup = paywall.all.track || uv.aud.userGroup;
+ up.dataLayer.swgt = paywall.all.swgt || up.dataLayer.swgt;
+ uoltm();
+ }
+ catch ( e ) {
+ ( times > 0 ) ? setTimeout( function() { tryType( delay, --times ) ; }, delay ) : uoltm();
+ }
+ } ( 15, 100 ) );
+ }
+ })();
+
+ //chartbeat
+ var _sf_async_config = _sf_async_config || {};
+ _sf_async_config.uid = 50059;
+ _sf_async_config.domain = 'folha.com.br';
+ _sf_async_config.topStorageDomain = 'uol.com.br';
+ _sf_async_config.flickerControl = false;
+ _sf_async_config.useCanonical = true;
+ var _sf_startpt = (new Date()).getTime();
+ ]]>
+ </script>
+ <script id="navegg" src="https://tag.navdmp.com/tm23947.js"></script>
+ <script src="https://static.chartbeat.com/js/chartbeat_mab.js"></script>
+ <link rel="stylesheet" href="https://static.folha.uol.com.br/storybook/css/portal-88010c12c5.css" />
+ <script src="//f1-na.readspeaker.com/script/6877/ReadSpeaker.js?pids=embhl,custom" type="text/javascript"></script>
+ <style type="text/css">
+ /*<![CDATA[*/
+ /* Alloy problems */
+ .c-headline__wrapper > p,
+ .c-headline__wrapper .c-headline__content > p,
+ .c-main-headline__wrapper > p {
+ color: #757575;
+ font-family: 'FolhaGrafico', Georgia, serif;
+ font-size: 0.8888888888888888em;
+ line-height: 1.33;
+ margin-bottom: 0;
+ }
+
+ .c-main-headline__wrapper > p {
+ font-size: 18px;
+ }
+
+ .c-headline__wrapper > p > strong,
+ .c-headline__wrapper .c-headline__content > p > strong,
+ .c-main-headline__wrapper > p > strong {
+ font-weight: 500;
+ }
+
+ .c-headline__wrapper > p > a,
+ .c-headline__wrapper .c-headline__content > p > a,
+ .c-main-headline__wrapper > p > a {
+ color: #0078a4;
+ }
+
+ .c-headline__wrapper > p > a > strong,
+ .c-headline__wrapper .c-headline__content > p > a > strong,
+ .c-main-headline__wrapper > p > a > strong {
+ font-weight: 500;
+ }
+
+ .c-headline__wrapper > p:not(.c-headline__standfirst):last-child,
+ .c-headline__wrapper .c-headline__content > p:not(.c-headline__standfirst):last-child,
+ .c-main-headline__wrapper > p:not(.c-headline__standfirst):last-child {
+ margin-bottom: 0.7777777777777778em;
+ }
+
+ /* Estradas */
+ .c-status {
+ background-color: #e0e0e0;
+ display: inline-block;
+ height: 0.666666666666667rem;
+ width: 0.666666666666667rem;
+ }
+ .c-status--danger {
+ background-color: #e51717;
+ }
+ .c-status--success {
+ background-color: #6c9;
+ border-radius: 50%;
+ }
+ .c-status--warning {
+ background-color: #f2bc25;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ }
+ .c-status--small {
+ height: 0.5rem;
+ width: 0.5rem;
+ }
+ .t-dark .c-status--danger {
+ background-color: #ff5c5c;
+ }
+ /*]]>*/
+ </style><!--//-->
+ <script type="application/ld+json">
+ <![CDATA[
+ {
+ "@context": "http://schema.org",
+ "@type": "ReportageNewsArticle",
+ "url": "https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml",
+ "mainEntityOfPage": "https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml",
+ "headline": "Tite diz que errou ao levar taça da Libertadores a Lula em 2012",
+ "description": "Na ocasião, técnico do Corinthians entregou réplica do troféu ao ex-presidente",
+ "datePublished": "2018-12-21T12:55:00Z",
+
+ "image": { "@type": "ImageObject", "url": "https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_md.jpg", "width": "768", "height": "512" },
+
+ "contentLocation": {
+ "@type": "Place",
+ "name": "São Paulo "
+ },
+
+ "author": [{
+ "@type": "Person",
+ "name": "Bruno (Henrique Zecchin) Rodrigues ",
+ "sameAs": ["" ,"" ,"" ],
+ "workLocation": { "@type": "Place", "name": "São Paulo " }
+ }],
+
+ "publisher": {
+ "@type": "NewsMediaOrganization",
+ "@id" : "https://www1.folha.uol.com.br#organization",
+ "name": "Folha de S.Paulo",
+ "logo": {
+ "@type": "ImageObject",
+ "url": "https://f.i.uol.com.br/hunting/folha/1/amp/logo.png",
+ "width": 600,
+ "height": 60
+ },
+ "ethicsPolicy": "https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/principios-editoriais.shtml",
+ "diversityPolicy": "https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/principios-editoriais.shtml",
+ "correctionsPolicy": "https://www1.folha.uol.com.br/erramos/",
+ "ownershipFundingInfo": "https://www1.folha.uol.com.br/institucional/",
+ "foundingDate": "1921-02-19",
+ "masthead": "https://www1.folha.uol.com.br/institucional/expediente.shtml",
+ "missionCoveragePrioritiesPolicy": "https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/sua-excelencia-o-consumidor-de-noticias.shtml",
+ "verificationFactCheckingPolicy": "https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/principios-editoriais.shtml",
+ "unnamedSourcesPolicy": "https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/principios-editoriais.shtml",
+ "actionableFeedbackPolicy": "https://www1.folha.uol.com.br/falecomafolha/",
+ "contactPoint": [{
+ "@type": "ContactPoint",
+ "contactType": "Newsroom Contact",
+ "url": "https://www1.folha.uol.com.br/falecomafolha/"
+ },{
+ "@type": "ContactPoint",
+ "contactType": "Public Engagement",
+ "url": "https://www1.folha.uol.com.br/falecomafolha/"
+ }]
+ },
+ "publishingPrinciples": "http://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-folha-de-s-paulo/principios-editoriais.shtml"
+ ,
+ "isAccessibleForFree": false,
+ "hasPart": {
+ "@type": "WebPageElement",
+ "isAccessibleForFree": false,
+ "cssSelector": ".paywall"
+ }
+ }
+ ]]>
+ </script>
+ <script src="https://static.folha.uol.com.br/folha/js/push/firebase-app.js"></script>
+ <script src="https://static.folha.uol.com.br/folha/js/push/firebase-messaging.js"></script>
+ <style>
+ <![CDATA[
+ .c-paywall{background-color:#fff;color:#333;font-family:inherit;font-size:16px;text-align:center;border:1px solid #e0e0e0;box-sizing:border-box;margin:0 0 40px;padding:30px 15px;position:relative;border-radius:4px;zoom:1}@media (min-width:1024px){.c-paywall{padding:70px 15px 65px}}.c-paywall a,a.c-paywall__button{color:#0078a4;text-decoration:none}a.c-paywall__button{font-size:14px;font-weight:500;line-height:1;text-align:center;text-transform:uppercase;border-radius:3px;display:inline-block;margin:0 0 40px;padding:12px 27px;border:1px solid}a.c-paywall__button:focus,a.c-paywall__button:hover{opacity:.75}a.c-paywall__button:active{opacity:.85}a.c-paywall__button--primary{color:#fff;background-color:#0078a4}.c-paywall__devices{display:inline-block;margin:0 0 20px;max-width:320px;padding:0}.c-paywall__devices img{width:100%}@media (min-width:1024px){.c-paywall__half-col{float:left;width:50%}}@media (min-width:1024px){.c-paywall__login-area{border-right:1px solid #e0e0e0;margin-top:58px}}.c-paywall__login-list{list-style:none;margin:0 0 80px;padding:0}.c-paywall__login-list li{display:inline-block;margin:0 4px;vertical-align:middle}@media (min-width:1024px){.c-paywall__login-list li{margin:0 5px}}@media (min-width:1024px){.c-paywall__login-list{margin:0}}.c-paywall__login-uol:focus,.c-paywall__login-uol:hover{opacity:.75}.c-paywall__login-uol:active{opacity:.85}.c-paywall__login-uol svg{vertical-align:bottom}p.c-paywall__price{font-size:18px;font-weight:500;margin:30px 0 20px}@media (min-width:1024px){p.c-paywall__price{font-size:24px}}.c-paywall__price small{display:block;font-size:14px;font-weight:400;margin:5px 0 0}.c-paywall__social-login{background-color:#ededed;font-size:16px;display:block;height:32px;padding:8px 0;width:32px;border-radius:50%}.c-paywall__social-login:focus,.c-paywall__social-login:hover{opacity:.75}.c-paywall__social-login:active{opacity:.85}.c-paywall__social-login .icon{fill:#fff;height:1em;vertical-align:top;width:1em}.c-paywall__social-login--facebook{background-color:#3a5999}.c-paywall__social-login--google{background-color:#fff;border:1px solid #e0e0e0;border-radius:23px;padding:8px 0 8px 9px;width:95px}.c-paywall__social-login--google .icon-google-logo{float:left;margin-right:17px}.c-paywall__social-login--google .icon-google-text{float:left;margin-top:1px;width:45px}.c-paywall__social-login--linkedin{background-color:#0077b5}.c-paywall__row{zoom:1}.c-paywall__row:after,.c-paywall__row:before{content:" ";display:table}.c-paywall__row:after{clear:both}p.c-paywall__text{font-size:16px;font-weight:500;line-height:1.38;margin:0 0 19px}@media (min-width:1024px){.c-paywall__text span{display:block}.c-paywall__text--custom{margin-top:22px}}.c-paywall__title{font-size:20px;font-weight:400;line-height:1.3;margin:0 0 30px}.c-paywall__title strong{font-weight:500}@media (min-width:1024px){.c-paywall__title{font-size:30px;line-height:1.2;margin:0 0 45px}}.c-paywall__teaser--is-hidden{display:none}.c-paywall--f5 .c-paywall__button{font-size:12px;font-weight:600;padding:12px 27px}.c-paywall--f5 .c-paywall__devices{max-width:270px}.c-paywall--f5 .c-paywall__price{font-weight:600}@media (min-width:1024px){.c-paywall--f5 p.c-paywall__price{font-size:18px}}.c-paywall--f5 p.c-paywall__text{font-size:14px}@media (min-width:1024px){.c-paywall--f5 .c-paywall__text--custom{margin-top:57px}}.c-paywall--f5 .c-paywall__title{font-family:inherit}.c-paywall--f5 .c-paywall__title strong{font-weight:600}@media (min-width:1024px){.c-paywall--f5 .c-paywall__title{font-size:24px}}@media (min-width:1024px){.c-paywall--guia .c-paywall{padding:30px 15px}}.c-paywall--guia .c-paywall__button{font-size:12px;padding:12px 27px}@media (min-width:1024px){.c-paywall--guia .c-paywall__half-col{float:none;width:100%}}@media (min-width:1024px){.c-paywall--guia .c-paywall__login-area{border-right:none;margin-top:0}}@media (min-width:1024px){.c-paywall--guia .c-paywall__login-list{margin:0 0 80px}}@media (min-width:1024px){.c-paywall--guia .c-paywall__text span{display:inline-block}}.c-paywall--guia .c-paywall__title{font-size:23px}
+ ]]>
+ </style>
+ </head>
+ <body>
+ <div data-memcached="" class="is-hidden">
+ <div data-project="scoreboard" data-status="on"></div>
+ <div data-project="scoreboard-rounds" data-status="on"></div>
+ <div data-project="eleicoes" data-status="off" data-memcached-url="//staffing1.folha.com.br/index.php?file=" data-timeout="3000"></div>
+ </div>
+ <script>
+ <![CDATA[
+ // Elections Vote Counting
+ (function() {
+ var pageUrlRegex = /poder\/eleicoes\/2018\/apuracao\/1turno\/([\w]+)\/?$/;
+ var secondRoundPage = '//www1.folha.uol.com.br/poder/eleicoes/2018/apuracao/2turno/';
+
+ window.location.href.match(pageUrlRegex);
+
+ var secondRoundState = ['brasil','ap','am','df','mg','ms','pa','rj','rn','ro','rr','rs','sc','se','sp']
+ .filter(page => page === RegExp.$1).pop();
+
+ if (/google/.test(document.referrer) && secondRoundState) {
+ window.location.href = secondRoundPage + secondRoundState;
+ }
+ })();
+ ]]>
+ </script> <!-- uol -->
+
+ <script async="async" src="//jsuol.com.br/barra/parceiro-async.js?parceiro=folha"></script> <!-- /uol -->
+ <header class="l-header u-no-print" data-elastic-header="" data-offset-target=".toolbar" data-tolerance="40">
+ <div class="l-header__wrapper">
+ <div class="container">
+ <div class="l-header__container">
+ <div class="l-header__action-group l-header__action-group--left">
+ <button name="button" class="l-header__action" data-c-sidebar-menu-btn="" data-target="#c-sidebar-menu__content" data-btn-close="#c-sidebar-menu__btn-close"><span class="u-sr-only">Abrir sidebar menu</span> <svg xmlns="https://www.w3.org/2000/svg" height="24" width="24" viewbox="0 0 24 24" class="icon icon--hamburger" aria-hidden="true">
+ <path d="m 3,18 18,0 0,-2 -18,0 0,2 z m 0,-5 18,0 0,-2 -18,0 0,2 z M 3,6 3,8 21,8 21,6 3,6 Z"></path></svg> <span class="u-visible-md">Menu</span></button> <a href="//secure.folha.com.br/folha?gid=FOL" title="Assine a Folha" class="l-header__action l-header__action--attention u-visible-md" rel="external">Assine</a>
+ </div>
+ <div class="l-header__branding">
+ <h1 title="Folha de S.Paulo">
+ <a href="//www.folha.uol.com.br/" class="u-link-clean"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 556 67" version="1.1" class="logo-folha" aria-hidden="true">
+ <path d="m 333.4496,4.0000038 c 4.15466,0 7.84768,0.308064 11.46377,1.078223 l 0,16.3273702 -3.00058,0 -2.92365,-12.01448 c -2.07733,-0.5391112 -3.30834,-0.6931432 -5.53954,-0.6931432 -5.07791,0 -7.92462,2.7725722 -7.92462,6.4693352 0,13.092705 22.00429,11.860445 22.00429,31.345475 0,10.78222 -7.84769,19.79308 -20.23472,19.79308 -5.30872,0 -9.54032,-0.69314 -12.77172,-1.84838 l 0,-16.40439 3.2314,0 2.6159,11.70642 c 2.61589,1.4633 5.61648,1.84838 8.694,1.84838 4.69322,0 7.84768,-3.3887 7.84768,-7.31651 0,-14.24794 -22.61979,-14.40197 -22.46591,-32.423692 0,-10.859241 8.07849,-17.8676882 19.0037,-17.8676882 l 0,0 z m -333.37266,3.773779 0,-2.849588 36.16089,0 0,17.7906722 -3.00058,0 -5.00098,-13.70883 -9.92501,0 0,24.028957 7.77075,0 1.76957,-7.47054 3.00059,0 0,19.56204 -3.00059,0 -1.76957,-8.00965 -7.77075,0 0,24.18299 7.15524,1.30927 0,2.77257 -25.4665,0 0,-2.77257 5.69342,-1.30927 0,-52.4478282 -5.61648,-1.078223 z m 384.92117,32.8857912 -4.77016,0 0,20.64026 6.84749,1.30927 0,2.77257 -25.08182,0 0,-2.77257 5.61648,-1.30927 0,-52.4478282 -5.53954,-1.078223 0,-2.849588 23.61999,0 c 9.92501,0 16.61862,3.850795 16.61862,17.9447042 0,10.782225 -5.4626,17.790675 -17.31106,17.790675 l 0,0 z m -4.77016,-4.00483 2.2312,0 c 4.07772,0 6.4628,-2.77257 6.4628,-13.939877 0,-11.090289 -1.69264,-13.70883 -6.30892,-13.70883 l -2.38508,0 0,27.648707 z m 134.71856,1.84838 c 0,-19.562036 8.61706,-27.18661 20.92716,-27.18661 14.07966,0 20.00389,8.702797 20.00389,27.72572 0,19.33099 -8.694,27.26363 -20.85021,27.26363 -14.15661,0 -20.08084,-8.7028 -20.08084,-27.80274 l 0,0 z m -475.3234,0.077 c 0,-19.485024 8.54012,-27.109598 20.85021,-27.109598 14.15661,0 19.85003,8.625781 19.85003,27.648708 0,19.33099 -8.54013,27.18661 -20.85022,27.18661 -14.07967,0 -19.85002,-8.62578 -19.85002,-27.72572 l 0,0 z m 137.56527,26.80153 -13.61804,0 0,-2.38749 3.92384,-1.07822 12.9256,-49.675259 6.69361,0 14.92598,49.675259 4.00079,1.07822 0,2.38749 -20.61941,0 0,-2.38749 4.77016,-1.07822 -4.15465,-12.70763 -11.23296,0 -2.92365,12.70763 5.30873,1.07822 0,2.38749 z m 235.04581,0 -14.23355,0 0,-2.38749 4.38547,-1.07822 12.9256,-49.675259 6.84749,0 14.92598,49.675259 4.46241,1.07822 0,2.38749 -21.00409,0 0,-2.38749 4.69322,-1.07822 -4.23159,-12.70763 -11.38684,0 -2.84671,12.70763 5.46261,1.07822 0,2.38749 z m -297.75034,0 -30.9291,0 0,-2.38749 4.61628,-1.07822 0,-46.209543 -4.38547,-0.847175 0,-2.464509 20.38859,0 0,2.464509 -4.770157,0.847175 0,46.055503 8.309307,0 4.38547,-12.39956 2.38508,0 0,16.01931 z m 3.15446,-50.522428 0,-2.464509 19.38839,0 0,2.464509 -3.8469,0.847175 0,21.641463 11.69459,0 0,-21.641463 -3.61609,-0.847175 0,-2.464509 18.92676,0 0,2.464509 -4.00077,0.847175 0,46.209543 4.38546,1.07822 0,2.38749 -19.31145,0 0,-2.38749 3.61609,-1.07822 0,-20.94833 -11.69459,0 0,20.94833 3.8469,1.07822 0,2.38749 -19.38839,0 0,-2.38749 4.38547,-1.07822 0,-46.055512 -4.38547,-1.001206 z M 259.8968,39.735384 c 0,18.63784 -8.694,25.64629 -19.23451,25.64629 l -20.61941,0 0,-2.38749 4.15466,-1.07822 0,-46.209543 -4.15466,-0.847175 0,-2.464509 19.54227,0 c 13.15641,0 20.31165,6.315304 20.31165,27.340647 l 0,0 z m 19.46534,22.02654 10.07888,0 4.2316,-11.78343 2.69283,0 0,15.40318 -33.23725,0 0,-2.38749 4.92404,-1.07822 0,-46.209543 -4.8471,-0.847175 0,-2.464509 31.46767,0 0,15.326167 -2.61589,0 -4.30853,-11.860452 -8.38625,0 0,21.179372 6.61667,0 1.76958,-6.54635 2.38508,0 0,17.25156 -2.38508,0 -1.76958,-7.08546 -6.61667,0 0,21.10235 z m 160.03118,-46.902678 0,-2.464509 20.31165,0 0,2.464509 -4.69322,0.847175 0,37.429723 c 0,6.93143 1.69264,10.1661 6.69362,10.1661 6.84748,0 9.00175,-4.08184 9.00175,-11.70641 l 0,-35.889413 -4.53935,-0.847175 0,-2.464509 12.23316,0 0,2.464509 -4.15466,0.847175 0,36.659563 c 0,10.32013 -5.07791,14.71004 -15.46455,14.63302 -11.9254,-0.077 -15.07986,-4.69796 -15.07986,-17.02051 l 0,-34.272073 -4.30854,-0.847175 z m 72.70648,50.522428 -30.46747,0 0,-2.38749 4.61628,-1.07822 0,-46.209543 -4.30853,-0.847175 0,-2.464509 20.31165,0 0,2.464509 -4.69322,0.847175 0,46.055503 7.61687,0 4.38547,-12.39956 2.53895,0 0,16.01931 z m 31.69849,-26.1854 c 0,-21.48744 -3.69303,-24.799124 -8.00156,-24.799124 -4.30853,0 -8.694,2.849589 -8.694,24.028964 0,21.41042 3.69302,24.87613 8.07849,24.87613 4.30853,0 8.61707,-3.08063 8.61707,-24.10597 l 0,0 z m -475.40035,0.077 c 0,-21.487434 -3.76996,-24.722102 -8.15543,-24.722102 -4.46241,0 -8.77094,2.772573 -8.77094,23.951942 0,21.41042 3.8469,24.79912 8.23237,24.79912 4.30853,0 8.694,-2.9266 8.694,-24.02896 l 0,0 z m 167.64806,22.48864 3.30834,0 c 6.23198,0 9.15563,-3.3887 9.15563,-22.71969 0,-19.716066 -3.38528,-23.181782 -9.38645,-23.181782 l -3.07752,0 0,45.901472 z m -56.16479,-33.11683 -4.23159,16.94349 9.38644,0 -5.15485,-16.94349 z m 234.96887,0 -4.15466,16.94349 9.23257,0 -5.07791,-16.94349 z m -61.70433,26.1854 c 2.8467,0 5.23179,2.54153 5.23179,5.69918 0,3.23467 -2.53896,5.77619 -5.38567,5.77619 -2.69283,0 -5.23179,-2.54152 -5.23179,-5.77619 0,-3.15765 2.69283,-5.69918 5.38567,-5.69918 l 0,0 z"></path></svg></a>
+ </h1>
+ <div class="l-header__sub">
+ <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 55 14" version="1.1" class="brand-stars" aria-hidden="true">
+ <g>
+ <polygon points="22.866795,14.321192 24.633205,8.8599664 20,5.4902743 25.733591,5.4902743 27.5,8.8817842e-16 29.266409,5.4902743 35,5.4902743 30.366795,8.8599664 32.133205,14.321192 27.5,10.92245" class="brand-stars-blue"></polygon>
+ <polygon points="2.8667954,14.321192 4.6332046,8.8599664 0,5.4902743 5.7335907,5.4902743 7.5,8.8817842e-16 9.2664093,5.4902743 15,5.4902743 10.366795,8.8599664 12.133205,14.321192 7.5,10.92245" class="brand-stars-red"></polygon>
+ <polygon points="42.866795,14.321192 44.633205,8.8599664 40,5.4902743 45.733591,5.4902743 47.5,8.8817842e-16 49.266409,5.4902743 55,5.4902743 50.366795,8.8599664 52.133205,14.321192 47.5,10.92245" class="brand-stars-dark"></polygon>
+ </g></svg>
+ </div>
+ </div>
+ <ul class="u-sr-only">
+ <li>
+ <a href="#conteudo" accesskey="1">Ir para o conteúdo [1]</a>
+ </li>
+ <li>
+ <a href="#menu" accesskey="2">Ir para o menu [2]</a>
+ </li>
+ <li>
+ <a href="#rodape" accesskey="3">Ir para o rodapé [3]</a>
+ </li>
+ </ul>
+ <div class="l-header__action-group l-header__action-group--right">
+ <a href="#" class="l-header__action js-link-logout u-visible-md"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--user" aria-hidden="true">
+ <path d="m 12,12 c 2.210001,0 4,-1.789999 4,-4 C 16,5.79 14.210001,4 12,4 9.790001,4 8,5.79 8,8 c 0,2.210001 1.790001,4 4,4 l 0,0 z m 0,2 c -2.67,0 -8,1.34 -8,4 l 0,2 16,0 0,-2 c 0,-2.66 -5.329999,-4 -8,-4 l 0,0 z"></path></svg> <span>Entrar</span></a> <button data-search-btn="" data-target="#search" type="button" name="button" class="l-header__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--search" aria-hidden="true">
+ <path d="m 15.757146,14.256289 -0.79045,0 -0.280158,-0.270154 c 0.98056,-1.140652 1.570896,-2.621498 1.570896,-4.2324192 0,-3.5920531 -2.911664,-6.5037173 -6.5037169,-6.5037173 -3.592053,0 -6.5037171,2.9116642 -6.5037171,6.5037173 0,3.5920522 2.9116641,6.5037182 6.5037171,6.5037182 1.6109209,0 3.0917669,-0.590339 4.2324199,-1.570898 l 0.270154,0.28016 0,0.790452 5.002857,4.992853 1.490852,-1.490852 -4.992854,-5.00286 0,0 z m -6.0034287,0 c -2.4914241,0 -4.5025735,-2.011149 -4.5025735,-4.5025732 0,-2.4914241 2.0111494,-4.5025735 4.5025735,-4.5025735 2.4914237,0 4.5025737,2.0111494 4.5025737,4.5025735 0,2.4914242 -2.01115,4.5025732 -4.5025737,4.5025732 l 0,0 z"></path></svg> <span class="u-visible-md">Buscar</span></button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="l-header__wrapper">
+ <div class="container">
+ <div id="menu" data-menu-channel="Esporte" class="l-header__nav c-site-nav js-c-site-nav">
+ <nav class="c-site-nav__group">
+ <ul class="c-site-nav__list">
+ <li class="c-site-nav__item c-site-nav__item--section">
+ <a href="https://www1.folha.uol.com.br/esporte/">esporte</a> <svg xmlns="//www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="icon icon--chevron-right">
+ <path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"></path></svg>
+ </li>
+ <li class="c-site-nav__item">
+ <a href="https://www1.folha.uol.com.br/especial/2018/campeonato-brasileiro/serie-a/">Campeonato Brasileiro</a>
+ </li>
+ <li class="c-site-nav__item">
+ <a href="https://www1.folha.uol.com.br/especial/2018/copa-libertadores/">Libertadores</a>
+ </li>
+ <li class="c-site-nav__item">
+ <a href="https://www1.folha.uol.com.br/especial/2018/liga-dos-campeoes/">Champions League</a>
+ </li>
+ <li class="c-site-nav__item">
+ <a href="https://www1.folha.uol.com.br/especial/2018/copa-do-mundo/">copa 2018</a>
+ </li>
+ <li class="c-site-nav__item">
+ <a href="http://aovivo.folha.uol.com.br/2018/11/30/5617-aovivo.shtml">Mercado da bola</a>
+ </li>
+ </ul>
+ </nav>
+ <nav class="c-site-nav__group c-site-nav__group--right">
+ <ul class="c-site-nav__list">
+ <li class="c-site-nav__item c-site-nav__item--secondary">
+ <a href="https://arte.folha.uol.com.br/esporte/2017/calendario-esportivo-2018/">calendário</a>
+ </li>
+ <li class="c-site-nav__item c-site-nav__item--secondary">
+ <a href="https://www1.folha.uol.com.br/esporte/tv/">destaques da TV</a>
+ </li>
+ </ul>
+ </nav><!--!-->
+ </div>
+ <div class="c-tools-share c-tools-share--inner js-c-tools-share is-hidden" aria-hidden="true">
+ <ul aria-label="Opções de compartilhamento" class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-counter="" data-sharebar-buttons="facebook whatsapp twitter" data-sharebar-channel="esporte" data-sharebar-limit="2" data-sharebar-url="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-sharebar-uolpd-id="content" data-sharebar-text="Tite diz que errou ao levar taça da Libertadores a Lula em 2012">
+ <li class="c-tools-share__item">
+ <a aria-label="Ir para a seção de comentários" href="#comentarios" class="c-tools-share__button c-tools-share__button--comment" title="Comentários"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--comments" aria-hidden="true">
+ <path d="M18,8H6V6H18V8M18,11H6V9H18V11M18,14H6V12H18V14M22,4A2,2 0 0,0 20,2H4A2,2 0 0,0 2,4V16A2,2 0 0,0 4,18H18L22,22V4Z"></path></svg> </a>
+ </li>
+ <li class="c-tools-share__item">
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button aria-label="Ver todas opções de compartilhamento" data-trigger="" class="c-tools-share__button c-tools-share__button--neutral"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 17 5" height="24" width="24" class="icon icon--more-options" aria-hidden="true">
+ <path d="M2.5 0.5c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2zm12 0c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2zm-6 0c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2z"></path></svg></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button aria-label="Fechar seção de opções" data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest rss email" data-sharebar-channel="esporte" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-sharebar-uolpd-id="content" data-sharebar-text="Tite diz que errou ao levar taça da Libertadores a Lula em 2012">
+ <li class="c-tools-share__item">
+ <button aria-label="Copiar link" data-copy-link="" data-href="https://folha.com/rz1q0xue" class="c-tools-share__button c-tools-share__button--copy-link" title="URL curta"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon--link icon--" aria-hidden="true">
+ <path d="m 1.5200002,7.9999998 c 0,-1.368 1.112,-2.4799996 2.4799999,-2.4799996 l 3.1999996,0 0,-1.5199999 -3.1999996,0 C 1.7920001,4.0000003 1.5e-7,5.7920002 1.5e-7,7.9999998 1.5e-7,10.208 1.7920001,12 4.0000001,12 l 3.1999996,0 0,-1.519999 -3.1999996,0 c -1.368,0 -2.48,-1.1120012 -2.48,-2.4800012 l 0,0 z m 3.2799999,0.800001 6.3999999,0 0,-1.6000011 -6.4,0 0,1.6000011 0,0 z M 12,4.0000003 l -3.2000001,0 0,1.5199999 3.2000001,0 c 1.368,0 2.48,1.1119996 2.48,2.4799996 0,1.368 -1.112,2.4800012 -2.48,2.4800012 l -3.2000001,0 0,1.519999 L 12,12 c 2.208,0 4,-1.792 4,-4.0000002 0,-2.2079997 -1.792,-3.9999995 -4,-3.9999995 l 0,0 z"></path></svg></button> <span class="c-tools-share__button-name" aria-hidden="true">Copiar link</span>
+ </li>
+ <li class="c-tools-share__item u-visible-md">
+ <button aria-label="Imprimir" data-paper-print="" class="c-tools-share__button c-tools-share__button--paper-print" title="Imprimir"><svg xmlns="https://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" class="icon icon--paper-print icon--" aria-hidden="true">
+ <path d="M13.584 4.748H2.424A2.388 2.388 0 0 0 .03 7.14v4.784H3.22v3.19h9.567v-3.19h3.188V7.14a2.388 2.388 0 0 0-2.39-2.392zm-2.39 8.77h-6.38V9.532h6.377v3.986zm2.39-5.58a.8.8 0 0 1-.797-.798c0-.44.36-.797.797-.797.44 0 .797.358.797.797 0 .44-.357.797-.796.797zM12.787.763H3.22V3.95h9.567z"></path></svg></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="c-search c-search--fixed">
+ <div id="search" class="collapse c-search__container" data-search="" data-btn="data-search-btn" data-field="#query" data-close-btn=".c-search__close-btn">
+ <form class="c-form c-search__form" action="//search.folha.uol.com.br/" method="get" data-form-validation="">
+ <fieldset class="container">
+ <legend class="u-visually-hidden">Busca</legend>
+ <div class="col col--5-8 col--xs-8-11 col-offset--sm-1-17 col--sm-7-10 col--md-7-13 col-offset--md-1-6 col-offset--lg-2-11">
+ <div class="c-form__default">
+ <label for="query" class="u-visually-hidden">Buscar no sites da Folha de S.Paulo</label> <input class="" type="text" name="q" id="query" placeholder="Digite o que procura" aria-required="true" data-required="\w+`g" data-error-message="&lt;svg xmlns=&quot;https://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot; height=&quot;16&quot; class=&quot;icon icon--alert &quot; aria-hidden=&quot;true&quot;&gt; &lt;path d=&quot;M8 0C3.584 0 0 3.584 0 8s3.584 8 8 8 8-3.584 8-8-3.584-8-8-8zm.8 12H7.2v-1.6h1.6zm0-3.2H7.2V4h1.6z&quot;/&gt; &lt;/svg&gt; Digite o que procura" data-target="#query-error-message" /> <input type="hidden" value="todos" name="site" /> <span class="c-form__error-message" id="query-error-message"></span>
+ </div>
+ </div>
+ <div class="col col--1-3 col-offset--1-6 col--xs-2-9 col--sm-1-6 col--md-1-9">
+ <button class="c-button c-button--primary" type="submit">Buscar</button>
+ </div><button data-toggle="collapse" class="c-button--unstyled u-visible-sm c-search__close-btn"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </fieldset>
+ </form>
+ </div>
+ </div>
+ </div><!--//-->
+ <!--!-->
+ </header>
+ <div class="c-sidebar-menu">
+ <!-- sidebar-menu-content -->
+ <div id="c-sidebar-menu__content" class="c-sidebar-menu__content">
+ <div class="flex c-sidebar-menu__content-header">
+ <a href="//www.folha.uol.com.br/" class="c-sidebar-menu__content-header__link" title="Folha de S.Paulo"><svg width="90" height="23" viewbox="0 0 90 23" class="logo-folha logo-tiny" aria-hidden="true">
+ <g fill-rule="evenodd">
+ <path class="brand-stars-red" d="M87.893 4.165l.83 2.58-2.188-1.598-2.188 1.598.841-2.58L83 2.58h2.705l.83-2.58.841 2.579h2.706z"></path>
+ <path class="brand-stars-blue" d="M87.893 11.753l.83 2.58-2.188-1.598-2.188 1.597.841-2.58L83 10.167h2.705l.83-2.579.841 2.58h2.706z"></path>
+ <path class="brand-stars-dark" d="M87.893 20.074l.83 2.58-2.188-1.597-2.188 1.597.841-2.58L83 18.488h2.705l.83-2.579.841 2.579h2.706z"></path>
+ <path d="M.027 1.01V0h12.8v6.303h-1.062l-1.77-4.857H6.482V9.96h2.75l.627-2.647h1.062v6.93H9.859l-.627-2.837h-2.75v8.567l2.532.464v.983H0v-.983l2.015-.464V1.392L.027 1.01zm13.999 10.913c0-6.903 3.023-9.604 7.38-9.604 5.011 0 7.026 3.056 7.026 9.795 0 6.849-3.023 9.632-7.38 9.632-4.984 0-7.026-3.056-7.026-9.823zM62.72 21.42H57.9v-.846l1.389-.382 4.575-17.599h2.37l5.283 17.599 1.416.382v.846h-7.299v-.846l1.689-.382-1.471-4.502h-3.976l-1.036 4.5 1.88.382v.846zm-22.196 0H29.576v-.846l1.634-.382V3.82l-1.552-.3v-.873h7.217v.873l-1.689.3v16.316h2.942l1.552-4.393h.844v5.676zm1.117-17.9v-.872h6.863v.873l-1.362.3v7.667h4.14V3.82l-1.28-.3v-.873h6.7v.873l-1.417.3v16.37l1.552.383v.846h-6.835v-.846l1.28-.382v-7.422h-4.14v7.422l1.362.382v.846H41.64v-.846l1.552-.382V3.874L41.64 3.52zm-17.43 8.65c0-7.612-1.334-8.758-2.887-8.758-1.58 0-3.104.982-3.104 8.485 0 7.585 1.361 8.786 2.914 8.786 1.525 0 3.077-1.037 3.077-8.513zm39.462-3.765l-1.498 6.002h3.323l-1.825-6.002z"></path>
+ </g></svg></a>
+ <div class="c-sidebar-menu__subscribe">
+ <a href="//secure.folha.com.br/folha?gid=FOL" title="Assine a Folha" class="c-sidebar-menu__content-header__link c-sidebar-menu__subscribe-link">Assine</a>
+ </div><button class="c-button--unstyled c-sidebar-menu__btn-close" id="c-sidebar-menu__btn-close"><span class="u-sr-only">Fechar sidebar menu</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-list-menu__divider"></div><!-- User -->
+ <ul class="c-list-menu c-list-menu--insider c-sidebar-menu__user">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <div class="c-avatar" data-avatar="">
+ <div class="c-avatar__media js-avatar-media"></div>
+ </div><a class="u-link-clean link-icon" href="#user-info" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="user-info" data-nodropdown=""><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="user-info">
+ <li class="c-list-menu__item">
+ <a href="//login.folha.com.br/perfil" class="u-link-clean">Editar perfil</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a href="//login.folha.com.br/conta" class="u-link-clean">Senha e conta</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a href="//login.folha.com.br/newsletter" class="u-link-clean">Newsletter</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a href="//login.folha.com.br/assinante" class="u-link-clean">Assinatura</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean js-link-logout" href="#">Sair</a>
+ </li>
+ </ul>
+ </li>
+ </ul><!-- /User -->
+ <div class="c-list-menu__divider"></div><!-- Nav -->
+ <nav>
+ <!-- Main sections -->
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <a href="//www1.folha.uol.com.br/fsp/" class="u-link-clean">Edição Impressa</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a href="//www1.folha.uol.com.br/ultimas-noticias/" class="u-link-clean">Últimas</a>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div>
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/opiniao" class="u-link-clean">opinião</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-opiniao" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-opiniao"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-opiniao" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/folha-topicos/editoriais/">Editoriais</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://fotografia.folha.uol.com.br/galerias/nova/1618604763277631-charges-dezembro-2018">Charges</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/opiniao/tendenciasdebates/">Tendências/Debates</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/colunaseblogs" class="u-link-clean">colunas e blogs</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-colunas-e-blogs" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-colunas-e-blogs"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-colunas-e-blogs" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunaseblogs/#so-colunas">Colunas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunaseblogs/#so-blogs">Blogs</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/maispopulares" class="u-link-clean">mais populares</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-mais-populares" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-mais-populares"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-mais-populares" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/maispopulares/#mais-lidas">Mais lidas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/maispopulares/#mais-enviadas">Mais enviadas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/maispopulares/#mais-comentadas">Mais comentadas</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://acervo.folha.uol.com.br/" class="u-link-clean">acervo folha</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-acervo-folha" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-acervo-folha"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-acervo-folha" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2017/ha-50-anos">Há 50 Anos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2017/saiu-no-np">Saiu no NP</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div>
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/poder/eleicoes/2018/" class="u-link-clean">eleições 2018</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-eleicoes-2018" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-eleicoes-2018"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-eleicoes-2018" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://aovivo.folha.uol.com.br/2018/08/16/5454-aovivo.shtml">em tempo real</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/poder/eleicoes/candidatos/">candidatos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/poder/eleicoes/2018/apuracao/2turno/brasil/">apuração</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://temas.folha.uol.com.br/entrevistas-eleicoes-2018/introducao/o-que-eles-pensam.shtml">Entrevistas com candidatos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/sabatinas/sabatinas.shtml">Sabatinas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/folha-informacoes/">Folha Informações</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/debates/">Debates</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/pesquisas-eleitorais/">Pesquisas eleitorais</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://painel.blogfolha.uol.com.br/">Painel</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/poder/" class="u-link-clean">poder</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-poder" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-poder"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-poder" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/governo-bolsonaro/">Governo Bolsonaro</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2017/entrevista-da-segunda/">Entrevista da 2ª</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2014/petrolao/">lava jato</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/mercado" class="u-link-clean">mercado</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-mercado" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-mercado"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-mercado" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/cifraseletras/">cifras &amp; letras</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/consumo-consciente/">consumo consciente</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/folhainvest/">folhainvest</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/imposto-de-renda/">ir 2018</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunas/mercadoaberto/">mercado aberto</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://fotografia.folha.uol.com.br/galerias/nova/1618607510546314-hora-do-cafe-dezembro-de-2018">hora do café</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mpme/">mpme</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/brasil-que-da-certo/">o brasil que dá certo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mercado/previdencia/">previdência</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunas/vaivem/">vaivém das commodities</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://publicidadelegal.folha.uol.com.br/">Publicidade Legal</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/cotidiano" class="u-link-clean">cotidiano</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-cotidiano" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-cotidiano"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-cotidiano" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/educacao">educação</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/cotidiano/ao-seu-tempo/">ao seu tempo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/febre-amarela/">febre amarela</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/noticias/2016/folha-verao/">Folha verão</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/cotidiano/riodejaneiro/">rio de janeiro</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/loterias/">loterias</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://tempo.folha.uol.com.br/">tempo</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/mundo" class="u-link-clean">mundo</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-mundo" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-mundo"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-mundo" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2017/coreia-do-norte/">coreia do norte</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2017/governo-trump/">governo trump</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/venezuela/">venezuela</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://arte.folha.uol.com.br/mundo/2018/hipercidades/">hipercidades</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/esporte/" class="u-link-clean">esporte</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-esporte" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-esporte"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-esporte" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/esporte/">esporte</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/campeonato-brasileiro/serie-a/">campeonato brasileiro</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/ilustrada" class="u-link-clean">ilustrada</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-ilustrada" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-ilustrada"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-ilustrada" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunas/monicabergamo/">mônica bergamo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www1.folha.uol.com.br/ilustrada/cartum/cartunsdiarios">quadrinhos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www1.folha.uol.com.br/comida/">comida</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/colunas/mauricio-meireles/">painel das letras</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/ilustrissima">ilustríssima</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://f5.folha.uol.com.br" class="u-link-clean">F5</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-f5" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-f5"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-f5" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://f5.folha.uol.com.br/bichos">Bichos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://f5.folha.uol.com.br/celebridades">celebridades</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://f5.folha.uol.com.br/horoscopo/">horóscopo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://f5.folha.uol.com.br/voceviu">você viu?</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://f5.folha.uol.com.br/televisao/">televisão</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://guia.folha.uol.com.br">guia folha</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/ciencia" class="u-link-clean">ciência</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-ciencia" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-ciencia"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-ciencia" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/ambiente">Ambiente</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/equilibrioesaude">equilíbrio e saúde</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/saopaulo" class="u-link-clean">sãopaulo</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-saopaulo" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-saopaulo"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-saopaulo" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/o-melhor-de-sao-paulo/restaurantes-bares-e-cozinha/2018/">o melhor de sãopaulo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/saopaulo/viaja-sp/melhores/2018/">viaja sãopaulo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/descubra-sao-paulo/">descubra sãopaulo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/estradas/">estradas</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/">especiais</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://seminariosfolha.folha.com.br/">Seminários Folha</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/empreendedorsocial/" class="u-link-clean">empreendedor social</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-empreendedor-social" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-empreendedor-social"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-empreendedor-social" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/empreendedorsocial/fiis/">FIIS</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/top-of-mind/">top of mind</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="" class="u-link-clean">imagem</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-imagem" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-imagem"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-imagem" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://fotografia.folha.uol.com.br/galerias">fotografia</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/tv">tv folha</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="" class="u-link-clean">parceiros</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-parceiros" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-parceiros"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-parceiros" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/bbc/">BBC News Brasil</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/dw/">Deutsche Welle</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mundo/financialtimes/">Financial Times</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/especial/2018/globalmedia/">Global Media</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mundo/latinoamerica21/">Latino América 21</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/nova-escola/">Nova Escola</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://piaui.folha.uol.com.br/">Piauí</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/rfi/">Radio France Internationale</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mundo/nyt/">The New York Times</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mundo/wsj/">The Wall Street Journal</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mundo/washingtonpost/">The Washington Post</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://telepadi.folha.uol.com.br/">Telepadi</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/banco-de-dados">banco de dados</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/dias-melhores">dias melhores</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/paineldoleitor">painel do leitor</a>
+ </li>
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/sobretudo" class="u-link-clean">sobre tudo</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-sobre-tudo" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-sobre-tudo"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-sobre-tudo" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/sobretudo/carreiras">carreiras</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://classificados1.folha.uol.com.br/">classificados</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/sobretudo/morar">morar</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/sobretudo/rodas">rodas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/sobretudo/vida-pratica">vida prática</a>
+ </li>
+ </ul>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/turismo">turismo</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/serafina/">Serafina</a>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div>
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="" class="u-link-clean">mais seções</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-mais-secoes" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-mais-secoes"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-mais-secoes" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/internacional/es/">folha en español</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/internacional/en/">folha in english</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mapas/">Folha Mapas</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://folhaleaks.folha.com.br/">folhaleaks</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/tudosobre/">tudo sobre</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/folha-topicos/">folha tópicos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://transparencia.folha.uol.com.br">folha transparência</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/fsp">versão impressa</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/mapa-do-site/">Mapa do site</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div>
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/institucional/" class="u-link-clean">Sobre a Folha</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-sobre-a-folha" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-sobre-a-folha"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-sobre-a-folha" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www1.folha.uol.com.br/institucional">sobre o grupo folha</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/institucional/expediente.shtml">expediente</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www1.folha.uol.com.br/paineldoleitor/politicadeprivacidade/">política de privacidade</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-2017/">projeto editorial</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/treinamento/">treinamento</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www1.folha.uol.com.br/folha/trabalhe/vagas.html">trabalhe na folha</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div>
+ <ul class="c-list-menu c-list-menu--insider">
+ <li class="c-list-menu__item">
+ <div class="c-list-menu__wrap-links">
+ <a href="https://www1.folha.uol.com.br/falecomafolha" class="u-link-clean">fale com a folha</a> <a class="u-link-clean c-list-menu__toggle link-icon" href="#sidebarmenu-fale-com-a-folha" data-toggle="collapse" data-icon=".icon--chevron-down" aria-expanded="false" aria-controls="sidebarmenu-fale-com-a-folha"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-down" aria-hidden="true">
+ <path d="M 6.2499999,9.800625 7.60125,8.449375 12,12.838542 16.39875,8.449375 17.75,9.800625 l -5.75,5.75 -5.75,-5.75 z"></path></svg></a>
+ </div>
+ <ul class="c-list-menu__sublist collapse" id="sidebarmenu-fale-com-a-folha" aria-expanded="false">
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://www.publicidade.folha.com.br">anuncie (publicidade folha)</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="http://atendimento.folha.com.br">atendimento ao assinante</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/erramos">erramos</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/ombudsman">ombudsman</a>
+ </li>
+ <li class="c-list-menu__item">
+ <a class="u-link-clean" href="https://www1.folha.uol.com.br/paineldoleitor">painel do leitor</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="c-list-menu__divider"></div><!--!-->
+ <!-- /Main sections -->
+ <!-- Nav -->
+ <aside class="c-sidebar-menu__group">
+ <!-- Contrast -->
+ <div class="c-contrast" data-set-contrast="">
+ <h6 class="c-contrast__title">
+ Contraste
+ </h6>
+ <div class="c-contrast__content">
+ <div class="c-form__radio c-form__radio--inline">
+ <input type="radio" id="contrast-default" name="contrast-theme" data-set-contrast-theme="t-default" checked="checked" /> <label for="contrast-default">Claro</label>
+ </div>
+ <div class="c-form__radio c-form__radio--inline">
+ <input type="radio" id="contrast-dark" name="contrast-theme" data-set-contrast-theme="t-dark" /> <label for="contrast-dark">Escuro</label>
+ </div>
+ </div>
+ </div><!-- /Contrast -->
+ <!-- Edições -->
+ <h4 class="c-sidebar-menu__group-title">
+ Edições
+ </h4>
+ <ul class="c-list-flags">
+ <li class="c-list-flags__item">
+ <a href="//www1.folha.uol.com.br/internacional/en/" title="Ir para a versão Inglês" class="u-link-clean"><svg width="13" height="13" viewbox="0 0 13 13" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" aria-hidden="true" class="icon icon-flag--usa icon--tiny">
+ <title>
+ United States of America flag
+ </title>
+ <defs>
+ <circle id="a" cx="6.5" cy="6.5" r="6.5"></circle>
+ </defs>
+ <g fill="none" fill-rule="evenodd">
+ <mask id="b" fill="#fff">
+ <use xlink:href="#a"></use>
+ </mask>
+ <g mask="url(#b)">
+ <circle cx="6.5" cy="6.5" r="6.5" fill="#FFF"></circle>
+ <path d="M0 12.133h13V13H0v-.867zm0-3.466h13V10.4H0V8.667zM6.933 5.2H13v1.733H6.933V5.2zm0-3.467H13v1.734H6.933V1.733z" fill="#B22234"></path>
+ <path fill="#3C3B6E" d="M0 0h6.933v6.933H0z"></path>
+ </g>
+ </g></svg> <span class="c-heading--tiny" lang="en" title="English" xml:lang="en">ENG</span></a>
+ </li>
+ <li class="c-list-flags__item">
+ <a href="//www1.folha.uol.com.br/internacional/es/" title="Ir para a versão Espanhol" class="u-link-clean"><svg width="13" height="13" viewbox="0 0 13 13" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" aria-hidden="true" class="icon icon-flag--spain icon--tiny">
+ <defs>
+ <circle id="a" cx="6.5" cy="6.5" r="6.5"></circle>
+ </defs>
+ <g fill="none" fill-rule="evenodd">
+ <mask id="b" fill="#fff">
+ <use xlink:href="#a"></use>
+ </mask>
+ <g mask="url(#b)">
+ <circle cx="6.5" cy="6.5" r="6.5" fill="#AA151B"></circle>
+ <path fill="#F1BF00" d="M0 3.467h13v6.066H0z"></path>
+ </g>
+ </g></svg> <span class="c-heading--tiny" lang="es" title="Español" xml:lang="es">ESP</span></a>
+ </li>
+ </ul><!-- /Edições -->
+ <!-- Siga a folha -->
+ <div class="follow-folha">
+ <h4 class="c-sidebar-menu__group-title">
+ Siga a folha
+ </h4>
+ <ul class="c-follow-social-media">
+ <li>
+ <a href="//twitter.com/folha" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Twitter</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--twitter" aria-hidden="true">
+ <path d="m 15.999997,3.2018549 c 0,-0.1451388 -0.119467,-0.2732046 -0.273067,-0.2732046 -0.08533,0 -0.674133,0.247589 -0.827733,0.2902776 0.2048,-0.2390525 0.674133,-0.9647527 0.674133,-1.2721095 0,-0.1451387 -0.119466,-0.2732046 -0.273067,-0.2732046 -0.04266,0 -0.09387,0.01711 -0.136533,0.042714 -0.580266,0.3158928 -1.134933,0.5634818 -1.783466,0.7000904 -0.64,-0.6147385 -1.5104,-0.9733204 -2.406399,-0.9733204 -1.8943999,0 -3.4474671,1.5453141 -3.4474671,3.4492104 0,0.136602 0.00853,0.281747 0.034133,0.418349 C 5.6831985,5.1484392 3.8997324,4.3629782 2.5002659,3.1079412 2.1589325,2.8005845 1.8687992,2.4676183 1.5615991,2.1261094 1.4933329,2.0492686 1.4335995,2.0236592 1.3311993,2.0236592 c -0.093866,0 -0.1706664,0.068298 -0.2133332,0.1366023 -0.30720005,0.4524956 -0.46933275,1.1867322 -0.46933275,1.7331415 0,0.7940042 0.2730663,1.5709292 0.78506615,2.1856432 -0.1621331,-0.05121 -0.4096003,-0.213443 -0.55466665,-0.213443 -0.1791994,0 -0.3327998,0.128066 -0.3327998,0.307357 0,1.195268 0.65706655,2.305169 1.66399955,2.928419 -0.0768,-0.0086 -0.1450664,-0.03416 -0.2218665,-0.03416 -0.145067,0 -0.2645333,0.128066 -0.2645333,0.264668 0,0.03416 0.00853,0.05976 0.017067,0.09391 0.3754662,1.1525798 1.314133,2.0234248 2.4917329,2.2966298 -0.9642667,0.597634 -2.0735999,0.904991 -3.1999998,0.904991 -0.25599995,0 -0.51199955,-0.04271 -0.75946615,-0.04271 -0.1535997,0 -0.2730666,0.128066 -0.2730666,0.273205 0,0.09391 0.0512,0.170754 0.1280003,0.230516 0.2218665,0.162218 0.4949331,0.29882 0.7423993,0.42688 1.31413295,0.683017 2.78186635,1.041593 4.26666575,1.041593 3.7205324,0 6.9034655,-1.99781 8.4394655,-5.3957938 0.554666,-1.220886 0.878933,-2.5613 0.853333,-3.901713 l 0,-0.281741 C 15.010131,4.5422372 15.57333,3.978749 15.95733,3.355499 15.98293,3.312785 16,3.261585 16,3.2018237 l 0,0 z"></path></svg></a>
+ </li>
+ <li>
+ <a href="//www.linkedin.com/company-beta/15657/" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Linkedin</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--linkedin" aria-hidden="true">
+ <path d="M 0.5217573,3.4217496 C 0.8574099,3.7574022 1.3243328,3.925225 1.883477,3.925225 l 0.019112,0 c 0.5965319,0 1.062624,-0.1678228 1.416555,-0.5034754 C 3.6739051,3.0669849 3.8417314,2.656557 3.8417314,2.1348025 3.8417314,1.6313201 3.6547964,1.2026132 3.319144,0.86696056 2.9834872,0.531308 2.517395,0.3634851 1.9391422,0.3634851 1.3608886,0.3634851 0.8947967,0.531308 0.5408658,0.86696056 0.1861045,1.2026132 -1e-7,1.6313201 -1e-7,2.1348025 c 0,0.5217545 0.1678263,0.9321824 0.5217572,1.2869471 l 0,0 z m -0.3165439,12.2147654 3.4313014,0 0,-10.2939042 -3.4313014,0 0,10.2939042 z m 8.7460799,0 0,-5.7443117 c 0,-0.3539317 0.037384,-0.633921 0.1121617,-0.839135 C 9.2121719,8.6991367 9.4364945,8.4008753 9.7347601,8.1582701 10.013917,7.9156719 10.386957,7.8035124 10.834771,7.8035124 c 0.596531,0 1.025236,0.2052139 1.305224,0.6156349 0.279987,0.410428 0.428705,0.9886857 0.428705,1.7156547 l 0,5.501713 3.4313,0 0,-5.8930294 C 16,8.2139334 15.64607,7.0582579 14.919099,6.2747932 14.191298,5.4913284 13.240005,5.1000126 12.046942,5.1000126 c -0.428705,0 -0.839131,0.055677 -1.193893,0.1678228 -0.353931,0.093054 -0.652197,0.2425982 -0.9130756,0.446986 C 9.6973732,5.9017564 9.5104375,6.0878582 9.3617206,6.2565141 9.2121719,6.4235108 9.063455,6.6104458 8.9321847,6.8339388 l 0.019112,0 0,-1.491328 -3.4313016,0 0.018279,0.5034754 0,3.0765435 c 0,1.7156473 0,3.9538893 -0.018279,6.7138853 l 3.4313016,0 0,0 z"></path></svg></a>
+ </li>
+ <li>
+ <a href="//www.instagram.com/folhadespaulo/" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Instagram</span> <svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="icon icon--instagram" aria-hidden="true">
+ <path d="M7.8,2H16.2C19.4,2 22,4.6 22,7.8V16.2A5.8,5.8 0 0,1 16.2,22H7.8C4.6,22 2,19.4 2,16.2V7.8A5.8,5.8 0 0,1 7.8,2M7.6,4A3.6,3.6 0 0,0 4,7.6V16.4C4,18.39 5.61,20 7.6,20H16.4A3.6,3.6 0 0,0 20,16.4V7.6C20,5.61 18.39,4 16.4,4H7.6M17.25,5.5A1.25,1.25 0 0,1 18.5,6.75A1.25,1.25 0 0,1 17.25,8A1.25,1.25 0 0,1 16,6.75A1.25,1.25 0 0,1 17.25,5.5M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z"></path></svg></a>
+ </li>
+ <li>
+ <a href="//www1.folha.uol.com.br/feed" target="_blank"><span class="u-visually-hidden">Link externo, abre página RSS da Folha de S.Paulo</span> <svg xmlns="https://www.w3.org/2000/svg" height="24" viewbox="0 0 16 16" width="24" class="icon icon--rss" aria-hidden="true">
+ <g transform="translate(-4, -4)">
+ <circle cx="6.18" cy="17.82" r="2.18"></circle>
+ <path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"></path>
+ </g></svg></a>
+ </li>
+ </ul>
+ </div><!-- /Siga a folha -->
+ </aside>
+ </nav>
+ </div><!-- /sidebar-menu-content -->
+ <div class="c-sidebar-menu__overlay"></div>
+ </div>
+ <div class="c-search__overlay" data-overlay-search=""></div>
+ <header class="l-header u-only-print" aria-hidden="true">
+ <div class="l-header__wrapper">
+ <div class="container">
+ <div class="l-header__container">
+ <div class="l-header__branding">
+ <a href="#" class="l-header__logo u-link-clean">
+ <h1>
+ <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 556 67" version="1.1" class="logo-folha" aria-hidden="true">
+ <path d="m 333.4496,4.0000038 c 4.15466,0 7.84768,0.308064 11.46377,1.078223 l 0,16.3273702 -3.00058,0 -2.92365,-12.01448 c -2.07733,-0.5391112 -3.30834,-0.6931432 -5.53954,-0.6931432 -5.07791,0 -7.92462,2.7725722 -7.92462,6.4693352 0,13.092705 22.00429,11.860445 22.00429,31.345475 0,10.78222 -7.84769,19.79308 -20.23472,19.79308 -5.30872,0 -9.54032,-0.69314 -12.77172,-1.84838 l 0,-16.40439 3.2314,0 2.6159,11.70642 c 2.61589,1.4633 5.61648,1.84838 8.694,1.84838 4.69322,0 7.84768,-3.3887 7.84768,-7.31651 0,-14.24794 -22.61979,-14.40197 -22.46591,-32.423692 0,-10.859241 8.07849,-17.8676882 19.0037,-17.8676882 l 0,0 z m -333.37266,3.773779 0,-2.849588 36.16089,0 0,17.7906722 -3.00058,0 -5.00098,-13.70883 -9.92501,0 0,24.028957 7.77075,0 1.76957,-7.47054 3.00059,0 0,19.56204 -3.00059,0 -1.76957,-8.00965 -7.77075,0 0,24.18299 7.15524,1.30927 0,2.77257 -25.4665,0 0,-2.77257 5.69342,-1.30927 0,-52.4478282 -5.61648,-1.078223 z m 384.92117,32.8857912 -4.77016,0 0,20.64026 6.84749,1.30927 0,2.77257 -25.08182,0 0,-2.77257 5.61648,-1.30927 0,-52.4478282 -5.53954,-1.078223 0,-2.849588 23.61999,0 c 9.92501,0 16.61862,3.850795 16.61862,17.9447042 0,10.782225 -5.4626,17.790675 -17.31106,17.790675 l 0,0 z m -4.77016,-4.00483 2.2312,0 c 4.07772,0 6.4628,-2.77257 6.4628,-13.939877 0,-11.090289 -1.69264,-13.70883 -6.30892,-13.70883 l -2.38508,0 0,27.648707 z m 134.71856,1.84838 c 0,-19.562036 8.61706,-27.18661 20.92716,-27.18661 14.07966,0 20.00389,8.702797 20.00389,27.72572 0,19.33099 -8.694,27.26363 -20.85021,27.26363 -14.15661,0 -20.08084,-8.7028 -20.08084,-27.80274 l 0,0 z m -475.3234,0.077 c 0,-19.485024 8.54012,-27.109598 20.85021,-27.109598 14.15661,0 19.85003,8.625781 19.85003,27.648708 0,19.33099 -8.54013,27.18661 -20.85022,27.18661 -14.07967,0 -19.85002,-8.62578 -19.85002,-27.72572 l 0,0 z m 137.56527,26.80153 -13.61804,0 0,-2.38749 3.92384,-1.07822 12.9256,-49.675259 6.69361,0 14.92598,49.675259 4.00079,1.07822 0,2.38749 -20.61941,0 0,-2.38749 4.77016,-1.07822 -4.15465,-12.70763 -11.23296,0 -2.92365,12.70763 5.30873,1.07822 0,2.38749 z m 235.04581,0 -14.23355,0 0,-2.38749 4.38547,-1.07822 12.9256,-49.675259 6.84749,0 14.92598,49.675259 4.46241,1.07822 0,2.38749 -21.00409,0 0,-2.38749 4.69322,-1.07822 -4.23159,-12.70763 -11.38684,0 -2.84671,12.70763 5.46261,1.07822 0,2.38749 z m -297.75034,0 -30.9291,0 0,-2.38749 4.61628,-1.07822 0,-46.209543 -4.38547,-0.847175 0,-2.464509 20.38859,0 0,2.464509 -4.770157,0.847175 0,46.055503 8.309307,0 4.38547,-12.39956 2.38508,0 0,16.01931 z m 3.15446,-50.522428 0,-2.464509 19.38839,0 0,2.464509 -3.8469,0.847175 0,21.641463 11.69459,0 0,-21.641463 -3.61609,-0.847175 0,-2.464509 18.92676,0 0,2.464509 -4.00077,0.847175 0,46.209543 4.38546,1.07822 0,2.38749 -19.31145,0 0,-2.38749 3.61609,-1.07822 0,-20.94833 -11.69459,0 0,20.94833 3.8469,1.07822 0,2.38749 -19.38839,0 0,-2.38749 4.38547,-1.07822 0,-46.055512 -4.38547,-1.001206 z M 259.8968,39.735384 c 0,18.63784 -8.694,25.64629 -19.23451,25.64629 l -20.61941,0 0,-2.38749 4.15466,-1.07822 0,-46.209543 -4.15466,-0.847175 0,-2.464509 19.54227,0 c 13.15641,0 20.31165,6.315304 20.31165,27.340647 l 0,0 z m 19.46534,22.02654 10.07888,0 4.2316,-11.78343 2.69283,0 0,15.40318 -33.23725,0 0,-2.38749 4.92404,-1.07822 0,-46.209543 -4.8471,-0.847175 0,-2.464509 31.46767,0 0,15.326167 -2.61589,0 -4.30853,-11.860452 -8.38625,0 0,21.179372 6.61667,0 1.76958,-6.54635 2.38508,0 0,17.25156 -2.38508,0 -1.76958,-7.08546 -6.61667,0 0,21.10235 z m 160.03118,-46.902678 0,-2.464509 20.31165,0 0,2.464509 -4.69322,0.847175 0,37.429723 c 0,6.93143 1.69264,10.1661 6.69362,10.1661 6.84748,0 9.00175,-4.08184 9.00175,-11.70641 l 0,-35.889413 -4.53935,-0.847175 0,-2.464509 12.23316,0 0,2.464509 -4.15466,0.847175 0,36.659563 c 0,10.32013 -5.07791,14.71004 -15.46455,14.63302 -11.9254,-0.077 -15.07986,-4.69796 -15.07986,-17.02051 l 0,-34.272073 -4.30854,-0.847175 z m 72.70648,50.522428 -30.46747,0 0,-2.38749 4.61628,-1.07822 0,-46.209543 -4.30853,-0.847175 0,-2.464509 20.31165,0 0,2.464509 -4.69322,0.847175 0,46.055503 7.61687,0 4.38547,-12.39956 2.53895,0 0,16.01931 z m 31.69849,-26.1854 c 0,-21.48744 -3.69303,-24.799124 -8.00156,-24.799124 -4.30853,0 -8.694,2.849589 -8.694,24.028964 0,21.41042 3.69302,24.87613 8.07849,24.87613 4.30853,0 8.61707,-3.08063 8.61707,-24.10597 l 0,0 z m -475.40035,0.077 c 0,-21.487434 -3.76996,-24.722102 -8.15543,-24.722102 -4.46241,0 -8.77094,2.772573 -8.77094,23.951942 0,21.41042 3.8469,24.79912 8.23237,24.79912 4.30853,0 8.694,-2.9266 8.694,-24.02896 l 0,0 z m 167.64806,22.48864 3.30834,0 c 6.23198,0 9.15563,-3.3887 9.15563,-22.71969 0,-19.716066 -3.38528,-23.181782 -9.38645,-23.181782 l -3.07752,0 0,45.901472 z m -56.16479,-33.11683 -4.23159,16.94349 9.38644,0 -5.15485,-16.94349 z m 234.96887,0 -4.15466,16.94349 9.23257,0 -5.07791,-16.94349 z m -61.70433,26.1854 c 2.8467,0 5.23179,2.54153 5.23179,5.69918 0,3.23467 -2.53896,5.77619 -5.38567,5.77619 -2.69283,0 -5.23179,-2.54152 -5.23179,-5.77619 0,-3.15765 2.69283,-5.69918 5.38567,-5.69918 l 0,0 z"></path></svg>
+ </h1></a>
+ <div class="l-header__sub">
+ <span class="l-header__brand-stars"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 55 14" version="1.1" class="brand-stars" aria-hidden="true">
+ <g>
+ <polygon points="22.866795,14.321192 24.633205,8.8599664 20,5.4902743 25.733591,5.4902743 27.5,8.8817842e-16 29.266409,5.4902743 35,5.4902743 30.366795,8.8599664 32.133205,14.321192 27.5,10.92245" class="brand-stars-blue"></polygon>
+ <polygon points="2.8667954,14.321192 4.6332046,8.8599664 0,5.4902743 5.7335907,5.4902743 7.5,8.8817842e-16 9.2664093,5.4902743 15,5.4902743 10.366795,8.8599664 12.133205,14.321192 7.5,10.92245" class="brand-stars-red"></polygon>
+ <polygon points="42.866795,14.321192 44.633205,8.8599664 40,5.4902743 45.733591,5.4902743 47.5,8.8817842e-16 49.266409,5.4902743 55,5.4902743 50.366795,8.8599664 52.133205,14.321192 47.5,10.92245" class="brand-stars-dark"></polygon>
+ </g></svg></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </header>
+ <div class="block">
+ <div class="container">
+ <div class="c-advertising c-advertising--pub-super">
+ <div id="banner-970x250-area" class="c-advertising__banner-area"></div>
+ </div>
+ </div>
+ </div>
+ <main id="conteudo" class="main">
+ <article id="c-news" class="c-news" itemscope="itemscope" itemtype="https://schema.org/NewsArticle" role="main">
+ <meta itemprop="mainEntityOfPage" content="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" />
+ <meta itemprop="description" content="Na ocasião, técnico do Corinthians entregou réplica do troféu ao ex-presidente" />
+ <link itemprop="sameAs" href="https://www1.folha.uol.com.br" />
+ <div itemprop="publisher" itemscope="itemscope" itemtype="https://schema.org/Organization">
+ <meta itemprop="name" content="Folha de S.Paulo" />
+ <div itemprop="logo" itemscope="itemscope" itemtype="https://schema.org/ImageObject">
+ <meta itemprop="url" content="https://f.i.uol.com.br/hunting/folha/1/amp/logo.png" />
+ <meta itemprop="width" content="300" />
+ <meta itemprop="height" content="60" />
+ </div>
+ </div>
+ <div itemprop="author" itemscope="itemscope" itemtype="https://schema.org/Organization">
+ <meta itemprop="name" content="Folha de S.Paulo" />
+ </div>
+ <div itemprop="image" itemscope="itemscope" itemtype="https://schema.org/ImageObject">
+ <meta itemprop="url" content="https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_md.jpg" />
+ <meta itemprop="width" content="768" />
+ <meta itemprop="height" content="512" />
+ </div>
+ <div class="block">
+ <div class="container">
+ <div class="flex flex--gutter flex--col flex--md-row">
+ <div class="flex-cell">
+ <div class="row">
+ <div class="col col--md-1-1 col--lg-10-15 col-offset--lg-5-18">
+ <header class="c-content-head" data-share-text="">
+ <div class="c-content-head__wrap">
+ <h1 class="c-content-head__title" itemprop="headline">
+ Tite diz que errou ao levar taça da Libertadores a Lula em 2012
+ </h1>
+ <h2 class="c-content-head__subtitle" itemprop="alternativeHeadline">
+ Na ocasião, técnico do Corinthians entregou réplica do troféu ao ex-presidente
+ </h2>
+ </div>
+ </header>
+ <div class="c-tools-share c-tools-share--bordered-md toolbar">
+ <ul aria-label="Opções de compartilhamento" class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-counter="" data-sharebar-buttons="facebook whatsapp twitter" data-sharebar-channel="esporte" data-sharebar-limit="2" data-sharebar-url="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-sharebar-uolpd-id="content" data-sharebar-text="Tite diz que errou ao levar taça da Libertadores a Lula em 2012">
+ <li class="c-tools-share__item">
+ <a aria-label="Ir para a seção de comentários" href="#comentarios" class="c-tools-share__button c-tools-share__button--comment" title="Comentários"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--comments" aria-hidden="true">
+ <path d="M18,8H6V6H18V8M18,11H6V9H18V11M18,14H6V12H18V14M22,4A2,2 0 0,0 20,2H4A2,2 0 0,0 2,4V16A2,2 0 0,0 4,18H18L22,22V4Z"></path></svg> </a>
+ </li>
+ <li class="c-tools-share__item">
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button aria-label="Ver todas opções de compartilhamento" data-trigger="" class="c-tools-share__button c-tools-share__button--neutral"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 17 5" height="24" width="24" class="icon icon--more-options" aria-hidden="true">
+ <path d="M2.5 0.5c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2zm12 0c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2zm-6 0c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2z"></path></svg></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button aria-label="Fechar seção de opções" data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest rss email" data-sharebar-channel="esporte" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-sharebar-uolpd-id="content" data-sharebar-text="Tite diz que errou ao levar taça da Libertadores a Lula em 2012">
+ <li class="c-tools-share__item">
+ <button aria-label="Copiar link" data-copy-link="" data-href="https://folha.com/rz1q0xue" class="c-tools-share__button c-tools-share__button--copy-link" title="URL curta"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon--link icon--" aria-hidden="true">
+ <path d="m 1.5200002,7.9999998 c 0,-1.368 1.112,-2.4799996 2.4799999,-2.4799996 l 3.1999996,0 0,-1.5199999 -3.1999996,0 C 1.7920001,4.0000003 1.5e-7,5.7920002 1.5e-7,7.9999998 1.5e-7,10.208 1.7920001,12 4.0000001,12 l 3.1999996,0 0,-1.519999 -3.1999996,0 c -1.368,0 -2.48,-1.1120012 -2.48,-2.4800012 l 0,0 z m 3.2799999,0.800001 6.3999999,0 0,-1.6000011 -6.4,0 0,1.6000011 0,0 z M 12,4.0000003 l -3.2000001,0 0,1.5199999 3.2000001,0 c 1.368,0 2.48,1.1119996 2.48,2.4799996 0,1.368 -1.112,2.4800012 -2.48,2.4800012 l -3.2000001,0 0,1.519999 L 12,12 c 2.208,0 4,-1.792 4,-4.0000002 0,-2.2079997 -1.792,-3.9999995 -4,-3.9999995 l 0,0 z"></path></svg></button> <span class="c-tools-share__button-name" aria-hidden="true">Copiar link</span>
+ </li>
+ <li class="c-tools-share__item u-visible-md">
+ <button aria-label="Imprimir" data-paper-print="" class="c-tools-share__button c-tools-share__button--paper-print" title="Imprimir"><svg xmlns="https://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" class="icon icon--paper-print icon--" aria-hidden="true">
+ <path d="M13.584 4.748H2.424A2.388 2.388 0 0 0 .03 7.14v4.784H3.22v3.19h9.567v-3.19h3.188V7.14a2.388 2.388 0 0 0-2.39-2.392zm-2.39 8.77h-6.38V9.532h6.377v3.986zm2.39-5.58a.8.8 0 0 1-.797-.798c0-.44.36-.797.797-.797.44 0 .797.358.797.797 0 .44-.357.797-.796.797zM12.787.763H3.22V3.95h9.567z"></path></svg></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div class="c-news__head">
+ <div>
+ <div class="widget-image">
+ <figure>
+ <img alt="Luiz Inácio Lula da Silva (ao centro) recebe de Tite e outros representantes do Corinthians réplica da taça da Libertadores" class="img-responsive" srcset="https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_th.jpg 100w, https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_sm.jpg 480w, https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_md.jpg 768w, https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_lg.jpg 1024w, https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_xl.jpg 1200w, https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_rt.jpg 2400w" sizes="(min-width: 1024px) 68vw, 100vw" src="https://f.i.uol.com.br/fotografia/2018/12/21/15454034955c1cfc67131dc_1545403495_3x2_md.jpg" />
+ <figcaption class="widget-image__subtitle">
+ Luiz Inácio Lula da Silva (ao centro) recebe de Tite e outros representantes do Corinthians réplica da taça da Libertadores - <span class="widget-image__credits">Heinrich Aikawa/Instituto Lula</span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-fixed col-fixed--md-300 u-visible-md"></div>
+ </div>
+ </div>
+ </div>
+ <div class="block">
+ <div class="container" data-paywall-box="">
+ <div class="flex flex--gutter flex--col flex--md-row">
+ <div class="flex-cell">
+ <div class="row">
+ <div class="col col--lg-5-18">
+ <div class="c-more-options">
+ <div class="c-more-options__header">
+ <time class="c-more-options__published-date" itemprop="datePublished" datetime="2018-12-21 12:55:00">21.dez.2018 às 12h55</time>
+ </div>
+ <div class="c-more-options__footer u-no-print">
+ <ul class="c-more-options__list c-more-options__list--secundary" data-change-font-size="" data-children="[data-link]" data-target="[data-news-content-text], [data-force-change-font-size]">
+ <li>
+ <div data-readspeaker="">
+ <span tabindex="0" class="sr-only">Ouvir o texto</span>
+ </div>
+ </li>
+ <li>
+ <button class="c-more-options__button rs_preserve" data-link="" data-action="less"><span class="u-sr-only">Diminuir fonte</span> <svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" version="1.1" class="icon icon--font-size-less" aria-hidden="true">
+ <path d="M2.56 17.759L6.367 6h3.298l3.806 11.759V18h-2.827l-.753-2.485H5.933L5.198 18H2.56zm6.69-4.433L7.912 8.875l-1.338 4.451zM16.274 11.143h5.166v2.228h-5.166z"></path></svg></button>
+ </li>
+ <li>
+ <button class="c-more-options__button rs_preserve" data-link="" data-action="more"><span class="u-sr-only">Aumentar fonte</span> <svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" version="1.1" class="icon icon--font-size-more" aria-hidden="true">
+ <path d="M1.815 17.759L5.603 6h3.281l3.788 11.759V18H9.859l-.75-2.485H5.171L4.441 18H1.815zm6.657-4.433L7.14 8.875l-1.331 4.451zm7.057-2.356h2.36V8.571h1.937v2.4h2.359v1.746h-2.36v2.712h-1.937v-2.712h-2.359z"></path></svg></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="col col--md-1-1 col--lg-12-18">
+ <div class="c-news__content">
+ <div class="c-signature c-signature--left" data-force-change-font-size="">
+ <strong class="c-signature__location">São Paulo</strong>
+ </div>
+ <div class="c-news__body" data-share-text="" data-news-content-text="" data-disable-copy="" data-continue-reading="" data-continue-reading-hide-others=".js-continue-reading-hidden" itemprop="articleBody">
+ <p>
+ Após rechaçar <a href="https://www1.folha.uol.com.br/esporte/2018/12/tite-se-recusa-a-encontrar-bolsonaro-antes-da-disputa-da-copa-america.shtml">um encontro da seleção brasileira com o presidente eleito Jair</a> <a href="https://www1.folha.uol.com.br/esporte/2018/12/tite-se-recusa-a-encontrar-bolsonaro-antes-da-disputa-da-copa-america.shtml">Bolsonaro</a>, o técnico Tite declarou que errou ao levar a taça da Copa Libertadores de 2012, conquistada pelo Corinthians, ao ex-presidente Luiz Inácio Lula da Silva.
+ </p>
+ <p>
+ Ao lado de representantes do clube paulista, o atual comandante do Brasil ainda entregou uma réplica do troféu a Lula.
+ </p>
+ <p>
+ "Em 2012 eu errei. Ele não era presidente, mas fui ao Instituto e mandei felicitações por um aniversário. Não me posicionei politicamente. Não tenho partido político, tenho sim a torcida para que o Brasil seja melhor em igualdade social. E que nossas prioridades sejam educação e punição. Que seja dada a possibilidade de estudo ao garoto de São Braz, que não tem chão batido para ir à escola, ou da periferia de Caixas ou do morro do Rio de Janeiro. Seja dada a ele a prioridade de estudo e não a outras situações", falou Tite ao programa "Grande Círculo", que ainda irá ao ar no SporTV.
+ </p>
+ <p>
+ Na ocasião, Tite e outros representantes do Corinthians <a href="https://www1.folha.uol.com.br/poder/1124743-corinthians-leva-a-taca-da-libertadores-para-lula.shtml">foram ao Instituto Lula para mostrar a taça</a> original da Libertadores ao ex-presidente.
+ </p>
+ <div>
+ <div class="js-gallery-widget">
+ <figure class="gallery-widget-pre">
+ <figcaption class="gallery-widget-pre__caption">
+ <a href="https://fotografia.folha.uol.com.br/galerias/nova/1618838542352047-os-times-de-coracao-dos-presidentes" class="gallery-widget-pre__link">Os times de coração dos presidentes</a>
+ </figcaption><a href="https://fotografia.folha.uol.com.br/galerias/nova/1618838542352047-os-times-de-coracao-dos-presidentes" class="gallery-widget-pre__link"><img src="https://f.i.uol.com.br/fotografia/2018/12/03/15438447625c05339a96ad0_1543844762_3x2_md.jpg" alt="Os times de coração dos presidentes" class="gallery-widget-pre__photo" /></a>
+ </figure>
+ <div class="gallery-widget is-hidden" data-channel="esporte">
+ <div class="gallery-widget__header is-hidden rs_skip">
+ <a href="javascript:void(0);" class="gallery-widget__header-mosaic"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-grid-three">
+ <path d="M0 0v4h4V0H0zm6 0v4h4V0H6zm6 0v4h4V0h-4zM0 6v4h4V6H0zm6 0v4h4V6H6zm6 0v4h4V6h-4zM0 12v4h4v-4H0zm6 0v4h4v-4H6zm6 0v4h4v-4h-4z"></path></svg></a> <span class="gallery-widget__header-counter"></span>
+ <h3 class="gallery-widget__header-title">
+ <a href="#" class="gallery-widget__header-title-link"></a>
+ </h3><a href="javascript:void(0);" class="gallery-widget__header-minhafolha is-hidden" title="Minha Folha"><img src="//f.i.uol.com.br/guia/gallery/icons/ic_save.svg" class="icon icon-save" alt="Minha Folha" /></a> <a href="javascript:void(0);" data-action="open" class="gallery-widget__header-fullscreen" title="Fullscreen"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-full-screen">
+ <path d="M10.31 0H16v5.692h-2.255V2.256H10.31V0zm3.435 13.745V10.31H16V16h-5.69v-2.255h3.435zM0 5.69V0h5.692v2.255H2.256V5.69H0zm2.255 4.62v3.435H5.69V16H0v-5.69h2.255z"></path></svg></a> <a href="javascript:void(0);" data-action="close" class="gallery-widget__header-close rs_skip is-hidden" title="Fechar"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-close">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></a>
+ </div><!-- Content -->
+ <div class="gallery-widget__content">
+ <div class="gallery-widget-carousel is-hidden">
+ <div class="gallery-widget-carousel__container">
+ <ol class="list-unstyled gallery-widget-carousel__list"></ol><a href="javascript:void(0);" class="gallery-widget-carousel__btn gallery-widget-carousel__btn-prev gallery-widget--is-hidden"><span><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-left rs_skip">
+ <title>
+ Ícone seta para esquerda
+ </title>
+ <path d="M11.06 0l1.88 1.88L6.833 8l6.107 6.12L11.06 16l-8-8 8-8z"></path></svg></span></a> <a href="javascript:void(0);" class="gallery-widget-carousel__btn gallery-widget-carousel__btn-next gallery-widget--is-hidden"><span><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-right rs_skip">
+ <title>
+ Ícone seta para direita
+ </title>
+ <path d="M4.94 0L3.06 1.88 9.167 8 3.06 14.12 4.94 16l8-8-8-8z"></path></svg></span></a>
+ </div>
+ <div class="gallery-widget-carousel__info is-hidden rs_skip">
+ <div class="gallery-widget-carousel__info-container">
+ <p class="gallery-widget-carousel__info-description"></p><a href="#" class="gallery-widget-carousel__info-share" title="Compartilhe"><img src="//f.i.uol.com.br/guia/gallery/icons/ic_share.svg" class="icon icon-share" alt="Compartilhe" /></a>
+ </div>
+ <div class="gallery-widget-carousel__info-read-more-container">
+ <a href="#" class="gallery-widget-carousel__info-read-more is-hidden">Leia Mais</a>
+ </div>
+ </div>
+ <div class="gallery-widget-advertising gallery-widget--is-hidden rs_skip">
+ <div class="gallery-widget-advertising__container">
+ <div class="gallery-widget-advertising__container-cell">
+ <a href="javascript:void(0);" class="gallery-widget-advertising__container-close gallery--is-hidden" title="Fechar"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-close rs_skip">
+ <title>
+ Ícone fechar
+ </title>
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></a> <iframe class="gallery-widget-advertising__content" frameborder="0"></iframe>
+ </div>
+ <div class="gallery-widget-advertising__overlay is-hidden"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="gallery-widget-others gallery-widget--is-hidden">
+ <a href="javascript:;" class="gallery-widget-others__go-back rs_skip"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-left rs_skip">
+ <path d="M11.06 0l1.88 1.88L6.833 8l6.107 6.12L11.06 16l-8-8 8-8z"></path></svg> Voltar</a> <a href="javascript:void(0);" class="gallery-widget-others__close is-hidden rs_skip" title="Fechar"><svg xmlns="//www.w3.org/2000/svg" viewbox="0 0 16 16" width="14" height="14" class="icon icon-close">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></a> <button class="gallery-widget-others__btn rs_skip">Ver novamente</button>
+ </div>
+ <div class="gallery-widget-mosaic gallery-widget--is-hidden">
+ <div class="gallery-widget-mosaic__top">
+ <a href="javascript:;" class="gallery-widget-mosaic__go-back rs_skip"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-left rs_skip">
+ <title>
+ Ícone seta para esquerda
+ </title>
+ <path d="M11.06 0l1.88 1.88L6.833 8l6.107 6.12L11.06 16l-8-8 8-8z"></path></svg> Voltar</a>
+ <h4 class="gallery-widget-mosaic__title rs_skip"></h4>
+ <p class="gallery-widget-mosaic__description rs_skip"></p>
+ </div>
+ <div class="gallery-widget-mosaic__list">
+ <div class="gallery-widget-mosaic__container">
+ <ol class="gallery-widget-mosaic__thumbnails"></ol>
+ </div>
+ </div>
+ <nav class="gallery-widget-mosaic__nav is-invisible">
+ <a href="javascript:void(0);" class="gallery-widget-mosaic__btn gallery-widget-mosaic__btn-prev"><span><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-left rs_skip">
+ <title>
+ Ícone seta para cima
+ </title>
+ <path d="M11.06 0l1.88 1.88L6.833 8l6.107 6.12L11.06 16l-8-8 8-8z"></path></svg></span></a> <a href="javascript:void(0);" class="gallery-widget-mosaic__btn gallery-widget-mosaic__btn-next"><span><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-right rs_skip">
+ <title>
+ Ícone seta para baixo
+ </title>
+ <path d="M4.94 0L3.06 1.88 9.167 8 3.06 14.12 4.94 16l8-8-8-8z"></path></svg></span></a>
+ </nav>
+ </div>
+ <div class="gallery-widget-share-container">
+ <div class="gallery-widget-share is-hidden">
+ <a href="" class="gallery-widget-share__go-back is-hidden rs_skip"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-chevron-left rs_skip">
+ <title>
+ Ícone seta para esquerda
+ </title>
+ <path d="M11.06 0l1.88 1.88L6.833 8l6.107 6.12L11.06 16l-8-8 8-8z"></path></svg> Voltar</a>
+ <h4 class="gallery-widget-share__title is-hidden">
+ Compartilhe
+ </h4>
+ <ul class="list-unstyled gallery-widget-share__list">
+ <li>
+ <a class="gallery-widget-share-facebook" href="" target="_blank" rel="external" title="Compartilhe via facebook"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-facebook rs_skip">
+ <title>
+ Ícone Facebook
+ </title>
+ <path d="M9.5 3H12V0H9.5C7.57 0 6 1.57 6 3.5V5H4v3h2v8h3V8h2.5l.5-3H9V3.5c0-.27.23-.5.5-.5z"></path></svg></a> <span class="is-hidden">Facebook</span>
+ </li>
+ <li class="is-hidden">
+ <a class="gallery-widget-share-whatsapp" href="" target="_blank" rel="external" title="Compartilhe via whatsapp"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-whatsapp rs_skip">
+ <title>
+ Ícone Whatsapp
+ </title>
+ <path d="M8.132-.007c-4.268 0-7.73 3.49-7.73 7.794 0 1.472.406 2.85 1.11 4.024L.117 15.994l4.28-1.382c1.107.618 2.38.97 3.735.97 4.27 0 7.73-3.49 7.73-7.793 0-4.305-3.46-7.794-7.73-7.794zm0 14.346c-1.32 0-2.55-.4-3.575-1.085l-2.497.807.812-2.434a6.554 6.554 0 0 1-1.238-3.842c0-3.613 2.915-6.552 6.498-6.552s6.498 2.94 6.498 6.552c0 3.613-2.915 6.553-6.498 6.553z"></path>
+ <path d="M6.365 4.525c-.125-.304-.22-.314-.414-.324a4.407 4.407 0 0 0-.216-.005c-.25 0-.508.074-.663.235-.19.195-.662.653-.662 1.593S5.088 7.87 5.18 8c.096.126 1.325 2.084 3.238 2.883 1.493.623 1.936.568 2.276.493.496-.11 1.118-.478 1.276-.924.158-.446.158-.828.11-.908-.047-.08-.173-.127-.363-.223-.19-.094-1.12-.556-1.294-.62-.174-.064-.335-.044-.468.142-.184.257-.362.522-.51.678-.114.124-.3.14-.46.072-.208-.09-.8-.297-1.522-.948A5.747 5.747 0 0 1 6.41 7.32c-.112-.19-.01-.304.074-.408.097-.12.187-.204.282-.315.094-.112.147-.17.21-.3.063-.126.02-.258-.026-.353-.048-.096-.427-1.036-.585-1.42z"></path></svg></a> <span class="is-hidden">Whatsapp</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-twitter" href="" target="_blank" rel="external" title="Compartilhe via twitter"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-twitter rs_skip">
+ <title>
+ Ícone Twitter
+ </title>
+ <path d="M16 3.202a.275.275 0 0 0-.273-.273c-.085 0-.674.246-.828.29.204-.24.673-.966.673-1.273a.275.275 0 0 0-.273-.273.283.283 0 0 0-.136.042c-.58.316-1.135.564-1.784.7a3.498 3.498 0 0 0-2.406-.973 3.455 3.455 0 0 0-3.448 3.45c0 .136.01.28.035.418A8.736 8.736 0 0 1 2.5 3.11c-.34-.307-.63-.64-.938-.982a.268.268 0 0 0-.23-.102c-.095 0-.17.068-.214.136-.307.453-.47 1.187-.47 1.733 0 .794.274 1.57.786 2.186-.163-.052-.41-.214-.555-.214-.18 0-.334.128-.334.307 0 1.195.657 2.305 1.664 2.928-.077-.007-.145-.033-.222-.033a.272.272 0 0 0-.264.265c0 .034.008.06.017.094a3.44 3.44 0 0 0 2.493 2.296 6.07 6.07 0 0 1-3.2.905c-.256 0-.512-.042-.76-.042a.275.275 0 0 0-.273.273c0 .094.05.17.128.23.222.163.495.3.742.427a9.265 9.265 0 0 0 4.267 1.042c3.72 0 6.904-1.998 8.44-5.396.554-1.22.878-2.56.853-3.9v-.282c.58-.436 1.143-1 1.527-1.623A.295.295 0 0 0 16 3.202z"></path></svg></a> <span class="is-hidden">Twitter</span>
+ </li>
+ <li class="is-hidden">
+ <a class="gallery-widget-share-messenger" href="" target="_blank" title="Messenger"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 18 18" width="16" height="16" class="icon icon-messenger rs_skip">
+ <title>
+ Ícone de messenger
+ </title>
+ <path d="M8.742.742c-4.418 0-8 3.27-8 7.304 0 2.299 1.163 4.35 2.981 5.688v2.785l2.724-1.474a8.71 8.71 0 0 0 2.295.306c4.418 0 8-3.27 8-7.305 0-4.034-3.582-7.304-8-7.304zm.795 9.836L7.5 8.436l-3.975 2.142 4.372-4.577 2.087 2.143L13.91 6l-4.373 4.577z"></path></svg></a> <span class="is-hidden">Messenger</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-gplus" href="" target="_blank" rel="external" title="Compartilhe via google-plus"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-google-plus rs_skip">
+ <title>
+ Ícone Google Plus
+ </title>
+ <path d="M5.09 7.272V9.02H7.98c-.115.75-.872 2.196-2.887 2.196-1.737 0-3.156-1.44-3.156-3.215 0-1.774 1.42-3.215 3.157-3.215.99 0 1.65.422 2.03.785L8.5 4.24c-.888-.83-2.038-1.332-3.41-1.332A5.09 5.09 0 0 0 0 8.002a5.085 5.085 0 0 0 5.09 5.09c2.938 0 4.888-2.065 4.888-4.975 0-.334-.038-.59-.082-.844H5.09zM16 7.125h-1.5v-1.5H13v1.5h-1.5v1.5H13v1.5h1.5v-1.5H16z"></path></svg></a> <span class="is-hidden">Google</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-pinterest" href="" target="_blank" rel="external" title="Compartilhe via pinterest"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-pinterest rs_skip">
+ <title>
+ Ícone Pinterest
+ </title>
+ <path d="M6.894 10.582C6.474 12.785 5.96 14.897 4.44 16c-.47-3.33.688-5.83 1.226-8.484-.917-1.544.11-4.65 2.044-3.884 2.38.94-2.06 5.738.92 6.338 3.113.625 4.383-5.4 2.453-7.36-2.788-2.83-8.117-.066-7.46 3.986.16.99 1.182 1.29.408 2.658-1.784-.395-2.316-1.803-2.248-3.68C1.892 2.502 4.542.352 7.2.054c3.36-.377 6.514 1.234 6.95 4.395.49 3.568-1.517 7.433-5.11 7.155-.975-.076-1.383-.56-2.146-1.023z"></path></svg></a> <span class="is-hidden">Pinterest</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-linkedin" href="" target="_blank" rel="external" title="Compartilhe via linkedin"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-linkedin rs_skip">
+ <title>
+ Ícone Linkedin
+ </title>
+ <path d="M.522 3.422c.335.335.802.503 1.36.503h.02c.597 0 1.063-.168 1.417-.503.354-.355.522-.765.522-1.287 0-.504-.187-.932-.523-1.268C2.982.53 2.516.363 1.94.363 1.36.363.894.53.54.867.187 1.203 0 1.63 0 2.135c0 .522.168.932.522 1.287zM.205 15.637h3.432V5.343H.205v10.294zm8.746 0V9.892c0-.354.04-.634.113-.84.15-.353.373-.65.672-.894.28-.242.652-.354 1.1-.354.596 0 1.025.205 1.305.615.28.41.43.988.43 1.715v5.502H16V9.743c0-1.53-.354-2.685-1.08-3.468-.73-.784-1.68-1.175-2.873-1.175-.43 0-.84.056-1.194.168a2.47 2.47 0 0 0-.913.447 4.1 4.1 0 0 0-.578.542c-.15.167-.3.353-.43.577h.02v-1.49H5.52l.018.502v3.077c0 1.715 0 3.954-.018 6.714h3.43z"></path></svg></a> <span class="is-hidden">Linkedin</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-email" href="" target="_blank" rel="external" title="Compartilhe via email"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-envelope rs_skip">
+ <title>
+ Ícone de envelope
+ </title>
+ <path d="M14.4 1.6H1.6C.72 1.6.008 2.32.008 3.2L0 12.8c0 .88.72 1.6 1.6 1.6h12.8c.88 0 1.6-.72 1.6-1.6V3.2c0-.88-.72-1.6-1.6-1.6zm0 3.2L8 8.8l-6.4-4V3.2l6.4 4 6.4-4v1.6z"></path></svg></a> <span class="is-hidden">E-mail</span>
+ </li>
+ <li>
+ <a class="gallery-widget-share-clipboard" href="" title="Copiar link"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-link rs_skip">
+ <title>
+ Ícone de link
+ </title>
+ <desc>
+ Cadeado representando um link
+ </desc>
+ <path d="M1.52 8A2.482 2.482 0 0 1 4 5.52h3.2V4H4a4 4 0 0 0-4 4 4 4 0 0 0 4 4h3.2v-1.52H4A2.482 2.482 0 0 1 1.52 8zm3.28.8h6.4V7.2H4.8v1.6zM12 4H8.8v1.52H12A2.482 2.482 0 0 1 14.48 8 2.482 2.482 0 0 1 12 10.48H8.8V12H12a4 4 0 0 0 4-4 4 4 0 0 0-4-4z"></path></svg></a> <span class="is-hidden">Copiar link</span> <input type="text" class="gallery-widget-share-clipboard-input is-hidden" /> <button type="button" class="gallery-widget-share-clipboard-close is-hidden"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon-close rs_skip">
+ <title>
+ Ícone fechar
+ </title>
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="gallery-widget__loading rs_skip">
+ <img src="//f.i.uol.com.br/hunting/furniture/1/common/icons/spin.gif" alt="Loading" class="gallery-widget__loading-spin" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <p>
+ O assunto foi levantado&#160;porque recentemente Tite foi questionado se aceitaria um encontro da seleção brasileira com Bolsonaro em uma conquista de título ou <a href="https://www1.folha.uol.com.br/esporte/2018/12/selecao-brasileira-jogara-duas-vezes-em-sao-paulo-na-copa-america.shtml">antes da Copa América de 2019</a>, por exemplo. O treinador deixou claro que preferiria evitar esse tipo de formalidade.
+ </p>
+ <p>
+ Apesar disso, Tite não questionou a ação de Palmeiras e CBF, que <a href="https://www1.folha.uol.com.br/esporte/2018/12/cbf-usa-festa-do-palmeiras-para-se-aproximar-de-governo-bolsonaro.shtml">convidaram Bolsonaro para a festa do título do Campeonato Brasileiro</a>. O presidente eleito até levantou a taça conquistada pelo clube alviverde.
+ </p>
+ <p>
+ "Em 2012 eu fiz e errei. O protocolo e a situação gerada no jogo do Palmeiras são fatos de opinião pessoal. CBF e Palmeiras, enquanto instituições têm a opinião. Errei lá atrás, não faria com o presidente antes da Copa e nem agora porque entendo que misturar esporte e política não é legal. Fiz errado lá atrás? Sim. Faria de novo? Não", acrescentou o comandante.
+ </p>
+ </div>
+ <div class="c-signature js-continue-reading-hidden">
+ <strong class="c-signature__agency">UOL</strong>
+ </div>
+ <div class="c-news__stars u-no-print js-continue-reading-hidden">
+ <svg viewbox="0 0 51 12" xmlns="https://www.w3.org/2000/svg" class="stars" aria-hidden="true">
+ <g fill="none" fill-rule="evenodd">
+ <path fill="#E51717" d="M8.77 7.59l1.411 4.379-3.717-2.711-3.718 2.71 1.429-4.377L.457 4.898h4.597L6.464.522l1.428 4.376h4.597z"></path>
+ <path fill="#2BACE2" d="M27.71 7.59l1.411 4.379-3.717-2.711-3.718 2.71 1.429-4.377-3.718-2.693h4.597l1.41-4.376 1.428 4.376h4.597z"></path>
+ <path fill="#000" d="M46.65 7.59l1.411 4.379-3.717-2.711-3.718 2.71 1.429-4.377-3.718-2.693h4.597l1.41-4.376 1.428 4.376h4.597z"></path>
+ </g></svg>
+ </div>
+ <div class="c-topics u-no-print js-continue-reading-hidden">
+ <strong class="c-topics__title">Tópicos <span class="u-visually-hidden">relacionados</span></strong>
+ <ul class="c-topics__list">
+ <li class="c-topics__item">
+ <a href="//www1.folha.uol.com.br/folha-topicos/corinthians" class="c-topics__link">corinthians</a>
+ </li>
+ <li class="c-topics__item">
+ <a href="//www1.folha.uol.com.br/folha-topicos/futebol" class="c-topics__link">Futebol</a>
+ </li>
+ <li class="c-topics__item">
+ <a href="//www1.folha.uol.com.br/folha-topicos/libertadores" class="c-topics__link">libertadores</a>
+ </li>
+ </ul>
+ </div>
+ <ul class="c-button-list u-no-print js-continue-reading-hidden rs_skip">
+ <li class="c-button-list__item">
+ <a href="//www1.folha.uol.com.br/enviesuanoticia/" class="c-button c-button--full-md">Envie sua notícia</a>
+ </li>
+ <li class="c-button-list__item">
+ <a href="//tools.folha.com.br/feedback?url=https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" title="Comunicar erro - Site externo" target="_blank" class="c-button c-button--neutral c-button--full-md">Erramos?</a>
+ </li>
+ </ul>
+ <div class="u-only-print rs_skip" aria-hidden="true">
+ <h4 class="c-heading">
+ Endereço da página
+ </h4>
+ <ul class="u-list-unstyled">
+ <li>https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml
+ </li>
+ </ul>
+ </div>
+ <section id="comentarios" class="comments-article rs_skip u-visually-hidden u-no-print js-continue-reading-hidden" data-version="2" data-site="Folha de S.Paulo" data-section="esporte" data-service="folha" data-title="Tite diz que errou ao levar taça da Libertadores a Lula em 2012" data-url="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-type="news" data-id="1620472946540368">
+ <header>
+ <h2>
+ Comentários
+ </h2>
+ <p class="terms hide">
+ <small>Os comentários não representam a opinião do jornal; a responsabilidade é do autor da mensagem.</small>
+ </p>
+ <div class="user-info hide"></div>
+ </header>
+ <footer>
+ <div class="terms-conditions">
+ <a href="//comentarios1.folha.uol.com.br/termos">Termos e condições</a>
+ </div><a class="more c-button c-button--full-md hide">Todos os comentários</a> <a class="comment-action c-button c-button--primary c-button--full-md hide">Comente*</a>
+ <div class="comment-info">
+ <span>* Apenas para assinantes</span>
+ </div>
+ </footer>
+ </section>
+ <script type="text/template" class="rs_preserve rs_skip" id="tmpl-comment">
+ <![CDATA[
+ <article>
+ <header style="position: relative;">
+ <div class="u-clearfix">
+ <h3></h3>
+
+ <span class="time"></span>
+ </div>
+
+ <div class="share">
+ <a href="javascript:void();">
+ <i class="sprite icon-plus"></i> Compartilhar
+ </a>
+
+ <span class="arrow"></span>
+
+ <ul>
+ <li><a class="share-facebook"><i class="section-sprite facebook"></i> Facebook</a></li>
+ <li><a class="share-twitter"><i class="section-sprite twitter"></i> Twitter</a></li>
+ <li><a class="share-gplus"><i class="section-sprite google_plus"></i> Google+</a></li>
+ </ul>
+ </div>
+ </header>
+
+ <div class="comment-body">
+ <i class="section-sprite comment-large"></i>
+ </div>
+
+ <footer>
+ <a class="btn reply"><i class="section-sprite reply"></i> Responda</a>
+
+ <div class="rating" style="position: static;">
+ <a class="vote good">
+ <i class="section-sprite comment-like"></i>
+ </a>
+
+ <div class="confirm-rating good hide">
+ <img class="loading" src="//f.i.uol.com.br/folha/furniture/5.4/images/loading-alternate.gif">
+ </div>
+
+ <a class="vote bad">
+ <i class="section-sprite comment-like"></i>
+ </a>
+
+ <div class="confirm-rating bad hide">
+ <img class="loading" src="//f.i.uol.com.br/folha/furniture/5.4/images/loading-alternate.gif">
+ </div>
+ </div>
+
+ <a class="to-report">
+ <i class="section-sprite warning"></i> Denuncie
+ </a>
+
+ <div class="result"><p></p></div>
+ </footer>
+ </article>
+ ]]>
+ </script>
+ <script type="text/template" class="rs_preserve rs_skip" id="tmpl-comment_dialog">
+ <![CDATA[
+
+ <h4>Avaliar comentário como</h4>
+
+ <div class="action">
+ <a class="btn confirm">Confirmar</a>
+
+ <div class="result"></div>
+
+ <div class="evaluators hide">
+ <h4>Também avaliaram</h4>
+ <ul class="unstyled"></ul>
+ </div>
+ </div>
+ ]]>
+ </script>
+ </div>
+ </div>
+ </div>
+ </div>
+ <aside class="col-fixed col-fixed--md-300 u-no-print rs_skip">
+ <div class="u-global-margin-bottom-component">
+ <h4 class="c-section-title c-section-title--brand">
+ Relacionadas
+ </h4>
+ <ul class="c-newslist c-newslist--no-gap">
+ <li>
+ <div class="c-headline c-headline--horizontal-small">
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/tecnico-do-santos-deu-treino-da-arvore-cruzou-america-e-virou-piada-na-argentina.shtml" class="c-headline__url"><img class="c-headline__image" src="//f.i.uol.com.br/fotografia/2018/06/22/15297007675b2d619f51e79_1529700767_3x2_xs.jpg" alt="" />
+ <h2 class="c-headline__title">
+ Técnico do Santos dirigiu time em árvore, cruzou América e virou piada na Argentina
+ </h2></a>
+ </div>
+ </li>
+ <li>
+ <div class="c-headline c-headline--horizontal-small">
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/com-tres-de-bale-real-vence-o-kashima-e-vai-em-busca-do-setimo-titulo-mundial.shtml" class="c-headline__url">
+ <h2 class="c-headline__title">
+ Com três de Bale, Real vence o Kashima e vai em busca do sétimo título mundial
+ </h2></a>
+ </div>
+ </li>
+ <li>
+ <div class="c-headline c-headline--horizontal-small">
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/globo-muda-horario-e-rodadas-de-quarta-no-futebol-brasileiro-serao-as-21h30.shtml" class="c-headline__url">
+ <h2 class="c-headline__title">
+ Globo muda horário, e rodada de quarta no futebol brasileiro será às 21h30
+ </h2></a>
+ </div>
+ </li>
+ <li>
+ <div class="c-estudio-folha-headline">
+ <div id="banner-native-related" class="c-advertising__banner-area"></div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div class="c-advertising c-advertising--300x250">
+ <div id="banner-300x250-area" class="c-advertising__banner-area"></div>
+ </div>
+ <div class="c-wildcard-box u-global-margin-bottom-component">
+ <h3 class="c-section-title c-section-title--brand">
+ Veja também
+ </h3>
+ <ul class="c-newslist c-newslist--no-gap">
+ <li>
+ <div class="c-headline c-headline--small">
+ <div class="c-headline__media-wrapper">
+ <a href="https://arte.folha.uol.com.br/esporte/2018/onde-pode-chegar-na-rodada/"><img class="c-headline__image" src="https://f.i.uol.com.br/fotografia/2018/08/31/15357551815b89c3ada3637_1535755181_5x2_sm.jpg" alt="Soccer Football - Brasileiro Championship - Flamengo v Sao Paulo - Maracana stadium, Rio de Janeiro, Brazil- July 18, 2018. Sao Paulo's Diego Souza (L) and Nene celebrates after the match. REUTERS/Ricardo Moraes ORG XMIT: AST101" /></a>
+ </div>
+ <div class="c-headline__wrapper">
+ <div class="c-headline__head">
+ <h3 class="c-headline__kicker c-kicker">
+ Tabela
+ </h3>
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button data-trigger="" type="button" name="button" class="c-headline__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--share">
+ <path d="m 12.818311,11.294921 c 1.280064,0 2.333667,1.054406 2.333667,2.333668 0,1.279261 -1.054406,2.371411 -2.333667,2.371411 -1.279262,0 -2.333668,-1.09215 -2.333668,-2.371411 0,-0.187915 0,-0.377435 0.03774,-0.526802 L 4.8407964,9.789199 A 2.4252158,2.4252158 0 0 1 0.772537,8.020076 2.4252158,2.4252158 0 0 1 4.8383872,6.250954 L 10.48384,2.9761092 A 2.8974102,2.8974102 0 0 1 10.40915,2.4091547 C 10.40915,1.0921502 11.5013,0 12.818304,0 c 1.317008,0 2.409159,1.0921502 2.409159,2.4091547 0,1.3170047 -1.092151,2.4091553 -2.409155,2.4091553 -0.640032,0 -1.204577,-0.263401 -1.656695,-0.677776 L 5.5161598,7.453925 c 0.036941,0.187914 0.074684,0.377434 0.074684,0.564545 0,0.187111 -0.037744,0.377434 -0.075486,0.562137 l 5.7217422,3.31339 c 0.417587,-0.377434 0.979724,-0.602289 1.582012,-0.602289 z"></path></svg> <span class="u-visually-hidden">Compartilhar Confira em tempo real a posição de seu clube no Brasileiro</span></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny">
+ <title>
+ Ícone fechar
+ </title>
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest email" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://arte.folha.uol.com.br/esporte/2018/onde-pode-chegar-na-rodada/" data-sharebar-utm-campaign-prefix="comp" data-sharebar-uolpd-id="internal" data-sharebar-text="Confira em tempo real a posição de seu clube no Brasileiro"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline__content">
+ <a href="https://arte.folha.uol.com.br/esporte/2018/onde-pode-chegar-na-rodada/" class="c-headline__url">
+ <h2 class="c-headline__title">
+ Confira em tempo real a posição de seu clube no Brasileiro
+ </h2></a>
+ </div>
+ </div>
+ </div>
+ </li>
+ <li>
+ <div class="c-headline c-headline--small">
+ <div class="c-headline__wrapper">
+ <div class="c-headline__head">
+ <h3 class="c-headline__kicker c-kicker">
+ Futebol Internacional
+ </h3>
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button data-trigger="" type="button" name="button" class="c-headline__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--share">
+ <path d="m 12.818311,11.294921 c 1.280064,0 2.333667,1.054406 2.333667,2.333668 0,1.279261 -1.054406,2.371411 -2.333667,2.371411 -1.279262,0 -2.333668,-1.09215 -2.333668,-2.371411 0,-0.187915 0,-0.377435 0.03774,-0.526802 L 4.8407964,9.789199 A 2.4252158,2.4252158 0 0 1 0.772537,8.020076 2.4252158,2.4252158 0 0 1 4.8383872,6.250954 L 10.48384,2.9761092 A 2.8974102,2.8974102 0 0 1 10.40915,2.4091547 C 10.40915,1.0921502 11.5013,0 12.818304,0 c 1.317008,0 2.409159,1.0921502 2.409159,2.4091547 0,1.3170047 -1.092151,2.4091553 -2.409155,2.4091553 -0.640032,0 -1.204577,-0.263401 -1.656695,-0.677776 L 5.5161598,7.453925 c 0.036941,0.187914 0.074684,0.377434 0.074684,0.564545 0,0.187111 -0.037744,0.377434 -0.075486,0.562137 l 5.7217422,3.31339 c 0.417587,-0.377434 0.979724,-0.602289 1.582012,-0.602289 z"></path></svg> <span class="u-visually-hidden">Compartilhar Veja onde assistir e o que você precisa saber sobre os torneios europeus</span></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny">
+ <title>
+ Ícone fechar
+ </title>
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest email" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/esporte/2018/08/veja-onde-assistir-e-o-que-voce-precisa-saber-sobre-os-torneios-europeus.shtml" data-sharebar-utm-campaign-prefix="comp" data-sharebar-uolpd-id="internal" data-sharebar-text="Veja onde assistir e o que você precisa saber sobre os torneios europeus"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline__content">
+ <a href="https://www1.folha.uol.com.br/esporte/2018/08/veja-onde-assistir-e-o-que-voce-precisa-saber-sobre-os-torneios-europeus.shtml" class="c-headline__url">
+ <h2 class="c-headline__title">
+ Veja onde assistir e o que você precisa saber sobre os torneios europeus
+ </h2></a>
+ </div>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div><!--!-->
+ <div class="c-advertising c-advertising--300x600" data-sticky="">
+ <div id="banner-300x600-area" class="c-advertising__banner-area"></div>
+ </div>
+ </aside>
+ </div>
+ </div>
+ </div>
+ </article>
+ <div class="block u-no-print">
+ <div class="container">
+ <div class="flex flex--gutter flex--col flex--md-row">
+ <div class="flex-cell">
+ <div class="row">
+ <div class="col col--lg-10-15 col-offset--lg-5-18">
+ <div class="c-outbrain">
+ <div class="OUTBRAIN" data-src="https://www1.folha.uol.com.br/esporte/2018/12/tite-diz-que-errou-ao-levar-taca-da-libertadores-a-lula-em-2012.shtml" data-widget-id="AR_12" data-ob-template="Folha"></div>
+ <script type="text/javascript" async="async" src="https://widgets.outbrain.com/outbrain.js"></script>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-fixed col-fixed--md-300">
+ <div class="c-estudio-folha">
+ <!-- Header -->
+ <div class="c-estudio-folha__header">
+ <div class="c-estudio-folha__logo">
+ <a href="//estudio.folha.uol.com.br/institucional/"><svg xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" width="166" height="45" class="icon icon--estudio-folha">
+ <defs>
+ <rect id="a" width="300" height="360" rx="3"></rect>
+ </defs>
+ <g fill="none" fill-rule="evenodd">
+ <g transform="translate(-67 -10)">
+ <use fill="none" xlink:href="#a"></use>
+ <rect width="299" height="359" x=".5" y=".5" stroke="#E0E0E0" rx="3"></rect>
+ </g>
+ <path fill="#221F1F" d="M81.45 0h13.23v6.57h-1.17l-1.8-5.04h-3.6v8.82h2.79l.72-2.7h1.08v7.2h-1.08l-.72-2.97h-2.79v8.91l2.61.45v.99h-9.36v-.99l2.16-.45V1.44L81.45.99V0zm14.13 12.33c0-7.11 3.15-9.99 7.65-9.99 5.22 0 7.38 3.24 7.38 10.26 0 7.11-3.15 9.99-7.65 9.99-5.22 0-7.38-3.24-7.38-10.26zm10.62.27c0-7.92-1.35-9.09-2.97-9.09s-3.24 1.08-3.24 8.82c0 7.92 1.35 9.18 2.97 9.18 1.62-.09 3.24-1.17 3.24-8.91zm5.04 9.63v-.9l1.71-.36V4.05l-1.62-.36v-.9h7.47v.9l-1.71.36v16.92h2.97l1.62-4.59h.9v5.94h-11.34v-.09zM123.3 2.7h7.2v.9l-1.44.36v7.92h4.32V4.05l-1.44-.45v-.9h6.93v.9l-1.44.36v16.92l1.62.36v.9h-7.11v-.9l1.35-.36v-7.65h-4.32v7.65l1.44.36v.9h-7.2v-.9l1.62-.36V4.05l-1.62-.45c.09 0 .09-.9.09-.9zm16.38 19.53v-.9l1.35-.36L145.8 2.7h2.52l5.49 18.27 1.44.36v.9h-7.56v-.9l1.8-.36-1.53-4.68h-4.14l-1.08 4.68 1.98.36v.9h-5.04zm4.41-7.29h3.42l-1.89-6.12-1.53 6.12zm-77.4-.265c0-1.08.18-2.07.45-2.97a6.5 6.5 0 0 1 1.26-2.34c.54-.72 1.26-1.26 2.07-1.62.81-.36 1.62-.54 2.61-.54.99 0 1.89.18 2.7.54.81.36 1.44.9 2.07 1.53a6.5 6.5 0 0 1 1.26 2.34c.27.9.45 1.89.45 2.97v.45c0 1.08-.18 2.07-.45 2.97a6.5 6.5 0 0 1-1.26 2.34c-.54.63-1.26 1.17-2.07 1.53-.81.36-1.71.54-2.7.54-.99 0-1.89-.18-2.61-.54-.81-.36-1.44-.9-2.07-1.53-.54-.63-.99-1.44-1.35-2.34-.27-.9-.45-1.89-.45-2.97l.09-.36zm1.53.45c0 .81.09 1.62.36 2.34.18.72.54 1.35.9 1.89.36.54.9.99 1.53 1.35.63.36 1.26.45 2.07.45.81 0 1.44-.18 2.07-.45.63-.36 1.08-.81 1.53-1.35.45-.54.72-1.26.9-1.89.18-.72.36-1.53.36-2.34v-.45c0-.81-.09-1.53-.36-2.25-.18-.72-.54-1.35-.9-1.89-.36-.54-.9-.99-1.53-1.35a4.18 4.18 0 0 0-2.07-.54c-.81 0-1.44.18-2.07.54-.63.36-1.08.81-1.53 1.35-.45.54-.72 1.26-.9 1.89-.18.72-.36 1.53-.36 2.25v.45zm-5.76-11.88c0-.27.09-.54.27-.81.18-.18.45-.36.81-.36.36 0 .63.09.81.36.18.18.27.45.27.81 0 .36-.09.54-.27.81-.18.18-.45.27-.81.27-.36 0-.63-.09-.81-.27-.18-.27-.36-.54-.27-.81zm.27 18.99h1.62V7.475h-1.62v14.76zm-14.94-7.56c0-1.17.09-2.16.36-3.06.27-.9.63-1.71 1.08-2.34.45-.63 1.08-1.17 1.8-1.53.72-.36 1.44-.54 2.34-.54.99 0 1.89.18 2.61.63s1.35.99 1.8 1.71v-8.28h1.62v20.88h-1.53l-.09-1.98c-.45.72-1.08 1.26-1.8 1.62-.72.36-1.62.63-2.7.63-.81 0-1.62-.18-2.34-.54-.72-.36-1.26-.9-1.71-1.53-.45-.63-.81-1.44-1.08-2.34-.27-.9-.36-1.89-.36-3.06v-.27zm1.62.36c0 .9.09 1.71.27 2.43a6 6 0 0 0 .81 1.89c.36.54.81.99 1.35 1.26s1.17.45 1.89.45c.54 0 1.08-.09 1.44-.18.45-.09.81-.36 1.17-.54.36-.27.63-.54.9-.81.27-.36.45-.72.63-1.08v-6.93c-.18-.36-.36-.72-.63-1.08-.45-.72-1.17-1.26-2.07-1.53-.45-.18-.99-.27-1.53-.27-.72 0-1.35.18-1.89.45-.54.36-.99.72-1.35 1.26-.36.54-.63 1.17-.81 1.98-.18.81-.27 1.62-.27 2.43.09-.09.09.27.09.27zm-5.67 5.31c-.45.63-1.08 1.26-1.8 1.53-.72.36-1.71.54-2.79.54-.72 0-1.35-.09-1.98-.27-.54-.18-1.08-.54-1.53-.99-.45-.45-.72-.99-.99-1.71s-.36-1.53-.36-2.61v-9.36h1.62v9.45c0 .81.09 1.44.27 1.98.18.54.45.99.72 1.26.27.27.63.54 1.08.72.45.18.81.18 1.26.18.63 0 1.17-.09 1.71-.18.45-.09.9-.36 1.26-.63s.63-.54.9-.9.45-.72.54-1.17V7.474h1.62v14.76h-1.53c.09 0 0-1.89 0-1.89zm-2.07-18.9h1.98l-3.06 3.78h-1.44l2.52-3.78zm-12.42 2.25v3.78h2.97v1.35h-2.97v9.81c0 .54.09.9.18 1.26.09.27.27.54.45.72.18.18.36.27.63.36.27.09.45.09.72.09.27 0 .45 0 .72-.09.18 0 .45-.09.63-.09l.09 1.35c-.27.09-.54.18-.81.18-.36 0-.63.09-.9.09-.45 0-.9-.09-1.26-.18s-.72-.36-.99-.63-.45-.72-.63-1.17c-.18-.45-.27-1.08-.27-1.8v-9.9h-2.7v-1.35h2.7v-3.78h1.44zm-6.57 14.76c0-.27-.09-.63-.18-.9s-.27-.54-.54-.81-.63-.54-1.17-.72c-.54-.27-1.17-.45-1.98-.63-.72-.18-1.44-.36-2.16-.63-.63-.27-1.17-.54-1.62-.81-.45-.27-.72-.72-.99-1.17-.18-.45-.36-.99-.36-1.53s.09-1.08.36-1.53c.27-.54.63-.9.99-1.26.45-.36.99-.63 1.62-.9.72-.27 1.44-.36 2.25-.36s1.62.09 2.25.36c.63.18 1.26.54 1.71.9.45.36.81.9 1.08 1.44.27.54.36 1.08.36 1.71h-1.62c0-.36-.09-.72-.27-1.08-.18-.36-.45-.72-.72-.99-.36-.27-.72-.54-1.17-.72-.45-.18-.99-.27-1.62-.27-.63 0-1.17.09-1.62.27-.45.18-.81.36-1.08.63-.27.18-.45.54-.63.81-.09.27-.18.63-.18.9 0 .36.09.63.18.9s.27.54.54.72c.27.27.63.45 1.17.63.54.18 1.17.36 1.98.54.9.18 1.62.45 2.25.72.63.27 1.17.54 1.53.9.45.36.72.72.9 1.17.18.45.27.99.27 1.53 0 .63-.09 1.17-.36 1.71s-.63.99-1.08 1.26c-.45.36-.99.63-1.71.81-.63.18-1.35.27-2.16.27-.9 0-1.71-.09-2.43-.36-.72-.27-1.26-.54-1.8-.99-.45-.36-.81-.9-1.08-1.44-.27-.54-.36-1.08-.36-1.62h1.71c0 .54.18 1.08.45 1.44.27.36.54.72.99.9.36.27.81.36 1.26.54.45.09.9.18 1.35.18.63 0 1.17-.09 1.62-.18.45-.09.81-.36 1.17-.54.36-.27.54-.54.72-.81.09-.27.18-.63.18-.99zm-11.97-5.76H1.62v8.1h10.44v1.44H0v-19.8h12.06v1.44H1.62v7.47h9.09v1.35zm128.61 26.819c0-.09 0-.27-.09-.36-.09-.09-.09-.27-.27-.36l-.54-.27-.81-.27-1.08-.27c-.27-.09-.54-.27-.81-.45l-.54-.54c-.09-.27-.18-.54-.18-.81s.09-.54.18-.81.27-.45.54-.63.54-.36.81-.45c.36-.09.72-.18 1.08-.18.45 0 .81.09 1.17.18.36.09.63.27.9.45.45.36.72.99.72 1.62h-1.26c0-.18 0-.27-.09-.45s-.18-.27-.27-.36c-.18-.09-.27-.18-.45-.27-.18-.09-.45-.09-.63-.09-.27 0-.45 0-.63.09s-.36.18-.45.27c-.09.09-.18.18-.27.36-.09.27-.09.54 0 .72l.27.27c.09.09.27.18.54.27.18.09.45.18.81.18.45.09.81.18 1.17.36.36.09.63.27.81.45.18.18.36.36.45.54.09.18.18.45.18.72 0 .27-.09.63-.18.9s-.36.45-.54.63c-.27.18-.54.36-.9.45-.36.09-.72.18-1.17.18-.45 0-.9-.09-1.26-.18s-.63-.27-.9-.54a1.4 1.4 0 0 1-.54-.72c-.09-.27-.18-.54-.18-.9h1.26c0 .27.09.45.18.63s.27.27.36.45c.18.09.36.18.54.18.18 0 .36.09.54.09.27 0 .45 0 .63-.09s.36-.09.45-.18c.09-.09.18-.18.27-.36.09-.18.18-.27.18-.45zm-10.98-1.62c0 .36 0 .72.09.99.09.36.18.63.36.81.18.27.36.45.63.54.27.18.54.18.9.18s.63-.09.9-.18c.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.36.09-.63.09-.99v-.09c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18s-.63.09-.9.18c-.27.18-.45.36-.63.54-.18.27-.27.54-.36.81-.09.36-.09.63-.09.99v.09zm-1.26-.09c0-.54.09-.99.27-1.44.18-.45.36-.81.63-1.17.27-.36.63-.54.99-.72.45-.18.9-.27 1.35-.27.54 0 .99.09 1.35.27.36.18.72.45.99.72.27.36.54.72.63 1.17.18.45.18.9.18 1.44v.18c0 .54-.09.99-.18 1.44-.18.45-.36.81-.63 1.17-.27.36-.63.54-.99.72-.45.18-.9.27-1.35.27-.45 0-.9-.09-1.35-.27-.36-.18-.72-.45-.99-.72-.27-.36-.54-.72-.63-1.17-.18-.45-.27-.99-.27-1.44v-.18zm-6.3.09c0 .36 0 .72.09.99s.18.63.36.81c.18.27.36.45.63.54.27.18.54.18.81.18.18 0 .45 0 .54-.09.36-.09.63-.27.81-.54.09-.09.18-.27.27-.45v-3.24c-.09-.18-.18-.27-.27-.36-.18-.27-.54-.45-.81-.54-.18-.09-.36-.09-.54-.09-.36 0-.63.09-.9.18-.27.18-.45.36-.63.54-.18.27-.27.54-.36.81-.09.27-.09.63-.09.99l.09.27zm-1.26-.09c0-.54.09-1.08.18-1.53.09-.45.36-.81.54-1.17.27-.36.54-.54.9-.72.36-.18.72-.27 1.17-.27.45 0 .81.09 1.17.18.36.18.63.36.81.63v-3.69h1.26v10.17h-1.08l-.09-.72c-.27.27-.54.54-.9.63-.36.18-.72.27-1.17.27-.45 0-.81-.09-1.17-.27-.36-.18-.63-.45-.9-.72a2.79 2.79 0 0 1-.54-1.17c-.18-.45-.18-.99-.18-1.44v-.18zm-4.68 2.7c.18 0 .45 0 .63-.09l.54-.27c.18-.09.27-.18.45-.36.09-.09.18-.27.27-.36v-1.44h-.99c-.72 0-1.26.09-1.62.36-.36.27-.54.54-.54.99 0 .18 0 .36.09.45.09.18.18.27.27.36.09.09.27.18.45.27.09 0 .27.09.45.09zm2.07.9c-.09-.09-.09-.18-.09-.36s-.09-.27-.09-.45l-.36.36c-.27.27-.63.36-.99.45-.18.09-.45.09-.63.09-.36 0-.72-.09-.99-.18a1.96 1.96 0 0 1-.72-.45c-.18-.18-.36-.45-.45-.63-.09-.27-.18-.54-.18-.81 0-.36.09-.72.18-.99.18-.27.36-.54.63-.72.27-.18.63-.36.99-.45.45-.09.9-.18 1.35-.18h1.17v-.54c0-.45-.09-.81-.36-.99-.27-.27-.63-.36-1.17-.36-.27 0-.45 0-.63.09s-.36.18-.45.27c-.09.09-.27.18-.27.36-.09.09-.09.27-.09.45h-1.26c0-.27.09-.54.18-.72.18-.27.36-.45.54-.72.27-.18.54-.36.9-.45.36-.09.72-.18 1.17-.18.36 0 .72.09 1.08.18.36.09.63.27.81.45.27.18.45.45.54.72.09.27.18.63.18 1.08v3.33c0 .27 0 .54.09.72 0 .27.09.54.18.72v-.09h-1.26zm-10.71-7.11v.9c.27-.36.54-.54.9-.72.36-.18.72-.27 1.17-.27.36 0 .63.09.9.18s.54.27.72.45c.18.18.36.45.45.81.09.36.18.72.18 1.17v4.59h-1.08v-4.68c0-.27 0-.54-.09-.72-.09-.18-.18-.36-.27-.45-.09-.09-.27-.18-.45-.27-.18-.09-.45-.09-.63-.09-.36 0-.72.09-1.08.36-.27.18-.54.45-.72.81v5.04h-1.26v-7.11h1.26zm-4.41-1.89c0-.18.09-.36.18-.54.09-.18.27-.18.54-.18s.45.09.54.18c.09.18.18.36.18.54 0 .18-.09.36-.18.45-.09.09-.27.18-.54.18s-.45-.09-.54-.18c-.18-.09-.18-.27-.18-.45zm0 9h1.26v-7.11h-1.26v7.11zm-4.23-.9c.45 0 .81-.18 1.17-.36.18-.09.27-.27.36-.45.09-.18.18-.36.18-.54h1.17c0 .36-.09.63-.27.9-.18.27-.36.54-.63.72-.54.45-1.26.72-1.98.72-.54 0-.99-.09-1.44-.27-.36-.18-.72-.45-.99-.81-.27-.36-.45-.72-.63-1.17-.09-.45-.18-.9-.18-1.35v-.27c0-.45.09-.9.18-1.35.09-.45.36-.81.63-1.17.27-.36.63-.54.99-.81.36-.18.9-.27 1.44-.27.45 0 .81.09 1.17.18.36.09.63.27.9.54s.45.54.54.81c.18.36.18.63.27.99h-1.17c0-.18-.09-.45-.18-.63-.18-.36-.45-.72-.9-.81-.18-.09-.45-.09-.63-.09-.36 0-.72.09-.9.18-.27.18-.45.36-.63.63s-.27.54-.36.81c-.09.27-.09.63-.09.9v.27c0 .36 0 .63.09.9s.18.54.36.81.36.45.63.63c.18.36.54.36.9.36zm-9.63-2.61c0 .36 0 .72.09.99.09.36.18.63.36.81.18.27.36.45.63.54.27.18.54.18.9.18s.63-.09.9-.18c.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.36.09-.63.09-.99v-.09c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18s-.63.09-.9.18c-.27.18-.45.36-.63.54-.18.27-.27.54-.36.81-.09.36-.09.63-.09.99v.09zm-1.26-.09c0-.54.09-.99.27-1.44.18-.45.36-.81.63-1.17.27-.36.63-.54.99-.72.45-.18.9-.27 1.35-.27.54 0 .99.09 1.35.27.36.18.72.45.99.72.27.36.54.72.63 1.17.18.45.18.9.18 1.44v.18c0 .54-.09.99-.18 1.44-.18.45-.36.81-.63 1.17-.27.36-.63.54-.99.72-.45.18-.9.27-1.35.27-.45 0-.9-.09-1.35-.27-.36-.18-.72-.45-.99-.72-.27-.36-.54-.72-.63-1.17-.18-.45-.27-.99-.27-1.44v-.18zm-.81-2.43c-.18 0-.36-.09-.63-.09-.45 0-.81.09-.99.27-.27.18-.45.45-.63.72v5.13h-1.17v-7.11h1.17v.81c.18-.27.45-.54.72-.72.27-.18.63-.27.99-.27h.27c.09 0 .18 0 .27.09v1.17zm-6.21-2.79v1.71H81v.9h-1.35v4.41c0 .18 0 .36.09.45 0 .09.09.18.18.27.09.09.18.09.27.09h.63c.09 0 .18 0 .27-.09v1.08c-.09 0-.18.09-.36.09s-.36.09-.54.09c-.18 0-.45 0-.63-.09s-.36-.18-.54-.36c-.18-.18-.27-.36-.36-.63-.09-.27-.09-.54-.09-.9v-4.41h-1.26v-.9h1.26v-1.71h1.08zm-6.57 7.92c.18 0 .45 0 .63-.09l.54-.27c.18-.09.27-.18.45-.36.09-.09.18-.27.27-.36v-1.44h-.99c-.72 0-1.26.09-1.62.36-.36.27-.72.45-.72.9 0 .18 0 .36.09.45.09.18.18.27.27.36.09.09.27.18.45.27.18.09.36.18.63.18zm1.98.9c-.09-.09-.09-.18-.09-.36s-.09-.27-.09-.45l-.36.36c-.27.27-.63.36-.99.45-.18.09-.45.09-.63.09-.36 0-.72-.09-.99-.18a1.96 1.96 0 0 1-.72-.45c-.18-.18-.36-.45-.45-.63-.09-.27-.18-.54-.18-.81 0-.36.09-.72.18-.99.18-.27.36-.54.63-.72.27-.18.63-.36.99-.45.45-.09.9-.18 1.35-.18h1.17v-.54c0-.45-.09-.81-.36-.99-.27-.27-.63-.36-1.17-.36-.27 0-.45 0-.63.09s-.36.18-.45.27c-.09.09-.27.18-.27.36-.09.09-.09.27-.09.45h-1.26c0-.27.09-.54.18-.72.09-.18.36-.45.54-.72.27-.18.54-.36.9-.45.36-.09.72-.18 1.17-.18.36 0 .72.09 1.08.18.36.09.63.27.81.45.27.18.45.45.54.72.09.27.18.63.18 1.08v3.33c0 .27 0 .54.09.72 0 .27.09.54.18.72v-.09h-1.26zm-7.2-3.6c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18-.18 0-.36 0-.54.09-.36.09-.63.27-.81.54-.09.09-.18.27-.27.36v3.33c.09.18.18.27.27.36.09.09.27.18.36.27.18.09.27.18.45.18.18.09.36.09.54.09.36 0 .63-.09.81-.18.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.27.09-.63.09-.99.09-.09.09-.18.09-.18zm1.26.09c0 .54-.09.99-.18 1.44-.09.45-.27.81-.54 1.17-.27.36-.54.54-.9.72-.36.18-.72.27-1.17.27-.45 0-.81-.09-1.17-.18-.36-.18-.63-.36-.9-.63v3.42H63v-9.9h1.08l.09.81c.27-.27.54-.54.9-.72.36-.18.72-.27 1.17-.27.45 0 .81.09 1.17.27.36.18.63.45.9.72.27.36.45.72.54 1.17.09.45.18.9.18 1.53.09.09.09.18.09.18zm-12.15 1.62c0-.09 0-.27-.09-.36-.09-.09-.09-.27-.27-.36l-.54-.27-.81-.27-1.08-.27c-.27-.09-.54-.27-.81-.45l-.54-.54c-.09-.27-.18-.54-.18-.81s.09-.54.18-.81.27-.45.54-.63.54-.36.81-.45c.36-.09.72-.18 1.08-.18.45 0 .81.09 1.17.18.36.09.63.27.9.45.45.36.72.99.72 1.62h-1.26c0-.18 0-.27-.09-.45s-.18-.27-.27-.36c-.18-.09-.27-.18-.45-.27-.18-.09-.45-.09-.63-.09-.27 0-.45 0-.63.09s-.36.18-.45.27c-.09.09-.18.18-.27.36-.09.27-.09.54 0 .72l.27.27c.09.09.27.18.54.27.18.09.45.18.81.18.45.09.81.18 1.17.36.36.09.63.27.81.45.18.18.36.36.45.54.09.18.18.45.18.72 0 .27-.09.63-.18.9s-.27.45-.54.63-.54.36-.9.45c-.36.09-.72.18-1.17.18-.45 0-.9-.09-1.26-.18s-.63-.27-.9-.54a1.4 1.4 0 0 1-.54-.72c-.09-.27-.18-.54-.18-.9h1.26c0 .27.09.45.18.63s.27.27.45.45c.18.09.36.18.54.18.18 0 .36.09.54.09.27 0 .45 0 .63-.09s.36-.09.45-.18c.09-.09.18-.18.27-.36 0-.18.09-.27.09-.45zm-10.98-1.62c0 .36 0 .72.09.99.09.36.18.63.36.81.18.27.36.45.63.54.27.18.54.18.9.18s.63-.09.9-.18c.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.36.09-.63.09-.99v-.09c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18s-.63.09-.9.18c-.27.18-.45.36-.63.54-.18.27-.27.54-.36.81-.09.36-.09.63-.09.99v.09zm-1.26-.09c0-.54.09-.99.27-1.44.18-.45.36-.81.63-1.17.27-.36.63-.54.99-.72.45-.18.9-.27 1.35-.27.54 0 .99.09 1.35.27.36.18.72.45.99.72.27.36.45.72.63 1.17.18.45.18.9.18 1.44v.18c0 .54-.09.99-.18 1.44-.18.45-.36.81-.63 1.17-.27.36-.63.54-.99.72-.45.18-.9.27-1.35.27-.45 0-.9-.09-1.35-.27-.36-.18-.72-.45-.99-.72-.27-.36-.54-.72-.63-1.17-.18-.45-.27-.99-.27-1.44v-.18zm-2.43-5.22v1.71h1.35v.9H42.3v4.41c0 .18 0 .36.09.45 0 .09.09.18.18.27.09.09.18.09.27.09h.63c.09 0 .18 0 .27-.09v1.08c-.09 0-.18.09-.36.09s-.36.09-.54.09c-.18 0-.45 0-.63-.09s-.36-.18-.54-.36c-.18-.18-.27-.36-.36-.63-.09-.27-.09-.54-.09-.9v-4.41h-1.26v-.9h1.26v-1.71h1.08zm-5.94 2.52c-.27 0-.45 0-.72.18-.18.09-.36.18-.54.36-.18.18-.27.36-.45.63-.09.27-.18.54-.18.9h3.6v-.09c0-.27-.09-.45-.09-.72-.09-.27-.18-.45-.27-.63-.18-.18-.27-.36-.54-.45-.27-.09-.54-.18-.81-.18zm.09 6.39c-.45 0-.9-.09-1.35-.27-.36-.18-.72-.45-.99-.72-.27-.36-.54-.72-.63-1.08-.18-.45-.27-.9-.27-1.35v-.27c0-.54.09-1.08.27-1.53.18-.45.36-.81.72-1.17.27-.27.63-.54.99-.72.36-.18.72-.27 1.17-.27.54 0 .99.09 1.35.27.36.18.63.45.9.72.27.27.45.72.54 1.08.09.45.18.9.18 1.35v.54h-4.86c0 .36.09.63.18.9s.27.54.45.72c.18.18.36.36.63.54.27.09.54.18.9.18.45 0 .81-.09 1.08-.27.27-.18.54-.45.81-.72l.72.54c-.09.18-.27.36-.45.54-.18.18-.36.27-.54.45-.27.18-.45.27-.72.27-.36.27-.72.36-1.08.27zm-6.21-9.09c0-.18.09-.36.18-.54.09-.18.27-.18.54-.18s.45.09.54.18c.09.18.18.36.18.54 0 .18-.09.36-.18.45-.09.09-.27.18-.54.18s-.45-.09-.54-.18c-.18-.09-.18-.27-.18-.45zm1.35 1.89v8.01c0 .63-.18 1.17-.45 1.53-.27.36-.81.54-1.44.54h-.36c-.09 0-.27-.09-.36-.09v-1.08h.54c.27 0 .45-.09.63-.18.18-.18.18-.36.18-.81v-8.01c0 .09 1.26.09 1.26.09zm-8.1 3.6c0 .36 0 .72.09.99.09.36.18.63.36.81.18.27.36.45.63.54.27.18.54.18.9.18s.63-.09.9-.18c.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.36.09-.63.09-.99v-.09c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18s-.63.09-.9.18c-.27.18-.45.36-.63.54-.18.27-.27.54-.36.81-.09.36-.09.63-.09.99v.09zm-1.17-.09c0-.54.09-.99.27-1.44.18-.45.36-.81.63-1.17.27-.36.63-.54.99-.72.45-.18.9-.27 1.35-.27.54 0 .99.09 1.35.27.36.18.72.45.99.72.27.36.54.72.63 1.17.18.45.18.9.18 1.44v.18c0 .54-.09.99-.18 1.44-.18.45-.36.81-.63 1.17-.27.36-.63.54-.99.72-.45.18-.9.27-1.35.27-.45 0-.9-.09-1.35-.27-.36-.18-.72-.45-.99-.72-.27-.36-.54-.72-.63-1.17-.18-.45-.27-.99-.27-1.44v-.18zm-.81-2.43c-.18 0-.36-.09-.63-.09-.45 0-.81.09-.99.27-.27.18-.45.45-.63.72v5.13H18v-7.11h1.17v.81c.18-.27.45-.54.72-.72.27-.18.63-.27.99-.27h.27c.09 0 .18 0 .27.09l.09 1.17zm-6.21 2.43c0-.36 0-.72-.09-.99s-.18-.54-.36-.81-.36-.45-.63-.54c-.27-.18-.54-.18-.9-.18-.18 0-.36 0-.54.09-.36.09-.63.27-.81.54-.09.09-.18.27-.27.36v3.33c.09.18.18.27.27.36.09.09.27.18.36.27.18.09.27.18.45.18.18.09.36.09.54.09.36 0 .63-.09.81-.18.27-.18.45-.36.63-.54.18-.27.27-.54.36-.81.09-.27.09-.63.09-.99.09-.09.09-.18.09-.18zm1.17.09c0 .54-.09.99-.18 1.44-.09.45-.27.81-.54 1.17-.27.36-.54.54-.9.72-.36.18-.72.27-1.17.27-.45 0-.81-.09-1.17-.18-.36-.18-.63-.36-.9-.63v3.42h-1.17v-9.9h1.08l.09.81c.27-.27.54-.54.9-.72.36-.18.72-.27 1.17-.27.45 0 .81.09 1.17.27.36.18.63.45.9.72.27.36.45.72.54 1.17.09.45.18.9.18 1.53v.18z"></path>
+ <path fill="#E1181C" d="M163.8 6.035l.63 2.07-1.71-1.26-1.8 1.26.72-2.07-1.8-1.26H162l.63-2.07.63 2.07h2.16z"></path>
+ <path fill="#3EAAE0" d="M163.8 13.055l.63 2.07-1.71-1.26-1.8 1.26.72-2.07-1.8-1.26H162l.63-2.07.63 2.07h2.16z"></path>
+ <path fill="#020303" d="M163.8 19.985l.63 2.07-1.71-1.26-1.8 1.26.72-2.07-1.8-1.26H162l.63-2.07.63 2.07h2.16z"></path>
+ </g></svg></a>
+ </div>
+ </div><!-- Main -->
+ <div class="c-estudio-folha__main">
+ <div class="c-estudio-folha__rotate">
+ <div class="c-rotate-generic" data-rotate-generic="" data-rotate-generic-autoplay="5000" data-rotate-generic-effect="slider" data-rotate-generic-eldots=".js-estudio-folha__control-dots" data-rotate-generic-prev=".js-estudio-folha__control-prev" data-rotate-generic-next=".js-estudio-folha__control-next" data-rotate-generic-btnpause=".js-estudio-folha__control-pause" data-rotate-generic-labelpause="parar|retomar">
+ <div class="c-rotate-generic__stage-outer">
+ <button class="c-estudio-folha__control c-estudio-folha__control--prev js-estudio-folha__control-prev"><svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="icon icon--chevron-left icon--estudio-folha-control">
+ <path d="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z"></path></svg></button> <button class="c-estudio-folha__control c-estudio-folha__control--next js-estudio-folha__control-next"><svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="icon icon--chevron-right icon--estudio-folha-control">
+ <path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"></path></svg></button>
+ <div class="c-rotate-generic__stage js-rotate-generic__stage">
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2Bs8WqO" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1833840.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2Bs8WqO" class="c-estudio-folha__link">
+ <p>
+ <b>Organização atende 250 crianças e oferece aulas de luta, dança e música</b>
+ </p><img src="//f.i.uol.com.br/estudiofolha/images/1734138.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2CjBeFA" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1835239.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2CjBeFA" class="c-estudio-folha__link">
+ <p>
+ <b>Saiba como planejar e cumprir suas metas em 2019</b>
+ </p><img src="//f.i.uol.com.br/estudiofolha/images/1833922.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2QPwX4R" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1834842.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2QPwX4R" class="c-estudio-folha__link">
+ <p>
+ <b>COE pode aumentar potencial de rendimentos sem risco de perder o dinheiro aplicado</b>
+ </p><img src="//f.i.uol.com.br/estudiofolha/images/1825615.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2QQE5he" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1834816.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2QQE5he" class="c-estudio-folha__link">
+ <p>
+ <b>Novas tendências de consumo apontam escolha por praticidade e segurança alimentar</b>
+ </p><img src="http://f.i.uol.com.br/estudiofolha/images/1832651.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2Phy4VR" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1834518.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2Phy4VR" class="c-estudio-folha__link">
+ <p>
+ <b>Banco do Brasil lança app que auxilia produtores rurais</b>
+ </p><img src="https://f.i.uol.com.br/estudiofolha/images/1833351.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2EpMFxJ" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/183514.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2EpMFxJ" class="c-estudio-folha__link">
+ <p>
+ <b>Aplicação pouco conhecida, COE pode garantir ganhos maiores com capital protegido</b>
+ </p><img src="//f.i.uol.com.br/estudiofolha/images/1825615.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2ry3b6k" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1834519.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2ry3b6k" class="c-estudio-folha__link">
+ <p>
+ <b>Projetos premiados trabalham a relação tributos e cidadania</b>
+ </p><img src="http://f.i.uol.com.br/estudiofolha/images/1832722.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2Aj1pKp" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1832742.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2Aj1pKp" class="c-estudio-folha__link">
+ <p>
+ <b>Estímulo à inovação gera interesse estrangeiro no setor aéreo nacional</b>
+ </p><img src="//f.i.uol.com.br/estudiofolha/images/1829216.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ <div class="c-rotate-generic__item js-rotate-generic__item">
+ <div class="c-estudio-folha__content">
+ <div class="c-estudio-folha__image-main">
+ <a href="http://bit.ly/2KJ4yb3" class="c-estudio-folha__link"><img src="//f.i.uol.com.br/estudiofolha/images/1834516.jpeg" alt="" /></a>
+ </div><a href="http://bit.ly/2KJ4yb3" class="c-estudio-folha__link">
+ <p>
+ <b>Programa TAP Miles&amp;Go otimiza tempo de seus passageiros e agiliza viagem</b>
+ </p><img src="https://f.i.uol.com.br/estudiofolha/images/1831142.jpeg" class="c-estudio-folha__sponsored-logo" alt="" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div><!-- Footer -->
+ <div class="c-estudio-folha__footer">
+ <div class="c-estudio-folha__dots js-estudio-folha__control-dots"></div>
+ <div class="c-estudio-folha__pause">
+ <button class="js-estudio-folha__control-pause">parar</button>
+ </div>
+ </div>
+ </div><!--// -->
+ <div class="c-advertising c-advertising--300x250" data-sticky="">
+ <div id="banner-300x250-2-area" class="c-advertising__banner-area"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="block t-soft u-no-print">
+ <div class="container">
+ <div class="c-most-read">
+ <div class="c-most-read__head">
+ <h2 class="c-most-read__title c-section-title">
+ Mais lidas <span class="c-most-read__section c-section-title__thin">em Esporte</span>
+ </h2><a href="//www1.folha.uol.com.br/maispopulares/" class="c-button c-most-read__see-more" title="Ver todas matérias mais lidas">Ver todas</a>
+ </div>
+ <ol class="c-most-read__list">
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/fenomeno-do-basquete-dos-eua-refutou-futebol-americano-e-deve-chegar-a-nba.shtml">Fenômeno do basquete dos EUA refutou futebol americano e deve chegar à NBA</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/secretario-de-esportes-e-bem-relacionado-com-militares-e-cupula-do-governo.shtml">Militar irá comandar secretaria de esporte do governo Bolsonaro</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/globo-muda-horario-e-rodadas-de-quarta-no-futebol-brasileiro-serao-as-21h30.shtml">Globo muda horário, e rodada de quarta no futebol brasileiro será às 21h30</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/ana-marcela-ve-toquio-20-como-ultima-chance-e-diz-temer-intolerancia-sexual.shtml">Ana Marcela vê Tóquio-20 como última chance e diz temer intolerância sexual</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte/2018/12/quem-e-o-al-ain-time-que-desbancou-o-river-plate-no-mundial-de-clubes.shtml">Quem é o Al Ain, time que desbancou o River Plate no Mundial de Clubes</a>
+ </li>
+ </ol>
+ </div>
+ </div>
+ </div>
+ <div class="block u-no-print">
+ <div class="container">
+ <div class="flex flex--gutter flex--col flex--md-row">
+ <div class="flex-cell">
+ <h4 class="c-section-title c-section-title--brand">
+ Principais do dia
+ </h4>
+ <div class="c-headline c-headline--newslist">
+ <div class="c-headline__media-wrapper">
+ <a href="https://www1.folha.uol.com.br/cotidiano/2018/12/covas-quebra-promessa-de-doria-e-preve-dinheiro-de-privatizacao-na-previdencia.shtml"><img class="c-headline__image" src="https://f.i.uol.com.br/fotografia/2018/04/06/15230315615ac79e095b8f3_1523031561_3x2_sm.jpg" alt="Covas quebra promessa de Doria e prevê dinheiro de privatização na previdência" /></a>
+ </div>
+ <div class="c-headline__wrapper">
+ <div class="c-headline__head">
+ <h3 class="c-headline__kicker c-kicker">
+ <a href="http://www1.folha.uol.com.br/folha-topicos/joao-doria">João Doria</a>
+ </h3>
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button data-trigger="" type="button" name="button" class="c-headline__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--share" aria-hidden="true">
+ <path d="m 12.818311,11.294921 c 1.280064,0 2.333667,1.054406 2.333667,2.333668 0,1.279261 -1.054406,2.371411 -2.333667,2.371411 -1.279262,0 -2.333668,-1.09215 -2.333668,-2.371411 0,-0.187915 0,-0.377435 0.03774,-0.526802 L 4.8407964,9.789199 A 2.4252158,2.4252158 0 0 1 0.772537,8.020076 2.4252158,2.4252158 0 0 1 4.8383872,6.250954 L 10.48384,2.9761092 A 2.8974102,2.8974102 0 0 1 10.40915,2.4091547 C 10.40915,1.0921502 11.5013,0 12.818304,0 c 1.317008,0 2.409159,1.0921502 2.409159,2.4091547 0,1.3170047 -1.092151,2.4091553 -2.409155,2.4091553 -0.640032,0 -1.204577,-0.263401 -1.656695,-0.677776 L 5.5161598,7.453925 c 0.036941,0.187914 0.074684,0.377434 0.074684,0.564545 0,0.187111 -0.037744,0.377434 -0.075486,0.562137 l 5.7217422,3.31339 c 0.417587,-0.377434 0.979724,-0.602289 1.582012,-0.602289 z"></path></svg> <span class="u-visually-hidden">Compartilhar</span></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest rss email" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/cotidiano/2018/12/covas-quebra-promessa-de-doria-e-preve-dinheiro-de-privatizacao-na-previdencia.shtml" data-sharebar-text="Covas quebra promessa de Doria e prevê dinheiro de privatização na previdência" data-sharebar-channel="cotidiano"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline__content">
+ <a href="https://www1.folha.uol.com.br/cotidiano/2018/12/covas-quebra-promessa-de-doria-e-preve-dinheiro-de-privatizacao-na-previdencia.shtml">
+ <h2 class="c-headline__title">
+ Covas quebra promessa de Doria e prevê dinheiro de privatização na previdência
+ </h2>
+ <p class="c-headline__standfirst">
+ Atual gestão tucana em São Paulo havia prometido usar venda de equipamentos na área social
+ </p><time class="c-headline__dateline" itemprop="datePublished" datetime="2018-12-21 10:55:00">21.dez.2018 às 10h55</time></a>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline c-headline--newslist">
+ <div class="c-headline__media-wrapper">
+ <a href="https://www1.folha.uol.com.br/poder/2018/12/pela-primeira-vez-na-republica-ministerio-excluira-norte-e-nordeste.shtml"><img class="c-headline__image" src="https://f.i.uol.com.br/fotografia/2018/12/19/15452261445c1a47a062deb_1545226144_3x2_sm.jpg" alt="Pela primeira vez na República, ministério que toma posse excluirá Norte e Nordeste" /></a>
+ </div>
+ <div class="c-headline__wrapper">
+ <div class="c-headline__head">
+ <h3 class="c-headline__kicker c-kicker">
+ <a href="https://www1.folha.uol.com.br/especial/2018/governo-bolsonaro">Governo Bolsonaro</a>
+ </h3>
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button data-trigger="" type="button" name="button" class="c-headline__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--share" aria-hidden="true">
+ <path d="m 12.818311,11.294921 c 1.280064,0 2.333667,1.054406 2.333667,2.333668 0,1.279261 -1.054406,2.371411 -2.333667,2.371411 -1.279262,0 -2.333668,-1.09215 -2.333668,-2.371411 0,-0.187915 0,-0.377435 0.03774,-0.526802 L 4.8407964,9.789199 A 2.4252158,2.4252158 0 0 1 0.772537,8.020076 2.4252158,2.4252158 0 0 1 4.8383872,6.250954 L 10.48384,2.9761092 A 2.8974102,2.8974102 0 0 1 10.40915,2.4091547 C 10.40915,1.0921502 11.5013,0 12.818304,0 c 1.317008,0 2.409159,1.0921502 2.409159,2.4091547 0,1.3170047 -1.092151,2.4091553 -2.409155,2.4091553 -0.640032,0 -1.204577,-0.263401 -1.656695,-0.677776 L 5.5161598,7.453925 c 0.036941,0.187914 0.074684,0.377434 0.074684,0.564545 0,0.187111 -0.037744,0.377434 -0.075486,0.562137 l 5.7217422,3.31339 c 0.417587,-0.377434 0.979724,-0.602289 1.582012,-0.602289 z"></path></svg> <span class="u-visually-hidden">Compartilhar</span></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest rss email" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/poder/2018/12/pela-primeira-vez-na-republica-ministerio-excluira-norte-e-nordeste.shtml" data-sharebar-text="Pela primeira vez na República, ministério que toma posse excluirá Norte e Nordeste" data-sharebar-channel="poder"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline__content">
+ <a href="https://www1.folha.uol.com.br/poder/2018/12/pela-primeira-vez-na-republica-ministerio-excluira-norte-e-nordeste.shtml">
+ <h2 class="c-headline__title">
+ Pela primeira vez na República, ministério que toma posse excluirá Norte e Nordeste
+ </h2>
+ <p class="c-headline__standfirst">
+ No primeiro escalão, há 11 integrantes do Sudeste, 8 do Sul, 2 do Centro-Oeste e 1 colombiano
+ </p><time class="c-headline__dateline" itemprop="datePublished" datetime="2018-12-21 12:00:00">21.dez.2018 às 12h00</time></a>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline c-headline--newslist">
+ <div class="c-headline__media-wrapper">
+ <a href="https://www1.folha.uol.com.br/colunas/reinaldoazevedo/2018/12/torcam-para-que-bolsonaro-consiga-modernizar-guedes.shtml"><img class="c-headline__image" src="https://f.i.uol.com.br/fotografia/2018/11/29/15435040395c0000a79a59e_1543504039_3x2_sm.jpg" alt="Torçam para que Bolsonaro consiga modernizar Guedes" /></a>
+ </div>
+ <div class="c-headline__wrapper">
+ <div class="c-headline__head">
+ <div data-modal-drop="" data-qty-collumn="3.4" class="c-modal-drop">
+ <button data-trigger="" type="button" name="button" class="c-headline__action"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--share" aria-hidden="true">
+ <path d="m 12.818311,11.294921 c 1.280064,0 2.333667,1.054406 2.333667,2.333668 0,1.279261 -1.054406,2.371411 -2.333667,2.371411 -1.279262,0 -2.333668,-1.09215 -2.333668,-2.371411 0,-0.187915 0,-0.377435 0.03774,-0.526802 L 4.8407964,9.789199 A 2.4252158,2.4252158 0 0 1 0.772537,8.020076 2.4252158,2.4252158 0 0 1 4.8383872,6.250954 L 10.48384,2.9761092 A 2.8974102,2.8974102 0 0 1 10.40915,2.4091547 C 10.40915,1.0921502 11.5013,0 12.818304,0 c 1.317008,0 2.409159,1.0921502 2.409159,2.4091547 0,1.3170047 -1.092151,2.4091553 -2.409155,2.4091553 -0.640032,0 -1.204577,-0.263401 -1.656695,-0.677776 L 5.5161598,7.453925 c 0.036941,0.187914 0.074684,0.377434 0.074684,0.564545 0,0.187111 -0.037744,0.377434 -0.075486,0.562137 l 5.7217422,3.31339 c 0.417587,-0.377434 0.979724,-0.602289 1.582012,-0.602289 z"></path></svg> <span class="u-visually-hidden">Compartilhar</span></button>
+ <div aria-hidden="true" data-content="" class="c-modal-drop__content c-modal-drop__content--no-padding">
+ <div class="c-modal-drop__controls u-hidden-md">
+ <button data-close="" class="c-modal-drop__close"><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-tools-share--larger">
+ <ul class="c-tools-share__list" data-sharebar-utm-campaign-prefix="comp" data-sharebar-buttons="facebook whatsapp twitter messenger googlePlus linkedIn pinterest rss email" data-triggered-byclick=".c-modal-drop [data-trigger]" data-sharebar-url="https://www1.folha.uol.com.br/colunas/reinaldoazevedo/2018/12/torcam-para-que-bolsonaro-consiga-modernizar-guedes.shtml" data-sharebar-text="Torçam para que Bolsonaro consiga modernizar Guedes" data-sharebar-channel="colunistas-reinaldo-azevedo"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-headline__content">
+ <a href="https://www1.folha.uol.com.br/colunas/reinaldoazevedo/2018/12/torcam-para-que-bolsonaro-consiga-modernizar-guedes.shtml">
+ <h2 class="c-headline__title">
+ Torçam para que Bolsonaro consiga modernizar Guedes
+ </h2>
+ <p class="c-headline__standfirst">
+ Ou o presidente vira o conselheiro do ministro da Economia ou a nau afunda
+ </p><time class="c-headline__dateline" itemprop="datePublished" datetime="2018-12-21 02:00:00">21.dez.2018 às 2h00</time></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-fixed col-fixed--md-300">
+ <div class="c-advertising c-advertising--300x600">
+ <div id="banner-300x600-2-area" class="c-advertising__banner-area"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="block">
+ <div class="container">
+ <div class="c-advertising">
+ <div id="banner-970x250-area-2" class="c-advertising__banner-area"></div>
+ </div>
+ </div>
+ </div>
+ </main>
+ <footer id="rodape" class="l-footer u-no-print">
+ <div class="block">
+ <div class="container">
+ <div class="l-footer__head">
+ <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 190 20" version="1.1" class="logo-folha logo-small" aria-hidden="true">
+ <g>
+ <g transform="translate(183.000000, 0.000000)">
+ <polygon class="brand-stars-red" points="4.26167491 3.62184038 4.98484067 5.86503408 3.07913972 4.47605581 1.17343877 5.86503408 1.90570095 3.62184038 0 2.24236717 2.35638744 2.24236717 3.07913972 1.77635684e-15 3.8114019 2.24236717 6.16778933 2.24236717"></polygon>
+ <polygon class="brand-stars-blue" points="4.26167491 10.2195905 4.98484067 12.4627842 3.07913972 11.0738059 1.17343877 12.4627842 1.90570095 10.2195905 -7.10542736e-15 8.84011725 2.35638744 8.84011725 3.07913972 6.59775008 3.8114019 8.84011725 6.16778933 8.84011725"></polygon>
+ <polygon class="brand-stars-dark" points="4.26167491 17.4558325 4.98484067 19.6990262 3.07913972 18.3100479 1.17343877 19.6990262 1.90570095 17.4558325 0 16.0763593 2.35638744 16.0763593 3.07913972 13.8339921 3.8114019 16.0763593 6.16778933 16.0763593"></polygon>
+ </g>
+ <g>
+ <path d="M102.802445,0 C104.083325,0 105.221884,0.0949034745 106.336724,0.332162161 L106.336724,5.36204631 L105.411644,5.36204631 L104.510285,1.6608108 C103.869845,1.49472972 103.490325,1.44727799 102.802445,1.44727799 C101.236926,1.44727799 100.359286,2.30140926 100.359286,3.44025095 C100.359286,7.47364862 107.143204,7.09403472 107.143204,13.0966795 C107.143204,16.4183011 104.723764,19.1942277 100.904846,19.1942277 C99.2681663,19.1942277 97.9635668,18.9806949 96.9673271,18.6248069 L96.9673271,13.5711969 L97.9635668,13.5711969 L98.7700465,17.1775289 C99.5765262,17.6283204 100.501606,17.7469497 101.450406,17.7469497 C102.897325,17.7469497 103.869845,16.7030115 103.869845,15.4929922 C103.869845,11.1037065 96.8961672,11.0562548 96.9436071,5.50440152 C96.9436071,2.15905405 99.4342063,0 102.802445,0 L102.802445,0 Z M0.023719992,1.16256756 L0.023719992,0.284710424 L11.1721162,0.284710424 L11.1721162,5.76538608 L10.2470365,5.76538608 L8.70523705,1.54218146 L5.64535809,1.54218146 L5.64535809,8.94465247 L8.04107727,8.94465247 L8.58663709,6.64324322 L9.51171678,6.64324322 L9.51171678,12.6696138 L8.58663709,12.6696138 L8.04107727,10.2021235 L5.64535809,10.2021235 L5.64535809,17.6520463 L7.85131734,18.055386 L7.85131734,18.9095173 L2.84217094e-14,18.9095173 L2.84217094e-14,18.055386 L1.7552794,17.6520463 L1.7552794,1.49472972 L0.023719992,1.16256756 Z M118.69484,11.2935135 L117.2242,11.2935135 L117.2242,17.6520463 L119.33528,18.055386 L119.33528,18.9095173 L111.602562,18.9095173 L111.602562,18.055386 L113.334122,17.6520463 L113.334122,1.49472972 L111.626282,1.16256756 L111.626282,0.284710424 L118.90832,0.284710424 C121.968199,0.284710424 124.031838,1.47100386 124.031838,5.81283781 C124.031838,9.13445942 122.347719,11.2935135 118.69484,11.2935135 L118.69484,11.2935135 Z M117.2242,10.0597683 L117.91208,10.0597683 C119.16924,10.0597683 119.904559,9.20563703 119.904559,5.76538608 C119.904559,2.34886099 119.38272,1.54218146 117.95952,1.54218146 L117.2242,1.54218146 L117.2242,10.0597683 Z M158.757906,10.6291891 C158.757906,4.60281851 161.414545,2.25395752 165.209744,2.25395752 C169.550503,2.25395752 171.376942,4.93498067 171.376942,10.7952702 C171.376942,16.7504633 168.696583,19.1942277 164.948824,19.1942277 C160.584346,19.1942277 158.757906,16.5132046 158.757906,10.6291891 L158.757906,10.6291891 Z M12.2157959,10.652915 C12.2157959,4.65027025 14.848715,2.30140926 18.6439137,2.30140926 C23.0083922,2.30140926 24.7636716,4.95870654 24.7636716,10.8189961 C24.7636716,16.7741891 22.1307525,19.1942277 18.3355538,19.1942277 C13.9947953,19.1942277 12.2157959,16.5369304 12.2157959,10.652915 L12.2157959,10.652915 Z M54.6271415,18.9095173 L50.4287029,18.9095173 L50.4287029,18.1740154 L51.6384225,17.8418532 L55.6233811,2.53866794 L57.6870204,2.53866794 L62.2886989,17.8418532 L63.5221385,18.1740154 L63.5221385,18.9095173 L57.1651806,18.9095173 L57.1651806,18.1740154 L58.6358201,17.8418532 L57.3549406,13.9270849 L53.8918217,13.9270849 L52.990462,17.8418532 L54.6271415,18.1740154 L54.6271415,18.9095173 Z M127.091717,18.9095173 L122.703518,18.9095173 L122.703518,18.1740154 L124.055558,17.8418532 L128.040517,2.53866794 L130.151596,2.53866794 L134.753274,17.8418532 L136.129034,18.1740154 L136.129034,18.9095173 L129.653476,18.9095173 L129.653476,18.1740154 L131.100396,17.8418532 L129.795796,13.9270849 L126.285237,13.9270849 L125.407597,17.8418532 L127.091717,18.1740154 L127.091717,18.9095173 Z M35.295348,18.9095173 L25.7599113,18.9095173 L25.7599113,18.1740154 L27.1831108,17.8418532 L27.1831108,3.60633203 L25.8310712,3.34534748 L25.8310712,2.58611968 L32.1168691,2.58611968 L32.1168691,3.34534748 L30.6462296,3.60633203 L30.6462296,17.7944015 L33.2079887,17.7944015 L34.5600283,13.9745366 L35.295348,13.9745366 L35.295348,18.9095173 Z M36.2678677,3.34534748 L36.2678677,2.58611968 L42.2453057,2.58611968 L42.2453057,3.34534748 L41.0593061,3.60633203 L41.0593061,10.2733011 L44.6647449,10.2733011 L44.6647449,3.60633203 L43.5499052,3.34534748 L43.5499052,2.58611968 L49.3850233,2.58611968 L49.3850233,3.34534748 L48.1515837,3.60633203 L48.1515837,17.8418532 L49.5036232,18.1740154 L49.5036232,18.9095173 L43.5499052,18.9095173 L43.5499052,18.1740154 L44.6647449,17.8418532 L44.6647449,11.3884169 L41.0593061,11.3884169 L41.0593061,17.8418532 L42.2453057,18.1740154 L42.2453057,18.9095173 L36.2678677,18.9095173 L36.2678677,18.1740154 L37.6199072,17.8418532 L37.6199072,3.65378377 L36.2678677,3.34534748 Z M80.1261328,11.008803 C80.1261328,16.7504633 77.4457737,18.9095173 74.1961348,18.9095173 L67.839177,18.9095173 L67.839177,18.1740154 L69.1200566,17.8418532 L69.1200566,3.60633203 L67.839177,3.34534748 L67.839177,2.58611968 L73.864055,2.58611968 C77.9201736,2.58611968 80.1261328,4.53164091 80.1261328,11.008803 L80.1261328,11.008803 Z M86.1272908,17.7944015 L89.2346097,17.7944015 L90.5392093,14.1643436 L91.369409,14.1643436 L91.369409,18.9095173 L81.1223725,18.9095173 L81.1223725,18.1740154 L82.640452,17.8418532 L82.640452,3.60633203 L81.1460925,3.34534748 L81.1460925,2.58611968 L90.8475692,2.58611968 L90.8475692,7.30756754 L90.0410895,7.30756754 L88.7127699,3.65378377 L86.1272908,3.65378377 L86.1272908,10.1783976 L88.1672101,10.1783976 L88.7127699,8.16169881 L89.4480897,8.16169881 L89.4480897,13.4762934 L88.7127699,13.4762934 L88.1672101,11.2935135 L86.1272908,11.2935135 L86.1272908,17.7944015 Z M135.464874,3.34534748 L135.464874,2.58611968 L141.726952,2.58611968 L141.726952,3.34534748 L140.280032,3.60633203 L140.280032,15.1371042 C140.280032,17.2724324 140.801872,18.2689188 142.343672,18.2689188 C144.454751,18.2689188 145.118911,17.0114478 145.118911,14.6625868 L145.118911,3.60633203 L143.719431,3.34534748 L143.719431,2.58611968 L147.49091,2.58611968 L147.49091,3.34534748 L146.21003,3.60633203 L146.21003,14.8998455 C146.21003,18.0791119 144.644511,19.4314864 141.442312,19.4077605 C137.765713,19.3840347 136.793194,17.9604826 136.793194,14.1643436 L136.793194,3.60633203 L135.464874,3.34534748 Z M157.880266,18.9095173 L148.48715,18.9095173 L148.48715,18.1740154 L149.910349,17.8418532 L149.910349,3.60633203 L148.58203,3.34534748 L148.58203,2.58611968 L154.844108,2.58611968 L154.844108,3.34534748 L153.397188,3.60633203 L153.397188,17.7944015 L155.745467,17.7944015 L157.097507,13.9745366 L157.880266,13.9745366 L157.880266,18.9095173 Z M167.652903,10.842722 C167.652903,4.22320462 166.514344,3.20299226 165.186024,3.20299226 C163.857704,3.20299226 162.505665,4.0808494 162.505665,10.6054633 C162.505665,17.2012548 163.644225,18.2689188 164.996264,18.2689188 C166.324584,18.2689188 167.652903,17.3198841 167.652903,10.842722 L167.652903,10.842722 Z M21.0870729,10.8664478 C21.0870729,4.24693048 19.9247932,3.250444 18.5727537,3.250444 C17.1969942,3.250444 15.8686746,4.10457527 15.8686746,10.6291891 C15.8686746,17.2249806 17.0546742,18.2689188 18.4067138,18.2689188 C19.7350333,18.2689188 21.0870729,17.3673358 21.0870729,10.8664478 L21.0870729,10.8664478 Z M72.7729353,17.7944015 L73.792895,17.7944015 C75.7142143,17.7944015 76.615574,16.7504633 76.615574,10.7952702 C76.615574,4.72144786 75.5718944,3.65378377 73.721735,3.65378377 L72.7729353,3.65378377 L72.7729353,17.7944015 Z M55.4573412,7.59227796 L54.1527416,12.8119691 L57.0465807,12.8119691 L55.4573412,7.59227796 Z M127.898197,7.59227796 L126.617317,12.8119691 L129.463716,12.8119691 L127.898197,7.59227796 Z M108.874763,15.6590733 C109.752403,15.6590733 110.487723,16.442027 110.487723,17.4147876 C110.487723,18.4112741 109.704963,19.1942277 108.827323,19.1942277 C107.997123,19.1942277 107.214364,18.4112741 107.214364,17.4147876 C107.214364,16.442027 108.044563,15.6590733 108.874763,15.6590733 L108.874763,15.6590733 Z"></path>
+ </g>
+ </g></svg> <span class="u-sr-only">Folha de S.Paulo</span> <a href="//secure.folha.com.br/folha?gid=FOL" class="l-footer__link l-footer__link--attention" title="Assine a Folha" rel="external">Assine</a> <a href="#top" class="l-footer__link l-footer__link--back-to-top"><span>Topo</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 24 24" width="24" height="24" class="icon icon--chevron-up" aria-hidden="true">
+ <path d="M 17.75,14.199375 16.39875,15.550625 12,11.161458 7.60125,15.550625 6.25,14.199375 l 5.75,-5.75 5.75,5.75 z"></path></svg></a>
+ </div>
+ <div class="l-footer__content">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 u-visible-md col--md-3-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ folha de s.paulo
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="http://www1.folha.uol.com.br/institucional/">Sobre a Folha</a>
+ </li>
+ <li>
+ <a href="http://acervo.folha.uol.com.br/">Acervo Folha</a>
+ </li>
+ <li>
+ <a href="http://atendimento.folha.com.br/clubefolha/Inicio.do">ClubeFolha</a>
+ </li>
+ <li>
+ <a href="http://www1.folha.uol.com.br/institucional/pages/expediente.shtml">Expediente</a>
+ </li>
+ <li>
+ <a href="http://www1.folha.uol.com.br/paineldoleitor/politicadeprivacidade/">Política de Privacidade</a>
+ </li>
+ <li>
+ <a href="http://www1.folha.uol.com.br/especial/2013/premiofolha/">Prêmio Folha</a>
+ </li>
+ <li>
+ <a href="https://temas.folha.uol.com.br/projeto-editorial-da-folha/projeto-editorial-2017/">Projeto Editorial</a>
+ </li>
+ <li>
+ <a href="http://seminariosfolha.folha.com.br/">Seminários Folha</a>
+ </li>
+ <li>
+ <a href="http://www1.folha.uol.com.br/folha/trabalhe/vagas.html">Trabalhe na Folha</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/treinamento/">Treinamento</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ Fale com a Folha
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="http://www.publicidade.folha.com.br/">Anuncie (Publicidade Folha)</a>
+ </li>
+ <li>
+ <a href="https://atendimento.folha.com.br/">Atendimento ao Assinante</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/erramos/">Erramos</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/falecomafolha/">Fale com a Folha</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/ombudsman/">Ombudsman</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/paineldoleitor/">Painel do Leitor</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ editorias
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="https://www1.folha.uol.com.br/poder">Poder</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/mercado">Mercado</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/cotidiano">Cotidiano</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/mundo">Mundo</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/esporte">Esporte</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/ilustrada/">Ilustrada</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/ilustrissima/">Ilustríssima</a>
+ </li>
+ <li>
+ <a href="https://f5.folha.uol.com.br">F5</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/ciencia/">Ciência</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/equilibrioesaude/">Equilíbrio e Saúde</a>
+ </li>
+ <li>
+ <a href="https://fotografia.folha.uol.com.br/galerias/">Fotografia</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/tv/">TV Folha</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/educacao/">Educação</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/banco-de-dados/">Banco de Dados</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/turismo/">Turismo</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/sobretudo">Sobre Tudo</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/saopaulo/">Revista sãopaulo</a>
+ </li>
+ <li>
+ <a href="https://guia.folha.uol.com.br/">Guia Folha</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/serafina">Serafina</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1"></div>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ opinião
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="https://www1.folha.uol.com.br/opiniao">Opinião</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/colunaseblogs/">Colunas e Blogs</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ mais seções
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="https://www1.folha.uol.com.br/dias-melhores/">Dias Melhores</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/empreendedorsocial/">Empreendedor Social</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/especial/2018/">Especiais</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/internacional/es/">Folha en Español</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/internacional/en/">Folha In English</a>
+ </li>
+ <li>
+ <a href="http://www1.folha.uol.com.br/mercado/folhainvest/">Folhainvest</a>
+ </li>
+ <li>
+ <a href="https://folhaleaks.folha.com.br/">Folhaleaks</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/mapas/">Folha Mapas</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/folha-topicos/">Folha Tópicos</a>
+ </li>
+ <li>
+ <a href="https://transparencia.folha.uol.com.br/">Folha Transparência</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/o-melhor-de-sao-paulo/2017/restaurantes-bares-e-cozinha/">O Melhor de sãopaulo</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/ultimas-noticias/">Últimas</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/fsp/">Versão Impressa</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/mapa-do-site/">Mapa do site</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ serviços
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="https://www1.folha.uol.com.br/cotidiano/aeroportos/">Aeroportos</a>
+ </li>
+ <li>
+ <a href="https://classificados1.folha.uol.com.br/">Classificados</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/especial/2018/folha-informacoes/">Folha Informações</a>
+ </li>
+ <li>
+ <a href="https://f5.folha.uol.com.br/horoscopo/">Horóscopo</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/loterias/">Loterias</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/cotidiano/mortes/">Mortes</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/cotidiano/praias/sp/">Praias</a>
+ </li>
+ <li>
+ <a href="https://tempo.folha.uol.com.br/">Tempo</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <nav class="l-footer__section">
+ <h4 class="c-heading c-heading--tiny">
+ outros canais
+ </h4>
+ <ul class="l-footer__nav">
+ <li>
+ <a href="https://email.folha.uol.com.br/">e-mailFOLHA</a>
+ </li>
+ <li>
+ <a href="https://datafolha.folha.uol.com.br/">Datafolha</a>
+ </li>
+ <li>
+ <a href="https://folhapress.folha.com.br/">Folhapress</a>
+ </li>
+ <li>
+ <a href="https://eventos.folha.uol.com.br/">Folha Eventos</a>
+ </li>
+ <li>
+ <a href="https://publifolha.folha.uol.com.br/">Publifolha</a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/especial/2018/top-of-mind/">Top of Mind</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-4">
+ <div class="row">
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <div class="c-audience">
+ <h4 class="c-heading c-heading--tiny">
+ Audiência da Folha
+ </h4>
+ <table class="c-audience__table">
+ <tbody>
+ <tr>
+ <th class="c-audience__cell">
+ Páginas vistas
+ </th>
+ <td class="c-audience__cell">
+ 231.506.740 <span id="tooltip-pagesviews" class="u-visually-hidden" role="tooltip" aria-hidden="true"><span class="c-tooltip__content">Total de páginas visualizadas no site da Folha em novembro de 2018, segundo o Google Analytics</span></span> <a aria-describedby="tooltip-pagesviews" data-tooltip="" data-direction="bottom" data-target="#tooltip-pagesviews" class="c-audience__cell--anchor"><svg xmlns="//www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" version="1.1" class="icon icon--information" aria-hidden="true">
+ <path d="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"></path></svg><span class="u-visually-hidden">Informação</span></a> <span class="c-audience__date">nov.2018</span>
+ </td>
+ </tr>
+ <tr>
+ <th class="c-audience__cell">
+ Visitantes únicos
+ </th>
+ <td class="c-audience__cell">
+ 35.681.468 <span id="tooltip-unique_visitors" class="u-visually-hidden" role="tooltip" aria-hidden="true"><span class="c-tooltip__content">Total de visitantes diferentes do site da Folha em novembro de 2018, segundo o Google Analytics</span></span> <a aria-describedby="tooltip-unique_visitors" data-tooltip="" data-direction="bottom" data-target="#tooltip-unique_visitors" class="c-audience__cell--anchor"><svg xmlns="//www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" version="1.1" class="icon icon--information" aria-hidden="true">
+ <path d="M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z"></path></svg><span class="u-visually-hidden">Informação</span></a> <span class="c-audience__date">nov.2018</span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <div data-newsletter="" class="c-newsletter">
+ <h4 class="c-heading c-heading--tiny">
+ Escolha suas newsletters
+ </h4>
+ <form class="c-form__default">
+ <div class="c-newsletter__wrapper">
+ <input type="email" class="c-newsletter__text js-validator" name="email" placeholder="Digite seu e-mail" /> <button class="c-newsletter__button js-button"><svg xmlns="http://www.w3.org/2000/svg" width="21" height="18" viewbox="0 0 21 18" class="icon icon--arrow-rigth">
+ <path fill="#333" fill-rule="evenodd" d="M21 9L.01 0 0 7l15 2-15 2 .01 7z"></path></svg></button>
+ </div><span class="c-form__error-message c-newsletter__error-message" id="validation-error"></span>
+ </form>
+ </div>
+ </div>
+ <div class="col col--xs-1-1 col--sm-1-1 col--md-1-1">
+ <ul class="c-follow-social-media">
+ <li>
+ <a href="https://twitter.com/folha" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Twitter</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--twitter" aria-hidden="true">
+ <path d="m 15.999997,3.2018549 c 0,-0.1451388 -0.119467,-0.2732046 -0.273067,-0.2732046 -0.08533,0 -0.674133,0.247589 -0.827733,0.2902776 0.2048,-0.2390525 0.674133,-0.9647527 0.674133,-1.2721095 0,-0.1451387 -0.119466,-0.2732046 -0.273067,-0.2732046 -0.04266,0 -0.09387,0.01711 -0.136533,0.042714 -0.580266,0.3158928 -1.134933,0.5634818 -1.783466,0.7000904 -0.64,-0.6147385 -1.5104,-0.9733204 -2.406399,-0.9733204 -1.8943999,0 -3.4474671,1.5453141 -3.4474671,3.4492104 0,0.136602 0.00853,0.281747 0.034133,0.418349 C 5.6831985,5.1484392 3.8997324,4.3629782 2.5002659,3.1079412 2.1589325,2.8005845 1.8687992,2.4676183 1.5615991,2.1261094 1.4933329,2.0492686 1.4335995,2.0236592 1.3311993,2.0236592 c -0.093866,0 -0.1706664,0.068298 -0.2133332,0.1366023 -0.30720005,0.4524956 -0.46933275,1.1867322 -0.46933275,1.7331415 0,0.7940042 0.2730663,1.5709292 0.78506615,2.1856432 -0.1621331,-0.05121 -0.4096003,-0.213443 -0.55466665,-0.213443 -0.1791994,0 -0.3327998,0.128066 -0.3327998,0.307357 0,1.195268 0.65706655,2.305169 1.66399955,2.928419 -0.0768,-0.0086 -0.1450664,-0.03416 -0.2218665,-0.03416 -0.145067,0 -0.2645333,0.128066 -0.2645333,0.264668 0,0.03416 0.00853,0.05976 0.017067,0.09391 0.3754662,1.1525798 1.314133,2.0234248 2.4917329,2.2966298 -0.9642667,0.597634 -2.0735999,0.904991 -3.1999998,0.904991 -0.25599995,0 -0.51199955,-0.04271 -0.75946615,-0.04271 -0.1535997,0 -0.2730666,0.128066 -0.2730666,0.273205 0,0.09391 0.0512,0.170754 0.1280003,0.230516 0.2218665,0.162218 0.4949331,0.29882 0.7423993,0.42688 1.31413295,0.683017 2.78186635,1.041593 4.26666575,1.041593 3.7205324,0 6.9034655,-1.99781 8.4394655,-5.3957938 0.554666,-1.220886 0.878933,-2.5613 0.853333,-3.901713 l 0,-0.281741 C 15.010131,4.5422372 15.57333,3.978749 15.95733,3.355499 15.98293,3.312785 16,3.261585 16,3.2018237 l 0,0 z"></path></svg></a>
+ </li>
+ <li>
+ <a href="https://www.linkedin.com/company/folha-de-s-paulo" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Linkedin</span> <svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--linkedin" aria-hidden="true">
+ <path d="M 0.5217573,3.4217496 C 0.8574099,3.7574022 1.3243328,3.925225 1.883477,3.925225 l 0.019112,0 c 0.5965319,0 1.062624,-0.1678228 1.416555,-0.5034754 C 3.6739051,3.0669849 3.8417314,2.656557 3.8417314,2.1348025 3.8417314,1.6313201 3.6547964,1.2026132 3.319144,0.86696056 2.9834872,0.531308 2.517395,0.3634851 1.9391422,0.3634851 1.3608886,0.3634851 0.8947967,0.531308 0.5408658,0.86696056 0.1861045,1.2026132 -1e-7,1.6313201 -1e-7,2.1348025 c 0,0.5217545 0.1678263,0.9321824 0.5217572,1.2869471 l 0,0 z m -0.3165439,12.2147654 3.4313014,0 0,-10.2939042 -3.4313014,0 0,10.2939042 z m 8.7460799,0 0,-5.7443117 c 0,-0.3539317 0.037384,-0.633921 0.1121617,-0.839135 C 9.2121719,8.6991367 9.4364945,8.4008753 9.7347601,8.1582701 10.013917,7.9156719 10.386957,7.8035124 10.834771,7.8035124 c 0.596531,0 1.025236,0.2052139 1.305224,0.6156349 0.279987,0.410428 0.428705,0.9886857 0.428705,1.7156547 l 0,5.501713 3.4313,0 0,-5.8930294 C 16,8.2139334 15.64607,7.0582579 14.919099,6.2747932 14.191298,5.4913284 13.240005,5.1000126 12.046942,5.1000126 c -0.428705,0 -0.839131,0.055677 -1.193893,0.1678228 -0.353931,0.093054 -0.652197,0.2425982 -0.9130756,0.446986 C 9.6973732,5.9017564 9.5104375,6.0878582 9.3617206,6.2565141 9.2121719,6.4235108 9.063455,6.6104458 8.9321847,6.8339388 l 0.019112,0 0,-1.491328 -3.4313016,0 0.018279,0.5034754 0,3.0765435 c 0,1.7156473 0,3.9538893 -0.018279,6.7138853 l 3.4313016,0 0,0 z"></path></svg></a>
+ </li>
+ <li>
+ <a href="https://www.instagram.com/folhadespaulo/" target="_blank"><span class="u-visually-hidden">Link externo, abre página da Folha de S.Paulo no Instagram</span> <svg xmlns="https://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="icon icon--instagram" aria-hidden="true">
+ <path d="M7.8,2H16.2C19.4,2 22,4.6 22,7.8V16.2A5.8,5.8 0 0,1 16.2,22H7.8C4.6,22 2,19.4 2,16.2V7.8A5.8,5.8 0 0,1 7.8,2M7.6,4A3.6,3.6 0 0,0 4,7.6V16.4C4,18.39 5.61,20 7.6,20H16.4A3.6,3.6 0 0,0 20,16.4V7.6C20,5.61 18.39,4 16.4,4H7.6M17.25,5.5A1.25,1.25 0 0,1 18.5,6.75A1.25,1.25 0 0,1 17.25,8A1.25,1.25 0 0,1 16,6.75A1.25,1.25 0 0,1 17.25,5.5M12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9Z"></path></svg></a>
+ </li>
+ <li>
+ <a href="https://www1.folha.uol.com.br/feed/" target="_blank"><span class="u-visually-hidden">Link externo, abre página RSS da Folha de S.Paulo</span> <svg xmlns="https://www.w3.org/2000/svg" height="24" viewbox="0 0 16 16" width="24" class="icon icon--rss" aria-hidden="true">
+ <g transform="translate(-4, -4)">
+ <circle cx="6.18" cy="17.82" r="2.18"></circle>
+ <path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"></path>
+ </g></svg></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div><!--!-->
+ </div>
+ <p class="l-footer__copyright">
+ <small>Copyright Folha de S.Paulo. Todos os direitos reservados. É proibida a reprodução do conteúdo desta página em qualquer meio de comunicação, eletrônico ou impresso, sem autorização escrita da <a href="mailto:[email protected]">Folhapress</a>.</small>
+ </p>
+ </div>
+ </div>
+ </footer>
+ <div class="c-modal" data-modal-newsletter="">
+ <div class="c-modal__content" data-content="">
+ <div class="c-modal__head">
+ NEWSLETTER <button class="c-modal__close" data-close=""><svg xmlns="https://www.w3.org/2000/svg" viewbox="0 0 16 16" width="24" height="24" class="icon icon--close icon--tiny" aria-hidden="true">
+ <path d="M16 1.61L14.39 0 8 6.39 1.61 0 0 1.61 6.39 8 0 14.39 1.61 16 8 9.61 14.39 16 16 14.39 9.61 8z"></path></svg></button>
+ </div>
+ <div class="c-modal__body c-newsletter__modal">
+ <span class="c-form__error-message c-newsletter__error-message c-newsletter__error-no-selected is-hidden" data-newsletter-none-selected="" id="validation-error"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" width="16" height="16" class="icon icon--alert">
+ <title>
+ Ícone alerta
+ </title>
+ <path d="M8 0C3.584 0 0 3.584 0 8s3.584 8 8 8 8-3.584 8-8-3.584-8-8-8zm.8 12H7.2v-1.6h1.6zm0-3.2H7.2V4h1.6z"></path></svg> Por favor, selecione uma das opções abaixo.</span>
+ <form id="form_newsletter" role="form" class="c-form js-newsletter-form" action="#" method="post" data-newsletter-form="" name="form_newsletter">
+ <fieldset>
+ <legend>Quais newsletter você gostaria de assinar?</legend>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="portugues" value="portugues" name="check-box" /> <label class="c-newsletter__label" for="portugues">Notícias do dia (português)</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="revista-colunas" value="colunas_blogs" name="check-box" /> <label class="c-newsletter__label" for="revista-colunas">Colunas e Blogs</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="dicas_editor" value="dicas_editor" name="check-box" /> <label class="c-newsletter__label" for="dicas_editor">Dicas do Editor (somente para assinantes)</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="ingles" value="ingles" name="check-box" /> <label class="c-newsletter__label" for="ingles">News in English</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="espanhol" value="espanhol" name="check-box" /> <label class="c-newsletter__label" for="espanhol">Noticias en español</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="id_f5" value="f5" name="check-box" /> <label class="c-newsletter__label" for="id_f5">F5</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="editoria_tv_folha" value="tv_folha" name="check-box" /> <label class="c-newsletter__label" for="editoria_tv_folha">TV Folha</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="para_curtir_sao_paulo" value="para_curtir_sp" name="check-box" /> <label class="c-newsletter__label" for="para_curtir_sao_paulo">Para curtir SP</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="id_eleicoes_2018" value="eleicoes_2018" name="check-box" /> <label class="c-newsletter__label" for="id_eleicoes_2018">Eleições 2018</label>
+ </div>
+ </fieldset>
+ <fieldset class="c-newsletter__fieldset">
+ <legend>Você também gostaria de:</legend>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="news_informacoes" value="news_informacoes" name="check-box" checked="checked" /> <label class="c-newsletter__label" for="news_informacoes">Receber informações sobre produtos e serviços da Folha de S. Paulo</label>
+ </div>
+ <div class="c-form__checkbox">
+ <input type="checkbox" id="news_ofertas" value="news_ofertas" name="check-box" checked="checked" /> <label class="c-newsletter__label" for="news_ofertas">Receber ofertas de parceiros da Folha de S. Paulo</label>
+ </div>
+ </fieldset>
+ <div class="c-newsletter__box-button">
+ <a data-close="" class="c-button">Cancelar</a> <button class="c-button c-button--primary" name="origin_id" data-send="">Confirmar</button>
+ </div>
+ </form>
+ <div class="c-newsletter__feedback is-hidden" data-newsletter-feedback="success">
+ <p>
+ Seu e-mail foi cadastrado com sucesso!
+ </p>
+ <div class="c-newsletter__box-button">
+ <a data-close="" class="c-button c-button--primary">Ok</a>
+ </div>
+ </div>
+ <div class="c-newsletter__feedback is-hidden" data-newsletter-feedback="error">
+ <p>
+ Por favor, tente mais tarde!
+ </p>
+ <div class="c-newsletter__box-button">
+ <a data-close="" class="c-button c-button--primary">Ok</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-modal__overlay" data-overlay=""></div>
+ </div>
+ <script src="https://static.folha.uol.com.br/storybook/js/portal-6cc7743041.js"></script> <!--!-->
+ <script data-paywall="" data-paywall-wall-register="no" data-paywall-wall-env="folha" data-paywall-product="portal">
+ <![CDATA[
+ !function(e){function __webpack_require__(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};return e[r].call(n.exports,n,n.exports,__webpack_require__),n.l=!0,n.exports}var t={};return __webpack_require__.m=e,__webpack_require__.c=t,__webpack_require__.i=function(e){return e},__webpack_require__.d=function(e,t,r){Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},__webpack_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};return __webpack_require__.d(t,"a",t),t},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=135)}([function(e,t){var r=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=r)},function(e,t){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t,r){var n=r(32)("wks"),o=r(22),a=r(1).Symbol,i="function"==typeof a;(e.exports=function(e){return n[e]||(n[e]=i&&a[e]||(i?a:o)("Symbol."+e))}).store=n},function(e,t,r){var n=r(1),o=r(0),a=r(13),i=r(9),c=r(8),s="prototype",u=function(e,t,r){var l,f,p,h=e&u.F,d=e&u.G,y=e&u.S,_=e&u.P,v=e&u.B,m=e&u.W,g=d?o:o[t]||(o[t]={}),b=g[s],w=d?n:y?n[t]:(n[t]||{})[s];d&&(r=t);for(l in r)f=!h&&w&&void 0!==w[l],f&&c(g,l)||(p=f?w[l]:r[l],g[l]=d&&"function"!=typeof w[l]?r[l]:v&&f?a(p,n):m&&w[l]==p?function(e){var t=function(t,r,n){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,n)}return e.apply(this,arguments)};return t[s]=e[s],t}(p):_&&"function"==typeof p?a(Function.call,p):p,_&&((g.virtual||(g.virtual={}))[l]=p,e&u.R&&b&&!b[l]&&i(b,l,p)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,r){var n=r(6);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},function(e,t,r){e.exports=!r(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){var n=r(4),o=r(44),a=r(34),i=Object.defineProperty;t.f=r(5)?Object.defineProperty:function defineProperty(e,t,r){if(n(e),t=a(t,!0),n(r),o)try{return i(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(7),o=r(19);e.exports=r(5)?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,r){var n=r(45),o=r(25);e.exports=function(e){return n(o(e))}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,r){var n=r(17);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports={}},function(e,t){e.exports=!0},function(e,t,r){var n=r(50),o=r(27);e.exports=Object.keys||function keys(e){return n(e,o)}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){var n=r(7).f,o=r(8),a=r(2)("toStringTag");e.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,a)&&n(e,a,{configurable:!0,value:t})}},function(e,t,r){var n=r(25);e.exports=function(e){return Object(n(e))}},function(e,t){var r=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},function(e,t){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(82),o=_interopRequireDefault(n),a=r(81),i=_interopRequireDefault(a),c="function"==typeof i.default&&"symbol"==typeof o.default?function(e){return typeof e}:function(e){return e&&"function"==typeof i.default&&e.constructor===i.default&&e!==i.default.prototype?"symbol":typeof e};t.default="function"==typeof i.default&&"symbol"===c(o.default)?function(e){return void 0===e?"undefined":c(e)}:function(e){return e&&"function"==typeof i.default&&e.constructor===i.default&&e!==i.default.prototype?"symbol":void 0===e?"undefined":c(e)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(6),o=r(1).document,a=n(o)&&n(o.createElement);e.exports=function(e){return a?o.createElement(e):{}}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){"use strict";function PromiseCapability(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n}),this.resolve=n(t),this.reject=n(r)}var n=r(17);e.exports.f=function(e){return new PromiseCapability(e)}},function(e,t,r){var n=r(4),o=r(111),a=r(27),i=r(31)("IE_PROTO"),c=function(){},s="prototype",u=function(){var e,t=r(26)("iframe"),n=a.length,o="<",i=">";for(t.style.display="none",r(43).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(o+"script"+i+"document.F=Object"+o+"/script"+i),e.close(),u=e.F;n--;)delete u[s][a[n]];return u()};e.exports=Object.create||function create(e,t){var r;return null!==e?(c[s]=n(e),r=new c,c[s]=null,r[i]=e):r=u(),void 0===t?r:o(r,t)}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,r){var n=r(32)("keys"),o=r(22);e.exports=function(e){return n[e]||(n[e]=o(e))}},function(e,t,r){var n=r(0),o=r(1),a="__core-js_shared__",i=o[a]||(o[a]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:r(15)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t,r){var n=r(6);e.exports=function(e,t){if(!n(e))return e;var r,o;if(t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;if("function"==typeof(r=e.valueOf)&&!n(o=r.call(e)))return o;if(!t&&"function"==typeof(r=e.toString)&&!n(o=r.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){var n=r(1),o=r(0),a=r(15),i=r(36),c=r(7).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=a?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||c(t,e,{value:i.f(e)})}},function(e,t,r){t.f=r(2)},function(e,t,r){(function(t){function getValue(e,t){return null==e?void 0:e[t]}function isHostObject(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}function Hash(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function hashClear(){this.__data__=L?L(null):{}}function hashDelete(e){return this.has(e)&&delete this.__data__[e]}function hashGet(e){var t=this.__data__;if(L){var r=t[e];return r===n?void 0:r}return k.call(t,e)?t[e]:void 0}function hashHas(e){var t=this.__data__;return L?void 0!==t[e]:k.call(t,e)}function hashSet(e,t){return this.__data__[e]=L&&void 0===t?n:t,this}function ListCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function listCacheClear(){this.__data__=[]}function listCacheDelete(e){var t=this.__data__,r=assocIndexOf(t,e);return!(r<0)&&(r==t.length-1?t.pop():E.call(t,r,1),!0)}function listCacheGet(e){var t=this.__data__,r=assocIndexOf(t,e);return r<0?void 0:t[r][1]}function listCacheHas(e){return assocIndexOf(this.__data__,e)>-1}function listCacheSet(e,t){var r=this.__data__,n=assocIndexOf(r,e);return n<0?r.push([e,t]):r[n][1]=t,this}function MapCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function mapCacheClear(){this.__data__={hash:new Hash,map:new(A||ListCache),string:new Hash}}function mapCacheDelete(e){return getMapData(this,e).delete(e)}function mapCacheGet(e){return getMapData(this,e).get(e)}function mapCacheHas(e){return getMapData(this,e).has(e)}function mapCacheSet(e,t){return getMapData(this,e).set(e,t),this}function assocIndexOf(e,t){for(var r=e.length;r--;)if(eq(e[r][0],t))return r;return-1}function baseHas(e,t){return null!=e&&k.call(e,t)}function baseIsNative(e){return!(!isObject(e)||isMasked(e))&&(isFunction(e)||isHostObject(e)?M:_).test(toSource(e))}function baseToString(e){if("string"==typeof e)return e;if(isSymbol(e))return T?T.call(e):"";var t=e+"";return"0"==t&&1/e==-o?"-0":t}function castPath(e){return F(e)?e:H(e)}function getMapData(e,t){var r=e.__data__;return isKeyable(t)?r["string"==typeof t?"string":"hash"]:r.map}function getNative(e,t){var r=getValue(e,t);return baseIsNative(r)?r:void 0}function hasPath(e,t,r){t=isKey(t,e)?[t]:castPath(t);for(var n,o=-1,a=t.length;++o<a;){var i=toKey(t[o]);if(!(n=null!=e&&r(e,i)))break;e=e[i]}if(n)return n;var a=e?e.length:0;return!!a&&isLength(a)&&isIndex(i,a)&&(F(e)||isArguments(e))}function isIndex(e,t){return t=null==t?a:t,!!t&&("number"==typeof e||v.test(e))&&e>-1&&e%1==0&&e<t}function isKey(e,t){if(F(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!isSymbol(e))||(f.test(e)||!l.test(e)||null!=t&&e in Object(t))}function isKeyable(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}function isMasked(e){return!!S&&S in e}function toKey(e){if("string"==typeof e||isSymbol(e))return e;var t=e+"";return"0"==t&&1/e==-o?"-0":t}function toSource(e){if(null!=e){try{return j.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function memoize(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError(r);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i),i};return n.cache=new(memoize.Cache||MapCache),n}function eq(e,t){return e===t||e!==e&&t!==t}function isArguments(e){return isArrayLikeObject(e)&&k.call(e,"callee")&&(!D.call(e,"callee")||P.call(e)==i)}function isArrayLike(e){return null!=e&&isLength(e.length)&&!isFunction(e)}function isArrayLikeObject(e){return isObjectLike(e)&&isArrayLike(e)}function isFunction(e){var t=isObject(e)?P.call(e):"";return t==c||t==s}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=a}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&P.call(e)==u}function toString(e){return null==e?"":baseToString(e)}function has(e,t){return null!=e&&hasPath(e,t,baseHas)}var r="Expected a function",n="__lodash_hash_undefined__",o=1/0,a=9007199254740991,i="[object Arguments]",c="[object Function]",s="[object GeneratorFunction]",u="[object Symbol]",l=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,f=/^\w*$/,p=/^\./,h=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,d=/[\\^$.*+?()[\]{}|]/g,y=/\\(\\)?/g,_=/^\[object .+?Constructor\]$/,v=/^(?:0|[1-9]\d*)$/,m="object"==typeof t&&t&&t.Object===Object&&t,g="object"==typeof self&&self&&self.Object===Object&&self,b=m||g||Function("return this")(),w=Array.prototype,x=Function.prototype,C=Object.prototype,O=b["__core-js_shared__"],S=function(){var e=/[^.]+$/.exec(O&&O.keys&&O.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),j=x.toString,k=C.hasOwnProperty,P=C.toString,M=RegExp("^"+j.call(k).replace(d,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),R=b.Symbol,D=C.propertyIsEnumerable,E=w.splice,A=getNative(b,"Map"),L=getNative(Object,"create"),q=R?R.prototype:void 0,T=q?q.toString:void 0;Hash.prototype.clear=hashClear,Hash.prototype.delete=hashDelete,Hash.prototype.get=hashGet,Hash.prototype.has=hashHas,Hash.prototype.set=hashSet,ListCache.prototype.clear=listCacheClear,ListCache.prototype.delete=listCacheDelete,ListCache.prototype.get=listCacheGet,ListCache.prototype.has=listCacheHas,ListCache.prototype.set=listCacheSet,MapCache.prototype.clear=mapCacheClear,MapCache.prototype.delete=mapCacheDelete,MapCache.prototype.get=mapCacheGet,MapCache.prototype.has=mapCacheHas,MapCache.prototype.set=mapCacheSet;var H=memoize(function(e){e=toString(e);var t=[];return p.test(e)&&t.push(""),e.replace(h,function(e,r,n,o){t.push(n?o.replace(y,"$1"):r||e)}),t});memoize.Cache=MapCache;var F=Array.isArray;e.exports=has}).call(t,r(23))},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=r(79),o=_interopRequireDefault(n),a=r(83),i=_interopRequireDefault(a),c=r(86),s=_interopRequireDefault(c),u=r(85),l=_interopRequireDefault(u),f=function(e){function AdBlockError(){return(0,i.default)(this,AdBlockError),(0,s.default)(this,(AdBlockError.__proto__||(0,o.default)(AdBlockError)).apply(this,arguments))}return(0,l.default)(AdBlockError,e),AdBlockError}(Error);t.default=f,e.exports=t.default},function(e,t,r){e.exports={default:r(91),__esModule:!0}},function(e,t,r){e.exports={default:r(93),__esModule:!0}},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(76),o=_interopRequireDefault(n);t.default=o.default||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}},function(e,t,r){var n=r(12),o=r(2)("toStringTag"),a="Arguments"==n(function(){return arguments}()),i=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,r,c;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=i(t=Object(e),o))?r:a?n(t):"Object"==(c=n(t))&&"function"==typeof t.callee?"Arguments":c}},function(e,t,r){var n=r(1).document;e.exports=n&&n.documentElement},function(e,t,r){e.exports=!r(5)&&!r(10)(function(){return 7!=Object.defineProperty(r(26)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(12);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t,r){"use strict";var n=r(15),o=r(3),a=r(54),i=r(9),c=r(14),s=r(105),u=r(20),l=r(49),f=r(2)("iterator"),p=!([].keys&&"next"in[].keys()),h="keys",d="values",y=function(){return this};e.exports=function(e,t,r,_,v,m,g){s(r,t,_);var b,w,x,C=function(e){if(!p&&e in k)return k[e];switch(e){case h:return function keys(){return new r(this,e)};case d:return function values(){return new r(this,e)}}return function entries(){return new r(this,e)}},O=t+" Iterator",S=v==d,j=!1,k=e.prototype,P=k[f]||k["@iterator"]||v&&k[v],M=P||C(v),R=v?S?C("entries"):M:void 0,D="Array"==t?k.entries||P:P;if(D&&(x=l(D.call(new e)),x!==Object.prototype&&x.next&&(u(x,O,!0),n||"function"==typeof x[f]||i(x,f,y))),S&&P&&P.name!==d&&(j=!0,M=function values(){return P.call(this)}),n&&!g||!p&&!j&&k[f]||i(k,f,M),c[t]=M,c[O]=y,v)if(b={values:S?M:C(d),keys:m?M:C(h),entries:R},g)for(w in b)w in k||a(k,w,b[w]);else o(o.P+o.F*(p||j),t,b);return b}},function(e,t,r){var n=r(18),o=r(19),a=r(11),i=r(34),c=r(8),s=r(44),u=Object.getOwnPropertyDescriptor;t.f=r(5)?u:function getOwnPropertyDescriptor(e,t){if(e=a(e),t=i(t,!0),s)try{return u(e,t)}catch(e){}if(c(e,t))return o(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(50),o=r(27).concat("length","prototype");t.f=Object.getOwnPropertyNames||function getOwnPropertyNames(e){return n(e,o)}},function(e,t,r){var n=r(8),o=r(21),a=r(31)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,a)?e[a]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?i:null}},function(e,t,r){var n=r(8),o=r(11),a=r(98)(!1),i=r(31)("IE_PROTO");e.exports=function(e,t){var r,c=o(e),s=0,u=[];for(r in c)r!=i&&n(c,r)&&u.push(r);for(;t.length>s;)n(c,r=t[s++])&&(~a(u,r)||u.push(r));return u}},function(e,t,r){var n=r(3),o=r(0),a=r(10);e.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],i={};i[e]=t(r),n(n.S+n.F*a(function(){r(1)}),"Object",i)}},function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,r){var n=r(4),o=r(6),a=r(28);e.exports=function(e,t){if(n(e),o(t)&&t.constructor===e)return t;var r=a.f(e);return(0,r.resolve)(t),r.promise}},function(e,t,r){e.exports=r(9)},function(e,t,r){var n=r(4),o=r(17),a=r(2)("species");e.exports=function(e,t){var r,i=n(e).constructor;return void 0===i||void 0==(r=n(i)[a])?t:o(r)}},function(e,t,r){var n,o,a,i=r(13),c=r(101),s=r(43),u=r(26),l=r(1),f=l.process,p=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,y=l.Dispatch,_=0,v={},m="onreadystatechange",g=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},b=function(e){g.call(e.data)};p&&h||(p=function setImmediate(e){for(var t=[],r=1;arguments.length>r;)t.push(arguments[r++]);return v[++_]=function(){c("function"==typeof e?e:Function(e),t)},n(_),_},h=function clearImmediate(e){delete v[e]},"process"==r(12)(f)?n=function(e){f.nextTick(i(g,e,1))}:y&&y.now?n=function(e){y.now(i(g,e,1))}:d?(o=new d,a=o.port2,o.port1.onmessage=b,n=i(a.postMessage,a,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(n=function(e){l.postMessage(e+"","*")},l.addEventListener("message",b,!1)):n=m in u("script")?function(e){s.appendChild(u("script"))[m]=function(){s.removeChild(this),g.call(e)}}:function(e){setTimeout(i(g,e,1),0)}),e.exports={set:p,clear:h}},function(e,t,r){var n=r(33),o=Math.min;e.exports=function(e){return e>0?o(n(e),9007199254740991):0}},function(e,t){},function(e,t,r){"use strict";var n=r(116)(!0);r(46)(String,"String",function(e){this._t=e+"",this._i=0},function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})})},function(e,t,r){r(120);for(var n=r(1),o=r(9),a=r(14),i=r(2)("toStringTag"),c="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),s=0;s<c.length;s++){var u=c[s],l=n[u],f=l&&l.prototype;f&&!f[i]&&o(f,i,u),a[u]=a.Array}},function(e,t,r){(function(t){function getValue(e,t){return null==e?void 0:e[t]}function isHostObject(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}function Hash(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function hashClear(){this.__data__=R?R(null):{}}function hashDelete(e){return this.has(e)&&delete this.__data__[e]}function hashGet(e){var t=this.__data__;if(R){var r=t[e];return r===n?void 0:r}return O.call(t,e)?t[e]:void 0}function hashHas(e){var t=this.__data__;return R?void 0!==t[e]:O.call(t,e)}function hashSet(e,t){return this.__data__[e]=R&&void 0===t?n:t,this}function ListCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function listCacheClear(){this.__data__=[]}function listCacheDelete(e){var t=this.__data__,r=assocIndexOf(t,e);return!(r<0)&&(r==t.length-1?t.pop():P.call(t,r,1),!0)}function listCacheGet(e){var t=this.__data__,r=assocIndexOf(t,e);return r<0?void 0:t[r][1]}function listCacheHas(e){return assocIndexOf(this.__data__,e)>-1}function listCacheSet(e,t){var r=this.__data__,n=assocIndexOf(r,e);return n<0?r.push([e,t]):r[n][1]=t,this}function MapCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function mapCacheClear(){this.__data__={hash:new Hash,map:new(M||ListCache),string:new Hash}}function mapCacheDelete(e){return getMapData(this,e).delete(e)}function mapCacheGet(e){return getMapData(this,e).get(e)}function mapCacheHas(e){return getMapData(this,e).has(e)}function mapCacheSet(e,t){return getMapData(this,e).set(e,t),this}function assocIndexOf(e,t){for(var r=e.length;r--;)if(eq(e[r][0],t))return r;return-1}function baseGet(e,t){t=isKey(t,e)?[t]:castPath(t);for(var r=0,n=t.length;null!=e&&r<n;)e=e[toKey(t[r++])];return r&&r==n?e:void 0}function baseIsNative(e){return!(!isObject(e)||isMasked(e))&&(isFunction(e)||isHostObject(e)?j:d).test(toSource(e))}function baseToString(e){if("string"==typeof e)return e;if(isSymbol(e))return E?E.call(e):"";var t=e+"";return"0"==t&&1/e==-o?"-0":t}function castPath(e){return L(e)?e:A(e)}function getMapData(e,t){var r=e.__data__;return isKeyable(t)?r["string"==typeof t?"string":"hash"]:r.map}function getNative(e,t){var r=getValue(e,t);return baseIsNative(r)?r:void 0}function isKey(e,t){if(L(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!isSymbol(e))||(u.test(e)||!s.test(e)||null!=t&&e in Object(t))}function isKeyable(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}function isMasked(e){return!!x&&x in e}function toKey(e){if("string"==typeof e||isSymbol(e))return e;var t=e+"";return"0"==t&&1/e==-o?"-0":t}function toSource(e){if(null!=e){try{return C.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function memoize(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError(r);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i),i};return n.cache=new(memoize.Cache||MapCache),n}function eq(e,t){return e===t||e!==e&&t!==t}function isFunction(e){var t=isObject(e)?S.call(e):"";return t==a||t==i}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&S.call(e)==c}function toString(e){return null==e?"":baseToString(e)}function get(e,t,r){var n=null==e?void 0:baseGet(e,t);return void 0===n?r:n}var r="Expected a function",n="__lodash_hash_undefined__",o=1/0,a="[object Function]",i="[object GeneratorFunction]",c="[object Symbol]",s=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,u=/^\w*$/,l=/^\./,f=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,p=/[\\^$.*+?()[\]{}|]/g,h=/\\(\\)?/g,d=/^\[object .+?Constructor\]$/,y="object"==typeof t&&t&&t.Object===Object&&t,_="object"==typeof self&&self&&self.Object===Object&&self,v=y||_||Function("return this")(),m=Array.prototype,g=Function.prototype,b=Object.prototype,w=v["__core-js_shared__"],x=function(){var e=/[^.]+$/.exec(w&&w.keys&&w.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),C=g.toString,O=b.hasOwnProperty,S=b.toString,j=RegExp("^"+C.call(O).replace(p,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),k=v.Symbol,P=m.splice,M=getNative(v,"Map"),R=getNative(Object,"create"),D=k?k.prototype:void 0,E=D?D.toString:void 0;Hash.prototype.clear=hashClear,Hash.prototype.delete=hashDelete,Hash.prototype.get=hashGet,Hash.prototype.has=hashHas,Hash.prototype.set=hashSet,ListCache.prototype.clear=listCacheClear,ListCache.prototype.delete=listCacheDelete,ListCache.prototype.get=listCacheGet,ListCache.prototype.has=listCacheHas,ListCache.prototype.set=listCacheSet,MapCache.prototype.clear=mapCacheClear,MapCache.prototype.delete=mapCacheDelete,MapCache.prototype.get=mapCacheGet,MapCache.prototype.has=mapCacheHas,MapCache.prototype.set=mapCacheSet;var A=memoize(function(e){e=toString(e);var t=[];return l.test(e)&&t.push(""),e.replace(f,function(e,r,n,o){t.push(n?o.replace(h,"$1"):r||e)}),t});memoize.Cache=MapCache;var L=Array.isArray;e.exports=get}).call(t,r(23))},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function redirectAdBlock(e,t){var r=new URLSearchParams;return r.append("origin","after"),r.append("url",t),window.location.replace(e+"?"+r)}function redirectUolLogin(e,t){var r=new URLSearchParams;return r.append("return_url",t),r.append("logintype","navfolha"),r.append("urltype","login"),window.location.replace(e+"?"+r)}var n=r(61),o=_interopRequireDefault(n),a=r(133),i=_interopRequireDefault(a),c=r(72),s=_interopRequireDefault(c),u=r(67),l=_interopRequireDefault(u),f=r(66),p=_interopRequireDefault(f),h=r(69),d=_interopRequireDefault(h),y=r(68),_=_interopRequireDefault(y),v=r(70),m=_interopRequireDefault(v),g=r(74),b=_interopRequireDefault(g),w=r(38),x=_interopRequireDefault(w),C=r(75),O=_interopRequireDefault(C),S=r(71),j=_interopRequireDefault(S),k={extractConfig:"[data-paywall]",blacklist:[/arte\.folha(\.uol)?\.com\.br\//],timeout:"30",teaser:"15",url:{config:"https://static.folha.uol.com.br/paywall/online/config.json",detector:"https://static.folha.uol.com.br/paywall/js/1/publicidade.ads.js",wall:"//paywall.folha.uol.com.br/wall.json",adblock:"//www1.folha.uol.com.br/paywall/adblock.shtml",login:"//paywall.folha.uol.com.br/folha/login",signin:"//assine.folha.com.br/folha/assinatura/default.asp?cod_Cript=6230900763241750",fallback:"//www1.folha.uol.com.br/paywall/"},wall:{env:null,register:null,url:window.location.href,referrer:(0,s.default)("original_referrer")}},P=(0,l.default)(document.querySelector(k.extractConfig),k);(0,d.default)(P.url.config).then(function(){return(0,_.default)(P.url.detector,parseInt(P.timeout||30,10))}).then(function(e){return(0,m.default)(P.url.wall,P.wall,e,parseInt(P.timeout||30,10))}).then(function(e){if((0,i.default)(window,"paywall.data",e),(0,j.default)(e),(0,b.default)(),"ok"!==(0,o.default)(e,"status")||"on"!==(0,o.default)(e,"paywall"))throw Error("[paywall] paywall off/unavailable");if("yes"===e.is_killed)return void window.location.replace("//paywall.folha.uol.com.br/folha/login?message=killed&return_url="+e.referer_url);var t="login"===e.action?"soft":"hard",r="";0===e.max_visitor_views&&(r=0===e.max_logged_views?"-super":"-opin");var n=document.cookie.indexOf("loggedpaywall"),a=window.location.search.indexOf("loggedpaywall");"not_logged"===e.log_type&&(document.cookie="loggedpaywall=1"),"not_logged"!==e.log_type&&a>0&&n>=0&&(document.cookie="loggedpaywall=;expires='Thu, 01 Jan 1970 00:00:00 UTC'",(0,j.default)({category:"login",action:"login-success",userType:""+e.log_type,loginType:""+e.origin})),"required_login"!==e.message&&"required_subscription"!==e.message||(0,j.default)({category:"porteira-embed-"+t+r,action:"impressao",userType:""+e.log_type,loginType:""+e.origin});var c=e.log_type;if(!c||"subscriber"!==c){if(e.hasAdBlock&&!(0,p.default)(P.blacklist,P.wall.url))throw new x.default;var s=e.action;if(!s||"granted"!==s){if("redirect_uol_login"===s)return void redirectUolLogin(P.url.login,P.wall.url);var u=e.behavior,l=e.message,f=e.max_visitor_views?parseInt(e.max_visitor_views,10):0,h=e.max_logged_views?parseInt(e.max_logged_views,10):0,d=e.total_urls?parseInt(e.total_urls,10):0,y=null!==document.querySelector("[data-paywall-box]"),_=e.action;_="default"===e.skin?_:_+"-"+e.skin,u&&l&&"block"===u&&"limit_is_not_exceeded"===l||(y?(0,O.default)(s,l,d,f,h,t,P.url,parseInt(P.teaser,10),e.link_subscribe||""):window.location.replace(""+P.url.fallback+_+".shtml?"+encodeURIComponent(P.wall.url)))}}}).catch(function(e){if(e instanceof x.default)return void redirectAdBlock(P.url.adblock,P.wall.url);throw e}).catch(void 0).then(b.default)},function(e,t){},function(e,t,r){(function(e){!function(e){"use strict";function URLSearchParams(e){if(e=e||"",this[t]={},e instanceof URLSearchParams&&(e=""+e),"object"==typeof e){for(var r in e)if(e.hasOwnProperty(r)){var n="string"==typeof e[r]?e[r]:JSON.stringify(e[r]);this.append(r,n)}}else{0===e.indexOf("?")&&(e=e.slice(1));for(var o=e.split("&"),a=0;a<o.length;a++){var i=o[a],c=i.indexOf("=");-1<c&&this.append(decode(i.slice(0,c)),decode(i.slice(c+1)))}}}function encode(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'\(\)~]|%20|%00/g,function(e){return t[e]})}function decode(e){return decodeURIComponent(e.replace(/\+/g," "))}function makeIterator(t){var r={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(r[e.Symbol.iterator]=function(){return r}),r}if(!e.URLSearchParams||""+new e.URLSearchParams({a:1})!="a=1"){var t="__URLSearchParams__",r=URLSearchParams.prototype,n=!(!e.Symbol||!e.Symbol.iterator);r.append=function(e,r){var n=this[t];e in n?n[e].push(""+r):n[e]=[""+r]},r.delete=function(e){delete this[t][e]},r.get=function(e){var r=this[t];return e in r?r[e][0]:null},r.getAll=function(e){var r=this[t];return e in r?r[e].slice(0):[]},r.has=function(e){return e in this[t]},r.set=function set(e,r){this[t][e]=[""+r]},r.forEach=function(e,r){var n=this[t];Object.getOwnPropertyNames(n).forEach(function(t){n[t].forEach(function(n){e.call(r,n,t,this)},this)},this)},r.toString=function(){var e,r,n,o,a=this[t],i=[];for(r in a)for(n=encode(r),e=0,o=a[r];e<o.length;e++)i.push(n+"="+encode(o[e]));return i.join("&")},r.sort=function(){var e,r,n=this[t],o=[],a={};for(e in n)o.push(e);for(o.sort(),r=0;r<o.length;r++)a[o[r]]=n[o[r]];this[t]=a},r.keys=function(){var e=[];return this.forEach(function(t,r){e.push([r])}),makeIterator(e)},r.values=function(){var e=[];return this.forEach(function(t){e.push([t])}),makeIterator(e)},r.entries=function(){var e=[];return this.forEach(function(t,r){e.push([r,t])}),makeIterator(e)},n&&(r[e.Symbol.iterator]=r.entries),e.URLSearchParams=URLSearchParams,e.URLSearchParams.polyfill=!0}}(void 0!==e?e:"undefined"!=typeof window?window:this)}).call(t,r(23))},function(e,t){!function(e){"use strict";function normalizeName(e){if("string"!=typeof e&&(e+=""),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function normalizeValue(e){return"string"!=typeof e&&(e+=""),e}function iteratorFor(e){var r={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t.iterable&&(r[Symbol.iterator]=function(){return r}),r}function Headers(e){this.map={},e instanceof Headers?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function consumed(e){return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function fileReaderReady(e){return new Promise(function(t,r){e.onload=function(){t(e.result)},e.onerror=function(){r(e.error)}})}function readBlobAsArrayBuffer(e){var t=new FileReader,r=fileReaderReady(t);return t.readAsArrayBuffer(e),r}function readBlobAsText(e){var t=new FileReader,r=fileReaderReady(t);return t.readAsText(e),r}function readArrayBufferAsText(e){for(var t=new Uint8Array(e),r=Array(t.length),n=0;n<t.length;n++)r[n]=String.fromCharCode(t[n]);return r.join("")}function bufferClone(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function Body(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(t.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(t.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(t.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=""+e;else if(t.arrayBuffer&&t.blob&&n(e))this._bodyArrayBuffer=bufferClone(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!t.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!o(e))throw Error("unsupported BodyInit type");
+ this._bodyArrayBuffer=bufferClone(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):t.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},t.blob&&(this.blob=function(){var e=consumed(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?consumed(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(readBlobAsArrayBuffer)}),this.text=function(){var e=consumed(this);if(e)return e;if(this._bodyBlob)return readBlobAsText(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));if(this._bodyFormData)throw Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},t.formData&&(this.formData=function(){return this.text().then(decode)}),this.json=function(){return this.text().then(JSON.parse)},this}function normalizeMethod(e){var t=e.toUpperCase();return a.indexOf(t)>-1?t:e}function Request(e,t){t=t||{};var r=t.body;if("string"==typeof e)this.url=e;else{if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new Headers(e.headers)),this.method=e.method,this.mode=e.mode,r||null==e._bodyInit||(r=e._bodyInit,e.bodyUsed=!0)}if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new Headers(t.headers)),this.method=normalizeMethod(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(r)}function decode(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var r=e.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");t.append(decodeURIComponent(n),decodeURIComponent(o))}}),t}function parseHeaders(e){var t=new Headers;return e.split("\r\n").forEach(function(e){var r=e.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();t.append(n,o)}}),t}function Response(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new Headers(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var t={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(t.arrayBuffer)var r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],n=function(e){return e&&DataView.prototype.isPrototypeOf(e)},o=ArrayBuffer.isView||function(e){return e&&r.indexOf(Object.prototype.toString.call(e))>-1};Headers.prototype.append=function(e,t){e=normalizeName(e),t=normalizeValue(t);var r=this.map[e];r||(r=[],this.map[e]=r),r.push(t)},Headers.prototype.delete=function(e){delete this.map[normalizeName(e)]},Headers.prototype.get=function(e){var t=this.map[normalizeName(e)];return t?t[0]:null},Headers.prototype.getAll=function(e){return this.map[normalizeName(e)]||[]},Headers.prototype.has=function(e){return this.map.hasOwnProperty(normalizeName(e))},Headers.prototype.set=function(e,t){this.map[normalizeName(e)]=[normalizeValue(t)]},Headers.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(r){this.map[r].forEach(function(n){e.call(t,n,r,this)},this)},this)},Headers.prototype.keys=function(){var e=[];return this.forEach(function(t,r){e.push(r)}),iteratorFor(e)},Headers.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),iteratorFor(e)},Headers.prototype.entries=function(){var e=[];return this.forEach(function(t,r){e.push([r,t])}),iteratorFor(e)},t.iterable&&(Headers.prototype[Symbol.iterator]=Headers.prototype.entries);var a=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var e=new Response(null,{status:0,statusText:""});return e.type="error",e};var i=[301,302,303,307,308];Response.redirect=function(e,t){if(i.indexOf(t)===-1)throw new RangeError("Invalid status code");return new Response(null,{status:t,headers:{location:e}})},e.Headers=Headers,e.Request=Request,e.Response=Response,e.fetch=function(e,r){return new Promise(function(n,o){var a=new Request(e,r),i=new XMLHttpRequest;i.onload=function(){var e={status:i.status,statusText:i.statusText,headers:parseHeaders(i.getAllResponseHeaders()||"")};e.url="responseURL"in i?i.responseURL:e.headers.get("X-Request-URL"),n(new Response("response"in i?i.response:i.responseText,e))},i.onerror=function(){o(new TypeError("Network request failed"))},i.ontimeout=function(){o(new TypeError("Network request failed"))},i.open(a.method,a.url,!0),"include"===a.credentials&&(i.withCredentials=!0),"responseType"in i&&t.blob&&(i.responseType="blob"),a.headers.forEach(function(e,t){i.setRequestHeader(t,e)}),i.send(void 0===a._bodyInit?null:a._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!=typeof self?self:this)},function(e,t){"use strict";function blacklistedLocation(e,t){return!Array.prototype.slice.call(e).reduce(function(e,r){return e||(r instanceof RegExp?r:RegExp(r)).test(t)},!1)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=blacklistedLocation,e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function captalize(e){return""+e.charAt(0).toUpperCase()+e.slice(1)}function expandConfig(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"paywall";return(0,l.default)(t).reduce(function(n,a){var c=""+r+captalize(a);return t[a]&&"object"===(0,s.default)(t[a])?(0,i.default)({},n,(0,o.default)({},a,expandConfig(e,t[a],c))):e.dataset[c]?(0,i.default)({},n,(0,o.default)({},a,e.dataset[c])):n},t)}Object.defineProperty(t,"__esModule",{value:!0});var n=r(84),o=_interopRequireDefault(n),a=r(41),i=_interopRequireDefault(a),c=r(24),s=_interopRequireDefault(c),u=r(39),l=_interopRequireDefault(u);t.default=expandConfig,e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function fetchDetector(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:30;return new o.default(function(r){window.folha_ads=!1;var n=window.setTimeout(function(){window.clearTimeout(n),r(!0)},1e3*t),o=document.createElement("script");o.src=e,o.addEventListener("load",function(){window.clearTimeout(n),r(!window.folha_ads)},!1),document.body.appendChild(o)})}Object.defineProperty(t,"__esModule",{value:!0});var n=r(40),o=_interopRequireDefault(n);t.default=fetchDetector,e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function fetchStaticConfig(e){return fetch(e).then(function(e){return e.json()}).then(function(e){if(!(0,o.default)(e,"params.paywall")||!(0,o.default)(e,"params.status"))throw Error("Configurações estáticas inválidas.");if("on"!==e.params.paywall||"ok"!==e.params.status)throw Error("Paywall desligado ou não funcional.");return e})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=fetchStaticConfig;var n=r(37),o=_interopRequireDefault(n);e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function fetchWall(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:30;return new i.default(function(a,i){var c=window.setTimeout(function(){window.clearTimeout(c),i(new s.default("AdBlock ligado"))},1e3*n);return fetch(e+"?"+(0,l.default)(t,r),{credentials:"include"}).then(function(e){return e.json()}).then(function(e){window.clearTimeout(c),a((0,o.default)({},e,{hasAdBlock:r}))}).catch(function(e){return i(e)})})}Object.defineProperty(t,"__esModule",{value:!0});var n=r(41),o=_interopRequireDefault(n),a=r(40),i=_interopRequireDefault(a);t.default=fetchWall;var c=r(38),s=_interopRequireDefault(c),u=r(73),l=_interopRequireDefault(u);e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function gaEvent(e){function sendEvent(e){!function tryHit(t,r){try{UOLPD.Audience.countEvent(e,!0)}catch(e){r>0&&setTimeout(function tryDelay(){tryHit(t,r-1)},t)}}(50,300)}(0,o.default)(e,"analytics")?e.analytics.forEach(function(e){sendEvent({category:"paywall",action:e.a,label:e.l})}):sendEvent(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=gaEvent;var n=r(37),o=_interopRequireDefault(n);e.exports=t.default},function(e,t,r){"use strict";function getReferrer(e){var t=(0,n.get)(e);return(0,n.remove)(e),t||document.referrer}Object.defineProperty(t,"__esModule",{value:!0}),t.default=getReferrer;var n=r(134);e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function hasEmptyParam(e){return(0,o.default)(e).filter(function(e){return"referrer"!==e}).reduce(function(t,r){return t||!e[r]},!1)}function getWallParams(e,t){var r=new URLSearchParams;if(hasEmptyParam(e))throw Error("[paywall] Invalid wall params");return(0,o.default)(e).forEach(function(t){return r.append(t,e[t])}),r.append("hab",t?"yes":"no"),r.append("_",(new Date).getTime()),r}Object.defineProperty(t,"__esModule",{value:!0});var n=r(39),o=_interopRequireDefault(n);t.default=getWallParams,e.exports=t.default},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(!c&&(c=!0,(0,i.default)(window,"paywall.after"))){var t=(0,o.default)(window,"paywall.after");"function"==typeof t&&t(e)}};var n=r(61),o=_interopRequireDefault(n),a=r(37),i=_interopRequireDefault(a),c=!1;e.exports=t.default},function(e,t){"use strict";function showPaywall(e,t,r,n,o,a){var i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{login:"#"},c=i.login,s=(arguments[7],arguments[8]),u=document.querySelector("[data-paywall-box]"),l=document.querySelector("[data-paywall]").getAttribute("data-paywall-product"),f=l?" c-paywall--"+l:"",p=document.querySelector('meta[name="folhaapp-webview"][content="ios"]'),h=navigator.userAgent.match(/iphone|ipad/i),d=p&&h?"c-paywall__teaser--is-hidden":"",y=null!==document.querySelector(".c-image-full"),_=null!==document.querySelector(".c-news__head"),v=encodeURIComponent(window.location.href),m=s||"//secure.folha.com.br/folha/assine/380101",g="//login.folha.com.br/uol/login",b=void 0,w='<div class="c-paywall'+f+'"><div class="c-paywall__row">'+('<h4 class="c-paywall__title">Você atingiu o limite de '+n+" reportagens por mês</h4>")+'<div class="c-paywall__half-col c-paywall__login-area"><div class="c-paywall__row"><div class="c-paywall__half-col">'+('<p class="c-paywall__text">Tenha acesso a '+o+" reportagens por mês<br>")+"Caso seja assinante, o acesso será ilimitado</p>"+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"'")+",action:'clique',label:'crie-sua-conta'})\" "+('href="'+c+"?return_url="+v+'%3Floggedpaywall&urltype=register" class="c-paywall__button">')+'Crie sua conta</a></div><div class="c-paywall__half-col"><p class="c-paywall__text"><span class="c-paywall__text--custom">Para você que já tem conta</span></p>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"'")+",action:'clique',label:'faca-login'})\""+('href="'+c+"?return_url="+v+'%3Floggedpaywall&logintype=cadastrado&urltype=login" ')+'class="c-paywall__button">Faça login</a></div></div><div class="c-paywall__social"><p class="c-paywall__text">ou acesse com:</p><ul class="c-paywall__login-list"><li>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+"label:'acessar-com-facebook'})\" "+('href="'+c+"?return_url="+v+'%3Floggedpaywall&amp;logintype=cadastrado&amp;urltype=facebook" ')+'class="c-paywall__social-login c-paywall__social-login--facebook rs_skip" role="button" aria-label="Facebook"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="24" height="24" class="icon icon--facebook" aria-hidden="true"><path d="M 9.5000001,2.9999998 H 12 V -1.95e-7 H 9.5000001 C 7.57,-1.95e-7 6,1.5699998 6,3.4999998 v 1.5 H 4 v 3 H 6 V 16 H 9.0000001 V 7.9999998 H 11.5 l 0.5,-3 H 9.0000001 v -1.5 c 0,-0.271 0.229,-0.5 0.5,-0.5 z"/></svg></a></li><li>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+"label:'acessar-com-linkedin'})\""+('href="'+c+"?return_url="+v+'%3Floggedpaywall&amp;logintype=cadastrado&amp;urltype=linkedin" ')+'class="c-paywall__social-login c-paywall__social-login--linkedin rs_skip" role="button" aria-label="Linkedin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="24" height="24" class="icon icon--linkedin" aria-hidden="true"><path d="M 0.5217573,3.4217496 C 0.8574099,3.7574022 1.3243328,3.925225 1.883477,3.925225 l 0.019112,0 c 0.5965319,0 1.062624,-0.1678228 1.416555,-0.5034754 C 3.6739051,3.0669849 3.8417314,2.656557 3.8417314,2.1348025 3.8417314,1.6313201 3.6547964,1.2026132 3.319144,0.86696056 2.9834872,0.531308 2.517395,0.3634851 1.9391422,0.3634851 1.3608886,0.3634851 0.8947967,0.531308 0.5408658,0.86696056 0.1861045,1.2026132 -1e-7,1.6313201 -1e-7,2.1348025 c 0,0.5217545 0.1678263,0.9321824 0.5217572,1.2869471 l 0,0 z m -0.3165439,12.2147654 3.4313014,0 0,-10.2939042 -3.4313014,0 0,10.2939042 z m 8.7460799,0 0,-5.7443117 c 0,-0.3539317 0.037384,-0.633921 0.1121617,-0.839135 C 9.2121719,8.6991367 9.4364945,8.4008753 9.7347601,8.1582701 10.013917,7.9156719 10.386957,7.8035124 10.834771,7.8035124 c 0.596531,0 1.025236,0.2052139 1.305224,0.6156349 0.279987,0.410428 0.428705,0.9886857 0.428705,1.7156547 l 0,5.501713 3.4313,0 0,-5.8930294 C 16,8.2139334 15.64607,7.0582579 14.919099,6.2747932 14.191298,5.4913284 13.240005,5.1000126 12.046942,5.1000126 c -0.428705,0 -0.839131,0.055677 -1.193893,0.1678228 -0.353931,0.093054 -0.652197,0.2425982 -0.9130756,0.446986 C 9.6973732,5.9017564 9.5104375,6.0878582 9.3617206,6.2565141 9.2121719,6.4235108 9.063455,6.6104458 8.9321847,6.8339388 l 0.019112,0 0,-1.491328 -3.4313016,0 0.018279,0.5034754 0,3.0765435 c 0,1.7156473 0,3.9538893 -0.018279,6.7138853 l 3.4313016,0 0,0 z"/></svg></a></li><li>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+"label:'acessar-com-google'})\" "+('href="'+c+"?return_url="+v+'%3Floggedpaywall&amp;logintype=cadastrado&amp;urltype=google" ')+'class="c-paywall__social-login c-paywall__social-login--google rs_skip" role="button" aria-label="Google"><svg xmlns="http://www.w3.org/2000/svg" width="14px" height="14px" viewBox="0 0 14 14" version="1.1" class="icon-google-logo" aria-hidden="true"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M7,2.70666667 C8.31444444,2.70666667 9.20111111,3.27444444 9.70666667,3.74888889 L11.6822222,1.82 C10.4688889,0.692222222 8.89,0 7,0 C4.26222222,0 1.89777778,1.57111111 0.746666667,3.85777778L3.01,5.61555556 C3.57777778,3.92777778 5.14888889,2.70666667 7,2.70666667 L7,2.70666667 Z" fill="#EA4335"></path><path d="M13.72,7.15555556 C13.72,6.58 13.6733333,6.16 13.5722222,5.72444444 L7,5.72444444 L7,8.32222222 L10.8577778,8.32222222 C10.78,8.96777778 10.36,9.94 9.42666667,10.5933333 L11.6355556,12.3044444 C12.9577778,11.0833333 13.72,9.28666667 13.72,7.15555556 L13.72,7.15555556 Z" fill="#4285F4"></path><path d="M3.01777778,8.38444444 C2.87,7.94888889 2.78444444,7.48222222 2.78444444,7 C2.78444444,6.51777778 2.87,6.05111111 3.01,5.61555556 L0.746666667,3.85777778 C0.272222222,4.80666667 0,5.87222222 0,7 C0,8.12777778 0.272222222,9.19333333 0.746666667,10.1422222 L3.01777778,8.38444444 L3.01777778,8.38444444 Z" fill="#FBBC05"></path><path d="M7,14 C8.89,14 10.4766667,13.3777778 11.6355556,12.3044444 L9.42666667,10.5933333 C8.83555556,11.0055556 8.04222222,11.2933333 7,11.2933333 C5.14888889,11.2933333 3.57777778,10.0722222 3.01777778,8.38444444 L0.754444444,10.1422222C1.90555556,12.4288889 4.26222222,14 7,14 L7,14 Z" fill="#34A853"></path></g></svg><svg xmlns="http://www.w3.org/2000/svg" width="46" height="14" viewBox="0 0 46 14" version="1.1" class="icon-google-text" aria-hidden="true"><path fill="#757575" fill-rule="evenodd" d="M8.64 9.708c-.36.47-.858.825-1.496 1.066-.638.242-1.363.363-2.174.363-.834 0-1.573-.19-2.215-.568a3.78 3.78 0 0 1-1.487-1.623C.92 8.242.738 7.42.725 6.48v-.779c0-1.504.36-2.678 1.08-3.524C2.525 1.333 3.53.91 4.819.91c1.108 0 1.987.274 2.639.82.652.547 1.044 1.336 1.176 2.366H6.938c-.19-1.199-.886-1.798-2.084-1.798-.775 0-1.364.279-1.768.837-.403.559-.6111.378-.625 2.458v.765c0 1.076.227 1.911.68 2.506.454.594 1.084.892 1.89.892.884 0 1.513-.2 1.887-.602V7.206h-2.05V5.894H8.64v3.814zm1.648-2.475c0-.724.144-1.377.43-1.958a3.145 3.145 0 0 1 1.21-1.34c.52-.312 1.117-.468 1.792-.468.998 0 1.808.321 2.43.964.622.642.958 1.494 1.008 2.556l.007.39c0 .73-.14 1.38-.42 1.955a3.108 3.108 0 0 1-1.203 1.333c-.522.314-1.125.472-1.809.472-1.043 0-1.878-.348-2.505-1.043s-.94-1.621-.94-2.779v-.082zm1.661.144c0 .761.157 1.357.472 1.788.314.43.752.646 1.312.646s.997-.22 1.31-.657c.312-.437.468-1.077.468-1.92 0-.748-.16-1.34-.482-1.778-.321-.437-.758-.656-1.31-.656-.542 0-.972.215-1.291.646-.32.43-.479 1.074-.479 1.931zm6.529-.144c0-.724.143-1.377.43-1.958a3.145 3.145 0 0 1 1.21-1.34c.52-.312 1.117-.468 1.791-.468.998 0 1.808.321 2.43.964.622.642.959 1.494 1.009 2.556l.006.39c0 .73-.14 1.38-.42 1.955a3.108 3.108 0 0 1-1.203 1.333c-.522.314-1.125.472-1.808.472-1.044 0-1.879-.348-2.506-1.043-.626-.695-.94-1.621-.94-2.779v-.082zm1.66.144c0 .761.158 1.357.472 1.788.315.43.752.646 1.313.646.56 0 .997-.22 1.309-.657.312-.437.468-1.077.468-1.92 0-.748-.16-1.34-.482-1.778-.321-.437-.757-.656-1.309-.656-.542 0-.973.215-1.292.646-.319.43-.478 1.074-.478 1.931zm6.55-.13c0-1.148.27-2.066.81-2.751.54-.686 1.256-1.03 2.15-1.03.843 0 1.506.295 1.989.883l.075-.745h1.497v7.17c0 .971-.302 1.737-.906 2.297-.604.56-1.418.841-2.444.841a3.939 3.939 0 0 1-1.589-.338c-.517-.226-.91-.52-1.18-.886l.787-.998c.51.607 1.14.91 1.887.91.551 0 .986-.15 1.305-.448.32-.299.479-.737.479-1.316v-.5c-.479.534-1.117.8-1.914.8-.866 0-1.574-.343-2.123-1.032-.549-.688-.823-1.64-.823-2.857zm1.654.144c0 .742.151 1.327.454 1.753.303.426.724.64 1.262.64.67 0 1.166-.288 1.49-.862V5.668c-.315-.56-.807-.84-1.477-.84-.547 0-.972.216-1.275.649-.303.433-.454 1.07-.454 1.914zM36.9 11h-1.66V.5h1.66V11zm5.285.137c-1.053 0-1.907-.332-2.56-.995-.654-.663-.981-1.546-.981-2.649v-.205c0-.738.142-1.398.427-1.979a3.252 3.252 0 0 1 1.2-1.357 3.172 3.172 0 0 1 1.722-.485c1.007 0 1.785.321 2.335.964.549.642.823 1.551.823 2.727v.67h-4.833c.05.61.254 1.094.612 1.45.358.355.808.533 1.35.533.761 0 1.381-.308 1.86-.923l.895.854a2.99 2.99 0 0 1-1.186 1.029 3.713 3.713 0 0 1-1.664.366zM41.986 4.8c-.455 0-.823.16-1.104.478-.28.32-.459.764-.536 1.333h3.165v-.123c-.037-.556-.185-.976-.445-1.26-.26-.286-.62-.428-1.08-.428z"/></svg></a></li><li>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+("label:'acessar-com-uol'})\" href=\""+g+"?done="+v+'%3Floggedpaywall" ')+'class="c-paywall__login-uol rs_skip" role="button"></a></li></ul></div></div><div class="c-paywall__half-col">'+('<div class="c-paywall__teaser '+d+'">')+'<figure class="c-paywall__devices"><img src="//f.i.uol.com.br/heimdall/assine-folha-todos-dispositivos-transparente-321x149.png" alt="Folha de São Paulo em todos devices"></figure><p class="c-paywall__text">Tenha acesso ilimitado, <span>descontos em produtos Folha e muito mais</span></p><p class="c-paywall__price">Folha digital por apenas R$1,90* <small>*no primeiro mês</small></p>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"'")+",action:'clique',label:'assine-a-folha'})\""+('href="'+m+'" class="c-paywall__button c-paywall__button--primary">Assine a Folha</a>')+"</div></div></div></div>",x=""+('<div class="c-paywall'+f+'">')+('<h4 class="c-paywall__title">Você atingiu o limite de '+o+" reportagens por mês</h4>")+('<div class="c-paywall__teaser '+d+'">')+'<figure class="c-paywall__devices"><img src="//f.i.uol.com.br/heimdall/assine-folha-todos-dispositivos-transparente-321x149.png" alt="Folha de São Paulo em todos devices"></figure><p class="c-paywall__text c-paywall__text-offers">Tenha acesso ilimitado, descontos em produtos Folha e muito mais</p><p class="c-paywall__price">Folha digital por apenas R$1,90* <small>*no primeiro mês</small></p>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"'")+",action:'clique',label:'assine-a-folha'})\""+('href="'+m+'" class="c-paywall__button c-paywall__button--primary">Assine a Folha</a>')+'</div><p class="c-paywall__text">Já é assinante?</p>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"'")+",action:'clique',label:'faca-login'})\""+('href="'+c+"?return_url="+v+'%3Floggedpaywall&logintype=cadastrado&urltype=login" ')+'class="c-paywall__button">Faça login</a><p class="c-paywall__text">Se já estiver logado, '+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+"label:'vincule-sua-conta'})\" "+('href="'+c+"?return_url="+v+'%3Floggedpaywall&amp;logintype=assinanteedit">')+'vincule sua conta à assinatura</a></p><div class="c-paywall__social"><p class="c-paywall__text">ou acesse com:</p>'+("<a onclick=\"UOLPD.Audience.countClick({category:'porteira-embed-"+a+"',action:'clique',")+("label:'acessar-com-uol'})\" href=\""+g+"?done="+v+'%3Floggedpaywall" ')+'class="c-paywall__login-uol rs_skip" role="button"></a></div></div>';if(y){var C=document.querySelector(".c-image-full").parentNode;C.parentNode.removeChild(C)}if(_){var O=document.querySelector(".c-news__head");O.parentNode.removeChild(O)}var S="Conteúdo restrito a assinantes e cadastrados";if("required_subscription"===t?(u.innerHTML=""+x,b="4387796",S="Conteúdo restrito a assinantes"):"required_login"===t&&(0===o?u.innerHTML=""+x:u.innerHTML=""+w,b="4388432"),0===n){if(0===o){S="As reportagens da Folha são acessíveis apenas para assinantes";document.querySelector(".c-paywall__text-offers").innerHTML="Tenha acesso ilimitado a reportagens e colunas,<br>descontos em produtos Folha e muito mais"}document.querySelector(".c-paywall__title").innerHTML=S}u.querySelector(".c-paywall__login-uol").innerHTML='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="71" height="32" viewBox="0 0 71 32"><defs><path id="svg-uol-a" d="M27.244 9.944V.046H.825v9.897h26.419z"></path><path id="svg-uol-c" d="M19.765 20h29.479V0H0v20h19.765V0H0v20h19.765z"></path></defs><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><rect width="71" height="32" fill="#333" rx="16"></rect><g transform="translate(33 11)"><mask id="svg-uol-b" fill="#fff"><use xlink:href="#svg-uol-a"></use></mask><path fill="#FFF" d="M12.753 4.995c0-1.212.872-2.167 2.072-2.167 1.213 0 2.127.955 2.127 2.167 0 1.2-.914 2.14-2.127 2.14-1.2 0-2.072-.94-2.072-2.14zM9.836 2.01c0-1.103-.409-1.717-1.65-1.717h-1.43V.32.305v5.112c0 1.295-.573 1.718-1.432 1.718s-1.418-.423-1.418-1.718V2.01C3.906.907 3.497.293 2.257.293H.825v5.112c0 3.244 1.691 4.538 4.512 4.538 2.822 0 4.308-1.104 4.5-4.115.435 2.398 2.521 4.115 5.07 4.115 2.385 0 4.471-1.716 4.907-3.87v3.625h5.698c1.227 0 1.732-.354 1.732-1.58V6.984h-4.363V2.011c0-1.105-.395-1.719-1.636-1.719h-1.43l.013.028-.014-.014V3.96c-.436-2.208-2.33-3.912-4.907-3.912-2.549 0-4.635 1.705-5.07 3.912V2.01z" mask="url(#svg-uol-b)"></path></g><path fill="#AC2F1B" d="M28.035 15.71a2.881 2.881 0 0 0-.615-.092 6.616 6.616 0 0 1 .712 3.605A7.77 7.77 0 0 0 29.31 16.5a2.482 2.482 0 0 0-1.275-.79M25.084 14.849c-1.633-1.568-3.923-2.594-5.939-2.594-2.808 0-5.222 1.228-6.344 3.333.49 3.978 4.08 7.233 8.334 7.233.13 0 .26-.004.387-.01-.505-1.082-.454-2.543.158-4.08.64-1.611 1.952-3.1 3.404-3.882"></path><g transform="translate(11 6)"><mask id="svg-uol-d" fill="#fff"><use xlink:href="#svg-uol-c"></use></mask><path fill="#AC2F1B" d="M14.246 18.54a7.233 7.233 0 0 1-4.394 1.394C4.924 19.88.812 16.19.782 12.145a7.1 7.1 0 0 1 .405-2.45 8.265 8.265 0 0 1-.095-1.246c0-2.872 2.315-6.574 5.54-7.74 1.27-.46 2.318-.662 3.53-.63 1.145.028 2.61.32 3.58.813 2.747 1.401 5.143 4.497 5.238 7.664a7.716 7.716 0 0 1-.113 1.558c.582 1.334.468 3.185-.485 4.847-.163.284-.336.556-.515.817l-.045.065c-.988 1.41-2.21 2.432-3.576 2.697M9.926 0C4.468 0 0 4.584 0 10.031c0 5.448 4.454 9.97 9.912 9.97 5.46 0 9.853-4.522 9.853-9.97 0-5.447-4.38-10.03-9.839-10.03" mask="url(#svg-uol-d)"></path></g><path fill="#AC2F1B" d="M27.092 20.907a9.268 9.268 0 0 1-4.91 2.15c.318.61.878 1.066 1.703 1.293.276.076.556.11.837.106a5.948 5.948 0 0 0 2.37-3.55"></path><path fill="#EDC647" d="M28.7 11.267c-1.326-2.796-4.182-4.86-7.495-4.815-4.908.067-8.377 3.736-8.458 8.055 1.304-2.175 3.81-3.519 6.775-3.519 2.79 0 5.445 1.32 7.057 3.332a3.249 3.249 0 0 1 1.348.054 2.79 2.79 0 0 1 1.442.926l.102.078c.015-.204.025-.41.024-.619a8.281 8.281 0 0 0-.795-3.492M22.34 19.438c-.508 1.262-.622 2.434-.285 3.334 2.006-.207 3.81-1.085 5.14-2.418.045-.318.07-.646.07-.987 0-1.257-.492-2.458-1.278-3.504-1.538.56-3.011 1.996-3.647 3.575M23.575 24.48c-.868-.23-1.5-.717-1.897-1.374a9.346 9.346 0 0 1-.651.025c-4.164 0-7.65-2.798-8.647-6.509a6.134 6.134 0 0 0-.248 1.825c.038 3.587 3.717 7.332 8.235 7.332 1.534 0 2.972-.412 4.134-1.173a3.8 3.8 0 0 1-.926-.127"></path><path fill="#E7992E" d="M29.654 17.023a8.12 8.12 0 0 1-1.61 2.927c-.308 1.811-1.241 3.348-2.565 4.411 1.22-.29 2.408-1.22 3.295-2.452.106-.149.216-.312.335-.503 0 0 0-.002.002-.003a6.5 6.5 0 0 0 .188-.324l.006-.01c.118-.219.223-.445.316-.675.485-1.234.486-2.465.033-3.37"></path><path fill="#000" d="M29.202 21.254c-.91 1.553-2.293 2.767-3.723 3.107 1.324-1.062 2.257-2.599 2.565-4.411a8.123 8.123 0 0 0 1.61-2.927c.559 1.118.427 2.73-.452 4.231m-8.835 4.525c-4.518 0-8.197-3.744-8.236-7.332a6.167 6.167 0 0 1 .249-1.825c.998 3.712 4.483 6.509 8.647 6.509.219 0 .435-.01.65-.025.398.658 1.03 1.143 1.898 1.373.314.084.622.124.926.127-1.162.761-2.6 1.173-4.134 1.173m7.053-10.16c.209.008.415.037.615.09.532.142.958.418 1.275.79a7.755 7.755 0 0 1-1.178 2.724 6.615 6.615 0 0 0-.712-3.604m-5.08 3.819c.636-1.579 2.109-3.015 3.647-3.574.786 1.046 1.277 2.246 1.277 3.503 0 .341-.025.67-.07.988-1.33 1.333-3.133 2.21-5.14 2.417-.336-.899-.223-2.071.286-3.334m-.818 3.374a9.901 9.901 0 0 1-.387.009c-4.253 0-7.844-3.256-8.334-7.234 1.122-2.104 3.536-3.332 6.344-3.332 2.017 0 4.307 1.026 5.94 2.594-1.453.782-2.764 2.27-3.405 3.881-.611 1.538-.662 2.998-.158 4.082m3.2 1.644a3.018 3.018 0 0 1-.837-.106c-.825-.227-1.385-.682-1.703-1.292a9.28 9.28 0 0 0 4.91-2.151 5.954 5.954 0 0 1-2.37 3.549M21.205 6.453c3.313-.046 6.169 2.018 7.495 4.814a8.283 8.283 0 0 1 .795 3.493c0 .223-.01.444-.027.662a2.802 2.802 0 0 0-1.541-1.047 3.216 3.216 0 0 0-1.348-.054c-1.612-2.012-4.267-3.332-7.057-3.332-2.965 0-5.472 1.343-6.775 3.518.08-4.318 3.55-7.987 8.458-8.054m8.663 9.661a7.784 7.784 0 0 0 .112-1.558c-.094-3.167-2.491-6.263-5.238-7.664-.97-.494-2.435-.785-3.58-.814-1.212-.031-2.26.17-3.53.63-3.224 1.167-5.54 4.87-5.54 7.741 0 .422.034.838.095 1.245a7.123 7.123 0 0 0-.405 2.451c.029 4.045 4.142 7.734 9.07 7.79a7.238 7.238 0 0 0 4.394-1.395c1.636-.318 3.07-1.72 4.136-3.579.954-1.662 1.067-3.513.486-4.847"></path></g></svg>';var j=document.getElementsByTagName("head")[0],k=document.createElement("script");k.type="text/javascript",k.src="https://static.folha.uol.com.br/library/propensity/propensity.js",k.async="async",k.id="propensity-activity-tag",k.setAttribute("data-xsp",""+b),j.appendChild(k)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=showPaywall,e.exports=t.default},function(e,t,r){e.exports={default:r(87),__esModule:!0}},function(e,t,r){e.exports={default:r(88),__esModule:!0}},function(e,t,r){e.exports={default:r(89),__esModule:!0}},function(e,t,r){e.exports={default:r(90),__esModule:!0}},function(e,t,r){e.exports={default:r(92),__esModule:!0}},function(e,t,r){e.exports={default:r(94),__esModule:!0}},function(e,t,r){e.exports={default:r(95),__esModule:!0}},function(e,t){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(78),o=_interopRequireDefault(n);t.default=function(e,t,r){return t in e?(0,o.default)(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(80),o=_interopRequireDefault(n),a=r(77),i=_interopRequireDefault(a),c=r(24),s=_interopRequireDefault(c);t.default=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+(void 0===t?"undefined":(0,s.default)(t)));e.prototype=(0,i.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(o.default?(0,o.default)(e,t):e.__proto__=t)}},function(e,t,r){"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(24),o=_interopRequireDefault(n);t.default=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":(0,o.default)(t))&&"function"!=typeof t?e:t}},function(e,t,r){r(121),e.exports=r(0).Object.assign},function(e,t,r){r(122);var n=r(0).Object;e.exports=function create(e,t){return n.create(e,t)}},function(e,t,r){r(123);var n=r(0).Object;e.exports=function defineProperty(e,t,r){return n.defineProperty(e,t,r)}},function(e,t,r){r(124),e.exports=r(0).Object.getPrototypeOf},function(e,t,r){r(125),e.exports=r(0).Object.keys},function(e,t,r){r(126),e.exports=r(0).Object.setPrototypeOf},function(e,t,r){r(58),r(59),r(60),r(127),r(129),r(130),e.exports=r(0).Promise},function(e,t,r){r(128),r(58),r(131),r(132),e.exports=r(0).Symbol},function(e,t,r){r(59),r(60),e.exports=r(36).f("iterator")},function(e,t){e.exports=function(){}},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){var n=r(11),o=r(57),a=r(117);e.exports=function(e){return function(t,r,i){var c,s=n(t),u=o(s.length),l=a(i,u);if(e&&r!=r){for(;u>l;)if(c=s[l++],c!=c)return!0}else for(;u>l;l++)if((e||l in s)&&s[l]===r)return e||l||0;return!e&&-1}}},function(e,t,r){var n=r(16),o=r(30),a=r(18);e.exports=function(e){var t=n(e),r=o.f;if(r)for(var i,c=r(e),s=a.f,u=0;c.length>u;)s.call(e,i=c[u++])&&t.push(i);return t}},function(e,t,r){var n=r(13),o=r(104),a=r(102),i=r(4),c=r(57),s=r(119),u={},l={},t=e.exports=function(e,t,r,f,p){var h,d,y,_,v=p?function(){return e}:s(e),m=n(r,f,t?2:1),g=0;if("function"!=typeof v)throw TypeError(e+" is not iterable!");if(a(v)){for(h=c(e.length);h>g;g++)if(_=t?m(i(d=e[g])[0],d[1]):m(e[g]),_===u||_===l)return _}else for(y=v.call(e);!(d=y.next()).done;)if(_=o(y,m,d.value,t),
+ _===u||_===l)return _};t.BREAK=u,t.RETURN=l},function(e,t){e.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},function(e,t,r){var n=r(14),o=r(2)("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(n.Array===e||a[o]===e)}},function(e,t,r){var n=r(12);e.exports=Array.isArray||function isArray(e){return"Array"==n(e)}},function(e,t,r){var n=r(4);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var a=e.return;throw void 0!==a&&n(a.call(e)),t}}},function(e,t,r){"use strict";var n=r(29),o=r(19),a=r(20),i={};r(9)(i,r(2)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=n(i,{next:o(1,r)}),a(e,t+" Iterator")}},function(e,t,r){var n=r(2)("iterator"),o=!1;try{var a=[7][n]();a.return=function(){o=!0},Array.from(a,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var a=[7],i=a[n]();i.next=function(){return{done:r=!0}},a[n]=function(){return i},e(a)}catch(e){}return r}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){var n=r(22)("meta"),o=r(6),a=r(8),i=r(7).f,c=0,s=Object.isExtensible||function(){return!0},u=!r(10)(function(){return s(Object.preventExtensions({}))}),l=function(e){i(e,n,{value:{i:"O"+ ++c,w:{}}})},f=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,n)){if(!s(e))return"F";if(!t)return"E";l(e)}return e[n].i},p=function(e,t){if(!a(e,n)){if(!s(e))return!0;if(!t)return!1;l(e)}return e[n].w},h=function(e){return u&&d.NEED&&s(e)&&!a(e,n)&&l(e),e},d=e.exports={KEY:n,NEED:!1,fastKey:f,getWeak:p,onFreeze:h}},function(e,t,r){var n=r(1),o=r(56).set,a=n.MutationObserver||n.WebKitMutationObserver,i=n.process,c=n.Promise,s="process"==r(12)(i);e.exports=function(){var e,t,r,u=function(){var n,o;for(s&&(n=i.domain)&&n.exit();e;){o=e.fn,e=e.next;try{o()}catch(n){throw e?r():t=void 0,n}}t=void 0,n&&n.enter()};if(s)r=function(){i.nextTick(u)};else if(!a||n.navigator&&n.navigator.standalone)if(c&&c.resolve){var l=c.resolve(void 0);r=function(){l.then(u)}}else r=function(){o.call(n,u)};else{var f=!0,p=document.createTextNode("");new a(u).observe(p,{characterData:!0}),r=function(){p.data=f=!f}}return function(n){var o={fn:n,next:void 0};t&&(t.next=o),e||(e=o,r()),t=o}}},function(e,t,r){"use strict";var n=r(16),o=r(30),a=r(18),i=r(21),c=r(45),s=Object.assign;e.exports=!s||r(10)(function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach(function(e){t[e]=e}),7!=s({},e)[r]||Object.keys(s({},t)).join("")!=n})?function assign(e,t){for(var r=i(e),s=arguments.length,u=1,l=o.f,f=a.f;s>u;)for(var p,h=c(arguments[u++]),d=l?n(h).concat(l(h)):n(h),y=d.length,_=0;y>_;)f.call(h,p=d[_++])&&(r[p]=h[p]);return r}:s},function(e,t,r){var n=r(7),o=r(4),a=r(16);e.exports=r(5)?Object.defineProperties:function defineProperties(e,t){o(e);for(var r,i=a(t),c=i.length,s=0;c>s;)n.f(e,r=i[s++],t[r]);return e}},function(e,t,r){var n=r(11),o=r(48).f,a={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(e){try{return o(e)}catch(e){return i.slice()}};e.exports.f=function getOwnPropertyNames(e){return i&&"[object Window]"==a.call(e)?c(e):o(n(e))}},function(e,t,r){var n=r(9);e.exports=function(e,t,r){for(var o in t)r&&e[o]?e[o]=t[o]:n(e,o,t[o]);return e}},function(e,t,r){var n=r(6),o=r(4),a=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{n=r(13)(Function.call,r(47).f(Object.prototype,"__proto__").set,2),n(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function setPrototypeOf(e,r){return a(e,r),t?e.__proto__=r:n(e,r),e}}({},!1):void 0),check:a}},function(e,t,r){"use strict";var n=r(1),o=r(0),a=r(7),i=r(5),c=r(2)("species");e.exports=function(e){var t="function"==typeof o[e]?o[e]:n[e];i&&t&&!t[c]&&a.f(t,c,{configurable:!0,get:function(){return this}})}},function(e,t,r){var n=r(33),o=r(25);e.exports=function(e){return function(t,r){var a,i,c=o(t)+"",s=n(r),u=c.length;return s<0||s>=u?e?"":void 0:(a=c.charCodeAt(s),a<55296||a>56319||s+1===u||(i=c.charCodeAt(s+1))<56320||i>57343?e?c.charAt(s):a:e?c.slice(s,s+2):(a-55296<<10)+(i-56320)+65536)}}},function(e,t,r){var n=r(33),o=Math.max,a=Math.min;e.exports=function(e,t){return e=n(e),e<0?o(e+t,0):a(e,t)}},function(e,t,r){var n=r(1),o=n.navigator;e.exports=o&&o.userAgent||""},function(e,t,r){var n=r(42),o=r(2)("iterator"),a=r(14);e.exports=r(0).getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@iterator"]||a[n(e)]}},function(e,t,r){"use strict";var n=r(96),o=r(107),a=r(14),i=r(11);e.exports=r(46)(Array,"Array",function(e,t){this._t=i(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):"keys"==t?o(0,r):"values"==t?o(0,e[r]):o(0,[r,e[r]])},"values"),a.Arguments=a.Array,n("keys"),n("values"),n("entries")},function(e,t,r){var n=r(3);n(n.S+n.F,"Object",{assign:r(110)})},function(e,t,r){var n=r(3);n(n.S,"Object",{create:r(29)})},function(e,t,r){var n=r(3);n(n.S+n.F*!r(5),"Object",{defineProperty:r(7).f})},function(e,t,r){var n=r(21),o=r(49);r(51)("getPrototypeOf",function(){return function getPrototypeOf(e){return o(n(e))}})},function(e,t,r){var n=r(21),o=r(16);r(51)("keys",function(){return function keys(e){return o(n(e))}})},function(e,t,r){var n=r(3);n(n.S,"Object",{setPrototypeOf:r(114).set})},function(e,t,r){"use strict";var n,o,a,i,c=r(15),s=r(1),u=r(13),l=r(42),f=r(3),p=r(6),h=r(17),d=r(97),y=r(100),_=r(55),v=r(56).set,m=r(109)(),g=r(28),b=r(52),w=r(118),x=r(53),C="Promise",O=s.TypeError,S=s.process,j=S&&S.versions,k=j&&j.v8||"",P=s[C],M="process"==l(S),R=function(){},D=o=g.f,E=!!function(){try{var e=P.resolve(1),t=(e.constructor={})[r(2)("species")]=function(e){e(R,R)};return(M||"function"==typeof PromiseRejectionEvent)&&e.then(R)instanceof t&&0!==k.indexOf("6.6")&&w.indexOf("Chrome/66")===-1}catch(e){}}(),A=function(e){var t;return!(!p(e)||"function"!=typeof(t=e.then))&&t},L=function(e,t){if(!e._n){e._n=!0;var r=e._c;m(function(){for(var n=e._v,o=1==e._s,a=0,i=function(t){var r,a,i,c=o?t.ok:t.fail,s=t.resolve,u=t.reject,l=t.domain;try{c?(o||(2==e._h&&H(e),e._h=1),c===!0?r=n:(l&&l.enter(),r=c(n),l&&(l.exit(),i=!0)),r===t.promise?u(O("Promise-chain cycle")):(a=A(r))?a.call(r,s,u):s(r)):u(n)}catch(e){l&&!i&&l.exit(),u(e)}};r.length>a;)i(r[a++]);e._c=[],e._n=!1,t&&!e._h&&q(e)})}},q=function(e){v.call(s,function(){var t,r,n,o=e._v,a=T(e);if(a&&(t=b(function(){M?S.emit("unhandledRejection",o,e):(r=s.onunhandledrejection)?r({promise:e,reason:o}):(n=s.console)&&n.error&&n.error("Unhandled promise rejection",o)}),e._h=M||T(e)?2:1),e._a=void 0,a&&t.e)throw t.v})},T=function(e){return 1!==e._h&&0===(e._a||e._c).length},H=function(e){v.call(s,function(){var t;M?S.emit("rejectionHandled",e):(t=s.onrejectionhandled)&&t({promise:e,reason:e._v})})},F=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),L(t,!0))},I=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw O("Promise can't be resolved itself");(t=A(e))?m(function(){var n={_w:r,_d:!1};try{t.call(e,u(I,n,1),u(F,n,1))}catch(e){F.call(n,e)}}):(r._v=e,r._s=1,L(r,!1))}catch(e){F.call({_w:r,_d:!1},e)}}};E||(P=function Promise(e){d(this,P,C,"_h"),h(e),n.call(this);try{e(u(I,this,1),u(F,this,1))}catch(e){F.call(this,e)}},n=function Promise(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},n.prototype=r(113)(P.prototype,{then:function then(e,t){var r=D(_(this,P));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=M?S.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&L(this,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),a=function(){var e=new n;this.promise=e,this.resolve=u(I,e,1),this.reject=u(F,e,1)},g.f=D=function(e){return e===P||e===i?new a(e):o(e)}),f(f.G+f.W+f.F*!E,{Promise:P}),r(20)(P,C),r(115)(C),i=r(0)[C],f(f.S+f.F*!E,C,{reject:function reject(e){var t=D(this);return(0,t.reject)(e),t.promise}}),f(f.S+f.F*(c||!E),C,{resolve:function resolve(e){return x(c&&this===i?P:this,e)}}),f(f.S+f.F*!(E&&r(106)(function(e){P.all(e).catch(R)})),C,{all:function all(e){var t=this,r=D(t),n=r.resolve,o=r.reject,a=b(function(){var r=[],a=0,i=1;y(e,!1,function(e){var c=a++,s=!1;r.push(void 0),i++,t.resolve(e).then(function(e){s||(s=!0,r[c]=e,--i||n(r))},o)}),--i||n(r)});return a.e&&o(a.v),r.promise},race:function race(e){var t=this,r=D(t),n=r.reject,o=b(function(){y(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return o.e&&n(o.v),r.promise}})},function(e,t,r){"use strict";var n=r(1),o=r(8),a=r(5),i=r(3),c=r(54),s=r(108).KEY,u=r(10),l=r(32),f=r(20),p=r(22),h=r(2),d=r(36),y=r(35),_=r(99),v=r(103),m=r(4),g=r(6),b=r(11),w=r(34),x=r(19),C=r(29),O=r(112),S=r(47),j=r(7),k=r(16),P=S.f,M=j.f,R=O.f,D=n.Symbol,E=n.JSON,A=E&&E.stringify,L="prototype",q=h("_hidden"),T=h("toPrimitive"),H={}.propertyIsEnumerable,F=l("symbol-registry"),I=l("symbols"),B=l("op-symbols"),U=Object[L],N="function"==typeof D,z=n.QObject,V=!z||!z[L]||!z[L].findChild,G=a&&u(function(){return 7!=C(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=P(U,t);n&&delete U[t],M(e,t,r),n&&e!==U&&M(U,t,n)}:M,$=function(e){var t=I[e]=C(D[L]);return t._k=e,t},K=N&&"symbol"==typeof D.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof D},W=function defineProperty(e,t,r){return e===U&&W(B,t,r),m(e),t=w(t,!0),m(r),o(I,t)?(r.enumerable?(o(e,q)&&e[q][t]&&(e[q][t]=!1),r=C(r,{enumerable:x(0,!1)})):(o(e,q)||M(e,q,x(1,{})),e[q][t]=!0),G(e,t,r)):M(e,t,r)},J=function defineProperties(e,t){m(e);for(var r,n=_(t=b(t)),o=0,a=n.length;a>o;)W(e,r=n[o++],t[r]);return e},Y=function create(e,t){return void 0===t?C(e):J(C(e),t)},Z=function propertyIsEnumerable(e){var t=H.call(this,e=w(e,!0));return!(this===U&&o(I,e)&&!o(B,e))&&(!(t||!o(this,e)||!o(I,e)||o(this,q)&&this[q][e])||t)},X=function getOwnPropertyDescriptor(e,t){if(e=b(e),t=w(t,!0),e!==U||!o(I,t)||o(B,t)){var r=P(e,t);return!r||!o(I,t)||o(e,q)&&e[q][t]||(r.enumerable=!0),r}},Q=function getOwnPropertyNames(e){for(var t,r=R(b(e)),n=[],a=0;r.length>a;)o(I,t=r[a++])||t==q||t==s||n.push(t);return n},ee=function getOwnPropertySymbols(e){for(var t,r=e===U,n=R(r?B:b(e)),a=[],i=0;n.length>i;)!o(I,t=n[i++])||r&&!o(U,t)||a.push(I[t]);return a};N||(D=function Symbol(){if(this instanceof D)throw TypeError("Symbol is not a constructor!");var e=p(arguments.length>0?arguments[0]:void 0),t=function(r){this===U&&t.call(B,r),o(this,q)&&o(this[q],e)&&(this[q][e]=!1),G(this,e,x(1,r))};return a&&V&&G(U,e,{configurable:!0,set:t}),$(e)},c(D[L],"toString",function toString(){return this._k}),S.f=X,j.f=W,r(48).f=O.f=Q,r(18).f=Z,r(30).f=ee,a&&!r(15)&&c(U,"propertyIsEnumerable",Z,!0),d.f=function(e){return $(h(e))}),i(i.G+i.W+i.F*!N,{Symbol:D});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),re=0;te.length>re;)h(te[re++]);for(var ne=k(h.store),oe=0;ne.length>oe;)y(ne[oe++]);i(i.S+i.F*!N,"Symbol",{for:function(e){return o(F,e+="")?F[e]:F[e]=D(e)},keyFor:function keyFor(e){if(!K(e))throw TypeError(e+" is not a symbol!");for(var t in F)if(F[t]===e)return t},useSetter:function(){V=!0},useSimple:function(){V=!1}}),i(i.S+i.F*!N,"Object",{create:Y,defineProperty:W,defineProperties:J,getOwnPropertyDescriptor:X,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),E&&i(i.S+i.F*(!N||u(function(){var e=D();return"[null]"!=A([e])||"{}"!=A({a:e})||"{}"!=A(Object(e))})),"JSON",{stringify:function stringify(e){for(var t,r,n=[e],o=1;arguments.length>o;)n.push(arguments[o++]);if(r=t=n[1],(g(t)||void 0!==e)&&!K(e))return v(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!K(t))return t}),n[1]=t,A.apply(E,n)}}),D[L][T]||r(9)(D[L],T,D[L].valueOf),f(D,"Symbol"),f(Math,"Math",!0),f(n.JSON,"JSON",!0)},function(e,t,r){"use strict";var n=r(3),o=r(0),a=r(1),i=r(55),c=r(53);n(n.P+n.R,"Promise",{finally:function(e){var t=i(this,o.Promise||a.Promise),r="function"==typeof e;return this.then(r?function(r){return c(t,e()).then(function(){return r})}:e,r?function(r){return c(t,e()).then(function(){throw r})}:e)}})},function(e,t,r){"use strict";var n=r(3),o=r(28),a=r(52);n(n.S,"Promise",{try:function(e){var t=o.f(this),r=a(e);return(r.e?t.reject:t.resolve)(r.v),t.promise}})},function(e,t,r){r(35)("asyncIterator")},function(e,t,r){r(35)("observable")},function(e,t,r){(function(t){function getValue(e,t){return null==e?void 0:e[t]}function isHostObject(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}function Hash(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function hashClear(){this.__data__=E?E(null):{}}function hashDelete(e){return this.has(e)&&delete this.__data__[e]}function hashGet(e){var t=this.__data__;if(E){var r=t[e];return r===n?void 0:r}return j.call(t,e)?t[e]:void 0}function hashHas(e){var t=this.__data__;return E?void 0!==t[e]:j.call(t,e)}function hashSet(e,t){return this.__data__[e]=E&&void 0===t?n:t,this}function ListCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function listCacheClear(){this.__data__=[]}function listCacheDelete(e){var t=this.__data__,r=assocIndexOf(t,e);return!(r<0)&&(r==t.length-1?t.pop():R.call(t,r,1),!0)}function listCacheGet(e){var t=this.__data__,r=assocIndexOf(t,e);return r<0?void 0:t[r][1]}function listCacheHas(e){return assocIndexOf(this.__data__,e)>-1}function listCacheSet(e,t){var r=this.__data__,n=assocIndexOf(r,e);return n<0?r.push([e,t]):r[n][1]=t,this}function MapCache(e){var t=-1,r=e?e.length:0;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function mapCacheClear(){this.__data__={hash:new Hash,map:new(D||ListCache),string:new Hash}}function mapCacheDelete(e){return getMapData(this,e).delete(e)}function mapCacheGet(e){return getMapData(this,e).get(e)}function mapCacheHas(e){return getMapData(this,e).has(e)}function mapCacheSet(e,t){return getMapData(this,e).set(e,t),this}function assignValue(e,t,r){var n=e[t];j.call(e,t)&&eq(n,r)&&(void 0!==r||t in e)||(e[t]=r)}function assocIndexOf(e,t){for(var r=e.length;r--;)if(eq(e[r][0],t))return r;return-1}function baseIsNative(e){return!(!isObject(e)||isMasked(e))&&(isFunction(e)||isHostObject(e)?P:y).test(toSource(e))}function baseSet(e,t,r,n){if(!isObject(e))return e;t=isKey(t,e)?[t]:castPath(t);for(var o=-1,a=t.length,i=a-1,c=e;null!=c&&++o<a;){var s=toKey(t[o]),u=r;if(o!=i){var l=c[s];u=n?n(l,s,c):void 0,void 0===u&&(u=isObject(l)?l:isIndex(t[o+1])?[]:{})}assignValue(c,s,u),c=c[s]}return e}function baseToString(e){if("string"==typeof e)return e;if(isSymbol(e))return L?L.call(e):"";var t=e+"";return"0"==t&&1/e==-o?"-0":t}function castPath(e){return T(e)?e:q(e)}function getMapData(e,t){var r=e.__data__;return isKeyable(t)?r["string"==typeof t?"string":"hash"]:r.map}function getNative(e,t){var r=getValue(e,t);return baseIsNative(r)?r:void 0}function isIndex(e,t){return t=null==t?a:t,!!t&&("number"==typeof e||_.test(e))&&e>-1&&e%1==0&&e<t}function isKey(e,t){if(T(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!isSymbol(e))||(l.test(e)||!u.test(e)||null!=t&&e in Object(t))}function isKeyable(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}function isMasked(e){return!!O&&O in e}function toKey(e){if("string"==typeof e||isSymbol(e))return e;var t=e+"";return"0"==t&&1/e==-o?"-0":t}function toSource(e){if(null!=e){try{return S.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function memoize(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError(r);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i),i};return n.cache=new(memoize.Cache||MapCache),n}function eq(e,t){return e===t||e!==e&&t!==t}function isFunction(e){var t=isObject(e)?k.call(e):"";return t==i||t==c}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function isObjectLike(e){return!!e&&"object"==typeof e}function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&k.call(e)==s}function toString(e){return null==e?"":baseToString(e)}function set(e,t,r){return null==e?e:baseSet(e,t,r)}var r="Expected a function",n="__lodash_hash_undefined__",o=1/0,a=9007199254740991,i="[object Function]",c="[object GeneratorFunction]",s="[object Symbol]",u=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,l=/^\w*$/,f=/^\./,p=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,h=/[\\^$.*+?()[\]{}|]/g,d=/\\(\\)?/g,y=/^\[object .+?Constructor\]$/,_=/^(?:0|[1-9]\d*)$/,v="object"==typeof t&&t&&t.Object===Object&&t,m="object"==typeof self&&self&&self.Object===Object&&self,g=v||m||Function("return this")(),b=Array.prototype,w=Function.prototype,x=Object.prototype,C=g["__core-js_shared__"],O=function(){var e=/[^.]+$/.exec(C&&C.keys&&C.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),S=w.toString,j=x.hasOwnProperty,k=x.toString,P=RegExp("^"+S.call(j).replace(h,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),M=g.Symbol,R=b.splice,D=getNative(g,"Map"),E=getNative(Object,"create"),A=M?M.prototype:void 0,L=A?A.toString:void 0;Hash.prototype.clear=hashClear,Hash.prototype.delete=hashDelete,Hash.prototype.get=hashGet,Hash.prototype.has=hashHas,Hash.prototype.set=hashSet,ListCache.prototype.clear=listCacheClear,ListCache.prototype.delete=listCacheDelete,ListCache.prototype.get=listCacheGet,ListCache.prototype.has=listCacheHas,ListCache.prototype.set=listCacheSet,MapCache.prototype.clear=mapCacheClear,MapCache.prototype.delete=mapCacheDelete,MapCache.prototype.get=mapCacheGet,MapCache.prototype.has=mapCacheHas,MapCache.prototype.set=mapCacheSet;var q=memoize(function(e){e=toString(e);var t=[];return f.test(e)&&t.push(""),e.replace(p,function(e,r,n,o){t.push(n?o.replace(d,"$1"):r||e)}),t});memoize.Cache=MapCache;var T=Array.isArray;e.exports=set}).call(t,r(23))},function(e,t,r){var n,o;!function(a,i){n=i,o="function"==typeof n?n.call(t,r,t,e):n,!(void 0!==o&&(e.exports=o))}(this,function(){"use strict";function Cookie(e,t,r){return void 0===t?Cookie.get(e):void(null===t?Cookie.remove(e):Cookie.set(e,t,r))}function escapeRe(e){return e.replace(/[.*+?^$|[\](){}\\-]/g,"\\$&")}function convert(e){var t="";for(var r in e)if(e.hasOwnProperty(r)){if("expires"===r){var n=e[r];"object"!=typeof n&&(n+="number"==typeof n?"D":"",n=computeExpires(n)),e[r]=n.toUTCString()}if("secure"===r){e[r]&&(t+=";"+r);continue}t+=";"+r+"="+e[r]}return e.hasOwnProperty("path")||(t+=";path=/"),t}function computeExpires(e){var t=new Date,r=e.charAt(e.length-1),n=parseInt(e,10);switch(r){case"Y":t.setFullYear(t.getFullYear()+n);break;case"M":t.setMonth(t.getMonth()+n);break;case"D":t.setDate(t.getDate()+n);break;case"h":t.setHours(t.getHours()+n);break;case"m":t.setMinutes(t.getMinutes()+n);break;case"s":t.setSeconds(t.getSeconds()+n);break;default:t=new Date(e)}return t}return Cookie.enabled=function(){var e,t="__test_key";return document.cookie=t+"=1",e=!!document.cookie,e&&Cookie.remove(t),e},Cookie.get=function(e,t){if("string"!=typeof e||!e)return null;e="(?:^|; )"+escapeRe(e)+"(?:=([^;]*?))?(?:;|$)";var r=RegExp(e),n=r.exec(document.cookie);return null!==n?t?n[1]:decodeURIComponent(n[1]):null},Cookie.getRaw=function(e){return Cookie.get(e,!0)},Cookie.set=function(e,t,r,n){r!==!0&&(n=r,r=!1),n=convert(n?n:{});var o=e+"="+(r?t:encodeURIComponent(t))+n;document.cookie=o},Cookie.setRaw=function(e,t,r){Cookie.set(e,t,!0,r)},Cookie.remove=function(e){Cookie.set(e,"a",{expires:new Date})},Cookie})},function(e,t,r){r(65),r(64),r(62),e.exports=r(63)}]);
+ ]]>
+ </script>
+ <div id="banner-1x1-area"></div>
+ <script>
+ <![CDATA[
+ //chartbeat
+ var _sf_async_config = {};
+ _sf_async_config.sections = "esporte";
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+
+ //UOLTM - ads
+ document.querySelectorAll(".c-advertising__banner-area").forEach(function(ad){window.uolads.push({id:ad.id})});
+ window.uolads.push({id:"banner-1x1-area"});
+
+ //IVC
+ (function(p,l,o,w,i,n,g){if(!p[i]){p.GlobalIvcNamespace=p.GlobalIvcNamespace||[];
+ p.GlobalIvcNamespace.push(i);p[i]=function(){(p[i].q=p[i].q||[]).push(arguments)
+ };p[i].q=p[i].q||[];n=l.createElement(o);g=l.getElementsByTagName(o)[0];n.async=1;
+ n.src=w;g.parentNode.insertBefore(n,g)}}(window,document,"script","https://datpdpmej1fn2.cloudfront.net/ivc.js","ivc"));
+ window.ivc('newTracker', 'cf', 'ivccf.ivcbrasil.org.br', { idWeb: '125' });
+ window.ivc('trackPageView');
+
+ //chartbeat
+ var _sf_async_config = _sf_async_config || {};
+ _sf_async_config.uid = 50059;
+ _sf_async_config.domain = 'folha.com.br';
+ _sf_async_config.useCanonical = true;
+ _sf_async_config.authors = 'Folha';
+ (function(){
+ function loadChartbeat() {
+ window._sf_endpt=(new Date()).getTime();
+ var e = document.createElement('script');
+ e.setAttribute('language', 'javascript');
+ e.setAttribute('type', 'text/javascript');
+ e.setAttribute('src', 'https://static.chartbeat.com/js/chartbeat.js');
+ document.body.appendChild(e);
+ }
+ var oldonload = window.onload;
+ window.onload = (typeof window.onload != 'function') ?
+ loadChartbeat : function() { oldonload(); loadChartbeat(); };
+ })();
+
+ //UOLTM - clique - menu
+ (function(){document.querySelector("header .container button[data-c-sidebar-menu-btn]").addEventListener("click",function(){
+ window.UOLPD.Audience.countClick({category:'menulateral',action:'clique',label:'menu'});},false);})();
+ ]]>
+ </script>
+ <script src="//static.folha.uol.com.br/plugins/stats/1.0/stats.js"></script> <!--//-->
+
+ <script src="https://static.folha.uol.com.br/folha/js/push/firebase-init.js?2018082001"></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json
index 8405f6763..6eaca95a9 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "Author": "Written by Edward Wallace",
+ "Author": null,
"Direction": null,
"Excerpt": "Just when you think the marketing behind the film couldn't get any more amazing, they go and release a music video from the Deadpool 2 soundtrack starring Canadian singer Céline Dion.",
"Image": "http:\/\/www.fortressofsolitude.co.za\/wp-content\/uploads\/2018\/05\/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack.jpg",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html
index 5dc679145..fc178ad79 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/fortressofsolitude/expected.html
@@ -1 +1 @@
-<div id="primary"><div id="content" role="main"> <article id="post-116764"><p><span> <a href="http://www.fortressofsolitude.co.za/celine-dion-deadpool-2-soundtrack-ashes/" title="Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack"><img alt="Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack" height="400" sizes="(max-width: 750px) 100vw, 750px" src="http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-750x400.jpg" srcset="http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-750x400.jpg 750w, http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-24x14.jpg 24w" width="750"></img></a> </span></p><header></header><div><hr></hr><div><div><p><span>R</span>yan Reynolds never stops surprising fans with his <a href="http://www.fortressofsolitude.co.za/new-deadpool-2-trailer/">Deadpool</a>, a.k.a. the Merc with the Mouth, persona. Just when you think the marketing behind the film couldn’t get any more amazing, they go and release a music video from the <strong><em>Deadpool 2</em></strong> soundtrack starring Canadian singer Céline Dion. Yes, the one who sang the <em>Titanic</em> theme song. Your eyes do not deceive you.</p><center><blockquote data-lang="en"><p dir="ltr" lang="tl">Showtime, Mama. <a href="https://twitter.com/hashtag/EffortMaximal?src=hash&amp;ref_src=twsrc%5Etfw" rel="nofollow" target="_blank">#EffortMaximal</a> <a href="https://twitter.com/hashtag/Deadpool2?src=hash&amp;ref_src=twsrc%5Etfw" rel="nofollow" target="_blank">#Deadpool2</a> <a href="https://t.co/ZKLrucXJO4" rel="nofollow" target="_blank">pic.twitter.com/ZKLrucXJO4</a></p><p>— Ryan Reynolds (@VancityReynolds) <a href="https://twitter.com/VancityReynolds/status/992018849225695242?ref_src=twsrc%5Etfw" rel="nofollow" target="_blank">May 3, 2018</a></p></blockquote></center><p>“What’s left to say? These prayers ain’t working anymore. Every word shot down in flames. What’s left to do with these broken pieces on the floor? I’m losing my voice calling on you,” Dion croons in the video for “Ashes”. Near the end of it, the filthy, foul-mouthed <a href="http://www.fortressofsolitude.co.za/hilarious-deadpool-2-teaser-bob-ross/">Deadpool</a> shows up in a surprising twist mentioning that he should have gotten N’sync instead.</p><h3><strong><em>Deadpool 2</em></strong> opens in theatres on May 18.</h3></div></div></div><hr></hr></article></div></div> \ No newline at end of file
+<div id="primary" role="main"> <article id="post-116764"><p><span> <a href="http://www.fortressofsolitude.co.za/celine-dion-deadpool-2-soundtrack-ashes/" title="Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack"><img width="750" height="400" src="http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-750x400.jpg" alt="Céline Dion Belches Her Way Onto Deadpool 2's Soundtrack" srcset="http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-750x400.jpg 750w, http://www.fortressofsolitude.co.za/wp-content/uploads/2018/05/Céline-Dion-Belches-Her-Way-Onto-Deadpool-2s-Soundtrack-24x14.jpg 24w" sizes="(max-width: 750px) 100vw, 750px"></a> </span></p><div><hr><div><p><span>R</span>yan Reynolds never stops surprising fans with his <a href="http://www.fortressofsolitude.co.za/new-deadpool-2-trailer/">Deadpool</a>, a.k.a. the Merc with the Mouth, persona. Just when you think the marketing behind the film couldn’t get any more amazing, they go and release a music video from the <strong><em>Deadpool 2</em></strong> soundtrack starring Canadian singer Céline Dion. Yes, the one who sang the <em>Titanic</em> theme song. Your eyes do not deceive you.</p><center><blockquote data-lang="en"><p lang="tl" dir="ltr">Showtime, Mama. <a rel="nofollow" target="_blank" href="https://twitter.com/hashtag/EffortMaximal?src=hash&amp;ref_src=twsrc%5Etfw">#EffortMaximal</a> <a rel="nofollow" target="_blank" href="https://twitter.com/hashtag/Deadpool2?src=hash&amp;ref_src=twsrc%5Etfw">#Deadpool2</a> <a rel="nofollow" target="_blank" href="https://t.co/ZKLrucXJO4">pic.twitter.com/ZKLrucXJO4</a></p><p>— Ryan Reynolds (@VancityReynolds) <a rel="nofollow" target="_blank" href="https://twitter.com/VancityReynolds/status/992018849225695242?ref_src=twsrc%5Etfw">May 3, 2018</a></p></blockquote></center><p>“What’s left to say? These prayers ain’t working anymore. Every word shot down in flames. What’s left to do with these broken pieces on the floor? I’m losing my voice calling on you,” Dion croons in the video for “Ashes”. Near the end of it, the filthy, foul-mouthed <a href="http://www.fortressofsolitude.co.za/hilarious-deadpool-2-teaser-bob-ross/">Deadpool</a> shows up in a surprising twist mentioning that he should have gotten N’sync instead.</p><h3><strong><em>Deadpool 2</em></strong> opens in theatres on May 18.</h3></div></div><hr></article></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html
index 1b69754ff..119205b62 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/gmw/expected.html
@@ -6,7 +6,7 @@
<p>  翱翔于距地球数千公里的太空中,进入广袤漆黑的未知领域,是一项艰苦卓绝的工作。这让人感到巨大压力和极度恐慌。那么,为什么不能让宇航员来一杯“地球末日”鸡尾酒来放松一下?</p>
<p>  不幸的是,对于希望能喝上一杯的太空探险者,那些将他们送上太空的政府机构普遍禁止他们染指包括酒在内的含酒精饮料。</p>
<p>  但是,很快普通人都会有机会向人类“最终的边疆”出发——以平民化旅行的形式,去探索和殖民火星。确实,火星之旅将是一次令人感到痛苦的旅行,可能一去不复返并要几年时间才能完成,但是否应该允许参与者在旅程中痛饮一番?或至少携带能在火星上发酵自制酒精饮料的设备?</p>
- <p><img alt="(Credit: Nasa)" id="45395168" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e5929.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
+ <p><img id="45395168" alt="(Credit: Nasa)" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e5929.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></p>
<p>
<span face="楷体">  图注:巴兹?奥尔德林(Buzz Aldrin)可能是第二个在月球上行走的人,但他是第一个在月球上喝酒的人</span>
</p>
@@ -21,7 +21,7 @@
<p>  所以,如果酒精对人体的物理效应与海拔高度无关,那么在国际空间站上睡前小饮一杯不应该是一个大问题,对吧?错了。</p>
<p>  美国宇航局约翰逊航天中心发言人丹尼尔·霍特(Daniel Huot)表示:“国际空间站上的宇航员不允许喝酒。在国际空间站上,酒精和其它挥发性化合物的使用受到控制,因为它们的挥发物可能对该站的水回收系统产生影响。”</p>
<p>  为此,国际空间站上的宇航员甚至没有被提供含有酒精的产品,例如漱口水、香水或须后水。如果在国际空间站上饮酒狂欢,溢出的啤酒也可能存在损坏设备的风险。</p>
- <p><img alt="(Credit: iStock)" id="45395150" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592a.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
+ <p><img id="45395150" alt="(Credit: iStock)" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592a.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></p>
<p>
<span face="楷体">  图注:测试表明,有关人在高空中喝酒更容易醉的传言是不正确的</span>
</p>
@@ -40,7 +40,7 @@
<p>  因此,即使宇航员自己被禁止在地球轨道上饮酒,但他们正在做的工作可以提高在地上消费的酒的质量。</p>
<p>  相比之下,执行登陆火星任务的人将远离家乡几年,而不是几个月,因此可能会有人提出有关禁止饮酒的规定可以放松一些。</p>
<p>  然而,像戴夫?汉森这样的专家认为,继续禁止饮酒并没有什么害处。除了实际的安全问题,饮酒还可能有其它挑战。汉森认为,地球人存在许多社会文化方面的差异,而且人连续几年时间呆在一个狭小的空间里,很容易突然发怒,这些因素都使饮酒问题变得很棘手。</p>
- <p><img alt="(Credit: David Frohman/Peachstate Historical Consulting Inc)" id="45395153" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592d.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
+ <p><img id="45395153" alt="(Credit: David Frohman/Peachstate Historical Consulting Inc)" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592d.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"> </p>
<p>
<span face="楷体">  图注:奥尔德林的圣餐杯回到了地球上</span>
</p>
@@ -49,7 +49,7 @@
<p>  原标题:他晚于阿姆斯特朗登月 却是首个敢在月球喝酒的人</p>
<p><strong>  出品︱网易科学人栏目组 胖胖</strong></p>
<p><strong>  作者︱春春</strong>
- <a href="http://www.gmw.cn" target="_blank"><img src="https://img.gmw.cn/pic/content_logo.png" title="返回光明网首页"></img></a>
+ <a href="http://www.gmw.cn" target="_blank"><img src="https://img.gmw.cn/pic/content_logo.png" title="返回光明网首页"></a>
</p>
<p>[责任编辑:肖春芳]</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-metadata.json
new file mode 100644
index 000000000..41b1ff77f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Written by Rob Ewaschuk\n Edited by Betsy Beyer",
+ "Direction": null,
+ "Excerpt": "Google\u2019s SRE teams have some basic principles and best practices for building successful monitoring and alerting systems. This chapter offers guidelines for what issues should interrupt a human via a page, and how to deal with issues that aren\u2019t serious enough to trigger a page.",
+ "Image": null,
+ "Title": "Google - Site Reliability Engineering",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected.html
new file mode 100644
index 000000000..1461f276f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/expected.html
@@ -0,0 +1,458 @@
+<section data-type="chapter" id="maia-main" role="main">
+ <h2>
+ Monitoring Distributed Systems
+ </h2>
+
+ <p>
+ Google’s SRE teams have some basic principles and best practices for building successful monitoring and alerting systems. This chapter offers guidelines for what issues should interrupt a human via a page, and how to deal with issues that aren’t serious enough to trigger a page.
+ </p>
+ <section data-type="sect1" id="definitions-2ksZhN">
+ <h2>
+ Definitions
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="terminology" id="id-DnC1SWFMhD"></a>There’s no uniformly shared vocabulary for discussing all topics related to monitoring. Even within Google, usage of the following terms varies, but the most common interpretations are listed here.
+ </p>
+ <dl>
+
+ <dd>
+ <p>
+ Collecting, processing, aggregating, and displaying real-time quantitative data about a system, such as query counts and types, error counts and types, processing times, and server lifetimes.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="white-box monitoring" id="id-9nCjSDS4tZILhX"></a>Monitoring based on metrics exposed by the internals of the system, including logs, interfaces like the Java Virtual Machine Profiling Interface, or an HTTP handler that emits internal statistics.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="black-box monitoring" id="id-zdCxSrSgTWIdhb"></a>Testing externally visible behavior as a user would see it.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="dashboards" data-secondary="defined" id="id-VMCPS2SribIkh4"></a>An application (usually web-based) that provides a summary view of a service’s core metrics. A dashboard may have filters, selectors, and so on, but is prebuilt to expose the metrics most important to its users. The dashboard might also display team information such as ticket queue length, a list of high-priority bugs, the current on-call engineer for a given area of responsibility, or recent pushes.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="alerts" data-secondary="defined" id="id-wqC7SvSPUAIVhQ"></a>A notification intended to be read by a human and that is pushed to a system such as a bug or ticket queue, an email alias, or a pager. Respectively, these alerts are classified as <em>tickets</em>, <em>email alerts</em>,<sup><a data-type="noteref" id="id-LvQuvtYS7UvI8h4-marker" href="#id-LvQuvtYS7UvI8h4">22</a></sup> and <em>pages</em>.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="root cause" data-secondary="defined" id="id-PnCpSaSKsgIjho"></a>A defect in a software or human system that, if repaired, instills confidence that this event won’t happen again in the same way. A given incident might have multiple root causes: for example, perhaps it was caused by a combination of insufficient process automation, software that crashed on bogus input, <em>and</em> insufficient testing of the script used to generate the configuration. Each of these factors might stand alone as a root cause, and each should be repaired.
+ </p>
+ </dd>
+ <dt id="node-and-machine">
+ Node and machine
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="machines" data-secondary="defined" id="id-XmC9SkSlfnI1hK"></a>Used interchangeably to indicate a single instance of a running kernel in either a physical server, virtual machine, or container. There might be multiple <em>services</em> worth monitoring on a single machine. The services may either be:
+ </p>
+ <ul>
+ <li>Related to each other: for example, a caching server and a web server
+ </li>
+ <li>Unrelated services sharing hardware: for example, a code repository and a master for a configuration system like <a href="https://puppetlabs.com/puppet/puppet-open-source" target="_blank">Puppet</a> or <a href="https://www.chef.io/chef/" target="_blank">Chef</a>
+ </li>
+ </ul>
+ </dd>
+
+ <dd>
+ <p>
+ Any change to a service’s running software or its configuration.
+ </p>
+ </dd>
+ </dl>
+ </section>
+ <section data-type="sect1" id="why-monitor-pWsBTZ">
+ <h2>
+ Why Monitor?
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="benefits of monitoring" id="id-kVCkSpFnTl"></a>There are many reasons to monitor a system, including:
+ </p>
+ <dl>
+
+ <dd>
+ <p>
+ How big is my database and how fast is it growing? How quickly is my daily-active user count growing?
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ Are queries faster with Acme Bucket of Bytes 2.72 versus Ajax DB 3.14? How much better is my memcache hit rate with an extra node? Is my site slower than it was last week?
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ Something is broken, and somebody needs to fix it right now! Or, something might break soon, so somebody should look soon.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="dashboards" data-secondary="benefits of" id="id-rjCXSOS0iDIGT8"></a>Dashboards should answer basic questions about your service, and normally include some form of the four golden signals (discussed in <a data-type="xref" href="#xref_monitoring_golden-signals">The Four Golden Signals</a>).
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ Our latency just shot up; what else happened around the same time?
+ </p>
+ </dd>
+ </dl>
+ <p>
+ System monitoring is also helpful in supplying raw input into business analytics and in facilitating analysis of security breaches. Because this book focuses on the engineering domains in which SRE has particular expertise, we won’t discuss these applications of monitoring here.
+ </p>
+ <p>
+ Monitoring and alerting enables a system to tell us when it’s broken, or perhaps to tell us what’s about to break. When the system isn’t able to automatically fix itself, we want a human to investigate the alert, determine if there’s a real problem at hand, mitigate the problem, and determine the root cause of the problem. Unless you’re performing security auditing on very narrowly scoped components of a system, you should never trigger an alert simply because "something seems a bit weird."
+ </p>
+ <p>
+ Paging a human is a quite expensive use of an employee’s time. If an employee is at work, a page interrupts their workflow. If the employee is at home, a page interrupts their personal time, and perhaps even their sleep. When pages occur too frequently, employees second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a "real" page that’s masked by the noise. Outages can be prolonged because other noise interferes with a rapid diagnosis and fix. Effective alerting systems have good signal and very low noise.
+ </p>
+ </section>
+ <section data-type="sect1" id="setting-reasonable-expectations-for-monitoring-o8svcM">
+ <h2>
+ Setting Reasonable Expectations for Monitoring
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="setting expectations for" id="id-4nCqSYFQcE"></a>Monitoring a complex application is a significant engineering endeavor in and of itself. Even with substantial existing infrastructure for instrumentation, collection, display, and alerting in place, a Google SRE team with 10–12 members typically has one or sometimes two members whose primary assignment is to build and maintain monitoring systems for their service. This number has decreased over time as we generalize and centralize common monitoring infrastructure, but every SRE team typically has at least one “monitoring person.” (That being said, while it can be fun to have access to traffic graph dashboards and the like, SRE teams carefully avoid any situation that requires someone to “stare at a screen to watch for problems.”)
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="post hoc analysis" id="id-JnCDSjIVcG"></a>In general, Google has trended toward simpler and faster monitoring systems, with better tools for <em>post hoc</em> analysis. We avoid "magic" systems that try to learn thresholds or automatically detect causality. Rules that detect unexpected changes in end-user request rates are one counterexample; while these rules are still kept as simple as possible, they give a very quick detection of a very simple, specific, severe anomaly. Other uses of monitoring data such as capacity planning and traffic prediction can tolerate more fragility, and thus, more complexity. Observational experiments conducted over a very long time horizon (months or years) with a low sampling rate (hours or days) can also often tolerate more fragility because occasional missed samples won’t hide a long-running trend.
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="dependency hierarchies" id="id-9nCjSOtmcj"></a>Google SRE has experienced only limited success with complex dependency hierarchies. We seldom use rules such as, "If I know the database is slow, alert for a slow database; otherwise, alert for the website being generally slow." Dependency-reliant rules usually pertain to very stable parts of our system, such as our system for draining user traffic away from a datacenter. For example, "If a datacenter is drained, then don’t alert me on its latency" is one common datacenter alerting rule. Few teams at Google maintain complex dependency hierarchies because our infrastructure has a steady rate of continuous refactoring.
+ </p>
+ <p>
+ Some of the ideas described in this chapter are still aspirational: there is always room to move more rapidly from symptom to root cause(s), especially in ever-changing systems. So while this chapter sets out some goals for monitoring systems, and some ways to achieve these goals, it’s important that monitoring systems—especially the critical path from the onset of a production problem, through a page to a human, through basic triage and deep debugging—be kept simple and comprehensible by everyone on the team.
+ </p>
+ <p>
+ Similarly, to keep noise low and signal high, the elements of your monitoring system that direct to a pager need to be very simple and robust. Rules that generate alerts for humans should be simple to understand and represent a clear failure.
+ </p>
+ </section>
+ <section data-type="sect1" id="symptoms-versus-causes-g0sEi4">
+ <h2>
+ Symptoms Versus Causes
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="symptoms vs. causes" id="id-JnCDSlFmiG"></a>Your monitoring system should address two questions: what’s broken, and why?
+ </p>
+ <p>
+ The "what’s broken" indicates the symptom; the "why" indicates a (possibly intermediate) cause. <a data-type="xref" href="#table_monitoring_symptoms">Table 6-1</a> lists some hypothetical symptoms and corresponding causes.
+ </p>
+ <table id="table_monitoring_symptoms" readabilityDataTable="1">
+ <caption>
+ <span>Table 6-1.</span> Example symptoms and causes
+ </caption>
+ <thead>
+ <tr>
+ <th>
+ <strong>Symptom</strong>
+ </th>
+ <th>
+ <strong>Cause</strong>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p>
+ <strong>I’m serving HTTP 500s or 404s</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ Database servers are refusing connections
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>My responses are slow</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ CPUs are overloaded by a bogosort, or an Ethernet cable is crimped under a rack, visible as partial packet loss
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>Users in Antarctica aren’t receiving animated cat GIFs</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ Your Content Distribution Network hates scientists and felines, and thus blacklisted some client IPs
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>Private content is world-readable</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ A new software push caused ACLs to be forgotten and allowed all requests
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ "What" versus "why" is one of the most important distinctions in writing good monitoring with maximum signal and minimum noise.
+ </p>
+ </section>
+ <section data-type="sect1" id="black-box-versus-white-box-q8sJuw">
+ <h2>
+ Black-Box Versus White-Box
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="blackbox vs. whitebox" id="id-9nCjSvFVuj"></a><a data-type="indexterm" data-primary="white-box monitoring" id="id-ZbC1FMFEu7"></a><a data-type="indexterm" data-primary="black-box monitoring" id="id-zdCXIGFvuy"></a>We combine heavy use of white-box monitoring with modest but critical uses of black-box monitoring. The simplest way to think about black-box monitoring versus white-box monitoring is that black-box monitoring is symptom-oriented and represents active—not predicted—problems: "The system isn’t working correctly, right now." White-box monitoring depends on the ability to inspect the innards of the system, such as logs or HTTP endpoints, with instrumentation. White-box monitoring therefore allows detection of imminent problems, failures masked by retries, and so forth.
+ </p>
+ <p>
+ Note that in a multilayered system, one person’s symptom is another person’s cause. For example, suppose that a database’s performance is slow. Slow database reads are a symptom for the database SRE who detects them. However, for the frontend SRE observing a slow website, the same slow database reads are a cause. Therefore, white-box monitoring is sometimes symptom-oriented, and sometimes cause-oriented, depending on just how informative your white-box is.
+ </p>
+ <p>
+ When collecting telemetry for debugging, white-box monitoring is essential. If web servers seem slow on database-heavy requests, you need to know both how fast the web server perceives the database to be, and how fast the database believes itself to be. Otherwise, you can’t distinguish an actually slow database server from a network problem between your web server and your database.
+ </p>
+ <p>
+ For paging, black-box monitoring has the key benefit of forcing discipline to only nag a human when a problem is both already ongoing and contributing to real symptoms. On the other hand, for not-yet-occurring but imminent problems, black-box monitoring is fairly useless.
+ </p>
+ </section>
+ <section data-type="sect1" id="xref_monitoring_golden-signals">
+ <h2>
+ The Four Golden Signals
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="four golden signals of" id="id-ZbCxSMFjU7"></a>The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four.
+ </p>
+ <dl>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="service latency" data-secondary="monitoring for" id="id-yYCASJS9FKIWUb"></a><a data-type="indexterm" data-primary="latency" data-secondary="monitoring for" id="id-VMCpF2SXFbIwU4"></a><a data-type="indexterm" data-primary="request latency" id="id-rjCeIOSKFDIaU8"></a><a data-type="indexterm" data-primary="user requests" data-secondary="request latency monitoring" id="id-wqCDtvSGFAIMUQ"></a>The time it takes to service a request. It’s important to distinguish between the latency of successful requests and the latency of failed requests. For example, an HTTP 500 error triggered due to loss of connection to a database or other critical backend might be served very quickly; however, as an HTTP 500 error indicates a failed request, factoring 500s into your overall latency might result in misleading calculations. On the other hand, a slow error is even worse than a fast error! Therefore, it’s important to track error latency, as opposed to just filtering out errors.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="user requests" data-secondary="traffic analysis" id="id-rjCXSOSxtDIaU8"></a><a data-type="indexterm" data-primary="traffic analysis" id="id-wqC4FvSBtAIMUQ"></a>A measure of how much demand is being placed on your system, measured in a high-level system-specific metric. For a web service, this measurement is usually HTTP requests per second, perhaps broken out by the nature of the requests (e.g., static versus dynamic content). For an audio streaming system, this measurement might focus on network I/O rate or concurrent sessions. For a key-value storage system, this measurement might be transactions and retrievals per <span>second</span>.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="error rates" id="id-x1C4SjSlTLIMUJ"></a><a data-type="indexterm" data-primary="user requests" data-secondary="monitoring failures" id="id-PnCxFaS0TgIVUo"></a>The rate of requests that fail, either explicitly (e.g., HTTP 500s), implicitly (for example, an HTTP 200 success response, but coupled with the wrong content), or by policy (for example, "If you committed to one-second response times, any request over one second is an error"). Where protocol response codes are insufficient to express all failure conditions, secondary (internal) protocols may be necessary to track partial failure modes. Monitoring these cases can be drastically different: catching HTTP 500s at your load balancer can do a decent job of catching all completely failed requests, while only end-to-end system tests can detect that you’re serving the wrong content.
+ </p>
+ </dd>
+
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="saturation" id="id-OnCNS2S4iDIYU8"></a>How "full" your service is. A measure of your system fraction, emphasizing the resources that are most constrained (e.g., in a memory-constrained system, show memory; in an I/O-constrained system, show I/O). Note that many systems degrade in performance before they achieve 100% utilization, so having a utilization target is essential.
+ </p>
+ <p>
+ In complex systems, saturation can be supplemented with higher-level load measurement: can your service properly handle double the traffic, handle only 10% more traffic, or handle even less traffic than it currently receives? For very simple services that have no parameters that alter the complexity of the request (e.g., "Give me a nonce" or "I need a globally unique monotonic integer") that rarely change configuration, a static value from a load test might be adequate. As discussed in the previous paragraph, however, most services need to use indirect signals like CPU utilization or network bandwidth that have a known upper bound. Latency increases are often a leading indicator of saturation. Measuring your 99th percentile response time over some small window (e.g., one minute) can give a very early signal of saturation.
+ </p>
+ <p>
+ Finally, saturation is also concerned with predictions of impending saturation, such as "It looks like your database will fill its hard drive in 4 hours."
+ </p>
+ </dd>
+ </dl>
+ <p>
+ If you measure all four golden signals and page a human when one signal is problematic (or, in the case of saturation, nearly problematic), your service will be at least decently covered by monitoring.
+ </p>
+ </section>
+ <section data-type="sect1" id="worrying-about-your-tail-or-instrumentation-and-performance-Yms9Ck">
+ <h2>
+ Worrying About Your Tail (or, Instrumentation and Performance)
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="instrumentation and performance" id="id-zdCxSGFQCy"></a><a data-type="indexterm" data-primary="performance" data-secondary="monitoring" id="id-yYCyFpFdCr"></a>When building a monitoring system from scratch, it’s tempting to design a system based upon the mean of some quantity: the mean latency, the mean CPU usage of your nodes, or the mean fullness of your databases. The danger presented by the latter two cases is obvious: CPUs and databases can easily be utilized in a very imbalanced way. The same holds for latency. If you run a web service with an average latency of 100 ms at 1,000 requests per second, 1% of requests might easily take 5 seconds.<sup><a data-type="noteref" id="id-QQLuAIXFxCz-marker" href="#id-QQLuAIXFxCz">23</a></sup> If your users depend on several such web services to render their page, the 99th percentile of one backend can easily become the median response of your <span>frontend</span>.
+ </p>
+ <p>
+ The simplest way to differentiate between a slow average and a very slow "tail" of requests is to collect request counts bucketed by latencies (suitable for rendering a histogram), rather than actual latencies: how many requests did I serve that took between 0 ms and 10 ms, between 10 ms and 30 ms, between 30 ms and 100 ms, between 100 ms and 300 ms, and so on? Distributing the histogram boundaries approximately exponentially (in this case by factors of roughly 3) is often an easy way to visualize the distribution of your requests.
+ </p>
+ </section>
+ <section data-type="sect1" id="choosing-an-appropriate-resolution-for-measurements-vJsBsE">
+ <h2>
+ Choosing an Appropriate Resolution for Measurements
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="resolution" id="id-yYCASpFxsr"></a>Different aspects of a system should be measured with different levels of granularity. For example:
+ </p>
+ <ul>
+ <li>Observing CPU load over the time span of a minute won’t reveal even quite long-lived spikes that drive high tail latencies.
+ </li>
+ <li>On the other hand, for a web service targeting no more than 9 hours aggregate downtime per year (99.9% annual uptime), probing for a 200 (success) status more than once or twice a minute is probably unnecessarily frequent.
+ </li>
+ <li>Similarly, checking hard drive fullness for a service targeting 99.9% availability more than once every 1–2 minutes is probably unnecessary.
+ </li>
+ </ul>
+ <p>
+ Take care in how you structure the granularity of your measurements. Collecting per-second measurements of CPU load might yield interesting data, but such frequent measurements may be very expensive to collect, store, and analyze. If your monitoring goal calls for high resolution but doesn’t require extremely low latency, you can reduce these costs by performing internal sampling on the server, then configuring an external system to collect and aggregate that distribution over time or across servers. You might:
+ </p>
+ <ol>
+ <li>Record the current CPU utilization each second.
+ </li>
+ <li>Using buckets of 5% granularity, increment the appropriate CPU utilization bucket each second.
+ </li>
+ <li>Aggregate those values every minute.
+ </li>
+ </ol>
+ <p>
+ This strategy allows you to observe brief CPU hotspots without incurring very high cost due to collection and retention.
+ </p>
+ </section>
+ <section data-type="sect1" id="as-simple-as-possible-no-simpler-lqskHx">
+ <h2>
+ As Simple as Possible, No Simpler
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="avoiding complexity in" id="id-VMCPSrFpHm"></a>Piling all these requirements on top of each other can add up to a very complex monitoring system—your system might end up with the following levels of complexity:
+ </p>
+ <ul>
+ <li>Alerts on different latency thresholds, at different percentiles, on all kinds of different metrics
+ </li>
+ <li>Extra code to detect and expose possible causes
+ </li>
+ <li>Associated dashboards for each of these possible causes
+ </li>
+ </ul>
+ <p>
+ The sources of potential complexity are never-ending. Like all software systems, monitoring can become so complex that it’s fragile, complicated to change, and a maintenance burden.
+ </p>
+ <p>
+ Therefore, design your monitoring system with an eye toward simplicity. In choosing what to monitor, keep the following guidelines in mind:
+ </p>
+ <ul>
+ <li>The rules that catch real incidents most often should be as simple, predictable, and reliable as possible.
+ </li>
+ <li>Data collection, aggregation, and alerting configuration that is rarely exercised (e.g., less than once a quarter for some SRE teams) should be up for removal.
+ </li>
+ <li>Signals that are collected, but not exposed in any prebaked dashboard nor used by any alert, are candidates for removal.
+ </li>
+ </ul>
+ <p>
+ In Google’s experience, basic collection and aggregation of metrics, paired with alerting and dashboards, has worked well as a relatively standalone system. (In fact Google’s monitoring system is broken up into several binaries, but typically people learn about all aspects of these binaries.) It can be tempting to combine monitoring with other aspects of inspecting complex systems, such as detailed system profiling, single-process debugging, tracking details about exceptions or crashes, load testing, log collection and analysis, or traffic inspection. While most of these subjects share commonalities with basic monitoring, blending together too many results in overly complex and fragile systems. As in many other aspects of software engineering, maintaining distinct systems with clear, simple, loosely coupled points of integration is a better strategy (for example, using web APIs for pulling summary data in a format that can remain constant over an extended period of time).
+ </p>
+ </section>
+ <section data-type="sect1" id="tying-these-principles-together-nqsJfw">
+ <h2>
+ Tying These Principles Together
+ </h2>
+ <p>
+ The principles discussed in this chapter can be tied together into a philosophy on monitoring and alerting that’s widely endorsed and followed within Google SRE teams. While this monitoring philosophy is a bit aspirational, it’s a good starting point for writing or reviewing a new alert, and it can help your organization ask the right questions, regardless of the size of your organization or the complexity of your service or system.
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="creating rules for" id="id-wqC7SDIvfj"></a>When creating rules for monitoring and alerting, asking the following questions can help you avoid false positives and pager burnout:<sup><a data-type="noteref" id="id-a82udF8IBfx-marker" href="#id-a82udF8IBfx">24</a></sup>
+ </p>
+ <ul>
+ <li>Does this rule detect <em>an otherwise undetected condition</em> that is urgent, actionable, and actively or imminently user-visible?<sup><a data-type="noteref" id="id-0vYuEFpSjSMtLfG-marker" href="#id-0vYuEFpSjSMtLfG">25</a></sup>
+ </li>
+ <li>Will I ever be able to ignore this alert, knowing it’s benign? When and why will I be able to ignore this alert, and how can I avoid this scenario?
+ </li>
+ <li>Does this alert definitely indicate that users are being negatively affected? Are there detectable cases in which users aren’t being negatively impacted, such as drained traffic or test deployments, that should be filtered out?
+ </li>
+ <li>Can I take action in response to this alert? Is that action urgent, or could it wait until morning? Could the action be safely automated? Will that action be a long-term fix, or just a short-term workaround?
+ </li>
+ <li>Are other people getting paged for this issue, therefore rendering at least one of the pages unnecessary?
+ </li>
+ </ul>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="monitoring philosophy" id="id-PnCpSwhJfa"></a>These questions reflect a fundamental philosophy on pages and pagers:
+ </p>
+ <ul>
+ <li>Every time the pager goes off, I should be able to react with a sense of urgency. I can only react with a sense of urgency a few times a day before I become fatigued.
+ </li>
+ <li>Every page should be actionable.
+ </li>
+ <li>Every page response should require intelligence. If a page merely merits a robotic response, it shouldn’t be a page.
+ </li>
+ <li>Pages should be about a novel problem or an event that hasn’t been seen before.
+ </li>
+ </ul>
+ <p>
+ Such a perspective dissipates certain distinctions: if a page satisfies the preceding four bullets, it’s irrelevant whether the page is triggered by white-box or black-box monitoring. This perspective also amplifies certain distinctions: it’s better to spend much more effort on catching symptoms than causes; when it comes to causes, only worry about very definite, very imminent causes.
+ </p>
+ </section>
+ <section data-type="sect1" id="monitoring-for-the-long-term-NbsNS8">
+ <h2>
+ Monitoring for the Long Term
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="challenges of" id="id-wqC7SPFMSj"></a>In modern production systems, monitoring systems track an ever-evolving system with changing software architecture, load characteristics, and performance targets. An alert that’s currently exceptionally rare and hard to automate might become frequent, perhaps even meriting a hacked-together script to resolve it. At this point, someone should find and eliminate the root causes of the problem; if such resolution isn’t possible, the alert response deserves to be fully automated.
+ </p>
+ <p>
+ It’s important that decisions about monitoring be made with long-term goals in mind. Every page that happens today distracts a human from improving the system for tomorrow, so there is often a case for taking a short-term hit to availability or performance in order to improve the long-term outlook for the system. Let’s take a look at two case studies that illustrate this trade-off.
+ </p>
+ <section data-type="sect2" id="bigtable-sre-a-tale-of-over-alerting-dbsXtjSM">
+
+ <p>
+ <a data-type="indexterm" id="MDSbig6" data-primary="monitoring distributed systems" data-secondary="case studies"></a><a data-type="indexterm" data-primary="Bigtable" id="id-XmCpFOFytySv"></a>Google’s internal infrastructure is typically offered and measured against a service level objective (SLO; see <a data-type="xref" href="http://fakehost/sre/sre-book/chapters/service-level-objectives">Service Level Objectives</a>). Many years ago, the Bigtable service’s SLO was based on a synthetic well-behaved client’s mean performance. Because of problems in Bigtable and lower layers of the storage stack, the mean performance was driven by a "large" tail: the worst 5% of requests were often significantly slower than the rest.
+ </p>
+ <p>
+ Email alerts were triggered as the SLO approached, and paging alerts were triggered when the SLO was exceeded. Both types of alerts were firing voluminously, consuming unacceptable amounts of engineering time: the team spent significant amounts of time triaging the alerts to find the few that were really actionable, and we often missed the problems that actually affected users, because so few of them did. Many of the pages were non-urgent, due to well-understood problems in the infrastructure, and had either rote responses or received no response.
+ </p>
+ <p>
+ To remedy the situation, the team used a three-pronged approach: while making great efforts to improve the performance of Bigtable, we also temporarily dialed back our SLO target, using the 75th percentile request latency. We also disabled email alerts, as there were so many that spending time diagnosing them was infeasible.
+ </p>
+ <p>
+ This strategy gave us enough breathing room to actually fix the longer-term problems in Bigtable and the lower layers of the storage stack, rather than constantly fixing tactical problems. On-call engineers could actually accomplish work when they weren’t being kept up by pages at all hours. Ultimately, temporarily backing off on our alerts allowed us to make faster progress toward a better service.
+ </p>
+ </section>
+ <section data-type="sect2" id="gmail-predictable-scriptable-responses-from-humans-BVs1h4SD">
+
+ <p>
+ <a data-type="indexterm" data-primary="Gmail" id="id-XmC9SOFZhySv"></a>In the very early days of Gmail, the service was built on a retrofitted distributed process management system called Workqueue, which was originally created for batch processing of pieces of the search index. Workqueue was "adapted" to long-lived processes and subsequently applied to Gmail, but certain bugs in the relatively opaque codebase in the scheduler proved hard to beat.
+ </p>
+ <p>
+ At that time, the Gmail monitoring was structured such that alerts fired when individual tasks were “de-scheduled” by Workqueue. This setup was less than ideal because even at that time, Gmail had many, many thousands of tasks, each task representing a fraction of a percent of our users. We cared deeply about providing a good user experience for Gmail users, but such an alerting setup was unmaintainable.
+ </p>
+ <p>
+ To address this problem, Gmail SRE built a tool that helped “poke” the scheduler in just the right way to minimize impact to users. The team had several discussions about whether or not we should simply automate the entire loop from detecting the problem to nudging the rescheduler, until a better long-term solution was achieved, but some worried this kind of workaround would delay a real fix.
+ </p>
+ <p>
+ This kind of tension is common within a team, and often reflects an underlying mistrust of the team’s self-discipline: while some team members want to implement a “hack” to allow time for a proper fix, others worry that a hack will be forgotten or that the proper fix will be deprioritized indefinitely. This concern is credible, as it’s easy to build layers of unmaintainable technical debt by patching over problems instead of making real fixes. Managers and technical leaders play a key role in implementing true, long-term fixes by supporting and prioritizing potentially time-consuming long-term fixes even when the initial “pain” of paging subsides.
+ </p>
+ <p>
+ Pages with rote, algorithmic responses should be a red flag. Unwillingness on the part of your team to automate such pages implies that the team lacks confidence that they can clean up their technical debt. This is a major problem worth escalating.<a data-type="indexterm" data-primary data-startref="MDSbig6" id="id-oPCASqT2hLSk"></a>
+ </p>
+ </section>
+ <section data-type="sect2" id="the-long-run-MQsWTMS7">
+
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="short- vs. long-term availability" id="id-jyCxSoFETNSd"></a>A common theme connects the previous examples of Bigtable and Gmail: a tension between short-term and long-term availability. Often, sheer force of effort can help a rickety system achieve high availability, but this path is usually short-lived and fraught with burnout and dependence on a small number of heroic team members. Taking a controlled, short-term decrease in availability is often a painful, but strategic trade for the long-run stability of the system. It’s important not to think of every page as an event in isolation, but to consider whether the overall <em>level</em> of paging leads toward a healthy, appropriately available system with a healthy, viable team and long-term outlook. We review statistics about page frequency (usually expressed as incidents per shift, where an incident might be composed of a few related pages) in quarterly reports with management, ensuring that decision makers are kept up to date on the pager load and overall health of their teams.
+ </p>
+ </section>
+ </section>
+ <section data-type="sect1" id="conclusion-8ksvFj">
+ <h2>
+ Conclusion
+ </h2>
+ <p>
+ A healthy monitoring and alerting pipeline is simple and easy to reason about. It focuses primarily on symptoms for paging, reserving cause-oriented heuristics to serve as aids to debugging problems. Monitoring symptoms is easier the further "up" your stack you monitor, though monitoring saturation and performance of subsystems such as databases often must be performed directly on the subsystem itself. Email alerts are of very limited value and tend to easily become overrun with noise; instead, you should favor a dashboard that monitors all ongoing subcritical problems for the sort of information that typically ends up in email alerts. A dashboard might also be paired with a log, in order to analyze historical correlations.
+ </p>
+ <p>
+ Over the long haul, achieving a successful on-call rotation and product includes choosing to alert on symptoms or imminent real problems, adapting your targets to goals that are actually achievable, and making sure that your monitoring supports rapid diagnosis.
+ </p>
+ </section>
+
+ </section> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/source.html
new file mode 100644
index 000000000..6fb202427
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/google-sre-book-1/source.html
@@ -0,0 +1,742 @@
+<!DOCTYPE html>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta content="initial-scale=1, minimum-scale=1, width=device-width" name="viewport" />
+ <title>
+ Google - Site Reliability Engineering
+ </title>
+ <meta name="referrer" content="no-referrer" />
+ <link rel="apple-touch-icon-precomposed" sizes="180x180" href="https://lh3.googleusercontent.com/Yf2DCX8RKda6r4Jml9DLMByS2zQCBFs3kQpvBfN8UgIh4YVWIYSYIQOoTxJriyuM26cT5PDjyEb5aynDQ0Xyz46yHKnfg8JlUbDW" />
+ <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700|Material+Icons" />
+ <link rel="icon" type="image/png" sizes="32x32" href="https://lh3.googleusercontent.com/Yf2DCX8RKda6r4Jml9DLMByS2zQCBFs3kQpvBfN8UgIh4YVWIYSYIQOoTxJriyuM26cT5PDjyEb5aynDQ0Xyz46yHKnfg8JlUbDW" />
+ <link rel="icon" type="image/png" sizes="16x16" href="https://lh3.googleusercontent.com/Yf2DCX8RKda6r4Jml9DLMByS2zQCBFs3kQpvBfN8UgIh4YVWIYSYIQOoTxJriyuM26cT5PDjyEb5aynDQ0Xyz46yHKnfg8JlUbDW" />
+ <link rel="shortcut icon" href="https://lh3.googleusercontent.com/Yf2DCX8RKda6r4Jml9DLMByS2zQCBFs3kQpvBfN8UgIh4YVWIYSYIQOoTxJriyuM26cT5PDjyEb5aynDQ0Xyz46yHKnfg8JlUbDW" />
+ <link href="/sre/sre-book/static/css/index.min.css?cache=0ffc48d" rel="stylesheet" />
+ <script>
+ <![CDATA[
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+ ga('create', 'UA-75468017-1', 'auto');
+ ga('send', 'pageview');
+ ]]>
+ </script>
+ <script src="/sre/sre-book/static/js/detect.min.js?cache=4cb778b"></script>
+ </head>
+ <body>
+ <main>
+ <div ng-controller="HeaderCtrl as headerCtrl">
+ <div id="curtain" class="menu-closed"></div>
+ <div class="header clearfix">
+ <a id="burger-menu" class="expand"></a>
+ <h2 class="chapter-title">
+ Chapter 6 - Monitoring Distributed Systems
+ </h2>
+ </div>
+ <div id="overlay-element" class="expands">
+ <div class="logo">
+ <a href="https://www.google.com"><img src="https://lh3.googleusercontent.com/YoVRtLOHMSRYQZ3OhFL8RIamcjFYbmQXX4oAQx02MRqqY9zlKNvsuZpS73khXiOqTH3qrFW27VrERJJIHTjPk-tAh46q8-Fd4w6qlw" alt="Google" /></a>
+ </div>
+ <ol id="drop-down" class="dropdown-content hide">
+ <li>
+ <a class="menu-buttons" href="/sre/sre-book/toc/">Table of Contents</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/foreword" class="menu-buttons">Foreword</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/preface" class="menu-buttons">Preface</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/part1" class="menu-buttons">Part I - Introduction</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/introduction" class="menu-buttons">1. Introduction</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/production-environment" class="menu-buttons">2. The Production Environment at Google, from the Viewpoint of an SRE</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/part2" class="menu-buttons">Part II - Principles</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/embracing-risk" class="menu-buttons">3. Embracing Risk</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/service-level-objectives" class="menu-buttons">4. Service Level Objectives</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/eliminating-toil" class="menu-buttons">5. Eliminating Toil</a>
+ </li>
+ <li class="active">
+ <a href="/sre/sre-book/chapters/monitoring-distributed-systems" class="menu-buttons">6. Monitoring Distributed Systems</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/automation-at-google" class="menu-buttons">7. The Evolution of Automation at Google</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/release-engineering" class="menu-buttons">8. Release Engineering</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/simplicity" class="menu-buttons">9. Simplicity</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/part3" class="menu-buttons">Part III - Practices</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/practical-alerting" class="menu-buttons">10. Practical Alerting</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/being-on-call" class="menu-buttons">11. Being On-Call</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/effective-troubleshooting" class="menu-buttons">12. Effective Troubleshooting</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/emergency-response" class="menu-buttons">13. Emergency Response</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/managing-incidents" class="menu-buttons">14. Managing Incidents</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/postmortem-culture" class="menu-buttons">15. Postmortem Culture: Learning from Failure</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/tracking-outages" class="menu-buttons">16. Tracking Outages</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/testing-reliability" class="menu-buttons">17. Testing for Reliability</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/software-engineering-in-sre" class="menu-buttons">18. Software Engineering in SRE</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/load-balancing-frontend" class="menu-buttons">19. Load Balancing at the Frontend</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/load-balancing-datacenter" class="menu-buttons">20. Load Balancing in the Datacenter</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/handling-overload" class="menu-buttons">21. Handling Overload</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/addressing-cascading-failures" class="menu-buttons">22. Addressing Cascading Failures</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/managing-critical-state" class="menu-buttons">23. Managing Critical State: Distributed Consensus for Reliability</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/distributed-periodic-scheduling" class="menu-buttons">24. Distributed Periodic Scheduling with Cron</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/data-processing-pipelines" class="menu-buttons">25. Data Processing Pipelines</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/data-integrity" class="menu-buttons">26. Data Integrity: What You Read Is What You Wrote</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/reliable-product-launches" class="menu-buttons">27. Reliable Product Launches at Scale</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/part4" class="menu-buttons">Part IV - Management</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/accelerating-sre-on-call" class="menu-buttons">28. Accelerating SREs to On-Call and Beyond</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/dealing-with-interrupts" class="menu-buttons">29. Dealing with Interrupts</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/operational-overload" class="menu-buttons">30. Embedding an SRE to Recover from Operational Overload</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/communication-and-collaboration" class="menu-buttons">31. Communication and Collaboration in SRE</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/evolving-sre-engagement-model" class="menu-buttons">32. The Evolving SRE Engagement Model</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/part5" class="menu-buttons">Part V - Conclusions</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/lessons-learned" class="menu-buttons">33. Lessons Learned from Other Industries</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/conclusion" class="menu-buttons">34. Conclusion</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/availability-table" class="menu-buttons">Appendix A. Availability Table</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/service-best-practices" class="menu-buttons">Appendix B. A Collection of Best Practices for Production Services</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/incident-document" class="menu-buttons">Appendix C. Example Incident State Document</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/postmortem" class="menu-buttons">Appendix D. Example Postmortem</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/launch-checklist" class="menu-buttons">Appendix E. Launch Coordination Checklist</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/production-meeting" class="menu-buttons">Appendix F. Example Production Meeting Minutes</a>
+ </li>
+ <li>
+ <a href="/sre/sre-book/chapters/bibliography" class="menu-buttons">Bibliography</a>
+ </li>
+ </ol>
+ </div>
+ </div>
+ <div id="maia-main" role="main">
+ <div class="maia-teleport" id="content"></div>
+ <div class="content">
+ <section data-type="chapter" id="chapter_monitoring">
+ <h1 class="heading jumptargets">
+ Monitoring Distributed Systems
+ </h1>
+ <p class="byline author">
+ Written by Rob Ewaschuk<br />
+ Edited by Betsy Beyer
+ </p>
+ <p>
+ Google’s SRE teams have some basic principles and best practices for building successful monitoring and alerting systems. This chapter offers guidelines for what issues should interrupt a human via a page, and how to deal with issues that aren’t serious enough to trigger a page.
+ </p>
+ <section data-type="sect1" id="definitions-2ksZhN">
+ <h1 class="heading jumptargets">
+ Definitions
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="terminology" id="id-DnC1SWFMhD"></a>There’s no uniformly shared vocabulary for discussing all topics related to monitoring. Even within Google, usage of the following terms varies, but the most common interpretations are listed here.
+ </p>
+ <dl>
+ <dt class="subheaders jumptargets" id="monitoring">
+ Monitoring
+ </dt>
+ <dd>
+ <p>
+ Collecting, processing, aggregating, and displaying real-time quantitative data about a system, such as query counts and types, error counts and types, processing times, and server lifetimes.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="white-box-monitoring">
+ White-box monitoring
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="white-box monitoring" id="id-9nCjSDS4tZILhX"></a>Monitoring based on metrics exposed by the internals of the system, including logs, interfaces like the Java Virtual Machine Profiling Interface, or an HTTP handler that emits internal statistics.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="black-box-monitoring">
+ Black-box monitoring
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="black-box monitoring" id="id-zdCxSrSgTWIdhb"></a>Testing externally visible behavior as a user would see it.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="dashboard">
+ Dashboard
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="dashboards" data-secondary="defined" id="id-VMCPS2SribIkh4"></a>An application (usually web-based) that provides a summary view of a service’s core metrics. A dashboard may have filters, selectors, and so on, but is prebuilt to expose the metrics most important to its users. The dashboard might also display team information such as ticket queue length, a list of high-priority bugs, the current on-call engineer for a given area of responsibility, or recent pushes.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="alert">
+ Alert
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="alerts" data-secondary="defined" id="id-wqC7SvSPUAIVhQ"></a>A notification intended to be read by a human and that is pushed to a system such as a bug or ticket queue, an email alias, or a pager. Respectively, these alerts are classified as <em>tickets</em>, <em>email alerts</em>,<sup><a class="jumptarget" data-type="noteref" id="id-LvQuvtYS7UvI8h4-marker" href="#id-LvQuvtYS7UvI8h4">22</a></sup> and <em>pages</em>.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="root-cause">
+ Root cause
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="root cause" data-secondary="defined" id="id-PnCpSaSKsgIjho"></a>A defect in a software or human system that, if repaired, instills confidence that this event won’t happen again in the same way. A given incident might have multiple root causes: for example, perhaps it was caused by a combination of insufficient process automation, software that crashed on bogus input, <em>and</em> insufficient testing of the script used to generate the configuration. Each of these factors might stand alone as a root cause, and each should be repaired.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="node-and-machine">
+ Node and machine
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="machines" data-secondary="defined" id="id-XmC9SkSlfnI1hK"></a>Used interchangeably to indicate a single instance of a running kernel in either a physical server, virtual machine, or container. There might be multiple <em>services</em> worth monitoring on a single machine. The services may either be:
+ </p>
+ <ul>
+ <li>Related to each other: for example, a caching server and a web server
+ </li>
+ <li>Unrelated services sharing hardware: for example, a code repository and a master for a configuration system like <a href="https://puppetlabs.com/puppet/puppet-open-source" target="_blank">Puppet</a> or <a href="https://www.chef.io/chef/" target="_blank">Chef</a>
+ </li>
+ </ul>
+ </dd>
+ <dt class="subheaders jumptargets" id="push">
+ Push
+ </dt>
+ <dd>
+ <p>
+ Any change to a service’s running software or its configuration.
+ </p>
+ </dd>
+ </dl>
+ </section>
+ <section data-type="sect1" id="why-monitor-pWsBTZ">
+ <h1 class="heading jumptargets">
+ Why Monitor?
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="benefits of monitoring" id="id-kVCkSpFnTl"></a>There are many reasons to monitor a system, including:
+ </p>
+ <dl>
+ <dt class="subheaders jumptargets" id="analyzing-long-term-trends">
+ Analyzing long-term trends
+ </dt>
+ <dd>
+ <p>
+ How big is my database and how fast is it growing? How quickly is my daily-active user count growing?
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="comparing-over-time-or-experiment-groups">
+ Comparing over time or experiment groups
+ </dt>
+ <dd>
+ <p>
+ Are queries faster with Acme Bucket of Bytes 2.72 versus Ajax DB 3.14? How much better is my memcache hit rate with an extra node? Is my site slower than it was last week?
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="alerting">
+ Alerting
+ </dt>
+ <dd>
+ <p>
+ Something is broken, and somebody needs to fix it right now! Or, something might break soon, so somebody should look soon.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="building-dashboards">
+ Building dashboards
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="dashboards" data-secondary="benefits of" id="id-rjCXSOS0iDIGT8"></a>Dashboards should answer basic questions about your service, and normally include some form of the four golden signals (discussed in <a data-type="xref" href="#xref_monitoring_golden-signals">The Four Golden Signals</a>).
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="conducting-ad-hoc-retrospective-analysis-ie-debugging">
+ Conducting <i class="italic">ad hoc</i> retrospective analysis (i.e., debugging)
+ </dt>
+ <dd>
+ <p>
+ Our latency just shot up; what else happened around the same time?
+ </p>
+ </dd>
+ </dl>
+ <p>
+ System monitoring is also helpful in supplying raw input into business analytics and in facilitating analysis of security breaches. Because this book focuses on the engineering domains in which SRE has particular expertise, we won’t discuss these applications of monitoring here.
+ </p>
+ <p>
+ Monitoring and alerting enables a system to tell us when it’s broken, or perhaps to tell us what’s about to break. When the system isn’t able to automatically fix itself, we want a human to investigate the alert, determine if there’s a real problem at hand, mitigate the problem, and determine the root cause of the problem. Unless you’re performing security auditing on very narrowly scoped components of a system, you should never trigger an alert simply because "something seems a bit weird."
+ </p>
+ <p>
+ Paging a human is a quite expensive use of an employee’s time. If an employee is at work, a page interrupts their workflow. If the employee is at home, a page interrupts their personal time, and perhaps even their sleep. When pages occur too frequently, employees second-guess, skim, or even ignore incoming alerts, sometimes even ignoring a "real" page that’s masked by the noise. Outages can be prolonged because other noise interferes with a rapid diagnosis and fix. Effective alerting systems have good signal and very low noise.
+ </p>
+ </section>
+ <section data-type="sect1" id="setting-reasonable-expectations-for-monitoring-o8svcM">
+ <h1 class="heading jumptargets">
+ Setting Reasonable Expectations for Monitoring
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="setting expectations for" id="id-4nCqSYFQcE"></a>Monitoring a complex application is a significant engineering endeavor in and of itself. Even with substantial existing infrastructure for instrumentation, collection, display, and alerting in place, a Google SRE team with 10–12 members typically has one or sometimes two members whose primary assignment is to build and maintain monitoring systems for their service. This number has decreased over time as we generalize and centralize common monitoring infrastructure, but every SRE team typically has at least one “monitoring person.” (That being said, while it can be fun to have access to traffic graph dashboards and the like, SRE teams carefully avoid any situation that requires someone to “stare at a screen to watch for problems.”)
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="post hoc analysis" id="id-JnCDSjIVcG"></a>In general, Google has trended toward simpler and faster monitoring systems, with better tools for <em>post hoc</em> analysis. We avoid "magic" systems that try to learn thresholds or automatically detect causality. Rules that detect unexpected changes in end-user request rates are one counterexample; while these rules are still kept as simple as possible, they give a very quick detection of a very simple, specific, severe anomaly. Other uses of monitoring data such as capacity planning and traffic prediction can tolerate more fragility, and thus, more complexity. Observational experiments conducted over a very long time horizon (months or years) with a low sampling rate (hours or days) can also often tolerate more fragility because occasional missed samples won’t hide a long-running trend.
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="dependency hierarchies" id="id-9nCjSOtmcj"></a>Google SRE has experienced only limited success with complex dependency hierarchies. We seldom use rules such as, "If I know the database is slow, alert for a slow database; otherwise, alert for the website being generally slow." Dependency-reliant rules usually pertain to very stable parts of our system, such as our system for draining user traffic away from a datacenter. For example, "If a datacenter is drained, then don’t alert me on its latency" is one common datacenter alerting rule. Few teams at Google maintain complex dependency hierarchies because our infrastructure has a steady rate of continuous refactoring.
+ </p>
+ <p>
+ Some of the ideas described in this chapter are still aspirational: there is always room to move more rapidly from symptom to root cause(s), especially in ever-changing systems. So while this chapter sets out some goals for monitoring systems, and some ways to achieve these goals, it’s important that monitoring systems—especially the critical path from the onset of a production problem, through a page to a human, through basic triage and deep debugging—be kept simple and comprehensible by everyone on the team.
+ </p>
+ <p>
+ Similarly, to keep noise low and signal high, the elements of your monitoring system that direct to a pager need to be very simple and robust. Rules that generate alerts for humans should be simple to understand and represent a clear failure.
+ </p>
+ </section>
+ <section data-type="sect1" id="symptoms-versus-causes-g0sEi4">
+ <h1 class="heading jumptargets">
+ Symptoms Versus Causes
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="symptoms vs. causes" id="id-JnCDSlFmiG"></a>Your monitoring system should address two questions: what’s broken, and why?
+ </p>
+ <p>
+ The "what’s broken" indicates the symptom; the "why" indicates a (possibly intermediate) cause. <a data-type="xref" href="#table_monitoring_symptoms">Table 6-1</a> lists some hypothetical symptoms and corresponding causes.
+ </p>
+ <table id="table_monitoring_symptoms" class="pagebreak-before">
+ <caption class="jumptarget">
+ <span class="label">Table 6-1.</span> Example symptoms and causes
+ </caption>
+ <thead>
+ <tr>
+ <th>
+ <strong>Symptom</strong>
+ </th>
+ <th>
+ <strong>Cause</strong>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p>
+ <strong>I’m serving HTTP 500s or 404s</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ Database servers are refusing connections
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>My responses are slow</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ CPUs are overloaded by a bogosort, or an Ethernet cable is crimped under a rack, visible as partial packet loss
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>Users in Antarctica aren’t receiving animated cat GIFs</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ Your Content Distribution Network hates scientists and felines, and thus blacklisted some client IPs
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p>
+ <strong>Private content is world-readable</strong>
+ </p>
+ </td>
+ <td>
+ <p>
+ A new software push caused ACLs to be forgotten and allowed all requests
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ "What" versus "why" is one of the most important distinctions in writing good monitoring with maximum signal and minimum noise.
+ </p>
+ </section>
+ <section data-type="sect1" id="black-box-versus-white-box-q8sJuw">
+ <h1 class="heading jumptargets">
+ Black-Box Versus White-Box
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="blackbox vs. whitebox" id="id-9nCjSvFVuj"></a><a data-type="indexterm" data-primary="white-box monitoring" id="id-ZbC1FMFEu7"></a><a data-type="indexterm" data-primary="black-box monitoring" id="id-zdCXIGFvuy"></a>We combine heavy use of white-box monitoring with modest but critical uses of black-box monitoring. The simplest way to think about black-box monitoring versus white-box monitoring is that black-box monitoring is symptom-oriented and represents active—not predicted—problems: "The system isn’t working correctly, right now." White-box monitoring depends on the ability to inspect the innards of the system, such as logs or HTTP endpoints, with instrumentation. White-box monitoring therefore allows detection of imminent problems, failures masked by retries, and so forth.
+ </p>
+ <p>
+ Note that in a multilayered system, one person’s symptom is another person’s cause. For example, suppose that a database’s performance is slow. Slow database reads are a symptom for the database SRE who detects them. However, for the frontend SRE observing a slow website, the same slow database reads are a cause. Therefore, white-box monitoring is sometimes symptom-oriented, and sometimes cause-oriented, depending on just how informative your white-box is.
+ </p>
+ <p>
+ When collecting telemetry for debugging, white-box monitoring is essential. If web servers seem slow on database-heavy requests, you need to know both how fast the web server perceives the database to be, and how fast the database believes itself to be. Otherwise, you can’t distinguish an actually slow database server from a network problem between your web server and your database.
+ </p>
+ <p>
+ For paging, black-box monitoring has the key benefit of forcing discipline to only nag a human when a problem is both already ongoing and contributing to real symptoms. On the other hand, for not-yet-occurring but imminent problems, black-box monitoring is fairly useless.
+ </p>
+ </section>
+ <section data-type="sect1" id="xref_monitoring_golden-signals">
+ <h1 class="heading jumptargets">
+ The Four Golden Signals
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="four golden signals of" id="id-ZbCxSMFjU7"></a>The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four.
+ </p>
+ <dl>
+ <dt class="subheaders jumptargets" id="latency">
+ Latency
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="service latency" data-secondary="monitoring for" id="id-yYCASJS9FKIWUb"></a><a data-type="indexterm" data-primary="latency" data-secondary="monitoring for" id="id-VMCpF2SXFbIwU4"></a><a data-type="indexterm" data-primary="request latency" id="id-rjCeIOSKFDIaU8"></a><a data-type="indexterm" data-primary="user requests" data-secondary="request latency monitoring" id="id-wqCDtvSGFAIMUQ"></a>The time it takes to service a request. It’s important to distinguish between the latency of successful requests and the latency of failed requests. For example, an HTTP 500 error triggered due to loss of connection to a database or other critical backend might be served very quickly; however, as an HTTP 500 error indicates a failed request, factoring 500s into your overall latency might result in misleading calculations. On the other hand, a slow error is even worse than a fast error! Therefore, it’s important to track error latency, as opposed to just filtering out errors.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="traffic">
+ Traffic
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="user requests" data-secondary="traffic analysis" id="id-rjCXSOSxtDIaU8"></a><a data-type="indexterm" data-primary="traffic analysis" id="id-wqC4FvSBtAIMUQ"></a>A measure of how much demand is being placed on your system, measured in a high-level system-specific metric. For a web service, this measurement is usually HTTP requests per second, perhaps broken out by the nature of the requests (e.g., static versus dynamic content). For an audio streaming system, this measurement might focus on network I/O rate or concurrent sessions. For a key-value storage system, this measurement might be transactions and retrievals per <span class="keep-together">second</span>.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="errors">
+ Errors
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="error rates" id="id-x1C4SjSlTLIMUJ"></a><a data-type="indexterm" data-primary="user requests" data-secondary="monitoring failures" id="id-PnCxFaS0TgIVUo"></a>The rate of requests that fail, either explicitly (e.g., HTTP 500s), implicitly (for example, an HTTP 200 success response, but coupled with the wrong content), or by policy (for example, "If you committed to one-second response times, any request over one second is an error"). Where protocol response codes are insufficient to express all failure conditions, secondary (internal) protocols may be necessary to track partial failure modes. Monitoring these cases can be drastically different: catching HTTP 500s at your load balancer can do a decent job of catching all completely failed requests, while only end-to-end system tests can detect that you’re serving the wrong content.
+ </p>
+ </dd>
+ <dt class="subheaders jumptargets" id="saturation">
+ Saturation
+ </dt>
+ <dd>
+ <p>
+ <a data-type="indexterm" data-primary="saturation" id="id-OnCNS2S4iDIYU8"></a>How "full" your service is. A measure of your system fraction, emphasizing the resources that are most constrained (e.g., in a memory-constrained system, show memory; in an I/O-constrained system, show I/O). Note that many systems degrade in performance before they achieve 100% utilization, so having a utilization target is essential.
+ </p>
+ <p>
+ In complex systems, saturation can be supplemented with higher-level load measurement: can your service properly handle double the traffic, handle only 10% more traffic, or handle even less traffic than it currently receives? For very simple services that have no parameters that alter the complexity of the request (e.g., "Give me a nonce" or "I need a globally unique monotonic integer") that rarely change configuration, a static value from a load test might be adequate. As discussed in the previous paragraph, however, most services need to use indirect signals like CPU utilization or network bandwidth that have a known upper bound. Latency increases are often a leading indicator of saturation. Measuring your 99th percentile response time over some small window (e.g., one minute) can give a very early signal of saturation.
+ </p>
+ <p>
+ Finally, saturation is also concerned with predictions of impending saturation, such as "It looks like your database will fill its hard drive in 4 hours."
+ </p>
+ </dd>
+ </dl>
+ <p>
+ If you measure all four golden signals and page a human when one signal is problematic (or, in the case of saturation, nearly problematic), your service will be at least decently covered by monitoring.
+ </p>
+ </section>
+ <section data-type="sect1" id="worrying-about-your-tail-or-instrumentation-and-performance-Yms9Ck">
+ <h1 class="heading jumptargets">
+ Worrying About Your Tail (or, Instrumentation and Performance)
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="instrumentation and performance" id="id-zdCxSGFQCy"></a><a data-type="indexterm" data-primary="performance" data-secondary="monitoring" id="id-yYCyFpFdCr"></a>When building a monitoring system from scratch, it’s tempting to design a system based upon the mean of some quantity: the mean latency, the mean CPU usage of your nodes, or the mean fullness of your databases. The danger presented by the latter two cases is obvious: CPUs and databases can easily be utilized in a very imbalanced way. The same holds for latency. If you run a web service with an average latency of 100 ms at 1,000 requests per second, 1% of requests might easily take 5 seconds.<sup><a class="jumptarget" data-type="noteref" id="id-QQLuAIXFxCz-marker" href="#id-QQLuAIXFxCz">23</a></sup> If your users depend on several such web services to render their page, the 99th percentile of one backend can easily become the median response of your <span class="keep-together">frontend</span>.
+ </p>
+ <p>
+ The simplest way to differentiate between a slow average and a very slow "tail" of requests is to collect request counts bucketed by latencies (suitable for rendering a histogram), rather than actual latencies: how many requests did I serve that took between 0 ms and 10 ms, between 10 ms and 30 ms, between 30 ms and 100 ms, between 100 ms and 300 ms, and so on? Distributing the histogram boundaries approximately exponentially (in this case by factors of roughly 3) is often an easy way to visualize the distribution of your requests.
+ </p>
+ </section>
+ <section data-type="sect1" id="choosing-an-appropriate-resolution-for-measurements-vJsBsE">
+ <h1 class="heading jumptargets">
+ Choosing an Appropriate Resolution for Measurements
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="resolution" id="id-yYCASpFxsr"></a>Different aspects of a system should be measured with different levels of granularity. For example:
+ </p>
+ <ul>
+ <li>Observing CPU load over the time span of a minute won’t reveal even quite long-lived spikes that drive high tail latencies.
+ </li>
+ <li>On the other hand, for a web service targeting no more than 9 hours aggregate downtime per year (99.9% annual uptime), probing for a 200 (success) status more than once or twice a minute is probably unnecessarily frequent.
+ </li>
+ <li>Similarly, checking hard drive fullness for a service targeting 99.9% availability more than once every 1–2 minutes is probably unnecessary.
+ </li>
+ </ul>
+ <p>
+ Take care in how you structure the granularity of your measurements. Collecting per-second measurements of CPU load might yield interesting data, but such frequent measurements may be very expensive to collect, store, and analyze. If your monitoring goal calls for high resolution but doesn’t require extremely low latency, you can reduce these costs by performing internal sampling on the server, then configuring an external system to collect and aggregate that distribution over time or across servers. You might:
+ </p>
+ <ol>
+ <li>Record the current CPU utilization each second.
+ </li>
+ <li>Using buckets of 5% granularity, increment the appropriate CPU utilization bucket each second.
+ </li>
+ <li>Aggregate those values every minute.
+ </li>
+ </ol>
+ <p>
+ This strategy allows you to observe brief CPU hotspots without incurring very high cost due to collection and retention.
+ </p>
+ </section>
+ <section data-type="sect1" id="as-simple-as-possible-no-simpler-lqskHx">
+ <h1 class="heading jumptargets">
+ As Simple as Possible, No Simpler
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="avoiding complexity in" id="id-VMCPSrFpHm"></a>Piling all these requirements on top of each other can add up to a very complex monitoring system—your system might end up with the following levels of complexity:
+ </p>
+ <ul>
+ <li>Alerts on different latency thresholds, at different percentiles, on all kinds of different metrics
+ </li>
+ <li>Extra code to detect and expose possible causes
+ </li>
+ <li>Associated dashboards for each of these possible causes
+ </li>
+ </ul>
+ <p>
+ The sources of potential complexity are never-ending. Like all software systems, monitoring can become so complex that it’s fragile, complicated to change, and a maintenance burden.
+ </p>
+ <p>
+ Therefore, design your monitoring system with an eye toward simplicity. In choosing what to monitor, keep the following guidelines in mind:
+ </p>
+ <ul>
+ <li>The rules that catch real incidents most often should be as simple, predictable, and reliable as possible.
+ </li>
+ <li>Data collection, aggregation, and alerting configuration that is rarely exercised (e.g., less than once a quarter for some SRE teams) should be up for removal.
+ </li>
+ <li>Signals that are collected, but not exposed in any prebaked dashboard nor used by any alert, are candidates for removal.
+ </li>
+ </ul>
+ <p>
+ In Google’s experience, basic collection and aggregation of metrics, paired with alerting and dashboards, has worked well as a relatively standalone system. (In fact Google’s monitoring system is broken up into several binaries, but typically people learn about all aspects of these binaries.) It can be tempting to combine monitoring with other aspects of inspecting complex systems, such as detailed system profiling, single-process debugging, tracking details about exceptions or crashes, load testing, log collection and analysis, or traffic inspection. While most of these subjects share commonalities with basic monitoring, blending together too many results in overly complex and fragile systems. As in many other aspects of software engineering, maintaining distinct systems with clear, simple, loosely coupled points of integration is a better strategy (for example, using web APIs for pulling summary data in a format that can remain constant over an extended period of time).
+ </p>
+ </section>
+ <section data-type="sect1" id="tying-these-principles-together-nqsJfw">
+ <h1 class="heading jumptargets">
+ Tying These Principles Together
+ </h1>
+ <p>
+ The principles discussed in this chapter can be tied together into a philosophy on monitoring and alerting that’s widely endorsed and followed within Google SRE teams. While this monitoring philosophy is a bit aspirational, it’s a good starting point for writing or reviewing a new alert, and it can help your organization ask the right questions, regardless of the size of your organization or the complexity of your service or system.
+ </p>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="creating rules for" id="id-wqC7SDIvfj"></a>When creating rules for monitoring and alerting, asking the following questions can help you avoid false positives and pager burnout:<sup><a class="jumptarget" data-type="noteref" id="id-a82udF8IBfx-marker" href="#id-a82udF8IBfx">24</a></sup>
+ </p>
+ <ul>
+ <li>Does this rule detect <em>an otherwise undetected condition</em> that is urgent, actionable, and actively or imminently user-visible?<sup><a class="jumptarget" data-type="noteref" id="id-0vYuEFpSjSMtLfG-marker" href="#id-0vYuEFpSjSMtLfG">25</a></sup>
+ </li>
+ <li>Will I ever be able to ignore this alert, knowing it’s benign? When and why will I be able to ignore this alert, and how can I avoid this scenario?
+ </li>
+ <li>Does this alert definitely indicate that users are being negatively affected? Are there detectable cases in which users aren’t being negatively impacted, such as drained traffic or test deployments, that should be filtered out?
+ </li>
+ <li>Can I take action in response to this alert? Is that action urgent, or could it wait until morning? Could the action be safely automated? Will that action be a long-term fix, or just a short-term workaround?
+ </li>
+ <li>Are other people getting paged for this issue, therefore rendering at least one of the pages unnecessary?
+ </li>
+ </ul>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="monitoring philosophy" id="id-PnCpSwhJfa"></a>These questions reflect a fundamental philosophy on pages and pagers:
+ </p>
+ <ul>
+ <li>Every time the pager goes off, I should be able to react with a sense of urgency. I can only react with a sense of urgency a few times a day before I become fatigued.
+ </li>
+ <li>Every page should be actionable.
+ </li>
+ <li>Every page response should require intelligence. If a page merely merits a robotic response, it shouldn’t be a page.
+ </li>
+ <li>Pages should be about a novel problem or an event that hasn’t been seen before.
+ </li>
+ </ul>
+ <p>
+ Such a perspective dissipates certain distinctions: if a page satisfies the preceding four bullets, it’s irrelevant whether the page is triggered by white-box or black-box monitoring. This perspective also amplifies certain distinctions: it’s better to spend much more effort on catching symptoms than causes; when it comes to causes, only worry about very definite, very imminent causes.
+ </p>
+ </section>
+ <section data-type="sect1" id="monitoring-for-the-long-term-NbsNS8">
+ <h1 class="heading jumptargets">
+ Monitoring for the Long Term
+ </h1>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="challenges of" id="id-wqC7SPFMSj"></a>In modern production systems, monitoring systems track an ever-evolving system with changing software architecture, load characteristics, and performance targets. An alert that’s currently exceptionally rare and hard to automate might become frequent, perhaps even meriting a hacked-together script to resolve it. At this point, someone should find and eliminate the root causes of the problem; if such resolution isn’t possible, the alert response deserves to be fully automated.
+ </p>
+ <p>
+ It’s important that decisions about monitoring be made with long-term goals in mind. Every page that happens today distracts a human from improving the system for tomorrow, so there is often a case for taking a short-term hit to availability or performance in order to improve the long-term outlook for the system. Let’s take a look at two case studies that illustrate this trade-off.
+ </p>
+ <section data-type="sect2" id="bigtable-sre-a-tale-of-over-alerting-dbsXtjSM">
+ <h2 class="subheaders jumptargets">
+ Bigtable SRE: A Tale of Over-Alerting
+ </h2>
+ <p>
+ <a data-type="indexterm" id="MDSbig6" data-primary="monitoring distributed systems" data-secondary="case studies"></a><a data-type="indexterm" data-primary="Bigtable" id="id-XmCpFOFytySv"></a>Google’s internal infrastructure is typically offered and measured against a service level objective (SLO; see <a data-type="xref" href="/sre/sre-book/chapters/service-level-objectives">Service Level Objectives</a>). Many years ago, the Bigtable service’s SLO was based on a synthetic well-behaved client’s mean performance. Because of problems in Bigtable and lower layers of the storage stack, the mean performance was driven by a "large" tail: the worst 5% of requests were often significantly slower than the rest.
+ </p>
+ <p>
+ Email alerts were triggered as the SLO approached, and paging alerts were triggered when the SLO was exceeded. Both types of alerts were firing voluminously, consuming unacceptable amounts of engineering time: the team spent significant amounts of time triaging the alerts to find the few that were really actionable, and we often missed the problems that actually affected users, because so few of them did. Many of the pages were non-urgent, due to well-understood problems in the infrastructure, and had either rote responses or received no response.
+ </p>
+ <p>
+ To remedy the situation, the team used a three-pronged approach: while making great efforts to improve the performance of Bigtable, we also temporarily dialed back our SLO target, using the 75th percentile request latency. We also disabled email alerts, as there were so many that spending time diagnosing them was infeasible.
+ </p>
+ <p>
+ This strategy gave us enough breathing room to actually fix the longer-term problems in Bigtable and the lower layers of the storage stack, rather than constantly fixing tactical problems. On-call engineers could actually accomplish work when they weren’t being kept up by pages at all hours. Ultimately, temporarily backing off on our alerts allowed us to make faster progress toward a better service.
+ </p>
+ </section>
+ <section data-type="sect2" id="gmail-predictable-scriptable-responses-from-humans-BVs1h4SD">
+ <h2 class="subheaders jumptargets">
+ Gmail: Predictable, Scriptable Responses from Humans
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="Gmail" id="id-XmC9SOFZhySv"></a>In the very early days of Gmail, the service was built on a retrofitted distributed process management system called Workqueue, which was originally created for batch processing of pieces of the search index. Workqueue was "adapted" to long-lived processes and subsequently applied to Gmail, but certain bugs in the relatively opaque codebase in the scheduler proved hard to beat.
+ </p>
+ <p>
+ At that time, the Gmail monitoring was structured such that alerts fired when individual tasks were “de-scheduled” by Workqueue. This setup was less than ideal because even at that time, Gmail had many, many thousands of tasks, each task representing a fraction of a percent of our users. We cared deeply about providing a good user experience for Gmail users, but such an alerting setup was unmaintainable.
+ </p>
+ <p>
+ To address this problem, Gmail SRE built a tool that helped “poke” the scheduler in just the right way to minimize impact to users. The team had several discussions about whether or not we should simply automate the entire loop from detecting the problem to nudging the rescheduler, until a better long-term solution was achieved, but some worried this kind of workaround would delay a real fix.
+ </p>
+ <p>
+ This kind of tension is common within a team, and often reflects an underlying mistrust of the team’s self-discipline: while some team members want to implement a “hack” to allow time for a proper fix, others worry that a hack will be forgotten or that the proper fix will be deprioritized indefinitely. This concern is credible, as it’s easy to build layers of unmaintainable technical debt by patching over problems instead of making real fixes. Managers and technical leaders play a key role in implementing true, long-term fixes by supporting and prioritizing potentially time-consuming long-term fixes even when the initial “pain” of paging subsides.
+ </p>
+ <p>
+ Pages with rote, algorithmic responses should be a red flag. Unwillingness on the part of your team to automate such pages implies that the team lacks confidence that they can clean up their technical debt. This is a major problem worth escalating.<a data-type="indexterm" data-primary="" data-startref="MDSbig6" id="id-oPCASqT2hLSk"></a>
+ </p>
+ </section>
+ <section data-type="sect2" id="the-long-run-MQsWTMS7">
+ <h2 class="subheaders jumptargets">
+ The Long Run
+ </h2>
+ <p>
+ <a data-type="indexterm" data-primary="monitoring distributed systems" data-secondary="short- vs. long-term availability" id="id-jyCxSoFETNSd"></a>A common theme connects the previous examples of Bigtable and Gmail: a tension between short-term and long-term availability. Often, sheer force of effort can help a rickety system achieve high availability, but this path is usually short-lived and fraught with burnout and dependence on a small number of heroic team members. Taking a controlled, short-term decrease in availability is often a painful, but strategic trade for the long-run stability of the system. It’s important not to think of every page as an event in isolation, but to consider whether the overall <em>level</em> of paging leads toward a healthy, appropriately available system with a healthy, viable team and long-term outlook. We review statistics about page frequency (usually expressed as incidents per shift, where an incident might be composed of a few related pages) in quarterly reports with management, ensuring that decision makers are kept up to date on the pager load and overall health of their teams.
+ </p>
+ </section>
+ </section>
+ <section data-type="sect1" id="conclusion-8ksvFj">
+ <h1 class="heading jumptargets">
+ Conclusion
+ </h1>
+ <p>
+ A healthy monitoring and alerting pipeline is simple and easy to reason about. It focuses primarily on symptoms for paging, reserving cause-oriented heuristics to serve as aids to debugging problems. Monitoring symptoms is easier the further "up" your stack you monitor, though monitoring saturation and performance of subsystems such as databases often must be performed directly on the subsystem itself. Email alerts are of very limited value and tend to easily become overrun with noise; instead, you should favor a dashboard that monitors all ongoing subcritical problems for the sort of information that typically ends up in email alerts. A dashboard might also be paired with a log, in order to analyze historical correlations.
+ </p>
+ <p>
+ Over the long haul, achieving a successful on-call rotation and product includes choosing to alert on symptoms or imminent real problems, adapting your targets to goals that are actually achievable, and making sure that your monitoring supports rapid diagnosis.
+ </p>
+ </section>
+ <div class="footnotes" data-type="footnotes">
+ <p data-type="footnote" id="id-LvQuvtYS7UvI8h4">
+ <sup><a class="jumptargets" href="#id-LvQuvtYS7UvI8h4-marker">22</a></sup>Sometimes known as "alert spam," as they are rarely read or acted on.
+ </p>
+ <p data-type="footnote" id="id-QQLuAIXFxCz">
+ <sup><a class="jumptargets" href="#id-QQLuAIXFxCz-marker">23</a></sup>If 1% of your requests are 50x the average, it means that the rest of your requests are about twice as fast as the average. But if you’re not measuring your distribution, the idea that most of your requests are near the mean is just hopeful thinking.
+ </p>
+ <p data-type="footnote" id="id-a82udF8IBfx">
+ <sup><a class="jumptargets" href="#id-a82udF8IBfx-marker">24</a></sup>See <em>Applying Cardiac Alarm Management Techniques to Your On-Call</em> <a data-type="xref" href="/sre/sre-book/chapters/bibliography#Hol14" target="_blank">[Hol14]</a> for an example of alert fatigue in another context.
+ </p>
+ <p data-type="footnote" id="id-0vYuEFpSjSMtLfG">
+ <sup><a class="jumptargets" href="#id-0vYuEFpSjSMtLfG-marker">25</a></sup>Zero-redundancy (<em>N</em> + 0) situations count as imminent, as do "nearly full" parts of your service! For more details about the concept of redundancy, see <a href="https://en.wikipedia.org/wiki/N%2B1_redundancy" target="_blank"><em class="hyperlink">https://en.wikipedia.org/wiki/N%2B1_redundancy</em></a>.
+ </p>
+ </div>
+ </section>
+ </div>
+ </div>
+ <div class="footer">
+ <div class="maia-aux">
+ <div class="previous">
+ <a href="/sre/sre-book/chapters/eliminating-toil">
+ <p class="footer-caption">
+ Previous
+ </p>
+ <p class="chapter-link">
+ Chapter 5 - Eliminating Toil
+ </p></a>
+ </div>
+ <div class="next">
+ <a href="/sre/sre-book/chapters/automation-at-google">
+ <p class="footer-caption">
+ Next
+ </p>
+ <p class="chapter-link">
+ Chapter 7 - The Evolution of Automation at Google
+ </p></a>
+ </div>
+ <p class="footer-link">
+ Copyright © 2017 Google, Inc. Published by O'Reilly Media, Inc. Licensed under <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a>
+ </p>
+ </div>
+ </div>
+ </main>
+ <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
+ <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular-animate.min.js"></script>
+ <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular-touch.min.js"></script>
+ <script src="/sre/sre-book/static/js/index.min.js?cache=5b7f90b"></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-images.json
new file mode 100644
index 000000000..e99978bb5
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-images.json
@@ -0,0 +1,16 @@
+[
+ "https:\/\/i.guim.co.uk\/img\/media\/df84b519a877d652e950ecd4248320eec985934e\/0_320_4800_2880\/master\/4800.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&s=af41545b21b557e4f57dd4221b6a7f89",
+ "https:\/\/i.guim.co.uk\/img\/media\/05cb692c634cd90e5411aab92ca3e649474ff786\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=575838a657b26493e956c7f84b058080",
+ "https:\/\/i.guim.co.uk\/img\/media\/98c683a7df9c83b2c13de2d93ca1825199ed5150\/0_0_4800_3166\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=2f198e1958f140f3ac664a3fdd87177c",
+ "https:\/\/i.guim.co.uk\/img\/media\/0447972cf47ca67882fcfc648edf7e574b0853bc\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=718132fd888108a18383c24a8425523b",
+ "https:\/\/i.guim.co.uk\/img\/media\/416800b8d06039780c3e6de28564e6f277b4e7b7\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=c5a53178ebbe54490c97fad6b5e032c4",
+ "https:\/\/i.guim.co.uk\/img\/media\/8c207197c0a9e6f407dcddfded5f868a142c9cab\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=0dd659ae339b1aea9a99ed7f6f8eadeb",
+ "https:\/\/i.guim.co.uk\/img\/media\/0d13adeb0790af5c5fa317ce477c323d0e1c773c\/0_0_4800_2334\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=41b88ee343b9be76688b88443c7a8958",
+ "https:\/\/i.guim.co.uk\/img\/media\/4973b41f53b8ade499f99a305b01157eca659ca5\/0_0_1200_900\/master\/1200.jpg?width=300&quality=85&auto=format&fit=max&s=7c255bf6f8a27c56365a86813cdd1517",
+ "https:\/\/i.guim.co.uk\/img\/media\/d1941b6a6908314fab28f44da222a4c892213341\/0_0_4800_3120\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=76a26a289728e3d625e57d32eced57d8",
+ "https:\/\/i.guim.co.uk\/img\/media\/14b462f5d9489def554e0f9f436f13aec332f7b8\/0_0_4278_4800\/master\/4278.jpg?width=300&quality=85&auto=format&fit=max&s=a45ec7578a392eec201d2f6920b609a0",
+ "https:\/\/i.guim.co.uk\/img\/media\/e2cf54c36f17c6894844ea0cdd4346288a002da9\/915_0_3172_3189\/master\/3172.jpg?width=300&quality=85&auto=format&fit=max&s=0bd8e9f51bdf79a6e0a15ed176cfb57d",
+ "https:\/\/i.guim.co.uk\/img\/media\/b5f3736b2ba2ef4df364258b0efcaba26f571d6e\/0_0_4800_3073\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=7fcadc35b3a44ebafe3c469c6e89241d",
+ "https:\/\/i.guim.co.uk\/img\/media\/d5aaf60e3a427f278747acf0c3e7ba39b39ef923\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=1b74b488aedb864287ff160f86d74c9d",
+ "https:\/\/i.guim.co.uk\/img\/media\/3766106f73e858d5b140ae3cdd2eef84060180cd\/0_0_4800_3200\/master\/4800.jpg?width=300&quality=85&auto=format&fit=max&s=d2f5bb7c3c3642ac8733ca40509f6e20"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-metadata.json
new file mode 100644
index 000000000..47af67cd3
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Eleanor Ainge Roy",
+ "Direction": null,
+ "Excerpt": "New Zealand\u2019s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings",
+ "Image": "https:\/\/i.guim.co.uk\/img\/media\/df84b519a877d652e950ecd4248320eec985934e\/0_320_4800_2880\/master\/4800.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&s=af41545b21b557e4f57dd4221b6a7f89",
+ "Title": "'What is the sea telling us?': M\u0101ori tribes fearful over whale strandings | Eleanor Ainge Roy",
+ "SiteName": "the Guardian"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected.html
new file mode 100644
index 000000000..b7faebd36
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/expected.html
@@ -0,0 +1,297 @@
+<div itemprop="articleBody" data-test-id="article-review-body">
+ <p>
+ <span><span>W</span></span>hale whisperer Hori Parata was just seven years old when he attended his first mass stranding, a beaching of porpoises in New Zealand’s Northland, their cries screeching through the air on the deserted stretch of sand.
+ </p>
+ <p>
+ Seven decades later, Parata, 75, has now overseen more than 500 strandings and is renowned in <a href="https://www.theguardian.com/world/newzealand" data-link-name="auto-linked-tag" data-component="auto-linked-tag">New Zealand</a> as the leading Māori whale expert, called on by tribes around the country for cultural guidance as marine strandings become increasingly complex and fatal.
+ </p>
+ <p>
+ “Man’s greed in the ocean is hurting the whales,” says Parata, a fierce and uncompromising elder of the Ngātiwai tribe of eastern Northland.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="05cb692c634cd90e5411aab92ca3e649474ff786" id="img-2">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f5b3d20f0dc5c22a83f96fb709ecd204">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-2" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=adbbf5d870d9cc7f0b9a24eb5472ebf3 1760w"> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f0a6d8fa60b5571e9e0e9a5673e407b7 880w"> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=d39897e20bb677fda3feb14113aad381 1600w"> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=dbf240ee147c5a0a43321f1634ee41eb 800w"> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f7926915234cc22c9fe718771f5837cc 1280w"> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=fa3edf920739ca39d41e3fce38ab277b 640w"> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f9fd7969943957bd4893fe29d248626c 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=61ab70443d54f672febc609b4bfbc5c0 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=a416bff5ba9e0d62f1634aee83308528 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=5ae3b22ecb3c7bde8b49a212d52b707c 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=c43d04fbea54b99991b541ce674da43d 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a0c813b07b8d5b99a33a7133ea7185db 445w">
+ <img itemprop="contentUrl" alt="Hori Parata at his Pātaua farm, the place where he was born and grew up." src="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=575838a657b26493e956c7f84b058080"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Hori Parata at his Pātaua farm, the place where he was born and grew up
+ </p>
+ </li>
+ </ul>
+ <p>
+ “We’re having to put up with a lot of stuff today. The public want to hug the whales, they want to touch them, they want to feel good – that’s not the thing. We feel that is ridiculous.”
+ </p>
+ <p>
+ Whale experts regard New Zealand – or Aotearoa as it is called by Māori – as the whale stranding capital of the world, with more than 5,000 incidents recorded since 1840, and an average of 300 individual animals beaching themselves each year.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="98c683a7df9c83b2c13de2d93ca1825199ed5150" id="img-3">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d2432083289db6bd42f6ad7adc64a78d">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3166"><a href="#img-3" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=7234718ccc92b4251bdfe4c505f064f8 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b80f7e8fcfbbe8e12fa6954ddeb3bd1e 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=78ebc960d0c15f627bfbe60cd770a139 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1319684ba57c18162a45e56384d418b0 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=3170b3a80d76d6c6422b65045444829e 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e835570164cc241d4009af47fc1051f7 445w">
+ <img itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, watched by his father Hori Parata, carves a traditional Maōri design at their home in Whangārei. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father, Hori Parata" src="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2f198e1958f140f3ac664a3fdd87177c"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Kauri (Te Kaurinui Robert) Parata, watched by his father, Hori Parata, carves a traditional Māori design at their home in Whangārei. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father
+ </p>
+ </li>
+ </ul>
+ <p>
+ Concrete information on why whales strand remains elusive, but “sickness, navigational error, geographical features, a rapidly falling tide, being chased by a predator, or extreme weather” are all thought to contribute, according to the New Zealand Department of Conservation.
+ </p>
+ <p>
+ Climate change is to blame too, <a href="https://www.radionz.co.nz/news/national/377272/new-zealand-beached-whales-why-are-so-many-getting-stranded" data-link-name="in body link">scientists think</a>, with warming ocean temperatures moving whales’ prey closer to the shore and forcing them to pursue their food into shallow waters.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="0447972cf47ca67882fcfc648edf7e574b0853bc" id="img-4">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0e7302276c6cc7cb65be9bcdacd3081f">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-4" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=933c5693fbf9195f6e83a8928283f85e 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e07b988894308f3bfc052d1ff9dfc1e2 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=113cf92fe80bc5996634c34b3c7a0c09 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=5a7358223e80941bd1b0e0f427beefde 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=292e941797de1671c185c1b074c688ad 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d1bc1c4d9341f9b6d63b64861a3de711 445w">
+ <img itemprop="contentUrl" alt="A bin of small whale bones." src="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=718132fd888108a18383c24a8425523b"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="416800b8d06039780c3e6de28564e6f277b4e7b7" id="img-5">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=249ddc3119aa637c3a1ae4998509f604">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-5" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=4197b7a2bc3c7e32d3eaee927b9d08e6 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=82d6908c6ffe622566e1cc6513d60ddd 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=222e300fb2a60da1a841fbbc2bc8f752 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=63ba1cfe4b5e7c7d741d311d58997fcf 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=231139825b311ede8d01e6c702d6d12c 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1065dd4439e14c72fe520c19566172e2 445w">
+ <img itemprop="contentUrl" alt="The baleen recovered from a stranded Pygmy Right Whale." src="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c5a53178ebbe54490c97fad6b5e032c4"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="8c207197c0a9e6f407dcddfded5f868a142c9cab" id="img-6">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=bcfefc5593dcc2bdb0dd3b0543cfa4eb">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-6" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=d272c4dc57408daa0dcdf5461a230e9e 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=890f0e0cee54663a90292471a16f95d2 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=59a57c5bded93fe0efe0046226fe7c69 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f1b2a4c79e965aa76a322ad25072a052 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=ffbdfd671eb45e3a87e3dc9137e8b006 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c560f0b0ef9736c1a66215cc29c59d43 445w">
+ <img itemprop="contentUrl" alt="Squid beaks, from the stomach of a Sperm Whale." src="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0dd659ae339b1aea9a99ed7f6f8eadeb"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Clockwise from top: small whale bones; squid beaks, from the stomach of a sperm whale; the baleen filter-feeder system recovered from a stranded pygmy right whale.
+ </p>
+ </li>
+ </ul>
+ <h2>
+ ‘Unprecedented’ strandings
+ </h2>
+ <p>
+ November marked the beginning of whale stranding season, and it started with a surge in incidents, according to whale rescue group Project Jonah, with <a href="https://www.theguardian.com/environment/video/2018/nov/26/whales-die-stranded-stewart-island-new-zealand-beach-video" data-link-name="in body link">140 pilot whales</a> beaching and dying on Stewart Island, 10 rare pygmy whales on Ninety Mile beach, 51 stranded and dead on the Chatham Islands and a spate of individual cases around the country.
+ </p>
+ <p>
+ And as more whales beach and die – from exhaustion, heat stroke or seagulls feasting on their flesh – an acute sense of grief is growing among New Zealand’s indigenous people, who regard whales as their ancestors and <em>taonga</em> (treasures).
+ </p>
+ <p>
+ “These days it is like a zoo. People just want to come and gawk at us, without even trying to understand what is happening with the animals and the environment,” says Parata, bristling with anger.
+ </p>
+ <figure data-interactive="https://interactive.guim.co.uk/embed/iframe-wrapper/0.1/boot.js" data-canonical-url="https://interactive.guim.co.uk/uploader/embed/2019/01/stranded_whales/giv-3902U99iNUM3iDSZ/" data-alt="whale strandings">
+ <a href="https://interactive.guim.co.uk/uploader/embed/2019/01/stranded_whales/giv-3902U99iNUM3iDSZ/" data-link-name="in body link">whale strandings</a>
+ </figure>
+ <p>
+ “When will we talk about what is hurting these animals out on the sea? They are drowning out there, they can’t breathe, they beach themselves to be with the Aunties.”
+ </p>
+ <p>
+ Ngātiwai believe the whales beach when they are ready to die and want to return to their families, the Māori people. Then, their human families use the whales’ gift of their bodies for sacred carvings, for traditional medicines, and even for compost.
+ </p>
+ <p>
+ There are marked tribal differences across New Zealand and while some tribes work to refloat stranded whales, others like Parata’s Ngātiwai stand back and allow the Department of Conservation and volunteer groups to take the lead in rescue efforts.
+ </p>
+ <p>
+ Then the tribe moves in en masse and holds a <em>karakia</em> (prayer), names each animal and sets to work removing their bones, blubber, eyes and teeth for cultural purposes.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="0d13adeb0790af5c5fa317ce477c323d0e1c773c" id="img-7">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d73916fda0f6c60b5eebcb71fea643e9">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="2334"><a href="#img-7" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1300&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=524b92a6590a1b5c139bfe50581476a1 2600w"> <source media="(min-width: 1300px)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=837d7df48e565ffad49febab20fbd179 1300w"> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1140&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=fe98f4515ae3490f53804235a4dcf84b 2280w"> <source media="(min-width: 1140px)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1140&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a3ec73ab7f20798ec264f5ecb59f6bcc 1140w"> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1125&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=3ac3fd319accb248cf8a13e8ef55ebcc 2250w"> <source media="(min-width: 980px)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1125&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2561c80af0d0e8eed2fc7c535be48696 1125w"> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="965px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=965&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=539617a30ea852b01218eec69d6066e6 1930w"> <source media="(min-width: 740px)" sizes="965px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=965&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=624139eae65dd4c96efd1a90243b9286 965w"> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="725px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=725&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=633619afab6a0ee26a3839b69160e854 1450w"> <source media="(min-width: 660px)" sizes="725px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=725&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=98b9351340e8ee30063a4b6eb6501d6f 725w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=645&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e11a31f8adaab06b457fd9c7dda6bf6d 1290w"> <source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=645&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=912104c53b38d1cd424bfb82302480e1 645w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=465&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=209259fab8ec9e81386838f2d5cdecc3 930w"> <source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=465&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=06848a63793084a21bc86aa613b126a7 465w">
+ <img itemprop="contentUrl" alt="Buck Cullen with his daughter Kaiarahi (10 months) in his back yard where he is storing a pair of massive Sperm Whale jawbones. Buck is a integral member of the whale recovery team, alongside Hori Parata." src="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=41b88ee343b9be76688b88443c7a8958"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Buck Cullen with his daughter Kaiarahi (10 months) in his backyard, where he is storing a pair of massive sperm whale jawbones. Cullen is an integral member of Hori Parata’s whale recovery team
+ </p>
+ </li>
+ </ul>
+ <p>
+ But indigenous elders say they aren’t being listened to when they tell the government their whale kin are sick, and trying to escape an increasingly polluted and unpredictable ocean.
+ </p>
+ <p>
+ Earlier this year in South Taranaki, a mass stranding that was described as <a href="https://www.stuff.co.nz/national/104249829/unprecedented-whale-strandings-reaches-11-in-total-on-taranaki-beach" data-link-name="in body link">“unprecedented”</a> left the local Māori tribe scrambling. Security was brought in when thieves attacked a sperm whale with an axe, trying to remove valuable teeth from its jaw.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="4973b41f53b8ade499f99a305b01157eca659ca5" id="img-8">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ee921715aaf10e0816dcf15dfc3a21f5">
+ <meta itemprop="width" content="1200">
+ <meta itemprop="height" content="900"><a href="#img-8" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=8eb5af62092c8a0eb0d283cb0887f5c5 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9ace0f595be568263c5991993632dae8 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=97219f131f1013d15fed7c63308f2b2f 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=17191691b6cd81c2a67730d5475db08b 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=30d51b75767551399ba174bae5c39e94 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=936568b6e7da0a710abcd2c015fd0a8b 445w">
+ <img itemprop="contentUrl" alt="12 Parāoa Whales (Sperm Whales) recently stranded on the South Taranaki coast of Kaupokonui, on a scale not seen on their coast in recent memory." src="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7c255bf6f8a27c56365a86813cdd1517"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ 12 parāoa whales (sperm whales) recently stranded on the South Taranaki coast of Kaupokonui, on a scale not seen near this location in recent memory
+ </p>
+ </li>
+ </ul>
+ <p>
+ Parata and his 22-year-old son, Te Kaurinui Robert Parata, were called in to assist. Te Kaurinui was called after the first whale his father ever named, and left university this year to return to Whangārei and study whale <em>tikanga</em> (protocol) and carving.
+ </p>
+ <p>
+ He says mass strandings are getting more local and international attention and money from donations, but traditional knowledge is being dismissed as overly spiritual.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="d1941b6a6908314fab28f44da222a4c892213341" id="img-9">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4e46b70079819caee86359a058c92be1">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3120"><a href="#img-9" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=b775d649981f7bc36cf0753dd9f47862 1760w"> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=3aa0de336dad5991ff92d488288fcc92 880w"> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=9133cf8cd42d42bb1342dbefbfc67c22 1600w"> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2916efc01252a457768bfd28b40591ee 800w"> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=c7044b93d3aa73f7eac1b56ab9d77d86 1280w"> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2342e6519bfe1ce74a04ca96c06ed4cd 640w"> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=b6218129f26e09d8133bf226df3e9bed 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9d20a1ca789f2efe7ba2dfdef9c28725 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=73fb4a4f8d59a92325fef9faa2ddf90d 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7894b6600fbb6af1ec6552007ad12da8 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=19022ce9fcafebe383880059f34add78 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ded05f2c1859d70d3b8d3de3dcb75e0f 445w">
+ <img itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, of the New Zealand Māori tribe Ngāti Wai, in front of the carving shed at Hihiaua Cultural Centre in Whangarei" src="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=76a26a289728e3d625e57d32eced57d8"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Clockwise from top: Te Kaurinui Parata, in front of the carving shed at Hihiaua Cultural Centre in Whangārei; Parata holds three whale teeth recovered from a beached whale – the middle one shows marks where a poacher had attempted to hack it out with an axe before the recovery group arrived; the Pou, a tribal identifier, in front of the carving shed.
+ </p>
+ </li>
+ </ul>
+ <h2>
+ ‘We need to listen’
+ </h2>
+ <p>
+ Māori harvest rights over dead whales have only been officially recognised since 1998, and the practice still elicits horror from some New Zealanders and visitors.
+ </p>
+ <p>
+ “Our own ancestors wouldn’t say to go down there and hug the whales. That’s a modern thing,” says Te Kaurinui.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="14b462f5d9489def554e0f9f436f13aec332f7b8" id="img-10">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b8bf0c299908608310fb47e4163afb38">
+ <meta itemprop="width" content="4278">
+ <meta itemprop="height" content="4800"><a href="#img-10" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=1a392a17d0c74d513ff14129ae5f7e6c 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d5b05458659a4a06ff6583046f712ad1 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=649c2127cfbab69a7d6e4085ea098d95 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d45dfb664b5479650ba067c6a5af16c3 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f94f4c652479979124e52c237804eb83 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f6c8d3b38a8af6d197d0a60d22a326f3 445w">
+ <img itemprop="contentUrl" alt="The Pou in front of the carving shed at Hihiaua Cultural centre" src="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a45ec7578a392eec201d2f6920b609a0"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="e2cf54c36f17c6894844ea0cdd4346288a002da9" id="img-11">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=3691946929b4105ba35ff9d306cb4fbc">
+ <meta itemprop="width" content="3172">
+ <meta itemprop="height" content="3189"><a href="#img-11" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=be6cf9beea564e7be872193b01c329a3 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c74497ec55bb1b680169d62684aa803d 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=06b2c03638556f85da582e419cf1817a 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8cc04403e3902dbe1e4a9b01b8d4e517 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=893cbf39d6db1d28ba8fc85419382f9d 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=6df725aaf59e21b09434b967e05b3272 445w">
+ <img itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, holds three whale teeth recovered from a beached whale. The middle tooth shows the marks where a poacher had attempted to hack it out with an axe before the recovery group arrived. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father, Hori Parata." src="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0bd8e9f51bdf79a6e0a15ed176cfb57d"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <p>
+ The Ngātiwai are investigating a possible link between the crisis of the dieback disease killing New Zealand’s native kauri trees – and <a href="https://www.theguardian.com/world/2018/jul/14/like-losing-family-time-may-be-running-out-for-new-zealands-most-sacred-tree" data-link-name="in body link">threatening the giant Tāne Mahuta, which may be 2,000 years old</a> – and the increase in whale strandings.
+ </p>
+ <p>
+ Parata and his family believe whale oil and byproducts could be used to try to cure Kauri dieback, and want more government money and attention directed towards indigenous knowledge of the interconnectedness of the New Zealand environment, and possible indigenous solutions.
+ </p>
+ <p>
+ “People dismiss us when we tell them our spiritual understanding of whales – why they are beaching, why they are hurting,” says Te Kaurinui.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="b5f3736b2ba2ef4df364258b0efcaba26f571d6e" id="img-12">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=72146577e379bdf9a21bc47994de5fb6">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3073"><a href="#img-12" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1300&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=4bd713ae6f60b56e36378bb2fe45e9eb 2600w"> <source media="(min-width: 1300px)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b93c6d33ca7496220eb30d0c8bfaccf9 1300w"> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1140&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f66f5a256170eced3c0a52aee235ae29 2280w"> <source media="(min-width: 1140px)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1140&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1f60eb7cf5fc6f899c7c9af9c05df9a0 1140w"> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1125&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=27526c9caf1a62110dfa16214ceccf14 2250w"> <source media="(min-width: 980px)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1125&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7d47ba3d7898a398e1f9d8f2d19d391e 1125w"> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="965px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=965&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=8974cfeb3e33bc51b55518f1bc81e68d 1930w"> <source media="(min-width: 740px)" sizes="965px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=965&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=04f953b4ec9555178204a1621b8a1f59 965w"> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="725px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=725&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=7e2c1494173f83f555806120a1fe43cc 1450w"> <source media="(min-width: 660px)" sizes="725px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=725&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8f53cf25b514e283cce3d995220ca19b 725w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=645&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=2b770ca04273c921c8abe0a7de72030a 1290w"> <source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=645&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0da775328d9ade5ca605079a9118a64a 645w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=465&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e2e51037c5a6b8bf22d87cb927e45888 930w"> <source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=465&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7ecf73b514ceb1b5e0391f17c7a4d3b0 465w">
+ <img itemprop="contentUrl" alt="Whangārei Harbour from Tamaterau, looking south through Mangrove sprouts coming up through the harbourside silt." src="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7fcadc35b3a44ebafe3c469c6e89241d"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Whangārei Harbour seen from Tamaterau, with mangrove sprouts coming up through the harbourside silt
+ </p>
+ </li>
+ </ul>
+ <p>
+ “We are not foreigners in this land. We did not take this land off anyone else. We were not lost waiting for some bullheads to tell us what was going on.”
+ </p>
+ <p>
+ Kaitaia conservation department ranger Jamie Werner of Ngātiwai recently attended his first mass beaching on Ninety Mile Beach. It was the first recorded time pygmy whales had stranded on New Zealand shores.
+ </p>
+ <p>
+ “I arrived at the beach and we leapfrogged between the animals. They were calling out to each other and reassuring each other,” says Werner. “It was a shock. We’re working to adapt but the ocean is changing so fast.”
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="d5aaf60e3a427f278747acf0c3e7ba39b39ef923" id="img-13">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1d00d3ea91d32110b40d85ff43227728">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-13" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=2a64f318f02a31bdf9f17ae01fca72a3 1760w"> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=811b3a2ecee1a87b72813d328f59aa85 880w"> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=47418e3f630c00af6124c471fdc54c20 1600w"> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=93ec03888887d5eb6eabf07e40f2ed3b 800w"> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=476d165704890f40cc5f2d74f4d09b95 1280w"> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=6179da6bca697f83ac063a56660aa31b 640w"> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=df0c5b9ccac02dcd010d7f3ed8ff8c85 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e9fd2eedc9bb80286a6cabd1c7c3b0e2 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e48f277772be7e455f9a4a4139b3bf4c 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2e0af911fcd7011f04ee91d445290e84 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=15161e07957f327b44aa124d94ae8291 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ef6c6809f2adcff0f4ff32899095839b 445w">
+ <img itemprop="contentUrl" alt="The skull of a Brydes whale, in the storage container at Hihiaua Cultural Centre, Whangārei." src="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1b74b488aedb864287ff160f86d74c9d"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Above, the skull of a bryde’s whale; right, a large-calibre bullet of the type that the New Zealand Department of Conservation uses for euthanasing stranded whales that are beyond rescue
+ </p>
+ </li>
+ </ul>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" data-media-id="3766106f73e858d5b140ae3cdd2eef84060180cd" id="img-14">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7dca3d798aef3526f42e281771d50f91">
+ <meta itemprop="width" content="4800">
+ <meta itemprop="height" content="3200"><a href="#img-14" data-link-name="Launch Article Lightbox" data-is-ajax>
+ <div>
+ <picture>
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=0daf794415132fc19259f8d2f654f57f 1240w"> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=98ce62f9d983fe8059c936a6c6cdff33 620w"> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=9ff4aac2a3b07867dfdfb8f470ea6977 1210w"> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=10d1b71094ecf1722f593eb49bb2effe 605w"> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=0705690fcb523f2781a5952f83528ff9 890w"> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4c748337df5f0348eb0e7d3e3ec46571 445w">
+ <img itemprop="contentUrl" alt="A large calibre bullet of the type that the New Zealand Department of Conservation (DOC) uses for euthanasing stranded whales that are beyond rescue." src="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d2f5bb7c3c3642ac8733ca40509f6e20"></picture>
+ </div><span><svg width="22" height="22" viewBox="0 0 22 22">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6" /></svg></span></a>
+ </figure>
+ <p>
+ The recent spate of mass strandings has been described as “heartbreaking” by the conservation department.
+ </p>
+ <p>
+ But for Parata and his family the slow, painful deaths of their ancestors are personal – and ultimately devastating – for the health of the tribe and the sea.
+ </p>
+ <p>
+ “It’s very emotional. Our ancestors tell us the strandings are a sign from the sea. So what is the sea telling us? We need to listen.”
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/source.html
new file mode 100644
index 000000000..a61316266
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/guardian-1/source.html
@@ -0,0 +1,1369 @@
+<!DOCTYPE html>
+<html id="js-context" class="js-off is-not-modern id--signed-out" lang="en" data-page-path="/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>
+ 'What is the sea telling us?': Māori tribes fearful over whale strandings | Eleanor Ainge Roy | Environment | The Guardian
+ </title>
+ <meta charset="utf-8" />
+ <meta name="description" content="New Zealand’s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings" />
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+ <meta name="format-detection" content="telephone=no" />
+ <meta name="HandheldFriendly" content="True" />
+ <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1" />
+ <link rel="dns-prefetch" href="https://assets.guim.co.uk/" />
+ <link rel="dns-prefetch" href="https://i.guim.co.uk" />
+ <link rel="dns-prefetch" href="https://api.nextgen.guardianapps.co.uk" />
+ <link rel="dns-prefetch" href="https://hits-secure.theguardian.com" />
+ <link rel="dns-prefetch" href="//j.ophan.co.uk" />
+ <link rel="dns-prefetch" href="//ophan.theguardian.com" />
+ <link rel="dns-prefetch" href="//phar.gu-web.net" />
+ <link rel="dns-prefetch" href="//www.google-analytics.com" />
+ <link rel="preconnect" href="https://assets.guim.co.uk/" />
+ <link rel="preconnect" href="https://i.guim.co.uk" />
+ <link rel="preconnect" href="//interactive.guim.co.uk" />
+ <link rel="preconnect" href="//www.google-analytics.com" />
+ <link rel="dns-prefetch" href="//sb.scorecardresearch.com" />
+ <link rel="apple-touch-icon" sizes="152x152" href="https://assets.guim.co.uk/images/favicons/fee5e2d638d1c35f6d501fa397e53329/152x152.png" />
+ <link rel="apple-touch-icon" sizes="144x144" href="https://assets.guim.co.uk/images/favicons/1fe70b29879674433702d5266abcb0d4/144x144.png" />
+ <link rel="apple-touch-icon" sizes="120x120" href="https://assets.guim.co.uk/images/favicons/c58143bd2a5b5426b6256cd90ba6eb47/120x120.png" />
+ <link rel="apple-touch-icon" sizes="114x114" href="https://assets.guim.co.uk/images/favicons/68cbd5cf267598abd6a026f229ef6b45/114x114.png" />
+ <link rel="apple-touch-icon" sizes="72x72" href="https://assets.guim.co.uk/images/favicons/873381bf11d58e20f551905d51575117/72x72.png" />
+ <link rel="apple-touch-icon-precomposed" href="https://assets.guim.co.uk/images/favicons/6a2aa0ea5b4b6183e92d0eac49e2f58b/57x57.png" />
+ <link rel="manifest" href="/2015-06-24-manifest.json" crossorigin="use-credentials" />
+ <link rel="shortcut icon" type="image/png" href="https://assets.guim.co.uk/images/favicons/46bd2faa1ab438684a6d4528a655a8bd/32x32.ico" />
+ <link rel="canonical" href="https://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" />
+ <meta name="apple-mobile-web-app-title" content="Guardian" />
+ <meta name="application-name" content="The Guardian" />
+ <meta name="msapplication-TileColor" content="#052962" />
+ <meta name="theme-color" content="#052962" />
+ <meta name="msapplication-TileImage" content="https://assets.guim.co.uk/images/favicons/023dafadbf5ef53e0865e4baaaa32b3b/windows_tile_144_b.png" />
+ <meta name="apple-itunes-app" content="app-id=409128287, app-argument=https://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings, affiliate-data=ct=newsmartappbanner&amp;pt=304191" />
+ <link rel="publisher" href="https://plus.google.com/113000071431138202574" />
+ <meta name="author" content="Eleanor Ainge Roy" />
+ <meta name="thumbnail" content="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_320_4800_2880/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=de14b9e41664fc607682ca4c52297557" />
+ <meta name="keywords" content="Oceans,New Zealand,Environment,Asia Pacific,World news,Whales,Cetaceans,Marine life,Wildlife" />
+ <meta name="news_keywords" content="Oceans,New Zealand,Environment,Asia Pacific,World news,Whales,Cetaceans,Marine life,Wildlife" />
+ <meta property="og:url" content="http://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" />
+ <meta property="article:author" content="https://www.theguardian.com/profile/eleanor-ainge-roy" />
+ <meta property="og:image:height" content="720" />
+ <meta property="og:description" content="New Zealand’s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings" />
+ <meta property="og:image:width" content="1200" />
+ <meta property="og:image" content="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_320_4800_2880/master/4800.jpg?width=1200&amp;height=630&amp;quality=85&amp;auto=format&amp;fit=crop&amp;overlay-align=bottom%2Cleft&amp;overlay-width=100p&amp;overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&amp;s=af41545b21b557e4f57dd4221b6a7f89" />
+ <meta property="al:ios:url" content="gnmguardian://environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings?contenttype=Article&amp;source=applinks" />
+ <meta property="article:publisher" content="https://www.facebook.com/theguardian" />
+ <meta property="og:type" content="article" />
+ <meta property="al:ios:app_store_id" content="409128287" />
+ <meta property="article:section" content="Environment" />
+ <meta property="article:published_time" content="2019-01-03T07:00:02.000Z" />
+ <meta property="og:title" content="'What is the sea telling us?': Māori tribes fearful over whale strandings | Eleanor Ainge Roy" />
+ <meta property="fb:app_id" content="180444840287" />
+ <meta property="article:tag" content="Oceans,New Zealand,Environment,Asia Pacific,World news,Whales,Cetaceans,Marine life,Wildlife" />
+ <meta property="al:ios:app_name" content="The Guardian" />
+ <meta property="og:site_name" content="the Guardian" />
+ <meta property="article:modified_time" content="2019-01-16T11:16:23.000Z" />
+ <meta name="twitter:app:id:iphone" content="409128287" />
+ <meta name="twitter:app:name:googleplay" content="The Guardian" />
+ <meta name="twitter:app:name:ipad" content="The Guardian" />
+ <meta name="twitter:image" content="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_320_4800_2880/master/4800.jpg?width=1200&amp;height=630&amp;quality=85&amp;auto=format&amp;fit=crop&amp;overlay-align=bottom%2Cleft&amp;overlay-width=100p&amp;overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&amp;s=af41545b21b557e4f57dd4221b6a7f89" />
+ <meta name="twitter:site" content="@guardian" />
+ <meta name="twitter:app:url:ipad" content="gnmguardian://environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings?contenttype=Article&amp;source=twitter" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:app:name:iphone" content="The Guardian" />
+ <meta name="twitter:creator" content="@EleanorAingeRoy" />
+ <meta name="twitter:app:id:ipad" content="409128287" />
+ <meta name="twitter:app:id:googleplay" content="com.guardian" />
+ <meta name="twitter:app:url:googleplay" content="guardian://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" />
+ <meta name="twitter:app:url:iphone" content="gnmguardian://environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings?contenttype=Article&amp;source=twitter" />
+ <meta name="twitter:dnt" content="on" />
+ <meta property="fb:pages" content="10513336322" />
+ <meta property="fb:pages" content="456740217686384" />
+ <meta property="fb:pages" content="516977308337360" />
+ <script data-schema="Organization" type="application/ld+json">
+ <![CDATA[
+ {"@type":"Organization","@context":"https://schema.org","@id":"https://www.theguardian.com#publisher","name":"The Guardian","url":"https://www.theguardian.com/","logo":{"@type":"ImageObject","url":"https://uploads.guim.co.uk/2018/01/31/TheGuardian_AMP.png","width":190,"height":60},"sameAs":["https://www.facebook.com/theguardian","https://twitter.com/guardian","https://www.youtube.com/user/TheGuardian"]}
+ ]]>
+ </script>
+ <script data-schema="WebPage" type="application/ld+json">
+ <![CDATA[
+ {"@type":"WebPage","@context":"https://schema.org","@id":"https://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","potentialAction":{"@type":"ViewAction","target":"android-app://com.guardian/https/www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"}}
+ ]]>
+ </script>
+ <link rel="alternate" href="ios-app://409128287/gnmguardian/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings?contenttype=Article&amp;source=google" />
+ <style class="js-loggable">
+ <![CDATA[
+ .svg .i,
+ .svg .caption:before,
+ .svg figcaption:before,
+ .svg blockquote.quoted:before {
+ background-image: none;
+ }
+ .is-updating {
+ background-image: url(https://assets.guim.co.uk/images/f2465f9293ea046b91128035ecf4cdd5/auto-update-activity.gif);
+ }
+ .is-updating--dark {
+ background-image: url(https://assets.guim.co.uk/images/614abf55ccbb65d1bb691aa8bf64fd7f/auto-update-activity-dark.gif);
+ }
+ .tweet__user-name:before {
+ background-image: url(https://assets.guim.co.uk/images/twitter/ca807fd6567f678fc0981a4ab6904fbe/bird.svg);
+ }
+
+ .no-svg .inline-guardian-logo-160 { background-image: url(https://assets.guim.co.uk/images/logo/c53d8a40a4962863a36388902a43f279/guardian-logo-160.png); }
+ .no-svg .inline-guardian-logo-320 { background-image: url(https://assets.guim.co.uk/images/logo/951ac05886372ebb77554a9dd4ae420f/guardian-logo-320.png); }
+ .no-svg .inline-observer-logo-160 { background-image: url(https://assets.guim.co.uk/images/logo/bee4ad72a1badb16d72a86484d192a1c/observer-logo-160.png); }
+ .no-svg .inline-observer-logo-320 { background-image: url(https://assets.guim.co.uk/images/logo/c5669a2096d808752b0d5798be09ab0f/observer-logo-320.png); }
+ ]]>
+ </style><!--[if (lt IE 9)&(!IEMobile)]>
+
+
+
+
+
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/eb62cca790bf39c9be47fc3d9919f4f7/old-ie.head.content.garnett.css" media="only x" />
+ <noscript>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/eb62cca790bf39c9be47fc3d9919f4f7/old-ie.head.content.garnett.css" />
+ </noscript>
+
+
+
+
+
+
+
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/868fb833aa43e1487b89b403fb22dadd/old-ie.content.garnett.css" media="only x" />
+ <noscript>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/868fb833aa43e1487b89b403fb22dadd/old-ie.content.garnett.css" />
+ </noscript>
+
+
+<![endif]-->
+ <!--[if (IE 9)&(!IEMobile)]>
+
+
+
+
+
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/50ad04ea6231f4d652efee3b04ac9b85/ie9.content.garnett.css" media="only x" />
+ <noscript>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/50ad04ea6231f4d652efee3b04ac9b85/ie9.content.garnett.css" />
+ </noscript>
+
+
+
+
+
+
+
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/5aa0ef42dcd50c05a5d265ef1aa0ce65/ie9.head.content.garnett.css" media="only x" />
+ <noscript>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/5aa0ef42dcd50c05a5d265ef1aa0ce65/ie9.head.content.garnett.css" />
+ </noscript>
+
+
+<![endif]-->
+ <!--[if (gt IE 9)|(IEMobile)]><!-->
+
+ <style class="js-loggable">
+ <![CDATA[
+
+
+
+ html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:0.0625rem dotted}b,strong{font-weight:bold}dfn{font-style:italic}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 0}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;-webkit-font-smoothing:antialiased}button{overflow:visible}button,select{text-transform:none}.button{outline:0}button,html input[type='button'],input[type='reset'],input[type='submit']{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type='checkbox'],input[type='radio']{box-sizing:border-box;padding:0}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{height:auto}input[type='search']{-webkit-appearance:textfield;box-sizing:content-box}input[type='search']::-webkit-search-cancel-button,input[type='search']::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{overflow-y:scroll}html.iframed{overflow-y:auto}html.iframed--overflow-hidden{overflow:hidden}body{background-color:#ffffff}.is-modern .has-membership-access-requirement{visibility:hidden !important}::-moz-selection{background:#ffe500;color:#121212}::selection{background:#ffe500;color:#121212}head{font-family:'mobile'}@media (min-width: 30em){head{font-family:'mobileLandscape'}}@media (min-width: 46.25em){head{font-family:'tablet'}}@media (min-width: 61.25em){head{font-family:'desktop'}}@media (min-width: 71.25em){head{font-family:'leftCol'}}@media (min-width: 81.25em){head{font-family:'wide'}}body:after{border:0 !important;clip:rect(0 0 0 0) !important;height:0.0625rem !important;margin:-0.0625rem !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:0.0625rem !important;content:'mobile'}@media (min-width: 30em){body:after{content:'mobileLandscape'}}@media (min-width: 46.25em){body:after{content:'tablet'}}@media (min-width: 61.25em){body:after{content:'desktop'}}@media (min-width: 71.25em){body:after{content:'leftCol'}}@media (min-width: 81.25em){body:after{content:'wide'}}.dateline{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#767676}@media (min-width: 46.25em){.dateline{font-size:0.875rem;line-height:1.25rem}}.dateline i{vertical-align:baseline}.relative-timestamp{display:block;color:#767676;margin:0}.relative-timestamp span{display:inline-block}.relative-timestamp__icon{vertical-align:-0.125rem}ol,ul{list-style-position:inside}a,button,input[type='button'],input[type='submit']{-ms-touch-action:manipulation;touch-action:manipulation}html{font-family:"Guardian Text Egyptian Web",Georgia,serif;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}body{line-height:1.5;color:#121212}html,body{text-rendering:optimizeSpeed}.should-kern body{text-rendering:optimizeLegibility;-webkit-font-feature-settings:'kern';font-feature-settings:'kern';-webkit-font-kerning:normal;font-kerning:normal;-webkit-font-variant-ligatures:common-ligatures;font-variant-ligatures:common-ligatures}h1,h2,h3,h4,h5,h6{margin:0}blockquote{margin:0}p{margin-top:0;margin-bottom:0.5rem}h3{font-size:1.0625rem;line-height:1.5rem;font-family:"Guardian Text Egyptian Web",Georgia,serif;font-weight:normal;margin-bottom:0.4375rem}.type-5{font-size:1.125rem;line-height:1.5rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal}.social-icon{width:1.875rem;height:1.875rem;border:0.0625rem solid #121212;padding:0;box-sizing:content-box;background-color:transparent}.social-icon,.social-icon:active,.social-icon:focus,.social-icon:hover{text-decoration:none;color:#121212}.u-unstyled,.inline-list,.linkslist{margin:0;list-style:none}a,.u-fauxlink{color:#005689;cursor:pointer;text-decoration:none}a:hover,a:focus,.u-fauxlink:hover,.u-fauxlink:focus{text-decoration:underline}a:active,.u-fauxlink:active{color:#00b2ff;text-decoration:none}.u-h{border:0 !important;clip:rect(0 0 0 0) !important;height:0.0625rem !important;margin:-0.0625rem !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:0.0625rem !important}@media (max-width: 19.99em){.hide-until-mobile{display:none !important}}@media (max-width: 29.99em){.hide-until-mobile-landscape{display:none !important}}@media (max-width: 46.24em){.hide-until-tablet{display:none !important}}@media (max-width: 71.24em){.hide-until-leftcol{display:none !important}}@media (max-width: 81.24em){.hide-until-wide{display:none !important}}@media (max-width: 61.24em){.hide-until-desktop{display:none !important}}@media (min-width: 30em){.hide-from-mobile-landscape{display:none !important}}@media (min-width: 46.25em){.hide-from-tablet{display:none !important}}@media (min-width: 61.25em){.hide-from-desktop{display:none !important}}@media (min-width: 71.25em){.hide-from-leftcol{display:none !important}}@media (min-width: 81.25em){.hide-from-wide{display:none !important}}.is-hidden,[hidden]{display:none !important}@media (min-width: 46.25em){.mobile-only{display:none !important}}.hide-on-mobile{display:none !important}@media (min-width: 46.25em){.hide-on-mobile{display:block !important}}.hide-on-mobile-inline{display:none !important}@media (min-width: 46.25em){.hide-on-mobile-inline{display:inline !important}}@media (min-width: 20em) and (max-width: 61.24em){.hide-on-tablet{display:none !important}}.u-cf:after,.u-cf:before{content:'';display:table}.u-cf:after{clear:both}.u-baseline-top{margin-top:0.75rem}.skip:focus,.skip:active{font-size:80%;display:block;color:#041f4a;text-decoration:none;position:static !important;width:100% !important;height:1.125rem !important;text-align:center}.u-responsive-ratio{width:100%;padding-bottom:60%;position:relative;overflow:hidden}.u-responsive-ratio img,.u-responsive-ratio object,.u-responsive-ratio embed,.u-responsive-ratio iframe,.u-responsive-ratio svg,.u-responsive-ratio video{width:100%;height:100%;position:absolute;top:0;left:0}.u-responsive-aligner{margin:0 auto;width:100%}.u-responsive-ratio--hd{padding-bottom:56.25%}.u-responsive-ratio--letterbox{padding-bottom:40%}.u-text-hyphenate{word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.u-test-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.u-button-reset{display:block;margin:0;padding:0;border:0;width:100%;background:transparent}.u-button-reset:focus{outline:0}.u-underline{text-decoration:none !important;border-bottom:0.0625rem solid #dcdcdc;transition:border-color .15s ease-out}.u-underline:hover,.u-underline:focus{border-color:#6e99b3}.u-underline:active{border-color:#00b2ff}.u-nobr{white-space:nowrap}.flushp{padding:0 !important}.flushp--top{padding-top:0 !important}.meta-button{background:transparent;border:0;margin:0;padding:0}.u-font-weight-normal{font-weight:normal}.u-vertical-align-middle-icon svg{vertical-align:middle}.u-faux-block-link{position:relative}.u-faux-block-link a,.u-faux-block-link abbr[title],.u-faux-block-link__promote{position:relative;z-index:1}.u-faux-block-link__overlay{top:0;right:0;bottom:0;left:0;overflow:hidden;text-indent:200%;white-space:nowrap;background:rgba(0,0,0,0)}a.u-faux-block-link__overlay{position:absolute;z-index:0;opacity:0}a.u-faux-block-link__overlay:focus{outline:none}.u-faux-block-link--hover .u-faux-block-link__cta{text-decoration:underline}dt{font-weight:bold}menu,ol,ul{padding:0;margin-left:1.5625rem}nav ul,nav ol{list-style:none;list-style-image:none}.inline-list__item{display:inline-block}.inline-icon{fill:#ffffff}.inline-icon svg{overflow:visible}.inline-icon--light-grey{fill:#dcdcdc}.inline-icon--black{fill:#121212}.inline-close--small svg{height:100%;width:45%}.inline-tone-fill{fill:#005689}.inline-icon__fallback{display:none}.inline-icon__fallback{display:none !important}.no-svg .inline-icon{display:none !important}.no-svg .inline-icon__fallback{display:block !important}.gs-container{position:relative;margin:0 auto}@media (min-width: 46.25em){.gs-container{max-width:46.25rem}}@media (min-width: 61.25em){.gs-container{max-width:61.25rem}}@media (min-width: 71.25em){.gs-container{max-width:71.25rem}}@media (min-width: 81.25em){.gs-container{max-width:81.25rem}}@media (max-width: 29.99em){.content__head:not(.tonal__head--tone-dead):not(.tonal__head--tone-live):not(.tonal__head--tone-media):not(.content__head--crossword):not(.content__head--interactive){margin-right:-0.625rem;margin-left:-0.625rem}}@media (min-width: 30em) and (max-width: 41.24em){.content__head:not(.tonal__head--tone-dead):not(.tonal__head--tone-live):not(.tonal__head--tone-media):not(.content__head--crossword):not(.content__head--interactive){margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width: 41.25em) and (max-width: 46.24em){.media-primary,.content__head{margin-left:-1.25rem;margin-right:-1.25rem}}@media (max-width: 61.24em){.nav-is-open{overflow:hidden;width:100%}}@media (min-width: 61.25em){.nav-is-open{overflow-x:hidden}}.new-header{background-color:#052962;position:relative}.new-header:not(.new-header--slim){margin-bottom:0}@media (min-width: 46.25em){.new-header{display:block}}@media (min-width: 81.25em){.has-page-skin .new-header .gs-container{width:61.25rem}}.new-header__inner:after,.new-header__inner:before{content:'';display:table}.new-header__inner:after{clear:both}.new-header__edition-container{position:absolute;top:0;z-index:1072;-webkit-transform:translateX(100%);transform:translateX(100%)}@media (min-width: 61.25em){.new-header__edition-container{right:7.5rem;width:6.875rem}}@media (min-width: 81.25em){body:not(.has-page-skin) .new-header__edition-container{right:12.3125rem;width:12.3125rem}}.new-header__edition-container .top-bar__item__seperator{margin-left:0}.new-header__menu-toggle{display:block;outline:0;position:relative}@media (max-width: 61.24em){.new-header__menu-toggle{position:absolute;right:0.3125rem;bottom:3rem}}@media (max-width: 61.24em) and (min-width: 22.5em){.new-header__menu-toggle{right:0.3125rem;bottom:-0.1875rem}}@media (max-width: 61.24em) and (min-width: 30em){.new-header__menu-toggle{right:1.125rem}}@media (max-width: 61.24em) and (min-width: 46.25em){.new-header__menu-toggle{bottom:0.1875rem}}@media (max-width: 61.24em){.new-header--slim .new-header__menu-toggle{top:0.1875rem;bottom:auto}}.new-header__menu-toggle:active{outline:0}.new-header__logo{float:right;margin-top:0.625rem;margin-right:3.375rem;margin-bottom:1.5rem}@media (min-width: 22.5em){.new-header__logo{margin-right:0.625rem}}@media (min-width: 30em){.new-header__logo{margin-right:1.25rem}}@media (min-width: 61.25em){.new-header__logo{margin-top:0.3125rem;margin-bottom:1.125rem;position:relative;z-index:1071}}@media (min-width: 81.25em){body:not(.has-page-skin) .new-header__logo{margin-right:6rem}}.new-header--slim .new-header__logo{position:absolute;margin:0;right:2.625rem;top:0.1875rem;z-index:1070}@media (min-width: 30em){body:not(.has-page-skin) .new-header--slim .new-header__logo{margin-right:0;right:3.25rem}}@media (min-width: 61.25em){body:not(.has-page-skin) .new-header--slim .new-header__logo{right:1.25rem}}@media (min-width: 61.25em){.new-header--slim.new-header--open .new-header__logo{z-index:1072}}.inline-the-guardian-roundel__svg{height:2.625rem;width:2.625rem}.inline-the-guardian-roundel__svg path:nth-child(1){fill:#fff}.inline-the-guardian-roundel__svg path:nth-child(2){fill:#052962}.inline-the-guardian-logo__svg{display:block;height:2.75rem;width:8.4375rem}@media (min-width: 22.5em){.inline-the-guardian-logo__svg{height:3.5rem;width:10.9375rem}}@media (min-width: 46.25em){.inline-the-guardian-logo__svg{height:4.5rem;width:14rem}}@media (min-width: 61.25em){.inline-the-guardian-logo__svg{height:5.9375rem;width:18.4375rem}}.inline-the-guardian-logo__svg path{fill:#fff}.new-header--slim{height:3rem}.menu{background-color:#052962;box-sizing:border-box;font-size:1.25rem;left:0;line-height:1;margin-right:1.6875rem;padding-bottom:1.5rem;top:0;z-index:1070}@media (max-width: 61.24em){.menu{-webkit-transform:translateX(-110%);transform:translateX(-110%);transition:-webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);-webkit-overflow-scrolling:touch;box-shadow:0.1875rem 0 1rem rgba(0,0,0,0.4);bottom:0;height:100%;overflow:auto;padding-top:0.375rem;position:fixed;right:0;transition:-webkit-transform 0.2s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.2s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.2s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.2s cubic-bezier(0.23, 1, 0.32, 1);will-change:transform}}@media (min-width: 22.5em){.menu{margin-right:1.8125rem}}@media (min-width: 30em){.menu{margin-right:2.5625rem}}@media (min-width: 61.25em){.menu{display:none;position:absolute;padding-bottom:0;padding-top:0;top:100%;left:0;right:0;width:100%}@supports (width: 100vw){.menu{left:50%;right:50%;width:100vw;margin-left:-50vw;margin-right:-50vw}}.new-header--slim .menu{top:2.625rem}}@media (max-width: 61.24em){.new-header--open .menu{-webkit-transform:translateX(0%);transform:translateX(0%);transition:-webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1)}}@media (min-width: 61.25em){.new-header--open .menu{display:block}}x:-o-prefocus .menu{display:none}.menu__inner{box-sizing:border-box}@media (max-width: 61.24em){.menu__inner.gs-container{max-width:none}}@media (min-width: 61.25em){.menu__inner{background-color:#052962;border:0.0625rem solid #506991;border-bottom:0;border-top:0;box-sizing:border-box;padding:0 1.25rem}.new-header--slim .menu__inner{border-color:transparent}}.menu__overlay{background-color:rgba(0,0,0,0.5);height:100%;left:0;opacity:0;position:fixed;top:0;transition:opacity 0.2s cubic-bezier(0.23, 1, 0.32, 1);width:0;z-index:1069}.new-header--open .menu__overlay{opacity:1;width:100%}@media (min-width: 61.25em){.menu__overlay{display:none}}.menu-group{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.125rem;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0 0 0.75rem;position:relative}@media (min-width: 61.25em){.menu-group{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:0}}@media (max-width: 61.24em){[aria-expanded='false'] ~ .menu-group{display:none}}.menu-group--primary{padding-top:0}@media (min-width: 61.25em){.menu-group--primary{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-order:1;-ms-flex-order:1;order:1}}.menu-group--secondary{background-color:#041f4a;margin-top:0;padding-top:0}@media (min-width: 61.25em){.menu-group--secondary{background-color:transparent;padding-bottom:0;width:100%}}.menu-group--membership{padding-bottom:0;position:relative}.menu-group--editions,.menu-group--membership{padding-bottom:0}.menu-group--editions .menu-group,.menu-group--membership .menu-group{background-color:#041f4a}@media (min-width: 61.25em){.menu-group--footer{bottom:0;left:42.4375rem;padding-left:0.625rem;position:absolute;top:0;width:8.375rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .menu-group--footer{left:50.5625rem;width:10rem}}@media (min-width: 61.25em){.menu-group--footer:before,.menu-group--primary>.menu-item:not(:first-child):before,.menu-group--brand-extensions:before{content:'';position:absolute;left:0;top:0;bottom:0;border-left:0.0625rem solid #506991}}.menu-group--brand-extensions{position:absolute;right:1.875rem;top:-2.625rem;bottom:0;padding:2.625rem 1.25rem 0.75rem 0.625rem;width:8.1875rem}@media (min-width: 71.25em){body:not(.has-page-skin) .menu-group--brand-extensions{width:8.75rem}}@media (min-width: 81.25em){body:not(.has-page-skin) .menu-group--brand-extensions{width:18.75rem;padding-top:0.625rem}}.menu-item{box-sizing:border-box;overflow:hidden;position:relative;width:100%}@media (min-width: 61.25em){.menu-group--primary>.menu-item{float:left;overflow:visible;width:8.375rem;padding:0 0.625rem 0.75rem}.menu-group--primary>.menu-item:first-child{padding-left:0;width:7.6875rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .menu-group--primary>.menu-item{width:10rem}body:not(.has-page-skin) .menu-group--primary>.menu-item:first-child{width:9.3125rem}}.menu-item-divider{height:0.0625rem;width:100%;background:#506991;border:0;margin:0.375rem 0 0 3.125rem}@media (min-width: 46.25em){.menu-item-divider{margin-left:3.75rem}}@media (min-width: 61.25em){.menu-item-divider{margin-left:0.375rem 0}}.menu-item__title{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background-color:transparent;border:0;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:1.25rem;outline:none;padding:0.5rem 1.9375rem 0.5rem 3.125rem;position:relative;text-align:left;width:100%}.menu-group--membership .menu-item__title{color:#ffe500;font-weight:700}@media (min-width: 46.25em){.menu-item__title{padding-left:3.75rem}}@media (min-width: 61.25em){.menu-item__title{font-size:1rem;line-height:1.2;padding:0.375rem 0}}.menu-item__title:hover,.menu-item__title:focus{color:#ffe500;text-decoration:none}.menu-item__title:focus{text-decoration:underline}.menu-item__title>*{pointer-events:none}@media (max-width: 61.24em){.menu-group--primary>*:not(:last-child)>.menu-item__title:not([aria-expanded='true']):after,.menu-item__title[data-link-name='nav2 : The Guardian app']:not([aria-expanded='true']):after,.menu-item__title[data-link-name='nav2 : facebook']:not([aria-expanded='true']):after,.menu-group--footer>*:first-child .menu-item__title:not([aria-expanded='true']):after,.menu-group--membership>*:first-child .menu-item__title:not([aria-expanded='true']):after{background-color:#506991;bottom:0;content:'';display:block;height:0.0625rem;left:3.125rem;right:0;position:absolute}}@media (max-width: 61.24em) and (min-width: 46.25em){.menu-group--primary>*:not(:last-child)>.menu-item__title:not([aria-expanded='true']):after,.menu-item__title[data-link-name='nav2 : The Guardian app']:not([aria-expanded='true']):after,.menu-item__title[data-link-name='nav2 : facebook']:not([aria-expanded='true']):after,.menu-group--footer>*:first-child .menu-item__title:not([aria-expanded='true']):after,.menu-group--membership>*:first-child .menu-item__title:not([aria-expanded='true']):after{left:3.75rem}}@media (max-width: 61.24em){.menu-item__title[data-link-name='nav2 : The Guardian app'],.menu-item__title[data-link-name='nav2 : facebook'],.menu-group--footer>*:first-child .menu-item__title{margin-top:1.5rem}.menu-item__title[data-link-name='nav2 : The Guardian app']:after,.menu-item__title[data-link-name='nav2 : facebook']:after,.menu-group--footer>*:first-child .menu-item__title:after{bottom:auto;top:0}}@media (max-width: 61.24em){.menu-group--membership>*:first-child .menu-item__title:not([aria-expanded='true']):after{bottom:auto;top:0}}.menu-group--primary>.menu-item>.menu-item__title{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:700;color:#fff;padding-bottom:1.125rem;padding-top:0.375rem}.menu-item--brand-extension{margin-right:0;margin-top:-0.375rem;padding-bottom:0}.menu-item__title--brand-extension{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:700}@media (min-width: 81.25em){body:not(.has-page-skin) .menu-item__title--brand-extension{font-size:1.5rem;line-height:1.6875rem;padding-top:0.3125rem}}.menu-item__icon,.menu-item__toggle{left:1.5625rem;position:absolute}@media (min-width: 46.25em){.menu-item__icon,.menu-item__toggle{left:2.1875rem}}@media (min-width: 61.25em){.menu-item__icon,.menu-item__toggle{display:none}}.menu-item__toggle{margin-top:-0.25rem}[aria-expanded='true']>.menu-item__toggle{margin-top:0.125rem}.menu-item__toggle:before{border:0.125rem solid currentColor;border-top:0;border-left:0;content:'';display:inline-block;height:0.5rem;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0.5rem}[aria-expanded='true']>.menu-item__toggle:before{-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.menu-item__icon{margin-left:-0.1875rem}.menu-item__icon .inline-icon__svg{fill:currentColor}.menu-item__icon .inline-home__svg{height:1rem;width:1rem}.menu-item__icon .inline-log-off__svg{height:.8em}.menu-item__icon .inline-share-facebook__svg,.menu-item__icon .inline-share-twitter__svg{margin-left:-0.375rem;margin-top:-0.3125rem}.menu-search{box-sizing:border-box;display:block;margin-left:0.8125rem;max-width:23.75rem;position:relative;width:100%;margin-bottom:1.5rem;margin-right:2.5625rem}@media (min-width: 46.25em){.menu-search{margin-left:1.375rem}}.menu-search__search-box{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background-color:rgba(255,255,255,0.1);border:0;border-radius:62.5rem;box-sizing:border-box;color:#fff;font-size:1.25rem;height:2.25rem;padding-left:2.375rem;vertical-align:middle;width:100%}.menu-search__search-box::-webkit-input-placeholder{color:#fff}.menu-search__search-box::-moz-placeholder{color:#fff}.menu-search__search-box::-ms-input-placeholder{color:#fff}.menu-search__search-box::placeholder{color:#fff}.menu-search__search-box:focus{outline:none;padding-right:2.5rem}.menu-search__search-box:focus::-webkit-input-placeholder{opacity:0}.menu-search__search-box:focus::-moz-placeholder{opacity:0}.menu-search__search-box:focus::-ms-input-placeholder{opacity:0}.menu-search__search-box:focus::placeholder{opacity:0}.menu-search__glass{position:absolute;left:0.625rem;top:0.4375rem}.menu-search__glass .inline-search-36__svg{fill:#fff;height:1.375rem;width:1.375rem}.menu-search__submit{background:transparent;border:0;bottom:0;cursor:pointer;display:block;opacity:0;pointer-events:none;position:absolute;right:0;top:0;width:3.125rem}.menu-search__submit:before,.menu-search__submit:after{border:0.125rem solid #fff;border-left:0;border-top:0;content:'';display:block;position:absolute;right:0.875rem}.menu-search__submit:before{height:0.75rem;top:0.6875rem;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);width:0.75rem}@media (min-width: 61.25em){.menu-search__submit:before{top:0.875rem}}.menu-search__submit:after{border-right:0;top:1.0625rem;width:1.25rem}.menu-search__search-box:focus ~ .menu-search__submit,.menu-search__submit:focus,.menu-search__submit:active{opacity:1;outline:none;pointer-events:all}.pillars{clear:right;margin:0;padding:0 0 0 0.625rem}.new-header:not(.new-header--slim) .pillars:after{content:'';border:0.0625rem solid #506991;border-bottom:0;position:absolute;bottom:0;left:0;right:0;height:2.25rem}@media (max-width: 46.24em){.new-header:not(.new-header--slim) .pillars:after{border-left:0;border-right:0}}@media (min-width: 46.25em){.new-header:not(.new-header--slim) .pillars:after{height:3rem}}@media (min-width: 61.25em){.new-header:not(.new-header--slim) .pillars:after{height:2.625rem}}@media (min-width: 30em){.pillars{padding-left:1.25rem}}@media (min-width: 61.25em){.new-header--open .pillars{z-index:1070}}@media (max-width: 46.24em){.new-header--slim .pillars{display:none}}.pillars__item{display:block;float:left}@media (max-width: 29.99em){.pillars__item{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center}}@media (min-width: 61.25em){.pillars__item{width:8.375rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .pillars__item{width:10rem}}.pillars__item:first-child{margin-left:-1.25rem}@media (min-width: 61.25em){.pillars__item:first-child{width:9rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .pillars__item:first-child{width:10.625rem}}.pillars__item:first-child .pillar-link{padding-left:1.25rem}.pillars__item:first-child .pillar-link:before{content:none}.pillar-link{box-sizing:border-box;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;color:#fff;cursor:pointer;display:block;font-size:0.9625rem;height:2.25rem;line-height:1;padding:0.5625rem 0.3125rem 0;position:relative;overflow:hidden;z-index:1}@media (min-width: 22.5em){.pillar-link{font-size:0.98125rem;padding:0.5625rem 0.25rem 0}}@media (min-width: 23.125em){.pillar-link{font-size:1rem;padding:0.5625rem 0.3125rem 0}}@media (min-width: 30em){.pillar-link{font-size:1.125rem;padding:0.4375rem 0.25rem 0}}@media (min-width: 46.25em){.pillar-link{font-size:1.375rem;padding-top:0.6875rem;height:3rem;padding-right:1.25rem;padding-left:0.625rem}.new-header--slim .pillar-link{height:3rem;padding-top:0.6875rem}}@media (min-width: 61.25em){.pillar-link{padding-top:0.4375rem;height:2.625rem}}@media (min-width: 81.25em){body:not(.has-page-skin) .pillar-link{font-size:1.5rem}}.pillar-link:before,.pillar-link:not(.pillar-link--dropdown):after{bottom:0;content:'';display:block;left:0;position:absolute}.pillar-link:before{border-left:0.0625rem solid #506991;top:0;z-index:1}@media (min-width: 46.25em){.pillar-link:before{bottom:1.0625rem}}@media (min-width: 61.25em){.pillar-link:before{bottom:.6em}.new-header--open .pillar-link:before{bottom:0}}.pillar-link:after{border-top:0.25rem solid currentColor;left:0.0625rem;right:0;top:-0.25rem;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out, -webkit-transform .3s ease-in-out}.pillar-link:hover,.pillar-link:focus{color:#fff;text-decoration:none}.pillar-link:hover:after,.pillar-link:focus:after{-webkit-transform:translateY(0.25rem);transform:translateY(0.25rem)}@media (min-width: 61.25em){.new-header--open .pillar-link:hover,.new-header--open .pillar-link:focus{color:#ffe500}.new-header--open .pillar-link:after{-webkit-transform:translateY(0.25rem);transform:translateY(0.25rem)}}.pillar-link--current-section:after{-webkit-transform:translateY(0.25rem);transform:translateY(0.25rem)}.pillar-link--dropdown__icon{border:0.0625rem solid currentColor;border-left:transparent;border-top:transparent;display:inline-block;height:0.375rem;margin-left:0.125rem;-webkit-transform:translateY(-0.1875rem) rotate(45deg);transform:translateY(-0.1875rem) rotate(45deg);transition:-webkit-transform 250ms ease-out;transition:transform 250ms ease-out;transition:transform 250ms ease-out, -webkit-transform 250ms ease-out;vertical-align:middle;width:0.375rem}.pillar-link--dropdown:hover .pillar-link--dropdown__icon{-webkit-transform:translateY(0) rotate(45deg);transform:translateY(0) rotate(45deg)}.new-header--open .pillar-link--dropdown .pillar-link--dropdown__icon{-webkit-transform:translateY(0.0625rem) rotate(-135deg);transform:translateY(0.0625rem) rotate(-135deg)}.new-header--open .pillar-link--dropdown:hover .pillar-link--dropdown__icon{-webkit-transform:translateY(-0.125rem) rotate(-135deg);transform:translateY(-0.125rem) rotate(-135deg)}.pillar-link--sections{color:#fff;font-weight:300;float:left;padding-right:0.3125rem;transition:color 250ms ease-out}.pillar-link--sections:hover,.pillar-link--sections:focus{color:#ffe500}.new-header__cta-bar{position:absolute;top:1.875rem;left:0.625rem}.hide-support-messaging .new-header__cta-bar,.is-recent-contributor .new-header__cta-bar{display:none}@media (min-width: 22.5em){.new-header__cta-bar{top:2.3125rem}}@media (min-width: 30em){.new-header__cta-bar{left:1.25rem}}@media (min-width: 46.25em){.new-header__cta-bar{top:0}}@media (min-width: 61.25em){.new-header__cta-bar{max-width:18.75rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .new-header__cta-bar{max-width:31.25rem}}.new-header--slim .new-header__cta-bar{top:0.625rem}@media (min-width: 46.25em){.new-header--slim .new-header__cta-bar{display:none}}.cta-bar__text{display:block;margin:0.1875rem 0 0.5625rem}@media (max-width: 46.24em){.cta-bar__text{border-top:0.0625rem solid #506991;padding-top:0.1875rem}}.cta-bar__heading{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;color:#ffe500;font-weight:700}@media (min-width: 61.25em){.cta-bar__heading{font-size:1.5rem;line-height:1.6875rem}}@media (min-width: 71.25em){body:not(.has-page-skin) .cta-bar__heading{font-size:2.125rem;line-height:2.375rem}}.cta-bar__subheading{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#fff;font-weight:400;line-height:1.2;margin-top:0.1875rem}.cta-bar__cta{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:700;background-color:#ffe500;border-radius:1.125rem;box-sizing:border-box;color:#052962;display:block;line-height:1;height:1.8125rem;padding:0.375rem 0.6875rem 0;margin-bottom:0.375rem;margin-right:0.625rem;position:relative;float:left}@media (min-width: 22.5em){.cta-bar__cta{padding:0.375rem 2rem 0 0.625rem}}.cta-bar__cta .inline-arrow-right{margin:0 -0.125rem 0 0}@media (min-width: 46.25em){.cta-bar__cta{height:2rem;padding:0.4375rem 2.125rem 0 0.75rem}}.cta-bar__cta .inline-arrow-right{position:absolute;height:2rem;width:2rem;right:0.1875rem;top:50%;-webkit-transform:translate(0, -50%);transform:translate(0, -50%);transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out, -webkit-transform .3s ease-in-out}@media (max-width: 22.49em){.cta-bar__cta .inline-arrow-right{display:none}}.cta-bar__cta .inline-arrow-right__svg{fill:currentColor;height:2rem;width:2rem}.cta-bar__cta:hover,.cta-bar__cta:focus{color:#052962;text-decoration:none}.cta-bar__cta:hover .inline-arrow-right,.cta-bar__cta:focus .inline-arrow-right{-webkit-transform:translate(0.1875rem, -50%);transform:translate(0.1875rem, -50%)}.new-header__top-bar{position:absolute;left:0.625rem}@media (min-width: 30em){.new-header__top-bar{left:1.25rem}}@media (min-width: 46.25em){.new-header__top-bar{left:auto;right:12.8125rem}}@media (min-width: 61.25em){.new-header__top-bar{right:16.625rem}}@media (min-width: 81.25em){body:not(.has-page-skin) .new-header__top-bar{right:21.375rem}}.top-bar__item{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:1rem;color:#fff;float:left;line-height:1;padding-top:0.375rem;position:relative;z-index:1072}.top-bar__item:hover,.top-bar__item:focus{color:#ffe500;text-decoration:none}@media (min-width: 22.5em){.top-bar__item{padding-top:0.75rem}}@media (min-width: 46.25em){.top-bar__item{padding:0.5625rem 0.41667rem}}.top-bar__commercial-items{position:relative;float:left;margin-right:0.625rem}.top-bar__item__icon__svg{fill:currentColor;float:left;height:1.125rem;width:1.125rem;margin:-0.0625rem 0.25rem 0 0}.top-bar__item__seperator{border-left:0.0625rem solid #506991;position:absolute;left:0;top:0;height:1.5rem}.new-header__user-account-container{float:left;position:relative;z-index:1072}.new-header--open .new-header__user-account-container{z-index:1068}@media (max-width: 46.24em){.dropdown--open{overflow:hidden;width:100%}}.dropdown-menu-fallback{display:none}.dropdown-menu-fallback:checked ~ .dropdown-menu{display:block}@media (max-width: 46.24em){.dropdown-menu-fallback[aria-expanded=true] ~ .my-account__overlay{background:linear-gradient(to bottom, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.2) 30%);border:0;position:fixed;display:block;left:0;right:0;top:0;bottom:0;width:100%}}.dropdown-menu{display:none;position:absolute;top:1.875rem;right:0;width:13.75rem;background-color:#fff;border-radius:0.1875rem;padding:0.375rem 0;margin:0;box-shadow:0 0 0 0.0625rem rgba(0,0,0,0.1);z-index:1073}.dropdown-menu>hr{height:0;border:0;border-top:0.0625rem solid #ededed;display:block;top:0;margin:-0.0625rem 0 0 1.25rem}@media (max-width: 46.24em){.dropdown-menu{position:fixed;border-radius:0;top:2.25rem;left:0;right:0;width:auto;max-height:calc(100% - 3.125rem);overflow:auto}.dropdown-menu>hr{margin-left:0.625rem}}@media (max-width: 46.24em) and (min-width: 22.5em){.dropdown-menu{top:2.125rem}}@media (max-width: 46.24em) and (min-width: 30em){.dropdown-menu>hr{margin-left:1.25rem}}.dropdown-menu--open{display:block}.dropdown-menu__title{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#121212;cursor:pointer;display:block;letter-spacing:.01rem;outline:none;padding:0.4375rem 1.25rem 0.9375rem 0.625rem;position:relative;box-sizing:border-box;margin-top:-0.0625rem}@media (min-width: 30em){.dropdown-menu__title{padding-left:1.25rem}}.dropdown-menu__title:hover,.dropdown-menu__title:focus{color:#121212;background-color:#ededed;text-decoration:none}.dropdown-menu__title:before{content:'';border-top:0.0625rem solid #ededed;display:block;position:absolute;top:0;left:1.25rem;right:0}.dropdown-menu.dropdown-menu--light .dropdown-menu__title:before{display:none}.dropdown-menu__item:first-child .dropdown-menu__title:before{content:none}.dropdown-menu__title .inline-icon{position:relative;display:inline-block;height:.8em;width:1em}.dropdown-menu__title .inline-icon>svg{position:absolute;height:.8em;width:.8em}.dropdown-menu__title .inline-icon>svg g{fill:#121212}@supports (fill: currentColor){.dropdown-menu__title .inline-icon>svg g{fill:currentColor}}.dropdown-menu__title--active{font-weight:bold}.dropdown-menu__title--active:after{content:'';border:0.125rem solid #333;border-top:0;border-right:0;position:absolute;top:0.8125rem;right:1.25rem;width:0.625rem;height:0.25rem;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.gsc-search-box{position:relative !important}.gsc-search-button,.gsib_a{margin:0 !important;padding:0 !important;width:0 !important}.gsc-search-button-v2{padding:0.4375rem 0.5625rem 0.5rem !important;left:0 !important}.gsc-search-button-v2 svg{fill:#052962 !important;height:1.25rem !important;width:1.25rem !important}.gsst_a{padding:0.8125rem 0 0 0.6875rem !important}.sc-control-cse{padding:0.1875rem 0 !important}.gsib_b,.gsc-search-button-v2{border:0 !important;box-sizing:border-box !important;height:2.625rem !important;width:2.625rem !important;margin:0 !important;background-color:transparent !important;position:absolute !important;right:0 !important;top:0 !important}.gsc-input-box{border:0 !important;box-shadow:none !important}.gsc-input-box .gsc-input{padding:0 !important;margin:0 !important;box-sizing:border-box !important;background-position-x:2.5rem !important;text-indent:5.625rem !important;border:0.0625rem solid #dcdcdc !important;border-radius:62.4375rem !important;height:2.625rem !important;box-shadow:none !important;width:31.25rem !important}.gsc-input-box .gsc-input:hover,.gsc-input-box .gsc-input:focus{outline:0}.gsc-input-box .gsc-input:focus{text-indent:2.625rem !important}.gsc-input-box .gsc-input:not(:placeholder-shown){text-indent:2.625rem !important}.gstl_50,.gssb_c{z-index:1071 !important}.gsc-completion-container,.gsc-input{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding:0 !important;margin:0 !important}.subnav{background-color:#ffffff;height:2.25rem;overflow:hidden;position:relative}@media (min-width: 46.25em){.subnav{height:2.625rem}}.subnav .gs-container{box-sizing:border-box;border:0.0625rem solid #dcdcdc;border-top:0;border-bottom:0}.subnav .gs-container:after,.subnav .gs-container:before{content:'';display:table}.subnav .gs-container:after{clear:both}.footer__primary .subnav .gs-container{border-top:0.0625rem solid #dcdcdc}.subnav--expanded{height:auto}.subnav--expanded .subnav-link--toggle-more{float:left}.subnav__list{box-sizing:border-box;line-height:1;list-style:none;margin:0;max-width:calc(100% - 3.75rem);padding:0 0.3125rem}@media (min-width: 30em){.subnav__list{max-width:calc(100% - 4.375rem);padding:0 0.9375rem}}.subnav--expanded .subnav__list{padding-bottom:0.75rem;max-width:100%;width:100%}.subnav__item:not(.subnav__item--toggle-more){display:block;float:left}.subnav__item--parent:after{content:'';display:inline-block;width:0;height:0;border-top:0.375rem solid transparent;border-bottom:0.375rem solid transparent;border-left:0.625rem solid #121212}.new-header__multiline{background:#fff}.new-header__multiline .gs-container:after{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:bottom;background-size:0.0625rem 0.8125rem;background-color:#ffffff;content:'';display:block;height:0.8125rem;border:0.0625rem solid #dcdcdc;border-top:0;border-bottom:0}.subnav--comment{background-color:#fef9f5}.subnav--comment .gs-container{border-color:#dcdcdc}.subnav--comment ~ .new-header__multiline{background-color:#fef9f5}.subnav--comment ~ .new-header__multiline .gs-container:after{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:bottom;background-size:0.0625rem 0.8125rem;background-color:#fef9f5;border-color:#dcdcdc}.subnav--media{background-color:#121212}.subnav--media .gs-container{border-color:#333}.subnav--media ~ .new-header__multiline{background-color:#121212}.subnav--media ~ .new-header__multiline .gs-container:after{background-image:repeating-linear-gradient(to bottom, #333, #333 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:bottom;background-size:0.0625rem 0.8125rem;background-color:#121212;border-color:#333}.subnav--media .subnav-link{color:#fff}.subnav-link{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#121212;display:block;height:2.25rem;line-height:2.25rem;padding:0 0.3125rem;position:relative}@media (min-width: 46.25em){.subnav-link{height:2.625rem;line-height:2.625rem}}@media (max-width: 46.24em){.subnav-link:after{border-bottom:0.0625rem solid #dcdcdc;bottom:-0.0625rem;content:'';left:0.3125rem;position:absolute;right:-624.9375rem}}.subnav__item--parent .subnav-link{display:inline-block;font-weight:700}.subnav-link:hover,.subnav-link:focus{color:#333}.subnav-link--toggle-more{background:transparent;border:0;color:#767676}.subnav-link--toggle-more:hover,.subnav-link--toggle-more:focus{color:#767676;outline:0}.subnav-link--current-section,.subnav-link--current-section:hover,.subnav-link--current-section:focus{font-weight:700}.veggie-burger{background-color:#ffe500;cursor:pointer;display:block;height:2.625rem;width:2.625rem;position:relative;border:0;border-radius:50%;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1069}.new-header--open .veggie-burger{z-index:1071}x:-o-prefocus .veggie-burger{display:none}.veggie-burger__icon{top:50%;display:block;margin-top:-0.0625rem;left:0;right:0;margin-left:auto;margin-right:auto}.veggie-burger__icon,.veggie-burger__icon:before,.veggie-burger__icon:after{background-color:currentColor;content:'';height:0.125rem;left:0;position:absolute;width:1.25rem}.veggie-burger__icon:before{top:-0.375rem}.veggie-burger__icon:after{bottom:-0.375rem}.new-header--open .veggie-burger__icon{background-color:transparent}.new-header--open .veggie-burger__icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.new-header--open .veggie-burger__icon:after{bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}@media (max-width: 61.24em){.veggie-burger-fallback:checked ~ .menu{-webkit-transform:translateX(0%);transform:translateX(0%);transition:-webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 0.4s cubic-bezier(0.23, 1, 0.32, 1)}}@media (min-width: 61.25em){.veggie-burger-fallback:checked ~ .menu{display:block}}@media (max-width: 61.24em){.veggie-burger-fallback:checked ~ .menu__overlay{opacity:1;width:100%}}.veggie-burger-fallback:checked ~ .veggie-burger{z-index:1071}.veggie-burger-fallback:checked ~ .veggie-burger .veggie-burger__icon{background-color:transparent}.veggie-burger-fallback:checked ~ .veggie-burger .veggie-burger__icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.veggie-burger-fallback:checked ~ .veggie-burger .veggie-burger__icon:after{bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}@media (min-width: 61.25em){.veggie-burger-fallback:checked ~ .veggie-burger .veggie-burger__label{border:0 !important;clip:rect(0 0 0 0) !important;height:0.0625rem !important;margin:-0.0625rem !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:0.0625rem !important}}.veggie-burger-fallback:focus ~ .new-header__menu-toggle .pillar-link{color:#fff}.main-menu-toggle-button{border:0;padding:0;background:none}.edition-picker-toggle-button{border:0;background:none;text-align:left}@media (max-width: 46.24em){.dropdown--open .my-account{z-index:1071}}.my-account-toggle-button{border:0;background:none;text-align:left}@media (max-width: 46.24em){.my-account-toggle-button{padding-left:0}}.my-account--icon svg{height:1.125rem;width:1.125rem}@media (min-width: 22.5em){.my-account--icon svg{height:1.4375rem;width:1.4375rem}}@media (max-width: 46.24em){.dropdown--open .my-account--icon:before,.dropdown--open .my-account--icon:after{content:'';display:block;position:absolute;left:50%;bottom:0.4375rem;width:0;height:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:1071}.dropdown--open .my-account--icon:before{border-left:0.4375rem solid transparent;border-right:0.4375rem solid transparent;border-bottom:0.4375rem solid rgba(0,0,0,0.1)}.dropdown--open .my-account--icon:after{border-left:0.375rem solid transparent;border-right:0.375rem solid transparent;border-bottom:0.375rem solid #fff}}.subnav__list[data-pillar-title='News'] .subnav__item--parent:after{border-left-color:#c70000}.subnav__list[data-pillar-title='News'] .subnav-link:hover,.subnav__list[data-pillar-title='News'] .subnav-link:focus{color:#c70000;text-decoration:none}.subnav__list[data-pillar-title='Opinion'] .subnav__item--parent:after{border-left-color:#e05e00}.subnav__list[data-pillar-title='Opinion'] .subnav-link:hover,.subnav__list[data-pillar-title='Opinion'] .subnav-link:focus{color:#e05e00;text-decoration:none}.subnav__list[data-pillar-title='Sport'] .subnav__item--parent:after{border-left-color:#0084c6}.subnav__list[data-pillar-title='Sport'] .subnav-link:hover,.subnav__list[data-pillar-title='Sport'] .subnav-link:focus{color:#0084c6;text-decoration:none}.subnav__list[data-pillar-title='Culture'] .subnav__item--parent:after{border-left-color:#a1845c}.subnav__list[data-pillar-title='Culture'] .subnav-link:hover,.subnav__list[data-pillar-title='Culture'] .subnav-link:focus{color:#a1845c;text-decoration:none}.subnav__list[data-pillar-title='Lifestyle'] .subnav__item--parent:after{border-left-color:#bb3b80}.subnav__list[data-pillar-title='Lifestyle'] .subnav-link:hover,.subnav__list[data-pillar-title='Lifestyle'] .subnav-link:focus{color:#bb3b80;text-decoration:none}.pillar-link.pillar-link--News:after{border-color:#ff4e36}.pillar-link.pillar-link--Opinion:after{border-color:#ff7f0f}.pillar-link.pillar-link--Sport:after{border-color:#00b2ff}.pillar-link.pillar-link--Culture:after{border-color:#eacca0}.pillar-link.pillar-link--Lifestyle:after{border-color:#ffabdb}.monocolumn-wrapper{padding-left:0.625rem;padding-right:0.625rem}@media (min-width: 30em){.monocolumn-wrapper{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 46.25em){.monocolumn-wrapper{max-width:38.75rem;margin-left:auto;margin-right:auto}}.monocolumn-wrapper .page-header{margin-left:0;margin-right:0}@media (min-width: 61.25em){.monocolumn-wrapper--no-limit-desktop{max-width:none}}.component{margin-bottom:1.25rem}.component--rhc{display:none}@media (min-width: 61.25em){.component--rhc{display:block;margin-top:2.25rem}}.component--rhc:first-child{margin-top:0}.component--rhc:last-child{margin-bottom:2.25rem}@media (min-width: 46.25em){.gs-container{max-width:46.25rem}}@media (min-width: 61.25em){.gs-container{max-width:61.25rem}}@media (min-width: 71.25em){.gs-container{max-width:71.25rem}}@media (min-width: 81.25em){.gs-container{max-width:81.25rem}}.img--inline{float:left;clear:left;width:7.125rem}@media (min-width: 30em){.img--inline{width:8.75rem}}.img--inline figcaption{padding-top:0.25rem;word-wrap:break-word}.loading,.preload-msg{padding:3.125rem 3.125rem 15.625rem;text-align:center}.loading .loading__link,.loading .accessible-link,.preload-msg .loading__link,.preload-msg .accessible-link{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:inline-block}.loading .loading__animation,.preload-msg .is-updating{display:block;margin:0.625rem auto}.l-side-margins{position:relative;height:100%}@media (min-width: 46.25em){.l-side-margins:after,.l-side-margins:before{content:'';position:absolute;z-index:1;top:0;height:100%;width:0;pointer-events:none}.l-side-margins:before{left:0;border-right:0.0625rem solid rgba(118,118,118,0.3)}.l-side-margins:after{right:0;border-left:0.0625rem solid rgba(118,118,118,0.3)}.l-side-margins:before,.l-side-margins:after{width:calc((100% - 46.25rem) / 2)}}@media (min-width: 61.25em){.l-side-margins:before,.l-side-margins:after{width:calc((100% - 61.25rem) / 2)}}@media (min-width: 71.25em){.l-side-margins:before,.l-side-margins:after{width:calc((100% - 71.25rem) / 2)}}@media (min-width: 81.25em){.l-side-margins:before,.l-side-margins:after{width:calc((100% - 81.25rem) / 2)}.has-page-skin .l-side-margins{margin-left:auto;margin-right:auto;width:61.25rem}}@media (min-width: 46.25em){.l-side-margins--media:after,.l-side-margins--media:before{background:rgba(0,0,0,0.25);border-color:#333}.container__banding+.container__banding .l-side-margins--media:after,.container__banding+.container__banding .l-side-margins--media:before{background:rgba(18,18,18,0.15)}}@media (min-width: 46.25em){.l-side-margins--paidfor:after,.l-side-margins--paidfor:before{border-color:#999}}@media (min-width: 46.25em){.has-flex .l-row{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.has-flex .l-row--reverse{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.has-flex .l-row__item{-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;width:0}.has-flex .l-row__item--boost-1{-webkit-flex-grow:1.5;-ms-flex-positive:1.5;flex-grow:1.5}.has-flex .l-row__item--boost-2{-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}}@media (max-width: 46.24em){.has-flex .l-row--layout-m{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.has-flex .l-row--layout-m .l-row__item{-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.has-flex .l-row--layout-m .l-row__item--break-m{-webkit-flex:1 100%;-ms-flex:1 100%;flex:1 100%}}.has-no-flex .l-row{width:58.75rem}.has-no-flex .l-row:after,.has-no-flex .l-row:before{content:'';display:table}.has-no-flex .l-row:after{clear:both}.has-no-flex .l-row__item{float:left}.has-no-flex .l-row--items-2 .l-row__item{width:29.375rem}.has-no-flex .l-row--items-3 .l-row__item{width:19.58333rem}.has-no-flex .l-row--items-4 .l-row__item{width:14.6875rem}.popup--default{background:#fff;border-radius:0.1875rem;box-shadow:0 0 0 0.0625rem rgba(0,0,0,0.1);left:0;top:2.6875rem;padding:0}.popup{box-sizing:border-box;position:absolute;margin:0;list-style:none;min-width:8.75rem}@media (min-width: 30em){.popup{right:auto;bottom:auto;top:2.8125rem}}@media (min-width: 46.25em){.brand-bar__item--has-control .popup{left:2.875rem}}.l-header--is-slim .brand-bar__item--has-control .popup{left:0}@media (min-width: 46.25em){.brand-bar__item--right .popup{left:auto;right:0}}.popup__group{z-index:3;margin:0;padding:0 0.625rem}.popup__group-header{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#767676;padding:0.375rem 0.625rem;border-top:0.0625rem solid #dcdcdc;padding-bottom:0;margin:0}.popup__group-header:first-of-type{border-top:0}.has-popup{cursor:default;position:relative}.popup-container{position:relative;z-index:11}.popup__toggle{cursor:pointer}.popup__toggle:after{content:'';display:inline-block;width:0.25rem;height:0.25rem;-webkit-transform:translateY(-0.125rem) rotate(45deg);transform:translateY(-0.125rem) rotate(45deg);border:0.0625rem solid currentColor;border-left:transparent;border-top:transparent;margin-left:0.125rem;vertical-align:middle;-webkit-backface-visibility:hidden;transition:-webkit-transform 250ms ease-out;transition:transform 250ms ease-out;transition:transform 250ms ease-out, -webkit-transform 250ms ease-out}.popup__toggle:hover,.popup__toggle:focus{text-decoration:none}.popup__toggle:hover:after,.popup__toggle:focus:after{-webkit-transform:translateY(0) rotate(45deg);transform:translateY(0) rotate(45deg)}.popup__toggle.is-active:after,.is-active>.popup__toggle:after,.popup__toggle[aria-expanded=true]:after,[aria-expanded=true] ~ .popup__toggle:after,.is-not-modern .brand-bar__item--has-control:hover .popup__toggle:after,.is-not-modern .is-signed-in.brand-bar__item--profile:hover .popup__toggle:after{-webkit-transform:translateY(0.0625rem) rotate(-135deg);transform:translateY(0.0625rem) rotate(-135deg)}.popup__toggle.is-active:hover:after,.is-active>.popup__toggle:hover:after,.popup__toggle[aria-expanded=true]:hover:after,[aria-expanded=true] ~ .popup__toggle:hover:after,.is-not-modern .brand-bar__item--has-control:hover .popup__toggle:hover:after,.is-not-modern .is-signed-in.brand-bar__item--profile:hover .popup__toggle:hover:after{-webkit-transform:translateY(-0.0625rem) rotate(-135deg);transform:translateY(-0.0625rem) rotate(-135deg)}@media (max-width: 46.24em){.l-header .popup__toggle:after{display:none}}.l-header--is-slim.l-header .popup__toggle:after{display:none}.popup__item{display:block;line-height:2.25rem}.popup__item a{border-bottom:0.0625rem solid #dcdcdc}.popup__item:last-child{border-bottom:0}.popup__item,.popup__action{text-align:left}.popup .brand-bar__item--action,.popup .brand-bar__item--action:hover{display:block;white-space:nowrap;color:#121212;line-height:2.25rem}.popup .brand-bar__item--inline-action{display:inline-block !important;margin-right:0.3125rem}.brand-bar__item--profile:not(.is-signed-in) .popup__toggle:before,.brand-bar__item--profile:not(.is-signed-in) .popup__toggle:after{display:none !important}.popup--search{background-color:#fff;border-radius:0.1875rem;box-shadow:0 0 0 0.0625rem rgba(0,0,0,0.1);padding:0.75rem 1.25rem 0;top:1.875rem;z-index:1071;outline:0;left:auto;right:15.625rem}@media (min-width: 81.25em){body:not(.has-page-skin) .popup--search{right:20.3125rem}}.ad-slot{position:relative;z-index:1010;overflow:initial}.js-off .ad-slot{display:none}.aside-slot-container{min-height:17.125rem}.aside-slot-container>:last-child{padding-bottom:0;margin-bottom:1.5rem}.ad-slot--dark{background-color:#181818}.ad-slot--right,.ad-slot--comments{position:-webkit-sticky;position:sticky;top:0}.has-sticky .paidfor-band ~ .content__main .ad-slot--right,.has-sticky .paidfor-band ~ .content__main .ad-slot--comments{top:2.875rem}.ad-slot--right.is-sticky,.ad-slot--comments.is-sticky{width:18.75rem}.ad-slot__label{font-size:0.75rem;line-height:1.25rem;position:relative;height:1.5rem;background-color:#f6f6f6;padding:0 0.5rem;border-top:0.0625rem solid #dcdcdc;color:#767676;text-align:left;box-sizing:border-box;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.ad-slot--dark .ad-slot__label{color:#dcdcdc;border-top-color:#333;background-color:transparent}.ad-slot--sky .ad-slot__label{width:10rem}.top-banner-ad-container{background-color:#fff;border-bottom:0.0625rem solid #dcdcdc;top:0}.top-banner-ad-container:not(.top-banner-ad-container--not-sticky){position:-webkit-sticky;position:sticky;z-index:1020}@media (min-width: 61.25em){.top-banner-ad-container:not(.top-banner-ad-container--not-sticky){z-index:1080}}.top-banner-ad-container--fabric{overflow:hidden}.sticky-top-banner-ad{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);contain:layout;z-index:1090;position:fixed;top:0}.sticky-top-banner-ad--animate{will-change:transform;transition:height 1s cubic-bezier(0, 0, 0, 0.985)}.ad-slot--top-banner-ad{text-align:center}@media (min-width: 81.25em){.ad-slot--top-banner-ad .ad-slot__label{margin:0}}@media (min-width: 81.25em){.has-page-skin .ad-slot--top-banner-ad{text-align:center}}.ad-slot--crossword-banner,.ad-slot--top-banner-ad-desktop{margin:0 auto;min-height:5.625rem;padding-bottom:1.125rem;padding-top:1.125rem;text-align:left;display:table}@media (max-width: 46.24em){.ad-slot--crossword-banner,.ad-slot--top-banner-ad-desktop{display:none}}.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{box-sizing:content-box;margin-left:0.625rem;margin-right:0.625rem}@media (min-width: 30em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{margin-left:1.25rem;margin-right:1.25rem}}@media (min-width: 41.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{margin-left:auto;margin-right:auto;width:38.75rem}}@media (min-width: 46.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 46.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{width:43.75rem}}@media (min-width: 61.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{width:58.75rem}}@media (min-width: 71.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{width:68.75rem}}@media (min-width: 81.25em){.ad-slot--crossword-banner.ad-slot--fabric>.ad-slot__label,.ad-slot--top-banner-ad-desktop.ad-slot--fabric>.ad-slot__label{width:78.75rem}}.ad-slot--crossword-banner.ad-slot--fluid,.ad-slot--top-banner-ad-desktop.ad-slot--fluid{width:100%}.ad-slot--crossword-banner .ad-slot__label,.ad-slot--top-banner-ad-desktop .ad-slot__label{margin-top:-1.125rem}.ad-slot--inline,.ad-slot--container-inline,.ad-slot--container-inline.ad-slot--fluid,.ad-slot--gallery-inline,.ad-slot--liveblog-inline{width:18.75rem;margin:0.75rem auto;min-width:18.75rem;min-height:17.125rem;text-align:center}@media (min-width: 30em){.ad-slot--inline,.ad-slot--container-inline,.ad-slot--container-inline.ad-slot--fluid,.ad-slot--gallery-inline,.ad-slot--liveblog-inline{width:20rem}}@media (min-width: 46.25em){.ad-slot--inline,.ad-slot--container-inline,.ad-slot--container-inline.ad-slot--fluid,.ad-slot--gallery-inline,.ad-slot--liveblog-inline{width:auto}}@media (min-width: 30em){.ad-slot--liveblog-inline,.ad-slot--container-inline,.ad-slot--container-inline.ad-slot--fluid{margin-top:0}}@media (min-width: 46.25em){.ad-slot--liveblog-inline,.ad-slot--container-inline,.ad-slot--container-inline.ad-slot--fluid{margin:0 0.625rem}}.ad-slot--gallery-inline{background-color:#121212;margin-left:0}@media (min-width: 30em){.ad-slot--gallery-inline{width:18.75rem}}@media (min-width: 46.25em){.ad-slot--gallery-inline{width:auto}}@media (min-width: 61.25em){.ad-slot--gallery-inline,.ad-slot--gallery-inline .ad-slot__label{text-align:left}}.ad-slot--right,.ad-slot--inline,.ad-slot--container-inline{background-color:#f6f6f6}@media (min-width: 46.25em){.ad-slot--right,.ad-slot--inline,.ad-slot--container-inline{width:18.75rem}}@media (min-width: 46.25em){.ad-slot--inline{float:right;margin-top:0.25rem;margin-left:1.25rem}}@media (min-width: 46.25em) and (max-width: 71.24em){.ad-slot--inline{clear:left}}.ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop) .ad-slot__content{margin:0 auto}@media (min-width: 46.25em){.ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop){position:relative;height:auto}.content-footer .ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop){width:18.75rem}.linkslist-container .ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop){position:absolute;top:0;right:0}.ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop) .ad-slot__label{padding:0 1.25rem}.ad-slot--container-inline:not(.ad-slot--fluid):not(.ad-slot--gc):not(.ad-slot--mostpop) .ad-slot__content{position:absolute;right:0;bottom:0;left:0;top:1.5rem;height:15.625rem}}@media (min-width: 46.25em){.ad-slot--liveblog-inline{padding-bottom:1.5rem}.ad-slot--liveblog-inline>div:not(.ad-slot__label){width:18.75rem;margin-left:auto;margin-right:auto}}.ad-slot--liveblog-inline{background-color:#ededed}.ad-slot--liveblog-inline .ad-slot__label{color:#767676;border-top-color:#dcdcdc}.ad-slot--mpu-banner-ad{display:none;width:18.75rem;min-height:17.125rem;margin-bottom:1.5rem}@media (min-width: 61.25em){.ad-slot--mpu-banner-ad{display:block}}.ad-slot--adfeature{background-color:#dcdcdc}.ad-slot--outstream{background:transparent}@media (min-width: 20em){.ad-slot--outstream{width:18.75rem;height:auto;min-height:auto}}@media (min-width: 41.25em){.ad-slot--outstream{float:none;width:38.75rem;height:23.375rem;margin:0.25rem 0 0}.ad-slot--outstream>div.ad-slot__label{margin-left:2.1875rem;margin-right:2.1875rem}}@media (min-width: 81.25em){.has-page-skin .ad-slot--commercial-component,.has-page-skin .ad-slot--commercial-component-high{margin-left:auto;margin-right:auto;width:61.25rem}}.fc-container--commercial .ad-slot--commercial-component-high{margin-bottom:1.5rem}.ad-slot--im{float:left;width:8.125rem}@media (min-width: 30em){.ad-slot--im{width:13.75rem}}.ad-slot--im:not(.ad-slot--rendered){width:0;height:0}.ad-slot--im.ad-slot--rendered{margin:0.3125rem 0.625rem 0.375rem 0}@media (min-width: 30em){.ad-slot--im.ad-slot--rendered{margin-bottom:0.75rem;margin-right:1.25rem}}@media (min-width: 30em){.ad-slot--inline-book,.ad-slot--books-inline{width:8.75rem}}@media (min-width: 46.25em) and (max-width: 71.24em){.fc-container--sponsored .fc-container:first-child .fc-container__header+.fc-container__body,.fc-container--paid-content .fc-container:first-child .fc-container__header+.fc-container__body,.fc-container--sponsored .fc-container__header+.fc-container__body,.fc-container--paid-content .fc-container__header+.fc-container__body{margin-top:4.875rem}}.ad-slot--page-skin{height:0;overflow:hidden}@media (min-width: 20em) and (max-width: 81.24em){.has-page-skin{background-image:none !important}}.ad-slot--fluid{min-height:15.625rem;line-height:0.625rem;padding:0;margin:0}.ad-slot--fluid:not(.ad-slot--im):not(.ad-slot--carrot):not(.ad-slot--offset-right){width:100%}.ad-slot--fluid.ad-slot--commercial-component-high,.ad-slot--fluid.ad-slot--commercial-component-high>.ad-slot__content>iframe{transition:height 1s}@media (min-width: 20em) and (max-width: 29.99em){.ad-slot--fluid.ad-slot--liveblog-inline{margin-left:-0.625rem;margin-right:-0.625rem}}@media (min-width: 30em) and (max-width: 46.24em){.ad-slot--fluid.ad-slot--liveblog-inline{margin-left:-1.25rem;margin-right:-1.25rem}}.ad-slot--carrot{min-height:0;padding:0;margin:0.3125rem 1.25rem 0.75rem 0;float:left;clear:both}@media (max-width: 29.99em){.ad-slot--carrot{width:8.125rem;margin-bottom:0.375rem;margin-right:0.625rem}}@media (min-width: 30em){.ad-slot--carrot{width:13.75rem}}@media (min-width: 81.25em){.ad-slot--carrot{margin-left:-15rem}}.ad-slot--gc .ad-slot__label{display:none}.ad-slot--fabric-v1{min-height:15.625rem}.ad-slot--fabric{overflow:hidden;width:auto;min-height:15.625rem;padding-left:0;padding-right:0;padding-bottom:0}@media (min-width: 81.25em){.ad-slot--fabric.ad-slot--top-banner-ad-desktop{margin-left:0}}.ad-slot--fabric-v1,.ad-slot--fluid250{width:auto;margin-left:0;padding:0}.ad-slot--fabric-v1 .ad-slot__label,.ad-slot--fluid250 .ad-slot__label{display:none}@media (min-width: 61.25em){.ad-slot--fluid250{min-height:15.625rem}}@media (min-width: 61.25em){.ad-slot--offset-right{margin-right:-20rem}}@media (min-width: 81.25em){.ad-slot--offset-right{margin-right:-25rem}}.ad-slot--offset-right.ad-slot--sky{width:10rem;min-width:10rem}.ad-slot--survey{height:0}.ad-slot--unruly{width:100%}@media (min-width: 46.25em){.ad-slot--unruly{float:none;margin-left:0}}.media:after,.media:before,.media__body:after,.media__body:before{content:'';display:table}.media:after,.media__body:after{clear:both}.media__img{margin-right:0.9375rem}.media__img img{display:block}.media__container--hidden{display:none !important}.media__placeholder--active{display:block;position:relative}.media__container--active{display:block}.media__placeholder--hidden{display:none !important}.page-header{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;padding:0 0 1rem;margin:0 0.625rem 0.25rem;border-bottom:0.0625rem dotted #dcdcdc}@media (min-width: 30em){.page-header{margin-left:1.25rem;margin-right:1.25rem}}.page-sub-header{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;padding:0.125rem 0 0.25rem;margin-bottom:0.75rem}.no-indent-article__zone .page-sub-header,.monocolumn-wrapper .page-sub-header,.fc-container__inner .page-sub-header{margin-left:0;margin-right:0}.page-sub-header>a{display:block}.message{padding:0.6875rem;background-color:#ffffee}.rounded-icon{border-radius:62.5rem;display:inline-block;vertical-align:middle;position:relative}.centered-icon svg{top:0;bottom:0;right:0;left:0;margin:auto;position:absolute}.rich-link{background-color:#ededed;margin:0;position:relative;overflow:hidden}.rich-link a{color:inherit}.rich-link .u-faux-block-link--hover{background-color:#ededed}.rich-link__title{font:inherit;line-height:inherit;padding:0}.rich-link .rich-link__header{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:500;padding:0.25rem 0.3125rem 0.5em;box-sizing:border-box;min-height:2.25rem}.rich-link__read-more{padding-left:0.3125rem}.rich-link__arrow{display:inline-block}.rich-link__read-more-text{font-size:0.875rem;line-height:1.0625rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;display:inline-block;height:1.875rem;line-height:1.625rem;padding-left:0.125rem;vertical-align:top;font-weight:500}.rich-link__link .u-faux-block-link__overlay{z-index:2}.rich-link__container{position:relative}.rich-link__container:before{background-color:#00b2ff;content:'';position:absolute;top:0;left:0;right:0;height:0.0625rem;z-index:2}.rich-link__container:after{content:'';display:table;clear:both}.element-rich-link{float:left;margin:0.3125rem 1.25rem 0.75rem 0;clear:both}@media (min-width: 61.25em){.element-rich-link{clear:left}}@media (max-width: 29.99em){.element-rich-link{width:8.125rem;margin-bottom:0.375rem;margin-right:0.625rem}.element-rich-link .rich-link__header{font-size:0.875rem;line-height:1.0625rem}}@media (min-width: 30em){.element-rich-link{width:13.75rem}}@media (min-width: 71.25em){.element-rich-link{margin-left:-10rem}.element-rich-link.element--supporting{width:18.75rem}}@media (min-width: 81.25em){.element-rich-link{margin-left:-15rem}.element-rich-link.element--supporting{width:23.75rem}}.reveal-caption{position:absolute;right:0.3125rem;width:2rem;height:2rem;z-index:1;background-color:rgba(18,18,18,0.6);border-radius:50%}.reveal-caption:hover{background-color:#121212}.reveal-caption--img{bottom:0.375rem}.caption--main{max-width:33.75rem;padding:0.5rem 0.625rem 1.5rem}@media (min-width: 46.25em){.caption--main{max-width:38.75rem;padding-left:0;padding-right:0}}@media (min-width: 61.25em){.caption--main{max-width:none}}@media (max-width: 46.24em){.caption--main.caption--img{position:absolute;left:0;right:0;bottom:0;background:rgba(18,18,18,0.8);color:#ffffff;display:none;padding:0.375rem 2.5rem 0.75rem 0.625rem;max-width:100%}.caption--main.caption--img a{color:currentColor}}@media (max-width: 46.24em){.caption--main.caption--video,.content__main-column--image .caption--main{padding-bottom:0}}@media (max-width: 46.24em){.reveal-caption__checkbox:checked ~ .caption--main{display:block}.reveal-caption__checkbox:checked ~ .reveal-caption{background-color:#121212}.reveal-caption__checkbox:checked ~ .reveal-caption:hover{background-color:#121212}.reveal-caption__checkbox:focus ~ .reveal-caption{background-color:#121212}}.linkslist-container{position:relative;margin:0 !important}@media (min-width: 46.25em){.linkslist-container{margin-top:0.5625rem}}.linkslist-container.tone-feature:before{background:#fec8d3}.linkslist-container.tone-comment:before{background:#767676}.linkslist-container.tone-media:before{background:#ffe500}.linkslist-container.show-more--hidden,.linkslist-container.show-more--hidden:before{display:none}.linkslist{margin-top:0;width:100%}@media (min-width: 46.25em) and (max-width: 61.24em){.linkslist .fc-slice__item{width:50%}.linkslist .fc-slice__item:nth-child(2n+1){clear:both}.linkslist .fc-slice__item:nth-child(2n+1):before{border:0}.linkslist .fc-slice__item:nth-child(2n+1):nth-last-child(-n+4),.linkslist .fc-slice__item:nth-child(2n+2):nth-last-child(-n+3){padding-bottom:0}.linkslist .fc-slice__item:nth-child(2n+1):nth-last-child(-n+2),.linkslist .fc-slice__item:nth-child(2n+2):last-child{padding-top:0.75rem}}@media (min-width: 61.25em){.linkslist .fc-slice__item{width:33.33333%}.linkslist .fc-slice__item:nth-child(3n+1){clear:both}.linkslist .fc-slice__item:nth-child(3n+1):before{border:0}.linkslist .fc-slice__item:nth-child(3n+1):nth-last-child(-n+6),.linkslist .fc-slice__item:nth-child(3n+2):nth-last-child(-n+5),.linkslist .fc-slice__item:nth-child(3n+3):nth-last-child(-n+4){padding-bottom:0}.linkslist .fc-slice__item:nth-child(3n+1):nth-last-child(-n+3),.linkslist .fc-slice__item:nth-child(3n+2):nth-last-child(-n+2),.linkslist .fc-slice__item:nth-child(3n+3):last-child{padding-top:0.75rem}}@media (min-width: 46.25em){.has-flex-wrap .linkslist .fc-slice__item{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}}@media (min-width: 61.25em){.has-flex-wrap .linkslist .fc-slice__item{-webkit-flex-basis:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}}.linkslist .item--has-cutout{padding-bottom:1.875rem}.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{overflow:hidden;position:relative;margin-left:0.625rem;margin-right:0.625rem}@media (min-width: 30em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{margin-left:1.25rem;margin-right:1.25rem}}@media (min-width: 46.25em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{margin-left:auto;margin-right:auto;padding-left:1.25rem;padding-right:1.25rem;width:38.75rem}}@media (min-width: 46.25em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{width:43.75rem}}@media (min-width: 61.25em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{width:58.75rem}}@media (min-width: 71.25em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{width:68.75rem}}@media (min-width: 81.25em){.fc-container__inner,.facia-container__inner,.fc-container__pagination,.index-page-header{width:78.75rem}}@media (min-width: 46.25em){.fc-container__inner--full-span,.facia-container__inner--full-span{width:46.25rem}}@media (min-width: 61.25em){.fc-container__inner--full-span,.facia-container__inner--full-span{width:61.25rem}}@media (min-width: 71.25em){.fc-container__inner--full-span,.facia-container__inner--full-span{width:71.25rem}}@media (min-width: 81.25em){.fc-container__inner--full-span,.facia-container__inner--full-span{width:81.25rem}}@media (min-width: 46.25em){.fc-container__inner--full-span,.facia-container__inner--full-span{padding-left:0;padding-right:0}}.js-on .js-hidden,.js-off .js-visible,.is-modern .modern-hidden,.is-not-modern .modern-visible{display:none}.is-off{display:none}.current{font-weight:bold}.is-on{display:block}.has-cursor{cursor:pointer}.maxed{width:100%}.shut>.panel{overflow:hidden;position:relative;max-height:0;padding-top:0}.update{float:right}.is-updating{display:none;width:2.5rem;height:1.25rem;background-size:100%;margin-top:1.125rem}.is-updating.is-active{display:inline-block}.is-scroll-blocked{overflow:hidden}.is-updating-cursor{cursor:wait}body.is-updating-js .u-block-during-update{pointer-events:none}.is-updating--dark{width:2.25rem;height:0.75rem}.is-live-icon{padding:0.0625rem 0.25rem 0.125rem;margin:0.0625rem 0.1875rem 0 0;font-size:0.625rem;font-style:normal;line-height:1;color:#ffffff;background-color:#ec1c1c;display:inline-block}.id--signed-out .sign-in-required{display:none}.is-sticky{position:fixed;top:0}.svg .i-play-icon-gold,.svg-i-play-icon-gold{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNC4zTC40IDAgMCAuM3Y4LjRsLjQuM0wxMCA0Ljd2LS40eiIgZmlsbD0iI2ZiMCIvPjwvc3ZnPg==);background-position:0 0;width:0.625rem;height:0.5625rem}.svg .i-play-icon-grey,.svg-i-play-icon-grey{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNC4zTC40IDAgMCAuM3Y4LjRsLjQuM0wxMCA0Ljd2LS40eiIgZmlsbD0iI0RDRENEQyIvPjwvc3ZnPg==);background-position:0 0;width:0.625rem;height:0.5625rem}.svg .i-card-red,.svg-i-card-red{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjEyIj48cGF0aCBmaWxsPSIjY2MyYjEyIiBkPSJNMCAwaDl2MTJIMHoiLz48L3N2Zz4=);background-position:0 0;width:0.5625rem;height:0.75rem}.svg .i-card-yellow,.svg-i-card-yellow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjEyIj48cGF0aCBmaWxsPSIjZmIwIiBkPSJNMCAwaDl2MTJIMHoiLz48L3N2Zz4=);background-position:0 0;width:0.5625rem;height:0.75rem}.svg .i-camera-black-large,.svg-i-camera-black-large{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTE4IDMuNXY4TDE2LjUgMTNoLTE1TDAgMTEuNXYtOEwxLjUgMkg1bDItMmg0bDIgMmgzLjVMMTggMy41ek05IDExYzEuOSAwIDMuNS0xLjYgMy41LTMuNVMxMC45IDQgOSA0IDUuNSA1LjYgNS41IDcuNSA3LjEgMTEgOSAxMXoiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:0.8125rem}.svg .i-camera-white-large,.svg-i-camera-white-large{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE4IDMuNXY4TDE2LjUgMTNoLTE1TDAgMTEuNXYtOEwxLjUgMkg1bDItMmg0bDIgMmgzLjVMMTggMy41ek05IDExYzEuOSAwIDMuNS0xLjYgMy41LTMuNVMxMC45IDQgOSA0IDUuNSA1LjYgNS41IDcuNSA3LjEgMTEgOSAxMXoiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:0.8125rem}.svg .i-camera-yellow-large,.svg-i-camera-yellow-large{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTE4IDMuNXY4TDE2LjUgMTNoLTE1TDAgMTEuNXYtOEwxLjUgMkg1bDItMmg0bDIgMmgzLjVMMTggMy41ek05IDExYzEuOSAwIDMuNS0xLjYgMy41LTMuNVMxMC45IDQgOSA0IDUuNSA1LjYgNS41IDcuNSA3LjEgMTEgOSAxMXoiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:0.8125rem}.svg .i-information-circle-grey,.svg-i-information-circle-grey{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjNzY3Njc2IiBkPSJNNyAwQzMuMSAwIDAgMy4xIDAgN3MzLjEgNyA3IDcgNy0zLjEgNy03LTMuMS03LTctN3ptLjkgMTBsLS4zIDFjLS40LjItMS4yLjQtMS45LjQtLjUgMC0uOC0uMS0uOC0uNiAwLS4xIDAtLjMuMS0uNEw2LjMgNmgtLjlsLjMtLjggMi43LS4zLjItLjFMNi44IDEwaDEuMXptLS4yLTUuOGMtLjYgMC0uOS0uMy0uOS0uOCAwLS42LjUtMSAxLjEtMSAuNiAwIC45LjMuOS44IDAgLjYtLjUgMS0xLjEgMXoiLz48L3N2Zz4=);background-position:0 0;width:0.875rem;height:0.875rem}.svg .i-comment-light-grey,.svg-i-comment-light-grey{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZmlsbD0iI2JkYmRiZCIgZD0iTTEzIDBsMSAxdjdsLTEgMUg3bC0yIDNINFY5SDJMMSA4VjFsMS0xaDExeiIvPjwvc3ZnPg==);background-position:0 0;width:1rem;height:1rem}.svg .i-close-icon-white,.svg-i-close-icon-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTcuNSA5TDEgMmwxLTEgNyA2LjVMMTYgMWwxIDEtNi41IDcgNi41IDctMSAxLTctNi41TDIgMTdsLTEtMSA2LjUtN3oiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:1.125rem}.svg .i-recommend,.svg-i-recommend{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggNi40NGwtMyAyLjVMNCA4bDQuNS00aDFMMTQgOGwtMSAuOTQtMy0yLjVWMTRIOFY2LjQ0eiIvPjwvc3ZnPg==);background-position:0 0;width:1.125rem;height:1.125rem}.svg .i-left-arrow,.svg-i-left-arrow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMjMiIHZpZXdCb3g9IjAgMCAyMyAyMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGUvPjxnIGZpbGw9Im5vbmUiPjxwYXRoIGQ9Ik0wIDExLjVsMTAuMjk2IDEwLjA5OS45NTktLjk1OUwzLjIgMTJIMjN2LTJIMy4yTDExLjI1NS45NiAxMC4yOTYgMCAwIDEwLjV2MSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMS4wMDEgMzIuMzEzYy0xMS43NTIgMC0yMS4zMTMtOS41NjEtMjEuMzEzLTIxLjMxMyAwLTExLjc1MSA5LjU2MS0yMS4zMTIgMjEuMzEzLTIxLjMxMiAxMS43NTEgMCAyMS4zMTIgOS41NjEgMjEuMzEyIDIxLjMxMiAwIDExLjc1Mi05LjU2MSAyMS4zMTMtMjEuMzEyIDIxLjMxM20wLTQzLjMxM0MtMS4xNS0xMS0xMS0xLjE1MS0xMSAxMXM5Ljg1IDIyLjAwMSAyMi4wMDEgMjIuMDAxQzIzLjE1MSAzMy4wMDEgMzMgMjMuMTUxIDMzIDExYzAtMTIuMTUxLTkuODQ5LTIyLTIxLjk5OS0yMiIgZmlsbD0iIzcwNzA3MCIvPjwvZz48L3N2Zz4=);background-position:0 0;width:1.4375rem;height:1.4375rem}.svg .i-right-arrow,.svg-i-right-arrow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjMiIGhlaWdodD0iMjMiIHZpZXdCb3g9IjAgMCAyMyAyMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGUvPjxnIGZpbGw9Im5vbmUiPjxwYXRoIGQ9Ik0yMyAxMS41MDFMMTIuNzA0IDIxLjZsLS45NTktLjk1OSA4LjA1NS04LjY0SDB2LTJoMTkuOEwxMS43NDUuOTYxbC45NTktLjk2TDIzIDEwLjUwMXYxIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExLjAwMSAzMi4zMTNjLTExLjc1MiAwLTIxLjMxMy05LjU2MS0yMS4zMTMtMjEuMzEzIDAtMTEuNzUxIDkuNTYxLTIxLjMxMiAyMS4zMTMtMjEuMzEyIDExLjc1MSAwIDIxLjMxMiA5LjU2MSAyMS4zMTIgMjEuMzEyIDAgMTEuNzUyLTkuNTYxIDIxLjMxMy0yMS4zMTIgMjEuMzEzbTAtNDMuMzEzQy0xLjE1LTExLTExLTEuMTUxLTExIDExczkuODUgMjIuMDAxIDIyLjAwMSAyMi4wMDFDMjMuMTUxIDMzLjAwMSAzMyAyMy4xNTEgMzMgMTFjMC0xMi4xNTEtOS44NDktMjItMjEuOTk5LTIyIiBmaWxsPSIjNzA3MDcwIi8+PC9nPjwvc3ZnPg==);background-position:0 0;width:1.4375rem;height:1.4375rem}.svg .i-information-white,.svg-i-information-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgOSAyNCI+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTS4zIDIyTDMuOSA5LjFIMS4zbC40LTEuNCA1LjYtLjkuMy4zLTQuNCAxNC44SDZMNS42IDIzYy0uOS40LTIuOC45LTQuMS45LTEuMSAwLTEuNy0uNS0xLjItMS45ek01LjUgMkM1LjUuOSA2LjQuMSA3LjMuMWMxIDAgMS42LjcgMS42IDEuNSAwIDEuMS0uOSAxLjktMS44IDEuOS0xIC4xLTEuNi0uNi0xLjYtMS41eiIvPjwvc3ZnPg==);background-position:0 0;width:0.5625rem;height:1.5rem}.svg .i-guardian-logo-160,.svg-i-guardian-logo-160{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNjAiIGhlaWdodD0iMzAiIHZpZXdCb3g9IjAgMCAzMjAgNjAiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yODQgNDVoMTZ2LTNsLTMtMS41di0yMGMxLjItLjkgMi44LTEuMSA0LjMtMS4xIDIuOCAwIDMuOC45IDMuOCA0LjF2MTdsLTMgMS41djNoMTZ2LTNsLTMtMS41di0xOWMwLTUuNy0yLjItOC4zLTcuMi04LjMtNC4xIDAtOC4xIDEuNS0xMC44IDRWMTNoLTFsLTEyLjQgMi4ydjIuN2wzLjQgMS42djIxbC0zIDEuNS0uMSAzek0yNDUuMy40Yy0zIDAtNS40IDIuNC01LjQgNS41IDAgMyAyLjQgNS40IDUuNCA1LjQgMi45IDAgNS40LTIuNCA1LjQtNS40LS4xLTMuMS0yLjUtNS41LTUuNC01LjV6TTIzNyAxNS4xdjIuOGwzIDEuNnYyMC45bC0zIDEuNXYzaDE2di0zbC0zLTEuNVYxMy4xaC0xbC0xMiAyek0yMjIuOSAzOWMtLjcuNi0xLjYgMS4xLTMuMSAxLjEtNCAwLTUuOS0zLjMtNS45LTEwLjkgMC04LjcgMi40LTExLjcgNS42LTExLjcgMS44IDAgMi43LjYgMy40IDEuNFYzOXptMC0yNC41Yy0xLjItLjktMy4yLTEuNC00LjktMS40LTcuNCAwLTE0LjUgNC4zLTE0LjUgMTYuOCAwIDExLjkgNy4xIDE1LjcgMTEuOCAxNS43IDMuOCAwIDYuNC0xLjcgNy42LTMuNGguM3YzLjNoLjlsMTEuOS0xLjR2LTIuM2wtMy4yLTEuOFYuNmgtLjhsLTEyLjYgMnYyLjhsMy40IDEuNnY3LjVoLjF6TTE4MSAxOGwzIDEuNXYyMC45bC0zIDEuNXYzaDE3di0zbC0zLjktMS41VjI0LjFjMS44LTEuNCA0LTEuOSA2LjctMS45LjkgMCAxLjYuMiAyLjIuM3YtOWMtLjMtLjEtLjctLjItMS4yLS4yLTMuMyAwLTUuOSAyLjEtNy43IDYuMlYxM0gxOTNsLTEyIDJ2M3ptLTE5LjMtLjhjMy45IDAgNSAyIDUgNS45djMuNWwtNS44IDEuMWMtNS45IDEuMS0xMC40IDMtMTAuNCA5LjMgMCA1LjEgMy41IDguNyA4LjMgOC43IDMuOCAwIDcuNC0xLjcgOC43LTQuNGguM2MuNSAzLjMgMy4zIDQuNCA2LjQgNC40IDIuNCAwIDQuOC0uNiA1LjctMS42di0ybC0zLTEuNXYtMThjMC02LjktNS05LjQtMTMuMS05LjQtNS4zIDAtOC44IDEuNC0xMS42IDIuN3Y3LjhoNC43bDItNmMuOS0uNSAyLjQtLjUgMi44LS41em0yLjMgMjIuOWMtMS45IDAtNC0xLjEtNC00LjYgMC0yLjQgMi40LTQuNiA0LjgtNWwyLjItLjV2OC41cy0xLjkgMS42LTMgMS42em0xMDAuOC0yMi45YzMuOSAwIDUgMiA1IDUuOXYzLjVsLTUuOCAxLjFjLTUuOSAxLjEtMTAuNCAzLTEwLjQgOS4zIDAgNS4xIDMuNSA4LjcgOC4zIDguNyAzLjggMCA3LjQtMS43IDguNy00LjRoLjNjLjUgMy4zIDMuMyA0LjQgNi40IDQuNCAyLjQgMCA0LjgtLjYgNS43LTEuNnYtMmwtMy0xLjV2LTE4YzAtNi45LTUtOS40LTEzLjEtOS40LTUuMyAwLTguOCAxLjQtMTEuNiAyLjd2Ny44aDQuN2wyLTZjLjgtLjUgMi4zLS41IDIuOC0uNXptMi4yIDIyLjljLTEuOSAwLTQtMS4xLTQtNC42IDAtMi40IDIuNC00LjYgNC44LTVsMi4yLS41djguNXMtMS45IDEuNi0zIDEuNnptLTEzOC43IDUuNmMuNCAwIC45IDAgMS4zLS4xIDMuNS0uMyA2LjctMiA4LjQtNC4ydjQuMWwxMi0xLjV2LTJsLTMtMlYxM2gtMWwtMTEuOSAyLjN2Mi44bDMuOSAxLjZWMzhjLTEuMS44LTIuNCAxLjMtNC4yIDEuMy0yLjUgMC00LjgtLjgtNC44LTQuM1YxM2gtMWwtMTIgMi41djIuNmw0IDEuNlYzNmMwIDUuNCAyLjIgOS43IDguMyA5Ljd6TTk2IDM4Yy0xLjIgMC0yLjUtLjgtMi41LTEuOSAwLS44LjYtMS43IDEuMy0yLjMgMS42LjUgMyAuNiA1IC42IDcuOCAwIDEzLjItMy43IDEzLjItMTAuNCAwLTMtMS4zLTQuNi0zLjItNi40TDExNSAxOXYtNmwtOC4yIDEuNmMtMS45LS43LTQuNS0xLjYtNy0xLjYtNy44IDAtMTMuMiA0LjEtMTMuMiAxMC44IDAgNC4xIDIgNy4xIDUgOC44bC4zLjJjLTEuNyAxLjItNS4zIDQtNS4zIDcuMiAwIDIuNCAxLjUgNC44IDQuOCA1LjVDODggNDYuMyA4NCA0OCA4NCA1MmMwIDQuMSA1LjkgOCAxNS41IDggMTEuOCAwIDE2LjUtNS43IDE2LjUtMTMgMC02LjEtMi44LTktOS41LTlIOTZ6bTcuNS0xNGMwIDUuNy0xLjMgNi41LTMuNSA2LjVzLTQtLjgtNC02LjVjMC01LjggMS44LTcuNSA0LTcuNXMzLjUgMiAzLjUgNy41ek05MiA1MC45Yy4xLTEuNSAxLjEtMy40IDMuNy0zLjZoOC42YzIuNSAwIDMuNyAyIDMuNyAzLjYgMCAzLjItMiA0LjQtOC4zIDQuNC01LjUgMC03LjgtMi4yLTcuNy00LjR6Ii8+PHBhdGggZmlsbD0iI0FBRDhGMSIgZD0iTTgzIDMwYzAtMTMtNS4xLTE2LjktMTMtMTYuOS05IDAtMTUgNi4yLTE1IDE2LjQgMCAxMC41IDUuNSAxNi4yIDE1LjggMTYuMiA1LjYgMCA5LjgtMi43IDExLjItNC43di0zYy0yLjEuNy0zLjkgMS4yLTcuOCAxLjItNS40IDAtOS4yLTMuMi05LjItOS4yaDE4ek02OS45IDE2LjZjMi41IDAgMy44IDEuOSAzLjggOS42bC04LjQuNWMuMi03LjkgMS44LTEwLjEgNC42LTEwLjF6TTM3IDQ1di0zbC0zLTEuNVYyMWMxLjItLjkgMy4zLTEuNyA0LjgtMS43IDIuOCAwIDQuMyAxLjUgNC4yIDQuMnYxN0w0MCA0MnYzaDE2di0zbC0zLTEuNXYtMTljMC01LjctMy4zLTguMy03LjctOC4zLTQuMSAwLTguNiAxLjMtMTEuMyAzLjhWMGgtMUwyMSAydjNsNCAxLjV2MzRMMjIgNDJ2M2gxNXpNNCAzNi40YzAgNS43IDIuOCA5LjMgOC45IDkuMyAzLjEgMCA2LjUtLjggOC40LTIuM3YtMy44Yy0uOC4zLTIuMi41LTMuMy41LTIuOSAwLTQtMS42LTQtNC42VjE5aDd2LTVoLTdWNi41TDQgOHY2bC00IDF2NGg0djE3LjR6Ii8+PC9zdmc+);background-position:0 0;width:10rem;height:1.875rem}.svg .i-observer-logo-160,.svg-i-observer-logo-160{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNjAiIGhlaWdodD0iMzAiIHZpZXdCb3g9IjAgMCAzMjAgNjAiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxMkgwVjJoMzIuOXYxMEgyMnYzM0gxMVYxMnpNNDYgMnYxMS41YzEtMS43IDMuNS0yLjYgOC42LTIuNiA3LjggMCA5LjQgNS4zIDkuNCAxMi4xdjIySDUzVjI2Yy4yLTMuMS0uNC00LjQtMy4xLTQuNC0zLjIgMC0zLjkgMS4zLTMuOSA0LjR2MTlIMzVWMmgxMXptNjIuMyAyMS41YzAtNyAuOC0xMS40IDcuMS0xMS40IDYuMSAwIDYuOSA0LjMgNi45IDExLjRzLS43IDExLjItNi44IDExLjJjLTYuMyAwLTcuMi00LjItNy4yLTExLjJ6bTcuNSAyMS41YzE1LjIgMCAxNy45LTEwLjUgMTcuOS0yMiAwLTExLjYtMi43LTIyLTE4LjQtMjJTOTYuOSAxMS41IDk2LjkgMjNjLjUgMTEuNSAzLjIgMjIgMTguOSAyMnptMzAuNi0xNi41YzAtNS4zLjgtNy40IDQuNS03LjQgMy40IDAgMy45IDEuOSAzLjkgNy40cy0uOSA3LTQuMSA3Yy0zLjYgMC00LjQtMS45LTQuMy03ek0xNDMuMyA0NWwxLjctMi41YzIuMSAxLjcgMy4xIDIuNSA5LjIgMi41IDkuOCAwIDEwLjctNy43IDEwLjctMTcgMC05LjEtLjYtMTcuMS0xMC4zLTE3LjEtNC40IDAtNyAuNi04LjcgMy4xVjJoLTEwdjQyLjVsNy40LjV6bTIyLjMtMi45bDQtOC4xYzIuNCAxLjIgNi40IDIuMyAxMC4xIDIuMyAxLjggMCAyLjQtLjcgMi40LTEuNiAwLTEuNC0xLjgtMS41LTYtMi45LTUuOS0xLjctOS4xLTMuNS05LjEtMTAuMiAwLTguNSA1LjctMTEgMTMuMy0xMSA1IDAgNy42LjcgMTAuOCAybC00LjEgOC44Yy0yLjEtLjktNC43LTEuNC03LjMtMS40LTIuMiAwLTIuNi41LTIuNiAxLjQgMCAxLjMgMS44IDEuNCA1LjEgMi40IDYuNyAxLjggOS44IDMuOSA5LjggMTAuNyAwIDcuMy01LjMgMTAuNC0xMi40IDEwLjQtNS4xLjEtMTAuMi0uNi0xNC0yLjh6bTY1LjktMzEuNmwxLjIgMy4xYzEuNi0xLjkgNC0zLjEgOS4zLTMuMVYyMWMtNi45IDAtOCAyLjEtOCA2djE3aC0xMC45VjExLjVsOC40LTF6bTEwLjQgMS41aDExLjZsNC43IDE4LjhMMjYzIDEyaDExbC0xMCAzM2gtMTIuMmwtOS45LTMzem02OC4xLTEuNWwuOCAzLjJjMS42LTEuOSAzLjktMy4yIDkuMi0zLjJWMjFjLTYuOSAwLTggMi4xLTggNnYxN2gtMTFWMTEuNWw5LTF6TTMwMC4yIDQybC00LTguM2MtMi4zIDEtNC4zIDIuMy04LjcgMi4zLTMuNC0uMy00LjctMS01LTRIMzAwYzAtMTIuNSAxLTIxLTEyLjktMjEuNC0xMS41LS40LTE1LjEgNi40LTE1LjEgMTcuMi4zIDExLjEgMyAxNy4yIDE1IDE3LjIgNS41IDAgOS44LTEgMTMuMi0zem0tOS42LTE3LjFoLTguMmMuMi0zLjMgMS4zLTQuOSA0LjUtNC44IDMuMi4xIDMuNyAxLjUgMy43IDQuOHptLTY5LjQgMTcuMmwtNC04LjNjLTIuMyAxLTQuMyAyLjMtOC43IDIuMy0zLjQtLjMtNC43LTEtNS00SDIyMWMwLTEyLjUuNS0yMS0xMi45LTIxLjQtMTEuNS0uNS0xNS4xIDYuMy0xNS4xIDE3LjEuMyAxMS4xIDMgMTcuMiAxNSAxNy4yIDUuNSAwIDkuOC0xIDEzLjItMi45em0tOS42LTE3LjJoLTguMmMuMi0zLjMgMS4zLTQuOSA0LjUtNC44IDMuMi4yIDMuNyAxLjUgMy43IDQuOHpNOTMuMiA0Mi4xbC00LTguM2MtMi4zIDEtNC4zIDIuMy04LjcgMi4zLTMuNC0uMy00LjctMS01LTRIOTNjMC0xMiAuNS0yMS0xMi45LTIxLjRDNjguNiAxMC4yIDY1IDE3IDY1IDI3LjggNjUuMyAzOC45IDY4IDQ1IDgwIDQ1YzUuNSAwIDkuOC0xIDEzLjItMi45em0tOS42LTE3LjJoLTguMmMuMi0zLjMgMS4zLTQuOSA0LjUtNC44IDMuMi4yIDMuNyAxLjUgMy43IDQuOHoiLz48L3N2Zz4=);background-position:0 0;width:10rem;height:1.875rem}.svg .i-back,.svg-i-back{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggMTQuOGw0LjUgNC4zLjUtLjUtMi0zaDguNXY0aDJ2LTVsLTEtMUgxMWwyLTMtLjUtLjZMOCAxNC4zdi41Ii8+PC9zdmc+);background-position:0 0;width:1.875rem;height:1.875rem}.svg .i-close-icon-dark-small,.svg-i-close-icon-dark-small{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTIxIDkuOGwtLjgtLjgtNS4yIDQuOEw5LjggOWwtLjguOCA0LjggNS4yTDkgMjAuMmwuOC44IDUuMi00LjggNS4yIDQuOC44LS44LTQuOC01LjJMMjEgOS44Ii8+PC9zdmc+);background-position:0 0;width:1.875rem;height:1.875rem}.svg .i-pause-icon--arts,.svg-i-pause-icon--arts{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZWFjY2EwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-icon--lifestyle,.svg .content--media:not(.paid-content).content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg-i-pause-icon--lifestyle{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmZhYmRiIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-icon--news,.svg .content--media:not(.paid-content).content--pillar-news .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-news .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-news .vjs-playing .vjs-play-control,.svg-i-pause-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmY0ZTM2IiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-icon--opinion,.svg .content--media:not(.paid-content).content--pillar-opinion .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-opinion .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-playing .vjs-play-control,.svg-i-pause-icon--opinion{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmY3ZjBmIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-icon--sport,.svg .content--media:not(.paid-content).content--pillar-sport .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-sport .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg-i-pause-icon--sport{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjMDBiMmZmIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-play-icon--arts,.svg-i-play-icon--arts{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZWFjY2EwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-icon--lifestyle,.svg .content--media:not(.paid-content).content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg-i-play-icon--lifestyle{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmZhYmRiIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-icon--news,.svg .content--media:not(.paid-content).content--pillar-news .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-news .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-news .vjs-paused .vjs-play-control,.svg-i-play-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmY0ZTM2IiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-icon--opinion,.svg .content--media:not(.paid-content).content--pillar-opinion .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-opinion .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-paused .vjs-play-control,.svg-i-play-icon--opinion{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmY3ZjBmIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-icon--sport,.svg .content--media:not(.paid-content).content--pillar-sport .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-sport .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg-i-play-icon--sport{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjMDBiMmZmIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-guardian-logo-320,.svg-i-guardian-logo-320{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iNjAiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yODQgNDVoMTZ2LTNsLTMtMS41di0yMGMxLjItLjkgMi44LTEuMSA0LjMtMS4xIDIuOCAwIDMuNy45IDMuNyA0LjF2MTdsLTMgMS41djNoMTZ2LTNsLTMtMS41di0xOWMwLTUuNy0yLjEtOC4zLTcuMS04LjMtNC4xIDAtOC4xIDEuNS0xMC44IDRWMTNoLTFsLTEyLjQgMi4ydjIuN2wzLjMgMS42djIxbC0zIDEuNXYzek0yNDUuMy40Yy0zIDAtNS40IDIuNC01LjQgNS41IDAgMyAyLjQgNS40IDUuNCA1LjQgMi45IDAgNS40LTIuNCA1LjQtNS40LS4xLTMuMS0yLjUtNS41LTUuNC01LjV6TTIzNyAxNS4xdjIuOGwzIDEuNnYyMC45bC0zIDEuNVY0NWgxNnYtMy4xbC0zLTEuNVYxMy4xaC0xbC0xMiAyek0yMjMgMzljLS43LjYtMS43IDEuMS0zLjIgMS4xLTQgMC01LjktMy4zLTUuOS0xMC45IDAtOC43IDIuNC0xMS42IDUuNi0xMS42IDEuOCAwIDIuOC42IDMuNSAxLjR2MjB6bTAtMjQuNGMtMS4yLS45LTMuMy0xLjQtNS0xLjQtNy40IDAtMTQuNSA0LjQtMTQuNSAxNi44IDAgMTEuOSA3LjEgMTUuNyAxMS44IDE1LjcgMy44IDAgNi40LTEuNyA3LjYtMy40aC4zdjMuM2guOWwxMS45LTEuNHYtMi4zbC0zLTEuOFYuNmgtMWwtMTIuNiAydjIuOGwzLjYgMS41djcuN3pNMTgxIDE4bDMgMS41djIwLjlsLTMgMS41VjQ1aDE3di0zLjFsLTQtMS41VjI0LjFjMS44LTEuNCA0LjEtMS45IDYuOC0xLjkuOSAwIDEuNi4yIDIuMi4zdi05Yy0uMy0uMS0uNy0uMi0xLjItLjItMy4zIDAtNiAyLjItNy44IDYuMlYxM2gtMWwtMTIgMnYzem0tMTkuMy0uOGMzLjkgMCA1LjMgMiA1LjMgNS45djMuNWwtNi4xIDEuMWMtNS45IDEuMS0xMC40IDIuOS0xMC40IDkuMyAwIDUuMSAzLjUgOC43IDguMyA4LjcgMy44IDAgNy40LTEuNyA4LjctNC40aC4zYy41IDMuMyAzLjMgNC40IDYuNCA0LjQgMi40IDAgNC44LS42IDUuNy0xLjZ2LTJsLTIuOS0xLjV2LTE4YzAtNy01LjItOS40LTEzLjMtOS40LTUuMyAwLTguNiAxLjMtMTEuNCAyLjZ2Ny44aDQuN2wyLTZjMS4xLS40IDIuMy0uNCAyLjctLjR6bTIuMyAyMi45Yy0xLjkgMC00LTEuMS00LTQuNiAwLTIuNCAyLjQtNC43IDQuOC01bDIuMi0uNXY4LjVzLTEuOSAxLjYtMyAxLjZ6bTEwMC43LTIyLjljMy45IDAgNS4zIDIgNS4zIDUuOXYzLjVsLTYuMSAxLjFjLTUuOSAxLjEtMTAuNCAyLjktMTAuNCA5LjMgMCA1LjEgMy41IDguNyA4LjMgOC43IDMuOCAwIDcuNC0xLjcgOC43LTQuNGguM2MuNSAzLjMgMy4zIDQuNCA2LjQgNC40IDIuNCAwIDQuOC0uNiA1LjctMS42di0ybC0yLjktMS41di0xOGMwLTctNS4yLTkuNC0xMy4zLTkuNC01LjMgMC04LjYgMS4zLTExLjQgMi42djcuOGg0LjdsMi02YzEuMS0uNCAyLjMtLjQgMi43LS40em0yLjMgMjIuOWMtMS45IDAtNC0xLjEtNC00LjYgMC0yLjQgMi40LTQuNyA0LjgtNWwyLjItLjV2OC41cy0xLjkgMS42LTMgMS42em0tMTM4LjcgNS42Yy40IDAgLjkgMCAxLjMtLjEgMy41LS4zIDYuNy0yIDguNC00LjJ2NC4xbDEyLTEuNXYtMmwtMy0yVjEzaC0xbC0xMiAyLjNWMThsNCAxLjdWMzhjLTEuMS44LTIuNCAxLjMtNC4yIDEuMy0yLjUgMC00LjgtLjgtNC44LTQuM1YxM2gtMWwtMTIgMi41djIuNmw0IDEuNlYzNmMwIDUuNCAyLjIgOS43IDguMyA5Ljd6TTk2IDM4Yy0xLjIgMC0yLjUtLjgtMi41LTEuOSAwLS44LjYtMS43IDEuNC0yLjMgMS42LjUgMyAuNiA1IC42IDcuOCAwIDEzLjItMy43IDEzLjItMTAuNCAwLTMtMS4zLTQuNi0zLjItNi40TDExNSAxOXYtNmwtOC4yIDEuNmMtMS45LS43LTQuNS0xLjYtNy0xLjYtNy44IDAtMTMuMiA0LjEtMTMuMiAxMC44IDAgNC4xIDIgNy4xIDUgOC44bC4yLjJjLTEuNyAxLjItNS4zIDQtNS4zIDcuMiAwIDIuNCAxLjUgNC44IDQuOCA1LjUtMy40LjgtNy4zIDIuNS03LjMgNi41IDAgNC4xIDUuOSA4IDE1LjUgOCAxMS44IDAgMTYuNS01LjcgMTYuNS0xMyAwLTYuMS0yLjgtOS05LjUtOUg5NnptNy41LTE0YzAgNS43LTEuMyA2LjUtMy41IDYuNXMtNC0uOC00LTYuNWMwLTUuOCAxLjgtNy41IDQtNy41czMuNSAyIDMuNSA3LjV6TTkyIDUwLjljLjEtMS41IDEuMS0zLjQgMy43LTMuNmg4LjZjMi41IDAgMy43IDIgMy43IDMuNiAwIDMuMi0yIDQuNC04LjMgNC40LTUuNSAwLTcuOC0yLjItNy43LTQuNHoiLz48cGF0aCBmaWxsPSIjQUFEOEYxIiBkPSJNODMgMzBjMC0xMy01LjEtMTYuOS0xMy0xNi45LTkgMC0xNSA2LjItMTUgMTYuNCAwIDEwLjUgNS41IDE2LjIgMTUuOCAxNi4yIDUuNiAwIDkuNy0yLjcgMTEuMi00Ljd2LTNjLTIuMS43LTMuOSAxLjItNy43IDEuMi01LjYgMC05LjMtMy4yLTkuMy05LjJoMTh6TTY5LjkgMTYuNmMyLjUgMCAzLjggMS44IDMuOCA5LjZsLTguNC43Yy4xLTcuOSAxLjgtMTAuMyA0LjYtMTAuM3pNMzcgNDV2LTNsLTMtMS41VjIxYzEuMi0uOSAzLjItMS43IDQuOC0xLjcgMi44IDAgNC4zIDEuNiA0LjIgNC4ydjE3TDQwIDQydjNoMTZ2LTNsLTMtMS41di0xOWMwLTUuNy0zLjMtOC4zLTcuNy04LjMtNC4xIDAtOC42IDEuMy0xMS4zIDMuOFYwaC0xTDIxIDJ2M2w0IDEuNXYzNEwyMiA0MnYzaDE1ek00IDM2LjRjMCA1LjcgMi44IDkuMyA4LjkgOS4zIDMuMSAwIDYuMi0uOCA4LjEtMi4zdi0zLjhjLS44LjMtMS45LjUtMi45LjUtMi45IDAtNC4xLTEuNi00LjEtNC42VjE5aDd2LTVoLTdWNi41TDQgOHY2bC00IDF2NGg0djE3LjR6Ii8+PC9zdmc+);background-position:0 0;width:20rem;height:3.75rem}.svg .i-observer-logo-320,.svg-i-observer-logo-320{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iNjAiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxMkgwVjJoMzIuOXYxMEgyMnYzM0gxMVYxMnpNNDYgMnYxMS41YzEtMS43IDMuNS0yLjYgOC42LTIuNiA3LjggMCA5LjQgNS4zIDkuNCAxMi4xdjIySDUzVjI2Yy4yLTMuMS0uNC00LjQtMy4xLTQuNC0zLjIgMC0zLjkgMS4zLTMuOSA0LjR2MTlIMzVWMmgxMXptNjIuMyAyMS41YzAtNyAuOC0xMS40IDcuMS0xMS40IDYuMSAwIDYuOSA0LjMgNi45IDExLjRzLS43IDExLjItNi44IDExLjJjLTYuMyAwLTcuMi00LjItNy4yLTExLjJ6bTcuNSAyMS41YzE1LjIgMCAxNy45LTEwLjUgMTcuOS0yMiAwLTExLjYtMi43LTIyLTE4LjQtMjJTOTYuOSAxMS41IDk2LjkgMjNjLjUgMTEuNSAzLjIgMjIgMTguOSAyMnptMzAuNi0xNi41YzAtNS4zLjgtNy40IDQuNS03LjQgMy40IDAgMy45IDEuOSAzLjkgNy40cy0uOSA3LTQuMSA3Yy0zLjYgMC00LjQtMS45LTQuMy03ek0xNDMuMyA0NWwxLjctMi41YzIuMSAxLjcgMy4xIDIuNSA5LjIgMi41IDkuOCAwIDEwLjctNy43IDEwLjctMTcgMC05LjEtLjYtMTcuMS0xMC4zLTE3LjEtNC40IDAtNyAuNi04LjcgMy4xVjJoLTEwdjQyLjVsNy40LjV6bTIyLjMtMi45bDQtOC4xYzIuNCAxLjIgNi40IDIuMyAxMC4xIDIuMyAxLjggMCAyLjQtLjcgMi40LTEuNiAwLTEuNC0xLjgtMS41LTYtMi45LTUuOS0xLjctOS4xLTMuNS05LjEtMTAuMiAwLTguNSA1LjctMTEgMTMuMy0xMSA1IDAgNy42LjcgMTAuOCAybC00LjEgOC44Yy0yLjEtLjktNC43LTEuNC03LjMtMS40LTIuMiAwLTIuNi41LTIuNiAxLjQgMCAxLjMgMS44IDEuNCA1LjEgMi40IDYuNyAxLjggOS44IDMuOSA5LjggMTAuNyAwIDcuMy01LjMgMTAuNC0xMi40IDEwLjQtNS4xLjEtMTAuMi0uNi0xNC0yLjh6bTY1LjktMzEuNmwxLjIgMy4xYzEuNi0xLjkgNC0zLjEgOS4zLTMuMVYyMWMtNi45IDAtOCAyLjEtOCA2djE3aC0xMC45VjExLjVsOC40LTF6bTEwLjQgMS41aDExLjZsNC43IDE4LjhMMjYzIDEyaDExbC0xMCAzM2gtMTIuMmwtOS45LTMzem02OC4xLTEuNWwuOCAzLjJjMS42LTEuOSAzLjktMy4yIDkuMi0zLjJWMjFjLTYuOSAwLTggMi4xLTggNnYxN2gtMTFWMTEuNWw5LTF6TTMwMC4yIDQybC00LTguM2MtMi4zIDEtNC4zIDIuMy04LjcgMi4zLTMuNC0uMy00LjctMS01LTRIMzAwYzAtMTIuNSAxLTIxLTEyLjktMjEuNC0xMS41LS40LTE1LjEgNi40LTE1LjEgMTcuMi4zIDExLjEgMyAxNy4yIDE1IDE3LjIgNS41IDAgOS44LTEgMTMuMi0zem0tOS42LTE3aC04LjJjLjItMy4zIDEuMy00LjkgNC41LTQuOSAzLjIuMSAzLjcgMS41IDMuNyA0Ljl6bS02OS40IDE3LjFsLTQtOC4zYy0yLjMgMS00LjMgMi4zLTguNyAyLjMtMy40LS4zLTQuNy0xLTUtNEgyMjFjMC0xMi41LjUtMjEtMTIuOS0yMS40LTExLjUtLjUtMTUuMSA2LjMtMTUuMSAxNy4xLjMgMTEuMSAzIDE3LjIgMTUgMTcuMiA1LjUgMCA5LjgtMSAxMy4yLTIuOXpNMjExLjYgMjVoLTguMmMuMi0zLjMgMS4zLTQuOSA0LjUtNC44IDQuMi0uMSAzLjcgNC44IDMuNyA0Ljh6TTkzLjIgNDIuMWwtNC04LjNjLTIuMyAxLTQuMyAyLjMtOC43IDIuMy0zLjQtLjMtNC43LTEtNS00SDkzYzAtMTIgLjUtMjEtMTIuOS0yMS40QzY4LjYgMTAuMiA2NSAxNyA2NSAyNy44IDY1LjMgMzguOSA2OCA0NSA4MCA0NWM1LjUgMCA5LjgtMSAxMy4yLTIuOXpNODMuNiAyNWgtOC4yYy4yLTMuMyAxLjMtNC45IDQuNS00LjggMy4yLjEgMy43IDEuNCAzLjcgNC44eiIvPjwvc3ZnPg==);background-position:0 0;width:20rem;height:3.75rem}.svg .i-camera-black-large,.svg-i-camera-black-large{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTE4IDMuNXY4TDE2LjUgMTNoLTE1TDAgMTEuNXYtOEwxLjUgMkg1bDItMmg0bDIgMmgzLjVMMTggMy41ek05IDExYzEuOSAwIDMuNS0xLjYgMy41LTMuNVMxMC45IDQgOSA0IDUuNSA1LjYgNS41IDcuNSA3LjEgMTEgOSAxMXoiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:0.8125rem}.svg .i-volume-mute--tone-media,.svg-i-volume-mute--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-mute--tone-podcast,.svg-i-volume-mute--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-mute-white,.svg-i-volume-mute-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-low-black,.svg-i-volume-low-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDUgMjA1Ij48cGF0aCBmaWxsPSIjMzMzIiBkPSJNOTkgMjMuM3YxNThoLTguN2wtNDcuNy00N2gtMzNsLTcuNi04Vjc4LjZsOC43LTguM2gzMmw0Ny00N2g4LjdtNTIgNzlsLTI5LjktMzQgNi40LTYuNCAzMy43IDMwIDM0LTMwIDYuNCA2LjQtMzAgMzQgMzAgMzMuNy02LjQgNi40LTM0LTI5LjktMzMuNyAyOS45LTYuNC02LjQgMjkuOS0zMy43Ii8+PC9zdmc+);background-position:0 0;width:0;height:0}.svg .i-expand--black,.svg-i-expand--black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDUgMjA1Ij48cGF0aCBmaWxsPSIjMzMzIiBkPSJNNzIuOCAxOTF2MTEuM2gtNjZMMi4xIDE5OHYtNjZoMTEuN2w1LjEgNDAuNiA1Mi01MiAxMi45IDEyLjktNTIgNTIgNDAuNiA1LjVtNTktMTc3VjIuN2g2Nmw0LjMgNC4zdjY2aC0xMS4zbC01LjUtNDEtNTIgNTItMTIuNS0xMi45IDUyLTUyLTQwLjYtNS4xIi8+PC9zdmc+);background-position:0 0;width:0;height:0}.svg .i-volume-high--tone-media,.svg-i-volume-high--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high--tone-podcast,.svg-i-volume-high--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high-black,.svg .paid-content.tonal--tone-media .vjs-volume-menu-button .vjs-control-text:before,.svg-i-volume-high-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high-white,.svg-i-volume-high-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-low--tone-media,.svg-i-volume-low--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-volume-low--tone-podcast,.svg-i-volume-low--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-volume-low-white,.svg-i-volume-low-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-embed--black,.svg .paid-content.tonal--tone-media .vjs-embed-button .vjs-control-content:before,.svg-i-embed--black{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xIDEwLjJWOC40TDIuOCA2LjcgNy4xIDVWMy4yTC44IDZ2MS41bDYuMyAyLjhNOS42IDE0aDEuN0wxNS4xLjRoLTEuN0w5LjYgMTRtOC40LTMuN2w2LjMtMi44VjZMMTggMy4yVjVsNC4zIDEuN0wxOCA4LjR2MS44IiBmaWxsPSIjMzMzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-embed--tone-media,.svg-i-embed--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xMiAxMC4yNFY4LjQzMkwyLjgxNiA2LjcwNCA3LjEyIDQuOTkyVjMuMTY4TC44IDUuOTUydjEuNTA0bDYuMzIgMi43ODR6bTIuNDc2IDMuNjhoMS43NDRMMTUuMTguMjcyaC0xLjc0NEw5LjU5NiAxMy45MnptOC4zNjQtMy42OGw2LjMyLTIuNzg0VjUuOTUybC02LjMyLTIuNzg0djEuODI0bDQuMzA0IDEuNzI4LTQuMzA0IDEuNzEydjEuODA4eiIgZmlsbD0iI2ZiMCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-embed--white,.svg-i-embed--white{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xMiAxMC4yNFY4LjQzMkwyLjgxNiA2LjcwNCA3LjEyIDQuOTkyVjMuMTY4TC44IDUuOTUydjEuNTA0bDYuMzIgMi43ODR6bTIuNDc2IDMuNjhoMS43NDRMMTUuMTguMjcyaC0xLjc0NEw5LjU5NiAxMy45MnptOC4zNjQtMy42OGw2LjMyLTIuNzg0VjUuOTUybC02LjMyLTIuNzg0djEuODI0bDQuMzA0IDEuNzI4LTQuMzA0IDEuNzEydjEuODA4eiIgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-expand-black,.svg .paid-content.tonal--tone-media .vjs-fullscreen-control .vjs-control-text:before,.svg-i-expand-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-expand-white,.svg-i-expand-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-expand-yellow,.svg-i-expand-yellow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-video-camera--tone-media,.svg-i-video-camera--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIyMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgMEwwIDN2MTdsMyAzaDE5VjBIM20yMiA5djVsOSA4aDJWMWgtMmwtOSA4eiIvPjwvc3ZnPg==);background-position:0 0;width:2.25rem;height:1.4375rem}.svg .i-video-camera--tone-podcast,.svg-i-video-camera--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIyMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgMEwwIDN2MTdsMyAzaDE5VjBIM20yMiA5djVsOSA4aDJWMWgtMmwtOSA4eiIvPjwvc3ZnPg==);background-position:0 0;width:2.25rem;height:1.4375rem}.svg .i-close-icon-white-small,.svg-i-close-icon-white-small{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTIxIDkuOGwtLjgtLjgtNS4yIDQuOEw5LjggOWwtLjguOCA0LjggNS4yTDkgMjAuMmwuOC44IDUuMi00LjggNS4yIDQuOC44LS44LTQuOC01LjJMMjEgOS44Ii8+PC9zdmc+);background-position:0 0;width:1.875rem;height:1.875rem}.svg .i-pause-32--tone-media,.svg-i-pause-32--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmIwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-32--tone-podcast,.svg-i-pause-32--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjYWFkOGYxIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-play-32--tone-media,.svg-i-play-32--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmIwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-32--tone-podcast,.svg-i-play-32--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjYWFkOGYxIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-error-exclamation,.svg-i-error-exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzYgMzYiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgZmlsbD0iI2ZmZiIgY3g9IjE4IiBjeT0iMTgiIHI9IjE4Ii8+PHBhdGggZD0iTTE0LjcyNyA1LjcyN2wxLjYzNi0xLjYzNmgzLjI3M2wxLjYzNiAxLjYzNi0xLjYzNiAxNS41NDVoLTMuMjczTDE0LjcyNyA1LjcyN202LjU0NSAyMi4wOWMwLTEuOC0xLjQ3My0zLjI3My0zLjI3My0zLjI3M2EzLjI4MyAzLjI4MyAwIDAgMC0zLjI3MyAzLjI3M2MwIDEuOCAxLjQ3MyAzLjI3MyAzLjI3MyAzLjI3M3MzLjI3My0xLjQ3MyAzLjI3My0zLjI3MyIgZmlsbD0iIzMzMyIvPjwvZz48L3N2Zz4=);background-position:0 0;width:2.25rem;height:2.25rem}.centered-icon svg{top:0;bottom:0;right:0;left:0;margin:auto;position:absolute}@media (min-width: 46.25em){figure.element.element--supporting{position:relative;float:left;width:18.75rem;margin-top:0.375rem;margin-bottom:0.75rem;margin-right:1.25rem;line-height:0}figure.element.element--supporting.img--landscape{margin-right:1.25rem}}@media (min-width: 71.25em) and (min-width: 71.25em){figure.element.element--supporting{margin-left:-10rem}}@media (min-width: 71.25em) and (min-width: 81.25em){figure.element.element--supporting{margin-left:-15rem}}@media (min-width: 81.25em){figure.element.element--supporting{width:23.75rem}}figure.element.element--thumbnail{float:left;clear:left;margin-bottom:0;width:7.5rem;margin-right:1.25rem;margin-top:0.375rem}@media (min-width: 46.25em){figure.element.element--thumbnail{width:8.75rem}figure.element.element--thumbnail.img--landscape{margin-right:1.25rem}}@media (min-width: 71.25em){figure.element.element--thumbnail{position:relative}}@media (min-width: 71.25em) and (min-width: 71.25em){figure.element.element--thumbnail{margin-left:-10rem}}@media (min-width: 71.25em) and (min-width: 81.25em){figure.element.element--thumbnail{margin-left:-15rem}}@media (min-width: 81.25em){figure.element.element--thumbnail{margin-left:-10rem}}@media (min-width: 71.25em){figure.element.element--showcase{position:relative;margin-bottom:1rem}}@media (min-width: 71.25em) and (min-width: 71.25em){figure.element.element--showcase{margin-left:-10rem}}@media (min-width: 71.25em) and (min-width: 81.25em){figure.element.element--showcase{margin-left:-15rem}}figure.element.element--supporting figcaption,figure.element-video figcaption,figure.element-atom figcaption{padding-top:0.5rem;padding-bottom:0.5rem}@media (min-width: 71.25em){figure.element.element--supporting figcaption,figure.element-video figcaption,figure.element-atom figcaption{padding-left:0;top:100%}}@media (min-width: 71.25em){figure.element.element--showcase figcaption{padding-left:0;top:100%}}@media (min-width: 71.25em){figure.element-video.element--thumbnail{padding-bottom:0;border-bottom:0}}figure.element.element--supporting.element-tweet{margin-top:-0.375rem}@media (min-width: 71.25em){figure.img--supporting{float:left;width:23.75rem;margin-top:0.375rem;margin-right:1.25rem}}@media (min-width: 81.25em){figure.img--supporting{width:28.75rem}}.media-primary--full-width{width:100%;margin-bottom:1.5rem}@media (min-width: 71.25em){.media-primary.media-primary--showcase{margin-left:-10rem}}@media (min-width: 81.25em){.media-primary.media-primary--showcase{margin-left:-15rem}}.has-feature-showcase-element .media-primary.media-primary--showcase,.has-feature-showcase-opinion .media-primary.media-primary--showcase{margin-left:0;margin-right:0;z-index:2;position:relative}@media (min-width: 71.25em){.has-feature-showcase-element .media-primary.media-primary--showcase,.has-feature-showcase-opinion .media-primary.media-primary--showcase{margin:0 auto;width:58.75rem;max-width:unset}}@media (min-width: 81.25em){.has-feature-showcase-element .media-primary.media-primary--showcase,.has-feature-showcase-opinion .media-primary.media-primary--showcase{width:63.75rem}}.has-feature-showcase-element .media-primary.media-primary--showcase .responsive-img,.has-feature-showcase-opinion .media-primary.media-primary--showcase .responsive-img{height:auto}.has-feature-showcase-element .media-primary.media-primary--showcase .u-responsive-ratio--letterbox,.has-feature-showcase-opinion .media-primary.media-primary--showcase .u-responsive-ratio--letterbox{transition:padding-bottom 1s}.media-primary{position:relative}.content__main-column--article{min-height:17.25rem}.article-elongator{position:relative}.article-elongator .i-center{background-color:#052962}.after-article{position:relative;display:block;content:' ';margin-top:1.5rem}.content{padding-top:0;padding-bottom:2.25rem}.content:after{content:'';display:block;clear:both}.content .gs-container,.content-footer .gs-container{padding-left:0.625rem;padding-right:0.625rem;box-sizing:border-box}@media (min-width: 30em){.content .gs-container,.content-footer .gs-container{padding-left:1.25rem;padding-right:1.25rem}}.content__main-column{max-width:38.75rem;margin:auto;position:relative}@media (min-width: 46.25em) and (max-width: 61.24em){.content__main-column{max-width:43.75rem}.content__main-column .content__article-body{padding-right:5rem}.content__main-column .content__article-body .ad-slot:not(.ad-slot--im):not(.ad-slot--unruly):not(.ad-slot--carrot){margin-right:-5rem}.content__main-column .content__article-body .gu-media-wrapper.u-responsive-ratio--hd{padding-bottom:63.50806451612925%}}@media (min-width: 61.25em){.content__main-column{margin-left:0;margin-right:19.375rem}}@media (min-width: 71.25em){.content__main-column{margin-left:9.375rem}}@media (min-width: 81.25em){.content__main-column{margin-left:14.375rem}}.content__main-column.content__main-column--single-column{margin-left:0}@media (min-width: 61.25em){.content__main-column.content__main-column--media,.content__main-column.content__main-column--wide{max-width:none}}@media (min-width: 81.25em){.content__main-column.content__main-column--media,.content__main-column.content__main-column--wide{margin-right:5rem}}.content--image .content__main-column{max-width:none;margin-right:0}@media (min-width: 81.25em){.content--image .content__main-column{margin-right:5rem}}@supports (display: grid){@media (min-width: 71.25em){.force-percentage-padding .content__main-column .content__head--article .media-primary .u-responsive-ratio{min-width:38.75rem}}@media (min-width: 46.25em) and (max-width: 61.24em){.force-percentage-padding .content__main-column .content__head--article .media-primary .u-responsive-ratio{min-width:43.75rem}}}@media (min-width: 46.25em) and (max-width: 71.24em){.content__head{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.content__hr{border:0;margin:0;border-top:0.0625rem dotted #dcdcdc;padding-top:0.3125rem}.content__secondary-column{position:absolute;top:0;right:0;margin-right:1.25rem;width:18.75rem;padding-left:1.25rem}@media (max-width: 61.24em){.content__secondary-column{display:none}}@media (min-width: 46.25em){.content__head__comment-count{display:none}}.content__keywords{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding-top:0.75rem;padding-bottom:0.25rem}.content--media .content__keywords a{color:#dcdcdc}.content__labels{box-sizing:border-box;position:relative;z-index:1;overflow:hidden;padding-top:0.1875rem}@media (max-width: 46.24em){.content__labels{-webkit-order:1;-ms-flex-order:1;order:1}.tonal__head--tone-comment .content__labels,.tonal__head--tone-editorial .content__labels,.content__head--column .content__labels{-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width: 71.25em){.content__labels{padding-top:0.5625rem}}@media (min-width: 41.25em) and (max-width: 46.24em){.content__labels--not-immersive,.content__labels--gallery{margin-left:1.25rem}}@media (min-width: 71.25em){.content__labels--not-immersive,.content__labels--gallery{position:absolute;top:0;width:8.75rem;margin-left:-10rem;margin-bottom:0.75rem}.content__labels--not-immersive.content__labels--crossword,.content__labels--gallery.content__labels--crossword{width:inherit}}@media (min-width: 81.25em){.content__labels--not-immersive,.content__labels--gallery{margin-left:-15rem;width:13.75rem}}.content--media .content__labels--flagship.content__labels--flagship.content__labels--flagship{padding:0.375rem 0 0}.content--media .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#ffe500}.content--pillar-news .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#ff4e36}.content--pillar-sport .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#00b2ff}.content--pillar-opinion .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#ff7f0f}.content--pillar-arts .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#eacca0}.content--pillar-lifestyle .content__labels--flagship.content__labels--flagship.content__labels--flagship .content__label__link{color:#ffabdb}.content__label{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;display:inline;padding-right:0.41667rem}@media (min-width: 71.25em){.content__label{font-size:1.25rem;line-height:1.4375rem;line-height:1.25rem;padding-right:0}}.content__label ~ .content__label{font-weight:normal}@media (min-width: 71.25em){.content__label ~ .content__label{font-size:1.0625rem;line-height:1.25rem;margin-bottom:0.75rem;display:block}}@media (max-width: 46.24em){.content__label ~ .content__label{display:none}}@media (min-width: 71.25em) and (max-width: 81.24em){.container__meta__title{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900}}.content__inline-section{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;box-sizing:border-box;padding:0.375rem 0 0.75rem;border-top:0.0625rem dotted #dcdcdc !important}.content__headline{font-size:1.75rem;line-height:2rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;display:block;font-weight:400;padding-bottom:1.5rem;padding-top:0.1875rem}@media (min-width: 46.25em){.content__headline{font-size:2.125rem;line-height:2.375rem;padding-bottom:2.25rem}}.content__headline em{font-style:normal}.content__headline strong{font-weight:normal}.content__headline--byline{font-style:italic;padding-bottom:4.5rem}.content__headline--no-margin-bottom{padding-bottom:0}.content__headline--kicker{padding-bottom:0}@media (min-width: 71.25em){.content__headline--kicker{margin-bottom:-0.375rem}}.content__headline--flagship{padding-top:0}@media (min-width: 71.25em){.content.content:not(.paid-content) .content__headline--flagship{padding-left:0.625rem;margin-left:-0.625rem;border-left:0.0625rem solid #333}}.content__head--byline-pic{overflow:hidden}.content__head--byline-pic .content__header .byline-img{bottom:0;float:right;height:9.375rem;margin-right:-1.25rem;right:-2.5rem;-webkit-shape-outside:polygon(0 8.125rem, 0 9.375rem, 11.25rem 9.375rem, 11.25rem 0, 1.25rem 0, 1.25rem 6rem);shape-outside:polygon(0 8.125rem, 0 9.375rem, 11.25rem 9.375rem, 11.25rem 0, 1.25rem 0, 1.25rem 6rem);width:auto}@media (min-width: 30em){.content__head--byline-pic .content__header .byline-img{height:11.25rem;right:12.5rem}}@media (min-width: 61.25em){.content__head--byline-pic .content__header .byline-img{-webkit-shape-outside:polygon(0 10rem, 0 11.25rem, 13.5rem 11.25rem, 13.5rem 0, 2.25rem 0, 1.5rem 7.5625rem, 0 8rem);shape-outside:polygon(0 10rem, 0 11.25rem, 13.5rem 11.25rem, 13.5rem 0, 2.25rem 0, 1.5rem 7.5625rem, 0 8rem)}}.content__head--byline-pic .byline-img__img{height:100%}.content__standfirst{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;margin-bottom:0.375rem;color:#121212;z-index:1}@media (min-width: 46.25em){.content__standfirst{font-size:1.125rem;line-height:1.375rem}}.content__standfirst>ul,.content__standfirst>ol{margin:0;padding:0;list-style:none}.content__standfirst>ul>li,.content__standfirst>ol>li{position:relative}.content__standfirst>ul *,.content__standfirst>ol *{margin-bottom:0.375rem}.content__standfirst>ol{counter-reset:li}.content__standfirst>ol>li{text-indent:1.125rem}@media (min-width: 46.25em){.content__standfirst>ol>li{text-indent:1.25rem}}.content__standfirst>ol>li:before{font-size:1.0625rem;line-height:1.25rem;position:absolute;left:-1rem;content:counter(li);counter-increment:li;color:#dcdcdc}@media (min-width: 46.25em){.content__standfirst>ol>li:before{font-size:1.25rem;line-height:1.4375rem;left:-1.25rem;top:-0.125rem}}.tonal__standfirst{position:relative}.content__dateline{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;position:relative;color:#767676;box-sizing:border-box;padding-top:0.125rem;margin-bottom:0.375rem}.content__dateline time{display:inline-block}@media (min-width: 61.25em){.content--interactive .content__dateline time{display:inline;padding-right:0.3125rem}}.content__dateline i{position:relative;top:0.0625rem}.content__dateline .relative-timestamp__icon{vertical-align:top;top:0.1875rem}.content__dateline-wpd--modified{cursor:pointer}.content__dateline-wpd--modified:hover,.content__dateline-wpd--modified:active,.content__dateline-wpd--modified:focus{text-decoration:underline}.content__dateline-lm{padding-top:0.1875rem}@media (min-width: 71.25em){.content__dateline-lm{padding-top:0.125rem}}.badge+.content__dateline{clear:left}.content__meta-container{min-height:2.25rem;position:relative;margin-bottom:0.75rem}@media (min-width: 46.25em) and (max-width: 71.24em){.content__meta-container{-webkit-order:1;-ms-flex-order:1;order:1}}@media (min-width: 71.25em){.content__meta-container{position:absolute;top:0;margin-left:-10rem;margin-bottom:1rem;width:8.75rem}}@media (min-width: 81.25em){.content__meta-container{margin-left:-15rem;width:13.75rem}}.content__meta-container .byline-img{border-radius:62.5rem;position:relative;width:3.75rem;height:3.75rem;margin:0.375rem 0;overflow:hidden;background-color:#f6f6f6;contain:paint}@media (min-width: 71.25em){.content__meta-container .byline-img{width:8.75rem;height:8.75rem;margin-right:0;margin-bottom:0.75rem}}.content__meta-container .byline-img__img{position:absolute;width:auto;height:110%;bottom:-0.375rem;left:-624.9375rem;right:-624.9375rem;margin:auto}@media (min-width: 71.25em){.content__meta-container .byline-img__img{bottom:-0.875rem}}@media (min-width: 71.25em){.content__meta-container .meta__image{border-top:0.0625rem dotted #dcdcdc}}@media (min-width: 71.25em){.content__meta-container--float{float:left;position:static}}@media (min-width: 71.25em){.content__meta-container.content__meta-container--showcase{float:left;position:static}}@media (min-width: 20em) and (max-width: 46.24em){.content__mobile-full-width{width:auto;margin-left:-0.625rem;margin-right:-0.625rem}}@media (min-width: 30em) and (max-width: 46.24em){.content__mobile-full-width{margin-left:-1.25rem;margin-right:-1.25rem}}@media (min-width: 46.25em){.content__mobile-full-width{margin-left:0;margin-right:0}}.meta__comment-count--top{display:none;float:right;margin-top:0.375rem;margin-left:0.3125rem}.byline{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;border-top:0;color:#767676;font-style:italic;min-height:0;margin-bottom:0.25rem;font-weight:normal;width:100%}@media (max-width: 41.24em){.byline{border-top:0}}.byline span[itemprop='author']{font-weight:700;font-style:normal}.content__meta-container--twitter .byline,.content__meta-container--bio .byline{min-height:0;padding-bottom:0}@media (min-width: 71.25em){.content__labels--crossword .byline{margin-top:4.9375rem;min-height:0;padding-bottom:0}}@media (min-width: 20em) and (max-width: 71.24em){.content__labels--crossword .byline{display:none}}@media (min-width: 71.25em){.crossword__links .byline{display:none}}.drop-cap{font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;float:left;display:inline-block;text-transform:uppercase;font-weight:200;box-sizing:border-box;height:3rem;padding-top:0.0625rem;margin-right:0.25rem}@media (min-width: 46.25em){.drop-cap{margin-right:0.3125rem;height:4.5rem}}.drop-cap .drop-cap__inner{font-size:3.25rem;line-height:2.5rem;display:inline-block;vertical-align:text-top}@media (min-width: 46.25em){.drop-cap .drop-cap__inner{font-size:5.25rem;line-height:4.25rem}}.commentcount{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:none}.commentcount i{margin-right:0.1875rem;vertical-align:-0.25rem}.content__head__comment-count .commentcount{display:block;margin-bottom:0.75rem}@media (min-width: 46.25em){.commentcount{display:block;position:absolute;right:0;top:0.5rem}.content__head .commentcount{display:none}}@media (min-width: 71.25em){.commentcount{height:2.25rem;position:static;box-sizing:border-box}.content__head__comment-count .commentcount{display:none}.content__meta-container .commentcount{display:block;padding-top:0.25rem;margin-bottom:0.75rem;border-top:0.0625rem dotted #dcdcdc}}.content__meta-heading{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;padding-top:0.25rem;padding-bottom:1rem;margin-bottom:0;border-top:0.0625rem solid #dcdcdc}.meta__extras{border-top:0.0625rem solid #dcdcdc;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:0.375rem;position:relative;clear:both}.content__head--crossword .meta__extras{clear:none}.meta__social{padding-top:0.375rem}.meta__twitter,.meta__email{margin:-0.5rem 0.3125rem -0.125rem 0;display:inline}@media (max-width: 71.24em){.content__meta-container--tonal-header .meta__twitter,.content__meta-container--tonal-header .meta__email{margin-top:-0.25rem}}.meta__twitter svg,.meta__email svg{margin-top:-0.125rem;overflow:visible}.meta__twitter .button,.meta__email .button{padding-top:0.0625rem;margin-right:0;white-space:nowrap}.tonal--tone-media .meta__twitter .button,.tonal--tone-media .meta__email .button{border:0;color:#dcdcdc;background-color:#333}.tonal--tone-media .meta__twitter .button .inline-tone-fill,.tonal--tone-media .meta__email .button .inline-tone-fill{fill:#dcdcdc}.tonal--tone-media .meta__twitter .button:hover,.tonal--tone-media .meta__email .button:hover{color:#dcdcdc;background-color:#262626}@media (max-width: 71.24em){.meta__twitter .button,.meta__email .button{position:relative;margin-top:-0.1875rem;margin-bottom:-0.375rem;width:2rem;height:2rem;padding:0;border:0;background-color:transparent !important}.meta__twitter .button svg,.meta__email .button svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}}@media (min-width: 71.25em) and (max-width: 81.24em){.meta__twitter .button,.meta__email .button{max-width:8.75rem}}.meta__twitter .button--small .i-left,.meta__email .button--small .i-left{margin:0.125rem 0.25rem 0 0}@media (max-width: 71.24em){.meta__twitter .button--small .i-left,.meta__email .button--small .i-left{margin:0}}.meta__twitter .button--small svg,.meta__email .button--small svg{width:0.875rem;height:0.875rem}.meta__twitter .contact,.meta__email .contact{height:1.3125rem;display:inline-block;vertical-align:top}@media (min-width: 71.25em){.meta__twitter .contact,.meta__email .contact{margin-top:-0.0625rem}}@media (min-width: 71.25em){.meta__twitter,.meta__email{margin-top:0.625rem;margin-bottom:1.125rem;display:block}}@media (max-width: 71.24em){.meta__twitter,.meta__email{margin:0}}@media (min-width: 71.25em){.content__meta-container--email.content__meta-container--twitter .meta__email{margin-top:0.375rem}.content__meta-container--email.content__meta-container--twitter .meta__twitter{margin-bottom:0}}.meta__bio{font-size:0.875rem;line-height:1.0625rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;margin-bottom:0.75rem;padding-top:0.375rem;color:#767676}@media (max-width: 71.24em){.meta__bio{display:none}}.tonal--tone-media .meta__bio{color:#f6f6f6}.meta__author--comment .meta__bio{padding-top:0.125rem;border-top:0.0625rem dotted #dcdcdc}.content__meta-container--twitter .meta__bio,.content__meta-container--email .meta__bio{margin-bottom:0}.content__meta-container--tonal-header .meta__bio{border-top:0.0625rem dotted #dcdcdc;padding-top:0.125rem}.meta__contact-header{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;line-height:0.9375rem;color:#767676;margin-bottom:0;border-top:0.0625rem dotted #dcdcdc;padding-top:0.125rem}.content__meta-container--bio .meta__contact-header{margin-top:0.75rem}@media (max-width: 71.24em){.meta__contact-header{border:0;padding-top:0.375rem;float:left}}.related .button--show-more{display:none}.old-article-message{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background:#ffe500;display:inline-block;color:#121212;margin-bottom:0.375rem;padding:0.1875rem 0.3125rem}.old-article-message .old-article-message--clock svg{fill:currentColor}.content__headline-standfirst-wrapper .old-article-message{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding:0.375rem 0.625rem;margin-top:0.375rem}@media (min-width: 30em){.content__headline-standfirst-wrapper .old-article-message{padding-left:1.25rem}}@media (min-width: 46.25em){.content__headline-standfirst-wrapper .old-article-message{margin-left:-1.25rem}}@media (min-width: 71.25em){.content__headline-standfirst-wrapper .old-article-message{margin-left:-0.625rem;margin-top:0;padding-left:0.625rem}}@media (max-width: 46.24em){.inline-expand-image{display:none}}@media (max-width: 46.24em){.content__head--article{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}@media (min-width: 71.25em){@supports (display: grid){.content__head--article{margin-left:-10rem;display:grid;grid-template-columns:10rem 1fr;grid-template-areas:'labels headline-standfirst' 'meta main-media'}.content--type-guardianview .content__head--article,.content--type-comment .content__head--article{grid-template-areas:'labels headline' 'meta standfirst' 'meta main-media'}.content--type-article.section-football .content__head--article,.content--type-matchreport .content__head--article{grid-template-areas:'labels headline-standfirst' '. report' 'meta main-media'}}}@media (min-width: 81.25em){@supports (display: grid){.content__head--article{margin-left:-15rem;grid-template-columns:15rem 1fr}}}@media (min-width: 71.25em){@supports (display: grid){.content__head--article .content__labels{grid-area:labels;position:relative;margin:0}}}@media (max-width: 46.24em){.content__head--article .content__headline-standfirst-wrapper{-webkit-order:1;-ms-flex-order:1;order:1}.content--type-guardianview .content__head--article .content__headline-standfirst-wrapper,.content--type-comment .content__head--article .content__headline-standfirst-wrapper{-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width: 71.25em){.content__head--article .content__headline-standfirst-wrapper{grid-area:headline-standfirst}}@media (min-width: 71.25em){.content__head--article .media-primary{grid-area:main-media}}@media (min-width: 71.25em){.content__head--article .content__header{grid-area:headline}}@media (min-width: 71.25em){.content__head--article .tonal__standfirst{grid-area:standfirst}}@media (max-width: 46.24em){.content__head--article .content__meta-container{-webkit-order:1;-ms-flex-order:1;order:1;margin-top:0}.content--type-guardianview .content__head--article .content__meta-container,.content--type-comment .content__head--article .content__meta-container{-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width: 71.25em){.content__head--article .content__meta-container{top:11.25rem}@supports (display: grid){.content__head--article .content__meta-container{grid-area:meta;position:relative !important;top:0;margin:0;-webkit-align-self:start;-ms-flex-item-align:start;align-self:start;height:0}}}.content__head--article .matchreport{grid-area:report}@media (min-width: 71.25em){.content__subhead .content__meta-container{top:0}}.paid-content{color:#121212}.paid-content .content__head{display:block;margin-left:0}@media (min-width: 71.25em){.paid-content .content__labels,.paid-content .content__meta-container{margin-left:-10rem}}@media (min-width: 81.25em){.paid-content .content__labels,.paid-content .content__meta-container{margin-left:-15rem}}@media (min-width: 71.25em){.paid-content .content__labels,.paid-content .content__meta-container{width:8.75rem}}@media (min-width: 81.25em){.paid-content .content__labels,.paid-content .content__meta-container{width:13.75rem}}@media (min-width: 71.25em){.paid-content .content__labels,.paid-content .content__meta-container{float:left}}.paid-content .content__standfirst,.paid-content .content__dateline,.paid-content .caption--main,.paid-content .caption{color:#333}.paid-content .inline-icon{fill:#333}.paid-content a{color:#121212}.paid-content .u-underline{border-color:#999}.paid-content .u-underline:hover,.paid-content .u-underline:focus{border-color:#121212}.paid-content .u-underline:active{border-color:#121212}.paid-content .element.element-pullquote .pullquote-paragraph{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#69d1ca}.paid-content a.in-body-link--immersive{color:#69d1ca}.paid-content .inline-expand-image{fill:#fff}.paid-content.content--article,.paid-content.content--interactive,.paid-content.tonal--tone-media{background-color:#dcdcdc}.paid-content.content--article .caption :not(caption--main),.paid-content.content--interactive .caption :not(caption--main),.paid-content.tonal--tone-media .caption :not(caption--main){color:#121212}.paid-content.content{border-top:0}.paid-content .content__main{padding-top:0.75rem}.paid-content .content__header{background-color:#dcdcdc}.paid-content .tone-media--item{color:#121212}.paid-content .tone-media--item .rich-link__container:before{background-color:#69d1ca}.paid-content .tone-media--item .rich-link__kicker,.paid-content .tone-media--item .rich-link__read-more-text{color:#65a897}.paid-content .tone-media--item .rich-link__arrow-icon{fill:#65a897}.paid-content .tone-news--item.rich-link{background:#dcdcdc}.paid-content .rich-link__header,.paid-content .rich-link__read-more-text{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:1.0625rem}.paid-content .rich-link__header{line-height:1.25rem}.paid-content .ad-slot__label,.paid-content .ad-slot--inline{background-color:#dcdcdc;border-top-color:#999;color:#767676}.paid-content .content__section-label{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:400}.paid-content .content__section-label .content__section-label__link{color:#121212}.paid-content .meta__extras{border-color:#999}.paid-content.tonal--tone-media .content__headline,.paid-content.tonal--tone-media .from-content-api,.paid-content.tonal--tone-media .tonal__main .tone-colour{color:#121212}.paid-content.tonal--tone-media .content__headline .inline-icon,.paid-content.tonal--tone-media .from-content-api .inline-icon,.paid-content.tonal--tone-media .tonal__main .tone-colour .inline-icon{fill:#767676}.paid-content.tonal--tone-media .most-viewed-container--media .inline-icon,.paid-content.tonal--tone-media .meta__number .inline-icon{fill:#767676}.paid-content.tonal--tone-media.content--media--video .content__head .tonal__standfirst{display:none}.paid-content.tonal--tone-media .byline,.paid-content.tonal--tone-media .meta__numbers .sharecount__heading,.paid-content.tonal--tone-media .meta__numbers .commentcount2__heading,.paid-content.tonal--tone-media .content__dateline,.paid-content.tonal--tone-media .content__series-label__link{color:#767676}.paid-content.tonal--tone-media .tonal__main--tone-media .sharecount__value,.paid-content.tonal--tone-media .tonal__main--tone-media .commentcount2__value{color:#121212}.paid-content.tonal--tone-media .byline,.paid-content.tonal--tone-media .content__dateline,.paid-content.tonal--tone-media .submeta hr,.paid-content.tonal--tone-media .commentcount,.paid-content.tonal--tone-media .meta__numbers,.paid-content.tonal--tone-media .meta__social,.paid-content.tonal--tone-media .meta__number+.meta__number{border-color:#999}.paid-content.tonal--tone-media .byline .tone-colour{color:#767676}.paid-content.tonal--tone-media .byline .tone-colour:hover{color:#121212}.paid-content.tonal--tone-media .gu-media-wrapper--audio,.paid-content.tonal--tone-media .vjs-control-bar,.paid-content.tonal--tone-media .vjs-embed-button:hover .vjs-control-text,.paid-content.tonal--tone-media .vjs-progress-holder:before{color:#333;background:#999}.paid-content.tonal--tone-media .gu-media-wrapper--audio .podcast-meta__item__link,.paid-content.tonal--tone-media .gu-media-wrapper--audio .vjs-duration,.paid-content.tonal--tone-media .vjs-control-bar .podcast-meta__item__link,.paid-content.tonal--tone-media .vjs-control-bar .vjs-duration,.paid-content.tonal--tone-media .vjs-embed-button:hover .vjs-control-text .podcast-meta__item__link,.paid-content.tonal--tone-media .vjs-embed-button:hover .vjs-control-text .vjs-duration,.paid-content.tonal--tone-media .vjs-progress-holder:before .podcast-meta__item__link,.paid-content.tonal--tone-media .vjs-progress-holder:before .vjs-duration{color:#333}.svg .paid-content.tonal--tone-media .vjs-embed-button .vjs-control-content:before{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .paid-content.tonal--tone-media .vjs-fullscreen-control .vjs-control-text:before{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .paid-content.tonal--tone-media .vjs-volume-menu-button .vjs-control-text:before{display:inline-block;background-repeat:no-repeat;background-size:contain}.paid-content.tonal--tone-media .vjs-volume-bar:before{background-color:#121212}.paid-content.tonal--tone-media .end-slate-container--video{background-color:#dcdcdc}.paid-content.tonal--tone-media .end-slate-container--video .end-slate-container__heading{color:#333}.paid-content.tonal--tone-media .end-slate-container--video .fc-item__container:before{background:#767676}.paid-content.tonal--tone-media .end-slate-container--video .fc-item__action{color:#767676}.paid-content.tonal--tone-media .save-for-later__button,.paid-content.tonal--tone-news .save-for-later__button{color:#767676}.paid-content.tonal--tone-media .save-for-later__button--save .inline-icon,.paid-content.tonal--tone-media .save-for-later__button--saved .inline-icon,.paid-content.tonal--tone-news .save-for-later__button--save .inline-icon,.paid-content.tonal--tone-news .save-for-later__button--saved .inline-icon{fill:#767676;border-color:#767676;background-color:#dcdcdc}.paid-content.tonal--tone-media .save-for-later__button--save:hover .inline-icon,.paid-content.tonal--tone-media .save-for-later__button--saved:hover .inline-icon,.paid-content.tonal--tone-news .save-for-later__button--save:hover .inline-icon,.paid-content.tonal--tone-news .save-for-later__button--saved:hover .inline-icon{fill:#dcdcdc;border-color:#767676;background-color:#767676}.paid-content.tonal--tone-media .ad-slot--dark,.paid-content.tonal--tone-news .ad-slot--dark{background-color:#dcdcdc}.svg .paid-content.content--media--audio .content__headline:before{display:inline-block;background-repeat:no-repeat;background-size:contain}.paid-content .fc-item__title svg{fill:#ffe500}.content--pillar-news:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(171,6,19,0.5))}@media (min-width: 46.25em){.content--pillar-news:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(171,6,19,0.5))}}.content--pillar-news:not(.paid-content).content--type-feature .content__headline,.content--pillar-news:not(.paid-content).content--type-review .content__headline,.content--pillar-news:not(.paid-content).content--type-recipe .content__headline,.content--pillar-news:not(.paid-content) .button--secondary,.content--pillar-news:not(.paid-content) .drop-cap,.content--pillar-news:not(.paid-content) .element-pullquote p,.content--pillar-news:not(.paid-content) .u-underline{color:#ab0613}.content--pillar-news:not(.paid-content) .button--primary,.content--pillar-news:not(.paid-content) .content__labels--splash:hover{background:#ab0613}.content--pillar-news:not(.paid-content) .byline,.content--pillar-news:not(.paid-content) .content--media .content__headline,.content--pillar-news:not(.paid-content) .content__label__link,.content--pillar-news:not(.paid-content) .pullquote-cite,.content--pillar-news:not(.paid-content) a{color:#c70000}.content--pillar-news:not(.paid-content) .end-slate-container a{color:#ededed}.content--pillar-news:not(.paid-content) .content__meta-container .byline-img,.content--pillar-news:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#ff4e36}.content--pillar-news:not(.paid-content) .block-share__item .inline-icon,.content--pillar-news:not(.paid-content) .commentcount2__heading span,.content--pillar-news:not(.paid-content) .inline-close svg,.content--pillar-news:not(.paid-content) .inline-triangle,.content--pillar-news:not(.paid-content) .social-icon svg,.content--pillar-news:not(.paid-content) .social-icon__svg{fill:#c70000}.content--pillar-news:not(.paid-content) .inline-garnett-quote svg,.content--pillar-news:not(.paid-content) .content__series-cta__icon{fill:#c70000}.content--pillar-news:not(.paid-content) .u-underline:hover{border-bottom:solid 0.0625rem #c70000}.content--pillar-news:not(.paid-content) .bullet::before,.content--pillar-news:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-news:not(.paid-content) .content__labels--splash,.content--pillar-news:not(.paid-content) .content__labels--panel{background-color:#c70000}.content--pillar-news:not(.paid-content) .block-share__item:focus,.content--pillar-news:not(.paid-content) .block-share__item:hover,.content--pillar-news:not(.paid-content) .social-icon:focus,.content--pillar-news:not(.paid-content) .social-icon:hover,.content--pillar-news:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-news:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#c70000;border:0.0625rem solid #c70000}.content--pillar-news:not(.paid-content) .block--content,.content--pillar-news:not(.paid-content) .block.is-summary{border-top-color:#ab0613}.content--pillar-news:not(.paid-content) .youtube-media-atom__play-button{background:#ff4e36;border-radius:100%}.content--pillar-news:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon{fill:#ff4e36}.content--pillar-news:not(.paid-content) .youtube-media-atom__bottom-bar__duration{color:#ff4e36}.content--pillar-news:not(.paid-content) .content__label-interview{background-color:#ab0613;box-shadow:0.25rem 0 0 #ab0613,-0.375rem 0 0 #ab0613}.content--pillar-news:not(.paid-content) .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-news:not(.paid-content) .meta__extras--crossword .social-icon:hover{background:#c70000;border:0.0625rem solid #c70000}.content--pillar-news:not(.paid-content) .meta__extras--crossword .social-icon svg{fill:#c70000}.content--pillar-news:not(.paid-content) .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-opinion:not(.paid-content).content--type-analysis .content__headline,.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(224,94,0,0.5))}@media (min-width: 46.25em){.content--pillar-opinion:not(.paid-content).content--type-analysis .content__headline,.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(224,94,0,0.5))}}.content--pillar-opinion:not(.paid-content).content--type-feature .content__headline,.content--pillar-opinion:not(.paid-content).content--type-review .content__headline,.content--pillar-opinion:not(.paid-content).content--type-recipe .content__headline,.content--pillar-opinion:not(.paid-content) .button--secondary,.content--pillar-opinion:not(.paid-content) .drop-cap,.content--pillar-opinion:not(.paid-content) .element-pullquote p,.content--pillar-opinion:not(.paid-content) .u-underline,.content--type-comment:not(.paid-content).content--type-feature .content__headline,.content--type-comment:not(.paid-content).content--type-review .content__headline,.content--type-comment:not(.paid-content).content--type-recipe .content__headline,.content--type-comment:not(.paid-content) .button--secondary,.content--type-comment:not(.paid-content) .drop-cap,.content--type-comment:not(.paid-content) .element-pullquote p,.content--type-comment:not(.paid-content) .u-underline,.content--type-guardianview:not(.paid-content).content--type-feature .content__headline,.content--type-guardianview:not(.paid-content).content--type-review .content__headline,.content--type-guardianview:not(.paid-content).content--type-recipe .content__headline,.content--type-guardianview:not(.paid-content) .button--secondary,.content--type-guardianview:not(.paid-content) .drop-cap,.content--type-guardianview:not(.paid-content) .element-pullquote p,.content--type-guardianview:not(.paid-content) .u-underline{color:#e05e00}.content--pillar-opinion:not(.paid-content) .button--primary,.content--pillar-opinion:not(.paid-content) .content__labels--splash:hover,.content--type-comment:not(.paid-content) .button--primary,.content--type-comment:not(.paid-content) .content__labels--splash:hover,.content--type-guardianview:not(.paid-content) .button--primary,.content--type-guardianview:not(.paid-content) .content__labels--splash:hover{background:#e05e00}.content--pillar-opinion:not(.paid-content) .byline,.content--pillar-opinion:not(.paid-content) .content--media .content__headline,.content--pillar-opinion:not(.paid-content) .content__label__link,.content--pillar-opinion:not(.paid-content) .pullquote-cite,.content--pillar-opinion:not(.paid-content) a,.content--type-comment:not(.paid-content) .byline,.content--type-comment:not(.paid-content) .content--media .content__headline,.content--type-comment:not(.paid-content) .content__label__link,.content--type-comment:not(.paid-content) .pullquote-cite,.content--type-comment:not(.paid-content) a,.content--type-guardianview:not(.paid-content) .byline,.content--type-guardianview:not(.paid-content) .content--media .content__headline,.content--type-guardianview:not(.paid-content) .content__label__link,.content--type-guardianview:not(.paid-content) .pullquote-cite,.content--type-guardianview:not(.paid-content) a{color:#e05e00}.content--pillar-opinion:not(.paid-content) .end-slate-container a,.content--type-comment:not(.paid-content) .end-slate-container a,.content--type-guardianview:not(.paid-content) .end-slate-container a{color:#ededed}.content--pillar-opinion:not(.paid-content) .content__meta-container .byline-img,.content--pillar-opinion:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--type-comment:not(.paid-content) .content__meta-container .byline-img,.content--type-comment:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--type-guardianview:not(.paid-content) .content__meta-container .byline-img,.content--type-guardianview:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#ff7f0f}.content--pillar-opinion:not(.paid-content) .block-share__item .inline-icon,.content--pillar-opinion:not(.paid-content) .commentcount2__heading span,.content--pillar-opinion:not(.paid-content) .inline-close svg,.content--pillar-opinion:not(.paid-content) .inline-triangle,.content--pillar-opinion:not(.paid-content) .social-icon svg,.content--pillar-opinion:not(.paid-content) .social-icon__svg,.content--type-comment:not(.paid-content) .block-share__item .inline-icon,.content--type-comment:not(.paid-content) .commentcount2__heading span,.content--type-comment:not(.paid-content) .inline-close svg,.content--type-comment:not(.paid-content) .inline-triangle,.content--type-comment:not(.paid-content) .social-icon svg,.content--type-comment:not(.paid-content) .social-icon__svg,.content--type-guardianview:not(.paid-content) .block-share__item .inline-icon,.content--type-guardianview:not(.paid-content) .commentcount2__heading span,.content--type-guardianview:not(.paid-content) .inline-close svg,.content--type-guardianview:not(.paid-content) .inline-triangle,.content--type-guardianview:not(.paid-content) .social-icon svg,.content--type-guardianview:not(.paid-content) .social-icon__svg{fill:#e05e00}.content--pillar-opinion:not(.paid-content) .inline-garnett-quote svg,.content--pillar-opinion:not(.paid-content) .content__series-cta__icon,.content--type-comment:not(.paid-content) .inline-garnett-quote svg,.content--type-comment:not(.paid-content) .content__series-cta__icon,.content--type-guardianview:not(.paid-content) .inline-garnett-quote svg,.content--type-guardianview:not(.paid-content) .content__series-cta__icon{fill:#e05e00}.content--pillar-opinion:not(.paid-content) .u-underline:hover,.content--type-comment:not(.paid-content) .u-underline:hover,.content--type-guardianview:not(.paid-content) .u-underline:hover{border-bottom:solid 0.0625rem #e05e00}.content--pillar-opinion:not(.paid-content) .bullet::before,.content--pillar-opinion:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-opinion:not(.paid-content) .content__labels--splash,.content--pillar-opinion:not(.paid-content) .content__labels--panel,.content--type-comment:not(.paid-content) .bullet::before,.content--type-comment:not(.paid-content) .content__headline-splash-wrapper,.content--type-comment:not(.paid-content) .content__labels--splash,.content--type-comment:not(.paid-content) .content__labels--panel,.content--type-guardianview:not(.paid-content) .bullet::before,.content--type-guardianview:not(.paid-content) .content__headline-splash-wrapper,.content--type-guardianview:not(.paid-content) .content__labels--splash,.content--type-guardianview:not(.paid-content) .content__labels--panel{background-color:#e05e00}.content--pillar-opinion:not(.paid-content) .block-share__item:focus,.content--pillar-opinion:not(.paid-content) .block-share__item:hover,.content--pillar-opinion:not(.paid-content) .social-icon:focus,.content--pillar-opinion:not(.paid-content) .social-icon:hover,.content--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:hover,.content--type-comment:not(.paid-content) .block-share__item:focus,.content--type-comment:not(.paid-content) .block-share__item:hover,.content--type-comment:not(.paid-content) .social-icon:focus,.content--type-comment:not(.paid-content) .social-icon:hover,.content--type-comment:not(.paid-content) .social-icon.social-icon--more:focus,.content--type-comment:not(.paid-content) .social-icon.social-icon--more:hover,.content--type-guardianview:not(.paid-content) .block-share__item:focus,.content--type-guardianview:not(.paid-content) .block-share__item:hover,.content--type-guardianview:not(.paid-content) .social-icon:focus,.content--type-guardianview:not(.paid-content) .social-icon:hover,.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:focus,.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#e05e00;border:0.0625rem solid #e05e00}.content--pillar-opinion:not(.paid-content) .block--content,.content--pillar-opinion:not(.paid-content) .block.is-summary,.content--type-comment:not(.paid-content) .block--content,.content--type-comment:not(.paid-content) .block.is-summary,.content--type-guardianview:not(.paid-content) .block--content,.content--type-guardianview:not(.paid-content) .block.is-summary{border-top-color:#e05e00}.content--pillar-opinion:not(.paid-content) .youtube-media-atom__play-button,.content--type-comment:not(.paid-content) .youtube-media-atom__play-button,.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button{background:#ff7f0f;border-radius:100%}.content--pillar-opinion:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--type-comment:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--type-guardianview:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon{fill:#ff7f0f}.content--pillar-opinion:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--type-comment:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--type-guardianview:not(.paid-content) .youtube-media-atom__bottom-bar__duration{color:#ff7f0f}.content--pillar-opinion:not(.paid-content) .content__label-interview,.content--type-comment:not(.paid-content) .content__label-interview,.content--type-guardianview:not(.paid-content) .content__label-interview{background-color:#e05e00;box-shadow:0.25rem 0 0 #e05e00,-0.375rem 0 0 #e05e00}.content--pillar-opinion:not(.paid-content) .meta__extras--crossword .social-icon,.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon,.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-opinion:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon:hover{background:#e05e00;border:0.0625rem solid #e05e00}.content--pillar-opinion:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg{fill:#e05e00}.content--pillar-opinion:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-arts.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-arts:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(107,88,64,0.5))}@media (min-width: 46.25em){.content--pillar-arts.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-arts:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(107,88,64,0.5))}}.content--pillar-arts.content--type-comment:not(.paid-content).content--type-feature .content__headline,.content--pillar-arts.content--type-comment:not(.paid-content).content--type-review .content__headline,.content--pillar-arts.content--type-comment:not(.paid-content).content--type-recipe .content__headline,.content--pillar-arts.content--type-comment:not(.paid-content) .button--secondary,.content--pillar-arts.content--type-comment:not(.paid-content) .drop-cap,.content--pillar-arts.content--type-comment:not(.paid-content) .element-pullquote p,.content--pillar-arts.content--type-comment:not(.paid-content) .u-underline,.content--pillar-arts.content--type-guardianview:not(.paid-content).content--type-feature .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content).content--type-review .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content).content--type-recipe .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content) .button--secondary,.content--pillar-arts.content--type-guardianview:not(.paid-content) .drop-cap,.content--pillar-arts.content--type-guardianview:not(.paid-content) .element-pullquote p,.content--pillar-arts.content--type-guardianview:not(.paid-content) .u-underline,.content--pillar-arts:not(.paid-content).content--type-feature .content__headline,.content--pillar-arts:not(.paid-content).content--type-review .content__headline,.content--pillar-arts:not(.paid-content).content--type-recipe .content__headline,.content--pillar-arts:not(.paid-content) .button--secondary,.content--pillar-arts:not(.paid-content) .drop-cap,.content--pillar-arts:not(.paid-content) .element-pullquote p,.content--pillar-arts:not(.paid-content) .u-underline{color:#6b5840}.content--pillar-arts.content--type-comment:not(.paid-content) .button--primary,.content--pillar-arts.content--type-comment:not(.paid-content) .content__labels--splash:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .button--primary,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__labels--splash:hover,.content--pillar-arts:not(.paid-content) .button--primary,.content--pillar-arts:not(.paid-content) .content__labels--splash:hover{background:#6b5840}.content--pillar-arts.content--type-comment:not(.paid-content) .byline,.content--pillar-arts.content--type-comment:not(.paid-content) .content--media .content__headline,.content--pillar-arts.content--type-comment:not(.paid-content) .content__label__link,.content--pillar-arts.content--type-comment:not(.paid-content) .pullquote-cite,.content--pillar-arts.content--type-comment:not(.paid-content) a,.content--pillar-arts.content--type-guardianview:not(.paid-content) .byline,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content--media .content__headline,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__label__link,.content--pillar-arts.content--type-guardianview:not(.paid-content) .pullquote-cite,.content--pillar-arts.content--type-guardianview:not(.paid-content) a,.content--pillar-arts:not(.paid-content) .byline,.content--pillar-arts:not(.paid-content) .content--media .content__headline,.content--pillar-arts:not(.paid-content) .content__label__link,.content--pillar-arts:not(.paid-content) .pullquote-cite,.content--pillar-arts:not(.paid-content) a{color:#a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .end-slate-container a,.content--pillar-arts.content--type-guardianview:not(.paid-content) .end-slate-container a,.content--pillar-arts:not(.paid-content) .end-slate-container a{color:#ededed}.content--pillar-arts.content--type-comment:not(.paid-content) .content__meta-container .byline-img,.content--pillar-arts.content--type-comment:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__meta-container .byline-img,.content--pillar-arts.content--type-guardianview:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-arts:not(.paid-content) .content__meta-container .byline-img,.content--pillar-arts:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#eacca0}.content--pillar-arts.content--type-comment:not(.paid-content) .block-share__item .inline-icon,.content--pillar-arts.content--type-comment:not(.paid-content) .commentcount2__heading span,.content--pillar-arts.content--type-comment:not(.paid-content) .inline-close svg,.content--pillar-arts.content--type-comment:not(.paid-content) .inline-triangle,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon svg,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon__svg,.content--pillar-arts.content--type-guardianview:not(.paid-content) .block-share__item .inline-icon,.content--pillar-arts.content--type-guardianview:not(.paid-content) .commentcount2__heading span,.content--pillar-arts.content--type-guardianview:not(.paid-content) .inline-close svg,.content--pillar-arts.content--type-guardianview:not(.paid-content) .inline-triangle,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon svg,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon__svg,.content--pillar-arts:not(.paid-content) .block-share__item .inline-icon,.content--pillar-arts:not(.paid-content) .commentcount2__heading span,.content--pillar-arts:not(.paid-content) .inline-close svg,.content--pillar-arts:not(.paid-content) .inline-triangle,.content--pillar-arts:not(.paid-content) .social-icon svg,.content--pillar-arts:not(.paid-content) .social-icon__svg{fill:#a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .inline-garnett-quote svg,.content--pillar-arts.content--type-comment:not(.paid-content) .content__series-cta__icon,.content--pillar-arts.content--type-guardianview:not(.paid-content) .inline-garnett-quote svg,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__series-cta__icon,.content--pillar-arts:not(.paid-content) .inline-garnett-quote svg,.content--pillar-arts:not(.paid-content) .content__series-cta__icon{fill:#a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .u-underline:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .u-underline:hover,.content--pillar-arts:not(.paid-content) .u-underline:hover{border-bottom:solid 0.0625rem #a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .bullet::before,.content--pillar-arts.content--type-comment:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-arts.content--type-comment:not(.paid-content) .content__labels--splash,.content--pillar-arts.content--type-comment:not(.paid-content) .content__labels--panel,.content--pillar-arts.content--type-guardianview:not(.paid-content) .bullet::before,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__labels--splash,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__labels--panel,.content--pillar-arts:not(.paid-content) .bullet::before,.content--pillar-arts:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-arts:not(.paid-content) .content__labels--splash,.content--pillar-arts:not(.paid-content) .content__labels--panel{background-color:#a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .block-share__item:focus,.content--pillar-arts.content--type-comment:not(.paid-content) .block-share__item:hover,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon:focus,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon:hover,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-arts.content--type-comment:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .block-share__item:focus,.content--pillar-arts.content--type-guardianview:not(.paid-content) .block-share__item:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon:focus,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-arts.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-arts:not(.paid-content) .block-share__item:focus,.content--pillar-arts:not(.paid-content) .block-share__item:hover,.content--pillar-arts:not(.paid-content) .social-icon:focus,.content--pillar-arts:not(.paid-content) .social-icon:hover,.content--pillar-arts:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-arts:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#a1845c;border:0.0625rem solid #a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .block--content,.content--pillar-arts.content--type-comment:not(.paid-content) .block.is-summary,.content--pillar-arts.content--type-guardianview:not(.paid-content) .block--content,.content--pillar-arts.content--type-guardianview:not(.paid-content) .block.is-summary,.content--pillar-arts:not(.paid-content) .block--content,.content--pillar-arts:not(.paid-content) .block.is-summary{border-top-color:#6b5840}.content--pillar-arts.content--type-comment:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-arts.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-arts:not(.paid-content) .youtube-media-atom__play-button{background:#eacca0;border-radius:100%}.content--pillar-arts.content--type-comment:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-arts.content--type-guardianview:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-arts:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon{fill:#eacca0}.content--pillar-arts.content--type-comment:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-arts.content--type-guardianview:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-arts:not(.paid-content) .youtube-media-atom__bottom-bar__duration{color:#eacca0}.content--pillar-arts.content--type-comment:not(.paid-content) .content__label-interview,.content--pillar-arts.content--type-guardianview:not(.paid-content) .content__label-interview,.content--pillar-arts:not(.paid-content) .content__label-interview{background-color:#6b5840;box-shadow:0.25rem 0 0 #6b5840,-0.375rem 0 0 #6b5840}.content--pillar-arts.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-arts.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-arts:not(.paid-content) .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-arts.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-arts:not(.paid-content) .meta__extras--crossword .social-icon:hover{background:#a1845c;border:0.0625rem solid #a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-arts.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-arts:not(.paid-content) .meta__extras--crossword .social-icon svg{fill:#a1845c}.content--pillar-arts.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-arts.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-arts:not(.paid-content) .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-lifestyle.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-lifestyle:not(.paid-content).content--type-analysis .content__headline,.content__head--crossword.content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(125,0,104,0.5))}@media (min-width: 46.25em){.content--pillar-lifestyle.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-lifestyle:not(.paid-content).content--type-analysis .content__headline,.content__head--crossword.content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(125,0,104,0.5))}}.content--pillar-lifestyle.content--type-comment:not(.paid-content).content--type-feature .content__headline,.content--pillar-lifestyle.content--type-comment:not(.paid-content).content--type-review .content__headline,.content--pillar-lifestyle.content--type-comment:not(.paid-content).content--type-recipe .content__headline,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .button--secondary,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .drop-cap,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .element-pullquote p,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .u-underline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content).content--type-feature .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content).content--type-review .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content).content--type-recipe .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .button--secondary,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .drop-cap,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .element-pullquote p,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .u-underline,.content--pillar-lifestyle:not(.paid-content).content--type-feature .content__headline,.content--pillar-lifestyle:not(.paid-content).content--type-review .content__headline,.content--pillar-lifestyle:not(.paid-content).content--type-recipe .content__headline,.content--pillar-lifestyle:not(.paid-content) .button--secondary,.content--pillar-lifestyle:not(.paid-content) .drop-cap,.content--pillar-lifestyle:not(.paid-content) .element-pullquote p,.content--pillar-lifestyle:not(.paid-content) .u-underline,.content__head--crossword.content--type-feature .content__headline,.content__head--crossword.content--type-review .content__headline,.content__head--crossword.content--type-recipe .content__headline,.content__head--crossword .button--secondary,.content__head--crossword .drop-cap,.content__head--crossword .element-pullquote p,.content__head--crossword .u-underline{color:#7d0068}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .button--primary,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__labels--splash:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .button--primary,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__labels--splash:hover,.content--pillar-lifestyle:not(.paid-content) .button--primary,.content--pillar-lifestyle:not(.paid-content) .content__labels--splash:hover,.content__head--crossword .button--primary,.content__head--crossword .content__labels--splash:hover{background:#7d0068}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .byline,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content--media .content__headline,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__label__link,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .pullquote-cite,.content--pillar-lifestyle.content--type-comment:not(.paid-content) a,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .byline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content--media .content__headline,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__label__link,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .pullquote-cite,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) a,.content--pillar-lifestyle:not(.paid-content) .byline,.content--pillar-lifestyle:not(.paid-content) .content--media .content__headline,.content--pillar-lifestyle:not(.paid-content) .content__label__link,.content--pillar-lifestyle:not(.paid-content) .pullquote-cite,.content--pillar-lifestyle:not(.paid-content) a,.content__head--crossword .byline,.content__head--crossword .content--media .content__headline,.content__head--crossword .content__label__link,.content__head--crossword .pullquote-cite,.content__head--crossword a{color:#bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .end-slate-container a,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .end-slate-container a,.content--pillar-lifestyle:not(.paid-content) .end-slate-container a,.content__head--crossword .end-slate-container a{color:#ededed}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__meta-container .byline-img,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__meta-container .byline-img,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-lifestyle:not(.paid-content) .content__meta-container .byline-img,.content--pillar-lifestyle:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content__head--crossword .content__meta-container .byline-img,.content__head--crossword .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#ffabdb}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .block-share__item .inline-icon,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .commentcount2__heading span,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .inline-close svg,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .inline-triangle,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon svg,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon__svg,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .block-share__item .inline-icon,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .commentcount2__heading span,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .inline-close svg,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .inline-triangle,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon svg,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon__svg,.content--pillar-lifestyle:not(.paid-content) .block-share__item .inline-icon,.content--pillar-lifestyle:not(.paid-content) .commentcount2__heading span,.content--pillar-lifestyle:not(.paid-content) .inline-close svg,.content--pillar-lifestyle:not(.paid-content) .inline-triangle,.content--pillar-lifestyle:not(.paid-content) .social-icon svg,.content--pillar-lifestyle:not(.paid-content) .social-icon__svg,.content__head--crossword .block-share__item .inline-icon,.content__head--crossword .commentcount2__heading span,.content__head--crossword .inline-close svg,.content__head--crossword .inline-triangle,.content__head--crossword .social-icon svg,.content__head--crossword .social-icon__svg{fill:#bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .inline-garnett-quote svg,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__series-cta__icon,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .inline-garnett-quote svg,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__series-cta__icon,.content--pillar-lifestyle:not(.paid-content) .inline-garnett-quote svg,.content--pillar-lifestyle:not(.paid-content) .content__series-cta__icon,.content__head--crossword .inline-garnett-quote svg,.content__head--crossword .content__series-cta__icon{fill:#bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .u-underline:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .u-underline:hover,.content--pillar-lifestyle:not(.paid-content) .u-underline:hover,.content__head--crossword .u-underline:hover{border-bottom:solid 0.0625rem #bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .bullet::before,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__labels--splash,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__labels--panel,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .bullet::before,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__labels--splash,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__labels--panel,.content--pillar-lifestyle:not(.paid-content) .bullet::before,.content--pillar-lifestyle:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-lifestyle:not(.paid-content) .content__labels--splash,.content--pillar-lifestyle:not(.paid-content) .content__labels--panel,.content__head--crossword .bullet::before,.content__head--crossword .content__headline-splash-wrapper,.content__head--crossword .content__labels--splash,.content__head--crossword .content__labels--panel{background-color:#bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .block-share__item:focus,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .block-share__item:hover,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon:focus,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon:hover,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .block-share__item:focus,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .block-share__item:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon:focus,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-lifestyle:not(.paid-content) .block-share__item:focus,.content--pillar-lifestyle:not(.paid-content) .block-share__item:hover,.content--pillar-lifestyle:not(.paid-content) .social-icon:focus,.content--pillar-lifestyle:not(.paid-content) .social-icon:hover,.content--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:hover,.content__head--crossword .block-share__item:focus,.content__head--crossword .block-share__item:hover,.content__head--crossword .social-icon:focus,.content__head--crossword .social-icon:hover,.content__head--crossword .social-icon.social-icon--more:focus,.content__head--crossword .social-icon.social-icon--more:hover{background-color:#bb3b80;border:0.0625rem solid #bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .block--content,.content--pillar-lifestyle.content--type-comment:not(.paid-content) .block.is-summary,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .block--content,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .block.is-summary,.content--pillar-lifestyle:not(.paid-content) .block--content,.content--pillar-lifestyle:not(.paid-content) .block.is-summary,.content__head--crossword .block--content,.content__head--crossword .block.is-summary{border-top-color:#7d0068}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-lifestyle:not(.paid-content) .youtube-media-atom__play-button,.content__head--crossword .youtube-media-atom__play-button{background:#ffabdb;border-radius:100%}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-lifestyle:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content__head--crossword .fc-item--media .fc-item__title .inline-video-icon{fill:#ffabdb}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-lifestyle:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content__head--crossword .youtube-media-atom__bottom-bar__duration{color:#ffabdb}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .content__label-interview,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .content__label-interview,.content--pillar-lifestyle:not(.paid-content) .content__label-interview,.content__head--crossword .content__label-interview{background-color:#7d0068;box-shadow:0.25rem 0 0 #7d0068,-0.375rem 0 0 #7d0068}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-lifestyle:not(.paid-content) .meta__extras--crossword .social-icon,.content__head--crossword .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-lifestyle:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content__head--crossword .meta__extras--crossword .social-icon:hover{background:#bb3b80;border:0.0625rem solid #bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-lifestyle:not(.paid-content) .meta__extras--crossword .social-icon svg,.content__head--crossword .meta__extras--crossword .social-icon svg{fill:#bb3b80}.content--pillar-lifestyle.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-lifestyle.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-lifestyle:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content__head--crossword .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-sport.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-sport:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(0,86,137,0.5))}@media (min-width: 46.25em){.content--pillar-sport.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-sport:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(0,86,137,0.5))}}.content--pillar-sport.content--type-comment:not(.paid-content).content--type-feature .content__headline,.content--pillar-sport.content--type-comment:not(.paid-content).content--type-review .content__headline,.content--pillar-sport.content--type-comment:not(.paid-content).content--type-recipe .content__headline,.content--pillar-sport.content--type-comment:not(.paid-content) .button--secondary,.content--pillar-sport.content--type-comment:not(.paid-content) .drop-cap,.content--pillar-sport.content--type-comment:not(.paid-content) .element-pullquote p,.content--pillar-sport.content--type-comment:not(.paid-content) .u-underline,.content--pillar-sport.content--type-guardianview:not(.paid-content).content--type-feature .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content).content--type-review .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content).content--type-recipe .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content) .button--secondary,.content--pillar-sport.content--type-guardianview:not(.paid-content) .drop-cap,.content--pillar-sport.content--type-guardianview:not(.paid-content) .element-pullquote p,.content--pillar-sport.content--type-guardianview:not(.paid-content) .u-underline,.content--pillar-sport:not(.paid-content).content--type-feature .content__headline,.content--pillar-sport:not(.paid-content).content--type-review .content__headline,.content--pillar-sport:not(.paid-content).content--type-recipe .content__headline,.content--pillar-sport:not(.paid-content) .button--secondary,.content--pillar-sport:not(.paid-content) .drop-cap,.content--pillar-sport:not(.paid-content) .element-pullquote p,.content--pillar-sport:not(.paid-content) .u-underline{color:#005689}.content--pillar-sport.content--type-comment:not(.paid-content) .button--primary,.content--pillar-sport.content--type-comment:not(.paid-content) .content__labels--splash:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .button--primary,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__labels--splash:hover,.content--pillar-sport:not(.paid-content) .button--primary,.content--pillar-sport:not(.paid-content) .content__labels--splash:hover{background:#005689}.content--pillar-sport.content--type-comment:not(.paid-content) .byline,.content--pillar-sport.content--type-comment:not(.paid-content) .content--media .content__headline,.content--pillar-sport.content--type-comment:not(.paid-content) .content__label__link,.content--pillar-sport.content--type-comment:not(.paid-content) .pullquote-cite,.content--pillar-sport.content--type-comment:not(.paid-content) a,.content--pillar-sport.content--type-guardianview:not(.paid-content) .byline,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content--media .content__headline,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__label__link,.content--pillar-sport.content--type-guardianview:not(.paid-content) .pullquote-cite,.content--pillar-sport.content--type-guardianview:not(.paid-content) a,.content--pillar-sport:not(.paid-content) .byline,.content--pillar-sport:not(.paid-content) .content--media .content__headline,.content--pillar-sport:not(.paid-content) .content__label__link,.content--pillar-sport:not(.paid-content) .pullquote-cite,.content--pillar-sport:not(.paid-content) a{color:#0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .end-slate-container a,.content--pillar-sport.content--type-guardianview:not(.paid-content) .end-slate-container a,.content--pillar-sport:not(.paid-content) .end-slate-container a{color:#ededed}.content--pillar-sport.content--type-comment:not(.paid-content) .content__meta-container .byline-img,.content--pillar-sport.content--type-comment:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__meta-container .byline-img,.content--pillar-sport.content--type-guardianview:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-sport:not(.paid-content) .content__meta-container .byline-img,.content--pillar-sport:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#00b2ff}.content--pillar-sport.content--type-comment:not(.paid-content) .block-share__item .inline-icon,.content--pillar-sport.content--type-comment:not(.paid-content) .commentcount2__heading span,.content--pillar-sport.content--type-comment:not(.paid-content) .inline-close svg,.content--pillar-sport.content--type-comment:not(.paid-content) .inline-triangle,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon svg,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon__svg,.content--pillar-sport.content--type-guardianview:not(.paid-content) .block-share__item .inline-icon,.content--pillar-sport.content--type-guardianview:not(.paid-content) .commentcount2__heading span,.content--pillar-sport.content--type-guardianview:not(.paid-content) .inline-close svg,.content--pillar-sport.content--type-guardianview:not(.paid-content) .inline-triangle,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon svg,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon__svg,.content--pillar-sport:not(.paid-content) .block-share__item .inline-icon,.content--pillar-sport:not(.paid-content) .commentcount2__heading span,.content--pillar-sport:not(.paid-content) .inline-close svg,.content--pillar-sport:not(.paid-content) .inline-triangle,.content--pillar-sport:not(.paid-content) .social-icon svg,.content--pillar-sport:not(.paid-content) .social-icon__svg{fill:#0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .inline-garnett-quote svg,.content--pillar-sport.content--type-comment:not(.paid-content) .content__series-cta__icon,.content--pillar-sport.content--type-guardianview:not(.paid-content) .inline-garnett-quote svg,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__series-cta__icon,.content--pillar-sport:not(.paid-content) .inline-garnett-quote svg,.content--pillar-sport:not(.paid-content) .content__series-cta__icon{fill:#0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .u-underline:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .u-underline:hover,.content--pillar-sport:not(.paid-content) .u-underline:hover{border-bottom:solid 0.0625rem #0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .bullet::before,.content--pillar-sport.content--type-comment:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-sport.content--type-comment:not(.paid-content) .content__labels--splash,.content--pillar-sport.content--type-comment:not(.paid-content) .content__labels--panel,.content--pillar-sport.content--type-guardianview:not(.paid-content) .bullet::before,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__labels--splash,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__labels--panel,.content--pillar-sport:not(.paid-content) .bullet::before,.content--pillar-sport:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-sport:not(.paid-content) .content__labels--splash,.content--pillar-sport:not(.paid-content) .content__labels--panel{background-color:#0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .block-share__item:focus,.content--pillar-sport.content--type-comment:not(.paid-content) .block-share__item:hover,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon:focus,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon:hover,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-sport.content--type-comment:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .block-share__item:focus,.content--pillar-sport.content--type-guardianview:not(.paid-content) .block-share__item:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon:focus,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-sport.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-sport:not(.paid-content) .block-share__item:focus,.content--pillar-sport:not(.paid-content) .block-share__item:hover,.content--pillar-sport:not(.paid-content) .social-icon:focus,.content--pillar-sport:not(.paid-content) .social-icon:hover,.content--pillar-sport:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-sport:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#0084c6;border:0.0625rem solid #0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .block--content,.content--pillar-sport.content--type-comment:not(.paid-content) .block.is-summary,.content--pillar-sport.content--type-guardianview:not(.paid-content) .block--content,.content--pillar-sport.content--type-guardianview:not(.paid-content) .block.is-summary,.content--pillar-sport:not(.paid-content) .block--content,.content--pillar-sport:not(.paid-content) .block.is-summary{border-top-color:#005689}.content--pillar-sport.content--type-comment:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-sport.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-sport:not(.paid-content) .youtube-media-atom__play-button{background:#00b2ff;border-radius:100%}.content--pillar-sport.content--type-comment:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-sport.content--type-guardianview:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-sport:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon{fill:#00b2ff}.content--pillar-sport.content--type-comment:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-sport.content--type-guardianview:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-sport:not(.paid-content) .youtube-media-atom__bottom-bar__duration{color:#00b2ff}.content--pillar-sport.content--type-comment:not(.paid-content) .content__label-interview,.content--pillar-sport.content--type-guardianview:not(.paid-content) .content__label-interview,.content--pillar-sport:not(.paid-content) .content__label-interview{background-color:#005689;box-shadow:0.25rem 0 0 #005689,-0.375rem 0 0 #005689}.content--pillar-sport.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-sport.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-sport:not(.paid-content) .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-sport.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-sport:not(.paid-content) .meta__extras--crossword .social-icon:hover{background:#0084c6;border:0.0625rem solid #0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-sport.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-sport:not(.paid-content) .meta__extras--crossword .social-icon svg{fill:#0084c6}.content--pillar-sport.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-sport.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-sport:not(.paid-content) .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-special-report.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-special-report:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.4375rem, rgba(63,70,74,0.5))}@media (min-width: 46.25em){.content--pillar-special-report.content--type-comment:not(.paid-content).content--type-analysis .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content).content--type-analysis .content__headline,.content--pillar-special-report:not(.paid-content).content--type-analysis .content__headline{background-image:repeating-linear-gradient(to bottom, transparent, transparent 2.9375rem, rgba(63,70,74,0.5))}}.content--pillar-special-report.content--type-comment:not(.paid-content).content--type-feature .content__headline,.content--pillar-special-report.content--type-comment:not(.paid-content).content--type-review .content__headline,.content--pillar-special-report.content--type-comment:not(.paid-content).content--type-recipe .content__headline,.content--pillar-special-report.content--type-comment:not(.paid-content) .button--secondary,.content--pillar-special-report.content--type-comment:not(.paid-content) .drop-cap,.content--pillar-special-report.content--type-comment:not(.paid-content) .element-pullquote p,.content--pillar-special-report.content--type-comment:not(.paid-content) .u-underline,.content--pillar-special-report.content--type-guardianview:not(.paid-content).content--type-feature .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content).content--type-review .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content).content--type-recipe .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .button--secondary,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .drop-cap,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .element-pullquote p,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .u-underline,.content--pillar-special-report:not(.paid-content).content--type-feature .content__headline,.content--pillar-special-report:not(.paid-content).content--type-review .content__headline,.content--pillar-special-report:not(.paid-content).content--type-recipe .content__headline,.content--pillar-special-report:not(.paid-content) .button--secondary,.content--pillar-special-report:not(.paid-content) .drop-cap,.content--pillar-special-report:not(.paid-content) .element-pullquote p,.content--pillar-special-report:not(.paid-content) .u-underline{color:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .button--primary,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__labels--splash:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .button--primary,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__labels--splash:hover,.content--pillar-special-report:not(.paid-content) .button--primary,.content--pillar-special-report:not(.paid-content) .content__labels--splash:hover{background:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .byline,.content--pillar-special-report.content--type-comment:not(.paid-content) .content--media .content__headline,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__label__link,.content--pillar-special-report.content--type-comment:not(.paid-content) .pullquote-cite,.content--pillar-special-report.content--type-comment:not(.paid-content) a,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .byline,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content--media .content__headline,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__label__link,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .pullquote-cite,.content--pillar-special-report.content--type-guardianview:not(.paid-content) a,.content--pillar-special-report:not(.paid-content) .byline,.content--pillar-special-report:not(.paid-content) .content--media .content__headline,.content--pillar-special-report:not(.paid-content) .content__label__link,.content--pillar-special-report:not(.paid-content) .pullquote-cite,.content--pillar-special-report:not(.paid-content) a{color:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .end-slate-container a,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .end-slate-container a,.content--pillar-special-report:not(.paid-content) .end-slate-container a{color:#ededed}.content--pillar-special-report.content--type-comment:not(.paid-content) .content__meta-container .byline-img,.content--pillar-special-report.content--type-comment:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__meta-container .byline-img,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text,.content--pillar-special-report:not(.paid-content) .content__meta-container .byline-img,.content--pillar-special-report:not(.paid-content) .gu-media-wrapper--video .vjs-big-play-button .vjs-control-text{background:#ffe500}.content--pillar-special-report.content--type-comment:not(.paid-content) .block-share__item .inline-icon,.content--pillar-special-report.content--type-comment:not(.paid-content) .commentcount2__heading span,.content--pillar-special-report.content--type-comment:not(.paid-content) .inline-close svg,.content--pillar-special-report.content--type-comment:not(.paid-content) .inline-triangle,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon svg,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon__svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .block-share__item .inline-icon,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .commentcount2__heading span,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .inline-close svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .inline-triangle,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon__svg,.content--pillar-special-report:not(.paid-content) .block-share__item .inline-icon,.content--pillar-special-report:not(.paid-content) .commentcount2__heading span,.content--pillar-special-report:not(.paid-content) .inline-close svg,.content--pillar-special-report:not(.paid-content) .inline-triangle,.content--pillar-special-report:not(.paid-content) .social-icon svg,.content--pillar-special-report:not(.paid-content) .social-icon__svg{fill:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .inline-garnett-quote svg,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__series-cta__icon,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .inline-garnett-quote svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__series-cta__icon,.content--pillar-special-report:not(.paid-content) .inline-garnett-quote svg,.content--pillar-special-report:not(.paid-content) .content__series-cta__icon{fill:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .u-underline:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .u-underline:hover,.content--pillar-special-report:not(.paid-content) .u-underline:hover{border-bottom:solid 0.0625rem #3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .bullet::before,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__labels--splash,.content--pillar-special-report.content--type-comment:not(.paid-content) .content__labels--panel,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .bullet::before,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__labels--splash,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__labels--panel,.content--pillar-special-report:not(.paid-content) .bullet::before,.content--pillar-special-report:not(.paid-content) .content__headline-splash-wrapper,.content--pillar-special-report:not(.paid-content) .content__labels--splash,.content--pillar-special-report:not(.paid-content) .content__labels--panel{background-color:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .block-share__item:focus,.content--pillar-special-report.content--type-comment:not(.paid-content) .block-share__item:hover,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon:focus,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon:hover,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-special-report.content--type-comment:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .block-share__item:focus,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .block-share__item:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon:focus,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .social-icon.social-icon--more:hover,.content--pillar-special-report:not(.paid-content) .block-share__item:focus,.content--pillar-special-report:not(.paid-content) .block-share__item:hover,.content--pillar-special-report:not(.paid-content) .social-icon:focus,.content--pillar-special-report:not(.paid-content) .social-icon:hover,.content--pillar-special-report:not(.paid-content) .social-icon.social-icon--more:focus,.content--pillar-special-report:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#3f464a;border:0.0625rem solid #3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .block--content,.content--pillar-special-report.content--type-comment:not(.paid-content) .block.is-summary,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .block--content,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .block.is-summary,.content--pillar-special-report:not(.paid-content) .block--content,.content--pillar-special-report:not(.paid-content) .block.is-summary{border-top-color:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button,.content--pillar-special-report:not(.paid-content) .youtube-media-atom__play-button{background:#ffe500;border-radius:100%}.content--pillar-special-report.content--type-comment:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon,.content--pillar-special-report:not(.paid-content) .fc-item--media .fc-item__title .inline-video-icon{fill:#ffe500}.content--pillar-special-report.content--type-comment:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .youtube-media-atom__bottom-bar__duration,.content--pillar-special-report:not(.paid-content) .youtube-media-atom__bottom-bar__duration{color:#ffe500}.content--pillar-special-report.content--type-comment:not(.paid-content) .content__label-interview,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .content__label-interview,.content--pillar-special-report:not(.paid-content) .content__label-interview{background-color:#3f464a;box-shadow:0.25rem 0 0 #3f464a,-0.375rem 0 0 #3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon,.content--pillar-special-report:not(.paid-content) .meta__extras--crossword .social-icon{background:#fff;border:0.0625rem solid #dcdcdc}.content--pillar-special-report.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon:hover,.content--pillar-special-report:not(.paid-content) .meta__extras--crossword .social-icon:hover{background:#3f464a;border:0.0625rem solid #3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg,.content--pillar-special-report:not(.paid-content) .meta__extras--crossword .social-icon svg{fill:#3f464a}.content--pillar-special-report.content--type-comment:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .meta__extras--crossword .social-icon svg:hover,.content--pillar-special-report:not(.paid-content) .meta__extras--crossword .social-icon svg:hover{fill:#fff}.content--pillar-special-report.content--type-comment:not(.paid-content) .youtube-media-atom__play-button .inline-icon svg,.content--pillar-special-report.content--type-guardianview:not(.paid-content) .youtube-media-atom__play-button .inline-icon svg,.content--pillar-special-report:not(.paid-content) .youtube-media-atom__play-button .inline-icon svg{fill:#121212}.content-footer--pillar-news:not(.paid-content) ._underline_1lj47_3,.content-footer--pillar-news:not(.paid-content) .d-comment__action,.content-footer--pillar-news:not(.paid-content) .d-comment__author a[href],.content-footer--pillar-news:not(.paid-content) .d-comment__reply-to-author,.content-footer--pillar-news:not(.paid-content) .d-show-more-replies__button,.content-footer--pillar-news:not(.paid-content) .js-discussion-author-link{color:#c70000}.content-footer--pillar-news:not(.paid-content) ._underline_1lj47_3:focus,.content-footer--pillar-news:not(.paid-content) ._underline_1lj47_3:hover{border-color:#c70000}.content-footer--pillar-news:not(.paid-content) .tabs__tab--selected:after{background-color:#c70000}.content-footer--pillar-news:not(.paid-content) .comment-share-icon,.content-footer--pillar-news:not(.paid-content) .d-show-more-replies__button.button--show-more svg,.content-footer--pillar-news:not(.paid-content) .inline-reply.blue{fill:#767676;left:0.41667rem}.content-footer--pillar-news:not(.paid-content) .discussion__top-border{border-top:0.0625rem solid #dcdcdc}.content-footer--pillar-news:not(.paid-content) .button--primary{background-color:#c70000;border-color:#c70000}.content-footer--pillar-news:not(.paid-content) .button--primary:active,.content-footer--pillar-news:not(.paid-content) .button--primary:focus,.content-footer--pillar-news:not(.paid-content) .button--primary:hover{background-color:#940000;border-color:#940000}.content-footer--pillar-news:not(.paid-content) .button--tertiary:active,.content-footer--pillar-news:not(.paid-content) .button--tertiary:focus{color:#c70000}.content-footer--pillar-news:not(.paid-content) .d-show-more-replies__button{border:0.0625rem solid #dcdcdc;background:#fff}.content-footer--pillar-news:not(.paid-content) .d-show-more-replies__button:focus,.content-footer--pillar-news:not(.paid-content) .d-show-more-replies__button:hover{border:0.0625rem solid #a9a9a9;background:#fff}.content-footer--pillar-news:not(.paid-content) .button--show-more svg{left:0.625rem}.content-footer--pillar-news:not(.paid-content) .block-share__item,.content-footer--pillar-news:not(.paid-content) .inline-close,.content-footer--pillar-news:not(.paid-content) .social-icon,.content-footer--pillar-news:not(.paid-content) .social-icon.social-icon--more{background-color:transparent;border:0.0625rem solid #dcdcdc}.content-footer--pillar-news:not(.paid-content) .block-share__item:focus svg,.content-footer--pillar-news:not(.paid-content) .block-share__item:hover svg,.content-footer--pillar-news:not(.paid-content) .inline-close:focus svg,.content-footer--pillar-news:not(.paid-content) .inline-close:hover svg,.content-footer--pillar-news:not(.paid-content) .social-icon:focus svg,.content-footer--pillar-news:not(.paid-content) .social-icon:hover svg,.content-footer--pillar-news:not(.paid-content) .social-icon.social-icon--more:focus svg,.content-footer--pillar-news:not(.paid-content) .social-icon.social-icon--more:hover svg{fill:#fff}.content-footer--pillar-news:not(.paid-content) .block-share__item .inline-icon,.content-footer--pillar-news:not(.paid-content) .commentcount2__heading span,.content-footer--pillar-news:not(.paid-content) .inline-close svg,.content-footer--pillar-news:not(.paid-content) .social-icon svg,.content-footer--pillar-news:not(.paid-content) .social-icon__svg{fill:#c70000}.content-footer--pillar-news:not(.paid-content) .block-share__item:focus,.content-footer--pillar-news:not(.paid-content) .block-share__item:hover,.content-footer--pillar-news:not(.paid-content) .meta__twitter a:focus,.content-footer--pillar-news:not(.paid-content) .meta__twitter a:hover,.content-footer--pillar-news:not(.paid-content) .social-icon:focus,.content-footer--pillar-news:not(.paid-content) .social-icon:hover,.content-footer--pillar-news:not(.paid-content) .social-icon.social-icon--more:focus,.content-footer--pillar-news:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#c70000;border:0.0625rem solid #c70000}.content-footer--pillar-arts:not(.paid-content) ._underline_1lj47_3,.content-footer--pillar-arts:not(.paid-content) .d-comment__action,.content-footer--pillar-arts:not(.paid-content) .d-comment__author a[href],.content-footer--pillar-arts:not(.paid-content) .d-comment__reply-to-author,.content-footer--pillar-arts:not(.paid-content) .d-show-more-replies__button,.content-footer--pillar-arts:not(.paid-content) .js-discussion-author-link{color:#6b5840}.content-footer--pillar-arts:not(.paid-content) ._underline_1lj47_3:focus,.content-footer--pillar-arts:not(.paid-content) ._underline_1lj47_3:hover{border-color:#6b5840}.content-footer--pillar-arts:not(.paid-content) .tabs__tab--selected:after{background-color:#6b5840}.content-footer--pillar-arts:not(.paid-content) .comment-share-icon,.content-footer--pillar-arts:not(.paid-content) .d-show-more-replies__button.button--show-more svg,.content-footer--pillar-arts:not(.paid-content) .inline-reply.blue{fill:#767676;left:0.41667rem}.content-footer--pillar-arts:not(.paid-content) .discussion__top-border{border-top:0.0625rem solid #dcdcdc}.content-footer--pillar-arts:not(.paid-content) .button--primary{background-color:#6b5840;border-color:#6b5840}.content-footer--pillar-arts:not(.paid-content) .button--primary:active,.content-footer--pillar-arts:not(.paid-content) .button--primary:focus,.content-footer--pillar-arts:not(.paid-content) .button--primary:hover{background-color:#4b3e2d;border-color:#4b3e2d}.content-footer--pillar-arts:not(.paid-content) .button--tertiary:active,.content-footer--pillar-arts:not(.paid-content) .button--tertiary:focus{color:#6b5840}.content-footer--pillar-arts:not(.paid-content) .d-show-more-replies__button{border:0.0625rem solid #dcdcdc;background:#fff}.content-footer--pillar-arts:not(.paid-content) .d-show-more-replies__button:focus,.content-footer--pillar-arts:not(.paid-content) .d-show-more-replies__button:hover{border:0.0625rem solid #a9a9a9;background:#fff}.content-footer--pillar-arts:not(.paid-content) .button--show-more svg{left:0.625rem}.content-footer--pillar-arts:not(.paid-content) .block-share__item,.content-footer--pillar-arts:not(.paid-content) .inline-close,.content-footer--pillar-arts:not(.paid-content) .social-icon,.content-footer--pillar-arts:not(.paid-content) .social-icon.social-icon--more{background-color:transparent;border:0.0625rem solid #dcdcdc}.content-footer--pillar-arts:not(.paid-content) .block-share__item:focus svg,.content-footer--pillar-arts:not(.paid-content) .block-share__item:hover svg,.content-footer--pillar-arts:not(.paid-content) .inline-close:focus svg,.content-footer--pillar-arts:not(.paid-content) .inline-close:hover svg,.content-footer--pillar-arts:not(.paid-content) .social-icon:focus svg,.content-footer--pillar-arts:not(.paid-content) .social-icon:hover svg,.content-footer--pillar-arts:not(.paid-content) .social-icon.social-icon--more:focus svg,.content-footer--pillar-arts:not(.paid-content) .social-icon.social-icon--more:hover svg{fill:#fff}.content-footer--pillar-arts:not(.paid-content) .block-share__item .inline-icon,.content-footer--pillar-arts:not(.paid-content) .commentcount2__heading span,.content-footer--pillar-arts:not(.paid-content) .inline-close svg,.content-footer--pillar-arts:not(.paid-content) .social-icon svg,.content-footer--pillar-arts:not(.paid-content) .social-icon__svg{fill:#6b5840}.content-footer--pillar-arts:not(.paid-content) .block-share__item:focus,.content-footer--pillar-arts:not(.paid-content) .block-share__item:hover,.content-footer--pillar-arts:not(.paid-content) .meta__twitter a:focus,.content-footer--pillar-arts:not(.paid-content) .meta__twitter a:hover,.content-footer--pillar-arts:not(.paid-content) .social-icon:focus,.content-footer--pillar-arts:not(.paid-content) .social-icon:hover,.content-footer--pillar-arts:not(.paid-content) .social-icon.social-icon--more:focus,.content-footer--pillar-arts:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#6b5840;border:0.0625rem solid #6b5840}.content-footer--pillar-lifestyle:not(.paid-content) ._underline_1lj47_3,.content-footer--pillar-lifestyle:not(.paid-content) .d-comment__action,.content-footer--pillar-lifestyle:not(.paid-content) .d-comment__author a[href],.content-footer--pillar-lifestyle:not(.paid-content) .d-comment__reply-to-author,.content-footer--pillar-lifestyle:not(.paid-content) .d-show-more-replies__button,.content-footer--pillar-lifestyle:not(.paid-content) .js-discussion-author-link{color:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) ._underline_1lj47_3:focus,.content-footer--pillar-lifestyle:not(.paid-content) ._underline_1lj47_3:hover{border-color:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) .tabs__tab--selected:after{background-color:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) .comment-share-icon,.content-footer--pillar-lifestyle:not(.paid-content) .d-show-more-replies__button.button--show-more svg,.content-footer--pillar-lifestyle:not(.paid-content) .inline-reply.blue{fill:#767676;left:0.41667rem}.content-footer--pillar-lifestyle:not(.paid-content) .discussion__top-border{border-top:0.0625rem solid #dcdcdc}.content-footer--pillar-lifestyle:not(.paid-content) .button--primary{background-color:#7d0068;border-color:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) .button--primary:active,.content-footer--pillar-lifestyle:not(.paid-content) .button--primary:focus,.content-footer--pillar-lifestyle:not(.paid-content) .button--primary:hover{background-color:#4a003e;border-color:#4a003e}.content-footer--pillar-lifestyle:not(.paid-content) .button--tertiary:active,.content-footer--pillar-lifestyle:not(.paid-content) .button--tertiary:focus{color:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) .d-show-more-replies__button{border:0.0625rem solid #dcdcdc;background:#fff}.content-footer--pillar-lifestyle:not(.paid-content) .d-show-more-replies__button:focus,.content-footer--pillar-lifestyle:not(.paid-content) .d-show-more-replies__button:hover{border:0.0625rem solid #a9a9a9;background:#fff}.content-footer--pillar-lifestyle:not(.paid-content) .button--show-more svg{left:0.625rem}.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item,.content-footer--pillar-lifestyle:not(.paid-content) .inline-close,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more{background-color:transparent;border:0.0625rem solid #dcdcdc}.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item:focus svg,.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item:hover svg,.content-footer--pillar-lifestyle:not(.paid-content) .inline-close:focus svg,.content-footer--pillar-lifestyle:not(.paid-content) .inline-close:hover svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon:focus svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon:hover svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:focus svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:hover svg{fill:#fff}.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item .inline-icon,.content-footer--pillar-lifestyle:not(.paid-content) .commentcount2__heading span,.content-footer--pillar-lifestyle:not(.paid-content) .inline-close svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon svg,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon__svg{fill:#7d0068}.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item:focus,.content-footer--pillar-lifestyle:not(.paid-content) .block-share__item:hover,.content-footer--pillar-lifestyle:not(.paid-content) .meta__twitter a:focus,.content-footer--pillar-lifestyle:not(.paid-content) .meta__twitter a:hover,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon:focus,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon:hover,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:focus,.content-footer--pillar-lifestyle:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#7d0068;border:0.0625rem solid #7d0068}.content-footer--pillar-opinion:not(.paid-content) ._underline_1lj47_3,.content-footer--pillar-opinion:not(.paid-content) .d-comment__action,.content-footer--pillar-opinion:not(.paid-content) .d-comment__author a[href],.content-footer--pillar-opinion:not(.paid-content) .d-comment__reply-to-author,.content-footer--pillar-opinion:not(.paid-content) .d-show-more-replies__button,.content-footer--pillar-opinion:not(.paid-content) .js-discussion-author-link{color:#e05e00}.content-footer--pillar-opinion:not(.paid-content) ._underline_1lj47_3:focus,.content-footer--pillar-opinion:not(.paid-content) ._underline_1lj47_3:hover{border-color:#e05e00}.content-footer--pillar-opinion:not(.paid-content) .tabs__tab--selected:after{background-color:#e05e00}.content-footer--pillar-opinion:not(.paid-content) .comment-share-icon,.content-footer--pillar-opinion:not(.paid-content) .d-show-more-replies__button.button--show-more svg,.content-footer--pillar-opinion:not(.paid-content) .inline-reply.blue{fill:#767676;left:0.41667rem}.content-footer--pillar-opinion:not(.paid-content) .discussion__top-border{border-top:0.0625rem solid #dcdcdc}.content-footer--pillar-opinion:not(.paid-content) .button--primary{background-color:#e05e00;border-color:#e05e00}.content-footer--pillar-opinion:not(.paid-content) .button--primary:active,.content-footer--pillar-opinion:not(.paid-content) .button--primary:focus,.content-footer--pillar-opinion:not(.paid-content) .button--primary:hover{background-color:#ad4900;border-color:#ad4900}.content-footer--pillar-opinion:not(.paid-content) .button--tertiary:active,.content-footer--pillar-opinion:not(.paid-content) .button--tertiary:focus{color:#e05e00}.content-footer--pillar-opinion:not(.paid-content) .d-show-more-replies__button{border:0.0625rem solid #dcdcdc;background:#fff}.content-footer--pillar-opinion:not(.paid-content) .d-show-more-replies__button:focus,.content-footer--pillar-opinion:not(.paid-content) .d-show-more-replies__button:hover{border:0.0625rem solid #a9a9a9;background:#fff}.content-footer--pillar-opinion:not(.paid-content) .button--show-more svg{left:0.625rem}.content-footer--pillar-opinion:not(.paid-content) .block-share__item,.content-footer--pillar-opinion:not(.paid-content) .inline-close,.content-footer--pillar-opinion:not(.paid-content) .social-icon,.content-footer--pillar-opinion:not(.paid-content) .social-icon.social-icon--more{background-color:transparent;border:0.0625rem solid #dcdcdc}.content-footer--pillar-opinion:not(.paid-content) .block-share__item:focus svg,.content-footer--pillar-opinion:not(.paid-content) .block-share__item:hover svg,.content-footer--pillar-opinion:not(.paid-content) .inline-close:focus svg,.content-footer--pillar-opinion:not(.paid-content) .inline-close:hover svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon:focus svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon:hover svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:focus svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:hover svg{fill:#fff}.content-footer--pillar-opinion:not(.paid-content) .block-share__item .inline-icon,.content-footer--pillar-opinion:not(.paid-content) .commentcount2__heading span,.content-footer--pillar-opinion:not(.paid-content) .inline-close svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon svg,.content-footer--pillar-opinion:not(.paid-content) .social-icon__svg{fill:#e05e00}.content-footer--pillar-opinion:not(.paid-content) .block-share__item:focus,.content-footer--pillar-opinion:not(.paid-content) .block-share__item:hover,.content-footer--pillar-opinion:not(.paid-content) .meta__twitter a:focus,.content-footer--pillar-opinion:not(.paid-content) .meta__twitter a:hover,.content-footer--pillar-opinion:not(.paid-content) .social-icon:focus,.content-footer--pillar-opinion:not(.paid-content) .social-icon:hover,.content-footer--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:focus,.content-footer--pillar-opinion:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#e05e00;border:0.0625rem solid #e05e00}.content-footer--pillar-sport:not(.paid-content) ._underline_1lj47_3,.content-footer--pillar-sport:not(.paid-content) .d-comment__action,.content-footer--pillar-sport:not(.paid-content) .d-comment__author a[href],.content-footer--pillar-sport:not(.paid-content) .d-comment__reply-to-author,.content-footer--pillar-sport:not(.paid-content) .d-show-more-replies__button,.content-footer--pillar-sport:not(.paid-content) .js-discussion-author-link{color:#0084c6}.content-footer--pillar-sport:not(.paid-content) ._underline_1lj47_3:focus,.content-footer--pillar-sport:not(.paid-content) ._underline_1lj47_3:hover{border-color:#0084c6}.content-footer--pillar-sport:not(.paid-content) .tabs__tab--selected:after{background-color:#0084c6}.content-footer--pillar-sport:not(.paid-content) .comment-share-icon,.content-footer--pillar-sport:not(.paid-content) .d-show-more-replies__button.button--show-more svg,.content-footer--pillar-sport:not(.paid-content) .inline-reply.blue{fill:#767676;left:0.41667rem}.content-footer--pillar-sport:not(.paid-content) .discussion__top-border{border-top:0.0625rem solid #dcdcdc}.content-footer--pillar-sport:not(.paid-content) .button--primary{background-color:#0084c6;border-color:#0084c6}.content-footer--pillar-sport:not(.paid-content) .button--primary:active,.content-footer--pillar-sport:not(.paid-content) .button--primary:focus,.content-footer--pillar-sport:not(.paid-content) .button--primary:hover{background-color:#006293;border-color:#006293}.content-footer--pillar-sport:not(.paid-content) .button--tertiary:active,.content-footer--pillar-sport:not(.paid-content) .button--tertiary:focus{color:#0084c6}.content-footer--pillar-sport:not(.paid-content) .d-show-more-replies__button{border:0.0625rem solid #dcdcdc;background:#fff}.content-footer--pillar-sport:not(.paid-content) .d-show-more-replies__button:focus,.content-footer--pillar-sport:not(.paid-content) .d-show-more-replies__button:hover{border:0.0625rem solid #a9a9a9;background:#fff}.content-footer--pillar-sport:not(.paid-content) .button--show-more svg{left:0.625rem}.content-footer--pillar-sport:not(.paid-content) .block-share__item,.content-footer--pillar-sport:not(.paid-content) .inline-close,.content-footer--pillar-sport:not(.paid-content) .social-icon,.content-footer--pillar-sport:not(.paid-content) .social-icon.social-icon--more{background-color:transparent;border:0.0625rem solid #dcdcdc}.content-footer--pillar-sport:not(.paid-content) .block-share__item:focus svg,.content-footer--pillar-sport:not(.paid-content) .block-share__item:hover svg,.content-footer--pillar-sport:not(.paid-content) .inline-close:focus svg,.content-footer--pillar-sport:not(.paid-content) .inline-close:hover svg,.content-footer--pillar-sport:not(.paid-content) .social-icon:focus svg,.content-footer--pillar-sport:not(.paid-content) .social-icon:hover svg,.content-footer--pillar-sport:not(.paid-content) .social-icon.social-icon--more:focus svg,.content-footer--pillar-sport:not(.paid-content) .social-icon.social-icon--more:hover svg{fill:#fff}.content-footer--pillar-sport:not(.paid-content) .block-share__item .inline-icon,.content-footer--pillar-sport:not(.paid-content) .commentcount2__heading span,.content-footer--pillar-sport:not(.paid-content) .inline-close svg,.content-footer--pillar-sport:not(.paid-content) .social-icon svg,.content-footer--pillar-sport:not(.paid-content) .social-icon__svg{fill:#0084c6}.content-footer--pillar-sport:not(.paid-content) .block-share__item:focus,.content-footer--pillar-sport:not(.paid-content) .block-share__item:hover,.content-footer--pillar-sport:not(.paid-content) .meta__twitter a:focus,.content-footer--pillar-sport:not(.paid-content) .meta__twitter a:hover,.content-footer--pillar-sport:not(.paid-content) .social-icon:focus,.content-footer--pillar-sport:not(.paid-content) .social-icon:hover,.content-footer--pillar-sport:not(.paid-content) .social-icon.social-icon--more:focus,.content-footer--pillar-sport:not(.paid-content) .social-icon.social-icon--more:hover{background-color:#0084c6;border:0.0625rem solid #0084c6}.content--media:not(.paid-content).content--pillar-news .content__section-label__link,.content--media:not(.paid-content).content--pillar-news .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-news .content__section-label__link,.immersive-main-media__headline-container.content--pillar-news .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container--gallery.content--pillar-news .content__section-label__link,.immersive-main-media__headline-container--gallery.content--pillar-news .youtube-media-atom__bottom-bar__duration{color:#ff4e36}.content--media:not(.paid-content).content--pillar-news .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-news .vjs-play-progress,.content--media:not(.paid-content).content--pillar-news .vjs-volume-level,.content--media:not(.paid-content).content--pillar-news .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-news .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-news .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-news .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-news .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-news .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-news .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-news .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-news .youtube-media-atom__play-button:before,.immersive-main-media__headline-container--gallery.content--pillar-news .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container--gallery.content--pillar-news .vjs-play-progress,.immersive-main-media__headline-container--gallery.content--pillar-news .vjs-volume-level,.immersive-main-media__headline-container--gallery.content--pillar-news .vjs-volume-level:before,.immersive-main-media__headline-container--gallery.content--pillar-news .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container--gallery.content--pillar-news .youtube-media-atom__play-button:before{background:#ff4e36}.content--media:not(.paid-content).content--pillar-news .inline-camera,.content--media:not(.paid-content).content--pillar-news .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-news .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-news .inline-camera,.immersive-main-media__headline-container.content--pillar-news .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-news .inline-volume-high.inline-icon,.immersive-main-media__headline-container--gallery.content--pillar-news .inline-camera,.immersive-main-media__headline-container--gallery.content--pillar-news .inline-video-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-news .inline-volume-high.inline-icon{fill:#ff4e36}.content--media:not(.paid-content).content--pillar-news .social-icon__svg,.immersive-main-media__headline-container.content--pillar-news .social-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-news .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-news .content__label__link,.immersive-main-media__headline-container.content--pillar-news .content__label__link,.immersive-main-media__headline-container--gallery.content--pillar-news .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-news .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-news .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-news .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-news .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-news .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-news .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--media:not(.paid-content).content--pillar-opinion .content__section-label__link,.content--media:not(.paid-content).content--pillar-opinion .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-opinion .content__section-label__link,.immersive-main-media__headline-container.content--pillar-opinion .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container--gallery.content--pillar-opinion .content__section-label__link,.immersive-main-media__headline-container--gallery.content--pillar-opinion .youtube-media-atom__bottom-bar__duration{color:#ff7f0f}.content--media:not(.paid-content).content--pillar-opinion .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-opinion .vjs-play-progress,.content--media:not(.paid-content).content--pillar-opinion .vjs-volume-level,.content--media:not(.paid-content).content--pillar-opinion .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-opinion .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-opinion .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-opinion .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-opinion .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-opinion .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-opinion .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-opinion .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-opinion .youtube-media-atom__play-button:before,.immersive-main-media__headline-container--gallery.content--pillar-opinion .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-play-progress,.immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-volume-level,.immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-volume-level:before,.immersive-main-media__headline-container--gallery.content--pillar-opinion .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container--gallery.content--pillar-opinion .youtube-media-atom__play-button:before{background:#ff7f0f}.content--media:not(.paid-content).content--pillar-opinion .inline-camera,.content--media:not(.paid-content).content--pillar-opinion .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-opinion .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-opinion .inline-camera,.immersive-main-media__headline-container.content--pillar-opinion .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-opinion .inline-volume-high.inline-icon,.immersive-main-media__headline-container--gallery.content--pillar-opinion .inline-camera,.immersive-main-media__headline-container--gallery.content--pillar-opinion .inline-video-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-opinion .inline-volume-high.inline-icon{fill:#ff7f0f}.content--media:not(.paid-content).content--pillar-opinion .social-icon__svg,.immersive-main-media__headline-container.content--pillar-opinion .social-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-opinion .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-opinion .content__label__link,.immersive-main-media__headline-container.content--pillar-opinion .content__label__link,.immersive-main-media__headline-container--gallery.content--pillar-opinion .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-opinion .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-opinion .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-opinion .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-opinion .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-opinion .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--media:not(.paid-content).content--pillar-arts .content__section-label__link,.content--media:not(.paid-content).content--pillar-arts .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .content__section-label__link,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .youtube-media-atom__bottom-bar__duration{color:#eacca0}.content--media:not(.paid-content).content--pillar-arts .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-arts .vjs-play-progress,.content--media:not(.paid-content).content--pillar-arts .vjs-volume-level,.content--media:not(.paid-content).content--pillar-arts .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-arts .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-arts .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .youtube-media-atom__play-button:before{background:#eacca0}.content--media:not(.paid-content).content--pillar-arts .inline-camera,.content--media:not(.paid-content).content--pillar-arts .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-arts .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .inline-camera,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .inline-volume-high.inline-icon{fill:#eacca0}.content--media:not(.paid-content).content--pillar-arts .social-icon__svg,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-arts .content__label__link,.immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-arts .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-arts .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-arts .immersive-main-media__headline-container--gallery.content--pillar-arts .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--media:not(.paid-content).content--pillar-lifestyle .content__section-label__link,.content--media:not(.paid-content).content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-lifestyle .content__section-label__link,.immersive-main-media__headline-container.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .content__section-label__link,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration{color:#ffabdb}.content--media:not(.paid-content).content--pillar-lifestyle .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-lifestyle .vjs-play-progress,.content--media:not(.paid-content).content--pillar-lifestyle .vjs-volume-level,.content--media:not(.paid-content).content--pillar-lifestyle .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-lifestyle .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-lifestyle .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-lifestyle .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-lifestyle .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-lifestyle .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-lifestyle .youtube-media-atom__play-button:before,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-play-progress,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-volume-level,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-volume-level:before,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .youtube-media-atom__play-button:before{background:#ffabdb}.content--media:not(.paid-content).content--pillar-lifestyle .inline-camera,.content--media:not(.paid-content).content--pillar-lifestyle .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-lifestyle .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-lifestyle .inline-camera,.immersive-main-media__headline-container.content--pillar-lifestyle .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-lifestyle .inline-volume-high.inline-icon,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .inline-camera,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .inline-video-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .inline-volume-high.inline-icon{fill:#ffabdb}.content--media:not(.paid-content).content--pillar-lifestyle .social-icon__svg,.immersive-main-media__headline-container.content--pillar-lifestyle .social-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-lifestyle .content__label__link,.immersive-main-media__headline-container.content--pillar-lifestyle .content__label__link,.immersive-main-media__headline-container--gallery.content--pillar-lifestyle .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-lifestyle .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-lifestyle .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-lifestyle .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--media:not(.paid-content).content--pillar-sport .content__section-label__link,.content--media:not(.paid-content).content--pillar-sport .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-sport .content__section-label__link,.immersive-main-media__headline-container.content--pillar-sport .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .content__section-label__link,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration{color:#00b2ff}.content--media:not(.paid-content).content--pillar-sport .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-sport .vjs-play-progress,.content--media:not(.paid-content).content--pillar-sport .vjs-volume-level,.content--media:not(.paid-content).content--pillar-sport .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-sport .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-sport .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-sport .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-sport .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-sport .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-sport .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-sport .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-sport .youtube-media-atom__play-button:before,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-play-progress,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-volume-level,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-volume-level:before,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .youtube-media-atom__play-button:before{background:#00b2ff}.content--media:not(.paid-content).content--pillar-sport .inline-camera,.content--media:not(.paid-content).content--pillar-sport .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-sport .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-sport .inline-camera,.immersive-main-media__headline-container.content--pillar-sport .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-sport .inline-volume-high.inline-icon,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .inline-camera,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .inline-video-icon__svg,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .inline-volume-high.inline-icon{fill:#00b2ff}.content--media:not(.paid-content).content--pillar-sport .social-icon__svg,.immersive-main-media__headline-container.content--pillar-sport .social-icon__svg,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-sport .content__label__link,.immersive-main-media__headline-container.content--pillar-sport .content__label__link,.immersive-main-media__headline-container-gallery.content--pillar-lifestyle .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-sport .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-sport .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-sport .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-sport .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container-gallery.content--pillar-lifestyle .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--media:not(.paid-content).content--pillar-special-report .content__section-label__link,.content--media:not(.paid-content).content--pillar-special-report .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container.content--pillar-special-report .content__section-label__link,.immersive-main-media__headline-container.content--pillar-special-report .youtube-media-atom__bottom-bar__duration,.immersive-main-media__headline-container--gallery.content--pillar-special-report .content__section-label__link,.immersive-main-media__headline-container--gallery.content--pillar-special-report .youtube-media-atom__bottom-bar__duration{color:#ff4e36}.content--media:not(.paid-content).content--pillar-special-report .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.content--media:not(.paid-content).content--pillar-special-report .vjs-play-progress,.content--media:not(.paid-content).content--pillar-special-report .vjs-volume-level,.content--media:not(.paid-content).content--pillar-special-report .vjs-volume-level:before,.content--media:not(.paid-content).content--pillar-special-report .youtube-media-atom__bottom-bar__duration:before,.content--media:not(.paid-content).content--pillar-special-report .youtube-media-atom__play-button:before,.immersive-main-media__headline-container.content--pillar-special-report .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container.content--pillar-special-report .vjs-play-progress,.immersive-main-media__headline-container.content--pillar-special-report .vjs-volume-level,.immersive-main-media__headline-container.content--pillar-special-report .vjs-volume-level:before,.immersive-main-media__headline-container.content--pillar-special-report .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container.content--pillar-special-report .youtube-media-atom__play-button:before,.immersive-main-media__headline-container--gallery.content--pillar-special-report .gu-media--show-controls-at-start.vjs-paused .vjs-big-play-button .vjs-control-text:before,.immersive-main-media__headline-container--gallery.content--pillar-special-report .vjs-play-progress,.immersive-main-media__headline-container--gallery.content--pillar-special-report .vjs-volume-level,.immersive-main-media__headline-container--gallery.content--pillar-special-report .vjs-volume-level:before,.immersive-main-media__headline-container--gallery.content--pillar-special-report .youtube-media-atom__bottom-bar__duration:before,.immersive-main-media__headline-container--gallery.content--pillar-special-report .youtube-media-atom__play-button:before{background:#ff4e36}.content--media:not(.paid-content).content--pillar-special-report .inline-camera,.content--media:not(.paid-content).content--pillar-special-report .inline-video-icon__svg,.content--media:not(.paid-content).content--pillar-special-report .inline-volume-high.inline-icon,.immersive-main-media__headline-container.content--pillar-special-report .inline-camera,.immersive-main-media__headline-container.content--pillar-special-report .inline-video-icon__svg,.immersive-main-media__headline-container.content--pillar-special-report .inline-volume-high.inline-icon,.immersive-main-media__headline-container--gallery.content--pillar-special-report .inline-camera,.immersive-main-media__headline-container--gallery.content--pillar-special-report .inline-video-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-special-report .inline-volume-high.inline-icon{fill:#ff4e36}.content--media:not(.paid-content).content--pillar-special-report .social-icon__svg,.immersive-main-media__headline-container.content--pillar-special-report .social-icon__svg,.immersive-main-media__headline-container--gallery.content--pillar-special-report .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content).content--pillar-special-report .content__label__link,.immersive-main-media__headline-container.content--pillar-special-report .content__label__link,.immersive-main-media__headline-container--gallery.content--pillar-special-report .content__label__link{color:#f6f6f6}.svg .content--media:not(.paid-content).content--pillar-special-report .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-special-report .vjs-paused .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-special-report .vjs-paused .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.svg .content--media:not(.paid-content).content--pillar-special-report .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container.content--pillar-special-report .vjs-playing .vjs-play-control,.svg .immersive-main-media__headline-container--gallery.content--pillar-special-report .vjs-playing .vjs-play-control{display:inline-block;background-repeat:no-repeat;background-size:contain}.content--type-analysis .content__headline{background-position:top left;background-size:0.0625rem 2.5rem;background-clip:content-box;background-origin:content-box}@media (min-width: 46.25em){.content--type-analysis .content__headline{background-size:0.0625rem 3rem}}.rich-link:not(.rich-link--paidfor),.rich-link:not(.rich-link--paidfor).rich-link--pillar-news{background-color:#f6f6f6}.rich-link:not(.rich-link--paidfor) .u-faux-block-link--hover,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .u-faux-block-link--hover{background-color:#e9e9e9}.rich-link:not(.rich-link--paidfor) a,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news a{color:inherit}.rich-link:not(.rich-link--paidfor) .inline-garnett-quote svg,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#c70000}.rich-link:not(.rich-link--paidfor) .inline-arrow-in-circle__svg,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .inline-arrow-in-circle__svg{fill:#c70000}.rich-link:not(.rich-link--paidfor) .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor) .rich-link__container::before,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__container::before{background-color:#c70000}.rich-link:not(.rich-link--paidfor) .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor) .rich-link__header,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor) .rich-link__byline,.rich-link:not(.rich-link--paidfor) .rich-link__kicker,.rich-link:not(.rich-link--paidfor) .rich-link__read-more-text,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__read-more-text{color:#c70000}.rich-link:not(.rich-link--paidfor) .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-news .rich-link__kicker{border-right:0.0625rem solid #c70000;padding-right:.375em}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion,.rich-link:not(.rich-link--paidfor).tone-comment--item{background-color:#f6f6f6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .u-faux-block-link--hover,.rich-link:not(.rich-link--paidfor).tone-comment--item .u-faux-block-link--hover{background-color:#e9e9e9}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion a,.rich-link:not(.rich-link--paidfor).tone-comment--item a{color:inherit}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .inline-garnett-quote svg,.rich-link:not(.rich-link--paidfor).tone-comment--item .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#e05e00}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .inline-arrow-in-circle__svg,.rich-link:not(.rich-link--paidfor).tone-comment--item .inline-arrow-in-circle__svg{fill:#e05e00}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__container::before,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__container::before{background-color:#e05e00}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__header,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__read-more-text,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__read-more-text{color:#e05e00}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-comment--item .rich-link__kicker{border-right:0.0625rem solid #e05e00;padding-right:.375em}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport{background-color:#f6f6f6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .u-faux-block-link--hover{background-color:#e9e9e9}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport a{color:inherit}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#0084c6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .inline-arrow-in-circle__svg{fill:#0084c6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__container::before{background-color:#0084c6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__read-more-text{color:#0084c6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-sport .rich-link__kicker{border-right:0.0625rem solid #0084c6;padding-right:.375em}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts{background-color:#f6f6f6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .u-faux-block-link--hover{background-color:#e9e9e9}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts a{color:inherit}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#a1845c}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .inline-arrow-in-circle__svg{fill:#a1845c}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__container::before{background-color:#a1845c}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__read-more-text{color:#a1845c}.rich-link:not(.rich-link--paidfor).rich-link--pillar-arts .rich-link__kicker{border-right:0.0625rem solid #a1845c;padding-right:.375em}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle{background-color:#f6f6f6}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .u-faux-block-link--hover{background-color:#e9e9e9}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle a{color:inherit}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#bb3b80}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .inline-arrow-in-circle__svg{fill:#bb3b80}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__container::before{background-color:#bb3b80}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__byline,.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__kicker,.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__read-more-text{color:#bb3b80}.rich-link:not(.rich-link--paidfor).rich-link--pillar-lifestyle .rich-link__kicker{border-right:0.0625rem solid #bb3b80;padding-right:.375em}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__image-container{display:none}.rich-link:not(.rich-link--paidfor).rich-link--pillar-opinion .rich-link__container{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:bottom;background-size:0.0625rem 0.8125rem;padding-bottom:0.8125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news{background-color:#ab0613}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .u-faux-block-link--hover{background-color:#920510}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news a{color:inherit}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .inline-arrow-in-circle__svg{fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__container::before{background-color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__read-more-text{color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-news .rich-link__kicker{border-right:0.0625rem solid #fff;padding-right:.375em}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion{background-color:#e05e00}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .u-faux-block-link--hover{background-color:#c75300}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion a{color:inherit}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .inline-arrow-in-circle__svg{fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__container::before{background-color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__read-more-text{color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-opinion .rich-link__kicker{border-right:0.0625rem solid #fff;padding-right:.375em}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport{background-color:#005689}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .u-faux-block-link--hover{background-color:#004670}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport a{color:inherit}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .inline-arrow-in-circle__svg{fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__container::before{background-color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__read-more-text{color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-sport .rich-link__kicker{border-right:0.0625rem solid #fff;padding-right:.375em}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts{background-color:#6b5840}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .u-faux-block-link--hover{background-color:#5b4b36}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts a{color:inherit}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .inline-arrow-in-circle__svg{fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__container::before{background-color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__read-more-text{color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-arts .rich-link__kicker{border-right:0.0625rem solid #fff;padding-right:.375em}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle{background-color:#7d0068}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .u-faux-block-link--hover{background-color:#640053}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle a{color:inherit}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .inline-garnett-quote svg{height:1.25rem;width:0.625rem;margin-right:0.625rem;fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .inline-arrow-in-circle__svg{fill:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__avatar__media,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__container::before{background-color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__byline{font-style:italic}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__header{padding-top:0.125rem}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__byline,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__kicker,.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__read-more-text{color:#fff}.rich-link:not(.rich-link--paidfor).tone-live--item.rich-link--pillar-lifestyle .rich-link__kicker{border-right:0.0625rem solid #fff;padding-right:.375em}.rich-link:not(.rich-link--paidfor).tone-live--item,.rich-link:not(.rich-link--paidfor).tone-live--item .rich-link__link{color:#ffffff}.rich-link:not(.rich-link--paidfor).rich-link--audio,.rich-link:not(.rich-link--paidfor).rich-link--gallery,.rich-link:not(.rich-link--paidfor).rich-link--video{background:#333}.rich-link:not(.rich-link--paidfor).rich-link--audio .u-faux-block-link--hover,.rich-link:not(.rich-link--paidfor).rich-link--gallery .u-faux-block-link--hover,.rich-link:not(.rich-link--paidfor).rich-link--video .u-faux-block-link--hover{background-color:#262626}.rich-link:not(.rich-link--paidfor).rich-link--audio,.rich-link:not(.rich-link--paidfor).rich-link--audio .rich-link__link,.rich-link:not(.rich-link--paidfor).rich-link--gallery,.rich-link:not(.rich-link--paidfor).rich-link--gallery .rich-link__link,.rich-link:not(.rich-link--paidfor).rich-link--video,.rich-link:not(.rich-link--paidfor).rich-link--video .rich-link__link{color:#ffffff}.rich-link:not(.rich-link--paidfor).rich-link--audio .rich-link__read-more-text,.rich-link:not(.rich-link--paidfor).rich-link--gallery .rich-link__read-more-text,.rich-link:not(.rich-link--paidfor).rich-link--video .rich-link__read-more-text{display:none}.immersive-main-media__headline-container .content__label__link{color:#f6f6f6}.content{padding-bottom:0;color:#121212}@media (min-width: 41.25em) and (max-width: 46.24em){.content--liveblog .content__header,.content--liveblog .content__headline,.content--liveblog .content__meta-container,.content--liveblog .content__standfirst,.content--media .content__header,.content--media .content__headline,.content--media .content__meta-container,.content--media .content__standfirst,.content--type-analysis .content__header,.content--type-analysis .content__headline,.content--type-analysis .content__meta-container,.content--type-analysis .content__standfirst,.content--type-article .content__header,.content--type-article .content__headline,.content--type-article .content__meta-container,.content--type-article .content__standfirst,.content--type-comment .content__header,.content--type-comment .content__headline,.content--type-comment .content__meta-container,.content--type-comment .content__standfirst,.content--type-feature .content__header,.content--type-feature .content__headline,.content--type-feature .content__meta-container,.content--type-feature .content__standfirst,.content--type-recipe .content__header,.content--type-recipe .content__headline,.content--type-recipe .content__meta-container,.content--type-recipe .content__standfirst,.content--type-guardianview .content__header,.content--type-guardianview .content__headline,.content--type-guardianview .content__meta-container,.content--type-guardianview .content__standfirst,.content--type-immersive:not(.content--minute-article) .content__header,.content--type-immersive:not(.content--minute-article) .content__headline,.content--type-immersive:not(.content--minute-article) .content__meta-container,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-interview .content__header,.content--type-interview .content__headline,.content--type-interview .content__meta-container,.content--type-interview .content__standfirst,.content--type-live .content__header,.content--type-live .content__headline,.content--type-live .content__meta-container,.content--type-live .content__standfirst,.content--type-matchreport .content__header,.content--type-matchreport .content__headline,.content--type-matchreport .content__meta-container,.content--type-matchreport .content__standfirst,.content--type-media .content__header,.content--type-media .content__headline,.content--type-media .content__meta-container,.content--type-media .content__standfirst,.content--type-review .content__header,.content--type-review .content__headline,.content--type-review .content__meta-container,.content--type-review .content__standfirst,.content--type-quiz .content__header,.content--type-quiz .content__headline,.content--type-quiz .content__meta-container,.content--type-quiz .content__standfirst{width:100%;max-width:38.75rem;margin:auto}}.content--liveblog .badge,.content--liveblog .badge--alt,.content--liveblog .content__headline,.content--liveblog .content__labels,.content--liveblog .content__standfirst,.content--liveblog .meta__extras,.content--liveblog .meta__contact-wrap,.content--media .badge,.content--media .badge--alt,.content--media .content__headline,.content--media .content__labels,.content--media .content__standfirst,.content--media .meta__extras,.content--media .meta__contact-wrap,.content--type-analysis .badge,.content--type-analysis .badge--alt,.content--type-analysis .content__headline,.content--type-analysis .content__labels,.content--type-analysis .content__standfirst,.content--type-analysis .meta__extras,.content--type-analysis .meta__contact-wrap,.content--type-article .badge,.content--type-article .badge--alt,.content--type-article .content__headline,.content--type-article .content__labels,.content--type-article .content__standfirst,.content--type-article .meta__extras,.content--type-article .meta__contact-wrap,.content--type-comment .badge,.content--type-comment .badge--alt,.content--type-comment .content__headline,.content--type-comment .content__labels,.content--type-comment .content__standfirst,.content--type-comment .meta__extras,.content--type-comment .meta__contact-wrap,.content--type-feature .badge,.content--type-feature .badge--alt,.content--type-feature .content__headline,.content--type-feature .content__labels,.content--type-feature .content__standfirst,.content--type-feature .meta__extras,.content--type-feature .meta__contact-wrap,.content--type-recipe .badge,.content--type-recipe .badge--alt,.content--type-recipe .content__headline,.content--type-recipe .content__labels,.content--type-recipe .content__standfirst,.content--type-recipe .meta__extras,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .badge,.content--type-guardianview .badge--alt,.content--type-guardianview .content__headline,.content--type-guardianview .content__labels,.content--type-guardianview .content__standfirst,.content--type-guardianview .meta__extras,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .badge,.content--type-immersive:not(.content--minute-article) .badge--alt,.content--type-immersive:not(.content--minute-article) .content__headline,.content--type-immersive:not(.content--minute-article) .content__labels,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-immersive:not(.content--minute-article) .meta__extras,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .badge,.content--type-interview .badge--alt,.content--type-interview .content__headline,.content--type-interview .content__labels,.content--type-interview .content__standfirst,.content--type-interview .meta__extras,.content--type-interview .meta__contact-wrap,.content--type-live .badge,.content--type-live .badge--alt,.content--type-live .content__headline,.content--type-live .content__labels,.content--type-live .content__standfirst,.content--type-live .meta__extras,.content--type-live .meta__contact-wrap,.content--type-matchreport .badge,.content--type-matchreport .badge--alt,.content--type-matchreport .content__headline,.content--type-matchreport .content__labels,.content--type-matchreport .content__standfirst,.content--type-matchreport .meta__extras,.content--type-matchreport .meta__contact-wrap,.content--type-media .badge,.content--type-media .badge--alt,.content--type-media .content__headline,.content--type-media .content__labels,.content--type-media .content__standfirst,.content--type-media .meta__extras,.content--type-media .meta__contact-wrap,.content--type-review .badge,.content--type-review .badge--alt,.content--type-review .content__headline,.content--type-review .content__labels,.content--type-review .content__standfirst,.content--type-review .meta__extras,.content--type-review .meta__contact-wrap,.content--type-quiz .badge,.content--type-quiz .badge--alt,.content--type-quiz .content__headline,.content--type-quiz .content__labels,.content--type-quiz .content__standfirst,.content--type-quiz .meta__extras,.content--type-quiz .meta__contact-wrap{padding-left:0.625rem;padding-right:0.625rem}@media (min-width: 30em){.content--liveblog .badge,.content--liveblog .badge--alt,.content--liveblog .content__headline,.content--liveblog .content__labels,.content--liveblog .content__standfirst,.content--liveblog .meta__extras,.content--liveblog .meta__contact-wrap,.content--media .badge,.content--media .badge--alt,.content--media .content__headline,.content--media .content__labels,.content--media .content__standfirst,.content--media .meta__extras,.content--media .meta__contact-wrap,.content--type-analysis .badge,.content--type-analysis .badge--alt,.content--type-analysis .content__headline,.content--type-analysis .content__labels,.content--type-analysis .content__standfirst,.content--type-analysis .meta__extras,.content--type-analysis .meta__contact-wrap,.content--type-article .badge,.content--type-article .badge--alt,.content--type-article .content__headline,.content--type-article .content__labels,.content--type-article .content__standfirst,.content--type-article .meta__extras,.content--type-article .meta__contact-wrap,.content--type-comment .badge,.content--type-comment .badge--alt,.content--type-comment .content__headline,.content--type-comment .content__labels,.content--type-comment .content__standfirst,.content--type-comment .meta__extras,.content--type-comment .meta__contact-wrap,.content--type-feature .badge,.content--type-feature .badge--alt,.content--type-feature .content__headline,.content--type-feature .content__labels,.content--type-feature .content__standfirst,.content--type-feature .meta__extras,.content--type-feature .meta__contact-wrap,.content--type-recipe .badge,.content--type-recipe .badge--alt,.content--type-recipe .content__headline,.content--type-recipe .content__labels,.content--type-recipe .content__standfirst,.content--type-recipe .meta__extras,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .badge,.content--type-guardianview .badge--alt,.content--type-guardianview .content__headline,.content--type-guardianview .content__labels,.content--type-guardianview .content__standfirst,.content--type-guardianview .meta__extras,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .badge,.content--type-immersive:not(.content--minute-article) .badge--alt,.content--type-immersive:not(.content--minute-article) .content__headline,.content--type-immersive:not(.content--minute-article) .content__labels,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-immersive:not(.content--minute-article) .meta__extras,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .badge,.content--type-interview .badge--alt,.content--type-interview .content__headline,.content--type-interview .content__labels,.content--type-interview .content__standfirst,.content--type-interview .meta__extras,.content--type-interview .meta__contact-wrap,.content--type-live .badge,.content--type-live .badge--alt,.content--type-live .content__headline,.content--type-live .content__labels,.content--type-live .content__standfirst,.content--type-live .meta__extras,.content--type-live .meta__contact-wrap,.content--type-matchreport .badge,.content--type-matchreport .badge--alt,.content--type-matchreport .content__headline,.content--type-matchreport .content__labels,.content--type-matchreport .content__standfirst,.content--type-matchreport .meta__extras,.content--type-matchreport .meta__contact-wrap,.content--type-media .badge,.content--type-media .badge--alt,.content--type-media .content__headline,.content--type-media .content__labels,.content--type-media .content__standfirst,.content--type-media .meta__extras,.content--type-media .meta__contact-wrap,.content--type-review .badge,.content--type-review .badge--alt,.content--type-review .content__headline,.content--type-review .content__labels,.content--type-review .content__standfirst,.content--type-review .meta__extras,.content--type-review .meta__contact-wrap,.content--type-quiz .badge,.content--type-quiz .badge--alt,.content--type-quiz .content__headline,.content--type-quiz .content__labels,.content--type-quiz .content__standfirst,.content--type-quiz .meta__extras,.content--type-quiz .meta__contact-wrap{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 41.25em){.content--liveblog .badge,.content--liveblog .badge--alt,.content--liveblog .content__headline,.content--liveblog .content__labels,.content--liveblog .content__standfirst,.content--liveblog .meta__extras,.content--liveblog .meta__contact-wrap,.content--media .badge,.content--media .badge--alt,.content--media .content__headline,.content--media .content__labels,.content--media .content__standfirst,.content--media .meta__extras,.content--media .meta__contact-wrap,.content--type-analysis .badge,.content--type-analysis .badge--alt,.content--type-analysis .content__headline,.content--type-analysis .content__labels,.content--type-analysis .content__standfirst,.content--type-analysis .meta__extras,.content--type-analysis .meta__contact-wrap,.content--type-article .badge,.content--type-article .badge--alt,.content--type-article .content__headline,.content--type-article .content__labels,.content--type-article .content__standfirst,.content--type-article .meta__extras,.content--type-article .meta__contact-wrap,.content--type-comment .badge,.content--type-comment .badge--alt,.content--type-comment .content__headline,.content--type-comment .content__labels,.content--type-comment .content__standfirst,.content--type-comment .meta__extras,.content--type-comment .meta__contact-wrap,.content--type-feature .badge,.content--type-feature .badge--alt,.content--type-feature .content__headline,.content--type-feature .content__labels,.content--type-feature .content__standfirst,.content--type-feature .meta__extras,.content--type-feature .meta__contact-wrap,.content--type-recipe .badge,.content--type-recipe .badge--alt,.content--type-recipe .content__headline,.content--type-recipe .content__labels,.content--type-recipe .content__standfirst,.content--type-recipe .meta__extras,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .badge,.content--type-guardianview .badge--alt,.content--type-guardianview .content__headline,.content--type-guardianview .content__labels,.content--type-guardianview .content__standfirst,.content--type-guardianview .meta__extras,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .badge,.content--type-immersive:not(.content--minute-article) .badge--alt,.content--type-immersive:not(.content--minute-article) .content__headline,.content--type-immersive:not(.content--minute-article) .content__labels,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-immersive:not(.content--minute-article) .meta__extras,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .badge,.content--type-interview .badge--alt,.content--type-interview .content__headline,.content--type-interview .content__labels,.content--type-interview .content__standfirst,.content--type-interview .meta__extras,.content--type-interview .meta__contact-wrap,.content--type-live .badge,.content--type-live .badge--alt,.content--type-live .content__headline,.content--type-live .content__labels,.content--type-live .content__standfirst,.content--type-live .meta__extras,.content--type-live .meta__contact-wrap,.content--type-matchreport .badge,.content--type-matchreport .badge--alt,.content--type-matchreport .content__headline,.content--type-matchreport .content__labels,.content--type-matchreport .content__standfirst,.content--type-matchreport .meta__extras,.content--type-matchreport .meta__contact-wrap,.content--type-media .badge,.content--type-media .badge--alt,.content--type-media .content__headline,.content--type-media .content__labels,.content--type-media .content__standfirst,.content--type-media .meta__extras,.content--type-media .meta__contact-wrap,.content--type-review .badge,.content--type-review .badge--alt,.content--type-review .content__headline,.content--type-review .content__labels,.content--type-review .content__standfirst,.content--type-review .meta__extras,.content--type-review .meta__contact-wrap,.content--type-quiz .badge,.content--type-quiz .badge--alt,.content--type-quiz .content__headline,.content--type-quiz .content__labels,.content--type-quiz .content__standfirst,.content--type-quiz .meta__extras,.content--type-quiz .meta__contact-wrap{padding-left:0;padding-right:0}}.content--liveblog .content__meta-container,.content--media .content__meta-container,.content--type-analysis .content__meta-container,.content--type-article .content__meta-container,.content--type-comment .content__meta-container,.content--type-feature .content__meta-container,.content--type-recipe .content__meta-container,.content--type-guardianview .content__meta-container,.content--type-immersive:not(.content--minute-article) .content__meta-container,.content--type-interview .content__meta-container,.content--type-live .content__meta-container,.content--type-matchreport .content__meta-container,.content--type-media .content__meta-container,.content--type-review .content__meta-container,.content--type-quiz .content__meta-container{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:top;background-size:0.0625rem 0.8125rem;padding-top:0.9375rem;margin-bottom:0.375rem}@media (min-width: 71.25em){.content--liveblog .content__meta-container,.content--media .content__meta-container,.content--type-analysis .content__meta-container,.content--type-article .content__meta-container,.content--type-comment .content__meta-container,.content--type-feature .content__meta-container,.content--type-recipe .content__meta-container,.content--type-guardianview .content__meta-container,.content--type-immersive:not(.content--minute-article) .content__meta-container,.content--type-interview .content__meta-container,.content--type-live .content__meta-container,.content--type-matchreport .content__meta-container,.content--type-media .content__meta-container,.content--type-review .content__meta-container,.content--type-quiz .content__meta-container{position:absolute}}@media (min-width: 71.25em){.content--liveblog .badge,.content--liveblog .content__meta-container,.content--media .badge,.content--media .content__meta-container,.content--type-analysis .badge,.content--type-analysis .content__meta-container,.content--type-article .badge,.content--type-article .content__meta-container,.content--type-comment .badge,.content--type-comment .content__meta-container,.content--type-feature .badge,.content--type-feature .content__meta-container,.content--type-recipe .badge,.content--type-recipe .content__meta-container,.content--type-guardianview .badge,.content--type-guardianview .content__meta-container,.content--type-immersive:not(.content--minute-article) .badge,.content--type-immersive:not(.content--minute-article) .content__meta-container,.content--type-interview .badge,.content--type-interview .content__meta-container,.content--type-live .badge,.content--type-live .content__meta-container,.content--type-matchreport .badge,.content--type-matchreport .content__meta-container,.content--type-media .badge,.content--type-media .content__meta-container,.content--type-review .badge,.content--type-review .content__meta-container,.content--type-quiz .badge,.content--type-quiz .content__meta-container{width:8.75rem}}@media (min-width: 81.25em){.content--liveblog .badge,.content--liveblog .content__meta-container,.content--media .badge,.content--media .content__meta-container,.content--type-analysis .badge,.content--type-analysis .content__meta-container,.content--type-article .badge,.content--type-article .content__meta-container,.content--type-comment .badge,.content--type-comment .content__meta-container,.content--type-feature .badge,.content--type-feature .content__meta-container,.content--type-recipe .badge,.content--type-recipe .content__meta-container,.content--type-guardianview .badge,.content--type-guardianview .content__meta-container,.content--type-immersive:not(.content--minute-article) .badge,.content--type-immersive:not(.content--minute-article) .content__meta-container,.content--type-interview .badge,.content--type-interview .content__meta-container,.content--type-live .badge,.content--type-live .content__meta-container,.content--type-matchreport .badge,.content--type-matchreport .content__meta-container,.content--type-media .badge,.content--type-media .content__meta-container,.content--type-review .badge,.content--type-review .content__meta-container,.content--type-quiz .badge,.content--type-quiz .content__meta-container{width:13.75rem}}.content--liveblog .meta__contact-wrap,.content--media .meta__contact-wrap,.content--type-analysis .meta__contact-wrap,.content--type-article .meta__contact-wrap,.content--type-comment .meta__contact-wrap,.content--type-feature .meta__contact-wrap,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .meta__contact-wrap,.content--type-live .meta__contact-wrap,.content--type-matchreport .meta__contact-wrap,.content--type-media .meta__contact-wrap,.content--type-review .meta__contact-wrap,.content--type-quiz .meta__contact-wrap{float:left;max-width:calc(100% - 5.625rem)}@media (min-width: 30em){.content--liveblog .meta__contact-wrap,.content--media .meta__contact-wrap,.content--type-analysis .meta__contact-wrap,.content--type-article .meta__contact-wrap,.content--type-comment .meta__contact-wrap,.content--type-feature .meta__contact-wrap,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .meta__contact-wrap,.content--type-live .meta__contact-wrap,.content--type-matchreport .meta__contact-wrap,.content--type-media .meta__contact-wrap,.content--type-review .meta__contact-wrap,.content--type-quiz .meta__contact-wrap{max-width:calc(100% - 6.875rem)}}@media (min-width: 71.25em){.content--liveblog .meta__contact-wrap,.content--media .meta__contact-wrap,.content--type-analysis .meta__contact-wrap,.content--type-article .meta__contact-wrap,.content--type-comment .meta__contact-wrap,.content--type-feature .meta__contact-wrap,.content--type-recipe .meta__contact-wrap,.content--type-guardianview .meta__contact-wrap,.content--type-immersive:not(.content--minute-article) .meta__contact-wrap,.content--type-interview .meta__contact-wrap,.content--type-live .meta__contact-wrap,.content--type-matchreport .meta__contact-wrap,.content--type-media .meta__contact-wrap,.content--type-review .meta__contact-wrap,.content--type-quiz .meta__contact-wrap{max-width:100%}}.content--liveblog .content__main-column--article .badge--alt,.content--media .content__main-column--article .badge--alt,.content--type-analysis .content__main-column--article .badge--alt,.content--type-article .content__main-column--article .badge--alt,.content--type-comment .content__main-column--article .badge--alt,.content--type-feature .content__main-column--article .badge--alt,.content--type-recipe .content__main-column--article .badge--alt,.content--type-guardianview .content__main-column--article .badge--alt,.content--type-immersive:not(.content--minute-article) .content__main-column--article .badge--alt,.content--type-interview .content__main-column--article .badge--alt,.content--type-live .content__main-column--article .badge--alt,.content--type-matchreport .content__main-column--article .badge--alt,.content--type-media .content__main-column--article .badge--alt,.content--type-review .content__main-column--article .badge--alt,.content--type-quiz .content__main-column--article .badge--alt{padding-bottom:0.75rem}.content--liveblog .badge--alt,.content--media .badge--alt,.content--type-analysis .badge--alt,.content--type-article .badge--alt,.content--type-comment .badge--alt,.content--type-feature .badge--alt,.content--type-recipe .badge--alt,.content--type-guardianview .badge--alt,.content--type-immersive:not(.content--minute-article) .badge--alt,.content--type-interview .badge--alt,.content--type-live .badge--alt,.content--type-matchreport .badge--alt,.content--type-media .badge--alt,.content--type-review .badge--alt,.content--type-quiz .badge--alt{padding-top:0;border-top:0;margin-top:0.125rem;margin-bottom:-0.25rem}.content--liveblog .badge--alt a,.content--media .badge--alt a,.content--type-analysis .badge--alt a,.content--type-article .badge--alt a,.content--type-comment .badge--alt a,.content--type-feature .badge--alt a,.content--type-recipe .badge--alt a,.content--type-guardianview .badge--alt a,.content--type-immersive:not(.content--minute-article) .badge--alt a,.content--type-interview .badge--alt a,.content--type-live .badge--alt a,.content--type-matchreport .badge--alt a,.content--type-media .badge--alt a,.content--type-review .badge--alt a,.content--type-quiz .badge--alt a{padding-bottom:0;margin-bottom:0}.content--liveblog .content__meta-container .byline-img,.content--media .content__meta-container .byline-img,.content--type-analysis .content__meta-container .byline-img,.content--type-article .content__meta-container .byline-img,.content--type-comment .content__meta-container .byline-img,.content--type-feature .content__meta-container .byline-img,.content--type-recipe .content__meta-container .byline-img,.content--type-guardianview .content__meta-container .byline-img,.content--type-immersive:not(.content--minute-article) .content__meta-container .byline-img,.content--type-interview .content__meta-container .byline-img,.content--type-live .content__meta-container .byline-img,.content--type-matchreport .content__meta-container .byline-img,.content--type-media .content__meta-container .byline-img,.content--type-review .content__meta-container .byline-img,.content--type-quiz .content__meta-container .byline-img{max-width:3.75rem;float:left;border-top:0;margin:0.1875rem 0 0.75rem 0.625rem}@media (min-width: 30em){.content--liveblog .content__meta-container .byline-img,.content--media .content__meta-container .byline-img,.content--type-analysis .content__meta-container .byline-img,.content--type-article .content__meta-container .byline-img,.content--type-comment .content__meta-container .byline-img,.content--type-feature .content__meta-container .byline-img,.content--type-recipe .content__meta-container .byline-img,.content--type-guardianview .content__meta-container .byline-img,.content--type-immersive:not(.content--minute-article) .content__meta-container .byline-img,.content--type-interview .content__meta-container .byline-img,.content--type-live .content__meta-container .byline-img,.content--type-matchreport .content__meta-container .byline-img,.content--type-media .content__meta-container .byline-img,.content--type-review .content__meta-container .byline-img,.content--type-quiz .content__meta-container .byline-img{max-width:4rem;margin-left:1.25rem}}@media (min-width: 41.25em){.content--liveblog .content__meta-container .byline-img,.content--media .content__meta-container .byline-img,.content--type-analysis .content__meta-container .byline-img,.content--type-article .content__meta-container .byline-img,.content--type-comment .content__meta-container .byline-img,.content--type-feature .content__meta-container .byline-img,.content--type-recipe .content__meta-container .byline-img,.content--type-guardianview .content__meta-container .byline-img,.content--type-immersive:not(.content--minute-article) .content__meta-container .byline-img,.content--type-interview .content__meta-container .byline-img,.content--type-live .content__meta-container .byline-img,.content--type-matchreport .content__meta-container .byline-img,.content--type-media .content__meta-container .byline-img,.content--type-review .content__meta-container .byline-img,.content--type-quiz .content__meta-container .byline-img{margin-left:0;margin-right:0.625rem}}@media (min-width: 71.25em){.content--liveblog .content__meta-container .byline-img,.content--media .content__meta-container .byline-img,.content--type-analysis .content__meta-container .byline-img,.content--type-article .content__meta-container .byline-img,.content--type-comment .content__meta-container .byline-img,.content--type-feature .content__meta-container .byline-img,.content--type-recipe .content__meta-container .byline-img,.content--type-guardianview .content__meta-container .byline-img,.content--type-immersive:not(.content--minute-article) .content__meta-container .byline-img,.content--type-interview .content__meta-container .byline-img,.content--type-live .content__meta-container .byline-img,.content--type-matchreport .content__meta-container .byline-img,.content--type-media .content__meta-container .byline-img,.content--type-review .content__meta-container .byline-img,.content--type-quiz .content__meta-container .byline-img{margin-top:0.375rem;max-width:none}}.content--liveblog .meta__bio,.content--media .meta__bio,.content--type-analysis .meta__bio,.content--type-article .meta__bio,.content--type-comment .meta__bio,.content--type-feature .meta__bio,.content--type-recipe .meta__bio,.content--type-guardianview .meta__bio,.content--type-immersive:not(.content--minute-article) .meta__bio,.content--type-interview .meta__bio,.content--type-live .meta__bio,.content--type-matchreport .meta__bio,.content--type-media .meta__bio,.content--type-review .meta__bio,.content--type-quiz .meta__bio{border-top:0;padding-top:0;padding-bottom:0.75rem}.content--liveblog .meta__contact-header,.content--media .meta__contact-header,.content--type-analysis .meta__contact-header,.content--type-article .meta__contact-header,.content--type-comment .meta__contact-header,.content--type-feature .meta__contact-header,.content--type-recipe .meta__contact-header,.content--type-guardianview .meta__contact-header,.content--type-immersive:not(.content--minute-article) .meta__contact-header,.content--type-interview .meta__contact-header,.content--type-live .meta__contact-header,.content--type-matchreport .meta__contact-header,.content--type-media .meta__contact-header,.content--type-review .meta__contact-header,.content--type-quiz .meta__contact-header{display:none}.content--liveblog .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--media .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-analysis .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-article .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-comment .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-feature .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-recipe .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-guardianview .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-immersive:not(.content--minute-article) .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-interview .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-live .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-matchreport .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-media .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-review .content__meta-container--email.content__meta-container--twitter .meta__twitter,.content--type-quiz .content__meta-container--email.content__meta-container--twitter .meta__twitter{margin-top:0;margin-bottom:0}.content--liveblog .content__meta-container--email.content__meta-container--twitter .meta__email,.content--media .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-analysis .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-article .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-comment .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-feature .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-recipe .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-guardianview .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-immersive:not(.content--minute-article) .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-interview .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-live .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-matchreport .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-media .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-review .content__meta-container--email.content__meta-container--twitter .meta__email,.content--type-quiz .content__meta-container--email.content__meta-container--twitter .meta__email{margin-top:0;margin-bottom:0}.content--liveblog .meta__email,.content--liveblog .meta__twitter,.content--media .meta__email,.content--media .meta__twitter,.content--type-analysis .meta__email,.content--type-analysis .meta__twitter,.content--type-article .meta__email,.content--type-article .meta__twitter,.content--type-comment .meta__email,.content--type-comment .meta__twitter,.content--type-feature .meta__email,.content--type-feature .meta__twitter,.content--type-recipe .meta__email,.content--type-recipe .meta__twitter,.content--type-guardianview .meta__email,.content--type-guardianview .meta__twitter,.content--type-immersive:not(.content--minute-article) .meta__email,.content--type-immersive:not(.content--minute-article) .meta__twitter,.content--type-interview .meta__email,.content--type-interview .meta__twitter,.content--type-live .meta__email,.content--type-live .meta__twitter,.content--type-matchreport .meta__email,.content--type-matchreport .meta__twitter,.content--type-media .meta__email,.content--type-media .meta__twitter,.content--type-review .meta__email,.content--type-review .meta__twitter,.content--type-quiz .meta__email,.content--type-quiz .meta__twitter{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;margin:0;margin-top:0;margin-right:0;margin-bottom:-0.125rem;display:inline-block;font-weight:bold;text-decoration:none;padding-right:0.625rem}.content--liveblog .meta__email svg,.content--liveblog .meta__twitter svg,.content--media .meta__email svg,.content--media .meta__twitter svg,.content--type-analysis .meta__email svg,.content--type-analysis .meta__twitter svg,.content--type-article .meta__email svg,.content--type-article .meta__twitter svg,.content--type-comment .meta__email svg,.content--type-comment .meta__twitter svg,.content--type-feature .meta__email svg,.content--type-feature .meta__twitter svg,.content--type-recipe .meta__email svg,.content--type-recipe .meta__twitter svg,.content--type-guardianview .meta__email svg,.content--type-guardianview .meta__twitter svg,.content--type-immersive:not(.content--minute-article) .meta__email svg,.content--type-immersive:not(.content--minute-article) .meta__twitter svg,.content--type-interview .meta__email svg,.content--type-interview .meta__twitter svg,.content--type-live .meta__email svg,.content--type-live .meta__twitter svg,.content--type-matchreport .meta__email svg,.content--type-matchreport .meta__twitter svg,.content--type-media .meta__email svg,.content--type-media .meta__twitter svg,.content--type-review .meta__email svg,.content--type-review .meta__twitter svg,.content--type-quiz .meta__email svg,.content--type-quiz .meta__twitter svg{height:0.625rem;max-width:0.75rem;margin-right:0}.content--liveblog .meta__email a,.content--liveblog .meta__twitter a,.content--media .meta__email a,.content--media .meta__twitter a,.content--type-analysis .meta__email a,.content--type-analysis .meta__twitter a,.content--type-article .meta__email a,.content--type-article .meta__twitter a,.content--type-comment .meta__email a,.content--type-comment .meta__twitter a,.content--type-feature .meta__email a,.content--type-feature .meta__twitter a,.content--type-recipe .meta__email a,.content--type-recipe .meta__twitter a,.content--type-guardianview .meta__email a,.content--type-guardianview .meta__twitter a,.content--type-immersive:not(.content--minute-article) .meta__email a,.content--type-immersive:not(.content--minute-article) .meta__twitter a,.content--type-interview .meta__email a,.content--type-interview .meta__twitter a,.content--type-live .meta__email a,.content--type-live .meta__twitter a,.content--type-matchreport .meta__email a,.content--type-matchreport .meta__twitter a,.content--type-media .meta__email a,.content--type-media .meta__twitter a,.content--type-review .meta__email a,.content--type-review .meta__twitter a,.content--type-quiz .meta__email a,.content--type-quiz .meta__twitter a{color:#767676}.content--liveblog .meta__email a .inline-icon,.content--liveblog .meta__twitter a .inline-icon,.content--media .meta__email a .inline-icon,.content--media .meta__twitter a .inline-icon,.content--type-analysis .meta__email a .inline-icon,.content--type-analysis .meta__twitter a .inline-icon,.content--type-article .meta__email a .inline-icon,.content--type-article .meta__twitter a .inline-icon,.content--type-comment .meta__email a .inline-icon,.content--type-comment .meta__twitter a .inline-icon,.content--type-feature .meta__email a .inline-icon,.content--type-feature .meta__twitter a .inline-icon,.content--type-recipe .meta__email a .inline-icon,.content--type-recipe .meta__twitter a .inline-icon,.content--type-guardianview .meta__email a .inline-icon,.content--type-guardianview .meta__twitter a .inline-icon,.content--type-immersive:not(.content--minute-article) .meta__email a .inline-icon,.content--type-immersive:not(.content--minute-article) .meta__twitter a .inline-icon,.content--type-interview .meta__email a .inline-icon,.content--type-interview .meta__twitter a .inline-icon,.content--type-live .meta__email a .inline-icon,.content--type-live .meta__twitter a .inline-icon,.content--type-matchreport .meta__email a .inline-icon,.content--type-matchreport .meta__twitter a .inline-icon,.content--type-media .meta__email a .inline-icon,.content--type-media .meta__twitter a .inline-icon,.content--type-review .meta__email a .inline-icon,.content--type-review .meta__twitter a .inline-icon,.content--type-quiz .meta__email a .inline-icon,.content--type-quiz .meta__twitter a .inline-icon{fill:#767676}.content--liveblog .meta__email a:focus,.content--liveblog .meta__email a:hover,.content--liveblog .meta__twitter a:focus,.content--liveblog .meta__twitter a:hover,.content--media .meta__email a:focus,.content--media .meta__email a:hover,.content--media .meta__twitter a:focus,.content--media .meta__twitter a:hover,.content--type-analysis .meta__email a:focus,.content--type-analysis .meta__email a:hover,.content--type-analysis .meta__twitter a:focus,.content--type-analysis .meta__twitter a:hover,.content--type-article .meta__email a:focus,.content--type-article .meta__email a:hover,.content--type-article .meta__twitter a:focus,.content--type-article .meta__twitter a:hover,.content--type-comment .meta__email a:focus,.content--type-comment .meta__email a:hover,.content--type-comment .meta__twitter a:focus,.content--type-comment .meta__twitter a:hover,.content--type-feature .meta__email a:focus,.content--type-feature .meta__email a:hover,.content--type-feature .meta__twitter a:focus,.content--type-feature .meta__twitter a:hover,.content--type-recipe .meta__email a:focus,.content--type-recipe .meta__email a:hover,.content--type-recipe .meta__twitter a:focus,.content--type-recipe .meta__twitter a:hover,.content--type-guardianview .meta__email a:focus,.content--type-guardianview .meta__email a:hover,.content--type-guardianview .meta__twitter a:focus,.content--type-guardianview .meta__twitter a:hover,.content--type-immersive:not(.content--minute-article) .meta__email a:focus,.content--type-immersive:not(.content--minute-article) .meta__email a:hover,.content--type-immersive:not(.content--minute-article) .meta__twitter a:focus,.content--type-immersive:not(.content--minute-article) .meta__twitter a:hover,.content--type-interview .meta__email a:focus,.content--type-interview .meta__email a:hover,.content--type-interview .meta__twitter a:focus,.content--type-interview .meta__twitter a:hover,.content--type-live .meta__email a:focus,.content--type-live .meta__email a:hover,.content--type-live .meta__twitter a:focus,.content--type-live .meta__twitter a:hover,.content--type-matchreport .meta__email a:focus,.content--type-matchreport .meta__email a:hover,.content--type-matchreport .meta__twitter a:focus,.content--type-matchreport .meta__twitter a:hover,.content--type-media .meta__email a:focus,.content--type-media .meta__email a:hover,.content--type-media .meta__twitter a:focus,.content--type-media .meta__twitter a:hover,.content--type-review .meta__email a:focus,.content--type-review .meta__email a:hover,.content--type-review .meta__twitter a:focus,.content--type-review .meta__twitter a:hover,.content--type-quiz .meta__email a:focus,.content--type-quiz .meta__email a:hover,.content--type-quiz .meta__twitter a:focus,.content--type-quiz .meta__twitter a:hover{text-decoration:none}.content--liveblog .meta__email a:focus .contact,.content--liveblog .meta__email a:hover .contact,.content--liveblog .meta__twitter a:focus .contact,.content--liveblog .meta__twitter a:hover .contact,.content--media .meta__email a:focus .contact,.content--media .meta__email a:hover .contact,.content--media .meta__twitter a:focus .contact,.content--media .meta__twitter a:hover .contact,.content--type-analysis .meta__email a:focus .contact,.content--type-analysis .meta__email a:hover .contact,.content--type-analysis .meta__twitter a:focus .contact,.content--type-analysis .meta__twitter a:hover .contact,.content--type-article .meta__email a:focus .contact,.content--type-article .meta__email a:hover .contact,.content--type-article .meta__twitter a:focus .contact,.content--type-article .meta__twitter a:hover .contact,.content--type-comment .meta__email a:focus .contact,.content--type-comment .meta__email a:hover .contact,.content--type-comment .meta__twitter a:focus .contact,.content--type-comment .meta__twitter a:hover .contact,.content--type-feature .meta__email a:focus .contact,.content--type-feature .meta__email a:hover .contact,.content--type-feature .meta__twitter a:focus .contact,.content--type-feature .meta__twitter a:hover .contact,.content--type-recipe .meta__email a:focus .contact,.content--type-recipe .meta__email a:hover .contact,.content--type-recipe .meta__twitter a:focus .contact,.content--type-recipe .meta__twitter a:hover .contact,.content--type-guardianview .meta__email a:focus .contact,.content--type-guardianview .meta__email a:hover .contact,.content--type-guardianview .meta__twitter a:focus .contact,.content--type-guardianview .meta__twitter a:hover .contact,.content--type-immersive:not(.content--minute-article) .meta__email a:focus .contact,.content--type-immersive:not(.content--minute-article) .meta__email a:hover .contact,.content--type-immersive:not(.content--minute-article) .meta__twitter a:focus .contact,.content--type-immersive:not(.content--minute-article) .meta__twitter a:hover .contact,.content--type-interview .meta__email a:focus .contact,.content--type-interview .meta__email a:hover .contact,.content--type-interview .meta__twitter a:focus .contact,.content--type-interview .meta__twitter a:hover .contact,.content--type-live .meta__email a:focus .contact,.content--type-live .meta__email a:hover .contact,.content--type-live .meta__twitter a:focus .contact,.content--type-live .meta__twitter a:hover .contact,.content--type-matchreport .meta__email a:focus .contact,.content--type-matchreport .meta__email a:hover .contact,.content--type-matchreport .meta__twitter a:focus .contact,.content--type-matchreport .meta__twitter a:hover .contact,.content--type-media .meta__email a:focus .contact,.content--type-media .meta__email a:hover .contact,.content--type-media .meta__twitter a:focus .contact,.content--type-media .meta__twitter a:hover .contact,.content--type-review .meta__email a:focus .contact,.content--type-review .meta__email a:hover .contact,.content--type-review .meta__twitter a:focus .contact,.content--type-review .meta__twitter a:hover .contact,.content--type-quiz .meta__email a:focus .contact,.content--type-quiz .meta__email a:hover .contact,.content--type-quiz .meta__twitter a:focus .contact,.content--type-quiz .meta__twitter a:hover .contact{text-decoration:underline}.content--liveblog .meta__email .contact,.content--liveblog .meta__twitter .contact,.content--media .meta__email .contact,.content--media .meta__twitter .contact,.content--type-analysis .meta__email .contact,.content--type-analysis .meta__twitter .contact,.content--type-article .meta__email .contact,.content--type-article .meta__twitter .contact,.content--type-comment .meta__email .contact,.content--type-comment .meta__twitter .contact,.content--type-feature .meta__email .contact,.content--type-feature .meta__twitter .contact,.content--type-recipe .meta__email .contact,.content--type-recipe .meta__twitter .contact,.content--type-guardianview .meta__email .contact,.content--type-guardianview .meta__twitter .contact,.content--type-immersive:not(.content--minute-article) .meta__email .contact,.content--type-immersive:not(.content--minute-article) .meta__twitter .contact,.content--type-interview .meta__email .contact,.content--type-interview .meta__twitter .contact,.content--type-live .meta__email .contact,.content--type-live .meta__twitter .contact,.content--type-matchreport .meta__email .contact,.content--type-matchreport .meta__twitter .contact,.content--type-media .meta__email .contact,.content--type-media .meta__twitter .contact,.content--type-review .meta__email .contact,.content--type-review .meta__twitter .contact,.content--type-quiz .meta__email .contact,.content--type-quiz .meta__twitter .contact{color:#767676;display:inline-block !important}.content--liveblog .meta__extras,.content--media .meta__extras,.content--type-analysis .meta__extras,.content--type-article .meta__extras,.content--type-comment .meta__extras,.content--type-feature .meta__extras,.content--type-recipe .meta__extras,.content--type-guardianview .meta__extras,.content--type-immersive:not(.content--minute-article) .meta__extras,.content--type-interview .meta__extras,.content--type-live .meta__extras,.content--type-matchreport .meta__extras,.content--type-media .meta__extras,.content--type-review .meta__extras,.content--type-quiz .meta__extras{-webkit-order:5;-ms-flex-order:5;order:5}.content--liveblog .block-share__item,.content--liveblog .social-icon,.content--media .block-share__item,.content--media .social-icon,.content--type-analysis .block-share__item,.content--type-analysis .social-icon,.content--type-article .block-share__item,.content--type-article .social-icon,.content--type-comment .block-share__item,.content--type-comment .social-icon,.content--type-feature .block-share__item,.content--type-feature .social-icon,.content--type-recipe .block-share__item,.content--type-recipe .social-icon,.content--type-guardianview .block-share__item,.content--type-guardianview .social-icon,.content--type-immersive:not(.content--minute-article) .block-share__item,.content--type-immersive:not(.content--minute-article) .social-icon,.content--type-interview .block-share__item,.content--type-interview .social-icon,.content--type-live .block-share__item,.content--type-live .social-icon,.content--type-matchreport .block-share__item,.content--type-matchreport .social-icon,.content--type-media .block-share__item,.content--type-media .social-icon,.content--type-review .block-share__item,.content--type-review .social-icon,.content--type-quiz .block-share__item,.content--type-quiz .social-icon{background-color:transparent;border:0.0625rem solid #dcdcdc}.content--liveblog .block-share__item:focus svg,.content--liveblog .block-share__item:hover svg,.content--liveblog .social-icon:focus svg,.content--liveblog .social-icon:hover svg,.content--media .block-share__item:focus svg,.content--media .block-share__item:hover svg,.content--media .social-icon:focus svg,.content--media .social-icon:hover svg,.content--type-analysis .block-share__item:focus svg,.content--type-analysis .block-share__item:hover svg,.content--type-analysis .social-icon:focus svg,.content--type-analysis .social-icon:hover svg,.content--type-article .block-share__item:focus svg,.content--type-article .block-share__item:hover svg,.content--type-article .social-icon:focus svg,.content--type-article .social-icon:hover svg,.content--type-comment .block-share__item:focus svg,.content--type-comment .block-share__item:hover svg,.content--type-comment .social-icon:focus svg,.content--type-comment .social-icon:hover svg,.content--type-feature .block-share__item:focus svg,.content--type-feature .block-share__item:hover svg,.content--type-feature .social-icon:focus svg,.content--type-feature .social-icon:hover svg,.content--type-recipe .block-share__item:focus svg,.content--type-recipe .block-share__item:hover svg,.content--type-recipe .social-icon:focus svg,.content--type-recipe .social-icon:hover svg,.content--type-guardianview .block-share__item:focus svg,.content--type-guardianview .block-share__item:hover svg,.content--type-guardianview .social-icon:focus svg,.content--type-guardianview .social-icon:hover svg,.content--type-immersive:not(.content--minute-article) .block-share__item:focus svg,.content--type-immersive:not(.content--minute-article) .block-share__item:hover svg,.content--type-immersive:not(.content--minute-article) .social-icon:focus svg,.content--type-immersive:not(.content--minute-article) .social-icon:hover svg,.content--type-interview .block-share__item:focus svg,.content--type-interview .block-share__item:hover svg,.content--type-interview .social-icon:focus svg,.content--type-interview .social-icon:hover svg,.content--type-live .block-share__item:focus svg,.content--type-live .block-share__item:hover svg,.content--type-live .social-icon:focus svg,.content--type-live .social-icon:hover svg,.content--type-matchreport .block-share__item:focus svg,.content--type-matchreport .block-share__item:hover svg,.content--type-matchreport .social-icon:focus svg,.content--type-matchreport .social-icon:hover svg,.content--type-media .block-share__item:focus svg,.content--type-media .block-share__item:hover svg,.content--type-media .social-icon:focus svg,.content--type-media .social-icon:hover svg,.content--type-review .block-share__item:focus svg,.content--type-review .block-share__item:hover svg,.content--type-review .social-icon:focus svg,.content--type-review .social-icon:hover svg,.content--type-quiz .block-share__item:focus svg,.content--type-quiz .block-share__item:hover svg,.content--type-quiz .social-icon:focus svg,.content--type-quiz .social-icon:hover svg{fill:#fff}.content--liveblog .meta__number+.meta__number,.content--media .meta__number+.meta__number,.content--type-analysis .meta__number+.meta__number,.content--type-article .meta__number+.meta__number,.content--type-comment .meta__number+.meta__number,.content--type-feature .meta__number+.meta__number,.content--type-recipe .meta__number+.meta__number,.content--type-guardianview .meta__number+.meta__number,.content--type-immersive:not(.content--minute-article) .meta__number+.meta__number,.content--type-interview .meta__number+.meta__number,.content--type-live .meta__number+.meta__number,.content--type-matchreport .meta__number+.meta__number,.content--type-media .meta__number+.meta__number,.content--type-review .meta__number+.meta__number,.content--type-quiz .meta__number+.meta__number{border-color:#dcdcdc}@media (min-width: 71.25em){.content--liveblog .content__main-column:not(.content__main-column--gallery):before,.content--media .content__main-column:not(.content__main-column--gallery):before,.content--type-analysis .content__main-column:not(.content__main-column--gallery):before,.content--type-article .content__main-column:not(.content__main-column--gallery):before,.content--type-comment .content__main-column:not(.content__main-column--gallery):before,.content--type-feature .content__main-column:not(.content__main-column--gallery):before,.content--type-recipe .content__main-column:not(.content__main-column--gallery):before,.content--type-guardianview .content__main-column:not(.content__main-column--gallery):before,.content--type-immersive:not(.content--minute-article) .content__main-column:not(.content__main-column--gallery):before,.content--type-interview .content__main-column:not(.content__main-column--gallery):before,.content--type-live .content__main-column:not(.content__main-column--gallery):before,.content--type-matchreport .content__main-column:not(.content__main-column--gallery):before,.content--type-media .content__main-column:not(.content__main-column--gallery):before,.content--type-review .content__main-column:not(.content__main-column--gallery):before,.content--type-quiz .content__main-column:not(.content__main-column--gallery):before{content:'';position:absolute;top:0;bottom:0;left:0;height:100%;width:0.0625rem;background:#dcdcdc}}@media (min-width: 46.25em){.content--liveblog .content__main-column:not(.content__main-column--gallery),.content--media .content__main-column:not(.content__main-column--gallery),.content--type-analysis .content__main-column:not(.content__main-column--gallery),.content--type-article .content__main-column:not(.content__main-column--gallery),.content--type-comment .content__main-column:not(.content__main-column--gallery),.content--type-feature .content__main-column:not(.content__main-column--gallery),.content--type-recipe .content__main-column:not(.content__main-column--gallery),.content--type-guardianview .content__main-column:not(.content__main-column--gallery),.content--type-immersive:not(.content--minute-article) .content__main-column:not(.content__main-column--gallery),.content--type-interview .content__main-column:not(.content__main-column--gallery),.content--type-live .content__main-column:not(.content__main-column--gallery),.content--type-matchreport .content__main-column:not(.content__main-column--gallery),.content--type-media .content__main-column:not(.content__main-column--gallery),.content--type-review .content__main-column:not(.content__main-column--gallery),.content--type-quiz .content__main-column:not(.content__main-column--gallery){padding-left:0}}@media (min-width: 71.25em){.content--liveblog .content__main-column:not(.content__main-column--gallery),.content--media .content__main-column:not(.content__main-column--gallery),.content--type-analysis .content__main-column:not(.content__main-column--gallery),.content--type-article .content__main-column:not(.content__main-column--gallery),.content--type-comment .content__main-column:not(.content__main-column--gallery),.content--type-feature .content__main-column:not(.content__main-column--gallery),.content--type-recipe .content__main-column:not(.content__main-column--gallery),.content--type-guardianview .content__main-column:not(.content__main-column--gallery),.content--type-immersive:not(.content--minute-article) .content__main-column:not(.content__main-column--gallery),.content--type-interview .content__main-column:not(.content__main-column--gallery),.content--type-live .content__main-column:not(.content__main-column--gallery),.content--type-matchreport .content__main-column:not(.content__main-column--gallery),.content--type-media .content__main-column:not(.content__main-column--gallery),.content--type-review .content__main-column:not(.content__main-column--gallery),.content--type-quiz .content__main-column:not(.content__main-column--gallery){padding-left:0.625rem}}.content--liveblog .content__article-body,.content--media .content__article-body,.content--type-analysis .content__article-body,.content--type-article .content__article-body,.content--type-comment .content__article-body,.content--type-feature .content__article-body,.content--type-recipe .content__article-body,.content--type-guardianview .content__article-body,.content--type-immersive:not(.content--minute-article) .content__article-body,.content--type-interview .content__article-body,.content--type-live .content__article-body,.content--type-matchreport .content__article-body,.content--type-media .content__article-body,.content--type-review .content__article-body,.content--type-quiz .content__article-body{font-size:1.0625rem;line-height:1.5rem;font-family:"Guardian Text Egyptian Web",Georgia,serif}@media (min-width: 46.25em){.content--liveblog .content__article-body,.content--media .content__article-body,.content--type-analysis .content__article-body,.content--type-article .content__article-body,.content--type-comment .content__article-body,.content--type-feature .content__article-body,.content--type-recipe .content__article-body,.content--type-guardianview .content__article-body,.content--type-immersive:not(.content--minute-article) .content__article-body,.content--type-interview .content__article-body,.content--type-live .content__article-body,.content--type-matchreport .content__article-body,.content--type-media .content__article-body,.content--type-review .content__article-body,.content--type-quiz .content__article-body{margin-left:0;padding-bottom:3rem}}@media (min-width: 61.25em){.content--liveblog .content__article-body,.content--media .content__article-body,.content--type-analysis .content__article-body,.content--type-article .content__article-body,.content--type-comment .content__article-body,.content--type-feature .content__article-body,.content--type-recipe .content__article-body,.content--type-guardianview .content__article-body,.content--type-immersive:not(.content--minute-article) .content__article-body,.content--type-interview .content__article-body,.content--type-live .content__article-body,.content--type-matchreport .content__article-body,.content--type-media .content__article-body,.content--type-review .content__article-body,.content--type-quiz .content__article-body{margin-left:0;padding-bottom:4.5rem}}.content--liveblog .content__secondary-column,.content--media .content__secondary-column,.content--type-analysis .content__secondary-column,.content--type-article .content__secondary-column,.content--type-comment .content__secondary-column,.content--type-feature .content__secondary-column,.content--type-recipe .content__secondary-column,.content--type-guardianview .content__secondary-column,.content--type-immersive:not(.content--minute-article) .content__secondary-column,.content--type-interview .content__secondary-column,.content--type-live .content__secondary-column,.content--type-matchreport .content__secondary-column,.content--type-media .content__secondary-column,.content--type-review .content__secondary-column,.content--type-quiz .content__secondary-column{padding-top:0.375rem}.content--liveblog .caption--img,.content--media .caption--img,.content--type-analysis .caption--img,.content--type-article .caption--img,.content--type-comment .caption--img,.content--type-feature .caption--img,.content--type-recipe .caption--img,.content--type-guardianview .caption--img,.content--type-immersive:not(.content--minute-article) .caption--img,.content--type-interview .caption--img,.content--type-live .caption--img,.content--type-matchreport .caption--img,.content--type-media .caption--img,.content--type-review .caption--img,.content--type-quiz .caption--img{min-height:2.25rem;padding-bottom:0}@media (min-width: 46.25em){.content--liveblog .caption--img,.content--media .caption--img,.content--type-analysis .caption--img,.content--type-article .caption--img,.content--type-comment .caption--img,.content--type-feature .caption--img,.content--type-recipe .caption--img,.content--type-guardianview .caption--img,.content--type-immersive:not(.content--minute-article) .caption--img,.content--type-interview .caption--img,.content--type-live .caption--img,.content--type-matchreport .caption--img,.content--type-media .caption--img,.content--type-review .caption--img,.content--type-quiz .caption--img{min-height:0}}@media (min-width: 71.25em){.content--liveblog .caption--img,.content--media .caption--img,.content--type-analysis .caption--img,.content--type-article .caption--img,.content--type-comment .caption--img,.content--type-feature .caption--img,.content--type-recipe .caption--img,.content--type-guardianview .caption--img,.content--type-immersive:not(.content--minute-article) .caption--img,.content--type-interview .caption--img,.content--type-live .caption--img,.content--type-matchreport .caption--img,.content--type-media .caption--img,.content--type-review .caption--img,.content--type-quiz .caption--img{padding-bottom:0.375rem}}.content--liveblog .caption--img svg,.content--media .caption--img svg,.content--type-analysis .caption--img svg,.content--type-article .caption--img svg,.content--type-comment .caption--img svg,.content--type-feature .caption--img svg,.content--type-recipe .caption--img svg,.content--type-guardianview .caption--img svg,.content--type-immersive:not(.content--minute-article) .caption--img svg,.content--type-interview .caption--img svg,.content--type-live .caption--img svg,.content--type-matchreport .caption--img svg,.content--type-media .caption--img svg,.content--type-review .caption--img svg,.content--type-quiz .caption--img svg{position:relative}@media (max-width: 71.24em){.content--liveblog .caption--main.caption--img,.content--media .caption--main.caption--img,.content--type-analysis .caption--main.caption--img,.content--type-article .caption--main.caption--img,.content--type-comment .caption--main.caption--img,.content--type-feature .caption--main.caption--img,.content--type-recipe .caption--main.caption--img,.content--type-guardianview .caption--main.caption--img,.content--type-immersive:not(.content--minute-article) .caption--main.caption--img,.content--type-interview .caption--main.caption--img,.content--type-live .caption--main.caption--img,.content--type-matchreport .caption--main.caption--img,.content--type-media .caption--main.caption--img,.content--type-review .caption--main.caption--img,.content--type-quiz .caption--main.caption--img{padding-bottom:0.375rem}}.content--liveblog:not(.paid-content) .media-primary.media-primary--showcase,.content--media:not(.paid-content) .media-primary.media-primary--showcase,.content--type-analysis:not(.paid-content) .media-primary.media-primary--showcase,.content--type-article:not(.paid-content) .media-primary.media-primary--showcase,.content--type-comment:not(.paid-content) .media-primary.media-primary--showcase,.content--type-feature:not(.paid-content) .media-primary.media-primary--showcase,.content--type-recipe:not(.paid-content) .media-primary.media-primary--showcase,.content--type-guardianview:not(.paid-content) .media-primary.media-primary--showcase,.content--type-immersive:not(.content--minute-article):not(.paid-content) .media-primary.media-primary--showcase,.content--type-interview:not(.paid-content) .media-primary.media-primary--showcase,.content--type-live:not(.paid-content) .media-primary.media-primary--showcase,.content--type-matchreport:not(.paid-content) .media-primary.media-primary--showcase,.content--type-media:not(.paid-content) .media-primary.media-primary--showcase,.content--type-review:not(.paid-content) .media-primary.media-primary--showcase,.content--type-quiz:not(.paid-content) .media-primary.media-primary--showcase{margin-left:0;margin-right:0}.content--liveblog .stars,.content--media .stars,.content--type-analysis .stars,.content--type-article .stars,.content--type-comment .stars,.content--type-feature .stars,.content--type-recipe .stars,.content--type-guardianview .stars,.content--type-immersive:not(.content--minute-article) .stars,.content--type-interview .stars,.content--type-live .stars,.content--type-matchreport .stars,.content--type-media .stars,.content--type-review .stars,.content--type-quiz .stars{background-color:#ffe500;display:inline-block;line-height:0;padding:calc((0.75rem / 2) - 0.125rem);padding-left:0.625rem;margin-top:0.375rem;margin-bottom:1.125rem}@media (min-width: 30em){.content--liveblog .stars,.content--media .stars,.content--type-analysis .stars,.content--type-article .stars,.content--type-comment .stars,.content--type-feature .stars,.content--type-recipe .stars,.content--type-guardianview .stars,.content--type-immersive:not(.content--minute-article) .stars,.content--type-interview .stars,.content--type-live .stars,.content--type-matchreport .stars,.content--type-media .stars,.content--type-review .stars,.content--type-quiz .stars{padding-left:1.25rem}}@media (min-width: 41.25em){.content--liveblog .stars,.content--media .stars,.content--type-analysis .stars,.content--type-article .stars,.content--type-comment .stars,.content--type-feature .stars,.content--type-recipe .stars,.content--type-guardianview .stars,.content--type-immersive:not(.content--minute-article) .stars,.content--type-interview .stars,.content--type-live .stars,.content--type-matchreport .stars,.content--type-media .stars,.content--type-review .stars,.content--type-quiz .stars{margin-left:0;padding-left:0.25rem}}@media (min-width: 71.25em){.content--liveblog .stars,.content--media .stars,.content--type-analysis .stars,.content--type-article .stars,.content--type-comment .stars,.content--type-feature .stars,.content--type-recipe .stars,.content--type-guardianview .stars,.content--type-immersive:not(.content--minute-article) .stars,.content--type-interview .stars,.content--type-live .stars,.content--type-matchreport .stars,.content--type-media .stars,.content--type-review .stars,.content--type-quiz .stars{margin-left:-0.625rem;padding-left:0.625rem}}.content--liveblog .inline-star,.content--media .inline-star,.content--type-analysis .inline-star,.content--type-article .inline-star,.content--type-comment .inline-star,.content--type-feature .inline-star,.content--type-recipe .inline-star,.content--type-guardianview .inline-star,.content--type-immersive:not(.content--minute-article) .inline-star,.content--type-interview .inline-star,.content--type-live .inline-star,.content--type-matchreport .inline-star,.content--type-media .inline-star,.content--type-review .inline-star,.content--type-quiz .inline-star{display:inline}.content--liveblog .inline-star svg,.content--media .inline-star svg,.content--type-analysis .inline-star svg,.content--type-article .inline-star svg,.content--type-comment .inline-star svg,.content--type-feature .inline-star svg,.content--type-recipe .inline-star svg,.content--type-guardianview .inline-star svg,.content--type-immersive:not(.content--minute-article) .inline-star svg,.content--type-interview .inline-star svg,.content--type-live .inline-star svg,.content--type-matchreport .inline-star svg,.content--type-media .inline-star svg,.content--type-review .inline-star svg,.content--type-quiz .inline-star svg{stroke:#121212;fill:transparent;height:1.2em;width:1.2em}.content--liveblog .inline-star.star__item--golden svg,.content--media .inline-star.star__item--golden svg,.content--type-analysis .inline-star.star__item--golden svg,.content--type-article .inline-star.star__item--golden svg,.content--type-comment .inline-star.star__item--golden svg,.content--type-feature .inline-star.star__item--golden svg,.content--type-recipe .inline-star.star__item--golden svg,.content--type-guardianview .inline-star.star__item--golden svg,.content--type-immersive:not(.content--minute-article) .inline-star.star__item--golden svg,.content--type-interview .inline-star.star__item--golden svg,.content--type-live .inline-star.star__item--golden svg,.content--type-matchreport .inline-star.star__item--golden svg,.content--type-media .inline-star.star__item--golden svg,.content--type-review .inline-star.star__item--golden svg,.content--type-quiz .inline-star.star__item--golden svg{fill:#121212;stroke:none}.content--liveblog .content__standfirst,.content--media .content__standfirst,.content--type-analysis .content__standfirst,.content--type-article .content__standfirst,.content--type-comment .content__standfirst,.content--type-feature .content__standfirst,.content--type-recipe .content__standfirst,.content--type-guardianview .content__standfirst,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-interview .content__standfirst,.content--type-live .content__standfirst,.content--type-matchreport .content__standfirst,.content--type-media .content__standfirst,.content--type-review .content__standfirst,.content--type-quiz .content__standfirst{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:700;color:#121212;margin-bottom:0.75rem;max-width:80%}@media (min-width: 41.25em){.content--liveblog .content__standfirst,.content--media .content__standfirst,.content--type-analysis .content__standfirst,.content--type-article .content__standfirst,.content--type-comment .content__standfirst,.content--type-feature .content__standfirst,.content--type-recipe .content__standfirst,.content--type-guardianview .content__standfirst,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-interview .content__standfirst,.content--type-live .content__standfirst,.content--type-matchreport .content__standfirst,.content--type-media .content__standfirst,.content--type-review .content__standfirst,.content--type-quiz .content__standfirst{max-width:28.75rem;margin-left:1.25rem}}@media (min-width: 46.25em){.content--liveblog .content__standfirst,.content--media .content__standfirst,.content--type-analysis .content__standfirst,.content--type-article .content__standfirst,.content--type-comment .content__standfirst,.content--type-feature .content__standfirst,.content--type-recipe .content__standfirst,.content--type-guardianview .content__standfirst,.content--type-immersive:not(.content--minute-article) .content__standfirst,.content--type-interview .content__standfirst,.content--type-live .content__standfirst,.content--type-matchreport .content__standfirst,.content--type-media .content__standfirst,.content--type-review .content__standfirst,.content--type-quiz .content__standfirst{max-width:33.75rem;margin-left:0}}.content--liveblog .media-primary,.content--media .media-primary,.content--type-analysis .media-primary,.content--type-article .media-primary,.content--type-comment .media-primary,.content--type-feature .media-primary,.content--type-recipe .media-primary,.content--type-guardianview .media-primary,.content--type-immersive:not(.content--minute-article) .media-primary,.content--type-interview .media-primary,.content--type-live .media-primary,.content--type-matchreport .media-primary,.content--type-media .media-primary,.content--type-review .media-primary,.content--type-quiz .media-primary{margin-bottom:0}@media (min-width: 46.25em){.content--liveblog .media-primary,.content--media .media-primary,.content--type-analysis .media-primary,.content--type-article .media-primary,.content--type-comment .media-primary,.content--type-feature .media-primary,.content--type-recipe .media-primary,.content--type-guardianview .media-primary,.content--type-immersive:not(.content--minute-article) .media-primary,.content--type-interview .media-primary,.content--type-live .media-primary,.content--type-matchreport .media-primary,.content--type-media .media-primary,.content--type-review .media-primary,.content--type-quiz .media-primary{margin-bottom:0.1875rem}}@media (min-width: 71.25em){.content--liveblog .media-primary,.content--media .media-primary,.content--type-analysis .media-primary,.content--type-article .media-primary,.content--type-comment .media-primary,.content--type-feature .media-primary,.content--type-recipe .media-primary,.content--type-guardianview .media-primary,.content--type-immersive:not(.content--minute-article) .media-primary,.content--type-interview .media-primary,.content--type-live .media-primary,.content--type-matchreport .media-primary,.content--type-media .media-primary,.content--type-review .media-primary,.content--type-quiz .media-primary{margin-bottom:0.375rem}}.content--liveblog .drop-cap,.content--media .drop-cap,.content--type-analysis .drop-cap,.content--type-article .drop-cap,.content--type-comment .drop-cap,.content--type-feature .drop-cap,.content--type-recipe .drop-cap,.content--type-guardianview .drop-cap,.content--type-immersive:not(.content--minute-article) .drop-cap,.content--type-interview .drop-cap,.content--type-live .drop-cap,.content--type-matchreport .drop-cap,.content--type-media .drop-cap,.content--type-review .drop-cap,.content--type-quiz .drop-cap{height:5rem}.content--liveblog .drop-cap__inner,.content--media .drop-cap__inner,.content--type-analysis .drop-cap__inner,.content--type-article .drop-cap__inner,.content--type-comment .drop-cap__inner,.content--type-feature .drop-cap__inner,.content--type-recipe .drop-cap__inner,.content--type-guardianview .drop-cap__inner,.content--type-immersive:not(.content--minute-article) .drop-cap__inner,.content--type-interview .drop-cap__inner,.content--type-live .drop-cap__inner,.content--type-matchreport .drop-cap__inner,.content--type-media .drop-cap__inner,.content--type-review .drop-cap__inner,.content--type-quiz .drop-cap__inner{font-weight:700;font-size:6.8125rem;line-height:4.6875rem}.content--liveblog .element-atom--media .fc-item.fc-item--media::before,.content--media .element-atom--media .fc-item.fc-item--media::before,.content--type-analysis .element-atom--media .fc-item.fc-item--media::before,.content--type-article .element-atom--media .fc-item.fc-item--media::before,.content--type-comment .element-atom--media .fc-item.fc-item--media::before,.content--type-feature .element-atom--media .fc-item.fc-item--media::before,.content--type-recipe .element-atom--media .fc-item.fc-item--media::before,.content--type-guardianview .element-atom--media .fc-item.fc-item--media::before,.content--type-immersive:not(.content--minute-article) .element-atom--media .fc-item.fc-item--media::before,.content--type-interview .element-atom--media .fc-item.fc-item--media::before,.content--type-live .element-atom--media .fc-item.fc-item--media::before,.content--type-matchreport .element-atom--media .fc-item.fc-item--media::before,.content--type-media .element-atom--media .fc-item.fc-item--media::before,.content--type-review .element-atom--media .fc-item.fc-item--media::before,.content--type-quiz .element-atom--media .fc-item.fc-item--media::before{content:none}.content--liveblog .element-pullquote,.content--media .element-pullquote,.content--type-analysis .element-pullquote,.content--type-article .element-pullquote,.content--type-comment .element-pullquote,.content--type-feature .element-pullquote,.content--type-recipe .element-pullquote,.content--type-guardianview .element-pullquote,.content--type-immersive:not(.content--minute-article) .element-pullquote,.content--type-interview .element-pullquote,.content--type-live .element-pullquote,.content--type-matchreport .element-pullquote,.content--type-media .element-pullquote,.content--type-review .element-pullquote,.content--type-quiz .element-pullquote{background-color:#f6f6f6;margin:0.3125rem 0 1.5rem;padding:0.375rem 0.625rem 0.75rem;position:relative;clear:none;float:none;width:inherit;margin-left:-0.625rem}@media (min-width: 30em){.content--liveblog .element-pullquote,.content--media .element-pullquote,.content--type-analysis .element-pullquote,.content--type-article .element-pullquote,.content--type-comment .element-pullquote,.content--type-feature .element-pullquote,.content--type-recipe .element-pullquote,.content--type-guardianview .element-pullquote,.content--type-immersive:not(.content--minute-article) .element-pullquote,.content--type-interview .element-pullquote,.content--type-live .element-pullquote,.content--type-matchreport .element-pullquote,.content--type-media .element-pullquote,.content--type-review .element-pullquote,.content--type-quiz .element-pullquote{margin-left:-1.25rem}}@media (min-width: 41.25em){.content--liveblog .element-pullquote,.content--media .element-pullquote,.content--type-analysis .element-pullquote,.content--type-article .element-pullquote,.content--type-comment .element-pullquote,.content--type-feature .element-pullquote,.content--type-recipe .element-pullquote,.content--type-guardianview .element-pullquote,.content--type-immersive:not(.content--minute-article) .element-pullquote,.content--type-interview .element-pullquote,.content--type-live .element-pullquote,.content--type-matchreport .element-pullquote,.content--type-media .element-pullquote,.content--type-review .element-pullquote,.content--type-quiz .element-pullquote{margin-left:-0.625rem}}@media (min-width: 71.25em){.content--liveblog .element-pullquote,.content--media .element-pullquote,.content--type-analysis .element-pullquote,.content--type-article .element-pullquote,.content--type-comment .element-pullquote,.content--type-feature .element-pullquote,.content--type-recipe .element-pullquote,.content--type-guardianview .element-pullquote,.content--type-immersive:not(.content--minute-article) .element-pullquote,.content--type-interview .element-pullquote,.content--type-live .element-pullquote,.content--type-matchreport .element-pullquote,.content--type-media .element-pullquote,.content--type-review .element-pullquote,.content--type-quiz .element-pullquote{margin-left:-3.4375rem}}.content--liveblog .element-pullquote:after,.content--media .element-pullquote:after,.content--type-analysis .element-pullquote:after,.content--type-article .element-pullquote:after,.content--type-comment .element-pullquote:after,.content--type-feature .element-pullquote:after,.content--type-recipe .element-pullquote:after,.content--type-guardianview .element-pullquote:after,.content--type-immersive:not(.content--minute-article) .element-pullquote:after,.content--type-interview .element-pullquote:after,.content--type-live .element-pullquote:after,.content--type-matchreport .element-pullquote:after,.content--type-media .element-pullquote:after,.content--type-review .element-pullquote:after,.content--type-quiz .element-pullquote:after{content:'';width:1.5625rem;height:1.5625rem;border-radius:0 0 1.5625rem;position:absolute;bottom:-1.5625rem;left:0.625rem;background-color:#f6f6f6}@media (min-width: 30em){.content--liveblog .element-pullquote:after,.content--media .element-pullquote:after,.content--type-analysis .element-pullquote:after,.content--type-article .element-pullquote:after,.content--type-comment .element-pullquote:after,.content--type-feature .element-pullquote:after,.content--type-recipe .element-pullquote:after,.content--type-guardianview .element-pullquote:after,.content--type-immersive:not(.content--minute-article) .element-pullquote:after,.content--type-interview .element-pullquote:after,.content--type-live .element-pullquote:after,.content--type-matchreport .element-pullquote:after,.content--type-media .element-pullquote:after,.content--type-review .element-pullquote:after,.content--type-quiz .element-pullquote:after{left:1.25rem}}@media (min-width: 41.25em){.content--liveblog .element-pullquote:after,.content--media .element-pullquote:after,.content--type-analysis .element-pullquote:after,.content--type-article .element-pullquote:after,.content--type-comment .element-pullquote:after,.content--type-feature .element-pullquote:after,.content--type-recipe .element-pullquote:after,.content--type-guardianview .element-pullquote:after,.content--type-immersive:not(.content--minute-article) .element-pullquote:after,.content--type-interview .element-pullquote:after,.content--type-live .element-pullquote:after,.content--type-matchreport .element-pullquote:after,.content--type-media .element-pullquote:after,.content--type-review .element-pullquote:after,.content--type-quiz .element-pullquote:after{left:0.625rem}}@media (min-width: 61.25em){.content--liveblog .element-pullquote:after,.content--media .element-pullquote:after,.content--type-analysis .element-pullquote:after,.content--type-article .element-pullquote:after,.content--type-comment .element-pullquote:after,.content--type-feature .element-pullquote:after,.content--type-recipe .element-pullquote:after,.content--type-guardianview .element-pullquote:after,.content--type-immersive:not(.content--minute-article) .element-pullquote:after,.content--type-interview .element-pullquote:after,.content--type-live .element-pullquote:after,.content--type-matchreport .element-pullquote:after,.content--type-media .element-pullquote:after,.content--type-review .element-pullquote:after,.content--type-quiz .element-pullquote:after{left:0}}@media (min-width: 71.25em){.content--liveblog .element-pullquote:after,.content--media .element-pullquote:after,.content--type-analysis .element-pullquote:after,.content--type-article .element-pullquote:after,.content--type-comment .element-pullquote:after,.content--type-feature .element-pullquote:after,.content--type-recipe .element-pullquote:after,.content--type-guardianview .element-pullquote:after,.content--type-immersive:not(.content--minute-article) .element-pullquote:after,.content--type-interview .element-pullquote:after,.content--type-live .element-pullquote:after,.content--type-matchreport .element-pullquote:after,.content--type-media .element-pullquote:after,.content--type-review .element-pullquote:after,.content--type-quiz .element-pullquote:after{left:2.8125rem}}.content--liveblog .element-pullquote .pullquote-cite,.content--liveblog .element-pullquote .pullquote-paragraph,.content--media .element-pullquote .pullquote-cite,.content--media .element-pullquote .pullquote-paragraph,.content--type-analysis .element-pullquote .pullquote-cite,.content--type-analysis .element-pullquote .pullquote-paragraph,.content--type-article .element-pullquote .pullquote-cite,.content--type-article .element-pullquote .pullquote-paragraph,.content--type-comment .element-pullquote .pullquote-cite,.content--type-comment .element-pullquote .pullquote-paragraph,.content--type-feature .element-pullquote .pullquote-cite,.content--type-feature .element-pullquote .pullquote-paragraph,.content--type-recipe .element-pullquote .pullquote-cite,.content--type-recipe .element-pullquote .pullquote-paragraph,.content--type-guardianview .element-pullquote .pullquote-cite,.content--type-guardianview .element-pullquote .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote .pullquote-paragraph,.content--type-interview .element-pullquote .pullquote-cite,.content--type-interview .element-pullquote .pullquote-paragraph,.content--type-live .element-pullquote .pullquote-cite,.content--type-live .element-pullquote .pullquote-paragraph,.content--type-matchreport .element-pullquote .pullquote-cite,.content--type-matchreport .element-pullquote .pullquote-paragraph,.content--type-media .element-pullquote .pullquote-cite,.content--type-media .element-pullquote .pullquote-paragraph,.content--type-review .element-pullquote .pullquote-cite,.content--type-review .element-pullquote .pullquote-paragraph,.content--type-quiz .element-pullquote .pullquote-cite,.content--type-quiz .element-pullquote .pullquote-paragraph{display:inline;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:300}.content--liveblog .element-pullquote .inline-quote,.content--liveblog .element-pullquote blockquote,.content--media .element-pullquote .inline-quote,.content--media .element-pullquote blockquote,.content--type-analysis .element-pullquote .inline-quote,.content--type-analysis .element-pullquote blockquote,.content--type-article .element-pullquote .inline-quote,.content--type-article .element-pullquote blockquote,.content--type-comment .element-pullquote .inline-quote,.content--type-comment .element-pullquote blockquote,.content--type-feature .element-pullquote .inline-quote,.content--type-feature .element-pullquote blockquote,.content--type-recipe .element-pullquote .inline-quote,.content--type-recipe .element-pullquote blockquote,.content--type-guardianview .element-pullquote .inline-quote,.content--type-guardianview .element-pullquote blockquote,.content--type-immersive:not(.content--minute-article) .element-pullquote .inline-quote,.content--type-immersive:not(.content--minute-article) .element-pullquote blockquote,.content--type-interview .element-pullquote .inline-quote,.content--type-interview .element-pullquote blockquote,.content--type-live .element-pullquote .inline-quote,.content--type-live .element-pullquote blockquote,.content--type-matchreport .element-pullquote .inline-quote,.content--type-matchreport .element-pullquote blockquote,.content--type-media .element-pullquote .inline-quote,.content--type-media .element-pullquote blockquote,.content--type-review .element-pullquote .inline-quote,.content--type-review .element-pullquote blockquote,.content--type-quiz .element-pullquote .inline-quote,.content--type-quiz .element-pullquote blockquote{display:inline}.content--liveblog .element-pullquote .inline-garnett-quote,.content--media .element-pullquote .inline-garnett-quote,.content--type-analysis .element-pullquote .inline-garnett-quote,.content--type-article .element-pullquote .inline-garnett-quote,.content--type-comment .element-pullquote .inline-garnett-quote,.content--type-feature .element-pullquote .inline-garnett-quote,.content--type-recipe .element-pullquote .inline-garnett-quote,.content--type-guardianview .element-pullquote .inline-garnett-quote,.content--type-immersive:not(.content--minute-article) .element-pullquote .inline-garnett-quote,.content--type-interview .element-pullquote .inline-garnett-quote,.content--type-live .element-pullquote .inline-garnett-quote,.content--type-matchreport .element-pullquote .inline-garnett-quote,.content--type-media .element-pullquote .inline-garnett-quote,.content--type-review .element-pullquote .inline-garnett-quote,.content--type-quiz .element-pullquote .inline-garnett-quote{margin-right:0.9375rem;width:1.25rem}.content--liveblog .element-pullquote .inline-garnett-quote svg,.content--media .element-pullquote .inline-garnett-quote svg,.content--type-analysis .element-pullquote .inline-garnett-quote svg,.content--type-article .element-pullquote .inline-garnett-quote svg,.content--type-comment .element-pullquote .inline-garnett-quote svg,.content--type-feature .element-pullquote .inline-garnett-quote svg,.content--type-recipe .element-pullquote .inline-garnett-quote svg,.content--type-guardianview .element-pullquote .inline-garnett-quote svg,.content--type-immersive:not(.content--minute-article) .element-pullquote .inline-garnett-quote svg,.content--type-interview .element-pullquote .inline-garnett-quote svg,.content--type-live .element-pullquote .inline-garnett-quote svg,.content--type-matchreport .element-pullquote .inline-garnett-quote svg,.content--type-media .element-pullquote .inline-garnett-quote svg,.content--type-review .element-pullquote .inline-garnett-quote svg,.content--type-quiz .element-pullquote .inline-garnett-quote svg{width:0.75rem;height:auto;position:relative;top:-0.5rem}@media (min-width: 61.25em){.content--liveblog .element-pullquote .inline-garnett-quote svg,.content--media .element-pullquote .inline-garnett-quote svg,.content--type-analysis .element-pullquote .inline-garnett-quote svg,.content--type-article .element-pullquote .inline-garnett-quote svg,.content--type-comment .element-pullquote .inline-garnett-quote svg,.content--type-feature .element-pullquote .inline-garnett-quote svg,.content--type-recipe .element-pullquote .inline-garnett-quote svg,.content--type-guardianview .element-pullquote .inline-garnett-quote svg,.content--type-immersive:not(.content--minute-article) .element-pullquote .inline-garnett-quote svg,.content--type-interview .element-pullquote .inline-garnett-quote svg,.content--type-live .element-pullquote .inline-garnett-quote svg,.content--type-matchreport .element-pullquote .inline-garnett-quote svg,.content--type-media .element-pullquote .inline-garnett-quote svg,.content--type-review .element-pullquote .inline-garnett-quote svg,.content--type-quiz .element-pullquote .inline-garnett-quote svg{width:0.875rem;top:-0.625rem}}@media (min-width: 22.5em){.content--liveblog .element-pullquote.element--supporting,.content--media .element-pullquote.element--supporting,.content--type-analysis .element-pullquote.element--supporting,.content--type-article .element-pullquote.element--supporting,.content--type-comment .element-pullquote.element--supporting,.content--type-feature .element-pullquote.element--supporting,.content--type-recipe .element-pullquote.element--supporting,.content--type-guardianview .element-pullquote.element--supporting,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting,.content--type-interview .element-pullquote.element--supporting,.content--type-live .element-pullquote.element--supporting,.content--type-matchreport .element-pullquote.element--supporting,.content--type-media .element-pullquote.element--supporting,.content--type-review .element-pullquote.element--supporting,.content--type-quiz .element-pullquote.element--supporting{clear:left;float:left;margin-right:0.625rem;width:13.75rem}}@media (min-width: 71.25em){.content--liveblog .element-pullquote.element--supporting,.content--media .element-pullquote.element--supporting,.content--type-analysis .element-pullquote.element--supporting,.content--type-article .element-pullquote.element--supporting,.content--type-comment .element-pullquote.element--supporting,.content--type-feature .element-pullquote.element--supporting,.content--type-recipe .element-pullquote.element--supporting,.content--type-guardianview .element-pullquote.element--supporting,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting,.content--type-interview .element-pullquote.element--supporting,.content--type-live .element-pullquote.element--supporting,.content--type-matchreport .element-pullquote.element--supporting,.content--type-media .element-pullquote.element--supporting,.content--type-review .element-pullquote.element--supporting,.content--type-quiz .element-pullquote.element--supporting{margin-left:-7.5rem}}@media (min-width: 71.25em){.content--liveblog .element-pullquote.element--supporting:after,.content--media .element-pullquote.element--supporting:after,.content--type-analysis .element-pullquote.element--supporting:after,.content--type-article .element-pullquote.element--supporting:after,.content--type-comment .element-pullquote.element--supporting:after,.content--type-feature .element-pullquote.element--supporting:after,.content--type-recipe .element-pullquote.element--supporting:after,.content--type-guardianview .element-pullquote.element--supporting:after,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting:after,.content--type-interview .element-pullquote.element--supporting:after,.content--type-live .element-pullquote.element--supporting:after,.content--type-matchreport .element-pullquote.element--supporting:after,.content--type-media .element-pullquote.element--supporting:after,.content--type-review .element-pullquote.element--supporting:after,.content--type-quiz .element-pullquote.element--supporting:after{border-radius:0 0 0 1.5625rem;left:5.375rem}}.content--liveblog .element-pullquote.element--supporting .pullquote-cite,.content--liveblog .element-pullquote.element--supporting .pullquote-paragraph,.content--media .element-pullquote.element--supporting .pullquote-cite,.content--media .element-pullquote.element--supporting .pullquote-paragraph,.content--type-analysis .element-pullquote.element--supporting .pullquote-cite,.content--type-analysis .element-pullquote.element--supporting .pullquote-paragraph,.content--type-article .element-pullquote.element--supporting .pullquote-cite,.content--type-article .element-pullquote.element--supporting .pullquote-paragraph,.content--type-comment .element-pullquote.element--supporting .pullquote-cite,.content--type-comment .element-pullquote.element--supporting .pullquote-paragraph,.content--type-feature .element-pullquote.element--supporting .pullquote-cite,.content--type-feature .element-pullquote.element--supporting .pullquote-paragraph,.content--type-recipe .element-pullquote.element--supporting .pullquote-cite,.content--type-recipe .element-pullquote.element--supporting .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--supporting .pullquote-cite,.content--type-guardianview .element-pullquote.element--supporting .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting .pullquote-paragraph,.content--type-interview .element-pullquote.element--supporting .pullquote-cite,.content--type-interview .element-pullquote.element--supporting .pullquote-paragraph,.content--type-live .element-pullquote.element--supporting .pullquote-cite,.content--type-live .element-pullquote.element--supporting .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--supporting .pullquote-cite,.content--type-matchreport .element-pullquote.element--supporting .pullquote-paragraph,.content--type-media .element-pullquote.element--supporting .pullquote-cite,.content--type-media .element-pullquote.element--supporting .pullquote-paragraph,.content--type-review .element-pullquote.element--supporting .pullquote-cite,.content--type-review .element-pullquote.element--supporting .pullquote-paragraph,.content--type-quiz .element-pullquote.element--supporting .pullquote-cite,.content--type-quiz .element-pullquote.element--supporting .pullquote-paragraph{font-size:1.25rem;line-height:1.4375rem}.content--liveblog .element-pullquote.element--supporting .inline-garnett-quote,.content--media .element-pullquote.element--supporting .inline-garnett-quote,.content--type-analysis .element-pullquote.element--supporting .inline-garnett-quote,.content--type-article .element-pullquote.element--supporting .inline-garnett-quote,.content--type-comment .element-pullquote.element--supporting .inline-garnett-quote,.content--type-feature .element-pullquote.element--supporting .inline-garnett-quote,.content--type-recipe .element-pullquote.element--supporting .inline-garnett-quote,.content--type-guardianview .element-pullquote.element--supporting .inline-garnett-quote,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting .inline-garnett-quote,.content--type-interview .element-pullquote.element--supporting .inline-garnett-quote,.content--type-live .element-pullquote.element--supporting .inline-garnett-quote,.content--type-matchreport .element-pullquote.element--supporting .inline-garnett-quote,.content--type-media .element-pullquote.element--supporting .inline-garnett-quote,.content--type-review .element-pullquote.element--supporting .inline-garnett-quote,.content--type-quiz .element-pullquote.element--supporting .inline-garnett-quote{margin-right:0.625rem}.content--liveblog .element-pullquote.element--supporting .inline-garnett-quote svg,.content--media .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-analysis .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-article .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-comment .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-feature .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-recipe .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-guardianview .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-interview .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-live .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-matchreport .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-media .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-review .element-pullquote.element--supporting .inline-garnett-quote svg,.content--type-quiz .element-pullquote.element--supporting .inline-garnett-quote svg{height:0.5rem;top:-0.4375rem}@media (min-width: 22.5em){.content--liveblog .element-pullquote.element--halfWidth,.content--media .element-pullquote.element--halfWidth,.content--type-analysis .element-pullquote.element--halfWidth,.content--type-article .element-pullquote.element--halfWidth,.content--type-comment .element-pullquote.element--halfWidth,.content--type-feature .element-pullquote.element--halfWidth,.content--type-recipe .element-pullquote.element--halfWidth,.content--type-guardianview .element-pullquote.element--halfWidth,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth,.content--type-interview .element-pullquote.element--halfWidth,.content--type-live .element-pullquote.element--halfWidth,.content--type-matchreport .element-pullquote.element--halfWidth,.content--type-media .element-pullquote.element--halfWidth,.content--type-review .element-pullquote.element--halfWidth,.content--type-quiz .element-pullquote.element--halfWidth{clear:left;float:left;margin-right:0.625rem;width:13.75rem}}@media (min-width: 30em){.content--liveblog .element-pullquote.element--halfWidth,.content--media .element-pullquote.element--halfWidth,.content--type-analysis .element-pullquote.element--halfWidth,.content--type-article .element-pullquote.element--halfWidth,.content--type-comment .element-pullquote.element--halfWidth,.content--type-feature .element-pullquote.element--halfWidth,.content--type-recipe .element-pullquote.element--halfWidth,.content--type-guardianview .element-pullquote.element--halfWidth,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth,.content--type-interview .element-pullquote.element--halfWidth,.content--type-live .element-pullquote.element--halfWidth,.content--type-matchreport .element-pullquote.element--halfWidth,.content--type-media .element-pullquote.element--halfWidth,.content--type-review .element-pullquote.element--halfWidth,.content--type-quiz .element-pullquote.element--halfWidth{width:18.75rem}}.content--liveblog .element-pullquote.element--halfWidth .pullquote-cite,.content--liveblog .element-pullquote.element--halfWidth .pullquote-paragraph,.content--media .element-pullquote.element--halfWidth .pullquote-cite,.content--media .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-analysis .element-pullquote.element--halfWidth .pullquote-cite,.content--type-analysis .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-article .element-pullquote.element--halfWidth .pullquote-cite,.content--type-article .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-comment .element-pullquote.element--halfWidth .pullquote-cite,.content--type-comment .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-feature .element-pullquote.element--halfWidth .pullquote-cite,.content--type-feature .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-recipe .element-pullquote.element--halfWidth .pullquote-cite,.content--type-recipe .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--halfWidth .pullquote-cite,.content--type-guardianview .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-interview .element-pullquote.element--halfWidth .pullquote-cite,.content--type-interview .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-live .element-pullquote.element--halfWidth .pullquote-cite,.content--type-live .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--halfWidth .pullquote-cite,.content--type-matchreport .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-media .element-pullquote.element--halfWidth .pullquote-cite,.content--type-media .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-review .element-pullquote.element--halfWidth .pullquote-cite,.content--type-review .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-quiz .element-pullquote.element--halfWidth .pullquote-cite,.content--type-quiz .element-pullquote.element--halfWidth .pullquote-paragraph{font-size:1.25rem;line-height:1.4375rem}@media (min-width: 61.25em){.content--liveblog .element-pullquote.element--halfWidth .pullquote-cite,.content--liveblog .element-pullquote.element--halfWidth .pullquote-paragraph,.content--media .element-pullquote.element--halfWidth .pullquote-cite,.content--media .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-analysis .element-pullquote.element--halfWidth .pullquote-cite,.content--type-analysis .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-article .element-pullquote.element--halfWidth .pullquote-cite,.content--type-article .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-comment .element-pullquote.element--halfWidth .pullquote-cite,.content--type-comment .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-feature .element-pullquote.element--halfWidth .pullquote-cite,.content--type-feature .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-recipe .element-pullquote.element--halfWidth .pullquote-cite,.content--type-recipe .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--halfWidth .pullquote-cite,.content--type-guardianview .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-interview .element-pullquote.element--halfWidth .pullquote-cite,.content--type-interview .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-live .element-pullquote.element--halfWidth .pullquote-cite,.content--type-live .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--halfWidth .pullquote-cite,.content--type-matchreport .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-media .element-pullquote.element--halfWidth .pullquote-cite,.content--type-media .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-review .element-pullquote.element--halfWidth .pullquote-cite,.content--type-review .element-pullquote.element--halfWidth .pullquote-paragraph,.content--type-quiz .element-pullquote.element--halfWidth .pullquote-cite,.content--type-quiz .element-pullquote.element--halfWidth .pullquote-paragraph{font-size:1.5rem;line-height:1.6875rem}}.content--liveblog .element-pullquote.element--inline,.content--media .element-pullquote.element--inline,.content--type-analysis .element-pullquote.element--inline,.content--type-article .element-pullquote.element--inline,.content--type-comment .element-pullquote.element--inline,.content--type-feature .element-pullquote.element--inline,.content--type-recipe .element-pullquote.element--inline,.content--type-guardianview .element-pullquote.element--inline,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline,.content--type-interview .element-pullquote.element--inline,.content--type-live .element-pullquote.element--inline,.content--type-matchreport .element-pullquote.element--inline,.content--type-media .element-pullquote.element--inline,.content--type-review .element-pullquote.element--inline,.content--type-quiz .element-pullquote.element--inline{width:18.75rem}@media (min-width: 30em){.content--liveblog .element-pullquote.element--inline,.content--media .element-pullquote.element--inline,.content--type-analysis .element-pullquote.element--inline,.content--type-article .element-pullquote.element--inline,.content--type-comment .element-pullquote.element--inline,.content--type-feature .element-pullquote.element--inline,.content--type-recipe .element-pullquote.element--inline,.content--type-guardianview .element-pullquote.element--inline,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline,.content--type-interview .element-pullquote.element--inline,.content--type-live .element-pullquote.element--inline,.content--type-matchreport .element-pullquote.element--inline,.content--type-media .element-pullquote.element--inline,.content--type-review .element-pullquote.element--inline,.content--type-quiz .element-pullquote.element--inline{width:23.75rem}}@media (min-width: 46.25em){.content--liveblog .element-pullquote.element--inline,.content--media .element-pullquote.element--inline,.content--type-analysis .element-pullquote.element--inline,.content--type-article .element-pullquote.element--inline,.content--type-comment .element-pullquote.element--inline,.content--type-feature .element-pullquote.element--inline,.content--type-recipe .element-pullquote.element--inline,.content--type-guardianview .element-pullquote.element--inline,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline,.content--type-interview .element-pullquote.element--inline,.content--type-live .element-pullquote.element--inline,.content--type-matchreport .element-pullquote.element--inline,.content--type-media .element-pullquote.element--inline,.content--type-review .element-pullquote.element--inline,.content--type-quiz .element-pullquote.element--inline{width:28.75rem}}.content--liveblog .element-pullquote.element--inline .pullquote-cite,.content--liveblog .element-pullquote.element--inline .pullquote-paragraph,.content--media .element-pullquote.element--inline .pullquote-cite,.content--media .element-pullquote.element--inline .pullquote-paragraph,.content--type-analysis .element-pullquote.element--inline .pullquote-cite,.content--type-analysis .element-pullquote.element--inline .pullquote-paragraph,.content--type-article .element-pullquote.element--inline .pullquote-cite,.content--type-article .element-pullquote.element--inline .pullquote-paragraph,.content--type-comment .element-pullquote.element--inline .pullquote-cite,.content--type-comment .element-pullquote.element--inline .pullquote-paragraph,.content--type-feature .element-pullquote.element--inline .pullquote-cite,.content--type-feature .element-pullquote.element--inline .pullquote-paragraph,.content--type-recipe .element-pullquote.element--inline .pullquote-cite,.content--type-recipe .element-pullquote.element--inline .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--inline .pullquote-cite,.content--type-guardianview .element-pullquote.element--inline .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline .pullquote-paragraph,.content--type-interview .element-pullquote.element--inline .pullquote-cite,.content--type-interview .element-pullquote.element--inline .pullquote-paragraph,.content--type-live .element-pullquote.element--inline .pullquote-cite,.content--type-live .element-pullquote.element--inline .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--inline .pullquote-cite,.content--type-matchreport .element-pullquote.element--inline .pullquote-paragraph,.content--type-media .element-pullquote.element--inline .pullquote-cite,.content--type-media .element-pullquote.element--inline .pullquote-paragraph,.content--type-review .element-pullquote.element--inline .pullquote-cite,.content--type-review .element-pullquote.element--inline .pullquote-paragraph,.content--type-quiz .element-pullquote.element--inline .pullquote-cite,.content--type-quiz .element-pullquote.element--inline .pullquote-paragraph{font-size:1.25rem;line-height:1.4375rem}@media (min-width: 61.25em){.content--liveblog .element-pullquote.element--inline .pullquote-cite,.content--liveblog .element-pullquote.element--inline .pullquote-paragraph,.content--media .element-pullquote.element--inline .pullquote-cite,.content--media .element-pullquote.element--inline .pullquote-paragraph,.content--type-analysis .element-pullquote.element--inline .pullquote-cite,.content--type-analysis .element-pullquote.element--inline .pullquote-paragraph,.content--type-article .element-pullquote.element--inline .pullquote-cite,.content--type-article .element-pullquote.element--inline .pullquote-paragraph,.content--type-comment .element-pullquote.element--inline .pullquote-cite,.content--type-comment .element-pullquote.element--inline .pullquote-paragraph,.content--type-feature .element-pullquote.element--inline .pullquote-cite,.content--type-feature .element-pullquote.element--inline .pullquote-paragraph,.content--type-recipe .element-pullquote.element--inline .pullquote-cite,.content--type-recipe .element-pullquote.element--inline .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--inline .pullquote-cite,.content--type-guardianview .element-pullquote.element--inline .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--inline .pullquote-paragraph,.content--type-interview .element-pullquote.element--inline .pullquote-cite,.content--type-interview .element-pullquote.element--inline .pullquote-paragraph,.content--type-live .element-pullquote.element--inline .pullquote-cite,.content--type-live .element-pullquote.element--inline .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--inline .pullquote-cite,.content--type-matchreport .element-pullquote.element--inline .pullquote-paragraph,.content--type-media .element-pullquote.element--inline .pullquote-cite,.content--type-media .element-pullquote.element--inline .pullquote-paragraph,.content--type-review .element-pullquote.element--inline .pullquote-cite,.content--type-review .element-pullquote.element--inline .pullquote-paragraph,.content--type-quiz .element-pullquote.element--inline .pullquote-cite,.content--type-quiz .element-pullquote.element--inline .pullquote-paragraph{font-size:1.5rem;line-height:1.6875rem}}@media (min-width: 30em){.content--liveblog .element-pullquote.element--showcase,.content--media .element-pullquote.element--showcase,.content--type-analysis .element-pullquote.element--showcase,.content--type-article .element-pullquote.element--showcase,.content--type-comment .element-pullquote.element--showcase,.content--type-feature .element-pullquote.element--showcase,.content--type-recipe .element-pullquote.element--showcase,.content--type-guardianview .element-pullquote.element--showcase,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase,.content--type-interview .element-pullquote.element--showcase,.content--type-live .element-pullquote.element--showcase,.content--type-matchreport .element-pullquote.element--showcase,.content--type-media .element-pullquote.element--showcase,.content--type-review .element-pullquote.element--showcase,.content--type-quiz .element-pullquote.element--showcase{margin-left:-1.25rem}}@media (min-width: 41.25em){.content--liveblog .element-pullquote.element--showcase,.content--media .element-pullquote.element--showcase,.content--type-analysis .element-pullquote.element--showcase,.content--type-article .element-pullquote.element--showcase,.content--type-comment .element-pullquote.element--showcase,.content--type-feature .element-pullquote.element--showcase,.content--type-recipe .element-pullquote.element--showcase,.content--type-guardianview .element-pullquote.element--showcase,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase,.content--type-interview .element-pullquote.element--showcase,.content--type-live .element-pullquote.element--showcase,.content--type-matchreport .element-pullquote.element--showcase,.content--type-media .element-pullquote.element--showcase,.content--type-review .element-pullquote.element--showcase,.content--type-quiz .element-pullquote.element--showcase{margin-left:-0.625rem}}@media (min-width: 71.25em){.content--liveblog .element-pullquote.element--showcase,.content--media .element-pullquote.element--showcase,.content--type-analysis .element-pullquote.element--showcase,.content--type-article .element-pullquote.element--showcase,.content--type-comment .element-pullquote.element--showcase,.content--type-feature .element-pullquote.element--showcase,.content--type-recipe .element-pullquote.element--showcase,.content--type-guardianview .element-pullquote.element--showcase,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase,.content--type-interview .element-pullquote.element--showcase,.content--type-live .element-pullquote.element--showcase,.content--type-matchreport .element-pullquote.element--showcase,.content--type-media .element-pullquote.element--showcase,.content--type-review .element-pullquote.element--showcase,.content--type-quiz .element-pullquote.element--showcase{width:38.75rem;margin-left:-8.75rem}}.content--liveblog .element-pullquote.element--showcase:after,.content--media .element-pullquote.element--showcase:after,.content--type-analysis .element-pullquote.element--showcase:after,.content--type-article .element-pullquote.element--showcase:after,.content--type-comment .element-pullquote.element--showcase:after,.content--type-feature .element-pullquote.element--showcase:after,.content--type-recipe .element-pullquote.element--showcase:after,.content--type-guardianview .element-pullquote.element--showcase:after,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase:after,.content--type-interview .element-pullquote.element--showcase:after,.content--type-live .element-pullquote.element--showcase:after,.content--type-matchreport .element-pullquote.element--showcase:after,.content--type-media .element-pullquote.element--showcase:after,.content--type-review .element-pullquote.element--showcase:after,.content--type-quiz .element-pullquote.element--showcase:after{border-radius:0 0 1.5625rem}@media (min-width: 71.25em){.content--liveblog .element-pullquote.element--showcase:after,.content--media .element-pullquote.element--showcase:after,.content--type-analysis .element-pullquote.element--showcase:after,.content--type-article .element-pullquote.element--showcase:after,.content--type-comment .element-pullquote.element--showcase:after,.content--type-feature .element-pullquote.element--showcase:after,.content--type-recipe .element-pullquote.element--showcase:after,.content--type-guardianview .element-pullquote.element--showcase:after,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase:after,.content--type-interview .element-pullquote.element--showcase:after,.content--type-live .element-pullquote.element--showcase:after,.content--type-matchreport .element-pullquote.element--showcase:after,.content--type-media .element-pullquote.element--showcase:after,.content--type-review .element-pullquote.element--showcase:after,.content--type-quiz .element-pullquote.element--showcase:after{left:8.125rem}}.content--liveblog .element-pullquote.element--showcase .pullquote-cite,.content--liveblog .element-pullquote.element--showcase .pullquote-paragraph,.content--media .element-pullquote.element--showcase .pullquote-cite,.content--media .element-pullquote.element--showcase .pullquote-paragraph,.content--type-analysis .element-pullquote.element--showcase .pullquote-cite,.content--type-analysis .element-pullquote.element--showcase .pullquote-paragraph,.content--type-article .element-pullquote.element--showcase .pullquote-cite,.content--type-article .element-pullquote.element--showcase .pullquote-paragraph,.content--type-comment .element-pullquote.element--showcase .pullquote-cite,.content--type-comment .element-pullquote.element--showcase .pullquote-paragraph,.content--type-feature .element-pullquote.element--showcase .pullquote-cite,.content--type-feature .element-pullquote.element--showcase .pullquote-paragraph,.content--type-recipe .element-pullquote.element--showcase .pullquote-cite,.content--type-recipe .element-pullquote.element--showcase .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--showcase .pullquote-cite,.content--type-guardianview .element-pullquote.element--showcase .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .pullquote-paragraph,.content--type-interview .element-pullquote.element--showcase .pullquote-cite,.content--type-interview .element-pullquote.element--showcase .pullquote-paragraph,.content--type-live .element-pullquote.element--showcase .pullquote-cite,.content--type-live .element-pullquote.element--showcase .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--showcase .pullquote-cite,.content--type-matchreport .element-pullquote.element--showcase .pullquote-paragraph,.content--type-media .element-pullquote.element--showcase .pullquote-cite,.content--type-media .element-pullquote.element--showcase .pullquote-paragraph,.content--type-review .element-pullquote.element--showcase .pullquote-cite,.content--type-review .element-pullquote.element--showcase .pullquote-paragraph,.content--type-quiz .element-pullquote.element--showcase .pullquote-cite,.content--type-quiz .element-pullquote.element--showcase .pullquote-paragraph{font-size:1.5rem;line-height:1.6875rem}@media (min-width: 41.25em){.content--liveblog .element-pullquote.element--showcase .pullquote-cite,.content--liveblog .element-pullquote.element--showcase .pullquote-paragraph,.content--media .element-pullquote.element--showcase .pullquote-cite,.content--media .element-pullquote.element--showcase .pullquote-paragraph,.content--type-analysis .element-pullquote.element--showcase .pullquote-cite,.content--type-analysis .element-pullquote.element--showcase .pullquote-paragraph,.content--type-article .element-pullquote.element--showcase .pullquote-cite,.content--type-article .element-pullquote.element--showcase .pullquote-paragraph,.content--type-comment .element-pullquote.element--showcase .pullquote-cite,.content--type-comment .element-pullquote.element--showcase .pullquote-paragraph,.content--type-feature .element-pullquote.element--showcase .pullquote-cite,.content--type-feature .element-pullquote.element--showcase .pullquote-paragraph,.content--type-recipe .element-pullquote.element--showcase .pullquote-cite,.content--type-recipe .element-pullquote.element--showcase .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--showcase .pullquote-cite,.content--type-guardianview .element-pullquote.element--showcase .pullquote-paragraph,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .pullquote-cite,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .pullquote-paragraph,.content--type-interview .element-pullquote.element--showcase .pullquote-cite,.content--type-interview .element-pullquote.element--showcase .pullquote-paragraph,.content--type-live .element-pullquote.element--showcase .pullquote-cite,.content--type-live .element-pullquote.element--showcase .pullquote-paragraph,.content--type-matchreport .element-pullquote.element--showcase .pullquote-cite,.content--type-matchreport .element-pullquote.element--showcase .pullquote-paragraph,.content--type-media .element-pullquote.element--showcase .pullquote-cite,.content--type-media .element-pullquote.element--showcase .pullquote-paragraph,.content--type-review .element-pullquote.element--showcase .pullquote-cite,.content--type-review .element-pullquote.element--showcase .pullquote-paragraph,.content--type-quiz .element-pullquote.element--showcase .pullquote-cite,.content--type-quiz .element-pullquote.element--showcase .pullquote-paragraph{font-size:1.75rem;line-height:2rem}}.content--liveblog .element-pullquote.element--showcase .inline-garnett-quote,.content--media .element-pullquote.element--showcase .inline-garnett-quote,.content--type-analysis .element-pullquote.element--showcase .inline-garnett-quote,.content--type-article .element-pullquote.element--showcase .inline-garnett-quote,.content--type-comment .element-pullquote.element--showcase .inline-garnett-quote,.content--type-feature .element-pullquote.element--showcase .inline-garnett-quote,.content--type-recipe .element-pullquote.element--showcase .inline-garnett-quote,.content--type-guardianview .element-pullquote.element--showcase .inline-garnett-quote,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .inline-garnett-quote,.content--type-interview .element-pullquote.element--showcase .inline-garnett-quote,.content--type-live .element-pullquote.element--showcase .inline-garnett-quote,.content--type-matchreport .element-pullquote.element--showcase .inline-garnett-quote,.content--type-media .element-pullquote.element--showcase .inline-garnett-quote,.content--type-review .element-pullquote.element--showcase .inline-garnett-quote,.content--type-quiz .element-pullquote.element--showcase .inline-garnett-quote{margin-right:0.9375rem}@media (min-width: 61.25em){.content--liveblog .element-pullquote.element--showcase .inline-garnett-quote,.content--media .element-pullquote.element--showcase .inline-garnett-quote,.content--type-analysis .element-pullquote.element--showcase .inline-garnett-quote,.content--type-article .element-pullquote.element--showcase .inline-garnett-quote,.content--type-comment .element-pullquote.element--showcase .inline-garnett-quote,.content--type-feature .element-pullquote.element--showcase .inline-garnett-quote,.content--type-recipe .element-pullquote.element--showcase .inline-garnett-quote,.content--type-guardianview .element-pullquote.element--showcase .inline-garnett-quote,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .inline-garnett-quote,.content--type-interview .element-pullquote.element--showcase .inline-garnett-quote,.content--type-live .element-pullquote.element--showcase .inline-garnett-quote,.content--type-matchreport .element-pullquote.element--showcase .inline-garnett-quote,.content--type-media .element-pullquote.element--showcase .inline-garnett-quote,.content--type-review .element-pullquote.element--showcase .inline-garnett-quote,.content--type-quiz .element-pullquote.element--showcase .inline-garnett-quote{margin-right:1.25rem}}.content--liveblog .element-pullquote.element--showcase .inline-garnett-quote svg,.content--media .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-analysis .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-article .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-comment .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-feature .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-recipe .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-guardianview .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-interview .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-live .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-matchreport .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-media .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-review .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-quiz .element-pullquote.element--showcase .inline-garnett-quote svg{width:0.875rem;top:-0.625rem}@media (min-width: 61.25em){.content--liveblog .element-pullquote.element--showcase .inline-garnett-quote svg,.content--media .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-analysis .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-article .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-comment .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-feature .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-recipe .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-guardianview .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-immersive:not(.content--minute-article) .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-interview .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-live .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-matchreport .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-media .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-review .element-pullquote.element--showcase .inline-garnett-quote svg,.content--type-quiz .element-pullquote.element--showcase .inline-garnett-quote svg{width:1rem}}@media (min-width: 71.25em){.content--liveblog .element-image.element--showcase .caption,.content--liveblog .element-image.element--supporting .caption,.content--media .element-image.element--showcase .caption,.content--media .element-image.element--supporting .caption,.content--type-analysis .element-image.element--showcase .caption,.content--type-analysis .element-image.element--supporting .caption,.content--type-article .element-image.element--showcase .caption,.content--type-article .element-image.element--supporting .caption,.content--type-comment .element-image.element--showcase .caption,.content--type-comment .element-image.element--supporting .caption,.content--type-feature .element-image.element--showcase .caption,.content--type-feature .element-image.element--supporting .caption,.content--type-recipe .element-image.element--showcase .caption,.content--type-recipe .element-image.element--supporting .caption,.content--type-guardianview .element-image.element--showcase .caption,.content--type-guardianview .element-image.element--supporting .caption,.content--type-immersive:not(.content--minute-article) .element-image.element--showcase .caption,.content--type-immersive:not(.content--minute-article) .element-image.element--supporting .caption,.content--type-interview .element-image.element--showcase .caption,.content--type-interview .element-image.element--supporting .caption,.content--type-live .element-image.element--showcase .caption,.content--type-live .element-image.element--supporting .caption,.content--type-matchreport .element-image.element--showcase .caption,.content--type-matchreport .element-image.element--supporting .caption,.content--type-media .element-image.element--showcase .caption,.content--type-media .element-image.element--supporting .caption,.content--type-review .element-image.element--showcase .caption,.content--type-review .element-image.element--supporting .caption,.content--type-quiz .element-image.element--showcase .caption,.content--type-quiz .element-image.element--supporting .caption{float:left;width:8.75rem}}@media (min-width: 81.25em){.content--liveblog .element-image.element--showcase .caption,.content--liveblog .element-image.element--supporting .caption,.content--media .element-image.element--showcase .caption,.content--media .element-image.element--supporting .caption,.content--type-analysis .element-image.element--showcase .caption,.content--type-analysis .element-image.element--supporting .caption,.content--type-article .element-image.element--showcase .caption,.content--type-article .element-image.element--supporting .caption,.content--type-comment .element-image.element--showcase .caption,.content--type-comment .element-image.element--supporting .caption,.content--type-feature .element-image.element--showcase .caption,.content--type-feature .element-image.element--supporting .caption,.content--type-recipe .element-image.element--showcase .caption,.content--type-recipe .element-image.element--supporting .caption,.content--type-guardianview .element-image.element--showcase .caption,.content--type-guardianview .element-image.element--supporting .caption,.content--type-immersive:not(.content--minute-article) .element-image.element--showcase .caption,.content--type-immersive:not(.content--minute-article) .element-image.element--supporting .caption,.content--type-interview .element-image.element--showcase .caption,.content--type-interview .element-image.element--supporting .caption,.content--type-live .element-image.element--showcase .caption,.content--type-live .element-image.element--supporting .caption,.content--type-matchreport .element-image.element--showcase .caption,.content--type-matchreport .element-image.element--supporting .caption,.content--type-media .element-image.element--showcase .caption,.content--type-media .element-image.element--supporting .caption,.content--type-review .element-image.element--showcase .caption,.content--type-review .element-image.element--supporting .caption,.content--type-quiz .element-image.element--showcase .caption,.content--type-quiz .element-image.element--supporting .caption{width:13.75rem}}@media (min-width: 71.25em){.content--liveblog .element-image.element--showcase,.content--media .element-image.element--showcase,.content--type-analysis .element-image.element--showcase,.content--type-article .element-image.element--showcase,.content--type-comment .element-image.element--showcase,.content--type-feature .element-image.element--showcase,.content--type-recipe .element-image.element--showcase,.content--type-guardianview .element-image.element--showcase,.content--type-immersive:not(.content--minute-article) .element-image.element--showcase,.content--type-interview .element-image.element--showcase,.content--type-live .element-image.element--showcase,.content--type-matchreport .element-image.element--showcase,.content--type-media .element-image.element--showcase,.content--type-review .element-image.element--showcase,.content--type-quiz .element-image.element--showcase{margin-bottom:2.25rem}}.content--liveblog .quoted .inline-garnett-quote,.content--media .quoted .inline-garnett-quote,.content--type-analysis .quoted .inline-garnett-quote,.content--type-article .quoted .inline-garnett-quote,.content--type-comment .quoted .inline-garnett-quote,.content--type-feature .quoted .inline-garnett-quote,.content--type-recipe .quoted .inline-garnett-quote,.content--type-guardianview .quoted .inline-garnett-quote,.content--type-immersive:not(.content--minute-article) .quoted .inline-garnett-quote,.content--type-interview .quoted .inline-garnett-quote,.content--type-live .quoted .inline-garnett-quote,.content--type-matchreport .quoted .inline-garnett-quote,.content--type-media .quoted .inline-garnett-quote,.content--type-review .quoted .inline-garnett-quote,.content--type-quiz .quoted .inline-garnett-quote{position:absolute}.content--liveblog .quoted .inline-garnett-quote__svg,.content--media .quoted .inline-garnett-quote__svg,.content--type-analysis .quoted .inline-garnett-quote__svg,.content--type-article .quoted .inline-garnett-quote__svg,.content--type-comment .quoted .inline-garnett-quote__svg,.content--type-feature .quoted .inline-garnett-quote__svg,.content--type-recipe .quoted .inline-garnett-quote__svg,.content--type-guardianview .quoted .inline-garnett-quote__svg,.content--type-immersive:not(.content--minute-article) .quoted .inline-garnett-quote__svg,.content--type-interview .quoted .inline-garnett-quote__svg,.content--type-live .quoted .inline-garnett-quote__svg,.content--type-matchreport .quoted .inline-garnett-quote__svg,.content--type-media .quoted .inline-garnett-quote__svg,.content--type-review .quoted .inline-garnett-quote__svg,.content--type-quiz .quoted .inline-garnett-quote__svg{width:2.1875rem;height:1.5625rem;-webkit-transform:scale(0.4);transform:scale(0.4);-webkit-transform-origin:top left;transform-origin:top left}.content--type-matchreport:not(.content--liveblog) .block-time.published-time,.content--type-article:not(.content--liveblog) .block-time.published-time{position:relative;padding:0.375rem 0 0;line-height:1}.content--type-feature .content__meta-container,.content--type-recipe .content__meta-container{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzOTUuOSIgaGVpZ2h0PSIyMy45IiB2aWV3Qm94PSI1OS4zIDEzNi4xIDM5NS45IDIzLjkiPjxwYXRoIGZpbGw9IiNDMkMxQzEiIGQ9Ik01OS4zIDE0Mi40YzMuNSAwIDUuMS0xLjQgNi43LTIuNSAxLjQtMS4xIDIuOS0yLjMgNS43LTIuMyAyLjkgMCA0LjIgMS4yIDUuNiAyLjMgMS42IDEgMy4zIDIuNSA2LjcgMi41YTEwIDEwIDAgMCAwIDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjNzNC4yIDEuMiA1LjcgMi4zYzEuNiAxIDMuMSAyLjUgNi42IDIuNSAzLjQgMCA1LTEuNCA2LjYtMi41czIuOC0yLjMgNS43LTIuM2MyLjcgMCA0LjEgMS4yIDUuNSAyLjMgMS42IDEgMy40IDIuNSA2LjcgMi41IDMuNSAwIDUuMi0xLjQgNi43LTIuNSAxLjYtMS4xIDIuOC0yLjMgNS43LTIuM3M0LjMgMS4yIDUuNyAyLjNjMS42IDEgMy4yIDIuNSA2LjcgMi41czUtMS40IDYuNy0yLjUgMi44LTIuMyA1LjctMi4zYzIuOCAwIDQuMSAxLjIgNS43IDIuM3MzLjIgMi41IDYuNyAyLjUgNS0xLjQgNi42LTIuNWMxLjUtMS4xIDIuOS0yLjMgNS42LTIuMyAyLjkgMCA0LjMgMS4yIDUuNyAyLjMgMiAxIDMuNSAyLjUgNi44IDIuNXM1LjEtMS40IDYuNy0yLjVjMS42LTEuMSAyLjktMi4zIDUuNy0yLjNzNC4yIDEuMiA1LjggMi4zYzEuNSAxIDMuMSAyLjUgNi42IDIuNSAzLjUgMCA1LjEtMS40IDYuNy0yLjUgMS40LTEuMSAyLjktMi4zIDUuNi0yLjMgMi43IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMyAyLjUgNi42IDIuNWguN2MzLjUgMCA1LjEtMS40IDYuNy0yLjUgMS40LTEuMSAyLjktMi4zIDUuNi0yLjMgMi44IDAgNC4zIDEuMiA1LjcgMi4zIDEuNiAxIDMuMyAyLjUgNi43IDIuNXM1LTEuNCA2LjYtMi41YzEuNi0xLjEgMi45LTIuMyA1LjgtMi4zIDIuOCAwIDQgMS4yIDUuNyAyLjMgMS42IDEgMy4xIDIuNSA2LjYgMi41czUuMS0xLjQgNi43LTIuNWMxLjQtMS4xIDIuOS0yLjMgNS42LTIuMyAyLjcgMCA0LjMgMS4yIDUuNyAyLjMgMS42IDEgMy4zIDIuNSA2LjcgMi41czUtMS40IDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjMgMi44IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMiAyLjUgNi42IDIuNXM1LjEtMS40IDYuNy0yLjVjMS40LTEuMSAyLjktMi4zIDUuNy0yLjNzNC4yIDEuMiA1LjYgMi4zYzEuNiAxIDMuMyAyLjUgNi43IDIuNXM1LjItMS40IDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjMgMi44IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMiAyLjUgNi43IDIuNSAzLjMgMCA0LjktMS40IDYuNS0yLjUgMS42LTEuMSAzLTIuMyA1LjgtMi4zIDIuNyAwIDQuMiAxLjIgNS44IDIuMyAxLjUgMSAzIDIuNSA2LjMgMi41IDMuNSAwIDUuMy0xLjQgNi43LTIuNSAxLjYtMS4xIDIuOC0yLjMgNS43LTIuMyAyLjkgMCA0LjYgMS4yIDUuOSAyLjMgMS42IDEgMy4yIDIuNSA2LjcgMi41di0xLjZjLTIuOSAwLTQuMy0xLjEtNS44LTIuMi0xLjYtMS4xLTMuMS0yLjUtNi42LTIuNXMtNS4xIDEuNC02LjcgMi41Yy0xLjQgMS4xLTIuOSAyLjItNS43IDIuMnMtNC4yLTEuMS01LjYtMi4yYy0xLjYtMS4xLTMuMy0yLjUtNi43LTIuNWExMCAxMCAwIDAgMC02LjYgMi41Yy0xLjYgMS4xLTIuOSAyLjItNS44IDIuMnMtNC4yLTEuMS01LjctMi4yYy0xLjYtMS4xLTMuMS0yLjUtNi42LTIuNS0zLjQgMC01IDEuNC02LjYgMi41LTEuNSAxLjEtMi44IDIuMi01LjcgMi4yLTIuNyAwLTQuMS0xLjEtNS41LTIuMi0xLjYtMS4xLTMuNC0yLjUtNi43LTIuNS0zLjUgMC01LjIgMS40LTYuNyAyLjUtMS42IDEuMS0yLjggMi4yLTUuNyAyLjJzLTQuMy0xLjEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNy0yLjVzLTUgMS40LTYuNyAyLjUtMi44IDIuMi01LjcgMi4yLTQuMS0xLjEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNy0yLjVzLTUgMS40LTYuNiAyLjVjLTEuNSAxLjEtMi45IDIuMi01LjYgMi4yYTguMSA4LjEgMCAwIDEtNS43LTIuMmMtMi0xLjEtMy41LTIuNS02LjgtMi41cy01LjEgMS40LTYuNyAyLjVjLTEuNiAxLjEtMi45IDIuMi01LjcgMi4ycy00LjItMS4xLTUuOC0yLjItMy4xLTIuNS02LjYtMi41Yy0zLjUgMC01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguNiA4LjYgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVoLS42Yy0zLjUgMC01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVzLTUgMS40LTYuNiAyLjVjLTEuNiAxLjEtMi45IDIuMi01LjggMi4yLTIuOCAwLTQtMS4xLTUuNy0yLjItMS42LTEuMS0zLjItMi41LTYuNi0yLjVzLTUuMSAxLjQtNi43IDIuNWE4LjMgOC4zIDAgMCAxLTUuNiAyLjIgOC42IDguNiAwIDAgMS01LjctMi4yYy0xLjYtMS4xLTMuMy0yLjUtNi43LTIuNS0zLjMgMC01IDEuNC02LjYgMi41LTEuNiAxLjEtMi45IDIuMi01LjggMi4yYTguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNi0yLjVzLTUuMSAxLjQtNi43IDIuNWMtMS40IDEuMS0yLjkgMi4yLTUuNyAyLjJzLTQuMi0xLjEtNS42LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVhMTAgMTAgMCAwIDAtNi42IDIuNWMtMS42IDEuMS0yLjkgMi4yLTUuOCAyLjJhOC4zIDguMyAwIDAgMS01LjctMi4yYy0xLjYtMS4xLTMuMi0yLjUtNi42LTIuNS0zLjQgMC01IDEuNC02LjYgMi41LTEuNiAxLjEtMyAyLjItNS44IDIuMi0yLjcgMC00LjItMS4xLTUuOC0yLjItMS41LTEuMS0zLTIuNS02LjMtMi41YTkuNyA5LjcgMCAwIDAtNi43IDIuNWMtMS42IDEuMS0yLjggMi4yLTUuNyAyLjJsLS4yIDEuNnoiLz48cGF0aCBmaWxsPSIjQzJDMUMxIiBkPSJNNTkuMyAxNDguMmMzLjUgMCA1LjEtMS40IDYuNy0yLjVhOC4zIDguMyAwIDAgMSA1LjctMi4yYzIuOSAwIDQuMiAxIDUuNiAyLjIgMS42IDEuMSAzLjMgMi41IDYuNyAyLjVhMTAgMTAgMCAwIDAgNi42LTIuNWMxLjYtMS4xIDIuOS0yLjIgNS44LTIuMnM0LjIgMSA1LjcgMi4yYzEuNiAxLjEgMy4xIDIuNSA2LjYgMi41IDMuNCAwIDUtMS40IDYuNi0yLjVzMi44LTIuMiA1LjctMi4yYzIuNyAwIDQuMSAxIDUuNSAyLjIgMS42IDEuMSAzLjQgMi41IDYuNyAyLjUgMy41IDAgNS4yLTEuNCA2LjctMi41IDEuNi0xLjEgMi44LTIuMiA1LjctMi4yczQuMyAxIDUuNyAyLjJjMS42IDEuMSAzLjIgMi41IDYuNyAyLjVzNS0xLjQgNi43LTIuNSAyLjgtMi4yIDUuNy0yLjJjMi44IDAgNC4xIDEgNS43IDIuMnMzLjIgMi41IDYuNyAyLjUgNS0xLjQgNi42LTIuNWMxLjUtMS4xIDIuOS0yLjIgNS42LTIuMiAyLjkgMCA0LjMgMSA1LjcgMi4yIDIgMS4xIDMuNSAyLjUgNi44IDIuNXM1LjEtMS40IDYuNy0yLjVjMS42LTEuMSAyLjktMi4yIDUuNy0yLjJzNC4yIDEgNS44IDIuMmMxLjUgMS4xIDMuMSAyLjUgNi42IDIuNSAzLjUgMCA1LjEtMS40IDYuNy0yLjVhOC4zIDguMyAwIDAgMSA1LjYtMi4yYzIuNyAwIDQuMiAxIDUuNyAyLjIgMS42IDEuMSAzLjMgMi41IDYuNiAyLjVoLjdjMy41IDAgNS4xLTEuNCA2LjctMi41YTguMyA4LjMgMCAwIDEgNS42LTIuMmMyLjggMCA0LjMgMSA1LjcgMi4yIDEuNiAxLjEgMy4zIDIuNSA2LjcgMi41czUtMS40IDYuNi0yLjVjMS42LTEuMSAyLjktMi4yIDUuOC0yLjIgMi44IDAgNCAxIDUuNyAyLjIgMS42IDEuMSAzLjEgMi41IDYuNiAyLjVzNS4xLTEuNCA2LjctMi41YTguMyA4LjMgMCAwIDEgNS42LTIuMiA4IDggMCAwIDEgNS43IDIuMmMxLjYgMS4xIDMuMyAyLjUgNi43IDIuNXM1LTEuNCA2LjYtMi41YzEuNi0xLjEgMi45LTIuMiA1LjgtMi4yYTggOCAwIDAgMSA1LjcgMi4yYzEuNiAxLjEgMy4yIDIuNSA2LjYgMi41czUuMS0xLjQgNi43LTIuNWMxLjQtMS4xIDIuOS0yLjIgNS43LTIuMnM0LjIgMSA1LjYgMi4yYzEuNiAxLjEgMy4zIDIuNSA2LjcgMi41czUuMi0xLjQgNi42LTIuNWMxLjYtMS4xIDIuOS0yLjIgNS44LTIuMmE4IDggMCAwIDEgNS43IDIuMmMxLjYgMS4xIDMuMiAyLjUgNi43IDIuNSAzLjMgMCA0LjktMS40IDYuNS0yLjUgMS42LTEuMSAzLTIuMiA1LjgtMi4yIDIuNyAwIDQuMiAxIDUuOCAyLjIgMS41IDEuMSAzIDIuNSA2LjMgMi41IDMuNSAwIDUuMy0xLjQgNi43LTIuNSAxLjYtMS4xIDIuOC0yLjIgNS43LTIuMmE4IDggMCAwIDEgNS45IDIuMmMxLjYgMS4xIDMuMiAyLjUgNi43IDIuNXYtMS42Yy0yLjkgMC00LjMtMS01LjgtMi4yLTEuNi0xLTMuMS0yLjUtNi42LTIuNXMtNS4xIDEuNC02LjcgMi41Yy0xLjQgMS4xLTIuOSAyLjItNS43IDIuMnMtNC4yLTEtNS42LTIuMmMtMS42LTEtMy4zLTIuNS02LjctMi41YTEwIDEwIDAgMCAwLTYuNiAyLjVjLTEuNiAxLjEtMi45IDIuMi01LjggMi4ycy00LjItMS01LjctMi4yYy0xLjYtMS0zLjEtMi41LTYuNi0yLjUtMy40IDAtNSAxLjQtNi42IDIuNS0xLjUgMS4xLTIuOCAyLjItNS43IDIuMi0yLjcgMC00LjEtMS01LjUtMi4yLTEuNi0xLTMuNC0yLjUtNi43LTIuNS0zLjUgMC01LjIgMS40LTYuNyAyLjUtMS42IDEuMS0yLjggMi4yLTUuNyAyLjJzLTQuMy0xLTUuNy0yLjJjLTEuNi0xLTMuMi0yLjUtNi43LTIuNXMtNSAxLjQtNi43IDIuNS0yLjggMi4yLTUuNyAyLjItNC4xLTEtNS43LTIuMmMtMS42LTEtMy4yLTIuNS02LjctMi41cy01IDEuNC02LjYgMi41Yy0xLjUgMS4xLTIuOSAyLjItNS42IDIuMi0yLjkgMC00LjMtMS01LjctMi4yLTItMS0zLjUtMi41LTYuOC0yLjVzLTUuMSAxLjQtNi43IDIuNWMtMS42IDEuMS0yLjkgMi4yLTUuNyAyLjJzLTQuMi0xLTUuOC0yLjItMy4xLTIuNS02LjYtMi41Yy0zLjUgMC01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguNiA4LjYgMCAwIDEtNS43LTIuMmMtMS42LTEtMy4zLTIuNS02LjctMi41aC0uNmMtMy41IDAtNS4xIDEuNC02LjcgMi41YTguMyA4LjMgMCAwIDEtNS42IDIuMiA4LjMgOC4zIDAgMCAxLTUuNy0yLjJjLTEuNi0xLTMuMy0yLjUtNi43LTIuNXMtNSAxLjQtNi42IDIuNWMtMS42IDEuMS0yLjkgMi4yLTUuOCAyLjItMi44IDAtNC0xLTUuNy0yLjItMS42LTEtMy4yLTIuNS02LjYtMi41cy01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguNiA4LjYgMCAwIDEtNS43LTIuMmMtMS42LTEtMy4zLTIuNS02LjctMi41LTMuMyAwLTUgMS40LTYuNiAyLjUtMS42IDEuMS0yLjkgMi4yLTUuOCAyLjJhOC4zIDguMyAwIDAgMS01LjctMi4yYy0xLjYtMS0zLjItMi41LTYuNi0yLjVzLTUuMSAxLjQtNi43IDIuNWMtMS40IDEuMS0yLjkgMi4yLTUuNyAyLjJzLTQuMi0xLTUuNi0yLjJjLTEuNi0xLTMuMy0yLjUtNi43LTIuNWExMCAxMCAwIDAgMC02LjYgMi41Yy0xLjYgMS4xLTIuOSAyLjItNS44IDIuMmE4LjMgOC4zIDAgMCAxLTUuNy0yLjJjLTEuNi0xLTMuMi0yLjUtNi42LTIuNS0zLjQgMC01IDEuNC02LjYgMi41LTEuNiAxLjEtMyAyLjItNS44IDIuMi0yLjcgMC00LjItMS01LjgtMi4yLTEuNS0xLTMtMi41LTYuMy0yLjVhOS43IDkuNyAwIDAgMC02LjcgMi41Yy0xLjYgMS4xLTIuOCAyLjItNS43IDIuMmwtLjIgMS42eiIvPjxwYXRoIGZpbGw9IiNDMkMxQzEiIGQ9Ik01OS4zIDE1NGMzLjUgMCA1LjEtMS40IDYuNy0yLjUgMS40LTEgMi45LTIuMiA1LjctMi4yIDIuOSAwIDQuMiAxLjEgNS42IDIuMiAxLjYgMS4xIDMuMyAyLjYgNi43IDIuNmExMCAxMCAwIDAgMCA2LjYtMi42YzEuNi0xIDIuOS0yLjIgNS44LTIuMnM0LjIgMS4xIDUuNyAyLjJjMS42IDEuMSAzLjEgMi42IDYuNiAyLjYgMy40IDAgNS0xLjUgNi42LTIuNnMyLjgtMi4yIDUuNy0yLjJjMi43IDAgNC4xIDEuMSA1LjUgMi4yIDEuNiAxLjEgMy40IDIuNiA2LjcgMi42IDMuNSAwIDUuMi0xLjUgNi43LTIuNiAxLjYtMSAyLjgtMi4yIDUuNy0yLjJzNC4zIDEuMSA1LjcgMi4yYzEuNiAxLjEgMy4yIDIuNiA2LjcgMi42czUtMS41IDYuNy0yLjYgMi44LTIuMiA1LjctMi4yYzIuOCAwIDQuMSAxLjEgNS43IDIuMnMzLjIgMi42IDYuNyAyLjYgNS0xLjUgNi42LTIuNmMxLjUtMSAyLjktMi4yIDUuNi0yLjIgMi45IDAgNC4zIDEuMSA1LjcgMi4yIDIgMS4xIDMuNSAyLjYgNi44IDIuNnM1LjEtMS41IDYuNy0yLjZjMS42LTEgMi45LTIuMiA1LjctMi4yczQuMiAxLjEgNS44IDIuMmMxLjUgMS4xIDMuMSAyLjYgNi42IDIuNiAzLjUgMCA1LjEtMS41IDYuNy0yLjYgMS40LTEgMi45LTIuMiA1LjYtMi4yIDIuNyAwIDQuMiAxLjEgNS43IDIuMiAxLjYgMS4xIDMuMyAyLjYgNi42IDIuNmguN2MzLjUgMCA1LjEtMS41IDYuNy0yLjYgMS40LTEgMi45LTIuMiA1LjYtMi4yIDIuOCAwIDQuMyAxLjEgNS43IDIuMiAxLjYgMS4xIDMuMyAyLjYgNi43IDIuNnM1LTEuNSA2LjYtMi42YzEuNi0xIDIuOS0yLjIgNS44LTIuMiAyLjggMCA0IDEuMSA1LjcgMi4yIDEuNiAxLjEgMy4xIDIuNiA2LjYgMi42czUuMS0xLjUgNi43LTIuNmMxLjQtMSAyLjktMi4yIDUuNi0yLjIgMi43IDAgNC4zIDEuMSA1LjcgMi4yIDEuNiAxLjEgMy4zIDIuNiA2LjcgMi42czUtMS41IDYuNi0yLjZjMS42LTEgMi45LTIuMiA1LjgtMi4yIDIuOCAwIDQuMiAxLjEgNS43IDIuMiAxLjYgMS4xIDMuMiAyLjYgNi42IDIuNnM1LjEtMS41IDYuNy0yLjZjMS40LTEgMi45LTIuMiA1LjctMi4yczQuMiAxLjEgNS42IDIuMmMxLjYgMS4xIDMuMyAyLjYgNi43IDIuNnM1LjItMS41IDYuNi0yLjZjMS42LTEgMi45LTIuMiA1LjgtMi4yIDIuOCAwIDQuMiAxLjEgNS43IDIuMiAxLjYgMS4xIDMuMiAyLjYgNi43IDIuNiAzLjMgMCA0LjktMS41IDYuNS0yLjYgMS42LTEgMy0yLjIgNS44LTIuMiAyLjcgMCA0LjIgMS4xIDUuOCAyLjIgMS41IDEuMSAzIDIuNiA2LjMgMi42IDMuNSAwIDUuMy0xLjUgNi43LTIuNiAxLjYtMSAyLjgtMi4yIDUuNy0yLjIgMi45IDAgNC42IDEuMSA1LjkgMi4yIDEuNiAxLjEgMy4yIDIuNiA2LjcgMi42di0xLjZjLTIuOSAwLTQuMy0xLjEtNS44LTIuMi0xLjYtMS4yLTMuMS0yLjYtNi42LTIuNnMtNS4xIDEuNC02LjcgMi42Yy0xLjQgMS0yLjkgMi4yLTUuNyAyLjJzLTQuMi0xLjEtNS42LTIuMmMtMS42LTEuMi0zLjMtMi42LTYuNy0yLjZhMTAgMTAgMCAwIDAtNi42IDIuNmMtMS42IDEtMi45IDIuMi01LjggMi4ycy00LjItMS4xLTUuNy0yLjJjLTEuNi0xLjItMy4xLTIuNi02LjYtMi42LTMuNCAwLTUgMS40LTYuNiAyLjYtMS41IDEtMi44IDIuMi01LjcgMi4yLTIuNyAwLTQuMS0xLjEtNS41LTIuMi0xLjYtMS4yLTMuNC0yLjYtNi43LTIuNi0zLjUgMC01LjIgMS40LTYuNyAyLjYtMS42IDEtMi44IDIuMi01LjcgMi4ycy00LjMtMS4xLTUuNy0yLjJjLTEuNi0xLjItMy4yLTIuNi02LjctMi42cy01IDEuNC02LjcgMi42LTIuOCAyLjItNS43IDIuMi00LjEtMS4xLTUuNy0yLjJjLTEuNi0xLjItMy4yLTIuNi02LjctMi42cy01IDEuNC02LjYgMi42Yy0xLjUgMS0yLjkgMi4yLTUuNiAyLjJhOC4xIDguMSAwIDAgMS01LjctMi4yYy0yLTEuMi0zLjUtMi42LTYuOC0yLjZzLTUuMSAxLjQtNi43IDIuNmMtMS42IDEtMi45IDIuMi01LjcgMi4ycy00LjItMS4xLTUuOC0yLjItMy4xLTIuNi02LjYtMi42Yy0zLjUgMC01LjEgMS40LTYuNyAyLjYtMS40IDEtMi45IDIuMi01LjYgMi4yYTguNiA4LjYgMCAwIDEtNS43LTIuMmMtMS42LTEuMi0zLjMtMi42LTYuNy0yLjZoLS42Yy0zLjUgMC01LjEgMS40LTYuNyAyLjYtMS40IDEtMi45IDIuMi01LjYgMi4yYTguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMi0zLjMtMi42LTYuNy0yLjZzLTUgMS40LTYuNiAyLjZjLTEuNiAxLTIuOSAyLjItNS44IDIuMi0yLjggMC00LTEuMS01LjctMi4yLTEuNi0xLjItMy4yLTIuNi02LjYtMi42cy01LjEgMS40LTYuNyAyLjZjLTEuNCAxLTIuOSAyLjItNS42IDIuMmE4LjYgOC42IDAgMCAxLTUuNy0yLjJjLTEuNi0xLjItMy4zLTIuNi02LjctMi42LTMuMyAwLTUgMS40LTYuNiAyLjYtMS42IDEtMi45IDIuMi01LjggMi4yYTguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMi0zLjItMi42LTYuNi0yLjZzLTUuMSAxLjQtNi43IDIuNmMtMS40IDEtMi45IDIuMi01LjcgMi4ycy00LjItMS4xLTUuNi0yLjJjLTEuNi0xLjItMy4zLTIuNi02LjctMi42YTEwIDEwIDAgMCAwLTYuNiAyLjZjLTEuNiAxLTIuOSAyLjItNS44IDIuMmE4LjMgOC4zIDAgMCAxLTUuNy0yLjJjLTEuNi0xLjItMy4yLTIuNi02LjYtMi42LTMuNCAwLTUgMS40LTYuNiAyLjYtMS42IDEtMyAyLjItNS44IDIuMi0yLjcgMC00LjItMS4xLTUuOC0yLjItMS41LTEuMi0zLTIuNi02LjMtMi42YTkuMyA5LjMgMCAwIDAtNi43IDIuNmMtMS42IDEtMi44IDIuMi01LjcgMi4ybC0uMiAxLjZ6Ii8+PHBhdGggZmlsbD0iI0MyQzFDMSIgZD0iTTU5LjMgMTYwYzMuNSAwIDUuMS0xLjUgNi43LTIuNiAxLjQtMS4xIDIuOS0yLjMgNS43LTIuMyAyLjkgMCA0LjIgMS4yIDUuNiAyLjMgMS42IDEgMy4zIDIuNSA2LjcgMi41YTEwIDEwIDAgMCAwIDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjNzNC4yIDEuMiA1LjcgMi4zYzEuNiAxIDMuMSAyLjUgNi42IDIuNSAzLjQgMCA1LTEuNCA2LjYtMi41czIuOC0yLjMgNS43LTIuM2MyLjcgMCA0LjEgMS4yIDUuNSAyLjMgMS42IDEgMy40IDIuNSA2LjcgMi41IDMuNSAwIDUuMi0xLjQgNi43LTIuNSAxLjYtMS4xIDIuOC0yLjMgNS43LTIuM3M0LjMgMS4yIDUuNyAyLjNjMS42IDEgMy4yIDIuNSA2LjcgMi41czUtMS40IDYuNy0yLjUgMi44LTIuMyA1LjctMi4zYzIuOCAwIDQuMSAxLjIgNS43IDIuM3MzLjIgMi41IDYuNyAyLjUgNS0xLjQgNi42LTIuNWMxLjUtMS4xIDIuOS0yLjMgNS42LTIuMyAyLjkgMCA0LjMgMS4yIDUuNyAyLjMgMiAxIDMuNSAyLjUgNi44IDIuNXM1LjEtMS40IDYuNy0yLjVjMS42LTEuMSAyLjktMi4zIDUuNy0yLjNzNC4yIDEuMiA1LjggMi4zYzEuNSAxIDMuMSAyLjUgNi42IDIuNSAzLjUgMCA1LjEtMS40IDYuNy0yLjUgMS40LTEuMSAyLjktMi4zIDUuNi0yLjMgMi43IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMyAyLjUgNi42IDIuNWguN2MzLjUgMCA1LjEtMS40IDYuNy0yLjUgMS40LTEuMSAyLjktMi4zIDUuNi0yLjMgMi44IDAgNC4zIDEuMiA1LjcgMi4zIDEuNiAxIDMuMyAyLjUgNi43IDIuNXM1LTEuNCA2LjYtMi41YzEuNi0xLjEgMi45LTIuMyA1LjgtMi4zIDIuOCAwIDQgMS4yIDUuNyAyLjMgMS42IDEgMy4xIDIuNSA2LjYgMi41czUuMS0xLjQgNi43LTIuNWMxLjQtMS4xIDIuOS0yLjMgNS42LTIuMyAyLjcgMCA0LjMgMS4yIDUuNyAyLjMgMS42IDEgMy4zIDIuNSA2LjcgMi41czUtMS40IDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjMgMi44IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMiAyLjUgNi42IDIuNXM1LjEtMS40IDYuNy0yLjVjMS40LTEuMSAyLjktMi4zIDUuNy0yLjNzNC4yIDEuMiA1LjYgMi4zYzEuNiAxIDMuMyAyLjUgNi43IDIuNXM1LjItMS40IDYuNi0yLjVjMS42LTEuMSAyLjktMi4zIDUuOC0yLjMgMi44IDAgNC4yIDEuMiA1LjcgMi4zIDEuNiAxIDMuMiAyLjUgNi43IDIuNSAzLjMgMCA0LjktMS40IDYuNS0yLjUgMS42LTEuMSAzLTIuMyA1LjgtMi4zIDIuNyAwIDQuMiAxLjIgNS44IDIuMyAxLjUgMSAzIDIuNSA2LjMgMi41IDMuNSAwIDUuMy0xLjQgNi43LTIuNSAxLjYtMS4xIDIuOC0yLjMgNS43LTIuMyAyLjkgMCA0LjYgMS4yIDUuOSAyLjMgMS42IDEgMy4yIDIuNSA2LjcgMi41di0xLjZjLTIuOSAwLTQuMy0xLjEtNS44LTIuMi0xLjYtMS4xLTMuMS0yLjUtNi42LTIuNXMtNS4xIDEuNC02LjcgMi41Yy0xLjQgMS4xLTIuOSAyLjItNS43IDIuMnMtNC4yLTEuMS01LjYtMi4yYy0xLjYtMS4xLTMuMy0yLjUtNi43LTIuNWExMCAxMCAwIDAgMC02LjYgMi41Yy0xLjYgMS4xLTIuOSAyLjItNS44IDIuMnMtNC4yLTEuMS01LjctMi4yYy0xLjYtMS4xLTMuMS0yLjUtNi42LTIuNS0zLjQgMC01IDEuNC02LjYgMi41LTEuNSAxLjEtMi44IDIuMi01LjcgMi4yLTIuNyAwLTQuMS0xLjEtNS41LTIuMi0xLjYtMS4xLTMuNC0yLjUtNi43LTIuNS0zLjUgMC01LjIgMS40LTYuNyAyLjUtMS42IDEuMS0yLjggMi4yLTUuNyAyLjJzLTQuMy0xLjEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNy0yLjVzLTUgMS40LTYuNyAyLjUtMi44IDIuMi01LjcgMi4yLTQuMS0xLjEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNy0yLjVzLTUgMS40LTYuNiAyLjVjLTEuNSAxLjEtMi45IDIuMi01LjYgMi4yYTguMSA4LjEgMCAwIDEtNS43LTIuMmMtMi0xLjEtMy41LTIuNS02LjgtMi41cy01LjEgMS40LTYuNyAyLjVjLTEuNiAxLjEtMi45IDIuMi01LjcgMi4ycy00LjItMS4xLTUuOC0yLjItMy4xLTIuNS02LjYtMi41Yy0zLjUgMC01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguNiA4LjYgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVoLS42Yy0zLjUgMC01LjEgMS40LTYuNyAyLjVhOC4zIDguMyAwIDAgMS01LjYgMi4yIDguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVzLTUgMS40LTYuNiAyLjVjLTEuNiAxLjEtMi45IDIuMi01LjggMi4yLTIuOCAwLTQtMS4xLTUuNy0yLjItMS42LTEuMS0zLjItMi41LTYuNi0yLjVzLTUuMSAxLjQtNi43IDIuNWE4LjMgOC4zIDAgMCAxLTUuNiAyLjIgOC42IDguNiAwIDAgMS01LjctMi4yYy0xLjYtMS4xLTMuMy0yLjUtNi43LTIuNS0zLjMgMC01IDEuNC02LjYgMi41LTEuNiAxLjEtMi45IDIuMi01LjggMi4yYTguMyA4LjMgMCAwIDEtNS43LTIuMmMtMS42LTEuMS0zLjItMi41LTYuNi0yLjVzLTUuMSAxLjQtNi43IDIuNWMtMS40IDEuMS0yLjkgMi4yLTUuNyAyLjJzLTQuMi0xLjEtNS42LTIuMmMtMS42LTEuMS0zLjMtMi41LTYuNy0yLjVhMTAgMTAgMCAwIDAtNi42IDIuNWMtMS42IDEuMS0yLjkgMi4yLTUuOCAyLjJhOC4zIDguMyAwIDAgMS01LjctMi4yYy0xLjYtMS4xLTMuMi0yLjUtNi42LTIuNS0zLjQgMC01IDEuNC02LjYgMi41LTEuNiAxLjEtMyAyLjItNS44IDIuMi0yLjcgMC00LjItMS4xLTUuOC0yLjItMS41LTEuMS0zLTIuNS02LjMtMi41YTkuNyA5LjcgMCAwIDAtNi43IDIuNWMtMS42IDEuMS0yLjggMi4yLTUuNyAyLjJsLS4yIDEuNnoiLz48L3N2Zz4=");background-repeat:repeat-x;background-size:12.4375rem}.content--pillar-sport:not(.content--interactive):not(.content--type-comment):not(.content--media--audio) .content__meta-container:not(.gallery__meta-container),.content--pillar-sport.content--type-feature .content__meta-container:not(.gallery__meta-container){background-image:url("data:image/svg+xml,%3Csvg%20width%3D%229%22%20height%3D%2212%22%20viewBox%3D%220%200%209%2012%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%23DFDFDF%22%3E%3Ccircle%20cx%3D%221.5%22%20cy%3D%221.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%221.5%22%20cy%3D%224.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%221.5%22%20cy%3D%227.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%221.5%22%20cy%3D%2210.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%224.5%22%20cy%3D%221.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%224.5%22%20cy%3D%224.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%224.5%22%20cy%3D%227.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%224.5%22%20cy%3D%2210.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%227.5%22%20cy%3D%221.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%227.5%22%20cy%3D%224.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%227.5%22%20cy%3D%227.5%22%20r%3D%221%22/%3E%3Ccircle%20cx%3D%227.5%22%20cy%3D%2210.5%22%20r%3D%221%22/%3E%3C/g%3E%3C/svg%3E");background-repeat:repeat-x;background-size:0.625rem;background-position-x:0}.content--type-feature .content__headline,.content--type-interview .content__headline,.content--type-review .content__headline,.content--type-recipe .content__headline{font-weight:700}.content--type-feature .meta__image,.content--type-interview .meta__image,.content--type-review .meta__image,.content--type-recipe .meta__image{padding:0;margin:0;border:0;width:auto}@media (min-width: 30em){.content--type-feature .meta__image,.content--type-interview .meta__image,.content--type-review .meta__image,.content--type-recipe .meta__image{margin-right:-0.625rem}}@media (min-width: 41.25em){.content--type-feature .meta__image,.content--type-interview .meta__image,.content--type-review .meta__image,.content--type-recipe .meta__image{margin-right:0}}@media (min-width: 71.25em){.content--type-feature .meta__image,.content--type-interview .meta__image,.content--type-review .meta__image,.content--type-recipe .meta__image{width:100%}}@media (min-width: 71.25em){.content--has-scores .content__labels .content__label__link{color:#121212}}.content--has-scores .content__head{grid-template-areas:'labels report' '. headline-standfirst' 'meta main-media'}.content--has-scores .football-tabs .tabs__container{margin-top:0.75rem;margin-bottom:0}@media (min-width: 61.25em){@supports (display: grid){.content--type-interview .content__headline-showcase-wrapper .content__header{margin-bottom:calc(-0.75rem * 7 - 0.125rem)}}}.content--type-interview .content__headline-standfirst-wrapper .content__header .content__headline{margin-right:0.625rem;padding-bottom:0.375rem}@media (min-width: 46.25em){.content--type-interview .content__headline-standfirst-wrapper .content__header .content__headline{margin:0}}.content--type-interview .content__header{margin-left:1rem}@media (min-width: 30em){.content--type-interview .content__header{margin-left:1.5rem}}@media (min-width: 41.25em){.content--type-interview .content__header{margin-top:0.375rem}}@media (min-width: 46.25em){.content--type-interview .content__header{margin-left:0.375rem}}.content--type-interview .content__label-interview{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;padding-bottom:0.1875rem;font-weight:900;display:inline-block;-webkit-box-decoration-break:clone;box-decoration-break:clone;position:relative;color:#ffffff}@media (min-width: 61.25em){.content--type-interview .content__label-interview{padding-bottom:0;line-height:1.8125rem}}.content--type-interview .content__head--article .content__headline{padding:0;line-height:2.1875rem}@media (min-width: 46.25em){.content--type-interview .content__head--article .content__headline{line-height:2.625rem}}.content--type-interview .content__head--article .content__headline .content__headline--interview-wrapper{background-color:#121212;display:inline;position:relative;z-index:10;color:#ffffff;box-shadow:0.375rem 0 0 #121212,-0.375rem 0 0 #121212;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-bottom:0.375rem}.content--type-interview .content__headline--byline-interview{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;display:inline-block;font-style:italic;font-weight:500;background-color:#ffe500;box-shadow:0.375rem 0 0 #ffe500,-0.375rem 0 0 #ffe500;color:#121212;margin-bottom:0.75rem;padding-bottom:0.1875rem;position:relative;z-index:10}@media (min-width: 46.25em){.content--type-interview .content__headline--byline-interview{margin-top:0.25rem}}@media (min-width: 61.25em){.content--type-interview .content__headline--byline-interview{margin-top:0}}.content--type-interview .content__headline--byline-interview a{color:inherit;font-weight:inherit}.content--type-interview.has-feature-showcase-element .content__head--article .content__headline-showcase-wrapper .content__headline{padding-bottom:0.375rem}@media (min-width: 61.25em){.content--type-interview .content__meta-container{margin-top:2.25rem}}.content--type-guardianview:not(.content--type-splash) .content__main,.content--type-comment .content__main{background-color:#fef9f5;padding-bottom:0.375rem}.content--type-guardianview:not(.content--type-splash) .content__main .rich-link,.content--type-comment .content__main .rich-link{background-color:#fff}.content--type-guardianview:not(.content--type-splash) .content__main .rich-link.tone-media--item,.content--type-comment .content__main .rich-link.tone-media--item{background-color:#121212}.content--type-guardianview:not(.content--type-splash) .content__main .element-pullquote,.content--type-guardianview:not(.content--type-splash) .content__main .element-pullquote:after,.content--type-comment .content__main .element-pullquote,.content--type-comment .content__main .element-pullquote:after{background-color:#fbe6d5}.content--type-guardianview:not(.content--type-splash) .content__main .element-pullquote blockquote p.pullquote-paragraph,.content--type-comment .content__main .element-pullquote blockquote p.pullquote-paragraph{color:#121212}.content--type-guardianview:not(.content--type-splash) .content__head,.content--type-comment .content__head{overflow:hidden}@media (min-width: 41.25em){.content--type-guardianview:not(.content--type-splash) .content__head,.content--type-comment .content__head{overflow:visible}}@media (min-width: 71.25em){.content--type-guardianview:not(.content--type-splash) .content__labels,.content--type-comment .content__labels{padding-bottom:2.25rem}}.content--type-guardianview:not(.content--type-splash) .content__meta-container,.content--type-comment .content__meta-container{background-image:none;padding-top:0;margin-bottom:0}@media (min-width: 71.25em){.content--type-guardianview:not(.content--type-splash) .content__meta-container,.content--type-comment .content__meta-container{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:8;background-size:0.0625rem 1.8125rem;padding-top:2.25rem;margin-top:-1.8125rem}}@media (min-width: 30em){.content--type-guardianview:not(.content--type-splash) .meta__twitter,.content--type-guardianview:not(.content--type-splash) .meta__email,.content--type-guardianview:not(.content--type-splash) .content__dateline,.content--type-comment .meta__twitter,.content--type-comment .meta__email,.content--type-comment .content__dateline{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 41.25em){.content--type-guardianview:not(.content--type-splash) .meta__twitter,.content--type-guardianview:not(.content--type-splash) .meta__email,.content--type-guardianview:not(.content--type-splash) .content__dateline,.content--type-comment .meta__twitter,.content--type-comment .meta__email,.content--type-comment .content__dateline{padding-left:0;padding-right:0}}.content--type-guardianview:not(.content--type-splash) .meta__twitter,.content--type-guardianview:not(.content--type-splash) .meta__email,.content--type-comment .meta__twitter,.content--type-comment .meta__email{padding-top:0.5rem;margin-top:-0.1875rem;margin-bottom:-0.75rem}@media (min-width: 71.25em){.content--type-guardianview:not(.content--type-splash) .meta__twitter,.content--type-guardianview:not(.content--type-splash) .meta__email,.content--type-comment .meta__twitter,.content--type-comment .meta__email{padding-top:-0.5rem;margin-top:-0.75rem;margin-bottom:0}}.content--type-guardianview:not(.content--type-splash) .content__header,.content--type-comment .content__header{background-image:repeating-linear-gradient(to bottom, #dcdcdc, #dcdcdc 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:bottom;background-size:0.0625rem 1.8125rem;position:relative}.content--type-guardianview:not(.content--type-splash) .content__headline,.content--type-comment .content__headline{font-size:1.75rem;line-height:2rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:300}@media (min-width: 22.5em){.content--type-guardianview:not(.content--type-splash) .content__headline,.content--type-comment .content__headline{font-size:2.125rem;line-height:2.375rem}}.content--type-guardianview:not(.content--type-splash) .content__standfirst,.content--type-comment .content__standfirst{padding-top:0.125rem;margin-bottom:0}.content--type-guardianview:not(.content--type-splash) .content__standfirst p,.content--type-comment .content__standfirst p{margin-bottom:0}@media (min-width: 71.25em){.content--type-guardianview:not(.content--type-splash) .content__standfirst,.content--type-comment .content__standfirst{margin-bottom:0.75rem}}.content--type-guardianview:not(.content--type-splash) .meta__image,.content--type-comment .meta__image{float:none;margin-right:-1.25rem}@media (min-width: 41.25em){.content--type-guardianview:not(.content--type-splash) .meta__image,.content--type-comment .meta__image{margin-right:0}}.content--type-guardianview:not(.content--type-splash) .drop-cap__inner,.content--type-comment .drop-cap__inner{font-weight:200}.content--type-guardianview:not(.content--type-splash) .inline-illustration-letters__svg,.content--type-comment .inline-illustration-letters__svg{display:none}.content--type-guardianview:not(.content--type-splash) .media-primary,.content--type-comment .media-primary{margin-bottom:0}@media (min-width: 20em){.content--type-guardianview:not(.content--type-splash) .media-primary,.content--type-comment .media-primary{margin-bottom:0.375rem}}.content--media:not(.paid-content).content--media{background-color:#121212}.content--media:not(.paid-content).content--media .caption{color:#dcdcdc}.content--media:not(.paid-content) .content__main{padding-bottom:2.25rem}@media (min-width: 46.25em){.content--media:not(.paid-content) .content__header{max-width:100%}}.content--media:not(.paid-content) .content__headline{color:#fff;padding-bottom:2.25rem}@media (max-width: 46.24em){.content--media:not(.paid-content) .byline,.content--media:not(.paid-content) .content__headline,.content--media:not(.paid-content) .content__standfirst,.content--media:not(.paid-content) .social{padding-left:0;padding-right:0}}@media (min-width: 41.25em){.content--media:not(.paid-content) .byline,.content--media:not(.paid-content) .content__headline,.content--media:not(.paid-content) .content__standfirst,.content--media:not(.paid-content) .social{margin-left:0}}.content--media:not(.paid-content) .byline,.content--media:not(.paid-content) .byline a,.content--media:not(.paid-content) .content__dateline,.content--media:not(.paid-content) .content__standfirst,.content--media:not(.paid-content) .from-content-api,.content--media:not(.paid-content) .meta__numbers .sharecount__value,.content--media:not(.paid-content) .u-underline,.content--media:not(.paid-content) a{color:#dcdcdc}.content--media:not(.paid-content) .byline a,.content--media:not(.paid-content) .from-content-api a{text-decoration:none;border-bottom:0.00625rem solid #767676;transition:border-color .15s ease-out}.content--media:not(.paid-content) .byline a:hover,.content--media:not(.paid-content) .from-content-api a:hover{border-color:#dcdcdc}.content--media:not(.paid-content) .meta__extras,.content--media:not(.paid-content) .meta__number:not(.u-h)+.meta__number,.content--media:not(.paid-content) .meta__numbers{border-color:#333}@media (max-width: 46.24em){.content--media:not(.paid-content) .tonal__standfirst{max-width:38.75rem;margin:0 auto}}@media (min-width: 22.5em){.content--media:not(.paid-content) .content__standfirst{max-width:100%}}.content--media:not(.paid-content) .u-underline{border-bottom:solid 0.0625rem #767676}.content--media:not(.paid-content) .bullet:before{background-color:#dcdcdc}.content--media:not(.paid-content) .content__meta-container{background-image:repeating-linear-gradient(to bottom, #333, #333 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:top;background-size:0.0625rem 0.8125rem}.content--media:not(.paid-content) .inline-icon,.content--media:not(.paid-content) .meta__numbers .inline-share svg,.content--media:not(.paid-content) .social-icon__svg{fill:#dcdcdc}.content--media:not(.paid-content) .byline span{display:inline}.gu-media-wrapper--video .vjs-big-play-button .vjs-control-text:before{content:'';border-radius:62.5rem;width:3.75rem;height:3.75rem;font-size:0;display:block}.gu-media-wrapper--video .vjs-big-play-button .vjs-control-text:after{content:'';position:absolute;top:50%;left:50%;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);border-style:solid;border-width:.7em 0 .7em 1.4em;border-color:transparent transparent transparent #ffffff}@media (min-width: 46.25em){.gu-media-wrapper--video .vjs-big-play-button .vjs-control-text:after{border-radius:.2em}}@media (min-width: 81.25em){.has-feature-showcase-element .media-primary.media-primary--showcase,.has-feature-showcase-opinion .media-primary.media-primary--showcase{margin:0 auto}}.has-feature-showcase-element .media-primary.media-primary--showcase .caption--main,.has-feature-showcase-opinion .media-primary.media-primary--showcase .caption--main{max-width:38.75rem}.has-feature-showcase-element .content__head--article .content__headline-showcase-wrapper,.has-feature-showcase-opinion .content__head--article .content__headline-showcase-wrapper{display:none}@media (min-width: 71.25em){.has-feature-showcase-element .content__head--article .content__headline-showcase-wrapper,.has-feature-showcase-opinion .content__head--article .content__headline-showcase-wrapper{display:block;grid-area:headline;max-width:38.75rem}}.has-feature-showcase-element .content__head--article .content__headline-showcase-wrapper .content__headline,.has-feature-showcase-opinion .content__head--article .content__headline-showcase-wrapper .content__headline{padding-bottom:1.5rem}@media (min-width: 71.25em){.has-feature-showcase-element .content__head--article .content__headline-standfirst-wrapper .content__headline,.has-feature-showcase-element .content__head--article .content__headline-standfirst-wrapper .content__label-interview,.has-feature-showcase-element .content__head--article .content__headline-standfirst-wrapper .content__headline--byline-interview,.has-feature-showcase-opinion .content__head--article .content__headline-standfirst-wrapper .content__headline,.has-feature-showcase-opinion .content__head--article .content__headline-standfirst-wrapper .content__label-interview,.has-feature-showcase-opinion .content__head--article .content__headline-standfirst-wrapper .content__headline--byline-interview{display:none}}@media (min-width: 71.25em){.has-feature-showcase-element .content__head--article .content__headline-standfirst-wrapper,.has-feature-showcase-opinion .content__head--article .content__headline-standfirst-wrapper{grid-area:standfirst}.has-feature-showcase-element .content__head--article .content__headline-standfirst-wrapper .old-article-message,.has-feature-showcase-opinion .content__head--article .content__headline-standfirst-wrapper .old-article-message{display:none}}.has-feature-showcase-element .content__head--article .stars,.has-feature-showcase-opinion .content__head--article .stars{position:absolute;margin:0;-webkit-transform:none;transform:none;z-index:5;bottom:0}@media (min-width: 46.25em){.has-feature-showcase-element .content__head--article .stars,.has-feature-showcase-opinion .content__head--article .stars{bottom:unset;top:0}}.has-feature-showcase-element figure>.gs-container,.has-feature-showcase-opinion figure>.gs-container{margin:0;padding:0}.has-feature-showcase-element figure>.gs-container .content__main-column,.has-feature-showcase-opinion figure>.gs-container .content__main-column{max-width:unset;margin:0;padding:0}@media (min-width: 71.25em){@supports (display: grid){.has-feature-showcase-element .content__head--article{grid-template-areas:'labels headline' 'meta main-media' '. standfirst'}}}@media (min-width: 81.25em){.has-feature-showcase-element .content__secondary-column{padding-top:52.5rem}}@media (min-width: 71.25em){.has-feature-showcase-element .content__secondary-column{padding-top:49.5rem}}.has-feature-showcase-opinion .content__header{max-width:38.75rem}@media (min-width: 71.25em){@supports (display: grid){.has-feature-showcase-opinion .content__head--article{grid-template-areas:'labels headline' 'meta' '. standfirst' 'main-media'}}}@media (min-width: 81.25em){.has-feature-showcase-opinion .content__secondary-column{padding-top:67.5rem}}@media (min-width: 71.25em){.has-feature-showcase-opinion .content__secondary-column{padding-top:64.5rem}}.content--type-analysis .media-primary{margin-bottom:0}@media (min-width: 46.25em){.content--type-analysis .media-primary{margin-bottom:0.1875rem}}@media (min-width: 71.25em){.content--type-analysis .media-primary{margin-bottom:0.375rem}}.content--type-analysis .content__headline{line-height:2.5rem;margin-right:-0.625rem}@media (min-width: 30em){.content--type-analysis .content__headline{margin-right:-1.25rem}}@media (min-width: 41.25em){.content--type-analysis .content__headline{margin-right:0}}@media (min-width: 46.25em){.content--type-analysis .content__headline{line-height:3rem}}.content--type-article .element-pullquote.element--supporting .pullquote-cite,.content--type-article .element-pullquote.element--supporting .pullquote-paragraph{font-weight:400}.content--type-feature .element-pullquote.element--supporting .pullquote-cite,.content--type-feature .element-pullquote.element--supporting .pullquote-paragraph,.content--type-interview .element-pullquote.element--supporting .pullquote-cite,.content--type-interview .element-pullquote.element--supporting .pullquote-paragraph,.content--type-recipe .element-pullquote.element--supporting .pullquote-cite,.content--type-recipe .element-pullquote.element--supporting .pullquote-paragraph{font-weight:700}.content--type-comment .element-pullquote.element--supporting .pullquote-cite,.content--type-comment .element-pullquote.element--supporting .pullquote-paragraph,.content--type-guardianview .element-pullquote.element--supporting .pullquote-cite,.content--type-guardianview .element-pullquote.element--supporting .pullquote-paragraph{font-weight:300}@media (min-width: 46.25em) and (max-width: 71.24em){.content--type-comment .content__meta-container,.content--type-guardianview .content__meta-container{-webkit-order:initial;-ms-flex-order:initial;order:initial}}.content--type-comment:not(.paid-content) .content__standfirst,.content--type-feature:not(.paid-content) .content__standfirst,.content--type-guardianview:not(.paid-content) .content__standfirst,.content--type-review:not(.paid-content) .content__standfirst,.content--type-recipe:not(.paid-content) .content__standfirst{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:300}@media (min-width: 46.25em){.content--type-comment:not(.paid-content) .content__standfirst,.content--type-feature:not(.paid-content) .content__standfirst,.content--type-guardianview:not(.paid-content) .content__standfirst,.content--type-review:not(.paid-content) .content__standfirst,.content--type-recipe:not(.paid-content) .content__standfirst{font-size:1.25rem;line-height:1.4375rem}}@media (min-width: 30em) and (max-width: 71.24em){.element-rich-link,.element-rich-link.element--supporting{width:8.125rem}}@media (min-width: 71.25em) and (max-width: 81.24em){.element-rich-link,.element-rich-link.element--supporting{width:8.75rem}}@media (min-width: 81.25em){.element-rich-link,.element-rich-link.element--supporting{width:13.75rem}}.rich-link .rich-link__header{font-size:0.875rem;line-height:1.0625rem;font-weight:400}@media (min-width: 81.25em){.rich-link .rich-link__header{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal}}.rich-link .stars{-webkit-transform:none;transform:none}.rich-link__avatar{margin-left:auto;margin-right:0.3125rem;width:5rem;height:5rem}@media (min-width: 81.25em){.rich-link__avatar{width:8.625rem;height:8.625rem}}.rich-link__avatar__media{border-radius:100%;width:100%;height:100%;display:block;object-fit:cover}.interactive.element--showcase,.interactive.element--supporting{background:#fff}.paid-content .content__headline,.paid-content .content__standfirst,.paid-content .from-content-api,.paid-content .content__series-label,.paid-content .submeta__section-labels .submeta__link{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.paid-content .content__meta-container{border-top:0.0625rem solid #999;padding-top:0.1875rem;height:inherit}.paid-content .content__article-body::before{background:#767676}.paid-content .element .caption{background:transparent}@media (min-width: 81.25em){.content__main-column--media{width:43.75rem}}.content__main-column--audio{min-height:11.5625rem}.content__main-column--audio .from-content-api{max-width:38.75rem}.content--media .byline{word-break:break-word}.media-body{position:relative}.inline-icon--media{margin-right:.1em}.inline-icon--media svg{width:.86em;height:.6em}.content--media:not(.paid-content) .social-icon{background-color:transparent;fill:#dcdcdc;color:#dcdcdc;border:0.0625rem solid #767676}.content--media:not(.paid-content) .social-icon__svg{fill:#bdbdbd}.content__main-column--liveblog::before{display:none}@media (min-width: 61.25em){.content__main-column--liveblog{margin-left:20rem;margin-right:0;max-width:none}}@media (min-width: 81.25em){.content__main-column--liveblog{margin-right:20rem}}@media (min-width: 61.25em){.content__main-column--liveblog .content__labels{float:left;width:13.75rem;margin-left:-20rem;border-bottom:0}}.content__main-column--liveblog .caption--main{padding-bottom:0}@media (min-width: 71.25em){.content__main-column.content__main-column--liveblog{padding-left:0}}.content--liveblog .content__meta-container--liveblog{border-bottom:0;margin-left:-0.625rem;margin-right:-0.625rem}@media (min-width: 30em){.content--liveblog .content__meta-container--liveblog{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:0;padding-right:0}}@media (min-width: 41.25em){.content--liveblog .content__meta-container--liveblog{margin-left:0;margin-right:0}}@media (min-width: 61.25em){.content--liveblog .content__meta-container--liveblog{border-top:0;margin-top:0;min-height:3.375rem;position:static;width:100%}}.content--liveblog .content__meta-container--liveblog .byline{padding-right:0}@media (min-width: 61.25em){.content--liveblog .content__meta-container--liveblog .byline{padding-top:0.125rem}}@media (min-width: 46.25em){.tonal__main--tone-live{padding-top:1.25rem}}@media (min-width: 41.25em) and (max-width: 46.24em){.content--liveblog .content__header{max-width:100%}}.content--liveblog .content__headline{padding-left:0}.content--liveblog .content__standfirst{padding-right:0;max-width:100%}.content__head__comment-count--liveblog{display:block}.content__head__comment-count--liveblog .commentcount{display:block;position:static}@media (min-width: 30em) and (max-width: 61.24em){.content__head__comment-count--liveblog .commentcount{position:absolute;right:0;top:0.5rem}}.content__updated-container--liveblog{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding-bottom:0.125rem;padding-top:0.125rem;margin-left:-20rem;position:absolute;top:0}@media (min-width: 61.25em){.blog__left-col{position:absolute;top:0;z-index:200;left:-20rem;width:18.75rem;height:100%}}.content--liveblog .content__main{background-color:#f6f6f6}.content--liveblog .media-primary{margin-left:-0.625rem;margin-right:-0.625rem}@media (min-width: 46.25em){.content--liveblog .media-primary{margin:0}}.timestamp,.published-time{font-size:0.8125rem;line-height:1.25rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:bold;display:block;padding:0.25rem 0;margin-top:0.5rem}.timestamp time,.published-time time{display:inline-block;margin-bottom:0.375rem;color:#121212}@media (min-width: 46.25em){.published-time{width:3.75rem}}.block-time{line-height:0.9375rem;padding:0.1875rem 0 0.75rem 0.625rem;position:relative}.block-time.published-time{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;margin:0;font-weight:bold}.block-time .live-pulse-icon--red{border-radius:62.5rem;display:inline-block;content:'';background-color:#ab0613;width:0.75rem;height:0.75rem;margin-bottom:-0.0625rem;margin-right:0.1875rem;-webkit-animation:live-pulse 2s infinite;animation:live-pulse 2s infinite}.block-time .block-time__absolute{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:inline-block;margin-left:0.3125rem;color:#767676;font-weight:normal}.block-time .timezone{display:none}@media (min-width: 46.25em){.block-time{position:absolute}.block-time .block-time__absolute{display:block;margin-left:0}}.block-time__link{color:#121212}.updated-time{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#767676;position:absolute;right:1.25rem;bottom:0.25rem;margin:0}.blocks{margin-top:0.75rem}.block{margin-bottom:0.75rem;position:relative}.block:after,.block:before{content:'';display:table}.block:after{clear:both}.block--content{padding-top:0.375rem;padding-bottom:0.75rem;background-color:#ffffff;border-top:0.0625rem solid #dcdcdc;border-bottom:0.0625rem solid #ededed}.truncated-block{display:none}.autoupdate--hidden,.notify--hidden{display:none}.block--notification{border-top-color:#ab0613}.notify{padding-left:0.625rem}.notify__btn{font-size:0.875rem;line-height:1.25rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;text-align:left;font-weight:bold;color:#ab0613}.autoupdate--has-animation .autoupdate--highlight{-webkit-animation:new-block-animation 5s ease-out;animation:new-block-animation 5s ease-out}@-webkit-keyframes new-block-animation{0%{opacity:0;border-top-color:#c70000}100%{opacity:1;border-top-color:#dcdcdc}}@keyframes new-block-animation{0%{opacity:0;border-top-color:#c70000}100%{opacity:1;border-top-color:#dcdcdc}}.blog .content__keywords{border-top:0.0625rem dotted #dcdcdc;line-height:1.25rem}.blog .from-content-api .block-title{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;margin-top:-0.1875rem;margin-bottom:0.75rem}@media (min-width: 46.25em){.blog .from-content-api .block-title{font-size:1.25rem;line-height:1.4375rem}}.blog .from-content-api .block-title+.block-elements .element-image:first-child:not(.element--thumbnail),.blog .from-content-api .block-title+.block-elements .element-video:first-child{margin-top:2.125rem}.blog .from-content-api .block-title,.blog .from-content-api .block-elements>*,.blog .from-content-api .block-elements>.element.element-tweet,.blog .from-content-api .block-elements>.element.element-rich-link,.blog .from-content-api .block-elements>.element.element-witness,.blog .from-content-api .block-elements>.element.element--thumbnail,.blog .from-content-api .liveblog-block-byline{margin-left:0.625rem;margin-right:0.625rem}@media (min-width: 46.25em){.blog .from-content-api .block-title,.blog .from-content-api .block-elements>*,.blog .from-content-api .block-elements>.element.element-tweet,.blog .from-content-api .block-elements>.element.element-rich-link,.blog .from-content-api .block-elements>.element.element-witness,.blog .from-content-api .block-elements>.element.element--thumbnail,.blog .from-content-api .liveblog-block-byline{margin-right:1.25rem;margin-left:5rem}}.blog .from-content-api .liveblog-block-byline{margin-bottom:0.375rem;padding-bottom:0.375rem}.blog .from-content-api .liveblog-block-byline__img{display:inline;border-radius:50%;max-width:2.25rem;vertical-align:middle;margin-right:0.25rem}.blog .from-content-api .liveblog-block-byline__name{font-size:1.0625rem;line-height:1.5rem;font-family:"Guardian Text Egyptian Web",Georgia,serif;display:inline;color:#121212}.blog .from-content-api .block-elements>blockquote,.blog .from-content-api .block-elements>blockquote.quoted{margin:1rem 1.25rem 1.125rem 5rem}@media (max-width: 29.99em){.blog .from-content-api .block-elements>blockquote,.blog .from-content-api .block-elements>blockquote.quoted{margin-left:0.625rem;margin-right:0.625rem}.blog .from-content-api .block-elements>blockquote:before,.blog .from-content-api .block-elements>blockquote.quoted:before{display:none}}.blog .from-content-api .block-elements>blockquote:first-child,.blog .from-content-api .block-elements>blockquote.quoted:first-child{margin-top:0}@media (min-width: 46.25em){.blog .from-content-api .block-elements>blockquote:first-child,.blog .from-content-api .block-elements>blockquote.quoted:first-child{margin-top:-0.125rem}}.blog .from-content-api .block-elements>blockquote{color:#121212}.blog .from-content-api .block-elements>.element{margin-left:0;margin-right:0}.blog .from-content-api .block-elements>.element-table{margin:0}.blog .from-content-api .block-elements>.element-table .table{background:none;border:0}.blog .from-content-api .block-elements>.element-table td{background:none}.blog .from-content-api .block-elements>.element-table tr{border-bottom:0.0625rem solid #ececec}.blog .from-content-api .block-elements>.element-table tr th:first-child,.blog .from-content-api .block-elements>.element-table tr td:first-child{padding-left:0}.blog .from-content-api .block-elements>.element-table tr th:last-child,.blog .from-content-api .block-elements>.element-table tr td:last-child{padding-right:0}.blog .from-content-api .block-elements>.element-table thead{border-top:0.0625rem solid #ececec}.blog .from-content-api .block-elements>.element-table .table--football,.blog .from-content-api .block-elements>.element-comment,.blog .from-content-api .block-elements>.element-embed,.blog .from-content-api .block-elements>.element-audio,.blog .from-content-api .block-elements>.element-interactive,.blog .from-content-api .block-elements>.element-atom:not(.element-atom--media){width:auto;margin:0.75rem 0.625rem 1rem}@media (min-width: 46.25em){.blog .from-content-api .block-elements>.element-table .table--football,.blog .from-content-api .block-elements>.element-comment,.blog .from-content-api .block-elements>.element-embed,.blog .from-content-api .block-elements>.element-audio,.blog .from-content-api .block-elements>.element-interactive,.blog .from-content-api .block-elements>.element-atom:not(.element-atom--media){margin-left:5rem;margin-right:1.25rem}}.blog .from-content-api .block-elements>.embed-video-wrapper{position:relative;width:100%;padding-top:56.25%}.blog .from-content-api .block-elements>.embed-video-wrapper iframe{position:absolute;top:0;width:100%;height:100%}.blog .from-content-api .block-elements>.element-image,.blog .from-content-api .block-elements>.element-video{clear:left;border-bottom:0.125rem solid #f6f6f6;margin-bottom:0.75rem;padding-bottom:0.375rem}.blog .from-content-api .block-elements>.element-image:last-child,.blog .from-content-api .block-elements>.element-video:last-child{border-bottom:0}.blog .from-content-api .block-elements>.element figcaption{background-color:#ffffff;margin-left:0.625rem;margin-right:0.625rem;padding-bottom:0.375rem}@media (min-width: 30em){.blog .from-content-api .block-elements>.element figcaption{margin-left:5rem;margin-right:1.25rem}}@media (min-width: 46.25em){.blog .from-content-api .block-elements.block-elements--no-byline>.element-image:first-child:not(.element--thumbnail),.blog .from-content-api .block-elements.block-elements--no-byline>.element-video:first-child{margin-top:3.4375rem}}.blog .from-content-api .block-elements>.element.element--thumbnail{border-bottom:0;margin-bottom:0;margin-top:0.25rem}.blog .from-content-api .block-elements>.element.element--thumbnail figcaption{margin-left:0;margin-right:0;padding-bottom:0.375rem}.dropdown--key-events,.dropdown--live-feed{border-top:0;margin-top:0.75rem;margin-right:-0.625rem;margin-left:-0.625rem}@media (min-width: 30em){.dropdown--key-events,.dropdown--live-feed{margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width: 41.25em){.dropdown--key-events,.dropdown--live-feed{margin-right:0x;margin-left:0}}@media (min-width: 46.25em){.dropdown--key-events,.dropdown--live-feed{margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width: 61.25em){.dropdown--key-events,.dropdown--live-feed{margin-right:0;margin-left:0}}.dropdown--key-events button.dropdown__button,.dropdown--live-feed button.dropdown__button{background-color:#ffffff;padding-right:0.625rem;padding-left:0.625rem}@media (min-width: 30em){.dropdown--key-events button.dropdown__button,.dropdown--live-feed button.dropdown__button{padding-right:1.25rem;padding-left:1.25rem}}@media (min-width: 61.25em){.dropdown--key-events button.dropdown__button,.dropdown--live-feed button.dropdown__button{display:none}}@media (min-width: 61.25em){.blog__timeline .dropdown--key-events button.dropdown__button,.blog__timeline .dropdown--live-feed button.dropdown__button{display:block;border-top:0;padding-top:0.625rem;margin-top:-0.25rem;margin-bottom:0.375rem}}.dropdown--key-events .dropdown__label,.dropdown--live-feed .dropdown__label{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900}.dropdown--key-events .dropdown__content,.dropdown--live-feed .dropdown__content{position:relative;margin:0}@media (max-width: 61.24em){.dropdown--key-events .dropdown__content,.dropdown--live-feed .dropdown__content{background-color:#f6f6f6;padding:0.75rem 0.625rem}}@media (min-width: 61.25em){.dropdown--key-events .dropdown__content,.dropdown--live-feed .dropdown__content{display:block !important}}.is-not-modern .dropdown--key-events,.is-not-modern .dropdown--live-feed{border-top:0}@media (min-width: 61.25em){.blog__timeline:before,.blog__timeline:after,.blog__timeline .control{display:none}.blog__timeline .dropdown{border-top:0.0625rem solid #ab0613;padding-top:0.375rem}}.comment-count--timeline{margin-top:-0.6875rem}@media (max-width: 61.24em){.comment-count--timeline{display:none}}.comment-count--timeline .commentcount{z-index:101;position:relative;padding-left:1.71875rem}@media (min-width: 61.25em){.live-blog__sticky-components-container{-webkit-transform:translateZ(0);transform:translateZ(0);width:18.75rem;top:0.75rem;padding-top:0.375rem}}.timeline{position:relative}@media (min-width: 30em){.timeline{padding-left:0.625rem;padding-right:0.625rem}}@media (min-width: 61.25em){.timeline{margin-left:0.46875rem;margin-top:0.375rem}}.timeline__item{display:table;width:100%;overflow:hidden;min-height:2.5rem;border-bottom:0.0625rem solid #dcdcdc}.timeline__item:last-child{border-bottom:0}@media (min-width: 61.25em){.timeline__item{display:block;overflow:visible;border-bottom:0}}.timeline__link{display:block;padding:0.125rem 0 0.375rem}.timeline__link,.timeline__link:hover,.timeline__link:visited,.timeline__link:active{color:#121212;text-decoration:none}@media (min-width: 61.25em){.timeline__link{position:relative;padding:0 1.25rem 1.5rem;border-left:0.0625rem solid #dcdcdc}.timeline__link:before{border-radius:62.5rem;display:block;position:absolute;content:' ';top:-0.25rem;left:-0.46875rem;width:0.9375rem;height:0.9375rem;background-color:#dcdcdc}.timeline__link:hover:before{background-color:#767676}.timeline__link.live-blog__key-event--selected:before{background-color:#121212}.timeline__item:first-child .timeline__link:before,.timeline__item:last-child .timeline__link:before{border-radius:0;top:0;height:0.0625rem}.timeline__item:last-child .timeline__link{border-color:transparent}}.timeline__date{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:table-cell;width:3.75rem;font-weight:bold}.timeline__date time{color:#121212}.timeline__date .block-time__absolute,.timeline__date .timezone{display:none}@media (min-width: 61.25em){.timeline__date{display:block;position:relative;top:-0.25rem;line-height:0.9375rem}}.timeline__title{font-size:0.875rem;line-height:1.25rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:table-cell;border-color:#f6f6f6;color:#121212}@media (min-width: 61.25em){.timeline__title{display:inline}.live-blog__key-event--selected .timeline__title{font-weight:bold}}.blog__related{width:13.75rem;margin-left:5rem}.blog__related .tone-news--item .fc-item__content{background-color:#eee}.blog__related .tone-news--item .u-faux-block-link--hover .fc-item__content{background-color:#e2e2e2}.blog__related__head{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;padding-top:0.1875rem;margin-bottom:1rem;border-top:0.0625rem solid #dcdcdc}.blog .tabs__container--multiple{margin-bottom:0}.blog .tabs__tab--selected{border-bottom-color:#f6f6f6 !important}.blog .match-summary{border-bottom:0}.blog .element-table .player-card{padding:0;background:none;border:0;margin:0.375rem 0.625rem 0}@media (min-width: 30em){.blog .element-table .player-card{border-left:0.0625rem solid #ececec;margin-left:1.25rem;margin-right:1.25rem;padding-left:1.25rem}}.blog .element-table .player-card__position{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#121212;font-weight:700}.blog .dropdown .match-stats__container{margin-bottom:0.75rem}@media (min-width: 61.25em){.blog .tabs__container--multiple{background-color:#f6f6f6}.blog .tabs__tab--selected .tab__link{background-color:#f6f6f6}.blog .match-summary{padding-bottom:0}}@media (min-width: 46.25em){.ad-slot--liveblog-inline{margin:0 0 0.75rem}}@media (max-width: 81.24em){.blog .content__secondary-column{display:none}}.content--liveblog.content--pillar-news .content__header{background:#c70000}.content--liveblog.content--pillar-news .tonal__standfirst{background:#ae0000}.content--liveblog.content--pillar-news .content__label__link[href]{color:#ffbac8}.timeline__link:hover .content--liveblog.content--pillar-news{border-color:#c70000}.content--liveblog.content--pillar-news .block.is-key-event,.content--liveblog.content--pillar-news .block.is-summary{border-top:0.0625rem solid #c70000}.content--liveblog.content--pillar-opinion .content__header{background:#e05e00}.content--liveblog.content--pillar-opinion .tonal__standfirst{background:#c75300}.content--liveblog.content--pillar-opinion .content__label__link[href]{color:#bd5318}.timeline__link:hover .content--liveblog.content--pillar-opinion{border-color:#e05e00}.content--liveblog.content--pillar-opinion .block.is-key-event,.content--liveblog.content--pillar-opinion .block.is-summary{border-top:0.0625rem solid #e05e00}.content--liveblog.content--pillar-sport .content__header{background:#005689}.content--liveblog.content--pillar-sport .tonal__standfirst{background:#004670}.content--liveblog.content--pillar-sport .content__label__link[href]{color:#90dcff}.timeline__link:hover .content--liveblog.content--pillar-sport{border-color:#005689}.content--liveblog.content--pillar-sport .block.is-key-event,.content--liveblog.content--pillar-sport .block.is-summary{border-top:0.0625rem solid #005689}.content--liveblog.content--pillar-arts .content__header{background:#6b5840}.content--liveblog.content--pillar-arts .tonal__standfirst{background:#5b4b36}.content--liveblog.content--pillar-arts .content__label__link[href]{color:#e7d4b9}.timeline__link:hover .content--liveblog.content--pillar-arts{border-color:#6b5840}.content--liveblog.content--pillar-arts .block.is-key-event,.content--liveblog.content--pillar-arts .block.is-summary{border-top:0.0625rem solid #6b5840}.content--liveblog.content--pillar-lifestyle .content__header{background:#7d0068}.content--liveblog.content--pillar-lifestyle .tonal__standfirst{background:#640053}.content--liveblog.content--pillar-lifestyle .content__label__link[href]{color:#ffbac8}.timeline__link:hover .content--liveblog.content--pillar-lifestyle{border-color:#7d0068}.content--liveblog.content--pillar-lifestyle .block.is-key-event,.content--liveblog.content--pillar-lifestyle .block.is-summary{border-top:0.0625rem solid #7d0068}.content--liveblog.section-football .tonal__header,.content--liveblog--rugby .tonal__header{background-color:#ffffff}.content--liveblog.section-football .tonal__header .content__labels,.content--liveblog--rugby .tonal__header .content__labels{border-bottom-color:#dcdcdc}.content--liveblog.section-football .tonal__header .content__label__link,.content--liveblog--rugby .tonal__header .content__label__link{color:#005689}.content--liveblog.section-football .tonal__header .content__headline,.content--liveblog--rugby .tonal__header .content__headline{color:#121212;padding-left:0}@media (min-width: 41.25em){.content--liveblog.section-football .tonal__header .content__headline,.content--liveblog--rugby .tonal__header .content__headline{margin-left:-1.25rem}}@media (min-width: 46.25em){.content--liveblog.section-football .tonal__header .content__headline,.content--liveblog--rugby .tonal__header .content__headline{margin-left:0}}.content--liveblog .content__head,.content--liveblog .content__standfirst,.content--liveblog .content__standfirst a[href],.content--liveblog .content__label__link[href]{color:#ffffff}.content--liveblog .content__labels{padding-left:0}@media (min-width: 41.25em) and (max-width: 46.24em){.content--liveblog .content__labels{margin-left:0}}.content--liveblog .tonal__standfirst ul>li::before{background:rgba(255,255,255,0.4)}.content--liveblog .content__standfirst{margin-left:-0.625rem}@media (min-width: 30em){.content--liveblog .content__standfirst{margin-left:-1.25rem}}@media (min-width: 41.25em){.content--liveblog .content__standfirst{margin-left:0}}@media (min-width: 41.25em){.football-tabs{margin-left:0;margin-right:0}}.tabs__tab a[href]{padding-left:0.625rem}@media (min-width: 30em){.tabs__tab a[href]{padding-left:1.25rem}}@media (min-width: 41.25em){.tabs__tab a[href]{padding-left:0.625rem}}@media (min-width: 46.25em){.content--liveblog.tonal--tone-dead.content--pillar-news .tonal__main--tone-dead{padding-top:1.25rem}}.content--liveblog.tonal--tone-dead.content--pillar-news .content__head,.content--liveblog.tonal--tone-dead.content--pillar-news .content__standfirst{color:#121212}.content--liveblog.tonal--tone-dead.content--pillar-news .content__label__link{color:#c70000}.content--liveblog.tonal--tone-dead.content--pillar-news .content__header{background:#fff}.content--liveblog.tonal--tone-dead.content--pillar-news .tonal__standfirst{background:#ededed}.content--liveblog.tonal--tone-dead.content--pillar-news .content__standfirst a{color:#c70000}.content--liveblog.tonal--tone-dead.content--pillar-news .tonal__standfirst ul>li::before{background:rgba(51,51,51,0.4)}@media (min-width: 46.25em){.content--liveblog.tonal--tone-dead.content--pillar-opinion .tonal__main--tone-dead{padding-top:1.25rem}}.content--liveblog.tonal--tone-dead.content--pillar-opinion .content__head,.content--liveblog.tonal--tone-dead.content--pillar-opinion .content__standfirst{color:#121212}.content--liveblog.tonal--tone-dead.content--pillar-opinion .content__label__link{color:#e05e00}.content--liveblog.tonal--tone-dead.content--pillar-opinion .content__header{background:#fff}.content--liveblog.tonal--tone-dead.content--pillar-opinion .tonal__standfirst{background:#ededed}.content--liveblog.tonal--tone-dead.content--pillar-opinion .content__standfirst a{color:#e05e00}.content--liveblog.tonal--tone-dead.content--pillar-opinion .tonal__standfirst ul>li::before{background:rgba(51,51,51,0.4)}@media (min-width: 46.25em){.content--liveblog.tonal--tone-dead.content--pillar-sport .tonal__main--tone-dead{padding-top:1.25rem}}.content--liveblog.tonal--tone-dead.content--pillar-sport .content__head,.content--liveblog.tonal--tone-dead.content--pillar-sport .content__standfirst{color:#121212}.content--liveblog.tonal--tone-dead.content--pillar-sport .content__label__link{color:#0084c6}.content--liveblog.tonal--tone-dead.content--pillar-sport .content__header{background:#fff}.content--liveblog.tonal--tone-dead.content--pillar-sport .tonal__standfirst{background:#ededed}.content--liveblog.tonal--tone-dead.content--pillar-sport .content__standfirst a{color:#0084c6}.content--liveblog.tonal--tone-dead.content--pillar-sport .tonal__standfirst ul>li::before{background:rgba(51,51,51,0.4)}@media (min-width: 46.25em){.content--liveblog.tonal--tone-dead.content--pillar-arts .tonal__main--tone-dead{padding-top:1.25rem}}.content--liveblog.tonal--tone-dead.content--pillar-arts .content__head,.content--liveblog.tonal--tone-dead.content--pillar-arts .content__standfirst{color:#121212}.content--liveblog.tonal--tone-dead.content--pillar-arts .content__label__link{color:#a1845c}.content--liveblog.tonal--tone-dead.content--pillar-arts .content__header{background:#fff}.content--liveblog.tonal--tone-dead.content--pillar-arts .tonal__standfirst{background:#ededed}.content--liveblog.tonal--tone-dead.content--pillar-arts .content__standfirst a{color:#a1845c}.content--liveblog.tonal--tone-dead.content--pillar-arts .tonal__standfirst ul>li::before{background:rgba(51,51,51,0.4)}@media (min-width: 46.25em){.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .tonal__main--tone-dead{padding-top:1.25rem}}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .content__head,.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .content__standfirst{color:#121212}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .content__label__link{color:#bb3b80}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .content__header{background:#fff}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .tonal__standfirst{background:#ededed}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .content__standfirst a{color:#bb3b80}.content--liveblog.tonal--tone-dead.content--pillar-lifestyle .tonal__standfirst ul>li::before{background:rgba(51,51,51,0.4)}.content--has-scores.content--pillar-sport.content--liveblog .content__header{background-color:#ffe500}@media (max-width: 46.24em){.content--has-scores.content--pillar-sport.content--liveblog .match-summary__teams{padding-left:0;padding-right:0}}.content--has-scores.content--pillar-sport.content--liveblog .content__labels .content__label__link{color:#121212}.breadcrumb{text-transform:lowercase}.social-icon--facebook{background-color:#3067a3}.social-icon--facebook:hover{background-color:#244e7c}.social-icon--whatsapp{background-color:#59cb3f}.social-icon--whatsapp:hover{background-color:#45a92e}.social-icon--messenger{background-color:#0084ff}.social-icon--messenger:hover{background-color:#006acc}.social-icon--twitter{background-color:#03b3ee}.social-icon--twitter:hover{background-color:#028dbc}.social-icon--linkedin{background-color:#0071a1}.social-icon--linkedin:hover{background-color:#004d6e}.social-icon--pinterest{background-color:#b9252c}.social-icon--pinterest:hover{background-color:#8f1d22}.social-icon--email{background-color:#767676}.social-icon--email:hover{background-color:#5d5d5d}.social__item{float:left;min-width:2rem;padding:0 0.1875rem 0.375rem 0;cursor:pointer}@media (min-width: 46.25em){.social__item--whatsapp{display:none}}@media (min-width: 46.25em){.social__item--messenger{display:none}}.social__action{display:inline-block}.social-icon{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:0;min-width:2rem;max-width:100%;width:auto;height:2rem}.social-icon,.social-icon:hover,.social-icon:active,.social-icon:focus{color:#ffffff;text-decoration:none}.social-icon svg{height:88%;width:88%}.social-icon .social-icon__label{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;margin:0 .8em 0 -.5em}.social-icon--small{min-width:1.5rem;height:1.5rem}.social-icon--small i{width:1.5rem;background-size:100% !important}.social-icon--small .social-icon__label{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;margin:0 .7em 0 -.3em}.social-icon__label{white-space:nowrap;font-weight:bold}.selection-sharing{position:absolute;margin-top:-2.25rem;top:0;opacity:0;visibility:hidden;transition:opacity .15s ease;z-index:1015}.selection-sharing .social__item{padding:0 0.125rem;width:2rem}.selection-sharing .inline-icon svg{width:80%;display:block}.selection-sharing.selection-sharing--active{visibility:visible;opacity:1}.share-text{font-size:0.875rem;line-height:1.25rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;float:left;font-weight:700;padding:0.5rem 0.125rem 0 0.625rem}.content[class*='-network'] .social__item--pinterest,.content[class*='-leadership'] .social__item--pinterest,.content[class*='-careers'] .social__item--pinterest,.content[class*='-advertisement-feature'] .social__item--pinterest,.content[class*='-partner-zone'] .social__item--pinterest{display:none}.paid-content .social-icon,.paid-content .block-share__item,.paid-content.tonal--tone-media .social-icon,.paid-content.tonal--tone-media .block-share__item{border:0.0625rem solid #999}.paid-content .social-icon:hover,.paid-content .social-icon:active,.paid-content .social-icon:focus,.paid-content .block-share__item:hover,.paid-content .block-share__item:active,.paid-content .block-share__item:focus,.paid-content.tonal--tone-media .social-icon:hover,.paid-content.tonal--tone-media .social-icon:active,.paid-content.tonal--tone-media .social-icon:focus,.paid-content.tonal--tone-media .block-share__item:hover,.paid-content.tonal--tone-media .block-share__item:active,.paid-content.tonal--tone-media .block-share__item:focus{border:0.0625rem solid #121212;background-color:#121212}.paid-content .social-icon svg,.paid-content .block-share__item svg,.paid-content.tonal--tone-media .social-icon svg,.paid-content.tonal--tone-media .block-share__item svg{fill:#121212}.paid-content .social-icon:focus svg,.paid-content .social-icon:hover svg,.paid-content .block-share__item:focus svg,.paid-content .block-share__item:hover svg,.paid-content.tonal--tone-media .social-icon:focus svg,.paid-content.tonal--tone-media .social-icon:hover svg,.paid-content.tonal--tone-media .block-share__item:focus svg,.paid-content.tonal--tone-media .block-share__item:hover svg{fill:#fff}.tweet-main-image{width:100%}@-webkit-keyframes live-pulse{0%{opacity:1}10%{opacity:.25}40%{opacity:1}100%{opacity:1}}@keyframes live-pulse{0%{opacity:1}10%{opacity:.25}40%{opacity:1}100%{opacity:1}}.blog__live{font-weight:bold}.blog__live.live-pulse-icon:before{margin-bottom:-0.0625rem}.live-pulse-icon:before{border-radius:62.5rem;display:inline-block;position:relative;background-color:#ffffff;width:.75em;height:.75em;content:'';margin-right:0.1875rem;vertical-align:initial;-webkit-animation:live-pulse 1s infinite;animation:live-pulse 1s infinite}@supports (object-fit: cover) and (height: 1vh) and (display: flex){.immersive-header-container{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100vh}}.content--immersive-article-without-main-media{background-color:rgba(0,0,0,0.5);padding-bottom:0}.immersive-main-media{position:relative;min-height:25rem}@media (min-width: 61.25em){.immersive-main-media{min-height:31.25rem}}@media (min-width: 81.25em){.immersive-main-media{min-height:50rem}}@supports (object-fit: cover) and (height: 1vh) and (display: flex){.immersive-main-media{-webkit-flex:1;-ms-flex:1;flex:1}}.immersive-main-media.atom-playing .immersive-main-media__media__loading{background-color:#ffffff}.immersive-main-media.atom-playing .immersive-main-media__headline-container{position:static;margin-top:calc(100vh - 2.25rem);-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-animation:slideImmersiveTitleDownHeadline 360ms ease-in-out forwards;animation:slideImmersiveTitleDownHeadline 360ms ease-in-out forwards}.immersive-main-media.atom-playing .immersive-main-media__headline-container--dark{background-color:#333;background:linear-gradient(#333, #333)}@-webkit-keyframes slideImmersiveTitleDownHeadline{0%{-webkit-transform:translateY(calc(-100% + 2.25rem));transform:translateY(calc(-100% + 2.25rem))}100%{-webkit-transform:translateY(2.25rem);transform:translateY(2.25rem)}}@keyframes slideImmersiveTitleDownHeadline{0%{-webkit-transform:translateY(calc(-100% + 2.25rem));transform:translateY(calc(-100% + 2.25rem))}100%{-webkit-transform:translateY(2.25rem);transform:translateY(2.25rem)}}.immersive-main-media__logo{z-index:1}.immersive-main-media__logo__svg{float:right;margin-top:0.375rem}.immersive-main-media__logo__svg path{fill:#ffffff}.immersive-main-media__media{width:100%;display:block}.immersive-main-media__media .element-atom,.immersive-main-media__media .element-embed{margin-top:0;margin-bottom:0;position:absolute;top:0;right:0;bottom:0;left:0}.immersive-main-media__media .fenced{height:100% !important;opacity:0;transition:.5s opacity ease-in}.immersive-main-media__media .fenced-rendered{opacity:1}@supports (object-fit: cover) and (height: 1vh) and (display: flex){.immersive-main-media__media{object-fit:cover;position:absolute;top:0;height:100%}}.immersive-main-media__media__loading{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#dcdcdc;color:#121212}.immersive-main-media__loading-animation{position:absolute;top:40%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);display:block}.immersive-main-media__headline-container{position:absolute;bottom:0;left:0;right:0}.immersive-main-media__headline-container .content__labels{padding-bottom:0;margin-bottom:0}.content__headline--immersive{color:#ffffff}.content__headline--immersive.content__headline--advertisement{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:200}.immersive-main-media__headline-container--dark .content__headline--immersive-article{color:#ffffff}@media (min-width: 61.25em){.content__headline--immersive--with-main-media{font-size:3.25rem}}.content--immersive .content__main{padding-top:0}@media (min-width: 61.25em){.content--immersive .content__main{padding-top:1.5rem}}@media (max-width: 71.24em){.caption--immersive{margin:0.75rem 0 0.375rem}}@media (min-width: 71.25em){.caption--immersive{margin-left:-1.25rem;padding-top:0.1875rem;position:absolute;top:6.25rem;width:8.75rem;-webkit-transform:translateX(-100%);transform:translateX(-100%)}[lang='ar'] .caption--immersive{left:0}}@media (min-width: 81.25em){.caption--immersive{width:13.75rem}}.content__standfirst--immersive-article{position:relative;padding-top:0.375rem;padding-bottom:0.75rem;margin-bottom:0}.content__standfirst--immersive-article.content__standfirst--advertisement{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.content__wrapper--standfirst{padding-left:0.625rem;padding-right:0.625rem}@media (min-width: 30em){.content__wrapper--standfirst{padding-left:1.25rem;padding-right:1.25rem}}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote{position:relative;width:auto;margin-left:0;margin-bottom:0.375rem;border-top:0.0625rem solid #f6f6f6;border-bottom:0.0625rem solid #f6f6f6;padding:0;padding-top:.2em;padding-bottom:2.25rem}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .inline-quote{margin:0.1875rem 0;height:auto;width:auto;line-height:1}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .inline-quote svg{fill:#dcdcdc;width:2.5em;height:1.4em}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .pullquote-paragraph,.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .pullquote-cite{font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:200;font-size:1.75rem;line-height:1.1}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .pullquote-paragraph{color:#bb3b80}.content--immersive-article:not(.content--immersive-garnett) .element-pullquote .pullquote-cite{color:#121212 !important}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--showcase,.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting{padding:0;border:0}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--showcase .inline-quote svg{width:3em;height:1.8em}}@media (min-width: 71.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--showcase .inline-quote{position:absolute;left:-3.5em}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--showcase .pullquote-paragraph,.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--showcase .pullquote-cite{font-size:2.25em}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting{width:13.75rem;border:0;margin-right:1.25rem;margin-bottom:1.5rem}}@media (min-width: 71.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting{width:8.75rem;margin-left:-10rem}}@media (min-width: 81.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting{width:13.75rem;margin-left:-15rem}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting .inline-quote{position:absolute}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting .inline-quote svg{width:1.8em;height:1em}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting .pullquote-paragraph{text-indent:1.7em}}@media (min-width: 46.25em){.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting .pullquote-paragraph,.content--immersive-article:not(.content--immersive-garnett) .element-pullquote.element--supporting .pullquote-cite{font-size:1.25em;line-height:1.2}}.content--immersive-article.content{border-top:0}.content--immersive-article .content__article-body{clear:both}@media (min-width: 71.25em){.content--immersive-article .content__article-body{padding-left:0.625rem}}.content--immersive-article.content--paid-content{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.content--immersive-article .content__label__link{color:#ffffff}.content--immersive-article .content__series-label+.content__headline{padding-top:0}@media (max-width: 61.24em){.content--immersive-article .is-fixed-height .content__standfirst:before{display:none}}.content--immersive-article .content__section-label--advertisement{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:1.25rem;line-height:1.5rem;font-weight:900;margin:0}.content--immersive-article .content__section-label--advertisement .content__label__link{color:#69d1ca}.content--immersive-article .drop-cap{height:7.25em}.content--immersive-article .drop-cap .drop-cap__inner{font-size:9.5em;line-height:.83}.content--immersive-article .section-rule{display:block;width:8.75rem;height:0.125rem;margin:0;border:0;margin-top:3rem;margin-bottom:0.1875rem;background-color:#f6f6f6}.content--immersive-article .section-image{position:relative}.content--immersive-article .section-image .caption,.content--immersive-article .section-image .section-rule{display:none}.content--immersive-article .section-title,.content--immersive-article .from-content-api>h2{font-size:1.75rem;line-height:2rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:300}@media (min-width: 46.25em){.content--immersive-article .section-title,.content--immersive-article .from-content-api>h2{font-size:2.125rem;line-height:2.375rem}}.content--immersive-article .section-title{position:absolute;z-index:20;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);color:#ffffff;padding:0.1em 0.625rem 0.5em}@media (min-width: 30em){.content--immersive-article .section-title{padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 71.25em){.content--immersive-article .section-title{padding-left:11.25rem}}@media (min-width: 81.25em){.content--immersive-article .section-title{padding-left:16.25rem}}.content--immersive-article .in-body-link--immersive{color:#bb3b80}.content--immersive-article .in-body-link--immersive:hover{border-bottom-color:rgba(187,59,128,0.4)}.content--immersive-article .element+.section-rule{margin-top:0}.content--immersive-article figure.element--immersive{margin-left:-0.625rem;margin-right:-0.625rem;z-index:1}@media (min-width: 30em){.content--immersive-article figure.element--immersive{margin-left:-1.25rem;margin-right:-1.25rem}}@media (min-width: 46.25em){.content--immersive-article figure.element--immersive{margin-right:-6.25rem}}@media (min-width: 61.25em){.content--immersive-article figure.element--immersive{margin-right:-21.25rem}}@media (min-width: 71.25em){.content--immersive-article figure.element--immersive{margin-left:-11.25rem}}@media (min-width: 81.25em){.content--immersive-article figure.element--immersive{margin-left:-16.25rem;margin-right:-26.25rem}}.content--immersive-article figure.element--immersive .caption{margin-left:0.625rem;margin-right:0.625rem}@media (min-width: 30em){.content--immersive-article figure.element--immersive .caption{margin-left:1.25rem;margin-right:1.25rem}}@media (min-width: 61.25em){.content--immersive-article figure.element--immersive .caption{margin-left:0;margin-right:0}}@media (min-width: 46.25em){.content--immersive-article figure.element--immersive .block-share{margin-right:1.25rem}}.content--immersive-article figure.element--immersive .section-rule{display:none}@media (min-width: 61.25em){.content--immersive-article figure.element--showcase{margin-left:-1.25rem}}@media (min-width: 71.25em){.content--immersive-article figure.element--showcase{margin-left:-11.25rem}}@media (min-width: 81.25em){.content--immersive-article figure.element--showcase{margin-left:-16.25rem}}.content--immersive-article figure.element--showcase .block-share{display:none !important}.content--immersive-article .element-image.element--showcase{margin-bottom:0.625rem}@media (min-width: 71.25em){.content--immersive-article figure.element--showcase,.content--immersive-article figure.element--immersive{margin-bottom:0.625rem}}@media (min-width: 61.25em){.content--immersive-article figure.element--showcase .caption,.content--immersive-article figure.element--immersive .caption{padding-left:1.25rem}}@media (min-width: 71.25em){.content--immersive-article figure.element--showcase .caption,.content--immersive-article figure.element--immersive .caption{position:absolute;width:8.75rem;padding-top:0.75rem}}@media (min-width: 81.25em){.content--immersive-article figure.element--showcase .caption,.content--immersive-article figure.element--immersive .caption{width:13.75rem}}.content--immersive-article .element--showcase,.content--immersive-article .element--inline,.content--immersive-article .element--halfWidth{float:none}@media (min-width: 71.25em){.content--immersive-article [lang='ar'] figure.element--showcase .caption{left:0}}@media (min-width: 46.25em){.content--immersive-article [lang='ar'] figure.fig--narrow-caption.img--portrait .caption{float:left;padding-left:0}.content--immersive-article [lang='ar'] figure.fig--narrow-caption.img--portrait:after{visibility:hidden;display:block;font-size:0;content:'';clear:both;height:0}}@media (min-width: 46.25em) and (max-width: 71.24em){.content--immersive-article [lang='ar'] figure.fig--narrow-caption.img--landscape .caption{float:left;padding-left:0}.content--immersive-article [lang='ar'] figure.fig--narrow-caption.img--landscape:after{visibility:hidden;display:block;font-size:0;content:'';clear:both;height:0}}@media (min-width: 71.25em){.content--immersive-article [lang='ar'] figure.fig--narrow-caption.img--landscape .caption{left:0}}@media (min-width: 81.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article).immersive-main-media{min-height:37.5rem}}@media (min-width: 61.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__article-body{margin-left:-0.625rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__labels--immersive{margin-left:-1.25rem;padding:0.1875rem 0.625rem 0.1875rem 1.25rem;display:inline-block}@media (min-width: 46.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__labels--immersive{margin-left:-0.625rem;max-width:19.375rem;padding:0.375rem 0.625rem}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__labels--immersive .badge-slot{width:auto}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__label__link{color:#ffffff}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container{margin-top:-6.25rem;position:relative;background:transparent}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container:after{position:absolute;content:'';display:none;width:50%;right:0;background-color:#121212;z-index:0;top:0;bottom:0}@media (min-width: 30em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container:after{display:block}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__labels--immersive{position:absolute;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .gs-container{padding:0}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .badge-slot{float:left;margin-right:0.3125rem}@media (min-width: 46.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .badge-slot{margin-right:0.625rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column{background-color:#121212;z-index:10;position:relative;padding-left:1.25rem;padding-right:0.75rem;left:-1.25rem;padding-top:0;width:calc(90vw - 1.25rem);padding-bottom:0.75rem;min-height:7rem}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column::before{display:none}@media (min-width: 46.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column{padding-left:0.625rem;width:100%;left:0.625rem}}@media (min-width: 61.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column{left:0.625rem}}@media (min-width: 71.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column{margin-left:10rem}}@media (min-width: 81.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column{margin-left:15rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__headline--immersive{font-size:2.125rem;line-height:2.375rem;color:#121212;padding:0;padding-bottom:1.5rem;font-weight:700}@media (min-width: 61.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__headline--immersive{font-size:3.125rem;line-height:3.5rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__headline--immersive.content__headline--immersive--with-main-media{color:#ffffff}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__headline--immersive.content__headline--immersive--with-main-media:before{display:none}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:300;position:relative;padding-left:0;margin-top:0.375rem;max-width:17.5rem;margin-bottom:0.75rem;margin-left:0}@media (min-width: 46.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article{max-width:25rem;margin-top:0}}@media (min-width: 61.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article{max-width:28.75rem;padding-bottom:1rem;margin-bottom:-1.5rem;margin-top:0.375rem;margin-left:-0.625rem}}@media (min-width: 71.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article{margin-left:0}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article:before{position:absolute;top:-2.25rem;bottom:-1.5rem;left:-0.625rem;width:0.0625rem;background-color:#dcdcdc;content:'';display:none}@media (min-width: 71.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article:before{display:block;bottom:-2.25rem}}@media (min-width: 71.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article[lang='ar']{margin-left:auto}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__standfirst--immersive-article[lang='ar']:before{display:none}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:-0.625rem;margin-right:-0.625rem;padding-left:0.625rem;padding-right:0.625rem}@media (min-width: 30em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}}@media (min-width: 41.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:0;margin-right:0;padding-left:0;padding-right:0}}@media (min-width: 61.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:-0.625rem}}@media (min-width: 71.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:-10rem}}@media (min-width: 81.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container{margin-left:-15rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .meta__extras{margin-left:-0.625rem;margin-right:-0.625rem}@media (min-width: 30em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .meta__extras{margin-left:-1.25rem;margin-right:-1.25rem}}@media (min-width: 41.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .meta__extras{margin-left:0;margin-right:0;padding-left:0;padding-right:0}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__meta-container:before{display:none}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .drop-cap{height:6.5625rem}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .drop-cap .drop-cap__inner{font-weight:900;font-size:8.75rem;line-height:.7}@media (min-width: 46.25em){.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .drop-cap .drop-cap__inner{font-size:8.625rem}}.content--immersive:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .element-pullquote{padding:0.375rem;padding-bottom:0.75rem}.content--pillar-news.content--immersive-article:not(.paid-content) .u-underline{color:#c70000;border-bottom:0.0625rem solid rgba(199,0,0,0.4)}.content--pillar-news.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#c70000}.content--pillar-news.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#c70000}.content--pillar-opinion.content--immersive-article:not(.paid-content) .u-underline{color:#e05e00;border-bottom:0.0625rem solid rgba(224,94,0,0.4)}.content--pillar-opinion.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#e05e00}.content--pillar-opinion.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#e05e00}.content--pillar-sport.content--immersive-article:not(.paid-content) .u-underline{color:#0084c6;border-bottom:0.0625rem solid rgba(0,132,198,0.4)}.content--pillar-sport.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#0084c6}.content--pillar-sport.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#0084c6}.content--pillar-arts.content--immersive-article:not(.paid-content) .u-underline{color:#a1845c;border-bottom:0.0625rem solid rgba(161,132,92,0.4)}.content--pillar-arts.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#a1845c}.content--pillar-arts.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#a1845c}.content--pillar-lifestyle.content--immersive-article:not(.paid-content) .u-underline{color:#bb3b80;border-bottom:0.0625rem solid rgba(187,59,128,0.4)}.content--pillar-lifestyle.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#bb3b80}.content--pillar-lifestyle.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#bb3b80}.content--pillar-special-report.content--immersive-article:not(.paid-content) .u-underline{color:#3f464a;border-bottom:0.0625rem solid rgba(63,70,74,0.4)}.content--pillar-special-report.content--immersive-article:not(.paid-content) .u-underline:hover{border-bottom-color:#3f464a}.content--pillar-special-report.content--immersive-article:not(.paid-content) .element-pullquote.element--showcase .pullquote-paragraph{color:#3f464a}@font-face{font-family:'Guardian Titlepiece';src:url("https://interactive.guim.co.uk/fonts/garnett/GTGuardianTitlepiece-Bold.woff2") format("woff2"),url("https://interactive.guim.co.uk/fonts/garnett/GTGuardianTitlepiece-Bold.woff") format("woff"),url("https://interactive.guim.co.uk/fonts/garnett/GTGuardianTitlepiece-Bold.ttf") format("truetype");font-weight:700;font-style:normal}.content.content--article.content--type-numbered-list{counter-reset:section}@media (max-width: 46.24em){.content.content--article.content--type-numbered-list .content__article-body figure.element--thumbnail{float:right;margin-left:1.25rem;margin-right:0}}.content.content--article.content--type-numbered-list .content__article-body .element--thumbnail img{border-radius:50%;overflow:hidden}.content.content--article.content--type-numbered-list .content__article-body ul.article-link{display:block;position:relative;margin-left:-0.625rem;margin-right:-0.625rem;margin-top:1.5rem;margin-bottom:2.25rem}@media (min-width: 30em){.content.content--article.content--type-numbered-list .content__article-body ul.article-link{margin-left:-1.25rem;margin-right:-1.25rem}}@media (min-width: 46.25em){.content.content--article.content--type-numbered-list .content__article-body ul.article-link{margin-right:0}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .content__article-body ul.article-link{margin-left:-0.625rem}}.content.content--article.content--type-numbered-list .content__article-body ul.article-link:after{content:'';border-bottom:0.0625rem solid #dcdcdc;position:absolute;left:0;right:0;top:0}.content.content--article.content--type-numbered-list .content__article-body ul.article-link li{border:0.0625rem solid #dcdcdc;padding:0.75rem 0.625rem 1.125rem !important;margin:0 0.625rem;max-width:28.125rem}@media (min-width: 30em){.content.content--article.content--type-numbered-list .content__article-body ul.article-link li{margin:0 1.25rem}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .content__article-body ul.article-link li{margin-left:0}}.content.content--article.content--type-numbered-list .content__article-body ul.article-link li a{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:800}.content.content--article.content--type-numbered-list .content__article-body ul.article-link li strong{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:400;color:#767676;display:block}.content.content--article.content--type-numbered-list .content__article-body ul.article-link li:before{content:none !important}.content.content--article.content--type-numbered-list .content__article-body>h2{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:700;box-sizing:border-box;border-top:0.25rem solid #dcdcdc;color:#121212;min-height:5rem;position:relative;margin-left:-0.625rem;margin-right:-0.625rem;margin-top:3rem;padding:0.1875rem 0.625rem 0.75rem 5.5rem}@media (min-width: 30em){.content.content--article.content--type-numbered-list .content__article-body>h2{margin-left:-1.25rem;margin-right:-1.25rem;padding:0.1875rem 1.25rem 0.75rem 6.125rem}}@media (min-width: 46.25em){.content.content--article.content--type-numbered-list .content__article-body>h2{font-size:2.125rem;line-height:2.375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-weight:700;margin-right:0;margin-top:6rem;min-height:6.9375rem;padding:0.375rem 0.625rem 0.75rem 8.0625rem}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .content__article-body>h2{min-height:auto;margin-left:-0.625rem;padding:0.375rem 0.625rem 0.75rem}}.content.content--article.content--type-numbered-list .content__article-body>h2 strong{display:block;font-weight:700}.content.content--article.content--type-numbered-list .content__article-body>h2:before{font-family:'Guardian Titlepiece', Georgia, serif;font-size:3.75rem;line-height:3.75rem;content:counter(section);box-sizing:border-box;counter-increment:section;border:0.0625rem solid #dcdcdc;border-top-width:0.25rem;font-variant-numeric:lining-nums;height:4.25rem;width:4.25rem;color:#fff;-webkit-text-stroke-width:0.0625rem;-webkit-text-stroke-color:#dcdcdc;text-align:center;position:absolute;top:-0.25rem;left:0.625rem}@media (min-width: 46.25em){.content.content--article.content--type-numbered-list .content__article-body>h2:before{line-height:5.5rem;font-size:5.5rem;height:6.1875rem;width:6.1875rem;left:1.25rem}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .content__article-body>h2:before{left:0.0625rem;top:-0.25rem;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.content.content--article.content--type-numbered-list .falseH3{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;border-top:0.0625rem solid #dcdcdc;color:#121212;margin-top:1.5rem;margin-bottom:0.1875rem;margin-left:-0.625rem;margin-right:-0.625rem;padding:0.1875rem 0.625rem 0.375rem}@media (min-width: 30em){.content.content--article.content--type-numbered-list .falseH3{padding:0.1875rem 1.25rem 0.375rem;margin-left:-1.25rem;margin-right:-1.25rem}}@media (min-width: 46.25em){.content.content--article.content--type-numbered-list .falseH3{display:block;margin-left:-1.25rem;margin-right:0;font-size:1.5rem;line-height:1.75rem}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .falseH3{margin-left:-0.625rem;padding:0.1875rem 0.625rem 0.375rem}}.content.content--article.content--type-numbered-list .stars{box-sizing:border-box;font-size:1.25rem;line-height:1;height:1.875rem;letter-spacing:0.125rem;margin:0 0 0.75rem -0.625rem;position:relative;z-index:1000}@media (min-width: 30em){.content.content--article.content--type-numbered-list .stars{margin-left:-1.25rem}}@media (min-width: 46.25em){.content.content--article.content--type-numbered-list .stars{margin-left:0}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .stars{margin-left:-0.625rem}}@media (min-width: 71.25em){.content.content--article.content--type-numbered-list .stars+.element-image{margin-top:-2.625rem}}.content--pillar-news.content--type-numbered-list h2 strong{color:#c70000}.content--pillar-opinion.content--type-numbered-list h2 strong{color:#e05e00}.content--pillar-sport.content--type-numbered-list h2 strong{color:#0084c6}.content--pillar-arts.content--type-numbered-list h2 strong{color:#a1845c}.content--pillar-lifestyle.content--type-numbered-list h2 strong{color:#bb3b80}.content--pillar-special-report.content--type-numbered-list h2 strong{color:#3f464a}@supports (display: grid){@media (min-width: 71.25em){.content.content--article.content--type-splash .content__head--article{grid-template-areas:'media-primary media-primary' 'series-tab content-headline' '. content-standfirst';grid-template-columns:auto 39.375rem}}@media (min-width: 81.25em){.content.content--article.content--type-splash .content__head--article{grid-template-columns:auto 44.375rem}}}.content.content--article.content--type-splash .media-primary{margin-bottom:-2.875rem}@media (max-width: 29.99em){@supports (object-fit: cover) and (height: 1vh){.content.content--article.content--type-splash .media-primary{height:90vw}.content.content--article.content--type-splash .media-primary .u-responsive-ratio{position:unset}.content.content--article.content--type-splash .media-primary img{height:90vw;object-fit:cover}}}@media (min-width: 71.25em){.content.content--article.content--type-splash .media-primary{grid-area:media-primary;margin-bottom:-4.375rem;max-height:35rem;overflow:hidden}}.content.content--article.content--type-splash .content__labels--splash{margin-right:1.25rem;padding:0.375rem 0.625rem;-webkit-order:0;-ms-flex-order:0;order:0}@media (min-width: 30em) and (max-width: 46.24em){.content.content--article.content--type-splash .content__labels--splash{padding-left:1.25rem}}@media (min-width: 71.25em){.content.content--article.content--type-splash .content__labels--splash{grid-area:series-tab;margin-right:0;padding:0.375rem 0.625rem 3rem}@supports (display: grid){.content.content--article.content--type-splash .content__labels--splash{width:9.375rem}}}@media (min-width: 81.25em){@supports (display: grid){.content.content--article.content--type-splash .content__labels--splash{width:14.375rem}}}.content.content--article.content--type-splash .content__headline-splash-wrapper{border-top:0.0625rem solid rgba(0,0,0,0.2);box-sizing:border-box;margin:0 1.25rem 0 0;padding:0 0.625rem 2.25rem;position:relative;z-index:1015}@media (min-width: 30em) and (max-width: 46.24em){.content.content--article.content--type-splash .content__headline-splash-wrapper{padding-left:1.25rem}}@media (min-width: 41.25em) and (max-width: 46.24em){.content.content--article.content--type-splash .content__headline-splash-wrapper{margin-left:1.25rem}}@media (min-width: 71.25em){.content.content--article.content--type-splash .content__headline-splash-wrapper{border-top:0;grid-area:content-headline;max-width:39.375rem;padding-bottom:3rem}@supports (display: grid){.content.content--article.content--type-splash .content__headline-splash-wrapper{border-left:0.0625rem solid rgba(0,0,0,0.2)}}}.content.content--article.content--type-splash .content__headline-splash-wrapper .stars{bottom:0;margin-bottom:0;position:absolute}@media (max-width: 41.24em){.content.content--article.content--type-splash .content__headline-splash-wrapper .stars{margin-left:-0.625rem}}@media (max-width: 41.24em) and (min-width: 30em){.content.content--article.content--type-splash .content__headline-splash-wrapper .stars{margin-left:-1.25rem}}@media (min-width: 46.25em){.content.content--article.content--type-splash .content__headline-standfirst-wrapper{padding-bottom:1.5rem}.content.content--article.content--type-splash .content__headline-standfirst-wrapper .content__standfirst{font-size:1.5rem;line-height:1.75rem}}@media (min-width: 71.25em){@supports (display: grid){.content.content--article.content--type-splash .content__headline-standfirst-wrapper{grid-area:content-standfirst;padding-left:0.625rem;padding-right:0.625rem}}}@media (max-width: 46.24em){.content.content--article.content--type-splash .content__meta-container{margin:1.5rem -0.625rem 0}}@media (min-width: 71.25em){.content.content--article.content--type-splash .content__meta-container{float:left;position:relative}}.content.content--article.content--type-splash .content__headline--splash{color:#ffffff;padding:0}@media (min-width: 46.25em){.content.content--article.content--type-splash .content__headline--splash{font-size:2.125rem;line-height:2.375rem}}.content.content--article.content--type-splash .content__series-label--splash .content__label__link{color:#ffffff;font-weight:700}.content.content--article.content--type-splash.content--pillar-special-report .content__label__link{color:#ffe500}.content.content--article.content--type-splash.content--type-comment .content__headline-splash-wrapper{overflow:hidden}.content.content--article.content--type-splash.content--type-comment .content__headline-splash-wrapper .content__header{background:none}.content.content--article.content--type-splash.content--type-comment .content__headline--byline .tone-colour{color:#ffffff;font-style:normal;font-weight:700}.content.content--article.content--type-splash.content--type-comment .content__labels--splash:hover{background-color:#bd5318}.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .content__headline-splash-wrapper{padding-bottom:0}.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .content__headline--byline{padding-bottom:2.25rem}@media (max-width: 71.24em){.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .content__headline--byline{padding-right:8.75rem}}.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .content__header{min-height:9rem}@media (min-width: 71.25em){.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .content__header{padding-right:8.75rem}}.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .byline-img{position:relative;right:-1.875rem}@media (min-width: 71.25em){.content.content--article.content--type-splash.content--type-comment .content__head--byline-pic .byline-img{position:absolute}}.content.content--article.content--type-splash .content__article-body .content__meta-container+*{padding-top:0.1875rem}@media (min-width: 71.25em){.content.content--article.content--type-splash .content__article-body .content__meta-container+*{border-top:0.0625rem solid #dcdcdc;margin-top:-0.0625rem}}@media (max-width: 71.24em){.content__series-cta{float:right}}@media (min-width: 71.25em){.content__series-cta{bottom:0.375rem;position:absolute}}.content__series-cta__text{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#ffffff;font-weight:700;vertical-align:middle}.content__series-cta__icon{background-color:#ffffff;height:2.125rem;width:2.125rem}.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash){background-color:#eff1f2}.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .content__headline--byline .tone-colour{background-color:#ffe500}.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .content__series-label .content__label__link{box-shadow:-0.1875rem 0 0 0 #ffe500,0.1875rem 0 0 0 #ffe500}@media (min-width: 71.25em){.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .content__series-label .content__label__link{line-height:1.5rem}}.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .content__series-label .content__label__link .label__link-wrapper{background:#ffe500;position:relative}@media (min-width: 71.25em){.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .badge-slot{margin-left:-0.1875rem}}@media (min-width: 71.25em){.content--pillar-special-report:not(.content--type-immersive):not(.content--media):not(.content--type-splash) .content__labels{margin-bottom:0.375rem;padding-left:0.1875rem}}.content--immersive.content--pillar-special-report:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__labels{background-color:#ffe500}.content--immersive.content--pillar-special-report:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .content__labels .content__series-label__link{color:#121212}.content--immersive.content--pillar-special-report:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container .content__main-column,.content--immersive.content--pillar-special-report:not(.immersive-main-media__gallery):not(.paid-content):not(.content--gallery):not(.content--minute-article) .immersive-main-media__headline-container::after{background-color:#3f464a}.content--pillar-special-report.content--media:not(.paid-content){background-color:#2f3437}.content--minute-article{border-top:0 none}@media (max-width: 29.99em){.content .gs-container--minute-article{padding:0}}.content--minute-article--overlay{display:block;position:absolute;top:0;bottom:0;background:rgba(0,0,0,0.4);background:linear-gradient(to bottom, rgba(0,0,0,0) 20%, #000 90%);width:100%}.content__headline--minute{color:#ffffff;position:relative;padding-bottom:0.75rem}@media (min-width: 41.25em){.content__headline--minute:after{background-color:#00b2ff;content:'';height:0.25rem;width:20rem;position:absolute;top:-0.25rem;left:0}}@media (min-width: 46.25em){.content__headline--minute{font-size:2.75rem;width:28.75rem}}@media (min-width: 61.25em){.content__headline--minute{font-size:4rem;margin-left:5rem;width:38.75rem}.content__headline--minute:after{width:23.75rem}}.content__standfirst--immersive-minute-article:before{content:none}.content--minute-article .badge-slot,.content--minute-article .logo--minute-article{display:block;float:left}.content--minute-article .badge-slot{position:absolute;top:0.375rem}.content--minute-article .badge-slot svg{height:auto;max-height:2.9375rem;width:100%}.content--minute-article .badge-slot__img{height:4.125rem;width:4.125rem}.content--minute-article .logo--minute-article{height:8.25rem;position:absolute;top:-10.5rem}@media (max-width: 29.99em){.content--minute-article .logo--minute-article{display:none}}@media (min-width: 61.25em){.content--minute-article .logo--minute-article{height:11.25rem;top:-14.25rem;left:-4.875rem}}.content--minute-article .logo--minute-article svg{height:100%;width:auto;max-width:11.8125rem}@media (min-width: 61.25em){.content--minute-article .logo--minute-article svg{max-width:14rem}}.content--minute-article .content__standfirst{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900}@media (min-width: 46.25em){.content--minute-article .content__dateline--minute-article,.content--minute-article .content__standfirst{max-width:18.75rem;margin-left:0}}@media (min-width: 61.25em){.content--minute-article .content__dateline--minute-article,.content--minute-article .content__standfirst{max-width:23.75rem;margin-left:5rem}}.content__dateline--minute-article{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900;color:#00b2ff;margin-bottom:0}.content__main-column--minute-article{margin:0 auto;max-width:none;width:100%}.content__main-column--minute-article .submeta{margin:0 auto;padding:0 0.625rem}@media (min-width: 30em){.content__main-column--minute-article .submeta{padding:0 1.25rem}}@media (min-width: 46.25em){.content__main-column--minute-article .submeta{width:38.75rem}}@media (min-width: 61.25em){.content__main-column--minute-article .submeta{width:53.75rem}}@media (min-width: 71.25em){.content__main-column--minute-article .submeta{width:58.75rem}}.article__container--minute-article{background-color:#dcdcdc;padding-bottom:0.75rem}.block--minute-article{overflow:hidden;position:relative;width:100%}.block--minute-article:before{background-color:rgba(39,193,224,0.8);content:'';height:0.25rem;width:20rem;z-index:2;right:0}.block--minute-article .block-elements{padding:0.375rem 0 0}.block--minute-article .block-elements .block-title{font-weight:100;margin-bottom:0.375rem}.block--minute-article figure.element-image{margin-bottom:0;width:100%;z-index:1}@media (max-width: 29.99em){.block--minute-article{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100vh;min-height:35rem}.block--minute-article:before{margin-top:auto;width:8.75rem;margin-left:0.625rem}.block--minute-article .block-elements{padding-left:0.625rem;padding-right:0.625rem}.block--minute-article .block-elements .block-title{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal}.block--minute-article.block--minute-article--embed{-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.block--minute-article.block--minute-article--embed:before{margin-top:0}}@media (min-width: 46.25em){.block--minute-article{max-width:38.75rem;margin-top:0.75rem;margin-bottom:2.25rem}.block--minute-article:before{width:33.75rem;position:absolute;left:0}.block--minute-article .block-elements{box-sizing:border-box;width:13.75rem;float:left;margin-right:1.25rem}.block--minute-article .block-elements .block-title{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal}.block--minute-article figure.element-image{margin-top:0;width:23.75rem;display:inline-block}}@media (min-width: 61.25em){.block--minute-article{max-width:48.75rem;margin-bottom:4.5rem;margin-left:5rem}.block--minute-article:before{width:38.75rem}.block--minute-article .block-elements{width:18.75rem}.block--minute-article figure.element-image{width:28.75rem}}@media (min-width: 71.25em){.block--minute-article{max-width:53.75rem;margin-left:5rem}.block--minute-article:before{width:48.75rem}.block--minute-article .block-elements{width:23.75rem}.block--minute-article figure.element-image{width:28.75rem}}@media (min-width: 81.25em){.block--minute-article{max-width:58.75rem}.block--minute-article figure.element-image{width:33.75rem}}@media (min-width: 46.25em){.block--minute-article--alt-layout{margin-left:5rem}.block--minute-article--alt-layout:before{right:0;left:auto}.block--minute-article--alt-layout .block-elements{float:right;margin-left:1.25rem;margin-right:0}}@media (min-width: 61.25em){.block--minute-article--alt-layout{margin-left:10rem}}@media (min-width: 81.25em){.block--minute-article--alt-layout{margin-left:15rem}}.block--minute-article--counter{color:#00b2ff}@media (max-width: 61.24em){.block--minute-article--counter{font-weight:700}}@media (min-width: 61.25em){.block--minute-article--counter{display:block;font-size:4.375rem;line-height:4.625rem;letter-spacing:-0.3125rem;font-weight:100;margin-top:-0.25rem}}.block--minute-article .updated-time{display:none}.block--minute-article a,.block--minute-article .u-fauxlink{color:#333}.block--minute-article p a{border-bottom:0.0625rem solid rgba(0,178,255,0.6)}.block--minute-article p a:hover{border-bottom-color:#00b2ff}.block--minute-article p a:active{color:#00b2ff;border-bottom-color:#00b2ff}.block--minute-article .caption__minute-article{box-sizing:border-box;padding:0.1875rem 1.25rem 0.375rem 0.625rem;width:100%}@media (min-width: 30em){.block--minute-article .caption__minute-article{padding-left:0}}.block--minute-article .tweet-main-image{display:none}.from-content-api .block--minute-article blockquote.quoted{color:#333;margin-top:0.375rem;margin-bottom:0}.from-content-api .block--minute-article blockquote.quoted .inline-quote{fill:#00b2ff}.block--minute-article.block--minute-article--quote .inline-quote{position:relative;display:block}.block--minute-article.block--minute-article--quote .quoted{margin:0}.block--minute-article.block--minute-article--quote .inline-quote svg{width:3.125rem;height:2.125rem}.block--minute-article.block--minute-article--quote .quoted__contents{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;font-style:normal;font-weight:100;margin-left:0}@media (min-width: 46.25em){.block--minute-article.block--minute-article--quote{margin-left:0}.block--minute-article.block--minute-article--quote:before{width:18.75rem}.block--minute-article.block--minute-article--quote .block-elements{width:38.75rem}}@media (min-width: 61.25em){.block--minute-article.block--minute-article--quote{margin-left:5rem}.block--minute-article.block--minute-article--quote .quoted__contents{font-size:2.125rem;line-height:2.375rem}.block--minute-article.block--minute-article--quote .block-elements{width:48.75rem}}@media (min-width: 71.25em){.block--minute-article.block--minute-article--quote{margin-left:10rem}}@media (min-width: 46.25em){.block--minute-article--alt-layout.block--minute-article--quote{margin-left:5rem}}@media (min-width: 61.25em){.block--minute-article--alt-layout.block--minute-article--quote{margin-left:10rem}}@media (min-width: 71.25em){.block--minute-article--alt-layout.block--minute-article--quote{margin-left:20rem}}@media (max-width: 29.99em){.block--minute-article--video .element-video{margin-left:-0.625rem;margin-right:-0.625rem}}@media (min-width: 46.25em){.block--minute-article--video{width:33.75rem}.block--minute-article--video:before{width:13.75rem}.block--minute-article--video .block-elements{width:33.75rem}.block--minute-article--video .caption__minute-article{background-color:transparent;padding-left:0;padding-bottom:1.5rem}}@media (min-width: 61.25em){.block--minute-article--video{width:43.75rem}.block--minute-article--video .block-elements{width:43.75rem}}@media (min-width: 71.25em){.block--minute-article--video{width:58.75rem}.block--minute-article--video .block-elements{width:58.75rem}}@media (min-width: 46.25em){.block--minute-article--tweet{width:23.75rem;margin-left:10rem}.block--minute-article--tweet:before{width:13.75rem}.block--minute-article--tweet .block-elements{width:23.75rem}}@media (min-width: 61.25em){.block--minute-article--tweet{width:28.75rem;margin-left:25rem}.block--minute-article--tweet .block-elements{width:28.75rem}}@media (min-width: 71.25em){.block--minute-article--tweet{margin-left:30rem}}@media (min-width: 46.25em){.block--minute-article--alt-layout.block--minute-article--tweet{margin-left:5rem}}@media (min-width: 61.25em){.block--minute-article--alt-layout.block--minute-article--tweet{margin-left:10rem}}@media (min-width: 71.25em){.block--minute-article--alt-layout.block--minute-article--tweet{margin-left:20rem}}.block--minute-article--tweet:before,.block--minute-article--video:before,.block--minute-article--quote:before{left:0}.block--minute-article--tweet .block-elements,.block--minute-article--video .block-elements,.block--minute-article--quote .block-elements{margin-left:0;margin-right:0;float:none}@media (min-width: 61.25em){.block--minute-article--shorty{position:relative;overflow:visible}.block--minute-article--shorty .block--minute-article--counter{position:absolute;width:5rem;top:0.25rem;left:-5rem;border-top:0.25rem solid #00b2ff}}@supports (object-fit: cover){@media (max-width: 29.99em){.block--minute-article--background-image{color:#ffffff}.block--minute-article--background-image p{font-weight:700}.block--minute-article--background-image a{color:#ffffff}.block--minute-article--background-image .block-elements{margin-bottom:3rem;position:relative;z-index:3}.block--minute-article--background-image .element--inline{position:absolute;top:0;bottom:0;z-index:1;margin-top:0}.block--minute-article--background-image .element--inline:after{content:'';display:block;position:absolute;top:0;bottom:0;background:rgba(0,0,0,0.4);background:linear-gradient(to bottom, rgba(0,0,0,0) 30%, #000 100%);width:100%}.block--minute-article--background-image .element--inline .element--inline__image-wrapper{height:100%}.block--minute-article--background-image .element--inline .gu-image{height:100vh;width:100vw;object-fit:cover}.block--minute-article--background-image .caption__minute-article{background-color:transparent;color:rgba(255,255,255,0.5);min-height:1.5rem;position:absolute;bottom:0;z-index:2}}}.immersive-header-container{background-color:#121212}.immersive-main-media__headline-container--gallery{margin-top:-6.25rem;position:relative}@media (min-width: 46.25em){.immersive-main-media__headline-container--gallery:after{content:'';display:block;position:absolute;width:50%;right:0;background-color:#121212;z-index:0;top:0;bottom:0}}@media (max-width: 46.24em){.immersive-main-media__headline-container--gallery .gs-container{padding-left:0}}.immersive-main-media__headline-container--gallery .content__main-column{background-color:#121212;margin-left:-0.625rem;padding:0 0.625rem 1.5rem;min-height:5.25rem;position:static}@media (min-width: 46.25em){.immersive-main-media__headline-container--gallery .content__main-column{margin-left:1.25rem}}@media (min-width: 61.25em){.immersive-main-media__headline-container--gallery .content__main-column{margin-left:15.625rem}}.immersive-main-media__headline-container--gallery .content__headline{font-size:2.125rem;line-height:2.375rem;font-weight:700;padding:0 0.625rem}@media (min-width: 30em){.immersive-main-media__headline-container--gallery .content__headline{padding-left:1.25rem}}@media (min-width: 46.25em){.immersive-main-media__headline-container--gallery .content__headline{padding-left:0;position:relative;z-index:1}}@media (min-width: 61.25em){.immersive-main-media__headline-container--gallery .content__headline{font-size:3.125rem;line-height:3.5rem;width:38.125rem}}.immersive-main-media__headline-container--gallery .content__headline--paidgallery{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:2rem;line-height:2.1875rem}@media (min-width: 61.25em){.immersive-main-media__headline-container--gallery .content__headline--paidgallery{font-size:3.125rem;line-height:3.375rem}}.immersive-main-media__headline-container--gallery .content__labels{margin-left:0;position:absolute;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:auto;padding:0.25rem 0.625rem}@media (min-width: 30em){.immersive-main-media__headline-container--gallery .content__labels{padding-left:1.25rem}}@media (min-width: 46.25em){.immersive-main-media__headline-container--gallery .content__labels{padding:0.375rem 0.625rem;margin-left:-0.625rem}}.immersive-main-media__headline-container--gallery .content__series-label{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;color:#fff}.immersive-main-media__headline-container--gallery .content__labels--paidgallery{font-size:1.125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background:#69d1ca}.immersive-main-media__headline-container--gallery .content__labels--paidgallery .content__label__link{color:#121212}.immersive-main-media__headline-container--gallery .content__series-label,.immersive-main-media__headline-container--gallery .content__labels--paidgallery,.immersive-main-media__headline-container--gallery .content__section-label--advertisement{font-size:1rem;font-weight:700}@media (min-width: 61.25em){.immersive-main-media__headline-container--gallery .content__series-label,.immersive-main-media__headline-container--gallery .content__labels--paidgallery,.immersive-main-media__headline-container--gallery .content__section-label--advertisement{font-size:1.25rem}}.content--gallery .tonal__head{border-bottom:solid 0.0625rem #333}.content--gallery .tonal__head .content__main-column--gallery{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-bottom:1.5rem}@media (min-width: 46.25em){.content--gallery .tonal__head .content__main-column--gallery{padding-left:0.625rem;border-left:solid 0.0625rem #333}}@media (min-width: 61.25em){.content--gallery .tonal__head .content__main-column--gallery{margin-left:14.375rem}}.content--gallery .tonal__head .meta__extras{border-top:solid 0.0625rem #333;margin-top:0.75rem;padding:0}@media (min-width: 61.25em){.content--gallery .tonal__head .meta__extras{position:absolute;width:13.75rem;margin-top:0;top:0;margin-left:-15rem}}.content--gallery .tonal__head .social-icon__svg path{fill:#dcdcdc}.content--gallery .tonal__head .meta__numbers,.content--gallery .tonal__head .meta__social{display:inline-block}.content--gallery .tonal__head .meta__numbers{float:right;padding-top:0.375rem}.content--gallery .tonal__head .meta__numbers .sharecount__value,.content--gallery .tonal__head .meta__numbers a{color:#767676}.content--gallery .tonal__head .meta__numbers .inline-tone-fill{fill:#767676}.content--gallery .tonal__head .content__meta-container,.content--gallery .tonal__head .gallery__meta-container,.content--gallery .tonal__head .tonal__standfirst,.content--gallery .tonal__head .badge{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.content--gallery .tonal__head .tonal__standfirst{max-width:18.125rem;margin:0}@media (min-width: 46.25em){.content--gallery .tonal__head .tonal__standfirst{max-width:25rem}}@media (min-width: 61.25em){.content--gallery .tonal__head .tonal__standfirst{max-width:28.75rem}}.content--gallery .tonal__head .content__meta-container{-webkit-order:4;-ms-flex-order:4;order:4;padding-top:0;background-image:none;position:relative;margin:0;min-height:0;max-width:38.75rem}@media (min-width: 61.25em){.content--gallery .tonal__head .content__meta-container{-webkit-order:1;-ms-flex-order:1;order:1}}.content--gallery .tonal__head .content__standfirst{margin-bottom:0.75rem}.content--gallery .tonal__head .content__standfirst--advertisement{font-size:1rem;line-height:1.375rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.content--gallery .tonal__head .byline,.content--gallery .tonal__head .content__dateline{background-image:none;border:0;padding:0}.content--gallery .tonal__head .byline>span{font-style:italic;font-weight:700;margin-bottom:0.75rem;max-width:80%}@media (min-width: 46.25em){.content--gallery .tonal__head .byline>span{max-width:100%}}.content--gallery .tonal__head .gallery__meta-container{-webkit-order:3;-ms-flex-order:3;order:3;padding-top:0}.content--gallery .tonal__head .gallery__meta-container .badge{-webkit-order:5;-ms-flex-order:5;order:5;margin-top:0.375rem;margin-bottom:0;padding:0}@media (min-width: 46.25em){.content--gallery .tonal__head .gallery__meta-container .badge{margin-top:0.75rem}}.immersive-header-container--photo-essay{background-color:#fff}@media (min-width: 61.25em){.immersive-header-container--photo-essay .content__main-column{margin-left:0}}@media (min-width: 71.25em){.immersive-header-container--photo-essay .content__main-column{margin-left:11.25rem}}@media (min-width: 81.25em){.immersive-header-container--photo-essay .content__main-column{margin-left:15.625rem}}.caption.caption--gallery{color:#dcdcdc;z-index:1}@media (max-width: 61.24em){.caption.caption--gallery{margin:0.75rem 0 0.375rem}}@media (min-width: 61.25em){.caption.caption--gallery{padding-top:0.1875rem;position:absolute;top:6.25rem;width:13.75rem;-webkit-transform:translateX(-100%);transform:translateX(-100%);margin-left:-1.25rem}}.caption.caption--gallery .inline-icon__svg{fill:#dcdcdc}@media (max-width: 71.24em){.badge-slot{float:left;margin-right:0.625rem}}@media (min-width: 61.25em){article:not(.content--type-immersive) .badge-slot{margin-bottom:0.375rem}}.badge-slot__img{display:block;height:2.625rem;width:auto}@media (min-width: 71.25em){.badge-slot__img{height:3.375rem}}.gu-image{width:100%}.from-content-api{word-wrap:break-word;position:relative}.from-content-api>p,.from-content-api ul,.from-content-api ol,.from-content-api address,.from-content-api .block-elements>p,.from-content-api .block-elements ul,.from-content-api .block-elements ol,.from-content-api .block-elements address{margin:0 0 0.75rem;padding:0}@media (min-width: 46.25em){.from-content-api>p,.from-content-api ul,.from-content-api ol,.from-content-api address,.from-content-api .block-elements>p,.from-content-api .block-elements ul,.from-content-api .block-elements ol,.from-content-api .block-elements address{margin-bottom:1rem}}.from-content-api>ol,.from-content-api>blockquote>ul,.from-content-api .block-elements>ol,.from-content-api .block-elements>blockquote>ul{margin-top:.8em}.from-content-api>li,.from-content-api>ol,.from-content-api>blockquote ul,.from-content-api .block-elements>li,.from-content-api .block-elements>ol,.from-content-api .block-elements>blockquote ul{list-style:none}.from-content-api>ol,.from-content-api .block-elements>ol{counter-reset:li}.from-content-api>ol>li:before,.from-content-api .block-elements>ol>li:before{font-size:1.0625rem;line-height:1.25rem;content:counter(li);counter-increment:li;margin-right:0.25rem}.from-content-api>ul ul,.from-content-api>ol ol,.from-content-api .block-elements>ul ul,.from-content-api .block-elements>ol ol{margin-left:1.25rem}.from-content-api>ol li,.from-content-api>ul li,.from-content-api .block-elements>ol li,.from-content-api .block-elements>ul li{position:relative;margin-bottom:.8em}.from-content-api>h2,.from-content-api .block-elements>h2{font-size:1.0625rem;line-height:1.25rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:900}@media (min-width: 46.25em){.from-content-api>h2,.from-content-api .block-elements>h2{font-size:1.25rem;line-height:1.4375rem;margin-bottom:0.0625rem}}.from-content-api>h3,.from-content-api .block-elements>h3{font-size:1.0625rem;line-height:1.5rem;font-family:"Guardian Text Egyptian Web",Georgia,serif;font-weight:bold;margin:0}.from-content-api>p+h2,.from-content-api>figure+h2,.from-content-api>video+h2,.from-content-api .block-elements>p+h2,.from-content-api .block-elements>figure+h2,.from-content-api .block-elements>video+h2{margin-top:1.5rem}@media (min-width: 46.25em){.from-content-api>p+h2,.from-content-api>figure+h2,.from-content-api>video+h2,.from-content-api .block-elements>p+h2,.from-content-api .block-elements>figure+h2,.from-content-api .block-elements>video+h2{margin-top:1.6875rem}}.from-content-api>p+h3,.from-content-api>figure+h3,.from-content-api>video+h3,.from-content-api .block-elements>p+h3,.from-content-api .block-elements>figure+h3,.from-content-api .block-elements>video+h3{margin-top:0.75rem}.from-content-api blockquote{font-style:italic;margin:1rem 0 1.75rem 1.5rem}@media (min-width: 46.25em){.from-content-api blockquote{margin-left:1.75rem}}.from-content-api blockquote.quoted{color:#767676;margin-left:initial;overflow:auto}.is-breuer-mode .from-content-api p{margin-bottom:0}.is-breuer-mode .from-content-api p+p,.is-breuer-mode .from-content-api .element--thumbnail+p,.is-breuer-mode .from-content-api .element--supporting+p{text-indent:1.875rem}.from-content-api pre{word-wrap:normal;background-color:#aab9d0;border:0.0625rem solid #899dbe;padding:0.5625rem 0.9375rem;border-radius:0.25rem}.bullet{font-size:0.00625rem;line-height:0.00625rem;color:transparent}.bullet:before{display:inline-block;content:'';border-radius:0.375rem;height:0.75rem;width:0.75rem;margin-right:0.125rem;background-color:#dcdcdc}.from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players),.content__standfirst ul{list-style:none}.from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players)>li,.content__standfirst ul>li{margin-bottom:0.375rem;padding-left:1.25rem}.from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players)>li:before,.content__standfirst ul>li:before{display:inline-block;content:'';border-radius:0.375rem;height:0.75rem;width:0.75rem;margin-right:0.5rem;background-color:#dcdcdc}.from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players)>li:before,.content__standfirst ul>li:before{margin-left:-1.25rem}.paid-content .from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players)>li:before,.paid-content .content__standfirst ul>li:before{display:inline-block;content:'';border-radius:0.375rem;height:0.75rem;width:0.75rem;margin-right:0.25rem;background-color:#999}.from-content-api ul:not(.social):not(.submeta__links):not(.syndication--bottom):not(.match-stats__players)>li>p:first-child,.content__standfirst ul>li>p:first-child{display:inline}.caption{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#767676}.caption a{color:inherit}.caption .inline-information{margin-right:0.125rem;margin-top:-0.1875rem;width:0.875rem;height:0.875rem;background-color:#dcdcdc}.caption .inline-information .inline-information__svg{width:0.25rem;fill:#ffffff}.tonal--tone-media .caption .inline-information .inline-information__svg{fill:#121212}.content__main--minute-article .caption .inline-information .inline-information__svg{fill:#dcdcdc}figure{margin:0}figure img{display:block}figure.element{position:relative}.content__article-body figure.element:first-child{margin-top:0}figure.element-image{position:relative}figure.element-image figcaption{padding-top:0.5rem}@media (min-width: 46.25em){figure.element-video figcaption{max-width:28.75rem}}@media (min-width: 46.25em){figure.element--showcase figcaption{max-width:43.75rem}}figure.img--inline{margin:0.3125rem 1.25rem 0.375rem 0}p+figure,p+video{margin-top:0.25rem}figure.element--thumbnail+h2{display:inline}.from-content-api cite{font-size:0.875rem;line-height:1.125rem;font-family:"Guardian Text Egyptian Web",Georgia,serif}.from-content-api cite a{color:#767676}.from-content-api cite a:hover,.from-content-api cite a:focus,.from-content-api cite a:visited:focus,.from-content-api cite a:visited:hover{color:#4d4d4d;border-bottom:0.0625rem dotted #4d4d4d}.from-content-api cite a:visited{color:#808080;border-bottom:0.0625rem dotted #808080}.from-content-api table{margin-bottom:1rem}.from-content-api table caption{font-size:1.25rem;line-height:1.4375rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;padding:0.5rem 0;text-align:left;border-top:0.0625rem solid #b3b3b4}.from-content-api th,.from-content-api td{font-size:0.8125rem;line-height:1.125rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding:0.5rem}.from-content-api th{font-weight:600}.from-content-api tbody tr:nth-child(odd) td{background-color:#ececec}.from-content-api .element iframe{width:100%;border:0}.embed-video-wrapper iframe,.embed-video-wrapper video,.embed-video-wrapper object,.embed-video-wrapper embed{width:100%}.element-pullquote{width:100%;box-sizing:border-box;padding:0;margin-bottom:0.75rem}@media (min-width: 46.25em){.element-pullquote{width:13.75rem;float:left;clear:left;padding-right:1.25rem;padding-top:0.1875rem;margin-bottom:0.375rem}}@media (min-width: 71.25em){.element-pullquote{width:11.25rem;margin-left:-11.25rem;padding:0 1.25rem;padding-top:0.1875rem}}@media (min-width: 81.25em){.element-pullquote{width:16.25rem;margin-left:-16.25rem}}.element-pullquote blockquote{margin:0;font-style:normal}.element-pullquote blockquote p{font-size:1.5rem;line-height:1.6875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;color:#767676;margin-bottom:0}@media (min-width: 46.25em){.element-pullquote blockquote p{font-size:1.25rem;line-height:1.4375rem}}.element-pullquote footer{margin-top:0.0625rem}.element-pullquote cite{font-size:1.0625rem;line-height:1.5rem;font-family:"Guardian Text Egyptian Web",Georgia,serif;font-weight:bold;font-style:normal;color:#121212}.element-pullquote cite a,.element-pullquote cite a:visited{border-bottom:0.0625rem solid #dcdcdc}.element-pullquote cite a:hover,.element-pullquote cite a:visited:hover{text-decoration:none;border-bottom:0.0625rem solid #767676}.atom-quiz{counter-reset:quiz-question;margin:0}.atom-quiz__question{margin-bottom:1.5rem;list-style-type:none;border:0;padding:0}.atom-quiz__question figure.element{margin:0;transition:opacity 100ms}.atom-quiz__question-text{margin-bottom:0.75rem;display:inline-block}.atom-quiz__question-text:before{counter-increment:quiz-question;content:counter(quiz-question) ".";padding-right:.5ch}.atom-quiz__question-image{margin-bottom:0.375rem}.atom-quiz__answers:after,.atom-quiz__answers:before{content:'';display:table}.atom-quiz__answers:after{clear:both}.atom-quiz__answer{clear:both}.atom-quiz__answer+.atom-quiz__answer{padding-top:0.375rem}.atom-quiz__answer--image{width:50%;float:left}.atom-quiz__answer--image:nth-child(2){padding-top:0}.atom-quiz__answer--image:nth-child(even){clear:none}.atom-quiz__answer__input{border:0 !important;clip:rect(0 0 0 0) !important;height:0.0625rem !important;margin:-0.0625rem !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:0.0625rem !important}.atom-quiz__answer__item{background-color:#f6f6f6;transition:background-color 100ms;display:block;position:relative;cursor:pointer}.atom-quiz--is-results .atom-quiz__answer__item{cursor:default}:checked+.atom-quiz__answer__item{cursor:default;background-color:#ff7f0f}:checked+.atom-quiz__answer__item .element-image{opacity:.8}:checked+.atom-quiz__answer__item:before{background-color:#121212;box-shadow:0 0 0 0.0625rem #121212,inset 0 0 0 0.1875rem #ff7f0f}.atom-quiz--is-not-results :not(:checked)+.atom-quiz__answer__item:hover,.atom-quiz--is-not-results :not(:checked):focus+.atom-quiz__answer__item{background-color:#dcdcdc}.atom-quiz--is-not-results :not(:checked)+.atom-quiz__answer__item:hover:before,.atom-quiz--is-not-results :not(:checked):focus+.atom-quiz__answer__item:before{background-color:#767676;box-shadow:0 0 0 0.0625rem #767676,inset 0 0 0 0.1875rem #dcdcdc}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--is-correct{background-color:rgba(61,181,64,0.6)}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--is-correct .element-image{opacity:.8}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--selected{color:#ffffff;background-color:#c70000}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--selected .element-image{opacity:.8}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--selected .atom-quiz__answer__icon{display:inline-block}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--is-correct.atom-quiz__answer__item--selected{background-color:#3db540}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--is-correct.atom-quiz__answer__item--selected .element-image{opacity:1}.atom-quiz--is-results.atom-quiz--knowledge .atom-quiz__answer__item--is-correct.atom-quiz__answer__item--selected .atom-quiz__answer__reveal-text{color:#ffffff;padding-left:1.75rem;padding-top:0;min-height:auto}.atom-quiz__answer__item--text{padding:0.75rem 1.25rem}.atom-quiz--personality .atom-quiz__answer__item--text:before{content:'';height:1em;width:1em;border-radius:1em;display:inline-block;position:absolute;left:1em;top:1em;box-shadow:0 0 0 0.0625rem #dcdcdc;transition:background-color 100ms, box-shadow 50ms}:checked+.atom-quiz__answer__item--text:before{background-color:#121212;box-shadow:0 0 0 0.0625rem #121212,inset 0 0 0 0.1875rem #ff7f0f}.atom-quiz--is-not-results :not(:checked)+.atom-quiz__answer__item--text:hover:before,.atom-quiz--is-not-results :not(:checked):focus+.atom-quiz__answer__item--text:before{background-color:#767676;box-shadow:0 0 0 0.0625rem #767676,inset 0 0 0 0.1875rem #dcdcdc}.atom-quiz--is-results .atom-quiz__answer__item--text:before{display:none}.atom-quiz--is-not-results.atom-quiz--personality .atom-quiz__answer__item--text{padding-left:3em}.atom-quiz__answer__item--image{padding:0.625rem;box-sizing:border-box}.atom-quiz__answer__item--image:after{content:'';position:absolute;top:0;left:0;right:0;bottom:0}.atom-quiz__answer__item--image:before{display:none}.atom-quiz__answer:nth-child(odd) .atom-quiz__answer__item--image{margin-right:0.1875rem}.atom-quiz__answer:nth-child(even) .atom-quiz__answer__item--image{margin-left:0.1875rem}.atom-quiz__answer__icon{display:none}.atom-quiz__answer__icon svg{height:1rem;width:1rem}.atom-quiz__answer__icon--text{position:relative;top:0.125rem;padding-right:0.5rem;margin-left:-0.125rem}.atom-quiz__answer__icon--image{padding-top:0.75rem}.atom-quiz__answer__icon--image:after{position:relative;top:-0.125rem;left:0.5rem;content:'Incorrect'}.atom-quiz__answer__item--is-correct .atom-quiz__answer__icon--image:after{content:'Correct'}.atom-quiz__answer__reveal-text{font-size:0.75rem;line-height:1rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;display:none;color:#121212}.atom-quiz--is-results .atom-quiz__answer__reveal-text{display:block}.atom-quiz__answer__icon--image+.atom-quiz__answer__reveal-text{padding-top:0.75rem;min-height:1.5rem}.atom-quiz__message{display:none;border-top:0.0625rem solid #dcdcdc;background-color:#f6f6f6;padding:0.375rem 0.83333rem}.atom-quiz--is-results .atom-quiz__message{display:block}.atom-quiz__message--top{border-top:0.75rem solid #fff;margin-bottom:0.75rem}.atom-quiz__score-message,.atom-quiz__bucket-message{color:#767676}.atom-quiz__score{font-size:4.375rem;line-height:4.875rem;font-family:"Guardian Egyptian Web",Georgia,serif;font-weight:normal;color:#052962;display:block}.atom-quiz__share{border-top:0.0625rem solid #dcdcdc;padding-top:0.5rem;margin-top:0.75rem}.atom-quiz__cta{padding-bottom:0.75rem}.atom-quiz--instant-reveal:invalid,.atom-quiz--instant-reveal:valid{counter-reset:quiz-question quiz-score}.atom-quiz--instant-reveal:invalid [type=submit],.atom-quiz--instant-reveal:valid [type=submit]{display:none}.atom-quiz--instant-reveal:invalid :valid,.atom-quiz--instant-reveal:valid :valid{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.atom-quiz--instant-reveal:invalid :valid+.atom-quiz__answer__item,.atom-quiz--instant-reveal:valid :valid+.atom-quiz__answer__item{pointer-events:none}.atom-quiz--instant-reveal:invalid :valid .atom-quiz__answer__item--is-correct,.atom-quiz--instant-reveal:valid :valid .atom-quiz__answer__item--is-correct{background-color:rgba(61,181,64,0.6)}.atom-quiz--instant-reveal:invalid :valid .atom-quiz__answer__item--is-correct .element-image,.atom-quiz--instant-reveal:valid :valid .atom-quiz__answer__item--is-correct .element-image{opacity:.8}.atom-quiz--instant-reveal:invalid :valid .atom-quiz__answer__reveal-text,.atom-quiz--instant-reveal:valid :valid .atom-quiz__answer__reveal-text{display:block}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item{color:#ffffff;background-color:#c70000}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item .element-image,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item .element-image{opacity:.8}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item .atom-quiz__answer__icon,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item .atom-quiz__answer__icon{display:inline-block}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item--is-correct,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item--is-correct{background-color:#3db540;counter-increment:quiz-score}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item--is-correct .element-image,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item--is-correct .element-image{opacity:1}.atom-quiz--instant-reveal:invalid :checked+.atom-quiz__answer__item--is-correct .atom-quiz__answer__reveal-text,.atom-quiz--instant-reveal:valid :checked+.atom-quiz__answer__item--is-correct .atom-quiz__answer__reveal-text{color:#ffffff;padding-left:1.75rem;padding-top:0;min-height:auto}.atom-quiz--instant-reveal:invalid .atom-quiz__score:after,.atom-quiz--instant-reveal:valid .atom-quiz__score:after{content:counter(quiz-score) "/" attr(data-question-count)}.atom-quiz--instant-reveal:invalid .atom-quiz__bucket-message,.atom-quiz--instant-reveal:valid .atom-quiz__bucket-message{display:none}.atom-quiz--instant-reveal:valid .atom-quiz__message{display:block}.interactive-atom-fence{width:100%;border:0}.immersive-main-media__media .interactive-atom-fence{height:100% !important}.svg .i-camera-black-large,.svg-i-camera-black-large{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTE4IDMuNXY4TDE2LjUgMTNoLTE1TDAgMTEuNXYtOEwxLjUgMkg1bDItMmg0bDIgMmgzLjVMMTggMy41ek05IDExYzEuOSAwIDMuNS0xLjYgMy41LTMuNVMxMC45IDQgOSA0IDUuNSA1LjYgNS41IDcuNSA3LjEgMTEgOSAxMXoiLz48L3N2Zz4=);background-position:0 0;width:1.125rem;height:0.8125rem}.svg .i-volume-mute--tone-media,.svg-i-volume-mute--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-mute--tone-podcast,.svg-i-volume-mute--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-mute-white,.svg-i-volume-mute-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEgNEwwIDV2M2wxIDFoMmw0IDRoMVYwSDdMMyA0SDF6bTE2LS40bC0uNi0uNi0yLjkgMi42TDEwLjYgM2wtLjYuNiAyLjYgMi45TDEwIDkuNGwuNi42IDIuOS0yLjYgMi45IDIuNi42LS42LTIuNi0yLjlMMTcgMy42eiIvPjwvc3ZnPg==);background-position:0 0;width:1.0625rem;height:0.8125rem}.svg .i-volume-low-black,.svg-i-volume-low-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDUgMjA1Ij48cGF0aCBmaWxsPSIjMzMzIiBkPSJNOTkgMjMuM3YxNThoLTguN2wtNDcuNy00N2gtMzNsLTcuNi04Vjc4LjZsOC43LTguM2gzMmw0Ny00N2g4LjdtNTIgNzlsLTI5LjktMzQgNi40LTYuNCAzMy43IDMwIDM0LTMwIDYuNCA2LjQtMzAgMzQgMzAgMzMuNy02LjQgNi40LTM0LTI5LjktMzMuNyAyOS45LTYuNC02LjQgMjkuOS0zMy43Ii8+PC9zdmc+);background-position:0 0;width:0;height:0}.svg .i-expand--black,.svg-i-expand--black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDUgMjA1Ij48cGF0aCBmaWxsPSIjMzMzIiBkPSJNNzIuOCAxOTF2MTEuM2gtNjZMMi4xIDE5OHYtNjZoMTEuN2w1LjEgNDAuNiA1Mi01MiAxMi45IDEyLjktNTIgNTIgNDAuNiA1LjVtNTktMTc3VjIuN2g2Nmw0LjMgNC4zdjY2aC0xMS4zbC01LjUtNDEtNTIgNTItMTIuNS0xMi45IDUyLTUyLTQwLjYtNS4xIi8+PC9zdmc+);background-position:0 0;width:0;height:0}.svg .i-volume-high--tone-media,.svg-i-volume-high--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high--tone-podcast,.svg-i-volume-high--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high-black,.svg .paid-content.tonal--tone-media .vjs-volume-menu-button .vjs-control-text:before,.svg-i-volume-high-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-high-white,.svg-i-volume-high-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTExLjcgMi41YzAgMi0uNyAzLjgtMS44IDUuMmwuNC40YzEuNi0xLjMgMi42LTMuMyAyLjYtNS42cy0xLTQuMy0yLjYtNS42bC0uNC40YzEuMiAxLjUgMS44IDMuMyAxLjggNS4ybS0zLjcgMGMwIDEuMS0uMyAyLjItLjkgMy4xbC41LjVjLjgtMSAxLjQtMi4yIDEuNC0zLjZzLS42LTIuNi0xLjUtMy41bC0uNS41Yy42LjggMSAxLjkgMSAzIi8+PC9zdmc+);background-position:0 0;width:1rem;height:0.8125rem}.svg .i-volume-low--tone-media,.svg-i-volume-low--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-volume-low--tone-podcast,.svg-i-volume-low--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-volume-low-white,.svg-i-volume-low-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMgNEgxTDAgNXYzbDEgMWgybDQgNGgxVjBIN0wzIDR6bTggMi41YzAgMS4xLS4zIDIuMi0uOSAzLjFsLjUuNWMuOC0xIDEuNC0yLjIgMS40LTMuNnMtLjYtMi42LTEuNS0zLjVsLS41LjVjLjYuOCAxIDEuOSAxIDMiLz48L3N2Zz4=);background-position:0 0;width:0.75rem;height:0.8125rem}.svg .i-embed--black,.svg .paid-content.tonal--tone-media .vjs-embed-button .vjs-control-content:before,.svg-i-embed--black{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xIDEwLjJWOC40TDIuOCA2LjcgNy4xIDVWMy4yTC44IDZ2MS41bDYuMyAyLjhNOS42IDE0aDEuN0wxNS4xLjRoLTEuN0w5LjYgMTRtOC40LTMuN2w2LjMtMi44VjZMMTggMy4yVjVsNC4zIDEuN0wxOCA4LjR2MS44IiBmaWxsPSIjMzMzIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-embed--tone-media,.svg-i-embed--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xMiAxMC4yNFY4LjQzMkwyLjgxNiA2LjcwNCA3LjEyIDQuOTkyVjMuMTY4TC44IDUuOTUydjEuNTA0bDYuMzIgMi43ODR6bTIuNDc2IDMuNjhoMS43NDRMMTUuMTguMjcyaC0xLjc0NEw5LjU5NiAxMy45MnptOC4zNjQtMy42OGw2LjMyLTIuNzg0VjUuOTUybC02LjMyLTIuNzg0djEuODI0bDQuMzA0IDEuNzI4LTQuMzA0IDEuNzEydjEuODA4eiIgZmlsbD0iI2ZiMCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-embed--white,.svg-i-embed--white{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAyNSAxNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNy4xMiAxMC4yNFY4LjQzMkwyLjgxNiA2LjcwNCA3LjEyIDQuOTkyVjMuMTY4TC44IDUuOTUydjEuNTA0bDYuMzIgMi43ODR6bTIuNDc2IDMuNjhoMS43NDRMMTUuMTguMjcyaC0xLjc0NEw5LjU5NiAxMy45MnptOC4zNjQtMy42OGw2LjMyLTIuNzg0VjUuOTUybC02LjMyLTIuNzg0djEuODI0bDQuMzA0IDEuNzI4LTQuMzA0IDEuNzEydjEuODA4eiIgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+);background-position:0 0;width:1.5625rem;height:0.875rem}.svg .i-expand-black,.svg .paid-content.tonal--tone-media .vjs-fullscreen-control .vjs-control-text:before,.svg-i-expand-black{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iIzMzMyIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-expand-white,.svg-i-expand-white{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-expand-yellow,.svg-i-expand-yellow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMuNCAyMC4yTDkgMTQuNSA3LjUgMTNsLTUuNyA1LjZMMSAxNEgwdjcuNWwuNS41SDh2LTFsLTQuNi0uOE0xOC43IDEuOUwxMyA3LjYgMTQuNCA5bDUuNy01LjcuNSA0LjdoMS4yVi42bC0uNS0uNUgxNHYxLjJsNC43LjYiLz48L3N2Zz4=);background-position:0 0;width:1.375rem;height:1.375rem}.svg .i-video-camera--tone-media,.svg-i-video-camera--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIyMyI+PHBhdGggZmlsbD0iI2ZiMCIgZD0iTTMgMEwwIDN2MTdsMyAzaDE5VjBIM20yMiA5djVsOSA4aDJWMWgtMmwtOSA4eiIvPjwvc3ZnPg==);background-position:0 0;width:2.25rem;height:1.4375rem}.svg .i-video-camera--tone-podcast,.svg-i-video-camera--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNiIgaGVpZ2h0PSIyMyI+PHBhdGggZmlsbD0iI2FhZDhmMSIgZD0iTTMgMEwwIDN2MTdsMyAzaDE5VjBIM20yMiA5djVsOSA4aDJWMWgtMmwtOSA4eiIvPjwvc3ZnPg==);background-position:0 0;width:2.25rem;height:1.4375rem}.svg .i-close-icon-white-small,.svg-i-close-icon-white-small{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTIxIDkuOGwtLjgtLjgtNS4yIDQuOEw5LjggOWwtLjguOCA0LjggNS4yTDkgMjAuMmwuOC44IDUuMi00LjggNS4yIDQuOC44LS44LTQuOC01LjJMMjEgOS44Ii8+PC9zdmc+);background-position:0 0;width:1.875rem;height:1.875rem}.svg .i-pause-32--tone-media,.svg-i-pause-32--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmIwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-pause-32--tone-podcast,.svg-i-pause-32--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjYWFkOGYxIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMTQgMjJoLTNWMTEuMWwxLTEuMWgydjEybTQtMTJoM3YxMC45TDIwIDIyaC0yVjEwIi8+PC9zdmc+);background-position:0 0;width:2rem;height:2rem}.svg .i-play-32--tone-media,.svg-i-play-32--tone-media{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjZmIwIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-play-32--tone-podcast,.svg-i-play-32--tone-podcast{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+PGNpcmNsZSBmaWxsPSIjYWFkOGYxIiBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiLz48cGF0aCBmaWxsPSIjMzMzIiBkPSJNMjMgMTUuNjdMMTIgMTFsLS45OS4zdjkuMjU3bDEgLjMgMTEtNC42N3YtLjUiLz48L3N2Zz4=);background-position:0 0;width:2rem;height:2rem}.svg .i-error-exclamation,.svg-i-error-exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzYgMzYiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgZmlsbD0iI2ZmZiIgY3g9IjE4IiBjeT0iMTgiIHI9IjE4Ii8+PHBhdGggZD0iTTE0LjcyNyA1LjcyN2wxLjYzNi0xLjYzNmgzLjI3M2wxLjYzNiAxLjYzNi0xLjYzNiAxNS41NDVoLTMuMjczTDE0LjcyNyA1LjcyN202LjU0NSAyMi4wOWMwLTEuOC0xLjQ3My0zLjI3My0zLjI3My0zLjI3M2EzLjI4MyAzLjI4MyAwIDAgMC0zLjI3MyAzLjI3M2MwIDEuOCAxLjQ3MyAzLjI3MyAzLjI3MyAzLjI3M3MzLjI3My0xLjQ3MyAzLjI3My0zLjI3MyIgZmlsbD0iIzMzMyIvPjwvZz48L3N2Zz4=);background-position:0 0;width:2.25rem;height:2.25rem}@media (min-width: 61.25em){.video-playlist__item .youtube-media-atom{opacity:.3;transition:opacity .4s ease-out}}@media (min-width: 61.25em){.video-playlist__item .youtube-media-atom .vjs-big-play-button{display:block}}@media (max-width: 61.24em){.video-playlist__item .youtube-media-atom iframe,.video-playlist__item .youtube-media-atom .vjs-big-play-button{top:6.75rem;bottom:0;height:auto}}.video-playlist__item--active .youtube-media-atom{opacity:1}.video-playlist__item--active .youtube-media-atom .vjs-big-play-button{display:block}.youtube-media-atom{position:relative}.youtube-media-atom__iframe,.youtube-media-atom__overlay{height:100%;width:100%;position:absolute;max-height:100vh}.youtube-media-atom__iframe{z-index:0}.youtube-media-atom__iframe:hover ~ .youtube-media-atom__overlay .youtube-media-atom__play-button{transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-transform:scale(1.12);transform:scale(1.12);-webkit-transform-origin:center;transform-origin:center}.youtube-media-atom__iframe:hover ~ .youtube-media-atom__overlay .youtube-media-atom__immersive-interface .youtube-media-atom__play-button{transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-transform:scale(1.08);transform:scale(1.08);-webkit-transform-origin:center;transform-origin:center}.youtube-media-atom__iframe.youtube__video-ended ~ .youtube-media-atom__overlay{visibility:hidden;opacity:0}.youtube-media-atom__iframe.youtube__video-started:not(.youtube__video-ended) ~ .video-overlay{visibility:hidden;opacity:0}.youtube-media-atom__iframe.youtube__video-started:not(.youtube__video-ended) ~ .youtube-media-atom__overlay{visibility:hidden;opacity:0;transition:opacity 1s linear, visibility 1s;transition-delay:500ms;transition-duration:500ms}youtube-media-atom:not(.youtube-related-videos) .youtube-media-atom__iframe.youtube__video-ended.youtube__video-started ~ .youtube-media-atom__overlay{visibility:visible;opacity:1;transition:opacity 1s linear, visibility 0s}@media (min-width: 46.25em){.youtube-media-atom__iframe.youtube__video-ended.youtube__video-started ~ .end-slate-container{display:block}}.youtube-media-atom__overlay.vjs-big-play-button{pointer-events:none}.facia-page .youtube-media-atom__overlay.vjs-big-play-button{pointer-events:auto}.youtube-media-atom__overlay{background-size:cover;background-position:49% 49%;background-repeat:no-repeat;z-index:0;text-align:center}.youtube-media-atom__overlay .video-overlay{text-align:initial}.youtube-media-atom__play-button.vjs-control-text{overflow:hidden !important;display:inline-block;z-index:2}.no-player .youtube-media-atom__play-button.vjs-control-text{transition:none}.youtube-media-atom__bottom-bar{position:absolute;left:0;bottom:0;width:100%;height:3.75rem;z-index:1}.youtube-media-atom__bottom-bar:after{background-color:rgba(51,51,51,0);background-image:linear-gradient(to bottom, rgba(51,51,51,0), rgba(51,51,51,0.5));position:absolute;height:100%;width:100%;left:0;z-index:-1;content:'';opacity:.7}.youtube-media-atom__bottom-bar__duration{font-size:1rem;line-height:1.875rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:bold;color:#ffe500;float:left;-webkit-font-smoothing:subpixel-antialiased;padding-top:0.25rem;padding-left:5rem;text-shadow:0 0 1rem rgba(51,51,51,0.25)}.immersive-main-media__media .youtube-media-atom{padding-bottom:0;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;z-index:0}.immersive-main-media__media .youtube-media-atom__immersive-interface{position:absolute;top:50vh;-webkit-transform:translateY(-100%);transform:translateY(-100%);padding-bottom:1.5rem}.immersive-main-media__media .youtube-media-atom__play-button,.immersive-main-media__media .youtube-media-atom__bottom-bar__duration{display:inline-block;vertical-align:middle;float:none;top:auto;left:auto;right:auto;bottom:auto}.immersive-main-media__media .youtube-media-atom__play-button{position:relative;width:5.75rem;height:5.75rem;-webkit-transform:none;transform:none}.immersive-main-media__media .youtube-media-atom__play-button:hover{-webkit-transform:none;transform:none}.immersive-main-media__media .youtube-media-atom__play-button:before{width:100%;height:100%;border-radius:100%}.immersive-main-media__media .youtube-media-atom__play-button:after{display:none}.immersive-main-media__media .youtube-media-atom__play-button .inline-play__svg{width:2.875rem;height:2.4375rem;fill:#333;position:absolute;top:50%;left:50%;-webkit-transform:translateX(-42%) translateY(-50%);transform:translateX(-42%) translateY(-50%)}.immersive-main-media__media .youtube-media-atom__bottom-bar__duration{position:relative;-webkit-font-smoothing:antialiased;font-size:1.125rem;line-height:2.125rem;left:0.375rem;height:2rem;padding:0 0.75rem;background-color:rgba(51,51,51,0.7);border-radius:2rem}.immersive-main-media__media .youtube-media-atom__bottom-bar__duration:before{display:none}.youtube-media-atom__play-button{background-color:#121212;border-radius:50%;color:transparent}.vjs-big-play-button .vjs-control-text,.youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.75rem;left:0.75rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:3.75rem;height:3.75rem}.vjs-big-play-button .vjs-control-text .inline-play svg,.youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:1.5rem}.fc-item--full-media-75-tablet .vjs-big-play-button .vjs-control-text,.fc-item--full-media-50-tablet .vjs-big-play-button .vjs-control-text,.fc-item--three-quarters-tablet .vjs-big-play-button .vjs-control-text,.fc-item--half-tablet .vjs-big-play-button .vjs-control-text,.fc-item--full-media-75-tablet .youtube-media-atom__play-button.vjs-control-text,.fc-item--full-media-50-tablet .youtube-media-atom__play-button.vjs-control-text,.fc-item--three-quarters-tablet .youtube-media-atom__play-button.vjs-control-text,.fc-item--half-tablet .youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.625rem;left:0.625rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:3.125rem;height:3.125rem}.fc-item--full-media-75-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--full-media-50-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--three-quarters-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--half-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--full-media-75-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg,.fc-item--full-media-50-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg,.fc-item--three-quarters-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg,.fc-item--half-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:1.25rem}.fc-item--third-tablet .vjs-big-play-button .vjs-control-text,.fc-item--third-tablet .youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.625rem;left:0.625rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:3.125rem;height:3.125rem}.fc-item--third-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--third-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:1.25rem}@media (min-width: 30em) and (max-width: 46.24em){.fc-item--third-tablet .vjs-big-play-button .vjs-control-text,.fc-item--third-tablet .youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.525rem;left:0.525rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:2.625rem;height:2.625rem}.fc-item--third-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--third-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:1rem}}@media (min-width: 46.25em){.fc-item--standard-tablet .vjs-big-play-button .vjs-control-text,.fc-item--list-media-tablet .vjs-big-play-button .vjs-control-text,.fc-item--standard-tablet .youtube-media-atom__play-button.vjs-control-text,.fc-item--list-media-tablet .youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.375rem;left:0.375rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1.875rem;height:1.875rem}.fc-item--standard-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--list-media-tablet .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--standard-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg,.fc-item--list-media-tablet .youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:0.875rem}}@media (max-width: 46.24em){.fc-item--list-media-mobile .vjs-big-play-button .vjs-control-text,.fc-item--list-media-mobile .youtube-media-atom__play-button.vjs-control-text{border-radius:50%;position:absolute;bottom:0.375rem;left:0.375rem;transition:-webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), -webkit-transform 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1.875rem;height:1.875rem}.fc-item--list-media-mobile .vjs-big-play-button .vjs-control-text .inline-play svg,.fc-item--list-media-mobile .youtube-media-atom__play-button.vjs-control-text .inline-play svg{position:absolute;top:50%;left:49%;padding:0;margin:0;-webkit-transform:translate(-40%, -50%);transform:translate(-40%, -50%);fill:#ffffff;width:0.875rem}}@media (min-width: 20em) and (max-width: 29.99em){.element-atom--media.element-atom--main-media{margin-top:0}}figure.element-atom .atom--explainer a.u-underline{color:inherit}figure.element-atom .atom--explainer a.u-underline:hover{border-bottom:solid 0.0625rem #a8d8f2}@media (min-width: 71.25em){.podcast{display:grid;grid-template:'. standfirst . ' 'cover player right' 'cover main right' 'subscribe main right' 'byline main right' 'share main right' '. main right' '. support right' '. tags right' / 9.375rem 38.75rem 1fr;grid-column-gap:0}}.podcast .podcast__standfirst{grid-area:standfirst}.podcast .podcast__byline{grid-area:byline}.podcast .podcast__cover{grid-area:cover}.podcast .podcast__meta{grid-area:subscribe}.podcast .podcast__share{grid-area:share}.podcast .podcast__date{grid-area:date}.podcast .podcast__player{grid-area:player}.podcast .podcast__body{grid-area:main}.podcast .podcast__submeta{grid-area:tags}.podcast .podcast__support{grid-area:support}.podcast .podcast__secondary{grid-area:right}@media (min-width: 81.25em){.podcast{grid-template-columns:14.375rem 43.75rem 1fr}}.podcast__standfirst{max-width:33.75rem}.podcast__standfirst .content__standfirst{font:400 1rem/1.25rem "Guardian Egyptian Web",Georgia,serif;max-width:none}.podcast__standfirst .u-underline.u-underline:hover,.podcast__standfirst .u-underline.u-underline:focus{border-bottom-color:#dcdcdc}@media (min-width: 71.25em){.podcast__standfirst,.podcast__body,.podcast__submeta,.podcast__support{padding-left:0.625rem;padding-bottom:0.75rem;border-left:0.0625rem solid #333}}@media (max-width: 71.24em){.podcast__byline{background-image:repeating-linear-gradient(to bottom, #333, #333 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:top;background-size:0.0625rem 0.8125rem;padding-top:0.75rem}}@media (min-width: 30em){.podcast__byline{margin-top:1.5rem}}@media (min-width: 71.25em){.podcast__byline{border-top:0.0625rem solid #333;margin-top:0.75rem;padding:0.375rem 0.625rem 0 0}.podcast__byline .content__meta-container{margin-bottom:0}}.podcast__byline .byline{font-style:normal}.podcast__byline .content__dateline{color:#969696}.podcast__byline .content__meta-container{margin-left:0;padding-top:0;position:static;width:auto}.podcast__byline .content__meta-container::before{content:none}.content .podcast__byline .content__meta-container{background-image:none}@media (max-width: 71.24em){.content .podcast__byline .content__meta-container{margin-top:0.25rem}}.podcast__byline .meta__contact-wrap{float:none;max-width:none;padding:0}.podcast__support,.podcast__meta,.podcast__share,.podcast__byline,.podcast__secondary,.podcast__submeta,.podcast__body{box-sizing:border-box;max-width:38.75rem}@media (max-width: 71.24em){.podcast__player{max-width:38.75rem}}.podcast__body .media-primary{margin-left:0;margin-right:0;margin-bottom:0}.podcast__body .caption{padding-bottom:0}@media (min-width: 71.25em){.podcast__body{padding-top:0.375rem}}.podcast__player .podcast-meta{display:none}.podcast__player .gu-media-wrapper--audio{padding-top:0}@media (max-width: 71.24em){.podcast__player .gu-media-wrapper--audio{margin-top:0.75rem}}@media (min-width: 71.25em){.podcast__player .gu-media-wrapper--audio{border-left:0.0625rem solid #333;margin-right:0.625rem;padding-bottom:0.375rem}}@media (min-width: 71.25em){.podcast__cover-image{max-width:calc(100% - 0.625rem);margin-bottom:0.375rem}}@media (max-width: 71.24em){.podcast__cover-image{float:left;height:7.5rem;margin-right:0.625rem;margin-top:0.375rem;width:7.5rem}}@media (max-width: 41.24em){.podcast__section{margin-left:-0.625rem;margin-right:-0.625rem;padding-left:0.625rem;padding-right:0.625rem}}.podcast__section-heading{color:#ffffff;font:bold 1.125rem/1.25rem "Guardian Egyptian Web",Georgia,serif;margin:0.41667rem 0}.podcast__section-link{-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#333;color:#ffffff;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font:500 0.875rem/1 "Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;padding:0 0.75rem}.podcast__section-link:hover,.podcast__section-link:focus{background:rgba(255,255,255,0.1);text-decoration:none}.podcast__section-icon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.podcast__meta{background-image:repeating-linear-gradient(to bottom, #333, #333 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:top;background-size:0.0625rem 0.8125rem;padding-top:0.75rem;padding-bottom:0;margin-bottom:0}@media (max-width: 71.24em){.podcast__meta{margin-top:2rem}}@media (min-width: 71.25em) and (max-width: 81.24em){.podcast__meta .podcast__meta-heading{font-size:1rem}}.podcast__meta-items{line-height:2.75rem;margin:0}.podcast__meta-item{margin-right:0.625rem;display:block}@media (max-width: 71.24em){.podcast__meta-item{display:inline}}.podcast__meta-icon{margin-right:0.41667rem}.podcast__meta__item-link{border-radius:1.0625rem;height:2.125rem}.podcast__support{border-top:0.0625rem solid #333}@media (max-width: 71.24em){.podcast__support{margin-top:0.75rem}}@media (min-width: 71.25em){.podcast__support{padding-bottom:0.75rem}}.podcast__support-icon{margin-left:0.41667rem}.podcast__support-link{border-radius:1.875rem;height:2.125rem}.from-content-api.from-content-api .podcast__support-link{border-bottom:0;background:#ffe500;color:#121212}.from-content-api.from-content-api .podcast__support-link:hover,.from-content-api.from-content-api .podcast__support-link:focus{background:#e6ce00}.from-content-api.from-content-api .podcast__support-link .inline-icon{fill:currentColor}.podcast__share{border-top:0.0625rem solid #333;margin-top:1.125rem;padding-top:0;padding-right:0.625rem;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (min-width: 71.25em){.podcast__share{margin-top:0.75rem}}@media (min-width: 71.25em) and (max-width: 81.24em){.podcast__share{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.podcast__share .meta__numbers.meta__numbers.meta__numbers.meta__numbers{border-top:0.0625rem solid #333;margin-right:-0.625rem;padding-right:0.625rem}}.podcast__share .social{padding-top:0.375rem}.podcast__share .social-icon__svg.social-icon__svg.social-icon__svg{fill:#ededed}.podcast__share .meta__numbers{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.podcast__share .meta__numbers .sharecount__value.sharecount__value.sharecount__value{color:#999}.podcast__share .meta__numbers .inline-share.inline-share.inline-share svg{fill:#999}.podcast__share .meta__number.meta__number.meta__number.meta__number{padding-left:0.3125rem;border-color:#333}.podcast__share .commentcount2__heading.commentcount2__heading.commentcount2__heading span{fill:#999}.podcast__share .commentcount2__value{color:#999}.podcast__submeta{background-image:repeating-linear-gradient(to bottom, #333, #333 0.0625rem, transparent 0.0625rem, transparent 0.25rem);background-repeat:repeat-x;background-position:top;background-size:0.0625rem 0.8125rem;padding-top:1.125rem}.podcast__submeta .submeta.submeta.submeta.submeta{background:none;padding-top:0;margin-top:0}@media (max-width: 71.24em){.podcast__submeta{margin-top:0.75rem}}@media (min-width: 71.25em){.podcast__submeta{padding-bottom:0}.podcast__submeta .submeta__keywords{border:0;margin-bottom:0;padding-bottom:2.25rem}}@media (max-width: 71.24em){.podcast__secondary{border-top:0.0625rem solid #333;margin-top:0.75rem}.podcast__secondary .most-viewed-container--media{border-top:0;margin-top:0}}@media (min-width: 71.25em){.podcast__secondary{padding-left:0.625rem}.podcast__secondary .most-viewed-container--media{border-top-color:#333}}@media (min-width: 46.25em) and (max-width: 71.24em){.podcast__secondary .most-viewed--media .fc-item--media{width:33.3%}.podcast__secondary .most-viewed--media .fc-item--media:nth-child(4n),.podcast__secondary .most-viewed--media .fc-item--media:nth-child(4n)::before{display:none}.podcast__secondary .most-viewed--media .fc-item--media:nth-child(1n+4){margin-bottom:0}}.podcast__player{padding-left:0;padding-right:0;margin-top:0.75rem;margin-bottom:0.1875rem;border-bottom:0.0625rem solid #333}@media (min-width: 71.25em){.podcast__player{border-left:0.0625rem solid #333;border-top:0.0625rem solid #333;margin:0}}
+ /*# sourceMappingURL=head.content.garnett.css.map */
+
+
+ ]]>
+ </style>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/a55a0706ad311c200d92abb5a3916787/content.garnett.css" media="only x" /><noscript>
+ <link rel="stylesheet" type="text/css" href="https://assets.guim.co.uk/stylesheets/a55a0706ad311c200d92abb5a3916787/content.garnett.css" /></noscript><!--<![endif]-->
+ <link rel="stylesheet" media="print" type="text/css" href="https://assets.guim.co.uk/stylesheets/34c092721cd48ba90dfa205824941d3c/print.css" />
+ <style class="webfont" data-cache-name="GuardianHeadline" data-cache-file-woff2="https://assets.guim.co.uk/fonts/3b8e46f89a02c7744b0ca01043f95f2c/GuardianHeadline.woff2.json" data-cache-file-hinted-woff2="https://assets.guim.co.uk/fonts/7a35b9af8642fa56021301306f6f8c10/GuardianHeadlineHinted.woff2.json" data-cache-file-woff="https://assets.guim.co.uk/fonts/979fcd5bdabcdd2168a2182ef9de2047/GuardianHeadline.woff.json" data-cache-file-hinted-woff="https://assets.guim.co.uk/fonts/0f0c6f99ad1509678834f4c945d3ee7c/GuardianHeadlineHinted.woff.json" data-cache-file-ttf="https://assets.guim.co.uk/fonts/4db2284b8664d218dd904c40ca5edb56/GuardianHeadline.ttf.json" data-cache-file-hinted-ttf="https://assets.guim.co.uk/fonts/25febe0b2605f6dfda562b193e67baa8/GuardianHeadlineHinted.ttf.json"></style>
+ <style class="webfont" data-cache-name="GuardianTextEgyptianWeb" data-cache-file-woff2="https://assets.guim.co.uk/fonts/aa5262b476f8d7d7173583a408a2e0d4/GuardianTextEgyptianWeb.woff2.json" data-cache-file-hinted-woff2="https://assets.guim.co.uk/fonts/6c688d9d9fa9c003df046febff29611c/GuardianTextEgyptianWebHinted.woff2.json" data-cache-file-woff="https://assets.guim.co.uk/fonts/04a83853bf92a9a8054146aa190ed00c/GuardianTextEgyptianWeb.woff.json" data-cache-file-hinted-woff="https://assets.guim.co.uk/fonts/c4fcc1aafe7aecbfab2eb6fd37e04260/GuardianTextEgyptianWebHinted.woff.json" data-cache-file-ttf="https://assets.guim.co.uk/fonts/5e089132bb7b66d7ddb8de3a0ad5ca23/GuardianTextEgyptianWeb.ttf.json" data-cache-file-hinted-ttf="https://assets.guim.co.uk/fonts/852c5ff1e3c8a8a10f40ebb0371f770e/GuardianTextEgyptianWebHinted.ttf.json"></style>
+ <style class="webfont" data-cache-name="GuardianTextSansWeb" data-cache-file-woff2="https://assets.guim.co.uk/fonts/13595db2b6da482cceb5b6199e99363c/GuardianTextSansWeb.woff2.json" data-cache-file-hinted-woff2="https://assets.guim.co.uk/fonts/c19491c5e163b6a5923451e68adebbcc/GuardianTextSansWebHinted.woff2.json" data-cache-file-woff="https://assets.guim.co.uk/fonts/0cc3d8e149a9512761475130562bf7c2/GuardianTextSansWeb.woff.json" data-cache-file-hinted-woff="https://assets.guim.co.uk/fonts/3b286802646db4e838fcbc38998cf018/GuardianTextSansWebHinted.woff.json" data-cache-file-ttf="https://assets.guim.co.uk/fonts/a64bdb06fc6c20b121d83a2e26f4326d/GuardianTextSansWeb.ttf.json" data-cache-file-hinted-ttf="https://assets.guim.co.uk/fonts/ea010fa7780fcdb4697315eb6a5f032d/GuardianTextSansWebHinted.ttf.json"></style>
+ <script>
+ <![CDATA[
+ window.console=window.console||undefined;
+ ]]>
+ </script>
+ <script id="gu">
+ <![CDATA[
+ /*@cc_on
+ @if (@_jscript_version <= 9)
+ (function(f){
+ window.setTimeout = f(window.setTimeout);
+ window.setInterval = f(window.setInterval);
+ })(function(f){return function(c,t){var a=[].slice.call(arguments,2);return f(function(){c.apply(this,a)},t)}});
+ @end
+ @*/(function(window){var lastTime,vendors;if(!window.requestAnimationFrame){lastTime=0;vendors=["ms","moz","webkit","o"];for(var x=0;x<vendors.length&&!window.requestAnimationFrame;++x){window.requestAnimationFrame=window[vendors[x]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[vendors[x]+"CancelAnimationFrame"]||window[vendors[x]+"CancelRequestAnimationFrame"]}window.requestAnimationFrame=function(callback,element){var currTime=(new Date).getTime();var timeToCall=Math.max(0,16-(currTime-lastTime));var id=window.setTimeout(function(){callback(currTime+timeToCall)},timeToCall);lastTime=currTime+timeToCall;return id}}if(!window.cancelAnimationFrame)window.cancelAnimationFrame=function(id){clearTimeout(id)}})(window);(function(window,document){var weShouldPolyfill=!("open"in document.createElement("details"));function toggleDetailsState(details){if(details.hasAttribute("open"))details.removeAttribute("open");else details.setAttribute("open","open")}function handleEvent(event){var targetNode=event.target;while(targetNode.nodeName.toLowerCase()!=="summary"&&targetNode!==document)targetNode=targetNode.parentNode;if(targetNode.nodeName.toLowerCase()==="summary")toggleDetailsState(targetNode.parentNode)}function bindEvents(){document.addEventListener("click",handleEvent,true);document.addEventListener("keypress",function(event){if(event.key&&(event.key===" "||event.key==="Enter"))handleEvent(event);else if(event.keyCode===32||event.keyCode===13)handleEvent(event)},true)}function appendCss(){if(document.querySelector("#details-polyfill-css")===null){var style=document.createElement("style");style.id="details-polyfill-css";style.textContent="details:not([open]) \x3e *:not(summary) {display: none;}";document.head.insertBefore(style,document.head.firstChild)}}if(weShouldPolyfill){bindEvents();appendCss()}})(window,document);(function(window){var location=window.location;var hash=location.hash;var navigator=window.navigator;var platform=navigator.platform;var isFront=false;var enhancedKey="gu.prefs.enhanced";var preferEnhanced;try{preferEnhanced=JSON.parse(localStorage.getItem(enhancedKey)).value}catch(e){preferEnhanced=null}function mustEnhance(){if(hash==="#enhanced"||hash==="#"+enhancedKey+"\x3dtrue")return true;if(preferEnhanced)return true;return false}function mustNotEnhance(){return hash==="#standard"||hash==="#"+enhancedKey+"\x3dfalse"}function couldEnhance(){return preferEnhanced!==false}function weWantToEnhance(){if(isOlderIOSDevice())return false;if(isFront)return!isIpad();return true}function isOlderIOSDevice(){return/.*(iPhone|iPad|iPod; CPU) OS ([34567])_\d+.*/.test(navigator.userAgent)}function isIpad(){return platform==="iPad"}window.shouldEnhance=mustNotEnhance()?false:mustEnhance()?true:couldEnhance()&&weWantToEnhance()})(window);var isModernBrowser="querySelector"in document&&"addEventListener"in window&&"localStorage"in window&&"sessionStorage"in window&&"bind"in Function&&(("XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest())||"XDomainRequest"in window);window.guardian={isModernBrowser:isModernBrowser,isEnhanced:window.shouldEnhance&&isModernBrowser,css:{loaded:false},polyfilled:false,adBlockers:{active:undefined,onDetect:[]},config:{"page":{"avatarApiUrl":"https://avatar.theguardian.com","isSplash":false,"isColumn":false,"membershipUrl":"https://membership.theguardian.com","headline":"'What is the sea telling us?': Māori tribes fearful over whale strandings","isImmersive":true,"author":"Eleanor Ainge Roy","series":"Seascape: the state of our oceans","toneIds":"tone/features","isProd":true,"discussionFrontendUrl":"https://assets.guim.co.uk/discussion/discussion-frontend.preact.iife.8bdbd9194e.js","membershipAccess":"","allowUserGeneratedContent":false,"commissioningDesks":"australia-foreign","webPublicationDate":1546498802000,"forecastsapiurl":"/weatherapi/forecast","idOAuthUrl":"https://oauth.theguardian.com","supportUrl":"https://support.theguardian.com","isNumberedList":false,"webTitle":"'What is the sea telling us?': Māori tribes fearful over whale strandings | Eleanor Ainge Roy","isPhotoEssay":true,"isFront":false,"inBodyInternalLinkCount":2,"idWebAppUrl":"https://oauth.theguardian.com","googleSearchUrl":"//www.google.co.uk/cse/cse.js","inBodyExternalLinkCount":3,"showRelatedContent":true,"lightboxImages":{"id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","headline":"'What is the sea telling us?': Māori tribes fearful over whale strandings","shouldHideAdverts":false,"standfirst":"<p>New Zealand’s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings</p>","images":[{"caption":"Whale expert Hori Parata.","credit":"Photograph: Adrian Malloch for the Guardian","displayCredit":true,"src":"https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=700&quality=85&auto=format&fit=max&s=dfa797d5a89a311f92b94905eddd252b","srcsets":"https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1920&quality=85&auto=format&fit=max&s=6d4e58da4f1b15736d802591724a84ae 1920w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1225&quality=85&auto=format&fit=max&s=9bd0c2f5c2d475335208e17a5d963fff 1225w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1065&quality=85&auto=format&fit=max&s=65a78f2c0e4e065d45c6e55209315726 1065w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=965&quality=85&auto=format&fit=max&s=1f4abcf78d10b7222ef414fca06f3770 965w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=725&quality=85&auto=format&fit=max&s=3a7e313a451337991e6c1c6851ddf293 725w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=645&quality=85&auto=format&fit=max&s=892be4c784bd9d1a63653d32fda8e7a5 645w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=465&quality=85&auto=format&fit=max&s=98ae726db2f3c6ffbb75e42e44e2736e 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.499814333457111,"role":"None","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Hori Parata at his Pātaua farm, the place where he was born and grew up.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=f5b3d20f0dc5c22a83f96fb709ecd204","srcsets":"https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=b4cd8b573c0d8387666e58e7058354f5 1920w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=10cce32c51df551e9ad93af5b139ac17 1225w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=100e42f24d89a4108cd0aab6454f75b2 1065w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=40b276ee60fe4ab662834bc7dedeac95 965w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=4e4fd87a6008079cb4c951b6dc65d5b2 725w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=68f953deb9f6bf17b92059db1b34b9d8 645w, https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=dae1bba01312de71c13a01ec940c53a0 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"Some(showcase)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Kauri (Te Kaurinui Robert) Parata, watched by his father, Hori Parata, carves a traditional Māori design at their home in Whangārei. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father.<br>","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=d2432083289db6bd42f6ad7adc64a78d","srcsets":"https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=f50ebdc90e070b94b5ccd9ea5ddb0552 1920w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=8e78b100f7d07c5ee89d2bc344d471a3 1225w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=f4c4eaeb61bb90443920ced45b2aae7e 1065w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=48d22277f165f770dd898be7fb879145 965w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=f2c1432b51bf370372f11820291dd94a 725w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=d34b70840eb070ea2f3db73eb6d06356 645w, https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=30a5a12a245cc0232bb43b247e18ce96 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5161086544535691,"role":"None","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"A bin of small whale bones.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=0e7302276c6cc7cb65be9bcdacd3081f","srcsets":"https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=fa63c318e863c3737f7d9660567ed1b3 1920w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=b24419faeed86a5c1964ab6283c7ed94 1225w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=7903859975cf391cea70cf700be961f8 1065w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=bd47c14bba06c5c647e0c868b8fbe6f4 965w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=cd236ef7cf9e8667a5c82f27a6313edc 725w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=74326bae749c04ebd306c287353c0908 645w, https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=15c2f4c05b82dc23aea2329364f34028 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"None","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"The baleen filter-feeder system recovered from a stranded Pygmy Right Whale.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=249ddc3119aa637c3a1ae4998509f604","srcsets":"https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=1a99dec2d56738613707e81cf4d7420c 1920w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=4a59625328a10bded634339bd37f4d43 1225w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=37c1e96c455cfa2db6731642372efe7d 1065w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=e00fd6766ca4f9332c0c5b34ddd4a54d 965w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=0834e3fd8c1051250f7e01014cb4b496 725w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=9d17165335be7b1863338c8fa9e03ebd 645w, https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=2bf57cb9b8e5865c0983f67abdb9f774 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"Some(halfWidth)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Squid beaks, from the stomach of a sperm whale.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=bcfefc5593dcc2bdb0dd3b0543cfa4eb","srcsets":"https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=9c6a97bafef72bd31eff409b5d79b59a 1920w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=f12f4d6f1d68986de427544ec5b9eefb 1225w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=10f215f91ffd7f651c5f1f453a2fcdba 1065w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=f9f0e8e66f8ff45b19dc007229203dfd 965w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=942ca82d4b0deb75dd54bde1dd0c7798 725w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=cab3eb5c18ac244e7f579638ed4b3fb8 645w, https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=852ebee16aafb9b4a427c3dab4d33ef7 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"Some(halfWidth)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Buck Cullen with his daughter Kaiarahi (10 months) in his backyard, where he is storing a pair of massive sperm whale jawbones. Cullen is an integral member of the whale recovery team, alongside Hori Parata.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=d73916fda0f6c60b5eebcb71fea643e9","srcsets":"https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=0837c35918c3ba89e8db5456e8df48a9 1920w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=b86dc8186a6f212d9c6b942a5c87e92a 1225w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=975cb0adbeae95483e7cb54a74f97766 1065w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=624139eae65dd4c96efd1a90243b9286 965w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=98b9351340e8ee30063a4b6eb6501d6f 725w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=912104c53b38d1cd424bfb82302480e1 645w, https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=06848a63793084a21bc86aa613b126a7 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":2.056555269922879,"role":"Some(immersive)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"12 parāoa whales (sperm whales) recently stranded on the South Taranaki coast of Kaupokonui, on a scale not seen near this location in recent memory.","credit":"Photograph: Ngatiwai Trust Board","displayCredit":true,"src":"https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=700&quality=85&auto=format&fit=max&s=ee921715aaf10e0816dcf15dfc3a21f5","srcsets":"https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=1920&quality=85&auto=format&fit=max&s=d8546770d3bed1f5bd10862c24a6e637 1920w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=1225&quality=85&auto=format&fit=max&s=a1dbe38f2758df3e2fb5f02d607a2361 1225w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=1065&quality=85&auto=format&fit=max&s=f2604760799cc0abb28fa62974aa9eeb 1065w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=965&quality=85&auto=format&fit=max&s=99f66d32cf8a82fdbbcb096fa3718180 965w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=725&quality=85&auto=format&fit=max&s=922543f9d2051ebcaedb02a26dcec6e7 725w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=645&quality=85&auto=format&fit=max&s=87fdac384e5e441cf6d78ca183a11b4a 645w, https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=465&quality=85&auto=format&fit=max&s=270cfb5f42dd1e87d1270324765bcedb 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.3333333333333333,"role":"None","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Te Kaurinui , of the Māori tribe Ngātiwai, in front of the carving shed at Hihiaua Cultural Centre in Whangārei.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=4e46b70079819caee86359a058c92be1","srcsets":"https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=0ed1f0b6dc22400cd96e567c64421429 1920w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=9a88a77704c6297148a851f3e5b8bb25 1225w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=452075a28dfa2038124ed6e51511996f 1065w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=e4b934850a6fa718b5f4885ae19e58c0 965w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=26e511554f5f7560e7db42496af42743 725w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=ef546f7fd9990467e89bd0e654beb2c9 645w, https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=cee8a8ae07be4603a19a5ffe47e6e721 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5384615384615385,"role":"Some(showcase)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"The Pou in front of the carving shed at Hihiaua Cultural Centre, Whangārei. The Pou is a unique tribal identifier and statement relating to tribal ancestral history, usually placed near the entrance of Māori communities.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=700&quality=85&auto=format&fit=max&s=b8bf0c299908608310fb47e4163afb38","srcsets":"https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=1920&quality=85&auto=format&fit=max&s=000e43138711ad0df012d924f94c58e8 1920w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=1225&quality=85&auto=format&fit=max&s=a45bed6f7d96874f75b387cfee528b75 1225w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=1065&quality=85&auto=format&fit=max&s=be38dade9b373c6a945b5ea9a0282559 1065w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=965&quality=85&auto=format&fit=max&s=ffc34c593e88893efed516b515560784 965w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=725&quality=85&auto=format&fit=max&s=709e8ab4aac153fa2a4228861ac45814 725w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=645&quality=85&auto=format&fit=max&s=72cfc66500b62f5feefe638a673efee6 645w, https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=465&quality=85&auto=format&fit=max&s=a43a0c8c804f3588acfb63f64622ffda 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":0.89125,"role":"Some(halfWidth)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Kauri (Tekaurinui Robert) Parata, holds three whale teeth recovered from a beached whale. The middle tooth shows the marks where a poacher had attempted to hack it out with an axe before the recovery group arrived. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father, Hori Parata.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=700&quality=85&auto=format&fit=max&s=3691946929b4105ba35ff9d306cb4fbc","srcsets":"https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=1920&quality=85&auto=format&fit=max&s=98d0d2683a6c4a281ba5bcabcf42191a 1920w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=1225&quality=85&auto=format&fit=max&s=94deec1c498e6f33eb3a2012ac0cbd46 1225w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=1065&quality=85&auto=format&fit=max&s=043e76e23863788e82be8c2a561299bf 1065w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=965&quality=85&auto=format&fit=max&s=72d9e5806a4908f3cad6f9dac0ba9086 965w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=725&quality=85&auto=format&fit=max&s=a6b464fb2996237e5e1abdf9507bb9ad 725w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=645&quality=85&auto=format&fit=max&s=52d5546a1877f1650d62eabd8a4cbd65 645w, https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=465&quality=85&auto=format&fit=max&s=439e0a8b8eb590a50bd8f14afdbd77a8 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":0.9946691752900596,"role":"Some(halfWidth)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"Whangārei Harbour from Tamaterau, looking south through Mangrove sprouts coming up through the harbourside silt.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=72146577e379bdf9a21bc47994de5fb6","srcsets":"https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=b901d1603f60de20ac92cde8c5530f9a 1920w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=b806e461dfd0802b4bbcd11c9ec41422 1225w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=991396565458ab6d971eb2454be6dfe7 1065w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=04f953b4ec9555178204a1621b8a1f59 965w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=8f53cf25b514e283cce3d995220ca19b 725w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=0da775328d9ade5ca605079a9118a64a 645w, https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=7ecf73b514ceb1b5e0391f17c7a4d3b0 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.561991539212496,"role":"Some(immersive)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"The skull of a bryde’s whale, in the storage container at Hihiaua Cultural Centre, Whangārei.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=1d00d3ea91d32110b40d85ff43227728","srcsets":"https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=c6583967aaa5c2df016c57f4a20341a0 1920w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=f6bba2045f5f051fde1d1a8c6884610b 1225w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=0d2a1446efbd7ffd0691a0688289954f 1065w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=71cb62e93757af08382cd957384ceeb0 965w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=751b1dd3a610af0269a26750c3bbf4fd 725w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=8b9261224d64405b025c3f1e4d53afc7 645w, https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=cc8363ac4996b67e573ac8c8ba757194 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"Some(showcase)","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"},{"caption":"A large-calibre bullet of the type that the New Zealand Department of Conservation (DOC) uses for euthanasing stranded whales that are beyond rescue.","credit":"Photograph: Adrian Malloch","displayCredit":true,"src":"https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=700&quality=85&auto=format&fit=max&s=7dca3d798aef3526f42e281771d50f91","srcsets":"https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=1920&quality=85&auto=format&fit=max&s=87093fa7f0dacd92cec83b1c48f8d6b9 1920w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=1225&quality=85&auto=format&fit=max&s=d19283f99ce869b612b7e7c261d4eaef 1225w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=1065&quality=85&auto=format&fit=max&s=e860795a18b8b49f019c6239b36c8ecb 1065w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=965&quality=85&auto=format&fit=max&s=fa310d9daf94a35f0d7f4f713d49664b 965w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=725&quality=85&auto=format&fit=max&s=ce61beb1904c118937ababc1bce9ecc7 725w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=645&quality=85&auto=format&fit=max&s=658ca8711c218825d8dc5fe0c487b5ce 645w, https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=465&quality=85&auto=format&fit=max&s=1f050826c011862ac64281a45ff88b4d 465w","sizes":"(min-width: 1300px) 1920px, (min-width: 1140px) 1225px, (min-width: 980px) 1065px, (min-width: 740px) 965px, (min-width: 660px) 725px, (min-width: 480px) 645px, 465px","ratio":1.5,"role":"None","parentContentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","id":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings"}]},"googleSearchId":"007466294097402385199:m2ealvuxh1i","tones":"Features","shouldHideReaderRevenue":false,"idUrl":"https://profile.theguardian.com","hasInlineMerchandise":false,"omnitureAmpAccount":"guardiangu-thirdpartyapps","dfpAdUnitRoot":"theguardian.com","trackingNames":"Australia Foreign","host":"https://www.theguardian.com","hasShowcaseMainElement":false,"blogIds":"","sectionName":"Environment","hasMultipleVideosInPage":false,"fbAppId":"180444840287","isContent":true,"shortUrlId":"/p/a84nt","dfpAccountId":"59666047","plistaPublicApiKey":"462925f4f131001fd974bebe","wordCount":1591,"cardStyle":"feature","adUnit":"/59666047/theguardian.com/environment/article/ng","discussionApiUrl":"https://discussion.theguardian.com/discussion-api","isSensitive":true,"ophanEmbedJsUrl":"//j.ophan.co.uk/ophan.embed","edition":"US","userAttributesApiUrl":"https://members-data-api.theguardian.com/user-attributes","videoDuration":null,"blogs":"","discussionApiClientHeader":"nextgen","section":"environment","disableStickyTopBanner":true,"dfpHost":"pubads.g.doubleclick.net","weatherapiurl":"/weatherapi/city","sentryPublicApiKey":"344003a8d11c41d8800fbad8383fdc50","shortUrl":"https://gu.com/p/a84nt","thumbnail":"https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_320_4800_2880/500.jpg?quality=85&auto=format&fit=max&s=b851f7cba3eaf4908b92d2ce5eb000c0","pillar":"News","pageId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","references":[{"rich-link":"https://www.theguardian.com/environment/2015/oct/19/sign-up-to-the-green-light-email"}],"beaconUrl":"//phar.gu-web.net","commentable":false,"discussionD2Uid":"zHoBy6HNKsk","ophanJsUrl":"//j.ophan.co.uk/ophan.ng","contributorBio":"","keywordIds":"environment/oceans,world/newzealand,environment/environment,world/asia-pacific,world/world,environment/whales,environment/cetaceans,environment/marine-life,environment/wildlife","contentType":"Article","isDev":false,"isHosted":false,"facebookIaAdUnitRoot":"facebook-instant-articles","sponsorshipType":"foundation","stripePublicToken":"pk_live_2O6zPMHXNs2AGea4bAmq5R7Z","omnitureAccount":"guardiangu-network","locationapiurl":"/weatherapi/locations?query=","authorIds":"profile/eleanor-ainge-roy","isPaidContent":false,"hasYouTubeAtom":false,"externalEmbedHost":"https://embed.theguardian.com","thirdPartyAppsAccount":"guardiangu-thirdpartyapps","ajaxUrl":"https://api.nextgen.guardianapps.co.uk","byline":"Eleanor Ainge Roy (reporting) and Adrian Malloch (photography)","keywords":"Oceans,New Zealand,Environment,Asia Pacific,World news,Whales,Cetaceans,Marine life,Wildlife","contentId":"environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","nonKeywordTagIds":"environment/series/seascape-the-state-of-our-oceans,type/article,tone/features,profile/eleanor-ainge-roy,publication/theguardian,theguardian/mainsection,theguardian/mainsection/international,tracking/commissioningdesk/australia-foreign","mobileAppsAdUnitRoot":"beta-guardian-app","hasPageSkin":false,"requiresMembershipAccess":false,"seriesTags":"Seascape: the state of our oceans","revisionNumber":"DEV","seriesId":"environment/series/seascape-the-state-of-our-oceans","optimizeEpicUrl":"https://support.theguardian.com/epic/control/index.html","hbImpl":"prebid","assetsPath":"https://assets.guim.co.uk/","mmaUrl":"https://manage.theguardian.com","dfpNonRefreshableLineItemIds":[66664167,66868167,66972327,68842407,69144807,69710127,70516407,70931847,71342607,72502287,72503607,72619527,72664767,72675687,73773207,73829127,74480367,74645967,74823567,74824167,75586767,75588207,76352007,76437927,76443087,76443567,76603287,77324247,77504847,77546367,77561007,77590287,77622207,77747367,78316047,78455967,78470967,78507807,78713607,79009167,79094487,80502447,80568087,80568207,80568327,80568447,80569047,81002967,82211367,82339767,82879287,82881807,83178927,85253487,85558287,85961247,86814567,87004887,87191607,87726207,87852807,87878367,88153527,88333647,88420407,88526727,88621527,88861167,88903647,89035647,89035887,89036607,89084607,89084967,89141967,89356167,89743047,89793087,90159687,90323007,90359967,90935367,91095807,91118247,91732647,91985967,92216007,92355087,92436807,92506887,92681487,92948847,93121767,93550767,93717567,93784887,93785607,93930207,94193007,94625967,94674927,94822527,95840847,95931207,96296367,97911207,97980687,98151207,98165247,98610447,98671647,98893047,101192247,101476527,101684007,101999127,102061647,102066567,102344847,102790767,102792207,102892767,102894687,102895167,102895647,103062327,104218407,106736607,107115927,107235087,107509047,107955087,108799287,108893967,109638687,109648167,109761807,109831287,111055527,111057567,112706967,112799127,112882647,112888527,112950567,113374647,113880927,114906327,115133247,116149647,117980727,118054767,118236687,118631847,118934247,119632887,121592967,122583687,123487167,123873927,123978567,123996567,123996927,123997527,124001247,124418247,125878047,126003687,126004167,130630407,130630647,130686687,130686807,130693287,130777407,130840767,130954407,131115447,131135007,131652687,132065367,132325287,132348327,132758367,133502127,133852047,133854327,133989327,134130087,134567967,134876607,134979567,135278007,135292767,135353727,135773007,135776847,135826887,135841887,135850407,136120767,136236207,136278807,136455207,136550247,137025927,137200287,137382567,140139567,140711127,141827967,142466367,142822767,142883847,143109567,144237927,144965967,146321007,146324607,146326287,146339727,146355567,147006447,147500367,147801807,148154487,148154607,148446687,148454487,152119407,152146047,153546927,154108047,154108167,154112007,154112367,154113087,154113207,154114887,154125567,154126407,154290807,154290927,154291287,154291407,154291527,154291887,154295007,154295967,154297527,154303287,154303527,154332087,154386087,154387407,154391247,154391967,154392927,154394847,154540527,154544247,154693287,154793967,154794087,155010327,155010447,158149767,160437567,162853767,163112127,163372647,165575127,4345086236,4345095356,4345169885,4345177565,4345182855,4345186250,4349172433,4360612711,4360793649,4371265570,4371369115,4393832120,4400994377,4428613611,4443205897,4451525654,4480779579,4498662865,4512645730,4516493673,4516698376,4517304218,4517378559,4517379732,4517380203,4539078702,4539981050,4543952332,4543954711,4543956142,4544243919,4544245668,4544246565,4544412389,4544419667,4544420099,4544422019,4546091198,4548855586,4549107258,4552894255,4555165414,4555183615,4555236856,4555635725,4555650690,4555674903,4555684517,4555688577,4556153989,4556285026,4556324359,4556326294,4556648082,4556678787,4557241378,4557634755,4557708173,4557762374,4557783054,4557975570,4558001894,4558745950,4558957661,4559094602,4559618101,4560130208,4560176292,4560182777,4579011086,4579746196,4584262791,4586005424,4586012639,4598413679,4600377077,4608554346,4612781170,4613725167,4621133512,4631660550,4652061785,4659761500,4666709965,4667573429,4671027724,4671116147,4680579583,4680686606,4684616813,4688643082,4689601181,4689828177,4691056731,4698081076,4698085906,4698483837,4698485673,4698836785,4700389583,4702727917,4705009339,4715712191,4719669541,4739368280,4740423257,4741268540,4741269263,4747143757,4752748306,4767328492,4769268149,4770577846,4792772098,4792772101,4792772104,4792772107,4792772110,4792772116,4792772119,4792772122,4792772125,4792772128,4792772131,4792772137,4792772146,4792772149,4792772152,4792772155,4792772158,4792772281,4792772284,4792772293,4792772299,4792772302,4792772305,4792772308,4792772572,4792772575,4792772578,4792772581,4792780507,4792780510,4792780513,4792780516,4792780519,4792780522,4792780525,4792780528,4792780531,4792780534,4792780537,4792780540,4792780543,4792780546,4792780549,4792780552,4792780555,4792780558,4792780681,4792780684,4792780687,4792780690,4792780693,4792780696,4792780699,4792780702,4792780705,4792780708,4792780711,4792781512,4792781515,4792781518,4792781641,4792781644,4792781647,4792781650,4792781653,4792781656,4792781659,4792781662,4792781665,4792781668,4792781671,4792781674,4792781677,4792781680,4792781683,4792781686,4792781689,4792781692,4792781695,4792781698,4792781701,4792781704,4792781707,4792781713,4792781716,4792781719,4792781722,4792781725,4792781728,4792781731,4792781734,4792781737,4792781743,4792781746,4792781749,4792781752,4792781755,4792781758,4792781881,4792781884,4792781887,4792781890,4792781893,4792781896,4792781899,4792781902,4792781905,4792781908,4792781911,4792781980,4792781983,4792781986,4792781989,4792781992,4792781995,4792781998,4792782121,4792782124,4792782127,4792782130,4792782133,4792782136,4792782139,4792782142,4792782148,4792782151,4792782154,4792782157,4792782160,4792782163,4792782166,4792782169,4792782172,4792782175,4792782178,4792782181,4792782184,4792782187,4792782190,4792782193,4792782196,4792782199,4792782202,4792782205,4792782208,4792782211,4792782214,4792782217,4792782220,4792782223,4792782226,4792782229,4792782232,4792782235,4792782238,4792782361,4792782364,4792782367,4792782370,4792782373,4792782376,4792782379,4792782382,4792782385,4792782388,4792782391,4792782394,4792782397,4792782400,4792782403,4792782406,4792782409,4792782412,4792782415,4792782418,4792782421,4792782427,4792782430,4792782433,4792782436,4792782439,4792782448,4792782451,4792783144,4792783147,4792783150,4792783153,4792783156,4792783159,4792783162,4792783165,4792783168,4792783171,4792783174,4792783177,4792783180,4792783183,4792783186,4792783189,4792783192,4792783195,4792783198,4792783321,4792783327,4792783330,4792783333,4792783336,4792783339,4792783342,4792783345,4792783348,4792783351,4792783354,4792783357,4792783360,4792783363,4792783366,4792783369,4792783372,4792783375,4792783378,4792783381,4792783384,4792783387,4792783390,4792783393,4792783396,4792783399,4792783402,4792783405,4792783408,4792783411,4792783414,4792783417,4792783420,4792783423,4792783426,4792783429,4792783432,4792783435,4792783438,4792783561,4792783564,4792783567,4792783570,4792783573,4792783576,4792783579,4792783582,4792783585,4792783588,4792783591,4792783594,4792783597,4792783600,4792783603,4792783606,4792783612,4792783615,4792783618,4792783621,4792783624,4792783627,4792783630,4792783633,4792783636,4792783639,4792783642,4792783645,4792783648,4792783651,4792783654,4792783657,4792783660,4792783663,4792783666,4792783669,4792783672,4792783675,4792783678,4792783801,4792783804,4792783807,4792784083,4792784086,4792784089,4792784092,4792784095,4792784098,4792784101,4792784104,4792784107,4792784110,4792784113,4792784116,4792784119,4792784122,4792784125,4792784128,4792784131,4792784134,4792784137,4792784140,4792784143,4792784146,4792784149,4792784152,4792784158,4792784281,4792784284,4792784287,4792784290,4792784293,4792784296,4792784299,4792784302,4792784305,4792784308,4792784311,4792784314,4792784317,4792784320,4792784323,4792784326,4792784329,4792784332,4792784335,4792784338,4792784341,4792784344,4792784347,4792784350,4792784353,4792784356,4792784359,4792784362,4792784365,4792784368,4792784371,4792784374,4792784377,4792784380,4792784383,4792784386,4792784389,4792784392,4792784395,4792784398,4792784521,4792784524,4792784527,4792784530,4792784533,4792784536,4792784539,4792784542,4792784545,4792784548,4792784554,4792784557,4792784560,4792784563,4792784566,4792784569,4792784572,4792784578,4792784581,4792784584,4792784587,4792784590,4792784593,4792784596,4792784599,4792784602,4792784608,4792784611,4792784614,4792784617,4792784620,4792784623,4792784626,4792784629,4792784632,4792784635,4792784638,4792784761,4792784764,4792784767,4792784770,4792784773,4792784776,4792784779,4792784782,4792784785,4792784788,4792784791,4792784794,4792784797,4792784800,4792784803,4792784806,4792784809,4792784812,4792784815,4792784818,4792784821,4792784824,4792784827,4792784830,4792784833,4792784836,4792784839,4792784842,4792784845,4792784848,4792784851,4792784854,4792784857,4792784860,4792784863,4792784866,4792784869,4792784872,4792784875,4792784878,4792785001,4792785004,4792785007,4792785010,4792785013,4792785016,4792785019,4792785244,4792785247,4792785250,4792785253,4792785256,4792785259,4792785262,4792785265,4792785268,4792785271,4792785274,4792785277,4792786057,4792786060,4792786063,4792786066,4792786069,4792786072,4792786075,4792786078,4792786201,4792786204,4792786207,4792786210,4792786213,4792786216,4792786219,4792786222,4792786225,4792786228,4792786231,4792786234,4792786237,4792786240,4792786243,4792786246,4792786249,4792786252,4792786255,4792786258,4792786261,4792786264,4792786267,4792786270,4792786273,4792786276,4792786279,4792786282,4792786285,4792786288,4792786291,4792786294,4792786297,4792786300,4792786303,4792786306,4792786309,4792786312,4792786315,4792786318,4792786441,4792786984,4792786987,4792786990,4792786993,4792786996,4792786999,4792787002,4792787005,4792787008,4792787011,4792787014,4792787017,4792787020,4792787023,4792787026,4792787029,4792787032,4792787035,4792787038,4792787161,4792787164,4792787167,4792787170,4792787173,4792787176,4792787179,4792787182,4792787185,4792787188,4792787191,4792787194,4792787197,4792787200,4792787203,4792787206,4792787209,4792787212,4792787215,4792787218,4792787221,4792787224,4792787227,4792787230,4792787233,4792787236,4792787239,4792787242,4792787245,4792787248,4792787251,4792787254,4792787257,4792787260,4792787263,4792787266,4792787644,4792787647,4792787650,4792787653,4792787656,4792787659,4792787662,4792787665,4792787668,4792787671,4792787674,4792787677,4792787680,4792787683,4792787686,4792787689,4792787692,4792787695,4792787698,4792787701,4792787704,4792787707,4792787710,4792787713,4792787716,4792787719,4792787722,4792787725,4792787728,4792787731,4792787734,4792787737,4792787740,4792787743,4792787746,4792787749,4792787752,4792787755,4792787758,4792787881,4792787884,4792787887,4792787890,4792787893,4792787896,4792787899,4792787902,4792787905,4792787908,4792787911,4792787914,4792787917,4792787920,4792787923,4792787926,4792787929,4792787932,4792787935,4792787938,4792787941,4792787944,4792787947,4792787950,4792787953,4792787956,4792787959,4792787962,4792787965,4792787968,4792787971,4792787974,4792787977,4792787980,4792787983,4792787986,4792787989,4792787995,4792787998,4792788121,4792788124,4792788127,4792788130,4792788133,4792788136,4792788139,4792788142,4792788145,4792788148,4792788151,4792788154,4792788157,4792788160,4792788163,4792788166,4792788169,4792788172,4792788175,4792788178,4792788181,4792788628,4792788631,4792788634,4792788640,4792788643,4792788646,4792788649,4792788652,4792788655,4792788658,4792788661,4792788664,4792788667,4792788670,4792788673,4792788676,4792788679,4792788682,4792788685,4792788688,4792788694,4792788697,4792788700,4792788703,4792788706,4792788709,4792788712,4792788715,4792788718,4792788841,4792789561,4792789564,4792789567,4792789570,4792789573,4792789576,4792789579,4792789582,4792789585,4792789591,4792789594,4792789597,4792789600,4792789603,4792789606,4792789609,4792789612,4792789615,4792789618,4792789621,4792789624,4792789627,4792789630,4792789633,4792789636,4792789639,4792789642,4792789645,4792789648,4792789651,4792789654,4792789657,4792789660,4792789663,4792789666,4792789669,4792789672,4792789675,4792789678,4792789801,4792789804,4792789807,4792789810,4792789813,4792789816,4792789819,4792789822,4792789825,4792789828,4792789831,4792789834,4792789837,4792789840,4792789843,4792789846,4792789849,4792789852,4792789855,4792789858,4792789861,4792789864,4792789867,4792789870,4792789873,4792789876,4792789879,4792789882,4792789885,4792789888,4792789891,4792789894,4792789897,4792789900,4792789903,4792789906,4792789909,4792789912,4792789915,4792789918,4792790041,4792790044,4792790047,4792790050,4792790053,4792790056,4792790059,4792791508,4792791511,4792791997,4792792000,4792792003,4792792006,4792792009,4792792012,4792792015,4792792018,4792792021,4792792024,4792792027,4792792030,4792792033,4792792036,4792792039,4792792042,4792792045,4792792048,4792792051,4792792249,4792792252,4792792255,4792792258,4792792261,4792792264,4792792267,4792792270,4792792273,4792792276,4792792279,4792792282,4792792285,4792792288,4792792291,4792792294,4792792297,4792792300,4792792303,4792792306,4792792309,4792792312,4792792315,4792792318,4792792441,4792792444,4792792447,4792792450,4792792453,4792792456,4792792459,4792792462,4792792465,4792792468,4792792471,4792792474,4792792477,4792792480,4792792483,4792792486,4792792492,4792792495,4792792498,4792792501,4792792504,4792792507,4792792510,4792792513,4792792516,4792792519,4792792522,4792792525,4792792528,4792792531,4792792534,4792792537,4792792540,4792792543,4792792546,4792792549,4792792552,4792792555,4792792558,4792792681,4792792684,4792792687,4792792693,4792792696,4792792699,4792792702,4792792705,4792792708,4792792711,4792792714,4792792717,4792792720,4792792723,4792792726,4792792729,4792792732,4792792735,4792792738,4792792741,4792792744,4792792747,4792792750,4792792753,4792792756,4792792759,4792792762,4792792765,4792792768,4792792771,4792792774,4792792777,4792792780,4792792783,4792792786,4792792789,4792792792,4792792795,4792792798,4792792921,4792792924,4792792927,4792792930,4792792933,4792792936,4792792939,4792792942,4792792945,4792792984,4792792987,4792792990,4792792993,4792792996,4792792999,4792793002,4792793005,4792793008,4792793011,4792793014,4792793017,4792793020,4792793023,4792793026,4792793029,4792793032,4792793035,4792793038,4792793161,4792793164,4792793167,4792793170,4792793173,4792793176,4792793179,4792793182,4792793185,4792793188,4792793191,4792793194,4792793197,4792793200,4792793203,4792793206,4792793209,4792793212,4792793215,4792793218,4792793221,4792793224,4792793227,4792793230,4792793233,4792793236,4792793239,4792793242,4792793245,4792793248,4792793251,4792793254,4792793257,4792793260,4792793263,4792793266,4792793269,4792793272,4792793275,4792793278,4792793401,4792793404,4792793407,4792793410,4792793413,4792793416,4792793419,4792793422,4792794844,4792794847,4792794850,4792794853,4792794856,4792794859,4792794862,4792794865,4792794868,4792794871,4792794874,4792794877,4792794880,4792794883,4792794886,4792794889,4792794892,4792794895,4792794898,4792794901,4792794904,4792794907,4792794910,4792794913,4792794916,4792794919,4792794922,4792794925,4792794928,4792794931,4792794934,4792794937,4792794940,4792794943,4792794946,4792794949,4792794952,4792794955,4792794958,4792795081,4792795084,4792795087,4792795090,4792795093,4792795096,4792795099,4792795102,4792795105,4792795108,4792795111,4792795114,4792795117,4792795120,4792795123,4792795126,4792795129,4792795132,4792795135,4792795138,4792795141,4792795144,4792795147,4792796044,4792796047,4792796050,4792796053,4792796056,4792796059,4792796062,4792796065,4792796068,4792796599,4792796602,4792796623,4792796626,4792796629,4792796632,4792796635,4792796638,4792796761,4792796764,4792796767,4792796770,4792796773,4792796776,4792796779,4792796782,4792797532,4792797535,4792797538,4792797541,4792797544,4792797547,4792797550,4792797553,4792797556,4792797559,4792797562,4792797565,4792797568,4792797571,4792797574,4792797577,4792797580,4792797583,4792797586,4792797589,4792797592,4792797595,4792797598,4792797721,4792797724,4792797727,4792797730,4792797733,4792797736,4792797739,4792797742,4792797745,4792797748,4792797751,4792797754,4792797757,4792797760,4792797763,4792797766,4792797769,4792797772,4792797775,4792797778,4792797781,4792797802,4792797805,4792797808,4792797811,4792797835,4792797838,4792797961,4792797964,4792797967,4792797970,4792797973,4792797976,4792797979,4792797982,4792797985,4792797988,4792797991,4792798444,4792798447,4792798450,4792798453,4792798456,4792798459,4792798465,4792798468,4792798471,4792798474,4792798477,4792798480,4792798483,4792798486,4792798489,4792798492,4792798495,4792798498,4792798501,4792798504,4792798507,4792798510,4792798513,4792798516,4792798519,4792798522,4792798525,4792798528,4792798531,4792798534,4792798537,4792798540,4792798543,4792798546,4792798549,4792798552,4792798555,4792798558,4792798681,4792798684,4792798687,4792798690,4792798693,4792798696,4792798699,4792798702,4792798705,4792798708,4792798711,4792798714,4792798717,4792798720,4792798723,4792798726,4792798729,4792798732,4792798735,4792798738,4792798741,4792798744,4792798747,4792798750,4792798753,4792798756,4792798759,4792798762,4792798765,4792798768,4792798771,4792798774,4792798777,4792798780,4792798783,4792798786,4792798789,4792798792,4792798795,4792798798,4792798921,4792798924,4792798927,4792798930,4792798933,4792798936,4792798939,4792798942,4792798945,4792798948,4792798951,4792798954,4792798957,4792798960,4792798963,4792798966,4792798969,4792798972,4792798975,4792798978,4792798981,4792799644,4792799647,4792799650,4792799653,4792799656,4792799659,4792799662,4792799665,4792799668,4792799671,4792799674,4792799677,4792799680,4792799683,4792799686,4792799689,4792799692,4792799695,4792799698,4792799701,4792799704,4792799707,4792799710,4792799713,4792799716,4792799719,4792799722,4792799725,4792799728,4792799731,4792799734,4792799737,4792799740,4792799743,4792799746,4792799749,4792799752,4792799755,4792799758,4792799881,4792799884,4792799887,4792799890,4792799893,4792799896,4792799899,4792799902,4792799905,4792799908,4792799911,4792799914,4792799917,4792799920,4792799923,4792799926,4792799929,4792799932,4792799935,4792799938,4792799941,4792799944,4792799947,4792799950,4792799953,4792799956,4792799959,4792799962,4792799965,4792799968,4792799971,4792799974,4792799977,4792799980,4792799983,4792799986,4792799989,4792799992,4792799995,4792799998,4792800121,4792800124,4792800127,4792800130,4792800133,4792800136,4792800139,4792800142,4792800145,4792800148,4792800154,4792800157,4792800160,4792800163,4792800166,4792800169,4792800172,4792800175,4792800436,4792800439,4792800442,4792800445,4792800448,4792800451,4792800454,4792800457,4792800460,4792800463,4792800466,4792800469,4792800472,4792800475,4792800478,4792800601,4792800604,4792800607,4792800610,4792800613,4792800616,4792800619,4792800622,4792800625,4792800628,4792800631,4792800634,4792800637,4792800640,4792800643,4792800646,4792800649,4792800652,4792800655,4792800658,4792800661,4792800664,4792800667,4792800670,4792800673,4792800676,4792800679,4792800682,4792800685,4792800688,4792800691,4792800694,4792800697,4792800700,4792800703,4792800706,4792800709,4792800712,4792800715,4792800718,4792800841,4792800844,4792800847,4792800850,4792800853,4792800856,4792800859,4792800862,4792800865,4792800868,4792800871,4792800874,4792800877,4792800880,4792800883,4792800886,4792800889,4792800892,4792800895,4792800898,4792800901,4792800904,4792800910,4792800913,4792800916,4792800919,4792800922,4792800925,4792800928,4792800931,4792800934,4792800937,4792800940,4792800943,4792800946,4792800949,4792800952,4792800955,4792800958,4792801081,4792801084,4792801087,4792801090,4792801093,4792801096,4792801099,4792801102,4792801105,4792802311,4792802314,4792802317,4792802320,4792802323,4792802326,4792802329,4792802332,4792802335,4792802338,4792802341,4792802344,4792802347,4792802350,4792802353,4792802356,4792802359,4792802362,4792802365,4792802368,4792802371,4792802374,4792802377,4792802380,4792802383,4792802386,4792802389,4792802392,4792802395,4792802398,4792802521,4792802524,4792802527,4792802530,4792802533,4792802536,4792802539,4792802542,4792802545,4792802548,4792802551,4792802554,4792802557,4792802560,4792802563,4792802566,4792802569,4792802572,4792802575,4792802578,4792802581,4792803010,4792803013,4792803016,4792803019,4792803022,4792803025,4792803028,4792803031,4792803034,4792803037,4792803040,4792803043,4792803046,4792803049,4792803052,4792803055,4792803058,4792803061,4792803064,4792803067,4792803070,4792803073,4792803076,4792803079,4792803082,4792803085,4792803088,4792803091,4792803094,4792803097,4792803100,4792803103,4792803106,4792803109,4792803112,4792803115,4792803118,4792803241,4792803244,4792803247,4792803250,4792803253,4792803256,4792803259,4792803262,4792803265,4792803268,4792803271,4792803274,4792803277,4792803280,4792803283,4792803286,4792803289,4792803292,4792803295,4792803298,4792803301,4792803304,4792803307,4792803310,4792803313,4792803316,4792803319,4792803322,4792803325,4792803328,4792803331,4792803334,4792803337,4792803340,4792803343,4792803346,4792803349,4792803352,4792803355,4792803358,4792803481,4792803484,4792803487,4792803490,4792803493,4792803496,4792803499,4792803502,4792803505,4792803508,4792803511,4792804054,4792804057,4792804060,4792804063,4792804066,4792804069,4792804072,4792804075,4792804078,4792804201,4792804204,4792804207,4792804210,4792804213,4792804216,4792804219,4792804222,4792804225,4792804228,4792804231,4792804234,4792804237,4792804240,4792804243,4792804246,4792804249,4792804252,4792804255,4792804258,4792804261,4792804264,4792804267,4792804270,4792804273,4792804276,4792804279,4792804282,4792804285,4792804288,4792804291,4792804294,4792804297,4792804300,4792804303,4792804306,4792804309,4792804312,4792804315,4792804318,4792804441,4792804444,4792804447,4792804450,4792804453,4792804456,4792804459,4792804462,4792804465,4792804468,4792804471,4792804474,4792804477,4792804480,4792804483,4792804486,4792804489,4792804492,4792804495,4792804498,4792804501,4792804504,4792804507,4792804510,4792804513,4792804516,4792804519,4792804522,4792804525,4792804528,4792804531,4792804936,4792804939,4792804942,4792804945,4792804948,4792804951,4792804954,4792804957,4792804960,4792804966,4792804969,4792804972,4792804975,4792804978,4792804981,4792804984,4792804987,4792804990,4792804993,4792804996,4792804999,4792805002,4792805005,4792805008,4792805011,4792805014,4792805017,4792805020,4792805023,4792805026,4792805029,4792805032,4792805035,4792805038,4792805161,4792805164,4792805167,4792805170,4792805173,4792805176,4792805179,4792805182,4792805185,4792805188,4792805191,4792805194,4792805197,4792805200,4792805203,4792805206,4792805209,4792805212,4792805215,4792805218,4792805221,4792805224,4792805227,4792805230,4792805233,4792805236,4792805239,4792805242,4792805245,4792805248,4792805251,4792805254,4792805257,4792805260,4792805263,4792805266,4792805269,4792805272,4792805275,4792806658,4792806661,4792806664,4792806667,4792806670,4792806673,4792806676,4792806679,4792806682,4792806685,4792806688,4792806691,4792806694,4792806697,4792806700,4792806703,4792806706,4792806709,4792806712,4792806715,4792806718,4792806841,4792806844,4792806847,4792806850,4792806853,4792806856,4792806859,4792806862,4792806865,4792806868,4792806871,4792806874,4792806877,4792806880,4792806883,4792806886,4792806889,4792806892,4792806895,4792806898,4792806901,4792806904,4792806907,4792806910,4792806913,4792806916,4792806919,4792806922,4792806925,4792806928,4792806931,4792806934,4792806937,4792806940,4792806943,4792806946,4792806949,4792806952,4792806955,4792806958,4792807081,4792807084,4792807087,4792807090,4792807093,4792807096,4792807102,4792807105,4792807108,4792807111,4792807114,4792807117,4792807120,4792807123,4792807126,4792807129,4792807132,4792807135,4792807138,4792807141,4792807144,4792807147,4792807150,4792807153,4792807156,4792807159,4792807162,4792807165,4792807168,4792807171,4792807174,4792807177,4792807180,4792807183,4792807186,4792807189,4792807192,4792807195,4792807198,4792807321,4792807324,4792807327,4792807330,4792807333,4792807336,4792807339,4792807342,4792807345,4792807348,4792807351,4792807354,4792807357,4792807360,4792807363,4792807366,4792807369,4792807372,4792807375,4792807378,4792807381,4792807384,4792807387,4792807390,4792807393,4792807396,4792807399,4792807402,4792807405,4792807408,4792807411,4792807414,4792807417,4792807420,4792807423,4792807426,4792807429,4792807432,4792807435,4792808314,4792808320,4792808323,4792808326,4792808329,4792808332,4792808335,4792808338,4792808341,4792808344,4792808347,4792808350,4792808353,4792808356,4792808359,4792808362,4792808365,4792808368,4792808371,4792808374,4792808377,4792808380,4792808383,4792808386,4792808389,4792808392,4792808395,4792808398,4792808521,4792808524,4792808527,4792808533,4792808536,4792808539,4792808542,4792808545,4792808548,4792808551,4792808554,4792808557,4792808560,4792808563,4792808566,4792808569,4792808572,4792808575,4792808578,4792808581,4792808584,4792808587,4792808590,4792808593,4792808596,4792808599,4792808602,4792808605,4792808608,4792808611,4792808614,4792808617,4792808620,4792808623,4792808626,4792808629,4792808632,4792808635,4792808638,4792808761,4792808764,4792808767,4792808770,4792808773,4792808776,4792808779,4792808782,4792808785,4792808788,4792808791,4792808794,4792808797,4792808800,4792808803,4792808806,4792808809,4792808812,4792808815,4792808818,4792808821,4792808824,4792808827,4792808830,4792808833,4792808836,4792808839,4792808842,4792808845,4792808848,4792808851,4792808854,4792808857,4792808860,4792808863,4792808866,4792808869,4792808872,4792808875,4792808878,4792809001,4792809004,4792809007,4792809010,4792809013,4792809016,4792809019,4792809022,4792809025,4792809028,4792809031,4792809034,4792809037,4792809040,4792809043,4792809046,4792809049,4792809052,4792809055,4792809058,4792809061,4792809064,4792809067,4792809070,4792809073,4792809076,4792809079,4792809082,4792809085,4792809088,4792809091,4792809094,4792809097,4792809100,4792809103,4792809106,4792809109,4792809112,4792809115,4792809118,4792809241,4792809244,4792809247,4792809250,4792809253,4792809256,4792809259,4792809262,4792809265,4792809268,4792809271,4792809274,4792809277,4792809280,4792809283,4792809286,4792809289,4792809292,4792809295,4792809298,4792809301,4792809595,4792809598,4792809721,4792809724,4792809727,4792809730,4792809733,4792809736,4792809739,4792809742,4792809745,4792809748,4792809751,4792809754,4792809757,4792809760,4792809763,4792809766,4792809769,4792809772,4792809775,4792809778,4792809781,4792809784,4792809787,4792809790,4792809796,4792809799,4792809802,4792809805,4792809808,4792809811,4792809814,4792809817,4792809820,4792809823,4792809826,4792809829,4792809832,4792809835,4792809838,4792809961,4792809964,4792809967,4792809970,4792809973,4792809976,4792809979,4792809982,4792809985,4792809988,4792809991,4792809994,4792809997,4792810000,4792810003,4792810006,4792810009,4792810012,4792810015,4792810018,4792810021,4792810024,4792810027,4792810030,4792810033,4792810036,4792810039,4792810042,4792810045,4792810048,4792810051,4792810054,4792810057,4792810060,4792810063,4792810066,4792810069,4792810072,4792810075,4792810078,4792810201,4792810204,4792810207,4792810210,4792810213,4792810216,4792810219,4792810222,4792810225,4792810228,4792810231,4792810234,4792810237,4792810240,4792810243,4792810246,4792810249,4792810252,4792810255,4792810258,4792810261,4792810264,4792810267,4792810270,4792810273,4792810276,4792810279,4792810282,4792810285,4792810288,4792810291,4792810294,4792810297,4792810300,4792810303,4792810306,4792810309,4792810312,4792810315,4792810318,4792810441,4792810444,4792810447,4792810450,4792810453,4792810456,4792810459,4792810462,4792810465,4792810468,4792810471,4792810474,4792810477,4792810480,4792810483,4792810486,4792810489,4792810492,4792810495,4792810498,4792810501,4792810504,4792810507,4792810510,4792810513,4792810516,4792810519,4792810714,4792810717,4792810720,4792810723,4792810726,4792810729,4792810732,4792810735,4792810738,4792810741,4792810744,4792810747,4792810750,4792810753,4792810756,4792810759,4792810762,4792810765,4792810768,4792810771,4792810774,4792810777,4792810780,4792810783,4792810786,4792810789,4792810792,4792810795,4792810921,4792810924,4792810927,4792810930,4792810933,4792810936,4792810939,4792810942,4792810945,4792810948,4792810984,4792810987,4792810990,4792810993,4792810996,4792810999,4792811005,4792811008,4792811011,4792811014,4792811017,4792811020,4792811023,4792811026,4792811029,4792811032,4792811035,4792811038,4792811161,4792811164,4792811167,4792811170,4792811173,4792811176,4792811179,4792811182,4792811185,4792811188,4792811191,4792811194,4792811197,4792811200,4792811203,4792811206,4792811209,4792811212,4792811215,4792811218,4792811221,4792811224,4792811227,4792811230,4792811233,4792811236,4792811239,4792811242,4792811245,4792811248,4792811251,4792811254,4792811257,4792811260,4792811263,4792811266,4792811269,4792811272,4792811275,4792811278,4792811401,4792811404,4792811407,4792811410,4792811413,4792811416,4792811419,4792811422,4792811425,4792811428,4792811431,4792811434,4792811437,4792811440,4792811443,4792811449,4792811452,4792811455,4792811458,4792811461,4792811464,4792811467,4792811470,4792811473,4792811476,4792811479,4792811482,4792811485,4792811488,4792811491,4792811494,4792811497,4792811500,4792811503,4792811506,4792811644,4792811650,4792811653,4792811656,4792811659,4792811662,4792811665,4792811668,4792811671,4792811674,4792811677,4792811680,4792811686,4792811689,4792811692,4792811695,4792811698,4792811701,4792811704,4792811707,4792811710,4792811713,4792811716,4792811719,4792811722,4792811725,4792811728,4792811731,4792811734,4792811737,4792811740,4792811743,4792811746,4792811749,4792811752,4792811755,4792811758,4792811881,4792811884,4792811887,4792811890,4792811893,4792811896,4792811899,4792811902,4792811905,4792811908,4792811911,4792811914,4792811917,4792811920,4792811923,4792811926,4792811929,4792811932,4792811935,4792811938,4792811944,4792811947,4792811950,4792811956,4792811959,4792811962,4792811968,4792811971,4792811974,4792811977,4792811980,4792811983,4792811986,4792811989,4792811992,4792811995,4792811998,4792812121,4792812124,4792812127,4792812130,4792812133,4792812136,4792812139,4792812142,4792812886,4792812889,4792812892,4792812895,4792812898,4792812901,4792812904,4792812907,4792812910,4792812913,4792812916,4792812919,4792812922,4792812925,4792812928,4792812931,4792812934,4792812937,4792812940,4792812943,4792812946,4792812949,4792812952,4792812955,4792812958,4792813081,4792813084,4792813087,4792813090,4792813093,4792813096,4792813099,4792813102,4792813105,4792813108,4792813111,4792813114,4792813117,4792813120,4792813123,4792813126,4792813129,4792813132,4792813135,4792813138,4792813141,4792813144,4792813147,4792813150,4792813153,4792813156,4792813159,4792813162,4792813165,4792813168,4792813171,4792813174,4792813177,4792813180,4792813183,4792813189,4792813192,4792813195,4792813198,4792813321,4792813324,4792813327,4792813330,4792813333,4792813336,4792813339,4792813342,4792813345,4792813348,4792813351,4792813354,4792813357,4792813360,4792813363,4792813366,4792813369,4792813372,4792813375,4792813378,4792813381,4792813384,4792813387,4792813390,4792813393,4792813396,4792813399,4792813402,4792813405,4792813408,4792813411,4792813414,4792813417,4792813420,4792813423,4792813426,4792813429,4792813432,4792813435,4792813438,4792813561,4792813564,4792813567,4792813570,4792813573,4792813576,4792813579,4792813582,4792813585,4792813588,4792813591,4792813594,4792813597,4792813600,4792813603,4792813606,4792813609,4792813612,4792813615,4792813618,4792813621,4792813624,4792813627,4792813630,4792813633,4792813636,4792813639,4792813642,4792813648,4792813651,4792813654,4792813657,4792813660,4792813663,4792813666,4792813669,4792813672,4792813675,4792813678,4792813801,4792813804,4792813807,4792813810,4792813813,4792813816,4792813819,4792813822,4792813825,4792813828,4792813831,4792813834,4792813837,4792813840,4792813843,4792813846,4792813849,4792813852,4792813855,4792813858,4792813861,4792813864,4792813867,4792813870,4792813873,4792813876,4792813879,4792813882,4792813885,4792813888,4792813891,4792813894,4792813897,4792813900,4792813903,4792813906,4792813909,4792813912,4792813915,4792813918,4792814041,4792814044,4792814047,4792814050,4792814053,4792814056,4792814059,4792814065,4792814068,4792814071,4792814074,4792814077,4792814080,4792814083,4792814086,4792814089,4792814095,4792814098,4792814101,4792814104,4792814107,4792814110,4792814113,4792814116,4792814122,4792814125,4792814128,4792814131,4792814134,4792815049,4792815052,4792815055,4792815058,4792815061,4792815064,4792815067,4792815070,4792815073,4792815076,4792815079,4792815082,4792815085,4792815088,4792815091,4792815094,4792815097,4792815100,4792815103,4792815106,4792815109,4792815115,4792815118,4792815241,4792815244,4792815247,4792815250,4792815253,4792815256,4792815259,4792815262,4792815265,4792815268,4792815271,4792815274,4792815277,4792815280,4792815283,4792815286,4792815289,4792815292,4792815295,4792815298,4792815301,4792815304,4792815307,4792815310,4792815313,4792815316,4792815319,4792815322,4792815325,4792815328,4792815331,4792815334,4792815337,4792815340,4792815343,4792815346,4792815349,4792815352,4792815355,4792815358,4792815481,4792815484,4792815487,4792815490,4792815493,4792815496,4792815499,4792815502,4792815505,4792815508,4792815511,4792815514,4792815517,4792815520,4792815523,4792815526,4792815529,4792815532,4792815535,4792815538,4792815541,4792815544,4792815547,4792815550,4792815553,4792815556,4792815559,4792815562,4792815565,4792815568,4792815571,4792815574,4792815577,4792815583,4792815586,4792815589,4792815592,4792815595,4792815598,4792815721,4792815724,4792815727,4792815730,4792815733,4792815736,4792815739,4792815742,4792815745,4792815748,4792815751,4792815754,4792815757,4792815760,4792815763,4792815766,4792815769,4792815772,4792815778,4792815781,4792815784,4792815790,4792815793,4792815796,4792815799,4792815802,4792815805,4792815808,4792815811,4792815814,4792815817,4792815823,4792815826,4792815829,4792815832,4792815835,4792815838,4792815964,4792815967,4792815970,4792815973,4792815976,4792815979,4792815982,4792815985,4792815988,4792815991,4792815994,4792815997,4792816000,4792816003,4792816006,4792816009,4792816012,4792816015,4792816018,4792816021,4792816024,4792816027,4792816030,4792816033,4792816036,4792816039,4792816042,4792816045,4792816048,4792816051,4792816054,4792816057,4792816060,4792816063,4792816066,4792816069,4792816072,4792816075,4792816078,4792816201,4792816204,4792816207,4792816210,4792816213,4792816216,4792816219,4792816222,4792816225,4792816228,4792816234,4792816237,4792816240,4792816243,4792816246,4792816249,4792816252,4792816255,4792816258,4792816261,4792816264,4792816267,4792816270,4792816273,4792816276,4792816279,4792816282,4792817662,4792817665,4792817668,4792817671,4792817674,4792817677,4792817680,4792817683,4792817686,4792817689,4792817692,4792817695,4792817698,4792817701,4792817704,4792817707,4792817710,4792817713,4792817716,4792817719,4792817722,4792817725,4792817728,4792817731,4792817734,4792817737,4792817740,4792817743,4792817746,4792817749,4792817752,4792817755,4792817758,4792817881,4792817884,4792817887,4792817890,4792817893,4792817896,4792817899,4792817902,4792817905,4792817908,4792817911,4792817914,4792817917,4792817920,4792817923,4792817926,4792817929,4792817932,4792817935,4792817938,4792817941,4792817944,4792817947,4792817950,4792817953,4792817959,4792817962,4792817965,4792817968,4792817971,4792817974,4792817977,4792817983,4792817986,4792817989,4792817992,4792817995,4792817998,4792818121,4792818124,4792818127,4792818130,4792818133,4792818136,4792818139,4792818142,4792818145,4792818148,4792818151,4792818154,4792818157,4792818160,4792818163,4792818166,4792818169,4792818172,4792818175,4792818178,4792818181,4792818184,4792818187,4792818190,4792818193,4792818196,4792818199,4792818202,4792818205,4792818208,4792818211,4792818214,4792818217,4792818220,4792818223,4792818226,4792818229,4792818232,4792818235,4792818238,4792818361,4792818364,4792818367,4792818370,4792818373,4792818376,4792818379,4792818382,4792818385,4792818388,4792818454,4792818457,4792818460,4792818463,4792818466,4792818469,4792818472,4792818478,4792818601,4792818604,4792818607,4792818610,4792818613,4792818616,4792818619,4792818622,4792818625,4792818628,4792818631,4792818634,4792818637,4792818640,4792818643,4792818646,4792818649,4792818652,4792818655,4792819114,4792819117,4792819120,4792819123,4792819126,4792819129,4792819132,4792819135,4792819138,4792819141,4792819144,4792819147,4792819150,4792819153,4792819156,4792819159,4792819162,4792819165,4792819168,4792819171,4792819174,4792819177,4792819180,4792819183,4792819186,4792819189,4792819192,4792819195,4792819198,4792819321,4792819324,4792819327,4792819330,4792819333,4792819336,4792819339,4792819342,4792819345,4792819348,4792819351,4792819354,4792819357,4792819360,4792819363,4792819366,4792820071,4792820074,4792820077,4792820080,4792820083,4792820086,4792820089,4792820092,4792820095,4792820098,4792820101,4792820104,4792820107,4792820110,4792820113,4792820116,4792820119,4792820122,4792820128,4792820131,4792820134,4792820137,4792820140,4792820143,4792820146,4792820149,4792820152,4792820155,4792820158,4792820281,4792820284,4792820287,4792820290,4792820293,4792820296,4792820299,4792820302,4792820305,4792820308,4792820311,4792820314,4792820317,4792820320,4792820326,4792820329,4792820332,4792820335,4792820338,4792820341,4792820344,4792820347,4792820350,4792820353,4792820356,4792820359,4792820362,4792820365,4792820368,4792820371,4792820374,4792820377,4792820380,4792820383,4792820386,4792820389,4792820392,4792820395,4792820398,4792820521,4792820524,4792820527,4792820530,4792820533,4792820536,4792820539,4792820542,4792820545,4792820548,4792820551,4792820554,4792820557,4792820560,4792820563,4792820566,4792820569,4792820572,4792820575,4792820578,4792820581,4792820584,4792820587,4792820590,4792820593,4792820596,4792820599,4792820602,4792820605,4792820608,4792820611,4792820614,4792820617,4792820620,4792820623,4792820626,4792820629,4792820632,4792820635,4792820638,4792820761,4792820764,4792820767,4792820770,4792820773,4792820776,4792820779,4792820782,4792820785,4792820788,4792820791,4792820794,4792820797,4792820800,4792820803,4792820806,4792820809,4792820812,4792820815,4792820818,4792820821,4792820824,4792820827,4792820830,4792820833,4792820836,4792820839,4792820842,4792820845,4792820848,4792820851,4792820854,4792820857,4792820860,4792820863,4792820866,4792820869,4792820872,4792820875,4792820878,4792821001,4792821004,4792821007,4792821010,4792821013,4792821016,4792821019,4792821022,4792821025,4792821028,4792821031,4792821034,4792821037,4792821040,4792821043,4792821046,4792821049,4792821052,4792821055,4792821058,4792821244,4792821247,4792821250,4792821253,4792821256,4792821259,4792821262,4792821265,4792821268,4792821271,4792821274,4792821277,4792821280,4792821283,4792821286,4792821292,4792821295,4792821298,4792821301,4792821304,4792821307,4792821310,4792821313,4792821316,4792821319,4792821322,4792821325,4792821328,4792821331,4792821334,4792821337,4792821340,4792821343,4792821346,4792821349,4792821352,4792821355,4792821358,4792821484,4792821487,4792821493,4792821496,4792821499,4792821502,4792821505,4792821508,4792821511,4793111928,4793111931,4793111934,4793111937,4793111940,4793111943,4793111946,4793111949,4793111952,4793111955,4793111958,4793111961,4793111964,4793111967,4793111973,4793111976,4793111979,4793111982,4793111985,4793111988,4793111991,4793112123,4793112126,4793112129,4793135406,4793135409,4793135412,4793135415,4793135418,4793135421,4793135424,4793135427,4793135430,4793135433,4793135436,4793135439,4793135442,4793135445,4793136399,4793136402,4793136405,4793136408,4793136411,4793138529,4793138532,4793138535,4793138538,4793138541,4793138544,4793138547,4793138550,4793138553,4793138556,4793138559,4793138562,4793138565,4793138568,4793138571,4793138574,4793138577,4793138580,4793138583,4793138586,4793138589,4793138592,4793138595,4793138598,4793138601,4793138604,4793138607,4793138610,4793138613,4793138616,4793138619,4793138622,4793138625,4793138628,4793138631,4793138634,4793138637,4793138760,4793138763,4793138766,4793138769,4793139039,4793139042,4793139045,4793139048,4793139051,4793139057,4793139060,4793139063,4793139066,4793139069,4793139072,4793139075,4793139078,4793139081,4793139084,4793139087,4793139090,4793139093,4793139096,4793139099,4793139102,4793139105,4793139108,4793139111,4793139114,4793139117,4793139240,4793139243,4793139246,4793139249,4793139252,4793139255,4793139258,4793139261,4793139264,4793139267,4793139270,4793139273,4793139276,4793139279,4793139282,4793139285,4793139288,4793139291,4793139294,4793139297,4793139300,4793139303,4793139306,4793139309,4793139312,4793139315,4793139318,4793139321,4793139324,4793139327,4793139330,4793139333,4793139336,4793139339,4793139342,4793139345,4793139348,4793139351,4793139354,4793139357,4793139480,4793139483,4793139486,4793139489,4793139492,4793139495,4793139498,4793139501,4793139504,4793139507,4793139510,4793139513,4793139516,4793139519,4793139522,4793139525,4793139528,4793139531,4793139534,4793139537,4793139540,4793139543,4793139546,4793139549,4793139552,4793139555,4793139558,4793139561,4793139564,4793139567,4793139570,4793139573,4793139576,4793139579,4793139582,4793139585,4793139588,4793139591,4793139594,4793139597,4793139720,4793139723,4793139726,4793139729,4793139732,4793139735,4793139738,4793139741,4793139744,4793139747,4793139750,4793139753,4793139756,4793139759,4793139762,4793139765,4793139768,4793139771,4793139774,4793139777,4793139780,4793139783,4793139786,4793139789,4793139792,4793139795,4793139798,4793139801,4793139804,4793139807,4793139810,4793139813,4793139816,4793139819,4793139822,4793139825,4793139828,4793139831,4793139834,4793139837,4793139960,4793139963,4793139966,4793139969,4793139972,4793139975,4793139978,4793139981,4793139984,4793139987,4793139990,4793139993,4793139996,4793139999,4793140002,4793140005,4793140008,4793140011,4793140014,4793140017,4793140020,4793140023,4793140026,4793140029,4793140032,4793140035,4793140038,4793140041,4793140683,4793140686,4793140689,4793140692,4793140695,4793140698,4793140701,4793140704,4793140707,4793140710,4793140713,4793140716,4793140719,4793140722,4793140725,4793140728,4793140731,4793140734,4793140737,4793140740,4793141403,4793141406,4793141754,4793141757,4793141880,4793141883,4793141886,4793141889,4793141892,4793141895,4793141898,4793141901,4793141904,4793141907,4793141910,4793141913,4793141916,4793141922,4793141925,4793141928,4793141931,4793141934,4793141937,4793141940,4793141946,4793141949,4793141952,4793141955,4793141958,4793141961,4793141967,4793141970,4793141973,4793141976,4793141979,4793141982,4793141988,4793141991,4793141994,4793141997,4793142120,4793142123,4793142126,4793142129,4793142132,4793142135,4793142138,4793142141,4793142144,4793142147,4793142150,4793142153,4793142156,4793142159,4793142162,4793142165,4793142168,4793142171,4793142174,4793142177,4793142180,4793142183,4793142186,4793142189,4793142192,4793142195,4793142198,4793142201,4793142204,4793142207,4793142210,4793142213,4793142216,4793142219,4793142222,4793142225,4793142228,4793142231,4793142234,4793142237,4793142360,4793142873,4793142879,4793142882,4793142885,4793142888,4793142891,4793142894,4793142897,4793142900,4793142903,4793142906,4793142909,4793142912,4793142915,4793142918,4793142921,4793142924,4793142927,4793142930,4793142933,4793142936,4793142939,4793142942,4793142945,4793142948,4793142951,4793142954,4793142957,4793143080,4793143083,4793143086,4793143089,4793143092,4793143095,4793143098,4793143101,4793143104,4793143107,4793143110,4793143113,4793143116,4793143119,4793143122,4793143125,4793143128,4793143131,4793143134,4793143137,4793143140,4793143143,4793143146,4793143149,4793143152,4793143155,4793143158,4793143161,4793143164,4793143170,4793143173,4793143176,4793143179,4793143182,4793143185,4793143188,4793143191,4793143194,4793143197,4793143320,4793143323,4793143326,4793143329,4793143332,4793143335,4793143338,4793143341,4793143344,4793143347,4793143350,4793143356,4793143359,4793143362,4793143365,4793143368,4793143371,4793143374,4793143377,4793143380,4793143383,4793143386,4793143389,4793143392,4793143395,4793143398,4793143401,4793143404,4793143407,4793143410,4793143413,4793143416,4793143419,4793143422,4793143425,4793143431,4793143434,4793143437,4793145003,4793145006,4793145009,4793145012,4793145015,4793145018,4793145021,4793145024,4793145027,4793145030,4793145033,4793145036,4793145039,4793145042,4793145045,4793145048,4793145051,4793145054,4793145057,4793145060,4793145063,4793145066,4793145069,4793145072,4793145075,4793145078,4793145081,4793145084,4793145087,4793145090,4793145093,4793145096,4793145099,4793145102,4793145105,4793145108,4793145111,4793145117,4793145240,4793145243,4793145246,4793145249,4793145252,4793145255,4793145258,4793145261,4793145264,4793145267,4793145270,4793145273,4793145276,4793145279,4793145282,4793145285,4793145288,4793145291,4793145294,4793145297,4793145300,4793145303,4793145306,4793145309,4793145312,4793145315,4793145318,4793145321,4793145324,4793145327,4793145330,4793145333,4793145336,4793145339,4793145342,4793145345,4793145348,4793145351,4793145354,4793145357,4793145480,4793145483,4793145486,4793145489,4793145492,4793145543,4793145546,4793145549,4793145552,4793145555,4793145558,4793145561,4793145564,4793145567,4793145570,4793145573,4793145576,4793145579,4793145582,4793145585,4793145588,4793145591,4793145594,4793145597,4793145720,4793145723,4793145726,4793145729,4793145732,4793145735,4793145738,4793145741,4793145744,4793145747,4793145750,4793145753,4793145756,4793145759,4793145762,4793145765,4793145768,4793145771,4793145774,4793145777,4793145780,4793145783,4793145786,4793145789,4793145792,4793145795,4793145801,4793145804,4793145807,4793145810,4793145813,4793145816,4793145819,4793145822,4793145825,4793145828,4793145831,4793145834,4793145837,4793145960,4793145963,4793145966,4793145969,4793145972,4793145975,4793145978,4793145981,4793145984,4793145987,4793145990,4793145993,4793145996,4793145999,4793146002,4793146005,4793146008,4793146011,4793146014,4793146017,4793146020,4793146023,4793146026,4793146029,4793146032,4793146035,4793146038,4793146041,4793146044,4793146047,4793146050,4793146053,4793146056,4793146059,4793146062,4793146065,4793146068,4793146074,4793146077,4793146200,4793147163,4793147166,4793147169,4793147172,4793147175,4793147178,4793147181,4793147184,4793147187,4793147190,4793147193,4793147196,4793147199,4793147202,4793147205,4793147208,4793147211,4793147214,4793147217,4793147220,4793147223,4793147226,4793147229,4793147232,4793147235,4793147238,4793147241,4793147244,4793147247,4793147250,4793147253,4793147256,4793147259,4793147262,4793147265,4793147268,4793147271,4793147274,4793147277,4793147400,4793147427,4793147430,4793147433,4793147436,4793147439,4793147442,4793147445,4793147448,4793147451,4793147454,4793147457,4793147460,4793147463,4793147466,4793147469,4793147472,4793147475,4793147478,4793147481,4793147484,4793147487,4793147490,4793147493,4793147496,4793147499,4793147502,4793147505,4793147508,4793147511,4793147514,4793147517,4793147640,4793147643,4793147646,4793147649,4793147652,4793147655,4793147658,4793147661,4793147664,4793147667,4793147670,4793147673,4793147676,4793147679,4793147685,4793147688,4793147691,4793147694,4793147697,4793147700,4793147703,4793147706,4793147709,4793147712,4793147715,4793147718,4793147721,4793147724,4793147727,4793147730,4793147733,4793147736,4793147739,4793147742,4793147745,4793147748,4793147751,4793147754,4793147757,4793147880,4793147883,4793147886,4793147889,4793147892,4793147895,4793147901,4793147904,4793147907,4793147910,4793147913,4793147916,4793147919,4793147922,4793147925,4793147928,4793147931,4793147934,4793147937,4793147940,4793147943,4793147946,4793147949,4793147952,4793147955,4793147958,4793147961,4793147964,4793147967,4793147970,4793147973,4793147976,4793147982,4793147985,4793147988,4793147991,4793147994,4793147997,4793148120,4793148123,4793148126,4793148129,4793148132,4793148135,4793148138,4793148141,4793148144,4793148147,4793148150,4793148153,4793148156,4793148159,4793148162,4793148165,4793148168,4793148171,4793148174,4793148177,4793148180,4793148183,4793148186,4793148189,4793148192,4793148195,4793148198,4793148201,4793148204,4793148207,4793148210,4793148213,4793148216,4793148219,4793148222,4793148225,4793148228,4793148231,4793148234,4793148237,4793148360,4793148363,4793148366,4793148369,4793148372,4793148375,4793148378,4793148381,4793148384,4793148387,4793148390,4793148393,4793148396,4793148399,4793148402,4793148405,4793148408,4793148411,4793148414,4793148417,4793148420,4793148423,4793148927,4793148930,4793148933,4793148936,4793148939,4793148942,4793148945,4793148948,4793148951,4793148954,4793148957,4793149080,4793149083,4793149086,4793149089,4793149092,4793149095,4793149098,4793149101,4793149104,4793149107,4793149110,4793149113,4793149116,4793149119,4793149122,4793149125,4793149128,4793149131,4793149134,4793149137,4793149140,4793149143,4793149146,4793149149,4793149152,4793149155,4793149158,4793149161,4793149164,4793149167,4793149170,4793149173,4793149176,4793149179,4793149182,4793149185,4793149188,4793149191,4793149194,4793149197,4793149320,4793149323,4793149326,4793149329,4793149332,4793149335,4793149338,4793149341,4793149344,4793149347,4793149350,4793149353,4793149356,4793149359,4793149362,4793149365,4793149368,4793149371,4793149374,4793149377,4793149380,4793149383,4793149386,4793149389,4793149392,4793149395,4793149398,4793149401,4793149404,4793149407,4793149410,4793149413,4793149416,4793149419,4793149422,4793149425,4793149428,4793149431,4793149434,4793149437,4793149560,4793149563,4793149566,4793149569,4793149572,4793149575,4793149578,4793149581,4793149584,4793149587,4793149590,4793149593,4793149596,4793149599,4793149602,4793149605,4793149608,4793149611,4793149614,4793149617,4793149620,4793149623,4793149626,4793149629,4793149632,4793149635,4793149638,4793149641,4793149644,4793149647,4793149650,4793149653,4793149656,4793149659,4793149662,4793149665,4793149668,4793149671,4793149674,4793149677,4793149800,4793149803,4793149806,4793149809,4793149812,4793149815,4793149818,4793149821,4793149824,4793149827,4793149830,4793149833,4793149836,4793149839,4793149842,4793150154,4793150157,4793150280,4793150283,4793150286,4793150289,4793150292,4793150295,4793150298,4793150301,4793150304,4793150307,4793150310,4793150313,4793150316,4793150319,4793150322,4793150325,4793150328,4793150331,4793150334,4793150337,4793150340,4793150343,4793150346,4793150349,4793150352,4793150355,4793150358,4793150361,4793150364,4793150367,4793150370,4793150373,4793150376,4793150379,4793150382,4793150385,4793150388,4793150391,4793150394,4793150397,4793150520,4793150523,4793150526,4793150529,4793150532,4793150535,4793150538,4793150541,4793150547,4793150550,4793150553,4793150556,4793150559,4793150562,4793150565,4793150568,4793150571,4793150574,4793150577,4793150580,4793150583,4793150586,4793150589,4793150592,4793150595,4793150598,4793150601,4793150604,4793150607,4793150610,4793151003,4793151006,4793151009,4793151012,4793151015,4793151018,4793151021,4793151024,4793151027,4793151030,4793151033,4793151036,4793151039,4793151042,4793151045,4793151048,4793151051,4793151054,4793151057,4793151060,4793151063,4793151066,4793151069,4793151072,4793151075,4793151078,4793151081,4793151084,4793151087,4793151090,4793151093,4793151282,4793151285,4793151288,4793151294,4793151324,4793151327,4793151330,4793151333,4793151336,4793151339,4793151342,4793151345,4793151348,4793151351,4793151354,4793151357,4793151480,4793152077,4793152200,4793152203,4793152206,4793152209,4793152212,4793152215,4793152218,4793152221,4793152224,4793152227,4793152230,4793152233,4793152236,4793152239,4793152242,4793152245,4793152248,4793152251,4793152254,4793152257,4793152260,4793152263,4793152266,4793152269,4793152272,4793152275,4793152278,4793152281,4793152284,4793152287,4793152290,4793152293,4793152296,4793152299,4793152302,4793152305,4793152308,4793152311,4793152314,4793152317,4793152440,4793152443,4793152446,4793152449,4793152452,4793152455,4793152458,4793152461,4793152464,4793152467,4793152470,4793152473,4793152476,4793152479,4793152482,4793152485,4793152488,4793152491,4793152494,4793152497,4793152500,4793152503,4793152506,4793152509,4793152512,4793152518,4793152521,4793152524,4793152527,4793152530,4793152533,4793152536,4793152539,4793152542,4793152545,4793152548,4793152551,4793152554,4793153673,4793153676,4793153679,4793153682,4793153685,4793153691,4793153694,4793153697,4793153700,4793153703,4793153706,4793153709,4793153712,4793153715,4793153718,4793153721,4793153724,4793153727,4793153730,4793153733,4793153736,4793153739,4793153742,4793153745,4793153748,4793153751,4793153754,4793153757,4793153880,4793153883,4793153886,4793153889,4793153892,4793153895,4793153898,4793153901,4793153904,4793153907,4793153910,4793153913,4793153916,4793153919,4793153922,4793153925,4793153928,4793153931,4793153934,4793153937,4793153940,4793153943,4793153946,4793153949,4793153952,4793153955,4793153958,4793153961,4793153964,4793153967,4793153970,4793153973,4793153976,4793153979,4793153982,4793153985,4793153988,4793153991,4793153994,4793153997,4793154120,4793154123,4793154126,4793154129,4793154132,4793154135,4793154138,4793154141,4793154144,4793154147,4793154150,4793154153,4793154156,4793154159,4793154162,4793154165,4793154168,4793154171,4793154174,4793154177,4793154180,4793154183,4793154186,4793154189,4793154192,4793154195,4793154198,4793154201,4793154204,4793154207,4793154210,4793155413,4793155416,4793155419,4793155422,4793155425,4793155428,4793155431,4793155434,4793155437,4793155560,4793155563,4793155566,4793155569,4793155572,4793155575,4793155578,4793155581,4793155584,4793155587,4793155590,4793155593,4793155596,4793155599,4793155602,4793156343,4793156346,4793156349,4793156352,4793156355,4793156358,4793156361,4793156364,4793156367,4793156370,4793156373,4793156376,4793156379,4793156382,4793156385,4793156388,4793156391,4793156394,4793156397,4793156520,4793156523,4793156526,4793156529,4793156532,4793156535,4793156538,4793156541,4793156544,4793156547,4793156550,4793156553,4793157003,4793157006,4793157009,4793157012,4793157015,4793157018,4793157021,4793157024,4793157027,4793157030,4793157033,4793157036,4793157039,4793157042,4793157045,4793157048,4793157051,4793157054,4793157057,4793157060,4793157063,4793157066,4793157069,4793157072,4793157075,4793157078,4793157081,4793157084,4793157087,4793157090,4793157093,4793157096,4793157099,4793157102,4793157105,4793157108,4793157111,4793157114,4793157117,4793157240,4793157243,4793157246,4793157249,4793157252,4793157255,4793157258,4793157261,4793157264,4793157267,4793157270,4793157273,4793157276,4793157279,4793157282,4793157285,4793157288,4793157291,4793157294,4793157297,4793157300,4793157303,4793157306,4793157309,4793157312,4793157315,4793157318,4793157321,4793157324,4793157327,4793157330,4793157333,4793157336,4793157339,4793157342,4793157345,4793157348,4793157351,4793157354,4793157357,4793157480,4793157483,4793157486,4793157489,4793157492,4793157495,4793157498,4793157501,4793157504,4793157507,4793157510,4793157513,4793157516,4793157519,4793157522,4793157525,4793157528,4793157531,4793157534,4793157537,4793157540,4793157723,4793157726,4793157729,4793157732,4793157735,4793157738,4793157741,4793157747,4793157750,4793157753,4793157756,4793157759,4793157762,4793157768,4793157771,4793157774,4793157777,4793157780,4793157783,4793157786,4793157789,4793157792,4793157795,4793157798,4793157801,4793157804,4793157807,4793157810,4793157813,4793157816,4793157819,4793157822,4793157825,4793157831,4793157834,4793157837,4793157960,4793157963,4793157966,4793157969,4793157972,4793157975,4793157978,4793157981,4793157984,4793157987,4793157990,4793157993,4793157996,4793157999,4793158002,4793158005,4793158008,4793158011,4793158014,4793158017,4793158020,4793158023,4793158026,4793158029,4793158032,4793158035,4793158038,4793158041,4793158044,4793158047,4793158050,4793158053,4793158056,4793158059,4793158062,4793158065,4793158068,4793158071,4793158074,4793158077,4793158200,4793158203,4793158206,4793158209,4793158212,4793158215,4793158218,4793158221,4793158224,4793158227,4793158230,4793158233,4793158236,4793158239,4793158242,4793158245,4793158248,4793158251,4793158254,4793158257,4793158260,4793158263,4793158266,4793158269,4793158272,4793158275,4793158278,4793158281,4793158284,4793158287,4793158290,4793158293,4793158296,4793158299,4793158302,4793158305,4793158308,4793158311,4793158314,4793158317,4793158440,4793158443,4793158446,4793158449,4793158452,4793158455,4793158458,4793158461,4793158464,4793158467,4793158470,4793158473,4793158476,4793158479,4793158482,4793158485,4793158488,4793158491,4793158494,4793158497,4793158500,4793158503,4793158506,4793158509,4793158512,4793158515,4793158518,4793158521,4793158524,4793158527,4793158530,4793158533,4793158536,4793158539,4793158542,4793158545,4793158548,4793158551,4793158554,4793158557,4793158680,4793158683,4793158686,4793158689,4793158692,4793158695,4793158698,4793160894,4793160897,4793160900,4793160903,4793160906,4793160909,4793160912,4793160915,4793160918,4793160921,4793160924,4793160927,4793160930,4793160933,4793160936,4793160939,4793160942,4793160945,4793160948,4793160954,4793160957,4793161080,4793161083,4793161086,4793161089,4793161092,4793161095,4793161098,4793161101,4793161104,4793161107,4793161110,4793161113,4793161116,4793161119,4793161122,4793161125,4793161128,4793161131,4793161134,4793161137,4793161140,4793161143,4793161146,4793161149,4793161152,4793161155,4793161158,4793161161,4793161164,4793161167,4793161170,4793161173,4793161176,4793161179,4793161182,4793161185,4793161188,4793161191,4793161194,4793161197,4793161320,4793161323,4793161326,4793161329,4793161332,4793161335,4793161338,4793161341,4793161344,4793161347,4793161350,4793161353,4793161356,4793161359,4793161362,4793161365,4793161368,4793161371,4793161374,4793161377,4793161380,4793161383,4793161386,4793161389,4793161392,4793161395,4793161398,4793161401,4793161404,4793161407,4793161410,4793161413,4793161416,4793161419,4793161422,4793161425,4793161428,4793161431,4793161434,4793161437,4793161560,4793161563,4793161566,4793161569,4793161572,4793161575,4793161578,4793161581,4793161584,4793161587,4793161590,4793161593,4793161596,4793161599,4793161602,4793161605,4793161608,4793161611,4793161614,4793161617,4793161620,4793161623,4793161626,4793161629,4793161632,4793161635,4793161638,4793161641,4793161644,4793161647,4793161650,4793161653,4793161656,4793161659,4793161662,4793161665,4793161803,4793161806,4793161809,4793161812,4793161815,4793162358,4793162361,4793162364,4793162367,4793162370,4793162373,4793162376,4793162379,4793162382,4793162385,4793162388,4793162391,4793162394,4793162397,4793162520,4793162523,4793162526,4793162529,4793162532,4793162535,4793162538,4793162541,4793162544,4793162547,4793162550,4793162553,4793162556,4793162559,4793162562,4793162565,4793162568,4793162571,4793162574,4793162577,4793162580,4793162583,4793162586,4793162589,4793162592,4793162595,4793162598,4793162604,4793162607,4793162610,4793162613,4793162616,4793162619,4793162622,4793162625,4793162631,4793162634,4793162637,4793162763,4793162766,4793162769,4793162772,4793162775,4793162778,4793162781,4793162784,4793162787,4793162790,4793162793,4793162796,4793162799,4793162802,4793162805,4793162808,4793162811,4793162814,4793162817,4793162820,4793162823,4793162826,4793162829,4793162832,4793162835,4793162838,4793162841,4793162844,4793162847,4793162850,4793162853,4793162856,4793162859,4793162862,4793162865,4793162868,4793162871,4793162874,4793163252,4793163255,4793163258,4793163261,4793163264,4793163267,4793163270,4793163273,4793163276,4793163279,4793163282,4793163285,4793163288,4793163291,4793163294,4793163297,4793163300,4793163303,4793163306,4793163309,4793163312,4793163315,4793163318,4793163321,4793163324,4793163327,4793163330,4793163333,4793163336,4793163339,4793163342,4793163345,4793163348,4793163351,4793163354,4793163357,4793163480,4793163483,4793163486,4793163489,4793163492,4793163495,4793163498,4793163501,4793163504,4793163507,4793163510,4793163513,4793163516,4793163519,4793163522,4793163525,4793163528,4793163531,4793163534,4793163537,4793163540,4793163813,4793163816,4793163819,4793163822,4793163825,4793163828,4793163831,4793163834,4793163837,4793163960,4793163963,4793163966,4793163969,4793163972,4793163975,4793163978,4793163981,4793163984,4793163987,4793163990,4793163993,4793163996,4793163999,4793164002,4793164005,4793164008,4793164011,4793164014,4793164017,4793164020,4793164023,4793164026,4793164029,4793164032,4793164035,4793164038,4793164041,4793164044,4793164047,4793164050,4793164053,4793165892,4793165895,4793165898,4793165901,4793165904,4793165907,4793165910,4793165913,4793165916,4793165919,4793165922,4793165925,4793165928,4793165931,4793165934,4793165937,4793165940,4793165943,4793165946,4793165952,4793165955,4793165958,4793165961,4793165964,4793165967,4793165970,4793165973,4793165976,4793165979,4793165982,4793165985,4793165988,4793165991,4793165994,4793165997,4793166120,4793166123,4793166126,4793166129,4793166132,4793166135,4793166138,4793166141,4793166144,4793166147,4793166150,4793166153,4793166156,4793166603,4793166606,4793166609,4793166612,4793166615,4793166618,4793166621,4793166624,4793167815,4793167818,4793167821,4793167824,4793167827,4793167830,4793167833,4793167836,4793167839,4793167842,4793167845,4793167848,4793167851,4793167854,4793167857,4793167860,4793167863,4793167866,4793167869,4793167872,4793167875,4793167878,4793167881,4793167884,4793167887,4793167890,4793167893,4793167896,4793167899,4793167902,4793167905,4793167908,4793167911,4793167914,4793167917,4793168040,4793168043,4793168046,4793168049,4793168052,4793168055,4793168058,4793168061,4793168064,4793168067,4793168070,4793168073,4793168076,4793168079,4793168082,4793168085,4793168088,4793168091,4793168094,4793168097,4793168100,4793168106,4793168109,4793168112,4793168115,4793168118,4793168121,4793168124,4793168127,4793168130,4793168133,4793168136,4793168139,4793168142,4793168145,4793168148,4793168151,4793168154,4793168157,4793168280,4793168283,4793168286,4793168289,4793168292,4793168295,4793168298,4793168301,4793168304,4793168307,4793168310,4793168313,4793168316,4793168319,4793168322,4793168325,4793168328,4793168331,4793168334,4793168337,4793168340,4793168343,4793168346,4793168349,4793168352,4793168355,4793168358,4793168361,4793168364,4793168367,4793168370,4793168373,4793168376,4793168379,4793168382,4793168385,4793168388,4793168391,4793168394,4793168397,4793168520,4793168523,4793168526,4793168529,4793168535,4793169498,4793169501,4793169504,4793169507,4793169510,4793169513,4793169519,4793169522,4793169525,4793169528,4793169531,4793169534,4793169537,4793169540,4793551895,4793551898,4793551901,4793551904,4793551907,4793551910,4793551919,4793552042,4793552045,4793552048,4793552051,4793552054,4793552057,4793552060,4793552063,4793552066,4793552069,4793552072,4793552075,4793552078,4793552081,4793552087,4793552090,4793552093,4793552096,4793552102,4793552105,4793552108,4793552111,4793552114,4793552126,4793552129,4793552132,4793562140,4793562143,4793562146,4793562149,4793562152,4793562464,4793562467,4793562470,4793562473,4793562476,4793562479,4793562602,4793562605,4793562608,4793562611,4793562614,4793562617,4793562620,4793562623,4793562626,4793562629,4793562632,4793562635,4793562638,4793562641,4793562644,4793562647,4793562650,4793562653,4793562656,4793562659,4793562662,4793562665,4793562668,4793562671,4793562674,4793562677,4793562680,4793562683,4793562686,4793562692,4793562695,4793562698,4793562701,4793562704,4793562707,4793562710,4793562713,4793562716,4793562719,4793562842,4793562845,4793562848,4793562851,4793562854,4793562857,4793562860,4793562863,4793562866,4793562869,4793562872,4793562875,4793562878,4793562881,4793564063,4793564066,4793564069,4793564072,4793564075,4793564078,4793564081,4793564084,4793564087,4793564090,4793564093,4793564096,4793564099,4793564102,4793564105,4793564108,4793564111,4793564114,4793564117,4793564120,4793564123,4793564126,4793564129,4793564132,4793564135,4793564138,4793564141,4793564144,4793564147,4793564150,4793564153,4793564156,4793564159,4793564282,4793564285,4793564288,4793564291,4793564294,4793564297,4793564300,4793564303,4793564306,4793564309,4793564312,4793564315,4793564318,4793564321,4793564324,4793564327,4793564330,4793564333,4793564336,4793564339,4793564342,4793564345,4793564348,4793564351,4793564354,4793564357,4793564360,4793564363,4793564366,4793564369,4793564372,4793564375,4793564378,4793564381,4793564384,4793564387,4793564390,4793564393,4793564396,4793564399,4793564522,4793564525,4793564528,4793564531,4793564534,4793564537,4793564540,4793564543,4793564546,4793564549,4793564552,4793564555,4793564558,4793564561,4793564564,4793564567,4793564570,4793564573,4793564576,4793564579,4793564582,4793564585,4793564588,4793564591,4793564597,4793564600,4793564603,4793564606,4793564609,4793564612,4793564615,4793564618,4793564624,4793564627,4793564630,4793564633,4793564636,4793564762,4793564765,4793564768,4793564771,4793564774,4793564777,4793564780,4793564783,4793564786,4793564789,4793564792,4793564795,4793564798,4793564801,4793564804,4793564807,4793564810,4793564813,4793564816,4793564819,4793564822,4793564825,4793564828,4793564831,4793564837,4793564840,4793564843,4793564846,4793564849,4793564852,4793564855,4793564858,4793564861,4793564864,4793564867,4793564870,4793564873,4793564876,4793564879,4793565002,4793565005,4793565008,4793565011,4793565014,4793565017,4793565020,4793565023,4793565026,4793565029,4793565032,4793565035,4793565038,4793565041,4793565044,4793565047,4793565050,4793565053,4793565056,4793565059,4793565062,4793565065,4793565068,4793565071,4793565074,4793565077,4793565080,4793565086,4793565089,4793565092,4793565095,4793565101,4793565104,4793565107,4793565110,4793565113,4793565116,4793565119,4793565242,4793565245,4793565248,4793565251,4793565254,4793565257,4793565260,4793565263,4793565266,4793565269,4793565272,4793565275,4793565278,4793565281,4793565284,4793565287,4793565290,4793565293,4793565296,4793565299,4793565302,4793565305,4793565308,4793565311,4793565314,4793565317,4793565320,4793565323,4793565326,4793565329,4793565332,4793565335,4793565338,4793565341,4793565344,4793565347,4793565350,4793565353,4793565356,4793565359,4793565482,4793565485,4793565488,4793565491,4793565494,4793565497,4793565500,4793565503,4793565506,4793565509,4793565512,4793565515,4793565518,4793565521,4793565524,4793565527,4793566280,4793566283,4793566286,4793566289,4793566292,4793566295,4793566298,4793566301,4793566304,4793566307,4793566310,4793566313,4793566316,4793566319,4793566442,4793566445,4793566448,4793566451,4793566454,4793566457,4793566460,4793566463,4793566466,4793566469,4793566472,4793566475,4793566478,4793566481,4793566484,4793566490,4793566493,4793566496,4793566499,4793566502,4793566505,4793566508,4793566511,4793566514,4793566517,4793566520,4793566526,4793566529,4793566532,4793566535,4793566538,4793566541,4793566544,4793566547,4793566550,4793566553,4793566556,4793566559,4793566682,4793566685,4793566688,4793566691,4793566694,4793566697,4793566700,4793566703,4793566706,4793566709,4793566712,4793566715,4793566718,4793566721,4793566724,4793566727,4793566730,4793566733,4793566736,4793566739,4793566742,4793566745,4793566748,4793566751,4793566754,4793566757,4793566760,4793566763,4793566766,4793566769,4793566772,4793566775,4793566778,4793566781,4793566784,4793566787,4793566790,4793566793,4793566796,4793566799,4793566922,4793566925,4793566928,4793566931,4793566934,4793566937,4793567186,4793567189,4793567192,4793567195,4793567198,4793567201,4793567204,4793567207,4793567210,4793567213,4793567216,4793567219,4793567222,4793567225,4793567228,4793567231,4793567234,4793567237,4793567240,4793567243,4793567246,4793567249,4793567252,4793567255,4793567258,4793567261,4793567264,4793567270,4793567273,4793567276,4793567279,4793567402,4793567405,4793567408,4793567411,4793567414,4793567417,4793567420,4793567423,4793567426,4793567429,4793567432,4793567435,4793567438,4793567441,4793567444,4793567447,4793567450,4793567453,4793567456,4793567459,4793567462,4793567465,4793567468,4793567471,4793567474,4793567477,4793568140,4793568143,4793568146,4793568149,4793568152,4793568155,4793568158,4793568161,4793568164,4793568167,4793568170,4793568173,4793568176,4793568179,4793568182,4793568185,4793568188,4793568191,4793568194,4793568197,4793568200,4793568203,4793568206,4793568209,4793568212,4793568215,4793568218,4793568221,4793568224,4793568227,4793568230,4793568233,4793568236,4793568239,4793568362,4793568365,4793568368,4793568371,4793568374,4793568377,4793568380,4793568383,4793568386,4793568389,4793568392,4793568395,4793568398,4793568401,4793568404,4793568407,4793568410,4793568413,4793568416,4793568419,4793568422,4793568425,4793568428,4793568431,4793568434,4793568437,4793568440,4793568443,4793568446,4793568449,4793568452,4793568455,4793568458,4793568461,4793568464,4793568467,4793568470,4793568473,4793568476,4793568479,4793568605,4793568608,4793568611,4793568614,4793568617,4793568620,4793568623,4793568626,4793568629,4793568632,4793568635,4793568638,4793568641,4793568644,4793568647,4793568650,4793568653,4793568656,4793568659,4793568662,4793568665,4793568668,4793568671,4793568674,4793568677,4793568680,4793568683,4793568686,4793568689,4793568692,4793568695,4793568698,4793568701,4793568704,4793568707,4793568710,4793568713,4793568716,4793568719,4793568842,4793568848,4793568851,4793568854,4793568860,4793568863,4793568866,4793568869,4793568872,4793569670,4793569673,4793569676,4793569679,4793569802,4793569805,4793569808,4793569811,4793569814,4793569817,4793569820,4793569823,4793569826,4793569829,4793569832,4793569835,4793569838,4793569841,4793569844,4793569847,4793569850,4793569853,4793569856,4793569859,4793569862,4793569865,4793569868,4793569871,4793569874,4793569877,4793569880,4793569883,4793569886,4793569889,4793569892,4793569895,4793569898,4793569901,4793569904,4793569907,4793569910,4793569913,4793569916,4793569919,4793570042,4793570045,4793570048,4793570051,4793570054,4793570057,4793570060,4793570063,4793570066,4793570069,4793570072,4793570075,4793570078,4793570081,4793570084,4793570087,4793570090,4793570093,4793570096,4793570099,4793570102,4793570105,4793570108,4793570114,4793570117,4793570120,4793570123,4793570126,4793570129,4793570132,4793570135,4793570138,4793570141,4793570144,4793570147,4793570150,4793570153,4793570156,4793570159,4793570282,4793570285,4793570288,4793570291,4793570294,4793570297,4793570300,4793570303,4793570306,4793570309,4793570312,4793570315,4793570318,4793570321,4793570324,4793570327,4793570330,4793570333,4793570336,4793570339,4793570342,4793570345,4793570348,4793570351,4793570354,4793570357,4793570360,4793570363,4793570366,4793570369,4793570372,4793570375,4793570378,4793570381,4793570384,4793570387,4793570390,4793570393,4793570396,4793570399,4793570522,4793572046,4793572049,4793572052,4793572055,4793572058,4793572061,4793572064,4793572067,4793572070,4793572073,4793572076,4793572079,4793572202,4793572205,4793572208,4793572211,4793572214,4793572217,4793572220,4793572223,4793572226,4793572229,4793572232,4793572235,4793572238,4793572241,4793572244,4793572247,4793572250,4793572253,4793572256,4793572259,4793572262,4793572265,4793572268,4793572271,4793572274,4793572277,4793572712,4793572715,4793572718,4793572721,4793572724,4793572727,4793572730,4793572733,4793572736,4793572739,4793572742,4793572745,4793572748,4793572751,4793572754,4793572757,4793572760,4793572763,4793572769,4793572772,4793572775,4793572778,4793572781,4793572784,4793572787,4793572790,4793572793,4793572796,4793572799,4793572922,4793572925,4793572928,4793572931,4793572934,4793572937,4793572940,4793572943,4793572946,4793572949,4793572952,4793572955,4793572958,4793572961,4793572964,4793572967,4793572970,4793572973,4793572976,4793572979,4793572982,4793572985,4793572988,4793572991,4793572994,4793572997,4793573000,4793573003,4793573006,4793573009,4793573012,4793573015,4793573018,4793573021,4793573024,4793573027,4793573030,4793573033,4793573036,4793573039,4793573162,4793573165,4793573168,4793573171,4793573174,4793573177,4793573180,4793573183,4793573186,4793573189,4793573192,4793573195,4793573198,4793573201,4793573204,4793573207,4793573210,4793573213,4793573216,4793573219,4793573222,4793573225,4793573228,4793573231,4793573234,4793573237,4793573240,4793573243,4793573246,4793573249,4793573252,4793573255,4793573258,4793573261,4793573264,4793573267,4793573270,4793573273,4793573276,4793573279,4793573402,4793573405,4793573408,4793573411,4793573414,4793573417,4793573420,4793573423,4793573426,4793573429,4793573432,4793573435,4793573438,4793573441,4793573444,4793573447,4793573450,4793573453,4793573456,4793573459,4793573462,4793573465,4793573468,4793573471,4793573474,4793573477,4793573480,4793573483,4793573486,4793573489,4793573492,4793573495,4793573498,4793573501,4793573504,4793573507,4793573510,4793573513,4793573516,4793573519,4793573642,4793573645,4793573648,4793573651,4793573654,4793573657,4793573660,4793573663,4793573666,4793573669,4793573672,4793573675,4793573678,4793573681,4793573684,4793573687,4793573690,4793573693,4793573696,4793573699,4793573702,4793573705,4793573708,4793573711,4793573714,4793573717,4793573720,4793573723,4793573726,4793573729,4793573732,4793573735,4793573738,4793573741,4793573744,4793573747,4793573750,4793573753,4793573756,4793573759,4793573882,4793573885,4793573888,4793573891,4793573894,4793573897,4793573900,4793573903,4793574140,4793574143,4793574146,4793574149,4793574152,4793574155,4793574158,4793574161,4793574164,4793574167,4793574170,4793574173,4793574176,4793574179,4793574182,4793574185,4793574188,4793574191,4793574194,4793574197,4793574200,4793574203,4793574206,4793574209,4793574212,4793574215,4793574218,4793574221,4793574224,4793574227,4793574230,4793574233,4793574236,4793574239,4793574362,4793574365,4793574368,4793574374,4793574377,4793574380,4793574383,4793574386,4793574389,4793574392,4793574395,4793574398,4793574401,4793574404,4793574407,4793574410,4793574413,4793574416,4793574419,4793574422,4793574425,4793574428,4793574431,4793574434,4793574437,4793574440,4793574443,4793574446,4793574449,4793574452,4793574455,4793574458,4793574461,4793574464,4793574467,4793574470,4793574473,4793574476,4793574479,4793574602,4793574605,4793574608,4793574611,4793574614,4793574617,4793574620,4793574623,4793574626,4793574629,4793574680,4793574683,4793574686,4793574689,4793574692,4793574695,4793574698,4793574701,4793574704,4793574707,4793574710,4793574713,4793574716,4793574719,4793574842,4793574845,4793574848,4793574851,4793574857,4793574860,4793574863,4793574866,4793574869,4793576048,4793576051,4793576054,4793576057,4793576060,4793576063,4793576066,4793576069,4793576072,4793576075,4793576078,4793576081,4793576084,4793576087,4793576090,4793576096,4793576099,4793576102,4793576105,4793576108,4793576111,4793576114,4793576117,4793576120,4793576123,4793576126,4793576129,4793576132,4793576135,4793576138,4793576141,4793576144,4793576147,4793576390,4793576393,4793576396,4793576399,4793576522,4793576525,4793576528,4793576531,4793576534,4793576537,4793576540,4793576543,4793576546,4793576549,4793576552,4793576555,4793576558,4793576561,4793576564,4793576567,4793576570,4793576573,4793576576,4793576579,4793576582,4793576585,4793576588,4793576591,4793577332,4793577335,4793577338,4793577341,4793577344,4793577347,4793577350,4793577353,4793577356,4793577359,4793577482,4793577485,4793577488,4793577491,4793577494,4793577497,4793577500,4793577503,4793577506,4793577509,4793577512,4793577515,4793577518,4793577521,4793577524,4793577527,4793577530,4793577533,4793577536,4793577539,4793577542,4793577545,4793577548,4793577551,4793577554,4793577557,4793577560,4793577563,4793577566,4793577569,4793577572,4793577575,4793577578,4793577581,4793577584,4793577587,4793577590,4793577593,4793577596,4793577599,4793577722,4793577725,4793577728,4793577731,4793577734,4793577737,4793577740,4793577743,4793577746,4793577749,4793577752,4793577755,4793577758,4793577761,4793577764,4793577767,4793577770,4793577773,4793577776,4793577779,4793577782,4793577785,4793577788,4793577791,4793577794,4793577797,4793577800,4793577803,4793577806,4793577809,4793577812,4793577815,4793577818,4793577821,4793577824,4793577827,4793577830,4793577833,4793577836,4793577839,4793577962,4793577965,4793577968,4793577971,4793577974,4793577977,4793577980,4793577983,4793577986,4793577989,4793577992,4793577995,4793577998,4793578001,4793578004,4793578007,4793578010,4793578013,4793578016,4793578019,4793578022,4793578025,4793578028,4793578031,4793578034,4793578040,4793578043,4793578046,4793578049,4793578052,4793578055,4793578058,4793578061,4793578727,4793578730,4793578733,4793578736,4793578739,4793578742,4793578745,4793578748,4793578751,4793578754,4793578757,4793578760,4793578763,4793578766,4793578769,4793578772,4793578775,4793578778,4793578781,4793578784,4793578787,4793578790,4793578793,4793578796,4793578799,4793578922,4793578925,4793578928,4793578931,4793578934,4793578937,4793578940,4793578943,4793578946,4793578949,4793578952,4793578955,4793578958,4793578961,4793578964,4793578967,4793578970,4793578973,4793578976,4793578979,4793578982,4793578985,4793578988,4793578991,4793578994,4793578997,4793579000,4793579003,4793579006,4793579009,4793579012,4793579015,4793579018,4793579021,4793579024,4793579027,4793579030,4793579033,4793579036,4793579039,4793579162,4793579165,4793579168,4793579171,4793579174,4793579177,4793579180,4793579183,4793579186,4793579189,4793579192,4793579195,4793579198,4793579201,4793579204,4793579207,4793579747,4793580410,4793580413,4793580416,4793580419,4793580422,4793580425,4793580428,4793580431,4793580434,4793580437,4793580440,4793580443,4793580446,4793580449,4793580452,4793580455,4793580458,4793580461,4793580464,4793580467,4793580470,4793580473,4793580476,4793580479,4793580602,4793580605,4793580608,4793580611,4793580614,4793580617,4793580620,4793580623,4793580626,4793580629,4793580632,4793580635,4793580638,4793580641,4793580644,4793580647,4793580650,4793580653,4793580656,4793580659,4793580662,4793580665,4793580668,4793580671,4793580674,4793580677,4793580680,4793580683,4793580686,4793580689,4793580692,4793580695,4793580698,4793580701,4793580704,4793580707,4793580710,4793580713,4793580716,4793580719,4793580842,4793580845,4793580848,4793580851,4793581664,4793581667,4793581670,4793581673,4793581676,4793581679,4793581802,4793581805,4793581808,4793581811,4793581814,4793581817,4793581820,4793581823,4793581826,4793581829,4793581832,4793581835,4793581838,4793581841,4793581844,4793581847,4793581850,4793581853,4793581856,4793581859,4793581862,4793581865,4793581868,4793581871,4793581874,4793581877,4793582843,4793582846,4793582849,4793582852,4793582855,4793582858,4793582861,4793582864,4793582867,4793582870,4793582873,4793582876,4793582879,4793583002,4793583005,4793583008,4793583011,4793583014,4793583017,4793583020,4793583023,4793583026,4793583029,4793583032,4793583035,4793583038,4793583041,4793583044,4793583047,4793583050,4793583053,4793583056,4793583059,4793583062,4793583065,4793583068,4793583071,4793583074,4793583077,4793583080,4793583083,4793583086,4793583089,4793583092,4793583095,4793583098,4793583101,4793583104,4793583107,4793583110,4793583113,4793583116,4793583119,4793583242,4793583245,4793583248,4793583251,4793583254,4793583257,4793583260,4793583263,4793583266,4793583269,4793583272,4793583275,4793583278,4793583281,4793583284,4793583287,4793583290,4793583293,4793583296,4793583299,4793583302,4793583305,4793583308,4793583311,4793583314,4793583317,4793583320,4793583323,4793583326,4793583329,4793583332,4793583335,4793583338,4793583341,4793583344,4793583347,4793584799,4793584922,4793584925,4793584928,4793584931,4793584934,4793584937,4793585024,4793585027,4793585030,4793585033,4793585036,4793585039,4793585162,4793585165,4793585168,4793585171,4793585174,4793585177,4793585180,4793585183,4793585186,4793585189,4793585192,4793585195,4793585198,4793585201,4793585207,4793585210,4793585213,4793585216,4793585219,4793585222,4793585225,4793585228,4793585231,4793585234,4793585237,4793585240,4793585243,4793585246,4793585249,4793585252,4793585255,4793585258,4793585261,4793585264,4793585267,4793585270,4793585273,4793585276,4793585279,4793585402,4793585405,4793585408,4793585411,4793585414,4793585417,4793585420,4793585423,4793585426,4793585429,4793585432,4793585435,4793585438,4793585441,4793585444,4793585447,4793585450,4793585453,4793585456,4793585459,4793585462,4793585465,4793585468,4793585471,4793585474,4793585477,4793585480,4793585483,4793585486,4793585489,4793585492,4793585495,4793585498,4793585501,4793585504,4793585507,4793585510,4793585513,4793585516,4793585519,4793585642,4793585645,4793585648,4793585651,4793585654,4793585657,4793585660,4793585663,4793585666,4793585669,4793585672,4793585675,4793585678,4793585681,4793585684,4793585687,4793585690,4793585693,4793585696,4793585699,4793585702,4793585705,4793585708,4793585711,4793585714,4793585717,4793585720,4793585723,4793585726,4793585729,4793585732,4793585735,4793585738,4793585741,4793585744,4793585747,4793585750,4793585753,4793585756,4793585759,4793585882,4793585885,4793585888,4793585891,4793585894,4793585897,4793585900,4793585903,4793585906,4793585909,4793585912,4793585915,4793585918,4793585921,4793585924,4793585927,4793585930,4793585933,4793585936,4793585939,4793585942,4793585945,4793585948,4793585951,4793585954,4793585957,4793585960,4793585969,4793585972,4793585975,4793585978,4793585981,4793585984,4793585987,4793585990,4793585993,4793585996,4793585999,4793586122,4793586125,4793586128,4793586131,4793586134,4793586137,4793587880,4793587883,4793587886,4793587889,4793587892,4793587895,4793587898,4793587901,4793587904,4793587907,4793587910,4793587913,4793587916,4793587919,4793588042,4793588045,4793588048,4793588051,4793588054,4793588057,4793588060,4793588063,4793588066,4793588069,4793588072,4793588075,4793588078,4793588081,4793588084,4793588087,4793588090,4793588093,4793588096,4793588099,4793588102,4793588105,4793588108,4793588111,4793588114,4793588117,4793588120,4793588123,4793588126,4793588129,4793588132,4793588135,4793588138,4793588141,4793588144,4793588147,4793588150,4793588153,4793588156,4793588159,4793588282,4793588285,4793588288,4793588291,4793588294,4793588297,4793588300,4793588303,4793588306,4793588309,4793588312,4793588315,4793588318,4793588321,4793588324,4793588327,4793588330,4793588333,4793588336,4793588339,4793588342,4793588345,4793588348,4793588351,4793588354,4793588357,4793588360,4793588363,4793588369,4793588372,4793588375,4793588378,4793588381,4793588384,4793588387,4793588390,4793588393,4793588396,4793588399,4793588522,4793588525,4793588528,4793588531,4793588534,4793588537,4793588852,4793588855,4793588858,4793588861,4793588864,4793588867,4793588870,4793588873,4793588876,4793588879,4793589002,4793589005,4793589011,4793589014,4793589017,4793589020,4793589023,4793589026,4793589029,4793589032,4793589035,4793589038,4793589041,4793589044,4793589047,4793589050,4793589053,4793589056,4793589059,4793589062,4793589065,4793589068,4793589071,4793589074,4793589077,4793589080,4793589083,4793589086,4793589089,4793589092,4793589095,4793589098,4793589101,4793589104,4793589107,4793589110,4793589113,4793589116,4793589119,4793589242,4793589245,4793589248,4793589251,4793589254,4793589257,4793589260,4793589263,4793589266,4793589269,4793589272,4793589275,4793589278,4793589281,4793589284,4793589287,4793589290,4793589293,4793589296,4793589299,4793589302,4793589305,4793589308,4793589311,4793589314,4793589317,4793589320,4793589323,4793589326,4793589329,4793589332,4793589335,4793589338,4793589341,4793589344,4793589347,4793589350,4793589353,4793589356,4793589359,4793589482,4793589485,4793589488,4793589491,4793589494,4793589497,4793589500,4793589503,4793589506,4793589509,4793589512,4793589515,4793589518,4793589521,4793589524,4793589527,4793589530,4793589533,4793589536,4793589539,4793589542,4793589545,4793589551,4793589554,4793589557,4793589560,4793589563,4793589566,4793589569,4793589572,4793589575,4793589578,4793589581,4793589584,4793589587,4793589590,4793589593,4793589599,4793589722,4793589725,4793589728,4793589731,4793589734,4793589737,4793590274,4793590940,4793590943,4793590946,4793590949,4793590952,4793590955,4793590958,4793590961,4793590964,4793590967,4793590970,4793590973,4793590976,4793590979,4793590982,4793590985,4793590988,4793590991,4793590994,4793590997,4793591000,4793591003,4793591006,4793591009,4793591012,4793591015,4793591018,4793591021,4793591024,4793591027,4793591030,4793591033,4793591036,4793591039,4793591162,4793591165,4793591168,4793591171,4793591174,4793591177,4793591180,4793591183,4793591186,4793591189,4793591192,4793591195,4793591198,4793591201,4793591204,4793591207,4793591210,4793591213,4793591216,4793591219,4793591222,4793591225,4793591228,4793591231,4793591234,4793591237,4793591240,4793591243,4793591246,4793591249,4793591252,4793591255,4793591258,4793591261,4793591264,4793591267,4793591270,4793591273,4793591276,4793591279,4793591402,4793591405,4793591408,4793591411,4793591414,4793591417,4793591420,4793591423,4793591426,4793591429,4793591432,4793591435,4793591438,4793591441,4793591444,4793591447,4793591450,4793591453,4793591456,4793591459,4793591462,4793591465,4793591468,4793591471,4793591474,4793591477,4793591480,4793591483,4793591486,4793591489,4793591492,4793591495,4793591498,4793591501,4793591504,4793591507,4793591510,4793591513,4793591516,4793591519,4793591642,4793591645,4793591648,4793591651,4793591654,4793591657,4793591660,4793591663,4793591666,4793591669,4793591672,4794336160,4795460127,4795650180,4801430084,4801997974,4802451060,4803343582,4806427875,4811106193,4811295981,4811304462,4811856227,4813434715,4814150351,4814193728,4816151238,4818099525,4830565370,4843101319,4843259745,4848764049,4855143078,4866109621,4869201277,4875004757,4876258278,4876828718,4882686640,4882686643,4882686646,4882686649,4882686652,4882686655,4882686658,4882686661,4882689070,4882689073,4882689076,4882689079,4882689082,4882689085,4882689088,4882689091,4882689094,4882689097,4882689100,4882689103,4882689106,4882689109,4882689112,4882689115,4882689118,4882689241,4882689244,4882689247,4882689250,4882689253,4882689256,4882689259,4882689262,4882689265,4882689268,4882689271,4882689274,4882689277,4882689280,4882689283,4882689286,4882689289,4882689292,4882689295,4882689298,4882689301,4882689304,4882689307,4882689310,4882689313,4882689316,4882689319,4882689322,4882689325,4882689328,4882689331,4882689334,4882689337,4882689340,4882689343,4882689346,4882689349,4882689352,4882689355,4882689358,4882689481,4882689484,4882689487,4882689490,4882689493,4882689496,4882689499,4882689502,4882689505,4882689508,4882689511,4882689514,4882689517,4882689520,4882689523,4882689526,4882689532,4882689535,4882689538,4882689541,4882689544,4882689547,4882689550,4882689553,4882689556,4882689559,4882689562,4882689565,4882689568,4882689571,4882689574,4882689577,4882742800,4882742803,4882742806,4882742809,4882742812,4882742815,4882742818,4882742821,4882742824,4882742827,4882742830,4882742836,4882742839,4882742842,4882742845,4882742848,4882742851,4882742854,4882742857,4882742860,4882742863,4882742866,4882742869,4882742872,4882742875,4882742878,4882743001,4882743004,4882743007,4882743010,4882743301,4882743304,4882743307,4882743310,4882743313,4882743316,4882743319,4882743322,4882743325,4882743328,4882743331,4882743334,4882743337,4882743496,4882743499,4882743505,4882743508,4882743511,4882743514,4882743517,4882743520,4882743523,4882743526,4882743529,4882743532,4882743535,4882743538,4882743541,4882743544,4882743547,4882743550,4882743553,4882743556,4882743559,4882743562,4882743565,4882743568,4882743571,4882743574,4882743577,4882743580,4882743583,4882743586,4882743589,4882743592,4882743964,4882743967,4882743970,4882743973,4882743976,4882743979,4882743982,4882743985,4882743988,4882743991,4882743994,4882743997,4882744210,4882744213,4882744216,4882744219,4882744222,4882744225,4882744228,4882744231,4882744234,4882744237,4882744240,4882744243,4882744246,4882744249,4882744252,4882744255,4882744258,4882744261,4882744264,4882744267,4882744270,4882744273,4882744276,4882744279,4882744282,4882744285,4882744288,4882744291,4882744294,4882744297,4882744300,4882744303,4882744306,4882744309,4882744312,4882744315,4882744318,4882744441,4882744444,4882744447,4882744450,4882744453,4882744456,4882744459,4882744462,4882744465,4882744729,4882744732,4882744735,4882744738,4882744741,4882744744,4882744747,4882744750,4882744753,4882744756,4882744759,4882744762,4882744765,4882744768,4882744771,4882744774,4882744777,4882744780,4882744783,4882744786,4882744789,4882744792,4882744795,4882744798,4882744921,4882744924,4882744927,4882744930,4882744933,4882744936,4882744939,4882744942,4882744945,4882744948,4882744951,4882744954,4882744957,4882745221,4882745224,4882745227,4882745230,4882745233,4882745236,4882745239,4882745242,4882745245,4882745248,4882745251,4882745254,4882745257,4882745260,4882745263,4882745269,4882745272,4882745275,4882745278,4882745401,4882745404,4882745407,4882745410,4882745413,4882745416,4882745419,4882745422,4882745425,4882745428,4882745431,4882745434,4882745437,4882745440,4882745443,4882745446,4882745449,4882745470,4882745473,4882745476,4882745479,4882745482,4882745485,4882745488,4882745491,4882745494,4882745497,4882745500,4882745503,4882745506,4882745509,4882745677,4882745680,4882745683,4882745686,4882745689,4882745692,4882745695,4882745698,4882745701,4882745704,4882745707,4882745893,4882745896,4882745899,4882745902,4882745905,4882745908,4882745911,4882745914,4882745917,4882745920,4882745923,4882745926,4882745929,4882745953,4882745956,4882745959,4882745962,4882746232,4882746235,4882746238,4882746361,4882746364,4882746367,4882746370,4882746373,4882746376,4882746379,4882746382,4882746385,4882746388,4882746391,4882746394,4882746397,4882746400,4882746403,4882746406,4882746409,4882746412,4882746415,4882746418,4882746421,4882746424,4882746427,4882746430,4882746433,4882746436,4882746439,4882746442,4882746445,4882746448,4882746451,4882746454,4882746457,4882746460,4882746463,4882746946,4882746949,4882746952,4882746955,4882746958,4882747081,4882747084,4882747087,4882747090,4882747093,4882747096,4882747099,4882747102,4882747105,4882747108,4882747111,4882747114,4882747117,4882747120,4882747123,4882747126,4882747129,4882747132,4882747135,4882747138,4882747141,4882747144,4882747147,4882747150,4882747153,4882747156,4882747159,4882747162,4882747165,4882747168,4882747171,4882747174,4882747177,4882747180,4882747183,4882747186,4882747189,4882747192,4882747195,4882747198,4882747321,4882747324,4882747327,4882747330,4882747381,4882747384,4882747387,4882747390,4882747393,4882747396,4882747399,4882747405,4882747408,4882747411,4882747414,4882749115,4882749118,4882749241,4882749244,4882749247,4882749250,4882749253,4882749256,4882749259,4882749262,4882749265,4882749268,4882749271,4882749274,4882749277,4882749280,4882749283,4882749286,4882749289,4882749292,4882749295,4882749298,4882749301,4882749310,4882752133,4882752136,4882752139,4882752142,4882752145,4882752148,4882752151,4882752154,4882752157,4882752160,4882752163,4882752166,4882752169,4882752172,4882752175,4882752178,4882752181,4882752184,4882752187,4882752190,4882752193,4882752196,4882752208,4882752211,4882752214,4882752370,4882752373,4882752376,4882752379,4882752382,4882752385,4882752388,4882752391,4882763200,4882763203,4882763206,4882763209,4882763212,4882763215,4882763218,4882763221,4882763224,4882763227,4882763230,4882763233,4882763236,4882763239,4882763242,4882763248,4882763278,4882763401,4882763413,4882763416,4882763419,4882763425,4882763428,4882763431,4882763449,4882763452,4882771879,4882771882,4882771885,4882771888,4882771891,4882771894,4882771897,4882771900,4882771903,4882771906,4882771909,4882772137,4882772140,4882772143,4882772146,4882772149,4882772152,4882772155,4882772158,4882772281,4882772284,4882772287,4882772290,4882772293,4882772296,4882772299,4882772302,4882772305,4882772308,4882772311,4882772314,4882772317,4882772320,4882772323,4882772326,4882772329,4882772332,4882772590,4882772593,4882772596,4882772599,4882772602,4882772605,4882772608,4882772611,4882772614,4882772617,4882772620,4882772623,4882772626,4882772629,4882772632,4882772635,4882772638,4882772761,4882772764,4882772767,4882772770,4882772773,4882772821,4882772824,4882772827,4882772830,4882772833,4882772836,4882772839,4882772842,4882772845,4882772848,4882772851,4882772854,4882772857,4882772860,4882772869,4882772872,4882772875,4882772878,4882773001,4882773004,4882773007,4882773010,4882773013,4882773016,4882773019,4882773022,4882773025,4882773028,4882773097,4882773100,4882773103,4882773106,4882773109,4882773112,4882773115,4882773118,4882773241,4882773244,4882773247,4882773250,4882773253,4882773256,4882773259,4882773262,4882773265,4882773268,4882773271,4882773328,4882773331,4882773337,4882773340,4882773343,4882773346,4882773349,4882773352,4882773355,4882773358,4882773481,4882773484,4882773487,4882773490,4882773493,4882773496,4882773499,4882773811,4882773814,4882773817,4882773820,4882773823,4882773826,4882773829,4882773832,4882773835,4882773838,4882773961,4882773964,4882773967,4882773970,4882773973,4882773976,4882773979,4882773982,4882773985,4882773988,4882773991,4882773994,4882773997,4882774000,4882774003,4882774006,4882774009,4882774012,4882774015,4882774018,4882774021,4882774024,4882774027,4882774030,4882774033,4882774036,4882774039,4882774042,4882774045,4882774048,4882774051,4882774054,4882774057,4882774060,4882774063,4882774066,4882774069,4882774072,4882774075,4882774078,4882774201,4882774204,4882774207,4882774210,4882774213,4882774216,4882774219,4882774519,4882774522,4882774525,4882774528,4882774531,4882774534,4882774537,4882774540,4882774543,4882774546,4882774549,4882774552,4882774555,4882774558,4882774681,4882774684,4882774687,4882774690,4882774693,4882774696,4882774699,4882774702,4882774705,4882774708,4882774711,4882774714,4882774717,4882774720,4882774723,4882774726,4882774729,4882774732,4882774735,4882774738,4882774741,4882774744,4882774747,4882774750,4882775470,4882775473,4882775476,4882775479,4882775482,4882775485,4882775488,4882775491,4882775494,4882775497,4882775500,4882775503,4882775506,4882775509,4882775512,4882775515,4882775518,4882775641,4882775644,4882775647,4882775650,4882775653,4882775656,4882775659,4882775662,4882775665,4882775671,4882775674,4882775677,4882775680,4882775683,4882775686,4882775689,4882776190,4882776193,4882776196,4882776202,4882776205,4882776208,4882776211,4882776214,4882776217,4882776220,4882776223,4882776226,4882776229,4882776232,4882776235,4882776238,4882776361,4882776364,4882776367,4882776370,4882776373,4882776376,4882776379,4882776382,4882776385,4882776388,4882776391,4882776394,4882776397,4882776400,4882776403,4882776406,4882776409,4882776412,4882776415,4882776418,4882776421,4882776424,4882776427,4882776430,4882776433,4882776436,4882776439,4882776442,4882776445,4882776448,4882776451,4882776454,4882776457,4882776460,4882776463,4882776466,4882776469,4882776472,4882776475,4882776478,4882776601,4882776604,4882776607,4882776610,4882776613,4882776616,4882776619,4882776622,4882776625,4882776628,4882776631,4882776634,4882776637,4882776640,4882776643,4882776646,4882776649,4882776652,4882776655,4882776658,4882776661,4882776664,4882777108,4882777111,4882777114,4882777117,4882777123,4882777126,4882777129,4882777132,4882777135,4882777138,4882777141,4882777144,4882777147,4882777150,4882777153,4882777156,4882777159,4882777162,4882777165,4882777168,4882777171,4882777174,4882777177,4882777180,4882777183,4882777186,4882777189,4882777192,4882777195,4882777198,4882777321,4882777324,4882777327,4882777387,4882777390,4882777393,4882777399,4882777402,4882777405,4882777408,4882777411,4882777414,4882777417,4882777420,4882777423,4882777426,4882777429,4882777432,4882777435,4882777438,4882777561,4882777564,4882777567,4882777570,4882777573,4882777576,4882777579,4882777582,4882777585,4882777588,4882777591,4882777594,4882777597,4882777600,4882777603,4882777606,4882777609,4882777612,4882777615,4882777618,4882777621,4882777624,4882777627,4882777630,4882777633,4882777636,4882777639,4882777642,4882777645,4882777648,4882777651,4882777654,4882777657,4882777870,4882777873,4882777876,4882777879,4882777882,4882777885,4882777888,4882777891,4882778389,4882778392,4882778395,4882778398,4882778521,4882778524,4882778527,4882778566,4882778569,4882778572,4882778575,4882778578,4882778581,4882778584,4882778587,4882778590,4882778593,4882778596,4882778599,4882778602,4882778605,4882778608,4882778611,4882778614,4882778617,4882778620,4882778623,4882778626,4882778629,4882778632,4882778635,4882778638,4882778761,4882778764,4882778767,4882778770,4882778773,4882778776,4882778779,4882778782,4882778785,4882779013,4882779016,4882779019,4882779022,4882779025,4882779028,4882779031,4882779034,4882779037,4882779040,4882779043,4882779046,4882779049,4882779052,4882779055,4882779058,4882779061,4882779064,4882779067,4882779070,4882779073,4882779076,4882779079,4882779082,4882779085,4882779088,4882779091,4882779094,4882779097,4882779100,4882779103,4882779106,4882779109,4882779112,4882779115,4882779118,4882779241,4882779244,4882779247,4882779250,4882779253,4882779256,4882779259,4882779262,4882779265,4882779268,4882779271,4882779274,4882779277,4882779280,4882779283,4882779286,4882779289,4882779292,4882779295,4882779298,4882779301,4882779304,4882779307,4882779310,4882779313,4882779316,4882779319,4882779322,4882779325,4882779328,4882779331,4882779334,4882779337,4882779340,4882779343,4882779346,4882779349,4882779352,4882779355,4882779358,4882779481,4882779484,4882779487,4882779490,4882779493,4882779496,4882779499,4882779502,4882779505,4882779508,4882779511,4882779514,4882779517,4882779520,4882779523,4882779526,4882779529,4882779532,4882779535,4882779538,4882779541,4882779544,4882779547,4882779550,4882779553,4882779556,4882779559,4882779562,4882779565,4882779568,4882779571,4882779574,4882779577,4882779580,4882779583,4882779586,4882779589,4882779592,4882779595,4882779598,4882779721,4882779724,4882779727,4882779730,4882779733,4882779736,4882779739,4882779742,4882779745,4882779748,4882779751,4882779754,4882779757,4882779760,4882779763,4882779766,4882780000,4882780003,4882780006,4882780009,4882780012,4882780015,4882780018,4882780021,4882780024,4882780027,4882780030,4882780033,4882780036,4882780039,4882780042,4882780045,4882780048,4882780051,4882780546,4882780549,4882780552,4882780555,4882780558,4882780681,4882780684,4882780687,4882780690,4882780693,4882780696,4882780699,4882780702,4882780705,4882780708,4882780711,4882780714,4882780717,4882780720,4882780723,4882780726,4882780729,4882780732,4882780735,4882780738,4882780741,4882780963,4882780966,4882780969,4882780972,4882780975,4882780978,4882780981,4882780984,4882780987,4882780990,4882780993,4882780996,4882780999,4882781002,4882781005,4882781008,4882781011,4882781014,4882781017,4882781020,4882781023,4882781026,4882781029,4882781032,4882781200,4882781203,4882781206,4882781209,4882781212,4882781215,4882781218,4882781221,4882781224,4882781464,4882781467,4882781470,4882781473,4882781476,4882781479,4882781482,4882781485,4882781488,4882781491,4882781494,4882781497,4882781500,4882781503,4882781506,4882781509,4882781512,4882781515,4882781518,4882781641,4882781644,4882781647,4882781650,4882781653,4882781656,4882781659,4882781749,4882781752,4882781755,4882781758,4882781881,4882781884,4882781887,4882781890,4882781893,4882781896,4882781899,4882781902,4882781905,4882781908,4882781911,4882781914,4882781917,4882781920,4882781923,4882781926,4882781929,4882782126,4882782129,4882782132,4882782135,4882782138,4882782141,4882782144,4882782147,4882782150,4882782153,4882782156,4882782159,4882782162,4882782165,4882782168,4882782171,4882782174,4882782177,4882782180,4882782183,4882782186,4882782189,4882782192,4882782195,4882782198,4882782201,4882782207,4882782210,4882782213,4882782216,4882782219,4882782222,4882782225,4882782228,4882782231,4882782234,4882782237,4882782360,4882782363,4882782366,4882782369,4882782372,4882782375,4882782378,4882782381,4882782384,4882782387,4882782390,4882782393,4882782396,4882782399,4882782402,4882782405,4882782408,4882782411,4882782414,4882782417,4882782420,4882782423,4882782426,4882782429,4882782432,4882782435,4882782438,4882782441,4882782444,4882782447,4882782450,4882782453,4882782456,4882782459,4882782462,4882782465,4882782468,4882782471,4882782474,4882782477,4882782600,4882782603,4882782606,4882782609,4882782612,4882782615,4882782618,4882782621,4882782624,4882782627,4882782630,4882782633,4882782636,4882782639,4882782661,4882782664,4882782667,4882782958,4882783081,4882783084,4882783087,4882783090,4882783093,4882783096,4882783099,4882783102,4882783105,4882783108,4882783111,4882783114,4882783117,4882783120,4882783123,4882783126,4882783129,4882783132,4882783135,4882783138,4882783141,4882783144,4882783147,4882783150,4882783153,4882783156,4882783159,4882783162,4882783165,4882783168,4882783171,4882783174,4882783177,4882783180,4882783183,4882783186,4882783189,4882783192,4882783195,4882783198,4882783321,4882783324,4882783327,4882783384,4882783387,4882783390,4882783393,4882783396,4882783399,4882783402,4882783405,4882783408,4882783411,4882783414,4882783417,4882783420,4882783423,4882783426,4882783429,4882783432,4882783435,4882783438,4882783561,4882783564,4882783567,4882783570,4882783573,4882783576,4882783579,4882783582,4882783585,4882783588,4882783591,4882783594,4882783597,4882783600,4882783603,4882783606,4882783609,4882783612,4882783615,4882783618,4882783621,4882783624,4882783627,4882783630,4882783633,4882783636,4882783639,4882783642,4882783645,4882783648,4882783651,4882783654,4882783657,4882783660,4882783663,4882783666,4882783669,4882783672,4882783675,4882783678,4882783801,4882783804,4882783807,4882783810,4882783813,4882783816,4882783819,4882783822,4882783825,4882783828,4882783831,4882783834,4882783837,4882783840,4882783843,4882783846,4882783849,4882783852,4882783855,4882783858,4882784296,4882784299,4882784302,4882784305,4882784308,4882784311,4882784314,4882784347,4882784350,4882784353,4882784356,4882784359,4882784362,4882784365,4882784368,4882784524,4882784527,4882784530,4882784533,4882784536,4882784539,4882784545,4882784548,4882784551,4882784575,4882784578,4882784581,4882784584,4882784587,4882784590,4882784593,4882784596,4882784782,4882784785,4882784788,4882784791,4882784794,4882784797,4882784812,4882784815,4882784818,4882784821,4882784824,4882784827,4882784830,4882784833,4882784836,4882784839,4882784842,4882784845,4882784848,4882784851,4882784854,4882784857,4882784860,4882784863,4882784866,4882784869,4882784872,4882784875,4882784878,4882785001,4882785004,4882785007,4882785010,4882785013,4882785016,4882785019,4882785022,4882785025,4882785028,4882785031,4882785034,4882785037,4882785040,4882785046,4882785049,4882785052,4882785055,4882785058,4882785061,4882785064,4882785067,4882785070,4882785073,4882785079,4882785082,4882785085,4882785088,4882785091,4882785094,4882785097,4882785100,4882785103,4882785106,4882785109,4882785112,4882785115,4882785118,4882785241,4882785244,4882785247,4882785250,4882785253,4882785256,4882785259,4882785262,4882785265,4882785271,4882785274,4882785277,4882785280,4882785283,4882785286,4882785289,4882785292,4882785295,4882785298,4882785301,4882785304,4882785307,4882785310,4882785313,4882785316,4882785319,4882785322,4882785325,4882785328,4882785331,4882785334,4882785337,4882785340,4882785343,4882785346,4882785349,4882785352,4882785355,4882785358,4882786204,4882786207,4882786210,4882786213,4882786216,4882786219,4882786222,4882786225,4882786228,4882786231,4882786234,4882786237,4882786240,4882786243,4882786246,4882786249,4882786252,4882786255,4882786258,4882786261,4882786264,4882786267,4882786270,4882786273,4882786276,4882786279,4882786282,4882786285,4882786288,4882786291,4882786294,4882786297,4882786300,4882786303,4882786306,4882786309,4882786312,4882786315,4882786318,4882786441,4882786444,4882786447,4882786450,4882786453,4882786456,4882786459,4882786462,4882786465,4882786468,4882786471,4882786474,4882786477,4882786480,4882786483,4882786486,4882786489,4882786492,4882786495,4882786498,4882786501,4882786504,4882786507,4882786510,4882786513,4882786516,4882786519,4882786522,4882786525,4882786528,4882786531,4882786534,4882786537,4882786540,4882786543,4882786546,4882786549,4882786552,4882786555,4882786558,4882786681,4882786726,4882786732,4882786735,4882786738,4882786741,4882786744,4882786747,4882786750,4882786753,4882786756,4882786759,4882786762,4882786765,4882787263,4882787266,4882787269,4882787272,4882787275,4882787278,4882787401,4882787404,4882787407,4882787410,4882787413,4882787416,4882787419,4882787422,4882787425,4882787428,4882787431,4882787434,4882787437,4882787440,4882787443,4882787446,4882787449,4882787452,4882787455,4882787458,4882787461,4882787464,4882787467,4882817740,4882817743,4882817746,4882817749,4882817752,4882817755,4882817758,4882817881,4882817884,4882817887,4882817890,4882817893,4882817896,4882817899,4882817902,4882817905,4882817908,4882817911,4882817914,4882817917,4882817920,4882817923,4882817926,4882817929,4882817932,4882817935,4882817938,4882817941,4882817944,4882817947,4882817950,4882817953,4882817956,4882817959,4882817962,4882817965,4882817968,4882817971,4882817974,4882817977,4882817980,4882817983,4882817986,4882817989,4882817992,4882817995,4882817998,4882818121,4882818124,4882818127,4882818130,4882818133,4882818136,4882818139,4882818142,4882818145,4882818148,4882818151,4882818154,4882818157,4882818160,4882818163,4882818415,4882818418,4882818421,4882818424,4882818427,4882818430,4882818433,4882818436,4882818439,4882818442,4882818445,4882818448,4882818451,4882818454,4882818457,4882818460,4882818463,4882818466,4882818469,4882818472,4882818475,4882818478,4882818601,4882818604,4882818607,4882818847,4882818850,4882818853,4882818856,4882818859,4882818862,4882818865,4882818868,4882818871,4882818874,4882818877,4882818880,4882818883,4882818886,4882818889,4882818892,4882818895,4882818898,4882818901,4882818904,4882818907,4882818910,4882818913,4882818940,4882818943,4882818946,4882818949,4882818952,4882818955,4882818958,4882819081,4882819084,4882819087,4882819090,4882819093,4882819096,4882819099,4882819102,4882819105,4882819108,4882819111,4882819657,4882819660,4882819663,4882819666,4882819669,4882819672,4882819675,4882819678,4882819801,4882819804,4882819807,4882819810,4882819813,4882819816,4882819819,4882819822,4882819825,4882819828,4882819831,4882819834,4882819837,4882819840,4882819843,4882820815,4882820818,4882820821,4882820824,4882820827,4882820830,4882820833,4882820836,4882820839,4882820842,4882820845,4882820848,4882820851,4882820854,4882820857,4882820860,4882820863,4882821052,4882821055,4882821058,4882821061,4882821064,4882821067,4882821070,4882821073,4882821076,4882821079,4882821082,4882821085,4882821088,4882821091,4882821094,4882821097,4882821100,4882821103,4882821106,4882821109,4882821112,4882821115,4882821118,4882821241,4882821244,4882821247,4882821334,4882821337,4882821340,4882821343,4882821346,4882821349,4882821352,4882821355,4882821358,4882821481,4882821484,4882821487,4882821490,4882821493,4882821496,4882821499,4882821502,4882821505,4882821508,4882821511,4882821514,4882821517,4882821520,4882821523,4882821526,4882821529,4882821532,4882821535,4882821538,4882821541,4882821544,4882821547,4882821550,4882821553,4882821556,4882821559,4882821562,4882821565,4882821568,4882821571,4882821574,4882821577,4882821580,4882821583,4882821586,4882821589,4882821592,4882821595,4882821598,4882821721,4882821724,4882821727,4882821730,4882822708,4882822711,4882822714,4882822717,4882822720,4882822723,4882822726,4882822729,4882822732,4882822735,4882822738,4882822741,4882822744,4882822747,4882822750,4882822753,4882822756,4882822759,4882822762,4882822765,4882822768,4882822771,4882822774,4882822777,4882822780,4882822783,4882822786,4882822789,4882822792,4882822795,4882822798,4882822921,4882822924,4882822927,4882822951,4882822954,4882822957,4882822960,4882822963,4882822966,4882822969,4882822972,4882822975,4882822978,4882822981,4882822984,4882822987,4882822990,4882822993,4882822996,4882822999,4882823002,4882823005,4882823008,4882823011,4882823014,4882823017,4882823020,4882823023,4882823026,4882823029,4882823032,4882823035,4882823038,4882823161,4882823164,4882823167,4882823170,4882823173,4882823176,4882823179,4882823182,4882823185,4882823188,4882823191,4882823194,4882823197,4882823200,4882823203,4882823206,4882823209,4882823212,4882823215,4882823218,4882823221,4882823224,4882823227,4882823230,4882823233,4882823236,4882823239,4882823242,4882823245,4882823248,4882823251,4882823254,4882823257,4882823260,4882823263,4882823266,4882823269,4882823272,4882823275,4882823278,4882823401,4882823404,4882823407,4882823410,4882823413,4882823416,4882823419,4882823422,4882823425,4882823428,4882823431,4882823434,4882823437,4882823440,4882823470,4882823473,4882823476,4882823479,4882823482,4882823485,4882823488,4882823491,4882823494,4882823497,4882823500,4882823503,4882823506,4882823509,4882823512,4882823515,4882823518,4882823641,4882823644,4882823647,4882823650,4882823653,4882823656,4882823659,4882823662,4882823665,4882823668,4882823671,4882823674,4882823677,4882823680,4882823683,4882823686,4882823689,4882823692,4882823695,4882823698,4882823701,4882823704,4882823707,4882823710,4882823713,4882823716,4882823719,4882823722,4882823725,4882823728,4882823731,4882823734,4882823737,4882823740,4882823743,4882823746,4882823749,4882823752,4882824130,4882824133,4882824136,4882824139,4882824142,4882824145,4882824148,4882824151,4882824154,4882824157,4882824160,4882824163,4882824166,4882824169,4882824172,4882824175,4882824178,4882824181,4882824184,4882824187,4882824190,4882824193,4882824196,4882824199,4882824202,4882824205,4882824208,4882824211,4882824214,4882824217,4882824220,4882824223,4882824226,4882824229,4882824232,4882824235,4882824238,4882824361,4882824364,4882824367,4882824370,4882824373,4882824376,4882824379,4882824382,4882824385,4882824388,4882824391,4882824394,4882824397,4882824400,4882824403,4882824406,4882824409,4882824412,4882824415,4882824418,4882825084,4882825087,4882825090,4882825093,4882825096,4882825099,4882825102,4882825105,4882825108,4882825111,4882825114,4882825117,4882825120,4882825123,4882825126,4882825129,4882825132,4882825135,4882825138,4882825141,4882825144,4882825147,4882825150,4882825153,4882825156,4882825159,4882825162,4882825165,4882825168,4882825171,4882825174,4882825177,4882825180,4882825183,4882825186,4882825189,4882825192,4882825195,4882825198,4882825321,4882825324,4882825327,4882825330,4882825333,4882825336,4882825339,4882825342,4882825345,4882825348,4882825351,4882825354,4882825357,4882825360,4882825363,4882825366,4882825369,4882825372,4882825375,4882825381,4882825384,4882825387,4882825390,4882825393,4882825396,4882825399,4882825402,4882825405,4882825408,4882825411,4882825414,4882825417,4882825423,4882825426,4882825429,4882825432,4882825435,4882826305,4882826308,4882826311,4882826314,4882826317,4882826320,4882826323,4882826326,4882826329,4882826332,4882826335,4882826338,4882826341,4882826344,4882826347,4882826350,4882826353,4882826356,4882826359,4882826362,4882826365,4882826368,4882826371,4882826374,4882826377,4882826380,4882826383,4882826386,4882826389,4882826392,4882826395,4882826398,4882826521,4882826524,4882826527,4882826854,4882826857,4882826860,4882826863,4882826866,4882826869,4882826872,4882826875,4882826878,4882827001,4882827004,4882827007,4882827010,4882827013,4882827016,4882827019,4882827022,4882827025,4882827028,4882827031,4882827034,4882827037,4882827040,4882827043,4882827046,4882827049,4882827052,4882827055,4882827058,4882827061,4882827064,4882827067,4882827070,4882827073,4882827076,4882827079,4882827283,4882827286,4882827289,4882827292,4882827295,4882827298,4882827301,4882827304,4882827307,4882827310,4882827313,4882827316,4882827319,4882827322,4882827325,4882827327,4882827328,4882827330,4882827331,4882827333,4882827334,4882827336,4882827337,4882827339,4882827340,4882827342,4882827343,4882827345,4882827346,4882827348,4882827349,4882827351,4882827352,4882827354,4882827355,4882827357,4882827358,4882827480,4882827481,4882827483,4882827486,4882827489,4882827492,4882827574,4882827577,4882827580,4882827583,4882827586,4882827589,4882827592,4882827595,4882827598,4882827721,4882827724,4882827727,4882828072,4882828075,4882828078,4882828201,4882828204,4882828207,4882828210,4882828213,4882828216,4882828219,4882828222,4882828225,4882828228,4882828231,4882828234,4882828237,4882828240,4882828243,4882828246,4882828249,4882828252,4882828255,4882828258,4882828261,4882828264,4882828267,4882843668,4882843863,4882843866,4882843869,4882843872,4882843875,4882843878,4882843881,4882843884,4882843887,4882843890,4882843893,4882843896,4882843899,4882843902,4882843905,4882843908,4882843911,4882843914,4882843917,4882844040,4882844043,4882844046,4882844049,4882844052,4882844055,4882844058,4882844061,4882844064,4882844067,4882844070,4882844073,4882844076,4882844079,4882844082,4882844085,4882844088,4882844091,4882844094,4882844097,4882844100,4882844103,4882844106,4882844109,4882844112,4882844115,4882844118,4882844121,4882844124,4882844127,4882844130,4882844331,4882844334,4882844337,4882844340,4882844343,4882844346,4882844349,4882844352,4882844355,4882844358,4882844361,4882844364,4882844367,4882844370,4882844373,4882844376,4882844379,4882844382,4882844385,4882844388,4882844391,4882844394,4882844397,4882844823,4882844826,4882844829,4882844832,4882844835,4882844838,4882844841,4882844844,4882844847,4882844850,4882844853,4882844856,4882844859,4882844862,4882844865,4882844868,4882845015,4882845018,4882845024,4882845027,4882845030,4882845033,4882845036,4882845039,4882845042,4882845045,4882845048,4882845051,4882845054,4882845057,4882845060,4882845063,4882845066,4882845243,4882845246,4882845249,4882845252,4882845255,4882845258,4882845261,4882845264,4882845267,4882845270,4882845273,4882845276,4882845279,4882845282,4882845285,4882845348,4882845351,4882845354,4882845357,4882845480,4882845483,4882845486,4882845489,4882845531,4882845534,4882845537,4882845540,4882845543,4882845546,4882845549,4882845552,4882845555,4882845558,4882845561,4882845564,4882845567,4882845570,4882845573,4882845576,4882845579,4882845582,4882845585,4882845588,4882845591,4882845594,4882845597,4882845720,4882846032,4882846035,4882846038,4882846041,4882846047,4882846050,4882846053,4882846056,4882846059,4882846062,4882846065,4882846068,4882846074,4882846077,4882846200,4882846203,4882846206,4882846209,4882846212,4882846215,4882846218,4882846221,4882846224,4882846227,4882846230,4882846233,4882846236,4882846239,4882846242,4882846245,4882846248,4882846251,4882846254,4882846257,4882846260,4882846263,4882846266,4882846269,4882846272,4882846275,4882846278,4882846281,4882846284,4882846287,4882846290,4882846293,4882846296,4882846299,4882846302,4882846461,4882846464,4882846467,4882846470,4882846473,4882846476,4882846479,4882846482,4882846485,4882846488,4882846491,4882846494,4882846497,4882846500,4882846503,4882846506,4882846509,4882846512,4882846971,4882846974,4882846977,4882846980,4882846983,4882846986,4882846989,4882846992,4882846995,4882846998,4882847178,4882847181,4882847184,4882847187,4882847190,4882847193,4882847196,4882847199,4882847202,4882847205,4882847208,4882847211,4882847214,4882847217,4882847220,4882847223,4882847226,4882847229,4882847232,4882847235,4882847238,4882847241,4882847244,4882847247,4882847250,4882847253,4882847256,4882847259,4882847262,4882847265,4882847268,4882847271,4882847274,4882847277,4882847400,4882847403,4882847406,4882847409,4882847412,4882847415,4882847418,4882847421,4882847424,4882847430,4882847433,4882847436,4882847712,4882847715,4882847718,4882847721,4882847724,4882847727,4882847730,4882847733,4882847736,4882847739,4882847742,4882847745,4882847748,4882847751,4882847754,4882847757,4882847880,4882847883,4882847886,4882847889,4882847892,4882847895,4882847898,4882847901,4882847904,4882847907,4882847910,4882847913,4882847916,4882847919,4882847922,4882847928,4882847931,4882847934,4882847940,4882847943,4882847946,4882847949,4882848183,4882848186,4882848189,4882848192,4882848195,4882848198,4882848201,4882848204,4882848207,4882848210,4882848213,4882848216,4882848219,4882848222,4882848225,4882848228,4882848231,4882848234,4882848471,4882848474,4882848477,4882848600,4882848603,4882848606,4882848609,4882848612,4882848615,4882848618,4882848621,4882848624,4882848627,4882848630,4882858456,4882858459,4882858462,4882858465,4882858468,4882858471,4882858474,4882858480,4882858483,4882858486,4882858489,4882858492,4882858495,4882858498,4882858501,4882858504,4882858507,4882858510,4882858513,4882858516,4882858519,4882858522,4882858525,4882858528,4882858531,4882858534,4882858537,4882858540,4882858543,4882858546,4882858549,4882858552,4882858555,4882858558,4882858681,4882858684,4882858687,4882858690,4882858693,4882858696,4882858699,4882858702,4882872219,4882872222,4882872225,4882872228,4882872231,4882872234,4882872237,4882872360,4882872363,4882872366,4882872369,4882872372,4882872375,4882872444,4882872447,4882872450,4882872453,4882872456,4882872459,4882872462,4882872465,4882872468,4882872471,4882872474,4882872477,4882872600,4882872603,4882872606,4882872609,4882872612,4882872615,4882872618,4882872621,4882872624,4882872627,4882872630,4882872645,4882872648,4882872651,4882872654,4882872657,4882872660,4882872663,4882872666,4882872669,4882872672,4882872675,4882872678,4882872681,4882872708,4882872711,4882872714,4882872717,4882872840,4882872843,4882872846,4882872849,4882872852,4882872855,4882872858,4882872861,4882872864,4882872867,4882872870,4882872873,4882872876,4882872879,4882872882,4882872885,4882872888,4882872891,4882872894,4882872897,4882872900,4882872903,4882872906,4882872909,4882872912,4882872915,4882872918,4882872921,4882872924,4882872927,4882872930,4882872933,4882872936,4882872939,4882872942,4882872945,4882872948,4882872951,4882872954,4882872957,4882873080,4882873083,4882873086,4882873089,4882873092,4882873095,4882873098,4882873101,4882873104,4882873107,4882873425,4882873428,4882873431,4882873434,4882873437,4882873560,4882873563,4882873566,4882873569,4882873572,4882873575,4882873578,4882873581,4882873584,4882873587,4882873590,4882873593,4882873596,4882873602,4882873605,4882873608,4882873611,4882873614,4882873617,4882873620,4882873623,4882873827,4882873830,4882873833,4882873836,4882873839,4882873842,4882873845,4882873848,4882873851,4882873854,4882873857,4882873860,4882873863,4882873866,4882873869,4882873872,4882873875,4882873878,4882873881,4882873884,4882873887,4882874139,4882874142,4882874145,4882874148,4882874151,4882874154,4882874157,4882874280,4882874283,4882874286,4882874289,4882874295,4882874298,4882874301,4882874304,4882874307,4882874310,4882874313,4882874316,4882874319,4882874322,4882874325,4882874328,4882874331,4882874334,4882874337,4882874340,4882874343,4882874346,4882874349,4882874352,4882874355,4882874358,4882874361,4882874364,4882874367,4882874370,4882874373,4882874376,4882874379,4882874382,4882874385,4882874388,4882874391,4882874394,4882874397,4882874520,4882874523,4882874526,4882874529,4882874532,4882874535,4882874538,4882874541,4882874544,4882874547,4882874550,4882874556,4882874559,4882874562,4882874565,4882874568,4882874571,4882874574,4882874577,4882874580,4882874583,4882874586,4882874589,4882874592,4882874595,4882874598,4882874601,4882874604,4882874607,4882874610,4882874613,4882874616,4882874619,4882874622,4882875351,4882875354,4882875357,4882875480,4882875483,4882875486,4882875489,4882875492,4882875495,4882875498,4882875501,4882875504,4882875507,4882875510,4882875513,4882875516,4882875519,4882875522,4882875525,4882875528,4882875531,4882875534,4882875537,4882875540,4882875543,4882875546,4882875549,4882875552,4882875555,4882875558,4882875561,4882875564,4882875567,4882875570,4882875828,4882875831,4882875834,4882875837,4882875960,4882875963,4882875966,4882875969,4882875972,4882875975,4882875978,4882875981,4882875984,4882875987,4882875990,4882875993,4882875996,4882875999,4882876002,4882876005,4882876008,4882876011,4882876014,4882876017,4882876020,4882876023,4882876026,4882876029,4882876032,4882876071,4882876074,4882876077,4882876200,4882876203,4882876206,4882876209,4882876212,4882876215,4882876218,4882876221,4882876224,4882876227,4882876230,4882876233,4882876236,4882876239,4882876242,4882876245,4882876248,4882876251,4882876254,4882876257,4882876260,4882876263,4882876266,4882876269,4882876272,4882876275,4882876278,4882876281,4882876284,4882876287,4882876290,4882876293,4882876296,4882876299,4882876302,4882877004,4882877007,4882877010,4882877013,4882877016,4882877019,4882877022,4882877025,4882877028,4882877031,4882877034,4882877037,4882877160,4882877163,4882877166,4882877169,4882877172,4882877175,4882877178,4882877181,4882877184,4882877187,4882877190,4882877193,4882877196,4882877199,4882877202,4882877205,4882877208,4882877211,4882877214,4882877217,4882877220,4882877223,4882877226,4882877229,4882877232,4882877235,4882877238,4882877241,4882877244,4882877247,4882877250,4882877253,4882877256,4882877259,4882877262,4882877265,4882877268,4882877271,4882877274,4882877277,4882877400,4882877403,4882877406,4882877409,4882877412,4882877913,4882877916,4882877919,4882877922,4882877925,4882877928,4882877931,4882877934,4882877937,4882877940,4882877943,4882877946,4882877949,4882877952,4882877955,4882877958,4882878183,4882878186,4882878189,4882878192,4882878195,4882878198,4882878201,4882878204,4882878207,4882878210,4882878213,4882878216,4882878219,4882878222,4882878225,4882878228,4882878231,4882878234,4882878237,4882878360,4882878363,4882878366,4882878369,4882878372,4882878375,4882878378,4882878381,4882878384,4882878846,4882878849,4882878852,4882878855,4882878858,4882878861,4882878867,4882878870,4882878873,4882878876,4882878879,4882878885,4882878888,4882878891,4882878894,4882878897,4882878900,4882878903,4882878906,4882878909,4882878912,4882878915,4882878918,4882878921,4882878924,4882878927,4882878930,4882878933,4882878936,4882878939,4882878942,4882878945,4882878948,4882878951,4882878954,4882878957,4882879080,4882879083,4882879086,4882879089,4882879092,4882879095,4882879098,4882879101,4882879107,4882879110,4882879113,4882879116,4882879119,4882879122,4882879125,4882879128,4882879134,4882879137,4882879140,4882879143,4882879146,4882879149,4882879152,4882879155,4882879158,4882879161,4882879164,4882879167,4882879170,4882879173,4882879176,4882879179,4882879182,4882879185,4882879188,4882879191,4882879194,4882879197,4882879320,4882879323,4882879326,4882879329,4882879332,4882879335,4882879338,4882879341,4882879344,4882879347,4882879350,4882879353,4882879356,4882879359,4882879362,4882879365,4882879368,4882879371,4882879374,4882879377,4882879380,4882879383,4882879386,4882879389,4882879392,4882879395,4882879398,4882879401,4882879404,4882879407,4882879410,4882879413,4882879416,4882879419,4882879422,4882879425,4882879428,4882879431,4882879434,4882879437,4882879560,4882879563,4882879566,4882879569,4882879572,4882879575,4882879578,4882879581,4882880775,4882880778,4882880781,4882880784,4882880787,4882880790,4882880793,4882880796,4882880799,4882880802,4882880805,4882880808,4882880811,4882880814,4882880817,4882880820,4882880823,4882880826,4882880829,4882880832,4882880835,4882880838,4882880841,4882880844,4882880847,4882880850,4882880853,4882880856,4882880859,4882881078,4882881081,4882881084,4882881087,4882881090,4882881093,4882881096,4882881099,4882881102,4882881105,4882881108,4882881111,4882881114,4882881117,4882881240,4882881243,4882881246,4882881249,4882881252,4882881255,4882881258,4882881318,4882881321,4882881324,4882881327,4882881330,4882881333,4882881336,4882881339,4882881342,4882881345,4882881348,4882881351,4882881354,4882881357,4882881480,4882881483,4882881486,4882881489,4882881492,4882881495,4882881498,4882881501,4882881504,4882881507,4882881510,4882881513,4882881516,4882881519,4882881522,4882881525,4882881528,4882881531,4882881534,4882881537,4882881540,4882881543,4882881546,4882881549,4882881552,4882881555,4882881558,4882881561,4882881564,4882881567,4882881570,4882881573,4882881576,4882881579,4882881582,4882881585,4882881588,4882881591,4882881594,4882881597,4882881720,4882881723,4882881726,4882881729,4882881732,4882881735,4882881738,4882881741,4882881744,4882881747,4882881750,4882881753,4882881756,4882881759,4882881762,4882881801,4882881804,4882881807,4882881810,4882881813,4882881816,4882881819,4882881822,4882881825,4882881828,4882881831,4882881834,4882881837,4882881960,4882881963,4882881966,4882881969,4882881972,4882881975,4882881978,4882881981,4882881984,4882881987,4882881990,4882881993,4882881996,4882881999,4882882002,4882882005,4882882008,4882882011,4882882014,4882882017,4882882020,4882882023,4882882026,4882882029,4882882032,4882882035,4882882038,4882882464,4882882467,4882882470,4882882473,4882882476,4882882479,4882882482,4882882485,4882882488,4882882491,4882882494,4882882497,4882882500,4882882503,4882882506,4882882509,4882882512,4882882515,4882882518,4882882521,4882882719,4882882722,4882882725,4882882728,4882882731,4882882734,4882882737,4882882740,4882882743,4882882746,4882882749,4882882752,4882882755,4882882758,4882882761,4882882764,4882882767,4882882770,4882882773,4882882776,4882882779,4882882962,4882882965,4882882968,4882882971,4882882974,4882882977,4882882980,4882882983,4882882986,4882882989,4882882992,4882882995,4882882998,4882883001,4882883004,4882883007,4882883010,4882883013,4882883016,4882883169,4882883172,4882883175,4882883178,4882883181,4882883184,4882883187,4882883190,4882883193,4882883196,4882883199,4882883232,4882883235,4882883238,4882883241,4882883244,4882883247,4882883250,4882883253,4882883256,4882883259,4882883271,4882883274,4882883277,4882883400,4882883403,4882883406,4882883409,4882883412,4882883415,4882883418,4882883421,4882883424,4882883427,4882883931,4882883934,4882883937,4882883940,4882883943,4882883946,4882883949,4882883952,4882883955,4882883958,4882883961,4882883964,4882883967,4882884618,4882884621,4882884624,4882884627,4882884630,4882884633,4882884636,4882884639,4882884642,4882884645,4882884648,4882884651,4882884654,4882884657,4882884660,4882884663,4882884666,4882884669,4882884672,4882884675,4882884678,4882884681,4882884684,4882884690,4882884693,4882884696,4882884699,4882884702,4882884705,4882884708,4882884711,4882884714,4882884717,4882884840,4882884843,4882884846,4882884849,4882884852,4882884855,4882884858,4882884903,4882884906,4882884909,4882884912,4882884915,4882884918,4882884921,4882884924,4882884927,4882884930,4882884933,4882884936,4882884939,4882884942,4882884945,4882884948,4882884951,4882884954,4882884957,4882885080,4882885083,4882885086,4882885089,4882885092,4882885095,4882885098,4882885101,4882885104,4882885107,4882885110,4882885113,4882885116,4882885119,4882885122,4882885125,4882885128,4882885131,4882885134,4882885137,4882885140,4882885143,4882885146,4882885149,4882885152,4882885155,4882885158,4882885161,4882885167,4882885170,4882885173,4882885176,4882885179,4882885182,4882885185,4882885188,4882885191,4882885194,4882885197,4882885320,4882885323,4882885326,4882885329,4882885332,4882885335,4882885338,4882885341,4882885344,4882885347,4882885350,4882885353,4882885356,4882885359,4882885362,4882885365,4882885368,4882885374,4882885377,4882885380,4882885383,4882885386,4882885389,4882885392,4882885395,4882885398,4882885884,4882885887,4882885890,4882885893,4882885896,4882885899,4882885902,4882885905,4882885908,4882885911,4882885914,4882885917,4882886040,4882886043,4882886046,4882886049,4882886052,4882886055,4882886058,4882886601,4882886604,4882886607,4882886610,4882886613,4882886616,4882886619,4882886622,4882886625,4882886628,4882886631,4882886634,4882886637,4882886760,4882886763,4882886766,4882886769,4882886772,4882886775,4882886778,4882886781,4882886784,4882886787,4882886790,4882886793,4882886796,4882886799,4882886802,4882886805,4882886808,4882886811,4882886817,4882886820,4882886826,4882886832,4882886835,4882886838,4882886841,4882886844,4882886847,4882886850,4882886853,4882886856,4882886859,4882886862,4882886865,4882886868,4882886871,4882886874,4882886877,4882887000,4882887003,4882887006,4882887009,4882887012,4882887015,4882887018,4882887021,4882902207,4882902210,4882922124,4882922127,4882922130,4882922133,4882922136,4882922139,4882922142,4882922145,4882922148,4882922151,4882922154,4882922157,4882922280,4882922283,4882922286,4882922289,4882922292,4882922295,4882922298,4882922301,4882922304,4882922307,4882922310,4882922313,4882922316,4882922319,4882922322,4882922325,4882922328,4882922331,4882922334,4882922337,4882922340,4882922343,4882922346,4882922349,4882922352,4882922355,4882922358,4882922361,4882922364,4882922367,4882922370,4882922373,4882922376,4882922379,4882922382,4882922385,4882922388,4882922391,4882922394,4882922397,4882922520,4882922523,4882922526,4882922529,4882922532,4882922535,4882922538,4882922541,4882922544,4882922547,4882922550,4882922553,4882922556,4882922559,4882922562,4882922565,4882922568,4882922571,4882922574,4882922577,4882925673,4882925676,4882925679,4882925682,4882925685,4882925688,4882925691,4882925694,4882925697,4882925700,4882925703,4882925706,4882925709,4882925712,4882925715,4882925718,4882925721,4882925724,4882925727,4882925730,4882925733,4882925736,4882925739,4882925742,4882925745,4882925748,4882925751,4882925754,4882925757,4882925880,4882925883,4882925886,4882925889,4882925892,4882925895,4882925898,4882925901,4882925904,4882925907,4882925910,4882925913,4882925916,4882925919,4882925922,4882925925,4882925928,4882925931,4882925934,4882925937,4882925940,4882925943,4882925946,4882925949,4882925952,4882925955,4882925958,4882925961,4882925964,4882925967,4882925970,4882925973,4882925976,4882925979,4882925982,4882925985,4882925988,4882925991,4882925994,4882925997,4882926120,4882926369,4882926372,4882926375,4882926378,4882926381,4882926384,4882926387,4882926390,4882926393,4882926396,4882926399,4882926402,4882926405,4882926408,4882926411,4882926414,4882926417,4882926420,4882926423,4882926426,4882926429,4882926432,4882926435,4882926438,4882926441,4882926444,4882926447,4882926450,4882926453,4882926456,4882926459,4882926462,4882926465,4882926468,4882926471,4882926474,4882926477,4882926600,4882926603,4882926606,4882926609,4882926612,4882926615,4882926618,4882926621,4882926624,4882926627,4882926630,4882926633,4882926636,4882926639,4882926642,4882926645,4882926648,4882926651,4882926654,4882926657,4882926660,4882926663,4882926666,4882926669,4882926672,4882926675,4882926678,4882926681,4882926684,4882926687,4882926690,4882926693,4882926696,4882926699,4882926702,4882926705,4882926882,4882926885,4882926888,4882926891,4882926894,4882926897,4882926900,4882926903,4882926906,4882926909,4882926912,4882926915,4882926918,4882926921,4882926924,4882926927,4882926930,4882926933,4882927095,4882927098,4882927101,4882927104,4882927107,4882927110,4882927113,4882927116,4882927119,4882927122,4882927125,4882927128,4882927131,4882927134,4882927176,4882927179,4882927182,4882927185,4882927188,4882927191,4882927194,4882927197,4882927320,4882927323,4882927326,4882927329,4882927371,4882927374,4882927377,4882927380,4882927383,4882927386,4882927389,4882927392,4882927395,4882927398,4882927401,4882927404,4882927407,4882927425,4882927428,4882927431,4882927560,4882927563,4882927572,4882927587,4882927596,4882928283,4882928286,4882928289,4882928292,4882928295,4882928298,4882928301,4882928304,4882928307,4882928310,4882928313,4882928316,4882928319,4882928322,4882928325,4882928328,4882928331,4882928334,4882928337,4882928340,4882928343,4882928346,4882928349,4882928352,4882928355,4882928358,4882928361,4882928364,4882928367,4882928370,4882928373,4882928376,4882928379,4882928382,4882928385,4882928388,4882928391,4882928394,4882928397,4882928520,4882928523,4882928526,4882928529,4882928532,4882928535,4882928538,4882928541,4882928544,4882928547,4882928550,4882928553,4882928556,4882928559,4882928562,4882928565,4882928568,4882928571,4882928574,4882928577,4882928580,4882928583,4882928586,4882928589,4882928592,4882928595,4882928598,4882928601,4882928604,4882928607,4882928610,4882928613,4882928616,4882928619,4882928622,4882928625,4882928628,4882928631,4882928634,4882928637,4882928760,4882928763,4882928766,4882928769,4882928772,4882928775,4882928778,4882928781,4882928784,4882928787,4882928790,4882928793,4882928796,4882928799,4882928802,4882928805,4882928808,4882928811,4882928814,4882928817,4882928820,4882928823,4882928826,4882928829,4882928832,4882928835,4882928838,4882928841,4882928844,4882928847,4882928850,4882928853,4882928856,4882928859,4882928862,4882928865,4882929483,4882929486,4882929489,4882929492,4882929495,4882929498,4882929501,4882929504,4882929507,4882929510,4882929513,4882929516,4882929519,4882929522,4882929525,4882929528,4882929801,4882929804,4882929807,4882929813,4882929816,4882929819,4882929822,4882929825,4882929828,4882929831,4882929834,4882929837,4882929960,4882929963,4882929966,4882929969,4882929972,4882929975,4882929978,4882929981,4882929984,4882929987,4882929990,4882929993,4882929996,4882929999,4882930002,4882930005,4882930008,4882930011,4882930014,4882930017,4882930020,4882930023,4882930026,4882930029,4882930032,4882930035,4882930038,4882930041,4882930044,4882930047,4882930050,4882930053,4882930056,4882930059,4882930062,4882930065,4882930068,4882930071,4882930074,4882930077,4882930200,4882930203,4882930206,4882930209,4882930212,4882930215,4882930218,4882930221,4882930224,4882930227,4882930230,4882930233,4882930236,4882930239,4882930242,4882930245,4882930248,4882930476,4882930479,4882930482,4882930485,4882930488,4882930491,4882930494,4882930497,4882930500,4882930503,4882930506,4882930509,4882930512,4882930515,4882930518,4882930521,4882930524,4882930527,4882930530,4882930533,4882930536,4882930539,4882930542,4882930743,4882930746,4882930749,4882930752,4882930755,4882930758,4882930761,4882930764,4882930767,4882930770,4882930773,4882930776,4882930779,4882930782,4882930785,4882930788,4882930791,4882930794,4882930797,4882930920,4882930923,4882930926,4882930929,4882930932,4882930935,4882931019,4882931022,4882931025,4882931028,4882931031,4882931034,4882931037,4882931160,4882931163,4882931166,4882931169,4882931172,4882931175,4882931178,4882931181,4882931184,4882931187,4882931190,4882931193,4882931196,4882931199,4882931202,4882931205,4882931208,4882931211,4882931214,4882931217,4882931220,4882931271,4882931274,4882931277,4882931400,4882931403,4882931406,4882931409,4882931412,4882931415,4882931418,4882931421,4882931424,4882931427,4882931430,4882931433,4882931436,4882931439,4882931442,4882931445,4882931448,4882931451,4882931454,4882931457,4882931460,4882931463,4882931466,4882931469,4882931472,4882931475,4882931478,4882931481,4882931484,4882931487,4882931490,4882931493,4882931496,4882931499,4882932126,4882932129,4882932132,4882932135,4882932138,4882932141,4882932144,4882932147,4882932150,4882932153,4882932156,4882932159,4882932162,4882932165,4882932168,4882932171,4882932174,4882932177,4882932180,4882932183,4882932186,4882932189,4882932192,4882932195,4882932198,4882932201,4882932204,4882932207,4882932210,4882932213,4882932216,4882932219,4882932222,4882932225,4882932228,4882932231,4882932234,4882932237,4882932360,4882932363,4882932366,4882932369,4882932372,4882932375,4882932378,4882932381,4882932384,4882932387,4882932390,4882932393,4882932396,4882932399,4882932402,4882932405,4882932408,4882932411,4882932414,4882932417,4882932420,4882932423,4882932426,4882932429,4882932432,4882932435,4882932438,4882932441,4882932444,4882932447,4882932450,4882932453,4882932456,4882932459,4882932462,4882932465,4882932468,4882932471,4882932474,4882932477,4882932600,4882932603,4882932606,4882932609,4882932612,4882932615,4882932618,4882932621,4882932861,4882932864,4882932867,4882932870,4882932873,4882932876,4882932879,4882932882,4882932885,4882932888,4882932891,4882932894,4882932900,4882932903,4882932906,4882932909,4882932912,4882932915,4882932918,4882932921,4882932924,4882932927,4882932930,4882932933,4882932936,4882932939,4882932942,4882932945,4882932948,4882932951,4882932957,4882933080,4882933083,4882933086,4882933089,4882933092,4882933095,4882933098,4882933101,4882933104,4882933107,4882933110,4882933113,4882933116,4882933119,4882933122,4882933125,4882933128,4882933131,4882933134,4882933137,4882933140,4882933143,4882933146,4882933401,4882933404,4882933407,4882933410,4882933413,4882933416,4882933419,4882933422,4882933425,4882933428,4882933431,4882933434,4882933437,4882933560,4882933563,4882933566,4882933569,4882933572,4882933575,4882933578,4882933581,4882933584,4882933587,4882933590,4882933593,4882933596,4882933599,4882933602,4882933605,4882933608,4882933611,4882933614,4882933617,4882933620,4882933623,4882933626,4882933629,4882933632,4882933635,4882933638,4882933641,4882934061,4882934064,4882934067,4882934070,4882934073,4882934076,4882934079,4882934082,4882934085,4882934088,4882934091,4882934094,4882934097,4882934100,4882964589,4882964592,4882964595,4882964598,4882964604,4882964763,4882964766,4882964769,4882964772,4882964775,4882964778,4882964781,4882964784,4882964787,4882964811,4882964814,4882964817,4882964820,4882964823,4882964826,4882964829,4882964832,4882964835,4882964838,4882964841,4882964844,4882964847,4882964874,4882964877,4882965105,4882965108,4882965111,4882965114,4882965117,4882965240,4882965243,4882965246,4882965249,4882965252,4882965255,4882965258,4882965261,4882965264,4882965267,4882965312,4882965315,4882965318,4882965321,4882965324,4882965327,4882965330,4882965333,4882965336,4882965339,4882965342,4882965345,4882965348,4882965351,4882965354,4882965357,4882965480,4882965483,4882965528,4882966953,4882966956,4882966959,4882966962,4882966965,4882966968,4882966971,4882966974,4882966977,4882966980,4882966983,4882966986,4882966989,4882966992,4882966995,4882966998,4882967001,4882967004,4882967007,4882967010,4882967013,4882967016,4882967019,4882967022,4882967025,4882967028,4882967031,4882967034,4882967037,4882967160,4882967163,4882967166,4882967169,4882967172,4882967175,4882967178,4882967181,4882967184,4882967187,4882967190,4882967193,4882967196,4882967199,4882967202,4882967205,4882967208,4882967211,4882967214,4882967217,4882967220,4882967223,4882967226,4882967229,4882967232,4882967235,4882967238,4882967241,4882967244,4882967247,4882967250,4882967253,4882967256,4882967259,4882967262,4882967265,4882967268,4882967271,4882967274,4882967277,4882967400,4882967403,4882967406,4882967409,4882967412,4882967415,4882967421,4882967424,4882967427,4882967430,4882967433,4882967436,4882967439,4882967442,4882967445,4882967448,4882967451,4882967454,4882967457,4882967460,4882967463,4882967466,4882967469,4882967472,4882967475,4882967478,4882967481,4882967484,4882967487,4882967661,4882967664,4882967667,4882967670,4882967673,4882967676,4882967679,4882967682,4882967685,4882967688,4882967691,4882967694,4882967697,4882967700,4882967703,4882967997,4882968120,4882968123,4882968126,4882968129,4882968132,4882968135,4882968138,4882968141,4882968147,4882968150,4882968153,4882968156,4882968159,4882968162,4882968165,4882968168,4882968171,4882968174,4882968177,4882968180,4882968183,4882968186,4882968189,4882968192,4882968195,4882968198,4882968201,4882968204,4882968207,4882968210,4882968213,4882968216,4882968219,4882968222,4882968225,4882968228,4882968231,4882968234,4882968237,4882968360,4882968363,4882968366,4882968369,4882968372,4882968375,4882968378,4882968381,4882968384,4882968387,4882968390,4882968393,4882968396,4882968399,4882968402,4882968405,4882968408,4882968411,4882968414,4882968417,4882968420,4882968423,4882968426,4882968429,4882968432,4882968435,4882968438,4882968441,4882968447,4882968450,4882968453,4882968456,4882968459,4883373032,4883373041,4883373044,4883376446,4883376449,4883376452,4883376455,4883376458,4883376461,4883376464,4883376467,4883376470,4883377649,4883393201,4883393204,4883393207,4883393210,4883407436,4883407439,4883407562,4883407565,4883407568,4883407571,4883407574,4883407577,4883407580,4883407583,4883407586,4883407589,4883407592,4883407595,4883407598,4883407601,4883407604,4883407607,4883407610,4883429753,4883429756,4883429759,4883429882,4883429885,4883429888,4883429891,4883429894,4883429897,4883429900,4883429903,4883429906,4883429909,4883429912,4883437100,4883437103,4883437106,4883437109,4883437112,4883437115,4883437118,4883437121,4883437124,4883437157,4883437160,4883437163,4883437166,4883437169,4883437172,4883437178,4883437181,4883437184,4883437187,4883437325,4883437328,4883437331,4883437334,4883437337,4883437340,4883437343,4883437346,4883437349,4883437352,4883437355,4883437358,4883437361,4883437364,4883437367,4883437571,4883437574,4883437577,4883437580,4883437583,4883437586,4883437589,4883437592,4883437595,4883437598,4883437601,4883437604,4883437607,4883437610,4883439722,4883439725,4883439728,4883439731,4883439734,4883439737,4883439740,4883441690,4883441693,4883441696,4883441699,4883441705,4883441708,4883441711,4883441714,4883441717,4883441720,4883441723,4883441726,4883441729,4883441732,4883441735,4883441738,4883441741,4883441744,4883441747,4883441750,4883441753,4883441756,4883441759,4883441882,4883441885,4883441888,4883441891,4883441894,4883441897,4883441900,4883441903,4883441906,4883441909,4883441912,4883441915,4883441918,4883441921,4883441924,4883441927,4883441930,4883441933,4883441936,4883441939,4883441942,4883441945,4883441948,4883441951,4883441957,4883441960,4883441963,4883441966,4883441969,4883441972,4883441975,4883441978,4883441981,4883441984,4883441987,4883441990,4883441993,4883442380,4883442383,4883442386,4883442389,4883442392,4883442395,4883442398,4883442401,4883442404,4883442407,4883442410,4883442413,4883442416,4883442419,4883442422,4883442425,4883442428,4883442431,4883442434,4883442437,4883442440,4883442443,4883442446,4883442449,4883442452,4883442455,4883442458,4883442461,4883442464,4883442467,4883442470,4883442473,4883442476,4883442479,4883442683,4883442686,4883442689,4883442692,4883442695,4883442698,4883442701,4883442704,4883442707,4883442710,4883442713,4883442716,4883442719,4883442842,4883442845,4883442851,4883442854,4883442857,4883442860,4883442863,4883442866,4883442869,4883442872,4883442875,4883442878,4883442881,4883442884,4883442887,4883442890,4883442893,4883442896,4883442899,4883442902,4883442905,4883442908,4883442911,4883442914,4883442917,4883442920,4883442923,4883442926,4883442929,4883442932,4883443400,4883443403,4883443406,4883443409,4883443412,4883443415,4883443418,4883443421,4883443424,4883443427,4883443430,4883443433,4883443436,4883443439,4883443562,4883443565,4883443568,4883443571,4883443574,4883443577,4883443580,4883443583,4883443586,4883443589,4883443592,4883443595,4883443598,4883443601,4883443604,4883443607,4883443610,4883443613,4883443616,4883443619,4883443622,4883443625,4883443628,4883443631,4883443634,4883443637,4883443640,4883443643,4883443646,4883443649,4883443652,4883443655,4883443658,4883443661,4883443664,4883443667,4883443670,4883443673,4883443676,4883443883,4883444078,4883444081,4883444084,4883444087,4883444090,4883444093,4883444096,4883444099,4883444102,4883444105,4883444108,4883444111,4883444114,4883444117,4883444120,4883444375,4883444378,4883444381,4883444384,4883444387,4883444390,4883444393,4883444396,4883444399,4883444522,4883444525,4883444528,4883444531,4883444534,4883444537,4883444540,4883444543,4883444546,4883444549,4883444552,4883444555,4883444558,4883444561,4883444564,4883444567,4883444570,4883444573,4883444576,4883444579,4883444582,4883444585,4883444588,4883444591,4883444594,4883444597,4883444600,4883444603,4883444606,4883444609,4883444612,4883444615,4883444618,4883444621,4883444624,4883444627,4883445065,4883445068,4883445071,4883445074,4883445077,4883445080,4883445083,4883445086,4883445089,4883445092,4883445095,4883445098,4883445101,4883445104,4883445107,4883445110,4883445113,4883445116,4883445119,4883445242,4883445245,4883445248,4883445251,4883445254,4883445257,4883445260,4883445263,4883445266,4883445269,4883445272,4883445275,4883445278,4883445281,4883445284,4883445287,4883445290,4883445776,4883445779,4883445782,4883445785,4883445788,4883445791,4883445794,4883445797,4883445800,4883445803,4883445806,4883445809,4883445812,4883445815,4883445818,4883445821,4883445824,4883445827,4883445830,4883445833,4883445836,4883445839,4883445962,4883445965,4883445968,4883445971,4883445974,4883445977,4883445980,4883445983,4883445986,4883445989,4883445992,4883445995,4883446001,4883446004,4883446007,4883446010,4883446013,4883446016,4883446019,4883446022,4883446025,4883446028,4883446031,4883446034,4883446037,4883446040,4883446043,4883446046,4883446049,4883446052,4883446058,4883446061,4883446064,4883446067,4883446070,4883446073,4883446076,4883446079,4883446202,4883446205,4883446208,4883446211,4883446214,4883446217,4883446220,4883446223,4883446226,4883446229,4883446232,4883446235,4883446238,4883446241,4883446244,4883446247,4883446556,4883446559,4883446682,4883446685,4883446688,4883446691,4883446694,4883446697,4883446700,4883446703,4883446706,4883446709,4883446712,4883446715,4883446718,4883446721,4883446724,4883446727,4883446730,4883446733,4883446736,4883446739,4883446742,4883446745,4883446748,4883446751,4883446754,4883446757,4883446760,4883446763,4883446766,4883446769,4883446772,4883446775,4883446778,4883446781,4883446784,4883446787,4883446790,4883446793,4883446796,4883446799,4883446922,4883466434,4883466446,4883466449,4883466455,4883466458,4883466467,4883466479,4883466620,4883466626,4883466632,4883466635,4883466650,4883466653,4883466665,4883466668,4883466671,4883466674,4883466692,4883466695,4883466698,4883466710,4883466713,4883466845,4883466851,4883466860,4883466869,4883466878,4883466884,4883466899,4883468603,4883468606,4883468609,4883468612,4883468615,4883468618,4883468621,4883468624,4883468627,4883468630,4883468633,4883468636,4883468639,4883468762,4883468765,4883468768,4883468771,4883468774,4883468777,4883468780,4883468783,4883468786,4883468789,4883468792,4883468795,4883468798,4883468801,4883468804,4883468807,4883468810,4883468813,4883468816,4883468819,4883468822,4883468825,4883468828,4883468831,4883468834,4883468837,4883468840,4883468843,4883468846,4883468849,4883468852,4883468855,4883468858,4883468861,4883468864,4883468867,4883468870,4883468873,4883468876,4883468879,4883469002,4883469005,4883469008,4883469011,4883469014,4883469017,4883469020,4883469023,4883469026,4883469029,4883469032,4883469035,4883469038,4883469041,4883469044,4883469047,4883469050,4883469053,4883469056,4883469059,4883469062,4883469563,4883469566,4883469569,4883469572,4883469575,4883469578,4883469581,4883469584,4883469587,4883469590,4883469593,4883469596,4883469599,4883469722,4883469725,4883469728,4883469731,4883469734,4883469737,4883469740,4883469743,4883469746,4883469749,4883469752,4883469755,4883469758,4883469761,4883469764,4883469767,4883469770,4883469773,4883469776,4883469779,4883469782,4883469785,4883469788,4883469791,4883469794,4883469797,4883469800,4883469803,4883469806,4883469809,4883469812,4883469815,4883469818,4883469821,4883469824,4883469827,4883469830,4883469833,4883469836,4883469839,4883469962,4883469965,4883469968,4883470472,4883470475,4883470478,4883470481,4883470484,4883470487,4883470490,4883470493,4883470496,4883470499,4883470502,4883470505,4883470508,4883470511,4883470514,4883470517,4883470520,4883470523,4883470526,4883470529,4883470532,4883470985,4883470988,4883470991,4883470994,4883470997,4883471000,4883471003,4883471006,4883471009,4883471012,4883471015,4883471018,4883471021,4883471024,4883471027,4883471030,4883471033,4883471036,4883471039,4883471162,4883471165,4883471168,4883471174,4883471177,4883471180,4883471183,4883471186,4883471189,4883471192,4883471195,4883471198,4883471201,4883471204,4883471207,4883471210,4883471267,4883471270,4883471273,4883471276,4883471279,4883471402,4883471405,4883471408,4883471411,4883471414,4883471417,4883471420,4883471423,4883471426,4883471429,4883471432,4883471435,4883471438,4883471441,4883471444,4883471447,4883471450,4883471453,4883471456,4883471459,4883471462,4883471465,4883471468,4883471471,4883471474,4883471477,4883471480,4883471483,4883471486,4883471489,4883471753,4883471756,4883471759,4883471882,4883471885,4883471888,4883471891,4883471894,4883471897,4883471900,4883471903,4883471906,4883471909,4883471912,4883471915,4883471918,4883471921,4883471924,4883471927,4883471930,4883471933,4883471936,4883471939,4883471942,4883471945,4883471948,4883471951,4883471954,4883471957,4883471960,4883471963,4883471966,4883471969,4883471972,4883471975,4883471978,4883472632,4883472635,4883472638,4883472641,4883472644,4883472647,4883472650,4883472653,4883472656,4883472659,4883472662,4883472665,4883472668,4883472671,4883472674,4883472677,4883472680,4883472872,4883472875,4883472878,4883472881,4883472884,4883472887,4883472890,4883472893,4883472896,4883472899,4883472902,4883472905,4883472908,4883472911,4883472914,4883472917,4883472920,4883472923,4883472926,4883472929,4883473157,4883473160,4883473163,4883473166,4883473169,4883473172,4883473175,4883473178,4883473181,4883473184,4883473187,4883473190,4883473193,4883473196,4883473199,4883473322,4883473325,4883473328,4883473331,4883473334,4883473337,4883473340,4883473343,4883473346,4883473349,4883473352,4883473355,4883473358,4883473361,4883473364,4883473367,4883473370,4883473373,4883473376,4883473379,4883473382,4883473385,4883473388,4883473391,4883473394,4883473397,4883473400,4883473646,4883473649,4883473652,4883473655,4883473658,4883473661,4883473664,4883473667,4883473670,4883473673,4883473676,4883473679,4883473802,4883473805,4883473808,4883473811,4883473814,4883473817,4883473820,4883473823,4883473826,4883473829,4883473832,4883473835,4883473838,4883473841,4883473844,4883473847,4883473850,4883473853,4883473856,4883473859,4883473862,4883473865,4883473868,4883473871,4883473874,4883473877,4883473880,4883473883,4883473886,4883473889,4883473892,4883473895,4883473898,4883473901,4883473904,4883473907,4883473910,4883473913,4883473916,4883473919,4883474042,4883474045,4883474048,4883474051,4883474054,4883474057,4883474060,4883474063,4883474066,4883474069,4883474072,4883474075,4883474078,4883474081,4883474084,4883474087,4883474090,4883474093,4883474096,4883474099,4883474102,4883474876,4883474879,4883475002,4883475005,4883475008,4883475011,4883475014,4883475017,4883475020,4883475023,4883475026,4883475029,4883475032,4883475035,4883475038,4883475041,4883475044,4883475047,4883475050,4883475053,4883475056,4883475059,4883475062,4883475065,4883475068,4883475071,4883475074,4883475077,4883475080,4883475281,4883475284,4883475287,4883475290,4883475293,4883475296,4883475299,4883475302,4883475305,4883475308,4883475311,4883475314,4883475317,4883475320,4883475323,4883475326,4883475329,4883475332,4883475335,4883475338,4883475341,4883475344,4883475347,4883475350,4883475353,4883475356,4883475359,4883475482,4883475485,4883475488,4883475491,4883475494,4883475497,4883475500,4883475503,4883475506,4883475509,4883475512,4883475515,4883475518,4883475521,4883475524,4883475527,4883475530,4883475533,4883475536,4883475539,4883475542,4883475545,4883475548,4883475551,4883475554,4883475557,4883475560,4883475563,4883475566,4883475569,4883475572,4883475575,4883475578,4883475581,4883475584,4883475587,4883475590,4883475593,4883475596,4883475599,4883475722,4883475725,4883475728,4883475731,4883475734,4883475737,4883475743,4883475746,4883475749,4883475752,4883475755,4883475758,4883475761,4883475764,4883475767,4883475770,4883475773,4883475776,4883475779,4883475782,4883475785,4883475788,4883475791,4883475794,4883475797,4883475800,4883475803,4883475806,4883475809,4883475812,4883475815,4883475818,4883475821,4883475824,4883475827,4883475830,4883475833,4883475836,4883475839,4883475962,4883475965,4883475968,4883475971,4883475974,4883475977,4883475980,4883475983,4883475986,4883475989,4883475992,4883475995,4883475998,4883476001,4883476004,4883476007,4883476010,4883476013,4883476016,4883476019,4883476022,4883476025,4883476028,4883476031,4883476034,4883476037,4883476040,4883476043,4883476046,4883476049,4883476052,4883476055,4883476058,4883476061,4883476064,4883476067,4883476070,4883476073,4883476076,4883476079,4883476202,4883476205,4883476283,4883476286,4883476289,4883476292,4883476295,4883476298,4883476301,4883476304,4883476307,4883476310,4883476313,4883476316,4883476319,4883476442,4883476445,4883476448,4883476451,4883476454,4883476457,4883476460,4883476463,4883476466,4883476469,4883476472,4883476475,4883476478,4883476481,4883476484,4883476487,4883476490,4883476493,4883476496,4883476499,4883476502,4883476505,4883476508,4883477039,4883477162,4883477165,4883477168,4883477171,4883477174,4883477177,4883477180,4883477183,4883477186,4883477189,4883477192,4883477195,4883477198,4883477204,4883477207,4883477210,4883477213,4883477216,4883477219,4883477222,4883477225,4883477228,4883477231,4883477234,4883477237,4883477240,4883477243,4883477246,4883477249,4883477252,4883477255,4883477258,4883477261,4883477264,4883477267,4883477270,4883477273,4883477276,4883477279,4883477402,4883477405,4883477408,4883477411,4883477414,4883477417,4883477420,4883477423,4883477426,4883477429,4883477432,4883477435,4883477438,4883477441,4883477444,4883477447,4883477450,4883477453,4883477456,4883477459,4883477462,4883477465,4883477468,4883477471,4883477474,4883477477,4883477480,4883477675,4883477678,4883477681,4883477684,4883477687,4883477690,4883477693,4883477696,4883477699,4883477702,4883477705,4883477708,4883477711,4883477714,4883477717,4883477720,4883477723,4883477726,4883477729,4883477732,4883477735,4883477738,4883477741,4883477744,4883477747,4883477750,4883477753,4883477756,4883477759,4883477882,4883477885,4883477888,4883477891,4883477894,4883477897,4883477900,4883477903,4883477906,4883477909,4883477912,4883477915,4883477918,4883477921,4883477924,4883477927,4883477930,4883477933,4883477936,4883477939,4883477942,4883477945,4883477948,4883477951,4883477954,4883477957,4883477960,4883477963,4883477966,4883477969,4883477972,4883477975,4883477978,4883477981,4883477984,4883477987,4883477990,4883477993,4883477996,4883477999,4883478122,4883478125,4883478128,4883478131,4883478134,4883478137,4883478140,4883478146,4883478149,4883478152,4883478155,4883478158,4883478161,4883478164,4883478167,4883478170,4883478173,4883478176,4883478179,4883478182,4883478185,4883478188,4883478191,4883478194,4883478197,4883478200,4883478203,4883478206,4883478209,4883478212,4883478215,4883478218,4883478221,4883478224,4883478227,4883478230,4883478233,4883478236,4883478239,4883478362,4883478365,4883478368,4883478371,4883478374,4883478377,4883478380,4883478383,4883478386,4883478389,4883478392,4883478395,4883478398,4883478401,4883478404,4883478407,4883478410,4883479613,4883479616,4883479619,4883479622,4883479625,4883479628,4883479631,4883479634,4883479637,4883479640,4883479643,4883479646,4883479649,4883479652,4883479655,4883479658,4883479661,4883479664,4883479667,4883480315,4883480318,4883480321,4883480324,4883480327,4883480330,4883480333,4883480336,4883480339,4883480342,4883480345,4883480348,4883480351,4883480354,4883480357,4883480360,4883480363,4883480366,4883480369,4883480372,4883480375,4883480378,4883480381,4883480384,4883480387,4883480390,4883480393,4883480396,4883480399,4883480522,4883480525,4883480528,4883480531,4883480534,4883480537,4883480540,4883480543,4883480546,4883480549,4883480552,4883480555,4883480558,4883480561,4883480564,4883480567,4883480570,4883480573,4883480576,4883480579,4883480582,4883480585,4883480588,4883480591,4883480594,4883480597,4883480600,4883480603,4883480606,4883481083,4883481086,4883481089,4883481092,4883481095,4883481098,4883481101,4883481104,4883481107,4883481110,4883481113,4883481116,4883481119,4883481242,4883481245,4883481248,4883481251,4883481254,4883481257,4883481263,4883481266,4883481269,4883481272,4883481275,4883481278,4883481281,4883481284,4883481287,4883481290,4883481293,4883481296,4883481299,4883481302,4883481305,4883481308,4883481311,4883481314,4883481317,4883481320,4883481323,4883481326,4883481329,4883481332,4883481335,4883481338,4883481341,4883481344,4883481347,4883481350,4883481353,4883481356,4883481359,4883481482,4883481485,4883481488,4883481491,4883481497,4883481500,4883481503,4883481506,4883481509,4883481512,4883481515,4883481518,4883481521,4883481524,4883493257,4883493260,4883512691,4883512694,4883512697,4883512700,4883512712,4883512715,4883512718,4883512721,4883512724,4883512727,4883512742,4883512745,4883512748,4883512751,4883512754,4883512757,4883512760,4883512781,4883512784,4883512787,4883512790,4883512793,4883514932,4883514935,4883514938,4883514941,4883514944,4883514947,4883514950,4883515136,4883515139,4883515142,4883515157,4883515160,4883515163,4883515166,4883515181,4883515184,4883515187,4883515190,4883515325,4883515328,4883515331,4883515343,4883515346,4883515349,4883515352,4883515355,4883515358,4883515361,4883515364,4883515367,4883515370,4883515373,4883515376,4883515379,4883515382,4883515385,4883515388,4883515391,4883515394,4883515397,4883515400,4883515403,4883515406,4883515409,4883515412,4883515415,4883515418,4883515421,4883515880,4883515883,4883515886,4883515889,4883515892,4883515895,4883515898,4883515901,4883515904,4883515907,4883515910,4883515913,4883515916,4883515919,4883516042,4883516045,4883516048,4883516051,4883516054,4883516057,4883516060,4883516063,4883516066,4883516069,4883516072,4883516075,4883516078,4883516081,4883516084,4883516087,4883516090,4883516093,4883516096,4883516099,4883516102,4883516105,4883516108,4883516111,4883516114,4883516117,4883516120,4883516123,4883516126,4883516129,4883516132,4883516135,4883516138,4883516141,4883516144,4883516147,4883516150,4883516315,4883516318,4883516321,4883516324,4883516327,4883516330,4883516333,4883516336,4883516339,4883516342,4883516345,4883516348,4883516351,4883516354,4883516357,4883516360,4883516363,4883516366,4883516369,4883516372,4883516375,4883516378,4883516384,4883516387,4883516390,4883516393,4883516396,4883516399,4883516522,4883516525,4883516528,4883516531,4883516534,4883516537,4883516540,4883516543,4883516546,4883516549,4883516552,4883516555,4883516558,4883516561,4883516564,4883516567,4883516570,4883516573,4883516576,4883516579,4883516582,4883516585,4883516588,4883516591,4883516594,4883516597,4883516600,4883516603,4883516606,4883516609,4883516612,4883516615,4883516618,4883516621,4883516624,4883516627,4883516630,4883516633,4883516636,4883516639,4883516762,4883516765,4883517086,4883517089,4883517092,4883517095,4883517098,4883517119,4883517242,4883517245,4883517248,4883517251,4883517254,4883517266,4883517269,4883517272,4883517275,4883517299,4883517302,4883517305,4883517308,4883517311,4883517326,4883517329,4883517332,4883517350,4883519273,4883519276,4883519279,4883519402,4883519405,4883519408,4883519411,4883519414,4883519417,4883519420,4883519423,4883519426,4883519429,4883519432,4883519435,4883519438,4883519441,4883519444,4883519447,4883519450,4883519453,4883519459,4883519462,4883519465,4883519468,4883519471,4883519474,4883519477,4883519480,4883519483,4883519486,4883519489,4883519492,4883519495,4883519498,4883519501,4883519504,4883519507,4883519510,4883519513,4883519516,4883519519,4883519642,4883519645,4883519648,4883519651,4883519654,4883519657,4883519660,4883519663,4883519666,4883519669,4883519672,4883519885,4883519888,4883519891,4883519894,4883519897,4883519900,4883519903,4883519906,4883519909,4883519912,4883519915,4883519918,4883519921,4883519924,4883519927,4883519930,4883519933,4883519936,4883519939,4883519942,4883519945,4883519948,4883519951,4883519954,4883520470,4883520473,4883520476,4883520479,4883520602,4883520605,4883520608,4883520611,4883520614,4883520617,4883520620,4883520623,4883520626,4883520629,4883520632,4883520635,4883520638,4883520641,4883520644,4883520647,4883520650,4883520653,4883520656,4883520659,4883520662,4883520665,4883520668,4883520671,4883520674,4883520677,4883520680,4883520683,4883520686,4883520689,4883520692,4883520695,4883520698,4883520701,4883520704,4883520707,4883520710,4883520713,4883520716,4883520719,4883520842,4883520848,4883520851,4883520854,4883520857,4883520860,4883520866,4883520869,4883520872,4883520875,4883520878,4883520881,4883520884,4883520887,4883520890,4883520893,4883520896,4883520899,4883520902,4883520905,4883520908,4883520911,4883520914,4883520917,4883520920,4883520923,4883521343,4883521346,4883521349,4883521352,4883521355,4883521358,4883521361,4883521364,4883521367,4883521370,4883521373,4883521376,4883521379,4883521382,4883521385,4883521388,4883521391,4883521394,4883521397,4883521400,4883521403,4883521406,4883521409,4883521412,4883521415,4883521418,4883521421,4883521424,4883521427,4883521430,4883521433,4883521436,4883521439,4883521562,4883521565,4883521568,4883521571,4883521574,4883521577,4883521580,4883521583,4883521586,4883521589,4883521883,4883521886,4883521889,4883521892,4883521895,4883521898,4883521901,4883521904,4883521907,4883521910,4883521913,4883521916,4883521919,4883522042,4883522543,4883522546,4883522549,4883522552,4883522555,4883522612,4883522615,4883522618,4883522621,4883522624,4883522627,4883522630,4883522633,4883522636,4883522639,4883522762,4883522765,4883522768,4883522771,4883522774,4883522843,4883522846,4883522849,4883522852,4883522855,4883522858,4883522861,4883522864,4883522867,4883522870,4883522873,4883522876,4883522879,4883523002,4883523005,4883523008,4883523011,4883523014,4883523017,4883523020,4883523560,4883523563,4883523566,4883523569,4883523572,4883523575,4883523578,4883523581,4883523584,4883523587,4883523590,4883523593,4883523596,4883523599,4883523722,4883523725,4883523728,4883523731,4883523734,4883523737,4883523740,4883524016,4883524019,4883524022,4883524025,4883524028,4883524031,4883524034,4883524037,4883524040,4883524043,4883524046,4883524049,4883524052,4883524055,4883524058,4883524061,4883524064,4883524067,4883524070,4883524073,4883524076,4883524079,4883524202,4883524205,4883524208,4883524211,4883524214,4883524217,4883524220,4883524223,4883524226,4883524229,4883524232,4883524235,4883524238,4883524241,4883524244,4883524247,4883524250,4883524253,4883524256,4883524259,4883524262,4883524265,4883524268,4883524271,4883524274,4883524277,4883524280,4883524283,4883524286,4883524289,4883524292,4883524295,4883524298,4883524301,4883524304,4883524307,4883524310,4883524313,4883524316,4883524319,4883524442,4883524445,4883524448,4883524451,4883524454,4883524457,4883524460,4883524463,4883524466,4883524469,4883524472,4883524475,4883524478,4883524481,4883524484,4883524487,4883524490,4883524493,4883524496,4883524499,4883525009,4883525012,4883525015,4883525018,4883525021,4883525024,4883525027,4883525030,4883525033,4883525036,4883525039,4883525162,4883525165,4883525168,4883525171,4883525174,4883525177,4883525183,4883525186,4883525189,4883525192,4883525195,4883525198,4883525201,4883525204,4883525207,4883525210,4883525225,4883525228,4883525231,4883525234,4883525237,4883525240,4883525243,4883525246,4883525249,4883525252,4883525255,4883525258,4883525261,4883525264,4883525267,4883525270,4883525273,4883525276,4883525279,4883525402,4883525405,4883525408,4883525411,4883525414,4883525474,4883525477,4883525480,4883525483,4883525486,4883525489,4883525492,4883525495,4883525498,4883525501,4883525504,4883525507,4883525510,4883525513,4883525516,4883525519,4883525642,4883525648,4883525651,4883525654,4883525657,4883525660,4883525663,4883525666,4883525669,4883525672,4883525675,4883525678,4883525681,4883525909,4883525912,4883525915,4883525918,4883525921,4883525924,4883525927,4883525930,4883525933,4883525936,4883525939,4883525942,4883525945,4883525948,4883525951,4883525954,4883525957,4883525960,4883525963,4883525966,4883525969,4883525972,4883525975,4883525978,4883525981,4883525984,4883525987,4883525990,4883525993,4883525996,4883525999,4883526122,4883526125,4883526128,4883526131,4883526134,4883526137,4883526140,4883526143,4883526146,4883526149,4883526152,4883526155,4883526158,4883526161,4883526164,4883526167,4883526170,4883526173,4883526176,4883526179,4883526182,4883526185,4883526188,4883526191,4883526194,4883526197,4883526200,4883526203,4883526206,4883526209,4883526212,4883526215,4883526218,4883526221,4883526224,4883526227,4883526230,4883526233,4883526236,4883526239,4883526362,4883526365,4883526368,4883526371,4883526449,4883526452,4883526455,4883526458,4883526461,4883526464,4883526467,4883526470,4883526473,4883526476,4883526479,4883526602,4883526605,4883526608,4883526677,4883526680,4883526683,4883526686,4883526689,4883526692,4883526695,4883526698,4883526701,4883526704,4883526707,4883526710,4883526713,4883526905,4883526908,4883526911,4883526914,4883526917,4883526920,4883526923,4883526926,4883526929,4883526932,4883526935,4883526938,4883526941,4883526944,4883526947,4883526950,4883527376,4883527379,4883527382,4883527385,4883527388,4883527391,4883527394,4883527397,4883527400,4883527403,4883527406,4883527409,4883527412,4883527415,4883527418,4883527421,4883527424,4883527427,4883527430,4883527433,4883527436,4883527439,4883527562,4883527565,4883527568,4883527571,4883527574,4883527577,4883527580,4883527583,4883527586,4883527589,4883527592,4883527595,4883527598,4883527601,4883527604,4883527607,4883527610,4883527673,4883527676,4883527679,4883527802,4883527805,4883527808,4883527811,4883527814,4883527817,4883527820,4883527823,4883527826,4883527829,4883527832,4883527835,4883527838,4883527841,4883527844,4883527847,4883527850,4883527853,4883527856,4883527859,4883527862,4883527865,4883527868,4883527871,4883527874,4883527877,4883527880,4883527883,4883527886,4883527889,4883527892,4883527895,4883527898,4883527901,4883527904,4883527907,4883527910,4883527913,4883527916,4883527919,4883528042,4883528045,4883528048,4883528051,4883528054,4883528057,4883528060,4883528063,4883528066,4883528069,4883528072,4883528075,4883528078,4883528081,4883528084,4883528087,4883528090,4883528093,4883528096,4883528099,4883528102,4883528105,4883528108,4883528111,4883528114,4883528117,4883528120,4883528123,4883528126,4883528153,4883528156,4883528159,4883528282,4883528285,4883528288,4883528291,4883528294,4883528297,4883528300,4883528303,4883528306,4883528309,4883528312,4883528315,4883528318,4883528321,4883528324,4883528327,4883528330,4883528333,4883528336,4883528339,4883528342,4883528345,4883528348,4883528351,4883528354,4883528357,4883528360,4883528363,4883528366,4883528369,4883528372,4883528375,4883528378,4883528381,4883528384,4883528387,4883528390,4883528393,4883528396,4883528399,4883528522,4883528525,4883528528,4883528531,4883528534,4883554553,4883554556,4883554559,4883554685,4883554688,4883554691,4883554694,4883554697,4883554700,4883554703,4883554706,4883554709,4883554712,4883554715,4883554718,4883554721,4883554724,4883554727,4883554730,4883554733,4883554736,4883554739,4883554742,4883554745,4883554748,4883554751,4883554754,4883554757,4883554760,4883554763,4883554766,4883554769,4883554772,4883554775,4883554778,4883554781,4883554784,4883554787,4883554790,4883554793,4883554796,4883554799,4883554922,4883554925,4883554928,4883554931,4883554934,4883554937,4883554940,4883554943,4883554946,4883554949,4883554952,4883556665,4883556668,4883556671,4883556674,4883556677,4883556680,4883556683,4883556686,4883556689,4883556692,4883556695,4883556698,4883556701,4883556704,4883556707,4883556710,4883556713,4883556716,4883556719,4883556842,4883556845,4883556848,4883556851,4883556854,4883556857,4883556860,4883556863,4883556866,4883556869,4883556872,4883556875,4883556878,4883556881,4883556884,4883556887,4883556890,4883556893,4883556896,4883556899,4883556902,4883556905,4883556908,4883556911,4883556914,4883556917,4883556920,4883556923,4883556926,4883556929,4883556932,4883556935,4883556938,4883556941,4883556944,4883556947,4883556950,4888552465,4889122311,4894471199,4898516140,4899249557,4900192015,4912804216,4916486820,4929547357,4943256604,4946431802,4946452963,4948313020,4949099173,4950293263,4950293266,4950293269,4950293272,4950293275,4950293278,4950294409,4950294412,4950294415,4950294418,4950294421,4950294424,4950294427,4950300630,4950300633,4950300636,4950300639,4950300642,4950300645,4950300648,4950311413,4950311416,4950311419,4950311422,4950311425,4950311428,4950311431,4950311881,4950311884,4950311887,4950311890,4950311893,4950311896,4950311902,4950311905,4950311908,4950311911,4950311914,4950311917,4950311920,4950311923,4950311926,4950311932,4950311935,4950311938,4950311941,4950311944,4950311947,4950311950,4950312133,4950312136,4950312139,4950312142,4950312145,4950312148,4950312151,4950312154,4950312157,4950312160,4950312163,4950312166,4950312169,4950312172,4950312175,4950312178,4950312370,4950312373,4950312376,4950312379,4950312382,4950312385,4950312388,4950312391,4950312394,4950312397,4950312400,4950312403,4950312406,4950312409,4950312412,4950312466,4950312469,4950312472,4950312478,4950312601,4950312604,4950312607,4950312610,4950312628,4950312631,4950312634,4950312637,4950312640,4950312643,4950312646,4950312649,4950312652,4950312655,4950312658,4950312661,4950312664,4950312667,4950312670,4950312673,4950312676,4950312679,4950312682,4950312685,4950312886,4950312889,4950312892,4950312895,4950312898,4950312901,4950312904,4950312907,4950312910,4950312913,4950312916,4950312919,4950312922,4950312925,4950312928,4950312931,4950312934,4950312937,4950312940,4950312943,4950312946,4950313153,4950313156,4950313159,4950313162,4950313165,4950313168,4950313636,4950313639,4950313642,4950313645,4950313648,4950313651,4950313654,4950313657,4950313660,4950313663,4950313666,4950313669,4950313672,4950313675,4950313678,4950313801,4950313804,4950313807,4950313810,4950313813,4950313816,4950313819,4950313822,4950313825,4950313828,4950313900,4950313903,4950313906,4950313909,4950313912,4950313915,4950313918,4950314041,4950314044,4950314047,4950314050,4950314053,4950314056,4950314059,4950314062,4950314065,4950314128,4950314131,4950314134,4950314137,4950314140,4950314143,4950314146,4950314149,4950314152,4950314155,4950314158,4950314281,4950314284,4950314287,4950314290,4950314293,4950314296,4950314299,4950314302,4950314305,4950314308,4950314311,4950314314,4950314317,4950314320,4950314323,4950314326,4950314329,4950314332,4950314335,4950314338,4950314341,4950314344,4950314347,4950314350,4950314353,4950314356,4950314359,4950314362,4950314365,4950314368,4950314371,4950314374,4950314377,4950314380,4950314383,4950314386,4950314389,4950314392,4950314395,4950314398,4950314521,4950314524,4950314527,4950314530,4950314533,4950314536,4950314539,4950314542,4950314545,4950314548,4950314551,4950314554,4950314557,4950314560,4950322521,4950322524,4950322527,4950322530,4950322533,4950322536,4950322539,4950322542,4950322545,4950322548,4950322551,4950322554,4950322557,4950322680,4950322683,4950322686,4950322689,4950322692,4950322695,4950322698,4950322701,4950322704,4950322707,4950322710,4950322713,4950322716,4950322719,4950322722,4950322725,4950322728,4950322731,4950322734,4950322737,4950322740,4950322743,4950322746,4950322749,4950322752,4950322755,4950322758,4950322761,4950322764,4950322767,4950322770,4950322773,4950322776,4950322779,4950322782,4950322785,4950322944,4950322947,4950322950,4950322953,4950322956,4950322959,4950322962,4950322965,4950322971,4950322974,4950322977,4950322980,4950322983,4950322986,4950322989,4950322992,4950323163,4950323166,4950323169,4950323172,4950323175,4950323178,4950323181,4950323184,4950323187,4950323190,4950323193,4950323196,4950323199,4950323202,4950323208,4950323211,4950323277,4950323400,4950323403,4950323406,4950323409,4950323412,4950323415,4950323418,4950323421,4950323424,4950323427,4950323430,4950323433,4950323436,4950323439,4950323442,4950323445,4950323481,4950323484,4950323487,4950323490,4950323496,4950323499,4950323502,4950323505,4950323508,4950323511,4950323514,4950323517,4950323640,4950323643,4950323646,4950323649,4950323652,4950323655,4950323658,4950323661,4950323664,4950323667,4950323670,4950323673,4950323919,4950323922,4950323925,4950323928,4950323931,4950323934,4950323937,4950323940,4950323943,4950323946,4950323949,4950323952,4950323955,4950323958,4950323961,4950323964,4950323967,4950323973,4950323976,4950323979,4950323982,4950323985,4950323988,4950324141,4950324144,4950324147,4950324150,4950324153,4950324156,4950324159,4950324162,4950324165,4950324168,4950324171,4950324174,4950324180,4950324183,4950324186,4950324189,4950324192,4950324195,4950324198,4950324201,4950324204,4950324207,4950324210,4950324213,4950324216,4950324219,4950324222,4950324225,4950324228,4950324231,4950324234,4950324237,4950324360,4950324363,4950324366,4950324369,4950324372,4950324375,4950324378,4950324381,4950324384,4950324387,4950324390,4950324393,4950324396,4950324399,4950324693,4950324696,4950324699,4950324702,4950324705,4950324708,4950324711,4950324714,4950324717,4950324840,4950324843,4950324846,4950324849,4950324852,4950324855,4950324858,4950324861,4950324864,4950324867,4950324870,4950324873,4950324876,4950324879,4950324882,4950325092,4950325095,4950325098,4950325101,4950325104,4950325107,4950325110,4950325113,4950325116,4950325119,4950325122,4950325125,4950325128,4950325131,4950325134,4950325137,4950325140,4950325143,4950325146,4950325149,4950325152,4950325155,4950325158,4950325161,4950325602,4950325605,4950325608,4950325611,4950325614,4950325617,4950325620,4950325623,4950325626,4950325629,4950325632,4950325635,4950325638,4950325641,4950325644,4950325647,4950325650,4950325653,4950325656,4950325659,4950325662,4950325665,4950325668,4950325671,4950325674,4950325677,4950325800,4950325803,4950325806,4950325809,4950325812,4950325815,4950325818,4950325821,4950325824,4950325827,4950325830,4950325833,4950325839,4950325842,4950325845,4950325848,4950325851,4950325854,4950325857,4950325860,4950325863,4950325866,4950325869,4950325872,4950325875,4950325878,4950325881,4950325884,4950325887,4950325890,4950325893,4950325896,4950325899,4950325902,4950326319,4950326322,4950326325,4950326328,4950326331,4950326334,4950326337,4950326340,4950326343,4950326346,4950326349,4950326352,4950326355,4950326358,4950326361,4950326364,4950326367,4950326370,4950326373,4950326376,4950326379,4950326382,4950326385,4950326388,4950326391,4950326394,4950326397,4950326520,4950326523,4950326526,4950326529,4950326532,4950326535,4950326538,4950326541,4950326544,4950326547,4950326550,4950326553,4950326556,4950326559,4950326562,4950326565,4950326568,4950326571,4950326574,4950326577,4950326580,4950326583,4950326586,4950326589,4950326592,4950326595,4950326598,4950457828,4950457831,4950457834,4950457837,4950457840,4950457843,4950457855,4950457858,4950457861,4950457864,4950457867,4950457870,4950457873,4950472213,4950472216,4950472219,4950472222,4950472225,4950472228,4950472231,4950472234,4950472237,4950472240,4950472243,4950472246,4950472249,4950472252,4950472441,4950472444,4950472447,4950472450,4950472453,4950472456,4950472459,4950472462,4950472465,4950472468,4950472474,4950472477,4950472480,4950472483,4950472528,4950472531,4950472534,4950472537,4950472540,4950472543,4950472546,4950472549,4950472552,4950472555,4950472558,4950472681,4950472684,4950472687,4950472690,4950472693,4950472696,4950472702,4950472783,4950472786,4950472789,4950472792,4950472795,4950472798,4950472921,4950472924,4950472927,4950472930,4950472933,4950472936,4950472939,4950472942,4950472945,4950472948,4950472951,4950472954,4950472957,4950472960,4950472963,4950472966,4950472972,4950472975,4950472978,4950472981,4950472984,4950472987,4950472990,4950472993,4950472996,4950472999,4950473002,4950473005,4950473008,4950473011,4950473014,4950473017,4950473020,4950473023,4950473026,4950473656,4950473659,4950473662,4950473665,4950473668,4950473671,4950473674,4950473677,4950473680,4950473947,4950473950,4950473953,4950473956,4950473959,4950473962,4950473968,4950473971,4950473974,4950473977,4950473980,4950473983,4950473986,4950473989,4950473992,4950473995,4950473998,4950474121,4950474124,4950474127,4950474130,4950474133,4950474136,4950474139,4950474142,4950474145,4950474148,4950474151,4950474154,4950474157,4950474160,4950474163,4950474166,4950474169,4950474172,4950474175,4950474178,4950475624,4950475627,4950475630,4950475633,4950475636,4950475639,4950475642,4950475645,4950475648,4950475651,4950475654,4950475657,4950475660,4950475663,4950475666,4950475669,4950475672,4950475675,4950476347,4950476350,4950476353,4950476356,4950476359,4950476362,4950476365,4950476368,4950476371,4950476374,4950476377,4950476380,4950476383,4950476386,4950476389,4950476392,4950476395,4950476398,4950476521,4950476524,4950476527,4950476530,4950476533,4950476536,4950476539,4950476542,4950476545,4950476548,4950476551,4950476554,4950476557,4950476560,4950476563,4950476566,4950476569,4950476572,4950476575,4950476578,4950476581,4950476584,4950476824,4950476827,4950476830,4950476833,4950476836,4950476839,4950476842,4950476845,4950476848,4950476851,4950476854,4950476857,4950476860,4950476863,4950476866,4950476869,4950476872,4950476875,4950476878,4950477001,4950477004,4950477007,4950477010,4950477013,4950477016,4950477019,4950477022,4950477025,4950477028,4950477031,4950477034,4950477037,4950477040,4950477043,4950477046,4950477049,4950477052,4950477055,4950477058,4950477061,4950477250,4950477253,4950477256,4950477259,4950477262,4950477265,4950477271,4950477274,4950477277,4950477283,4950477286,4950477289,4950477292,4950477295,4950477580,4950477583,4950477586,4950477589,4950477592,4950477595,4950477598,4950477721,4950477724,4950477727,4950477730,4950477733,4950477736,4950477739,4950477742,4950477745,4950477748,4950477751,4950477754,4950477757,4950477760,4950477763,4950477766,4950477769,4950477772,4950477775,4950477778,4950477781,4950477784,4950477787,4950477790,4950477793,4950477796,4950477799,4950477802,4950477805,4950477808,4950477811,4950477814,4950477817,4950477820,4950478702,4950478705,4950478708,4950478711,4950478714,4950478717,4950478720,4950478723,4950478726,4950478732,4950478735,4950478738,4950478741,4950478744,4950478747,4950478750,4950478753,4950478756,4950478759,4950478762,4950478765,4950478768,4950478771,4950478774,4950478777,4950478780,4950478783,4950478786,4950478789,4950478792,4950478795,4950478921,4950478924,4950478927,4950478930,4950478933,4950478936,4950488520,4950488523,4950488526,4950488529,4950488532,4950488535,4950488538,4950488541,4950488544,4950488547,4950488550,4950488553,4950488556,4950488559,4950488562,4950488565,4950488568,4950488571,4950488574,4950488577,4950488580,4950488583,4950488586,4950488793,4950488796,4950488799,4950488802,4950488805,4950488808,4950488811,4950488814,4950488817,4950488820,4950488823,4950488826,4950488829,4950488832,4950488835,4950488838,4950488841,4950488844,4950488847,4950488850,4950489291,4950489294,4950489297,4950489300,4950489303,4950489306,4950489309,4950489312,4950489315,4950489318,4950489321,4950489324,4950489327,4950489330,4950489333,4950489336,4950489339,4950489342,4950489345,4950489348,4950489351,4950489354,4950489357,4950489480,4950489483,4950489486,4950489489,4950489492,4950489495,4950489498,4950489501,4950489504,4950489507,4950489510,4950489513,4950489516,4950489519,4950489522,4950489525,4950489528,4950489531,4950489534,4950489537,4950489540,4950489543,4950489546,4950489831,4950489834,4950489837,4950489960,4950489963,4950489966,4950489969,4950489972,4950489975,4950489978,4950489981,4950489984,4950489987,4950489990,4950489993,4950489996,4950489999,4950490002,4950490005,4950490008,4950490011,4950490014,4950490017,4950490020,4950490023,4950490026,4950490029,4950490032,4950490035,4950490038,4950490041,4950490044,4950490047,4950490050,4950490053,4950490056,4950490059,4950490062,4950490065,4950490068,4950490071,4950490074,4950490077,4950490200,4950490281,4950490284,4950490287,4950490290,4950490293,4950490296,4950490299,4950490302,4950490305,4950490308,4950490749,4950490752,4950490755,4950490758,4950490761,4950490764,4950490767,4950490770,4950490773,4950490776,4950490779,4950490782,4950490785,4950490788,4950490791,4950490794,4950492402,4950492405,4950492408,4950492465,4950492468,4950492471,4950492474,4950492477,4950492600,4950492603,4950492606,4950492609,4950492612,4950492615,4950492618,4950492621,4950492624,4950492627,4950492630,4950492633,4950492636,4950492639,4950492642,4950492645,4950492648,4950492651,4950492654,4950492657,4950492660,4950492663,4950492666,4950492669,4950492672,4950492675,4950492678,4950492681,4950492684,4950492687,4950492690,4950492693,4950492696,4950492699,4950492702,4950492705,4950492708,4950492711,4950492714,4950492717,4950492840,4950492843,4950492846,4950492849,4950492852,4950492855,4950492861,4950492864,4950492867,4950492870,4950492873,4950492876,4950493341,4950493344,4950493347,4950493350,4950493353,4950493356,4950493359,4950493362,4950493365,4950493368,4950493371,4950493374,4950493377,4950493380,4950493383,4950494040,4950494043,4950494046,4950494049,4950494052,4950494055,4950494058,4950494061,4950494064,4950494067,4950494070,4950494073,4950494076,4950494079,4950494082,4950494085,4950494088,4950494091,4950494094,4950494097,4950494100,4950494103,4950494106,4950494109,4950494112,4950494115,4950494118,4950494121,4950494124,4950494127,4950494130,4950494133,4950494136,4950494139,4950494142,4950494145,4950494148,4950494376,4950494379,4950494382,4950494385,4950494388,4950494391,4950494394,4950494397,4950494520,4950494523,4950494526,4950494529,4950494532,4950494535,4950494538,4950494541,4950494544,4950494547,4950494550,4950494553,4950494811,4950494814,4950494817,4950495081,4950495084,4950495087,4950495090,4950495093,4950495096,4950495099,4950495102,4950495105,4950495108,4950495111,4950495114,4950495117,4950496044,4950496047,4950496050,4950496053,4950496056,4950496059,4950496062,4950496065,4950496068,4950496071,4950496074,4950496077,4950496200,4950496203,4950496206,4950496209,4950496212,4950496215,4950496218,4950496221,4950496224,4950496227,4950496230,4950496233,4950496236,4950496239,4950496242,4950496245,4950496248,4950496254,4950496257,4950496260,4950496263,4950496266,4950496269,4950496272,4950496275,4950496278,4950496281,4950496284,4950496287,4950496290,4950496293,4950496296,4950496299,4950496302,4950496305,4950496308,4950496686,4950496689,4950496692,4950496695,4950496698,4950496701,4950496704,4950496707,4950496710,4950496713,4950496716,4950496719,4950496722,4950496725,4950496728,4950496731,4950496734,4950496737,4950496740,4950496743,4950496746,4950496749,4950496752,4950496755,4950496758,4950496761,4950496764,4950496767,4950496770,4950496773,4950496776,4950496779,4950496782,4950496785,4950496788,4950496791,4950496794,4950496797,4950496920,4950496923,4950496926,4950496941,4950496944,4950496947,4950496950,4950496953,4950496956,4950496959,4950497223,4950497226,4950497229,4950497232,4950497235,4950497238,4950497241,4950497244,4950497247,4950497250,4950497253,4950497256,4950497259,4950497481,4950497484,4950498372,4950498375,4950498381,4950498384,4950498387,4950498390,4950498393,4950498396,4950498399,4950498402,4950498405,4950498408,4950498411,4950498414,4950498417,4950498420,4950498423,4950498426,4950498429,4950498432,4950498435,4950498438,4950498444,4950498447,4950498450,4950498453,4950498456,4950498459,4950498462,4950498465,4950665728,4950665731,4950665734,4950665737,4950665740,4950665743,4950665746,4950665749,4950665752,4950665755,4950665758,4950665884,4950665887,4950665926,4950665929,4950665932,4950665935,4950665938,4950665941,4950665944,4950665947,4950665950,4950669043,4950669046,4950669049,4950669052,4950669055,4950669058,4950669061,4950669064,4950669067,4950669070,4950669073,4950669082,4950669085,4950669088,4950669091,4950669094,4950669097,4950669100,4950669241,4950669244,4950669271,4950669274,4950669277,4950669280,4950669283,4950669286,4950669289,4950669292,4950669295,4950676474,4950676477,4950677683,4950677686,4950677689,4950677692,4950677695,4950677698,4950677701,4950677704,4950677707,4950677710,4950677713,4950677716,4950677719,4950677722,4950677725,4950677728,4950677731,4950677734,4950677737,4950677740,4950678223,4950678226,4950678229,4950678232,4950678235,4950678238,4950678421,4950678424,4950678427,4950678430,4950678433,4950678436,4950678439,4950678442,4950678445,4950678448,4950678451,4950678454,4950678457,4950678460,4950678463,4950678466,4950678679,4950678682,4950678685,4950678688,4950678691,4950678694,4950678697,4950678700,4950678703,4950678706,4950678709,4950678712,4950678715,4950678718,4950678841,4950678844,4950678847,4950678850,4950678853,4950678859,4950678862,4950678865,4950678868,4950678871,4950678874,4950678877,4950678880,4950678883,4950678886,4950678889,4950678892,4950678895,4950678898,4950678901,4950678904,4950678907,4950678910,4950678913,4950678916,4950678919,4950678922,4950678925,4950678928,4950678931,4950678934,4950678937,4950678940,4950678943,4950678946,4950678949,4950678952,4950678955,4950678958,4950679081,4950679084,4950679087,4950679090,4950679093,4950679096,4950679099,4950679102,4950679105,4950679108,4950679111,4950679114,4950679117,4950679120,4950679123,4950679126,4950679129,4950679132,4950679135,4950679138,4950679141,4950679144,4950679147,4950679150,4950679153,4950679156,4950679159,4950679162,4950679165,4950679168,4950679171,4950679174,4950679177,4950679180,4950679183,4950679186,4950679630,4950679633,4950679636,4950679639,4950679642,4950679645,4950679648,4950679651,4950679654,4950679657,4950679660,4950679663,4950679669,4950679672,4950679675,4950679678,4950679801,4950679804,4950679807,4950679810,4950679813,4950679816,4950679819,4950679822,4950679825,4950679828,4950679831,4950679834,4950679837,4950679840,4950679843,4950679846,4950679849,4950679852,4950679855,4950679858,4950679861,4950679864,4950679867,4950679870,4950679873,4950679876,4950679879,4950679882,4950680353,4950680356,4950680359,4950680362,4950680365,4950680626,4950680629,4950680632,4950680635,4950680638,4950680761,4950680764,4950680767,4950680770,4950680773,4950680776,4950680779,4950680781,4950680782,4950680784,4950680785,4950680787,4950680788,4950680790,4950680791,4950680793,4950680794,4950680796,4950680797,4950680799,4950680800,4950680802,4950680803,4950680805,4950680806,4950680808,4950680809,4950680811,4950680812,4950680814,4950680815,4950680818,4950680821,4950680824,4950680827,4950680829,4950680830,4950680832,4950680833,4950680835,4950680836,4950680838,4950680839,4950680842,4950680845,4950680848,4950680851,4950680854,4950680857,4950680860,4950680863,4950680866,4950680869,4950680872,4950680875,4950680878,4950681001,4950681004,4950681007,4950681010,4950681013,4950681016,4950681022,4950681025,4950681027,4950681028,4950681030,4950681031,4950681033,4950681034,4950681036,4950681037,4950681039,4950681042,4950681045,4950681048,4950681051,4950681054,4950681057,4950681060,4950681063,4950681066,4950681069,4950681072,4950681075,4950681078,4950681355,4950681358,4950681481,4950681484,4950681487,4950681490,4950681493,4950681496,4950681499,4950681502,4950681505,4950681508,4950681511,4950681514,4950681517,4950681520,4950681523,4950681526,4950681595,4950681598,4950681721,4950681724,4950681727,4950681730,4950681733,4950681736,4950681739,4950681742,4950681748,4950681751,4950681754,4950681757,4950681760,4950681763,4950681967,4950681970,4950681973,4950681976,4950681979,4950681982,4950681985,4950681988,4950681991,4950681994,4950681997,4950682000,4950682006,4950682009,4950682012,4950682015,4950682018,4950682021,4950682024,4950682027,4950682030,4950682033,4950682036,4950682039,4950682042,4950682045,4950682048,4950682051,4950682054,4950682057,4950682060,4950682063,4950682066,4950682069,4950682072,4950682075,4950682078,4950682201,4950682204,4950682207,4950682210,4950682471,4950682474,4950682477,4950682480,4950682483,4950682486,4950682489,4950682492,4950682495,4950682498,4950682501,4950682504,4950682507,4950682510,4950682513,4950682516,4950682519,4950682522,4950682525,4950682528,4950682531,4950682741,4950682744,4950682747,4950682753,4950682756,4950682762,4950682765,4950682768,4950682771,4950682774,4950682777,4950682780,4950682783,4950682786,4950682789,4950682792,4950682795,4950682798,4950682921,4950682924,4950682927,4950682930,4950682933,4950683221,4950683224,4950683227,4950683230,4950683233,4950683236,4950683239,4950683242,4950683245,4950683248,4950683251,4950683254,4950683257,4950683260,4950683263,4950683266,4950683269,4950683272,4950683275,4950683278,4950683401,4950683404,4950683407,4950683410,4950683413,4950683416,4950683419,4950683422,4950683425,4950683428,4950683431,4950683434,4950683437,4950683440,4950683443,4950683446,4950683449,4950683452,4950683455,4950683740,4950683743,4950683746,4950683749,4950683752,4950683755,4950683758,4950683881,4950683884,4950683887,4950683890,4950683893,4950683896,4950683899,4950683902,4950683905,4950683908,4950683911,4950683914,4950683917,4950683920,4950683923,4950683926,4950683929,4950683932,4950683935,4950683938,4950683941,4950683944,4950683947,4950683953,4950683956,4950683959,4950683962,4950683965,4950683968,4950683971,4950683977,4950683980,4950683983,4950683986,4950683989,4950683992,4950683995,4950683998,4950684121,4950684439,4950684442,4950684445,4950684448,4950684451,4950684454,4950684457,4950684460,4950684463,4950684466,4950684469,4950684472,4950684475,4950684478,4950684601,4950684604,4950684607,4950684610,4950684691,4950684694,4950684697,4950684700,4950684703,4950684706,4950684709,4950684712,4950684715,4950684718,4950684841,4950684844,4950684847,4950684850,4950684853,4950684856,4950684859,4950684862,4950684865,4950684871,4950684874,4950684877,4950684880,4950684883,4950684886,4950685378,4950685381,4950685384,4950685387,4950685390,4950685393,4950685396,4950685399,4950685402,4950685405,4950685408,4950685411,4950685414,4950685417,4950685420,4950685423,4950685426,4950685429,4950685432,4950685435,4950685438,4950685561,4950685564,4950685567,4950685570,4950685573,4950685576,4950685579,4950685582,4950686068,4950686071,4950686074,4950686077,4950686080,4950686083,4950686086,4950686089,4950686092,4950686095,4950686098,4950686101,4950686104,4950686107,4950686110,4950686113,4950686116,4950686119,4950686122,4950686125,4950686128,4950686131,4950686134,4950686140,4950686143,4950686146,4950686149,4950686152,4950686155,4950686158,4950686281,4950686284,4950686287,4950686290,4950686293,4950686296,4950686299,4950686302,4950686305,4950686308,4950686311,4950686314,4950686317,4950686320,4950686323,4950686326,4950686329,4950686332,4950686335,4950686338,4950686362,4950686365,4950686368,4950686371,4950686374,4950686377,4950686380,4950686383,4950686386,4950686389,4950686392,4950686395,4950686398,4950686521,4950686524,4950686527,4950686530,4950686533,4950686536,4950686539,4950687013,4950687016,4950687019,4950687022,4950687025,4950687028,4950687031,4950687034,4950687037,4950687040,4950687046,4950687049,4950687052,4950687055,4950687058,4950687061,4950687064,4950687067,4950687070,4950687073,4950687076,4950687079,4950687082,4950687085,4950687088,4950687091,4950687094,4950687097,4950687100,4950687103,4950687106,4950687112,4950687115,4950687118,4950687241,4950687244,4950687247,4950687499,4950687502,4950687505,4950687508,4950687511,4950687514,4950687517,4950687520,4950687523,4950687529,4950687532,4950687535,4950687538,4950687544,4950687547,4950687550,4950687553,4950687556,4950687559,4950687562,4950687565,4950687568,4950687571,4950687574,4950687577,4950687580,4950688066,4950688069,4950688072,4950688075,4950688078,4950688201,4950688204,4950688207,4950688210,4950688213,4950688216,4950688219,4950688222,4950688225,4950688228,4950688231,4950688234,4950688237,4950688240,4950688243,4950688246,4950688249,4950688252,4950688255,4950688258,4950688261,4950688264,4950688267,4950688270,4950688273,4950688276,4950688279,4950688282,4950688285,4950688288,4950688291,4950688294,4950688297,4950688300,4950688303,4950688306,4950688309,4950688312,4950688315,4950688318,4950688441,4950688444,4950688447,4950688450,4950688453,4950688456,4950688459,4950688462,4950688465,4950688483,4950688486,4950688783,4950688786,4950688789,4950688792,4950688795,4950688921,4950688924,4950688927,4950688930,4950688933,4950688936,4950688939,4950688942,4950688945,4950688948,4950688951,4950688954,4950688957,4950688960,4950688963,4950688966,4950688969,4950688972,4950688975,4950688978,4950688981,4950688984,4950688987,4950688990,4950688993,4950688996,4950688999,4950689401,4950689404,4950689407,4950689410,4950689413,4950689416,4950689419,4950689422,4950689425,4950689428,4950689431,4950689434,4950689437,4950689440,4950689443,4950689446,4950689449,4950689452,4950689455,4950689458,4950689461,4950689464,4950689467,4950689470,4950689473,4950689476,4950689479,4950689482,4950689485,4950689488,4950689494,4950689497,4950689500,4950689503,4950689506,4950689509,4950689512,4950689515,4950689518,4950689641,4950689644,4950689647,4950689650,4950689653,4950689656,4950689659,4950689662,4950689932,4950689935,4950689938,4950689941,4950689944,4950689947,4950689950,4950689953,4950689956,4950689959,4950689962,4950689965,4950689968,4950689971,4950689974,4950689977,4950689980,4950689983,4950689986,4950689989,4950689992,4950689995,4950689998,4950690121,4950690124,4950690130,4950690133,4950690136,4950690139,4950690142,4950690145,4950690148,4950690151,4950690154,4950690157,4950690160,4950690163,4950690166,4950690169,4950690172,4950690175,4950690178,4950690181,4950690184,4950699984,4950699987,4950699990,4950699993,4950699996,4950700941,4950700944,4950700947,4950700950,4950700953,4950700956,4950700959,4950700962,4950700965,4950700968,4950700971,4950700974,4950700977,4950700980,4950700983,4950700986,4950701163,4950701166,4950701169,4950701172,4950701175,4950701178,4950701181,4950701184,4950701187,4950701190,4950701193,4950701196,4950701199,4950701202,4950701205,4950701211,4950701214,4950701217,4950701220,4950701223,4950701226,4950701412,4950701415,4950701418,4950701421,4950701424,4950701427,4950701430,4950701433,4950701436,4950701439,4950701442,4950701445,4950701448,4950701451,4950701454,4950701457,4950701460,4950701463,4950701466,4950701469,4950701472,4950701475,4950701478,4950701730,4950701733,4950701736,4950701739,4950701742,4950701745,4950701748,4950701751,4950701754,4950701757,4950701880,4950701883,4950701886,4950701889,4950701892,4950701895,4950701898,4950701901,4950701904,4950701907,4950701910,4950701913,4950701916,4950701919,4950701922,4950701925,4950701928,4950701931,4950701934,4950701937,4950701940,4950701943,4950701946,4950701949,4950701952,4950701955,4950701958,4950701961,4950701964,4950701967,4950701970,4950701973,4950701976,4950701979,4950701982,4950701985,4950701988,4950701991,4950701994,4950701997,4950702120,4950702123,4950702126,4950702129,4950702132,4950702135,4950702138,4950702636,4950702639,4950702642,4950702645,4950702648,4950702651,4950702654,4950702657,4950702660,4950702663,4950702666,4950702669,4950702672,4950702675,4950702678,4950702897,4950702900,4950702903,4950702906,4950702909,4950702912,4950702915,4950702918,4950702921,4950702924,4950702927,4950702930,4950702933,4950702936,4950702939,4950702942,4950702945,4950702948,4950702951,4950702957,4950703080,4950703083,4950703086,4950703089,4950703092,4950703098,4950703101,4950703104,4950703107,4950703110,4950703113,4950703116,4950703119,4950703122,4950703125,4950703128,4950703131,4950703134,4950703137,4950703140,4950703143,4950703146,4950703149,4950703152,4950703155,4950703158,4950703161,4950703164,4950703167,4950703170,4950703173,4950703176,4950703179,4950703182,4950703185,4950703188,4950703191,4950703194,4950703197,4950703320,4950703323,4950703326,4950703329,4950703332,4950703335,4950703338,4950703347,4950703350,4950703353,4950703356,4950703359,4950703362,4950703365,4950703368,4950703371,4950703374,4950703377,4950703380,4950703383,4950703386,4950703389,4950703392,4950703395,4950703398,4950703401,4950703404,4950703407,4950703410,4950703413,4950703416,4950703419,4950703422,4950703425,4950703428,4950703431,4950703434,4950703437,4950703560,4950703563,4950703566,4950703569,4950703572,4950703575,4950703578,4950703581,4950703584,4950703587,4950703590,4950703593,4950703596,4950703599,4950703602,4950703887,4950703890,4950703893,4950703896,4950703899,4950703902,4950703905,4950703908,4950703911,4950703914,4950703917,4950704040,4950704043,4950704046,4950704049,4950704052,4950704055,4950704058,4950704061,4950704064,4950704067,4950704070,4950704073,4950704076,4950704079,4950704082,4950704085,4950704088,4950704091,4950704094,4950704097,4950704100,4950704106,4950704109,4950704112,4950704115,4950704118,4950704121,4950704124,4950704127,4950704130,4950704532,4950704535,4950704538,4950704541,4950704544,4950704550,4950704553,4950704556,4950704559,4950704562,4950704565,4950704568,4950704571,4950704574,4950704577,4950704580,4950704583,4950704586,4950704589,4950704592,4950704595,4950704598,4950704601,4950704604,4950704607,4950704610,4950704613,4950704616,4950704619,4950704622,4950704625,4950704628,4950704631,4950704634,4950704637,4950704760,4950704763,4950704766,4950704769,4950704772,4950704775,4950704778,4950705033,4950705036,4950705039,4950705042,4950705045,4950705051,4950705054,4950705057,4950705060,4950705063,4950705066,4950705069,4950705072,4950705075,4950705078,4950705081,4950705084,4950705087,4950705090,4950705093,4950705096,4950705099,4950705102,4950705105,4950705108,4950705111,4950705114,4950705117,4950705240,4950705243,4950705246,4950705531,4950705534,4950705537,4950705540,4950705543,4950705546,4950705549,4950705552,4950705555,4950705558,4950705561,4950705564,4950705567,4950705570,4950705573,4950705576,4950705579,4950705582,4950705585,4950705588,4950705594,4950705597,4950705720,4950705723,4950705726,4950705729,4950705732,4950705735,4950705738,4950705780,4950705783,4950705786,4950705789,4950705792,4950705795,4950705798,4950705801,4950705804,4950705807,4950705810,4950705813,4950705816,4950705819,4950705822,4950705825,4950705831,4950706029,4950706032,4950706035,4950706038,4950706041,4950706044,4950706047,4950706050,4950706053,4950706056,4950706059,4950706062,4950706065,4950706068,4950706071,4950706251,4950706254,4950706257,4950706260,4950706263,4950706266,4950706269,4950706272,4950706275,4950706278,4950706281,4950706284,4950706287,4950706290,4950706293,4950706296,4950706299,4950706302,4950706305,4950706308,4950706311,4950706314,4950706317,4950706701,4950706704,4950706707,4950706710,4950706713,4950706716,4950706719,4950706722,4950706725,4950706728,4950706731,4950706734,4950706737,4950706740,4950706743,4950706746,4950706749,4950706752,4950706755,4950706758,4950706761,4950706764,4950706767,4950706770,4950706773,4950706776,4950706779,4950706782,4950706785,4950706788,4950706791,4950706797,4950706920,4950706923,4950706926,4950706929,4950706932,4950707205,4950707208,4950707211,4950707214,4950707217,4950707400,4950707406,4950707409,4950707412,4950707418,4950707421,4950707424,4950707427,4950707430,4950707433,4950707436,4950707439,4950707442,4950707481,4950707484,4950707487,4950707490,4950707493,4950707496,4950707499,4950707502,4950707505,4950707508,4950707511,4950707514,4950707517,4950707640,4950707667,4950707670,4950707673,4950707676,4950707679,4950707682,4950708141,4950708144,4950708147,4950708150,4950708153,4950708156,4950708159,4950708162,4950708165,4950708168,4950708171,4950708174,4950708177,4950708180,4950708183,4950708186,4950708189,4950708192,4950708195,4950708198,4950708201,4950708204,4950708207,4950708210,4950708213,4950708216,4950708219,4950708222,4950708225,4950708228,4950708231,4950708234,4950708237,4950708360,4950708363,4950708366,4950708369,4950708633,4950708636,4950708639,4950708642,4950708645,4950708648,4950708651,4950708654,4950708657,4950708660,4950708663,4950708666,4950708669,4950708672,4950708675,4950708678,4950708891,4950708894,4950708897,4950708900,4950708903,4950708906,4950708909,4950708912,4950708915,4950708918,4950708921,4950708927,4950708933,4950708936,4950708939,4950708942,4950708945,4950708948,4950708951,4950708954,4950708957,4950709080,4950709083,4950709086,4950709089,4950709092,4950709095,4950709098,4950709101,4950709104,4950709107,4950709110,4950709113,4950709116,4950709119,4950709122,4950709644,4950709647,4950709650,4950709653,4950709659,4950709662,4950709665,4950709668,4950709671,4950709674,4950709677,4950709800,4950709803,4950709806,4950709809,4950709812,4950709815,4950709818,4950709821,4950709824,4950709827,4950709830,4950709833,4950709836,4950709839,4950709842,4950709845,4950709848,4950709851,4950709854,4950709860,4950709863,4950709866,4950709869,4950709872,4950709875,4950709878,4950709881,4950709884,4950709887,4950709890,4950709893,4950709896,4950709899,4950709902,4950709905,4950709908,4950709911,4950709914,4950709917,4950710040,4950710043,4950710151,4950710154,4950710157,4950710280,4950710283,4950710286,4950711090,4950711093,4950711096,4950711099,4950711102,4950711105,4950711108,4950711111,4950711114,4950711117,4950711240,4950711243,4950711246,4950711249,4950711252,4950711255,4950711258,4950711264,4950711267,4950711270,4950711273,4950711276,4950711279,4950711282,4950711285,4950711288,4950711291,4950711294,4950711297,4950711300,4950711303,4950711306,4950711309,4950711312,4950711315,4950711318,4950711507,4950711510,4950711513,4950711516,4950711519,4950711522,4950711525,4950711528,4950711531,4950711534,4950711537,4950711540,4950711543,4950711546,4950711549,4950711552,4950711555,4950711558,4950711561,4950711564,4950711567,4950711570,4950711573,4950711576,4950711579,4950711582,4950711585,4950711588,4950711591,4950711594,4950711597,4950711720,4950711723,4950711726,4950711729,4950711732,4950711735,4950711738,4950711741,4950711744,4950711747,4950711750,4950711753,4950711756,4950711759,4950711762,4950711765,4950711768,4950711771,4950959897,4950959900,4950959903,4950959906,4950959909,4950959912,4950959915,4950959918,4950959921,4950959924,4950959927,4950959930,4950959933,4950959936,4950959939,4950959942,4950959945,4950959948,4950959951,4950959954,4950959957,4950959960,4950959963,4950959966,4950960221,4950960224,4950960227,4950960230,4950960233,4950960239,4950960362,4950960365,4950960368,4950960371,4950960374,4950960377,4950960380,4950960383,4950960386,4950960389,4950960392,4950960395,4950960398,4950960401,4950960404,4950961112,4950961169,4950961172,4950961175,4950961178,4950961181,4950961184,4950961418,4950961421,4950961424,4950961427,4950961430,4950961433,4950961436,4950961835,4950961838,4950961841,4950961844,4950961847,4950961850,4950961853,4950961856,4950961859,4950961862,4950961865,4950961868,4950961871,4950961877,4950961880,4950961886,4950961889,4950961892,4950961895,4950961898,4950961901,4950961904,4950961907,4950961910,4950961913,4950961916,4950961919,4950962042,4950962045,4950962048,4950962051,4950962054,4950962057,4950962060,4950962063,4950962066,4950962069,4950962072,4950962075,4950962078,4950962081,4950962084,4950962087,4950962090,4950962093,4950962096,4950962099,4950962102,4950962105,4950962108,4950962111,4950962114,4950962117,4950962120,4950962123,4950962126,4950962129,4950962132,4950962135,4950962138,4950962141,4950962144,4950962147,4950962150,4950962153,4950962156,4950962159,4950962282,4950962285,4950962288,4950962291,4950962294,4950962297,4950962300,4950962303,4950962630,4950962633,4950962636,4950962639,4950962762,4950962765,4950962768,4950962771,4950962774,4950962777,4950962780,4950962783,4950962786,4950962789,4950962792,4950962798,4950962801,4950962804,4950962807,4950962810,4950962813,4950962816,4950962819,4950962822,4950962825,4950962828,4950962831,4950962834,4950962840,4950962843,4950962846,4950962849,4950962852,4950962855,4950962858,4950962861,4950962864,4950962867,4950962870,4950962873,4950962876,4950962879,4950963002,4950963005,4950963008,4950963011,4950963014,4950963017,4950963020,4950963023,4950963026,4950963071,4950963074,4950963077,4950963080,4950963083,4950963086,4950963089,4950963092,4950963095,4950963098,4950963101,4950963104,4950963107,4950963110,4950963113,4950963116,4950963119,4950963242,4950963326,4950963329,4950963332,4950963335,4950963338,4950963341,4950963344,4950963347,4950963350,4950963353,4950963356,4950963359,4950963482,4950963485,4950963488,4950963491,4950963494,4950963497,4950963500,4950963503,4950963506,4950963776,4950963779,4950963782,4950963785,4950963788,4950963791,4950963794,4950963797,4950963800,4950963803,4950963806,4950963809,4950963812,4950963815,4950963818,4950963821,4950963824,4950963827,4950963830,4950963833,4950963836,4950963839,4950963962,4950963965,4950963968,4950963971,4950963974,4950963977,4950963980,4950963983,4950963986,4950963989,4950963992,4950963995,4950963998,4950964001,4950964004,4950964007,4950964010,4950964013,4950964016,4950964019,4950964022,4950964025,4950964028,4950964031,4950964034,4950964037,4950964040,4950964043,4950964046,4950964052,4950964055,4950964058,4950964061,4950964064,4950964067,4950964070,4950964265,4950964268,4950964271,4950964274,4950964277,4950964280,4950964283,4950964286,4950964289,4950964292,4950964295,4950964298,4950964301,4950964304,4950964307,4950964310,4950964313,4950964316,4950964319,4950964442,4950964445,4950964448,4950964451,4950964454,4950964457,4950964694,4950964697,4950964700,4950964703,4950964706,4950964709,4950964712,4950964715,4950964718,4950964721,4950964724,4950964727,4950964730,4950964733,4950964736,4950964739,4950964742,4950964745,4950964748,4950964751,4950964754,4950964757,4950964760,4950964763,4950964766,4950965168,4950965171,4950965174,4950965177,4950965180,4950965183,4950965186,4950965189,4950965192,4950965195,4950965198,4950965201,4950965204,4950965207,4950965210,4950965213,4950965216,4950965219,4950965222,4950965225,4950965228,4950965663,4950965666,4950965669,4950965672,4950965675,4950965678,4950965681,4950965684,4950965687,4950965688,4950965690,4950965693,4950965696,4950965699,4950965702,4950965705,4950965708,4950965711,4950965714,4950965717,4950965720,4950965723,4950965726,4950965729,4950965732,4950965735,4950965738,4950965741,4950965744,4950965747,4950965750,4950965753,4950965756,4950965759,4950965882,4950965885,4950965888,4950965891,4950965894,4950965897,4950965900,4950965903,4950965906,4950965909,4950965912,4950965915,4950965918,4950965921,4950965924,4950965927,4950965930,4950965933,4950965936,4950965939,4950965969,4951091453,4951091456,4951091459,4951091462,4951091465,4951091468,4951091471,4951091474,4951091495,4951091498,4951091501,4951091504,4951091507,4951091510,4951091513,4951094135,4951094138,4951094141,4951094144,4951094147,4951094150,4951094282,4951094285,4951094288,4951094291,4951094294,4951094297,4951123430,4951123433,4951123436,4951124048,4951124051,4951124054,4951124057,4951124060,4951124063,4951124066,4951124069,4951124072,4951124075,4951124078,4951124081,4951124084,4951124087,4951124090,4951124093,4951124096,4951124099,4951124102,4951124105,4951124108,4951124111,4951124114,4951124117,4951124120,4951124123,4951124126,4951124132,4951124135,4951124138,4951124141,4951124144,4951124147,4951124150,4951124153,4951124156,4951124159,4951124282,4951124285,4951124291,4951124294,4951124297,4951124300,4951124303,4951124306,4951124309,4951124312,4951124315,4951124318,4951124321,4951124324,4951124327,4951124330,4951124333,4951124336,4951124339,4951124342,4951124345,4951124348,4951124351,4951125014,4951125017,4951125020,4951125023,4951125026,4951125029,4951125032,4951125035,4951125038,4951125041,4951125044,4951125047,4951125050,4951125053,4951125056,4951125059,4951125062,4951125065,4951125068,4951125071,4951125074,4951125077,4951125080,4951125083,4951125086,4951125089,4951125092,4951125098,4951125101,4951125104,4951125107,4951125110,4951125113,4951125116,4951125119,4951125242,4951125245,4951125248,4951125251,4951125254,4951125257,4951125761,4951125764,4951125767,4951125770,4951125773,4951125776,4951125779,4951125782,4951125785,4951125788,4951125791,4951125794,4951125797,4951125800,4951126034,4951126037,4951126040,4951126043,4951126046,4951126049,4951126052,4951126055,4951126058,4951126061,4951126064,4951126067,4951126229,4951126232,4951126235,4951126238,4951126241,4951126244,4951126247,4951126250,4951126253,4951126256,4951126259,4951126262,4951126265,4951126268,4951126271,4951126274,4951126277,4951126280,4951126283,4951126286,4951126289,4951126292,4951126295,4951126298,4951126304,4951126307,4951126310,4951126313,4951126316,4951126319,4951126442,4951126445,4951126448,4951126451,4951126454,4951126457,4951126460,4951126463,4951126466,4951126469,4951126472,4951126475,4951126478,4951126481,4951126484,4951126487,4951126769,4951126772,4951126775,4951127270,4951127273,4951127276,4951127279,4951127402,4951127405,4951127408,4951127411,4951127414,4951127417,4951127420,4951127423,4951127426,4951127750,4951127753,4951127756,4951127759,4951127882,4951127885,4951127888,4951127891,4951127894,4951127897,4951127900,4951127903,4951127906,4951127909,4951127912,4951127915,4951127918,4951127921,4951127924,4951127927,4951127930,4951127933,4951127936,4951127939,4951127942,4951127945,4951127948,4951127951,4951127954,4951127957,4951127960,4951127963,4951127966,4951128191,4951128194,4951128197,4951128200,4951128203,4951128206,4951128209,4951128212,4951128215,4951128218,4951128221,4951128224,4951128227,4951128230,4951128233,4951128236,4951128362,4951128365,4951128368,4951128371,4951128377,4951128380,4951128383,4951128386,4951128389,4951128392,4951128395,4951128398,4951128401,4951128404,4951128407,4951128410,4951128413,4951128416,4951128419,4951128422,4951128425,4951128428,4951128431,4951128434,4951128437,4951128440,4951128443,4951128446,4951128449,4951128452,4951128455,4951128458,4951129097,4951129100,4951129103,4951129106,4951129109,4951129112,4951129115,4951129118,4951129121,4951129124,4951129127,4951129130,4951129133,4951129136,4951129139,4951129142,4951129145,4951129148,4951129151,4951129154,4951129157,4951129160,4951129163,4951129166,4951129409,4951129412,4951129415,4951129418,4951129421,4951129424,4951129427,4951129430,4951129433,4951129436,4951129439,4951129562,4951129565,4951129568,4951129571,4951129574,4951129577,4951129580,4951129583,4951129586,4951129589,4951129592,4951129598,4951129601,4951129604,4951129607,4951129610,4951129613,4951129616,4951129619,4951129622,4951129625,4951129628,4951129631,4951129634,4951129637,4951129640,4951129643,4951129646,4951129649,4951129655,4951129658,4951129661,4951129829,4951129835,4951129838,4951129841,4951129844,4951129847,4951129850,4951129853,4951129856,4951129859,4951129862,4951129865,4951129868,4951129871,4951129874,4951129877,4951129880,4951129883,4951129886,4951131089,4951131092,4951131095,4951131098,4951131101,4951131104,4951131107,4951131110,4951131113,4951131116,4951131119,4951131242,4951131245,4951131248,4951131251,4951131254,4951131257,4951131260,4951131263,4951131266,4951131269,4951131272,4951131275,4951131278,4951131281,4951131284,4951131287,4951131290,4951131293,4951131296,4951294442,4951294445,4951294448,4951294451,4951294454,4951294457,4951294460,4951294463,4951294466,4951294469,4951294472,4951294487,4951294490,4951294493,4951313177,4951313180,4951313183,4951313186,4951313189,4951313192,4951313216,4951313219,4951313222,4951313225,4951313228,4951313231,4951313258,4951313261,4951313264,4951313267,4951313270,4951313273,4951313276,4951313435,4951313438,4951313441,4951313444,4951313447,4951313450,4951313480,4951313483,4951313486,4951313489,4951313492,4951313495,4951313498,4951313501,4951313504,4951313507,4951313510,4951314167,4951314170,4951314173,4951314176,4951314179,4951314182,4951314185,4951314188,4951314191,4951314194,4951314197,4951314200,4951314203,4951314206,4951314209,4951314212,4951314215,4951314218,4951314221,4951314224,4951314227,4951314230,4951314233,4951314236,4951314239,4951314362,4951314365,4951314368,4951314371,4951314374,4951314377,4951314380,4951314383,4951314386,4951314389,4951314392,4951314395,4951314398,4951314401,4951314404,4951314407,4951314410,4951314413,4951314416,4951314419,4951314422,4951314425,4951314428,4951314431,4951314434,4951314437,4951314440,4951314443,4951314446,4951314449,4951314452,4951314455,4951314458,4951314461,4951314464,4951314467,4951314470,4951314473,4951314476,4951314479,4951314602,4951314605,4951314608,4951314611,4951314614,4951314617,4951314620,4951314623,4951314629,4951314632,4951314635,4951314638,4951314641,4951314644,4951314647,4951314650,4951315148,4951315151,4951315154,4951315157,4951315160,4951315163,4951315166,4951315169,4951315172,4951315175,4951315178,4951315184,4951315187,4951315190,4951315193,4951315196,4951315355,4951315358,4951315361,4951315364,4951315367,4951315370,4951315373,4951315376,4951315379,4951315382,4951315385,4951315388,4951315391,4951315394,4951315574,4951315577,4951315580,4951315583,4951315586,4951315589,4951315592,4951315595,4951315598,4951315601,4951315604,4951315607,4951315610,4951315613,4951315616,4951315817,4951315820,4951315823,4951315826,4951315832,4951315835,4951315838,4951315841,4951315844,4951315847,4951315850,4951315853,4951315856,4951315862,4951315865,4951315868,4951315871,4951315874,4951315877,4951315880,4951316063,4951316066,4951316069,4951316072,4951316075,4951316078,4951316081,4951316084,4951316087,4951316090,4951316093,4951316096,4951316099,4951316102,4951316105,4951316108,4951316111,4951316114,4951316117,4951316150,4951316153,4951316156,4951316159,4951316282,4951316285,4951316288,4951316291,4951316333,4951316336,4951316339,4951316342,4951316345,4951316348,4951316351,4951316354,4951316357,4951316360,4951316363,4951316540,4951316543,4951316546,4951316549,4951316552,4951316555,4951316558,4951316561,4951316564,4951316567,4951316570,4951316573,4951316576,4951316774,4951316777,4951316780,4951316783,4951316786,4951316789,4951316792,4951316795,4951316798,4951316801,4951316804,4951316807,4951316810,4951316813,4951316816,4951316819,4951316822,4951316825,4951316828,4951316831,4951316834,4951316837,4951316840,4951316843,4951316846,4951316849,4951316852,4951316855,4951316858,4951316861,4951316864,4951316867,4951316870,4951316873,4951316876,4951316879,4951317002,4951317005,4951317008,4951317011,4951317014,4951317017,4951317020,4951317023,4951317482,4951317485,4951317488,4951317491,4951317494,4951317497,4951317500,4951317503,4951317506,4951317509,4951317512,4951317515,4951317518,4951317521,4951317524,4951317527,4951317530,4951317533,4951317536,4951317539,4951317542,4951317545,4951317548,4951317551,4951317554,4951317557,4951317560,4951317563,4951317566,4951317569,4951317572,4951317575,4951317578,4951317581,4951317584,4951317587,4951317590,4951317593,4951317596,4951317599,4951317839,4951317962,4951317965,4951317968,4951318052,4951318055,4951318058,4951318061,4951318064,4951318067,4951318070,4951318073,4951318076,4951318079,4951318202,4951318205,4951318208,4951318211,4951318214,4951318217,4951318220,4951318223,4951318268,4951318271,4951318274,4951318277,4951318280,4951318283,4951318286,4951318289,4951318292,4951318295,4951318298,4951318301,4951318304,4951318307,4951318310,4951318313,4951318316,4951318319,4951318442,4951318445,4951318448,4951318451,4951318454,4951318457,4951318460,4951318463,4951318466,4951318469,4951318472,4951318475,4951318478,4951318481,4951318484,4951318487,4951318490,4951318493,4951318496,4951318499,4951318796,4951318799,4951318922,4951318925,4951318928,4951318931,4951318934,4951318937,4951318940,4951318943,4951318946,4951318949,4951318952,4951318955,4951318958,4951318961,4951318964,4951318967,4951318970,4951318973,4951318976,4951318979,4951318982,4951318985,4951318988,4951318991,4951318994,4951318997,4951319000,4951319003,4951319006,4951319009,4951319012,4951319015,4951319018,4951319021,4951319024,4951319027,4951319030,4951319033,4951319036,4951319219,4951319222,4951319225,4951319228,4951319231,4951319234,4951319237,4951319240,4951319243,4951319246,4951319249,4951319252,4951319255,4951319258,4951319261,4951319264,4951319267,4951319270,4951319276,4951319279,4951319402,4951319405,4951319408,4951319411,4951319414,4951319417,4951319423,4951319426,4951319429,4951319432,4951319435,4951319438,4951319441,4951319444,4951319447,4951319450,4951319453,4951319456,4951319459,4951319462,4951319465,4951319969,4951319972,4951319975,4951319978,4951319981,4951319984,4951319987,4951319990,4951319993,4951319996,4951319999,4951320122,4951320125,4951320128,4951320131,4951320134,4951320137,4951320140,4951320143,4951320146,4951320149,4951320152,4951320155,4951320158,4951320161,4951320164,4951320167,4951320170,4951320173,4951320176,4951320179,4951320182,4951320185,4951320440,4951320443,4951320446,4951320449,4951320452,4951320455,4951320458,4951320461,4951320467,4951320470,4951320473,4951320476,4951320479,4951320602,4951320605,4951320608,4951320611,4951320614,4951320617,4951320620,4951320623,4951320626,4951320629,4951320632,4951320635,4951320638,4951320641,4951320644,4951320647,4951320650,4951320653,4951320656,4951320659,4951320662,4951320665,4951320668,4951320671,4951320674,4951320677,4951320680,4951320686,4951320689,4951320692,4951320695,4951320698,4951320701,4951320704,4951320707,4951320710,4951320713,4951320716,4951320719,4951320842,4951320845,4951320848,4951320851,4951320854,4951320857,4951320860,4951320863,4951321157,4951321160,4951321163,4951321166,4951321175,4951321178,4951321181,4951321184,4951321187,4951321190,4951321193,4951321196,4951321199,4951321322,4951321325,4951321328,4951321331,4951321334,4951321340,4951321343,4951321346,4951321349,4951321409,4951321412,4951321415,4951321418,4951321421,4951321424,4951321427,4951321430,4951321433,4951321436,4951321439,4951321562,4951321565,4951321625,4951321628,4951321631,4951321634,4951321637,4951321640,4951321643,4951321646,4951321649,4951321652,4951321655,4951321658,4951321661,4951321664,4951321667,4951321670,4951321829,4951321832,4951321835,4951321838,4951321841,4951321844,4951321847,4951321850,4951321853,4951321856,4951321859,4951321862,4951321865,4951321868,4951321871,4951321877,4951321880,4951321883,4951321886,4951321889,4951321892,4951321895,4951321898,4951321901,4951321904,4951321907,4951321910,4951321913,4951321916,4951321919,4951322042,4951322285,4951322288,4951322291,4951322297,4951322300,4951322303,4951322306,4951322309,4951322312,4951322315,4951322318,4951322321,4951322324,4951322327,4951322330,4951322333,4951322336,4951322339,4951322342,4951322345,4951322348,4951322351,4951322354,4951322357,4951322369,4951322372,4951322375,4951322378,4951322381,4951322384,4951322387,4951322390,4951322393,4951322396,4951322399,4951322522,4951322528,4951322531,4951322534,4951322537,4951322540,4951322543,4951322546,4951322549,4951322552,4951322555,4951322558,4951322561,4951322810,4951322813,4951322816,4951322819,4951322822,4951322825,4951322828,4951322831,4951322834,4951322837,4951322840,4951322843,4951322846,4951322849,4951322852,4951322855,4951322858,4951322861,4951322864,4951322867,4951322870,4951322873,4951322876,4951322879,4951323002,4951323005,4951323008,4951323011,4951323014,4951323017,4951323059,4951323062,4951323065,4951323068,4951323071,4951323074,4951323077,4951323080,4951323083,4951323086,4951323089,4951323092,4951323095,4951323098,4951323101,4951323104,4951323107,4951323296,4951323299,4951323302,4951323305,4951323308,4951323311,4951323317,4951323320,4951323323,4951323326,4951323329,4951323332,4951323335,4951323530,4951323533,4951323536,4951323539,4951323542,4951323545,4951323548,4951323551,4951323554,4951323560,4951323767,4951323770,4951323773,4951323776,4951323779,4951323782,4951323785,4951323788,4951323791,4951323794,4951323797,4951323800,4951323803,4951323806,4951323809,4951323812,4951323815,4951323818,4951323821,4951323824,4951323827,4951323830,4951323833,4951323836,4951323839,4951323962,4951323965,4951323968,4951323971,4951323974,4951323977,4951323980,4951323983,4951323986,4951323989,4951323992,4951323995,4951323998,4951324001,4951324004,4951324007,4951324010,4951324013,4951324016,4951324019,4951324022,4951324229,4951324232,4951324235,4951324238,4951324241,4951324244,4951324247,4951324250,4951324253,4951324256,4951324259,4951324262,4951324265,4951324268,4951324271,4951324274,4951324277,4951324280,4951324283,4951324286,4951324289,4951324763,4951324766,4951324796,4951324799,4951324922,4951324925,4951324928,4951324958,4951324961,4951324964,4951324967,4951324970,4951324973,4951324976,4951325003,4951325006,4951325009,4951325012,4951325015,4951325018,4951325021,4951325513,4951325516,4951325519,4951325642,4951325645,4951325648,4951325651,4951325654,4951325657,4951325660,4951325663,4951325666,4951325669,4951325672,4951325675,4951325678,4951325681,4951325684,4951325687,4951325690,4951325693,4951325696,4951325699,4951325702,4951325705,4951325708,4951325711,4951325714,4951325717,4951325720,4951325723,4951325726,4951325729,4951325732,4951325735,4951325738,4951325741,4951325744,4951325747,4951325750,4951325753,4951325756,4951325759,4951325882,4951325885,4951325888,4951325891,4951325894,4951325897,4951325900,4951325903,4951325975,4951325978,4951325981,4951325984,4951325987,4951326140,4951326143,4951326146,4951326149,4951326152,4951326155,4951326158,4951326182,4951326188,4951326191,4951326194,4951326197,4951326200,4951326203,4951326236,4951326410,4951326413,4951326416,4951326419,4951326422,4951326425,4951326428,4951326431,4951326434,4951326437,4951326440,4951326443,4951326446,4951326449,4951326452,4951326455,4951326458,4951326461,4951326464,4951326467,4951326470,4951326473,4951326476,4951326479,4951326602,4951326605,4951326608,4951326611,4951326614,4951326617,4951326620,4951326623,4951326626,4951326629,4951326632,4951326635,4951326638,4951326641,4951326644,4951326929,4951326932,4951326935,4951326938,4951326941,4951326944,4951326947,4951326950,4951326953,4951326956,4951326959,4951327082,4951327085,4951327088,4951327091,4951327097,4951327100,4951327103,4951327106,4951327109,4951327112,4951327115,4951327118,4951327121,4951327124,4951327127,4951327130,4951327133,4951327136,4951327139,4951327142,4951327145,4951327148,4951327151,4951327154,4951327157,4951327160,4951327163,4951327166,4951327373,4951327376,4951327379,4951327382,4951327385,4951327391,4951327397,4951327400,4951327403,4951327406,4951327409,4951327412,4951327415,4951327418,4951327421,4951327424,4951327427,4951327430,4951327433,4951327436,4951327439,4951327562,4951327565,4951327568,4951327571,4951327574,4951327577,4951327580,4951327583,4951327586,4951327589,4951327592,4951327595,4951327598,4951327601,4951327604,4951327607,4951327610,4951328621,4951328624,4951328627,4951328630,4951328633,4951328636,4951328639,4951328762,4951328765,4951328768,4951328771,4951328774,4951328777,4951328780,4951328783,4951328786,4951328789,4951328792,4951328798,4951328801,4951328804,4951328807,4951328810,4951328813,4951328816,4951328819,4951328822,4951328825,4951328828,4951328831,4951328834,4951328837,4951328840,4951328843,4951328846,4951328849,4951328852,4951328855,4951328858,4951328861,4951328864,4951328867,4951328870,4951328873,4951329119,4951329242,4951329245,4951329248,4951329251,4951329254,4951329257,4951329260,4951329263,4951329266,4951329269,4951329272,4951329275,4951329278,4951329281,4951329284,4951329287,4951329290,4951329293,4951329296,4951329299,4951329302,4951329305,4951329308,4951329311,4951329314,4951329317,4951329320,4951329323,4951329326,4951329329,4951329332,4951329335,4951329338,4951329341,4951329344,4951329347,4951329353,4951329356,4951329359,4951329482,4951329485,4951329488,4951329491,4951329494,4951329497,4951329500,4951329503,4951329509,4953017191,4953017194,4953017254,4953017257,4953017260,4953017263,4953022716,4953022719,4953022722,4953022725,4953022728,4953022731,4953022734,4953022737,4953022740,4953022743,4953022746,4953022749,4953022752,4953022755,4953022758,4953022761,4953022764,4953022767,4953022770,4953022773,4953022974,4953022977,4953022980,4953022983,4953022986,4953022989,4953022992,4953022995,4953022998,4953023001,4953023004,4953023007,4953023010,4953023013,4953023016,4953023019,4953023022,4953023025,4953023028,4953023031,4953023034,4953023037,4953023943,4953023946,4953023949,4953023952,4953023955,4953023958,4953023961,4953023964,4953023967,4953023970,4953023973,4953023976,4953023979,4953023982,4953023985,4953023988,4953023991,4953023994,4953023997,4953024120,4953024123,4953024126,4953024129,4953024132,4953024135,4953024138,4953024141,4953024144,4953024147,4953024150,4953024390,4953024393,4953024396,4953024399,4953024402,4953024408,4953024411,4953024414,4953024417,4953024420,4953024423,4953024426,4953024429,4953024432,4953024435,4953024438,4953024441,4953024444,4953024447,4953024450,4953024453,4953024456,4953024459,4953024462,4953024465,4953024468,4953024471,4953024474,4953024477,4953024600,4953025093,4953025096,4953025099,4953025102,4953025105,4953025108,4953025111,4953025114,4953025117,4953025120,4953025123,4953025126,4953025129,4953025132,4953025135,4953025138,4953025141,4953025144,4953025147,4953025150,4953025153,4953025156,4953025159,4953025162,4953025165,4953025168,4953025171,4953025174,4953025177,4953025180,4953025183,4953025186,4953025189,4953025192,4953025195,4953025198,4953025321,4953025324,4953025327,4953025330,4953025333,4953025336,4953025339,4953025342,4953025345,4953025348,4953025351,4953025354,4953025357,4953025426,4953025429,4953025432,4953025435,4953025438,4953025561,4953025564,4953025567,4953025804,4953025807,4953025810,4953025813,4953025816,4953025819,4953025822,4953025825,4953025828,4953025831,4953025834,4953025837,4953025840,4953025843,4953025846,4953025849,4953025852,4953025855,4953025858,4953025861,4953025864,4953025867,4953025870,4953025873,4953025876,4953025879,4953025882,4953025885,4953025888,4953025891,4953025894,4953025897,4953026095,4953026098,4953026101,4953026104,4953026107,4953026110,4953026113,4953026116,4953026119,4953026122,4953026125,4953026128,4953026131,4953026134,4953026137,4953026140,4953026143,4953026146,4953026353,4953026356,4953026359,4953026362,4953026365,4953026368,4953026371,4953026374,4953026377,4953026380,4953026383,4953026386,4953026389,4953026392,4953026395,4953026398,4953026521,4953026524,4953026527,4953026776,4953026779,4953026782,4953026785,4953026788,4953026791,4953026794,4953026797,4953026800,4953026803,4953026806,4953026809,4953026812,4953026815,4953026818,4953026821,4953026824,4953026827,4953026830,4953026833,4953026836,4953026839,4953026842,4953026845,4953026848,4953026851,4953026854,4953026857,4953026860,4953026863,4953026866,4953026869,4953026872,4953026875,4953026878,4953027001,4953027004,4953027007,4953027010,4953027013,4953027016,4953027019,4953027022,4953027025,4953027028,4953027031,4953027034,4953027037,4953027334,4953027337,4953027340,4953027343,4953027346,4953027349,4953027352,4953027355,4953027358,4953027481,4953027484,4953027487,4953027490,4953027493,4953027496,4953027499,4953027502,4953027505,4953027508,4953027511,4953027514,4953027517,4953027520,4953027523,4953027526,4953027529,4953027535,4953027538,4953027541,4953027544,4953027547,4953027550,4953027553,4953027556,4953027559,4953027562,4953027565,4953027571,4953027574,4953027577,4953027580,4953027582,4953027583,4953027585,4953027586,4953027588,4953027589,4953027591,4953027592,4953027594,4953027595,4953027597,4953027598,4953027720,4953027721,4953027723,4953027724,4953027726,4953027727,4953027729,4953027730,4953027732,4953027735,4953027738,4953027741,4953027744,4953027747,4953027750,4953027753,4953027756,4953027759,4953027762,4953027765,4953027768,4953027771,4953027774,4953027777,4953027780,4953027783,4953027786,4953027789,4953027792,4953027795,4953027798,4953027801,4953027804,4953027807,4953027810,4953027813,4953027816,4953027819,4953027822,4953027825,4953027828,4953027831,4953027834,4953027837,4953027960,4953027963,4953027966,4953027969,4953027972,4953028218,4953028221,4953028224,4953028227,4953028230,4953028233,4953028236,4953028239,4953028242,4953028245,4953028248,4953028251,4953028254,4953028257,4953028260,4953028263,4953028266,4953028269,4953028272,4953028275,4953028278,4953028281,4953028284,4953028287,4953028290,4953028293,4953028296,4953028515,4953028518,4953028521,4953028524,4953028527,4953028530,4953028533,4953028536,4953028539,4953028542,4953028545,4953028548,4953028551,4953028554,4953028557,4953028680,4953028704,4953028707,4953028710,4953028713,4953028716,4953028719,4953028722,4953028725,4953028728,4953028731,4953028734,4953028737,4953028740,4953028743,4953028746,4953028749,4953028752,4953028929,4953028932,4953028935,4953028938,4953028941,4953028944,4953028947,4953028950,4953028953,4953028956,4953028959,4953028995,4953029001,4953029004,4953029007,4953029010,4953029016,4953029019,4953029022,4953029025,4953029028,4953029187,4953029190,4953029193,4953029196,4953029199,4953029200,4953029202,4953029203,4953029205,4953029206,4953029208,4953029209,4953029211,4953029212,4953029214,4953029215,4953029218,4953029221,4953029224,4953029227,4953029230,4953029233,4953029236,4953029239,4953029242,4953029245,4953029248,4953029251,4953029254,4953029257,4953029260,4953029461,4953029464,4953029467,4953029470,4953029473,4953029476,4953029479,4953029482,4953029485,4953029488,4953029491,4953029494,4953029497,4953029500,4953029503,4953029506,4953029509,4953029512,4953029515,4953029518,4953029721,4953029724,4953029727,4953029730,4953029733,4953029739,4953029742,4953029745,4953029751,4953029754,4953029757,4953029880,4953029919,4953029922,4953029925,4953029928,4953029934,4953029937,4953029940,4953029943,4953029946,4953029949,4953029952,4953029955,4953029958,4953029961,4953029964,4953029974,4953029977,4953029980,4953029983,4953029986,4953029989,4953029992,4953029995,4953029998,4953030121,4953030124,4953030127,4953030130,4953030133,4953030136,4953030139,4953030142,4953030145,4953030148,4953030151,4953030154,4953030156,4953030157,4953030159,4953030160,4953030162,4953030163,4953030165,4953030166,4953030168,4953030169,4953030171,4953030172,4953030174,4953030175,4953030177,4953030178,4953030180,4953030181,4953030183,4953030184,4953030186,4953030187,4953030189,4953030190,4953030192,4953030193,4953030195,4953030196,4953030198,4953030199,4953030201,4953030202,4953030204,4953030205,4953030208,4953030211,4953030214,4953030217,4953030220,4953030223,4953030226,4953030229,4953030232,4953030235,4953030238,4953030361,4953030364,4953030367,4953030370,4953030373,4953030376,4953030379,4953030382,4953030385,4953030388,4953030391,4953030393,4953030394,4953030396,4953030397,4953030399,4953030400,4953030402,4953030403,4953030405,4953030406,4953030408,4953030409,4953030411,4953030412,4953030414,4953030415,4953030417,4953030418,4953030420,4953030868,4953030871,4953030874,4953030877,4953030880,4953030883,4953030885,4953030886,4953030888,4953030889,4953030891,4953030892,4953030894,4953030895,4953030897,4953030898,4953030900,4953030901,4953030903,4953030904,4953030906,4953030907,4953030909,4953030910,4953030912,4953030913,4953030915,4953030916,4953030918,4953030919,4953030921,4953030922,4953030924,4953030927,4953030930,4953030933,4953030936,4953030939,4953030942,4953030945,4953030948,4953030951,4953030954,4953030957,4953031080,4953031083,4953031086,4953031089,4953031092,4953031095,4953031098,4953031101,4953031104,4953031107,4953031137,4953031140,4953031143,4953031146,4953031149,4953031152,4953031155,4953031156,4953031158,4953031159,4953031161,4953031162,4953031164,4953031165,4953031167,4953031168,4953031171,4953031174,4953031177,4953031180,4953031183,4953031186,4953031189,4953031192,4953031195,4953031198,4953031321,4953031327,4953031330,4953031333,4953031336,4953031338,4953031339,4953031341,4953031342,4953031344,4953031347,4953031348,4953031350,4953031351,4953031353,4953031354,4953031356,4953031357,4953031359,4953031360,4953031362,4953031363,4953031365,4953031368,4953031371,4953031413,4953031416,4953031419,4953031422,4953031425,4953031426,4953031428,4953031429,4953031431,4953031432,4953031434,4953031435,4953031437,4953031438,4953031561,4953031564,4953031567,4953031570,4953031573,4953031576,4953031579,4953031582,4953031585,4953031587,4953031588,4953031590,4953031591,4953031593,4953031594,4953031596,4953031597,4953031599,4953031600,4953031603,4953031605,4953031606,4953031608,4953031609,4953031611,4953031612,4953031615,4953031618,4953031621,4953031623,4953031624,4953031626,4953031627,4953031629,4953031630,4953031632,4953031633,4953031635,4953031636,4953031638,4953031639,4953031641,4953031642,4953031644,4953031645,4953031647,4953031648,4953031650,4953031651,4953031653,4953031654,4953031656,4953031657,4953031659,4953031660,4953031662,4953031663,4953031665,4953031666,4953031668,4953031669,4953031671,4953031672,4953031674,4953031675,4953031677,4953031678,4953031800,4953031801,4953031803,4953031804,4953031806,4953031807,4953031809,4953031816,4953031819,4953031822,4953031825,4953031828,4953031831,4953031834,4953031837,4953031840,4953031843,4953031846,4953031849,4953031852,4953031855,4953031858,4953031861,4953031864,4953031867,4953031870,4953031873,4953031876,4953031879,4953031882,4953031885,4953031888,4953031891,4953031894,4953031897,4953031900,4953031903,4953031906,4953031909,4953031912,4953031915,4953031918,4953032041,4953032044,4953032047,4953032050,4953032053,4953032056,4953032059,4953032062,4953032065,4953032068,4953032071,4953032074,4953032077,4953032080,4953032083,4953032086,4953032089,4953032550,4953032553,4953032556,4953032559,4953032562,4953032565,4953032568,4953032571,4953032574,4953032577,4953032580,4953032581,4953032583,4953032584,4953032586,4953032587,4953032589,4953032590,4953032592,4953032593,4953032595,4953032596,4953032598,4953032599,4953032601,4953032602,4953032604,4953032605,4953032607,4953032608,4953032610,4953032611,4953032613,4953032614,4953032616,4953032617,4953032619,4953032620,4953032622,4953032623,4953032625,4953032626,4953032628,4953032629,4953032631,4953032632,4953032634,4953032635,4953032637,4953032638,4953032760,4953032761,4953032763,4953032764,4953032766,4953032767,4953032770,4953032772,4953032773,4953032775,4953032776,4953032779,4953032781,4953032782,4953032784,4953032785,4953032787,4953032788,4953032790,4953032791,4953032793,4953032794,4953032796,4953032797,4953032799,4953032800,4953032802,4953032803,4953032806,4953032808,4953032809,4953032811,4953032812,4953032814,4953032815,4953032818,4953032820,4953032821,4953032823,4953032824,4953032826,4953032827,4953032829,4953032830,4953032832,4953032833,4953032835,4953032836,4953032838,4953032839,4953032841,4953032842,4953032844,4953032845,4953032847,4953032848,4953032850,4953032851,4953032854,4953032857,4953032860,4953032863,4953032866,4953032869,4953032872,4953032875,4953032878,4953033001,4953033027,4953033030,4953033033,4953033036,4953033039,4953033042,4953033045,4953033048,4953033051,4953033054,4953033057,4953033060,4953033063,4953033069,4953033072,4953033075,4953033078,4953033081,4953033084,4953033253,4953033256,4953033259,4953033262,4953033265,4953033268,4953033270,4953033271,4953033273,4953033274,4953033276,4953033277,4953033279,4953033280,4953033282,4953033283,4953033285,4953033286,4953033288,4953033289,4953033291,4953033292,4953033294,4953033295,4953033297,4953033298,4953033300,4953033301,4953033303,4953033304,4953033306,4953033307,4953033309,4953033310,4953033312,4953033313,4953033315,4953033316,4953033318,4953033319,4953033321,4953033322,4953033324,4953033325,4953033328,4953033331,4953033334,4953033337,4953033340,4953033343,4953033346,4953033349,4953033352,4953033358,4953033481,4953033484,4953033487,4953033490,4953033493,4953033496,4953033499,4953033502,4953033505,4953033508,4953033511,4953033514,4953033517,4953033520,4953033523,4953033526,4953033529,4953033532,4953033535,4953033538,4953033541,4953033544,4953033547,4953033550,4953033553,4953033556,4953033559,4953033562,4953033565,4953033568,4953033571,4953033574,4953033748,4953033751,4953033754,4953033757,4953033760,4953033763,4953033765,4953033766,4953033768,4953033769,4953033771,4953033772,4953033774,4953033775,4953033777,4953033778,4953033780,4953033781,4953033783,4953033784,4953033786,4953033787,4953033789,4953033790,4953033792,4953033793,4953033795,4953033796,4953033798,4953033801,4953033804,4953033807,4953033810,4953033813,4953033816,4953033819,4953033822,4953033825,4953033828,4953033829,4953033831,4953033832,4953033834,4953033835,4953033837,4953033838,4953033960,4953033961,4953033963,4953033964,4953033966,4953033967,4953033969,4953033972,4953033973,4953033975,4953033976,4953033978,4953033981,4953033982,4953033984,4953033985,4953033987,4953033988,4953033990,4953033991,4953033993,4953033994,4953033996,4953033997,4953033999,4953034002,4953034005,4953034008,4953034011,4953034014,4953034017,4953034020,4953034023,4953034026,4953034032,4953034035,4953034038,4953034041,4953034044,4953034047,4953034050,4953034053,4953034056,4953034059,4953034062,4953034065,4953034068,4953034071,4953034072,4953034074,4953034075,4953034077,4953034078,4953034200,4953034201,4953034203,4953034204,4953034206,4953034207,4953034209,4953034210,4953034212,4953034213,4953034215,4953034216,4953034218,4953034219,4953034221,4953034222,4953034224,4953034225,4953034228,4953034231,4953034234,4953034237,4953034240,4953034243,4953034246,4953034762,4953034765,4953034768,4953034771,4953034774,4953034777,4953034780,4953034783,4953034786,4953034789,4953034792,4953034795,4953034798,4953034921,4953034924,4953034927,4953034930,4953034933,4953034936,4953034939,4953034942,4953034945,4953034948,4953034951,4953034954,4953034957,4953034960,4953034963,4953034966,4953034969,4953034972,4953034975,4953034978,4953034981,4953034984,4953034987,4953034990,4953034993,4953034996,4953034999,4953035002,4953035005,4953035008,4953035011,4953035014,4953035017,4953035020,4953035023,4953035251,4953035254,4953035257,4953035260,4953035263,4953035266,4953035269,4953035272,4953035275,4953035278,4953035401,4953035404,4953035407,4953035410,4953035413,4953035416,4953035419,4953035422,4953035425,4953035428,4953035431,4953035434,4953035437,4953035440,4953035443,4953035446,4953035449,4953035452,4953035455,4953035458,4953035461,4953035464,4953035467,4953035470,4953035473,4953035476,4953035479,4953035482,4953035485,4953035488,4953035491,4953035494,4953035497,4953035500,4953035503,4953035506,4953035509,4953035512,4953035515,4953035518,4953035641,4953035644,4953035647,4953035650,4953035653,4953035656,4953035659,4953035662,4953035665,4953035668,4953035671,4953035674,4953035677,4953035680,4953035683,4953035686,4953035689,4953035692,4953035695,4953035698,4953035701,4953035704,4953035707,4953035710,4953035713,4953035716,4953035719,4953035722,4953035725,4953035728,4953035731,4953035734,4953035737,4953035740,4953035743,4953035746,4953035749,4953035752,4953035755,4953035758,4953035881,4953035884,4953035887,4953035890,4953035893,4953035896,4953035899,4953035902,4953035905,4953035908,4953035911,4953035914,4953035917,4953035920,4953035923,4953035926,4953035929,4953035932,4953035935,4953035938,4953035941,4953035944,4953035947,4953035950,4953035953,4953035956,4953035959,4953035965,4953035968,4953035971,4953035974,4953035977,4953035980,4953035983,4953035986,4953035989,4953035992,4953035995,4953035998,4953036121,4953088308,4953088311,4953088314,4953088317,4953088440,4953088443,4953088446,4953088449,4953088452,4953088455,4953088458,4953088461,4953088512,4953088515,4953088518,4953088521,4953088527,4953088530,4953088533,4953088536,4953088539,4953088542,4953088545,4953088548,4953088953,4953088956,4953088959,4953088962,4953088965,4953088968,4953089169,4953089172,4953089175,4953089178,4953089181,4953089184,4953089187,4953089190,4953089193,4953089196,4953089199,4953089202,4953089205,4953089208,4953089211,4953089214,4953089217,4953089220,4953089223,4953089226,4953089229,4953089232,4953089235,4953089238,4953089241,4953089244,4953089247,4953089250,4953089253,4953089481,4953089484,4953089487,4953089490,4953089493,4953089496,4953089499,4953089502,4953089505,4953089508,4953089511,4953089514,4953089517,4953089640,4953089643,4953089646,4953089649,4953089652,4953089655,4953089658,4953089661,4953089664,4953089667,4953089670,4953089673,4953089676,4953089679,4953089682,4953089688,4953089691,4953089694,4953089697,4953089700,4953089703,4953089706,4953089709,4953100459,4953100462,4953100465,4953100468,4953100471,4953100474,4953100477,4953100480,4953100483,4953100486,4953100489,4953100492,4953100495,4953100498,4953100708,4953100711,4953100714,4953100717,4953100720,4953100723,4953100726,4953100729,4953100732,4953100735,4953100738,4953100741,4953100744,4953100747,4953100750,4953100753,4953100963,4953100966,4953100969,4953100972,4953100975,4953100978,4953100981,4953100984,4953100987,4953100990,4953100993,4953100996,4953100999,4953101002,4953101005,4953101008,4953101011,4953101014,4953101017,4953101020,4953101023,4953101026,4953101029,4953101032,4953101035,4953101038,4953101161,4953101164,4953101167,4953101170,4953101173,4953101176,4953101179,4953101182,4953101185,4953101188,4953101191,4953101194,4953101197,4953101200,4953101203,4953101956,4953101959,4953101962,4953101965,4953101968,4953101971,4953101974,4953101977,4953101983,4953101986,4953101989,4953101992,4953101995,4953101998,4953102121,4953102124,4953102127,4953102130,4953102133,4953102136,4953102139,4953102142,4953102145,4953102148,4953102151,4953102154,4953102157,4953102160,4953102163,4953102166,4953102169,4953102172,4953102175,4953102178,4953102181,4953102184,4953102187,4953102190,4953102193,4953102196,4953102199,4953102202,4953102205,4953102208,4953102616,4953102619,4953102622,4953102625,4953102628,4953102631,4953102634,4953102637,4953102640,4953102643,4953102646,4953102649,4953102652,4953102655,4953102658,4953102661,4953102664,4953102667,4953102670,4953102673,4953102676,4953102679,4953102682,4953102685,4953103333,4953103339,4953103342,4953103345,4953103348,4953103351,4953103354,4953103357,4953103360,4953103363,4953103366,4953103369,4953103372,4953103375,4953103378,4953103381,4953103384,4953103387,4953103390,4953103393,4953103396,4953103399,4953103402,4953103405,4953103408,4953103414,4953103417,4953103420,4953561994,4953615089,4953615281,4953615284,4953620624,4953623747,4953623750,4953623753,4953623756,4953628313,4953628316,4953628319,4953628442,4953628445,4953628448,4953628451,4953628454,4953628457,4953628460,4953628463,4953628466,4953628469,4953628472,4953628475,4953628478,4953628481,4953628484,4953628487,4953628490,4953628493,4953628496,4953628499,4953629033,4953629036,4953629039,4953629162,4953629165,4953629168,4953629171,4953629174,4953629177,4953629180,4953629183,4953629186,4953629189,4953629192,4953629195,4953629198,4953629201,4953629204,4953629207,4953629210,4953629213,4953629216,4953629219,4953629222,4953629228,4953629231,4953629234,4953629237,4953629240,4953629243,4953629246,4953629249,4953629252,4953629255,4953629258,4953629261,4953629264,4953629267,4953629270,4953629273,4953629276,4953629279,4953629402,4953629405,4953629408,4953629411,4953630707,4953630710,4953630713,4953630716,4953630719,4953630842,4953630845,4953630848,4953630851,4953630854,4953630857,4953630860,4953630863,4953630866,4953630869,4953630872,4953630875,4953630878,4953630881,4953630884,4953630887,4953631571,4953631574,4953631577,4953631580,4953631583,4953631586,4953631589,4953631592,4953631595,4953631598,4953631601,4953631604,4953631607,4953631610,4953631613,4953631616,4953631619,4953631622,4953631625,4953631628,4953631631,4953631634,4953631637,4953631640,4953631643,4953631646,4953631649,4953631652,4953631865,4953631868,4953631871,4953631874,4953631877,4953631880,4953631883,4953631886,4953631889,4953631892,4953631895,4953631898,4953631901,4953631904,4953631907,4953631910,4953631913,4953631916,4953631919,4953632042,4953632045,4953632048,4953632051,4953632054,4953632057,4953632060,4953632063,4953632372,4953632375,4953632378,4953632381,4953632384,4953632387,4953632390,4953632393,4953632828,4953632831,4953632834,4953632837,4953632840,4953632843,4953632846,4953632849,4953632852,4953632855,4953632858,4953632861,4953632864,4953632867,4953632870,4953632873,4953632876,4953632879,4953633002,4953633005,4953633008,4953633011,4953633014,4953633017,4953633020,4953633023,4953633026,4953633029,4953633518,4953633521,4953633524,4953633527,4953633530,4953633533,4953633536,4953633539,4953633542,4953633548,4953633551,4953633554,4953633557,4953633560,4953633563,4953633566,4953633569,4953633572,4953633575,4953633578,4953633581,4953633584,4953633587,4953633590,4953633593,4953633596,4953633599,4953633722,4953633725,4953633728,4953633731,4953633734,4953633737,4953633740,4953633743,4953633746,4953633749,4953633752,4953633755,4953633758,4953633761,4953633764,4953633767,4953633770,4953633773,4953633776,4953633779,4953633782,4953633785,4953633788,4953633791,4953633794,4953633797,4953633800,4953633803,4953633806,4953633809,4953633812,4953633815,4953633818,4953633821,4953634007,4953634010,4953634013,4953634016,4953634019,4953634022,4953634025,4953634028,4953634031,4953634034,4953634037,4953634040,4953634043,4953634046,4953634049,4953634052,4953634055,4953634058,4953634061,4953634064,4953634067,4953634070,4953634073,4953634076,4953634079,4953634202,4953634280,4953634283,4953634286,4953634289,4953634292,4953634295,4953634301,4953634304,4953634307,4953634310,4953634313,4953634316,4953634319,4953634442,4953634445,4953634448,4953634451,4953634454,4953634457,4953634541,4953634544,4953634547,4953634550,4953634553,4953634556,4953634559,4953634682,4953634685,4953634688,4953634691,4953634694,4953634697,4953634700,4953634751,4953634754,4953634757,4953634760,4953634763,4953634766,4953634769,4953634772,4953634775,4953634778,4953634781,4953634784,4953634940,4953634943,4953634946,4953634949,4953634952,4953634955,4953634958,4953634961,4953634964,4953634967,4953634970,4953634973,4953635033,4953635036,4953635039,4953635162,4953635165,4953635168,4953635171,4953635174,4953635177,4953635180,4953635183,4953635186,4953635189,4953635192,4953635195,4953635198,4953635201,4953635204,4953635207,4953635210,4953635213,4953635216,4953635219,4953635222,4953635225,4953635228,4953635231,4953635234,4953635237,4953635240,4953635243,4953635246,4953635249,4953635252,4953635255,4953635258,4953635261,4953635264,4953635267,4953635270,4953635273,4953635276,4953635279,4953635402,4953635405,4953635408,4953635411,4953635414,4953635723,4953635726,4953635729,4953635732,4953635735,4953635738,4953635741,4953635744,4953635747,4953635750,4953635753,4953635756,4953635759,4953635882,4953635885,4953635888,4953635891,4953635894,4953635897,4953635900,4953635903,4953635906,4953635909,4953635912,4953635915,4953635918,4953635921,4953635924,4953635927,4953635930,4953635933,4953635936,4953635939,4953635942,4953635945,4953635948,4953635951,4953635954,4953635957,4953635960,4953635963,4953635966,4953635969,4953635972,4953635975,4953635978,4953635981,4953635984,4953635987,4953635990,4953635993,4953635996,4953635999,4953636122,4953636125,4953636128,4953636131,4953636134,4953636137,4953636140,4953636143,4953636146,4953636149,4953636152,4953636155,4953636158,4953636161,4953636164,4953636167,4953636170,4953636173,4953637172,4953637175,4953637178,4953637181,4953637184,4953637187,4953637190,4953637193,4953637196,4953637199,4953637322,4953637325,4953637328,4953637331,4953637334,4953637337,4953637340,4953637343,4953637346,4953637349,4953637352,4953637355,4953637358,4953637361,4953637364,4953637367,4953637370,4953637832,4953637835,4953637838,4953637841,4953637844,4953638351,4953638354,4953638357,4953638360,4953638363,4953638366,4953638369,4953638390,4953638393,4953638396,4953638399,4953638522,4953638525,4953638528,4953638531,4953639077,4953639080,4953639083,4953639086,4953639089,4953639095,4953639098,4953639101,4953639104,4953639107,4953639110,4953639113,4953639116,4953639119,4953639242,4953639245,4953639248,4953639251,4953639254,4953639257,4953639260,4953639998,4953640001,4953640004,4953640007,4953640010,4953640013,4953640016,4953640019,4953640022,4953640025,4953640028,4953640031,4953640034,4953640037,4953640040,4953640043,4953640046,4953640049,4953640052,4953640055,4953640058,4953640061,4953640064,4953640067,4953640070,4953640073,4953640076,4953640079,4953640202,4953640205,4953640208,4953640211,4953640214,4953640217,4953640220,4953640223,4953640226,4953640229,4953640232,4953640235,4953640238,4953640241,4953640244,4953640247,4953640250,4953640253,4953640256,4953640259,4953640262,4953640265,4953640268,4953640271,4953640274,4953640277,4953640280,4953640283,4953640286,4953640289,4953640292,4953640295,4953640298,4953640301,4953640304,4953640307,4953640310,4953640313,4953640316,4953640319,4953640442,4953640445,4953640448,4953691091,4953691094,4953691097,4953691100,4953691103,4953691106,4953691109,4953691112,4953691115,4953691118,4953691121,4953691124,4953691127,4953692117,4953692120,4953692123,4953692126,4953692129,4953692132,4953692135,4953692138,4953692141,4953692144,4953692147,4953692150,4953692153,4953692156,4953692282,4953692285,4953692288,4953692291,4953692294,4953692297,4953692300,4953692561,4953692564,4953692567,4953692570,4953692573,4953692576,4953692579,4953692582,4953699284,4953699287,4953699290,4953699293,4953699296,4953699299,4953699302,4953699305,4953699308,4953699311,4953699314,4953699317,4953699320,4953699509,4953699512,4953699515,4953699518,4953699521,4953699524,4953699527,4953699530,4953699533,4953699536,4953699539,4953699542,4953699545,4953700223,4953700226,4953700229,4953700232,4953700235,4953700238,4953700241,4953700244,4953700247,4953700250,4953700253,4953700256,4953700259,4953700262,4953700265,4953700268,4953700271,4953700274,4953700277,4953700280,4953700283,4953700286,4953700289,4953700292,4953700295,4953700298,4953700301,4953700304,4953700307,4953700310,4953700313,4953700316,4953700319,4953700442,4953700445,4953700448,4953700451,4953700454,4953700457,4953700460,4953700463,4953700466,4953700469,4953700472,4953700475,4953700478,4953700481,4953700484,4953700487,4953700490,4953700493,4953700496,4953700499,4953700502,4953700505,4953700997,4953701000,4953701003,4953701006,4953701009,4953701012,4953701015,4953701018,4953701021,4953701024,4953701027,4953701030,4953701033,4953701036,4953701039,4954044942,4955981245,4956216414,4956359904,4957449531,4957639563,4958693740,4959397379,4963347489,4963865755,4964615668,4966671794,4969121502,4970750314,4973193737,4974103111,4974150367,4974378154,4974421332,4974425718,4974440616,4974909599,4974917942,4979472123,4979611347,4980225738,4980650368,4981770423,4981785022,4986877832,4986883844,4988662283,4988900800,4991279479,4991670386,4992010014,4994594770,4995359684,4995363299,4995664790,4999774536,5000134545,5000531182,5000790614,5002624314,5004234716,5004633266,5008215061,5008428214,5008578370,5008712810,5008745198,5014861653,5015013326,5015090527,5017206401,5017211213,5017538127,5017618519,5017627117,5017870049,5017880045,5017883228,5017885847,5018142683,5021626786,5021627014,5021813162,5021825735,5022785722,5025139359,5025900936,5026186056,5026345895,5026345898,5026345901,5026347272,5026347275,5026347278,5028262453,5030227901,5030518988,5030540588,5031882476,5032005985,5032875755,5033068546,5033147678,5033399504,5036877296,5038982846,5039432802,5039859334,5043072122,5044224363,5045215890,5045865300,5046315350,5048369906,5048446713,5048474394,5048578765,5048601256,5048623579,5048855939,5048896271,5050775506,5050778583,5050809297,5050843576,5050968908,5051124121,5051222297,5051271119,5051688660,5051862705,5051944022,5051947906,5052097433,5052185267,5052565344,5052730032,5053181642,5053400058,5053576784,5053870473,5053964526,5053966221,5054016391,5054084392,5054373104,5054447492,5054452955,5054530278,5054787810,5055062315,5057105967,5057697540,5057806207,5057875390,5058276148,5058377727,5058861737,5059371296,5059834957,5060729907,5060834785,5060861401,5061051527,5061266805,5061268302,5061269181,5061269682,5061270627,5061272340,5061272559,5061330228,5061343914,5061352530,5061362334,5061407488,5061408202,5061408412,5061408865,5061448300,5061495055,5061517111,5061522454,5061536854,5061682511,5061682754,5061684407,5061685811,5061686075,5061687005,5061687752,5061688226,5061749423,5061754304,5061763568,5061779459,5061786875,5061844497,5061935188,5062022134,5062036973,5062197245,5062197248,5062278134,5063987482,5064212783,5064301367,5064381354,5065257484,5065269253,5066033682,5066215643,5066846589,5067002580,5067007893,5067056869,5067064482,5067665882,5069046955,5069513429,5070021491],"isLive":false,"richLink":"/environment/2015/oct/19/sign-up-to-the-green-light-email","campaigns":[],"isLiveBlog":false,"pageCode":"5475429","avatarImagesUrl":"https://avatar.guim.co.uk","publication":"The Guardian","sentryHost":"app.getsentry.com/35463","buildNumber":"30025","sharedAdTargeting":{"se":["seascape-the-state-of-our-oceans"],"ct":"article","co":["eleanor-ainge-roy"],"url":"/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings","br":"f","su":["0"],"edition":"us","tn":["features"],"p":"ng","k":["asia-pacific","wildlife","newzealand","world","cetaceans","whales","environment","marine-life","oceans"],"sh":"https://gu.com/p/a84nt"},"onwardWebSocket":"ws://api.nextgen.guardianapps.co.uk/recently-published","productionOffice":"Aus","shouldHideAdverts":false,"pbIndexSites":[{"bp":"D","id":208264},{"bp":"M","id":213535},{"bp":"T","id":215470}],"googletagJsUrl":"//www.googletagservices.com/tag/js/gpt.js","idApiUrl":"https://idapi.theguardian.com","calloutsUrl":"https://callouts.code.dev-guardianapis.com/formstack-campaign/submit","isPreview":false},"nav":{"currentUrl":"/environment/wildlife","pillars":[{"title":"News","url":"/","longTitle":"Headlines","iconName":"home","children":[{"title":"US","url":"/us-news","longTitle":"US news","iconName":"","children":[],"classList":[]},{"title":"World","url":"/world","longTitle":"World news","iconName":"","children":[{"title":"Europe","url":"/world/europe-news","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"US","url":"/us-news","longTitle":"US news","iconName":"","children":[],"classList":[]},{"title":"Americas","url":"/world/americas","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Asia","url":"/world/asia","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Australia","url":"/australia-news","longTitle":"Australia news","iconName":"","children":[],"classList":[]},{"title":"Middle East","url":"/world/middleeast","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Africa","url":"/world/africa","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Inequality","url":"/inequality","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Cities","url":"/cities","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Global development","url":"/global-development","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Environment","url":"/environment","longTitle":"","iconName":"","children":[{"title":"Climate change","url":"/environment/climate-change","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Energy","url":"/environment/energy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pollution","url":"/environment/pollution","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Soccer","url":"/football","longTitle":"","iconName":"","children":[{"title":"Live scores","url":"/football/live","longTitle":"football/live","iconName":"","children":[],"classList":[]},{"title":"Tables","url":"/football/tables","longTitle":"football/tables","iconName":"","children":[],"classList":[]},{"title":"Fixtures","url":"/football/fixtures","longTitle":"football/fixtures","iconName":"","children":[],"classList":[]},{"title":"Results","url":"/football/results","longTitle":"football/results","iconName":"","children":[],"classList":[]},{"title":"Competitions","url":"/football/competitions","longTitle":"football/competitions","iconName":"","children":[],"classList":[]},{"title":"Clubs","url":"/football/teams","longTitle":"football/teams","iconName":"","children":[],"classList":[]},{"title":"World Cup 2019","url":"/football/womens-world-cup-2019","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"US Politics","url":"/us-news/us-politics","longTitle":"US politics","iconName":"","children":[],"classList":[]},{"title":"Business","url":"/business","longTitle":"","iconName":"","children":[{"title":"Economics","url":"/business/economics","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Sustainable business","url":"/us/sustainable-business","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Diversity & equality in business","url":"/business/diversity-and-equality","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Small business","url":"/business/us-small-business","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Tech","url":"/technology","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Science","url":"/science","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Opinion","url":"/commentisfree","longTitle":"Opinion home","iconName":"home","children":[{"title":"The Guardian view","url":"/profile/editorial","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Columnists","url":"/index/contributors","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Letters","url":"/tone/letters","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Opinion videos","url":"/commentisfree/series/comment-is-free-weekly","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Cartoons","url":"/cartoons/archive","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Sport","url":"/sport","longTitle":"Sport home","iconName":"home","children":[{"title":"Soccer","url":"/football","longTitle":"","iconName":"","children":[{"title":"Live scores","url":"/football/live","longTitle":"football/live","iconName":"","children":[],"classList":[]},{"title":"Tables","url":"/football/tables","longTitle":"football/tables","iconName":"","children":[],"classList":[]},{"title":"Fixtures","url":"/football/fixtures","longTitle":"football/fixtures","iconName":"","children":[],"classList":[]},{"title":"Results","url":"/football/results","longTitle":"football/results","iconName":"","children":[],"classList":[]},{"title":"Competitions","url":"/football/competitions","longTitle":"football/competitions","iconName":"","children":[],"classList":[]},{"title":"Clubs","url":"/football/teams","longTitle":"football/teams","iconName":"","children":[],"classList":[]},{"title":"World Cup 2019","url":"/football/womens-world-cup-2019","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"NFL","url":"/sport/nfl","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Tennis","url":"/sport/tennis","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"MLB","url":"/sport/mlb","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"MLS","url":"/football/mls","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"NBA","url":"/sport/nba","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"NHL","url":"/sport/nhl","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Culture","url":"/culture","longTitle":"Culture home","iconName":"home","children":[{"title":"Film","url":"/film","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Books","url":"/books","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Music","url":"/music","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Art & design","url":"/artanddesign","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"TV & radio","url":"/tv-and-radio","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Stage","url":"/stage","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Classical","url":"/music/classicalmusicandopera","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Games","url":"/games","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Lifestyle","url":"/lifeandstyle","longTitle":"Lifestyle home","iconName":"home","children":[{"title":"Fashion","url":"/fashion","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Food","url":"/food","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Recipes","url":"/tone/recipes","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Love & sex","url":"/lifeandstyle/love-and-sex","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Home & garden","url":"/lifeandstyle/home-and-garden","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Health & fitness","url":"/lifeandstyle/health-and-wellbeing","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Family","url":"/lifeandstyle/family","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Travel","url":"/travel","longTitle":"","iconName":"","children":[{"title":"US","url":"/travel/usa","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Europe","url":"/travel/europe","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"UK","url":"/travel/uk","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Money","url":"/money","longTitle":"","iconName":"","children":[{"title":"Property","url":"/money/property","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pensions","url":"/money/pensions","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Savings","url":"/money/savings","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Borrowing","url":"/money/debt","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Careers","url":"/money/work-and-careers","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]}],"classList":[]}],"otherLinks":[{"title":"The Guardian app","url":"https://www.theguardian.com/mobile/2014/may/29/the-guardian-for-mobile-and-tablet","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Video","url":"/video","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Podcasts","url":"/podcasts","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pictures","url":"/inpictures","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Newsletters","url":"/email-newsletters","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Inside the Guardian","url":"https://www.theguardian.com/membership","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Guardian Weekly","url":"https://www.theguardian.com/weekly?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_US","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Crosswords","url":"/crosswords","longTitle":"","iconName":"","children":[{"title":"Blog","url":"/crosswords/crossword-blog","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Editor","url":"/crosswords/series/crossword-editor-update","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Quick","url":"/crosswords/series/quick","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Cryptic","url":"/crosswords/series/cryptic","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Prize","url":"/crosswords/series/prize","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Weekend","url":"/crosswords/series/weekend-crossword","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Quiptic","url":"/crosswords/series/quiptic","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Genius","url":"/crosswords/series/genius","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Speedy","url":"/crosswords/series/speedy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Everyman","url":"/crosswords/series/everyman","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Azed","url":"/crosswords/series/azed","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]}],"brandExtensions":[{"title":"Search jobs","url":"https://jobs.theguardian.com/jobs?INTCMP=jobs_us_web_newheader","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Digital Archive","url":"https://theguardian.newspapers.com","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Discount Codes","url":"https://discountcode.theguardian.com","longTitle":"","iconName":"","children":[],"classList":[]}],"currentNavLink":{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},"currentParent":{"title":"Environment","url":"/environment","longTitle":"","iconName":"","children":[{"title":"Climate change","url":"/environment/climate-change","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Energy","url":"/environment/energy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pollution","url":"/environment/pollution","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},"currentPillar":{"title":"News","url":"/","longTitle":"Headlines","iconName":"home","children":[{"title":"US","url":"/us-news","longTitle":"US news","iconName":"","children":[],"classList":[]},{"title":"World","url":"/world","longTitle":"World news","iconName":"","children":[{"title":"Europe","url":"/world/europe-news","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"US","url":"/us-news","longTitle":"US news","iconName":"","children":[],"classList":[]},{"title":"Americas","url":"/world/americas","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Asia","url":"/world/asia","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Australia","url":"/australia-news","longTitle":"Australia news","iconName":"","children":[],"classList":[]},{"title":"Middle East","url":"/world/middleeast","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Africa","url":"/world/africa","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Inequality","url":"/inequality","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Cities","url":"/cities","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Global development","url":"/global-development","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Environment","url":"/environment","longTitle":"","iconName":"","children":[{"title":"Climate change","url":"/environment/climate-change","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Energy","url":"/environment/energy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pollution","url":"/environment/pollution","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Soccer","url":"/football","longTitle":"","iconName":"","children":[{"title":"Live scores","url":"/football/live","longTitle":"football/live","iconName":"","children":[],"classList":[]},{"title":"Tables","url":"/football/tables","longTitle":"football/tables","iconName":"","children":[],"classList":[]},{"title":"Fixtures","url":"/football/fixtures","longTitle":"football/fixtures","iconName":"","children":[],"classList":[]},{"title":"Results","url":"/football/results","longTitle":"football/results","iconName":"","children":[],"classList":[]},{"title":"Competitions","url":"/football/competitions","longTitle":"football/competitions","iconName":"","children":[],"classList":[]},{"title":"Clubs","url":"/football/teams","longTitle":"football/teams","iconName":"","children":[],"classList":[]},{"title":"World Cup 2019","url":"/football/womens-world-cup-2019","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"US Politics","url":"/us-news/us-politics","longTitle":"US politics","iconName":"","children":[],"classList":[]},{"title":"Business","url":"/business","longTitle":"","iconName":"","children":[{"title":"Economics","url":"/business/economics","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Sustainable business","url":"/us/sustainable-business","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Diversity & equality in business","url":"/business/diversity-and-equality","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Small business","url":"/business/us-small-business","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},{"title":"Tech","url":"/technology","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Science","url":"/science","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},"subNavSections":{"parent":{"title":"Environment","url":"/environment","longTitle":"","iconName":"","children":[{"title":"Climate change","url":"/environment/climate-change","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Energy","url":"/environment/energy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pollution","url":"/environment/pollution","longTitle":"","iconName":"","children":[],"classList":[]}],"classList":[]},"links":[{"title":"Climate change","url":"/environment/climate-change","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Wildlife","url":"/environment/wildlife","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Energy","url":"/environment/energy","longTitle":"","iconName":"","children":[],"classList":[]},{"title":"Pollution","url":"/environment/pollution","longTitle":"","iconName":"","children":[],"classList":[]}]}},"switches":{"audioOnwardJourneySwitch":true,"idEmailSignInUpsell":false,"idCookieRefresh":true,"boostGaUserTimingFidelity":false,"thirdPartyEmbedTracking":true,"scrollDepth":true,"enableSentryReporting":true,"ophan":true,"lazyLoadImages":true,"serviceWorkerEnabled":false,"discussionPageSize":true,"externalVideoEmbeds":true,"relatedContent":true,"autoRefresh":true,"lazyLoadContainers":true,"enableDiscussionSwitch":true,"registerWithPhone":false,"discussionAllowAnonymousRecommendsSwitch":false,"discussionAllPageSize":true,"prebidS2sozone":true,"prebidAdYouLike":true,"prebidXaxis":true,"prebidImproveDigital":true,"prebidTrustx":true,"prebidPubmatic":true,"prebidPangaea":true,"prebidOzone":false,"prebidOpenx":true,"prebidIndexExchange":true,"prebidAppnexusInvcode":true,"prebidAppnexusUkRow":true,"prebidAppnexus":true,"prebidSonobi":true,"prebidUserSync":true,"ampPrebid":true,"prebidAnalytics":true,"facebookTrackingPixel":true,"commercialPageViewAnalytics":true,"enableConsentManagementService":true,"lotame":true,"kruxVideoTracking":false,"abAdblockAsk":true,"membershipEngagementBannerBlockAu":false,"membershipEngagementBannerBlockUs":false,"membershipEngagementBannerBlockUk":false,"engagementBannerTestsFromGoogleDocs":true,"epicTestsFromGoogleDocs":true,"membershipEngagementBanner":true,"simpleReach":true,"remarketing":true,"krux":true,"adomik":true,"inizio":true,"imrWorldwide":true,"adFreeStrictExpiryEnforcement":false,"hostedVideoAutoplay":true,"surveys":true,"commercialOutbrainNewids":true,"iasAdTargeting":true,"carrotTrafficDriver":true,"commercial":true,"abCommercialConsentGlobalBanner":true,"abCommercialOutbrainTesting":true,"abCommercialAdVerification":false,"abCommercialPrebidSafeframe":true,"abAcquisitionsEpicAlwaysAskIfTagged":true,"abContributionsGlobalMobileBannerDesign":true,"abContributionsEpicAskFourEarning":true,"abCommercialCmpCustomise":true,"lazyLoadImages":true,"oldTlsSupportDeprecation":true,"subscribeWithGoogle":false,"scAdFreeBanner":true,"weAreHiring":false,"youtubeRelatedVideos":true,"targeting":true,"sharingComments":true,"smartAppBanner":true,"emailSignupEuRef":true,"emailSignupLabNotes":true,"emailInArticleOutbrain":true,"emailInArticleGtoday":true,"emailInArticle":true,"emailInlineInFooter":true,"crosswordSvgThumbnails":true,"historyTags":true,"weather":true,"breakingNews":true,"videojs":true,"enhanceTweets":true,"idProfileNavigation":true,"googleSearch":true,"webFonts":true,"mostViewedFronts":true,"extendedMostPopularFronts":true,"extendedMostPopular":true,"geoMostPopular":true,"plistaForOutbrainAu":true,"outbrain":true,"serverShareCounts":true},"tests":{"oldTlsSupportDeprecationControl":"control"},"modules":{"tracking":{"ready":null}},"images":{"commercial":{"ab-icon":"https:\/\/assets.guim.co.uk\/images\/commercial\/504a6bc5825d269eaf8ffdc77ad1f5b8\/ab-icon.png","abp-icon":"https:\/\/assets.guim.co.uk\/images\/commercial\/15fa8f9f99ce2a6b804097d348622727\/abp-icon.png","abp-whitelist-instruction-chrome":"https:\/\/assets.guim.co.uk\/images\/commercial\/862b03a008061af5c3b77c1f2dd52dd4\/ad-block-instructions-chrome.png"},"acquisitions":{"payment-methods":"https:\/\/assets.guim.co.uk\/images\/acquisitions\/2db3a266287f452355b68d4240df8087\/payment-methods.png","info-logo":"https:\/\/assets.guim.co.uk\/images\/acquisitions\/d0984d9e2f0ed847157bc15c86cc4305\/info-logo.svg","ad-free":"https:\/\/assets.guim.co.uk\/images\/acquisitions\/76f1874898805a939efeacfba097b400\/ad-free.svg"},"journalism":{"apple-podcast-logo":"https:\/\/assets.guim.co.uk\/images\/journalism\/1956a067ce99e2a45e88c7dc2ec0260e\/apple-podcast-icon-48.png"}},"stylesheets":{"fonts":{"hintingCleartype":{"kerningOn":"https:\/\/assets.guim.co.uk\/stylesheets\/9f78997fd3b37533007e55334c9e7c8b\/webfonts-hinting-cleartype-kerning-on.css"},"hintingOff":{"kerningOn":"https:\/\/assets.guim.co.uk\/stylesheets\/50441b3bda46af4af85a3f0a1b61f8bb\/webfonts-hinting-off-kerning-on.css"},"hintingAuto":{"kerningOn":"https:\/\/assets.guim.co.uk\/stylesheets\/4f3512b7ca058a60dea4f4b994ab4ebc\/webfonts-hinting-auto-kerning-on.css"}}},"googleAnalytics":{"trackers":{"editorialTest":"guardianTestPropertyTracker","editorialProd":"allEditorialPropertyTracker","editorial":"allEditorialPropertyTracker"},"timingEvents":[]},"libs":{"googletag":"\/\/www.googletagservices.com\/tag\/js\/gpt.js","cmp":{"fullVendorDataUrl":"https:\/\/assets.guim.co.uk\/data\/vendor\/de2f6ff4987b229fcf6d6268ac7f2e4f\/cmp_vendorlist.json"},"facebookAccountId":"279880532344561"}}};if(window.esi&&window.esi.viewId){window.guardian.config.ophan={pageViewId:window.esi.viewId};}else{window.guardian.config.ophan={pageViewId:new Date().getTime().toString(36)+'xxxxxxxxxxxx'.replace(/x/g,function(){return Math.floor(Math.random()*36).toString(36);})};}/*@cc_on
+ @if (@_jscript_version <= 9)
+ guardian.config.page.ajaxUrl = guardian.config.page.ajaxUrl.replace(/^https:/, '');
+ @end
+ @*/(function(documentElement,window,navigator){var docClass=documentElement.className;var testCssSupportForPropertyAndValue=function(supportsSupports){return supportsSupports?nativeCSSSupports:shimCSSSupports()}("CSS"in window&&"supports"in window.CSS);function nativeCSSSupports(prop,value){return window.CSS.supports(prop,value)}function shimCSSSupports(){var cssToDOMRegExp=/([a-z])-([a-z])/g;var testElem=document.createElement("test");function cssToDOM(name){return name.replace(cssToDOMRegExp,cssToDOMReplacer).replace(/^-/,"")}function cssToDOMReplacer(str,m1,m2){return m1+m2.toUpperCase()}return function(prop,value){try{prop=cssToDOM(prop);var originalValue=testElem.style[prop];if(originalValue===undefined)return false;if(originalValue===value)return true;testElem.style[prop]=value;return testElem.style[prop]!==originalValue}catch(e){return false}}}function testAndAddClass(tests){docClass+=" "+tests.map(function(test){return(test.props.some(function(prop){return test.values.some(function(value){return testCssSupportForPropertyAndValue(prop,value)})})?"has-":"has-no-")+test.feature}).join(" ")}function getCookieValue(name){var val=document.cookie.match("(^|;)\\s*"+name+"\\s*\x3d\\s*([^;]+)");return val?val.pop():undefined}function isRecentContributor(){var value=getCookieValue("gu.contributions.contrib-timestamp");if(!value)return false;var now=(new Date).getTime();var lastContribution=(new Date(value)).getTime();var diffDays=Math.ceil((now-lastContribution)/(1E3*3600*24));return diffDays<=180}function shouldHideSupportMessaging(){return getCookieValue("gu_hide_support_messaging")==="true"}function forcePercentagePadding(){var firefoxMatch=navigator.userAgent.match(/Firefox\/([0-9]+)\./)||[];if(firefoxMatch.length===2&&parseInt(firefoxMatch[1],10)<54)return true;return false}if(!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)docClass+=" svg";else docClass+=" no-svg";testAndAddClass([{feature:"flex",props:["flex","-ms-flex","-webkit-flex","-moz-box-flex","-webkit-box-flex"],values:["inherit"]},{feature:"flex-wrap",props:["flex-wrap","-ms-flex-wrap","-webkit-flex-wrap"],values:["inherit"]},{feature:"fixed",props:["position"],values:["fixed"]},{feature:"sticky",props:["position"],values:["sticky","-webkit-sticky"]}]);if(window.guardian.isEnhanced)docClass=docClass.replace(/\bis-not-modern\b/g,"is-modern");if(window.location.hash!=="#no-kern")docClass+=" should-kern";var baseFontSize=null;if("getComputedStyle"in window)baseFontSize=window.getComputedStyle(documentElement).getPropertyValue("font-size");if(baseFontSize&&parseInt(baseFontSize,10)!==16)documentElement.style.fontSize=baseFontSize;if(shouldHideSupportMessaging())docClass+=" hide-support-messaging";if(isRecentContributor())docClass+=" is-recent-contributor";if(forcePercentagePadding())docClass+=" force-percentage-padding";documentElement.className=docClass.replace(/\bjs-off\b/g,"js-on")})(document.documentElement,window,navigator);(function(window,document){var ua=navigator.userAgent;var shouldHint=function(){var windowsNT=/Windows NT (\d\.\d+)/.exec(ua);try{if(windowsNT){var version=parseFloat(windowsNT[1],10);if(version>=5.1&&version<=6.1)return true}}catch(e){}return false}();function loadFontsFromStorage(){try{if("localStorage"in window){var saveFont=function(fontName,fontHash,css){for(var i=0,totalItems=localStorage.length;i<totalItems-1;i++){var key=localStorage.key(i);if(key.indexOf(fontStorageKey(fontName))!==-1){localStorage.removeItem(key);break}}localStorage.setItem(fontStorageKey(fontName,fontHash),JSON.stringify({value:css}))};var fetchFont=function(url,el,fontName,fontHash){var xhr=new XMLHttpRequest;this["guFont"]=function(fontData){return fontData.css};xhr.open("GET",url,true);xhr.onreadystatechange=function(){if(xhr.readyState===4&&xhr.status===200){var css=eval(xhr.responseText);useFont(el,css,fontName);saveFont(fontName,fontHash,css)}};xhr.send()};var useFont=function(el,css,fontName){el.innerHTML=css};var fontStorageKey=function(fontName,fontHash){fontHash=fontHash===undefined?"":fontHash;return"gu.fonts."+fontName+"."+fontHash};var fontFormat=function(){var formatStorageKey="gu.fonts.format";var format=localStorage.getItem(formatStorageKey);function supportsWoff2(){if("FontFace"in window)try{var f=new window.FontFace("t",'url("data:application/font-woff2,") format("woff2")',{});f.load()["catch"](function(){});if(f.status==="loading")return true}catch(e){}if(!/edge\/([0-9]+)/.test(ua.toLowerCase())){var browser=/(chrome|firefox)\/([0-9]+)/.exec(ua.toLowerCase());var supportsWoff2$0={"chrome":36,"firefox":39};return!!browser&&supportsWoff2$0[browser[1]]<parseInt(browser[2],10)}return false}if(/value/.test(format)){format=JSON.parse(format).value;localStorage.setItem(formatStorageKey,format)}if(!format){format=supportsWoff2()?"woff2":ua.indexOf("android")>-1?"ttf":"woff";localStorage.setItem(formatStorageKey,format)}return format}();var fonts=document.querySelectorAll(".webfont");var urlAttribute=shouldHint?"data-cache-file-hinted-"+fontFormat:"data-cache-file-"+fontFormat;for(var i=0,j=fonts.length;i<j;++i){var font=fonts[i];var fontURL=font.getAttribute(urlAttribute);var fontInfo=fontURL.match(/fonts\/([^/]*?)\/?([^/]*)\.(woff2|woff|ttf).json$/);var fontName=fontInfo[2];var fontHash=fontInfo[1];var fontData=localStorage.getItem(fontStorageKey(fontName,fontHash));if(fontData)useFont(font,JSON.parse(fontData).value,fontName);else fetchFont(fontURL,font,fontName,fontHash)}return true}}catch(e){}return false}function loadFontsAsynchronously(){try{var scripts=document.getElementsByTagName("script");var thisScript=scripts[scripts.length-1];var fonts=document.createElement("link");fonts.rel="stylesheet";fonts.className="webfonts";fonts.href=window.guardian.config.stylesheets.fonts[shouldHint?"hintingAuto":"hintingOff"].kerningOn;window.setTimeout(function(){thisScript.parentNode.insertBefore(fonts,thisScript)})}catch(e){}}function fontSmoothingEnabled(){try{var saveFontSmoothing=function(state){state=state?"on":"off";document.cookie="GU_fonts_smoothing\x3d "+state+"; domain\x3d"+location.hostname+"; path\x3d/; max-age\x3d"+60*60*24*30};if(document.cookie.indexOf("GU_fonts_smoothing")!==-1&&window.location.hash!=="#check-smoothing")return document.cookie.indexOf("GU_fonts_smoothing\x3don")!==-1;if(/Windows NT (\d\.\d+)/.exec(ua)&&!/MSIE|Trident/.exec(ua)){try{var canvasNode=document.createElement("canvas");canvasNode.width="35";canvasNode.height="35";canvasNode.style.display="none";document.documentElement.appendChild(canvasNode);var ctx=canvasNode.getContext("2d");ctx.textBaseline="top";ctx.font="32px Arial";ctx.fillStyle="black";ctx.strokeStyle="black";ctx.fillText("@",0,0);for(var x=0;x<=16;x++)for(var y=0;y<=16;y++){var alpha=ctx.getImageData(x,y,1,1).data[3];if(alpha>0&&alpha<255){saveFontSmoothing(true);return true}}}catch(e){}saveFontSmoothing(false);return false}else return true}catch(e$1){}}var fontCookie="GU_fonts\x3doff; domain\x3d"+location.hostname+"; path\x3d/";function disableFonts(){document.cookie=fontCookie+"; max-age\x3d"+60*60*24*365}function enableFonts(){document.cookie=fontCookie+"; expires\x3dThu, 01 Jan 1970 00:00:00 GMT"}function checkUserFontDisabling(){if(window.location.hash==="#fonts-off")disableFonts();else if(window.location.hash==="#fonts-on"||window.location.hash==="#check-smoothing")enableFonts()}var fontsEnabled=document.cookie.indexOf("GU_fonts\x3doff")===-1;function loadFonts(){checkUserFontDisabling();if(fontsEnabled)if(fontSmoothingEnabled())loadFontsFromStorage()||loadFontsAsynchronously();else disableFonts()}loadFonts()})(window,document);(function(styleSheetLinks,documentStyleSheets){function setMedia(styleSheet){for(var i=0,totalSheets=documentStyleSheets.length;i<totalSheets;i++){var sheet=documentStyleSheets[i];if(sheet.href&&sheet.href.indexOf(styleSheet.href)>-1){styleSheet.media="screen";window.guardian.css.loaded=true;try{window.guardian.css.onLoad()}catch(e){}return true}}setTimeout(function(){setMedia(styleSheet)})}function useCss(){for(var i=0,totalStyleSheetLinks=styleSheetLinks.length;i<totalStyleSheetLinks;i++)if(styleSheetLinks[i].getAttribute("media")==="only x")setMedia(styleSheetLinks[i])}useCss()})(document.getElementsByTagName("link"),window.document.styleSheets);function guardianPolyfilled(){try{window.guardian.polyfilled=true;window.guardian.onPolyfilled()}catch(e){}}(function(document,window){var src;var script;var pendingScripts=[];var firstScript=document.scripts[0];var scripts=["https://assets.guim.co.uk/polyfill.io/v3/polyfill.min.js?rum\x3d0\x26features\x3des6,es7,es2017,default-3.6,HTMLPictureElement,IntersectionObserver,IntersectionObserverEntry\x26flags\x3dgated\x26callback\x3dguardianPolyfilled\x26unknown\x3dpolyfill\x26clearCache\x3d2","https://assets.guim.co.uk/javascripts/0a18d241db2e4f5e128a/graun.standard.js"];function stateChange(){var pendingScript;while(pendingScripts[0]&&pendingScripts[0].readyState=="loaded"){pendingScript=pendingScripts.shift();pendingScript.onreadystatechange=null;firstScript.parentNode.insertBefore(pendingScript,firstScript)}}if(window.location.hash!=="#nojs")while(src=scripts.shift())if("async"in firstScript){script=document.createElement("script");script.async=false;script.src=src;document.head.appendChild(script)}else if(firstScript.readyState){script=document.createElement("script");pendingScripts.push(script);script.onreadystatechange=stateChange;script.src=src}else document.write('\x3cscript src\x3d"'+src+'" defer\x3e\x3c/'+"script\x3e")})(document,window);
+ ]]>
+ </script>
+ <style>
+ <![CDATA[
+
+ .content--photo-essay .immersive-main-media__headline-container{margin-top:0;bottom:0}@media (min-width: 61.25em){.content--photo-essay .immersive-main-media__headline-container .content__standfirst--immersive-article{padding-bottom:1rem}.content--photo-essay .immersive-main-media__headline-container .content__standfirst--immersive-article:before{content:'';position:absolute;top:0;height:0.125rem;width:8.75rem;background-color:rgba(255,255,255,0.2)}}.content--article.content--immersive-article .content__article-body{margin:0}.content--article.content--immersive-article a.u-underline.in-body-link--immersive{color:#005689}.content--article.content--immersive-article a.u-underline.in-body-link--immersive:hover{border-bottom:0.0625rem solid #00b2ff}.content--article.content--immersive-article blockquote.photo-essay-block-quote{font-family:"Guardian Egyptian Web",Georgia,serif;font-style:normal;margin:0 0 1.5rem}.content--article.content--immersive-article blockquote.photo-essay-block-quote:not(.quoted){background-color:#ededed;padding:0.5rem 0.75rem 0.75rem}.content--article.content--immersive-article blockquote.photo-essay-block-quote .inline-icon{fill:#005689}.content--article.content--immersive-article blockquote.photo-essay-block-quote .quoted__contents{margin:0}.content--article.content--immersive-article blockquote.photo-essay-block-quote h2{font-size:2.125rem;line-height:2.375rem;color:#005689;font-weight:100}.content--article.content--immersive-article blockquote.photo-essay-block-quote.quoted{font-size:1.5rem;line-height:1.6875rem;color:#005689}.content--article.content--immersive-article blockquote.photo-essay-block-quote.quoted .inline-icon{fill:#00b2ff;width:1.5rem;display:block;margin-bottom:0.75rem}.content--article.content--immersive-article blockquote.photo-essay-block-quote.quoted .inline-icon .inline-garnett-quote__svg{width:100%;height:auto}.content--article.content--immersive-article .element-image--photo-essay{padding-bottom:0;margin-bottom:0.75rem}.content--article.content--immersive-article .element-image--photo-essay.fig--no-caption.fig--has-shares{padding-bottom:0 !important}.content--article.content--immersive-article .element-image--photo-essay .caption{max-width:100%;color:#005689}.content--article.content--immersive-article .element-image--photo-essay .caption .inline-information.reveal-caption-icon{background-color:#005689}.content--article.content--immersive-article .element-image--photo-essay .section-title{background-color:#000;background:linear-gradient(transparent, #000)}.content--article.content--immersive-article .element-image--photo-essay .section-title:before{background-color:#00b2ff;display:block;content:'';width:8.75rem;height:0.75rem;margin-bottom:calc(1.25rem / 3)}.content--article.content--immersive-article .element-image--photo-essay.element--supporting .caption{max-width:100%}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth{width:49%;float:left;margin-top:0;margin-bottom:2%}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth .inline-expand-image{display:none}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth:before{content:'';display:block;width:0.125rem;top:0;bottom:0;z-index:300;position:absolute;background-color:#ffffff}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth+p,.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth+blockquote,.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth+.element-pullquote:not(.element--halfWidth){clear:both;padding-top:0.375rem}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth+.element-pullquote.element--halfWidth{margin-top:0}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth+.element-image:not(.element--halfWidth){clear:left}.content--article.content--immersive-article .element-image--photo-essay.element--halfWidth.half-width-odd{margin-right:2%}.content--article.content--immersive-article .element-pullquote--photo-essay.element--supporting .pullquote-paragraph{text-indent:0}.content--article.content--immersive-article .element-pullquote--photo-essay .pullquote-paragraph{font-size:1.5rem;line-height:1.6875rem;color:#005689}.content--article.content--immersive-article .element-pullquote--photo-essay .pullquote-cite{font-size:1.5rem;line-height:1.6875rem;color:#767676 !important}.content--article.content--immersive-article .element-pullquote--photo-essay.element--halfWidth{width:45%;float:left;margin-right:1.25rem;border-bottom:0;margin-top:0.375rem;clear:none}.content--article.content--immersive-article .element-pullquote--photo-essay .inline-icon{fill:#00b2ff;width:1.5rem;display:block;margin-bottom:0.75rem}.content--article.content--immersive-article .element-pullquote--photo-essay .inline-icon .inline-garnett-quote__svg{width:100%;height:auto}.content__series-label--photo-essay .content__label__link{color:#ffffff}.content__section-label--advertisement{font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-size:1.25rem;line-height:1.5rem;font-weight:900;margin:0}.content__section-label--advertisement .content__section-label__link--advertisement{color:#69d1ca}.from-content-api ul{display:inline-block;width:98%;margin-top:0}@media (max-width: 29.99em){.from-content-api ul{margin-top:-0.375rem}}.from-content-api ul>li{font-size:0.875rem;line-height:1.25rem;font-family:"Guardian Text Sans Web","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#052962;font-size:0.75rem;width:100%;margin-right:1%;line-height:0.875rem;padding-top:0.375rem;padding-left:0 !important;border-top:0.0625rem solid #052962}.from-content-api ul>li::before{display:none !important}@media (max-width: 29.99em){.from-content-api ul>li{width:98%}}.element--immersive+ul,.element--showcase+ul{width:9.375rem;margin-left:-10.625rem;float:left}.element--immersive+ul>li,.element--showcase+ul>li{width:100%}@media (max-width: 71.24em){.element--immersive+ul,.element--showcase+ul{width:98%;margin-left:0;float:none}}@media (max-width: 29.99em){.element--immersive+ul,.element--showcase+ul{width:98%;float:none;margin-left:0}}
+ /*# sourceMappingURL=article-photo-essay-garnett.css.map */
+
+ ]]>
+ </style>
+ </head>
+ <body id="top" class="is-immersive" itemscope="itemscope" itemtype="http://schema.org/WebPage">
+ <a class="u-h skip" href="#maincontent" data-link-name="skip : main content">Skip to main content</a>
+ <div id="dfp-ad--survey" class="js-ad-slot ad-slot ad-slot--survey" data-link-name="ad slot survey" data-name="survey" data-label="false" data-refresh="false" data-out-of-page="true" data-wide="1,1" aria-hidden="true"></div>
+ <div class="immersive-header-container immersive-header-container--photo-essay">
+ <header class="new-header new-header--slim pillar-scheme--News" role="banner">
+ <nav class="new-header__inner gs-container" data-component="nav2" role="navigation" aria-label="Guardian sections">
+ <a href="https://www.theguardian.com/us" class="new-header__logo" data-link-name="nav2 : logo"><span class="u-h">The Guardian - Back to home</span> <span class="inline-the-guardian-roundel inline-logo"><svg viewbox="0 0 56 56" class="inline-the-guardian-roundel__svg inline-logo__svg">
+ <path d="M28 0a28 28 0 1 0 28 28A28 28 0 0 0 28 0" fill="#121212"></path>
+ <path d="M33 6.92c3.63.58 8.24 3.06 9.89 4.83v8h-1L33 7.82zm-3.34.5h-.09c-6.35 0-9.8 8.8-9.8 20.66 0 11.87 3.45 20.66 9.8 20.66h.09v.91c-9.56.65-22.42-6.63-22.09-21.58C7.23 13.14 20.09 5.86 29.66 6.51zm16.16 22.53l-3 1.3v13.44A24.26 24.26 0 0 1 33 49.52V31l-3.3-1.09V29h16.12z" fill="#fff"></path></svg></span></a>
+ <div class="new-header__cta-bar hide-until-mobile">
+ <a class="cta-bar__cta hide-until-tablet js-change-become-member-link js-acquisition-link" data-link-name="nav2 : contribute-cta" data-edition="us" href="https://support.theguardian.com/contribute?INTCMP=header_support_contribute&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_HEADER&quot;,&quot;componentId&quot;:&quot;header_support_contribute&quot;%7D">Contribute <span class="inline-arrow-right inline-icon"><svg width="30" height="30" viewbox="0 0 30 30" class="inline-arrow-right__svg inline-icon__svg">
+ <path d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"></path></svg></span></a> <a class="cta-bar__cta hide-until-tablet js-subscribe js-acquisition-link" data-link-name="nav2 : subscribe-cta" data-edition="us" href="https://support.theguardian.com/subscribe?INTCMP=header_support_subscribe&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_HEADER&quot;,&quot;componentId&quot;:&quot;header_support_subscribe&quot;%7D">Subscribe <span class="inline-arrow-right inline-icon"><svg width="30" height="30" viewbox="0 0 30 30" class="inline-arrow-right__svg inline-icon__svg">
+ <path d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"></path></svg></span></a> <a class="cta-bar__cta hide-from-tablet js-change-become-member-link js-acquisition-link" data-link-name="nav2 : contribute-cta" data-edition="us" href="https://support.theguardian.com/contribute?INTCMP=header_support_contribute&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_HEADER&quot;,&quot;componentId&quot;:&quot;header_support_contribute&quot;%7D">Contribute <span class="inline-arrow-right inline-icon"><svg width="30" height="30" viewbox="0 0 30 30" class="inline-arrow-right__svg inline-icon__svg">
+ <path d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"></path></svg></span></a>
+ </div>
+ <div class="new-header__top-bar hide-until-mobile"></div>
+ <div class="popup popup--default popup--search js-search-popup js-search-new is-off" aria-label="search" role="dialog" tabindex="-1" id="search-popup">
+ <div class="js-search-placeholder"></div>
+ </div>
+ <ul class="pillars">
+ <li class="pillars__item">
+ <a class="pillar-link pillar-link--News" href="https://www.theguardian.com/us" data-link-name="nav2 : primary : News">News</a>
+ </li>
+ <li class="pillars__item">
+ <a class="pillar-link pillar-link--Opinion" href="https://www.theguardian.com/us/commentisfree" data-link-name="nav2 : primary : Opinion">Opinion</a>
+ </li>
+ <li class="pillars__item">
+ <a class="pillar-link pillar-link--Sport" href="https://www.theguardian.com/us/sport" data-link-name="nav2 : primary : Sport">Sport</a>
+ </li>
+ <li class="pillars__item">
+ <a class="pillar-link pillar-link--Culture" href="https://www.theguardian.com/us/culture" data-link-name="nav2 : primary : Culture">Culture</a>
+ </li>
+ <li class="pillars__item">
+ <a class="pillar-link pillar-link--Lifestyle" href="https://www.theguardian.com/us/lifeandstyle" data-link-name="nav2 : primary : Lifestyle">Lifestyle</a>
+ </li>
+ </ul><input type="checkbox" id="main-menu-toggle" class="veggie-burger-fallback js-enhance-checkbox u-h" data-link-name="nav2 : veggie-burger : show" aria-controls="main-menu" tabindex="-1" /> <label for="main-menu-toggle" class="js-change-link new-header__menu-toggle" data-link-name="nav2 : veggie-burger : show" tabindex="0"> <span class="pillar-link pillar-link--dropdown pillar-link--sections hide-until-desktop"><span class="u-h">Show</span> More </span></label>
+ <div class="menu js-main-menu" id="main-menu" aria-hidden="true">
+ <div class="menu__inner gs-container">
+ <ul class="menu-group menu-group--primary" role="menubar">
+ <li class="menu-item js-navigation-item" data-section-name="News" role="none">
+ <button class="menu-item__title menu-item__title--News hide-from-desktop js-navigation-toggle" data-link-name="nav2 : secondary : News" aria-haspopup="true" role="menuitem" aria-expanded="true">News</button>
+ <ul class="menu-group menu-group--secondary" data-edition="us" aria-label="Submenu News" role="menu">
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us-news" data-link-name="nav2 : secondary : US news">US news</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/world" data-link-name="nav2 : secondary : World news">World news</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/environment" data-link-name="nav2 : secondary : Environment">Environment</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/football" data-link-name="nav2 : secondary : Soccer">Soccer</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us-news/us-politics" data-link-name="nav2 : secondary : US politics">US politics</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/business" data-link-name="nav2 : secondary : Business">Business</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/technology" data-link-name="nav2 : secondary : Tech">Tech</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/science" data-link-name="nav2 : secondary : Science">Science</a>
+ </li>
+ </ul>
+ </li>
+ <li class="menu-item js-navigation-item" data-section-name="Opinion" role="none">
+ <button class="menu-item__title menu-item__title--Opinion hide-from-desktop js-navigation-toggle" data-link-name="nav2 : secondary : Opinion" aria-haspopup="true" role="menuitem" aria-expanded="true">Opinion</button>
+ <ul class="menu-group menu-group--secondary" data-edition="us" aria-label="Submenu Opinion" role="menu">
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/profile/editorial" data-link-name="nav2 : secondary : The Guardian view">The Guardian view</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/index/contributors" data-link-name="nav2 : secondary : Columnists">Columnists</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/tone/letters" data-link-name="nav2 : secondary : Letters">Letters</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/commentisfree/series/comment-is-free-weekly" data-link-name="nav2 : secondary : Opinion videos">Opinion videos</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/cartoons/archive" data-link-name="nav2 : secondary : Cartoons">Cartoons</a>
+ </li>
+ </ul>
+ </li>
+ <li class="menu-item js-navigation-item" data-section-name="Sport" role="none">
+ <button class="menu-item__title menu-item__title--Sport hide-from-desktop js-navigation-toggle" data-link-name="nav2 : secondary : Sport" aria-haspopup="true" role="menuitem" aria-expanded="true">Sport</button>
+ <ul class="menu-group menu-group--secondary" data-edition="us" aria-label="Submenu Sport" role="menu">
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/football" data-link-name="nav2 : secondary : Soccer">Soccer</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/sport/nfl" data-link-name="nav2 : secondary : NFL">NFL</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/sport/tennis" data-link-name="nav2 : secondary : Tennis">Tennis</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/sport/mlb" data-link-name="nav2 : secondary : MLB">MLB</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/football/mls" data-link-name="nav2 : secondary : MLS">MLS</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/sport/nba" data-link-name="nav2 : secondary : NBA">NBA</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/sport/nhl" data-link-name="nav2 : secondary : NHL">NHL</a>
+ </li>
+ </ul>
+ </li>
+ <li class="menu-item js-navigation-item" data-section-name="Culture" role="none">
+ <button class="menu-item__title menu-item__title--Culture hide-from-desktop js-navigation-toggle" data-link-name="nav2 : secondary : Culture" aria-haspopup="true" role="menuitem" aria-expanded="true">Culture</button>
+ <ul class="menu-group menu-group--secondary" data-edition="us" aria-label="Submenu Culture" role="menu">
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/film" data-link-name="nav2 : secondary : Film">Film</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/books" data-link-name="nav2 : secondary : Books">Books</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/music" data-link-name="nav2 : secondary : Music">Music</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/artanddesign" data-link-name="nav2 : secondary : Art &amp; design">Art &amp; design</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/tv-and-radio" data-link-name="nav2 : secondary : TV &amp; radio">TV &amp; radio</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/stage" data-link-name="nav2 : secondary : Stage">Stage</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/music/classicalmusicandopera" data-link-name="nav2 : secondary : Classical">Classical</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/games" data-link-name="nav2 : secondary : Games">Games</a>
+ </li>
+ </ul>
+ </li>
+ <li class="menu-item js-navigation-item" data-section-name="Lifestyle" role="none">
+ <button class="menu-item__title menu-item__title--Lifestyle hide-from-desktop js-navigation-toggle" data-link-name="nav2 : secondary : Lifestyle" aria-haspopup="true" role="menuitem" aria-expanded="true">Lifestyle</button>
+ <ul class="menu-group menu-group--secondary" data-edition="us" aria-label="Submenu Lifestyle" role="menu">
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/fashion" data-link-name="nav2 : secondary : Fashion">Fashion</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/food" data-link-name="nav2 : secondary : Food">Food</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/tone/recipes" data-link-name="nav2 : secondary : Recipes">Recipes</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/lifeandstyle/love-and-sex" data-link-name="nav2 : secondary : Love &amp; sex">Love &amp; sex</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/lifeandstyle/home-and-garden" data-link-name="nav2 : secondary : Home &amp; garden">Home &amp; garden</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/lifeandstyle/health-and-wellbeing" data-link-name="nav2 : secondary : Health &amp; fitness">Health &amp; fitness</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/lifeandstyle/family" data-link-name="nav2 : secondary : Family">Family</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/travel" data-link-name="nav2 : secondary : Travel">Travel</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/us/money" data-link-name="nav2 : secondary : Money">Money</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="menu-group menu-group--search hide-from-desktop">
+ <form class="menu-search js-menu-search" action="https://www.google.co.uk/search">
+ <input type="text" name="q" class="menu-search__search-box js-menu-search-term" id="google-search" placeholder="Search" data-link-name="nav2 : search" /> <label class="menu-search__glass" for="google-search"><span class="inline-search-36 inline-icon main-menu__icon main-menu__icon--search"><svg width="18" height="18" viewbox="0 0 18 18" class="main-menu__icon__svg main-menu__icon--search__svg inline-search-36__svg inline-icon__svg">
+ <path d="M6.5 1.6c2.7 0 4.9 2.2 4.9 4.9s-2.2 4.9-4.9 4.9-4.9-2.2-4.9-4.9 2.2-4.9 4.9-4.9m0-1.6C2.9 0 0 2.9 0 6.5S2.9 13 6.5 13 13 10.1 13 6.5 10.1 0 6.5 0zm6.6 11.5l4.9 4.9-1.6 1.6-4.9-4.9v-.8l.8-.8h.8z"></path></svg></span> <span class="u-h">What term do you want to search?</span></label> <button class="menu-search__submit" data-link-name="nav2 : search : submit" for="submit-google-search" type="submit"> <span class="u-h">Search with google</span></button> <input type="hidden" name="as_sitesearch" value="www.theguardian.com" />
+ </form>
+ </div>
+ <ul class="menu-group menu-group--membership" role="menubar">
+ <li class="menu-item hide-from-desktop" data-edition="us" role="none">
+ <a class="menu-item__title" href="https://support.theguardian.com/contribute?INTCMP=side_menu_support_contribute&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_HEADER&quot;,&quot;componentId&quot;:&quot;side_menu_support_contribute&quot;%7D" role="menuitem" data-link-name="nav2 : Make a contribution">Make a contribution</a>
+ </li>
+ <li class="menu-item hide-from-desktop" data-edition="us" role="none">
+ <a class="menu-item__title js-subscribe" href="https://support.theguardian.com/subscribe?INTCMP=side_menu_support_subscribe&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_HEADER&quot;,&quot;componentId&quot;:&quot;side_menu_support_subscribe&quot;%7D" role="menuitem" data-link-name="nav2 : Subscribe">Subscribe</a>
+ </li>
+ </ul>
+ <ul class="menu-group menu-group--editions hide-from-desktop">
+ <li class="menu-item js-navigation-item">
+ <button class="menu-item__title js-navigation-toggle" data-link-name="nav2 : edition picker" aria-haspopup="true" aria-expanded="true">US edition</button>
+ <ul class="menu-group">
+ <li class="menu-item">
+ <a data-link-name="nav2 : edition-picker: UK" href="https://www.theguardian.com/preference/edition/uk" class="menu-item__title"><span class="u-h">switch to the</span> UK edition</a>
+ </li>
+ <li class="menu-item">
+ <a data-link-name="nav2 : edition-picker: AU" href="https://www.theguardian.com/preference/edition/au" class="menu-item__title"><span class="u-h">switch to the</span> Australia edition</a>
+ </li>
+ <li class="menu-item">
+ <a data-link-name="nav2 : edition-picker: INT" href="https://www.theguardian.com/preference/edition/int" class="menu-item__title"><span class="u-h">switch to the</span> International edition</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <ul class="menu-group menu-group--footer" data-edition="us" role="menubar">
+ <li class="menu-item hide-from-desktop" role="none">
+ <a class="menu-item__title" href="https://jobs.theguardian.com/jobs?INTCMP=jobs_us_web_newheader" role="menuitem" data-link-name="nav2 : Search jobs">Search jobs</a>
+ </li>
+ <li class="menu-item hide-from-desktop" role="none">
+ <a class="menu-item__title" href="https://theguardian.newspapers.com" role="menuitem" data-link-name="nav2 : Digital Archive">Digital Archive</a>
+ </li>
+ <li class="menu-item hide-from-desktop" role="none">
+ <a class="menu-item__title" href="https://discountcode.theguardian.com" role="menuitem" data-link-name="nav2 : Discount Codes">Discount Codes</a>
+ </li>
+ <li class="hide-from-desktop menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/mobile/2014/may/29/the-guardian-for-mobile-and-tablet" data-link-name="nav2 : The Guardian app">The Guardian app</a>
+ </li>
+ <li class="menu-item menu-item--no-border" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/video" data-link-name="nav2 : Video">Video</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/podcasts" data-link-name="nav2 : Podcasts">Podcasts</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/inpictures" data-link-name="nav2 : Pictures">Pictures</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/email-newsletters" data-link-name="nav2 : Newsletters">Newsletters</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/membership" data-link-name="nav2 : Inside the Guardian">Inside the Guardian</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/weekly?INTCMP=gdnwb_mawns_editorial_gweekly_GW_TopNav_US" data-link-name="nav2 : Guardian Weekly">Guardian Weekly</a>
+ </li>
+ <li class="menu-item" role="none">
+ <a class="menu-item__title" role="menuitem" href="https://www.theguardian.com/crosswords" data-link-name="nav2 : Crosswords">Crosswords</a>
+ </li>
+ <li class="menu-item hide-from-desktop" role="none">
+ <a class="menu-item__title" href="https://www.facebook.com/theguardian" role="menuitem" data-link-name="nav2 : facebook"><span class="inline-share-facebook inline-icon menu-item__icon" role="presentation" aria-hidden="true"><svg width="32" height="32" viewbox="-2 -2 32 32" class="menu-item__icon__svg inline-share-facebook__svg inline-icon__svg">
+ <path d="M17.9 14h-3v8H12v-8h-2v-2.9h2V8.7C12 6.8 13.1 5 16 5c1.2 0 2 .1 2 .1v3h-1.8c-1 0-1.2.5-1.2 1.3v1.8h3l-.1 2.8z"></path></svg></span> Facebook</a>
+ </li>
+ <li class="menu-item hide-from-desktop" role="none">
+ <a class="menu-item__title" href="https://twitter.com/guardian" role="menuitem" data-link-name="nav2 : twitter"><span class="inline-share-twitter inline-icon menu-item__icon" role="presentation" aria-hidden="true"><svg width="32" height="32" viewbox="-2 -2 32 32" class="menu-item__icon__svg inline-share-twitter__svg inline-icon__svg">
+ <path d="M21.3 10.5v.5c0 4.7-3.5 10.1-9.9 10.1-2 0-3.8-.6-5.3-1.6.3 0 .6.1.8.1 1.6 0 3.1-.6 4.3-1.5-1.5 0-2.8-1-3.3-2.4.2 0 .4.1.7.1l.9-.1c-1.6-.3-2.8-1.8-2.8-3.5.5.3 1 .4 1.6.4-.9-.6-1.6-1.7-1.6-2.9 0-.6.2-1.3.5-1.8 1.7 2.1 4.3 3.6 7.2 3.7-.1-.3-.1-.5-.1-.8 0-2 1.6-3.5 3.5-3.5 1 0 1.9.4 2.5 1.1.8-.1 1.5-.4 2.2-.8-.3.8-.8 1.5-1.5 1.9.7-.1 1.4-.3 2-.5-.4.4-1 1-1.7 1.5z"></path></svg></span> Twitter</a>
+ </li>
+ </ul>
+ <ul class="menu-group menu-group--brand-extensions hide-until-desktop">
+ <li class="menu-item--brand-extension">
+ <a href="https://jobs.theguardian.com/jobs?INTCMP=jobs_us_web_newheader" class="menu-item__title menu-item__title--brand-extension" data-link-name="nav2 : brand extension : Search jobs">Search jobs</a>
+ </li>
+ <li class="menu-item--brand-extension">
+ <a href="https://theguardian.newspapers.com" class="menu-item__title menu-item__title--brand-extension" data-link-name="nav2 : brand extension : Digital Archive">Digital Archive</a>
+ </li>
+ <li class="menu-item--brand-extension">
+ <a href="https://discountcode.theguardian.com" class="menu-item__title menu-item__title--brand-extension" data-link-name="nav2 : brand extension : Discount Codes">Discount Codes</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </nav>
+ </header>
+ <div class="content--photo-essay content immersive-main-media tonal tonal--tone-feature">
+ <div class="immersive-main-media__media">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(orientation: portrait) and (-webkit-min-device-pixel-ratio: 1.25), (orientation: portrait) and (min-resolution: 120dpi)" sizes="149.9814333457111vh" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e2c5715dbf4f6c0e47815f3e83993c1c 1000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a4a73ab855c37b0a9423d7facc2e68aa 1500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9d621e35e11cdb6150ef1082f888f6ca 2000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8c2bda6206ccee0574eb03f66f976869 2500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c7b3011a5724479104360160c325ac4d 3000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=84fdcf96fc75467ca0850e247338c7bd 3500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4191520f2627e03f6153be16bf410d4c 4000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=492bf22dc323ffb8b831c3335a5b686c 4500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=68db1188c40e2ab03470c08ee109922b 5000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=61af5e495b34c5899498ef3f45b0be91 5500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=aa920b9087be3e8deb9ff2f99294caf1 6000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=704f7ccde7a280c8848cb7d9b33ba924 6500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=94f93e7b1b6493f83be2317fd8fdd67c 7000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=672491db08c7e649cd76073caf2c874c 7500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=4000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b77807cc60da187430caf9cb275492ec 8000w" /> <source media="(orientation: portrait)" sizes="149.9814333457111vh" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e2c5715dbf4f6c0e47815f3e83993c1c 500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a4a73ab855c37b0a9423d7facc2e68aa 750w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9d621e35e11cdb6150ef1082f888f6ca 1000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8c2bda6206ccee0574eb03f66f976869 1250w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c7b3011a5724479104360160c325ac4d 1500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=84fdcf96fc75467ca0850e247338c7bd 1750w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4191520f2627e03f6153be16bf410d4c 2000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=492bf22dc323ffb8b831c3335a5b686c 2250w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=68db1188c40e2ab03470c08ee109922b 2500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=2750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=61af5e495b34c5899498ef3f45b0be91 2750w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=aa920b9087be3e8deb9ff2f99294caf1 3000w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3250&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=704f7ccde7a280c8848cb7d9b33ba924 3250w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3500&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=94f93e7b1b6493f83be2317fd8fdd67c 3500w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=3750&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=672491db08c7e649cd76073caf2c874c 3750w, https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=4000&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b77807cc60da187430caf9cb275492ec 4000w" /> <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="1900px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1900&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=d4c6213fbe41a598ae837fde8e27e3f5 3800w" /> <source media="(min-width: 1300px)" sizes="1900px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1900&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=cfb6cb3db14a790bfc30ced9c6041bea 1900w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1300&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=eb224a4df0b7a9375c8536cc517b064a 2600w" /> <source media="(min-width: 1140px)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=26698338c22158d325aa62da4ba0048c 1300w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1140&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=bfe7818a239e6f6c78a3d95b1b85a1b4 2280w" /> <source media="(min-width: 980px)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=1140&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=36b05254f3daf51287320db564be65c2 1140w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="980px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=980&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e74663be100678edd9ec37e374fad78b 1960w" /> <source media="(min-width: 740px)" sizes="980px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=980&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=3e14da5e3c67f3948c3190acb7b3d83f 980w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="740px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=740&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=287ee0c0a54e4e8359db606fa75e8fc3 1480w" /> <source media="(min-width: 660px)" sizes="740px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=740&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c7f79d7504a60617476e1e1ac59a60b8 740w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="660px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=660&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=a34ae6328fce1b653a78a51692a0c6ae 1320w" /> <source media="(min-width: 480px)" sizes="660px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=660&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=57de53fb2e410804cb2ed0c4bbf3a358 660w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="480px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=480&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=04eb8cc26d8f2e31c3b941882a511216 960w" /> <source media="(min-width: 0px)" sizes="480px" srcset="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=480&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=60dc93e19b34750ee33dd23e9f2d92b0 480w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="immersive-main-media__media" itemprop="contentUrl" alt="" src="https://i.guim.co.uk/img/media/df84b519a877d652e950ecd4248320eec985934e/0_507_4039_2693/master/4039.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a58643e96c83a78790a36f97ae66b689" /></picture>
+ </div>
+ <div class="immersive-main-media__image-overlay"></div>
+ </div>
+ <div class="content--pillar-news immersive-main-media__headline-container--dark immersive-main-media__headline-container--gallery">
+ <div class="gs-container">
+ <div class="content__main-column">
+ <div class="content__labels content__labels--immersive content__labels--panel">
+ <div class="content__series-label content__label content__series-label--immersive-article content__label content__series-label--photo-essay">
+ <a class="content__label__link" href="https://www.theguardian.com/environment/series/seascape-the-state-of-our-oceans"><span class="label__link-wrapper">Seascape: the state of our oceans</span></a>
+ </div>
+ </div>
+ <h1 class="content__headline--immersive--with-main-media content__headline content__headline--immersive content__headline--immersive-article">
+ 'What is the sea telling us?': Māori tribes fearful over whale strandings
+ </h1>
+ <figcaption class="caption caption--immersive hide-until-leftcol">
+ <span class="inline-triangle inline-icon"><svg width="11" height="10" viewbox="0 0 11 10" class="inline-triangle__svg inline-icon__svg">
+ <path fill-rule="evenodd" d="M5.5 0L11 10H0z"></path></svg></span> Whale expert Hori Parata. Photograph: Adrian Malloch for the Guardian
+ </figcaption>
+ </div>
+ </div>
+ </div>
+ <div class="content__wrapper--standfirst">
+ <div class="gs-container">
+ <div class="content__main-column">
+ <div class="content__standfirst content__standfirst--immersive-article" data-link-name="standfirst" data-component="standfirst">
+ <meta itemprop="description" content="New Zealand’s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings" />
+ <p>
+ New Zealand’s whale whisperers worry that manmade changes in the ocean are behind the spike in beachings
+ </p>
+ <p>
+ by <span itemscope="itemscope" itemtype="http://schema.org/Person" itemprop="author"><a rel="author" class="tone-colour u-underline" itemprop="sameAs" data-link-name="in standfirst link" href="https://www.theguardian.com/profile/eleanor-ainge-roy"><span itemprop="name">Eleanor Ainge Roy</span></a></span> (reporting) and Adrian Malloch (photography)
+ </p>
+ </div>
+ <figcaption class="caption caption--immersive hide-from-leftcol">
+ Main image: Whale expert Hori Parata. Photograph: Adrian Malloch for the Guardian
+ </figcaption>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="maincontent" tabindex="0"></div>
+ <div class="js-breaking-news-placeholder breaking-news breaking-news--hidden breaking-news--fade-in" data-link-name="breaking news" data-component="breaking-news"></div>
+ <article id="article" data-test-id="article-root" class="content content--article content--immersive content--immersive-article tonal tonal--tone-feature section-environment" itemscope="itemscope" itemtype="http://schema.org/NewsArticle" role="main">
+ <meta itemprop="mainEntityOfPage" content="https://www.theguardian.com/environment/2019/jan/03/what-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" />
+ <div itemprop="publisher" itemscope="itemscope" itemtype="https://schema.org/Organization">
+ <meta itemprop="name" content="The Guardian" />
+ <link itemprop="sameAs" href="http://www.theguardian.com" />
+ </div>
+ <header class="content__head tonal__head tonal__head--tone-feature">
+ <h1 class="is-hidden" itemprop="headline">
+ 'What is the sea telling us?': Māori tribes fearful over whale strandings
+ </h1>
+ </header>
+ <div class="content__main tonal__main tonal__main--tone-feature">
+ <div class="gs-container">
+ <div class="content__main-column content__main-column--article js-content-main-column">
+ <div class="content__meta-container content__meta-container--twitter js-content-meta u-cf">
+ <div class="badge badge--alt">
+ <div class="badge__label">
+ Seascape: the state of our oceans is supported by
+ </div><a class="badge__link" href="https://www.packard.org/" data-sponsor="the david and lucile packard foundation" rel="nofollow"><img src="https://static.theguardian.com/commercial/sponsor/17/Sep/2018/25703364-a145-46b0-bcd0-bcd1dd5f571b-seascape-color-logo.png" alt="The David and Lucile Packard Foundation" class="badge__logo" /></a> <a href="https://www.theguardian.com/environment/2018/sep/16/about-seascape-the-state-of-our-oceans-a-guardian-series" class="badge__help">About this content</a>
+ </div>
+ <p class="content__dateline" aria-hidden="true">
+ <time itemprop="datePublished" datetime="2019-01-03T02:00:02-0500" data-timestamp="1546498802000" class="content__dateline-wpd js-wpd">Thu 3 Jan 2019 <span class="content__dateline-time">02.00&#160;EST</span></time> <time datetime="2019-01-16T06:16:23-0500" data-timestamp="1547637383000" class="content__dateline-lm js-lm u-h" itemprop="dateModified">Last modified on Wed 16 Jan 2019 <span class="content__dateline-time">06.16&#160;EST</span></time>
+ </p>
+ <meta itemprop="dateModified" content="2019-01-16T06:16:23-0500" />
+ <div class="meta__extras">
+ <div class="meta__social" data-component="share">
+ <ul class="social social--top js-social--top u-unstyled u-cf" data-component="social">
+ <li class="social__item social__item--facebook" data-link-name="facebook">
+ <a class="social__action js-social__action--top social-icon-wrapper" data-link-name="social top" href="https://www.facebook.com/dialog/share?app_id=180444840287&amp;href=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_fb" target="_blank" title="Facebook"><span class="inline-icon__fallback button">Share on Facebook</span> <span class="inline-share-facebook inline-icon rounded-icon centered-icon social-icon social-icon--facebook"><svg width="32" height="32" viewbox="-2 -2 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--facebook__svg inline-share-facebook__svg inline-icon__svg">
+ <path d="M17.9 14h-3v8H12v-8h-2v-2.9h2V8.7C12 6.8 13.1 5 16 5c1.2 0 2 .1 2 .1v3h-1.8c-1 0-1.2.5-1.2 1.3v1.8h3l-.1 2.8z"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--twitter" data-link-name="twitter">
+ <a class="social__action js-social__action--top social-icon-wrapper" data-link-name="social top" href="https://twitter.com/intent/tweet?text='What%20is%20the%20sea%20telling%20us%3F'%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy&amp;url=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_tw" target="_blank" title="Twitter"><span class="inline-icon__fallback button">Share on Twitter</span> <span class="inline-share-twitter inline-icon rounded-icon centered-icon social-icon social-icon--twitter"><svg width="32" height="32" viewbox="-2 -2 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--twitter__svg inline-share-twitter__svg inline-icon__svg">
+ <path d="M21.3 10.5v.5c0 4.7-3.5 10.1-9.9 10.1-2 0-3.8-.6-5.3-1.6.3 0 .6.1.8.1 1.6 0 3.1-.6 4.3-1.5-1.5 0-2.8-1-3.3-2.4.2 0 .4.1.7.1l.9-.1c-1.6-.3-2.8-1.8-2.8-3.5.5.3 1 .4 1.6.4-.9-.6-1.6-1.7-1.6-2.9 0-.6.2-1.3.5-1.8 1.7 2.1 4.3 3.6 7.2 3.7-.1-.3-.1-.5-.1-.8 0-2 1.6-3.5 3.5-3.5 1 0 1.9.4 2.5 1.1.8-.1 1.5-.4 2.2-.8-.3.8-.8 1.5-1.5 1.9.7-.1 1.4-.3 2-.5-.4.4-1 1-1.7 1.5z"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--email" data-link-name="email">
+ <a class="social__action js-social__action--top social-icon-wrapper" data-link-name="social top" href="mailto:?subject='What%20is%20the%20sea%20telling%20us%3F'%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy&amp;body=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_link" target="_blank" title="Email"><span class="inline-icon__fallback button">Share via Email</span> <span class="inline-share-email inline-icon rounded-icon centered-icon social-icon social-icon--email"><svg width="32" height="32" viewbox="0 0 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--email__svg inline-share-email__svg inline-icon__svg">
+ <path d="M23.363 20.875H8.637v-8.938l6.545 5.687h1.637l6.544-5.687v8.938zm-1.635-9.75L16 16l-5.728-4.875h11.456zM23.363 9.5H8.637L7 11.125v9.75L8.637 22.5h14.727L25 20.875v-9.75L23.363 9.5z"></path></svg></span></a>
+ </li>
+ </ul>
+ </div>
+ <div class="meta__numbers">
+ <div class="u-h meta__number js-sharecount"></div>
+ <div class="u-h meta__number" data-discussion-id="/p/a84nt" data-commentcount-format="content" data-discussion-closed="true"></div>
+ </div>
+ </div>
+ </div>
+ <div class="content__article-body from-content-api js-article__body" itemprop="articleBody" data-test-id="article-review-body">
+ <p>
+ <span class="drop-cap"><span class="drop-cap__inner">W</span></span>hale whisperer Hori Parata was just seven years old when he attended his first mass stranding, a beaching of porpoises in New Zealand’s Northland, their cries screeching through the air on the deserted stretch of sand.
+ </p>
+ <p>
+ Seven decades later, Parata, 75, has now overseen more than 500 strandings and is renowned in <a href="https://www.theguardian.com/world/newzealand" data-link-name="auto-linked-tag" data-component="auto-linked-tag" class="u-underline in-body-link--immersive">New Zealand</a> as the leading Māori whale expert, called on by tribes around the country for cultural guidance as marine strandings become increasingly complex and fatal.
+ </p>
+ <p>
+ “Man’s greed in the ocean is hurting the whales,” says Parata, a fierce and uncompromising elder of the Ngātiwai tribe of eastern Northland.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--showcase fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="05cb692c634cd90e5411aab92ca3e649474ff786" id="img-2">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f5b3d20f0dc5c22a83f96fb709ecd204" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-2" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=adbbf5d870d9cc7f0b9a24eb5472ebf3 1760w" /> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f0a6d8fa60b5571e9e0e9a5673e407b7 880w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=d39897e20bb677fda3feb14113aad381 1600w" /> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=dbf240ee147c5a0a43321f1634ee41eb 800w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f7926915234cc22c9fe718771f5837cc 1280w" /> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=fa3edf920739ca39d41e3fce38ab277b 640w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f9fd7969943957bd4893fe29d248626c 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=61ab70443d54f672febc609b4bfbc5c0 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=a416bff5ba9e0d62f1634aee83308528 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=5ae3b22ecb3c7bde8b49a212d52b707c 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=c43d04fbea54b99991b541ce674da43d 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a0c813b07b8d5b99a33a7133ea7185db 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Hori Parata at his Pātaua farm, the place where he was born and grew up." src="https://i.guim.co.uk/img/media/05cb692c634cd90e5411aab92ca3e649474ff786/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=575838a657b26493e956c7f84b058080" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Hori Parata at his Pātaua farm, the place where he was born and grew up
+ </p>
+ </li>
+ </ul>
+ <p>
+ “We’re having to put up with a lot of stuff today. The public want to hug the whales, they want to touch them, they want to feel good – that’s not the thing. We feel that is ridiculous.”
+ </p>
+ <p>
+ Whale experts regard New Zealand – or Aotearoa as it is called by Māori – as the whale stranding capital of the world, with more than 5,000 incidents recorded since 1840, and an average of 300 individual animals beaching themselves each year.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="98c683a7df9c83b2c13de2d93ca1825199ed5150" id="img-3">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d2432083289db6bd42f6ad7adc64a78d" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3166" /><a href="#img-3" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 65.96%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=7234718ccc92b4251bdfe4c505f064f8 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b80f7e8fcfbbe8e12fa6954ddeb3bd1e 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=78ebc960d0c15f627bfbe60cd770a139 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1319684ba57c18162a45e56384d418b0 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=3170b3a80d76d6c6422b65045444829e 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e835570164cc241d4009af47fc1051f7 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, watched by his father Hori Parata, carves a traditional Maōri design at their home in Whangārei. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father, Hori Parata" src="https://i.guim.co.uk/img/media/98c683a7df9c83b2c13de2d93ca1825199ed5150/0_0_4800_3166/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2f198e1958f140f3ac664a3fdd87177c" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Kauri (Te Kaurinui Robert) Parata, watched by his father, Hori Parata, carves a traditional Māori design at their home in Whangārei. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father
+ </p>
+ </li>
+ </ul>
+ <p>
+ Concrete information on why whales strand remains elusive, but “sickness, navigational error, geographical features, a rapidly falling tide, being chased by a predator, or extreme weather” are all thought to contribute, according to the New Zealand Department of Conservation.
+ </p>
+ <p>
+ Climate change is to blame too, <a href="https://www.radionz.co.nz/news/national/377272/new-zealand-beached-whales-why-are-so-many-getting-stranded" data-link-name="in body link" class="u-underline in-body-link--immersive">scientists think</a>, with warming ocean temperatures moving whales’ prey closer to the shore and forcing them to pursue their food into shallow waters.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="0447972cf47ca67882fcfc648edf7e574b0853bc" id="img-4">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0e7302276c6cc7cb65be9bcdacd3081f" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-4" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=933c5693fbf9195f6e83a8928283f85e 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e07b988894308f3bfc052d1ff9dfc1e2 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=113cf92fe80bc5996634c34b3c7a0c09 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=5a7358223e80941bd1b0e0f427beefde 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=292e941797de1671c185c1b074c688ad 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d1bc1c4d9341f9b6d63b64861a3de711 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="A bin of small whale bones." src="https://i.guim.co.uk/img/media/0447972cf47ca67882fcfc648edf7e574b0853bc/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=718132fd888108a18383c24a8425523b" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--halfWidth fig--narrow-caption fig--has-shares element-image--photo-essay half-width-odd" data-media-id="416800b8d06039780c3e6de28564e6f277b4e7b7" id="img-5">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=249ddc3119aa637c3a1ae4998509f604" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-5" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=4197b7a2bc3c7e32d3eaee927b9d08e6 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=82d6908c6ffe622566e1cc6513d60ddd 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=222e300fb2a60da1a841fbbc2bc8f752 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=63ba1cfe4b5e7c7d741d311d58997fcf 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=231139825b311ede8d01e6c702d6d12c 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1065dd4439e14c72fe520c19566172e2 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="The baleen recovered from a stranded Pygmy Right Whale." src="https://i.guim.co.uk/img/media/416800b8d06039780c3e6de28564e6f277b4e7b7/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c5a53178ebbe54490c97fad6b5e032c4" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--halfWidth fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="8c207197c0a9e6f407dcddfded5f868a142c9cab" id="img-6">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=bcfefc5593dcc2bdb0dd3b0543cfa4eb" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-6" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=d272c4dc57408daa0dcdf5461a230e9e 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=890f0e0cee54663a90292471a16f95d2 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=59a57c5bded93fe0efe0046226fe7c69 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f1b2a4c79e965aa76a322ad25072a052 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=ffbdfd671eb45e3a87e3dc9137e8b006 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c560f0b0ef9736c1a66215cc29c59d43 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Squid beaks, from the stomach of a Sperm Whale." src="https://i.guim.co.uk/img/media/8c207197c0a9e6f407dcddfded5f868a142c9cab/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0dd659ae339b1aea9a99ed7f6f8eadeb" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Clockwise from top: small whale bones; squid beaks, from the stomach of a sperm whale; the baleen filter-feeder system recovered from a stranded pygmy right whale.
+ </p>
+ </li>
+ </ul>
+ <h2>
+ ‘Unprecedented’ strandings
+ </h2>
+ <p>
+ November marked the beginning of whale stranding season, and it started with a surge in incidents, according to whale rescue group Project Jonah, with <a href="https://www.theguardian.com/environment/video/2018/nov/26/whales-die-stranded-stewart-island-new-zealand-beach-video" data-link-name="in body link" class="u-underline in-body-link--immersive">140 pilot whales</a> beaching and dying on Stewart Island, 10 rare pygmy whales on Ninety Mile beach, 51 stranded and dead on the Chatham Islands and a spate of individual cases around the country.
+ </p>
+ <p>
+ And as more whales beach and die – from exhaustion, heat stroke or seagulls feasting on their flesh – an acute sense of grief is growing among New Zealand’s indigenous people, who regard whales as their ancestors and <em>taonga</em> (treasures).
+ </p>
+ <p>
+ “These days it is like a zoo. People just want to come and gawk at us, without even trying to understand what is happening with the animals and the environment,” says Parata, bristling with anger.
+ </p>
+ <figure class="element element-interactive interactive" data-interactive="https://interactive.guim.co.uk/embed/iframe-wrapper/0.1/boot.js" data-canonical-url="https://interactive.guim.co.uk/uploader/embed/2019/01/stranded_whales/giv-3902U99iNUM3iDSZ/" data-alt="whale strandings">
+ <a href="https://interactive.guim.co.uk/uploader/embed/2019/01/stranded_whales/giv-3902U99iNUM3iDSZ/" data-link-name="in body link" class="u-underline in-body-link--immersive">whale strandings</a>
+ </figure>
+ <p>
+ “When will we talk about what is hurting these animals out on the sea? They are drowning out there, they can’t breathe, they beach themselves to be with the Aunties.”
+ </p>
+ <p>
+ Ngātiwai believe the whales beach when they are ready to die and want to return to their families, the Māori people. Then, their human families use the whales’ gift of their bodies for sacred carvings, for traditional medicines, and even for compost.
+ </p>
+ <p>
+ There are marked tribal differences across New Zealand and while some tribes work to refloat stranded whales, others like Parata’s Ngātiwai stand back and allow the Department of Conservation and volunteer groups to take the lead in rescue efforts.
+ </p>
+ <p>
+ Then the tribe moves in en masse and holds a <em>karakia</em> (prayer), names each animal and sets to work removing their bones, blubber, eyes and teeth for cultural purposes.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--immersive fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="0d13adeb0790af5c5fa317ce477c323d0e1c773c" id="img-7">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d73916fda0f6c60b5eebcb71fea643e9" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="2334" /><a href="#img-7" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 48.63%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1300&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=524b92a6590a1b5c139bfe50581476a1 2600w" /> <source media="(min-width: 1300px)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=837d7df48e565ffad49febab20fbd179 1300w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1140&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=fe98f4515ae3490f53804235a4dcf84b 2280w" /> <source media="(min-width: 1140px)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1140&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a3ec73ab7f20798ec264f5ecb59f6bcc 1140w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1125&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=3ac3fd319accb248cf8a13e8ef55ebcc 2250w" /> <source media="(min-width: 980px)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=1125&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2561c80af0d0e8eed2fc7c535be48696 1125w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="965px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=965&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=539617a30ea852b01218eec69d6066e6 1930w" /> <source media="(min-width: 740px)" sizes="965px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=965&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=624139eae65dd4c96efd1a90243b9286 965w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="725px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=725&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=633619afab6a0ee26a3839b69160e854 1450w" /> <source media="(min-width: 660px)" sizes="725px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=725&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=98b9351340e8ee30063a4b6eb6501d6f 725w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=645&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e11a31f8adaab06b457fd9c7dda6bf6d 1290w" /> <source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=645&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=912104c53b38d1cd424bfb82302480e1 645w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=465&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=209259fab8ec9e81386838f2d5cdecc3 930w" /> <source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=465&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=06848a63793084a21bc86aa613b126a7 465w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Buck Cullen with his daughter Kaiarahi (10 months) in his back yard where he is storing a pair of massive Sperm Whale jawbones. Buck is a integral member of the whale recovery team, alongside Hori Parata." src="https://i.guim.co.uk/img/media/0d13adeb0790af5c5fa317ce477c323d0e1c773c/0_0_4800_2334/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=41b88ee343b9be76688b88443c7a8958" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Buck Cullen with his daughter Kaiarahi (10 months) in his backyard, where he is storing a pair of massive sperm whale jawbones. Cullen is an integral member of Hori Parata’s whale recovery team
+ </p>
+ </li>
+ </ul>
+ <p>
+ But indigenous elders say they aren’t being listened to when they tell the government their whale kin are sick, and trying to escape an increasingly polluted and unpredictable ocean.
+ </p>
+ <p>
+ Earlier this year in South Taranaki, a mass stranding that was described as <a href="https://www.stuff.co.nz/national/104249829/unprecedented-whale-strandings-reaches-11-in-total-on-taranaki-beach" data-link-name="in body link" class="u-underline in-body-link--immersive">“unprecedented”</a> left the local Māori tribe scrambling. Security was brought in when thieves attacked a sperm whale with an axe, trying to remove valuable teeth from its jaw.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="4973b41f53b8ade499f99a305b01157eca659ca5" id="img-8">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ee921715aaf10e0816dcf15dfc3a21f5" />
+ <meta itemprop="width" content="1200" />
+ <meta itemprop="height" content="900" /><a href="#img-8" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 75.00%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=8eb5af62092c8a0eb0d283cb0887f5c5 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9ace0f595be568263c5991993632dae8 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=97219f131f1013d15fed7c63308f2b2f 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=17191691b6cd81c2a67730d5475db08b 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=30d51b75767551399ba174bae5c39e94 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=936568b6e7da0a710abcd2c015fd0a8b 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="12 Parāoa Whales (Sperm Whales) recently stranded on the South Taranaki coast of Kaupokonui, on a scale not seen on their coast in recent memory." src="https://i.guim.co.uk/img/media/4973b41f53b8ade499f99a305b01157eca659ca5/0_0_1200_900/master/1200.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7c255bf6f8a27c56365a86813cdd1517" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ 12 parāoa whales (sperm whales) recently stranded on the South Taranaki coast of Kaupokonui, on a scale not seen near this location in recent memory
+ </p>
+ </li>
+ </ul>
+ <p>
+ Parata and his 22-year-old son, Te Kaurinui Robert Parata, were called in to assist. Te Kaurinui was called after the first whale his father ever named, and left university this year to return to Whangārei and study whale <em>tikanga</em> (protocol) and carving.
+ </p>
+ <p>
+ He says mass strandings are getting more local and international attention and money from donations, but traditional knowledge is being dismissed as overly spiritual.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--showcase fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="d1941b6a6908314fab28f44da222a4c892213341" id="img-9">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4e46b70079819caee86359a058c92be1" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3120" /><a href="#img-9" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 65.00%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=b775d649981f7bc36cf0753dd9f47862 1760w" /> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=3aa0de336dad5991ff92d488288fcc92 880w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=9133cf8cd42d42bb1342dbefbfc67c22 1600w" /> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2916efc01252a457768bfd28b40591ee 800w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=c7044b93d3aa73f7eac1b56ab9d77d86 1280w" /> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2342e6519bfe1ce74a04ca96c06ed4cd 640w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=b6218129f26e09d8133bf226df3e9bed 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=9d20a1ca789f2efe7ba2dfdef9c28725 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=73fb4a4f8d59a92325fef9faa2ddf90d 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7894b6600fbb6af1ec6552007ad12da8 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=19022ce9fcafebe383880059f34add78 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ded05f2c1859d70d3b8d3de3dcb75e0f 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, of the New Zealand Māori tribe Ngāti Wai, in front of the carving shed at Hihiaua Cultural Centre in Whangarei" src="https://i.guim.co.uk/img/media/d1941b6a6908314fab28f44da222a4c892213341/0_0_4800_3120/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=76a26a289728e3d625e57d32eced57d8" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Clockwise from top: Te Kaurinui Parata, in front of the carving shed at Hihiaua Cultural Centre in Whangārei; Parata holds three whale teeth recovered from a beached whale – the middle one shows marks where a poacher had attempted to hack it out with an axe before the recovery group arrived; the Pou, a tribal identifier, in front of the carving shed.
+ </p>
+ </li>
+ </ul>
+ <h2>
+ ‘We need to listen’
+ </h2>
+ <p>
+ Māori harvest rights over dead whales have only been officially recognised since 1998, and the practice still elicits horror from some New Zealanders and visitors.
+ </p>
+ <p>
+ “Our own ancestors wouldn’t say to go down there and hug the whales. That’s a modern thing,” says Te Kaurinui.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--portrait element--halfWidth fig--narrow-caption fig--has-shares element-image--photo-essay half-width-odd" data-media-id="14b462f5d9489def554e0f9f436f13aec332f7b8" id="img-10">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b8bf0c299908608310fb47e4163afb38" />
+ <meta itemprop="width" content="4278" />
+ <meta itemprop="height" content="4800" /><a href="#img-10" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 112.20%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=1a392a17d0c74d513ff14129ae5f7e6c 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d5b05458659a4a06ff6583046f712ad1 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=649c2127cfbab69a7d6e4085ea098d95 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d45dfb664b5479650ba067c6a5af16c3 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f94f4c652479979124e52c237804eb83 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f6c8d3b38a8af6d197d0a60d22a326f3 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="The Pou in front of the carving shed at Hihiaua Cultural centre" src="https://i.guim.co.uk/img/media/14b462f5d9489def554e0f9f436f13aec332f7b8/0_0_4278_4800/master/4278.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=a45ec7578a392eec201d2f6920b609a0" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--portrait element--halfWidth fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="e2cf54c36f17c6894844ea0cdd4346288a002da9" id="img-11">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=3691946929b4105ba35ff9d306cb4fbc" />
+ <meta itemprop="width" content="3172" />
+ <meta itemprop="height" content="3189" /><a href="#img-11" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 100.54%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=be6cf9beea564e7be872193b01c329a3 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=c74497ec55bb1b680169d62684aa803d 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=06b2c03638556f85da582e419cf1817a 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8cc04403e3902dbe1e4a9b01b8d4e517 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=893cbf39d6db1d28ba8fc85419382f9d 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=6df725aaf59e21b09434b967e05b3272 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Kauri (Tekaurinui Robert) Parata, holds three whale teeth recovered from a beached whale. The middle tooth shows the marks where a poacher had attempted to hack it out with an axe before the recovery group arrived. Kauri is a member of the Manu Taupunga group that is the organising arm of the whale-body recovery operation started by his father, Hori Parata." src="https://i.guim.co.uk/img/media/e2cf54c36f17c6894844ea0cdd4346288a002da9/915_0_3172_3189/master/3172.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0bd8e9f51bdf79a6e0a15ed176cfb57d" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <p>
+ The Ngātiwai are investigating a possible link between the crisis of the dieback disease killing New Zealand’s native kauri trees – and <a href="https://www.theguardian.com/world/2018/jul/14/like-losing-family-time-may-be-running-out-for-new-zealands-most-sacred-tree" data-link-name="in body link" class="u-underline in-body-link--immersive">threatening the giant Tāne Mahuta, which may be 2,000 years old</a> – and the increase in whale strandings.
+ </p>
+ <p>
+ Parata and his family believe whale oil and byproducts could be used to try to cure Kauri dieback, and want more government money and attention directed towards indigenous knowledge of the interconnectedness of the New Zealand environment, and possible indigenous solutions.
+ </p>
+ <p>
+ “People dismiss us when we tell them our spiritual understanding of whales – why they are beaching, why they are hurting,” says Te Kaurinui.
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--immersive fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="b5f3736b2ba2ef4df364258b0efcaba26f571d6e" id="img-12">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=72146577e379bdf9a21bc47994de5fb6" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3073" /><a href="#img-12" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 64.02%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1300&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=4bd713ae6f60b56e36378bb2fe45e9eb 2600w" /> <source media="(min-width: 1300px)" sizes="1300px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=b93c6d33ca7496220eb30d0c8bfaccf9 1300w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1140&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=f66f5a256170eced3c0a52aee235ae29 2280w" /> <source media="(min-width: 1140px)" sizes="1140px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1140&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1f60eb7cf5fc6f899c7c9af9c05df9a0 1140w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1125&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=27526c9caf1a62110dfa16214ceccf14 2250w" /> <source media="(min-width: 980px)" sizes="1125px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=1125&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7d47ba3d7898a398e1f9d8f2d19d391e 1125w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="965px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=965&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=8974cfeb3e33bc51b55518f1bc81e68d 1930w" /> <source media="(min-width: 740px)" sizes="965px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=965&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=04f953b4ec9555178204a1621b8a1f59 965w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="725px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=725&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=7e2c1494173f83f555806120a1fe43cc 1450w" /> <source media="(min-width: 660px)" sizes="725px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=725&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=8f53cf25b514e283cce3d995220ca19b 725w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="645px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=645&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=2b770ca04273c921c8abe0a7de72030a 1290w" /> <source media="(min-width: 480px)" sizes="645px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=645&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=0da775328d9ade5ca605079a9118a64a 645w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="465px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=465&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e2e51037c5a6b8bf22d87cb927e45888 930w" /> <source media="(min-width: 0px)" sizes="465px" srcset="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=465&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7ecf73b514ceb1b5e0391f17c7a4d3b0 465w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="Whangārei Harbour from Tamaterau, looking south through Mangrove sprouts coming up through the harbourside silt." src="https://i.guim.co.uk/img/media/b5f3736b2ba2ef4df364258b0efcaba26f571d6e/0_0_4800_3073/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7fcadc35b3a44ebafe3c469c6e89241d" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Whangārei Harbour seen from Tamaterau, with mangrove sprouts coming up through the harbourside silt
+ </p>
+ </li>
+ </ul>
+ <p>
+ “We are not foreigners in this land. We did not take this land off anyone else. We were not lost waiting for some bullheads to tell us what was going on.”
+ </p>
+ <p>
+ Kaitaia conservation department ranger Jamie Werner of Ngātiwai recently attended his first mass beaching on Ninety Mile Beach. It was the first recorded time pygmy whales had stranded on New Zealand shores.
+ </p>
+ <p>
+ “I arrived at the beach and we leapfrogged between the animals. They were calling out to each other and reassuring each other,” says Werner. “It was a shock. We’re working to adapt but the ocean is changing so fast.”
+ </p>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape element--showcase fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="d5aaf60e3a427f278747acf0c3e7ba39b39ef923" id="img-13">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1d00d3ea91d32110b40d85ff43227728" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-13" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 1300px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1300px) and (min-resolution: 120dpi)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=2a64f318f02a31bdf9f17ae01fca72a3 1760w" /> <source media="(min-width: 1300px)" sizes="880px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=880&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=811b3a2ecee1a87b72813d328f59aa85 880w" /> <source media="(min-width: 1140px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 1140px) and (min-resolution: 120dpi)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=47418e3f630c00af6124c471fdc54c20 1600w" /> <source media="(min-width: 1140px)" sizes="800px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=800&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=93ec03888887d5eb6eabf07e40f2ed3b 800w" /> <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=476d165704890f40cc5f2d74f4d09b95 1280w" /> <source media="(min-width: 980px)" sizes="640px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=640&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=6179da6bca697f83ac063a56660aa31b 640w" /> <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=df0c5b9ccac02dcd010d7f3ed8ff8c85 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e9fd2eedc9bb80286a6cabd1c7c3b0e2 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e48f277772be7e455f9a4a4139b3bf4c 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=2e0af911fcd7011f04ee91d445290e84 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=15161e07957f327b44aa124d94ae8291 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=ef6c6809f2adcff0f4ff32899095839b 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="The skull of a Brydes whale, in the storage container at Hihiaua Cultural Centre, Whangārei." src="https://i.guim.co.uk/img/media/d5aaf60e3a427f278747acf0c3e7ba39b39ef923/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=1b74b488aedb864287ff160f86d74c9d" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <ul>
+ <li>
+ <p>
+ Above, the skull of a bryde’s whale; right, a large-calibre bullet of the type that the New Zealand Department of Conservation uses for euthanasing stranded whales that are beyond rescue
+ </p>
+ </li>
+ </ul>
+ <figure itemprop="associatedMedia image" itemscope="itemscope" itemtype="http://schema.org/ImageObject" data-component="image" class="element element-image img--landscape fig--narrow-caption fig--has-shares element-image--photo-essay" data-media-id="3766106f73e858d5b140ae3cdd2eef84060180cd" id="img-14">
+ <meta itemprop="url" content="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7dca3d798aef3526f42e281771d50f91" />
+ <meta itemprop="width" content="4800" />
+ <meta itemprop="height" content="3200" /><a href="#img-14" class="article__img-container js-gallerythumbs in-body-link--immersive" data-link-name="Launch Article Lightbox" data-is-ajax="">
+ <div class="u-responsive-ratio" style="padding-bottom: 66.67%">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 660px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 660px) and (min-resolution: 120dpi)" sizes="620px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=0daf794415132fc19259f8d2f654f57f 1240w" /> <source media="(min-width: 660px)" sizes="620px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=620&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=98ce62f9d983fe8059c936a6c6cdff33 620w" /> <source media="(min-width: 480px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 480px) and (min-resolution: 120dpi)" sizes="605px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=9ff4aac2a3b07867dfdfb8f470ea6977 1210w" /> <source media="(min-width: 480px)" sizes="605px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=605&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=10d1b71094ecf1722f593eb49bb2effe 605w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="445px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=0705690fcb523f2781a5952f83528ff9 890w" /> <source media="(min-width: 0px)" sizes="445px" srcset="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=445&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=4c748337df5f0348eb0e7d3e3ec46571 445w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="gu-image" itemprop="contentUrl" alt="A large calibre bullet of the type that the New Zealand Department of Conservation (DOC) uses for euthanasing stranded whales that are beyond rescue." src="https://i.guim.co.uk/img/media/3766106f73e858d5b140ae3cdd2eef84060180cd/0_0_4800_3200/master/4800.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=d2f5bb7c3c3642ac8733ca40509f6e20" /></picture>
+ </div><span class="inline-expand-image inline-icon centered-icon rounded-icon article__fullscreen modern-visible"><svg width="22" height="22" viewbox="0 0 22 22" class="centered-icon__svg rounded-icon__svg article__fullscreen__svg modern-visible__svg inline-expand-image__svg inline-icon__svg">
+ <path d="M3.4 20.2L9 14.5 7.5 13l-5.7 5.6L1 14H0v7.5l.5.5H8v-1l-4.6-.8M18.7 1.9L13 7.6 14.4 9l5.7-5.7.5 4.7h1.2V.6l-.5-.5H14v1.2l4.7.6"></path></svg></span></a>
+ </figure>
+ <p>
+ The recent spate of mass strandings has been described as “heartbreaking” by the conservation department.
+ </p>
+ <p>
+ But for Parata and his family the slow, painful deaths of their ancestors are personal – and ultimately devastating – for the health of the tribe and the sea.
+ </p>
+ <p>
+ “It’s very emotional. Our ancestors tell us the strandings are a sign from the sea. So what is the sea telling us? We need to listen.”
+ </p>
+ </div>
+ <div class="submeta">
+ <span class="submeta__label">Topics</span>
+ <div class="submeta__section-labels">
+ <ul class="submeta__links">
+ <li class="submeta__link-item">
+ <a class="submeta__link" data-link-name="" href="https://www.theguardian.com/environment/series/seascape-the-state-of-our-oceans">Seascape: the state of our oceans</a>
+ </li>
+ </ul>
+ </div>
+ <div class="submeta__keywords">
+ <ul class="submeta__links">
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/world/newzealand" data-link-name="keyword: world/newzealand">New Zealand</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/world/asia-pacific" data-link-name="keyword: world/asia-pacific">Asia Pacific</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/environment/whales" data-link-name="keyword: environment/whales">Whales</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/environment/cetaceans" data-link-name="keyword: environment/cetaceans">Cetaceans</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/environment/marine-life" data-link-name="keyword: environment/marine-life">Marine life</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/environment/wildlife" data-link-name="keyword: environment/wildlife">Wildlife</a>
+ </li>
+ <li class="submeta__link-item">
+ <a class="submeta__link" href="https://www.theguardian.com/tone/features" data-link-name="tone: features">features</a>
+ </li>
+ </ul>
+ </div>
+ <div data-component="share" class="submeta__share">
+ <ul class="social social--bottom js-social--bottom u-unstyled u-cf" data-component="social">
+ <li class="social__item social__item--facebook" data-link-name="facebook">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="https://www.facebook.com/dialog/share?app_id=180444840287&amp;href=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_fb" target="_blank" title="Facebook"><span class="inline-icon__fallback button">Share on Facebook</span> <span class="inline-share-facebook inline-icon rounded-icon centered-icon social-icon social-icon--facebook"><svg width="32" height="32" viewbox="-2 -2 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--facebook__svg inline-share-facebook__svg inline-icon__svg">
+ <path d="M17.9 14h-3v8H12v-8h-2v-2.9h2V8.7C12 6.8 13.1 5 16 5c1.2 0 2 .1 2 .1v3h-1.8c-1 0-1.2.5-1.2 1.3v1.8h3l-.1 2.8z"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--twitter" data-link-name="twitter">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="https://twitter.com/intent/tweet?text='What%20is%20the%20sea%20telling%20us%3F'%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy&amp;url=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_tw" target="_blank" title="Twitter"><span class="inline-icon__fallback button">Share on Twitter</span> <span class="inline-share-twitter inline-icon rounded-icon centered-icon social-icon social-icon--twitter"><svg width="32" height="32" viewbox="-2 -2 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--twitter__svg inline-share-twitter__svg inline-icon__svg">
+ <path d="M21.3 10.5v.5c0 4.7-3.5 10.1-9.9 10.1-2 0-3.8-.6-5.3-1.6.3 0 .6.1.8.1 1.6 0 3.1-.6 4.3-1.5-1.5 0-2.8-1-3.3-2.4.2 0 .4.1.7.1l.9-.1c-1.6-.3-2.8-1.8-2.8-3.5.5.3 1 .4 1.6.4-.9-.6-1.6-1.7-1.6-2.9 0-.6.2-1.3.5-1.8 1.7 2.1 4.3 3.6 7.2 3.7-.1-.3-.1-.5-.1-.8 0-2 1.6-3.5 3.5-3.5 1 0 1.9.4 2.5 1.1.8-.1 1.5-.4 2.2-.8-.3.8-.8 1.5-1.5 1.9.7-.1 1.4-.3 2-.5-.4.4-1 1-1.7 1.5z"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--email" data-link-name="email">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="mailto:?subject='What%20is%20the%20sea%20telling%20us%3F'%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy&amp;body=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_link" target="_blank" title="Email"><span class="inline-icon__fallback button">Share via Email</span> <span class="inline-share-email inline-icon rounded-icon centered-icon social-icon social-icon--email"><svg width="32" height="32" viewbox="0 0 32 32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--email__svg inline-share-email__svg inline-icon__svg">
+ <path d="M23.363 20.875H8.637v-8.938l6.545 5.687h1.637l6.544-5.687v8.938zm-1.635-9.75L16 16l-5.728-4.875h11.456zM23.363 9.5H8.637L7 11.125v9.75L8.637 22.5h14.727L25 20.875v-9.75L23.363 9.5z"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--linkedin" data-link-name="linkedin">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="http://www.linkedin.com/shareArticle?mini=true&amp;title=%27What%20is%20the%20sea%20telling%20us%3F%27%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy&amp;url=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" target="_blank" title="LinkedIn"><span class="u-h">Share on LinkedIn</span> <span class="inline-share-linkedin inline-icon rounded-icon centered-icon social-icon social-icon--linkedin"><svg width="30" height="30" viewbox="0 0 30 30" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--linkedin__svg inline-share-linkedin__svg inline-icon__svg">
+ <path d="M10.576 7.985a1.57 1.57 0 0 1 0 3.137 1.568 1.568 0 0 1 0-3.137zm-1.353 4.327h2.706v8.704H9.223v-8.704zm4.403 0h2.595v1.19h.037c.361-.685 1.244-1.407 2.56-1.407 2.737 0 3.243 1.803 3.243 4.147v4.774h-2.702v-4.232c0-1.01-.02-2.308-1.406-2.308-1.408 0-1.623 1.1-1.623 2.235v4.305h-2.704v-8.704"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--pinterest" data-link-name="pinterest">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="http://www.pinterest.com/pin/find/?url=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings" target="_blank" title="Pinterest"><span class="u-h">Share on Pinterest</span> <span class="inline-share-pinterest inline-icon rounded-icon centered-icon social-icon social-icon--pinterest"><svg viewbox="0 0 32 32" width="32" height="32" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--pinterest__svg inline-share-pinterest__svg inline-icon__svg">
+ <path d="M16.363 8C12.133 8 10 11.13 10 13.74c0 1.582.58 2.988 1.823 3.512.204.086.387.003.446-.23.04-.16.137-.568.18-.737.06-.23.037-.312-.127-.513-.36-.436-.588-1-.588-1.802 0-2.322 1.684-4.402 4.384-4.402 2.39 0 3.703 1.508 3.703 3.522 0 2.65-1.136 4.887-2.822 4.887-.93 0-1.628-.795-1.405-1.77.268-1.165.786-2.42.786-3.262 0-.752-.39-1.38-1.2-1.38-.952 0-1.716 1.017-1.716 2.38 0 .867.284 1.454.284 1.454l-1.146 5.006c-.34 1.487-.05 3.31-.026 3.493.014.108.15.134.21.05.09-.117 1.223-1.562 1.61-3.006.108-.41.625-2.526.625-2.526.31.61 1.215 1.145 2.176 1.145 2.862 0 4.804-2.693 4.804-6.298C22 10.54 19.763 8 16.363 8"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--whatsapp" data-link-name="whatsapp">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="whatsapp://send?text=%22'What%20is%20the%20sea%20telling%20us%3F'%3A%20M%C4%81ori%20tribes%20fearful%20over%20whale%20strandings%20%7C%20Eleanor%20Ainge%20Roy%22%20https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_wa" target="_blank" title="WhatsApp"><span class="u-h">Share on WhatsApp</span> <span class="inline-share-whatsapp inline-icon rounded-icon centered-icon social-icon social-icon--whatsapp"><svg width="30" height="30" viewbox="0 0 30 30" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--whatsapp__svg inline-share-whatsapp__svg inline-icon__svg">
+ <path d="M22.09 7.87a9.9 9.9 0 0 0-7.05-2.92c-5.49 0-9.96 4.47-9.96 9.96 0 1.75.46 3.47 1.33 4.98L5 25.04l5.28-1.38c1.45.79 3.09 1.21 4.76 1.21 5.49 0 9.96-4.47 9.96-9.96a9.92 9.92 0 0 0-2.91-7.04m-7.05 15.32c-1.49 0-2.95-.4-4.22-1.15l-.3-.18-3.13.82.84-3.05-.2-.31a8.19 8.19 0 0 1-1.26-4.41c0-4.56 3.71-8.27 8.28-8.27 2.21 0 4.29.86 5.85 2.43a8.222 8.222 0 0 1 2.42 5.85c0 4.56-3.72 8.27-8.28 8.27m4.54-6.2c-.25-.12-1.47-.73-1.7-.81s-.39-.12-.56.12c-.17.25-.64.81-.79.97-.14.17-.29.19-.54.06-.25-.12-1.05-.39-2-1.23a7.283 7.283 0 0 1-1.38-1.72c-.15-.25-.02-.38.11-.51.11-.11.25-.29.37-.44.12-.15.17-.25.25-.42.08-.17.04-.31-.02-.44-.06-.12-.56-1.35-.77-1.85-.2-.49-.41-.42-.56-.43-.14-.01-.31-.01-.48-.01-.17 0-.44.06-.66.31-.22.25-.87.85-.87 2.08 0 1.22.89 2.41 1.02 2.57.12.17 1.75 2.68 4.25 3.76.59.26 1.06.41 1.42.52.6.19 1.14.16 1.57.1.48-.07 1.47-.6 1.68-1.18s.21-1.08.14-1.18c-.06-.08-.23-.14-.48-.27"></path></svg></span></a>
+ </li>
+ <li class="social__item social__item--messenger" data-link-name="messenger">
+ <a class="social__action js-social__action--bottom social-icon-wrapper" data-link-name="social bottom" href="fb-messenger://share?link=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings%3FCMP%3Dshare_btn_me&amp;app_id=180444840287" target="_blank" title="Messenger"><span class="u-h">Share on Messenger</span> <span class="inline-share-messenger inline-icon rounded-icon centered-icon social-icon social-icon--messenger"><svg width="66" height="66" viewbox="-12 -12 90 90" class="rounded-icon__svg centered-icon__svg social-icon__svg social-icon--messenger__svg inline-share-messenger__svg inline-icon__svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M33 61.1c-3.6 0-7.1-.5-10.4-1.5L10.1 66V52.5C3.9 47 0 39.2 0 30.6 0 13.7 14.8 0 33 0s33 13.7 33 30.6c0 16.8-14.8 30.5-33 30.5zM36.5 41L28 32.2l-16.4 9 18-18.9 8.5 8.8 16.4-9-18 18.9z"></path></svg></span></a>
+ </li>
+ </ul>
+ </div>
+ <div class="submeta__syndication">
+ <ul class="syndication--bottom u-unstyled">
+ <li class="syndication__item">
+ <a class="syndication__action" data-link-name="meta-syndication-article" href="https://syndication.theguardian.com/automation/?url=https%3A%2F%2Fwww.theguardian.com%2Fenvironment%2F2019%2Fjan%2F03%2Fwhat-is-the-sea-telling-us-maori-tribes-fearful-over-whale-strandings&amp;type=article&amp;internalpagecode=5475429" target="_blank" title="Reuse this content"><span class="syndication__link button button--syndication-reprint button--small">Reuse this content</span></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="after-article js-after-article"></div>
+ </div>
+ <div class="content__secondary-column js-secondary-column" aria-hidden="true">
+ <div class="aside-slot-container js-aside-slot-container" aria-hidden="true">
+ <div id="dfp-ad--right" class="js-ad-slot ad-slot ad-slot--right ad-slot--mpu-banner-ad" data-link-name="ad slot right" data-name="right" data-mobile="1,1|2,2|300,250|300,274|300,600|fluid|300,1050" aria-hidden="true"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </article>
+ <div class="content-footer content-footer--pillar-news">
+ <aside class="related more-on-this-story js-outbrain-anchor" aria-labelledby="related-content-head">
+ <section id="more-on-this-story" class="fc-container fc-container--will-have-toggle js-container--toggle" data-link-name="container-3 | more-on-this-story" data-id="more-on-this-story" data-component="more-on-this-story" aria-expanded="true">
+ <div class="fc-container__inner">
+ <header class="fc-container__header js-container__header">
+ <div class="fc-container__header__title">
+ <h2 tabindex="0">
+ more on this story
+ </h2>
+ </div>
+ </header>
+ <div class="fc-container--rolled-up-hide fc-container__body fc-show-more--hidden fc-show-more--mobile-only js-container--fc-show-more" data-title="more on this story" data-id="more-on-this-story">
+ <div class="fc-slice-wrapper">
+ <ul class="u-unstyled l-row l-row--cols-4 fc-slice fc-slice--q-q-q-q">
+ <li class="fc-slice__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-media-mobile fc-item--standard-tablet js-snappable" data-link-name="news | group-0 | card-@1" data-item-visibility="all" data-test-id="facia-card" data-id="uk-news/2019/jan/03/sperm-whale-stranded-scottish-loch-eriboll" data-loyalty-short-url="/p/ac6zz">
+ <div class="fc-item__container">
+ <div class="fc-item__media-wrapper">
+ <div class="fc-item__image-container u-responsive-ratio">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="220px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=220&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=370d080740ef67f9aed8ed10ea0e4343" /> <source media="(min-width: 980px)" sizes="220px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=220&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=48fdf0f5977771cae1b68006a76f5fbf 220w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="160px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=160&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=4fb9868ab824e299c2766986d432af6d" /> <source media="(min-width: 740px)" sizes="160px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=160&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e32d6cc0f82623e2b5a6de266b6924b0 160w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="127px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=127&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=e5b29001b6d7db571c1212ffae196c95" /> <source media="(min-width: 0px)" sizes="127px" srcset="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=127&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e886eb10d60ca23b1e95e6e7b8cffb66 127w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="responsive-img" alt="" src="https://i.guim.co.uk/img/media/b36a66ec23ecd1e3f28d71972c95627473917251/0_170_5100_3060/master/5100.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=875ac32702331c81d5a2acb5470c061b" /></picture>
+ </div>
+ </div>
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/uk-news/2019/jan/03/sperm-whale-stranded-scottish-loch-eriboll" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Rescuers rush to help whale stranded in Scottish loch</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__standfirst">
+ Animal, thought to be a sperm whale, believed to have become caught in rope in Loch Eriboll
+ </div>
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2019-01-03T13:06:44+0000" data-timestamp="1546520804000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 3 Jan 2019</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/uk-news/2019/jan/03/sperm-whale-stranded-scottish-loch-eriboll" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Rescuers rush to help whale stranded in Scottish loch</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-slice__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-media-mobile fc-item--standard-tablet js-snappable" data-link-name="news | group-0 | card-@2" data-item-visibility="all" data-test-id="facia-card" data-id="environment/2018/nov/28/nearly-30-whales-stranded-on-remote-victorian-beach" data-loyalty-short-url="/p/a3byz">
+ <div class="fc-item__container">
+ <div class="fc-item__media-wrapper">
+ <div class="fc-item__image-container u-responsive-ratio">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="220px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=220&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=7f918ce311ff7c89d453682885a2ca3a" /> <source media="(min-width: 980px)" sizes="220px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=220&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=97999f3c00d2adba26b8ca71d944c680 220w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="160px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=160&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=b0fe304c0fb760ba2589637effb6ad91" /> <source media="(min-width: 740px)" sizes="160px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=160&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=f05754d79db3372f141e97c11d860060 160w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="127px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=127&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=20104b3e1ba4cbb9cbbdf2fbf8803edc" /> <source media="(min-width: 0px)" sizes="127px" srcset="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=127&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=7525d7c15c7ab65a9b56135d3a3c2926 127w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="responsive-img" alt="" src="https://i.guim.co.uk/img/media/d8ed8b77d2423f6dae927d34ce55ff231664f35e/0_206_3216_1930/master/3216.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=bb4d118b9bfc751cde033068ffbea858" /></picture>
+ </div>
+ </div>
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/nov/28/nearly-30-whales-stranded-on-remote-victorian-beach" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Nearly 30 whales stranded on remote Victorian beach</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__standfirst">
+ Humpback whale and 27 pilot whales among those beached in Croajingolong national park
+ </div>
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-11-27T22:03:19+0000" data-timestamp="1543356199000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 27 Nov 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/nov/28/nearly-30-whales-stranded-on-remote-victorian-beach" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Nearly 30 whales stranded on remote Victorian beach</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-slice__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--is-media-link fc-item--pillar-news fc-item--type-media fc-item--video js-fc-item fc-item--list-media-mobile fc-item--standard-tablet js-snappable" data-link-name="media | group-0 | card-@3" data-item-visibility="all" data-test-id="facia-card" data-id="environment/video/2018/nov/26/whales-die-stranded-stewart-island-new-zealand-beach-video" data-loyalty-short-url="/p/a3267">
+ <div class="fc-item__container">
+ <div class="fc-item__media-wrapper">
+ <div class="fc-item__video-container">
+ <div data-media-atom-id="417c63b3-fc0a-44bb-954b-eb881db46767" class="no-player u-responsive-ratio youtube-media-atom youtube-related-videos" data-channel-id="UCIRYBXDze5krPDzAEOxFGVA">
+ <div class="vjs-big-play-button youtube-media-atom__overlay" style="background-image: url(https://i.guim.co.uk/img/media/17ef936fcdcb6db08001cd1cefab0886acc85685/73_0_3353_2012/master/3353.jpg?width=700&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=021a8ebb925dea3f14986733dfb192a8)">
+ <div class="youtube-media-atom__play-button vjs-control-text">
+ Play Video <span class="inline-play inline-icon"><svg width="46" height="39" viewbox="0 0 46 39" class="inline-play__svg inline-icon__svg">
+ <path d="M46 20.58v-2.02L1.64 0 0 1.3v36.55L1.64 39 46 20.58z"></path></svg></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/video/2018/nov/26/whales-die-stranded-stewart-island-new-zealand-beach-video" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Over 140 whales die after becoming stranded on New Zealand beach – video</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst">
+ <p>
+ It is not fully understand why whale strandings take place
+ </p>
+ </div>
+ <div class="fc-item__footer-meta-wrapper">
+ <div class="fc-item__meta-wrapper">
+ <div class="fc-item__media-meta">
+ <span class="inline-video-icon inline-icon"><svg width="36" height="23" viewbox="0 0 36 23" class="inline-video-icon__svg inline-icon__svg">
+ <path d="M3.2 0L0 3.3v16.4L3.3 23H22V0H3.2m30.4 1L25 9v5l8.6 8H36V1h-2.4"></path></svg></span> <span class="fc-item__video-duration">1:15</span>
+ </div>
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-11-26T11:50:47+0000" data-timestamp="1543233047000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 26 Nov 2018</span></time>
+ </div>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/video/2018/nov/26/whales-die-stranded-stewart-island-new-zealand-beach-video" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Over 140 whales die after becoming stranded on New Zealand beach – video</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-slice__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-media-mobile fc-item--standard-tablet js-snappable" data-link-name="news | group-0 | card-@4" data-item-visibility="all" data-test-id="facia-card" data-id="environment/2018/nov/26/more-than-140-pilot-whales-die-in-heartbreaking-new-zealand-stranding" data-loyalty-short-url="/p/a2qvb">
+ <div class="fc-item__container">
+ <div class="fc-item__media-wrapper">
+ <div class="fc-item__image-container u-responsive-ratio">
+ <picture><!--[if IE 9]><video style="display: none;"><![endif]-->
+ <source media="(min-width: 980px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 980px) and (min-resolution: 120dpi)" sizes="220px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=220&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=429853cb01757532c842ac0f637a96d6" /> <source media="(min-width: 980px)" sizes="220px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=220&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=e40783f160942f49fdc73a77ba4d59ac 220w" /> <source media="(min-width: 740px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 740px) and (min-resolution: 120dpi)" sizes="160px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=160&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=62ab8655b48d1c1ef72a101295258bf2" /> <source media="(min-width: 740px)" sizes="160px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=160&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=fc5a4d4e165ba28ea00817f416bae258 160w" /> <source media="(min-width: 0px) and (-webkit-min-device-pixel-ratio: 1.25), (min-width: 0px) and (min-resolution: 120dpi)" sizes="127px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=127&amp;quality=45&amp;auto=format&amp;fit=max&amp;dpr=2&amp;s=ad0bd7effdd2cd76ffa9bed4892f869a" /> <source media="(min-width: 0px)" sizes="127px" srcset="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=127&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=5de4bad9212ee4e78ce2347bcbb46e50 127w" /> <!--[if IE 9]></video><![endif]-->
+ <img class="responsive-img" alt="" src="https://i.guim.co.uk/img/media/603fd890c17afa94c6fd0e41f87875be104b811a/38_0_4848_2912/master/4848.jpg?width=300&amp;quality=85&amp;auto=format&amp;fit=max&amp;s=05a043849ed68f9628b01515df14bec6" /></picture>
+ </div>
+ </div>
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/nov/26/more-than-140-pilot-whales-die-in-heartbreaking-new-zealand-stranding" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">More than 140 pilot whales die in 'heartbreaking' New Zealand stranding</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__standfirst">
+ A hiker camping in remote Stewart Island alerted authorities to the discovery
+ </div>
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-11-26T01:11:35+0000" data-timestamp="1543194695000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 25 Nov 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/nov/26/more-than-140-pilot-whales-die-in-heartbreaking-new-zealand-stranding" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">More than 140 pilot whales die in 'heartbreaking' New Zealand stranding</a>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div class="fc-slice-wrapper">
+ <ul class="u-unstyled l-row l-row--cols-4 fc-slice fc-slice--ql-ql-ql-ql">
+ <li class="fc-slice__item l-row__item l-row__item--span-4">
+ <ul class="u-unstyled l-list l-list--columns-4 l-list--rows-1">
+ <li class="fc-slice__item l-list__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-mobile fc-item--list-tablet js-snappable" data-link-name="news | group-0 | card-@5" data-item-visibility="all" data-test-id="facia-card" data-id="environment/2018/nov/20/indonesia-dead-whale-had-1000-pieces-of-plastic-in-stomach" data-loyalty-short-url="/p/axfgb">
+ <div class="fc-item__container">
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/nov/20/indonesia-dead-whale-had-1000-pieces-of-plastic-in-stomach" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Indonesia: dead whale had 1,000 pieces of plastic in stomach</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-11-20T10:27:31+0000" data-timestamp="1542709651000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 20 Nov 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/nov/20/indonesia-dead-whale-had-1000-pieces-of-plastic-in-stomach" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Indonesia: dead whale had 1,000 pieces of plastic in stomach</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-slice__item l-list__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-mobile fc-item--list-tablet js-snappable" data-link-name="news | group-0 | card-@6" data-item-visibility="all" data-test-id="facia-card" data-id="environment/2018/nov/05/sperm-whales-canadian-arctic" data-loyalty-short-url="/p/9p2hq">
+ <div class="fc-item__container">
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/nov/05/sperm-whales-canadian-arctic" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Sighting of sperm whales in Arctic a sign of changing ecosystem, say scientists</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-11-05T17:03:47+0000" data-timestamp="1541437427000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 5 Nov 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/nov/05/sperm-whales-canadian-arctic" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Sighting of sperm whales in Arctic a sign of changing ecosystem, say scientists</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-show-more--hide-on-mobile js-hide-on-mobile fc-slice__item l-list__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-mobile fc-item--list-tablet js-snappable" data-link-name="news | group-0 | card-@7" data-item-visibility="desktop" data-test-id="facia-card" data-id="environment/2018/oct/19/benny-the-beluga-whale-forces-firework-display-postponement" data-loyalty-short-url="/p/9ybyb">
+ <div class="fc-item__container">
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/oct/19/benny-the-beluga-whale-forces-firework-display-postponement" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Benny the beluga whale forces firework display postponement</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-10-19T21:18:05+0000" data-timestamp="1539983885000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 19 Oct 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/oct/19/benny-the-beluga-whale-forces-firework-display-postponement" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Benny the beluga whale forces firework display postponement</a>
+ </div>
+ </div>
+ </li>
+ <li class="fc-show-more--hide-on-mobile js-hide-on-mobile fc-slice__item l-list__item l-row__item l-row__item--span-1 u-faux-block-link">
+ <div class="fc-item fc-item--has-image fc-item--has-metadata fc-item--has-timestamp fc-item--is-commentable fc-item--pillar-news fc-item--type-article js-fc-item fc-item--list-mobile fc-item--list-tablet js-snappable" data-discussion-id="/p/9ty9a" data-discussion-closed="true" data-discussion-url="https://www.theguardian.com/environment/2018/oct/09/images-show-baby-humpback-whale-trapped-in-shark-net-off-queensland-coast#comments" data-link-name="news | group-0 | card-@8" data-item-visibility="desktop" data-test-id="facia-card" data-id="environment/2018/oct/09/images-show-baby-humpback-whale-trapped-in-shark-net-off-queensland-coast" data-loyalty-short-url="/p/9ty9a">
+ <div class="fc-item__container">
+ <div class="fc-item__content">
+ <div class="fc-item__header">
+ <h3 class="fc-item__title">
+ <a href="https://www.theguardian.com/environment/2018/oct/09/images-show-baby-humpback-whale-trapped-in-shark-net-off-queensland-coast" class="fc-item__link" data-link-name="article"><span class="u-faux-block-link__cta fc-item__headline"><span class="js-headline-text">Images show baby humpback whale trapped in shark net off Queensland coast</span></span></a>
+ </h3>
+ </div>
+ <div class="fc-item__standfirst-wrapper fc-item__standfirst-wrapper--timestamp">
+ <div class="fc-item__meta js-item__meta">
+ <time class="fc-item__timestamp js-item__timestamp" datetime="2018-10-09T06:16:33+0000" data-timestamp="1539065793000" data-relativeformat="short"><span class="inline-clock inline-icon"><svg width="11" height="11" viewbox="0 0 11 11" class="inline-clock__svg inline-icon__svg">
+ <path d="M5.4 0C2.4 0 0 2.4 0 5.4s2.4 5.4 5.4 5.4 5.4-2.4 5.4-5.4S8.4 0 5.4 0zm3 6.8H4.7V1.7h.7L6 5.4l2.4.6v.8z"></path></svg></span> <span class="fc-timestamp__text"><span class="u-h">Published:</span> 9 Oct 2018</span></time>
+ </div>
+ </div>
+ </div><a href="https://www.theguardian.com/environment/2018/oct/09/images-show-baby-humpback-whale-trapped-in-shark-net-off-queensland-coast" class="u-faux-block-link__overlay js-headline-text" data-link-name="article" tabindex="-1" aria-hidden="true">Images show baby humpback whale trapped in shark net off Queensland coast</a>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <div class="js-show-more-placeholder"></div><button class="button button--medium button--primary button--show-more collection__show-more js-show-more-button modern-visible" data-test-id="show-more" data-link-name="more"><span class="inline-plus inline-icon"><svg width="18" height="18" viewbox="0 0 18 18" class="inline-plus__svg inline-icon__svg">
+ <path d="M8.2 0h1.6l.4 7.8 7.8.4v1.6l-7.8.4-.4 7.8H8.2l-.4-7.8L0 9.8V8.2l7.8-.4.4-7.8z"></path></svg></span> <span class="inline-minus inline-icon"><svg width="32" height="32" viewbox="0 0 32 32" class="inline-minus__svg inline-icon__svg">
+ <path d="M5 15h22v3H5z"></path></svg></span> <span class="js-button-text">More more on this story</span></button>
+ </div>
+ </div>
+ </section>
+ </aside>
+ <aside id="onward" class="onward js-onward facia-container facia-container--layout-content js-outbrain-anchor"></aside>
+ <aside id="more-in-section" class="more-in-section js-more-in-section facia-container facia-container--layout-content"></aside>
+ <section class="fc-container fc-container--has-toggle js-most-popular-footer" data-link-name="most-popular" data-component="most-popular">
+ <div class="fc-container__inner">
+ <div class="fc-container__header js-container__header">
+ <h2 class="fc-container__header__title">
+ <a href="https://www.theguardian.com/most-read/environment" data-link-name="Most viewed environment">Most popular</a>
+ </h2>
+ </div>
+ <div class="fc-container--rolled-up-hide most-popular__container">
+ <div class="most-popular__content js-popular-trails"></div>
+ <div class="most-popular__mpu">
+ <div class="">
+ <div id="dfp-ad--mostpop" class="js-ad-slot ad-slot ad-slot--mostpop ad-slot--container-inline" data-link-name="ad slot mostpop" data-name="mostpop" data-mobile="1,1|2,2|300,250|300,274|fluid" data-tablet="1,1|2,2|300,250|300,274|300,600|728,90|fluid" data-desktop="1,1|2,2|300,250|300,274|300,600|fluid" aria-hidden="true"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+ <div class="fc-container fc-container--commercial js-container--commercial">
+ <div id="dfp-ad--merchandising" class="js-ad-slot ad-slot ad-slot--merchandising ad-slot--commercial-component" data-link-name="ad slot merchandising" data-name="merchandising" data-label="false" data-refresh="false" data-mobile="1,1|2,2|88,88|fluid" aria-hidden="true"></div>
+ </div>
+ </div>
+ <footer class="l-footer u-cf" data-link-name="footer" data-component="footer">
+ <div class="footer__primary">
+ <div class="js-expand-subnav subnav">
+ <div class="gs-container">
+ <ul class="subnav__list js-get-last-child-subnav" data-pillar-title="News">
+ <li class="subnav__item subnav__item--parent">
+ <a class="subnav-link" href="https://www.theguardian.com/us/environment" data-link-name="nav2 : subnav : Environment">Environment</a>
+ </li>
+ <li class="subnav__item">
+ <a class="subnav-link" href="https://www.theguardian.com/environment/climate-change" data-link-name="nav2 : subnav : Climate change">Climate change</a>
+ </li>
+ <li class="subnav__item subnav__item--current-section">
+ <a class="subnav-link subnav-link--current-section" href="https://www.theguardian.com/environment/wildlife" data-link-name="nav2 : subnav : Wildlife">Wildlife</a>
+ </li>
+ <li class="subnav__item">
+ <a class="subnav-link" href="https://www.theguardian.com/environment/energy" data-link-name="nav2 : subnav : Energy">Energy</a>
+ </li>
+ <li class="subnav__item">
+ <a class="subnav-link" href="https://www.theguardian.com/environment/pollution" data-link-name="nav2 : subnav : Pollution">Pollution</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="l-footer__secondary js-footer__secondary gs-container" role="contentinfo">
+ <div class="colophon u-cf">
+ <div class="footer__email-container js-footer__email-container">
+ <iframe title="Guardian Email Sign-up Form" src="/email/form/footer/today-us" scrolling="no" seamless="" id="footer__email-form" frameborder="0" class="iframed--overflow-hidden email-sub__iframe js-email-sub__iframe" data-form-success-desc="We will send you our picks of the most important headlines tomorrow morning." name="footer__email-form"></iframe>
+ </div>
+ <div class="colophon__lists-container">
+ <ul class="colophon__list">
+ <li class="colophon__item">
+ <a data-link-name="us : footer : about us" href="https://www.theguardian.com/info/about-guardian-us">About us</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : contact us" href="https://www.theguardian.com/info/about-guardian-us/contact">Contact us</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="complaints" href="https://www.theguardian.com/info/complaints-and-corrections">Complaints &amp; corrections</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="securedrop" href="https://www.theguardian.com/securedrop">SecureDrop</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : work for us" href="https://workforus.theguardian.com/">Work for us</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="privacy" href="https://www.theguardian.com/info/privacy">Privacy policy</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="cookie" href="https://www.theguardian.com/info/cookies">Cookie policy</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="terms" href="https://www.theguardian.com/help/terms-of-service">Terms &amp; conditions</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : tech feedback" class="js-tech-feedback-report" href="https://www.theguardian.com/help">Help</a>
+ </li>
+ </ul>
+ <ul class="colophon__list">
+ <li class="colophon__item">
+ <a data-link-name="us : footer : all topics" href="https://www.theguardian.com/index/subjects/a">All topics</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : all contributors" href="https://www.theguardian.com/index/contributors">All writers</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="digital newspaper archive" href="https://theguardian.newspapers.com">Digital newspaper archive</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : facebook" href="https://www.facebook.com/GuardianUs">Facebook</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : twitter" href="https://twitter.com/GuardianUs">Twitter</a>
+ </li>
+ </ul>
+ <ul class="colophon__list">
+ <li class="colophon__item">
+ <a data-link-name="us : footer : advertise with us" href="https://advertising.theguardian.com/us/advertising">Advertise with us</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : guardian labs" href="https://www.theguardian.com/guardian-labs-us">Guardian Labs</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : jobs" href="https://jobs.theguardian.com/jobs?INTCMP=NGW_FOOTER_US_GU_JOBS">Search jobs</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : soulmates" href="https://soulmates.theguardian.com/?INTCMP=soulmates_us_web_footer">Dating</a>
+ </li>
+ <li class="colophon__item">
+ <a data-link-name="us : footer : discount code" href="https://discountcode.theguardian.com/">Discount Codes</a>
+ </li>
+ </ul>
+ <div class="colophon__list">
+ <div class="cta-bar__text">
+ <div class="cta-bar__heading">
+ Support The&#160;Guardian
+ </div>
+ <div class="cta-bar__subheading">
+ Available for everyone, funded by readers
+ </div>
+ </div><a class="cta-bar__cta js-change-become-member-link js-acquisition-link" data-link-name="footer : contribute-cta" data-edition="us" href="https://support.theguardian.com/contribute?INTCMP=footer_support_contribute&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_FOOTER&quot;,&quot;componentId&quot;:&quot;footer_support_contribute&quot;%7D">Contribute <span class="inline-arrow-right inline-icon"><svg width="30" height="30" viewbox="0 0 30 30" class="inline-arrow-right__svg inline-icon__svg">
+ <path d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"></path></svg></span></a> <a class="cta-bar__cta js-subscribe js-acquisition-link" data-link-name="footer : subscribe-cta" data-edition="us" href="https://support.theguardian.com/subscribe?INTCMP=footer_support_subscribe&amp;acquisitionData=%7B&quot;source&quot;:&quot;GUARDIAN_WEB&quot;,&quot;componentType&quot;:&quot;ACQUISITIONS_FOOTER&quot;,&quot;componentId&quot;:&quot;footer_support_subscribe&quot;%7D">Subscribe <span class="inline-arrow-right inline-icon"><svg width="30" height="30" viewbox="0 0 30 30" class="inline-arrow-right__svg inline-icon__svg">
+ <path d="M22.8 14.6L15.2 7l-.7.7 5.5 6.6H6v1.5h14l-5.5 6.6.7.7 7.6-7.6v-.9"></path></svg></span></a>
+ </div>
+ </div>
+ </div>
+ <div class="copyright-container">
+ <a class="footer__back-to-top" data-link-name="back to top" href="#top"><span class="back-to-top__text">Back to top</span> <span class="back-to-top__icon-container"><span class="inline-arrow-up inline-icon"><svg width="24" height="18" viewbox="0 0 24 18" class="inline-arrow-up__svg inline-icon__svg">
+ <path d="M.4 15.3l10.5-8.4L12 6l1.1.9 10.5 8.4-.5.7L12 9.7.9 16l-.5-.7z"></path></svg></span></span></a>
+ <div class="really-serious-copyright">
+ © 2019 Guardian News &amp; Media Limited or its affiliated companies. All rights reserved.
+ </div>
+ </div>
+ </div>
+ </footer>
+ <div class="site-message-overlay js-site-message-overlay is-hidden" data-link-name="release message : overlay"></div>
+ <div class="site-message js-site-message is-hidden" tabindex="-1" data-link-name="release message" role="dialog" aria-label="welcome" aria-describedby="site-message__message">
+ <div class="gs-container">
+ <div class="site-message__inner js-site-message-inner">
+ <div class="site-message__roundel">
+ <span class="inline-marque-36 inline-icon u-vertical-align-middle-icon"><svg width="36" height="36" viewbox="0 0 36 36" class="u-vertical-align-middle-icon__svg inline-marque-36__svg inline-icon__svg">
+ <path d="M18 0a18 18 0 1 0 0 36 18 18 0 0 0 0-36"></path>
+ <path fill="#FFF" d="M21.2 4.4c2.3.4 5.3 2 6.3 3.1v5.2H27L21.2 5v-.6zm-2.2.4c-4 0-6.3 5.6-6.3 13.2 0 7.7 2.2 13.3 6.3 13.3v.6c-6 .4-14.4-4.2-14-13.8A13.3 13.3 0 0 1 19 4v.7zm10.4 14.4l-1.9.9v8.6c-1 1-3.8 2.6-6.3 3.1V19.9l-2.2-.7v-.6h10.4v.6z"></path></svg></span>
+ </div>
+ <div class="site-message__copy js-site-message-copy u-cf"></div>
+ <div class="site-message__close">
+ <button class="site-message__close-btn js-site-message-close" data-link-name="hide release message"><span class="u-h">Close</span> <span class="inline-close inline-icon inline-close--small"><svg width="18" height="18" viewbox="0 0 18 18" class="inline-close--small__svg inline-close__svg inline-icon__svg">
+ <path d="M7.5 9L1 2l1-1 7 6.5L16 1l1 1-6.5 7 6.5 7-1 1-7-6.5L2 17l-1-1 6.5-7z"></path></svg></span></button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script>
+ <![CDATA[
+ try{(function(isVeryModern,document,window){if(isVeryModern){var decodeBase64=function(str){return decodeURIComponent(atob(str.replace(/-/g,"+").replace(/_/g,"/").replace(/,/g,"\x3d")))};var cookieData=function(a){var d=[],e=document.cookie.split(";");a=RegExp("^\\s*"+a+"\x3d\\s*(.*?)\\s*$");for(var b=0;b<e.length;b++){var f=e[b].match(a);f&&d.push(f[1])}if(d.length>0)return d[0];return null}("GU_U");var userData=cookieData?JSON.parse(decodeBase64(cookieData.split(".")[0])):null;if(userData){var displayName=decodeURIComponent(userData[2]);window.guardian.config.user={id:userData[0],displayName:displayName,accountCreatedDate:userData[6],emailVerified:userData[7],rawResponse:cookieData}}}})(guardian.isEnhanced&&"atob"in window,document,window)}catch(e){};try{(function(document,window){if(typeof window.getComputedStyle!=="function")return;var ad=document.createElement("div");ad.style.position="absolute";ad.style.left="0";ad.style.top="0";ad.style.height="10px";ad.style.zIndex="-1";ad.innerHTML="\x26nbsp;";ad.setAttribute("class","ad_unit");window.requestAnimationFrame(function(){document.body.appendChild(ad);window.requestAnimationFrame(function(){var adBlockers=window.guardian.adBlockers;var adStyles=window.getComputedStyle(ad);var displayProp=adStyles&&adStyles.getPropertyValue("display");var mozBindingProp=adStyles&&adStyles.getPropertyValue("-moz-binding");adBlockers.active=displayProp==="none"||mozBindingProp&&mozBindingProp.indexOf("about:")!==-1;runEachListener(adBlockers.onDetect);adBlockers.onDetect={push:function(){var toRun=Array.prototype.slice.call(arguments,0);runEachListener(toRun)}};function runEachListener(listeners){for(var i=0;i<listeners.length;i++)try{listeners[i](adBlockers.active)}catch(e){}}})})})(document,window)}catch(e){};try{(function(isVeryModern,document,window){var user=window.guardian.config.user;if(isVeryModern&&user)window.requestAnimationFrame(function(){var $profileInfoElem=document.getElementsByClassName("js-profile-info")[0];var $profileNavElem=document.getElementsByClassName("js-profile-nav")[0];if(!$profileInfoElem&&!$profileNavElem)return;$profileInfoElem.innerHTML=user.displayName;$profileNavElem.classList.add("is-signed-in");var $signInLinkElem=$profileNavElem.getElementsByTagName("a")[0];if($signInLinkElem)if(user.id)$signInLinkElem.addEventListener("click",function(e){e.preventDefault()});else $signInLinkElem.setAttribute("href",$signInLinkElem.getAttribute("href").replace("signin","public/edit/"));var $register=document.getElementsByClassName("js-profile-register");if($register.length){$register=$register[0];$register.parentElement.removeChild($register)}})})("classList"in document.documentElement,document,window)}catch(e){};try{(function(document,window){if(!window.__cmp)window.__cmp=function(){var listen=window.attachEvent||window.addEventListener;listen("message",function(event){window.__cmp.receiveMessage(event)},false);function addLocatorFrame(){if(!window.frames["__cmpLocator"])if(document.body){var frame=document.createElement("iframe");frame.style.display="none";frame.name="__cmpLocator";frame.setAttribute("aria-hidden",true);document.body.appendChild(frame)}else setTimeout(addLocatorFrame,5)}addLocatorFrame();var commandQueue=[];var cmp=function(command,parameter,callback){if(command==="ping"){if(callback)callback({gdprAppliesGlobally:!!(window.__cmp&&window.__cmp.config&&window.__cmp.config.storeConsentGlobally),cmpLoaded:false})}else commandQueue.push({command:command,parameter:parameter,callback:callback})};cmp.commandQueue=commandQueue;cmp.receiveMessage=function(event){var data=event&&event.data&&event.data.__cmpCall;if(data)commandQueue.push({callId:data.callId,command:data.command,parameter:data.parameter,event:event})};cmp.config={storeConsentGlobally:false,storePublisherData:false,logging:false,gdprApplies:false};return cmp}()})(document,window)}catch(e){};try{(function(document,window){function shouldServeLotame(){try{var geo=JSON.parse(window.localStorage.getItem("gu.geolocation")).value;if(geo==="US"||geo==="CA"||geo==="AU"||geo==="NZ")return false;return true}catch(e){}return false}if(shouldServeLotame()){var script=document.createElement("script");script.src="https://tags.crwdcntrl.net/c/12666/cc.js";document.body.appendChild(script)}})(document,window)}catch(e){};(function(window,document){function getCookieValue(name){var nameEq=name+"\x3d",cookies=document.cookie.split(";"),value=null;cookies.forEach(function(cookie){while(cookie.charAt(0)===" ")cookie=cookie.substring(1,cookie.length);if(cookie.indexOf(nameEq)===0)value=cookie.substring(nameEq.length,cookie.length)});return value}window.guardian.config.ophan.browserId=getCookieValue("bwid")})(window,document);window.curlConfig={baseUrl:'https://assets.guim.co.uk/javascripts',apiName:'require',paths:{'ophan/ng':'//j.ophan.co.uk/ophan.ng'}};window.curl=window.curlConfig;(function(){(function(l){function p(){}function v(a,b){return 0==T.call(a).indexOf("[object "+b)}function x(a){return a&&"/"==a.charAt(a.length-1)?a.substr(0,a.length-1):a}function D(a,b){var d,c,f,g;d=1;c=a;"."==c.charAt(0)&&(f=!0,c=c.replace(U,function(a,b,c,f){c&&d++;return f||""}));if(f){f=b.split("/");g=f.length-d;if(0>g)return a;f.splice(g,d);return f.concat(c||[]).join("/")}return c}function C(a){var b=a.indexOf("!");return{g:a.substr(b+1),d:0<=b&&a.substr(0,b)}}function A(){}function y(a,b){A.prototype=a||N;var d=new A;A.prototype=N;for(var c in b)d[c]=b[c];return d}function E(){function a(a,b,d){c.push([a,b,d])}function b(a,b){for(var d,f=0;d=c[f++];)(d=d[a])&&d(b)}var d,c,f;d=this;c=[];f=function(d,n){a=d?function(a){a&&a(n)}:function(a,b){b&&b(n)};f=p;b(d?0:1,n);b=p;c=s};this.m=function(b,c,f){a(b,c,f);return d};this.h=function(a){d.C=a;f(!0,a)};this.f=function(a){d.qa=a;f(!1,a)};this.w=function(a){b(2,a)}}function z(a){return a instanceof E||a instanceof h}function t(a,b,d,c){z(a)?a.m(b,d,c):b(a)}function B(a,b,d){var c;return function(){0<=--a&&b&&(c=b.apply(s,arguments));0==a&&d&&d(c);return c}}function e(){var a,b;r="";a=[].slice.call(arguments);v(a[0],"Object")&&(b=a.shift(),b=w(b));return new h(a[0],a[1],a[2],b)}function w(a,b,d){var c;r="";if(a&&(k.R(a),q=k.b(a),"preloads"in a&&(c=new h(a.preloads,s,d,I,!0),k.l(function(){I=c})),a=a.main))return new h(a,b,d)}function h(a,b,d,c,f){var g;g=k.k(q,s,[].concat(a),f);this.then=this.m=a=function(a,b){t(g,function(b){a&&a.apply(s,b)},function(a){if(b)b(a);else throw a;});return this};this.next=function(a,b,c){return new h(a,b,c,g)};this.config=w;(b||d)&&a(b,d);k.l(function(){t(f||I,function(){t(c,function(){k.r(g)},d)})})}function K(a){var b,d;b=a.id;b==s&&(J!==s?J={I:"Multiple anonymous defines encountered"}:(b=k.da())||(J=a));if(b!=s){d=u[b];b in u||(d=k.j(b,q),d=k.F(d.b,b),u[b]=d);if(!z(d))throw Error("duplicate define: "+b);d.ha=!1;k.G(d,a)}}function F(){var a=k.aa(arguments);K(a)}var r,q,G,H,m=l.document,O=m&&(m.head||m.getElementsByTagName("head")[0]),V=O&&O.getElementsByTagName("base")[0]||null,Q={},R={},L={},W="addEventListener"in l?{}:{loaded:1,complete:1},N={},T=N.toString,s,u={},M={},I=!1,J,S=/^\/|^[^:]+:\/\//,U=/(\.)(\.?)(?:$|\/([^\.\/]+.*)?)/g,X=/\/\*[\s\S]*?\*\/|\/\/.*?[\n\r]/g,Y=/require\s*\(\s*(["'])(.*?[^\\])\1\s*\)|[^\\]?(["'])/g,Z=/\s*,\s*/,P,k;k={n:function(a,b,d){var c;a=D(a,b);if("."==a.charAt(0))return a;c=C(a);a=(b=c.d)||c.g;a in d.c&&(a=d.c[a].M||a);b&&(0>b.indexOf("/")&&!(b in d.c)&&(a=x(d.P)+"/"+b),a=a+"!"+c.g);return a},k:function(a,b,d,c){function f(b,c){var d,g;d=k.n(b,n.id,a);if(!c)return d;g=C(d);if(!g.d)return d;d=u[g.d];g.g="normalize"in d?d.normalize(g.g,f,n.b)||"":f(g.g);return g.d+"!"+g.g}function g(b,d,g){var e;e=d&&function(a){d.apply(s,a)};if(v(b,"String")){if(e)throw Error("require(id, callback) not allowed");g=f(b,!0);b=u[g];if(!(g in u))throw Error("Module not resolved: "+g);return(g=z(b)&&b.a)||b}t(k.r(k.k(a,n.id,b,c)),e,g)}var n;n=new E;n.id=b||"";n.ea=c;n.H=d;n.b=a;n.A=g;g.toUrl=function(b){return k.j(f(b,!0),a).url};n.n=f;return n},F:function(a,b,d){var c,f,g;c=k.k(a,b,s,d);f=c.h;g=B(1,function(a){c.q=a;try{return k.V(c)}catch(b){c.f(b)}});c.h=function(a){t(d||I,function(){f(u[c.id]=M[c.url]=g(a))})};c.J=function(a){t(d||I,function(){c.a&&(g(a),c.w(R))})};return c},U:function(a,b,d,c){return k.k(a,d,s,c)},ca:function(a){return a.A},K:function(a){return a.a||(a.a={})},ba:function(a){var b=a.t;b||(b=a.t={id:a.id,uri:k.L(a),exports:k.K(a),config:function(){return a.b}},b.a=b.exports);return b},L:function(a){return a.url||(a.url=k.D(a.A.toUrl(a.id),a.b))},R:function(a){var b,d,c,f,g;b="curl";d="define";c=f=l;if(a&&(g=a.overwriteApi||a.oa,b=a.apiName||a.ja||b,c=a.apiContext||a.ia||c,d=a.defineName||a.la||d,f=a.defineContext||a.ka||f,G&&v(G,"Function")&&(l.curl=G),G=null,H&&v(H,"Function")&&(l.define=H),H=null,!g)){if(c[b]&&c[b]!=e)throw Error(b+" already exists");if(f[d]&&f[d]!=F)throw Error(d+" already exists");}c[b]=e;f[d]=F},b:function(a){function b(a,b){var d,c,n,e,q;for(q in a){n=a[q];v(n,"String")&&(n={path:a[q]});n.name=n.name||q;e=f;c=C(x(n.name));d=c.g;if(c=c.d)e=g[c],e||(e=g[c]=y(f),e.c=y(f.c),e.e=[]),delete a[q];c=n;var r=b,h=void 0;c.path=x(c.path||c.location||"");r&&(h=c.main||"."+"/"+"main","."==h.charAt(0)||(h="."+"/"+""+h),c.M=D(h,c.name+"/"));c.b=c.config;c.b&&(c.b=y(f,c.b));c.S=d.split("/").length;d?(e.c[d]=c,e.e.push(d)):e.o=k.Q(n.path,f)}}function d(a){var b=a.c;a.O=RegExp("^("+a.e.sort(function(a,c){return b[c].S-b[a].S}).join("|").replace(/\/|\./g,"\\$&")+")(?=\\/|$)");delete a.e}var c,f,g,n;"baseUrl"in
+ a&&(a.o=a.baseUrl);"main"in a&&(a.M=a.main);"preloads"in a&&(a.pa=a.preloads);"pluginPath"in a&&(a.P=a.pluginPath);if("dontAddFileExt"in a||a.i)a.i=RegExp(a.dontAddFileExt||a.i);c=q;f=y(c,a);f.c=y(c.c);g=a.plugins||{};f.plugins=y(c.plugins);f.v=y(c.v,a.v);f.u=y(c.u,a.u);f.e=[];b(a.packages,!0);b(a.paths,!1);for(n in g)a=k.n(n+"!","",f),f.plugins[a.substr(0,a.length-1)]=g[n];g=f.plugins;for(n in g)if(g[n]=y(f,g[n]),a=g[n].e)g[n].e=a.concat(f.e),d(g[n]);for(n in c.c)f.c.hasOwnProperty(n)||f.e.push(n);d(f);return f},j:function(a,b){var d,c,f,g;d=b.c;f=S.test(a)?a:a.replace(b.O,function(a){c=d[a]||{};g=c.b;return c.path||""});return{b:g||q,url:k.Q(f,b)}},Q:function(a,b){var d=b.o;return d&&!S.test(a)?x(d)+"/"+a:a},D:function(a,b){return a+((b||q).i.test(a)?"":".js")},s:function(a,b,d){var c=m.createElement("script");c.onload=c.onreadystatechange=function(d){d=d||l.event;if("load"==d.type||W[c.readyState])delete L[a.id],c.onload=c.onreadystatechange=c.onerror="",b()};c.onerror=function(){d(Error("Syntax or http error: "+a.url))};c.type=a.N||"text/javascript";c.charset="utf-8";c.async=!a.fa;c.src=a.url;L[a.id]=c;O.insertBefore(c,V);return c},W:function(a){var b=[],d;("string"==typeof a?a:a.toSource?a.toSource():a.toString()).replace(X,"").replace(Y,function(a,f,g,e){e?d=d==e?s:d:d||b.push(g);return""});return b},aa:function(a){var b,d,c,f,g,e;g=a.length;c=a[g-1];f=v(c,"Function")?c.length:-1;2==g?v(a[0],"Array")?d=a[0]:b=a[0]:3==g&&(b=a[0],d=a[1]);!d&&0<f&&(e=!0,d=["require","exports","module"].slice(0,f).concat(k.W(c)));return{id:b,q:d||[],B:0<=f?c:function(){return c},p:e}},V:function(a){var b;b=a.B.apply(a.p?a.a:s,a.q);b===s&&a.a&&(b=a.t?a.a=a.t.exports:a.a);return b},G:function(a,b){a.B=b.B;a.p=b.p;a.H=b.q;k.r(a)},r:function(a){function b(a,b,c){e[b]=a;c&&r(a,b)}function d(b,c){var d,f,g,e;d=B(1,function(a){f(a);m(a,c)});f=B(1,function(a){r(a,c)});g=k.Y(b,a);(e=z(g)&&g.a)&&f(e);t(g,d,a.f,a.a&&function(a){g.a&&(a==Q?f(g.a):a==R&&d(g.a))})}function c(){a.h(e)}var f,g,e,q,h,r,m;e=[];g=a.H;q=g.length;0==g.length&&c();r=B(q,b,function(){a.J&&a.J(e)});m=B(q,b,c);for(f=0;f<q;f++)h=g[f],h in P?(m(P[h](a),f,!0),a.a&&a.w(Q)):h?d(h,f):m(s,f,!0);return a},Z:function(a){k.L(a);k.s(a,function(){var b=J;J=s;!1!==a.ha&&(!b||b.I?a.f(Error(b&&b.I||"define() missing or duplicated: "+a.url)):k.G(a,b))},a.f);return a},Y:function(a,b){var d,c,f,g,e,h,r,m,w,l,p,s;d=b.n;c=b.ea;f=b.b||q;e=d(a);e in u?h=e:(g=C(e),m=g.g,h=g.d||m,w=k.j(h,f));if(!(e in u))if(s=k.j(m,f).b,g.d)r=h;else if(r=s.moduleLoader||s.na||s.loader||s.ma)m=h,h=r,w=k.j(r,f);h in u?l=u[h]:w.url in M?l=u[h]=M[w.url]:(l=k.F(s,h,c),l.url=k.D(w.url,w.b),u[h]=M[w.url]=l,k.Z(l));h==r&&(g.d&&f.plugins[g.d]&&(s=f.plugins[g.d]),p=new E,t(l,function(a){var b,f,g;g=a.dynamic;m="normalize"in a?a.normalize(m,d,l.b)||"":d(m);f=r+"!"+m;b=u[f];if(!(f in u)){b=k.U(s,f,m,c);g||(u[f]=b);var e=function(a){g||(u[f]=a);b.h(a)};e.resolve=e;e.reject=e.error=b.f;a.load(m,b.A,e,s)}p!=b&&t(b,p.h,p.f,p.w)},p.f));return p||l},da:function(){var a;if(!v(l.opera,"Opera"))for(var b in L)if("interactive"==L[b].readyState){a=b;break}return a},$:function(a){var b=0,d,c;for(d=m&&(m.scripts||m.getElementsByTagName("script"));d&&(c=d[b++]);)if(a(c))return c},X:function(){var a,b="";(a=k.$(function(a){(a=a.getAttribute("data-curl-run"))&&(b=a);return a}))&&a.setAttribute("data-curl-run","");return b},T:function(){function a(){k.s({url:c.shift()},b,b)}function b(){r&&(c.length?(k.l(d),a()):d("run.js script did not run."))}function d(a){throw Error(a||"Primary run.js failed. Trying fallback.");}var c=r.split(Z);c.length&&a()},l:function(a){setTimeout(a,0)}};P={require:k.ca,exports:k.K,module:k.ba};e.version="0.8.9";e.config=w;F.amd={plugins:!0,jQuery:!0,curl:"0.8.9"};q={o:"",P:"curl/plugin",i:/\?|\.js\b/,v:{},u:{},plugins:{},c:{},O:/$^/};G=l.curl;H=l.define;G&&v(G,"Object")?(l.curl=s,w(G)):k.R();(r=k.X())&&k.l(k.T);u.curl=e;u["curl/_privileged"]={core:k,cache:u,config:function(){return q},_define:K,_curl:e,Promise:E}})(this.window||"undefined"!=typeof global&&global||this);(function(l,p){function v(){if(!p.body)return!1;F||(F=p.createTextNode(""));try{return p.body.removeChild(p.body.appendChild(F)),F=K,!0}catch(e){return!1}}function x(){var r;r=A[p[C]]&&v();if(!z&&r){z=!0;for(clearTimeout(h);e=w.pop();)e();E&&(p[C]="complete");for(var q;q=y.shift();)q()}return r}function D(){x();z||(h=setTimeout(D,t))}var C="readyState",A={loaded:1,interactive:1,complete:1},y=[],E=p&&"string"!=typeof p[C],z=!1,t=10,B,e,w=[],h,K,F;B="addEventListener"in l?function(e,h){e.addEventListener(h,x,!1);return function(){e.removeEventListener(h,x,!1)}}:function(e,h){e.attachEvent("on"+h,x);return function(){e.detachEvent(h,x)}};p&&!x()&&(w=[B(l,"load"),B(p,"readystatechange"),B(l,"DOMContentLoaded")],h=setTimeout(D,t));define("curl/domReady",function(){function e(h){z?h():y.push(h)}e.then=e;e.amd=!0;return e})})(this,this.document);(function(l,p,v){define("curl/plugin/js",["curl/_privileged"],function(l){function D(e,w,h){function p(){r||(t<new Date?h():setTimeout(p,10))}var t,r,q;t=(new Date).valueOf()+(e.ga||3E5);h&&e.a&&setTimeout(p,10);q=l.core.s(e,function(){r=!0;e.a&&(e.C=v(e.a));!e.a||e.C?w(q):h()},function(e){r=!0;h(e)})}function C(e,l){D(e,function(){var h=y.shift();t=0<y.length;h&&C.apply(null,h);l.h(e.C||!0)},function(e){l.f(e)})}var A={},y=[],E=p&&!0==p.createElement("script").async,z,t,B=/\?|\.js\b/;z=l.Promise;return{dynamic:!0,normalize:function(e,l){var h=e.indexOf("!");return 0<=h?l(e.substr(0,h))+e.substr(h):l(e)},load:function(e,l,h,p){function v(e){(h.error||function(e){throw e;})(e)}var r,q,x,H,m;r=0<e.indexOf("!order");q=e.indexOf("!exports=");x=0<q?e.substr(q+9):p.a;H="prefetch"in p?p.prefetch:!0;e=r||0<q?e.substr(0,e.indexOf("!")):e;q=(q=p.dontAddFileExt||p.i)?RegExp(q):B;m=l.toUrl(e);q.test(m)||(m=m.lastIndexOf(".")<=m.lastIndexOf("/")?m+".js":m);m in A?A[m]instanceof z?A[m].m(h,v):h(A[m]):(e={name:e,url:m,fa:r,a:x,ga:p.timeout},A[m]=l=new z,l.m(function(e){A[m]=e;h(e)},v),r&&!E&&t?(y.push([e,l]),H&&(e.N="text/cache",D(e,function(e){e&&e.parentNode.removeChild(e)},function(){}),e.N="")):(t=t||r,C(e,l)))},cramPlugin:".."+"/"+"cram/js"}})})(this,this.document,function(l){try{return eval(l)}catch(p){}});define("curl/plugin/domReady",[".."+"/"+"domReady"],function(l){return{load:function(p,v,x){l(x)}}});}).call(this);[].slice.apply(document.querySelectorAll('figure.interactive[data-interactive]')).forEach(function(el){require([el.getAttribute('data-interactive')],function(interactive){interactive.boot(el,document,window.guardian.config);},function(err){console.log('Interactive failed',mainJS);console.log('Error:',err);});require(['ophan/ng'],function(ophan){var a=el.querySelector('a');var href=a&&a.href;if(href){ophan.trackComponentAttention(href,el);}});[].slice.apply(document.querySelectorAll('iframe.interactive-atom-fence')).forEach(function(el){var srcdoc;if(!el.srcdoc){srcdoc=el.getAttribute('srcdoc');el.contentWindow.contents=srcdoc;el.src='javascript:window["contents"]';}});});
+ ]]>
+ </script>
+ <script id="google_analytics">
+ <![CDATA[
+ const pillar='News';(function(){function convertContentType(contentType){var result=contentType;if(typeof contentType==='string'){result=contentType.toLowerCase().split(' ').join('');}return result;}function getQueryParam(key){var query=window.location.search.substring(1);var vars=query.split("&");var pairs=vars.map(function(x){return x.split('=')});return pairs.filter(function(xs){return xs.length==2&&xs[0]==key}).map(function(xs){return xs[1]})[0];}function getAnalyticsEdition(){var edition=(guardian.config.page.edition||'').toLowerCase()
+ return edition==='int'?'international':edition;}function getAnalyticsTitle(){var analyticsTitle=(guardian.config.page.webTitle||'');return(analyticsTitle==='Network Front')?getAnalyticsEdition()+' network front':analyticsTitle;}function getExperienceValue(){return'none';}var identityId=null;if(guardian.config.user){identityId=guardian.config.user.id;}var isLoggedIn=(!!identityId).toString();(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create','UA-78705427-1','auto','allEditorialPropertyTracker',{'sampleRate':100,'siteSpeedSampleRate':0.1,'userId':identityId});ga('create','UA-33592456-1','auto','guardianTestPropertyTracker',{'sampleRate':5,'siteSpeedSampleRate':0.1,'userId':identityId});ga('allEditorialPropertyTracker.set','forceSSL',true);ga('allEditorialPropertyTracker.set','title',getAnalyticsTitle());ga('allEditorialPropertyTracker.set','anonymizeIp',true);ga('allEditorialPropertyTracker.set','dimension1',guardian.config.ophan.pageViewId);ga('allEditorialPropertyTracker.set','dimension2',guardian.config.ophan.browserId);ga('allEditorialPropertyTracker.set','dimension3','theguardian.com');ga('allEditorialPropertyTracker.set','dimension4',guardian.config.page.section);ga('allEditorialPropertyTracker.set','dimension5',convertContentType(guardian.config.page.contentType));ga('allEditorialPropertyTracker.set','dimension6',guardian.config.page.commissioningDesks);ga('allEditorialPropertyTracker.set','dimension7',guardian.config.page.contentId);ga('allEditorialPropertyTracker.set','dimension8',guardian.config.page.authorIds);ga('allEditorialPropertyTracker.set','dimension9',guardian.config.page.keywordIds);ga('allEditorialPropertyTracker.set','dimension10',guardian.config.page.toneIds);ga('allEditorialPropertyTracker.set','dimension11',guardian.config.page.seriesId);ga('allEditorialPropertyTracker.set','dimension15',identityId);ga('allEditorialPropertyTracker.set','dimension16',isLoggedIn);ga('allEditorialPropertyTracker.set','dimension21',getQueryParam('INTCMP'));ga('allEditorialPropertyTracker.set','dimension22',getQueryParam('CMP_BUNIT'));ga('allEditorialPropertyTracker.set','dimension23',getQueryParam('CMP_TU'));ga('allEditorialPropertyTracker.set','dimension26',(!!guardian.config.page.isHosted).toString());ga('allEditorialPropertyTracker.set','dimension27',navigator.userAgent);ga('allEditorialPropertyTracker.set','dimension29',window.location.href);ga('allEditorialPropertyTracker.set','dimension30',getAnalyticsEdition());ga('allEditorialPropertyTracker.set','dimension31','the david and lucile packard foundation');ga('allEditorialPropertyTracker.set','dimension42','foundation');ga('allEditorialPropertyTracker.set','dimension43',getExperienceValue());ga('allEditorialPropertyTracker.set','dimension50',pillar);if(document.location.hash==='#fbLogin'){ga('allEditorialPropertyTracker.set','referrer',null);document.location.hash='';}ga('guardianTestPropertyTracker.set','forceSSL',true);ga('guardianTestPropertyTracker.set','title',getAnalyticsTitle());ga('guardianTestPropertyTracker.set','anonymizeIp',true);ga('guardianTestPropertyTracker.set','dimension1',guardian.config.ophan.pageViewId);ga('guardianTestPropertyTracker.set','dimension2',guardian.config.ophan.browserId);ga('guardianTestPropertyTracker.set','dimension3','theguardian.com');ga('guardianTestPropertyTracker.set','dimension4',guardian.config.page.section);ga('guardianTestPropertyTracker.set','dimension5',convertContentType(guardian.config.page.contentType));ga('guardianTestPropertyTracker.set','dimension6',guardian.config.page.commissioningDesks);ga('guardianTestPropertyTracker.set','dimension7',guardian.config.page.contentId);ga('guardianTestPropertyTracker.set','dimension8',guardian.config.page.authorIds);ga('guardianTestPropertyTracker.set','dimension9',guardian.config.page.keywordIds);ga('guardianTestPropertyTracker.set','dimension10',guardian.config.page.toneIds);ga('guardianTestPropertyTracker.set','dimension11',guardian.config.page.seriesId);ga('guardianTestPropertyTracker.set','dimension15',identityId);ga('guardianTestPropertyTracker.set','dimension16',isLoggedIn);ga('guardianTestPropertyTracker.set','dimension21',getQueryParam('INTCMP'));ga('guardianTestPropertyTracker.set','dimension22',getQueryParam('CMP_BUNIT'));ga('guardianTestPropertyTracker.set','dimension23',getQueryParam('CMP_TU'));ga('guardianTestPropertyTracker.set','dimension26',(!!guardian.config.page.isHosted).toString());ga('guardianTestPropertyTracker.set','dimension27',navigator.userAgent);ga('guardianTestPropertyTracker.set','dimension29',window.location.href);ga('guardianTestPropertyTracker.set','dimension30',getAnalyticsEdition());ga('guardianTestPropertyTracker.set','dimension31','the david and lucile packard foundation');ga('guardianTestPropertyTracker.set','dimension42','foundation');ga('guardianTestPropertyTracker.set','dimension43',getExperienceValue());ga('guardianTestPropertyTracker.set','dimension50',pillar);if(document.location.hash==='#fbLogin'){ga('guardianTestPropertyTracker.set','referrer',null);document.location.hash='';}ga('allEditorialPropertyTracker.send','pageview',{hitCallback:function(){var image=new Image();image.src="//phar.gu-web.net/count/pvg.gif";}});try{var NG_STORAGE_KEY='gu.analytics.referrerVars';var referrerVarsData=window.sessionStorage.getItem(NG_STORAGE_KEY);var referrerVars=JSON.parse(referrerVarsData);if(referrerVars&&referrerVars.value){var d=new Date().getTime();if(d-referrerVars.value.time<60*1000){ga('allEditorialPropertyTracker.send','event','Click','Internal',referrerVars.value.tag,{nonInteraction:true,dimension12:referrerVars.value.path});}window.sessionStorage.removeItem(NG_STORAGE_KEY);}}catch(e){}guardian.app&&guardian.app.mediator&&guardian.app.mediator.emit('modules:ga:ready');})();
+ ]]>
+ </script> <noscript id="googleNoScript"><img id="googleConfidenceNoScriptImage" alt="" src="//phar.gu-web.net/count/pvg.gif" width="1" height="1" class="u-h" /></noscript>
+ <script id="comscore">
+ <![CDATA[
+ var _comscore=_comscore||[];_comscore.push({c1:"2",c2:"6035250",comscorekw:guardian.config.page.keywords});(function(){var s=document.createElement("script"),el=document.getElementsByTagName("script")[0];s.async=true;s.src="https://sb.scorecardresearch.com/beacon.js";el.parentNode.insertBefore(s,el);})();
+ ]]>
+ </script> <noscript><img src="https://sb.scorecardresearch.com/p?c1=2&amp;c2=6035250&amp;cv=2.0&amp;cj=1&amp;comscorekw=Oceans%2CNew+Zealand%2CEnvironment%2CAsia+Pacific%2CWorld+news%2CWhales%2CCetaceans%2CMarine+life%2CWildlife" /></noscript> <noscript>
+ <div style="display:inline;">
+ <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/971225648/?value=0&amp;guid=ON&amp;script=0" />
+ </div></noscript> <img src="//phar.gu-web.net/count/pv.gif" alt="" style="display : none ;" rel="nofollow" /> <!-- Twitter universal website tag code -->
+ <script>
+ <![CDATA[
+ !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);},s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');twq('init','nyl43');twq('track','PageView');
+ ]]>
+ </script> <!-- End Twitter universal website tag code -->
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html
index 95ab304b5..35c7971b4 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/heise/expected.html
@@ -1,20 +1,34 @@
<div>
- <figure><img src="http://3.f.ix.de/scale/geometry/600/q75/imgs/18/1/4/6/2/3/5/1/Barcode-Scanner-With-Border-fc08c913da5cea5d.jpeg"></img><figcaption><p>1Password scannt auch QR-Codes.</p>
+ <figure>
+ <img src="http://3.f.ix.de/scale/geometry/600/q75/imgs/18/1/4/6/2/3/5/1/Barcode-Scanner-With-Border-fc08c913da5cea5d.jpeg">
+
+ <figcaption>
+
+ <p>1Password scannt auch QR-Codes.</p>
<p>(Bild: Hersteller)</p>
- </figcaption></figure><p><strong>Das in der iOS-Version bereits enthaltene TOTP-Feature ist nun auch für OS X 10.10 verfügbar. Zudem gibt es neue Zusatzfelder in der Datenbank und weitere Verbesserungen.</strong></p>
- <p><a href="https://itunes.apple.com/de/app/1password-password-manager/id443987910" rel="external" target="_blank">AgileBits hat Version 5.3 seines bekannten Passwortmanagers 1Password für OS X freigegeben.</a> Mit dem Update wird eine praktische Funktion nachgereicht, die <a href="http://fakehost/mac-and-i/meldung/Passwortmanager-1Password-mit-groesseren-Updates-fuer-OS-X-und-iOS-2529204.html">die iOS-Version der Anwendung bereits seit längerem beherrscht</a>: Das direkte Erstellen von Einmal-Passwörtern. Unterstützt wird dabei der <a href="https://blog.agilebits.com/2015/01/26/totp-for-1password-users/" rel="external" target="_blank">TOTP-Standard</a> (Time-Based One-Time Passwords), den unter anderem Firmen wie Evernote, Dropbox oder Google einsetzen, um ihre Zugänge besser abzusichern. Neben Account und regulärem Passwort wird dabei dann ein Zusatzcode verlangt, der nur kurze Zeit gilt.</p>
-<p>Zur TOTP-Nutzung muss zunächst ein Startwert an 1Password übergeben werden. Das geht unter anderem per QR-Code, den die App über ein neues Scanfenster selbst einlesen kann – etwa aus dem Webbrowser. Eine Einführung in die Technik gibt <a href="http://1pw.ca/TOTPvideoMac" rel="external" target="_blank">ein kurzes Video</a>. Die TOTP-Unterstützung in 1Password erlaubt es, auf ein zusätzliches Gerät (z.B. ein iPhone) neben dem Mac zu verzichten, das den Code liefert – was allerdings auch die Sicherheit verringert, weil es keinen "echten" zweiten Faktor mehr gibt.</p>
+ </figcaption>
+
+ </figure>
+
+
+
+ <p><strong>Das in der iOS-Version bereits enthaltene TOTP-Feature ist nun auch für OS X 10.10 verfügbar. Zudem gibt es neue Zusatzfelder in der Datenbank und weitere Verbesserungen.</strong></p>
+ <p><a rel="external" target="_blank" href="https://itunes.apple.com/de/app/1password-password-manager/id443987910">AgileBits hat Version 5.3 seines bekannten Passwortmanagers 1Password für OS X freigegeben.</a> Mit dem Update wird eine praktische Funktion nachgereicht, die <a href="http://fakehost/mac-and-i/meldung/Passwortmanager-1Password-mit-groesseren-Updates-fuer-OS-X-und-iOS-2529204.html">die iOS-Version der Anwendung bereits seit längerem beherrscht</a>: Das direkte Erstellen von Einmal-Passwörtern. Unterstützt wird dabei der <a rel="external" target="_blank" href="https://blog.agilebits.com/2015/01/26/totp-for-1password-users/">TOTP-Standard</a> (Time-Based One-Time Passwords), den unter anderem Firmen wie Evernote, Dropbox oder Google einsetzen, um ihre Zugänge besser abzusichern. Neben Account und regulärem Passwort wird dabei dann ein Zusatzcode verlangt, der nur kurze Zeit gilt.</p>
+<p>Zur TOTP-Nutzung muss zunächst ein Startwert an 1Password übergeben werden. Das geht unter anderem per QR-Code, den die App über ein neues Scanfenster selbst einlesen kann – etwa aus dem Webbrowser. Eine Einführung in die Technik gibt <a rel="external" target="_blank" href="http://1pw.ca/TOTPvideoMac">ein kurzes Video</a>. Die TOTP-Unterstützung in 1Password erlaubt es, auf ein zusätzliches Gerät (z.B. ein iPhone) neben dem Mac zu verzichten, das den Code liefert – was allerdings auch die Sicherheit verringert, weil es keinen "echten" zweiten Faktor mehr gibt.</p>
<p>Update 5.3 des Passwortmanagers liefert auch noch weitere Verbesserungen. So gibt es die Möglichkeit, FaceTime-Audio- oder Skype-Anrufe aus 1Password zu starten, die Zahl der Zusatzfelder in der Datenbank wurde erweitert und der Umgang mit unterschiedlichen Zeitzonen klappt besser. Die Engine zur Passworteingabe im Browser soll beschleunigt worden sein.</p>
<p>1Password kostet aktuell knapp 50 Euro im Mac App Store und setzt in seiner aktuellen Version mindestens OS X 10.10 voraus.
-<span>(<a href="mailto:[email protected]" title="Ben Schwan">bsc</a>)</span>
-<br></br></p>
+<span>(<a title="Ben Schwan" href="mailto:[email protected]">bsc</a>)</span>
+<br>
+
+
+</p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html
index 6896eedab..988c78c53 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/herald-sun-1/expected.html
@@ -1,14 +1,13 @@
<div>
<div>
- <div>
- <p><img alt="A new Bill would require telecommunications service providers to store so-called ‘metadat" data-src="http://api.news.com.au/content/1.0/heraldsun/images/1227261885862?format=jpg&amp;group=iphone&amp;size=medium" src="http://api.news.com.au/content/1.0/heraldsun/images/1227261885862?format=jpg&amp;group=iphone&amp;size=medium"></img></p>
+ <p><img data-src="http://api.news.com.au/content/1.0/heraldsun/images/1227261885862?format=jpg&amp;group=iphone&amp;size=medium" alt="A new Bill would require telecommunications service providers to store so-called ‘metadat">
+ </p>
<p>
<span id="imgCaption">A new Bill would require telecommunications service providers to store so-called ‘metadata’ for two years.</span>
<span><em>Source:</em>
Supplied</span>
</p>
</div>
- </div>
<p><strong>
A HIGH-powered federal government team has been doing the rounds of media organisations in the past few days in an attempt to allay concerns about the impact of new surveillance legislation on press freedom. It failed.
</strong></p>
@@ -17,10 +16,6 @@
<div id="read-more">
-
-
- <div id="read-more-content">
<p>The Bill would require telecommunications service providers to store so-called “metadata” — the who, where, when and how of a communication, but not its content — for two years so security and law enforcement agencies can access it without warrant. Few would argue against the use of such material to catch criminals or terrorists. But, as Parliament’s Joint Committee on Intelligence and Security has pointed out, it would also be used “for the purpose of determining the identity of a journalist’s sources”.</p><p>And that should ring warning bells for anyone genuinely concerned with the health of our democracy. Without the ability to protect the identity of sources, journalists would be greatly handicapped in exposing corruption, dishonesty, waste, incompetence and misbehaviour by public officials.</p><p>The Press Council is concerned the laws would crush investigative journalism.</p><p>“These legitimate concerns cannot be addressed effectively short of exempting journalists and media organisations,” says president David Weisbrot.</p><p>The media union is adamant journalists’ metadata must be exempted from the law. That’s what media bosses want, too, though they have a fallback position based on new safeguards being implemented in Britain.</p><p>That would prevent access to the metadata of journalists or media organisations without a judicial warrant. There would be a code including — according to the explanatory notes of the British Bill — “provision to protect the public interest in the confidentiality of journalistic sources”.</p><p>In their meetings this week, the government team boasted of concessions in the new Data Retention Bill. The number of agencies able to access metadata will be reduced by excluding such organisations as the RSPCA and local councils. And whenever an authorisation is issued for access to information about a journalist’s sources, the Ombudsman (or, where ASIO is involved, the Inspector-General of Intelligence and Security) will receive a copy.</p><p>That does nothing to solve the problem. The Government has effectively admitted as much by agreeing that the parliamentary committee should conduct a separate review of how to deal with the issue of journalists’ sources.</p><p>But another inquiry would be a waste of time — the committee has already received and considered dozens of submissions on the subject. The bottom line is that the Government does not deny that the legislation is flawed, but is demanding it be passed anyway with the possibility left open of a repair job down the track. That is a ridiculous approach.</p><p>Claims that immediate action is imperative do not stand up. These are measures that won’t come into full effect for two years. Anyway, amending the Bill to either exempt journalists or adopt the UK model could be done quickly, without any risk to national security.</p><p>AS Opposition Leader Bill Shorten said in a letter to Abbott last month: “Press freedom concerns about mandatory data retention would ideally be addressed in this Bill to avoid the need for future additional amendments or procedures to be put in place in the future.”</p><p>The Data Retention Bill will be debated in the House of Representatives this week. Then, on Friday, CEOs from leading media organisations will front the parliamentary committee to air their concerns before the legislation goes to the Senate.</p><p>Those CEOs should make it clear they are just as angry about this as they were about Stephen Conroy’s attempt to impinge on press freedom through media regulation under the previous Labor government.</p><p>Memories of the grief Conroy brought down on his head would undoubtedly make Abbott sit up and take notice.</p><p><b>LAURIE OAKES IS THE NINE NETWORK POLITICAL EDITOR </b></p>
</div>
-</div>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json
index 88d2990ee..1e62b57f5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected-images.json
@@ -1,7 +1,10 @@
[
- "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/pc_gazou\/aesop\/aesop052.jpg",
- "http:\/\/fakehost\/test\/..\/..\/..\/..\/366\/logo_bana\/corner_1.gif",
- "http:\/\/fakehost\/test\/..\/..\/..\/..\/366\/logo_bana\/corner_2.gif",
- "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/origami_gazou\/kantan\/dogface.gif",
- "http:\/\/fakehost\/test\/..\/..\/..\/gazou\/origami_gazou\/kantan\/dog.gif"
+ "http:\/\/fakehost\/366\/logo_bana\/corner_1.gif",
+ "http:\/\/fakehost\/366\/logo_bana\/corner_2.gif",
+ "http:\/\/fakehost\/gazou\/pc_gazou\/aesop\/aesop052.jpg",
+ "http:\/\/fakehost\/gazou\/origami_gazou\/kantan\/dogface.gif",
+ "http:\/\/fakehost\/gazou\/origami_gazou\/kantan\/dog.gif",
+ "http:\/\/fakehost\/gazou\/pc_gazou\/all\/top_bana\/back_logo_r.gif",
+ "file:\/\/\/C|\/Documents%20and%20Settings\/%E7%A6%8F%E5%A8%98note\/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97\/company_website15\/image\/spacer.gif",
+ "file:\/\/\/C|\/Documents%20and%20Settings\/%E7%A6%8F%E5%A8%98note\/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html
index defbcc10c..1d63a9eef 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/hukumusume/expected.html
@@ -1,13 +1,48 @@
-<div width="619">
+<div>
+ <td>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <img src="http://fakehost/366/logo_bana/corner_1.gif" width="7" height="7">
+ </td>
+ <td></td>
+ <td>
+ <img src="http://fakehost/366/logo_bana/corner_2.gif" width="7" height="7">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td>
<p>
- <a href="http://fakehost/test/../../../index.html">福娘童話集</a> &gt; <a href="http://fakehost/test/../index.html">きょうのイソップ童話</a> &gt; <a href="http://fakehost/test/../itiran/01gatu.htm">1月のイソップ童話</a> &gt; 欲張りなイヌ
+ <a href="http://fakehost/index.html">福娘童話集</a> &gt; <a href="http://fakehost/index.html">きょうのイソップ童話</a> &gt; <a href="http://fakehost/itiran/01gatu.htm">1月のイソップ童話</a> &gt; 欲張りなイヌ
</p>
<div>
- <p><span color="#FF0000" size="+2">元旦のイソップ童話</span></p><p><img alt="よくばりなイヌ" height="360" src="http://fakehost/test/../../../gazou/pc_gazou/aesop/aesop052.jpg" width="480"></img></p><p>
+ <p><span color="#FF0000" size="+2">元旦のイソップ童話</span></p><p><img src="http://fakehost/gazou/pc_gazou/aesop/aesop052.jpg" alt="よくばりなイヌ" width="480" height="360"></p><p>
欲張りなイヌ</p><p><a href="http://hukumusume.com/douwa/English/aesop/01/01_j.html">ひらがな</a> ←→ <a href="http://hukumusume.com/douwa/English/aesop/01/01_j&amp;E.html">日本語・英語</a> ←→ <a href="http://hukumusume.com/douwa/English/aesop/01/01_E.html">English</a></p></div>
<div>
- <table readabilityDataTable="0"><tbody><tr><td>
- <img height="7" src="http://fakehost/test/../../../../366/logo_bana/corner_1.gif" width="7"></img></td>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <img src="http://fakehost/366/logo_bana/corner_1.gif" width="7" height="7">
+ </td>
<td>
<span color="#FF0000"><b>おりがみをつくろう</b></span>
</td>
@@ -15,25 +50,178 @@
<span size="-1">( <a href="http://www.origami-club.com/index.html">おりがみくらぶ</a> より)</span>
</td>
<td>
- <img height="7" src="http://fakehost/test/../../../../366/logo_bana/corner_2.gif" width="7"></img></td>
- </tr><tr><td colspan="4">
+ <img src="http://fakehost/366/logo_bana/corner_2.gif" width="7" height="7">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">
<p>
- <a href="http://www.origami-club.com/easy/dogfase/index.html"><span size="+2"><img alt="犬の顔の折り紙" height="51" src="http://fakehost/test/../../../gazou/origami_gazou/kantan/dogface.gif" width="73"></img>いぬのかお</span></a>   <a href="http://www.origami-club.com/easy/dog/index.html"><img alt="犬の顔の紙" height="43" src="http://fakehost/test/../../../gazou/origami_gazou/kantan/dog.gif" width="62"></img><span size="+2">いぬ</span></a>
- </p></td>
- </tr></tbody></table></div><table readabilityDataTable="0"><tbody><tr><td>
+ <a href="http://www.origami-club.com/easy/dogfase/index.html"><span size="+2"><img src="http://fakehost/gazou/origami_gazou/kantan/dogface.gif" alt="犬の顔の折り紙" width="73" height="51">いぬのかお</span></a>   <a href="http://www.origami-club.com/easy/dog/index.html"><img src="http://fakehost/gazou/origami_gazou/kantan/dog.gif" alt="犬の顔の紙" width="62" height="43"><span size="+2">いぬ</span></a>
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
♪音声配信(html5)
</td>
- </tr><tr><td>
- <audio controls="" src="http://ohanashi2.up.seesaa.net/mp3/ae_0101.mp3"></audio></td>
- </tr><tr><td>
+ </tr>
+ <tr>
+ <td>
+ <audio src="http://ohanashi2.up.seesaa.net/mp3/ae_0101.mp3" controls></audio>
+ </td>
+ </tr>
+ <tr>
+ <td>
<a href="http://www.voiceblog.jp/onokuboaki/"><span size="-1">亜姫の朗読☆ イソップ童話より</span></a>
</td>
- </tr></tbody></table><p>
+ </tr>
+ </tbody>
+ </table>
+ <p>
 肉をくわえたイヌが、橋を渡っていました。  ふと下を見ると、川の中にも肉をくわえたイヌがいます。 イヌはそれを見て、思いました。(あいつの肉の方が、大きそうだ)  イヌは、くやしくてたまりません。 (そうだ、あいつをおどかして、あの肉を取ってやろう)  そこでイヌは、川の中のイヌに向かって思いっきり吠えました。 「ウゥー、ワン!!」  そのとたん、くわえていた肉はポチャンと川の中に落ちてしまいました。 「ああー、ぁぁー」  川の中には、がっかりしたイヌの顔がうつっています。  さっきの川の中のイヌは、水にうつった自分の顔だったのです。  同じ物を持っていても、人が持っている物の方が良く見え、また、欲張るとけっきょく損をするというお話しです。
</p>
<p>
おしまい
</p>
<div>
- <p></p></div>
- </div> \ No newline at end of file
+ <p><span><img src="http://fakehost/gazou/pc_gazou/all/top_bana/back_logo_r.gif" alt="前のページへ戻る" name="Image10" width="175" height="32" id="Image10"></span></p></div>
+ </td>
+ <td>
+ <img src="file:///C|/Documents%20and%20Settings/%E7%A6%8F%E5%A8%98note/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/company_website15/image/spacer.gif" width="1" height="1">
+ </td>
+ <td>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <img src="http://fakehost/366/logo_bana/corner_1.gif" width="7" height="7">
+ </td>
+ <td></td>
+ <td>
+ <img src="http://fakehost/366/logo_bana/corner_2.gif" width="7" height="7">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <td>
+ &nbsp;&nbsp;&nbsp;&nbsp; <span size="-1"><b>1月 1日の豆知識</b></span><span size="-2"><u><p>
+ 366日への旅</p></u></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="file:///C|/Documents%20and%20Settings/%E7%A6%8F%E5%A8%98note/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97" width="1" height="1"><b><span size="-1">きょうの記念日</span></b><a href="http://fakehost/366/kinenbi/pc/01gatu/1_01.htm"><span size="-1">元旦</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="file:///C|/Documents%20and%20Settings/%E7%A6%8F%E5%A8%98note/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/company_website15/image/spacer.gif" width="1" height="1"><b><span size="-1">きょうの誕生花</span></b><a href="http://fakehost/366/hana/pc/01gatu/1_01.htm"><span size="-1">松(まつ)</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうの誕生日・出来事</span></b><a href="http://fakehost/366/birthday/pc/01gatu/1_01.htm"><span size="-1">1949年 Mr.マリック(マジシャン)</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">恋の誕生日占い</span></b><a href="http://fakehost/sakura/uranai/birthday/01/01.html"><span size="-1">自分の考えをしっかりと持った女の子。</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">なぞなぞ小学校</span></b><a href="http://fakehost/nazonazo/new/2012/04/02.html"><span size="-1">○(丸)を取ったらお母さんになってしまう男の人は?</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">あこがれの職業紹介</span></b><a href="http://fakehost/sakura/navi/work/2017/041.html"><span size="-1">歌手</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">恋の魔法とおまじない</span></b> 001<a href="http://fakehost/omajinai/new/2012/00/re01.html"><span size="-1">両思いになれる おまじない</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1">  <b>1月 1日の童話・昔話</b><u><span size="-2"><p>
+ 福娘童話集</p></span></u></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうの日本昔話</span></b><a href="http://fakehost/douwa/pc/jap/01/01.htm"><span size="-1">ネコがネズミを追いかける訳</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうの世界昔話<img src="file:///C|/Documents%20and%20Settings/%E7%A6%8F%E5%A8%98note/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/company_website15/image/spacer.gif" width="1" height="1"></span></b><a href="http://fakehost/douwa/pc/world/01/01a.htm"><span size="-1">モンゴルの十二支話</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <img src="file:///C|/Documents%20and%20Settings/%E7%A6%8F%E5%A8%98note/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97/company_website15/image/spacer.gif" width="1" height="1"><b><span size="-1">きょうの日本民話</span></b><a href="http://fakehost/douwa/pc/minwa/01/01c.html"><span size="-1">仕事の取替えっこ</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうのイソップ童話</span></b><a href="http://fakehost/douwa/pc/aesop/01/01.htm"><span size="-1">欲張りなイヌ</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうの江戸小話</span></b><a href="http://fakehost/douwa/pc/kobanashi/01/01.htm"><span size="-1">ぞうきんとお年玉</span></a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b><span size="-1">きょうの百物語</span></b><a href="http://fakehost/douwa/pc/kaidan/01/01.htm"><span size="-1">百物語の幽霊</span></a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <b><span size="-1">福娘のサイト</span></b>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1"><b>366日への旅</b><p><a href="http://hukumusume.com/366/">毎日の記念日・誕生花 ・有名人の誕生日と性格判断</a></p></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1"><b>福娘童話集</b><p><a href="http://hukumusume.com/douwa/">世界と日本の童話と昔話</a></p></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1"><b>女の子応援サイト -さくら-</b><p><a href="http://hukumusume.com/sakura/index.html">誕生日占い、お仕事紹介、おまじない、など</a></p></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1"><b>子どもの病気相談所</b><p><a href="http://hukumusume.com/my_baby/sick/">病気検索と対応方法、症状から検索するWEB問診</a></p></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span size="-1"><b>世界60秒巡り</b><p><a href="http://hukumusume.com/366/world/">国旗国歌や世界遺産など、世界の国々の豆知識</a></p></span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json
index f548bd9b2..105a38059 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected-images.json
@@ -1,4 +1,4 @@
-{
- "0": "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/10\/getting-lean-with-digital-ad-ux-300x250.jpg",
- "2": "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/05\/auto-draft-16-150x150.jpg"
-} \ No newline at end of file
+[
+ "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/10\/getting-lean-with-digital-ad-ux-300x250.jpg",
+ "http:\/\/www.iab.com\/wp-content\/uploads\/2015\/05\/auto-draft-16-150x150.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html
index dd4faf3b4..ea619a92e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/iab-1/expected.html
@@ -1,5 +1,4 @@
<div>
- <div>
<p>We messed up. As technologists, tasked with delivering content and services to users, we lost track of the user experience.</p>
<p>Twenty years ago we saw an explosion of websites, built by developers around the world, providing all forms of content. This was the beginning of an age of enlightenment, the intersection of content and technology. Many of us in the technical field felt compelled, and even empowered, to produce information as the distribution means for mass communication were no longer restricted by a high barrier to entry.</p>
<p>In 2000, the dark ages came when the dot-com bubble burst. We were told that our startups were gone or that our divisions sustained by corporate parent companies needed to be in the black. It was a wakeup call that led to a renaissance age. Digital advertising became the foundation of an economic engine that, still now, sustains the free and democratic World Wide Web. In digital publishing, we strived to balance content, commerce, and technology. The content management systems and communication gateways we built to inform and entertain populations around the world disrupted markets and in some cases governments, informed communities of imminent danger, and liberated new forms of art and entertainment—all while creating a digital middle class of small businesses.</p>
@@ -9,7 +8,7 @@
<p>Through our pursuit of further automation and maximization of margins during the industrial age of media technology, we built advertising technology to optimize publishers’ yield of marketing budgets that had eroded after the last recession. Looking back now, our scraping of dimes may have cost us dollars in consumer loyalty. The fast, scalable systems of targeting users with ever-heftier advertisements have slowed down the public internet and drained more than a few batteries. We were so clever and so good at it that we over-engineered the capabilities of the plumbing laid down by, well, ourselves. This steamrolled the users, depleted their devices, and tried their patience.</p>
<p>The rise of ad blocking poses a threat to the internet and could potentially drive users to an enclosed platform world dominated by a few companies. We have let the fine equilibrium of content, commerce, and technology get out of balance in the open web. We had, and still do have, a responsibility to educate the business side, and in some cases to push back. We lost sight of our social and ethical responsibility to provide a safe, usable experience for anyone and everyone wanting to consume the content of their choice.</p>
<p>We need to bring that back into alignment, starting right now.</p>
-<p><a href="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux.jpg"><img alt="Getting LEAN with Digital Ad UX" height="250" src="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux-300x250.jpg" width="300"></img></a>Today, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.</p>
+<p><a href="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux.jpg"><img width="300" height="250" alt="Getting LEAN with Digital Ad UX" src="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux-300x250.jpg"></a>Today, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.</p>
<p>As with any other industry, standards should be created by non-profit standards-setting bodies, with many diverse voices providing input. We will invite all parties for public comment, and make sure consumer interest groups have the opportunity to provide input.</p>
<p>L.E.A.N. Ads do not replace the current advertising standards many consumers still enjoy and engage with while consuming content on our sites across all IP enabled devices. Rather, these principles will guide an alternative set of standards that provide choice for marketers, content providers, and consumers.</p>
<p>Among the many areas of concentration, we must also address frequency capping on retargeting in Ad Tech and make sure a user is targeted appropriately before, but never AFTER they make a purchase. If we are so good at reach and scale, we can be just as good, if not better, at moderation. Additionally, we must address volume of ads per page as well as continue on the path to viewability. The dependencies here are critical to an optimized user experience.</p>
@@ -18,13 +17,13 @@
<p>Finally, we must do this in an increasingly fragmented market, across screens. We must do this in environments where entire sites are blocked, purposefully or not. Yes, it is disappointing that our development efforts will have to manage with multiple frameworks while we work to supply the economic engine to sustain an open internet. However, our goal is still to provide diverse content and voices to as many connected users as possible around the world.</p>
<p>That is user experience.</p>
-<p>IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email <a href="mailto:[email protected]">[email protected]</a> for more information.</p><p>Read <a href="http://www.iab.com/insights/ad-blocking/" target="_blank">more about ad blocking here</a>.</p>
- </div>
- </div><div id="post-author"><div>
- <figure><img alt="Auto Draft 14" src="http://www.iab.com/wp-content/uploads/2015/05/auto-draft-16-150x150.jpg"></img></figure><div>
+<p>IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email <a href="mailto:[email protected]">[email protected]</a> for more information.</p>
+<p>Read <a target="_blank" href="http://www.iab.com/insights/ad-blocking/">more about ad blocking here</a>.</p>
+ </div><div id="post-author">
+ <figure><img alt="Auto Draft 14" src="http://www.iab.com/wp-content/uploads/2015/05/auto-draft-16-150x150.jpg"></figure>
+ <div>
<h4>About the author</h4>
<p><strong>Scott Cunningham</strong></p>
<p>Senior Vice President of Technology and Ad Operations at IAB, and General Manager of the IAB Tech Lab</p>
</div>
- </div>
-</div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html
index ff46f7a1d..ab794ec4d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/ietf-1/expected.html
@@ -1,6 +1,10 @@
<div>
-<span>[<a href="http://fakehost/test/../html/" title="Document search and retrieval page">Docs</a>] [<a href="https://tools.ietf.org/id/draft-dejong-remotestorage-04.txt" title="Plaintext version of this document">txt</a>|<a href="http://fakehost/pdf/draft-dejong-remotestorage-04.txt" title="PDF version of this document">pdf</a>] [<a href="https://datatracker.ietf.org/doc/draft-dejong-remotestorage" title="IESG Datatracker information for this document">Tracker</a>] [<a href="mailto:[email protected]?subject=draft-dejong-remotestorage%20" title="Send email to the document authors">Email</a>] [<a href="http://fakehost/rfcdiff?difftype=--hwdiff&amp;url2=draft-dejong-remotestorage-04.txt" title="Inline diff (wdiff)">Diff1</a>] [<a href="http://fakehost/rfcdiff?url2=draft-dejong-remotestorage-04.txt" title="Side-by-side diff">Diff2</a>] [<a href="http://fakehost/idnits?url=https://tools.ietf.org/id/draft-dejong-remotestorage-04.txt" title="Run an idnits check of this document">Nits</a>] </span><br></br><span> </span><br></br><span>Versions: <a href="http://fakehost/test/draft-dejong-remotestorage-00">00</a> <a href="http://fakehost/test/draft-dejong-remotestorage-01">01</a> <a href="http://fakehost/test/draft-dejong-remotestorage-02">02</a> <a href="http://fakehost/test/draft-dejong-remotestorage-03">03</a> <a href="http://fakehost/test/draft-dejong-remotestorage-04">04</a> </span><br></br><span> </span><br></br><pre>INTERNET DRAFT Michiel B. de Jong
+<span>[<a href="http://fakehost/html/" title="Document search and retrieval page">Docs</a>] [<a href="https://tools.ietf.org/id/draft-dejong-remotestorage-04.txt" title="Plaintext version of this document">txt</a>|<a href="http://fakehost/pdf/draft-dejong-remotestorage-04.txt" title="PDF version of this document">pdf</a>] [<a href="https://datatracker.ietf.org/doc/draft-dejong-remotestorage" title="IESG Datatracker information for this document">Tracker</a>] [<a href="mailto:[email protected]?subject=draft-dejong-remotestorage%20" title="Send email to the document authors">Email</a>] [<a href="http://fakehost/rfcdiff?difftype=--hwdiff&amp;url2=draft-dejong-remotestorage-04.txt" title="Inline diff (wdiff)">Diff1</a>] [<a href="http://fakehost/rfcdiff?url2=draft-dejong-remotestorage-04.txt" title="Side-by-side diff">Diff2</a>] [<a href="http://fakehost/idnits?url=https://tools.ietf.org/id/draft-dejong-remotestorage-04.txt" title="Run an idnits check of this document">Nits</a>] </span><br>
+<span> </span><br>
+<span>Versions: <a href="http://fakehost/test/draft-dejong-remotestorage-00">00</a> <a href="http://fakehost/test/draft-dejong-remotestorage-01">01</a> <a href="http://fakehost/test/draft-dejong-remotestorage-02">02</a> <a href="http://fakehost/test/draft-dejong-remotestorage-03">03</a> <a href="http://fakehost/test/draft-dejong-remotestorage-04">04</a> </span><br>
+<span> </span><br>
+<pre>INTERNET DRAFT Michiel B. de Jong
Document: <a href="http://fakehost/test/draft-dejong-remotestorage-04">draft-dejong-remotestorage-04</a> IndieHosters
F. Kooman
Intended Status: Proposed Standard (independent)
@@ -53,7 +57,7 @@ Copyright Notice
<span>de Jong [Page 1]</span>
-</pre><pre><a href="#page-2" id="page-2" name="page-2"> </a>
+</pre><pre><a name="page-2" id="page-2" href="#page-2"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -89,7 +93,7 @@ Table of Contents
<a href="#section-18">18</a>. Authors' addresses............................................<a href="#page-22">22</a>
-<span><a href="#section-1" name="section-1">1</a>. Introduction</span>
+<span><a name="section-1" href="#section-1">1</a>. Introduction</span>
Many services for data storage are available over the internet. This
specification describes a vendor-independent interface for such
@@ -103,7 +107,7 @@ Table of Contents
<span>de Jong [Page 2]</span>
-</pre><pre><a href="#page-3" id="page-3" name="page-3"> </a>
+</pre><pre><a name="page-3" id="page-3" href="#page-3"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -122,7 +126,7 @@ Table of Contents
The exact details of these four actions are described in this
specification.
-<span><a href="#section-2" name="section-2">2</a>. Terminology</span>
+<span><a name="section-2" href="#section-2">2</a>. Terminology</span>
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
@@ -135,7 +139,7 @@ Table of Contents
implement the general requirement when such failure would result in
interoperability failure.
-<span><a href="#section-3" name="section-3">3</a>. Storage model</span>
+<span><a name="section-3" href="#section-3">3</a>. Storage model</span>
The server stores data in nodes that form a tree structure.
Internal nodes are called 'folders' and leaf nodes are called
@@ -153,7 +157,7 @@ Table of Contents
<span>de Jong [Page 3]</span>
-</pre><pre><a href="#page-4" id="page-4" name="page-4"> </a>
+</pre><pre><a name="page-4" id="page-4" href="#page-4"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -163,7 +167,7 @@ Table of Contents
* content length
* content
-<span><a href="#section-4" name="section-4">4</a>. Requests</span>
+<span><a name="section-4" href="#section-4">4</a>. Requests</span>
Client-to-server requests SHOULD be made over https [<a href="#ref-HTTPS">HTTPS</a>], and
servers MUST comply with HTTP/1.1 [<a href="#ref-HTTP">HTTP</a>]. Specifically, they
@@ -203,7 +207,7 @@ Table of Contents
<span>de Jong [Page 4]</span>
-</pre><pre><a href="#page-5" id="page-5" name="page-5"> </a>
+</pre><pre><a name="page-5" id="page-5" href="#page-5"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -253,7 +257,7 @@ Table of Contents
<span>de Jong [Page 5]</span>
-</pre><pre><a href="#page-6" id="page-6" name="page-6"> </a>
+</pre><pre><a name="page-6" id="page-6" href="#page-6"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -303,11 +307,11 @@ Table of Contents
<span>de Jong [Page 6]</span>
-</pre><pre><a href="#page-7" id="page-7" name="page-7"> </a>
+</pre><pre><a name="page-7" id="page-7" href="#page-7"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
-<span><a href="#section-5" name="section-5">5</a>. Response codes</span>
+<span><a name="section-5" href="#section-5">5</a>. Response codes</span>
Response codes SHOULD be given as defined by [HTTP, <a href="#section-6">section 6</a>] and
[BEARER, <a href="#section-3.1">section 3.1</a>]. The following is a non-normative checklist
@@ -340,7 +344,7 @@ Table of Contents
Clients SHOULD also handle the case where a response takes too long
to arrive, or where no response is received at all.
-<span><a href="#section-6" name="section-6">6</a>. Versioning</span>
+<span><a name="section-6" href="#section-6">6</a>. Versioning</span>
All successful requests MUST return an 'ETag' header [<a href="#ref-HTTP">HTTP</a>] with, in
the case of GET, the current version, in the case of PUT, the new
@@ -353,7 +357,7 @@ Table of Contents
<span>de Jong [Page 7]</span>
-</pre><pre><a href="#page-8" id="page-8" name="page-8"> </a>
+</pre><pre><a name="page-8" id="page-8" href="#page-8"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -370,14 +374,14 @@ Table of Contents
A provider MAY offer version rollback functionality to its users,
but this specification does not define the user interface for that.
-<span><a href="#section-7" name="section-7">7</a>. CORS headers</span>
+<span><a name="section-7" href="#section-7">7</a>. CORS headers</span>
All responses MUST carry CORS headers [<a href="#ref-CORS">CORS</a>]. The server MUST also
reply to OPTIONS requests as per CORS. For GET requests, a wildcard
origin MAY be returned, but for PUT and DELETE requests, the
response MUST echo back the Origin header sent by the client.
-<span><a href="#section-8" name="section-8">8</a>. Session description</span>
+<span><a name="section-8" href="#section-8">8</a>. Session description</span>
The information that a client needs to receive in order to be able
to connect to a server SHOULD reach the client as described in the
@@ -403,7 +407,7 @@ Table of Contents
<span>de Jong [Page 8]</span>
-</pre><pre><a href="#page-9" id="page-9" name="page-9"> </a>
+</pre><pre><a name="page-9" id="page-9" href="#page-9"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -418,7 +422,7 @@ Table of Contents
* https://storage.example.com/bob/public/documents/
* https://storage.example.com/bob/public/documents/draft.txt
-<span><a href="#section-9" name="section-9">9</a>. Bearer tokens and access control</span>
+<span><a name="section-9" href="#section-9">9</a>. Bearer tokens and access control</span>
A bearer token represents one or more access scopes. These access
scopes are represented as strings of the form &lt;module&gt; &lt;level&gt;,
@@ -453,12 +457,12 @@ Table of Contents
<span>de Jong [Page 9]</span>
-</pre><pre><a href="#page-10" id="page-10" name="page-10"> </a>
+</pre><pre><a name="page-10" id="page-10" href="#page-10"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
-<span><a href="#section-10" name="section-10">10</a>. Application-first bearer token issuance</span>
+<span><a name="section-10" href="#section-10">10</a>. Application-first bearer token issuance</span>
To make a remoteStorage server available as 'the remoteStorage of
&lt;account&gt; at &lt;host&gt;', exactly one link of the following format
@@ -503,7 +507,7 @@ Table of Contents
<span>de Jong [Page 10]</span>
-</pre><pre><a href="#page-11" id="page-11" name="page-11"> </a>
+</pre><pre><a name="page-11" id="page-11" href="#page-11"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -533,7 +537,7 @@ Table of Contents
client_id parameter in favor of relying on the redirect_uri
parameter for client identification.
-<span><a href="#section-11" name="section-11">11</a>. Storage-first bearer token issuance</span>
+<span><a name="section-11" href="#section-11">11</a>. Storage-first bearer token issuance</span>
The provider MAY also present a dashboard to the user, where they
have some way to add open web app manifests [<a href="#ref-MANIFEST">MANIFEST</a>]. Adding a
@@ -553,7 +557,7 @@ Table of Contents
<span>de Jong [Page 11]</span>
-</pre><pre><a href="#page-12" id="page-12" name="page-12"> </a>
+</pre><pre><a name="page-12" id="page-12" href="#page-12"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -591,19 +595,19 @@ Table of Contents
debug tool, thus bypassing the need for an OAuth dance. Clients
SHOULD NOT rely on this in production.
-<span><a href="#section-12" name="section-12">12</a>. Example wire transcripts</span>
+<span><a name="section-12" href="#section-12">12</a>. Example wire transcripts</span>
The following examples are not normative ("\" indicates a line was
wrapped).
-<span><a href="#section-12.1" name="section-12.1">12.1</a>. WebFinger</span>
+<span><a name="section-12.1" href="#section-12.1">12.1</a>. WebFinger</span>
In application-first, an in-browser application might issue the
following request, using XMLHttpRequest and CORS:
<span>de Jong [Page 12]</span>
-</pre><pre><a href="#page-13" id="page-13" name="page-13"> </a>
+</pre><pre><a name="page-13" id="page-13" href="#page-13"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -643,7 +647,7 @@ motestorage-04",
}]
}
-<span><a href="#section-12.2" name="section-12.2">12.2</a>. OAuth dialog form</span>
+<span><a name="section-12.2" href="#section-12.2">12.2</a>. OAuth dialog form</span>
Once the in-browser application has discovered the server's OAuth
end-point, it will typically redirect the user to this URL, in
@@ -653,7 +657,7 @@ motestorage-04",
<span>de Jong [Page 13]</span>
-</pre><pre><a href="#page-14" id="page-14" name="page-14"> </a>
+</pre><pre><a name="page-14" id="page-14" href="#page-14"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -673,7 +677,7 @@ unhosted.5apps.com&amp;response_type=token HTTP/1.1
&lt;title&gt;Allow access?&lt;/title&gt;
...
-<span><a href="#section-12.3" name="section-12.3">12.3</a>. OAuth dialog form submission</span>
+<span><a name="section-12.3" href="#section-12.3">12.3</a>. OAuth dialog form submission</span>
When the user submits the form, the request would look something
like this:
@@ -698,12 +702,12 @@ low
Location:https://drinks-unhosted.5apps.com/#access_token=j2YnGt\
XjzzzHNjkd1CJxoQubA1o%3D&amp;token_type=bearer&amp;state=
-<span><a href="#section-12.4" name="section-12.4">12.4</a>. OPTIONS preflight</span>
+<span><a name="section-12.4" href="#section-12.4">12.4</a>. OPTIONS preflight</span>
<span>de Jong [Page 14]</span>
-</pre><pre><a href="#page-15" id="page-15" name="page-15"> </a>
+</pre><pre><a name="page-15" id="page-15" href="#page-15"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -726,7 +730,7 @@ XjzzzHNjkd1CJxoQubA1o%3D&amp;token_type=bearer&amp;state=
Access-Control-Allow-Headers: Authorization, Content-Length, Co\
ntent-Type, Origin, X-Requested-With, If-Match, If-None-Match
-<span><a href="#section-12.5" name="section-12.5">12.5</a>. Initial PUT</span>
+<span><a name="section-12.5" href="#section-12.5">12.5</a>. Initial PUT</span>
An initial PUT may contain an 'If-None-Match: *' header, like this:
@@ -749,11 +753,11 @@ ntent-Type, Origin, X-Requested-With, If-Match, If-None-Match
Access-Control-Allow-Origin: <a href="https://drinks-unhosted.5apps.com">https://drinks-unhosted.5apps.com</a>
ETag: "1382694045000"
-<span><a href="#section-12.6" name="section-12.6">12.6</a>. Subsequent PUT</span>
+<span><a name="section-12.6" href="#section-12.6">12.6</a>. Subsequent PUT</span>
<span>de Jong [Page 15]</span>
-</pre><pre><a href="#page-16" id="page-16" name="page-16"> </a>
+</pre><pre><a name="page-16" id="page-16" href="#page-16"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -779,7 +783,7 @@ e.io/spec/modules/myfavoritedrinks/drink"}
Access-Control-Allow-Origin: <a href="https://drinks-unhosted.5apps.com">https://drinks-unhosted.5apps.com</a>
ETag: "1382694048000"
-<span><a href="#section-12.7" name="section-12.7">12.7</a>. GET</span>
+<span><a name="section-12.7" href="#section-12.7">12.7</a>. GET</span>
A GET request would also include the bearer token, and optionally
an If-None-Match header:
@@ -803,7 +807,7 @@ e.io/spec/modules/myfavoritedrinks/drink"}
<span>de Jong [Page 16]</span>
-</pre><pre><a href="#page-17" id="page-17" name="page-17"> </a>
+</pre><pre><a name="page-17" id="page-17" href="#page-17"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -838,7 +842,7 @@ charset=UTF-8","Content-Length":106}}}
HTTP/1.1 404 Not Found
Access-Control-Allow-Origin: <a href="https://drinks-unhosted.5apps.com">https://drinks-unhosted.5apps.com</a>
-<span><a href="#section-12.8" name="section-12.8">12.8</a>. DELETE</span>
+<span><a name="section-12.8" href="#section-12.8">12.8</a>. DELETE</span>
A DELETE request may look like this:
@@ -853,7 +857,7 @@ charset=UTF-8","Content-Length":106}}}
<span>de Jong [Page 17]</span>
-</pre><pre><a href="#page-18" id="page-18" name="page-18"> </a>
+</pre><pre><a name="page-18" id="page-18" href="#page-18"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -863,7 +867,7 @@ charset=UTF-8","Content-Length":106}}}
Access-Control-Allow-Origin: <a href="https://drinks-unhosted.5apps.com">https://drinks-unhosted.5apps.com</a>
ETag: "1382694048000"
-<span><a href="#section-13" name="section-13">13</a>. Distributed versioning</span>
+<span><a name="section-13" href="#section-13">13</a>. Distributed versioning</span>
This section is non-normative, and is intended to explain some of
the design choices concerning ETags and folder listings. At the
@@ -903,7 +907,7 @@ charset=UTF-8","Content-Length":106}}}
<span>de Jong [Page 18]</span>
-</pre><pre><a href="#page-19" id="page-19" name="page-19"> </a>
+</pre><pre><a name="page-19" id="page-19" href="#page-19"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -925,7 +929,7 @@ charset=UTF-8","Content-Length":106}}}
but it is up to whichever client discovers a given version
conflict, to resolve it.
-<span><a href="#section-14" name="section-14">14</a>. Security Considerations</span>
+<span><a name="section-14" href="#section-14">14</a>. Security Considerations</span>
To prevent man-in-the-middle attacks, the use of https instead of
http is important for both the interface itself and all end-points
@@ -953,7 +957,7 @@ charset=UTF-8","Content-Length":106}}}
<span>de Jong [Page 19]</span>
-</pre><pre><a href="#page-20" id="page-20" name="page-20"> </a>
+</pre><pre><a name="page-20" id="page-20" href="#page-20"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
@@ -970,7 +974,7 @@ charset=UTF-8","Content-Length":106}}}
The server SHOULD also detect and stop denial-of-service attacks
that aim to overwhelm its interface with too much traffic.
-<span><a href="#section-15" name="section-15">15</a>. IANA Considerations</span>
+<span><a name="section-15" href="#section-15">15</a>. IANA Considerations</span>
This document registers the 'remotestorage' link relation, as well
as the following WebFinger properties:
@@ -980,7 +984,7 @@ charset=UTF-8","Content-Length":106}}}
* "<a href="http://tools.ietf.org/html/rfc7233">http://tools.ietf.org/html/rfc7233</a>"
* "<a href="http://remotestorage.io/spec/web-authoring">http://remotestorage.io/spec/web-authoring</a>"
-<span><a href="#section-16" name="section-16">16</a>. Acknowledgements</span>
+<span><a name="section-16" href="#section-16">16</a>. Acknowledgements</span>
The authors would like to thank everybody who contributed to the
development of this protocol, including Kenny Bentley, Javier Diaz,
@@ -993,95 +997,95 @@ charset=UTF-8","Content-Length":106}}}
Rick van Rein, Mark Nottingham, Julian Reschke, and Markus
Lanthaler, among many others.
-<span><a href="#section-17" name="section-17">17</a>. References</span>
+<span><a name="section-17" href="#section-17">17</a>. References</span>
-<span><a href="#section-17.1" name="section-17.1">17.1</a>. Normative References</span>
+<span><a name="section-17.1" href="#section-17.1">17.1</a>. Normative References</span>
- [<a id="ref-WORDS" name="ref-WORDS">WORDS</a>]
+ [<a name="ref-WORDS" id="ref-WORDS">WORDS</a>]
Bradner, S., "Key words for use in RFCs to Indicate Requirement
Levels", <a href="http://fakehost/test/bcp14">BCP 14</a>, <a href="http://fakehost/test/rfc2119">RFC 2119</a>, March 1997.
<span>de Jong [Page 20]</span>
-</pre><pre><a href="#page-21" id="page-21" name="page-21"> </a>
+</pre><pre><a name="page-21" id="page-21" href="#page-21"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
- [<a id="ref-IRI" name="ref-IRI">IRI</a>]
+ [<a name="ref-IRI" id="ref-IRI">IRI</a>]
Duerst, M., "Internationalized Resource Identifiers (IRIs)",
<a href="http://fakehost/test/rfc3987">RFC 3987</a>, January 2005.
- [<a id="ref-WEBFINGER" name="ref-WEBFINGER">WEBFINGER</a>]
+ [<a name="ref-WEBFINGER" id="ref-WEBFINGER">WEBFINGER</a>]
Jones, P., Salguerio, G., Jones, M, and Smarr, J.,
"WebFinger", <a href="http://fakehost/test/rfc7033">RFC7033</a>, September 2013.
- [<a id="ref-OAUTH" name="ref-OAUTH">OAUTH</a>]
+ [<a name="ref-OAUTH" id="ref-OAUTH">OAUTH</a>]
"<a href="#section-4.2">Section 4.2</a>: Implicit Grant", in: Hardt, D. (ed), "The OAuth
2.0 Authorization Framework", <a href="http://fakehost/test/rfc6749">RFC6749</a>, October 2012.
-<span><a href="#section-17.2" name="section-17.2">17.2</a>. Informative References</span>
+<span><a name="section-17.2" href="#section-17.2">17.2</a>. Informative References</span>
- [<a id="ref-HTTPS" name="ref-HTTPS">HTTPS</a>]
+ [<a name="ref-HTTPS" id="ref-HTTPS">HTTPS</a>]
Rescorla, E., "HTTP Over TLS", <a href="http://fakehost/test/rfc2818">RFC2818</a>, May 2000.
- [<a id="ref-HTTP" name="ref-HTTP">HTTP</a>]
+ [<a name="ref-HTTP" id="ref-HTTP">HTTP</a>]
Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
Semantics and Content", <a href="http://fakehost/test/rfc7231">RFC7231</a>, June 2014.
- [<a id="ref-COND" name="ref-COND">COND</a>]
+ [<a name="ref-COND" id="ref-COND">COND</a>]
Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
Conditional Requests", <a href="http://fakehost/test/rfc7232">RFC7232</a>, June 2014.
- [<a id="ref-RANGE" name="ref-RANGE">RANGE</a>]
+ [<a name="ref-RANGE" id="ref-RANGE">RANGE</a>]
Fielding et al., "Hypertext Transfer Protocol (HTTP/1.1):
Conditional Requests", <a href="http://fakehost/test/rfc7233">RFC7233</a>, June 2014.
- [<a id="ref-SPDY" name="ref-SPDY">SPDY</a>]
+ [<a name="ref-SPDY" id="ref-SPDY">SPDY</a>]
Mark Belshe, Roberto Peon, "SPDY Protocol - Draft 3.1", <a href="http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1">http://</a>
<a href="http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1">www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1</a>,
September 2013.
- [<a id="ref-JSON-LD" name="ref-JSON-LD">JSON-LD</a>]
+ [<a name="ref-JSON-LD" id="ref-JSON-LD">JSON-LD</a>]
M. Sporny, G. Kellogg, M. Lanthaler, "JSON-LD 1.0", W3C
Proposed Recommendation,
<a href="http://www.w3.org/TR/2014/REC-json-ld-20140116/">http://www.w3.org/TR/2014/REC-json-ld-20140116/</a>, January 2014.
- [<a id="ref-CORS" name="ref-CORS">CORS</a>]
+ [<a name="ref-CORS" id="ref-CORS">CORS</a>]
van Kesteren, Anne (ed), "Cross-Origin Resource Sharing --
W3C Candidate Recommendation 29 January 2013",
<span>de Jong [Page 21]</span>
-</pre><pre><a href="#page-22" id="page-22" name="page-22"> </a>
+</pre><pre><a name="page-22" id="page-22" href="#page-22"> </a>
<span>Internet-Draft remoteStorage December 2014</span>
<a href="http://www.w3.org/TR/cors/">http://www.w3.org/TR/cors/</a>, January 2013.
- [<a id="ref-MANIFEST" name="ref-MANIFEST">MANIFEST</a>]
+ [<a name="ref-MANIFEST" id="ref-MANIFEST">MANIFEST</a>]
Mozilla Developer Network (ed), "App manifest -- Revision
330541", <a href="https://developer.mozilla.org/en-">https://developer.mozilla.org/en-</a>
US/Apps/Build/Manifest$revision/566677, April 2014.
- [<a id="ref-DATASTORE" name="ref-DATASTORE">DATASTORE</a>]
+ [<a name="ref-DATASTORE" id="ref-DATASTORE">DATASTORE</a>]
"WebAPI/DataStore", MozillaWiki, retrieved May 2014.
<a href="https://wiki.mozilla.org/WebAPI/DataStore#Manifest">https://wiki.mozilla.org/WebAPI/DataStore#Manifest</a>
- [<a id="ref-KERBEROS" name="ref-KERBEROS">KERBEROS</a>]
+ [<a name="ref-KERBEROS" id="ref-KERBEROS">KERBEROS</a>]
C. Neuman et al., "The Kerberos Network Authentication Service
(V5)", <a href="http://fakehost/test/rfc4120">RFC4120</a>, July 2005.
- [<a id="ref-BEARER" name="ref-BEARER">BEARER</a>]
+ [<a name="ref-BEARER" id="ref-BEARER">BEARER</a>]
M. Jones, D. Hardt, "The OAuth 2.0 Authorization Framework:
Bearer Token Usage", <a href="http://fakehost/test/rfc6750">RFC6750</a>, October 2012.
- [<a id="ref-AUTHORING" name="ref-AUTHORING">AUTHORING</a>]
+ [<a name="ref-AUTHORING" id="ref-AUTHORING">AUTHORING</a>]
"Using remoteStorage for web authoring", reSite wiki, retrieved
September 2014. <a href="https://github.com/michielbdejong/resite/wiki">https://github.com/michielbdejong/resite/wiki</a>
/Using-remoteStorage-for-web-authoring
-<span><a href="#section-18" name="section-18">18</a>. Authors' addresses</span>
+<span><a name="section-18" href="#section-18">18</a>. Authors' addresses</span>
Michiel B. de Jong
IndieHosters
@@ -1104,7 +1108,8 @@ charset=UTF-8","Content-Length":106}}}
de Jong [Page 22]
-</pre><br></br><span><small><small>Html markup produced by rfcmarkup 1.111, available from
+</pre><br>
+<span><small><small>Html markup produced by rfcmarkup 1.111, available from
<a href="https://tools.ietf.org/tools/rfcmarkup/">https://tools.ietf.org/tools/rfcmarkup/</a>
</small></small></span>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html
index e575c7beb..f28c6898e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/infobae/expected.html
@@ -1 +1 @@
-<div id="article-body"> <div id="article-content"> <div> <figure><div> <p><img alt="Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres" data-original="https://www.infobae.com/new-resizer/b_LU5bsrOM_BmZtNMzegvdNoPNE=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01154429/Rugbier-golpeado-1920.jpg" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23QU6XDTECU5EDVI4HBTME4PLIOQ" height="422.32142857142856" id="QU6XDTECU5EDVI4HBTME4PLIOQ" src="https://www.infobae.com/new-resizer/b_LU5bsrOM_BmZtNMzegvdNoPNE=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01154429/Rugbier-golpeado-1920.jpg" width="750"></img></p></div> <figcaption class=""><span>Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres</span> </figcaption></figure></div> <div> <p> Eran casi las 6:30 de la mañana. Jonathan Castellari, de 25 años, volvía de bailar junto a Sebastián, su amigo. Les pareció una buena idea detenerse en el Mc Donald's de Avenida Córdoba al 3100 con el objetivo de desayunar y continuar el viaje hasta sus hogares. Mientras esperaban la comida, un grupo de 8 chicos de entre 20 y 25 años ingresó al local con el mismo objetivo, aunque adoptaron otro plan: mirarlos fijamente, reírse de ellos y hacer chistes sobre la sexualidad de ambos.</p> </div> <div> <p> Sebastián relató a<strong> Infobae:</strong> "Estábamos esperando nuestro pedido, haciéndonos chistes, riéndonos de lo sucedido durante la noche. Hablábamos entre nosotros. En ese momento entró un grupo de 8 chicos, de contextura grande, y notamos que estaban alcoholizados. Nos miraban, hacían chistes, se reían de nosotros. Fue ahí cuando decidimos salir con Jonathan a fumar un cigarrillo y esperar que se fueran. <strong>Él salió primero y vi que uno de estos pibes lo abrazó y se lo llevó. Instantáneamente se metieron los demás a pegarle. Le pegaron mucho.</strong> Quise pararlos y no pude. Ligué yo también, pero nada en comparación a lo que sufrió Jonathan. Cuando lo soltaron lo agarré como pude y justo una enfermera del Sanatorio Güemes (está a dos cuadras del local) estaba tomando un café y le dio los primeros auxilios".</p> </div> <div> <figure><div> <p><img alt="" data-original="https://www.infobae.com/new-resizer/PUJQSwJZOtaetM7tXKqic4Ib1Wg=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161934/Jonathan-Castellani-SF-2.jpg" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23NH7MLFDU4JH4VOSMUUN6JPRYUQ" height="937.7289377289377" id="NH7MLFDU4JH4VOSMUUN6JPRYUQ" src="https://www.infobae.com/new-resizer/PUJQSwJZOtaetM7tXKqic4Ib1Wg=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161934/Jonathan-Castellani-SF-2.jpg" width="750"></img></p></div> <figcaption class=""><span></span> </figcaption></figure></div> <div> <p> "Fuimos a verlo recién, no paraba de llorar y de decirnos que le pegaron por puto", dijo a <strong>Infobae</strong> María Rachid, titular del Instituto contra la Discriminación de la Defensoría del Pueblo CABA. "Lamentablemente su situación es delicada. Recién nos informaron que lo van a intervenir quirúrgicamente porque <strong>podría perder un ojo</strong>".</p> </div> <div> <p> Como Jonathan no conoce a los agresores, desde la Defensoría y la Federación LGBT se comunicaron con autoridades del Ministerio de Seguridad para que soliciten las cámaras de seguridad del Mc Donald's, del sanatorio Güemes y de otros negocios de la cuadra para poder identificarlos.</p> </div> <div> <figure><div> <p><img alt="" data-original="https://www.infobae.com/new-resizer/yS5kphJxw_CBn1mycqbcrMjoNmQ=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01163101/JonathanGay2.jpg" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23O7QMD7FTTNCIJOVETW7KYJVVDA" height="422.32142857142856" id="O7QMD7FTTNCIJOVETW7KYJVVDA" src="https://www.infobae.com/new-resizer/yS5kphJxw_CBn1mycqbcrMjoNmQ=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01163101/JonathanGay2.jpg" width="750"></img></p></div> <figcaption class=""><span></span> </figcaption></figure></div> <div> <p> Gastón Llopart, abogado de Sebastián, le detalló a <strong>Infobae</strong> que Jonathan está "próximo a recibir una intervención quirúrgica, ya que<strong> tuvo fractura en el hueso del pómulo derecho de su rostro. Sebastián llamó al 911 dos veces y no fueron.</strong> Me contaron que los agresores los siguieron hasta el sanatorio mientras los insultaban: la gente de seguridad tuvo que echarlos".</p> </div> <div> <p> Llopart agregó que la patota, <strong>mientras lo golpeaban, le gritaba: "Te vamos a matar por puto"</strong>. La familia de Jonathan está en el sanatorio a la espera de la intervención quirúrgica. Llopart dijo que "harán la denuncia el lunes por la mañana, cuando existan mayores precisiones de lo ocurrido".</p> </div> <div> <figure><div> <p><img alt="" data-original="https://www.infobae.com/new-resizer/cFidtpanVMHP25zNoWF78I4qjMA=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161927/Jonathan-Castellani-1920.jpg" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%237BCY2NEI6ZADBA3TRJGQC6R3BU" height="422.32142857142856" id="7BCY2NEI6ZADBA3TRJGQC6R3BU" src="https://www.infobae.com/new-resizer/cFidtpanVMHP25zNoWF78I4qjMA=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161927/Jonathan-Castellani-1920.jpg" width="750"></img></p></div> <figcaption class=""><span></span> </figcaption></figure></div> <div> <p> Jonathan y Sebastián forman parte de Ciervos Pampas Rugby Club, un equipo que nació hace cinco años como el primer equipo de la Argentina por la diversidad sexual. Se trata de un combinado que no está integrado en un 100% por varones gays, pero en el que estos encuentran un lugar en el cual expresar libremente su orientación sexual, <strong>sin miedo a los prejuicios o a la discriminación.</strong> El club emitió un comunicado en su cuenta de Facebook, relatando los hechos y solidarizándose con Jonathan.</p> </div> </div> </div> \ No newline at end of file
+<div id="article-body"> <div> <figure> <div> <p><img id="QU6XDTECU5EDVI4HBTME4PLIOQ" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23QU6XDTECU5EDVI4HBTME4PLIOQ" data-original="https://www.infobae.com/new-resizer/b_LU5bsrOM_BmZtNMzegvdNoPNE=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01154429/Rugbier-golpeado-1920.jpg" alt="Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres" height="422.32142857142856" width="750" src="https://www.infobae.com/new-resizer/b_LU5bsrOM_BmZtNMzegvdNoPNE=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01154429/Rugbier-golpeado-1920.jpg"> </p></div> <figcaption class> <span>Jonathan Castellari tiene 25 años y fue golpeado por una patota de 8 hombres</span> </figcaption> </figure> </div> <div> <p> Eran casi las 6:30 de la mañana. Jonathan Castellari, de 25 años, volvía de bailar junto a Sebastián, su amigo. Les pareció una buena idea detenerse en el Mc Donald's de Avenida Córdoba al 3100 con el objetivo de desayunar y continuar el viaje hasta sus hogares. Mientras esperaban la comida, un grupo de 8 chicos de entre 20 y 25 años ingresó al local con el mismo objetivo, aunque adoptaron otro plan: mirarlos fijamente, reírse de ellos y&nbsp;hacer chistes sobre la sexualidad de ambos.</p> </div> <div> <p> Sebastián relató a<strong> Infobae:</strong>&nbsp;"Estábamos esperando nuestro pedido, haciéndonos chistes, riéndonos de lo sucedido durante la noche. Hablábamos entre nosotros. En ese momento entró un grupo de 8 chicos, de contextura grande, y notamos que estaban alcoholizados. Nos miraban, hacían chistes, se reían de nosotros. Fue ahí cuando decidimos salir con Jonathan a fumar un cigarrillo y esperar que se fueran. <strong>Él salió primero y vi que uno de estos pibes lo abrazó y se lo llevó. Instantáneamente se metieron los demás a pegarle. Le pegaron mucho.</strong> Quise pararlos y no pude. Ligué yo también, pero nada en comparación a lo que sufrió Jonathan. Cuando lo soltaron lo agarré como pude y justo una enfermera del Sanatorio Güemes (está a dos cuadras del local) estaba tomando un café y le dio los primeros auxilios".</p> </div> <div> <figure> <div> <p><img id="NH7MLFDU4JH4VOSMUUN6JPRYUQ" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23NH7MLFDU4JH4VOSMUUN6JPRYUQ" data-original="https://www.infobae.com/new-resizer/PUJQSwJZOtaetM7tXKqic4Ib1Wg=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161934/Jonathan-Castellani-SF-2.jpg" alt height="937.7289377289377" width="750" src="https://www.infobae.com/new-resizer/PUJQSwJZOtaetM7tXKqic4Ib1Wg=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161934/Jonathan-Castellani-SF-2.jpg"> </p></div> <figcaption class> <span></span> </figcaption> </figure> </div> <div> <p> "Fuimos a verlo recién, no paraba de llorar y de decirnos que le pegaron por puto", dijo a <strong>Infobae</strong> María Rachid, titular del Instituto contra la Discriminación de la Defensoría del Pueblo CABA. "Lamentablemente su situación es delicada. Recién nos informaron que lo van a intervenir quirúrgicamente porque <strong>podría perder un ojo</strong>".</p> </div> <div> <p> Como Jonathan no conoce a los agresores, desde la Defensoría y la Federación LGBT se comunicaron con autoridades del Ministerio de Seguridad para que soliciten las cámaras de seguridad del Mc Donald's, del sanatorio Güemes y de otros negocios de la cuadra para poder identificarlos.</p> </div> <div> <figure> <div> <p><img id="O7QMD7FTTNCIJOVETW7KYJVVDA" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%23O7QMD7FTTNCIJOVETW7KYJVVDA" data-original="https://www.infobae.com/new-resizer/yS5kphJxw_CBn1mycqbcrMjoNmQ=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01163101/JonathanGay2.jpg" alt height="422.32142857142856" width="750" src="https://www.infobae.com/new-resizer/yS5kphJxw_CBn1mycqbcrMjoNmQ=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01163101/JonathanGay2.jpg"> </p></div> <figcaption class> <span></span> </figcaption> </figure> </div> <div> <p> Gastón Llopart, abogado de Sebastián, le detalló a <strong>Infobae</strong> que Jonathan está "próximo a recibir una intervención quirúrgica, ya que<strong> tuvo fractura en el hueso del pómulo derecho de su rostro. Sebastián llamó al 911 dos veces y no fueron.</strong> Me contaron que los agresores los siguieron hasta el sanatorio mientras los insultaban: la gente de seguridad tuvo que echarlos".</p> </div> <div> <p> Llopart agregó que la patota, <strong>mientras lo golpeaban, le gritaba: "Te vamos a matar por puto"</strong>. La familia de Jonathan está en el sanatorio a la espera de la intervención quirúrgica. Llopart dijo que "harán la denuncia el lunes por la mañana, cuando existan mayores precisiones de lo ocurrido".</p> </div> <div> <figure> <div> <p><img id="7BCY2NEI6ZADBA3TRJGQC6R3BU" data-url="http://www.infobae.com/sociedad/2017/12/01/una-patota-de-varones-ataco-a-un-rugbier-gay-te-vamos-a-matar-por-puto/%237BCY2NEI6ZADBA3TRJGQC6R3BU" data-original="https://www.infobae.com/new-resizer/cFidtpanVMHP25zNoWF78I4qjMA=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161927/Jonathan-Castellani-1920.jpg" alt height="422.32142857142856" width="750" src="https://www.infobae.com/new-resizer/cFidtpanVMHP25zNoWF78I4qjMA=/600x0/filters:quality(100)/s3.amazonaws.com/arc-wordpress-client-uploads/infobae-wp/wp-content/uploads/2017/12/01161927/Jonathan-Castellani-1920.jpg"> </p></div> <figcaption class> <span></span> </figcaption> </figure> </div> <div> <p> Jonathan y Sebastián forman parte de Ciervos Pampas Rugby Club, un equipo que nació hace cinco años como el primer equipo de la Argentina por la diversidad sexual. Se trata de un combinado que no está integrado en un 100% por varones gays, pero en el que estos encuentran un lugar en el cual expresar libremente su orientación sexual, <strong>sin miedo a los prejuicios o a la discriminación.</strong> El club emitió un comunicado en su cuenta de Facebook, relatando los hechos y solidarizándose con Jonathan.</p> </div> </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-metadata.json
new file mode 100644
index 000000000..611a1553b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "abc",
+ "Image": null,
+ "Title": "Replace javascript: links",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected.html
new file mode 100644
index 000000000..2e73a80ea
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/expected.html
@@ -0,0 +1,7 @@
+<div>
+ <span>
+ <p>abc</p>
+ <p>def</p>
+ ghi
+ </span>
+</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/source.html
new file mode 100644
index 000000000..ee63fc89b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/js-link-replacement/source.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Replace javascript: links</title>
+</head>
+<body>
+ <a href="javascript:">
+ <p>abc</p>
+ <p>def</p>
+ ghi
+ </a>
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json
index d5b5affb7..e5097f4b8 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected-images.json
@@ -1,17 +1,17 @@
-{
- "0": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg",
- "1": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg",
- "2": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*3vIhkoHIzcxvUdijoCVx6w.png",
- "3": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg",
- "4": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg",
- "5": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*PU40bbbox2Ompc5I3RE99A.jpeg",
- "6": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*ohyycinH18fz98TCyUzVgQ.png",
- "7": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*mKvUNOAVQxl6atCbxbCZsg.jpeg",
- "8": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*knT10_FNVUmqQIBLnutmzQ.jpeg",
- "10": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg",
- "11": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*a-1_13xE6_ErQ-QSlz6myw.jpeg",
- "13": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg",
- "14": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*NGcrjfkV0l37iQH2uyYjEw.jpeg",
- "15": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg",
- "16": "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*320_4I0lxbn5x3bx4XPI5Q.png"
-} \ No newline at end of file
+[
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*sLDnS1UWEFIS33uLMxq3cw.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*3vIhkoHIzcxvUdijoCVx6w.png",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*PU40bbbox2Ompc5I3RE99A.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*ohyycinH18fz98TCyUzVgQ.png",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*mKvUNOAVQxl6atCbxbCZsg.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*knT10_FNVUmqQIBLnutmzQ.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*a-1_13xE6_ErQ-QSlz6myw.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*NGcrjfkV0l37iQH2uyYjEw.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/2000\/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg",
+ "https:\/\/d262ilb51hltx0.cloudfront.net\/max\/800\/1*320_4I0lxbn5x3bx4XPI5Q.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html
index d3696f7d1..ca16b4e1b 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-images/expected.html
@@ -1,58 +1,65 @@
-<div>
- <div>
- <section name="ef8c">
- <div>
+<div name="ef8c">
<div>
- <figure id="b9ad" name="b9ad"><div>
+ <figure name="b9ad" id="b9ad">
+ <div>
- <p><img data-height="1402" data-image-id="1*sLDnS1UWEFIS33uLMxq3cw.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*sLDnS1UWEFIS33uLMxq3cw.jpeg"></img></p></div>
- </figure></div>
+ <p><img data-image-id="1*sLDnS1UWEFIS33uLMxq3cw.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*sLDnS1UWEFIS33uLMxq3cw.jpeg">
+ </p></div>
+ </figure>
+ </div>
<div>
- <h4 data-align="center" id="9736" name="9736">Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.</h4>
+ <h4 name="9736" id="9736" data-align="center">Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.</h4>
- <figure id="7417" name="7417"><div>
+ <figure name="7417" id="7417">
+ <div>
- <p><img data-action="zoom" data-action-value="1*3vIhkoHIzcxvUdijoCVx6w.png" data-height="24" data-image-id="1*3vIhkoHIzcxvUdijoCVx6w.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*3vIhkoHIzcxvUdijoCVx6w.png"></img></p></div>
- </figure><p id="8a83" name="8a83">Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa
+ <p><img data-image-id="1*3vIhkoHIzcxvUdijoCVx6w.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*3vIhkoHIzcxvUdijoCVx6w.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*3vIhkoHIzcxvUdijoCVx6w.png">
+ </p></div>
+ </figure>
+ <p name="8a83" id="8a83">Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa
tears open a silver, smell-proof protective envelope. She slides out a
transparent bag full of crystals. Around her, machines whir and hum, and
other researchers mill around in long, white coats.</p>
- <p id="b675" name="b675">She is holding the lab’s latest delivery of a drug bought from the “deep
+ <p name="b675" id="b675">She is holding the lab’s latest delivery of a drug bought from the “deep
web,” the clandestine corner of the internet that isn’t reachable by normal
search engines, and is home to some sites that require special software
- to access. Labeled as <a data-href="http://en.wikipedia.org/wiki/MDMA" href="http://en.wikipedia.org/wiki/MDMA" rel="nofollow">MDMA</a> (the street
+ to access. Labeled as <a href="http://en.wikipedia.org/wiki/MDMA" data-href="http://en.wikipedia.org/wiki/MDMA" rel="nofollow">MDMA</a> (the street
term is ecstasy), this sample has been shipped from Canada. Lladanosa and
her colleague Iván Fornís Espinosa have also received drugs, anonymously,
from people in China, Australia, Europe and the United States.</p>
- <p id="3c0b" name="3c0b">“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to
+ <p name="3c0b" id="3c0b">“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to
vials full of red, green, blue and clear solutions sitting in labeled boxes.</p>
</div>
<div>
- <figure id="c4e6" name="c4e6"><div>
+ <figure name="c4e6" id="c4e6">
+ <div>
- <p><img data-height="1402" data-image-id="1*4gN1-fzOwCniw-DbqQjDeQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg"></img></p></div>
- <figcaption>Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*4gN1-fzOwCniw-DbqQjDeQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg">
+ </p></div>
+ <figcaption>Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="7a54" name="7a54">Since 2011, with the launch of <a data-href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" rel="nofollow">Silk Road</a>, anybody has been able to safely buy illegal
+ <p name="7a54" id="7a54">Since 2011, with the launch of <a href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" data-href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" rel="nofollow">Silk Road</a>, anybody has been able to safely buy illegal
drugs from the deep web and have them delivered to their door. Though the
FBI shut down that black market in October 2013, other outlets have emerged
to fill its role. For the last 10 months the lab at which Lladanosa and
Espinosa work has offered a paid testing service of those drugs. By sending
in samples for analysis, users can know exactly what it is they are buying,
and make a more informed decision about whether to ingest the substance.
- The group, called <a data-href="http://energycontrol.org/" href="http://energycontrol.org/" rel="nofollow">Energy Control</a>,
+ The group, called <a href="http://energycontrol.org/" data-href="http://energycontrol.org/" rel="nofollow">Energy Control</a>,
which has being running “harm reduction” programs since 1999, is the first
to run a testing service explicitly geared towards verifying those purchases
from the deep web.</p>
- <p id="4395" name="4395">Before joining Energy Control, Lladanosa briefly worked at a pharmacy,
+ <p name="4395" id="4395">Before joining Energy Control, Lladanosa briefly worked at a pharmacy,
whereas Espinosa spent 14 years doing drug analysis. Working at Energy
Control is “more gratifying,” and “rewarding” than her previous jobs, Lladanosa
told me. They also receive help from a group of volunteers, made up of
a mixture of “squatters,” as Espinosa put it, and medical students, who
prepare the samples for testing.</p>
- <p id="0c18" name="0c18">After weighing out the crystals, aggressively mixing it with methanol
+ <p name="0c18" id="0c18">After weighing out the crystals, aggressively mixing it with methanol
until dissolved, and delicately pouring the liquid into a tiny brown bottle,
Lladanosa, a petite woman who is nearly engulfed by her lab coat, is now
ready to test the sample. She loads a series of three trays on top of a
@@ -60,50 +67,61 @@
A jungle of thick pipes hang from the lab’s ceiling behind it.</p>
</div>
<div>
- <figure id="559c" name="559c"><div>
+ <figure name="559c" id="559c">
+ <div>
- <p><img data-height="1402" data-image-id="1*2KPmZkIBUrhps-2uwDvYFQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*2KPmZkIBUrhps-2uwDvYFQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="1549" name="1549">“Chromatography separates all the substances,” Lladanosa says as she loads
+ <p name="1549" id="1549">“Chromatography separates all the substances,” Lladanosa says as she loads
the machine with an array of drugs sent from the deep web and local Spanish
users. It can tell whether a sample is pure or contaminated, and if the
latter, with what.</p>
- <p id="5d0f" name="5d0f">Rushes of hot air blow across the desk as the gas chromatograph blasts
+ <p name="5d0f" id="5d0f">Rushes of hot air blow across the desk as the gas chromatograph blasts
the sample at 280 degrees Celsius. Thirty minutes later the machine’s robotic
arm automatically moves over to grip another bottle. The machine will continue
cranking through the 150 samples in the trays for most of the work week.</p>
</div>
<div>
- <figure id="d6aa" name="d6aa"><div>
+ <figure name="d6aa" id="d6aa">
+ <div>
- <p><img data-height="1241" data-image-id="1*PU40bbbox2Ompc5I3RE99A.jpeg" data-width="2013" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*PU40bbbox2Ompc5I3RE99A.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*PU40bbbox2Ompc5I3RE99A.jpeg" data-width="2013" data-height="1241" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*PU40bbbox2Ompc5I3RE99A.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="15e0" name="15e0">To get the drugs to Barcelona, a user mails at least 10 milligrams of
+ <p name="15e0" id="15e0">To get the drugs to Barcelona, a user mails at least 10 milligrams of
a substance to the offices of the Asociación Bienestar y Desarrollo, the
non-government organization that oversees Energy Control. The sample then
gets delivered to the testing service’s laboratory, at the Barcelona Biomedical
Research Park, a futuristic, seven story building sitting metres away from
the beach. Energy Control borrows its lab space from a biomedical research
group for free.</p>
- <p id="2574" name="2574">The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin.
+ <p name="2574" id="2574">The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin.
In the post announcing Energy Control’s service on the deep web, the group
promised that “All profits of this service are set aside of maintenance
of this project.”</p>
- <p id="2644" name="2644">About a week after testing, those results are sent in a PDF to an email
+ <p name="2644" id="2644">About a week after testing, those results are sent in a PDF to an email
address provided by the anonymous client.</p>
- <p id="9f91" name="9f91">“The process is quite boring, because you are in a routine,” Lladanosa
+ <p name="9f91" id="9f91">“The process is quite boring, because you are in a routine,” Lladanosa
says. But one part of the process is consistently surprising: that moment
when the results pop up on the screen. “Every time it’s something different.”
For instance, one cocaine sample she had tested also contained phenacetin,
a painkiller added to increase the product’s weight; lidocaine, an anesthetic
that numbs the gums, giving the impression that the user is taking higher
quality cocaine; and common caffeine.</p>
- <figure id="b821" name="b821"><div>
+ <figure name="b821" id="b821">
+ <div>
- <p><img data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></p></div>
- </figure><p id="39a6" name="39a6">The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish
+ <p><img data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png">
+ </p></div>
+ </figure>
+ <p name="39a6" id="39a6">The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish
physician who is better known as “DoctorX” on the deep web, a nickname
given to him by his Energy Control co-workers because of his earlier writing
about the history, risks and recreational culture of MDMA. In the physical
@@ -113,39 +131,43 @@
harms of certain substances.</p>
</div>
<div>
- <figure id="eebc" name="eebc"><div>
+ <figure name="eebc" id="eebc">
+ <div>
- <p><img data-height="1241" data-image-id="1*mKvUNOAVQxl6atCbxbCZsg.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*mKvUNOAVQxl6atCbxbCZsg.jpeg"></img></p></div>
- <figcaption>Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox</figcaption></figure></div>
+ <p><img data-image-id="1*mKvUNOAVQxl6atCbxbCZsg.jpeg" data-width="2100" data-height="1241" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*mKvUNOAVQxl6atCbxbCZsg.jpeg">
+ </p></div>
+ <figcaption>Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox</figcaption>
+ </figure>
+ </div>
<div>
- <p id="c099" name="c099">Caudevilla first ventured into Silk Road forums in April 2013. “I would
+ <p name="c099" id="c099">Caudevilla first ventured into Silk Road forums in April 2013. “I would
like to contribute to this forum offering professional advice in topics
- related to drug use and health,” he wrote in an <a data-href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" rel="nofollow">introductory post</a>,
+ related to drug use and health,” he wrote in an <a href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" data-href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" rel="nofollow">introductory post</a>,
using his DoctorX alias. Caudevilla offered to provide answers to questions
that a typical doctor is not prepared, or willing, to respond to, at least
not without a lecture or a judgment. “This advice cannot replace a complete
face-to-face medical evaluation,” he wrote, “but I know how difficult it
can be to talk frankly about these things.”</p>
- <p id="ff1d" name="ff1d">The requests flooded in. A diabetic asked what effect MDMA has on blood
+ <p name="ff1d" id="ff1d">The requests flooded in. A diabetic asked what effect MDMA has on blood
sugar; another what the risks of frequent psychedelic use were for a young
person. Someone wanted to know whether amphetamine use should be avoided
during lactation. In all, Fernando’s thread received over 50,000 visits
and 300 questions before the FBI shut down Silk Road.</p>
- <p id="1f35" name="1f35">“He’s amazing. A gift to this community,” one user wrote on the Silk Road
+ <p name="1f35" id="1f35">“He’s amazing. A gift to this community,” one user wrote on the Silk Road
2.0 forum, a site that sprang up after the original. “His knowledge is
invaluable, and never comes with any judgment.” Up until recently, Caudevilla
answered questions on the marketplace “Evolution.” Last week, however,
- the administrators of that site <a data-href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" rel="nofollow">pulled a scam</a>,
+ the administrators of that site <a href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" data-href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" rel="nofollow">pulled a scam</a>,
shutting the market down and escaping with an estimated $12 million worth
of Bitcoin.</p>
- <p id="b20f" name="b20f">Caudevilla’s transition from dispensing advice to starting up a no-questions-asked
+ <p name="b20f" id="b20f">Caudevilla’s transition from dispensing advice to starting up a no-questions-asked
drug testing service came as a consequence of his experience on the deep
web. He’d wondered whether he could help bring more harm reduction services
to a marketplace without controls. The Energy Control project, as part
of its mandate of educating drug users and preventing harm, had already
been carrying out drug testing for local Spanish users since 2001, at music
festivals, night clubs, or through a drop-in service at a lab in Madrid.</p>
- <p id="f739" name="f739">“I thought, we are doing this in Spain, why don’t we do an international
+ <p name="f739" id="f739">“I thought, we are doing this in Spain, why don’t we do an international
drug testing service?” Caudevilla told me when I visited the other Energy
Control lab, in Madrid. Caudevilla, a stocky character with ear piercings
and short, shaved hair, has eyes that light up whenever he discusses the
@@ -157,31 +179,38 @@
transparency,” Caudevilla said. “We could not make mistakes,” he added.</p>
</div>
<div>
- <figure id="4058" name="4058"><div>
+ <figure name="4058" id="4058">
+ <div>
- <p><img data-height="3141" data-image-id="1*knT10_FNVUmqQIBLnutmzQ.jpeg" data-width="4400" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*knT10_FNVUmqQIBLnutmzQ.jpeg"></img></p></div>
- <figcaption>Photo: Joseph Cox</figcaption></figure></div>
+ <p><img data-image-id="1*knT10_FNVUmqQIBLnutmzQ.jpeg" data-width="4400" data-height="3141" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*knT10_FNVUmqQIBLnutmzQ.jpeg">
+ </p></div>
+ <figcaption>Photo: Joseph Cox</figcaption>
+ </figure>
+ </div>
<div>
- <figure id="818c" name="818c"><div>
+ <figure name="818c" id="818c">
+ <div>
- <p><img data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></p></div>
- </figure><p id="7b5e" name="7b5e">While the Energy Control lab in Madrid lab only tests Spanish drugs from
+ <p><img data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png">
+ </p></div>
+ </figure>
+ <p name="7b5e" id="7b5e">While the Energy Control lab in Madrid lab only tests Spanish drugs from
various sources, it is the Barcelona location which vets the substances
bought in the shadowy recesses of of the deep web. Caudevilla no longer
runs it, having handed it over to his colleague Ana Muñoz. She maintains
a presence on the deep web forums, answers questions from potential users,
and sends back reports when they are ready.</p>
- <p id="0f0e" name="0f0e">The testing program exists in a legal grey area. The people who own the
+ <p name="0f0e" id="0f0e">The testing program exists in a legal grey area. The people who own the
Barcelona lab are accredited to experiment with and handle drugs, but Energy
Control doesn’t have this permission itself, at least not in writing.</p>
- <p id="e002" name="e002">“We have a verbal agreement with the police and other authorities. They
+ <p name="e002" id="e002">“We have a verbal agreement with the police and other authorities. They
already know what we are doing,” Lladanosa tells me. It is a pact of mutual
benefit. Energy Control provides the police with information on batches
of drugs in Spain, whether they’re from the deep web or not, Espinosa says.
They also contribute to the European Monitoring Centre for Drugs and Drug
Addiction’s early warning system, a collaboration that attempts to spread
information about dangerous drugs as quickly as possible.</p>
- <p id="db1b" name="db1b">By the time of my visit in February, Energy Control had received over
+ <p name="db1b" id="db1b">By the time of my visit in February, Energy Control had received over
150 samples from the deep web and have been receiving more at a rate of
between 4 and 8 a week. Traditional drugs, such as cocaine and MDMA, make
up about 70 percent of the samples tested, but the Barcelona lab has also
@@ -189,131 +218,150 @@
synthetic cannabinoids, and even pills of Viagra.</p>
</div>
<div>
- <figure id="b885" name="b885"><div>
+ <figure name="b885" id="b885">
+ <div>
- <p><img data-height="1402" data-image-id="1*Vr61dyCTRwk6CemmVF8YAQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*Vr61dyCTRwk6CemmVF8YAQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="e76f" name="e76f">So it’s fair to make a tentative judgement on what people are paying for
+ <p name="e76f" id="e76f">So it’s fair to make a tentative judgement on what people are paying for
on the deep web. The verdict thus far? Overall, drugs on the deep web appear
to be of much higher quality than those found on the street.</p>
- <p id="5352" name="5352">“In general, the cocaine is amazing,” says Caudevilla, saying that the
+ <p name="5352" id="5352">“In general, the cocaine is amazing,” says Caudevilla, saying that the
samples they’ve seen have purities climbing towards 80 or 90 percent, and
some even higher. To get an idea of how unusual this is, take a look at
- the <a data-href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" rel="nofollow">United Nations Office on Drugs and Crime World Drug Report 2014</a>,
+ the <a href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" data-href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" rel="nofollow">United Nations Office on Drugs and Crime World Drug Report 2014</a>,
which reports that the average quality of street cocaine in Spain is just
over 40 percent, while in the United Kingdom it is closer to 30 percent.“We
have found 100 percent [pure] cocaine,” he adds. “That’s really, really
strange. That means that, technically, this cocaine has been purified,
with clandestine methods.”</p>
- <p id="a71c" name="a71c">Naturally, identifying vendors who sell this top-of-the-range stuff is
+ <p name="a71c" id="a71c">Naturally, identifying vendors who sell this top-of-the-range stuff is
one of the reasons that people have sent samples to Energy Control. Caudevilla
was keen to stress that, officially, Energy Control’s service “is not intended
to be a control of drug quality,” meaning a vetting process for identifying
the best sellers, but that is exactly how some people have been using it.</p>
- <p id="cb5b" name="cb5b">As one buyer on the Evolution market, elmo666, wrote to me over the site’s
+ <p name="cb5b" id="cb5b">As one buyer on the Evolution market, elmo666, wrote to me over the site’s
messaging system, “My initial motivations were selfish. My primary motivation
was to ensure that I was receiving and continue to receive a high quality
product, essentially to keep the vendor honest as far as my interactions
with them went.”</p>
- <p id="d80d" name="d80d">Vendors on deep web markets advertise their product just like any other
+ <p name="d80d" id="d80d">Vendors on deep web markets advertise their product just like any other
outlet does, using flash sales, gimmicky giveaways and promises of drugs
that are superior to those of their competitors. The claims, however, can
turn out to be empty: despite the test results that show that deep web
cocaine vendors typically sell product that is of a better quality than
that found on the street, in plenty of cases, the drugs are nowhere near
as pure as advertised.</p>
- <p id="36de" name="36de">“You won’t be getting anything CLOSE to what you paid for,” one user complained
+ <p name="36de" id="36de">“You won’t be getting anything CLOSE to what you paid for,” one user complained
about the cocaine from ‘Mirkov’, a vendor on Evolution. “He sells 65% not
95%.”</p>
</div>
<div>
- <figure id="8544" name="8544"><div>
+ <figure name="8544" id="8544">
+ <div>
- <p><img data-height="1402" data-image-id="1*a-1_13xE6_ErQ-QSlz6myw.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*a-1_13xE6_ErQ-QSlz6myw.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*a-1_13xE6_ErQ-QSlz6myw.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*a-1_13xE6_ErQ-QSlz6myw.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <figure id="d521" name="d521"><div>
+ <figure name="d521" id="d521">
+ <div>
- <p><img data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></p></div>
- </figure><p id="126b" name="126b">Despite the prevalence of people using the service to gauge the quality
+ <p><img data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png">
+ </p></div>
+ </figure>
+ <p name="126b" id="126b">Despite the prevalence of people using the service to gauge the quality
of what goes up their nose, many users send samples to Energy Control in
the spirit of its original mission: keeping themselves alive and healthy.
The worst case scenario from drugs purchased on the deep web is, well the
- worst case. That was the outcome when <a data-href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" rel="nofollow">Patrick McMullen,</a> a
+ worst case. That was the outcome when <a href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" data-href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" rel="nofollow">Patrick McMullen,</a> a
17-year-old Scottish student, ingested half a gram of MDMA and three tabs
of LSD, reportedly purchased from the Silk Road. While talking to his friends
on Skype, his words became slurred and he passed out. Paramedics could
not revive him. The coroner for that case, Sherrif Payne, who deemed the
cause of death ecstasy toxicity, told <em>The Independent</em> “You
never know the purity of what you are taking and you can easily come unstuck.”</p>
- <p id="5e9e" name="5e9e">ScreamMyName, a deep web user who has been active since the original Silk
+ <p name="5e9e" id="5e9e">ScreamMyName, a deep web user who has been active since the original Silk
Road, wants to alert users to the dangerous chemicals that are often mixed
with drugs, and is using Energy Control as a means to do so.</p>
- <p id="19a6" name="19a6">“We’re at a time where some vendors are outright sending people poison.
+ <p name="19a6" id="19a6">“We’re at a time where some vendors are outright sending people poison.
Some do it unknowingly,” ScreamMyName told me in an encrypted message.
“Cocaine production in South America is often tainted with either levamisole
or phenacetine. Both poison to humans and both with severe side effects.”</p>
- <p id="9fef" name="9fef">In the case of Levamisole, those prescribing it are often not doctors
+ <p name="9fef" id="9fef">In the case of Levamisole, those prescribing it are often not doctors
but veterinarians, as Levamisole is commonly used on animals, primarily
for the treatment of worms. If ingested by humans it can lead to cases
- of extreme eruptions of the skin, as <a data-href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" rel="nofollow">documented in a study</a> from researchers at the University
+ of extreme eruptions of the skin, as <a href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" data-href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" rel="nofollow">documented in a study</a> from researchers at the University
of California, San Francisco. But Lladanosa has found Levamisole in cocaine
samples; dealers use it to increase the product weight, allowing them to
stretch their batch further for greater profit — and also, she says, because
Levamisole has a strong stimulant effect.</p>
- <p id="7886" name="7886">“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s
+ <p name="7886" id="7886">“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s
forums after consuming cocaine that had been cut with 23 percent Levamisole,
and later tested by Energy Control. “I was laid up in bed for several days
because of that shit. The first night I did it, I thought I was going to
die. I nearly drove myself to the ER.”</p>
- <p id="18d3" name="18d3">“More people die because of tainted drugs than the drugs themselves,”
+ <p name="18d3" id="18d3">“More people die because of tainted drugs than the drugs themselves,”
Dr. Feel added. “It’s the cuts and adulterants that are making people sick
and killing them.”</p>
</div>
<div>
- <figure id="552a" name="552a"><div>
+ <figure name="552a" id="552a">
+ <div>
- <p><img data-height="1192" data-image-id="1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg" data-width="2100" data-height="1192" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="839a" name="839a">The particular case of cocaine cut with Levamisole is one of the reasons
+ <p name="839a" id="839a">The particular case of cocaine cut with Levamisole is one of the reasons
that ScreamMyName has been pushing for more drug testing on the deep web
markets. “I recognize that drug use isn’t exactly healthy, but why exacerbate
the problem?” he told me when I contacted him after his post. “[Energy
Control] provides a way for users to test the drugs they’ll use and for
these very users to know what it is they’re putting in their bodies. Such
services are in very short supply.”</p>
- <p id="18dc" name="18dc">After sending a number of Energy Control tests himself, ScreamMyName started
+ <p name="18dc" id="18dc">After sending a number of Energy Control tests himself, ScreamMyName started
a de facto crowd-sourcing campaign to get more drugs sent to the lab, and
then shared the results, after throwing in some cash to get the ball rolling.
- <a data-href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" rel="nofollow">He set up a Bitcoin wallet</a>, with the hope that users might chip in
+ <a href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" data-href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" rel="nofollow">He set up a Bitcoin wallet</a>, with the hope that users might chip in
to fund further tests. At the time of writing, the wallet has received
a total of 1.81 bitcoins; around $430 at today’s exchange rates.</p>
- <p id="dcbd" name="dcbd">In posts to the Evolution community, ScreamMyName pitched this project
+ <p name="dcbd" id="dcbd">In posts to the Evolution community, ScreamMyName pitched this project
as something that will benefit users and keep drug dealer honest. “When
the funds build up to a point where we can purchase an [Energy Control]
test fee, we’ll do a US thread poll for a few days and try to cohesively
decide on what vendor to test,” he continued.</p>
</div>
<div>
- <figure id="9d32" name="9d32"><div>
+ <figure name="9d32" id="9d32">
+ <div>
- <p><img data-height="913" data-image-id="1*NGcrjfkV0l37iQH2uyYjEw.jpeg" data-width="1368" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*NGcrjfkV0l37iQH2uyYjEw.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*NGcrjfkV0l37iQH2uyYjEw.jpeg" data-width="1368" data-height="913" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*NGcrjfkV0l37iQH2uyYjEw.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="bff6" name="bff6">Other members of the community have been helping out, too. PlutoPete,
+ <p name="bff6" id="bff6">Other members of the community have been helping out, too. PlutoPete,
a vendor from the original Silk Road who sold cannabis seeds and other
legal items, has provided ScreamMyName with packaging to safely send the
samples to Barcelona. “A box of baggies, and a load of different moisture
barrier bags,” PlutoPete told me over the phone. “That’s what all the vendors
use.”</p>
- <p id="bb78" name="bb78">It’s a modest program so far. ScreamMyName told me that so far he had
+ <p name="bb78" id="bb78">It’s a modest program so far. ScreamMyName told me that so far he had
gotten enough public funding to purchase five different Energy Control
tests, in addition to the ten or so he’s sent himself so far. “The program
created is still in its infancy and it is growing and changing as we go
along but I have a lot of faith in what we’re doing,” he says.</p>
- <p id="5638" name="5638">But the spirit is contagious: elmo666, the other deep web user testing
+ <p name="5638" id="5638">But the spirit is contagious: elmo666, the other deep web user testing
cocaine, originally kept the results of the drug tests to himself, but
he, too, saw a benefit to distributing the data. “It is clear that it is
a useful service to other users, keeping vendors honest and drugs (and
@@ -321,17 +369,17 @@
on the forums, and then created a thread with summaries of the test results,
as well as comments from the vendors if they provided it. Other users were
soon basing their decisions on what to buy on elmo666‘s tests.</p>
- <p id="de75" name="de75">“I’m defo trying the cola based on the incredibly helpful elmo and his
+ <p name="de75" id="de75">“I’m defo trying the cola based on the incredibly helpful elmo and his
energy control results and recommendations,” wrote user jayk1984. On top
of this, elmo666 plans to launch an independent site on the deep web that
will collate all of these results, which should act as a resource for users
of all the marketplaces.</p>
- <p id="6b72" name="6b72">As word of elmo666's efforts spread, he began getting requests from drug
+ <p name="6b72" id="6b72">As word of elmo666's efforts spread, he began getting requests from drug
dealers who wanted him to use their wares for testing. Clearly, they figured
that a positive result from Energy Control would be a fantastic marketing
tool to draw more customers. They even offered elmo666 free samples. (He
passed.)</p>
- <p id="b008" name="b008">Meanwhile, some in the purchasing community are arguing that those running
+ <p name="b008" id="b008">Meanwhile, some in the purchasing community are arguing that those running
markets on the deep web should be providing quality control themselves.
PlutoPete told me over the phone that he had been in discussions about
this with Dread Pirate Roberts, the pseudonymous owner of the original
@@ -339,7 +387,7 @@
on Silk Road 1, doing lots of anonymous buys to police each category. But
of course they took the thing [Silk Road] down before we got it properly
off the ground,” he lamented.</p>
- <p id="49c8" name="49c8">But perhaps it is best that the users, those who are actually consuming
+ <p name="49c8" id="49c8">But perhaps it is best that the users, those who are actually consuming
the drugs, remain in charge of shaming dealers and warning each other.
“It’s our responsibility to police the market based on reviews and feedback,”
elmo666 wrote in an Evolution forum post. It seems that in the lawless
@@ -347,35 +395,40 @@
sold openly, users have cooperated in an organic display of self-regulation
to stamp out those particular batches of drugs that are more likely to
harm users.</p>
- <p id="386d" name="386d">“That’s always been the case with the deep web,” PlutoPete told me. Indeed,
+ <p name="386d" id="386d">“That’s always been the case with the deep web,” PlutoPete told me. Indeed,
ever since Silk Road, a stable of the drug markets has been the review
system, where buyers can leave a rating and feedback for vendors, letting
others know about the reliability of the seller. But DoctorX’s lab, rigorously
testing the products with scientific instruments, takes it a step further.</p>
</div>
<div>
- <figure id="890b" name="890b"><div>
+ <figure name="890b" id="890b">
+ <div>
- <p><img data-height="1373" data-image-id="1*WRlKt3q3mt7utmwxcbl3sQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg"></img></p></div>
- <figcaption>Photo by Joan Bardeletti</figcaption></figure></div>
+ <p><img data-image-id="1*WRlKt3q3mt7utmwxcbl3sQ.jpeg" data-width="2100" data-height="1373" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg">
+ </p></div>
+ <figcaption>Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
<div>
- <p id="b109" name="b109">“In the white market, they have quality control. In the dark market, it
+ <p name="b109" id="b109">“In the white market, they have quality control. In the dark market, it
should be the same,” Cristina Gil Lladanosa says to me before I leave the
Barcelona lab.</p>
- <p id="e3a4" name="e3a4">A week after I visit the lab, the results of the MDMA arrive in my inbox:
+ <p name="e3a4" id="e3a4">A week after I visit the lab, the results of the MDMA arrive in my inbox:
it is 85 percent pure, with no indications of other active ingredients.
Whoever ordered that sample from the digital shelves of the deep web, and
had it shipped to their doorstep in Canada, got hold of some seriously
good, and relatively safe drugs. And now they know it.</p>
- <figure id="31cf" name="31cf"><div>
+ <figure name="31cf" id="31cf">
+ <div>
- <p><img data-action="zoom" data-action-value="1*320_4I0lxbn5x3bx4XPI5Q.png" data-height="24" data-image-id="1*320_4I0lxbn5x3bx4XPI5Q.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*320_4I0lxbn5x3bx4XPI5Q.png"></img></p></div>
- </figure><p data-align="center" id="9b87" name="9b87"><em>Top photo by Joan Bardeletti</em>
+ <p><img data-image-id="1*320_4I0lxbn5x3bx4XPI5Q.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*320_4I0lxbn5x3bx4XPI5Q.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*320_4I0lxbn5x3bx4XPI5Q.png">
+ </p></div>
+ </figure>
+ <p name="9b87" id="9b87" data-align="center"><em>Top photo by Joan Bardeletti</em>
</p>
- <p data-align="center" id="c30a" name="c30a">Follow Backchannel: <a data-href="https://twitter.com/backchnnl" href="https://twitter.com/backchnnl" rel="nofollow"><em>Twitter</em></a>
- <em>|</em><a data-href="https://www.facebook.com/pages/Backchannel/1488568504730671" href="https://www.facebook.com/pages/Backchannel/1488568504730671" rel="nofollow"><em>Facebook</em></a>
+ <p name="c30a" id="c30a" data-align="center">Follow Backchannel: <a href="https://twitter.com/backchnnl" data-href="https://twitter.com/backchnnl" rel="nofollow"><em>Twitter</em></a>
+ <em>|</em><a href="https://www.facebook.com/pages/Backchannel/1488568504730671" data-href="https://www.facebook.com/pages/Backchannel/1488568504730671" rel="nofollow"><em>Facebook</em></a>
</p>
</div>
- </div>
- </section></div>
- </div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-images.json
new file mode 100644
index 000000000..a748bac39
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-images.json
@@ -0,0 +1,19 @@
+[
+ "http:\/\/www.factorio.com\/static\/img\/factorio-wheel.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-277-finished-2.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-newly-finished.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-277-not-finished-2.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-blueprint-library-grid-view.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-blueprint-library-list-view.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-blueprint-book.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-the-hand.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-enemy-bases.gif",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-cliff-controls.gif",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-rectangles.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-moisture+aux-debug-map.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-moisture+aux-controls.gif",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-island.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-islands.png",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-accumulator.gif",
+ "https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-282-accumulator-comparison.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-metadata.json
new file mode 100644
index 000000000..820a3d07a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Posted by kovarex, TOGos, Ernestas, Albert on 2019-02-15, all posts",
+ "Image": "http:\/\/www.factorio.com\/static\/img\/factorio-wheel.png",
+ "Title": "Friday Facts #282 - 0.17 in sight | Factorio",
+ "SiteName": "Factorio.com"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected.html
new file mode 100644
index 000000000..0f86741bf
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/expected.html
@@ -0,0 +1,524 @@
+<div>
+
+ <p>Posted by kovarex, TOGos, Ernestas, Albert on 2019-02-15, <a href="http://fakehost/blog/">all posts</a></p>
+
+ <h2>The release plan <span size="2">(kovarex)</span>
+ </h2>
+ <p>This week was the time to close and finish all the things that will go to 0.17.0.</p>
+ <p>Not all of the things that we originally planned to be done were done (surprise), but we just left any non-essential stuff for later so we won't postpone the release any further. The plan is, that next week will be dedicated to the office playtesting and bugfixing. Many would argue, that we could just release instantly and let the players find the bugs for us, but we want to fix the most obvious problems in-house to avoid too many duplicate bug reports and chaos after the release. Also, some potential bugs, like save corruptions, are much more easily worked on in-house.</p>
+ <p>
+ If the playtesting goes well, we will let you know next Friday, and if it is the case, we will aim to release the week starting 25th February.
+ </p>
+ <h3>After release plan</h3>
+ <p>
+ Since there are a lot of things we would like to do before we can call 0.17 good enough, we will simply push new things into the 0.17 releases as time goes on. Even if 0.17 becomes stable in a reasonable time, we would still push things on top of it. We can still make experimental/stable version numbers inside 0.17. Most of the things shouldn't be big enough to make the game generally unstable. I've heard countless times a proposal to make small frequent releases of what have we added, this will probably be reality after 0.17 for some time.
+ </p>
+ <p>
+ The smaller releases will contain mainly:
+ </p>
+ <ul>
+ <li>Final looks and behaviour of new GUI screens as they will be finished.</li>
+ <li>New graphics.</li>
+ <li>New sounds and sound system tweaks.</li>
+ <li>Mini tutorial additions and tweaks.</li>
+ </ul>
+
+ <p>
+ This is actually quite a large change to our procedures, and there are many ways we will be trying to maximize the effectiveness of smaller and more regular content updates.
+ </p>
+ <h2>The GUI progress <span size="2">(kovarex)</span>
+ </h2>
+ <p>
+ There are several GUI screens that are finished. Others (most of them) are just left there as they are in 0.16. They are a combination of the new GUI styles and old ones. They sometimes look funny and out of place, but they should be functional.
+ </p>
+
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <td></td>
+ <td>General&nbsp;UX</td>
+ <td>UX&nbsp;draft</td>
+ <td>UX&nbsp;review</td>
+ <td>UI&nbsp;mockup</td>
+ <td>UI&nbsp;review</td>
+ <td>Implementation draft</td>
+ <td>Implementation review</td>
+ <td>Final&nbsp;review</td>
+ </tr>
+ <tr>
+ <td>Load&nbsp;map</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Save&nbsp;map</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Graphics&nbsp;settings</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Control&nbsp;settings</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Sound&nbsp;settings</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Interface&nbsp;settings</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Other&nbsp;settings</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Map&nbsp;generator</td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Quick&nbsp;bar&nbsp;<i><b>Twinsen</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Train&nbsp;GUI&nbsp;<i><b>kovarex</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Technology&nbsp;GUI<i>&nbsp;<b>Oxyd</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Technology&nbsp;tooltip&nbsp;<i><b>Oxyd</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Blueprint&nbsp;library<i>&nbsp;<b>kovarex</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Shortcut&nbsp;bar&nbsp;<i><b>Oxyd</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Character&nbsp;screen&nbsp;<i><b>Dominik</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Help&nbsp;overlay&nbsp;<i><b>kovarex</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Manage/Install&nbsp;mods&nbsp;<i><b>Rseding</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Recipe/item/Entity&nbsp;tooltip&nbsp;<i><b>Twinsen</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Chat&nbsp;icon&nbsp;selector&nbsp;<i><b>?</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>New&nbsp;game&nbsp;<i><b>?</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Menu&nbsp;structure&nbsp;<i><b>?</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Main&nbsp;screen&nbsp;chat&nbsp;<i><b>?</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ <tr>
+ <td>Recipe&nbsp;explorer&nbsp;<i><b>?</b></i></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ <td><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px"></td>
+ </tr>
+ </tbody>
+ </table>
+ <p><i>* Newly finished things since the last update in <a href="https://www.factorio.com/blog/post/fff-277">FFF-277</a>.</i></p><h3>Blueprint library</h3>
+ <p>
+ The blueprint library changes have been split into several steps. The reason is, that there was a big motivation to do the integration with the new quickbar (final version introduced in <a href="https://www.factorio.com/blog/post/fff-278">FFF-278</a>) in time for 0.17.0, while the other changes can be done after. The thing with the quickbar is, that it is quite a big change to one of the most used tools in the game and people generally don't like change even when it is for the better. To minimize the hate of the change, we need to "sell it properly". By that, we should provide as many of the positive aspects of the new quickbar at the time of its introduction.
+ </p>
+ <p>
+ So the change that is already implemented and working for 0.17 is the ability to put blueprints/books into the quick bar in a way that the quick bar is linked directly to the blueprint library window, so you don't need to have the physical blueprint items in your inventory. The other change is, that picking a blueprint from the blueprint library and then pressing Q will just dismiss it, instead of silently pushing it to your inventory. This works the same as the clipboard described in <a href="https://www.factorio.com/blog/post/fff-255">FFF-255</a>. You can still explicitly insert the blueprint from the library to an inventory slot, but if you just pick it, use it, and press Q, it goes away.
+ </p>
+ <p>
+ In addition to this, other changes related to the blueprint library will follow soon after 0.17.0. The first thing is the change of how the GUI looks:
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-library-grid-view.png" width="900px">
+ </p>
+ <p>
+ We will also allow to switch between grid and list view. It mainly provides a way to nicely see the longer names of the blueprint. We noticed that players try to put a large amount of info about a blueprint in its name, so we are planning to add a possibility to write a textual description of the blueprint.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-library-list-view.png" width="900px">
+ </p>
+ <p>
+ The last big change is to allow to put blueprint books into blueprint books, allowing better organisation. Basically like a directory structure. Whenever a blueprint/book is opened, we plan to show its current location, so the player knows exactly what is going on.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-book.png" width="900px">
+ </p>
+ <h3>The hand</h3>
+ <p>
+ Has it ever happened to you, that you have robots trying to put things into your full inventory, while you pick an item from it to build something, and then you just can't put it back, as the diligent robots just filled the last slot in your inventory by whatever they are trying to give to you? Wood from tree removal is the most frequent thing in my case.
+ </p>
+ <p>
+ This was annoying in 0.16 from time to time, but with the new quickbar, it started to happen even more, as now, you have only one inventory, and no reserved slots in the quickbar. To solve that, we just extended the "principal" of the hand. When you pick something from the inventory, the hand icon appears on the slot. As long as you hold the thing in your cursor, the hand stays there, and prevents other things from being inserted there. This way, you should always be able to return the currently selected item into your inventory as long as you didn't get it from external source like a chest.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-the-hand.png" width="900px"><br>
+ <i>The hand is protecting the slot from the robots.</i>
+ </p>
+ <h2>Terrain generation updates <span size="2">(TOGoS)</span>
+ </h2>
+ <p>Everyone has different opinions about what makes a good Factorio world.
+ I've been working on several changes for 0.17, but the overarching theme
+ has been to make the map generator options screen more intuitive
+ and more powerful.</p>
+ <p>
+ This was talked about somewhat in an earlier FFF (<a href="https://www.factorio.com/blog/post/fff-258">FFF-258</a>) regarding ore placement,
+ but since then we found more stuff to fix.
+ </p>
+ <h3>Biter Bases</h3>
+ <p>
+ In 0.16, the size control for biter bases didn't have much effect.
+ The frequency control changed the frequency, but that also decreased the size of bases,
+ which <a href="https://forums.factorio.com/viewtopic.php?t=55113">wasn't generally what people wanted</a>.
+ </p>
+ <p>
+ For 0.17 we've reworked biter placement using a system similar to that with which we got resource placement under control. The size and frequency controls now act more like most people would expect, with frequency increasing the number of bases, and size changing the size of each base.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-enemy-bases.gif">
+ <br><i>New preview UI showing the effects of enemy base controls.
+ In reality the preview takes a couple seconds to regenerate after every change,
+ but the regeneration part is skipped in this animation to clearly show the effects of the controls.</i>
+ </p>
+ <p>
+ If you don't like the relatively uniform-across-the-world placement of biters,
+ there are changes under the hood to make it easier for modders to do something different.
+ Placement is now based on <a href="https://wiki.factorio.com/Prototype/NamedNoiseExpression">NamedNoiseExpressions</a> "enemy-base-frequency" and "enemy-base-radius", which in turn reference "enemy-base-intensity".
+ By overriding any of those, a modder could easily create a map where biters are found only at high elevations,
+ or only near water, or correlate enemy placement with that of resources, or any other thing
+ that can be expressed as a function of location.
+ </p>
+ <h3>Cliffs</h3>
+ <p>
+ We've added a 'continuity' control for cliffs. If you really
+ like mazes of cliffs, set it to high to reduce the number of gaps in cliff faces.
+ Or you can turn it way down to make cliffs very rare or be completely absent.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-cliff-controls.gif">
+ <br><i>Changing cliff frequency and continuity. Since cliffs are based on elevation,
+ you'll have to turn frequency <strong>way</strong> up if you want lots of layers
+ even near the starting lake.</i>
+ </p>
+ <h3>Biome Debugging</h3>
+ <p>
+ Tile placement is based on a range of humidity and 'aux' values
+ (humidity and aux being properties that vary at different points across the world)
+ that are suitable for each type of tile. For example: grass is only placed in
+ places with relatively high humidity, and desert (not to be confused with plain old sand)
+ only gets placed where aux is high. We've taken to calling these constraints 'rectangles',
+ because when you plot each tile's home turf on a chart of humidity and aux,
+ they are shown as rectangles.
+ </p>
+ <p>
+ It's hard to make sense of the rectangles just by looking at the autoplace code
+ for each tile, so I wrote a script to chart them. This allowed us to ensure that
+ they were arranged as we wanted, with no gaps between them,
+ and with overlap in some cases.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-rectangles.png" width="900" height="900">
+ <br><i>Rectangles.</i>
+ </p>
+ <p>
+ Having the humidity-aux-tile chart is all well and good, but doesn't tell the whole story,
+ since tile placement also depends on a noise layer specific to each tile type,
+ and could also influenced by user-adjustable autoplace controls (e.g. turning the grass slider up).
+ So to further help us visualize how humidity, aux, tile-specific noise, and
+ autoplace controls worked together to determine tiles on the map,
+ there are a couple of alternate humidity and aux generators that simply vary them
+ linearly from north-south and west-east, respectively.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-moisture+aux-debug-map.png" width="900" height="900">
+ <br><i>Using 'debug-moisture' and 'debug-aux' generators to drive moisture and aux, respectively.</i>
+ </p>
+ <p>
+ This map helped us realize that, rather than having controls
+ for each different type of tile, it made more sense to just
+ control moisture and aux (which is called 'terrain type' in the GUI,
+ because 'aux' doesn't mean anything).
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-moisture+aux-controls.gif" width="900" height="664">
+ <br><i>Sliding the moisture and aux bias sliders to make the world more or less grassy or red-deserty.</i>
+ </p>
+ <p>
+ A pet project of mine has been to
+ put controls in the map generator GUI so that we could select generators
+ for various tile properties (temperature, aux, humidity, elevation, etc) at
+ map-creation time without necessarily needing to involve mods.
+ This was useful for debugging the biome rectangles, but my ulterior
+ motive was to, at least in cases where there are multiple options,
+ show the generator information to players. A couple of reasons for
+ this:
+ </p>
+ <ul>
+ <li>It was already possible for mods to override tile property generators via presets, but
+ we didn't have a place to show that information in the UI.
+ So switching between presets could change hidden variables in non-obvious ways
+ and lead to a lot of confusion.</li>
+ <li>I had dreams of shipping alternate elevation generators in the base game.</li>
+ </ul>
+ <h3>Water Placement</h3>
+ <p>
+ For 0.16 I <a href="https://www.factorio.com/blog/post/fff-207">attempted to make the shape of continents more interesting</a>. Some people <a href="https://www.reddit.com/r/factorio/comments/7n3mn1/016_swamplands_are_pure_awesome/">really liked</a> the <a href="https://www.youtube.com/watch?v=-pkwTjG-sJg">new terrain</a>, or at least <a href="https://www.reddit.com/r/factorio/comments/7krq86/question_about_water_generation_in_016/">managed to find some settings that made it work</a> for them. Others called it a "swampy mess". A common refrain was that the world was more fun to explore in the 0.12 days.
+ </p>
+ <p>
+ So in 0.17 we're restoring the <em>default</em> elevation generator to one very similar to that used
+ by 0.12. Which means large, sometimes-connected lakes.
+ </p>
+ <p>
+ The water 'frequency' control was confusing to a lot of people including myself.
+ It could be interpreted as "how much water", when the actual effect was to inversely
+ scale both bodies of water and continents, such that higher water frequency actually meant smaller bodies of water.
+ So for 0.17, the water 'frequency' and 'size' sliders are being replaced with 'scale' and 'coverage',
+ which do the same thing, but in a hopefully more obvious way.
+ Larger scale means larger land features, while more coverage means more of the map covered in water.
+ </p>
+ <h3>New Map Types</h3>
+ <p>
+ In order to ensure a decent starting area, the elevation generator
+ always makes a plateau there (so you'll never spawn in the middle of
+ the ocean), and a lake (so you can get a power plant running).
+ Depending on what's going on outside of that plateau, this sometimes resulted in
+ a circular ring of cliffs around the starting point,
+ which looked very artificial, and we wanted to reduce that effect.
+ </p>
+ <p>
+ In the process of solving that problem I created another custom generator for debugging purposes.
+ This one simply generated that starting area plateau in an endless ocean.
+ I don't actually remember how this was useful for debugging, but at one point I directed Twinsen to look at it
+ to illustrate the mechanics behind generating the starting area.
+ </p>
+ <p>
+ The rest of the team liked that setting so much that we're making it a player-selectable option.
+ So in 0.17 you'll get to pick between the 'Normal' map type, which resembles that from 0.12,
+ and 'Island', which gives you a single large-ish island at the starting point.
+ There's a slider to let you change the size of the island(s).
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-island.png" width="900" height="900">
+ </p>
+ <p>
+ Maps with multiple starting points will have multiple islands.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-islands.png" width="900" height="900">
+ <br><i>PvP islands!</i>
+ </p>
+ <p>
+ And speaking of scale sliders, we're expanding their range from ± a factor of 2 (the old 'very low' to 'very high' settings)
+ to ± a factor of 6 (shown as '17%' to '600%'). Previously the values were stored internally as one of 5 discrete options,
+ but as the recent terrain generation changes have made actual numeric multipliers more meaningful in most contexts
+ (e.g. the number of ore patches is directly proportional to the value of the 'frequency' slider,
+ rather than being just vaguely related to it somehow),
+ we're switching to storing them as numbers.
+ This has the side-effect that if you don't mind
+ <a href="https://gist.github.com/Bilka2/a17841d0ff1028b63c60c2bbf6fa7e4f">editing some JSON</a>,
+ you'll be able to create maps with values outside the range provided by the GUI sliders.
+ </p>
+ <p>
+ Mods will be able to add their own 'map types' to the map type drop-down, too. If you really liked the shape of landmasses in 0.16 and want to be able to continue creating new maps with it, please let us know on the forum.
+ </p>
+ <h2>High-res accumulators <span size="2">(Ernestas, Albert)</span>
+ </h2>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-accumulator.gif">
+ </p>
+ <p>
+ The design of the accumulator has been always good. The 4 very visible cylinders, looking like giant batteries, Tesla poles and the electric beams perfectly telegraphed its function in terms of style and readability. That’s why for the high-res conversion we were very careful about keeping this entity as it was.
+ </p>
+ <p>
+ The only thing that was a bit disturbing (for some) are the poles crossing to each other when more than one accumulator is placed in a row. So we decided to fix it (or break it). The rest of the work was making the entity compatible for the actual look of the game. But in essence accumulators are still the same.
+ </p>
+ <p>
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-accumulator-comparison.png" width="900px">
+ </p>
+ <p>
+ As always, let us know what you think on our <a href="https://forums.factorio.com/64912">forum</a>.
+ </p>
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/source.html
new file mode 100644
index 000000000..8e153771c
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/keep-tabular-data/source.html
@@ -0,0 +1,740 @@
+<html>
+
+<head>
+ <title>Friday Facts #282 - 0.17 in sight | Factorio</title>
+ <meta property="og:title" content="Friday Facts #282 - 0.17 in sight | Factorio" />
+ <meta property="og:type" content="website" />
+ <meta property="og:image" content="http://www.factorio.com/static/img/factorio-wheel.png" />
+ <meta property="og:site_name" content="Factorio.com" />
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
+ <link href="/static/img/favicon.ico" rel="shortcut icon" type="image/x-icon" />
+ <link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
+ <link href="/static/css/bootstrap-responsive.min.css" rel="stylesheet" type="text/css" />
+ <link href="/static/css/factorio.css" rel="stylesheet" type="text/css" />
+ <link href="/static/lightbox/css/lightbox.css" rel="stylesheet" type="text/css" />
+ <link href="/blog/rss" rel="alternate" title="Recent Blog Posts" type="application/atom+xml" />
+ <meta name="viewport" content="width=device-width" />
+</head>
+
+<body style="background: rgb(22, 22, 22) url(/static/img/stressed_linen_texture.png) repeat 0 0;">
+ <div class="container header" style="margin-top: 30px;">
+ <!-- top row -->
+ <div class="row" style="margin-bottom: 30px;">
+ <div class="span4">
+ <a href="/"><img src="/static/img/factorio-logo.png" style="margin-top: 10px;" /></a>
+ </div>
+ <div class="span8 span8-navbar" style="margin-top: 10px;">
+ <div class="user-controls">
+ <a href="/login">log in</a>
+ <a href="/signup">sign up</a>
+ </div>
+ <div class="navbar">
+ <ul class="nav">
+ <li>
+ <a href="/"> Home </a>
+ </li>
+ <li>
+ <a href="/store" style="color: #ff7200;"> Merch </a>
+ </li>
+ <li class="custom-dropdown">
+ <a class="custom-dropdown-toggle" data-toggle="dropdown" href="/game-overview" role="button">
+ Game
+ </a>
+ <ul class="custom-dropdown-menu" role="menu">
+ <li role="presentation">
+ <a href="/starter-page">
+ Starter Page
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/screenshots">
+ Screenshots
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/videos">
+ Videos
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/content">
+ Content
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/modding">
+ Modding
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/team">
+ Team
+ </a>
+ </li>
+ </ul>
+ </li>
+ <li class="custom-dropdown">
+ <a class="custom-dropdown-toggle" data-toggle="dropdown" href="/support-overview" role="button">
+ Support
+ </a>
+ <ul class="custom-dropdown-menu" role="menu">
+ <li role="presentation">
+ <a href="/help">
+ Help
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/faq">
+ FAQ
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/press-and-youtube">
+ Press and Youtube
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/community">
+ Community
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/partners">
+ Partners
+ </a>
+ </li>
+ <li role="presentation">
+ <a href="/credits">
+ Credits
+ </a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="https://forums.factorio.com/"> Forums </a>
+ </li>
+ <li>
+ <a href="/contact"> Contact </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="container">
+ <noscript>
+ <div class="alert alert-block alert-error" style="font-weight: bold; ">
+ Javascript is required for proper functioning of these web pages.
+ </div>
+ </noscript>
+ <div class="row">
+ <div class="span12 blog-post">
+ <h2 style="margin-top: 20px; margin-bottom:5px;">
+ Friday Facts #282 - 0.17 in sight
+ </h2>
+ <div style="font-size: 11px;">Posted by kovarex, TOGos, Ernestas, Albert on 2019-02-15, <a href="/blog/">all posts</a></div>
+ <p>
+ </p>
+ <h2>The release plan <font size="2">(kovarex)</font>
+ </h2>
+ <p>This week was the time to close and finish all the things that will go to 0.17.0.</p>
+ <p>Not all of the things that we originally planned to be done were done (surprise), but we just left any non-essential stuff for later so we won't postpone the release any further. The plan is, that next week will be dedicated to the office playtesting and bugfixing. Many would argue, that we could just release instantly and let the players find the bugs for us, but we want to fix the most obvious problems in-house to avoid too many duplicate bug reports and chaos after the release. Also, some potential bugs, like save corruptions, are much more easily worked on in-house.</p>
+ <p>
+ If the playtesting goes well, we will let you know next Friday, and if it is the case, we will aim to release the week starting 25th February.
+ </p>
+ <h3>After release plan</h3>
+ <p>
+ Since there are a lot of things we would like to do before we can call 0.17 good enough, we will simply push new things into the 0.17 releases as time goes on. Even if 0.17 becomes stable in a reasonable time, we would still push things on top of it. We can still make experimental/stable version numbers inside 0.17. Most of the things shouldn't be big enough to make the game generally unstable. I've heard countless times a proposal to make small frequent releases of what have we added, this will probably be reality after 0.17 for some time.
+ </p>
+ <p>
+ The smaller releases will contain mainly:
+ </p>
+ <ul>
+ <li>Final looks and behaviour of new GUI screens as they will be finished.</li>
+ <li>New graphics.</li>
+ <li>New sounds and sound system tweaks.</li>
+ <li>Mini tutorial additions and tweaks.</li>
+ </ul>
+ <p></p>
+ <p>
+ This is actually quite a large change to our procedures, and there are many ways we will be trying to maximize the effectiveness of smaller and more regular content updates.
+ </p>
+ <h2>The GUI progress <font size="2">(kovarex)</font>
+ </h2>
+ <p>
+ There are several GUI screens that are finished. Others (most of them) are just left there as they are in 0.16. They are a combination of the new GUI styles and old ones. They sometimes look funny and out of place, but they should be functional.
+ </p>
+ <style>
+ .header_cell {
+ text-align:center;
+ font-weight: bold;
+ }
+ .finished {
+ text-align:center;
+ font-weight: bold;
+ }
+ .not_finished {
+ text-align:center;
+ font-weight: bold;
+ }
+ .finished_gui_table {
+ border-spacing: 10px;
+ border-collapse: collapse;
+ max-width: 900px;
+ }
+ .finished_gui_table td {
+ border: 1px;
+ border-style:solid;
+ padding: 5px;
+ }
+ </style>
+ <table class="finished_gui_table">
+ <tbody>
+ <tr>
+ <td></td>
+ <td class="header_cell">General&nbsp;UX</td>
+ <td class="header_cell">UX&nbsp;draft</td>
+ <td class="header_cell">UX&nbsp;review</td>
+ <td class="header_cell">UI&nbsp;mockup</td>
+ <td class="header_cell">UI&nbsp;review</td>
+ <td class="header_cell">Implementation draft</td>
+ <td class="header_cell">Implementation review</td>
+ <td class="header_cell">Final&nbsp;review</td>
+ </tr>
+ <tr>
+ <td>Load&nbsp;map</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Save&nbsp;map</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Graphics&nbsp;settings</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Control&nbsp;settings</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Sound&nbsp;settings</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Interface&nbsp;settings</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Other&nbsp;settings</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Map&nbsp;generator</td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Quick&nbsp;bar&nbsp;<i><b>Twinsen</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Train&nbsp;GUI&nbsp;<i><b>kovarex</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Technology&nbsp;GUI<i>&nbsp;<b>Oxyd</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Technology&nbsp;tooltip&nbsp;<i><b>Oxyd</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Blueprint&nbsp;library<i>&nbsp;<b>kovarex</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Shortcut&nbsp;bar&nbsp;<i><b>Oxyd</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Character&nbsp;screen&nbsp;<i><b>Dominik</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Help&nbsp;overlay&nbsp;<i><b>kovarex</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Manage/Install&nbsp;mods&nbsp;<i><b>Rseding</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Recipe/item/Entity&nbsp;tooltip&nbsp;<i><b>Twinsen</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Chat&nbsp;icon&nbsp;selector&nbsp;<i><b>?</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>New&nbsp;game&nbsp;<i><b>?</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Menu&nbsp;structure&nbsp;<i><b>?</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Main&nbsp;screen&nbsp;chat&nbsp;<i><b>?</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-282-newly-finished.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ <tr>
+ <td>Recipe&nbsp;explorer&nbsp;<i><b>?</b></i></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ <td class="not_finished"><img src="https://cdn.factorio.com/assets/img/blog/fff-277-not-finished-2.png" width="20px" /></td>
+ </tr>
+ </tbody>
+ </table>
+ <i>* Newly finished things since the last update in <a href="https://www.factorio.com/blog/post/fff-277">FFF-277</a>.</i>
+ <h3>Blueprint library</h3>
+ <p>
+ The blueprint library changes have been split into several steps. The reason is, that there was a big motivation to do the integration with the new quickbar (final version introduced in <a href="https://www.factorio.com/blog/post/fff-278">FFF-278</a>) in time for 0.17.0, while the other changes can be done after. The thing with the quickbar is, that it is quite a big change to one of the most used tools in the game and people generally don't like change even when it is for the better. To minimize the hate of the change, we need to "sell it properly". By that, we should provide as many of the positive aspects of the new quickbar at the time of its introduction.
+ </p>
+ <p>
+ So the change that is already implemented and working for 0.17 is the ability to put blueprints/books into the quick bar in a way that the quick bar is linked directly to the blueprint library window, so you don't need to have the physical blueprint items in your inventory. The other change is, that picking a blueprint from the blueprint library and then pressing Q will just dismiss it, instead of silently pushing it to your inventory. This works the same as the clipboard described in <a href="https://www.factorio.com/blog/post/fff-255">FFF-255</a>. You can still explicitly insert the blueprint from the library to an inventory slot, but if you just pick it, use it, and press Q, it goes away.
+ </p>
+ <p>
+ In addition to this, other changes related to the blueprint library will follow soon after 0.17.0. The first thing is the change of how the GUI looks:
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img style="vertical-align: top;" src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-library-grid-view.png" width="900px" />
+ </p>
+ <p>
+ We will also allow to switch between grid and list view. It mainly provides a way to nicely see the longer names of the blueprint. We noticed that players try to put a large amount of info about a blueprint in its name, so we are planning to add a possibility to write a textual description of the blueprint.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img style="vertical-align: top;" src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-library-list-view.png" width="900px" />
+ </p>
+ <p>
+ The last big change is to allow to put blueprint books into blueprint books, allowing better organisation. Basically like a directory structure. Whenever a blueprint/book is opened, we plan to show its current location, so the player knows exactly what is going on.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img style="vertical-align: top;" src="https://cdn.factorio.com/assets/img/blog/fff-282-blueprint-book.png" width="900px" />
+ </p>
+ <h3>The hand</h3>
+ <p>
+ Has it ever happened to you, that you have robots trying to put things into your full inventory, while you pick an item from it to build something, and then you just can't put it back, as the diligent robots just filled the last slot in your inventory by whatever they are trying to give to you? Wood from tree removal is the most frequent thing in my case.
+ </p>
+ <p>
+ This was annoying in 0.16 from time to time, but with the new quickbar, it started to happen even more, as now, you have only one inventory, and no reserved slots in the quickbar. To solve that, we just extended the "principal" of the hand. When you pick something from the inventory, the hand icon appears on the slot. As long as you hold the thing in your cursor, the hand stays there, and prevents other things from being inserted there. This way, you should always be able to return the currently selected item into your inventory as long as you didn't get it from external source like a chest.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img style="vertical-align: top;" src="https://cdn.factorio.com/assets/img/blog/fff-282-the-hand.png" width="900px" /><br />
+ <i>The hand is protecting the slot from the robots.</i>
+ </p>
+ <h2>Terrain generation updates <font size="2">(TOGoS)</font>
+ </h2>
+ <p>Everyone has different opinions about what makes a good Factorio world.
+ I've been working on several changes for 0.17, but the overarching theme
+ has been to make the map generator options screen more intuitive
+ and more powerful.</p>
+ <p>
+ This was talked about somewhat in an earlier FFF (<a href="https://www.factorio.com/blog/post/fff-258">FFF-258</a>) regarding ore placement,
+ but since then we found more stuff to fix.
+ </p>
+ <h3>Biter Bases</h3>
+ <p>
+ In 0.16, the size control for biter bases didn't have much effect.
+ The frequency control changed the frequency, but that also decreased the size of bases,
+ which <a href="https://forums.factorio.com/viewtopic.php?t=55113">wasn't generally what people wanted</a>.
+ </p>
+ <p>
+ For 0.17 we've reworked biter placement using a system similar to that with which we got resource placement under control. The size and frequency controls now act more like most people would expect, with frequency increasing the number of bases, and size changing the size of each base.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-enemy-bases.gif" />
+ <br /><i>New preview UI showing the effects of enemy base controls.
+ In reality the preview takes a couple seconds to regenerate after every change,
+ but the regeneration part is skipped in this animation to clearly show the effects of the controls.</i>
+ </p>
+ <p>
+ If you don't like the relatively uniform-across-the-world placement of biters,
+ there are changes under the hood to make it easier for modders to do something different.
+ Placement is now based on <a href="https://wiki.factorio.com/Prototype/NamedNoiseExpression">NamedNoiseExpressions</a> "enemy-base-frequency" and "enemy-base-radius", which in turn reference "enemy-base-intensity".
+ By overriding any of those, a modder could easily create a map where biters are found only at high elevations,
+ or only near water, or correlate enemy placement with that of resources, or any other thing
+ that can be expressed as a function of location.
+ </p>
+ <h3>Cliffs</h3>
+ <p>
+ We've added a 'continuity' control for cliffs. If you really
+ like mazes of cliffs, set it to high to reduce the number of gaps in cliff faces.
+ Or you can turn it way down to make cliffs very rare or be completely absent.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-cliff-controls.gif" />
+ <br /><i>Changing cliff frequency and continuity. Since cliffs are based on elevation,
+ you'll have to turn frequency <strong>way</strong> up if you want lots of layers
+ even near the starting lake.</i>
+ </p>
+ <h3>Biome Debugging</h3>
+ <p>
+ Tile placement is based on a range of humidity and 'aux' values
+ (humidity and aux being properties that vary at different points across the world)
+ that are suitable for each type of tile. For example: grass is only placed in
+ places with relatively high humidity, and desert (not to be confused with plain old sand)
+ only gets placed where aux is high. We've taken to calling these constraints 'rectangles',
+ because when you plot each tile's home turf on a chart of humidity and aux,
+ they are shown as rectangles.
+ </p>
+ <p>
+ It's hard to make sense of the rectangles just by looking at the autoplace code
+ for each tile, so I wrote a script to chart them. This allowed us to ensure that
+ they were arranged as we wanted, with no gaps between them,
+ and with overlap in some cases.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-rectangles.png" width="900" height="900" />
+ <br /><i>Rectangles.</i>
+ </p>
+ <p>
+ Having the humidity-aux-tile chart is all well and good, but doesn't tell the whole story,
+ since tile placement also depends on a noise layer specific to each tile type,
+ and could also influenced by user-adjustable autoplace controls (e.g. turning the grass slider up).
+ So to further help us visualize how humidity, aux, tile-specific noise, and
+ autoplace controls worked together to determine tiles on the map,
+ there are a couple of alternate humidity and aux generators that simply vary them
+ linearly from north-south and west-east, respectively.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-moisture+aux-debug-map.png" width="900" height="900" />
+ <br /><i>Using 'debug-moisture' and 'debug-aux' generators to drive moisture and aux, respectively.</i>
+ </p>
+ <p>
+ This map helped us realize that, rather than having controls
+ for each different type of tile, it made more sense to just
+ control moisture and aux (which is called 'terrain type' in the GUI,
+ because 'aux' doesn't mean anything).
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-moisture+aux-controls.gif" width="900" height="664" />
+ <br /><i>Sliding the moisture and aux bias sliders to make the world more or less grassy or red-deserty.</i>
+ </p>
+ <p>
+ A pet project of mine has been to
+ put controls in the map generator GUI so that we could select generators
+ for various tile properties (temperature, aux, humidity, elevation, etc) at
+ map-creation time without necessarily needing to involve mods.
+ This was useful for debugging the biome rectangles, but my ulterior
+ motive was to, at least in cases where there are multiple options,
+ show the generator information to players. A couple of reasons for
+ this:
+ </p>
+ <ul>
+ <li>It was already possible for mods to override tile property generators via presets, but
+ we didn't have a place to show that information in the UI.
+ So switching between presets could change hidden variables in non-obvious ways
+ and lead to a lot of confusion.</li>
+ <li>I had dreams of shipping alternate elevation generators in the base game.</li>
+ </ul>
+ <h3>Water Placement</h3>
+ <p>
+ For 0.16 I <a href="https://www.factorio.com/blog/post/fff-207">attempted to make the shape of continents more interesting</a>. Some people <a href="https://www.reddit.com/r/factorio/comments/7n3mn1/016_swamplands_are_pure_awesome/">really liked</a> the <a href="https://www.youtube.com/watch?v=-pkwTjG-sJg">new terrain</a>, or at least <a href="https://www.reddit.com/r/factorio/comments/7krq86/question_about_water_generation_in_016/">managed to find some settings that made it work</a> for them. Others called it a "swampy mess". A common refrain was that the world was more fun to explore in the 0.12 days.
+ </p>
+ <p>
+ So in 0.17 we're restoring the <em>default</em> elevation generator to one very similar to that used
+ by 0.12. Which means large, sometimes-connected lakes.
+ </p>
+ <p>
+ The water 'frequency' control was confusing to a lot of people including myself.
+ It could be interpreted as "how much water", when the actual effect was to inversely
+ scale both bodies of water and continents, such that higher water frequency actually meant smaller bodies of water.
+ So for 0.17, the water 'frequency' and 'size' sliders are being replaced with 'scale' and 'coverage',
+ which do the same thing, but in a hopefully more obvious way.
+ Larger scale means larger land features, while more coverage means more of the map covered in water.
+ </p>
+ <h3>New Map Types</h3>
+ <p>
+ In order to ensure a decent starting area, the elevation generator
+ always makes a plateau there (so you'll never spawn in the middle of
+ the ocean), and a lake (so you can get a power plant running).
+ Depending on what's going on outside of that plateau, this sometimes resulted in
+ a circular ring of cliffs around the starting point,
+ which looked very artificial, and we wanted to reduce that effect.
+ </p>
+ <p>
+ In the process of solving that problem I created another custom generator for debugging purposes.
+ This one simply generated that starting area plateau in an endless ocean.
+ I don't actually remember how this was useful for debugging, but at one point I directed Twinsen to look at it
+ to illustrate the mechanics behind generating the starting area.
+ </p>
+ <p>
+ The rest of the team liked that setting so much that we're making it a player-selectable option.
+ So in 0.17 you'll get to pick between the 'Normal' map type, which resembles that from 0.12,
+ and 'Island', which gives you a single large-ish island at the starting point.
+ There's a slider to let you change the size of the island(s).
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-island.png" width="900" height="900" />
+ </p>
+ <p>
+ Maps with multiple starting points will have multiple islands.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-islands.png" width="900" height="900" />
+ <br /><i>PvP islands!</i>
+ </p>
+ <p>
+ And speaking of scale sliders, we're expanding their range from ± a factor of 2 (the old 'very low' to 'very high' settings)
+ to ± a factor of 6 (shown as '17%' to '600%'). Previously the values were stored internally as one of 5 discrete options,
+ but as the recent terrain generation changes have made actual numeric multipliers more meaningful in most contexts
+ (e.g. the number of ore patches is directly proportional to the value of the 'frequency' slider,
+ rather than being just vaguely related to it somehow),
+ we're switching to storing them as numbers.
+ This has the side-effect that if you don't mind
+ <a href="https://gist.github.com/Bilka2/a17841d0ff1028b63c60c2bbf6fa7e4f">editing some JSON</a>,
+ you'll be able to create maps with values outside the range provided by the GUI sliders.
+ </p>
+ <p>
+ Mods will be able to add their own 'map types' to the map type drop-down, too. If you really liked the shape of landmasses in 0.16 and want to be able to continue creating new maps with it, please let us know on the forum.
+ </p>
+ <h2>High-res accumulators <font size="2">(Ernestas, Albert)</font>
+ </h2>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-accumulator.gif" />
+ </p>
+ <p>
+ The design of the accumulator has been always good. The 4 very visible cylinders, looking like giant batteries, Tesla poles and the electric beams perfectly telegraphed its function in terms of style and readability. That’s why for the high-res conversion we were very careful about keeping this entity as it was.
+ </p>
+ <p>
+ The only thing that was a bit disturbing (for some) are the poles crossing to each other when more than one accumulator is placed in a row. So we decided to fix it (or break it). The rest of the work was making the entity compatible for the actual look of the game. But in essence accumulators are still the same.
+ </p>
+ <p style="text-align: center; margin:auto; margin-top:20px; margin-bottom:20px;">
+ <img src="https://cdn.factorio.com/assets/img/blog/fff-282-accumulator-comparison.png" width="900px" />
+ </p>
+ <p>
+ As always, let us know what you think on our <a href="https://forums.factorio.com/64912">forum</a>.
+ </p>
+ <p></p>
+ <div class="footer">
+ <div class="footer-copyright">
+ Copyright © 2015 - 2019 Wube Software - all rights reserved.
+ </div>
+ <div class="footer-menu">
+ <a href="/terms-of-service" style="font-size: 11px;"> Terms of Service </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/privacy-policy" style="font-size: 11px;"> Privacy </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/imprint" style="font-size: 11px;"> Imprint </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/presskit" style="font-size: 11px;"> Presskit </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/faq" style="font-size: 11px;"> FAQ </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/blog/rss" style="font-size: 11px;"> RSS </a>
+ <span style="font-size: 11px;"> | </span>
+ <a href="/jobs" style="font-size: 11px;">
+ Jobs
+ </a>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript" async="" src="https://ssl.google-analytics.com/ga.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
+ <script src="/static/js/raphael-min.js" type="text/javascript"></script>
+ <script src="/static/js/factorio.min.js" type="text/javascript"></script>
+ <script src="/static/lightbox/js/lightbox.min.js" type="text/javascript"></script>
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-115167276-1']);
+ _gaq.push(['_trackPageview']);
+ (function() {
+ var ga = document.createElement('script');
+ ga.type = 'text/javascript';
+ ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+ </div>
+ </div>
+ <div id="lightboxOverlay" class="lightboxOverlay" style="display: none;"></div>
+ <div id="lightbox" class="lightbox" style="display: none;">
+ <div class="lb-outerContainer">
+ <div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" />
+ <div class="lb-nav"><a class="lb-prev" href=""></a><a class="lb-next" href=""></a></div>
+ <div class="lb-loader"><a class="lb-cancel"></a></div>
+ </div>
+ </div>
+ <div class="lb-dataContainer">
+ <div class="lb-data">
+ <div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div>
+ <div class="lb-closeContainer"><a class="lb-close"></a></div>
+ </div>
+ </div>
+ </div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html
index 5640699c1..2084cd8cc 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/la-nacion/expected.html
@@ -1,9 +1,12 @@
-<article data-asociarposwall="false" data-login="false" data-loginposwall="false" id="nota" itemscope="" itemtype="http://schema.org/NewsArticle"><div>
+<article id="nota" itemscope itemtype="http://schema.org/NewsArticle" data-login="false" data-loginposwall="false" data-asociarposwall="false">
+ <div>
<p itemprop="description">Los pueblos indígenas reclaman por derechos que permanecen
incumplidos, por eso es más eficiente canalizar la protesta que reprimirla</p>
</div>
<section id="cuerpo" itemprop="articleBody">
+
+
<p>Abdullah Ocalan, el líder independentista kurdo, desembarcó en Italia en noviembre de
1998 y pidió asilo político. Arrastraba un pedido de captura de Turquía, donde era acusado por
terrorismo. El ex comunista Massimo D'Alema, recién asumido, dudaba. Acoger a Ocalan implicaba comprarse
@@ -21,8 +24,12 @@
supuestos contactos internacionales de organizaciones mapuches. Entre ellos aparecía Ocalan, a quien el
informe ubicó "con domicilios en Palermo y en el centro porteño", y aseguraba incluso que había sido
visto "en Neuquén, Río Negro y Chubut durante el juicio a Jones Huala".</p>
- <figure><p><span title="Ampliar imagen"></span><img src="http://bucket2.glanacion.com/anexos/fotos/77/conflicto-mapuche-2585177w280.jpg"></img></p>
- <figcaption id="epigrafe2585177">Foto: LA NACION</figcaption></figure><p>Esta falsa noticia fue la más rocambolesca de una larga cadena. Dos hechos quedaron en evidencia:
+ <figure>
+ <p><span title="Ampliar imagen"></span><img src="http://bucket2.glanacion.com/anexos/fotos/77/conflicto-mapuche-2585177w280.jpg"></p>
+ <figcaption id="epigrafe2585177">Foto: LA NACION</figcaption>
+ </figure>
+
+ <p>Esta falsa noticia fue la más rocambolesca de una larga cadena. Dos hechos quedaron en evidencia:
primero, que hay periodistas que no chequean la información; segundo, que los servicios de inteligencia
los utilizan para manipular la agenda pública. Y sobre los servicios hay dos posibilidades: o son burros
o son perversos. Las opciones no son excluyentes, aunque cualquiera alcanza para tornarlos indignos de
@@ -37,6 +44,7 @@
Estado", vincular a un grupo que reclama tierras en la región de sus ancestros con otro que busca
gobernar el mundo según sus normas religiosas y ha masacrado a miles de personas requiere de una
operación intelectual tan audaz como inadecuada.</p>
+
<p>La asociación con el movimiento kurdo, en cambio, asoma menos inverosímil. Desde su arresto, Ocalan
transformó su pensamiento: de una visión nacionalista con inspiración estalinista evolucionó al
confederalismo democrático, una propuesta de organización comunal, ecologista, más apegada a las raíces
@@ -54,6 +62,7 @@
matar directamente, es realizar sabotajes, movilizaciones, ataques a iglesias y empresas y mucha
prensa". ¡En Medio Oriente pagarían por un terrorismo así! Ningún hecho de violencia debe ser
minimizado, pero las analogías no resisten prueba.</p>
+
<p>La "cuestión mapuche" es social antes que policial. La Constitución manda "reconocer la preexistencia
étnica y cultural de los pueblos indígenas argentinos. Garantizar el respeto a su identidad?; reconocer
la personería jurídica de sus comunidades, y la posesión y propiedad comunitarias de las tierras que
@@ -82,4 +91,6 @@
del Estado argentino no fue tanto quiénes lo desafiaron como quiénes lo gobernaron. Cambiemos.</p>
<p><b><i>Andrés Malamud es politólogo e investigador en la Universidad de Lisboa. Martín Schapiro es abogado
administrativista y analista internacional</i></b></p>
- </section></article> \ No newline at end of file
+
+ </section>
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-images.json
new file mode 100644
index 000000000..f8a39c4bd
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-images.json
@@ -0,0 +1,12 @@
+[
+ "https:\/\/miro.medium.com\/max\/1200\/1*EO-pr4RolgcAOj_Uk1rpDA.png",
+ "https:\/\/miro.medium.com\/fit\/c\/96\/96\/1*vFTVh_mYyf0p6m7f77A3vw.jpeg",
+ "https:\/\/miro.medium.com\/max\/3788\/1*5o3M5niyi911waUrKWVZ0Q.png",
+ "https:\/\/miro.medium.com\/max\/1994\/1*8uOdeOfnUzTaFIY1r7oAMg.png",
+ "https:\/\/miro.medium.com\/max\/1698\/1*e7gjTlzi55udTXbbPeEs2A.png",
+ "https:\/\/miro.medium.com\/max\/1508\/1*JJkRh7JihTUo2apW_9ZXAQ.png",
+ "https:\/\/miro.medium.com\/max\/5760\/1*6wi5BlNNnykjZs0PufrvLQ.png",
+ "https:\/\/miro.medium.com\/max\/1694\/1*cS9IXYGfMmgxaAUlC7oqOQ.png",
+ "https:\/\/miro.medium.com\/max\/1860\/1*87KlGgfbuWP38nAaQaj3xw.png",
+ "https:\/\/miro.medium.com\/max\/1690\/1*kfOK60PtmWx6iP681-qRcg.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-metadata.json
new file mode 100644
index 000000000..69d3d3b44
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Vincent Vallet",
+ "Direction": null,
+ "Excerpt": "How to run a CPU profiling with Node.js on your production in real-time and without interruption of service.",
+ "Image": "https:\/\/miro.medium.com\/max\/1200\/1*EO-pr4RolgcAOj_Uk1rpDA.png",
+ "Title": "Node.js and CPU profiling on production (in real-time without downtime)",
+ "SiteName": "Voodoo Engineering"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected.html
new file mode 100644
index 000000000..1c98070e8
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/expected.html
@@ -0,0 +1,343 @@
+<div>
+ <div>
+ <p><a rel="noopener" href="http://fakehost/@vincentvallet?source=post_page-----d6e62af173e2----------------------"><img alt="Vincent Vallet" src="https://miro.medium.com/fit/c/96/96/1*vFTVh_mYyf0p6m7f77A3vw.jpeg" width="48" height="48"></a>
+ </p>
+
+ </div>
+ <h2 id="0231">
+ Why CPU monitoring is important?
+ </h2>
+ <p id="d2c1">
+ I work at <a href="http://voodoo.io/" target="_blank" rel="noopener nofollow">Voodoo</a>, a French company that creates mobile video games. We have a lot of challenges with performance, availability, and scalability because of the insane amount of traffic our infrastructure supports (billions of events/requests per day …… no joke!). In this setting, every metric is important and gives us a lot of information about the state of our system.
+ </p>
+ <p id="0e89">
+ When working with Node.js one of the most critical resources to monitor is the CPU. Most of the time, when working on a low traffic API or project we don’t realize how many simple lines of code can have a huge impact on CPU. On the other hand, when traffic increases, a simple mistake can cost dearly.
+ </p>
+ <h2 id="292e">
+ Resources
+ </h2>
+ <p id="1efa">
+ What kind of resources does your application need? In most cases, we focus on memory and CPU. Good monitoring of these two elements is mandatory for an application running on production.
+ </p>
+ <p id="dce9">
+ For memory, constant monitoring is the best practice to track the worst developer nightmare a.k.a memory leak.
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/3788/1*5o3M5niyi911waUrKWVZ0Q.png" width="1894" height="970" role="presentation" data-old-src="https://miro.medium.com/max/60/1*5o3M5niyi911waUrKWVZ0Q.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ Memory leak in action
+ </figcaption>
+ </figure>
+ <p id="69dd">
+ A good way to debug memory leak is a memory dump and/or memory sampling but this is not the subject.
+ </p>
+ <p id="1fbc">
+ (for more details about V8 and its garbage collector you can read my previous article <a target="_blank" rel="noopener" href="http://fakehost/voodoo-engineering/nodejs-internals-v8-garbage-collector-a6eca82540ec">here</a>)
+ </p>
+ <blockquote>
+ <p>
+ Stay focused on the CPU!
+ </p>
+ </blockquote>
+ <p id="40e6">
+ Most of the time we monitor this resource with a simple solution allowing us to get a graph representing CPU consumption over time. If we want to be reactive we add an alarm, based on a threshold, to warn us when CPU usage is too high.
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1994/1*8uOdeOfnUzTaFIY1r7oAMg.png" width="997" height="230" role="presentation" data-old-src="https://miro.medium.com/max/60/1*8uOdeOfnUzTaFIY1r7oAMg.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ Basic CPU monitoring
+ </figcaption>
+ </figure>
+ <p id="0728">
+ And what next? We don’t have data about the state of the instance when the CPU usage has increased. So we can’t determine why we had this peak, at least not without an important time of debugging, comparing log, etc. This is exactly why you need to use CPU profiling.
+ </p>
+ <h2 id="8d00">
+ CPU profiling: what’s the difference with CPU monitoring?
+ </h2>
+ <blockquote>
+ <p>
+ “Most commonly, profiling information serves to aid program optimization. Profiling is achieved by instrumenting either the program source code or its binary executable form using a tool called a profiler”
+ </p>
+ </blockquote>
+ <p id="3e11">
+ Basically, for Node.js, CPU profiling is nothing more than collecting data about functions which are CPU consuming. And ideally, get a graphic representation of the collected data a.k.a “flame graph” or “flame chart”.
+ </p>
+ <p id="91c5">
+ It will help you to track the exact file, line, and function which takes the most time to execute.
+ </p>
+ <h2 id="088b">
+ What about existing solutions?
+ </h2>
+ <h2 id="dd40">
+ Add arguments to Node.js
+ </h2>
+ <p id="0306">
+ Node.js provides a way to collect data about CPU with two command lines.
+ </p>
+ <p id="66c8">
+ The first command just executes your application, the argument just tells to V8 engine to collect data. When you stop your script all information is stored in a file.
+ </p>
+ <pre><span id="16bd">node --prof app.js</span></pre>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1698/1*e7gjTlzi55udTXbbPeEs2A.png" width="849" height="534" role="presentation" data-old-src="https://miro.medium.com/max/60/1*e7gjTlzi55udTXbbPeEs2A.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ Output of — prof
+ </figcaption>
+ </figure>
+ <p id="57a6">
+ It is not very clear, is it?
+ </p>
+ <p id="abed">
+ That’s why you just need to run this second command to transform your raw file into a more human-readable output.
+ </p>
+ <pre><span id="061c">node --prof-process isolate-0xnnnnn-v8.log &gt; processed.txt</span></pre>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1508/1*JJkRh7JihTUo2apW_9ZXAQ.png" width="754" height="306" role="presentation" data-old-src="https://miro.medium.com/max/60/1*JJkRh7JihTUo2apW_9ZXAQ.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ The output of — prof-process
+ </figcaption>
+ </figure>
+ <p id="85fa">
+ It seems better, here you can determine which function consumes the most of CPU (percentage of the time).
+ </p>
+ <h2 id="9e54">
+ ClinicJs
+ </h2>
+ <p id="176a">
+ ClinicJs is a set of tools that allow you to collect data and display performance charts. With “clinic flame” you can generate a flame graph based on CPU consumption.
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/5760/1*6wi5BlNNnykjZs0PufrvLQ.png" width="2880" height="1534" role="presentation" data-old-src="https://miro.medium.com/max/60/1*6wi5BlNNnykjZs0PufrvLQ.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ Flame chart
+ </figcaption>
+ </figure>
+ <p id="5347">
+ But once again, you have to stop your app, launch the tool, then terminate the script in order to display the graph (files are generated on the disk).
+ </p>
+ <p id="d6e6">
+ For more details, you can see the <a href="https://clinicjs.org/" target="_blank" rel="noopener nofollow">project</a>.
+ </p>
+ <p id="be18">
+ <strong>To sum up</strong>, here is the list of drawbacks of the two previous solutions.
+ </p>
+ <ul class>
+ <li id="3bef">Downtime (you should kill your application to collect the data)
+ </li>
+ <li id="c0df">Performance overhead
+ </li>
+ <li id="27ec">Data collected locally
+ </li>
+ <li id="a4fd">Need external tools (ClinicJs)
+ </li>
+ </ul>
+ <p id="3f2c">
+ In conclusion: these are good solutions to debug on development environments and/or on a local machine.
+ </p>
+ <blockquote>
+ <p id="fcd9">
+ Unfortunately, CPU issues have a worrying tendency to occur on production, and when you are not in front of your screen.
+ </p>
+ </blockquote>
+ <h2 id="13ef">
+ Inspector
+ </h2>
+ <p id="294e">
+ “Inspector” refers to an API thanks to which you can debug your application. By debugging we mean to be able to connect directly to the core of Node.js to collect real-time data about the process.
+ </p>
+ <p id="ea23">
+ A module, available since version 8.x of Node.js, provides this kind of feature. There are two advantages to use it:
+ </p>
+ <ul class>
+ <li id="ed54">it’s native (no additional installation required)
+ </li>
+ <li id="7992">it can be used programmatically (no interruption)
+ </li>
+ </ul>
+ <p id="731f">
+ And here is how to make a CPU profiling with this module:
+ </p>
+ <figure>
+
+ </figure>
+ <p id="79d1">
+ As you can see, all the data is returned in variable “profile”. Basically, it’s a simple JSON object representing all the call stack and the CPU consumption for each function. And if you want to use an Async/await syntax you can install the module “inspector-api”.
+ </p>
+ <pre><span id="c085">npm install inspector-api --save</span></pre>
+ <p id="195d">
+ It also comes with a built-in exporter to send data to S3, with this method <strong>you don’t write anything on the disk</strong>!
+ </p>
+ <figure>
+
+ </figure>
+ <p id="964f">
+ If you use another storage system you can just collect the data and export it by yourself.
+ </p>
+ <figure>
+
+ </figure>
+ <h2 id="848b">
+ And now, CPU profiling on-demand!
+ </h2>
+ <p id="6933">
+ We have an API that we want to test with autocannon tool. At this step, our project is able to serve around 200 requests in 20 seconds. There is probably a mistake somewhere in the code which slows down our application.
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1694/1*cS9IXYGfMmgxaAUlC7oqOQ.png" width="847" height="362" role="presentation" data-old-src="https://miro.medium.com/max/60/1*cS9IXYGfMmgxaAUlC7oqOQ.png?q=20">
+ </p>
+ </div>
+ </figure>
+ <p id="fb78">
+ But now, what if we want to trigger a CPU profiling remotely (without ssh connection to the server)? It’s possible using Websocket, SSE or any other technology to send a message to your instance.
+ </p>
+ <p id="2c91">
+ Here is a simple example of a server using the “ws” module to send a message to a unique instance.
+ </p>
+ <figure>
+
+ </figure>
+ <p id="2206">
+ Of course, it only works with one instance, but it’s a fake project to demonstrate the principle ;)
+ </p>
+ <p id="e92d">
+ Now we can request our server to ask it to send a message to our instance and start/stop a CPU profiling. In your instance, you can handle the CPU profiling like this:
+ </p>
+ <figure>
+
+ </figure>
+ <p id="c3d0">
+ <strong>To sum up</strong>: we are able to trigger a CPU profiling, on-demand, in real-time, without interruption or connection to the server. Data can be collected on the disk (and extracted later) or can be sent to S3 (or any other system, PR are welcomed on the <a href="https://github.com/wallet77/v8-inspector-api" target="_blank" rel="noopener nofollow">inspector-api project</a>).
+ </p>
+ <blockquote>
+ <p id="6e87">
+ And because the profiler is a part of V8 itself, the format of the generated JSON file is compatible with the Chrome dev tools.
+ </p>
+ </blockquote>
+ </div><div>
+ <p id="2cda">
+ <strong>How can we identify an issue?</strong>
+ </p>
+ <p id="e0d2">
+ A CPU profiling should be read like this:
+ </p>
+ <ul class>
+ <li id="27e6">the x-axis shows the stack profile population
+ </li>
+ <li id="194a">the y-axis shows stack depth
+ </li>
+ </ul>
+ <p id="e950">
+ <strong>What does it mean?</strong>
+ </p>
+ <p id="174c">
+ The larger is a box (a function call) the more it consumed CPU. So a good CPU profiling should look like a “flame” graph where each stack is the finest possible.
+ </p>
+ <p id="48d9">
+ In our example, every request try to generate a token. For this purpose, it calls the function pbkdf2 which is CPU consuming. Our CPU profile looks like a sequence of big blocks of time, like if the last function in the call stack takes 99% of the total time.
+ </p>
+ <p id="d62c">
+ The CPU profiling after optimizations, with the same time range.
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1860/1*87KlGgfbuWP38nAaQaj3xw.png" width="930" height="523" role="presentation" data-old-src="https://miro.medium.com/max/60/1*87KlGgfbuWP38nAaQaj3xw.png?q=20">
+ </p>
+ </div>
+ <figcaption>
+ CPU profiling after optimizations
+ </figcaption>
+ </figure>
+ <p id="10ee">
+ As you can notice, we have to zoom to the profile if we want to see the call stack, because after optimizations the API was able to take a lot more traffic. Now every function in the call stack looks like a microtask.
+ </p>
+ </div><div>
+ <p id="10f1">
+ And now our application is able to serve more than 200,000 requests in 20 seconds; <strong>we increased the performance by a factor of 100k</strong>!
+ </p>
+ <figure>
+ <div>
+ <p><img src="https://miro.medium.com/max/1690/1*kfOK60PtmWx6iP681-qRcg.png" width="845" height="362" role="presentation" data-old-src="https://miro.medium.com/max/60/1*kfOK60PtmWx6iP681-qRcg.png?q=20">
+ </p>
+ </div>
+ </figure>
+ <h2 id="98b9">
+ More than just CPU profiling
+ </h2>
+ <p id="e1ad">
+ With the inspector module, you can do much more than just CPU profiling, here is a non-exhaustive list:
+ </p>
+ <ul class>
+ <li id="eb04">memory dump &amp; memory sampling
+ </li>
+ <li id="a9ea">code coverage
+ </li>
+ <li id="b896">use the debugger in real-time
+ </li>
+ </ul>
+ <h2 id="06d2">
+ Warnings
+ </h2>
+ <p id="731b">
+ Every tool, even the most powerful, comes with its own disadvantages. If you enable the profiler and/or the debugger on your production you have to keep an eye on two things:
+ </p>
+ <p id="e485">
+ <strong>1) performance overhead</strong>
+ </p>
+ <p id="0513">
+ A profiler needs to use CPU to work and it collects data into memory. The longer you let it run and the more CPU / memory it will need. This is why you should begin with very short CPU profiling, no more than a few seconds between the start and stop command. And never forget to monitor the impact of the profiler on your own infrastructure. If everything is fine you can increase the time and the frequency of CPU profiling.
+ </p>
+ <p id="049c">
+ One more very important thing: <strong>never forget to always stop a started CPU profiling</strong>. You can add a timer to automatically call the stop function after a while.
+ </p>
+ <p id="0656">
+ <strong>2) security</strong>
+ </p>
+ <p id="7999">
+ Using the inspector in Node.js it’s like opening the door of the core of your application. You should be very careful about who can use features like CPU profiling and/or the debugger. Never make the inspector “public” as being able to launch a feature from an unsafe route (not protected with an authentification mechanism). Even the collected data can be seen as critical, never send it to a system you do not trust.
+ </p>
+ <h2 id="5618">
+ Conclusion
+ </h2>
+ <p id="ae1a">
+ CPU profiling is really a must-have tool for every developer. And now, with some precautions, we can run it on production thanks to the amazing work done by the V8 and Node.js team.
+ </p>
+ <p id="1eab">
+ The inspector module offers a lot more features than you can use to debug your application.
+ </p>
+ <p id="0aba">
+ I will write another article about using CPU profiling and the inspector on production on a high traffic project.
+ </p>
+ <h2 id="3c5b">
+ Sources &amp; links
+ </h2>
+ <ul class>
+ <li id="d86d">
+ <a href="https://nodejs.org/api/inspector.html" target="_blank" rel="noopener nofollow">https://nodejs.org/api/inspector.html</a>
+ </li>
+ <li id="cc52">
+ <a href="https://chromedevtools.github.io/devtools-protocol/v8" target="_blank" rel="noopener nofollow">https://chromedevtools.github.io/devtools-protocol/v8</a>
+ </li>
+ <li id="d331">
+ <a target="_blank" rel="noopener" href="http://fakehost/netflix-techblog/node-js-in-flames-ddd073803aa4">https://medium.com/netflix-techblog/node-js-in-flames-ddd073803aa4</a>
+ </li>
+ <li id="6420">
+ <a href="https://www.npmjs.com/package/inspector-api" target="_blank" rel="noopener nofollow">https://www.npmjs.com/package/inspector-api</a>
+ </li>
+ </ul>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/source.html
new file mode 100644
index 000000000..de97b17b6
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-1/source.html
@@ -0,0 +1,1277 @@
+<!DOCTYPE html>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta data-rh="true" charset="utf-8" />
+ <script>
+ <![CDATA[
+ !function(c,f){var t,o,i,e=[],r={passive:!0,capture:!0},n=new Date,a="pointerup",u="pointercancel";function p(n,e){t||(t=e,o=n,i=new Date,w(f),s())}function s(){0<=o&&o<i-n&&(e.forEach(function(n){n(o,t)}),e=[])}function l(n){if(n.cancelable){var e=(1e12<n.timeStamp?new Date:performance.now())-n.timeStamp;"pointerdown"==n.type?function(n,e){function t(){p(n,e),i()}function o(){i()}function i(){f(a,t,r),f(u,o,r)}c(a,t,r),c(u,o,r)}(e,n):p(e,n)}}function w(e){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(n){e(n,l,r)})}w(c),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){e.push(n),s()}}(addEventListener,removeEventListener)
+ ]]>
+ </script>
+ <title data-rh="true">
+ Node.js and CPU profiling on production (in real-time without downtime)
+ </title>
+ <meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1" />
+ <meta data-rh="true" name="theme-color" content="#000000" />
+ <meta data-rh="true" name="twitter:app:name:iphone" content="Medium" />
+ <meta data-rh="true" name="twitter:app:id:iphone" content="828256236" />
+ <meta data-rh="true" property="al:ios:app_name" content="Medium" />
+ <meta data-rh="true" property="al:ios:app_store_id" content="828256236" />
+ <meta data-rh="true" property="al:android:package" content="com.medium.reader" />
+ <meta data-rh="true" property="fb:app_id" content="542599432471018" />
+ <meta data-rh="true" property="og:site_name" content="Medium" />
+ <meta data-rh="true" property="og:type" content="article" />
+ <meta data-rh="true" property="article:published_time" content="2019-10-18T17:23:34.816Z" />
+ <meta data-rh="true" name="title" content="Node.js and CPU profiling on production (in real-time without downtime)" />
+ <meta data-rh="true" property="og:title" content="Node.js and CPU profiling on production (in real-time without downtime)" />
+ <meta data-rh="true" property="twitter:title" content="Node.js and CPU profiling on production (in real-time without downtime)" />
+ <meta data-rh="true" name="twitter:site" content="@Medium" />
+ <meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/d6e62af173e2" />
+ <meta data-rh="true" property="al:android:url" content="medium://p/d6e62af173e2" />
+ <meta data-rh="true" property="al:ios:url" content="medium://p/d6e62af173e2" />
+ <meta data-rh="true" property="al:android:app_name" content="Medium" />
+ <meta data-rh="true" name="description" content="How to run a CPU profiling with Node.js on your production in real-time and without interruption of service." />
+ <meta data-rh="true" property="og:description" content="Why CPU monitoring is important?" />
+ <meta data-rh="true" property="twitter:description" content="Why CPU monitoring is important?" />
+ <meta data-rh="true" property="og:url" content="https://medium.com/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2" />
+ <meta data-rh="true" property="al:web:url" content="https://medium.com/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2" />
+ <meta data-rh="true" property="og:image" content="https://miro.medium.com/max/1200/1*EO-pr4RolgcAOj_Uk1rpDA.png" />
+ <meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/max/1200/1*EO-pr4RolgcAOj_Uk1rpDA.png" />
+ <meta data-rh="true" name="twitter:card" content="summary_large_image" />
+ <meta data-rh="true" property="article:author" content="https://medium.com/@vincentvallet" />
+ <meta data-rh="true" name="author" content="Vincent Vallet" />
+ <meta data-rh="true" name="robots" content="index,follow" />
+ <meta data-rh="true" name="referrer" content="unsafe-url" />
+ <meta data-rh="true" name="twitter:label1" value="Reading time" />
+ <meta data-rh="true" name="twitter:data1" value="8 min read" />
+ <meta data-rh="true" name="parsely-post-id" content="d6e62af173e2" />
+ <link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/152/152/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/120/120/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/76/76/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/60/60/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.svg" color="#171717" />
+ <link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2.css" />
+ <link data-rh="true" rel="author" href="https://medium.com/@vincentvallet" />
+ <link data-rh="true" rel="canonical" href="https://medium.com/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2" />
+ <link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/d6e62af173e2" />
+ <link data-rh="true" rel="icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon-rebrand-medium.3Y6xpZ-0FSdWDnPM3hSBIA.ico" />
+ <script data-rh="true" type="application/ld+json">
+ <![CDATA[
+ {"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F1200\u002F1*EO-pr4RolgcAOj_Uk1rpDA.png"],"url":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2","dateCreated":"2019-10-18T17:23:34.816Z","datePublished":"2019-10-18T17:23:34.816Z","dateModified":"2019-10-18T17:23:35.066Z","headline":"Node.js and CPU profiling on production (in real-time without downtime)","name":"Node.js and CPU profiling on production (in real-time without downtime)","description":"How to run a CPU profiling with Node.js on your production in real-time and without interruption of service.","identifier":"d6e62af173e2","keywords":["Lite:true","Tag:Nodejs","Tag:Performance","Tag:Cpu","Tag:Profiling","Tag:Inspector","Publication:voodoo-engineering","Elevated:false","LockedPostSource:LOCKED_POST_SOURCE_NONE","LayerCake:0"],"author":{"@type":"Person","name":"Vincent Vallet","url":"https:\u002F\u002Fmedium.com\u002F@vincentvallet"},"creator":["Vincent Vallet"],"publisher":{"@type":"Organization","name":"Voodoo Engineering","url":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering","logo":{"@type":"ImageObject","width":105,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F210\u002F1*_LkVyEmY2-W1rlZD2__W5g.jpeg"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2"}
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+ ga('create', 'UA-24232453-2', 'auto');
+ ga('send', 'pageview');
+ ]]>
+ </script>
+ <link rel="preload" href="https://cdn.optimizely.com/js/16180790160.js" as="script" />
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="STATIC">
+ /*<![CDATA[*/
+ html{box-sizing:border-box}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="KEYFRAME">
+ /*<![CDATA[*/
+ @-webkit-keyframes k1{0%{transform:scale(1);opacity:1}70%{transform:scale(1.4);opacity:0}100%{opacity:0}}@-moz-keyframes k1{0%{transform:scale(1);opacity:1}70%{transform:scale(1.4);opacity:0}100%{opacity:0}}@keyframes k1{0%{transform:scale(1);opacity:1}70%{transform:scale(1.4);opacity:0}100%{opacity:0}}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE">
+ /*<![CDATA[*/
+ .a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{height:100vh}.m{width:100vw}.n{display:flex}.o{align-items:center}.p{justify-content:center}.q{fill:rgba(0, 0, 0, 0.84)}.r{display:block}.s{position:absolute}.t{top:0}.u{left:0}.v{right:0}.w{z-index:500}.x{box-shadow:0 4px 12px 0 rgba(0, 0, 0, 0.05)}.ag{max-width:1192px}.ah{min-width:0}.ai{width:100%}.aj{height:65px}.am{flex:1 0 auto}.an{border-left:1px solid rgba(0, 0, 0, 0.2)}.ao{margin-left:15px}.ap{margin-right:14px}.aq{height:24px}.ar{width:1px}.as{height:36px}.at{width:63px}.au{flex:0 0 auto}.av{visibility:hidden}.aw{margin-left:16px}.ax{font-family:medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif}.ay{font-style:normal}.az{line-height:20px}.ba{font-size:15.8px}.bb{letter-spacing:0px}.bc{color:rgba(0, 0, 0, 0.54)}.bd{fill:rgba(0, 0, 0, 0.54)}.be{color:rgba(28, 153, 99, 1)}.bf{fill:rgba(2, 184, 117, 1)}.bg{font-size:inherit}.bh{border:inherit}.bi{font-family:inherit}.bj{letter-spacing:inherit}.bk{font-weight:inherit}.bl{padding:0}.bm{margin:0}.bn:hover{cursor:pointer}.bo:hover{color:rgba(11, 59, 40, 1)}.bp:hover{fill:rgba(28, 153, 99, 1)}.bq:focus{outline:none}.br:disabled{cursor:default}.bs:disabled{color:rgba(52, 148, 166, 0.5)}.bt:disabled{fill:rgba(52, 148, 166, 0.5)}.bu{border-top:1px solid rgba(0, 0, 0, 0.1)}.bv{display:none}.bx{height:54px}.by{overflow:hidden}.bz{margin-right:40px}.ca{overflow:auto}.cb{flex:0 1 auto}.cc{list-style-type:none}.cd{line-height:40px}.ce{white-space:nowrap}.cf{overflow-x:auto}.cg{align-items:flex-start}.ch{margin-top:20px}.ci{padding-top:20px}.cj{height:80px}.ck{margin-bottom:0px}.cn{padding-left:24px}.co{padding-right:24px}.cp{margin-left:auto}.cq{margin-right:auto}.cr{max-width:728px}.cs{box-sizing:border-box}.ct{flex-direction:column}.cu{top:calc(100vh + 100px)}.cv{bottom:calc(100vh + 100px)}.cw{width:10px}.cx{pointer-events:none}.cy{word-break:break-word}.cz{word-wrap:break-word}.da:after{display:block}.db:after{content:""}.dc:after{clear:both}.dd{max-width:680px}.de{line-height:1.23}.df{letter-spacing:0}.dg{color:rgba(0, 0, 0, 0.84)}.dh{font-family:medium-content-title-font, Georgia, Cambria, "Times New Roman", Times, serif}.ds{margin-bottom:-0.27em}.dy{margin-top:32px}.dz{justify-content:space-between}.ed{border-radius:50%}.ee{height:48px}.ef{width:48px}.eg{margin-left:12px}.eh{margin-bottom:2px}.ej{font-weight:300}.ek{font-size:16px}.el{max-height:20px}.em{text-overflow:ellipsis}.en{display:-webkit-box}.eo{-webkit-line-clamp:1}.ep{-webkit-box-orient:vertical}.eq{color:inherit}.er{fill:inherit}.es:hover{text-decoration:underline}.et:disabled{color:rgba(0, 0, 0, 0.54)}.eu:disabled{fill:rgba(0, 0, 0, 0.54)}.ev{margin-left:8px}.ew{padding:0px 8px}.ex{background:0}.ey{border-color:rgba(0, 0, 0, 0.54)}.ez:hover{color:rgba(0, 0, 0, 0.97)}.fa:hover{fill:rgba(0, 0, 0, 0.97)}.fb:hover{border-color:rgba(0, 0, 0, 0.84)}.fc:disabled{fill:rgba(0, 0, 0, 0.76)}.fd:disabled{border-color:rgba(0, 0, 0, 0.2)}.fe:disabled{cursor:inherit}.ff:disabled:hover{color:rgba(0, 0, 0, 0.54)}.fg:disabled:hover{fill:rgba(0, 0, 0, 0.76)}.fh:disabled:hover{border-color:rgba(0, 0, 0, 0.2)}.fi{border-radius:4px}.fj{line-height:18px}.fk{font-size:15px}.fl{border-width:1px}.fm{border-style:solid}.fn{display:inline-block}.fo{text-decoration:none}.fp{align-items:flex-end}.fx{padding-right:6px}.fy:hover{color:rgba(0, 0, 0, 0.9)}.fz:hover{fill:rgba(0, 0, 0, 0.9)}.ga{margin-right:8px}.gb{margin-right:-6px}.gc{line-height:1.12}.gd{letter-spacing:-0.022em}.ge{font-weight:600}.gn{margin-bottom:-0.28em}.go{line-height:1.58}.gp{letter-spacing:-0.004em}.gq{font-family:medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif}.hb{margin-bottom:-0.46em}.hc{background-repeat:repeat-x}.hd{background-image:linear-gradient(to right,rgba(0, 0, 0, 0.84) 100%,rgba(0, 0, 0, 0.84) 0);background-image:url('data:image/svg+xml;utf8,<svg preserveAspectRatio="none" viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg"><line x1="0" y1="0" x2="1" y2="1" stroke="rgba(0, 0, 0, 0.84)" /></svg>')}.he{background-size:1px 1px}.hf{background-position:0 1.05em;background-position:0 calc(1em + 1px)}.hl{max-width:1894px}.hr{clear:both}.hs{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}.ht{cursor:zoom-in}.hu{position:relative}.hv{z-index:auto}.hw{opacity:0}.hx{transition:opacity 100ms 400ms}.hy{height:100%}.hz{will-change:transform}.ia{transform:translateZ(0)}.ib{margin:auto}.ic{background-color:rgba(0, 0, 0, 0.05)}.id{padding-bottom:51.21436114044351%}.ie{filter:blur(20px)}.if{transform:scale(1.1)}.ig{visibility:visible}.ih{background:rgba(255, 255, 255, 1)}.ii{line-height:1.4}.ij{margin-top:10px}.ik{text-align:center}.in{padding-left:30px}.io{line-height:1.48}.ip{letter-spacing:-0.014em}.iq{color:rgba(0, 0, 0, 0.76)}.ir{font-size:24px}.ix{font-size:30px}.iy{line-height:44px}.je{max-width:997px}.jf{padding-bottom:23.069207622868607%}.jl{line-height:1.18}.jw{margin-bottom:-0.31em}.jx{padding:20px}.jy{background:rgba(0, 0, 0, 0.05)}.jz{font-family:Menlo, Monaco, "Courier New", Courier, monospace}.ka{margin-top:-0.09em}.kb{margin-bottom:-0.09em}.kc{white-space:pre-wrap}.kd{max-width:849px}.ke{padding-bottom:62.897526501766784%}.kf{max-width:754px}.kg{padding-bottom:40.58355437665782%}.kh{max-width:2880px}.ki{padding-bottom:53.263888888888886%}.kj{font-weight:700}.kk{list-style-type:disc}.kl{margin-left:30px}.km{padding-left:0px}.ks{box-shadow:inset 3px 0 0 0 rgba(0, 0, 0, 0.84)}.kt{padding-left:23px}.ku{margin-left:-20px}.kv{font-style:italic}.kw{padding-bottom:NaN%}.kx{max-width:847px}.ky{padding-bottom:42.739079102715465%}.lh{padding-bottom:5px}.li{padding-top:5px}.lj{padding-bottom:61.88811188811189%}.lk{max-width:930px}.ll{padding-bottom:56.236559139784944%}.lm{max-width:1844px}.ln{padding-bottom:31.23644251626898%}.lo{max-width:845px}.lp{padding-bottom:42.840236686390526%}.lq{will-change:opacity}.lr{position:fixed}.ls{width:188px}.lt{left:50%}.lu{transform:translateX(406px)}.lv{top:calc(65px + 54px + 14px)}.ly{top:calc(65px + 54px + 40px)}.ma{width:131px}.mb{padding-bottom:28px}.mc{border-bottom:1px solid rgba(0, 0, 0, 0.1)}.md{font-size:18px}.me{padding-bottom:20px}.mf{padding-top:2px}.mg{max-height:120px}.mh{-webkit-line-clamp:6}.mi{padding:8px 16px}.mj{border-color:rgba(2, 184, 117, 1)}.mk:hover{border-color:rgba(28, 153, 99, 1)}.ml{padding-top:28px}.mm{margin-bottom:19px}.mn{margin-left:-3px}.mo{margin-right:5px}.mp{outline:0}.mq{border:0}.mr{user-select:none}.ms{cursor:pointer}.mt> svg{pointer-events:none}.mu:active{border-style:none}.mv{-webkit-user-select:none}.mw:focus{fill:rgba(28, 153, 99, 1)}.mx{margin-top:5px}.my button{text-align:left}.mz{margin-top:40px}.na{flex-wrap:wrap}.nb{margin-top:25px}.nc{margin-bottom:8px}.nd{border-radius:3px}.ne{padding:5px 10px}.nf{line-height:22px}.ng{margin-top:15px}.nh{margin-right:16px}.ni{border:1px solid rgba(0, 0, 0, 0.1)}.nj{height:60px}.nk{width:60px}.nx:active{border-style:solid}.ny{z-index:2}.oa{padding-right:8px}.ob{padding-top:32px}.oc{margin-bottom:25px}.od{margin-bottom:32px}.oe{min-height:80px}.oj{width:80px}.ok{padding-left:102px}.om{text-transform:uppercase}.on{letter-spacing:0.05em}.oo{margin-bottom:6px}.op{font-size:28px}.oq{line-height:36px}.or{padding:4px 12px}.os{max-width:555px}.ot{max-width:450px}.ou{line-height:24px}.ow{max-width:550px}.ox{padding-top:25px}.oy{opacity:1}.oz{border:1px solid rgba(2, 184, 117, 1)}.pa{margin-top:64px}.pb{background-color:rgba(0, 0, 0, 0.02)}.pc{margin:32px 0}.pe{padding-bottom:8px}.pf{font-size:22px}.pg{line-height:28px}.ph{flex-direction:row}.qo{flex-grow:0}.ri{margin-bottom:12px}.rk{margin-bottom:16px}.rm{padding-bottom:66.46341463414635%}.rn{background-image:url(https://miro.medium.com/max/656/1*PgziD8xisQlGXkWMjDGz5w.png)}.ro{background-origin:border-box}.rp{background-size:cover}.rq{background-position:50% 50%}.rr{max-width:100%}.rs{margin-bottom:4px}.ru{font-weight:500}.rv{line-height:32px}.rw{letter-spacing:0em}.rx{margin-right:10px}.ry{height:40px}.rz{width:40px}.sa{fill:rgba(0, 0, 0, 0.76)}.sb:focus{fill:rgba(0, 0, 0, 0.54)}.sc:hover{fill:rgba(0, 0, 0, 0.54)}.sd{border-right:1px solid rgba(0, 0, 0, 0.1)}.se{height:20px}.sf{background-image:url(https://miro.medium.com/max/656/1*flvQZznQlpVs26M6SCL7DA.jpeg)}.sg{background-image:url(https://miro.medium.com/max/656/0*sduEjXj8BCMSMYU1)}.sh{padding:60px 0}.si{background-color:rgba(0, 0, 0, 0.9)}.sz{padding-bottom:48px}.ta{border-bottom:1px solid rgba(255, 255, 255, 0.54)}.tb{margin:0 -12px}.tc{margin:0 12px}.td{flex:1 1 0}.te{padding-bottom:12px}.tf:hover{color:rgba(255, 255, 255, 0.99)}.tg:hover{fill:rgba(255, 255, 255, 0.99)}.th:disabled{color:rgba(255, 255, 255, 0.7)}.ti:disabled{fill:rgba(255, 255, 255, 0.7)}.tj{color:rgba(255, 255, 255, 0.98)}.tk{fill:rgba(255, 255, 255, 0.98)}.tl{text-align:inherit}.tm{font-size:21.6px}.tn{letter-spacing:-0.32px}.to{color:rgba(255, 255, 255, 0.7)}.tp{fill:rgba(255, 255, 255, 0.7)}.tq{text-decoration:underline}.tr{padding-top:8px}.ts{width:200px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (min-width: 1080px)">
+ /*<![CDATA[*/
+ .d{display:none}.af{margin:0 64px}.dq{font-size:40px}.dr{margin-top:0.78em}.dx{line-height:48px}.fw{margin-left:30px}.gl{font-size:34px}.gm{margin-top:1.95em}.gz{font-size:21px}.ha{margin-top:0.86em}.hk{margin-top:2em}.hq{margin-top:56px}.iw{margin-top:2.75em}.jd{margin-top:3.14em}.jk{margin-top:1.75em}.ju{font-size:26px}.jv{margin-top:1.72em}.kr{margin-top:1.05em}.lg{max-width:1192px}.pu{width:calc(100% + 32px)}.pv{margin-left:-16px}.pw{margin-right:-16px}.qk{padding-left:16px}.ql{padding-right:16px}.qm{flex-basis:33.333333%}.qn{max-width:33.333333%}.qy{align-items:flex-start}.qz{flex-direction:row}.rg{flex-basis:100%}.rh{max-width:100%}.sw{padding-left:64px}.sx{padding-right:64px}.sy{max-width:1320px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 1079.98px)">
+ /*<![CDATA[*/
+ .e{display:none}.fv{margin-left:30px}.il{margin-left:auto}.im{text-align:center}.st{padding-left:64px}.su{padding-right:64px}.sv{max-width:1080px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 903.98px)">
+ /*<![CDATA[*/
+ .f{display:none}.fu{margin-left:30px}.pd{margin-bottom:0px}.qp{margin-bottom:48px}.rt{display:block}.sq{padding-left:48px}.sr{padding-right:48px}.ss{max-width:904px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 727.98px)">
+ /*<![CDATA[*/
+ .g{display:none}.ak{height:56px}.al{display:flex}.bw{display:block}.cl{margin-bottom:0px}.cm{height:110px}.eb{margin-top:32px}.ec{flex-direction:column-reverse}.fs{margin-bottom:30px}.ft{margin-left:0px}.of{margin-bottom:24px}.og{align-items:center}.oh{width:102px}.oi{position:relative}.ol{padding-left:0}.ov{margin-top:24px}.sj{padding:32px 0}.sn{padding-left:24px}.so{padding-right:24px}.sp{max-width:728px}.tt{width:140px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 551.98px)">
+ /*<![CDATA[*/
+ .h{display:none}.z{margin:0 24px}.di{font-size:30px}.dj{margin-top:0.72em}.dt{line-height:40px}.ea{margin-top:32px}.ei{margin-bottom:0px}.fq{margin-bottom:30px}.fr{margin-left:0px}.gf{margin-top:1.2em}.gr{font-size:18px}.gs{margin-top:0.67em}.hg{margin-top:1.56em}.hm{margin-top:40px}.is{margin-top:1.42em}.iz{margin-top:2em}.jg{margin-top:1.08em}.jm{font-size:24px}.jn{margin-top:1.23em}.kn{margin-top:1.34em}.kz{margin:0}.la{max-width:100%}.pi{width:calc(100% + 24px)}.pj{margin-left:-12px}.pk{margin-right:-12px}.px{padding-left:12px}.py{padding-right:12px}.pz{flex-basis:100%}.qq{align-items:flex-start}.qr{flex-direction:row}.rj{display:block}.rl{margin-bottom:16px}.sk{padding-left:24px}.sl{padding-right:24px}.sm{max-width:552px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">
+ /*<![CDATA[*/
+ .i{display:none}.ae{margin:0 64px}.do{font-size:40px}.dp{margin-top:0.78em}.dw{line-height:48px}.gj{font-size:34px}.gk{margin-top:1.95em}.gx{font-size:21px}.gy{margin-top:0.86em}.hj{margin-top:2em}.hp{margin-top:56px}.iv{margin-top:2.75em}.jc{margin-top:3.14em}.jj{margin-top:1.75em}.js{font-size:26px}.jt{margin-top:1.72em}.kq{margin-top:1.05em}.lf{max-width:1192px}.pr{width:calc(100% + 32px)}.ps{margin-left:-16px}.pt{margin-right:-16px}.qg{padding-left:16px}.qh{padding-right:16px}.qi{flex-basis:33.333333%}.qj{max-width:33.333333%}.qw{align-items:flex-start}.qx{flex-direction:row}.re{flex-basis:100%}.rf{max-width:100%}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">
+ /*<![CDATA[*/
+ .j{display:none}.ac{margin:0 48px}.dm{font-size:40px}.dn{margin-top:0.78em}.dv{line-height:48px}.gh{font-size:34px}.gi{margin-top:1.95em}.gv{font-size:21px}.gw{margin-top:0.86em}.hi{margin-top:2em}.ho{margin-top:56px}.iu{margin-top:2.75em}.jb{margin-top:3.14em}.ji{margin-top:1.75em}.jq{font-size:26px}.jr{margin-top:1.72em}.kp{margin-top:1.05em}.ld{margin:0}.le{max-width:100%}.po{width:calc(100% + 28px)}.pp{margin-left:-14px}.pq{margin-right:-14px}.qd{padding-left:14px}.qe{padding-right:14px}.qf{flex-basis:100%}.qu{align-items:center}.qv{flex-direction:row-reverse}.rc{flex-basis:50%}.rd{max-width:50%}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">
+ /*<![CDATA[*/
+ .k{display:none}.ab{margin:0 24px}.dk{font-size:30px}.dl{margin-top:0.72em}.du{line-height:40px}.gg{margin-top:1.2em}.gt{font-size:18px}.gu{margin-top:0.67em}.hh{margin-top:1.56em}.hn{margin-top:40px}.it{margin-top:1.42em}.ja{margin-top:2em}.jh{margin-top:1.08em}.jo{font-size:24px}.jp{margin-top:1.23em}.ko{margin-top:1.34em}.lb{margin:0}.lc{max-width:100%}.pl{width:calc(100% + 24px)}.pm{margin-left:-12px}.pn{margin-right:-12px}.qa{padding-left:12px}.qb{padding-right:12px}.qc{flex-basis:100%}.qs{align-items:center}.qt{flex-direction:row-reverse}.ra{flex-basis:50%}.rb{max-width:50%}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="print">
+ /*<![CDATA[*/
+ .y{display:none}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">
+ /*<![CDATA[*/
+ .lw{transition:opacity 200ms}.nl{transition:border-color 150ms ease}.nm::before{background:
+ radial-gradient(circle, rgba(28, 153, 99, 1) 60%, transparent 70%)
+ }.nn::before{border-radius:50%}.no::before{content:""}.np::before{display:block}.nq::before{z-index:0}.nr::before{left:0}.ns::before{height:100%}.nt::before{position:absolute}.nu::before{top:0}.nv::before{width:100%}.nw:hover::before{animation:k1 2000ms infinite cubic-bezier(.1,.12,.25,1)}.nz{transition:fill 200ms ease}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 1230px)">
+ /*<![CDATA[*/
+ .lx{display:none}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="539" data-fela-type="RULE" media="all and (max-width: 1198px)">
+ /*<![CDATA[*/
+ .lz{display:none}
+ /*]]>*/
+ </style>
+ </head>
+ <body>
+ <div id="root">
+ <div class="a b c">
+ <div class="d e f g h i j k"></div>
+ <script>
+ <![CDATA[
+ document.domain = document.domain;
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.PARSELY = window.PARSELY || {autotrack: false}
+ ]]>
+ </script>
+ <nav class="r s t u v c w x y">
+ <div>
+ <div class="r c">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="aj n o ak al">
+ <div class="n o am w">
+ <a aria-label="Homepage" rel="noopener" href="/?source=post_page-----d6e62af173e2----------------------"><svg width="35" height="35" viewbox="5 5 35 35" class="q">
+ <path d="M5 40V5h35v35H5zm8.56-12.63c0 .56-.03.69-.32 1.03L10.8 31.4v.4h6.97v-.4L15.3 28.4c-.29-.34-.34-.5-.34-1.03v-8.95l6.13 13.36h.71l5.26-13.36v10.64c0 .3 0 .35-.19.53l-1.85 1.8v.4h9.2v-.4l-1.83-1.8c-.18-.18-.2-.24-.2-.53V15.94c0-.3.02-.35.2-.53l1.82-1.8v-.4h-6.47l-4.62 11.55-5.2-11.54h-6.8v.4l2.15 2.63c.24.3.29.37.29.77v10.35z"></path></svg></a>
+ <div class="an ao ap aq ar r g"></div>
+ <div class="r g">
+ <a href="/voodoo-engineering?source=post_page-----d6e62af173e2----------------------" rel="noopener">
+ <div class="as at r">
+ <img alt="Voodoo Engineering" class="" src="https://miro.medium.com/max/126/1*_LkVyEmY2-W1rlZD2__W5g.jpeg" width="63" height="36" />
+ </div></a>
+ </div>
+ </div>
+ <div class="r au w">
+ <div class="n o">
+ <div class="n g">
+ <div class="av" id="lo-post-page-navbar-sign-in-link">
+ <div class="aw r">
+ <span class="ax b ay az ba bb r bc bd"><a href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_page-----d6e62af173e2---------------------nav_reg-" class="be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt" rel="noopener">Sign in</a></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="bu bv c bw">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="bx by n o">
+ <div class="bz r au">
+ <a href="/voodoo-engineering?source=post_page-----d6e62af173e2----------------------" rel="noopener">
+ <div class="as at r">
+ <img alt="Voodoo Engineering" class="" src="https://miro.medium.com/max/126/1*_LkVyEmY2-W1rlZD2__W5g.jpeg" width="63" height="36" />
+ </div></a>
+ </div>
+ <div class="ca r cb">
+ <ul class="cc bm cd ce cf n cg g ch ci cj"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </nav>
+ <div class="ck aj r cl cm"></div>
+ <article>
+ <section class="cn co cp cq ai cr cs n ct"></section>
+ <div>
+ <div class="s u cu cv cw cx"></div>
+ <section class="cy cz da db dc">
+ <div class="n p">
+ <div class="z ab ac ae af dd ah ai">
+ <div>
+ <div id="daf0" class="de df dg ay dh b di dj dk dl dm dn do dp dq dr ds">
+ <h1 class="dh b di dt dk du dm dv do dw dq dx dg">
+ Node.js and CPU profiling on production (in real-time without downtime)
+ </h1>
+ </div>
+ <div class="dy">
+ <div class="n dz ea eb ec">
+ <div class="o n">
+ <div>
+ <a rel="noopener" href="/@vincentvallet?source=post_page-----d6e62af173e2----------------------"><img alt="Vincent Vallet" class="r ed ee ef" src="https://miro.medium.com/fit/c/96/96/1*vFTVh_mYyf0p6m7f77A3vw.jpeg" width="48" height="48" /></a>
+ </div>
+ <div class="eg ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="eh n o ei">
+ <span class="ax b ay az ba bb r dg q"><span class="ax ej ek az by el em en eo ep dg"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/@vincentvallet?source=post_page-----d6e62af173e2----------------------">Vincent Vallet</a></span></span>
+ <div class="ev r au h">
+ <button class="ew dg q ex ey ez fa fb bn et fc fd fe ff fg fh fi ax b ay fj fk bb fl fm cs fn fo bq">Follow</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div>
+ <span class="ax b ay az ba bb r bc bd"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/voodoo-engineering/node-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2?source=post_page-----d6e62af173e2----------------------">Oct 18, 2019</a> <!-- -->·<!-- --> <!-- -->8<!-- --> min read</span>
+ </div>
+ </div>
+ </div>
+ <div class="n fp fq fr fs ft fu fv fw y">
+ <div class="n o">
+ <div class="fx r au">
+ <a href="//medium.com/p/d6e62af173e2/share/twitter?source=post_actions_header---------------------------" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" target="_blank" rel="noopener nofollow"><svg width="29" height="29" class="q">
+ <path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></a>
+ </div>
+ <div class="fx r au">
+ <button class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="q">
+ <path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button>
+ </div>
+ <div class="fx r au">
+ <a href="//medium.com/p/d6e62af173e2/share/facebook?source=post_actions_header---------------------------" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" target="_blank" rel="noopener nofollow"><svg width="29" height="29" class="q">
+ <path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></a>
+ </div>
+ <div class="ga r">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_actions_header--------------------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ <div class="gb r am"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <h1 id="0231" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Why CPU monitoring is important?
+ </h1>
+ <p id="d2c1" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ I work at <a href="http://voodoo.io/" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">Voodoo</a>, a French company that creates mobile video games. We have a lot of challenges with performance, availability, and scalability because of the insane amount of traffic our infrastructure supports (billions of events/requests per day …… no joke!). In this setting, every metric is important and gives us a lot of information about the state of our system.
+ </p>
+ <p id="0e89" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ When working with Node.js one of the most critical resources to monitor is the CPU. Most of the time, when working on a low traffic API or project we don’t realize how many simple lines of code can have a huge impact on CPU. On the other hand, when traffic increases, a simple mistake can cost dearly.
+ </p>
+ <h1 id="292e" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Resources
+ </h1>
+ <p id="1efa" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ What kind of resources does your application need? In most cases, we focus on memory and CPU. Good monitoring of these two elements is mandatory for an application running on production.
+ </p>
+ <p id="dce9" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ For memory, constant monitoring is the best practice to track the worst developer nightmare a.k.a memory leak.
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq hl">
+ <div class="ib r hu ic">
+ <div class="id r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*5o3M5niyi911waUrKWVZ0Q.png?q=20" width="1894" height="970" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="1894" height="970" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/3788/1*5o3M5niyi911waUrKWVZ0Q.png" width="1894" height="970" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ Memory leak in action
+ </figcaption>
+ </figure>
+ <p id="69dd" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ A good way to debug memory leak is a memory dump and/or memory sampling but this is not the subject.
+ </p>
+ <p id="1fbc" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ (for more details about V8 and its garbage collector you can read my previous article <a class="eq fo hc hd he hf" target="_blank" rel="noopener" href="/voodoo-engineering/nodejs-internals-v8-garbage-collector-a6eca82540ec">here</a>)
+ </p>
+ <blockquote class="in">
+ <div id="6f9a" class="io ip iq ay dh b ir is it iu iv iw hb">
+ <p class="dh b ix iy bc">
+ Stay focused on the CPU!
+ </p>
+ </div>
+ </blockquote>
+ <p id="40e6" class="go gp dg ay gq b gr iz gt ja gv jb gx jc gz jd hb cy">
+ Most of the time we monitor this resource with a simple solution allowing us to get a graph representing CPU consumption over time. If we want to be reactive we add an alarm, based on a threshold, to warn us when CPU usage is too high.
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq je">
+ <div class="ib r hu ic">
+ <div class="jf r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*8uOdeOfnUzTaFIY1r7oAMg.png?q=20" width="997" height="230" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="997" height="230" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1994/1*8uOdeOfnUzTaFIY1r7oAMg.png" width="997" height="230" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ Basic CPU monitoring
+ </figcaption>
+ </figure>
+ <p id="0728" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ And what next? We don’t have data about the state of the instance when the CPU usage has increased. So we can’t determine why we had this peak, at least not without an important time of debugging, comparing log, etc. This is exactly why you need to use CPU profiling.
+ </p>
+ <h1 id="8d00" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ CPU profiling: what’s the difference with CPU monitoring?
+ </h1>
+ <blockquote class="in">
+ <div id="19fb" class="io ip iq ay dh b ir jg jh ji jj jk hb">
+ <p class="dh b ix iy bc">
+ “Most commonly, profiling information serves to aid program optimization. Profiling is achieved by instrumenting either the program source code or its binary executable form using a tool called a profiler”
+ </p>
+ </div>
+ </blockquote>
+ <p id="3e11" class="go gp dg ay gq b gr iz gt ja gv jb gx jc gz jd hb cy">
+ Basically, for Node.js, CPU profiling is nothing more than collecting data about functions which are CPU consuming. And ideally, get a graphic representation of the collected data a.k.a “flame graph” or “flame chart”.
+ </p>
+ <p id="91c5" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ It will help you to track the exact file, line, and function which takes the most time to execute.
+ </p>
+ <h1 id="088b" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ What about existing solutions?
+ </h1>
+ <h2 id="dd40" class="jl gd dg ay ax ge jm jn jo jp jq jr js jt ju jv jw">
+ Add arguments to Node.js
+ </h2>
+ <p id="0306" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ Node.js provides a way to collect data about CPU with two command lines.
+ </p>
+ <p id="66c8" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ The first command just executes your application, the argument just tells to V8 engine to collect data. When you stop your script all information is stored in a file.
+ </p>
+ <pre class="hm hn ho hp hq jx jy cf"><span id="16bd" class="jl gd dg ay jz b ek ka kb r kc">node --prof app.js</span></pre>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq kd">
+ <div class="ib r hu ic">
+ <div class="ke r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*e7gjTlzi55udTXbbPeEs2A.png?q=20" width="849" height="534" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="849" height="534" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1698/1*e7gjTlzi55udTXbbPeEs2A.png" width="849" height="534" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ Output of — prof
+ </figcaption>
+ </figure>
+ <p id="57a6" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ It is not very clear, is it?
+ </p>
+ <p id="abed" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ That’s why you just need to run this second command to transform your raw file into a more human-readable output.
+ </p>
+ <pre class="hm hn ho hp hq jx jy cf"><span id="061c" class="jl gd dg ay jz b ek ka kb r kc">node --prof-process isolate-0xnnnnn-v8.log &gt; processed.txt</span></pre>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq kf">
+ <div class="ib r hu ic">
+ <div class="kg r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*JJkRh7JihTUo2apW_9ZXAQ.png?q=20" width="754" height="306" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="754" height="306" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1508/1*JJkRh7JihTUo2apW_9ZXAQ.png" width="754" height="306" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ The output of — prof-process
+ </figcaption>
+ </figure>
+ <p id="85fa" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ It seems better, here you can determine which function consumes the most of CPU (percentage of the time).
+ </p>
+ <h2 id="9e54" class="jl gd dg ay ax ge jm jn jo jp jq jr js jt ju jv jw">
+ ClinicJs
+ </h2>
+ <p id="176a" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ ClinicJs is a set of tools that allow you to collect data and display performance charts. With “clinic flame” you can generate a flame graph based on CPU consumption.
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq kh">
+ <div class="ib r hu ic">
+ <div class="ki r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*6wi5BlNNnykjZs0PufrvLQ.png?q=20" width="2880" height="1534" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="2880" height="1534" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/5760/1*6wi5BlNNnykjZs0PufrvLQ.png" width="2880" height="1534" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ Flame chart
+ </figcaption>
+ </figure>
+ <p id="5347" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ But once again, you have to stop your app, launch the tool, then terminate the script in order to display the graph (files are generated on the disk).
+ </p>
+ <p id="d6e6" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ For more details, you can see the <a href="https://clinicjs.org/" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">project</a>.
+ </p>
+ <p id="be18" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">To sum up</strong>, here is the list of drawbacks of the two previous solutions.
+ </p>
+ <ul class="">
+ <li id="3bef" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb kk kl km">Downtime (you should kill your application to collect the data)
+ </li>
+ <li id="c0df" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">Performance overhead
+ </li>
+ <li id="27ec" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">Data collected locally
+ </li>
+ <li id="a4fd" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">Need external tools (ClinicJs)
+ </li>
+ </ul>
+ <p id="3f2c" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ In conclusion: these are good solutions to debug on development environments and/or on a local machine.
+ </p>
+ <blockquote class="ks kt ku">
+ <p id="fcd9" class="go gp dg kv gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ Unfortunately, CPU issues have a worrying tendency to occur on production, and when you are not in front of your screen.
+ </p>
+ </blockquote>
+ <h1 id="13ef" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Inspector
+ </h1>
+ <p id="294e" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ “Inspector” refers to an API thanks to which you can debug your application. By debugging we mean to be able to connect directly to the core of Node.js to collect real-time data about the process.
+ </p>
+ <p id="ea23" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ A module, available since version 8.x of Node.js, provides this kind of feature. There are two advantages to use it:
+ </p>
+ <ul class="">
+ <li id="ed54" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb kk kl km">it’s native (no additional installation required)
+ </li>
+ <li id="7992" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">it can be used programmatically (no interruption)
+ </li>
+ </ul>
+ <p id="731f" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ And here is how to make a CPU profiling with this module:
+ </p>
+ <figure class="hm hn ho hp hq hr">
+ <div class="ib r hu">
+ <div class="kw r">
+ <iframe src="https://medium.com/media/e6590d28762ae9dc52a79fab03d9bfb4" allowfullscreen="allowfullscreen" frameborder="0" height="0" width="0" title="CPU profiling with inspector" class="s t u hy ai" scrolling="auto"></iframe>
+ </div>
+ </div>
+ </figure>
+ <p id="79d1" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ As you can see, all the data is returned in variable “profile”. Basically, it’s a simple JSON object representing all the call stack and the CPU consumption for each function. And if you want to use an Async/await syntax you can install the module “inspector-api”.
+ </p>
+ <pre class="hm hn ho hp hq jx jy cf"><span id="c085" class="jl gd dg ay jz b ek ka kb r kc">npm install inspector-api --save</span></pre>
+ <p id="195d" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ It also comes with a built-in exporter to send data to S3, with this method <strong class="gq kj">you don’t write anything on the disk</strong>!
+ </p>
+ <figure class="hm hn ho hp hq hr">
+ <div class="ib r hu">
+ <div class="kw r">
+ <iframe src="https://medium.com/media/a5c2cfaff5b466e10f3f24ac0dee3dd1" allowfullscreen="allowfullscreen" frameborder="0" height="0" width="0" title="CPU profiling with inspector-api module" class="s t u hy ai" scrolling="auto"></iframe>
+ </div>
+ </div>
+ </figure>
+ <p id="964f" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ If you use another storage system you can just collect the data and export it by yourself.
+ </p>
+ <figure class="hm hn ho hp hq hr">
+ <div class="ib r hu">
+ <div class="kw r">
+ <iframe src="https://medium.com/media/a258a6f9cd216401571004e3dffd693b" allowfullscreen="allowfullscreen" frameborder="0" height="0" width="0" title="CPU profiling" class="s t u hy ai" scrolling="auto"></iframe>
+ </div>
+ </div>
+ </figure>
+ <h1 id="848b" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ And now, CPU profiling on-demand!
+ </h1>
+ <p id="6933" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ We have an API that we want to test with autocannon tool. At this step, our project is able to serve around 200 requests in 20 seconds. There is probably a mistake somewhere in the code which slows down our application.
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq kx">
+ <div class="ib r hu ic">
+ <div class="ky r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*cS9IXYGfMmgxaAUlC7oqOQ.png?q=20" width="847" height="362" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="847" height="362" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1694/1*cS9IXYGfMmgxaAUlC7oqOQ.png" width="847" height="362" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p id="fb78" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ But now, what if we want to trigger a CPU profiling remotely (without ssh connection to the server)? It’s possible using Websocket, SSE or any other technology to send a message to your instance.
+ </p>
+ <p id="2c91" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ Here is a simple example of a server using the “ws” module to send a message to a unique instance.
+ </p>
+ <figure class="hm hn ho hp hq hr">
+ <div class="ib r hu">
+ <div class="kw r">
+ <iframe src="https://medium.com/media/feef2118ed0761bda1c2821a47c2297b" allowfullscreen="allowfullscreen" frameborder="0" height="0" width="0" title="WS server" class="s t u hy ai" scrolling="auto"></iframe>
+ </div>
+ </div>
+ </figure>
+ <p id="2206" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ Of course, it only works with one instance, but it’s a fake project to demonstrate the principle ;)
+ </p>
+ <p id="e92d" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ Now we can request our server to ask it to send a message to our instance and start/stop a CPU profiling. In your instance, you can handle the CPU profiling like this:
+ </p>
+ <figure class="hm hn ho hp hq hr">
+ <div class="ib r hu">
+ <div class="kw r">
+ <iframe src="https://medium.com/media/8a678f3011fef4d2c8296408f0b552fe" allowfullscreen="allowfullscreen" frameborder="0" height="0" width="0" title="WS client side" class="s t u hy ai" scrolling="auto"></iframe>
+ </div>
+ </div>
+ </figure>
+ <p id="c3d0" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">To sum up</strong>: we are able to trigger a CPU profiling, on-demand, in real-time, without interruption or connection to the server. Data can be collected on the disk (and extracted later) or can be sent to S3 (or any other system, PR are welcomed on the <a href="https://github.com/wallet77/v8-inspector-api" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">inspector-api project</a>).
+ </p>
+ <blockquote class="ks kt ku">
+ <p id="6e87" class="go gp dg kv gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ And because the profiler is a part of V8 itself, the format of the generated JSON file is compatible with the Chrome dev tools.
+ </p>
+ </blockquote>
+ </div>
+ </div>
+ <div class="hr">
+ <div class="n p">
+ <div class="kz la lb lc ld le ae lf af lg ah ai">
+ <figure class="hm hn ho hp hq hr lh li paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq ag">
+ <div class="ib r hu ic">
+ <div class="lj r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img alt="CPU profiling before optimization" class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*CANkRN_yzl9tfrGd2F41wQ.png?q=20" width="1144" height="708" />
+ </div><img alt="CPU profiling before optimization" class="hw hx s t u hy ai ih" width="1144" height="708" /><noscript><img alt="CPU profiling before optimization" class="s t u hy ai" src="https://miro.medium.com/max/2288/1*CANkRN_yzl9tfrGd2F41wQ.png" width="1144" height="708" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ CPU profiling before optimization
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ </div>
+ <div class="n p">
+ <div class="z ab ac ae af dd ah ai">
+ <p id="2cda" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">How can we identify an issue?</strong>
+ </p>
+ <p id="e0d2" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ A CPU profiling should be read like this:
+ </p>
+ <ul class="">
+ <li id="27e6" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb kk kl km">the x-axis shows the stack profile population
+ </li>
+ <li id="194a" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">the y-axis shows stack depth
+ </li>
+ </ul>
+ <p id="e950" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">What does it mean?</strong>
+ </p>
+ <p id="174c" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ The larger is a box (a function call) the more it consumed CPU. So a good CPU profiling should look like a “flame” graph where each stack is the finest possible.
+ </p>
+ <p id="48d9" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ In our example, every request try to generate a token. For this purpose, it calls the function pbkdf2 which is CPU consuming. Our CPU profile looks like a sequence of big blocks of time, like if the last function in the call stack takes 99% of the total time.
+ </p>
+ <p id="d62c" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ The CPU profiling after optimizations, with the same time range.
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq lk">
+ <div class="ib r hu ic">
+ <div class="ll r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*87KlGgfbuWP38nAaQaj3xw.png?q=20" width="930" height="523" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="930" height="523" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1860/1*87KlGgfbuWP38nAaQaj3xw.png" width="930" height="523" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ CPU profiling after optimizations
+ </figcaption>
+ </figure>
+ <p id="10ee" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ As you can notice, we have to zoom to the profile if we want to see the call stack, because after optimizations the API was able to take a lot more traffic. Now every function in the call stack looks like a microtask.
+ </p>
+ </div>
+ </div>
+ <div class="hr">
+ <div class="n p">
+ <div class="kz la lb lc ld le ae lf af lg ah ai">
+ <figure class="hm hn ho hp hq hr lh li paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq lm">
+ <div class="ib r hu ic">
+ <div class="ln r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img alt="CPU profiling after optimization" class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*EO-pr4RolgcAOj_Uk1rpDA.png?q=20" width="1844" height="576" />
+ </div><img alt="CPU profiling after optimization" class="hw hx s t u hy ai ih" width="1844" height="576" /><noscript><img alt="CPU profiling after optimization" class="s t u hy ai" src="https://miro.medium.com/max/3688/1*EO-pr4RolgcAOj_Uk1rpDA.png" width="1844" height="576" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ <figcaption class="bc ek ii ij ik cr cp cq il im ax ej">
+ Zoom in the CPU profiling
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ </div>
+ <div class="n p">
+ <div class="z ab ac ae af dd ah ai">
+ <p id="10f1" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ And now our application is able to serve more than 200,000 requests in 20 seconds; <strong class="gq kj">we increased the performance by a factor of 100k</strong>!
+ </p>
+ <figure class="hm hn ho hp hq hr cp cq paragraph-image">
+ <div class="hs ht hu hv ai">
+ <div class="cp cq lo">
+ <div class="ib r hu ic">
+ <div class="lp r">
+ <div class="hw hx s t u hy ai by hz ia">
+ <img class="s t u hy ai ie if ig" src="https://miro.medium.com/max/60/1*kfOK60PtmWx6iP681-qRcg.png?q=20" width="845" height="362" role="presentation" />
+ </div><img class="hw hx s t u hy ai ih" width="845" height="362" role="presentation" /><noscript><img class="s t u hy ai" src="https://miro.medium.com/max/1690/1*kfOK60PtmWx6iP681-qRcg.png" width="845" height="362" role="presentation" /></noscript>
+ </div>
+ </div>
+ </div>
+ </div>
+ </figure>
+ <h1 id="98b9" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ More than just CPU profiling
+ </h1>
+ <p id="e1ad" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ With the inspector module, you can do much more than just CPU profiling, here is a non-exhaustive list:
+ </p>
+ <ul class="">
+ <li id="eb04" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb kk kl km">memory dump &amp; memory sampling
+ </li>
+ <li id="a9ea" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">code coverage
+ </li>
+ <li id="b896" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">use the debugger in real-time
+ </li>
+ </ul>
+ <h1 id="06d2" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Warnings
+ </h1>
+ <p id="731b" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ Every tool, even the most powerful, comes with its own disadvantages. If you enable the profiler and/or the debugger on your production you have to keep an eye on two things:
+ </p>
+ <p id="e485" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">1) performance overhead</strong>
+ </p>
+ <p id="0513" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ A profiler needs to use CPU to work and it collects data into memory. The longer you let it run and the more CPU / memory it will need. This is why you should begin with very short CPU profiling, no more than a few seconds between the start and stop command. And never forget to monitor the impact of the profiler on your own infrastructure. If everything is fine you can increase the time and the frequency of CPU profiling.
+ </p>
+ <p id="049c" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ One more very important thing: <strong class="gq kj">never forget to always stop a started CPU profiling</strong>. You can add a timer to automatically call the stop function after a while.
+ </p>
+ <p id="0656" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ <strong class="gq kj">2) security</strong>
+ </p>
+ <p id="7999" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ Using the inspector in Node.js it’s like opening the door of the core of your application. You should be very careful about who can use features like CPU profiling and/or the debugger. Never make the inspector “public” as being able to launch a feature from an unsafe route (not protected with an authentification mechanism). Even the collected data can be seen as critical, never send it to a system you do not trust.
+ </p>
+ <h1 id="5618" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Conclusion
+ </h1>
+ <p id="ae1a" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb cy">
+ CPU profiling is really a must-have tool for every developer. And now, with some precautions, we can run it on production thanks to the amazing work done by the V8 and Node.js team.
+ </p>
+ <p id="1eab" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ The inspector module offers a lot more features than you can use to debug your application.
+ </p>
+ <p id="0aba" class="go gp dg ay gq b gr hg gt hh gv hi gx hj gz hk hb cy">
+ I will write another article about using CPU profiling and the inspector on production on a high traffic project.
+ </p>
+ <h1 id="3c5b" class="gc gd dg ay ax ge di gf dk gg gh gi gj gk gl gm gn">
+ Sources &amp; links
+ </h1>
+ <ul class="">
+ <li id="d86d" class="go gp dg ay gq b gr gs gt gu gv gw gx gy gz ha hb kk kl km">
+ <a href="https://nodejs.org/api/inspector.html" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">https://nodejs.org/api/inspector.html</a>
+ </li>
+ <li id="cc52" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">
+ <a href="https://chromedevtools.github.io/devtools-protocol/v8" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">https://chromedevtools.github.io/devtools-protocol/v8</a>
+ </li>
+ <li id="d331" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">
+ <a class="eq fo hc hd he hf" target="_blank" rel="noopener" href="/netflix-techblog/node-js-in-flames-ddd073803aa4">https://medium.com/netflix-techblog/node-js-in-flames-ddd073803aa4</a>
+ </li>
+ <li id="6420" class="go gp dg ay gq b gr kn gt ko gv kp gx kq gz kr hb kk kl km">
+ <a href="https://www.npmjs.com/package/inspector-api" class="eq fo hc hd he hf" target="_blank" rel="noopener nofollow">https://www.npmjs.com/package/inspector-api</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </section>
+ </div>
+ </article>
+ <div class="hw cx lq lr ai ly lw lz" data-test-id="post-sidebar">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="ma n ct">
+ <div class="cx">
+ <div class="mb mc r">
+ <a href="/voodoo-engineering?source=post_sidebar--------------------------post_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <h2 class="ax ge md az dg">
+ Voodoo Engineering
+ </h2></a>
+ <div class="me mf r">
+ <h4 class="ax ej ek az by mg em en mh ep bc">
+ Learn about Voodoo’s engineering efforts.
+ </h4>
+ </div>
+ <div class="fn" aria-hidden="true">
+ <button class="mi ex be bf mj bo bp mk bn fi ax b ay az ba bb fl fm cs fn fo bq">Follow</button>
+ </div>
+ </div>
+ <div class="ml mm mn n">
+ <div class="n o">
+ <div class="mo r hu">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_sidebar-----d6e62af173e2---------------------clap_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="bl mp mq mr ms mt mu mv bf mw bp">
+ <svg width="29" height="29">
+ <g fill-rule="evenodd">
+ <path d="M13.74 1l.76 2.97.76-2.97zM16.82 4.78l1.84-2.56-1.43-.47zM10.38 2.22l1.84 2.56-.41-3.03zM22.38 22.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M9.1 22.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L6.1 15.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L6.4 11.26l-1.18-1.18a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L11.96 14a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L8.43 9.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L20.63 15c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM13 6.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 23 23.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg>
+ </div></a>
+ </div>
+ <div class="mx r">
+ <div class="my">
+ <h4 class="ax ej ek az bc">
+ <button class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu">11</button>
+ </h4>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="mm r"></div><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_sidebar--------------------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="hw cx lq lr ls lt lu lv lw lx"></div>
+ <div>
+ <div class="mz hr n ct p">
+ <div class="n p">
+ <div class="z ab ac ae af dd ah ai">
+ <div class="n na">
+ <div class="r">
+ <h4 class="ax ej fk az bc">
+ Thanks to <!-- -->Clint FENTON<!-- -->.&#160;
+ </h4>
+ </div>
+ </div>
+ <div class="n o na"></div>
+ <div class="nb r">
+ <ul class="bl bm">
+ <li class="fn cc ga nc">
+ <a href="/tag/nodejs" class="nd ne fo bc r jy nf a b fk">Nodejs</a>
+ </li>
+ <li class="fn cc ga nc">
+ <a href="/tag/performance" class="nd ne fo bc r jy nf a b fk">Performance</a>
+ </li>
+ <li class="fn cc ga nc">
+ <a href="/tag/cpu" class="nd ne fo bc r jy nf a b fk">Cpu</a>
+ </li>
+ <li class="fn cc ga nc">
+ <a href="/tag/profiling" class="nd ne fo bc r jy nf a b fk">Profiling</a>
+ </li>
+ <li class="fn cc ga nc">
+ <a href="/tag/inspector" class="nd ne fo bc r jy nf a b fk">Inspector</a>
+ </li>
+ </ul>
+ </div>
+ <div class="ng n dz y">
+ <div class="n o">
+ <div class="nh r hu">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_actions_footer-----d6e62af173e2---------------------clap_footer-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="c ni ed n o nj hu nk nl nm nn no np nq nr ns nt nu nv nw mk">
+ <div class="bl mp mq mr ms mt nx mv o ih ed n p ny u hy s t ai bf mw bp nz">
+ <svg width="33" height="33" viewbox="0 0 33 33">
+ <path d="M28.86 17.34l-3.64-6.4c-.3-.43-.71-.73-1.16-.8a1.12 1.12 0 0 0-.9.21c-.62.5-.73 1.18-.32 2.06l1.22 2.6 1.4 2.45c2.23 4.09 1.51 8-2.15 11.66a9.6 9.6 0 0 1-.8.71 6.53 6.53 0 0 0 4.3-2.1c3.82-3.82 3.57-7.87 2.05-10.39zm-6.25 11.08c3.35-3.35 4-6.78 1.98-10.47L21.2 12c-.3-.43-.71-.72-1.16-.8a1.12 1.12 0 0 0-.9.22c-.62.49-.74 1.18-.32 2.06l1.72 3.63a.5.5 0 0 1-.81.57l-8.91-8.9a1.33 1.33 0 0 0-1.89 1.88l5.3 5.3a.5.5 0 0 1-.71.7l-5.3-5.3-1.49-1.49c-.5-.5-1.38-.5-1.88 0a1.34 1.34 0 0 0 0 1.89l1.49 1.5 5.3 5.28a.5.5 0 0 1-.36.86.5.5 0 0 1-.36-.15l-5.29-5.29a1.34 1.34 0 0 0-1.88 0 1.34 1.34 0 0 0 0 1.89l2.23 2.23L9.3 21.4a.5.5 0 0 1-.36.85.5.5 0 0 1-.35-.14l-3.32-3.33a1.33 1.33 0 0 0-1.89 0 1.32 1.32 0 0 0-.39.95c0 .35.14.69.4.94l6.39 6.4c3.53 3.53 8.86 5.3 12.82 1.35zM12.73 9.26l5.68 5.68-.49-1.04c-.52-1.1-.43-2.13.22-2.89l-3.3-3.3a1.34 1.34 0 0 0-1.88 0 1.33 1.33 0 0 0-.4.94c0 .22.07.42.17.61zm14.79 19.18a7.46 7.46 0 0 1-6.41 2.31 7.92 7.92 0 0 1-3.67.9c-3.05 0-6.12-1.63-8.36-3.88l-6.4-6.4A2.31 2.31 0 0 1 2 19.72a2.33 2.33 0 0 1 1.92-2.3l-.87-.87a2.34 2.34 0 0 1 0-3.3 2.33 2.33 0 0 1 1.24-.64l-.14-.14a2.34 2.34 0 0 1 0-3.3 2.39 2.39 0 0 1 3.3 0l.14.14a2.33 2.33 0 0 1 3.95-1.24l.09.09c.09-.42.29-.83.62-1.16a2.34 2.34 0 0 1 3.3 0l3.38 3.39a2.17 2.17 0 0 1 1.27-.17c.54.08 1.03.35 1.45.76.1-.55.41-1.03.9-1.42a2.12 2.12 0 0 1 1.67-.4 2.8 2.8 0 0 1 1.85 1.25l3.65 6.43c1.7 2.83 2.03 7.37-2.2 11.6zM13.22.48l-1.92.89 2.37 2.83-.45-3.72zm8.48.88L19.78.5l-.44 3.7 2.36-2.84zM16.5 3.3L15.48 0h2.04L16.5 3.3z" fill-rule="evenodd"></path></svg>
+ </div>
+ </div></a>
+ </div>
+ <div class="mx r">
+ <div class="my">
+ <h4 class="ax ej ek az dg">
+ <button class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu">11 claps</button>
+ </h4>
+ </div>
+ </div>
+ </div>
+ <div class="n o">
+ <div class="fx r au">
+ <a href="//medium.com/p/d6e62af173e2/share/twitter?source=post_actions_footer---------------------------" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" target="_blank" rel="noopener nofollow"><svg width="29" height="29" class="q">
+ <path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></a>
+ </div>
+ <div class="fx r au">
+ <button class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="q">
+ <path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button>
+ </div>
+ <div class="fx r au">
+ <a href="//medium.com/p/d6e62af173e2/share/facebook?source=post_actions_footer---------------------------" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" target="_blank" rel="noopener nofollow"><svg width="29" height="29" class="q">
+ <path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></a>
+ </div>
+ <div class="oa r au">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_actions_footer--------------------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ </div>
+ </div>
+ <div class="ob bu oc nb r y">
+ <div class="od oe r hu">
+ <div class="r s oh oi">
+ <span class="r of al og"><a rel="noopener" href="/@vincentvallet?source=follow_footer--------------------------follow_footer-"><img alt="Vincent Vallet" class="r ed cj oj" src="https://miro.medium.com/fit/c/160/160/1*vFTVh_mYyf0p6m7f77A3vw.jpeg" width="80" height="80" /></a></span>
+ </div>
+ <div class="ok r ol">
+ <p class="ax ej fk az bc om on">
+ <span class="r of al og">Written by</span>
+ </p>
+ </div>
+ <div class="ok oo n ol">
+ <div class="ai n o dz">
+ <h2 class="ax ge op oq dg">
+ <span class="r of al og"><a class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener" href="/@vincentvallet?source=follow_footer--------------------------follow_footer-">Vincent Vallet</a></span>
+ </h2>
+ <div class="r g">
+ <span class="r of al og"><button class="or ex be bf mj bo bp mk bn fi ax b ay az ba bb fl fm cs fn fo bq">Follow</button></span>
+ </div>
+ </div>
+ </div>
+ <div class="ok os r ol bw">
+ <div class="ot r">
+ <h4 class="ax ej md ou bc"></h4>
+ </div>
+ <div class="bv ov bw">
+ <button class="or ex be bf mj bo bp mk bn fi ax b ay az ba bb fl fm cs fn fo bq">Follow</button>
+ </div>
+ </div>
+ </div>
+ <div class="ob r"></div>
+ <div class="od oe r hu">
+ <div class="r s oh oi">
+ <span class="r of al og"><a href="/voodoo-engineering?source=follow_footer--------------------------follow_footer-" rel="noopener"><img alt="Voodoo Engineering" class="fi oj cj" src="https://miro.medium.com/fit/c/160/160/1*ID7_awC5r-U-zTXrW6w0zA.jpeg" width="80" height="80" /></a></span>
+ </div>
+ <div class="ok oo n ol">
+ <div class="ai n o dz">
+ <h2 class="ax ge op oq dg">
+ <span class="r of al og"><a href="/voodoo-engineering?source=follow_footer--------------------------follow_footer-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">Voodoo Engineering</a></span>
+ </h2>
+ <div class="r g">
+ <div class="fn" aria-hidden="true">
+ <span class="r of al og"><button class="mi ex be bf mj bo bp mk bn fi ax b ay az ba bb fl fm cs fn fo bq">Follow</button></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="ok ow r ol bw">
+ <div class="ot r">
+ <h4 class="ax ej md ou bc">
+ Learn about Voodoo’s engineering efforts.
+ </h4>
+ </div>
+ <div class="bv ov bw">
+ <div class="fn" aria-hidden="true">
+ <button class="mi ex be bf mj bo bp mk bn fi ax b ay az ba bb fl fm cs fn fo bq">Follow</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="ox bu r y">
+ <a href="https://medium.com/p/d6e62af173e2/responses/show?source=follow_footer--------------------------follow_footer-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="jx oz fi r ik g">
+ <span class="iq oy ms"><span class="be">Write the first response</span></span>
+ </div></a>
+ </div>
+ </div>
+ </div>
+ <div class="pa r pb y">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="pc r pd">
+ <div class="pe mc od r">
+ <h2 class="ax ge pf pg dg">
+ More From Medium
+ </h2>
+ </div>
+ <div class="cg n ph na pi pj pk pl pm pn po pp pq pr ps pt pu pv pw">
+ <div class="px py pz la qa qb qc lc qd qe qf le qg qh qi qj qk ql qm qn qo">
+ <div class="ai hy">
+ <div class="r qp">
+ <div class="qq qr pi pj pk qs qt pl pm pn qu qv po pp pq qw qx pr ps pt qy qz pu pv pw n na">
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="ri r rj f">
+ <h4 class="ax ej ek az bc">
+ More on Nodejs from Voodoo Engineering
+ </h4>
+ </div>
+ <div class="rk r rl pd">
+ <a class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu r" rel="noopener" href="/voodoo-engineering/websockets-on-production-with-node-js-bdc82d07bb9f?source=post_recirc---------0------------------">
+ <div class="rm hu">
+ <div class="hy s ai">
+ <div class="rn r ro rp hy ai rq rr"></div>
+ </div>
+ </div></a>
+ </div>
+ </div>
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="rk r">
+ <div class="rs bv h rt">
+ <h4 class="ax ej ek az bc">
+ More on Nodejs from Voodoo Engineering
+ </h4>
+ </div><a rel="noopener" href="/voodoo-engineering/websockets-on-production-with-node-js-bdc82d07bb9f?source=post_recirc---------0------------------">
+ <h3 class="dg q dh ru ay ir rv rw">
+ WebSockets on production with Node.js
+ </h3></a>
+ </div>
+ <div class="n o dz">
+ <div class="rx r cb">
+ <div class="o n">
+ <div>
+ <a rel="noopener" href="/@vincentvallet?source=post_recirc---------0------------------"><img alt="Vincent Vallet" class="r ed ry rz" src="https://miro.medium.com/fit/c/80/80/1*vFTVh_mYyf0p6m7f77A3vw.jpeg" width="40" height="40" /></a>
+ </div>
+ <div class="eg ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="ck n o ei">
+ <span class="ax b ay az ba bb r dg q"><span class="ax ej ek az by el em en eo ep dg"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/@vincentvallet?source=post_recirc---------0------------------">Vincent Vallet</a> <span><!-- -->in<!-- --> <a href="/voodoo-engineering?source=post_recirc---------0------------------" class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener">Voodoo Engineering</a></span></span></span>
+ </div>
+ </div>
+ </div>
+ <div>
+ <span class="ax b ay az ba bb r bc bd"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/voodoo-engineering/websockets-on-production-with-node-js-bdc82d07bb9f?source=post_recirc---------0------------------">Mar 11</a> <!-- -->·<!-- --> <!-- -->5<!-- --> min read</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="n o">
+ <div class="n o">
+ <div class="mo r hu">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc-----bdc82d07bb9f----0-----------------clap_preview-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="bl mp mq mr ms mt mu mv sa sb sc">
+ <svg width="25" height="25" viewbox="0 0 25 25">
+ <g fill-rule="evenodd">
+ <path d="M11.74 0l.76 2.97.76-2.97zM14.81 3.78l1.84-2.56-1.42-.47zM8.38 1.22l1.84 2.56L9.8.75zM20.38 21.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M7.1 21.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L4.1 14.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L4.4 10.26 3.22 9.08a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L9.96 13a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L6.43 8.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L18.63 14c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM11 5.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 21 22.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg>
+ </div></a>
+ </div>
+ <div class="mx r">
+ <div class="my">
+ <h4 class="ax ej ek az bc">
+ 42
+ </h4>
+ </div>
+ </div>
+ </div>
+ <div class="sd eg rx se ar r"></div>
+ <div>
+ <div class="fn" role="tooltip" aria-hidden="true">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc---------0-----------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="px py pz la qa qb qc lc qd qe qf le qg qh qi qj qk ql qm qn qo">
+ <div class="ai hy">
+ <div class="r qp">
+ <div class="qq qr pi pj pk qs qt pl pm pn qu qv po pp pq qw qx pr ps pt qy qz pu pv pw n na">
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="ri r rj f">
+ <h4 class="ax ej ek az bc">
+ More on Nodejs from Voodoo Engineering
+ </h4>
+ </div>
+ <div class="rk r rl pd">
+ <a class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu r" rel="noopener" href="/voodoo-engineering/a-successful-voodoo-io-nodejs-meetup-on-13th-november-19b66e22711e?source=post_recirc---------1------------------">
+ <div class="rm hu">
+ <div class="hy s ai">
+ <div class="sf r ro rp hy ai rq rr"></div>
+ </div>
+ </div></a>
+ </div>
+ </div>
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="rk r">
+ <div class="rs bv h rt">
+ <h4 class="ax ej ek az bc">
+ More on Nodejs from Voodoo Engineering
+ </h4>
+ </div><a rel="noopener" href="/voodoo-engineering/a-successful-voodoo-io-nodejs-meetup-on-13th-november-19b66e22711e?source=post_recirc---------1------------------">
+ <h3 class="dg q dh ru ay ir rv rw">
+ A successful Voodoo.io NodeJS meetup on 13th November!
+ </h3></a>
+ </div>
+ <div class="n o dz">
+ <div class="rx r cb">
+ <div class="o n">
+ <div>
+ <a rel="noopener" href="/@aymeric_roffe?source=post_recirc---------1------------------"><img alt="Aymeric Roffé" class="r ed ry rz" src="https://miro.medium.com/fit/c/80/80/0*mufGR_aMLhWdVKIO.jpg" width="40" height="40" /></a>
+ </div>
+ <div class="eg ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="ck n o ei">
+ <span class="ax b ay az ba bb r dg q"><span class="ax ej ek az by el em en eo ep dg"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/@aymeric_roffe?source=post_recirc---------1------------------">Aymeric Roffé</a> <span><!-- -->in<!-- --> <a href="/voodoo-engineering?source=post_recirc---------1------------------" class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener">Voodoo Engineering</a></span></span></span>
+ </div>
+ </div>
+ </div>
+ <div>
+ <span class="ax b ay az ba bb r bc bd"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/voodoo-engineering/a-successful-voodoo-io-nodejs-meetup-on-13th-november-19b66e22711e?source=post_recirc---------1------------------">Nov 20, 2019</a> <!-- -->·<!-- --> <!-- -->3<!-- --> min read</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="n o">
+ <div class="n o">
+ <div class="mo r hu">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc-----19b66e22711e----1-----------------clap_preview-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="bl mp mq mr ms mt mu mv sa sb sc">
+ <svg width="25" height="25" viewbox="0 0 25 25">
+ <g fill-rule="evenodd">
+ <path d="M11.74 0l.76 2.97.76-2.97zM14.81 3.78l1.84-2.56-1.42-.47zM8.38 1.22l1.84 2.56L9.8.75zM20.38 21.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M7.1 21.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L4.1 14.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L4.4 10.26 3.22 9.08a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L9.96 13a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L6.43 8.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L18.63 14c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM11 5.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 21 22.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg>
+ </div></a>
+ </div>
+ <div class="mx r">
+ <div class="my">
+ <h4 class="ax ej ek az bc">
+ 5
+ </h4>
+ </div>
+ </div>
+ </div>
+ <div class="sd eg rx se ar r"></div>
+ <div>
+ <div class="fn" role="tooltip" aria-hidden="true">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc---------1-----------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="px py pz la qa qb qc lc qd qe qf le qg qh qi qj qk ql qm qn qo">
+ <div class="ai hy">
+ <div class="r qp">
+ <div class="qq qr pi pj pk qs qt pl pm pn qu qv po pp pq qw qx pr ps pt qy qz pu pv pw n na">
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="ri r rj f">
+ <h4 class="ax ej ek az bc">
+ Related reads
+ </h4>
+ </div>
+ <div class="rk r rl pd">
+ <a href="https://itnext.io/request-id-tracing-in-node-js-applications-c517c7dab62d?source=post_recirc---------2------------------" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu r" rel="noopener nofollow">
+ <div class="rm hu">
+ <div class="hy s ai">
+ <div class="sg r ro rp hy ai rq rr"></div>
+ </div>
+ </div></a>
+ </div>
+ </div>
+ <div class="px py pz la qa qb ra rb qd qe rc rd qg qh re rf qk ql rg rh qo">
+ <div class="rk r">
+ <div class="rs bv h rt">
+ <h4 class="ax ej ek az bc">
+ Related reads
+ </h4>
+ </div><a href="https://itnext.io/request-id-tracing-in-node-js-applications-c517c7dab62d?source=post_recirc---------2------------------" rel="noopener nofollow">
+ <h3 class="dg q dh ru ay ir rv rw">
+ Request Id Tracing in Node.js Applications
+ </h3></a>
+ </div>
+ <div class="n o dz">
+ <div class="rx r cb">
+ <div class="o n">
+ <div>
+ <a rel="noopener" href="/@apechkurov?source=post_recirc---------2------------------"><img alt="Andrey Pechkurov" class="r ed ry rz" src="https://miro.medium.com/fit/c/80/80/1*n5_aO67yi-62ToDsxnr4bw.png" width="40" height="40" /></a>
+ </div>
+ <div class="eg ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="ck n o ei">
+ <span class="ax b ay az ba bb r dg q"><span class="ax ej ek az by el em en eo ep dg"><a class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener" href="/@apechkurov?source=post_recirc---------2------------------">Andrey Pechkurov</a> <span><!-- -->in<!-- --> <a href="https://itnext.io/?source=post_recirc---------2------------------" class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener nofollow">ITNEXT</a></span></span></span>
+ </div>
+ </div>
+ </div>
+ <div>
+ <span class="ax b ay az ba bb r bc bd"><a href="https://itnext.io/request-id-tracing-in-node-js-applications-c517c7dab62d?source=post_recirc---------2------------------" class="eq er bg bh bi bj bk bl bm bn es bq br et eu" rel="noopener nofollow">Dec 6, 2018</a> <!-- -->·<!-- --> <!-- -->5<!-- --> min read</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="n o">
+ <div class="n o">
+ <div class="mo r hu">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc-----c517c7dab62d----2-----------------clap_preview-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener">
+ <div class="bl mp mq mr ms mt mu mv sa sb sc">
+ <svg width="25" height="25" viewbox="0 0 25 25">
+ <g fill-rule="evenodd">
+ <path d="M11.74 0l.76 2.97.76-2.97zM14.81 3.78l1.84-2.56-1.42-.47zM8.38 1.22l1.84 2.56L9.8.75zM20.38 21.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M7.1 21.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L4.1 14.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L4.4 10.26 3.22 9.08a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L9.96 13a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L6.43 8.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L18.63 14c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM11 5.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 21 22.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg>
+ </div></a>
+ </div>
+ <div class="mx r">
+ <div class="my">
+ <h4 class="ax ej ek az bc">
+ 827
+ </h4>
+ </div>
+ </div>
+ </div>
+ <div class="sd eg rx se ar r"></div>
+ <div>
+ <div class="fn" role="tooltip" aria-hidden="true">
+ <a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fvoodoo-engineering%2Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2&amp;source=post_recirc---------2-----------------bookmark_sidebar-" class="eq er bg bh bi bj bk bl bm bn fy fz bq br et eu" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="sh r si sj">
+ <section class="cp cq ai cs r sk sl sm sn so sp sq sr ss st su sv sw sx sy">
+ <div class="sz ta od n dz g">
+ <div class="tb n dz">
+ <div class="tc r td">
+ <div class="te r">
+ <a href="https://medium.com/about?autoplay=1&amp;source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn tf tg bq br th ti" rel="noopener">
+ <h4 class="tj tk tl ax ge ay ou tm tn r">
+ Discover <!-- -->Medium
+ </h4></a>
+ </div><span class="ax b ay az ba bb r to tp">Welcome to a place where words matter. On <!-- -->Medium<!-- -->, smart voices and original ideas take center stage - with no ads in sight.<!-- --> <a href="https://medium.com/about?autoplay=1&amp;source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn bq br th ti tq" rel="noopener">Watch</a></span>
+ </div>
+ <div class="tc r td">
+ <div class="pe r">
+ <a href="https://medium.com/topics?source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn tf tg bq br th ti" rel="noopener">
+ <h4 class="tj tk tl ax ge ay ou tm tn r">
+ Make <!-- -->Medium<!-- --> yours
+ </h4></a>
+ </div><span class="ax b ay az ba bb r to tp">Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox.<!-- --> <a href="https://medium.com/topics?source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn bq br th ti tq" rel="noopener">Explore</a></span>
+ </div>
+ <div class="tc r td">
+ <div class="te r">
+ <a class="eq er bg bh bi bj bk bl bm bn tf tg bq br th ti" rel="noopener" href="/membership?source=post_page-----d6e62af173e2----------------------">
+ <h4 class="tj tk tl ax ge ay ou tm tn r">
+ Become a member
+ </h4></a>
+ </div><span class="ax b ay az ba bb r to tp">Get unlimited access to the best stories on <!-- -->Medium<!-- --> — and support writers while you’re at it. Just $5/month.<!-- --> <a class="eq er bg bh bi bj bk bl bm bn bq br th ti tq" rel="noopener" href="/membership?source=post_page-----d6e62af173e2----------------------">Upgrade</a></span>
+ </div>
+ </div>
+ </div>
+ <div class="n o dz">
+ <a class="eq er bg bh bi bj bk bl bm bn tf tg bq br th ti" rel="noopener" href="/?source=post_page-----d6e62af173e2----------------------"><svg height="22" width="112" viewbox="0 0 111.5 22" class="tk">
+ <path d="M56.3 19.5c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5V19c-.7 1.8-2.4 3-4.3 3-3.3 0-5.8-2.6-5.8-7.5 0-4.5 2.6-7.6 6.3-7.6 1.6-.1 3.1.8 3.8 2.4V3.2c0-.3-.1-.6-.3-.7l-1.4-1.4V1l6.5-.8v19.3zm-4.8-.8V9.5c-.5-.6-1.2-.9-1.9-.9-1.6 0-3.1 1.4-3.1 5.7 0 4 1.3 5.4 3 5.4.8.1 1.6-.3 2-1zm9.1 3.1V9.4c0-.3-.1-.6-.3-.7l-1.4-1.5v-.1h6.5v12.5c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5zm-.2-19.2C60.4 1.2 61.5 0 63 0c1.4 0 2.6 1.2 2.6 2.6S64.4 5.3 63 5.3a2.6 2.6 0 0 1-2.6-2.7zm22.5 16.9c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5v-3.2c-.6 2-2.4 3.4-4.5 3.4-2.9 0-4.4-2.1-4.4-6.2 0-1.9 0-4.1.1-6.5 0-.3-.1-.5-.3-.7L67.7 7v.1H74v8c0 2.6.4 4.4 2 4.4.9-.1 1.7-.6 2.1-1.3V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v12.4zm22 2.3c0-.5.1-6.5.1-7.9 0-2.6-.4-4.5-2.2-4.5-.9 0-1.8.5-2.3 1.3.2.8.3 1.7.3 2.5 0 1.8-.1 4.2-.1 6.5 0 .3.1.5.3.7l1.5 1.4v.1H96c0-.4.1-6.5.1-7.9 0-2.7-.4-4.5-2.2-4.5-.9 0-1.7.5-2.2 1.3v9c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v3.1a4.6 4.6 0 0 1 4.6-3.4c2.2 0 3.6 1.2 4.2 3.5.7-2.1 2.7-3.6 4.9-3.5 2.9 0 4.5 2.2 4.5 6.2 0 1.9-.1 4.2-.1 6.5-.1.3.1.6.3.7l1.4 1.4v.1h-6.6zm-81.4-2l1.9 1.9v.1h-9.8v-.1l2-1.9c.2-.2.3-.4.3-.7V7.3c0-.5 0-1.2.1-1.8L11.4 22h-.1L4.5 6.8c-.1-.4-.2-.4-.3-.6v10c-.1.7 0 1.3.3 1.9l2.7 3.6v.1H0v-.1L2.7 18c.3-.6.4-1.3.3-1.9v-11c0-.5-.1-1.1-.5-1.5L.7 1.1V1h7l5.8 12.9L18.6 1h6.8v.1l-1.9 2.2c-.2.2-.3.5-.3.7v15.2c0 .2.1.5.3.6zm7.6-5.9c0 3.8 1.9 5.3 4.2 5.3 1.9.1 3.6-1 4.4-2.7h.1c-.8 3.7-3.1 5.5-6.5 5.5-3.7 0-7.2-2.2-7.2-7.4 0-5.5 3.5-7.6 7.3-7.6 3.1 0 6.4 1.5 6.4 6.2v.8h-8.7zm0-.8h4.3v-.8c0-3.9-.8-4.9-2-4.9-1.4.1-2.3 1.6-2.3 5.7z"></path></svg></a>
+ <div class="tr ts n dz tt al">
+ <span class="ax b ay az ba bb r to tp"><a href="https://medium.com/about?autoplay=1&amp;source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn es bq br th ti" rel="noopener">About</a><a href="https://help.medium.com/?source=post_page-----d6e62af173e2----------------------" class="eq er bg bh bi bj bk bl bm bn es bq br th ti" rel="noopener">Help</a><a class="eq er bg bh bi bj bk bl bm bn es bq br th ti" rel="noopener" href="/policy/9db0094a1e0f?source=post_page-----d6e62af173e2----------------------">Legal</a></span>
+ </div>
+ </div>
+ </section>
+ </div>
+ </div>
+ </div>
+ <script src="https://cdn.optimizely.com/js/16180790160.js"></script>
+ <script>
+ <![CDATA[
+ window.__BUILD_ID__ = "master-20200325-195611-72d3042672"
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__PRELOADED_STATE__ = {"config":{"nodeEnv":"production","version":"master-20200325-195611-72d3042672","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","lightStep":{"name":"lite-web","host":"collector-medium.lightstep.com","token":"ce5be895bef60919541332990ac9fef2","appVersion":"master-20200325-195611-72d3042672"},"algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","datadog":{"clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","context":{"deployment":{"target":"production","tag":"master-20200325-195611-72d3042672","commit":"72d30426726903f840536f508f97acfb0cc9a4e7"}},"datacenter":"us"},"sentry":{"dsn":"https:\u002F\[email protected]\u002F1423575","environment":"production"},"isAmp":false,"googleAnalyticsCode":"UA-24232453-2","signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumOwnedAndOperatedCollectionIds":["544c7006046e","bcc38c8f6edf","444d13b52878","8d6b8a439e32","92d2092dc598","1285ba81cada","cb8577c9149e","8ccfed20cbb2","ae2a65f35510","3f6ecf56618","7b6769f2748b","fc8964313712","ef8e90590e66","191186aaafa0","d944778ce714","bdc4052bbdba","88d9857e584e"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"internalLinksPostIds":["0000","0001","0002","0003"],"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"1*OMF3fSqH8t4xBJ9-6oZDZw.png","height":106,"width":545},"postLogo":{"imageId":"1*3sela1OADrJr7dJk_CXaEQ.png","height":810,"width":1440}},"performanceTags":[],"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*[email protected]","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*[email protected]","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*[email protected]","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"covidCollectionId":"8a9336e5bb4","embedPostRules":[]},"debug":{"requestId":"362f13d1-9bbb-4e1d-94b8-4c50f7fb3315","originalSpanCarrier":{"ot-tracer-spanid":"036cb79e1be8d2a3","ot-tracer-traceid":"13b077d2691fef38","ot-tracer-sampled":"true"}},"session":{"user":{"id":"lo_wtop8RY2OSAr"},"xsrf":""},"stats":{"itemCount":0,"sending":false,"timeout":null,"backup":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":true},"hideGoogleOneTap":false,"hasRenderedGoogleOneTap":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2","host":"medium.com","hostname":"medium.com","susiModal":{"step":null,"operation":"register","reportEventInfo":{"eventName":"","data":{}}},"postRead":false},"client":{"isBot":false,"isEu":false,"isLinkedin":false,"isNativeMedium":false,"isCustomDomain":false},"multiVote":{"clapsPerPost":{}}}
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__APOLLO_STATE__ = {"ROOT_QUERY":{"viewer":null,"variantFlags":[{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.0","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.1","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.2","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.3","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.4","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.5","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.6","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.7","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.8","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.9","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.10","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.11","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.12","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.13","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.14","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.15","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.16","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.17","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.18","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.19","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.20","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.21","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.22","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.23","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.24","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.25","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.26","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.27","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.28","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.29","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.30","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.31","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.32","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.33","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.34","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.35","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.36","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.37","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.38","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.39","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.40","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.41","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.42","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.43","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.44","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.45","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.46","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.47","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.48","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.49","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.50","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.51","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.52","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.53","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.54","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.55","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.56","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.57","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.58","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.59","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.60","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.61","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.62","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.63","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.64","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.65","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.66","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.67","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.68","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.69","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.70","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.71","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.72","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.73","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.74","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.75","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.76","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.77","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.78","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.79","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.80","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.81","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.82","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.83","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.84","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.85","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.86","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.87","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.88","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.89","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.90","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.91","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.92","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.93","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.94","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.95","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.96","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.97","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.98","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.99","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.100","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.101","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.102","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.103","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.104","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.105","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.106","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.107","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.108","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.109","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.110","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.111","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.112","typename":"VariantFlag"}],"meterPost({\"postId\":\"d6e62af173e2\",\"postMeteringOptions\":{}})":{"type":"id","generated":false,"id":"MeteringInfo:singleton","typename":"MeteringInfo"},"postResult({\"id\":\"d6e62af173e2\"})":{"type":"id","generated":false,"id":"Post:d6e62af173e2","typename":"Post"}},"ROOT_QUERY.variantFlags.0":{"name":"add_friction_to_signup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.0.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.0.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.1":{"name":"allow_access","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.1.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.1.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.2":{"name":"allow_signup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.2.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.2.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.3":{"name":"allow_test_auth","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.3.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.3.valueType":{"__typename":"VariantFlagString","value":"disallow"},"ROOT_QUERY.variantFlags.4":{"name":"assign_default_topic_to_posts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.4.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.4.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.5":{"name":"available_annual_plan","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.5.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.5.valueType":{"__typename":"VariantFlagString","value":"2c754bcc2995"},"ROOT_QUERY.variantFlags.6":{"name":"available_monthly_plan","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.6.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.6.valueType":{"__typename":"VariantFlagString","value":"60e220181034"},"ROOT_QUERY.variantFlags.7":{"name":"branch_seo_metadata","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.7.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.7.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.8":{"name":"browsable_stream_config_bucket","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.8.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.8.valueType":{"__typename":"VariantFlagString","value":"curated-topics"},"ROOT_QUERY.variantFlags.9":{"name":"covid_19_cdc_banner","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.9.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.9.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.10":{"name":"disable_android_subscription_activity_carousel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.10.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.10.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.11":{"name":"disable_gosocial_followers_that_you_follow","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.11.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.11.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.12":{"name":"disable_ios_resume_reading_toast","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.12.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.12.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.13":{"name":"disable_ios_subscription_activity_carousel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.13.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.13.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.14":{"name":"disable_mobile_featured_chunk","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.14.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.14.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.15":{"name":"disable_post_recommended_from_friends_provider","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.15.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.15.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.16":{"name":"enable_android_local_currency","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.16.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.16.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.17":{"name":"enable_annual_renewal_reminder_email","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.17.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.17.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.18":{"name":"enable_app_flirty_thirty","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.18.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.18.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.19":{"name":"enable_auto_tier","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.19.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.19.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.20":{"name":"enable_automated_mission_control_triggers","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.20.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.20.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.21":{"name":"enable_blue_small_meter","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.21.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.21.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.22":{"name":"enable_branch_io","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.22.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.22.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.23":{"name":"enable_branding","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.23.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.23.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.24":{"name":"enable_branding_fonts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.24.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.24.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.25":{"name":"enable_curation_priority_queue_experiment","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.25.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.25.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.26":{"name":"enable_dedicated_series_tab_api_ios","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.26.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.26.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.27":{"name":"enable_different_grid","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.27.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.27.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.28":{"name":"enable_digest_feature_logging","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.28.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.28.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.29":{"name":"enable_disregard_trunc_state_for_footer","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.29.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.29.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.30":{"name":"enable_edit_alt_text","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.30.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.30.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.31":{"name":"enable_email_sign_in_captcha","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.31.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.31.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.32":{"name":"enable_embedding_based_diversification","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.32.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.32.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.33":{"name":"enable_ev_mission_email_v3","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.33.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.33.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.34":{"name":"enable_expanded_feature_chunk_pool","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.34.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.34.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.35":{"name":"enable_filter_by_resend_rules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.35.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.35.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.36":{"name":"enable_filter_expire_processor","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.36.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.36.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.37":{"name":"enable_first_name_on_paywall","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.37.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.37.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.38":{"name":"enable_free_corona_topic","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.38.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.38.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.39":{"name":"enable_google_one_tap","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.39.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.39.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.40":{"name":"enable_ios_post_stats","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.40.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.40.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.41":{"name":"enable_janky_spam_rules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.41.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.41.valueType":{"__typename":"VariantFlagString","value":"users,posts"},"ROOT_QUERY.variantFlags.42":{"name":"enable_json_logs_trained_ranker","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.42.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.42.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.43":{"name":"enable_kafka_events","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.43.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.43.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.44":{"name":"enable_kbfd_rex","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.44.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.44.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.45":{"name":"enable_kbfd_rex_app_highlights","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.45.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.45.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.46":{"name":"enable_kbfd_rex_daily_digest","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.46.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.46.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.47":{"name":"enable_li_open_in_app","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.47.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.47.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.48":{"name":"enable_lite_notifications","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.48.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.48.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.49":{"name":"enable_lite_post","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.49.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.49.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.50":{"name":"enable_lite_post_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.50.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.50.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.51":{"name":"enable_lite_post_highlights","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.51.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.51.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.52":{"name":"enable_lite_post_highlights_view_only","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.52.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.52.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.53":{"name":"enable_lite_profile","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.53.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.53.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.54":{"name":"enable_lite_pub_header_menu","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.54.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.54.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.55":{"name":"enable_lite_server_upstream_deadlines","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.55.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.55.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.56":{"name":"enable_lite_stories","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.56.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.56.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.57":{"name":"enable_lite_topics","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.57.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.57.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.58":{"name":"enable_lite_unread_notification_count_mutation","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.58.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.58.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.59":{"name":"enable_lo_homepage","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.59.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.59.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.60":{"name":"enable_lo_meter_swap","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.60.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.60.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.61":{"name":"enable_lo_open_in_app","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.61.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.61.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.62":{"name":"enable_logged_out_homepage_signup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.62.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.62.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.63":{"name":"enable_login_code_flow","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.63.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.63.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.64":{"name":"enable_marketing_emails","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.64.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.64.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.65":{"name":"enable_media_resource_try_catch","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.65.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.65.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.66":{"name":"enable_membership_remove_section_a","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.66.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.66.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.67":{"name":"enable_minimal_meter_v2","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.67.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.67.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.68":{"name":"enable_miro_on_kubernetes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.68.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.68.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.69":{"name":"enable_mk_branch_cleanup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.69.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.69.valueType":{"__typename":"VariantFlagString","value":"app-button"},"ROOT_QUERY.variantFlags.70":{"name":"enable_ml_rank_modules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.70.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.70.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.71":{"name":"enable_monthly_membership_default","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.71.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.71.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.72":{"name":"enable_more_on_coronavirus","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.72.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.72.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.73":{"name":"enable_mute","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.73.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.73.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.74":{"name":"enable_new_collaborative_filtering_data","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.74.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.74.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.75":{"name":"enable_new_suspended_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.75.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.75.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.76":{"name":"enable_new_three_dot_menu","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.76.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.76.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.77":{"name":"enable_newsletter_v3_landing_for_covid_only","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.77.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.77.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.78":{"name":"enable_optimizely","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.78.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.78.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.79":{"name":"enable_pardon_the_interruption_removal","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.79.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.79.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.80":{"name":"enable_parsely","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.80.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.80.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.81":{"name":"enable_patronus_on_kubernetes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.81.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.81.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.82":{"name":"enable_popularity_feature","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.82.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.82.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.83":{"name":"enable_post_import","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.83.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.83.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.84":{"name":"enable_post_page_nav_stickiness_removal","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.84.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.84.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.85":{"name":"enable_post_seo_settings_screen","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.85.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.85.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.86":{"name":"enable_post_settings_screen","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.86.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.86.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.87":{"name":"enable_primary_topic_for_mobile","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.87.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.87.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.88":{"name":"enable_rito_upstream_deadlines","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.88.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.88.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.89":{"name":"enable_rtr_channel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.89.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.89.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.90":{"name":"enable_save_to_medium","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.90.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.90.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.91":{"name":"enable_starspace","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.91.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.91.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.92":{"name":"enable_suggest_account","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.92.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.92.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.93":{"name":"enable_suggest_account_li","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.93.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.93.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.94":{"name":"enable_tick_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.94.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.94.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.95":{"name":"enable_tipalti_onboarding","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.95.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.95.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.96":{"name":"enable_topic_lifecycle_email","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.96.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.96.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.97":{"name":"enable_tribute_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.97.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.97.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.98":{"name":"enable_trumpland_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.98.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.98.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.99":{"name":"featured_fc_and_ydr","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.99.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.99.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.100":{"name":"filter_low_scoring_users","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.100.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.100.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.101":{"name":"glyph_font_set","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.101.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.101.valueType":{"__typename":"VariantFlagString","value":"m2"},"ROOT_QUERY.variantFlags.102":{"name":"google_sign_in_android","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.102.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.102.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.103":{"name":"is_not_medium_subscriber","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.103.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.103.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.104":{"name":"new_transition_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.104.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.104.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.105":{"name":"pardon_the_interruption_4","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.105.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.105.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.106":{"name":"pub_sidebar","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.106.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.106.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.107":{"name":"rank_model","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.107.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.107.valueType":{"__typename":"VariantFlagString","value":"default"},"ROOT_QUERY.variantFlags.108":{"name":"redis_read_write_splitting","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.108.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.108.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.109":{"name":"share_post_linkedin","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.109.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.109.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.110":{"name":"signin_services","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.110.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.110.valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"},"ROOT_QUERY.variantFlags.111":{"name":"signup_services","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.111.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.111.valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"},"ROOT_QUERY.variantFlags.112":{"name":"use_new_admin_topic_backend","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.112.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.112.valueType":{"__typename":"VariantFlagBoolean","value":true},"MeteringInfo:singleton":{"__typename":"MeteringInfo","postIds":{"type":"json","json":[]},"maxUnlockCount":3,"unlocksRemaining":3},"Post:d6e62af173e2":{"__typename":"Post","id":"d6e62af173e2","visibility":"PUBLIC","latestPublishedVersion":"f7ff17b467b5","collection":{"type":"id","generated":false,"id":"Collection:6965894c8b8f","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:ead7e4ca29dd","typename":"User"},"isLocked":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","sequence":null,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fnode-js-and-cpu-profiling-on-production-in-real-time-without-downtime-d6e62af173e2","canonicalUrl":"","content({\"postMeteringOptions\":{}})":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}})","typename":"PostContent"},"firstPublishedAt":1571419414816,"isPublished":true,"layerCake":0,"primaryTopic":null,"title":"Node.js and CPU profiling on production (in real-time without downtime)","isLimitedState":false,"pendingCollection":null,"shareKey":null,"statusForCollection":"APPROVED","readingTime":7.216037735849056,"readingList":"READING_LIST_NONE","allowResponses":true,"clapCount":11,"viewerClapCount":0,"license":"ALL_RIGHTS_RESERVED","tags":[{"type":"id","generated":false,"id":"Tag:nodejs","typename":"Tag"},{"type":"id","generated":false,"id":"Tag:performance","typename":"Tag"},{"type":"id","generated":false,"id":"Tag:cpu","typename":"Tag"},{"type":"id","generated":false,"id":"Tag:profiling","typename":"Tag"},{"type":"id","generated":false,"id":"Tag:inspector","typename":"Tag"}],"topics":[],"recirc({\"paging\":{\"limit\":3}})":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}})","typename":"RecircItemConnection"},"voterCount":7,"recommenders":[],"postResponses":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.postResponses","typename":"PostResponses"},"responsesCount":0,"collaborators":[{"type":"id","generated":false,"id":"Collaborator:d6e62af173e2-aa221ef5cd0d","typename":"Collaborator"}],"translationSourcePost":null,"newsletterId":"","inResponseToPostResult":null,"inResponseToMediaResource":null,"curationEligibleAt":0,"isDistributionAlertDismissed":false,"audioVersionUrl":"","seoTitle":"","socialTitle":"","socialDek":"","metaDescription":"How to run a CPU profiling with Node.js on your production in real-time and without interruption of service.","latestPublishedAt":1571419414816,"previewContent":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.previewContent","typename":"PreviewContent"},"previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*EO-pr4RolgcAOj_Uk1rpDA.png","typename":"ImageMetadata"},"updatedAt":1571419415066,"seoDescription":"","isSuspended":false},"Collection:6965894c8b8f":{"id":"6965894c8b8f","domain":null,"slug":"voodoo-engineering","__typename":"Collection","isAuroraVisible":false,"googleAnalyticsId":null,"customStyleSheet":null,"colorBehavior":"ACCENT_COLOR","favicon":{"type":"id","generated":false,"id":"ImageMetadata:","typename":"ImageMetadata"},"name":"Voodoo Engineering","logo":{"type":"id","generated":false,"id":"ImageMetadata:1*_LkVyEmY2-W1rlZD2__W5g.jpeg","typename":"ImageMetadata"},"avatar":{"type":"id","generated":false,"id":"ImageMetadata:1*ID7_awC5r-U-zTXrW6w0zA.jpeg","typename":"ImageMetadata"},"isEnrolledInHightower":false,"creator":{"type":"id","generated":false,"id":"User:2c3576658a8b","typename":"User"},"viewerIsEditor":false,"navItems":[],"colorPalette":{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette","typename":"ColorPalette"},"viewerCanEditOwnPosts":false,"viewerCanEditPosts":false,"viewerIsMuting":false,"description":"Learn about Voodoo’s engineering efforts.","viewerIsFollowing":false,"viewerIsSubscribedToLetters":false,"isUserSubscribedToCollectionEmails":false,"ampEnabled":false,"twitterUsername":null,"facebookPageId":null,"tagline":"Learn about Voodoo’s engineering efforts."},"User:ead7e4ca29dd":{"id":"ead7e4ca29dd","__typename":"User","isSuspended":false,"allowNotes":true,"name":"Vincent Vallet","isFollowing":null,"username":"vincentvallet","bio":"","imageId":"1*vFTVh_mYyf0p6m7f77A3vw.jpeg","mediumMemberAt":0,"isBlocking":null,"isMuting":null,"isPartnerProgramEnrolled":false,"twitterScreenName":""},"ImageMetadata:":{"id":"","__typename":"ImageMetadata"},"ImageMetadata:1*_LkVyEmY2-W1rlZD2__W5g.jpeg":{"id":"1*_LkVyEmY2-W1rlZD2__W5g.jpeg","originalWidth":2010,"originalHeight":1140,"__typename":"ImageMetadata"},"ImageMetadata:1*ID7_awC5r-U-zTXrW6w0zA.jpeg":{"id":"1*ID7_awC5r-U-zTXrW6w0zA.jpeg","__typename":"ImageMetadata"},"User:2c3576658a8b":{"id":"2c3576658a8b","__typename":"User","name":"Aymeric Roffé","username":"aymeric_roffe","bio":"","isFollowing":null,"imageId":"0*mufGR_aMLhWdVKIO.jpg","mediumMemberAt":0},"$Collection:6965894c8b8f.colorPalette":{"tintBackgroundSpectrum":null,"__typename":"ColorPalette","defaultBackgroundSpectrum":{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum","typename":"ColorSpectrum"},"highlightSpectrum":{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum","typename":"ColorSpectrum"}},"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum":{"backgroundColor":"#FFFFFFFF","colorPoints":[{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.0","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.1","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.2","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.3","typename":"ColorPoint"}],"__typename":"ColorSpectrum"},"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.0":{"color":"#FF02B875","point":0,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.1":{"color":"#FF00AB6B","point":0.1,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.2":{"color":"#FF1C9963","point":0.2,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.defaultBackgroundSpectrum.colorPoints.3":{"color":"#FF092E20","point":1,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum":{"backgroundColor":"#FFFFFFFF","colorPoints":[{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.0","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.1","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.2","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.3","typename":"ColorPoint"},{"type":"id","generated":true,"id":"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.4","typename":"ColorPoint"}],"__typename":"ColorSpectrum"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.0":{"color":"#FFFFFFFF","point":0,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.1":{"color":"#FFE9FDF0","point":0.1,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.2":{"color":"#FFE2FAEE","point":0.2,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.3":{"color":"#FFADFFCF","point":0.6,"__typename":"ColorPoint"},"$Collection:6965894c8b8f.colorPalette.highlightSpectrum.colorPoints.4":{"color":"#FF7DFFB3","point":1,"__typename":"ColorPoint"},"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}})":{"isLockedPreviewOnly":false,"validatedShareKey":"","__typename":"PostContent","bodyModel":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}}).bodyModel","typename":"RichText"}},"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}}).bodyModel.sections.0":{"name":"40b1","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}}).bodyModel":{"sections":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.content({\"postMeteringOptions\":{}}).bodyModel.sections.0","typename":"Section"}],"paragraphs":[{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_0","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_1","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_2","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_3","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_4","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_5","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_6","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_7","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_8","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_9","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_10","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_11","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_12","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_13","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_14","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_15","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_16","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_17","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_18","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_19","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_20","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_21","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_22","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_23","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_24","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_25","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_26","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_27","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_28","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_29","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_30","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_31","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_32","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_33","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_34","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_35","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_36","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_37","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_38","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_39","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_40","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_41","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_42","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_43","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_44","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_45","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_46","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_47","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_48","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_49","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_50","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_51","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_52","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_53","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_54","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_55","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_56","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_57","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_58","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_59","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_60","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_61","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_62","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_63","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_64","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_65","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_66","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_67","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_68","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_69","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_70","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_71","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_72","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_73","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_74","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_75","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_76","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_77","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_78","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_79","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_80","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_81","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_82","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_83","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_84","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_85","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_86","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_87","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_88","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_89","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_90","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_91","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_92","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_93","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_94","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_95","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_96","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_97","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_98","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:f7ff17b467b5_99","typename":"Paragraph"}],"__typename":"RichText"},"Paragraph:f7ff17b467b5_0":{"id":"f7ff17b467b5_0","name":"daf0","type":"H3","href":null,"layout":null,"metadata":null,"text":"Node.js and CPU profiling on production (in real-time without downtime)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_1":{"id":"f7ff17b467b5_1","name":"0231","type":"H3","href":null,"layout":null,"metadata":null,"text":"Why CPU monitoring is important?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_2":{"id":"f7ff17b467b5_2","name":"d2c1","type":"P","href":null,"layout":null,"metadata":null,"text":"I work at Voodoo, a French company that creates mobile video games. We have a lot of challenges with performance, availability, and scalability because of the insane amount of traffic our infrastructure supports (billions of events\u002Frequests per day …… no joke!). In this setting, every metric is important and gives us a lot of information about the state of our system.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_2.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_2.markups.0":{"type":"A","start":10,"end":16,"href":"http:\u002F\u002Fvoodoo.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_3":{"id":"f7ff17b467b5_3","name":"0e89","type":"P","href":null,"layout":null,"metadata":null,"text":"When working with Node.js one of the most critical resources to monitor is the CPU. Most of the time, when working on a low traffic API or project we don’t realize how many simple lines of code can have a huge impact on CPU. On the other hand, when traffic increases, a simple mistake can cost dearly.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_4":{"id":"f7ff17b467b5_4","name":"292e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Resources","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_5":{"id":"f7ff17b467b5_5","name":"1efa","type":"P","href":null,"layout":null,"metadata":null,"text":"What kind of resources does your application need? In most cases, we focus on memory and CPU. Good monitoring of these two elements is mandatory for an application running on production.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_6":{"id":"f7ff17b467b5_6","name":"dce9","type":"P","href":null,"layout":null,"metadata":null,"text":"For memory, constant monitoring is the best practice to track the worst developer nightmare a.k.a memory leak.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_7":{"id":"f7ff17b467b5_7","name":"a38c","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*5o3M5niyi911waUrKWVZ0Q.png","typename":"ImageMetadata"},"text":"Memory leak in action","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*5o3M5niyi911waUrKWVZ0Q.png":{"id":"1*5o3M5niyi911waUrKWVZ0Q.png","originalHeight":970,"originalWidth":1894,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_8":{"id":"f7ff17b467b5_8","name":"69dd","type":"P","href":null,"layout":null,"metadata":null,"text":"A good way to debug memory leak is a memory dump and\u002For memory sampling but this is not the subject.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_9":{"id":"f7ff17b467b5_9","name":"1fbc","type":"P","href":null,"layout":null,"metadata":null,"text":"(for more details about V8 and its garbage collector you can read my previous article here)","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_9.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_9.markups.0":{"type":"A","start":86,"end":90,"href":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fnodejs-internals-v8-garbage-collector-a6eca82540ec","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_10":{"id":"f7ff17b467b5_10","name":"6f9a","type":"PQ","href":null,"layout":null,"metadata":null,"text":"Stay focused on the CPU!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_11":{"id":"f7ff17b467b5_11","name":"40e6","type":"P","href":null,"layout":null,"metadata":null,"text":"Most of the time we monitor this resource with a simple solution allowing us to get a graph representing CPU consumption over time. If we want to be reactive we add an alarm, based on a threshold, to warn us when CPU usage is too high.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_12":{"id":"f7ff17b467b5_12","name":"7b8b","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*8uOdeOfnUzTaFIY1r7oAMg.png","typename":"ImageMetadata"},"text":"Basic CPU monitoring","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*8uOdeOfnUzTaFIY1r7oAMg.png":{"id":"1*8uOdeOfnUzTaFIY1r7oAMg.png","originalHeight":230,"originalWidth":997,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_13":{"id":"f7ff17b467b5_13","name":"0728","type":"P","href":null,"layout":null,"metadata":null,"text":"And what next? We don’t have data about the state of the instance when the CPU usage has increased. So we can’t determine why we had this peak, at least not without an important time of debugging, comparing log, etc. This is exactly why you need to use CPU profiling.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_14":{"id":"f7ff17b467b5_14","name":"8d00","type":"H3","href":null,"layout":null,"metadata":null,"text":"CPU profiling: what’s the difference with CPU monitoring?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_15":{"id":"f7ff17b467b5_15","name":"19fb","type":"PQ","href":null,"layout":null,"metadata":null,"text":"“Most commonly, profiling information serves to aid program optimization. Profiling is achieved by instrumenting either the program source code or its binary executable form using a tool called a profiler”","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_16":{"id":"f7ff17b467b5_16","name":"3e11","type":"P","href":null,"layout":null,"metadata":null,"text":"Basically, for Node.js, CPU profiling is nothing more than collecting data about functions which are CPU consuming. And ideally, get a graphic representation of the collected data a.k.a “flame graph” or “flame chart”.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_17":{"id":"f7ff17b467b5_17","name":"91c5","type":"P","href":null,"layout":null,"metadata":null,"text":"It will help you to track the exact file, line, and function which takes the most time to execute.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_18":{"id":"f7ff17b467b5_18","name":"088b","type":"H3","href":null,"layout":null,"metadata":null,"text":"What about existing solutions?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_19":{"id":"f7ff17b467b5_19","name":"dd40","type":"H4","href":null,"layout":null,"metadata":null,"text":"Add arguments to Node.js","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_20":{"id":"f7ff17b467b5_20","name":"0306","type":"P","href":null,"layout":null,"metadata":null,"text":"Node.js provides a way to collect data about CPU with two command lines.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_21":{"id":"f7ff17b467b5_21","name":"66c8","type":"P","href":null,"layout":null,"metadata":null,"text":"The first command just executes your application, the argument just tells to V8 engine to collect data. When you stop your script all information is stored in a file.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_22":{"id":"f7ff17b467b5_22","name":"16bd","type":"PRE","href":null,"layout":null,"metadata":null,"text":"node --prof app.js","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_23":{"id":"f7ff17b467b5_23","name":"768f","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*e7gjTlzi55udTXbbPeEs2A.png","typename":"ImageMetadata"},"text":"Output of — prof","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*e7gjTlzi55udTXbbPeEs2A.png":{"id":"1*e7gjTlzi55udTXbbPeEs2A.png","originalHeight":534,"originalWidth":849,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_24":{"id":"f7ff17b467b5_24","name":"57a6","type":"P","href":null,"layout":null,"metadata":null,"text":"It is not very clear, is it?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_25":{"id":"f7ff17b467b5_25","name":"abed","type":"P","href":null,"layout":null,"metadata":null,"text":"That’s why you just need to run this second command to transform your raw file into a more human-readable output.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_26":{"id":"f7ff17b467b5_26","name":"061c","type":"PRE","href":null,"layout":null,"metadata":null,"text":"node --prof-process isolate-0xnnnnn-v8.log \u003E processed.txt","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_27":{"id":"f7ff17b467b5_27","name":"c6ab","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*JJkRh7JihTUo2apW_9ZXAQ.png","typename":"ImageMetadata"},"text":"The output of — prof-process","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*JJkRh7JihTUo2apW_9ZXAQ.png":{"id":"1*JJkRh7JihTUo2apW_9ZXAQ.png","originalHeight":306,"originalWidth":754,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_28":{"id":"f7ff17b467b5_28","name":"85fa","type":"P","href":null,"layout":null,"metadata":null,"text":"It seems better, here you can determine which function consumes the most of CPU (percentage of the time).","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_29":{"id":"f7ff17b467b5_29","name":"9e54","type":"H4","href":null,"layout":null,"metadata":null,"text":"ClinicJs","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_30":{"id":"f7ff17b467b5_30","name":"176a","type":"P","href":null,"layout":null,"metadata":null,"text":"ClinicJs is a set of tools that allow you to collect data and display performance charts. With “clinic flame” you can generate a flame graph based on CPU consumption.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_31":{"id":"f7ff17b467b5_31","name":"4aeb","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*6wi5BlNNnykjZs0PufrvLQ.png","typename":"ImageMetadata"},"text":"Flame chart","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*6wi5BlNNnykjZs0PufrvLQ.png":{"id":"1*6wi5BlNNnykjZs0PufrvLQ.png","originalHeight":1534,"originalWidth":2880,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_32":{"id":"f7ff17b467b5_32","name":"5347","type":"P","href":null,"layout":null,"metadata":null,"text":"But once again, you have to stop your app, launch the tool, then terminate the script in order to display the graph (files are generated on the disk).","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_33":{"id":"f7ff17b467b5_33","name":"d6e6","type":"P","href":null,"layout":null,"metadata":null,"text":"For more details, you can see the project.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_33.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_33.markups.0":{"type":"A","start":34,"end":41,"href":"https:\u002F\u002Fclinicjs.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_34":{"id":"f7ff17b467b5_34","name":"be18","type":"P","href":null,"layout":null,"metadata":null,"text":"To sum up, here is the list of drawbacks of the two previous solutions.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_34.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_34.markups.0":{"type":"STRONG","start":0,"end":9,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_35":{"id":"f7ff17b467b5_35","name":"3bef","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Downtime (you should kill your application to collect the data)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_36":{"id":"f7ff17b467b5_36","name":"c0df","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Performance overhead","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_37":{"id":"f7ff17b467b5_37","name":"27ec","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Data collected locally","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_38":{"id":"f7ff17b467b5_38","name":"a4fd","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Need external tools (ClinicJs)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_39":{"id":"f7ff17b467b5_39","name":"3f2c","type":"P","href":null,"layout":null,"metadata":null,"text":"In conclusion: these are good solutions to debug on development environments and\u002For on a local machine.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_40":{"id":"f7ff17b467b5_40","name":"fcd9","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Unfortunately, CPU issues have a worrying tendency to occur on production, and when you are not in front of your screen.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_41":{"id":"f7ff17b467b5_41","name":"13ef","type":"H3","href":null,"layout":null,"metadata":null,"text":"Inspector","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_42":{"id":"f7ff17b467b5_42","name":"294e","type":"P","href":null,"layout":null,"metadata":null,"text":"“Inspector” refers to an API thanks to which you can debug your application. By debugging we mean to be able to connect directly to the core of Node.js to collect real-time data about the process.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_43":{"id":"f7ff17b467b5_43","name":"ea23","type":"P","href":null,"layout":null,"metadata":null,"text":"A module, available since version 8.x of Node.js, provides this kind of feature. There are two advantages to use it:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_44":{"id":"f7ff17b467b5_44","name":"ed54","type":"ULI","href":null,"layout":null,"metadata":null,"text":"it’s native (no additional installation required)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_45":{"id":"f7ff17b467b5_45","name":"7992","type":"ULI","href":null,"layout":null,"metadata":null,"text":"it can be used programmatically (no interruption)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_46":{"id":"f7ff17b467b5_46","name":"731f","type":"P","href":null,"layout":null,"metadata":null,"text":"And here is how to make a CPU profiling with this module:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_47":{"id":"f7ff17b467b5_47","name":"fb1e","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":{"type":"id","generated":true,"id":"$Paragraph:f7ff17b467b5_47.iframe","typename":"Iframe"},"mixtapeMetadata":null},"MediaResource:e6590d28762ae9dc52a79fab03d9bfb4":{"id":"e6590d28762ae9dc52a79fab03d9bfb4","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"CPU profiling with inspector","__typename":"MediaResource"},"$Paragraph:f7ff17b467b5_47.iframe":{"mediaResource":{"type":"id","generated":false,"id":"MediaResource:e6590d28762ae9dc52a79fab03d9bfb4","typename":"MediaResource"},"__typename":"Iframe"},"Paragraph:f7ff17b467b5_48":{"id":"f7ff17b467b5_48","name":"79d1","type":"P","href":null,"layout":null,"metadata":null,"text":"As you can see, all the data is returned in variable “profile”. Basically, it’s a simple JSON object representing all the call stack and the CPU consumption for each function. And if you want to use an Async\u002Fawait syntax you can install the module “inspector-api”.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_49":{"id":"f7ff17b467b5_49","name":"c085","type":"PRE","href":null,"layout":null,"metadata":null,"text":"npm install inspector-api --save","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_50":{"id":"f7ff17b467b5_50","name":"195d","type":"P","href":null,"layout":null,"metadata":null,"text":"It also comes with a built-in exporter to send data to S3, with this method you don’t write anything on the disk!","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_50.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_50.markups.0":{"type":"STRONG","start":76,"end":112,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_51":{"id":"f7ff17b467b5_51","name":"7085","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":{"type":"id","generated":true,"id":"$Paragraph:f7ff17b467b5_51.iframe","typename":"Iframe"},"mixtapeMetadata":null},"MediaResource:a5c2cfaff5b466e10f3f24ac0dee3dd1":{"id":"a5c2cfaff5b466e10f3f24ac0dee3dd1","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"CPU profiling with inspector-api module","__typename":"MediaResource"},"$Paragraph:f7ff17b467b5_51.iframe":{"mediaResource":{"type":"id","generated":false,"id":"MediaResource:a5c2cfaff5b466e10f3f24ac0dee3dd1","typename":"MediaResource"},"__typename":"Iframe"},"Paragraph:f7ff17b467b5_52":{"id":"f7ff17b467b5_52","name":"964f","type":"P","href":null,"layout":null,"metadata":null,"text":"If you use another storage system you can just collect the data and export it by yourself.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_53":{"id":"f7ff17b467b5_53","name":"e0f0","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":{"type":"id","generated":true,"id":"$Paragraph:f7ff17b467b5_53.iframe","typename":"Iframe"},"mixtapeMetadata":null},"MediaResource:a258a6f9cd216401571004e3dffd693b":{"id":"a258a6f9cd216401571004e3dffd693b","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"CPU profiling","__typename":"MediaResource"},"$Paragraph:f7ff17b467b5_53.iframe":{"mediaResource":{"type":"id","generated":false,"id":"MediaResource:a258a6f9cd216401571004e3dffd693b","typename":"MediaResource"},"__typename":"Iframe"},"Paragraph:f7ff17b467b5_54":{"id":"f7ff17b467b5_54","name":"848b","type":"H3","href":null,"layout":null,"metadata":null,"text":"And now, CPU profiling on-demand!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_55":{"id":"f7ff17b467b5_55","name":"6933","type":"P","href":null,"layout":null,"metadata":null,"text":"We have an API that we want to test with autocannon tool. At this step, our project is able to serve around 200 requests in 20 seconds. There is probably a mistake somewhere in the code which slows down our application.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_56":{"id":"f7ff17b467b5_56","name":"7948","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*cS9IXYGfMmgxaAUlC7oqOQ.png","typename":"ImageMetadata"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*cS9IXYGfMmgxaAUlC7oqOQ.png":{"id":"1*cS9IXYGfMmgxaAUlC7oqOQ.png","originalHeight":362,"originalWidth":847,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_57":{"id":"f7ff17b467b5_57","name":"fb78","type":"P","href":null,"layout":null,"metadata":null,"text":"But now, what if we want to trigger a CPU profiling remotely (without ssh connection to the server)? It’s possible using Websocket, SSE or any other technology to send a message to your instance.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_58":{"id":"f7ff17b467b5_58","name":"2c91","type":"P","href":null,"layout":null,"metadata":null,"text":"Here is a simple example of a server using the “ws” module to send a message to a unique instance.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_59":{"id":"f7ff17b467b5_59","name":"c1d6","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":{"type":"id","generated":true,"id":"$Paragraph:f7ff17b467b5_59.iframe","typename":"Iframe"},"mixtapeMetadata":null},"MediaResource:feef2118ed0761bda1c2821a47c2297b":{"id":"feef2118ed0761bda1c2821a47c2297b","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"WS server","__typename":"MediaResource"},"$Paragraph:f7ff17b467b5_59.iframe":{"mediaResource":{"type":"id","generated":false,"id":"MediaResource:feef2118ed0761bda1c2821a47c2297b","typename":"MediaResource"},"__typename":"Iframe"},"Paragraph:f7ff17b467b5_60":{"id":"f7ff17b467b5_60","name":"2206","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, it only works with one instance, but it’s a fake project to demonstrate the principle ;)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_61":{"id":"f7ff17b467b5_61","name":"e92d","type":"P","href":null,"layout":null,"metadata":null,"text":"Now we can request our server to ask it to send a message to our instance and start\u002Fstop a CPU profiling. In your instance, you can handle the CPU profiling like this:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_62":{"id":"f7ff17b467b5_62","name":"7d09","type":"IFRAME","href":null,"layout":"INSET_CENTER","metadata":null,"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":{"type":"id","generated":true,"id":"$Paragraph:f7ff17b467b5_62.iframe","typename":"Iframe"},"mixtapeMetadata":null},"MediaResource:8a678f3011fef4d2c8296408f0b552fe":{"id":"8a678f3011fef4d2c8296408f0b552fe","iframeSrc":"","iframeHeight":0,"iframeWidth":0,"title":"WS client side","__typename":"MediaResource"},"$Paragraph:f7ff17b467b5_62.iframe":{"mediaResource":{"type":"id","generated":false,"id":"MediaResource:8a678f3011fef4d2c8296408f0b552fe","typename":"MediaResource"},"__typename":"Iframe"},"Paragraph:f7ff17b467b5_63":{"id":"f7ff17b467b5_63","name":"c3d0","type":"P","href":null,"layout":null,"metadata":null,"text":"To sum up: we are able to trigger a CPU profiling, on-demand, in real-time, without interruption or connection to the server. Data can be collected on the disk (and extracted later) or can be sent to S3 (or any other system, PR are welcomed on the inspector-api project).","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_63.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_63.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_63.markups.0":{"type":"A","start":248,"end":269,"href":"https:\u002F\u002Fgithub.com\u002Fwallet77\u002Fv8-inspector-api","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_63.markups.1":{"type":"STRONG","start":0,"end":9,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_64":{"id":"f7ff17b467b5_64","name":"6e87","type":"BQ","href":null,"layout":null,"metadata":null,"text":"And because the profiler is a part of V8 itself, the format of the generated JSON file is compatible with the Chrome dev tools.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_65":{"id":"f7ff17b467b5_65","name":"1859","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*CANkRN_yzl9tfrGd2F41wQ.png","typename":"ImageMetadata"},"text":"CPU profiling before optimization","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*CANkRN_yzl9tfrGd2F41wQ.png":{"id":"1*CANkRN_yzl9tfrGd2F41wQ.png","originalHeight":708,"originalWidth":1144,"focusPercentX":null,"focusPercentY":null,"alt":"CPU profiling before optimization","__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_66":{"id":"f7ff17b467b5_66","name":"2cda","type":"P","href":null,"layout":null,"metadata":null,"text":"How can we identify an issue?","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_66.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_66.markups.0":{"type":"STRONG","start":0,"end":29,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_67":{"id":"f7ff17b467b5_67","name":"e0d2","type":"P","href":null,"layout":null,"metadata":null,"text":"A CPU profiling should be read like this:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_68":{"id":"f7ff17b467b5_68","name":"27e6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"the x-axis shows the stack profile population","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_69":{"id":"f7ff17b467b5_69","name":"194a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"the y-axis shows stack depth","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_70":{"id":"f7ff17b467b5_70","name":"e950","type":"P","href":null,"layout":null,"metadata":null,"text":"What does it mean?","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_70.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_70.markups.0":{"type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_71":{"id":"f7ff17b467b5_71","name":"174c","type":"P","href":null,"layout":null,"metadata":null,"text":"The larger is a box (a function call) the more it consumed CPU. So a good CPU profiling should look like a “flame” graph where each stack is the finest possible.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_72":{"id":"f7ff17b467b5_72","name":"48d9","type":"P","href":null,"layout":null,"metadata":null,"text":"In our example, every request try to generate a token. For this purpose, it calls the function pbkdf2 which is CPU consuming. Our CPU profile looks like a sequence of big blocks of time, like if the last function in the call stack takes 99% of the total time.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_73":{"id":"f7ff17b467b5_73","name":"d62c","type":"P","href":null,"layout":null,"metadata":null,"text":"The CPU profiling after optimizations, with the same time range.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_74":{"id":"f7ff17b467b5_74","name":"1325","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*87KlGgfbuWP38nAaQaj3xw.png","typename":"ImageMetadata"},"text":"CPU profiling after optimizations","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*87KlGgfbuWP38nAaQaj3xw.png":{"id":"1*87KlGgfbuWP38nAaQaj3xw.png","originalHeight":523,"originalWidth":930,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_75":{"id":"f7ff17b467b5_75","name":"10ee","type":"P","href":null,"layout":null,"metadata":null,"text":"As you can notice, we have to zoom to the profile if we want to see the call stack, because after optimizations the API was able to take a lot more traffic. Now every function in the call stack looks like a microtask.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_76":{"id":"f7ff17b467b5_76","name":"c339","type":"IMG","href":null,"layout":"OUTSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*EO-pr4RolgcAOj_Uk1rpDA.png","typename":"ImageMetadata"},"text":"Zoom in the CPU profiling","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*EO-pr4RolgcAOj_Uk1rpDA.png":{"id":"1*EO-pr4RolgcAOj_Uk1rpDA.png","originalHeight":576,"originalWidth":1844,"focusPercentX":null,"focusPercentY":null,"alt":"CPU profiling after optimization","__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_77":{"id":"f7ff17b467b5_77","name":"10f1","type":"P","href":null,"layout":null,"metadata":null,"text":"And now our application is able to serve more than 200,000 requests in 20 seconds; we increased the performance by a factor of 100k!","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_77.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_77.markups.0":{"type":"STRONG","start":83,"end":131,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_78":{"id":"f7ff17b467b5_78","name":"a52e","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*kfOK60PtmWx6iP681-qRcg.png","typename":"ImageMetadata"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*kfOK60PtmWx6iP681-qRcg.png":{"id":"1*kfOK60PtmWx6iP681-qRcg.png","originalHeight":362,"originalWidth":845,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:f7ff17b467b5_79":{"id":"f7ff17b467b5_79","name":"98b9","type":"H3","href":null,"layout":null,"metadata":null,"text":"More than just CPU profiling","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_80":{"id":"f7ff17b467b5_80","name":"e1ad","type":"P","href":null,"layout":null,"metadata":null,"text":"With the inspector module, you can do much more than just CPU profiling, here is a non-exhaustive list:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_81":{"id":"f7ff17b467b5_81","name":"eb04","type":"ULI","href":null,"layout":null,"metadata":null,"text":"memory dump & memory sampling","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_82":{"id":"f7ff17b467b5_82","name":"a9ea","type":"ULI","href":null,"layout":null,"metadata":null,"text":"code coverage","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_83":{"id":"f7ff17b467b5_83","name":"b896","type":"ULI","href":null,"layout":null,"metadata":null,"text":"use the debugger in real-time","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_84":{"id":"f7ff17b467b5_84","name":"06d2","type":"H3","href":null,"layout":null,"metadata":null,"text":"Warnings","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_85":{"id":"f7ff17b467b5_85","name":"731b","type":"P","href":null,"layout":null,"metadata":null,"text":"Every tool, even the most powerful, comes with its own disadvantages. If you enable the profiler and\u002For the debugger on your production you have to keep an eye on two things:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_86":{"id":"f7ff17b467b5_86","name":"e485","type":"P","href":null,"layout":null,"metadata":null,"text":"1) performance overhead","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_86.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_86.markups.0":{"type":"STRONG","start":0,"end":23,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_87":{"id":"f7ff17b467b5_87","name":"0513","type":"P","href":null,"layout":null,"metadata":null,"text":"A profiler needs to use CPU to work and it collects data into memory. The longer you let it run and the more CPU \u002F memory it will need. This is why you should begin with very short CPU profiling, no more than a few seconds between the start and stop command. And never forget to monitor the impact of the profiler on your own infrastructure. If everything is fine you can increase the time and the frequency of CPU profiling.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_88":{"id":"f7ff17b467b5_88","name":"049c","type":"P","href":null,"layout":null,"metadata":null,"text":"One more very important thing: never forget to always stop a started CPU profiling. You can add a timer to automatically call the stop function after a while.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_88.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_88.markups.0":{"type":"STRONG","start":31,"end":82,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_89":{"id":"f7ff17b467b5_89","name":"0656","type":"P","href":null,"layout":null,"metadata":null,"text":"2) security","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_89.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_89.markups.0":{"type":"STRONG","start":0,"end":11,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_90":{"id":"f7ff17b467b5_90","name":"7999","type":"P","href":null,"layout":null,"metadata":null,"text":"Using the inspector in Node.js it’s like opening the door of the core of your application. You should be very careful about who can use features like CPU profiling and\u002For the debugger. Never make the inspector “public” as being able to launch a feature from an unsafe route (not protected with an authentification mechanism). Even the collected data can be seen as critical, never send it to a system you do not trust.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_91":{"id":"f7ff17b467b5_91","name":"5618","type":"H3","href":null,"layout":null,"metadata":null,"text":"Conclusion","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_92":{"id":"f7ff17b467b5_92","name":"ae1a","type":"P","href":null,"layout":null,"metadata":null,"text":"CPU profiling is really a must-have tool for every developer. And now, with some precautions, we can run it on production thanks to the amazing work done by the V8 and Node.js team.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_93":{"id":"f7ff17b467b5_93","name":"1eab","type":"P","href":null,"layout":null,"metadata":null,"text":"The inspector module offers a lot more features than you can use to debug your application.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_94":{"id":"f7ff17b467b5_94","name":"0aba","type":"P","href":null,"layout":null,"metadata":null,"text":"I will write another article about using CPU profiling and the inspector on production on a high traffic project.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_95":{"id":"f7ff17b467b5_95","name":"3c5b","type":"H3","href":null,"layout":null,"metadata":null,"text":"Sources & links","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_96":{"id":"f7ff17b467b5_96","name":"d86d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fnodejs.org\u002Fapi\u002Finspector.html","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_96.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_96.markups.0":{"type":"A","start":0,"end":37,"href":"https:\u002F\u002Fnodejs.org\u002Fapi\u002Finspector.html","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_97":{"id":"f7ff17b467b5_97","name":"cc52","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002Fv8","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_97.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_97.markups.0":{"type":"A","start":0,"end":53,"href":"https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002Fv8","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_98":{"id":"f7ff17b467b5_98","name":"d331","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fmedium.com\u002Fnetflix-techblog\u002Fnode-js-in-flames-ddd073803aa4","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_98.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_98.markups.0":{"type":"A","start":0,"end":66,"href":"https:\u002F\u002Fmedium.com\u002Fnetflix-techblog\u002Fnode-js-in-flames-ddd073803aa4","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:f7ff17b467b5_99":{"id":"f7ff17b467b5_99","name":"6420","type":"ULI","href":null,"layout":null,"metadata":null,"text":"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Finspector-api","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:f7ff17b467b5_99.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:f7ff17b467b5_99.markups.0":{"type":"A","start":0,"end":43,"href":"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Finspector-api","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Tag:nodejs":{"id":"nodejs","displayTitle":"Nodejs","__typename":"Tag"},"Tag:performance":{"id":"performance","displayTitle":"Performance","__typename":"Tag"},"Tag:cpu":{"id":"cpu","displayTitle":"Cpu","__typename":"Tag"},"Tag:profiling":{"id":"profiling","displayTitle":"Profiling","__typename":"Tag"},"Tag:inspector":{"id":"inspector","displayTitle":"Inspector","__typename":"Tag"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0":{"__typename":"SuggestedPost","post":{"type":"id","generated":false,"id":"Post:bdc82d07bb9f","typename":"Post"},"postSuggestionReasons":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0","typename":"PostSuggestionReason"}]},"Post:bdc82d07bb9f":{"__typename":"Post","id":"bdc82d07bb9f","title":"WebSockets on production with Node.js","isLocked":false,"previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*PgziD8xisQlGXkWMjDGz5w.png","typename":"ImageMetadata"},"isPublished":true,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fwebsockets-on-production-with-node-js-bdc82d07bb9f","firstPublishedAt":1583920514760,"readingTime":4.082075471698113,"statusForCollection":"APPROVED","visibility":"PUBLIC","collection":{"type":"id","generated":false,"id":"Collection:6965894c8b8f","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:ead7e4ca29dd","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:bdc82d07bb9f.previewContent","typename":"PreviewContent"},"readingList":"READING_LIST_NONE","clapCount":42,"viewerClapCount":0,"isLimitedState":false,"voterCount":4,"recommenders":[]},"ImageMetadata:1*PgziD8xisQlGXkWMjDGz5w.png":{"id":"1*PgziD8xisQlGXkWMjDGz5w.png","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"$Post:bdc82d07bb9f.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0":{"reason":"POSTS_SHARING_COLLECTION_AND_TAGS","users":[],"topics":[],"collections":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0.collections.0","typename":"SuggestionReasonCollection"}],"tags":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0.tags.0","typename":"SuggestionReasonTag"}],"__typename":"PostSuggestionReason"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0.collections.0":{"name":"Voodoo Engineering","__typename":"SuggestionReasonCollection"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0.postSuggestionReasons.0.tags.0":{"name":"Nodejs","__typename":"SuggestionReasonTag"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1":{"__typename":"SuggestedPost","post":{"type":"id","generated":false,"id":"Post:19b66e22711e","typename":"Post"},"postSuggestionReasons":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0","typename":"PostSuggestionReason"}]},"Post:19b66e22711e":{"__typename":"Post","id":"19b66e22711e","title":"A successful Voodoo.io NodeJS meetup on 13th November!","isLocked":false,"previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*flvQZznQlpVs26M6SCL7DA.jpeg","typename":"ImageMetadata"},"isPublished":true,"mediumUrl":"https:\u002F\u002Fmedium.com\u002Fvoodoo-engineering\u002Fa-successful-voodoo-io-nodejs-meetup-on-13th-november-19b66e22711e","firstPublishedAt":1574277093966,"readingTime":2.6301886792452827,"statusForCollection":"APPROVED","visibility":"PUBLIC","collection":{"type":"id","generated":false,"id":"Collection:6965894c8b8f","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:2c3576658a8b","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:19b66e22711e.previewContent","typename":"PreviewContent"},"readingList":"READING_LIST_NONE","clapCount":5,"viewerClapCount":0,"isLimitedState":false,"voterCount":5,"recommenders":[]},"ImageMetadata:1*flvQZznQlpVs26M6SCL7DA.jpeg":{"id":"1*flvQZznQlpVs26M6SCL7DA.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"$Post:19b66e22711e.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0":{"reason":"POSTS_SHARING_COLLECTION_AND_TAGS","users":[],"topics":[],"collections":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0.collections.0","typename":"SuggestionReasonCollection"}],"tags":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0.tags.0","typename":"SuggestionReasonTag"}],"__typename":"PostSuggestionReason"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0.collections.0":{"name":"Voodoo Engineering","__typename":"SuggestionReasonCollection"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1.postSuggestionReasons.0.tags.0":{"name":"Nodejs","__typename":"SuggestionReasonTag"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.2":{"__typename":"SuggestedPost","post":{"type":"id","generated":false,"id":"Post:c517c7dab62d","typename":"Post"},"postSuggestionReasons":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.2.postSuggestionReasons.0","typename":"PostSuggestionReason"}]},"Post:c517c7dab62d":{"__typename":"Post","id":"c517c7dab62d","title":"Request Id Tracing in Node.js Applications","isLocked":false,"previewImage":{"type":"id","generated":false,"id":"ImageMetadata:0*sduEjXj8BCMSMYU1","typename":"ImageMetadata"},"isPublished":true,"mediumUrl":"https:\u002F\u002Fitnext.io\u002Frequest-id-tracing-in-node-js-applications-c517c7dab62d","firstPublishedAt":1544095557903,"readingTime":4.849056603773585,"statusForCollection":"APPROVED","visibility":"PUBLIC","collection":{"type":"id","generated":false,"id":"Collection:5b301f10ddcd","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:9a27eb90e406","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:c517c7dab62d.previewContent","typename":"PreviewContent"},"readingList":"READING_LIST_NONE","clapCount":827,"viewerClapCount":0,"isLimitedState":false,"voterCount":129,"recommenders":[]},"ImageMetadata:0*sduEjXj8BCMSMYU1":{"id":"0*sduEjXj8BCMSMYU1","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:5b301f10ddcd":{"name":"ITNEXT","id":"5b301f10ddcd","slug":"itnext","domain":"itnext.io","__typename":"Collection"},"User:9a27eb90e406":{"name":"Andrey Pechkurov","username":"apechkurov","id":"9a27eb90e406","bio":"Developer\u002Ftech lead with 10+ years of experience. Good at Java and Node.js. Architectural design and challenging problems are the things that I love.","isFollowing":null,"imageId":"1*n5_aO67yi-62ToDsxnr4bw.png","mediumMemberAt":0,"__typename":"User"},"$Post:c517c7dab62d.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.2.postSuggestionReasons.0":{"reason":"CF_POST_SIMILAR_TO_POST","users":[],"topics":[],"collections":[],"tags":[],"__typename":"PostSuggestionReason"},"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}})":{"items":[{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.0","typename":"SuggestedPost"},{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.1","typename":"SuggestedPost"},{"type":"id","generated":true,"id":"$Post:d6e62af173e2.recirc({\"paging\":{\"limit\":3}}).items.2","typename":"SuggestedPost"}],"__typename":"RecircItemConnection"},"$Post:d6e62af173e2.postResponses":{"count":0,"__typename":"PostResponses","responsesConnection({\"paging\":{\"limit\":10}})":{"type":"id","generated":true,"id":"$Post:d6e62af173e2.postResponses.responsesConnection({\"paging\":{\"limit\":10}})","typename":"StreamConnection"}},"Collaborator:d6e62af173e2-aa221ef5cd0d":{"id":"d6e62af173e2-aa221ef5cd0d","user":{"type":"id","generated":false,"id":"User:aa221ef5cd0d","typename":"User"},"state":"visible","__typename":"Collaborator"},"User:aa221ef5cd0d":{"id":"aa221ef5cd0d","name":"Clint FENTON","__typename":"User"},"$Post:d6e62af173e2.previewContent":{"subtitle":"Why CPU monitoring is important?","__typename":"PreviewContent"},"$Post:d6e62af173e2.postResponses.responsesConnection({\"paging\":{\"limit\":10}})":{"pagingInfo":null,"stream":[],"__typename":"StreamConnection"}}
+ ]]>
+ </script>
+ <script src="https://cdn-client.medium.com/lite/static/js/manifest.21b1a98a.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~main.240983a1.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/main.42357d13.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~screen.collection.packageBuilder~screen.collection.styleEditor~screen.debug.cachedPost~scree~21f3676b.263ac94e.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~screen.collection.styleEditor~screen.debug.cachedPost~screen.post~screen.post.amp~screen.pos~f728b060.d9e25162.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/screen.collection.packageBuilder~screen.collection.styleEditor~screen.debug.cachedPost~screen.landin~fb9a2ae7.959766bf.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/screen.debug.cachedPost~screen.landingpages.tribute~screen.post~screen.post.amp~screen.profile~scree~92ba8b36.76054969.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/screen.post.5bea7e74.chunk.js"></script>
+ <script>
+ <![CDATA[
+ window.main();
+ ]]>
+ </script>
+ <script defer="defer" src="https://static.cloudflareinsights.com/beacon.min.js" data-cf-beacon="{&quot;rayId&quot;:&quot;579f1b721efea934&quot;,&quot;version&quot;:&quot;2020.3.0&quot;,&quot;startTime&quot;:1585207207597}"></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-images.json
new file mode 100644
index 000000000..c85d51648
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-images.json
@@ -0,0 +1,3 @@
+[
+ "https:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/c_fill,f_auto,fl_progressive,g_center,h_675,pg_1,q_80,w_1200\/18zu12g5xzyxojpg.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-metadata.json
new file mode 100644
index 000000000..f1d0c6953
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Mama Robotnik",
+ "Direction": null,
+ "Excerpt": "Nothing beats the passion of a true fan writing about something they love. That's what you're about to see here: one of the richest, most amazing tributes to a great gaming series that we've ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon.",
+ "Image": "https:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/c_fill,f_auto,fl_progressive,g_center,h_675,pg_1,q_80,w_1200\/18zu12g5xzyxojpg.jpg",
+ "Title": "The Spectacular Story Of Metroid, One Of Gaming's Richest Universes",
+ "SiteName": "Kotaku"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected.html
new file mode 100644
index 000000000..c533fcfc9
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/expected.html
@@ -0,0 +1,1108 @@
+<div>
+ <figure data-id="18zu12g5xzyxojpg" data-recommend-id="image://18zu12g5xzyxojpg" data-format="jpg" data-width="970" data-height="546" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w" draggable="auto" data-chomp-id="18zu12g5xzyxojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ <em>Nothing beats the passion of a true fan writing about something they love. That's what you're about to see here: one of the richest, most amazing tributes to a great gaming series that we've ever run on</em> Kotaku<em>. <strong>Warning #1:</strong> this one might make your browser chug, so close your other tabs. <strong>Warning #2:</strong> This piece might make it hurt a little more than there are no new</em> Metroid <em>games from Nintendo on the horizon.</em>
+ </p>
+ <p>
+ <em>Please note that this is the first half of Mama Robotnik's massive</em> Metroid <em>story.</em> <span><a data-ga="[[&quot;Embedded Url&quot;,&quot;Internal link&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108&quot;,{&quot;metric25&quot;:1}]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108"><em>The second half can be found here</em></a></span><em>. The entire post is a greatly-expanded version of</em> <span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://www.neogaf.com/forum/showthread.php?t=649215&quot;,{&quot;metric25&quot;:1}]]" href="http://www.neogaf.com/forum/showthread.php?t=649215" target="_blank" rel="noopener noreferrer"><em>a post</em></a></span> <em>that Mama Robotnik originally published on the NeoGAF forum before revising and reworking it for Kotaku. Take it away, MR...</em>
+ </p>
+
+
+
+ <p>
+ Nintendo’s <em>Metroid</em> series tells us of a malevolent and vicious universe. It’s a maelstrom in which benevolent races are routinely extinguished, and corrupt empires wage war for ownership of living weapons.
+ </p>
+
+
+ <p>
+ It’s a place in which xenocide is a commissioned service, and grievances are resolved with planetary apocalypses. Everything is chaotically connected to a dead race of avian prophetic poets fighting a war throughout the cosmos. It’s a dark place to visit.
+ </p>
+ <p>
+ There are two purposes to this article: to explore the expansive lore of the <em>Metroid</em> universe – with speculation to fill in the gaps – and to exhibit some extraordinary <em>Metroid</em>-inspired art. All artwork is credited to its original source – follow the links to see further works of these spectacular artists.
+ </p>
+
+ <h3 id="h3288">
+ <a id></a>Notes on Speculation and Lore
+ </h3>
+ <p>
+ The games tell us much about this hostile universe, but there are a lot of unresolved story points. In response to these mysteries, the article will provide a healthy amount of speculation. You can consider the piece to be either a makeshift timeline illustrated with fan-artwork, or simply an enthusiastic attempt to reconcile the series continuity into a cohesive whole. The article is informed by the extensive research previously performed by its author. The approach taken regarding speculation is thus: The logical inclusion of probable events that resolve mysteries, while maintaining the themes of the series.
+ </p>
+
+ <p>
+ Before we begin, let’s briefly revisit the five points of essential lore:
+ </p>
+ <ul data-type="List" data-style="Bullet">
+ <li>Metroids are a genetically-engineered species, created by the Chozo in the prehistory of the games. By the time the first entry begins, Metroid creatures only exist on the planet SR388. At some point long before the games, there was also a Metroid presence on the planet Phaaze.
+ </li>
+ </ul>
+
+ <p>
+ <em>(Metroid IL Return of Samus, Metroid Prime III: Corruption and Metroid Fusion)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet">
+ <li>At least some Chozo possessed a native ability to see into the future.
+ </li>
+ </ul>
+ <p>
+ <em>(Metroid: Zero Mission and Metroid Prime)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet">
+ <li>The Chozo discovered the living planet Phaaze with their Elysian Research Outpost. We are not told what transpired immediately after this discovery, but something happened that caused at least one Metroid organism to appear on Phaaze. The planet then loaded this creature – along with pieces Chozo-style powersuit armour, into a Phazon seed and launched it towards a heavily populated Chozo planet. This seed impacted Tallon IV and is contained by the Chozo within an impenetrable shield. The mutated superevolved Metroid creature within – clad in crafted power armour – is trapped in the shield until Samus Aran deactivated it thousands of years later.
+ </li>
+ </ul>
+
+ <p>
+ <em>(Metroid Prime EU release, Metroid Prime III: Corruption and Metroid Prime Trilogy)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet">
+ <li>There are living planets in the <em>Metroid</em> Universe. Phaaze is explicitly referred to as being alive, and could interact with a sentient mind – as shown when a Galactic Federation Aurora Unit is implanted. The planet SR388 could be interpreted as having some form of sentience – it shook with apparent anger when its creatures were killed by Samus Aran, and precisely manipulated its oceans to lure the bounty hunter into hostile situations. (Metroid II: Return of Samus and Metroid Prime III: Corruption). The immediate backstory to the first game in the series is the discovery of the planet SR388. The final event of the final game in the chronology is the final destruction of SR388.
+ </li>
+ </ul>
+
+ <p>
+ <em>(Metroid, Metroid II: Return of Samus)</em>
+ </p>
+ <h3 id="h3289">
+ <a id></a>Referencing
+ </h3>
+ <p>
+ Each story section includes one or more of the below superscript annotations, to help inform the reader as to where the lore or speculation comes from. A brief key:
+ </p>
+ <figure data-id="18zqfwc3l0k28gif" data-recommend-id="image://18zqfwc3l0k28gif" data-format="gif" data-width="640" data-height="128" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+
+ </figure>
+
+ <p>
+ With all that said, let us begin.
+ </p>
+ <h2 id="h3290">
+ <a id></a>Part One: The Wars in Heaven
+ </h2>
+ <h3 id="h3291">
+ <a id></a>The Living Planet
+ </h3>
+ <figure data-id="18zqg21aub0sljpg" data-recommend-id="image://18zqg21aub0sljpg" data-format="jpg" data-width="640" data-height="488" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg21aub0sljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg21aub0sljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg21aub0sljpg.jpg 470w" draggable="auto" data-chomp-id="18zqg21aub0sljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg21aub0sljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg21aub0sljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg21aub0sljpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ <em>(</em><span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-dramatic-97410107&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-dramatic-97410107" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span><em>)</em>
+ </p>
+ <p>
+ On an unknown planet in the universe, a race of avian humanoids evolved. The species that will come to be known as the Chozo possessed great strength, agility and intelligence. The species is peaceful, and is driven by a social/religious value that nature is sacred. [M1 / MP]
+ </p>
+
+ <figure data-id="18zqg86aaay9kjpg" data-recommend-id="image://18zqg86aaay9kjpg" data-format="jpg" data-width="640" data-height="575" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg86aaay9kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg86aaay9kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg86aaay9kjpg.jpg 470w" draggable="auto" data-chomp-id="18zqg86aaay9kjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg86aaay9kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg86aaay9kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg86aaay9kjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-Goddess-121103720&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-Goddess-121103720" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ Certain blessed individuals were born with a unique gift – the vague comprehension of events set to take place in the distant future. Driven by these prophecies, the race advanced quickly and became space faring. With abstract predictions of a hostile universe, the Chozo developed powered armour and armaments to defend themselves. Prepared for whatever hostility awaited them, the Chozo explored the stars. [M1 / MP / MP SP]
+ </p>
+
+ <figure data-id="18zqgmn6fovtyjpg" data-recommend-id="image://18zqgmn6fovtyjpg" data-format="jpg" data-width="640" data-height="409" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgmn6fovtyjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgmn6fovtyjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgmn6fovtyjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgmn6fovtyjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgmn6fovtyjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgmn6fovtyjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgmn6fovtyjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<em>Artist: Elearia</em>)
+ </p>
+ <p>
+ The Chozo discovered that – despite their prophets’ visions of a chaotic and warring universe – the cosmos was enjoying a prolonged period of peace and enlightenment. First contact was made with a number of old and wise races, such as the Ylla, the N’kren, the Bryyonians, the Alimbic and the Luminoth. The species shared their cultures and technology, and gently colonised wild worlds such as Aether, Elysia, and Tallon IV. [MP / MPH / MP2 / MP3]
+ </p>
+
+ <figure data-id="18zqgp7wzq6v9jpg" data-recommend-id="image://18zqgp7wzq6v9jpg" data-format="jpg" data-width="640" data-height="503" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgp7wzq6v9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgp7wzq6v9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgp7wzq6v9jpg.jpg 470w" draggable="auto" data-chomp-id="18zqgp7wzq6v9jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgp7wzq6v9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgp7wzq6v9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgp7wzq6v9jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://slapshoft.deviantart.com/art/quot-Past-is-Prologue-quot-259977883&quot;,{&quot;metric25&quot;:1}]]" href="http://slapshoft.deviantart.com/art/quot-Past-is-Prologue-quot-259977883" target="_blank" rel="noopener noreferrer"><em>Artist: Slapshoft</em></a></span>)
+ </p>
+ <p>
+ Peace reigned through the cosmos. The alliance was a great universal renaissance, and lasted for a millennium. [MPH SP / MP2 SP / MP3 SP]
+ </p>
+
+ <figure data-id="18zqgqj9kac9hjpg" data-recommend-id="image://18zqgqj9kac9hjpg" data-format="jpg" data-width="640" data-height="426" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgqj9kac9hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgqj9kac9hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgqj9kac9hjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgqj9kac9hjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgqj9kac9hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgqj9kac9hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgqj9kac9hjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Oracle-of-Chozo-164523580&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Oracle-of-Chozo-164523580" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ During this calm, the Chozo prophets continued to receive increasingly severe visions of chaos. They foresaw a universe consumed by war, horrors evolving on distant worlds, and a great toxicity waiting to be unleashed. As the visions became more precise, the species isolated itself from its allies. The Chozo civilisation became intensely driven to fight this unclear threat. [MP / MP3 SP / M2 SP /MF SP]
+ </p>
+
+ <figure data-id="18zqgrykgsndujpg" data-recommend-id="image://18zqgrykgsndujpg" data-format="jpg" data-width="640" data-height="273" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgrykgsndujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgrykgsndujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgrykgsndujpg.jpg 470w" draggable="auto" data-chomp-id="18zqgrykgsndujpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgrykgsndujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgrykgsndujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgrykgsndujpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://danillovesfood.deviantart.com/art/Commission-Metroid-Prime-Skytown-Elysia-336095763&quot;,{&quot;metric25&quot;:1}]]" href="http://danillovesfood.deviantart.com/art/Commission-Metroid-Prime-Skytown-Elysia-336095763" target="_blank" rel="noopener noreferrer"><em>Artist: DanilLovesFood</em></a></span>)
+ </p>
+ <p>
+ The Chozo needed more potent tools to locate this unseen and distant danger. They expanded their SkyTown colony on the gas giant Elysia and remade it into a vast interstellar observatory powered by the planet’s endless storms. The facility was of such scale that an entire species of artificial life became necessary to maintain it. The Chozo created their first species – the mechanical Elysians. [MP3 / MP3 SP]
+ </p>
+
+ <p>
+ Probes were launched across the universe, and the Elysians and Chozo scrutinised the data. The search took generations, while the planet’s tempestuous atmosphere battered SkyTown, weathering the station faster than the Elysians could maintain it. After countless probe launches, a partial transmission received from a decaying and distant satellite set prophecy in motion. [MP3]
+ </p>
+ <figure data-id="18zqgtjse9p7rjpg" data-recommend-id="image://18zqgtjse9p7rjpg" data-format="jpg" data-width="640" data-height="375" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgtjse9p7rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgtjse9p7rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgtjse9p7rjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgtjse9p7rjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgtjse9p7rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgtjse9p7rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgtjse9p7rjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://mechanical-hand.deviantart.com/art/Phaaze-138141037&quot;,{&quot;metric25&quot;:1}]]" href="http://mechanical-hand.deviantart.com/art/Phaaze-138141037" target="_blank" rel="noopener noreferrer"><em>Artist: Mechanical-Hand</em></a></span>)
+ </p>
+ <p>
+ The data received was terrifying. The blue planet registered as an organism, somehow existing as both mineral and flesh. Impossible radiation pulsed from the surface, which overwhelmed the Chozo satellite and rendered it inert. The location of the planet was immediately lost, and only a broad region of space could be established. [MP3]
+ </p>
+
+ <p>
+ With this find, the Chozo purpose on SkyTown was fulfilled. The race departed the facility, leaving the Elysians to continue their monitoring of the stars. The abandoned race of robots continued to launch satellites to try and rediscover the blue world, hopeful that such a discovery would herald the return of their Chozo creators. The Elysians searched unsuccessfully until Elysia’s endless storms eroded their civilisation into a rusted remnant. [MP3]
+ </p>
+ <p>
+ The Chozo reconciled their vague discovery of a blue living planet with their prophecies of toxicity. On this distant world of poison, could creatures have evolved so vicious that they endangered the universe? [MP3 SP]
+ </p>
+
+ <h3 id="h3292">
+ <a id></a>The Invasion of Phaaze
+ </h3>
+ <figure data-id="18zqgy9h1t7injpg" data-recommend-id="image://18zqgy9h1t7injpg" data-format="jpg" data-width="640" data-height="399" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgy9h1t7injpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgy9h1t7injpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgy9h1t7injpg.jpg 470w" draggable="auto" data-chomp-id="18zqgy9h1t7injpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgy9h1t7injpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgy9h1t7injpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgy9h1t7injpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-flighter-175094535&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-flighter-175094535" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ Finding the exact location of the deadly planet becomes a priority for the Chozo civilisation. A gargantuan ship was assembled on the holy planet of Tallon IV, and dispatched to the dark corner of the universe where the Elysian satellite had been lost. The greatest Chozo warriors, scientists and prophets commenced a crusade for the hostile world, knowing that they would likely never make it back home. During their long journey, they conceive a name for their target: Phaaze. [MP3 SP]
+ </p>
+
+ <figure data-id="18zqhapd1bv1hjpg" data-recommend-id="image://18zqhapd1bv1hjpg" data-format="jpg" data-width="640" data-height="450" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhapd1bv1hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhapd1bv1hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhapd1bv1hjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhapd1bv1hjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhapd1bv1hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhapd1bv1hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhapd1bv1hjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/MP-C-Phaaze-89786422&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/MP-C-Phaaze-89786422" target="_blank" rel="noopener noreferrer"><em>Artist: SesakaTH</em></a></span>)
+ </p>
+ <p>
+ Generations passed, and the Chozo expedition finally located the blue planet. As they approached, they witnessed the living world as it endlessly pulsed with blue and white energies. There was nothing like this place elsewhere in the universe. [MP3 SP]
+ </p>
+
+ <p>
+ Their scans confirmed their worst fears – this atmosphere was a bath of radiation and mutation – and evolution had produced horrors. [MP3 SP]
+ </p>
+ <figure data-id="18zqhdvss5le8jpg" data-recommend-id="image://18zqhdvss5le8jpg" data-format="jpg" data-width="640" data-height="621" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhdvss5le8jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhdvss5le8jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhdvss5le8jpg.jpg 470w" draggable="auto" data-chomp-id="18zqhdvss5le8jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhdvss5le8jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhdvss5le8jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhdvss5le8jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://samusmmx.deviantart.com/art/Phazon-Worm-252806281&quot;,{&quot;metric25&quot;:1}]]" href="http://samusmmx.deviantart.com/art/Phazon-Worm-252806281" target="_blank" rel="noopener noreferrer"><em>Artist: SamusMMX</em></a></span>)
+ </p>
+ <p>
+ For billions of years, Phaaze had mutated and irradiated life that evolved on its surface. The strongest creatures had survived to thrive in an ecosystem of beautiful poison. It was then that the Chozo understood: They had arrived at the home of the most devastating and deranged creatures in the known universe. [MP3 SP]
+ </p>
+
+ <p>
+ If these monsters were to escape their containment on Phaaze, they would voraciously consume their way through the cosmos. With younger races only centuries away from space travel, the Chozo could not risk them finding this world and releasing its terrors. [MP3 SP]
+ </p>
+ <p>
+ The Chozo expedition came to an impasse. The threat of Phaaze’s superpredators had to be neutralised, but severe action against the planet would be sacrilege. The Chozo held life sacred, and refused to destroy the unique living world. [MP3 SP]
+ </p>
+
+ <p>
+ A dangerous plan was agreed upon. The expedition ship landed on Phaaze, exposing the crew to tremendous radiation. [MP3 SP]
+ </p>
+ <figure data-id="18zqhfmxw5dphjpg" data-recommend-id="image://18zqhfmxw5dphjpg" data-format="jpg" data-width="640" data-height="532" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhfmxw5dphjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhfmxw5dphjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhfmxw5dphjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhfmxw5dphjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhfmxw5dphjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhfmxw5dphjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhfmxw5dphjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://adoublea.deviantart.com/art/Metroid-Chozo-warrior-138820343&quot;,{&quot;metric25&quot;:1}]]" href="http://adoublea.deviantart.com/art/Metroid-Chozo-warrior-138820343" target="_blank" rel="noopener noreferrer"><em>Artist: Adoublea</em></a></span>)
+ </p>
+ <p>
+ Chozo Warriors in power suits fought the planet’s creatures as they swarmed the ship. The soldiers battled, watching their kin die around them, in a desperate mission to buy time. [MP3 SP]
+ </p>
+
+ <p>
+ The scientists within the ship began to harness the intense radiation around them, to try and engineer an artificial predator that could neutralise the planet’s superpredators. With access to the unique Phazon mutagen that covered the poisonous world, genetic engineering that should have taken decades was done in days. The Chozo engineered the first Metroid. [MP3 SP]
+ </p>
+ <figure data-id="18zqhh28q856sjpg" data-recommend-id="image://18zqhh28q856sjpg" data-format="jpg" data-width="640" data-height="598" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhh28q856sjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhh28q856sjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhh28q856sjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhh28q856sjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhh28q856sjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhh28q856sjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhh28q856sjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/Chozo-Creator-278707002&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/Chozo-Creator-278707002" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p>
+ The Metroid creature was unleashed onto the planet, and the radiation caused it to reproduce quickly. The resulting swarm of Metroids began to consume the planet’s monstrosities and established themselves as Phaaze’s apex predator. [MP3 SP]
+ </p>
+
+ <p>
+ The Chozo mission was complete. The worst creatures were being hunted to extinction, and the Metroids were expected to die from starvation soon after. The cost had been enormous – most of the crew had been killed defending the ship, and the survivors were deathly ill from radiation poisoning. The burnt and damaged ship took off for the long journey home, but the crew soon succumbed to the radiation they had endured. The autopilot took the ship of Chozo bodies home. [MP3 SP]
+ </p>
+ <figure data-id="18zqhipfm1vidjpg" data-recommend-id="image://18zqhipfm1vidjpg" data-format="jpg" data-width="640" data-height="381" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhipfm1vidjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhipfm1vidjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhipfm1vidjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhipfm1vidjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhipfm1vidjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhipfm1vidjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhipfm1vidjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Phazon-Mines-178697159&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Phazon-Mines-178697159" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ On Phaaze, the Metroid presence lasted decades as they consumed the planet’s superpredators. The corpses of Chozo warriors were absorbed into the planet, and their battle armour slowly became weathered and scattered. The planet’s slow sentience developed an outrage that seethed under its continents. It had been violated by the Chozo. As the Metroid infestation began to die out, Phaaze developed a very primitive concept of purpose and retribution. [MP3 SP]
+ </p>
+
+ <p>
+ Phaaze established a vague awareness of concepts it had absorbed from the brains of the Chozo warrior corpses – and the location of two worlds from the Chozo’s memories. As the planet entered its reproductive cycle, it purposely directed two of its seeds towards the planets Tallon IV and Aether. In the seed sent to the Chozo world, Phaaze included one of the last surviving Metroid creatures and some ruined pieces of Chozo armour, intended as a reminder of the crime Phaaze had endured at their hands. The planet sent its second seed to Aether, as the absorbed memories informed the living planet that its inhabitants were friends of the Chozo, and therefore the enemies of Phaaze. [MP 1 / MP 2 SP / MP3 SP]
+ </p>
+ <p>
+ The expedition ship – heavily damaged by radiation and lack of maintenance – was guided back to civilisation by an increasingly erratic auto-pilot. After decades it eventually approached the Chozo world of Zebes, and crash-landed onto its surface. The Chozo civilisation attempted to recover data logs from the wreckage with very limited success – they were able to understand the sacrifice that the heroic crew had made, and confirmed the apparent success of the Metroids in neutralising the creatures on the living planet. The Chozo authorities were unable to establish the location of Phaaze, or recover much in the way of scientific data concerning it. [MP3 SP / SM SP]
+ </p>
+
+ <figure data-id="18zqhkgkmizwijpg" data-recommend-id="image://18zqhkgkmizwijpg" data-format="jpg" data-width="640" data-height="380" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhkgkmizwijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhkgkmizwijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhkgkmizwijpg.jpg 470w" draggable="auto" data-chomp-id="18zqhkgkmizwijpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhkgkmizwijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhkgkmizwijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhkgkmizwijpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/MDB-Bestiary-Metroid-Prime-338464952&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/MDB-Bestiary-Metroid-Prime-338464952" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p>
+ As the Tallon IV seed began its centuries of travelling through space, the lone Metroid within absorbed vast amounts of Phazon and radiation. It became self-aware, and grew in size, intelligence and strength. It used the ruined pieces of Chozo armour to construct itself an exoskeleton, and descended into madness. The exoskeleton failed to protect the creature from the endless radiation, and the Metroid became as exotic as Phaaze’s extinct superpredators: An undying tortured genius. [MP / MP2 / MP3 / MP3 SP]
+ </p>
+
+ <p>
+ The creature that would come to be known as Metroid Prime resented Phaaze for imprisoning it in the Leviathan. It resented the Chozo for creating and discarding the Metroids. It decided that it would survive, bring order to the chaotic universe that birthed it, and somehow enslave Phaaze to its will. In its solitude, immortal as a consequence of its mutations, Metroid Prime plotted its revenge against the universe. [MP / MP2 / MP3 / MP3 SP]
+ </p>
+ <h3 id="h3293">
+ <a id></a>The Dark Planet
+ </h3>
+ <p>
+ With a clear understanding of the danger of living planets, the Chozo authority commenced a search for similar threats. With far more advanced technology than their ancestors had during the Elysian era, the Chozo were unfortunate enough to find a planet of even greater horrors. [MP 3 SP / M2]
+ </p>
+
+ <figure data-id="18zqhnuwesum0jpg" data-recommend-id="image://18zqhnuwesum0jpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhnuwesum0jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhnuwesum0jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhnuwesum0jpg.jpg 470w" draggable="auto" data-chomp-id="18zqhnuwesum0jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhnuwesum0jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhnuwesum0jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhnuwesum0jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://peacefistartist.deviantart.com/art/SR388-126083062&quot;,{&quot;metric25&quot;:1}]]" href="http://peacefistartist.deviantart.com/art/SR388-126083062" target="_blank" rel="noopener noreferrer">Artist: PeaceFistArtist</a></span>)
+ </p>
+ <p>
+ The Chozo detected strange readings coming from a world in a desolate part of the galaxy. The planet had been previously considered so obscure and unimportant that it didn’t have a name, merely catalogued with the codename SR388 and left to its obscurity. A detailed analysis picked up some extremely strange observations; though seemingly mineral, the caverns and liquids beneath the surface shifted with metabolic rhythm – as if the whole planet was somehow a living thing. A ship was dispatched, and the strongest Chozo warriors braved the caverns beneath the surface. [M2 / M2 SP]
+ </p>
+
+ <p>
+ Few made it back. They told of a cauldron of evil, an environment so hostile and vicious that it had birthed the most terrible things. [M2]
+ </p>
+ <figure data-id="18zqhokjxzrgmjpg" data-recommend-id="image://18zqhokjxzrgmjpg" data-format="jpg" data-width="640" data-height="355" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhokjxzrgmjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhokjxzrgmjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhokjxzrgmjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhokjxzrgmjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhokjxzrgmjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhokjxzrgmjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhokjxzrgmjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://lightningarts.deviantart.com/art/Metroid-Metal-Fusion-Sector1-393385160&quot;,{&quot;metric25&quot;:1}]]" href="http://lightningarts.deviantart.com/art/Metroid-Metal-Fusion-Sector1-393385160" target="_blank" rel="noopener noreferrer">Artist: LightningArts</a></span>)
+ </p>
+ <p>
+ Beneath that planet, evolution had been won by an abomination that could steal the flesh, abilities, memories and strengths of all of its prey. The creature was a fusion of energy and plasma that parasitized on life itself. With no word suitable for the nightmare they had discovered, the Chozo simply called it X. If these X-Parasites somehow gained access to the wider universe, there would be no force that could contain them. [M2]
+ </p>
+
+ <p>
+ The threat had to be dealt with. Remembering the apparent success of the Chozo expedition to Phaaze, a plan was put into action. The Chozo assembled their best and brightest, their strongest and wisest. They carved their way into SR388, and dispatched mechanical creatures to construct secure facilities. Robots and Chozo warriors repressed all instances of the X-Parasite as they found them, but casualties were high. The planet appeared to fight the Chozo at every turn, it drowned the invaders in acid and unleashed ambushes of creatures. The endless swam of X-Parasites gained strength from the corpses around them. [MP3 SP / M2]
+ </p>
+ <p>
+ Deep in the planet, a glass laboratory was created, its walls highly resistant to SR388’s acid belly. Here, in dangerous proximity to the X-Parasites, the Chozo scientists began their work. [M2]
+ </p>
+
+ <figure data-id="18zqhrsyn6h9wjpg" data-recommend-id="image://18zqhrsyn6h9wjpg" data-format="jpg" data-width="640" data-height="552" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhrsyn6h9wjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhrsyn6h9wjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhrsyn6h9wjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhrsyn6h9wjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhrsyn6h9wjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhrsyn6h9wjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhrsyn6h9wjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-Account-119685313&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-Account-119685313" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ The Chozo tried to recreate the plan of their ancestors – the use of Metroids to pacify superpredators too dangerous to exist. Without access to the same planetary radiation and materials the Phaaze expedition had, progress was slow. As the war against the planet was raging around them, the Chozo scientists were able to engineer Metroids, but not a variant strong enough to overcome the X-Parasites. As more and more Chozo died protecting the laboratory, a different approach was needed. [M2 SP]
+ </p>
+
+ <figure data-id="18zqht0ddb9ozjpg" data-recommend-id="image://18zqht0ddb9ozjpg" data-format="jpg" data-width="640" data-height="396" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqht0ddb9ozjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqht0ddb9ozjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqht0ddb9ozjpg.jpg 470w" draggable="auto" data-chomp-id="18zqht0ddb9ozjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqht0ddb9ozjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqht0ddb9ozjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqht0ddb9ozjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://starshadow76.deviantart.com/art/Metroid-Queen-Concept-Art-157008177&quot;,{&quot;metric25&quot;:1}]]" href="http://starshadow76.deviantart.com/art/Metroid-Queen-Concept-Art-157008177" target="_blank" rel="noopener noreferrer"><em>Artist: Starshadow76</em></a></span>)
+ </p>
+ <p>
+ The Chozo succeeded in engineering a Metroid Queen, a colossal creature who would lay Metroid Hatchling eggs. When hatched, these resulting Metroids were strong and durable creatures, and finally potent enough to combat the X menace. The Chozo knew that to completely suppress the parasites, the Metroid presence on SR388 had to be permanent. To ensure that the species would not overfeed on the environment and wipe out its food chains, the scientists hardwired an instinct into the Metroid Queen’s feral mind: Only thirty-nine Metroids were to exist on the planet at any one time. This, it was hoped, would keep their numbers high enough to destroy any X re-emergence, but low enough so that they wouldn’t consume the rest of the life on the planet, and starve to death from lack of food. [M2]
+ </p>
+
+ <p>
+ The scientists assembled a payload of Hatchling Eggs and the surviving Chozo warriors distributed them across the planet. The eggs hatched quickly, and the X-Parasites were immediately overwhelmed by the infant Metroids. The X-Parasites were quickly hunted to near-extinction, with only a few surviving cells entering a state of suspension deep in the planet. [M2 SP / MF]
+ </p>
+ <p>
+ The Chozo had won their war, but only just. Most of the warriors and scientists had not survived, and those that were left had to make sure that the X-Parasites had been permanently suppressed. The planet shook with tremors; the earth shifted and acid poured, as if the world was trying to crush the Chozo in their glass laboratory. [M2 SP]
+ </p>
+
+ <p>
+ The X-Parasites did not return, and the Metroid Queen continued to scream as her glass prison shook. The Chozo didn’t realise it, but her despair was being heard. [M2 SP]
+ </p>
+ <figure data-id="18zqhuzegzvcfjpg" data-recommend-id="image://18zqhuzegzvcfjpg" data-format="jpg" data-width="640" data-height="415" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhuzegzvcfjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhuzegzvcfjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhuzegzvcfjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhuzegzvcfjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhuzegzvcfjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhuzegzvcfjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhuzegzvcfjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://hermax669.deviantart.com/art/Omega-Metroid-93544917&quot;,{&quot;metric25&quot;:1}]]" href="http://hermax669.deviantart.com/art/Omega-Metroid-93544917" target="_blank" rel="noopener noreferrer"><em>Artist: Hermax669</em></a></span>)
+ </p>
+ <p>
+ SR388 had been violated by the Chozo. Though very different to Phaaze, SR388 had its own vague sense of awareness. It perceived the Chozo as a viral infection, and the dead X-Parasites as part of itself. It understood loss, and shook with ancient rage. [MP3 SP / M2 SP / MF SP]
+ </p>
+
+ <p>
+ It changed itself to change the Metroids. It adopted them to replace the X-Parasites, and quickly killed the weaker breeds. It moved its radioactive minerals closer to their eggs and soon mutated the species. As SR388 had done with X, it did with the Metroids. It made them strong. [M2 SP / MF SP]
+ </p>
+ <p>
+ Alpha, Gamma, Zeta and Omega Metroids spawned quickly, and responded to the screams of their Queen. With their bulk and strength, they smashed through the glass laboratory and slaughtered their Chozo creators. The Chozo warriors were hunted down and crushed. [M2]
+ </p>
+
+ <p>
+ SR388 developed into a new cauldron of hostility. The Metroids served as the apex predator, and the robots of the Chozo decayed into machine madness and prowled the ruins, killing on sight. The Chozo mission to suppress the X-Parasite had been a success, but the planet had gained its revenge. [M2 / M2 SP / MF]
+ </p>
+ <h2 id="h3294">
+ <a id></a>Part Two: The End of the Renaissance
+ </h2>
+ <h3 id="h3295">
+ <a id></a>The Holy World
+ </h3>
+ <p>
+ The Chozo had devastated two planets for the good of the universe, and sustained many causalities. The superpredators of Phaaze were extinct and the X-Parasites were permanently suppressed. With the crisis over, the race became consumed with a collective sense of guilt over their necessary actions. The Chozo believed the life of the universe to be sacred, and had to reconcile their aggressive actions with their faith. [MP SP / MP3 SP / M2 / MF]
+ </p>
+
+ <p>
+ Worse still, their prophets continued to have visions of endless conflict and death. War was coming to the universe, and it seemed that their sins had not saved them. Many began to doubt these visions, and a schism occurred. [MP/ MP3 SP]
+ </p>
+ <p>
+ The bulk of the Chozo civilisation retired themselves from galactic affairs, leaving only a few scattered colonies amongst the stars. The race retreated to the holy planet of Tallon IV, to shun their technologies and begin simpler, poetic lives. These Chozo reconnected themselves to the natural world and tried to find a harmony with it. As time went on, the most potent prophets became manic, and tried to warn their fellows of a great poison that was to come. [M1 / MP]
+ </p>
+
+ <p>
+ These visions were met with increasing dismissal, but the day finally came when the prophets were believed. After eons swimming in the stars, Phaaze’s seed entered the Tallon system. [MP / MP3]
+ </p>
+ <figure data-id="18zqidecyjp0ujpg" data-recommend-id="image://18zqidecyjp0ujpg" data-format="jpg" data-width="640" data-height="315" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqidecyjp0ujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqidecyjp0ujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqidecyjp0ujpg.jpg 470w" draggable="auto" data-chomp-id="18zqidecyjp0ujpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqidecyjp0ujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqidecyjp0ujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqidecyjp0ujpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://hameed.deviantart.com/art/Cessation-619497&quot;,{&quot;metric25&quot;:1}]]" href="http://hameed.deviantart.com/art/Cessation-619497" target="_blank" rel="noopener noreferrer"><em>Artist: Hameed</em></a></span>)
+ </p>
+ <p>
+ The Leviathan crashed down, and rained poison and death unto the world. The impact survivors watched as their sacred nature succumbed to the mutagens leaking from the seed, and barricaded themselves in their temples as the flora and fauna transformed. Phazon spread beneath the surface of the dying planet, and radiation storms battered the surface. [MP]
+ </p>
+
+ <figure data-id="18zqiejsfe664jpg" data-recommend-id="image://18zqiejsfe664jpg" data-format="jpg" data-width="640" data-height="674" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiejsfe664jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiejsfe664jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiejsfe664jpg.jpg 470w" draggable="auto" data-chomp-id="18zqiejsfe664jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiejsfe664jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiejsfe664jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiejsfe664jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://riivka.deviantart.com/art/Fading-321733899&quot;,{&quot;metric25&quot;:1}]]" href="http://riivka.deviantart.com/art/Fading-321733899" target="_blank" rel="noopener noreferrer"><em>Source: Riivka</em></a></span>)
+ </p>
+ <p>
+ The Chozos’ punishment for their sins, and the fulfilment of Phaaze’s wrath, reached biblical proportions. The Chozo of Tallon IV did not get to rest in peace. Their life energies suffered from Phazon disruption, and upon death they became mad ghosts who screamed forever as they were torn in and out of the material world. In this purgatory, the undead immaterial Chozo murdered anyone they could find. [MP / MP3 SP]
+ </p>
+
+ <p>
+ As their numbers dwindled, the last of the Chozo constructed a great temple above the impact crater. Within this temple, they used what little technology remained to project an energy field around the Leviathan to slow the spread of contagion. As the Chozo civilisation on Tallon IV was extinguished, their dying prophets told of a hero who would one day emerge, to enter the crater and defeat the evil worm within. [MP]
+ </p>
+ <figure data-id="18zqigaxkohx4jpg" data-recommend-id="image://18zqigaxkohx4jpg" data-format="jpg" data-width="640" data-height="405" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqigaxkohx4jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqigaxkohx4jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqigaxkohx4jpg.jpg 470w" draggable="auto" data-chomp-id="18zqigaxkohx4jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqigaxkohx4jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqigaxkohx4jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqigaxkohx4jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://havoc-dm.deviantart.com/art/Metroid-Prime-74392852&quot;,{&quot;metric25&quot;:1}]]" href="http://havoc-dm.deviantart.com/art/Metroid-Prime-74392852" target="_blank" rel="noopener noreferrer"><em>Source: Havoc-DM</em></a></span>)
+ </p>
+ <p>
+ Within the Impact Crater, Metroid Prime remained trapped within the Chozo energy field. In its armour constructed from ancient Chozo power suits, it continued its wait to be unleashed on the universe. [MP / MP3 SP]
+ </p>
+
+ <h3 id="h3296">
+ <a id></a>Dark Echoes
+ </h3>
+ <figure data-id="18zqiho9ab5xrjpg" data-recommend-id="image://18zqiho9ab5xrjpg" data-format="jpg" data-width="640" data-height="639" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiho9ab5xrjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiho9ab5xrjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiho9ab5xrjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiho9ab5xrjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiho9ab5xrjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiho9ab5xrjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiho9ab5xrjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/luminoth-priest-191995430&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/luminoth-priest-191995430" target="_blank" rel="noopener noreferrer">Artist: 3ihard</a></span>)
+ </p>
+ <p>
+ On the planet Aether, an ancient race of mystics known as the Luminoth received the horrifying data coming from Tallon IV. In distant times, the Luminoth and the Chozo had been steadfast allies – until the Chozo retreat ended their ties. Desperate to assist, the Luminoth began to organise a rescue mission. [MP2 / MP2 SP]
+ </p>
+
+ <figure data-id="18zqijbga70tljpg" data-recommend-id="image://18zqijbga70tljpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqijbga70tljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqijbga70tljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqijbga70tljpg.jpg 470w" draggable="auto" data-chomp-id="18zqijbga70tljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqijbga70tljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqijbga70tljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqijbga70tljpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://pugofdoom.deviantart.com/art/Chozo-Ghost-88765133&quot;,{&quot;metric25&quot;:1}]]" href="http://pugofdoom.deviantart.com/art/Chozo-Ghost-88765133" target="_blank" rel="noopener noreferrer">Artist: PugOfDoon</a></span>)
+ </p>
+ <p>
+ A dark transmission was received from Tallon IV. The image showed a screaming, ghostly Chozo figure, flickering in and out of the living universe. In its undead madness, it spoke for its kin. It raged that they would kill anyone who would set foot on their world. The planet was pandemonium, a cursed world on which the dead could not die. As the signal faded, the Luminoth realised that there was no one left alive to rescue. [MP SP / MP2 SP]
+ </p>
+
+ <p>
+ The Luminoth were receiving strange readings from the devastated planet. A mutagen was spreading, unlike anything they had ever encountered. They scanned the stars for its source, and made a devastating discovery – a mass of the same mutagen was on a collision course with Aether. Phaaze’s second seed had nearly arrived at its destination. [MP2 SP / MP3 SP]
+ </p>
+ <p>
+ The people of Aether turned to their technology to save them. Their planet had no native star of its own, and had been implanted millennia ago with a complex energy network that sustained all life. This system was reverently called the Light of Aether, and harnessed the light of the universe in its mechanism. The Luminoth realised that even with this great power, they could not destroy the Phazon Leviathan. A different approach was needed. [MP2 / MP2 SP]
+ </p>
+
+ <figure data-id="18zqim04ra2w5jpg" data-recommend-id="image://18zqim04ra2w5jpg" data-format="jpg" data-width="640" data-height="736" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqim04ra2w5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqim04ra2w5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqim04ra2w5jpg.jpg 470w" draggable="auto" data-chomp-id="18zqim04ra2w5jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqim04ra2w5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqim04ra2w5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqim04ra2w5jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/Sanctuary-Fortress-Ing-Hive-72912247&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/Sanctuary-Fortress-Ing-Hive-72912247" target="_blank" rel="noopener noreferrer"><em>Artist: SesaKath</em></a></span>)
+ </p>
+ <p>
+ The Luminoth used their great Light to engineer a small pocket universe, a dark lifeless echo of existence. The plan was bold: they would use the Light of Aether to surgically open the fabric of reality in the path of the Phazon seed, and allow it to harmlessly enter the pocket universe. If all went well, they would be saved. [MP2 SP]
+ </p>
+
+ <p>
+ The day came, and the Leviathan entered Aether’s atmosphere. The Luminoth commenced their great plan. [MP2 SP]
+ </p>
+ <figure data-id="18zqimznelg78jpg" data-recommend-id="image://18zqimznelg78jpg" data-format="jpg" data-width="640" data-height="321" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqimznelg78jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqimznelg78jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqimznelg78jpg.jpg 470w" draggable="auto" data-chomp-id="18zqimznelg78jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqimznelg78jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqimznelg78jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqimznelg78jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://adriencgd.deviantart.com/art/Clashing-Neighbors-327277211&quot;,{&quot;metric25&quot;:1}]]" href="http://adriencgd.deviantart.com/art/Clashing-Neighbors-327277211" target="_blank" rel="noopener noreferrer"><em>Artist: Adriencgd</em></a></span>)
+ </p>
+ <p>
+ Phaaze’s seed was a sum of living materials beyond Luminoth comprehension. It hit the pocket universe with incalculable force, and a tsunami of exotic energy ruptured space and time. The equipment containing the dark reality lost containment within moments, and the Luminoth were helpless as their creation expanded across the entire planet. A wave of dark energy absorbed creatures, structures and land into the dark universe, and what was once a single planet – was now two. [MP2 / MP2 SP]
+ </p>
+
+ <p>
+ The Luminoth surveyed the devastation. The Phazon seed was gone – it had indeed collided with the dark universe. Entire continents, with millions of inhabitants, had vanished with it. [MP2 / MP2 SP
+ </p>
+ <figure data-id="18zqiocyxn4ksjpg" data-recommend-id="image://18zqiocyxn4ksjpg" data-format="jpg" data-width="640" data-height="407" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiocyxn4ksjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiocyxn4ksjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiocyxn4ksjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiocyxn4ksjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiocyxn4ksjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiocyxn4ksjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiocyxn4ksjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://azureparagon.deviantart.com/art/Void-Xarasque-Sky-Station-244410462&quot;,{&quot;metric25&quot;:1}]]" href="http://azureparagon.deviantart.com/art/Void-Xarasque-Sky-Station-244410462" target="_blank" rel="noopener noreferrer"><em>Artist: AzureParagon</em></a></span>)
+ </p>
+ <p>
+ In the dark universe, a grotesque world was being born. Previous inhabitants of Aether, having been absorbed when containment of the pocket universe was lost, found themselves twisted by the corrosive new reality around them. Most perished, and their flesh fed the strange carnivorous fungi that glowed sickly colours. Some survivors were mutated by the Phazon slowly spreading beneath the surface, and adapted to survive in the hostility. [MP2 SP]
+ </p>
+
+ <p>
+ Aether and its echo, the Phazon-infested Dark Aether, existed in synchronicity. As the Luminoth tried to rebuild their planet, it took only decades for cracks to form in the ether separating the two realities. As rips in the universe shattered open, Aether became a battlefield. [MP2]
+ </p>
+ <figure data-id="18zqiq826qgjkjpg" data-recommend-id="image://18zqiq826qgjkjpg" data-format="jpg" data-width="640" data-height="379" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiq826qgjkjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiq826qgjkjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiq826qgjkjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiq826qgjkjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiq826qgjkjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiq826qgjkjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiq826qgjkjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://xxkiragaxx.deviantart.com/art/ING-181463823&quot;,{&quot;metric25&quot;:1}]]" href="http://xxkiragaxx.deviantart.com/art/ING-181463823" target="_blank" rel="noopener noreferrer"><em>Artist: Xxkiragaxx</em></a></span>)
+ </p>
+ <p>
+ A womb of Phazon mutation and dark energies had birthed a cunning and ferocious horde. The Ing erupted through the cracks between the two worlds, and commenced slaughter. They were fought back by the Luminoth, and a war began between the two parallel worlds. The Ing invaded Aether with regularity, and killed, pillaged and destroyed all that they could find. The Luminoth retaliated and crusaded into Dark Aether in their Light Suits, on suicide missions to exterminate the source of the Ing menace. Both sides suffered colossal casualties as the decades went on. [MP2]
+ </p>
+
+ <figure data-id="18zqirpbvm7a1jpg" data-recommend-id="image://18zqirpbvm7a1jpg" data-format="jpg" data-width="640" data-height="535" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqirpbvm7a1jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqirpbvm7a1jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqirpbvm7a1jpg.jpg 470w" draggable="auto" data-chomp-id="18zqirpbvm7a1jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqirpbvm7a1jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqirpbvm7a1jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqirpbvm7a1jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/The-U-MOS-118477953&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/The-U-MOS-118477953" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ The war was being lost by the Luminoth. The Ing had exterminated most of their race and had stolen too many vital technologies. With the theft of essential energy components from the Light of Aether power network, they had become a defeated people. [MP2]
+ </p>
+
+ <p>
+ The Ing had destroyed all of Aether’s ancient ships, and condemned the Luminoth to no escape from their doomed world. With no other choice, the survivors sealed themselves in an inner sanctum, and entered a state of suspended animation. One custodian, U-Mos, volunteered to be their guardian. As Aether became weaker and weaker, the Luminoth waited for someone to save them. They would wait a very long time. [MP2]
+ </p>
+ <h3 id="h3297">
+ <a id></a>The Sacrifice of the Alimbics
+ </h3>
+ <figure data-id="18zqitehsufhejpg" data-recommend-id="image://18zqitehsufhejpg" data-format="jpg" data-width="640" data-height="393" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqitehsufhejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqitehsufhejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqitehsufhejpg.jpg 470w" draggable="auto" data-chomp-id="18zqitehsufhejpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqitehsufhejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqitehsufhejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqitehsufhejpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://kihunter.deviantart.com/art/MPH-The-Alimbics-94723125&quot;,{&quot;metric25&quot;:1}]]" href="http://kihunter.deviantart.com/art/MPH-The-Alimbics-94723125" target="_blank" rel="noopener noreferrer"><em>Artist: Kihunter</em></a></span>)
+ </p>
+ <p>
+ As the Chozo and the Luminoth fell, so too did other ancient races. In a distant part of the universe, the Alimbics were a militaristic society that maintained peace in their galactic cluster. Their order was shattered when a murderous entity, originating from someplace beyond the understood universe, plummeted into one of their worlds. The creature emerged from the devastation as a gaseous entity, and assumed an Alimbic-styled body to begin its onslaught. [MPH]
+ </p>
+
+ <p>
+ This alien juggernaut was named Gorea by the Alimbic race, and they soon understood it brought only death. Gorea killed every Alimbic it could find, and destroyed everything in its path. Planet after planet fell to Gorea, and the Alimbics realised the creature would never stop. [MPH]
+ </p>
+ <figure data-id="18zqiuxqv4hadjpg" data-recommend-id="image://18zqiuxqv4hadjpg" data-format="jpg" data-width="640" data-height="355" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiuxqv4hadjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiuxqv4hadjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiuxqv4hadjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiuxqv4hadjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiuxqv4hadjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiuxqv4hadjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiuxqv4hadjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/The-Oubliette-46403925&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/The-Oubliette-46403925" target="_blank" rel="noopener noreferrer"><em>Artist: Sesakath</em></a></span>)
+ </p>
+ <p>
+ The Alimbics performed an act of supreme sacrifice. They combined the mental energies of their entire race to forge a prison for Gorea. The psychic prison held it bound, and it was transplanted into an organic vessel called The Oubliette. The vessel was launched into the void outside of the universe, a course that would keep its indestructible prisoner in exile forever. The systems of the prison ship were tasked to scan the every molecule of the imprisoned Gorea, and devise an Omega weapon that could be used to kill it. [MPH / MPH SP]
+ </p>
+
+ <p>
+ The mental energies expelled in this plan consumed the physical bodies of the entire Alimbic race. They vanished from the universe in an instant. Their sacrifice protected all life in the cosmos from Gorea’s murderous rampage. [MPH]
+ </p>
+ <h3 id="h3298">
+ <a id></a>The War of Bryyo
+ </h3>
+ <figure data-id="18zqixy9iqkrejpg" data-recommend-id="image://18zqixy9iqkrejpg" data-format="jpg" data-width="640" data-height="414" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqixy9iqkrejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqixy9iqkrejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqixy9iqkrejpg.jpg 470w" draggable="auto" data-chomp-id="18zqixy9iqkrejpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqixy9iqkrejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqixy9iqkrejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqixy9iqkrejpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/MP-C-Bryyo-88412835&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/MP-C-Bryyo-88412835" target="_blank" rel="noopener noreferrer"><em>Artist: Sesakath</em></a></span>)
+ </p>
+ <p>
+ As the old races of the universe died around them, the lizard people of Bryyo faced their own challenges. The Bryyonians were an advanced, space-faring race who had learned much from their Chozo allies. Their society was a deeply polarised one, with tensions eternal between the scientific and religious factions.[MP3]
+ </p>
+
+ <p>
+ Over the previous centuries, the scientific agenda had dominated, with space travel proving beneficial and enlightening. As the Chozo, Luminoth and Alimbics faced extinction, the religious Bryyonians believed more than ever that the universe was a hostile place, and became desperate to stop their scientific counterparts. [MP3]
+ </p>
+ <p>
+ A great war exploded across Bryyo. By its end, the scholars had been wiped out and the survivors of both sides had regressed to a feral existence. The race devolved into animals, wandering around ruins that they no longer understood. Language vanished and strength ruled. Anyone who landed on Bryyo was meat, to be killed and eaten. [MP3]
+ </p>
+
+ <h3 id="h3299">
+ <a id></a>The Little Rainy Planet
+ </h3>
+ <p>
+ The onslaught of vengeances, conquerors, poisons and politics destroyed the old races. The Alimbics had lost their flesh, while the Bryyonians had lost their souls. The Luminoth had retreated into stasis, and the Chozo of Tallon IV had been condemned to a living death. [MP / MPH / MP2 / MP3]
+ </p>
+
+ <figure data-id="18zqiznfcy0icjpg" data-recommend-id="image://18zqiznfcy0icjpg" data-format="jpg" data-width="640" data-height="430" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiznfcy0icjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiznfcy0icjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiznfcy0icjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiznfcy0icjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiznfcy0icjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiznfcy0icjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiznfcy0icjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://kaiquesilva.deviantart.com/art/Planet-Zebes-251229151&quot;,{&quot;metric25&quot;:1}]]" href="http://kaiquesilva.deviantart.com/art/Planet-Zebes-251229151" target="_blank" rel="noopener noreferrer"><em>Artist: Kaiquesilva</em></a></span>)
+ </p>
+ <p>
+ On a small, rainy planet called Zebes, the last known Chozo colony had watched the stars with impotence. This small settlement of the nearly-extinct avian race witnessed the end of the great universal renaissance, and the slow beginning of a new chapter in galactic history. Gradually, the younger races were launching their first satellites into space. In time, new empires would rise to take the place of the old. [M1 / M1 SP]
+ </p>
+
+ <figure data-id="18zqj0sv6pheljpg" data-recommend-id="image://18zqj0sv6pheljpg" data-format="jpg" data-width="640" data-height="591" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj0sv6pheljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj0sv6pheljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj0sv6pheljpg.jpg 470w" draggable="auto" data-chomp-id="18zqj0sv6pheljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj0sv6pheljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj0sv6pheljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj0sv6pheljpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Praying-for-Universe-179491357&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Praying-for-Universe-179491357" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p>
+ Zebes prophets’ saw the visions the Chozo had always endured: great wars, spreading poison and death. And suddenly, something bold was foreseen. [M1 SP / MP3 SP]
+ </p>
+
+ <figure data-id="18zqj1sdn0v6rjpg" data-recommend-id="image://18zqj1sdn0v6rjpg" data-format="jpg" data-width="640" data-height="528" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj1sdn0v6rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj1sdn0v6rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj1sdn0v6rjpg.jpg 470w" draggable="auto" data-chomp-id="18zqj1sdn0v6rjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj1sdn0v6rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj1sdn0v6rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj1sdn0v6rjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://fddt.deviantart.com/art/Samus-Aran-368975394&quot;,{&quot;metric25&quot;:1}]]" href="http://fddt.deviantart.com/art/Samus-Aran-368975394" target="_blank" rel="noopener noreferrer"><em>Artist: Fddt</em></a></span>)
+ </p>
+ <p>
+ A great hunter, clad in orange, red and green. The Chozo glimpsed a future hero, alone in the darkness beneath worlds, fighting so that good could survive evil. They saw her curing poisoned planets, and ending galactic wars. They saw the universe’s one chance to survive its apocalyptic future. They saw the only one who could defy prophecy. [M1 / MP3 SP]
+ </p>
+
+ <p>
+ And they saw her wearing Chozo armour. [M1]
+ </p>
+ <h2 id="h3300">
+ <a id></a>Part Three: The New Empires
+ </h2>
+ <h3 id="h3301">
+ <a id></a>The Humans
+ </h3>
+ <p>
+ On the planet Earth, the human race had finally developed a ship capable of leaving their solar system. A brave crew ventured into the universe to learn whether life existed elsewhere. Their discoveries fundamentally changed the human condition. On planet after planet, they found ruined tombs and cities, guarded by weathered statues of dead races. Most significant of all, they found technology. [M1 SP]
+ </p>
+
+ <p>
+ The humans reverse engineered their salvage, and advanced with pace. Within another century, faster-than-light ships explored the stars, and colonies transformed hostile worlds into homes. Peaceful relations formed between other younger races, and a great Galactic Federation was founded. [M1 SP]
+ </p>
+ <h3 id="h3302">
+ <a id></a>The Space Pirates
+ </h3>
+ <p>
+ In a less hospitable region of space, a cabal of battered races joined their forces to survive. On planets where acid rain burned flesh and magma flowed, the alliance expanded into a hardened space empire. They ventured into nearby systems and took what they needed from anyone they could reach. They found the ruins of the old races and ransacked the ancient technologies within. They immersed themselves in science and unlocked the secrets of their finds. Within decades, they had advanced their spread with stronger and faster ships. The creatures enhanced themselves, rewriting their genetics and integrating mechanisms beneath their flesh. They were unique: a cybernetic race of furious murderers with a skill for patient scientific process. As more planets were invaded, their conquered civilisations were conscripted by force. [M1 SP / MP / MP3]
+ </p>
+
+ <p>
+ The inevitable moment came when their Empire reached the borders of the vast Galactic Federation. [M1 SP / MP / MP3]
+ </p>
+ <figure data-id="18zqjuebmfw70jpg" data-recommend-id="image://18zqjuebmfw70jpg" data-format="jpg" data-width="640" data-height="489" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjuebmfw70jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjuebmfw70jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjuebmfw70jpg.jpg 470w" draggable="auto" data-chomp-id="18zqjuebmfw70jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjuebmfw70jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjuebmfw70jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjuebmfw70jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://mr-corr.deviantart.com/art/fight-for-norion-175087687&quot;,{&quot;metric25&quot;:1}]]" href="http://mr-corr.deviantart.com/art/fight-for-norion-175087687" target="_blank" rel="noopener noreferrer"><em>Artist: Mr-Corr</em></a></span>)
+ </p>
+ <p>
+ First contact was brief and furious. On that day, the warning went out to all the worlds of the Federation: Beware the Space Pirates. Though no state of war was officially declared, the empires attacked each other on sight. The Galactic Federation was large enough to repress any meaningful incursions into their space. [M1 SP / MP SP / MP3 SP / SM SP]
+ </p>
+
+ <h3 id="h3303">
+ <a id></a>The Massacre of Two Families
+ </h3>
+ <p>
+ The Galactic Federation discovered the last Chozo Colony on Zebes. The tired, ancient avians welcomed the humans and shared with them wisdom and knowledge. They offered the Galactic Federation new sciences, and taught them how to make organic computers. The Federation studied the Chozo’s own central processing unit, an engineered brain that mothered over their colony, and left with plans to assemble their own variants. On the nearest habitable planet of K-2L, a colony was established. [M1 / MP3 SP]
+ </p>
+
+ <p>
+ On this world, the human Samus Aran was born. [M1]
+ </p>
+ <figure data-id="18zqjw7ft0zj5jpg" data-recommend-id="image://18zqjw7ft0zj5jpg" data-format="jpg" data-width="640" data-height="478" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjw7ft0zj5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjw7ft0zj5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjw7ft0zj5jpg.jpg 470w" draggable="auto" data-chomp-id="18zqjw7ft0zj5jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjw7ft0zj5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjw7ft0zj5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjw7ft0zj5jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/Zebesian-Space-Pirate-301454831&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/Zebesian-Space-Pirate-301454831" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p>
+ Barely out of infancy, the young Samus witnessed her family die. A Space Pirate raiding party overwhelmed her colony and murdered everyone she ever knew. By staying silent while surrounded by horror, Samus survived as the Pirates ransacked the settlement and left. [M1]
+ </p>
+
+ <p>
+ The Chozo colony on Zebes received K-2L’s automated distress signal. In an ancient dusty ship, they reached the planet and found Samus to be the only survivor of the massacre. The child was brought to Zebes, and the Chozo deliberated. Should she be returned to her own kind, or allowed to stay? [M1]
+ </p>
+ <p>
+ Across the colony, the Prophets experienced a simultaneous moment of clarity. They understood immediately that they had found their prophesised hero. The young girl was their inheritor, and would grow strong. She would learn all she could from them, and take their strongest technologies into the universe. She would be the hero against the oncoming storm. [M1 SP]
+ </p>
+
+ <figure data-id="18zqjz9xd98ltjpg" data-recommend-id="image://18zqjz9xd98ltjpg" data-format="jpg" data-width="640" data-height="524" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjz9xd98ltjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjz9xd98ltjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjz9xd98ltjpg.jpg 470w" draggable="auto" data-chomp-id="18zqjz9xd98ltjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjz9xd98ltjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjz9xd98ltjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjz9xd98ltjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://r3dfive.deviantart.com/art/The-Birth-Of-The-Hunter-255511894&quot;,{&quot;metric25&quot;:1}]]" href="http://r3dfive.deviantart.com/art/The-Birth-Of-The-Hunter-255511894" target="_blank" rel="noopener noreferrer"><em>Artist: R3dFiVe</em></a></span>)
+ </p>
+ <p>
+ Samus Aran reached maturity amongst the Chozo. She was trained in the combat arts of the great extinct races. She was infused with Chozo genetic material so she could employ their technologies. She was educated to be a scientist, an explorer, and a tactician. Everything that was good about the Chozo civilisation was allowed to live on in Samus. [M1]
+ </p>
+
+ <figure data-id="18zqjzzky4ffnjpg" data-recommend-id="image://18zqjzzky4ffnjpg" data-format="jpg" data-width="640" data-height="517" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjzzky4ffnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjzzky4ffnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjzzky4ffnjpg.jpg 470w" draggable="auto" data-chomp-id="18zqjzzky4ffnjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjzzky4ffnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjzzky4ffnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjzzky4ffnjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://pyra.deviantart.com/art/Decaying-Elder-53293713&quot;,{&quot;metric25&quot;:1}]]" href="http://pyra.deviantart.com/art/Decaying-Elder-53293713" target="_blank" rel="noopener noreferrer"><em>Artist: Pyra</em></a></span>)
+ </p>
+ <p>
+ Samus became an adult, and the Chozo presented her with their greatest works: a toughened power suit and an agile spacecraft, both more potent than anything their race had ever made. The Chozo leader, decaying and blind, told Samus it was time for her to find her destiny in the universe. Samus Aran departed for the stars, and years pass. [M1 / M1 SP]
+ </p>
+
+ <p>
+ As Samus tried to reconnect with her heritage on Earth, the last Chozo prophets on Zebes received a final vision: The Space Pirates were coming for them. It was time for the last Chozo to be extinguished from the universe. [M1 SP]
+ </p>
+ <figure data-id="18zqk1guma1bojpg" data-recommend-id="image://18zqk1guma1bojpg" data-format="jpg" data-width="640" data-height="401" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk1guma1bojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk1guma1bojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk1guma1bojpg.jpg 470w" draggable="auto" data-chomp-id="18zqk1guma1bojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk1guma1bojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk1guma1bojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk1guma1bojpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://phobos-romulus.deviantart.com/art/The-Chozo-187935440&quot;,{&quot;metric25&quot;:1}]]" href="http://phobos-romulus.deviantart.com/art/The-Chozo-187935440" target="_blank" rel="noopener noreferrer"><em>Artist: Phobos-Romulus</em></a></span>)
+ </p>
+ <p>
+ The Chozo hid their technologies throughout the planet, in places that they were certain Samus would find them. They concealed a second Power Suit within the walls of their holy temple, having foreseen that Samus may require it in the future. They then returned to the surface to await the inevitable. [M1 SP]
+ </p>
+
+ <p>
+ The Space Pirates invaded in force, and murdered Samus Aran’s second family. The Chozo became extinct. [M1 / MP SP]
+ </p>
+ <h3 id="h3304">
+ <a id></a>The Mother Brain
+ </h3>
+ <p>
+ Space Pirate scientists arrived shortly after the carnage and focused their attention on the legendary Chozo organic central processing unit. They rewrote its benign programming and injected stimulants into its flesh. They enabled it to form an artificial intelligence obsessed with strategy and conquest. They drove its computational potential towards absolute advancement of the Space Pirate Empire. [M1 SP]
+ </p>
+
+ <figure data-id="18zqk2icdbv0cjpg" data-recommend-id="image://18zqk2icdbv0cjpg" data-format="jpg" data-width="640" data-height="528" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk2icdbv0cjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk2icdbv0cjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk2icdbv0cjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk2icdbv0cjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk2icdbv0cjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk2icdbv0cjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk2icdbv0cjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://jaagup.deviantart.com/art/mother-brain-258536723&quot;,{&quot;metric25&quot;:1}]]" href="http://jaagup.deviantart.com/art/mother-brain-258536723" target="_blank" rel="noopener noreferrer"><em>Artist: Jaagup</em></a></span>)
+ </p>
+ <p>
+ The results went beyond High Command’s most optimistic projections. The Space Pirates had created a leader, a desperately needed figure to unite their fragmented empire. They had created their Mother Brain. The great Space Pirate generals Ridley and Kraid arrived at Zebes, ready to pay tribute to their new master and to plan for the future. Mother Brain delivered to the Space Pirates knowledge and power. She told them of a world referenced in her oldest Chozo databanks, a planet bathed in a mutagenic poison waiting to be farmed. She instructed High Command to prepare an armada of ships and invade the planet Tallon IV. [M1 / MP SP]
+ </p>
+
+ <p>
+ The order was followed immediately, and the High Command discovered a world deranged by contagion. Beneath its surface, endless pools of Phazon waited to be weaponised, and a great mining operation began. Mother Brain received data from their readings on the planet; even after thousands of years, the source of the Phazon was still contained in the Chozo force field. She scrutinised her records further, and was unable to ascertain any method of breaching the barrier. The Space Pirates could retrieve the Phazon, but were denied access to its source. [MP]
+ </p>
+ <h3 id="h3305">
+ <a id></a>The Metroids
+ </h3>
+ <p>
+ A perfect storm brewed. As the Space Pirates gained access to the most potent mutagen in the universe, the Galactic Federation made an equally eventful discovery: They found the dark planet SR388. [M1 / M2]
+ </p>
+
+ <figure data-id="18zqk5mt4ocetjpg" data-recommend-id="image://18zqk5mt4ocetjpg" data-format="jpg" data-width="640" data-height="477" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk5mt4ocetjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk5mt4ocetjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk5mt4ocetjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk5mt4ocetjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk5mt4ocetjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk5mt4ocetjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk5mt4ocetjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://firebornform.deviantart.com/art/SR388-Tunnels-353312617&quot;,{&quot;metric25&quot;:1}]]" href="http://firebornform.deviantart.com/art/SR388-Tunnels-353312617" target="_blank" rel="noopener noreferrer"><em>Artist: Fireborn Form</em></a></span>)
+ </p>
+ <p>
+ A Galactic Federation survey team studied the surface, and soon encountered a gelatinous creature that swam through air. The alien defied gravity and physics as it phased through dense rock with ease. It perceived the survey team, and made a few curious chirps in their direction. It then suddenly changed temperament, aggressively charging to latch itself onto the skull of one of the party. The victim died in agony as the Metroid fed on all the energy within, and could not be removed until its prey had been reduced to a dried husk of collapsing matter. The young Metroid had just killed, in a way that science could not explain. [M1 SP / M2 SP]
+ </p>
+
+ <p>
+ With effort and casualties, the scientists contained a few infant specimens of the Metroid creatures, and left the planet without further incident. [M1]
+ </p>
+ <p>
+ As their vessel went back to the stars, SR388 was aware their withdrawal. It harboured a great contempt for the invaders, an endless hate fuelled by the impotence it endured centuries ago when the Chozo had committed their great invasion. The living planet had spent centuries honing the Metroids into perfect killers, and knew the devastation they could cause upon maturity. The planet had intentionally allowed the humans to take a few Metroids away so that the creatures could grow up and kill anyone out amongst the stars who ever thought of returning. SR388 took any opportunity to gain revenge against an outside universe that refused to leave it alone. [M2 SP]
+ </p>
+
+ <p>
+ As the scientists began to broadcast their findings back to the Galactic Federation, Mother Brain intercepted the transmission. She cross-referenced their data with notes buried in the Chozo’s ancient fragmented records. She deduced that the Metroids were a form of genetically engineered predator of incredible power, created by the Chozo for an unknown purpose. Mother Brain ordered High Command to get the creatures to her by any means necessary. [M1 SP]
+ </p>
+ <p>
+ The Space Pirates overran the Galactic Federation vessel and stole the Metroid creatures. They divided their prize: some were sent to their nearest Homeworld; others were sent to the Tallon IV outpost; and the most potent were delivered straight to Zebes for the experiments of Mother Brain. [M1 / MP / MP3]
+ </p>
+
+ <p>
+ With the arrival of the first Phazon samples from Tallon IV, the exotic substance allowed the Space Pirates to slowly produce stable cloned Metroids across their breeding sites. [M1 SP / MP SP]
+ </p>
+ <h3 id="h3306">
+ <a id></a>The Revenge of Samus Aran
+ </h3>
+ <figure data-id="18zqk7ps96cb3jpg" data-recommend-id="image://18zqk7ps96cb3jpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk7ps96cb3jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk7ps96cb3jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk7ps96cb3jpg.jpg 470w" draggable="auto" data-chomp-id="18zqk7ps96cb3jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk7ps96cb3jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk7ps96cb3jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk7ps96cb3jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://ojanpohja.deviantart.com/art/Space-Pirate-31294390&quot;,{&quot;metric25&quot;:1}]]" href="http://ojanpohja.deviantart.com/art/Space-Pirate-31294390" target="_blank" rel="noopener noreferrer"><em>Artist: Ojanpohja</em></a></span>)
+ </p>
+ <p>
+ In her first mission as a Bounty Hunter, Samus Arran was commissioned by the Galactic Federation to neutralise the stolen Metroids. Through careful investigation, Samus discovered that the Pirates are operating from Zebes – her home. She concluded that the Space Pirates had murdered her second family, as they had done with her first. They have took from her everyone she ever loved, and destroyed her two worlds. [M1]
+ </p>
+
+ <figure data-id="18zqk8x71i4gnjpg" data-recommend-id="image://18zqk8x71i4gnjpg" data-format="jpg" data-width="640" data-height="384" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk8x71i4gnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk8x71i4gnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk8x71i4gnjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk8x71i4gnjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk8x71i4gnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk8x71i4gnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk8x71i4gnjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://stuarthughe.deviantart.com/art/Samus-Varia-322194081&quot;,{&quot;metric25&quot;:1}]]" href="http://stuarthughe.deviantart.com/art/Samus-Varia-322194081" target="_blank" rel="noopener noreferrer"><em>Artist: Stuart Hughe</em></a></span>)
+ </p>
+ <p>
+ Samus stormed Zebes and killed everyone in her path. [M1]
+ </p>
+ <figure data-id="18zqkachpcz0ijpg" data-recommend-id="image://18zqkachpcz0ijpg" data-format="jpg" data-width="640" data-height="530" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkachpcz0ijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkachpcz0ijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkachpcz0ijpg.jpg 470w" draggable="auto" data-chomp-id="18zqkachpcz0ijpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkachpcz0ijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkachpcz0ijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkachpcz0ijpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://immarart.deviantart.com/art/Metroid-337270954&quot;,{&quot;metric25&quot;:1}]]" href="http://immarart.deviantart.com/art/Metroid-337270954" target="_blank" rel="noopener noreferrer"><em>Artist: Immarart</em></a></span>)
+ </p>
+ <p>
+ As her defences were breached, Mother Brain unleashed the great generals Ridley and Kraid. Both were killled, and, desperate to stop the intruder, Mother Brain released the Metroids. Samus Aran exterminated the creatures, and invaded the inner sanctum. [M1]
+ </p>
+
+ <figure data-id="18zqkbhxb2ugpjpg" data-recommend-id="image://18zqkbhxb2ugpjpg" data-format="jpg" data-width="640" data-height="360" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkbhxb2ugpjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkbhxb2ugpjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkbhxb2ugpjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkbhxb2ugpjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkbhxb2ugpjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkbhxb2ugpjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkbhxb2ugpjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://twigs.deviantart.com/art/The-Mother-s-Chamber-140408495&quot;,{&quot;metric25&quot;:1}]]" href="http://twigs.deviantart.com/art/The-Mother-s-Chamber-140408495" target="_blank" rel="noopener noreferrer"><em>Artist: Twigs</em></a></span>)
+ </p>
+ <p>
+ Samus confronted the malevolent Mother Brain and blasted apart her body. A power overload was caused, and the Tourian facility shook itself apart. Samus evacuated to her ship and tried to leave Zebes, but a Space Pirate battleship in orbit registered her ascent and opened fire. Samus’ gunship plummeted back towards the Zebes and impacted Chozodia, her former home. [M1]
+ </p>
+
+ <p>
+ Extremely lucky to be alive, Samus crawled out of the remains of her destroyed power suit, and fled as Space Pirate forces stormed the area. Samus hid, crawled and ran to find sanctuary in the deepest part of the Chozo’s most revered temple. [M1]
+ </p>
+ <figure data-id="18zqkdb1egv73jpg" data-recommend-id="image://18zqkdb1egv73jpg" data-format="jpg" data-width="640" data-height="500" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkdb1egv73jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkdb1egv73jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkdb1egv73jpg.jpg 470w" draggable="auto" data-chomp-id="18zqkdb1egv73jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkdb1egv73jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkdb1egv73jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkdb1egv73jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://eyes5.deviantart.com/art/Blessing-6012954&quot;,{&quot;metric25&quot;:1}]]" href="http://eyes5.deviantart.com/art/Blessing-6012954" target="_blank" rel="noopener noreferrer"><em>Artist: Eyes5</em></a></span>)
+ </p>
+ <p>
+ Samus found herself surrounded with murals of the dead Chozo, and accepted she was alone in the universe. Overcoming despair, she solved the trials of the Chozodian temple and a concealed power suit was revealed to her. This shining armour was even more potent than the one she had just lost, and was able to integrate the most exotic Chozo technologies. Samus realised the greater meaning of her find; the Chozo had left her gifts for her in places they had foreseen she would traverse. Her adopted family continued to protect her long after their deaths, and she would find their statues cradling survival equipment in the darkest corners of the cosmos. [M1 / MP / MP3 / M2 / SM]
+ </p>
+
+ <figure data-id="18zqkeig3z5btjpg" data-recommend-id="image://18zqkeig3z5btjpg" data-format="jpg" data-width="640" data-height="374" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkeig3z5btjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkeig3z5btjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkeig3z5btjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkeig3z5btjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkeig3z5btjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkeig3z5btjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkeig3z5btjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://imachinivid.deviantart.com/art/Super-missile-309591371&quot;,{&quot;metric25&quot;:1}]]" href="http://imachinivid.deviantart.com/art/Super-missile-309591371" target="_blank" rel="noopener noreferrer"><em>Artist: Imachinivid</em></a></span>)
+ </p>
+ <p>
+ With her new armaments, Samus cleansed the Space Pirate presence from Zebes. She came to be known as “The Hunter”, and the Space Pirates learned that they will always be hunted down for what they did to her families. They fled the planet in terror. [M1 / MP / MP2 / MP3]
+ </p>
+
+ <h3 id="h3307">
+ <a id></a>Tallon IV
+ </h3>
+ <p>
+ As years passed, Samus Aran accepted further missions from the Galactic Federation. The bounty earned funded her personal vendetta against the Space Pirates. She improved her armaments, paid for black market information and stormed their outposts. Samus showed her enemies no mercy, and became the feared nemesis of their entire civilisation. With the income from her Federation services, Samus had soon amassed enough money to buy the most secret information regarding the Space Pirates: the coordinates of their stronghold on an old forgotten planet called Tallon IV. [MP1 SP]
+ </p>
+
+ <p>
+ Samus guided her ship into the Tallon system and investigated an orbiting space station. She discovered a failed genetic engineering facility whose Space Pirate crew was murdered when they lost control of their own creations. Samus fought her way through the ferocious beasts scattered within, and discovered a half-insane cyborg recreation of the Space Pirate general Ridley. As the station began to collapse, the biomechanical dragon fled to the world below, and Samus pursued. [MP1]
+ </p>
+ <figure data-id="18zqkglfb56vojpg" data-recommend-id="image://18zqkglfb56vojpg" data-format="jpg" data-width="640" data-height="311" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkglfb56vojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkglfb56vojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkglfb56vojpg.jpg 470w" draggable="auto" data-chomp-id="18zqkglfb56vojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkglfb56vojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkglfb56vojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkglfb56vojpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://lightningarts.deviantart.com/art/Metroid-Metal-Where-It-All-Begins-393272172&quot;,{&quot;metric25&quot;:1}]]" href="http://lightningarts.deviantart.com/art/Metroid-Metal-Where-It-All-Begins-393272172" target="_blank" rel="noopener noreferrer"><em>Artist: Lightningarts</em></a></span>)
+ </p>
+ <p>
+ Samus lost Ridley in the planet’s stormy atmosphere, and elected to land in a nearby jungle to conceal her presence from the Pirate ground forces. Exploring the surroundings, Samus discovered that the planet was once home to the bulk of the extinct Chozo civilisation. In a great temple Samus studied poetic murals that told of the Phazon comet that had struck their world. The scribblings informed her of a creature trapped deep in the comet that they referred to as “The Worm,” and of the powerful shield they erected to prevent its escape. Samus read their last prophecy; that a hero would traverse fire and ice, jungle and cave, and find twelve sacred keys that would deactivate the barrier and allow passage to the Impact Crater. This saviour from the stars would bring down the ancient shield, and destroy the worm that infected their planet. [MP1]
+ </p>
+
+ <p>
+ She continued her exploration, and battled ferocious flora and fauna. The Hunter came to understand that the Space Pirates had established a complex military installation that descended far below the surface. [MP1]
+ </p>
+ <figure data-id="18zqkick4w4i9jpg" data-recommend-id="image://18zqkick4w4i9jpg" data-format="jpg" data-width="640" data-height="517" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkick4w4i9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkick4w4i9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkick4w4i9jpg.jpg 470w" draggable="auto" data-chomp-id="18zqkick4w4i9jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkick4w4i9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkick4w4i9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkick4w4i9jpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://r-sraven.deviantart.com/art/Metroid-Prime-Lost-Ruins-33577678&quot;,{&quot;metric25&quot;:1}]]" href="http://r-sraven.deviantart.com/art/Metroid-Prime-Lost-Ruins-33577678" target="_blank" rel="noopener noreferrer"><em>Artist: R-Sraven</em></a></span>)
+ </p>
+ <p>
+ Samus hunted the Pirates and accessed their computer logs. The Empire had found quantities of an intensely potent mutagen called Phazon. Laboratories across the outpost experimented with the substance, and in a short space of time they had created prototypes for the next generation of their races: powerful Phazon-fuelled juggernauts. Should these advances continue, Samus knew that the Space Pirates would be able to conquer the Galactic Federation. [MP1]
+ </p>
+
+ <figure data-id="18zqkje1rl63yjpg" data-recommend-id="image://18zqkje1rl63yjpg" data-format="jpg" data-width="800" data-height="816" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkje1rl63yjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkje1rl63yjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkje1rl63yjpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zqkje1rl63yjpg.jpg 800w" draggable="auto" data-chomp-id="18zqkje1rl63yjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkje1rl63yjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkje1rl63yjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkje1rl63yjpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zqkje1rl63yjpg.jpg 800w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968&quot;,{&quot;metric25&quot;:1}]]" href="http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968" target="_blank" rel="noopener noreferrer"><em>Artist: Greenstranger</em></a></span>)
+ </p>
+ <p>
+ In the most secure laboratory, Samus made a devastating discovery. The Space Pirates had used Phazon to create an army of stable clone Metroids and lost containment. The Metroid creatures were roaming the caverns deep in the planet, reproducing and mutating as the Phazon influenced their physiology. [MP1]
+ </p>
+
+ <figure data-id="18zqklb3wp0jajpg" data-recommend-id="image://18zqklb3wp0jajpg" data-format="jpg" data-width="640" data-height="365" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqklb3wp0jajpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqklb3wp0jajpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqklb3wp0jajpg.jpg 470w" draggable="auto" data-chomp-id="18zqklb3wp0jajpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqklb3wp0jajpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqklb3wp0jajpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqklb3wp0jajpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968&quot;,{&quot;metric25&quot;:1}]]" href="http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968" target="_blank" rel="noopener noreferrer"><em>Artist: Ohimseeinstars</em></a></span>)
+ </p>
+ <p>
+ Samus’ final discovery was the most horrific. The powerful, poisonous Phazon was not a rare material on Tallon IV. Despite the Chozo shield containing the Impact Crater, the substance had spread and consumed the world inside-out. The core of the planet presented the Space Pirates with a vast supply of Phazon, enough to fuel their conquest of the stars. [MP1]
+ </p>
+
+ <p>
+ Samus destroyed the mining facilities and laboratories, and reconstructed the twelve parts of the ancient Chozo cipher. She destroyed living weapons such as the Thardus experiment, and annihilated the prototype Omega Pirate. She overcame corrupted Metroids, and banished the tormented Chozo ghosts from the living world. She fought the mad Meta Ridley, and on his demise deactivated the Chozo containment shield. As prophesised, Samus Aran entered the Impact Crater. [MP1]
+ </p>
+ <h3 id="h3308">
+ <a id></a>The Worm
+ </h3>
+ <p>
+ Samus Aran had opened Metroid Prime’s cage, and had no understanding of what she was about to unleash on the universe. The creature had been imprisoned in a different era, and had spent eons being tortuously transformed by Phazon into an undying mad genius. [MP1]
+ </p>
+
+ <figure data-id="18zqkn672gklqjpg" data-recommend-id="image://18zqkn672gklqjpg" data-format="jpg" data-width="640" data-height="499" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkn672gklqjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkn672gklqjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkn672gklqjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkn672gklqjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkn672gklqjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkn672gklqjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkn672gklqjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<em>Artist: Chrysaetos-Pteron</em>)
+ </p>
+ <p>
+ Samus and the ancient Metroid battled, and the bounty hunter shattered the creature’s metal armour. By channelling the surrounding Phazon deposits into a supercharged energy beam, Samus was able to devastate Metroid Prime’s gelatinous body. After a tremendous battle, the old creature began to collapse on itself. [MP1]
+ </p>
+
+ <figure data-id="18zqkodlj2z8kjpg" data-recommend-id="image://18zqkodlj2z8kjpg" data-format="jpg" data-width="640" data-height="525" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkodlj2z8kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkodlj2z8kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkodlj2z8kjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkodlj2z8kjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkodlj2z8kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkodlj2z8kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkodlj2z8kjpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sabretoontigers.deviantart.com/art/Samus-308644319&quot;,{&quot;metric25&quot;:1}]]" href="http://sabretoontigers.deviantart.com/art/Samus-308644319" target="_blank" rel="noopener noreferrer"><em>Artist: Sabretoontigers</em></a></span>)
+ </p>
+ <p>
+ Seemingly dying, Metroid Prime lashed out, grabbing a layer of material from Samus Aran’s armour. The creature melted into a pool of Phazon particles, and the bounty hunter evacuated the Impact Crater. [MP1]
+ </p>
+
+ <p>
+ Samus Aran had seemingly succeeded in her mission. The surviving Space Pirates abandoned their devastated facilities and hastily evacuated the planet. With the defeat of Metroid Prime, the Phazon contagion was slowly stopping its spread. The tormented Chozo spirits that had been bound to the planet were finally able to achieve their rest. Leaving the world to recover from its devastation, Samus Aran headed back to the stars. [MP1 / MP1 SP]
+ </p>
+ <h3 id="h3309">
+ <a id></a>The Dark Hunter
+ </h3>
+ <p>
+ Metroid Prime’s exposure to millennia of Phazon had given the creature extremely exotic abilities, the most potent being its durability – to recreate itself after nearly any level of destruction. As it had collapsed on itself, the essence of Metroid Prime craved the strength and adaptability present in Samus Aran. In the Talon IV impact crater, Metroid Prime recreated itself as a dark copy of the woman who had defeated it. [MP 1 / MP2 / MP3 SP]
+ </p>
+
+ <figure data-id="18zqkq6pqyr8ljpg" data-recommend-id="image://18zqkq6pqyr8ljpg" data-format="jpg" data-width="640" data-height="412" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div contenteditable="false" data-syndicationrights="false">
+ <p><img alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkq6pqyr8ljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkq6pqyr8ljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkq6pqyr8ljpg.jpg 470w" draggable="auto" data-chomp-id="18zqkq6pqyr8ljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkq6pqyr8ljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkq6pqyr8ljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkq6pqyr8ljpg.jpg 470w">
+ </p>
+ </div>
+ </figure>
+ <p>
+ (<span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://imachinivid.deviantart.com/art/Dark-Samus-returns-295856131&quot;,{&quot;metric25&quot;:1}]]" href="http://imachinivid.deviantart.com/art/Dark-Samus-returns-295856131" target="_blank" rel="noopener noreferrer"><em>Artist: Imachinivid</em></a></span>)
+ </p>
+ <p>
+ Dark Samus clawed its way out of the Impact Crater. It departed Tallon IV to spread its venom across the stars, and to sow the seeds of a great war. [MP1 / MP2 / MP3]
+ </p>
+
+ <p>
+ <span><a data-ga="[[&quot;Embedded Url&quot;,&quot;Internal link&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108&quot;,{&quot;metric25&quot;:1}]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108"><em>Click here for the second half of this epic story.</em></a></span>
+ </p>
+ <hr>
+ <p>
+ <small>Mama Robotnik is a video game historian living somewhere in the British Empire. He specialises in unearthing lost gaming media, but also enjoys a good long essay about his favourite games every now and then. He drinks a lot of tea, and has a horrendously naughty black and white cat called Blossom. If you would like to contact him, he responds to his private messages over at</small> <span><a data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://www.neogaf.com/forum/&quot;,{&quot;metric25&quot;:1}]]" href="http://www.neogaf.com/forum/" target="_blank" rel="noopener noreferrer"><small>NeoGAF</small></a></span><small>.</small>
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/source.html
new file mode 100644
index 000000000..0b8875271
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-2/source.html
@@ -0,0 +1,3868 @@
+<!DOCTYPE html>
+<html lang="en-us" data-reactroot="" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="google-site-verification" content="bM-oyO1vXKOAYf3H3fJQaVf8FeyOneJtVHbEYlNa7p8" />
+ <meta name="ir-site-verification-token" value="-1270174611" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0,maximum-scale=10.0" />
+ <meta name="ROBOTS" content="INDEX, FOLLOW" />
+ <title>
+ The Spectacular Story Of Metroid, One Of Gaming's Richest Universes
+ </title>
+ <link rel="shortcut icon" type="image/png" href="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/v4sckews2f3bzf0ztbkf.png" />
+ <link rel="apple-touch-icon" type="image/png" href="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_200,q_80,w_200/v4sckews2f3bzf0ztbkf.png" />
+ <meta name="msapplication-square70x70logo" content="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/v4sckews2f3bzf0ztbkf.png" />
+ <meta name="msapplication-square150x150logo" content="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_200,q_80,w_200/v4sckews2f3bzf0ztbkf.png" />
+ <link rel="preload" href="https://cdn.digitru.st/prod/1/digitrust.min.js" as="script" />
+ <link rel="dns-prefetch" href="//kinja.com" />
+ <link rel="dns-prefetch" href="//i.kinja-img.com" />
+ <link rel="dns-prefetch" href="//x.kinja-static.com" />
+ <link rel="dns-prefetch" href="//f.kinja-static.com" />
+ <link rel="dns-prefetch" href="//www.googletagservices.com" />
+ <link rel="dns-prefetch" href="//beacon.krxd.net" />
+ <link rel="dns-prefetch" href="//pubads.g.doubleclick.net" />
+ <link rel="dns-prefetch" href="//stats.g.doubleclick.net" />
+ <link rel="dns-prefetch" href="//tpc.googlesyndication.com" />
+ <link rel="dns-prefetch" href="//pagead2.googlesyndication.com" />
+ <link rel="dns-prefetch" href="//adservice.google.com" />
+ <link rel="dns-prefetch" href="//securepubads.g.doubleclick.net" />
+ <link rel="dns-prefetch" href="https://ir-na.amazon-adsystem.com" />
+ <link rel="dns-prefetch" href="https://fls-na.amazon-adsystem.com" />
+ <link rel="dns-prefetch" href="//imasdk.googleapis.com" />
+ <link rel="dns-prefetch" href="//tps10232.doubleverify.com" />
+ <link rel="dns-prefetch" href="//pixel.mtrcs.samba.tv" />
+ <link rel="dns-prefetch" href="//js-agent.newrelic.com" />
+ <link rel="dns-prefetch" href="//c.amazon-adsystem.com" />
+ <link rel="dns-prefetch" href="//aax.amazon-adsystem.com" />
+ <link rel="preconnect" href="https://i.kinja-img.com" />
+ <link rel="preconnect" href="//x.kinja-static.com" />
+ <link rel="preconnect" href="//f.kinja-static.com" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg-webfont.woff2?08252015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg_it-webfont.woff2?08252015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold-webfont.woff2?08252015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold_it-webfont.woff2?08252015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-light-webfont.woff2?09162015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-lightitalic-webfont.woff2?09162015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-bold-webfont.woff2?09162015" as="font" type="font/woff2" crossorigin="" />
+ <link rel="alternate" type="application/rss+xml" title="Kotaku - All stories" href="https://kotaku.com/rss" />
+ <meta name="keywords" content="metroid, kotaku longreads, nintendo, Kotaku" />
+ <meta name="news_keywords" content="metroid, kotaku longreads, nintendo, Kotaku" />
+ <meta name="twitter:url" content="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577" />
+ <link rel="canonical" href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577" />
+ <link rel="amphtml" href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577/amp" />
+ <meta name="description" content="Nothing beats the passion of a true fan writing about something they love. That&amp;#039;s what you&amp;#039;re about to see here: one of the richest, most amazing tributes to a great gaming series that we&amp;#039;ve ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon." />
+ <meta property="og:title" content="The Spectacular Story Of Metroid, One Of Gaming's Richest Universes" />
+ <meta property="og:type" content="article" />
+ <meta name="author" content="Mama Robotnik" />
+ <meta property="og:url" content="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577" />
+ <meta property="og:description" content="Nothing beats the passion of a true fan writing about something they love. That&amp;#039;s what you&amp;#039;re about to see here: one of the richest, most amazing tributes to a great gaming series that we&amp;#039;ve ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon." />
+ <meta property="og:locale" content="en_US" />
+ <meta property="og:site_name" content="Kotaku" />
+ <meta property="og:image" content="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_675,pg_1,q_80,w_1200/18zu12g5xzyxojpg.jpg" />
+ <meta property="fb:app_id" content="35737966741" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:site" content="@kotaku" />
+ <meta name="twitter:title" content="The Spectacular Story Of Metroid, One Of Gaming's Richest Universes" />
+ <meta name="twitter:description" content="Nothing beats the passion of a true fan writing about something they love. That&amp;#039;s what you&amp;#039;re about to see here: one of the richest, most amazing tributes to a great gaming series that we&amp;#039;ve ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon." />
+ <meta name="twitter:image" content="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_675,pg_1,q_80,w_1200/18zu12g5xzyxojpg.jpg" />
+ <script async="async">
+ <![CDATA[
+ window.advBidxc = window.advBidxc || {};
+ window.advBidxc.exec = window.advBidxc.exec || [];
+ window.advBidxc.customerId = "8CUL2TG3D";
+ window.advBidxc.domain = window.location.hostname;
+ window.advBidxc.version = 5.1;
+ window.advBidxc.startTime = new Date().getTime();
+ (function(d) {
+ var e = d.createElement('script');
+ e.src = 'https://hbx.media.net/bidexchange.js?cid='+ window.advBidxc.customerId +'&version='+window.advBidxc.version+'&dn='+ window.advBidxc.domain;
+ e.async = true;
+ d.getElementsByTagName("head")[0].appendChild(e);
+ }(document));
+ ]]>
+ </script>
+ <script async="async" src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
+ <script async="async">
+ <![CDATA[
+ window.googletag = window.googletag || {};
+ window.googletag.cmd = window.googletag.cmd || [];
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ // GDPR
+ (function () { var e = false; var c = window; var t = document; function r() { if (!c.frames["__cmpLocator"]) { if (t.body) { var a = t.body; var e = t.createElement("iframe"); e.style.cssText = "display:none"; e.name = "__cmpLocator"; a.appendChild(e) } else { setTimeout(r, 5) } } } r(); function p() { var a = arguments; __cmp.a = __cmp.a || []; if (!a.length) { return __cmp.a } else if (a[0] === "ping") { a[2]({ gdprAppliesGlobally: e, cmpLoaded: false }, true) } else { __cmp.a.push([].slice.apply(a)) } } function l(t) { var r = typeof t.data === "string"; try { var a = r ? JSON.parse(t.data) : t.data; if (a.__cmpCall) { var n = a.__cmpCall; c.__cmp(n.command, n.parameter, function (a, e) { var c = { __cmpReturn: { returnValue: a, success: e, callId: n.callId } }; t.source.postMessage(r ? JSON.stringify(c) : c, "*") }) } } catch (a) { } } if (typeof __cmp !== "function") { c.__cmp = p; __cmp.msgHandler = l; c.addEventListener("message", l, false) } })();
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ // CCPA
+ (function () { var e = false; var c = window; var t = document; function r() { if (!c.frames["__uspapiLocator"]) { if (t.body) { var a = t.body; var e = t.createElement("iframe"); e.style.cssText = "display:none"; e.name = "__uspapiLocator"; a.appendChild(e) } else { setTimeout(r, 5) } } } r(); function p() { var a = arguments; __uspapi.a = __uspapi.a || []; if (!a.length) { return __uspapi.a } else if (a[0] === "ping") { a[2]({ gdprAppliesGlobally: e, cmpLoaded: false }, true) } else { __uspapi.a.push([].slice.apply(a)) } } function l(t) { var r = typeof t.data === "string"; try { var a = r ? JSON.parse(t.data) : t.data; if (a.__cmpCall) { var n = a.__cmpCall; c.__uspapi(n.command, n.parameter, function (a, e) { var c = { __cmpReturn: { returnValue: a, success: e, callId: n.callId } }; t.source.postMessage(r ? JSON.stringify(c) : c, "*") }) } } catch (a) { } } if (typeof __uspapi !== "function") { c.__uspapi = p; __uspapi.msgHandler = l; c.addEventListener("message", l, false) } })();
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+ window._sp_ = {
+ config: {
+ mmsDomain: "https://message1195.sp-prod.net",
+ cmpOrigin: "https://sourcepoint.mgr.consensu.org",
+ accountId: "1195",
+ events: {
+ onMessageReceiveData: function (data) {
+ if(data && data.msg_id>0){
+ if(data.message_url.indexOf("https://ccpa-notice.sp-prod.net")>-1){
+ window.__consent__ = 'CCPA'
+ }
+ if(data.message_url.indexOf("https://notice.sp-prod.net")>-1) {
+ window.__consent__ = 'GDPR';
+ // Notifying Media.net header bidder to apply user consent
+ if (window.advBidxc) {
+ try {
+ __cmp('getConsentData', null, function(result) {
+ if (result) {
+ window.advBidxc.exec.push(function(){
+ window.advBidxc.setGDPRApplicable(result.gdprApplies);
+ window.advBidxc.setGDPRConsent(result.consentData);
+ });
+ }
+ });
+ } catch(e) {}
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ window._sp_ccpa = {
+ config: {
+ mmsDomain: "https://message1195.sp-prod.net",
+ ccpaOrigin: "https://ccpa-service.sp-prod.net",
+ accountId: "1195",
+ getDnsMsgMms: true,
+ alwaysDisplayDns: false,
+ events: {
+ onMessageReceiveData: function (data) {
+ if(data && data.msg_id>0){
+ if(data.message_url.indexOf("https://ccpa-notice.sp-prod.net")>-1){
+ window.__consent__ = 'CCPA'
+ }
+ if(data.message_url.indexOf("https://notice.sp-prod.net")>-1) {
+ window.__consent__ = 'GDPR'
+ }
+ }
+ }
+ }
+ }
+ }
+ ]]>
+ </script>
+ <script async="async" src="https://dialogue.sp-prod.net/messagingWithoutDetection.js"></script>
+ <script async="async" src="https://ccpa.sp-prod.net/ccpa.js"></script>
+ <script type="module" src="/x-kinja-static/assets/new-client/runtime~ads.54484ea6a0a90bf7d28d.js"></script>
+ <script type="module" src="/x-kinja-static/assets/new-client/vendors~adManager~ads.2d79928e5945e5e8f867.js"></script>
+ <script type="module" src="/x-kinja-static/assets/new-client/adManager~ads~errorPage~experiments~featuredPermalinkPage~permalinkPage~permalinkPageIdle~profilePag~c41e40b3.ead312884f23b6a158a2.js"></script>
+ <script type="module" src="/x-kinja-static/assets/new-client/adManager~ads~errorPage~experiments~featuredPermalinkPage~permalinkPage~permalinkPageIdle~profilePag~1a2ffd3c.e1ca206c04adaea44b19.js"></script>
+ <script type="module" src="/x-kinja-static/assets/new-client/ads.034e556bf0601b6164a1.js"></script>
+ <script>
+ <![CDATA[
+ window._fasttokenPerformanceMark = 'frontend.layout.header.user_token_fast';
+ window._user = new Promise((resolve, reject) => {
+ window._fasttoken = function (response) {
+ if (window.performance) {
+ window.performance.mark(window._fasttokenPerformanceMark);
+ }
+ if (response && response.meta &&response.meta.status === 200) {
+ resolve(response.data);
+ } else {
+ reject(response ? response.meta : '');
+ }
+ };
+ });
+ ]]>
+ </script>
+ <script src="https://kinja.com/api/profile/accountwithtoken?jsonp=_fasttoken&amp;newFollows=true" defer="defer"></script>
+ <script>
+ <![CDATA[
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+ ]]>
+ </script>
+ <style>
+ <![CDATA[
+ .tp-iframe-wrapper{position:relative!important;}
+ ]]>
+ </style>
+ <script>
+ <![CDATA[
+ _comscore = window._comscore || [];
+ _comscore.push({
+ c1: '2',
+ c2: '6770184'
+ });
+ window._comscore = _comscore;
+ (function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';e.src='http'+('https:'===location.protocol?'s://sb':'://b')+'.scorecardresearch.com/beacon.js';t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (function(d) {
+ var e = d.createElement('script');
+ e.src = d.location.protocol + '//tag.bounceexchange.com/3592/i.js';
+ e.async = true;
+ d.getElementsByTagName("head")[0].appendChild(e);
+ }(document));
+ ]]>
+ </script>
+ <script src="https://cdn.digitru.st/prod/1/digitrust.min.js"></script>
+ <style data-styled="zVObM hVJsES hyLaMq cxfwkg fwjlmD fPqcTm ebBaTT cLvRyM hElAzM hWQHjO eQCLWh fBOpXK ggPaHg hoiFaE ldbUeF fPlCjx jRvBRt rzxbx iHLoZR miWDp Lwydz bNzDDF YrjCq iSaTEN cKiLPQ jBPzMI iUbnXK gBMIDl djRjMr falNPB cFfYvh fVpzWD jDxnTz bHuckL lmomFr kqthke jflTDT eSuPFB bYlXTp jgysUY jOQyEj jZQBpt ciLbRL irMuRt dLONoQ kwUvxw cjbzCR fLwIBi icfmop enFBrX hebJFs jNiKtz ktESSG ehkuKX etpvfO eFcvZm gVWJry gtgww fVlnpj cclgoe jIBiCM dXPirX XVppW bEUjwS kHCVke ldeICr eNdIIE kOFjhT esIpx bspgcg kFeogc bUDpTX fwSvTs gIjPOj izUYtn dsTWpc cLsyOJ ixUPOi iaPcjQ kBeEqh gOGycY wcAhP knZcug hgqaKZ brydAF fVaIqa iyJvbB eVhsmG ekphdR hVwDer yLgPx krajXX bLXZFj gkWXma hByOxy bSrIEu fivNdM erWUwi gcDoBX eagNII defoG fWhkEE glBtZI jyjbTH kUfXGZ busDXq esHOJV cqtDtB ktBPdN gdELAJ fcMbEd lfhhVO exbKyM bbQHny ldgdGx liJCYV hbcmGw yjpVX iimSGa ezwLgJ jLgjau jpbKEQ kyKjbV lkqtha grWrOW bNRtrM eJinCt kzkhwW dNAgCv fhmHGL hCitnH MWIGZ fVjjcw jOqHdi hICZjh iftYcF OMwVz foLDPX gpwIdA eTFIkv jBsDWZ frTClM jzcQTJ cWiYXU blgiqp kivedT iLDaWI gfolHV dXbcSW dUoECc hUFSvg iJyiXs hJpRRP FoItC liWXlp iXYVqp eZvXLs eblHLt dciqNP kIoxhb dIJDts iNvMiS gCydvg cysjdd flvRyU cKkWUs ciBKcm etfWWT iHzJmW jdIVZt kvyumD hepDvs hHYFwB djmGRD RjwRf eXGUJG dGHwsG ccAJCg sHsHa jZyWXs fwDNjy egRxyu jaUINu ghtMMt hNujir fbNnTF hPQZPo kSfANG nBxoz jvIkaX bzrPWe jcgXjw iaHIzx cirOTP eOmEvw kXLoyx dHZwOk fItspw huOEht iHpzjB" data-styled-version="4.3.2">
+ <![CDATA[
+ /* sc-component-id: sc-11qwj9y-0 */
+ .ldgdGx{padding:0 1.125rem;} @media only screen and (min-width:63.75em){.ldgdGx{width:66.5%;-webkit-order:1;-ms-flex-order:1;order:1;}}
+ /* sc-component-id: sc-11qwj9y-1 */
+ .liJCYV{width:100%;max-width:800px;padding-bottom:40px;margin:0 auto;} @media only screen and (min-width:50em){.liJCYV{padding-top:31px;}} @media only screen and (max-width:49.94em){.liJCYV{padding-top:1.125rem;}}
+ /* sc-component-id: iyvn34-0 */
+ .iSaTEN{fill:currentColor;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
+ /* sc-component-id: iyvn34-1 */
+ .jBPzMI{width:32px;height:32px;background-color:#B12460;border-radius:50%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:10px;} .jBPzMI .iyvn34-0{fill:#FFF;}
+ /* sc-component-id: sc-1rvv6e6-0 */
+ .gcDoBX{cursor:pointer;font-size:1.125rem;line-height:1.5rem;} .gcDoBX:not(:first-child){margin-left:0.25rem;} .gcDoBX:not(:last-child){margin-right:0.25rem;}
+ /* sc-component-id: sc-1rvv6e6-3 */
+ .erWUwi{background-color:#F5C056;border:1px solid #F5C056;border-radius:0.3125rem;color:#222;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.4375rem 0.625rem;padding:0.4375rem 2.25rem;min-height:2.5rem;} .erWUwi .sc-1rvv6e6-0{color:#222;} .erWUwi:hover{background-color:#f4b73e;border:1px solid #f4b73e;color:#222;} .erWUwi:hover .sc-1rvv6e6-0{color:#222;} .erWUwi:disabled{background-color:#CCC;border:1px solid #CCC;color:#FFF;cursor:default;} .erWUwi:disabled .sc-1rvv6e6-0{color:#FFF;cursor:default;} .erWUwi:focus{background-color:#f2ae26;border:1px solid #f2ae26;color:#222;} .erWUwi:focus .sc-1rvv6e6-0{color:#222;} .erWUwi:enabled:active{background-color:#f0a50e;border:1px solid #f0a50e;color:#222;} .erWUwi:enabled:active .sc-1rvv6e6-0{color:#222;}
+ /* sc-component-id: sc-1auy74q-1 */
+ .gkWXma span{text-transform:capitalize;font-weight:bold;}
+ /* sc-component-id: sc-1auy74q-3 */
+ .brydAF{border:1px solid #72AD75;margin:50px auto 62px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:636px;font-family:FiraSans,sans-serif;clear:both;} @media only screen and (min-width:37.37em){.brydAF{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}}
+ /* sc-component-id: sc-1auy74q-6 */
+ .yLgPx{-webkit-flex:auto;-ms-flex:auto;flex:auto;overflow:hidden;color:#666;}
+ /* sc-component-id: sc-1auy74q-7 */
+ .iyJvbB{margin:10px;color:#666;min-width:118px;max-width:180px;margin:0 10px;} .iyJvbB img,.iyJvbB amp-img{position:absolute;min-width:118px;}.eVhsmG{margin:10px;color:#666;}.ekphdR{margin:10px;color:#666;margin-right:16px;min-width:100px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}
+ /* sc-component-id: sc-1auy74q-8 */
+ .krajXX h2{font-family:FiraSans,sans-serif;margin:0;} .krajXX h2 a{color:#666;} .krajXX h2 a:hover{-webkit-text-decoration:none;text-decoration:none;} @media only screen and (max-width:37.31em){.krajXX h2{font-size:16px;line-height:1.2;margin-bottom:7 / 2;}} @media only screen and (min-width:37.37em){.krajXX h2{font-size:20px;}}
+ /* sc-component-id: sc-1auy74q-9 */
+ .hHYFwB{margin-bottom:10px;} .hHYFwB h2{font-family:FiraSans,sans-serif;margin:0;} .hHYFwB h2 a{color:#666;} .hHYFwB h2 a:hover{-webkit-text-decoration:none;text-decoration:none;} .hHYFwB h2 a{color:#000;}
+ /* sc-component-id: sc-1auy74q-10 */
+ .bLXZFj{font-size:13px;} @media only screen and (max-width:37.31em){.bLXZFj{line-height:20px;}}
+ /* sc-component-id: sc-1auy74q-11 */
+ .hByOxy{font-size:12px;} @media only screen and (max-width:37.31em){.hByOxy{line-height:20px;}}
+ /* sc-component-id: sc-1auy74q-12 */
+ .bSrIEu{display:block;color:#72AD75;font-weight:bold;}
+ /* sc-component-id: sc-1auy74q-13 */
+ .fivNdM{display:block;font-weight:bold;}
+ /* sc-component-id: sc-1auy74q-14 */
+ .hVwDer{position:relative;padding-bottom:100%;}
+ /* sc-component-id: sc-1auy74q-19 */
+ .djmGRD,.djmGRD a{font-family:ProximaNovaCond,sans-serif;color:#666;font-size:15px;margin-top:10px;} .djmGRD a{padding-bottom:0.25rem;border-bottom:1px solid #72AD75;}
+ /* sc-component-id: y7n5nk-1 */
+ .jdIVZt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}
+ /* sc-component-id: y7n5nk-2 */
+ .hepDvs{width:66%;}
+ /* sc-component-id: y7n5nk-3 */
+ .iHzJmW{border:1px solid #72AD75;margin:50px auto 62px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:636px;font-family:FiraSans,sans-serif;clear:both;padding:10px;margin:2rem auto;} @media only screen and (min-width:37.37em){.iHzJmW{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}}
+ /* sc-component-id: y7n5nk-4 */
+ .kvyumD{position:relative;width:33%;min-width:100px;margin-right:0.5rem;} .kvyumD.kvyumD img,.kvyumD.kvyumD amp-img{width:100%;height:100%;object-fit:contain;}
+ /* sc-component-id: bxm4mm-0 */
+ @media only screen and (min-width:50em){.gtgww{display:none;}}
+ /* sc-component-id: bxm4mm-2 */
+ .iXYVqp{margin-left:40px;margin-right:40px;border-top:1px solid #E5E5E5;padding-bottom:10px;}
+ /* sc-component-id: bxm4mm-3 */
+ .dciqNP{margin-left:40px;margin-right:40px;border-bottom:1px solid #E5E5E5;}
+ /* sc-component-id: bxm4mm-4 */
+ .liWXlp{margin:10px 0 20px 0;}
+ /* sc-component-id: bxm4mm-5 */
+ .eZvXLs{margin:0 !important;}
+ /* sc-component-id: bxm4mm-6 */
+ .eblHLt{text-transform:uppercase;font-size:14px;-webkit-letter-spacing:2px;-moz-letter-spacing:2px;-ms-letter-spacing:2px;letter-spacing:2px;color:#CCC;margin-bottom:10px;}
+ /* sc-component-id: bxm4mm-11 */
+ @media only screen and (min-width:37.37em){.ciBKcm{display:none;}}
+ /* sc-component-id: ynugv2-0 */
+ .eFcvZm{padding:31px 0;border-bottom:1px solid #E5E5E5;min-width:300px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} .eFcvZm:last-child{border-bottom:none;} @media only screen and (min-width:50em){.eFcvZm .bxm4mm-0{display:block;}}.gVWJry{padding:31px 0;border-bottom:1px solid #E5E5E5;min-width:300px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:31px 0 88px 0;} .gVWJry:last-child{border-bottom:none;} @media only screen and (min-width:50em){.gVWJry .bxm4mm-0{display:block;}}
+ /* sc-component-id: ynugv2-1 */
+ .hebJFs [data-ad-load-state=loaded]{padding:31px 0;border-bottom:1px solid #E5E5E5;min-width:300px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}
+ /* sc-component-id: ynugv2-2 */
+ .fLwIBi{display:none;} @media only screen and (min-width:63.75em){.fLwIBi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap;width:33.5%;-webkit-order:2;-ms-flex-order:2;order:2;border-left:1px solid #E5E5E5;padding:0 1.125rem;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}}
+ /* sc-component-id: ynugv2-3 */
+ .jNiKtz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;}
+ /* sc-component-id: sc-157agsr-0 */
+ @media only screen and (min-width:63.75em){.cjbzCR{max-width:1336px;margin:0 auto;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}} .cjbzCR .sc-11qwj9y-1{padding-top:0;} .cjbzCR .ynugv2-2 .ynugv2-1:first-child [data-ad-load-state=loaded]{padding-top:0;}
+ /* sc-component-id: sc-157agsr-1 */
+ .ciLbRL{position:relative;padding:1.5rem 1.125rem 1rem;margin:0 auto;} .ciLbRL h1{margin-bottom:0;} @media only screen and (max-width:63.69em){.ciLbRL{max-width:800px;box-sizing:content-box;}} @media only screen and (min-width:63.75em){.ciLbRL{max-width:1336px;}.ciLbRL.ciLbRL h1{max-width:calc(1336px * 0.8);font-size:52px;line-height:64px;}} @media only screen and (min-width:1260px) and (max-width:1363px){.ciLbRL{padding-left:calc((66.5% - 800px) / 2);margin:0;}} @media only screen and (max-width:37.31em){} @media only screen and (min-width:37.37em) and (max-width:49.94em){} @media only screen and (min-width:50em) and (max-width:63.69em){} @media only screen and (min-width:63.75em) and (max-width:85.19em){} @media only screen and (min-width:85.25em){.ciLbRL{padding-left:calc(((1336px * 0.665) - 800px) / 2);}}
+ /* sc-component-id: sc-1out364-0 */
+ .fwjlmD{-webkit-text-decoration:none;text-decoration:none;}
+ /* sc-component-id: vuc0jk-0 */
+ .hVJsES{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background:#000;}
+ /* sc-component-id: vuc0jk-1 */
+ .hyLaMq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;} .hyLaMq > li:first-child{margin-left:-8px;} @media only screen and (max-width:49.94em){.hyLaMq{width:calc((100vw - 16px) * 1 - 16px);}} @media only screen and (min-width:50em) and (max-width:63.69em){.hyLaMq{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.hyLaMq{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:85.25em){.hyLaMq{width:calc((1364px - 32px) * 1 - 32px);}}
+ /* sc-component-id: vuc0jk-2 */
+ .cxfwkg{text-transform:uppercase;line-height:24px;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0 8px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;color:#7D7D7D;} .cxfwkg:hover{background:#222;color:#F5F5F5;} .cxfwkg:hover > a,.cxfwkg:hover > a:hover,.cxfwkg:hover > a:active,.cxfwkg:hover > a:focus,.cxfwkg:hover > a.focus{color:#F5F5F5;} .cxfwkg > a{position:relative;top:1px;} .cxfwkg > a,.cxfwkg > a:hover,.cxfwkg > a:active,.cxfwkg > a:focus,.cxfwkg > a.focus{-webkit-text-decoration:none;text-decoration:none;color:#CCC;}
+ /* sc-component-id: vuc0jk-3 */
+ .fPqcTm{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:0 8px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;} .fPqcTm::after{width:1px;height:14px;background-color:#666;content:'';}
+ /* sc-component-id: sc-2d8w30-0 */
+ .jRvBRt{--scale:1;}.rzxbx{--scale:0.35;}
+ /* sc-component-id: sc-2d8w30-1 */
+ .iHLoZR{position:relative;height:calc(32px * var(--scale));display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;} .iHLoZR svg{position:absolute;-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-transform:scale(var(--scale));-ms-transform:scale(var(--scale));transform:scale(var(--scale));} .iHLoZR.avclub{width:calc(150px * var(--scale));} .iHLoZR.avclub svg{top:-40%;} .iHLoZR.clickhole{width:calc(216px * var(--scale));} .iHLoZR.clickhole svg{top:-4%;} .iHLoZR.deadspin{width:calc(254px * var(--scale));} .iHLoZR.deadspin svg{top:0%;} .iHLoZR.earther{width:calc(217px * var(--scale));} .iHLoZR.earther svg{top:-1%;} .iHLoZR.gizmodo{width:calc(225px * var(--scale));} .iHLoZR.gizmodo svg{top:0%;} .iHLoZR.jalopnik{width:calc(228px * var(--scale));} .iHLoZR.jalopnik svg{top:0%;} .iHLoZR.jezebel{width:calc(206px * var(--scale));} .iHLoZR.jezebel svg{top:0%;} .iHLoZR.kotaku{width:calc(212px * var(--scale));} .iHLoZR.kotaku svg{top:-10%;} .iHLoZR.lifehacker{width:calc(180px * var(--scale));} .iHLoZR.lifehacker svg{top:-25%;} .iHLoZR.splinter{width:calc(261px * var(--scale));} .iHLoZR.splinter svg{top:-7%;} .iHLoZR.theinventory{width:calc(258px * var(--scale));} .iHLoZR.theinventory svg{top:-13%;} .iHLoZR.theroot{width:calc(205px * var(--scale));} .iHLoZR.theroot svg{top:-20%;} .iHLoZR.theonion{width:calc(262px * var(--scale));} .iHLoZR.theonion svg{top:-22%;} .iHLoZR.thetakeout{width:calc(140px * var(--scale));} .iHLoZR.thetakeout svg{top:-34%;} .iHLoZR.kinja{width:calc(152px * var(--scale));} .iHLoZR.kinja svg{top:-22%;} .iHLoZR.gomedia{width:calc(241px * var(--scale));} .iHLoZR.gomedia svg{top:-20%;} .iHLoZR.kinjadeals{width:calc(203px * var(--scale));} .iHLoZR.kinjadeals svg{top:-10%;} .iHLoZR.kinjavideo{width:calc(243px * var(--scale));} .iHLoZR.kinjavideo svg{top:-6%;}
+ /* sc-component-id: j48i5d-0 */
+ .hPQZPo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .hPQZPo + svg,.hPQZPo + .iyvn34-0{margin-left:4px;}
+ /* sc-component-id: j48i5d-1 */
+ .fbNnTF{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;white-space:nowrap;pointer-events:none;} .fbNnTF svg + span{margin-left:4px;} .fbNnTF .iyvn34-0 + span{margin-left:4px;}
+ /* sc-component-id: j48i5d-2 */
+ .jaUINu{width:auto;height:42px;padding:0 2rem;border:transparent 1px solid;border-radius:21px;border-color:#B12460;color:#B12460;font-size:1rem;text-align:center;line-height:42px;background-color:#FFF;-webkit-transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;} .jaUINu .j48i5d-1 > svg{margin-bottom:2px;} .jaUINu .iyvn34-0{margin-bottom:2px;} .jaUINu:hover,.jaUINu:active,.jaUINu:focus{color:#5c1332;border-color:#5c1332;background-color:#fff;} .jaUINu:hover .j48i5d-1 > svg,.jaUINu:active .j48i5d-1 > svg,.jaUINu:focus .j48i5d-1 > svg{stroke:#871b49;} @media only screen and (max-width:49.94em){}.ghtMMt{width:auto;height:34px;padding:0 2rem;border:transparent 1px solid;border-radius:34px;border-color:transparent;color:#FFF;font-size:14px;text-align:center;line-height:34px;background-color:#1877F2;-webkit-transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;} .ghtMMt .j48i5d-1 > svg{margin-bottom:2px;} .ghtMMt .iyvn34-0{margin-bottom:2px;} .ghtMMt:hover,.ghtMMt:active,.ghtMMt:focus{color:#fff;border-color:transparent;background-color:#0b5fcc;} .ghtMMt:hover .j48i5d-1 > svg,.ghtMMt:active .j48i5d-1 > svg,.ghtMMt:focus .j48i5d-1 > svg{stroke:#fff;} @media only screen and (max-width:49.94em){}.hNujir{width:auto;height:34px;padding:0 2rem;border:transparent 1px solid;border-radius:34px;border-color:transparent;color:#FFF;font-size:14px;text-align:center;line-height:34px;background-color:#1DA1F2;-webkit-transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;transition:background-color 0.2s ease-out,border-color 0.2s ease-out,color 0.2s ease-out;} .hNujir .j48i5d-1 > svg{margin-bottom:2px;} .hNujir .iyvn34-0{margin-bottom:2px;} .hNujir:hover,.hNujir:active,.hNujir:focus{color:#fff;border-color:transparent;background-color:#0c85d0;} .hNujir:hover .j48i5d-1 > svg,.hNujir:active .j48i5d-1 > svg,.hNujir:focus .j48i5d-1 > svg{stroke:#fff;} @media only screen and (max-width:49.94em){}
+ /* sc-component-id: ynl58c-0 */
+ .gdELAJ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:inherit;height:inherit;} .gdELAJ .SVGInline-svg{display:none;} .gdELAJ svg{max-width:100%;width:inherit;height:inherit;}.fcMbEd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;height:20px;} .fcMbEd .SVGInline-svg{display:none;} .fcMbEd svg{max-width:100%;width:inherit;height:inherit;}
+ /* sc-component-id: sc-1cfejv7-0 */
+ .iHpzjB{background-color:#F5F5F5;border-top:1px solid #E5E5E5;} .iHpzjB .sc-147n754-0{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:26px 30px;}
+ /* sc-component-id: sc-1jotqfp-2 */
+ .jZQBpt{background-color:inherit;} .jZQBpt [data-ad-load-state=loaded]{border-bottom:1px solid #E5E5E5;padding:20px 0;} @media only screen and (max-width:969px){.jZQBpt{display:none;}} .jZQBpt .ad-container[data-ad-load-state=loaded] div iframe{margin:0 auto;} .jZQBpt .ad-container[data-ad-load-state=loaded] > div{width:100% !important;} @media only screen and (max-width:63.69em){.jZQBpt{display:none;}}
+ /* sc-component-id: sc-17y8tyw-0 */
+ .zVObM{display:none;} @media only screen and (min-width:50em){.zVObM{display:block;width:100%;}}
+ /* sc-component-id: sc-8vrmk6-0 */
+ .fPlCjx{height:100%;font-size:1.5rem;color:#222;font-weight:bold;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} .fPlCjx:hover{-webkit-text-decoration:none;text-decoration:none;color:#000;} .fPlCjx .sc-2d8w30-1{--scale:0.8;} @media only screen and (max-width:63.69em){.fPlCjx .sc-2d8w30-1{--scale:0.6;}}
+ /* sc-component-id: dfwuc8-0 */
+ .fVpzWD{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-transform:uppercase;padding:0 6px;-webkit-transition:color 300ms;transition:color 300ms;white-space:nowrap;margin-right:8px;} .fVpzWD span{color:#000;font-size:14px;font-weight:bold;height:21px;line-height:22px;-webkit-letter-spacing:1.27px;-moz-letter-spacing:1.27px;-ms-letter-spacing:1.27px;letter-spacing:1.27px;} .fVpzWD:hover,.fVpzWD:active{-webkit-text-decoration:none;text-decoration:none;} .fVpzWD:hover span,.fVpzWD:active span{color:#B12460;} .fVpzWD.section-nav__search-btn{border-right:0;} .fVpzWD:first-child{padding-left:0;} @media only screen and (max-width:85.19em){.fVpzWD{border:none;line-height:21px;white-space:nowrap;}} @media only screen and (max-width:49.94em){.fVpzWD:first-child{margin-left:16px;}.fVpzWD:last-child{margin-right:16px;}}.jDxnTz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-transform:uppercase;padding:0 6px;-webkit-transition:color 300ms;transition:color 300ms;white-space:nowrap;margin-right:8px;border:0;padding-left:7.5px;padding-right:7.5px;font-size:17px;white-space:nowrap;} .jDxnTz span{color:#000;font-size:14px;font-weight:bold;height:21px;line-height:22px;-webkit-letter-spacing:1.27px;-moz-letter-spacing:1.27px;-ms-letter-spacing:1.27px;letter-spacing:1.27px;} .jDxnTz:hover,.jDxnTz:active{-webkit-text-decoration:none;text-decoration:none;} .jDxnTz:hover span,.jDxnTz:active span{color:#B12460;} .jDxnTz.section-nav__search-btn{border-right:0;} .jDxnTz:first-child{padding-left:0;} @media only screen and (max-width:85.19em){.jDxnTz{border:none;line-height:21px;white-space:nowrap;display:none;}} @media only screen and (max-width:49.94em){.jDxnTz:first-child{margin-left:16px;}.jDxnTz:last-child{margin-right:16px;}}
+ /* sc-component-id: dfwuc8-1 */
+ .falNPB{position:relative;overflow:hidden;height:22px;margin-bottom:24px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex:1;-ms-flex:1;flex:1;-ms-overflow-style:none;-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;} .falNPB::-webkit-scrollbar{display:none;} @media only screen and (max-width:63.69em){.falNPB{margin-bottom:16px;}} @media only screen and (min-width:50em){.falNPB{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:820px;}} @media only screen and (max-width:63.69em){.falNPB{overflow:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;}.falNPB .dfwuc8-0:not(:last-child){margin-right:4px;}} @media only screen and (min-width:37.37em) and (max-width:49.94em){.falNPB{margin:0 0 16px;}} @media only screen and (max-width:37.31em){.falNPB{margin:0 0 14px;}}.cFfYvh{position:relative;overflow:hidden;height:22px;margin-bottom:24px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex:1;-ms-flex:1;flex:1;-ms-overflow-style:none;-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;height:100%;border:0;margin:0;padding-left:24px;} .cFfYvh::-webkit-scrollbar{display:none;} @media only screen and (max-width:63.69em){.cFfYvh{margin-bottom:16px;}} @media only screen and (min-width:50em){.cFfYvh{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}} @media only screen and (max-width:63.69em){.cFfYvh{overflow:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;}.cFfYvh .dfwuc8-0:not(:last-child){margin-right:4px;}} @media only screen and (min-width:37.37em) and (max-width:49.94em){.cFfYvh{margin:0 0 16px;}} @media only screen and (max-width:37.31em){.cFfYvh{margin:0 0 14px;}} @media only screen and (max-width:63.69em){.cFfYvh{padding-left:16px;}} .cFfYvh ul{margin:0;} .cFfYvh .dfwuc8-0{margin-right:4px;}
+ /* sc-component-id: dfwuc8-2 */
+ .jflTDT{height:30px;width:1px;background-color:#CCC;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:16px;} @media only screen and (max-width:85.19em){.jflTDT{display:none;}}
+ /* sc-component-id: sc-1il3uru-2 */
+ .iUbnXK{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:48px;height:48px;position:relative;vertical-align:middle;} .iUbnXK > a{outline:0;line-height:0;} .iUbnXK > a.js_header-userbutton{color:#FFF;} @media only screen and (max-width:49.94em){.iUbnXK{position:unset;}}
+ /* sc-component-id: sc-1il3uru-3 */
+ .gBMIDl{width:30px;height:30px;border-radius:50%;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;background-position:center;background-size:cover;background-color:#B12460;} .gBMIDl svg{color:#FFF;}
+ /* sc-component-id: peggds-0 */
+ .bbQHny{color:#FFF;cursor:pointer;font-size:1.125rem;line-height:1.5rem;-webkit-transform:translate(0,4%);-ms-transform:translate(0,4%);transform:translate(0,4%);} .bbQHny:not(:first-child){margin-left:0.25rem;} .bbQHny:not(:last-child){margin-right:0.25rem;}
+ /* sc-component-id: peggds-1 */
+ .exbKyM{background-color:#B12460;border:1px solid #B12460;border-radius:0.3125rem;color:#FFF;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.4375rem 0.625rem;min-height:2.5rem;white-space:nowrap;} .exbKyM .peggds-0{color:#FFF;} .exbKyM .iyvn34-0{pointer-events:none;} .exbKyM:hover{background-color:#9c2055;border:1px solid #9c2055;color:#FFF;-webkit-text-decoration:none;text-decoration:none;} .exbKyM:hover .peggds-0{color:#FFF;} .exbKyM:disabled{background-color:#CCC;border:1px solid #CCC;color:#FFF;cursor:default;} .exbKyM:disabled .peggds-0{color:#FFF;cursor:default;} .exbKyM:focus{background-color:#871b49;border:1px solid #871b49;color:#FFF;} .exbKyM:focus .peggds-0{color:#FFF;} .exbKyM:enabled:active{background-color:#71173e;border:1px solid #71173e;color:#FFF;} .exbKyM:enabled:active .peggds-0{color:#FFF;}
+ /* sc-component-id: wz9htl-0 */
+ .bHuckL{display:none;line-height:19px;color:#666;padding-left:18px;padding-bottom:16px;font-family:ProximaNovaCond,sans-serif;} @media only screen and (min-width:50em){.bHuckL{display:none;}}
+ /* sc-component-id: sc-global-2850183867 */
+ body.noscroll{overflow:hidden;position:relative;}
+ /* sc-component-id: sc-1f6xobn-0 */
+ .fBOpXK{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:84px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;} @media only screen and (max-width:49.94em){.fBOpXK{padding:0 16px;height:52px;}} @media only screen and (min-width:50em) and (max-width:63.69em){.fBOpXK{height:64px;}}.ggPaHg{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:84px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:60px;margin:0 auto;} @media only screen and (max-width:49.94em){.ggPaHg{padding:0 16px;height:52px;}} @media only screen and (min-width:50em) and (max-width:63.69em){.ggPaHg{height:64px;}} @media only screen and (max-width:37.31em){.ggPaHg{height:54px;}} @media only screen and (max-width:49.94em){.ggPaHg{width:calc((100vw - 16px) * 1 - 16px);padding:0;}} @media only screen and (max-width:63.69em){.ggPaHg nav a{padding:0 16px;overflow:hidden;}.ggPaHg nav a span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}} @media only screen and (min-width:50em) and (max-width:63.69em){.ggPaHg{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.ggPaHg{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:85.25em){.ggPaHg{width:calc((1364px - 32px) * 1 - 32px);}}
+ /* sc-component-id: sc-1f6xobn-2 */
+ .djRjMr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:48px;height:48px;} .djRjMr.djRjMr{color:#222;} .djRjMr .icon-close{display:none;} .djRjMr.open .icon-close{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .djRjMr.open .icon-hamburger{display:none;}
+ /* sc-component-id: sc-1f6xobn-3 */
+ .cKiLPQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:48px;height:48px;display:none;} .cKiLPQ.cKiLPQ{color:#222;} @media only screen and (min-width:63.75em){.cKiLPQ{width:auto;}.cKiLPQ.show{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.cKiLPQ:first-of-type{margin:0 8px 0 16px;}.cKiLPQ:not(:first-of-type){margin:0 8px;}} .cKiLPQ.cKiLPQ{color:#222;} .cKiLPQ::after{content:'';width:1px;height:30px;margin-left:16px;background-color:#CCC;} .cKiLPQ:hover{color:#B12460;-webkit-text-decoration:none;text-decoration:none;}
+ /* sc-component-id: sc-1f6xobn-4 */
+ .YrjCq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:48px;height:48px;display:none;margin-right:8px;} .YrjCq.YrjCq{color:#222;} .YrjCq.YrjCq{color:#000;} .YrjCq:hover{color:#B12460;} @media only screen and (min-width:50em){.YrjCq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}
+ /* sc-component-id: sc-1f6xobn-7 */
+ .eQCLWh{height:auto;margin:auto;} @media only screen and (max-width:49.94em){.eQCLWh{width:calc((100vw - 16px) * 1 + 16px);}} @media only screen and (min-width:50em) and (max-width:63.69em){.eQCLWh{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.eQCLWh{width:calc((100vw - 24px) * 1 - 24px);}} @media only screen and (min-width:85.25em){.eQCLWh{width:calc((1364px - 32px) * 1 - 32px);}}
+ /* sc-component-id: sc-1f6xobn-8 */
+ .hElAzM{background:rgba(255,255,255,0.99);top:0;margin-bottom:0;position:relative;width:100%;border-top:4px solid #B12460;border-bottom:1px solid #E5E5E5;} .hElAzM.hElAzM.hElAzM.hElAzM.hElAzM{padding:0;} @media only screen and (min-width:37.37em){.hElAzM.open{border-bottom:none;}}.hWQHjO{background:rgba(255,255,255,0.99);top:0;margin-bottom:0;position:relative;width:100%;border-top:4px solid #B12460;border-bottom:1px solid #E5E5E5;position:fixed;box-shadow:0 2px 10px rgba(0,0,0,0.07);-webkit-transform:translateY(-84px);-ms-transform:translateY(-84px);transform:translateY(-84px);-webkit-transition:-webkit-transform 0;-webkit-transition:transform 0;transition:transform 0;z-index:500;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:-webkit-transform 400ms cubic-bezier(0.215,0.61,0.355,1);-webkit-transition:transform 400ms cubic-bezier(0.215,0.61,0.355,1);transition:transform 400ms cubic-bezier(0.215,0.61,0.355,1);} .hWQHjO.hWQHjO.hWQHjO.hWQHjO.hWQHjO{padding:0;} @media only screen and (max-width:49.94em){.hWQHjO{z-index:95;}} @media only screen and (min-width:37.37em){.hWQHjO.open{border-bottom:none;}}
+ /* sc-component-id: sc-1f6xobn-9 */
+ .cLvRyM{position:relative;} .cLvRyM.open{margin-top:0;position:fixed;height:100vh;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;left:0;right:0;z-index:100;background:#FFF;overflow-y:scroll;-webkit-overflow-scrolling:touch;} .cLvRyM.open .dfwuc8-1{display:none;} .cLvRyM.open .header-bar{display:none;} .cLvRyM.open .z9u32j-0{position:relative;top:0;} @media only screen and (max-width:63.69em){.cLvRyM.open .wz9htl-0{display:block;}}
+ /* sc-component-id: sc-1f6xobn-13 */
+ .hoiFaE{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;-webkit-flex:auto;-ms-flex:auto;flex:auto;min-width:0;margin-right:16px;} @media only screen and (max-width:49.94em){.hoiFaE{margin-right:6px;}} @media only screen and (max-width:49.94em){.hoiFaE{overflow:hidden;}} .hoiFaE .sc-8vrmk6-0{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;} @media only screen and (max-width:49.94em){.hoiFaE .sc-8vrmk6-0{width:100%;}}.ldbUeF{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;} @media only screen and (max-width:49.94em){.ldbUeF{overflow:hidden;}} .ldbUeF .sc-8vrmk6-0{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;} @media only screen and (max-width:49.94em){.ldbUeF .sc-8vrmk6-0{width:100%;}}
+ /* sc-component-id: sc-1f6xobn-14 */
+ .miWDp{line-height:31px;max-height:30px;padding-left:16px;margin-left:16px;border-left:1px solid #CCC;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:ProximaNovaCond,sans-serif;} @media only screen and (max-width:49.94em){.miWDp{display:none;}}
+ /* sc-component-id: sc-1f6xobn-15 */
+ .Lwydz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}.bNzDDF{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;} @media only screen and (max-width:63.69em){.bNzDDF .sc-1f6xobn-4{display:none;}} @media only screen and (max-width:49.94em){.bNzDDF .sc-1il3uru-2{display:none;}} .bNzDDF .sc-1il3uru-1{max-height:calc(100vh - 60px);overflow-y:hidden;} .bNzDDF ul.user-links{max-height:calc(70vh - 35px);} .bNzDDF ul.myblogs{max-height:calc(25vh - 35px);}
+ /* sc-component-id: sc-1f6xobn-16 */
+ .lmomFr{display:none;position:absolute;top:-24px;right:0;bottom:0;left:0;background:rgba(255,255,255,0.6);} .lmomFr.show{display:block;}
+ /* sc-component-id: sc-1f6xobn-17 */
+ .kqthke{display:none;} .kqthke.show{display:block;} .kqthke.show.disabled{display:none;}
+ /* sc-component-id: sc-global-3951472044 */
+ img{max-width:100%;} video{max-width:100%;}
+ /* sc-component-id: sc-global-2349293107 */
+ @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:normal;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg-webfont.woff2?08252015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg-webfont.woff?08252015) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:normal;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg_it-webfont.woff2?08252015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_reg_it-webfont.woff?08252015) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:bold;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold-webfont.woff2?08252015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold-webfont.woff?08252015) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:bold;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold_it-webfont.woff2?08252015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_sbold_it-webfont.woff?08252015) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:100;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_thin-webfont.woff2?04172017) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_thin-webfont.woff?04172017) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:100;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_thin_it-webfont.woff2?04172017) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_thin_it-webfont.woff?04172017) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:800;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_bold-webfont.woff2?01182018) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_bold-webfont.woff?01182018) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:800;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_bold_it-webfont.woff2?01182018) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_bold_it-webfont.woff?01182018) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:900;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_xbold-webfont.woff2?01182018) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_xbold-webfont.woff?01182018) format('woff');} @font-face{font-display:fallback;font-family:'ProximaNovaCond';font-weight:900;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_xbold_it-webfont.woff2?01182018) format('woff2'), url(https://f.kinja-static.com/assets/fonts/proxima/proxima_nova_cond_xbold_it-webfont.woff?01182018) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:400;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-light-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-light-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:400;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-lightitalic-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-lightitalic-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:500;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-regular-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-regular-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:500;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-italic-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-italic-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:700;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-bold-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-bold-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'ElizabethSerif';font-weight:700;font-style:italic;src:url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-bolditalic-webfont.woff2?09162015) format('woff2'), url(https://f.kinja-static.com/assets/fonts/elizabeth-serif/elizabethserif-bolditalic-webfont.woff?09162015) format('woff');} @font-face{font-display:fallback;font-family:'FiraSans';font-weight:300;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/fira-sans/fira-sans-light.woff2?02092016) format('woff2'), url(https://f.kinja-static.com/assets/fonts/fira-sans/fira-sans-light.woff?02092016) format('woff');} @font-face{font-display:fallback;font-family:'FiraSans';font-weight:bold;font-style:normal;src:url(https://f.kinja-static.com/assets/fonts/fira-sans/fira-sans-medium.woff2?02092016) format('woff2'), url(https://f.kinja-static.com/assets/fonts/fira-sans/fira-sans-medium.woff?02092016) format('woff');} @font-face{font-display:fallback;font-family:'Libre Baskerville';font-weight:700;font-style:normal;src:local('Libre Baskerville Bold'),local('LibreBaskerville-Bold'), url(https://f.kinja-static.com/assets/fonts/libre-baskerville/libre-baskerville-bold.woff2) format('woff2');}
+ /* sc-component-id: sc-1efpnfq-0 */
+ .kwUvxw{font-size:2.5rem;font-family:ProximaNovaCond,sans-serif;line-height:1.2;} @media only screen and (max-width:37.31em){.kwUvxw{font-size:2rem;}}
+ /* sc-component-id: sc-1efpnfq-1 */
+ .dLONoQ a{display:inline;color:#000;} .dLONoQ a:hover{color:#000;-webkit-text-decoration:underline;text-decoration:underline;}
+ /* sc-component-id: sc-1m41dwj-0 */
+ .hUFSvg{position:absolute;top:8px;z-index:1;opacity:0;width:32px;height:32px;border-radius:5px;cursor:pointer;-webkit-transition:0.4s opacity;transition:0.4s opacity;background:rgba(0,0,0,0.7);pointer-events:none;left:8px;} .hUFSvg:hover{opacity:1;} .hUFSvg svg{position:relative;display:block;margin:auto;color:#FFF;opacity:0.5;top:7px;}
+ /* sc-component-id: sc-145m8ut-0 */
+ .FoItC{color:#222;-webkit-transition:color 0.1s ease-out;transition:color 0.1s ease-out;box-shadow:inset 0 -2px 0 #B12460;-webkit-text-decoration:none;text-decoration:none;} .FoItC:hover{color:#B12460;-webkit-text-decoration:none;text-decoration:none;}
+ /* sc-component-id: sc-1eow4w5-0 */
+ .dUoECc{clear:both;display:block;cursor:pointer;} .dUoECc:hover .lightbox{opacity:1;}
+ /* sc-component-id: sc-1eow4w5-1 */
+ .kivedT{position:relative;margin:0 0 1.5rem;} .kivedT:hover .sc-1m41dwj-0{opacity:1;} @media only screen and (max-width:37.31em){.kivedT{margin:0 -1.125rem 1.5rem -1.125rem;}} @media only screen and (min-width:37.37em){} @media only screen and (min-width:37.37em) and (max-width:49.94em){} @media only screen and (min-width:50em) and (max-width:63.69em){} @media only screen and (min-width:63.75em) and (max-width:85.19em){} @media only screen and (min-width:85.25em){} @media only screen and (min-width:50em){}.iLDaWI{position:relative;margin:0 0 1.5rem;} .iLDaWI:hover .sc-1m41dwj-0{opacity:1;} @media only screen and (max-width:37.31em){.iLDaWI{max-width:100% !important;margin:0 auto 1.5rem !important;}} @media only screen and (min-width:37.37em){.iLDaWI{max-width:636px;margin-left:auto;margin-right:auto;}} @media only screen and (min-width:37.37em) and (max-width:49.94em){} @media only screen and (min-width:50em) and (max-width:63.69em){} @media only screen and (min-width:63.75em) and (max-width:85.19em){} @media only screen and (min-width:85.25em){} @media only screen and (min-width:50em){}
+ /* sc-component-id: sc-1eow4w5-2 */
+ .gfolHV{position:relative;overflow:hidden;max-width:100%;margin-left:auto;margin-right:auto;}.dXbcSW{position:relative;overflow:hidden;max-width:100%;margin-left:auto;margin-right:auto;cursor:pointer;display:block;}
+ /* sc-component-id: sc-1eow4w5-3 */
+ .iJyiXs{position:relative;background-color:#f5f5f5;} .iJyiXs video{position:absolute;width:100%;height:auto;} .iJyiXs img{position:absolute;width:100%;}
+ /* sc-component-id: sc-1lmpmkf-1 */
+ .irMuRt div[data-ad-unit="SECTION_SPONSORSHIP"]{float:right;} @media only screen and (min-width:63.75em){.irMuRt div[data-ad-unit="SECTION_SPONSORSHIP"]{padding-left:1rem;}} @media only screen and (max-width:63.69em){.irMuRt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.irMuRt .sc-1lmpmkf-0{-webkit-order:1;-ms-flex-order:1;order:1;}.irMuRt .permalink-story-type{-webkit-order:2;-ms-flex-order:2;order:2;}.irMuRt div[data-ad-unit="SECTION_SPONSORSHIP"]{-webkit-order:3;-ms-flex-order:3;order:3;padding:0.5rem 0 1rem;}.irMuRt header{-webkit-order:4;-ms-flex-order:4;order:4;}}
+ /* sc-component-id: ejta2c-0 */
+ .kHCVke{height:0;width:100%;padding-bottom:56.25%;background-size:cover;background-repeat:no-repeat;background-position:center;background-color:#F5F5F5;overflow:hidden;position:relative;} .kHCVke:hover .sc-1638q22-0{bottom:0;} .kHCVke img,.kHCVke video{width:100%;}
+ /* sc-component-id: sc-1rh3ayr-0 */
+ .cKkWUs{font-family:ProximaNovaCond,sans-serif;font-size:16px;color:#000;box-shadow:inset 0 -2px 0 #B12460;line-height:18px;} .cKkWUs .hostname{font-weight:bold;} .cKkWUs:hover{color:#B12460;-webkit-text-decoration:none;text-decoration:none;}
+ /* sc-component-id: sc-1rh3ayr-1 */
+ .iNvMiS{padding-bottom:56.2%;} .iNvMiS video,.iNvMiS img,.iNvMiS amp-img{position:absolute;width:100%;}
+ /* sc-component-id: sc-1rh3ayr-2 */
+ .dIJDts{display:block;position:relative;margin:-1.125rem -1.125rem 1rem;} @media only screen and (min-width:37.37em){.dIJDts{width:25%;min-width:25%;padding:1.125rem 0 0 1.125rem;margin:0;float:left;}} @media only screen and (max-width:49.94em){.dIJDts{margin:auto;}.dIJDts .sc-1rh3ayr-1 img{border-top-left-radius:5px;border-top-right-radius:5px;}} .dIJDts .sc-1rh3ayr-1{margin:0;position:relative;border-bottom:5px solid #FBC000;} .dIJDts > span{position:relative;top:-20px;}
+ /* sc-component-id: sc-1rh3ayr-3 */
+ .cysjdd{font-size:20px;line-height:24px;margin-bottom:10px;}
+ /* sc-component-id: sc-1rh3ayr-4 */
+ .flvRyU.flvRyU{font-size:15px;line-height:25px;margin-bottom:0.6rem;}
+ /* sc-component-id: sc-1rh3ayr-5 */
+ .kIoxhb{clear:both;margin:2rem auto;border:#E5E5E5 1px solid;border-radius:5px;box-shadow:#E5E5E5 0 2px 5px;max-width:636px;} @media only screen and (min-width:50em) and (max-width:63.69em){.kIoxhb{max-width:636px;}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.kIoxhb{max-width:636px;}} @media only screen and (min-width:85.25em){.kIoxhb{max-width:636px;}} @media only screen and (min-width:37.37em){.kIoxhb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}
+ /* sc-component-id: sc-1rh3ayr-6 */
+ .gCydvg{padding:1.125rem;} .gCydvg a,.gCydvg a:hover{color:#000;}
+ /* sc-component-id: sc-759qgu-0 */
+ .knZcug{text-align:left;font-size:24px;font-family:ProximaNovaCond,sans-serif;line-height:1.3;margin-top:0;margin-bottom:0;} @media only screen and (min-width:37.37em){.knZcug{margin-bottom:8px;}}
+ /* sc-component-id: sc-5f1ako-0 */
+ .kBeEqh{padding-bottom:3px;margin-bottom:16px;font-size:20px;line-height:1.3;font-weight:700;color:#222;border-bottom:1px solid #E5E5E5;}
+ /* sc-component-id: sc-5f1ako-1 */
+ .gOGycY{border:1px solid #72AD75;padding:10px 20px;margin-bottom:16px;} .gOGycY:last-of-type{margin-bottom:0;} .gOGycY .sc-1out364-0:hover{color:inherit;}
+ /* sc-component-id: sc-5f1ako-2 */
+ .wcAhP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex:2.162 1 0%;-ms-flex:2.162 1 0%;flex:2.162 1 0%;}
+ /* sc-component-id: sc-5f1ako-3 */
+ .iaPcjQ{width:100%;} .iaPcjQ .ejta2c-0{margin-bottom:12px;} .iaPcjQ .sc-759qgu-0{margin-bottom:8px;font-size:18px;line-height:23px;}
+ /* sc-component-id: uhd9ir-0 */
+ .lkqtha{display:inline-block;font-size:14px;line-height:19px;} .lkqtha .sc-1out364-0{color:#7D7D7D;} .lkqtha .sc-1out364-0:hover{color:#7D7D7D;}
+ /* sc-component-id: sc-15qf33u-0 */
+ .bUDpTX{width:33.333333333333336%;border:1px solid #FFF;display:block;float:left;position:relative;opacity:0;z-index:0;-webkit-transform:translate3d(0%,0,0);-ms-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0);-webkit-transition:opacity 300ms;transition:opacity 300ms;} .bUDpTX.active{opacity:1;z-index:10;}.fwSvTs{width:33.333333333333336%;border:1px solid #FFF;display:block;float:left;position:relative;opacity:0;z-index:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-transition:opacity 300ms;transition:opacity 300ms;} .fwSvTs.active{opacity:1;z-index:10;}.gIjPOj{width:33.333333333333336%;border:1px solid #FFF;display:block;float:left;position:relative;opacity:0;z-index:0;-webkit-transform:translate3d(-200%,0,0);-ms-transform:translate3d(-200%,0,0);transform:translate3d(-200%,0,0);-webkit-transition:opacity 300ms;transition:opacity 300ms;} .gIjPOj.active{opacity:1;z-index:10;}
+ /* sc-component-id: sc-15qf33u-1 */
+ .dsTWpc{color:#000;margin:10px 0 1px;font-size:20px;line-height:1.2;font-family:ProximaNovaCond,sans-serif;word-break:break-word;}
+ /* sc-component-id: sc-15qf33u-3 */
+ .cLsyOJ{font-size:15px;line-height:17px;color:#7D7D7D;display:inline;margin-right:15px;} .cLsyOJ strong{color:#000;}
+ /* sc-component-id: sc-15qf33u-4 */
+ .izUYtn{font-size:15px;line-height:17px;color:#7D7D7D;margin:15px 0 6px;} .izUYtn strong{color:#000;}
+ /* sc-component-id: sc-15qf33u-5 */
+ .kFeogc:hover{-webkit-text-decoration:none;text-decoration:none;} .kFeogc:hover .sc-15qf33u-1{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#000;text-decoration-color:#000;}
+ /* sc-component-id: sc-15qf33u-6 */
+ .ixUPOi{font-size:13px;text-transform:none;color:#7D7D7D;margin-top:4px;}
+ /* sc-component-id: sc-17xh7h5-0 */
+ .ldeICr{margin-bottom:2px;margin-left:1px;margin-right:1px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
+ /* sc-component-id: sc-17xh7h5-1 */
+ .eNdIIE{-webkit-flex:1;-ms-flex:1;flex:1;height:2px;position:relative;background-color:#CCC;overflow:hidden;}
+ /* sc-component-id: sc-17xh7h5-2 */
+ .kOFjhT{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:1.5px;z-index:1;left:0;top:0;bottom:0;background-color:#7D7D7D;-webkit-transform-origin:0 0 0;-ms-transform-origin:0 0 0;transform-origin:0 0 0;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);} .kOFjhT.ticking{-webkit-animation:gTwDaX 8000ms linear;animation:gTwDaX 8000ms linear;-webkit-animation-fill-mode:both;animation-fill-mode:both;}
+ /* sc-component-id: sc-1m3f1n9-0 */
+ .jIBiCM{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:2px;}
+ /* sc-component-id: sc-1m3f1n9-1 */
+ .dXPirX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;border:1px solid #FFF;position:relative;} .dXPirX:last-child{margin-right:0;} .dXPirX::after{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;left:0;right:0;top:0;bottom:0;font-size:35px;font-weight:bold;color:#FFF;content:'1';z-index:1;opacity:0;background-color:rgba(0,0,0,0.8);-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;} .dXPirX.active{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .dXPirX.active::after{opacity:0.7;} .dXPirX:hover{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .dXPirX:hover::after{opacity:0.7;}.XVppW{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;border:1px solid #FFF;position:relative;} .XVppW:last-child{margin-right:0;} .XVppW::after{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;left:0;right:0;top:0;bottom:0;font-size:35px;font-weight:bold;color:#FFF;content:'2';z-index:1;opacity:0;background-color:rgba(0,0,0,0.8);-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;} .XVppW.active{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .XVppW.active::after{opacity:0.7;} .XVppW:hover{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .XVppW:hover::after{opacity:0.7;}.bEUjwS{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;border:1px solid #FFF;position:relative;} .bEUjwS:last-child{margin-right:0;} .bEUjwS::after{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:absolute;left:0;right:0;top:0;bottom:0;font-size:35px;font-weight:bold;color:#FFF;content:'3';z-index:1;opacity:0;background-color:rgba(0,0,0,0.8);-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;} .bEUjwS.active{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .bEUjwS.active::after{opacity:0.7;} .bEUjwS:hover{-webkit-filter:grayscale(100%);filter:grayscale(100%);} .bEUjwS:hover::after{opacity:0.7;}
+ /* sc-component-id: i2qujp-0 */
+ .esIpx{box-sizing:border-box;overflow:hidden;}
+ /* sc-component-id: i2qujp-1 */
+ .bspgcg{width:300%;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}
+ /* sc-component-id: i2qujp-2 */
+ .cclgoe{contain:content;} .cclgoe:hover .sc-17xh7h5-1 > div{-webkit-animation-play-state:paused;animation-play-state:paused;}
+ /* sc-component-id: i2qujp-3 */
+ .fVlnpj header{margin:5px 0 16px;} .fVlnpj header h2{margin:0;font-weight:normal;font-size:20px;font-family:ProximaNovaCond,sans-serif;color:#666;} .fVlnpj header h2 a{color:#666;} .fVlnpj header h2 strong{color:#000;}
+ /* sc-component-id: sc-6l6yqv-0 */
+ .defoG{padding-bottom:4px;margin-bottom:16px;font-size:16px;line-height:21px;text-transform:uppercase;}
+ /* sc-component-id: sc-6l6yqv-1 */
+ .busDXq{font-size:18px;line-height:23px;}
+ /* sc-component-id: sc-6l6yqv-2 */
+ .kUfXGZ:hover{color:inherit;}
+ /* sc-component-id: sc-6l6yqv-3 */
+ .fWhkEE{position:relative;} .fWhkEE:not(:last-child){margin-bottom:1rem;}
+ /* sc-component-id: sc-6l6yqv-4 */
+ .jyjbTH{color:#666;font-size:12px;font-style:normal;height:14px;line-height:14px;margin-right:4px;text-transform:uppercase;}
+ /* sc-component-id: sc-6l6yqv-5 */
+ .glBtZI{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:8px;}
+ /* sc-component-id: sc-6l6yqv-6 */
+ .eagNII{margin:0 auto 32px;}
+ /* sc-component-id: sc-10uan3u-0 */
+ .esHOJV{width:100%;font-weight:700;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} .esHOJV button{margin-top:16px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;} .esHOJV .ynl58c-0{margin-right:16px;min-width:64px;} .esHOJV .ynl58c-0 svg[aria-label="GO avatar"]{background-color:#FBC000;} .esHOJV .ynl58c-0 svg[aria-label="GO avatar"] path{fill:#FFF;}
+ /* sc-component-id: sc-10uan3u-1 */
+ .cqtDtB{text-transform:uppercase;font-size:16px;padding-bottom:3px;margin-bottom:12px;border-bottom:1px solid #E5E5E5;}
+ /* sc-component-id: sc-10uan3u-2 */
+ .ktBPdN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:18px;color:#222;}
+ /* sc-component-id: sc-10uan3u-3 */
+ .lfhhVO:hover{-webkit-text-decoration:none;text-decoration:none;} .lfhhVO button{width:100%;}
+ /* sc-component-id: sc-1ez0oyg-0 */
+ .ktESSG{min-height:0px;}.ehkuKX{min-height:768px;}
+ /* sc-component-id: sc-1ez0oyg-1 */
+ .etpvfO{position:-webkit-sticky;position:sticky;top:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}
+ /* sc-component-id: sc-1dvfjie-0 */
+ .fhmHGL{position:absolute;display:none;top:100%;right:0;} .fhmHGL.open{display:block;}
+ /* sc-component-id: sc-1dvfjie-1 */
+ .hCitnH{z-index:98;position:relative;margin-top:5px;background:#FFF;border-radius:5px;border:1px solid #CCC;min-width:174px;} .hCitnH::before,.hCitnH::after{content:"";display:block;position:absolute;height:0;width:0;border-bottom-style:solid;} .hCitnH::after{border:inset 6px;border-color:transparent transparent #FFF transparent;top:-12px;right:14px;} .hCitnH::before{border:inset 7px;border-color:transparent transparent #CCC transparent;top:-14px;right:13px;}
+ /* sc-component-id: sc-1dvfjie-2 */
+ .eJinCt{display:inline-block;position:relative;}
+ /* sc-component-id: sc-10a86sv-0 */
+ .fVjjcw{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#666;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:14px;line-height:2;padding:6px 8px;text-transform:uppercase;} .fVjjcw:first-child{border-top-left-radius:5px;border-top-right-radius:5px;} .fVjjcw:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px;} .fVjjcw:hover{background:#F5F5F5;color:#666;-webkit-text-decoration:none;text-decoration:none;} .fVjjcw .iyvn34-0{margin-right:15px;}
+ /* sc-component-id: sc-101yw2y-0 */
+ .eSuPFB{position:relative;}
+ /* sc-component-id: sc-101yw2y-1 */
+ .jgysUY{position:relative;display:block;}
+ /* sc-component-id: sc-101yw2y-2 */
+ .bYlXTp{float:left;}
+ /* sc-component-id: sc-101yw2y-4 */
+ .icfmop{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;}
+ /* sc-component-id: sc-101yw2y-5 */
+ @media only screen and (min-width:50em){.ebBaTT.custom-header-has-background.hangable-curation .layout--Modular3 .grid__zone:not(:first-child),.ebBaTT.custom-header-has-background.hangable-curation .layout--Modular4 .grid__zone:not(:first-child){border-left-width:0px;position:relative;}.ebBaTT.custom-header-has-background.hangable-curation .layout--Modular3 .grid__zone:not(:first-child)::before,.ebBaTT.custom-header-has-background.hangable-curation .layout--Modular4 .grid__zone:not(:first-child)::before{content:'';position:absolute;height:calc(100% - 100px);left:0;bottom:0;border-left:1px solid #E5E5E5;}.ebBaTT.custom-header-has-background.hangable-curation .curation-module__zone__item-width-children{background-color:#FFF;padding-top:1rem;padding:1rem 20px 0px;}.ebBaTT.custom-header-has-background.hangable-curation .curation-module__zone__item-width-children:first-child{padding-left:20px;}.ebBaTT.custom-header-has-background.hangable-curation .curation-module__zone__item-width-children:not(:last-child){margin-right:-20px;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3{position:relative;top:-6rem;margin-bottom:-6rem;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .curation_control > button,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .curation_control > button,.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .curation_control > div,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .curation_control > div{top:6rem;position:relative;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain >.sc-1whp23a-2:first-child,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 >.sc-1whp23a-2:first-child,.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child .sc-1whp23a-2,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child .sc-1whp23a-2{position:relative;z-index:0;padding:1rem 1rem 0 1rem;margin:-1rem -1rem 0 -1rem;background:white;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain >section:first-child,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 >section:first-child,.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child section,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child section{position:relative;z-index:0;padding:1rem 1rem 0 1rem;margin:-1rem -1rem 0 -1rem;background:transparent;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child::after,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child::after{content:none;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child.canSelect:hover section,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child.canSelect:hover section{background-color:#F5F5F5;border:2px solid #CCC;border-radius:5px;top:-2px;left:-2px;margin-right:-20px;}.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child.isSelected section,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child.isSelected section,.ebBaTT.custom-header-has-background.hangable-curation > .curation-mountain .sc-1v0374p-0:first-child.isSelected:hover section,.ebBaTT.custom-header-has-background.hangable-curation .sc-101yw2y-3 .sc-1v0374p-0:first-child.isSelected:hover section{background-color:#FDF0C7;border:2px solid #B12460;border-radius:5px;top:-2px;left:-2px;margin-right:-20px;}}
+ /* sc-component-id: sc-101yw2y-6 */
+ @media only screen and (min-width:50em){.jOQyEj.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:750;}.jOQyEj.sticky-top .ad-container{padding-top:20px;background-color:#FFF;}}
+ /* sc-component-id: sc-101yw2y-7 */
+ .enFBrX .ad-container{min-height:250px;padding-bottom:31px;} .enFBrX .ad-container[data-ad-load-state=empty]{display:none;}
+ /* sc-component-id: sc-1lmbno3-0 */
+ .eXGUJG{position:relative;} .eXGUJG li{padding-left:2.25rem;margin-bottom:6px;} .eXGUJG li::before{position:absolute;content:'\b7';margin:-1px 0 0 -29px;font-weight:bold;font-size:24px;}
+ /* sc-component-id: sc-1bwb26k-1 */
+ .RjwRf{font-family:ProximaNovaCond,sans-serif;text-align:left;}
+ /* sc-component-id: gcp5ez-0 */
+ .dGHwsG{border:solid #ddd;border-width:1px 0 0;height:0;margin-top:40px;margin-bottom:40px;clear:both;}
+ /* sc-component-id: sc-1mn1yww-0 */
+ .OMwVz{font-size:10px;font-weight:400;line-height:1.3;-webkit-letter-spacing:0.2px;-moz-letter-spacing:0.2px;-ms-letter-spacing:0.2px;letter-spacing:0.2px;text-transform:uppercase;text-align:center;margin-top:6px;font-size:16px;line-height:24px;text-transform:inherit;margin-top:0;}
+ /* sc-component-id: sc-1mn1yww-1 */
+ .iftYcF{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;color:#7D7D7D;} .iftYcF:hover{color:#B12460;}
+ /* sc-component-id: sc-12i6d45-0 */
+ .jzcQTJ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;overflow-y:hidden;overflow-x:auto;}
+ /* sc-component-id: sc-12i6d45-1 */
+ .cWiYXU{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;}
+ /* sc-component-id: sc-1vjnuu8-0 */
+ .frTClM{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
+ /* sc-component-id: wvv3zm-0 */
+ @media only screen and (min-width:50em){.MWIGZ{display:none;}}
+ /* sc-component-id: wvv3zm-1 */
+ .kzkhwW{color:#7D7D7D;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .kzkhwW:hover{color:#7D7D7D;-webkit-text-decoration:underline;text-decoration:underline;}
+ /* sc-component-id: wvv3zm-2 */
+ .dNAgCv{text-transform:uppercase;color:#000;padding-left:4px;}
+ /* sc-component-id: sc-1jc3ukb-0 */
+ .ezwLgJ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-family:ProximaNovaCond,sans-serif;font-size:16px;line-height:21px;text-align:left;}
+ /* sc-component-id: sc-1jc3ukb-1 */
+ .jLgjau{-webkit-flex-basis:40px;-ms-flex-preferred-size:40px;flex-basis:40px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:10px;} .jLgjau img{width:40px;height:40px;border-radius:50%;position:unset;} .jLgjau video{width:40px;height:40px;border-radius:50%;background-color:#F5F5F5;}
+ /* sc-component-id: sc-1jc3ukb-2 */
+ .jpbKEQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
+ /* sc-component-id: sc-1jc3ukb-4 */
+ .grWrOW{display:inline-block;font-size:16px;line-height:17px;margin:0 7px 2px 7px;color:#7D7D7D;}
+ /* sc-component-id: sc-1jc3ukb-5 */
+ .bNRtrM{line-height:19px;}
+ /* sc-component-id: sc-1jc3ukb-6 */
+ .kyKjbV{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} @media only screen and (max-width:37.31em){.kyKjbV{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}} @media only screen and (min-width:37.37em){.kyKjbV{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}} .kyKjbV time{font-size:16px;}
+ /* sc-component-id: sc-17x7c2u-0 */
+ .eTFIkv{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:39px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:39px;-webkit-text-decoration:none;text-decoration:none;color:#B12460;-webkit-transition:color 200ms;transition:color 200ms;} .eTFIkv:hover{color:#5c1332;}
+ /* sc-component-id: sc-17x7c2u-1 */
+ .jBsDWZ{padding:0 10px;}
+ /* sc-component-id: sc-17x7c2u-2 */
+ .gpwIdA{background-color:#CCC;border-radius:3px;border:1px solid #CCC;display:grid;grid-auto-flow:column;grid-gap:1px;} .gpwIdA > .sc-17x7c2u-0{background-color:white;} .gpwIdA > .sc-17x7c2u-0:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px;} .gpwIdA > .sc-17x7c2u-0:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px;}
+ /* sc-component-id: sc-15g8630-0 */
+ .hICZjh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;height:100%;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} @media only screen and (min-width:37.37em){.hICZjh .iyvn34-0 svg{width:24px;height:24px;}}
+ /* sc-component-id: sc-15g8630-1 */
+ .jOqHdi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .jOqHdi > *{margin:0 4px;min-width:32px;color:#7D7D7D;-webkit-transition:color 200ms ease-in-out;transition:color 200ms ease-in-out;} .jOqHdi > *:first-child{margin-left:0;} .jOqHdi a:hover{-webkit-text-decoration:none;text-decoration:none;color:#B12460;}
+ /* sc-component-id: sc-83o472-0 */
+ .iimSGa{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;} @media only screen and (max-width:37.31em){.iimSGa{width:100%;}}
+ /* sc-component-id: sc-83o472-1 */
+ .yjpVX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;} @media only screen and (max-width:37.31em){.yjpVX{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.yjpVX .sc-83o472-0 + .sc-83o472-0{margin-top:15px;}} @media only screen and (min-width:37.37em){.yjpVX{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}
+ /* sc-component-id: sc-83o472-2 */
+ .foLDPX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}
+ /* sc-component-id: r43lxo-0 */
+ .blgiqp{max-width:1024px;width:100%;} @media only screen and (min-width:50em) and (max-width:63.69em){.blgiqp{max-width:1024px;}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.blgiqp{max-width:1024px;}} @media only screen and (min-width:85.25em){.blgiqp{max-width:1024px;}} .blgiqp .sc-1lmbno3-0:not(.sc-1eow4w5-1),.blgiqp .sc-1lmbno3-1:not(.sc-1eow4w5-1),.blgiqp .sc-8hxd3p-0:not(.sc-1eow4w5-1),.blgiqp .sc-1eu5fsj-0:not(.sc-1eow4w5-1),.blgiqp .ooo3c9-0:not(.sc-1eow4w5-1),.blgiqp .sc-1jaa1bu-0:not(.sc-1eow4w5-1),.blgiqp p:not(.sc-1eow4w5-1),.blgiqp ul:not(.sc-1eow4w5-1),.blgiqp hr:not(.sc-1eow4w5-1),.blgiqp .sc-1bwb26k-1:not(.sc-1eow4w5-1),.blgiqp > span:not(.sc-1eow4w5-1),.blgiqp figure:not(.sc-1eow4w5-1),.blgiqp pre:not(.sc-1eow4w5-1){margin-left:auto;margin-right:auto;max-width:636px;} @media only screen and (min-width:50em) and (max-width:63.69em){.blgiqp .sc-1lmbno3-0:not(.sc-1eow4w5-1),.blgiqp .sc-1lmbno3-1:not(.sc-1eow4w5-1),.blgiqp .sc-8hxd3p-0:not(.sc-1eow4w5-1),.blgiqp .sc-1eu5fsj-0:not(.sc-1eow4w5-1),.blgiqp .ooo3c9-0:not(.sc-1eow4w5-1),.blgiqp .sc-1jaa1bu-0:not(.sc-1eow4w5-1),.blgiqp p:not(.sc-1eow4w5-1),.blgiqp ul:not(.sc-1eow4w5-1),.blgiqp hr:not(.sc-1eow4w5-1),.blgiqp .sc-1bwb26k-1:not(.sc-1eow4w5-1),.blgiqp > span:not(.sc-1eow4w5-1),.blgiqp figure:not(.sc-1eow4w5-1),.blgiqp pre:not(.sc-1eow4w5-1){max-width:636px;}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.blgiqp .sc-1lmbno3-0:not(.sc-1eow4w5-1),.blgiqp .sc-1lmbno3-1:not(.sc-1eow4w5-1),.blgiqp .sc-8hxd3p-0:not(.sc-1eow4w5-1),.blgiqp .sc-1eu5fsj-0:not(.sc-1eow4w5-1),.blgiqp .ooo3c9-0:not(.sc-1eow4w5-1),.blgiqp .sc-1jaa1bu-0:not(.sc-1eow4w5-1),.blgiqp p:not(.sc-1eow4w5-1),.blgiqp ul:not(.sc-1eow4w5-1),.blgiqp hr:not(.sc-1eow4w5-1),.blgiqp .sc-1bwb26k-1:not(.sc-1eow4w5-1),.blgiqp > span:not(.sc-1eow4w5-1),.blgiqp figure:not(.sc-1eow4w5-1),.blgiqp pre:not(.sc-1eow4w5-1){max-width:636px;}} @media only screen and (min-width:85.25em){.blgiqp .sc-1lmbno3-0:not(.sc-1eow4w5-1),.blgiqp .sc-1lmbno3-1:not(.sc-1eow4w5-1),.blgiqp .sc-8hxd3p-0:not(.sc-1eow4w5-1),.blgiqp .sc-1eu5fsj-0:not(.sc-1eow4w5-1),.blgiqp .ooo3c9-0:not(.sc-1eow4w5-1),.blgiqp .sc-1jaa1bu-0:not(.sc-1eow4w5-1),.blgiqp p:not(.sc-1eow4w5-1),.blgiqp ul:not(.sc-1eow4w5-1),.blgiqp hr:not(.sc-1eow4w5-1),.blgiqp .sc-1bwb26k-1:not(.sc-1eow4w5-1),.blgiqp > span:not(.sc-1eow4w5-1),.blgiqp figure:not(.sc-1eow4w5-1),.blgiqp pre:not(.sc-1eow4w5-1){max-width:636px;}} @media only screen and (max-width:63.69em){.blgiqp figure figcaption{padding-left:20px;}} .blgiqp .sc-1lmbno3-0,.blgiqp .sc-1lmbno3-1,.blgiqp .sc-8hxd3p-0,.blgiqp ul,.blgiqp p{font-family:ElizabethSerif,Georgia,serif;font-size:15px;line-height:28px;font-weight:normal;} @media only screen and (min-width:37.37em){.blgiqp .sc-1lmbno3-0,.blgiqp .sc-1lmbno3-1,.blgiqp .sc-8hxd3p-0,.blgiqp ul,.blgiqp p{font-size:16px;line-height:29px;}} .blgiqp p{margin-bottom:1.25rem;} .blgiqp .sc-1lmbno3-0,.blgiqp .sc-1lmbno3-1{margin-bottom:1.5rem;} .blgiqp iframe{max-width:100%;} .blgiqp .twitter-embed iframe{margin:0 auto;} .blgiqp .has-image,.blgiqp .has-embed,.blgiqp .has-video{margin-bottom:0;width:100%;clear:left;} .blgiqp .ooo3c9-0{margin-bottom:1.5rem;} .blgiqp .has-image.has-image,.blgiqp .has-video.has-video{margin-top:0;margin-bottom:1.5rem;position:relative;} .blgiqp .has-image.has-image.media-large,.blgiqp .has-video.has-video.media-large{max-width:800px;} .blgiqp .has-image.has-image.media-large,.blgiqp .has-video.has-video.media-large,.blgiqp .has-image.has-image.media-medium,.blgiqp .has-video.has-video.media-medium,.blgiqp .has-image.has-image.media-small,.blgiqp .has-video.has-video.media-small{width:auto;text-align:center;} @media only screen and (min-width:37.37em){.blgiqp .has-image.has-image.media-small,.blgiqp .has-video.has-video.media-small{max-width:($main-content-max-width / 2);float:left;margin:0.5rem 1.125rem 0.5rem 0;}} @media only screen and (max-width:49.94em){.blgiqp .has-image.has-image.media-medium,.blgiqp .has-video.has-video.media-medium,.blgiqp .has-image.has-image.media-large,.blgiqp .has-video.has-video.media-large{width:auto;margin-left:-1.125rem;margin-right:-1.125rem;}.blgiqp .has-image.has-image.media-medium figcaption,.blgiqp .has-video.has-video.media-medium figcaption,.blgiqp .has-image.has-image.media-large figcaption,.blgiqp .has-video.has-video.media-large figcaption,.blgiqp .has-image.has-image.media-medium .video-embed__caption,.blgiqp .has-video.has-video.media-medium .video-embed__caption,.blgiqp .has-image.has-image.media-large .video-embed__caption,.blgiqp .has-video.has-video.media-large .video-embed__caption{padding:0 1.125rem;}} .blgiqp pre{box-shadow:inset 0 0 5px 0 rgba(0,0,0,0.5);display:block;overflow:auto;padding:1.125rem;margin-bottom:1.5rem;width:auto;word-break:break-all;} .blgiqp pre > code{background-color:transparent;} .blgiqp pre p{line-height:24px;} .blgiqp pre,.blgiqp pre p,.blgiqp code{font-family:Courier,monospace;color:#222;font-size:1rem;} .blgiqp pre,.blgiqp code{background-color:#F5F5F5;} .blgiqp code{padding:0 7px;display:inline-block;} .blgiqp ul{margin-bottom:1.5rem;} .blgiqp ul li{margin-bottom:6px;} .blgiqp ul.commerce li{font-family:FiraSans,sans-serif;padding-left:0;color:#666;} .blgiqp ul.commerce li em{color:#72AD75;font-style:normal;} .blgiqp ul.commerce li a{color:inherit;-webkit-text-decoration:none;text-decoration:none;box-shadow:none;} .blgiqp ul.commerce li a:hover strong{-webkit-text-decoration:underline;text-decoration:underline;} .blgiqp ul.commerce li::before{display:none;} .blgiqp .sc-1bwb26k-1.commerce-icon{max-width:100%;} .blgiqp .ad-container{margin:0;width:auto;height:auto;} .blgiqp .ad-container[data-ad-load-state=loaded] div iframe{margin:0 auto;}
+ /* sc-component-id: sc-1bdg1q0-0 */
+ .dHZwOk{border-top:#E5E5E5 solid 1px;position:fixed;bottom:0;right:0;width:100%;padding:6px;background:#FFF;z-index:20;}
+ /* sc-component-id: sc-1bdg1q0-1 */
+ .huOEht{margin:0 5px;padding:0 1rem;width:90px;height:28px;line-height:unset;} .huOEht > div{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;} .huOEht span{margin-left:6px;} @media only screen and (max-width:49.94em){.huOEht{margin:0 10px;width:120px;}}
+ /* sc-component-id: sc-1bdg1q0-2 */
+ .fItspw{width:100%;max-width:1336px;margin:0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:0 1.125rem;} @media only screen and (max-width:49.94em){.fItspw{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}}
+ /* sc-component-id: z1qon0-0 */
+ .sHsHa{font-size:16px;line-height:21px;margin-bottom:1rem;text-transform:uppercase;} @media only screen and (max-width:37.31em){.sHsHa{color:#7D7D7D;}}
+ /* sc-component-id: sc-18b1b2r-0 */
+ .jZyWXs{display:inline-block;} @media only screen and (max-width:37.31em){.jZyWXs{width:100%;max-width:100%;}}
+ /* sc-component-id: sc-18b1b2r-3 */
+ .egRxyu{border-radius:3px;padding:0 1rem;border-color:#CCC;} .egRxyu:hover,.egRxyu:active,.egRxyu:focus{border-color:#CCC;}
+ /* sc-component-id: sc-18b1b2r-4 */
+ .fwDNjy{text-align:right;}
+ /* sc-component-id: sc-18b1b2r-5 */
+ .ccAJCg{margin:2.5rem auto 0;max-width:636px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;} @media only screen and (max-width:37.31em){.ccAJCg .sc-18b1b2r-2{width:100%;margin-top:36px;}.ccAJCg .sc-18b1b2r-2 .z1qon0-0:first-child{display:none;}.ccAJCg .sc-18b1b2r-1{display:block;}.ccAJCg .btk291-0{width:100%;}} @media only screen and (min-width:37.37em){.ccAJCg .sc-18b1b2r-1{display:none;}} @media only screen and (min-width:50em) and (max-width:63.69em){.ccAJCg{max-width:636px;}} @media only screen and (min-width:63.75em) and (max-width:85.19em){.ccAJCg{max-width:636px;}} @media only screen and (min-width:85.25em){.ccAJCg{max-width:636px;}}
+ /* sc-component-id: sc-1or3yyu-0 */
+ .nBxoz{padding-bottom:4px;margin-bottom:16px;font-size:16px;line-height:21px;text-transform:uppercase;}
+ /* sc-component-id: sc-1or3yyu-1 */
+ .jcgXjw{margin-bottom:4px;font-size:18px;line-height:23px;}
+ /* sc-component-id: sc-1or3yyu-2 */
+ .bzrPWe:hover{color:inherit;}
+ /* sc-component-id: sc-1or3yyu-3 */
+ .jvIkaX{position:relative;padding-left:25px;} .jvIkaX > *:first-child::before{content:"•";position:absolute;left:0;font-size:21px;font-weight:bold;color:#B12460;} .jvIkaX:not(:last-child){margin-bottom:1rem;}
+ /* sc-component-id: sc-1or3yyu-4 */
+ .kSfANG{max-width:636px;margin:32px auto 0;}
+ /* sc-component-id: sc-73739c-0 */
+ @media only screen and (max-width:37.31em){.iaHIzx{margin:0 -1.125rem;}}
+ /* sc-component-id: sc-73739c-2 */
+ .kXLoyx.trc_related_container{padding:0;} .kXLoyx .thumbnails-a{padding:0;}
+ /* sc-component-id: sc-73739c-3 */
+ .eOmEvw{margin:40px auto 0;max-width:636px;}
+ /* sc-component-id: sc-73739c-4 */
+ .cirOTP iframe{margin:1rem auto;}
+ /* sc-component-id: sc-1fofo4n-0 */
+ .hbcmGw{margin-bottom:24px;}
+ /* sc-component-id: sc-1auy74q-22 */
+ .fVaIqa{position:absolute;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:2;top:-19px;left:-17px;background:#72AD75;height:55px;width:55px;min-width:55px;border-radius:50%;line-height:55px;text-align:center;font-size:20px;} .fVaIqa span{color:#FFF;} .fVaIqa:hover{-webkit-text-decoration:none;text-decoration:none;color:#FFF;} .fVaIqa svg{width:34px;height:34px;color:#FFF;margin:0;}
+ ]]>
+ </style>
+ <style data-styled="gTwDaX" data-styled-version="4.3.2">
+ <![CDATA[
+ /* sc-component-id: sc-keyframes-gTwDaX */
+ @-webkit-keyframes gTwDaX{from{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);}to{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);}} @keyframes gTwDaX{from{-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);}to{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);}}
+ ]]>
+ </style>
+ <style>
+ <![CDATA[
+ body{-webkit-tap-highlight-color:transparent;word-wrap:break-word;overflow-x:hidden}ol,ul{list-style-type:none}ol,ul,ol li,ul li,iframe{margin:0}iframe{border:0;display:block;padding:0}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.vjs-modal-dialog .vjs-modal-dialog-content{position:absolute;top:0;left:0;width:100%;height:100%}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.vjs-button>.vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABDkAAsAAAAAG6gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV3hY21hcAAAAYQAAADaAAADPv749/pnbHlmAAACYAAAC3AAABHQZg6OcWhlYWQAAA3QAAAAKwAAADYZw251aGhlYQAADfwAAAAdAAAAJA+RCLFobXR4AAAOHAAAABMAAACM744AAGxvY2EAAA4wAAAASAAAAEhF6kqubWF4cAAADngAAAAfAAAAIAE0AIFuYW1lAAAOmAAAASUAAAIK1cf1oHBvc3QAAA/AAAABJAAAAdPExYuNeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGS7wTiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGJHcRdyA4RZgQRADK3CxEAAHic7dFZbsMgAEXRS0ycyZnnOeG7y+qC8pU1dHusIOXxuoxaOlwZYWQB0Aea4quIEN4E9LzKbKjzDeM6H/mua6Lmc/p8yhg0lvdYx15ZG8uOLQOGjMp3EzqmzJizYMmKNRu27Nhz4MiJMxeu3Ljz4Ekqm7T8P52G8PP3lnTOVk++Z6iN6QZzNN1F7ptuN7eGOjDUoaGODHVsuvU8MdTO9Hd5aqgzQ50b6sJQl4a6MtS1oW4MdWuoO0PdG+rBUI+GejLUs6FeDPVqqDdDvRvqw1CfhpqM9At0iFLaAAB4nJ1YDXBTVRZ+5/22TUlJ8we0pHlJm7RJf5O8F2j6EymlSPkpxaL8U2xpa3DKj0CBhc2IW4eWKSokIoLsuMqssM64f+jA4HSdWXXXscBq67IOs3FXZ1ZYWVyRFdo899yXtIBQZ90k7717zz3v3HPPOfd854YCCj9cL9dL0RQFOqCbGJnrHb5EayiKIWN8iA/hWBblo6hUWm8TtCDwE80WMJus/irwyxOdxeB0MDb14VNJHnXYoLLSl6FfCUYO9nYPTA8Epg9090LprfbBbZ2hY0UlJUXHQp3/vtWkS6EBv8+rPMq5u9692f/dNxJNiqwC1xPE9TCUgCsSdQWgE3XQD25lkG4CN2xmTcOXWBOyser6RN6KnGbKSbmQ3+d0OI1m2W8QzLLkI2sykrWAgJJEtA8vGGW/2Q+CmT3n8zS9wZwu2DCvtuZKZN3xkrLh36yCZuUomQSqGpY8t/25VfHVhw8z4ebGBtfLb0ya9PCaDc+8dGTvk2dsh6z7WzvowlXKUSWo9MJ15a3KrEP2loOr2Ojhw6iW6hf2BDdEccQvZGpaAy7YovSwq8kr7HGllxpd71rkS6G0Sf11sl9OvMK1+jwPPODxjUwkOim9CU3ix1wNjXDfmJSEn618Bs6lpWwUpU+8PCqLMY650zjq8VhCIP17NEKTx3eaLL+s5Pi6yJWaWjTHLR1jYzPSV9VF/6Ojdb/1kO3Mk3uhHC0x6gc1BjlKQ+nQFxTYdaJkZ7ySVxLBbhR1dsboNXp1tCYKW2LRaEzpYcIx2BKNxaL0ZaUnSqfFoiNhHKR/GkX6PWUSAaJelQaqZL1EpoHNsajSEyPSoJ9IjhIxTdjHLmwZvhRDOiFTY/YeQnvrVZmiTQtGncECXtFTBZLOVwwMRgoXHAkXzMzPn1nAJJ8jYSbMDaqN2waGLzNhih/bZynUBMpIWSg7VYi7DRx2m8ALkIdRCJwI6ArJx2EI8kaDWeTQKeAFk9fjl/1AvwktjQ1P7NjyMGQyfd4vjipX6M/i52D7Cq80kqlcxEcGXRr/FEcgs0u5uGgB4VWuMFfpdn2Re6Hi3PqzmxWKsz6+ae2Pn9hXXw/fqM859UiGC0oKYYILJBqJrsn1Z1E5qOs9rQCiUQRREjm8yJcbHF5cUJufX1vAHlefw0XgUoboS3ETfQlTxBC4SOtuE8VPRJTBSCQSjZCpk7Gqzu+masaZ2y7Zjehho4F3g82BNDkAHpORG4+OCS+f6JTPmtRn/PH1kch6d04sp7AQb25aQ/pqUyXeQ8vrebG8OYQdXOQ+585u0sdW9rqalzRURiJ+9F4MweRFrKUjl1GUYhH1A27WOHw5cTFSFPMo9EeUIGnQTZHIaJ7AHLaOKsOODaNF9jkBjYG2QEsQ2xjMUAx2bBEbeTBWMHwskBjngq56S/yfgkBnWBa4K9sqKtq2t1UI8S9He5XuBRbawAdatrQEAi30Aks2+LM8WeCbalVZkWNylvJ+dqJnzVb+OHlSoKW8nPCP7Rd+CcZ2DdWAGqJ2CBFOphgywFFCFBNtfAbGtNPBCwxvygHeYMZMY9ZboBqwq/pVrsbgN5tkv152ODlbMfiqwGMBgxa4Exz3QhovRIUp6acqZmQzRq0ypDXS2TPLT02YIkQETnOE445oOGxOmXAqUJNNG7XgupMjPq2ua9asrj5yY/yuKteO1Kx0YNJTufrirLe1mZnat7OL6rnUdCWenpW6I8mAnbsY8KWs1PuSovCW9A/Z25PQ24a7cNOqgmTkLmBMgh4THgc4b9k2IVv1/g/F5nGljwPLfOgHAzJzh45V/4+WenTzmMtR5Z7us2Tys909UHqrPY7KbckoxRvRHhmVc3cJGE97uml0R1S0jdULVl7EvZtDFVBF35N9cEdjpgmAiOlFZ+Dtoh93+D3zzHr8RRNZQhnCNMNbcegOvpEwZoL+06cJQ07h+th3fZ/7PVbVC6ngTAV/KoLFuO6+2KFcU651gEb5ugPSIb1D+Xp8V4+k3sEIGnw5mYe4If4k1lFYr6SCzmM2EQ8iWtmwjnBI9kTwe1TlfAmXh7H02by9fW2gsjKwtv0aaURKil4OdV7rDL1MXIFNrhdxohcZXYTnq47WisrKitaObbf5+yvkLi5J6lCNZZ+B6GC38VNBZBDidSS/+mSvh6s+srgC8pyKMvDtt+de3c9fU76ZPfuM8ud4Kv0fyP/LqfepMT/3oZxSqpZaTa1DaQYLY8TFsHYbWYsPoRhRWfL5eSSQbhUGgGC3YLbVMk6PitTFNGpAsNrC6D1VNBKgBHMejaiuRWEWGgsSDBTJjqWIl8kJLlsaLJ2tXDr6xGfT85bM2Q06a46x2HTgvdnV8z5YDy/27J4zt6x2VtkzjoYpkq36kaBr4eQSg7tyiVweWubXZugtadl58ydapfbORfKsDTuZ0OBgx4cfdjCf5tbWNITnL120fdOi1RV1C3uKGzNdwYLcMvZ3BxoPyTOCD1XvXTp7U10gWCVmTV9b3r2z0SkGWovb2hp9I89O8a2smlyaO8muMU+dRmtzp60IzAoFpjLr1n388boLyf0dRvxhsHZ0qbWqDkwqvvpkj4l0fY6EIXRi5sQSrAvsVYwXRy4qJ2EVtD1AN7a0HWth9ymvL1xc3WTUKK/TAHA/bXDVtVWfOMfuGxGZv4Ln/jVr9jc3j1yMv0tndmyt9Vq88Y9gH1wtLX3KWjot5++jWHgAoZZkQ14wGQ20Fli71UmKJAy4xKMSTGbVdybW7FDDAut9XpD5AzWrYO7zQ8qffqF8+Ynd/clrHcdyxGy3a/3+mfNnzC/cBsveTjnTvXf1o6vzOlZw7WtqtdmPK/Errz/6NNtD72zmNOZfbmYdTGHfoofqI79Oc+R2n1lrnL6pOm0Up7kwxhTW12Amm7WYkXR2qYrF2AmgmbAsxZjwy1xpg/m1Je2vrp8v/nz2xpmlBg4E9hrMU341wVpTOh/OfmGvAnra8q6uctr60ZQHV3Q+WMQJykMj8ZsWn2QBOmmHMB+m5pDIpTFonYigiaKAhGEiAHF7EliVnQkjoLVIMPtJpBKHYd3A8GYH9jJzrWwmHx5Qjp7vDAX0suGRym1vtm/9W1/HyR8vczfMs6Sk8DSv855/5dlX9oQq52hT8syyp2rx5Id17IAyAM3wIjQPMOHzytEB64q6D5zT91yNbnx3V/nqnd017S9Y0605k3izoXLpsxde2n38yoOV9s1LcjwzNjbdX6asnBVaBj/6/DwKwPkpcqbDG7BnsXoSqWnUAmottYF6jMSdVyYZh3zVXCjwTiwwHH6sGuRiEHQGzuRX6whZkp123oy1BWE2mEfJ/tvIRtM4ZM5bDXiMsPMaAKOTyc5uL57rqyyc5y5JE5pm1i2S2iUX0CcaQ6lC6Zog7JqSqZmYlosl2K6pwNA84zRnQW6SaALYZQGW5lhCtU/W34N6o+bKfZ8cf3/Cl/+iTX3wBzpOY4mRkeNf3rptycGSshQWgGbYt5jFc2e0+DglIrwl6DVWQ7BuwaJ3Xk1J4VL5urnLl/Wf+gHU/hZoZdKNym6lG+I34FaNeZKcSpJIo2IeCVvpdsDGfKvzJnAwmeD37Ow65ZWwSowpgwX5T69s/rB55dP5BcpgDKFV8p7q2sn/1uc93bVzT/w6UrCqDTWvfCq/oCD/qZXNoUj8BL5Kp6GU017frfNXkAtiiyf/SOCEeLqnd8R/Ql9GlCRfctS6k5chvIBuQ1zCCjoCHL2DHNHIXxMJ3kQeO8lbsUXONeSfA5EjcG6/E+KdhN4bP04vBhdi883+BFBzQbxFbvZzQeY9LNBZc0FNfn5NwfDn6rCTnTw6R8o+gfpf5hCom33cRuiTlss3KHmZjD+BPN+5gXuA2ziS/Q73mLxUkpbKN/eqwz5uK0X9F3h2d1V4nGNgZGBgAOJd776+iue3+crAzc4AAje5Bfcg0xz9YHEOBiYQBQA8FQlFAHicY2BkYGBnAAGOPgaG//85+hkYGVCBMgBGGwNYAAAAeJxjYGBgYB8EmKOPgQEAQ04BfgAAAAAAAA4AaAB+AMwA4AECAUIBbAGYAcICGAJYArQC4AMwA7AD3gQwBJYE3AUkBWYFigYgBmYGtAbqB1gIEghYCG4IhAi2COh4nGNgZGBgUGYoZWBnAAEmIOYCQgaG/2A+AwAYCQG2AHicXZBNaoNAGIZfE5PQCKFQ2lUps2oXBfOzzAESyDKBQJdGR2NQR3QSSE/QE/QEPUUPUHqsvsrXjTMw83zPvPMNCuAWP3DQDAejdm1GjzwS7pMmwi75XngAD4/CQ/oX4TFe4Qt7uMMbOzjuDc0EmXCP/C7cJ38Iu+RP4QEe8CU8pP8WHmOPX2EPz87TPo202ey2OjlnQSXV/6arOjWFmvszMWtd6CqwOlKHq6ovycLaWMWVydXKFFZnmVFlZU46tP7R2nI5ncbi/dDkfDtFBA2DDXbYkhKc+V0Bqs5Zt9JM1HQGBRTm/EezTmZNKtpcAMs9Yu6AK9caF76zoLWIWcfMGOSkVduvSWechqZsz040Ib2PY3urxBJTzriT95lipz+TN1fmAAAAeJxtkMl2wjAMRfOAhABlKm2h80C3+ajgCKKDY6cegP59TYBzukAL+z1Zsq8ctaJTTKPrsUQLbXQQI0EXKXroY4AbDDHCGBNMcYsZ7nCPB8yxwCOe8IwXvOIN7/jAJ76wxHfUqWX+OzgumWAjJMV17i0Ndlr6irLKO+qftdT7i6y4uFSUvCknay+lFYZIZaQcmfH/xIFdYn98bqhra1aKTM/6lWMnyaYirx1rFUQZFBkb2zJUtoXeJCeg0WnLtHeSFc3OtrnozNwqi0TkSpBMDB1nSde5oJXW23hTS2/T0LilglXX7dmFVxLnq5U0vYATHFk3zX3BOisoQHNDFDeZnqKDy9hRNawN7Vh727hFzcJ5c8TILrKZfH7tIPxAFP0BpLeJPA==) format("woff");font-weight:normal;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder,.vjs-icon-play{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.vjs-icon-play:before{content:"\f101"}.vjs-icon-play-circle{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-play-circle:before{content:"\f102"}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder,.vjs-icon-pause{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before,.vjs-icon-pause:before{content:"\f103"}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder,.vjs-icon-volume-mute{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before,.vjs-icon-volume-mute:before{content:"\f104"}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder,.vjs-icon-volume-low{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before,.vjs-icon-volume-low:before{content:"\f105"}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder,.vjs-icon-volume-mid{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before,.vjs-icon-volume-mid:before{content:"\f106"}.video-js .vjs-mute-control .vjs-icon-placeholder,.vjs-icon-volume-high{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-mute-control .vjs-icon-placeholder:before,.vjs-icon-volume-high:before{content:"\f107"}.video-js .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-enter{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-enter:before{content:"\f108"}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-exit{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-exit:before{content:"\f109"}.vjs-icon-square{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-square:before{content:"\f10a"}.vjs-icon-spinner{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-spinner:before{content:"\f10b"}.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder,.vjs-icon-subtitles{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before,.vjs-icon-subtitles:before{content:"\f10c"}.video-js .vjs-captions-button .vjs-icon-placeholder,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.vjs-icon-captions{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-captions-button .vjs-icon-placeholder:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.vjs-icon-captions:before{content:"\f10d"}.video-js .vjs-chapters-button .vjs-icon-placeholder,.vjs-icon-chapters{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-chapters-button .vjs-icon-placeholder:before,.vjs-icon-chapters:before{content:"\f10e"}.vjs-icon-share{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-share:before{content:"\f10f"}.vjs-icon-cog{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-cog:before{content:"\f110"}.video-js .vjs-play-progress,.video-js .vjs-volume-level,.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before,.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before{content:"\f111"}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-circle-outline:before{content:"\f112"}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-circle-inner-circle:before{content:"\f113"}.vjs-icon-hd{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-hd:before{content:"\f114"}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder,.vjs-icon-cancel{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before,.vjs-icon-cancel:before{content:"\f115"}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder,.vjs-icon-replay{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before,.vjs-icon-replay:before{content:"\f116"}.vjs-icon-facebook{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-facebook:before{content:"\f117"}.vjs-icon-gplus{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-gplus:before{content:"\f118"}.vjs-icon-linkedin{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-linkedin:before{content:"\f119"}.vjs-icon-twitter{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-twitter:before{content:"\f11a"}.vjs-icon-tumblr{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-tumblr:before{content:"\f11b"}.vjs-icon-pinterest{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-pinterest:before{content:"\f11c"}.video-js .vjs-descriptions-button .vjs-icon-placeholder,.vjs-icon-audio-description{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-descriptions-button .vjs-icon-placeholder:before,.vjs-icon-audio-description:before{content:"\f11d"}.video-js .vjs-audio-button .vjs-icon-placeholder,.vjs-icon-audio{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-audio-button .vjs-icon-placeholder:before,.vjs-icon-audio:before{content:"\f11e"}.vjs-icon-next-item{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-next-item:before{content:"\f11f"}.vjs-icon-previous-item{font-family:VideoJS;font-weight:normal;font-style:normal}.vjs-icon-previous-item:before{content:"\f120"}.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder,.vjs-icon-picture-in-picture-enter{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before,.vjs-icon-picture-in-picture-enter:before{content:"\f121"}.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder,.vjs-icon-picture-in-picture-exit{font-family:VideoJS;font-weight:normal;font-style:normal}.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before,.vjs-icon-picture-in-picture-exit:before{content:"\f122"}.video-js{display:block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:normal;font-style:normal;font-family:Arial, Helvetica, sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100% !important;height:100% !important}.video-js[tabindex="-1"]{outline:none}.video-js *,.video-js :after,.video-js :before{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.video-js.vjs-4-3,.video-js.vjs-16-9,.video-js.vjs-fluid{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js.vjs-fill,.video-js .vjs-tech{width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0}body.vjs-full-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen{width:100% !important;height:100% !important;padding-top:0 !important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none !important}.vjs-disabled{opacity:0.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block !important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial, Helvetica, sans-serif;text-align:center;width:300px;height:150px;margin:0px auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66A8CC}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:0.06666em solid #fff;background-color:#2B333F;background-color:rgba(43,51,63,0.7);border-radius:0.3em;-webkit-transition:all 0.4s;transition:all 0.4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-0.81666em;margin-left:-1.5em}.video-js .vjs-big-play-button:focus,.video-js:hover .vjs-big-play-button{border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,0.5);-webkit-transition:all 0s;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-error .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button{display:block}.video-js button{background:none;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;-webkit-transition:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:0.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,0.8);background:-webkit-linear-gradient(top, rgba(0,0,0,0.8), rgba(255,255,255,0));background:linear-gradient(180deg, rgba(0,0,0,0.8), rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial, Helvetica, sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:0.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.js-focus-visible .vjs-menu li.vjs-menu-item:hover,.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:rgba(115,133,159,0.5)}.js-focus-visible .vjs-menu li.vjs-selected:hover,.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2B333F}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 0.3em 0;font-weight:bold;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0em;margin-bottom:1.5em;border-top-color:rgba(43,51,63,0.7)}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2B333F;background-color:rgba(43,51,63,0.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-menu-button-popup .vjs-menu.vjs-lock-showing,.vjs-workinghover .vjs-menu-button-popup:hover .vjs-menu{display:block}.video-js .vjs-menu-button-inline{-webkit-transition:all 0.4s;transition:all 0.4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;-webkit-transition:all 0.4s;transition:all 0.4s}.vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline:hover .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2B333F;background-color:rgba(43,51,63,0.7)}.vjs-has-started .vjs-control-bar{display:flex;visibility:visible;opacity:1;-webkit-transition:visibility 0.1s, opacity 0.1s;transition:visibility 0.1s, opacity 0.1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;-webkit-transition:visibility 1s, opacity 1s;transition:visibility 1s, opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-error .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar{display:none !important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.video-js .vjs-control:focus,.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before{text-shadow:0em 0em 1em white}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-progress-holder{flex:auto;-webkit-transition:all 0.2s;transition:all 0.2s;height:0.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:0.9em;position:absolute;right:-0.5em;top:-0.3333333333em;z-index:1}.video-js .vjs-load-progress{background:rgba(115,133,159,0.5)}.video-js .vjs-load-progress div{background:rgba(115,133,159,0.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:rgba(255,255,255,0.8);border-radius:0.3em;color:#000;float:right;font-family:Arial, Helvetica, sans-serif;font-size:1em;padding:6px 8px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-time-tooltip{display:block;font-size:0.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;-webkit-transition:visibility 1s, opacity 1s;transition:visibility 1s, opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display{display:none}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:rgba(0,0,0,0.8)}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 0.45em 0 0.45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#73859f;background-color:rgba(115,133,159,0.5)}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0em 0em 1em white;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{-webkit-transition:width 1s;transition:width 1s}.video-js .vjs-volume-panel .vjs-mute-control:hover~.vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel .vjs-volume-control:hover,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control,.video-js .vjs-volume-panel:hover .vjs-volume-control{visibility:visible;opacity:1;position:relative;-webkit-transition:visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;transition:visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s}.video-js .vjs-volume-panel .vjs-mute-control:hover~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em}.video-js .vjs-volume-panel .vjs-mute-control:hover~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-vertical{left:-3.5em}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:hover{width:9em;-webkit-transition:width 0.1s;transition:width 0.1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;-webkit-transition:visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;transition:visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{-webkit-transition:visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;transition:visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s}.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em;visibility:visible;opacity:1;position:relative;-webkit-transition:none;transition:none}.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{position:absolute;bottom:3em;left:0.5em}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em 0.45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:0.3em}.vjs-volume-bar.vjs-slider-vertical{width:0.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:0.9em}.vjs-slider-vertical .vjs-volume-level{width:0.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-0.5em;left:-0.3em}.vjs-slider-horizontal .vjs-volume-level{height:0.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-0.3em;right:-0.5em}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2B333F;background-color:rgba(43,51,63,0.7)}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.vjs-poster{display:inline-block;vertical-align:middle;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;background-color:#000000;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js.vjs-liveui .vjs-live-control,.video-js:not(.vjs-live) .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:0.5em;padding-right:0.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.vjs-no-flex .vjs-seek-to-live-control{display:table-cell;width:auto;text-align:left}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:0.5em;color:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control,.video-js .vjs-current-time,.vjs-no-flex .vjs-current-time,.video-js .vjs-duration,.vjs-no-flex .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-live .vjs-time-divider{display:none}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:0.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{-webkit-transform:translateY(-3em);transform:translateY(-3em)}.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{-webkit-transform:translateY(-1.5em);transform:translateY(-1.5em)}.video-js .vjs-picture-in-picture-control,.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.vjs-playback-rate .vjs-playback-rate-value,.vjs-playback-rate>.vjs-menu-button{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0em}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-error .vjs-error-display:before{color:#fff;content:"X";font-family:Arial, Helvetica, sans-serif;font-size:4em;left:0;line-height:1;margin-top:-0.5em;position:absolute;text-shadow:0.05em 0.05em 0.1em #000;text-align:center;top:50%;vertical-align:middle;width:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:0.85;text-align:left;border:6px solid rgba(43,51,63,0.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block;-webkit-animation:vjs-spinner-show 0s linear 0.3s forwards;animation:vjs-spinner-show 0s linear 0.3s forwards}.vjs-loading-spinner:after,.vjs-loading-spinner:before{content:"";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:white}.vjs-seeking .vjs-loading-spinner:after,.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:white}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:white;-webkit-animation-delay:0.44s;animation-delay:0.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@-webkit-keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes vjs-spinner-spin{to{-webkit-transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:white}60%{border-top-color:#73859f}to{border-top-color:#73859f}}@-webkit-keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:white}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-0.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-0.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-audio-button,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-captions-button,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-chapters-button,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-current-time,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-descriptions-button,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-duration,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-playback-rate,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-remaining-time,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-subtitles-button,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-time-divider,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-control,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-audio-button,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-captions-button,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-chapters-button,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-current-time,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-descriptions-button,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-duration,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-playback-rate,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-remaining-time,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subtitles-button,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-time-divider,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-control,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-audio-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-captions-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-chapters-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-current-time,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-descriptions-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-duration,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-playback-rate,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-remaining-time,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-subtitles-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-time-divider,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-control{display:none}.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js:not(.vjs-fullscreen).vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js:not(.vjs-fullscreen).vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover{width:auto;width:initial}.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-subs-caps-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-live) .vjs-subs-caps-button,.video-js:not(.vjs-fullscreen).vjs-layout-x-small:not(.vjs-liveui) .vjs-subs-caps-button{display:none}.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-custom-control-spacer,.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-custom-control-spacer{flex:auto;display:block}.video-js:not(.vjs-fullscreen).vjs-layout-tiny.vjs-no-flex .vjs-custom-control-spacer,.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui.vjs-no-flex .vjs-custom-control-spacer{width:auto}.video-js:not(.vjs-fullscreen).vjs-layout-tiny .vjs-progress-control,.video-js:not(.vjs-fullscreen).vjs-layout-x-small.vjs-liveui .vjs-progress-control{display:none}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2B333F;background-color:rgba(43,51,63,0.75);color:#fff;height:70%}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-controls,.vjs-text-track-settings .vjs-track-settings-font{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display: grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0px 24px}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-track-setting>select{margin-right:1em;margin-bottom:0.5em}.vjs-text-track-settings fieldset{margin:5px;padding:3px;border:none}.vjs-text-track-settings fieldset span{display:inline-block}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;margin:0 0 5px 0}.vjs-text-track-settings .vjs-label{position:absolute;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px);display:block;margin:0 0 5px 0;padding:0;border:0;height:1px;width:1px;overflow:hidden}.vjs-track-settings-controls button:active,.vjs-track-settings-controls button:focus{outline-style:solid;outline-width:medium;background-image:-webkit-linear-gradient(bottom, #fff 88%, #73859f 100%);background-image:linear-gradient(0deg, #fff 88%, #73859f 100%)}.vjs-track-settings-controls button:hover{color:rgba(43,51,63,0.75)}.vjs-track-settings-controls button{background-color:#fff;background-image:-webkit-linear-gradient(top, #fff 88%, #73859f 100%);background-image:linear-gradient(-180deg, #fff 88%, #73859f 100%);color:#2B333F;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}@media print{.video-js>:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js :focus:not(.focus-visible),.video-js .vjs-menu :focus:not(:focus-visible),.video-js :focus:not(:focus-visible){outline:none;background:none}.ima-ad-container{top:0em;position:absolute;display:none;width:100%;height:100%}.video-js.vjs-playing .bumpable-ima-ad-container{margin-top:-4em}.video-js.vjs-user-inactive.vjs-playing .bumpable-ima-ad-container{margin-top:0em}.video-js.vjs-paused .bumpable-ima-ad-container,.video-js.vjs-playing:hover .bumpable-ima-ad-container,.video-js.vjs-user-active.vjs-playing .bumpable-ima-ad-container{margin-top:-4em}.ima-controls-div{bottom:0em;height:1.4em;position:absolute;overflow:hidden;display:none;opacity:1;background-color:rgba(7,20,30,0.7);background:-webkit-gradient(linear, left bottom, left top, color-stop(0%, rgba(7,20,30,0.7)), color-stop(100%, rgba(7,20,30,0)));background:-webkit-linear-gradient(bottom, rgba(7,20,30,0.7) 0%, rgba(7,20,30,0) 100%);background:linear-gradient(to top, rgba(7,20,30,0.7) 0%, rgba(7,20,30,0) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#0007141E', endColorstr='#07141E',GradientType=0 )}.ima-controls-div.ima-controls-div-showing{height:3.7em}.ima-countdown-div{height:1em;color:#FFFFFF;text-shadow:0 0 0.2em #000;cursor:default}.ima-seek-bar-div{top:1.2em;height:0.3em;position:absolute;background:rgba(255,255,255,0.4)}.ima-progress-div{width:0em;height:0.3em;background-color:#ECC546}.ima-fullscreen-div,.ima-mute-div,.ima-play-pause-div,.ima-slider-div{width:2.33em;height:1.33em;top:0.733em;left:0em;position:absolute;color:#CCCCCC;font-size:1.5em;line-height:2;text-align:center;font-family:VideoJS;cursor:pointer}.ima-mute-div{left:auto;right:5.667em}.ima-slider-div{left:auto;right:2.33em;width:3.33em;height:0.667em;top:1.33em;background-color:#555555}.ima-slider-level-div{width:100%;height:0.667em;background-color:#ECC546}.ima-fullscreen-div{left:auto;right:0em}.ima-playing:before{content:"\00f103"}.ima-paused:before{content:"\00f101"}.ima-paused:hover:before,.ima-playing:hover:before{text-shadow:0 0 1em #fff}.ima-non-muted:before{content:"\00f107"}.ima-muted:before{content:"\00f104"}.ima-muted:hover:before,.ima-non-muted:hover:before{text-shadow:0 0 1em #fff}.ima-non-fullscreen:before{content:"\00f108"}.ima-fullscreen:before{content:"\00f109"}.ima-fullscreen:hover:before,.ima-non-fullscreen:hover:before{text-shadow:0 0 1em #fff}em,h1,h2,h3,h4,h5,p,span{text-rendering:optimizeLegibility}@media only screen and (min-width: 37.5em){h1{font-size:2.38rem}h2{font-size:1.75rem}h3{font-size:1.56rem}h4{font-size:1.31rem}h5{font-size:1.19rem}h6{font-size:1rem}}.global-nav__left .f-dropdown-ct{min-width:300px}#launcher{display:none}@media only screen and (max-width: 37.31em){.cnx-main-container.cnx-main-container{display:none}}meta.foundation-version{font-family:"/5.5.2/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 37.31em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:37.37em)/";width:37.37em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:37.37em) and (max-width:49.94em)/";width:37.37em}meta.foundation-mq-large{font-family:"/only screen and (min-width:50em)/";width:50em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:50em) and (max-width:63.69em)/";width:50em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:63.75em)/";width:63.75em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:63.75em) and (max-width:85.19em)/";width:63.75em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:85.25em)/";width:85.25em}meta.foundation-data-attribute-namespace{font-family:false}body,html{height:100%}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body,html{font-size:16px}body{background:#fff;color:#222;cursor:auto;font-family:"ProximaNovaCond",sans-serif;font-style:normal;font-weight:normal;line-height:24px;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto;-ms-interpolation-mode:bicubic}#map_canvas embed,#map_canvas img,#map_canvas object,.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.flex-video{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:67.5%;padding-top:1.562rem;position:relative}.flex-video.widescreen{padding-bottom:56.34%}.flex-video.vimeo{padding-top:0}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video{height:100%;position:absolute;top:0;width:100%;left:0}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 37.31em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 37.37em) and (max-width: 49.94em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 37.37em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 50em) and (max-width: 63.69em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 50em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 63.75em) and (max-width: 85.19em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 63.75em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 85.25em) and (max-width: 999999999999){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 85.25em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}a{color:#008CBA;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#0078a0}a img{border:none}p{font-family:inherit;font-size:.938rem;font-weight:normal;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p,p.lead{line-height:1.6}p.lead{font-size:1.156rem}p aside{font-size:.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#000;font-family:"ProximaNovaCond",sans-serif;font-style:normal;font-weight:bold;line-height:1.3;margin-bottom:1rem;margin-top:0;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#7D7D7D;font-size:.875rem;line-height:0}h1{font-size:1.75rem}h2{font-size:1.125rem}h3{font-size:1.25rem}h4{font-size:1rem}h5{font-size:1.188rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#595959;font-weight:normal;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.188rem}em,i{font-style:italic}em,i,b,strong{line-height:inherit}b,strong{font-weight:bold}small{font-size:.875rem;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Courier,monospace;font-weight:normal;padding:.125rem .312rem .062rem}dl,ol,ul{font-family:inherit;font-size:.938rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ol,ul.no-bullet li ul{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ol,ul li ul{margin-left:1.25rem;margin-bottom:0}ul.circle li ul,ul.disc li ul,ul.square li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle}ul.circle,ul.disc{margin-left:1.1rem}ul.disc{list-style-type:disc}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ol,ol li ul{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:.3rem;font-weight:bold}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.562rem 1.25rem 0 1.188rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.812rem;color:#3b3b3b}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#3b3b3b}blockquote,blockquote p{line-height:1.6;color:#595959}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-size:.938rem}.vcard .fn,.vevent .summary,.vevent abbr{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;border:none;padding:0 .062rem}@media only screen and (min-width: 37.37em){h1,h2,h3,h4,h5,h6{line-height:1.3}h1{font-size:2.375rem}h2{font-size:1.75rem}h3{font-size:1.562rem}h4{font-size:1.312rem}h5{font-size:1.188rem}h6{font-size:1rem}}.midbanner{padding:0;margin:0 -18px 20px;background:transparent;text-align:center;border-bottom:#e5e5e5 1px solid;border-top:#e5e5e5 1px solid;box-sizing:content-box;padding:1rem 0}.midbanner iframe{margin:auto}.midbanner .ad-label .mid-banner{display:block;font-family:"ProximaNovaCond",sans-serif;color:#ccc;letter-spacing:0.1rem;border-top:#e5e5e5 1px solid;text-align:center;text-transform:uppercase;margin-bottom:10px}.midbanner .ad-label-bottom{border-bottom:1px solid #e5e5e5}.bottom-billboard .bottom-billboard-container,.bottom-billboard .mobile-footer-container{margin:0 0 20px;background:transparent;text-align:center;border-bottom:#e5e5e5 1px solid;border-top:#e5e5e5 1px solid;box-sizing:content-box;padding:1rem 0}.bottom-billboard iframe{margin:auto}@media only screen and (max-width: 63.69em){.bottom-billboard .bottom-billboard-container{display:none}}@media only screen and (min-width: 63.69em){.bottom-billboard .mobile-footer-container{display:none}}.dfp[data-ad-load-state~=empty]{display:none}.ad-promotion-native>*{display:block !important}@media screen and (min-width: 1020px){.ad-mobile,.ad-mobile-dynamic{display:none}}.swappable-mobile-ad-container{display:none}.ad-mobile .ad-container{display:inline-block}.ad-mobile .ad-mobile-inner .ad-container{min-width:300px}.ad-billboard,.ad-top-banner{text-align:center}.ad-billboard .ad-container,.ad-top-banner .ad-container{height:250px;max-width:970px;margin-left:auto;margin-right:auto;display:block}.ad-top-banner .ad-container{margin-bottom:20px}.ad-splashy-top.ad-container.ad-small{margin:20px 0}.ad-splashy-top.ad-container.ad-small.with-impact-nav{margin:62px 0 -25px}.ad-splashy-top.ad-container.ad-small iframe,.ad-splashy-top.ad-container.ad-large iframe{margin:0 auto}.ad-splashy-top.ad-container.ad-splashy-970{height:0}.ad-splashy-top.ad-container.ad-splashy-1280{height:0;max-height:100vh}.ad-info__content{margin-bottom:0;padding:10px}.ad-info-item-title{font-weight:bold}.ad-desktop .ad-inner .ad-label,.ad-desktop .ad-mobile-inner .ad-label,.ad-mobile-bottom .ad-label,.ad-mobile .ad-inner .ad-label,.ad-mobile .ad-mobile-inner .ad-label,.ad-permalink-comment .ad-inner .ad-label,.ad-permalink-comment .ad-mobile-inner .ad-label,.ad-unit--featured-recirculation .ad-label,.ad-unit--fixed-bottom .ad-label,.ad-unit--in-post .ad-inner .ad-label,.ad-unit--in-post .ad-mobile-inner .ad-label,.bottom-billboard .ad-label,.permalink.featured-post .post-content .ad-middleboard--displayed .ad-label{font-family:"ProximaNovaCond",sans-serif;color:#ccc;letter-spacing:0.1rem;border-top:0;text-align:center;text-transform:uppercase;margin-bottom:10px}.ad-desktop .ad-inner .ad-label-bottom,.ad-desktop .ad-mobile-inner .ad-label-bottom,.ad-mobile-bottom .ad-label-bottom,.ad-mobile .ad-inner .ad-label-bottom,.ad-mobile .ad-mobile-inner .ad-label-bottom,.ad-permalink-comment .ad-inner .ad-label-bottom,.ad-permalink-comment .ad-mobile-inner .ad-label-bottom,.ad-unit--featured-recirculation .ad-label-bottom,.ad-unit--fixed-bottom .ad-label-bottom,.ad-unit--in-post .ad-inner .ad-label-bottom,.ad-unit--in-post .ad-mobile-inner .ad-label-bottom,.bottom-billboard .ad-label-bottom,.permalink.featured-post .post-content .ad-middleboard--displayed .ad-label-bottom{border-bottom:1px solid #e5e5e5}.ad-unit--featured-recirculation .ad-container{height:250px}nav.inactive{pointer-events:none;opacity:0.5}.ad-desktop,.ad-mobile,.ad-permalink-comment,.ad-unit--in-post{padding:0;margin:0 auto 20px;background:transparent;text-align:center}.ad-desktop .ad-desktop-inner,.ad-mobile .ad-desktop-inner,.ad-permalink-comment .ad-desktop-inner,.ad-unit--in-post .ad-desktop-inner{margin-bottom:30px}.ad-desktop iframe,.ad-mobile iframe,.ad-permalink-comment iframe,.ad-unit--in-post iframe{margin:auto}.ad-desktop .ad-inner,.ad-desktop .ad-mobile-inner,.ad-mobile .ad-inner,.ad-mobile .ad-mobile-inner,.ad-permalink-comment .ad-inner,.ad-permalink-comment .ad-mobile-inner,.ad-unit--in-post .ad-inner,.ad-unit--in-post .ad-mobile-inner{padding:0;margin-bottom:1.875rem}.ad-desktop .ad-inner .ad-container,.ad-desktop .ad-mobile-inner .ad-container,.ad-mobile .ad-inner .ad-container,.ad-mobile .ad-mobile-inner .ad-container,.ad-permalink-comment .ad-inner .ad-container,.ad-permalink-comment .ad-mobile-inner .ad-container,.ad-unit--in-post .ad-inner .ad-container,.ad-unit--in-post .ad-mobile-inner .ad-container{display:inline-block;max-width:320px;margin:10px 0 20px;background-color:transparent}.ad-desktop .ad-inner .ad-label,.ad-desktop .ad-inner .ad-label-bottom,.ad-desktop .ad-mobile-inner .ad-label,.ad-desktop .ad-mobile-inner .ad-label-bottom,.ad-mobile .ad-inner .ad-label,.ad-mobile .ad-inner .ad-label-bottom,.ad-mobile .ad-mobile-inner .ad-label,.ad-mobile .ad-mobile-inner .ad-label-bottom,.ad-permalink-comment .ad-inner .ad-label,.ad-permalink-comment .ad-inner .ad-label-bottom,.ad-permalink-comment .ad-mobile-inner .ad-label,.ad-permalink-comment .ad-mobile-inner .ad-label-bottom,.ad-unit--in-post .ad-inner .ad-label,.ad-unit--in-post .ad-inner .ad-label-bottom,.ad-unit--in-post .ad-mobile-inner .ad-label,.ad-unit--in-post .ad-mobile-inner .ad-label-bottom{margin-bottom:0}@media only screen and (max-width: 37.31em){.ad-desktop .ad-inner .ad-label,.ad-desktop .ad-inner .ad-label-bottom,.ad-desktop .ad-mobile-inner .ad-label,.ad-desktop .ad-mobile-inner .ad-label-bottom,.ad-mobile .ad-inner .ad-label,.ad-mobile .ad-inner .ad-label-bottom,.ad-mobile .ad-mobile-inner .ad-label,.ad-mobile .ad-mobile-inner .ad-label-bottom,.ad-permalink-comment .ad-inner .ad-label,.ad-permalink-comment .ad-inner .ad-label-bottom,.ad-permalink-comment .ad-mobile-inner .ad-label,.ad-permalink-comment .ad-mobile-inner .ad-label-bottom,.ad-unit--in-post .ad-inner .ad-label,.ad-unit--in-post .ad-inner .ad-label-bottom,.ad-unit--in-post .ad-mobile-inner .ad-label,.ad-unit--in-post .ad-mobile-inner .ad-label-bottom{margin-left:1.125rem;margin-right:1.125rem}}.ad-desktop.hide-contents,.ad-mobile.hide-contents,.ad-permalink-comment.hide-contents,.ad-unit--in-post.hide-contents{display:none}#taboola-below-article-thumbnails,#taboola-below-article-thumbnails---3x2-video,#taboola-below-article-thumbnails---4x2{max-width:636px;margin-top:40px;margin-right:auto;margin-left:auto}.permalink .ad-mobile .ad-label,.permalink .ad-unit--in-post .ad-label{border-top:1px solid #e5e5e5;padding-top:10px}@-webkit-keyframes slideUp{0%{height:0;padding:0;margin:0}}@keyframes slideUp{0%{height:0;padding:0;margin:0}}.animate-slidedown{-webkit-transition:all .75s ease-out;-webkit-transition-delay:.75s;-webkit-transition:all .75s ease-out .75s;transition:all .75s ease-out .75s;max-height:400px;opacity:1}.animate-slidedown.animate-closed{max-height:0;opacity:0}.commentlist__item .ad-permalink-comment{padding-top:14px}.commentlist__item .ad-permalink-comment .ad-mobile-inner .ad-label{margin-bottom:-2px}.commentlist__item:not(.commentlist__item--expandable) .ad-permalink-comment{padding:0;border-top:1px solid #e5e5e5}.commentlist__item:not(.commentlist__item--expandable) .ad-permalink-comment .ad-mobile-inner{margin:16px}.commentlist__item:not(.commentlist__item--expandable) .ad-permalink-comment .ad-mobile-inner .ad-container{margin:10px 0}.commentlist__item:not(.commentlist__item--expandable) .ad-permalink-comment .ad-mobile-inner .ad-label-bottom{border:none}.blog-group-gawker .ad-unit,.permalink.featured-post .post-content .ad-middleboard .ad-label{display:none}.permalink.featured-post .post-content .ad-middleboard--displayed{margin:1.5rem 0;padding:1.5rem 0;clear:both}.permalink.featured-post .post-content .ad-middleboard--displayed .ad-label{display:block}.permalink.featured-post .post-content .ad-middleboard .ad-label{margin-bottom:0px}.permalink.featured-post .post-content .ad-middleboard .ad-container{margin:0 auto}@media only screen and (min-width: 37.37em){.post-content .ad-promotions-container[data-mobile=true]{display:none}}.permalink.featured-post .ad-middleboard .slot-displayed{border-bottom:#e5e5e5 1px solid;border-top:#e5e5e5 1px solid;box-sizing:content-box;padding:1rem 0}@media only screen and (max-width: 37.31em){.trc_related_container{padding:0 1.125rem}}@media only screen and (max-width: 49.94em){.ad-promotions-container.postlist__item .meta--pe{width:auto;right:10px}.ad-promotions-container.postlist__item .meta--pe .meta__right{align-items:normal}}.ad-mobile-bottom{margin-bottom:0}.ad-mobile-bottom .ad-container{display:block}.teads-wrapper{display:flex;align-items:center;justify-content:center;width:100%;padding:15px 0}.bt-wrapper,.bt-wrapper>div{align-content:center;display:flex;justify-content:center}.bt-wrapper>div{border-bottom:1px solid #e5e5e5;padding:20px 0;width:100%}.navwrap--outer:not(.navwrap--frontpage)+.curation-main-container .curation-mountain .curation-mountain__toolbar{top:-100px}.navwrap--outer:not(.navwrap--frontpage)+.curation-main-container .curation-mountain .layout__toolbar{top:-56px}@media only screen and (min-width: 50em){.curation-mountain:not(.Headline):not(.Editor){border-bottom:1px solid #e5e5e5}}.curation-mountain:not(.Headline):not(.Editor) .layout:not(.layout--Headline1){padding:18px 18px 20px}@media only screen and (max-width: 49.94em){.curation-mountain:not(.Headline):not(.Editor) .layout:not(.layout--Headline1){padding:0}}.curation-mountain.Editor.edit-mode{border-bottom:1px solid #e5e5e5}.curation-mountain.Editor.edit-mode .layout:not(.layout--Headline1){padding:18px 18px 20px}@media only screen and (max-width: 49.94em){.curation-mountain.Editor.edit-mode .layout:not(.layout--Headline1){padding:0}}.curation-mountain .layout{max-width:1318px}.curation-mountain .layout.layout:not(.layout--Headline1){margin-left:auto;margin-right:auto}@media only screen and (max-width: 49.94em){.curation-mountain .layout.layout:not(.layout--Headline1){padding:0}}.curation-mountain .layout--Headline1{max-width:100%}.curation-mountain .layout.layout--Modular3,.curation-mountain .layout.layout--Modular3 .grid.grid--modular{max-width:1024px;min-height:500px}.curation-mountain .layout.layout--Modular4,.curation-mountain .layout.layout--Modular4 .grid.grid--modular{max-width:1336px;min-height:500px}.curation-mountain .layout.layout--Equal3{max-width:1336px;min-height:230px;align-content:center}.curation-mountain .layout.layout--Equal3 .grid.grid--equal{max-width:1336px;min-height:230px;box-shadow:none;align-content:center}.curation-mountain .layout.layout--Equal4,.curation-mountain .layout.layout--Equal4 .grid.grid--equal{min-height:170px;align-content:center}.curation-mountain .layout.layout--Equal4{max-width:1336px}.curation-mountain .layout.layout--Equal4 .grid.grid--equal{max-width:1336px;box-shadow:none}.curation-mountain .layout.layout--Equal6,.curation-mountain .layout.layout--Equal6 .grid.grid--equal{min-height:474px}@media only screen and (max-width: 49.94em){.curation-mountain .curation-module{display:flex}}.curation-mountain .layout.layout--Headline1 .grid.grid--headline{position:relative;height:600px;max-width:100%}@media only screen and (max-width: 49.94em){.curation-mountain .layout.layout--Headline1 .grid.grid--headline{height:inherit}}.curation-mountain .layout.layout--Equal3,.curation-mountain .layout.layout--Equal4,.curation-mountain .layout.layout--Equal6,.curation-mountain .layout.layout--Modular3,.curation-mountain .layout.layout--Modular4{margin:0 auto}.curation-mountain .layout__toolbar p{color:#222}@supports not (display: grid){.curation-module{display:flex}.grid--equal .curation-module__zone.box .curation-module__item{margin-bottom:10px}@media only screen and (max-width: 49.94em){.grid--equal .curation-module__zone.box .curation-module__item{margin-bottom:0}}.curation-module__zone{display:flex}.curation-module__zone.hero,.curation-module__zone.hero .curation-module__item{width:100%}.curation-module__zone.box{width:25%;flex-direction:column;justify-content:space-between;margin:0 10px}@media only screen and (max-width: 49.94em){.curation-module__zone.box{width:100%}}.curation-module__zone.tall{width:25%;margin:0 10px}@media only screen and (max-width: 49.94em){.curation-module__zone.tall,.curation-module__zone.tall .curation-module__item{width:100%}}.curation-module__zone.big{width:50%;margin:0 10px}@media only screen and (max-width: 49.94em){.curation-module__zone.big{width:100%}}}.curation-module__zone{position:relative;display:grid;grid-auto-flow:row;grid-auto-rows:1fr;grid-gap:15px;max-height:inherit}@media only screen and (max-width: 49.94em){.curation-module__zone{order:1;grid-gap:0;grid-auto-rows:auto}.curation-module__zone.big{order:0;overflow:hidden;display:block}}.content-meta__byline span{font-size:14px;color:#7D7D7D}.curation-module__item:hover .image-container:after{opacity:0.9;position:absolute;left:0;right:0;top:0;bottom:0;background-color:#000;pointer-events:none}.curation-module__item .content-wrapper{padding:15px 0 10px}@media only screen and (max-width: 37.31em){.curation-module__item .storytype-label-wrapper{display:block}}.curation-module__item .content-meta__byline,.curation-module__item .content-meta__headline+h3,.curation-module__item .content-meta__storyType{display:flex;align-items:center;width:100%}.curation-module__item .content-meta__storyType{font-size:12px;margin-bottom:20px}.curation-module__item .content-meta__headline h3{color:#000;font-size:32px}.curation-module__item .content-meta__headline h3 a{color:inherit}.curation-module__item .content-meta__headline h6{color:#000;font-size:18px;margin-bottom:0.5rem}.curation-module__item .content-meta__headline h6 a{color:inherit}.curation-module__item .content-meta__excerpt p{font-family:"ElizabethSerif", Georgia, serif;font-size:14px;line-height:1.3;color:#222;margin-bottom:0.5rem}.curation-module__item .content-meta__byline .item-authors{display:flex}.curation-module__item .content-meta__byline .item-author a:hover{-webkit-text-decoration-color:#7D7D7D;text-decoration-color:#7D7D7D}.curation-module__item--tertiary-child{display:flex;flex-direction:row;border-top:none !important;height:auto}.curation-module__item--tertiary-child:not(:last-child){border-bottom:1px dotted #e5e5e5 !important}.curation-module__item--tertiary-child .image-container-wrapper{width:30%;margin-right:10px}.curation-module__item--tertiary-child .content-wrapper{width:70%;padding:0}.curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper{margin-bottom:5px}.curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper a{color:#000;font-weight:normal}@media only screen and (max-width: 49.94em){.curation-module__item--tertiary-child:not(:last-child){padding-bottom:10px;margin-bottom:15px}}@media only screen and (min-width: 37.37em){.curation-module__item--tertiary-child:not(:last-child){margin-bottom:20px}}@media only screen and (min-width: 851px) and (max-width: 982px){.curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper a{font-size:14px}}@media only screen and (min-width: 982px) and (max-width: 1023px){.curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper a{font-size:calc(14px + (16 - 14) * (100vw - 851px) / (1023 - 851))}}@media only screen and (min-width: 1024px) and (max-width: 1074px){.curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper a{font-size:calc( 16px + (18 - 16) * (100vw - 1023px) / (1074 - 1023))}}.grid [contenteditable]:focus{outline-color:#0A7BC2;outline-width:1px;outline-offset:-1px}.grid [contenteditable]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.grid .curation-module__item.hero{position:relative;height:100%}@media only screen and (max-width: 49.94em){.grid .curation-module__item.hero .content-wrapper{padding:20px 55px 10px 10px}}@media only screen and (max-width: 37.31em){.grid .curation-module__item.hero .content-wrapper{padding:20px 10px}}.grid.grid--headline .image-container{position:absolute;left:0;top:0;width:100%}@media only screen and (max-width: 49.94em){.grid.grid--headline .image-container{position:relative;padding-bottom:0;height:inherit}}.grid.grid--headline .image-container:before{display:none;z-index:-1}.grid.grid--headline .image-container img{position:relative}@media only screen and (max-width: 49.94em){.grid.grid--headline{height:inherit}}.grid.grid--headline .content-wrapper{position:absolute;left:0;bottom:0}@media only screen and (max-width: 49.94em){.grid.grid--headline .content-wrapper{position:static;left:initial;bottom:initial}}.grid.grid--headline .storytype-label.storytype-label{font-weight:initial;font-size:14px;color:#fff;border:0}.grid.grid--headline .storytype-label.storytype-label:hover{color:#fff}.grid.grid--headline .storytype-label.storytype-label a{font-weight:initial;color:#fff;padding:0}.grid.grid--headline .content-meta__storyType{margin:0}.grid.grid--headline .content-meta__storyType .storytype-label-wrapper{padding:0 5px;background-color:rgba(0,0,0,0.7)}@media only screen and (max-width: 49.94em){.grid.grid--headline .content-meta__storyType{font-size:14px;text-transform:uppercase}.grid.grid--headline .content-meta__storyType .storytype-label-wrapper{margin:auto;background:none;padding:0 10px}.grid.grid--headline .content-meta__storyType .storytype-label-wrapper .storytype-label{border:1px solid #0A7BC2;color:#0A7BC2}}.grid.grid--headline .content-meta__headline{max-width:50vw}.grid.grid--headline .content-meta__headline a:hover{color:#fff}.grid.grid--headline .content-meta__headline h3{color:#fff;background-color:rgba(0,0,0,0.7);padding:0 6px;display:inline;box-decoration-break:clone;-webkit-box-decoration-break:clone}@media only screen and (max-width: 49.94em){.grid.grid--headline .content-meta__headline{max-width:100vw;text-align:center;padding:20px 0 10px 0}.grid.grid--headline .content-meta__headline a:hover{color:#000}.grid.grid--headline .content-meta__headline h3{color:#000;background:none;font-size:calc(28px + (24 - 16) * (100vw - 400px) / (800 - 400))}}.grid.grid--headline .content-meta__byline .item-author{background-color:rgba(0,0,0,0.7);padding:6px}.grid.grid--headline .content-meta__byline .item-author a,.grid.grid--headline .content-meta__byline .item-author span{font-size:14px;color:#fff}@media only screen and (max-width: 49.94em){.grid.grid--headline .content-meta__byline .item-author{margin:10px auto}.grid.grid--headline .content-meta__byline .item-author a,.grid.grid--headline .content-meta__byline .item-author span{background:none;color:#7D7D7D}}.grid.grid--headline .content-meta__byline a{font-size:14px;color:#fff;border:0;padding:0;margin:0}.grid.grid--headline .grid__zone{position:absolute;left:0;top:0;width:100%;height:600px;overflow:hidden}@media only screen and (max-width: 49.94em){.grid.grid--headline .grid__zone{position:relative;height:inherit}}.grid.grid--headline .grid__zone img{width:100vw}@media only screen and (max-width: 49.94em){.grid.grid--equal .curation-module__zone:first-child{order:0;overflow:hidden;display:block}}@media only screen and (max-width: 49.94em){.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .item{height:inherit}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .curation-module__item__wrapper{display:grid;height:100%;grid-auto-rows:-webkit-min-content auto;grid-auto-rows:min-content auto}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-wrapper{align-items:center;display:flex;flex-flow:column;justify-content:center;padding:0;margin-top:auto;height:auto;width:100%}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-wrapper .storytype-label--outlined{height:27px}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .image-container-wrapper{width:100%}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__storyType{justify-content:center;margin-top:18px;margin-bottom:0}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__storyType span{border:1px solid transparent;font-size:15px;font-weight:normal;line-height:27px;padding:4px 9px}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__headline{text-align:center}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__headline h3,.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__headline h6{display:block;font-size:28px;padding:15px 18px}.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .content-meta__byline{justify-content:center}}@media only screen and (max-width: 49.94em){.grid.grid--equal .curation-module__zone:first-child .zone__item:first-child .curation-module__item:first-child .curation-module__item__wrapper{display:flex;flex-direction:column;padding:0 0 1.125rem}}.grid.grid--equal .curation-module__zone{display:block}.grid.grid--equal .curation-module__item{height:auto;box-shadow:none;border:0}.grid.grid--equal .curation-module__item .content-meta__excerpt{display:none}@media only screen and (min-width: 50em){.grid.grid--equal .curation-module__item .content-meta__headline__wrapper{padding:0 10px 0 0}.grid.grid--equal .curation-module__item .content-meta__headline h3,.grid.grid--equal .curation-module__item .content-meta__headline h6{display:inline;width:100%;margin:0;box-decoration-break:clone;-webkit-box-decoration-break:clone;font-size:22px;line-height:1}}.grid.grid--equal .curation-module__item .content-wrapper{padding:0;left:0;width:100%;z-index:2}@media only screen and (max-width: 49.94em){.grid.grid--equal .curation-module__item .content-wrapper{position:static;padding:0 0 0 15px}}.curation-module{position:relative;display:grid;grid-gap:20px;width:100%;margin-left:auto;margin-right:auto}.curation-module .ad-container{display:none}@media only screen and (max-width: 49.94em){.curation-module.grid[style]{grid-template-columns:1fr !important;grid-gap:0}.curation-module.grid{height:auto;max-height:100% !important;border:none}.curation-module .ad-container{display:block;margin-left:0;margin-right:0;margin-top:20px;margin-bottom:0;padding-bottom:20px;border-bottom:1px solid #e5e5e5;order:4}}.curation-module .image-container{position:relative;padding-bottom:56.25%;overflow:hidden}.curation-module .image-container:before{content:"";background-color:transparent;bottom:0;left:0;position:absolute;right:0;top:0;-webkit-transition:0.5s;transition:0.5s;z-index:1;pointer-events:none}.curation-module .image-container:hover:before{background-color:rgba(0,0,0,0.3)}.curation-module .image-container .animationContainer{top:10px;right:10px;left:auto;bottom:auto}.curation-module .image-container img{position:absolute;width:100%}.curation-module--hide{display:none}@media only screen and (max-width: 49.94em){.curation-module__zone.box,.curation-module__zone.tall{display:block}}.curation-module__item{position:relative;border-bottom:none;box-shadow:0px 1px 1px #7D7D7D;border-top:1px solid #e5e5e5;height:100%}@media only screen and (max-width: 49.94em){.curation-module__item{height:auto;max-height:100%;box-shadow:none;border:none}}.curation-module__item .content-meta__storytype{font-family:"ProximaNovaCond", sans-serif;font-size:14px;font-weight:bold;text-transform:uppercase}.curation-module__item .content-meta__headline,.curation-module__item .content-meta__headline [contenteditable]{cursor:text}@media only screen and (max-width: 49.94em){.curation-module__item .content-meta__headline h3,.curation-module__item .content-meta__headline h6{background-color:transparent;color:#000;font-weight:600;padding:0;margin:0}}.curation-module__item .content-meta__excerpt [contenteditable]{cursor:text}@media only screen and (max-width: 49.94em){.curation-module__item .content-meta__byline{display:flex !important}}.curation-module__item.hero .content-wrapper{padding:0 55px 60px}.curation-module__item.hero .content-wrapper .content-meta__storyType{margin:0 0 1px 0}.curation-module__item.hero .content-wrapper .content-meta__storyType .storytype-label{padding:1px 2px 0 2px}.curation-module__item.hero .content-wrapper .content-meta__byline{margin-top:1px}@media only screen and (max-width: 49.94em){.curation-module__item.hero .content-wrapper .content-meta__byline .item-author{background:none;padding:0}}.curation-module__item.hero .content-wrapper .content-meta__headline.short-headline h3,.curation-module__item.hero .content-wrapper .content-meta__headline.short-headline h6{font-size:50px}@media only screen and (max-width: 49.94em){.curation-module__item.hero .image-container:before{display:none !important}}.curation-module__item.big .item{height:inherit}@media only screen and (max-width: 49.94em){.curation-module__item.big:first-child{border-bottom:1px solid #e5e5e5}}.curation-module__item.big .curation-module__item__wrapper{display:flex;flex-direction:column;height:100%}@media only screen and (max-width: 49.94em){.curation-module__item.big .curation-module__item__wrapper{display:block}}.curation-module__item.big .content-wrapper{align-items:center;display:flex;flex-flow:column;justify-content:center;padding:20px 36px;height:100%}@media only screen and (max-width: 49.94em){.curation-module__item.big .content-wrapper{height:auto;margin-top:auto;padding:28px 18px 20px}.curation-module__item.big .content-wrapper .content-meta__headline:first-child .content-meta__headline__wrapper h3{padding-top:0}}.curation-module__item.big .content-meta__storyType{justify-content:center}@media only screen and (max-width: 49.94em){.curation-module__item.big .content-meta__storyType{margin-bottom:0}}.curation-module__item.big .content-meta__headline{text-align:center}.curation-module__item.big .content-meta__headline.short-headline h3,.curation-module__item.big .content-meta__headline.short-headline h6{font-size:45px}.curation-module__item.big .content-meta__headline.medium-headline h3,.curation-module__item.big .content-meta__headline.medium-headline h6{font-size:32px}@media only screen and (max-width: 49.94em){.curation-module__item.big .content-meta__headline.medium-headline h3,.curation-module__item.big .content-meta__headline.medium-headline h6{font-size:30px}}.curation-module__item.big .content-meta__headline.long-headline h3,.curation-module__item.big .content-meta__headline.long-headline h6{font-size:28px}@media only screen and (max-width: 49.94em){.curation-module__item.big .content-meta__headline.long-headline h3,.curation-module__item.big .content-meta__headline.long-headline h6{font-size:24px}}@media only screen and (max-width: 49.94em){.curation-module__item.big .content-meta__headline h3,.curation-module__item.big .content-meta__headline h6{display:block;font-size:28px;padding:20px 0 0 0}.curation-module__item.big .content-meta__headline+.content-meta__byline{padding-top:10px}}.curation-module__item.big .content-meta__byline{justify-content:center}@media only screen and (max-width: 49.94em){.curation-module__item.box .curation-module__item__wrapper{display:flex;padding:15px 1.125rem;border-bottom:1px solid #e5e5e5}.curation-module__item.box .curation-module__item__wrapper .image-container-wrapper{width:40%}.curation-module__item.box .curation-module__item__wrapper .content-wrapper{width:60%}.curation-module__item.box .content-meta__headline h3,.curation-module__item.box .content-meta__headline h6{font-size:18px}.curation-module__item.box .content-meta__excerpt{display:none}.curation-module__item.box .content-wrapper,.curation-module__item.box .image-container-wrapper{padding:0}.curation-module__item.box .content-wrapper{padding-left:15px;position:static}}@media only screen and (max-width: 49.94em){.curation-module__item.tall .content-wrapper{width:60%}}@media only screen and (max-width: 63.69em){.curation-module__item.tall .content-wrapper .content-meta__excerpt{max-height:240px;overflow:hidden}}.curation-module__item.tall .content-wrapper .content-meta__excerpt p{line-height:1.9}@media only screen and (max-width: 49.94em){.curation-module__item.tall .curation-module__item__wrapper{display:flex;padding:15px;border-bottom:1px solid #e5e5e5}.curation-module__item.tall .curation-module__item__wrapper .image-container-wrapper{width:40%}.curation-module__item.tall .curation-module__item__wrapper .content-wrapper{width:60%}.curation-module__item.tall .content-meta__headline h3,.curation-module__item.tall .content-meta__headline h6{font-size:18px}.curation-module__item.tall .content-meta__excerpt{display:none}.curation-module__item.tall .content-wrapper,.curation-module__item.tall .image-container-wrapper{padding:0}.curation-module__item.tall .content-wrapper{padding-left:15px;position:static}}.curation-module__item .image-container{position:relative;padding-bottom:56.25%;overflow:hidden}.curation-module__item .image-container img,.curation-module__item .image-container video{position:absolute;top:0;left:0;width:100%}.curation-module .layout--Equal3 .content-meta__excerpt,.curation-module .layout--Equal4 .content-meta__excerpt,.curation-module .layout--Equal6 .content-meta__excerpt{display:none}.curation-module .grid .grid__zone .item .image-container{position:relative;padding-bottom:56.25%;overflow:hidden}.curation-module .grid .grid__zone .item .image-container img{position:absolute;top:0;left:0;width:100%}.curation-module .grid .grid__zone .item .content-wrapper{padding:15px}@media only screen and (max-width: 49.94em){.curation-module__item.box .content-wrapper{padding-left:10px;width:70%}.curation-module__item.box .image-container-wrapper{width:30%}}@media only screen and (max-width: 49.94em){.curation-module__item.tall .content-wrapper{padding-left:10px;width:70%}.curation-module__item.tall .image-container-wrapper{width:30%}}@media only screen and (min-width: 50em){.blog-group-theonion .layout.layout:not(.layout--Headline1){padding:18px}}.blog-group-theonion .layout.layout--Modular3,.blog-group-theonion .layout.layout--Modular4{max-height:100%}.blog-group-theonion .layout.layout--Modular3 .grid.grid--modular,.blog-group-theonion .layout.layout--Modular4 .grid.grid--modular{max-height:inherit}.blog-group-theonion .grid.grid--headline .content-wrapper{padding:55px 55px 36px}.blog-group-theonion .grid.grid--headline .content-meta__headline h3{color:#000;font-size:30px;background-color:rgba(255,255,255,0.9);padding:5px 6px 7px;line-height:1.8}.blog-group-theonion .grid.grid--headline .content-meta__headline h3 a{color:#000}.blog-group-theonion .grid.grid--headline .content-meta__storyType .storytype-label-wrapper{background-color:transparent;padding:0}.blog-group-theonion .grid.grid--headline .content-meta__storyType .storytype-label{background-color:rgba(255,255,255,0.9);color:#000;font-weight:600;padding:3px 6px 0;height:auto}.blog-group-theonion .grid.grid--equal .grid__zone{padding-bottom:0}.blog-group-theonion .curation-module__item{box-shadow:none}.blog-group-theonion .curation-module__item .content-meta__byline a,.blog-group-theonion .curation-module__item .content-meta__byline span,.blog-group-theonion .curation-module__item .content-meta__headline h3,.blog-group-theonion .curation-module__item .content-meta__headline h5,.blog-group-theonion .curation-module__item .content-meta__headline h6{font-family:"ElizabethSerif", Georgia, serif}.blog-group-theonion .curation-module__item .content-meta__headline h5 a{font-weight:bold}.blog-group-theonion .curation-module__item.big .content-meta__headline{padding:0}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item.big .content-meta__headline{margin:auto}}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item.big .content-meta__headline h3,.blog-group-theonion .curation-module__item.big .content-meta__headline h6{font-size:22px;padding:30px 18px}}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item.big .content-wrapper{padding:28px 0 0}}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item.box .content-meta__headline h3,.blog-group-theonion .curation-module__item.tall .content-meta__headline h3{font-size:20px;padding:20px 18px 0;margin:0}}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item.box .content-meta__headline h5,.blog-group-theonion .curation-module__item.box .content-meta__headline h6,.blog-group-theonion .curation-module__item.tall .content-meta__headline h5,.blog-group-theonion .curation-module__item.tall .content-meta__headline h6{font-size:16px;margin:0;padding:0}}.blog-group-theonion .curation-module__item.box .content-meta__excerpt,.blog-group-theonion .curation-module__item.tall .content-meta__excerpt{max-height:100%}.blog-group-theonion .curation-module__item .content-meta__headline{text-align:left}.blog-group-theonion .curation-module__item .content-meta__headline h5,.blog-group-theonion .curation-module__item .content-meta__headline h6{font-size:16px}.blog-group-theonion .curation-module__item .content-meta__headline h3,.blog-group-theonion .curation-module__item .content-meta__headline h6{padding:20px 0 0 0}.blog-group-theonion .curation-module__item .content-meta__headline h3{font-size:24px}.blog-group-theonion .curation-module__item .content-meta__excerpt p{font-size:15px;line-height:1.8}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item .content-meta__excerpt{display:none !important}}.blog-group-theonion .curation-module__item .content-meta__byline{font-size:15px;justify-content:flex-start}.blog-group-theonion .curation-module__item .content-meta__byline .item-author,.blog-group-theonion .curation-module__item .content-meta__byline .item-authors{display:none !important}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item .content-meta__byline{display:none !important}}.blog-group-theonion .curation-module__item .content-wrapper{align-items:flex-start;padding:0}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item .content-wrapper{padding-left:10px}}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item--tertiary-child{padding-bottom:15px}.blog-group-theonion .curation-module__item--tertiary-child:last-child{padding-bottom:0}.blog-group-theonion .curation-module__item--tertiary-child .image-container-wrapper{margin-right:0}.blog-group-theonion .curation-module__item--tertiary-child .content-wrapper{padding-left:10px}.blog-group-theonion .curation-module__item--tertiary-child .content-meta__headline h5{margin-bottom:0;padding:0}}.blog-group-theonion .curation-module__item:not(.box)+.curation-module__item,.blog-group-theonion .zone__item+.zone__item{border-top:1px solid #e5e5e5}@media only screen and (max-width: 49.94em){.blog-group-theonion .curation-module__item:not(.box)+.curation-module__item,.blog-group-theonion .zone__item+.zone__item{border-top:none}}.blog-group-theonion .grid__zone{border-left:1px solid #e5e5e5;padding:0 0 0 20px}.blog-group-theonion .grid__zone .zone__item .curation-module__item.box{border-bottom:none}.blog-group-theonion .grid__zone .zone__item:first-child .curation-module__item.box{border-bottom:1px solid #e5e5e5}@media only screen and (max-width: 49.94em){.blog-group-theonion .grid__zone{padding:0}.blog-group-theonion .grid__zone.tall{padding:15px 1.125rem 0;border-bottom:1px solid #e5e5e5}}.blog-group-theonion .grid__zone:first-child{padding-left:0;border-left:0}@media only screen and (min-width: 37.37em){body:not(.theonion) .curation-module__item:not(:last-child),body:not(.theonion) .zone__item+.zone__item:not(:last-child){padding-bottom:20px;border-bottom:1px solid #e5e5e5}}body:not(.theonion) .grid.grid--equal .grid__zone{padding-bottom:0;padding-left:0;border:0}@media only screen and (min-width: 50em){body:not(.theonion) .grid.grid--equal .grid__zone{display:grid}}body:not(.theonion) .curation-module__item{box-shadow:none}body:not(.theonion) .curation-module__item:first-child{border-top:none}@media only screen and (max-width: 49.94em){body:not(.theonion) .curation-module__item{padding-top:0;border-top:none}}body:not(.theonion) .curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper h5{font-size:18px;margin-bottom:0}body:not(.theonion) .curation-module__item--tertiary-child .content-wrapper .content-meta__headline__wrapper a{font-weight:normal;font-size:18px}body:not(.theonion) .layout--Equal3 .grid__zone,body:not(.theonion) .layout--Equal4 .grid__zone,body:not(.theonion) .layout--Equal6 .grid__zone{padding:0}body:not(.theonion) .layout--Equal3 .grid__zone.box .zone__item:not(:last-child),body:not(.theonion) .layout--Equal4 .grid__zone.box .zone__item:not(:last-child),body:not(.theonion) .layout--Equal6 .grid__zone.box .zone__item:not(:last-child){border-bottom:none}body:not(.theonion) .layout--Equal3 .curation-module__item+.curation-module__item,body:not(.theonion) .layout--Equal3 .zone__item+.zone__item,body:not(.theonion) .layout--Equal4 .curation-module__item+.curation-module__item,body:not(.theonion) .layout--Equal4 .zone__item+.zone__item,body:not(.theonion) .layout--Equal6 .curation-module__item+.curation-module__item,body:not(.theonion) .layout--Equal6 .zone__item+.zone__item{border-top:none;padding-top:0}body:not(.theonion) .grid__zone:not(.curation-module__zone__item-width-children){border-left:1px solid #e5e5e5;padding:0 0 0px 20px}@media only screen and (max-width: 49.94em){body:not(.theonion) .grid__zone:not(.curation-module__zone__item-width-children){border-left:none;padding:0}}body:not(.theonion) .grid__zone:first-child{border-left:0;padding-left:0}body:not(.theonion) .grid__zone.box{grid-gap:20px}body:not(.theonion) .grid__zone.box .zone__item{padding-top:0}body:not(.theonion) .grid__zone.box .zone__item:not(:last-child){border-bottom:1px solid #e5e5e5}.layout--Equal3 .curation-module__item .content-wrapper,.layout--Equal4 .curation-module__item .content-wrapper,.layout--Equal6 .curation-module__item .content-wrapper{bottom:0;position:relative}.layout--Equal3 .curation-module__item .content-meta__headline__wrapper,.layout--Equal4 .curation-module__item .content-meta__headline__wrapper,.layout--Equal6 .curation-module__item .content-meta__headline__wrapper{padding:0}.layout--Equal3 .image-container-wrapper,.layout--Equal4 .image-container-wrapper,.layout--Equal6 .image-container-wrapper{margin-bottom:10px}.layout--Equal3 .content-wrapper h6 a,.layout--Equal4 .content-wrapper h6 a,.layout--Equal6 .content-wrapper h6 a{color:#000}.layout--Equal3 .content-wrapper .content-meta__headline h6,.layout--Equal4 .content-wrapper .content-meta__headline h6,.layout--Equal6 .content-wrapper .content-meta__headline h6{background-color:transparent;color:#000;padding:0;font-weight:bold}.layout--Equal3 .content-wrapper .storytype-label,.layout--Equal4 .content-wrapper .storytype-label,.layout--Equal6 .content-wrapper .storytype-label{border:none;padding:0}.layout--Equal3 .content-wrapper .storytype-label--outlined,.layout--Equal4 .content-wrapper .storytype-label--outlined,.layout--Equal6 .content-wrapper .storytype-label--outlined{height:18px;line-height:18px;font-weight:600}.layout--Equal3 .content-wrapper .content-meta__byline,.layout--Equal4 .content-wrapper .content-meta__byline,.layout--Equal6 .content-wrapper .content-meta__byline{display:block;line-height:1.6}.layout--Equal3 .content-meta__storyType,.layout--Equal4 .content-meta__storyType,.layout--Equal6 .content-meta__storyType{margin-bottom:5px;border:none;line-height:18px}.layout.layout--Equal6{max-width:980px}label{display:block}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;border-radius:0;background-color:transparent;border:0;box-shadow:none;display:block;font-size:0.875rem;font-family:"ProximaNovaCond", sans-serif;margin:0;padding:0;height:auto;width:auto;-webkit-transition:none;transition:none}input[type=date]:active,input[type=date]:disabled,input[type=date]:focus,input[type=date]:hover,input[type=datetime-local]:active,input[type=datetime-local]:disabled,input[type=datetime-local]:focus,input[type=datetime-local]:hover,input[type=datetime]:active,input[type=datetime]:disabled,input[type=datetime]:focus,input[type=datetime]:hover,input[type=email]:active,input[type=email]:disabled,input[type=email]:focus,input[type=email]:hover,input[type=month]:active,input[type=month]:disabled,input[type=month]:focus,input[type=month]:hover,input[type=number]:active,input[type=number]:disabled,input[type=number]:focus,input[type=number]:hover,input[type=password]:active,input[type=password]:disabled,input[type=password]:focus,input[type=password]:hover,input[type=search]:active,input[type=search]:disabled,input[type=search]:focus,input[type=search]:hover,input[type=tel]:active,input[type=tel]:disabled,input[type=tel]:focus,input[type=tel]:hover,input[type=text]:active,input[type=text]:disabled,input[type=text]:focus,input[type=text]:hover,input[type=time]:active,input[type=time]:disabled,input[type=time]:focus,input[type=time]:hover,input[type=url]:active,input[type=url]:disabled,input[type=url]:focus,input[type=url]:hover,input[type=week]:active,input[type=week]:disabled,input[type=week]:focus,input[type=week]:hover,textarea:active,textarea:disabled,textarea:focus,textarea:hover{background-color:transparent;outline:none}input[type=checkbox]+label,input[type=radio]+label{display:inline-block;margin-left:0;margin-right:0;margin-bottom:0}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;cursor:pointer;font-weight:normal;line-height:normal;margin:0;position:relative;text-decoration:none;text-align:center;border-radius:0;display:inline-block;padding:0;font-size:1rem;font-family:"ProximaNovaCond", sans-serif;background-color:transparent;color:#000;-webkit-transition:none;transition:none}button:active,button:focus,button:hover{color:#000;outline:none}label{cursor:default}.flex-video{display:block}
+ ]]>
+ </style>
+ </head>
+ <body class="kotaku blog-group-kotaku blog-recirc-group-fmgNonSatire permalink en-US f_ad_script_in_head_on f_ad_timeout_amazon_on f_ad_timeout_failsafe_on f_ad_timeout_prebid_on f_adx_permalink_text_on f_amazon_aps_tag_on f_amazon_right_rail_on f_amazon_wait_for_bids_on f_amp_skimlinks_on f_analyticstracking_on f_avclub_legacy_login_on f_bucketcookies_on f_chartbeat_powered_sidebar_on f_chartbeat_video_on f_comment_nofollow_on f_comments_taboola_ad_on f_commerce_button_inset_on f_commerce_permalink_module_on f_concurrent_editing_on f_curation_on_storytype_on f_curation_toggle_on f_custom_header_on f_custom_kinja_standalone_on f_devcon_script_on f_dfp_lineitem_opts_on f_disable_fbia_rss_on f_disable_skimlinks_on f_disable_teads_on f_disallow_api_on f_editor_save_screen_update_on f_enable_bouncex_on f_enable_html_sitemap_on f_experimental_scores_on f_featured_video_toolbar_on f_filter_old_articles_on f_frontendtiming_on f_frontpage_recentvideo_on f_fun_errorpages_on f_global_video_page_on f_header_anchor_tags_on f_hide_ellipsis_on f_images_intersect_on f_infinite_promotion_on f_infinite_scroll_on f_kinja3_cards_phase2_on f_kinja3_cards_phase2_avatars_on f_kinja3_cards_phase3_on f_kinja_video_page_on f_large_commerce_rail_on f_legacy_embiggen_on f_load_dfp_statically_on f_magma_amp_inarticle_videos_on f_magma_permalink_video_truncation_on f_magma_render_profiles_on f_magma_second_scroll_on f_magma_splashy_ad_logic_change_on f_medianet_headerbidding_on f_medianet_headerbidding_amp_on f_meta_first_on f_mobile_commerce_inset_on f_mobilead_two_nodes_on f_more_from_chartbeat_on f_native_recirc_magma_rendered_on f_native_sidebar_magma_rendered_on f_native_stream_magma_rendered_phase_2_on f_native_stream_magma_rendered_phase_3_with_excerpts_on f_new_permalink_a_on f_new_permalink_b_on f_new_static_stream_header_on f_new_story_page_boilerplates_on f_newmodalstyles_on f_newrelicrum_on f_permalink_paragraph_ads_on f_permalink_subscription_on f_piano_prod_on f_post_versioning_on f_prebid_on f_prebid_video_on f_pure_save_button_on f_recent_video_instream_on f_recirc_sidebar_on f_restore_images_on f_reviewbox_alignment_full_bleed_on f_samba_for_simplereach_on f_scroll_vendor_on f_share_tools_on f_share_tools_footer_on f_shortpost_nofollow_on f_sidebar_ad_whitespace_on f_simple_image_lazyload_on f_simplereach_ad_tag_on f_simplereach_expanded_on f_slideshow_on f_smartcrop_on f_sourcepoint_ccpa_on f_story_type_stream_below_6_on f_storytype_boilerplate_on f_subscription_module_amp_on f_subscription_module_applenews_on f_theonion_podcast_player_on f_tradedesk_pixel_on f_video_upload_captions_on blog-group-kotaku">
+ <div id="splashy-ad-container-top" class="splashy-ad-container no-overflow" style="display:none">
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-SPLASHY_TOP ad-splashy-top" data-ad-unit="SPLASHY_TOP" data-targeting="{&quot;pos&quot;:&quot;splashytop&quot;}"></div>
+ </div>
+ <div id="trackers"></div>
+ <div>
+ <div class="js_mobile-nav"></div>
+ <div class="js_topbar sc-17y8tyw-0 zVObM">
+ <div class="vuc0jk-0 hVJsES">
+ <ul class="vuc0jk-1 hyLaMq">
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;avclub.com&quot;,{&quot;metric20&quot;:1}]]" href="//avclub.com">The A.V. Club</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;deadspin.com&quot;,{&quot;metric20&quot;:1}]]" href="//deadspin.com">Deadspin</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;gizmodo.com&quot;,{&quot;metric20&quot;:1}]]" href="//gizmodo.com">Gizmodo</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;jalopnik.com&quot;,{&quot;metric20&quot;:1}]]" href="//jalopnik.com">Jalopnik</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;jezebel.com&quot;,{&quot;metric20&quot;:1}]]" href="//jezebel.com">Jezebel</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;kotaku.com&quot;,{&quot;metric20&quot;:1}]]" href="//kotaku.com">Kotaku</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;lifehacker.com&quot;,{&quot;metric20&quot;:1}]]" href="//lifehacker.com">Lifehacker</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;theroot.com&quot;,{&quot;metric20&quot;:1}]]" href="//theroot.com">The Root</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;thetakeout.com&quot;,{&quot;metric20&quot;:1}]]" href="//thetakeout.com">The Takeout</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;theonion.com&quot;,{&quot;metric20&quot;:1}]]" href="//theonion.com">The Onion</a>
+ </li>
+ <li class="vuc0jk-2 cxfwkg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Network navigation&quot;,&quot;Network Blog Click&quot;,&quot;theinventory.com&quot;,{&quot;metric20&quot;:1}]]" href="//theinventory.com">The Inventory</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="js_header">
+ <div class="js_header-container sc-1f6xobn-9 cLvRyM">
+ <div class="js_global-nav sc-1f6xobn-8 hElAzM">
+ <div class="sc-1f6xobn-7 eQCLWh">
+ <div class="sc-1f6xobn-0 fBOpXK">
+ <div class="sc-1f6xobn-13 hoiFaE">
+ <span class="overhang-wrapper sc-101yw2y-5 ebBaTT"><a href="//kotaku.com" title="Kotaku" class="sc-8vrmk6-0 fPlCjx">
+ <div class="sc-2d8w30-0 jRvBRt">
+ <div class="kotaku sc-2d8w30-1 iHLoZR">
+ <span class="overhang-wrapper sc-101yw2y-5 ebBaTT"><svg xmlns="http://www.w3.org/2000/svg" width="212" height="39" aria-label="Kotaku logo" viewbox="0 0 212 39">
+ <path fill="#FBC000" fill-rule="evenodd" d="M191.72 5.28l1.2 17.98-8.58.16-1-18.37-6.51-.17.94 21.03c.13 3 2.28 5.38 4.77 5.29l12.99-.49c2.3-.09 3.97-2.48 3.75-5.33l-1.5-19.93-6.06-.17zm13.1 1.62c-.2-2.61-1.88-4.8-3.78-4.88l-1.74-.07.64 9.67 5.22.08-.34-4.8zm6.8 0c-.23-2.61-1.9-4.8-3.77-4.87l-1.71-.08.72 9.67 5.14.08-.39-4.8zm-60.2-3l.2 28.27 2.58-.1c2.85-.1 5.1-2.76 5.04-5.92L158.9 4.1l-7.46-.2zm7.83 10.72l8.01.04c2.62.01 3.8 1.18 4.79 3.02l9.66 20.68c-1.07 1.4-7.06.8-9.53-4.74l-5.12-11.27-.45.01-.4.01c-2.76.04-7.05-2.58-6.96-7.74zM143.39 4.23l-12.1-.33c-5.75-.15-7.27 4.83-6.34 8.06l15.81.14-.1 12.1-10.89.2.05-2.14 3.2-.04c5.72-.08 7.1-4.77 6.17-7.94h-.04l.02-.01-11.92-.05c-3.09-.01-5.72 2.61-5.84 5.9l-.04 1.05-.22 6.04c-.13 3.39 2.39 6.06 5.57 5.94l16.55-.63c2.91-.1 5.24-2.8 5.23-5.97l-.05-16.77c-.02-3-2.26-5.47-5.06-5.55zm-39.82 24.5a5.95 5.95 0 0 0 6.33 6.37l3.32-.12 1.08-21.27-9.75-.06-.98 15.08zm13.46-17.03c6.17.05 7.73-5 6.8-8.21l-20.86-.56c-6.64-.18-7.88 5.14-6.96 8.58l21.02.19zM88.76 2.5l-19.43-.54c-7.58-.21-10.1 5.6-9.22 9.38l24.53.23-1.25 14-14.16.27 1.45-12.99-10.9-.07-2.09 16.38c-.5 3.95 2.53 7.07 6.71 6.9l21.57-.8a7.76 7.76 0 0 0 7.31-6.98L94.75 8.9a5.98 5.98 0 0 0-5.99-6.4zm-69.34-.55L12.7 38.02l4.22-.16c4.65-.18 8.92-3.63 9.6-7.67l4.74-27.9-11.84-.34zm11.06 12.68l13.02.05c4.23.02 5.87 1.5 7.02 3.81l8.1 19.65c-2.05 1.8-11.6 1.18-14.3-5.88l-2.96-7.84h-.73l-.63.01c-4.52.06-10.9-3.25-9.52-9.8zM15.7 12.67l1.9-10.51-6.57-.2C1.9 1.7-.63 8.26.12 12.53l15.58.16zm22.73 1.96l16.8-3.68c3.16-1.93 4.51-8.9 2.3-10.95l-16.3 3.95c-2.77 1.5-5.95 5.86-2.8 10.68zm124.62 0l8.93-4.84c3.1-2.63 3.97-6.97 1.32-9.79l-9.64 6.05c-3.44 2.32-2.92 5.76-.61 8.58z"></path></svg></span>
+ </div>
+ </div></a></span>
+ <div class="sc-1f6xobn-14 miWDp">
+ <span class="overhang-wrapper sc-101yw2y-5 ebBaTT">Gaming Reviews, News, Tips and More.</span>
+ </div>
+ </div>
+ <div class="sc-1f6xobn-15 Lwydz">
+ <span class="overhang-wrapper sc-101yw2y-5 ebBaTT"><a href="/search" class="sc-1f6xobn-1 sc-1f6xobn-4 YrjCq"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Search24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M15.31 1a7.69 7.69 0 1 1-5.06 13.48l-8.37 8.37a.51.51 0 1 1-.73-.72l8.37-8.38A7.69 7.69 0 0 1 15.31 1zm0 1.03a6.66 6.66 0 1 0 0 13.32 6.66 6.66 0 0 0 0-13.32z"></path></svg></span></a><a href="https://store.kotaku.com" target="_blank" data-ga="[[&quot;Sub navigation&quot;, &quot;Shop button click&quot;]]" class="sc-1f6xobn-1 js_header-shop sc-1f6xobn-3 cKiLPQ"><span class="iyvn34-1 jBPzMI"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Cart icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M2.5 2c.16 0 .3.07.4.2l.05.08L3.8 4h13.7a.5.5 0 0 1 .5.58l-.03.08-2 6a.5.5 0 0 1-.38.33l-.09.01H4.82l.12 1h8.56a.5.5 0 0 1 .17.03 2 2 0 1 1-1.4.97H8.73a2 2 0 1 1-3.46 0H4.5a.5.5 0 0 1-.48-.36L4 12.56l-.99-7.91L2.2 3H.5a.5.5 0 0 1-.5-.41V2.5A.5.5 0 0 1 .41 2H2.5zM14 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-7 0a1 1 0 1 0 0 2 1 1 0 0 0 0-2zm-2.3-3h10.44l1.66-5H4.07l.62 5z"></path></svg></span></span>Shop</a><a href="/newsletter" target="_blank" data-ga="[[&quot;Sub navigation&quot;, &quot;Subscribe button click&quot;]]" class="sc-1f6xobn-1 js_header-newsletter sc-1f6xobn-3 cKiLPQ"><span class="iyvn34-1 jBPzMI"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Mail icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M14.5 3A2.5 2.5 0 0 1 17 5.5v7a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 1 12.5v-7A2.5 2.5 0 0 1 3.5 3h11zM2 5.5v7c0 .83.67 1.5 1.5 1.5h11c.83 0 1.5-.67 1.5-1.5v-7l-.03-.3-6.34 5.67a.5.5 0 0 1-.38.13.5.5 0 0 1-.38-.13l-6.7-6-.02-.02c-.1.2-.15.41-.15.64zM14.5 4h-11c-.24 0-.45.05-.65.14l6.4 5.73 6.19-5.54c-.26-.2-.58-.33-.93-.33z"></path></svg></span></span>Subscribe</a></span>
+ <div class="js_user-button">
+ <div class="sc-1il3uru-2 iUbnXK">
+ <a class="js_header-userbutton"><span class="sc-1il3uru-3 gBMIDl"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="UserFilled icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M11.28 10.23c.02.02.05.03.08-.06l.21-.33.06-.09c.44-.69.64-1.06.96-1.87.66-1.7.4-3.9-.57-5.3A3.32 3.32 0 0 0 9 1c-1.47 0-2.25.45-3.03 1.57a6.04 6.04 0 0 0-.56 5.3 10.24 10.24 0 0 0 1.27 2.35c0 .03-.03.04-.16.1l-1.94.79-.06.02c-1.3.54-1.88.78-2.01.88a3 3 0 0 0-1.23 1.97A52.5 52.5 0 0 0 1 16.46c-.03.3.2.54.49.54l15-.01a.5.5 0 0 0 .5-.54 50.52 50.52 0 0 0-.27-2.43l-.09-.39a3 3 0 0 0-1.15-1.62c-.13-.1-.21-.13-2.06-.88h-.02a30.86 30.86 0 0 1-2.16-.95l.03.05z"></path></svg></span></span></a>
+ </div>
+ </div><a class="sc-1f6xobn-1 js_mobile-header-link sc-1f6xobn-2 djRjMr"><span class="icon-close iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Close24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M21.73 2.15c.2.2.2.51 0 .7l-9.08 9.09 9.2 9.2c.18.18.2.45.06.64l-.06.07a.5.5 0 0 1-.7 0l-9.21-9.2-9.08 9.08a.5.5 0 0 1-.71-.71l9.08-9.08-8.96-8.96a.5.5 0 0 1-.06-.64l.06-.07c.2-.2.52-.2.71 0l8.96 8.96 9.08-9.08c.2-.2.51-.2.7 0z"></path></svg></span><span class="icon-hamburger iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Hamburger24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M21.5 21a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5zm0-9a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5zm0-9a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5z"></path></svg></span></a>
+ </div>
+ </div>
+ <nav class="dfwuc8-1 falNPB">
+ <a data-key="latest" href="//kotaku.com/" class="dfwuc8-0 fVpzWD"><span>Latest</span></a><a data-tagcanonical="video" data-index="1" href="/c/video" class="dfwuc8-0 fVpzWD"><span>Video</span></a><a data-blogid="1633980057" data-index="2" href="https://thebests.kotaku.com" class="dfwuc8-0 fVpzWD"><span>The Bests</span></a><a data-index="3" href="https://kotaku.com/c/podcast" class="dfwuc8-0 fVpzWD"><span>Splitscreen</span></a><a data-tagcanonical="highlight-reel" data-index="4" href="/c/highlight-reel" class="dfwuc8-0 fVpzWD"><span>Highlight Reel</span></a><a data-blogid="1538697436" data-index="5" href="https://cosplay.kotaku.com" class="dfwuc8-0 fVpzWD"><span>Cosplay</span></a><a data-tagcanonical="review" data-index="6" href="/c/review" class="dfwuc8-0 fVpzWD"><span>Review</span></a><a data-index="7" href="https://store.kotaku.com/" class="dfwuc8-0 fVpzWD"><span>Shop</span></a>
+ </nav>
+ <div class="wz9htl-0 bHuckL">
+ Gaming Reviews, News, Tips and More.
+ </div>
+ </div>
+ <div class="header-bar"></div>
+ </div>
+ <div class="js_header-disable-overlay sc-1f6xobn-16 lmomFr"></div>
+ <div class="js_hamburger-menu-container"></div>
+ <div class="js_scrollback-nav sc-1f6xobn-17 kqthke">
+ <div class="sc-1f6xobn-8 hWQHjO">
+ <div class="sc-1f6xobn-0 ggPaHg">
+ <div class="sc-1f6xobn-13 ldbUeF">
+ <a href="//kotaku.com" title="Kotaku" class="sc-8vrmk6-0 fPlCjx">
+ <div class="sc-2d8w30-0 jRvBRt">
+ <div class="kotaku sc-2d8w30-1 iHLoZR">
+ <svg xmlns="http://www.w3.org/2000/svg" width="212" height="39" aria-label="Kotaku logo" viewbox="0 0 212 39">
+ <path fill="#FBC000" fill-rule="evenodd" d="M191.72 5.28l1.2 17.98-8.58.16-1-18.37-6.51-.17.94 21.03c.13 3 2.28 5.38 4.77 5.29l12.99-.49c2.3-.09 3.97-2.48 3.75-5.33l-1.5-19.93-6.06-.17zm13.1 1.62c-.2-2.61-1.88-4.8-3.78-4.88l-1.74-.07.64 9.67 5.22.08-.34-4.8zm6.8 0c-.23-2.61-1.9-4.8-3.77-4.87l-1.71-.08.72 9.67 5.14.08-.39-4.8zm-60.2-3l.2 28.27 2.58-.1c2.85-.1 5.1-2.76 5.04-5.92L158.9 4.1l-7.46-.2zm7.83 10.72l8.01.04c2.62.01 3.8 1.18 4.79 3.02l9.66 20.68c-1.07 1.4-7.06.8-9.53-4.74l-5.12-11.27-.45.01-.4.01c-2.76.04-7.05-2.58-6.96-7.74zM143.39 4.23l-12.1-.33c-5.75-.15-7.27 4.83-6.34 8.06l15.81.14-.1 12.1-10.89.2.05-2.14 3.2-.04c5.72-.08 7.1-4.77 6.17-7.94h-.04l.02-.01-11.92-.05c-3.09-.01-5.72 2.61-5.84 5.9l-.04 1.05-.22 6.04c-.13 3.39 2.39 6.06 5.57 5.94l16.55-.63c2.91-.1 5.24-2.8 5.23-5.97l-.05-16.77c-.02-3-2.26-5.47-5.06-5.55zm-39.82 24.5a5.95 5.95 0 0 0 6.33 6.37l3.32-.12 1.08-21.27-9.75-.06-.98 15.08zm13.46-17.03c6.17.05 7.73-5 6.8-8.21l-20.86-.56c-6.64-.18-7.88 5.14-6.96 8.58l21.02.19zM88.76 2.5l-19.43-.54c-7.58-.21-10.1 5.6-9.22 9.38l24.53.23-1.25 14-14.16.27 1.45-12.99-10.9-.07-2.09 16.38c-.5 3.95 2.53 7.07 6.71 6.9l21.57-.8a7.76 7.76 0 0 0 7.31-6.98L94.75 8.9a5.98 5.98 0 0 0-5.99-6.4zm-69.34-.55L12.7 38.02l4.22-.16c4.65-.18 8.92-3.63 9.6-7.67l4.74-27.9-11.84-.34zm11.06 12.68l13.02.05c4.23.02 5.87 1.5 7.02 3.81l8.1 19.65c-2.05 1.8-11.6 1.18-14.3-5.88l-2.96-7.84h-.73l-.63.01c-4.52.06-10.9-3.25-9.52-9.8zM15.7 12.67l1.9-10.51-6.57-.2C1.9 1.7-.63 8.26.12 12.53l15.58.16zm22.73 1.96l16.8-3.68c3.16-1.93 4.51-8.9 2.3-10.95l-16.3 3.95c-2.77 1.5-5.95 5.86-2.8 10.68zm124.62 0l8.93-4.84c3.1-2.63 3.97-6.97 1.32-9.79l-9.64 6.05c-3.44 2.32-2.92 5.76-.61 8.58z"></path></svg>
+ </div>
+ </div></a>
+ </div>
+ <nav class="dfwuc8-1 cFfYvh">
+ <div class="dfwuc8-2 jflTDT"></div><a data-key="latest" href="//kotaku.com/" class="dfwuc8-0 jDxnTz"><span>Latest</span></a><a data-tagcanonical="video" data-index="1" href="/c/video" class="dfwuc8-0 jDxnTz"><span>Video</span></a><a data-blogid="1633980057" data-index="2" href="https://thebests.kotaku.com" class="dfwuc8-0 jDxnTz"><span>The Bests</span></a><a data-index="3" href="https://kotaku.com/c/podcast" class="dfwuc8-0 jDxnTz"><span>Splitscreen</span></a><a data-tagcanonical="highlight-reel" data-index="4" href="/c/highlight-reel" class="dfwuc8-0 jDxnTz"><span>Highlight Reel</span></a><a data-blogid="1538697436" data-index="5" href="https://cosplay.kotaku.com" class="dfwuc8-0 jDxnTz"><span>Cosplay</span></a><a data-tagcanonical="review" data-index="6" href="/c/review" class="dfwuc8-0 jDxnTz"><span>Review</span></a><a data-index="7" href="https://store.kotaku.com/" class="dfwuc8-0 jDxnTz"><span>Shop</span></a>
+ </nav>
+ <div class="sc-1f6xobn-15 bNzDDF">
+ <a href="/search" class="sc-1f6xobn-1 sc-1f6xobn-4 YrjCq"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Search24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M15.31 1a7.69 7.69 0 1 1-5.06 13.48l-8.37 8.37a.51.51 0 1 1-.73-.72l8.37-8.38A7.69 7.69 0 0 1 15.31 1zm0 1.03a6.66 6.66 0 1 0 0 13.32 6.66 6.66 0 0 0 0-13.32z"></path></svg></span></a>
+ <div class="js_user-button">
+ <div class="sc-1il3uru-2 iUbnXK">
+ <a class="js_header-userbutton"><span class="sc-1il3uru-3 gBMIDl"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="UserFilled icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M11.28 10.23c.02.02.05.03.08-.06l.21-.33.06-.09c.44-.69.64-1.06.96-1.87.66-1.7.4-3.9-.57-5.3A3.32 3.32 0 0 0 9 1c-1.47 0-2.25.45-3.03 1.57a6.04 6.04 0 0 0-.56 5.3 10.24 10.24 0 0 0 1.27 2.35c0 .03-.03.04-.16.1l-1.94.79-.06.02c-1.3.54-1.88.78-2.01.88a3 3 0 0 0-1.23 1.97A52.5 52.5 0 0 0 1 16.46c-.03.3.2.54.49.54l15-.01a.5.5 0 0 0 .5-.54 50.52 50.52 0 0 0-.27-2.43l-.09-.39a3 3 0 0 0-1.15-1.62c-.13-.1-.21-.13-2.06-.88h-.02a30.86 30.86 0 0 1-2.16-.95l.03.05z"></path></svg></span></span></a>
+ </div>
+ </div><a class="sc-1f6xobn-1 js_mobile-header-link sc-1f6xobn-2 djRjMr"><span class="icon-close iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Close24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M21.73 2.15c.2.2.2.51 0 .7l-9.08 9.09 9.2 9.2c.18.18.2.45.06.64l-.06.07a.5.5 0 0 1-.7 0l-9.21-9.2-9.08 9.08a.5.5 0 0 1-.71-.71l9.08-9.08-8.96-8.96a.5.5 0 0 1-.06-.64l.06-.07c.2-.2.52-.2.71 0l8.96 8.96 9.08-9.08c.2-.2.51-.2.7 0z"></path></svg></span><span class="icon-hamburger iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" aria-label="Hamburger24 icon" viewbox="0 0 24 24">
+ <path fill-rule="evenodd" d="M21.5 21a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5zm0-9a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5zm0-9a.5.5 0 0 1 .09 1H2.5a.5.5 0 0 1-.09-1H21.5z"></path></svg></span></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="initWrappers sc-101yw2y-0 eSuPFB"></div>
+ <div class="js_sticky-top-ad sc-101yw2y-6 jOQyEj">
+ <div class="sc-1jotqfp-0 sc-1jotqfp-2 jZQBpt">
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-TOP_BANNER ad-top-banner" data-ad-unit="TOP_BANNER" data-targeting="{&quot;pos&quot;:&quot;top&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ </div>
+ <div class="sc-157agsr-1 ciLbRL">
+ <div class="js_privacy_policy"></div>
+ <div class="sc-1lmpmkf-1 irMuRt">
+ <header class="sc-1efpnfq-1 dLONoQ">
+ <h1 class="sc-1efpnfq-0 kwUvxw">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Permalink page click - post header&quot;,&quot;standard&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577">The Spectacular Story Of <em>Metroid</em>, One Of Gaming's Richest Universes</a>
+ </h1>
+ </header>
+ </div>
+ </div>
+ <div class="sc-157agsr-0 cjbzCR">
+ <aside class="ynugv2-2 fLwIBi">
+ <div class="sc-101yw2y-4 icfmop">
+ <div class="sc-101yw2y-7 enFBrX">
+ <div class="ynugv2-1 hebJFs">
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-LEFT_TOP ad-left-top" data-ad-unit="LEFT_TOP" data-targeting="{&quot;pos&quot;:&quot;left_top&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ </div>
+ <div id="sidebar_wrapper" class="ynugv2-3 jNiKtz">
+ <div class="js_sidebar_sticky_container sc-1ez0oyg-0 ktESSG">
+ <div class="sc-1ez0oyg-1 etpvfO">
+ <div>
+ <div class="js_sidebar-edit-video ynugv2-0 eFcvZm">
+ <div class="instream-native-video instream-permalink instream-native-video--desktop bxm4mm-0 gtgww"></div>
+ </div>
+ <div id="trending_wrapper" class="ynugv2-0 gVWJry">
+ <div id="trending-module" class="i2qujp-3 fVlnpj">
+ <header>
+ <h2>
+ <strong>You</strong> may also like
+ </h2>
+ </header>
+ <div class="trending-reel i2qujp-2 cclgoe">
+ <div class="sc-1m3f1n9-0 jIBiCM">
+ <a class="thumbnail active sc-1m3f1n9-1 dXPirX js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position 1&quot;,&quot;https://gizmodo.com/trump-shocked-to-learn-3m-selling-masks-overseas-after-1842658120&quot;,{&quot;metric16&quot;:1}]]" data-index="0" href="https://gizmodo.com/trump-shocked-to-learn-3m-selling-masks-overseas-after-1842658120">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/ecojdjwftxntdhnbgdu0.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/ecojdjwftxntdhnbgdu0.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/ecojdjwftxntdhnbgdu0.jpg 80w" aria-label="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" draggable="auto" data-chomp-id="ecojdjwftxntdhnbgdu0" data-format="jpg" data-alt="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" data-anim-src="" />
+ </div>
+ </div></a><a class="thumbnail sc-1m3f1n9-1 XVppW js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position 2&quot;,&quot;https://gizmodo.com/i-solved-the-andrew-cuomo-nipple-mystery-1842643782&quot;,{&quot;metric16&quot;:1}]]" data-index="1" href="https://gizmodo.com/i-solved-the-andrew-cuomo-nipple-mystery-1842643782">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/m282rxfjd2sdgpvusqco.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/m282rxfjd2sdgpvusqco.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/m282rxfjd2sdgpvusqco.jpg 80w" aria-label="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" draggable="auto" data-chomp-id="m282rxfjd2sdgpvusqco" data-format="jpg" data-alt="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" data-anim-src="" />
+ </div>
+ </div></a><a class="thumbnail sc-1m3f1n9-1 bEUjwS js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position 3&quot;,&quot;https://twocents.lifehacker.com/heres-when-youll-get-your-coronavirus-relief-check-1842652396&quot;,{&quot;metric16&quot;:1}]]" data-index="2" href="https://twocents.lifehacker.com/heres-when-youll-get-your-coronavirus-relief-check-1842652396">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Here's When You'll Get Your Coronavirus Relief Check" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/gpf2pi3edjf1zumpctbg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/gpf2pi3edjf1zumpctbg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/gpf2pi3edjf1zumpctbg.jpg 80w" aria-label="Here's When You'll Get Your Coronavirus Relief Check" draggable="auto" data-chomp-id="gpf2pi3edjf1zumpctbg" data-format="jpg" data-alt="Here's When You'll Get Your Coronavirus Relief Check" data-anim-src="" />
+ </div>
+ </div></a>
+ </div>
+ <div class="progress sc-17xh7h5-0 ldeICr">
+ <div class="sc-17xh7h5-1 eNdIIE">
+ <div class="segment ticking sc-17xh7h5-2 kOFjhT"></div>
+ </div>
+ <div class="sc-17xh7h5-1 eNdIIE">
+ <div class="segment sc-17xh7h5-2 kOFjhT"></div>
+ </div>
+ <div class="sc-17xh7h5-1 eNdIIE">
+ <div class="segment sc-17xh7h5-2 kOFjhT"></div>
+ </div>
+ </div>
+ <div class="i2qujp-0 esIpx">
+ <div class="i2qujp-1 bspgcg">
+ <a class="sc-15qf33u-5 kFeogc js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position main&quot;,&quot;https://gizmodo.com/trump-shocked-to-learn-3m-selling-masks-overseas-after-1842658120&quot;,{&quot;metric16&quot;:1}]]" href="https://gizmodo.com/trump-shocked-to-learn-3m-selling-masks-overseas-after-1842658120">
+ <div class="reel active sc-15qf33u-0 bUDpTX" data-index="0">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/ecojdjwftxntdhnbgdu0.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/ecojdjwftxntdhnbgdu0.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/ecojdjwftxntdhnbgdu0.jpg 80w" aria-label="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" draggable="auto" data-chomp-id="ecojdjwftxntdhnbgdu0" data-format="jpg" data-alt="Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act" data-anim-src="" />
+ </div>
+ </div>
+ <div class="sc-15qf33u-2 sc-15qf33u-4 izUYtn">
+ <strong>Gizmodo</strong>
+ </div>
+ <h4 class="sc-15qf33u-1 dsTWpc">
+ Trump Shocked to Learn 3M Selling Masks Overseas After He Failed to Invoke Defense Production Act
+ </h4>
+ <div>
+ <div class="sc-15qf33u-2 sc-15qf33u-3 cLsyOJ">
+ <strong>Matt Novak</strong>
+ </div><time class="sc-15qf33u-6 ixUPOi">Today 7:30AM</time>
+ </div>
+ </div></a><a class="sc-15qf33u-5 kFeogc js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position main&quot;,&quot;https://gizmodo.com/i-solved-the-andrew-cuomo-nipple-mystery-1842643782&quot;,{&quot;metric16&quot;:1}]]" href="https://gizmodo.com/i-solved-the-andrew-cuomo-nipple-mystery-1842643782">
+ <div class="reel sc-15qf33u-0 fwSvTs" data-index="1">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/m282rxfjd2sdgpvusqco.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/m282rxfjd2sdgpvusqco.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/m282rxfjd2sdgpvusqco.jpg 80w" aria-label="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" draggable="auto" data-chomp-id="m282rxfjd2sdgpvusqco" data-format="jpg" data-alt="I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery" data-anim-src="" />
+ </div>
+ </div>
+ <div class="sc-15qf33u-2 sc-15qf33u-4 izUYtn">
+ <strong>Gizmodo</strong>
+ </div>
+ <h4 class="sc-15qf33u-1 dsTWpc">
+ I Can’t Believe You Fuckers Made Me Solve the Andrew Cuomo Nipple Mystery
+ </h4>
+ <div>
+ <div class="sc-15qf33u-2 sc-15qf33u-3 cLsyOJ">
+ <strong>Hudson Hongo</strong>
+ </div><time class="sc-15qf33u-6 ixUPOi">Yesterday 12:35PM</time>
+ </div>
+ </div></a><a class="sc-15qf33u-5 kFeogc js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Trending module click&quot;,&quot;position main&quot;,&quot;https://twocents.lifehacker.com/heres-when-youll-get-your-coronavirus-relief-check-1842652396&quot;,{&quot;metric16&quot;:1}]]" href="https://twocents.lifehacker.com/heres-when-youll-get-your-coronavirus-relief-check-1842652396">
+ <div class="reel sc-15qf33u-0 gIjPOj" data-index="2">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Here's When You'll Get Your Coronavirus Relief Check" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/gpf2pi3edjf1zumpctbg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/gpf2pi3edjf1zumpctbg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/gpf2pi3edjf1zumpctbg.jpg 80w" aria-label="Here's When You'll Get Your Coronavirus Relief Check" draggable="auto" data-chomp-id="gpf2pi3edjf1zumpctbg" data-format="jpg" data-alt="Here's When You'll Get Your Coronavirus Relief Check" data-anim-src="" />
+ </div>
+ </div>
+ <div class="sc-15qf33u-2 sc-15qf33u-4 izUYtn">
+ <strong>Two Cents</strong>
+ </div>
+ <h4 class="sc-15qf33u-1 dsTWpc">
+ Here's When You'll Get Your Coronavirus Relief Check
+ </h4>
+ <div>
+ <div class="sc-15qf33u-2 sc-15qf33u-3 cLsyOJ">
+ <strong>Lisa Rowan</strong>
+ </div><time class="sc-15qf33u-6 ixUPOi">An hour ago</time>
+ </div>
+ </div></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="ynugv2-0 eFcvZm">
+ <div class="sc-1ez0oyg-0 ehkuKX">
+ <div class="sc-1ez0oyg-1 etpvfO">
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-LEFT_RAIL ad-left-rail" data-ad-unit="LEFT_RAIL" data-targeting="{&quot;pos&quot;:&quot;left&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="ynugv2-0 eFcvZm">
+ <div class="sc-5f1ako-3 iaPcjQ">
+ <h3 class="sc-5f1ako-0 kBeEqh">
+ Popular Deals on The Inventory
+ </h3>
+ <div class="sc-5f1ako-1 gOGycY">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular commerce click&quot;,&quot;position 0&quot;,&quot;https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540&quot;]]" href="https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540?ks=commercerecirc_permalink">
+ <div class="js_lazy-image ejta2c-0 kHCVke">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/fmxkv4w3fn53bgahlsls.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/fmxkv4w3fn53bgahlsls.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/fmxkv4w3fn53bgahlsls.jpg 80w" aria-label="Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More" draggable="auto" data-chomp-id="fmxkv4w3fn53bgahlsls" data-format="jpg" data-alt="Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More" data-anim-src="" />
+ </div>
+ </div></a>
+ <div class="sc-5f1ako-2 wcAhP">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular commerce click&quot;,&quot;position 0&quot;,&quot;https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540&quot;]]" href="https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540?ks=commercerecirc_permalink">
+ <h4 class="sc-759qgu-0 knZcug">
+ Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More
+ </h4></a>
+ </div>
+ </div>
+ <aside class="sc-1auy74q-0 hgqaKZ">
+ <div class="sc-1auy74q-3 brydAF">
+ <a href="https://www.amazon.com/dp/B07TGNFVWV?ascsubtag=1c48de501f23bcab3833c51f4fa330ef6b83bdba&amp;linkCode=ogi&amp;psc=1&amp;smid=A3ODHND3J0WMC8&amp;tag=kinja-20&amp;th=1" data-linktype="[t|mod-title" data-ga="[[&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - price click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;ns:unique&quot;,&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - price click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;Popular commerce click&quot;,&quot;position 1&quot;,&quot;https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105&quot;]]" target="_blank" rel="noopener noreferrer" class="sc-1auy74q-22 fVaIqa"><span>$<!-- -->45</span></a>
+ <div class="sc-1auy74q-7 iyJvbB">
+ <a href="https://www.amazon.com/dp/B07TGNFVWV?ascsubtag=1c48de501f23bcab3833c51f4fa330ef6b83bdba&amp;linkCode=ogi&amp;psc=1&amp;smid=A3ODHND3J0WMC8&amp;tag=kinja-20&amp;th=1" data-linktype="[t|mod-image" data-ga="[[&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - image click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;ns:unique&quot;,&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - image click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;Popular commerce click&quot;,&quot;position 1&quot;,&quot;https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105&quot;]]" target="_blank" rel="noopener noreferrer">
+ <div class="js_lazy-image sc-1auy74q-14 hVwDer">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/ffyphnwprvqfff3cthhn.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/ffyphnwprvqfff3cthhn.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/ffyphnwprvqfff3cthhn.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/ffyphnwprvqfff3cthhn.jpg 800w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_1600/ffyphnwprvqfff3cthhn.jpg 1600w" sizes="180px" draggable="auto" data-chomp-id="ffyphnwprvqfff3cthhn" data-format="jpg" data-anim-src="" />
+ </div>
+ </div></a>
+ </div>
+ <div class="sc-1auy74q-6 yLgPx">
+ <div class="sc-1auy74q-7 eVhsmG">
+ <header class="sc-1auy74q-8 krajXX">
+ <h2>
+ <a href="https://www.amazon.com/dp/B07TGNFVWV?ascsubtag=1c48de501f23bcab3833c51f4fa330ef6b83bdba&amp;linkCode=ogi&amp;psc=1&amp;smid=A3ODHND3J0WMC8&amp;tag=kinja-20&amp;th=1" data-linktype="[t|mod-title" data-ga="[[&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - product title click'&quot;,&quot;,B07TGNFVWV&quot;],[&quot;ns:unique&quot;,&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - product title click'&quot;,&quot;,B07TGNFVWV&quot;],[&quot;Popular commerce click&quot;,&quot;position 1&quot;,&quot;https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105&quot;]]" target="_blank" rel="noopener noreferrer">Xbox Game Pass Ultimate: 3 Month Membership [Digital Code]</a>
+ </h2>
+ </header>
+ <div class="sc-1auy74q-10 bLXZFj">
+ <span class="sc-1auy74q-1 gkWXma">From <span>amazon</span></span>
+ </div>
+ <div class="sc-1auy74q-11 hByOxy">
+ <span class="sc-1auy74q-12 bSrIEu">786 purchased by readers</span><span class="sc-1auy74q-13 fivNdM">G/O Media may get a commission</span>
+ </div>
+ </div>
+ </div>
+ <div class="sc-1auy74q-7 ekphdR">
+ <a href="https://www.amazon.com/dp/B07TGNFVWV?ascsubtag=1c48de501f23bcab3833c51f4fa330ef6b83bdba&amp;linkCode=ogi&amp;psc=1&amp;smid=A3ODHND3J0WMC8&amp;tag=kinja-20&amp;th=1" data-linktype="[t|mod-button" data-ga="[[&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - Add to Cart click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;ns:unique&quot;,&quot;Commerce Inset Clicks&quot;,&quot;Commerce inset - Add to Cart click&quot;,&quot;,B07TGNFVWV&quot;],[&quot;Popular commerce click&quot;,&quot;position 1&quot;,&quot;https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105&quot;]]" target="_blank" rel="noopener noreferrer"><button class="sc-1rvv6e6-3 erWUwi"><label class="sc-1rvv6e6-0 gcDoBX">Buy on Amazon</label></button></a>
+ </div>
+ </div>
+ </aside>
+ </div>
+ </div>
+ <div class="ynugv2-0 eFcvZm">
+ <div class="sc-1ez0oyg-0 ehkuKX">
+ <div class="sc-1ez0oyg-1 etpvfO">
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-LEFT_RAIL ad-left-rail" data-ad-unit="LEFT_RAIL" data-targeting="{&quot;pos&quot;:&quot;left&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <div class="ynugv2-0 eFcvZm">
+ <div class="sc-6l6yqv-6 eagNII">
+ <h4 class="sc-6l6yqv-0 defoG">
+ More from G/O Media
+ </h4>
+ <div class="sc-6l6yqv-3 fWhkEE">
+ <div class="sc-6l6yqv-5 glBtZI">
+ <span class="sc-6l6yqv-4 jyjbTH">Read on</span>
+ <div class="sc-2d8w30-0 rzxbx">
+ <div class="avclub sc-2d8w30-1 iHLoZR">
+ <svg xmlns="http://www.w3.org/2000/svg" width="150" height="59" aria-label="TheAVClub logo" viewbox="0 0 150 59">
+ <path fill="#1C263C" fill-rule="evenodd" d="M83.87 37.92a12.85 12.85 0 0 1-9.28 3.72c-3.62 0-6.7-1.24-9.27-3.72a12.04 12.04 0 0 1-3.84-8.98c0-3.5 1.28-6.5 3.84-8.98a12.86 12.86 0 0 1 9.27-3.72c3.63 0 6.72 1.24 9.28 3.72l-3.55 3.44a7.99 7.99 0 0 0-5.73-2.28c-2.22 0-4.13.76-5.7 2.3a7.42 7.42 0 0 0-2.38 5.52c0 2.16.8 4 2.38 5.53a7.92 7.92 0 0 0 5.71 2.3c2.23 0 4.14-.76 5.73-2.29l3.54 3.44zm20.27 2.66H87.07V16.24h5.07v19.53h12v4.81zm22.4-9.88c0 3.02-1.1 5.6-3.28 7.74a10.91 10.91 0 0 1-7.92 3.2c-3.1 0-5.74-1.07-7.92-3.2a10.42 10.42 0 0 1-3.28-7.74V16.24h5.06V30.7c0 1.65.6 3.06 1.8 4.23a5.97 5.97 0 0 0 4.34 1.76c1.69 0 3.13-.58 4.33-1.76a5.7 5.7 0 0 0 1.8-4.23V16.24h5.07V30.7zm15.19-14.46c2.02 0 3.75.72 5.18 2.15a7.02 7.02 0 0 1 2.15 5.16c0 1.65-.5 3.13-1.49 4.44a7.6 7.6 0 0 1 2.43 5.74c0 2.17-.78 4.03-2.32 5.58a7.54 7.54 0 0 1-5.55 2.33H130.8v-25.4h10.93zm.3 14.82h-5.9v5.29h5.9c.74 0 1.36-.25 1.87-.76a2.63 2.63 0 0 0-.01-3.72 2.5 2.5 0 0 0-1.86-.81zm.26-9.53h-6.16v4.24h6.16c.65 0 1.21-.21 1.68-.63a1.93 1.93 0 0 0 0-2.98 2.43 2.43 0 0 0-1.68-.63zM47.26 5.94a29.5 29.5 0 1 1-35.5 47.12 29.5 29.5 0 1 1 35.5-47.12zM31.93 16.86h-5.58l11.71 24.23 11.47-24.23h-5.35l-6.23 13.5-6.02-13.5zm-10.3 0L9.48 41.09h5.28l1.46-3.17h9.97l1.23 3.17h5.25L21.63 16.86zm.08 11.59l2.53 5.26h-5.27l2.74-5.26z"></path></svg>
+ </div>
+ </div>
+ </div><a class="sc-6l6yqv-2 kUfXGZ js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular stories click&quot;,&quot;Kinja Roundup - position 1&quot;,&quot;https://film.avclub.com/the-50-most-important-american-independent-movies-1842597128&quot;,{&quot;metric17&quot;:1}]]" href="https://film.avclub.com/the-50-most-important-american-independent-movies-1842597128">
+ <h4 class="sc-6l6yqv-1 busDXq sc-759qgu-0 knZcug">
+ The 50 most important American independent movies
+ </h4></a>
+ </div>
+ <div class="sc-6l6yqv-3 fWhkEE">
+ <div class="sc-6l6yqv-5 glBtZI">
+ <span class="sc-6l6yqv-4 jyjbTH">Read on</span>
+ <div class="sc-2d8w30-0 rzxbx">
+ <div class="avclub sc-2d8w30-1 iHLoZR">
+ <svg xmlns="http://www.w3.org/2000/svg" width="150" height="59" aria-label="TheAVClub logo" viewbox="0 0 150 59">
+ <path fill="#1C263C" fill-rule="evenodd" d="M83.87 37.92a12.85 12.85 0 0 1-9.28 3.72c-3.62 0-6.7-1.24-9.27-3.72a12.04 12.04 0 0 1-3.84-8.98c0-3.5 1.28-6.5 3.84-8.98a12.86 12.86 0 0 1 9.27-3.72c3.63 0 6.72 1.24 9.28 3.72l-3.55 3.44a7.99 7.99 0 0 0-5.73-2.28c-2.22 0-4.13.76-5.7 2.3a7.42 7.42 0 0 0-2.38 5.52c0 2.16.8 4 2.38 5.53a7.92 7.92 0 0 0 5.71 2.3c2.23 0 4.14-.76 5.73-2.29l3.54 3.44zm20.27 2.66H87.07V16.24h5.07v19.53h12v4.81zm22.4-9.88c0 3.02-1.1 5.6-3.28 7.74a10.91 10.91 0 0 1-7.92 3.2c-3.1 0-5.74-1.07-7.92-3.2a10.42 10.42 0 0 1-3.28-7.74V16.24h5.06V30.7c0 1.65.6 3.06 1.8 4.23a5.97 5.97 0 0 0 4.34 1.76c1.69 0 3.13-.58 4.33-1.76a5.7 5.7 0 0 0 1.8-4.23V16.24h5.07V30.7zm15.19-14.46c2.02 0 3.75.72 5.18 2.15a7.02 7.02 0 0 1 2.15 5.16c0 1.65-.5 3.13-1.49 4.44a7.6 7.6 0 0 1 2.43 5.74c0 2.17-.78 4.03-2.32 5.58a7.54 7.54 0 0 1-5.55 2.33H130.8v-25.4h10.93zm.3 14.82h-5.9v5.29h5.9c.74 0 1.36-.25 1.87-.76a2.63 2.63 0 0 0-.01-3.72 2.5 2.5 0 0 0-1.86-.81zm.26-9.53h-6.16v4.24h6.16c.65 0 1.21-.21 1.68-.63a1.93 1.93 0 0 0 0-2.98 2.43 2.43 0 0 0-1.68-.63zM47.26 5.94a29.5 29.5 0 1 1-35.5 47.12 29.5 29.5 0 1 1 35.5-47.12zM31.93 16.86h-5.58l11.71 24.23 11.47-24.23h-5.35l-6.23 13.5-6.02-13.5zm-10.3 0L9.48 41.09h5.28l1.46-3.17h9.97l1.23 3.17h5.25L21.63 16.86zm.08 11.59l2.53 5.26h-5.27l2.74-5.26z"></path></svg>
+ </div>
+ </div>
+ </div><a class="sc-6l6yqv-2 kUfXGZ js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular stories click&quot;,&quot;Kinja Roundup - position 2&quot;,&quot;https://news.avclub.com/some-people-went-and-animated-colin-trevorrows-unused-s-1842614111&quot;,{&quot;metric17&quot;:1}]]" href="https://news.avclub.com/some-people-went-and-animated-colin-trevorrows-unused-s-1842614111">
+ <h4 class="sc-6l6yqv-1 busDXq sc-759qgu-0 knZcug">
+ Some people went and animated Colin Trevorrow's unused <i>Star Wars</i> script
+ </h4></a>
+ </div>
+ <div class="sc-6l6yqv-3 fWhkEE">
+ <div class="sc-6l6yqv-5 glBtZI">
+ <span class="sc-6l6yqv-4 jyjbTH">Read on</span>
+ <div class="sc-2d8w30-0 rzxbx">
+ <div class="kotaku sc-2d8w30-1 iHLoZR">
+ <svg xmlns="http://www.w3.org/2000/svg" width="212" height="39" aria-label="Kotaku logo" viewbox="0 0 212 39">
+ <path fill="#FBC000" fill-rule="evenodd" d="M191.72 5.28l1.2 17.98-8.58.16-1-18.37-6.51-.17.94 21.03c.13 3 2.28 5.38 4.77 5.29l12.99-.49c2.3-.09 3.97-2.48 3.75-5.33l-1.5-19.93-6.06-.17zm13.1 1.62c-.2-2.61-1.88-4.8-3.78-4.88l-1.74-.07.64 9.67 5.22.08-.34-4.8zm6.8 0c-.23-2.61-1.9-4.8-3.77-4.87l-1.71-.08.72 9.67 5.14.08-.39-4.8zm-60.2-3l.2 28.27 2.58-.1c2.85-.1 5.1-2.76 5.04-5.92L158.9 4.1l-7.46-.2zm7.83 10.72l8.01.04c2.62.01 3.8 1.18 4.79 3.02l9.66 20.68c-1.07 1.4-7.06.8-9.53-4.74l-5.12-11.27-.45.01-.4.01c-2.76.04-7.05-2.58-6.96-7.74zM143.39 4.23l-12.1-.33c-5.75-.15-7.27 4.83-6.34 8.06l15.81.14-.1 12.1-10.89.2.05-2.14 3.2-.04c5.72-.08 7.1-4.77 6.17-7.94h-.04l.02-.01-11.92-.05c-3.09-.01-5.72 2.61-5.84 5.9l-.04 1.05-.22 6.04c-.13 3.39 2.39 6.06 5.57 5.94l16.55-.63c2.91-.1 5.24-2.8 5.23-5.97l-.05-16.77c-.02-3-2.26-5.47-5.06-5.55zm-39.82 24.5a5.95 5.95 0 0 0 6.33 6.37l3.32-.12 1.08-21.27-9.75-.06-.98 15.08zm13.46-17.03c6.17.05 7.73-5 6.8-8.21l-20.86-.56c-6.64-.18-7.88 5.14-6.96 8.58l21.02.19zM88.76 2.5l-19.43-.54c-7.58-.21-10.1 5.6-9.22 9.38l24.53.23-1.25 14-14.16.27 1.45-12.99-10.9-.07-2.09 16.38c-.5 3.95 2.53 7.07 6.71 6.9l21.57-.8a7.76 7.76 0 0 0 7.31-6.98L94.75 8.9a5.98 5.98 0 0 0-5.99-6.4zm-69.34-.55L12.7 38.02l4.22-.16c4.65-.18 8.92-3.63 9.6-7.67l4.74-27.9-11.84-.34zm11.06 12.68l13.02.05c4.23.02 5.87 1.5 7.02 3.81l8.1 19.65c-2.05 1.8-11.6 1.18-14.3-5.88l-2.96-7.84h-.73l-.63.01c-4.52.06-10.9-3.25-9.52-9.8zM15.7 12.67l1.9-10.51-6.57-.2C1.9 1.7-.63 8.26.12 12.53l15.58.16zm22.73 1.96l16.8-3.68c3.16-1.93 4.51-8.9 2.3-10.95l-16.3 3.95c-2.77 1.5-5.95 5.86-2.8 10.68zm124.62 0l8.93-4.84c3.1-2.63 3.97-6.97 1.32-9.79l-9.64 6.05c-3.44 2.32-2.92 5.76-.61 8.58z"></path></svg>
+ </div>
+ </div>
+ </div><a class="sc-6l6yqv-2 kUfXGZ js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular stories click&quot;,&quot;Kinja Roundup - position 3&quot;,&quot;https://kotaku.com/sources-despite-huge-sales-borderlands-3-developers-a-1842617645&quot;,{&quot;metric17&quot;:1}]]" href="https://kotaku.com/sources-despite-huge-sales-borderlands-3-developers-a-1842617645">
+ <h4 class="sc-6l6yqv-1 busDXq sc-759qgu-0 knZcug">
+ Sources: Despite Huge Sales, <i>Borderlands 3</i> Developers Are Getting Stiffed On Bonuses
+ </h4></a>
+ </div>
+ <div class="sc-6l6yqv-3 fWhkEE">
+ <div class="sc-6l6yqv-5 glBtZI">
+ <span class="sc-6l6yqv-4 jyjbTH">Read on</span>
+ <div class="sc-2d8w30-0 rzxbx">
+ <div class="jalopnik sc-2d8w30-1 iHLoZR">
+ <svg xmlns="http://www.w3.org/2000/svg" width="228" height="33" aria-label="Jalopnik logo" viewbox="0 0 228 33">
+ <path fill="#FF4D00" fill-rule="evenodd" d="M140.98 21.96c-3.23 2.58-8.28 2.8-8.28 2.8a59 59 0 0 1-3.2.08l-.74 7.6h-12.98l3.03-30.75.12-1.4 1.32.01h12.3c.72 0 1.9.03 2.62.06 0 0 4.97.23 7.68 2.8 1.97 1.86 2.95 4.47 2.92 7.78 0 .52-.04 1.05-.09 1.6-.4 4.09-1.99 7.26-4.7 9.42zM78.46 32.43H62.8a16 16 0 0 1-2.58-.26s-2.13-.44-3.27-1.71a6.11 6.11 0 0 1-1.54-4.2v-.2l.17-1.73L57.94.3h12.98L69.1 18.82h10.7l-1.34 13.62zM38.88 16.38l-3.83 16.07H20.27L35.05.32h11.08l8.47 32.13H39.56l-.68-16.07zM9.57 32.36c-.53 0-1.9.07-2.61.07H0L1.36 18.8h7.03c.72 0 1.37-.6 1.44-1.31L11.53.3h12.95l-1.8 18.53c-.08.72-.3 1.88-.48 2.58 0 0-1.45 10.89-12.63 10.95zM228 .31l-13 16.02 9.87 16.11h-30.69L197.33.31H228zm-62.79 32.13l-5.56-9.03-.92 9.03h-12.95L148.93.3h11.4l5.54 9.05.4-3.97.49-5.08h12.95l-3.14 32.14H165.2zM115.9 16.4c-.3 9.11-8.37 16.54-18.02 16.6-9.65.06-17.22-7.29-16.92-16.4C81.26 7.5 89.33.06 98.98 0c9.65-.06 17.22 7.29 16.92 16.4zm63.23 16.02L182.32.28h12.47l-3.19 32.15h-12.47z"></path></svg>
+ </div>
+ </div>
+ </div><a class="sc-6l6yqv-2 kUfXGZ js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Popular stories click&quot;,&quot;Kinja Roundup - position 4&quot;,&quot;https://jalopnik.com/harley-davidson-has-some-neat-new-motorcycles-in-the-wo-1842616655&quot;,{&quot;metric17&quot;:1}]]" href="https://jalopnik.com/harley-davidson-has-some-neat-new-motorcycles-in-the-wo-1842616655">
+ <h4 class="sc-6l6yqv-1 busDXq sc-759qgu-0 knZcug">
+ Harley-Davidson Has Some Neat New Motorcycles In The Works
+ </h4></a>
+ </div>
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-PROMOTION_NATIVE_SIDEBAR ad-promotion-sidebar" data-ad-unit="PROMOTION_NATIVE_SIDEBAR" data-targeting="{&quot;pos&quot;:&quot;promotion_native_sidebar&quot;,&quot;native_style_template&quot;:&quot;sidebar_item_v4&quot;}"></div>
+ </div>
+ <div class="ynugv2-0 eFcvZm">
+ <div id="newsletterPromoModule">
+ <div class="sc-10uan3u-0 esHOJV">
+ <div class="sc-10uan3u-1 cqtDtB">
+ Subscribe To Our Newsletter
+ </div>
+ <div class="sc-10uan3u-2 ktBPdN">
+ <span class="ynl58c-0 gdELAJ"><svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" aria-label="Kotaku avatar" viewbox="0 0 64 64">
+ <g fill="none" fill-rule="evenodd">
+ <path fill="#FBC000" d="M0 0h64v64H0z"></path>
+ <path fill="#FFF" d="M16.8 49.62l3.67-.14c4.05-.15 7.76-3.2 8.35-6.78l4.13-24.65-10.3-.3-5.84 31.87zM43.19 29.1c3.57.02 4.95 1.29 5.93 3.27l6.84 16.84c-1.73 1.54-9.79 1-12.08-5.04l-2.5-6.72h-1.15c-3.8.06-9.2-2.78-8.03-8.4l11 .05zm-22.2-11.38l-5.59-.16c-7.78-.22-9.93 5.3-9.28 8.88l13.26.13 1.6-8.85zm31.55 7.69c2.62-1.66 3.74-7.65 1.9-9.4l-13.51 3.4c-2.3 1.28-4.94 5.01-2.33 9.15l13.94-3.15z"></path>
+ </g></svg></span>Your guide to gaming delivered to your inbox daily.
+ </div><a href="//kotaku.com/newsletter" class="sc-10uan3u-3 lfhhVO"><button class="peggds-1 exbKyM"><label class="peggds-0 bbQHny">Subscribe</label></button></a>
+ </div>
+ <div class="modal"></div>
+ </div>
+ </div>
+ <div class="js_newsletter-container"></div>
+ <div id="leftrail_dynamic_ad_wrapper"></div>
+ </div>
+ </div>
+ </aside>
+ <main class="sc-11qwj9y-0 ldgdGx">
+ <div class="sc-11qwj9y-1 liJCYV">
+ <div class="js_kinja_notification"></div>
+ <script type="application/ld+json">
+ <![CDATA[
+ {"@type":"Article","@context":"http://schema.org","url":"https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577","author":{"@type":"Person","name":"Mama Robotnik"},"headline":"The Spectacular Story Of Metroid, One Of Gaming's Richest Universes","description":"Nothing beats the passion of a true fan writing about something they love. That&#039;s what you&#039;re about to see here: one of the richest, most amazing tributes to a great gaming series that we&#039;ve ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon. ","datePublished":"2013-09-11T10:00:00-04:00","dateModified":"2013-09-13T16:34:46-04:00","mainEntityOfPage":{"@type":"WebPage","url":"https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577"},"image":{"@type":"ImageObject","height":675,"width":1200,"url":"https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_675,pg_1,q_80,w_1200/18zu12g5xzyxojpg.jpg","thumbnail":{"@type":"ImageObject","height":180,"width":320,"url":"https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,pg_1,q_80,w_320/18zu12g5xzyxojpg.jpg"}},"articleBody":"Nothing beats the passion of a true fan writing about something they love. That&#039;s what you&#039;re about to see here: one of the richest, most amazing tributes to a great gaming series that we&#039;ve ever run on Kotaku. Warning #1: this one might make your browser chug, so close your other tabs. Warning #2: This piece might make it hurt a little more than there are no new Metroid games from Nintendo on the horizon. \n\nPlease note that this is the first half of Mama Robotnik&#039;s massive Metroid story. The second half can be found here. The entire post is a greatly-expanded version of a post that Mama Robotnik originally published on the NeoGAF forum before revising and reworking it for Kotaku. Take it away, MR...\n\nNintendo’s Metroid series tells us of a malevolent and vicious universe. It’s a maelstrom in which benevolent races are routinely extinguished, and corrupt empires wage war for ownership of living weapons.\n\nIt’s a place in which xenocide is a commissioned service, and grievances are resolved with planetary apocalypses. Everything is chaotically connected to a dead race of avian prophetic poets fighting a war throughout the cosmos. It’s a dark place to visit.\n\nThere are two purposes to this article: to explore the expansive lore of the Metroid universe – with speculation to fill in the gaps – and to exhibit some extraordinary Metroid-inspired art. All artwork is credited to its original source – follow the links to see further works of these spectacular artists.\n\nNotes on Speculation and Lore\n\nThe games tell us much about this hostile universe, but there are a lot of unresolved story points. In response to these mysteries, the article will provide a healthy amount of speculation. You can consider the piece to be either a makeshift timeline illustrated with fan-artwork, or simply an enthusiastic attempt to reconcile the series continuity into a cohesive whole. The article is informed by the extensive research previously performed by its author. The approach taken regarding speculation is thus: The logical inclusion of probable events that resolve mysteries, while maintaining the themes of the series.\n\nBefore we begin, let’s briefly revisit the five points of essential lore:\n\nMetroids are a genetically-engineered species, created by the Chozo in the prehistory of the games. By the time the first entry begins, Metroid creatures only exist on the planet SR388. At some point long before the games, there was also a Metroid presence on the planet Phaaze.\n\n(Metroid IL Return of Samus, Metroid Prime III: Corruption and Metroid Fusion) \n\nAt least some Chozo possessed a native ability to see into the future.\n\n(Metroid: Zero Mission and Metroid Prime)\n\nThe Chozo discovered the living planet Phaaze with their Elysian Research Outpost. We are not told what transpired immediately after this discovery, but something happened that caused at least one Metroid organism to appear on Phaaze. The planet then loaded this creature – along with pieces Chozo-style powersuit armour, into a Phazon seed and launched it towards a heavily populated Chozo planet. This seed impacted Tallon IV and is contained by the Chozo within an impenetrable shield. The mutated superevolved Metroid creature within – clad in crafted power armour – is trapped in the shield until Samus Aran deactivated it thousands of years later.\n\n(Metroid Prime EU release, Metroid Prime III: Corruption and Metroid Prime Trilogy) \n\nThere are living planets in the Metroid Universe. Phaaze is explicitly referred to as being alive, and could interact with a sentient mind – as shown when a Galactic Federation Aurora Unit is implanted. The planet SR388 could be interpreted as having some form of sentience – it shook with apparent anger when its creatures were killed by Samus Aran, and precisely manipulated its oceans to lure the bounty hunter into hostile situations. (Metroid II: Return of Samus and Metroid Prime III: Corruption). The immediate backstory to the first game in the series is the discovery of the planet SR388. The final event of the final game in the chronology is the final destruction of SR388.\n\n(Metroid, Metroid II: Return of Samus)\n\nReferencing\n\nEach story section includes one or more of the below superscript annotations, to help inform the reader as to where the lore or speculation comes from. A brief key:\n\nWith all that said, let us begin.\n\nPart One: The Wars in Heaven\n\nThe Living Planet\n\n(Artist: 3ihard)\n\nOn an unknown planet in the universe, a race of avian humanoids evolved. The species that will come to be known as the Chozo possessed great strength, agility and intelligence. The species is peaceful, and is driven by a social/religious value that nature is sacred. [M1 / MP]\n\n(Artist: 3ihard)\n\nCertain blessed individuals were born with a unique gift – the vague comprehension of events set to take place in the distant future. Driven by these prophecies, the race advanced quickly and became space faring. With abstract predictions of a hostile universe, the Chozo developed powered armour and armaments to defend themselves. Prepared for whatever hostility awaited them, the Chozo explored the stars. [M1 / MP / MP SP]\n\n(Artist: Elearia)\n\nThe Chozo discovered that – despite their prophets’ visions of a chaotic and warring universe – the cosmos was enjoying a prolonged period of peace and enlightenment. First contact was made with a number of old and wise races, such as the Ylla, the N’kren, the Bryyonians, the Alimbic and the Luminoth. The species shared their cultures and technology, and gently colonised wild worlds such as Aether, Elysia, and Tallon IV. [MP / MPH / MP2 / MP3]\n\n(Artist: Slapshoft)\n\nPeace reigned through the cosmos. The alliance was a great universal renaissance, and lasted for a millennium. [MPH SP / MP2 SP / MP3 SP]\n\n(Artist: 3ihard)\n\nDuring this calm, the Chozo prophets continued to receive increasingly severe visions of chaos. They foresaw a universe consumed by war, horrors evolving on distant worlds, and a great toxicity waiting to be unleashed. As the visions became more precise, the species isolated itself from its allies. The Chozo civilisation became intensely driven to fight this unclear threat. [MP / MP3 SP / M2 SP /MF SP]\n\n(Artist: DanilLovesFood)\n\nThe Chozo needed more potent tools to locate this unseen and distant danger. They expanded their SkyTown colony on the gas giant Elysia and remade it into a vast interstellar observatory powered by the planet’s endless storms. The facility was of such scale that an entire species of artificial life became necessary to maintain it. The Chozo created their first species – the mechanical Elysians. [MP3 / MP3 SP]\n\nProbes were launched across the universe, and the Elysians and Chozo scrutinised the data. The search took generations, while the planet’s tempestuous atmosphere battered SkyTown, weathering the station faster than the Elysians could maintain it. After countless probe launches, a partial transmission received from a decaying and distant satellite set prophecy in motion. [MP3]\n\n(Artist: Mechanical-Hand)\n\nThe data received was terrifying. The blue planet registered as an organism, somehow existing as both mineral and flesh. Impossible radiation pulsed from the surface, which overwhelmed the Chozo satellite and rendered it inert. The location of the planet was immediately lost, and only a broad region of space could be established. [MP3]\n\nWith this find, the Chozo purpose on SkyTown was fulfilled. The race departed the facility, leaving the Elysians to continue their monitoring of the stars. The abandoned race of robots continued to launch satellites to try and rediscover the blue world, hopeful that such a discovery would herald the return of their Chozo creators. The Elysians searched unsuccessfully until Elysia’s endless storms eroded their civilisation into a rusted remnant. [MP3]\n\nThe Chozo reconciled their vague discovery of a blue living planet with their prophecies of toxicity. On this distant world of poison, could creatures have evolved so vicious that they endangered the universe? [MP3 SP]\n\nThe Invasion of Phaaze\n\n(Artist: 3ihard)\n\nFinding the exact location of the deadly planet becomes a priority for the Chozo civilisation. A gargantuan ship was assembled on the holy planet of Tallon IV, and dispatched to the dark corner of the universe where the Elysian satellite had been lost. The greatest Chozo warriors, scientists and prophets commenced a crusade for the hostile world, knowing that they would likely never make it back home. During their long journey, they conceive a name for their target: Phaaze. [MP3 SP]\n\n(Artist: SesakaTH)\n\nGenerations passed, and the Chozo expedition finally located the blue planet. As they approached, they witnessed the living world as it endlessly pulsed with blue and white energies. There was nothing like this place elsewhere in the universe. [MP3 SP]\n\nTheir scans confirmed their worst fears – this atmosphere was a bath of radiation and mutation – and evolution had produced horrors. [MP3 SP]\n\n(Artist: SamusMMX)\n\nFor billions of years, Phaaze had mutated and irradiated life that evolved on its surface. The strongest creatures had survived to thrive in an ecosystem of beautiful poison. It was then that the Chozo understood: They had arrived at the home of the most devastating and deranged creatures in the known universe. [MP3 SP]\n\nIf these monsters were to escape their containment on Phaaze, they would voraciously consume their way through the cosmos. With younger races only centuries away from space travel, the Chozo could not risk them finding this world and releasing its terrors. [MP3 SP]\n\nThe Chozo expedition came to an impasse. The threat of Phaaze’s superpredators had to be neutralised, but severe action against the planet would be sacrilege. The Chozo held life sacred, and refused to destroy the unique living world. [MP3 SP]\n\nA dangerous plan was agreed upon. The expedition ship landed on Phaaze, exposing the crew to tremendous radiation. [MP3 SP]\n\n(Artist: Adoublea)\n\nChozo Warriors in power suits fought the planet’s creatures as they swarmed the ship. The soldiers battled, watching their kin die around them, in a desperate mission to buy time. [MP3 SP]\n\nThe scientists within the ship began to harness the intense radiation around them, to try and engineer an artificial predator that could neutralise the planet’s superpredators. With access to the unique Phazon mutagen that covered the poisonous world, genetic engineering that should have taken decades was done in days. The Chozo engineered the first Metroid. [MP3 SP]\n\n(Artist: Methuselah3000)\n\nThe Metroid creature was unleashed onto the planet, and the radiation caused it to reproduce quickly. The resulting swarm of Metroids began to consume the planet’s monstrosities and established themselves as Phaaze’s apex predator. [MP3 SP]\n\nThe Chozo mission was complete. The worst creatures were being hunted to extinction, and the Metroids were expected to die from starvation soon after. The cost had been enormous – most of the crew had been killed defending the ship, and the survivors were deathly ill from radiation poisoning. The burnt and damaged ship took off for the long journey home, but the crew soon succumbed to the radiation they had endured. The autopilot took the ship of Chozo bodies home. [MP3 SP]\n\n(Artist: 3ihard)\n\nOn Phaaze, the Metroid presence lasted decades as they consumed the planet’s superpredators. The corpses of Chozo warriors were absorbed into the planet, and their battle armour slowly became weathered and scattered. The planet’s slow sentience developed an outrage that seethed under its continents. It had been violated by the Chozo. As the Metroid infestation began to die out, Phaaze developed a very primitive concept of purpose and retribution. [MP3 SP]\n\nPhaaze established a vague awareness of concepts it had absorbed from the brains of the Chozo warrior corpses – and the location of two worlds from the Chozo’s memories. As the planet entered its reproductive cycle, it purposely directed two of its seeds towards the planets Tallon IV and Aether. In the seed sent to the Chozo world, Phaaze included one of the last surviving Metroid creatures and some ruined pieces of Chozo armour, intended as a reminder of the crime Phaaze had endured at their hands. The planet sent its second seed to Aether, as the absorbed memories informed the living planet that its inhabitants were friends of the Chozo, and therefore the enemies of Phaaze. [MP 1 / MP 2 SP / MP3 SP]\n\nThe expedition ship – heavily damaged by radiation and lack of maintenance – was guided back to civilisation by an increasingly erratic auto-pilot. After decades it eventually approached the Chozo world of Zebes, and crash-landed onto its surface. The Chozo civilisation attempted to recover data logs from the wreckage with very limited success – they were able to understand the sacrifice that the heroic crew had made, and confirmed the apparent success of the Metroids in neutralising the creatures on the living planet. The Chozo authorities were unable to establish the location of Phaaze, or recover much in the way of scientific data concerning it. [MP3 SP / SM SP]\n\n(Artist: Methuselah3000)\n\nAs the Tallon IV seed began its centuries of travelling through space, the lone Metroid within absorbed vast amounts of Phazon and radiation. It became self-aware, and grew in size, intelligence and strength. It used the ruined pieces of Chozo armour to construct itself an exoskeleton, and descended into madness. The exoskeleton failed to protect the creature from the endless radiation, and the Metroid became as exotic as Phaaze’s extinct superpredators: An undying tortured genius. [MP / MP2 / MP3 / MP3 SP]\n\nThe creature that would come to be known as Metroid Prime resented Phaaze for imprisoning it in the Leviathan. It resented the Chozo for creating and discarding the Metroids. It decided that it would survive, bring order to the chaotic universe that birthed it, and somehow enslave Phaaze to its will. In its solitude, immortal as a consequence of its mutations, Metroid Prime plotted its revenge against the universe. [MP / MP2 / MP3 / MP3 SP]\n\nThe Dark Planet\n\nWith a clear understanding of the danger of living planets, the Chozo authority commenced a search for similar threats. With far more advanced technology than their ancestors had during the Elysian era, the Chozo were unfortunate enough to find a planet of even greater horrors. [MP 3 SP / M2]\n\n(Artist: PeaceFistArtist)\n\nThe Chozo detected strange readings coming from a world in a desolate part of the galaxy. The planet had been previously considered so obscure and unimportant that it didn’t have a name, merely catalogued with the codename SR388 and left to its obscurity. A detailed analysis picked up some extremely strange observations; though seemingly mineral, the caverns and liquids beneath the surface shifted with metabolic rhythm – as if the whole planet was somehow a living thing. A ship was dispatched, and the strongest Chozo warriors braved the caverns beneath the surface. [M2 / M2 SP]\n\nFew made it back. They told of a cauldron of evil, an environment so hostile and vicious that it had birthed the most terrible things. [M2]\n\n(Artist: LightningArts)\n\nBeneath that planet, evolution had been won by an abomination that could steal the flesh, abilities, memories and strengths of all of its prey. The creature was a fusion of energy and plasma that parasitized on life itself. With no word suitable for the nightmare they had discovered, the Chozo simply called it X. If these X-Parasites somehow gained access to the wider universe, there would be no force that could contain them. [M2]\n\nThe threat had to be dealt with. Remembering the apparent success of the Chozo expedition to Phaaze, a plan was put into action. The Chozo assembled their best and brightest, their strongest and wisest. They carved their way into SR388, and dispatched mechanical creatures to construct secure facilities. Robots and Chozo warriors repressed all instances of the X-Parasite as they found them, but casualties were high. The planet appeared to fight the Chozo at every turn, it drowned the invaders in acid and unleashed ambushes of creatures. The endless swam of X-Parasites gained strength from the corpses around them. [MP3 SP / M2]\n\nDeep in the planet, a glass laboratory was created, its walls highly resistant to SR388’s acid belly. Here, in dangerous proximity to the X-Parasites, the Chozo scientists began their work. [M2]\n\n(Artist: 3ihard)\n\nThe Chozo tried to recreate the plan of their ancestors – the use of Metroids to pacify superpredators too dangerous to exist. Without access to the same planetary radiation and materials the Phaaze expedition had, progress was slow. As the war against the planet was raging around them, the Chozo scientists were able to engineer Metroids, but not a variant strong enough to overcome the X-Parasites. As more and more Chozo died protecting the laboratory, a different approach was needed. [M2 SP]\n\n(Artist: Starshadow76)\n\nThe Chozo succeeded in engineering a Metroid Queen, a colossal creature who would lay Metroid Hatchling eggs. When hatched, these resulting Metroids were strong and durable creatures, and finally potent enough to combat the X menace. The Chozo knew that to completely suppress the parasites, the Metroid presence on SR388 had to be permanent. To ensure that the species would not overfeed on the environment and wipe out its food chains, the scientists hardwired an instinct into the Metroid Queen’s feral mind: Only thirty-nine Metroids were to exist on the planet at any one time. This, it was hoped, would keep their numbers high enough to destroy any X re-emergence, but low enough so that they wouldn’t consume the rest of the life on the planet, and starve to death from lack of food. [M2]\n\nThe scientists assembled a payload of Hatchling Eggs and the surviving Chozo warriors distributed them across the planet. The eggs hatched quickly, and the X-Parasites were immediately overwhelmed by the infant Metroids. The X-Parasites were quickly hunted to near-extinction, with only a few surviving cells entering a state of suspension deep in the planet. [M2 SP / MF]\n\nThe Chozo had won their war, but only just. Most of the warriors and scientists had not survived, and those that were left had to make sure that the X-Parasites had been permanently suppressed. The planet shook with tremors; the earth shifted and acid poured, as if the world was trying to crush the Chozo in their glass laboratory. [M2 SP]\n\nThe X-Parasites did not return, and the Metroid Queen continued to scream as her glass prison shook. The Chozo didn’t realise it, but her despair was being heard. [M2 SP]\n\n(Artist: Hermax669)\n\nSR388 had been violated by the Chozo. Though very different to Phaaze, SR388 had its own vague sense of awareness. It perceived the Chozo as a viral infection, and the dead X-Parasites as part of itself. It understood loss, and shook with ancient rage. [MP3 SP / M2 SP / MF SP]\n\nIt changed itself to change the Metroids. It adopted them to replace the X-Parasites, and quickly killed the weaker breeds. It moved its radioactive minerals closer to their eggs and soon mutated the species. As SR388 had done with X, it did with the Metroids. It made them strong. [M2 SP / MF SP]\n\nAlpha, Gamma, Zeta and Omega Metroids spawned quickly, and responded to the screams of their Queen. With their bulk and strength, they smashed through the glass laboratory and slaughtered their Chozo creators. The Chozo warriors were hunted down and crushed. [M2]\n\nSR388 developed into a new cauldron of hostility. The Metroids served as the apex predator, and the robots of the Chozo decayed into machine madness and prowled the ruins, killing on sight. The Chozo mission to suppress the X-Parasite had been a success, but the planet had gained its revenge. [M2 / M2 SP / MF]\n\nPart Two: The End of the Renaissance\n\nThe Holy World\n\nThe Chozo had devastated two planets for the good of the universe, and sustained many causalities. The superpredators of Phaaze were extinct and the X-Parasites were permanently suppressed. With the crisis over, the race became consumed with a collective sense of guilt over their necessary actions. The Chozo believed the life of the universe to be sacred, and had to reconcile their aggressive actions with their faith. [MP SP / MP3 SP / M2 / MF]\n\nWorse still, their prophets continued to have visions of endless conflict and death. War was coming to the universe, and it seemed that their sins had not saved them. Many began to doubt these visions, and a schism occurred. [MP/ MP3 SP]\n\nThe bulk of the Chozo civilisation retired themselves from galactic affairs, leaving only a few scattered colonies amongst the stars. The race retreated to the holy planet of Tallon IV, to shun their technologies and begin simpler, poetic lives. These Chozo reconnected themselves to the natural world and tried to find a harmony with it. As time went on, the most potent prophets became manic, and tried to warn their fellows of a great poison that was to come. [M1 / MP]\n\nThese visions were met with increasing dismissal, but the day finally came when the prophets were believed. After eons swimming in the stars, Phaaze’s seed entered the Tallon system. [MP / MP3]\n\n(Artist: Hameed)\n\nThe Leviathan crashed down, and rained poison and death unto the world. The impact survivors watched as their sacred nature succumbed to the mutagens leaking from the seed, and barricaded themselves in their temples as the flora and fauna transformed. Phazon spread beneath the surface of the dying planet, and radiation storms battered the surface. [MP]\n\n(Source: Riivka)\n\nThe Chozos’ punishment for their sins, and the fulfilment of Phaaze’s wrath, reached biblical proportions. The Chozo of Tallon IV did not get to rest in peace. Their life energies suffered from Phazon disruption, and upon death they became mad ghosts who screamed forever as they were torn in and out of the material world. In this purgatory, the undead immaterial Chozo murdered anyone they could find. [MP / MP3 SP]\n\nAs their numbers dwindled, the last of the Chozo constructed a great temple above the impact crater. Within this temple, they used what little technology remained to project an energy field around the Leviathan to slow the spread of contagion. As the Chozo civilisation on Tallon IV was extinguished, their dying prophets told of a hero who would one day emerge, to enter the crater and defeat the evil worm within. [MP]\n\n(Source: Havoc-DM)\n\nWithin the Impact Crater, Metroid Prime remained trapped within the Chozo energy field. In its armour constructed from ancient Chozo power suits, it continued its wait to be unleashed on the universe. [MP / MP3 SP]\n\nDark Echoes\n\n(Artist: 3ihard)\n\nOn the planet Aether, an ancient race of mystics known as the Luminoth received the horrifying data coming from Tallon IV. In distant times, the Luminoth and the Chozo had been steadfast allies – until the Chozo retreat ended their ties. Desperate to assist, the Luminoth began to organise a rescue mission. [MP2 / MP2 SP]\n\n(Artist: PugOfDoon)\n\nA dark transmission was received from Tallon IV. The image showed a screaming, ghostly Chozo figure, flickering in and out of the living universe. In its undead madness, it spoke for its kin. It raged that they would kill anyone who would set foot on their world. The planet was pandemonium, a cursed world on which the dead could not die. As the signal faded, the Luminoth realised that there was no one left alive to rescue. [MP SP / MP2 SP]\n\nThe Luminoth were receiving strange readings from the devastated planet. A mutagen was spreading, unlike anything they had ever encountered. They scanned the stars for its source, and made a devastating discovery – a mass of the same mutagen was on a collision course with Aether. Phaaze’s second seed had nearly arrived at its destination. [MP2 SP / MP3 SP]\n\nThe people of Aether turned to their technology to save them. Their planet had no native star of its own, and had been implanted millennia ago with a complex energy network that sustained all life. This system was reverently called the Light of Aether, and harnessed the light of the universe in its mechanism. The Luminoth realised that even with this great power, they could not destroy the Phazon Leviathan. A different approach was needed. [MP2 / MP2 SP]\n\n(Artist: SesaKath)\n\nThe Luminoth used their great Light to engineer a small pocket universe, a dark lifeless echo of existence. The plan was bold: they would use the Light of Aether to surgically open the fabric of reality in the path of the Phazon seed, and allow it to harmlessly enter the pocket universe. If all went well, they would be saved. [MP2 SP]\n\nThe day came, and the Leviathan entered Aether’s atmosphere. The Luminoth commenced their great plan. [MP2 SP]\n\n(Artist: Adriencgd)\n\nPhaaze’s seed was a sum of living materials beyond Luminoth comprehension. It hit the pocket universe with incalculable force, and a tsunami of exotic energy ruptured space and time. The equipment containing the dark reality lost containment within moments, and the Luminoth were helpless as their creation expanded across the entire planet. A wave of dark energy absorbed creatures, structures and land into the dark universe, and what was once a single planet – was now two. [MP2 / MP2 SP]\n\nThe Luminoth surveyed the devastation. The Phazon seed was gone – it had indeed collided with the dark universe. Entire continents, with millions of inhabitants, had vanished with it. [MP2 / MP2 SP\n\n(Artist: AzureParagon)\n\nIn the dark universe, a grotesque world was being born. Previous inhabitants of Aether, having been absorbed when containment of the pocket universe was lost, found themselves twisted by the corrosive new reality around them. Most perished, and their flesh fed the strange carnivorous fungi that glowed sickly colours. Some survivors were mutated by the Phazon slowly spreading beneath the surface, and adapted to survive in the hostility. [MP2 SP]\n\nAether and its echo, the Phazon-infested Dark Aether, existed in synchronicity. As the Luminoth tried to rebuild their planet, it took only decades for cracks to form in the ether separating the two realities. As rips in the universe shattered open, Aether became a battlefield. [MP2]\n\n(Artist: Xxkiragaxx)\n\nA womb of Phazon mutation and dark energies had birthed a cunning and ferocious horde. The Ing erupted through the cracks between the two worlds, and commenced slaughter. They were fought back by the Luminoth, and a war began between the two parallel worlds. The Ing invaded Aether with regularity, and killed, pillaged and destroyed all that they could find. The Luminoth retaliated and crusaded into Dark Aether in their Light Suits, on suicide missions to exterminate the source of the Ing menace. Both sides suffered colossal casualties as the decades went on. [MP2]\n\n(Artist: 3ihard)\n\nThe war was being lost by the Luminoth. The Ing had exterminated most of their race and had stolen too many vital technologies. With the theft of essential energy components from the Light of Aether power network, they had become a defeated people. [MP2]\n\nThe Ing had destroyed all of Aether’s ancient ships, and condemned the Luminoth to no escape from their doomed world. With no other choice, the survivors sealed themselves in an inner sanctum, and entered a state of suspended animation. One custodian, U-Mos, volunteered to be their guardian. As Aether became weaker and weaker, the Luminoth waited for someone to save them. They would wait a very long time. [MP2]\n\nThe Sacrifice of the Alimbics\n\n(Artist: Kihunter)\n\nAs the Chozo and the Luminoth fell, so too did other ancient races. In a distant part of the universe, the Alimbics were a militaristic society that maintained peace in their galactic cluster. Their order was shattered when a murderous entity, originating from someplace beyond the understood universe, plummeted into one of their worlds. The creature emerged from the devastation as a gaseous entity, and assumed an Alimbic-styled body to begin its onslaught. [MPH]\n\nThis alien juggernaut was named Gorea by the Alimbic race, and they soon understood it brought only death. Gorea killed every Alimbic it could find, and destroyed everything in its path. Planet after planet fell to Gorea, and the Alimbics realised the creature would never stop. [MPH]\n\n(Artist: Sesakath)\n\nThe Alimbics performed an act of supreme sacrifice. They combined the mental energies of their entire race to forge a prison for Gorea. The psychic prison held it bound, and it was transplanted into an organic vessel called The Oubliette. The vessel was launched into the void outside of the universe, a course that would keep its indestructible prisoner in exile forever. The systems of the prison ship were tasked to scan the every molecule of the imprisoned Gorea, and devise an Omega weapon that could be used to kill it. [MPH / MPH SP]\n\nThe mental energies expelled in this plan consumed the physical bodies of the entire Alimbic race. They vanished from the universe in an instant. Their sacrifice protected all life in the cosmos from Gorea’s murderous rampage. [MPH]\n\nThe War of Bryyo\n\n(Artist: Sesakath)\n\nAs the old races of the universe died around them, the lizard people of Bryyo faced their own challenges. The Bryyonians were an advanced, space-faring race who had learned much from their Chozo allies. Their society was a deeply polarised one, with tensions eternal between the scientific and religious factions.[MP3]\n\nOver the previous centuries, the scientific agenda had dominated, with space travel proving beneficial and enlightening. As the Chozo, Luminoth and Alimbics faced extinction, the religious Bryyonians believed more than ever that the universe was a hostile place, and became desperate to stop their scientific counterparts. [MP3]\n\nA great war exploded across Bryyo. By its end, the scholars had been wiped out and the survivors of both sides had regressed to a feral existence. The race devolved into animals, wandering around ruins that they no longer understood. Language vanished and strength ruled. Anyone who landed on Bryyo was meat, to be killed and eaten. [MP3]\n\nThe Little Rainy Planet\n\nThe onslaught of vengeances, conquerors, poisons and politics destroyed the old races. The Alimbics had lost their flesh, while the Bryyonians had lost their souls. The Luminoth had retreated into stasis, and the Chozo of Tallon IV had been condemned to a living death. [MP / MPH / MP2 / MP3]\n\n(Artist: Kaiquesilva)\n\nOn a small, rainy planet called Zebes, the last known Chozo colony had watched the stars with impotence. This small settlement of the nearly-extinct avian race witnessed the end of the great universal renaissance, and the slow beginning of a new chapter in galactic history. Gradually, the younger races were launching their first satellites into space. In time, new empires would rise to take the place of the old. [M1 / M1 SP]\n\n(Artist: 3ihard)\n\nZebes prophets’ saw the visions the Chozo had always endured: great wars, spreading poison and death. And suddenly, something bold was foreseen. [M1 SP / MP3 SP]\n\n(Artist: Fddt)\n\nA great hunter, clad in orange, red and green. The Chozo glimpsed a future hero, alone in the darkness beneath worlds, fighting so that good could survive evil. They saw her curing poisoned planets, and ending galactic wars. They saw the universe’s one chance to survive its apocalyptic future. They saw the only one who could defy prophecy. [M1 / MP3 SP]\n\nAnd they saw her wearing Chozo armour. [M1]\n\nPart Three: The New Empires\n\nThe Humans\n\nOn the planet Earth, the human race had finally developed a ship capable of leaving their solar system. A brave crew ventured into the universe to learn whether life existed elsewhere. Their discoveries fundamentally changed the human condition. On planet after planet, they found ruined tombs and cities, guarded by weathered statues of dead races. Most significant of all, they found technology. [M1 SP]\n\nThe humans reverse engineered their salvage, and advanced with pace. Within another century, faster-than-light ships explored the stars, and colonies transformed hostile worlds into homes. Peaceful relations formed between other younger races, and a great Galactic Federation was founded. [M1 SP]\n\nThe Space Pirates\n\nIn a less hospitable region of space, a cabal of battered races joined their forces to survive. On planets where acid rain burned flesh and magma flowed, the alliance expanded into a hardened space empire. They ventured into nearby systems and took what they needed from anyone they could reach. They found the ruins of the old races and ransacked the ancient technologies within. They immersed themselves in science and unlocked the secrets of their finds. Within decades, they had advanced their spread with stronger and faster ships. The creatures enhanced themselves, rewriting their genetics and integrating mechanisms beneath their flesh. They were unique: a cybernetic race of furious murderers with a skill for patient scientific process. As more planets were invaded, their conquered civilisations were conscripted by force. [M1 SP / MP / MP3]\n\nThe inevitable moment came when their Empire reached the borders of the vast Galactic Federation. [M1 SP / MP / MP3]\n\n(Artist: Mr-Corr)\n\nFirst contact was brief and furious. On that day, the warning went out to all the worlds of the Federation: Beware the Space Pirates. Though no state of war was officially declared, the empires attacked each other on sight. The Galactic Federation was large enough to repress any meaningful incursions into their space. [M1 SP / MP SP / MP3 SP / SM SP]\n\nThe Massacre of Two Families\n\nThe Galactic Federation discovered the last Chozo Colony on Zebes. The tired, ancient avians welcomed the humans and shared with them wisdom and knowledge. They offered the Galactic Federation new sciences, and taught them how to make organic computers. The Federation studied the Chozo’s own central processing unit, an engineered brain that mothered over their colony, and left with plans to assemble their own variants. On the nearest habitable planet of K-2L, a colony was established. [M1 / MP3 SP]\n\nOn this world, the human Samus Aran was born. [M1]\n\n(Artist: Methuselah3000)\n\nBarely out of infancy, the young Samus witnessed her family die. A Space Pirate raiding party overwhelmed her colony and murdered everyone she ever knew. By staying silent while surrounded by horror, Samus survived as the Pirates ransacked the settlement and left. [M1]\n\nThe Chozo colony on Zebes received K-2L’s automated distress signal. In an ancient dusty ship, they reached the planet and found Samus to be the only survivor of the massacre. The child was brought to Zebes, and the Chozo deliberated. Should she be returned to her own kind, or allowed to stay? [M1]\n\nAcross the colony, the Prophets experienced a simultaneous moment of clarity. They understood immediately that they had found their prophesised hero. The young girl was their inheritor, and would grow strong. She would learn all she could from them, and take their strongest technologies into the universe. She would be the hero against the oncoming storm. [M1 SP]\n\n(Artist: R3dFiVe)\n\nSamus Aran reached maturity amongst the Chozo. She was trained in the combat arts of the great extinct races. She was infused with Chozo genetic material so she could employ their technologies. She was educated to be a scientist, an explorer, and a tactician. Everything that was good about the Chozo civilisation was allowed to live on in Samus. [M1]\n\n(Artist: Pyra)\n\nSamus became an adult, and the Chozo presented her with their greatest works: a toughened power suit and an agile spacecraft, both more potent than anything their race had ever made. The Chozo leader, decaying and blind, told Samus it was time for her to find her destiny in the universe. Samus Aran departed for the stars, and years pass. [M1 / M1 SP]\n\nAs Samus tried to reconnect with her heritage on Earth, the last Chozo prophets on Zebes received a final vision: The Space Pirates were coming for them. It was time for the last Chozo to be extinguished from the universe. [M1 SP]\n\n(Artist: Phobos-Romulus)\n\nThe Chozo hid their technologies throughout the planet, in places that they were certain Samus would find them. They concealed a second Power Suit within the walls of their holy temple, having foreseen that Samus may require it in the future. They then returned to the surface to await the inevitable. [M1 SP]\n\nThe Space Pirates invaded in force, and murdered Samus Aran’s second family. The Chozo became extinct. [M1 / MP SP]\n\nThe Mother Brain\n\nSpace Pirate scientists arrived shortly after the carnage and focused their attention on the legendary Chozo organic central processing unit. They rewrote its benign programming and injected stimulants into its flesh. They enabled it to form an artificial intelligence obsessed with strategy and conquest. They drove its computational potential towards absolute advancement of the Space Pirate Empire. [M1 SP]\n\n(Artist: Jaagup)\n\nThe results went beyond High Command’s most optimistic projections. The Space Pirates had created a leader, a desperately needed figure to unite their fragmented empire. They had created their Mother Brain. The great Space Pirate generals Ridley and Kraid arrived at Zebes, ready to pay tribute to their new master and to plan for the future. Mother Brain delivered to the Space Pirates knowledge and power. She told them of a world referenced in her oldest Chozo databanks, a planet bathed in a mutagenic poison waiting to be farmed. She instructed High Command to prepare an armada of ships and invade the planet Tallon IV. [M1 / MP SP]\n\nThe order was followed immediately, and the High Command discovered a world deranged by contagion. Beneath its surface, endless pools of Phazon waited to be weaponised, and a great mining operation began. Mother Brain received data from their readings on the planet; even after thousands of years, the source of the Phazon was still contained in the Chozo force field. She scrutinised her records further, and was unable to ascertain any method of breaching the barrier. The Space Pirates could retrieve the Phazon, but were denied access to its source. [MP]\n\nThe Metroids\n\nA perfect storm brewed. As the Space Pirates gained access to the most potent mutagen in the universe, the Galactic Federation made an equally eventful discovery: They found the dark planet SR388. [M1 / M2]\n\n(Artist: Fireborn Form)\n\nA Galactic Federation survey team studied the surface, and soon encountered a gelatinous creature that swam through air. The alien defied gravity and physics as it phased through dense rock with ease. It perceived the survey team, and made a few curious chirps in their direction. It then suddenly changed temperament, aggressively charging to latch itself onto the skull of one of the party. The victim died in agony as the Metroid fed on all the energy within, and could not be removed until its prey had been reduced to a dried husk of collapsing matter. The young Metroid had just killed, in a way that science could not explain. [M1 SP / M2 SP]\n\nWith effort and casualties, the scientists contained a few infant specimens of the Metroid creatures, and left the planet without further incident. [M1]\n\nAs their vessel went back to the stars, SR388 was aware their withdrawal. It harboured a great contempt for the invaders, an endless hate fuelled by the impotence it endured centuries ago when the Chozo had committed their great invasion. The living planet had spent centuries honing the Metroids into perfect killers, and knew the devastation they could cause upon maturity. The planet had intentionally allowed the humans to take a few Metroids away so that the creatures could grow up and kill anyone out amongst the stars who ever thought of returning. SR388 took any opportunity to gain revenge against an outside universe that refused to leave it alone. [M2 SP]\n\nAs the scientists began to broadcast their findings back to the Galactic Federation, Mother Brain intercepted the transmission. She cross-referenced their data with notes buried in the Chozo’s ancient fragmented records. She deduced that the Metroids were a form of genetically engineered predator of incredible power, created by the Chozo for an unknown purpose. Mother Brain ordered High Command to get the creatures to her by any means necessary. [M1 SP]\n\nThe Space Pirates overran the Galactic Federation vessel and stole the Metroid creatures. They divided their prize: some were sent to their nearest Homeworld; others were sent to the Tallon IV outpost; and the most potent were delivered straight to Zebes for the experiments of Mother Brain. [M1 / MP / MP3]\n\nWith the arrival of the first Phazon samples from Tallon IV, the exotic substance allowed the Space Pirates to slowly produce stable cloned Metroids across their breeding sites. [M1 SP / MP SP]\n\nThe Revenge of Samus Aran\n\n(Artist: Ojanpohja)\n\nIn her first mission as a Bounty Hunter, Samus Arran was commissioned by the Galactic Federation to neutralise the stolen Metroids. Through careful investigation, Samus discovered that the Pirates are operating from Zebes – her home. She concluded that the Space Pirates had murdered her second family, as they had done with her first. They have took from her everyone she ever loved, and destroyed her two worlds. [M1]\n\n(Artist: Stuart Hughe)\n\nSamus stormed Zebes and killed everyone in her path. [M1]\n\n(Artist: Immarart)\n\nAs her defences were breached, Mother Brain unleashed the great generals Ridley and Kraid. Both were killled, and, desperate to stop the intruder, Mother Brain released the Metroids. Samus Aran exterminated the creatures, and invaded the inner sanctum. [M1]\n\n(Artist: Twigs)\n\nSamus confronted the malevolent Mother Brain and blasted apart her body. A power overload was caused, and the Tourian facility shook itself apart. Samus evacuated to her ship and tried to leave Zebes, but a Space Pirate battleship in orbit registered her ascent and opened fire. Samus’ gunship plummeted back towards the Zebes and impacted Chozodia, her former home. [M1]\n\nExtremely lucky to be alive, Samus crawled out of the remains of her destroyed power suit, and fled as Space Pirate forces stormed the area. Samus hid, crawled and ran to find sanctuary in the deepest part of the Chozo’s most revered temple. [M1]\n\n(Artist: Eyes5)\n\nSamus found herself surrounded with murals of the dead Chozo, and accepted she was alone in the universe. Overcoming despair, she solved the trials of the Chozodian temple and a concealed power suit was revealed to her. This shining armour was even more potent than the one she had just lost, and was able to integrate the most exotic Chozo technologies. Samus realised the greater meaning of her find; the Chozo had left her gifts for her in places they had foreseen she would traverse. Her adopted family continued to protect her long after their deaths, and she would find their statues cradling survival equipment in the darkest corners of the cosmos. [M1 / MP / MP3 / M2 / SM]\n\n(Artist: Imachinivid)\n\nWith her new armaments, Samus cleansed the Space Pirate presence from Zebes. She came to be known as “The Hunter”, and the Space Pirates learned that they will always be hunted down for what they did to her families. They fled the planet in terror. [M1 / MP / MP2 / MP3]\n\nTallon IV\n\nAs years passed, Samus Aran accepted further missions from the Galactic Federation. The bounty earned funded her personal vendetta against the Space Pirates. She improved her armaments, paid for black market information and stormed their outposts. Samus showed her enemies no mercy, and became the feared nemesis of their entire civilisation. With the income from her Federation services, Samus had soon amassed enough money to buy the most secret information regarding the Space Pirates: the coordinates of their stronghold on an old forgotten planet called Tallon IV. [MP1 SP]\n\nSamus guided her ship into the Tallon system and investigated an orbiting space station. She discovered a failed genetic engineering facility whose Space Pirate crew was murdered when they lost control of their own creations. Samus fought her way through the ferocious beasts scattered within, and discovered a half-insane cyborg recreation of the Space Pirate general Ridley. As the station began to collapse, the biomechanical dragon fled to the world below, and Samus pursued. [MP1]\n\n(Artist: Lightningarts)\n\nSamus lost Ridley in the planet’s stormy atmosphere, and elected to land in a nearby jungle to conceal her presence from the Pirate ground forces. Exploring the surroundings, Samus discovered that the planet was once home to the bulk of the extinct Chozo civilisation. In a great temple Samus studied poetic murals that told of the Phazon comet that had struck their world. The scribblings informed her of a creature trapped deep in the comet that they referred to as “The Worm,” and of the powerful shield they erected to prevent its escape. Samus read their last prophecy; that a hero would traverse fire and ice, jungle and cave, and find twelve sacred keys that would deactivate the barrier and allow passage to the Impact Crater. This saviour from the stars would bring down the ancient shield, and destroy the worm that infected their planet. [MP1]\n\nShe continued her exploration, and battled ferocious flora and fauna. The Hunter came to understand that the Space Pirates had established a complex military installation that descended far below the surface. [MP1]\n\n(Artist: R-Sraven)\n\nSamus hunted the Pirates and accessed their computer logs. The Empire had found quantities of an intensely potent mutagen called Phazon. Laboratories across the outpost experimented with the substance, and in a short space of time they had created prototypes for the next generation of their races: powerful Phazon-fuelled juggernauts. Should these advances continue, Samus knew that the Space Pirates would be able to conquer the Galactic Federation. [MP1]\n\n(Artist: Greenstranger)\n\nIn the most secure laboratory, Samus made a devastating discovery. The Space Pirates had used Phazon to create an army of stable clone Metroids and lost containment. The Metroid creatures were roaming the caverns deep in the planet, reproducing and mutating as the Phazon influenced their physiology. [MP1]\n\n(Artist: Ohimseeinstars)\n\nSamus’ final discovery was the most horrific. The powerful, poisonous Phazon was not a rare material on Tallon IV. Despite the Chozo shield containing the Impact Crater, the substance had spread and consumed the world inside-out. The core of the planet presented the Space Pirates with a vast supply of Phazon, enough to fuel their conquest of the stars. [MP1]\n\nSamus destroyed the mining facilities and laboratories, and reconstructed the twelve parts of the ancient Chozo cipher. She destroyed living weapons such as the Thardus experiment, and annihilated the prototype Omega Pirate. She overcame corrupted Metroids, and banished the tormented Chozo ghosts from the living world. She fought the mad Meta Ridley, and on his demise deactivated the Chozo containment shield. As prophesised, Samus Aran entered the Impact Crater. [MP1]\n\nThe Worm\n\nSamus Aran had opened Metroid Prime’s cage, and had no understanding of what she was about to unleash on the universe. The creature had been imprisoned in a different era, and had spent eons being tortuously transformed by Phazon into an undying mad genius. [MP1]\n\n(Artist: Chrysaetos-Pteron)\n\nSamus and the ancient Metroid battled, and the bounty hunter shattered the creature’s metal armour. By channelling the surrounding Phazon deposits into a supercharged energy beam, Samus was able to devastate Metroid Prime’s gelatinous body. After a tremendous battle, the old creature began to collapse on itself. [MP1]\n\n(Artist: Sabretoontigers)\n\nSeemingly dying, Metroid Prime lashed out, grabbing a layer of material from Samus Aran’s armour. The creature melted into a pool of Phazon particles, and the bounty hunter evacuated the Impact Crater. [MP1]\n\nSamus Aran had seemingly succeeded in her mission. The surviving Space Pirates abandoned their devastated facilities and hastily evacuated the planet. With the defeat of Metroid Prime, the Phazon contagion was slowly stopping its spread. The tormented Chozo spirits that had been bound to the planet were finally able to achieve their rest. Leaving the world to recover from its devastation, Samus Aran headed back to the stars. [MP1 / MP1 SP]\n\nThe Dark Hunter\n\nMetroid Prime’s exposure to millennia of Phazon had given the creature extremely exotic abilities, the most potent being its durability – to recreate itself after nearly any level of destruction. As it had collapsed on itself, the essence of Metroid Prime craved the strength and adaptability present in Samus Aran. In the Talon IV impact crater, Metroid Prime recreated itself as a dark copy of the woman who had defeated it. [MP 1 / MP2 / MP3 SP]\n\n(Artist: Imachinivid)\n\nDark Samus clawed its way out of the Impact Crater. It departed Tallon IV to spread its venom across the stars, and to sow the seeds of a great war. [MP1 / MP2 / MP3]\n\nClick here for the second half of this epic story.\n\nMama Robotnik is a video game historian living somewhere in the British Empire. He specialises in unearthing lost gaming media, but also enjoys a good long essay about his favourite games every now and then. He drinks a lot of tea, and has a horrendously naughty black and white cat called Blossom. If you would like to contact him, he responds to his private messages over at NeoGAF.\n\n","articleSection":"metroid","keywords":["metroid","kotaku longreads","nintendo"],"publisher":{"@type":"Organization","@context":"http://schema.org","name":"Kotaku","url":"https://kotaku.com","logo":{"@type":"ImageObject","width":500,"url":"https://x.kinja-static.com/assets/images/logos/newsletter/kotaku-500px.png"},"sameAs":["https://www.facebook.com/kotaku","https://www.youtube.com/user/KotakuNYC","https://twitter.com/kotaku","https://instagram.com/kotakudotcom"]},"video":[]}
+ ]]>
+ </script>
+ <div class="js_starterpost">
+ <div class="sc-1fofo4n-0 hbcmGw">
+ <div class="sc-83o472-1 yjpVX">
+ <div class="sc-83o472-0 iimSGa">
+ <div class="sc-1jc3ukb-0 ezwLgJ">
+ <div class="sc-1jc3ukb-1 jLgjau">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/18ztxif1rtccljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/18ztxif1rtccljpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_450,q_80,w_800/18ztxif1rtccljpg.jpg 800w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_675,q_80,w_1200/18ztxif1rtccljpg.jpg 1200w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,fl_progressive,g_center,h_900,q_80,w_1600/18ztxif1rtccljpg.jpg 1600w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18ztxif1rtccljpg.jpg 80w" sizes="40px" draggable="auto" data-chomp-id="18ztxif1rtccljpg" data-format="jpg" data-anim-src="" />
+ </div>
+ </div>
+ <div class="sc-1jc3ukb-2 jpbKEQ">
+ <div>
+ Mama Robotnik
+ </div>
+ <div class="sc-1jc3ukb-6 kyKjbV">
+ <time class="uhd9ir-0 lkqtha" datetime="2013-09-11T10:00:00-04:00"><a class="js_meta-time js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Permalink page click - post header&quot;,&quot;standard&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577">9/11/13 10:00AM</a></time>
+ <div class="sc-1jc3ukb-4 grWrOW">
+ •
+ </div>
+ <div class="sc-1jc3ukb-5 bNRtrM">
+ <div class="js_tag-dropdown">
+ <div class="sc-1dvfjie-2 eJinCt">
+ <a class="js_trigger js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink meta&quot;,&quot;Tag click&quot;,&quot;First tag click&quot;]]" href="/tag/metroid">
+ <div class="wvv3zm-1 kzkhwW">
+ <span>Filed to:</span><span class="wvv3zm-2 dNAgCv">metroid</span><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ChevronDown icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M3.87 6.16a.5.5 0 0 0-.74.68l5.5 6c.2.21.54.21.74 0l5.5-6a.5.5 0 1 0-.74-.68L9 11.76l-5.13-5.6z"></path></svg></span>
+ </div></a>
+ <div class="js_dropdown sc-1dvfjie-0 fhmHGL">
+ <div class="sc-1dvfjie-1 hCitnH">
+ <a class="wvv3zm-0 MWIGZ sc-10a86sv-0 fVjjcw js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink meta&quot;,&quot;Tag click&quot;,&quot;Dropdown tag click&quot;]]" title="metroid" href="/tag/metroid">metroid</a><a class="sc-10a86sv-0 fVjjcw js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink meta&quot;,&quot;Tag click&quot;,&quot;Dropdown tag click&quot;]]" title="kotaku longreads" href="/tag/kotaku-longreads">kotaku longreads</a><a class="sc-10a86sv-0 fVjjcw js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink meta&quot;,&quot;Tag click&quot;,&quot;Dropdown tag click&quot;]]" title="nintendo" href="/tag/nintendo">nintendo</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="sc-83o472-0 iimSGa">
+ <div class="sc-15g8630-1 jOqHdi">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink meta&quot;,&quot;Comment count click&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577#replies" rel="nofollow">
+ <div class="sc-15g8630-0 hICZjh">
+ <span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Bubble icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M5.59 12.69c.84.49.73 1.4-.08 2.95l.13-.1c.8-.58 1.84-1.47 1.96-1.65l.16-.23.28.05c.7.12 2.63 0 4.15-.54 2.4-.84 3.85-2.5 3.95-5.28.04-3.28-2.98-6.05-6.64-6.05-3.67 0-6.64 2.72-6.64 6.06 0 2.01.93 3.61 2.72 4.78zm-.46.71A6.33 6.33 0 0 1 2 7.9C2 4.08 5.36 1 9.5 1c4.13 0 7.55 3.14 7.5 6.91-.12 3.15-1.8 5.1-4.52 6.05-1.52.54-3.4.7-4.35.6-.4.41-1.25 1.13-1.98 1.66a5.6 5.6 0 0 1-1.19.72c-.78.26-.96-.38-.6-1.01.88-1.5 1.09-2.27.83-2.5l-.06-.03z"></path></svg></span><span>158</span>
+ </div></a>
+ <div class="sc-15g8630-0 hICZjh">
+ <div class="js_save-badge" data-state="{&quot;postId&quot;:&quot;1284029577&quot;,&quot;postPermalink&quot;:&quot;https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577&quot;,&quot;saveCount&quot;:52,&quot;isBigger&quot;:true}" data-post-id="1284029577" data-post-permalink="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577">
+ <div class="sc-1mn1yww-1 iftYcF">
+ <span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Bookmark icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M4 15.21l4.63-5.05a.5.5 0 0 1 .74 0L14 15.21V2H4v13.21zm5-3.97l-5.13 5.6A.5.5 0 0 1 3 16.5v-15c0-.28.22-.5.5-.5h11c.28 0 .5.22.5.5v15a.5.5 0 0 1-.87.33L9 11.24z"></path></svg></span>
+ <div class="sc-1mn1yww-0 OMwVz">
+ 52
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="sc-83o472-2 foLDPX">
+ <div class="js_share-tools" data-position="top">
+ <div class="sc-17x7c2u-2 gpwIdA">
+ <a href="https://facebook.com/sharer.php?u=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3Dkotaku_facebook" title="Share to Facebook" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Facebook&quot;,&quot;top&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Facebook icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M17 9.05A8.02 8.02 0 0 0 9 1C4.58 1 1 4.6 1 9.05A8.04 8.04 0 0 0 7.75 17v-5.62H5.72V9.05h2.03V7.28c0-2.02 1.2-3.14 3.02-3.14.88 0 1.8.16 1.8.16v1.98h-1.02c-.99 0-1.3.62-1.3 1.26v1.5h2.22l-.36 2.34h-1.86V17A8.04 8.04 0 0 0 17 9.05"></path></svg></span></span></a><a href="https://twitter.com/share?text=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;amp;via=@kotaku&amp;amp;url=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3Dkotaku_twitter" title="Share to Twitter" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Twitter&quot;,&quot;top&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Twitter icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M12.46 1.13c-2.04 0-3.7 1.78-3.7 3.97 0 .31.04.62.1.9a10.26 10.26 0 0 1-7.6-4.15A4.2 4.2 0 0 0 2.4 7.16a3.5 3.5 0 0 1-1.68-.5v.05a3.92 3.92 0 0 0 2.97 3.9 3.45 3.45 0 0 1-1.67.07 3.74 3.74 0 0 0 3.45 2.76A7.08 7.08 0 0 1 0 15.1a9.92 9.92 0 0 0 5.66 1.79c6.8 0 10.5-6.06 10.5-11.32v-.51A7.85 7.85 0 0 0 18 2.99c-.66.32-1.37.53-2.12.63a3.95 3.95 0 0 0 1.62-2.2c-.71.45-1.5.78-2.34.96a3.57 3.57 0 0 0-2.7-1.25"></path></svg></span></span></a><a href="mailto:?subject=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;body=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%253Futm_medium%3Dsharefromsite%2526utm_source%3Dkotaku_email%26utm_campaign=top" title="Share via Email" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Email&quot;,&quot;top&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Mail icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M14.5 3A2.5 2.5 0 0 1 17 5.5v7a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 1 12.5v-7A2.5 2.5 0 0 1 3.5 3h11zM2 5.5v7c0 .83.67 1.5 1.5 1.5h11c.83 0 1.5-.67 1.5-1.5v-7l-.03-.3-6.34 5.67a.5.5 0 0 1-.38.13.5.5 0 0 1-.38-.13l-6.7-6-.02-.02c-.1.2-.15.41-.15.64zM14.5 4h-11c-.24 0-.45.05-.65.14l6.4 5.73 6.19-5.54c-.26-.2-.58-.33-.93-.33z"></path></svg></span></span></a><a href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577" title="Share via Link" data-ga="[[&quot;Share Tools&quot;, &quot;Copy url&quot;,&quot;top&quot;]]" class="js_share-via-link sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Link icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M11.06 7.75a.5.5 0 1 1-.7.7l-.85-.83a1.86 1.86 0 0 0-2.63 0l-4 4a1.86 1.86 0 0 0 0 2.64l1.33 1.33c.72.73 1.91.72 2.64 0l1.8-1.8a.5.5 0 1 1 .7.7l-1.8 1.8a2.87 2.87 0 0 1-4.05 0l-1.33-1.32a2.86 2.86 0 0 1 0-4.05l4-4.01a2.86 2.86 0 0 1 4.05 0l.84.84zm5.17-4.41a2.86 2.86 0 0 1 0 4.05l-4 4.01a2.86 2.86 0 0 1-4.05 0l-.84-.84a.5.5 0 1 1 .7-.71l.85.84c.73.73 1.9.73 2.63 0l4-4c.73-.73.73-1.91 0-2.64l-1.33-1.33a1.87 1.87 0 0 0-2.64 0l-1.8 1.8a.5.5 0 1 1-.7-.7l1.8-1.8a2.87 2.87 0 0 1 4.05 0l1.33 1.32z"></path></svg></span></span></a>
+ </div>
+ </div>
+ <div class="post-tools-wrapper" data-state="{&quot;type&quot;:&quot;permalink&quot;,&quot;postId&quot;:&quot;1284029577&quot;,&quot;authorIds&quot;:[&quot;5831052853253101369&quot;],&quot;sharedToBlogId&quot;:null,&quot;status&quot;:&quot;PUBLISHED&quot;,&quot;postPermalink&quot;:&quot;https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577&quot;,&quot;wordCount&quot;:8302,&quot;isFeatured&quot;:false,&quot;isVideo&quot;:false,&quot;isEmbiggened&quot;:true,&quot;parentId&quot;:null,&quot;parentAuthorId&quot;:null,&quot;defaultBlogId&quot;:&quot;9&quot;,&quot;index&quot;:0,&quot;pageType&quot;:&quot;permalink&quot;,&quot;isDismissed&quot;:false,&quot;isBlocked&quot;:false}" data-post-id="1284029577" data-post-permalink="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577">
+ <div class="sc-1vjnuu8-0 frTClM">
+ <div class="sc-12i6d45-0 jzcQTJ">
+ <div class="sc-12i6d45-1 cWiYXU"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="js_post-content r43lxo-0 blgiqp">
+ <figure class="align--bleed js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 kivedT" data-id="18zu12g5xzyxojpg" data-recommend-id="image://18zu12g5xzyxojpg" data-format="jpg" data-width="970" data-height="546" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:970px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:56.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu12g5xzyxojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zu12g5xzyxojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zu12g5xzyxojpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zu12g5xzyxojpg.jpg 800w" draggable="auto" data-chomp-id="18zu12g5xzyxojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>Nothing beats the passion of a true fan writing about something they love. That's what you're about to see here: one of the richest, most amazing tributes to a great gaming series that we've ever run on</em> Kotaku<em>. <strong>Warning #1:</strong> this one might make your browser chug, so close your other tabs. <strong>Warning #2:</strong> This piece might make it hurt a little more than there are no new</em> Metroid <em>games from Nintendo on the horizon.</em>
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>Please note that this is the first half of Mama Robotnik's massive</em> Metroid <em>story.</em> <span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;Internal link&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108&quot;,{&quot;metric25&quot;:1}]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108"><em>The second half can be found here</em></a></span><em>. The entire post is a greatly-expanded version of</em> <span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://www.neogaf.com/forum/showthread.php?t=649215&quot;,{&quot;metric25&quot;:1}]]" href="http://www.neogaf.com/forum/showthread.php?t=649215" target="_blank" rel="noopener noreferrer"><em>a post</em></a></span> <em>that Mama Robotnik originally published on the NeoGAF forum before revising and reworking it for Kotaku. Take it away, MR...</em>
+ </p>
+ <div id="swappable-mobile-ad-container" class="js_ad-mobile-dynamic swappable-mobile-ad-container js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile js_swappable-mobile-ad" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <div class="instream-native-video instream-permalink instream-native-video--mobile bxm4mm-0 gtgww"></div>
+ <aside class="inset--story branded-item branded-item--kotaku sc-1rh3ayr-5 kIoxhb" data-commerce-source="inset">
+ <a class="inset--story__thumb sc-1rh3ayr-2 dIJDts js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Permalink page click - inset photo&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108" rel="noopener noreferrer" target="_blank">
+ <div class="js_lazy-image sc-1rh3ayr-1 iNvMiS">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_180,q_80,w_320/18zu0xoi51q3ajpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_264,q_80,w_470/18zu0xoi51q3ajpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_450,q_80,w_800/18zu0xoi51q3ajpg.jpg 800w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_675,q_80,w_1200/18zu0xoi51q3ajpg.jpg 1200w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,fl_progressive,g_center,h_900,q_80,w_1600/18zu0xoi51q3ajpg.jpg 1600w, https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zu0xoi51q3ajpg.jpg 80w" sizes="(max-width: 480px) 200px, 260px" draggable="auto" data-chomp-id="18zu0xoi51q3ajpg" data-format="jpg" data-anim-src="" />
+ </div>
+ </div><span class="ynl58c-0 fcMbEd"><svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" aria-label="Kotaku avatar" viewbox="0 0 64 64">
+ <g fill="none" fill-rule="evenodd">
+ <path fill="#FBC000" d="M0 0h64v64H0z"></path>
+ <path fill="#FFF" d="M16.8 49.62l3.67-.14c4.05-.15 7.76-3.2 8.35-6.78l4.13-24.65-10.3-.3-5.84 31.87zM43.19 29.1c3.57.02 4.95 1.29 5.93 3.27l6.84 16.84c-1.73 1.54-9.79 1-12.08-5.04l-2.5-6.72h-1.15c-3.8.06-9.2-2.78-8.03-8.4l11 .05zm-22.2-11.38l-5.59-.16c-7.78-.22-9.93 5.3-9.28 8.88l13.26.13 1.6-8.85zm31.55 7.69c2.62-1.66 3.74-7.65 1.9-9.4l-13.51 3.4c-2.3 1.28-4.94 5.01-2.33 9.15l13.94-3.15z"></path>
+ </g></svg></span></a>
+ <div class="sc-1rh3ayr-6 gCydvg">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Permalink page click - inset headline&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108" rel="noopener noreferrer" target="_blank">
+ <h6 class="sc-1rh3ayr-3 cysjdd">
+ The Spectacular Story Of <em>Metroid</em>, Part 2
+ </h6></a>
+ <p class="sc-1rh3ayr-4 flvRyU">
+ This article is a continuation of Mama Robotnik's epic telling of the story of Nintendo's Metroid…
+ </p><a class="js_readmore inset--story__readmore sc-1rh3ayr-0 cKkWUs js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Permalink page click - inset read more link&quot;]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108" rel="noopener noreferrer" target="_blank">Read more</a>
+ </div>
+ </aside>
+ <p class="sc-77igqf-0 hJpRRP">
+ Nintendo’s <em>Metroid</em> series tells us of a malevolent and vicious universe. It’s a maelstrom in which benevolent races are routinely extinguished, and corrupt empires wage war for ownership of living weapons.
+ </p>
+ <div class="bxm4mm-11 ciBKcm">
+ <aside class="y7n5nk-0 etfWWT">
+ <div class="sc-1auy74q-3 y7n5nk-3 iHzJmW">
+ <div class="y7n5nk-1 jdIVZt">
+ <div class="js_lazy-image y7n5nk-4 kvyumD">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/fmxkv4w3fn53bgahlsls.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/fmxkv4w3fn53bgahlsls.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/fmxkv4w3fn53bgahlsls.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/fmxkv4w3fn53bgahlsls.jpg 800w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_1600/fmxkv4w3fn53bgahlsls.jpg 1600w" sizes="320px" draggable="auto" data-chomp-id="fmxkv4w3fn53bgahlsls" data-format="jpg" data-anim-src="" />
+ </div>
+ </div>
+ <div class="y7n5nk-2 hepDvs">
+ <div class="sc-1auy74q-6 yLgPx">
+ <header class="sc-1auy74q-8 sc-1auy74q-9 hHYFwB">
+ <h2>
+ Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam...
+ </h2>
+ </header>
+ </div>
+ <div class="sc-1auy74q-11 hByOxy">
+ <span class="sc-1auy74q-19 djmGRD"><a href="https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540" data-ga="[[&quot;Mobile Commerce Inset Post Clicks&quot;,&quot;Mobile commerce inset - post click&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577&quot;],[&quot;ns:unique&quot;,&quot;Mobile Commerce Inset Post Clicks&quot;,&quot;Mobile commerce inset - post click&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577&quot;]]">Read on The Inventory</a></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </aside>
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-OUTSTREAM_PASSBACK ad-teads-outstream teads-wrapper" data-ad-unit="OUTSTREAM_PASSBACK" data-targeting="{&quot;pos&quot;:&quot;outstream_passback&quot;}"></div>
+ <p class="sc-77igqf-0 hJpRRP">
+ It’s a place in which xenocide is a commissioned service, and grievances are resolved with planetary apocalypses. Everything is chaotically connected to a dead race of avian prophetic poets fighting a war throughout the cosmos. It’s a dark place to visit.
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ There are two purposes to this article: to explore the expansive lore of the <em>Metroid</em> universe – with speculation to fill in the gaps – and to exhibit some extraordinary <em>Metroid</em>-inspired art. All artwork is credited to its original source – follow the links to see further works of these spectacular artists.
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3288">
+ <a class="js_header-anchor" id=""></a>Notes on Speculation and Lore
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ The games tell us much about this hostile universe, but there are a lot of unresolved story points. In response to these mysteries, the article will provide a healthy amount of speculation. You can consider the piece to be either a makeshift timeline illustrated with fan-artwork, or simply an enthusiastic attempt to reconcile the series continuity into a cohesive whole. The article is informed by the extensive research previously performed by its author. The approach taken regarding speculation is thus: The logical inclusion of probable events that resolve mysteries, while maintaining the themes of the series.
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Before we begin, let’s briefly revisit the five points of essential lore:
+ </p>
+ <ul data-type="List" data-style="Bullet" class="sc-1lmbno3-0 eXGUJG">
+ <li>Metroids are a genetically-engineered species, created by the Chozo in the prehistory of the games. By the time the first entry begins, Metroid creatures only exist on the planet SR388. At some point long before the games, there was also a Metroid presence on the planet Phaaze.
+ </li>
+ </ul>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>(Metroid IL Return of Samus, Metroid Prime III: Corruption and Metroid Fusion)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet" class="sc-1lmbno3-0 eXGUJG">
+ <li>At least some Chozo possessed a native ability to see into the future.
+ </li>
+ </ul>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>(Metroid: Zero Mission and Metroid Prime)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet" class="sc-1lmbno3-0 eXGUJG">
+ <li>The Chozo discovered the living planet Phaaze with their Elysian Research Outpost. We are not told what transpired immediately after this discovery, but something happened that caused at least one Metroid organism to appear on Phaaze. The planet then loaded this creature – along with pieces Chozo-style powersuit armour, into a Phazon seed and launched it towards a heavily populated Chozo planet. This seed impacted Tallon IV and is contained by the Chozo within an impenetrable shield. The mutated superevolved Metroid creature within – clad in crafted power armour – is trapped in the shield until Samus Aran deactivated it thousands of years later.
+ </li>
+ </ul>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>(Metroid Prime EU release, Metroid Prime III: Corruption and Metroid Prime Trilogy)</em>
+ </p>
+ <ul data-type="List" data-style="Bullet" class="sc-1lmbno3-0 eXGUJG">
+ <li>There are living planets in the <em>Metroid</em> Universe. Phaaze is explicitly referred to as being alive, and could interact with a sentient mind – as shown when a Galactic Federation Aurora Unit is implanted. The planet SR388 could be interpreted as having some form of sentience – it shook with apparent anger when its creatures were killed by Samus Aran, and precisely manipulated its oceans to lure the bounty hunter into hostile situations. (Metroid II: Return of Samus and Metroid Prime III: Corruption). The immediate backstory to the first game in the series is the discovery of the planet SR388. The final event of the final game in the chronology is the final destruction of SR388.
+ </li>
+ </ul>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>(Metroid, Metroid II: Return of Samus)</em>
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3289">
+ <a class="js_header-anchor" id=""></a>Referencing
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ Each story section includes one or more of the below superscript annotations, to help inform the reader as to where the lore or speculation comes from. A brief key:
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqfwc3l0k28gif" data-recommend-id="image://18zqfwc3l0k28gif" data-format="gif" data-width="640" data-height="128" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 dXbcSW" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:20%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <video poster="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-webmsrc="https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqfwc3l0k28gif.webm" data-mp4src="https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqfwc3l0k28gif.mp4" data-postersrc="https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqfwc3l0k28gif.jpg" loop="" autoplay="" muted="" playsinline="" data-chomp-id="18zqfwc3l0k28gif" data-format="gif" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqfwc3l0k28gif.jpg"></video>
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ With all that said, let us begin.
+ </p>
+ <h2 class="sc-1bwb26k-1 RjwRf" id="h3290">
+ <a class="js_header-anchor" id=""></a>Part One: The Wars in Heaven
+ </h2>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3291">
+ <a class="js_header-anchor" id=""></a>The Living Planet
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqg21aub0sljpg" data-recommend-id="image://18zqg21aub0sljpg" data-format="jpg" data-width="640" data-height="488" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:76.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg21aub0sljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg21aub0sljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg21aub0sljpg.jpg 470w" draggable="auto" data-chomp-id="18zqg21aub0sljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ <em>(</em><span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-dramatic-97410107&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-dramatic-97410107" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span><em>)</em>
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ On an unknown planet in the universe, a race of avian humanoids evolved. The species that will come to be known as the Chozo possessed great strength, agility and intelligence. The species is peaceful, and is driven by a social/religious value that nature is sacred. [M1 / MP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqg86aaay9kjpg" data-recommend-id="image://18zqg86aaay9kjpg" data-format="jpg" data-width="640" data-height="575" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:89.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqg86aaay9kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqg86aaay9kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqg86aaay9kjpg.jpg 470w" draggable="auto" data-chomp-id="18zqg86aaay9kjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-Goddess-121103720&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-Goddess-121103720" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Certain blessed individuals were born with a unique gift – the vague comprehension of events set to take place in the distant future. Driven by these prophecies, the race advanced quickly and became space faring. With abstract predictions of a hostile universe, the Chozo developed powered armour and armaments to defend themselves. Prepared for whatever hostility awaited them, the Chozo explored the stars. [M1 / MP / MP SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgmn6fovtyjpg" data-recommend-id="image://18zqgmn6fovtyjpg" data-format="jpg" data-width="640" data-height="409" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:63.9%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgmn6fovtyjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgmn6fovtyjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgmn6fovtyjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgmn6fovtyjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<em>Artist: Elearia</em>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo discovered that – despite their prophets’ visions of a chaotic and warring universe – the cosmos was enjoying a prolonged period of peace and enlightenment. First contact was made with a number of old and wise races, such as the Ylla, the N’kren, the Bryyonians, the Alimbic and the Luminoth. The species shared their cultures and technology, and gently colonised wild worlds such as Aether, Elysia, and Tallon IV. [MP / MPH / MP2 / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgp7wzq6v9jpg" data-recommend-id="image://18zqgp7wzq6v9jpg" data-format="jpg" data-width="640" data-height="503" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:78.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgp7wzq6v9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgp7wzq6v9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgp7wzq6v9jpg.jpg 470w" draggable="auto" data-chomp-id="18zqgp7wzq6v9jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://slapshoft.deviantart.com/art/quot-Past-is-Prologue-quot-259977883&quot;,{&quot;metric25&quot;:1}]]" href="http://slapshoft.deviantart.com/art/quot-Past-is-Prologue-quot-259977883" target="_blank" rel="noopener noreferrer"><em>Artist: Slapshoft</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Peace reigned through the cosmos. The alliance was a great universal renaissance, and lasted for a millennium. [MPH SP / MP2 SP / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgqj9kac9hjpg" data-recommend-id="image://18zqgqj9kac9hjpg" data-format="jpg" data-width="640" data-height="426" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:66.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgqj9kac9hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgqj9kac9hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgqj9kac9hjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgqj9kac9hjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Oracle-of-Chozo-164523580&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Oracle-of-Chozo-164523580" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ During this calm, the Chozo prophets continued to receive increasingly severe visions of chaos. They foresaw a universe consumed by war, horrors evolving on distant worlds, and a great toxicity waiting to be unleashed. As the visions became more precise, the species isolated itself from its allies. The Chozo civilisation became intensely driven to fight this unclear threat. [MP / MP3 SP / M2 SP /MF SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgrykgsndujpg" data-recommend-id="image://18zqgrykgsndujpg" data-format="jpg" data-width="640" data-height="273" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:42.7%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgrykgsndujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgrykgsndujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgrykgsndujpg.jpg 470w" draggable="auto" data-chomp-id="18zqgrykgsndujpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://danillovesfood.deviantart.com/art/Commission-Metroid-Prime-Skytown-Elysia-336095763&quot;,{&quot;metric25&quot;:1}]]" href="http://danillovesfood.deviantart.com/art/Commission-Metroid-Prime-Skytown-Elysia-336095763" target="_blank" rel="noopener noreferrer"><em>Artist: DanilLovesFood</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo needed more potent tools to locate this unseen and distant danger. They expanded their SkyTown colony on the gas giant Elysia and remade it into a vast interstellar observatory powered by the planet’s endless storms. The facility was of such scale that an entire species of artificial life became necessary to maintain it. The Chozo created their first species – the mechanical Elysians. [MP3 / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Probes were launched across the universe, and the Elysians and Chozo scrutinised the data. The search took generations, while the planet’s tempestuous atmosphere battered SkyTown, weathering the station faster than the Elysians could maintain it. After countless probe launches, a partial transmission received from a decaying and distant satellite set prophecy in motion. [MP3]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgtjse9p7rjpg" data-recommend-id="image://18zqgtjse9p7rjpg" data-format="jpg" data-width="640" data-height="375" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:58.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgtjse9p7rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgtjse9p7rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgtjse9p7rjpg.jpg 470w" draggable="auto" data-chomp-id="18zqgtjse9p7rjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://mechanical-hand.deviantart.com/art/Phaaze-138141037&quot;,{&quot;metric25&quot;:1}]]" href="http://mechanical-hand.deviantart.com/art/Phaaze-138141037" target="_blank" rel="noopener noreferrer"><em>Artist: Mechanical-Hand</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The data received was terrifying. The blue planet registered as an organism, somehow existing as both mineral and flesh. Impossible radiation pulsed from the surface, which overwhelmed the Chozo satellite and rendered it inert. The location of the planet was immediately lost, and only a broad region of space could be established. [MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ With this find, the Chozo purpose on SkyTown was fulfilled. The race departed the facility, leaving the Elysians to continue their monitoring of the stars. The abandoned race of robots continued to launch satellites to try and rediscover the blue world, hopeful that such a discovery would herald the return of their Chozo creators. The Elysians searched unsuccessfully until Elysia’s endless storms eroded their civilisation into a rusted remnant. [MP3]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo reconciled their vague discovery of a blue living planet with their prophecies of toxicity. On this distant world of poison, could creatures have evolved so vicious that they endangered the universe? [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3292">
+ <a class="js_header-anchor" id=""></a>The Invasion of Phaaze
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqgy9h1t7injpg" data-recommend-id="image://18zqgy9h1t7injpg" data-format="jpg" data-width="640" data-height="399" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:62.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqgy9h1t7injpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqgy9h1t7injpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqgy9h1t7injpg.jpg 470w" draggable="auto" data-chomp-id="18zqgy9h1t7injpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-flighter-175094535&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-flighter-175094535" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Finding the exact location of the deadly planet becomes a priority for the Chozo civilisation. A gargantuan ship was assembled on the holy planet of Tallon IV, and dispatched to the dark corner of the universe where the Elysian satellite had been lost. The greatest Chozo warriors, scientists and prophets commenced a crusade for the hostile world, knowing that they would likely never make it back home. During their long journey, they conceive a name for their target: Phaaze. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhapd1bv1hjpg" data-recommend-id="image://18zqhapd1bv1hjpg" data-format="jpg" data-width="640" data-height="450" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:70.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhapd1bv1hjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhapd1bv1hjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhapd1bv1hjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhapd1bv1hjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/MP-C-Phaaze-89786422&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/MP-C-Phaaze-89786422" target="_blank" rel="noopener noreferrer"><em>Artist: SesakaTH</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Generations passed, and the Chozo expedition finally located the blue planet. As they approached, they witnessed the living world as it endlessly pulsed with blue and white energies. There was nothing like this place elsewhere in the universe. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Their scans confirmed their worst fears – this atmosphere was a bath of radiation and mutation – and evolution had produced horrors. [MP3 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhdvss5le8jpg" data-recommend-id="image://18zqhdvss5le8jpg" data-format="jpg" data-width="640" data-height="621" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:97%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhdvss5le8jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhdvss5le8jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhdvss5le8jpg.jpg 470w" draggable="auto" data-chomp-id="18zqhdvss5le8jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://samusmmx.deviantart.com/art/Phazon-Worm-252806281&quot;,{&quot;metric25&quot;:1}]]" href="http://samusmmx.deviantart.com/art/Phazon-Worm-252806281" target="_blank" rel="noopener noreferrer"><em>Artist: SamusMMX</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ For billions of years, Phaaze had mutated and irradiated life that evolved on its surface. The strongest creatures had survived to thrive in an ecosystem of beautiful poison. It was then that the Chozo understood: They had arrived at the home of the most devastating and deranged creatures in the known universe. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ If these monsters were to escape their containment on Phaaze, they would voraciously consume their way through the cosmos. With younger races only centuries away from space travel, the Chozo could not risk them finding this world and releasing its terrors. [MP3 SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo expedition came to an impasse. The threat of Phaaze’s superpredators had to be neutralised, but severe action against the planet would be sacrilege. The Chozo held life sacred, and refused to destroy the unique living world. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ A dangerous plan was agreed upon. The expedition ship landed on Phaaze, exposing the crew to tremendous radiation. [MP3 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhfmxw5dphjpg" data-recommend-id="image://18zqhfmxw5dphjpg" data-format="jpg" data-width="640" data-height="532" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:83.1%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhfmxw5dphjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhfmxw5dphjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhfmxw5dphjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhfmxw5dphjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://adoublea.deviantart.com/art/Metroid-Chozo-warrior-138820343&quot;,{&quot;metric25&quot;:1}]]" href="http://adoublea.deviantart.com/art/Metroid-Chozo-warrior-138820343" target="_blank" rel="noopener noreferrer"><em>Artist: Adoublea</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Chozo Warriors in power suits fought the planet’s creatures as they swarmed the ship. The soldiers battled, watching their kin die around them, in a desperate mission to buy time. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The scientists within the ship began to harness the intense radiation around them, to try and engineer an artificial predator that could neutralise the planet’s superpredators. With access to the unique Phazon mutagen that covered the poisonous world, genetic engineering that should have taken decades was done in days. The Chozo engineered the first Metroid. [MP3 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhh28q856sjpg" data-recommend-id="image://18zqhh28q856sjpg" data-format="jpg" data-width="640" data-height="598" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:93.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhh28q856sjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhh28q856sjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhh28q856sjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhh28q856sjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/Chozo-Creator-278707002&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/Chozo-Creator-278707002" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Metroid creature was unleashed onto the planet, and the radiation caused it to reproduce quickly. The resulting swarm of Metroids began to consume the planet’s monstrosities and established themselves as Phaaze’s apex predator. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo mission was complete. The worst creatures were being hunted to extinction, and the Metroids were expected to die from starvation soon after. The cost had been enormous – most of the crew had been killed defending the ship, and the survivors were deathly ill from radiation poisoning. The burnt and damaged ship took off for the long journey home, but the crew soon succumbed to the radiation they had endured. The autopilot took the ship of Chozo bodies home. [MP3 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhipfm1vidjpg" data-recommend-id="image://18zqhipfm1vidjpg" data-format="jpg" data-width="640" data-height="381" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:59.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhipfm1vidjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhipfm1vidjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhipfm1vidjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhipfm1vidjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Phazon-Mines-178697159&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Phazon-Mines-178697159" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ On Phaaze, the Metroid presence lasted decades as they consumed the planet’s superpredators. The corpses of Chozo warriors were absorbed into the planet, and their battle armour slowly became weathered and scattered. The planet’s slow sentience developed an outrage that seethed under its continents. It had been violated by the Chozo. As the Metroid infestation began to die out, Phaaze developed a very primitive concept of purpose and retribution. [MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Phaaze established a vague awareness of concepts it had absorbed from the brains of the Chozo warrior corpses – and the location of two worlds from the Chozo’s memories. As the planet entered its reproductive cycle, it purposely directed two of its seeds towards the planets Tallon IV and Aether. In the seed sent to the Chozo world, Phaaze included one of the last surviving Metroid creatures and some ruined pieces of Chozo armour, intended as a reminder of the crime Phaaze had endured at their hands. The planet sent its second seed to Aether, as the absorbed memories informed the living planet that its inhabitants were friends of the Chozo, and therefore the enemies of Phaaze. [MP 1 / MP 2 SP / MP3 SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The expedition ship – heavily damaged by radiation and lack of maintenance – was guided back to civilisation by an increasingly erratic auto-pilot. After decades it eventually approached the Chozo world of Zebes, and crash-landed onto its surface. The Chozo civilisation attempted to recover data logs from the wreckage with very limited success – they were able to understand the sacrifice that the heroic crew had made, and confirmed the apparent success of the Metroids in neutralising the creatures on the living planet. The Chozo authorities were unable to establish the location of Phaaze, or recover much in the way of scientific data concerning it. [MP3 SP / SM SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhkgkmizwijpg" data-recommend-id="image://18zqhkgkmizwijpg" data-format="jpg" data-width="640" data-height="380" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:59.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhkgkmizwijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhkgkmizwijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhkgkmizwijpg.jpg 470w" draggable="auto" data-chomp-id="18zqhkgkmizwijpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/MDB-Bestiary-Metroid-Prime-338464952&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/MDB-Bestiary-Metroid-Prime-338464952" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ As the Tallon IV seed began its centuries of travelling through space, the lone Metroid within absorbed vast amounts of Phazon and radiation. It became self-aware, and grew in size, intelligence and strength. It used the ruined pieces of Chozo armour to construct itself an exoskeleton, and descended into madness. The exoskeleton failed to protect the creature from the endless radiation, and the Metroid became as exotic as Phaaze’s extinct superpredators: An undying tortured genius. [MP / MP2 / MP3 / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The creature that would come to be known as Metroid Prime resented Phaaze for imprisoning it in the Leviathan. It resented the Chozo for creating and discarding the Metroids. It decided that it would survive, bring order to the chaotic universe that birthed it, and somehow enslave Phaaze to its will. In its solitude, immortal as a consequence of its mutations, Metroid Prime plotted its revenge against the universe. [MP / MP2 / MP3 / MP3 SP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3293">
+ <a class="js_header-anchor" id=""></a>The Dark Planet
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ With a clear understanding of the danger of living planets, the Chozo authority commenced a search for similar threats. With far more advanced technology than their ancestors had during the Elysian era, the Chozo were unfortunate enough to find a planet of even greater horrors. [MP 3 SP / M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhnuwesum0jpg" data-recommend-id="image://18zqhnuwesum0jpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:75%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhnuwesum0jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhnuwesum0jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhnuwesum0jpg.jpg 470w" draggable="auto" data-chomp-id="18zqhnuwesum0jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://peacefistartist.deviantart.com/art/SR388-126083062&quot;,{&quot;metric25&quot;:1}]]" href="http://peacefistartist.deviantart.com/art/SR388-126083062" target="_blank" rel="noopener noreferrer">Artist: PeaceFistArtist</a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo detected strange readings coming from a world in a desolate part of the galaxy. The planet had been previously considered so obscure and unimportant that it didn’t have a name, merely catalogued with the codename SR388 and left to its obscurity. A detailed analysis picked up some extremely strange observations; though seemingly mineral, the caverns and liquids beneath the surface shifted with metabolic rhythm – as if the whole planet was somehow a living thing. A ship was dispatched, and the strongest Chozo warriors braved the caverns beneath the surface. [M2 / M2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Few made it back. They told of a cauldron of evil, an environment so hostile and vicious that it had birthed the most terrible things. [M2]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhokjxzrgmjpg" data-recommend-id="image://18zqhokjxzrgmjpg" data-format="jpg" data-width="640" data-height="355" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:55.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhokjxzrgmjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhokjxzrgmjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhokjxzrgmjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhokjxzrgmjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://lightningarts.deviantart.com/art/Metroid-Metal-Fusion-Sector1-393385160&quot;,{&quot;metric25&quot;:1}]]" href="http://lightningarts.deviantart.com/art/Metroid-Metal-Fusion-Sector1-393385160" target="_blank" rel="noopener noreferrer">Artist: LightningArts</a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Beneath that planet, evolution had been won by an abomination that could steal the flesh, abilities, memories and strengths of all of its prey. The creature was a fusion of energy and plasma that parasitized on life itself. With no word suitable for the nightmare they had discovered, the Chozo simply called it X. If these X-Parasites somehow gained access to the wider universe, there would be no force that could contain them. [M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The threat had to be dealt with. Remembering the apparent success of the Chozo expedition to Phaaze, a plan was put into action. The Chozo assembled their best and brightest, their strongest and wisest. They carved their way into SR388, and dispatched mechanical creatures to construct secure facilities. Robots and Chozo warriors repressed all instances of the X-Parasite as they found them, but casualties were high. The planet appeared to fight the Chozo at every turn, it drowned the invaders in acid and unleashed ambushes of creatures. The endless swam of X-Parasites gained strength from the corpses around them. [MP3 SP / M2]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Deep in the planet, a glass laboratory was created, its walls highly resistant to SR388’s acid belly. Here, in dangerous proximity to the X-Parasites, the Chozo scientists began their work. [M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhrsyn6h9wjpg" data-recommend-id="image://18zqhrsyn6h9wjpg" data-format="jpg" data-width="640" data-height="552" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:86.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhrsyn6h9wjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhrsyn6h9wjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhrsyn6h9wjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhrsyn6h9wjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Chozo-Account-119685313&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Chozo-Account-119685313" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo tried to recreate the plan of their ancestors – the use of Metroids to pacify superpredators too dangerous to exist. Without access to the same planetary radiation and materials the Phaaze expedition had, progress was slow. As the war against the planet was raging around them, the Chozo scientists were able to engineer Metroids, but not a variant strong enough to overcome the X-Parasites. As more and more Chozo died protecting the laboratory, a different approach was needed. [M2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqht0ddb9ozjpg" data-recommend-id="image://18zqht0ddb9ozjpg" data-format="jpg" data-width="640" data-height="396" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:61.9%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqht0ddb9ozjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqht0ddb9ozjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqht0ddb9ozjpg.jpg 470w" draggable="auto" data-chomp-id="18zqht0ddb9ozjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://starshadow76.deviantart.com/art/Metroid-Queen-Concept-Art-157008177&quot;,{&quot;metric25&quot;:1}]]" href="http://starshadow76.deviantart.com/art/Metroid-Queen-Concept-Art-157008177" target="_blank" rel="noopener noreferrer"><em>Artist: Starshadow76</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo succeeded in engineering a Metroid Queen, a colossal creature who would lay Metroid Hatchling eggs. When hatched, these resulting Metroids were strong and durable creatures, and finally potent enough to combat the X menace. The Chozo knew that to completely suppress the parasites, the Metroid presence on SR388 had to be permanent. To ensure that the species would not overfeed on the environment and wipe out its food chains, the scientists hardwired an instinct into the Metroid Queen’s feral mind: Only thirty-nine Metroids were to exist on the planet at any one time. This, it was hoped, would keep their numbers high enough to destroy any X re-emergence, but low enough so that they wouldn’t consume the rest of the life on the planet, and starve to death from lack of food. [M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The scientists assembled a payload of Hatchling Eggs and the surviving Chozo warriors distributed them across the planet. The eggs hatched quickly, and the X-Parasites were immediately overwhelmed by the infant Metroids. The X-Parasites were quickly hunted to near-extinction, with only a few surviving cells entering a state of suspension deep in the planet. [M2 SP / MF]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo had won their war, but only just. Most of the warriors and scientists had not survived, and those that were left had to make sure that the X-Parasites had been permanently suppressed. The planet shook with tremors; the earth shifted and acid poured, as if the world was trying to crush the Chozo in their glass laboratory. [M2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The X-Parasites did not return, and the Metroid Queen continued to scream as her glass prison shook. The Chozo didn’t realise it, but her despair was being heard. [M2 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqhuzegzvcfjpg" data-recommend-id="image://18zqhuzegzvcfjpg" data-format="jpg" data-width="640" data-height="415" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:64.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqhuzegzvcfjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqhuzegzvcfjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqhuzegzvcfjpg.jpg 470w" draggable="auto" data-chomp-id="18zqhuzegzvcfjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://hermax669.deviantart.com/art/Omega-Metroid-93544917&quot;,{&quot;metric25&quot;:1}]]" href="http://hermax669.deviantart.com/art/Omega-Metroid-93544917" target="_blank" rel="noopener noreferrer"><em>Artist: Hermax669</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ SR388 had been violated by the Chozo. Though very different to Phaaze, SR388 had its own vague sense of awareness. It perceived the Chozo as a viral infection, and the dead X-Parasites as part of itself. It understood loss, and shook with ancient rage. [MP3 SP / M2 SP / MF SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ It changed itself to change the Metroids. It adopted them to replace the X-Parasites, and quickly killed the weaker breeds. It moved its radioactive minerals closer to their eggs and soon mutated the species. As SR388 had done with X, it did with the Metroids. It made them strong. [M2 SP / MF SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Alpha, Gamma, Zeta and Omega Metroids spawned quickly, and responded to the screams of their Queen. With their bulk and strength, they smashed through the glass laboratory and slaughtered their Chozo creators. The Chozo warriors were hunted down and crushed. [M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ SR388 developed into a new cauldron of hostility. The Metroids served as the apex predator, and the robots of the Chozo decayed into machine madness and prowled the ruins, killing on sight. The Chozo mission to suppress the X-Parasite had been a success, but the planet had gained its revenge. [M2 / M2 SP / MF]
+ </p>
+ <h2 class="sc-1bwb26k-1 RjwRf" id="h3294">
+ <a class="js_header-anchor" id=""></a>Part Two: The End of the Renaissance
+ </h2>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3295">
+ <a class="js_header-anchor" id=""></a>The Holy World
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo had devastated two planets for the good of the universe, and sustained many causalities. The superpredators of Phaaze were extinct and the X-Parasites were permanently suppressed. With the crisis over, the race became consumed with a collective sense of guilt over their necessary actions. The Chozo believed the life of the universe to be sacred, and had to reconcile their aggressive actions with their faith. [MP SP / MP3 SP / M2 / MF]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Worse still, their prophets continued to have visions of endless conflict and death. War was coming to the universe, and it seemed that their sins had not saved them. Many began to doubt these visions, and a schism occurred. [MP/ MP3 SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The bulk of the Chozo civilisation retired themselves from galactic affairs, leaving only a few scattered colonies amongst the stars. The race retreated to the holy planet of Tallon IV, to shun their technologies and begin simpler, poetic lives. These Chozo reconnected themselves to the natural world and tried to find a harmony with it. As time went on, the most potent prophets became manic, and tried to warn their fellows of a great poison that was to come. [M1 / MP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ These visions were met with increasing dismissal, but the day finally came when the prophets were believed. After eons swimming in the stars, Phaaze’s seed entered the Tallon system. [MP / MP3]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqidecyjp0ujpg" data-recommend-id="image://18zqidecyjp0ujpg" data-format="jpg" data-width="640" data-height="315" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:49.2%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqidecyjp0ujpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqidecyjp0ujpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqidecyjp0ujpg.jpg 470w" draggable="auto" data-chomp-id="18zqidecyjp0ujpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://hameed.deviantart.com/art/Cessation-619497&quot;,{&quot;metric25&quot;:1}]]" href="http://hameed.deviantart.com/art/Cessation-619497" target="_blank" rel="noopener noreferrer"><em>Artist: Hameed</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Leviathan crashed down, and rained poison and death unto the world. The impact survivors watched as their sacred nature succumbed to the mutagens leaking from the seed, and barricaded themselves in their temples as the flora and fauna transformed. Phazon spread beneath the surface of the dying planet, and radiation storms battered the surface. [MP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiejsfe664jpg" data-recommend-id="image://18zqiejsfe664jpg" data-format="jpg" data-width="640" data-height="674" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:105.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiejsfe664jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiejsfe664jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiejsfe664jpg.jpg 470w" draggable="auto" data-chomp-id="18zqiejsfe664jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://riivka.deviantart.com/art/Fading-321733899&quot;,{&quot;metric25&quot;:1}]]" href="http://riivka.deviantart.com/art/Fading-321733899" target="_blank" rel="noopener noreferrer"><em>Source: Riivka</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozos’ punishment for their sins, and the fulfilment of Phaaze’s wrath, reached biblical proportions. The Chozo of Tallon IV did not get to rest in peace. Their life energies suffered from Phazon disruption, and upon death they became mad ghosts who screamed forever as they were torn in and out of the material world. In this purgatory, the undead immaterial Chozo murdered anyone they could find. [MP / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ As their numbers dwindled, the last of the Chozo constructed a great temple above the impact crater. Within this temple, they used what little technology remained to project an energy field around the Leviathan to slow the spread of contagion. As the Chozo civilisation on Tallon IV was extinguished, their dying prophets told of a hero who would one day emerge, to enter the crater and defeat the evil worm within. [MP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqigaxkohx4jpg" data-recommend-id="image://18zqigaxkohx4jpg" data-format="jpg" data-width="640" data-height="405" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:63.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqigaxkohx4jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqigaxkohx4jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqigaxkohx4jpg.jpg 470w" draggable="auto" data-chomp-id="18zqigaxkohx4jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://havoc-dm.deviantart.com/art/Metroid-Prime-74392852&quot;,{&quot;metric25&quot;:1}]]" href="http://havoc-dm.deviantart.com/art/Metroid-Prime-74392852" target="_blank" rel="noopener noreferrer"><em>Source: Havoc-DM</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Within the Impact Crater, Metroid Prime remained trapped within the Chozo energy field. In its armour constructed from ancient Chozo power suits, it continued its wait to be unleashed on the universe. [MP / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3296">
+ <a class="js_header-anchor" id=""></a>Dark Echoes
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiho9ab5xrjpg" data-recommend-id="image://18zqiho9ab5xrjpg" data-format="jpg" data-width="640" data-height="639" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:99.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiho9ab5xrjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiho9ab5xrjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiho9ab5xrjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiho9ab5xrjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/luminoth-priest-191995430&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/luminoth-priest-191995430" target="_blank" rel="noopener noreferrer">Artist: 3ihard</a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ On the planet Aether, an ancient race of mystics known as the Luminoth received the horrifying data coming from Tallon IV. In distant times, the Luminoth and the Chozo had been steadfast allies – until the Chozo retreat ended their ties. Desperate to assist, the Luminoth began to organise a rescue mission. [MP2 / MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqijbga70tljpg" data-recommend-id="image://18zqijbga70tljpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:75%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqijbga70tljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqijbga70tljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqijbga70tljpg.jpg 470w" draggable="auto" data-chomp-id="18zqijbga70tljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://pugofdoom.deviantart.com/art/Chozo-Ghost-88765133&quot;,{&quot;metric25&quot;:1}]]" href="http://pugofdoom.deviantart.com/art/Chozo-Ghost-88765133" target="_blank" rel="noopener noreferrer">Artist: PugOfDoon</a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ A dark transmission was received from Tallon IV. The image showed a screaming, ghostly Chozo figure, flickering in and out of the living universe. In its undead madness, it spoke for its kin. It raged that they would kill anyone who would set foot on their world. The planet was pandemonium, a cursed world on which the dead could not die. As the signal faded, the Luminoth realised that there was no one left alive to rescue. [MP SP / MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Luminoth were receiving strange readings from the devastated planet. A mutagen was spreading, unlike anything they had ever encountered. They scanned the stars for its source, and made a devastating discovery – a mass of the same mutagen was on a collision course with Aether. Phaaze’s second seed had nearly arrived at its destination. [MP2 SP / MP3 SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The people of Aether turned to their technology to save them. Their planet had no native star of its own, and had been implanted millennia ago with a complex energy network that sustained all life. This system was reverently called the Light of Aether, and harnessed the light of the universe in its mechanism. The Luminoth realised that even with this great power, they could not destroy the Phazon Leviathan. A different approach was needed. [MP2 / MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqim04ra2w5jpg" data-recommend-id="image://18zqim04ra2w5jpg" data-format="jpg" data-width="640" data-height="736" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:115%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqim04ra2w5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqim04ra2w5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqim04ra2w5jpg.jpg 470w" draggable="auto" data-chomp-id="18zqim04ra2w5jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/Sanctuary-Fortress-Ing-Hive-72912247&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/Sanctuary-Fortress-Ing-Hive-72912247" target="_blank" rel="noopener noreferrer"><em>Artist: SesaKath</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Luminoth used their great Light to engineer a small pocket universe, a dark lifeless echo of existence. The plan was bold: they would use the Light of Aether to surgically open the fabric of reality in the path of the Phazon seed, and allow it to harmlessly enter the pocket universe. If all went well, they would be saved. [MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The day came, and the Leviathan entered Aether’s atmosphere. The Luminoth commenced their great plan. [MP2 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqimznelg78jpg" data-recommend-id="image://18zqimznelg78jpg" data-format="jpg" data-width="640" data-height="321" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:50.2%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqimznelg78jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqimznelg78jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqimznelg78jpg.jpg 470w" draggable="auto" data-chomp-id="18zqimznelg78jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://adriencgd.deviantart.com/art/Clashing-Neighbors-327277211&quot;,{&quot;metric25&quot;:1}]]" href="http://adriencgd.deviantart.com/art/Clashing-Neighbors-327277211" target="_blank" rel="noopener noreferrer"><em>Artist: Adriencgd</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Phaaze’s seed was a sum of living materials beyond Luminoth comprehension. It hit the pocket universe with incalculable force, and a tsunami of exotic energy ruptured space and time. The equipment containing the dark reality lost containment within moments, and the Luminoth were helpless as their creation expanded across the entire planet. A wave of dark energy absorbed creatures, structures and land into the dark universe, and what was once a single planet – was now two. [MP2 / MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Luminoth surveyed the devastation. The Phazon seed was gone – it had indeed collided with the dark universe. Entire continents, with millions of inhabitants, had vanished with it. [MP2 / MP2 SP
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiocyxn4ksjpg" data-recommend-id="image://18zqiocyxn4ksjpg" data-format="jpg" data-width="640" data-height="407" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:63.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiocyxn4ksjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiocyxn4ksjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiocyxn4ksjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiocyxn4ksjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://azureparagon.deviantart.com/art/Void-Xarasque-Sky-Station-244410462&quot;,{&quot;metric25&quot;:1}]]" href="http://azureparagon.deviantart.com/art/Void-Xarasque-Sky-Station-244410462" target="_blank" rel="noopener noreferrer"><em>Artist: AzureParagon</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ In the dark universe, a grotesque world was being born. Previous inhabitants of Aether, having been absorbed when containment of the pocket universe was lost, found themselves twisted by the corrosive new reality around them. Most perished, and their flesh fed the strange carnivorous fungi that glowed sickly colours. Some survivors were mutated by the Phazon slowly spreading beneath the surface, and adapted to survive in the hostility. [MP2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Aether and its echo, the Phazon-infested Dark Aether, existed in synchronicity. As the Luminoth tried to rebuild their planet, it took only decades for cracks to form in the ether separating the two realities. As rips in the universe shattered open, Aether became a battlefield. [MP2]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiq826qgjkjpg" data-recommend-id="image://18zqiq826qgjkjpg" data-format="jpg" data-width="640" data-height="379" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:59.2%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiq826qgjkjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiq826qgjkjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiq826qgjkjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiq826qgjkjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://xxkiragaxx.deviantart.com/art/ING-181463823&quot;,{&quot;metric25&quot;:1}]]" href="http://xxkiragaxx.deviantart.com/art/ING-181463823" target="_blank" rel="noopener noreferrer"><em>Artist: Xxkiragaxx</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ A womb of Phazon mutation and dark energies had birthed a cunning and ferocious horde. The Ing erupted through the cracks between the two worlds, and commenced slaughter. They were fought back by the Luminoth, and a war began between the two parallel worlds. The Ing invaded Aether with regularity, and killed, pillaged and destroyed all that they could find. The Luminoth retaliated and crusaded into Dark Aether in their Light Suits, on suicide missions to exterminate the source of the Ing menace. Both sides suffered colossal casualties as the decades went on. [MP2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqirpbvm7a1jpg" data-recommend-id="image://18zqirpbvm7a1jpg" data-format="jpg" data-width="640" data-height="535" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:83.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqirpbvm7a1jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqirpbvm7a1jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqirpbvm7a1jpg.jpg 470w" draggable="auto" data-chomp-id="18zqirpbvm7a1jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/The-U-MOS-118477953&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/The-U-MOS-118477953" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The war was being lost by the Luminoth. The Ing had exterminated most of their race and had stolen too many vital technologies. With the theft of essential energy components from the Light of Aether power network, they had become a defeated people. [MP2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Ing had destroyed all of Aether’s ancient ships, and condemned the Luminoth to no escape from their doomed world. With no other choice, the survivors sealed themselves in an inner sanctum, and entered a state of suspended animation. One custodian, U-Mos, volunteered to be their guardian. As Aether became weaker and weaker, the Luminoth waited for someone to save them. They would wait a very long time. [MP2]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3297">
+ <a class="js_header-anchor" id=""></a>The Sacrifice of the Alimbics
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqitehsufhejpg" data-recommend-id="image://18zqitehsufhejpg" data-format="jpg" data-width="640" data-height="393" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:61.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqitehsufhejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqitehsufhejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqitehsufhejpg.jpg 470w" draggable="auto" data-chomp-id="18zqitehsufhejpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://kihunter.deviantart.com/art/MPH-The-Alimbics-94723125&quot;,{&quot;metric25&quot;:1}]]" href="http://kihunter.deviantart.com/art/MPH-The-Alimbics-94723125" target="_blank" rel="noopener noreferrer"><em>Artist: Kihunter</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ As the Chozo and the Luminoth fell, so too did other ancient races. In a distant part of the universe, the Alimbics were a militaristic society that maintained peace in their galactic cluster. Their order was shattered when a murderous entity, originating from someplace beyond the understood universe, plummeted into one of their worlds. The creature emerged from the devastation as a gaseous entity, and assumed an Alimbic-styled body to begin its onslaught. [MPH]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ This alien juggernaut was named Gorea by the Alimbic race, and they soon understood it brought only death. Gorea killed every Alimbic it could find, and destroyed everything in its path. Planet after planet fell to Gorea, and the Alimbics realised the creature would never stop. [MPH]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiuxqv4hadjpg" data-recommend-id="image://18zqiuxqv4hadjpg" data-format="jpg" data-width="640" data-height="355" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:55.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiuxqv4hadjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiuxqv4hadjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiuxqv4hadjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiuxqv4hadjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/The-Oubliette-46403925&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/The-Oubliette-46403925" target="_blank" rel="noopener noreferrer"><em>Artist: Sesakath</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Alimbics performed an act of supreme sacrifice. They combined the mental energies of their entire race to forge a prison for Gorea. The psychic prison held it bound, and it was transplanted into an organic vessel called The Oubliette. The vessel was launched into the void outside of the universe, a course that would keep its indestructible prisoner in exile forever. The systems of the prison ship were tasked to scan the every molecule of the imprisoned Gorea, and devise an Omega weapon that could be used to kill it. [MPH / MPH SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The mental energies expelled in this plan consumed the physical bodies of the entire Alimbic race. They vanished from the universe in an instant. Their sacrifice protected all life in the cosmos from Gorea’s murderous rampage. [MPH]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3298">
+ <a class="js_header-anchor" id=""></a>The War of Bryyo
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqixy9iqkrejpg" data-recommend-id="image://18zqixy9iqkrejpg" data-format="jpg" data-width="640" data-height="414" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:64.7%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqixy9iqkrejpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqixy9iqkrejpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqixy9iqkrejpg.jpg 470w" draggable="auto" data-chomp-id="18zqixy9iqkrejpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sesakath.deviantart.com/art/MP-C-Bryyo-88412835&quot;,{&quot;metric25&quot;:1}]]" href="http://sesakath.deviantart.com/art/MP-C-Bryyo-88412835" target="_blank" rel="noopener noreferrer"><em>Artist: Sesakath</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ As the old races of the universe died around them, the lizard people of Bryyo faced their own challenges. The Bryyonians were an advanced, space-faring race who had learned much from their Chozo allies. Their society was a deeply polarised one, with tensions eternal between the scientific and religious factions.[MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Over the previous centuries, the scientific agenda had dominated, with space travel proving beneficial and enlightening. As the Chozo, Luminoth and Alimbics faced extinction, the religious Bryyonians believed more than ever that the universe was a hostile place, and became desperate to stop their scientific counterparts. [MP3]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ A great war exploded across Bryyo. By its end, the scholars had been wiped out and the survivors of both sides had regressed to a feral existence. The race devolved into animals, wandering around ruins that they no longer understood. Language vanished and strength ruled. Anyone who landed on Bryyo was meat, to be killed and eaten. [MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3299">
+ <a class="js_header-anchor" id=""></a>The Little Rainy Planet
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ The onslaught of vengeances, conquerors, poisons and politics destroyed the old races. The Alimbics had lost their flesh, while the Bryyonians had lost their souls. The Luminoth had retreated into stasis, and the Chozo of Tallon IV had been condemned to a living death. [MP / MPH / MP2 / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqiznfcy0icjpg" data-recommend-id="image://18zqiznfcy0icjpg" data-format="jpg" data-width="640" data-height="430" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:67.2%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqiznfcy0icjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqiznfcy0icjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqiznfcy0icjpg.jpg 470w" draggable="auto" data-chomp-id="18zqiznfcy0icjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://kaiquesilva.deviantart.com/art/Planet-Zebes-251229151&quot;,{&quot;metric25&quot;:1}]]" href="http://kaiquesilva.deviantart.com/art/Planet-Zebes-251229151" target="_blank" rel="noopener noreferrer"><em>Artist: Kaiquesilva</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ On a small, rainy planet called Zebes, the last known Chozo colony had watched the stars with impotence. This small settlement of the nearly-extinct avian race witnessed the end of the great universal renaissance, and the slow beginning of a new chapter in galactic history. Gradually, the younger races were launching their first satellites into space. In time, new empires would rise to take the place of the old. [M1 / M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqj0sv6pheljpg" data-recommend-id="image://18zqj0sv6pheljpg" data-format="jpg" data-width="640" data-height="591" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:92.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj0sv6pheljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj0sv6pheljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj0sv6pheljpg.jpg 470w" draggable="auto" data-chomp-id="18zqj0sv6pheljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://3ihard.deviantart.com/art/Praying-for-Universe-179491357&quot;,{&quot;metric25&quot;:1}]]" href="http://3ihard.deviantart.com/art/Praying-for-Universe-179491357" target="_blank" rel="noopener noreferrer"><em>Artist: 3ihard</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Zebes prophets’ saw the visions the Chozo had always endured: great wars, spreading poison and death. And suddenly, something bold was foreseen. [M1 SP / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqj1sdn0v6rjpg" data-recommend-id="image://18zqj1sdn0v6rjpg" data-format="jpg" data-width="640" data-height="528" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:82.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqj1sdn0v6rjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqj1sdn0v6rjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqj1sdn0v6rjpg.jpg 470w" draggable="auto" data-chomp-id="18zqj1sdn0v6rjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://fddt.deviantart.com/art/Samus-Aran-368975394&quot;,{&quot;metric25&quot;:1}]]" href="http://fddt.deviantart.com/art/Samus-Aran-368975394" target="_blank" rel="noopener noreferrer"><em>Artist: Fddt</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ A great hunter, clad in orange, red and green. The Chozo glimpsed a future hero, alone in the darkness beneath worlds, fighting so that good could survive evil. They saw her curing poisoned planets, and ending galactic wars. They saw the universe’s one chance to survive its apocalyptic future. They saw the only one who could defy prophecy. [M1 / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ And they saw her wearing Chozo armour. [M1]
+ </p>
+ <h2 class="sc-1bwb26k-1 RjwRf" id="h3300">
+ <a class="js_header-anchor" id=""></a>Part Three: The New Empires
+ </h2>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3301">
+ <a class="js_header-anchor" id=""></a>The Humans
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ On the planet Earth, the human race had finally developed a ship capable of leaving their solar system. A brave crew ventured into the universe to learn whether life existed elsewhere. Their discoveries fundamentally changed the human condition. On planet after planet, they found ruined tombs and cities, guarded by weathered statues of dead races. Most significant of all, they found technology. [M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The humans reverse engineered their salvage, and advanced with pace. Within another century, faster-than-light ships explored the stars, and colonies transformed hostile worlds into homes. Peaceful relations formed between other younger races, and a great Galactic Federation was founded. [M1 SP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3302">
+ <a class="js_header-anchor" id=""></a>The Space Pirates
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ In a less hospitable region of space, a cabal of battered races joined their forces to survive. On planets where acid rain burned flesh and magma flowed, the alliance expanded into a hardened space empire. They ventured into nearby systems and took what they needed from anyone they could reach. They found the ruins of the old races and ransacked the ancient technologies within. They immersed themselves in science and unlocked the secrets of their finds. Within decades, they had advanced their spread with stronger and faster ships. The creatures enhanced themselves, rewriting their genetics and integrating mechanisms beneath their flesh. They were unique: a cybernetic race of furious murderers with a skill for patient scientific process. As more planets were invaded, their conquered civilisations were conscripted by force. [M1 SP / MP / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The inevitable moment came when their Empire reached the borders of the vast Galactic Federation. [M1 SP / MP / MP3]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqjuebmfw70jpg" data-recommend-id="image://18zqjuebmfw70jpg" data-format="jpg" data-width="640" data-height="489" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:76.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjuebmfw70jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjuebmfw70jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjuebmfw70jpg.jpg 470w" draggable="auto" data-chomp-id="18zqjuebmfw70jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://mr-corr.deviantart.com/art/fight-for-norion-175087687&quot;,{&quot;metric25&quot;:1}]]" href="http://mr-corr.deviantart.com/art/fight-for-norion-175087687" target="_blank" rel="noopener noreferrer"><em>Artist: Mr-Corr</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ First contact was brief and furious. On that day, the warning went out to all the worlds of the Federation: Beware the Space Pirates. Though no state of war was officially declared, the empires attacked each other on sight. The Galactic Federation was large enough to repress any meaningful incursions into their space. [M1 SP / MP SP / MP3 SP / SM SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3303">
+ <a class="js_header-anchor" id=""></a>The Massacre of Two Families
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Galactic Federation discovered the last Chozo Colony on Zebes. The tired, ancient avians welcomed the humans and shared with them wisdom and knowledge. They offered the Galactic Federation new sciences, and taught them how to make organic computers. The Federation studied the Chozo’s own central processing unit, an engineered brain that mothered over their colony, and left with plans to assemble their own variants. On the nearest habitable planet of K-2L, a colony was established. [M1 / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ On this world, the human Samus Aran was born. [M1]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqjw7ft0zj5jpg" data-recommend-id="image://18zqjw7ft0zj5jpg" data-format="jpg" data-width="640" data-height="478" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:74.7%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjw7ft0zj5jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjw7ft0zj5jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjw7ft0zj5jpg.jpg 470w" draggable="auto" data-chomp-id="18zqjw7ft0zj5jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://methuselah3000.deviantart.com/art/Zebesian-Space-Pirate-301454831&quot;,{&quot;metric25&quot;:1}]]" href="http://methuselah3000.deviantart.com/art/Zebesian-Space-Pirate-301454831" target="_blank" rel="noopener noreferrer"><em>Artist: Methuselah3000</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Barely out of infancy, the young Samus witnessed her family die. A Space Pirate raiding party overwhelmed her colony and murdered everyone she ever knew. By staying silent while surrounded by horror, Samus survived as the Pirates ransacked the settlement and left. [M1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo colony on Zebes received K-2L’s automated distress signal. In an ancient dusty ship, they reached the planet and found Samus to be the only survivor of the massacre. The child was brought to Zebes, and the Chozo deliberated. Should she be returned to her own kind, or allowed to stay? [M1]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Across the colony, the Prophets experienced a simultaneous moment of clarity. They understood immediately that they had found their prophesised hero. The young girl was their inheritor, and would grow strong. She would learn all she could from them, and take their strongest technologies into the universe. She would be the hero against the oncoming storm. [M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqjz9xd98ltjpg" data-recommend-id="image://18zqjz9xd98ltjpg" data-format="jpg" data-width="640" data-height="524" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:81.9%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjz9xd98ltjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjz9xd98ltjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjz9xd98ltjpg.jpg 470w" draggable="auto" data-chomp-id="18zqjz9xd98ltjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://r3dfive.deviantart.com/art/The-Birth-Of-The-Hunter-255511894&quot;,{&quot;metric25&quot;:1}]]" href="http://r3dfive.deviantart.com/art/The-Birth-Of-The-Hunter-255511894" target="_blank" rel="noopener noreferrer"><em>Artist: R3dFiVe</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus Aran reached maturity amongst the Chozo. She was trained in the combat arts of the great extinct races. She was infused with Chozo genetic material so she could employ their technologies. She was educated to be a scientist, an explorer, and a tactician. Everything that was good about the Chozo civilisation was allowed to live on in Samus. [M1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqjzzky4ffnjpg" data-recommend-id="image://18zqjzzky4ffnjpg" data-format="jpg" data-width="640" data-height="517" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:80.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqjzzky4ffnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqjzzky4ffnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqjzzky4ffnjpg.jpg 470w" draggable="auto" data-chomp-id="18zqjzzky4ffnjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://pyra.deviantart.com/art/Decaying-Elder-53293713&quot;,{&quot;metric25&quot;:1}]]" href="http://pyra.deviantart.com/art/Decaying-Elder-53293713" target="_blank" rel="noopener noreferrer"><em>Artist: Pyra</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus became an adult, and the Chozo presented her with their greatest works: a toughened power suit and an agile spacecraft, both more potent than anything their race had ever made. The Chozo leader, decaying and blind, told Samus it was time for her to find her destiny in the universe. Samus Aran departed for the stars, and years pass. [M1 / M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ As Samus tried to reconnect with her heritage on Earth, the last Chozo prophets on Zebes received a final vision: The Space Pirates were coming for them. It was time for the last Chozo to be extinguished from the universe. [M1 SP]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqk1guma1bojpg" data-recommend-id="image://18zqk1guma1bojpg" data-format="jpg" data-width="640" data-height="401" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:62.7%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk1guma1bojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk1guma1bojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk1guma1bojpg.jpg 470w" draggable="auto" data-chomp-id="18zqk1guma1bojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://phobos-romulus.deviantart.com/art/The-Chozo-187935440&quot;,{&quot;metric25&quot;:1}]]" href="http://phobos-romulus.deviantart.com/art/The-Chozo-187935440" target="_blank" rel="noopener noreferrer"><em>Artist: Phobos-Romulus</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Chozo hid their technologies throughout the planet, in places that they were certain Samus would find them. They concealed a second Power Suit within the walls of their holy temple, having foreseen that Samus may require it in the future. They then returned to the surface to await the inevitable. [M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Space Pirates invaded in force, and murdered Samus Aran’s second family. The Chozo became extinct. [M1 / MP SP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3304">
+ <a class="js_header-anchor" id=""></a>The Mother Brain
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ Space Pirate scientists arrived shortly after the carnage and focused their attention on the legendary Chozo organic central processing unit. They rewrote its benign programming and injected stimulants into its flesh. They enabled it to form an artificial intelligence obsessed with strategy and conquest. They drove its computational potential towards absolute advancement of the Space Pirate Empire. [M1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqk2icdbv0cjpg" data-recommend-id="image://18zqk2icdbv0cjpg" data-format="jpg" data-width="640" data-height="528" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:82.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk2icdbv0cjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk2icdbv0cjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk2icdbv0cjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk2icdbv0cjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://jaagup.deviantart.com/art/mother-brain-258536723&quot;,{&quot;metric25&quot;:1}]]" href="http://jaagup.deviantart.com/art/mother-brain-258536723" target="_blank" rel="noopener noreferrer"><em>Artist: Jaagup</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The results went beyond High Command’s most optimistic projections. The Space Pirates had created a leader, a desperately needed figure to unite their fragmented empire. They had created their Mother Brain. The great Space Pirate generals Ridley and Kraid arrived at Zebes, ready to pay tribute to their new master and to plan for the future. Mother Brain delivered to the Space Pirates knowledge and power. She told them of a world referenced in her oldest Chozo databanks, a planet bathed in a mutagenic poison waiting to be farmed. She instructed High Command to prepare an armada of ships and invade the planet Tallon IV. [M1 / MP SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ The order was followed immediately, and the High Command discovered a world deranged by contagion. Beneath its surface, endless pools of Phazon waited to be weaponised, and a great mining operation began. Mother Brain received data from their readings on the planet; even after thousands of years, the source of the Phazon was still contained in the Chozo force field. She scrutinised her records further, and was unable to ascertain any method of breaching the barrier. The Space Pirates could retrieve the Phazon, but were denied access to its source. [MP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3305">
+ <a class="js_header-anchor" id=""></a>The Metroids
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ A perfect storm brewed. As the Space Pirates gained access to the most potent mutagen in the universe, the Galactic Federation made an equally eventful discovery: They found the dark planet SR388. [M1 / M2]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqk5mt4ocetjpg" data-recommend-id="image://18zqk5mt4ocetjpg" data-format="jpg" data-width="640" data-height="477" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:74.5%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk5mt4ocetjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk5mt4ocetjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk5mt4ocetjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk5mt4ocetjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://firebornform.deviantart.com/art/SR388-Tunnels-353312617&quot;,{&quot;metric25&quot;:1}]]" href="http://firebornform.deviantart.com/art/SR388-Tunnels-353312617" target="_blank" rel="noopener noreferrer"><em>Artist: Fireborn Form</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ A Galactic Federation survey team studied the surface, and soon encountered a gelatinous creature that swam through air. The alien defied gravity and physics as it phased through dense rock with ease. It perceived the survey team, and made a few curious chirps in their direction. It then suddenly changed temperament, aggressively charging to latch itself onto the skull of one of the party. The victim died in agony as the Metroid fed on all the energy within, and could not be removed until its prey had been reduced to a dried husk of collapsing matter. The young Metroid had just killed, in a way that science could not explain. [M1 SP / M2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ With effort and casualties, the scientists contained a few infant specimens of the Metroid creatures, and left the planet without further incident. [M1]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ As their vessel went back to the stars, SR388 was aware their withdrawal. It harboured a great contempt for the invaders, an endless hate fuelled by the impotence it endured centuries ago when the Chozo had committed their great invasion. The living planet had spent centuries honing the Metroids into perfect killers, and knew the devastation they could cause upon maturity. The planet had intentionally allowed the humans to take a few Metroids away so that the creatures could grow up and kill anyone out amongst the stars who ever thought of returning. SR388 took any opportunity to gain revenge against an outside universe that refused to leave it alone. [M2 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ As the scientists began to broadcast their findings back to the Galactic Federation, Mother Brain intercepted the transmission. She cross-referenced their data with notes buried in the Chozo’s ancient fragmented records. She deduced that the Metroids were a form of genetically engineered predator of incredible power, created by the Chozo for an unknown purpose. Mother Brain ordered High Command to get the creatures to her by any means necessary. [M1 SP]
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ The Space Pirates overran the Galactic Federation vessel and stole the Metroid creatures. They divided their prize: some were sent to their nearest Homeworld; others were sent to the Tallon IV outpost; and the most potent were delivered straight to Zebes for the experiments of Mother Brain. [M1 / MP / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ With the arrival of the first Phazon samples from Tallon IV, the exotic substance allowed the Space Pirates to slowly produce stable cloned Metroids across their breeding sites. [M1 SP / MP SP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3306">
+ <a class="js_header-anchor" id=""></a>The Revenge of Samus Aran
+ </h3>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqk7ps96cb3jpg" data-recommend-id="image://18zqk7ps96cb3jpg" data-format="jpg" data-width="640" data-height="480" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:75%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk7ps96cb3jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk7ps96cb3jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk7ps96cb3jpg.jpg 470w" draggable="auto" data-chomp-id="18zqk7ps96cb3jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://ojanpohja.deviantart.com/art/Space-Pirate-31294390&quot;,{&quot;metric25&quot;:1}]]" href="http://ojanpohja.deviantart.com/art/Space-Pirate-31294390" target="_blank" rel="noopener noreferrer"><em>Artist: Ojanpohja</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ In her first mission as a Bounty Hunter, Samus Arran was commissioned by the Galactic Federation to neutralise the stolen Metroids. Through careful investigation, Samus discovered that the Pirates are operating from Zebes – her home. She concluded that the Space Pirates had murdered her second family, as they had done with her first. They have took from her everyone she ever loved, and destroyed her two worlds. [M1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqk8x71i4gnjpg" data-recommend-id="image://18zqk8x71i4gnjpg" data-format="jpg" data-width="640" data-height="384" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:60%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqk8x71i4gnjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqk8x71i4gnjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqk8x71i4gnjpg.jpg 470w" draggable="auto" data-chomp-id="18zqk8x71i4gnjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://stuarthughe.deviantart.com/art/Samus-Varia-322194081&quot;,{&quot;metric25&quot;:1}]]" href="http://stuarthughe.deviantart.com/art/Samus-Varia-322194081" target="_blank" rel="noopener noreferrer"><em>Artist: Stuart Hughe</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus stormed Zebes and killed everyone in her path. [M1]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkachpcz0ijpg" data-recommend-id="image://18zqkachpcz0ijpg" data-format="jpg" data-width="640" data-height="530" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:82.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkachpcz0ijpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkachpcz0ijpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkachpcz0ijpg.jpg 470w" draggable="auto" data-chomp-id="18zqkachpcz0ijpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://immarart.deviantart.com/art/Metroid-337270954&quot;,{&quot;metric25&quot;:1}]]" href="http://immarart.deviantart.com/art/Metroid-337270954" target="_blank" rel="noopener noreferrer"><em>Artist: Immarart</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ As her defences were breached, Mother Brain unleashed the great generals Ridley and Kraid. Both were killled, and, desperate to stop the intruder, Mother Brain released the Metroids. Samus Aran exterminated the creatures, and invaded the inner sanctum. [M1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkbhxb2ugpjpg" data-recommend-id="image://18zqkbhxb2ugpjpg" data-format="jpg" data-width="640" data-height="360" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:56.3%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkbhxb2ugpjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkbhxb2ugpjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkbhxb2ugpjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkbhxb2ugpjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://twigs.deviantart.com/art/The-Mother-s-Chamber-140408495&quot;,{&quot;metric25&quot;:1}]]" href="http://twigs.deviantart.com/art/The-Mother-s-Chamber-140408495" target="_blank" rel="noopener noreferrer"><em>Artist: Twigs</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus confronted the malevolent Mother Brain and blasted apart her body. A power overload was caused, and the Tourian facility shook itself apart. Samus evacuated to her ship and tried to leave Zebes, but a Space Pirate battleship in orbit registered her ascent and opened fire. Samus’ gunship plummeted back towards the Zebes and impacted Chozodia, her former home. [M1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Extremely lucky to be alive, Samus crawled out of the remains of her destroyed power suit, and fled as Space Pirate forces stormed the area. Samus hid, crawled and ran to find sanctuary in the deepest part of the Chozo’s most revered temple. [M1]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkdb1egv73jpg" data-recommend-id="image://18zqkdb1egv73jpg" data-format="jpg" data-width="640" data-height="500" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:78.1%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkdb1egv73jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkdb1egv73jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkdb1egv73jpg.jpg 470w" draggable="auto" data-chomp-id="18zqkdb1egv73jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://eyes5.deviantart.com/art/Blessing-6012954&quot;,{&quot;metric25&quot;:1}]]" href="http://eyes5.deviantart.com/art/Blessing-6012954" target="_blank" rel="noopener noreferrer"><em>Artist: Eyes5</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus found herself surrounded with murals of the dead Chozo, and accepted she was alone in the universe. Overcoming despair, she solved the trials of the Chozodian temple and a concealed power suit was revealed to her. This shining armour was even more potent than the one she had just lost, and was able to integrate the most exotic Chozo technologies. Samus realised the greater meaning of her find; the Chozo had left her gifts for her in places they had foreseen she would traverse. Her adopted family continued to protect her long after their deaths, and she would find their statues cradling survival equipment in the darkest corners of the cosmos. [M1 / MP / MP3 / M2 / SM]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkeig3z5btjpg" data-recommend-id="image://18zqkeig3z5btjpg" data-format="jpg" data-width="640" data-height="374" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:58.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkeig3z5btjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkeig3z5btjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkeig3z5btjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkeig3z5btjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://imachinivid.deviantart.com/art/Super-missile-309591371&quot;,{&quot;metric25&quot;:1}]]" href="http://imachinivid.deviantart.com/art/Super-missile-309591371" target="_blank" rel="noopener noreferrer"><em>Artist: Imachinivid</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ With her new armaments, Samus cleansed the Space Pirate presence from Zebes. She came to be known as “The Hunter”, and the Space Pirates learned that they will always be hunted down for what they did to her families. They fled the planet in terror. [M1 / MP / MP2 / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3307">
+ <a class="js_header-anchor" id=""></a>Tallon IV
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ As years passed, Samus Aran accepted further missions from the Galactic Federation. The bounty earned funded her personal vendetta against the Space Pirates. She improved her armaments, paid for black market information and stormed their outposts. Samus showed her enemies no mercy, and became the feared nemesis of their entire civilisation. With the income from her Federation services, Samus had soon amassed enough money to buy the most secret information regarding the Space Pirates: the coordinates of their stronghold on an old forgotten planet called Tallon IV. [MP1 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus guided her ship into the Tallon system and investigated an orbiting space station. She discovered a failed genetic engineering facility whose Space Pirate crew was murdered when they lost control of their own creations. Samus fought her way through the ferocious beasts scattered within, and discovered a half-insane cyborg recreation of the Space Pirate general Ridley. As the station began to collapse, the biomechanical dragon fled to the world below, and Samus pursued. [MP1]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkglfb56vojpg" data-recommend-id="image://18zqkglfb56vojpg" data-format="jpg" data-width="640" data-height="311" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:48.6%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkglfb56vojpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkglfb56vojpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkglfb56vojpg.jpg 470w" draggable="auto" data-chomp-id="18zqkglfb56vojpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://lightningarts.deviantart.com/art/Metroid-Metal-Where-It-All-Begins-393272172&quot;,{&quot;metric25&quot;:1}]]" href="http://lightningarts.deviantart.com/art/Metroid-Metal-Where-It-All-Begins-393272172" target="_blank" rel="noopener noreferrer"><em>Artist: Lightningarts</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus lost Ridley in the planet’s stormy atmosphere, and elected to land in a nearby jungle to conceal her presence from the Pirate ground forces. Exploring the surroundings, Samus discovered that the planet was once home to the bulk of the extinct Chozo civilisation. In a great temple Samus studied poetic murals that told of the Phazon comet that had struck their world. The scribblings informed her of a creature trapped deep in the comet that they referred to as “The Worm,” and of the powerful shield they erected to prevent its escape. Samus read their last prophecy; that a hero would traverse fire and ice, jungle and cave, and find twelve sacred keys that would deactivate the barrier and allow passage to the Impact Crater. This saviour from the stars would bring down the ancient shield, and destroy the worm that infected their planet. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ She continued her exploration, and battled ferocious flora and fauna. The Hunter came to understand that the Space Pirates had established a complex military installation that descended far below the surface. [MP1]
+ </p>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkick4w4i9jpg" data-recommend-id="image://18zqkick4w4i9jpg" data-format="jpg" data-width="640" data-height="517" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:80.8%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkick4w4i9jpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkick4w4i9jpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkick4w4i9jpg.jpg 470w" draggable="auto" data-chomp-id="18zqkick4w4i9jpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://r-sraven.deviantart.com/art/Metroid-Prime-Lost-Ruins-33577678&quot;,{&quot;metric25&quot;:1}]]" href="http://r-sraven.deviantart.com/art/Metroid-Prime-Lost-Ruins-33577678" target="_blank" rel="noopener noreferrer"><em>Artist: R-Sraven</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus hunted the Pirates and accessed their computer logs. The Empire had found quantities of an intensely potent mutagen called Phazon. Laboratories across the outpost experimented with the substance, and in a short space of time they had created prototypes for the next generation of their races: powerful Phazon-fuelled juggernauts. Should these advances continue, Samus knew that the Space Pirates would be able to conquer the Galactic Federation. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--bleed js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 kivedT" data-id="18zqkje1rl63yjpg" data-recommend-id="image://18zqkje1rl63yjpg" data-format="jpg" data-width="800" data-height="816" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:800px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:102%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkje1rl63yjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkje1rl63yjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkje1rl63yjpg.jpg 470w, https://i.kinja-img.com/gawker-media/image/upload/c_scale,f_auto,fl_progressive,q_80,w_800/18zqkje1rl63yjpg.jpg 800w" draggable="auto" data-chomp-id="18zqkje1rl63yjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968&quot;,{&quot;metric25&quot;:1}]]" href="http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968" target="_blank" rel="noopener noreferrer"><em>Artist: Greenstranger</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ In the most secure laboratory, Samus made a devastating discovery. The Space Pirates had used Phazon to create an army of stable clone Metroids and lost containment. The Metroid creatures were roaming the caverns deep in the planet, reproducing and mutating as the Phazon influenced their physiology. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqklb3wp0jajpg" data-recommend-id="image://18zqklb3wp0jajpg" data-format="jpg" data-width="640" data-height="365" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:57%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqklb3wp0jajpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqklb3wp0jajpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqklb3wp0jajpg.jpg 470w" draggable="auto" data-chomp-id="18zqklb3wp0jajpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968&quot;,{&quot;metric25&quot;:1}]]" href="http://greenstranger.deviantart.com/art/Metroid-Ceres-Station-Lab-358321968" target="_blank" rel="noopener noreferrer"><em>Artist: Ohimseeinstars</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus’ final discovery was the most horrific. The powerful, poisonous Phazon was not a rare material on Tallon IV. Despite the Chozo shield containing the Impact Crater, the substance had spread and consumed the world inside-out. The core of the planet presented the Space Pirates with a vast supply of Phazon, enough to fuel their conquest of the stars. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus destroyed the mining facilities and laboratories, and reconstructed the twelve parts of the ancient Chozo cipher. She destroyed living weapons such as the Thardus experiment, and annihilated the prototype Omega Pirate. She overcame corrupted Metroids, and banished the tormented Chozo ghosts from the living world. She fought the mad Meta Ridley, and on his demise deactivated the Chozo containment shield. As prophesised, Samus Aran entered the Impact Crater. [MP1]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3308">
+ <a class="js_header-anchor" id=""></a>The Worm
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus Aran had opened Metroid Prime’s cage, and had no understanding of what she was about to unleash on the universe. The creature had been imprisoned in a different era, and had spent eons being tortuously transformed by Phazon into an undying mad genius. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkn672gklqjpg" data-recommend-id="image://18zqkn672gklqjpg" data-format="jpg" data-width="640" data-height="499" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:78%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkn672gklqjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkn672gklqjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkn672gklqjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkn672gklqjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<em>Artist: Chrysaetos-Pteron</em>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus and the ancient Metroid battled, and the bounty hunter shattered the creature’s metal armour. By channelling the surrounding Phazon deposits into a supercharged energy beam, Samus was able to devastate Metroid Prime’s gelatinous body. After a tremendous battle, the old creature began to collapse on itself. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkodlj2z8kjpg" data-recommend-id="image://18zqkodlj2z8kjpg" data-format="jpg" data-width="640" data-height="525" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:82%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkodlj2z8kjpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkodlj2z8kjpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkodlj2z8kjpg.jpg 470w" draggable="auto" data-chomp-id="18zqkodlj2z8kjpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://sabretoontigers.deviantart.com/art/Samus-308644319&quot;,{&quot;metric25&quot;:1}]]" href="http://sabretoontigers.deviantart.com/art/Samus-308644319" target="_blank" rel="noopener noreferrer"><em>Artist: Sabretoontigers</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Seemingly dying, Metroid Prime lashed out, grabbing a layer of material from Samus Aran’s armour. The creature melted into a pool of Phazon particles, and the bounty hunter evacuated the Impact Crater. [MP1]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ Samus Aran had seemingly succeeded in her mission. The surviving Space Pirates abandoned their devastated facilities and hastily evacuated the planet. With the defeat of Metroid Prime, the Phazon contagion was slowly stopping its spread. The tormented Chozo spirits that had been bound to the planet were finally able to achieve their rest. Leaving the world to recover from its devastation, Samus Aran headed back to the stars. [MP1 / MP1 SP]
+ </p>
+ <h3 class="sc-1bwb26k-1 RjwRf" id="h3309">
+ <a class="js_header-anchor" id=""></a>The Dark Hunter
+ </h3>
+ <p class="sc-77igqf-0 hJpRRP">
+ Metroid Prime’s exposure to millennia of Phazon had given the creature extremely exotic abilities, the most potent being its durability – to recreate itself after nearly any level of destruction. As it had collapsed on itself, the essence of Metroid Prime craved the strength and adaptability present in Samus Aran. In the Talon IV impact crater, Metroid Prime recreated itself as a dark copy of the woman who had defeated it. [MP 1 / MP2 / MP3 SP]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <figure class="align--center js_lazy-image js_marquee-assetfigure sc-1eow4w5-1 iLDaWI" data-id="18zqkq6pqyr8ljpg" data-recommend-id="image://18zqkq6pqyr8ljpg" data-format="jpg" data-width="640" data-height="412" data-lightbox="true" data-recommended="false" contenteditable="false" draggable="false">
+ <div class="img-wrapper sc-1eow4w5-2 gfolHV" contenteditable="false" style="max-width:640px" data-syndicationrights="false">
+ <div class="magnifier js_lightbox lightbox hide sc-1m41dwj-0 hUFSvg">
+ <span class="js_lightbox-wrapper sc-1eow4w5-0 dUoECc"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="ZoomIn icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M10.5 1a6.5 6.5 0 1 1-4.23 11.44l-4.42 4.41a.5.5 0 0 1-.7-.7l4.41-4.42A6.5 6.5 0 0 1 10.5 1zm0 1a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11zm0 2c.28 0 .5.22.5.5V7h2.5a.5.5 0 0 1 .5.41v.09a.5.5 0 0 1-.5.5H11v2.5a.5.5 0 0 1-.41.5h-.09a.5.5 0 0 1-.5-.5V8H7.5a.5.5 0 0 1-.5-.41V7.5c0-.28.22-.5.5-.5H10V4.5a.5.5 0 0 1 .41-.5z"></path></svg></span></span>
+ </div>
+ <div style="padding-bottom:64.4%" class="image-hydration-wrapper sc-1eow4w5-3 iJyiXs">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-srcset="https://i.kinja-img.com/gawker-media/image/upload/c_fill,f_auto,fl_progressive,g_center,h_80,q_80,w_80/18zqkq6pqyr8ljpg.jpg 80w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,fl_progressive,q_80,w_320/18zqkq6pqyr8ljpg.jpg 320w, https://i.kinja-img.com/gawker-media/image/upload/c_fit,f_auto,fl_progressive,q_80,w_470/18zqkq6pqyr8ljpg.jpg 470w" draggable="auto" data-chomp-id="18zqkq6pqyr8ljpg" data-format="jpg" data-alt="Illustration for article titled The Spectacular Story Of emMetroid/em, One Of Gamings Richest Universes" data-anim-src="" />
+ </div>
+ </div>
+ </div>
+ </figure>
+ <p class="sc-77igqf-0 hJpRRP">
+ (<span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://imachinivid.deviantart.com/art/Dark-Samus-returns-295856131&quot;,{&quot;metric25&quot;:1}]]" href="http://imachinivid.deviantart.com/art/Dark-Samus-returns-295856131" target="_blank" rel="noopener noreferrer"><em>Artist: Imachinivid</em></a></span>)
+ </p>
+ <p class="sc-77igqf-0 hJpRRP">
+ Dark Samus clawed its way out of the Impact Crater. It departed Tallon IV to spread its venom across the stars, and to sow the seeds of a great war. [MP1 / MP2 / MP3]
+ </p>
+ <div id="" class="js_ad-mobile-dynamic js_ad-dynamic ad-mobile-dynamic movable-ad bxm4mm-4 liWXlp">
+ <div class="bxm4mm-1 bxm4mm-2 iXYVqp"></div>
+ <div class="ad-unit ad-mobile bxm4mm-5 eZvXLs">
+ <div class="bxm4mm-6 eblHLt">
+ Advertisement
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-MOBILE_IN_POST ad-mobile" data-ad-unit="MOBILE_IN_POST" data-targeting="{&quot;pos&quot;:&quot;mobile_inpost&quot;}"></div>
+ <div class="bt-wrapper"></div>
+ </div>
+ <div class="bxm4mm-1 bxm4mm-3 dciqNP"></div>
+ </div>
+ <p class="sc-77igqf-0 hJpRRP">
+ <span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;Internal link&quot;,&quot;https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108&quot;,{&quot;metric25&quot;:1}]]" href="https://kotaku.com/the-spectacular-story-of-metroid-part-2-1284621108"><em>Click here for the second half of this epic story.</em></a></span>
+ </p>
+ <hr class="gcp5ez-0 dGHwsG" />
+ <p class="sc-77igqf-0 hJpRRP">
+ <small>Mama Robotnik is a video game historian living somewhere in the British Empire. He specialises in unearthing lost gaming media, but also enjoys a good long essay about his favourite games every now and then. He drinks a lot of tea, and has a horrendously naughty black and white cat called Blossom. If you would like to contact him, he responds to his private messages over at</small> <span><a class="sc-145m8ut-0 FoItC js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Embedded Url&quot;,&quot;External link&quot;,&quot;http://www.neogaf.com/forum/&quot;,{&quot;metric25&quot;:1}]]" href="http://www.neogaf.com/forum/" target="_blank" rel="noopener noreferrer"><small>NeoGAF</small></a></span><small>.</small>
+ </p>
+ </div>
+ <div class="sc-18b1b2r-5 ccAJCg">
+ <div>
+ <h4 class="z1qon0-0 sHsHa">
+ Share This Story
+ </h4>
+ <div class="js_share-tools sc-18b1b2r-0 jZyWXs" data-position="bottom">
+ <div class="sc-17x7c2u-2 gpwIdA">
+ <a href="https://facebook.com/sharer.php?u=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_facebook" title="Share to Facebook" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Facebook&quot;,&quot;bottom&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Facebook icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M17 9.05A8.02 8.02 0 0 0 9 1C4.58 1 1 4.6 1 9.05A8.04 8.04 0 0 0 7.75 17v-5.62H5.72V9.05h2.03V7.28c0-2.02 1.2-3.14 3.02-3.14.88 0 1.8.16 1.8.16v1.98h-1.02c-.99 0-1.3.62-1.3 1.26v1.5h2.22l-.36 2.34h-1.86V17A8.04 8.04 0 0 0 17 9.05"></path></svg></span></span></a><a href="https://twitter.com/share?text=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;amp;url=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_twitter" title="Share to Twitter" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Twitter&quot;,&quot;bottom&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Twitter icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M12.46 1.13c-2.04 0-3.7 1.78-3.7 3.97 0 .31.04.62.1.9a10.26 10.26 0 0 1-7.6-4.15A4.2 4.2 0 0 0 2.4 7.16a3.5 3.5 0 0 1-1.68-.5v.05a3.92 3.92 0 0 0 2.97 3.9 3.45 3.45 0 0 1-1.67.07 3.74 3.74 0 0 0 3.45 2.76A7.08 7.08 0 0 1 0 15.1a9.92 9.92 0 0 0 5.66 1.79c6.8 0 10.5-6.06 10.5-11.32v-.51A7.85 7.85 0 0 0 18 2.99c-.66.32-1.37.53-2.12.63a3.95 3.95 0 0 0 1.62-2.2c-.71.45-1.5.78-2.34.96a3.57 3.57 0 0 0-2.7-1.25"></path></svg></span></span></a><a href="mailto:?subject=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;body=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%253Futm_medium%3Dsharefromsite%2526utm_source%3D_email%26utm_campaign=bottom" title="Share via Email" target="_blank" data-ga="[[&quot;Share Tools&quot;, &quot;Share to Email&quot;,&quot;bottom&quot;]]" class="sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Mail icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M14.5 3A2.5 2.5 0 0 1 17 5.5v7a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 1 12.5v-7A2.5 2.5 0 0 1 3.5 3h11zM2 5.5v7c0 .83.67 1.5 1.5 1.5h11c.83 0 1.5-.67 1.5-1.5v-7l-.03-.3-6.34 5.67a.5.5 0 0 1-.38.13.5.5 0 0 1-.38-.13l-6.7-6-.02-.02c-.1.2-.15.41-.15.64zM14.5 4h-11c-.24 0-.45.05-.65.14l6.4 5.73 6.19-5.54c-.26-.2-.58-.33-.93-.33z"></path></svg></span></span></a><a href="https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577" title="Share via Link" data-ga="[[&quot;Share Tools&quot;, &quot;Copy url&quot;,&quot;bottom&quot;]]" class="js_share-via-link sc-17x7c2u-0 eTFIkv"><span class="sc-17x7c2u-1 jBsDWZ"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Link icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M11.06 7.75a.5.5 0 1 1-.7.7l-.85-.83a1.86 1.86 0 0 0-2.63 0l-4 4a1.86 1.86 0 0 0 0 2.64l1.33 1.33c.72.73 1.91.72 2.64 0l1.8-1.8a.5.5 0 1 1 .7.7l-1.8 1.8a2.87 2.87 0 0 1-4.05 0l-1.33-1.32a2.86 2.86 0 0 1 0-4.05l4-4.01a2.86 2.86 0 0 1 4.05 0l.84.84zm5.17-4.41a2.86 2.86 0 0 1 0 4.05l-4 4.01a2.86 2.86 0 0 1-4.05 0l-.84-.84a.5.5 0 1 1 .7-.71l.85.84c.73.73 1.9.73 2.63 0l4-4c.73-.73.73-1.91 0-2.64l-1.33-1.33a1.87 1.87 0 0 0-2.64 0l-1.8 1.8a.5.5 0 1 1-.7-.7l1.8-1.8a2.87 2.87 0 0 1 4.05 0l1.33 1.32z"></path></svg></span></span></a>
+ </div>
+ </div>
+ </div>
+ <div class="sc-18b1b2r-4 fwDNjy">
+ <h4 class="z1qon0-0 sHsHa">
+ Get our newsletter
+ </h4><a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Permalink page click&quot;,&quot;Subscribe button click&quot;]]" href="/newsletter" target="_blank">
+ <div class="j48i5d-1 fbNnTF">
+ <button class="sc-18b1b2r-3 egRxyu j48i5d-2 jaUINu"><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="MailFilled icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M17 5v8a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V5c0-.12.01-.24.03-.35L8.7 10.4a.5.5 0 0 0 .6 0l7.67-5.75c.02.11.03.23.03.35zm-2-2a2 2 0 0 1 1.54.72L9 9.37 1.46 3.72A2 2 0 0 1 3 3h12z"></path></svg></span><span class="j48i5d-0 hPQZPo">Subscribe</span></button>
+ </div></a>
+ </div>
+ </div>
+ <div class="js_liveblog-controls"></div>
+ <div class="js_qanda-controls"></div>
+ <div class="sc-1or3yyu-4 kSfANG">
+ <h4 class="sc-1or3yyu-0 nBxoz">
+ More from Kotaku
+ </h4>
+ <div class="sc-1or3yyu-3 jvIkaX">
+ <a class="sc-1or3yyu-2 bzrPWe js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Related Posts Module&quot;,&quot;Position 1 of 4&quot;,&quot;https://kotaku.com/sources-despite-huge-sales-borderlands-3-developers-a-1842617645&quot;,{&quot;metric18&quot;:1}]]" href="https://kotaku.com/sources-despite-huge-sales-borderlands-3-developers-a-1842617645">
+ <h4 class="sc-1or3yyu-1 jcgXjw sc-759qgu-0 knZcug">
+ Sources: Despite Huge Sales, <i>Borderlands 3</i> Developers Are Getting Stiffed On Bonuses
+ </h4></a>
+ </div>
+ <div class="sc-1or3yyu-3 jvIkaX">
+ <a class="sc-1or3yyu-2 bzrPWe js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Related Posts Module&quot;,&quot;Position 2 of 4&quot;,&quot;https://thebests.kotaku.com/lets-rank-the-total-war-games-from-best-to-worst-1535642069&quot;,{&quot;metric18&quot;:1}]]" href="https://thebests.kotaku.com/lets-rank-the-total-war-games-from-best-to-worst-1535642069">
+ <h4 class="sc-1or3yyu-1 jcgXjw sc-759qgu-0 knZcug">
+ Let's Rank The <em>Total War</em> Games, From Best To Worst
+ </h4></a>
+ </div>
+ <div class="sc-1or3yyu-3 jvIkaX">
+ <a class="sc-1or3yyu-2 bzrPWe js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Related Posts Module&quot;,&quot;Position 3 of 4&quot;,&quot;https://cosplay.kotaku.com/cosplayers-cant-go-to-cons-so-they-had-one-on-the-inte-1842633521&quot;,{&quot;metric18&quot;:1}]]" href="https://cosplay.kotaku.com/cosplayers-cant-go-to-cons-so-they-had-one-on-the-inte-1842633521">
+ <h4 class="sc-1or3yyu-1 jcgXjw sc-759qgu-0 knZcug">
+ Cosplayers Can't Go To Cons, So They Had One On The Internet [UPDATE]
+ </h4></a>
+ </div>
+ <div class="sc-1or3yyu-3 jvIkaX">
+ <a class="sc-1or3yyu-2 bzrPWe js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Related Posts Module&quot;,&quot;Position 4 of 4&quot;,&quot;https://kotaku.com/professional-fashion-photographer-now-taking-snaps-in-a-1842629671&quot;,{&quot;metric18&quot;:1}]]" href="https://kotaku.com/professional-fashion-photographer-now-taking-snaps-in-a-1842629671">
+ <h4 class="sc-1or3yyu-1 jcgXjw sc-759qgu-0 knZcug">
+ Professional Fashion Photographer Now Taking Snaps In <i>Animal Crossing</i>
+ </h4></a>
+ </div>
+ </div><a name="replies" id="replies"></a>
+ <div class="js_postbottom-waypoint-hook"></div>
+ <div class="js_comments-iframe sc-73739c-0 iaHIzx" data-src="//kotaku.com/embed/comments/magma/1284029577?" data-replycount="158"></div>
+ <div class="js_ad-below-comments sc-73739c-4 cirOTP"></div>
+ <div class="sc-73739c-3 eOmEvw">
+ <div id="taboola-below-article-thumbnails" class="sc-73739c-2 kXLoyx"></div>
+ </div>
+ <div class="sc-1bdg1q0-0 dHZwOk">
+ <div class="sc-1bdg1q0-2 fItspw">
+ <a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Share Tools&quot;,&quot;Share to Facebook click&quot;,&quot;Share bar&quot;]]" href="https://facebook.com/sharer.php?u=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_facebook" target="_blank">
+ <div class="j48i5d-1 fbNnTF">
+ <button class="sc-1bdg1q0-1 huOEht j48i5d-2 ghtMMt"><span class="j48i5d-0 hPQZPo">Share</span><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Facebook icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M17 9.05A8.02 8.02 0 0 0 9 1C4.58 1 1 4.6 1 9.05A8.04 8.04 0 0 0 7.75 17v-5.62H5.72V9.05h2.03V7.28c0-2.02 1.2-3.14 3.02-3.14.88 0 1.8.16 1.8.16v1.98h-1.02c-.99 0-1.3.62-1.3 1.26v1.5h2.22l-.36 2.34h-1.86V17A8.04 8.04 0 0 0 17 9.05"></path></svg></span></button>
+ </div></a><a class="js_link sc-1out364-0 fwjlmD" data-ga="[[&quot;Share Tools&quot;,&quot;Share to Twitter click&quot;,&quot;Share bar&quot;]]" href="https://twitter.com/share?text=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;amp;url=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_twitter" target="_blank">
+ <div class="j48i5d-1 fbNnTF">
+ <button class="sc-1bdg1q0-1 huOEht j48i5d-2 hNujir"><span class="j48i5d-0 hPQZPo">Tweet</span><span class="iyvn34-0 iSaTEN"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" aria-label="Twitter icon" viewbox="0 0 18 18">
+ <path fill-rule="evenodd" d="M12.46 1.13c-2.04 0-3.7 1.78-3.7 3.97 0 .31.04.62.1.9a10.26 10.26 0 0 1-7.6-4.15A4.2 4.2 0 0 0 2.4 7.16a3.5 3.5 0 0 1-1.68-.5v.05a3.92 3.92 0 0 0 2.97 3.9 3.45 3.45 0 0 1-1.67.07 3.74 3.74 0 0 0 3.45 2.76A7.08 7.08 0 0 1 0 15.1a9.92 9.92 0 0 0 5.66 1.79c6.8 0 10.5-6.06 10.5-11.32v-.51A7.85 7.85 0 0 0 18 2.99c-.66.32-1.37.53-2.12.63a3.95 3.95 0 0 0 1.62-2.2c-.71.45-1.5.78-2.34.96a3.57 3.57 0 0 0-2.7-1.25"></path></svg></span></button>
+ </div></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </main>
+ </div>
+ <div is="bulbs-dfp" class="ad-container dfp dfp-slot-INFINITE_PROMOTION ad-infinite-promotion" data-ad-unit="INFINITE_PROMOTION" data-pp-position="scroll" data-targeting="{&quot;pos&quot;:&quot;scroll&quot;,&quot;pp_position&quot;:&quot;scroll&quot;}"></div>
+ <div class="js_reading-list"></div>
+ <div class="js_subscribe sc-1cfejv7-0 iHpzjB"></div>
+ <div class="js_footer-container"></div>
+ <div class="js_lightbox-container"></div>
+ </div>
+ <script>
+ <![CDATA[
+ window.__renderData__ = {"blog":{"id":"9","name":"kotaku","displayName":"Kotaku","canonicalHost":"kotaku.com","hosts":["numbers.kotaku.com","de.kotaku.com","assets.kotaku.com","pocketmonster.kotaku.com","m.kotaku.com","uk.kotaku.com","tmi.kotaku.com","live.kotaku.com","pl.kotaku.com","toys.kotaku.com","screenburn.kotaku.com","fetch.kotaku.com","kotak.us","ru.kotaku.com","animalcrossing.kotaku.com","es.kotaku.com","br.kotaku.com","ca.kotaku.com","selects.kotaku.com","irl.kotaku.com","www.kotaku.com","watchlist.kotaku.com","nl.kotaku.com","au.kotaku.com","kotaku.kinja.com","blog.kotaku.com","kotaku.com.br","us.kotaku.com"],"status":"ENABLED","timezone":"America/New_York","timezoneOffset":-14400000,"createTimeMillis":1354577915472,"ownerId":"5724319325347612106","description":"Gaming Reviews, News, Tips and More.","properties":{"logoLink":"https://x.kinja-static.com/assets/images/logos/newsletter/kotaku-500px.png","aboutPostId":458637663,"recircGroup":"fmgNonSatire","twitterScreenName":"@kotaku","alexaId":"gmg-kotaku","hideViewcounts":true,"metaTitle":"The Gamer's Guide","videoNetwork":"kotaku","facebookPixelId":"574907642841384","singleOptIn":true,"chartbeatPopularPosts":true,"tagPageTitle":"{tag} - Gaming Reviews, News, Tips and More. | Kotaku","storyTypePageDescription":"Everything you ever wanted to know about {storyType}. News, stories, photos, videos and more.","isSearchable":true,"facebookScreenName":"kotaku","GANJA_IGNORE_GEO":["us.kotaku.com"],"groupBlog":true,"skimLinkId":"33330X911644","mainColor":"#fbc000","navigationGroup":"fmg","storyTypePageTitle":"{storyType} - Gaming Reviews, News, Tips and More. | Kotaku","robotsAllowed":true,"isGmgBlog":true,"youtubeUrl":"https://www.youtube.com/user/KotakuNYC","sitemapStartTime":"2008-02-03T00:00:00","instagramScreenName":"kotakudotcom","blogGroup":"kotaku","sourcepointDomain":"mms.kotaku.com","googleAnalyticsID":"UA-142218-8","tagPageDescription":"All of Kotaku's {tag} coverage. News, stories, photos, videos and more.","showBrowserTabType":"Category","globalVideoPage":true,"cxenseSiteId":"1141876438685671428","template":"kotaku","googleSiteVerification":"bM-oyO1vXKOAYf3H3fJQaVf8FeyOneJtVHbEYlNa7p8","newsletter":true,"fbAppId":"35737966741","campaignMonitorNewsletterName":"Kotaku_Daily","adsTxtEnabled":true},"avatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"logo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"}},"blogSales":{"id":"9","amazonInsetsEnabled":true,"amazonAffiliateTag":"kotakuamzn-20","adsEnabled":true,"adNetworkId":4246,"adSiteName":"gm.kotaku","indexExchangeWebSiteId":"80685363813128","indexExchangeAmpSiteId":"272210","bouncexId":"3592","blogNetworkId":null,"tagsExcludedFromPartnerRss":["metapost","externalPost","NSFW"],"tagsForceSynced":[],"adSlotsDisabled":[]},"disableAds":false,"features":{"superuser":false,"newrelicrum":true,"no3rdparty":false,"nosocialscripts":false,"disablereplyimages":false,"simplereach_expanded":true,"analyticstracking":true,"scribe_debug":false,"leftrail_notrending":false,"nodefaultblog":false,"frontendtiming":true,"dfp_form_related_promotions":false,"geo_features":false,"privacypolicy":false,"force_advanced_toolbar":false,"revealanalytics":false,"adx_permalink_text":true,"global_video_page":true,"permalink_paragraph_ads":true,"csp":false,"shop_button":false,"disable_confirmation_message":false,"scribe_debug_expose_html":false,"newmodalstyles":true,"infinite_scroll":true,"infinite_promotion":true,"smartnews_ads":false,"force_show_video_search":false,"amazon_georedirect":false,"dfp_lineitem_opts":true,"dfp_network_promotions":false,"samba_for_simplereach":true,"force_review_button":false,"tradedesk_pixel":true,"lightbox_newsletter_script":false,"claim_page":false,"chartbeat_video":true,"nofollowedblogs":false,"avclub_legacy_login":true,"amazon_aps_tag":true,"liveblog_new_comments_ui":false,"google_remarketing":false,"reviewbox_alignment_full_bleed":true,"piano_sandbox":false,"piano_prod":true,"hide_footer_content_guide":false,"fun_authenticated":false,"frontpage_recentvideo":true,"dynamic_edit_video":false,"force_paginate":false,"input_nav_bar":false,"paginated_category_page":false,"editor_save_screen_update":true,"scroll_vendor":true,"homepage_video_playlist":false,"storytype_boilerplate":true,"kinja_membership":false,"piano_loggedin":false,"store_already_seen_videos":false,"ab_test_feature":false,"kinja_darkmode":false,"hide_ellipsis":true,"fun_errorpages":true,"devtools":false,"smartcrop":true,"bulbs_ias":false,"disable_post_body_stream_clicks":false,"eu_disabled":false,"post_versioning":true,"kotaku_pride":false,"pure_save_button":true,"enable_experiments":false,"share_tools":true,"new_story_page_boilerplates":true,"share_tools_footer":true,"story_type_stream_below_6":true,"experimental_scores":true,"external_post_options":false,"enable_custom_subscribe_copy":false,"csp_strict":false,"kinja3_cards":false,"reading_list_delay_ads":false,"disable_skimlinks":true,"kinja3_cards_mobile_without_excerpt":false,"new_permalink_a":true,"new_permalink_b":true,"new_permalink_embiggened":false,"styled_browser_bar":false,"csp_strict_variant1":false,"csp_strict_variant2":false,"csp_strict_variant3":false,"csp_strict_variant4":false,"bucketcookies":true,"kinja_experiments_staging_test_feature_a":false,"kinja_experiments_staging_test_feature_b":false,"image_attr_url_validation":false,"kinja3_cards_phase2":true,"editor_link_insert_validation":false,"kinja3_cards_phase2_avatars":true,"meta_first":true,"second_scroll_var1":false,"second_scroll_var2":false,"native_stream_magma_rendered":false,"multiauthor_byline_toggle":false,"subscription_module_applenews":true,"subscription_module_amp":true,"native_sidebar_magma_rendered":true,"prebid":true,"blockthrough":false,"magma_second_scroll":true,"recommend_recommends":false,"native_stream_magma_rendered_phase_2":true,"mobilead_two_nodes":true,"magma_render_profiles":true,"kinja3_cards_phase3":true,"jwuploader_test_property":false,"grid_standard":false,"new_static_stream_header":true,"legacy_embiggen":true,"show_grid_overlay":false,"video_upload_captions":true,"native_stream_magma_rendered_phase_3":false,"save_querystrings":false,"enable_bouncex":true,"survey_popup":false,"featured_video_toolbar":true,"curation_on_storytype":true,"secondscroll_waypoint_a":false,"secondscroll_waypoint_b":false,"disable_ad_rule":false,"triplelift_enable":false,"enable_ga_exps":false,"native_stream_magma_rendered_phase_3_with_excerpts":true,"native_stream_magma_rendered_phase_2_with_excerpts":false,"native_stream_magma_rendered_test":false,"videoanalytics_queryparams":false,"simplereach_ad_tag":true,"blockthrough_wait_5sec":false,"blockthrough_wait_3sec":false,"ads_a9_timeout_600":false,"native_recirc_magma_rendered_test":false,"native_recirc_magma_rendered":true,"native_sidebar_magma_rendered_test":false,"comments_timing":false,"mobilead_two_nodes_amp":false,"custom_header":true,"newsletter_popup":false,"custom_kinja_standalone":true,"inarticle_player_2nd_node":false,"permalink_subscription":true,"magma_splashy_ad_logic_change":true,"magma_permalink_video_truncation":true,"featured_ads_four":false,"featured_ads_two":false,"commerce_permalink_module":true,"second_scroll_client":false,"confiant":false,"ymal_video_and_popular_posts":false,"kinja_video_page":true,"curation_toggle":true,"second_scroll_video_thumbnails":false,"restore_images":true,"disable_nongmg_kinjas":false,"slideshow":true,"no_ads":false,"disable_fbia_rss":true,"only_left_top_ad":false,"mobilead_three_nodes":false,"mobilead_three_nodes_amp":false,"devcon_script":true,"amp_skimlinks":true,"magma_amp_inarticle_videos":true,"survey_popup_permalink":false,"curated_homepage":false,"wide_rail":false,"feature_policy_header":false,"amazon_wait_for_bids":true,"recirc_sidebar":true,"load_dfp_statically":true,"ddrum":false,"theonion_podcast_player":true,"images_intersect":true,"taboola_lazy_load":false,"sourcepoint_ccpa":true,"permalink_performance":false,"specless_splashy_size":false,"sponsor_badge":false,"more_from_chartbeat":true,"videojs_debug":false,"chartbeat_powered_sidebar":true,"permalink_video_playlist":false,"refinitiv":false,"header_anchor_tags":true,"revcontent":false,"large_commerce_rail":true,"simple_image_lazyload":true,"digitrust_disable":false,"chartbeat_disable":false,"nielsen_disable":false,"fb_pixel_disable":false,"fastly_fs_test":false,"ats_enabled":false,"prebid_video":true,"curated_tagpage":false,"concurrent_editing":true,"amazon_right_rail":true,"commerce_button_inset":true,"header_simple_render":false,"parent_has_curated_homepage":false,"improved_comment_loading":false,"shortpost_nofollow":true,"medianet_headerbidding":true,"comment_nofollow":true,"right_rail_inset_a":false,"right_rail_inset_b":false,"curated_storytypepage":false,"filter_old_articles":true,"tag_follow_overwrite":false,"disable_teads":true,"sidebar_ad_whitespace":true,"bulbs_debug":false,"right_rail_show_post":false,"disallow_api":true,"ad_timeout_amazon":true,"ad_timeout_prebid":true,"ad_timeout_failsafe":true,"enable_html_sitemap":true,"count_later_posts":false,"recent_video_instream":true,"dynamic_ads_in_ads_bundle":false,"ad_script_in_head":true,"medianet_headerbidding_amp":true,"mobile_commerce_inset":true,"video_lazy_load":false,"comments_taboola_ad":true,"ad_metrics_unification":false,"improved_comment_preloading":false,"connatix":false,"prebid_video_disable_rubicon":false,"vpaid_insecure_mode":false,"prebid_video_enable_spotx":false,"msn_rss_filter_norights_images":false,"use_ad_manager":false,"amp_commerce_inset":false,"ad_mobile_after_first":false,"curated_big_story_settings":false},"sections":[{"index":1,"storyType":{"id":"76","blogId":"9","canonical":"video","title":"Video","content":"Video"},"active":false,"url":"/c/video"},{"index":2,"subBlog":{"id":"1633980057","name":"thebests","displayName":"The Bests","canonicalHost":"thebests.kotaku.com","avatar":{"id":"ncjew2plpihk2rfdipe2","format":"png","isAnimated":false,"frozenFormat":"png"},"isSubBlog":true,"description":"Our Favorite Games On Every Platform."},"active":false,"url":"//thebests.kotaku.com"},{"index":3,"featuredUrl":{"url":"https://kotaku.com/c/podcast","displayName":"Splitscreen","index":3},"active":false,"url":"https://kotaku.com/c/podcast","displayName":"Splitscreen"},{"index":4,"storyType":{"id":"1560","blogId":"9","canonical":"highlight-reel","title":"Highlight Reel","content":"Video","description":"Highlight Reel is Kotaku’s regular roundup of great plays, stunts, records and other great moments from around the gaming world. If you record an amazing feat while playing a game send it to us with a message confirming that the clip is yours at [email protected]. Or, if you see a great clip around that isn’t yours, encourage that person to send it in!"},"active":false,"url":"/c/highlight-reel"},{"index":5,"subBlog":{"id":"1538697436","name":"cosplay","displayName":"Cosplay","canonicalHost":"cosplay.kotaku.com","avatar":{"id":"ezm8ghxeumvswd9ksrmi","format":"png","isAnimated":false,"frozenFormat":"png"},"isSubBlog":true,"description":"The Best in Costume Play."},"active":false,"url":"//cosplay.kotaku.com"},{"index":6,"storyType":{"id":"69","blogId":"9","canonical":"review","title":"Review","content":"Standard"},"active":false,"url":"/c/review"},{"index":7,"featuredUrl":{"url":"https://store.kotaku.com/","displayName":"Shop","tagline":"SHOP THE COLLECTION","index":7},"active":false,"url":"https://store.kotaku.com/","displayName":"Shop","tagline":"SHOP THE COLLECTION"},{"index":900,"sponsoredSpecialSection":{"blogId":"1637558457","blog":{"id":"1637558457","name":"metal-gear","displayName":"Metal Gear Retrospective","canonicalHost":"metal-gear.kinja.com","hosts":[],"status":"ENABLED","timezone":"America/New_York","timezoneOffset":-14400000,"createTimeMillis":1561564533527,"ownerId":"5876237249236979407","description":"An ongoing series analyzing the Metal Gear games.","properties":{"robotsAllowed":true,"isLiveCustomKinja":true},"avatar":{"id":"ilpovqq5x3mrcq44d53p","format":"png","isAnimated":false,"frozenFormat":"png"},"logo":{"id":"jzy1uhmqtv9b0fn3kzss","format":"png","isAnimated":false,"frozenFormat":"png"}},"domainBlogId":"9","editorialPostIds":[],"editorialSectionHeading":"More in Metal Gear","editorialTags":[],"impactHeader":{"media":{"id":"ee2pczb239pimidxevr1","format":"png","width":3500,"height":1969,"alignment":"Center","caption":[],"syndicationRights":false,"attribution":[],"lightbox":true,"type":"Image"},"titleAlignment":"Below","overlay":"Black"},"customContent":[{"layout":"TextParagraph","type":"LunchBox"},{"layout":"ImageTextHeaderParagraphLeft","header":{"level":3,"alignment":"Left","containers":[],"value":[{"styles":[],"value":"Metal Gear Retrospective: Snake's Punishment Begins","type":"Text"}],"type":"Header"},"paragraph":{"paragraph":{"containers":[],"value":[{"styles":[],"value":"Metal Gear wants the player to fail. The game’s rough edges are part of the growing pains of an early genre, but taken in the context of the entire Metal Gear series, these challenges also feel like horrifying defense mechanisms. As Solid Snake infiltrates Outer Heaven, the player intrudes upon the game’s world. Neither are welcome, and if they’re caught, they will be destroyed.\n","type":"Text"}],"type":"Paragraph"},"alignment":"Center"},"image":{"id":"eymb86p2y03iipcivrvn","format":"png","width":2048,"height":1153,"alignment":"Center","caption":[],"syndicationRights":false,"attribution":[],"lightbox":true,"type":"Image"},"button":{"reference":"https://kotaku.com/metal-gear-the-kotaku-retrospective-1828740753","value":[{"styles":[],"value":"Read More","type":"Text"}],"type":"Link"},"postId":"1828740753","type":"LunchBox"},{"layout":"ImageTextHeaderParagraphRight","header":{"level":3,"alignment":"Left","containers":[],"value":[{"styles":[],"value":"Metal Gear 2 Retrospective: The World Spins Without Snake","type":"Text"}],"type":"Header"},"paragraph":{"paragraph":{"containers":[],"value":[{"styles":[],"value":"Metal Gear 2: Solid Snake’s defining attribute is texture. Metal Gear shaped an initial world, and Metal Gear 2 embellishes on that world by adding frictions that complicate the player’s previous relationship with the series. The results are often inconsistent; Metal Gear 2 is a game with a reach that exceeds its grasp but, also, an intoxicating and undeniable confidence.","type":"Text"}],"type":"Paragraph"},"alignment":"Center"},"image":{"id":"kxjnafqvpri8fws62ghm","format":"png","width":3000,"height":1688,"alignment":"Center","caption":[],"syndicationRights":false,"attribution":[],"lightbox":true,"type":"Image"},"button":{"reference":"https://kotaku.com/metal-gear-2-retrospective-the-world-spins-without-sna-1831544759","value":[{"styles":[],"value":"Read More","type":"Text"}],"type":"Link"},"postId":"1831544759","type":"LunchBox"},{"layout":"ImageTextHeaderParagraphLeft","header":{"level":3,"alignment":"Left","containers":[],"value":[{"styles":[],"value":"Metal Gear Solid Retrospective: 'You Enjoy All The Killing, That's Why'","type":"Text"}],"type":"Header"},"paragraph":{"paragraph":{"containers":[],"value":[{"styles":[],"value":"After Metal Gear 2: Solid Snake, the titular character went into retirement—both in the series’ fiction and real life. It would be another eight years before fans would play a Metal Gear game. That game was Metal Gear Solid, and it helped codify the stealth genre forever. Solid Snake’s story is full of betrayal, blood, and isolation.\n\n","type":"Text"}],"type":"Paragraph"},"alignment":"Center"},"image":{"id":"ee2pczb239pimidxevr1","format":"png","width":3500,"height":1969,"alignment":"Center","caption":[],"syndicationRights":false,"attribution":[],"lightbox":true,"type":"Image"},"button":{"reference":"https://kotaku.com/metal-gear-solid-retrospective-you-enjoy-all-the-killi-1835280265","value":[{"styles":[],"value":"Read More","type":"Text"}],"type":"Link"},"postId":"1835280265","type":"LunchBox"}],"socialMediaImage":{"id":"z4uhrwes9ezmqhdvfq5p","format":"png"},"attribution":"","renderBacklinks":true},"active":false,"url":"//metal-gear.kinja.com"}],"title":"The Spectacular Story Of Metroid, One Of Gaming's Richest Universes","pageType":"permalink","parentBlog":null,"post":{"postHeadline":"The Spectacular Story Of &lt;em&gt;Metroid&lt;/em&gt;, One Of Gaming&#39;s Richest Universes","postFormattedHeadline":"The Spectacular Story Of Metroid, One Of Gaming's Richest Universes","postPermalink":"https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577","adZone":"","featuredMedia":null,"replyCount":158,"embeddedVideos":[],"shareUrls":{"facebookShareUrl":"https://facebook.com/sharer.php?u=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_facebook","twitterShareUrl":"https://twitter.com/share?text=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&amp;url=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%3Futm_medium%3Dsharefromsite%26utm_source%3D_twitter","emailShareUrl":"mailto:?subject=The%20Spectacular%20Story%20Of%20Metroid%2C%20One%20Of%20Gaming's%20Richest%20Universes&body=https%3A%2F%2Fkotaku.com%2Fthe-spectacular-story-of-metroid-one-of-gamings-riche-1284029577%253Futm_medium%3Dsharefromsite%2526utm_source%3D_email","permalink":"https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577"},"videoPermalinkRecircPosts":{}},"postId":"1284029577","isRecent":false,"postHeadline":"The Spectacular Story Of Metroid, One Of Gaming's Richest Universes","postIsStarter":true,"postIsFeatured":false,"postIsSponsored":false,"postIsVideo":false,"postType":"DEFAULT","qAndAParticipants":[],"authorIds":[],"tags":[{"canonical":"metroid","urlName":"metroid","displayName":"metroid"},{"canonical":"kotakulongreads","urlName":"kotaku-longreads","displayName":"kotaku longreads"},{"canonical":"nintendo","urlName":"nintendo","displayName":"nintendo"}],"scrollListItems":["1842660990","1842660808","1842659793","1842657790","1842657719","1842657676","1842657528","1842631388","1842632937","1842629671","1842429089","1842646720","1794881447","1842596387","1842647990","1842647779","1842647138","1842646231","1842643475","1842639391"]}
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.kinja = {
+ meta: {"blog":{"id":"9","name":"kotaku","displayName":"Kotaku","canonicalHost":"kotaku.com","hosts":["numbers.kotaku.com","de.kotaku.com","assets.kotaku.com","pocketmonster.kotaku.com","m.kotaku.com","uk.kotaku.com","tmi.kotaku.com","live.kotaku.com","pl.kotaku.com","toys.kotaku.com","screenburn.kotaku.com","fetch.kotaku.com","kotak.us","ru.kotaku.com","animalcrossing.kotaku.com","es.kotaku.com","br.kotaku.com","ca.kotaku.com","selects.kotaku.com","irl.kotaku.com","www.kotaku.com","watchlist.kotaku.com","nl.kotaku.com","au.kotaku.com","kotaku.kinja.com","blog.kotaku.com","kotaku.com.br","us.kotaku.com"],"status":"ENABLED","timezone":"America/New_York","timezoneOffset":-14400000,"createTimeMillis":1354577915472,"ownerId":"5724319325347612106","description":"Gaming Reviews, News, Tips and More.","properties":{"logoLink":"https://x.kinja-static.com/assets/images/logos/newsletter/kotaku-500px.png","aboutPostId":458637663,"recircGroup":"fmgNonSatire","twitterScreenName":"@kotaku","alexaId":"gmg-kotaku","hideViewcounts":true,"metaTitle":"The Gamer's Guide","videoNetwork":"kotaku","facebookPixelId":"574907642841384","singleOptIn":true,"chartbeatPopularPosts":true,"tagPageTitle":"{tag} - Gaming Reviews, News, Tips and More. | Kotaku","storyTypePageDescription":"Everything you ever wanted to know about {storyType}. News, stories, photos, videos and more.","isSearchable":true,"facebookScreenName":"kotaku","GANJA_IGNORE_GEO":["us.kotaku.com"],"groupBlog":true,"skimLinkId":"33330X911644","mainColor":"#fbc000","navigationGroup":"fmg","storyTypePageTitle":"{storyType} - Gaming Reviews, News, Tips and More. | Kotaku","robotsAllowed":true,"isGmgBlog":true,"youtubeUrl":"https://www.youtube.com/user/KotakuNYC","sitemapStartTime":"2008-02-03T00:00:00","instagramScreenName":"kotakudotcom","blogGroup":"kotaku","sourcepointDomain":"mms.kotaku.com","googleAnalyticsID":"UA-142218-8","tagPageDescription":"All of Kotaku's {tag} coverage. News, stories, photos, videos and more.","showBrowserTabType":"Category","globalVideoPage":true,"cxenseSiteId":"1141876438685671428","template":"kotaku","googleSiteVerification":"bM-oyO1vXKOAYf3H3fJQaVf8FeyOneJtVHbEYlNa7p8","newsletter":true,"fbAppId":"35737966741","campaignMonitorNewsletterName":"Kotaku_Daily","adsTxtEnabled":true},"avatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"logo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"},"logoLink":"https://x.kinja-static.com/assets/images/logos/newsletter/kotaku-500px.png","aboutPostId":458637663,"recircGroup":"fmgNonSatire","twitterScreenName":"@kotaku","alexaId":"gmg-kotaku","hideViewcounts":true,"metaTitle":"The Gamer's Guide","videoNetwork":"kotaku","facebookPixelId":"574907642841384","singleOptIn":true,"chartbeatPopularPosts":true,"tagPageTitle":"{tag} - Gaming Reviews, News, Tips and More. | Kotaku","storyTypePageDescription":"Everything you ever wanted to know about {storyType}. News, stories, photos, videos and more.","isSearchable":true,"facebookScreenName":"kotaku","GANJA_IGNORE_GEO":["us.kotaku.com"],"groupBlog":true,"skimLinkId":"33330X911644","mainColor":"#fbc000","navigationGroup":"fmg","storyTypePageTitle":"{storyType} - Gaming Reviews, News, Tips and More. | Kotaku","robotsAllowed":true,"isGmgBlog":true,"youtubeUrl":"https://www.youtube.com/user/KotakuNYC","sitemapStartTime":"2008-02-03T00:00:00","instagramScreenName":"kotakudotcom","blogGroup":"kotaku","sourcepointDomain":"mms.kotaku.com","googleAnalyticsID":"UA-142218-8","tagPageDescription":"All of Kotaku's {tag} coverage. News, stories, photos, videos and more.","showBrowserTabType":"Category","globalVideoPage":true,"cxenseSiteId":"1141876438685671428","template":"kotaku","googleSiteVerification":"bM-oyO1vXKOAYf3H3fJQaVf8FeyOneJtVHbEYlNa7p8","newsletter":true,"fbAppId":"35737966741","campaignMonitorNewsletterName":"Kotaku_Daily","adsTxtEnabled":true},"syncFeatures":"","customFeatures":[],"post":{"adZone":"","author":{"displayName":"Gergo Vas"},"gaDimensions":{"gaVideoIds":"","wordCount":8302,"wordCountBucket":"8200 - 8400"},"headline":"The Spectacular Story Of <em>Metroid<\/em>, One Of Gaming's Richest Universes","id":"1284029577","isFeatured":false,"isVideo":false,"isSlideshow":false,"slideIndex":null,"permalink":"https://kotaku.com/the-spectacular-story-of-metroid-one-of-gamings-riche-1284029577","postPosition":0,"publishTimeMillis":1378908000474,"sponsored":false,"isStarter":true,"starterId":"1284029577","storyType":null,"tags":[{"canonical":"metroid","urlName":"metroid","displayName":"metroid"},{"canonical":"kotakulongreads","urlName":"kotaku-longreads","displayName":"kotaku longreads"},{"canonical":"nintendo","urlName":"nintendo","displayName":"nintendo"}],"truncation":false,"hasVideos":false},"commercePermalinkPosts":[{"post":{"id":"1842660540","headline":"Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More","permalink":"https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540","image":{"uid":"fmxkv4w3fn53bgahlsls","originalWidth":1280,"originalHeight":720,"format":"jpg","width":1280,"height":720,"id":"fmxkv4w3fn53bgahlsls","frozenFormat":"jpg"},"authorId":"5876237249238355545","authorNameOrByline":"","defaultBlogId":"9","defaultBlogDisplayName":"Kotaku","defaultBlogHost":"kotaku.com","defaultBlogGroup":"kotaku","defaultBlogRecircGroup":"fmgNonSatire","plainText":"A large heating pad, Comixology Marvel sale, Instant Pot, and six months of Xbox Game Pass Ultimate lead off Friday’s best from around the web. ","score":0,"publishTimeMillis":1585922400540,"defaultBlogAvatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"defaultBlogLogo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"},"isVideo":false,"amazonPrice":"","amazonPromoCode":"","originalProps":{"id":"1842660540","headline":"Friday's Best Deals: Children's Books, Circular Lamp, Memory Foam Pillows, Onsen Towels, and More","permalink":"https://kinjadeals.theinventory.com/fridays-best-deals-childrens-books-circular-lamp-mem-1842660540","image":{"uid":"fmxkv4w3fn53bgahlsls","originalWidth":1280,"originalHeight":720,"format":"jpg","width":1280,"height":720,"id":"fmxkv4w3fn53bgahlsls","frozenFormat":"jpg"},"authorId":"5876237249238355545","authorNameOrByline":"","defaultBlogId":"9","defaultBlogDisplayName":"Kotaku","defaultBlogHost":"kotaku.com","defaultBlogGroup":"kotaku","defaultBlogRecircGroup":"fmgNonSatire","plainText":"A large heating pad, Comixology Marvel sale, Instant Pot, and six months of Xbox Game Pass Ultimate lead off Friday’s best from around the web. ","score":0,"publishTimeMillis":1585922400540,"defaultBlogAvatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"defaultBlogLogo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"},"isVideo":false,"amazonPrice":"","amazonPromoCode":""}},"authors":[{"id":"5876237249238355545","screenName":"tercius","displayName":"Tercius","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"jcaeuivnqiba4tkyigru","format":"jpg","isAnimated":false,"frozenFormat":"jpg"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1542642801922,"confirmedEmail":null},{"id":"5876237249239477161","screenName":"thegabecarey","displayName":"Gabe Carey","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"athps4ffpcya8ltki1sh","format":"jpg","isAnimated":false,"frozenFormat":"jpg"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1580838192451,"confirmedEmail":null},{"id":"5876237249239545865","screenName":"hezeqiyah","displayName":"Quentyn Kennemer","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"guximzhf5lwpmfbqkqpc","format":"jpg","isAnimated":false,"frozenFormat":"jpg"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1583342960277,"confirmedEmail":null},{"id":"5876237249239598984","screenName":"jordanmcmahon","displayName":"Jordan McMahon","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"f9rslqxrljvhdn2mpoy3","format":"jpg","isAnimated":false,"frozenFormat":"jpg"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1585587052503,"confirmedEmail":null},{"id":"5876237249239477142","screenName":"ignacia","displayName":"Ignacia","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"ka7xqqfs3nogmfdrldp2","format":"png","isAnimated":false,"frozenFormat":"png"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1580837659736,"confirmedEmail":null}]},{"post":{"id":"1842658105","headline":"Buy Six Months of Xbox Game Pass Ultimate for the Price of Three","permalink":"https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105","image":{"uid":"vazlq4u31lycrfynccwx","originalWidth":1280,"originalHeight":720,"format":"jpg","width":1280,"height":720,"id":"vazlq4u31lycrfynccwx","frozenFormat":"jpg"},"authorId":"5876237249239545865","authorNameOrByline":"","defaultBlogId":"9","defaultBlogDisplayName":"Kotaku","defaultBlogHost":"kotaku.com","defaultBlogGroup":"kotaku","defaultBlogRecircGroup":"fmgNonSatire","plainText":"6 Months of Xbox Game Pass Ultimate | $45 | Amazon","score":0,"publishTimeMillis":1585909320105,"defaultBlogAvatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"defaultBlogLogo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"},"isVideo":false,"amazonPrice":"","amazonPromoCode":"","originalProps":{"id":"1842658105","headline":"Buy Six Months of Xbox Game Pass Ultimate for the Price of Three","permalink":"https://kinjadeals.theinventory.com/buy-six-months-of-xbox-game-pass-ultimate-for-the-price-1842658105","image":{"uid":"vazlq4u31lycrfynccwx","originalWidth":1280,"originalHeight":720,"format":"jpg","width":1280,"height":720,"id":"vazlq4u31lycrfynccwx","frozenFormat":"jpg"},"authorId":"5876237249239545865","authorNameOrByline":"","defaultBlogId":"9","defaultBlogDisplayName":"Kotaku","defaultBlogHost":"kotaku.com","defaultBlogGroup":"kotaku","defaultBlogRecircGroup":"fmgNonSatire","plainText":"6 Months of Xbox Game Pass Ultimate | $45 | Amazon","score":0,"publishTimeMillis":1585909320105,"defaultBlogAvatar":{"id":"v4sckews2f3bzf0ztbkf","format":"png","isAnimated":false,"frozenFormat":"png"},"defaultBlogLogo":{"id":"m9zdzkcum8jjhh7qpkaf","format":"png","isAnimated":false,"frozenFormat":"png"},"isVideo":false,"amazonPrice":"","amazonPromoCode":""}},"authors":[{"id":"5876237249239545865","screenName":"hezeqiyah","displayName":"Quentyn Kennemer","status":"enabled","isSuperuser":false,"isSales":false,"avatar":{"id":"guximzhf5lwpmfbqkqpc","format":"jpg","isAnimated":false,"frozenFormat":"jpg"},"token":null,"membership":[],"remotes":{},"authName":null,"isGmgMember":false,"isEditStaff":false,"createdMillis":1583342960277,"confirmedEmail":null}],"link":{"url":"https://www.amazon.com/dp/B07TGNFVWV?linkCode=ogi&th=1&psc=1&smid=A3ODHND3J0WMC8","provider":"amazon","headline":"Xbox Game Pass Ultimate: 3 Month Membership [Digital Code]","description":null,"thumbnails":["https://m.media-amazon.com/images/I/41xTjOl4iML.jpg"],"images":[{"id":"ffyphnwprvqfff3cthhn","format":"jpg","uri":"https://m.media-amazon.com/images/I/41xTjOl4iML.jpg","width":500,"height":500,"originalWidth":500,"originalHeight":500}],"meta":{"asin":"B07TGNFVWV","price":"44.99","conversions":"786"},"type":"none","height":null,"width":null,"sizeClass":"flex-video widescreen","autoReisize":false,"isSecure":true,"insetId":null,"originalUrl":"https://www.amazon.com/Xbox-Game-Pass-Ultimate-Membership/dp/B07TGNFVWV/","shortDescription":null,"startTime":null}}],"blogSales":{"id":"9","amazonInsetsEnabled":true,"amazonAffiliateTag":"kotakuamzn-20","adsEnabled":true,"adNetworkId":4246,"adSiteName":"gm.kotaku","indexExchangeWebSiteId":"80685363813128","indexExchangeAmpSiteId":"272210","bouncexId":"3592","blogNetworkId":null,"tagsExcludedFromPartnerRss":["metapost","externalPost","NSFW"],"tagsForceSynced":[],"adSlotsDisabled":[]},"pageType":"permalink","environmentDesc":"production:magma","isScrollActive":false},
+ categoryMeta: {"categories":""},
+ tagMeta: {"tags":"metroid,kotaku longreads,nintendo"}
+ };
+ ]]>
+ </script>
+ <script async="async" src="/x-kinja-static/assets/new-client/runtime~trackers.a80485038c85d225c097.js"></script>
+ <script async="async" src="/x-kinja-static/assets/new-client/0.dbae5dc63b4cbda565ad.js"></script>
+ <script async="async" src="/x-kinja-static/assets/new-client/vendors~adEditor~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontPage~~eb3f2f08.a6883eb2583a17a295a7.js"></script>
+ <script async="async" src="/x-kinja-static/assets/new-client/adEditor~curatedHomepage~errorPage~experiments~featuredPermalinkPage~newsletterPage~permalinkPage~pe~9288a84a.66cac4c8bb720d3ddbad.js"></script>
+ <script async="async" src="/x-kinja-static/assets/new-client/permalinkPageIdle~trackers.c278813d2f54ff256aa3.js"></script>
+ <script async="async" src="/x-kinja-static/assets/new-client/trackers.d0e941d9a281b638dd5a.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/runtime~permalinkPage.66e46354e7f840ca24ad.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~categoryPage~curatedHomepage~featuredPermalinkPage~frontPage~hamburger-menu~header~image~imp~c3252dce.436e24a3a4ef007064ee.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~adEditor~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontPage~~42d198c1.00468c8e4744beb4949e.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~adEditor~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontPage~~8379534a.bb03871c80f38458f237.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~browser-logs~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontP~b17b93e7.93f57e8d555d7b8a365e.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~adEditor~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontPage~~19904265.e182978c4e04fa08d1a1.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~categoryPage~curatedHomepage~errorPage~experiments~featuredPermalinkPage~frontPage~permalink~52f86dd3.a3bf982db8ac12c972f4.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~categoryPage~curatedHomepage~featuredPermalinkPage~frontPage~header~lunchbox-read-only-compo~84b37b4e.23edd58b2f6c0dbe0081.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~categoryPage~curatedHomepage~featuredPermalinkPage~frontPage~lunchbox-read-only-component~pe~045ae5d8.96a119d6d9e4856c1362.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/vendors~categoryPage~curatedHomepage~featuredPermalinkPage~frontPage~permalinkPage~searchPage~slides~a3dad056.b6c50ff3a5cb5bc3a8e6.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/curation-utils~embiggen~featuredPermalinkPage~homepage-edit~in-article-selector~inArticleAdTools~out~4fb4640d.735d21b4d44bf8002feb.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/adEditor~errorPage~experiments~featuredPermalinkPage~newsletterPage~permalinkPage~permalinkPageIdle~~7cddaefd.8d0c1b704d05907e48ab.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/adEditor~errorPage~experiments~featuredPermalinkPage~permalinkPage~permalinkPageIdle~profilePage~sea~3a495c6d.59edbdd41c30046114ac.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/errorPage~featuredPermalinkPage~permalinkPage~permalinkPageIdle~profilePage~searchPage~slideshowPerm~06881b51.91b46446b5efe4d81f1f.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/outstreamNativeView~permalinkPage~permalinkPageIdle~slideshowPermalinkPage~videojsIframe.f16340c882602d783e4c.js"></script>
+ <script async="async" src="//x.kinja-static.com/assets/new-client/permalinkPage.66ff393cde34ac7bfae9.js"></script>
+ <div class="js_modal"></div>
+ <div id="kinja-bucket-setter"></div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-images.json
new file mode 100644
index 000000000..140777678
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-images.json
@@ -0,0 +1,4 @@
+[
+ "https:\/\/p3-juejin.byteimg.com\/tos-cn-i-k3u1fbpfcp\/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.jpg",
+ "https:\/\/p3-juejin.byteimg.com\/tos-cn-i-k3u1fbpfcp\/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-metadata.json
new file mode 100644
index 000000000..60bd1f2db
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": null,
+ "Image": null,
+ "Title": "Lazy Load with Alt includes jpg\/png\/webp extensions",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected.html
new file mode 100644
index 000000000..9016e8583
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/expected.html
@@ -0,0 +1,8 @@
+<div>
+ <article>
+ <h2>Test Case 1</h2>
+ <img data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.jpg" alt="performance.jpg" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.jpg">
+ <h2>Test Case 2</h2>
+ <img data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.png" alt="performance.jpg" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.png">
+ </article>
+</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/source.html
new file mode 100644
index 000000000..b4a3df858
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lazy-image-3/source.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Lazy Load with Alt includes jpg/png/webp extensions</title>
+</head>
+<body>
+ <article class="markdown-body">
+ <h2>Test Case 1</h2>
+ <img class="lazyload inited loaded"
+ data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.jpg"
+ alt="performance.jpg"
+ />
+ <h2>Test Case 2</h2>
+ <img class="lazyload inited loaded"
+ data-src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0579d17015b145a88dd93992c6447d7d~tplv-k3u1fbpfcp-watermark.png"
+ alt="performance.jpg"
+ />
+ </article>
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json
index a45fcaf97..0f462101a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "Author": null,
+ "Author": "Martin Untersinger (avec Damien Leloup et Morgane Tual)",
"Direction": null,
"Excerpt": "Largement approuvé par les députés, le texte sera désormais examiné par le Sénat, puis le Conseil constitutionnel.",
"Image": "http:\/\/s1.lemde.fr\/image\/2015\/05\/05\/600x315\/4628128_3_47fc_projet-de-loi-renseignement_aeba800424730d672d1bd08faf203438.jpg",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html
index dd91ed502..bb3a0d89f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-1/expected.html
@@ -1,38 +1,33 @@
-<p> <span data-source="Le Monde.fr" id="publisher" itemprop="Publisher">Le Monde</span> |
- <time datetime="2015-05-04T13:36:31+02:00" itemprop="datePublished">04.05.2015 à 13h36</time> • Mis à jour le
- <time datetime="2015-05-05T20:13:12+02:00" itemprop="dateModified">05.05.2015 à 20h13</time> | <span>
-Par <span itemprop="author"> <a href="http://fakehost/journaliste/martin-untersinger/" target="_blank">Martin Untersinger</a> (avec Damien Leloup et Morgane Tual)
- </span> </span>
- </p><div id="articleBody" itemprop="articleBody">
+<div id="articleBody" itemprop="articleBody">
<p>
- <iframe frameborder="0" height="320" src="//www.dailymotion.com/embed/video/x2p552m?syndication=131181" width="534"></iframe>
+ <iframe src="//www.dailymotion.com/embed/video/x2p552m?syndication=131181" frameborder="0" width="534" height="320"></iframe>
</p>
- <p>Les députés ont, sans surprise, adopté à une large majorité (438 contre 86 et 42 abstentions) le projet de loi sur le renseignement défendu par le gouvernement lors d’un vote solennel, mardi 5 mai. Il sera désormais examiné par le Sénat, puis le Conseil constitutionnel, prochainement saisi par 75 députés. Dans un souci d'apaisement, François Hollande avait annoncé par avance qu'il saisirait les Sages.</p>
+ <p>Les députés ont, sans surprise, adopté à une large majorité (438 contre 86 et 42 abstentions) le projet de loi sur le renseignement défendu par le gouvernement lors d’un vote solennel, mardi&nbsp;5&nbsp;mai. Il sera désormais examiné par le Sénat, puis le Conseil constitutionnel, prochainement saisi par 75 députés. Dans un souci d'apaisement, François Hollande avait annoncé par avance qu'il saisirait les Sages.</p>
<p><strong>Revivez <a href="http://fakehost/pixels/live/2015/05/05/suivez-le-vote-de-la-loi-renseignement-en-direct_4628012_4408996.html">le direct du vote à l’Assemblée avec vos questions.</a></strong></p>
<p>Ont voté contre : 10 députés socialistes (sur 288), 35 UMP (sur 198), 11 écologistes (sur 18), 11 UDI (sur 30), 12 députés Front de gauche (sur 15) et 7 non-inscrits (sur 9). <a href="http://www2.assemblee-nationale.fr/scrutins/detail/%28legislature%29/14/%28num%29/1109">Le détail est disponible sur le site de l'Assemblée nationale.</a></p>
<p>Parmi les députés ayan voté contre figurent notamment des opposants de la première heure, comme l'UMP Laure de la Raudière ou l'écologiste Sergio Coronado, mais aussi quelques poids lourds de l'opposition comme Patrick Devedjian ou Claude Goasguen. A gauche, on trouve parmi les quelque opposants au texte Aurélie Filipetti. Christian Paul, qui avait été très actif lors d'autres débats sur les libertés numériques, s'est abstenu.</p>
- <p>Pouria Amirshahi, député socialiste des Français de l'étranger qui a également voté contre, a annoncé qu'il transmettrait un « mémorandum argumenté » au Conseil constitutionnel et demanderait à se faire auditionner sur le projet de loi. D'autres députés ont prévu de faire la même démarche.</p>
+ <p>Pouria Amirshahi, député socialiste des Français de l'étranger qui a également voté contre, a annoncé qu'il transmettrait un «&nbsp;mémorandum argumenté » au Conseil constitutionnel et demanderait à se faire auditionner sur le projet de loi. D'autres députés ont prévu de faire la même démarche.</p>
<p>Ce texte, fortement décrié par la société civile pour son manque de contre-pouvoir et le caractère intrusif des techniques qu’il autorise, entend donner un cadre aux pratiques des services de renseignement, rendant légales certaines pratiques qui, jusqu’à présent, ne l’étaient pas.</p>
<p><u>Retour sur ses principales dispositions, après son passage en commission des lois et après le débat en séance publique.</u></p>
<h2>Définition des objectifs des services</h2>
- <p>Le projet de loi énonce les domaines que peuvent invoquer les services pour justifier leur surveillance. Il s’agit notamment, de manière attendue, de <em>« l’indépendance nationale, de l’intégrité du territoire et de la défense nationale »</em> et de<em> « la prévention du terrorisme »,</em> mais également des <em>« intérêts majeurs de la politique étrangère »,</em> ainsi que de la <em>« prévention des atteintes à la forme républicaine des institutions »</em> et de <em>« la criminalité et de la délinquance organisées »</em>. Des formulations parfois larges qui inquiètent les opposants au texte qui craignent qu’elles puissent permettre de surveiller des activistes ou des manifestants.</p>
+ <p>Le projet de loi énonce les domaines que peuvent invoquer les services pour justifier leur surveillance. Il s’agit notamment, de manière attendue, de <em>«&nbsp;l’indépendance nationale, de l’intégrité du territoire et de la défense nationale&nbsp;»</em> et de<em> «&nbsp;la prévention du terrorisme&nbsp;»,</em> mais également des <em>«&nbsp;intérêts majeurs de la politique étrangère&nbsp;»,</em> ainsi que de la <em>«&nbsp;prévention des atteintes à la forme républicaine des institutions&nbsp;»</em> et de <em>«&nbsp;la criminalité et de la délinquance organisées&nbsp;»</em>. Des formulations parfois larges qui inquiètent les opposants au texte qui craignent qu’elles puissent permettre de surveiller des activistes ou des manifestants.</p>
<h2>La Commission de contrôle</h2>
<p>Le contrôle de cette surveillance sera confié à une nouvelle autorité administrative indépendante, la Commission nationale de contrôle des techniques de renseignement (CNCTR), composée de six magistrats du Conseil d’Etat et de la Cour de cassation, de trois députés et trois sénateurs de la majorité et de l’opposition, et d’un expert technique. Elle remplacera l’actuelle Commission nationale de contrôle des interceptions de sécurité (CNCIS).</p>
- <p>Elle délivrera son avis, sauf cas d’urgence, avant toute opération de surveillance ciblée. Deux types urgences sont prévus par la loi : d’un côté une <em>« urgence absolue »</em>, pour laquelle un agent pourra se passer de l’avis de la CNCTR mais pas de l’autorisation du premier ministre. De l’autre, une urgence opérationnelle extrêmement limitée, notamment en termes de techniques, à l’initiative du chef du service de renseignement, qui se passe de l’avis de la CNCTR. Ces cas d’urgence ne justifieront pas l’intrusion d’un domicile ni la surveillance d’un journaliste, un parlementaire ou un avocat. Dans ces cas, la procédure classique devra s’appliquer.</p>
+ <p>Elle délivrera son avis, sauf cas d’urgence, avant toute opération de surveillance ciblée. Deux types urgences sont prévus par la loi&nbsp;: d’un côté une <em>«&nbsp;urgence absolue&nbsp;»</em>, pour laquelle un agent pourra se passer de l’avis de la CNCTR mais pas de l’autorisation du premier ministre. De l’autre, une urgence opérationnelle extrêmement limitée, notamment en termes de techniques, à l’initiative du chef du service de renseignement, qui se passe de l’avis de la CNCTR. Ces cas d’urgence ne justifieront pas l’intrusion d’un domicile ni la surveillance d’un journaliste, un parlementaire ou un avocat. Dans ces cas, la procédure classique devra s’appliquer.</p>
<p>L’avis de la CNCTR ne sera pas contraignant, mais cette commission pourra saisir le Conseil d’Etat si elle estime que la loi n’est pas respectée et elle disposera de pouvoirs d’enquête. Ce recours juridictionnel est une nouveauté dans le monde du renseignement.</p>
- <h2>Les « boîtes noires »</h2>
- <p>Une des dispositions les plus contestées de ce projet de loi prévoit de pouvoir contraindre les fournisseurs d’accès à Internet (FAI) à « <em>détecter une menace terroriste sur la base d’un traitement automatisé ». </em>Ce dispositif – autorisé par le premier ministre par tranche de quatre mois – permettrait de détecter, en temps réel ou quasi réel, les personnes ayant une activité en ligne typique de « schémas » utilisés par les terroristes pour transmettre des informations.</p>
- <p>En pratique, les services de renseignement pourraient installer chez les FAI une « boîte noire » surveillant le trafic. Le contenu des communications – qui resterait « anonyme » – ne serait pas surveillé, mais uniquement les métadonnées : origine ou destinataire d’un message, adresse IP d’un site visité, durée de la conversation ou de la connexion… Ces données ne seraient pas conservées.</p>
+ <h2>Les «&nbsp;boîtes noires&nbsp;»</h2>
+ <p>Une des dispositions les plus contestées de ce projet de loi prévoit de pouvoir contraindre les fournisseurs d’accès à Internet (FAI) à «&nbsp;<em>détecter une menace terroriste sur la base d’un traitement automatisé&nbsp;». </em>Ce dispositif –&nbsp;autorisé par le premier ministre par tranche de quatre mois&nbsp;– permettrait de détecter, en temps réel ou quasi réel, les personnes ayant une activité en ligne typique de «&nbsp;schémas&nbsp;» utilisés par les terroristes pour transmettre des informations.</p>
+ <p>En pratique, les services de renseignement pourraient installer chez les FAI une «&nbsp;boîte noire&nbsp;» surveillant le trafic. Le contenu des communications – qui resterait «&nbsp;anonyme&nbsp;» – ne serait pas surveillé, mais uniquement les métadonnées&nbsp;: origine ou destinataire d’un message, adresse IP d’un site visité, durée de la conversation ou de la connexion… Ces données ne seraient pas conservées.</p>
<p>La Commission nationale informatique et libertés<strong> </strong>(CNIL), qui critique fortement cette disposition. La CNIL soulève notamment que l’anonymat de ces données est très relatif, puisqu’il peut être levé.</p>
- <p>Lire aussi : <a href="http://fakehost/pixels/article/2015/03/18/les-critiques-de-la-cnil-contre-le-projet-de-loi-sur-le-renseignement_4595839_4408996.html">Les critiques de la CNIL contre le projet de loi sur le renseignement</a> </p>
- <p>Le dispositif introduit une forme de « pêche au chalut » – un brassage très large des données des Français à la recherche de quelques individus. Le gouvernement se défend de toute similarité avec les dispositifs mis en place par la NSA américaine, arguant notamment que les données ne seront pas conservées et que cette activité sera contrôlée par une toute nouvelle commission aux moyens largement renforcés. Il s’agit cependant d’un dispositif très large, puisqu’il concernera tous les fournisseurs d’accès à Internet, et donc tous les internautes français.</p>
- <h2>L’élargissement de la surveillance électronique pour détecter les « futurs » terroristes</h2>
- <p>La surveillance des métadonnées sera aussi utilisée pour tenter de détecter de nouveaux profils de terroristes potentiels, prévoit le projet de loi. Le gouvernement considère qu’il s’agit d’une manière efficace de détecter les profils qui passent aujourd’hui <em>« entre les mailles du filet »</em>, par exemple des personnes parties en Syrie ou en Irak sans qu’aucune activité suspecte n’ait été décelée avant leur départ.</p>
+ <p>Lire aussi&nbsp;: <a href="http://fakehost/pixels/article/2015/03/18/les-critiques-de-la-cnil-contre-le-projet-de-loi-sur-le-renseignement_4595839_4408996.html">Les critiques de la CNIL contre le projet de loi sur le renseignement</a> </p>
+ <p>Le dispositif introduit une forme de «&nbsp;pêche au chalut&nbsp;» –&nbsp;un brassage très large des données des Français à la recherche de quelques individus. Le gouvernement se défend de toute similarité avec les dispositifs mis en place par la NSA américaine, arguant notamment que les données ne seront pas conservées et que cette activité sera contrôlée par une toute nouvelle commission aux moyens largement renforcés. Il s’agit cependant d’un dispositif très large, puisqu’il concernera tous les fournisseurs d’accès à Internet, et donc tous les internautes français.</p>
+ <h2>L’élargissement de la surveillance électronique pour détecter les «&nbsp;futurs&nbsp;» terroristes</h2>
+ <p>La surveillance des métadonnées sera aussi utilisée pour tenter de détecter de nouveaux profils de terroristes potentiels, prévoit le projet de loi. Le gouvernement considère qu’il s’agit d’une manière efficace de détecter les profils qui passent aujourd’hui <em>«&nbsp;entre les mailles du filet&nbsp;»</em>, par exemple des personnes parties en Syrie ou en Irak sans qu’aucune activité suspecte n’ait été décelée avant leur départ.</p>
<p>Pour repérer ces personnes, la loi permettra d’étendre la surveillance électronique à toutes les personnes en contact avec des personnes déjà suspectées. En analysant leurs contacts, la fréquence de ces derniers et les modes de communication, les services de renseignement espèrent pouvoir détecter ces nouveaux profils en amont.</p>
<h2>De nouveaux outils et méthodes de collecte</h2>
<p>Les services pourront également procéder, après un avis de la CNCTR, à la pose de micros dans une pièce ou de mouchards sur un objet (voiture par exemple), ou à l’intérieur d’un ordinateur. L’utilisation des IMSI-catchers (fausses antennes qui permettent d’intercepter des conversations téléphoniques) est également légalisée, pour les services de renseignement, dans certains cas. Le nombre maximal de ces appareils sera fixé par arrêté du premier ministre après l’avis de la CNCTR.</p>
- <p><strong>Lire : <a href="http://fakehost/pixels/article/2015/03/31/que-sont-les-imsi-catchers-ces-valises-qui-espionnent-les-telephones-portables_4605827_4408996.html">Que sont les IMSI-catchers, ces valises qui espionnent les téléphones portables ?</a></strong></p>
- <p>La loi introduit également des mesures de surveillance internationale : concrètement, les procédures de contrôle seront allégées lorsqu’un des « bouts » de la communication sera situé à l’étranger (concrètement, un Français qui parle avec un individu situé à l’étranger). Cependant, comme l’a souligné l’Arcep (l’Autorité de régulation des communications électroniques et des postes), sollicitée pour le versant technique de cette mesure, il est parfois difficile de s’assurer qu’une communication, même passant par l’étranger, ne concerne pas deux Français.</p>
+ <p><strong>Lire&nbsp;: <a href="http://fakehost/pixels/article/2015/03/31/que-sont-les-imsi-catchers-ces-valises-qui-espionnent-les-telephones-portables_4605827_4408996.html">Que sont les IMSI-catchers, ces valises qui espionnent les téléphones portables&nbsp;?</a></strong></p>
+ <p>La loi introduit également des mesures de surveillance internationale&nbsp;: concrètement, les procédures de contrôle seront allégées lorsqu’un des «&nbsp;bouts&nbsp;» de la communication sera situé à l’étranger (concrètement, un Français qui parle avec un individu situé à l’étranger). Cependant, comme l’a souligné l’Arcep (l’Autorité de régulation des communications électroniques et des postes), sollicitée pour le versant technique de cette mesure, il est parfois difficile de s’assurer qu’une communication, même passant par l’étranger, ne concerne pas deux Français.</p>
<h2>Un nouveau fichier</h2>
<p>La loi crée un fichier judiciaire national automatisé des auteurs d’infractions terroristes (Fijait), dont les données pourront être conservées pendant vingt ans.</p>
<p>Ce fichier concerne les personnes ayant été condamnées, même si une procédure d’appel est en cours. Les mineurs pourront aussi être inscrits dans ce fichier et leurs données conservées jusqu’à dix ans. L’inscription ne sera pas automatique et se fera sur décision judiciaire. Certaines mises en examen pourront aussi apparaître sur ce fichier. En cas de non-lieu, relaxe, acquittement, amnistie ou réhabilitation, ces informations seront effacées.</p>
@@ -40,7 +35,7 @@ Par <span itemprop="author"> <a href="http://fakehost/journalist
<p>Le renseignement pénitentiaire pourra, dans des conditions qui seront fixées par décret, profiter des techniques que légalise le projet de loi pour les services de renseignement. La ministre de la justice, Christiane Taubira, était défavorable à cette disposition, soutenue par le rapporteur du texte, la droite et une partie des députés de gauche. Pour la ministre, cette innovation va dénaturer le renseignement pénitentiaire et le transformer en véritable service de renseignement.</p>
<h2>Conservation des données</h2>
<p>La CNIL <a href="http://www.cnil.fr/fileadmin/documents/La_CNIL/actualite/Les_propositions_de_la_CNIL_sur_les_evolutions_de_la_loi_Informatique_et_Libertes.pdf">a fait part à plusieurs reprises de sa volonté</a> d’exercer sa mission de contrôle sur les fichiers liés au renseignement, qui seront alimentés par ces collectes. Ces fichiers sont aujourd’hui exclus du périmètre d’action de la CNIL.</p>
- <p>La durée de conservation des données collectées – et l’adaptation de cette durée à la technique employée – a par ailleurs été inscrite dans la loi, contrairement au projet initial du gouvernement qui entendait fixer ces limites par décret. Elle pourra aller jusqu’à cinq ans dans le cas des données de connexion.</p>
+ <p>La durée de conservation des données collectées –&nbsp;et l’adaptation de cette durée à la technique employée&nbsp;– a par ailleurs été inscrite dans la loi, contrairement au projet initial du gouvernement qui entendait fixer ces limites par décret. Elle pourra aller jusqu’à cinq ans dans le cas des données de connexion.</p>
<h2>Un dispositif pour les lanceurs d’alerte</h2>
- <p>La loi prévoit également une forme de protection pour les agents qui seraient témoins de surveillance illégale. Ces lanceurs d’alerte pourraient solliciter la CNCTR, voire le premier ministre, et leur fournir toutes les pièces utiles. La CNCTR pourra ensuite aviser le procureur de la République et solliciter la Commission consultative du secret de la défense nationale afin que cette dernière <em>« donne au premier ministre son avis sur la possibilité de déclassifier tout ou partie de ces éléments »</em>. Aucune mesure de rétorsion ne pourra viser l’agent qui aurait dénoncé des actes potentiellement illégaux.</p>
+ <p>La loi prévoit également une forme de protection pour les agents qui seraient témoins de surveillance illégale. Ces lanceurs d’alerte pourraient solliciter la CNCTR, voire le premier ministre, et leur fournir toutes les pièces utiles. La CNCTR pourra ensuite aviser le procureur de la République et solliciter la Commission consultative du secret de la défense nationale afin que cette dernière <em>«&nbsp;donne au premier ministre son avis sur la possibilité de déclassifier tout ou partie de ces éléments&nbsp;»</em>. Aucune mesure de rétorsion ne pourra viser l’agent qui aurait dénoncé des actes potentiellement illégaux.</p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json
index c402d3e27..eb7aee3dc 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": null,
+ "Author": "Collectif",
"Direction": null,
- "Excerpt": "Le retour à la stabilité coûtera des milliards d'euros, mais l'Union européenne en vaut la peine, estime un collectif d'industriels.",
+ "Excerpt": "Le retour \u00e0 la stabilit\u00e9 co\u00fbtera des milliards d'euros, mais l'Union europ\u00e9enne en vaut la peine, estime un collectif d'industriels.",
"Image": "http:\/\/s1.lemde.fr\/medias\/web\/1.2.705\/img\/placeholder\/default.png",
- "Title": "La crise européenne est une crise de la dette, pas de l'euro",
- "SiteName": "Le Monde.fr"
-}
+ "Title": "La crise europ\u00e9enne est une crise de la dette, pas de l'euro",
+ "SiteName": "Le Monde"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html
index af69efe32..69f6da53a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lemonde-2/expected.html
@@ -1,13 +1,14 @@
<p itemprop="description">Le retour à la stabilité coûtera des milliards d'euros, mais l'Union européenne en vaut la peine, estime un collectif d'industriels.</p><div id="articleBody" itemprop="articleBody">
<h2>L'union monétaire s'enlise dans la crise, l'euro reste soumis au feu des critiques. C'est le bilan des nombreux <a href="http://www.lemonde.fr/afrique-debats/" title="Toute l’actualité débats">débats</a> qui ont eu lieu ces derniers mois.</h2>
-<p>En tant qu'industriels allemands et français, qui ont la responsabilité de 1 500 milliards d'euros de chiffre d'affaires et de cinq millions de salariés dans <a href="http://www.lemonde.fr/le-monde/" title="Toute l’actualité le monde">le monde</a> entier, nous nous soucions de l'<a href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir/" onclick="return false;" target="_blank" title="Conjugaison du verbe avenir">avenir</a> de l'euro et de l'union économique et monétaire européenne. L'<a href="http://www.lemonde.fr/histoire/" title="Toute l’actualité histoire">histoire</a> de l'euro est une véritable réussite. Qui aurait pensé, lorsque l'euro a été introduit il y a douze ans, qu'il aurait aujourd'hui gagné en valeur par rapport au dollar et de nombreuses autres monnaies ?</p>
+<p>En tant qu'industriels allemands et français, qui ont la responsabilité de 1 500 milliards d'euros de chiffre d'affaires et de cinq millions de salariés dans <a href="http://www.lemonde.fr/le-monde/" title="Toute l’actualité le monde">le monde</a> entier, nous nous soucions de l'<a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/avenir/" title="Conjugaison du verbe avenir">avenir</a> de l'euro et de l'union économique et monétaire européenne. L'<a href="http://www.lemonde.fr/histoire/" title="Toute l’actualité histoire">histoire</a> de l'euro est une véritable réussite. Qui aurait pensé, lorsque l'euro a été introduit il y a douze ans, qu'il aurait aujourd'hui gagné en valeur par rapport au dollar et de nombreuses autres monnaies ?</p>
<p>L'euro s'est imposé comme seconde monnaie de référence à côté du dollar et a renforcé le rôle de l'<a href="http://www.lemonde.fr/europe/" title="Toute l’actualité Europe">Europe</a> en tant que puissance économique. Avec l'euro, un marché commun doté d'une monnaie unique et sans fluctuation de cours de change a vu le jour, créant ainsi prospérité et richesse pour nous tous. Depuis son introduction, près de 9 millions de nouveaux emplois ont été créés dans la zone euro. Les <a href="http://www.lemonde.fr/entreprises/" title="Toute l’actualité entreprises">entreprises</a> européennes profitent de ce <a href="http://www.lemonde.fr/developpement/" title="Toute l’actualité développement">développement</a>. Elles ont élargi leurs capacités de financement et augmenté leur compétitivité à l'<a href="http://www.lemonde.fr/international/" title="Toute l’actualité international">international</a>.</p>
-<p>Le ralentissement de l'économie mondiale a conduit certains pays de l'union monétaire à s'<a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/endetter/" onclick="return false;" target="_blank" title="Conjugaison du verbe endetter">endetter</a> encore davantage. A court terme, ces pays doivent <a href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre/" onclick="return false;" target="_blank" title="Conjugaison du verbe être">être</a> aidés pour <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/regagner/" onclick="return false;" target="_blank" title="Conjugaison du verbe regagner">regagner</a> leur indépendance financière et <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/recr%C3%A9er/" onclick="return false;" target="_blank" title="Conjugaison du verbe recréer">recréer</a> les conditions d'un avenir meilleur pour leur <a href="http://www.lemonde.fr/demographie/" title="Toute l’actualité population">population</a>.</p>
-<p>En contrepartie, des mesures efficaces doivent être mises en oeuvre. Le retour à une situation financière stable coûtera de nombreux milliards d'euros, mais l'<a href="http://www.lemonde.fr/union-europeenne/" title="Toute l’actualité Union européenne">Union européenne</a> et notre monnaie commune en valent la peine. Nous devons <a href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/convaincre/" onclick="return false;" target="_blank" title="Conjugaison du verbe convaincre">convaincre</a> nos concitoyens de cela.</p>
+<p>Le ralentissement de l'économie mondiale a conduit certains pays de l'union monétaire à s'<a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/endetter/" title="Conjugaison du verbe endetter">endetter</a> encore davantage. A court terme, ces pays doivent <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/auxiliaire/%C3%AAtre/" title="Conjugaison du verbe être">être</a> aidés pour <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/regagner/" title="Conjugaison du verbe regagner">regagner</a> leur indépendance financière et <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/recr%C3%A9er/" title="Conjugaison du verbe recréer">recréer</a> les conditions d'un avenir meilleur pour leur <a href="http://www.lemonde.fr/demographie/" title="Toute l’actualité population">population</a>.</p>
+<p>En contrepartie, des mesures efficaces doivent être mises en oeuvre. Le retour à une situation financière stable coûtera de nombreux milliards d'euros, mais l'<a href="http://www.lemonde.fr/union-europeenne/" title="Toute l’actualité Union européenne">Union européenne</a> et notre monnaie commune en valent la peine. Nous devons <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/troisieme-groupe/convaincre/" title="Conjugaison du verbe convaincre">convaincre</a> nos concitoyens de cela.</p>
<p><strong>RÈGLES PLUS STRICTES</strong></p>
-<p>Nous avons besoin d'une <a href="http://www.lemonde.fr/politique/" title="Toute l’actualité politique">politique</a> économique européenne et de règles de stabilité plus strictes. Pour <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/%C3%A9viter/" onclick="return false;" target="_blank" title="Conjugaison du verbe éviter">éviter</a>, à l'avenir, une crise telle que celle que nous traversons actuellement, nous devons <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/renforcer/" onclick="return false;" target="_blank" title="Conjugaison du verbe renforcer">renforcer</a> les règles de stabilité existantes et <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/assurer/" onclick="return false;" target="_blank" title="Conjugaison du verbe assurer">assurer</a> leur respect. Les solutions envisagées, comme, par exemple, l'<a href="http://www.lemonde.fr/exclusion/" title="Toute l’actualité exclusion">exclusion</a> de pays membres de la zone euro ou la scission entre une Union des pays du Nord et du Sud, ne sont pas bonnes. Cela aurait des conséquences qui sont difficilement prévisibles aujourd'hui. De telles propositions démagogiques ne sont pas adaptées à la gravité de la situation.</p>
-<p>Cependant, des mesures doivent être prises à temps et être aussi efficaces que possible. De plus, les Etats membres doivent <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/coordonner/" onclick="return false;" target="_blank" title="Conjugaison du verbe coordonner">coordonner</a>, plus étroitement qu'auparavant, leur <a href="http://www.lemonde.fr/afrique-politique/" title="Toute l’actualité politique">politique</a> économique intérieure et <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/parler/" onclick="return false;" target="_blank" title="Conjugaison du verbe parler">parler</a> d'une seule voix vis-à-vis de l'extérieur.</p>
-<p>En tant qu'industriels allemands et français, nous voulons <a href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/souligner/" onclick="return false;" target="_blank" title="Conjugaison du verbe souligner">souligner</a> les immenses avantages que l'espace monétaire commun a apportés. Nous envoyons un message de soutien aux responsables politiques, afin qu'ils mettent en place des conditions nécessaires à un euro durablement stable et compétitif. C'est la base de la future prospérité en Europe. L'union monétaire a durablement besoin de <a href="http://www.lemonde.fr/finance/" title="Toute l’actualité finances">finances</a> publiques solides, de règles de responsabilité claires, de structures transparentes et de conditions de concurrence équitables.</p>
+<p>Nous avons besoin d'une <a href="http://www.lemonde.fr/politique/" title="Toute l’actualité politique">politique</a> économique européenne et de règles de stabilité plus strictes. Pour <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/%C3%A9viter/" title="Conjugaison du verbe éviter">éviter</a>, à l'avenir, une crise telle que celle que nous traversons actuellement, nous devons <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/renforcer/" title="Conjugaison du verbe renforcer">renforcer</a> les règles de stabilité existantes et <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/assurer/" title="Conjugaison du verbe assurer">assurer</a> leur respect. Les solutions envisagées, comme, par exemple, l'<a href="http://www.lemonde.fr/exclusion/" title="Toute l’actualité exclusion">exclusion</a> de pays membres de la zone euro ou la scission entre une Union des pays du Nord et du Sud, ne sont pas bonnes. Cela aurait des conséquences qui sont difficilement prévisibles aujourd'hui. De telles propositions démagogiques ne sont pas adaptées à la gravité de la situation.</p>
+<p>Cependant, des mesures doivent être prises à temps et être aussi efficaces que possible. De plus, les Etats membres doivent <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/coordonner/" title="Conjugaison du verbe coordonner">coordonner</a>, plus étroitement qu'auparavant, leur <a href="http://www.lemonde.fr/afrique-politique/" title="Toute l’actualité politique">politique</a> économique intérieure et <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/parler/" title="Conjugaison du verbe parler">parler</a> d'une seule voix vis-à-vis de l'extérieur.</p>
+<p>En tant qu'industriels allemands et français, nous voulons <a target="_blank" onclick="return false;" href="http://conjugaison.lemonde.fr/conjugaison/premier-groupe/souligner/" title="Conjugaison du verbe souligner">souligner</a> les immenses avantages que l'espace monétaire commun a apportés. Nous envoyons un message de soutien aux responsables politiques, afin qu'ils mettent en place des conditions nécessaires à un euro durablement stable et compétitif. C'est la base de la future prospérité en Europe. L'union monétaire a durablement besoin de <a href="http://www.lemonde.fr/finance/" title="Toute l’actualité finances">finances</a> publiques solides, de règles de responsabilité claires, de structures transparentes et de conditions de concurrence équitables.</p>
<p>Ce n'est qu'à ces conditions que l'euro sortira renforcé de la crise de la dette. Il n'y a pas d'alternative sérieuse à l'euro commun. L'euro symbolise l'Europe d'aujourd'hui. Un échec de l'euro serait un revers fatal pour l'Europe.</p>
-<hr></hr><p>
-Appel Frank (Deutsche Post) ; Aschenbroich Jacques (Valeo) ; Berger Roland (Roland Berger Strategy Consultants) ; Bock Kurt (BASF) ; Bories Christel (Constellium) ; Borsig Clemens (Deutsche Bank) ; Brunck Robert (CGG Veritas) ; Buffet Patrick (Eramet) ; Burda Hubert (Hubert Burda Media Holding) ; Caparros Alain (Rewe group) ; Clamadieu Jean-Pierre (Rhodia) ; Cromme Gerhard (ThyssenKrupp) ; Crouzet Philippe (Vallourec) ; de Chalendar Pierre-André (Saint-Gobain) ; de Margerie Christophe (Total) ; de Romanet Augustin (Caisse des dépôts et consignations) ; Degenhart Elmar (Continental) ; Diekmann Michael (Allianz) ; Engel Klaus (Evonik Industries) ; Fehrenbach Franz (Robert Bosch) ; Frérot Antoine (Veolia <a href="http://www.lemonde.fr/environnement/" title="Toute l’actualité Environnement">Environnement</a>) ; Hagemann Snabe Jim (SAP) ; Henrot François (Groupe Rothschild Cie Banque) ; Hermelin Paul (Cap Gemini) ; Kormann Hermut (Lazard) ; Kron Patrick (Alstom) ; Lachmann Henri (Schneider Electric) ; Lafont Bruno (Lafarge) ; Lauvergeon Anne (Areva) ; Lévy Maurice (Publicis Groupe SA) ; Lévy Jean-Bernard (Vivendi) ; Löscher Peter (Siemens) ; Mestrallet Gérard (GDF Suez) ; Obermann René (Deutsche Telekom) ;Oetker Arend (Dr Arend Oetker Holding) ; Oudéa Frédéric (Société Générale) ; Potier Benoit (Air Liquide) ; Ranque Denis (Cercle de l'<a href="http://www.lemonde.fr/industrie/" title="Toute l’actualité industrie">industrie</a>/Technicolor) ; Reithofer Norbert (BMW) ; Reitzle Wolfgang (Linde) ; Richard Stéphane (France Telecom) ; Rollier Michel (Michelin) ; Rose Frédéric (Technicolor) ; Schnepp Gilles (Legrand) ; Spinetta Jean-Cyril (Air-<a href="http://www.lemonde.fr/europeennes-france/" title="Toute l’actualité France">France</a> KLM)  ; Teyssen Johannes (E.ON)  ; Thumann Jürgen (BusinessEurope) ; Verwaayen Ben (Alcatel-Lucent) ; Viehbacher Chris (Sanofi) ; Zetsche Dieter (Daimler).<br></br></p></div> \ No newline at end of file
+<hr><p>
+Appel Frank (Deutsche Post) ; Aschenbroich Jacques (Valeo) ; Berger Roland (Roland Berger Strategy Consultants) ; Bock Kurt (BASF) ; Bories Christel (Constellium) ; Borsig Clemens (Deutsche Bank) ; Brunck Robert (CGG Veritas) ; Buffet Patrick (Eramet) ; Burda Hubert (Hubert Burda Media Holding) ; Caparros Alain (Rewe group) ; Clamadieu Jean-Pierre (Rhodia) ; Cromme Gerhard (ThyssenKrupp) ; Crouzet Philippe (Vallourec) ; de Chalendar Pierre-André (Saint-Gobain) ; de Margerie Christophe (Total) ; de Romanet Augustin (Caisse des dépôts et consignations) ; Degenhart Elmar (Continental) ; Diekmann Michael (Allianz) ; Engel Klaus (Evonik Industries) ; Fehrenbach Franz (Robert Bosch) ; Frérot Antoine (Veolia <a href="http://www.lemonde.fr/environnement/" title="Toute l’actualité Environnement">Environnement</a>) ; Hagemann Snabe Jim (SAP) ; Henrot François (Groupe Rothschild Cie Banque) ; Hermelin Paul (Cap Gemini) ; Kormann Hermut (Lazard) ; Kron Patrick (Alstom) ; Lachmann Henri (Schneider Electric) ; Lafont Bruno (Lafarge) ; Lauvergeon Anne (Areva) ; Lévy Maurice (Publicis Groupe SA) ; Lévy Jean-Bernard (Vivendi) ; Löscher Peter (Siemens) ; Mestrallet Gérard (GDF Suez) ; Obermann René (Deutsche Telekom) ;Oetker Arend (Dr Arend Oetker Holding) ; Oudéa Frédéric (Société Générale) ; Potier Benoit (Air Liquide) ; Ranque Denis (Cercle de l'<a href="http://www.lemonde.fr/industrie/" title="Toute l’actualité industrie">industrie</a>/Technicolor) ; Reithofer Norbert (BMW) ; Reitzle Wolfgang (Linde) ; Richard Stéphane (France Telecom) ; Rollier Michel (Michelin) ; Rose Frédéric (Technicolor) ; Schnepp Gilles (Legrand) ; Spinetta Jean-Cyril (Air-<a href="http://www.lemonde.fr/europeennes-france/" title="Toute l’actualité France">France</a> KLM)&nbsp; ; Teyssen Johannes (E.ON)&nbsp; ; Thumann Jürgen (BusinessEurope) ; Verwaayen Ben (Alcatel-Lucent) ; Viehbacher Chris (Sanofi) ; Zetsche Dieter (Daimler).<br>
+ </p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json
index 5f2b7b5ee..8ad2b2c12 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "Author": "AFP",
+ "Author": "Par Sébastien Farcis",
"Direction": null,
"Excerpt": "Laurent Fabius a accueilli jeudi matin à Roissy un premier avion spécial ramenant des rescapés.",
"Image": "http:\/\/md1.libe.com\/photo\/755923-000_hkg10175905.jpg?modified_at=1430371146&amp;width=750",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html
index 889c2b928..1eeb65754 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/liberation-1/expected.html
@@ -1,13 +1,16 @@
-<section id="news-article"><article itemscope="" itemtype="http://schema.org/NewsArticle"><div id="article-body" itemprop="articleBody">
- <div>
- <p>Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, <a href="http://www.liberation.fr/video/2015/04/30/laurent-fabius-plus-de-200-francais-n-ont-pas-ete-retrouves_1278687" target="_blank">a déclaré jeudi le ministre des Affaires étrangères</a>. Les autorités françaises sont toujours sans nouvelles <em>«d’encore plus de 200» </em>personnes. <em>«Pour certains d’entre eux on est très interrogatif»</em>, a ajouté Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des rescapés. <a href="http://www.liberation.fr/video/2015/04/30/seisme-au-nepal-soulages-mais-inquiets-206-survivants-de-retour-en-france_1278758" target="_blank">L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45</a> avec à son bord 206 passagers, dont 12 enfants et 26 blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.</p>
- <p>L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55 personnels de santé et humanitaires, ainsi que 25 tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20 tonnes de matériel, est arrivé jeudi à Katmandou, <a href="http://www.liberation.fr/monde/2015/04/29/embouteillages-et-retards-a-l-aeroport-de-katmandou_1276612" target="_blank">dont le petit aéroport est engorgé</a> par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, <em>«les plus éprouvés»</em> par la catastrophe et les <em>«plus vulnérables (blessés, familles avec enfants)»</em>, selon le ministère des Affaires étrangères.</p>
- <p>2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400 Français ont demandé à être rapatriés dans les vols mis en place par la France.</p>
- <p>Le séisme a fait près de 5 500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.</p>
+<section id="news-article">
+ <article itemscope itemtype="http://schema.org/NewsArticle">
+
+
+
+ <div itemprop="articleBody" id="article-body">
+ <p>Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, <a href="http://www.liberation.fr/video/2015/04/30/laurent-fabius-plus-de-200-francais-n-ont-pas-ete-retrouves_1278687" target="_blank">a déclaré jeudi le ministre des Affaires étrangères</a>.&nbsp;Les autorités françaises sont toujours sans nouvelles <em>«d’encore plus de 200»&nbsp;</em>personnes.&nbsp;<em>«Pour certains d’entre eux on est très interrogatif»</em>, a ajouté&nbsp;Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des&nbsp;rescapés. <a href="http://www.liberation.fr/video/2015/04/30/seisme-au-nepal-soulages-mais-inquiets-206-survivants-de-retour-en-france_1278758" target="_blank">L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45</a> avec à son bord 206&nbsp;passagers, dont 12&nbsp;enfants et 26&nbsp;blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.</p>
+ <p>L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55&nbsp;personnels de santé et humanitaires, ainsi que 25&nbsp;tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20&nbsp;tonnes de matériel, est arrivé jeudi à Katmandou, <a href="http://www.liberation.fr/monde/2015/04/29/embouteillages-et-retards-a-l-aeroport-de-katmandou_1276612" target="_blank">dont le petit aéroport est engorgé</a> par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, <em>«les plus éprouvés»</em> par la catastrophe et les <em>«plus vulnérables (blessés, familles avec enfants)»</em>, selon le ministère des Affaires étrangères.</p>
+ <p>2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400&nbsp;Français ont demandé à être rapatriés dans les vols mis en place par la France.</p>
+ <p>Le séisme a fait près de 5&nbsp;500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.</p>
<p>
- <iframe data-aspect-ratio="0.5625" data-responsive="1" frameborder="0" src="http://www.dailymotion.com/embed/video/x2oikl3" width="100%"></iframe>
- <br></br><em></em></p>
+ <iframe src="http://www.dailymotion.com/embed/video/x2oikl3" frameborder="0" width="100%" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ <br><em></em></p>
</div>
-
- </div>
- </article></section> \ No newline at end of file
+ </article>
+ </section> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json
index b46843d47..1efdcbde3 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected-images.json
@@ -1,11 +1,11 @@
-{
- "0": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg",
- "2": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg",
- "3": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg",
- "4": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg",
- "5": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg",
- "6": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg",
- "7": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg",
- "8": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg",
- "9": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg"
-} \ No newline at end of file
+[
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html
index 2f862a91c..758a827e5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-post-comment-load/expected.html
@@ -1,4 +1,15 @@
-<div><p data-textannotation-id="58a492029dca5e6a6e481d21b6b2933a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" data-chomp-id="n1s6c2m6kc07iqdyllj6" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" width="636"></img></span></p><p data-textannotation-id="a043044f9b3e31fd85568b17e3b1b5f3"><span>We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.</span></p>
+<div><p data-textannotation-id="58a492029dca5e6a6e481d21b6b2933a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" data-chomp-id="n1s6c2m6kc07iqdyllj6" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg"></span></p>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="a043044f9b3e31fd85568b17e3b1b5f3"><span>We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.</span></p>
@@ -21,7 +32,7 @@
-<p data-textannotation-id="268f7702467d33e3b0972dd09f1cf0a6"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" data-chomp-id="o4dpyrcbiqyfrc3bxx6p" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" width="636"></img></span></p>
+<p data-textannotation-id="268f7702467d33e3b0972dd09f1cf0a6"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" data-chomp-id="o4dpyrcbiqyfrc3bxx6p" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg"></span></p>
@@ -43,7 +54,48 @@
-<ul><li data-textannotation-id="cd748c8b681c781cdd728c5e17b5e05f"><strong>Color:</strong> Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.</li><li data-textannotation-id="29c11c0aec305293be282aa91f8fbc3d"><strong>Navigation Roadblocks:</strong> Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.</li><li data-textannotation-id="252dc7e4a924d12c2d913861ab118bf5"><strong>The Touch Factor:</strong> Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.</li><li data-textannotation-id="05dde4d44056798acff5890759134a64"><strong>Scents and Sounds:</strong> You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.</li></ul><p data-textannotation-id="1eb4a4df2a670927c5d9e9641ebf9d40">And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your <a href="http://lifehacker.com/how-stores-manipulate-your-senses-so-you-spend-more-mon-475987594" x-inset="1">brain is falling for their tricks</a>. Even without the stores, <a href="http://lifehacker.com/5968125/how-your-brain-corrupts-your-shopping-choices" x-inset="1">your brain is working against you on its own</a>, thanks to some simple cognitive biases.</p>
+<ul><li data-textannotation-id="cd748c8b681c781cdd728c5e17b5e05f"><strong>Color:</strong> Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.</li><li data-textannotation-id="29c11c0aec305293be282aa91f8fbc3d"><strong>Navigation Roadblocks:</strong> Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.</li><li data-textannotation-id="252dc7e4a924d12c2d913861ab118bf5"><strong>The Touch Factor:</strong> Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.</li><li data-textannotation-id="05dde4d44056798acff5890759134a64"><strong>Scents and Sounds:</strong> You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="1eb4a4df2a670927c5d9e9641ebf9d40">And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your <a href="http://lifehacker.com/how-stores-manipulate-your-senses-so-you-spend-more-mon-475987594" x-inset="1">brain is falling for their tricks</a>. Even without the stores, <a href="http://lifehacker.com/5968125/how-your-brain-corrupts-your-shopping-choices" x-inset="1">your brain is working against you on its own</a>, thanks to some simple cognitive biases.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -78,7 +130,7 @@
-<p data-textannotation-id="8044cf9aab698fd28931acd90ba96f7a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" data-chomp-id="xrhkwleyurcizy4akiae" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" width="636"></img></span></p>
+<p data-textannotation-id="8044cf9aab698fd28931acd90ba96f7a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" data-chomp-id="xrhkwleyurcizy4akiae" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg"></span></p>
@@ -102,6 +154,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<p data-textannotation-id="bbe57b7aa20b48550e5f66b7c530822c">The purpose of this exercise is twofold: you see what you already have and don't need to ever buy again, and you get to see what you shouldn't have bought in the first place. As you list everything out, separate items into categories. It's extremely important that you are as honest with yourself as possible while you do this. It's also important you actually write this all down or type it all out. Here is the first set of categories to separate everything into:</p>
@@ -113,18 +195,40 @@
-<ul><li data-textannotation-id="8d7dc912152eddd0e3d56e28ad79e6f2"><strong>Need:</strong> You absolutely need this item to get by on a day to day basis.</li><li data-textannotation-id="6f60a79627f0746d1f611999251e9f1b"><strong>Sometimes Need:</strong> You don't need this item every day, but you use it on a somewhat regular basis.</li><li data-textannotation-id="54e10b108f95548966b657bd90fdbed4"><strong>Want:</strong> You bought this item because you wanted it, not because you needed it.</li><li data-textannotation-id="26c461a85fbc78651be442e205cac58b"><strong>Crap:</strong> You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).</li></ul><p data-textannotation-id="5743cf753f68fd8ee3443cc0f8e815dd">Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:</p>
+<ul><li data-textannotation-id="8d7dc912152eddd0e3d56e28ad79e6f2"><strong>Need:</strong> You absolutely need this item to get by on a day to day basis.</li><li data-textannotation-id="6f60a79627f0746d1f611999251e9f1b"><strong>Sometimes Need:</strong> You don't need this item every day, but you use it on a somewhat regular basis.</li><li data-textannotation-id="54e10b108f95548966b657bd90fdbed4"><strong>Want:</strong> You bought this item because you wanted it, not because you needed it.</li><li data-textannotation-id="26c461a85fbc78651be442e205cac58b"><strong>Crap:</strong> You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).</li></ul>
+
+
+
+
+
+<p data-textannotation-id="5743cf753f68fd8ee3443cc0f8e815dd">Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:</p>
-<ul><li data-textannotation-id="2048d6c0436bd34811442d6df32989a4">When was the last time I used this?</li><li data-textannotation-id="3f4b3686d822171b35e27bf1afde530b">When will I use this again?</li><li data-textannotation-id="63728605cc4fa66f5b225f674d12bbff">Does this item <a href="http://lifehacker.com/declutter-by-asking-one-question-does-this-spark-joy-1651256422">bring you joy</a>?</li></ul><p data-textannotation-id="816cd504161fecc6f3e173779b33d5db">Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can <a href="http://lifehacker.com/how-to-buy-happiness-the-purchases-most-likely-to-brin-1681780686">bring happiness to many people</a>, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.</p>
+
+
+
+
+
+<ul><li data-textannotation-id="2048d6c0436bd34811442d6df32989a4">When was the last time I used this?</li><li data-textannotation-id="3f4b3686d822171b35e27bf1afde530b">When will I use this again?</li><li data-textannotation-id="63728605cc4fa66f5b225f674d12bbff">Does this item <a href="http://lifehacker.com/declutter-by-asking-one-question-does-this-spark-joy-1651256422">bring you joy</a>?</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="816cd504161fecc6f3e173779b33d5db">Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can <a href="http://lifehacker.com/how-to-buy-happiness-the-purchases-most-likely-to-brin-1681780686">bring happiness to many people</a>, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.</p>
@@ -157,7 +261,7 @@
-<p data-textannotation-id="bc2f55587bf4ab07a1852a8d26217233"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" data-chomp-id="qodag11euf2npkawkn9v" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" width="636"></img></span></p>
+<p data-textannotation-id="bc2f55587bf4ab07a1852a8d26217233"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" data-chomp-id="qodag11euf2npkawkn9v" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg"></span></p>
@@ -201,7 +305,7 @@
-<p data-textannotation-id="bafeac1c3808e0d2900190979f058b2c"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" data-chomp-id="imfc9ybqfw0jmztbhfrh" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" width="636"></img></span></p>
+<p data-textannotation-id="bafeac1c3808e0d2900190979f058b2c"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" data-chomp-id="imfc9ybqfw0jmztbhfrh" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg"></span></p>
@@ -245,7 +349,7 @@
-<p data-textannotation-id="64f5c7155ad89bd2835399d33c1ae28a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" data-chomp-id="afy7n45jfvsjdmmhonct" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" width="636"></img></span></p>
+<p data-textannotation-id="64f5c7155ad89bd2835399d33c1ae28a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" data-chomp-id="afy7n45jfvsjdmmhonct" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg"></span></p>
@@ -289,7 +393,7 @@
-<p data-textannotation-id="ff438b878771354bb7f6d065ff50dbb2"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" data-chomp-id="s3pq8vjrvyjgne4lfsod" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" width="636"></img></span></p>
+<p data-textannotation-id="ff438b878771354bb7f6d065ff50dbb2"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" data-chomp-id="s3pq8vjrvyjgne4lfsod" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg"></span></p>
@@ -311,7 +415,18 @@
-<ul><li data-textannotation-id="fcfd78b1619bdf0b7330f4b40efb899d">Is this a planned purchase?</li><li data-textannotation-id="c16e7d5feae7cc2c3c6a8dd312ea206f">Will it end up in the "crap" list picture one day?</li><li data-textannotation-id="54d877fdee56080c87508fc9e6402889"><a href="http://lifehacker.com/prevent-clutter-by-asking-yourself-where-items-will-go-1649480461">Where am I going to put it</a>?</li><li data-textannotation-id="59d5245217c84e6b2b2969b3492f2f2d">Have I included this in my budget?</li><li data-textannotation-id="8fe1582808b4d89f5c88c2708744d27d"><em>Why</em> do I want/need it?</li></ul><p data-textannotation-id="0162d779382cdc7de908fc1488af3940">Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself <a href="http://www.becomingminimalist.com/marriage-hacks/" target="_blank">what problem the piece of tech solves</a>. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.</p>
+<ul><li data-textannotation-id="fcfd78b1619bdf0b7330f4b40efb899d">Is this a planned purchase?</li><li data-textannotation-id="c16e7d5feae7cc2c3c6a8dd312ea206f">Will it end up in the "crap" list picture one day?</li><li data-textannotation-id="54d877fdee56080c87508fc9e6402889"><a href="http://lifehacker.com/prevent-clutter-by-asking-yourself-where-items-will-go-1649480461">Where am I going to put it</a>?</li><li data-textannotation-id="59d5245217c84e6b2b2969b3492f2f2d">Have I included this in my budget?</li><li data-textannotation-id="8fe1582808b4d89f5c88c2708744d27d"><em>Why</em> do I want/need it?</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="0162d779382cdc7de908fc1488af3940">Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself <a target="_blank" href="http://www.becomingminimalist.com/marriage-hacks/">what problem the piece of tech solves</a>. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.</p>
@@ -333,7 +448,7 @@
-<p data-textannotation-id="1d43712fc5ce8f156e4661cca5750575"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" data-chomp-id="y2ldv5eufb3jcrtfouye" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" width="636"></img></span></p>
+<p data-textannotation-id="1d43712fc5ce8f156e4661cca5750575"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" data-chomp-id="y2ldv5eufb3jcrtfouye" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg"></span></p>
@@ -379,7 +494,37 @@
-<p data-textannotation-id="27385752c06848647540ad931892b21e">The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to <a href="http://www.thesimpledollar.com/balancing-spending-and-time-how-time-frugality-can-save-you-lots-of-cash/" target="_blank">reduce the time</a> you get with your main interests:</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="27385752c06848647540ad931892b21e">The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to <a target="_blank" href="http://www.thesimpledollar.com/balancing-spending-and-time-how-time-frugality-can-save-you-lots-of-cash/">reduce the time</a> you get with your main interests:</p>
@@ -424,7 +569,7 @@
-<p data-textannotation-id="21154394d63f1943d01f2b717aa31115"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" data-chomp-id="atb9qm07fvvg7hqkumkw" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" width="636"></img></span></p>
+<p data-textannotation-id="21154394d63f1943d01f2b717aa31115"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" data-chomp-id="atb9qm07fvvg7hqkumkw" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg"></span></p>
@@ -435,7 +580,7 @@
-<p data-textannotation-id="6141942e977cc058fd7a0fa06a3f7389">Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you <em>will</em> need further down the road. You might need <a href="http://twocents.lifehacker.com/how-to-start-saving-for-a-home-down-payment-1541254056" target="_blank">a home</a>, a vehicle, or a way to retire, but none of that can happen until you start planning for it. </p>
+<p data-textannotation-id="6141942e977cc058fd7a0fa06a3f7389">Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you <em>will</em> need further down the road. You might need <a target="_blank" href="http://twocents.lifehacker.com/how-to-start-saving-for-a-home-down-payment-1541254056">a home</a>, a vehicle, or a way to retire, but none of that can happen until you start planning for it. </p>
@@ -457,7 +602,38 @@
-<p data-textannotation-id="1106cb837deb2b6fc8e28ba98f078c27">With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily <a href="http://twocents.lifehacker.com/how-to-grow-an-emergency-fund-from-modest-savings-1638409351" target="_blank">with only modest savings</a>.</p>
+<p data-textannotation-id="1106cb837deb2b6fc8e28ba98f078c27">With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily <a target="_blank" href="http://twocents.lifehacker.com/how-to-grow-an-emergency-fund-from-modest-savings-1638409351">with only modest savings</a>.</p>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="347c2a36f114a794d559d929da1b15b7">When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective <a target="_blank" href="http://twocents.lifehacker.com/how-to-build-an-easy-beginner-set-and-forget-investm-1686878594" x-inset="1">"set and forget" investment portfolio</a>. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -468,7 +644,6 @@
-<p data-textannotation-id="347c2a36f114a794d559d929da1b15b7">When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective <a href="http://twocents.lifehacker.com/how-to-build-an-easy-beginner-set-and-forget-investm-1686878594" target="_blank" x-inset="1">"set and forget" investment portfolio</a>. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.</p>
@@ -481,4 +656,4 @@
-<p data-textannotation-id="b54d87ffdace50f420c3a6ff0404cbf3"><em><small>Photos by <a href="http://www.shutterstock.com/pic-129762989/stock-vector-consumer.html?src=id&amp;ws=1" target="_blank">cmgirl</a> (Shutterstock), <a href="http://www.shutterstock.com/pic-227832739/stock-vector-hacker-icon-man-in-hoody-with-laptop-flat-isolated-on-dark-background-vector-illustration.html?src=id&amp;ws=1" target="_blank">Macrovector</a> (Shutterstock), <a href="https://www.flickr.com/photos/jetheriot/6186786217" target="_blank">J E Theriot</a>, <a href="https://www.flickr.com/photos/puuikibeach/15289861843" target="_blank">davidd</a>, <a href="https://www.flickr.com/photos/funfilledgeorgie/10922459733" target="_blank">George Redgrave</a>, <a href="https://www.flickr.com/photos/amslerpix/7252002214" target="_blank">David Amsler</a>, <a href="https://www.flickr.com/photos/amalakar/7299820870" target="_blank">Arup Malakar</a>, <a href="https://www.flickr.com/photos/lobsterstew/89644885" target="_blank">J B</a>, <a href="https://www.flickr.com/photos/jakerome/3298702453" target="_blank">jakerome</a>, <a href="http://401kcalculator.org/" target="_blank">401(K) 2012</a>.</small></em></p></div> \ No newline at end of file
+<p data-textannotation-id="b54d87ffdace50f420c3a6ff0404cbf3"><em><small>Photos by <a target="_blank" href="http://www.shutterstock.com/pic-129762989/stock-vector-consumer.html?src=id&amp;ws=1">cmgirl</a> (Shutterstock), <a target="_blank" href="http://www.shutterstock.com/pic-227832739/stock-vector-hacker-icon-man-in-hoody-with-laptop-flat-isolated-on-dark-background-vector-illustration.html?src=id&amp;ws=1">Macrovector</a> (Shutterstock), <a target="_blank" href="https://www.flickr.com/photos/jetheriot/6186786217">J E Theriot</a>, <a target="_blank" href="https://www.flickr.com/photos/puuikibeach/15289861843">davidd</a>, <a target="_blank" href="https://www.flickr.com/photos/funfilledgeorgie/10922459733">George Redgrave</a>, <a target="_blank" href="https://www.flickr.com/photos/amslerpix/7252002214">David Amsler</a>, <a target="_blank" href="https://www.flickr.com/photos/amalakar/7299820870">Arup Malakar</a>, <a target="_blank" href="https://www.flickr.com/photos/lobsterstew/89644885">J B</a>, <a target="_blank" href="https://www.flickr.com/photos/jakerome/3298702453">jakerome</a>, <a target="_blank" href="http://401kcalculator.org/">401(K) 2012</a>.</small></em></p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json
index b46843d47..1efdcbde3 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected-images.json
@@ -1,11 +1,11 @@
-{
- "0": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg",
- "2": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg",
- "3": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg",
- "4": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg",
- "5": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg",
- "6": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg",
- "7": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg",
- "8": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg",
- "9": "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg"
-} \ No newline at end of file
+[
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--hqqO9fze--\/n1s6c2m6kc07iqdyllj6.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--QeUTCiuW--\/o4dpyrcbiqyfrc3bxx6p.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mlR3Ku0_--\/xrhkwleyurcizy4akiae.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--Tacb0tyW--\/qodag11euf2npkawkn9v.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--x9hLbIKJ--\/imfc9ybqfw0jmztbhfrh.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--6NwBgQLy--\/afy7n45jfvsjdmmhonct.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--ciqk42G0--\/s3pq8vjrvyjgne4lfsod.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--mtob1sjR--\/y2ldv5eufb3jcrtfouye.jpg",
+ "http:\/\/i.kinja-img.com\/gawker-media\/image\/upload\/s--4Ajak63w--\/atb9qm07fvvg7hqkumkw.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html
index 2f862a91c..758a827e5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lifehacker-working/expected.html
@@ -1,4 +1,15 @@
-<div><p data-textannotation-id="58a492029dca5e6a6e481d21b6b2933a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" data-chomp-id="n1s6c2m6kc07iqdyllj6" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" width="636"></img></span></p><p data-textannotation-id="a043044f9b3e31fd85568b17e3b1b5f3"><span>We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.</span></p>
+<div><p data-textannotation-id="58a492029dca5e6a6e481d21b6b2933a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg" data-chomp-id="n1s6c2m6kc07iqdyllj6" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--hqqO9fze--/n1s6c2m6kc07iqdyllj6.jpg"></span></p>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="a043044f9b3e31fd85568b17e3b1b5f3"><span>We all buy things from time to time that we don't really need. It's okay to appeal to your wants every once in a while, as long as you're in control. If you struggle with clutter, impulse buys, and buyer's remorse, here's how to put your mind in the right place before you even set foot in a store.</span></p>
@@ -21,7 +32,7 @@
-<p data-textannotation-id="268f7702467d33e3b0972dd09f1cf0a6"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" data-chomp-id="o4dpyrcbiqyfrc3bxx6p" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" width="636"></img></span></p>
+<p data-textannotation-id="268f7702467d33e3b0972dd09f1cf0a6"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg" data-chomp-id="o4dpyrcbiqyfrc3bxx6p" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--QeUTCiuW--/o4dpyrcbiqyfrc3bxx6p.jpg"></span></p>
@@ -43,7 +54,48 @@
-<ul><li data-textannotation-id="cd748c8b681c781cdd728c5e17b5e05f"><strong>Color:</strong> Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.</li><li data-textannotation-id="29c11c0aec305293be282aa91f8fbc3d"><strong>Navigation Roadblocks:</strong> Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.</li><li data-textannotation-id="252dc7e4a924d12c2d913861ab118bf5"><strong>The Touch Factor:</strong> Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.</li><li data-textannotation-id="05dde4d44056798acff5890759134a64"><strong>Scents and Sounds:</strong> You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.</li></ul><p data-textannotation-id="1eb4a4df2a670927c5d9e9641ebf9d40">And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your <a href="http://lifehacker.com/how-stores-manipulate-your-senses-so-you-spend-more-mon-475987594" x-inset="1">brain is falling for their tricks</a>. Even without the stores, <a href="http://lifehacker.com/5968125/how-your-brain-corrupts-your-shopping-choices" x-inset="1">your brain is working against you on its own</a>, thanks to some simple cognitive biases.</p>
+<ul><li data-textannotation-id="cd748c8b681c781cdd728c5e17b5e05f"><strong>Color:</strong> Stores use color to make products attractive and eye-catching, but they also use color on price labels. Red stands out and can encourage taking action, that's why it's commonly associated with sale signage and advertising. When you see red, remember what they're trying to do to your brain with that color. You don't to buy something just because it's on sale.</li><li data-textannotation-id="29c11c0aec305293be282aa91f8fbc3d"><strong>Navigation Roadblocks:</strong> Stores force you to walk around stuff you don't need to find the stuff you are really after. Have a list of what you need before you go in, go straight to it, and imagine it's the only item in the store.</li><li data-textannotation-id="252dc7e4a924d12c2d913861ab118bf5"><strong>The Touch Factor:</strong> Stores place items they want to sell in easy to reach locations and encourage you to touch them. Don't do it! As soon as you pick something up, you're more likely to buy it because your mind suddenly takes ownership of the object. Don't pick anything up and don't play with display items.</li><li data-textannotation-id="05dde4d44056798acff5890759134a64"><strong>Scents and Sounds:</strong> You'll probably hear classic, upbeat tunes when you walk into a store. The upbeat music makes you happy and excited, while playing familiar songs makes you feel comfortable. They also use pleasant smells to put your mind at ease. A happy, comfortable mind at ease is a dangerous combination for your brain when shopping. There's not much you can do to avoid this unless you shop online, but it's good to be aware of it.</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="1eb4a4df2a670927c5d9e9641ebf9d40">And sure, we can blame the stores all we want, but you won't change how they operate—you can only be aware of how your <a href="http://lifehacker.com/how-stores-manipulate-your-senses-so-you-spend-more-mon-475987594" x-inset="1">brain is falling for their tricks</a>. Even without the stores, <a href="http://lifehacker.com/5968125/how-your-brain-corrupts-your-shopping-choices" x-inset="1">your brain is working against you on its own</a>, thanks to some simple cognitive biases.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -78,7 +130,7 @@
-<p data-textannotation-id="8044cf9aab698fd28931acd90ba96f7a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" data-chomp-id="xrhkwleyurcizy4akiae" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" width="636"></img></span></p>
+<p data-textannotation-id="8044cf9aab698fd28931acd90ba96f7a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg" data-chomp-id="xrhkwleyurcizy4akiae" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--mlR3Ku0_--/xrhkwleyurcizy4akiae.jpg"></span></p>
@@ -102,6 +154,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<p data-textannotation-id="bbe57b7aa20b48550e5f66b7c530822c">The purpose of this exercise is twofold: you see what you already have and don't need to ever buy again, and you get to see what you shouldn't have bought in the first place. As you list everything out, separate items into categories. It's extremely important that you are as honest with yourself as possible while you do this. It's also important you actually write this all down or type it all out. Here is the first set of categories to separate everything into:</p>
@@ -113,18 +195,40 @@
-<ul><li data-textannotation-id="8d7dc912152eddd0e3d56e28ad79e6f2"><strong>Need:</strong> You absolutely need this item to get by on a day to day basis.</li><li data-textannotation-id="6f60a79627f0746d1f611999251e9f1b"><strong>Sometimes Need:</strong> You don't need this item every day, but you use it on a somewhat regular basis.</li><li data-textannotation-id="54e10b108f95548966b657bd90fdbed4"><strong>Want:</strong> You bought this item because you wanted it, not because you needed it.</li><li data-textannotation-id="26c461a85fbc78651be442e205cac58b"><strong>Crap:</strong> You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).</li></ul><p data-textannotation-id="5743cf753f68fd8ee3443cc0f8e815dd">Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:</p>
+<ul><li data-textannotation-id="8d7dc912152eddd0e3d56e28ad79e6f2"><strong>Need:</strong> You absolutely need this item to get by on a day to day basis.</li><li data-textannotation-id="6f60a79627f0746d1f611999251e9f1b"><strong>Sometimes Need:</strong> You don't need this item every day, but you use it on a somewhat regular basis.</li><li data-textannotation-id="54e10b108f95548966b657bd90fdbed4"><strong>Want:</strong> You bought this item because you wanted it, not because you needed it.</li><li data-textannotation-id="26c461a85fbc78651be442e205cac58b"><strong>Crap:</strong> You don't have a good reason why you have it and you already know it needs to go (there's probably a few of these items, at least).</li></ul>
+
+
+
+
+
+<p data-textannotation-id="5743cf753f68fd8ee3443cc0f8e815dd">Leave the things you listed as "needs" alone, put your stuff listed as "crap" in a pile or box to go bye-bye, and move your attention back to your "sometimes need" and "want" lists. You need to go back over both of those lists because you probably fudged some of the listings, either subconsciously or intentionally. Now ask yourself these three questions as you go through both the "sometimes need" and "want" lists:</p>
-<ul><li data-textannotation-id="2048d6c0436bd34811442d6df32989a4">When was the last time I used this?</li><li data-textannotation-id="3f4b3686d822171b35e27bf1afde530b">When will I use this again?</li><li data-textannotation-id="63728605cc4fa66f5b225f674d12bbff">Does this item <a href="http://lifehacker.com/declutter-by-asking-one-question-does-this-spark-joy-1651256422">bring you joy</a>?</li></ul><p data-textannotation-id="816cd504161fecc6f3e173779b33d5db">Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can <a href="http://lifehacker.com/how-to-buy-happiness-the-purchases-most-likely-to-brin-1681780686">bring happiness to many people</a>, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.</p>
+
+
+
+
+
+<ul><li data-textannotation-id="2048d6c0436bd34811442d6df32989a4">When was the last time I used this?</li><li data-textannotation-id="3f4b3686d822171b35e27bf1afde530b">When will I use this again?</li><li data-textannotation-id="63728605cc4fa66f5b225f674d12bbff">Does this item <a href="http://lifehacker.com/declutter-by-asking-one-question-does-this-spark-joy-1651256422">bring you joy</a>?</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="816cd504161fecc6f3e173779b33d5db">Remember to be honest and adjust your lists accordingly. There's nothing wrong with keeping things you wanted. Material items can <a href="http://lifehacker.com/how-to-buy-happiness-the-purchases-most-likely-to-brin-1681780686">bring happiness to many people</a>, but make sure the items on your "want" list actively provide you joy and are being used. If an item doesn't get much use or doesn't make you happy, add it to the "crap" list.</p>
@@ -157,7 +261,7 @@
-<p data-textannotation-id="bc2f55587bf4ab07a1852a8d26217233"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" data-chomp-id="qodag11euf2npkawkn9v" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" width="636"></img></span></p>
+<p data-textannotation-id="bc2f55587bf4ab07a1852a8d26217233"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg" data-chomp-id="qodag11euf2npkawkn9v" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--Tacb0tyW--/qodag11euf2npkawkn9v.jpg"></span></p>
@@ -201,7 +305,7 @@
-<p data-textannotation-id="bafeac1c3808e0d2900190979f058b2c"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" data-chomp-id="imfc9ybqfw0jmztbhfrh" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" width="636"></img></span></p>
+<p data-textannotation-id="bafeac1c3808e0d2900190979f058b2c"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg" data-chomp-id="imfc9ybqfw0jmztbhfrh" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--x9hLbIKJ--/imfc9ybqfw0jmztbhfrh.jpg"></span></p>
@@ -245,7 +349,7 @@
-<p data-textannotation-id="64f5c7155ad89bd2835399d33c1ae28a"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" data-chomp-id="afy7n45jfvsjdmmhonct" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" width="636"></img></span></p>
+<p data-textannotation-id="64f5c7155ad89bd2835399d33c1ae28a"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg" data-chomp-id="afy7n45jfvsjdmmhonct" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--6NwBgQLy--/afy7n45jfvsjdmmhonct.jpg"></span></p>
@@ -289,7 +393,7 @@
-<p data-textannotation-id="ff438b878771354bb7f6d065ff50dbb2"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" data-chomp-id="s3pq8vjrvyjgne4lfsod" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" width="636"></img></span></p>
+<p data-textannotation-id="ff438b878771354bb7f6d065ff50dbb2"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg" data-chomp-id="s3pq8vjrvyjgne4lfsod" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--ciqk42G0--/s3pq8vjrvyjgne4lfsod.jpg"></span></p>
@@ -311,7 +415,18 @@
-<ul><li data-textannotation-id="fcfd78b1619bdf0b7330f4b40efb899d">Is this a planned purchase?</li><li data-textannotation-id="c16e7d5feae7cc2c3c6a8dd312ea206f">Will it end up in the "crap" list picture one day?</li><li data-textannotation-id="54d877fdee56080c87508fc9e6402889"><a href="http://lifehacker.com/prevent-clutter-by-asking-yourself-where-items-will-go-1649480461">Where am I going to put it</a>?</li><li data-textannotation-id="59d5245217c84e6b2b2969b3492f2f2d">Have I included this in my budget?</li><li data-textannotation-id="8fe1582808b4d89f5c88c2708744d27d"><em>Why</em> do I want/need it?</li></ul><p data-textannotation-id="0162d779382cdc7de908fc1488af3940">Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself <a href="http://www.becomingminimalist.com/marriage-hacks/" target="_blank">what problem the piece of tech solves</a>. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.</p>
+<ul><li data-textannotation-id="fcfd78b1619bdf0b7330f4b40efb899d">Is this a planned purchase?</li><li data-textannotation-id="c16e7d5feae7cc2c3c6a8dd312ea206f">Will it end up in the "crap" list picture one day?</li><li data-textannotation-id="54d877fdee56080c87508fc9e6402889"><a href="http://lifehacker.com/prevent-clutter-by-asking-yourself-where-items-will-go-1649480461">Where am I going to put it</a>?</li><li data-textannotation-id="59d5245217c84e6b2b2969b3492f2f2d">Have I included this in my budget?</li><li data-textannotation-id="8fe1582808b4d89f5c88c2708744d27d"><em>Why</em> do I want/need it?</li></ul>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="0162d779382cdc7de908fc1488af3940">Custom build your test to hit all of your weaknesses. If you make a lot of impulse buys, include questions that address that. If you experience a lot of buyer's remorse, include a lot of questions that make you think about the use of item after you buy it. If buying the latest and greatest technology is your weakness, Joshua Becker at Becoming Minimalist suggests you ask yourself <a target="_blank" href="http://www.becomingminimalist.com/marriage-hacks/">what problem the piece of tech solves</a>. If you can't think of anything it solves or if you already have something that solves it, you don't need it. Be thorough and build a test that you can run through your mind every time you consider buying something.</p>
@@ -333,7 +448,7 @@
-<p data-textannotation-id="1d43712fc5ce8f156e4661cca5750575"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" data-chomp-id="y2ldv5eufb3jcrtfouye" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" width="636"></img></span></p>
+<p data-textannotation-id="1d43712fc5ce8f156e4661cca5750575"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg" data-chomp-id="y2ldv5eufb3jcrtfouye" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--mtob1sjR--/y2ldv5eufb3jcrtfouye.jpg"></span></p>
@@ -379,7 +494,37 @@
-<p data-textannotation-id="27385752c06848647540ad931892b21e">The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to <a href="http://www.thesimpledollar.com/balancing-spending-and-time-how-time-frugality-can-save-you-lots-of-cash/" target="_blank">reduce the time</a> you get with your main interests:</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="27385752c06848647540ad931892b21e">The last thing you should consider when it comes to impulse buys is "artificial replacement." As Trent Hamm at The Simple Dollar explains, artificial replacement can happen when you start to <a target="_blank" href="http://www.thesimpledollar.com/balancing-spending-and-time-how-time-frugality-can-save-you-lots-of-cash/">reduce the time</a> you get with your main interests:</p>
@@ -424,7 +569,7 @@
-<p data-textannotation-id="21154394d63f1943d01f2b717aa31115"><span><img alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" data-chomp-id="atb9qm07fvvg7hqkumkw" data-format="jpg" height="358" src="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" width="636"></img></span></p>
+<p data-textannotation-id="21154394d63f1943d01f2b717aa31115"><span><img width="636" height="358" data-format="jpg" data-asset-url="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg" data-chomp-id="atb9qm07fvvg7hqkumkw" alt="How to Program Your Mind to Stop Buying Crap You Don’t Need" src="http://i.kinja-img.com/gawker-media/image/upload/s--4Ajak63w--/atb9qm07fvvg7hqkumkw.jpg"></span></p>
@@ -435,7 +580,7 @@
-<p data-textannotation-id="6141942e977cc058fd7a0fa06a3f7389">Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you <em>will</em> need further down the road. You might need <a href="http://twocents.lifehacker.com/how-to-start-saving-for-a-home-down-payment-1541254056" target="_blank">a home</a>, a vehicle, or a way to retire, but none of that can happen until you start planning for it. </p>
+<p data-textannotation-id="6141942e977cc058fd7a0fa06a3f7389">Once you've programmed your mind to stop buying crap you don't need, you'll have some extra cash to play with. Take all that money and start putting it toward your future and things you <em>will</em> need further down the road. You might need <a target="_blank" href="http://twocents.lifehacker.com/how-to-start-saving-for-a-home-down-payment-1541254056">a home</a>, a vehicle, or a way to retire, but none of that can happen until you start planning for it. </p>
@@ -457,7 +602,38 @@
-<p data-textannotation-id="1106cb837deb2b6fc8e28ba98f078c27">With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily <a href="http://twocents.lifehacker.com/how-to-grow-an-emergency-fund-from-modest-savings-1638409351" target="_blank">with only modest savings</a>.</p>
+<p data-textannotation-id="1106cb837deb2b6fc8e28ba98f078c27">With your debts whittled down, you should start an emergency fund. No matter how well you plan things, accidents and health emergencies can still happen. An emergency fund is designed to make those kinds of events more manageable. This type of savings account is strictly for when life throws you a curveball, but you can grow one pretty easily <a target="_blank" href="http://twocents.lifehacker.com/how-to-grow-an-emergency-fund-from-modest-savings-1638409351">with only modest savings</a>.</p>
+
+
+
+
+
+
+
+
+
+
+<p data-textannotation-id="347c2a36f114a794d559d929da1b15b7">When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective <a target="_blank" href="http://twocents.lifehacker.com/how-to-build-an-easy-beginner-set-and-forget-investm-1686878594" x-inset="1">"set and forget" investment portfolio</a>. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -468,7 +644,6 @@
-<p data-textannotation-id="347c2a36f114a794d559d929da1b15b7">When you've paid off your debt and prepared yourself for troubled times, you can start saving for the big stuff. All that money you're not spending on crap anymore can be saved, invested, and compounded to let you buy comfort and security. If you don't know where to start, talk to a financial planner. Or create a simple, yet effective <a href="http://twocents.lifehacker.com/how-to-build-an-easy-beginner-set-and-forget-investm-1686878594" target="_blank" x-inset="1">"set and forget" investment portfolio</a>. You've worked hard to reprogram your mind, so make sure you reap the benefits for many years to come.</p>
@@ -481,4 +656,4 @@
-<p data-textannotation-id="b54d87ffdace50f420c3a6ff0404cbf3"><em><small>Photos by <a href="http://www.shutterstock.com/pic-129762989/stock-vector-consumer.html?src=id&amp;ws=1" target="_blank">cmgirl</a> (Shutterstock), <a href="http://www.shutterstock.com/pic-227832739/stock-vector-hacker-icon-man-in-hoody-with-laptop-flat-isolated-on-dark-background-vector-illustration.html?src=id&amp;ws=1" target="_blank">Macrovector</a> (Shutterstock), <a href="https://www.flickr.com/photos/jetheriot/6186786217" target="_blank">J E Theriot</a>, <a href="https://www.flickr.com/photos/puuikibeach/15289861843" target="_blank">davidd</a>, <a href="https://www.flickr.com/photos/funfilledgeorgie/10922459733" target="_blank">George Redgrave</a>, <a href="https://www.flickr.com/photos/amslerpix/7252002214" target="_blank">David Amsler</a>, <a href="https://www.flickr.com/photos/amalakar/7299820870" target="_blank">Arup Malakar</a>, <a href="https://www.flickr.com/photos/lobsterstew/89644885" target="_blank">J B</a>, <a href="https://www.flickr.com/photos/jakerome/3298702453" target="_blank">jakerome</a>, <a href="http://401kcalculator.org/" target="_blank">401(K) 2012</a>.</small></em></p></div> \ No newline at end of file
+<p data-textannotation-id="b54d87ffdace50f420c3a6ff0404cbf3"><em><small>Photos by <a target="_blank" href="http://www.shutterstock.com/pic-129762989/stock-vector-consumer.html?src=id&amp;ws=1">cmgirl</a> (Shutterstock), <a target="_blank" href="http://www.shutterstock.com/pic-227832739/stock-vector-hacker-icon-man-in-hoody-with-laptop-flat-isolated-on-dark-background-vector-illustration.html?src=id&amp;ws=1">Macrovector</a> (Shutterstock), <a target="_blank" href="https://www.flickr.com/photos/jetheriot/6186786217">J E Theriot</a>, <a target="_blank" href="https://www.flickr.com/photos/puuikibeach/15289861843">davidd</a>, <a target="_blank" href="https://www.flickr.com/photos/funfilledgeorgie/10922459733">George Redgrave</a>, <a target="_blank" href="https://www.flickr.com/photos/amslerpix/7252002214">David Amsler</a>, <a target="_blank" href="https://www.flickr.com/photos/amalakar/7299820870">Arup Malakar</a>, <a target="_blank" href="https://www.flickr.com/photos/lobsterstew/89644885">J B</a>, <a target="_blank" href="https://www.flickr.com/photos/jakerome/3298702453">jakerome</a>, <a target="_blank" href="http://401kcalculator.org/">401(K) 2012</a>.</small></em></p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json
index d6b1330af..d13d96c0a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "Author": null,
+ "Author": "",
"Direction": null,
"Excerpt": "Posted by Andrew Hayden, Software Engineer on Google Play Android users are downloading tens of billions of apps and games on Google Pla...",
"Image": "https:\/\/2.bp.blogspot.com\/-chCZZinlUTg\/WEcxvJo9gdI\/AAAAAAAADnk\/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB\/w1200-h630-p-k-nu\/ipsum-opsum.gif",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html
index 05e072336..12d773354 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/links-in-tables/expected.html
@@ -54,7 +54,7 @@ to inefficient patches.
Watch how much the compressed text on the right side changes from a one-letter
change in the uncompressed text on the left:
</p>
-<p><a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1"><img height="105" src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640"></img></a></p>
+<p><a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1"><img src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640" height="105"></a></p>
<p>
File-by-File therefore is based on detecting changes in the uncompressed data.
To generate a patch, we first decompress both old and new files before computing
@@ -105,45 +105,50 @@ Patching?</span></strong>
Here are examples of app updates already using File-by-File Patching:
</p>
<div dir="ltr" trbidi="on">
-
-<div dir="ltr">
-<table readabilityDataTable="1"><colgroup><col width="142"></col><col width="102"></col><col width="176"></col><col width="176"></col></colgroup><tbody><tr><td><p><span>Application</span></p>
+<table readabilityDataTable="1"><colgroup><col width="142"><col width="102"><col width="176"><col width="176"></colgroup><tbody>
+<tr><td><p><span>Application</span></p>
</td><td><p><span>Original Size</span></p>
</td><td><p><span>Previous (BSDiff) Patch Size</span></p>
<p><span>(% vs original)</span></p>
</td><td><p><span>File-by-File Patch Size (% vs original)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.king.farmheroessupersaga&amp;hl=en"><span>Farm Heroes Super Saga</span></a></p></div>
</td><td><p><span>71.1 MB</span></p>
</td><td><p><span>13.4 MB (-81%)</span></p>
</td><td><p><span>8.0 MB (-89%)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.maps"><span>Google Maps</span></a></p></div>
</td><td><p><span>32.7 MB</span></p>
</td><td><p><span>17.5 MB (-46%)</span></p>
</td><td><p><span>9.6 MB (-71%)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.google.android.gm"><span>Gmail</span></a></p></div>
</td><td><p><span>17.8 MB</span></p>
</td><td><p><span>7.6 MB (-57%)</span></p>
</td><td><p><span>7.3 MB (-59%)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.google.android.tts"><span>Google TTS</span></a></p></div>
</td><td><p><span>18.9 MB</span></p>
</td><td><p><span>17.2 MB (-9%)</span></p>
</td><td><p><span>13.1 MB (-31%)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.amazon.kindle"><span>Kindle</span></a></p></div>
</td><td><p><span>52.4 MB</span></p>
</td><td><p><span>19.1 MB (-64%)</span></p>
</td><td><p><span>8.4 MB (-84%)</span></p>
-</td></tr><tr><td><div dir="ltr">
+</td></tr>
+<tr><td><div dir="ltr">
<p><a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient"><span>Netflix</span></a></p></div>
</td><td><p><span>16.2 MB</span></p>
</td><td><p><span>7.7 MB (-52%)</span></p>
</td><td><p><span>1.2 MB (-92%)</span></p>
-</td></tr></tbody></table></div>
-
+</td></tr>
+</tbody></table>
</div>
<p><em>Disclaimer: if you see different patch sizes when you press "update"
manually, that is because we are not currently using File-by-file for
@@ -169,6 +174,6 @@ As a developer if you're interested in reducing your APK size still further,
here are some <a href="https://developer.android.com/topic/performance/reduce-apk-size.html?utm_campaign=android_discussion_filebyfile_120616&amp;utm_source=anddev&amp;utm_medium=blog">general
tips on reducing APK size</a>.
</p>
-<p><a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1"><img height="200" src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191"></img></a></p>
+<p><a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1"><img src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191" height="200"></a></p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html
index 358f95655..f17b05a00 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/lwn-1/expected.html
@@ -1,373 +1,655 @@
-<div><td>
-
- <div>
- <h2><a href="http://fakehost/Articles/637755/">A trademark battle in the Arduino community</a></h2>
-
- <p>The <a href="https://en.wikipedia.org/wiki/Arduino">Arduino</a> has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark. </p>
- <p>The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further. </p>
- <p>The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using <a href="https://en.wikipedia.org/wiki/Processing_(programming_language)">Processing</a>, <a href="https://en.wikipedia.org/wiki/Wiring_%28development_platform%29">Wiring</a>, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it. </p>
- <p>Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy. </p>
- <p>This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a <a href="http://arduino.cc/en/ArduinoCertified/Products#program">certification
+<div>
+ <td>
+
+ <div>
+ <h2><a href="http://fakehost/Articles/637755/">A trademark battle in the Arduino community</a></h2>
+
+ <p>The <a href="https://en.wikipedia.org/wiki/Arduino">Arduino</a> has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark. </p>
+ <p>The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further. </p>
+ <p>The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using <a href="https://en.wikipedia.org/wiki/Processing_(programming_language)">Processing</a>, <a href="https://en.wikipedia.org/wiki/Wiring_%28development_platform%29">Wiring</a>, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it. </p>
+ <p>Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy. </p>
+ <p>This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a <a href="http://arduino.cc/en/ArduinoCertified/Products#program">certification
program</a> for third-party manufacturers interested in using the "Arduino" branding, but allows (and arguably even encourages) informal software and firmware compatibility. </p>
- <p>The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC <a href="http://tsdr.uspto.gov/#caseNumber=3931675&amp;caseType=US_REGISTRATION_NO&amp;searchType=statusSearch">filed</a> to register the US trademark in April 2009, and it was granted in 2011. </p>
- <p>At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy <a href="http://www.wired.it/gadget/computer/2015/02/12/arduino-nel-caos-situazione/">reports</a> that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out <em>any</em> official hardware manufacturing to other companies, or had some other concern. Heise Online <a href="http://www.heise.de/make/meldung/Arduino-gegen-Arduino-Gruender-streiten-um-die-Firma-2549653.html">adds</a> that the conflict seemed to be about moving some production to China. </p>
- <p>What is clear is that Smart Projects filed a <a href="http://ttabvue.uspto.gov/ttabvue/v?pno=92060077&amp;pty=CAN&amp;eno=1">petition</a> with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO. </p>
- <p>Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement <a href="http://dockets.justia.com/docket/massachusetts/madce/1:2015cv10181/167131">lawsuit</a> against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name <tt>arduino.org</tt>, which duplicates most of the site features found on the original Arduino site (<tt>arduino.cc</tt>). That includes both a hardware store and software downloads. </p>
- <p>Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had <a href="http://www.eetimes.com/document.asp?doc_id=1263246">collaborated</a> with Arduino LLC on the design and production of the Arduino Yún, which has received some <a href="http://hackaday.com/2015/02/24/is-the-arduino-yun-open-hardware/">criticism</a> for including proprietary components. </p>
- <p>Hackaday has run a two-part series (in <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/">February</a> and <a href="http://hackaday.com/2015/03/12/arduino-v-arduino-part-ii/">March</a>) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/comment-page-1/#comment-2453084">noted</a> that Arduino SRL recently created a fork of the Arduino IDE on GitHub. </p>
- <p>Most recently, Banzi broke his silence about the dispute in a <a href="http://makezine.com/2015/03/19/massimo-banzi-fighting-for-arduino">story</a> published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL. </p>
- <p>Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new <a href="http://arduino.org/products/arduino-zero-pro">Arduino Zero</a> model for sale today and Arduino.cc <a href="http://arduino.cc/en/Main/Products">listing it</a> as "Coming soon." </p>
- <p>Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices. </p>
- <p>The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware. </p>
- <p>One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all. </p>
- <p>But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however. </p>
- <p><a href="http://fakehost/Articles/637755/#Comments">Comments (5 posted)</a> </p>
-
- <h2><a href="http://fakehost/Articles/637533/">Mapping and data mining with QGIS 2.8</a></h2>
- <p> By <b>Nathan Willis</b>
- <br></br>March 25, 2015 </p>
- <p><a href="http://qgis.org/">QGIS</a> is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike. </p>
- <p>The new release is version 2.8, which was unveiled on March 2. An official <a href="http://qgis.org/en/site/forusers/visualchangelog28/index.html">change
+ <p>The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC <a href="http://tsdr.uspto.gov/#caseNumber=3931675&amp;caseType=US_REGISTRATION_NO&amp;searchType=statusSearch">filed</a> to register the US trademark in April 2009, and it was granted in 2011. </p>
+ <p>At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy <a href="http://www.wired.it/gadget/computer/2015/02/12/arduino-nel-caos-situazione/">reports</a> that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out <em>any</em> official hardware manufacturing to other companies, or had some other concern. Heise Online <a href="http://www.heise.de/make/meldung/Arduino-gegen-Arduino-Gruender-streiten-um-die-Firma-2549653.html">adds</a> that the conflict seemed to be about moving some production to China. </p>
+ <p>What is clear is that Smart Projects filed a <a href="http://ttabvue.uspto.gov/ttabvue/v?pno=92060077&amp;pty=CAN&amp;eno=1">petition</a> with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO. </p>
+ <p>Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement <a href="http://dockets.justia.com/docket/massachusetts/madce/1:2015cv10181/167131">lawsuit</a> against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name <tt>arduino.org</tt>, which duplicates most of the site features found on the original Arduino site (<tt>arduino.cc</tt>). That includes both a hardware store and software downloads. </p>
+ <p>Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had <a href="http://www.eetimes.com/document.asp?doc_id=1263246">collaborated</a> with Arduino LLC on the design and production of the Arduino Yún, which has received some <a href="http://hackaday.com/2015/02/24/is-the-arduino-yun-open-hardware/">criticism</a> for including proprietary components. </p>
+ <p>Hackaday has run a two-part series (in <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/">February</a> and <a href="http://hackaday.com/2015/03/12/arduino-v-arduino-part-ii/">March</a>) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/comment-page-1/#comment-2453084">noted</a> that Arduino SRL recently created a fork of the Arduino IDE on GitHub. </p>
+ <p>Most recently, Banzi broke his silence about the dispute in a <a href="http://makezine.com/2015/03/19/massimo-banzi-fighting-for-arduino">story</a> published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL. </p>
+ <p>Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new <a href="http://arduino.org/products/arduino-zero-pro">Arduino Zero</a> model for sale today and Arduino.cc <a href="http://arduino.cc/en/Main/Products">listing it</a> as "Coming soon." </p>
+ <p>Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices. </p>
+ <p>The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware. </p>
+ <p>One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all. </p>
+ <p>But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however. </p>
+ <p><a href="http://fakehost/Articles/637755/#Comments">Comments (5 posted)</a> </p>
+
+ <h2><a href="http://fakehost/Articles/637533/">Mapping and data mining with QGIS 2.8</a></h2>
+ <p> By <b>Nathan Willis</b>
+ <br>March 25, 2015 </p>
+ <p><a href="http://qgis.org/">QGIS</a> is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike. </p>
+ <p>The new release is version 2.8, which was unveiled on March&nbsp;2. An official <a href="http://qgis.org/en/site/forusers/visualchangelog28/index.html">change
log</a> is available on the QGIS site, while the release itself was announced primarily through blog posts (such as <a href="http://anitagraser.com/2015/03/02/qgis-2-8-ltr-has-landed/">this
post</a> by Anita Graser of the project's steering committee). Downloads are <a href="http://qgis.org/en/site/forusers/download.html">available</a> for a variety of platforms, including packages for Ubuntu, Debian, Fedora, openSUSE, and several other distributions.</p>
- <p><a href="http://fakehost/Articles/637747/"> <img alt="[QGIS main interface]" height="264" src="http://fakehost/images/2015/03-qgis-map-sm.png" width="350"></img></a></p><p>As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project. </p>
- <p>For those new to QGIS (or GIS in general), there is a detailed new-user <a href="http://docs.qgis.org/testing/en/docs/training_manual/">tutorial</a> that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time. </p>
- <p>QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use. </p>
- <p>But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen. </p>
- <h4>Here be data</h4>
- <p>The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.</p>
- <p><a href="http://fakehost/Articles/637748/"> <img alt="[QGIS query builder]" height="302" src="http://fakehost/images/2015/03-qgis-query-sm.png" width="300"></img></a></p><p>In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables. </p>
- <p>All three have been improved in this release. New are support for <tt>if(condition, true, false)</tt> conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new <a href="http://nathanw.net/2015/01/19/function-editor-for-qgis-expressions/">custom
+ <p><a href="http://fakehost/Articles/637747/"> <img src="http://fakehost/images/2015/03-qgis-map-sm.png" width="350" height="264" alt="[QGIS main interface]"> </a></p><p>As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project. </p>
+ <p>For those new to QGIS (or GIS in general), there is a detailed new-user <a href="http://docs.qgis.org/testing/en/docs/training_manual/">tutorial</a> that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time. </p>
+ <p>QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use. </p>
+ <p>But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen. </p>
+ <h4>Here be data</h4>
+ <p>The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.</p>
+ <p><a href="http://fakehost/Articles/637748/"> <img src="http://fakehost/images/2015/03-qgis-query-sm.png" width="300" height="302" alt="[QGIS query builder]"> </a></p><p>In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables. </p>
+ <p>All three have been improved in this release. New are support for <tt>if(condition, true, false)</tt> conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new <a href="http://nathanw.net/2015/01/19/function-editor-for-qgis-expressions/">custom
function editor</a> for writing Python functions that can be called in mathematical expressions within the query builder. </p>
- <p>It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging. </p>
- <p>There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating <a href="http://en.wikipedia.org/wiki/Hypsometric_curve">hypsometric
+ <p>It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging. </p>
+ <p>There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating <a href="http://en.wikipedia.org/wiki/Hypsometric_curve">hypsometric
curves</a>, refactoring data sets, and more. </p>
- <h4>Maps in, maps out</h4>
- <p><a href="http://fakehost/Articles/637749/"> <img alt="[QGIS simplify tool]" height="303" src="http://fakehost/images/2015/03-qgis-simplify-sm.png" width="300"></img></a></p><p>The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved. </p>
- <p>For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties. </p>
- <p>There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.</p>
- <p><a href="http://fakehost/Articles/637751/"> <img alt="[QGIS style editing]" height="286" src="http://fakehost/images/2015/03-qgis-style-sm.png" width="300"></img></a></p><p>There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set. </p>
- <p>QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for <a href="http://mapserver.org/">MapServer</a> or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible. </p>
- <p>The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example). </p>
- <p>There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface. </p>
- <p>QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning. </p>
- <p><a href="http://fakehost/Articles/637533/#Comments">Comments (3 posted)</a> </p>
-
- <h2><a href="http://fakehost/Articles/637735/">Development activity in LibreOffice and OpenOffice</a></h2>
- <p> By <b>Jonathan Corbet</b>
- <br></br>March 25, 2015 </p><p> The LibreOffice project was <a href="http://fakehost/Articles/407383/">announced</a> with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) <a href="http://fakehost/Articles/446093/">was
+ <h4>Maps in, maps out</h4>
+ <p><a href="http://fakehost/Articles/637749/"> <img src="http://fakehost/images/2015/03-qgis-simplify-sm.png" width="300" height="303" alt="[QGIS simplify tool]"> </a></p><p>The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved. </p>
+ <p>For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties. </p>
+ <p>There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.</p>
+ <p><a href="http://fakehost/Articles/637751/"> <img src="http://fakehost/images/2015/03-qgis-style-sm.png" width="300" height="286" alt="[QGIS style editing]"> </a></p><p>There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set. </p>
+ <p>QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for <a href="http://mapserver.org/">MapServer</a> or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible. </p>
+ <p>The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example). </p>
+ <p>There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface. </p>
+ <p>QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning. </p>
+ <p><a href="http://fakehost/Articles/637533/#Comments">Comments (3 posted)</a> </p>
+
+ <h2><a href="http://fakehost/Articles/637735/">Development activity in LibreOffice and OpenOffice</a></h2>
+ <p> By <b>Jonathan Corbet</b>
+ <br>March 25, 2015 </p><p> The LibreOffice project was <a href="http://fakehost/Articles/407383/">announced</a> with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) <a href="http://fakehost/Articles/446093/">was
cut loose from Oracle</a> and found a new home as an Apache project. It is fair to say that the rivalry between the two projects in the time since then has been strong. Predictions that one project or the other would fail have not been borne out, but that does not mean that the two projects are equally successful. A look at the two projects' development communities reveals some interesting differences.
- </p>
- <h4>Release histories</h4>
- <p> Apache OpenOffice has made two releases in the past year: <a href="https://blogs.apache.org/OOo/entry/the_apache_openoffice_project_announce">4.1</a> in April 2014 and <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_1">4.1.1</a> (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support. </p>
- <p> The release history for LibreOffice tells a slightly different story: </p>
-
- <blockquote>
- </blockquote>
- <p> It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well. </p>
-
- <h4>Development statistics</h4>
- <p> In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are: </p>
-
- <blockquote>
- <table readabilityDataTable="1"><tbody><tr><th colspan="2">Most active OpenOffice developers</th>
- </tr><tr><td>
- <table readabilityDataTable="1"><tbody><tr><th colspan="3">By changesets</th>
- </tr><tr><td>Herbert Dürr</td>
- <td>63</td>
- <td>16.6%</td>
- </tr><tr><td>Jürgen Schmidt             </td>
- <td>56</td>
- <td>14.7%</td>
- </tr><tr><td>Armin Le Grand</td>
- <td>56</td>
- <td>14.7%</td>
- </tr><tr><td>Oliver-Rainer Wittmann</td>
- <td>46</td>
- <td>12.1%</td>
- </tr><tr><td>Tsutomu Uchino</td>
- <td>33</td>
- <td>8.7%</td>
- </tr><tr><td>Kay Schenk</td>
- <td>27</td>
- <td>7.1%</td>
- </tr><tr><td>Pedro Giffuni</td>
- <td>23</td>
- <td>6.1%</td>
- </tr><tr><td>Ariel Constenla-Haile</td>
- <td>22</td>
- <td>5.8%</td>
- </tr><tr><td>Andrea Pescetti</td>
- <td>14</td>
- <td>3.7%</td>
- </tr><tr><td>Steve Yin</td>
- <td>11</td>
- <td>2.9%</td>
- </tr><tr><td>Andre Fischer</td>
- <td>10</td>
- <td>2.6%</td>
- </tr><tr><td>Yuri Dario</td>
- <td>7</td>
- <td>1.8%</td>
- </tr><tr><td>Regina Henschel</td>
- <td>6</td>
- <td>1.6%</td>
- </tr><tr><td>Juan C. Sanz</td>
- <td>2</td>
- <td>0.5%</td>
- </tr><tr><td>Clarence Guo</td>
- <td>2</td>
- <td>0.5%</td>
- </tr><tr><td>Tal Daniel</td>
- <td>2</td>
- <td>0.5%</td>
- </tr></tbody></table></td>
- <td>
- <table readabilityDataTable="1"><tbody><tr><th colspan="3">By changed lines</th>
- </tr><tr><td>Jürgen Schmidt             </td>
- <td>455499</td>
- <td>88.1%</td>
- </tr><tr><td>Andre Fischer</td>
- <td>26148</td>
- <td>3.8%</td>
- </tr><tr><td>Pedro Giffuni</td>
- <td>23183</td>
- <td>3.4%</td>
- </tr><tr><td>Armin Le Grand</td>
- <td>11018</td>
- <td>1.6%</td>
- </tr><tr><td>Juan C. Sanz</td>
- <td>4582</td>
- <td>0.7%</td>
- </tr><tr><td>Oliver-Rainer Wittmann</td>
- <td>4309</td>
- <td>0.6%</td>
- </tr><tr><td>Andrea Pescetti</td>
- <td>3908</td>
- <td>0.6%</td>
- </tr><tr><td>Herbert Dürr</td>
- <td>2811</td>
- <td>0.4%</td>
- </tr><tr><td>Tsutomu Uchino</td>
- <td>1991</td>
- <td>0.3%</td>
- </tr><tr><td>Ariel Constenla-Haile</td>
- <td>1258</td>
- <td>0.2%</td>
- </tr><tr><td>Steve Yin</td>
- <td>1010</td>
- <td>0.1%</td>
- </tr><tr><td>Kay Schenk</td>
- <td>616</td>
- <td>0.1%</td>
- </tr><tr><td>Regina Henschel</td>
- <td>417</td>
- <td>0.1%</td>
- </tr><tr><td>Yuri Dario</td>
- <td>268</td>
- <td>0.0%</td>
- </tr><tr><td>tal</td>
- <td>16</td>
- <td>0.0%</td>
- </tr><tr><td>Clarence Guo</td>
- <td>11</td>
- <td>0.0%</td>
- </tr></tbody></table></td>
- </tr></tbody></table></blockquote>
- <p> In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files. </p>
- <p> The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year. </p>
- <p> The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were: </p>
-
- <blockquote>
- <table readabilityDataTable="1"><tbody><tr><th colspan="2">Most active LibreOffice developers</th>
- </tr><tr><td>
- <table readabilityDataTable="1"><tbody><tr><th colspan="3">By changesets</th>
- </tr><tr><td>Caolán McNamara</td>
- <td>4307</td>
- <td>19.5%</td>
- </tr><tr><td>Stephan Bergmann</td>
- <td>2351</td>
- <td>10.6%</td>
- </tr><tr><td>Miklos Vajna</td>
- <td>1449</td>
- <td>6.5%</td>
- </tr><tr><td>Tor Lillqvist</td>
- <td>1159</td>
- <td>5.2%</td>
- </tr><tr><td>Noel Grandin</td>
- <td>1064</td>
- <td>4.8%</td>
- </tr><tr><td>Markus Mohrhard</td>
- <td>935</td>
- <td>4.2%</td>
- </tr><tr><td>Michael Stahl</td>
- <td>915</td>
- <td>4.1%</td>
- </tr><tr><td>Kohei Yoshida</td>
- <td>755</td>
- <td>3.4%</td>
- </tr><tr><td>Tomaž Vajngerl</td>
- <td>658</td>
- <td>3.0%</td>
- </tr><tr><td>Thomas Arnhold</td>
- <td>619</td>
- <td>2.8%</td>
- </tr><tr><td>Jan Holesovsky</td>
- <td>466</td>
- <td>2.1%</td>
- </tr><tr><td>Eike Rathke</td>
- <td>457</td>
- <td>2.1%</td>
- </tr><tr><td>Matteo Casalin</td>
- <td>442</td>
- <td>2.0%</td>
- </tr><tr><td>Bjoern Michaelsen</td>
- <td>421</td>
- <td>1.9%</td>
- </tr><tr><td>Chris Sherlock</td>
- <td>396</td>
- <td>1.8%</td>
- </tr><tr><td>David Tardon</td>
- <td>386</td>
- <td>1.7%</td>
- </tr><tr><td>Julien Nabet</td>
- <td>362</td>
- <td>1.6%</td>
- </tr><tr><td>Zolnai Tamás</td>
- <td>338</td>
- <td>1.5%</td>
- </tr><tr><td>Matúš Kukan</td>
- <td>256</td>
- <td>1.2%</td>
- </tr><tr><td>Robert Antoni Buj Gelonch</td>
- <td>231</td>
- <td>1.0%</td>
- </tr></tbody></table></td>
- <td>
- <table readabilityDataTable="1"><tbody><tr><th colspan="3">By changed lines</th>
- </tr><tr><td>Lionel Elie Mamane</td>
- <td>244062</td>
- <td>12.5%</td>
- </tr><tr><td>Noel Grandin</td>
- <td>238711</td>
- <td>12.2%</td>
- </tr><tr><td>Stephan Bergmann</td>
- <td>161220</td>
- <td>8.3%</td>
- </tr><tr><td>Miklos Vajna</td>
- <td>129325</td>
- <td>6.6%</td>
- </tr><tr><td>Caolán McNamara</td>
- <td>97544</td>
- <td>5.0%</td>
- </tr><tr><td>Tomaž Vajngerl</td>
- <td>69404</td>
- <td>3.6%</td>
- </tr><tr><td>Tor Lillqvist</td>
- <td>59498</td>
- <td>3.1%</td>
- </tr><tr><td>Laurent Balland-Poirier</td>
- <td>52802</td>
- <td>2.7%</td>
- </tr><tr><td>Markus Mohrhard</td>
- <td>50509</td>
- <td>2.6%</td>
- </tr><tr><td>Kohei Yoshida</td>
- <td>45514</td>
- <td>2.3%</td>
- </tr><tr><td>Chris Sherlock</td>
- <td>36788</td>
- <td>1.9%</td>
- </tr><tr><td>Peter Foley</td>
- <td>34305</td>
- <td>1.8%</td>
- </tr><tr><td>Christian Lohmaier</td>
- <td>33787</td>
- <td>1.7%</td>
- </tr><tr><td>Thomas Arnhold</td>
- <td>32722</td>
- <td>1.7%</td>
- </tr><tr><td>David Tardon</td>
- <td>21681</td>
- <td>1.1%</td>
- </tr><tr><td>David Ostrovsky</td>
- <td>21620</td>
- <td>1.1%</td>
- </tr><tr><td>Jan Holesovsky</td>
- <td>20792</td>
- <td>1.1%</td>
- </tr><tr><td>Valentin Kettner</td>
- <td>20526</td>
- <td>1.1%</td>
- </tr><tr><td>Robert Antoni Buj Gelonch</td>
- <td>20447</td>
- <td>1.0%</td>
- </tr><tr><td>Michael Stahl</td>
- <td>18216</td>
- <td>0.9%</td>
- </tr></tbody></table></td>
- </tr></tbody></table></blockquote>
- <p> To a first approximation, the top ten companies supporting LibreOffice in the last year are: </p>
-
- <blockquote>
- <table readabilityDataTable="1"><tbody><tr><th colspan="3">Companies supporting LibreOffice development</th>
- </tr><tr><th colspan="3">(by changesets)</th>
- </tr><tr><td>Red Hat</td>
- <td>8417</td>
- <td>38.0%</td>
- </tr><tr><td>Collabora <strike>Multimedia</strike></td>
- <td>6531</td>
- <td>29.5%</td>
- </tr><tr><td>(Unknown)</td>
- <td>5126</td>
- <td>23.2%</td>
- </tr><tr><td>(None)</td>
- <td>1490</td>
- <td>6.7%</td>
- </tr><tr><td>Canonical</td>
- <td>422</td>
- <td>1.9%</td>
- </tr><tr><td>Igalia S.L.</td>
- <td>80</td>
- <td>0.4%</td>
- </tr><tr><td>Ericsson</td>
- <td>21</td>
- <td>0.1%</td>
- </tr><tr><td>Yandex</td>
- <td>18</td>
- <td>0.1%</td>
- </tr><tr><td>FastMail.FM</td>
- <td>17</td>
- <td>0.1%</td>
- </tr><tr><td>SUSE</td>
- <td>7</td>
- <td>0.0%</td>
- </tr></tbody></table></blockquote>
- <p> Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies. </p>
-
- <h4>Some conclusions</h4>
- <p> Last October, some <a href="http://fakehost/Articles/637742/">concerns</a> were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir <a href="http://fakehost/Articles/637743/">shrugged them off</a> as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here. </p>
- <p> In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community. </p>
- <p> OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the <a href="https://blogs.apache.org/OOo/">OpenOffice
+ </p>
+ <h4>Release histories</h4>
+ <p> Apache OpenOffice has made two releases in the past year: <a href="https://blogs.apache.org/OOo/entry/the_apache_openoffice_project_announce">4.1</a> in April 2014 and <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_1">4.1.1</a> (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support. </p>
+ <p> The release history for LibreOffice tells a slightly different story: </p>
+
+ <blockquote>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th>Release</th>
+ <th>Date</th>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/04/10/libreoffice-4-2-3-is-now-available-for-download/">4.2.3</a></td>
+ <td>April 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/04/29/the-document-foundation-announces-libreoffice-4-1-6/">4.1.6</a></td>
+ <td>April 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/05/08/libreoffice-4-2-4-at-linuxtag-and-fisl/">4.2.4</a></td>
+ <td>May 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/06/20/libreoffice-4-2-5-hits-the-marketplace/">4.2.5</a></td>
+ <td>June 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/07/30/libreoffice-4-3-today-you-cant-own-a-better-office-suite/">4.3</a></td>
+ <td>July 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/08/05/libreoffice-4-2-6-is-ready/">4.2.6</a></td>
+ <td>August 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/08/28/libreoffice-4-3-1-fresh-announced/">4.3.1</a></td>
+ <td>August 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/09/25/libreoffice-4-3-2-hits-the-marketplace-just-before-the-fourth-anniversary-of-the-project/">4.3.2</a></td>
+ <td>September 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/10/30/the-document-foundation-announces-libreoffice-4-3-3-and-libreoffice-4-2-7/">4.2.7/4.3.3</a></td>
+ <td>October 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/11/14/the-document-foundation-announces-libreoffice-4-3-4/">4.3.4</a></td>
+ <td>November 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/12/12/the-document-foundation-announces-libreoffice-4-2-8/">4.2.8</a></td>
+ <td>December 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2014/12/18/the-document-foundation-announces-libreoffice-4-3-5/">4.3.5</a></td>
+ <td>December 2014</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2015/01/29/libreoffice-4-4-the-most-beautiful-libreoffice-ever/">4.4</a></td>
+ <td>January 2015</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2015/02/20/the-document-foundation-announces-libreoffice-4-3-6/">4.3.6</a></td>
+ <td>February 2015</td>
+ </tr>
+ <tr>
+ <td><a href="http://blog.documentfoundation.org/2015/02/26/libreoffice-4-4-1-fresh-is-available-for-download/">4.4.1</a></td>
+ <td>February 2015</td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well. </p>
+
+ <h4>Development statistics</h4>
+ <p> In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are: </p>
+
+ <blockquote>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="2">Most active OpenOffice developers</th>
+ </tr>
+ <tr>
+ <td>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="3">By changesets</th>
+ </tr>
+ <tr>
+ <td>Herbert Dürr</td>
+ <td>63</td>
+ <td>16.6%</td>
+ </tr>
+ <tr>
+ <td>Jürgen&nbsp;Schmidt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td>56</td>
+ <td>14.7%</td>
+ </tr>
+ <tr>
+ <td>Armin Le Grand</td>
+ <td>56</td>
+ <td>14.7%</td>
+ </tr>
+ <tr>
+ <td>Oliver-Rainer&nbsp;Wittmann</td>
+ <td>46</td>
+ <td>12.1%</td>
+ </tr>
+ <tr>
+ <td>Tsutomu Uchino</td>
+ <td>33</td>
+ <td>8.7%</td>
+ </tr>
+ <tr>
+ <td>Kay Schenk</td>
+ <td>27</td>
+ <td>7.1%</td>
+ </tr>
+ <tr>
+ <td>Pedro Giffuni</td>
+ <td>23</td>
+ <td>6.1%</td>
+ </tr>
+ <tr>
+ <td>Ariel Constenla-Haile</td>
+ <td>22</td>
+ <td>5.8%</td>
+ </tr>
+ <tr>
+ <td>Andrea Pescetti</td>
+ <td>14</td>
+ <td>3.7%</td>
+ </tr>
+ <tr>
+ <td>Steve Yin</td>
+ <td>11</td>
+ <td>2.9%</td>
+ </tr>
+ <tr>
+ <td>Andre Fischer</td>
+ <td>10</td>
+ <td>2.6%</td>
+ </tr>
+ <tr>
+ <td>Yuri Dario</td>
+ <td>7</td>
+ <td>1.8%</td>
+ </tr>
+ <tr>
+ <td>Regina Henschel</td>
+ <td>6</td>
+ <td>1.6%</td>
+ </tr>
+ <tr>
+ <td>Juan C. Sanz</td>
+ <td>2</td>
+ <td>0.5%</td>
+ </tr>
+ <tr>
+ <td>Clarence Guo</td>
+ <td>2</td>
+ <td>0.5%</td>
+ </tr>
+ <tr>
+ <td>Tal Daniel</td>
+ <td>2</td>
+ <td>0.5%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="3">By changed lines</th>
+ </tr>
+ <tr>
+ <td>Jürgen&nbsp;Schmidt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td>455499</td>
+ <td>88.1%</td>
+ </tr>
+ <tr>
+ <td>Andre Fischer</td>
+ <td>26148</td>
+ <td>3.8%</td>
+ </tr>
+ <tr>
+ <td>Pedro Giffuni</td>
+ <td>23183</td>
+ <td>3.4%</td>
+ </tr>
+ <tr>
+ <td>Armin Le Grand</td>
+ <td>11018</td>
+ <td>1.6%</td>
+ </tr>
+ <tr>
+ <td>Juan C. Sanz</td>
+ <td>4582</td>
+ <td>0.7%</td>
+ </tr>
+ <tr>
+ <td>Oliver-Rainer Wittmann</td>
+ <td>4309</td>
+ <td>0.6%</td>
+ </tr>
+ <tr>
+ <td>Andrea Pescetti</td>
+ <td>3908</td>
+ <td>0.6%</td>
+ </tr>
+ <tr>
+ <td>Herbert Dürr</td>
+ <td>2811</td>
+ <td>0.4%</td>
+ </tr>
+ <tr>
+ <td>Tsutomu Uchino</td>
+ <td>1991</td>
+ <td>0.3%</td>
+ </tr>
+ <tr>
+ <td>Ariel Constenla-Haile</td>
+ <td>1258</td>
+ <td>0.2%</td>
+ </tr>
+ <tr>
+ <td>Steve Yin</td>
+ <td>1010</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>Kay Schenk</td>
+ <td>616</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>Regina Henschel</td>
+ <td>417</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>Yuri Dario</td>
+ <td>268</td>
+ <td>0.0%</td>
+ </tr>
+ <tr>
+ <td>tal</td>
+ <td>16</td>
+ <td>0.0%</td>
+ </tr>
+ <tr>
+ <td>Clarence Guo</td>
+ <td>11</td>
+ <td>0.0%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files. </p>
+ <p> The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year. </p>
+ <p> The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were: </p>
+
+ <blockquote>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="2">Most active LibreOffice developers</th>
+ </tr>
+ <tr>
+ <td>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="3">By changesets</th>
+ </tr>
+ <tr>
+ <td>Caolán McNamara</td>
+ <td>4307</td>
+ <td>19.5%</td>
+ </tr>
+ <tr>
+ <td>Stephan Bergmann</td>
+ <td>2351</td>
+ <td>10.6%</td>
+ </tr>
+ <tr>
+ <td>Miklos Vajna</td>
+ <td>1449</td>
+ <td>6.5%</td>
+ </tr>
+ <tr>
+ <td>Tor Lillqvist</td>
+ <td>1159</td>
+ <td>5.2%</td>
+ </tr>
+ <tr>
+ <td>Noel Grandin</td>
+ <td>1064</td>
+ <td>4.8%</td>
+ </tr>
+ <tr>
+ <td>Markus Mohrhard</td>
+ <td>935</td>
+ <td>4.2%</td>
+ </tr>
+ <tr>
+ <td>Michael Stahl</td>
+ <td>915</td>
+ <td>4.1%</td>
+ </tr>
+ <tr>
+ <td>Kohei Yoshida</td>
+ <td>755</td>
+ <td>3.4%</td>
+ </tr>
+ <tr>
+ <td>Tomaž Vajngerl</td>
+ <td>658</td>
+ <td>3.0%</td>
+ </tr>
+ <tr>
+ <td>Thomas Arnhold</td>
+ <td>619</td>
+ <td>2.8%</td>
+ </tr>
+ <tr>
+ <td>Jan Holesovsky</td>
+ <td>466</td>
+ <td>2.1%</td>
+ </tr>
+ <tr>
+ <td>Eike Rathke</td>
+ <td>457</td>
+ <td>2.1%</td>
+ </tr>
+ <tr>
+ <td>Matteo Casalin</td>
+ <td>442</td>
+ <td>2.0%</td>
+ </tr>
+ <tr>
+ <td>Bjoern Michaelsen</td>
+ <td>421</td>
+ <td>1.9%</td>
+ </tr>
+ <tr>
+ <td>Chris Sherlock</td>
+ <td>396</td>
+ <td>1.8%</td>
+ </tr>
+ <tr>
+ <td>David Tardon</td>
+ <td>386</td>
+ <td>1.7%</td>
+ </tr>
+ <tr>
+ <td>Julien Nabet</td>
+ <td>362</td>
+ <td>1.6%</td>
+ </tr>
+ <tr>
+ <td>Zolnai Tamás</td>
+ <td>338</td>
+ <td>1.5%</td>
+ </tr>
+ <tr>
+ <td>Matúš Kukan</td>
+ <td>256</td>
+ <td>1.2%</td>
+ </tr>
+ <tr>
+ <td>Robert&nbsp;Antoni&nbsp;Buj&nbsp;Gelonch</td>
+ <td>231</td>
+ <td>1.0%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="3">By changed lines</th>
+ </tr>
+ <tr>
+ <td>Lionel Elie Mamane</td>
+ <td>244062</td>
+ <td>12.5%</td>
+ </tr>
+ <tr>
+ <td>Noel Grandin</td>
+ <td>238711</td>
+ <td>12.2%</td>
+ </tr>
+ <tr>
+ <td>Stephan Bergmann</td>
+ <td>161220</td>
+ <td>8.3%</td>
+ </tr>
+ <tr>
+ <td>Miklos Vajna</td>
+ <td>129325</td>
+ <td>6.6%</td>
+ </tr>
+ <tr>
+ <td>Caolán McNamara</td>
+ <td>97544</td>
+ <td>5.0%</td>
+ </tr>
+ <tr>
+ <td>Tomaž Vajngerl</td>
+ <td>69404</td>
+ <td>3.6%</td>
+ </tr>
+ <tr>
+ <td>Tor Lillqvist</td>
+ <td>59498</td>
+ <td>3.1%</td>
+ </tr>
+ <tr>
+ <td>Laurent Balland-Poirier</td>
+ <td>52802</td>
+ <td>2.7%</td>
+ </tr>
+ <tr>
+ <td>Markus Mohrhard</td>
+ <td>50509</td>
+ <td>2.6%</td>
+ </tr>
+ <tr>
+ <td>Kohei Yoshida</td>
+ <td>45514</td>
+ <td>2.3%</td>
+ </tr>
+ <tr>
+ <td>Chris Sherlock</td>
+ <td>36788</td>
+ <td>1.9%</td>
+ </tr>
+ <tr>
+ <td>Peter Foley</td>
+ <td>34305</td>
+ <td>1.8%</td>
+ </tr>
+ <tr>
+ <td>Christian Lohmaier</td>
+ <td>33787</td>
+ <td>1.7%</td>
+ </tr>
+ <tr>
+ <td>Thomas Arnhold</td>
+ <td>32722</td>
+ <td>1.7%</td>
+ </tr>
+ <tr>
+ <td>David Tardon</td>
+ <td>21681</td>
+ <td>1.1%</td>
+ </tr>
+ <tr>
+ <td>David Ostrovsky</td>
+ <td>21620</td>
+ <td>1.1%</td>
+ </tr>
+ <tr>
+ <td>Jan Holesovsky</td>
+ <td>20792</td>
+ <td>1.1%</td>
+ </tr>
+ <tr>
+ <td>Valentin Kettner</td>
+ <td>20526</td>
+ <td>1.1%</td>
+ </tr>
+ <tr>
+ <td>Robert&nbsp;Antoni&nbsp;Buj&nbsp;Gelonch</td>
+ <td>20447</td>
+ <td>1.0%</td>
+ </tr>
+ <tr>
+ <td>Michael Stahl</td>
+ <td>18216</td>
+ <td>0.9%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> To a first approximation, the top ten companies supporting LibreOffice in the last year are: </p>
+
+ <blockquote>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="3">Companies supporting LibreOffice development</th>
+ </tr>
+ <tr>
+ <th colspan="3">(by changesets)</th>
+ </tr>
+ <tr>
+ <td>Red Hat</td>
+ <td>8417</td>
+ <td>38.0%</td>
+ </tr>
+ <tr>
+ <td>Collabora <strike>Multimedia</strike></td>
+ <td>6531</td>
+ <td>29.5%</td>
+ </tr>
+ <tr>
+ <td>(Unknown)</td>
+ <td>5126</td>
+ <td>23.2%</td>
+ </tr>
+ <tr>
+ <td>(None)</td>
+ <td>1490</td>
+ <td>6.7%</td>
+ </tr>
+ <tr>
+ <td>Canonical</td>
+ <td>422</td>
+ <td>1.9%</td>
+ </tr>
+ <tr>
+ <td>Igalia S.L.</td>
+ <td>80</td>
+ <td>0.4%</td>
+ </tr>
+ <tr>
+ <td>Ericsson</td>
+ <td>21</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>Yandex</td>
+ <td>18</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>FastMail.FM</td>
+ <td>17</td>
+ <td>0.1%</td>
+ </tr>
+ <tr>
+ <td>SUSE</td>
+ <td>7</td>
+ <td>0.0%</td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies. </p>
+
+ <h4>Some conclusions</h4>
+ <p> Last October, some <a href="http://fakehost/Articles/637742/">concerns</a> were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir <a href="http://fakehost/Articles/637743/">shrugged them off</a> as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here. </p>
+ <p> In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community. </p>
+ <p> OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the <a href="https://blogs.apache.org/OOo/">OpenOffice
blog</a> shows no posts in 2015. In the October discussion, Rob <a href="http://fakehost/Articles/637750/">said</a> that "<span>the dogs may
bark but the caravan moves on.</span>" That may be true, but, in this case, the caravan does not appear to be moving with any great speed. </p>
- <p> Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation. </p>
- <p><a href="http://fakehost/Articles/637735/#Comments">Comments (74 posted)</a> </p>
-
- <p> <b>Page editor</b>: Jonathan Corbet
- <br></br></p>
- <h2>Inside this week's LWN.net Weekly Edition</h2>
- <ul><li> <a href="http://fakehost/Articles/637395/">Security</a>: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ... </li>
- <li> <a href="http://fakehost/Articles/637396/">Kernel</a>: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more. </li>
- <li> <a href="http://fakehost/Articles/637397/">Distributions</a>: A look at Debian's 2015 DPL candidates; Debian, Fedora, ... </li>
- <li> <a href="http://fakehost/Articles/637398/">Development</a>: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ... </li>
- <li> <a href="http://fakehost/Articles/637399/">Announcements</a>: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ... </li>
- </ul><p><b>Next page</b>: <a href="http://fakehost/Articles/637395/">Security&gt;&gt;</a>
- <br></br></p></div>
-
- </td>
-
- <td>
-
- </td>
- </div> \ No newline at end of file
+ <p> Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation. </p>
+ <p><a href="http://fakehost/Articles/637735/#Comments">Comments (74 posted)</a> </p>
+
+ <p> <b>Page editor</b>: Jonathan Corbet
+ <br> </p>
+ <h2>Inside this week's LWN.net Weekly Edition</h2>
+ <ul>
+ <li> <a href="http://fakehost/Articles/637395/">Security</a>: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ... </li>
+ <li> <a href="http://fakehost/Articles/637396/">Kernel</a>: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more. </li>
+ <li> <a href="http://fakehost/Articles/637397/">Distributions</a>: A look at Debian's 2015 DPL candidates; Debian, Fedora, ... </li>
+ <li> <a href="http://fakehost/Articles/637398/">Development</a>: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ... </li>
+ <li> <a href="http://fakehost/Articles/637399/">Announcements</a>: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ... </li>
+ </ul> <p><b>Next page</b>: <a href="http://fakehost/Articles/637395/">Security&gt;&gt;</a>
+ <br> </p></div>
+
+ </td>
+
+ <td>
+
+ </td>
+</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json
index cfe75d030..cab39a2c1 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-images.json
@@ -1,3 +1,5 @@
[
- "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg"
-]
+ "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg",
+ "https:\/\/ei.marketwatch.com\/Multimedia\/2018\/03\/23\/Photos\/ZH\/MW-GG178_realty_20180323163027_ZH.jpg?uuid=0597cc9a-2ed9-11e8-a272-ac162d7bc1f7",
+ "https:\/\/i.mktw.net\/_newsimages\/2014_dreds\/andreariquiernew_100.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json
index 94f36a271..d603426e4 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected-metadata.json
@@ -2,7 +2,7 @@
"Author": "Andrea Riquier",
"Direction": null,
"Excerpt": "House prices show no sign of slowing down, according to a closely-watched index out Tuesday.",
- "Image": "http://s.marketwatch.com/public/resources/MWimages/MW-GG178_realty_ZG_20180323163027.jpg",
+ "Image": "http:\/\/s.marketwatch.com\/public\/resources\/MWimages\/MW-GG178_realty_ZG_20180323163027.jpg",
"Title": "Home prices are still on fire, Case-Shiller data show",
- "SiteName": null
-}
+ "SiteName": "MarketWatch"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html
index bd81ab3d7..253125136 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/marketwatch/expected.html
@@ -1,14 +1,59 @@
-<div id="article-body" itemprop="articleBody">
+<div id="topper">
+ <p id="published-timestamp">Published: <span>Mar 27, 2018 9:00 a.m. ET</span></p>
+ <h2 id="article-subhead" itemprop="alternativeHeadline">
- <p> <strong>The numbers:</strong> The S&amp;P/Case-Shiller national index rose a seasonally adjusted 0.5% in the three-month period ending in January, and was up 6.2% compared to a year before. The 20-city index rose a seasonally adjusted 0.8% for the month, and 6.4% for the year.</p> <p> <strong>What happened: </strong>Prices are still on fire. And the West is still the best: Seattle, Las Vegas and San Francisco all notched double-digit yearly price gains. Only one city, Washington, D.C., had a negative monthly reading. </p> <p>As David Blitzer, chairman of the index committee at S&amp;P Dow Jones Indices, noted in a release, the price gains are all about demand and lack of supply. </p> <p>“The current months-supply — how many months at the current sales rate would be needed to absorb homes currently for sale — is 3.4; the average since 2000 is 6.0 months, and the high in July 2010 was 11.9,” Blitzer wrote. “Currently, the homeowner vacancy rate is 1.6% compared to an average of 2.1% since 2000; it peaked in 2010 at 2.7%. Despite limited supplies, rising prices and higher mortgage rates, affordability is not a concern.”</p> <p>Relatively affordable housing is cold comfort to many would-be home buyers who simply can’t find anything to buy. </p> <p> <strong>Read:</strong> <a href="http://fakehost/story/two-thirds-of-house-hunters-have-been-searching-for-3-months-or-more-2018-02-22">Most house hunters have been searching for 3 months or more</a> </p> <p> <strong>Big picture:</strong> Economists had forecast a 0.7% monthly increase, and a 6.2% 12-month increase, for the 20-city index. <a href="http://fakehost/story/why-its-so-hard-to-forecast-home-prices-for-2018-and-why-that-should-worry-you-2017-12-19">As MarketWatch has reported</a>, most housing analysts have argued that the ongoing price gains in housing can’t last — and yet they have so far. </p> <table readabilityDataTable="1"><tbody><tr><td colspan="" id=""> <strong>Metro</strong> </td> <td colspan="" id=""> <strong>Monthly change</strong> </td> <td colspan="" id=""> <strong>12-month change</strong> </td> </tr><tr><td colspan="" id="">Atlanta</td> <td colspan="" id="">0.7%</td> <td colspan="" id="">6.5%</td> </tr><tr><td colspan="" id="">Boston</td> <td colspan="" id="">0.2%</td> <td colspan="" id="">5.3%</td> </tr><tr><td colspan="" id="">Charlotte</td> <td colspan="" id="">0.4%</td> <td colspan="" id="">6.0%</td> </tr><tr><td colspan="" id="">Chicago</td> <td colspan="" id="">0.0%</td> <td colspan="" id="">2.4%</td> </tr><tr><td colspan="" id="">Cleveland</td> <td colspan="" id="">0.0%</td> <td colspan="" id="">3.5%</td> </tr><tr><td colspan="" id="">Dallas</td> <td colspan="" id="">0.2%</td> <td colspan="" id="">6.9%</td> </tr><tr><td colspan="" id="">Denver</td> <td colspan="" id="">0.7%</td> <td colspan="" id="">7.6%</td> </tr><tr><td colspan="" id="">Detroit</td> <td colspan="" id="">0.1%</td> <td colspan="" id="">7.6%</td> </tr><tr><td colspan="" id="">Las Vegas</td> <td colspan="" id="">0.6%</td> <td colspan="" id="">11.1%</td> </tr><tr><td colspan="" id="">Los Angeles</td> <td colspan="" id="">0.6%</td> <td colspan="" id="">7.6%</td> </tr><tr><td colspan="" id="">Miami</td> <td colspan="" id="">0.6%</td> <td colspan="" id="">4.0%</td> </tr><tr><td colspan="" id="">Minneapolis</td> <td colspan="" id="">0.1%</td> <td colspan="" id="">5.9%</td> </tr><tr><td colspan="" id="">New York</td> <td colspan="" id="">0.0%</td> <td colspan="" id="">5.2%</td> </tr><tr><td colspan="" id="">Phoenix</td> <td colspan="" id="">0.3%</td> <td colspan="" id="">5.9%</td> </tr><tr><td colspan="" id="">Portland</td> <td colspan="" id="">0.4%</td> <td colspan="" id="">7.1%</td> </tr><tr><td colspan="" id="">San Diego</td> <td colspan="" id="">0.8%</td> <td colspan="" id="">7.4%</td> </tr><tr><td colspan="" id="">San Francisco</td> <td colspan="" id="">0.4%</td> <td colspan="" id="">10.2%</td> </tr><tr><td colspan="" id="">Seattle</td> <td colspan="" id="">0.7%</td> <td colspan="" id="">12.9%</td> </tr><tr><td colspan="" id="">Tampa</td> <td colspan="" id="">0.4%</td> <td colspan="" id="">6.7%</td> </tr><tr><td colspan="" id="">Washington</td> <td colspan="" id="">-0.4%</td> <td colspan="" id="">2.4%</td> </tr></tbody></table><p>Read: <a href="http://fakehost/story/mortgage-rates-edge-up-even-as-trade-war-worries-loom-ahead-2018-03-22">Mortgage rates edge up even as trade war worries loom ahead</a></p>
+<p>After a lull, San Francisco is back to being one of the top three hottest markets</p>
+ </h2>
+
+ </div><div id="content-hole">
+
+
+
+
+ <article id="article" itemscope itemtype="http://schema.org/NewsArticle" itemref="article-headline article-subhead">
+ <meta id="article-section" itemprop="articleSection" content>
+ <meta id="thumbnail-url" itemprop="thumbnailUrl" content>
+ <meta id="date-created" itemprop="dateCreated" content="Mar 27, 2018 9:00 a.m. ET">
+ <meta id="date-published" itemprop="datePublished" content="Mar 27, 2018 9:00 a.m. ET">
+
+ <figure>
+ <p><img alt src="https://ei.marketwatch.com/Multimedia/2018/03/23/Photos/ZH/MW-GG178_realty_20180323163027_ZH.jpg?uuid=0597cc9a-2ed9-11e8-a272-ac162d7bc1f7">
+ <cite>Bloomberg News/Landov</cite>
+ </p>
+ <figcaption>A home for sale in Seattle, Wash., one of the nation’s hottest housing markets. </figcaption>
+ </figure>
+
+ <div id="article-meat">
+ <div id="article-left-rail">
+ <p><a href="https://www.marketwatch.com/topics/journalists/andrea-riquier">
+ <img alt="Author photo" src="https://i.mktw.net/_newsimages/2014_dreds/andreariquiernew_100.png">
+ </a></p><p>By</p>
+ <a rel="author" title="Andrea Riquier" href="https://www.marketwatch.com/topics/journalists/andrea-riquier">
+
+ </a>
+
+
+ </div>
+
+ <div id="article-body" itemprop="articleBody">
+
+
+
+
+
+
+
+
+
+ <p> <strong>The numbers:</strong> The S&amp;P/Case-Shiller national index rose a seasonally adjusted 0.5% in the three-month period ending in January, and was up 6.2% compared to a year before. The 20-city index rose a seasonally adjusted 0.8% for the month, and 6.4% for the year.</p> <p> <strong>What happened: </strong>Prices are still on fire. And the West is still the best: Seattle, Las Vegas and San Francisco all notched double-digit yearly price gains. Only one city, Washington, D.C., had a negative monthly reading. </p> <p>As David Blitzer, chairman of the index committee at S&amp;P Dow Jones Indices, noted in a release, the price gains are all about demand and lack of supply. </p> <p>“The current months-supply — how many months at the current sales rate would be needed to absorb homes currently for sale — is 3.4; the average since 2000 is 6.0 months, and the high in July 2010 was 11.9,” Blitzer wrote. “Currently, the homeowner vacancy rate is 1.6% compared to an average of 2.1% since 2000; it peaked in 2010 at 2.7%. Despite limited supplies, rising prices and higher mortgage rates, affordability is not a concern.”</p> <p>Relatively affordable housing is cold comfort to many would-be home buyers who simply can’t find anything to buy. </p> <p> <strong>Read:</strong> <a href="http://fakehost/story/two-thirds-of-house-hunters-have-been-searching-for-3-months-or-more-2018-02-22">Most house hunters have been searching for 3 months or more</a> </p> <p> <strong>Big picture:</strong> Economists had forecast a 0.7% monthly increase, and a 6.2% 12-month increase, for the 20-city index. <a href="http://fakehost/story/why-its-so-hard-to-forecast-home-prices-for-2018-and-why-that-should-worry-you-2017-12-19">As MarketWatch has reported</a>, most housing analysts have argued that the ongoing price gains in housing can’t last — and yet they have so far. </p> <table readabilityDataTable="1"> <tbody> <tr> <td id colspan> <strong>Metro</strong> </td> <td id colspan> <strong>Monthly change</strong> </td> <td id colspan> <strong>12-month change</strong> </td> </tr> <tr> <td id colspan>Atlanta</td> <td id colspan>0.7%</td> <td id colspan>6.5%</td> </tr> <tr> <td id colspan>Boston</td> <td id colspan>0.2%</td> <td id colspan>5.3%</td> </tr> <tr> <td id colspan>Charlotte</td> <td id colspan>0.4%</td> <td id colspan>6.0%</td> </tr> <tr> <td id colspan>Chicago</td> <td id colspan>0.0%</td> <td id colspan>2.4%</td> </tr> <tr> <td id colspan>Cleveland</td> <td id colspan>0.0%</td> <td id colspan>3.5%</td> </tr> <tr> <td id colspan>Dallas</td> <td id colspan>0.2%</td> <td id colspan>6.9%</td> </tr> <tr> <td id colspan>Denver</td> <td id colspan>0.7%</td> <td id colspan>7.6%</td> </tr> <tr> <td id colspan>Detroit</td> <td id colspan>0.1%</td> <td id colspan>7.6%</td> </tr> <tr> <td id colspan>Las Vegas</td> <td id colspan>0.6%</td> <td id colspan>11.1%</td> </tr> <tr> <td id colspan>Los Angeles</td> <td id colspan>0.6%</td> <td id colspan>7.6%</td> </tr> <tr> <td id colspan>Miami</td> <td id colspan>0.6%</td> <td id colspan>4.0%</td> </tr> <tr> <td id colspan>Minneapolis</td> <td id colspan>0.1%</td> <td id colspan>5.9%</td> </tr> <tr> <td id colspan>New York</td> <td id colspan>0.0%</td> <td id colspan>5.2%</td> </tr> <tr> <td id colspan>Phoenix</td> <td id colspan>0.3%</td> <td id colspan>5.9%</td> </tr> <tr> <td id colspan>Portland</td> <td id colspan>0.4%</td> <td id colspan>7.1%</td> </tr> <tr> <td id colspan>San Diego</td> <td id colspan>0.8%</td> <td id colspan>7.4%</td> </tr> <tr> <td id colspan>San Francisco</td> <td id colspan>0.4%</td> <td id colspan>10.2%</td> </tr> <tr> <td id colspan>Seattle</td> <td id colspan>0.7%</td> <td id colspan>12.9%</td> </tr> <tr> <td id colspan>Tampa</td> <td id colspan>0.4%</td> <td id colspan>6.7%</td> </tr> <tr> <td id colspan>Washington</td> <td id colspan>-0.4%</td> <td id colspan>2.4%</td> </tr> </tbody> </table> <p>Read: <a href="http://fakehost/story/mortgage-rates-edge-up-even-as-trade-war-worries-loom-ahead-2018-03-22">Mortgage rates edge up even as trade war worries loom ahead</a></p>
@@ -44,4 +89,10 @@
- </div> \ No newline at end of file
+ </div>
+ </div>
+ </article>
+
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-images.json
new file mode 100644
index 000000000..45552803a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-images.json
@@ -0,0 +1,4 @@
+[
+ "https:\/\/cdn1.medicalnewstoday.com\/content\/images\/headlines\/318\/318674\/hand-holding-brain-lightbulb.jpg",
+ "https:\/\/cdn1.medicalnewstoday.com\/content\/images\/articles\/318\/318674\/hand-holding-brain-lightbulb.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-metadata.json
new file mode 100644
index 000000000..7b3947e63
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "By Ana Sandoiu",
+ "Direction": null,
+ "Excerpt": "New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem.",
+ "Image": "https:\/\/cdn1.medicalnewstoday.com\/content\/images\/headlines\/318\/318674\/hand-holding-brain-lightbulb.jpg",
+ "Title": "How does the brain turn unconscious information into conscious thought?",
+ "SiteName": "Medical News Today"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected.html
new file mode 100644
index 000000000..18ab009e4
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/expected.html
@@ -0,0 +1,102 @@
+<div itemprop="articleBody">
+ <header>
+ Neuroscience tells us that most of the work done by our brains happens on an unconscious level, but when does that "a-ha!" moment occur? And what happens during it? New research investigates.
+ </header>
+ <p><img data-src="https://cdn1.medicalnewstoday.com/content/images/articles/318/318674/hand-holding-brain-lightbulb.jpg" alt="hand holding brain lightbulb" src="https://cdn1.medicalnewstoday.com/content/images/articles/318/318674/hand-holding-brain-lightbulb.jpg"><br>
+ <em>A new study investigates when the 'a-ha!' moment takes place in the brain, and how similar it is to other brain processes.</em>
+ </p>
+ <p>
+ Many of us have noticed that we seem to get our best ideas when we're in the shower, or that we can find the answer to a difficult question when we least think about it.
+ </p>
+ <p>
+ A large body of neuroscientific <a href="http://journals.sagepub.com/doi/abs/10.1177/0956797612446024" target="_blank" rel="noopener">studies</a> has pointed out that the brain does a lot of work in its spare time, the so-called idle state - wherein the brain does not appear to be thinking about anything at all - and that this is the time when it works at its hardest to find solutions to complex problems.
+ </p>
+ <p>
+ With time and advances in <a href="http://fakehost/articles/248680.php" title="What is neuroscience?">neuroscience</a>, it has become more and more clear to researchers that Freud <em>was</em> right and the mind, as well as the brain, do work unconsciously. In fact, it would be safe to say that what is consciously known to us is just the tip of a much larger iceberg, deeply submerged in unconscious waters.
+ </p>
+ <p>
+ But the exact moment at which information becomes known to us - or when the "tip of the iceberg" pierces through the water, and the unconscious becomes conscious - has been somewhat of a mystery, from a neuroscientific point of view.
+ </p>
+ <p>
+ In other words, we do not yet know when that intellectually satisfying "a-ha!" moment takes place, or what the biology is behind it. This is why a team of researchers at Columbia University in New York City, NY, set out to investigate this moment in more detail.
+ </p>
+
+ <p>
+ The scientists were led by Michael Shadlen, Ph.D., of Columbia University's Mortimer B. Zuckerman Mind Brain Behavior Institute, and the <a href="http://www.cell.com/current-biology/fulltext/S0960-9822(17)30784-4" target="_blank" rel="noopener">findings</a> were published in the journal <em>Current Biology.</em>
+ </p>
+
+ <h2>
+ The hypothesis
+ </h2>
+ <p>
+ Dr. Shadlen and colleagues started out from an interesting hypothesis, one which they derived from previous research on the neurobiological processes involved in decision-making.
+ </p>
+ <p>
+ As the authors explain, research conducted in both monkeys and humans shows that many of our decisions take place at a point when the brain "feels" as though it has gathered enough information, or when a critical level of information has been accumulated.
+ </p>
+
+ <p>
+ This process of making a decision once the brain has accumulated enough evidence bears the name of "bounded evidence accumulation." Reaching this threshold is important because, although the brain does not use <em>all</em> of the information available, it uses as much as is necessary to make a speedy yet accurate decision.
+ </p>
+ <p>
+ <strong>The researchers wondered whether or not this threshold is also responsible for our "eureka!" moments.</strong>
+ </p>
+
+ <p>
+ In Dr. Shadlen's words, "Could the moment when the brain believes it has accumulated enough evidence be tied to the person's awareness of having decided - that important 'a-ha!' moment?"
+ </p>
+
+ <h2>
+ Examining the 'a-ha!' moment
+ </h2>
+ <p>
+ To answer this question, the scientists asked five people to perform a "direction discrimination" task. In it, the participants looked at dots on a computer screen. The dots moved randomly, as grains of sand would when blown by the wind. The participants were asked to say in which direction the dots had moved.
+ </p>
+ <p>
+ The moment they "decided" which direction the dots seemed to be taking was considered to be the equivalent of the "a-ha!" moment.
+ </p>
+ <p>
+ In the center of the screen, there was a fixed point and a clock. The display also had two "choice targets" - namely, left or right - and these were the directions in which the participants had to decide that the dots had moved.
+ </p>
+ <p>
+ Shortly after the dots had stopped moving, the participants used an electronic, hand-held stylus to move the cursor in the direction that they thought the dots had moved.
+ </p>
+ <p>
+ To determine when the decision was made, the researchers used the technique called "mental chronometry" - that is, after they made their decision, the participants were asked to move the clock backward to the point when they felt that they had consciously done so.
+ </p>
+
+ <p>
+ "The moment in time indicated by the participants - this mental chronometry - was entirely subjective; it relied solely on their own estimation of how long it took them to make that decision," Dr. Shadlen says. "And because it was purely subjective, in principle it ought to be unverifiable."
+ </p>
+
+ <h2>
+ 'A-ha' moment similar to making a decision
+ </h2>
+ <p>
+ However, by applying a mathematical model, the scientists were able to match these subjective decision times to the bounded evidence accumulation process.
+ </p>
+ <p>
+ <strong>The subjective decision times fit so well with what the scientists determined as the evidence accumulation threshold that they were able to predict the choices of four of the five participants.</strong>
+ </p>
+ <p>
+ "If the time reported to us by the participants was valid, we reasoned that it might be possible to predict the accuracy of the decision," explains Dr. Shadlen.
+ </p>
+ <p>
+ "We incorporated a kind of mathematical trick, based on earlier studies, which showed that the speed and accuracy of decisions were tied together by the same brain function." This "mathematical trick" was the evidence accumulation model.
+ </p>
+ <blockquote>
+ <p>
+ <span>"</span>Essentially, the act of becoming consciously aware of a decision conforms to the same process that the brain goes through to complete a decision, even a simple one - such as whether to turn left or right."
+ </p>
+ <p>
+ Michael Shadlen, Ph.D.
+ </p>
+ </blockquote>
+ <p>
+ In other words, the study shows that the conscious awareness of the "a-ha!" moment takes place precisely when the brain has reached that threshold of evidence accumulation.
+ </p>
+ <p>
+ The findings provide unique insights into the biology of consciousness, say the researchers, and they bring us closer to understanding the biological basis of decisions, ethics, and, generally, the human mind.
+ </p>
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/source.html
new file mode 100644
index 000000000..8a014599f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medicalnewstoday/source.html
@@ -0,0 +1,2012 @@
+<!DOCTYPE html>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <!--[318674|cccs|]-->
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>
+ How does the brain turn unconscious information into conscious thought?
+ </title>
+ <meta property="og:url" content="https://www.medicalnewstoday.com/articles/318674.php" />
+ <meta property="og:type" content="article" />
+ <meta property="og:site_name" content="Medical News Today" />
+ <meta property="og:title" content="How does the brain turn unconscious information into conscious thought?" />
+ <meta property="og:description" content="New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem." />
+ <meta name="description" content="New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem." />
+ <meta property="og:image" content="https://cdn1.medicalnewstoday.com/content/images/headlines/318/318674/hand-holding-brain-lightbulb.jpg" />
+ <meta property="fb:admins" content="1658973110" />
+ <meta property="fb:app_id" content="147184211975697" />
+ <meta itemprop="description" content="New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem." />
+ <meta itemprop="image" content="https://cdn1.medicalnewstoday.com/content/images/headlines/318/318674/hand-holding-brain-lightbulb.jpg" />
+ <meta name="twitter:domain" content="medicalnewstoday.com" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:site" content="@mnt" />
+ <meta name="twitter:title" content="How does the brain turn unconscious information into conscious thought?" />
+ <meta name="twitter:description" content="New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem." />
+ <meta name="twitter:creator" content="@mnt" />
+ <meta name="twitter:image:src" content="https://cdn1.medicalnewstoday.com/content/images/headlines/318/318674/hand-holding-brain-lightbulb.jpg" />
+ <meta name="news_keywords" content="bounded accumulation model, bounded accumulation evidence, unconscious, consciousness, aha moment" />
+ <meta name="rating" content="general" />
+ <meta http-equiv="Cache-Control" content="no-cache" />
+ <link href="https://plus.google.com/+medicalnews" rel="publisher" />
+ <meta name="p:domain_verify" content="ca332f19ebf583ba72eff99cc210a982" />
+ <meta http-equiv="bulletin-text" content="Copyright" />
+ <link rel="canonical" href="https://www.medicalnewstoday.com/articles/318674.php" />
+ <link rel="shortcut icon" type="image/png" href="https://cdn1.medicalnewstoday.com/favicon.png" />
+ <link rel="icon" sizes="32x32" href="https://cdn1.medicalnewstoday.com/favicon.ico" />
+ <link rel="apple-touch-icon" type="image/png" href="https://cdn1.medicalnewstoday.com/apple-touch-icon.png" />
+ <link rel="alternate" type="application/rss+xml" title="Medical News Today - Health News Headlines RSS Feed" href="https://rss.medicalnewstoday.com/featurednews.xml" />
+ <link rel="alternate" type="application/json" title="Medical News Today - Health News Headlines JSON Feed" href="https://rss.medicalnewstoday.com/json/featurednews.json" />
+ <meta http-equiv="x-dns-prefetch-control" content="on" />
+ <link rel="preconnect dns-prefetch" href="//cdn1.medicalnewstoday.com" crossorigin="" />
+ <link rel="preconnect dns-prefetch" href="//cdn2.medicalnewstoday.com" crossorigin="" />
+ <link rel="preload" as="font" crossorigin="crossorigin" href="https://cdn2.medicalnewstoday.com/structure/fonts/ProximaNova/ProximaNova-Light.woff2" />
+ <link rel="preload" as="font" crossorigin="crossorigin" href="https://cdn2.medicalnewstoday.com/structure/fonts/ProximaNova/ProximaNova-Regular.woff2" />
+ <link rel="preload" as="font" crossorigin="crossorigin" href="https://cdn2.medicalnewstoday.com/structure/fonts/ProximaNova/ProximaNova-Bold.woff2" />
+ <link rel="preload" as="font" crossorigin="crossorigin" href="https://cdn2.medicalnewstoday.com/structure/fonts/ProximaNova/ProximaNova-ExtraBold.woff2" />
+ <link rel="preload" as="font" crossorigin="crossorigin" href="https://cdn2.medicalnewstoday.com/structure/fonts/Arnhem/ArnhemPro-Bold.woff" />
+ <link rel="stylesheet" type="text/css" href="https://cdn2.medicalnewstoday.com/structure/styles/styles_fonts_7721.css" />
+ <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous" />
+ <link rel="stylesheet" href="https://cdn2.medicalnewstoday.com/structure/styles/out/mnt_default_redesign_7721.css?v=20181203" type="text/css" media="all" />
+ <link rel="stylesheet" href="https://cdn2.medicalnewstoday.com/structure/styles/out/mnt_print_redesign_7721.css?v=20181203" type="text/css" media="print" /><!--[if lt IE 9]>
+<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <link rel="stylesheet" href="https://cdn2.medicalnewstoday.com/structure/styles/out/mnt_ie.css" type="text/css" media="all" />
+ <![endif]-->
+ <!--[if IE 7]>
+
+<script src="//ie7-js.googlecode.com/svn/version/2.1(beta4)/IE7.js"></script>
+<![endif]--><!--[if IE 9]>
+<script src="//ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
+<![endif]-->
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.2, maximum-scale=2.0, user-scalable=1" /><!--desktop-->
+ <noscript>
+ <link rel="stylesheet" href="https://cdn1.medicalnewstoday.com/structure/styles/styles_noscript.css" type="text/css" media="all" /></noscript>
+ <script type="text/javascript">
+ //<![CDATA[
+ var glob_mntcookie = 0;
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+
+ glob_JS=(typeof glob_JS === 'undefined')?{'GAInit':[],'GA':[],"ExternalJS":[],"AD":[]}:glob_JS;
+
+ glob_TrueOnGDPR=(glob_mntcookie!=1);
+
+ //if use GDPR is true, we need this flag to make sure ga queue can ber execute after ga is ready
+ glob_isGaReady=!glob_TrueOnGDPR;
+
+
+
+ if(typeof fireOrSaveGoogleAdFunctions === 'undefined'){
+
+
+
+ function fireOrSaveGoogleAdFunctions(adFunction){
+
+ if(!glob_TrueOnGDPR){
+
+ adFunction();
+
+ }else{
+
+ if(typeof fireOrSaveGoogleADs === 'undefined'){
+ //save ad event in queue
+ glob_JS.AD.push(adFunction);
+ }else{
+ //let next function to determine save or fire ad function
+ fireOrSaveGoogleADs(adFunction);
+
+ }
+ }
+
+ }
+
+ function fireOrSaveJsFunctions(jsType,jsFunction){
+
+ if(!glob_TrueOnGDPR && jsType!=0){
+ //if GDPR already accept, and func type is not ga event, just exec
+
+ jsFunction()
+
+ }else if(!glob_TrueOnGDPR && jsType===0) {
+ //for ga event only
+
+ if(glob_isGaReady) {
+ //if ga ready, call the function
+ jsFunction();
+ }else{
+ //if user accept GDPR, but ga not ready, still push new command into queue
+ glob_JS.GA.push(jsFunction);
+
+ }
+
+ }else{
+
+ if(jsType<0){
+ jsType='GAInit'
+ }else if(jsType==0){
+ jsType='GA';
+ }else{
+ jsType='ExternalJS';
+ }
+
+ if(typeof fireJS === 'undefined'){
+ //save ad event in queue
+
+
+ if(jsType=='GAInit'){
+
+ glob_JS.GAInit.push(jsFunction);
+
+ }else if(jsType=='GA') {
+
+ glob_JS.GA.push(jsFunction);
+ }else
+ {
+ //default is other js
+ glob_JS.ExternalJS.push(jsFunction);
+ }
+
+
+ }else{
+ //let next function to determine save or fire ad function
+ fireJS(jsType,jsFunction);
+
+ }
+ }
+ }
+
+
+
+ function loadScript(url, parameters,callback){
+
+
+
+ var script = document.createElement("script");
+ script.type = "text/javascript";
+
+
+ //add custom attribute
+ for (var key in parameters) {
+ if (parameters.hasOwnProperty(key)) {
+ script.setAttribute(key,parameters[key]);
+ }
+ }
+
+
+ if (script.readyState){ //IE
+ script.onreadystatechange = function(){
+ if (script.readyState == "loaded" ||
+ script.readyState == "complete"){
+ script.onreadystatechange = null;
+ callback();
+ }
+ };
+ } else { //Others
+ script.onload = function(){
+
+ if(typeof callback === 'function'){
+ callback();
+ }
+
+ };
+ }
+
+ script.src = url;
+ document.getElementsByTagName("head")[0].appendChild(script);
+ }
+
+
+
+ }
+
+ ]]>
+ </script><!--<script type='text/javascript'>
+(function() {
+var useSSL = 'https:' == document.location.protocol;
+var src = (useSSL ? 'https:' : 'http:') +
+'//www.googletagservices.com/tag/js/gpt.js';
+document.write('<scr' + 'ipt src="' + src + '"></scr' + 'ipt>');
+})();
+</script>-->
+
+ <script type="text/javascript">
+ //<![CDATA[
+ //CMP
+ var isEEA = true;
+ var passEEACheck = false;
+
+ var metadata = 'BOSk20WOSk20WABABBENBR-AAAAeCAFAAUABwAEAANABCA';
+ var purposeConsents = { 1: true, 2: true, 3: true, 4: true, 5: true };
+ var vendorConsents = { 10:true, 28: true, 32: true, 52: true, 132: true };
+
+ function __cmp(cmd, p, cb) {
+ if (cmd === 'getVendorConsents' || cmd === 'getConsentData') {
+ cb({
+ hasGlobalScope: true,
+ gdprApplies: isEEA,
+ metadata: metadata,
+ consentData: metadata,
+ purposeConsents: purposeConsents,
+ vendorConsents: vendorConsents
+ }, true);
+ } else if (cmd === 'ping') {
+ cb({gdprAppliesGlobally: false, cmpLoaded: isEEA});
+ } else {
+ throw new Error('Invalid CMP command '+ cmd);
+ }
+ }
+ //]]>
+ </script><!-- <script async src="//js-sec.indexww.com/ht/p/184901-208206248649346.js"></script> -->
+
+ <script type="text/javascript">
+ //<![CDATA[
+ //ADBRIDG MIGRATION: Load the Adbridg library directly after the GPT library.
+ var AdBridg = AdBridg || {};
+ AdBridg.cmd = AdBridg.cmd || [];
+ window.adbridgFallback = function() {
+ console.log('ADBRIDG MIGRATION: library failed to load; falling back to GPT');
+ var dq = [], l = [], ls = {}, lf = [], es;
+ var rl = function(f) {return function(){var a=arguments, x=function(){f.apply(null,a)};lf.push(x);pl()}}
+ var pl = function() {if(!l.length){while(lf.length){(lf.shift())()}}}
+ dq.process = function() { while(dq.length) { googletag.display(dq.shift()); }}
+ AdBridg.defineSlot = function(p, s, d) { return googletag.defineSlot(p, s, d).addService(googletag.pubads()); }
+ AdBridg.defineOutOfPageSlot = function(p, d) { return googletag.defineOutOfPageSlot(p, d).addService(googletag.pubads()); }
+ AdBridg.destroySlots = function(s) { return googletag.destroySlots(s); }
+ AdBridg.display = function(d) { dq.push(d); if (es) { dq.process(); }}
+ AdBridg.refresh = function(s, o) { googletag.pubads().refresh(s, o); }
+ AdBridg.render = function() { }
+ AdBridg.serve = function() { googletag.enableServices(); es=1; dq.process(); }
+ AdBridg.sizeMapping = function() { return googletag.sizeMapping(); }
+ AdBridg.useSizeMapping = function() { }
+ AdBridg.lock = function(s) {if(ls[s]){ls[s]=null;return;}l.push(s);pl()}
+ AdBridg.unlock = function(s) {var f=0; for(var i=0;i<l.length;++i){if(l[i]==s){l.splice(i,1);f=1}}; if(!f){ls[s]=1} pl()}
+ AdBridg.cmd.push = function(f) {
+ if (typeof(f)=='object') {
+ var api_fallback = function(o) {
+ googletag.cmd.push(function() {
+ var fl;
+ if (o.gpt_path) {
+ var u=AdBridg.defineSlot(o.gpt_path,o.size||[],o.dom_id);
+ if(o.size_map) {
+ var m = googletag.sizeMapping();
+ for(var oi=0;oi<o.size_map.length;oi++){m=m.addSize(o.size_map[oi].viewport, o.size_map[oi].sizes);}
+ u.defineSizeMapping(m.build());
+ }
+ if(o.events) {
+ if(o.events["gpt.defined"]){o.events["gpt.defined"](u);}
+ fl = function(a,b){if(o.events[a]){googletag.pubads().addEventListener(b,function(e){if(e.slot===u){o.events[a](u,e)}})}}
+ fl("gpt.rendered",'slotRenderEnded');
+ fl("gpt.viewed",'impressionViewable');
+ fl("gpt.visibilityChanged",'slotVisibilityChanged');
+ }
+ } else if (o.events) {
+ fl = function(a,b){if(o.events[a]){googletag.pubads().addEventListener(b,function(e){o.events[a](a,e)})}}
+ fl("gpt.render_raw",'slotRenderEnded');
+ fl("gpt.viewed_raw",'impressionViewable');
+ }
+ });
+ }
+ if(f.length){for(var i=0;i<f.length;++i){api_fallback(f[i]);}}else{api_fallback(f);}
+ f=function(){AdBridg.serve()}
+ }
+ return googletag.cmd.push(f);
+ }
+ while (AdBridg.cmd.length) { AdBridg.cmd.push(AdBridg.cmd.shift()); }
+ };
+ fireOrSaveJsFunctions(1, function() {
+ (function() {
+ var adb = document.createElement("script");
+ adb.async = true;
+ adb.type = "text/javascript";
+ adb.src = '//prod.adspsp.com/adb.2418030m.min.js';
+ var node = document.getElementsByTagName('script')[0];
+ node.parentNode.insertBefore(adb, node);
+
+ // Return control to GPT if the AdBridg library fails to load.
+ adb.onerror = function() {
+ if (AdBridg.exists) { return; }
+ document.createElement('IMG').src = '//adspsp.com/pt/2418030/3/1/?e=0';
+ window.adbridgFallback();
+ }
+ })();
+ });
+ //]]>
+ </script><!-- Load DFP -->
+
+ <script type="text/javascript">
+ //<![CDATA[
+ var googletag = googletag || { };
+ googletag.cmd = googletag.cmd || [ ];
+ fireOrSaveJsFunctions(1,function(){
+ (function() {
+ var gads = document.createElement("script");
+ gads.async = true;
+ gads.type = "text/javascript";
+ var useSSL = "https:" == document.location.protocol;
+ gads.src = (useSSL ? "https:" : "http:") + "//www.googletagservices.com/tag/js/gpt.js";
+ var node =document.getElementsByTagName("script")[0];
+ node.parentNode.insertBefore(gads, node);
+ })();
+ });
+ //]]>
+ </script><!--New header bidding-->
+
+ <script>
+ <![CDATA[
+ var amzn_win=window,amzn_c=5,amzn_x=0;while(amzn_x<amzn_c){amzn_win=amzn_win.parent;if(amzn_win.apstag)try{amzn_win.apstag.renderImp(document,"%%PATTERN:amzniid%%");amzn_x=amzn_c}catch(e){}amzn_x++};
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ fireOrSaveGoogleAdFunctions(function() {
+ AdBridg.cmd.push(function () {
+ // ADBRIDG MIGRATION: this command to set AdSense is one of the few
+ // GPT commands that should not be replaced with our library proxy.
+ googletag.pubads().set("adsense_background_color", "FFFFFF");
+ });
+ });
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ var googleDegfaultAdVars = {"main":"'neurology'","sub":"'biology-biochemistry', 'psychology-psychiatry'","k1":"'otherneurologicaldisorders'","k2":"'neurological'","k3":"'health'","uniq":"'318674'","msiteactive":"'False'"};
+ var googleAdSlotInfo = [];
+ //]]>
+ </script><!-- End of old ads area -->
+
+ <script type="text/javascript">
+ //<![CDATA[
+ //Page level targeting setup
+ var adRPV = Math.floor(Math.random()*100)+1;
+ adRPV = adRPV.toString();
+
+ fireOrSaveGoogleAdFunctions(function(){
+ // ADBRIDG MIGRATION: the `cmd` function needs to run through AdBridg, but the
+ // setTargeting methods should stay native to GPT.
+ AdBridg.cmd.push(function() {
+ googletag.pubads().setTargeting('rpv', adRPV);
+ //We need to add a new key for 'url'
+ googletag.pubads().setTargeting('url', encodeURI(location.pathname));
+
+ //Set default targeting first
+ if (typeof googleDegfaultAdVars !== "undefined") {
+ for (var k in googleDegfaultAdVars) {
+ if (k == "sub" || googleDegfaultAdVars[k].toString().indexOf(",") > -1) {
+ var finalOutput = googleDegfaultAdVars[k].split(',');
+ //Remove the single qoute
+ for (var i in finalOutput) {
+ if (finalOutput[i].trim().toString().indexOf("'") == 0) {
+ finalOutput[i] = finalOutput[i].trim().slice(1, -1);
+ } else {
+ finalOutput[i] = finalOutput[i].trim();
+ }
+ }
+ } else {
+ if (googleDegfaultAdVars[k].toString().indexOf("'") == 0) {
+ //if it got single qoute inside, we remove it
+ var finalOutput = googleDegfaultAdVars[k].slice(1, -1);
+ } else {
+ var finalOutput = googleDegfaultAdVars[k];
+ }
+ }
+ googletag.pubads().setTargeting(k, finalOutput);
+ }
+ }
+ //googletag.pubads().enableAsyncRendering(); // enable async loading
+ // Disable initial load, we will use refresh() to fetch ads.
+ // Calling this function means that display() calls just
+ // register the slot as ready, but do not fetch ads for it.
+ // googletag.pubads().disableInitialLoad();
+ // googletag.pubads().enableSingleRequest();
+ // googletag.pubads().enableLazyLoad({
+ // fetchMarginPercent: 50, // Fetch slots within 5 viewports.
+ // renderMarginPercent: 30, // Render slots within 2 viewports.
+ // mobileScaling: 2.0 // Double the above values on mobile.
+ // });
+ // googletag.enableServices();
+ // ADBRIDG MIGRATION: by default, we enable single request, disable initial
+ // load, and async rendering is enabled by default (GPT no longer supports
+ // synchronous rendering as of 2019-01-21.)
+ // All we need to do now is tell AdBridg to begin serving the ads.
+ // AdBridg.serve();
+ // console.log("serve happened in page level");
+
+ });
+ });
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+ // check viewport for resize events and reload ads (1000ms delay)
+ var resizeTimer;
+ var width = window.innerWidth;
+
+ function resizer() {
+ //Check to see if the width is changed
+ var newWidth = window.innerWidth;
+ if (width != newWidth) {
+ // check if we've crossed a break point (only need to refresh if crossing the 1000px break point)
+ if (width >= 1000 && newWidth < 1000) {
+
+ // DECREASE IN WIDTH
+ fireOrSaveGoogleAdFunctions(function() {
+ AdBridg.cmd.push(function () {
+ if (typeof window.DLB1 !== "undefined") {
+ AdBridg.refresh([window.DLB1]);
+ }
+ });
+ });
+
+ // send resize+refresh event
+ fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'Browser Width', eventAction: 'Resize / Shrink / Ad refresh', eventLabel: 'Resize / Shrink / Ad refresh'});});
+
+ } else if (width < 1000 && newWidth >= 1000) {
+
+ // INCREASE IN WIDTH
+ //
+ if(typeof window.DLB1 !== "undefined"){
+ AdBridg.refresh([window.DLB1]);
+ }
+
+ // send resize+refresh event
+ fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'Browser Width', eventAction: 'Resize / Grow / Ad refresh', eventLabel: 'Resize / Grow / Ad refresh'});});
+
+ } else {
+ // send resize event
+ fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'Browser Width', eventAction: 'Resize / No ad refresh', eventLabel: 'Resize / No ad refresh'});});
+ }
+ }
+
+ width = newWidth;
+ }
+
+ window.addEventListener("resize", function(){
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(resizer, 1000);
+ });
+
+ ]]>
+ </script><!--New header bidding-->
+
+ <script>
+ <![CDATA[
+ !function(a9,a,p,s,t,A,g){if(a[a9])return;function q(c,r){a[a9]._Q.push([c,r])}a[a9]={init:function(){q("i",arguments)},fetchBids:function(){q("f",arguments)},setDisplayBids:function(){},_Q:[]};A=p.createElement(s);A.async=!0;A.src=t;g=p.getElementsByTagName(s)[0];g.parentNode.insertBefore(A,g)}("apstag",window,document,"script","//c.amazon-adsystem.com/aax2/apstag.js");
+
+
+ var initParams = {
+ pubID: '3083',
+ adServer: 'googletag'
+ };
+
+
+ fireOrSaveJsFunctions(1,function(){
+
+ if (passEEACheck||(isEEA&&glob_mntcookie)) {
+ __cmp('getConsentData', null, function(vendorConsentData, success) {
+
+ initParams.gdpr = { enabled: true, consent: vendorConsentData.metadata };
+ apstag.init(initParams);
+ });
+ } else {
+ apstag.init(initParams);
+ }
+
+ })
+
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ this.top.location!==this.location&&(this.top.location=this.location);
+ //]]>
+ </script>
+ <style>
+ <![CDATA[
+ .async-hide { opacity: 0 !important}
+ ]]>
+ </style>
+ <script>
+ <![CDATA[
+ (function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
+ h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
+ (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
+ })(window,document.documentElement,'async-hide','dataLayer',4000,
+ {'GTM-W59HFNJ':true});
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ <!-- GA Universal Code 2014-08 (obfuscated) -->
+
+ eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5(-1,2(){(2(i,s,o,g,r,a,m){i[\'c\']=r;i[r]=i[r]||2(){(i[r].q=i[r].q||[]).e(d)},i[r].l=1*j h();a=s.b(o),m=s.6(o)[0];a.7=1;a.8=g;m.9.k(a,m)})(y,A,\'z\',\'//x.n-3.t/3.u\',\'4\')});5(-1,2(){4(\'v\',\'p-w-1\',\'f\')});',37,37,'||function|analytics|ga|fireOrSaveJsFunctions|getElementsByTagName|async|src|parentNode||createElement|GoogleAnalyticsObject|arguments|push|auto||Date||new|insertBefore|||google||UA||||com|js|create|849615|www|window|script|document'.split('|')))
+
+
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ /*
+ CSS Browser Selector v0.4.0 (Nov 02, 2010)
+ Rafael Lima (http://rafael.adm.br)
+ http://rafael.adm.br/css_browser_selector
+ License: http://creativecommons.org/licenses/by/2.5/
+ Contributors: http://rafael.adm.br/css_browser_selector#contributors
+ */
+ function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
+ var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+
+ switch (true) {
+ case viewportWidth > 1360:
+ var viewportBreakpoint = 'Desktop - XL';
+ break;
+ case viewportWidth > 1200:
+ var viewportBreakpoint = 'Desktop - L';
+ break;
+ case viewportWidth > 1000:
+ var viewportBreakpoint = 'Desktop - M';
+ break;
+ default:
+ var viewportBreakpoint = 'Desktop - S';
+ }
+
+ fireOrSaveJsFunctions(0,function() {ga('set', 'dimension20', viewportBreakpoint);});
+
+ fireOrSaveJsFunctions(0,function() {ga('set', {
+ 'dimension1': "no",
+ 'dimension2': "written",
+ 'dimension3': "Neurology / Neuroscience",
+ 'dimension5': "older",
+ 'dimension6': "desktop",
+ 'dimension8': "3",
+ 'dimension12': "2017-07-27",
+ 'dimension17': "7721",
+ 'dimension21': "2",
+ 'dimension23': "Ana Sandoiu",
+ 'dimension24': "Biology / Biochemistry",
+ 'dimension25': "Psychology / Psychiatry",
+ 'dimension27': "1",
+ 'dimension28': "otherneurologicaldisorders",
+ 'dimension29': "neurological"
+ });});
+
+ if (window.devicePixelRatio) {
+ var pixelRatio = (window.devicePixelRatio >= 1.5) ? "HiDPI" : "1X";
+ fireOrSaveJsFunctions(0,function() {ga('set', 'dimension7', pixelRatio);});
+ }
+
+ fireOrSaveJsFunctions(0,function() {ga('set', 'dimension10', viewportWidth);});
+ fireOrSaveJsFunctions(0,function() {ga('set', 'dimension11', viewportHeight);});
+ fireOrSaveJsFunctions(0,function() {ga('set', 'dimension16', 'None');});fireOrSaveJsFunctions(0,function() {ga('require', 'GTM-W59HFNJ');});
+ fireOrSaveJsFunctions(0,function() {ga('send', 'pageview');});
+
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 030','318674')});",30000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 040','318674')});",40000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 050','318674')});",50000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 060','318674')});",60000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 070','318674')});",70000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 080','318674')});",80000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 090','318674')});",90000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 100','318674')});",100000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 110','318674')});",110000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 120','318674')});",120000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 130','318674')});",130000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 140','318674')});",140000)
+ setTimeout("fireOrSaveJsFunctions(0,function() {ga('send','event','Engagement Time','Engagement 150','318674')});",150000)
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+ fireOrSaveJsFunctions(1,function() {
+
+ var _qevents = _qevents || [];
+
+ (function() {
+ var elem = document.createElement('script');
+ //elem.src = (document.location.protocol == "https:" ? "https://secure" : "http://edge") + ".quantserve.com/quant.js";
+ elem.src = (document.location.protocol == "https:" ? "https://" : "http://") + "cdn1.medicalnewstoday.com/structure/javascript/cache/quant.js";
+ elem.async = true;
+ elem.type = "text/javascript";
+ var scpt = document.getElementsByTagName('script')[0];
+ scpt.parentNode.insertBefore(elem, scpt);
+ })();
+
+ _qevents.push({
+ qacct:"p-v03RmX3GES6RT"
+ });
+ });
+
+
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ fireOrSaveJsFunctions(1,function() {
+
+ window._comscore = window._comscore || [];
+ window._comscore.push({ c1: "2", c2: "19983957" });
+ (function() {
+ var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
+ //s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
+ s.src = (document.location.protocol == "https:" ? "https://" : "http://") + "cdn1.medicalnewstoday.com/structure/javascript/cache/beacon.js";
+ el.parentNode.insertBefore(s, el);
+ })();
+
+ })
+
+ ]]>
+ </script> <noscript><img class="no_js" src="https://sb.scorecardresearch.com/p?c1=2&amp;c2=19983957&amp;cv=2.0&amp;cj=1" /></noscript>
+ <style type="text/css">
+ /*<![CDATA[*/
+ /*.mnt_dlb_foot_container { display:block; width: 728px; height: 90px; }*/
+ /*@media (min-width: 990px) { .mnt_dlb_foot_container { display: none; } }
+ @media (min-width:1148px) { .mnt_dlb_foot_container { display:block;} }*/
+ /*]]>*/
+ </style>
+ </head>
+ <body>
+ <script>
+ <![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function() {
+
+ !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
+ n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
+ n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
+ t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
+ document,'script','https://connect.facebook.net/en_US/fbevents.js');
+
+ fbq('init', '1039134266174910');
+ fbq('track', "PageView");
+
+ fbq('track', 'ViewContent');
+
+ });
+
+
+ ]]>
+ </script> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1039134266174910&amp;ev=PageView&amp;noscript=1" /></noscript> <!-- Source: /controltag?confid=qqeynsltk&site=medical%20news%20today&edit=1 -->
+ <script class="kxct" data-id="qqeynsltk" data-timing="async" data-version="1.9" type="text/javascript">
+ //<![CDATA[
+
+ fireOrSaveJsFunctions(1,function() {
+ window.Krux || ((Krux = function () {
+ Krux.q.push(arguments)
+ }).q = []);
+ (function () {
+ var k = document.createElement('script');
+ k.type = 'text/javascript';
+ k.async = true;
+ var m, src = (m = location.href.match(/\bkxsrc=([^&]+)/)) && decodeURIComponent(m[1]);
+ k.src = /^https?:\/\/([a-z0-9_\-\.]+\.)?krxd\.net(:\d{1,5})?\//i.test(src) ? src : src === "disable" ? "" :
+ (location.protocol === "https:" ? "https:" : "http:") + "//cdn.krxd.net/controltag?confid=qqeynsltk";
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(k, s);
+ }());
+ });
+ //]]>
+ </script> <!-- Facebook Pixel Code -->
+ <script>
+ <![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function() {
+
+ !function (f, b, e, v, n, t, s) {
+ if (f.fbq)return;
+ n = f.fbq = function () {
+ n.callMethod ?
+ n.callMethod.apply(n, arguments) : n.queue.push(arguments)
+ };
+ if (!f._fbq)f._fbq = n;
+ n.push = n;
+ n.loaded = !0;
+ n.version = '2.0';
+ n.queue = [];
+ t = b.createElement(e);
+ t.async = !0;
+ t.src = v;
+ s = b.getElementsByTagName(e)[0];
+ s.parentNode.insertBefore(t, s)
+ }(window,
+ document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
+
+ fbq('init', '1039134266174910');
+ fbq('track', "PageView");
+ });
+ ]]>
+ </script> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1039134266174910&amp;ev=PageView&amp;noscript=1" /></noscript> <!--Moat content code-->
+ <script>
+ <![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function(){
+
+ (function(){function t(){for(var a=[8],e=1;2>=e;e++)a.push(8+e),a.push(8-e);a=a[Math.floor(Math.random()*a.length)];return{b:a,a:0==Math.floor(Math.random()*a)}}function k(a){var e=a=a.replace(":","");try{for(var b=0;100>b&&(a=decodeURIComponent(a),e!=a)&&!a.match(/^http(s)?\:/);b++)e=a}catch(c){}return a.replace(/(^\s+|\s+$)/g,"")}try{if(!location||!location.hostname||!location.pathname)return!1;var c=document.location.hostname.replace(/^www\./,""),u=function(){for(var a,b=document.getElementsByTagName("meta"),c,d=0,f=b.length;d<f;d++)if(c=b[d],"og:title"===c.getAttribute("property")){a=c.getAttribute("content");break}a||(a=document.title||"Untitled");return a}(),b={},b=function(a,b,c){a.l1=b;a.l2=c;a.l3="__page__";a.l4="-";return a}(b,c,u),l=(new Date).getTime(),m=Math.floor(Math.random()*Math.pow(10,12)),d,f;f=t();f.a?d=f.b:d=0;b.zmoatab_cm=d;b.t=l;b.de=m;b.zMoatAB_SNPT=!0;var g;d?g=d:g=1;var n;n=f?f.a?!0:!1:!0;var c=[],p=[k(b.l1),k(b.l2),k(b.l3),k(b.l4)].join(":"),v="https://wve3oiypgri4-a.akamaihd.net/z.gif?e=17&d="+
+ encodeURIComponent(p)+"&de="+m+"&t="+l+"&i=HEALTHLINECONTENT1&cm="+g+"&mp=1&ac=1&pl=1&bq=10&vc=2&cs=0",w="https://px.moatads.com/pixel.gif?e=17&d="+encodeURIComponent(p)+"&de="+m+"&t="+l+"&i=HEALTHLINECONTENT1&cm="+g+"&mp=0&ac=1&pl=1&bq=10&ad_type=img&vc=2&cs=0",x="https://px.moatads.com/pixel.gif?e=17&d="+encodeURIComponent(p)+"&de="+m+"&t="+l+"&i=HEALTHLINECONTENT1&cm="+g+"&ku=1&ac=1&pl=1&bq=10&ad_type=img&vc=2&cs=0";n&&((new Image).src=v,(new Image).src=w);for(var q in b)c.push(q+"="+encodeURIComponent(b[q]));
+ var c=c.join("&"),c=c+"&vc=2",h=document.createElement("script");h.type="text/javascript";h.async=!0;n&&(h.onerror=function(){(new Image).src=x});var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(h,r);h.src="https://z.moatads.com/healthlinecontent451781663455/moatcontent.js#"+c}catch(a){try{var y="//pixel.moatads.com/pixel.gif?e=24&d=data%3Adata%3Adata%3Adata&i=MOATCONTENTABSNIPPET1&vc=2&ac=1&k="+encodeURIComponent(a)+"&j="+encodeURIComponent(document.referrer)+"&cs="+(new Date).getTime();
+ (new Image).src=y}catch(e){}}})();
+
+
+ });
+
+ ]]>
+ </script>
+ <link rel="amphtml" href="https://www.medicalnewstoday.com/articles/amp/318674" />
+ <div itemscope="itemscope" itemtype="http://schema.org/NewsArticle">
+ <noscript>
+ <div class="header_message enable_js error">
+ <p>
+ For full functionality, it is necessary to enable JavaScript. Here are <a href="http://www.enable-javascript.com" target="_blank">instructions how to enable JavaScript</a> in your web browser.
+ </p>
+ </div>
+ <div class="fullscreen_outer">
+ <div class="fullscreen_inner">
+ <h5>
+ Welcome to Medical News Today
+ </h5>
+ <p>
+ Healthline Media, Inc. would like to process and share personal data (e.g., mobile ad id) and data about your use of our site (e.g., content interests) with our third party partners (see a <a href="https://www.medicalnewstoday.com/privacy-policy#vendors" target="_blank">current list</a>) using cookies and similar automatic collection tools in order to a) personalize content and/or offers on our site or other sites, b) communicate with you upon request, and/or c) for additional reasons upon notice and, when applicable, with your consent.
+ </p>
+ <p>
+ Healthline Media, Inc. is based in and operates this site from the United States. Any data you provide will be primarily stored and processed in the United States, pursuant to the laws of the United States, which may provide lesser privacy protections than European Economic Area countries.
+ </p>
+ <p>
+ By clicking “accept” below, you acknowledge and grant your consent for these activities unless and until you withdraw your consent using our <a href="https://www.healthline.com/rights-request" target="_blank">rights request form</a>. Learn more in our <a href="https://www.medicalnewstoday.com/privacy-policy" target="_blank">Privacy Policy</a>.
+ </p>
+ </div>
+ </div></noscript>
+ <div id="header_message" class="new_menu">
+ <input type="hidden" id="is_usermobile" name="is_usermobile" value="0" />
+ </div>
+ <div id="navigation" class="container default_menu new_menu">
+ <div class="row">
+ <nav role="navigation" class="main_nav">
+ <ul class="main_nav left">
+ <li class="menu_topics">
+ <a href="#"></a>
+ <div class="menu_panel fullscreen_outer topics">
+ <div class="menu_panel fullscreen_inner">
+ <div class="row">
+ <div class="topics">
+ <div class="menu_topic_container">
+ <ul class="topic_headings">
+ <li class="topic_headings_top">
+ <span>Top categories</span>
+ <ul class="topic_popular_list">
+ <li>
+ <a href="/categories/blood">Blood / Hematology</a>
+ </li>
+ <li>
+ <a href="/categories/bones">Bones / Orthopedics</a>
+ </li>
+ <li>
+ <a href="/categories/breast_cancer">Breast Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/colorectal_cancer">Colorectal Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/depression">Depression</a>
+ </li>
+ <li>
+ <a href="/categories/gastrointestinal">GastroIntestinal</a>
+ </li>
+ <li>
+ <a href="/categories/hypertension">Hypertension</a>
+ </li>
+ <li>
+ <a href="/categories/lymphoma">Lymphoma</a>
+ </li>
+ <li>
+ <a href="/categories/mens_health">Men's Health</a>
+ </li>
+ <li>
+ <a href="/categories/neurology">Neurology / Neuroscience</a>
+ </li>
+ <li>
+ <a href="/categories/nutrition-diet">Nutrition / Diet</a>
+ </li>
+ <li>
+ <a href="/categories/pain">Pain / Anesthetics</a>
+ </li>
+ <li>
+ <a href="/categories/prostate">Prostate / Prostate Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/psoriasis">Psoriasis</a>
+ </li>
+ <li>
+ <a href="/categories/respiratory">Respiratory</a>
+ </li>
+ <li>
+ <a href="/categories/sexual_health">Sexual Health / STDs</a>
+ </li>
+ <li>
+ <a href="/categories/stroke">Stroke</a>
+ </li>
+ <li>
+ <a href="/categories/tuberculosis">Tuberculosis</a>
+ </li>
+ <li>
+ <a href="/categories/urology-nephrology">Urology / Nephrology</a>
+ </li>
+ <li>
+ <a href="/categories/womens_health">Women's Health</a>
+ </li>
+ </ul>
+ </li>
+ <li class="topic_headings_all">
+ <span>All categories</span>
+ <ul class="topic_all_list">
+ <li>
+ <a href="/categories#a">A - B</a>
+ </li>
+ <li>
+ <a href="/categories#c">C - D</a>
+ </li>
+ <li>
+ <a href="/categories#e">E - G</a>
+ </li>
+ <li>
+ <a href="/categories#h">H - L</a>
+ </li>
+ <li>
+ <a href="/categories#m">M - O</a>
+ </li>
+ <li>
+ <a href="/categories#p">P - R</a>
+ </li>
+ <li>
+ <a href="/categories#s">S - Z</a>
+ </li>
+ <li>
+ <a href="/categories">All Topics</a>
+ </li>
+ </ul>
+ </li>
+ <li class="topic_headings_custom">
+ <span>Your MNT</span>
+ <ul class="topic_custom_list">
+ <h4>
+ Not a member yet?
+ </h4>
+ <p>
+ Get the most out of Medical News Today. Subscribe to our Newsletter to recieve:
+ </p>
+ <ul>
+ <li>Professionally-verified articles
+ </li>
+ <li>Daily or weekly updates
+ </li>
+ <li>Content custom-tailored to your needs
+ </li>
+ </ul><button class="sign_up menu_signup_button new_reg_signup">Create an account</button>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <div class="menu_cta_container">
+ <span>More</span>
+ <ul class="topic_more_list">
+ <li class="menu_newsletter_cta">
+ <a href="#" class="new_reg_signup menu_item_link">Sign up for our newsletter</a>
+ </li>
+ <li class="menu_discover_cta">
+ <a href="/knowledge-center"><img src="https://cdn1.medicalnewstoday.com/structure/images/logo/logo-menu-cta-2017.png" height="15" width="34" />Discover in-depth, condition specific articles written by our in-house team.</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </li>
+ <li class="menu_newsletter">
+ <a href="#" class="menu-newsletter-link new_reg_signup">
+ <div>
+ Newsletter
+ </div></a>
+ </li>
+ </ul>
+ <div class="logo">
+ <a href="/" accesskey="h" title="Medical News Today : Home"><img src="https://cdn1.medicalnewstoday.com/structure/images/logo/logo-2017-640-60.png" alt="MNT home" />
+ <p>
+ MNT - Hourly Medical News Since 2003
+ </p></a>
+ </div>
+ <ul class="main_nav right">
+ <div id="search_area">
+ <div id="searchwrapper" class="">
+ <div class="search_trigger">
+ <form id="searchFormHeader" action="/search" name="searchFormHeader">
+ <input type="text" id="header_search" placeholder="" class="searchbox" name="q" maxlength="150" autocomplete="off" /> <button class="screen_only black float_right" id="header_search_button" type="submit" title="Search MNT" value="">Search</button> <button class="mobile_only blue float_right" id="header_search_button" type="submit" title="Search MNT" value="">Go</button> <input type="hidden" name="p" value="1" />
+ </form>
+ </div>
+ </div>
+ </div>
+ <li class="menu_login">
+ <a href="#" id="menu_login_link">
+ <div>
+ Log in
+ </div></a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ <div id="navigation_scroll" class="container light">
+ <div class="row">
+ <nav id="subnavigation">
+ <ul class="main_nav left">
+ <li class="menu_topics">
+ <a href="#"></a>
+ <div class="menu_panel fullscreen_outer topics">
+ <div class="menu_panel fullscreen_inner">
+ <div class="row">
+ <div class="topics">
+ <div class="menu_topic_container">
+ <ul class="topic_headings">
+ <li class="topic_headings_top">
+ <span>Top categories</span>
+ <ul class="topic_popular_list">
+ <li>
+ <a href="/categories/blood">Blood / Hematology</a>
+ </li>
+ <li>
+ <a href="/categories/bones">Bones / Orthopedics</a>
+ </li>
+ <li>
+ <a href="/categories/breast_cancer">Breast Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/colorectal_cancer">Colorectal Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/depression">Depression</a>
+ </li>
+ <li>
+ <a href="/categories/gastrointestinal">GastroIntestinal</a>
+ </li>
+ <li>
+ <a href="/categories/hypertension">Hypertension</a>
+ </li>
+ <li>
+ <a href="/categories/lymphoma">Lymphoma</a>
+ </li>
+ <li>
+ <a href="/categories/mens_health">Men's Health</a>
+ </li>
+ <li>
+ <a href="/categories/neurology">Neurology / Neuroscience</a>
+ </li>
+ <li>
+ <a href="/categories/nutrition-diet">Nutrition / Diet</a>
+ </li>
+ <li>
+ <a href="/categories/pain">Pain / Anesthetics</a>
+ </li>
+ <li>
+ <a href="/categories/prostate">Prostate / Prostate Cancer</a>
+ </li>
+ <li>
+ <a href="/categories/psoriasis">Psoriasis</a>
+ </li>
+ <li>
+ <a href="/categories/respiratory">Respiratory</a>
+ </li>
+ <li>
+ <a href="/categories/sexual_health">Sexual Health / STDs</a>
+ </li>
+ <li>
+ <a href="/categories/stroke">Stroke</a>
+ </li>
+ <li>
+ <a href="/categories/tuberculosis">Tuberculosis</a>
+ </li>
+ <li>
+ <a href="/categories/urology-nephrology">Urology / Nephrology</a>
+ </li>
+ <li>
+ <a href="/categories/womens_health">Women's Health</a>
+ </li>
+ </ul>
+ </li>
+ <li class="topic_headings_all">
+ <span>All categories</span>
+ <ul class="topic_all_list">
+ <li>
+ <a href="/categories#a">A - B</a>
+ </li>
+ <li>
+ <a href="/categories#c">C - D</a>
+ </li>
+ <li>
+ <a href="/categories#e">E - G</a>
+ </li>
+ <li>
+ <a href="/categories#h">H - L</a>
+ </li>
+ <li>
+ <a href="/categories#m">M - O</a>
+ </li>
+ <li>
+ <a href="/categories#p">P - R</a>
+ </li>
+ <li>
+ <a href="/categories#s">S - Z</a>
+ </li>
+ <li>
+ <a href="/categories">All Topics</a>
+ </li>
+ </ul>
+ </li>
+ <li class="topic_headings_custom">
+ <span>Your MNT</span>
+ <ul class="topic_custom_list">
+ <h4>
+ Not a member yet?
+ </h4>
+ <p>
+ Get the most out of Medical News Today. Subscribe to our Newsletter to recieve:
+ </p>
+ <ul>
+ <li>Professionally-verified articles
+ </li>
+ <li>Daily or weekly updates
+ </li>
+ <li>Content custom-tailored to your needs
+ </li>
+ </ul><button class="sign_up menu_signup_button new_reg_signup">Create an account</button>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <div class="menu_cta_container">
+ <span>More</span>
+ <ul class="topic_more_list">
+ <li class="menu_newsletter_cta">
+ <a href="#" class="new_reg_signup menu_item_link">Sign up for our newsletter</a>
+ </li>
+ <li class="menu_discover_cta">
+ <a href="/knowledge-center"><img src="https://cdn1.medicalnewstoday.com/structure/images/logo/logo-menu-cta-2017.png" height="15" width="34" />Discover in-depth, condition specific articles written by our in-house team.</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </li>
+ <li class="menu_newsletter">
+ <a href="#" class="menu-newsletter-link new_reg_signup">
+ <div>
+ Newsletter
+ </div></a>
+ </li>
+ </ul>
+ <div class="logo">
+ <a href="/" accesskey="h" title="Medical News Today : Home"><img src="https://cdn1.medicalnewstoday.com/structure/images/logo/logo-2017-640-60.png" alt="MNT home" />
+ <p>
+ MNT - Hourly Medical News Since 2003
+ </p></a>
+ </div>
+ <ul class="main_nav right">
+ <div id="search_area">
+ <div id="searchwrapper" class="">
+ <div class="search_trigger">
+ <form id="searchFormHeader" action="/search" name="searchFormHeader">
+ <input type="text" id="header_search" placeholder="" class="searchbox" name="q" maxlength="150" autocomplete="off" /> <button class="screen_only black float_right" id="header_search_button" type="submit" title="Search MNT" value="">Search</button> <button class="mobile_only blue float_right" id="header_search_button" type="submit" title="Search MNT" value="">Go</button> <input type="hidden" name="p" value="1" />
+ </form>
+ </div>
+ </div>
+ </div>
+ <li class="menu_login">
+ <a href="#" id="menu_login_link">
+ <div>
+ Login
+ </div></a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ <div class="modal fade" id="picModal" tabindex="-1" role="dialog" style="z-index: 1040; padding-left:0;">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" style="">
+ <div class="modal-header"></div>
+ <div class="modal-body" style="text-align: center;">
+ <div id="picModal-loading-animation">
+ <span class="sr-only">Loading...</span>
+ </div><img id="origin-img" src="" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal fade site_modal modal_gdpr" tabindex="-1" role="dialog" aria-hidden="true" id="gdprModal" data-backdrop="static" data-keyboard="false">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header"></div>
+ <div class="modal-body container" onscroll="modalScroll()">
+ <div class="fullscreen_outer article_header">
+ <div class="fullscreen_inner">
+ <h5>
+ Please accept our privacy terms
+ </h5>
+ <p>
+ We use cookies and similar technologies to improve your browsing experience, personalize content and offers, show targeted ads, analyze traffic, and better understand you. We may share your information with third-party partners for marketing purposes. To learn more and make choices about data use, visit our <a href="https://www.medicalnewstoday.com/advertising" target="_blank">Advertising Policy</a> and <a href="https://www.medicalnewstoday.com/privacy-policy" target="_blank">Privacy Policy</a>. By clicking “Accept and Continue” below, (1) you consent to these activities unless and until you withdraw your consent using our rights request form, and (2) you consent to allow your data to be transferred, processed, and stored in the United States.
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer container gradient">
+ <div class="article_header">
+ <button class="primary" onclick="GDPRAccept()">ACCEPT AND CONTINUE TO SITE</button> <button class="secondary" onclick="confirmDeny()">Deny permission</button>
+ </div>
+ </div>
+ </div>
+ <div class="scroll_more hidden">
+ <button class="primary" onclick="scrollAccept()">Scroll to Accept</button>
+ </div>
+ </div>
+ </div>
+ <div class="modal fade modal_login_panel" tabindex="-1" role="dialog" aria-hidden="true">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content" id="modal_login_panel">
+ <div class="modal-header"></div>
+ <div class="modal-body">
+ <div class="menu_panel fullscreen_outer account">
+ <div class="menu_panel fullscreen_inner">
+ <div class="row">
+ <div class="login_list">
+ <div class="login_container">
+ <div class="register">
+ <h2>
+ Sign in
+ </h2>
+ <p>
+ Log in with your Medical News Today account to create or edit your custom homepage, catch-up on your opinions notifications and set your newsletter preferences.
+ </p><a href="/account/"><button class="log_in float_left secure" name="login" type="submit">Sign in</button></a>
+ </div>
+ <div class="login_form">
+ <h3>
+ Register for a free account
+ </h3>
+ <p>
+ Sign up for a free Medical News Today account to customize your medical and health news experiences.
+ </p><button class="sign_up menu_signup_button new_reg_signup">Register</button>
+ <div class="login_tour">
+ <a class="" href="/tour">take the tour</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <hr class="css_h1ksn" />
+ <div class="container">
+ <div class="row site_header">
+ <article>
+ <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 article_header">
+ <!-- Leaderboard BANNER advert -->
+ <div id="dlb1_container" class="mnt css_c4zij">
+ <!-- header_ad code -->
+ <div class="mnt_history" style="display:none;">
+ <a href="/whitelist-mnt"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_history_leaderboard.png" alt="Thank you for supporting Medical News Today" /></a>
+ </div>
+ <div id="dlb1_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DLB1',
+ "slotContainer":'dlb1_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /header_ad code -->
+ <h1 itemprop="headline">
+ How does the brain turn unconscious information into conscious thought?
+ </h1>
+ </div>
+ <div class="col-xs-12 col-sm-12 col-md-8 col-lg-8 main_content">
+ <div id="article_date">
+ <span class="date_published screen_only">Published <time itemprop="datePublished" datetime="2017-07-27">Thursday 27 July 2017</time></span> <span class="date_published mobile_only">Published Thu 27 Jul 2017</span>
+ </div>
+ <div class="author_top">
+ <span class="author_byline">By <a href="/authors/ana-sandoiu" class="article_author" rel="author" title="View all articles written by Ana Sandoiu" onclick="fireOrSaveJsFunctions(0,function() {ga('send', 'event', 'Author Byline Top', 'Visit Ana Sandoiu', 'Visit Ana Sandoiu');});">Ana Sandoiu</a></span>
+ </div>
+ <div class="article_body">
+ <div itemprop="articleBody">
+ <header>
+ Neuroscience tells us that most of the work done by our brains happens on an unconscious level, but when does that "a-ha!" moment occur? And what happens during it? New research investigates.
+ </header>
+ <div class="photobox_right" style="max-width: 550px;">
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="https://cdn1.medicalnewstoday.com/content/images/articles/318/318674/hand-holding-brain-lightbulb.jpg" alt="hand holding brain lightbulb" /><br />
+ <em>A new study investigates when the 'a-ha!' moment takes place in the brain, and how similar it is to other brain processes.</em>
+ </div>
+ <p>
+ Many of us have noticed that we seem to get our best ideas when we're in the shower, or that we can find the answer to a difficult question when we least think about it.
+ </p>
+ <p>
+ A large body of neuroscientific <a href="http://journals.sagepub.com/doi/abs/10.1177/0956797612446024" target="_blank" rel="noopener">studies</a> has pointed out that the brain does a lot of work in its spare time, the so-called idle state - wherein the brain does not appear to be thinking about anything at all - and that this is the time when it works at its hardest to find solutions to complex problems.
+ </p>
+ <p>
+ With time and advances in <a href="/articles/248680.php" title="What is neuroscience?" class="keywords">neuroscience</a>, it has become more and more clear to researchers that Freud <em>was</em> right and the mind, as well as the brain, do work unconsciously. In fact, it would be safe to say that what is consciously known to us is just the tip of a much larger iceberg, deeply submerged in unconscious waters.
+ </p>
+ <p>
+ But the exact moment at which information becomes known to us - or when the "tip of the iceberg" pierces through the water, and the unconscious becomes conscious - has been somewhat of a mystery, from a neuroscientific point of view.
+ </p>
+ <p>
+ In other words, we do not yet know when that intellectually satisfying "a-ha!" moment takes place, or what the biology is behind it. This is why a team of researchers at Columbia University in New York City, NY, set out to investigate this moment in more detail.
+ </p>
+ <div id="onequarter-of-article"></div>
+ <p>
+ The scientists were led by Michael Shadlen, Ph.D., of Columbia University's Mortimer B. Zuckerman Mind Brain Behavior Institute, and the <a href="http://www.cell.com/current-biology/fulltext/S0960-9822(17)30784-4" target="_blank" rel="noopener">findings</a> were published in the journal <em>Current Biology.</em>
+ </p><!--[DLB]--><!-- Leaderboard BANNER advert -->
+ <div id="dlb2_container" class="mnt css_c4zij">
+ <!-- header_ad code -->
+ <div class="mnt_history" style="display:none;">
+ <a href="/whitelist-mnt"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_history_leaderboard.png" alt="Thank you for supporting Medical News Today" /></a>
+ </div>
+ <div id="dlb2_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DLB2',
+ "slotContainer":'dlb2_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /header_ad code --><!--[END DLB]--><!--[MMR]--><!--[END MMR]-->
+ <h2>
+ The hypothesis
+ </h2>
+ <p>
+ Dr. Shadlen and colleagues started out from an interesting hypothesis, one which they derived from previous research on the neurobiological processes involved in decision-making.
+ </p>
+ <p>
+ As the authors explain, research conducted in both monkeys and humans shows that many of our decisions take place at a point when the brain "feels" as though it has gathered enough information, or when a critical level of information has been accumulated.
+ </p>
+ <div class="related_inline">
+ <a href="/articles/315184.php?iacp" title="Scientists find new mechanism for memory formation" target="_blank">
+ <div>
+ <img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="/content/images/headlines/315/315184/memory-cogs.jpg" alt="Scientists find new mechanism for memory formation" class="original" />
+ <div class="headline">
+ Scientists find new mechanism for memory formation
+ </div>
+ <div class="excerpt">
+ How do we form memories? New research uncovers key brain area.
+ </div>
+ <div class="more">
+ Read now
+ </div>
+ </div></a>
+ </div>
+ <p>
+ This process of making a decision once the brain has accumulated enough evidence bears the name of "bounded evidence accumulation." Reaching this threshold is important because, although the brain does not use <em>all</em> of the information available, it uses as much as is necessary to make a speedy yet accurate decision.
+ </p>
+ <p>
+ <strong>The researchers wondered whether or not this threshold is also responsible for our "eureka!" moments.</strong>
+ </p>
+ <div id="middle-of-article"></div>
+ <p>
+ In Dr. Shadlen's words, "Could the moment when the brain believes it has accumulated enough evidence be tied to the person's awareness of having decided - that important 'a-ha!' moment?"
+ </p><!--[DLB]--><!-- Leaderboard BANNER advert -->
+ <div id="dlb3_container" class="mnt css_c4zij">
+ <!-- header_ad code -->
+ <div class="mnt_history" style="display:none;">
+ <a href="/whitelist-mnt"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_history_leaderboard.png" alt="Thank you for supporting Medical News Today" /></a>
+ </div>
+ <div id="dlb3_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DLB3',
+ "slotContainer":'dlb3_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /header_ad code --><!--[END DLB]--><!--[MMR]--><!--[END MMR]-->
+ <h2>
+ Examining the 'a-ha!' moment
+ </h2>
+ <p>
+ To answer this question, the scientists asked five people to perform a "direction discrimination" task. In it, the participants looked at dots on a computer screen. The dots moved randomly, as grains of sand would when blown by the wind. The participants were asked to say in which direction the dots had moved.
+ </p>
+ <p>
+ The moment they "decided" which direction the dots seemed to be taking was considered to be the equivalent of the "a-ha!" moment.
+ </p>
+ <p>
+ In the center of the screen, there was a fixed point and a clock. The display also had two "choice targets" - namely, left or right - and these were the directions in which the participants had to decide that the dots had moved.
+ </p>
+ <p>
+ Shortly after the dots had stopped moving, the participants used an electronic, hand-held stylus to move the cursor in the direction that they thought the dots had moved.
+ </p>
+ <p>
+ To determine when the decision was made, the researchers used the technique called "mental chronometry" - that is, after they made their decision, the participants were asked to move the clock backward to the point when they felt that they had consciously done so.
+ </p>
+ <div id="threequarter-of-article"></div>
+ <p>
+ "The moment in time indicated by the participants - this mental chronometry - was entirely subjective; it relied solely on their own estimation of how long it took them to make that decision," Dr. Shadlen says. "And because it was purely subjective, in principle it ought to be unverifiable."
+ </p><!--[DLB]--><!-- Leaderboard BANNER advert -->
+ <div id="dlb4_container" class="mnt css_c4zij">
+ <!-- header_ad code -->
+ <div class="mnt_history" style="display:none;">
+ <a href="/whitelist-mnt"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_history_leaderboard.png" alt="Thank you for supporting Medical News Today" /></a>
+ </div>
+ <div id="dlb4_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DLB4',
+ "slotContainer":'dlb4_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /header_ad code --><!--[END DLB]--><!--[MMR]--><!--[END MMR]-->
+ <h2>
+ 'A-ha' moment similar to making a decision
+ </h2>
+ <p>
+ However, by applying a mathematical model, the scientists were able to match these subjective decision times to the bounded evidence accumulation process.
+ </p>
+ <p>
+ <strong>The subjective decision times fit so well with what the scientists determined as the evidence accumulation threshold that they were able to predict the choices of four of the five participants.</strong>
+ </p>
+ <p>
+ "If the time reported to us by the participants was valid, we reasoned that it might be possible to predict the accuracy of the decision," explains Dr. Shadlen.
+ </p>
+ <p>
+ "We incorporated a kind of mathematical trick, based on earlier studies, which showed that the speed and accuracy of decisions were tied together by the same brain function." This "mathematical trick" was the evidence accumulation model.
+ </p>
+ <blockquote>
+ <p>
+ <span class="pullquote">"</span>Essentially, the act of becoming consciously aware of a decision conforms to the same process that the brain goes through to complete a decision, even a simple one - such as whether to turn left or right."
+ </p>
+ <p class="right">
+ Michael Shadlen, Ph.D.
+ </p>
+ </blockquote>
+ <p>
+ In other words, the study shows that the conscious awareness of the "a-ha!" moment takes place precisely when the brain has reached that threshold of evidence accumulation.
+ </p>
+ <p>
+ The findings provide unique insights into the biology of consciousness, say the researchers, and they bring us closer to understanding the biological basis of decisions, ethics, and, generally, the human mind.
+ </p>
+ <div id="bottom-of-article"></div>
+ </div>
+ </div><!-- MNT_Desktop Leaderboard -->
+ <ins class="adsbygoogle mnt_dlb_foot_container" id="mnt_dlb_foot_container" data-ad-client="ca-pub-1971793357249522" data-ad-slot="8084911109" style="display:block; width: 728px; height: 90px;"></ins>
+ <script>
+ <![CDATA[
+
+
+
+ fireOrSaveJsFunctions(1,function(){loadScript(
+ "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js",
+ {},
+ function(){}
+
+ )});
+
+
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (adsbygoogle = window.adsbygoogle || []).push({});
+ ]]>
+ </script>
+ <p id="slidebox_trigger"></p>
+ <div id="suggest_reading_outer_container" class="place full">
+ <h2 class="suggested_reading internal_related">
+ Related coverage
+ </h2><!--<h2 class="suggested_reading">Suggested Reading</h2>-->
+ <div itemscope="itemscope" itemtype="http://schema.org/WebPage">
+ <!-- suggested_reading_container_parent -->
+ <div class="suggested_reading_container">
+ <div class="suggested_reading_inner column1">
+ <div class="suggested_item">
+ <a href="/articles/320950.php?sr" title="It's official: Pets benefit our mental health">
+ <div class="suggested_item_image">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/320/320950/320950_1100.jpg" alt="" />
+ </div><span class="title">It's official: Pets benefit our mental health</span> <span class="summary">A systematic review of existing studies lists the many ways in which pets provide people with mental health issues some much-needed comfort.</span> <span class="more">Read now</span></a>
+ </div>
+ </div>
+ <div class="suggested_reading_inner column2">
+ <div class="suggested_item">
+ <a href="/articles/319529.php?sr" title="Consciousness 'restored' using nerve stimulation">
+ <div class="suggested_item_image">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/headlines/319/319529/man-lying-in-a-hospital-bed.jpg" alt="" />
+ </div><span class="title">Consciousness 'restored' using nerve stimulation</span> <span class="summary">One month after a vagus nerve stimulator was implanted in his chest, a patient who had spent 15 years in a vegetative state showed signs of consciousness.</span> <span class="more">Read now</span></a>
+ </div>
+ </div>
+ <div class="suggested_reading_inner column3">
+ <div class="suggested_item">
+ <a href="/articles/318965.php?sr" title="Cannabis for pain and PTSD 'lacks high-quality evidence'">
+ <div class="suggested_item_image">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/headlines/318/318965/medical-marijuana.jpg" alt="" />
+ </div><span class="title">Cannabis for pain and PTSD 'lacks high-quality evidence'</span> <span class="summary">Systematic reviews of the scientific evidence suggest that it is of insufficient quality to support the use of cannabis for the treatment of PTSD and pain.</span> <span class="more">Read now</span></a>
+ </div>
+ </div>
+ <div class="suggested_reading_inner column4">
+ <div class="suggested_item">
+ <a href="/articles/320725.php?sr" title="Pancreatic cancer: Modified flu virus destroys tumors">
+ <div class="suggested_item_image">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/320/320725/320725_1100.jpg" alt="" />
+ </div><span class="title">Pancreatic cancer: Modified flu virus destroys tumors</span> <span class="summary">Scientists destroyed pancreatic cancer cells using a modified flu virus. If confirmed in clinical trials, the findings could offer new treatments.</span> <span class="more">Read now</span></a>
+ </div>
+ </div>
+ <div class="suggested_reading_inner column5">
+ <div class="suggested_item">
+ <a href="/articles/320316.php?sr" title="Why facial recognition is the future of diagnostics">
+ <div class="suggested_item_image">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/320/320316/320316_1100.jpg" alt="" />
+ </div><span class="title">Why facial recognition is the future of diagnostics</span> <span class="summary">New research uses facial recognition analysis to accurately predict health. The findings also show that the human brain has similar abilities.</span> <span class="more">Read now</span></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="social_bottom">
+ <div id="share_social_bottom">
+ <div id="article_social_bottom_facebook"></div>
+ <div id="article_social_bottom_twitter"></div>
+ <div id="article_social_bottom_linkedin"></div>
+ </div>
+ <div class="toolbox">
+ <div class="email">
+ <a rel="nofollow" title="email this article" href="#"><span class="toolbox_label">email</span></a> <span class="visuallyhidden"><a rel="nofollow" title="email this article" href="#">email</a></span>
+ </div>
+ <div class="print">
+ <a id="241048dc7d4264d767c59873fc01b2af" href="#" rel="nofollow" title="View print preview" target="_blank"><span class="toolbox_label">print</span></a>
+ </div>
+ <div class="share">
+ <a rel="nofollow" title="share this article" href="#"><span class="toolbox_label">share</span></a> <span class="visuallyhidden"><a rel="nofollow" title="share this article" href="#">share</a></span>
+ </div>
+ </div>
+ </div><a id="rate-this-article"></a>
+ <div class="article_category_container">
+ <div class="article_main_category_container">
+ <span itemprop="genre" class="category_main"><a href="/categories/neurology" title="Neurology / Neuroscience News" class="current">Neurology / Neuroscience</a></span>
+ </div>
+ <div class="article_sub_category_container">
+ <span itemprop="genre" class="category_sub"><a href="/categories/biology-biochemistry" title="Biology / Biochemistry News" class="current">Biology / Biochemistry</a></span> <span itemprop="genre" class="category_sub"><a href="/categories/psychology-psychiatry" title="Psychology / Psychiatry News" class="current">Psychology / Psychiatry</a></span>
+ </div>
+ </div>
+ <link rel="stylesheet" href="https://cdn1.medicalnewstoday.com/structure/styles/styles_override_trendmd_7721.css" type="text/css" media="all" />
+ <h2 class="suggested_reading trendmd_suggestions_heading">
+ Recommended related news
+ </h2>
+ <div id="trendmd-suggestions"></div>
+ <script>
+ <![CDATA[
+
+ //init glob_JS, depulicate in gdpr_js_queue.js because the file will be execute before gdpr_js_queue.js loading
+ glob_JS=(typeof glob_JS === 'undefined')?{'GAInit':[],'GA':[],"ExternalJS":[],"AD":[]}:glob_JS;
+
+ fireOrSaveJsFunctions(1,function(){loadScript(
+ "https://cdn1.medicalnewstoday.com/structure/javascript/cache/trendmd.min.js",
+ {"data-trendmdconfig":'{"journal_id":"53928","element":"#trendmd-suggestions"}'},
+ function(){}
+
+ )});
+
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function(){
+
+ //TrendMD suggest reading check
+
+ var interval = null;
+ //Check every 5 secs
+ interval = setInterval(function(){
+
+ var trendmdSuggestions = document.getElementById('trendmd-suggestions');
+
+ var trendmdChildLength = trendmdSuggestions.children.length;
+
+
+ if(trendmdChildLength > 0){
+ trendmdSuggestions.style.display = 'block';
+ //$("#trendmd-suggestions").prev().hide();
+
+ document.getElementsByClassName("trendmd_suggestions_heading")[0].style.display = 'block';
+
+
+ if(is_userMobile&&!glob_responsiveOverride){
+ //We add new styles in
+
+ var elements = document.querySelectorAll('.trendmd-widget_horizontal .trendmd-widget-section');
+
+ for (var i = 0; i < elements.length; i++) {
+ elements[i].style.cssText = 'width:100% !important;margin: 0!important;padding: 0!important;';
+ };
+
+ }
+
+ clearInterval(interval);
+
+ }
+
+ },5000);
+
+ //If it runs over 120 secs ,kill the process
+ setTimeout(function() {
+
+ var trendmdSuggestions = document.getElementById('trendmd-suggestions');
+
+ var trendmdChildLength = trendmdSuggestions.children.length;
+
+ //If trendMD is still not working , we kill the process
+ if(trendmdChildLength === 0){
+
+ clearInterval(interval);
+ trendmdSuggestions.classList.add("process_killed");
+
+ }
+
+ }, 1200000);
+
+ });
+
+
+
+ //]]>
+ </script> <!-- TID: 205893 -->
+ <div class="article_email">
+ <div id="header_close_button" class="email_close"></div>
+ <div class="emailform_container"></div>
+ </div>
+ </div>
+ </article>
+ <div class="col-xs-12 col-sm-12 col-md-4 col-lg-4 sidebar">
+ <!-- article_ad code -->
+ <!-- MREC ARTICLE advert -->
+ <div id="dmr1_container" class="mnt css_hs211">
+ <div class="mnt_history" style="display:none;">
+ <a href="/knowledge-center"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_knowledge_center_001.png" alt="MNT Knowledge Center" /></a>
+ </div>
+ <div id="dmr1_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DMR1',
+ "slotContainer":'dmr1_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /article_ad code -->
+ <div id="sidebar_feature" class="full">
+ <h2>
+ Latest news
+ </h2>
+ <ul class="sidebar_feature">
+ <li>
+ <a href="/articles/324410.php" title="Simple drug formula regenerates brain cells">
+ <div>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/324/324410/324410_1100.jpg" alt="Simple drug formula regenerates brain cells" class="original" />
+ <div class="headline">
+ Simple drug formula regenerates brain cells
+ </div>
+ <div class="excerpt">
+ Scientists have shown how a drug cocktail of four compounds can convert glia, or support cells, next to damaged neurons into new working neurons.
+ </div>
+ </div></a>
+ </li>
+ <li>
+ <a href="/articles/324408.php" title="Breast cancer screening saved over 27,000 lives in 2018">
+ <div>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/324/324408/324408_1100.jpg" alt="Breast cancer screening saved over 27,000 lives in 2018" class="original" />
+ <div class="headline">
+ Breast cancer screening saved over 27,000 lives in 2018
+ </div>
+ <div class="excerpt">
+ A new study estimates that breast cancer mortality rates have fallen by approximately half in the United States in 2018, thanks to screening and therapy.
+ </div>
+ </div></a>
+ </li>
+ <li>
+ <a href="/articles/324407.php" title="Alcohol use disorder: A step toward better treatment?">
+ <div>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/324/324407/324407_1100.jpg" alt="Alcohol use disorder: A step toward better treatment?" class="original" />
+ <div class="headline">
+ Alcohol use disorder: A step toward better treatment?
+ </div>
+ <div class="excerpt">
+ Current treatments for alcohol use disorder are unsatisfactory, but recent research points toward a new intervention that may also benefit mood disorders.
+ </div>
+ </div></a>
+ </li>
+ <li>
+ <a href="/articles/324402.php" title="What role does the gut play in Parkinson's disease?">
+ <div>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/324/324402/324402_1100.jpg" alt="What role does the gut play in Parkinson's disease?" class="original" />
+ <div class="headline">
+ What role does the gut play in Parkinson's disease?
+ </div>
+ <div class="excerpt">
+ A review of existing research has examined the evidence for a connection between the gastrointestinal system and the progression of Parkinson's disease.
+ </div>
+ </div></a>
+ </li>
+ <li>
+ <a href="/articles/324376.php" title="Weight loss: How important is eating breakfast?">
+ <div>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAADklEQVR42mNkgAJGDAYAAFEABCaLYqoAAAAASUVORK5CYII=" data-src="https://cdn1.medicalnewstoday.com/content/images/hero/324/324376/324376_1100.jpg" alt="Weight loss: How important is eating breakfast?" class="original" />
+ <div class="headline">
+ Weight loss: How important is eating breakfast?
+ </div>
+ <div class="excerpt">
+ A new study has examined the importance of eating breakfast in the process of losing weight. It may not be as pivotal as once thought, say the authors.
+ </div>
+ </div></a>
+ </li>
+ </ul>
+ </div><!-- article_ad code -->
+ <!-- MREC ARTICLE advert -->
+ <div id="dmr2_container" class="mnt css_hs211">
+ <div class="mnt_history" style="display:none;">
+ <a href="/knowledge-center"><img src="https://cdn1.medicalnewstoday.com/structure/images/mnt_ads/mnt_knowledge_center_001.png" alt="MNT Knowledge Center" /></a>
+ </div>
+ <div id="dmr2_unit" adonis-marker="">
+ <script type="text/javascript">
+ //<![CDATA[
+ googleAdSlotInfo.push({
+ "slotName":'DMR2',
+ "slotContainer":'dmr2_container' });
+ //]]>
+ </script>
+ </div>
+ </div><!-- /article_ad code -->
+ <div class="full popular_tabs_container">
+ <div class="full popular_tabs_parent">
+ <h2 class="popular_tabs_heading">
+ <span>Popular in:</span> Neurology / Neuroscience
+ </h2>
+ <div id="popular_tabs">
+ <div class="centered">
+ <ul class="nav"></ul>
+ <div class="list-wrap">
+ <ul id="popular-read">
+ <li class="knowledge">
+ <a href="/articles/321560.php" title="Why are my legs and feet numb?"><span class="headline">Why are my legs and feet numb?</span></a>
+ </li>
+ <li class="knowledge">
+ <a href="/articles/321885.php" title="What can cause a burning sensation?"><span class="headline">What can cause a burning sensation?</span></a>
+ </li>
+ <li class="knowledge">
+ <a href="/articles/321423.php" title="What could cause tingling in the feet or hands?"><span class="headline">What could cause tingling in the feet or hands?</span></a>
+ </li>
+ <li class="knowledge">
+ <a href="/articles/322515.php" title="How to stop shivering"><span class="headline">How to stop shivering</span></a>
+ </li>
+ <li class="knowledge">
+ <a href="/articles/322967.php" title="Why do my arms go numb at night?"><span class="headline">Why do my arms go numb at night?</span></a>
+ </li>
+ </ul>
+ </div><!-- /list_wrap -->
+ </div><!-- /the_tabs -->
+ </div><!-- /centered -->
+ </div>
+ </div>
+ </div><!-- /sidebar -->
+ </div>
+ </div><img height="1" width="1" src="https://d.turn.com/r/dd/id/L21rdC84MTYvY2lkLzE3NDc2NjAwNjEvdC8y/kv/CampaignID=MedicalNewsToday,Content=otherneurologicaldisorders" />
+ <div id="message">
+ <a href="#top" style="display: none;">Scroll to top</a>
+ </div>
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 footer">
+ <div id="footer_logo">
+ <a href="/" title="Medical News Today : Home"><img src="https://cdn1.medicalnewstoday.com/structure/images/logo/logo-mini-2017.png" alt="MNT home" /></a>
+ </div>
+ <div id="footer_social">
+ <span class="footer_facebook fa-stack fa-lg"><a href="https://www.facebook.com/MedicalNewsToday" target="_blank"></a></span> <span class="footer_twitter fa-stack fa-lg"><a href="https://twitter.com/mnt" target="_blank"></a></span> <span class="footer_linkedin fa-stack fa-lg"><a href="https://www.linkedin.com/company/medical-news-today" target="_blank"></a></span> <span class="footer_google fa-stack fa-lg"><a href="https://plus.google.com/+medicalnews/posts" target="_blank"></a></span> <span class="footer_pinterest fa-stack fa-lg"><a href="https://www.pinterest.com/search/pins/?q=www.medicalnewstoday.com" target="_blank"></a></span>
+ </div>
+ <div id="footer_list">
+ <ul>
+ <li>
+ <a href="/popular" title="View our most popular news articles">Popular news</a>
+ </li>
+ <li>
+ <a href="/archive" title="View all our editorial articles">Editorial articles</a>
+ </li>
+ <li>
+ <a href="/categories" accesskey="m" title="View our complete news category list">All news topics</a>
+ </li>
+ <li>
+ <a href="/knowledge-center" title="Medical conditions and information center">Knowledge center</a>
+ </li>
+ <li>
+ <a href="/tour" title="Personalize Medical News Today">Your MNT</a>
+ </li>
+ <li>
+ <a href="/account" title="Log in or sign up">Log in or sign up</a>
+ </li>
+ <li>
+ <a href="/newsletter" title="Medical News Today in your inbox">Newsletters</a>
+ </li>
+ <li>
+ <a href="/share-our-content" title="Share our content">Share our content</a>
+ </li>
+ <li>
+ <a href="/about" title="About Medical News Today">About us</a>
+ </li>
+ <li>
+ <a href="/authors" title="Our editorial team">Our editorial team</a>
+ </li>
+ <li>
+ <a href="/contact" title="Contact the Medical News Today team">Contact us</a>
+ </li>
+ <li>
+ <a href="/advertising" title="Advertise with Medical News Today">Advertise with MNT</a>
+ </li>
+ </ul>
+ </div>
+ <div id="footer_newsletter">
+ <h3>
+ get our newsletter
+ </h3><span>Health tips, wellness advice and more.</span>
+ <div class="form-group">
+ <form method="post" action="https://www.medicalnewstoday.com/account" name="footerNewsletterSignup" id="footerNewsletterSignup" class="newsletterForm">
+ <div>
+ <input type="text" name="formEmail" id="EmailAddress" class="newsletterFormEmail" placeholder="Enter your email address" size="25" maxlength="150" /> <button type="submit" class="btn btn-success btn-lg btn-block btn-footer footer_newsletter_link email-signup-btn new_reg_signup">Subscribe</button>
+ <p>
+ Your <a href="/privacy-policy" title="Privacy policy">privacy</a> is important to us. Any information you provide to us via this website may be placed by us on servers located in countries outside of the EU. If you do not agree to such placement, do not provide the information.
+ </p>
+ </div><input type="hidden" id="entrypoint" name="entrypoint" value="footer_newsletter_link" />
+ </form>
+ </div>
+ </div>
+ <div id="copyright">
+ <div class="honcode_img">
+ <a href="https://www.healthonnet.org/HONcode/Conduct.html?HONConduct391155" class="seal" onclick="window.open(this.href); return false;"><img src="https://www.honcode.ch/HONcode/Seal/HONConduct391155_s1.gif" alt="This website is certified by Health On the Net Foundation. Click to verify." /></a>
+ </div>
+ <div class="copyright_text float_left">
+ <p>
+ Healthline Media UK Ltd, Brighton, UK.
+ </p>
+ <p>
+ © 2004-2019 All rights reserved. MNT is the registered trade mark of Healthline Media. Any medical information published on this website is not intended as a substitute for informed medical advice and you should not take any action before consulting with a healthcare professional.
+ </p>
+ </div>
+ <div class="copyright_text float_right">
+ <p>
+ <a href="/privacy-policy" title="View our privacy policy" onclick="fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'New Header - Desktop - Footer', eventAction: 'Footer - Privacy policy', eventLabel: 'Footer - Privacy policy' });});">Privacy</a> | <a href="/terms" title="View our terms of use" onclick="fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'New Header - Desktop - Footer', eventAction: 'Footer - Terms', eventLabel: 'Footer - Terms' });});">Terms</a> | <a href="/ad-policy" title="View our advertising policy">Ad policy</a> | <a href="https://www.healthline.com/health/careers" title="Careers" target="_blank">Careers</a>
+ </p>
+ </div>
+ </div>
+ <div class="footer_truste_container">
+ <div class="footer_truste">
+ <a href="//privacy.truste.com/privacy-seal/validation?rid=b59e7a69-59cd-449f-9af4-2bdba7d346e5" target="_blank"><img style="border: none" src="//privacy-policy.truste.com/privacy-seal/seal?rid=b59e7a69-59cd-449f-9af4-2bdba7d346e5" alt="TRUSTe" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <footer>
+ <div id="print_message">
+ <p>
+ This page was printed from: <strong><a href="https://www.medicalnewstoday.com/articles/318674.php">https://www.medicalnewstoday.com/articles/318674.php</a></strong>
+ </p>
+ <p>
+ Visit <strong><a href="https://www.medicalnewstoday.com">www.medicalnewstoday.com</a></strong> for medical news and health news headlines posted throughout the day, every day.
+ </p>
+ <hr />
+ <p>
+ 2019 Healthline Media UK Ltd. All rights reserved. MNT is the registered trade mark of Healthline Media. Any medical information published on this website is not intended as a substitute for informed medical advice and you should not take any action before consulting with a healthcare professional.
+ </p>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('a g=d.15(\'.r-14 9\');5(g&&g.b("8-3")){g.3=g.b("8-3");g.13(\'8-3\')}a 4=[].s.o(d.p(\'[8-3]\'));a w=6(h,f){5(h.f==""){h.f=f}u{a O=h.f.11(" ");5(O.12(f)==-1){h.f+=" "+f}}};1c(a i=0;i<4.M;i++){5(4[i].G.G.j[0]==\'1b\'){w(4[i],"r-c")}u{w(4[i],"c")}}d.q("1a",6(){4=[].s.o(d.p(\'9.r-c\'));4.l(6(2){2.3=2.b("8-3");2.j.n("r-c")});4=[].s.o(d.p(\'9.c\'));a I=10 7!=="1d";a R=I&&!("S"k 7)||/(Z|X|W)Y|V|U/i.T(19.1r);5(R){4.l(6(2){2.3=2.b("8-3");2.j.n("c")})}u{5("H"k 7){5(\'v\'k 7&&\'E\'k 7.v.A&&!(\'x\'k v.A)){1x.1e(7.v.A,\'x\',{1v:6(){1t 1u.E>0}})}a B=1z H(6(L,1E){L.l(6(z){5(z.x){a 2=z.1C;2.j.n("c");2.3=2.b("8-3");D(2);B.1A(2)}})},{1B:"y y 1y y"});4.l(6(2){B.1i(2)})}u{a m;6 e(){4=[].s.o(d.p(\'.c\'));5(m){1g(m)}m=1l(6(){a 1p=7.1o;4.l(6(9){5((9.P().1n-1w<=7.1h&&9.P().1m>=0)&&1q(9).1k!=="1f"){9.3=9.b("8-3");9.j.n(\'c\');D(9)}});5(4.M==0){d.C("K",e);7.C("J",e);7.C("Q",e)}},1s)}e();d.q("K",e);7.q("J",e);7.q("Q",e)}6 D(2){2.1D=6(){5(2.b(\'8-F-2-t\')){18(2.b(\'8-F-2-t\'),"",17)}5(2.b(\'8-N-2-t\')){16(2.b(\'8-N-2-t\'),"",1j)}}}}});',62,103,'||image|src|lazyloadImages|if|function|window|data|img|var|getAttribute|lazy|document|lazyload|className|owlCarouselFirstImage|element||classList|in|forEach|lazyloadThrottleTimeout|remove|call|querySelectorAll|addEventListener|owl|slice|index|else|IntersectionObserverEntry|addLazyClass|isIntersecting|0px|entry|prototype|imageObserver|removeEventListener|includeImagePlugin|intersectionRatio|click|parentNode|IntersectionObserver|runningOnBrowser|resize|scroll|entries|length|sharing|arr|getBoundingClientRect|orientationChange|isBot|onscroll|test|spider|crawl|ro|ing|bot|gle|typeof|split|indexOf|removeAttribute|carousel|querySelector|loadImageSharingImageByIndex|true|loadClickableImageByIndex|navigator|DOMContentLoaded|item|for|undefined|defineProperty|none|clearTimeout|innerHeight|observe|null|display|setTimeout|bottom|top|pageYOffset|scrollTop|getComputedStyle|userAgent|20|return|this|get|300|Object|300px|new|unobserve|rootMargin|target|onload|observer'.split('|'),0,{}))
+
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ window.ga=window.ga||function(){};
+ if (typeof window.googletag === 'undefined') {
+ //Fallback safe for googletag
+ var googletag = googletag || { };
+ googletag.cmd = googletag.cmd || [ ];
+ }
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ fireOrSaveJsFunctions(0,function() {ga('send', 'event', { eventCategory: 'New Header - Desktop - UI/UX Testing', eventAction: 'Show new header - Desktop', eventLabel: 'Show new header - Desktop', nonInteraction: true});});
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var is_userMobile=0;
+ var is_userTablet=0;
+ var glob_responsiveOverride=0;
+ var glob_customUserID=0;
+ var category=[{"displayNavName":"ADHD \/ ADD","url":"adhd"},{"displayNavName":"Allergy","url":"allergy"},{"displayNavName":"Alzheimer's \/ Dementia","url":"alzheimers"},{"displayNavName":"Anxiety \/ Stress","url":"anxiety"},{"displayNavName":"Rheumatology","url":"rheumatology"},{"displayNavName":"Respiratory","url":"respiratory"},{"displayNavName":"Bipolar","url":"bipolar"},{"displayNavName":"Body Aches","url":"bodyaches"},{"displayNavName":"Breast Cancer","url":"breast_cancer"},{"displayNavName":"Cancer \/ Oncology","url":"cancer-oncology"},{"displayNavName":"Cardiovascular \/ Cardiology","url":"cardiovascular"},{"displayNavName":"Caregivers \/ Homecare","url":"caregivers"},{"displayNavName":"Cholesterol","url":"cholesterol"},{"displayNavName":"Crohn's","url":"crohns"},{"displayNavName":"Cystic Fibrosis","url":"cystic_fibrosis"},{"displayNavName":"Depression","url":"depression"},{"displayNavName":"Dermatology","url":"dermatology"},{"displayNavName":"Diabetes","url":"diabetes"},{"displayNavName":"Erectile Dysfunction","url":"erectile_dysfunction"},{"displayNavName":"Fertility","url":"fertility"},{"displayNavName":"Obesity \/ Weight Loss \/ Fitness","url":"fitness-obesity"},{"displayNavName":"Headache \/ Migraine","url":"headache-migraine"},{"displayNavName":"Liver Disease \/ Hepatitis","url":"liver_disease"},{"displayNavName":"HIV and AIDS","url":"hiv-aids"},{"displayNavName":"Hypertension","url":"hypertension"},{"displayNavName":"Irritable Bowel Syndrome","url":"ibs"},{"displayNavName":"Lung Cancer","url":"lung_cancer"},{"displayNavName":"Lymphoma","url":"lymphoma"},{"displayNavName":"Men's Health","url":"mens_health"},{"displayNavName":"Mental Health","url":"mental_health"},{"displayNavName":"Neurology \/ Neuroscience","url":"neurology"},{"displayNavName":"Pregnancy \/ Obstetrics","url":"pregnancy"},{"displayNavName":"Psychology \/ Psychiatry","url":"psychology-psychiatry"},{"displayNavName":"Schizophrenia","url":"schizophrenia"},{"displayNavName":"Seniors \/ Aging","url":"seniors"},{"displayNavName":"Sexual Health \/ STDs","url":"sexual_health"},{"displayNavName":"Statins","url":"statins"},{"displayNavName":"Urology \/ Nephrology","url":"urology-nephrology"},{"displayNavName":"Women's Health","url":"womens_health"},{"displayNavName":"Pediatrics \/ Children's Health","url":"pediatrics"},{"displayNavName":"Radiology \/ Nuclear Medicine","url":"radiology"},{"displayNavName":"Bones \/ Orthopedics","url":"bones"},{"displayNavName":"Public Health","url":"public_health"},{"displayNavName":"Bio-terrorism \/ Terrorism","url":"bioterrorism"},{"displayNavName":"Aid \/ Disasters","url":"aid-disasters"},{"displayNavName":"Genetics","url":"genetics"},{"displayNavName":"Ear, Nose and Throat","url":"ent"},{"displayNavName":"Alcohol \/ Illegal Drugs","url":"alcohol"},{"displayNavName":"Nursing \/ Midwifery","url":"nursing"},{"displayNavName":"Medical Students \/ Training","url":"medical_students"},{"displayNavName":"Pharma \/ Biotech Industry","url":"pharma_industry"},{"displayNavName":"Stem Cell Research","url":"stem_cell"},{"displayNavName":"Dentistry","url":"dentistry"},{"displayNavName":"Bird Flu \/ Avian Flu","url":"birdflu"},{"displayNavName":"MRSA \/ Drug Resistance","url":"mrsa-superbug"},{"displayNavName":"Eye Health \/ Blindness","url":"eye_health"},{"displayNavName":"Tropical Diseases","url":"tropical_diseases"},{"displayNavName":"Cleft Palate","url":"cleft_palate"},{"displayNavName":"Infectious Diseases","url":"infectious_diseases"},{"displayNavName":"Parkinson's Disease","url":"parkinsons_disease"},{"displayNavName":"GastroIntestinal","url":"gastrointestinal"},{"displayNavName":"CJD \/ vCJD \/ Mad Cow Disease","url":"cjd-vcjd"},{"displayNavName":"Nutrition \/ Diet","url":"nutrition-diet"},{"displayNavName":"Gout","url":"gout"},{"displayNavName":"Stroke","url":"stroke"},{"displayNavName":"Complementary Medicine","url":"complementary_medicine"},{"displayNavName":"Endocrinology","url":"endocrinology"},{"displayNavName":"Biology \/ Biochemistry","url":"biology-biochemistry"},{"displayNavName":"Multiple Sclerosis","url":"multiple_sclerosis"},{"displayNavName":"Autism","url":"autism"},{"displayNavName":"Water - Air Quality \/ Agriculture","url":"water_quality"},{"displayNavName":"Immune System \/ Vaccines","url":"immune_system"},{"displayNavName":"Lupus","url":"lupus"},{"displayNavName":"Cosmetic Medicine","url":"cosmetic_medicine"},{"displayNavName":"Rehabilitation","url":"rehabilitation"},{"displayNavName":"Pain \/ Anesthetics","url":"pain"},{"displayNavName":"Hearing \/ Deafness","url":"hearing-deafness"},{"displayNavName":"Muscular Dystrophy \/ ALS","url":"muscular_dystrophy"},{"displayNavName":"Sports Medicine \/ Fitness","url":"sports_medicine"},{"displayNavName":"MRI \/ PET \/ Ultrasound","url":"mri-pet"},{"displayNavName":"Huntingtons Disease","url":"huntingtons_disease"},{"displayNavName":"Medical Devices \/ Diagnostics","url":"medical_devices"},{"displayNavName":"Smoking \/ Quit Smoking","url":"smoking"},{"displayNavName":"Transplants \/ Organ Donations","url":"transplants"},{"displayNavName":"Sleep \/ Sleep Disorders","url":"sleep"},{"displayNavName":"IT \/ Internet \/ E-mail","url":"it"},{"displayNavName":"Dyslexia","url":"dyslexia"},{"displayNavName":"Medicare \/ Medicaid \/ SCHIP","url":"medicare-medicaid"},{"displayNavName":"Epilepsy","url":"epilepsy"},{"displayNavName":"Prostate \/ Prostate Cancer","url":"prostate"},{"displayNavName":"Veterinary","url":"veterinary"},{"displayNavName":"Abortion","url":"abortion"},{"displayNavName":"Health Insurance","url":"health_insurance"},{"displayNavName":"Litigation","url":"medical_malpractice"},{"displayNavName":"Clinical Trials \/ Drug Trials","url":"clinical_trials"},{"displayNavName":"Conferences","url":"conferences"},{"displayNavName":"Compliance","url":"compliance"},{"displayNavName":"Primary Care \/ General Practice","url":"primary_care"},{"displayNavName":"Flu \/ Cold \/ SARS","url":"flu-sars"},{"displayNavName":"Blood \/ Hematology","url":"blood"},{"displayNavName":"Colorectal Cancer","url":"colorectal_cancer"},{"displayNavName":"Acid Reflux \/ GERD","url":"gerd"},{"displayNavName":"Cervical Cancer \/ HPV Vaccine","url":"cervical_cancer"},{"displayNavName":"Eating Disorders","url":"eatingdisorders"},{"displayNavName":"Pharmacy \/ Pharmacist","url":"pharmacy"},{"displayNavName":"Regulatory Affairs","url":"regulatoryaffairs"},{"displayNavName":"Ovarian Cancer","url":"ovarian_cancer"},{"displayNavName":"Menopause","url":"menopause"},{"displayNavName":"Psoriasis","url":"psoriasis"},{"displayNavName":"Tuberculosis","url":"tuberculosis"},{"displayNavName":"Back Pain","url":"back-pain"},{"displayNavName":"Heart Disease","url":"heart-disease"},{"displayNavName":"Asbestos \/ Mesothelioma","url":"asbestos"},{"displayNavName":"Lymphology \/ Lymphedema","url":"lymphology"},{"displayNavName":"Veterans \/ Ex-Servicemen","url":"veterans"},{"displayNavName":"Medical Practice Management","url":"medical_practice"},{"displayNavName":"Melanoma \/ Skin Cancer","url":"melanoma"},{"displayNavName":"COPD","url":"copd"},{"displayNavName":"Palliative Care \/ Hospice Care","url":"palliative_care"},{"displayNavName":"Vascular","url":"vascular"},{"displayNavName":"Fibromyalgia","url":"fibromyalgia"},{"displayNavName":"Pancreatic Cancer","url":"pancreatic-cancer"},{"displayNavName":"Preventive Medicine","url":"preventive-medicine"},{"displayNavName":"Swine Flu","url":"swine-flu"},{"displayNavName":"Restless Legs Syndrome","url":"restless-legs"},{"displayNavName":"Food Intolerance","url":"food-intolerance"},{"displayNavName":"Personal Monitoring","url":"personal-monitoring"},{"displayNavName":"Surgery","url":"surgery"},{"displayNavName":"Emergency Medicine","url":"emergency-medicine"},{"displayNavName":"Pulmonary System","url":"pulmonary-system"},{"displayNavName":"Medical Innovation","url":"medical-innovation"},{"displayNavName":"Ebola","url":"ebola"},{"displayNavName":"Ulcerative Colitis","url":"ulcerative-colitis"},{"displayNavName":"Constipation","url":"constipation"},{"displayNavName":"Arrhythmia","url":"arrhythmia"},{"displayNavName":"Osteoporosis","url":"osteoporosis"},{"displayNavName":"Diabetes Type 1","url":"diabetes-type-1"},{"displayNavName":"Diabetes Type 2","url":"diabetes-type-2"},{"displayNavName":"Dry Eye","url":"dry-eye"},{"displayNavName":"Endometriosis","url":"endometriosis"},{"displayNavName":"Psoriatic Arthritis","url":"psoriatic-arthritis"},{"displayNavName":"Hypothyroid","url":"hypothyroid"},{"displayNavName":"Shingles","url":"shingles"},{"displayNavName":"Premature Ejaculation","url":"premature-ejaculation"},{"displayNavName":"Asthma","url":"asthma"},{"displayNavName":"VTE","url":"vte"},{"displayNavName":"Seasonal Allergy","url":"seasonal-allergy"},{"displayNavName":"Food Allergy","url":"food-allergy"},{"displayNavName":"OAB","url":"oab"},{"displayNavName":"Urinary Tract Infection","url":"urinary-tract-infection"},{"displayNavName":"Leukemia","url":"leukemia"},{"displayNavName":"Osteoarthritis","url":"osteoarthritis"},{"displayNavName":"Rheumatoid Arthritis","url":"rheumatoid-arthritis"},{"displayNavName":"Birth Control","url":"birth-control-contraception"},{"displayNavName":"Head and Neck Cancer","url":"head-and-neck-cancer"},{"displayNavName":"Atopic Dermatitis","url":"atopic-dermatitis-eczema"},{"displayNavName":"Bites and Stings","url":"bites-stings"}];
+ var glob_testServer = 0;
+ var resetpw = 0;
+ var glob_newSkin = 1;
+ var glob_menu_prefix = 'New Header';
+ var glob_deviceInfo = 'Desktop';
+ var glob_newRegistration = 1;
+ var glob_triggerSurvey = 0;
+ var glob_pageType = 'article';
+ var glob_siteRevision = 7721;
+ var showNewsletterPopup = 0;
+ var AdBridg = AdBridg || {};
+ AdBridg.cmd = AdBridg.cmd || [];
+ //]]>
+ </script>
+ <script type="text/javascript" src="https://cdn2.medicalnewstoday.com/structure/javascript/out/mnt_default.js?v=20190211" defer="defer"></script>
+ <script src="https://healthline-com.videoplayerhub.com/galleryloader.js" defer="defer"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function(){
+
+ var tempAacctTid =setInterval(function() {
+
+ if(typeof _qevents !== "undefined"){
+ //wait until _qevents had been set
+ _qevents.push( { qacct:"p-v03RmX3GES6RT"} );
+ clearInterval(tempAacctTid);
+ }
+
+ }, 500);
+
+ });
+
+ //]]>
+ </script> <noscript>
+ <div style="display: none;">
+ <img src="https://pixel.quantserve.com/pixel/p-test123.gif" height="1" width="1" alt="Quantcast" />
+ </div></noscript>
+ <script src="https://cdn1.medicalnewstoday.com/structure/javascript/cache/oct.js" type="text/javascript"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function(){
+ twttr.conversion.trackPid('l4bfr');
+ });
+
+ //]]>
+ </script> <noscript><img height="1" width="1" style="display:none;" alt="" src="https://analytics.twitter.com/i/adsct?txn_id=l4bfr&amp;p_id=Twitter" /></noscript>
+ <div id="fb-root"></div>
+ <script>
+ <![CDATA[
+
+
+ fireOrSaveJsFunctions(1,function(){
+
+ (function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0];
+ if (d.getElementById(id)) return;
+ js = d.createElement(s); js.id = id;
+ js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.3&appId=147184211975697";
+ fjs.parentNode.insertBefore(js, fjs);
+ }(document, 'script', 'facebook-jssdk'));
+
+ });
+
+
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var ehs_site="ehsne.pro.mnt.medicalnewstoday";
+ var ord = window.ord || Math.floor(Math.random() * 1e16);
+ var ehs_protocol=(document.location.protocol=="https:") ? "https://" : "http://";
+ document.write('<scr'+'ipt type="text/javascript" src="'+ehs_protocol+'ad.doubleclick.net/N6913/adj/'+ehs_site+';sz=1x1;iprof=md;ims1=n23;ord=' + ord + '?"><\/scr'+'ipt>');
+ //]]>
+ </script>
+ <div id="amzn-assoc-ad-c3555b57-ee3e-4ba5-b6f4-ec40911af7e4"></div>
+ <script>
+ <![CDATA[
+
+ fireOrSaveJsFunctions(1,function(){loadScript(
+ "//z-na.amazon-adsystem.com/widgets/onejs?MarketPlace=US&adInstanceId=c3555b57-ee3e-4ba5-b6f4-ec40911af7e4",
+ {},
+ function(){}
+
+ )});
+
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var articleID="318674";
+ var articleType = "written";
+ var emailID = "318674";
+ var articleURL = "/articles/318674.php";
+ var threadID = "205893";
+ var opinionsOutput = 1;
+ var showAdsOnArticle = 1;
+ var isSponsored = 0;
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ for(var contentBlocksDoms=document.querySelectorAll(".infobox_large.article-tcblocks > li"),i=0;i<contentBlocksDoms.length;i++){var _this=contentBlocksDoms[i],mobileHeadline=_this.querySelector("a > div.headline.mobile"),excerpt=_this.querySelector("a > div > .excerpt"),desktopHeadlineHtmlStr=mobileHeadline.outerHTML;desktopHeadlineHtmlStr=desktopHeadlineHtmlStr.replace(/(class=\".*?)\s*mobile\s*(.*?\")/g,"$1$2"),null===_this.querySelector("a > div > .headline")&&excerpt.insertAdjacentHTML("beforebegin",desktopHeadlineHtmlStr),_this.getElementsByTagName("a")[0].removeChild(mobileHeadline)}
+
+ //Remove class hide in tabbed content to show on desktop/ tablet
+ if(document.getElementsByClassName("collapsed__tabs")[0]){
+ document.getElementsByClassName("collapsed__tabs")[0].classList.remove('hide');
+ }
+
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ var articleTOC = document.getElementsByClassName("article_toc")[0];
+
+ if(document.body.contains(articleTOC)){
+ // if the page contains article TOC, we do the trick
+ var articleTOCpreviousElement = articleTOC.previousElementSibling;
+
+ if(articleTOCpreviousElement){
+ if((articleTOCpreviousElement.className.indexOf("photobox_header") !==-1&&articleTOCpreviousElement.querySelector("em") != null)||(articleTOCpreviousElement.className.indexOf("photobox_left") !==-1&&articleTOCpreviousElement.querySelector("em") != null)||(articleTOCpreviousElement.className.indexOf("photobox_right") !==-1&&articleTOCpreviousElement.querySelector("em") != null)){
+ articleTOC.classList.add("article_collapsed--top");
+ }
+ }
+
+ }
+
+ //]]>
+ </script> <input type="hidden" id="newsid" name="newsid" value="318674" /> <input type="hidden" id="categoryid" name="categoryid" value="31" /> <input type="hidden" id="glob" name="glob" value="1" /> <input type="hidden" id="ratingHCP" name="ratingHCP" value="4.91" /> <input type="hidden" id="ratingPublic" name="ratingPublic" value="4.88" /> <input type="hidden" id="alreadyRated" name="alreadyRated" value="0" /> <input type="hidden" id="kcarticle" name="kcarticle" value="0" /> <input type="hidden" id="bottomRatingsBoxReadOnly" name="bottomRatingsBoxReadOnly" value="false" />
+ <script type="text/javascript" src="https://cdn2.medicalnewstoday.com/structure/javascript/out/mnt_article_7721.js" defer="defer"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var mntDataLayer = "";
+ //Fire in adblock.js cause that's the last event in the page
+ function setMNTDataLayer(e) {
+ mntDataLayer = {"article_meta":{"publisher":"Medical News Today","headline":"How does the brain turn unconscious information into conscious thought?","description":"New research investigates the neurobiological timing of the so-called a-ha! moment that occurs we have come up with the solution to a complex problem.","url":"\/articles\/318674.php","CanonicalURL":"https:\/\/www.medicalnewstoday.com\/articles\/318674.php","datePublished":"2017-07-27","dateUpdated":"","dateReviewed":"","author":"Ana Sandoiu","coAuthor":"","reviewer":"","ratingHCP":4.91,"ratingPublic":4.88,"commentCount":2,"shareCountFacebook":0,"shareCountGooglePlus":0,"shareCountLinkedIn":0,"shareCountPinterest":0,"ampURL":"","ampVersion":"N"},"reader":{"loggedIn":"no"},"targeting":{"categoryMain":"neurology","categorySub":["biology-biochemistry","psychology-psychiatry"],"articleKeywords":["bounded accumulation model","bounded accumulation evidence","unconscious","consciousness","aha moment"],"articleID":"318674","articleType":"written","micrositeID":"","articleVersion":"v2","articleAge":"older"},"customDimensions":{"siteVersion":"desktop","webServer":"3","iosAppTraffic":-1,"viewportWidth":0,"viewportHeight":0,"hidpi":0,"adblockStatus":0}}
+ mntDataLayer["article_meta"]["shareCountFacebook"] = facebookCount;
+ mntDataLayer["article_meta"]["shareCountGooglePlus"] = googlePlusCount;
+ mntDataLayer["article_meta"]["shareCountLinkedIn"] = linkedinCount;
+ mntDataLayer["article_meta"]["shareCountPinterest"] = pinterestCount;
+ mntDataLayer["article_meta"]["url"] = window.location.href;
+ mntDataLayer["customDimensions"]["adblockStatus"] = adBlockValue;
+ mntDataLayer["customDimensions"]["viewportWidth"] = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
+ mntDataLayer["customDimensions"]["viewportHeight"] = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
+ mntDataLayer["customDimensions"]["hidpi"] = (window.devicePixelRatio >= 1.5) ? "HiDPI" : "1X";
+ }
+ //]]>
+ </script>
+ </footer>
+ </footer>
+ </div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html
index 679d8b75b..eb623275e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-1/expected.html
@@ -1,54 +1,61 @@
<div>
- <h2 data-align="center" id="3c62" name="3c62">Open Journalism Project:</h2>
- <h4 data-align="center" id="425a" name="425a"><em>Better Student Journalism</em></h4>
+ <h4 name="425a" id="425a" data-align="center"><em>Better Student Journalism</em></h4>
- <p id="d178" name="d178">We pushed out the first version of the <a data-href="http://pippinlee.github.io/open-journalism-project/" href="http://pippinlee.github.io/open-journalism-project/" rel="nofollow">Open Journalism site</a> in January. Our goal is for the
+
+ <p name="d178" id="d178">We pushed out the first version of the <a href="http://pippinlee.github.io/open-journalism-project/" data-href="http://pippinlee.github.io/open-journalism-project/" rel="nofollow">Open Journalism site</a> in January. Our goal is for the
site to be a place to teach students what they should know about journalism
on the web. It should be fun too.</p>
- <p id="01ed" name="01ed">Topics like <a data-href="http://pippinlee.github.io/open-journalism-project/Mapping/" href="http://pippinlee.github.io/open-journalism-project/Mapping/" rel="nofollow">mapping</a>, <a data-href="http://pippinlee.github.io/open-journalism-project/Security/" href="http://pippinlee.github.io/open-journalism-project/Security/" rel="nofollow">security</a>, command
- line tools, and <a data-href="http://pippinlee.github.io/open-journalism-project/Open-source/" href="http://pippinlee.github.io/open-journalism-project/Open-source/" rel="nofollow">open source</a> are
+ <p name="01ed" id="01ed">Topics like <a href="http://pippinlee.github.io/open-journalism-project/Mapping/" data-href="http://pippinlee.github.io/open-journalism-project/Mapping/" rel="nofollow">mapping</a>, <a href="http://pippinlee.github.io/open-journalism-project/Security/" data-href="http://pippinlee.github.io/open-journalism-project/Security/" rel="nofollow">security</a>, command
+ line tools, and <a href="http://pippinlee.github.io/open-journalism-project/Open-source/" data-href="http://pippinlee.github.io/open-journalism-project/Open-source/" rel="nofollow">open source</a> are
all concepts that should be made more accessible, and should be easily
understood at a basic level by all journalists. We’re focusing on students
because we know student journalism well, and we believe that teaching maturing
journalists about the web will provide them with an important lens to view
the world with. This is how we got to where we are now.</p>
- <h3 id="0348" name="0348">Circa 2011</h3>
- <p id="f923" name="f923">In late 2011 I sat in the design room of our university’s student newsroom
+ <h3 name="0348" id="0348">Circa 2011</h3>
+ <p name="f923" id="f923">In late 2011 I sat in the design room of our university’s student newsroom
with some of the other editors: Kate Hudson, Brent Rose, and Nicholas Maronese.
I was working as the photo editor then—something I loved doing. I was very
happy travelling and photographing people while listening to their stories.</p>
- <p id="c9d4" name="c9d4">Photography was my lucky way of experiencing the many types of people
+ <p name="c9d4" id="c9d4">Photography was my lucky way of experiencing the many types of people
my generation seemed to avoid, as well as many the public spends too much
time discussing. One of my habits as a photographer was scouring sites
like Flickr to see how others could frame the world in ways I hadn’t previously
considered.</p>
- <figure id="06e8" name="06e8"><div>
+ <figure name="06e8" id="06e8">
+ <div>
- <p><img data-action="zoom" data-action-value="1*AzYWbe4cZkMMEUbfRjysLQ.png" data-height="500" data-image-id="1*AzYWbe4cZkMMEUbfRjysLQ.png" data-width="1000" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*AzYWbe4cZkMMEUbfRjysLQ.png"></img></p></div>
- <figcaption>topleftpixel.com</figcaption></figure><p id="930f" name="930f">I started discovering beautiful things the <a data-href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" rel="nofollow">web could do with images</a>:
+ <p><img data-image-id="1*AzYWbe4cZkMMEUbfRjysLQ.png" data-width="1000" data-height="500" data-action="zoom" data-action-value="1*AzYWbe4cZkMMEUbfRjysLQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*AzYWbe4cZkMMEUbfRjysLQ.png">
+ </p></div>
+ <figcaption>topleftpixel.com</figcaption>
+ </figure>
+ <p name="930f" id="930f">I started discovering beautiful things the <a href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" data-href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" rel="nofollow">web could do with images</a>:
things not possible with print. Just as every generation revolts against
walking in the previous generations shoes, I found myself questioning the
expectations that I came up against as a photo editor. In our newsroom
the expectations were built from an outdated information world. We were
expected to fill old shoes.</p>
- <p id="2674" name="2674">So we sat in our student newsroom—not very happy with what we were doing.
+ <p name="2674" id="2674">So we sat in our student newsroom—not very happy with what we were doing.
Our weekly newspaper had remained essentially unchanged for 40+ years.
Each editorial position had the same requirement every year. The <em>big</em> change
happened in the 80s when the paper started using colour. We’d also stumbled
into having a website, but it was updated just once a week with the release
of the newspaper.</p>
- <p id="e498" name="e498">Information had changed form, but the student newsroom hadn’t, and it
+ <p name="e498" id="e498">Information had changed form, but the student newsroom hadn’t, and it
was becoming harder to romanticize the dusty newsprint smell coming from
the shoes we were handed down from previous generations of editors. It
was, we were told, all part of “becoming a journalist.”</p>
- <figure id="12da" name="12da"><div>
+ <figure name="12da" id="12da">
+ <div>
- <p><img data-action="zoom" data-action-value="1*d0Hp6KlzyIcGHcL6to1sYQ.png" data-height="451" data-image-id="1*d0Hp6KlzyIcGHcL6to1sYQ.png" data-width="868" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*d0Hp6KlzyIcGHcL6to1sYQ.png"></img></p></div>
- </figure><h3 id="e2f0" name="e2f0">We don’t know what we don’t know</h3>
- <p id="8263" name="8263">We spent much of the rest of the school year asking “what should we be
+ <p><img data-image-id="1*d0Hp6KlzyIcGHcL6to1sYQ.png" data-width="868" data-height="451" data-action="zoom" data-action-value="1*d0Hp6KlzyIcGHcL6to1sYQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*d0Hp6KlzyIcGHcL6to1sYQ.png">
+ </p></div>
+ </figure>
+ <h3 name="e2f0" id="e2f0">We don’t know what we don’t know</h3>
+ <p name="8263" id="8263">We spent much of the rest of the school year asking “what should we be
doing in the newsroom?”, which mainly led us to ask “how do we use the
web to tell stories?” It was a straightforward question that led to many
more questions about the web: something we knew little about. Out in the
@@ -56,12 +63,12 @@
in a dying print world. They wore the same design of shoes that we were
supposed to fill. Being pushed to repeat old, failing strategies and blocked
from trying something new scared us.</p>
- <p id="231e" name="231e">We had questions, so we started doing some research. We talked with student
+ <p name="231e" id="231e">We had questions, so we started doing some research. We talked with student
newsrooms in Canada and the United States, and filled too many Google Doc
files with notes. Looking at the notes now, they scream of fear. We annotated
our notes with naive solutions, often involving scrambled and immature
odysseys into the future of online journalism.</p>
- <p id="6ec3" name="6ec3">There was a lot we didn’t know. We didn’t know <strong>how to build a mobile app</strong>.
+ <p name="6ec3" id="6ec3">There was a lot we didn’t know. We didn’t know <strong>how to build a mobile app</strong>.
We didn’t know <strong>if we should build a mobile app</strong>.
We didn’t know <strong>how to run a server</strong>.
We didn’t know <strong>where to go to find a server</strong>.
@@ -69,122 +76,141 @@
We didn’t know <strong>how people used the web to read news</strong>.
We didn’t know <strong>what news should be on the web</strong>.
If news is just information, what does that even look like?</p>
- <p id="f373" name="f373">We asked these questions to many students at other papers to get a consensus
+ <p name="f373" id="f373">We asked these questions to many students at other papers to get a consensus
of what had worked and what hadn’t. They reported similar questions and
fears about the web but followed with “print advertising is keeping us
afloat so we can’t abandon it”.</p>
- <p id="034b" name="034b">In other words, we knew that we should be building a newer pair of shoes,
+ <p name="034b" id="034b">In other words, we knew that we should be building a newer pair of shoes,
but we didn’t know what the function of the shoes should be.</p>
- <h3 id="ea15" name="ea15">Common problems in student newsrooms (2011)</h3>
- <p id="a90b" name="a90b">Our questioning of other student journalists in 15 student newsrooms brought
+ <h3 name="ea15" id="ea15">Common problems in student newsrooms (2011)</h3>
+ <p name="a90b" id="a90b">Our questioning of other student journalists in 15 student newsrooms brought
up a few repeating issues.</p>
- <ul><li id="a586" name="a586">Lack of mentorship</li>
- <li id="a953" name="a953">A news process that lacked consideration of the web</li>
- <li id="6286" name="6286">No editor/position specific to the web</li>
- <li id="04c1" name="04c1">Little exposure to many of the cool projects being put together by professional
+ <ul>
+ <li name="a586" id="a586">Lack of mentorship</li>
+ <li name="a953" id="a953">A news process that lacked consideration of the web</li>
+ <li name="6286" id="6286">No editor/position specific to the web</li>
+ <li name="04c1" id="04c1">Little exposure to many of the cool projects being put together by professional
newsrooms</li>
- <li id="a1fb" name="a1fb">Lack of diverse skills within the newsroom. Writers made up 95% of the
+ <li name="a1fb" id="a1fb">Lack of diverse skills within the newsroom. Writers made up 95% of the
personnel. Students with other skills were not sought because journalism
was seen as “a career with words.” The other 5% were designers, designing
words on computers, for print.</li>
- <li id="0be9" name="0be9">Not enough discussion between the business side and web efforts</li>
- </ul><figure id="79ed" name="79ed"><div>
+ <li name="0be9" id="0be9">Not enough discussion between the business side and web efforts</li>
+ </ul>
+ <figure name="79ed" id="79ed">
+ <div>
- <p><img data-action="zoom" data-action-value="1*_9KYIFrk_PqWFgptsMDeww.png" data-height="500" data-image-id="1*_9KYIFrk_PqWFgptsMDeww.png" data-width="1086" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*_9KYIFrk_PqWFgptsMDeww.png"></img></p></div>
- <figcaption>From our 2011 research</figcaption></figure><h3 id="8d0c" name="8d0c">Common problems in student newsrooms (2013)</h3>
- <p id="3ef6" name="3ef6">Two years later, we went back and looked at what had changed. We talked
+ <p><img data-image-id="1*_9KYIFrk_PqWFgptsMDeww.png" data-width="1086" data-height="500" data-action="zoom" data-action-value="1*_9KYIFrk_PqWFgptsMDeww.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*_9KYIFrk_PqWFgptsMDeww.png">
+ </p></div>
+ <figcaption>From our 2011 research</figcaption>
+ </figure>
+ <h3 name="8d0c" id="8d0c">Common problems in student newsrooms (2013)</h3>
+ <p name="3ef6" id="3ef6">Two years later, we went back and looked at what had changed. We talked
to a dozen more newsrooms and weren’t surprised by our findings.</p>
- <ul><li id="abb1" name="abb1">Still no mentorship or link to professional newsrooms building stories
+ <ul>
+ <li name="abb1" id="abb1">Still no mentorship or link to professional newsrooms building stories
for the web</li>
- <li id="9250" name="9250">Very little control of website and technology</li>
- <li id="d822" name="d822">The lack of exposure that student journalists have to interactive storytelling.
+ <li name="9250" id="9250">Very little control of website and technology</li>
+ <li name="d822" id="d822">The lack of exposure that student journalists have to interactive storytelling.
While some newsrooms are in touch with what’s happening with the web and
journalism, there still exists a huge gap between the student newsroom
and its professional counterpart</li>
- <li id="6bf2" name="6bf2">No time in the current news development cycle for student newsrooms to
+ <li name="6bf2" id="6bf2">No time in the current news development cycle for student newsrooms to
experiment with the web</li>
- <li id="e62f" name="e62f">Lack of skill diversity (specifically coding, interaction design, and
+ <li name="e62f" id="e62f">Lack of skill diversity (specifically coding, interaction design, and
statistics)</li>
- <li id="f4f0" name="f4f0">Overly restricted access to student website technology. Changes are primarily
+ <li name="f4f0" id="f4f0">Overly restricted access to student website technology. Changes are primarily
visual rather than functional.</li>
- <li id="8b8d" name="8b8d">Significantly reduced print production of many papers</li>
- <li id="dfe0" name="dfe0">Computers aren’t set up for experimenting with software and code, and
+ <li name="8b8d" id="8b8d">Significantly reduced print production of many papers</li>
+ <li name="dfe0" id="dfe0">Computers aren’t set up for experimenting with software and code, and
often locked down</li>
- </ul><p id="52cd" name="52cd">Newsrooms have traditionally been covered in copies of The New York Times
+ </ul>
+ <p name="52cd" id="52cd">Newsrooms have traditionally been covered in copies of The New York Times
or Globe and Mail. Instead newsrooms should try spend at 20 minutes each
week going over the coolest/weirdest online storytelling in an effort to
- expose each other to what is possible. “<a data-href="http://nytlabs.com/" href="http://nytlabs.com/" rel="nofollow">Hey, what has the New York Times R&amp;D lab been up to this week?</a>”</p>
- <p id="0142" name="0142">Instead of having computers that are locked down, try setting aside a
+ expose each other to what is possible. “<a href="http://nytlabs.com/" data-href="http://nytlabs.com/" rel="nofollow">Hey, what has the New York Times R&amp;D lab been up to this week?</a>”</p>
+ <p name="0142" id="0142">Instead of having computers that are locked down, try setting aside a
few office computers that allow students to play and “break”, or encourage
editors to buy their own Macbooks so they’re always able to practice with
code and new tools on their own.</p>
- <p id="5d29" name="5d29">From all this we realized that changing a student newsroom is difficult.
+ <p name="5d29" id="5d29">From all this we realized that changing a student newsroom is difficult.
It takes patience. It requires that the business and editorial departments
of the student newsroom be on the same (web)page. The shoes of the future
must be different from the shoes we were given.</p>
- <p id="1ffc" name="1ffc">We need to rethink how long the new shoe design will be valid. It’s more
+ <p name="1ffc" id="1ffc">We need to rethink how long the new shoe design will be valid. It’s more
important that we focus on the process behind making footwear than on actually
creating a specific shoe. We shouldn’t be building a shoe to last 40 years.
Our footwear design process will allow us to change and adapt as technology
evolves. The media landscape will change, so having a newsroom that can
change with it will be critical.</p>
- <p id="2888" name="2888"><strong>We are building a shoe machine, not a shoe.</strong>
+ <p name="2888" id="2888"><strong>We are building a shoe machine, not a shoe.</strong>
</p>
- <h3 id="9c30" name="9c30">A train or light at the end of the tunnel: are student newsrooms changing for the better?</h3>
+ <h3 name="9c30" id="9c30">A train or light at the end of the tunnel: are student newsrooms changing for the better?</h3>
- <p id="4634" name="4634">In our 2013 research we found that almost 50% of student newsrooms had
+ <p name="4634" id="4634">In our 2013 research we found that almost 50% of student newsrooms had
created roles specifically for the web. <strong>This sounds great, but is still problematic in its current state.</strong>
</p>
- <figure id="416f" name="416f"><div>
+ <figure name="416f" id="416f">
+ <div>
- <p><img data-height="560" data-image-id="1*Vh2MpQjqjPkzYJaaWExoVg.png" data-width="624" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*Vh2MpQjqjPkzYJaaWExoVg.png"></img></p></div>
+ <p><img data-image-id="1*Vh2MpQjqjPkzYJaaWExoVg.png" data-width="624" data-height="560" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*Vh2MpQjqjPkzYJaaWExoVg.png">
+ </p></div>
<figcaption><strong>We designed many of these slides to help explain to ourselves what we were doing</strong>
- </figcaption></figure><p id="39e6" name="39e6">When a newsroom decides to create a position for the web, it’s often with
+ </figcaption>
+ </figure>
+ <p name="39e6" id="39e6">When a newsroom decides to create a position for the web, it’s often with
the intent of having content flow steadily from writers onto the web. This
is a big improvement from just uploading stories to the web whenever there
is a print issue. <em>However…</em>
</p>
- <ol><li id="91b5" name="91b5"><strong>The handoff</strong>
- <br></br>Problems arise because web editors are given roles that absolve the rest
+ <ol>
+ <li name="91b5" id="91b5"><strong>The handoff</strong>
+ <br>Problems arise because web editors are given roles that absolve the rest
of the editors from thinking about the web. All editors should be involved
in the process of story development for the web. While it’s a good idea
to have one specific editor manage the website, contributors and editors
should all play with and learn about the web. Instead of “can you make
a computer do XYZ for me?”, we should be saying “can you show me how to
make a computer do XYZ?”</li>
- <li id="6448" name="6448"><strong>Not just social media<br></br></strong>A
+ <li name="6448" id="6448"><strong>Not just social media<br></strong>A
web editor could do much more than simply being in charge of the social
media accounts for the student paper. Their responsibility could include
teaching all other editors to be listening to what’s happening online.
The web editor can take advantage of live information to change how the
student newsroom reports news in real time.</li>
- <li id="ab30" name="ab30"><strong>Web (interactive) editor<br></br></strong>The
+ <li name="ab30" id="ab30"><strong>Web (interactive) editor<br></strong>The
goal of having a web editor should be for someone to build and tell stories
that take full advantage of the web as their medium. Too often the web’s
interactivity is not considered when developing the story. The web then
ends up as a resting place for print words.</li>
- </ol><p id="e983" name="e983">Editors at newsrooms are still figuring out how to convince writers of
+ </ol>
+ <p name="e983" id="e983">Editors at newsrooms are still figuring out how to convince writers of
the benefit to having their content online. There’s still a stronger draw
to writers seeing their name in print than on the web. Showing writers
that their stories can be told in new ways to larger audiences is a convincing
argument that the web is a starting point for telling a story, not its
graveyard.</p>
- <p id="5c11" name="5c11">When everyone in the newsroom approaches their website with the intention
+ <p name="5c11" id="5c11">When everyone in the newsroom approaches their website with the intention
of using it to explore the web as a medium, they all start to ask “what
is possible?” and “what can be done?” You can’t expect students to think
in terms of the web if it’s treated as a place for print words to hang
out on a web page.</p>
- <p id="4eb1" name="4eb1">We’re OK with this problem, if we see newsrooms continue to take small
+ <p name="4eb1" id="4eb1">We’re OK with this problem, if we see newsrooms continue to take small
steps towards having all their editors involved in the stories for the
web.</p>
- <figure id="7aab" name="7aab"><div>
+ <figure name="7aab" id="7aab">
+ <div>
- <p><img data-action="zoom" data-action-value="1*2Ln_DmC95Xpz6LzgywkcFQ.png" data-height="718" data-image-id="1*2Ln_DmC95Xpz6LzgywkcFQ.png" data-width="1315" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*2Ln_DmC95Xpz6LzgywkcFQ.png"></img></p></div>
+ <p><img data-image-id="1*2Ln_DmC95Xpz6LzgywkcFQ.png" data-width="1315" data-height="718" data-action="zoom" data-action-value="1*2Ln_DmC95Xpz6LzgywkcFQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*2Ln_DmC95Xpz6LzgywkcFQ.png">
+ </p></div>
<figcaption>The current Open Journalism site was a few years in the making. This was
- an original launch page we use in 2012</figcaption></figure><h3 id="08f5" name="08f5">What we know</h3>
- <ul><li id="f7fe" name="f7fe"><strong>New process</strong>
- <br></br>Our rough research has told us newsrooms need to be reorganized. This
+ an original launch page we use in 2012</figcaption>
+ </figure>
+ <h3 name="08f5" id="08f5">What we know</h3>
+ <ul>
+ <li name="f7fe" id="f7fe"><strong>New process</strong>
+ <br>Our rough research has told us newsrooms need to be reorganized. This
includes every part of the newsroom’s workflow: from where a story and
its information comes from, to thinking of every word, pixel, and interaction
the reader will have with your stories. If I was a photo editor that wanted
@@ -196,16 +222,16 @@
“digital manifestos”, it’s about being curious enough that you’ll want
to to continue experimenting with your process until you’ve found one that
fits your newsroom’s needs.</li>
- <li id="d757" name="d757"><strong>More (remote) mentorship</strong>
- <br></br>Lack of mentorship is still a big problem. <a data-href="http://www.google.com/get/journalismfellowship/" href="http://www.google.com/get/journalismfellowship/" rel="nofollow">Google’s fellowship program</a> is great. The fact that it
+ <li name="d757" id="d757"><strong>More (remote) mentorship</strong>
+ <br>Lack of mentorship is still a big problem. <a href="http://www.google.com/get/journalismfellowship/" data-href="http://www.google.com/get/journalismfellowship/" rel="nofollow">Google’s fellowship program</a> is great. The fact that it
only caters to United States students isn’t. There are only a handful of
internships in Canada where students interested in journalism can get experience
writing code and building interactive stories. We’re OK with this for now,
as we expect internships and mentorship over the next 5 years between professional
newsrooms and student newsrooms will only increase. It’s worth noting that
some of that mentorship will likely be done remotely.</li>
- <li id="a9b8" name="a9b8"><strong>Changing a newsroom culture</strong>
- <br></br>Skill diversity needs to change. We encourage every student newsroom we
+ <li name="a9b8" id="a9b8"><strong>Changing a newsroom culture</strong>
+ <br>Skill diversity needs to change. We encourage every student newsroom we
talk to, to start building a partnership with their school’s Computer Science
department. It will take some work, but you’ll find there are many CS undergrads
that love playing with web technologies, and using data to tell stories.
@@ -215,71 +241,83 @@
who love statistics and exploring data. Getting students who are amazing
at design, data, code, words, and images into one room is one of the coolest
experience I’ve had. Everyone benefits from a more diverse newsroom.</li>
- </ul><h3 id="a67e" name="a67e">What we don’t know</h3>
- <ul><li id="7320" name="7320"><strong>Sharing curiosity for the web</strong>
- <br></br>We don’t know how to best teach students about the web. It’s not efficient
+ </ul>
+ <h3 name="a67e" id="a67e">What we don’t know</h3>
+ <ul>
+ <li name="7320" id="7320"><strong>Sharing curiosity for the web</strong>
+ <br>We don’t know how to best teach students about the web. It’s not efficient
for us to teach coding classes. We do go into newsrooms and get them running
their first code exercises, but if someone wants to learn to program, we
can only provide the initial push and curiosity. We will be trying out
“labs” with a few schools next school year to hopefully get a better idea
of how to teach students about the web.</li>
- <li id="8b23" name="8b23"><strong>Business</strong>
- <br></br>We don’t know how to convince the business side of student papers that
+ <li name="8b23" id="8b23"><strong>Business</strong>
+ <br>We don’t know how to convince the business side of student papers that
they should invest in the web. At the very least we’re able to explain
that having students graduate with their current skill set is painful in
the current job market.</li>
- <li id="191e" name="191e"><strong>The future</strong>
- <br></br>We don’t know what journalism or the web will be like in 10 years, but
+ <li name="191e" id="191e"><strong>The future</strong>
+ <br>We don’t know what journalism or the web will be like in 10 years, but
we can start encouraging students to keep an open mind about the skills
they’ll need. We’re less interested in preparing students for the current
newsroom climate, than we are in teaching students to have the ability
to learn new tools quickly as they come and go.</li>
- </ul></div><div>
- <h3 id="009a" name="009a">What we’re trying to share with others</h3>
- <ul><li id="8bfa" name="8bfa"><strong>A concise guide to building stories for the web</strong>
- <br></br>There are too many options to get started. We hope to provide an opinionated
+ </ul>
+ </div><div>
+ <h3 name="009a" id="009a">What we’re trying to share with others</h3>
+ <ul>
+ <li name="8bfa" id="8bfa"><strong>A concise guide to building stories for the web</strong>
+ <br>There are too many options to get started. We hope to provide an opinionated
guide that follows both our experiences, research, and observations from
trying to teach our peers.</li>
- </ul><p id="8196" name="8196">Student newsrooms don’t have investors to please. Student newsrooms can
+ </ul>
+ <p name="8196" id="8196">Student newsrooms don’t have investors to please. Student newsrooms can
change their website every week if they want to try a new design or interaction.
As long as students start treating the web as a different medium, and start
building stories around that idea, then we’ll know we’re moving forward.</p>
- <h3 id="f6c6" name="f6c6">A note to professional news orgs</h3>
- <p id="d8f5" name="d8f5">We’re also asking professional newsrooms to be more open about their process
+ <h3 name="f6c6" id="f6c6">A note to professional news orgs</h3>
+ <p name="d8f5" id="d8f5">We’re also asking professional newsrooms to be more open about their process
of developing stories for the web. You play a big part in this. This means
writing about it, and sharing code. We need to start building a bridge
between student journalism and professional newsrooms.</p>
- <figure id="7ed3" name="7ed3"><div>
+ <figure name="7ed3" id="7ed3">
+ <div>
- <p><img data-height="400" data-image-id="1*bXaR_NBJdoHpRc8lUWSsow.png" data-width="686" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*bXaR_NBJdoHpRc8lUWSsow.png"></img></p></div>
- <figcaption>2012</figcaption></figure><h3 id="ee1b" name="ee1b">This is a start</h3>
- <p id="ebf9" name="ebf9">We going to continue slowly growing the content on <a data-href="http://pippinlee.github.io/open-journalism-project/" href="http://pippinlee.github.io/open-journalism-project/" rel="nofollow">Open Journalism</a>. We still consider this the beta version,
+ <p><img data-image-id="1*bXaR_NBJdoHpRc8lUWSsow.png" data-width="686" data-height="400" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*bXaR_NBJdoHpRc8lUWSsow.png">
+ </p></div>
+ <figcaption>2012</figcaption>
+ </figure>
+ <h3 name="ee1b" id="ee1b">This is a start</h3>
+ <p name="ebf9" id="ebf9">We going to continue slowly growing the content on <a href="http://pippinlee.github.io/open-journalism-project/" data-href="http://pippinlee.github.io/open-journalism-project/" rel="nofollow">Open Journalism</a>. We still consider this the beta version,
but expect to polish it, and beef up the content for a real launch at the
beginning of the summer.</p>
- <p id="bd44" name="bd44">We expect to have more original tutorials as well as the beginnings of
+ <p name="bd44" id="bd44">We expect to have more original tutorials as well as the beginnings of
what a curriculum may look like that a student newsroom can adopt to start
guiding their transition to become a web first newsroom. We’re also going
- to be working with the <a data-href="http://queensjournal.ca/" href="http://queensjournal.ca/" rel="nofollow">Queen’s Journal</a> and
- <a data-href="http://ubyssey.ca/" href="http://ubyssey.ca/" rel="nofollow">The Ubyssey</a>next school year to better understand how to make the student
+ to be working with the <a href="http://queensjournal.ca/" data-href="http://queensjournal.ca/" rel="nofollow">Queen’s Journal</a> and
+ <a href="http://ubyssey.ca/" data-href="http://ubyssey.ca/" rel="nofollow">The Ubyssey</a>next school year to better understand how to make the student
newsroom a place for experimenting with telling stories on the web. If
this sound like a good idea in your newsroom, we’re still looking to add
1 more school.</p>
- <p id="abd5" name="abd5">We’re trying out some new shoes. And while they’re not self-lacing, and
+ <p name="abd5" id="abd5">We’re trying out some new shoes. And while they’re not self-lacing, and
smell a bit different, we feel lacing up a new pair of kicks can change
a lot.</p>
- <figure id="4c68" name="4c68"><div>
+ <figure name="4c68" id="4c68">
+ <div>
- <p><img data-action="zoom" data-action-value="1*lulfisQxgSQ209vPHMAifg.png" data-height="534" data-image-id="1*lulfisQxgSQ209vPHMAifg.png" data-width="950" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*lulfisQxgSQ209vPHMAifg.png"></img></p></div>
+ <p><img data-image-id="1*lulfisQxgSQ209vPHMAifg.png" data-width="950" data-height="534" data-action="zoom" data-action-value="1*lulfisQxgSQ209vPHMAifg.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*lulfisQxgSQ209vPHMAifg.png">
+ </p></div>
</figure>
- <p id="2c5c" name="2c5c"><strong>Let’s talk. Let’s listen.</strong>
+
+ <p name="2c5c" id="2c5c"><strong>Let’s talk. Let’s listen.</strong>
</p>
- <p id="63ec" name="63ec"><strong>We’re still in the early stages of what this project will look like, so if you want to help or have thoughts, let’s talk.</strong>
+ <p name="63ec" id="63ec"><strong>We’re still in the early stages of what this project will look like, so if you want to help or have thoughts, let’s talk.</strong>
</p>
- <p id="9376" name="9376"><a data-href="mailto:[email protected]" href="mailto:[email protected]" rel="nofollow"><strong>[email protected]</strong></a>
+ <p name="9376" id="9376"><a href="mailto:[email protected]" data-href="mailto:[email protected]" rel="nofollow"><strong>[email protected]</strong></a>
</p>
- <p id="ea00" name="ea00"><em>This isn’t supposed to be a </em>
+ <p name="ea00" id="ea00"><em>This isn’t supposed to be a </em>
<strong><em>manifesto™©</em>
</strong><em> we just think it’s pretty cool to share what we’ve learned so far, and hope you’ll do the same. We’re all in this together.</em>
</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html
index 222b09dbc..34eeab36f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-2/expected.html
@@ -1 +1 @@
-<section name="d9f8"><div><div><figure id="4924" name="4924"><div><p><img data-action="zoom" data-action-value="1*eR_J8DurqygbhrwDg-WPnQ.png" data-height="1280" data-image-id="1*eR_J8DurqygbhrwDg-WPnQ.png" data-width="1891" src="https://d262ilb51hltx0.cloudfront.net/max/1600/1*eR_J8DurqygbhrwDg-WPnQ.png"></img></p></div><figcaption>Words need defenders.</figcaption></figure><h3 id="b098" name="b098">On Behalf of “Literally”</h3><p id="1a73" name="1a73">You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.</p><p id="104a" name="104a">For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.</p><p id="c2c0" name="c2c0">Maybe I should define literally.</p><blockquote id="b239" name="b239">Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.</blockquote><p id="a8fd" name="a8fd">So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot <em>literally cry your eyes out</em>. The joke wasn’t so funny your eyes popped out of their sockets.</p><h4 id="165a" name="165a">When in Doubt, Leave it Out</h4><p id="e434" name="e434">“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.</p><p id="d88f" name="d88f">“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.</p><p id="4bab" name="4bab">“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.</p><h4 id="f2f0" name="f2f0">Insecurities?</h4><p id="1bd7" name="1bd7">Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. <em>No really, mom, I literally climbed the tree. </em>In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.</p><h4 id="d7c1" name="d7c1">Hard Habit to Break?</h4><p id="714b" name="714b">Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.</p><p id="f929" name="f929">This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.</p><p id="fd19" name="fd19">Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from <em>Alice in Wonderland</em> and I need to eat a mushroom to make my whole body smaller.</p><h4 id="fe12" name="fe12">No One’s Perfect</h4><p id="7ff8" name="7ff8">And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like <a data-href="http://bancomicsans.com/main/?page_id=2" href="http://bancomicsans.com/main/?page_id=2" rel="nofollow">Comic Sans</a> and <a data-href="https://www.facebook.com/group.php?gid=14448723154" href="https://www.facebook.com/group.php?gid=14448723154" rel="nofollow">Papyrus</a>), so should there be a coalition of people against the abuse of literally.</p><h4 id="049e" name="049e">Saying it to Irritate?</h4><p id="9381" name="9381">Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?</p><h4 id="3e52" name="3e52">Graphical Representation</h4><p id="b57e" name="b57e">Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike <a data-href="http://theoatmeal.com/comics/literally" href="http://theoatmeal.com/comics/literally" rel="nofollow">should check it out</a>. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.</p></div></div></section> \ No newline at end of file
+<div name="d9f8"><figure name="4924" id="4924"><div><p><img data-image-id="1*eR_J8DurqygbhrwDg-WPnQ.png" data-width="1891" data-height="1280" data-action="zoom" data-action-value="1*eR_J8DurqygbhrwDg-WPnQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/1600/1*eR_J8DurqygbhrwDg-WPnQ.png"></p></div><figcaption>Words need defenders.</figcaption></figure><h3 name="b098" id="b098">On Behalf of “Literally”</h3><p name="1a73" id="1a73">You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.</p><p name="104a" id="104a">For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.</p><p name="c2c0" id="c2c0">Maybe I should define literally.</p><blockquote name="b239" id="b239">Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.</blockquote><p name="a8fd" id="a8fd">So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot <em>literally cry your eyes out</em>. The joke wasn’t so funny your eyes popped out of their sockets.</p><h4 name="165a" id="165a">When in Doubt, Leave it Out</h4><p name="e434" id="e434">“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.</p><p name="d88f" id="d88f">“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.</p><p name="4bab" id="4bab">“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.</p><h4 name="f2f0" id="f2f0">Insecurities?</h4><p name="1bd7" id="1bd7">Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. <em>No really, mom, I literally climbed the tree. </em>In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.</p><h4 name="d7c1" id="d7c1">Hard Habit to Break?</h4><p name="714b" id="714b">Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.</p><p name="f929" id="f929">This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.</p><p name="fd19" id="fd19">Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from <em>Alice in Wonderland</em> and I need to eat a mushroom to make my whole body smaller.</p><h4 name="fe12" id="fe12">No One’s Perfect</h4><p name="7ff8" id="7ff8">And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like <a href="http://bancomicsans.com/main/?page_id=2" data-href="http://bancomicsans.com/main/?page_id=2" rel="nofollow">Comic Sans</a> and <a href="https://www.facebook.com/group.php?gid=14448723154" data-href="https://www.facebook.com/group.php?gid=14448723154" rel="nofollow">Papyrus</a>), so should there be a coalition of people against the abuse of literally.</p><h4 name="049e" id="049e">Saying it to Irritate?</h4><p name="9381" id="9381">Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?</p><h4 name="3e52" id="3e52">Graphical Representation</h4><p name="b57e" id="b57e">Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike <a href="http://theoatmeal.com/comics/literally" data-href="http://theoatmeal.com/comics/literally" rel="nofollow">should check it out</a>. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.</p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json
index 54ac86669..250efd7c8 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-images.json
@@ -1,3 +1,7 @@
[
- "https:\/\/cdn-images-1.medium.com\/max\/1200\/1*kbPh7V97eyRodSOw2-ALDw.png"
+ "https:\/\/miro.medium.com\/max\/398\/1*kbPh7V97eyRodSOw2-ALDw.png",
+ "https:\/\/miro.medium.com\/fit\/c\/96\/96\/0*qPHQu8WqsC6cV_ud.jpg",
+ "https:\/\/miro.medium.com\/max\/796\/1*kbPh7V97eyRodSOw2-ALDw.png",
+ "https:\/\/miro.medium.com\/max\/1388\/1*Fpb2Bvdx7Q-688vdm-NdkQ.png",
+ "https:\/\/miro.medium.com\/max\/616\/1*lvOySry5gHHJfGU_bQXrzA.png"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json
index 59ef2043d..cf74b9534 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected-metadata.json
@@ -1,8 +1,8 @@
{
"Author": "John C. Welch",
"Direction": null,
- "Excerpt": "How to get shanked doing what people say they want",
- "Image": "https:\/\/cdn-images-1.medium.com\/max\/1200\/1*kbPh7V97eyRodSOw2-ALDw.png",
- "Title": "Samantha and The Great Big Lie",
+ "Excerpt": "(EDIT: removed the link to Samantha\u2019s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a\u2026",
+ "Image": "https:\/\/miro.medium.com\/max\/398\/1*kbPh7V97eyRodSOw2-ALDw.png",
+ "Title": "Samantha and The Great Big Lie - John C. Welch - Medium",
"SiteName": "Medium"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html
index f1c311e75..0a32b38ba 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/expected.html
@@ -1,226 +1,688 @@
-<section name="55ff">
- <div>
+<div>
<div>
-
- <p id="97e7" name="97e7">How to get shanked doing what people say they want</p>
- <blockquote id="df70" name="df70">don’t preach to me<br></br>Mr. integrity</blockquote>
- <p id="c979" name="c979">(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)</p>
- <p id="342d" name="342d">First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.</p>
- <p id="2e61" name="2e61">Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.</p>
- <p id="cd31" name="cd31">…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our <em>specific</em> instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.</p>
- <p id="ae07" name="ae07">That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.</p>
- </div>
- </div>
- </section><section name="c360">
- <div>
- <div>
- <p id="a02f" name="a02f">Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:</p>
- <ol><li id="9213" name="9213">With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a <a data-href="http://www.marco.org/2015/10/09/overcast2" href="http://www.marco.org/2015/10/09/overcast2" rel="nofollow noopener" target="_blank">patronage model</a> that will probably be successful for him.</li>
- <li id="dfa5" name="dfa5">Arment’s insistence that “<a data-href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" target="_blank">anyone can do this</a>” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.</li>
- <li id="e55d" name="e55d">Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, <em>Marco</em>, not only don’t have, but have little chance of attaining anytime soon.</li>
- <li id="35fb" name="35fb">Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.</li>
- <li id="38e2" name="38e2">In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.</li>
- </ol><p id="0481" name="0481">None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.</p>
- <p id="5a45" name="5a45">So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.</p>
- <p id="3bc7" name="3bc7">If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.</p>
- </div>
- </div>
- </section><section name="2ba2">
- <div>
- <div>
- <p id="0fb2" name="0fb2">The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is <a data-href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" rel="nofollow noopener" target="_blank">enough to shut him down</a>, who <a data-href="https://twitter.com/marcoarment/status/641330113934700544" href="https://twitter.com/marcoarment/status/641330113934700544" rel="nofollow noopener" target="_blank">blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things</a>, is, in a single word, disgusting. Vomitous even.</p>
- <p id="9a6e" name="9a6e">It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in <a data-href="https://twitter.com/s_bielefeld/with_replies" href="https://twitter.com/s_bielefeld/with_replies" rel="nofollow noopener" target="_blank">Samantha’s Twitter Feed</a>. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):</p>
- <blockquote id="3271" name="3271">I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.</blockquote>
- <p id="ec72" name="ec72">Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is <em>such</em> a lie.</p>
- <p id="5cc4" name="5cc4">But it gets better. First, you have the “hey, Marco <em>earned</em> his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:</p>
- <blockquote id="4e5f" name="4e5f">From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.</blockquote>
- <p id="cee9" name="cee9">and here:</p>
- <blockquote id="3f1b" name="3f1b">I’m not knocking his success, he has put effort into his line of work, and has built his own life.</blockquote>
- <p id="e527" name="e527">and here:</p>
- <blockquote id="3e4f" name="3e4f">He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.</blockquote>
- <p id="8a01" name="8a01">But still, you get the people telling her something she already acknowledge:</p>
- <blockquote id="7685" name="7685">I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.</blockquote>
- <p id="b151" name="b151">Thank you for restating something in the article. To the person who wrote it.</p>
- <p id="87bc" name="87bc">In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers <a data-href="http://atp.fm/sponsor/" href="http://atp.fm/sponsor/" rel="nofollow noopener" target="_blank">provided by ATP in terms of sponsorship rates</a> and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.</p>
- <p id="dbda" name="dbda">At first, she went with a simple formula:</p>
- <blockquote id="1b4e" name="1b4e">$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.</blockquote>
- <p id="0b33" name="0b33">That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:</p>
- <blockquote id="76d7" name="76d7">That’s $4k per ad, no? So more like $12–16k per episode.</blockquote>
- <p id="a089" name="a089">She’d already realized her mistake and fixed it.</p>
- <blockquote id="b369" name="b369">which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.</blockquote>
- <p id="8b3b" name="8b3b">Again, this is based on <em>publicly available data</em> the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.</p>
- <p id="135a" name="135a">This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his <em>income taxes correctly</em>:</p>
- <blockquote id="5e7e" name="5e7e">especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.</blockquote>
- <blockquote id="6036" name="6036">thus, guessing net income is more haphazard than stating approx. gross income.</blockquote>
- <p id="aac1" name="aac1">Ye Gods. She’s not doing his taxes for him, her point is invalid?</p>
- <p id="600f" name="600f">Then there’s the people who seem to have not read anything past what other people are telling them:</p>
- <blockquote id="9b62" name="9b62">Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?</blockquote>
- <p id="c18a" name="c18a">Just how spoon-fed do you have to be? Have you no teeth?</p>
- <p id="c445" name="c445">Of course, Marco jumps in, and predictably, he’s snippy:</p>
- <blockquote id="0c21" name="0c21">If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.</blockquote>
- <p id="8f8d" name="8f8d">If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.</p>
- <p id="cc97" name="cc97">Then Marco’s friends/fans get into it:</p>
- <blockquote id="f9da" name="f9da">I really don’t understand why it’s anyone’s business</blockquote>
- <p id="0094" name="0094">Samantha is trying to qualify for sainthood at this point:</p>
- <blockquote id="0105" name="0105">It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.</blockquote>
- <p id="cdd1" name="cdd1">Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:</p>
- <blockquote id="f56c" name="f56c">Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.</blockquote>
- <p id="4fef" name="4fef">Wha?? Overcast 2 is absolutely free. Samantha points this out:</p>
- <blockquote id="0f36" name="0f36">His app is free, that’s what sparked the article to begin with.</blockquote>
- <p id="40d2" name="40d2">The response is literally a parallel to “How can there be global warming if it snowed today in my town?”</p>
- <blockquote id="6760" name="6760">If it’s free, how have I paid for it? Twice?</blockquote>
- <p id="7b13" name="7b13">She is still trying:</p>
- <blockquote id="44ba" name="44ba">You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0</blockquote>
- <p id="2152" name="2152">He is having none of it. IT SNOWED! SNOWWWWWWW!</p>
- <blockquote id="99a6" name="99a6">Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.</blockquote>
- <p id="5e6f" name="5e6f">She however, is relentless:</p>
- <blockquote id="1b0f" name="1b0f">No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.</blockquote>
- <p id="d24f" name="d24f">Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)</p>
- <p id="10e1" name="10e1">We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.</p>
- <blockquote id="9b01" name="9b01">It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.</blockquote>
- <p id="340c" name="340c">(UNDERSTATEMENT OF THE YEAR)</p>
- <blockquote id="7244" name="7244">I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.</blockquote>
- <blockquote id="ffb1" name="ffb1">It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.</blockquote>
- <p id="e44e" name="e44e">She tries, oh lord, she tries:</p>
- <blockquote id="a502" name="a502">To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.</blockquote>
- <p id="7dcd" name="7dcd">But no, HE KNOWS HER POINT BETTER THAN SHE DOES:</p>
- <blockquote id="a62a" name="a62a">No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.</blockquote>
- <p id="df8c" name="df8c">Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.</p>
- <p id="521a" name="521a">One guy tries to blame it all on Apple, another in a string of Wha??? moments:</p>
- <blockquote id="d80d" name="d80d">the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility</blockquote>
- <p id="db0b" name="db0b">Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:</p>
- <blockquote id="7a78" name="7a78">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <p id="6e09" name="6e09">Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.</p>
- <p id="b7db" name="b7db">One guy is “confused”:</p>
- <blockquote id="3626" name="3626">I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?</blockquote>
- <blockquote id="9daa" name="9daa">Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.</blockquote>
- <blockquote id="f6da" name="f6da">Alright, that’s fair. I was just confused by the $ and fame angle at first.</blockquote>
- <p id="d5b1" name="d5b1">Samantha’s point centers on the benefits Marco gains via his fame and background. <em>HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?</em></p>
- <p id="58d0" name="58d0">People of course are telling her it’s her fault for mentioning a salient fact at all:</p>
- <blockquote id="30d2" name="30d2">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <blockquote id="765b" name="765b">Maybe because you went there with your article?</blockquote>
- <blockquote id="61fe" name="61fe">As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.</blockquote>
- <p id="f17c" name="f17c">Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.</p>
- <p id="0b60" name="0b60">Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:</p>
- <blockquote id="65ab" name="65ab">Because you decided to start a conversation about someone else’s personal shit. You started this war.</blockquote>
- <p id="1adb" name="1adb">War. THIS. IS. WAR.</p>
- <p id="de94" name="de94">This is a bunch of nerds attacking someone for reasoned, calm, <em>polite</em> criticism of their friend/idol. Samantha is politely pushing back a bit:</p>
- <blockquote id="4458" name="4458">That doesn’t explain why every other part of my article is being pushed aside.</blockquote>
- <p id="aeac" name="aeac">She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.</p>
- <p id="0078" name="0078">Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:</p>
- <blockquote id="c4c9" name="c4c9">You should never use an ad rate card to estimate ad revenue from any media product ever.</blockquote>
- <blockquote id="b66b" name="b66b">I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars</blockquote>
- <p id="6907" name="6907">How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. <em>Checkmate Elitests!</em>”</p>
- <p id="41ec" name="41ec">Samantha basically abases herself at his feet:</p>
- <blockquote id="0b14" name="0b14">I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.</blockquote>
- <p id="590f" name="590f">I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.</p>
- <p id="69dc" name="69dc">Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.</p>
- <p id="5ab4" name="5ab4">Another App Dev, seemingly unable to parse Samantha’s words, needs <em>more</em> explanation:</p>
- <blockquote id="957b" name="957b">so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.</blockquote>
- <p id="0a7e" name="0a7e">Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice <em>with someone who didn’t even read her article</em>:</p>
- <blockquote id="f7db" name="f7db">That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.</blockquote>
- <p id="937f" name="937f">Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:</p>
- <blockquote id="c9dd" name="c9dd">How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.</blockquote>
- <p id="c522" name="c522">Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?</p>
- <blockquote id="907e" name="907e">Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?</blockquote>
- <p id="2158" name="2158">That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.</p>
- <p id="13f8" name="13f8">Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:</p>
- <blockquote id="96c6" name="96c6">Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!</blockquote>
- <p id="5d3f" name="5d3f">That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, <em>Apple</em>, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)</p>
- <p id="c07c" name="c07c">Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.</p>
- <p id="8b32" name="8b32">Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:</p>
- <blockquote id="de26" name="de26">Yup, before you existed!</blockquote>
- <p id="a3bd" name="a3bd">Really dude? I mean, I’m sorry about the penis, but really?</p>
- <p id="1c51" name="1c51">Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any <em>valid</em> criticism. Which clearly is impossible):</p>
- <blockquote id="9848" name="9848">Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.</blockquote>
- <blockquote id="f2a6" name="f2a6">lol. Noted.</blockquote>
- <blockquote id="aed9" name="aed9">And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …</blockquote>
- <blockquote id="f9d8" name="f9d8">… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.</blockquote>
- <blockquote id="f61c" name="f61c">haha. Thank you for the clarification.</blockquote>
- <p id="5dd9" name="5dd9">Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.</p>
- <p id="dc44" name="dc44">But now, the door has been cracked, and the cheap shots come out:</p>
- <blockquote id="0c94" name="0c94">@testflight_app: Don’t worry guys, we process <a data-href="https://twitter.com/marcoarment" href="https://twitter.com/marcoarment" rel="nofollow noopener" target="_blank">@marcoarment</a>’s apps in direct proportion to his megabucks earnings. <a data-href="https://twitter.com/hashtag/fairelephant?src=hash" href="https://twitter.com/hashtag/fairelephant?src=hash" rel="nofollow noopener" target="_blank">#fairelephant</a></blockquote>
- <p id="343b" name="343b">(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)</p>
- <p id="09bf" name="09bf">Or this…conversation:</p>
- <figure id="4d63" name="4d63"><div>
-
-
+ <p><a rel="noopener" href="http://fakehost/@johncwelch?source=post_page-----d146a92473a1----------------------"><img alt="John C. Welch" src="https://miro.medium.com/fit/c/96/96/0*qPHQu8WqsC6cV_ud.jpg" width="48" height="48"></a>
+ </p>
+
+ </div>
+ <p id="97e7">
+ How to get shanked doing what people say they want
+ </p>
+ <blockquote>
+ <p id="df70">
+ don’t preach to me<br>
+ Mr. integrity
+ </p>
+ </blockquote>
+ <p id="c979">
+ (EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)
+ </p>
+ <p id="342d">
+ First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.
+ </p>
+ <p id="2e61">
+ Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.
+ </p>
+ <p id="cd31">
+ …sorry, I should explain “The Great Big Lie”. There are several, but in this case, our <em>specific</em> instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.
+ </p>
+ <p id="ae07">
+ That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.
+ </p>
+ </div><div>
+ <p id="a02f">
+ Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:
+ </p>
+ <ol class>
+ <li id="9213">With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a <a href="http://www.marco.org/2015/10/09/overcast2" target="_blank" rel="noopener nofollow">patronage model</a> that will probably be successful for him.
+ </li>
+ <li id="dfa5">Arment’s insistence that “<a target="_blank" rel="noopener" href="http://fakehost/@marcoarment/pragmatic-app-pricing-a79fc07218f3">anyone can do this</a>” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.
+ </li>
+ <li id="e55d">Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, <em>Marco</em>, not only don’t have, but have little chance of attaining anytime soon.
+ </li>
+ <li id="35fb">Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.
+ </li>
+ <li id="38e2">In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.
+ </li>
+ </ol>
+ <p id="0481">
+ None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.
+ </p>
+ <p id="5a45">
+ So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.
+ </p>
+ <p id="3bc7">
+ If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.
+ </p>
+ </div><div>
+ <p id="0fb2">
+ The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is <a href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" target="_blank" rel="noopener nofollow">enough to shut him down</a>, who <a href="https://twitter.com/marcoarment/status/641330113934700544" target="_blank" rel="noopener nofollow">blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things</a>, is, in a single word, disgusting. Vomitous even.
+ </p>
+ <p id="9a6e">
+ It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in <a href="https://twitter.com/s_bielefeld/with_replies" target="_blank" rel="noopener nofollow">Samantha’s Twitter Feed</a>. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):
+ </p>
+ <blockquote>
+ <p id="3271">
+ I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.
+ </p>
+ </blockquote>
+ <p id="ec72">
+ Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is <em>such</em> a lie.
+ </p>
+ <p id="5cc4">
+ But it gets better. First, you have the “hey, Marco <em>earned</em> his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:
+ </p>
+ <blockquote>
+ <p id="4e5f">
+ From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.
+ </p>
+ </blockquote>
+ <p id="cee9">
+ and here:
+ </p>
+ <blockquote>
+ <p id="3f1b">
+ I’m not knocking his success, he has put effort into his line of work, and has built his own life.
+ </p>
+ </blockquote>
+ <p id="e527">
+ and here:
+ </p>
+ <blockquote>
+ <p id="3e4f">
+ He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.
+ </p>
+ </blockquote>
+ <p id="8a01">
+ But still, you get the people telling her something she already acknowledge:
+ </p>
+ <blockquote>
+ <p id="7685">
+ I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.
+ </p>
+ </blockquote>
+ <p id="b151">
+ Thank you for restating something in the article. To the person who wrote it.
+ </p>
+ <p id="87bc">
+ In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers <a href="http://atp.fm/sponsor/" target="_blank" rel="noopener nofollow">provided by ATP in terms of sponsorship rates</a> and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.
+ </p>
+ <p id="dbda">
+ At first, she went with a simple formula:
+ </p>
+ <blockquote>
+ <p id="1b4e">
+ $4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.
+ </p>
+ </blockquote>
+ <p id="0b33">
+ That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:
+ </p>
+ <blockquote>
+ <p id="76d7">
+ That’s $4k per ad, no? So more like $12–16k per episode.
+ </p>
+ </blockquote>
+ <p id="a089">
+ She’d already realized her mistake and fixed it.
+ </p>
+ <blockquote>
+ <p id="b369">
+ which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.
+ </p>
+ </blockquote>
+ <p id="8b3b">
+ Again, this is based on <em>publicly available data</em> the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.
+ </p>
+ <p id="135a">
+ This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his <em>income taxes correctly</em>:
+ </p>
+ <blockquote>
+ <p id="5e7e">
+ especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.
+ </p>
+ <p id="6036">
+ thus, guessing net income is more haphazard than stating approx. gross income.
+ </p>
+ </blockquote>
+ <p id="aac1">
+ Ye Gods. She’s not doing his taxes for him, her point is invalid?
+ </p>
+ <p id="600f">
+ Then there’s the people who seem to have not read anything past what other people are telling them:
+ </p>
+ <blockquote>
+ <p id="9b62">
+ Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?
+ </p>
+ </blockquote>
+ <p id="c18a">
+ Just how spoon-fed do you have to be? Have you no teeth?
+ </p>
+ <p id="c445">
+ Of course, Marco jumps in, and predictably, he’s snippy:
+ </p>
+ <blockquote>
+ <p id="0c21">
+ If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.
+ </p>
+ </blockquote>
+ <p id="8f8d">
+ If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.
+ </p>
+ <p id="cc97">
+ Then Marco’s friends/fans get into it:
+ </p>
+ <blockquote>
+ <p id="f9da">
+ I really don’t understand why it’s anyone’s business
+ </p>
+ </blockquote>
+ <p id="0094">
+ Samantha is trying to qualify for sainthood at this point:
+ </p>
+ <blockquote>
+ <p id="0105">
+ It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.
+ </p>
+ </blockquote>
+ <p id="cdd1">
+ Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:
+ </p>
+ <blockquote>
+ <p id="f56c">
+ Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.
+ </p>
+ </blockquote>
+ <p id="4fef">
+ Wha?? Overcast 2 is absolutely free. Samantha points this out:
+ </p>
+ <blockquote>
+ <p id="0f36">
+ His app is free, that’s what sparked the article to begin with.
+ </p>
+ </blockquote>
+ <p id="40d2">
+ The response is literally a parallel to “How can there be global warming if it snowed today in my town?”
+ </p>
+ <blockquote>
+ <p id="6760">
+ If it’s free, how have I paid for it? Twice?
+ </p>
+ </blockquote>
+ <p id="7b13">
+ She is still trying:
+ </p>
+ <blockquote>
+ <p id="44ba">
+ You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0
+ </p>
+ </blockquote>
+ <p id="2152">
+ He is having none of it. IT SNOWED! SNOWWWWWWW!
+ </p>
+ <blockquote>
+ <p id="99a6">
+ Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.
+ </p>
+ </blockquote>
+ <p id="5e6f">
+ She however, is relentless:
+ </p>
+ <blockquote>
+ <p id="1b0f">
+ No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.
+ </p>
+ </blockquote>
+ <p id="d24f">
+ Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)
+ </p>
+ <p id="10e1">
+ We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.
+ </p>
+ <blockquote>
+ <p id="9b01">
+ It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.
+ </p>
+ </blockquote>
+ <p id="340c">
+ (UNDERSTATEMENT OF THE YEAR)
+ </p>
+ <blockquote>
+ <p id="7244">
+ I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.
+ </p>
+ <p id="ffb1">
+ It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.
+ </p>
+ </blockquote>
+ <p id="e44e">
+ She tries, oh lord, she tries:
+ </p>
+ <blockquote>
+ <p id="a502">
+ To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.
+ </p>
+ </blockquote>
+ <p id="7dcd">
+ But no, HE KNOWS HER POINT BETTER THAN SHE DOES:
+ </p>
+ <blockquote>
+ <p id="a62a">
+ No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.
+ </p>
+ </blockquote>
+ <p id="df8c">
+ Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.
+ </p>
+ <p id="521a">
+ One guy tries to blame it all on Apple, another in a string of Wha??? moments:
+ </p>
+ <blockquote>
+ <p id="d80d">
+ the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility
+ </p>
+ </blockquote>
+ <p id="db0b">
+ Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:
+ </p>
+ <blockquote>
+ <p id="7a78">
+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
+ </p>
+ </blockquote>
+ <p id="6e09">
+ Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.
+ </p>
+ <p id="b7db">
+ One guy is “confused”:
+ </p>
+ <blockquote>
+ <p id="3626">
+ I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?
+ </p>
+ <p id="9daa">
+ Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.
+ </p>
+ <p id="f6da">
+ Alright, that’s fair. I was just confused by the $ and fame angle at first.
+ </p>
+ </blockquote>
+ <p id="d5b1">
+ Samantha’s point centers on the benefits Marco gains via his fame and background. <em>HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?</em>
+ </p>
+ <p id="58d0">
+ People of course are telling her it’s her fault for mentioning a salient fact at all:
+ </p>
+ <blockquote>
+ <p id="30d2">
+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
+ </p>
+ <p id="765b">
+ Maybe because you went there with your article?
+ </p>
+ <p id="61fe">
+ As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.
+ </p>
+ </blockquote>
+ <p id="f17c">
+ Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.
+ </p>
+ <p id="0b60">
+ Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:
+ </p>
+ <blockquote>
+ <p id="65ab">
+ Because you decided to start a conversation about someone else’s personal shit. You started this war.
+ </p>
+ </blockquote>
+ <p id="1adb">
+ War. THIS. IS. WAR.
+ </p>
+ <p id="de94">
+ This is a bunch of nerds attacking someone for reasoned, calm, <em>polite</em> criticism of their friend/idol. Samantha is politely pushing back a bit:
+ </p>
+ <blockquote>
+ <p id="4458">
+ That doesn’t explain why every other part of my article is being pushed aside.
+ </p>
+ </blockquote>
+ <p id="aeac">
+ She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.
+ </p>
+ <p id="0078">
+ Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:
+ </p>
+ <blockquote>
+ <p id="c4c9">
+ You should never use an ad rate card to estimate ad revenue from any media product ever.
+ </p>
+ <p id="b66b">
+ I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars
+ </p>
+ </blockquote>
+ <p id="6907">
+ How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. <em>Checkmate Elitests!</em>”
+ </p>
+ <p id="41ec">
+ Samantha basically abases herself at his feet:
+ </p>
+ <blockquote>
+ <p id="0b14">
+ I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.
+ </p>
+ </blockquote>
+ <p id="590f">
+ I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.
+ </p>
+ <p id="69dc">
+ Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.
+ </p>
+ <p id="5ab4">
+ Another App Dev, seemingly unable to parse Samantha’s words, needs <em>more</em> explanation:
+ </p>
+ <blockquote>
+ <p id="957b">
+ so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.
+ </p>
+ </blockquote>
+ <p id="0a7e">
+ Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice <em>with someone who didn’t even read her article</em>:
+ </p>
+ <blockquote>
+ <p id="f7db">
+ That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.
+ </p>
+ </blockquote>
+ <p id="937f">
+ Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:
+ </p>
+ <blockquote>
+ <p id="c9dd">
+ How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.
+ </p>
+ </blockquote>
+ <p id="c522">
+ Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?
+ </p>
+ <blockquote>
+ <p id="907e">
+ Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?
+ </p>
+ </blockquote>
+ <p id="2158">
+ That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.
+ </p>
+ <p id="13f8">
+ Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:
+ </p>
+ <blockquote>
+ <p id="96c6">
+ Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!
+ </p>
+ </blockquote>
+ <p id="5d3f">
+ That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, <em>Apple</em>, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)
+ </p>
+ <p id="c07c">
+ Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.
+ </p>
+ <p id="8b32">
+ Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:
+ </p>
+ <blockquote>
+ <p id="de26">
+ Yup, before you existed!
+ </p>
+ </blockquote>
+ <p id="a3bd">
+ Really dude? I mean, I’m sorry about the penis, but really?
+ </p>
+ <p id="1c51">
+ Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any <em>valid</em> criticism. Which clearly is impossible):
+ </p>
+ <blockquote>
+ <p id="9848">
+ Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.
+ </p>
+ <p id="f2a6">
+ lol. Noted.
+ </p>
+ <p id="aed9">
+ And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …
+ </p>
+ <p id="f9d8">
+ … gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.
+ </p>
+ <p id="f61c">
+ haha. Thank you for the clarification.
+ </p>
+ </blockquote>
+ <p id="5dd9">
+ Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.
+ </p>
+ <p id="dc44">
+ But now, the door has been cracked, and the cheap shots come out:
+ </p>
+ <blockquote>
+ <p id="0c94">
+ @testflight_app: Don’t worry guys, we process <a href="https://twitter.com/marcoarment" target="_blank" rel="noopener nofollow">@marcoarment</a>’s apps in direct proportion to his megabucks earnings. <a href="https://twitter.com/hashtag/fairelephant?src=hash" target="_blank" rel="noopener nofollow">#fairelephant</a>
+ </p>
+ </blockquote>
+ <p id="343b">
+ (Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)
+ </p>
+ <p id="09bf">
+ Or this…conversation:
+ </p>
+ <figure>
+ <div>
+ <p><img alt="Image for post" src="https://miro.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png" width="398" height="542" srcset="https://miro.medium.com/max/552/1*kbPh7V97eyRodSOw2-ALDw.png 276w, https://miro.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png 398w" sizes="398px" data-old-src="https://miro.medium.com/max/44/1*kbPh7V97eyRodSOw2-ALDw.png?q=20">
+ </p>
</div>
- </figure><p id="f2a3" name="f2a3">Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: <a data-href="https://twitter.com/viticci" href="https://twitter.com/viticci" rel="nofollow noopener" target="_blank">‏@viticci</a>: <a data-href="https://twitter.com/s_bielefeld" href="https://twitter.com/s_bielefeld" rel="nofollow noopener" target="_blank">@s_bielefeld</a> I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.</p>
- <p id="ae0c" name="ae0c">Samantha is clearly sick of his crap: <a data-href="https://twitter.com/s_bielefeld" href="https://twitter.com/s_bielefeld" rel="nofollow noopener" target="_blank">‏@s_bielefeld</a>: <a data-href="https://twitter.com/viticci" href="https://twitter.com/viticci" rel="nofollow noopener" target="_blank">@viticci</a> That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.</p>
- <p id="2047" name="2047">Good for her. There’s being patient and being roadkill.</p>
- <p id="4139" name="4139">Samantha does put the call out for her sources to maybe let her use their names:</p>
- <blockquote id="6626" name="6626">From all of you I heard from earlier, anyone care to go on record?</blockquote>
- <p id="8a7d" name="8a7d">My good friend, The Angry Drunk points out the obvious problem:</p>
- <blockquote id="68c9" name="68c9">Nobody’s going to go on record when they count on Marco’s friends for their PR.</blockquote>
- <p id="317d" name="317d">This is true. Again, the sites that are Friends of Marco:</p>
- <p id="9523" name="9523">Daring Fireball</p>
- <p id="dbc7" name="dbc7">The Loop</p>
- <p id="c706" name="c706">SixColors</p>
- <p id="0acb" name="0acb">iMore</p>
- <p id="8c8c" name="8c8c">MacStories</p>
- <p id="643e" name="643e">A few others, but I want this post to end one day.</p>
- <p id="6b76" name="6b76">You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.</p>
- <p id="f7d1" name="f7d1">Of course, the idea this could happen is just craycray:</p>
- <blockquote id="de59" name="de59"><a data-href="https://twitter.com/KevinColeman" href="https://twitter.com/KevinColeman" rel="nofollow noopener" target="_blank">@KevinColeman </a><a data-href="https://twitter.com/Angry_Drunk" href="https://twitter.com/Angry_Drunk" rel="nofollow noopener" target="_blank">.@Angry_Drunk</a> <a data-href="https://twitter.com/s_bielefeld" href="https://twitter.com/s_bielefeld" rel="nofollow noopener" target="_blank">@s_bielefeld</a> <a data-href="https://twitter.com/marcoarment" href="https://twitter.com/marcoarment" rel="nofollow noopener" target="_blank">@marcoarment</a> Wow, you guys are veering right into crazy conspiracy theory territory. <a data-href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" rel="nofollow noopener" target="_blank">#JetFuelCantMeltSteelBeams</a></blockquote>
- <p id="f01b" name="f01b">Yeah. Because a mature person like Marco would never do anything like that.</p>
- <p id="7e30" name="7e30">Of course, the real point on this is starting to happen:</p>
- <blockquote id="5d93" name="5d93">you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!</blockquote>
- <blockquote id="436b" name="436b">I doubt I will.</blockquote>
- <p id="ac25" name="ac25">See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. <em>Great</em> job y’all.</p>
- <p id="07ba" name="07ba">Some people aren’t even pretending. They’re just in full strawman mode:</p>
- <blockquote id="3d60" name="3d60"><a data-href="https://twitter.com/timkeller" href="https://twitter.com/timkeller" rel="nofollow noopener" target="_blank">@timkeller: </a>Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.</blockquote>
- <blockquote id="87f5" name="87f5"><a data-href="https://twitter.com/s_bielefeld" href="https://twitter.com/s_bielefeld" rel="nofollow noopener" target="_blank">@s_bielefeld: </a><a data-href="https://twitter.com/timkeller" href="https://twitter.com/timkeller" rel="nofollow noopener" target="_blank">@timkeller</a> I plainly stated that I don’t hold his doing this against him. Way to twist words.</blockquote>
- <p id="3720" name="3720">I think she’s earned her anger at this point.</p>
- <p id="7341" name="7341">Don’t worry, Marco knows what the real problem is: most devs just suck —</p>
- <figure id="babe" name="babe"><div>
-
-
+ </figure>
+ <p id="f2a3">
+ Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: <a href="https://twitter.com/viticci" target="_blank" rel="noopener nofollow">‏@viticci</a>: <a href="https://twitter.com/s_bielefeld" target="_blank" rel="noopener nofollow">@s_bielefeld</a> I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.
+ </p>
+ <p id="ae0c">
+ Samantha is clearly sick of his crap: <a href="https://twitter.com/s_bielefeld" target="_blank" rel="noopener nofollow">‏@s_bielefeld</a>: <a href="https://twitter.com/viticci" target="_blank" rel="noopener nofollow">@viticci</a> That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.
+ </p>
+ <p id="2047">
+ Good for her. There’s being patient and being roadkill.
+ </p>
+ <p id="4139">
+ Samantha does put the call out for her sources to maybe let her use their names:
+ </p>
+ <blockquote>
+ <p id="6626">
+ From all of you I heard from earlier, anyone care to go on record?
+ </p>
+ </blockquote>
+ <p id="8a7d">
+ My good friend, The Angry Drunk points out the obvious problem:
+ </p>
+ <blockquote>
+ <p id="68c9">
+ Nobody’s going to go on record when they count on Marco’s friends for their PR.
+ </p>
+ </blockquote>
+ <p id="317d">
+ This is true. Again, the sites that are Friends of Marco:
+ </p>
+ <p id="9523">
+ Daring Fireball
+ </p>
+ <p id="dbc7">
+ The Loop
+ </p>
+ <p id="c706">
+ SixColors
+ </p>
+ <p id="0acb">
+ iMore
+ </p>
+ <p id="8c8c">
+ MacStories
+ </p>
+ <p id="643e">
+ A few others, but I want this post to end one day.
+ </p>
+ <p id="6b76">
+ You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.
+ </p>
+ <p id="f7d1">
+ Of course, the idea this could happen is just craycray:
+ </p>
+ <blockquote>
+ <p id="de59">
+ <a href="https://twitter.com/KevinColeman" target="_blank" rel="noopener nofollow">@KevinColeman</a> <a href="https://twitter.com/Angry_Drunk" target="_blank" rel="noopener nofollow">.@Angry_Drunk</a> <a href="https://twitter.com/s_bielefeld" target="_blank" rel="noopener nofollow">@s_bielefeld</a> <a href="https://twitter.com/marcoarment" target="_blank" rel="noopener nofollow">@marcoarment</a> Wow, you guys are veering right into crazy conspiracy theory territory. <a href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" target="_blank" rel="noopener nofollow">#JetFuelCantMeltSteelBeams</a>
+ </p>
+ </blockquote>
+ <p id="f01b">
+ Yeah. Because a mature person like Marco would never do anything like that.
+ </p>
+ <p id="7e30">
+ Of course, the real point on this is starting to happen:
+ </p>
+ <blockquote>
+ <p id="5d93">
+ you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!
+ </p>
+ <p id="436b">
+ I doubt I will.
+ </p>
+ </blockquote>
+ <p id="ac25">
+ See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. <em>Great</em> job y’all.
+ </p>
+ <p id="07ba">
+ Some people aren’t even pretending. They’re just in full strawman mode:
+ </p>
+ <blockquote>
+ <p id="3d60">
+ <a href="https://twitter.com/timkeller" target="_blank" rel="noopener nofollow">@timkeller:</a> Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.
+ </p>
+ <p id="87f5">
+ <a href="https://twitter.com/s_bielefeld" target="_blank" rel="noopener nofollow">@s_bielefeld:</a> <a href="https://twitter.com/timkeller" target="_blank" rel="noopener nofollow">@timkeller</a> I plainly stated that I don’t hold his doing this against him. Way to twist words.
+ </p>
+ </blockquote>
+ <p id="3720">
+ I think she’s earned her anger at this point.
+ </p>
+ <p id="7341">
+ Don’t worry, Marco knows what the real problem is: most devs just suck —
+ </p>
+ <figure>
+ <div>
+ <p><img alt="Image for post" src="https://miro.medium.com/max/1388/1*Fpb2Bvdx7Q-688vdm-NdkQ.png" width="694" height="771" srcset="https://miro.medium.com/max/552/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 276w, https://miro.medium.com/max/1104/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 552w, https://miro.medium.com/max/1280/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 640w, https://miro.medium.com/max/1388/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 694w" sizes="694px" data-old-src="https://miro.medium.com/max/54/1*Fpb2Bvdx7Q-688vdm-NdkQ.png?q=20">
+ </p>
</div>
- </figure><p id="503d" name="503d">I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)</p>
- <p id="b8c0" name="b8c0">There are some bright spots. My favorite is when Building Twenty points out the <em>real</em> elephant in the room:</p>
- <blockquote id="36f4" name="36f4"><a data-href="https://twitter.com/BuildingTwenty" href="https://twitter.com/BuildingTwenty" rel="nofollow noopener" target="_blank">@BuildingTwenty</a>: Both <a data-href="https://twitter.com/s_bielefeld" href="https://twitter.com/s_bielefeld" rel="nofollow noopener" target="_blank">@s_bielefeld</a> &amp; I wrote similar critiques of <a data-href="https://twitter.com/marcoarment" href="https://twitter.com/marcoarment" rel="nofollow noopener" target="_blank">@marcoarment</a>’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?</blockquote>
- <p id="06b9" name="06b9">Yup.</p>
- <p id="eff9" name="eff9">Another bright spot are these comments from Ian Betteridge, who has been doing this <em>even longer than Marco</em>:</p>
- <blockquote id="18f1" name="18f1">You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.</blockquote>
- <blockquote id="9776" name="9776">I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.</blockquote>
- <p id="8d44" name="8d44">To which Samantha understandably replies:</p>
- <blockquote id="7147" name="7147">and it’s honestly something I’m contemplating right now, whether to continue…</blockquote>
- <p id="e0cd" name="e0cd">Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?</p>
- <blockquote id="a379" name="a379">If I have this right, some people are outraged that a creator has decided to give away his work.</blockquote>
- <p id="f026" name="f026">No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.</p>
- <p id="e1c2" name="e1c2">Noted Feminist Glenn Fleishman gets a piece of the action too:</p>
- <figure id="067c" name="067c"><div>
-
-
+ </figure>
+ <p id="503d">
+ I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)
+ </p>
+ <p id="b8c0">
+ There are some bright spots. My favorite is when Building Twenty points out the <em>real</em> elephant in the room:
+ </p>
+ <blockquote>
+ <p id="36f4">
+ <a href="https://twitter.com/BuildingTwenty" target="_blank" rel="noopener nofollow">@BuildingTwenty</a>: Both <a href="https://twitter.com/s_bielefeld" target="_blank" rel="noopener nofollow">@s_bielefeld</a> &amp; I wrote similar critiques of <a href="https://twitter.com/marcoarment" target="_blank" rel="noopener nofollow">@marcoarment</a>’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?
+ </p>
+ </blockquote>
+ <p id="06b9">
+ Yup.
+ </p>
+ <p id="eff9">
+ Another bright spot are these comments from Ian Betteridge, who has been doing this <em>even longer than Marco</em>:
+ </p>
+ <blockquote>
+ <p id="18f1">
+ You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.
+ </p>
+ <p id="9776">
+ I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.
+ </p>
+ </blockquote>
+ <p id="8d44">
+ To which Samantha understandably replies:
+ </p>
+ <blockquote>
+ <p id="7147">
+ and it’s honestly something I’m contemplating right now, whether to continue…
+ </p>
+ </blockquote>
+ <p id="e0cd">
+ Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?
+ </p>
+ <blockquote>
+ <p id="a379">
+ If I have this right, some people are outraged that a creator has decided to give away his work.
+ </p>
+ </blockquote>
+ <p id="f026">
+ No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.
+ </p>
+ <p id="e1c2">
+ Noted Feminist Glenn Fleishman gets a piece of the action too:
+ </p>
+ <figure>
+ <div>
+ <p><img alt="Image for post" src="https://miro.medium.com/max/616/1*lvOySry5gHHJfGU_bQXrzA.png" width="308" height="269" srcset="https://miro.medium.com/max/552/1*lvOySry5gHHJfGU_bQXrzA.png 276w, https://miro.medium.com/max/616/1*lvOySry5gHHJfGU_bQXrzA.png 308w" sizes="308px" data-old-src="https://miro.medium.com/max/60/1*lvOySry5gHHJfGU_bQXrzA.png?q=20">
+ </p>
</div>
- </figure><p id="4df8" name="4df8">I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a <em>very</em> technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.</p>
- <p id="bf45" name="bf45">Great Feminists are often tools.</p>
- </div>
- </div>
- </section><section name="c883">
- <div>
- <div>
- <p id="45bb" name="45bb">Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):</p>
- <blockquote id="c053" name="c053">I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t</blockquote>
- <blockquote id="7b5e" name="7b5e">This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.</blockquote>
- <blockquote id="a321" name="a321">Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility <a data-href="http://t.co/u79ZLsnhdM" href="http://t.co/u79ZLsnhdM" rel="nofollow noopener" target="_blank" title="http://samanthabielefeld.com/the-elephant-in-the-room">http://samanthabielefeld.com/the-elephant-in-the-room …</a></blockquote>
- <blockquote id="76fe" name="76fe">thank you for posting this, it covers a lot of things people don’t like to talk about.</blockquote>
- <blockquote id="bf90" name="bf90">I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.</blockquote>
- <blockquote id="0f66" name="0f66">Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)</blockquote>
- </div>
- </div>
- </section><section name="8ab2">
- <div>
- <div>
- <p id="6134" name="6134">I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: <a data-href="http://www.businessinsider.com/marco-arment-2011-9" href="http://www.businessinsider.com/marco-arment-2011-9" rel="nofollow noopener" target="_blank">http://www.businessinsider.com/marco-arment-2011-9</a></p>
- <p id="ba3c" name="ba3c">Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.</p>
- <p id="a5a0" name="a5a0">Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.</p>
- <p id="2a25" name="2a25">And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.</p>
- <p id="a47a" name="a47a">Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, <em>believe me</em> I understand. As bad as today was for her, I’ve seen worse. Much worse.</p>
- <p id="aa8e" name="aa8e">But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.</p>
- <p id="34c5" name="34c5">All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.</p>
- <p id="9710" name="9710">So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.</p>
- </div>
- </div>
- </section> \ No newline at end of file
+ </figure>
+ <p id="4df8">
+ I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a <em>very</em> technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.
+ </p>
+ <p id="bf45">
+ Great Feminists are often tools.
+ </p>
+ </div><div>
+ <p id="45bb">
+ Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):
+ </p>
+ <blockquote>
+ <p id="c053">
+ I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t
+ </p>
+ <p id="7b5e">
+ This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.
+ </p>
+ <p id="a321">
+ Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility <a href="http://t.co/u79ZLsnhdM" target="_blank" rel="noopener nofollow">http://samanthabielefeld.com/the-elephant-in-the-room …</a>
+ </p>
+ <p id="76fe">
+ thank you for posting this, it covers a lot of things people don’t like to talk about.
+ </p>
+ <p id="bf90">
+ I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.
+ </p>
+ <p id="0f66">
+ Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)
+ </p>
+ </blockquote>
+ </div><div>
+ <p id="6134">
+ I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: <a href="http://www.businessinsider.com/marco-arment-2011-9" target="_blank" rel="noopener nofollow">http://www.businessinsider.com/marco-arment-2011-9</a>
+ </p>
+ <p id="ba3c">
+ Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.
+ </p>
+ <p id="a5a0">
+ Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.
+ </p>
+ <p id="2a25">
+ And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.
+ </p>
+ <p id="a47a">
+ Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, <em>believe me</em> I understand. As bad as today was for her, I’ve seen worse. Much worse.
+ </p>
+ <p id="aa8e">
+ But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.
+ </p>
+ <p id="34c5">
+ All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.
+ </p>
+ <p id="9710">
+ So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html
index 37c246419..1bd8d82f5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/medium-3/source.html
@@ -1,4815 +1,1645 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://creativecommons.org/ns#">
-
-<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>Samantha and The Great Big Lie – John C. Welch – Medium</title>
- <link rel="canonical" href="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
- <meta name="title" content="Samantha and The Great Big Lie" />
- <meta name="referrer" content="always" />
- <meta name="description" content="(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a…" />
- <meta property="og:title" content="Samantha and The Great Big Lie" />
- <meta property="og:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
- <meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*kbPh7V97eyRodSOw2-ALDw.png" />
- <meta property="fb:app_id" content="542599432471018" />
- <meta property="og:description" content="How to get shanked doing what people say they want" />
- <meta name="twitter:description" content="How to get shanked doing what people say they want" />
- <meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*kbPh7V97eyRodSOw2-ALDw.png" />
- <link rel="publisher" href="https://plus.google.com/103654360130207659246" />
- <link rel="author" href="https://medium.com/@johncwelch" />
- <meta name="author" content="John C. Welch" />
- <meta property="og:type" content="article" />
- <meta name="twitter:card" content="summary_large_image" />
- <meta property="article:publisher" content="https://www.facebook.com/medium" />
- <meta property="article:author" content="https://medium.com/@johncwelch" />
- <meta property="fb:smart_publish:robots" content="noauto" />
- <meta name="robots" content="index, follow" />
- <meta property="article:published_time" content="2015-10-15T02:19:15.607Z" />
- <meta name="twitter:site" content="@Medium" />
- <meta property="og:site_name" content="Medium" />
- <meta name="twitter:label1" value="Reading time" />
- <meta name="twitter:data1" value="18 min read" />
- <script type="application/ld+json">
- {
- "@context": "http://schema.org",
- "@type": "NewsArticle",
- "image": {
- "@type": "ImageObject",
- "width": 398,
- "height": 542,
- "url": "https://cdn-images-1.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png"
- },
- "datePublished": "2015-10-15T02:19:15.607Z",
- "dateModified": "2015-12-11T14:28:34.438Z",
- "headline": "Samantha and The Great Big Lie",
- "name": "Samantha and The Great Big Lie",
- "keywords": [],
- "author": {
- "@type": "Person",
- "name": "John C. Welch",
- "url": "https://medium.com/@johncwelch"
- },
- "creator": ["John C. Welch"],
- "mainEntityOfPage": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1"
- }
- </script>
- <meta name="twitter:app:name:iphone" content="Medium" />
- <meta name="twitter:app:id:iphone" content="828256236" />
- <meta name="twitter:app:url:iphone" content="medium://p/d146a92473a1" />
- <meta property="al:ios:app_name" content="Medium" />
- <meta property="al:ios:app_store_id" content="828256236" />
- <meta property="al:android:package" content="com.medium.reader" />
- <meta property="al:android:app_name" content="Medium" />
- <meta property="al:ios:url" content="medium://p/d146a92473a1" />
- <meta property="al:android:url" content="medium://p/d146a92473a1" />
- <meta property="al:web:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
- <link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
- <link rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/d146a92473a1" />
- <meta name="theme-color" content="#000000" />
- <link rel="stylesheet" type="text/css" href="https://cdn-static-1.medium.com/_/fp/css/fonts-latin-base.141WxxXgxGxNcfeza73H7Q.css" />
- <link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-base.FCIkh6GVUOig4-7oFthH1Q.css" />
- <script>
- if (window.top !== window.self) window.top.location = window.self.location.href;
- var OB_startTime = new Date().getTime();
- var OB_loadErrors = [];
-
- function _onerror(e) {
- OB_loadErrors.push(e)
- };
- if (document.addEventListener) document.addEventListener("error", _onerror, true);
- else if (document.attachEvent) document.attachEvent("onerror", _onerror);
-
- function _asyncScript(u) {
- var d = document,
- f = d.getElementsByTagName("script")[0],
- s = d.createElement("script");
- s.type = "text/javascript";
- s.async = true;
- s.src = u;
- f.parentNode.insertBefore(s, f);
- }
-
- function _asyncStyles(u) {
- var d = document,
- f = d.getElementsByTagName("script")[0],
- s = d.createElement("link");
- s.rel = "stylesheet";
- s.href = u;
- f.parentNode.insertBefore(s, f);
- return s
- }
- var _gaq = _gaq || [];
- _gaq.push(["_setAccount", "UA-24232453-2"]);
- _gaq.push(["_setDomainName", window.location.hostname]);
- _gaq.push(["_setAllowLinker", true]);
- _gaq.push(["_trackPageview"]);
- _asyncScript(("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js");
- (new Image()).src = "/_/stat?event=pixel.load&amp;origin=" + encodeURIComponent(location.origin);
- </script>
- <!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js"></script><![endif]-->
- <link rel="icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico" class="js-favicon" />
- <link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon.KjTfUJo7yJH_fCoUzzH3cg.svg" color="#171717" />
-</head>
-
-<body itemscope="" class=" postShowScreen browser-firefox os-mac is-withMagicUnderlines is-noJs">
- <script>
- document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")
- </script>
- <div class="site-main" id="container">
- <div class="butterBar butterBar--error"></div>
- <div class="surface">
- <div id="prerendered" class="screenContent"><canvas class="canvas-renderer"></canvas>
- <div class="container u-maxWidth740 u-xs-margin0 notesPositionContainer js-notesPositionContainer"></div>
- <div class="metabar u-clearfix js-metabar">
- <div class="metabar-inner u-marginAuto u-maxWidth1000 u-paddingLeft20 u-paddingRight20 js-metabarMiddle">
- <div class="metabar-block metabar-block--left u-floatLeft u-height65 u-xs-height56"><a href="https://medium.com/" class="siteNav-logo" data-log-event="home"><span class="svgIcon svgIcon--logoNew svgIcon--45px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="45" height="45" viewBox="-17 18 45 45" data-multipart="true"><path d="M11.525 28.078c-.472-.225-.858.002-.858.506v20.044l8.616 4.113c.948.46 1.717.14 1.717-.7v-19.3a.22.22 0 0 0-.124-.19l-9.35-4.46v-.01z"/><path d="M.333 43.696l9.83-15.247c.278-.43.89-.6 1.36-.38l9.364 4.47c.06.03.082.1.047.15L10.666 48.63.333 43.698v-.002z"/><path d="M-8.57 28.35c-.786-.375-1.053-.096-.592.62L.333 43.696l10.333 4.932L.356 32.635a.156.156 0 0 0-.06-.054l-8.866-4.23z"/><path d="M.333 52.033c0 .84-.643 1.22-1.43.844l-8.045-3.84c-.472-.224-.858-.82-.858-1.325V28.89c0-.672.515-.976 1.145-.675l9.133 4.36a.092.092 0 0 1 .055.084v19.37z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div>
- <div class="metabar-block u-floatRight u-xs-absolute u-xs-textAlignRight u-xs-right0 u-xs-marginRight20 u-height65 u-xs-height56">
- <div class="buttonSet"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-lineHeight30 u-height32" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1" data-action="sign-in-prompt" data-redirect="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" data-action-source="nav_signup">Sign in / Sign up</a></div>
- </div>
- </div>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta data-rh="true" charset="utf-8" />
+ <script>
+ <![CDATA[
+ !function(c,f){var t,o,i,e=[],r={passive:!0,capture:!0},n=new Date,a="pointerup",u="pointercancel";function p(n,e){t||(t=e,o=n,i=new Date,w(f),s())}function s(){0<=o&&o<i-n&&(e.forEach(function(n){n(o,t)}),e=[])}function l(n){if(n.cancelable){var e=(1e12<n.timeStamp?new Date:performance.now())-n.timeStamp;"pointerdown"==n.type?function(n,e){function t(){p(n,e),i()}function o(){i()}function i(){f(a,t,r),f(u,o,r)}c(a,t,r),c(u,o,r)}(e,n):p(e,n)}}function w(e){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(n){e(n,l,r)})}w(c),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){e.push(n),s()}}(addEventListener,removeEventListener)
+ ]]>
+ </script>
+ <script defer="defer" src="https://cdn.optimizely.com/js/16180790160.js"></script>
+ <title data-rh="true">
+ Samantha and The Great Big Lie. How to get shanked doing what people… | by John C. Welch | Medium
+ </title>
+ <meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1" />
+ <meta data-rh="true" name="theme-color" content="#000000" />
+ <meta data-rh="true" name="twitter:app:name:iphone" content="Medium" />
+ <meta data-rh="true" name="twitter:app:id:iphone" content="828256236" />
+ <meta data-rh="true" property="al:ios:app_name" content="Medium" />
+ <meta data-rh="true" property="al:ios:app_store_id" content="828256236" />
+ <meta data-rh="true" property="al:android:package" content="com.medium.reader" />
+ <meta data-rh="true" property="fb:app_id" content="542599432471018" />
+ <meta data-rh="true" property="og:site_name" content="Medium" />
+ <meta data-rh="true" property="og:type" content="article" />
+ <meta data-rh="true" property="article:published_time" content="2015-12-11T14:28:34.438Z" />
+ <meta data-rh="true" name="title" content="Samantha and The Great Big Lie. How to get shanked doing what people… | by John C. Welch | Medium" />
+ <meta data-rh="true" property="og:title" content="Samantha and The Great Big Lie" />
+ <meta data-rh="true" property="twitter:title" content="Samantha and The Great Big Lie" />
+ <meta data-rh="true" name="twitter:site" content="@Medium" />
+ <meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/d146a92473a1" />
+ <meta data-rh="true" property="al:android:url" content="medium://p/d146a92473a1" />
+ <meta data-rh="true" property="al:ios:url" content="medium://p/d146a92473a1" />
+ <meta data-rh="true" property="al:android:app_name" content="Medium" />
+ <meta data-rh="true" name="description" content="(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a…" />
+ <meta data-rh="true" property="og:description" content="How to get shanked doing what people say they want" />
+ <meta data-rh="true" property="twitter:description" content="How to get shanked doing what people say they want" />
+ <meta data-rh="true" property="og:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
+ <meta data-rh="true" property="al:web:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
+ <meta data-rh="true" property="og:image" content="https://miro.medium.com/max/398/1*kbPh7V97eyRodSOw2-ALDw.png" />
+ <meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/max/398/1*kbPh7V97eyRodSOw2-ALDw.png" />
+ <meta data-rh="true" name="twitter:card" content="summary_large_image" />
+ <meta data-rh="true" property="article:author" content="https://medium.com/@johncwelch" />
+ <meta data-rh="true" name="author" content="John C. Welch" />
+ <meta data-rh="true" name="robots" content="index,follow,max-image-preview:large" />
+ <meta data-rh="true" name="referrer" content="unsafe-url" />
+ <meta data-rh="true" name="twitter:label1" value="Reading time" />
+ <meta data-rh="true" name="twitter:data1" value="18 min read" />
+ <meta data-rh="true" name="parsely-post-id" content="d146a92473a1" />
+ <link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/152/152/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/120/120/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/76/76/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/60/60/1*8I-HPL0bfoIzGied-dzOvA.png" />
+ <link data-rh="true" rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/monogram-mask.KPLCSFEZviQN0jQ7veN2RQ.svg" color="#171717" />
+ <link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/e/sr/latin/e/ssr/latin/e/ssb/latin/m2.css" />
+ <link data-rh="true" rel="author" href="https://medium.com/@johncwelch" />
+ <link data-rh="true" rel="canonical" href="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
+ <link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/d146a92473a1" />
+ <link data-rh="true" rel="icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon-rebrand-medium.3Y6xpZ-0FSdWDnPM3hSBIA.ico" />
+ <script data-rh="true" type="application/ld+json">
+ <![CDATA[
+ {"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F1200\u002F1*kbPh7V97eyRodSOw2-ALDw.png"],"url":"https:\u002F\u002Fmedium.com\u002F@johncwelch\u002Fsamantha-and-the-great-big-lie-d146a92473a1","dateCreated":"2015-10-15T02:19:15.607Z","datePublished":"2015-10-15T02:19:15.607Z","dateModified":"2018-04-22T22:24:24.777Z","headline":"Samantha and The Great Big Lie - John C. Welch - Medium","name":"Samantha and The Great Big Lie - John C. Welch - Medium","description":"(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a…","identifier":"d146a92473a1","keywords":["Lite:true","Elevated:false","LockedPostSource:LOCKED_POST_SOURCE_NONE","LayerCake:0"],"author":{"@type":"Person","name":"John C. Welch","url":"https:\u002F\u002Fmedium.com\u002F@johncwelch"},"creator":["John C. Welch"],"publisher":{"@type":"Organization","name":"Medium","url":"https:\u002F\u002Fmedium.com\u002F","logo":{"@type":"ImageObject","width":308,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F616\u002F1*OMF3fSqH8t4xBJ9-6oZDZw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002F@johncwelch\u002Fsamantha-and-the-great-big-lie-d146a92473a1"}
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+ ga('create', 'UA-24232453-2', 'auto');
+ ga('send', 'pageview');
+ ]]>
+ </script>
+ <link rel="preload" href="https://cdn.optimizely.com/js/16180790160.js" as="script" />
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="STATIC">
+ /*<![CDATA[*/
+ html{box-sizing:border-box}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="KEYFRAME">
+ /*<![CDATA[*/
+ @-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE">
+ /*<![CDATA[*/
+ .a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{height:100vh}.m{width:100vw}.n{display:flex}.o{align-items:center}.p{justify-content:center}.q{fill:rgba(41, 41, 41, 1)}.r{display:block}.s{position:absolute}.t{top:0}.u{left:0}.v{right:0}.w{z-index:500}.x{box-shadow:0 4px 12px 0 rgba(0, 0, 0, 0.05)}.ag{max-width:1192px}.ah{min-width:0}.ai{width:100%}.aj{height:65px}.am{flex:1 0 auto}.an{display:none}.ap{visibility:hidden}.aq{margin-left:16px}.ar{color:rgba(2, 158, 116, 1)}.as{fill:rgba(3, 168, 124, 1)}.at{font-size:inherit}.au{border:inherit}.av{font-family:inherit}.aw{letter-spacing:inherit}.ax{font-weight:inherit}.ay{padding:0}.az{margin:0}.ba:hover{cursor:pointer}.bb:hover{color:rgba(1, 143, 105, 1)}.bc:hover{fill:rgba(2, 158, 116, 1)}.bd:disabled{cursor:default}.be:disabled{color:rgba(45, 132, 255, 0.5)}.bf:disabled{fill:rgba(45, 132, 255, 0.5)}.bg{flex:0 0 auto}.bh{color:inherit}.bi{fill:inherit}.bj:hover{color:rgba(25, 25, 25, 1)}.bk:hover{fill:rgba(25, 25, 25, 1)}.bl:disabled{color:rgba(117, 117, 117, 1)}.bm:disabled{fill:rgba(117, 117, 117, 1)}.bn{font-family:medium-content-sans-serif-font, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Arial, sans-serif}.bo{font-style:normal}.bp{line-height:20px}.bq{font-size:15.8px}.br{letter-spacing:0px}.bs{color:rgba(117, 117, 117, 1)}.bt{fill:rgba(117, 117, 117, 1)}.bu{margin-bottom:0px}.bw{top:0px}.bx{left:0px}.by{height:100%}.bz{position:fixed}.ca{background-color:rgba(0, 0, 0, 0.08)}.cb{z-index:510}.cc{cursor:pointer}.cd{opacity:0}.ce{transition:opacity 0.6s cubic-bezier(0.23, 1, 0.32, 1) 0s}.cf{pointer-events:none}.cg{width:414px}.ch{z-index:520}.ci{background-color:white}.cj{left:100%}.ck{box-sizing:border-box}.cl{overflow:auto}.cm{-ms-overflow-style:-ms-autohiding-scrollbar}.cn{box-shadow:rgba(0, 0, 0, 0.15) 0px 4px 12px}.co{opacity:1}.cp{transform:translateX(0px)}.cq{transition:transform 0.6s cubic-bezier(0.23, 1, 0.32, 1) 0s, opacity 0.6s cubic-bezier(0.23, 1, 0.32, 1) 0s}.cx{padding-bottom:18px}.cy{padding:24px}.cz{flex-direction:row}.da{justify-content:space-between}.db{font-weight:600}.dc{font-size:22px}.dd{line-height:28px}.de{color:rgba(41, 41, 41, 1)}.df{position:relative}.dg{right:-7px}.dh{padding:0 24px}.di{animation:k1 1.2s ease-in-out infinite}.dj{padding:32px 0}.dk{border-radius:100%}.dl{height:32px}.dm{width:32px}.dn{background-color:rgba(242, 242, 242, 1)}.do{margin-left:8px}.dp{margin-top:4px}.dq{margin-bottom:8px}.dr{height:8px}.ds{width:120px}.dt{width:80px}.du{margin-top:12px}.dv{height:10px}.dw{width:90%}.dx{padding-left:24px}.dy{padding-right:24px}.dz{margin-left:auto}.ea{margin-right:auto}.eb{max-width:728px}.ec{top:calc(100vh + 100px)}.ed{bottom:calc(100vh + 100px)}.ee{width:10px}.ef{word-break:break-word}.eg{word-wrap:break-word}.eh:after{display:block}.ei:after{content:""}.ej:after{clear:both}.ek{max-width:680px}.el{line-height:1.23}.em{letter-spacing:0}.en{font-family:medium-content-title-font, Georgia, Cambria, "Times New Roman", Times, serif}.fd{margin-bottom:-0.27em}.fe{margin-top:32px}.fi{border-radius:50%}.fj{height:48px}.fk{width:48px}.fl{margin-left:12px}.fm{margin-bottom:2px}.fo{font-weight:300}.fp{font-size:16px}.fq{overflow:hidden}.fr{max-height:20px}.fs{text-overflow:ellipsis}.ft{display:-webkit-box}.fu{-webkit-line-clamp:1}.fv{-webkit-box-orient:vertical}.fw:hover{text-decoration:underline}.fx{padding:0px 8px}.fy{background:0}.fz{border-color:rgba(117, 117, 117, 1)}.ga:hover{color:rgba(8, 8, 8, 1)}.gb:hover{fill:rgba(8, 8, 8, 1)}.gc:hover{border-color:rgba(41, 41, 41, 1)}.gd:disabled{fill:rgba(61, 61, 61, 1)}.ge:disabled{border-color:rgba(204, 204, 204, 1)}.gf:disabled{cursor:inherit}.gg:disabled:hover{color:rgba(117, 117, 117, 1)}.gh:disabled:hover{fill:rgba(61, 61, 61, 1)}.gi:disabled:hover{border-color:rgba(204, 204, 204, 1)}.gj{border-radius:4px}.gk{line-height:18px}.gl{font-size:15px}.gm{border-width:1px}.gn{border-style:solid}.go{display:inline-block}.gp{text-decoration:none}.gq{align-items:flex-end}.gy{padding-right:6px}.gz{margin-right:8px}.ha{margin-right:-6px}.hb{line-height:1.58}.hc{letter-spacing:-0.004em}.hd{font-family:medium-content-serif-font, Georgia, Cambria, "Times New Roman", Times, serif}.hy{margin-bottom:-0.46em}.hz{box-shadow:inset 3px 0 0 0 rgba(41, 41, 41, 1)}.ia{padding-left:23px}.ib{margin-left:-20px}.ic{font-style:italic}.id{font-family:medium-content-slab-serif-font, Georgia, Cambria, "Times New Roman", Times, serif}.ie{font-size:28px}.if{color:rgba(8, 8, 8, 1)}.ig{border:none}.ih{margin-top:30px}.ii{text-align:center}.ij:before{content:"..."}.ik:before{letter-spacing:0.6em}.il:before{text-indent:0.6em}.im:before{font-style:italic}.in:before{line-height:1.4}.io{list-style-type:decimal}.ip{margin-left:30px}.iq{padding-left:0px}.ir{background-repeat:repeat-x}.is{background-image:linear-gradient(to right,rgba(41, 41, 41, 1) 100%,rgba(41, 41, 41, 1) 0);background-image:url('data:image/svg+xml;utf8,<svg preserveAspectRatio="none" viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg"><line x1="0" y1="0" x2="1" y2="1" stroke="rgba(41, 41, 41, 1)" /></svg>')}.it{background-size:1px 1px}.iu{background-position:0 1.05em;background-position:0 calc(1em + 1px)}.ja{max-width:398px}.jg{clear:both}.jh{transition:opacity 100ms 400ms}.ji{will-change:transform}.jj{transform:translateZ(0)}.jk{margin:auto}.jl{padding-bottom:136.18090452261305%}.jm{height:0}.jn{filter:blur(20px)}.jo{transform:scale(1.1)}.jp{visibility:visible}.jq{max-width:694px}.jr{padding-bottom:111.09510086455332%}.js{max-width:308px}.jt{padding-bottom:87.33766233766235%}.ju{will-change:opacity}.jv{width:188px}.jw{left:50%}.jx{transform:translateX(406px)}.jy{top:calc(65px + 54px + 14px)}.kb{top:159px}.kd{width:131px}.ke{flex-direction:column}.kf{padding-top:28px}.kg{margin-bottom:19px}.kh{margin-left:-3px}.kn{outline:0}.ko{border:0}.kp{user-select:none}.kq> svg{pointer-events:none}.kr:active{border-style:none}.ks{-webkit-user-select:none}.kt:focus{fill:rgba(117, 117, 117, 1)}.ku:hover{fill:rgba(117, 117, 117, 1)}.lc button{text-align:left}.ld{opacity:0.4}.le{cursor:not-allowed}.lf{padding-right:9px}.lo{margin-top:40px}.lp{flex-wrap:wrap}.lq{margin-top:25px}.lr{max-width:155px}.lv{top:1px}.ly{align-items:flex-start}.mk{margin-left:-1px}.ml{margin-left:-4px}.mt{padding-right:8px}.mu{padding-top:32px}.mv{border-top:1px solid rgba(230, 230, 230, 1)}.mw{margin-bottom:25px}.my{margin-bottom:32px}.mz{min-height:80px}.ne{height:80px}.nf{padding-left:102px}.nh{font-size:14px}.ni{letter-spacing:0.05em}.nj{text-transform:uppercase}.nk{margin-bottom:6px}.nl{font-size:26px}.nm{line-height:32px}.nn{padding:4px 12px}.no{max-width:555px}.np{max-width:450px}.nq{font-size:18px}.nr{line-height:24px}.nt{padding-top:24px}.nu{margin-top:5px}.nv{height:40px}.nw{width:40px}.nx{font-size:12px}.ny{line-height:15px}.nz{line-height:22px}.oa{padding-top:8px}.ob{padding-top:25px}.od{margin-top:64px}.oe{background-color:rgba(250, 250, 250, 1)}.of{margin-bottom:40px}.og{margin-top:24px}.oh{padding-bottom:16px}.oi{border-bottom:1px solid rgba(230, 230, 230, 1)}.oj{margin-bottom:24px}.qa{flex-grow:0}.qb{padding-bottom:24px}.qc{max-width:500px}.qd{flex:0 1 auto}.qh{padding-bottom:8px}.qu{padding-bottom:100%}.rf{padding:60px 0}.rg{background-color:rgba(0, 0, 0, 0.9)}.ri{padding-bottom:48px}.rj{border-bottom:1px solid rgba(255, 255, 255, 0.54)}.rk{margin:0 -12px}.rl{margin:0 12px}.rm{flex:1 1 0}.rn:hover{color:rgba(255, 255, 255, 0.99)}.ro:hover{fill:rgba(255, 255, 255, 0.99)}.rp:disabled{color:rgba(255, 255, 255, 0.7)}.rq:disabled{fill:rgba(255, 255, 255, 0.7)}.rr{color:rgba(255, 255, 255, 0.98)}.rs{color:rgba(255, 255, 255, 0.7)}.rt{text-decoration:underline}.ru{fill:rgba(255, 255, 255, 0.98)}.rv{width:200px}.sa{margin-right:16px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (min-width: 1080px)">
+ /*<![CDATA[*/
+ .d{display:none}.af{margin:0 64px}.fa{font-size:40px}.fb{margin-top:0.78em}.fc{line-height:48px}.gx{margin-left:30px}.hu{font-size:21px}.hv{margin-top:2em}.hw{line-height:32px}.hx{letter-spacing:-0.003em}.iz{margin-top:1.05em}.jf{margin-top:56px}.km{margin-right:5px}.lb{margin-top:5px}.ln{padding-left:6px}.lx{display:inline-block}.md{margin-left:7px}.me{margin-top:8px}.mj{width:25px}.mr{padding-left:7px}.ms{top:3px}.oq{font-size:26px}.pd{width:calc(100% + 32px)}.pe{margin-left:-16px}.pf{margin-right:-16px}.pw{padding-left:16px}.px{padding-right:16px}.py{flex-basis:25%}.pz{max-width:25%}.qq{font-size:18px}.qr{line-height:22px}.rd{min-width:70px}.re{min-height:70px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 1079.98px)">
+ /*<![CDATA[*/
+ .e{display:none}.gw{margin-left:30px}.kl{margin-right:5px}.la{margin-top:5px}.lm{padding-left:6px}.lw{display:inline-block}.mb{margin-left:7px}.mc{margin-top:8px}.mi{width:25px}.mp{padding-left:7px}.mq{top:3px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 903.98px)">
+ /*<![CDATA[*/
+ .f{display:none}.gv{margin-left:30px}.kk{margin-right:5px}.kz{margin-top:5px}.lk{padding-left:6px}.ll{top:3px}.lu{display:inline-block}.lz{margin-left:7px}.ma{margin-top:8px}.mh{width:15px}.mo{padding-left:3px}.qg{margin-right:16px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 727.98px)">
+ /*<![CDATA[*/
+ .g{display:none}.ak{height:56px}.al{display:flex}.ao{display:block}.bv{margin-bottom:0px}.cr{left:0}.cs{width:100%}.ct{border-top-left-radius:20px}.cu{border-top-right-radius:20px}.cv{transform:translateY(100%)}.cw{-webkit-overflow-scrolling:touch}.fg{margin-top:32px}.fh{flex-direction:column-reverse}.gt{margin-bottom:30px}.gu{margin-left:0px}.kj{margin-left:8px}.kx{margin-top:2px}.ky{margin-right:8px}.li{padding-left:6px}.lj{top:3px}.lt{display:inline-block}.mg{width:15px}.mn{padding-left:3px}.mx{padding-top:0}.na{margin-bottom:24px}.nb{align-items:center}.nc{width:102px}.nd{position:relative}.ng{padding-left:0}.ns{margin-top:24px}.oc{border-top:none}.ok{padding-bottom:12px}.ol{margin-top:16px}.qf{margin-right:16px}.qs{margin-left:16px}.qt{margin-right:0px}.rh{padding:32px 0}.rw{width:140px}.rx{margin-bottom:16px}.ry{margin-top:30px}.rz{flex-direction:row}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 551.98px)">
+ /*<![CDATA[*/
+ .h{display:none}.z{margin:0 24px}.eo{font-size:34px}.ep{margin-top:0.56em}.eq{line-height:42px}.ff{margin-top:32px}.fn{margin-bottom:0px}.gr{margin-bottom:30px}.gs{margin-left:0px}.he{font-size:18px}.hf{margin-top:1.56em}.hg{line-height:28px}.hh{letter-spacing:-0.003em}.iv{margin-top:1.34em}.jb{margin-top:40px}.ki{margin-left:8px}.kv{margin-top:2px}.kw{margin-right:8px}.lg{padding-left:6px}.lh{top:3px}.ls{display:inline-block}.mf{width:15px}.mm{padding-left:3px}.om{font-size:22px}.or{width:calc(100% + 24px)}.os{margin-left:-12px}.ot{margin-right:-12px}.pg{padding-left:12px}.ph{padding-right:12px}.pi{flex-basis:100%}.pj{max-width:100%}.qe{margin-right:16px}.qi{font-size:15px}.qj{line-height:18px}.qv{min-width:48px}.qw{min-height:48px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">
+ /*<![CDATA[*/
+ .i{display:none}.ae{margin:0 64px}.ex{font-size:40px}.ey{margin-top:0.78em}.ez{line-height:48px}.hq{font-size:21px}.hr{margin-top:2em}.hs{line-height:32px}.ht{letter-spacing:-0.003em}.iy{margin-top:1.05em}.je{margin-top:56px}.op{font-size:26px}.pa{width:calc(100% + 32px)}.pb{margin-left:-16px}.pc{margin-right:-16px}.ps{padding-left:16px}.pt{padding-right:16px}.pu{flex-basis:25%}.pv{max-width:25%}.qo{font-size:18px}.qp{line-height:22px}.rb{min-width:70px}.rc{min-height:70px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">
+ /*<![CDATA[*/
+ .j{display:none}.ac{margin:0 48px}.eu{font-size:40px}.ev{margin-top:0.78em}.ew{line-height:48px}.hm{font-size:21px}.hn{margin-top:2em}.ho{line-height:32px}.hp{letter-spacing:-0.003em}.ix{margin-top:1.05em}.jd{margin-top:56px}.oo{font-size:26px}.ox{width:calc(100% + 28px)}.oy{margin-left:-14px}.oz{margin-right:-14px}.po{padding-left:14px}.pp{padding-right:14px}.pq{flex-basis:50%}.pr{max-width:50%}.qm{font-size:15px}.qn{line-height:18px}.qz{min-width:48px}.ra{min-height:48px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">
+ /*<![CDATA[*/
+ .k{display:none}.ab{margin:0 24px}.er{font-size:34px}.es{margin-top:0.56em}.et{line-height:42px}.hi{font-size:18px}.hj{margin-top:1.56em}.hk{line-height:28px}.hl{letter-spacing:-0.003em}.iw{margin-top:1.34em}.jc{margin-top:40px}.on{font-size:22px}.ou{width:calc(100% + 24px)}.ov{margin-left:-12px}.ow{margin-right:-12px}.pk{padding-left:12px}.pl{padding-right:12px}.pm{flex-basis:100%}.pn{max-width:100%}.qk{font-size:15px}.ql{line-height:18px}.qx{min-width:48px}.qy{min-height:48px}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="print">
+ /*<![CDATA[*/
+ .y{display:none}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">
+ /*<![CDATA[*/
+ .jz{transition:opacity 200ms}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 1230px)">
+ /*<![CDATA[*/
+ .ka{display:none}
+ /*]]>*/
+ </style>
+ <style type="text/css" data-fela-rehydration="494" data-fela-type="RULE" media="all and (max-width: 1198px)">
+ /*<![CDATA[*/
+ .kc{display:none}
+ /*]]>*/
+ </style>
+ </head>
+ <body>
+ <div id="root">
+ <div class="a b c">
+ <div class="d e f g h i j k"></div>
+ <script>
+ <![CDATA[
+ document.domain = document.domain;
+ ]]>
+ </script>
+ <div>
+ <script>
+ <![CDATA[
+ if (window.self !== window.top) window.location = "about:blank"
+ ]]>
+ </script>
</div>
- <div class="metabar metabar--spacer js-metabarSpacer u-height65 u-xs-height56"></div>
- <main role="main">
- <article class=" u-sizeViewHeightMin100 u-overflowHidden postArticle postArticle--full u-marginBottom40" lang="en">
- <header class="container u-maxWidth740">
- <div class="postMetaHeader u-paddingBottom10 row">
- <div class="col u-size12of12 js-postMetaLockup">
- <div class="postMetaLockup postMetaLockup--authorWithBio u-flex js-postMetaLockup">
- <div class="u-flex0">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/80/80/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--smaller" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="u-flex1 u-paddingLeft15 u-overflowHidden"><a class="link link link--darken link--darker u-baseColor--link" href="https://medium.com/@johncwelch?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button u-paddingLeft10 u-paddingRight10 u-height19 u-lineHeight13 u-verticalAlignMiddle u-fontSizeSmallest u-uiTextMedium u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-marginLeft10 u-marginTopNegative2 u-xs-hide" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="post_header_lockup"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary u-paddingLeft10 u-paddingRight10 u-height19 u-lineHeight13 u-verticalAlignMiddle u-fontSizeSmallest u-uiTextMedium u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton u-marginLeft10 u-marginTopNegative2 u-xs-hide" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="post_header_lockup_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span>
- <div class="postMetaInline js-testPostMetaInlineSupplemental"><time datetime="2015-10-15T02:19:15.607Z">Oct 15, 2015</time><span class="middotDivider u-fontSizeSmallest"></span><span class="readingTime" title="18 min read"></span></div>
- </div>
- </div>
- </div>
- </div>
- </header>
- <div class="postArticle-content js-postField js-notesSource js-trackedPost" data-post-id="d146a92473a1" data-source="post_page" data-tracking-context="postPage">
- <section name="55ff" class="section section--body section--first">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <h1 name="b34c" id="b34c" class="graf graf--h3 graf--leading graf--title">Samantha and The Great Big Lie</h1>
- <p name="97e7" id="97e7" class="graf graf--p graf-after--h3">How to get shanked doing what people say they want</p>
- <blockquote name="df70" id="df70" class="graf graf--blockquote graf-after--p">don’t preach to me<br />Mr. integrity</blockquote>
- <p name="c979" id="c979" class="graf graf--p graf-after--blockquote">(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)</p>
- <p name="342d" id="342d" class="graf graf--p graf-after--p">First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.</p>
- <p name="2e61" id="2e61" class="graf graf--p graf-after--p">Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.</p>
- <p name="cd31" id="cd31" class="graf graf--p graf-after--p">…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our <em class="markup--em markup--p-em">specific</em> instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.</p>
- <p name="ae07" id="ae07" class="graf graf--p graf-after--p graf--trailing">That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.</p>
- </div>
- </div>
- </section>
- <section name="c360" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="a02f" id="a02f" class="graf graf--p graf--leading">Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:</p>
- <ol class="postList">
- <li name="9213" id="9213" class="graf graf--li graf-after--p">With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a <a href="http://www.marco.org/2015/10/09/overcast2" data-href="http://www.marco.org/2015/10/09/overcast2" class="markup--anchor markup--li-anchor" rel="nofollow noopener" target="_blank">patronage model</a> that will probably be successful for him.</li>
- <li name="dfa5" id="dfa5" class="graf graf--li graf-after--li">Arment’s insistence that “<a href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" data-href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" class="markup--anchor markup--li-anchor" target="_blank">anyone can do this</a>” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.</li>
- <li name="e55d" id="e55d" class="graf graf--li graf-after--li">Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, <em class="markup--em markup--li-em">Marco</em>, not only don’t have, but have little chance of attaining anytime soon.</li>
- <li name="35fb" id="35fb" class="graf graf--li graf-after--li">Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.</li>
- <li name="38e2" id="38e2" class="graf graf--li graf-after--li">In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.</li>
- </ol>
- <p name="0481" id="0481" class="graf graf--p graf-after--li">None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.</p>
- <p name="5a45" id="5a45" class="graf graf--p graf-after--p">So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.</p>
- <p name="3bc7" id="3bc7" class="graf graf--p graf-after--p graf--trailing">If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.</p>
- </div>
- </div>
- </section>
- <section name="2ba2" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="0fb2" id="0fb2" class="graf graf--p graf--leading">The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is <a href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" data-href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">enough to shut him down</a>, who <a href="https://twitter.com/marcoarment/status/641330113934700544" data-href="https://twitter.com/marcoarment/status/641330113934700544" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things</a>, is, in a single word, disgusting. Vomitous even.</p>
- <p name="9a6e" id="9a6e" class="graf graf--p graf-after--p">It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in <a href="https://twitter.com/s_bielefeld/with_replies" data-href="https://twitter.com/s_bielefeld/with_replies" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Samantha’s Twitter Feed</a>. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):</p>
- <blockquote name="3271" id="3271" class="graf graf--blockquote graf-after--p">I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.</blockquote>
- <p name="ec72" id="ec72" class="graf graf--p graf-after--blockquote">Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is <em class="markup--em markup--p-em">such</em> a lie.</p>
- <p name="5cc4" id="5cc4" class="graf graf--p graf-after--p">But it gets better. First, you have the “hey, Marco <em class="markup--em markup--p-em">earned</em> his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:</p>
- <blockquote name="4e5f" id="4e5f" class="graf graf--blockquote graf-after--p">From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.</blockquote>
- <p name="cee9" id="cee9" class="graf graf--p graf-after--blockquote">and here:</p>
- <blockquote name="3f1b" id="3f1b" class="graf graf--blockquote graf-after--p">I’m not knocking his success, he has put effort into his line of work, and has built his own life.</blockquote>
- <p name="e527" id="e527" class="graf graf--p graf-after--blockquote">and here:</p>
- <blockquote name="3e4f" id="3e4f" class="graf graf--blockquote graf-after--p">He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.</blockquote>
- <p name="8a01" id="8a01" class="graf graf--p graf-after--blockquote">But still, you get the people telling her something she already acknowledge:</p>
- <blockquote name="7685" id="7685" class="graf graf--blockquote graf-after--p">I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.</blockquote>
- <p name="b151" id="b151" class="graf graf--p graf-after--blockquote">Thank you for restating something in the article. To the person who wrote it.</p>
- <p name="87bc" id="87bc" class="graf graf--p graf-after--p">In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers <a href="http://atp.fm/sponsor/" data-href="http://atp.fm/sponsor/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">provided by ATP in terms of sponsorship rates</a> and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.</p>
- <p name="dbda" id="dbda" class="graf graf--p graf-after--p">At first, she went with a simple formula:</p>
- <blockquote name="1b4e" id="1b4e" class="graf graf--blockquote graf-after--p">$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.</blockquote>
- <p name="0b33" id="0b33" class="graf graf--p graf-after--blockquote">That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:</p>
- <blockquote name="76d7" id="76d7" class="graf graf--blockquote graf-after--p">That’s $4k per ad, no? So more like $12–16k per episode.</blockquote>
- <p name="a089" id="a089" class="graf graf--p graf-after--blockquote">She’d already realized her mistake and fixed it.</p>
- <blockquote name="b369" id="b369" class="graf graf--blockquote graf-after--p">which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.</blockquote>
- <p name="8b3b" id="8b3b" class="graf graf--p graf-after--blockquote">Again, this is based on <em class="markup--em markup--p-em">publicly available data</em> the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.</p>
- <p name="135a" id="135a" class="graf graf--p graf-after--p">This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his <em class="markup--em markup--p-em">income taxes correctly</em>:</p>
- <blockquote name="5e7e" id="5e7e" class="graf graf--blockquote graf-after--p">especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.</blockquote>
- <blockquote name="6036" id="6036" class="graf graf--blockquote graf-after--blockquote">thus, guessing net income is more haphazard than stating approx. gross income.</blockquote>
- <p name="aac1" id="aac1" class="graf graf--p graf-after--blockquote">Ye Gods. She’s not doing his taxes for him, her point is invalid?</p>
- <p name="600f" id="600f" class="graf graf--p graf-after--p">Then there’s the people who seem to have not read anything past what other people are telling them:</p>
- <blockquote name="9b62" id="9b62" class="graf graf--blockquote graf-after--p">Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?</blockquote>
- <p name="c18a" id="c18a" class="graf graf--p graf-after--blockquote">Just how spoon-fed do you have to be? Have you no teeth?</p>
- <p name="c445" id="c445" class="graf graf--p graf-after--p">Of course, Marco jumps in, and predictably, he’s snippy:</p>
- <blockquote name="0c21" id="0c21" class="graf graf--blockquote graf-after--p">If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.</blockquote>
- <p name="8f8d" id="8f8d" class="graf graf--p graf-after--blockquote">If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.</p>
- <p name="cc97" id="cc97" class="graf graf--p graf-after--p">Then Marco’s friends/fans get into it:</p>
- <blockquote name="f9da" id="f9da" class="graf graf--blockquote graf-after--p">I really don’t understand why it’s anyone’s business</blockquote>
- <p name="0094" id="0094" class="graf graf--p graf-after--blockquote">Samantha is trying to qualify for sainthood at this point:</p>
- <blockquote name="0105" id="0105" class="graf graf--blockquote graf-after--p">It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.</blockquote>
- <p name="cdd1" id="cdd1" class="graf graf--p graf-after--blockquote">Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:</p>
- <blockquote name="f56c" id="f56c" class="graf graf--blockquote graf-after--p">Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.</blockquote>
- <p name="4fef" id="4fef" class="graf graf--p graf-after--blockquote">Wha?? Overcast 2 is absolutely free. Samantha points this out:</p>
- <blockquote name="0f36" id="0f36" class="graf graf--blockquote graf-after--p">His app is free, that’s what sparked the article to begin with.</blockquote>
- <p name="40d2" id="40d2" class="graf graf--p graf-after--blockquote">The response is literally a parallel to “How can there be global warming if it snowed today in my town?”</p>
- <blockquote name="6760" id="6760" class="graf graf--blockquote graf-after--p">If it’s free, how have I paid for it? Twice?</blockquote>
- <p name="7b13" id="7b13" class="graf graf--p graf-after--blockquote">She is still trying:</p>
- <blockquote name="44ba" id="44ba" class="graf graf--blockquote graf-after--p">You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0</blockquote>
- <p name="2152" id="2152" class="graf graf--p graf-after--blockquote">He is having none of it. IT SNOWED! SNOWWWWWWW!</p>
- <blockquote name="99a6" id="99a6" class="graf graf--blockquote graf-after--p">Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.</blockquote>
- <p name="5e6f" id="5e6f" class="graf graf--p graf-after--blockquote">She however, is relentless:</p>
- <blockquote name="1b0f" id="1b0f" class="graf graf--blockquote graf-after--p">No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.</blockquote>
- <p name="d24f" id="d24f" class="graf graf--p graf-after--blockquote">Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)</p>
- <p name="10e1" id="10e1" class="graf graf--p graf-after--p">We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.</p>
- <blockquote name="9b01" id="9b01" class="graf graf--blockquote graf-after--p">It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.</blockquote>
- <p name="340c" id="340c" class="graf graf--p graf-after--blockquote">(UNDERSTATEMENT OF THE YEAR)</p>
- <blockquote name="7244" id="7244" class="graf graf--blockquote graf-after--p">I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.</blockquote>
- <blockquote name="ffb1" id="ffb1" class="graf graf--blockquote graf-after--blockquote">It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.</blockquote>
- <p name="e44e" id="e44e" class="graf graf--p graf-after--blockquote">She tries, oh lord, she tries:</p>
- <blockquote name="a502" id="a502" class="graf graf--blockquote graf-after--p">To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.</blockquote>
- <p name="7dcd" id="7dcd" class="graf graf--p graf-after--blockquote">But no, HE KNOWS HER POINT BETTER THAN SHE DOES:</p>
- <blockquote name="a62a" id="a62a" class="graf graf--blockquote graf-after--p">No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.</blockquote>
- <p name="df8c" id="df8c" class="graf graf--p graf-after--blockquote">Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.</p>
- <p name="521a" id="521a" class="graf graf--p graf-after--p">One guy tries to blame it all on Apple, another in a string of Wha??? moments:</p>
- <blockquote name="d80d" id="d80d" class="graf graf--blockquote graf-after--p">the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility</blockquote>
- <p name="db0b" id="db0b" class="graf graf--p graf-after--blockquote">Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:</p>
- <blockquote name="7a78" id="7a78" class="graf graf--blockquote graf-after--p">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <p name="6e09" id="6e09" class="graf graf--p graf-after--blockquote">Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.</p>
- <p name="b7db" id="b7db" class="graf graf--p graf-after--p">One guy is “confused”:</p>
- <blockquote name="3626" id="3626" class="graf graf--blockquote graf-after--p">I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?</blockquote>
- <blockquote name="9daa" id="9daa" class="graf graf--blockquote graf-after--blockquote">Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.</blockquote>
- <blockquote name="f6da" id="f6da" class="graf graf--blockquote graf-after--blockquote">Alright, that’s fair. I was just confused by the $ and fame angle at first.</blockquote>
- <p name="d5b1" id="d5b1" class="graf graf--p graf-after--blockquote">Samantha’s point centers on the benefits Marco gains via his fame and background. <em class="markup--em markup--p-em">HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?</em></p>
- <p name="58d0" id="58d0" class="graf graf--p graf-after--p">People of course are telling her it’s her fault for mentioning a salient fact at all:</p>
- <blockquote name="30d2" id="30d2" class="graf graf--blockquote graf-after--p">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <blockquote name="765b" id="765b" class="graf graf--blockquote graf-after--blockquote">Maybe because you went there with your article?</blockquote>
- <blockquote name="61fe" id="61fe" class="graf graf--blockquote graf-after--blockquote">As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.</blockquote>
- <p name="f17c" id="f17c" class="graf graf--p graf-after--blockquote">Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.</p>
- <p name="0b60" id="0b60" class="graf graf--p graf-after--p">Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:</p>
- <blockquote name="65ab" id="65ab" class="graf graf--blockquote graf-after--p">Because you decided to start a conversation about someone else’s personal shit. You started this war.</blockquote>
- <p name="1adb" id="1adb" class="graf graf--p graf-after--blockquote">War. THIS. IS. WAR.</p>
- <p name="de94" id="de94" class="graf graf--p graf-after--p">This is a bunch of nerds attacking someone for reasoned, calm, <em class="markup--em markup--p-em">polite</em> criticism of their friend/idol. Samantha is politely pushing back a bit:</p>
- <blockquote name="4458" id="4458" class="graf graf--blockquote graf-after--p">That doesn’t explain why every other part of my article is being pushed aside.</blockquote>
- <p name="aeac" id="aeac" class="graf graf--p graf-after--blockquote">She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.</p>
- <p name="0078" id="0078" class="graf graf--p graf-after--p">Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:</p>
- <blockquote name="c4c9" id="c4c9" class="graf graf--blockquote graf-after--p">You should never use an ad rate card to estimate ad revenue from any media product ever.</blockquote>
- <blockquote name="b66b" id="b66b" class="graf graf--blockquote graf-after--blockquote">I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars</blockquote>
- <p name="6907" id="6907" class="graf graf--p graf-after--blockquote">How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. <em class="markup--em markup--p-em">Checkmate Elitests!</em>”</p>
- <p name="41ec" id="41ec" class="graf graf--p graf-after--p">Samantha basically abases herself at his feet:</p>
- <blockquote name="0b14" id="0b14" class="graf graf--blockquote graf-after--p">I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.</blockquote>
- <p name="590f" id="590f" class="graf graf--p graf-after--blockquote">I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.</p>
- <p name="69dc" id="69dc" class="graf graf--p graf-after--p">Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.</p>
- <p name="5ab4" id="5ab4" class="graf graf--p graf-after--p">Another App Dev, seemingly unable to parse Samantha’s words, needs <em class="markup--em markup--p-em">more</em> explanation:</p>
- <blockquote name="957b" id="957b" class="graf graf--blockquote graf-after--p">so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.</blockquote>
- <p name="0a7e" id="0a7e" class="graf graf--p graf-after--blockquote">Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice <em class="markup--em markup--p-em">with someone who didn’t even read her article</em>:</p>
- <blockquote name="f7db" id="f7db" class="graf graf--blockquote graf-after--p">That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.</blockquote>
- <p name="937f" id="937f" class="graf graf--p graf-after--blockquote">Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:</p>
- <blockquote name="c9dd" id="c9dd" class="graf graf--blockquote graf-after--p">How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.</blockquote>
- <p name="c522" id="c522" class="graf graf--p graf-after--blockquote">Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?</p>
- <blockquote name="907e" id="907e" class="graf graf--blockquote graf-after--p">Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?</blockquote>
- <p name="2158" id="2158" class="graf graf--p graf-after--blockquote">That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.</p>
- <p name="13f8" id="13f8" class="graf graf--p graf-after--p">Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:</p>
- <blockquote name="96c6" id="96c6" class="graf graf--blockquote graf-after--p">Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!</blockquote>
- <p name="5d3f" id="5d3f" class="graf graf--p graf-after--blockquote">That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, <em class="markup--em markup--p-em">Apple</em>, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)</p>
- <p name="c07c" id="c07c" class="graf graf--p graf-after--p">Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.</p>
- <p name="8b32" id="8b32" class="graf graf--p graf-after--p">Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:</p>
- <blockquote name="de26" id="de26" class="graf graf--blockquote graf-after--p">Yup, before you existed!</blockquote>
- <p name="a3bd" id="a3bd" class="graf graf--p graf-after--blockquote">Really dude? I mean, I’m sorry about the penis, but really?</p>
- <p name="1c51" id="1c51" class="graf graf--p graf-after--p">Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any <em class="markup--em markup--p-em">valid</em> criticism. Which clearly is impossible):</p>
- <blockquote name="9848" id="9848" class="graf graf--blockquote graf-after--p">Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.</blockquote>
- <blockquote name="f2a6" id="f2a6" class="graf graf--blockquote graf-after--blockquote">lol. Noted.</blockquote>
- <blockquote name="aed9" id="aed9" class="graf graf--blockquote graf-after--blockquote">And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …</blockquote>
- <blockquote name="f9d8" id="f9d8" class="graf graf--blockquote graf-after--blockquote">… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.</blockquote>
- <blockquote name="f61c" id="f61c" class="graf graf--blockquote graf-after--blockquote">haha. Thank you for the clarification.</blockquote>
- <p name="5dd9" id="5dd9" class="graf graf--p graf-after--blockquote">Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.</p>
- <p name="dc44" id="dc44" class="graf graf--p graf-after--p">But now, the door has been cracked, and the cheap shots come out:</p>
- <blockquote name="0c94" id="0c94" class="graf graf--blockquote graf-after--p">@testflight_app: Don’t worry guys, we process <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a>’s apps in direct proportion to his megabucks earnings. <a href="https://twitter.com/hashtag/fairelephant?src=hash" data-href="https://twitter.com/hashtag/fairelephant?src=hash" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">#fairelephant</a></blockquote>
- <p name="343b" id="343b" class="graf graf--p graf-after--blockquote">(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)</p>
- <p name="09bf" id="09bf" class="graf graf--p graf-after--p">Or this…conversation:</p>
- <figure name="4d63" id="4d63" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 398px; max-height: 542px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 136.20000000000002%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*kbPh7V97eyRodSOw2-ALDw.png" data-width="398" data-height="542"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*kbPh7V97eyRodSOw2-ALDw.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*kbPh7V97eyRodSOw2-ALDw.png" /><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*kbPh7V97eyRodSOw2-ALDw.png" /></noscript></div>
+ <script>
+ <![CDATA[
+ window.PARSELY = window.PARSELY || {autotrack: false}
+ ]]>
+ </script>
+ <nav class="r s t u v c w x y">
+ <div>
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="aj n o ak al">
+ <div class="r am w">
+ <div class="n o">
+ <a aria-label="Homepage" rel="noopener" href="/?source=post_page-----d146a92473a1----------------------">
+ <div class="an g">
+ <svg height="22" width="112" viewbox="0 0 111.5 22" class="q">
+ <path d="M56.3 19.5c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5V19c-.7 1.8-2.4 3-4.3 3-3.3 0-5.8-2.6-5.8-7.5 0-4.5 2.6-7.6 6.3-7.6 1.6-.1 3.1.8 3.8 2.4V3.2c0-.3-.1-.6-.3-.7l-1.4-1.4V1l6.5-.8v19.3zm-4.8-.8V9.5c-.5-.6-1.2-.9-1.9-.9-1.6 0-3.1 1.4-3.1 5.7 0 4 1.3 5.4 3 5.4.8.1 1.6-.3 2-1zm9.1 3.1V9.4c0-.3-.1-.6-.3-.7l-1.4-1.5v-.1h6.5v12.5c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5zm-.2-19.2C60.4 1.2 61.5 0 63 0c1.4 0 2.6 1.2 2.6 2.6S64.4 5.3 63 5.3a2.6 2.6 0 0 1-2.6-2.7zm22.5 16.9c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5v-3.2c-.6 2-2.4 3.4-4.5 3.4-2.9 0-4.4-2.1-4.4-6.2 0-1.9 0-4.1.1-6.5 0-.3-.1-.5-.3-.7L67.7 7v.1H74v8c0 2.6.4 4.4 2 4.4.9-.1 1.7-.6 2.1-1.3V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v12.4zm22 2.3c0-.5.1-6.5.1-7.9 0-2.6-.4-4.5-2.2-4.5-.9 0-1.8.5-2.3 1.3.2.8.3 1.7.3 2.5 0 1.8-.1 4.2-.1 6.5 0 .3.1.5.3.7l1.5 1.4v.1H96c0-.4.1-6.5.1-7.9 0-2.7-.4-4.5-2.2-4.5-.9 0-1.7.5-2.2 1.3v9c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v3.1a4.6 4.6 0 0 1 4.6-3.4c2.2 0 3.6 1.2 4.2 3.5.7-2.1 2.7-3.6 4.9-3.5 2.9 0 4.5 2.2 4.5 6.2 0 1.9-.1 4.2-.1 6.5-.1.3.1.6.3.7l1.4 1.4v.1h-6.6zm-81.4-2l1.9 1.9v.1h-9.8v-.1l2-1.9c.2-.2.3-.4.3-.7V7.3c0-.5 0-1.2.1-1.8L11.4 22h-.1L4.5 6.8c-.1-.4-.2-.4-.3-.6v10c-.1.7 0 1.3.3 1.9l2.7 3.6v.1H0v-.1L2.7 18c.3-.6.4-1.3.3-1.9v-11c0-.5-.1-1.1-.5-1.5L.7 1.1V1h7l5.8 12.9L18.6 1h6.8v.1l-1.9 2.2c-.2.2-.3.5-.3.7v15.2c0 .2.1.5.3.6zm7.6-5.9c0 3.8 1.9 5.3 4.2 5.3 1.9.1 3.6-1 4.4-2.7h.1c-.8 3.7-3.1 5.5-6.5 5.5-3.7 0-7.2-2.2-7.2-7.4 0-5.5 3.5-7.6 7.3-7.6 3.1 0 6.4 1.5 6.4 6.2v.8h-8.7zm0-.8h4.3v-.8c0-3.9-.8-4.9-2-4.9-1.4.1-2.3 1.6-2.3 5.7z"></path></svg>
</div>
- </figure>
- <p name="f2a3" id="f2a3" class="graf graf--p graf-after--figure">Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: <a href="https://twitter.com/viticci" data-href="https://twitter.com/viticci" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">‏@viticci</a>: <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.</p>
- <p name="ae0c" id="ae0c" class="graf graf--p graf-after--p">Samantha is clearly sick of his crap: <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">‏@s_bielefeld</a>: <a href="https://twitter.com/viticci" data-href="https://twitter.com/viticci" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">@viticci</a> That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.</p>
- <p name="2047" id="2047" class="graf graf--p graf-after--p">Good for her. There’s being patient and being roadkill.</p>
- <p name="4139" id="4139" class="graf graf--p graf-after--p">Samantha does put the call out for her sources to maybe let her use their names:</p>
- <blockquote name="6626" id="6626" class="graf graf--blockquote graf-after--p">From all of you I heard from earlier, anyone care to go on record?</blockquote>
- <p name="8a7d" id="8a7d" class="graf graf--p graf-after--blockquote">My good friend, The Angry Drunk points out the obvious problem:</p>
- <blockquote name="68c9" id="68c9" class="graf graf--blockquote graf-after--p">Nobody’s going to go on record when they count on Marco’s friends for their PR.</blockquote>
- <p name="317d" id="317d" class="graf graf--p graf-after--blockquote">This is true. Again, the sites that are Friends of Marco:</p>
- <p name="9523" id="9523" class="graf graf--p graf-after--p">Daring Fireball</p>
- <p name="dbc7" id="dbc7" class="graf graf--p graf-after--p">The Loop</p>
- <p name="c706" id="c706" class="graf graf--p graf-after--p">SixColors</p>
- <p name="0acb" id="0acb" class="graf graf--p graf-after--p">iMore</p>
- <p name="8c8c" id="8c8c" class="graf graf--p graf-after--p">MacStories</p>
- <p name="643e" id="643e" class="graf graf--p graf-after--p">A few others, but I want this post to end one day.</p>
- <p name="6b76" id="6b76" class="graf graf--p graf-after--p">You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.</p>
- <p name="f7d1" id="f7d1" class="graf graf--p graf-after--p">Of course, the idea this could happen is just craycray:</p>
- <blockquote name="de59" id="de59" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/KevinColeman" data-href="https://twitter.com/KevinColeman" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@KevinColeman </a><a href="https://twitter.com/Angry_Drunk" data-href="https://twitter.com/Angry_Drunk" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">.@Angry_Drunk</a> <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a> Wow, you guys are veering right into crazy conspiracy theory territory. <a href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" data-href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">#JetFuelCantMeltSteelBeams</a></blockquote>
- <p name="f01b" id="f01b" class="graf graf--p graf-after--blockquote">Yeah. Because a mature person like Marco would never do anything like that.</p>
- <p name="7e30" id="7e30" class="graf graf--p graf-after--p">Of course, the real point on this is starting to happen:</p>
- <blockquote name="5d93" id="5d93" class="graf graf--blockquote graf-after--p">you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!</blockquote>
- <blockquote name="436b" id="436b" class="graf graf--blockquote graf-after--blockquote">I doubt I will.</blockquote>
- <p name="ac25" id="ac25" class="graf graf--p graf-after--blockquote">See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. <em class="markup--em markup--p-em">Great</em> job y’all.</p>
- <p name="07ba" id="07ba" class="graf graf--p graf-after--p">Some people aren’t even pretending. They’re just in full strawman mode:</p>
- <blockquote name="3d60" id="3d60" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/timkeller" data-href="https://twitter.com/timkeller" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@timkeller: </a>Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.</blockquote>
- <blockquote name="87f5" id="87f5" class="graf graf--blockquote graf-after--blockquote"><a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld: </a><a href="https://twitter.com/timkeller" data-href="https://twitter.com/timkeller" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@timkeller</a> I plainly stated that I don’t hold his doing this against him. Way to twist words.</blockquote>
- <p name="3720" id="3720" class="graf graf--p graf-after--blockquote">I think she’s earned her anger at this point.</p>
- <p name="7341" id="7341" class="graf graf--p graf-after--p">Don’t worry, Marco knows what the real problem is: most devs just suck —</p>
- <figure name="babe" id="babe" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 694px; max-height: 771px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 111.1%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*Fpb2Bvdx7Q-688vdm-NdkQ.png" data-width="694" data-height="771"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*Fpb2Bvdx7Q-688vdm-NdkQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*Fpb2Bvdx7Q-688vdm-NdkQ.png" /><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*Fpb2Bvdx7Q-688vdm-NdkQ.png" /></noscript></div>
- </div>
- </figure>
- <p name="503d" id="503d" class="graf graf--p graf-after--figure">I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)</p>
- <p name="b8c0" id="b8c0" class="graf graf--p graf-after--p">There are some bright spots. My favorite is when Building Twenty points out the <em class="markup--em markup--p-em">real</em> elephant in the room:</p>
- <blockquote name="36f4" id="36f4" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/BuildingTwenty" data-href="https://twitter.com/BuildingTwenty" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@BuildingTwenty</a>: Both <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> &amp; I wrote similar critiques of <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a>’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?</blockquote>
- <p name="06b9" id="06b9" class="graf graf--p graf-after--blockquote">Yup.</p>
- <p name="eff9" id="eff9" class="graf graf--p graf-after--p">Another bright spot are these comments from Ian Betteridge, who has been doing this <em class="markup--em markup--p-em">even longer than Marco</em>:</p>
- <blockquote name="18f1" id="18f1" class="graf graf--blockquote graf-after--p">You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.</blockquote>
- <blockquote name="9776" id="9776" class="graf graf--blockquote graf-after--blockquote">I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.</blockquote>
- <p name="8d44" id="8d44" class="graf graf--p graf-after--blockquote">To which Samantha understandably replies:</p>
- <blockquote name="7147" id="7147" class="graf graf--blockquote graf-after--p">and it’s honestly something I’m contemplating right now, whether to continue…</blockquote>
- <p name="e0cd" id="e0cd" class="graf graf--p graf-after--blockquote">Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?</p>
- <blockquote name="a379" id="a379" class="graf graf--blockquote graf-after--p">If I have this right, some people are outraged that a creator has decided to give away his work.</blockquote>
- <p name="f026" id="f026" class="graf graf--p graf-after--blockquote">No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.</p>
- <p name="e1c2" id="e1c2" class="graf graf--p graf-after--p">Noted Feminist Glenn Fleishman gets a piece of the action too:</p>
- <figure name="067c" id="067c" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 308px; max-height: 269px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 87.3%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image" data-image-id="1*lvOySry5gHHJfGU_bQXrzA.png" data-width="308" data-height="269"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*lvOySry5gHHJfGU_bQXrzA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*lvOySry5gHHJfGU_bQXrzA.png" /><noscript class="js-progressiveMedia-inner"><img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*lvOySry5gHHJfGU_bQXrzA.png" /></noscript></div>
+ <div class="r ao">
+ <svg width="35" height="35" viewbox="5 5 35 35" class="q">
+ <path d="M5 40V5h35v35H5zm8.56-12.63c0 .56-.03.69-.32 1.03L10.8 31.4v.4h6.97v-.4L15.3 28.4c-.29-.34-.34-.5-.34-1.03v-8.95l6.13 13.36h.71l5.26-13.36v10.64c0 .3 0 .35-.19.53l-1.85 1.8v.4h9.2v-.4l-1.83-1.8c-.18-.18-.2-.24-.2-.53V15.94c0-.3.02-.35.2-.53l1.82-1.8v-.4h-6.47l-4.62 11.55-5.2-11.54h-6.8v.4l2.15 2.63c.24.3.29.37.29.77v10.35z"></path></svg>
+ </div></a>
+ <div class="an g">
+ <div class="ap" id="lo-general-navbar-open-in-app-button">
+ <div class="aq an ao">
+ <a href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2Fd146a92473a1&amp;~feature=LoOpenInAppButton&amp;~channel=ShowPostUnderUser&amp;~stage=mobileNavBar&amp;source=post_page-----d146a92473a1----------------------" class="ar as at au av aw ax ay az ba bb bc bd be bf" rel="noopener nofollow">Open in app</a>
+ </div>
+ </div>
</div>
- </figure>
- <p name="4df8" id="4df8" class="graf graf--p graf-after--figure">I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a <em class="markup--em markup--p-em">very</em> technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.</p>
- <p name="bf45" id="bf45" class="graf graf--p graf-after--p graf--trailing">Great Feminists are often tools.</p>
- </div>
- </div>
- </section>
- <section name="c883" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="45bb" id="45bb" class="graf graf--p graf--leading">Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):</p>
- <blockquote name="c053" id="c053" class="graf graf--blockquote graf-after--p">I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t</blockquote>
- <blockquote name="7b5e" id="7b5e" class="graf graf--blockquote graf-after--blockquote">This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.</blockquote>
- <blockquote name="a321" id="a321" class="graf graf--blockquote graf-after--blockquote">Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility <a href="http://t.co/u79ZLsnhdM" data-href="http://t.co/u79ZLsnhdM" class="markup--anchor markup--blockquote-anchor" title="http://samanthabielefeld.com/the-elephant-in-the-room" rel="nofollow noopener" target="_blank">http://samanthabielefeld.com/the-elephant-in-the-room …</a></blockquote>
- <blockquote name="76fe" id="76fe" class="graf graf--blockquote graf-after--blockquote">thank you for posting this, it covers a lot of things people don’t like to talk about.</blockquote>
- <blockquote name="bf90" id="bf90" class="graf graf--blockquote graf-after--blockquote">I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.</blockquote>
- <blockquote name="0f66" id="0f66" class="graf graf--blockquote graf-after--blockquote graf--trailing">Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)</blockquote>
- </div>
- </div>
- </section>
- <section name="8ab2" class="section section--body section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="6134" id="6134" class="graf graf--p graf--leading">I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: <a href="http://www.businessinsider.com/marco-arment-2011-9" data-href="http://www.businessinsider.com/marco-arment-2011-9" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">http://www.businessinsider.com/marco-arment-2011-9</a></p>
- <p name="ba3c" id="ba3c" class="graf graf--p graf-after--p">Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.</p>
- <p name="a5a0" id="a5a0" class="graf graf--p graf-after--p">Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.</p>
- <p name="2a25" id="2a25" class="graf graf--p graf-after--p">And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.</p>
- <p name="a47a" id="a47a" class="graf graf--p graf-after--p">Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, <em class="markup--em markup--p-em">believe me</em> I understand. As bad as today was for her, I’ve seen worse. Much worse.</p>
- <p name="aa8e" id="aa8e" class="graf graf--p graf-after--p">But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.</p>
- <p name="34c5" id="34c5" class="graf graf--p graf-after--p">All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.</p>
- <p name="9710" id="9710" class="graf graf--p graf-after--p graf--trailing">So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.</p>
- </div>
- </div>
- </section>
- </div>
- <footer class="u-paddingTop10">
- <div class="container u-maxWidth740">
- <div class="row">
- <div class="col u-size12of12"></div>
- </div>
- <div class="row">
- <div class="col u-size12of12 js-postTags">
- <div class="u-paddingBottom10">
- <div class="tags tags--postTags tags--borderless"></div>
</div>
</div>
- </div>
- <div class="row js-postActionsFooter">
- <div class="postActions col u-size12of12">
- <div class="u-floatLeft buttonSet buttonSet--withLabels">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="d146a92473a1" data-is-icon-29px="true" data-has-recommend-list="true" data-source="post_actions_footer"><button class="button button--primary button--large button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/d146a92473a1" data-action-source="post_actions_footer"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.215 23.716c-.348.288-.984.826-1.376 1.158a.526.526 0 0 1-.68 0c-.36-.307-.92-.78-1.22-1.03C9.22 20.734 3 15.527 3 10.734 3 7.02 5.916 4 9.5 4c1.948 0 3.77.898 5 2.434C15.73 4.898 17.552 4 19.5 4c3.584 0 6.5 3.02 6.5 6.734 0 4.9-6.125 9.96-9.785 12.982zM19.5 5.2c-1.774 0-3.423.923-4.41 2.468a.699.699 0 0 1-.59.323.706.706 0 0 1-.59-.32c-.988-1.54-2.637-2.47-4.41-2.47-2.922 0-5.3 2.49-5.3 5.54 0 4.23 6.19 9.41 9.517 12.19.217.18.566.48.783.66l.952-.79c3.496-2.88 9.348-7.72 9.348-12.05 0-3.05-2.378-5.53-5.3-5.53z"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M19.5 4c-1.948 0-3.77.898-5 2.434C13.27 4.898 11.448 4 9.5 4 5.916 4 3 7.02 3 10.734c0 4.793 6.227 10 9.95 13.11.296.25.853.723 1.212 1.03.196.166.48.166.677 0 .39-.332 1.02-.87 1.37-1.158 3.66-3.022 9.79-8.08 9.79-12.982C26 7.02 23.08 4 19.5 4z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="show-recommends" data-action-value="d146a92473a1">168</button></div>
+ <div class="r bg w">
+ <div class="n o">
+ <div class="n g">
+ <div class="ap" id="lo-post-page-navbar-upsell-button">
+ <div>
+ <a href="https://medium.com/membership?source=upgrade_membership---nav_full------------------------" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener"><span class="bn b bo bp bq br r bs bt">Become a member</span></a>
+ </div>
+ </div>
+ <div class="ap" id="lo-post-page-navbar-sign-in-link">
+ <div class="aq r">
+ <span class="bn b bo bp bq br r bs bt"><span><a href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=--------------------------nav_reg-" class="ar as at au av aw ax ay az ba bb bc bd be bf" rel="noopener">Sign in</a></span></span>
+ </div>
+ </div>
</div>
- <div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="scroll-to-responses" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--response svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.27 20.058c1.89-1.826 2.754-4.17 2.754-6.674C24.024 8.21 19.67 4 14.1 4 8.53 4 4 8.21 4 13.384c0 5.175 4.53 9.385 10.1 9.385 1.007 0 2-.14 2.95-.41.285.25.592.49.918.7 1.306.87 2.716 1.31 4.19 1.31.276-.01.494-.14.6-.36a.625.625 0 0 0-.052-.65c-.61-.84-1.042-1.71-1.282-2.58a5.417 5.417 0 0 1-.154-.75zm-3.85 1.324l-.083-.28-.388.12a9.72 9.72 0 0 1-2.85.424c-4.96 0-8.99-3.706-8.99-8.262 0-4.556 4.03-8.263 8.99-8.263 4.95 0 8.77 3.71 8.77 8.27 0 2.25-.75 4.35-2.5 5.92l-.24.21v.32c0 .07 0 .19.02.37.03.29.1.6.19.92.19.7.49 1.4.89 2.08-.93-.14-1.83-.49-2.67-1.06-.34-.22-.88-.48-1.16-.74z"/></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="scroll-to-responses">15</button></div>
</div>
- <div class="u-floatRight buttonSet buttonSet--narrow"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"/></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"/></svg></span></button></div>
</div>
</div>
</div>
- <div class="js-postPromotionWrapper postPromotionWrapper" data-location-id="footer_above_post_attribution"></div>
- <div class="container u-maxWidth740 js-postAttributionFooterContainer u-paddingTop20 u-paddingBottom20 u-marginTop10 u-borderTopLightest u-xs-paddingTop10 u-xs-paddingBottom10">
- <div class="row js-postFooterInfo">
- <div class="col u-size12of12">
- <li class="u-block u-paddingBottom18 js-cardUser">
- <div class="u-marginLeft20 u-floatRight"><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button button--small u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="footer_card"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--small u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="footer_card_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span>
- </div>
- <div class="u-tableCell ">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch?source=footer_card" title="Go to the profile of John C. Welch" aria-label="Go to the profile of John C. Welch" data-action-source="footer_card" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/120/120/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--small" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="u-tableCell u-verticalAlignMiddle u-breakWord u-paddingLeft15">
- <h3 class="u-fontSizeBase u-lineHeightTighter u-marginBottom4"><a class="link link--primary u-accentColor--hoverTextNormal" href="https://medium.com/@johncwelch" property="cc:attributionName" title="Go to the profile of John C. Welch" aria-label="Go to the profile of John C. Welch" rel="author cc:attributionUrl" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a></h3>
- </div>
- </li>
+ </div>
+ </div>
+ </nav>
+ <div class="bu aj r bv ak"></div>
+ <div class="r y">
+ <div class="bw bx ai by bz ca cb cc cd ce cf" aria-hidden="true"></div>
+ <div class="cg bz ch ci cj bw by ck cl cm cn co cp cq cr cs ct cu cv cw" aria-hidden="true">
+ <div class="cx cy n o cz da">
+ <h2 class="bn db dc dd de">
+ Responses
+ </h2>
+ <div class="n cz">
+ <div class="r df dg">
+ <div class="az r df v">
+ <span class="bn b bo bp bq br r bs bt"><button class="bh bi at au av aw ax ay az ba bj bk bd bl bm" data-testid="close-button" aria-label="close"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M18.13 6.11l-5.61 5.61-5.6-5.61-.81.8 5.61 5.61-5.61 5.61.8.8 5.61-5.6 5.61 5.6.8-.8-5.6-5.6 5.6-5.62"></path></svg></button></span>
</div>
</div>
</div>
- <div class="js-postFooterPlacements"></div>
- <div class="u-padding0 u-clearfix u-backgroundGrayLightest u-print-hide supplementalPostContent js-responsesWrapper"></div>
- <div class="supplementalPostContent js-readNext"></div>
- <div class="supplementalPostContent js-heroPromo"></div>
- </footer>
- </article>
- </main>
- <div class="u-marginAuto u-maxWidth1000">
- <div class="js-postShareWidget u-foreground u-sm-hide u-transition--fadeOut300 u-fixed">
- <ul>
- <li class="u-uiTextSemibold u-textAlignCenter u-textColorNormal u-fontSizeSmallest u-textUppercase">Share</li>
- <li class="u-textAlignCenter">
- <div class="js-actionRecommend" data-post-id="d146a92473a1" data-is-icon-29px="true" data-is-vertical="true" data-has-recommend-list="true" data-source="post_share_widget"><button class="button button--primary button--large button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/d146a92473a1" data-action-source="post_share_widget"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.215 23.716c-.348.288-.984.826-1.376 1.158a.526.526 0 0 1-.68 0c-.36-.307-.92-.78-1.22-1.03C9.22 20.734 3 15.527 3 10.734 3 7.02 5.916 4 9.5 4c1.948 0 3.77.898 5 2.434C15.73 4.898 17.552 4 19.5 4c3.584 0 6.5 3.02 6.5 6.734 0 4.9-6.125 9.96-9.785 12.982zM19.5 5.2c-1.774 0-3.423.923-4.41 2.468a.699.699 0 0 1-.59.323.706.706 0 0 1-.59-.32c-.988-1.54-2.637-2.47-4.41-2.47-2.922 0-5.3 2.49-5.3 5.54 0 4.23 6.19 9.41 9.517 12.19.217.18.566.48.783.66l.952-.79c3.496-2.88 9.348-7.72 9.348-12.05 0-3.05-2.378-5.53-5.3-5.53z"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M19.5 4c-1.948 0-3.77.898-5 2.434C13.27 4.898 11.448 4 9.5 4 5.916 4 3 7.02 3 10.734c0 4.793 6.227 10 9.95 13.11.296.25.853.723 1.212 1.03.196.166.48.166.677 0 .39-.332 1.02-.87 1.37-1.158 3.66-3.022 9.79-8.08 9.79-12.982C26 7.02 23.08 4 19.5 4z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-block u-marginAuto u-marginTopNegative5" data-action="show-recommends" data-action-value="d146a92473a1">168</button></div>
- </li>
- <li class="u-textAlignCenter"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_share_widget"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"/></svg></span></button></li>
- <li class="u-textAlignCenter"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_share_widget"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"/></svg></span></button></li>
- </ul>
- </div>
- </div>
- <div class="u-fixed u-bottom0 u-sizeFullWidth u-backgroundWhite u-boxShadowTop u-borderBox u-paddingTop10 u-paddingBottom10 u-zIndexMetabar u-xs-paddingLeft10 u-xs-paddingRight10">
- <div class="u-maxWidth700 u-marginAuto u-flexCenter">
- <div class="u-fontSizeSmall u-flex1 u-flexCenter">
- <div class="u-flex0 u-inlineBlock u-paddingRight20 u-xs-paddingRight10">
- <a class="link avatar u-inline u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/80/80/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--smaller" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="u-flex1 u-inlineBlock">
- <div class="u-xs-hide">Never miss a story from<strong> John C. Welch</strong>, when you sign up for Medium. <a class="link link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@Medium/personalize-your-medium-experience-with-users-publications-tags-26a41ab1ee0c#.hx4zuv3mg" data-action-source="sticky_footer">Learn more</a></div>
- <div class="u-xs-show">Never miss a story from<strong> John C. Welch</strong></div>
- </div>
</div>
- <div class="u-marginLeft50 u-xs-marginAuto"><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-uiTextSemibold u-textUppercase u-fontSizeSmallest" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="sticky_footer"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary is-active u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton u-uiTextSemibold u-textUppercase u-fontSizeSmallest" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="sticky_footer_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Get updates</span></button></span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="loadingBar"></div>
- <script>
- // &lt;![CDATA[
- window["obvInit"] = function(opt_embedded) {
- window["obvInit"]["embedded"] = opt_embedded;
- window["obvInit"]["ready"] = true;
- }
- // ]]&gt;
- </script>
- <script>
- // &lt;![CDATA[
- var GLOBALS = {
- "audioUrl": "https://d1fcbxp97j4nb2.cloudfront.net",
- "baseUrl": "https://medium.com",
- "buildLabel": "27588-3cb8971",
- "currentUser": {
- "userId": "lo_4c2ff54882b4",
- "isVerified": false,
- "subscriberEmail": ""
- },
- "currentUserHasUnverifiedEmail": false,
- "isAuthenticated": false,
- "isCurrentUserVerified": false,
- "language": "en-us",
- "mediumTwitterScreenName": "medium",
- "miroUrl": "https://cdn-images-1.medium.com",
- "moduleUrls": {
- "base": "https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.iwEjGQsTOduS_qDGmWZZng.js",
- "notes": "https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.4fp6HSt83KvFshqkijtyyQ.js",
- "posters": "https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.sBoPOCjeITRjo9OsPC1VHA.js",
- "common-async": "https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.bQAtenPub_VKVyJSle9kcw.js",
- "stats": "https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.MbJUn4Gmy9lhzoIH0Xeu-Q.js",
- "misc-screens": "https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.xXy0Vq1iCvTjwpERpFYbLQ.js"
- },
- "previewConfig": {
- "weightThreshold": 1,
- "weightImageParagraph": 0.51,
- "weightIframeParagraph": 0.8,
- "weightTextParagraph": 0.08,
- "weightEmptyParagraph": 0,
- "weightP": 0.003,
- "weightH": 0.005,
- "weightBq": 0.003,
- "minPTextLength": 60,
- "truncateBoundaryChars": 20,
- "detectTitle": true,
- "detectTitleLevThreshold": 0.15
- },
- "productName": "Medium",
- "supportsEdit": true,
- "termsUrl": "//medium.com/policy/9db0094a1e0f",
- "textshotHost": "textshot.medium.com",
- "transactionId": "1487321852914:76ec3588d066",
- "useragent": {
- "browser": "firefox",
- "family": "firefox",
- "os": "mac",
- "version": 54,
- "supportsDesktopEdit": true,
- "supportsInteract": true,
- "supportsView": true,
- "isMobile": false,
- "isTablet": false,
- "isNative": false,
- "supportsFileAPI": true,
- "isTier1": true,
- "clientVersion": "",
- "unknownParagraphsBad": false,
- "clientChannel": "",
- "supportsRealScrollEvents": true,
- "supportsVhUnits": true,
- "ruinsViewportSections": false,
- "supportsHtml5Video": true,
- "supportsMagicUnderlines": true,
- "isWebView": false,
- "isFacebookWebView": false,
- "supportsProgressiveMedia": true,
- "supportsPromotedPosts": true,
- "isBot": false,
- "supportsScrollableMetabar": true
- },
- "variants": {
- "enable_fuzzy_number_experiment": true,
- "allow_access": true,
- "allow_signup": true,
- "allow_test_auth": "disallow",
- "signin_services": "twitter,facebook,google,email,google-fastidv",
- "signup_services": "twitter,facebook,google,email,google-fastidv",
- "android_rating_prompt_recommend_threshold": 5,
- "google_sign_in_android": true,
- "enable_onboarding": true,
- "ios_custom_miro_url": "https://cdn-images-1.medium.com",
- "reengagement_notification_duration": 3,
- "enable_adsnative_integration": true,
- "browsable_stream_config_bucket": "curated",
- "ios_small_post_preview_truncation_length": 5.5,
- "ios_large_post_preview_truncation_length": 5.5,
- "disable_ios_catalog_badging": true,
- "enable_ranked_feed_survey_promo": true,
- "enable_prepublish_share_settings": true,
- "enable_direct_auth_connect": true,
- "enable_post_import": true,
- "enable_sponsored_post_labelling": true,
- "promoted_story_placement_locations": "POST_PAGE_FOOTER",
- "prmt_to_people_experiment": "macro",
- "enable_related_reads_curse_words_filtering": true,
- "enable_search_collection_by_tag_recency_filter": true,
- "search_collection_by_tag_filter_min_votes": 10,
- "enable_drag_and_drop_ui": true,
- "enable_catalog_takeover_route": true,
- "show_more_placements": "control",
- "enable_crex_directory": true,
- "enable_client_digest": true,
- "honeypot_footer_copy_strategy": 1,
- "enable_sms_app_promo": true,
- "enable_home_stream_follow_suggestions": true,
- "enable_export_members": true,
- "enable_onboarding_users_by_tag": true,
- "enable_publication_popovers": true,
- "enable_hide_broken_links": true
- },
- "xsrfToken": "",
- "iosAppId": "828256236",
- "supportEmail": "[email protected]",
- "teamName": "Team Medium",
- "fp": {
- "/icons/favicon.svg": "https://cdn-static-1.medium.com/_/fp/icons/favicon.KjTfUJo7yJH_fCoUzzH3cg.svg",
- "/icons/favicon-dev-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-dev-editor.YKKRxBO8EMvIqhyCwIiJeQ.ico",
- "/icons/favicon-hatch-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-hatch-editor.BuEyHIqlyh2s_XEk4Rl32Q.ico",
- "/icons/favicon-medium-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.ico"
- },
- "authBaseUrl": "https://medium.com",
- "imageUploadSizeMb": 25,
- "isAuthDomainRequest": true,
- "algoliaApiEndpoint": "https://MQ57UUUQZ2-dsn.algolia.net",
- "algoliaAppId": "MQ57UUUQZ2",
- "algoliaSearchOnlyApiKey": "f2b83a373dfeab4286ac5e9da958a5a9",
- "iosAppStoreUrl": "https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&amp;mt=8",
- "iosAppLinkBaseUrl": "medium:",
- "algoliaIndexPrefix": "medium_",
- "androidPlayStoreUrl": "https://play.google.com/store/apps/details?id=com.medium.reader",
- "googleClientId": "216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com",
- "androidPackage": "com.medium.reader",
- "androidPlayStoreMarketScheme": "market://details?id=com.medium.reader",
- "googleAuthUri": "https://accounts.google.com/o/oauth2/auth",
- "androidScheme": "medium",
- "layoutData": {
- "useDynamicScripts": false,
- "googleAnalyticsTrackingCode": "UA-24232453-2",
- "jsShivUrl": "https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js",
- "useDynamicCss": false,
- "faviconUrl": "https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico",
- "faviconImageId": "1*W0nmth_X8nFKjn6BZ388UQ.png",
- "fontSets": [{
- "id": 1,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-base.by5Oi_VbnwEIvhnWIsuUjA.css"
- }, {
- "id": 4,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-lazy-base.g08Jj5TZPAiuPWj5YNUsSg.css"
- }, {
- "id": 6,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-latin-base.141WxxXgxGxNcfeza73H7Q.css"
- }, {
- "id": 7,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-lazy-latin-base.jMU532QDmysQMOINr-cr2A.css"
- }]
- },
- "authBaseUrlRev": "moc.muidem//:sptth",
- "isDnt": false,
- "stripePublishableKey": "pk_live_7FReX44VnNIInZwrIIx6ghjl",
- "archiveUploadSizeMb": 100,
- "paymentData": {
- "currencies": {
- "1": {
- "label": "US Dollar",
- "external": "usd"
- }
- },
- "countries": {
- "1": {
- "label": "United States of America",
- "external": "US"
- }
- },
- "accountTypes": {
- "1": {
- "label": "Individual",
- "external": "individual"
- },
- "2": {
- "label": "Company",
- "external": "company"
- }
- }
- },
- "previewConfig2": {
- "weightThreshold": 1,
- "weightImageParagraph": 0.05,
- "raiseImage": true,
- "enforceHeaderHierarchy": true,
- "isImageInsetRight": true
- },
- "isAmp": false,
- "iosScheme": "medium",
- "isSwBoot": false,
- "lightstep": {
- "accessToken": "ce5be895bef60919541332990ac9fef2",
- "carrier": "{\"ot-tracer-spanid\":\"193d6d6553cb4e95\",\"ot-tracer-traceid\":\"46e2064a75e734e0\",\"ot-tracer-sampled\":\"true\"}",
- "host": "collector-medium.lightstep.com"
- },
- "facebook": {
- "key": "542599432471018",
- "secret": "c14df7146e9052a1131f3c900c1f0644",
- "token": "542599432471018|1JqjIwxSfY9jOt_KwjWEl1R7T6I",
- "namespace": "medium-com",
- "scope": {
- "default": ["public_profile", "email", "user_friends"],
- "connect": ["public_profile", "email", "user_friends"],
- "login": ["public_profile", "email", "user_friends"],
- "share": ["public_profile", "email", "user_friends", "publish_actions"]
- },
- "smartPublishWhitelistedPublications": ["bcc38c8f6edf", "f3726e2a5878", "828a270689e", "81c7d351c056", "f30e42fd7ff8", "8bf1d7d3081b", "d16afa0ae7c", "d8f3f6ad9c31", "e74de0cedea9", "15f753907972", "c8c6a6b01ebd", "3412b9729488", "2ce4bbcf83bb", "544c7006046e", "7bfcdbc6b30a", "a268fd916824", "458a773bccd2"],
- "instantArticles": {
- "published": true,
- "developmentMode": false
- }
- },
- "mailingListArchiveUploadSizeMb": 2,
- "availableMembershipPlans": [],
- "isDoNotAuth": false,
- "goldfinchUrl": "https://goldfinch.medium.com"
- }
- // ]]&gt;
- </script>
- <script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.iwEjGQsTOduS_qDGmWZZng.js" async=""></script>
- <script>
- // &lt;![CDATA[
- window["obvInit"]({
- "value": {
- "id": "d146a92473a1",
- "versionId": "3fed73795ca4",
- "creatorId": "77a507c5ad19",
- "creator": {
- "userId": "77a507c5ad19",
- "name": "John C. Welch",
- "username": "johncwelch",
- "createdAt": 1408545892232,
- "lastPostCreatedAt": 1486930695056,
- "imageId": "0*qPHQu8WqsC6cV_ud.jpg",
- "backgroundImageId": "1*nYm-VLVTCtzpby_1jFUjRw.jpeg",
- "bio": "",
- "twitterScreenName": "",
- "socialStats": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- },
- "social": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- },
- "facebookAccountId": "10152302268220732",
- "allowNotes": 1,
- "type": "User"
- },
- "homeCollectionId": "",
- "title": "Samantha and The Great Big Lie",
- "detectedLanguage": "en",
- "latestVersion": "3fed73795ca4",
- "latestPublishedVersion": "3fed73795ca4",
- "hasUnpublishedEdits": false,
- "latestRev": 1797,
- "createdAt": 1444864250473,
- "updatedAt": 1449844114438,
- "acceptedAt": 0,
- "firstPublishedAt": 1444875555607,
- "latestPublishedAt": 1449844114438,
- "vote": false,
- "experimentalCss": "",
- "displayAuthor": "",
- "content": {
- "subtitle": "How to get shanked doing what people say they want",
- "bodyModel": {
- "paragraphs": [{
- "name": "b34c",
- "type": 3,
- "text": "Samantha and The Great Big Lie",
- "markups": []
- }, {
- "name": "97e7",
- "type": 1,
- "text": "How to get shanked doing what people say they want",
- "markups": []
- }, {
- "name": "df70",
- "type": 6,
- "text": "don’t preach to me\nMr. integrity",
- "markups": []
- }, {
- "name": "c979",
- "type": 1,
- "text": "(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)",
- "markups": []
- }, {
- "name": "342d",
- "type": 1,
- "text": "First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.",
- "markups": []
- }, {
- "name": "2e61",
- "type": 1,
- "text": "Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.",
- "markups": []
- }, {
- "name": "cd31",
- "type": 1,
- "text": "…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.",
- "markups": [{
- "type": 2,
- "start": 87,
- "end": 95
- }]
- }, {
- "name": "ae07",
- "type": 1,
- "text": "That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.",
- "markups": []
- }, {
- "name": "a02f",
- "type": 1,
- "text": "Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:",
- "markups": []
- }, {
- "name": "9213",
- "type": 10,
- "text": "With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.",
- "markups": [{
- "type": 3,
- "start": 93,
- "end": 108,
- "href": "http://www.marco.org/2015/10/09/overcast2",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "dfa5",
- "type": 10,
- "text": "Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.",
- "markups": [{
- "type": 3,
- "start": 26,
- "end": 44,
- "href": "https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "e55d",
- "type": 10,
- "text": "Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.",
- "markups": [{
- "type": 2,
- "start": 256,
- "end": 261
- }]
- }, {
- "name": "35fb",
- "type": 10,
- "text": "Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.",
- "markups": []
- }, {
- "name": "38e2",
- "type": 10,
- "text": "In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.",
- "markups": []
- }, {
- "name": "0481",
- "type": 1,
- "text": "None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.",
- "markups": []
- }, {
- "name": "5a45",
- "type": 1,
- "text": "So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.",
- "markups": []
- }, {
- "name": "3bc7",
- "type": 1,
- "text": "If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.",
- "markups": []
- }, {
- "name": "0fb2",
- "type": 1,
- "text": "The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.",
- "markups": [{
- "type": 3,
- "start": 118,
- "end": 141,
- "href": "http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 147,
- "end": 354,
- "href": "https://twitter.com/marcoarment/status/641330113934700544",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "9a6e",
- "type": 1,
- "text": "It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):",
- "markups": [{
- "type": 3,
- "start": 125,
- "end": 148,
- "href": "https://twitter.com/s_bielefeld/with_replies",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "3271",
- "type": 6,
- "text": "I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.",
- "markups": []
- }, {
- "name": "ec72",
- "type": 1,
- "text": "Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.",
- "markups": [{
- "type": 2,
- "start": 125,
- "end": 129
- }]
- }, {
- "name": "5cc4",
- "type": 1,
- "text": "But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:",
- "markups": [{
- "type": 2,
- "start": 52,
- "end": 58
- }]
- }, {
- "name": "4e5f",
- "type": 6,
- "text": "From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.",
- "markups": []
- }, {
- "name": "cee9",
- "type": 1,
- "text": "and here:",
- "markups": []
- }, {
- "name": "3f1b",
- "type": 6,
- "text": "I’m not knocking his success, he has put effort into his line of work, and has built his own life.",
- "markups": []
- }, {
- "name": "e527",
- "type": 1,
- "text": "and here:",
- "markups": []
- }, {
- "name": "3e4f",
- "type": 6,
- "text": "He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.",
- "markups": []
- }, {
- "name": "8a01",
- "type": 1,
- "text": "But still, you get the people telling her something she already acknowledge:",
- "markups": []
- }, {
- "name": "7685",
- "type": 6,
- "text": "I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.",
- "markups": []
- }, {
- "name": "b151",
- "type": 1,
- "text": "Thank you for restating something in the article. To the person who wrote it.",
- "markups": []
- }, {
- "name": "87bc",
- "type": 1,
- "text": "In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.",
- "markups": [{
- "type": 3,
- "start": 117,
- "end": 162,
- "href": "http://atp.fm/sponsor/",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "dbda",
- "type": 1,
- "text": "At first, she went with a simple formula:",
- "markups": []
- }, {
- "name": "1b4e",
- "type": 6,
- "text": "$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.",
- "markups": []
- }, {
- "name": "0b33",
- "type": 1,
- "text": "That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:",
- "markups": []
- }, {
- "name": "76d7",
- "type": 6,
- "text": "That’s $4k per ad, no? So more like $12–16k per episode.",
- "markups": []
- }, {
- "name": "a089",
- "type": 1,
- "text": "She’d already realized her mistake and fixed it.",
- "markups": []
- }, {
- "name": "b369",
- "type": 6,
- "text": "which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.",
- "markups": []
- }, {
- "name": "8b3b",
- "type": 1,
- "text": "Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.",
- "markups": [{
- "type": 2,
- "start": 24,
- "end": 47
- }]
- }, {
- "name": "135a",
- "type": 1,
- "text": "This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:",
- "markups": [{
- "type": 2,
- "start": 136,
- "end": 158
- }]
- }, {
- "name": "5e7e",
- "type": 6,
- "text": "especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.",
- "markups": []
- }, {
- "name": "6036",
- "type": 6,
- "text": "thus, guessing net income is more haphazard than stating approx. gross income.",
- "markups": []
- }, {
- "name": "aac1",
- "type": 1,
- "text": "Ye Gods. She’s not doing his taxes for him, her point is invalid?",
- "markups": []
- }, {
- "name": "600f",
- "type": 1,
- "text": "Then there’s the people who seem to have not read anything past what other people are telling them:",
- "markups": []
- }, {
- "name": "9b62",
- "type": 6,
- "text": "Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?",
- "markups": []
- }, {
- "name": "c18a",
- "type": 1,
- "text": "Just how spoon-fed do you have to be? Have you no teeth?",
- "markups": []
- }, {
- "name": "c445",
- "type": 1,
- "text": "Of course, Marco jumps in, and predictably, he’s snippy:",
- "markups": []
- }, {
- "name": "0c21",
- "type": 6,
- "text": "If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.",
- "markups": []
- }, {
- "name": "8f8d",
- "type": 1,
- "text": "If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.",
- "markups": []
- }, {
- "name": "cc97",
- "type": 1,
- "text": "Then Marco’s friends/fans get into it:",
- "markups": []
- }, {
- "name": "f9da",
- "type": 6,
- "text": "I really don’t understand why it’s anyone’s business",
- "markups": []
- }, {
- "name": "0094",
- "type": 1,
- "text": "Samantha is trying to qualify for sainthood at this point:",
- "markups": []
- }, {
- "name": "0105",
- "type": 6,
- "text": "It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.",
- "markups": []
- }, {
- "name": "cdd1",
- "type": 1,
- "text": "Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:",
- "markups": []
- }, {
- "name": "f56c",
- "type": 6,
- "text": "Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.",
- "markups": []
- }, {
- "name": "4fef",
- "type": 1,
- "text": "Wha?? Overcast 2 is absolutely free. Samantha points this out:",
- "markups": []
- }, {
- "name": "0f36",
- "type": 6,
- "text": "His app is free, that’s what sparked the article to begin with.",
- "markups": []
- }, {
- "name": "40d2",
- "type": 1,
- "text": "The response is literally a parallel to “How can there be global warming if it snowed today in my town?”",
- "markups": []
- }, {
- "name": "6760",
- "type": 6,
- "text": "If it’s free, how have I paid for it? Twice?",
- "markups": []
- }, {
- "name": "7b13",
- "type": 1,
- "text": "She is still trying:",
- "markups": []
- }, {
- "name": "44ba",
- "type": 6,
- "text": "You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0",
- "markups": []
- }, {
- "name": "2152",
- "type": 1,
- "text": "He is having none of it. IT SNOWED! SNOWWWWWWW!",
- "markups": []
- }, {
- "name": "99a6",
- "type": 6,
- "text": "Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.",
- "markups": []
- }, {
- "name": "5e6f",
- "type": 1,
- "text": "She however, is relentless:",
- "markups": []
- }, {
- "name": "1b0f",
- "type": 6,
- "text": "No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.",
- "markups": []
- }, {
- "name": "d24f",
- "type": 1,
- "text": "Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)",
- "markups": []
- }, {
- "name": "10e1",
- "type": 1,
- "text": "We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.",
- "markups": []
- }, {
- "name": "9b01",
- "type": 6,
- "text": "It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.",
- "markups": []
- }, {
- "name": "340c",
- "type": 1,
- "text": "(UNDERSTATEMENT OF THE YEAR)",
- "markups": []
- }, {
- "name": "7244",
- "type": 6,
- "text": "I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.",
- "markups": []
- }, {
- "name": "ffb1",
- "type": 6,
- "text": "It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.",
- "markups": []
- }, {
- "name": "e44e",
- "type": 1,
- "text": "She tries, oh lord, she tries:",
- "markups": []
- }, {
- "name": "a502",
- "type": 6,
- "text": "To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.",
- "markups": []
- }, {
- "name": "7dcd",
- "type": 1,
- "text": "But no, HE KNOWS HER POINT BETTER THAN SHE DOES:",
- "markups": []
- }, {
- "name": "a62a",
- "type": 6,
- "text": "No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.",
- "markups": []
- }, {
- "name": "df8c",
- "type": 1,
- "text": "Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.",
- "markups": []
- }, {
- "name": "521a",
- "type": 1,
- "text": "One guy tries to blame it all on Apple, another in a string of Wha??? moments:",
- "markups": []
- }, {
- "name": "d80d",
- "type": 6,
- "text": "the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility",
- "markups": []
- }, {
- "name": "db0b",
- "type": 1,
- "text": "Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:",
- "markups": []
- }, {
- "name": "7a78",
- "type": 6,
- "text": "Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?",
- "markups": []
- }, {
- "name": "6e09",
- "type": 1,
- "text": "Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.",
- "markups": []
- }, {
- "name": "b7db",
- "type": 1,
- "text": "One guy is “confused”:",
- "markups": []
- }, {
- "name": "3626",
- "type": 6,
- "text": "I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?",
- "markups": []
- }, {
- "name": "9daa",
- "type": 6,
- "text": "Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.",
- "markups": []
- }, {
- "name": "f6da",
- "type": 6,
- "text": "Alright, that’s fair. I was just confused by the $ and fame angle at first.",
- "markups": []
- }, {
- "name": "d5b1",
- "type": 1,
- "text": "Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?",
- "markups": [{
- "type": 2,
- "start": 82,
- "end": 133
- }]
- }, {
- "name": "58d0",
- "type": 1,
- "text": "People of course are telling her it’s her fault for mentioning a salient fact at all:",
- "markups": []
- }, {
- "name": "30d2",
- "type": 6,
- "text": "Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?",
- "markups": []
- }, {
- "name": "765b",
- "type": 6,
- "text": "Maybe because you went there with your article?",
- "markups": []
- }, {
- "name": "61fe",
- "type": 6,
- "text": "As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.",
- "markups": []
- }, {
- "name": "f17c",
- "type": 1,
- "text": "Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.",
- "markups": []
- }, {
- "name": "0b60",
- "type": 1,
- "text": "Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:",
- "markups": []
- }, {
- "name": "65ab",
- "type": 6,
- "text": "Because you decided to start a conversation about someone else’s personal shit. You started this war.",
- "markups": []
- }, {
- "name": "1adb",
- "type": 1,
- "text": "War. THIS. IS. WAR.",
- "markups": []
- }, {
- "name": "de94",
- "type": 1,
- "text": "This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit:",
- "markups": [{
- "type": 2,
- "start": 63,
- "end": 69
- }]
- }, {
- "name": "4458",
- "type": 6,
- "text": "That doesn’t explain why every other part of my article is being pushed aside.",
- "markups": []
- }, {
- "name": "aeac",
- "type": 1,
- "text": "She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.",
- "markups": []
- }, {
- "name": "0078",
- "type": 1,
- "text": "Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:",
- "markups": []
- }, {
- "name": "c4c9",
- "type": 6,
- "text": "You should never use an ad rate card to estimate ad revenue from any media product ever.",
- "markups": []
- }, {
- "name": "b66b",
- "type": 6,
- "text": "I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars",
- "markups": []
- }, {
- "name": "6907",
- "type": 1,
- "text": "How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!”",
- "markups": [{
- "type": 2,
- "start": 338,
- "end": 357
- }]
- }, {
- "name": "41ec",
- "type": 1,
- "text": "Samantha basically abases herself at his feet:",
- "markups": []
- }, {
- "name": "0b14",
- "type": 6,
- "text": "I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.",
- "markups": []
- }, {
- "name": "590f",
- "type": 1,
- "text": "I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.",
- "markups": []
- }, {
- "name": "69dc",
- "type": 1,
- "text": "Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.",
- "markups": []
- }, {
- "name": "5ab4",
- "type": 1,
- "text": "Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:",
- "markups": [{
- "type": 2,
- "start": 67,
- "end": 71
- }]
- }, {
- "name": "957b",
- "type": 6,
- "text": "so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.",
- "markups": []
- }, {
- "name": "0a7e",
- "type": 1,
- "text": "Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:",
- "markups": [{
- "type": 2,
- "start": 101,
- "end": 146
- }]
- }, {
- "name": "f7db",
- "type": 6,
- "text": "That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.",
- "markups": []
- }, {
- "name": "937f",
- "type": 1,
- "text": "Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:",
- "markups": []
- }, {
- "name": "c9dd",
- "type": 6,
- "text": "How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.",
- "markups": []
- }, {
- "name": "c522",
- "type": 1,
- "text": "Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?",
- "markups": []
- }, {
- "name": "907e",
- "type": 6,
- "text": "Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?",
- "markups": []
- }, {
- "name": "2158",
- "type": 1,
- "text": "That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.",
- "markups": []
- }, {
- "name": "13f8",
- "type": 1,
- "text": "Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:",
- "markups": []
- }, {
- "name": "96c6",
- "type": 6,
- "text": "Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!",
- "markups": []
- }, {
- "name": "5d3f",
- "type": 1,
- "text": "That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)",
- "markups": [{
- "type": 2,
- "start": 196,
- "end": 201
- }]
- }, {
- "name": "c07c",
- "type": 1,
- "text": "Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.",
- "markups": []
- }, {
- "name": "8b32",
- "type": 1,
- "text": "Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:",
- "markups": []
- }, {
- "name": "de26",
- "type": 6,
- "text": "Yup, before you existed!",
- "markups": []
- }, {
- "name": "a3bd",
- "type": 1,
- "text": "Really dude? I mean, I’m sorry about the penis, but really?",
- "markups": []
- }, {
- "name": "1c51",
- "type": 1,
- "text": "Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):",
- "markups": [{
- "type": 2,
- "start": 142,
- "end": 147
- }]
- }, {
- "name": "9848",
- "type": 6,
- "text": "Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.",
- "markups": []
- }, {
- "name": "f2a6",
- "type": 6,
- "text": "lol. Noted.",
- "markups": []
- }, {
- "name": "aed9",
- "type": 6,
- "text": "And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …",
- "markups": []
- }, {
- "name": "f9d8",
- "type": 6,
- "text": "… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.",
- "markups": []
- }, {
- "name": "f61c",
- "type": 6,
- "text": "haha. Thank you for the clarification.",
- "markups": []
- }, {
- "name": "5dd9",
- "type": 1,
- "text": "Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.",
- "markups": []
- }, {
- "name": "dc44",
- "type": 1,
- "text": "But now, the door has been cracked, and the cheap shots come out:",
- "markups": []
- }, {
- "name": "0c94",
- "type": 6,
- "text": "@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant",
- "markups": [{
- "type": 3,
- "start": 46,
- "end": 58,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 114,
- "end": 127,
- "href": "https://twitter.com/hashtag/fairelephant?src=hash",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "343b",
- "type": 1,
- "text": "(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)",
- "markups": []
- }, {
- "name": "09bf",
- "type": 1,
- "text": "Or this…conversation:",
- "markups": []
- }, {
- "name": "4d63",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*kbPh7V97eyRodSOw2-ALDw.png",
- "originalWidth": 398,
- "originalHeight": 542
- }
- }, {
- "name": "f2a3",
- "type": 1,
- "text": "Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.",
- "markups": [{
- "type": 3,
- "start": 140,
- "end": 149,
- "href": "https://twitter.com/viticci",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }, {
- "type": 3,
- "start": 151,
- "end": 163,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }]
- }, {
- "name": "ae0c",
- "type": 1,
- "text": "Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.",
- "markups": [{
- "type": 3,
- "start": 38,
- "end": 51,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }, {
- "type": 3,
- "start": 53,
- "end": 61,
- "href": "https://twitter.com/viticci",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }]
- }, {
- "name": "2047",
- "type": 1,
- "text": "Good for her. There’s being patient and being roadkill.",
- "markups": []
- }, {
- "name": "4139",
- "type": 1,
- "text": "Samantha does put the call out for her sources to maybe let her use their names:",
- "markups": []
- }, {
- "name": "6626",
- "type": 6,
- "text": "From all of you I heard from earlier, anyone care to go on record?",
- "markups": []
- }, {
- "name": "8a7d",
- "type": 1,
- "text": "My good friend, The Angry Drunk points out the obvious problem:",
- "markups": []
- }, {
- "name": "68c9",
- "type": 6,
- "text": "Nobody’s going to go on record when they count on Marco’s friends for their PR.",
- "markups": []
- }, {
- "name": "317d",
- "type": 1,
- "text": "This is true. Again, the sites that are Friends of Marco:",
- "markups": []
- }, {
- "name": "9523",
- "type": 1,
- "text": "Daring Fireball",
- "markups": []
- }, {
- "name": "dbc7",
- "type": 1,
- "text": "The Loop",
- "markups": []
- }, {
- "name": "c706",
- "type": 1,
- "text": "SixColors",
- "markups": []
- }, {
- "name": "0acb",
- "type": 1,
- "text": "iMore",
- "markups": []
- }, {
- "name": "8c8c",
- "type": 1,
- "text": "MacStories",
- "markups": []
- }, {
- "name": "643e",
- "type": 1,
- "text": "A few others, but I want this post to end one day.",
- "markups": []
- }, {
- "name": "6b76",
- "type": 1,
- "text": "You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.",
- "markups": []
- }, {
- "name": "f7d1",
- "type": 1,
- "text": "Of course, the idea this could happen is just craycray:",
- "markups": []
- }, {
- "name": "de59",
- "type": 6,
- "text": "@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 14,
- "href": "https://twitter.com/KevinColeman",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 14,
- "end": 27,
- "href": "https://twitter.com/Angry_Drunk",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 28,
- "end": 40,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 41,
- "end": 53,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 126,
- "end": 152,
- "href": "https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "f01b",
- "type": 1,
- "text": "Yeah. Because a mature person like Marco would never do anything like that.",
- "markups": []
- }, {
- "name": "7e30",
- "type": 1,
- "text": "Of course, the real point on this is starting to happen:",
- "markups": []
- }, {
- "name": "5d93",
- "type": 6,
- "text": "you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!",
- "markups": []
- }, {
- "name": "436b",
- "type": 6,
- "text": "I doubt I will.",
- "markups": []
- }, {
- "name": "ac25",
- "type": 1,
- "text": "See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.",
- "markups": [{
- "type": 2,
- "start": 153,
- "end": 158
- }]
- }, {
- "name": "07ba",
- "type": 1,
- "text": "Some people aren’t even pretending. They’re just in full strawman mode:",
- "markups": []
- }, {
- "name": "3d60",
- "type": 6,
- "text": "@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 12,
- "href": "https://twitter.com/timkeller",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "87f5",
- "type": 6,
- "text": "@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 14,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 14,
- "end": 24,
- "href": "https://twitter.com/timkeller",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "3720",
- "type": 1,
- "text": "I think she’s earned her anger at this point.",
- "markups": []
- }, {
- "name": "7341",
- "type": 1,
- "text": "Don’t worry, Marco knows what the real problem is: most devs just suck —",
- "markups": []
- }, {
- "name": "babe",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*Fpb2Bvdx7Q-688vdm-NdkQ.png",
- "originalWidth": 694,
- "originalHeight": 771
- }
- }, {
- "name": "503d",
- "type": 1,
- "text": "I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)",
- "markups": []
- }, {
- "name": "b8c0",
- "type": 1,
- "text": "There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:",
- "markups": [{
- "type": 2,
- "start": 80,
- "end": 84
- }]
- }, {
- "name": "36f4",
- "type": 6,
- "text": "@BuildingTwenty: Both @s_bielefeld &amp; I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 15,
- "href": "https://twitter.com/BuildingTwenty",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 22,
- "end": 34,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 66,
- "end": 78,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "06b9",
- "type": 1,
- "text": "Yup.",
- "markups": []
- }, {
- "name": "eff9",
- "type": 1,
- "text": "Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:",
- "markups": [{
- "type": 2,
- "start": 84,
- "end": 106
- }]
- }, {
- "name": "18f1",
- "type": 6,
- "text": "You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.",
- "markups": []
- }, {
- "name": "9776",
- "type": 6,
- "text": "I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.",
- "markups": []
- }, {
- "name": "8d44",
- "type": 1,
- "text": "To which Samantha understandably replies:",
- "markups": []
- }, {
- "name": "7147",
- "type": 6,
- "text": "and it’s honestly something I’m contemplating right now, whether to continue…",
- "markups": []
- }, {
- "name": "e0cd",
- "type": 1,
- "text": "Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?",
- "markups": []
- }, {
- "name": "a379",
- "type": 6,
- "text": "If I have this right, some people are outraged that a creator has decided to give away his work.",
- "markups": []
- }, {
- "name": "f026",
- "type": 1,
- "text": "No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.",
- "markups": []
- }, {
- "name": "e1c2",
- "type": 1,
- "text": "Noted Feminist Glenn Fleishman gets a piece of the action too:",
- "markups": []
- }, {
- "name": "067c",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*lvOySry5gHHJfGU_bQXrzA.png",
- "originalWidth": 308,
- "originalHeight": 269
- }
- }, {
- "name": "4df8",
- "type": 1,
- "text": "I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.",
- "markups": [{
- "type": 2,
- "start": 227,
- "end": 231
- }]
- }, {
- "name": "bf45",
- "type": 1,
- "text": "Great Feminists are often tools.",
- "markups": []
- }, {
- "name": "45bb",
- "type": 1,
- "text": "Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):",
- "markups": []
- }, {
- "name": "c053",
- "type": 6,
- "text": "I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t",
- "markups": []
- }, {
- "name": "7b5e",
- "type": 6,
- "text": "This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.",
- "markups": []
- }, {
- "name": "a321",
- "type": 6,
- "text": "Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room …",
- "markups": [{
- "type": 3,
- "start": 117,
- "end": 172,
- "href": "http://t.co/u79ZLsnhdM",
- "title": "http://samanthabielefeld.com/the-elephant-in-the-room",
- "rel": "nofollow",
- "anchorType": 0
- }]
- }, {
- "name": "76fe",
- "type": 6,
- "text": "thank you for posting this, it covers a lot of things people don’t like to talk about.",
- "markups": []
- }, {
- "name": "bf90",
- "type": 6,
- "text": "I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.",
- "markups": []
- }, {
- "name": "0f66",
- "type": 6,
- "text": "Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)",
- "markups": []
- }, {
- "name": "6134",
- "type": 1,
- "text": "I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9",
- "markups": [{
- "type": 3,
- "start": 276,
- "end": 326,
- "href": "http://www.businessinsider.com/marco-arment-2011-9",
- "title": "",
- "rel": "nofollow",
- "anchorType": 0
- }]
- }, {
- "name": "ba3c",
- "type": 1,
- "text": "Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.",
- "markups": []
- }, {
- "name": "a5a0",
- "type": 1,
- "text": "Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.",
- "markups": []
- }, {
- "name": "2a25",
- "type": 1,
- "text": "And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.",
- "markups": []
- }, {
- "name": "a47a",
- "type": 1,
- "text": "Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.",
- "markups": [{
- "type": 2,
- "start": 186,
- "end": 196
- }]
- }, {
- "name": "aa8e",
- "type": 1,
- "text": "But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.",
- "markups": []
- }, {
- "name": "34c5",
- "type": 1,
- "text": "All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.",
- "markups": []
- }, {
- "name": "9710",
- "type": 1,
- "text": "So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.",
- "markups": []
- }],
- "sections": [{
- "name": "55ff",
- "startIndex": 0
- }, {
- "name": "c360",
- "startIndex": 8
- }, {
- "name": "2ba2",
- "startIndex": 17
- }, {
- "name": "c883",
- "startIndex": 176
- }, {
- "name": "8ab2",
- "startIndex": 183
- }]
- },
- "postDisplay": {
- "coverless": true
- }
- },
- "virtuals": {
- "allowNotes": true,
- "previewImage": {
- "imageId": "1*kbPh7V97eyRodSOw2-ALDw.png",
- "filter": "",
- "backgroundSize": "",
- "originalWidth": 398,
- "originalHeight": 542,
- "strategy": "resample",
- "height": 0,
- "width": 0
- },
- "wordCount": 4605,
- "imageCount": 3,
- "readingTime": 17.92735849056604,
- "subtitle": "How to get shanked doing what people say they want",
- "usersBySocialRecommends": [],
- "recommends": 168,
- "socialRecommends": [],
- "isBookmarked": false,
- "tags": [],
- "socialRecommendsCount": 0,
- "responsesCreatedCount": 15,
- "links": {
- "entries": [{
- "url": "https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3",
- "alts": [{
- "type": 2,
- "url": "medium://p/a79fc07218f3"
- }, {
- "type": 3,
- "url": "medium://p/a79fc07218f3"
- }]
- }],
- "version": "0.3",
- "generatedAt": 1472016079116
- },
- "isLockedPreviewOnly": false,
- "takeoverId": "",
- "metaDescription": "",
- "totalClapCount": 0
- },
- "coverless": true,
- "slug": "samantha-and-the-great-big-lie",
- "translationSourcePostId": "",
- "translationSourceCreatorId": "",
- "isApprovedTranslation": false,
- "inResponseToPostId": "",
- "inResponseToRemovedAt": 0,
- "isTitleSynthesized": true,
- "allowResponses": true,
- "importedUrl": "",
- "importedPublishedAt": 0,
- "visibility": 0,
- "uniqueSlug": "samantha-and-the-great-big-lie-d146a92473a1",
- "previewContent": {
- "bodyModel": {
- "paragraphs": [{
- "name": "b34c",
- "type": 3,
- "text": "Samantha and The Great Big Lie",
- "markups": [],
- "alignment": 1
- }, {
- "name": "97e7",
- "type": 1,
- "text": "How to get shanked doing what people say they want",
- "markups": [],
- "alignment": 1
- }, {
- "name": "df70",
- "type": 6,
- "text": "don’t preach to me\nMr. integrity",
- "markups": [],
- "alignment": 1
- }, {
- "name": "c979",
- "type": 1,
- "text": "(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non…",
- "markups": [],
- "alignment": 1
- }],
- "sections": [{
- "startIndex": 0
- }]
- },
- "isFullContent": false
- },
- "license": 0,
- "inResponseToMediaResourceId": "",
- "canonicalUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "approvedHomeCollectionId": "",
- "newsletterId": "",
- "webCanonicalUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "mediumUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "migrationId": "",
- "notifyFollowers": true,
- "notifyTwitter": false,
- "isSponsored": false,
- "isRequestToPubDisabled": false,
- "notifyFacebook": false,
- "responseHiddenOnParentPostAt": 0,
- "isSeries": false,
- "isSubscriptionLocked": false,
- "type": "Post"
- },
- "mentionedUsers": [],
- "collaborators": [],
- "membershipPlans": [],
- "collectionUserRelations": [],
- "mode": null,
- "references": {
- "User": {
- "77a507c5ad19": {
- "userId": "77a507c5ad19",
- "name": "John C. Welch",
- "username": "johncwelch",
- "createdAt": 1408545892232,
- "lastPostCreatedAt": 1486930695056,
- "imageId": "0*qPHQu8WqsC6cV_ud.jpg",
- "backgroundImageId": "1*nYm-VLVTCtzpby_1jFUjRw.jpeg",
- "bio": "",
- "twitterScreenName": "",
- "socialStats": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- },
- "social": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- },
- "facebookAccountId": "10152302268220732",
- "allowNotes": 1,
- "type": "User"
- }
- },
- "Social": {
- "77a507c5ad19": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- }
- },
- "SocialStats": {
- "77a507c5ad19": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- }
- }
- }
- })
- // ]]&gt;
- </script>
-</body>
-
-</html>===========^CCrash Annotation GraphicsCriticalError: |[C0][GFX1-]: Receive IPC close with reason=AbnormalShutdown (t=7.53758) [GFX1-]: Receive IPC close with reason=AbnormalShutdown localhost:mozilla-central itoyxd$ localhost:mozilla-central itoyxd$ localhost:mozilla-central itoyxd$ ./mach run 0:00.20 /Users/itoyxd/evan/dev/mozilla/mozilla-central/obj-firefox/dist/Nightly.app/Contents/MacOS/firefox -no-remote -foreground -profile /Users/itoyxd/evan/dev/mozilla/mozilla-central/obj-firefox/tmp/scratch_user 2017-02-17 16:57:43.743 plugin-container[11969:394160] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x943f, name = 'com.apple.tsm.portname' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:43.743 plugin-container[11969:394160] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x4907, name = 'com.apple.CFPasteboardClient' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:43.743 plugin-container[11969:394160] void __CFPasteboardSetup() : Failed to allocate communication port for com.apple.CFPasteboardClient; this is likely due to sandbox restrictions 2017-02-17 16:57:50.234 plugin-container[11972:394329] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x953f, name = 'com.apple.tsm.portname' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:50.235 plugin-container[11972:394329] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x4b0b, name = 'com.apple.CFPasteboardClient' See /usr/include/servers/bootstrap_defs.h for the error codes. 2017-02-17 16:57:50.235 plugin-container[11972:394329] void __CFPasteboardSetup() : Failed to allocate communication port for com.apple.CFPasteboardClient; this is likely due to sandbox restrictions ===========
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:cc="http://creativecommons.org/ns#">
-
-<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# medium-com: http://ogp.me/ns/fb/medium-com#">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>Samantha and The Great Big Lie – Medium</title>
- <link rel="canonical" href="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" />
- <meta name="title" content="Samantha and The Great Big Lie" />
- <meta name="referrer" content="always" />
- <meta name="description" content="(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a…" />
- <meta property="og:title" content="Samantha and The Great Big Lie" />
- <meta property="og:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1#.h9kzgon9m" />
- <meta property="og:image" content="https://cdn-images-1.medium.com/max/1200/1*kbPh7V97eyRodSOw2-ALDw.png" />
- <meta property="fb:app_id" content="542599432471018" />
- <meta property="og:description" content="How to get shanked doing what people say they want" />
- <meta name="twitter:description" content="How to get shanked doing what people say they want" />
- <meta name="twitter:image:src" content="https://cdn-images-1.medium.com/max/1200/1*kbPh7V97eyRodSOw2-ALDw.png" />
- <link rel="publisher" href="https://plus.google.com/103654360130207659246" />
- <link rel="author" href="https://medium.com/@johncwelch" />
- <meta name="author" content="John C. Welch" />
- <meta property="og:type" content="article" />
- <meta name="twitter:card" content="summary_large_image" />
- <meta property="article:publisher" content="https://www.facebook.com/medium" />
- <meta property="article:author" content="John C. Welch" />
- <meta property="fb:smart_publish:robots" content="noauto" />
- <meta name="robots" content="index, follow" />
- <meta property="article:published_time" content="2015-10-15T02:19:15.607Z" />
- <meta name="twitter:site" content="@Medium" />
- <meta property="og:site_name" content="Medium" />
- <meta name="twitter:label1" value="Reading time" />
- <meta name="twitter:data1" value="18 min read" />
- <script type="text/javascript" async="" src="https://ssl.google-analytics.com/ga.js"></script>
- <script type="application/ld+json">
- {
- "@context": "http://schema.org",
- "@type": "NewsArticle",
- "image": {
- "@type": "ImageObject",
- "width": 398,
- "height": 542,
- "url": "https://cdn-images-1.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png"
- },
- "datePublished": "2015-10-15T02:19:15.607Z",
- "dateModified": "2015-12-11T14:28:34.438Z",
- "headline": "Samantha and The Great Big Lie",
- "name": "Samantha and The Great Big Lie",
- "keywords": [],
- "author": {
- "@type": "Person",
- "name": "John C. Welch",
- "url": "https://medium.com/@johncwelch"
- },
- "creator": ["John C. Welch"],
- "mainEntityOfPage": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1"
- }
- </script>
- <meta name="twitter:app:name:iphone" content="Medium" />
- <meta name="twitter:app:id:iphone" content="828256236" />
- <meta name="twitter:app:url:iphone" content="medium://p/d146a92473a1" />
- <meta property="al:ios:app_name" content="Medium" />
- <meta property="al:ios:app_store_id" content="828256236" />
- <meta property="al:android:package" content="com.medium.reader" />
- <meta property="al:android:app_name" content="Medium" />
- <meta property="al:ios:url" content="medium://p/d146a92473a1" />
- <meta property="al:android:url" content="medium://p/d146a92473a1" />
- <meta property="al:web:url" content="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1#.h9kzgon9m" />
- <link rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
- <link rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/d146a92473a1" />
- <meta name="theme-color" content="#000000" />
- <link rel="stylesheet" type="text/css" href="https://cdn-static-1.medium.com/_/fp/css/fonts-latin-base.141WxxXgxGxNcfeza73H7Q.css" />
- <link rel="stylesheet" href="https://cdn-static-1.medium.com/_/fp/css/main-base.FCIkh6GVUOig4-7oFthH1Q.css" />
- <script>
- if (window.top !== window.self) window.top.location = window.self.location.href;
- var OB_startTime = new Date().getTime();
- var OB_loadErrors = [];
-
- function _onerror(e) {
- OB_loadErrors.push(e)
- };
- if (document.addEventListener) document.addEventListener("error", _onerror, true);
- else if (document.attachEvent) document.attachEvent("onerror", _onerror);
-
- function _asyncScript(u) {
- var d = document,
- f = d.getElementsByTagName("script")[0],
- s = d.createElement("script");
- s.type = "text/javascript";
- s.async = true;
- s.src = u;
- f.parentNode.insertBefore(s, f);
- }
-
- function _asyncStyles(u) {
- var d = document,
- f = d.getElementsByTagName("script")[0],
- s = d.createElement("link");
- s.rel = "stylesheet";
- s.href = u;
- f.parentNode.insertBefore(s, f);
- return s
- }
- var _gaq = _gaq || [];
- _gaq.push(["_setAccount", "UA-24232453-2"]);
- _gaq.push(["_setDomainName", window.location.hostname]);
- _gaq.push(["_setAllowLinker", true]);
- _gaq.push(["_trackPageview"]);
- _asyncScript(("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js");
- (new Image()).src = "/_/stat?event=pixel.load&amp;origin=" + encodeURIComponent(location.origin);
- </script>
- <!--[if lt IE 9]><script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js"></script><![endif]-->
- <link rel="icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico" class="js-favicon" />
- <link rel="apple-touch-icon" sizes="152x152" href="https://cdn-images-1.medium.com/fit/c/304/304/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="120x120" href="https://cdn-images-1.medium.com/fit/c/240/240/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="76x76" href="https://cdn-images-1.medium.com/fit/c/152/152/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="apple-touch-icon" sizes="60x60" href="https://cdn-images-1.medium.com/fit/c/120/120/1*W0nmth_X8nFKjn6BZ388UQ.png" />
- <link rel="mask-icon" href="https://cdn-static-1.medium.com/_/fp/icons/favicon.KjTfUJo7yJH_fCoUzzH3cg.svg" color="#171717" />
-</head>
-
-<body itemscope="" class="postShowScreen browser-firefox os-mac is-withMagicUnderlines is-js" data-action-scope="_actionscope_0">
- <script>
- document.body.className = document.body.className.replace(/(^|\s)is-noJs(\s|$)/, "$1is-js$2")
- </script>
- <div class="site-main surface-container" id="container">
- <div class="butterBar butterBar--error" data-action-scope="_actionscope_1"></div>
- <div class="surface" id="_obv.shell._surface_1487321871814" style="display: block; visibility: visible;">
- <div class="screenContent surface-content is-supplementalPostContentLoaded" data-used="true" data-action-scope="_actionscope_2"><canvas class="canvas-renderer" width="1280" height="710"></canvas>
- <div class="container u-maxWidth740 u-xs-margin0 notesPositionContainer js-notesPositionContainer">
- <div class="notesMarkers" data-action-scope="_actionscope_4">
- <div class="paragraphControls js-paragraphControl js-paragraphControl-69dc u-noUserSelect is-visible" style="top: 11448px;"><span class="paragraphControls-itemText"><button class="button button--chromeless" data-action="select-anchor" data-action-value="69dc">Top highlight</button></span></div>
- <div class="paragraphControls js-paragraphControl js-paragraphControl-aa8e u-noUserSelect is-visible" style="top: 21504px;">
- <div class="notesMarker u-noUserSelect" data-action="select-anchor" data-action-value="aa8e"><span class="svgIcon svgIcon--asteriskFilled svgIcon--19px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="19" height="19" viewBox="0 0 19 19"><path d="M14.78 8.07a8.681 8.681 0 0 0-.427-1.383.478.478 0 0 0-.584-.27l-3.12.77V4.034c0-.247-.19-.48-.43-.5a7.23 7.23 0 0 0-1.38 0c-.24.02-.43.253-.43.5V7.19L5.3 6.415a.48.48 0 0 0-.583.27c-.18.448-.324.91-.426 1.383-.05.24.1.5.32.58l3.06.754-1.98 2.956c-.14.196-.13.502.04.67.34.332.7.632 1.09.896.2.136.49.077.63-.117l2.09-3.114 2.09 3.112c.15.193.43.252.63.116.39-.26.75-.56 1.09-.89.17-.17.19-.47.04-.67L11.4 9.41l3.06-.76a.517.517 0 0 0 .32-.58" fill-rule="evenodd"/></svg></span></div><span class="paragraphControls-itemText"><button class="button button--chromeless" data-action="select-anchor" data-action-value="aa8e"></button></span></div>
- </div>
- </div>
- <div class="metabar u-clearfix js-metabar is-hiddenWhenMinimized">
- <div class="metabar-inner u-marginAuto u-maxWidth1000 u-paddingLeft20 u-paddingRight20 js-metabarMiddle">
- <div class="metabar-block metabar-block--left u-floatLeft u-height65 u-xs-height56"><a href="https://medium.com/" class="siteNav-logo" data-log-event="home"><span class="svgIcon svgIcon--logoNew svgIcon--45px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="45" height="45" viewBox="-17 18 45 45" data-multipart="true"><path d="M11.525 28.078c-.472-.225-.858.002-.858.506v20.044l8.616 4.113c.948.46 1.717.14 1.717-.7v-19.3a.22.22 0 0 0-.124-.19l-9.35-4.46v-.01z"/><path d="M.333 43.696l9.83-15.247c.278-.43.89-.6 1.36-.38l9.364 4.47c.06.03.082.1.047.15L10.666 48.63.333 43.698v-.002z"/><path d="M-8.57 28.35c-.786-.375-1.053-.096-.592.62L.333 43.696l10.333 4.932L.356 32.635a.156.156 0 0 0-.06-.054l-8.866-4.23z"/><path d="M.333 52.033c0 .84-.643 1.22-1.43.844l-8.045-3.84c-.472-.224-.858-.82-.858-1.325V28.89c0-.672.515-.976 1.145-.675l9.133 4.36a.092.092 0 0 1 .055.084v19.37z"/></svg></span><span class="u-textScreenReader">Homepage</span></a></div>
- <div class="metabar-block u-floatRight u-xs-absolute u-xs-textAlignRight u-xs-right0 u-xs-marginRight20 u-height65 u-xs-height56">
- <div class="buttonSet"><a class="button button--primary button--chromeless u-accentColor--buttonNormal is-inSiteNavBar u-lineHeight30 u-height32" href="https://medium.com/m/signin?redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1" data-action="sign-in-prompt" data-redirect="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1" data-action-source="nav_signup">Sign in / Sign up</a></div>
+ <div class="dh r">
+ <div class="di dj">
+ <div class="n cz">
+ <div class="dk dl dm r dn"></div>
+ <div class="do dp r">
+ <div class="dq dr ds r dn"></div>
+ <div class="dr dt r dn"></div>
+ </div>
+ </div>
+ <div class="du r">
+ <div class="dq dv ai r dn"></div>
+ <div class="dq dv ai r dn"></div>
+ <div class="dv dw r dn"></div>
+ </div>
+ </div>
</div>
</div>
</div>
- <div class="metabar metabar--spacer js-metabarSpacer u-height65 u-xs-height56"></div>
- <main role="main">
- <article class=" u-sizeViewHeightMin100 u-overflowHidden postArticle postArticle--full u-marginBottom40" data-scroll="native" lang="en">
- <header class="container u-maxWidth740">
- <div class="postMetaHeader u-paddingBottom10 row">
- <div class="col u-size12of12 js-postMetaLockup">
- <div class="postMetaLockup postMetaLockup--authorWithBio u-flex js-postMetaLockup">
- <div class="u-flex0">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/80/80/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--smaller" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="u-flex1 u-paddingLeft15 u-overflowHidden"><a class="link link link--darken link--darker u-baseColor--link" href="https://medium.com/@johncwelch?source=post_header_lockup" data-action="show-user-card" data-action-source="post_header_lockup" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button u-paddingLeft10 u-paddingRight10 u-height19 u-lineHeight13 u-verticalAlignMiddle u-fontSizeSmallest u-uiTextMedium u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-marginLeft10 u-marginTopNegative2 u-xs-hide" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="post_header_lockup"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary u-paddingLeft10 u-paddingRight10 u-height19 u-lineHeight13 u-verticalAlignMiddle u-fontSizeSmallest u-uiTextMedium u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton u-marginLeft10 u-marginTopNegative2 u-xs-hide" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="post_header_lockup_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span>
- <div class="postMetaInline js-testPostMetaInlineSupplemental"><time datetime="2015-10-15T02:19:15.607Z">Oct 15, 2015</time><span class="middotDivider u-fontSizeSmallest"></span><span class="readingTime" title="18 min read"></span></div>
+ <article>
+ <section class="dx dy dz ea ai eb ck r"></section>
+ <div>
+ <div class="s u ec ed ee cf"></div>
+ <section class="ef eg eh ei ej">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <div>
+ <h1 id="b34c" class="el em bo en b eo ep eq er es et eu ev ew ex ey ez fa fb fc fd de">
+ Samantha and The Great Big Lie
+ </h1>
+ <div class="fe">
+ <div class="n da ff fg fh">
+ <div class="o n">
+ <div>
+ <a rel="noopener" href="/@johncwelch?source=post_page-----d146a92473a1----------------------"><img alt="John C. Welch" class="r fi fj fk" src="https://miro.medium.com/fit/c/96/96/0*qPHQu8WqsC6cV_ud.jpg" width="48" height="48" /></a>
+ </div>
+ <div class="fl ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="fm n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo fp bp fq fr fs ft fu fv de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@johncwelch?source=post_page-----d146a92473a1----------------------">John C. Welch</a></span></span>
+ <div class="do r bg h">
+ <span><button class="fx de q fy fz ga gb gc ba bl gd ge gf gg gh gi gj bn b bo gk gl br gm gn ck go gp">Follow</button></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div>
+ <span class="bn b bo bp bq br r bs bt"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1?source=post_page-----d146a92473a1----------------------">Oct 15, 2015</a> <!-- -->·<!-- --> <!-- -->18<!-- --> min read</span>
+ </div>
+ </div>
+ </div>
+ <div class="n gq gr gs gt gu gv gw gx y">
+ <div class="n o">
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" class="bt">
+ <path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></button>
+ </div>
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="bt">
+ <path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button>
+ </div>
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" class="bt">
+ <path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></button>
+ </div>
+ <div class="gz r">
+ <div class="bt">
+ <span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_actions_header--------------------------bookmark_header-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span>
+ </div>
+ </div>
+ <div class="ha r am"></div>
+ </div>
+ </div>
+ </div>
</div>
</div>
+ <p id="97e7" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ How to get shanked doing what people say they want
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="df70" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ don’t preach to me<br />
+ Mr. integrity
+ </p>
+ </blockquote>
+ <p id="c979" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ (EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)
+ </p>
+ <p id="342d" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.
+ </p>
+ <p id="2e61" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.
+ </p>
+ <p id="cd31" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ …sorry, I should explain “The Great Big Lie”. There are several, but in this case, our <em class="ic">specific</em> instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.
+ </p>
+ <p id="ae07" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.
+ </p>
</div>
</div>
- </header>
- <div class="postArticle-content js-postField js-notesSource js-trackedPost" data-post-id="d146a92473a1" data-source="post_page" data-tracking-context="postPage" data-scroll="native">
- <section name="55ff" class="section section--body section--first">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <h1 name="b34c" id="b34c" class="graf graf--h3 graf--leading graf--title">Samantha and The Great Big Lie</h1>
- <p name="97e7" id="97e7" class="graf graf--p graf-after--h3">How to get shanked doing what people say they want</p>
- <blockquote name="df70" id="df70" class="graf graf--blockquote graf-after--p">don’t preach to me<br />Mr. integrity</blockquote>
- <p name="c979" id="c979" class="graf graf--p graf-after--blockquote">(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)</p>
- <p name="342d" id="342d" class="graf graf--p graf-after--p">First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.</p>
- <p name="2e61" id="2e61" class="graf graf--p graf-after--p">Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.</p>
- <p name="cd31" id="cd31" class="graf graf--p graf-after--p">…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our <em class="markup--em markup--p-em">specific</em> instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.</p>
- <p name="ae07" id="ae07" class="graf graf--p graf-after--p graf--trailing">That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.</p>
- </div>
- </div>
- </section>
- <section name="c360" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="a02f" id="a02f" class="graf graf--p graf--leading">Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:</p>
- <ol class="postList">
- <li name="9213" id="9213" class="graf graf--li graf-after--p">With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a <a href="http://www.marco.org/2015/10/09/overcast2" data-href="http://www.marco.org/2015/10/09/overcast2" class="markup--anchor markup--li-anchor" rel="nofollow noopener" target="_blank">patronage model</a> that will probably be successful for him.</li>
- <li name="dfa5" id="dfa5" class="graf graf--li graf-after--li">Arment’s insistence that “<a href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" data-href="https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3" class="markup--anchor markup--li-anchor" target="_blank">anyone can do this</a>” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.</li>
- <li name="e55d" id="e55d" class="graf graf--li graf-after--li">Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, <em class="markup--em markup--li-em">Marco</em>, not only don’t have, but have little chance of attaining anytime soon.</li>
- <li name="35fb" id="35fb" class="graf graf--li graf-after--li">Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.</li>
- <li name="38e2" id="38e2" class="graf graf--li graf-after--li">In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.</li>
- </ol>
- <p name="0481" id="0481" class="graf graf--p graf-after--li">None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.</p>
- <p name="5a45" id="5a45" class="graf graf--p graf-after--p">So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.</p>
- <p name="3bc7" id="3bc7" class="graf graf--p graf-after--p graf--trailing">If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.</p>
- </div>
- </div>
- </section>
- <section name="2ba2" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
+ </section>
+ <hr class="id fo ie if ig ih ii ij ik il im in" />
+ <section class="ef eg eh ei ej">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <p id="a02f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:
+ </p>
+ <ol class="">
+ <li id="9213" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy io ip iq de">With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a <a href="http://www.marco.org/2015/10/09/overcast2" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">patronage model</a> that will probably be successful for him.
+ </li>
+ <li id="dfa5" class="hb hc bo hd b he iv hg hh hi iw hk hl hm ix ho hp hq iy hs ht hu iz hw hx hy io ip iq de">Arment’s insistence that “<a class="bh gp ir is it iu" target="_blank" rel="noopener" href="/@marcoarment/pragmatic-app-pricing-a79fc07218f3">anyone can do this</a>” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.
+ </li>
+ <li id="e55d" class="hb hc bo hd b he iv hg hh hi iw hk hl hm ix ho hp hq iy hs ht hu iz hw hx hy io ip iq de">Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, <em class="ic">Marco</em>, not only don’t have, but have little chance of attaining anytime soon.
+ </li>
+ <li id="35fb" class="hb hc bo hd b he iv hg hh hi iw hk hl hm ix ho hp hq iy hs ht hu iz hw hx hy io ip iq de">Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.
+ </li>
+ <li id="38e2" class="hb hc bo hd b he iv hg hh hi iw hk hl hm ix ho hp hq iy hs ht hu iz hw hx hy io ip iq de">In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.
+ </li>
+ </ol>
+ <p id="0481" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.
+ </p>
+ <p id="5a45" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.
+ </p>
+ <p id="3bc7" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.
+ </p>
</div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="0fb2" id="0fb2" class="graf graf--p graf--leading">The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is <a href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" data-href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">enough to shut him down</a>, who <a href="https://twitter.com/marcoarment/status/641330113934700544" data-href="https://twitter.com/marcoarment/status/641330113934700544" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things</a>, is, in a single word, disgusting. Vomitous even.</p>
- <p name="9a6e" id="9a6e" class="graf graf--p graf-after--p">It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in <a href="https://twitter.com/s_bielefeld/with_replies" data-href="https://twitter.com/s_bielefeld/with_replies" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">Samantha’s Twitter Feed</a>. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):</p>
- <blockquote name="3271" id="3271" class="graf graf--blockquote graf-after--p">I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.</blockquote>
- <p name="ec72" id="ec72" class="graf graf--p graf-after--blockquote">Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is <em class="markup--em markup--p-em">such</em> a lie.</p>
- <p name="5cc4" id="5cc4" class="graf graf--p graf-after--p">But it gets better. First, you have the “hey, Marco <em class="markup--em markup--p-em">earned</em> his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:</p>
- <blockquote name="4e5f" id="4e5f" class="graf graf--blockquote graf-after--p">From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.</blockquote>
- <p name="cee9" id="cee9" class="graf graf--p graf-after--blockquote">and here:</p>
- <blockquote name="3f1b" id="3f1b" class="graf graf--blockquote graf-after--p">I’m not knocking his success, he has put effort into his line of work, and has built his own life.</blockquote>
- <p name="e527" id="e527" class="graf graf--p graf-after--blockquote">and here:</p>
- <blockquote name="3e4f" id="3e4f" class="graf graf--blockquote graf-after--p">He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.</blockquote>
- <p name="8a01" id="8a01" class="graf graf--p graf-after--blockquote">But still, you get the people telling her something she already acknowledge:</p>
- <blockquote name="7685" id="7685" class="graf graf--blockquote graf-after--p">I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.</blockquote>
- <p name="b151" id="b151" class="graf graf--p graf-after--blockquote">Thank you for restating something in the article. To the person who wrote it.</p>
- <p name="87bc" id="87bc" class="graf graf--p graf-after--p">In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers <a href="http://atp.fm/sponsor/" data-href="http://atp.fm/sponsor/" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">provided by ATP in terms of sponsorship rates</a> and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.</p>
- <p name="dbda" id="dbda" class="graf graf--p graf-after--p">At first, she went with a simple formula:</p>
- <blockquote name="1b4e" id="1b4e" class="graf graf--blockquote graf-after--p">$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.</blockquote>
- <p name="0b33" id="0b33" class="graf graf--p graf-after--blockquote">That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:</p>
- <blockquote name="76d7" id="76d7" class="graf graf--blockquote graf-after--p">That’s $4k per ad, no? So more like $12–16k per episode.</blockquote>
- <p name="a089" id="a089" class="graf graf--p graf-after--blockquote">She’d already realized her mistake and fixed it.</p>
- <blockquote name="b369" id="b369" class="graf graf--blockquote graf-after--p">which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.</blockquote>
- <p name="8b3b" id="8b3b" class="graf graf--p graf-after--blockquote">Again, this is based on <em class="markup--em markup--p-em">publicly available data</em> the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.</p>
- <p name="135a" id="135a" class="graf graf--p graf-after--p">This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his <em class="markup--em markup--p-em">income taxes correctly</em>:</p>
- <blockquote name="5e7e" id="5e7e" class="graf graf--blockquote graf-after--p">especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.</blockquote>
- <blockquote name="6036" id="6036" class="graf graf--blockquote graf-after--blockquote">thus, guessing net income is more haphazard than stating approx. gross income.</blockquote>
- <p name="aac1" id="aac1" class="graf graf--p graf-after--blockquote">Ye Gods. She’s not doing his taxes for him, her point is invalid?</p>
- <p name="600f" id="600f" class="graf graf--p graf-after--p">Then there’s the people who seem to have not read anything past what other people are telling them:</p>
- <blockquote name="9b62" id="9b62" class="graf graf--blockquote graf-after--p">Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?</blockquote>
- <p name="c18a" id="c18a" class="graf graf--p graf-after--blockquote">Just how spoon-fed do you have to be? Have you no teeth?</p>
- <p name="c445" id="c445" class="graf graf--p graf-after--p">Of course, Marco jumps in, and predictably, he’s snippy:</p>
- <blockquote name="0c21" id="0c21" class="graf graf--blockquote graf-after--p">If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.</blockquote>
- <p name="8f8d" id="8f8d" class="graf graf--p graf-after--blockquote">If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.</p>
- <p name="cc97" id="cc97" class="graf graf--p graf-after--p">Then Marco’s friends/fans get into it:</p>
- <blockquote name="f9da" id="f9da" class="graf graf--blockquote graf-after--p">I really don’t understand why it’s anyone’s business</blockquote>
- <p name="0094" id="0094" class="graf graf--p graf-after--blockquote">Samantha is trying to qualify for sainthood at this point:</p>
- <blockquote name="0105" id="0105" class="graf graf--blockquote graf-after--p">It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.</blockquote>
- <p name="cdd1" id="cdd1" class="graf graf--p graf-after--blockquote">Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:</p>
- <blockquote name="f56c" id="f56c" class="graf graf--blockquote graf-after--p">Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.</blockquote>
- <p name="4fef" id="4fef" class="graf graf--p graf-after--blockquote">Wha?? Overcast 2 is absolutely free. Samantha points this out:</p>
- <blockquote name="0f36" id="0f36" class="graf graf--blockquote graf-after--p">His app is free, that’s what sparked the article to begin with.</blockquote>
- <p name="40d2" id="40d2" class="graf graf--p graf-after--blockquote">The response is literally a parallel to “How can there be global warming if it snowed today in my town?”</p>
- <blockquote name="6760" id="6760" class="graf graf--blockquote graf-after--p">If it’s free, how have I paid for it? Twice?</blockquote>
- <p name="7b13" id="7b13" class="graf graf--p graf-after--blockquote">She is still trying:</p>
- <blockquote name="44ba" id="44ba" class="graf graf--blockquote graf-after--p">You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0</blockquote>
- <p name="2152" id="2152" class="graf graf--p graf-after--blockquote">He is having none of it. IT SNOWED! SNOWWWWWWW!</p>
- <blockquote name="99a6" id="99a6" class="graf graf--blockquote graf-after--p">Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.</blockquote>
- <p name="5e6f" id="5e6f" class="graf graf--p graf-after--blockquote">She however, is relentless:</p>
- <blockquote name="1b0f" id="1b0f" class="graf graf--blockquote graf-after--p">No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.</blockquote>
- <p name="d24f" id="d24f" class="graf graf--p graf-after--blockquote">Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)</p>
- <p name="10e1" id="10e1" class="graf graf--p graf-after--p">We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.</p>
- <blockquote name="9b01" id="9b01" class="graf graf--blockquote graf-after--p">It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.</blockquote>
- <p name="340c" id="340c" class="graf graf--p graf-after--blockquote">(UNDERSTATEMENT OF THE YEAR)</p>
- <blockquote name="7244" id="7244" class="graf graf--blockquote graf-after--p">I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.</blockquote>
- <blockquote name="ffb1" id="ffb1" class="graf graf--blockquote graf-after--blockquote">It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.</blockquote>
- <p name="e44e" id="e44e" class="graf graf--p graf-after--blockquote">She tries, oh lord, she tries:</p>
- <blockquote name="a502" id="a502" class="graf graf--blockquote graf-after--p">To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.</blockquote>
- <p name="7dcd" id="7dcd" class="graf graf--p graf-after--blockquote">But no, HE KNOWS HER POINT BETTER THAN SHE DOES:</p>
- <blockquote name="a62a" id="a62a" class="graf graf--blockquote graf-after--p">No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.</blockquote>
- <p name="df8c" id="df8c" class="graf graf--p graf-after--blockquote">Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.</p>
- <p name="521a" id="521a" class="graf graf--p graf-after--p">One guy tries to blame it all on Apple, another in a string of Wha??? moments:</p>
- <blockquote name="d80d" id="d80d" class="graf graf--blockquote graf-after--p">the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility</blockquote>
- <p name="db0b" id="db0b" class="graf graf--p graf-after--blockquote">Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:</p>
- <blockquote name="7a78" id="7a78" class="graf graf--blockquote graf-after--p">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <p name="6e09" id="6e09" class="graf graf--p graf-after--blockquote">Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.</p>
- <p name="b7db" id="b7db" class="graf graf--p graf-after--p">One guy is “confused”:</p>
- <blockquote name="3626" id="3626" class="graf graf--blockquote graf-after--p">I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?</blockquote>
- <blockquote name="9daa" id="9daa" class="graf graf--blockquote graf-after--blockquote">Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.</blockquote>
- <blockquote name="f6da" id="f6da" class="graf graf--blockquote graf-after--blockquote">Alright, that’s fair. I was just confused by the $ and fame angle at first.</blockquote>
- <p name="d5b1" id="d5b1" class="graf graf--p graf-after--blockquote">Samantha’s point centers on the benefits Marco gains via his fame and background. <em class="markup--em markup--p-em">HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?</em></p>
- <p name="58d0" id="58d0" class="graf graf--p graf-after--p">People of course are telling her it’s her fault for mentioning a salient fact at all:</p>
- <blockquote name="30d2" id="30d2" class="graf graf--blockquote graf-after--p">Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?</blockquote>
- <blockquote name="765b" id="765b" class="graf graf--blockquote graf-after--blockquote">Maybe because you went there with your article?</blockquote>
- <blockquote name="61fe" id="61fe" class="graf graf--blockquote graf-after--blockquote">As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.</blockquote>
- <p name="f17c" id="f17c" class="graf graf--p graf-after--blockquote">Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.</p>
- <p name="0b60" id="0b60" class="graf graf--p graf-after--p">Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:</p>
- <blockquote name="65ab" id="65ab" class="graf graf--blockquote graf-after--p">Because you decided to start a conversation about someone else’s personal shit. You started this war.</blockquote>
- <p name="1adb" id="1adb" class="graf graf--p graf-after--blockquote">War. THIS. IS. WAR.</p>
- <p name="de94" id="de94" class="graf graf--p graf-after--p">This is a bunch of nerds attacking someone for reasoned, calm, <em class="markup--em markup--p-em">polite</em> criticism of their friend/idol. Samantha is politely pushing back a bit:</p>
- <blockquote name="4458" id="4458" class="graf graf--blockquote graf-after--p">That doesn’t explain why every other part of my article is being pushed aside.</blockquote>
- <p name="aeac" id="aeac" class="graf graf--p graf-after--blockquote">She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.</p>
- <p name="0078" id="0078" class="graf graf--p graf-after--p">Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:</p>
- <blockquote name="c4c9" id="c4c9" class="graf graf--blockquote graf-after--p">You should never use an ad rate card to estimate ad revenue from any media product ever.</blockquote>
- <blockquote name="b66b" id="b66b" class="graf graf--blockquote graf-after--blockquote">I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars</blockquote>
- <p name="6907" id="6907" class="graf graf--p graf-after--blockquote">How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. <em class="markup--em markup--p-em">Checkmate Elitests!</em>”</p>
- <p name="41ec" id="41ec" class="graf graf--p graf-after--p">Samantha basically abases herself at his feet:</p>
- <blockquote name="0b14" id="0b14" class="graf graf--blockquote graf-after--p">I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.</blockquote>
- <p name="590f" id="590f" class="graf graf--p graf-after--blockquote">I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.</p>
- <p name="69dc" id="69dc" class="graf graf--p graf-after--p">Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.</p>
- <p name="5ab4" id="5ab4" class="graf graf--p graf-after--p">Another App Dev, seemingly unable to parse Samantha’s words, needs <em class="markup--em markup--p-em">more</em> explanation:</p>
- <blockquote name="957b" id="957b" class="graf graf--blockquote graf-after--p">so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.</blockquote>
- <p name="0a7e" id="0a7e" class="graf graf--p graf-after--blockquote">Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice <em class="markup--em markup--p-em">with someone who didn’t even read her article</em>:</p>
- <blockquote name="f7db" id="f7db" class="graf graf--blockquote graf-after--p">That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.</blockquote>
- <p name="937f" id="937f" class="graf graf--p graf-after--blockquote">Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:</p>
- <blockquote name="c9dd" id="c9dd" class="graf graf--blockquote graf-after--p">How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.</blockquote>
- <p name="c522" id="c522" class="graf graf--p graf-after--blockquote">Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?</p>
- <blockquote name="907e" id="907e" class="graf graf--blockquote graf-after--p">Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?</blockquote>
- <p name="2158" id="2158" class="graf graf--p graf-after--blockquote">That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.</p>
- <p name="13f8" id="13f8" class="graf graf--p graf-after--p">Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:</p>
- <blockquote name="96c6" id="96c6" class="graf graf--blockquote graf-after--p">Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!</blockquote>
- <p name="5d3f" id="5d3f" class="graf graf--p graf-after--blockquote">That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, <em class="markup--em markup--p-em">Apple</em>, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)</p>
- <p name="c07c" id="c07c" class="graf graf--p graf-after--p">Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.</p>
- <p name="8b32" id="8b32" class="graf graf--p graf-after--p">Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:</p>
- <blockquote name="de26" id="de26" class="graf graf--blockquote graf-after--p">Yup, before you existed!</blockquote>
- <p name="a3bd" id="a3bd" class="graf graf--p graf-after--blockquote">Really dude? I mean, I’m sorry about the penis, but really?</p>
- <p name="1c51" id="1c51" class="graf graf--p graf-after--p">Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any <em class="markup--em markup--p-em">valid</em> criticism. Which clearly is impossible):</p>
- <blockquote name="9848" id="9848" class="graf graf--blockquote graf-after--p">Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.</blockquote>
- <blockquote name="f2a6" id="f2a6" class="graf graf--blockquote graf-after--blockquote">lol. Noted.</blockquote>
- <blockquote name="aed9" id="aed9" class="graf graf--blockquote graf-after--blockquote">And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …</blockquote>
- <blockquote name="f9d8" id="f9d8" class="graf graf--blockquote graf-after--blockquote">… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.</blockquote>
- <blockquote name="f61c" id="f61c" class="graf graf--blockquote graf-after--blockquote">haha. Thank you for the clarification.</blockquote>
- <p name="5dd9" id="5dd9" class="graf graf--p graf-after--blockquote">Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.</p>
- <p name="dc44" id="dc44" class="graf graf--p graf-after--p">But now, the door has been cracked, and the cheap shots come out:</p>
- <blockquote name="0c94" id="0c94" class="graf graf--blockquote graf-after--p">@testflight_app: Don’t worry guys, we process <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a>’s apps in direct proportion to his megabucks earnings. <a href="https://twitter.com/hashtag/fairelephant?src=hash" data-href="https://twitter.com/hashtag/fairelephant?src=hash" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">#fairelephant</a></blockquote>
- <p name="343b" id="343b" class="graf graf--p graf-after--blockquote">(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)</p>
- <p name="09bf" id="09bf" class="graf graf--p graf-after--p">Or this…conversation:</p>
- <figure name="4d63" id="4d63" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 398px; max-height: 542px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 136.20000000000002%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*kbPh7V97eyRodSOw2-ALDw.png" data-width="398" data-height="542" data-scroll="native"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*kbPh7V97eyRodSOw2-ALDw.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="55" height="75"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*kbPh7V97eyRodSOw2-ALDw.png" /><noscript class="js-progressiveMedia-inner">&lt;img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*kbPh7V97eyRodSOw2-ALDw.png"&gt;</noscript></div>
+ </div>
+ </section>
+ <hr class="id fo ie if ig ih ii ij ik il im in" />
+ <section class="ef eg eh ei ej">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <p id="0fb2" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is <a href="http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">enough to shut him down</a>, who <a href="https://twitter.com/marcoarment/status/641330113934700544" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things</a>, is, in a single word, disgusting. Vomitous even.
+ </p>
+ <p id="9a6e" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in <a href="https://twitter.com/s_bielefeld/with_replies" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">Samantha’s Twitter Feed</a>. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="3271" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.
+ </p>
+ </blockquote>
+ <p id="ec72" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is <em class="ic">such</em> a lie.
+ </p>
+ <p id="5cc4" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ But it gets better. First, you have the “hey, Marco <em class="ic">earned</em> his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="4e5f" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.
+ </p>
+ </blockquote>
+ <p id="cee9" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ and here:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="3f1b" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I’m not knocking his success, he has put effort into his line of work, and has built his own life.
+ </p>
+ </blockquote>
+ <p id="e527" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ and here:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="3e4f" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.
+ </p>
+ </blockquote>
+ <p id="8a01" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ But still, you get the people telling her something she already acknowledge:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="7685" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.
+ </p>
+ </blockquote>
+ <p id="b151" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Thank you for restating something in the article. To the person who wrote it.
+ </p>
+ <p id="87bc" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers <a href="http://atp.fm/sponsor/" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">provided by ATP in terms of sponsorship rates</a> and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.
+ </p>
+ <p id="dbda" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ At first, she went with a simple formula:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="1b4e" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ $4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.
+ </p>
+ </blockquote>
+ <p id="0b33" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="76d7" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That’s $4k per ad, no? So more like $12–16k per episode.
+ </p>
+ </blockquote>
+ <p id="a089" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ She’d already realized her mistake and fixed it.
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="b369" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.
+ </p>
+ </blockquote>
+ <p id="8b3b" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Again, this is based on <em class="ic">publicly available data</em> the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.
+ </p>
+ <p id="135a" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his <em class="ic">income taxes correctly</em>:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="5e7e" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.
+ </p>
+ <p id="6036" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ thus, guessing net income is more haphazard than stating approx. gross income.
+ </p>
+ </blockquote>
+ <p id="aac1" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Ye Gods. She’s not doing his taxes for him, her point is invalid?
+ </p>
+ <p id="600f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Then there’s the people who seem to have not read anything past what other people are telling them:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="9b62" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?
+ </p>
+ </blockquote>
+ <p id="c18a" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Just how spoon-fed do you have to be? Have you no teeth?
+ </p>
+ <p id="c445" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Of course, Marco jumps in, and predictably, he’s snippy:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="0c21" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.
+ </p>
+ </blockquote>
+ <p id="8f8d" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.
+ </p>
+ <p id="cc97" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Then Marco’s friends/fans get into it:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="f9da" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I really don’t understand why it’s anyone’s business
+ </p>
+ </blockquote>
+ <p id="0094" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha is trying to qualify for sainthood at this point:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="0105" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.
+ </p>
+ </blockquote>
+ <p id="cdd1" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="f56c" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.
+ </p>
+ </blockquote>
+ <p id="4fef" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Wha?? Overcast 2 is absolutely free. Samantha points this out:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="0f36" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ His app is free, that’s what sparked the article to begin with.
+ </p>
+ </blockquote>
+ <p id="40d2" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ The response is literally a parallel to “How can there be global warming if it snowed today in my town?”
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="6760" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ If it’s free, how have I paid for it? Twice?
+ </p>
+ </blockquote>
+ <p id="7b13" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ She is still trying:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="44ba" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0
+ </p>
+ </blockquote>
+ <p id="2152" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ He is having none of it. IT SNOWED! SNOWWWWWWW!
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="99a6" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.
+ </p>
+ </blockquote>
+ <p id="5e6f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ She however, is relentless:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="1b0f" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.
+ </p>
+ </blockquote>
+ <p id="d24f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)
+ </p>
+ <p id="10e1" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="9b01" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.
+ </p>
+ </blockquote>
+ <p id="340c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ (UNDERSTATEMENT OF THE YEAR)
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="7244" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.
+ </p>
+ <p id="ffb1" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.
+ </p>
+ </blockquote>
+ <p id="e44e" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ She tries, oh lord, she tries:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="a502" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.
+ </p>
+ </blockquote>
+ <p id="7dcd" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ But no, HE KNOWS HER POINT BETTER THAN SHE DOES:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="a62a" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.
+ </p>
+ </blockquote>
+ <p id="df8c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.
+ </p>
+ <p id="521a" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ One guy tries to blame it all on Apple, another in a string of Wha??? moments:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="d80d" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility
+ </p>
+ </blockquote>
+ <p id="db0b" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="7a78" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
+ </p>
+ </blockquote>
+ <p id="6e09" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.
+ </p>
+ <p id="b7db" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ One guy is “confused”:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="3626" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?
+ </p>
+ <p id="9daa" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.
+ </p>
+ <p id="f6da" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Alright, that’s fair. I was just confused by the $ and fame angle at first.
+ </p>
+ </blockquote>
+ <p id="d5b1" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha’s point centers on the benefits Marco gains via his fame and background. <em class="ic">HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?</em>
+ </p>
+ <p id="58d0" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ People of course are telling her it’s her fault for mentioning a salient fact at all:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="30d2" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?
+ </p>
+ <p id="765b" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Maybe because you went there with your article?
+ </p>
+ <p id="61fe" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.
+ </p>
+ </blockquote>
+ <p id="f17c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.
+ </p>
+ <p id="0b60" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="65ab" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Because you decided to start a conversation about someone else’s personal shit. You started this war.
+ </p>
+ </blockquote>
+ <p id="1adb" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ War. THIS. IS. WAR.
+ </p>
+ <p id="de94" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ This is a bunch of nerds attacking someone for reasoned, calm, <em class="ic">polite</em> criticism of their friend/idol. Samantha is politely pushing back a bit:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="4458" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That doesn’t explain why every other part of my article is being pushed aside.
+ </p>
+ </blockquote>
+ <p id="aeac" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.
+ </p>
+ <p id="0078" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="c4c9" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ You should never use an ad rate card to estimate ad revenue from any media product ever.
+ </p>
+ <p id="b66b" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars
+ </p>
+ </blockquote>
+ <p id="6907" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. <em class="ic">Checkmate Elitests!</em>”
+ </p>
+ <p id="41ec" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha basically abases herself at his feet:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="0b14" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.
+ </p>
+ </blockquote>
+ <p id="590f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.
+ </p>
+ <p id="69dc" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.
+ </p>
+ <p id="5ab4" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Another App Dev, seemingly unable to parse Samantha’s words, needs <em class="ic">more</em> explanation:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="957b" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.
+ </p>
+ </blockquote>
+ <p id="0a7e" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice <em class="ic">with someone who didn’t even read her article</em>:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="f7db" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.
+ </p>
+ </blockquote>
+ <p id="937f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="c9dd" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.
+ </p>
+ </blockquote>
+ <p id="c522" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="907e" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?
+ </p>
+ </blockquote>
+ <p id="2158" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.
+ </p>
+ <p id="13f8" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="96c6" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!
+ </p>
+ </blockquote>
+ <p id="5d3f" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, <em class="ic">Apple</em>, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)
+ </p>
+ <p id="c07c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.
+ </p>
+ <p id="8b32" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="de26" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yup, before you existed!
+ </p>
+ </blockquote>
+ <p id="a3bd" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Really dude? I mean, I’m sorry about the penis, but really?
+ </p>
+ <p id="1c51" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any <em class="ic">valid</em> criticism. Which clearly is impossible):
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="9848" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.
+ </p>
+ <p id="f2a6" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ lol. Noted.
+ </p>
+ <p id="aed9" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …
+ </p>
+ <p id="f9d8" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ … gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.
+ </p>
+ <p id="f61c" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ haha. Thank you for the clarification.
+ </p>
+ </blockquote>
+ <p id="5dd9" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.
+ </p>
+ <p id="dc44" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ But now, the door has been cracked, and the cheap shots come out:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="0c94" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ @testflight_app: Don’t worry guys, we process <a href="https://twitter.com/marcoarment" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@marcoarment</a>’s apps in direct proportion to his megabucks earnings. <a href="https://twitter.com/hashtag/fairelephant?src=hash" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">#fairelephant</a>
+ </p>
+ </blockquote>
+ <p id="343b" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ (Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)
+ </p>
+ <p id="09bf" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Or this…conversation:
+ </p>
+ <figure class="jb jc jd je jf jg dz ea paragraph-image">
+ <div class="dz ea ja">
+ <div class="jk r df dn">
+ <div class="jl jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img alt="Image for post" class="s t u by ai jn jo jp" src="https://miro.medium.com/max/44/1*kbPh7V97eyRodSOw2-ALDw.png?q=20" width="398" height="542" />
+ </div><img alt="Image for post" class="cd jh s t u by ai c" width="398" height="542" /><noscript><img alt="Image for post" class="s t u by ai" src="https://miro.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png" width="398" height="542" srcset="https://miro.medium.com/max/552/1*kbPh7V97eyRodSOw2-ALDw.png 276w, https://miro.medium.com/max/796/1*kbPh7V97eyRodSOw2-ALDw.png 398w" sizes="398px" /></noscript>
+ </div>
</div>
- </figure>
- <p name="f2a3" id="f2a3" class="graf graf--p graf-after--figure">Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: <a href="https://twitter.com/viticci" data-href="https://twitter.com/viticci" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">‏@viticci</a>: <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.</p>
- <p name="ae0c" id="ae0c" class="graf graf--p graf-after--p">Samantha is clearly sick of his crap: <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">‏@s_bielefeld</a>: <a href="https://twitter.com/viticci" data-href="https://twitter.com/viticci" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">@viticci</a> That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.</p>
- <p name="2047" id="2047" class="graf graf--p graf-after--p">Good for her. There’s being patient and being roadkill.</p>
- <p name="4139" id="4139" class="graf graf--p graf-after--p">Samantha does put the call out for her sources to maybe let her use their names:</p>
- <blockquote name="6626" id="6626" class="graf graf--blockquote graf-after--p">From all of you I heard from earlier, anyone care to go on record?</blockquote>
- <p name="8a7d" id="8a7d" class="graf graf--p graf-after--blockquote">My good friend, The Angry Drunk points out the obvious problem:</p>
- <blockquote name="68c9" id="68c9" class="graf graf--blockquote graf-after--p">Nobody’s going to go on record when they count on Marco’s friends for their PR.</blockquote>
- <p name="317d" id="317d" class="graf graf--p graf-after--blockquote">This is true. Again, the sites that are Friends of Marco:</p>
- <p name="9523" id="9523" class="graf graf--p graf-after--p">Daring Fireball</p>
- <p name="dbc7" id="dbc7" class="graf graf--p graf-after--p">The Loop</p>
- <p name="c706" id="c706" class="graf graf--p graf-after--p">SixColors</p>
- <p name="0acb" id="0acb" class="graf graf--p graf-after--p">iMore</p>
- <p name="8c8c" id="8c8c" class="graf graf--p graf-after--p">MacStories</p>
- <p name="643e" id="643e" class="graf graf--p graf-after--p">A few others, but I want this post to end one day.</p>
- <p name="6b76" id="6b76" class="graf graf--p graf-after--p">You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.</p>
- <p name="f7d1" id="f7d1" class="graf graf--p graf-after--p">Of course, the idea this could happen is just craycray:</p>
- <blockquote name="de59" id="de59" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/KevinColeman" data-href="https://twitter.com/KevinColeman" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@KevinColeman </a><a href="https://twitter.com/Angry_Drunk" data-href="https://twitter.com/Angry_Drunk" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">.@Angry_Drunk</a> <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a> Wow, you guys are veering right into crazy conspiracy theory territory. <a href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" data-href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">#JetFuelCantMeltSteelBeams</a></blockquote>
- <p name="f01b" id="f01b" class="graf graf--p graf-after--blockquote">Yeah. Because a mature person like Marco would never do anything like that.</p>
- <p name="7e30" id="7e30" class="graf graf--p graf-after--p">Of course, the real point on this is starting to happen:</p>
- <blockquote name="5d93" id="5d93" class="graf graf--blockquote graf-after--p">you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!</blockquote>
- <blockquote name="436b" id="436b" class="graf graf--blockquote graf-after--blockquote">I doubt I will.</blockquote>
- <p name="ac25" id="ac25" class="graf graf--p graf-after--blockquote">See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. <em class="markup--em markup--p-em">Great</em> job y’all.</p>
- <p name="07ba" id="07ba" class="graf graf--p graf-after--p">Some people aren’t even pretending. They’re just in full strawman mode:</p>
- <blockquote name="3d60" id="3d60" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/timkeller" data-href="https://twitter.com/timkeller" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@timkeller: </a>Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.</blockquote>
- <blockquote name="87f5" id="87f5" class="graf graf--blockquote graf-after--blockquote"><a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld: </a><a href="https://twitter.com/timkeller" data-href="https://twitter.com/timkeller" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@timkeller</a> I plainly stated that I don’t hold his doing this against him. Way to twist words.</blockquote>
- <p name="3720" id="3720" class="graf graf--p graf-after--blockquote">I think she’s earned her anger at this point.</p>
- <p name="7341" id="7341" class="graf graf--p graf-after--p">Don’t worry, Marco knows what the real problem is: most devs just suck —</p>
- <figure name="babe" id="babe" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 694px; max-height: 771px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 111.1%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*Fpb2Bvdx7Q-688vdm-NdkQ.png" data-width="694" data-height="771" data-scroll="native"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*Fpb2Bvdx7Q-688vdm-NdkQ.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="68" height="75"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*Fpb2Bvdx7Q-688vdm-NdkQ.png" /><noscript class="js-progressiveMedia-inner">&lt;img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*Fpb2Bvdx7Q-688vdm-NdkQ.png"&gt;</noscript></div>
+ </div>
+ </figure>
+ <p id="f2a3" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: <a href="https://twitter.com/viticci" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">‏@viticci</a>: <a href="https://twitter.com/s_bielefeld" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@s_bielefeld</a> I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.
+ </p>
+ <p id="ae0c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha is clearly sick of his crap: <a href="https://twitter.com/s_bielefeld" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">‏@s_bielefeld</a>: <a href="https://twitter.com/viticci" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@viticci</a> That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.
+ </p>
+ <p id="2047" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Good for her. There’s being patient and being roadkill.
+ </p>
+ <p id="4139" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha does put the call out for her sources to maybe let her use their names:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="6626" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ From all of you I heard from earlier, anyone care to go on record?
+ </p>
+ </blockquote>
+ <p id="8a7d" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ My good friend, The Angry Drunk points out the obvious problem:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="68c9" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Nobody’s going to go on record when they count on Marco’s friends for their PR.
+ </p>
+ </blockquote>
+ <p id="317d" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ This is true. Again, the sites that are Friends of Marco:
+ </p>
+ <p id="9523" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Daring Fireball
+ </p>
+ <p id="dbc7" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ The Loop
+ </p>
+ <p id="c706" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ SixColors
+ </p>
+ <p id="0acb" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ iMore
+ </p>
+ <p id="8c8c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ MacStories
+ </p>
+ <p id="643e" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ A few others, but I want this post to end one day.
+ </p>
+ <p id="6b76" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.
+ </p>
+ <p id="f7d1" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Of course, the idea this could happen is just craycray:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="de59" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ <a href="https://twitter.com/KevinColeman" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@KevinColeman</a> <a href="https://twitter.com/Angry_Drunk" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">.@Angry_Drunk</a> <a href="https://twitter.com/s_bielefeld" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@s_bielefeld</a> <a href="https://twitter.com/marcoarment" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@marcoarment</a> Wow, you guys are veering right into crazy conspiracy theory territory. <a href="https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">#JetFuelCantMeltSteelBeams</a>
+ </p>
+ </blockquote>
+ <p id="f01b" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yeah. Because a mature person like Marco would never do anything like that.
+ </p>
+ <p id="7e30" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Of course, the real point on this is starting to happen:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="5d93" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!
+ </p>
+ <p id="436b" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I doubt I will.
+ </p>
+ </blockquote>
+ <p id="ac25" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. <em class="ic">Great</em> job y’all.
+ </p>
+ <p id="07ba" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Some people aren’t even pretending. They’re just in full strawman mode:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="3d60" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ <a href="https://twitter.com/timkeller" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@timkeller:</a> Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.
+ </p>
+ <p id="87f5" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ <a href="https://twitter.com/s_bielefeld" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@s_bielefeld:</a> <a href="https://twitter.com/timkeller" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@timkeller</a> I plainly stated that I don’t hold his doing this against him. Way to twist words.
+ </p>
+ </blockquote>
+ <p id="3720" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I think she’s earned her anger at this point.
+ </p>
+ <p id="7341" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Don’t worry, Marco knows what the real problem is: most devs just suck —
+ </p>
+ <figure class="jb jc jd je jf jg dz ea paragraph-image">
+ <div class="dz ea jq">
+ <div class="jk r df dn">
+ <div class="jr jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img alt="Image for post" class="s t u by ai jn jo jp" src="https://miro.medium.com/max/54/1*Fpb2Bvdx7Q-688vdm-NdkQ.png?q=20" width="694" height="771" />
+ </div><img alt="Image for post" class="cd jh s t u by ai c" width="694" height="771" /><noscript><img alt="Image for post" class="s t u by ai" src="https://miro.medium.com/max/1388/1*Fpb2Bvdx7Q-688vdm-NdkQ.png" width="694" height="771" srcset="https://miro.medium.com/max/552/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 276w, https://miro.medium.com/max/1104/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 552w, https://miro.medium.com/max/1280/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 640w, https://miro.medium.com/max/1388/1*Fpb2Bvdx7Q-688vdm-NdkQ.png 694w" sizes="694px" /></noscript>
+ </div>
</div>
- </figure>
- <p name="503d" id="503d" class="graf graf--p graf-after--figure">I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)</p>
- <p name="b8c0" id="b8c0" class="graf graf--p graf-after--p">There are some bright spots. My favorite is when Building Twenty points out the <em class="markup--em markup--p-em">real</em> elephant in the room:</p>
- <blockquote name="36f4" id="36f4" class="graf graf--blockquote graf-after--p"><a href="https://twitter.com/BuildingTwenty" data-href="https://twitter.com/BuildingTwenty" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@BuildingTwenty</a>: Both <a href="https://twitter.com/s_bielefeld" data-href="https://twitter.com/s_bielefeld" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@s_bielefeld</a> &amp; I wrote similar critiques of <a href="https://twitter.com/marcoarment" data-href="https://twitter.com/marcoarment" class="markup--anchor markup--blockquote-anchor" rel="nofollow noopener" target="_blank">@marcoarment</a>’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?</blockquote>
- <p name="06b9" id="06b9" class="graf graf--p graf-after--blockquote">Yup.</p>
- <p name="eff9" id="eff9" class="graf graf--p graf-after--p">Another bright spot are these comments from Ian Betteridge, who has been doing this <em class="markup--em markup--p-em">even longer than Marco</em>:</p>
- <blockquote name="18f1" id="18f1" class="graf graf--blockquote graf-after--p">You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.</blockquote>
- <blockquote name="9776" id="9776" class="graf graf--blockquote graf-after--blockquote">I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.</blockquote>
- <p name="8d44" id="8d44" class="graf graf--p graf-after--blockquote">To which Samantha understandably replies:</p>
- <blockquote name="7147" id="7147" class="graf graf--blockquote graf-after--p">and it’s honestly something I’m contemplating right now, whether to continue…</blockquote>
- <p name="e0cd" id="e0cd" class="graf graf--p graf-after--blockquote">Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?</p>
- <blockquote name="a379" id="a379" class="graf graf--blockquote graf-after--p">If I have this right, some people are outraged that a creator has decided to give away his work.</blockquote>
- <p name="f026" id="f026" class="graf graf--p graf-after--blockquote">No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.</p>
- <p name="e1c2" id="e1c2" class="graf graf--p graf-after--p">Noted Feminist Glenn Fleishman gets a piece of the action too:</p>
- <figure name="067c" id="067c" class="graf graf--figure graf-after--p">
- <div class="aspectRatioPlaceholder is-locked" style="max-width: 308px; max-height: 269px;">
- <div class="aspectRatioPlaceholder-fill" style="padding-bottom: 87.3%;"></div>
- <div class="progressiveMedia js-progressiveMedia graf-image is-canvasLoaded" data-image-id="1*lvOySry5gHHJfGU_bQXrzA.png" data-width="308" data-height="269" data-scroll="native"><img src="https://cdn-images-1.medium.com/freeze/max/60/1*lvOySry5gHHJfGU_bQXrzA.png?q=20" crossorigin="anonymous" class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" /><canvas class="progressiveMedia-canvas js-progressiveMedia-canvas" width="75" height="65"></canvas><img class="progressiveMedia-image js-progressiveMedia-image" data-src="https://cdn-images-1.medium.com/max/1600/1*lvOySry5gHHJfGU_bQXrzA.png" /><noscript class="js-progressiveMedia-inner">&lt;img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/max/1600/1*lvOySry5gHHJfGU_bQXrzA.png"&gt;</noscript></div>
+ </div>
+ </figure>
+ <p id="503d" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)
+ </p>
+ <p id="b8c0" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ There are some bright spots. My favorite is when Building Twenty points out the <em class="ic">real</em> elephant in the room:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="36f4" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ <a href="https://twitter.com/BuildingTwenty" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@BuildingTwenty</a>: Both <a href="https://twitter.com/s_bielefeld" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@s_bielefeld</a> &amp; I wrote similar critiques of <a href="https://twitter.com/marcoarment" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">@marcoarment</a>’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?
+ </p>
+ </blockquote>
+ <p id="06b9" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Yup.
+ </p>
+ <p id="eff9" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Another bright spot are these comments from Ian Betteridge, who has been doing this <em class="ic">even longer than Marco</em>:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="18f1" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.
+ </p>
+ <p id="9776" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.
+ </p>
+ </blockquote>
+ <p id="8d44" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ To which Samantha understandably replies:
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="7147" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ and it’s honestly something I’m contemplating right now, whether to continue…
+ </p>
+ </blockquote>
+ <p id="e0cd" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="a379" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ If I have this right, some people are outraged that a creator has decided to give away his work.
+ </p>
+ </blockquote>
+ <p id="f026" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.
+ </p>
+ <p id="e1c2" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Noted Feminist Glenn Fleishman gets a piece of the action too:
+ </p>
+ <figure class="jb jc jd je jf jg dz ea paragraph-image">
+ <div class="dz ea js">
+ <div class="jk r df dn">
+ <div class="jt jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img alt="Image for post" class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*lvOySry5gHHJfGU_bQXrzA.png?q=20" width="308" height="269" />
+ </div><img alt="Image for post" class="cd jh s t u by ai c" width="308" height="269" /><noscript><img alt="Image for post" class="s t u by ai" src="https://miro.medium.com/max/616/1*lvOySry5gHHJfGU_bQXrzA.png" width="308" height="269" srcset="https://miro.medium.com/max/552/1*lvOySry5gHHJfGU_bQXrzA.png 276w, https://miro.medium.com/max/616/1*lvOySry5gHHJfGU_bQXrzA.png 308w" sizes="308px" /></noscript>
+ </div>
</div>
- </figure>
- <p name="4df8" id="4df8" class="graf graf--p graf-after--figure">I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a <em class="markup--em markup--p-em">very</em> technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.</p>
- <p name="bf45" id="bf45" class="graf graf--p graf-after--p graf--trailing">Great Feminists are often tools.</p>
- </div>
- </div>
- </section>
- <section name="c883" class="section section--body">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="45bb" id="45bb" class="graf graf--p graf--leading">Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):</p>
- <blockquote name="c053" id="c053" class="graf graf--blockquote graf-after--p">I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t</blockquote>
- <blockquote name="7b5e" id="7b5e" class="graf graf--blockquote graf-after--blockquote">This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.</blockquote>
- <blockquote name="a321" id="a321" class="graf graf--blockquote graf-after--blockquote">Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility <a href="http://t.co/u79ZLsnhdM" data-href="http://t.co/u79ZLsnhdM" class="markup--anchor markup--blockquote-anchor" title="http://samanthabielefeld.com/the-elephant-in-the-room" rel="nofollow noopener" target="_blank">http://samanthabielefeld.com/the-elephant-in-the-room …</a></blockquote>
- <blockquote name="76fe" id="76fe" class="graf graf--blockquote graf-after--blockquote">thank you for posting this, it covers a lot of things people don’t like to talk about.</blockquote>
- <blockquote name="bf90" id="bf90" class="graf graf--blockquote graf-after--blockquote">I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.</blockquote>
- <blockquote name="0f66" id="0f66" class="graf graf--blockquote graf-after--blockquote graf--trailing">Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)</blockquote>
- </div>
- </div>
- </section>
- <section name="8ab2" class="section section--body section--last">
- <div class="section-divider">
- <hr class="section-divider" />
+ </div>
+ </figure>
+ <p id="4df8" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a <em class="ic">very</em> technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.
+ </p>
+ <p id="bf45" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Great Feminists are often tools.
+ </p>
</div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="6134" id="6134" class="graf graf--p graf--leading">I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: <a href="http://www.businessinsider.com/marco-arment-2011-9" data-href="http://www.businessinsider.com/marco-arment-2011-9" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">http://www.businessinsider.com/marco-arment-2011-9</a></p>
- <p name="ba3c" id="ba3c" class="graf graf--p graf-after--p">Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.</p>
- <p name="a5a0" id="a5a0" class="graf graf--p graf-after--p">Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.</p>
- <p name="2a25" id="2a25" class="graf graf--p graf-after--p">And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.</p>
- <p name="a47a" id="a47a" class="graf graf--p graf-after--p">Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, <em class="markup--em markup--p-em">believe me</em> I understand. As bad as today was for her, I’ve seen worse. Much worse.</p>
- <p name="aa8e" id="aa8e" class="graf graf--p graf-after--p">But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.</p>
- <p name="34c5" id="34c5" class="graf graf--p graf-after--p">All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.</p>
- <p name="9710" id="9710" class="graf graf--p graf-after--p graf--trailing">So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.</p>
- </div>
+ </div>
+ </section>
+ <hr class="id fo ie if ig ih ii ij ik il im in" />
+ <section class="ef eg eh ei ej">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <p id="45bb" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):
+ </p>
+ <blockquote class="hz ia ib">
+ <p id="c053" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t
+ </p>
+ <p id="7b5e" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.
+ </p>
+ <p id="a321" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility <a href="http://t.co/u79ZLsnhdM" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">http://samanthabielefeld.com/the-elephant-in-the-room …</a>
+ </p>
+ <p id="76fe" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ thank you for posting this, it covers a lot of things people don’t like to talk about.
+ </p>
+ <p id="bf90" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.
+ </p>
+ <p id="0f66" class="hb hc ic hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)
+ </p>
+ </blockquote>
</div>
- </section>
- </div>
- <footer class="u-paddingTop10">
- <div class="container u-maxWidth740">
- <div class="row">
- <div class="col u-size12of12"></div>
+ </div>
+ </section>
+ <hr class="id fo ie if ig ih ii ij ik il im in" />
+ <section class="ef eg eh ei ej">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <p id="6134" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: <a href="http://www.businessinsider.com/marco-arment-2011-9" class="bh gp ir is it iu" target="_blank" rel="noopener nofollow">http://www.businessinsider.com/marco-arment-2011-9</a>
+ </p>
+ <p id="ba3c" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.
+ </p>
+ <p id="a5a0" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.
+ </p>
+ <p id="2a25" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.
+ </p>
+ <p id="a47a" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, <em class="ic">believe me</em> I understand. As bad as today was for her, I’ve seen worse. Much worse.
+ </p>
+ <p id="aa8e" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.
+ </p>
+ <p id="34c5" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.
+ </p>
+ <p id="9710" class="hb hc bo hd b he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy ef de">
+ So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.
+ </p>
</div>
- <div class="row">
- <div class="col u-size12of12 js-postTags">
- <div class="u-paddingBottom10">
- <div class="tags tags--postTags tags--borderless"></div>
+ </div>
+ </section>
+ </div>
+ </article>
+ <div class="cd cf bz ju ai kb jz kc" data-test-id="post-sidebar">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="kd n ke">
+ <div class="cf">
+ <div>
+ <div class="kf kg kh n">
+ <div class="n o">
+ <div class="r df ki kj kk kl km">
+ <span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_sidebar-----d146a92473a1---------------------clap_sidebar-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener">
+ <div class="ay kn ko kp cc kq kr ks q kt ku">
+ <span><svg width="29" height="29" aria-label="clap">
+ <g fill-rule="evenodd">
+ <path d="M13.74 1l.76 2.97.76-2.97zM16.82 4.78l1.84-2.56-1.43-.47zM10.38 2.22l1.84 2.56-.41-3.03zM22.38 22.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M9.1 22.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L6.1 15.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L6.4 11.26l-1.18-1.18a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L11.96 14a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L8.43 9.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L20.63 15c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM13 6.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 23 23.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg></span>
+ </div></a></span>
+ </div>
+ <div class="r kv kw kx ky kz la lb">
+ <div class="lc">
+ <h4 class="bn fo fp bp bs">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm">193<!-- --></button>
+ </h4>
+ </div>
+ </div>
+ </div>
</div>
- </div>
- </div>
- <div class="row js-postActionsFooter">
- <div class="postActions col u-size12of12">
- <div class="u-floatLeft buttonSet buttonSet--withLabels">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="d146a92473a1" data-is-icon-29px="true" data-has-recommend-list="true" data-source="post_actions_footer"><button class="button button--primary button--large button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/d146a92473a1" data-action-source="post_actions_footer"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.215 23.716c-.348.288-.984.826-1.376 1.158a.526.526 0 0 1-.68 0c-.36-.307-.92-.78-1.22-1.03C9.22 20.734 3 15.527 3 10.734 3 7.02 5.916 4 9.5 4c1.948 0 3.77.898 5 2.434C15.73 4.898 17.552 4 19.5 4c3.584 0 6.5 3.02 6.5 6.734 0 4.9-6.125 9.96-9.785 12.982zM19.5 5.2c-1.774 0-3.423.923-4.41 2.468a.699.699 0 0 1-.59.323.706.706 0 0 1-.59-.32c-.988-1.54-2.637-2.47-4.41-2.47-2.922 0-5.3 2.49-5.3 5.54 0 4.23 6.19 9.41 9.517 12.19.217.18.566.48.783.66l.952-.79c3.496-2.88 9.348-7.72 9.348-12.05 0-3.05-2.378-5.53-5.3-5.53z"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M19.5 4c-1.948 0-3.77.898-5 2.434C13.27 4.898 11.448 4 9.5 4 5.916 4 3 7.02 3 10.734c0 4.793 6.227 10 9.95 13.11.296.25.853.723 1.212 1.03.196.166.48.166.677 0 .39-.332 1.02-.87 1.37-1.158 3.66-3.022 9.79-8.08 9.79-12.982C26 7.02 23.08 4 19.5 4z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="show-recommends" data-action-value="d146a92473a1">168</button></div>
+ <div class="kg r">
+ <div class="lf n o cz">
+ <button class="cc ko ay"><svg width="25" height="25" class="q" aria-label="responses">
+ <path d="M19.07 21.12a6.33 6.33 0 0 1-3.53-1.1 7.8 7.8 0 0 1-.7-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.66 0 8.46 3.5 8.46 7.8 0 2.06-.85 3.99-2.4 5.45a6.28 6.28 0 0 0 1.14 2.59c.15.21.17.48.06.7a.69.69 0 0 1-.62.38h-.03zm0-1v.5l.03-.5h-.03zm-3.92-1.64l.21.2a6.09 6.09 0 0 0 3.24 1.54 7.14 7.14 0 0 1-.83-1.84 5.15 5.15 0 0 1-.16-.75 2.4 2.4 0 0 1-.02-.29v-.23l.18-.15a6.6 6.6 0 0 0 2.3-4.96c0-3.82-3.4-6.93-7.6-6.93-4.19 0-7.6 3.11-7.6 6.93 0 3.83 3.41 6.94 7.6 6.94.83 0 1.64-.12 2.41-.35l.28-.08z" fill-rule="evenodd"></path></svg></button>
+ <div class="r df lg lh li lj lk ll lm ln">
+ <h4 class="bn fo fp bp bs">
+ <button class="cc ko ay">13<!-- --></button>
+ </h4>
+ </div>
</div>
- <div class="buttonSet-inner"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" data-action="scroll-to-responses" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--response svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.27 20.058c1.89-1.826 2.754-4.17 2.754-6.674C24.024 8.21 19.67 4 14.1 4 8.53 4 4 8.21 4 13.384c0 5.175 4.53 9.385 10.1 9.385 1.007 0 2-.14 2.95-.41.285.25.592.49.918.7 1.306.87 2.716 1.31 4.19 1.31.276-.01.494-.14.6-.36a.625.625 0 0 0-.052-.65c-.61-.84-1.042-1.71-1.282-2.58a5.417 5.417 0 0 1-.154-.75zm-3.85 1.324l-.083-.28-.388.12a9.72 9.72 0 0 1-2.85.424c-4.96 0-8.99-3.706-8.99-8.262 0-4.556 4.03-8.263 8.99-8.263 4.95 0 8.77 3.71 8.77 8.27 0 2.25-.75 4.35-2.5 5.92l-.24.21v.32c0 .07 0 .19.02.37.03.29.1.6.19.92.19.7.49 1.4.89 2.08-.93-.14-1.83-.49-2.67-1.06-.34-.22-.88-.48-1.16-.74z"/></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal" data-action="scroll-to-responses">15</button></div>
</div>
- <div class="u-floatRight buttonSet buttonSet--narrow"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"/></svg></span></button><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_actions_footer"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"/></svg></span></button></div>
+ <div class="bt">
+ <span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_sidebar--------------------------post_sidebar-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span>
+ </div>
</div>
</div>
</div>
- <div class="js-postPromotionWrapper postPromotionWrapper" data-location-id="footer_above_post_attribution"></div>
- <div class="container u-maxWidth740 js-postAttributionFooterContainer u-paddingTop20 u-paddingBottom20 u-marginTop10 u-borderTopLightest u-xs-paddingTop10 u-xs-paddingBottom10">
- <div class="row js-postFooterInfo">
- <div class="col u-size12of12">
- <li class="u-block u-paddingBottom18 js-cardUser">
- <div class="u-marginLeft20 u-floatRight"><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button button--small u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="footer_card"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary button--small u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="footer_card_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Following</span></button></span>
+ </div>
+ </div>
+ </div>
+ <div class="cd cf ju bz jv jw jx jy jz ka"></div>
+ <div>
+ <div class="lo jg n ke p">
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <div class="n lp"></div>
+ <div class="n o lp"></div>
+ <div class="lq n da y">
+ <div class="n cz">
+ <div class="lr r">
+ <div class="n o">
+ <div class="r df ki kj kk kl km">
+ <span class="r ls lt lu e d"><span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_actions_footer-----d146a92473a1---------------------clap_footer-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener">
+ <div class="ay kn ko kp cc kq kr ks q kt ku">
+ <span class="r ls lt lu e d"><svg width="25" height="25" viewbox="0 0 25 25" aria-label="clap">
+ <g fill-rule="evenodd">
+ <path d="M11.74 0l.76 2.97.76-2.97zM14.81 3.78l1.84-2.56-1.42-.47zM8.38 1.22l1.84 2.56L9.8.75zM20.38 21.62a5.11 5.11 0 0 1-3.16 1.61l.49-.45c2.88-2.89 3.45-5.98 1.69-9.21l-1.1-1.94-.96-2.02c-.31-.67-.23-1.18.25-1.55a.84.84 0 0 1 .66-.16c.34.05.66.28.88.6l2.85 5.02c1.18 1.97 1.38 5.12-1.6 8.1M7.1 21.1l-5.02-5.02a1 1 0 0 1 .7-1.7 1 1 0 0 1 .72.3l2.6 2.6a.44.44 0 0 0 .63-.62L4.1 14.04l-1.75-1.75a1 1 0 1 1 1.41-1.41l4.15 4.15a.44.44 0 0 0 .63 0 .44.44 0 0 0 0-.62L4.4 10.26 3.22 9.08a1 1 0 0 1 0-1.4 1.02 1.02 0 0 1 1.41 0l1.18 1.16L9.96 13a.44.44 0 0 0 .62 0 .44.44 0 0 0 0-.63L6.43 8.22a.99.99 0 0 1-.3-.7.99.99 0 0 1 .3-.7 1 1 0 0 1 1.41 0l7 6.98a.44.44 0 0 0 .7-.5l-1.35-2.85c-.31-.68-.23-1.19.25-1.56a.85.85 0 0 1 .66-.16c.34.06.66.28.88.6L18.63 14c1.57 2.88 1.07 5.54-1.55 8.16a5.62 5.62 0 0 1-5.06 1.65 9.35 9.35 0 0 1-4.93-2.72zM11 5.98l2.56 2.56c-.5.6-.56 1.41-.15 2.28l.26.56-4.25-4.25a.98.98 0 0 1-.12-.45 1 1 0 0 1 .29-.7 1.02 1.02 0 0 1 1.41 0zm8.89 2.06c-.38-.56-.9-.92-1.49-1.01a1.74 1.74 0 0 0-1.34.33c-.38.29-.61.65-.71 1.06a2.1 2.1 0 0 0-1.1-.56 1.78 1.78 0 0 0-.99.13l-2.64-2.64a1.88 1.88 0 0 0-2.65 0 1.86 1.86 0 0 0-.48.85 1.89 1.89 0 0 0-2.67-.01 1.87 1.87 0 0 0-.5.9c-.76-.75-2-.75-2.7-.04a1.88 1.88 0 0 0 0 2.66c-.3.12-.61.29-.87.55a1.88 1.88 0 0 0 0 2.66l.62.62a1.88 1.88 0 0 0-.9 3.16l5.01 5.02c1.6 1.6 3.52 2.64 5.4 2.96a7.16 7.16 0 0 0 1.18.1c1.03 0 2-.25 2.9-.7A5.9 5.9 0 0 0 21 22.24c3.34-3.34 3.08-6.93 1.74-9.17l-2.87-5.04z"></path>
+ </g></svg></span>
+ </div></a></span></span>
+ </div>
+ <div class="r kv kw kx ky kz la lb">
+ <div class="df lv lc">
+ <h4 class="bn fo fp bp de">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm">193<span class="r h g f lw lx">&#160;<!-- -->claps</span></button>
+ </h4>
+ </div>
+ </div>
</div>
- <div class="u-tableCell ">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch?source=footer_card" title="Go to the profile of John C. Welch" aria-label="Go to the profile of John C. Welch" data-action-source="footer_card" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/120/120/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--small" alt="Go to the profile of John C. Welch" /></a>
+ <div class="n ly">
+ <div class="r df ki kj">
+ <span class="r h g f lw lx"><span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_actions_footer-----d146a92473a1---------------------clap_footer-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener">
+ <div class="ay kn ko kp cc kq kr ks q kt ku">
+ <span class="r h g f lw lx"><svg width="33" height="33" viewbox="0 0 33 33" aria-label="clap">
+ <path d="M28.86 17.34l-3.64-6.4c-.3-.43-.71-.73-1.16-.8a1.12 1.12 0 0 0-.9.21c-.62.5-.73 1.18-.32 2.06l1.22 2.6 1.4 2.45c2.23 4.09 1.51 8-2.15 11.66a9.6 9.6 0 0 1-.8.71 6.53 6.53 0 0 0 4.3-2.1c3.82-3.82 3.57-7.87 2.05-10.39zm-6.25 11.08c3.35-3.35 4-6.78 1.98-10.47L21.2 12c-.3-.43-.71-.72-1.16-.8a1.12 1.12 0 0 0-.9.22c-.62.49-.74 1.18-.32 2.06l1.72 3.63a.5.5 0 0 1-.81.57l-8.91-8.9a1.33 1.33 0 0 0-1.89 1.88l5.3 5.3a.5.5 0 0 1-.71.7l-5.3-5.3-1.49-1.49c-.5-.5-1.38-.5-1.88 0a1.34 1.34 0 0 0 0 1.89l1.49 1.5 5.3 5.28a.5.5 0 0 1-.36.86.5.5 0 0 1-.36-.15l-5.29-5.29a1.34 1.34 0 0 0-1.88 0 1.34 1.34 0 0 0 0 1.89l2.23 2.23L9.3 21.4a.5.5 0 0 1-.36.85.5.5 0 0 1-.35-.14l-3.32-3.33a1.33 1.33 0 0 0-1.89 0 1.32 1.32 0 0 0-.39.95c0 .35.14.69.4.94l6.39 6.4c3.53 3.53 8.86 5.3 12.82 1.35zM12.73 9.26l5.68 5.68-.49-1.04c-.52-1.1-.43-2.13.22-2.89l-3.3-3.3a1.34 1.34 0 0 0-1.88 0 1.33 1.33 0 0 0-.4.94c0 .22.07.42.17.61zm14.79 19.18a7.46 7.46 0 0 1-6.41 2.31 7.92 7.92 0 0 1-3.67.9c-3.05 0-6.12-1.63-8.36-3.88l-6.4-6.4A2.31 2.31 0 0 1 2 19.72a2.33 2.33 0 0 1 1.92-2.3l-.87-.87a2.34 2.34 0 0 1 0-3.3 2.33 2.33 0 0 1 1.24-.64l-.14-.14a2.34 2.34 0 0 1 0-3.3 2.39 2.39 0 0 1 3.3 0l.14.14a2.33 2.33 0 0 1 3.95-1.24l.09.09c.09-.42.29-.83.62-1.16a2.34 2.34 0 0 1 3.3 0l3.38 3.39a2.17 2.17 0 0 1 1.27-.17c.54.08 1.03.35 1.45.76.1-.55.41-1.03.9-1.42a2.12 2.12 0 0 1 1.67-.4 2.8 2.8 0 0 1 1.85 1.25l3.65 6.43c1.7 2.83 2.03 7.37-2.2 11.6zM13.22.48l-1.92.89 2.37 2.83-.45-3.72zm8.48.88L19.78.5l-.44 3.7 2.36-2.84zM16.5 3.3L15.48 0h2.04L16.5 3.3z" fill-rule="evenodd"></path></svg></span>
+ </div></a></span></span>
+ </div>
+ <div class="r kv kw kx ky lz ma mb mc md me">
+ <div class="df lv lc">
+ <h4 class="bn fo fp bp de">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm">193<span class="r h g f lw lx">&#160;<!-- -->claps</span></button>
+ </h4>
+ </div>
+ </div>
</div>
- <div class="u-tableCell u-verticalAlignMiddle u-breakWord u-paddingLeft15">
- <h3 class="u-fontSizeBase u-lineHeightTighter u-marginBottom4"><a class="link link--primary u-accentColor--hoverTextNormal" href="https://medium.com/@johncwelch" property="cc:attributionName" title="Go to the profile of John C. Welch" aria-label="Go to the profile of John C. Welch" rel="author cc:attributionUrl" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a></h3>
+ </div>
+ <div class="r mf mg mh mi mj"></div>
+ <div class="lf n o cz">
+ <button class="cc ko ay"><span class="mk r h g f lw lx"><svg width="33" height="33" viewbox="0 0 33 33" fill="none" class="q" aria-label="responses">
+ <path clip-rule="evenodd" d="M24.28 25.5l.32-.29c2.11-1.94 3.4-4.61 3.4-7.56C28 11.83 22.92 7 16.5 7S5 11.83 5 17.65s5.08 10.66 11.5 10.66c1.22 0 2.4-.18 3.5-.5l.5-.15.41.33a8.86 8.86 0 0 0 4.68 2.1 7.34 7.34 0 0 1-1.3-4.15v-.43zm1 .45c0 1.5.46 2.62 1.69 4.44.22.32.01.75-.38.75a9.69 9.69 0 0 1-6.31-2.37c-1.2.35-2.46.54-3.78.54C9.6 29.3 4 24.09 4 17.65 4 11.22 9.6 6 16.5 6S29 11.22 29 17.65c0 3.25-1.42 6.18-3.72 8.3z"></path></svg></span><span class="ml r ls lt lu e d"><svg width="25" height="25" class="q" aria-label="responses">
+ <path d="M19.07 21.12a6.33 6.33 0 0 1-3.53-1.1 7.8 7.8 0 0 1-.7-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.66 0 8.46 3.5 8.46 7.8 0 2.06-.85 3.99-2.4 5.45a6.28 6.28 0 0 0 1.14 2.59c.15.21.17.48.06.7a.69.69 0 0 1-.62.38h-.03zm0-1v.5l.03-.5h-.03zm-3.92-1.64l.21.2a6.09 6.09 0 0 0 3.24 1.54 7.14 7.14 0 0 1-.83-1.84 5.15 5.15 0 0 1-.16-.75 2.4 2.4 0 0 1-.02-.29v-.23l.18-.15a6.6 6.6 0 0 0 2.3-4.96c0-3.82-3.4-6.93-7.6-6.93-4.19 0-7.6 3.11-7.6 6.93 0 3.83 3.41 6.94 7.6 6.94.83 0 1.64-.12 2.41-.35l.28-.08z" fill-rule="evenodd"></path></svg></span></button>
+ <div class="r df mm lh mn lj mo ll mp mq mr ms">
+ <h4 class="bn fo fp bp de">
+ <button class="cc ko ay">13<!-- --> <span class="r h g f lw lx">response<!-- -->s</span></button>
+ </h4>
</div>
- </li>
+ </div>
+ </div>
+ <div class="n o">
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" class="bt">
+ <path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path></svg></button>
+ </div>
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" viewbox="0 0 29 29" fill="none" class="bt">
+ <path d="M5 6.36C5 5.61 5.63 5 6.4 5h16.2c.77 0 1.4.61 1.4 1.36v16.28c0 .75-.63 1.36-1.4 1.36H6.4c-.77 0-1.4-.6-1.4-1.36V6.36z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M10.76 20.9v-8.57H7.89v8.58h2.87zm-1.44-9.75c1 0 1.63-.65 1.63-1.48-.02-.84-.62-1.48-1.6-1.48-.99 0-1.63.64-1.63 1.48 0 .83.62 1.48 1.59 1.48h.01zM12.35 20.9h2.87v-4.79c0-.25.02-.5.1-.7.2-.5.67-1.04 1.46-1.04 1.04 0 1.46.8 1.46 1.95v4.59h2.87v-4.92c0-2.64-1.42-3.87-3.3-3.87-1.55 0-2.23.86-2.61 1.45h.02v-1.24h-2.87c.04.8 0 8.58 0 8.58z" fill="#fff"></path></svg></button>
+ </div>
+ <div class="gy r bg">
+ <button class="bh bi at au av aw ax ay az ba bj bk bd bl bm"><svg width="29" height="29" class="bt">
+ <path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path></svg></button>
+ </div>
+ <div class="mt r bg">
+ <div class="bt">
+ <span><a href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2F%40johncwelch%2Fsamantha-and-the-great-big-lie-d146a92473a1&amp;source=post_actions_footer--------------------------bookmark_footer-" class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener"><svg width="25" height="25" viewbox="0 0 25 25">
+ <path d="M19 6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14.66h.01c.01.1.05.2.12.28a.5.5 0 0 0 .7.03l5.67-4.12 5.66 4.13a.5.5 0 0 0 .71-.03.5.5 0 0 0 .12-.29H19V6zm-6.84 9.97L7 19.64V6a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v13.64l-5.16-3.67a.49.49 0 0 0-.68 0z" fill-rule="evenodd"></path></svg></a></span>
+ </div>
+ </div>
</div>
</div>
</div>
- <div class="js-postFooterPlacements" data-action-scope="_actionscope_14">
- <div class="streamItem streamItem--placementCardGrid js-streamItem">
- <div class="u-clearfix u-backgroundGrayLightest">
- <div class="row u-marginAuto u-maxWidth1000 u-paddingTop30 u-paddingBottom40">
- <div class="col u-padding8 u-xs-size12of12 u-size4of12">
- <div class="u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="fca2a8fc8f92" data-source="placement_card_footer_grid---------0-40" data-tracking-context="placement" data-scroll="native">
- <a class="link link--noUnderline u-baseColor--link" href="https://medium.com/@sodevious/the-internet-is-for-everyone-fca2a8fc8f92?source=placement_card_footer_grid---------0-40" data-action-source="placement_card_footer_grid---------0-40">
- <div class="u-backgroundCover u-backgroundColorGrayLight u-height100 u-sizeFullWidth u-borderBottomLight u-borderRadiusTop4" style="background-image: url(&quot;https://cdn-images-1.medium.com/fit/c/800/240/1*kgL_DSZsN1hXEm3F8Zy7wg.png&quot;); background-position: 50% 50% !important;"></div>
- </a>
- <div class="u-padding15 u-borderBox u-flexColumn u-height180">
- <a class="link link--noUnderline u-flex1 u-baseColor--link" href="https://medium.com/@sodevious/the-internet-is-for-everyone-fca2a8fc8f92?source=placement_card_footer_grid---------0-40" data-action-source="placement_card_footer_grid---------0-40">
- <div class="postMetaInline u-marginBottom7">Related reads</div>
- <div class="u-textColorDarkest u-contentSansBold u-fontSizeLarge u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">The Internet Is For Everyone</div>
- </a>
- <div class="u-paddingTop10 u-flex0 u-flexCenter">
- <div class="u-flex1 u-noWrapWithEllipsis">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@sodevious" data-action="show-user-card" data-action-value="2090d94f8192" data-action-type="hover" data-user-id="2090d94f8192" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*OxMpHwkDqG1_JdQzgdB8fA.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Nicole Dominguez" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--darker u-baseColor--link" href="https://medium.com/@sodevious?source=placement_card_footer_grid---------0-40" data-action="show-user-card" data-action-source="placement_card_footer_grid---------0-40" data-action-value="2090d94f8192" data-action-type="hover" data-user-id="2090d94f8192" dir="auto">Nicole Dominguez</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="4 min read"></span></div>
- </div>
- </div>
- <div class="u-flex0 u-flexCenter">
- <div class="buttonSet">
- <div class="js-actionRecommend" data-post-id="fca2a8fc8f92" data-is-label-padded="true" data-source="placement_card_footer_grid---------0-40"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/fca2a8fc8f92" data-action-source="placement_card_footer_grid---------0-40"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="fca2a8fc8f92">78</button></div>
- </div>
- <div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div>
- <div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/fca2a8fc8f92"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
- </div>
+ </div>
+ <div>
+ <div class="n p">
+ <div class="z ab ac ae af ek ah ai">
+ <div class="mu mv mw lq r mx y">
+ <div class="r g">
+ <div class="my mz r df">
+ <div class="r s nc nd">
+ <span class="r na al nb"><a rel="noopener" href="/@johncwelch?source=follow_footer--------------------------follow_footer-"><img alt="John C. Welch" class="r fi ne dt" src="https://miro.medium.com/fit/c/160/160/0*qPHQu8WqsC6cV_ud.jpg" width="80" height="80" /></a></span>
+ </div>
+ <div class="nf r ng">
+ <p class="bn fo nh gk ni bs nj">
+ <span class="r na al nb">Written by</span>
+ </p>
+ </div>
+ <div class="nf nk n ng">
+ <div class="ai n o da">
+ <h2 class="bn db nl nm de">
+ <span class="r na al nb"><a class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener" href="/@johncwelch?source=follow_footer--------------------------follow_footer-">John C. Welch</a></span>
+ </h2>
+ <div class="r g">
+ <span class="r na al nb"><span><button class="nn de q fy fz ga gb gc ba bl gd ge gf gg gh gi gj bn b bo bp bq br gm gn ck go gp">Follow</button></span></span>
</div>
</div>
</div>
- </div>
- <div class="col u-padding8 u-xs-size12of12 u-size4of12">
- <div class="u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="489947cc126c" data-source="placement_card_footer_grid---------1-40" data-tracking-context="placement" data-scroll="native">
- <div class="u-padding15 u-borderBox u-flexColumn u-sizeFull">
- <a class="link link--noUnderline u-flex1 u-flexColumn u-baseColor--link" href="https://anxiousrobot.net/the-iphone-7-plus-is-my-only-computer-489947cc126c?source=placement_card_footer_grid---------1-40" data-action-source="placement_card_footer_grid---------1-40">
- <div class="postMetaInline u-marginBottom7">Related reads</div>
- <div class="u-textColorDarkest u-contentSansBold u-fontSizeLarge u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">The iPhone 7 Plus is my only computer</div>
- <div class="u-textColorNormal u-fontSize22 u-contentSansThin u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-marginTop7 u-paddingBottom2">OK, that’s not entirely true — my non-work MacBook Pro is an amazing machine for backing up my pocket computer.</div>
- </a>
- <div class="u-paddingTop10 u-flex0 u-flexCenter">
- <div class="u-flex1 u-noWrapWithEllipsis">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://anxiousrobot.net/@jblanton" data-action="show-user-card" data-action-value="93d1b65b7032" data-action-type="hover" data-user-id="93d1b65b7032" data-collection-slug="anxious-robot" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*N4gA9mFFiTio0ZKT_0EROw.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Justin Blanton" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--darker u-baseColor--link" href="https://anxiousrobot.net/@jblanton?source=placement_card_footer_grid---------1-40" data-action="show-user-card" data-action-source="placement_card_footer_grid---------1-40" data-action-value="93d1b65b7032" data-action-type="hover" data-user-id="93d1b65b7032" data-collection-slug="anxious-robot" dir="auto">Justin Blanton</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="3 min read"></span></div>
- </div>
- </div>
- <div class="u-flex0 u-flexCenter">
- <div class="buttonSet">
- <div class="js-actionRecommend" data-post-id="489947cc126c" data-is-label-padded="true" data-source="placement_card_footer_grid---------1-40"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/489947cc126c" data-action-source="placement_card_footer_grid---------1-40"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="489947cc126c">67</button></div>
- </div>
- <div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div>
- <div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/489947cc126c"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
- </div>
- </div>
+ <div class="nf no r ng ao">
+ <div class="np r">
+ <h4 class="bn fo nq nr bs"></h4>
+ </div>
+ <div class="an ns ao">
+ <span><button class="nn de q fy fz ga gb gc ba bl gd ge gf gg gh gi gj bn b bo bp bq br gm gn ck go gp">Follow</button></span>
</div>
</div>
</div>
- <div class="col u-padding8 u-xs-size12of12 u-size4of12">
- <div class="u-height280 u-sizeFullWidth u-backgroundWhite u-borderCardBorder u-boxShadow u-borderBox u-borderRadius4 js-trackedPost" data-post-id="6cbadf1b3606" data-source="placement_card_footer_grid---------2-40" data-tracking-context="placement" data-scroll="native">
- <a class="link link--noUnderline u-baseColor--link" href="https://medium.com/@adamlisagor/misinfo-in-the-age-of-opinion-6cbadf1b3606?source=placement_card_footer_grid---------2-40" data-action-source="placement_card_footer_grid---------2-40">
- <div class="u-backgroundCover u-backgroundColorGrayLight u-height100 u-sizeFullWidth u-borderBottomLight u-borderRadiusTop4" style="background-image: url(&quot;https://cdn-images-1.medium.com/fit/c/800/240/1*NnElfnGKuaos9py0KzlvVg.gif&quot;); background-position: 50% 50% !important;"></div>
- </a>
- <div class="u-padding15 u-borderBox u-flexColumn u-height180">
- <a class="link link--noUnderline u-flex1 u-baseColor--link" href="https://medium.com/@adamlisagor/misinfo-in-the-age-of-opinion-6cbadf1b3606?source=placement_card_footer_grid---------2-40" data-action-source="placement_card_footer_grid---------2-40">
- <div class="postMetaInline u-marginBottom7">Related reads</div>
- <div class="u-textColorDarkest u-contentSansBold u-fontSizeLarge u-maxHeight2LineHeightTighter u-lineClamp2 u-textOverflowEllipsis u-letterSpacingTight u-paddingBottom2">Misinfo in the Age of Opinion</div>
- </a>
- <div class="u-paddingTop10 u-flex0 u-flexCenter">
- <div class="u-flex1 u-noWrapWithEllipsis">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@adamlisagor" data-action="show-user-card" data-action-value="130561bf7d7a" data-action-type="hover" data-user-id="130561bf7d7a" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*NhVHr1zDwStI2R8u-cMplQ.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Adam Lisagor" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--darker u-baseColor--link" href="https://medium.com/@adamlisagor?source=placement_card_footer_grid---------2-40" data-action="show-user-card" data-action-source="placement_card_footer_grid---------2-40" data-action-value="130561bf7d7a" data-action-type="hover" data-user-id="130561bf7d7a" dir="auto">Adam Lisagor</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><span class="readingTime u-textColorNormal" title="3 min read"></span></div>
- </div>
- </div>
- <div class="u-flex0 u-flexCenter">
- <div class="buttonSet">
- <div class="js-actionRecommend" data-post-id="6cbadf1b3606" data-is-label-padded="true" data-source="placement_card_footer_grid---------2-40"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/6cbadf1b3606" data-action-source="placement_card_footer_grid---------2-40"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents u-marginLeft4" data-action="show-recommends" data-action-value="6cbadf1b3606">85</button></div>
- </div>
- <div class="u-height20 u-borderRightLighter u-inlineBlock u-relative u-marginRight10 u-marginLeft12"></div>
- <div class="buttonSet"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/6cbadf1b3606"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
+ </div>
+ <div class="an ao">
+ <div class="nt r">
+ <div class="n cz">
+ <div class="nu r">
+ <a rel="noopener" href="/@johncwelch?source=follow_footer--------------------------follow_footer-"><img alt="John C. Welch" class="r fi nv nw" src="https://miro.medium.com/fit/c/80/80/0*qPHQu8WqsC6cV_ud.jpg" width="40" height="40" /></a>
+ </div>
+ <div class="fl r">
+ <p class="bn fo nx ny ni bs nj">
+ Written by
+ </p>
+ <div class="n cz">
+ <h2 class="bn db nq nz de">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm" rel="noopener" href="/@johncwelch?source=follow_footer--------------------------follow_footer-">John C. Welch</a>
+ </h2>
+ <div class="fl r">
+ <span><button class="fx de q fy fz ga gb gc ba bl gd ge gf gg gh gi gj bn b bo gk gl br gm gn ck go gp">Follow</button></span>
</div>
</div>
+ <div class="oa r">
+ <h4 class="bn fo fp bp bs"></h4>
+ </div>
</div>
</div>
</div>
</div>
</div>
+ <div class="ob mv r mx oc y"></div>
</div>
</div>
- <div class="u-padding0 u-clearfix u-backgroundGrayLightest u-print-hide supplementalPostContent js-responsesWrapper" data-action-scope="_actionscope_5">
- <div class="container u-maxWidth740">
- <div class="responsesStreamWrapper u-maxWidth640 js-responsesStreamWrapper">
- <div class="container u-maxWidth640 responsesStream-title u-paddingTop15">
- <div class="row">
- <div class="heading u-clearfix">
- <div class="u-clearfix">
- <div class="heading-content u-floatLeft"><span class="heading-title heading-title--semibold">Responses</span></div>
- </div>
- </div>
+ <div class="od r oe y">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="of og r">
+ <div class="oh oi oj og r ok ol">
+ <h2 class="bn db om hg on hk oo ho op hs oq hw de">
+ More From Medium
+ </h2>
</div>
- </div>
- <div class="container u-maxWidth640 u-marginBottom30 responsesStream-editor cardChromeless js-responsesStreamEditor">
- <div class="row">
- <div class="col u-size12of12">
- <div class="u-paddingTop30 u-paddingBottom30 u-paddingLeft0 u-paddingRight0 u-borderBottomLightest js-responsesLoggedOutPrompt"><button class="button button--chromeless is-touchIconBlackPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--withIconAndLabel button--loggedOutPrompt" data-action="sign-in-prompt" data-redirect="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1#--respond" data-action-source="logged_out_response_prompt"><span class="svgIcon svgIcon--response svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.27 20.058c1.89-1.826 2.754-4.17 2.754-6.674C24.024 8.21 19.67 4 14.1 4 8.53 4 4 8.21 4 13.384c0 5.175 4.53 9.385 10.1 9.385 1.007 0 2-.14 2.95-.41.285.25.592.49.918.7 1.306.87 2.716 1.31 4.19 1.31.276-.01.494-.14.6-.36a.625.625 0 0 0-.052-.65c-.61-.84-1.042-1.71-1.282-2.58a5.417 5.417 0 0 1-.154-.75zm-3.85 1.324l-.083-.28-.388.12a9.72 9.72 0 0 1-2.85.424c-4.96 0-8.99-3.706-8.99-8.262 0-4.556 4.03-8.263 8.99-8.263 4.95 0 8.77 3.71 8.77 8.27 0 2.25-.75 4.35-2.5 5.92l-.24.21v.32c0 .07 0 .19.02.37.03.29.1.6.19.92.19.7.49 1.4.89 2.08-.93-.14-1.83-.49-2.67-1.06-.34-.22-.88-.48-1.16-.74z"/></svg></span><span class="button-label js-buttonLabel">Write a response…</span></button></div>
- </div>
- </div>
- </div>
- <div class="container u-maxWidth640 u-marginBottom30 u-borderTopLighter u-hide js-noOtherResponses">
- <div class="row">
- <div class="col u-size12of12">
- <div class="u-paddingTop20 u-paddingBottom25">
- <div class="u-inlineBlock u-verticalAlignTop u-paddingRight10">
- <div class="avatar u-inline"><img src="https://cdn-images-1.medium.com/proxy/1*dmbNkD5D-u45r44go_cf0g.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Unknown user" /></div>
- </div>
- <div class="u-inlineBlock">
- <div class="u-lineHeight36 u-textColorNormal u-contentSerifRegular">No responses yet</div>
+ <div class="ly n cz lp or os ot ou ov ow ox oy oz pa pb pc pd pe pf">
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a rel="noopener" href="/@francoise_93266/the-pinterest-paradox-cupcakes-and-toxicity-57ed6bd76960?source=post_internal_links---------0------------------">The Pinterest Paradox: Cupcakes and Toxicity</a>
+ </h2>
+ </div>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@francoise_93266?source=post_internal_links---------0------------------">Francoise Brougher</a></span></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="fl gz r qs qt">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener" href="/@francoise_93266/the-pinterest-paradox-cupcakes-and-toxicity-57ed6bd76960?source=post_internal_links---------0------------------">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*hn4v1tCaJy7cWMyb0bpNpQ.png?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*hn4v1tCaJy7cWMyb0bpNpQ.png" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*hn4v1tCaJy7cWMyb0bpNpQ.png 48w, https://miro.medium.com/fit/c/140/140/1*hn4v1tCaJy7cWMyb0bpNpQ.png 70w" sizes="70px" role="presentation" /></noscript>
+ </div>
+ </div></a>
+ </div>
+ </div>
</div>
</div>
</div>
- </div>
- </div>
- <div class="responsesStream js-responsesStream">
- <div class="streamItem streamItem--postPreview js-streamItem" data-action-scope="_actionscope_6">
- <div class="streamItem-card streamItem-card--postPreview streamItem-card--hPadding20 streamItem-card--borderRadius3 cardChromeless">
- <div class="streamItem-cardInner streamItem-cardInner--postPreview">
- <div class="postArticle postArticle--short js-postArticle js-trackedPost" data-post-id="b8414f23f7b2" data-source="responses---------0-31---------" data-action-scope="_actionscope_7" data-scroll="native">
- <div class="u-marginBottom10">
- <div class="postMetaInline">Recommended by <a class="link link--darken u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a> (author)</div>
- </div>
- <div class="u-clearfix u-marginBottom10">
- <div class="postMetaInline u-floatLeft">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@Nishinari" data-action="show-user-card" data-action-value="46e2e2af3eb1" data-action-type="hover" data-user-id="46e2e2af3eb1" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*dmbNkD5D-u45r44go_cf0g.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Nishinari" /></a>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a rel="noopener" href="/the-ascent/your-life-is-full-of-porn-stop-getting-yourself-off-c16cc0b092f1?source=post_internal_links---------1------------------">Your Life Is Full of Porn. Stop Getting Yourself Off.</a>
+ </h2>
</div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@Nishinari?source=responses---------0-31---------" data-action="show-user-card" data-action-source="responses---------0-31---------" data-action-value="46e2e2af3eb1" data-action-type="hover" data-user-id="46e2e2af3eb1" dir="auto">Nishinari</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><a class="link link--darken" href="https://medium.com/@Nishinari/whether-it-s-the-incestuous-web-of-podcasts-or-all-the-time-they-spend-on-twitter-the-regular-b8414f23f7b2?source=responses---------0-31---------" data-action="open-post" data-action-value="https://medium.com/@Nishinari/whether-it-s-the-incestuous-web-of-podcasts-or-all-the-time-they-spend-on-twitter-the-regular-b8414f23f7b2?source=responses---------0-31---------" data-action-source="preview-listing"><time datetime="2015-10-16T13:39:57.667Z">Oct 16, 2015</time></a><span class="middotDivider u-fontSizeSmallest"></span><span class="readingTime" title="1 min read"></span></div>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@timdenning?source=post_internal_links---------1------------------">Tim Denning</a> <span><!-- -->in<!-- --> <a href="https://theascent.pub/?source=post_internal_links---------1------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener">The Ascent</a></span></span></span>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</div>
- </div>
- <a href="https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1?source=responses---------0-31---------#aa8e">
- <div class="u-fontSizeSmaller u-marginTop10 u-marginBottom20 u-padding14 u-xs-padding12 u-borderRadius3 u-borderCardBackground u-borderLighterHover u-boxShadow1px4pxCardBorder">
- <div class="label label--quote u-accentColor--highlightFaint">But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a...</div>
+ <div class="fl gz r qs qt">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener" href="/the-ascent/your-life-is-full-of-porn-stop-getting-yourself-off-c16cc0b092f1?source=post_internal_links---------1------------------">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg 48w, https://miro.medium.com/fit/c/140/140/1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg 70w" sizes="70px" role="presentation" /></noscript>
+ </div>
+ </div></a>
</div>
- </a>
- <div class="js-inlineExpandBody">
- <a class="" href="https://medium.com/@Nishinari/whether-it-s-the-incestuous-web-of-podcasts-or-all-the-time-they-spend-on-twitter-the-regular-b8414f23f7b2?source=responses---------0-31---------" data-action="expand-inline">
- <div class="postArticle-content js-postField">
- <section class="section section--body section--first section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="611e" id="611e" class="graf graf--p graf--leading graf--trailing">Whether it's the incestuous web of podcasts or all the time they spend on Twitter, the regular Apple pundits seem to be growing more insular and inward looking. They've got sponsors to not offend, and connections to maintain. They've become bland.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a rel="noopener" href="/@justiceforfahim/mourning-my-baby-brother-fahim-238dae9a4372?source=post_internal_links---------2------------------">Mourning my baby brother, Fahim</a>
+ </h2>
+ </div>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@justiceforfahim?source=post_internal_links---------2------------------">Justiceforfahim</a></span></span>
+ </div>
</div>
</div>
- </section>
- </div>
- </a>
- </div>
- <div class="postArticle-readMore"><button class="button button--smaller button--link u-baseColor--buttonNormal" data-action="expand-inline">Read more…</button></div>
- <div class="u-clearfix u-paddingTop10">
- <div class="buttonSet buttonSet--withLabels u-floatLeft">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="b8414f23f7b2" data-is-flush-left="true" data-source="listing"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/b8414f23f7b2" data-action-source="listing"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents" data-action="show-recommends" data-action-value="b8414f23f7b2">12</button></div>
+ </div>
</div>
</div>
- <div class="buttonSet u-floatRight">
- <div class="buttonSet-inner"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/b8414f23f7b2"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
+ <div class="fl gz r qs qt">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener" href="/@justiceforfahim/mourning-my-baby-brother-fahim-238dae9a4372?source=post_internal_links---------2------------------">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*HizZro5r4AJ8Fj_xjVUzrA.jpeg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*HizZro5r4AJ8Fj_xjVUzrA.jpeg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*HizZro5r4AJ8Fj_xjVUzrA.jpeg 48w, https://miro.medium.com/fit/c/140/140/1*HizZro5r4AJ8Fj_xjVUzrA.jpeg 70w" sizes="70px" role="presentation" /></noscript>
+ </div>
+ </div></a>
</div>
</div>
</div>
</div>
</div>
- </div>
- <div class="streamItem streamItem--conversation js-streamItem" data-action-scope="_actionscope_8">
- <div class="streamItemConversation container u-maxWidth660">
- <div class="streamItemConversation-divider"></div>
- <div class="heading u-clearfix heading--light heading--simple">
- <div class="u-clearfix">
- <div class="heading-content u-floatLeft"><span class="heading-title">Conversation with <a class="link link--accent u-accentColor--textNormal u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a>.</span></div>
- </div>
- </div>
- <div class="row streamItemConversation-inner cardChromeless">
- <div class="streamItemConversationItem streamItemConversationItem--preview">
- <div class="postArticle js-postArticle js-trackedPost postArticle--short" data-post-id="1648db10b297" data-source="responses---------1----------" data-action-scope="_actionscope_9" data-scroll="native">
- <div class="u-clearfix u-marginBottom10">
- <div class="postMetaInline u-floatLeft">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@kevinbehringer" data-action="show-user-card" data-action-value="4f589ec4a333" data-action-type="hover" data-user-id="4f589ec4a333" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*ls5KK6qGIAEs3bVt.jpeg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of Kevin Behringer" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@kevinbehringer?source=responses---------1----------" data-action="show-user-card" data-action-source="responses---------1----------" data-action-value="4f589ec4a333" data-action-type="hover" data-user-id="4f589ec4a333" dir="auto">Kevin Behringer</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><a class="link link--darken" href="https://medium.com/@kevinbehringer/i-think-you-have-an-interesting-take-here-and-it-s-sad-to-see-someone-not-afforded-the-same-1648db10b297?source=responses---------1----------" data-action="open-post" data-action-value="https://medium.com/@kevinbehringer/i-think-you-have-an-interesting-take-here-and-it-s-sad-to-see-someone-not-afforded-the-same-1648db10b297?source=responses---------1----------" data-action-source="preview-listing"><time datetime="2015-10-15T21:08:21.885Z">Oct 16, 2015</time></a><span class="middotDivider u-fontSizeSmallest"></span><span class="readingTime" title="1 min read"></span></div>
- </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a rel="noopener" href="/refinery29/im-a-sugar-baby-this-is-how-much-i-get-paid-to-date-9cf4ec1c8e26?source=post_internal_links---------3------------------">I’m A Sugar Baby-&amp; This Is How Much I Get Paid To Date</a>
+ </h2>
</div>
- </div>
- <div class="js-inlineExpandBody">
- <a class="" href="https://medium.com/@kevinbehringer/i-think-you-have-an-interesting-take-here-and-it-s-sad-to-see-someone-not-afforded-the-same-1648db10b297?source=responses---------1----------" data-action="expand-inline">
- <div class="postArticle-content js-postField">
- <section class="section section--body section--first section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="f695" id="f695" class="graf graf--p graf--leading">I think you have an interesting take here and it’s sad to see someone not afforded the same opportunity to make a name for themselves that the others you reference were given.</p>
- <p name="9480" id="9480" class="graf graf--p graf-after--p graf--trailing">One of the interesting elements that I see in this controversy is the very people who are coming to Marco’s defense (including Marco himself) are the…</p>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@refinery29?source=post_internal_links---------3------------------">Refinery29 UK</a> <span><!-- -->in<!-- --> <a href="/refinery29?source=post_internal_links---------3------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener">Refinery29</a></span></span></span>
</div>
</div>
- </section>
+ </div>
</div>
- </a>
+ </div>
</div>
- <div class="postArticle-readMore"><button class="button button--smaller button--link u-baseColor--buttonNormal" data-action="expand-inline">Read more…</button></div>
- <div class="u-clearfix u-paddingTop10">
- <div class="buttonSet buttonSet--withLabels u-floatLeft">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="1648db10b297" data-is-flush-left="true" data-source="listing"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/1648db10b297" data-action-source="listing"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents" data-action="show-recommends" data-action-value="1648db10b297">3</button></div>
+ <div class="fl gz r qs qt">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener" href="/refinery29/im-a-sugar-baby-this-is-how-much-i-get-paid-to-date-9cf4ec1c8e26?source=post_internal_links---------3------------------">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/0*vGxs86f0dmFewdXV.jpg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/0*vGxs86f0dmFewdXV.jpg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/0*vGxs86f0dmFewdXV.jpg 48w, https://miro.medium.com/fit/c/140/140/0*vGxs86f0dmFewdXV.jpg 70w" sizes="70px" role="presentation" /></noscript>
</div>
- </div>
- <div class="buttonSet u-floatRight">
- <div class="buttonSet-inner"><a class="button button--chromeless u-baseColor--buttonNormal" href="https://medium.com/@kevinbehringer/i-think-you-have-an-interesting-take-here-and-it-s-sad-to-see-someone-not-afforded-the-same-1648db10b297?source=responses---------1----------#--responses" data-action-source="responses---------1----------">1 response</a><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/1648db10b297"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
- </div>
+ </div></a>
</div>
</div>
</div>
- <div class="streamItemConversationItem streamItemConversationItem--preview">
- <div class="postArticle js-postArticle js-trackedPost postArticle--short" data-post-id="c1bb4c38cd0c" data-source="responses---------1----------" data-action-scope="_actionscope_10" data-scroll="native">
- <div class="u-clearfix u-marginBottom10">
- <div class="postMetaInline u-floatLeft">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@johncwelch?source=responses---------1----------" data-action="show-user-card" data-action-source="responses---------1----------" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><a class="link link--darken" href="https://medium.com/@johncwelch/first-thanks-for-this-response-you-raise-an-interesting-point-about-the-pricing-c1bb4c38cd0c?source=responses---------1----------" data-action="open-post" data-action-value="https://medium.com/@johncwelch/first-thanks-for-this-response-you-raise-an-interesting-point-about-the-pricing-c1bb4c38cd0c?source=responses---------1----------" data-action-source="preview-listing"><time datetime="2015-10-15T22:53:38.589Z">Oct 16, 2015</time></a><span class="middotDivider u-fontSizeSmallest"></span><span class="readingTime" title="3 min read"></span></div>
- </div>
+ </div>
+ </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a href="https://eand.co/can-kamala-harris-and-joe-biden-defeat-trump-94a10bc60f2b?source=post_internal_links---------4------------------" rel="noopener nofollow">Can Kamala Harris and Joe Biden Defeat Trump?</a>
+ </h2>
</div>
- </div>
- <div class="js-inlineExpandBody">
- <a class="" href="https://medium.com/@johncwelch/first-thanks-for-this-response-you-raise-an-interesting-point-about-the-pricing-c1bb4c38cd0c?source=responses---------1----------" data-action="expand-inline">
- <div class="postArticle-content js-postField">
- <section class="section section--body section--first section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="6dd7" id="6dd7" class="graf graf--p graf--leading">First, thanks for this response, you raise an interesting point about the pricing. Why is Marco seemingly acting against his own recommendations?</p>
- <p name="267c" id="267c" class="graf graf--p graf-after--p graf--trailing">I could be overly cynical about his motivations, (somewhat easy for me, my personal opinion of him is not good), but I won’t because what I see is that he’s not blazing any form of…</p>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@umairh?source=post_internal_links---------4------------------">umair haque</a> <span><!-- -->in<!-- --> <a href="https://eand.co/?source=post_internal_links---------4------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener nofollow">Eudaimonia and Co</a></span></span></span>
</div>
</div>
- </section>
+ </div>
</div>
- </a>
+ </div>
</div>
- <div class="postArticle-readMore"><button class="button button--smaller button--link u-baseColor--buttonNormal" data-action="expand-inline">Read more…</button></div>
- <div class="u-clearfix u-paddingTop10">
- <div class="buttonSet buttonSet--withLabels u-floatLeft">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="c1bb4c38cd0c" data-is-flush-left="true" data-source="listing"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/c1bb4c38cd0c" data-action-source="listing"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents" data-action="show-recommends" data-action-value="c1bb4c38cd0c">2</button></div>
+ <div class="fl gz r qs qt">
+ <a href="https://eand.co/can-kamala-harris-and-joe-biden-defeat-trump-94a10bc60f2b?source=post_internal_links---------4------------------" class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener nofollow">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*6prX9w38K3M3PEZG9XkbFg.jpeg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*6prX9w38K3M3PEZG9XkbFg.jpeg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*6prX9w38K3M3PEZG9XkbFg.jpeg 48w, https://miro.medium.com/fit/c/140/140/1*6prX9w38K3M3PEZG9XkbFg.jpeg 70w" sizes="70px" role="presentation" /></noscript>
</div>
- </div>
- <div class="buttonSet u-floatRight">
- <div class="buttonSet-inner"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/c1bb4c38cd0c"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
- </div>
+ </div></a>
</div>
</div>
</div>
</div>
</div>
- </div>
- <div class="streamItem streamItem--conversation js-streamItem" data-action-scope="_actionscope_11">
- <div class="streamItemConversation container u-maxWidth660">
- <div class="streamItemConversation-divider"></div>
- <div class="heading u-clearfix heading--light heading--simple">
- <div class="u-clearfix">
- <div class="heading-content u-floatLeft"><span class="heading-title">Conversation with <a class="link link--accent u-accentColor--textNormal u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a>.</span></div>
- </div>
- </div>
- <div class="row streamItemConversation-inner cardChromeless">
- <div class="streamItemConversationItem streamItemConversationItem--preview">
- <div class="postArticle js-postArticle js-trackedPost postArticle--short" data-post-id="f7bed6759086" data-source="responses---------2----------" data-action-scope="_actionscope_12" data-scroll="native">
- <div class="u-clearfix u-marginBottom10">
- <div class="postMetaInline u-floatLeft">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@Tuplet" data-action="show-user-card" data-action-value="3c10dce1c66c" data-action-type="hover" data-user-id="3c10dce1c66c" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/1*L93pJARs7aktgijd_9AT0w.png" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of J.Wilkins" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@Tuplet?source=responses---------2----------" data-action="show-user-card" data-action-source="responses---------2----------" data-action-value="3c10dce1c66c" data-action-type="hover" data-user-id="3c10dce1c66c" dir="auto">J.Wilkins</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><a class="link link--darken" href="https://medium.com/@Tuplet/you-did-not-have-to-make-up-an-east-frog-balls-arkansas-when-there-is-literally-a-possum-grape-f7bed6759086?source=responses---------2----------" data-action="open-post" data-action-value="https://medium.com/@Tuplet/you-did-not-have-to-make-up-an-east-frog-balls-arkansas-when-there-is-literally-a-possum-grape-f7bed6759086?source=responses---------2----------" data-action-source="preview-listing"><time datetime="2015-10-16T16:19:36.962Z">Oct 17, 2015</time></a></div>
- </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a href="https://towardsdatascience.com/best-data-science-certification-4f221ac3dbe3?source=post_internal_links---------5------------------" rel="noopener">The Best Data Science Certification You’ve Never Heard Of</a>
+ </h2>
</div>
- </div>
- <div>
- <a class="" href="https://medium.com/@Tuplet/you-did-not-have-to-make-up-an-east-frog-balls-arkansas-when-there-is-literally-a-possum-grape-f7bed6759086?source=responses---------2----------">
- <div class="postArticle-content js-postField">
- <section class="section section--body section--first section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="ca89" id="ca89" class="graf graf--p graf--leading graf--trailing">You did not have to make up an “East Frog Balls” Arkansas when there is literally a “Possum Grape”</p>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@nicolejaneway?source=post_internal_links---------5------------------">Nicole Janeway Bills</a> <span><!-- -->in<!-- --> <a href="https://towardsdatascience.com/?source=post_internal_links---------5------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener">Towards Data Science</a></span></span></span>
</div>
</div>
- </section>
+ </div>
</div>
- </a>
+ </div>
</div>
- <div class="u-clearfix u-paddingTop10">
- <div class="buttonSet buttonSet--withLabels u-floatLeft">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="f7bed6759086" data-is-flush-left="true" data-source="listing"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/f7bed6759086" data-action-source="listing"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-disablePointerEvents" data-action="show-recommends" data-action-value="f7bed6759086">1</button></div>
+ <div class="fl gz r qs qt">
+ <a href="https://towardsdatascience.com/best-data-science-certification-4f221ac3dbe3?source=post_internal_links---------5------------------" class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*t43PDV1g9w-DvjMugoks2A.jpeg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*t43PDV1g9w-DvjMugoks2A.jpeg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*t43PDV1g9w-DvjMugoks2A.jpeg 48w, https://miro.medium.com/fit/c/140/140/1*t43PDV1g9w-DvjMugoks2A.jpeg 70w" sizes="70px" role="presentation" /></noscript>
</div>
- </div>
- <div class="buttonSet u-floatRight">
- <div class="buttonSet-inner"><a class="button button--chromeless u-baseColor--buttonNormal" href="https://medium.com/@Tuplet/you-did-not-have-to-make-up-an-east-frog-balls-arkansas-when-there-is-literally-a-possum-grape-f7bed6759086?source=responses---------2----------#--responses" data-action-source="responses---------2----------">1 response</a><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/f7bed6759086"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
- </div>
+ </div></a>
</div>
</div>
</div>
- <div class="streamItemConversationItem streamItemConversationItem--preview">
- <div class="postArticle js-postArticle js-trackedPost postArticle--short" data-post-id="a7a213849339" data-source="responses---------2----------" data-action-scope="_actionscope_13" data-scroll="native">
- <div class="u-clearfix u-marginBottom10">
- <div class="postMetaInline u-floatLeft">
- <div class="postMetaInline-avatar">
- <a class="link avatar u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/72/72/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image u-size36x36 u-xs-size32x32" alt="Go to the profile of John C. Welch" /></a>
- </div>
- <div class="postMetaInline-authorLockup"><a class="link link link--darken link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@johncwelch?source=responses---------2----------" data-action="show-user-card" data-action-source="responses---------2----------" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto">John C. Welch</a>
- <div class="u-fontSizeSmallest u-baseColor--textNormal u-textColorNormal js-postMetaInlineSupplemental"><a class="link link--darken" href="https://medium.com/@johncwelch/lmao-unsurprising-a7a213849339?source=responses---------2----------" data-action="open-post" data-action-value="https://medium.com/@johncwelch/lmao-unsurprising-a7a213849339?source=responses---------2----------" data-action-source="preview-listing"><time datetime="2015-10-16T20:47:45.884Z">Oct 17, 2015</time></a></div>
- </div>
+ </div>
+ </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a rel="noopener" href="/javascript-in-plain-english/typescript-4-0-i-want-a-list-of-generic-params-with-good-labels-c6087d2df935?source=post_internal_links---------6------------------">TypeScript 4.0 finally delivers what I’ve been waiting for</a>
+ </h2>
</div>
- </div>
- <div>
- <a class="" href="https://medium.com/@johncwelch/lmao-unsurprising-a7a213849339?source=responses---------2----------">
- <div class="postArticle-content js-postField">
- <section class="section section--body section--first section--last">
- <div class="section-divider">
- <hr class="section-divider" />
- </div>
- <div class="section-content">
- <div class="section-inner sectionLayout--insetColumn">
- <p name="b80c" id="b80c" class="graf graf--p graf--leading">LMAO. Unsurprising. However, the source of that is a Carlin routine on people who cannot get off the phone and bore with their crap. I think it went: “…it was the year we visited my sister in Frog Balls, Arkansas”. Ever since, I use that, or the EFB variant when I want to bring to mind a wee tiny town.</p>
- <p name="61a4" id="61a4" class="graf graf--p graf-after--p graf--trailing">because it makes me giggle. EVERY TIME.</p>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@nathanielkessler?source=post_internal_links---------6------------------">Nathaniel Kessler</a> <span><!-- -->in<!-- --> <a href="/javascript-in-plain-english?source=post_internal_links---------6------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener">JavaScript In Plain English</a></span></span></span>
</div>
</div>
- </section>
+ </div>
</div>
- </a>
+ </div>
</div>
- <div class="u-clearfix u-paddingTop10">
- <div class="buttonSet buttonSet--withLabels u-floatLeft">
- <div class="buttonSet-inner">
- <div class="js-actionRecommend" data-post-id="a7a213849339" data-is-flush-left="true" data-source="listing"><button class="button button--primary button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/a7a213849339" data-action-source="listing"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12zM8.428 4.866c-2.414 0-4.378 2.05-4.378 4.568 0 3.475 5.057 7.704 7.774 9.975.243.2.47.39.676.56.245-.21.52-.43.813-.68 2.856-2.36 7.637-6.31 7.637-9.87 0-2.52-1.964-4.57-4.377-4.57-1.466 0-2.828.76-3.644 2.04-.1.14-.26.23-.43.23-.18 0-.34-.09-.43-.24-.82-1.27-2.18-2.03-3.65-2.03z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--25px is-flushLeft"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M12.5 21a.492.492 0 0 1-.327-.122c-.278-.24-.61-.517-.978-.826-2.99-2.5-7.995-6.684-7.995-10.565C3.2 6.462 5.578 4 8.5 4c1.55 0 3 .695 4 1.89a5.21 5.21 0 0 1 4-1.89c2.923 0 5.3 2.462 5.3 5.487 0 3.97-4.923 8.035-7.865 10.464-.42.35-.798.66-1.108.93a.503.503 0 0 1-.327.12z" fill-rule="evenodd"/></svg></span></span></button></div>
+ <div class="fl gz r qs qt">
+ <a class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener" href="/javascript-in-plain-english/typescript-4-0-i-want-a-list-of-generic-params-with-good-labels-c6087d2df935?source=post_internal_links---------6------------------">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*G00zmJivkNGN1L6fDo9vnQ.png?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*G00zmJivkNGN1L6fDo9vnQ.png" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*G00zmJivkNGN1L6fDo9vnQ.png 48w, https://miro.medium.com/fit/c/140/140/1*G00zmJivkNGN1L6fDo9vnQ.png 70w" sizes="70px" role="presentation" /></noscript>
</div>
+ </div></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa">
+ <div class="qb qc r">
+ <div class="ai by">
+ <div class="n da">
+ <div class="r qd qe qf qg">
+ <div class="qh r">
+ <h2 class="bn db qi qj qk ql qm qn qo qp qq qr de">
+ <a href="https://eand.co/america-and-the-axis-of-idiots-25a86ed4a421?source=post_internal_links---------7------------------" rel="noopener nofollow">America and the Axis of Idiots</a>
+ </h2>
</div>
- <div class="buttonSet u-floatRight">
- <div class="buttonSet-inner"><button class="button button--chromeless is-touchIconFadeInPulse u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--bookmark js-bookmarkButton" title="Bookmark this story to read later" aria-label="Bookmark this story to read later" data-action="sign-in-prompt" data-sign-in-action="add-to-bookmarks" data-requires-token="true" data-redirect="https://medium.com/_/bookmark/p/a7a213849339"><span class="button-defaultState"><span class="svgIcon svgIcon--bookmark svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19 6c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 16.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V6zm-6.838 9.97L7 19.636V6c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v13.637l-5.162-3.668a.49.49 0 0 0-.676 0z" fill-rule="evenodd"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--bookmarkFilled svgIcon--25px is-flushRight"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="26" viewBox="0 0 25 26"><path d="M19 7c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v14.66h.012c.01.103.045.204.12.285a.5.5 0 0 0 .706.03L12.5 17.85l5.662 4.126a.508.508 0 0 0 .708-.03.5.5 0 0 0 .118-.285H19V7z" fill-rule="evenodd"/></svg></span></span></button></div>
+ <div class="o n">
+ <div class="ai r">
+ <div class="n">
+ <div style="flex:1">
+ <div class="bu n o fn">
+ <span class="bn b bo bp bq br r de q"><span class="bn fo gl bp de"><a class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener" href="/@umairh?source=post_internal_links---------7------------------">umair haque</a> <span><!-- -->in<!-- --> <a href="https://eand.co/?source=post_internal_links---------7------------------" class="bh bi at au av aw ax ay az ba fw bd bl bm" rel="noopener nofollow">Eudaimonia and Co</a></span></span></span>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</div>
+ <div class="fl gz r qs qt">
+ <a href="https://eand.co/america-and-the-axis-of-idiots-25a86ed4a421?source=post_internal_links---------7------------------" class="bh bi at au av aw ax ay az ba bj bk bd bl bm r" rel="noopener nofollow">
+ <div class="jk r df dn">
+ <div class="qu jm r">
+ <div class="cd jh s t u by ai fq ji jj">
+ <img class="s t u by ai jn jo jp" src="https://miro.medium.com/max/60/1*yNRBQduBLs8p_tEpShEGzQ.jpeg?q=20" width="70" height="70" role="presentation" />
+ </div><img class="cd jh qv qw qx qy qz ra rb rc rd re c" width="70" height="70" role="presentation" /><noscript><img class="qv qw qx qy qz ra rb rc rd re" src="https://miro.medium.com/fit/c/140/140/1*yNRBQduBLs8p_tEpShEGzQ.jpeg" width="70" height="70" srcset="https://miro.medium.com/fit/c/96/140/1*yNRBQduBLs8p_tEpShEGzQ.jpeg 48w, https://miro.medium.com/fit/c/140/140/1*yNRBQduBLs8p_tEpShEGzQ.jpeg 70w" sizes="70px" role="presentation" /></noscript>
+ </div>
+ </div></a>
+ </div>
</div>
</div>
</div>
</div>
</div>
</div>
- <div class="container u-maxWidth640 js-showOtherResponses">
- <div class="row"><button class="button button--primary button--withChrome u-accentColor--buttonNormal responsesStream-showOtherResponses cardChromeless u-sizeFullWidth" data-action="show-other-responses">Show all responses</button></div>
- </div>
- <div class="responsesStream js-responsesStreamOther"></div>
</div>
</div>
</div>
- <div class="supplementalPostContent js-readNext"></div>
- <div class="supplementalPostContent js-heroPromo"></div>
- </footer>
- </article>
- </main>
- <div class="u-marginAuto u-maxWidth1000">
- <div class="js-postShareWidget u-foreground u-sm-hide u-transition--fadeOut300 u-fixed" data-scroll="fixed" style="top: 150px;">
- <ul>
- <li class="u-uiTextSemibold u-textAlignCenter u-textColorNormal u-fontSizeSmallest u-textUppercase">Share</li>
- <li class="u-textAlignCenter">
- <div class="js-actionRecommend" data-post-id="d146a92473a1" data-is-icon-29px="true" data-is-vertical="true" data-has-recommend-list="true" data-source="post_share_widget"><button class="button button--primary button--large button--chromeless is-touchIconFadeInPulse u-accentColor--buttonNormal button--withIcon button--withSvgIcon u-accentColor--iconLight js-actionRecommendButton" title="Recommend to share this article with your followers and let the author know you liked it" aria-label="Recommend to share this article with your followers and let the author know you liked it" data-action="sign-in-prompt" data-sign-in-action="upvote" data-requires-token="true" data-redirect="https://medium.com/_/vote/p/d146a92473a1" data-action-source="post_share_widget"><span class="button-defaultState"><span class="svgIcon svgIcon--heart svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.215 23.716c-.348.288-.984.826-1.376 1.158a.526.526 0 0 1-.68 0c-.36-.307-.92-.78-1.22-1.03C9.22 20.734 3 15.527 3 10.734 3 7.02 5.916 4 9.5 4c1.948 0 3.77.898 5 2.434C15.73 4.898 17.552 4 19.5 4c3.584 0 6.5 3.02 6.5 6.734 0 4.9-6.125 9.96-9.785 12.982zM19.5 5.2c-1.774 0-3.423.923-4.41 2.468a.699.699 0 0 1-.59.323.706.706 0 0 1-.59-.32c-.988-1.54-2.637-2.47-4.41-2.47-2.922 0-5.3 2.49-5.3 5.54 0 4.23 6.19 9.41 9.517 12.19.217.18.566.48.783.66l.952-.79c3.496-2.88 9.348-7.72 9.348-12.05 0-3.05-2.378-5.53-5.3-5.53z"/></svg></span></span><span class="button-activeState"><span class="svgIcon svgIcon--heartFilled svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M19.5 4c-1.948 0-3.77.898-5 2.434C13.27 4.898 11.448 4 9.5 4 5.916 4 3 7.02 3 10.734c0 4.793 6.227 10 9.95 13.11.296.25.853.723 1.212 1.03.196.166.48.166.677 0 .39-.332 1.02-.87 1.37-1.158 3.66-3.022 9.79-8.08 9.79-12.982C26 7.02 23.08 4 19.5 4z" fill-rule="evenodd"/></svg></span></span></button><button class="button button--chromeless u-baseColor--buttonNormal u-block u-marginAuto u-marginTopNegative5" data-action="show-recommends" data-action-value="d146a92473a1">168</button></div>
- </li>
- <li class="u-textAlignCenter"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Twitter" aria-label="Share on Twitter" data-action="share-on-twitter" data-action-source="post_share_widget"><span class="svgIcon svgIcon--twitter svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M21.967 11.8c.018 5.93-4.607 11.18-11.177 11.18-2.172 0-4.25-.62-6.047-1.76l-.268.422-.038.5.186.013.168.012c.3.02.44.032.6.046 2.06-.026 3.95-.686 5.49-1.86l1.12-.85-1.4-.048c-1.57-.055-2.92-1.08-3.36-2.51l-.48.146-.05.5c.22.03.48.05.75.08.48-.02.87-.07 1.25-.15l2.33-.49-2.32-.49c-1.68-.35-2.91-1.83-2.91-3.55 0-.05 0-.01-.01.03l-.49-.1-.25.44c.63.36 1.35.57 2.07.58l1.7.04L7.4 13c-.978-.662-1.59-1.79-1.618-3.047a4.08 4.08 0 0 1 .524-1.8l-.825.07a12.188 12.188 0 0 0 8.81 4.515l.59.033-.06-.59v-.02c-.05-.43-.06-.63-.06-.87a3.617 3.617 0 0 1 6.27-2.45l.2.21.28-.06c1.01-.22 1.94-.59 2.73-1.09l-.75-.56c-.1.36-.04.89.12 1.36.23.68.58 1.13 1.17.85l-.21-.45-.42-.27c-.52.8-1.17 1.48-1.92 2L22 11l.016.28c.013.2.014.35 0 .52v.04zm.998.038c.018-.22.017-.417 0-.66l-.498.034.284.41a8.183 8.183 0 0 0 2.2-2.267l.97-1.48-1.6.755c.17-.08.3-.02.34.03a.914.914 0 0 1-.13-.292c-.1-.297-.13-.64-.1-.766l.36-1.254-1.1.695c-.69.438-1.51.764-2.41.963l.48.15a4.574 4.574 0 0 0-3.38-1.484 4.616 4.616 0 0 0-4.61 4.613c0 .29.02.51.08.984l.01.02.5-.06.03-.5c-3.17-.18-6.1-1.7-8.08-4.15l-.48-.56-.36.64c-.39.69-.62 1.48-.65 2.28.04 1.61.81 3.04 2.06 3.88l.3-.92c-.55-.02-1.11-.17-1.6-.45l-.59-.34-.14.67c-.02.08-.02.16 0 .24-.01 2.12 1.55 4.01 3.69 4.46l.1-.49-.1-.49c-.33.07-.67.12-1.03.14-.18-.02-.43-.05-.64-.07l-.76-.09.23.73c.57 1.84 2.29 3.14 4.28 3.21l-.28-.89a8.252 8.252 0 0 1-4.85 1.66c-.12-.01-.26-.02-.56-.05l-.17-.01-.18-.01L2.53 21l1.694 1.07a12.233 12.233 0 0 0 6.58 1.917c7.156 0 12.2-5.73 12.18-12.18l-.002.04z"/></svg></span></button></li>
- <li class="u-textAlignCenter"><button class="button button--large button--dark button--chromeless is-touchIconBlackPulse u-baseColor--buttonDark button--withIcon button--withSvgIcon" title="Share on Facebook" aria-label="Share on Facebook" data-action="share-on-facebook" data-action-source="post_share_widget"><span class="svgIcon svgIcon--facebook svgIcon--29px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="29" height="29" viewBox="0 0 29 29"><path d="M16.39 23.61v-5.808h1.846a.55.55 0 0 0 .546-.48l.36-2.797a.551.551 0 0 0-.547-.62H16.39V12.67c0-.67.12-.813.828-.813h1.474a.55.55 0 0 0 .55-.55V8.803a.55.55 0 0 0-.477-.545c-.436-.06-1.36-.116-2.22-.116-2.5 0-4.13 1.62-4.13 4.248v1.513H10.56a.551.551 0 0 0-.55.55v2.797c0 .304.248.55.55.55h1.855v5.76c-4.172-.96-7.215-4.7-7.215-9.1 0-5.17 4.17-9.36 9.31-9.36 5.14 0 9.31 4.19 9.31 9.36 0 4.48-3.155 8.27-7.43 9.15M14.51 4C8.76 4 4.1 8.684 4.1 14.46c0 5.162 3.75 9.523 8.778 10.32a.55.55 0 0 0 .637-.543v-6.985a.551.551 0 0 0-.55-.55H11.11v-1.697h1.855a.55.55 0 0 0 .55-.55v-2.063c0-2.02 1.136-3.148 3.03-3.148.567 0 1.156.027 1.597.06v1.453h-.924c-1.363 0-1.93.675-1.93 1.912v1.78c0 .3.247.55.55.55h2.132l-.218 1.69H15.84c-.305 0-.55.24-.55.55v7.02c0 .33.293.59.623.54 5.135-.7 9.007-5.11 9.007-10.36C24.92 8.68 20.26 4 14.51 4"/></svg></span></button></li>
- </ul>
+ </div>
</div>
</div>
- <div class="u-fixed u-bottom0 u-sizeFullWidth u-backgroundWhite u-boxShadowTop u-borderBox u-paddingTop10 u-paddingBottom10 u-zIndexMetabar u-xs-paddingLeft10 u-xs-paddingRight10">
- <div class="u-maxWidth700 u-marginAuto u-flexCenter">
- <div class="u-fontSizeSmall u-flex1 u-flexCenter">
- <div class="u-flex0 u-inlineBlock u-paddingRight20 u-xs-paddingRight10">
- <a class="link avatar u-inline u-baseColor--link" href="https://medium.com/@johncwelch" data-action="show-user-card" data-action-value="77a507c5ad19" data-action-type="hover" data-user-id="77a507c5ad19" dir="auto"><img src="https://cdn-images-1.medium.com/fit/c/80/80/0*qPHQu8WqsC6cV_ud.jpg" class="avatar-image avatar-image--smaller" alt="Go to the profile of John C. Welch" /></a>
+ <div class="rf r rg rh">
+ <div class="n p">
+ <div class="z ab ac ae af ag ah ai">
+ <div class="ri rj my n da g">
+ <div class="rk n da">
+ <div class="rl r rm">
+ <div class="qh r">
+ <a class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener" href="/about?autoplay=1&amp;source=post_page-----d146a92473a1----------------------">
+ <h2 class="bn db dc dd rr">
+ Discover <!-- -->Medium
+ </h2></a>
+ </div>
+ <h4 class="bn fo fp bp rs">
+ Welcome to a place where words matter. On <!-- -->Medium<!-- -->, smart voices and original ideas take center stage - with no ads in sight.<!-- --> <a class="bh bi at au av aw ax ay az ba bd rp rq rt" rel="noopener" href="/about?autoplay=1&amp;source=post_page-----d146a92473a1----------------------">Watch</a>
+ </h4>
+ </div>
+ <div class="rl r rm">
+ <div class="qh r">
+ <a href="https://medium.com/topics?source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener">
+ <h2 class="bn db dc dd rr">
+ Make <!-- -->Medium<!-- --> yours
+ </h2></a>
+ </div>
+ <h4 class="bn fo fp bp rs">
+ Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox.<!-- --> <a href="https://medium.com/topics?source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba bd rp rq rt" rel="noopener">Explore</a>
+ </h4>
+ </div>
+ <div class="rl r rm">
+ <div class="qh r">
+ <a class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener" href="/membership?source=post_page-----d146a92473a1----------------------">
+ <h2 class="bn db dc dd rr">
+ Become a member
+ </h2></a>
+ </div>
+ <h4 class="bn fo fp bp rs">
+ Get unlimited access to the best stories on <!-- -->Medium<!-- --> — and support writers while you’re at it. Just $5/month.<!-- --> <a class="bh bi at au av aw ax ay az ba bd rp rq rt" rel="noopener" href="/membership?source=post_page-----d146a92473a1----------------------">Upgrade</a>
+ </h4>
+ </div>
+ </div>
</div>
- <div class="u-flex1 u-inlineBlock">
- <div class="u-xs-hide">Never miss a story from<strong> John C. Welch</strong>, when you sign up for Medium. <a class="link link--accent u-accentColor--textNormal u-accentColor--textDarken u-baseColor--link" href="https://medium.com/@Medium/personalize-your-medium-experience-with-users-publications-tags-26a41ab1ee0c#.hx4zuv3mg" data-action-source="sticky_footer">Learn more</a></div>
- <div class="u-xs-show">Never miss a story from<strong> John C. Welch</strong></div>
+ <div class="n ke">
+ <div class="n o da">
+ <a class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener" href="/?source=post_page-----d146a92473a1----------------------"><svg height="22" width="112" viewbox="0 0 111.5 22" class="ru">
+ <path d="M56.3 19.5c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5V19c-.7 1.8-2.4 3-4.3 3-3.3 0-5.8-2.6-5.8-7.5 0-4.5 2.6-7.6 6.3-7.6 1.6-.1 3.1.8 3.8 2.4V3.2c0-.3-.1-.6-.3-.7l-1.4-1.4V1l6.5-.8v19.3zm-4.8-.8V9.5c-.5-.6-1.2-.9-1.9-.9-1.6 0-3.1 1.4-3.1 5.7 0 4 1.3 5.4 3 5.4.8.1 1.6-.3 2-1zm9.1 3.1V9.4c0-.3-.1-.6-.3-.7l-1.4-1.5v-.1h6.5v12.5c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5zm-.2-19.2C60.4 1.2 61.5 0 63 0c1.4 0 2.6 1.2 2.6 2.6S64.4 5.3 63 5.3a2.6 2.6 0 0 1-2.6-2.7zm22.5 16.9c0 .4 0 .5.3.7l1.5 1.4v.1h-6.5v-3.2c-.6 2-2.4 3.4-4.5 3.4-2.9 0-4.4-2.1-4.4-6.2 0-1.9 0-4.1.1-6.5 0-.3-.1-.5-.3-.7L67.7 7v.1H74v8c0 2.6.4 4.4 2 4.4.9-.1 1.7-.6 2.1-1.3V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v12.4zm22 2.3c0-.5.1-6.5.1-7.9 0-2.6-.4-4.5-2.2-4.5-.9 0-1.8.5-2.3 1.3.2.8.3 1.7.3 2.5 0 1.8-.1 4.2-.1 6.5 0 .3.1.5.3.7l1.5 1.4v.1H96c0-.4.1-6.5.1-7.9 0-2.7-.4-4.5-2.2-4.5-.9 0-1.7.5-2.2 1.3v9c0 .4 0 .5.3.7l1.4 1.4v.1h-6.5V9.5c0-.3-.1-.6-.3-.7l-1.4-1.5v-.2h6.5v3.1a4.6 4.6 0 0 1 4.6-3.4c2.2 0 3.6 1.2 4.2 3.5.7-2.1 2.7-3.6 4.9-3.5 2.9 0 4.5 2.2 4.5 6.2 0 1.9-.1 4.2-.1 6.5-.1.3.1.6.3.7l1.4 1.4v.1h-6.6zm-81.4-2l1.9 1.9v.1h-9.8v-.1l2-1.9c.2-.2.3-.4.3-.7V7.3c0-.5 0-1.2.1-1.8L11.4 22h-.1L4.5 6.8c-.1-.4-.2-.4-.3-.6v10c-.1.7 0 1.3.3 1.9l2.7 3.6v.1H0v-.1L2.7 18c.3-.6.4-1.3.3-1.9v-11c0-.5-.1-1.1-.5-1.5L.7 1.1V1h7l5.8 12.9L18.6 1h6.8v.1l-1.9 2.2c-.2.2-.3.5-.3.7v15.2c0 .2.1.5.3.6zm7.6-5.9c0 3.8 1.9 5.3 4.2 5.3 1.9.1 3.6-1 4.4-2.7h.1c-.8 3.7-3.1 5.5-6.5 5.5-3.7 0-7.2-2.2-7.2-7.4 0-5.5 3.5-7.6 7.3-7.6 3.1 0 6.4 1.5 6.4 6.2v.8h-8.7zm0-.8h4.3v-.8c0-3.9-.8-4.9-2-4.9-1.4.1-2.3 1.6-2.3 5.7z"></path></svg></a>
+ <div class="oa rv n da rw al">
+ <h4 class="bn fo fp bp rs"></h4>
+ </div><a class="bh bi at au av aw ax ay az ba fw bd rp rq" rel="noopener" href="/about?autoplay=1&amp;source=post_page-----d146a92473a1----------------------">About</a>
+ <h4 class="bn fo nq nr rr">
+ <a href="https://help.medium.com/hc/en-us?source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba fw bd rp rq" rel="noopener">Help</a>
+ </h4>
+ <h4 class="bn fo nq nr rr">
+ <a href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba fw bd rp rq" rel="noopener">Legal</a>
+ </h4>
+ </div>
+ </div>
+ <div class="an rx ry al">
+ <h4 class="bn fo nq nr rs">
+ Get the Medium app
+ </h4>
+ </div>
+ <div class="an rx cs al rz">
+ <div class="sa r">
+ <a href="https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&amp;mt=8&amp;ct=post_page&amp;source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener nofollow"><img alt="A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store" class="" src="https://miro.medium.com/max/270/1*Crl55Tm6yDNMoucPo1tvDg.png" width="135" height="41" /></a>
+ </div>
+ <div class="r">
+ <a href="https://play.google.com/store/apps/details?id=com.medium.reader&amp;source=post_page-----d146a92473a1----------------------" class="bh bi at au av aw ax ay az ba rn ro bd rp rq" rel="noopener nofollow"><img alt="A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store" class="" src="https://miro.medium.com/max/270/1*W_RAPQ62h0em559zluJLdQ.png" width="135" height="41" /></a>
+ </div>
</div>
</div>
- <div class="u-marginLeft50 u-xs-marginAuto"><span class="followState js-followState buttonSet-inner" data-user-id="77a507c5ad19"><button class="button u-noUserSelect button--withChrome u-baseColor--buttonNormal button--withHover button--unblock js-unblockButton u-uiTextSemibold u-textUppercase u-fontSizeSmallest" data-action="sign-in-prompt" data-sign-in-action="toggle-block-user" data-requires-token="true" data-action-source="sticky_footer"><span class="button-label button-defaultState">Blocked</span><span class="button-label button-hoverState">Unblock</span></button><button class="button button--primary is-active u-noUserSelect button--withChrome u-accentColor--buttonNormal button--follow js-followButton u-uiTextSemibold u-textUppercase u-fontSizeSmallest" data-action="sign-in-prompt" data-sign-in-action="toggle-subscribe-user" data-requires-token="true" data-redirect="https://medium.com/_/subscribe/user/77a507c5ad19" data-action-source="sticky_footer_follow"><span class="button-label button-defaultState js-buttonLabel">Follow</span><span class="button-label button-activeState">Get updates</span></button></span>
- </div>
- </div>
- </div>
- <div class="highlightMenu" data-action-scope="_actionscope_3">
- <div class="highlightMenu-inner">
- <div class="buttonSet"><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu u-accentColor--highlightStrong js-highlightMenuQuoteButton" data-action="sign-in-prompt" data-sign-in-action="quote" data-requires-token="true" data-redirect-type="quote" data-action-source="quote_menu"><span class="svgIcon svgIcon--highlighter svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M13.7 15.964l5.204-9.387-4.726-2.62-5.204 9.387 4.726 2.62zm-.493.885l-1.313 2.37-1.252.54-.702 1.263-3.796-.865 1.228-2.213-.202-1.35 1.314-2.37 4.722 2.616z" fill-rule="evenodd"/></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu " data-action="sign-in-prompt" data-sign-in-action="quote-respond" data-action-source="quote_menu"><span class="svgIcon svgIcon--responseFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M19.074 21.117c-1.244 0-2.432-.37-3.532-1.096a7.792 7.792 0 0 1-.703-.52c-.77.21-1.57.32-2.38.32-4.67 0-8.46-3.5-8.46-7.8C4 7.7 7.79 4.2 12.46 4.2c4.662 0 8.457 3.5 8.457 7.803 0 2.058-.85 3.984-2.403 5.448.023.17.06.35.118.55.192.69.537 1.38 1.026 2.04.15.21.172.48.058.7a.686.686 0 0 1-.613.38h-.03z" fill-rule="evenodd"/></svg></span></button><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu " data-action="twitter" data-action-source="quote_menu"><span class="svgIcon svgIcon--twitterFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><path d="M21.725 5.338c-.744.47-1.605.804-2.513 1.006a3.978 3.978 0 0 0-2.942-1.293c-2.22 0-4.02 1.81-4.02 4.02 0 .32.034.63.07.94-3.31-.18-6.27-1.78-8.255-4.23a4.544 4.544 0 0 0-.574 2.01c.04 1.43.74 2.66 1.8 3.38-.63-.01-1.25-.19-1.79-.5v.08c0 1.93 1.38 3.56 3.23 3.95-.34.07-.7.12-1.07.14-.25-.02-.5-.04-.72-.07.49 1.58 1.97 2.74 3.74 2.8a8.49 8.49 0 0 1-5.02 1.72c-.3-.03-.62-.04-.93-.07A11.447 11.447 0 0 0 8.88 21c7.386 0 11.43-6.13 11.414-11.414.015-.21.01-.38 0-.578a7.604 7.604 0 0 0 2.01-2.08 7.27 7.27 0 0 1-2.297.645 3.856 3.856 0 0 0 1.72-2.23"/></svg></span></button>
- <div class="buttonSet-separator"></div><button class="button button--chromeless u-baseColor--buttonNormal button--withIcon button--withSvgIcon button--highlightMenu " data-action="sign-in-prompt" data-sign-in-action="highlight" data-action-source="quote_menu"><span class="svgIcon svgIcon--privatenoteFilled svgIcon--25px"><svg xmlns="http://www.w3.org/2000/svg" class="svgIcon-use" width="25" height="25" viewBox="0 0 25 25"><g fill-rule="evenodd"><path d="M17.662 4.552H7.346A4.36 4.36 0 0 0 3 8.898v5.685c0 2.168 1.614 3.962 3.697 4.28v2.77c0 .303.35.476.59.29l3.904-2.994h6.48c2.39 0 4.35-1.96 4.35-4.35V8.9c0-2.39-1.95-4.346-4.34-4.346zM16 14.31a.99.99 0 0 1-1.003.99h-4.994C9.45 15.3 9 14.85 9 14.31v-3.02a.99.99 0 0 1 1-.99v-.782a2.5 2.5 0 0 1 2.5-2.51c1.38 0 2.5 1.13 2.5 2.51v.782c.552.002 1 .452 1 .99v3.02z"/><path d="M14 9.81c0-.832-.674-1.68-1.5-1.68-.833 0-1.5.84-1.5 1.68v.49h3v-.49z"/></g></svg></span></button></div>
</div>
- <div class="highlightMenu-arrowClip"><span class="highlightMenu-arrow"></span></div>
</div>
</div>
</div>
- </div>
- <div class="loadingBar"></div>
- <script>
- // &lt;![CDATA[
- window["obvInit"] = function(opt_embedded) {
- window["obvInit"]["embedded"] = opt_embedded;
- window["obvInit"]["ready"] = true;
- }
- // ]]&gt;
- </script>
- <script>
- // &lt;![CDATA[
- var GLOBALS = {
- "audioUrl": "https://d1fcbxp97j4nb2.cloudfront.net",
- "baseUrl": "https://medium.com",
- "buildLabel": "27588-3cb8971",
- "currentUser": {
- "userId": "lo_4c2ff54882b4",
- "isVerified": false,
- "subscriberEmail": ""
- },
- "currentUserHasUnverifiedEmail": false,
- "isAuthenticated": false,
- "isCurrentUserVerified": false,
- "language": "en-us",
- "mediumTwitterScreenName": "medium",
- "miroUrl": "https://cdn-images-1.medium.com",
- "moduleUrls": {
- "base": "https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.iwEjGQsTOduS_qDGmWZZng.js",
- "notes": "https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.4fp6HSt83KvFshqkijtyyQ.js",
- "posters": "https://cdn-static-1.medium.com/_/fp/gen-js/main-posters.bundle.sBoPOCjeITRjo9OsPC1VHA.js",
- "common-async": "https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.bQAtenPub_VKVyJSle9kcw.js",
- "stats": "https://cdn-static-1.medium.com/_/fp/gen-js/main-stats.bundle.MbJUn4Gmy9lhzoIH0Xeu-Q.js",
- "misc-screens": "https://cdn-static-1.medium.com/_/fp/gen-js/main-misc-screens.bundle.xXy0Vq1iCvTjwpERpFYbLQ.js"
- },
- "previewConfig": {
- "weightThreshold": 1,
- "weightImageParagraph": 0.51,
- "weightIframeParagraph": 0.8,
- "weightTextParagraph": 0.08,
- "weightEmptyParagraph": 0,
- "weightP": 0.003,
- "weightH": 0.005,
- "weightBq": 0.003,
- "minPTextLength": 60,
- "truncateBoundaryChars": 20,
- "detectTitle": true,
- "detectTitleLevThreshold": 0.15
- },
- "productName": "Medium",
- "supportsEdit": true,
- "termsUrl": "//medium.com/policy/9db0094a1e0f",
- "textshotHost": "textshot.medium.com",
- "transactionId": "1487321871169:47a64aeb5b9",
- "useragent": {
- "browser": "firefox",
- "family": "firefox",
- "os": "mac",
- "version": 54,
- "supportsDesktopEdit": true,
- "supportsInteract": true,
- "supportsView": true,
- "isMobile": false,
- "isTablet": false,
- "isNative": false,
- "supportsFileAPI": true,
- "isTier1": true,
- "clientVersion": "",
- "unknownParagraphsBad": false,
- "clientChannel": "",
- "supportsRealScrollEvents": true,
- "supportsVhUnits": true,
- "ruinsViewportSections": false,
- "supportsHtml5Video": true,
- "supportsMagicUnderlines": true,
- "isWebView": false,
- "isFacebookWebView": false,
- "supportsProgressiveMedia": true,
- "supportsPromotedPosts": true,
- "isBot": false,
- "supportsScrollableMetabar": true
- },
- "variants": {
- "enable_fuzzy_number_experiment": true,
- "allow_access": true,
- "allow_signup": true,
- "allow_test_auth": "disallow",
- "signin_services": "twitter,facebook,google,email,google-fastidv",
- "signup_services": "twitter,facebook,google,email,google-fastidv",
- "android_rating_prompt_recommend_threshold": 5,
- "google_sign_in_android": true,
- "enable_onboarding": true,
- "ios_custom_miro_url": "https://cdn-images-1.medium.com",
- "reengagement_notification_duration": 3,
- "enable_adsnative_integration": true,
- "browsable_stream_config_bucket": "curated",
- "ios_small_post_preview_truncation_length": 5.5,
- "ios_large_post_preview_truncation_length": 5.5,
- "disable_ios_catalog_badging": true,
- "enable_ranked_feed_survey_promo": true,
- "enable_prepublish_share_settings": true,
- "enable_direct_auth_connect": true,
- "enable_post_import": true,
- "enable_sponsored_post_labelling": true,
- "promoted_story_placement_locations": "POST_PAGE_FOOTER",
- "prmt_to_people_experiment": "macro",
- "enable_related_reads_curse_words_filtering": true,
- "enable_search_collection_by_tag_recency_filter": true,
- "search_collection_by_tag_filter_min_votes": 10,
- "enable_drag_and_drop_ui": true,
- "enable_catalog_takeover_route": true,
- "show_more_placements": "control",
- "enable_crex_directory": true,
- "enable_client_digest": true,
- "honeypot_footer_copy_strategy": 1,
- "enable_sms_app_promo": true,
- "enable_home_stream_follow_suggestions": true,
- "enable_export_members": true,
- "enable_onboarding_users_by_tag": true,
- "enable_publication_popovers": true,
- "enable_hide_broken_links": true
- },
- "xsrfToken": "",
- "iosAppId": "828256236",
- "supportEmail": "[email protected]",
- "teamName": "Team Medium",
- "fp": {
- "/icons/favicon.svg": "https://cdn-static-1.medium.com/_/fp/icons/favicon.KjTfUJo7yJH_fCoUzzH3cg.svg",
- "/icons/favicon-dev-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-dev-editor.YKKRxBO8EMvIqhyCwIiJeQ.ico",
- "/icons/favicon-hatch-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-hatch-editor.BuEyHIqlyh2s_XEk4Rl32Q.ico",
- "/icons/favicon-medium-editor.ico": "https://cdn-static-1.medium.com/_/fp/icons/favicon-medium-editor.PiakrZWB7Yb80quUVQWM6g.ico"
- },
- "authBaseUrl": "https://medium.com",
- "imageUploadSizeMb": 25,
- "isAuthDomainRequest": true,
- "algoliaApiEndpoint": "https://MQ57UUUQZ2-dsn.algolia.net",
- "algoliaAppId": "MQ57UUUQZ2",
- "algoliaSearchOnlyApiKey": "f2b83a373dfeab4286ac5e9da958a5a9",
- "iosAppStoreUrl": "https://itunes.apple.com/app/medium-everyones-stories/id828256236?pt=698524&amp;mt=8",
- "iosAppLinkBaseUrl": "medium:",
- "algoliaIndexPrefix": "medium_",
- "androidPlayStoreUrl": "https://play.google.com/store/apps/details?id=com.medium.reader",
- "googleClientId": "216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com",
- "androidPackage": "com.medium.reader",
- "androidPlayStoreMarketScheme": "market://details?id=com.medium.reader",
- "googleAuthUri": "https://accounts.google.com/o/oauth2/auth",
- "androidScheme": "medium",
- "layoutData": {
- "useDynamicScripts": false,
- "googleAnalyticsTrackingCode": "UA-24232453-2",
- "jsShivUrl": "https://cdn-static-1.medium.com/_/fp/js/shiv.RI2ePTZ5gFmMgLzG5bEVAA.js",
- "useDynamicCss": false,
- "faviconUrl": "https://cdn-static-1.medium.com/_/fp/icons/favicon-medium.TAS6uQ-Y7kcKgi0xjcYHXw.ico",
- "faviconImageId": "1*W0nmth_X8nFKjn6BZ388UQ.png",
- "fontSets": [{
- "id": 1,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-base.by5Oi_VbnwEIvhnWIsuUjA.css"
- }, {
- "id": 4,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-lazy-base.g08Jj5TZPAiuPWj5YNUsSg.css"
- }, {
- "id": 6,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-latin-base.141WxxXgxGxNcfeza73H7Q.css"
- }, {
- "id": 7,
- "url": "https://cdn-static-1.medium.com/_/fp/css/fonts-lazy-latin-base.jMU532QDmysQMOINr-cr2A.css"
- }]
- },
- "authBaseUrlRev": "moc.muidem//:sptth",
- "isDnt": false,
- "stripePublishableKey": "pk_live_7FReX44VnNIInZwrIIx6ghjl",
- "archiveUploadSizeMb": 100,
- "paymentData": {
- "currencies": {
- "1": {
- "label": "US Dollar",
- "external": "usd"
- }
- },
- "countries": {
- "1": {
- "label": "United States of America",
- "external": "US"
- }
- },
- "accountTypes": {
- "1": {
- "label": "Individual",
- "external": "individual"
- },
- "2": {
- "label": "Company",
- "external": "company"
- }
- }
- },
- "previewConfig2": {
- "weightThreshold": 1,
- "weightImageParagraph": 0.05,
- "raiseImage": true,
- "enforceHeaderHierarchy": true,
- "isImageInsetRight": true
- },
- "isAmp": false,
- "iosScheme": "medium",
- "isSwBoot": false,
- "lightstep": {
- "accessToken": "ce5be895bef60919541332990ac9fef2",
- "carrier": "{\"ot-tracer-spanid\":\"15bc037a2abad4d1\",\"ot-tracer-traceid\":\"079d7a5251befb42\",\"ot-tracer-sampled\":\"true\"}",
- "host": "collector-medium.lightstep.com"
- },
- "facebook": {
- "key": "542599432471018",
- "secret": "c14df7146e9052a1131f3c900c1f0644",
- "token": "542599432471018|1JqjIwxSfY9jOt_KwjWEl1R7T6I",
- "namespace": "medium-com",
- "scope": {
- "default": ["public_profile", "email", "user_friends"],
- "connect": ["public_profile", "email", "user_friends"],
- "login": ["public_profile", "email", "user_friends"],
- "share": ["public_profile", "email", "user_friends", "publish_actions"]
- },
- "smartPublishWhitelistedPublications": ["bcc38c8f6edf", "f3726e2a5878", "828a270689e", "81c7d351c056", "f30e42fd7ff8", "8bf1d7d3081b", "d16afa0ae7c", "d8f3f6ad9c31", "e74de0cedea9", "15f753907972", "c8c6a6b01ebd", "3412b9729488", "2ce4bbcf83bb", "544c7006046e", "7bfcdbc6b30a", "a268fd916824", "458a773bccd2"],
- "instantArticles": {
- "published": true,
- "developmentMode": false
- }
- },
- "mailingListArchiveUploadSizeMb": 2,
- "availableMembershipPlans": [],
- "isDoNotAuth": false,
- "goldfinchUrl": "https://goldfinch.medium.com"
- }
- // ]]&gt;
- </script>
- <script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-base.bundle.iwEjGQsTOduS_qDGmWZZng.js" async=""></script>
- <script>
- // &lt;![CDATA[
- window["obvInit"]({
- "value": {
- "id": "d146a92473a1",
- "versionId": "3fed73795ca4",
- "creatorId": "77a507c5ad19",
- "creator": {
- "userId": "77a507c5ad19",
- "name": "John C. Welch",
- "username": "johncwelch",
- "createdAt": 1408545892232,
- "lastPostCreatedAt": 1486930695056,
- "imageId": "0*qPHQu8WqsC6cV_ud.jpg",
- "backgroundImageId": "1*nYm-VLVTCtzpby_1jFUjRw.jpeg",
- "bio": "",
- "twitterScreenName": "",
- "socialStats": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- },
- "social": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- },
- "facebookAccountId": "10152302268220732",
- "allowNotes": 1,
- "type": "User"
- },
- "homeCollectionId": "",
- "title": "Samantha and The Great Big Lie",
- "detectedLanguage": "en",
- "latestVersion": "3fed73795ca4",
- "latestPublishedVersion": "3fed73795ca4",
- "hasUnpublishedEdits": false,
- "latestRev": 1797,
- "createdAt": 1444864250473,
- "updatedAt": 1449844114438,
- "acceptedAt": 0,
- "firstPublishedAt": 1444875555607,
- "latestPublishedAt": 1449844114438,
- "vote": false,
- "experimentalCss": "",
- "displayAuthor": "",
- "content": {
- "subtitle": "How to get shanked doing what people say they want",
- "bodyModel": {
- "paragraphs": [{
- "name": "b34c",
- "type": 3,
- "text": "Samantha and The Great Big Lie",
- "markups": []
- }, {
- "name": "97e7",
- "type": 1,
- "text": "How to get shanked doing what people say they want",
- "markups": []
- }, {
- "name": "df70",
- "type": 6,
- "text": "don’t preach to me\nMr. integrity",
- "markups": []
- }, {
- "name": "c979",
- "type": 1,
- "text": "(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)",
- "markups": []
- }, {
- "name": "342d",
- "type": 1,
- "text": "First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.",
- "markups": []
- }, {
- "name": "2e61",
- "type": 1,
- "text": "Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.",
- "markups": []
- }, {
- "name": "cd31",
- "type": 1,
- "text": "…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.",
- "markups": [{
- "type": 2,
- "start": 87,
- "end": 95
- }]
- }, {
- "name": "ae07",
- "type": 1,
- "text": "That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.",
- "markups": []
- }, {
- "name": "a02f",
- "type": 1,
- "text": "Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:",
- "markups": []
- }, {
- "name": "9213",
- "type": 10,
- "text": "With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.",
- "markups": [{
- "type": 3,
- "start": 93,
- "end": 108,
- "href": "http://www.marco.org/2015/10/09/overcast2",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "dfa5",
- "type": 10,
- "text": "Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.",
- "markups": [{
- "type": 3,
- "start": 26,
- "end": 44,
- "href": "https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "e55d",
- "type": 10,
- "text": "Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.",
- "markups": [{
- "type": 2,
- "start": 256,
- "end": 261
- }]
- }, {
- "name": "35fb",
- "type": 10,
- "text": "Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.",
- "markups": []
- }, {
- "name": "38e2",
- "type": 10,
- "text": "In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.",
- "markups": []
- }, {
- "name": "0481",
- "type": 1,
- "text": "None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.",
- "markups": []
- }, {
- "name": "5a45",
- "type": 1,
- "text": "So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.",
- "markups": []
- }, {
- "name": "3bc7",
- "type": 1,
- "text": "If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.",
- "markups": []
- }, {
- "name": "0fb2",
- "type": 1,
- "text": "The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.",
- "markups": [{
- "type": 3,
- "start": 118,
- "end": 141,
- "href": "http://www.marco.org/2011/03/30/here-is-a-tip-for-all-the-non-developers-out",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 147,
- "end": 354,
- "href": "https://twitter.com/marcoarment/status/641330113934700544",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "9a6e",
- "type": 1,
- "text": "It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):",
- "markups": [{
- "type": 3,
- "start": 125,
- "end": 148,
- "href": "https://twitter.com/s_bielefeld/with_replies",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "3271",
- "type": 6,
- "text": "I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.",
- "markups": []
- }, {
- "name": "ec72",
- "type": 1,
- "text": "Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.",
- "markups": [{
- "type": 2,
- "start": 125,
- "end": 129
- }]
- }, {
- "name": "5cc4",
- "type": 1,
- "text": "But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:",
- "markups": [{
- "type": 2,
- "start": 52,
- "end": 58
- }]
- }, {
- "name": "4e5f",
- "type": 6,
- "text": "From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.",
- "markups": []
- }, {
- "name": "cee9",
- "type": 1,
- "text": "and here:",
- "markups": []
- }, {
- "name": "3f1b",
- "type": 6,
- "text": "I’m not knocking his success, he has put effort into his line of work, and has built his own life.",
- "markups": []
- }, {
- "name": "e527",
- "type": 1,
- "text": "and here:",
- "markups": []
- }, {
- "name": "3e4f",
- "type": 6,
- "text": "He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.",
- "markups": []
- }, {
- "name": "8a01",
- "type": 1,
- "text": "But still, you get the people telling her something she already acknowledge:",
- "markups": []
- }, {
- "name": "7685",
- "type": 6,
- "text": "I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.",
- "markups": []
- }, {
- "name": "b151",
- "type": 1,
- "text": "Thank you for restating something in the article. To the person who wrote it.",
- "markups": []
- }, {
- "name": "87bc",
- "type": 1,
- "text": "In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.",
- "markups": [{
- "type": 3,
- "start": 117,
- "end": 162,
- "href": "http://atp.fm/sponsor/",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "dbda",
- "type": 1,
- "text": "At first, she went with a simple formula:",
- "markups": []
- }, {
- "name": "1b4e",
- "type": 6,
- "text": "$4K x 3 per episode = $12K x 52 weeks / 3 hosts splitting it.",
- "markups": []
- }, {
- "name": "0b33",
- "type": 1,
- "text": "That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:",
- "markups": []
- }, {
- "name": "76d7",
- "type": 6,
- "text": "That’s $4k per ad, no? So more like $12–16k per episode.",
- "markups": []
- }, {
- "name": "a089",
- "type": 1,
- "text": "She’d already realized her mistake and fixed it.",
- "markups": []
- }, {
- "name": "b369",
- "type": 6,
- "text": "which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.",
- "markups": []
- }, {
- "name": "8b3b",
- "type": 1,
- "text": "Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.",
- "markups": [{
- "type": 2,
- "start": 24,
- "end": 47
- }]
- }, {
- "name": "135a",
- "type": 1,
- "text": "This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:",
- "markups": [{
- "type": 2,
- "start": 136,
- "end": 158
- }]
- }, {
- "name": "5e7e",
- "type": 6,
- "text": "especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.",
- "markups": []
- }, {
- "name": "6036",
- "type": 6,
- "text": "thus, guessing net income is more haphazard than stating approx. gross income.",
- "markups": []
- }, {
- "name": "aac1",
- "type": 1,
- "text": "Ye Gods. She’s not doing his taxes for him, her point is invalid?",
- "markups": []
- }, {
- "name": "600f",
- "type": 1,
- "text": "Then there’s the people who seem to have not read anything past what other people are telling them:",
- "markups": []
- }, {
- "name": "9b62",
- "type": 6,
- "text": "Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?",
- "markups": []
- }, {
- "name": "c18a",
- "type": 1,
- "text": "Just how spoon-fed do you have to be? Have you no teeth?",
- "markups": []
- }, {
- "name": "c445",
- "type": 1,
- "text": "Of course, Marco jumps in, and predictably, he’s snippy:",
- "markups": []
- }, {
- "name": "0c21",
- "type": 6,
- "text": "If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.",
- "markups": []
- }, {
- "name": "8f8d",
- "type": 1,
- "text": "If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.",
- "markups": []
- }, {
- "name": "cc97",
- "type": 1,
- "text": "Then Marco’s friends/fans get into it:",
- "markups": []
- }, {
- "name": "f9da",
- "type": 6,
- "text": "I really don’t understand why it’s anyone’s business",
- "markups": []
- }, {
- "name": "0094",
- "type": 1,
- "text": "Samantha is trying to qualify for sainthood at this point:",
- "markups": []
- }, {
- "name": "0105",
- "type": 6,
- "text": "It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.",
- "markups": []
- }, {
- "name": "cdd1",
- "type": 1,
- "text": "Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:",
- "markups": []
- }, {
- "name": "f56c",
- "type": 6,
- "text": "Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.",
- "markups": []
- }, {
- "name": "4fef",
- "type": 1,
- "text": "Wha?? Overcast 2 is absolutely free. Samantha points this out:",
- "markups": []
- }, {
- "name": "0f36",
- "type": 6,
- "text": "His app is free, that’s what sparked the article to begin with.",
- "markups": []
- }, {
- "name": "40d2",
- "type": 1,
- "text": "The response is literally a parallel to “How can there be global warming if it snowed today in my town?”",
- "markups": []
- }, {
- "name": "6760",
- "type": 6,
- "text": "If it’s free, how have I paid for it? Twice?",
- "markups": []
- }, {
- "name": "7b13",
- "type": 1,
- "text": "She is still trying:",
- "markups": []
- }, {
- "name": "44ba",
- "type": 6,
- "text": "You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0",
- "markups": []
- }, {
- "name": "2152",
- "type": 1,
- "text": "He is having none of it. IT SNOWED! SNOWWWWWWW!",
- "markups": []
- }, {
- "name": "99a6",
- "type": 6,
- "text": "Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.",
- "markups": []
- }, {
- "name": "5e6f",
- "type": 1,
- "text": "She however, is relentless:",
- "markups": []
- }, {
- "name": "1b0f",
- "type": 6,
- "text": "No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.",
- "markups": []
- }, {
- "name": "d24f",
- "type": 1,
- "text": "Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)",
- "markups": []
- }, {
- "name": "10e1",
- "type": 1,
- "text": "We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.",
- "markups": []
- }, {
- "name": "9b01",
- "type": 6,
- "text": "It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.",
- "markups": []
- }, {
- "name": "340c",
- "type": 1,
- "text": "(UNDERSTATEMENT OF THE YEAR)",
- "markups": []
- }, {
- "name": "7244",
- "type": 6,
- "text": "I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.",
- "markups": []
- }, {
- "name": "ffb1",
- "type": 6,
- "text": "It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.",
- "markups": []
- }, {
- "name": "e44e",
- "type": 1,
- "text": "She tries, oh lord, she tries:",
- "markups": []
- }, {
- "name": "a502",
- "type": 6,
- "text": "To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.",
- "markups": []
- }, {
- "name": "7dcd",
- "type": 1,
- "text": "But no, HE KNOWS HER POINT BETTER THAN SHE DOES:",
- "markups": []
- }, {
- "name": "a62a",
- "type": 6,
- "text": "No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.",
- "markups": []
- }, {
- "name": "df8c",
- "type": 1,
- "text": "Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.",
- "markups": []
- }, {
- "name": "521a",
- "type": 1,
- "text": "One guy tries to blame it all on Apple, another in a string of Wha??? moments:",
- "markups": []
- }, {
- "name": "d80d",
- "type": 6,
- "text": "the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility",
- "markups": []
- }, {
- "name": "db0b",
- "type": 1,
- "text": "Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:",
- "markups": []
- }, {
- "name": "7a78",
- "type": 6,
- "text": "Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?",
- "markups": []
- }, {
- "name": "6e09",
- "type": 1,
- "text": "Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.",
- "markups": []
- }, {
- "name": "b7db",
- "type": 1,
- "text": "One guy is “confused”:",
- "markups": []
- }, {
- "name": "3626",
- "type": 6,
- "text": "I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?",
- "markups": []
- }, {
- "name": "9daa",
- "type": 6,
- "text": "Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.",
- "markups": []
- }, {
- "name": "f6da",
- "type": 6,
- "text": "Alright, that’s fair. I was just confused by the $ and fame angle at first.",
- "markups": []
- }, {
- "name": "d5b1",
- "type": 1,
- "text": "Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?",
- "markups": [{
- "type": 2,
- "start": 82,
- "end": 133
- }]
- }, {
- "name": "58d0",
- "type": 1,
- "text": "People of course are telling her it’s her fault for mentioning a salient fact at all:",
- "markups": []
- }, {
- "name": "30d2",
- "type": 6,
- "text": "Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?",
- "markups": []
- }, {
- "name": "765b",
- "type": 6,
- "text": "Maybe because you went there with your article?",
- "markups": []
- }, {
- "name": "61fe",
- "type": 6,
- "text": "As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.",
- "markups": []
- }, {
- "name": "f17c",
- "type": 1,
- "text": "Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.",
- "markups": []
- }, {
- "name": "0b60",
- "type": 1,
- "text": "Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:",
- "markups": []
- }, {
- "name": "65ab",
- "type": 6,
- "text": "Because you decided to start a conversation about someone else’s personal shit. You started this war.",
- "markups": []
- }, {
- "name": "1adb",
- "type": 1,
- "text": "War. THIS. IS. WAR.",
- "markups": []
- }, {
- "name": "de94",
- "type": 1,
- "text": "This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend/idol. Samantha is politely pushing back a bit:",
- "markups": [{
- "type": 2,
- "start": 63,
- "end": 69
- }]
- }, {
- "name": "4458",
- "type": 6,
- "text": "That doesn’t explain why every other part of my article is being pushed aside.",
- "markups": []
- }, {
- "name": "aeac",
- "type": 1,
- "text": "She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.",
- "markups": []
- }, {
- "name": "0078",
- "type": 1,
- "text": "Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:",
- "markups": []
- }, {
- "name": "c4c9",
- "type": 6,
- "text": "You should never use an ad rate card to estimate ad revenue from any media product ever.",
- "markups": []
- }, {
- "name": "b66b",
- "type": 6,
- "text": "I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars",
- "markups": []
- }, {
- "name": "6907",
- "type": 1,
- "text": "How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!”",
- "markups": [{
- "type": 2,
- "start": 338,
- "end": 357
- }]
- }, {
- "name": "41ec",
- "type": 1,
- "text": "Samantha basically abases herself at his feet:",
- "markups": []
- }, {
- "name": "0b14",
- "type": 6,
- "text": "I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.",
- "markups": []
- }, {
- "name": "590f",
- "type": 1,
- "text": "I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.",
- "markups": []
- }, {
- "name": "69dc",
- "type": 1,
- "text": "Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.",
- "markups": []
- }, {
- "name": "5ab4",
- "type": 1,
- "text": "Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:",
- "markups": [{
- "type": 2,
- "start": 67,
- "end": 71
- }]
- }, {
- "name": "957b",
- "type": 6,
- "text": "so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.",
- "markups": []
- }, {
- "name": "0a7e",
- "type": 1,
- "text": "Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:",
- "markups": [{
- "type": 2,
- "start": 101,
- "end": 146
- }]
- }, {
- "name": "f7db",
- "type": 6,
- "text": "That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.",
- "markups": []
- }, {
- "name": "937f",
- "type": 1,
- "text": "Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:",
- "markups": []
- }, {
- "name": "c9dd",
- "type": 6,
- "text": "How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.",
- "markups": []
- }, {
- "name": "c522",
- "type": 1,
- "text": "Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?",
- "markups": []
- }, {
- "name": "907e",
- "type": 6,
- "text": "Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?",
- "markups": []
- }, {
- "name": "2158",
- "type": 1,
- "text": "That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.",
- "markups": []
- }, {
- "name": "13f8",
- "type": 1,
- "text": "Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:",
- "markups": []
- }, {
- "name": "96c6",
- "type": 6,
- "text": "Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!",
- "markups": []
- }, {
- "name": "5d3f",
- "type": 1,
- "text": "That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)",
- "markups": [{
- "type": 2,
- "start": 196,
- "end": 201
- }]
- }, {
- "name": "c07c",
- "type": 1,
- "text": "Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.",
- "markups": []
- }, {
- "name": "8b32",
- "type": 1,
- "text": "Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:",
- "markups": []
- }, {
- "name": "de26",
- "type": 6,
- "text": "Yup, before you existed!",
- "markups": []
- }, {
- "name": "a3bd",
- "type": 1,
- "text": "Really dude? I mean, I’m sorry about the penis, but really?",
- "markups": []
- }, {
- "name": "1c51",
- "type": 1,
- "text": "Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):",
- "markups": [{
- "type": 2,
- "start": 142,
- "end": 147
- }]
- }, {
- "name": "9848",
- "type": 6,
- "text": "Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.",
- "markups": []
- }, {
- "name": "f2a6",
- "type": 6,
- "text": "lol. Noted.",
- "markups": []
- }, {
- "name": "aed9",
- "type": 6,
- "text": "And I wasn’t intending to be a dick, just a lot of people hear/say “income” when they intend “revenue”, and then discussion …",
- "markups": []
- }, {
- "name": "f9d8",
- "type": 6,
- "text": "… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.",
- "markups": []
- }, {
- "name": "f61c",
- "type": 6,
- "text": "haha. Thank you for the clarification.",
- "markups": []
- }, {
- "name": "5dd9",
- "type": 1,
- "text": "Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.",
- "markups": []
- }, {
- "name": "dc44",
- "type": 1,
- "text": "But now, the door has been cracked, and the cheap shots come out:",
- "markups": []
- }, {
- "name": "0c94",
- "type": 6,
- "text": "@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant",
- "markups": [{
- "type": 3,
- "start": 46,
- "end": 58,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 114,
- "end": 127,
- "href": "https://twitter.com/hashtag/fairelephant?src=hash",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "343b",
- "type": 1,
- "text": "(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)",
- "markups": []
- }, {
- "name": "09bf",
- "type": 1,
- "text": "Or this…conversation:",
- "markups": []
- }, {
- "name": "4d63",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*kbPh7V97eyRodSOw2-ALDw.png",
- "originalWidth": 398,
- "originalHeight": 542
- }
- }, {
- "name": "f2a3",
- "type": 1,
- "text": "Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.",
- "markups": [{
- "type": 3,
- "start": 140,
- "end": 149,
- "href": "https://twitter.com/viticci",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }, {
- "type": 3,
- "start": 151,
- "end": 163,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }]
- }, {
- "name": "ae0c",
- "type": 1,
- "text": "Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.",
- "markups": [{
- "type": 3,
- "start": 38,
- "end": 51,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }, {
- "type": 3,
- "start": 53,
- "end": 61,
- "href": "https://twitter.com/viticci",
- "title": "",
- "rel": "",
- "name": "",
- "anchorType": 0,
- "creatorIds": [],
- "userId": ""
- }]
- }, {
- "name": "2047",
- "type": 1,
- "text": "Good for her. There’s being patient and being roadkill.",
- "markups": []
- }, {
- "name": "4139",
- "type": 1,
- "text": "Samantha does put the call out for her sources to maybe let her use their names:",
- "markups": []
- }, {
- "name": "6626",
- "type": 6,
- "text": "From all of you I heard from earlier, anyone care to go on record?",
- "markups": []
- }, {
- "name": "8a7d",
- "type": 1,
- "text": "My good friend, The Angry Drunk points out the obvious problem:",
- "markups": []
- }, {
- "name": "68c9",
- "type": 6,
- "text": "Nobody’s going to go on record when they count on Marco’s friends for their PR.",
- "markups": []
- }, {
- "name": "317d",
- "type": 1,
- "text": "This is true. Again, the sites that are Friends of Marco:",
- "markups": []
- }, {
- "name": "9523",
- "type": 1,
- "text": "Daring Fireball",
- "markups": []
- }, {
- "name": "dbc7",
- "type": 1,
- "text": "The Loop",
- "markups": []
- }, {
- "name": "c706",
- "type": 1,
- "text": "SixColors",
- "markups": []
- }, {
- "name": "0acb",
- "type": 1,
- "text": "iMore",
- "markups": []
- }, {
- "name": "8c8c",
- "type": 1,
- "text": "MacStories",
- "markups": []
- }, {
- "name": "643e",
- "type": 1,
- "text": "A few others, but I want this post to end one day.",
- "markups": []
- }, {
- "name": "6b76",
- "type": 1,
- "text": "You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.",
- "markups": []
- }, {
- "name": "f7d1",
- "type": 1,
- "text": "Of course, the idea this could happen is just craycray:",
- "markups": []
- }, {
- "name": "de59",
- "type": 6,
- "text": "@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 14,
- "href": "https://twitter.com/KevinColeman",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 14,
- "end": 27,
- "href": "https://twitter.com/Angry_Drunk",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 28,
- "end": 40,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 41,
- "end": 53,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 126,
- "end": 152,
- "href": "https://twitter.com/hashtag/JetFuelCantMeltSteelBeams?src=hash",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "f01b",
- "type": 1,
- "text": "Yeah. Because a mature person like Marco would never do anything like that.",
- "markups": []
- }, {
- "name": "7e30",
- "type": 1,
- "text": "Of course, the real point on this is starting to happen:",
- "markups": []
- }, {
- "name": "5d93",
- "type": 6,
- "text": "you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!",
- "markups": []
- }, {
- "name": "436b",
- "type": 6,
- "text": "I doubt I will.",
- "markups": []
- }, {
- "name": "ac25",
- "type": 1,
- "text": "See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.",
- "markups": [{
- "type": 2,
- "start": 153,
- "end": 158
- }]
- }, {
- "name": "07ba",
- "type": 1,
- "text": "Some people aren’t even pretending. They’re just in full strawman mode:",
- "markups": []
- }, {
- "name": "3d60",
- "type": 6,
- "text": "@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 12,
- "href": "https://twitter.com/timkeller",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "87f5",
- "type": 6,
- "text": "@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 14,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 14,
- "end": 24,
- "href": "https://twitter.com/timkeller",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "3720",
- "type": 1,
- "text": "I think she’s earned her anger at this point.",
- "markups": []
- }, {
- "name": "7341",
- "type": 1,
- "text": "Don’t worry, Marco knows what the real problem is: most devs just suck —",
- "markups": []
- }, {
- "name": "babe",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*Fpb2Bvdx7Q-688vdm-NdkQ.png",
- "originalWidth": 694,
- "originalHeight": 771
- }
- }, {
- "name": "503d",
- "type": 1,
- "text": "I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)",
- "markups": []
- }, {
- "name": "b8c0",
- "type": 1,
- "text": "There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:",
- "markups": [{
- "type": 2,
- "start": 80,
- "end": 84
- }]
- }, {
- "name": "36f4",
- "type": 6,
- "text": "@BuildingTwenty: Both @s_bielefeld &amp; I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?",
- "markups": [{
- "type": 3,
- "start": 0,
- "end": 15,
- "href": "https://twitter.com/BuildingTwenty",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 22,
- "end": 34,
- "href": "https://twitter.com/s_bielefeld",
- "title": "",
- "rel": "",
- "anchorType": 0
- }, {
- "type": 3,
- "start": 66,
- "end": 78,
- "href": "https://twitter.com/marcoarment",
- "title": "",
- "rel": "",
- "anchorType": 0
- }]
- }, {
- "name": "06b9",
- "type": 1,
- "text": "Yup.",
- "markups": []
- }, {
- "name": "eff9",
- "type": 1,
- "text": "Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:",
- "markups": [{
- "type": 2,
- "start": 84,
- "end": 106
- }]
- }, {
- "name": "18f1",
- "type": 6,
- "text": "You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.",
- "markups": []
- }, {
- "name": "9776",
- "type": 6,
- "text": "I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.",
- "markups": []
- }, {
- "name": "8d44",
- "type": 1,
- "text": "To which Samantha understandably replies:",
- "markups": []
- }, {
- "name": "7147",
- "type": 6,
- "text": "and it’s honestly something I’m contemplating right now, whether to continue…",
- "markups": []
- }, {
- "name": "e0cd",
- "type": 1,
- "text": "Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?",
- "markups": []
- }, {
- "name": "a379",
- "type": 6,
- "text": "If I have this right, some people are outraged that a creator has decided to give away his work.",
- "markups": []
- }, {
- "name": "f026",
- "type": 1,
- "text": "No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.",
- "markups": []
- }, {
- "name": "e1c2",
- "type": 1,
- "text": "Noted Feminist Glenn Fleishman gets a piece of the action too:",
- "markups": []
- }, {
- "name": "067c",
- "type": 4,
- "text": "",
- "markups": [],
- "layout": 1,
- "metadata": {
- "id": "1*lvOySry5gHHJfGU_bQXrzA.png",
- "originalWidth": 308,
- "originalHeight": 269
- }
- }, {
- "name": "4df8",
- "type": 1,
- "text": "I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.",
- "markups": [{
- "type": 2,
- "start": 227,
- "end": 231
- }]
- }, {
- "name": "bf45",
- "type": 1,
- "text": "Great Feminists are often tools.",
- "markups": []
- }, {
- "name": "45bb",
- "type": 1,
- "text": "Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):",
- "markups": []
- }, {
- "name": "c053",
- "type": 6,
- "text": "I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t",
- "markups": []
- }, {
- "name": "7b5e",
- "type": 6,
- "text": "This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.",
- "markups": []
- }, {
- "name": "a321",
- "type": 6,
- "text": "Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http://samanthabielefeld.com/the-elephant-in-the-room …",
- "markups": [{
- "type": 3,
- "start": 117,
- "end": 172,
- "href": "http://t.co/u79ZLsnhdM",
- "title": "http://samanthabielefeld.com/the-elephant-in-the-room",
- "rel": "nofollow",
- "anchorType": 0
- }]
- }, {
- "name": "76fe",
- "type": 6,
- "text": "thank you for posting this, it covers a lot of things people don’t like to talk about.",
- "markups": []
- }, {
- "name": "bf90",
- "type": 6,
- "text": "I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.",
- "markups": []
- }, {
- "name": "0f66",
- "type": 6,
- "text": "Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)",
- "markups": []
- }, {
- "name": "6134",
- "type": 1,
- "text": "I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http://www.businessinsider.com/marco-arment-2011-9",
- "markups": [{
- "type": 3,
- "start": 276,
- "end": 326,
- "href": "http://www.businessinsider.com/marco-arment-2011-9",
- "title": "",
- "rel": "nofollow",
- "anchorType": 0
- }]
- }, {
- "name": "ba3c",
- "type": 1,
- "text": "Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.",
- "markups": []
- }, {
- "name": "a5a0",
- "type": 1,
- "text": "Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.",
- "markups": []
- }, {
- "name": "2a25",
- "type": 1,
- "text": "And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.",
- "markups": []
- }, {
- "name": "a47a",
- "type": 1,
- "text": "Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.",
- "markups": [{
- "type": 2,
- "start": 186,
- "end": 196
- }]
- }, {
- "name": "aa8e",
- "type": 1,
- "text": "But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.",
- "markups": []
- }, {
- "name": "34c5",
- "type": 1,
- "text": "All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.",
- "markups": []
- }, {
- "name": "9710",
- "type": 1,
- "text": "So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.",
- "markups": []
- }],
- "sections": [{
- "name": "55ff",
- "startIndex": 0
- }, {
- "name": "c360",
- "startIndex": 8
- }, {
- "name": "2ba2",
- "startIndex": 17
- }, {
- "name": "c883",
- "startIndex": 176
- }, {
- "name": "8ab2",
- "startIndex": 183
- }]
- },
- "postDisplay": {
- "coverless": true
- }
- },
- "virtuals": {
- "allowNotes": true,
- "previewImage": {
- "imageId": "1*kbPh7V97eyRodSOw2-ALDw.png",
- "filter": "",
- "backgroundSize": "",
- "originalWidth": 398,
- "originalHeight": 542,
- "strategy": "resample",
- "height": 0,
- "width": 0
- },
- "wordCount": 4605,
- "imageCount": 3,
- "readingTime": 17.92735849056604,
- "subtitle": "How to get shanked doing what people say they want",
- "usersBySocialRecommends": [],
- "recommends": 168,
- "socialRecommends": [],
- "isBookmarked": false,
- "tags": [],
- "socialRecommendsCount": 0,
- "responsesCreatedCount": 15,
- "links": {
- "entries": [{
- "url": "https://medium.com/@marcoarment/pragmatic-app-pricing-a79fc07218f3",
- "alts": [{
- "type": 2,
- "url": "medium://p/a79fc07218f3"
- }, {
- "type": 3,
- "url": "medium://p/a79fc07218f3"
- }]
- }],
- "version": "0.3",
- "generatedAt": 1472016079116
- },
- "isLockedPreviewOnly": false,
- "takeoverId": "",
- "metaDescription": "",
- "totalClapCount": 0
- },
- "coverless": true,
- "slug": "samantha-and-the-great-big-lie",
- "translationSourcePostId": "",
- "translationSourceCreatorId": "",
- "isApprovedTranslation": false,
- "inResponseToPostId": "",
- "inResponseToRemovedAt": 0,
- "isTitleSynthesized": true,
- "allowResponses": true,
- "importedUrl": "",
- "importedPublishedAt": 0,
- "visibility": 0,
- "uniqueSlug": "samantha-and-the-great-big-lie-d146a92473a1",
- "previewContent": {
- "bodyModel": {
- "paragraphs": [{
- "name": "b34c",
- "type": 3,
- "text": "Samantha and The Great Big Lie",
- "markups": [],
- "alignment": 1
- }, {
- "name": "97e7",
- "type": 1,
- "text": "How to get shanked doing what people say they want",
- "markups": [],
- "alignment": 1
- }, {
- "name": "df70",
- "type": 6,
- "text": "don’t preach to me\nMr. integrity",
- "markups": [],
- "alignment": 1
- }, {
- "name": "c979",
- "type": 1,
- "text": "(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non…",
- "markups": [],
- "alignment": 1
- }],
- "sections": [{
- "startIndex": 0
- }]
- },
- "isFullContent": false
- },
- "license": 0,
- "inResponseToMediaResourceId": "",
- "canonicalUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "approvedHomeCollectionId": "",
- "newsletterId": "",
- "webCanonicalUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "mediumUrl": "https://medium.com/@johncwelch/samantha-and-the-great-big-lie-d146a92473a1",
- "migrationId": "",
- "notifyFollowers": true,
- "notifyTwitter": false,
- "isSponsored": false,
- "isRequestToPubDisabled": false,
- "notifyFacebook": false,
- "responseHiddenOnParentPostAt": 0,
- "isSeries": false,
- "isSubscriptionLocked": false,
- "type": "Post"
- },
- "mentionedUsers": [],
- "collaborators": [],
- "membershipPlans": [],
- "collectionUserRelations": [],
- "mode": null,
- "references": {
- "User": {
- "77a507c5ad19": {
- "userId": "77a507c5ad19",
- "name": "John C. Welch",
- "username": "johncwelch",
- "createdAt": 1408545892232,
- "lastPostCreatedAt": 1486930695056,
- "imageId": "0*qPHQu8WqsC6cV_ud.jpg",
- "backgroundImageId": "1*nYm-VLVTCtzpby_1jFUjRw.jpeg",
- "bio": "",
- "twitterScreenName": "",
- "socialStats": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- },
- "social": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- },
- "facebookAccountId": "10152302268220732",
- "allowNotes": 1,
- "type": "User"
- }
- },
- "Social": {
- "77a507c5ad19": {
- "userId": "lo_4c2ff54882b4",
- "targetUserId": "77a507c5ad19",
- "type": "Social"
- }
- },
- "SocialStats": {
- "77a507c5ad19": {
- "userId": "77a507c5ad19",
- "usersFollowedCount": 63,
- "usersFollowedByCount": 230,
- "type": "SocialStats"
- }
- }
- }
- })
- // ]]&gt;
- </script>
- <div class="surface-scrollOverlay"></div>
- <script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-common-async.bundle.bQAtenPub_VKVyJSle9kcw.js"></script>
- <script charset="UTF-8" src="https://cdn-static-1.medium.com/_/fp/gen-js/main-notes.bundle.4fp6HSt83KvFshqkijtyyQ.js"></script>
-</body>
-
+ <script>
+ <![CDATA[
+ window.__BUILD_ID__ = "main-20200813-221821-b007452387"
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__PRELOADED_STATE__ = {"auroraPostPage":{"isAuroraPostPageEnabled":false},"config":{"nodeEnv":"production","version":"main-20200813-221821-b007452387","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","lightStep":{"name":"lite-web","host":"lightstep.medium.systems","token":"ce5be895bef60919541332990ac9fef2","appVersion":"main-20200813-221821-b007452387"},"algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","datadog":{"clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","context":{"deployment":{"target":"production","tag":"main-20200813-221821-b007452387","commit":"b00745238769aa939b76e1f378ff3835829c632f"}},"datacenter":"us"},"isAmp":false,"googleAnalyticsCode":"UA-24232453-2","signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumOwnedAndOperatedCollectionIds":["544c7006046e","bcc38c8f6edf","444d13b52878","8d6b8a439e32","92d2092dc598","1285ba81cada","cb8577c9149e","8ccfed20cbb2","ae2a65f35510","3f6ecf56618","7b6769f2748b","fc8964313712","ef8e90590e66","191186aaafa0","d944778ce714","bdc4052bbdba","88d9857e584e","9dc80918cc93","8a9336e5bb4"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"1*OMF3fSqH8t4xBJ9-6oZDZw.png","height":106,"width":545},"postLogo":{"imageId":"1*3sela1OADrJr7dJk_CXaEQ.png","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"performanceTags":[],"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*[email protected]","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*[email protected]","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*[email protected]","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":["pandemic","epidemic","coronavirus","covid19","co-vid-19","containment","self-care","flatten-the-curve","public-health","virus","public-health-crisis","quarantine","self-quarantine","zika","corona","disease-prevention","wuhan","chinavirus","outbreak","influenza","socialdistancing","social-distance","flu","vaccines","healthcare","medicine","conspiracy-theories","conspiracy","virality","epidemia","pandemia","salud","corona-e-virus","coronavirus-covid19","covid-19","covid-19-symptoms","covid-19-crisis","covid-19-testing","covid-19-treatment","coronavirus-update","coronavirus-diaries"],"COVID_APPLICABLE_TOPIC_NAMES":["coronavirus"],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":["coronavirus","health"],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v"},"debug":{"requestId":"03e4b1e9-aa96-4f99-9f98-df3d01c65cb9","edge":"valencia","originalSpanCarrier":{"ot-tracer-spanid":"17d028ba431ac3ef","ot-tracer-traceid":"e2a575fa5e4cabed","ot-tracer-sampled":"true"}},"session":{"user":{"id":"lo_d4e92d369991"},"xsrf":"","isSpoofed":false},"stats":{"itemCount":0,"sending":false,"timeout":null,"backup":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedGoogleOneTap":null,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fmedium.com\u002F@johncwelch\u002Fsamantha-and-the-great-big-lie-d146a92473a1","host":"medium.com","hostname":"medium.com","susiModal":{"step":null,"operation":"register"},"postRead":false},"client":{"isBot":false,"isCustomDomain":false,"isEu":false,"isNativeMedium":false,"isSafariMobile":false,"inAppBrowserName":"","supportsWebp":false},"multiVote":{"clapsPerPost":{}},"tracing":{}}
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.__APOLLO_STATE__ = {"ROOT_QUERY.variantFlags.0":{"name":"allow_access","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.0.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.0.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.1":{"name":"allow_signup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.1.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.1.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.2":{"name":"allow_test_auth","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.2.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.2.valueType":{"__typename":"VariantFlagString","value":"disallow"},"ROOT_QUERY.variantFlags.3":{"name":"assign_default_topic_to_posts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.3.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.3.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.4":{"name":"available_annual_plan","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.4.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.4.valueType":{"__typename":"VariantFlagString","value":"2c754bcc2995"},"ROOT_QUERY.variantFlags.5":{"name":"available_monthly_plan","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.5.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.5.valueType":{"__typename":"VariantFlagString","value":"60e220181034"},"ROOT_QUERY.variantFlags.6":{"name":"bane_add_user","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.6.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.6.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.7":{"name":"bane_verify_domain","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.7.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.7.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.8":{"name":"branch_seo_metadata","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.8.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.8.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.9":{"name":"browsable_stream_config_bucket","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.9.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.9.valueType":{"__typename":"VariantFlagString","value":"curated-topics"},"ROOT_QUERY.variantFlags.10":{"name":"coronavirus_topic_recirc","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.10.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.10.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.11":{"name":"covid_19_cdc_banner","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.11.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.11.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.12":{"name":"default_seo_post_titles","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.12.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.12.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.13":{"name":"disable_android_subscription_activity_carousel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.13.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.13.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.14":{"name":"disable_ios_resume_reading_toast","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.14.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.14.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.15":{"name":"disable_ios_subscription_activity_carousel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.15.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.15.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.16":{"name":"disable_mobile_featured_chunk","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.16.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.16.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.17":{"name":"disable_post_recommended_from_friends_provider","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.17.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.17.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.18":{"name":"enable_alternate_onboarding_email_subject","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.18.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.18.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.19":{"name":"enable_android_local_currency","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.19.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.19.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.20":{"name":"enable_annual_renewal_reminder_email","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.20.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.20.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.21":{"name":"enable_app_flirty_thirty","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.21.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.21.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.22":{"name":"enable_apple_sign_in","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.22.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.22.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.23":{"name":"enable_apple_webhook","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.23.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.23.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.24":{"name":"enable_apple_webhook_renewal_status","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.24.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.24.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.25":{"name":"enable_aurora_about_page_routing","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.25.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.25.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.26":{"name":"enable_aurora_lightweight_flow","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.26.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.26.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.27":{"name":"enable_aurora_post_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.27.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.27.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.28":{"name":"enable_aurora_tag_page_routing","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.28.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.28.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.29":{"name":"enable_auto_forfeit_earnings","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.29.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.29.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.30":{"name":"enable_automated_mission_control_triggers","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.30.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.30.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.31":{"name":"enable_braintree_cancellation_with_cycles","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.31.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.31.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.32":{"name":"enable_braintree_integration","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.32.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.32.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.33":{"name":"enable_braintree_membership","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.33.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.33.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.34":{"name":"enable_braintree_paypal","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.34.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.34.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.35":{"name":"enable_braintree_update_payment_endpoint","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.35.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.35.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.36":{"name":"enable_braintree_webhook","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.36.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.36.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.37":{"name":"enable_branch_io","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.37.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.37.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.38":{"name":"enable_branch_text_me_the_app","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.38.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.38.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.39":{"name":"enable_branding","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.39.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.39.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.40":{"name":"enable_branding_fonts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.40.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.40.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.41":{"name":"enable_cc_trial_member_onboarding_emails","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.41.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.41.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.42":{"name":"enable_cleansweep_double_writes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.42.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.42.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.43":{"name":"enable_confirm_sign_in","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.43.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.43.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.44":{"name":"enable_cta_meter","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.44.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.44.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.45":{"name":"enable_curation_priority_queue_experiment","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.45.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.45.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.46":{"name":"enable_dedicated_series_tab_api_ios","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.46.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.46.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.47":{"name":"enable_different_grid","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.47.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.47.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.48":{"name":"enable_digest_feature_logging","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.48.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.48.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.49":{"name":"enable_digest_tagline","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.49.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.49.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.50":{"name":"enable_disregard_trunc_state_for_footer","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.50.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.50.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.51":{"name":"enable_edit_alt_text","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.51.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.51.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.52":{"name":"enable_email_sign_in_captcha","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.52.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.52.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.53":{"name":"enable_embedding_based_diversification","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.53.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.53.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.54":{"name":"enable_end_of_post_cleanup","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.54.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.54.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.55":{"name":"enable_expanded_feature_chunk_pool","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.55.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.55.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.56":{"name":"enable_filter_by_resend_rules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.56.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.56.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.57":{"name":"enable_filter_expire_processor","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.57.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.57.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.58":{"name":"enable_first_name_on_paywall","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.58.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.58.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.59":{"name":"enable_footer_app_buttons","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.59.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.59.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.60":{"name":"enable_free_corona_topic","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.60.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.60.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.61":{"name":"enable_global_susi_modal","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.61.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.61.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.62":{"name":"enable_google_one_tap","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.62.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.62.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.63":{"name":"enable_highlander_member_digest","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.63.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.63.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.64":{"name":"enable_icelandic_truncated_posts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.64.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.64.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.65":{"name":"enable_ios_post_stats","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.65.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.65.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.66":{"name":"enable_janky_spam_rules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.66.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.66.valueType":{"__typename":"VariantFlagString","value":"users,posts"},"ROOT_QUERY.variantFlags.67":{"name":"enable_json_logs_trained_ranker","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.67.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.67.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.68":{"name":"enable_kbfd_rex","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.68.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.68.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.69":{"name":"enable_kbfd_rex_app_highlights","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.69.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.69.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.70":{"name":"enable_kbfd_rex_daily_digest","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.70.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.70.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.71":{"name":"enable_lite_about_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.71.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.71.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.72":{"name":"enable_lite_homepage","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.72.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.72.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.73":{"name":"enable_lite_notifications","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.73.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.73.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.74":{"name":"enable_lite_pay_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.74.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.74.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.75":{"name":"enable_lite_post","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.75.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.75.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.76":{"name":"enable_lite_post_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.76.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.76.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.77":{"name":"enable_lite_post_highlights","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.77.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.77.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.78":{"name":"enable_lite_post_highlights_view_only","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.78.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.78.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.79":{"name":"enable_lite_profile","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.79.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.79.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.80":{"name":"enable_lite_pub_header_menu","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.80.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.80.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.81":{"name":"enable_lite_pub_homepage_for_selected_domains","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.81.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.81.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.82":{"name":"enable_lite_server_upstream_deadlines","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.82.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.82.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.83":{"name":"enable_lite_stories","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.83.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.83.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.84":{"name":"enable_lite_topics","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.84.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.84.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.85":{"name":"enable_lite_unread_notification_count_mutation","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.85.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.85.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.86":{"name":"enable_lo_open_in_app","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.86.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.86.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.87":{"name":"enable_lock_responses","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.87.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.87.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.88":{"name":"enable_login_code_flow","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.88.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.88.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.89":{"name":"enable_m2_unviewable_filter","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.89.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.89.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.90":{"name":"enable_marketing_emails","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.90.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.90.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.91":{"name":"enable_media_resource_try_catch","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.91.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.91.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.92":{"name":"enable_member_onboarding","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.92.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.92.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.93":{"name":"enable_membership_remove_section_a","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.93.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.93.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.94":{"name":"enable_metered_out_email_changes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.94.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.94.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.95":{"name":"enable_miro_on_kubernetes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.95.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.95.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.96":{"name":"enable_ml_rank_modules","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.96.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.96.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.97":{"name":"enable_ml_rank_rex_anno","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.97.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.97.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.98":{"name":"enable_monthly_member_onboarding_emails","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.98.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.98.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.99":{"name":"enable_more_on_coronavirus","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.99.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.99.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.100":{"name":"enable_mute","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.100.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.100.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.101":{"name":"enable_new_collaborative_filtering_data","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.101.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.101.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.102":{"name":"enable_new_suspended_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.102.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.102.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.103":{"name":"enable_new_three_dot_menu","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.103.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.103.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.104":{"name":"enable_open_in_app_regwall","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.104.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.104.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.105":{"name":"enable_optimizely","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.105.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.105.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.106":{"name":"enable_orion","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.106.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.106.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.107":{"name":"enable_parsely","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.107.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.107.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.108":{"name":"enable_patronus_on_kubernetes","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.108.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.108.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.109":{"name":"enable_popularity_feature","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.109.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.109.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.110":{"name":"enable_post_import","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.110.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.110.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.111":{"name":"enable_post_page_nav_stickiness_removal","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.111.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.111.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.112":{"name":"enable_post_seo_settings_screen","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.112.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.112.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.113":{"name":"enable_post_settings_screen","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.113.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.113.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.114":{"name":"enable_post_table_of_contents","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.114.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.114.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.115":{"name":"enable_primary_topic_for_mobile","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.115.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.115.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.116":{"name":"enable_profile_page_seo_titles","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.116.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.116.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.117":{"name":"enable_responses_2","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.117.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.117.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.118":{"name":"enable_responses_all","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.118.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.118.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.119":{"name":"enable_responses_edit_and_delete","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.119.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.119.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.120":{"name":"enable_responses_highlight","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.120.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.120.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.121":{"name":"enable_responses_moderation","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.121.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.121.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.122":{"name":"enable_rito_upstream_deadlines","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.122.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.122.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.123":{"name":"enable_rtr_channel","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.123.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.123.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.124":{"name":"enable_save_to_medium","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.124.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.124.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.125":{"name":"enable_sisko","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.125.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.125.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.126":{"name":"enable_starspace","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.126.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.126.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.127":{"name":"enable_starspace_ranker_starspace","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.127.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.127.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.128":{"name":"enable_theme_editor","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.128.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.128.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.129":{"name":"enable_tick_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.129.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.129.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.130":{"name":"enable_tipalti_onboarding","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.130.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.130.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.131":{"name":"enable_tribute_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.131.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.131.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.132":{"name":"enable_trumpland_landing_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.132.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.132.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.133":{"name":"enable_valencia_cd_posts","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.133.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.133.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.134":{"name":"enable_valencia_cd_profiles","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.134.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.134.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.135":{"name":"enable_valencia_clientele_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.135.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.135.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.136":{"name":"enable_valencia_lite_reporting_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.136.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.136.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.137":{"name":"enable_valencia_lite_routes_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.137.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.137.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.138":{"name":"enable_valencia_medium_routes_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.138.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.138.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.139":{"name":"enable_valencia_stat_batch_cd","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.139.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.139.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.140":{"name":"glyph_embed_commands","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.140.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.140.valueType":{"__typename":"VariantFlagString","value":"control"},"ROOT_QUERY.variantFlags.141":{"name":"glyph_font_set","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.141.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.141.valueType":{"__typename":"VariantFlagString","value":"m2"},"ROOT_QUERY.variantFlags.142":{"name":"google_sign_in_android","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.142.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.142.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.143":{"name":"ios_pub_follow_email_opt_in","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.143.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.143.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.144":{"name":"is_not_medium_subscriber","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.144.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.144.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.145":{"name":"limit_post_referrers","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.145.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.145.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.146":{"name":"make_nav_sticky","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.146.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.146.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.147":{"name":"new_transition_page","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.147.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.147.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.148":{"name":"pub_sidebar","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.148.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.148.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.149":{"name":"remove_post_post_similarity","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.149.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.149.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.150":{"name":"retrained_ranker","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.150.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.150.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.151":{"name":"rex_providers_4","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.151.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.151.valueType":{"__typename":"VariantFlagString","value":"experiment_b"},"ROOT_QUERY.variantFlags.152":{"name":"sign_up_with_email_button","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.152.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.152.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.153":{"name":"signin_services","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.153.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.153.valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"},"ROOT_QUERY.variantFlags.154":{"name":"signup_services","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.154.valueType","typename":"VariantFlagString"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.154.valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"},"ROOT_QUERY.variantFlags.155":{"name":"skip_sign_in_recaptcha","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.155.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.155.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.156":{"name":"use_new_admin_topic_backend","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.156.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.156.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY.variantFlags.157":{"name":"xgboost_auto_suspend","valueType":{"type":"id","generated":true,"id":"$ROOT_QUERY.variantFlags.157.valueType","typename":"VariantFlagBoolean"},"__typename":"VariantFlag"},"$ROOT_QUERY.variantFlags.157.valueType":{"__typename":"VariantFlagBoolean","value":true},"ROOT_QUERY":{"variantFlags":[{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.0","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.1","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.2","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.3","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.4","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.5","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.6","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.7","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.8","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.9","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.10","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.11","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.12","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.13","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.14","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.15","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.16","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.17","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.18","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.19","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.20","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.21","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.22","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.23","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.24","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.25","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.26","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.27","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.28","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.29","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.30","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.31","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.32","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.33","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.34","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.35","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.36","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.37","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.38","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.39","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.40","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.41","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.42","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.43","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.44","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.45","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.46","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.47","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.48","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.49","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.50","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.51","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.52","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.53","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.54","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.55","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.56","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.57","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.58","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.59","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.60","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.61","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.62","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.63","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.64","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.65","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.66","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.67","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.68","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.69","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.70","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.71","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.72","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.73","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.74","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.75","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.76","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.77","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.78","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.79","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.80","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.81","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.82","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.83","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.84","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.85","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.86","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.87","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.88","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.89","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.90","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.91","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.92","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.93","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.94","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.95","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.96","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.97","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.98","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.99","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.100","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.101","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.102","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.103","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.104","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.105","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.106","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.107","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.108","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.109","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.110","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.111","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.112","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.113","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.114","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.115","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.116","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.117","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.118","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.119","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.120","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.121","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.122","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.123","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.124","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.125","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.126","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.127","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.128","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.129","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.130","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.131","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.132","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.133","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.134","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.135","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.136","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.137","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.138","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.139","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.140","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.141","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.142","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.143","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.144","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.145","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.146","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.147","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.148","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.149","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.150","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.151","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.152","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.153","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.154","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.155","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.156","typename":"VariantFlag"},{"type":"id","generated":true,"id":"ROOT_QUERY.variantFlags.157","typename":"VariantFlag"}],"viewer":null,"meterPost({\"postId\":\"d146a92473a1\",\"postMeteringOptions\":{}})":{"type":"id","generated":false,"id":"MeteringInfo:singleton","typename":"MeteringInfo"},"postResult({\"id\":\"d146a92473a1\"})":{"type":"id","generated":false,"id":"Post:d146a92473a1","typename":"Post"}},"MeteringInfo:singleton":{"__typename":"MeteringInfo","postIds":{"type":"json","json":[]},"maxUnlockCount":3,"unlocksRemaining":3},"Post:d146a92473a1":{"__typename":"Post","id":"d146a92473a1","mediumUrl":"https:\u002F\u002Fmedium.com\u002F@johncwelch\u002Fsamantha-and-the-great-big-lie-d146a92473a1","canonicalUrl":"","collection":null,"content({\"postMeteringOptions\":{}})":{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}})","typename":"PostContent"},"creator":{"type":"id","generated":false,"id":"User:77a507c5ad19","typename":"User"},"customStyleSheet":null,"firstPublishedAt":1444875555607,"isLocked":false,"isPublished":true,"isShortform":false,"isEmail":false,"layerCake":0,"primaryTopic":null,"title":"Samantha and The Great Big Lie","latestPublishedVersion":"3fed73795ca4","visibility":"PUBLIC","isLimitedState":false,"sequence":null,"pendingCollection":null,"shareKey":null,"statusForCollection":null,"readingTime":17.92735849056604,"readingList":"READING_LIST_NONE","allowResponses":true,"clapCount":193,"viewerClapCount":0,"voterCount":165,"recommenders":[],"license":"ALL_RIGHTS_RESERVED","newsletterId":"","tags":[],"topics":[],"postResponses":{"type":"id","generated":true,"id":"$Post:d146a92473a1.postResponses","typename":"PostResponses"},"responsesCount":14,"internalLinks({\"paging\":{\"limit\":8}})":{"type":"id","generated":true,"id":"$Post:d146a92473a1.internalLinks({\"paging\":{\"limit\":8}})","typename":"InternalLinksConnection"},"pinnedAt":0,"collaborators":[],"translationSourcePost":null,"inResponseToPostResult":null,"inResponseToMediaResource":null,"lockedSource":"LOCKED_POST_SOURCE_NONE","curationEligibleAt":0,"isDistributionAlertDismissed":false,"audioVersionUrl":"","socialTitle":"","socialDek":"","metaDescription":"","latestPublishedAt":1449844114438,"previewContent":{"type":"id","generated":true,"id":"$Post:d146a92473a1.previewContent","typename":"PreviewContent"},"previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*kbPh7V97eyRodSOw2-ALDw.png","typename":"ImageMetadata"},"seoTitle":"","updatedAt":1524435864777,"shortformType":"SHORTFORM_TYPE_LINK","structuredData":"","seoDescription":"","isSuspended":false},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}})":{"isLockedPreviewOnly":false,"validatedShareKey":"","__typename":"PostContent","bodyModel":{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel","typename":"RichText"}},"User:77a507c5ad19":{"id":"77a507c5ad19","isSuspended":false,"__typename":"User","name":"John C. Welch","customStyleSheet":null,"username":"johncwelch","isFollowing":null,"isAuroraVisible":false,"allowNotes":true,"bio":"","imageId":"0*qPHQu8WqsC6cV_ud.jpg","mediumMemberAt":0,"isBlocking":null,"isMuting":null,"isPartnerProgramEnrolled":false,"twitterScreenName":""},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.0":{"name":"55ff","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.1":{"name":"c360","startIndex":8,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.2":{"name":"2ba2","startIndex":17,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.3":{"name":"c883","startIndex":176,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.4":{"name":"8ab2","startIndex":183,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null,"__typename":"Section"},"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel":{"sections":[{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.0","typename":"Section"},{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.1","typename":"Section"},{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.2","typename":"Section"},{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.3","typename":"Section"},{"type":"id","generated":true,"id":"$Post:d146a92473a1.content({\"postMeteringOptions\":{}}).bodyModel.sections.4","typename":"Section"}],"paragraphs":[{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_0","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_1","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_2","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_3","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_4","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_5","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_6","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_7","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_8","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_9","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_10","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_11","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_12","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_13","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_14","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_15","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_16","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_17","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_18","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_19","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_20","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_21","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_22","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_23","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_24","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_25","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_26","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_27","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_28","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_29","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_30","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_31","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_32","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_33","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_34","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_35","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_36","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_37","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_38","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_39","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_40","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_41","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_42","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_43","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_44","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_45","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_46","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_47","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_48","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_49","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_50","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_51","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_52","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_53","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_54","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_55","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_56","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_57","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_58","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_59","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_60","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_61","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_62","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_63","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_64","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_65","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_66","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_67","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_68","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_69","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_70","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_71","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_72","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_73","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_74","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_75","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_76","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_77","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_78","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_79","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_80","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_81","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_82","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_83","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_84","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_85","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_86","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_87","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_88","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_89","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_90","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_91","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_92","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_93","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_94","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_95","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_96","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_97","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_98","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_99","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_100","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_101","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_102","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_103","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_104","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_105","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_106","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_107","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_108","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_109","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_110","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_111","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_112","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_113","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_114","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_115","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_116","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_117","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_118","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_119","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_120","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_121","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_122","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_123","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_124","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_125","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_126","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_127","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_128","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_129","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_130","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_131","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_132","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_133","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_134","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_135","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_136","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_137","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_138","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_139","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_140","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_141","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_142","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_143","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_144","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_145","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_146","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_147","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_148","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_149","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_150","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_151","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_152","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_153","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_154","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_155","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_156","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_157","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_158","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_159","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_160","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_161","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_162","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_163","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_164","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_165","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_166","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_167","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_168","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_169","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_170","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_171","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_172","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_173","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_174","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_175","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_176","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_177","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_178","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_179","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_180","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_181","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_182","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_183","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_184","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_185","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_186","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_187","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_188","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_189","typename":"Paragraph"},{"type":"id","generated":false,"id":"Paragraph:3fed73795ca4_190","typename":"Paragraph"}],"__typename":"RichText"},"Paragraph:3fed73795ca4_0":{"id":"3fed73795ca4_0","name":"b34c","type":"H3","href":null,"layout":null,"metadata":null,"text":"Samantha and The Great Big Lie","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_1":{"id":"3fed73795ca4_1","name":"97e7","type":"P","href":null,"layout":null,"metadata":null,"text":"How to get shanked doing what people say they want","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_2":{"id":"3fed73795ca4_2","name":"df70","type":"BQ","href":null,"layout":null,"metadata":null,"text":"don’t preach to me\nMr. integrity","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_3":{"id":"3fed73795ca4_3","name":"c979","type":"P","href":null,"layout":null,"metadata":null,"text":"(EDIT: removed the link to Samantha’s post, because the arments and the grubers and the rest of The Deck Clique got what they wanted: a non-proper person driven off the internet lightly capped with a dusting of transphobia along the way, all totally okay because the ends justify the means, and it’s okay when “good” people do it.)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_4":{"id":"3fed73795ca4_4","name":"342d","type":"P","href":null,"layout":null,"metadata":null,"text":"First, I need to say something about this article: the reason I’m writing it infuriates me. Worse than installing CS 3 or Acrobat 7 ever did, and the former inspired comparisons to fecophile porn. I’m actually too mad to cuss. Well, not completely, but in this case, I don’t think the people I’m mad at are worth the creativity I try to put into profanity. This is about a brownfield of hypocrisy and viciously deliberate mischaracterization that “shame” cannot even come close to the shame those behind it should feel.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_5":{"id":"3fed73795ca4_5","name":"2e61","type":"P","href":null,"layout":null,"metadata":null,"text":"Now, read this post by Samantha Bielefeld: The Elephant in the Room. First, it is a well-written critical piece that raises a few points in a calm, rational, nonconfrontational fashion, exactly the kind of things the pushers of The Great Big Lie say we need more of, as opposed to the screaming that is the norm in such cases.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_6":{"id":"3fed73795ca4_6","name":"cd31","type":"P","href":null,"layout":null,"metadata":null,"text":"…sorry, I should explain “The Great Big Lie”. There are several, but in this case, our specific instance of “The Great Big Lie” is about criticism. Over and over, you hear from the very people I am not going to be nice to in this that we need “better” criticsm. Instead of rage and anger, volume and vitriol, we need in-depth rational criticism, that isn’t personal or ad hominem. That it should focus on points, not people.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_6.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_6.markups.0":{"type":"EM","start":87,"end":95,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_7":{"id":"3fed73795ca4_7","name":"ae07","type":"P","href":null,"layout":null,"metadata":null,"text":"That, readers, is “The Big Lie”. It is a lie so big that if one ponders the reality of it, as I am going to, one wonders why anyone would believe it. It is a lie and it is one we should stop telling.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_8":{"id":"3fed73795ca4_8","name":"a02f","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha’s points (I assume you read it, for you are smart people who know the importance of such things) are fairly clear:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_9":{"id":"3fed73795ca4_9","name":"9213","type":"OLI","href":null,"layout":null,"metadata":null,"text":"With the release of Overcast 2.0, a product Samantha actually likes, Marco Arment moved to a patronage model that will probably be successful for him.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_9.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_9.markups.0":{"type":"A","start":93,"end":108,"href":"http:\u002F\u002Fwww.marco.org\u002F2015\u002F10\u002F09\u002Fovercast2","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_10":{"id":"3fed73795ca4_10","name":"dfa5","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Arment’s insistence that “anyone can do this” while technically true, (anyone can in fact, implement this pricing model), also implies that “anyone” can have the kind of success that a developer with Marco’s history, financial status, and deep ties to the Apple News Web is expected to have. This is silly.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_10.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_10.markups.0":{"type":"A","start":26,"end":44,"href":"https:\u002F\u002Fmedium.com\u002F@marcoarment\u002Fpragmatic-app-pricing-a79fc07218f3","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_11":{"id":"3fed73795ca4_11","name":"e55d","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Marco Arment occupies a fairly unique position in the Apple universe, (gained by hard work and no small talent), and because of that, benefits from a set of privileges that a new developer or even one that has been around for a long time, but isn’t, well, Marco, not only don’t have, but have little chance of attaining anytime soon.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_11.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_11.markups.0":{"type":"EM","start":256,"end":261,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_12":{"id":"3fed73795ca4_12","name":"35fb","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Marco has earned his success and is entitled to the benefits and privileges it brings, but he seems rather blind to all of that, and seems to still imagine himself as “two guys in a garage”. This is just not correct.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_13":{"id":"3fed73795ca4_13","name":"38e2","type":"OLI","href":null,"layout":null,"metadata":null,"text":"In addition, the benefits and privileges of the above ensure that by releasing Overcast 2 as a free app, with patronage pricing, he has, if not gutted, severely hurt the ability of folks actually selling their apps for an up-front price of not free to continue doing so. This has the effect of accelerating the “race to the bottom” in the podcast listening app segment, which hurts devs who cannot afford to work on a “I don’t really need this money, so whatever you feel like sending is okay” model.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_14":{"id":"3fed73795ca4_14","name":"0481","type":"P","href":null,"layout":null,"metadata":null,"text":"None of this is incorrect. None of this is an ad hominem attack in any way. It is just pointing out that a developer of Arment’s stature and status lives in a very different world than someone in East Frog Balls, Arkansas trying to make a living off of App sales. Our dev in EFB doesn’t have the main sites on the Apple web falling all over themselves to review their app the way that Arment does. They’re not friends with the people being The Loop, Daring Fireball, SixColors, iMore, The Mac Observer, etc., yadda.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_15":{"id":"3fed73795ca4_15","name":"5a45","type":"P","href":null,"layout":null,"metadata":null,"text":"So, our hero, in a fit of well-meaning ignorance writes this piece (posted this morning, 14 Oct. 15) and of course, the response and any criticisms are just as reasonable and thoughtful.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_16":{"id":"3fed73795ca4_16","name":"3bc7","type":"P","href":null,"layout":null,"metadata":null,"text":"If you really believe that, you are the most preciously ignorant person in the world, and can I have your seriously charmed life.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_17":{"id":"3fed73795ca4_17","name":"0fb2","type":"P","href":null,"layout":null,"metadata":null,"text":"The response, from all quarters, including Marco, someone who is so sensitive to criticism that the word “useless” is enough to shut him down, who blocked a friend of mine for the high crime of pointing out that his review of podcasting mics centered around higher priced gear and ignored folks without the scratch, who might not be ready for such things, is, in a single word, disgusting. Vomitous even.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_17.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_17.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_17.markups.0":{"type":"A","start":118,"end":141,"href":"http:\u002F\u002Fwww.marco.org\u002F2011\u002F03\u002F30\u002Fhere-is-a-tip-for-all-the-non-developers-out","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_17.markups.1":{"type":"A","start":147,"end":354,"href":"https:\u002F\u002Ftwitter.com\u002Fmarcoarment\u002Fstatus\u002F641330113934700544","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_18":{"id":"3fed73795ca4_18","name":"9a6e","type":"P","href":null,"layout":null,"metadata":null,"text":"It’s an hours-long dogpile that beggars even my imagination, and I can imagine almost anything. Seriously, it’s all there in Samantha’s Twitter Feed. From what I can tell, she’s understandably shocked over it. I however was not. This one comment in her feed made me smile (warning, this wanders a bit…er…LOT. Twitter timelines are not easy to put together):","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_18.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_18.markups.0":{"type":"A","start":125,"end":148,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld\u002Fwith_replies","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_19":{"id":"3fed73795ca4_19","name":"3271","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I can see why you have some reservations about publishing it, but my gut feeling is that he would take it better than Nilay.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_20":{"id":"3fed73795ca4_20","name":"ec72","type":"P","href":null,"layout":null,"metadata":null,"text":"Oh honey, bless your sweet, ignorant heart. Marco is one of the biggest pushers of The Big Lie, and one of the reasons it is such a lie.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_20.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_20.markups.0":{"type":"EM","start":125,"end":129,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_21":{"id":"3fed73795ca4_21","name":"5cc4","type":"P","href":null,"layout":null,"metadata":null,"text":"But it gets better. First, you have the “hey, Marco earned his status!” lot. A valid point, and one Bielefeld explicitly acknowledges, here:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_21.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_21.markups.0":{"type":"EM","start":52,"end":58,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_22":{"id":"3fed73795ca4_22","name":"4e5f","type":"BQ","href":null,"layout":null,"metadata":null,"text":"From his ground floor involvement in Tumblr (for which he is now a millionaire), to the creation and sale of a wildly successful app called Instapaper, he has become a household name in technology minded circles. It is this extensive time spent in the spotlight, the huge following on Twitter, and dedicated listeners of his weekly aired Accidental Tech Podcast, that has granted him the freedom to break from seeking revenue in more traditional manners.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_23":{"id":"3fed73795ca4_23","name":"cee9","type":"P","href":null,"layout":null,"metadata":null,"text":"and here:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_24":{"id":"3fed73795ca4_24","name":"3f1b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I’m not knocking his success, he has put effort into his line of work, and has built his own life.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_25":{"id":"3fed73795ca4_25","name":"e527","type":"P","href":null,"layout":null,"metadata":null,"text":"and here:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_26":{"id":"3fed73795ca4_26","name":"3e4f","type":"BQ","href":null,"layout":null,"metadata":null,"text":"He has earned his time in the spotlight, and it’s only natural for him to take advantage of it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_27":{"id":"3fed73795ca4_27","name":"8a01","type":"P","href":null,"layout":null,"metadata":null,"text":"But still, you get the people telling her something she already acknowledge:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_28":{"id":"3fed73795ca4_28","name":"7685","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I don’t think he’s blind. he’s worked to where he has gotten and has had failures like everyone else.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_29":{"id":"3fed73795ca4_29","name":"b151","type":"P","href":null,"layout":null,"metadata":null,"text":"Thank you for restating something in the article. To the person who wrote it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_30":{"id":"3fed73795ca4_30","name":"87bc","type":"P","href":null,"layout":null,"metadata":null,"text":"In the original article, Samantha talked about the money Marco makes from his podcast. She based that on the numbers provided by ATP in terms of sponsorship rates and the number of current sponsors the podcast has. Is this going to yield perfect numbers? No. But the numbers you get from it will at least be reasonable, or should be unless the published sponsorship rates are just fantasy, and you’re stupid for taking them seriously.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_30.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_30.markups.0":{"type":"A","start":117,"end":162,"href":"http:\u002F\u002Fatp.fm\u002Fsponsor\u002F","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_31":{"id":"3fed73795ca4_31","name":"dbda","type":"P","href":null,"layout":null,"metadata":null,"text":"At first, she went with a simple formula:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_32":{"id":"3fed73795ca4_32","name":"1b4e","type":"BQ","href":null,"layout":null,"metadata":null,"text":"$4K x 3 per episode = $12K x 52 weeks \u002F 3 hosts splitting it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_33":{"id":"3fed73795ca4_33","name":"0b33","type":"P","href":null,"layout":null,"metadata":null,"text":"That’s not someone making shit up, right? Rather quickly, someone pointed out that she’d made an error in how she calculated it:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_34":{"id":"3fed73795ca4_34","name":"76d7","type":"BQ","href":null,"layout":null,"metadata":null,"text":"That’s $4k per ad, no? So more like $12–16k per episode.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_35":{"id":"3fed73795ca4_35","name":"a089","type":"P","href":null,"layout":null,"metadata":null,"text":"She’d already realized her mistake and fixed it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_36":{"id":"3fed73795ca4_36","name":"b369","type":"BQ","href":null,"layout":null,"metadata":null,"text":"which is actually wrong, and I’m correcting now. $4,000 per sponsor, per episode! So, $210,000 per year.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_37":{"id":"3fed73795ca4_37","name":"8b3b","type":"P","href":null,"layout":null,"metadata":null,"text":"Again, this is based on publicly available data the only kind someone not part of ATP or a close friend of Arment has access to. So while her numbers may be wrong, if they are, there’s no way for her to know that. She’s basing her opinion on actual available data. Which is sadly rare.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_37.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_37.markups.0":{"type":"EM","start":24,"end":47,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_38":{"id":"3fed73795ca4_38","name":"135a","type":"P","href":null,"layout":null,"metadata":null,"text":"This becomes a huge flashpoint. You name a reason to attack her over this, people do. No really. For example, she’s not calculating his income taxes correctly:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_38.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_38.markups.0":{"type":"EM","start":136,"end":158,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_39":{"id":"3fed73795ca4_39","name":"5e7e","type":"BQ","href":null,"layout":null,"metadata":null,"text":"especially since it isn’t his only source of income thus, not an indicator of his marginal inc. tax bracket.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_40":{"id":"3fed73795ca4_40","name":"6036","type":"BQ","href":null,"layout":null,"metadata":null,"text":"thus, guessing net income is more haphazard than stating approx. gross income.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_41":{"id":"3fed73795ca4_41","name":"aac1","type":"P","href":null,"layout":null,"metadata":null,"text":"Ye Gods. She’s not doing his taxes for him, her point is invalid?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_42":{"id":"3fed73795ca4_42","name":"600f","type":"P","href":null,"layout":null,"metadata":null,"text":"Then there’s the people who seem to have not read anything past what other people are telling them:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_43":{"id":"3fed73795ca4_43","name":"9b62","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Not sure what to make of your Marco piece, to be honest. You mention his fame, whatever, but what’s the main idea here?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_44":{"id":"3fed73795ca4_44","name":"c18a","type":"P","href":null,"layout":null,"metadata":null,"text":"Just how spoon-fed do you have to be? Have you no teeth?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_45":{"id":"3fed73795ca4_45","name":"c445","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, Marco jumps in, and predictably, he’s snippy:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_46":{"id":"3fed73795ca4_46","name":"0c21","type":"BQ","href":null,"layout":null,"metadata":null,"text":"If you’re going to speak in precise absolutes, it’s best to first ensure that you’re correct.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_47":{"id":"3fed73795ca4_47","name":"8f8d","type":"P","href":null,"layout":null,"metadata":null,"text":"If you’re going to be like that, it’s best to provide better data. Don’t get snippy when someone is going off the only data available, and is clearly open to revising based on better data.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_48":{"id":"3fed73795ca4_48","name":"cc97","type":"P","href":null,"layout":null,"metadata":null,"text":"Then Marco’s friends\u002Ffans get into it:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_49":{"id":"3fed73795ca4_49","name":"f9da","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I really don’t understand why it’s anyone’s business","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_50":{"id":"3fed73795ca4_50","name":"0094","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha is trying to qualify for sainthood at this point:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_51":{"id":"3fed73795ca4_51","name":"0105","type":"BQ","href":null,"layout":null,"metadata":null,"text":"It isn’t really, it was a way of putting his income in context in regards to his ability to gamble with Overcast.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_52":{"id":"3fed73795ca4_52","name":"cdd1","type":"P","href":null,"layout":null,"metadata":null,"text":"Again, she’s trying to drag people back to her actual point, but no one is going to play. The storm has begun. Then we get people who are just spouting nonsense:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_53":{"id":"3fed73795ca4_53","name":"f56c","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Why is that only relevant for him? It’s a pretty weird metric,especially since his apps aren’t free.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_54":{"id":"3fed73795ca4_54","name":"4fef","type":"P","href":null,"layout":null,"metadata":null,"text":"Wha?? Overcast 2 is absolutely free. Samantha points this out:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_55":{"id":"3fed73795ca4_55","name":"0f36","type":"BQ","href":null,"layout":null,"metadata":null,"text":"His app is free, that’s what sparked the article to begin with.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_56":{"id":"3fed73795ca4_56","name":"40d2","type":"P","href":null,"layout":null,"metadata":null,"text":"The response is literally a parallel to “How can there be global warming if it snowed today in my town?”","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_57":{"id":"3fed73795ca4_57","name":"6760","type":"BQ","href":null,"layout":null,"metadata":null,"text":"If it’s free, how have I paid for it? Twice?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_58":{"id":"3fed73795ca4_58","name":"7b13","type":"P","href":null,"layout":null,"metadata":null,"text":"She is still trying:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_59":{"id":"3fed73795ca4_59","name":"44ba","type":"BQ","href":null,"layout":null,"metadata":null,"text":"You paid $4.99 to unlock functionality in Overcast 1.0 and you chose to support him with no additional functionality in 2.0","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_60":{"id":"3fed73795ca4_60","name":"2152","type":"P","href":null,"layout":null,"metadata":null,"text":"He is having none of it. IT SNOWED! SNOWWWWWWW!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_61":{"id":"3fed73795ca4_61","name":"99a6","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Yes. That’s not free. Free is when you choose not to make money. And that can be weaponized. But that’s not what Overcast does.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_62":{"id":"3fed73795ca4_62","name":"5e6f","type":"P","href":null,"layout":null,"metadata":null,"text":"She however, is relentless:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_63":{"id":"3fed73795ca4_63","name":"1b0f","type":"BQ","href":null,"layout":null,"metadata":null,"text":"No, it’s still free. You can choose to support it, you are required to pay $4.99 for Pocket Casts. Totally different model.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_64":{"id":"3fed73795ca4_64","name":"d24f","type":"P","href":null,"layout":null,"metadata":null,"text":"Dude seems to give up. (Note: allllll the people bagging on her are men. All of them. Mansplaining like hell. And I’d bet every one of them considers themselves a feminist.)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_65":{"id":"3fed73795ca4_65","name":"10e1","type":"P","href":null,"layout":null,"metadata":null,"text":"We get another guy trying to push the narrative she’s punishing him for his success, which is just…it’s stupid, okay? Stupid.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_66":{"id":"3fed73795ca4_66","name":"9b01","type":"BQ","href":null,"layout":null,"metadata":null,"text":"It also wasn’t my point in writing my piece today, but it seems to be everyone’s focus.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_67":{"id":"3fed73795ca4_67","name":"340c","type":"P","href":null,"layout":null,"metadata":null,"text":"(UNDERSTATEMENT OF THE YEAR)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_68":{"id":"3fed73795ca4_68","name":"7244","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I think the focus should be more on that fact that while it’s difficult, Marco spent years building his audience.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_69":{"id":"3fed73795ca4_69","name":"ffb1","type":"BQ","href":null,"layout":null,"metadata":null,"text":"It doesn’t matter what he makes it how he charges. If the audience be earned is willing to pay for it, awesome.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_70":{"id":"3fed73795ca4_70","name":"e44e","type":"P","href":null,"layout":null,"metadata":null,"text":"She tries, oh lord, she tries:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_71":{"id":"3fed73795ca4_71","name":"a502","type":"BQ","href":null,"layout":null,"metadata":null,"text":"To assert that he isn’t doing anything any other dev couldn’t, is wrong. It’s successful because it’s Marco.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_72":{"id":"3fed73795ca4_72","name":"7dcd","type":"P","href":null,"layout":null,"metadata":null,"text":"But no, HE KNOWS HER POINT BETTER THAN SHE DOES:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_73":{"id":"3fed73795ca4_73","name":"a62a","type":"BQ","href":null,"layout":null,"metadata":null,"text":"No, it’s successful because he busted his ass to make it so. It’s like any other business. He grew it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_74":{"id":"3fed73795ca4_74","name":"df8c","type":"P","href":null,"layout":null,"metadata":null,"text":"Christ. This is like a field of strawmen. Stupid ones. Very stupid ones.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_75":{"id":"3fed73795ca4_75","name":"521a","type":"P","href":null,"layout":null,"metadata":null,"text":"One guy tries to blame it all on Apple, another in a string of Wha??? moments:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_76":{"id":"3fed73795ca4_76","name":"d80d","type":"BQ","href":null,"layout":null,"metadata":null,"text":"the appropriate context is Apple’s App Store policies. Other devs aren’t Marco’s responsibility","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_77":{"id":"3fed73795ca4_77","name":"db0b","type":"P","href":null,"layout":null,"metadata":null,"text":"Seriously? Dude, are you even trying to talk about what Samantha actually wrote? At this point, Samantha is clearly mystified at the entire thing:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_78":{"id":"3fed73795ca4_78","name":"7a78","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_79":{"id":"3fed73795ca4_79","name":"6e09","type":"P","href":null,"layout":null,"metadata":null,"text":"Because it’s a nit they can pick and allows them to ignore everything you wrote. That’s the only reason.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_80":{"id":"3fed73795ca4_80","name":"b7db","type":"P","href":null,"layout":null,"metadata":null,"text":"One guy is “confused”:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_81":{"id":"3fed73795ca4_81","name":"3626","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I see. He does have clout, so are you saying he’s too modest in how he sees himself as a dev?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_82":{"id":"3fed73795ca4_82","name":"9daa","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Yes. He can’t be equated to the vast majority of other developers. Like calling Gruber, “just another blogger”.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_83":{"id":"3fed73795ca4_83","name":"f6da","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Alright, that’s fair. I was just confused by the $ and fame angle at first.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_84":{"id":"3fed73795ca4_84","name":"d5b1","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha’s point centers on the benefits Marco gains via his fame and background. HOW DO YOU NOT MENTION THAT? HOW IS THAT CONFUSING?","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_84.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_84.markups.0":{"type":"EM","start":82,"end":133,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_85":{"id":"3fed73795ca4_85","name":"58d0","type":"P","href":null,"layout":null,"metadata":null,"text":"People of course are telling her it’s her fault for mentioning a salient fact at all:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_86":{"id":"3fed73795ca4_86","name":"30d2","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Why has the conversation suddenly turned to focus on nothing more than ATP sponsorship income?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_87":{"id":"3fed73795ca4_87","name":"765b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Maybe because you went there with your article?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_88":{"id":"3fed73795ca4_88","name":"61fe","type":"BQ","href":null,"layout":null,"metadata":null,"text":"As a way of rationalizing his ability to gamble with the potential for Overcast to generate income…not the norm at all.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_89":{"id":"3fed73795ca4_89","name":"f17c","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, had she not brought up those important points, she’d have been bagged on for “not providing proof”. Lose some, lose more. By now, she’s had enough and she just deletes all mention of it. Understandable, but sad she was bullied into doing that.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_90":{"id":"3fed73795ca4_90","name":"0b60","type":"P","href":null,"layout":null,"metadata":null,"text":"Yes, bullied. That’s all this is. Bullying. She didn’t lie, cheat, or exaagerate. If her numbers were wrong, they weren’t wrong in a way she had any ability to do anything about. But there’s blood in the water, and the comments and attacks get worse:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_91":{"id":"3fed73795ca4_91","name":"65ab","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Because you decided to start a conversation about someone else’s personal shit. You started this war.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_92":{"id":"3fed73795ca4_92","name":"1adb","type":"P","href":null,"layout":null,"metadata":null,"text":"War. THIS. IS. WAR.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_93":{"id":"3fed73795ca4_93","name":"de94","type":"P","href":null,"layout":null,"metadata":null,"text":"This is a bunch of nerds attacking someone for reasoned, calm, polite criticism of their friend\u002Fidol. Samantha is politely pushing back a bit:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_93.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_93.markups.0":{"type":"EM","start":63,"end":69,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_94":{"id":"3fed73795ca4_94","name":"4458","type":"BQ","href":null,"layout":null,"metadata":null,"text":"That doesn’t explain why every other part of my article is being pushed aside.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_95":{"id":"3fed73795ca4_95","name":"aeac","type":"P","href":null,"layout":null,"metadata":null,"text":"She’s right. This is all nonsense. This is people ignoring her article completely, just looking for things to attack so it can be dismissed. It’s tribalism at its purest.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_96":{"id":"3fed73795ca4_96","name":"0078","type":"P","href":null,"layout":null,"metadata":null,"text":"Then some of the other annointed get into it, including Jason Snell in one of the most spectactular displays of “I have special knowledge you can’t be expected to have, therefore you are totally off base and wrong, even though there’s no way for you to know this” I’ve seen in a while. Jason:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_97":{"id":"3fed73795ca4_97","name":"c4c9","type":"BQ","href":null,"layout":null,"metadata":null,"text":"You should never use an ad rate card to estimate ad revenue from any media product ever.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_98":{"id":"3fed73795ca4_98","name":"b66b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I learned this when I started working for a magazine — rate cards are mostly fiction, like prices on new cars","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_99":{"id":"3fed73795ca4_99","name":"6907","type":"P","href":null,"layout":null,"metadata":null,"text":"How…exactly…in the name of whatever deity Jason may believe in…is Samantha or anyone not “in the biz” supposed to know this. Also, what exactly does a magazine on paper like Macworld have to do with sponsorships for a podcast? I have done podcasts that were sponsored, and I can retaliate with “we charged what the rate card said we did. Checkmate Elitests!”","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_99.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_99.markups.0":{"type":"EM","start":338,"end":357,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_100":{"id":"3fed73795ca4_100","name":"41ec","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha basically abases herself at his feet:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_101":{"id":"3fed73795ca4_101","name":"0b14","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I understand my mistake, and it’s unfortunate that it has completely diluted the point of my article.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_102":{"id":"3fed73795ca4_102","name":"590f","type":"P","href":null,"layout":null,"metadata":null,"text":"I think she should have told him where and how to stuff that nonsense, but she’s a nicer person than I am. Also, it’s appropriate that Jason’s twitter avatar has its nose in the air. This is some rank snobbery. It’s disgusting and if anyone pulled that on him, Jason would be very upset. But hey, one cannot criticize The Marco without getting pushback. By “pushback”, I mean “an unrelenting fecal flood”.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_103":{"id":"3fed73795ca4_103","name":"69dc","type":"P","href":null,"layout":null,"metadata":null,"text":"Her only mistake was criticizing one of the Kool Kids. Folks, if you criticize anyone in The Deck Clique, or their friends, expect the same thing, regardless of tone or point.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_104":{"id":"3fed73795ca4_104","name":"5ab4","type":"P","href":null,"layout":null,"metadata":null,"text":"Another App Dev, seemingly unable to parse Samantha’s words, needs more explanation:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_104.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_104.markups.0":{"type":"EM","start":67,"end":71,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_105":{"id":"3fed73795ca4_105","name":"957b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"so just looking over your mentions, I’m curious what exactly was your main point? Ignoring the podcast income bits.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_106":{"id":"3fed73795ca4_106","name":"0a7e","type":"P","href":null,"layout":null,"metadata":null,"text":"Oh wait, he didn’t even read the article. Good on you, Dev Guy, good. on. you. Still, she plays nice with someone who didn’t even read her article:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_106.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_106.markups.0":{"type":"EM","start":101,"end":146,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_107":{"id":"3fed73795ca4_107","name":"f7db","type":"BQ","href":null,"layout":null,"metadata":null,"text":"That a typical unknown developer can’t depend on patronage to generate revenue, and charging for apps will become a negative.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_108":{"id":"3fed73795ca4_108","name":"937f","type":"P","href":null,"layout":null,"metadata":null,"text":"Marco comes back of course, and now basically accuses her of lying about other devs talking to her and supporting her point:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_109":{"id":"3fed73795ca4_109","name":"c9dd","type":"BQ","href":null,"layout":null,"metadata":null,"text":"How many actual developers did you hear from, really? Funny how almost nobody wants to give a (real) name on these accusations.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_110":{"id":"3fed73795ca4_110","name":"c522","type":"P","href":null,"layout":null,"metadata":null,"text":"Really? You’re going to do that? “There’s no name, so I don’t think it’s a real person.” Just…what’s the Joe Welch quote from the McCarthy hearings?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_111":{"id":"3fed73795ca4_111","name":"907e","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Let us not assassinate this lad further, Senator. You’ve done enough. Have you no sense of decency, sir? At long last, have you left no sense of decency?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_112":{"id":"3fed73795ca4_112","name":"2158","type":"P","href":null,"layout":null,"metadata":null,"text":"That is what this is at this point: character assasination because she said something critical of A Popular Person. It’s disgusting. Depressing and disgusting. No one, none of these people have seriously discussed her point, heck, it looks like they barely bothered to read it, if they did at all.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_113":{"id":"3fed73795ca4_113","name":"13f8","type":"P","href":null,"layout":null,"metadata":null,"text":"Marco starts getting really petty with her (no big shock) and Samantha finally starts pushing back:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_114":{"id":"3fed73795ca4_114","name":"96c6","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Glad to see you be the bigger person and ignore the mindset of so many developers not relating to you, good for you!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_115":{"id":"3fed73795ca4_115","name":"5d3f","type":"P","href":null,"layout":null,"metadata":null,"text":"That of course, is what caused Marco to question the validity, if not the existence of her sources. (Funny how anonymous sources are totes okay when they convenience Marco et al, and work for oh, Apple, but when they are inconvenient? Ha! PROVIDE ME PROOF YOU INTEMPERATE WOMAN!)","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_115.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_115.markups.0":{"type":"EM","start":196,"end":201,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_116":{"id":"3fed73795ca4_116","name":"c07c","type":"P","href":null,"layout":null,"metadata":null,"text":"Make no mistake, there’s some sexist shit going on here. Every tweet I’ve quoted was authored by a guy.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_117":{"id":"3fed73795ca4_117","name":"8b32","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, Marco has to play the “I’ve been around longer than you” card with this bon mot:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_118":{"id":"3fed73795ca4_118","name":"de26","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Yup, before you existed!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_119":{"id":"3fed73795ca4_119","name":"a3bd","type":"P","href":null,"layout":null,"metadata":null,"text":"Really dude? I mean, I’m sorry about the penis, but really?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_120":{"id":"3fed73795ca4_120","name":"1c51","type":"P","href":null,"layout":null,"metadata":null,"text":"Mind you, when the criticism isn’t just bizarrely stupid, Samantha reacts the way Marco and his ilk claim they would to (if they ever got any valid criticism. Which clearly is impossible):","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_120.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_120.markups.0":{"type":"EM","start":142,"end":147,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_121":{"id":"3fed73795ca4_121","name":"9848","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Not to get into the middle of this, but “income” is not the term you’re looking for. “Revenue” is.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_122":{"id":"3fed73795ca4_122","name":"f2a6","type":"BQ","href":null,"layout":null,"metadata":null,"text":"lol. Noted.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_123":{"id":"3fed73795ca4_123","name":"aed9","type":"BQ","href":null,"layout":null,"metadata":null,"text":"And I wasn’t intending to be a dick, just a lot of people hear\u002Fsay “income” when they intend “revenue”, and then discussion …","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_124":{"id":"3fed73795ca4_124","name":"f9d8","type":"BQ","href":null,"layout":null,"metadata":null,"text":"… gets derailed by a jedi handwave of “Expenses”. But outside of charitable donation, it is all directly related.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_125":{"id":"3fed73795ca4_125","name":"f61c","type":"BQ","href":null,"layout":null,"metadata":null,"text":"haha. Thank you for the clarification.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_126":{"id":"3fed73795ca4_126","name":"5dd9","type":"P","href":null,"layout":null,"metadata":null,"text":"Note to Marco and the other…whatever they are…that is how one reacts to that kind of criticism. With a bit of humor and self-deprecation. You should try it sometime. For real, not just in your heads or conversations in Irish Pubs in S.F.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_127":{"id":"3fed73795ca4_127","name":"dc44","type":"P","href":null,"layout":null,"metadata":null,"text":"But now, the door has been cracked, and the cheap shots come out:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_128":{"id":"3fed73795ca4_128","name":"0c94","type":"BQ","href":null,"layout":null,"metadata":null,"text":"@testflight_app: Don’t worry guys, we process @marcoarment’s apps in direct proportion to his megabucks earnings. #fairelephant","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_128.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_128.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_128.markups.0":{"type":"A","start":46,"end":58,"href":"https:\u002F\u002Ftwitter.com\u002Fmarcoarment","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_128.markups.1":{"type":"A","start":114,"end":127,"href":"https:\u002F\u002Ftwitter.com\u002Fhashtag\u002Ffairelephant?src=hash","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_129":{"id":"3fed73795ca4_129","name":"343b","type":"P","href":null,"layout":null,"metadata":null,"text":"(Note: testflight_app is a parody account. Please do not mess with the actual testflight folks. They are still cool.)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_130":{"id":"3fed73795ca4_130","name":"09bf","type":"P","href":null,"layout":null,"metadata":null,"text":"Or this…conversation:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_131":{"id":"3fed73795ca4_131","name":"4d63","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*kbPh7V97eyRodSOw2-ALDw.png","typename":"ImageMetadata"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*kbPh7V97eyRodSOw2-ALDw.png":{"id":"1*kbPh7V97eyRodSOw2-ALDw.png","originalHeight":542,"originalWidth":398,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:3fed73795ca4_132":{"id":"3fed73795ca4_132","name":"f2a3","type":"P","href":null,"layout":null,"metadata":null,"text":"Good job guys. Good job. Defend the tribe. Attack the other. Frederico attempts to recover from his stunning display of demeaning douchery: ‏@viticci: @s_bielefeld I don’t know if it’s an Italian thing, but counting other people’s money is especially weird for me. IMO, bad move in the post.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_132.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_132.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_132.markups.0":{"type":"A","start":140,"end":149,"href":"https:\u002F\u002Ftwitter.com\u002Fviticci","anchorType":"LINK","userId":"","linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_132.markups.1":{"type":"A","start":151,"end":163,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld","anchorType":"LINK","userId":"","linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_133":{"id":"3fed73795ca4_133","name":"ae0c","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha is clearly sick of his crap: ‏@s_bielefeld: @viticci That’s what I’m referring to, the mistake of ever having mentioned it. So, now, Marco can ignore the bigger issue and go on living.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_133.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_133.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_133.markups.0":{"type":"A","start":38,"end":51,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld","anchorType":"LINK","userId":"","linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_133.markups.1":{"type":"A","start":53,"end":61,"href":"https:\u002F\u002Ftwitter.com\u002Fviticci","anchorType":"LINK","userId":"","linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_134":{"id":"3fed73795ca4_134","name":"2047","type":"P","href":null,"layout":null,"metadata":null,"text":"Good for her. There’s being patient and being roadkill.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_135":{"id":"3fed73795ca4_135","name":"4139","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha does put the call out for her sources to maybe let her use their names:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_136":{"id":"3fed73795ca4_136","name":"6626","type":"BQ","href":null,"layout":null,"metadata":null,"text":"From all of you I heard from earlier, anyone care to go on record?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_137":{"id":"3fed73795ca4_137","name":"8a7d","type":"P","href":null,"layout":null,"metadata":null,"text":"My good friend, The Angry Drunk points out the obvious problem:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_138":{"id":"3fed73795ca4_138","name":"68c9","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Nobody’s going to go on record when they count on Marco’s friends for their PR.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_139":{"id":"3fed73795ca4_139","name":"317d","type":"P","href":null,"layout":null,"metadata":null,"text":"This is true. Again, the sites that are Friends of Marco:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_140":{"id":"3fed73795ca4_140","name":"9523","type":"P","href":null,"layout":null,"metadata":null,"text":"Daring Fireball","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_141":{"id":"3fed73795ca4_141","name":"dbc7","type":"P","href":null,"layout":null,"metadata":null,"text":"The Loop","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_142":{"id":"3fed73795ca4_142","name":"c706","type":"P","href":null,"layout":null,"metadata":null,"text":"SixColors","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_143":{"id":"3fed73795ca4_143","name":"0acb","type":"P","href":null,"layout":null,"metadata":null,"text":"iMore","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_144":{"id":"3fed73795ca4_144","name":"8c8c","type":"P","href":null,"layout":null,"metadata":null,"text":"MacStories","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_145":{"id":"3fed73795ca4_145","name":"643e","type":"P","href":null,"layout":null,"metadata":null,"text":"A few others, but I want this post to end one day.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_146":{"id":"3fed73795ca4_146","name":"6b76","type":"P","href":null,"layout":null,"metadata":null,"text":"You piss that crew off, and given how petty rather a few of them have demonstrated they are, good luck on getting any kind of notice from them.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_147":{"id":"3fed73795ca4_147","name":"f7d1","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, the idea this could happen is just craycray:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_148":{"id":"3fed73795ca4_148","name":"de59","type":"BQ","href":null,"layout":null,"metadata":null,"text":"@KevinColeman .@Angry_Drunk @s_bielefeld @marcoarment Wow, you guys are veering right into crazy conspiracy theory territory. #JetFuelCantMeltSteelBeams","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_148.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_148.markups.1","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_148.markups.2","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_148.markups.3","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_148.markups.4","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_148.markups.0":{"type":"A","start":0,"end":14,"href":"https:\u002F\u002Ftwitter.com\u002FKevinColeman","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_148.markups.1":{"type":"A","start":14,"end":27,"href":"https:\u002F\u002Ftwitter.com\u002FAngry_Drunk","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_148.markups.2":{"type":"A","start":28,"end":40,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_148.markups.3":{"type":"A","start":41,"end":53,"href":"https:\u002F\u002Ftwitter.com\u002Fmarcoarment","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_148.markups.4":{"type":"A","start":126,"end":152,"href":"https:\u002F\u002Ftwitter.com\u002Fhashtag\u002FJetFuelCantMeltSteelBeams?src=hash","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_149":{"id":"3fed73795ca4_149","name":"f01b","type":"P","href":null,"layout":null,"metadata":null,"text":"Yeah. Because a mature person like Marco would never do anything like that.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_150":{"id":"3fed73795ca4_150","name":"7e30","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course, the real point on this is starting to happen:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_151":{"id":"3fed73795ca4_151","name":"5d93","type":"BQ","href":null,"layout":null,"metadata":null,"text":"you’re getting a lot of heat now but happy you are writing things that stir up the community. Hope you continue to be a voice!","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_152":{"id":"3fed73795ca4_152","name":"436b","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I doubt I will.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_153":{"id":"3fed73795ca4_153","name":"ac25","type":"P","href":null,"layout":null,"metadata":null,"text":"See, they’ve done their job. Mess with the bull, you get the horns. Maybe you should find another thing to write about, this isn’t a good place for you. Great job y’all.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_153.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_153.markups.0":{"type":"EM","start":153,"end":158,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_154":{"id":"3fed73795ca4_154","name":"07ba","type":"P","href":null,"layout":null,"metadata":null,"text":"Some people aren’t even pretending. They’re just in full strawman mode:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_155":{"id":"3fed73795ca4_155","name":"3d60","type":"BQ","href":null,"layout":null,"metadata":null,"text":"@timkeller: Unfair to begrudge a person for leveraging past success, especially when that success is earned. No ‘luck’ involved.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_155.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_155.markups.0":{"type":"A","start":0,"end":12,"href":"https:\u002F\u002Ftwitter.com\u002Ftimkeller","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_156":{"id":"3fed73795ca4_156","name":"87f5","type":"BQ","href":null,"layout":null,"metadata":null,"text":"@s_bielefeld: @timkeller I plainly stated that I don’t hold his doing this against him. Way to twist words.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_156.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_156.markups.1","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_156.markups.0":{"type":"A","start":0,"end":14,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_156.markups.1":{"type":"A","start":14,"end":24,"href":"https:\u002F\u002Ftwitter.com\u002Ftimkeller","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_157":{"id":"3fed73795ca4_157","name":"3720","type":"P","href":null,"layout":null,"metadata":null,"text":"I think she’s earned her anger at this point.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_158":{"id":"3fed73795ca4_158","name":"7341","type":"P","href":null,"layout":null,"metadata":null,"text":"Don’t worry, Marco knows what the real problem is: most devs just suck —","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_159":{"id":"3fed73795ca4_159","name":"babe","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*Fpb2Bvdx7Q-688vdm-NdkQ.png","typename":"ImageMetadata"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*Fpb2Bvdx7Q-688vdm-NdkQ.png":{"id":"1*Fpb2Bvdx7Q-688vdm-NdkQ.png","originalHeight":771,"originalWidth":694,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:3fed73795ca4_160":{"id":"3fed73795ca4_160","name":"503d","type":"P","href":null,"layout":null,"metadata":null,"text":"I have a saying that applies in this case: don’t place your head so far up your nethers that you go full Klein Bottle. Marco has gone full Klein Bottle. (To be correct, he went FKB some years ago.)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_161":{"id":"3fed73795ca4_161","name":"b8c0","type":"P","href":null,"layout":null,"metadata":null,"text":"There are some bright spots. My favorite is when Building Twenty points out the real elephant in the room:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_161.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_161.markups.0":{"type":"EM","start":80,"end":84,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_162":{"id":"3fed73795ca4_162","name":"36f4","type":"BQ","href":null,"layout":null,"metadata":null,"text":"@BuildingTwenty: Both @s_bielefeld & I wrote similar critiques of @marcoarment’s pricing model yet the Internet pilloried only the woman. Who’d have guessed?","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_162.markups.0","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_162.markups.1","typename":"Markup"},{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_162.markups.2","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_162.markups.0":{"type":"A","start":0,"end":15,"href":"https:\u002F\u002Ftwitter.com\u002FBuildingTwenty","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_162.markups.1":{"type":"A","start":22,"end":34,"href":"https:\u002F\u002Ftwitter.com\u002Fs_bielefeld","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_162.markups.2":{"type":"A","start":66,"end":78,"href":"https:\u002F\u002Ftwitter.com\u002Fmarcoarment","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_163":{"id":"3fed73795ca4_163","name":"06b9","type":"P","href":null,"layout":null,"metadata":null,"text":"Yup.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_164":{"id":"3fed73795ca4_164","name":"eff9","type":"P","href":null,"layout":null,"metadata":null,"text":"Another bright spot are these comments from Ian Betteridge, who has been doing this even longer than Marco:","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_164.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_164.markups.0":{"type":"EM","start":84,"end":106,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_165":{"id":"3fed73795ca4_165","name":"18f1","type":"BQ","href":null,"layout":null,"metadata":null,"text":"You know, any writer who has never made a single factual error in a piece hasn’t ever written anything worth reading.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_166":{"id":"3fed73795ca4_166","name":"9776","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I learned my job with the support of people who helped me. Had I suffered an Internet pile on for every error I wouldn’t have bothered.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_167":{"id":"3fed73795ca4_167","name":"8d44","type":"P","href":null,"layout":null,"metadata":null,"text":"To which Samantha understandably replies:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_168":{"id":"3fed73795ca4_168","name":"7147","type":"BQ","href":null,"layout":null,"metadata":null,"text":"and it’s honestly something I’m contemplating right now, whether to continue…","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_169":{"id":"3fed73795ca4_169","name":"e0cd","type":"P","href":null,"layout":null,"metadata":null,"text":"Gee, I can’t imagine why. Why with comments like this from Chris Breen that completely misrepresent Samantha’s point, (who until today, I would have absolutely defended as being better than this, something I am genuinely saddened to be wrong about), why wouldn’t she want to continue doing this?","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_170":{"id":"3fed73795ca4_170","name":"a379","type":"BQ","href":null,"layout":null,"metadata":null,"text":"If I have this right, some people are outraged that a creator has decided to give away his work.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_171":{"id":"3fed73795ca4_171","name":"f026","type":"P","href":null,"layout":null,"metadata":null,"text":"No Chris, you don’t have this right. But hey, who has time to find out the real issue and read an article. I’m sure your friends told you everything you need to know.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_172":{"id":"3fed73795ca4_172","name":"e1c2","type":"P","href":null,"layout":null,"metadata":null,"text":"Noted Feminist Glenn Fleishman gets a piece of the action too:","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_173":{"id":"3fed73795ca4_173","name":"067c","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"type":"id","generated":false,"id":"ImageMetadata:1*lvOySry5gHHJfGU_bQXrzA.png","typename":"ImageMetadata"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*lvOySry5gHHJfGU_bQXrzA.png":{"id":"1*lvOySry5gHHJfGU_bQXrzA.png","originalHeight":269,"originalWidth":308,"focusPercentX":null,"focusPercentY":null,"alt":null,"__typename":"ImageMetadata"},"Paragraph:3fed73795ca4_174":{"id":"3fed73795ca4_174","name":"4df8","type":"P","href":null,"layout":null,"metadata":null,"text":"I’m not actually surprised here. I watched Fleishman berate a friend of mine who has been an engineer for…heck, waaaaay too long on major software products in the most condescending way because she tried to point out that as a very technical woman, “The Magazine” literally had nothing to say to her and maybe he should fix that. “Impertinent” was I believe what he called her, but I may have the specific word wrong. Not the attitude mind you. Great Feminists like Glenn do not like uppity women criticizing Great Feminists who are their Great Allies.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_174.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_174.markups.0":{"type":"EM","start":227,"end":231,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_175":{"id":"3fed73795ca4_175","name":"bf45","type":"P","href":null,"layout":null,"metadata":null,"text":"Great Feminists are often tools.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_176":{"id":"3fed73795ca4_176","name":"45bb","type":"P","href":null,"layout":null,"metadata":null,"text":"Luckily, I hope, the people who get Samantha’s point also started chiming in (and you get 100% of the women commenting here that I’ve seen):","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_177":{"id":"3fed73795ca4_177","name":"c053","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I don’t think he’s wrong for doing it, he just discusses it as if the market’s a level playing field — it isn’t","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_178":{"id":"3fed73795ca4_178","name":"7b5e","type":"BQ","href":null,"layout":null,"metadata":null,"text":"This is a great article with lots of great points about the sustainability of iOS development. Thank you for publishing it.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_179":{"id":"3fed73795ca4_179","name":"a321","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Regardless of the numbers and your view of MA, fair points here about confirmation bias in app marketing feasibility http:\u002F\u002Fsamanthabielefeld.com\u002Fthe-elephant-in-the-room …","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_179.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_179.markups.0":{"type":"A","start":117,"end":172,"href":"http:\u002F\u002Ft.co\u002Fu79ZLsnhdM","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_180":{"id":"3fed73795ca4_180","name":"76fe","type":"BQ","href":null,"layout":null,"metadata":null,"text":"thank you for posting this, it covers a lot of things people don’t like to talk about.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_181":{"id":"3fed73795ca4_181","name":"bf90","type":"BQ","href":null,"layout":null,"metadata":null,"text":"I’m sure you have caught untold amounts of flak over posting this because Marco is blind to his privilege as a developer.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_182":{"id":"3fed73795ca4_182","name":"0f66","type":"BQ","href":null,"layout":null,"metadata":null,"text":"Catching up on the debate, and agreeing with Harry’s remark. (Enjoyed your article, Samantha, and ‘got’ your point.)","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_183":{"id":"3fed73795ca4_183","name":"6134","type":"P","href":null,"layout":null,"metadata":null,"text":"I would like to say I’m surprised at the reaction to Samantha’s article, but I’m not. In spite of his loud declarations of support for The Big Lie, Marco Arment is as bad at any form of criticism that he hasn’t already approved as a very insecure tween. An example from 2011: http:\u002F\u002Fwww.businessinsider.com\u002Fmarco-arment-2011-9","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_183.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_183.markups.0":{"type":"A","start":276,"end":326,"href":"http:\u002F\u002Fwww.businessinsider.com\u002Fmarco-arment-2011-9","anchorType":"LINK","userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_184":{"id":"3fed73795ca4_184","name":"ba3c","type":"P","href":null,"layout":null,"metadata":null,"text":"Marco is great with criticism as long as it never actually criticizes him. If it does, be prepared a flood of petty, petulant whining that a room full of bored preschoolers on a hot day would be hard-pressed to match.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_185":{"id":"3fed73795ca4_185","name":"a5a0","type":"P","href":null,"layout":null,"metadata":null,"text":"Today has been…well, it sucks. It sucks because someone doing what all the Arments of the world claim to want was naive enough to believe what they were told, and found out the hard way just how big a lie The Big Lie is, and how vicious people are when you’re silly enough to believe anything they say about criticism.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_186":{"id":"3fed73795ca4_186","name":"2a25","type":"P","href":null,"layout":null,"metadata":null,"text":"And note again, every single condescending crack, misrepresentation, and strawman had an exclusively male source. Most of them have, at one point or another, loudly trumpted themselves as Feminist Allies, as a friend to women struggling with the sexism and misogyny in tech. Congratulations y’all on being just as bad as the people you claim to oppose.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_187":{"id":"3fed73795ca4_187","name":"a47a","type":"P","href":null,"layout":null,"metadata":null,"text":"Samantha has handled this better than anyone else could have. My respect for her as a person and a writer is off the charts. If she choses to walk away from blogging in the Apple space, believe me I understand. As bad as today was for her, I’ve seen worse. Much worse.","hasDropCap":null,"dropCapImage":null,"markups":[{"type":"id","generated":true,"id":"Paragraph:3fed73795ca4_187.markups.0","typename":"Markup"}],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_187.markups.0":{"type":"EM","start":186,"end":196,"href":null,"anchorType":null,"userId":null,"linkMetadata":null,"__typename":"Markup"},"Paragraph:3fed73795ca4_188":{"id":"3fed73795ca4_188","name":"aa8e","type":"P","href":null,"layout":null,"metadata":null,"text":"But I hope she doesn’t. I hope she stays, because she is Doing This Right, and in a corner of the internet that has become naught but an endless circle jerk, a cliquish collection, a churlish, childish cohort interested not in writing or the truth, but in making sure The Right People are elevated, and The Others put down, she is someone worth reading and listening to. The number people who owe her apologies goes around the block, and I don’t think she’ll ever see a one. I’m sure as heck not apologizing for them, I’ll not make their lives easier in the least.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_189":{"id":"3fed73795ca4_189","name":"34c5","type":"P","href":null,"layout":null,"metadata":null,"text":"All of you, all. of. you…Marco, Breen, Snell, Vittici, had a chance to live by your words. You were faced with reasoned, polite, respectful criticism and instead of what you should have done, you all dropped trou and sprayed an epic diarrheal discharge all over someone who had done nothing to deserve it. Me, I earned most of my aggro, Samantha did not earn any of the idiocy I’ve seen today. I hope you’re all proud of yourselves. Someone should be, it won’t be me. Ever.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"Paragraph:3fed73795ca4_190":{"id":"3fed73795ca4_190","name":"9710","type":"P","href":null,"layout":null,"metadata":null,"text":"So I hope she stays, but if she goes, I understand. For what it’s worth, I don’t think she’s wrong either way.","hasDropCap":null,"dropCapImage":null,"markups":[],"__typename":"Paragraph","iframe":null,"mixtapeMetadata":null},"$Post:d146a92473a1.postResponses":{"count":13,"__typename":"PostResponses"},"Post:57ed6bd76960":{"__typename":"Post","id":"57ed6bd76960","title":"The Pinterest Paradox: Cupcakes and Toxicity","mediumUrl":"https:\u002F\u002Fmedium.com\u002F@francoise_93266\u002Fthe-pinterest-paradox-cupcakes-and-toxicity-57ed6bd76960","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1597185784040,"readingTime":16.807547169811322,"statusForCollection":null,"isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":null,"creator":{"type":"id","generated":false,"id":"User:d299e872410","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:57ed6bd76960.previewContent","typename":"PreviewContent"}},"ImageMetadata:":{"id":"","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"User:d299e872410":{"name":"Francoise Brougher","username":"francoise_93266","id":"d299e872410","bio":"Former Pinterest COO and Executive at Square and Google. French American, from Marseille to the Bay Area. Mom of Three","isFollowing":null,"imageId":"1*tPgjXGoTTRKg7xcmn3yMOw.jpeg","mediumMemberAt":0,"__typename":"User"},"$Post:57ed6bd76960.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:c16cc0b092f1":{"__typename":"Post","id":"c16cc0b092f1","title":"Your Life Is Full of Porn. Stop Getting Yourself Off.","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fthe-ascent\u002Fyour-life-is-full-of-porn-stop-getting-yourself-off-c16cc0b092f1","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1596214861525,"readingTime":4.6716981132075475,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:eb660df75111","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:b6d641be1066","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:c16cc0b092f1.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg":{"id":"1*fkW0uY9JMZ6oUNyVRO6BBQ.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:eb660df75111":{"name":"The Ascent","id":"eb660df75111","slug":"the-ascent","domain":"theascent.pub","__typename":"Collection"},"User:b6d641be1066":{"name":"Tim Denning","username":"timdenning","id":"b6d641be1066","bio":"Aussie Blogger — Writer for CNBC & Business Insider. Inspiring the world through Personal Development and Entrepreneurship. www.timdenning.com","isFollowing":null,"imageId":"2*D4KAER7h6bCkTU-m7Aw9DA.jpeg","mediumMemberAt":1570431600000,"__typename":"User"},"$Post:c16cc0b092f1.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:238dae9a4372":{"__typename":"Post","id":"238dae9a4372","title":"Mourning my baby brother, Fahim","mediumUrl":"https:\u002F\u002Fmedium.com\u002F@justiceforfahim\u002Fmourning-my-baby-brother-fahim-238dae9a4372","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*HizZro5r4AJ8Fj_xjVUzrA.jpeg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1597311061478,"readingTime":14.243396226415094,"statusForCollection":null,"isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":null,"creator":{"type":"id","generated":false,"id":"User:8ad85cee2b23","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:238dae9a4372.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*HizZro5r4AJ8Fj_xjVUzrA.jpeg":{"id":"1*HizZro5r4AJ8Fj_xjVUzrA.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"User:8ad85cee2b23":{"name":"Justiceforfahim","username":"justiceforfahim","id":"8ad85cee2b23","bio":"","isFollowing":null,"imageId":"0*JZ7dfapmV3kCb0CH.jpg","mediumMemberAt":0,"__typename":"User"},"$Post:238dae9a4372.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:9cf4ec1c8e26":{"__typename":"Post","id":"9cf4ec1c8e26","title":"I’m A Sugar Baby-& This Is How Much I Get Paid To Date","mediumUrl":"https:\u002F\u002Fmedium.com\u002Frefinery29\u002Fim-a-sugar-baby-this-is-how-much-i-get-paid-to-date-9cf4ec1c8e26","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:0*vGxs86f0dmFewdXV.jpg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1596556261424,"readingTime":8.815094339622641,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:aa4155f74368","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:47057b17b8e2","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:9cf4ec1c8e26.previewContent","typename":"PreviewContent"}},"ImageMetadata:0*vGxs86f0dmFewdXV.jpg":{"id":"0*vGxs86f0dmFewdXV.jpg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:aa4155f74368":{"name":"Refinery29","id":"aa4155f74368","slug":"refinery29","domain":null,"__typename":"Collection"},"User:47057b17b8e2":{"name":"Refinery29 UK","username":"refinery29","id":"47057b17b8e2","bio":"The leading global media company focused on young women. We inspire, entertain, and empower our audience through optimistic and diverse storytelling.","isFollowing":null,"imageId":"0*000ZlntQkYrNiPB-.png","mediumMemberAt":0,"__typename":"User"},"$Post:9cf4ec1c8e26.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:94a10bc60f2b":{"__typename":"Post","id":"94a10bc60f2b","title":"Can Kamala Harris and Joe Biden Defeat Trump?","mediumUrl":"https:\u002F\u002Feand.co\u002Fcan-kamala-harris-and-joe-biden-defeat-trump-94a10bc60f2b","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*6prX9w38K3M3PEZG9XkbFg.jpeg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1597270521604,"readingTime":10.154716981132074,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:9b4cc1c6abbd","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:41e01d325219","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:94a10bc60f2b.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*6prX9w38K3M3PEZG9XkbFg.jpeg":{"id":"1*6prX9w38K3M3PEZG9XkbFg.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:9b4cc1c6abbd":{"name":"Eudaimonia and Co","id":"9b4cc1c6abbd","slug":"eudaimonia-co","domain":"eand.co","__typename":"Collection"},"User:41e01d325219":{"name":"umair haque","username":"umairh","id":"41e01d325219","bio":"vampire.","isFollowing":null,"imageId":"0*lI5-avJvcBbQDmA2.jpeg","mediumMemberAt":1529949326000,"__typename":"User"},"$Post:94a10bc60f2b.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:4f221ac3dbe3":{"__typename":"Post","id":"4f221ac3dbe3","title":"The Best Data Science Certification You’ve Never Heard Of","mediumUrl":"https:\u002F\u002Ftowardsdatascience.com\u002Fbest-data-science-certification-4f221ac3dbe3","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*t43PDV1g9w-DvjMugoks2A.jpeg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1597164086108,"readingTime":7.346226415094339,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:7f60cf5620c9","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:2caa691701c0","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:4f221ac3dbe3.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*t43PDV1g9w-DvjMugoks2A.jpeg":{"id":"1*t43PDV1g9w-DvjMugoks2A.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:7f60cf5620c9":{"name":"Towards Data Science","id":"7f60cf5620c9","slug":"towards-data-science","domain":"towardsdatascience.com","__typename":"Collection"},"User:2caa691701c0":{"name":"Nicole Janeway Bills","username":"nicolejaneway","id":"2caa691701c0","bio":"Data Scientist at Atlas Research in Washington, DC | Quarantining in a Python virtual environment","isFollowing":null,"imageId":"2*UVCEt3tjr0W9zC3dymCPtQ.jpeg","mediumMemberAt":0,"__typename":"User"},"$Post:4f221ac3dbe3.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:c6087d2df935":{"__typename":"Post","id":"c6087d2df935","title":"TypeScript 4.0 finally delivers what I’ve been waiting for","mediumUrl":"https:\u002F\u002Fmedium.com\u002Fjavascript-in-plain-english\u002Ftypescript-4-0-i-want-a-list-of-generic-params-with-good-labels-c6087d2df935","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*G00zmJivkNGN1L6fDo9vnQ.png","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1596838633257,"readingTime":2.6330188679245285,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:4b3a1ed4f11c","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:b5ccf606a659","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:c6087d2df935.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*G00zmJivkNGN1L6fDo9vnQ.png":{"id":"1*G00zmJivkNGN1L6fDo9vnQ.png","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"Collection:4b3a1ed4f11c":{"name":"JavaScript In Plain English","id":"4b3a1ed4f11c","slug":"javascript-in-plain-english","domain":null,"__typename":"Collection"},"User:b5ccf606a659":{"name":"Nathaniel Kessler","username":"nathanielkessler","id":"b5ccf606a659","bio":"Coding and front-end | nathanielkessler.com","isFollowing":null,"imageId":"2*CXxf7GK5jOj87CWO7YruLQ.png","mediumMemberAt":1579007136857,"__typename":"User"},"$Post:c6087d2df935.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"Post:25a86ed4a421":{"__typename":"Post","id":"25a86ed4a421","title":"America and the Axis of Idiots","mediumUrl":"https:\u002F\u002Feand.co\u002Famerica-and-the-axis-of-idiots-25a86ed4a421","previewImage":{"type":"id","generated":false,"id":"ImageMetadata:1*yNRBQduBLs8p_tEpShEGzQ.jpeg","typename":"ImageMetadata"},"isPublished":true,"firstPublishedAt":1597184309884,"readingTime":8.535849056603773,"statusForCollection":"APPROVED","isLocked":true,"isShortform":false,"visibility":"LOCKED","collection":{"type":"id","generated":false,"id":"Collection:9b4cc1c6abbd","typename":"Collection"},"creator":{"type":"id","generated":false,"id":"User:41e01d325219","typename":"User"},"previewContent":{"type":"id","generated":true,"id":"$Post:25a86ed4a421.previewContent","typename":"PreviewContent"}},"ImageMetadata:1*yNRBQduBLs8p_tEpShEGzQ.jpeg":{"id":"1*yNRBQduBLs8p_tEpShEGzQ.jpeg","focusPercentX":null,"focusPercentY":null,"__typename":"ImageMetadata"},"$Post:25a86ed4a421.previewContent":{"isFullContent":false,"__typename":"PreviewContent"},"$Post:d146a92473a1.internalLinks({\"paging\":{\"limit\":8}})":{"items":[{"type":"id","generated":false,"id":"Post:57ed6bd76960","typename":"Post"},{"type":"id","generated":false,"id":"Post:c16cc0b092f1","typename":"Post"},{"type":"id","generated":false,"id":"Post:238dae9a4372","typename":"Post"},{"type":"id","generated":false,"id":"Post:9cf4ec1c8e26","typename":"Post"},{"type":"id","generated":false,"id":"Post:94a10bc60f2b","typename":"Post"},{"type":"id","generated":false,"id":"Post:4f221ac3dbe3","typename":"Post"},{"type":"id","generated":false,"id":"Post:c6087d2df935","typename":"Post"},{"type":"id","generated":false,"id":"Post:25a86ed4a421","typename":"Post"}],"__typename":"InternalLinksConnection"},"$Post:d146a92473a1.previewContent":{"subtitle":"How to get shanked doing what people say they want","__typename":"PreviewContent"}}
+ ]]>
+ </script>
+ <script src="https://cdn-client.medium.com/lite/static/js/manifest.969da7fb.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~main.343f1489.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/main.03b8d106.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~instrumentation.aafb014a.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/instrumentation.2fc37711.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/reporting.2a00272f.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~AMPPost~CollectionHomepage~CollectionHomepagePreview~CollectionNewShortformEditor~Collection~abee666d.21607860.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~AMPPost~CollectionNewShortformEditor~CollectionPostShortformEditor~DebugCachedPost~Post~Sequ~19f09bd3.5b5af8d1.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/vendors~AMPPost~DebugCachedPost~Post~SequencePost~Series.9932a441.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/AMPPost~CollectionHomepage~CollectionHomepagePreview~CollectionNewShortformEditor~CollectionPostShor~c3445a7d.c5ca06bd.chunk.js"></script>
+ <script src="https://cdn-client.medium.com/lite/static/js/Post.d4129f11.chunk.js"></script>
+ <script>
+ <![CDATA[
+ window.main();
+ ]]>
+ </script>
+ </body>
</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-metadata.json
new file mode 100644
index 000000000..d998fb4c7
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Contents",
+ "Image": null,
+ "Title": "Shared Mutable History \u2014 evolve extension for Mercurial",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected.html
new file mode 100644
index 000000000..61915e455
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/expected.html
@@ -0,0 +1,738 @@
+<div id="evolve-shared-mutable-history">
+
+ <div id="contents">
+ <p>
+ Contents
+ </p>
+ <ul>
+ <li>
+ <a href="#evolve-shared-mutable-history" id="id4">Evolve: Shared Mutable History</a>
+ <ul>
+ <li>
+ <a href="#sharing-with-a-single-developer" id="id5">Sharing with a single developer</a>
+ <ul>
+ <li>
+ <a href="#publishing-and-non-publishing-repositories" id="id6">Publishing and non-publishing repositories</a>
+ </li>
+ <li>
+ <a href="#setting-up" id="id7">Setting up</a>
+ </li>
+ <li>
+ <a href="#example-1-amend-a-shared-changeset" id="id8">Example 1: Amend a shared changeset</a>
+ </li>
+ <li>
+ <a href="#example-2-amend-again-locally" id="id9">Example 2: Amend again, locally</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="#sharing-with-multiple-developers-code-review" id="id10">Sharing with multiple developers: code review</a>
+ <ul>
+ <li>
+ <a href="#id2" id="id11">Setting up</a>
+ </li>
+ <li>
+ <a href="#example-3-alice-commits-and-amends-a-draft-fix" id="id12">Example 3: Alice commits and amends a draft fix</a>
+ </li>
+ <li>
+ <a href="#example-4-bob-implements-and-publishes-a-new-feature" id="id13">Example 4: Bob implements and publishes a new feature</a>
+ </li>
+ <li>
+ <a href="#example-5-alice-integrates-and-publishes" id="id14">Example 5: Alice integrates and publishes</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="#getting-into-trouble-with-shared-mutable-history" id="id15">Getting into trouble with shared mutable history</a>
+ <ul>
+ <li>
+ <a href="#id3" id="id16">Setting up</a>
+ </li>
+ <li>
+ <a href="#example-6-divergent-changesets" id="id17">Example 6: Divergent changesets</a>
+ </li>
+ <li>
+ <a href="#phase-divergence-when-a-rewritten-changeset-is-made-public" id="id18">Phase-divergence: when a rewritten changeset is made public</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="#conclusion" id="id19">Conclusion</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Once you have mastered the art of mutable history in a single repository (see the <a href="http://fakehost/test/user-guide.html">user guide</a>), you can move up to the next level: <em>shared</em> mutable history. <tt><span>evolve</span></tt> lets you push and pull draft changesets between repositories along with their obsolescence markers. This opens up a number of interesting possibilities.
+ </p>
+ <p>
+ The simplest scenario is a single developer working across two computers. Say you’re working on code that must be tested on a remote test server, probably in a rack somewhere, only accessible by SSH, and running an “enterprise-grade” (out-of-date) OS. But you probably prefer to write code locally: everything is setup the way you like it, and you can use your preferred editor, IDE, merge/diff tools, etc.
+ </p>
+ <p>
+ Traditionally, your options are limited: either
+ </p>
+ <blockquote>
+ <div>
+ <ul>
+ <li>(ab)use your source control system by committing half-working code in order to get it onto the remote test server, or
+ </li>
+ <li>go behind source control’s back by using <tt><span>rsync</span></tt> (or similar) to transfer your code back-and-forth until it is ready to commit
+ </li>
+ </ul>
+ </div>
+ </blockquote>
+ <p>
+ The former is less bad with distributed version control systems like Mercurial, but it’s still far from ideal. (One important version control “best practice” is that every commit should make things just a little bit better, i.e. you should never commit code that is worse than what came before.) The latter, avoiding version control entirely, means that you’re walking a tightrope without a safety net. One accidental <tt><span>rsync</span></tt> in the wrong direction could destroy hours of work.
+ </p>
+ <p>
+ Using Mercurial with <tt><span>evolve</span></tt> to share mutable history solves these problems. As with single-repository <tt><span>evolve</span></tt>, you can commit whenever the code is demonstrably better, even if all the tests aren’t passing yet—just <tt><span>hg</span> <span>amend</span></tt> when they are. And you can transfer those half-baked changesets between repositories to try things out on your test server before anything is carved in stone.
+ </p>
+ <p>
+ A less common scenario is multiple developers sharing mutable history, typically for code review. We’ll cover this scenario later. First, we will cover single-user sharing.
+ </p>
+ <div id="sharing-with-a-single-developer">
+ <h2>
+ <a href="#id5">Sharing with a single developer</a><a href="#sharing-with-a-single-developer" title="Permalink to this headline">¶</a>
+ </h2>
+ <div id="publishing-and-non-publishing-repositories">
+ <h3>
+ <a href="#id6">Publishing and non-publishing repositories</a><a href="#publishing-and-non-publishing-repositories" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ The key to shared mutable history is to keep your changesets in <em>draft</em> phase as you pass them around. Recall that by default, <tt><span>hg</span> <span>push</span></tt> promotes changesets from <em>draft</em> to <em>public</em>, and public changesets are immutable. You can change this behaviour by reconfiguring the <em>remote</em> repository so that it is non-publishing. (Short version: set <tt><span>phases.publish</span></tt> to <tt><span>false</span></tt>. Long version follows.)
+ </p>
+ </div>
+ <div id="setting-up">
+ <h3>
+ <a href="#id7">Setting up</a><a href="#setting-up" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ We’ll work through an example with three local repositories, although in the real world they’d most likely be on three different computers. First, the <tt><span>public</span></tt> repository is where tested, polished changesets live, and it is where you synchronize with the rest of your team.
+ </p>
+
+ <p>
+ We’ll need two clones where work gets done, <tt><span>test-repo</span></tt> and <tt><span>dev-repo</span></tt>:
+ </p>
+ <div>
+ <pre>$ hg clone public test-repo
+updating to branch default
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone test-repo dev-repo
+updating to branch default
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ <p>
+ <tt><span>dev-repo</span></tt> is your local machine, with GUI merge tools and IDEs and everything configured just the way you like it. <tt><span>test-repo</span></tt> is the test server in a rack somewhere behind SSH. So for the most part, we’ll develop in <tt><span>dev-repo</span></tt>, push to <tt><span>test-repo</span></tt>, test and polish there, and push to <tt><span>public</span></tt>.
+ </p>
+ <p>
+ The key to shared mutable history is to make the target repository, in this case <tt><span>test-repo</span></tt>, non-publishing. And, of course, we have to enable the <tt><span>evolve</span></tt> extension in both <tt><span>test-repo</span></tt> and <tt><span>dev-repo</span></tt>.
+ </p>
+ <p>
+ First, edit the configuration for <tt><span>test-repo</span></tt>:
+ </p>
+ <div>
+ <pre>$ hg -R test-repo config --edit --local
+</pre>
+ </div>
+ <p>
+ and add
+ </p>
+ <div>
+ <pre>[phases]
+publish = false
+
+[extensions]
+evolve =
+</pre>
+ </div>
+ <p>
+ Then edit the configuration for <tt><span>dev-repo</span></tt>:
+ </p>
+ <div>
+ <pre>$ hg -R dev-repo config --edit --local
+</pre>
+ </div>
+ <p>
+ and add
+ </p>
+
+ <p>
+ Keep in mind that in real life, these repositories would probably be on separate computers, so you’d have to login to each one to configure each repository.
+ </p>
+ <p>
+ To start things off, let’s make one public, immutable changeset:
+ </p>
+ <div>
+ <pre>$ cd test-repo
+$ echo 'my new project' &gt; file1
+$ hg add file1
+$ hg commit -m 'create new project'
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ <p>
+ and pull that into the development repository:
+ </p>
+ <div>
+ <pre>$ cd ../dev-repo
+$ hg pull -u
+[...]
+added 1 changesets with 1 changes to 1 files
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+
+ <div id="example-2-amend-again-locally">
+ <h3>
+ <a href="#id9">Example 2: Amend again, locally</a><a href="#example-2-amend-again-locally" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ This process can repeat. Perhaps you figure out a more elegant fix to the bug, and want to mutate history so nobody ever knows you had a less-than-perfect idea. We’ll implement it locally in <tt><span>dev-repo</span></tt> and push to <tt><span>test-repo</span></tt>:
+ </p>
+ <div>
+ <pre>$ echo 'Fix, fix, and fix.' &gt; file1
+$ hg amend
+$ hg push
+</pre>
+ </div>
+ <p>
+ This time around, the temporary amend commit is in <tt><span>dev-repo</span></tt>, and it is not transferred to <tt><span>test-repo</span></tt>—the same as before, just in the opposite direction. Figure 4 shows the two repositories after amending in <tt><span>dev-repo</span></tt> and pushing to <tt><span>test-repo</span></tt>.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG04: each repo has one temporary amend commit, but they’re different in each one]
+ </p>
+ </blockquote>
+ <p>
+ Let’s hop over to <tt><span>test-repo</span></tt> to test the more elegant fix:
+ </p>
+ <div>
+ <pre>$ cd ../test-repo
+$ hg update
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ <p>
+ This time, all the tests pass, so no further amending is required. This bug fix is finished, so we push it to the public repository:
+ </p>
+ <div>
+ <pre>$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ <p>
+ Note that only one changeset—the final version, after two amendments—was actually pushed. Again, Mercurial doesn’t transfer hidden changesets on push and pull.
+ </p>
+ <p>
+ So the picture in <tt><span>public</span></tt> is much simpler than in either <tt><span>dev-repo</span></tt> or <tt><span>test-repo</span></tt>. Neither of our missteps nor our amendments are publicly visible, just the final, beautifully polished changeset:
+ </p>
+ <blockquote>
+ <p>
+ [figure SG05: public repo with rev 0:0dc9, 1:de61, both public]
+ </p>
+ </blockquote>
+ <p>
+ There is one important step left to do. Because we pushed from <tt><span>test-repo</span></tt> to <tt><span>public</span></tt>, the pushed changeset is in <em>public</em> phase in those two repositories. But <tt><span>dev-repo</span></tt> has been out-of-the-loop; changeset de61 is still <em>draft</em> there. If we’re not careful, we might mutate history in <tt><span>dev-repo</span></tt>, obsoleting a changeset that is already public. Let’s avoid that situation for now by pushing up to <tt><span>dev-repo</span></tt>:
+ </p>
+ <div>
+ <pre>$ hg push ../dev-repo
+pushing to ../dev-repo
+searching for changes
+no changes found
+</pre>
+ </div>
+ <p>
+ Even though no <em>changesets</em> were pushed, Mercurial still pushed obsolescence markers and phase changes to <tt><span>dev-repo</span></tt>.
+ </p>
+ <p>
+ A final note: since this fix is now <em>public</em>, it is immutable. It’s no longer possible to amend it:
+ </p>
+ <div>
+ <pre>$ hg amend -m 'fix bug 37'
+abort: cannot amend public changesets
+</pre>
+ </div>
+ <p>
+ This is, after all, the whole point of Mercurial’s phases: to prevent rewriting history that has already been published.
+ </p>
+ </div>
+ </div>
+ <div id="sharing-with-multiple-developers-code-review">
+ <h2>
+ <a href="#id10">Sharing with multiple developers: code review</a><a href="#sharing-with-multiple-developers-code-review" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Now that you know how to share your own mutable history across multiple computers, you might be wondering if it makes sense to share mutable history with others. It does, but you have to be careful, stay alert, and <em>communicate</em> with your peers.
+ </p>
+ <p>
+ Code review is a good use case for sharing mutable history across multiple developers: Alice commits a draft changeset, submits it for review, and amends her changeset until her reviewer is satisfied. Meanwhile, Bob is also committing draft changesets for review, amending until his reviewer is satisfied. Once a particular changeset passes review, the respective author (Alice or Bob) pushes it to the public (publishing) repository.
+ </p>
+ <p>
+ Incidentally, the reviewers here can be anyone: maybe Bob and Alice review each other’s work; maybe the same third party reviews both; or maybe they pick different experts to review their work on different parts of a large codebase. Similarly, it doesn’t matter if reviews are conducted in person, by email, or by carrier pigeon. Code review is outside of the scope of Mercurial, so all we’re looking at here is the mechanics of committing, amending, pushing, and pulling.
+ </p>
+ <div id="id2">
+ <h3>
+ <a href="#id11">Setting up</a><a href="#id2" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ To demonstrate, let’s start with the <tt><span>public</span></tt> repository as we left it in the last example, with two immutable changesets (figure 5 above). We’ll clone a <tt><span>review</span></tt> repository from it, and then Alice and Bob will both clone from <tt><span>review</span></tt>.
+ </p>
+ <div>
+ <pre>$ hg clone public review
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone review alice
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone review bob
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ <p>
+ We need to configure Alice’s and Bob’s working repositories to enable <tt><span>evolve</span></tt>. First, edit Alice’s configuration with
+ </p>
+ <div>
+ <pre>$ hg -R alice config --edit --local
+</pre>
+ </div>
+ <p>
+ and add
+ </p>
+
+ <p>
+ Then edit Bob’s repository configuration:
+ </p>
+ <div>
+ <pre>$ hg -R bob config --edit --local
+</pre>
+ </div>
+ <p>
+ and add the same text.
+ </p>
+ </div>
+ <div id="example-3-alice-commits-and-amends-a-draft-fix">
+ <h3>
+ <a href="#id12">Example 3: Alice commits and amends a draft fix</a><a href="#example-3-alice-commits-and-amends-a-draft-fix" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ We’ll follow Alice working on a bug fix. We’re going to use bookmarks to make it easier to understand multiple branch heads in the <tt><span>review</span></tt> repository, so Alice starts off by creating a bookmark and committing her first attempt at a fix:
+ </p>
+ <div>
+ <pre>$ hg bookmark bug15
+$ echo 'fix' &gt; file2
+$ hg commit -A -u alice -m 'fix bug 15 (v1)'
+adding file2
+</pre>
+ </div>
+ <p>
+ Note the unorthodox “(v1)” in the commit message. We’re just using that to make this tutorial easier to follow; it’s not something we’d recommend in real life.
+ </p>
+ <p>
+ Of course Alice wouldn’t commit unless her fix worked to her satisfaction, so it must be time to solicit a code review. She does this by pushing to the <tt><span>review</span></tt> repository:
+ </p>
+ <div>
+ <pre>$ hg push -B bug15
+[...]
+added 1 changesets with 1 changes to 1 files
+exporting bookmark bug15
+</pre>
+ </div>
+ <p>
+ (The use of <tt><span>-B</span></tt> is important to ensure that we only push the bookmarked head, and that the bookmark itself is pushed. See this <a href="http://mercurial.aragost.com/kick-start/en/bookmarks/">guide to bookmarks</a>, especially the <a href="http://mercurial.aragost.com/kick-start/en/bookmarks/#sharing-bookmarks">Sharing Bookmarks</a> section, if you’re not familiar with bookmarks.)
+ </p>
+ <p>
+ Some time passes, and Alice receives her code review. As a result, Alice revises her fix and submits it for a second review:
+ </p>
+ <div>
+ <pre>$ echo 'Fix.' &gt; file2
+$ hg amend -m 'fix bug 15 (v2)'
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark bug15
+</pre>
+ </div>
+ <p>
+ Figure 6 shows the state of the <tt><span>review</span></tt> repository at this point.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG06: rev 2:fn1e is Alice’s obsolete v1, rev 3:cbdf is her v2; both children of rev 1:de61]
+ </p>
+ </blockquote>
+ <p>
+ After a busy morning of bug fixing, Alice stops for lunch. Let’s see what Bob has been up to.
+ </p>
+ </div>
+ <div id="example-4-bob-implements-and-publishes-a-new-feature">
+ <h3>
+ <a href="#id13">Example 4: Bob implements and publishes a new feature</a><a href="#example-4-bob-implements-and-publishes-a-new-feature" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ Meanwhile, Bob has been working on a new feature. Like Alice, he’ll use a bookmark to track his work, and he’ll push that bookmark to the <tt><span>review</span></tt> repository, so that reviewers know which changesets to review.
+ </p>
+ <div>
+ <pre>$ cd ../bob
+$ echo 'stuff' &gt; file1
+$ hg bookmark featureX
+$ hg commit -u bob -m 'implement feature X (v1)' # rev 4:1636
+$ hg push -B featureX
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+exporting bookmark featureX
+</pre>
+ </div>
+ <p>
+ When Bob receives his code review, he improves his implementation a bit, amends, and submits the resulting changeset for review:
+ </p>
+ <div>
+ <pre>$ echo 'do stuff' &gt; file1
+$ hg amend -m 'implement feature X (v2)' # rev 5:0eb7
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark featureX
+</pre>
+ </div>
+ <p>
+ Unfortunately, that still doesn’t pass muster. Bob’s reviewer insists on proper capitalization and punctuation.
+ </p>
+ <div>
+ <pre>$ echo 'Do stuff.' &gt; file1
+$ hg amend -m 'implement feature X (v3)' # rev 6:540b
+</pre>
+ </div>
+ <p>
+ On the bright side, the second review said, “Go ahead and publish once you fix that.” So Bob immediately publishes his third attempt:
+ </p>
+ <div>
+ <pre>$ hg push ../public
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ <p>
+ It’s not enough just to update <tt><span>public</span></tt>, though! Other people also use the <tt><span>review</span></tt> repository, and right now it doesn’t have Bob’s latest amendment (“v3”, revision 6:540b), nor does it know that the precursor of that changeset (“v2”, revision 5:0eb7) is obsolete. Thus, Bob pushes to <tt><span>review</span></tt> as well:
+ </p>
+ <div>
+ <pre>$ hg push ../review
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark featureX
+</pre>
+ </div>
+ <p>
+ Figure 7 shows the result of Bob’s work in both <tt><span>review</span></tt> and <tt><span>public</span></tt>.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG07: review includes Alice’s draft work on bug 15, as well as Bob’s v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public. public contains only the final, public implementation of feature X]
+ </p>
+ </blockquote>
+ <p>
+ Incidentally, it’s important that Bob push to <tt><span>public</span></tt> <em>before</em> <tt><span>review</span></tt>. If he pushed to <tt><span>review</span></tt> first, then revision 6:540b would still be in <em>draft</em> phase in <tt><span>review</span></tt>, but it would be <em>public</em> in both Bob’s local repository and the <tt><span>public</span></tt> repository. That could lead to confusion at some point, which is easily avoided by pushing first to <tt><span>public</span></tt>.
+ </p>
+ </div>
+ <div id="example-5-alice-integrates-and-publishes">
+ <h3>
+ <a href="#id14">Example 5: Alice integrates and publishes</a><a href="#example-5-alice-integrates-and-publishes" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ Finally, Alice gets back from lunch and sees that the carrier pigeon with her second review has arrived (or maybe it’s in her email inbox). Alice’s reviewer approved her amended changeset, so she pushes it to <tt><span>public</span></tt>:
+ </p>
+ <div>
+ <pre>$ hg push ../public
+[...]
+remote has heads on branch 'default' that are not known locally: 540ba8f317e6
+abort: push creates new remote head cbdfbd5a5db2!
+(pull and merge or see "hg help push" for details about pushing new heads)
+</pre>
+ </div>
+ <p>
+ Oops! Bob has won the race to push first to <tt><span>public</span></tt>. So Alice needs to integrate with Bob: let’s pull his changeset(s) and see what the branch heads are.
+ </p>
+ <div>
+ <pre>$ hg pull ../public
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+$ hg log -G -q -r 'head()' --template '{rev}:{node|short} ({author})\n'
+o 5:540ba8f317e6 (bob)
+|
+| @ 4:cbdfbd5a5db2 (alice)
+|/
+</pre>
+ </div>
+ <p>
+ We’ll assume Alice and Bob are perfectly comfortable with rebasing changesets. (After all, they’re already using mutable history in the form of <tt><span>amend</span></tt>.) So Alice rebases her changeset on top of Bob’s and publishes the result:
+ </p>
+ <div>
+ <pre>$ hg rebase -d 5
+$ hg push ../public
+[...]
+added 1 changesets with 1 changes to 1 files
+$ hg push ../review
+[...]
+added 1 changesets with 0 changes to 0 files
+updating bookmark bug15
+</pre>
+ </div>
+ <p>
+ The result, in both <tt><span>review</span></tt> and <tt><span>public</span></tt> repositories, is shown in figure 8.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG08: review shows v1 and v2 of Alice’s fix, then v1, v2, v3 of Bob’s feature, finally Alice’s fix rebased onto Bob’s. public just shows the final public version of each changeset]
+ </p>
+ </blockquote>
+ </div>
+ </div>
+ <div id="getting-into-trouble-with-shared-mutable-history">
+ <h2>
+ <a href="#id15">Getting into trouble with shared mutable history</a><a href="#getting-into-trouble-with-shared-mutable-history" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Mercurial with <tt><span>evolve</span></tt> is a powerful tool, and using powerful tools can have consequences. (You can cut yourself badly with a sharp knife, but every competent chef keeps several around. Ever try to chop onions with a spoon?)
+ </p>
+ <p>
+ In the user guide, we saw examples of <em>unstbale</em> changesets, which are the most common type of troubled changeset. (Recall that a non-obsolete changeset with obsolete ancestors is an orphan.)
+ </p>
+ <p>
+ Two other types of troubles can happen: <em>divergent</em> and <em>bumped</em> changesets. Both are more likely with shared mutable history, especially mutable history shared by multiple developers.
+ </p>
+ <div id="id3">
+ <h3>
+ <a href="#id16">Setting up</a><a href="#id3" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ For these examples, we’re going to use a slightly different workflow: as before, Alice and Bob share a <tt><span>public</span></tt> repository. But this time there is no <tt><span>review</span></tt> repository. Instead, Alice and Bob put on their cowboy hats, throw good practice to the wind, and pull directly from each other’s working repositories.
+ </p>
+ <p>
+ So we throw away everything except <tt><span>public</span></tt> and reclone:
+ </p>
+ <div>
+ <pre>$ rm -rf review alice bob
+$ hg clone public alice
+updating to branch default
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone public bob
+updating to branch default
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ <p>
+ Once again we have to configure their repositories: enable <tt><span>evolve</span></tt> and (since Alice and Bob will be pulling directly from each other) make their repositories non-publishing. Edit Alice’s configuration:
+ </p>
+ <div>
+ <pre>$ hg -R alice config --edit --local
+</pre>
+ </div>
+ <p>
+ and add
+ </p>
+ <div>
+ <pre>[extensions]
+rebase =
+evolve =
+
+[phases]
+publish = false
+</pre>
+ </div>
+ <p>
+ Then edit Bob’s repository configuration:
+ </p>
+ <div>
+ <pre>$ hg -R bob config --edit --local
+</pre>
+ </div>
+ <p>
+ and add the same text.
+ </p>
+ </div>
+ <div id="example-6-divergent-changesets">
+ <h3>
+ <a href="#id17">Example 6: Divergent changesets</a><a href="#example-6-divergent-changesets" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ When an obsolete changeset has two successors, those successors are <em>divergent</em>. One way to get into such a situation is by failing to communicate with your teammates. Let’s see how that might happen.
+ </p>
+ <p>
+ First, we’ll have Bob commit a bug fix that could still be improved:
+ </p>
+ <div>
+ <pre>$ cd bob
+$ echo 'pretty good fix' &gt;&gt; file1
+$ hg commit -u bob -m 'fix bug 24 (v1)' # rev 4:2fe6
+</pre>
+ </div>
+ <p>
+ Since Alice and Bob are now in cowboy mode, Alice pulls Bob’s draft changeset and amends it herself.
+ </p>
+ <div>
+ <pre>$ cd ../alice
+$ hg pull -u ../bob
+[...]
+added 1 changesets with 1 changes to 1 files
+$ echo 'better fix (alice)' &gt;&gt; file1
+$ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+</pre>
+ </div>
+ <p>
+ But Bob has no idea that Alice just did this. (See how important good communication is?) So he implements a better fix of his own:
+ </p>
+ <div>
+ <pre>$ cd ../bob
+$ echo 'better fix (bob)' &gt;&gt; file1
+$ hg amend -u bob -m 'fix bug 24 (v2 by bob)' # rev 6:a360
+</pre>
+ </div>
+ <p>
+ At this point, the divergence exists, but only in theory: Bob’s original changeset, 4:2fe6, is obsolete and has two successors. But those successors are in different repositories, so the trouble is not visible to anyone yet. It will be as soon as Bob pulls from Alice’s repository (or vice-versa).
+ </p>
+ <div>
+ <pre>$ hg pull ../alice
+[...]
+added 1 changesets with 1 changes to 2 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+2 new divergent changesets
+</pre>
+ </div>
+ <p>
+ Figure 9 shows the situation in Bob’s repository.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG09: Bob’s repo with 2 heads for the 2 divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence]
+ </p>
+ </blockquote>
+ <p>
+ Now we need to get out of trouble. As usual, the answer is to evolve history.
+ </p>
+ <div>
+ <pre>$ HGMERGE=internal:other hg evolve
+merge:[6] fix bug 24 (v2 by bob)
+with: [7] fix bug 24 (v2 by alice)
+base: [4] fix bug 24 (v1)
+0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ <p>
+ Figure 10 shows how Bob’s repository looks now.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG10: only one visible head, 9:5ad6, successor to hidden 6:a360 and 7:e3f9]
+ </p>
+ </blockquote>
+ <p>
+ We carefully dodged a merge conflict by specifying a merge tool (<tt><span>internal:other</span></tt>) that will take Alice’s changes over Bob’s. (You might wonder why Bob wouldn’t prefer his own changes by using <tt><span>internal:local</span></tt>. He’s avoiding a <a href="#bug">bug</a> in <tt><span>evolve</span></tt> that occurs when evolving divergent changesets using <tt><span>internal:local</span></tt>.)
+ </p>
+ <p>
+ # XXX this link does not work .. <span id="bug">bug</span>: <a href="https://bitbucket.org/marmoute/mutable-history/issue/48/">https://bitbucket.org/marmoute/mutable-history/issue/48/</a>
+ </p>
+ <p>
+ ** STOP HERE: WORK IN PROGRESS **
+ </p>
+ </div>
+ <div id="phase-divergence-when-a-rewritten-changeset-is-made-public">
+ <h3>
+ <a href="#id18">Phase-divergence: when a rewritten changeset is made public</a><a href="#phase-divergence-when-a-rewritten-changeset-is-made-public" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ If Alice and Bob are collaborating on some mutable changesets, it’s possible to get into a situation where an otherwise worthwhile changeset cannot be pushed to the public repository; it is <em>phase-divergent</em> with another changeset that was made public first. Let’s demonstrate one way this could happen.
+ </p>
+ <p>
+ It starts with Alice committing a bug fix. Right now, we don’t yet know if this bug fix is good enough to push to the public repository, but it’s good enough for Alice to commit.
+ </p>
+ <div>
+ <pre>$ cd alice
+$ echo 'fix' &gt; file2
+$ hg commit -A -m 'fix bug 15'
+adding file2
+</pre>
+ </div>
+ <p>
+ Now Bob has a bad idea: he decides to pull whatever Alice is working on and tweak her bug fix to his taste:
+ </p>
+ <div>
+ <pre>$ cd ../bob
+$ hg pull -u ../alice
+[...]
+added 1 changesets with 1 changes to 1 files
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ echo 'Fix.' &gt; file2
+$ hg amend -A -m 'fix bug 15 (amended)'
+</pre>
+ </div>
+ <p>
+ (Note the lack of communication between Alice and Bob. Failing to communicate with your colleagues is a good way to get into trouble. Nevertheless, <tt><span>evolve</span></tt> can usually sort things out, as we will see.)
+ </p>
+ <blockquote>
+ <p>
+ [figure SG06: Bob’s repo with one amendment]
+ </p>
+ </blockquote>
+ <p>
+ After some testing, Alice realizes her bug fix is just fine as it is: no need for further polishing and amending, this changeset is ready to publish.
+ </p>
+ <div>
+ <pre>$ cd ../alice
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ <p>
+ This introduces a contradiction: in Bob’s repository, changeset 2:e011 (his copy of Alice’s fix) is obsolete, since Bob amended it. But in Alice’s repository (and the <tt><span>public</span></tt> repository), that changeset is public: it is immutable, carved in stone for all eternity. No changeset can be both obsolete and public, so Bob is in for a surprise the next time he pulls from <tt><span>public</span></tt>:
+ </p>
+ <div>
+ <pre>$ cd ../bob
+$ hg pull -q -u
+1 new phase-divergent changesets
+</pre>
+ </div>
+ <p>
+ Figure 7 shows what just happened to Bob’s repository: changeset 2:e011 is now public, so it can’t be obsolete. When that changeset was obsolete, it made perfect sense for it to have a successor, namely Bob’s amendment of Alice’s fix (changeset 4:fe88). But it’s illogical for a public changeset to have a successor, so 4:fe88 is troubled: it has become <em>bumped</em>.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG07: 2:e011 now public not obsolete, 4:fe88 now bumped]
+ </p>
+ </blockquote>
+ <p>
+ As usual when there’s trouble in your repository, the solution is to evolve it:
+ </p>
+
+ <p>
+ Figure 8 illustrates Bob’s repository after evolving away the bumped changeset. Ignoring the obsolete changesets, Bob now has a nice, clean, simple history. His amendment of Alice’s bug fix lives on, as changeset 5:227d—albeit with a software-generated commit message. (Bob should probably amend that changeset to improve the commit message.) But the important thing is that his repository no longer has any troubled changesets, thanks to <tt><span>evolve</span></tt>.
+ </p>
+ <blockquote>
+ <p>
+ [figure SG08: 5:227d is new, formerly bumped changeset 4:fe88 now hidden]
+ </p>
+ </blockquote>
+ </div>
+ </div>
+ <div id="conclusion">
+ <h2>
+ <a href="#id19">Conclusion</a><a href="#conclusion" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Mutable history is a powerful tool. Like a sharp knife, an experienced user can do wonderful things with it, much more wonderful than with a dull knife (never mind a rusty spoon). At the same time, an inattentive or careless user can do harm to himself or others. Mercurial with <tt><span>evolve</span></tt> goes to great lengths to limit the harm you can do by trying to handle all possible types of “troubled” changesets. Nevertheless, having a first-aid kit nearby does not mean you should stop being careful with sharp knives.
+ </p>
+ <p>
+ Mutable history shared across multiple repositories by a single developer is a natural extension of this model. Once you are used to using a single sharp knife on its own, it’s pretty straightforward to chop onions and mushrooms using the same knife, or to alternate between two chopping boards with different knives.
+ </p>
+ <p>
+ Mutable history shared by multiple developers is a scary place to go. Imagine a professional kitchen full of expert chefs tossing their favourite knives back and forth, with the occasional axe or chainsaw thrown in to spice things up. If you’re confident that you <em>and your colleagues</em> can do it without losing a limb, go for it. But be sure to practice a lot first before you rely on it!
+ </p>
+ </div>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/source.html
new file mode 100644
index 000000000..e8dc6f642
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mercurial/source.html
@@ -0,0 +1,979 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>
+ Evolve: Shared Mutable History — evolve extension for Mercurial
+ </title>
+ <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <script type="text/javascript">
+ //<![CDATA[
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: './',
+ VERSION: '0.0',
+ COLLAPSE_INDEX: false,
+ FILE_SUFFIX: '.html',
+ HAS_SOURCE: true
+ };
+ //]]>
+ </script>
+ <script type="text/javascript" src="_static/jquery.js"></script>
+ <script type="text/javascript" src="_static/underscore.js"></script>
+ <script type="text/javascript" src="_static/doctools.js"></script>
+ <link rel="shortcut icon" href="_static/logo-evolve.ico" />
+ <link rel="top" title="evolve extension for Mercurial" href="index.html" />
+ <link rel="next" title="Evolve: Concepts" href="concepts.html" />
+ <link rel="prev" title="Evolve: User Guide" href="user-guide.html" />
+ </head>
+ <body>
+ <div class="header">
+ <h1 class="heading">
+ <a href="index.html"><span>evolve extension for Mercurial</span></a>
+ </h1>
+ <h2 class="heading">
+ <span>Evolve: Shared Mutable History</span>
+ </h2>
+ </div>
+ <div class="topnav">
+ <p>
+ «&#160;&#160;<a href="user-guide.html">Evolve: User Guide</a> &#160;&#160;::&#160;&#160; <a class="uplink" href="index.html">Contents</a> &#160;&#160;::&#160;&#160; <a href="concepts.html">Evolve: Concepts</a>&#160;&#160;»
+ </p>
+ </div>
+ <div class="content">
+ <div class="section" id="evolve-shared-mutable-history">
+ <h1>
+ <a class="toc-backref" href="#id4">Evolve: Shared Mutable History</a><a class="headerlink" href="#evolve-shared-mutable-history" title="Permalink to this headline">¶</a>
+ </h1>
+ <div class="contents topic" id="contents">
+ <p class="topic-title first">
+ Contents
+ </p>
+ <ul class="simple">
+ <li>
+ <a class="reference internal" href="#evolve-shared-mutable-history" id="id4">Evolve: Shared Mutable History</a>
+ <ul>
+ <li>
+ <a class="reference internal" href="#sharing-with-a-single-developer" id="id5">Sharing with a single developer</a>
+ <ul>
+ <li>
+ <a class="reference internal" href="#publishing-and-non-publishing-repositories" id="id6">Publishing and non-publishing repositories</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#setting-up" id="id7">Setting up</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-1-amend-a-shared-changeset" id="id8">Example 1: Amend a shared changeset</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-2-amend-again-locally" id="id9">Example 2: Amend again, locally</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a class="reference internal" href="#sharing-with-multiple-developers-code-review" id="id10">Sharing with multiple developers: code review</a>
+ <ul>
+ <li>
+ <a class="reference internal" href="#id2" id="id11">Setting up</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-3-alice-commits-and-amends-a-draft-fix" id="id12">Example 3: Alice commits and amends a draft fix</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-4-bob-implements-and-publishes-a-new-feature" id="id13">Example 4: Bob implements and publishes a new feature</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-5-alice-integrates-and-publishes" id="id14">Example 5: Alice integrates and publishes</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a class="reference internal" href="#getting-into-trouble-with-shared-mutable-history" id="id15">Getting into trouble with shared mutable history</a>
+ <ul>
+ <li>
+ <a class="reference internal" href="#id3" id="id16">Setting up</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#example-6-divergent-changesets" id="id17">Example 6: Divergent changesets</a>
+ </li>
+ <li>
+ <a class="reference internal" href="#phase-divergence-when-a-rewritten-changeset-is-made-public" id="id18">Phase-divergence: when a rewritten changeset is made public</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a class="reference internal" href="#conclusion" id="id19">Conclusion</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Once you have mastered the art of mutable history in a single repository (see the <a class="reference external" href="user-guide.html">user guide</a>), you can move up to the next level: <em>shared</em> mutable history. <tt class="docutils literal"><span class="pre">evolve</span></tt> lets you push and pull draft changesets between repositories along with their obsolescence markers. This opens up a number of interesting possibilities.
+ </p>
+ <p>
+ The simplest scenario is a single developer working across two computers. Say you’re working on code that must be tested on a remote test server, probably in a rack somewhere, only accessible by SSH, and running an “enterprise-grade” (out-of-date) OS. But you probably prefer to write code locally: everything is setup the way you like it, and you can use your preferred editor, IDE, merge/diff tools, etc.
+ </p>
+ <p>
+ Traditionally, your options are limited: either
+ </p>
+ <blockquote>
+ <div>
+ <ul class="simple">
+ <li>(ab)use your source control system by committing half-working code in order to get it onto the remote test server, or
+ </li>
+ <li>go behind source control’s back by using <tt class="docutils literal"><span class="pre">rsync</span></tt> (or similar) to transfer your code back-and-forth until it is ready to commit
+ </li>
+ </ul>
+ </div>
+ </blockquote>
+ <p>
+ The former is less bad with distributed version control systems like Mercurial, but it’s still far from ideal. (One important version control “best practice” is that every commit should make things just a little bit better, i.e. you should never commit code that is worse than what came before.) The latter, avoiding version control entirely, means that you’re walking a tightrope without a safety net. One accidental <tt class="docutils literal"><span class="pre">rsync</span></tt> in the wrong direction could destroy hours of work.
+ </p>
+ <p>
+ Using Mercurial with <tt class="docutils literal"><span class="pre">evolve</span></tt> to share mutable history solves these problems. As with single-repository <tt class="docutils literal"><span class="pre">evolve</span></tt>, you can commit whenever the code is demonstrably better, even if all the tests aren’t passing yet—just <tt class="docutils literal"><span class="pre">hg</span> <span class="pre">amend</span></tt> when they are. And you can transfer those half-baked changesets between repositories to try things out on your test server before anything is carved in stone.
+ </p>
+ <p>
+ A less common scenario is multiple developers sharing mutable history, typically for code review. We’ll cover this scenario later. First, we will cover single-user sharing.
+ </p>
+ <div class="section" id="sharing-with-a-single-developer">
+ <h2>
+ <a class="toc-backref" href="#id5">Sharing with a single developer</a><a class="headerlink" href="#sharing-with-a-single-developer" title="Permalink to this headline">¶</a>
+ </h2>
+ <div class="section" id="publishing-and-non-publishing-repositories">
+ <h3>
+ <a class="toc-backref" href="#id6">Publishing and non-publishing repositories</a><a class="headerlink" href="#publishing-and-non-publishing-repositories" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ The key to shared mutable history is to keep your changesets in <em>draft</em> phase as you pass them around. Recall that by default, <tt class="docutils literal"><span class="pre">hg</span> <span class="pre">push</span></tt> promotes changesets from <em>draft</em> to <em>public</em>, and public changesets are immutable. You can change this behaviour by reconfiguring the <em>remote</em> repository so that it is non-publishing. (Short version: set <tt class="docutils literal"><span class="pre">phases.publish</span></tt> to <tt class="docutils literal"><span class="pre">false</span></tt>. Long version follows.)
+ </p>
+ </div>
+ <div class="section" id="setting-up">
+ <h3>
+ <a class="toc-backref" href="#id7">Setting up</a><a class="headerlink" href="#setting-up" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ We’ll work through an example with three local repositories, although in the real world they’d most likely be on three different computers. First, the <tt class="docutils literal"><span class="pre">public</span></tt> repository is where tested, polished changesets live, and it is where you synchronize with the rest of your team.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg init public
+</pre>
+ </div>
+ </div>
+ <p>
+ We’ll need two clones where work gets done, <tt class="docutils literal"><span class="pre">test-repo</span></tt> and <tt class="docutils literal"><span class="pre">dev-repo</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg clone public test-repo
+updating to branch default
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone test-repo dev-repo
+updating to branch default
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ <tt class="docutils literal"><span class="pre">dev-repo</span></tt> is your local machine, with GUI merge tools and IDEs and everything configured just the way you like it. <tt class="docutils literal"><span class="pre">test-repo</span></tt> is the test server in a rack somewhere behind SSH. So for the most part, we’ll develop in <tt class="docutils literal"><span class="pre">dev-repo</span></tt>, push to <tt class="docutils literal"><span class="pre">test-repo</span></tt>, test and polish there, and push to <tt class="docutils literal"><span class="pre">public</span></tt>.
+ </p>
+ <p>
+ The key to shared mutable history is to make the target repository, in this case <tt class="docutils literal"><span class="pre">test-repo</span></tt>, non-publishing. And, of course, we have to enable the <tt class="docutils literal"><span class="pre">evolve</span></tt> extension in both <tt class="docutils literal"><span class="pre">test-repo</span></tt> and <tt class="docutils literal"><span class="pre">dev-repo</span></tt>.
+ </p>
+ <p>
+ First, edit the configuration for <tt class="docutils literal"><span class="pre">test-repo</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R test-repo config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>[phases]
+publish = false
+
+[extensions]
+evolve =
+</pre>
+ </div>
+ </div>
+ <p>
+ Then edit the configuration for <tt class="docutils literal"><span class="pre">dev-repo</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R dev-repo config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>[extensions]
+evolve =
+</pre>
+ </div>
+ </div>
+ <p>
+ Keep in mind that in real life, these repositories would probably be on separate computers, so you’d have to login to each one to configure each repository.
+ </p>
+ <p>
+ To start things off, let’s make one public, immutable changeset:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd test-repo
+$ echo 'my new project' &gt; file1
+$ hg add file1
+$ hg commit -m 'create new project'
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ </div>
+ <p>
+ and pull that into the development repository:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../dev-repo
+$ hg pull -u
+[...]
+added 1 changesets with 1 changes to 1 files
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ </div>
+ <div class="section" id="example-1-amend-a-shared-changeset">
+ <h3>
+ <a class="toc-backref" href="#id8">Example 1: Amend a shared changeset</a><a class="headerlink" href="#example-1-amend-a-shared-changeset" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ Everything you learned in the <a class="reference external" href="user-guide.html">user guide</a> applies to work done in <tt class="docutils literal"><span class="pre">dev-repo</span></tt>. You can commit, amend, uncommit, evolve, and so forth just as before.
+ </p>
+ <p>
+ Things get different when you push changesets to <tt class="docutils literal"><span class="pre">test-repo</span></tt>. Or rather, things stay the same, which <em>is</em> different: because we configured <tt class="docutils literal"><span class="pre">test-repo</span></tt> to be non-publishing, draft changesets stay draft when we push them to <tt class="docutils literal"><span class="pre">test-repo</span></tt>. Importantly, they’re also draft (mutable) in <tt class="docutils literal"><span class="pre">test-repo</span></tt>.
+ </p>
+ <p>
+ Let’s commit a preliminary change and push it to <tt class="docutils literal"><span class="pre">test-repo</span></tt> for testing.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'fix fix fix' &gt; file1
+$ hg commit -m 'prelim change'
+$ hg push ../test-repo
+</pre>
+ </div>
+ </div>
+ <p>
+ At this point, <tt class="docutils literal"><span class="pre">dev-repo</span></tt> and <tt class="docutils literal"><span class="pre">test-repo</span></tt> have the same changesets in the same phases:
+ </p>
+ <blockquote>
+ <div>
+ [figure SG01: rev 0:0dc9 public, rev 1:f649 draft, same on both repos]
+ </div>
+ </blockquote>
+ <p>
+ (You may notice a change in notation from the user guide: now changesets are labelled with their revision number and the first four digits of the 40-digit hexadecimal changeset ID. Mercurial revision numbers are never stable when working across repositories, especially when obsolescence is involved. We’ll see why shortly.)
+ </p>
+ <p>
+ Now let’s switch to <tt class="docutils literal"><span class="pre">test-repo</span></tt> to test our change:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../test-repo
+$ hg update
+</pre>
+ </div>
+ </div>
+ <p>
+ Don’t forget to <tt class="docutils literal"><span class="pre">hg</span> <span class="pre">update</span></tt>! Pushing only adds changesets to a remote repository; it does not update the working directory (unless you have a hook that updates for you).
+ </p>
+ <p>
+ Now let’s imagine the tests failed because we didn’t use proper punctuation and capitalization (oops). Let’s amend our preliminary fix (and fix the lame commit message while we’re at it):
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'Fix fix fix.' &gt; file1
+$ hg amend -m 'fix bug 37'
+</pre>
+ </div>
+ </div>
+ <p>
+ Now we’re in a funny intermediate state (figure 2): revision 1:f649 is obsolete in <tt class="docutils literal"><span class="pre">test-repo</span></tt>, having been replaced by revision 3:60ff (revision 2:2a03 is another one of those temporary amend commits that we saw in the user guide)—but <tt class="docutils literal"><span class="pre">dev-repo</span></tt> knows nothing of these recent developments.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG02: test-repo has rev 0:0dc9 public, rev 1:f649, 2:2a03 obsolete, rev 3:60ff draft; dev-repo same as in SG01]
+ </div>
+ </blockquote>
+ <p>
+ Let’s resynchronize:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../dev-repo
+$ hg pull -u
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ As seen in figure 3, this transfers the new changeset <em>and</em> the obsolescence marker for revision 1. However, it does <em>not</em> transfer the temporary amend commit, because it is hidden. Push and pull transfer obsolescence markers between repositories, but they do not transfer hidden changesets.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG03: dev-repo grows new rev 2:60ff, marks 1:f649 obsolete]
+ </div>
+ </blockquote>
+ <p>
+ Because of this deliberately incomplete synchronization, revision numbers in <tt class="docutils literal"><span class="pre">test-repo</span></tt> and <tt class="docutils literal"><span class="pre">dev-repo</span></tt> are no longer consistent. We <em>must</em> use changeset IDs.
+ </p>
+ </div>
+ <div class="section" id="example-2-amend-again-locally">
+ <h3>
+ <a class="toc-backref" href="#id9">Example 2: Amend again, locally</a><a class="headerlink" href="#example-2-amend-again-locally" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ This process can repeat. Perhaps you figure out a more elegant fix to the bug, and want to mutate history so nobody ever knows you had a less-than-perfect idea. We’ll implement it locally in <tt class="docutils literal"><span class="pre">dev-repo</span></tt> and push to <tt class="docutils literal"><span class="pre">test-repo</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'Fix, fix, and fix.' &gt; file1
+$ hg amend
+$ hg push
+</pre>
+ </div>
+ </div>
+ <p>
+ This time around, the temporary amend commit is in <tt class="docutils literal"><span class="pre">dev-repo</span></tt>, and it is not transferred to <tt class="docutils literal"><span class="pre">test-repo</span></tt>—the same as before, just in the opposite direction. Figure 4 shows the two repositories after amending in <tt class="docutils literal"><span class="pre">dev-repo</span></tt> and pushing to <tt class="docutils literal"><span class="pre">test-repo</span></tt>.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG04: each repo has one temporary amend commit, but they’re different in each one]
+ </div>
+ </blockquote>
+ <p>
+ Let’s hop over to <tt class="docutils literal"><span class="pre">test-repo</span></tt> to test the more elegant fix:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../test-repo
+$ hg update
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ This time, all the tests pass, so no further amending is required. This bug fix is finished, so we push it to the public repository:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ </div>
+ <p>
+ Note that only one changeset—the final version, after two amendments—was actually pushed. Again, Mercurial doesn’t transfer hidden changesets on push and pull.
+ </p>
+ <p>
+ So the picture in <tt class="docutils literal"><span class="pre">public</span></tt> is much simpler than in either <tt class="docutils literal"><span class="pre">dev-repo</span></tt> or <tt class="docutils literal"><span class="pre">test-repo</span></tt>. Neither of our missteps nor our amendments are publicly visible, just the final, beautifully polished changeset:
+ </p>
+ <blockquote>
+ <div>
+ [figure SG05: public repo with rev 0:0dc9, 1:de61, both public]
+ </div>
+ </blockquote>
+ <p>
+ There is one important step left to do. Because we pushed from <tt class="docutils literal"><span class="pre">test-repo</span></tt> to <tt class="docutils literal"><span class="pre">public</span></tt>, the pushed changeset is in <em>public</em> phase in those two repositories. But <tt class="docutils literal"><span class="pre">dev-repo</span></tt> has been out-of-the-loop; changeset de61 is still <em>draft</em> there. If we’re not careful, we might mutate history in <tt class="docutils literal"><span class="pre">dev-repo</span></tt>, obsoleting a changeset that is already public. Let’s avoid that situation for now by pushing up to <tt class="docutils literal"><span class="pre">dev-repo</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push ../dev-repo
+pushing to ../dev-repo
+searching for changes
+no changes found
+</pre>
+ </div>
+ </div>
+ <p>
+ Even though no <em>changesets</em> were pushed, Mercurial still pushed obsolescence markers and phase changes to <tt class="docutils literal"><span class="pre">dev-repo</span></tt>.
+ </p>
+ <p>
+ A final note: since this fix is now <em>public</em>, it is immutable. It’s no longer possible to amend it:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg amend -m 'fix bug 37'
+abort: cannot amend public changesets
+</pre>
+ </div>
+ </div>
+ <p>
+ This is, after all, the whole point of Mercurial’s phases: to prevent rewriting history that has already been published.
+ </p>
+ </div>
+ </div>
+ <div class="section" id="sharing-with-multiple-developers-code-review">
+ <h2>
+ <a class="toc-backref" href="#id10">Sharing with multiple developers: code review</a><a class="headerlink" href="#sharing-with-multiple-developers-code-review" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Now that you know how to share your own mutable history across multiple computers, you might be wondering if it makes sense to share mutable history with others. It does, but you have to be careful, stay alert, and <em>communicate</em> with your peers.
+ </p>
+ <p>
+ Code review is a good use case for sharing mutable history across multiple developers: Alice commits a draft changeset, submits it for review, and amends her changeset until her reviewer is satisfied. Meanwhile, Bob is also committing draft changesets for review, amending until his reviewer is satisfied. Once a particular changeset passes review, the respective author (Alice or Bob) pushes it to the public (publishing) repository.
+ </p>
+ <p>
+ Incidentally, the reviewers here can be anyone: maybe Bob and Alice review each other’s work; maybe the same third party reviews both; or maybe they pick different experts to review their work on different parts of a large codebase. Similarly, it doesn’t matter if reviews are conducted in person, by email, or by carrier pigeon. Code review is outside of the scope of Mercurial, so all we’re looking at here is the mechanics of committing, amending, pushing, and pulling.
+ </p>
+ <div class="section" id="id2">
+ <h3>
+ <a class="toc-backref" href="#id11">Setting up</a><a class="headerlink" href="#id2" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ To demonstrate, let’s start with the <tt class="docutils literal"><span class="pre">public</span></tt> repository as we left it in the last example, with two immutable changesets (figure 5 above). We’ll clone a <tt class="docutils literal"><span class="pre">review</span></tt> repository from it, and then Alice and Bob will both clone from <tt class="docutils literal"><span class="pre">review</span></tt>.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg clone public review
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone review alice
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone review bob
+updating to branch default
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ We need to configure Alice’s and Bob’s working repositories to enable <tt class="docutils literal"><span class="pre">evolve</span></tt>. First, edit Alice’s configuration with
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R alice config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>[extensions]
+evolve =
+</pre>
+ </div>
+ </div>
+ <p>
+ Then edit Bob’s repository configuration:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R bob config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add the same text.
+ </p>
+ </div>
+ <div class="section" id="example-3-alice-commits-and-amends-a-draft-fix">
+ <h3>
+ <a class="toc-backref" href="#id12">Example 3: Alice commits and amends a draft fix</a><a class="headerlink" href="#example-3-alice-commits-and-amends-a-draft-fix" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ We’ll follow Alice working on a bug fix. We’re going to use bookmarks to make it easier to understand multiple branch heads in the <tt class="docutils literal"><span class="pre">review</span></tt> repository, so Alice starts off by creating a bookmark and committing her first attempt at a fix:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg bookmark bug15
+$ echo 'fix' &gt; file2
+$ hg commit -A -u alice -m 'fix bug 15 (v1)'
+adding file2
+</pre>
+ </div>
+ </div>
+ <p>
+ Note the unorthodox “(v1)” in the commit message. We’re just using that to make this tutorial easier to follow; it’s not something we’d recommend in real life.
+ </p>
+ <p>
+ Of course Alice wouldn’t commit unless her fix worked to her satisfaction, so it must be time to solicit a code review. She does this by pushing to the <tt class="docutils literal"><span class="pre">review</span></tt> repository:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push -B bug15
+[...]
+added 1 changesets with 1 changes to 1 files
+exporting bookmark bug15
+</pre>
+ </div>
+ </div>
+ <p>
+ (The use of <tt class="docutils literal"><span class="pre">-B</span></tt> is important to ensure that we only push the bookmarked head, and that the bookmark itself is pushed. See this <a class="reference external" href="http://mercurial.aragost.com/kick-start/en/bookmarks/">guide to bookmarks</a>, especially the <a class="reference external" href="http://mercurial.aragost.com/kick-start/en/bookmarks/#sharing-bookmarks">Sharing Bookmarks</a> section, if you’re not familiar with bookmarks.)
+ </p>
+ <p>
+ Some time passes, and Alice receives her code review. As a result, Alice revises her fix and submits it for a second review:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'Fix.' &gt; file2
+$ hg amend -m 'fix bug 15 (v2)'
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark bug15
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 6 shows the state of the <tt class="docutils literal"><span class="pre">review</span></tt> repository at this point.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG06: rev 2:fn1e is Alice’s obsolete v1, rev 3:cbdf is her v2; both children of rev 1:de61]
+ </div>
+ </blockquote>
+ <p>
+ After a busy morning of bug fixing, Alice stops for lunch. Let’s see what Bob has been up to.
+ </p>
+ </div>
+ <div class="section" id="example-4-bob-implements-and-publishes-a-new-feature">
+ <h3>
+ <a class="toc-backref" href="#id13">Example 4: Bob implements and publishes a new feature</a><a class="headerlink" href="#example-4-bob-implements-and-publishes-a-new-feature" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ Meanwhile, Bob has been working on a new feature. Like Alice, he’ll use a bookmark to track his work, and he’ll push that bookmark to the <tt class="docutils literal"><span class="pre">review</span></tt> repository, so that reviewers know which changesets to review.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../bob
+$ echo 'stuff' &gt; file1
+$ hg bookmark featureX
+$ hg commit -u bob -m 'implement feature X (v1)' # rev 4:1636
+$ hg push -B featureX
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+exporting bookmark featureX
+</pre>
+ </div>
+ </div>
+ <p>
+ When Bob receives his code review, he improves his implementation a bit, amends, and submits the resulting changeset for review:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'do stuff' &gt; file1
+$ hg amend -m 'implement feature X (v2)' # rev 5:0eb7
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark featureX
+</pre>
+ </div>
+ </div>
+ <p>
+ Unfortunately, that still doesn’t pass muster. Bob’s reviewer insists on proper capitalization and punctuation.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ echo 'Do stuff.' &gt; file1
+$ hg amend -m 'implement feature X (v3)' # rev 6:540b
+</pre>
+ </div>
+ </div>
+ <p>
+ On the bright side, the second review said, “Go ahead and publish once you fix that.” So Bob immediately publishes his third attempt:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push ../public
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ </div>
+ <p>
+ It’s not enough just to update <tt class="docutils literal"><span class="pre">public</span></tt>, though! Other people also use the <tt class="docutils literal"><span class="pre">review</span></tt> repository, and right now it doesn’t have Bob’s latest amendment (“v3”, revision 6:540b), nor does it know that the precursor of that changeset (“v2”, revision 5:0eb7) is obsolete. Thus, Bob pushes to <tt class="docutils literal"><span class="pre">review</span></tt> as well:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push ../review
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+updating bookmark featureX
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 7 shows the result of Bob’s work in both <tt class="docutils literal"><span class="pre">review</span></tt> and <tt class="docutils literal"><span class="pre">public</span></tt>.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG07: review includes Alice’s draft work on bug 15, as well as Bob’s v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public. public contains only the final, public implementation of feature X]
+ </div>
+ </blockquote>
+ <p>
+ Incidentally, it’s important that Bob push to <tt class="docutils literal"><span class="pre">public</span></tt> <em>before</em> <tt class="docutils literal"><span class="pre">review</span></tt>. If he pushed to <tt class="docutils literal"><span class="pre">review</span></tt> first, then revision 6:540b would still be in <em>draft</em> phase in <tt class="docutils literal"><span class="pre">review</span></tt>, but it would be <em>public</em> in both Bob’s local repository and the <tt class="docutils literal"><span class="pre">public</span></tt> repository. That could lead to confusion at some point, which is easily avoided by pushing first to <tt class="docutils literal"><span class="pre">public</span></tt>.
+ </p>
+ </div>
+ <div class="section" id="example-5-alice-integrates-and-publishes">
+ <h3>
+ <a class="toc-backref" href="#id14">Example 5: Alice integrates and publishes</a><a class="headerlink" href="#example-5-alice-integrates-and-publishes" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ Finally, Alice gets back from lunch and sees that the carrier pigeon with her second review has arrived (or maybe it’s in her email inbox). Alice’s reviewer approved her amended changeset, so she pushes it to <tt class="docutils literal"><span class="pre">public</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg push ../public
+[...]
+remote has heads on branch 'default' that are not known locally: 540ba8f317e6
+abort: push creates new remote head cbdfbd5a5db2!
+(pull and merge or see "hg help push" for details about pushing new heads)
+</pre>
+ </div>
+ </div>
+ <p>
+ Oops! Bob has won the race to push first to <tt class="docutils literal"><span class="pre">public</span></tt>. So Alice needs to integrate with Bob: let’s pull his changeset(s) and see what the branch heads are.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg pull ../public
+[...]
+added 1 changesets with 1 changes to 1 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+$ hg log -G -q -r 'head()' --template '{rev}:{node|short} ({author})\n'
+o 5:540ba8f317e6 (bob)
+|
+| @ 4:cbdfbd5a5db2 (alice)
+|/
+</pre>
+ </div>
+ </div>
+ <p>
+ We’ll assume Alice and Bob are perfectly comfortable with rebasing changesets. (After all, they’re already using mutable history in the form of <tt class="docutils literal"><span class="pre">amend</span></tt>.) So Alice rebases her changeset on top of Bob’s and publishes the result:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg rebase -d 5
+$ hg push ../public
+[...]
+added 1 changesets with 1 changes to 1 files
+$ hg push ../review
+[...]
+added 1 changesets with 0 changes to 0 files
+updating bookmark bug15
+</pre>
+ </div>
+ </div>
+ <p>
+ The result, in both <tt class="docutils literal"><span class="pre">review</span></tt> and <tt class="docutils literal"><span class="pre">public</span></tt> repositories, is shown in figure 8.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG08: review shows v1 and v2 of Alice’s fix, then v1, v2, v3 of Bob’s feature, finally Alice’s fix rebased onto Bob’s. public just shows the final public version of each changeset]
+ </div>
+ </blockquote>
+ </div>
+ </div>
+ <div class="section" id="getting-into-trouble-with-shared-mutable-history">
+ <h2>
+ <a class="toc-backref" href="#id15">Getting into trouble with shared mutable history</a><a class="headerlink" href="#getting-into-trouble-with-shared-mutable-history" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Mercurial with <tt class="docutils literal"><span class="pre">evolve</span></tt> is a powerful tool, and using powerful tools can have consequences. (You can cut yourself badly with a sharp knife, but every competent chef keeps several around. Ever try to chop onions with a spoon?)
+ </p>
+ <p>
+ In the user guide, we saw examples of <em>unstbale</em> changesets, which are the most common type of troubled changeset. (Recall that a non-obsolete changeset with obsolete ancestors is an orphan.)
+ </p>
+ <p>
+ Two other types of troubles can happen: <em>divergent</em> and <em>bumped</em> changesets. Both are more likely with shared mutable history, especially mutable history shared by multiple developers.
+ </p>
+ <div class="section" id="id3">
+ <h3>
+ <a class="toc-backref" href="#id16">Setting up</a><a class="headerlink" href="#id3" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ For these examples, we’re going to use a slightly different workflow: as before, Alice and Bob share a <tt class="docutils literal"><span class="pre">public</span></tt> repository. But this time there is no <tt class="docutils literal"><span class="pre">review</span></tt> repository. Instead, Alice and Bob put on their cowboy hats, throw good practice to the wind, and pull directly from each other’s working repositories.
+ </p>
+ <p>
+ So we throw away everything except <tt class="docutils literal"><span class="pre">public</span></tt> and reclone:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ rm -rf review alice bob
+$ hg clone public alice
+updating to branch default
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ hg clone public bob
+updating to branch default
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ Once again we have to configure their repositories: enable <tt class="docutils literal"><span class="pre">evolve</span></tt> and (since Alice and Bob will be pulling directly from each other) make their repositories non-publishing. Edit Alice’s configuration:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R alice config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>[extensions]
+rebase =
+evolve =
+
+[phases]
+publish = false
+</pre>
+ </div>
+ </div>
+ <p>
+ Then edit Bob’s repository configuration:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg -R bob config --edit --local
+</pre>
+ </div>
+ </div>
+ <p>
+ and add the same text.
+ </p>
+ </div>
+ <div class="section" id="example-6-divergent-changesets">
+ <h3>
+ <a class="toc-backref" href="#id17">Example 6: Divergent changesets</a><a class="headerlink" href="#example-6-divergent-changesets" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ When an obsolete changeset has two successors, those successors are <em>divergent</em>. One way to get into such a situation is by failing to communicate with your teammates. Let’s see how that might happen.
+ </p>
+ <p>
+ First, we’ll have Bob commit a bug fix that could still be improved:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd bob
+$ echo 'pretty good fix' &gt;&gt; file1
+$ hg commit -u bob -m 'fix bug 24 (v1)' # rev 4:2fe6
+</pre>
+ </div>
+ </div>
+ <p>
+ Since Alice and Bob are now in cowboy mode, Alice pulls Bob’s draft changeset and amends it herself.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../alice
+$ hg pull -u ../bob
+[...]
+added 1 changesets with 1 changes to 1 files
+$ echo 'better fix (alice)' &gt;&gt; file1
+$ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+</pre>
+ </div>
+ </div>
+ <p>
+ But Bob has no idea that Alice just did this. (See how important good communication is?) So he implements a better fix of his own:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../bob
+$ echo 'better fix (bob)' &gt;&gt; file1
+$ hg amend -u bob -m 'fix bug 24 (v2 by bob)' # rev 6:a360
+</pre>
+ </div>
+ </div>
+ <p>
+ At this point, the divergence exists, but only in theory: Bob’s original changeset, 4:2fe6, is obsolete and has two successors. But those successors are in different repositories, so the trouble is not visible to anyone yet. It will be as soon as Bob pulls from Alice’s repository (or vice-versa).
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg pull ../alice
+[...]
+added 1 changesets with 1 changes to 2 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
+2 new divergent changesets
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 9 shows the situation in Bob’s repository.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG09: Bob’s repo with 2 heads for the 2 divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence]
+ </div>
+ </blockquote>
+ <p>
+ Now we need to get out of trouble. As usual, the answer is to evolve history.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ HGMERGE=internal:other hg evolve
+merge:[6] fix bug 24 (v2 by bob)
+with: [7] fix bug 24 (v2 by alice)
+base: [4] fix bug 24 (v1)
+0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 10 shows how Bob’s repository looks now.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG10: only one visible head, 9:5ad6, successor to hidden 6:a360 and 7:e3f9]
+ </div>
+ </blockquote>
+ <p>
+ We carefully dodged a merge conflict by specifying a merge tool (<tt class="docutils literal"><span class="pre">internal:other</span></tt>) that will take Alice’s changes over Bob’s. (You might wonder why Bob wouldn’t prefer his own changes by using <tt class="docutils literal"><span class="pre">internal:local</span></tt>. He’s avoiding a <a class="reference internal" href="#bug">bug</a> in <tt class="docutils literal"><span class="pre">evolve</span></tt> that occurs when evolving divergent changesets using <tt class="docutils literal"><span class="pre">internal:local</span></tt>.)
+ </p>
+ <p>
+ # XXX this link does not work .. <span class="target" id="bug">bug</span>: <a class="reference external" href="https://bitbucket.org/marmoute/mutable-history/issue/48/">https://bitbucket.org/marmoute/mutable-history/issue/48/</a>
+ </p>
+ <p>
+ ** STOP HERE: WORK IN PROGRESS **
+ </p>
+ </div>
+ <div class="section" id="phase-divergence-when-a-rewritten-changeset-is-made-public">
+ <h3>
+ <a class="toc-backref" href="#id18">Phase-divergence: when a rewritten changeset is made public</a><a class="headerlink" href="#phase-divergence-when-a-rewritten-changeset-is-made-public" title="Permalink to this headline">¶</a>
+ </h3>
+ <p>
+ If Alice and Bob are collaborating on some mutable changesets, it’s possible to get into a situation where an otherwise worthwhile changeset cannot be pushed to the public repository; it is <em>phase-divergent</em> with another changeset that was made public first. Let’s demonstrate one way this could happen.
+ </p>
+ <p>
+ It starts with Alice committing a bug fix. Right now, we don’t yet know if this bug fix is good enough to push to the public repository, but it’s good enough for Alice to commit.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd alice
+$ echo 'fix' &gt; file2
+$ hg commit -A -m 'fix bug 15'
+adding file2
+</pre>
+ </div>
+ </div>
+ <p>
+ Now Bob has a bad idea: he decides to pull whatever Alice is working on and tweak her bug fix to his taste:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../bob
+$ hg pull -u ../alice
+[...]
+added 1 changesets with 1 changes to 1 files
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+$ echo 'Fix.' &gt; file2
+$ hg amend -A -m 'fix bug 15 (amended)'
+</pre>
+ </div>
+ </div>
+ <p>
+ (Note the lack of communication between Alice and Bob. Failing to communicate with your colleagues is a good way to get into trouble. Nevertheless, <tt class="docutils literal"><span class="pre">evolve</span></tt> can usually sort things out, as we will see.)
+ </p>
+ <blockquote>
+ <div>
+ [figure SG06: Bob’s repo with one amendment]
+ </div>
+ </blockquote>
+ <p>
+ After some testing, Alice realizes her bug fix is just fine as it is: no need for further polishing and amending, this changeset is ready to publish.
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../alice
+$ hg push
+[...]
+added 1 changesets with 1 changes to 1 files
+</pre>
+ </div>
+ </div>
+ <p>
+ This introduces a contradiction: in Bob’s repository, changeset 2:e011 (his copy of Alice’s fix) is obsolete, since Bob amended it. But in Alice’s repository (and the <tt class="docutils literal"><span class="pre">public</span></tt> repository), that changeset is public: it is immutable, carved in stone for all eternity. No changeset can be both obsolete and public, so Bob is in for a surprise the next time he pulls from <tt class="docutils literal"><span class="pre">public</span></tt>:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ cd ../bob
+$ hg pull -q -u
+1 new phase-divergent changesets
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 7 shows what just happened to Bob’s repository: changeset 2:e011 is now public, so it can’t be obsolete. When that changeset was obsolete, it made perfect sense for it to have a successor, namely Bob’s amendment of Alice’s fix (changeset 4:fe88). But it’s illogical for a public changeset to have a successor, so 4:fe88 is troubled: it has become <em>bumped</em>.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG07: 2:e011 now public not obsolete, 4:fe88 now bumped]
+ </div>
+ </blockquote>
+ <p>
+ As usual when there’s trouble in your repository, the solution is to evolve it:
+ </p>
+ <div class="highlight-python">
+ <div class="highlight">
+ <pre>$ hg evolve --all
+</pre>
+ </div>
+ </div>
+ <p>
+ Figure 8 illustrates Bob’s repository after evolving away the bumped changeset. Ignoring the obsolete changesets, Bob now has a nice, clean, simple history. His amendment of Alice’s bug fix lives on, as changeset 5:227d—albeit with a software-generated commit message. (Bob should probably amend that changeset to improve the commit message.) But the important thing is that his repository no longer has any troubled changesets, thanks to <tt class="docutils literal"><span class="pre">evolve</span></tt>.
+ </p>
+ <blockquote>
+ <div>
+ [figure SG08: 5:227d is new, formerly bumped changeset 4:fe88 now hidden]
+ </div>
+ </blockquote>
+ </div>
+ </div>
+ <div class="section" id="conclusion">
+ <h2>
+ <a class="toc-backref" href="#id19">Conclusion</a><a class="headerlink" href="#conclusion" title="Permalink to this headline">¶</a>
+ </h2>
+ <p>
+ Mutable history is a powerful tool. Like a sharp knife, an experienced user can do wonderful things with it, much more wonderful than with a dull knife (never mind a rusty spoon). At the same time, an inattentive or careless user can do harm to himself or others. Mercurial with <tt class="docutils literal"><span class="pre">evolve</span></tt> goes to great lengths to limit the harm you can do by trying to handle all possible types of “troubled” changesets. Nevertheless, having a first-aid kit nearby does not mean you should stop being careful with sharp knives.
+ </p>
+ <p>
+ Mutable history shared across multiple repositories by a single developer is a natural extension of this model. Once you are used to using a single sharp knife on its own, it’s pretty straightforward to chop onions and mushrooms using the same knife, or to alternate between two chopping boards with different knives.
+ </p>
+ <p>
+ Mutable history shared by multiple developers is a scary place to go. Imagine a professional kitchen full of expert chefs tossing their favourite knives back and forth, with the occasional axe or chainsaw thrown in to spice things up. If you’re confident that you <em>and your colleagues</em> can do it without losing a limb, go for it. But be sure to practice a lot first before you rely on it!
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="bottomnav">
+ <p>
+ «&#160;&#160;<a href="user-guide.html">Evolve: User Guide</a> &#160;&#160;::&#160;&#160; <a class="uplink" href="index.html">Contents</a> &#160;&#160;::&#160;&#160; <a href="concepts.html">Evolve: Concepts</a>&#160;&#160;»
+ </p>
+ </div>
+ <div class="footer">
+ © Copyright 2010-2014, Pierre-Yves David, Greg Ward, and contributors. Last updated on Sep 21, 2017. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
+ </div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-metadata.json
new file mode 100644
index 000000000..ed10c3040
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Creator Name",
+ "Direction": null,
+ "Excerpt": "Preferred description",
+ "Image": null,
+ "Title": "My title",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected.html
new file mode 100644
index 000000000..b282bddee
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/expected.html
@@ -0,0 +1,19 @@
+<article>
+ <h2>Test document title</h2>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/source.html
new file mode 100644
index 000000000..1e5c1ad7b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/metadata-content-missing/source.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Title Element</title>
+ <meta property="x:title dc:title" content="My title"/>
+ <meta property="dc:creator twitter:site_name" content="Creator Name"/>
+ <meta name="author" content="FAIL"/>
+ <meta property="og:description twitter:description"/>
+ <meta property="dc:description og:description" content="Preferred description"/>
+ </head>
+ <body>
+ <article>
+ <h1>Test document title</h1>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ </article>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json
index b0ef9465b..cf0a02b5e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/missing-paragraphs/expected-metadata.json
@@ -3,6 +3,6 @@
"Direction": null,
"Excerpt": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\n eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam\n voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet\n clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit\n amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam\n nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,\n sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.\n Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor\n sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed\n diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,\n sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.\n Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor\n sit amet.",
"Image": null,
- "Title": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\n eirmod tempor invidunt",
+ "Title": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt",
"SiteName": null
}
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html
index ba1896ea7..986406c8f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-1/expected.html
@@ -1,67 +1,96 @@
-<div id="main-content" role="main"><section id="intro"><div>
+<div role="main" id="main-content">
+ <div id="intro">
<p>It’s easier than ever to personalize Firefox and make it work the way
you do.
- <br></br>No other browser gives you so much choice and flexibility.</p>
+ <br>No other browser gives you so much choice and flexibility.</p>
<div id="flexible-top-animation">
- <p><img alt="" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/animations/flexible-top-fallback.c960365ba781.png"></img></p>
+ <p><img src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/animations/flexible-top-fallback.c960365ba781.png" alt></p>
</div>
</div>
- </section><section data-ga-label="Designed to be redesigned" id="designed"><div>
+ <div id="designed" data-ga-label="Designed to be redesigned">
<div id="designed-copy">
- <h2>Designed to <br></br>be redesigned</h2>
+ <h2>Designed to <br>be redesigned</h2>
<p>Get fast and easy access to the features you use most in the new menu.
Open the “Customize” panel to add, move or remove any button you want.
Keep your favorite features — add-ons, private browsing, Sync and more
— one quick click away.</p>
- <p><img alt="" data-high-res="true" data-high-res-src="//mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned-high-res.6efd60766484.png" data-processed="false" data-src="//mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned.fbd3ee9402e6.png" id="designed-mobile" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned.fbd3ee9402e6.png"></img></p></div>
+ <p><img class src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned.fbd3ee9402e6.png" alt id="designed-mobile" data-src="//mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned.fbd3ee9402e6.png" data-high-res-src="//mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/designed-redesigned-high-res.6efd60766484.png">
+ </p></div>
<div id="flexible-bottom-animation">
- <p><img alt="" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/animations/flexible-bottom-fallback.cafd48a3d0a4.png"></img></p>
+ <p><img src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/animations/flexible-bottom-fallback.cafd48a3d0a4.png" alt></p>
</div>
</div>
- </section><section data-ga-label="More ways to customize" id="customize">
- </section><div id="customizers-wrapper">
- <section aria-labelledby="customize-themes" id="themes" role="tabpanel"><div>
+ <div id="customize" data-ga-label="More ways to customize">
+ <h2>More ways to customize</h2>
+
+ <ul id="customizer-list" role="tablist">
+ <li> <a id="customize-themes" href="#themes">
+
+ Themes
+ </a>
+
+ </li>
+ <li> <a id="customize-addons" href="#add-ons">
+
+ Add-ons
+ </a>
+
+ </li>
+ <li> <a id="customize-awesomebar" href="#awesome-bar">
+
+ Awesome Bar
+ </a>
+
+ </li>
+ </ul>
+ </div>
+ <div id="customizers-wrapper">
+ <div id="themes" role="tabpanel" aria-labelledby="customize-themes">
<div>
<h3>Themes</h3>
<p>Make Firefox match your style. Choose from thousands of themes and dress
up your browser with a single click.</p>
- <p><a href="https://addons.mozilla.org/firefox/themes/" rel="external">Try it now</a>
+ <p><a rel="external" href="https://addons.mozilla.org/firefox/themes/">Try it now</a>
- <br></br><a href="https://support.mozilla.org/kb/use-themes-change-look-of-firefox" rel="external">Learn more</a>
+ <br> <a rel="external" href="https://support.mozilla.org/kb/use-themes-change-look-of-firefox">Learn more</a>
- </p></div> <p><a href="#add-ons" role="button">Next</a></p><p><img alt="Preview of the currently selected theme" id="theme-demo" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/theme-red.61611c5734ab.png"></img></p>
+ </p></div> <p><a href="#add-ons" role="button">Next</a></p><p><img id="theme-demo" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/theme-red.61611c5734ab.png" alt="Preview of the currently selected theme">
+ </p>
</div>
- </section><section aria-labelledby="customize-addons" id="add-ons" role="tabpanel"><div>
+ <div id="add-ons" role="tabpanel" aria-labelledby="customize-addons">
<div>
<h3>Add-ons</h3>
<p><a href="#awesome-bar" role="button">Next</a></p><p>Add-ons are like apps that you install to add features to Firefox. They
let you compare prices, check the weather, listen to music, send a tweet
and more.</p>
- <ul><li>Read the latest news &amp; blogs</li>
+ <ul>
+ <li>Read the latest news &amp; blogs</li>
<li>Manage your downloads</li>
<li>Watch videos &amp; view photos</li>
- </ul><p><a href="https://addons.mozilla.org/firefox/extensions/?sort=featured" rel="external">Here are a few of our favorites</a>
+ </ul> <p><a rel="external" href="https://addons.mozilla.org/firefox/extensions/?sort=featured">Here are a few of our favorites</a>
- <br></br><a href="https://support.mozilla.org/kb/find-and-install-add-ons-add-features-to-firefox" rel="external">Learn more</a>
+ <br> <a rel="external" href="https://support.mozilla.org/kb/find-and-install-add-ons-add-features-to-firefox">Learn more</a>
</p></div>
- <p><img alt="" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/add-ons.63a4b761f822.png"></img></p>
+ <p><img src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/add-ons.63a4b761f822.png" alt>
+ </p>
</div>
- </section><section aria-labelledby="customize-awesomebar" id="awesome-bar" role="tabpanel"><div>
+ <div id="awesome-bar" role="tabpanel" aria-labelledby="customize-awesomebar">
<div>
<h3>Awesome Bar</h3>
<p><a href="#themes" role="button">Next</a></p><p>The Awesome Bar learns as you browse to make your version of Firefox unique.
Find and return to your favorite sites without having to remember a URL.</p>
- <p><a href="https://support.mozilla.org/kb/awesome-bar-find-your-bookmarks-history-and-tabs" rel="external">See what it can do for you</a>
+ <p><a rel="external" href="https://support.mozilla.org/kb/awesome-bar-find-your-bookmarks-history-and-tabs">See what it can do for you</a>
</p></div>
- <p><img alt="Firefox Awesome Bar" src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/awesome-bar.437df162126c.png"></img></p>
+ <p><img src="http://mozorg.cdn.mozilla.net/media/img/firefox/desktop/customize/awesome-bar.437df162126c.png" alt="Firefox Awesome Bar">
+ </p>
</div>
- </section></div>
+ </div>
+
- <section data-ga-label="Keep your Firefox in Sync" id="sync">
- </section></div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html
index 8ce4c0703..7cf3fc38e 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/mozilla-2/expected.html
@@ -1,8 +1,14 @@
-<div role="main"><section><header>
+<div role="main">
+ <section>
+ <header>
+
<p>Get to know the features that make it the most complete browser for building the Web.</p>
- </header><ul><li>
+ </header>
+ <ul>
+ <li>
<a href="https://www.youtube.com/watch?v=1R9_WdXwUsE" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-webide.16763db341cb.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-webide.16763db341cb.jpg" alt="Screenshot">
+ </a>
<h2>WebIDE</h2>
<p>Develop, deploy and debug Firefox OS apps directly in your browser, or on a Firefox OS device, with this tool that replaces App Manager.</p>
<a href="https://developer.mozilla.org/docs/Tools/WebIDE" rel="external">Learn more about WebIDE</a>
@@ -10,24 +16,32 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=eH0R10Ga4Hs" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-valence.251f9def4d8d.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-valence.251f9def4d8d.jpg" alt="Screenshot">
+ </a>
<h2>Valence</h2>
<p>Develop and debug your apps across multiple browsers and devices with this powerful extension that comes pre-installed with Firefox Developer Edition.</p>
<a href="https://developer.mozilla.org/docs/Tools/Firefox_Tools_Adapter" rel="external">Learn more about Valence</a>
</li>
- </ul><div>
+ </ul>
+ <div>
<h4>Important: Sync your new profile</h4>
<p>
Developer Edition comes with a new profile so you can run it alongside other versions of Firefox. To access your bookmarks, browsing history and more, you need to sync the profile with your existing Firefox Account, or create a new one.
<a href="https://support.mozilla.org/kb/recover-lost-bookmarks-firefox-developer-edition" rel="external">Learn more</a>
</p>
</div>
- </section><section><div>
- <header><h2>Features and tools</h2>
- </header><ul><li>
+ </section>
+
+ <div>
+ <header>
+ <h2>Features and tools</h2>
+ </header>
+ <ul>
+ <li>
<a href="https://www.youtube.com/watch?v=eQqNfkqIJdw" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-inspector.c791bf1f1a59.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-inspector.c791bf1f1a59.jpg" alt="Screenshot">
+ </a>
<h2>Page Inspector</h2>
<p>Examine the HTML and CSS of any Web page and easily modify the structure and layout of a page.</p>
<a href="https://developer.mozilla.org/docs/Tools/Page_Inspector" rel="external">Learn more about Page Inspector</a>
@@ -35,7 +49,8 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=iEDk8o9ehlw" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-console.42666aaf6d03.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-console.42666aaf6d03.jpg" alt="Screenshot">
+ </a>
<h2>Web Console</h2>
<p>See logged information associated with a Web page and use Web Console to interact with Web pages using JavaScript.</p>
<a href="https://developer.mozilla.org/docs/Tools/Web_Console" rel="external">Learn more about Web Console</a>
@@ -43,7 +58,8 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=OS4AxYFLCIE" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-debugger.02ed86fb0c9f.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-debugger.02ed86fb0c9f.jpg" alt="Screenshot">
+ </a>
<h2>JavaScript Debugger</h2>
<p>Step through JavaScript code and examine or modify its state to help track down bugs.</p>
<a href="https://developer.mozilla.org/docs/Tools/Debugger" rel="external">Learn more about JavaScript Debugger</a>
@@ -51,7 +67,8 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=w4zSG53Qlbk" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-network.740d6082b3f6.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-network.740d6082b3f6.jpg" alt="Screenshot">
+ </a>
<h2>Network Monitor</h2>
<p>See all the network requests your browser makes, how long each request takes and details of each request.</p>
<a href="https://developer.mozilla.org/docs/Tools/Network_Monitor" rel="external">Learn more about Network Monitor</a>
@@ -59,7 +76,8 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=R_qDaLQ8ghg" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-webaudio.a10ebc48d017.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-webaudio.a10ebc48d017.jpg" alt="Screenshot">
+ </a>
<h2>Web Audio Editor</h2>
<p>Inspect and interact with Web Audio API in real time to ensure that all audio nodes are connected in the way you expect.</p>
<a href="https://developer.mozilla.org/docs/Tools/Web_Audio_Editor" rel="external">Learn more about Web Audio Editor</a>
@@ -67,11 +85,13 @@
</li>
<li>
<a href="https://www.youtube.com/watch?v=3kdBvvIZIqU" rel="external">
- <img alt="Screenshot" src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-style-editor.87c5d2017506.jpg"></img></a>
+ <img src="http://mozorg.cdn.mozilla.net/media/img/firefox/firstrun/dev/feature-style-editor.87c5d2017506.jpg" alt="Screenshot">
+ </a>
<h2>Style Editor</h2>
<p>View and edit CSS styles associated with a Web page, create new ones and apply existing CSS stylesheets to any page.</p>
<a href="https://developer.mozilla.org/docs/Tools/Style_Editor" rel="external">Learn more about Style Editor</a>
</li>
- </ul></div>
- </section></div> \ No newline at end of file
+ </ul>
+ </div>
+</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html
index 3ed4d696c..77570113d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/msn/expected.html
@@ -1,7 +1,10 @@
-<article data-aop="article" itemscope="" itemtype="http://schema.org/NewsArticle"><section data-aop="articlebody" itemprop="articleBody"><p>
+<article itemscope itemtype="http://schema.org/NewsArticle" data-aop="article">
+ <section itemprop="articleBody" data-aop="articlebody">
+ <p>
<span data-aop="image">
-<span data-attrib="Provided by Business Insider Inc" data-caption="&lt;span style=&quot;font-size:13px;&quot;>Nintendo/Apple&lt;/span>" data-id="55" data-m="{&quot;i&quot;:55,&quot;p&quot;:52,&quot;n&quot;:&quot;openModal&quot;,&quot;t&quot;:&quot;articleImages&quot;,&quot;o&quot;:3}">
- <img alt="&lt;span style=&quot;font-size:13px;&quot;>Nintendo/Apple&lt;/span>" data-initial-set="true" data-src="{&quot;default&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;73&quot;,&quot;h&quot;:&quot;41&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=410&amp;w=728&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size3column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size2column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;}}" src="http://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=820&amp;w=1456&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540"></img></span>
+<span data-attrib="Provided by Business Insider Inc" data-caption="<span style=&quot;font-size:13px;&quot;>Nintendo/Apple</span>" data-id="55" data-m="{&quot;i&quot;:55,&quot;p&quot;:52,&quot;n&quot;:&quot;openModal&quot;,&quot;t&quot;:&quot;articleImages&quot;,&quot;o&quot;:3}">
+ <img alt="<span style=&quot;font-size:13px;&quot;>Nintendo/Apple</span>" data-src="{&quot;default&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;73&quot;,&quot;h&quot;:&quot;41&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=410&amp;w=728&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size3column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size2column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;}}" src="http://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=820&amp;w=1456&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540" data-initial-set="true">
+</span>
<span>
<span>© Provided by Business Insider Inc</span>
<span>Nintendo/Apple</span>
@@ -13,6 +16,7 @@
<p>The name and basic idea might sound like one of those endless score attack games like "Temple Run," but that's not the case. "Super Mario Run" is divided into hand-crafted levels with a clear end-point like any other Mario game, meaning you're essentially getting the Mario experience for $10 without needing to control his movement.</p>
<p>$10 might seem like a bit much compared to the $0 people pay for most mobile games, but it's possible the game has $10 worth of levels to play in it. It's also not iPhone exclusive, but the Android version will launch at a later, currently unknown date. </p>
<p>To see "Super Mario Run" in action, check out the footage below:</p>
- <p><iframe allowfullscreen="" frameborder="0" height="450" src="https://www.youtube.com/embed/E39ychZKnDI" width="100%"></iframe></p>
+ <p><iframe allowfullscreen src="https://www.youtube.com/embed/E39ychZKnDI" frameborder="0" width="100%" height="450"></iframe></p>
- </section></article> \ No newline at end of file
+ </section>
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-metadata.json
new file mode 100644
index 000000000..59c9941eb
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Lorem\n ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n\ttab here\n incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
+ "Image": null,
+ "Title": "Normalize space test",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected.html
new file mode 100644
index 000000000..18739c3f9
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/expected.html
@@ -0,0 +1,26 @@
+<article>
+ <h2>Lorem</h2>
+ <p>
+ Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tab here
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ <h2>Foo</h2>
+ <p>
+ Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation
+
+
+
+
+ ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </p>
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/source.html
new file mode 100644
index 000000000..b23079824
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/normalize-spaces/source.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Normalize space test</title>
+</head>
+<body>
+ <article>
+ <h1>Lorem</h1>
+ <div>
+ Lorem
+ ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tab here
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </div>
+ <h2>Foo</h2>
+ <div>
+ Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation
+
+
+
+
+ ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </div>
+ </article>
+</body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json
index c89c43ca2..077eb6014 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-images.json
@@ -1,4 +1,4 @@
[
- "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-videoSixteenByNineJumbo1600.jpg",
+ "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-facebookJumbo.jpg",
"https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-master768.jpg"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json
index 36da83868..724e18ade 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected-metadata.json
@@ -2,7 +2,7 @@
"Author": "Jeffrey Gettleman",
"Direction": null,
"Excerpt": "For the first time since the 1990s, the country will be able to trade extensively with the United States.",
- "Image": "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-videoSixteenByNineJumbo1600.jpg",
+ "Image": "https:\/\/static01.nyt.com\/images\/2017\/01\/14\/world\/13SUDAN-1\/13SUDAN-1-facebookJumbo.jpg",
"Title": "United States to Lift Sudan Sanctions",
"SiteName": null
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html
index 60f7148bc..415165947 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-1/expected.html
@@ -1,13 +1,32 @@
-<div>
- <div>
- <figure aria-label="media" data-media-action="modal" id="media-100000004869232" itemid="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg" itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" role="group"><span>Photo</span>
+<div id="page">
+
+
+ <main id="main" role="main">
+ <article id="story">
+
+
+
+
+
+
+
+
+
+ <div>
+ <figure id="media-100000004869232" data-media-action="modal" itemprop="associatedMedia" itemscope itemid="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg" itemtype="http://schema.org/ImageObject" aria-label="media" role="group">
+ <span>Photo</span>
<div>
- <p><img alt="" data-mediaviewer-caption="United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents." data-mediaviewer-credit="Ashraf Shazly/Agence France-Presse — Getty Images" data-mediaviewer-src="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-superJumbo.jpg" itemid="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg" itemprop="url" src="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg"></img></p>
- <meta content="512" itemprop="height"></meta><meta content="768" itemprop="width"></meta></div>
- <figcaption itemprop="caption description"><span>United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents.</span>
+ <p><img src="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg" alt data-mediaviewer-src="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-superJumbo.jpg" data-mediaviewer-caption="United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents." data-mediaviewer-credit="Ashraf Shazly/Agence France-Presse — Getty Images" itemprop="url" itemid="https://static01.nyt.com/images/2017/01/14/world/13SUDAN-1/13SUDAN-1-master768.jpg"></p>
+ <meta itemprop="height" content="512">
+ <meta itemprop="width" content="768">
+ </div>
+ <figcaption itemprop="caption description">
+ <span>United Nations peacekeepers at a refugee camp in Sudan on Monday. In exchange for the lifting of United States trade sanctions, Sudan has said it will improve access for aid groups, stop supporting rebels in neighboring South Sudan and cooperate with American intelligence agents.</span>
<span itemprop="copyrightHolder">
<span>Credit</span> Ashraf Shazly/Agence France-Presse — Getty Images </span>
- </figcaption></figure><p data-para-count="194" data-total-count="194">LONDON — After nearly 20 years of hostile relations, the American government plans to reverse its position on <a href="http://topics.nytimes.com/top/news/international/countriesandterritories/sudan/index.html?inline=nyt-geo" title="More news and information about Sudan.">Sudan</a> and lift trade sanctions, Obama administration officials said late Thursday.</p>
+ </figcaption>
+ </figure>
+ <p data-para-count="194" data-total-count="194">LONDON — After nearly 20 years of hostile relations, the American government plans to reverse its position on <a href="http://topics.nytimes.com/top/news/international/countriesandterritories/sudan/index.html?inline=nyt-geo" title="More news and information about Sudan.">Sudan</a> and lift trade sanctions, Obama administration officials said late Thursday.</p>
<p data-para-count="250" data-total-count="444">Sudan is one of the poorest, most isolated and most violent countries in Africa, and for years the United States has imposed punitive measures against it in a largely unsuccessful attempt to get the Sudanese government to stop killing its own people.</p>
<p data-para-count="293" data-total-count="737">On Friday, the Obama administration will announce a new Sudan strategy. For the first time since the 1990s, the nation will be able to trade extensively with the United States, allowing it to buy goods like tractors and spare parts and attract much-needed investment in its collapsing economy.</p>
<p data-para-count="193" data-total-count="930">In return, Sudan will improve access for aid groups, stop supporting rebels in neighboring <a href="http://topics.nytimes.com/top/news/international/countriesandterritories/south-sudan/index.html?inline=nyt-geo" title="More articles about South Sudan.">South Sudan</a>, cease the bombing of insurgent territory and cooperate with American intelligence agents.</p>
@@ -28,10 +47,29 @@
<p data-para-count="250" data-total-count="4223">“There is no reason to believe the guys in charge have changed their stripes,” said Mr. Reeves, a senior fellow at the François-Xavier Bagnoud Center for Health and Human Rights at Harvard University. “These guys are the worst of the worst.”</p>
<p data-para-count="208" data-total-count="4431">Obama administration officials said that they had briefed President-elect Donald J. Trump’s transition team, but that they did not know if Mr. Trump would stick with a policy of warmer relations with Sudan.</p>
<p data-para-count="143" data-total-count="4574">They said that Sudan had a long way to go in terms of respecting human rights, but that better relations could help increase American leverage.</p>
- <p data-node-uid="1" data-para-count="149" data-total-count="4723">Mr. Reeves said he thought that the American government was being manipulated and that the Obama administration had made a “deal with the devil.”</p>
+ <p data-para-count="149" data-total-count="4723" data-node-uid="1">Mr. Reeves said he thought that the American government was being manipulated and that the Obama administration had made a “deal with the devil.”</p>
+
<p><a href="#whats-next">Continue reading the main story</a>
</p></div>
-
-
-
- </div> \ No newline at end of file
+
+
+
+
+
+
+
+ </article>
+
+
+
+
+
+
+
+ </main>
+
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json
index e4b49d00e..1afbadf84 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-images.json
@@ -1,4 +1,4 @@
[
- "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-videoSixteenByNineJumbo1600.jpg",
- "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-master315.jpg"
+ "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-facebookJumbo.jpg",
+ "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-master315.jpg"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json
index 7fbcf29ee..21af4ee0d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected-metadata.json
@@ -1,8 +1,8 @@
{
"Author": "Steven Davidoff Solomon",
"Direction": null,
- "Excerpt": "The internet giant’s decision to sell its business is plagued with challenges that reveal how unusual deal structures can affect shareholders.",
- "Image": "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-videoSixteenByNineJumbo1600.jpg",
- "Title": "Yahoo’s Sale to Verizon Leaves Shareholders With Little Say",
+ "Excerpt": "The internet giant\u2019s decision to sell its business is plagued with challenges that reveal how unusual deal structures can affect shareholders.",
+ "Image": "https:\/\/static01.nyt.com\/images\/2016\/07\/30\/business\/db-dealprof\/db-dealprof-facebookJumbo.jpg",
+ "Title": "Yahoo\u2019s Sale to Verizon Leaves Shareholders With Little Say",
"SiteName": null
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html
index 1584ca437..168bd3bc5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-2/expected.html
@@ -1,21 +1,43 @@
-<div>
- <div>
- <figure aria-label="media" data-media-action="modal" id="media-100000004560166" itemid="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg" itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" role="group"><span>Photo</span>
+<div id="page" xmlns:xlink="http://www.w3.org/1999/xlink">
+
+
+ <main id="main" role="main">
+ <article id="story">
+
+
+
+
+
+
+
+
+
+
+
+ <div>
+ <figure id="media-100000004560166" data-media-action="modal" itemprop="associatedMedia" itemscope itemid="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg" itemtype="http://schema.org/ImageObject" aria-label="media" role="group">
+ <span>Photo</span>
<div>
- <p><img alt="" data-mediaviewer-caption="" data-mediaviewer-credit="Harry Campbell" data-mediaviewer-src="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-superJumbo.jpg" itemid="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg" itemprop="url" src="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg"></img></p>
- <meta content="315" itemprop="height"></meta><meta content="315" itemprop="width"></meta></div>
- <figcaption itemprop="caption description"><span itemprop="copyrightHolder">
+ <p><img src="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg" alt data-mediaviewer-src="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-superJumbo.jpg" data-mediaviewer-caption data-mediaviewer-credit="Harry Campbell" itemprop="url" itemid="https://static01.nyt.com/images/2016/07/30/business/db-dealprof/db-dealprof-master315.jpg"></p>
+ <meta itemprop="height" content="315">
+ <meta itemprop="width" content="315">
+ </div>
+ <figcaption itemprop="caption description">
+ <span itemprop="copyrightHolder">
<span>Credit</span> Harry Campbell </span>
- </figcaption></figure><p data-para-count="148" data-total-count="148"><a href="http://www.nytimes.com/topic/company/yahoo-inc?inline=nyt-org" title="More information about Yahoo! Inc.">Yahoo</a>’s $4.8 billion sale to <a href="http://www.nytimes.com/topic/company/verizon-communications-inc?inline=nyt-org" title="More information about Verizon Communications Inc.">Verizon</a> is a complicated beast, showing how different acquisition structures can affect how shareholders are treated.</p>
+ </figcaption>
+ </figure>
+ <p data-para-count="148" data-total-count="148"><a href="http://www.nytimes.com/topic/company/yahoo-inc?inline=nyt-org" title="More information about Yahoo! Inc.">Yahoo</a>’s $4.8 billion sale to <a href="http://www.nytimes.com/topic/company/verizon-communications-inc?inline=nyt-org" title="More information about Verizon Communications Inc.">Verizon</a> is a complicated beast, showing how different acquisition structures can affect how shareholders are treated.</p>
<p data-para-count="177" data-total-count="325">First, let’s say what the Yahoo sale is not. It is not a sale of the publicly traded company. Instead, it is a sale of the Yahoo subsidiary and some related assets to Verizon.</p>
<p data-para-count="529" data-total-count="854">The sale is being done in two steps. The <a href="https://www.sec.gov/Archives/edgar/data/1011006/000119312516656036/d178500dex22.htm">first step</a> will be the transfer of any assets related to Yahoo business to a singular subsidiary. This includes the stock in the business subsidiaries that make up Yahoo that are not already in the single subsidiary, as well as the odd assets like benefit plan rights. This is what is being sold to Verizon. A license of Yahoo’s oldest patents is being held back in the so-called Excalibur portfolio. This will stay with Yahoo, as will Yahoo’s stakes in Alibaba Group and Yahoo Japan.</p>
<p data-para-count="479" data-total-count="1333">It is hard to overestimate how complex an asset sale like this is. Some of the assets are self-contained, but they must be gathered up and transferred. Employees need to be shuffled around and compensation arrangements redone. Many contracts, like the now-infamous one struck with the search engine Mozilla, which <a href="http://www.recode.net/2016/7/7/12116296/marissa-mayer-deal-mozilla-yahoo-payment">may result in a payment of up to a $1 billion</a>, will contain change-of-control provisions that will be set off and have to be addressed. Tax issues always loom large.</p> <p><a href="#story-continues-1">Continue reading the main story</a>
</p></div>
-
-
-
- </div><div>
- <div>
+
+ <div id="story-continues-1">
+
+ <p><a href="#story-continues-2">Continue reading the main story</a></p>
+ </div>
+ <div>
<p data-para-count="602" data-total-count="1935" id="story-continues-2">In the second step, at the closing, <a href="https://www.sec.gov/Archives/edgar/data/1011006/000119312516656036/d178500dex22.htm">Yahoo will sell the stock</a> in the single subsidiary to Verizon. At that point, Yahoo will change its name to something without “Yahoo” in it. My favorite is simply Remain Co., the name Yahoo executives are using. Remain Co. will become a holding company for the Alibaba and Yahoo Japan stock. Included will also be $10 billion in cash, plus the Excalibur patent portfolio and a number of minority investments including Snapchat. Ahh, if only Yahoo had bought Snapchat instead of Tumblr (indeed, if only Yahoo had bought Google or Facebook when it had the chance).</p>
<p data-para-count="262" data-total-count="2197" id="story-continues-3">Because it is a sale of a subsidiary, the $4.8 billion will be paid to Yahoo. Its shareholders will not receive any money unless Yahoo pays it out in a dividend (after paying taxes). Instead, Yahoo shareholders will be left holding shares in the renamed company.</p>
@@ -35,7 +57,25 @@
<p data-para-count="450" data-total-count="6404">Finally, if another bidder still wants to acquire Yahoo, it has time. The agreement with Verizon allows Yahoo to terminate the deal and accept a superior offer by paying a $144 million breakup fee to Verizon. And if Yahoo shareholders change their minds and want to stick with Yahoo’s chief executive, <a href="http://topics.nytimes.com/top/reference/timestopics/people/m/marissa_mayer/index.html?inline=nyt-per" title="More articles about Marissa Mayer.">Marissa Mayer</a>, and vote down the deal, there is a so-called naked no-vote termination fee of $15 million payable to Verizon to reimburse expenses.</p>
<p data-para-count="426" data-total-count="6830">All in all, this was as hairy a deal as they come. There was the procedural and logistical complications of selling a company when the chief executive wanted to stay. Then there was the fact that this was an asset sale, including all of the challenges that go with it. Throw in all of the tax issues and the fact that this is a public company, and it is likely that the lawyers involved will have nightmares for years to come.</p> <p><a href="#whats-next">Continue reading the main story</a>
</p></div>
-
-
-
- </div> \ No newline at end of file
+
+
+
+
+
+
+
+ </article>
+
+
+
+
+
+
+
+ </main>
+
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-images.json
new file mode 100644
index 000000000..93da552c4
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-images.json
@@ -0,0 +1,11 @@
+[
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/21\/nyregion\/21winterutilities1\/00winterutilities1-facebookJumbo.jpg",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/21\/nyregion\/21winterutilities1\/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=75&auto=webp&disable=upscale",
+ "https:\/\/static01.nyt.com\/images\/2018\/02\/20\/multimedia\/author-corey-kilgannon\/author-corey-kilgannon-thumbLarge.jpg",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/21\/nyregion\/21winterutilitiesOAK15\/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=75&auto=webp&disable=upscale",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/15\/nyregion\/00winterutilitiesOAK11\/merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg?quality=90&auto=webp",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/21\/nyregion\/21winterutilitiesOAK13\/merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg?quality=90&auto=webp",
+ "https:\/\/static01.nyt.com\/images\/2017\/12\/07\/nyregion\/00winter4\/00winter4-articleLarge.jpg?quality=90&auto=webp",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/15\/nyregion\/00winterutilitiesOAK12\/merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg?quality=90&auto=webp",
+ "https:\/\/static01.nyt.com\/images\/2019\/02\/12\/nyregion\/00winterutilities2\/merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg?quality=90&auto=webp"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-metadata.json
new file mode 100644
index 000000000..3d9b539ce
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "By Corey Kilgannon",
+ "Direction": null,
+ "Excerpt": "New York\u2019s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and \u201cfreeze-thaw\u201d cycles of winter make it even worse.",
+ "Image": "https:\/\/static01.nyt.com\/images\/2019\/02\/21\/nyregion\/21winterutilities1\/00winterutilities1-facebookJumbo.jpg",
+ "Title": "Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What\u2019s Underneath N.Y.C.",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected.html
new file mode 100644
index 000000000..a8a9bc341
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/expected.html
@@ -0,0 +1,267 @@
+<article id="story">
+
+ <header>
+
+
+ <p>
+ New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse.
+ </p>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemscope="itemscope" itemprop="associatedMedia" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <p><span>Image</span><img alt src="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 80vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale">
+ </p>
+ <figcaption itemprop="caption description">
+ <span>A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground.</span><span itemprop="copyrightHolder"><span>Credit</span><span><span>Credit</span><span>Chang W. Lee/The New York Times</span></span></span>
+ </figcaption>
+ </figure>
+ </div>
+ <div>
+ <div>
+ <p><a href="https://www.nytimes.com/by/corey-kilgannon"><img alt="Corey Kilgannon" title="Corey Kilgannon" src="https://static01.nyt.com/images/2018/02/20/multimedia/author-corey-kilgannon/author-corey-kilgannon-thumbLarge.jpg"></a>
+ </p>
+
+ </div>
+ <ul>
+ <li>
+ <time datetime="2019-02-21">Feb. 21, 2019</time>
+ </li>
+ <li>
+
+ </li>
+ </ul>
+ </div>
+ </header>
+ <section name="articleBody" itemprop="articleBody">
+ <div>
+ <p>
+ <em>[What you need to know to start the day:</em> <a href="https://www.nytimes.com/newsletters/newyorktoday?module=inline" title><em>Get New York Today in your inbox</em></a><em>.]</em>
+ </p>
+ <p>
+ A series of recent <a href="https://nypost.com/2019/02/17/manhole-fires-force-theater-evacuations-in-midtown/" title rel="noopener noreferrer" target="_blank">manhole fires</a> in the heart of Manhattan forced the evacuation of several theaters and was a stark reminder that the subway is not the only creaky infrastructure beneath the streets of New York City.
+ </p>
+ <p>
+ Underground lies a chaotic assemblage of utilities that, much like the subway, are lifelines for the city: a sprawling tangle of water mains, power cables, gas and steam lines, telecom wires and sewers.
+ </p>
+ <p>
+ The city has one of the oldest and largest networks of subterranean infrastructure in the world, with some portions dating more than a century and prone to leaks and cracks.
+ </p>
+ <p>
+ And winter — from the corrosive rock salt used on streets and sidewalks to “freeze-thaw” cycles that weaken pipes — makes infrastructure problems even worse.
+ </p>
+ </div>
+ <div>
+ <p>
+ In the late 1800s, many of the city’s overhead utilities were buried to lessen the exposure to winter weather. “People think it’s all protected and safe, but it’s really not,” said Patrick McHugh, vice president of electrical engineering and planning for Con Edison, which maintains about 90,000 miles of underground cable in the city.
+ </p>
+ <p>
+ “You have water, sewage, electricity and gas down there, and people don’t appreciate the effort that goes into keeping all that working,” he added.
+ </p>
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <p><span>Image</span><img alt src="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-superJumbo.jpg?quality=90&amp;auto=webp 2000w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 80vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale">
+ </p>
+ <figcaption itemprop="caption description">
+ <span>In the late 1800s, overhead utilities were buried to lessen the exposure to winter weather.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Kirsten Luce for The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ <div>
+ <h2 id="link-32de4094">
+ Rock salt on icy streets can cause mayhem below them
+ </h2>
+ <p>
+ When rock salt melts ice, and the water seeps down manholes and into electrical units, it can set off fires and explosions strong enough to pop a 300-pound manhole cover five stories into the air.
+ </p>
+ <p>
+ For days after a storm, Con Edison officials say, they often deal with scores of electrical fires caused by the rock salt eating away at electrical cable insulation. The wet salt can create sparking that burns the insulation, producing both fire and gases that can combust and pop the manhole lids.
+ </p>
+ <p>
+ To alleviate the threat, the officials said, the utility switched most of its manhole covers to vented ones that allow gases to escape, “so they cannot form a combustible amount,” Mr. McHugh said.
+ </p>
+ </div>
+ <div>
+ <p>
+ “It also lets smoke escape, which can tip off the public to notify the authorities,” he added.
+ </p>
+ <p>
+ Winter can also bring an increase in gas-line breakages. Con Edison, which maintains 4,300 miles of gas mains in and around New York City, records about 500 leaks — most of them nonemergencies — in a typical month, but many more in winter.
+ </p>
+ <p>
+ Even this past January, which was unseasonably mild, there were 750 leaks, Con Edison officials said.
+ </p>
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK11/merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div>
+ <p><span>Image</span></p>
+ </div>
+ <figcaption itemprop="caption description">
+ <span>There are typically between 400 and 600 water main breaks each year in New York City, an official said.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Michael Appleton for The New York Times</span></span>
+ </figcaption>
+ <img src="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK11/merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg?quality=90&amp;auto=webp"></figure>
+ </div>
+ <div>
+ <h2 id="link-470a509">
+ ‘Freeze-thaws’ linked to climate change can imperil utilities
+ </h2>
+ <p>
+ The extreme temperature swings that many researchers link to climate change are adding to the challenges of winter.
+ </p>
+ <p>
+ Officials monitor weather forecasts closely for freeze-thaw cycles, when they put extra repair crews on call.
+ </p>
+ <p>
+ During a polar vortex in late January, for instance, single-digit temperatures in the city quickly ballooned into the 50s. The thaw, much welcomed by many New Yorkers, worried Tasos Georgelis, deputy commissioner for water and sewer operations at the Department of Environmental Protection, which operates the city’s <a href="https://www.nytimes.com/interactive/2016/03/24/nyregion/how-nyc-gets-its-water-new-york-101.html?action=click&amp;contentCollection=New%20York&amp;region=Footer&amp;module=inline&amp;version=WhatsNext&amp;contentID=WhatsNext&amp;moduleDetail=undefined&amp;pgtype=Multimedia" title>water system</a>.
+ </p>
+ <p>
+ “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” Mr. Georgelis said.
+ </p>
+ <p>
+ Along the city’s roughly 6,500 miles of water mains, there are typically between 400 and 600 breaks a year, he added. The majority occur in winter, when the cold can make older cast-iron mains brittle.
+ </p>
+ </div>
+ <div>
+ <p>
+ Environmental Protection officials said the department repaired 75 water-main breaks in January, including one in Lower Manhattan that disrupted rush-hour subway service and another on the West Side that snarled traffic and left nearby buildings without water for hours.
+ </p>
+ <p>
+ The city’s 7,500 miles of sewer lines are less affected by cold weather because they are generally buried deeper than other utilities, below the frost line, agency officials said.
+ </p>
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK13/merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div>
+ <p><span>Image</span></p>
+ </div>
+ <figcaption itemprop="caption description">
+ <span>In 1978, a water main break caused severe flooding in Bushwick, Brooklyn.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Fred R. Conrad/The New York Times</span></span>
+ </figcaption>
+ <img src="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK13/merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg?quality=90&amp;auto=webp"></figure>
+ </div>
+ <div>
+ <h2 id="link-4c678ca">
+ How to replace century-old utilities: slowly, and carefully
+ </h2>
+ <p>
+ Upgrading the city’s below-street utilities is a slow, painstaking process, “because you have such a fixed-in-place system,” said Rae Zimmerman, a research professor of planning and public administration at New York University.
+ </p>
+ <p>
+ But there is progress. Con Edison officials said they had begun replacing the city’s nearly 1,600 miles of natural gas lines — which were made of either cast iron or unprotected steel — with plastic piping. The plastic is less susceptible to corrosion, cracks and leaks, said the officials, who added that they were swapping about 100 miles of line each year.
+ </p>
+ <p>
+ The city is also replacing older, leak-prone water and sewer mains.
+ </p>
+ <p>
+ Some pipes that are more than a century old hold up because they were built with a thicker grade of cast iron, according to Environmental Protection Department officials. For less healthy ones, the agency has invested more than $1 billion in the past five years — with an additional $1.4 billion budgeted over the next five years — for upgrades and replacements. New pipes will be made of a more durable, graphite-rich cast iron known as ductile iron.
+ </p>
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2017/12/07/nyregion/00winter4/00winter4-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div>
+ <p><span>Image</span></p>
+ </div>
+ <figcaption itemprop="caption description">
+ <span>Matt Cruz snowboarded through Manhattan’s Lower East Side after a snowstorm in 2016 left the streets coated in slush and rock salt.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Hiroko Masuike/The New York Times</span></span>
+ </figcaption>
+ <img src="https://static01.nyt.com/images/2017/12/07/nyregion/00winter4/00winter4-articleLarge.jpg?quality=90&amp;auto=webp"></figure>
+ </div>
+ <div>
+ <h2 id="link-132c3a6b">
+ Construction during the winter isn’t always a good idea
+ </h2>
+ <p>
+ Of course, winter also poses problems aboveground. Most nonemergency repair and construction work involving concrete is halted because concrete and some types of dirt, used to fill in trenches, freeze in colder temperatures, said Ian Michaels, a spokesman for the city’s Department of Design and Construction.
+ </p>
+ <p>
+ Digging by hand is also a challenge in frozen ground, so many excavations that are close to pipes and other utilities are put off, Mr. Michaels said.
+ </p>
+ </div>
+ <div>
+ <p>
+ And asphalt is harder to obtain because it must be kept and transported at high temperatures, he added.
+ </p>
+ <p>
+ In the extreme cold, city officials will not risk shutting down water mains for construction because spillage into the street could freeze, Mr. Michaels said. He added that stopping the water flow could freeze the private water-service connections that branch off the mains, he said.
+ </p>
+ <p>
+ Even the basic task of locating utilities under the street can be complicated because infrastructure has been added piecemeal over the decades.
+ </p>
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK12/merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div>
+ <p><span>Image</span></p>
+ </div>
+ <figcaption itemprop="caption description">
+ <span>A water main break in Manhattan in 2014. “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” said Tasos Georgelis of the city's Department of Environmental Protection.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Ãngel Franco/The New York Times</span></span>
+ </figcaption>
+ <img src="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK12/merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg?quality=90&amp;auto=webp"></figure>
+ </div>
+ <div>
+ <h2 id="link-7ba21106">
+ Almost 1.8 million potholes filled since de Blasio took office
+ </h2>
+ <p>
+ Street surfaces are affected by winter weather, too: Last year, the city filled 255,904 potholes.
+ </p>
+ <p>
+ And should anyone forget that filling potholes, like snow removal, is a sacred staple of constituent services, transportation officials have compiled the number of potholes the city has filled — more than 1,786,300 — since Mayor Bill de Blasio took office in 2014.
+ </p>
+ <p>
+ Potholes form when water and salt seep into cracks, freeze and expand, creating a larger crevice, said Joe Carbone, who works for the Transportation Department, where he is known as the pothole chief.
+ </p>
+ <p>
+ Simply put, more freeze-thaw cycles <a href="https://www.nytimes.com/2011/02/07/nyregion/07pothole.html?module=inline" title>result in more potholes</a>, he said. Currently, the department has 25 crews repairing potholes. During peak pothole-repair season in early March, that number can expand to more than 60.
+ </p>
+ </div>
+ <div>
+ <p>
+ Still, the department is continually resurfacing the city’s more than 6,000 miles of streets and 19,000 lane miles. Each year, agency officials said, it uses more than one million tons of asphalt to repave more than 1,300 lane-miles of street.
+ </p>
+
+ </div>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/12/nyregion/00winterutilities2/merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div>
+ <p><span>Image</span></p>
+ </div>
+ <figcaption itemprop="caption description">
+ <span>Workers learning how to fix water main breaks at a training center in Queens.</span><span itemprop="copyrightHolder"><span>Credit</span><span>Chang W. Lee/The New York Times</span></span>
+ </figcaption>
+ <img src="https://static01.nyt.com/images/2019/02/12/nyregion/00winterutilities2/merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg?quality=90&amp;auto=webp"></figure>
+ </div>
+ <div>
+ <h2 id="link-13d0a396">
+ So, where do people learn how to fix some of these issues?
+ </h2>
+ <p>
+ Of the 400 city laborers who work on water mains, many learn the finer points of leak repair at a training center in Queens, where underground pipes are made to spring leaks for repair drills.
+ </p>
+ <p>
+ Workers from the Department of Environmental Protection recently gathered around a muddy hole as a co-worker, Nehemiah Dejesus, scrambled to apply a stainless-steel repair clamp around a cracked segment that was spewing water.
+ </p>
+ <p>
+ “Don’t get nervous,” instructed Milton Velez, the agency’s district supervisor for Queens.
+ </p>
+ <p>
+ “I’m not,” Mr. Dejesus said as he secured the clamp and stopped the leak. “It’s ‘Showtime at the Apollo.’”
+ </p>
+ </div>
+
+
+ </section>
+ <div>
+
+ <div>
+ <p>
+ Corey Kilgannon is a Metro reporter covering news and human interest stories. His writes the <a href="https://www.nytimes.com/column/character-study">Character Study</a> column in the Sunday Metropolitan section. He was also part of the team that won the 2009 Pulitzer Prize for Breaking News. <span><a href="https://twitter.com/coreykilgannon" rel="noopener noreferrer" target="_blank"><span>@</span>coreykilgannon</a> <span>•</span> <a href="https://www.facebook.com/corey.kilgannon.9" rel="noopener noreferrer" target="_blank">Facebook</a></span>
+ </p>
+ </div>
+ <div><p>
+ A version of this article appears in print on </p><p>, on Page </p><p>A</p><p>22</p><p> of the New York edition</p><p> with the headline: </p><p>Under the City’s Streets, A Battle Against Winter<span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span>
+ </p></div>
+
+ </div>
+
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/source.html
new file mode 100644
index 000000000..293657692
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-3/source.html
@@ -0,0 +1,1638 @@
+<!DOCTYPE html>
+<html lang="en" itemid="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" itemtype="http://schema.org/NewsArticle" itemscope="true" class="story" xmlns:og="http://opengraphprotocol.org/schema/" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <title data-rh="true">
+ Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C. - The New York Times
+ </title>
+ <meta data-rh="true" itemprop="inLanguage" content="en-US" />
+ <meta data-rh="true" property="article:published" itemprop="datePublished" content="2019-02-21T08:00:08.000Z" />
+ <meta data-rh="true" property="article:modified" itemprop="dateModified" content="2019-02-22T12:17:45.596Z" />
+ <meta data-rh="true" http-equiv="Content-Language" content="en" />
+ <meta data-rh="true" name="robots" content="noarchive" />
+ <meta data-rh="true" name="articleid" itemprop="identifier" content="100000006355641" />
+ <meta data-rh="true" name="nyt_uri" itemprop="identifier" content="nyt://article/d0aba0ad-4861-548c-8ff3-1d9606db5960" />
+ <meta data-rh="true" name="pubp_event_id" itemprop="identifier" content="pubp://event/b0523eccaeb445d49d2ab6d80d79d0ae" />
+ <meta data-rh="true" name="description" itemprop="description" content="New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse." />
+ <meta data-rh="true" name="image" itemprop="image" content="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/00winterutilities1-facebookJumbo.jpg" />
+ <meta data-rh="true" name="byl" content="By Corey Kilgannon" />
+ <meta data-rh="true" name="thumbnail" itemprop="thumbnailUrl" content="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/00winterutilities1-thumbStandard.jpg" />
+ <meta data-rh="true" name="news_keywords" content="Water,Winter,Infrastructure,Pothole,Manhole,Con Edison,Department of Environmental Protection NYC,Manhattan" />
+ <meta data-rh="true" name="pdate" content="20190221" />
+ <meta data-rh="true" property="og:url" content="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <meta data-rh="true" property="og:type" content="article" />
+ <meta data-rh="true" property="og:title" content="Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C." />
+ <meta data-rh="true" property="og:image" content="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/00winterutilities1-facebookJumbo.jpg" />
+ <meta data-rh="true" property="og:description" content="New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse." />
+ <meta data-rh="true" property="twitter:url" content="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <meta data-rh="true" property="twitter:title" content="Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C." />
+ <meta data-rh="true" property="twitter:description" content="New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse." />
+ <meta data-rh="true" property="twitter:image" content="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/00winterutilities1-videoSixteenByNineJumbo1600.jpg" />
+ <meta data-rh="true" property="twitter:image:alt" content="A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground." />
+ <meta data-rh="true" property="twitter:card" content="summary_large_image" />
+ <meta data-rh="true" property="article:section" itemprop="articleSection" content="New York" />
+ <meta data-rh="true" property="article:tag" content="Water" />
+ <meta data-rh="true" property="article:tag" content="Winter (Season)" />
+ <meta data-rh="true" property="article:tag" content="Infrastructure (Public Works)" />
+ <meta data-rh="true" property="article:tag" content="Potholes" />
+ <meta data-rh="true" property="article:tag" content="Manholes" />
+ <meta data-rh="true" property="article:tag" content="Consolidated Edison Inc" />
+ <meta data-rh="true" property="article:tag" content="Department of Environmental Protection (NYC)" />
+ <meta data-rh="true" property="article:tag" content="Manhattan (NYC)" />
+ <meta data-rh="true" name="CG" content="nyregion" />
+ <meta data-rh="true" name="SCG" content="" />
+ <meta data-rh="true" name="CN" content="" />
+ <meta data-rh="true" name="CT" content="" />
+ <meta data-rh="true" name="PT" content="article" />
+ <meta data-rh="true" name="PST" content="News" />
+ <meta data-rh="true" name="genre" itemprop="genre" content="News" />
+ <meta data-rh="true" name="url" itemprop="url" content="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <meta data-rh="true" name="msapplication-starturl" content="https://www.nytimes.com" />
+ <meta data-rh="true" property="al:android:url" content="nytimes://reader/id/100000006355641" />
+ <meta data-rh="true" property="al:android:package" content="com.nytimes.android" />
+ <meta data-rh="true" property="al:android:app_name" content="NYTimes" />
+ <meta data-rh="true" name="twitter:app:name:googleplay" content="NYTimes" />
+ <meta data-rh="true" name="twitter:app:id:googleplay" content="com.nytimes.android" />
+ <meta data-rh="true" name="twitter:app:url:googleplay" content="nytimes://reader/id/100000006355641" />
+ <meta data-rh="true" property="al:iphone:url" content="nytimes://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <meta data-rh="true" property="al:iphone:app_store_id" content="284862083" />
+ <meta data-rh="true" property="al:iphone:app_name" content="NYTimes" />
+ <meta data-rh="true" property="al:ipad:url" content="nytimes://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <meta data-rh="true" property="al:ipad:app_store_id" content="357066198" />
+ <meta data-rh="true" property="al:ipad:app_name" content="NYTimes" />
+ <script>
+ <![CDATA[
+
+ (function() {
+ var gqlUrl = 'https://samizdat-graphql.nytimes.com/graphql/v2';
+ try {
+ var URLparams = window.location.search.slice(1).split('&');
+ var qs = URLparams.reduce(function(acc, cur){
+ if (cur.split('=')[0] === 'ip-override'){
+ return ('?' + cur);
+ }
+ return acc;
+ }, '');
+ gqlUrl = gqlUrl + qs;
+ }
+ catch (e) {
+ console.warn(e);
+ }
+ var xhr = new XMLHttpRequest();
+ xhr.withCredentials = true;
+ xhr.open('POST', gqlUrl, true);
+ xhr.setRequestHeader('Content-Type', 'application/json');
+ xhr.setRequestHeader('nyt-app-type', 'project-vi');
+ xhr.setRequestHeader('nyt-app-version', '0.0.3');
+ xhr.setRequestHeader('nyt-token', 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYOpRoYg5X01qAqNyBDM32EI/E77nkFzd2rrVjhdi/VAZfBIrPayyYykIIN+d5GMImm3wg6CmTTkBo7ixmwd7Xv24QSDpjuX0gQ1eqxOEWZ0FHWZWkh4jfLcwqkgKmfHJuvOctEiE/Wic5Qrle323SMDKF8sAqClv8VKA8hyrXHbPDAlAaxq3EPOGjJqpHEdWNVg2S0pN62NSmSudT/ap/BqZf7FqsI2cUxv2mUKzmyy+rYwbhd8TRgj1kFprNOaldrluO4dXjubJIY4qEyJY5Dc/F03sGED4AiGBPVYtPh8zscG64yJJ9Njs1ReyUCSX4jYmxoZOnO+6GfXE0s2xQIDAQAB');
+ xhr.send('{"operationName":"UserQuery","variables":{},"query":" query UserQuery { user { __typename profile { displayName } userInfo { regiId entitlements demographics { emailSubscriptions wat bundleSubscriptions { bundle inGrace promotion source } } } subscriptionDetails { graceStartDate graceEndDate isFreeTrial hasQueuedSub startDate endDate status entitlements } } } "}');
+ window.userXhrObject = xhr;
+ })();
+
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.vi = window.vi || {};
+ window.vi.env = Object.freeze({"JKIDD_PATH":"https://a.nytimes.com/svc/nyt/data-layer","ET2_URL":"https://a.et.nytimes.com","WEDDINGS_PATH":"https://content.api.nytimes.com","GDPR_PATH":"https://us-central1-nyt-wfvi-prd.cloudfunctions.net/gdpr-email-form","ABRA_ET_URL":"//et.nytimes.com","NODE_ENV":"production","SENTRY_SAMPLE_RATE":"10","EXPERIMENTAL_ROUTE_PREFIX":"","ENVIRONMENT":"prd","RELEASE":"99bbf59339e8933923f217204d494034f939c495","AUTH_HOST":"https://myaccount.nytimes.com","SWG_PUBLICATION_ID":"nytimes.com"});
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.swgUserInfoXhrObject = new XMLHttpRequest();
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ document.domain = 'nytimes.com';
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ var userAgent = window.navigator.userAgent || window.navigator.vendor || window.opera;
+ var inAndroid = userAgent.indexOf('nyt_android') !== -1;
+ var iniOS = userAgent.indexOf('nytios') !== -1;
+ if (inAndroid || iniOS) document.documentElement.classList.add('NYTApp');
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ !function(r,e){var i,a,c,p,s,l=[],
+ u="object"==typeof r.navigator&&r.navigator.sendBeacon?"beacon":"polybeacon";function f(){var e,t,
+ n=r.crypto||r.msCrypto;if(n)t=n.getRandomValues(new Uint8Array(18));else for(t=[];t.length<18;
+ )t.push(256*Math.random()^255&(e=e||+new Date)),e=Math.floor(e/256);return btoa(
+ String.fromCharCode.apply(String,t)).replace(/\+/g,"-").replace(/\//g,"_")}if(r.nyt_et)try{
+ console.warn("et2 snippet should only load once per page")}catch(e){}else r.nyt_et=function(){var e,
+ t,n=arguments;function o(){l.length&&(function(e,t){if("beacon"===u)return r.navigator.sendBeacon(e,
+ t);var n="function"==typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")
+ ;n.open("POST",e),n.withCredentials=!0,n.setRequestHeader("Accept","*/*"),
+ "string"==typeof t?n.setRequestHeader("Content-Type","text/plain;charset=UTF-8"
+ ):"[object Blob]"==={}.toString.call(t)&&t.type&&n.setRequestHeader("Content-Type",t.type);try{
+ n.send(t)}catch(e){}}(i+"/track",JSON.stringify(l)),l.length=0,clearTimeout(s),s=null)}if(
+ "string"==typeof n[0]&&/init/.test(n[0])&&(c=f(),"init"==n[0]&&!a)){if(a=f(),
+ "string"!=typeof n[1]||!/^http/.test(n[1]))throw new Error("init must include an et host url")
+ ;i=String(n[1]).replace(/\/$/,""),"string"==typeof n[2]&&(p=n[2])}e=n[n.length-1],
+ i&&"object"==typeof e&&(t="page"==e.subject?c:f(),e.sourceApp&&(p=e.sourceApp),e.sourceApp=p,l.push(
+ {context_id:a,pageview_id:c,event_id:t,client_lib:"cfc97c2",sourceApp:p,how:u,client_ts:+new Date,
+ data:JSON.parse(JSON.stringify(e))}),"send"==n[0]||t==c?o():s||(s=setTimeout(o,5500)))},
+ r.nyt_et.get_pageview_id=function(){return c}}(window);
+ ;
+ nyt_et('init', "https://a.et.nytimes.com", "nyt-vi",
+ {
+ subject: 'page',
+ assetUrl: (document.querySelector('link[rel=canonical]') || {}).href,
+ url: location.href,
+ referrer: document.referrer || void 0,
+ client_tz_offset: (new Date).getTimezoneOffset(),
+ sourceApp: "nyt-vi",
+ });
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ var NYTD = NYTD || {};
+ NYTD.PageViewId = {};
+ NYTD.PageViewId.update = function() {
+ NYTD.PageViewId.current = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ const r = (Math.random() * 16) | 0;
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+ return NYTD.PageViewId.current;
+ };
+ NYTD.PageViewId.update();
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ 100*Math.random()<=vi.env.SENTRY_SAMPLE_RATE?(window.INSTALL_RAVEN=!0,window.nyt_errors={ravenInstalled:!1,list:[],tags:[]},window.onerror=function(n,r,o,w,i){if(!window.nyt_errors.ravenInstalled){var t={err:i,data:{}};window.nyt_errors.list.push(t)}}):window.INSTALL_RAVEN=!1;
+ ]]>
+ </script>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+ <link rel="shortcut icon" href="/vi-assets/static-assets/favicon-4bf96cb6a1093748bf5b3c429accb9b4.ico" />
+ <link rel="apple-touch-icon" href="/vi-assets/static-assets/apple-touch-icon-319373aaf4524d94d38aa599c56b8655.png" />
+ <link rel="apple-touch-icon-precomposed" sizes="144×144" href="/vi-assets/static-assets/ios-ipad-144x144-319373aaf4524d94d38aa599c56b8655.png" />
+ <link rel="apple-touch-icon-precomposed" sizes="114×114" href="/vi-assets/static-assets/ios-iphone-114x144-61d373c43aa8365d3940c5f1135f4597.png" />
+ <link rel="apple-touch-icon-precomposed" href="/vi-assets/static-assets/ios-default-homescreen-57x57-7cccbfb151c7db793e92ea58c30b9e72.png" />
+ <meta property="fb:app_id" content="9869919170" />
+ <meta name="twitter:site" value="@nytimes" />
+ <script>
+ <![CDATA[
+ var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function e(t){var e=r[t];return e&&e[1]||null}function n(t,e){if(t){var n,r,o=e[0],i=e[1],c=0,u=0;if(1!==i.length||4294967296!==i[0])for(n=a(t+" "+o)>>>0,c=0,u=0;r=i[c++];)if(n<(u+=r[0]))return r}}function a(t){for(var e,n,a,r,o,i,c,u=0,l=0,s=[],f=[e=1732584193,n=4023233417,~e,~n,3285377520],h=[],p=t.length;l<=p;)h[l>>2]|=(l<p?t.charCodeAt(l):128)<<8*(3-l++%4);for(h[c=p+8>>2|15]=p<<3;u<=c;u+=16){for(e=f,l=0;l<80;e=[0|[(i=((t=e[0])<<5|t>>>27)+e[4]+(s[l]=l<16?~~h[u+l]:i<<1|i>>>31)+1518500249)+((n=e[1])&(a=e[2])|~n&(r=e[3])),o=i+(n^a^r)+341275144,i+(n&a|n&r|a&r)+882459459,o+1535694389][0|l++/20],t,n<<30|n>>>2,a,r])i=s[l-3]^s[l-8]^s[l-14]^s[l-16];for(l=5;l;)f[--l]=f[l]+e[l]|0}return f[0]}var r,o={};return t.dataLayer=t.dataLayer||[],e.init=function(e){var a,o,i,c,u,l,s,f,h,p,d=[],v=[],m=(t.document.cookie.match(/(?:^|;) *nyt-a=([^;]*)/)||[])[1],g=(t.document.cookie.match(/(?:^|;) *ab7=([^;]*)/)||[])[1],b=(t.location.search.match(/(?:^\?|&)abra=([^&]*)/)||[])[1];if(r)throw new Error("can't init twice");for(r={},u=(decodeURIComponent(g||"")+"&"+decodeURIComponent(b||"")).split("&"),a=u.length-1;a>=0;a--)l=u[a].split("="),l.length<2||(s=l[0])&&!r[s]&&(f=l[1]||null,r[s]=[,f,1],f&&d.push(s+"="+f),v.push({test:s,variant:f||"0"}));for(a=0;a<e.length;a++)i=e[a],(o=i[0])in r||(c=n(m,i)||[],c[0],h=c[1],p=!!c[2],r[o]=c,h&&d.push(o.replace(/[^\w-]/g)+"="+(""+h).replace(/[^\w-]/g)),p&&v.push({test:o,variant:h||"0"}));d.length&&t.document.documentElement.setAttribute("data-nyt-ab",d.join(" ")),v.length&&t.dataLayer.push({event:"ab-alloc",allocs:v})},e.reportExposure=function(e,n){if(!o[e]){o[e]=1;var a=r[e];if(a){var i=a[1];a[2]&&t.dataLayer.push({event:"ab-expose",abtest:{test:e,variant:i||"0"}})}n&&t.setTimeout(function(){n(null)},0)}},e}(this);;
+ NYTD.Abra.init([["WP_Platform",[[4294967296,"vi",0]]],["vi-ads-et",[[257698038,"2_remainder",1],[4037269258,null,0]]],["messaging-optimizely",[[4294967296,"1",0]]],["PER_Vi_Personalization",[[429496730,"0_control",1],[429496730,"1_personalized_best",1],[3435973836,"2_personalized",1]]],["PER_Vi_Personalization_Ramp",[[4294967296,"0_per_on",0]]],["PER_vi_personalization_story_trending",[[858993460,"0_trending_trending",1],[429496729,"1_trending_popular",1],[429496730,"2_trending_als",1],[429496729,"3_popular_trending",1],[429496730,"4_popular_popular",1],[429496730,"5_popular_als",1],[429496729,"6_recommended_trending",1],[429496730,"7_recommended_popular",1],[429496729,"8_recommended_als",1]]],["STORY_bn_disco",[[1431655766,"0_control",1],[1431655765,"1_interactive1",1],[1431655765,"2_interactive2",1]]],["STORY_comment_btn",[[1073741824,"0_default",1],[1073741824,"1_bab",1],[2147483648,null,0]]],["STORY_relatedLinks",[[4294967296,"0",0]]],["STORY_EP_Recirc",[[1431655766,"0_control",1],[1431655765,"1_picksAboveMore",1],[1431655765,"2_picksBelowMore",1]]],["AD_MPC-355",[[1460288881,"0_control",1],[1417339208,"1_adslotwhitelist",1],[1417339207,"2_adslotunblock",1]]],["STORY_newsletter",[[1417339208,"0_control",1],[1417339208,"1_footertop",1],[1460288880,"2_ccol",1]]],["DTI_ET2",[[4294967296,"on",0]]],["STORY_Survey",[[4037269259,"0_control",1],[85899346,"1_question1",1],[85899346,"2_question2",1],[85899345,"3_question3",1]]],["HOMEPAGE_midterms",[[85899346,"0_default",1],[4209067950,"1_midterms",1]]],["dfp_lazy_load_api",[[4294968,"0_control",1],[4294967,"1",1],[4286377361,null,0]]],["medianet_toggle",[[4294967296,"0_default",1]]],["STORY_Packaging",[[858993460,"0_control",1],[858993459,"1",1],[858993459,"2",1],[858993459,"3",1],[858993459,"4",1]]],["MKT_incognito_msg_0918",[[644245095,"0_inline_sub",1],[644245094,"1_inline_app",1],[644245095,"2_expanded_sub",1],[644245094,"3_expanded_app",1],[644245094,"4_trunct_regi",0],[429496730,"5_survey",1],[644245094,null,0]]],["MKT_Redbird_Intl",[[613566757,"0_Control",1],[613566757,"1_GW2_FT_CC",1],[613566756,"2_GW2_FT_NoCC",1],[613566757,"3_GW2_Regi",1],[613566756,"4_GW3_FT_CC",1],[613566757,"5_GW3_FT_NoCC",1],[613566756,"6_GW3_Regi",1]]],["MKT_abandonment_1118",[[1431655766,"0_control",1],[1431655765,"1_clarity",1],[1431655765,"2_urgency",1]]],["MKT_Redbird_US",[[128849019,"0_Control",1],[128849019,"1_GW2_FT_CC",1],[128849019,"2_GW2_FT_NoCC",1],[128849019,"3_GW2_Regi",1],[128849019,"4_GW3_FT_CC",1],[128849019,"5_GW3_FT_NoCC",1],[128849019,"6_GW3_Regi",1],[3393024163,"Outside_Redbird",0]]],["MKT_wcm_dfp_propensity_price",[[12025909,"0",1],[12025908,"1",1],[12025909,"2",1],[12025908,"3",1],[12025909,"4",1],[12025908,"5",1],[12025909,"6",1],[12025908,"7",1],[12025908,"8",1],[12025909,"9",1],[12025908,"10",1],[12025909,"11",1],[12025908,"12",1],[12025909,"13",1],[12025908,"14",1],[12025908,"15",1],[12025909,"16",1],[12025908,"17",1],[12025909,"18",1],[12025908,"19",1],[12025909,"20",1],[12025908,"21",1],[12025908,"22",1],[12025909,"23",1],[12025908,"24",1],[12025909,"25",1],[12025908,"26",1],[12025909,"27",1],[12025908,"28",1],[12025908,"29",1],[12025909,"30",1],[12025908,"31",1],[12025909,"32",1],[12025908,"33",1],[12025909,"34",1],[12025908,"35",1],[12025908,"36",1],[12025909,"37",1],[12025908,"38",1],[12025909,"39",1],[12025908,"40",1],[12025909,"41",1],[12025908,"42",1],[12025908,"43",1],[12025909,"44",1],[12025908,"45",1],[12025909,"46",1],[12025908,"47",1],[12025909,"48",1],[12025908,"49",1],[12025908,"50",1],[12025909,"51",1],[12025908,"52",1],[12025909,"53",1],[12025908,"54",1],[12025909,"55",1],[12025908,"56",1],[12025908,"57",1],[12025909,"58",1],[12025908,"59",1],[12025909,"60",1],[12025908,"61",1],[12025909,"62",1],[12025908,"63",1],[12025908,"64",1],[12025909,"65",1],[12025908,"66",1],[12025909,"67",1],[12025908,"68",1],[12025909,"69",1],[12025908,"70",1],[12025908,"71",1],[12025909,"72",1],[12025908,"73",1],[12025909,"74",1],[12025908,"75",1],[12025909,"76",1],[12025908,"77",1],[12025908,"78",1],[12025909,"79",1],[12025908,"80",1],[12025909,"81",1],[12025908,"82",1],[12025909,"83",1],[12025908,"84",1],[12025908,"85",1],[12025909,"86",1],[12025908,"87",1],[12025909,"88",1],[12025908,"89",1],[12025909,"90",1],[12025908,"91",1],[12025908,"92",1],[12025909,"93",1],[12025908,"94",1],[12025909,"95",1],[12025908,"96",1],[12025909,"97",1],[12025908,"98",1],[12025908,"99",1],[12025909,"100",1],[12025908,"101",1],[12025909,"102",1],[12025908,"103",1],[12025909,"104",1],[12025908,"105",1],[12025908,"106",1],[12025909,"107",1],[12025908,"108",1],[12025909,"109",1],[12025908,"110",1],[12025909,"111",1],[12025908,"112",1],[12025908,"113",1],[12025909,"114",1],[12025908,"115",1],[12025909,"116",1],[12025908,"117",1],[12025909,"118",1],[12025908,"119",1],[12025908,"120",1],[12025909,"121",1],[12025908,"122",1],[12025909,"123",1],[12025908,"124",1],[12025909,"125",1],[12025908,"126",1],[12025908,"127",1],[12025909,"128",1],[12025908,"129",1],[12025909,"130",1],[12025908,"131",1],[12025909,"132",1],[12025908,"133",1],[12025908,"134",1],[12025909,"135",1],[12025908,"136",1],[12025909,"137",1],[12025908,"138",1],[12025909,"139",1],[12025908,"140",1],[12025908,"141",1],[12025909,"142",1],[12025908,"143",1],[3006477,"0",1],[3006477,"1",1],[3006478,"2",1],[3006477,"3",1],[3006477,"4",1],[3006477,"5",1],[3006477,"6",1],[3006477,"7",1],[3006477,"8",1],[3006477,"9",1],[3006477,"10",1],[3006478,"11",1],[3006477,"12",1],[3006477,"13",1],[3006477,"14",1],[3006477,"15",1],[3006477,"16",1],[3006477,"17",1],[3006477,"18",1],[3006477,"19",1],[3006477,"20",1],[3006478,"21",1],[3006477,"22",1],[3006477,"23",1],[3006477,"24",1],[3006477,"25",1],[3006477,"26",1],[3006477,"27",1],[3006477,"28",1],[3006477,"29",1],[3006478,"30",1],[3006477,"31",1],[3006477,"32",1],[3006477,"33",1],[3006477,"34",1],[3006477,"35",1],[3006477,"36",1],[3006477,"37",1],[3006477,"38",1],[3006478,"39",1],[3006477,"40",1],[3006477,"41",1],[3006477,"42",1],[3006477,"43",1],[3006477,"44",1],[3006477,"45",1],[3006477,"46",1],[3006477,"47",1],[3006478,"48",1],[3006477,"49",1],[3006477,"50",1],[3006477,"51",1],[3006477,"52",1],[3006477,"53",1],[3006477,"54",1],[3006477,"55",1],[3006477,"56",1],[3006477,"57",1],[3006478,"58",1],[3006477,"59",1],[3006477,"60",1],[3006477,"61",1],[3006477,"62",1],[3006477,"63",1],[3006477,"64",1],[3006477,"65",1],[3006477,"66",1],[3006478,"67",1],[3006477,"68",1],[3006477,"69",1],[3006477,"70",1],[3006477,"71",1],[3006477,"72",1],[3006477,"73",1],[3006477,"74",1],[3006477,"75",1],[3006478,"76",1],[3006477,"77",1],[3006477,"78",1],[3006477,"79",1],[3006477,"80",1],[3006477,"81",1],[3006477,"82",1],[3006477,"83",1],[3006477,"84",1],[3006477,"85",1],[3006478,"86",1],[3006477,"87",1],[3006477,"88",1],[3006477,"89",1],[3006477,"90",1],[3006477,"91",1],[3006477,"92",1],[3006477,"93",1],[3006477,"94",1],[3006478,"95",1],[3006477,"96",1],[3006477,"97",1],[3006477,"98",1],[3006477,"99",1],[3006477,"100",1],[3006477,"101",1],[3006477,"102",1],[3006477,"103",1],[3006478,"104",1],[3006477,"105",1],[3006477,"106",1],[3006477,"107",1],[3006477,"108",1],[3006477,"109",1],[3006477,"110",1],[3006477,"111",1],[3006477,"112",1],[3006477,"113",1],[3006478,"114",1],[3006477,"115",1],[3006477,"116",1],[3006477,"117",1],[3006477,"118",1],[3006477,"119",1],[3006477,"120",1],[3006477,"121",1],[3006477,"122",1],[3006478,"123",1],[3006477,"124",1],[3006477,"125",1],[3006477,"126",1],[3006477,"127",1],[3006477,"128",1],[3006477,"129",1],[3006477,"130",1],[3006477,"131",1],[3006478,"132",1],[3006477,"133",1],[3006477,"134",1],[3006477,"135",1],[3006477,"136",1],[3006477,"137",1],[3006477,"138",1],[3006477,"139",1],[3006477,"140",1],[3006477,"141",1],[3006478,"142",1],[3006477,"143",1],[42949673,"144",1],[2104533975,"outside_propensity",0]]],["ON_app_dl_mobile_0119",[[1431655766,"0_control",1],[1431655765,"1_appdl",1],[1431655765,"2_pill",1]]],["ON_app_dl_desktop_0119",[[4294967296,null,0]]],["ON_simplified_1218",[[4294967296,null,0]]],["DFP_house_conversion",[[2147483648,"0_control",1],[2147483648,"1_psa",1]]],["MKT_gwlp_cta_0118",[[715541552,"0_ctahidden",1],[715541552,"1_ctaexposed",1],[715541551,"3_ctaexposed_offer",1],[2148342641,null,0]]],["FREEX_FT_Reassure",[[858993460,"0_control",1],[858993459,"1_no_cc_copy",1],[858993459,"2_unlimited_access",1],[858993459,"3_free_weeks",1],[858993459,"4_continue_reading",1]]],["FREEX_Gateway_Stories",[[1431655766,"0_Control",1],[1431655765,"1_More_Section",1],[1431655765,"3_Extra",1]]],["RET_ingrace_truncator_0219",[[1431655766,"0_Grace_Control",1],[1431655765,"1_Grace_DismissableTruncator",1],[1431655765,"2_Grace_NonDismissableTruncator",1]]],["MKT_dfp_ocean_messaging",[[1431655766,"0_control",0],[1431655765,"1_relevance",0],[1431655765,"2_breadth",0]]],["HL_sample",[[2147483648,"0",1],[2147483648,"1",1]]]],"//et.nytimes.com");
+ ]]>
+ </script>
+ <link data-rh="true" rel="alternate" itemprop="mainEntityOfPage" hreflang="en-US" href="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <link data-rh="true" rel="canonical" href="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.html" />
+ <link data-rh="true" rel="alternate" href="android-app://com.nytimes.android/nytimes/reader/id/100000006355641" />
+ <link data-rh="true" rel="amphtml" href="https://www.nytimes.com/2019/02/21/nyregion/winter-weather-manholes-pipes.amp.html" />
+ <link data-rh="true" rel="alternate" type="application/json+oembed" href="https://www.nytimes.com/svc/oembed/json/?url=https%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html" title="Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C." />
+ <script data-rh="true">
+ <![CDATA[
+ if (typeof testCookie === 'undefined') {
+ var testCookie = function (name) {
+ var match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ if (testCookie('nyt-gdpr') !== '1') {
+ var gptScript = document.createElement('script');
+ gptScript.async = 'async';
+ gptScript.src = '//www.googletagservices.com/tag/js/gpt.js';
+ document.head.appendChild(gptScript);
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+
+ if (testCookie('nyt-gdpr') == '1') {
+ googletag.cmd.push(function() {
+ googletag.pubads().setRequestNonPersonalizedAds(1);
+ });
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ (function() {
+ var getScripts = function() {
+ if (window.NYTD.Abra('medianet_toggle') !== '1_block') {
+ var readCookie = function(name) {
+ match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ // Allows media.net if user is not from EEA
+ if (readCookie('nyt-gdpr') !== '1') {
+ // Allows media.net only if prebid testing is not on
+ if (!readCookie('ab7') || readCookie('ab7') !== 'vi-prebid-header=1') {
+ var mediaScript = document.createElement("script");
+ var cid = '8CU2553YN';
+ var domain = 'www.nytimes.com';
+ if (window.innerWidth < 600) {
+ cid = '8CULO58R6';
+ }
+ mediaScript.async = true;
+ mediaScript.src="https://contextual.media.net/bidexchange.js?cid="+cid+"&dn="+domain+"&https=1";
+ document.head.appendChild(mediaScript);
+ }
+ }
+
+ }
+ if (window.NYTD.Abra('medianet_toggle') !== '1_block') {
+ var mediaNetCID = '8CU2553YN';
+ if (window.innerWidth < 600) {
+ mediaNetCID = '8CULO58R6';
+ }
+ window.advBidxc = window.advBidxc || {};window.advBidxc.renderAd = function() {};
+ window.advBidxc.startTime = new Date().getTime(); window.advBidxc.customerId = {mediaNetCID: mediaNetCID};
+ window.advBidxc.misc = {"isGptDisabled": 1};
+
+ }
+ if (window.NYTD.Abra('amazon_toggle') !== '1_block') {
+
+ !function(a9,a,p,s,t,A,g){if(a[a9])return;
+ function q(c,r){a[a9]._Q.push([c,r])}a[a9]={
+ init:function(){q("i",arguments)},
+ fetchBids:function(){q("f",arguments)},
+ setDisplayBids:function(){},
+ targetingKeys:function(){return[]},_Q:[]};
+ A=p.createElement(s);
+ A.async=!0;
+ A.src=t;
+ g=p.getElementsByTagName(s)[0];
+ g.parentNode.insertBefore(A,g)}
+ ("apstag",window,document,"script","//c.amazon-adsystem.com/aax2/apstag.js");
+ apstag.init({
+ pubID: '3030',
+ adServer: 'googletag',
+ params: {
+ si_section: 'nyregion'
+ }
+ });
+
+ }
+ if (window.NYTD.Abra('index_toggle') !== '1_block') {
+
+ var indexScript = document.createElement("script");
+ indexScript.async = 'async';
+ indexScript.src="https://js-sec.indexww.com/ht/p/183760-179626133031071.js";
+ document.head.appendChild(indexScript);
+
+ };
+ };
+ if (window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('DFP_prioritize_defer').indexOf('hb') !== -1 && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird') {
+ var scriptAdded = false;
+ window.googletag = window.googletag || {};
+ window.googletag.cmd = window.googletag.cmd || [];
+ window.googletag.cmd.push(function() {
+ window.googletag.pubads().addEventListener('slotOnload', function(e) {
+ if (e.slot && typeof e.slot.getSlotElementId === 'function' && e.slot.getSlotElementId() === 'top' && !scriptAdded) {
+ getScripts();
+ scriptAdded = true;
+ }
+ });
+ });
+ setTimeout(function() {
+ if (!scriptAdded) {
+ getScripts();
+ scriptAdded = true;
+ }
+ }, 10000);
+ } else {
+ getScripts();
+ }
+ }());
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('vi-ads-et') || (window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird')) {
+ window.addEventListener('beforeunload', function(e) {
+ function measureExit() {
+ try {
+ var time;
+ if (performance) {
+ performance.mark('exit-event');
+ performance.measure('visit-time', 'responseStart', 'exit-event');
+ time = performance.getEntriesByName('visit-time')[0].duration;
+ }
+ return time;
+ } catch (err) {
+ // move on
+ }
+ };
+
+ var etUrl = 'https://et.nytimes.com/';
+ var data = 'url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-exit-pixel%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%2C%22mData%22%3A%22' + measureExit() + '%22%7D' +
+ '&page_view_id=' + window.NYTD.PageViewId.current +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ if ('sendBeacon' in navigator) {
+ navigator.sendBeacon(etUrl, data);
+ }
+ });
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if ((window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird') && !(testCookie('nyt-gdpr') === '1' && testCookie('NYT-T') === 'out')) {
+
+ var noop=function(){return{}},noopArr=function(){return[]},performance=window.performance||{};performance.mark=performance.mark||noop,performance.measure=performance.measure||noop,performance.getEntriesByName=performance.getEntriesByName||noopArr,performance.getEntriesByType=performance.getEntriesByType||noopArr;var ADF={isRefresh:!1,isDisplayed:!1,isManualRefresh:window.performance&&window.performance.navigation&&1===window.performance.navigation.type,observer:null,trackEvent:function(e){var t={module:"top",action:"ad-impression"};window.Object.keys(e).forEach(function(r){t[r]=e[r]});var r=document.createElement("img"),n="https://et.nytimes.com/pixel?url="+encodeURIComponent(window.location.href)+"&referrer="+document.referrer+"&subject=module-interactions&page_view_id="+window.NYTD.PageViewId.current+"&moduleData="+encodeURIComponent(window.JSON.stringify(t))+"&sourceApp=nyt-vi&instant=1&_="+Date.now();r.src=n,r.style.cssText="position: absolute; z-index: -999999; left: -1000px; top: -1000px;",document.body&&document.body.appendChild(r)},trackTimeCalled:function(e,t){performance.timing&&performance.timing.responseStart&&t.setTargeting("request_time",(Date.now()-performance.timing.responseStart).toString());var r="top-timeCalled";performance.mark(r),performance.measure(e,"responseStart",r);var n=performance.getEntriesByName(e).pop();n&&this.trackEvent({eventName:"timeCalled",moduleDetail:Math.round(n.duration)})},getDeviceType:function(){var e="tablet",t="desktop",r="smartphone";return window.matchMedia("(min-width: 740px)").matches&&(r=e),window.matchMedia("(min-width: 1150px)").matches&&(r=t),r},getAbraDfpVariants:function(){var e=window.document.documentElement.getAttribute("data-nyt-ab");return e?e.split(" ").reduce(function(e,t){var r=t.split("="),n=r[0].toLowerCase(),o=r[1];return(n.indexOf("dfp")>-1||n.indexOf("redbird")>-1)&&e.push(n+"_"+o),e},[]):""},getSub:function(e,t){var r=e&&e.demographics,n=r&&r.emailSubscriptions,o=r&&r.bundleSubscriptions;if(r&&o&&t&&(t.sub="reg",n&&n.length&&(t.em=n.toString().toLowerCase()),r.wat&&(t.wat=r.wat.toLowerCase()),o&&o.length&&o[0].bundle)){var i=o[0];t.sub=i.bundle.toLowerCase(),i.source&&(t.subsrc=i.source.toLowerCase()),i.promotion&&(t.subprm=i.promotion),i.in_grace&&(t.grace=i.in_grace.toString())}return t},getUserInfo:function(){var e=window.userInfoXhrObject&&""!==window.userInfoXhrObject.responseText&&window.JSON.parse(window.userInfoXhrObject.responseText).data||null,t=null;return e&&e.user&&(t=e.user.userInfo?{demographics:e.user.userInfo.demographics}:{}),t},getViewport:function(e){var t={smartphone:"small",tablet:"medium",desktop:"large"};return e?t[e]:t.desktop},getTargeting:function(e,t){var r=this.getUserInfo();r?e=this.getSub(r,e):e.sub="anon",1===testCookie("nyt-gdpr")&&(e.gdprUser=!0);var n=testCookie("NYT-T");return n&&"out"===n.toLowerCase()&&(e.noTracking=!0),"/"===location.pathname&&(e.topref=document.referrer,this.isManualRefresh&&(e.refresh="manual")),e.aid=testCookie("nyt-a")||"",e.abra_dfp=this.getAbraDfpVariants(),e.page_view_id=window.NYTD.PageViewId.current,e.vp=this.getViewport(t),e},defineAd:function(e,t){var r=window.googletag.defineSlot(t,[],e);if(r){var n="top-timeDefined";performance.mark(n),performance.measure(e,"responseStart",n);var o=performance.getEntriesByName(e).pop();o&&this.trackEvent({eventName:"timeDefined",moduleDetail:Math.round(o.duration)})}return r},observeAd:function(e,t){var r=document.getElementById(e);if(this.observer)this.observer.unobserve(r),this.observer.observe(r);else{window.IntersectionObserver.prototype.POLL_INTERVAL=1e3;var n=new IntersectionObserver(function(n,o){n[0].isIntersecting&&(this.trackTimeCalled(e,t),this.isRefresh&&this.isDisplayed?window.googletag.pubads().refresh([t]):(window.googletag.display(t),this.isDisplayed=!0),o.unobserve(r))}.bind(this),{root:null,rootMargin:"400px",threshold:0});n.observe(r),this.observer=n}},callAd:function(e,t){void 0!==window.IntersectionObserver&&this.isManualRefresh?this.observeAd(e,t):(this.trackTimeCalled(e,t),window.googletag.display(e),this.isDisplayed=!0)},createTopAd:function(e,t){var r="top",n=this.getDeviceType();if("smartphone"!==n){var o=this.defineAd(r,t);if(o){var i=window.googletag.sizeMapping().addSize([970,0],["fluid",[728,90],[970,90],[970,250],[1605,300]]).addSize([728,0],["fluid",[728,90],[300,250],[1605,300]]).addSize([0,0],["fluid",[300,250],[300,420]]).build();o.defineSizeMapping(i);var a=this.getTargeting(e,n);window.Object.keys(a).forEach(function(e){o.setTargeting(e,a[e])}),o.addService(window.googletag.pubads()),window.googletag.enableServices(),this.callAd(r,o),window.googletag.pubads().addEventListener("slotRenderEnded",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeRendered";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeRendered",moduleDetail:Math.round(n.duration)}),e.isEmpty&&(document.getElementById(r).parentNode.style.display="none")}}.bind(this)),window.googletag.pubads().addEventListener("slotOnload",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeLoaded";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeLoaded",moduleDetail:Math.round(n.duration)})}}.bind(this)),window.googletag.pubads().addEventListener("impressionViewable",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeViewed";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeViewed",moduleDetail:Math.round(n.duration)})}}.bind(this)),document.addEventListener("topAdRefresh",function(e){o.setTargeting("page_view_id",window.NYTD.PageViewId.current),o.setTargeting("refresh",e.detail),this.isRefresh=!0,void 0!==window.IntersectionObserver?this.observeAd(r,o):(this.trackTimeCalled(r,o),window.googletag.pubads().refresh([o]))}.bind(this))}}}};
+ window.googletag = window.googletag || {};
+ window.googletag.cmd = window.googletag.cmd || [];
+ window.googletag.cmd.push(ADF.createTopAd.bind(ADF, {"div":"top","gpt-beta":"vqwdtftx","pos":"top","sov":"2","test":"projectvi","ver":"vi","hasVideo":false,"template":"article","si_section":"nyregion","plat":"web","auth":"coreykilgannon","typ":"art,oak","edn":"us","des":"water,winterseason,infrastructurepublicworks,potholes,manholes","org":"consolidatededisoninc,departmentofenvironmentalprote","coll":"newyork","id":"100000006355641","geo":"manhattannyc","als_test":"1550884468686","brandsensitive":"false","ledemedsz":"none","prop":"nyt","section":"nyregion","artlen":"medium","emotions":"interest,sadness,not_nostalgic,not_competitive,not_inspired,not_hope,not_indulgent,not_happiness,not_amused,not_hate,not_boredom","gscat":"neg_mastercard,gs_science,neg_hearts,gs_science_environ,gs_business_energy,gv_safe"}, '/29390238/nyt/nyregion/'));
+
+ }
+ ]]>
+ </script>
+ <link rel="stylesheet" href="/vi-assets/static-assets/global-42db6c8821fec0e2b3837b2ea2ece8fe.css" />
+ <style>
+ <![CDATA[
+ .css-1dv1kvn{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-nuvmzp{font-size:14.25px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;-webkit-letter-spacing:0.7px;-moz-letter-spacing:0.7px;-ms-letter-spacing:0.7px;letter-spacing:0.7px;line-height:19px;}.css-nuvmzp:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1gz70xg{border-left:1px solid #ccc;color:#326891;height:12px;margin-left:8px;padding-left:8px;}.css-9e9ivx{display:none;font-size:10px;margin-left:auto;text-transform:uppercase;}.hasLinks .css-9e9ivx{display:block;}@media (min-width:740px){.hasLinks .css-9e9ivx{margin:none;position:absolute;right:20px;}}@media (min-width:1024px){.hasLinks .css-9e9ivx{display:none;}}.css-2bwtzy{display:inline-block;padding:6px 4px 4px;margin-bottom:12px;font-size:12px;border-radius:3px;-webkit-transition:background 0.6s ease;transition:background 0.6s ease;}.css-2bwtzy:hover{background-color:#f7f7f7;}.css-6n7j50{display:inline;}.css-1kj7lfb{display:none;}@media (min-width:1024px){.css-1kj7lfb{display:inline-block;margin-right:7px;}}.css-10m9xeu{display:block;width:16px;height:16px;}.css-vz7hjd{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-1fe7a5q{display:inline-block;height:16px;vertical-align:sub;width:16px;}.css-1rn5q1r{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;background:#fff;display:inline-block;left:44px;text-transform:uppercase;-webkit-transition:none;transition:none;}.css-1rn5q1r:active,.css-1rn5q1r:focus{-webkit-clip:auto;clip:auto;overflow:visible;width:auto;height:auto;}.css-1rn5q1r::-moz-focus-inner{padding:0;border:0;}.css-1rn5q1r:-moz-focusring{outline:1px dotted;}.css-1rn5q1r:disabled,.css-1rn5q1r.disabled{opacity:0.5;cursor:default;}.css-1rn5q1r:active,.css-1rn5q1r.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1rn5q1r:hover{background-color:#f7f7f7;}}.css-1rn5q1r:focus{margin-top:3px;padding:8px 8px 6px;}@media (min-width:1024px){.css-1rn5q1r{left:112px;}}.css-10488qs{display:none;}@media (min-width:1024px){.css-10488qs{display:inline-block;position:relative;}}.css-1iruc8t{list-style:none;margin:0;padding:0;}.css-1ropbjl::before{background-color:$white;border-bottom:1px solid #e2e2e2;border-top:2px solid #e2e2e2;content:'';display:block;height:1px;margin-top:0;}@media (min-width:1150px){.css-1ropbjl{margin:0 auto;max-width:1200px;padding:0 3% 9px;}}.NYTApp .css-1ropbjl{display:none;}@media print{.css-1ropbjl{display:none;}}.css-uw59u{padding:0 20px;}@media (min-width:740px){.css-uw59u{padding:0 3%;}}@media (min-width:1150px){.css-uw59u{padding:0;}}.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-oylsik{display:block;height:44px;vertical-align:middle;width:184px;}.css-1otr2jl{margin:18px 0 0 auto;}.css-1c8n994{color:#6288a5;font-family:nyt-franklin;font-size:11px;font-style:normal;font-weight:400;line-height:11px;-webkit-text-decoration:none;text-decoration:none;}.css-qtw155{display:block;}@media (min-width:1150px){.css-qtw155{display:none;}}.css-v0l3hm{display:none;}@media (min-width:1150px){.css-v0l3hm{display:block;}}.css-g4gku8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;min-width:600px;}.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}.css-6xhk3s{border-left:1px solid #e2e2e2;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:15px;}.css-rxqrcl{color:#333;font-size:13px;font-weight:700;font-family:nyt-franklin;height:25px;line-height:15px;margin:0;text-transform:uppercase;width:150px;}.css-tj0ten{margin-bottom:5px;white-space:nowrap;}.css-tj0ten:last-child{margin-bottom:10px;}.css-ist4u3.desktop{display:none;}@media (min-width:740px){.css-ist4u3.desktop{display:block;}.css-ist4u3.smartphone{display:none;}}.css-1gprdgz{list-style:none;margin:0;padding:0;-webkit-columns:2;columns:2;padding:0 0 15px;}.css-10t7hia{height:34px;line-height:34px;list-style-type:none;}.css-10t7hia.desktop{display:none;}@media (min-width:740px){.css-10t7hia.desktop{display:block;}.css-10t7hia.smartphone{display:none;}}.css-mzqdl{color:#333;display:block;font-family:nyt-franklin;font-size:15px;font-weight:500;height:34px;line-height:34px;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;}.css-kwpx34{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:14px;font-weight:500;height:23px;line-height:16px;}.css-kwpx34:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-kwpx34{color:#fff;}.css-1k2cjfc{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:16px;font-weight:700;height:25px;line-height:15px;padding-bottom:0;}.css-1k2cjfc:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1k2cjfc{color:#fff;}.css-1vhk1ks{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:11px;font-weight:500;height:23px;line-height:21px;}.css-1vhk1ks:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1vhk1ks{color:#fff;}.css-6td9kr{list-style:none;margin:0;padding:0;border-top:1px solid #e2e2e2;margin-top:2px;padding-top:10px;}.css-r5ic95{display:inline-block;height:13px;width:13px;margin-right:7px;vertical-align:middle;}.css-15uy5yv{border-top:1px solid #ebebeb;padding-top:9px;}.css-1p8nkc0{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;padding:10px 0;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;}.css-1p8nkc0:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1hyfx7x{display:none;}@-webkit-keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@-webkit-keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@-webkit-keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@-webkit-keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@-webkit-keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@-webkit-keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@-webkit-keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@-webkit-keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@-webkit-keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@-webkit-keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@-webkit-keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@-webkit-keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}@keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}.css-1g7m0tk{color:#326891;}.css-1g7m0tk:visited{color:#326891;}.css-acwcvw{margin-bottom:1rem;}.css-zjzyr8{width:100%;background-color:#f7f7f5;}@-webkit-keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@-webkit-keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}.css-1baulvz{display:inline-block;}@-webkit-keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}@keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}.css-1waixk9{background:#fff;border-bottom:1px solid #e2e2e2;height:36px;padding:8px 15px 3px;position:relative;}@media (min-width:740px){.css-1waixk9{background:#fff;padding:10px 15px 6px;}}@media (min-width:1024px){.css-1waixk9{background:transparent;border-bottom:0;padding:4px 15px 2px;}}@media print{.css-1waixk9{background:transparent;}}@media (min-width:740px){}@media (min-width:1024px){.css-1waixk9{margin:0 auto;max-width:1605px;}}.css-l2ztic{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;padding:8px 9px;text-transform:uppercase;}.css-l2ztic.hidden{opacity:0;visibility:hidden;}.css-l2ztic.hidden:focus{opacity:1;}.css-l2ztic::-moz-focus-inner{padding:0;border:0;}.css-l2ztic:-moz-focusring{outline:1px dotted;}.css-l2ztic:disabled,.css-l2ztic.disabled{opacity:0.5;cursor:default;}.css-l2ztic:active,.css-l2ztic.active{background-color:#f7f7f7;}@media (min-width:740px){.css-l2ztic:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-l2ztic{display:none;}}.css-19lv58h{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;-webkit-appearance:button;-moz-appearance:button;appearance:button;background-color:#fff;border:1px solid #ebebeb;color:#333;display:inline-block;font-size:11px;font-weight:500;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;line-height:13px;margin:0;padding:8px 9px;text-transform:uppercase;vertical-align:middle;display:none;}.css-19lv58h::-moz-focus-inner{padding:0;border:0;}.css-19lv58h:-moz-focusring{outline:1px dotted;}.css-19lv58h:disabled,.css-19lv58h.disabled{opacity:0.5;cursor:default;}.css-19lv58h:active,.css-19lv58h.active{background-color:#f7f7f7;}@media (min-width:740px){.css-19lv58h:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-19lv58h{border:0;display:inline-block;margin-right:8px;}}.css-mgtjo2{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;}.css-mgtjo2::-moz-focus-inner{padding:0;border:0;}.css-mgtjo2:-moz-focusring{outline:1px dotted;}.css-mgtjo2:disabled,.css-mgtjo2.disabled{opacity:0.5;cursor:default;}.css-mgtjo2:active,.css-mgtjo2.active{background-color:#f7f7f7;}@media (min-width:740px){.css-mgtjo2:hover{background-color:#f7f7f7;}}.css-mgtjo2.activeSearchButton{background-color:#f7f7f7;}@media (min-width:1024px){.css-mgtjo2{padding:8px 9px 9px;}}.css-nhjhh0{display:block;width:189px;height:26px;margin:5px auto 0;}@media (min-width:740px){.css-nhjhh0{width:225px;height:31px;margin:4px auto 0;}}@media (min-width:1024px){.css-nhjhh0{width:195px;height:26px;margin:6px auto 0;}}.css-1bnxwmn{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:#6288a5;border:1px solid #326891;color:#fff;font-size:11px;font-weight:700;-webkit-letter-spacing:0.05em;-moz-letter-spacing:0.05em;-ms-letter-spacing:0.05em;letter-spacing:0.05em;line-height:11px;padding:8px 9px 6px;text-transform:uppercase;}.css-1bnxwmn::-moz-focus-inner{padding:0;border:0;}.css-1bnxwmn:-moz-focusring{outline:1px dotted;}.css-1bnxwmn:disabled,.css-1bnxwmn.disabled{opacity:0.5;cursor:default;}@media (min-width:740px){.css-1bnxwmn:hover{background-color:#326891;}}@media (min-width:1024px){.css-1bnxwmn{padding:11px 12px 8px;}}.css-1bnxwmn:hover{border:1px solid #326891;}.css-1nkps6a{height:100%;display:none;}.css-1i8g3m4{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;display:block;}.css-1i8g3m4.hidden{opacity:0;visibility:hidden;}.css-1i8g3m4.hidden:focus{opacity:1;}.css-1i8g3m4::-moz-focus-inner{padding:0;border:0;}.css-1i8g3m4:-moz-focusring{outline:1px dotted;}.css-1i8g3m4:disabled,.css-1i8g3m4.disabled{opacity:0.5;cursor:default;}.css-1i8g3m4:active,.css-1i8g3m4.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1i8g3m4:hover{background-color:#f7f7f7;}}@media (min-width:740px){.css-1i8g3m4{border:none;line-height:13px;padding:9px 9px 12px;}}@media (min-width:1024px){.css-1i8g3m4{display:none;}}@media (min-width:1150px){}.css-1uqjmks{color:#121212;font-size:12px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;display:none;}@media (min-width:740px){.css-1uqjmks{margin:0;position:absolute;left:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;}}@media (min-width:1024px){.css-1uqjmks{display:none;}}.css-mn5hq9{cursor:pointer;margin:0;border-top:1px solid #ebebeb;color:#333;font-family:nyt-franklin;font-size:13px;font-weight:700;height:44px;-webkit-letter-spacing:0.04rem;-moz-letter-spacing:0.04rem;-ms-letter-spacing:0.04rem;letter-spacing:0.04rem;line-height:44px;text-transform:uppercase;}.accordionExpanded .css-mn5hq9{color:#b3b3b3;}.css-1qmnftd{font-size:11px;text-align:center;}@media (max-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:1024px){.css-1qmnftd{padding:0 3% 9px;}}@media (min-width:1150px){.css-1qmnftd{margin:0 auto;max-width:1200px;}}.NYTApp .css-1qmnftd{display:none;}@media print{.css-1qmnftd{display:none;}}.css-1ho5u4o{list-style:none;margin:0 0 15px;padding:0;}@media (min-width:600px){.css-1ho5u4o{display:inline-block;}}.css-13o0c9t{list-style:none;line-height:8px;margin:0 0 35px;padding:0;}@media (min-width:600px){.css-13o0c9t{display:inline-block;}}.css-1yo489b{display:inline-block;line-height:20px;padding:0 10px;}.css-1yo489b:first-child{border-left:none;}.css-1yo489b.desktop{display:none;}@media (min-width:740px){.css-1yo489b.smartphone{display:none;}.css-1yo489b.desktop{display:inline-block;}}.css-qremme{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:32px;background:#333;box-shadow:0 2.5px 5px rgba(0,0,0,0.25);border-radius:101px;z-index:1000000101;}@media (min-width:768px){.css-qremme{height:35px;}}.css-1f85ym4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;padding:0 13px 0 17px;background-color:transparent;color:#fff;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:0.875rem;line-height:0.875rem;}@media (min-width:768px){.css-1f85ym4{font-size:0.9375rem;line-height:0.9375rem;}}.css-7inim5{border:0.5px solid #ccc;height:60%;}.css-133m5b6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;padding:0 16px 0 13px;background-color:transparent;}.css-133m5b6 svg{fill:none;}.css-133m5b6 svg path{stroke-width:2px;-webkit-transform:translate(10.57px,-1.46px);-ms-transform:translate(10.57px,-1.46px);transform:translate(10.57px,-1.46px);}.css-1lc20wh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:fixed;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100vw;bottom:2.5vh;-webkit-transform:translateY(75px);-ms-transform:translateY(75px);transform:translateY(75px);}.css-1lc20wh.shown{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:200ms -webkit-transform ease-in-out;-webkit-transition:200ms transform ease-in-out;transition:200ms transform ease-in-out;}@media print{.css-1lc20wh{display:none;}}.sizeSmall .css-bsn42l{width:50%;}@media (min-width:600px){.sizeSmall .css-bsn42l{width:300px;}}@media (min-width:1440px){.sizeSmall .css-bsn42l{width:300px;}}@media (max-width:600px){.sizeSmall .css-bsn42l{width:50%;}}.sizeSmall.sizeSmallNoCaption .css-bsn42l{margin-left:auto;margin-right:auto;}@media (min-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:1024px){.sizeSmall.layoutVertical .css-bsn42l{width:250px;}}@media (max-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:1024px){.sizeSmall.layoutHorizontal .css-bsn42l{width:300px;}}@media (max-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-bsn42l{width:310px;}}.css-11cwn6f{width:100%;vertical-align:top;}.css-11cwn6f img{width:100%;vertical-align:top;}.css-hn080{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;}@media print{.css-hn080{display:none;}}.css-y8aj3r{padding:0;}.css-60hakz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-60hakz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-60hakz:nth-of-type(3),.css-60hakz:nth-of-type(4){display:none;}}.css-60hakz:last-of-type{margin-right:0;}.css-i29ckm{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 2rem;}@media (min-width:1440px){.css-i29ckm{width:600px;max-width:600px;}}@media (min-width:600px){.css-i29ckm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (max-width:600px){.css-i29ckm .facebook,.css-i29ckm .twitter,.css-i29ckm .email{display:inline-block;}}.css-1ri25x2{display:none;}@media (min-width:740px){.css-1ri25x2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:16px;height:31px;}}@media (min-width:1024px){.css-1ri25x2{display:none;}}.css-12fr9lp{height:23px;margin-top:6px;}.css-1hfdzay{display:none;}@media (min-width:1024px){.css-1hfdzay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:0;}}.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-eqw76k{display:none;}@media (min-width:740px){.css-eqw76k{position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:0;z-index:1;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;width:100%;height:32.063px;background:white;padding:5px 0 5px 0;top:0;text-align:center;font-family:'nyt-cheltenham';box-shadow:rgba(0,0,0,0.08) 0 0 5px 1px;border-bottom:1px solid #e2e2e2;}}.css-m6xlts{margin-left:20px;margin-right:20px;max-width:1605px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;width:100%;}@media (min-width:1360px){.css-m6xlts{margin-left:20px;margin-right:20px;}}@media (min-width:1780px){.css-m6xlts{margin-left:auto;margin-right:auto;}}.css-1ahhg7f{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;max-width:1605px;overflow:hidden;position:absolute;width:56%;margin-left:calc((100% - 56%) / 2);}@media (min-width:1024px){.css-1ahhg7f{width:56%;margin-left:calc((100% - 56%) / 2);}}@media (min-width:1024px){.css-1ahhg7f{width:53%;margin-left:calc((100% - 53%) / 2);}}.css-rs6kf8{font-family:nyt-cheltenham-small,georgia,'times new roman';font-weight:700;font-size:13px;-webkit-letter-spacing:0.015em;-moz-letter-spacing:0.015em;-ms-letter-spacing:0.015em;letter-spacing:0.015em;font-weight:400;margin-top:10.5px;margin-right:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-17xtcya{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:12.5px;text-transform:uppercase;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;margin-top:12.5px;margin-bottom:auto;margin-left:auto;white-space:nowrap;}.css-17xtcya:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-x15j1o{display:inline-block;padding-left:7px;padding-right:7px;font-size:13px;margin-top:10px;margin-bottom:auto;color:#ccc;}.css-19gb6gw{margin-top:auto;margin-bottom:auto;margin-left:auto;background-color:white;z-index:50;box-shadow:-14px 2px 7px -2px rgba(255,255,255,0.7);}@media (min-width:740px){.css-1iwv8en{margin-top:1px;}}@media (min-width:1024px){.css-1iwv8en{margin-top:0;}}.css-1sy8kpn{display:none;}@media (min-width:765px){.css-1sy8kpn{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;display:block;padding-bottom:15px;padding-top:15px;margin:0;min-height:90px;}}@media print{.css-1sy8kpn{display:none;}}.css-19vbshk{color:#ccc;display:none;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-left:auto;text-align:center;text-transform:uppercase;}@media (min-width:600px){.css-19vbshk{display:inline-block;}}.css-19vbshk p{margin-bottom:auto;margin-right:7px;margin-top:auto;text-transform:none;}.css-l9onyx{color:#ccc;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-bottom:9px;text-align:center;text-transform:uppercase;}@-webkit-keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}.css-1rj8to8{display:inline-block;line-height:1em;}.css-1rj8to8 .css-0{-webkit-text-decoration:none;text-decoration:none;display:inline-block;}.css-4w91ra{display:inline-block;padding-left:3px;}.css-19ln2d8{color:#e2e2e2;margin-right:0.5rem;margin-left:0.5rem;font-size:8px;}.css-1rjzas3{font-family:nyt-imperial,georgia,'times new roman',times,serif;font-style:italic;font-size:1.0625rem;line-height:1.5rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 0.75rem;margin-top:1rem;}@media (min-width:740px){.css-1rjzas3{font-size:1.1875rem;line-height:1.75rem;margin-bottom:1.25rem;}}@media (min-width:1440px){.css-1rjzas3{width:600px;max-width:600px;}}@media print{.css-1rjzas3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@-webkit-keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.css-vdv0al{font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.75rem;line-height:1rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 1em;color:#999;}.css-vdv0al a{color:#999;-webkit-text-decoration:none;text-decoration:none;}.css-vdv0al a:hover{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:1440px){.css-vdv0al{width:600px;max-width:600px;}}@media print{.css-vdv0al{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-vdv0al span{display:none;}}.css-1i2y565 .e6idgb70 + .e1h9rw200{margin-top:0;}.css-1i2y565 .eoo0vm40 + .e1gnsphs0{margin-top:-0.3em;}.css-1i2y565 .e6idgb70 + .eoo0vm40{margin-top:0;}.css-1i2y565 .eoo0vm40 + figure{margin-top:1.2rem;}.css-1i2y565 .e1gnsphs0 + figure{margin-top:1.2rem;}.css-o6xoe7{display:none;}@media (min-width:1024px){.css-o6xoe7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:0;margin-left:auto;width:130px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (min-width:1150px){.css-o6xoe7{width:210px;}}@media print{.css-o6xoe7{display:none;}}.css-1fanzo5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:1rem;}@media (min-width:1024px){.css-1fanzo5{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;height:100%;width:945px;margin-left:auto;margin-right:auto;}}@media (min-width:1150px){.css-1fanzo5{width:1110px;margin-left:auto;margin-right:auto;}}@media (min-width:1280px){.css-1fanzo5{width:1170px;}}@media (min-width:1440px){.css-1fanzo5{width:1200px;}}@media print{.css-1fanzo5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1fanzo5{margin-bottom:1em;display:block;}}.css-53u6y8{margin-left:auto;margin-right:auto;width:100%;}@media (min-width:1024px){.css-53u6y8{margin-left:calc((100% - 600px) / 2);margin-right:0;width:600px;}}@media (min-width:1440px){.css-53u6y8{max-width:600px;width:600px;margin-left:calc((100% - 600px) / 2);}}@media print{.css-53u6y8{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1m50asq{width:100%;vertical-align:top;}.css-z3e15g{position:fixed;opacity:0;-webkit-scroll-events:none;-moz-scroll-events:none;-ms-scroll-events:none;scroll-events:none;top:0;left:0;bottom:0;right:0;-webkit-transition:opacity 0.2s;transition:opacity 0.2s;background-color:#fff;pointer-events:none;}.css-79elbk{position:relative;}.css-v89234{overflow:hidden;height:100%;}@media print{.css-13lpfd6{margin-bottom:15px;}}@media (min-width:1024px){.css-13lpfd6{position:fixed;width:100%;top:0;left:0;z-index:200;background-color:#fff;border-bottom:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}}@media (min-width:1024px){.css-1bymuyk{position:relative;border-bottom:1px solid #e2e2e2;}}.css-1f7ibof{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;left:10px;position:absolute;}@media (min-width:1024px){}@media print{.css-1f7ibof{display:none;}}.css-1wr3we4{display:none;}@media (min-width:1024px){.css-1wr3we4{display:block;position:absolute;left:105px;line-height:19px;top:10px;}}.css-10698na{text-align:center;}@media (min-width:740px){.css-10698na{padding-top:0;}}@media (min-width:1024px){}@media print{.css-10698na a[href]::after{content:'';}.css-10698na svg{fill:black;}}.css-o2c64h{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;position:absolute;right:10px;top:9px;}@media (min-width:1024px){.css-o2c64h{top:4px;}}@media print{.css-o2c64h{display:none;}}.css-3qijnq{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:11px;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;padding:13px 20px 12px;}@media (min-width:740px){.css-3qijnq{position:relative;}}@media (min-width:1024px){.css-3qijnq{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border:none;padding:0;height:0;-webkit-transform:translateY(42px);-ms-transform:translateY(42px);transform:translateY(42px);}}@media print{.css-3qijnq{display:none;}}.css-uqyvli{color:#121212;font-size:13px;font-family:nyt-franklin,helvetica,arial,sans-serif;display:none;width:auto;}@media (min-width:740px){.css-uqyvli{text-align:center;width:100%;}}@media (min-width:1024px){.css-uqyvli{font-size:12px;margin-bottom:10px;width:auto;}}.css-1bvtpon{display:none;}@media (min-width:1024px){}.css-whd2a{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;margin-bottom:0;}@media print{.css-whd2a{display:none;}}.css-1fcn4th{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-1fcn4th a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1fcn4th:nth-of-type(3),.css-1fcn4th:nth-of-type(4){display:none;}}.css-1fcn4th:last-of-type{margin-right:0;}@media (max-width:1150px){.css-1fcn4th:nth-of-type(1),.css-1fcn4th:nth-of-type(2),.css-1fcn4th:nth-of-type(3){display:none;}}.css-13zu7ev{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:14px;height:14px;}.css-13zu7ev.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-13zu7ev.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-13zu7ev.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-13zu7ev.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-13zu7ev.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-13zu7ev.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-13zu7ev.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-13zu7ev:hover{background-color:#fff;border:1px solid #ccc;}.css-f7l8cz{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:14px;height:14px;bottom:4px;}.css-f7l8cz.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-f7l8cz.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-f7l8cz.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-f7l8cz.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-f7l8cz.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-f7l8cz.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-f7l8cz.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-16ogagc{background:transparent;display:inline-block;height:20px;width:20px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:27px;height:27px;}.css-16ogagc.hidden{opacity:0;visibility:hidden;}.css-16ogagc.hidden:focus{opacity:1;}.css-16ogagc:hover{background-color:#fff;border:1px solid #ccc;}.css-1vxca1d{position:relative;margin:0 auto;}@media (min-width:600px){.css-1vxca1d{margin:0 auto 20px;}}.css-1vxca1d .relatedcoverage + .recirculation{margin-top:20px;}.css-1vxca1d .wrap + .recirculation{margin-top:20px;}@media (min-width:1024px){.css-1vxca1d{padding-top:40px;}}.css-1a48zt4{opacity:1;-webkit-transition:opacity 0.3s 0.2s;transition:opacity 0.3s 0.2s;}.css-1b4fpzk{margin:37px auto;margin-top:20px !important;margin-bottom:32px;}.css-1b4fpzk strong{font-weight:700;}.css-1b4fpzk em{font-style:italic;}.css-1b4fpzk.sizeSmall{width:calc(100% - 40px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width:600px){.css-1b4fpzk.sizeSmall{max-width:600px;margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1b4fpzk.sizeSmall{width:100%;}}@media (min-width:1440px){.css-1b4fpzk.sizeSmall{max-width:600px;}}.css-1b4fpzk.sizeSmall.sizeSmallNoCaption{display:block;}@media print{.css-1b4fpzk.sizeSmall.sizeSmallNoCaption{display:none;}}.css-1b4fpzk.sizeMedium{width:100%;max-width:600px;margin-right:auto;margin-left:auto;}@media (min-width:600px){.css-1b4fpzk.sizeMedium{width:calc(100% - 40px);}}@media (min-width:740px){.css-1b4fpzk.sizeMedium{max-width:600px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium{max-width:720px;}}@media (min-width:600px){.css-1b4fpzk.sizeMedium.layoutVertical{width:420px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium.layoutVertical{width:480px;}}.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{width:calc(100% - 40px);}@media (min-width:600px){.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:600px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{width:600px;}}.css-1b4fpzk.sizeLarge{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;}@media (min-width:600px){.css-1b4fpzk.sizeLarge{width:auto;}}@media (min-width:740px){.css-1b4fpzk.sizeLarge.layoutVertical{width:600px;}.css-1b4fpzk.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:1024px){.css-1b4fpzk.sizeLarge{width:945px;}}@media (min-width:1440px){.css-1b4fpzk.sizeLarge{width:1200px;}.css-1b4fpzk.sizeLarge.layoutVertical{width:720px;}.css-1b4fpzk.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:600px){.css-1b4fpzk{margin:43px auto;}}@media print{.css-1b4fpzk{display:none;}}@media (min-width:740px){.css-1b4fpzk{margin-top:25px !important;}}.css-17ai7jg{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;margin:10px 20px 0;text-align:left;}.css-17ai7jg a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-17ai7jg a:hover,.css-17ai7jg a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-17ai7jg{margin-left:0;}}.sizeSmall .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(50% - 15px);margin:auto 0 15px 15px;}@media (min-width:600px){.sizeSmall .css-17ai7jg{width:260px;margin-left:15px;}}@media (min-width:740px){.sizeSmall .css-17ai7jg{margin-left:15px;}}@media (min-width:1440px){.sizeSmall .css-17ai7jg{width:330px;margin-left:15px;}}@media (max-width:600px){.sizeSmall .css-17ai7jg{margin:auto 0 0 15px;}}.sizeSmall.sizeSmallNoCaption .css-17ai7jg{margin-left:auto;margin-right:auto;margin-top:10px;}.sizeMedium .css-17ai7jg{max-width:900px;}.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{margin-left:0;margin-right:0;}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:255px;margin:auto 0 15px 15px;}}@media (min-width:1440px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{width:325px;}}.sizeLarge .css-17ai7jg{max-width:none;}@media (min-width:600px){.sizeLarge .css-17ai7jg{margin-left:20px;}}@media (min-width:740px){.sizeLarge .css-17ai7jg{margin-left:20px;max-width:900px;}}@media (min-width:1024px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:720px;}}@media (min-width:1440px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:900px;}}@media (min-width:740px){.sizeLarge.layoutVertical .css-17ai7jg{margin-left:0;}}.sizeFull .css-17ai7jg{margin-left:20px;}@media (min-width:600px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:740px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:1440px){.sizeFull .css-17ai7jg{max-width:900px;}}@media print{.css-17ai7jg{display:none;}}.css-8i9d0s{margin-right:7px;color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.875rem;line-height:1.125rem;}@media (min-width:740px){.css-8i9d0s{font-size:0.9375rem;line-height:1.25rem;}}.css-8i9d0s strong{font-weight:700;}.css-8i9d0s em{font-style:italic;}.css-8i9d0s a{color:#326891;}.css-8i9d0s a:visited{color:#326891;}.css-1nwzsjy{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-1nwzsjy{font-size:0.75rem;}}@media (min-width:1150px){.css-1nwzsjy{font-size:0.8125rem;}}@media (min-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1024px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1440px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:40px;}}@media (max-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:-8px;}}@media print{.css-1nwzsjy{display:none;}}.css-1ly73wi{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);overflow:hidden;}.css-xt80pu{width:100%;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-xt80pu{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-xt80pu{width:600px;}}@media (min-width:1440px){.css-xt80pu{width:600px;max-width:600px;}}@media print{.css-xt80pu{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-17xsp6v{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;width:100%;}.css-16vrk19{display:inline-block;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#121212;}@media (min-width:740px){.css-16vrk19{font-size:0.9375rem;line-height:1.25rem;}}.css-1riqqik{display:inline;color:#333;}.css-1riqqik span{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#ccc;text-decoration-color:#ccc;}.css-1riqqik span:hover,.css-1riqqik span:focus{-webkit-text-decoration:none;text-decoration:none;}.css-1w5cs23{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-1w5cs23 li{list-style:none;}.css-qddhf4{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.8125rem;line-height:1.125rem;margin-bottom:1rem;margin-bottom:0;margin-top:0;}.css-4brsb6{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:15px;height:15px;}.css-4brsb6.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-4brsb6.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-4brsb6.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-4brsb6.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-4brsb6.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-4brsb6.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-4brsb6.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-4brsb6:hover{background-color:#fff;border:1px solid #ccc;}.css-uhuo44{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:15px;height:15px;bottom:4px;}.css-uhuo44.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-uhuo44.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-uhuo44.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-uhuo44.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-uhuo44.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-uhuo44.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-uhuo44.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-1ygdjhk{margin-bottom:0.75rem;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.0625rem;line-height:1.5rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:740px){.css-1ygdjhk{margin-bottom:1.25rem;}}.css-1ygdjhk .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-1ygdjhk .css-1g7m0tk:hover,.css-1ygdjhk .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-1ygdjhk{font-size:1.1875rem;line-height:1.8125rem;}}.css-1ygdjhk:first-child{margin-top:0;}.css-1ygdjhk:last-child{margin-bottom:0;}@media (min-width:600px){.css-1ygdjhk{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1ygdjhk{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1ygdjhk{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-ar1l6a{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-ar1l6a a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:none;}}.css-ar1l6a:last-of-type{margin-right:0;}.css-ar1l6a:nth-of-type(1),.css-ar1l6a:nth-of-type(2),.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:inline;}.css-1ede5it{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;border-top:1px solid #f3f3f3;margin:37px auto;padding-bottom:30px;padding-top:12px;text-align:center;margin-top:60px;}@media (min-width:740px){.css-1ede5it{margin:43px auto;}}@media print{.css-1ede5it{display:none;}}@media (min-width:740px){.css-1ede5it{margin-bottom:0;margin-top:0;}}.css-2fg4z9{font-style:italic;}.css-vuqh7u{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-vuqh7u{font-size:0.75rem;}}@media (min-width:1150px){.css-vuqh7u{font-size:0.8125rem;}}@-webkit-keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}.css-1ef8w8q{max-width:1200px;margin-left:auto;margin-right:auto;margin:2.3125rem auto;}@media (min-width:600px){.css-1ef8w8q{width:auto;}}@media (min-width:1024px){.css-1ef8w8q{width:945px;}}@media (min-width:1440px){.css-1ef8w8q{width:1200px;}}.css-1ef8w8q strong{font-weight:700;}.css-1ef8w8q em{font-style:italic;}@media (min-width:740px){.css-1ef8w8q{margin:2.6875rem auto;}}.css-18crmh6{font-family:nyt-imperial,georgia,'times new roman',times,serif;color:#666;margin:10px 20px 0 20px;text-align:left;max-width:none;}.css-18crmh6 a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-18crmh6 a:hover,.css-18crmh6 a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-18crmh6{margin-left:0;margin-right:20px;}}@media (min-width:600px){.css-18crmh6{margin-left:20px;}}@media (min-width:740px){.css-18crmh6{margin-left:20px;}}@media (min-width:1024px){.css-18crmh6{max-width:720px;margin-left:0;}}@media (min-width:1440px){.css-18crmh6{width:900px;margin-left:0;}}.css-sbs9ef{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:400;font-size:1.625rem;line-height:1.875rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;margin:30px 20px 0.75rem;text-align:left;}@media (min-width:740px){.css-sbs9ef{font-size:1.75rem;line-height:2.125rem;}}.css-sbs9ef .css-1g7m0tk{border-bottom:1px solid #6288a5;-webkit-text-decoration:none;text-decoration:none;}.css-sbs9ef .css-1g7m0tk:hover,.css-sbs9ef .css-1g7m0tk:focus{border-bottom:1px solid #b3c4ca;-webkit-text-decoration:none;text-decoration:none;}.css-sbs9ef:first-child{margin-top:0;}.css-sbs9ef:last-child{margin-bottom:0;}@media (min-width:600px){.css-sbs9ef{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-sbs9ef{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-sbs9ef{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-sbs9ef{margin-top:35px;margin-left:auto;margin-right:auto;margin-bottom:1.25rem;}}@media print{.css-sbs9ef{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-xnyrcs{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:200;font-style:normal;font-size:2.125rem;line-height:2.375rem;margin:0 20px 1rem;position:relative;text-align:left;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:740px){.css-xnyrcs{font-size:2.75rem;line-height:3.125rem;}}@media (min-width:1150px){.css-xnyrcs{font-size:3.125rem;line-height:3.4375rem;}}@media (min-width:600px){.css-xnyrcs{margin-left:auto;margin-right:auto;}}@media print{.css-xnyrcs{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:600px){.css-xnyrcs{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-xnyrcs{width:600px;}}@media (min-width:1440px){.css-xnyrcs{width:600px;max-width:600px;}}@media print{.css-xnyrcs{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-15g2oxy{margin-top:1rem;}.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.css-1yil5bp{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.8125rem;line-height:1.125rem;margin-bottom:1rem;}.css-wg1cha{margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-wg1cha{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 1em;}}@media (min-width:1440px){.css-wg1cha{width:600px;max-width:600px;margin:1.5rem auto 1em;}}.css-z6dj7x{font-style:normal;font-stretch:normal;margin-bottom:1.6rem;color:#333;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:300;-webkit-letter-spacing:0.005em;-moz-letter-spacing:0.005em;-ms-letter-spacing:0.005em;letter-spacing:0.005em;font-size:1.25rem;line-height:1.5625rem;text-align:left;margin:0 20px 1.6rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:740px){.css-z6dj7x{font-size:1.375rem;line-height:1.75rem;}}@media (min-width:600px){.css-z6dj7x{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-z6dj7x{width:600px;}}@media (min-width:1440px){.css-z6dj7x{width:600px;max-width:600px;}}@media print{.css-z6dj7x{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-x8f8u9{font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;}.css-x8f8u9 p{margin-bottom:0.75rem;}.css-x8f8u9 a,.css-x8f8u9 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-x8f8u9 a:hover,.css-x8f8u9 a:focus{color:#326891;}@media print{.css-x8f8u9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-x8f8u9{font-size:1rem;line-height:1.375rem;}}.css-x8f8u9 p{margin-bottom:0.75rem;}.css-x8f8u9 a,.css-x8f8u9 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-x8f8u9 a:hover,.css-x8f8u9 a:focus{color:#326891;}@media print{.css-x8f8u9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-q7vr1p{margin-top:0.3125rem;}.css-q7vr1p .e6idgb70{margin-top:1.875rem;color:#121212;font-weight:700;line-height:0.75rem;margin-bottom:0.625rem;margin-left:auto;}@media print{.css-q7vr1p .e6idgb70{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-q7vr1p .e1h9rw200{margin-bottom:1rem;margin-bottom:10px;}.css-q7vr1p .e1wiw3jv0{color:#333;}@media (min-width:740px){.css-q7vr1p .e1wiw3jv0{text-align:left;}}.css-q7vr1p .e16638kd0{width:auto;margin-bottom:0;margin-left:0;display:inline-block;}.css-q7vr1p .euiyums0{margin-bottom:20px;color:#121212;}@media print{.css-q7vr1p .euiyums0{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-q7vr1p .euiyums0{text-align:left;}}@media (min-width:600px){.css-q7vr1p{margin-top:0.9375rem;}}@media (min-width:1024px){.css-q7vr1p{margin-top:2.8125rem;}}.css-nzv8co{min-width:60px;display:inline-block;margin-left:-3px;}.css-q08c2r{width:50px;margin-right:10px;vertical-align:bottom;}.css-1o4azrb{margin-bottom:1rem;}.css-1o4azrb .e16638kd0{color:#999;margin-top:5px;margin-bottom:0;display:inline-block;font-size:0.75rem;line-height:1.0625rem;}.css-1o4azrb:hover .e16ij5yr2,.css-1o4azrb:visited .e16ij5yr2{color:#666;}.css-1o4azrb .css-1g7m0tk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:100px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1u39xnq{font-size:1.1875rem;line-height:1.4375rem;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:500;color:#121212;margin-right:10px;display:inline;}.css-rxyfbr{margin-left:15px;width:120px;min-width:120px;}@media (min-width:740px){.css-rxyfbr{width:165px;min-width:165px;}}.css-32rbo2{width:100%;min-width:120px;}.css-t9vhop{max-width:1200px;margin-left:auto;margin-right:auto;margin:2.3125rem auto;}@media (min-width:600px){.css-t9vhop{width:auto;}}@media (min-width:1024px){.css-t9vhop{width:945px;}}@media (min-width:1440px){.css-t9vhop{width:1200px;}}@media (min-width:600px){.css-t9vhop{width:600px;}}@media (min-width:1440px){.css-t9vhop{width:720px;}}@media (min-width:740px){.css-t9vhop .e1xdpqjp0{margin-left:0;}}.css-t9vhop strong{font-weight:700;}.css-t9vhop em{font-style:italic;}@media (min-width:740px){.css-t9vhop{margin:2.6875rem auto;}}.css-ys65w5{margin:0.5rem 0 1.5rem;padding-top:1rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}.css-ys65w5:before{content:'';display:block;width:100%;margin-bottom:0.5rem;border-bottom:1px solid #e2e2e2;}.css-ys65w5:after{content:'';display:block;width:100%;margin-top:0.5rem;border-bottom:1px solid #e2e2e2;}.css-ys65w5 .e16ij5yr6{border-top:none;}@media (min-width:600px){.css-ys65w5{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-ys65w5{width:600px;}}@media (min-width:1440px){.css-ys65w5{width:600px;max-width:600px;}}@media print{.css-ys65w5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@-webkit-keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}@keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}
+ ]]>
+ </style>
+ <script>
+ <![CDATA[
+ window.__emotion = ["0","1dv1kvn","nuvmzp","1gz70xg","9e9ivx","2bwtzy","6n7j50","1kj7lfb","10m9xeu","vz7hjd","1fe7a5q","1rn5q1r","10488qs","1iruc8t","1ropbjl","uw59u","jxzr5i","oylsik","1otr2jl","1c8n994","qtw155","v0l3hm","g4gku8","1rr4qq7","6xhk3s","rxqrcl","tj0ten","ist4u3","1gprdgz","10t7hia","mzqdl","kwpx34","1k2cjfc","1vhk1ks","6td9kr","r5ic95","15uy5yv","1p8nkc0","1hyfx7x","f8wsfj","mhvv8m","1c5cfvc","htgkrt","e64et","9zaqp9","16fq4rz","1kjk1j2","88g286","12yx39b","4hu8jm","1wqz2f4","yl3z84","1q3gjvc","nc39ev","amd09y","ru1vxe","ajnadh","1g7m0tk","acwcvw","zjzyr8","1m9j9gf","1b9egsl","1baulvz","7y3qfv","1waixk9","l2ztic","19lv58h","mgtjo2","nhjhh0","1bnxwmn","1nkps6a","1i8g3m4","1uqjmks","1xdhyk6","mn5hq9","1qmnftd","1ho5u4o","13o0c9t","1yo489b","qremme","1f85ym4","7inim5","133m5b6","1lc20wh","bsn42l","11cwn6f","hn080","y8aj3r","60hakz","i29ckm","1ri25x2","12fr9lp","1hfdzay","k008qs","eqw76k","m6xlts","1ahhg7f","rs6kf8","17xtcya","x15j1o","19gb6gw","1iwv8en","1sy8kpn","19vbshk","l9onyx","b7n1on","1rj8to8","4w91ra","19ln2d8","1rjzas3","1egl8em","vdv0al","1i2y565","o6xoe7","1fanzo5","53u6y8","1m50asq","z3e15g","79elbk","v89234","13lpfd6","1bymuyk","1f7ibof","1wr3we4","10698na","o2c64h","3qijnq","uqyvli","1bvtpon","whd2a","1fcn4th","13zu7ev","f7l8cz","16ogagc","1vxca1d","1rk3iho","1a48zt4","1b4fpzk","17ai7jg","8i9d0s","1nwzsjy","1ly73wi","xt80pu","17xsp6v","16vrk19","1riqqik","1w5cs23","qddhf4","4brsb6","uhuo44","1ygdjhk","ar1l6a","1ede5it","2fg4z9","vuqh7u","g7rb99","1ef8w8q","18crmh6","sbs9ef","xnyrcs","15g2oxy","i9gxme","1yil5bp","wg1cha","z6dj7x","x8f8u9","q7vr1p","nzv8co","q08c2r","1o4azrb","1u39xnq","rxyfbr","32rbo2","t9vhop","ys65w5","m6999o"]
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (function () { var _f=function(t,e,n){var a=window,A=document,o=function(t){var e=A.createElement("style");e.appendChild(A.createTextNode(t)),A.querySelector("head").appendChild(e)},r=function(t,e,n,a,A){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){o(r.responseText);try{localStorage.setItem("nyt-fontFormat",e),localStorage.setItem(a,n)}catch(t){return}localStorage.setItem(A,r.responseText)}return!0},r.send(null)},c=function(e,n){var A;try{A=localStorage.getItem("nyt-fontFormat")}catch(t){}A||(A=function(){if(!("FontFace"in a))return!1;var t=new FontFace("t",'url("data:application/font-woff2;base64,d09GMgABAAAAAADcAAoAAAAAAggAAACWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABk4ALAoUNAE2AiQDCAsGAAQgBSAHIBtvAcieB3aD8wURQ+TZazbRE9HvF5vde4KCYGhiCgq/NKPF0i6UIsZynbP+Xi9Ng+XLbNlmNz/xIBBqq61FIQRJhC/+QA/08PJQJ3sK5TZFMlWzC/iK5GUN40psgqvxwBjBOg6JUSJ7ewyKE2AAaXZrfUB4v+hze37ugJ9d+DeYqiDwVgCawviwVFGnuttkLqIMGivmDg") format("woff2")',{});return t.load().catch(function(){}),"loading"==t.status||"loaded"==t.status}()?"woff2":"woff");for(var c=0;c<e.length;c++){var i=e[c],l="shared"!==i?"-"+i:"",d="nyt-fontHash"+l,s="nyt-fontFace"+l,f=t[i][A],u=localStorage.getItem(d),g=localStorage.getItem(s);if(u===f.hash&&g)o(g);else{var h=function(t,e,n,a,A){return function(){r(t,e,n,a,A)}}(f.url,A,f.hash,d,s);n?h():document.addEventListener("DOMContentLoaded",h)}}};c(e),window.addEventListener("load",function(){c(n,!0)})};;_f.apply(null, [{"shared":{"woff":{"hash":"f2adc73415c5bbb437e993c14559e70e","url":"/vi-assets/static-assets/shared-woff.fonts-f2adc73415c5bbb437e993c14559e70e.css"},"woff2":{"hash":"22b34a6a6fd840943496b658184afdd3","url":"/vi-assets/static-assets/shared-woff2.fonts-22b34a6a6fd840943496b658184afdd3.css"}},"story":{"woff":{"hash":"d5c4f7d33f59d401af5121eb86eade0d","url":"/vi-assets/static-assets/story-woff.fonts-d5c4f7d33f59d401af5121eb86eade0d.css"},"woff2":{"hash":"8cda51537d027e0df92bea96a094bfe3","url":"/vi-assets/static-assets/story-woff2.fonts-8cda51537d027e0df92bea96a094bfe3.css"}},"opinion":{"woff":{"hash":"dfc5106c9c0aaa76688687e664474b04","url":"/vi-assets/static-assets/opinion-woff.fonts-dfc5106c9c0aaa76688687e664474b04.css"},"woff2":{"hash":"e2b27ff317927dfd77bdd429409627e0","url":"/vi-assets/static-assets/opinion-woff2.fonts-e2b27ff317927dfd77bdd429409627e0.css"}},"tmag":{"woff":{"hash":"4634f3c7ddebb9113b69d4578d9a0ba0","url":"/vi-assets/static-assets/tmag-woff.fonts-4634f3c7ddebb9113b69d4578d9a0ba0.css"},"woff2":{"hash":"8622c93c260fa93b229b7249df708fb1","url":"/vi-assets/static-assets/tmag-woff2.fonts-8622c93c260fa93b229b7249df708fb1.css"}},"mag":{"woff":{"hash":"109e6d301ed49c8078086b5892696adf","url":"/vi-assets/static-assets/mag-woff.fonts-109e6d301ed49c8078086b5892696adf.css"},"woff2":{"hash":"fb42c728dc70cc4ef6010a60cb10b0bd","url":"/vi-assets/static-assets/mag-woff2.fonts-fb42c728dc70cc4ef6010a60cb10b0bd.css"}},"well":{"woff":{"hash":"f0e613b89006e99b4622d88aa5563a81","url":"/vi-assets/static-assets/well-woff.fonts-f0e613b89006e99b4622d88aa5563a81.css"},"woff2":{"hash":"77806b85de524283fe742b916c9d0ee4","url":"/vi-assets/static-assets/well-woff2.fonts-77806b85de524283fe742b916c9d0ee4.css"}}},["shared","story"],["opinion","tmag","mag","well"]]); })();
+ (function() {
+ var thisHour = (new Date()).getHours();
+ var styles = '[data-timezone][data-timezone~="' + thisHour +'"] { display: block }';
+ var s = document.createElement('style');
+ s.innerHTML = styles;
+ document.head.appendChild(s);
+ })();
+
+ !function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};
+ g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});
+ g.o.observe({entryTypes:['longtask']})}}();
+
+
+ !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
+
+ try {
+ var observer = new window.PerformanceObserver(function (list) {
+ var entries = list.getEntries();
+
+ for (var i = 0; i < entries.length; i += 1) {
+ var entry = entries[i];
+ var performance = {};
+
+ performance[entry.name] = Math.round(entry.startTime + entry.duration);
+ (window.dataLayer = window.dataLayer || []).push({
+ event: "performance",
+ pageview: {
+ performance: performance
+ }
+ });
+ }
+ });
+ observer.observe({
+ entryTypes: ["paint"]
+ });
+ } catch (e) {}
+ ]]>
+ </script>
+ <style>
+ <![CDATA[
+ [data-timezone] { display: none }
+ ]]>
+ </style>
+ </head>
+ <body>
+ <div id="swg-script"></div>
+ <script>
+ <![CDATA[
+ window.swgUserInfoXhrObject.checkSwgResponse = false;
+ !function(){function e(e){window.console.log("aborted ".concat(e)),window.swgUserInfoXhrObject.checkSwgResponse={};var t=new Event("aborted");return window.swgUserInfoXhrObject.dispatchEvent(t),window.swgUserInfoXhrObject.abort(),!1}function t(e){return!!window.dataLayer&&((window.dataLayer=window.dataLayer||[]).push({event:"impression",module:e}),!0)}function n(){return"undefined"==typeof window?e("no window"):-1!==document.cookie.indexOf("NYT-S")?e("NYT-S"):!0===function(){if(!window.localStorage)return!1;var e=window.localStorage.getItem("nyt-swgOptOut");if(!e)return!1;var t=parseInt(e,10);return((new Date).getTime()-t)/864e5<1||(window.localStorage.removeItem("nyt-swgOptOut"),!1)}()?e("opt-out"):window.SWG?((window.SWG=window.SWG||[]).push(function(n){return n.init(vi.env.SWG_PUBLICATION_ID),n.getEntitlements().then(function(o){if(void 0===o||!o.raw)return e("entitlements 1");var a={entitlements_token:o.raw};return window.swgUserInfoXhrObject.withCredentials=!0,window.swgUserInfoXhrObject.open("POST","".concat(vi.env.AUTH_HOST,"/svc/account/auth/v1/login-swg-web"),!0),window.swgUserInfoXhrObject.setRequestHeader("Content-Type","application/json"),window.swgUserInfoXhrObject.send(JSON.stringify(a)),window.swgUserInfoXhrObject.onload=function(){switch(window.swgUserInfoXhrObject.status){case 200:return t({name:"swg",context:"Seamless",label:"Seamless Signin",region:"login"}),window.location.reload(!0),!0;case 412:return e("412"),function(e,n){return e.completeDeferredAccountCreation({entitlements:n,consent:!1}).then(function(e){var n="".concat(vi.env.AUTH_HOST,"/svc/account/auth/v1/swg-dal-web"),o=e.purchaseData.raw.data?e.purchaseData.raw.data:e.purchaseData.raw,a=JSON.parse(o),r={package_name:a.packageName,product_id:a.productId,purchase_token:a.purchaseToken,google_id_token:e.userData.idToken,google_user_email:e.userData.email,google_user_id:e.userData.id,google_user_name:e.userData.name},i=new XMLHttpRequest;i.withCredentials=!0,i.open("POST",n,!0),i.setRequestHeader("Content-Type","application/json"),i.send(JSON.stringify(r)),i.onload=function(){200===i.status?(t({name:"swg",context:"Deferred",label:"Seamless Signin",region:"swg-modal"}),e.complete().then(function(){window.location.reload(!0)})):(e.complete(),window.location=encodeURI("".concat(vi.env.AUTH_HOST,"/get-started/swg-link?redirect=").concat(window.location.href)))}}).catch(function(){return!!window.localStorage&&!window.localStorage.getItem("nyt-swgOptOut")&&(window.localStorage.setItem("nyt-swgOptOut",(new Date).getTime()),!0)}),!0}(n,o);default:return e(window.swgUserInfoXhrObject.status)}},o}).catch(function(){return e("entitlements 2")}),!0}),!0):e("swg")}if(-1===document.cookie.indexOf("NYT-S")){var o=document.createElement("script");o.src="https://news.google.com/swg/js/v1/swg.js",o.setAttribute("subscriptions-control","manual"),o.setAttribute("async",!0),o.onload=function(){n()},o.onerror=function(){e("swg")},document.getElementById("swg-script").appendChild(o)}}();
+ ]]>
+ </script>
+ <div id="app">
+ <div class="css-v89234 e3w10z60">
+ <div>
+ <div>
+ <div class="css-13lpfd6 e1nre7570">
+ <header class="css-1bymuyk e1nre7571">
+ <section class="css-1waixk9 e1nre7572">
+ <div class="css-1f7ibof emxkhtz0">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="Sections Navigation &amp; Search" class="emxkhtz1 css-l2ztic" data-testid="nav-button"><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <rect x="1" y="3" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="7" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button>
+ </div><button id="desktop-sections-button" aria-label="Sections Navigation" class="css-19lv58h emxkhtz2"><span class="css-vz7hjd">Sections</span><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <rect x="1" y="3" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="7" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button>
+ <div class="css-10488qs">
+ <button class="css-mgtjo2 e1a6adlb0" data-test-id="search-button"><span class="css-vz7hjd">SEARCH</span><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <path fill="#333" d="M11.3,9.2C11.7,8.4,12,7.5,12,6.5C12,3.5,9.5,1,6.5,1S1,3.5,1,6.5S3.5,12,6.5,12c1,0,1.9-0.3,2.7-0.7l3.3,3.3c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4c0.6-0.6,0.6-1.5,0-2.1L11.3,9.2zM6.5,10.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.7,3.8,3.8C10.3,8.6,8.6,10.3,6.5,10.3z"></path></svg></button>
+ </div><a class="css-1rn5q1r" href="#site-content">Skip to content</a><a class="css-1rn5q1r" href="#site-index">Skip to site index</a>
+ </div>
+ <div class="css-1wr3we4 e14k9kmx0">
+ <a href="https://www.nytimes.com/section/nyregion" class="css-nuvmzp">New York</a>
+ </div>
+ <div class="css-10698na e1ngbli50">
+ <a aria-label="New York Times Logo. Click to visit the homepage" class="css-nhjhh0 e1ngbli51" href="/"><svg xmlns="http://www.w3.org/2000/svg" class="" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a>
+ </div>
+ <div class="css-o2c64h e1c1i1hy1">
+ <a href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU.html?campaignId=6W74R" class="css-1kj7lfb nytcp-opt" data-testid="subscribe-button"><button class="css-1bnxwmn e1c1i1hy0">Subscribe</button>
+ <div class="optimizelyOK vi_bar1 css-1nkps6a"></div></a><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1kj7lfb"><button class="css-1bnxwmn e1c1i1hy0" data-testid="login-button">Log In</button></a>
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="User Settings" class="e1c1i1hy4 css-1i8g3m4" data-testid="user-settings-button"><svg class="css-10m9xeu" viewbox="0 0 16 16" fill="#333">
+ <path d="M8,10c-2.5,0-7,1.1-7,3.5V16h14v-2.5C15,11.1,10.5,10,8,10z"></path>
+ <circle cx="8" cy="4" r="4"></circle></svg></button>
+ </div>
+ </div>
+ </section>
+ <section class="hasLinks css-3qijnq ea53akk3">
+ <div class="css-uqyvli ea53akk0"></div>
+ <div class="css-1uqjmks ea53akk1"></div>
+ <div class="css-9e9ivx">
+ <a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1gz70xg">Log In</a>
+ </div>
+ <div class="css-1bvtpon ea53akk2">
+ <a href="https://www.nytimes.com/section/todayspaper" class="css-2bwtzy">Today’s Paper</a>
+ </div>
+ </section>
+ </header>
+ </div>
+ </div>
+ <main id="site-content">
+ <div>
+ <div class="css-eqw76k" style="opacity:0.000000001;z-index:-1;visibility:hidden">
+ <div class="css-m6xlts">
+ <div class="css-1ahhg7f">
+ <span class="css-17xtcya"><a href="/section/nyregion">New York</a></span><span class="css-x15j1o">|</span><span class="css-rs6kf8">Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C.</span>
+ </div>
+ <div class="css-k008qs">
+ <div class="css-1iwv8en">
+ <a href="/"><svg class="css-1ri25x2" viewbox="0 0 16 22">
+ <path d="M15.863 13.08c-.687 1.818-1.923 3.147-3.64 3.916v-3.917l2.129-1.958-2.129-1.889V6.505c1.923-.14 3.228-1.609 3.228-3.358C15.45.84 13.32 0 12.086 0c-.275 0-.55 0-.962.14v.14h.481c.824 0 1.51.42 1.51 1.189 0 .63-.48 1.189-1.304 1.189-2.129 0-4.6-1.749-7.279-1.749C2.13.91.481 2.728.481 4.546c0 1.819 1.03 2.448 2.128 2.798v-.14c-.343-.21-.618-.63-.618-1.189 0-.84.756-1.469 1.648-1.469 2.267 0 5.906 1.959 8.172 1.959h.206v2.727l-2.129 1.889 2.13 1.958v3.987c-.894.35-1.786.49-2.748.49-3.502 0-5.768-2.169-5.768-5.806 0-.839.137-1.678.344-2.518l1.785-.769v7.973l3.57-1.608V6.575L3.984 8.953c.55-1.61 1.648-2.728 2.953-3.358v-.07C3.433 6.295 0 9.023 0 13.08c0 4.686 3.914 7.974 8.446 7.974 4.807 0 7.485-3.288 7.554-7.974h-.137z" fill="#000"></path></svg></a>
+ <div>
+ <span class="css-1hfdzay"><a href="/" aria-label="New York Times Logo. Click to visit the homepage"><svg xmlns="http://www.w3.org/2000/svg" class="css-12fr9lp" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></span>
+ </div>
+ </div>
+ <div class="css-19gb6gw">
+ <div class="">
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-whd2a" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-1fcn4th">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html&amp;smid=fb-share&amp;name=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-13zu7ev" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NlStKo&amp;text=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-13zu7ev" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <a href="mailto:?subject=NYTimes.com%3A%20Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AManhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.%0A%0ANew%20York%E2%80%99s%20aging%20below-street%20infrastructure%20is%20tough%20to%20maintain%2C%20and%20the%20corrosive%20rock%20salt%20and%20%E2%80%9Cfreeze-thaw%E2%80%9D%20cycles%20of%20winter%20make%20it%20even%20worse.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-13zu7ev" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-f7l8cz" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <meta itemprop="isAccessibleForFree" content="false" /><span itemprop="isPartOf" itemscope="itemscope" itemtype="http://schema.org/CreativeWork%20http://schema.org/Product">
+ <meta itemprop="name" content="The New York Times Company" />
+ <meta itemprop="productID" content="nytimes.com:basic" /></span>
+ <article id="story" class="css-1vxca1d e1qksbhf0">
+ <div id="top-wrapper" class="css-1sy8kpn">
+ <div id="top" style="display: block; height: 100%; min-height: 90px; text-align: center;"></div>
+ </div>
+ <header class="css-q7vr1p euiyums1">
+ <div id="sponsor-wrapper" class="css-1hyfx7x">
+ <div id="sponsor-slug" class="css-19vbshk">
+ <p>
+ Supported by
+ </p>
+ </div>
+ <div class="ad sponsor-wrapper" style="text-align:center;height:100%;display:block">
+ <div id="sponsor"></div>
+ </div>
+ </div>
+ <div class="css-1rk3iho ehdk2mb0">
+ <h1 class="css-xnyrcs e1h9rw200" itemprop="headline" id="link-4e7fffd5">
+ <span>Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C.</span>
+ </h1>
+ </div>
+ <p class="css-z6dj7x e1wiw3jv0">
+ New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse.
+ </p>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="sizeLarge layoutHorizontal css-1b4fpzk toneFeature" aria-label="media" role="group" itemscope="itemscope" itemprop="associatedMedia" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-bsn42l">
+ <span class="css-1dv1kvn">Image</span><img alt="" class="css-11cwn6f" src="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 80vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilities1/merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" />
+ </div>
+ <figcaption itemprop="caption description" class="css-17ai7jg emkp2hg0">
+ <span class="css-8i9d0s e13ogyst0">A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground.</span><span itemprop="copyrightHolder" class="emkp2hg2 css-1nwzsjy e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span><span class="css-1dv1kvn">Credit</span><span>Chang W. Lee/The New York Times</span></span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-xt80pu euiyums0">
+ <div class="css-acwcvw">
+ <div class="css-17xsp6v epjyd6m0">
+ <div class="css-nzv8co ey68jwv0">
+ <a href="https://www.nytimes.com/by/corey-kilgannon"><img alt="Corey Kilgannon" title="Corey Kilgannon" src="https://static01.nyt.com/images/2018/02/20/multimedia/author-corey-kilgannon/author-corey-kilgannon-thumbLarge.jpg" class="css-q08c2r ey68jwv2" /></a>
+ </div>
+ <div class="css-1baulvz">
+ <p class="css-16vrk19 e1jsehar1" itemprop="author creator" itemscope="itemscope" itemtype="http://schema.org/Person" itemid="">
+ By<!-- --> <a href="https://www.nytimes.com/by/corey-kilgannon" class="css-1riqqik e1jsehar0"><span class="css-1baulvz" itemprop="name">Corey Kilgannon</span></a>
+ </p>
+ </div>
+ </div>
+ <ul class="css-1w5cs23 epjyd6m1">
+ <li>
+ <time class="css-qddhf4 e16638kd0" datetime="2019-02-21">Feb. 21, 2019</time>
+ </li>
+ <li class="css-6n7j50">
+ <div class="">
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-hn080" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-60hakz">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html&amp;smid=fb-share&amp;name=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NlStKo&amp;text=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-4brsb6" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <a href="mailto:?subject=NYTimes.com%3A%20Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AManhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.%0A%0ANew%20York%E2%80%99s%20aging%20below-street%20infrastructure%20is%20tough%20to%20maintain%2C%20and%20the%20corrosive%20rock%20salt%20and%20%E2%80%9Cfreeze-thaw%E2%80%9D%20cycles%20of%20winter%20make%20it%20even%20worse.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-4brsb6" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </header>
+ <section name="articleBody" itemprop="articleBody" class="css-1i2y565">
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ <em class="css-2fg4z9 e1gzwzxm0">[What you need to know to start the day:</em> <a class="css-1g7m0tk" href="https://www.nytimes.com/newsletters/newyorktoday?module=inline" title=""><em class="css-2fg4z9 e1gzwzxm0">Get New York Today in your inbox</em></a><em class="css-2fg4z9 e1gzwzxm0">.]</em>
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ A series of recent <a class="css-1g7m0tk" href="https://nypost.com/2019/02/17/manhole-fires-force-theater-evacuations-in-midtown/" title="" rel="noopener noreferrer" target="_blank">manhole fires</a> in the heart of Manhattan forced the evacuation of several theaters and was a stark reminder that the subway is not the only creaky infrastructure beneath the streets of New York City.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Underground lies a chaotic assemblage of utilities that, much like the subway, are lifelines for the city: a sprawling tangle of water mains, power cables, gas and steam lines, telecom wires and sewers.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The city has one of the oldest and largest networks of subterranean infrastructure in the world, with some portions dating more than a century and prone to leaks and cracks.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ And <!-- -->winter<!-- --> — from the corrosive rock salt used on streets and sidewalks to “freeze-thaw” cycles that weaken pipes — makes infrastructure problems even worse.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ In the late 1800s, many of the city’s overhead utilities were buried to lessen the exposure to winter weather. “People think it’s all protected and safe, but it’s really not,” said Patrick McHugh, vice president of electrical engineering and planning for Con Edison, which maintains about 90,000 miles of underground cable in the city.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “You have water, sewage, electricity and gas down there, and people don’t appreciate the effort that goes into keeping all that working,” he added.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-1ef8w8q e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span><img alt="" class="css-1m50asq" src="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-superJumbo.jpg?quality=90&amp;auto=webp 2000w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 80vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK15/merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" />
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">In the late 1800s, overhead utilities were buried to lessen the exposure to winter weather.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Kirsten Luce for The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-32de4094">
+ Rock salt on icy streets can cause mayhem below them
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ When rock salt melts ice, and the water seeps down manholes and into electrical units, it can set off fires and explosions strong enough to pop a 300-pound manhole cover five stories into the air.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ For days after a storm, Con Edison officials say, they often deal with scores of electrical fires caused by the rock salt eating away at electrical cable insulation. The wet salt can create sparking that burns the insulation, producing both fire and gases that can combust and pop the manhole lids.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ To alleviate the threat, the officials said, the utility switched most of its manhole covers to vented ones that allow gases to escape, “so they cannot form a combustible amount,” Mr. McHugh said.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ “It also lets smoke escape, which can tip off the public to notify the authorities,” he added.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Winter can also bring an increase in gas-line breakages. Con Edison, which maintains 4,300 miles of gas mains in and around New York City, records about 500 leaks — most of them nonemergencies — in a typical month, but many more in winter.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Even this past January, which was unseasonably mild, there were 750 leaks, Con Edison officials said.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-1ef8w8q e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK11/merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span>
+ <div class="css-zjzyr8">
+ <div data-testid="lazyimage-container" style="height:257.77777777777777px"></div>
+ </div>
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">There are typically between 400 and 600 water main breaks each year in New York City, an official said.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Michael Appleton for The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-470a509">
+ ‘Freeze-thaws’ linked to climate change can imperil utilities
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ The extreme temperature swings that many researchers link to climate change are adding to the challenges of winter.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Officials monitor weather forecasts closely for freeze-thaw cycles, when they put extra repair crews on call.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ During a polar vortex in late January, for instance, single-digit temperatures in the city quickly ballooned into the 50s. The thaw, much welcomed by many New Yorkers, worried Tasos Georgelis, deputy commissioner for water and sewer operations at the Department of Environmental Protection, which operates the city’s <a class="css-1g7m0tk" href="https://www.nytimes.com/interactive/2016/03/24/nyregion/how-nyc-gets-its-water-new-york-101.html?action=click&amp;contentCollection=New%20York&amp;region=Footer&amp;module=inline&amp;version=WhatsNext&amp;contentID=WhatsNext&amp;moduleDetail=undefined&amp;pgtype=Multimedia" title="">water system</a>.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” Mr. Georgelis said.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Along the city’s roughly 6,500 miles of water mains, there are typically between 400 and 600 breaks a year, he added. The majority occur in winter, when the cold can make older cast-iron mains brittle.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Environmental Protection officials said the department repaired 75 water-main breaks in January, including one in Lower Manhattan that disrupted rush-hour subway service and another on the West Side that snarled traffic and left nearby buildings without water for hours.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The city’s 7,500 miles of sewer lines are less affected by cold weather because they are generally buried deeper than other utilities, below the frost line, agency officials said.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-t9vhop e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/21/nyregion/21winterutilitiesOAK13/merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span>
+ <div class="css-zjzyr8">
+ <div data-testid="lazyimage-container" style="height:560.0222222222222px"></div>
+ </div>
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">In 1978, a water main break caused severe flooding in Bushwick, Brooklyn.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Fred R. Conrad/The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-4c678ca">
+ How to replace century-old utilities: slowly, and carefully
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Upgrading the city’s below-street utilities is a slow, painstaking process, “because you have such a fixed-in-place system,” said Rae Zimmerman, a research professor of planning and public administration at New York University.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ But there is progress. Con Edison officials said they had begun replacing the city’s nearly 1,600 miles of natural gas lines — which were made of either cast iron or unprotected steel — with plastic piping. The plastic is less susceptible to corrosion, cracks and leaks, said the officials, who added that they were swapping about 100 miles of line each year.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The city is also replacing older, leak-prone <!-- -->water and sewer mains.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Some pipes that are more than a century old hold up because they were built with a thicker grade of cast iron, according to Environmental Protection Department officials. For less healthy ones, the agency has invested more than $1 billion in the past five years — with an additional $1.4 billion budgeted over the next five years — for upgrades and replacements. New pipes will be made of a more durable, graphite-rich cast iron known as <!-- -->ductile <!-- -->iron.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-1ef8w8q e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2017/12/07/nyregion/00winter4/00winter4-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span>
+ <div class="css-zjzyr8">
+ <div data-testid="lazyimage-container" style="height:257.77777777777777px"></div>
+ </div>
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">Matt Cruz snowboarded through Manhattan’s Lower East Side after a snowstorm in 2016 left the streets coated in slush and rock salt.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Hiroko Masuike/The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-132c3a6b">
+ Construction during the winter isn’t always a good idea
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Of course, winter also poses problems aboveground. Most nonemergency repair and construction work involving concrete is halted because concrete and some types of dirt, used to fill in trenches, freeze in colder temperatures, said Ian Michaels, a spokesman for the city’s Department of Design and Construction.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Digging by hand is also a challenge in frozen ground, so many excavations that are close to pipes and other utilities are put off, Mr. Michaels said.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ And asphalt is harder to obtain because it must be kept and transported at high temperatures, he added.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ In the extreme cold, city officials will not risk shutting down water mains for construction because spillage into the street could freeze, Mr. Michaels said. He added that stopping the water flow could freeze the private water-service connections that branch off the mains, he said.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Even the basic task of locating utilities under the street can be complicated because infrastructure has been added piecemeal over the decades.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-1ef8w8q e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/15/nyregion/00winterutilitiesOAK12/merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span>
+ <div class="css-zjzyr8">
+ <div data-testid="lazyimage-container" style="height:258.4222222222222px"></div>
+ </div>
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">A water main break in Manhattan in 2014. “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” said Tasos Georgelis of the city's Department of Environmental Protection.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Ãngel Franco/The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-7ba21106">
+ Almost 1.8 million potholes filled since de Blasio took office
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Street surfaces are affected by winter weather, too: Last year, the city filled 255,904 potholes.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ And should anyone forget that filling potholes, like snow removal, is a sacred staple of constituent services, transportation officials have compiled the number of potholes the city has filled — more than 1,786,300<!-- --> — since Mayor Bill de Blasio took office in 2014<!-- -->.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Potholes form when water and salt seep into cracks, freeze and expand, creating a larger crevice, said Joe Carbone, who works for the Transportation Department, where he is known as the pothole chief.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Simply put, more freeze-thaw cycles <a class="css-1g7m0tk" href="https://www.nytimes.com/2011/02/07/nyregion/07pothole.html?module=inline" title="">result in more potholes</a>, he said. Currently, the department has 25 crews repairing potholes. During peak pothole-repair season in early March, that number can expand to more than 60.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Still, the department is continually resurfacing the city’s more than 6,000 miles of streets and 19,000 lane miles. Each year, agency officials said, it uses more than one million tons of asphalt to repave more than 1,300 lane-miles of street.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="css-1ef8w8q e1g7ppur0" aria-label="media" role="group" itemprop="associatedMedia" itemscope="itemscope" itemid="https://static01.nyt.com/images/2019/02/12/nyregion/00winterutilities2/merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-1xdhyk6 erfvjey0">
+ <span class="css-1ly73wi e1tej78p0">Image</span>
+ <div class="css-zjzyr8">
+ <div data-testid="lazyimage-container" style="height:257.77777777777777px"></div>
+ </div>
+ </div>
+ <figcaption itemprop="caption description" class="css-18crmh6 e1xdpqjp0">
+ <span class="css-8i9d0s e13ogyst0">Workers learning how to fix water main breaks at a training center in Queens.</span><span itemprop="copyrightHolder" class="css-vuqh7u e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span>Chang W. Lee/The New York Times</span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-sbs9ef eoo0vm40" id="link-13d0a396">
+ So, where do people learn how to fix some of these issues?
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Of the 400 <!-- -->city<!-- --> laborers who work on water mains, many learn the finer points of leak repair at a training center in Queens, where underground pipes are made to spring leaks for repair drills.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Workers<!-- --> from the Department of Environmental Protection recently gathered around a muddy hole as a co-worker, Nehemiah <!-- -->Dejesus<!-- -->, scrambled to apply a stainless-steel repair clamp around a cracked segment that was spewing water.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “Don’t get nervous,” instructed Milton Velez, the agency’s district supervisor for Queens.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “I’m not,” Mr. Dejesus said as he secured the clamp and stopped the leak. “It’s ‘Showtime at the Apollo.’”
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-ys65w5 epkadsg3">
+ <div class="css-15g2oxy epkadsg2">
+ <div class="css-1o4azrb e16ij5yr6">
+ <a class="css-1g7m0tk" href="https://www.nytimes.com/interactive/2016/08/18/nyregion/new-york-101-streets-repair-and-maintenance.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article">
+ <div class="css-i9gxme e16ij5yr4">
+ <div class="css-1u39xnq e16ij5yr2">
+ Why Are New York City’s Streets Always Under Construction?
+ </div><time class="css-1yil5bp e16638kd0" datetime="2016-08-18">Aug. 18, 2016</time>
+ </div>
+ <div class="css-rxyfbr e16ij5yr0">
+ <img src="https://static01.nyt.com/images/2016/08/12/nyregion/nyc101-01/nyc101-01-videoLarge-v7.jpg" class="css-32rbo2 e16ij5yr1" />
+ </div></a>
+ </div>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8"></div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ </section>
+ <div class="bottom-of-article">
+ <div class="css-1rjzas3"></div>
+ <div class="css-wg1cha e17092zo0">
+ <div class="css-x8f8u9 e1e7j8ap0">
+ <div>
+ <p>
+ Corey Kilgannon is a Metro reporter covering news and human interest stories. His writes the <a href="https://www.nytimes.com/column/character-study">Character Study</a> column in the Sunday Metropolitan section. He was also part of the team that won the 2009 Pulitzer Prize for Breaking News. <span class="css-4w91ra"><a href="https://twitter.com/coreykilgannon" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>coreykilgannon</a> <span class="css-19ln2d8">•</span> <a href="https://www.facebook.com/corey.kilgannon.9" class="css-1rj8to8" rel="noopener noreferrer" target="_blank">Facebook</a></span>
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="css-vdv0al">
+ A version of this article appears in print on <!-- -->, on Page <!-- -->A<!-- -->22<!-- --> of the New York edition<!-- --> with the headline: <!-- -->Under the City’s Streets, A Battle Against Winter<span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span>
+ </div>
+ <div class="css-i29ckm">
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-hn080" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-ar1l6a">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html&amp;smid=fb-share&amp;name=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NlStKo&amp;text=Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C." target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-4brsb6" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <a href="mailto:?subject=NYTimes.com%3A%20Manhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.&amp;body=From%20The%20New%20York%20Times%3A%0A%0AManhole%20Fires%20and%20Burst%20Pipes%3A%20How%20Winter%20Wreaks%20Havoc%20on%20What%E2%80%99s%20Underneath%20N.Y.C.%0A%0ANew%20York%E2%80%99s%20aging%20below-street%20infrastructure%20is%20tough%20to%20maintain%2C%20and%20the%20corrosive%20rock%20salt%20and%20%E2%80%9Cfreeze-thaw%E2%80%9D%20cycles%20of%20winter%20make%20it%20even%20worse.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2019%2F02%2F21%2Fnyregion%2Fwinter-weather-manholes-pipes.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-4brsb6" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div id="bottom-wrapper" class="css-1ede5it">
+ <div id="bottom-slug" class="css-l9onyx">
+ <p>
+ Advertisement
+ </p>
+ </div>
+ <div class="ad bottom-wrapper" style="text-align:center;height:100%;display:block;min-height:90px">
+ <div id="bottom"></div>
+ </div>
+ </div>
+ </article>
+ <div class="css-1lc20wh">
+ <div class="css-qremme">
+ <button class="css-1f85ym4" type="button">Open in the app</button>
+ <div class="css-7inim5"></div><button class="css-133m5b6" type="button"><svg height="11" width="11" xmlns="http://www.w3.org/2000/svg">
+ <path stroke="#fff" d="M-0.86,2.17l-4.5,4.5-4.5-4.5"></path>
+ <path stroke="#fff" d="M-0.86,11.17l-4.5-4.5-4.5,4.5"></path></svg></button>
+ </div>
+ </div>
+ </div>
+ </main>
+ <nav class="css-1ropbjl" id="site-index" aria-labelledby="site-index-label" data-testid="site-index">
+ <div class="css-uw59u">
+ <header class="css-jxzr5i" data-testid="site-index-header">
+ <h2 class="css-vz7hjd" id="site-index-label">
+ Site Index
+ </h2><a href="/"><svg xmlns="http://www.w3.org/2000/svg" class="css-oylsik" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a>
+ <div class="css-1otr2jl" data-testid="go-to-homepage">
+ <a class="css-1c8n994" href="/">Go to Home Page »</a>
+ </div>
+ </header>
+ <div class="css-qtw155" data-testid="site-index-accordion">
+ <div class="" role="tablist" aria-multiselectable="true" data-testid="accordion">
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-0" id="item-siteindex-0" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ news
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-0" aria-labelledby="item-siteindex-0" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com" data-testid="accordion-item-list-link">home page</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/world" data-testid="accordion-item-list-link">world</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/us" data-testid="accordion-item-list-link">U.S.</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/politics" data-testid="accordion-item-list-link">politics</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/nyregion" data-testid="accordion-item-list-link">New York</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/business" data-testid="accordion-item-list-link">business</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/technology" data-testid="accordion-item-list-link">tech</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/science" data-testid="accordion-item-list-link">science</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/climate" data-testid="accordion-item-list-link">climate</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/sports" data-testid="accordion-item-list-link">sports</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/obituaries" data-testid="accordion-item-list-link">obituaries</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/upshot" data-testid="accordion-item-list-link">the upshot</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/todayspaper" data-testid="accordion-item-list-link">today's paper</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/corrections" data-testid="accordion-item-list-link">corrections</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-1" id="item-siteindex-1" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ opinion
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-1" aria-labelledby="item-siteindex-1" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion" data-testid="accordion-item-list-link">today's opinion</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/columnists" data-testid="accordion-item-list-link">op-ed columnists</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/editorials" data-testid="accordion-item-list-link">editorials</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/contributors" data-testid="accordion-item-list-link">op-ed Contributors</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/letters" data-testid="accordion-item-list-link">letters</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/sunday" data-testid="accordion-item-list-link">sunday review</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video/opinion" data-testid="accordion-item-list-link">video: opinion</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-2" id="item-siteindex-2" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ arts
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-2" aria-labelledby="item-siteindex-2" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts" data-testid="accordion-item-list-link">today's arts</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/design" data-testid="accordion-item-list-link">art &amp; design</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/books" data-testid="accordion-item-list-link">books</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/dance" data-testid="accordion-item-list-link">dance</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/movies" data-testid="accordion-item-list-link">movies</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/music" data-testid="accordion-item-list-link">music</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="accordion-item-list-link">Pop Culture</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/television" data-testid="accordion-item-list-link">television</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/theater" data-testid="accordion-item-list-link">theater</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/watching" data-testid="accordion-item-list-link">watching</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video/arts" data-testid="accordion-item-list-link">video: arts</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-3" id="item-siteindex-3" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ living
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-3" aria-labelledby="item-siteindex-3" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/automobiles" data-testid="accordion-item-list-link">automobiles</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/crosswords" data-testid="accordion-item-list-link">crossword</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/food" data-testid="accordion-item-list-link">food</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://cooking.nytimes.com/" data-testid="accordion-item-list-link">Cooking</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/education" data-testid="accordion-item-list-link">education</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/style" data-testid="accordion-item-list-link">style</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/health" data-testid="accordion-item-list-link">health</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/jobs" data-testid="accordion-item-list-link">jobs</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/magazine" data-testid="accordion-item-list-link">magazine</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/realestate" data-testid="accordion-item-list-link">real estate</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/t-magazine" data-testid="accordion-item-list-link">t magazine</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/travel" data-testid="accordion-item-list-link">travel</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/fashion/weddings" data-testid="accordion-item-list-link">weddings</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-4" id="item-siteindex-4" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ listings &amp; more
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-4" aria-labelledby="item-siteindex-4" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/reader-center" data-testid="accordion-item-list-link">Reader Center</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://thewirecutter.com" data-testid="accordion-item-list-link">Wirecutter</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="http://nytconferences.com/" data-testid="accordion-item-list-link">Live Events</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/learning" data-testid="accordion-item-list-link">The Learning Network</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="accordion-item-list-link">tools &amp; services</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/events" data-testid="accordion-item-list-link">N.Y.C. events guide</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/multimedia" data-testid="accordion-item-list-link">multimedia</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/lens" data-testid="accordion-item-list-link">photography</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video" data-testid="accordion-item-list-link">video</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/store" data-testid="accordion-item-list-link">NYT store</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/times-journeys" data-testid="accordion-item-list-link">times journeys</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="accordion-item-list-link">manage my account</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="css-v0l3hm" data-testid="site-index-sections">
+ <div class="css-g4gku8" data-testid="site-index-section">
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-0">
+ <h3 class="css-rxqrcl" id="site-index-section-label-0">
+ news
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com" data-testid="site-index-section-list-link">home page</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/world" data-testid="site-index-section-list-link">world</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/us" data-testid="site-index-section-list-link">U.S.</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/politics" data-testid="site-index-section-list-link">politics</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/nyregion" data-testid="site-index-section-list-link">New York</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/business" data-testid="site-index-section-list-link">business</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/technology" data-testid="site-index-section-list-link">tech</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/science" data-testid="site-index-section-list-link">science</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/climate" data-testid="site-index-section-list-link">climate</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/sports" data-testid="site-index-section-list-link">sports</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/obituaries" data-testid="site-index-section-list-link">obituaries</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/upshot" data-testid="site-index-section-list-link">the upshot</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/todayspaper" data-testid="site-index-section-list-link">today's paper</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/corrections" data-testid="site-index-section-list-link">corrections</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-1">
+ <h3 class="css-rxqrcl" id="site-index-section-label-1">
+ opinion
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion" data-testid="site-index-section-list-link">today's opinion</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/columnists" data-testid="site-index-section-list-link">op-ed columnists</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/editorials" data-testid="site-index-section-list-link">editorials</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/contributors" data-testid="site-index-section-list-link">op-ed Contributors</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/letters" data-testid="site-index-section-list-link">letters</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/sunday" data-testid="site-index-section-list-link">sunday review</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video/opinion" data-testid="site-index-section-list-link">video: opinion</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-2">
+ <h3 class="css-rxqrcl" id="site-index-section-label-2">
+ arts
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts" data-testid="site-index-section-list-link">today's arts</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/design" data-testid="site-index-section-list-link">art &amp; design</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/books" data-testid="site-index-section-list-link">books</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/dance" data-testid="site-index-section-list-link">dance</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/movies" data-testid="site-index-section-list-link">movies</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/music" data-testid="site-index-section-list-link">music</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="site-index-section-list-link">Pop Culture</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/television" data-testid="site-index-section-list-link">television</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/theater" data-testid="site-index-section-list-link">theater</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/watching" data-testid="site-index-section-list-link">watching</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video/arts" data-testid="site-index-section-list-link">video: arts</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-3">
+ <h3 class="css-rxqrcl" id="site-index-section-label-3">
+ living
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/automobiles" data-testid="site-index-section-list-link">automobiles</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/crosswords" data-testid="site-index-section-list-link">crossword</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/food" data-testid="site-index-section-list-link">food</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://cooking.nytimes.com/" data-testid="site-index-section-list-link">Cooking</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/education" data-testid="site-index-section-list-link">education</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/style" data-testid="site-index-section-list-link">style</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/health" data-testid="site-index-section-list-link">health</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/jobs" data-testid="site-index-section-list-link">jobs</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/magazine" data-testid="site-index-section-list-link">magazine</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/realestate" data-testid="site-index-section-list-link">real estate</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/t-magazine" data-testid="site-index-section-list-link">t magazine</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/travel" data-testid="site-index-section-list-link">travel</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/fashion/weddings" data-testid="site-index-section-list-link">weddings</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-4">
+ <h3 class="css-rxqrcl" id="site-index-section-label-4">
+ more
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/reader-center" data-testid="site-index-section-list-link">Reader Center</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://thewirecutter.com" data-testid="site-index-section-list-link">Wirecutter</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="http://nytconferences.com/" data-testid="site-index-section-list-link">Live Events</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/learning" data-testid="site-index-section-list-link">The Learning Network</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="site-index-section-list-link">tools &amp; services</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/events" data-testid="site-index-section-list-link">N.Y.C. events guide</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/multimedia" data-testid="site-index-section-list-link">multimedia</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/lens" data-testid="site-index-section-list-link">photography</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video" data-testid="site-index-section-list-link">video</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/store" data-testid="site-index-section-list-link">NYT store</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/times-journeys" data-testid="site-index-section-list-link">times journeys</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="site-index-section-list-link">manage my account</a>
+ </li>
+ </ul>
+ </section>
+ <div class="css-6xhk3s" aria-labelledby="site-index-subscribe-label">
+ <h3 class="css-rxqrcl" id="site-index-subscribe-label">
+ Subscribe
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-subscribe-list">
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/hdleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 14 13" fill="#000">
+ <path d="M13.1,11.7H3.5V1.2h9.6V11.7zM13.1,0.4H3.5C3,0.4,2.6,0.8,2.6,1.2v2.2H0.9C0.4,3.4,0,3.8,0,4.3v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9V1.2C14,0.8,13.6,0.4,13.1,0.4"></path>
+ <polygon points="10.9,3 5.2,3 5.2,3.9 11.4,3.9 11.4,3"></polygon>
+ <rect x="5.2" y="4.7" width="6.1" height="0.9"></rect>
+ <rect x="5.2" y="6.5" width="6.1" height="0.9"></rect></svg>home delivery</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/digitalleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 10 13">
+ <path fill="#000" d="M9.9,8c-0.4,1.1-1.2,1.9-2.3,2.4V8l1.3-1.2L7.6,5.7V4c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7C6,1.7,4.5,0.6,2.8,0.6c-1.5,0-2.5,1.1-2.5,2.2C0.3,4,1,4.3,1.6,4.6l0-0.1C1.4,4.4,1.3,4.1,1.3,3.8c0-0.5,0.5-0.9,1-0.9C3.7,2.9,6,4,7.4,4h0.1v1.7L6.2,6.8L7.5,8v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5V10l2.2-1v-5L2.5,5.5c0.3-1,1-1.7,1.8-2l0,0C2.2,3.9,0.1,5.6,0.1,8c0,2.9,2.4,4.8,5.2,4.8C8.2,12.9,9.9,10.9,9.9,8L9.9,8z"></path></svg>digital subscriptions</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/subscription/games/lp897H9.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 13 13" fill="#000">
+ <polygon points="0,-93.6 0,-86.9 6.6,-93.6"></polygon>
+ <polygon points="0.9,-86 7.5,-86 7.5,-92.6"></polygon>
+ <polygon points="0,-98 0,-94.8 8.8,-94.8 8.8,-86 12,-86 12,-98"></polygon>
+ <path d="M11.9-40c-0.4,1.1-1.2,1.9-2.3,2.4V-40l1.3-1.2l-1.3-1.2V-44c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7c-1.3,0-2.8-1.1-4.5-1.1c-1.5,0-2.5,1.1-2.5,2.2c0,1.1,0.6,1.5,1.3,1.7l0-0.1c-0.2-0.1-0.4-0.4-0.4-0.7c0-0.5,0.5-0.9,1-0.9C5.7-45.1,8-44,9.4-44h0.1v1.7l-1.3,1.1L9.5-40v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5v4.9l2.2-1v-5l-3.3,1.5c0.3-1,1-1.7,1.8-2l0,0c-2.2,0.5-4.3,2.1-4.3,4.6c0,2.9,2.4,4.8,5.2,4.8C10.2-35.1,11.9-37.1,11.9-40L11.9-40z"></path>
+ <path d="M12.2-23.7c-0.2,0-0.4,0.2-0.4,0.4v0.4L0.4-19.1v2.3l3,1l-0.2,0.6c-0.3,0.8,0.1,1.8,0.9,2.1l1.7,0.7c0.2,0.1,0.4,0.1,0.6,0.1c0.6,0,1.3-0.4,1.5-1l0.4-0.9l3.5,1.2v0.4c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-10.7C12.6-23.5,12.4-23.7,12.2-23.7M7.1-13.6c-0.2,0.4-0.6,0.6-1,0.4l-1.7-0.7c-0.4-0.2-0.6-0.6-0.4-1l0.3-0.7l3.3,1.1L7.1-13.6z"></path>
+ <path d="M13.1-60.3H3.5v-10.5h9.6V-60.3zM13.1-71.6H3.5c-0.5,0-0.9,0.4-0.9,0.9v2.2H0.9c-0.5,0-0.9,0.4-0.9,0.9v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9v-10.5C14-71.2,13.6-71.6,13.1-71.6"></path>
+ <polygon points="10.9,-69 5.2,-69 5.2,-68.1 11.4,-68.1 11.4,-69"></polygon>
+ <rect x="5.2" y="-67.3" width="6.1" height="0.9"></rect>
+ <rect x="5.2" y="-65.5" width="6.1" height="0.9"></rect>
+ <path d="M12,6.5H6.5V12H1V6.5h5.5V1H12V6.5zM12,0H1C0.4,0,0,0.5,0,1v11c0,0.6,0.4,1,1,1h11c0.5,0,1-0.4,1-1V1C13,0.5,12.5,0,12,0"></path></svg>Crossword</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/subscriptions/Multiproduct/lp8R3WU.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 13 13" fill="#000">
+ <path d="M12,2.9L9.6,5.2c-0.1,0.1-0.3,0.1-0.4,0C9.1,5.2,9.1,5,9.3,4.9l2.4-2.4c-0.2-0.2-0.3-0.3-0.5-0.5L8.7,4.3c-0.1,0.1-0.3,0.1-0.4,0C8.2,4.3,8.2,4.1,8.4,4l2.4-2.4c-0.3-0.3-0.5-0.5-0.5-0.5L7.6,3.4C7.1,4,6.8,5.1,7.1,5.8c-1.4,1-4.6,3.5-5.1,4c-0.8,0.8-0.4,1.8-0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,1.1,0.5,1.9-0.3c0.4-0.4,2.9-3.6,3.9-5C8.4,6.9,9.6,6.6,10.2,6l2.3-2.6C12.5,3.4,12.3,3.2,12,2.9z"></path>
+ <path d="M0.8,1.9l0.3-0.3c0.9-0.9,3.2,1.1,3.8,1.7s0.9,1.8,0.4,2.6c1.4,1.1,4.6,3.5,5,3.9c0.8,0.8,0.4,1.8,0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0.1-1.1,0.5-1.9-0.3c-0.4-0.4-2.9-3.7-4-5.1C3.9,6.7,2.9,6.4,2.3,5.8S-0.2,2.9,0.8,1.9z"></path></svg>Cooking</a>
+ </li>
+ </ul>
+ <ul class="css-1iruc8t" data-testid="site-index-corporate-links">
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/marketing/newsletters">email newsletters</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/corporateleftnav">corporate subscriptions</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/educationleftnav">education rate</a>
+ </li>
+ </ul>
+ <ul class="css-6td9kr" data-testid="site-index-alternate-links">
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/services/mobile/index.html">mobile applications</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">replica edition</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </nav>
+ <footer role="contentinfo" class="css-1qmnftd e1ksinrk0">
+ <nav data-testid="footer" class="css-15uy5yv">
+ <h2 class="css-vz7hjd">
+ Site Information Navigation
+ </h2>
+ <ul class="css-1ho5u4o e1ksinrk1">
+ <li data-testid="copyright">
+ <a class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">©&#160;<span itemprop="copyrightYear">2019</span><span itemprop="publisher copyrightHolder provider sourceOrganization" itemscope="itemscope" itemtype="http://schema.org/NewsMediaOrganization" itemid="https://www.nytimes.com">&#160;
+ <meta itemprop="diversityPolicy" content="https://www.nytco.com/diversity-and-inclusion-at-the-new-york-times/" />
+ <meta itemprop="ethicsPolicy" content="https://www.nytco.com/who-we-are/culture/standards-and-ethics/" />
+ <meta itemprop="foundingDate" content="1851-09-18" /><span itemprop="logo" itemscope="itemscope" itemtype="https://schema.org/ImageObject">
+ <meta itemprop="url" content="https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png" /></span>
+ <meta itemprop="url" content="https://www.nytimes.com/" />
+ <meta itemprop="masthead" content="https://www.nytimes.com/interactive/2018/09/28/admin/the-new-york-times-masthead.html" /><span itemprop="name">The New York Times Company</span></span></a>
+ </li>
+ </ul>
+ <ul class="css-13o0c9t e1ksinrk2">
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://myaccount.nytimes.com/membercenter/feedback.html">Contact Us</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://www.nytco.com/careers">Work with us</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://nytmediakit.com/">Advertise</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/privacy">Privacy</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/ref/membercenter/help/agree.html">Terms of Service</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://spiderbites.nytimes.com">Site Map</a>
+ </li>
+ <li class="smartphone css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://mobile.nytimes.com/help">Help</a>
+ </li>
+ <li class="desktop css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU?campaignId=37WXW">Subscriptions</a>
+ </li>
+ </ul>
+ </nav>
+ </footer>
+ </div>
+ </div>
+ </div>
+ <script>
+ <![CDATA[
+ window.__preloadedData = {"initialState":{"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==":{"__typename":"Article","id":"QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==","compatibility":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.compatibility","typename":"CompatibilityFeatures"},"collections@filterEmpty":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"}],"tone":"FEATURE","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","typename":"Section"},"subsection":null,"sprinkledBody":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody","typename":"DocumentBlock"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2019\u002F02\u002F21\u002Fnyregion\u002Fwinter-weather-manholes-pipes.html","adTargetingParams({\"clientAdParams\":{\"edn\":\"us\",\"plat\":\"web\",\"prop\":\"nyt\"}})":[{"type":"id","generated":false,"id":"AdTargetingParam:si_sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:keywords","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:templatearticle","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:platweb","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:authcoreykilgannon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:typart,oak","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ednus","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:trend","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:deswater,winterseason,infrastructurepublicworks,potholes,manholes","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:per","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:orgconsolidatededisoninc,departmentofenvironmentalprote","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:collnewyork","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gui","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:id100000006355641","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:geomanhattannyc","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:col","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:als_test1550884468686","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:brandsensitivefalse","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:spon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ledemedsznone","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:propnyt","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:sectionnyregion","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:artlenmedium","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:emotionsinterest,sadness,not_nostalgic,not_competitive,not_inspired,not_hope,not_indulgent,not_happiness,not_amused,not_hate,not_boredom","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gscatneg_mastercard,gs_science,neg_hearts,gs_science_environ,gs_business_energy,gv_safe","typename":"AdTargetingParam"}],"sourceId":"100000006355641","type":"article","wordCount":1247,"bylines":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0","typename":"Byline"}],"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.displayProperties","typename":"CreativeWorkDisplayProperties"},"typeOfMaterials":{"type":"json","json":["News"]},"collections":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","typename":"LegacyCollection"}],"timesTags@filterEmpty":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.0","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.1","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.2","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.3","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.4","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.5","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.6","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.7","typename":"Location"}],"language":null,"desk":"Metro","kicker":"","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.headline","typename":"CreativeWorkHeadline"},"commentStatus":"NO_COMMENTS","firstPublished":"2019-02-21T08:00:08.000Z","lastModified":"2019-02-22T12:17:45.596Z","originalDesk":"Metro","source":{"type":"id","generated":false,"id":"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","typename":"Organization"},"printInformation":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.printInformation","typename":"PrintInformation"},"sprinkled":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled","typename":"SprinkledContent"},"dfpTaxonomyException":null,"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"reviewItems":[],"translations":[],"summary":"New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse.","uri":"nyt:\u002F\u002Farticle\u002Fd0aba0ad-4861-548c-8ff3-1d9606db5960","eventId":"pubp:\u002F\u002Fevent\u002Fb0523eccaeb445d49d2ab6d80d79d0ae","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia","typename":"Image"},"shortUrl":"https:\u002F\u002Fnyti.ms\u002F2NlStKo","promotionalHeadline":"Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C.","promotionalSummary":"New York’s aging, messy, below-street infrastructure is tough to maintain. Extreme weather conditions make the job even harder, city officials say.","column":null,"newsStatus":"DEFAULT","reviewSummary":"","legacy":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.legacy","typename":"ArticleLegacyData"},"addendums":[],"related@filterEmpty":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.compatibility":{"isOak":true,"__typename":"CompatibilityFeatures","hasVideo":false,"hasOakConversionError":false,"isArtReview":false,"isBookReview":false,"isDiningReview":false,"isMovieReview":false,"isTheaterReview":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzE5ZjY2OTk4LWY1NjItNWVjNi1iM2Y5LTI5OGYxYzc2ZGQ4NA==","slug":"nyregion","__typename":"LegacyCollection","name":"New York","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F19f66998-f562-5ec6-b3f9-298f1c76dd84","header":"","showCollectionStories":false},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","name":"nyregion","displayName":"New York","url":"\u002Fsection\u002Fnyregion","uri":"nyt:\u002F\u002Fsection\u002F39480374-66d3-5603-9ce1-58cfa12988e2","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0":{"__typename":"HeaderBasicBlock","label":null,"headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.headline","typename":"Heading1Block"},"summary":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.summary","typename":"SummaryBlock"},"ledeMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.ledeMedia","typename":"ImageBlock"},"byline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline","typename":"BylineBlock"},"timestampBlock":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.timestampBlock","typename":"TimestampBlock"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.3":{"__typename":"Dropzone","index":0,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.4":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.4.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.5":{"__typename":"Dropzone","index":1,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.6":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.6.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.7":{"__typename":"Dropzone","index":2,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.9":{"__typename":"Dropzone","index":3,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.10":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.10.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.11":{"__typename":"Dropzone","index":4,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.12":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.12.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.13":{"__typename":"Dropzone","index":5,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.14":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.15":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.15.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.16":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.16.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.17":{"__typename":"Dropzone","index":6,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.18":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.18.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.19":{"__typename":"Dropzone","index":7,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.20":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.20.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.21":{"__typename":"Dropzone","index":8,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.22":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.22.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.23":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.23.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.24":{"__typename":"Dropzone","index":9,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.25":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.25.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.26":{"__typename":"Dropzone","index":10,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.27":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.28":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.28.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.29":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.29.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.30":{"__typename":"Dropzone","index":11,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.31":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.31.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.32":{"__typename":"Dropzone","index":12,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.34":{"__typename":"Dropzone","index":13,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.35":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.35.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.36":{"__typename":"Dropzone","index":14,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.37":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.37.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.38":{"__typename":"Dropzone","index":15,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.39":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.39.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.40":{"__typename":"Dropzone","index":16,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.41":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.41.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.42":{"__typename":"Dropzone","index":17,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.43":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.44":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.44.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.45":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.45.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.46":{"__typename":"Dropzone","index":18,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.47":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.47.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.48":{"__typename":"Dropzone","index":19,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49.content.1","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.51":{"__typename":"Dropzone","index":20,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.52":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.53":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.53.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.54":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.54.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.55":{"__typename":"Dropzone","index":21,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.56":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.56.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.57":{"__typename":"Dropzone","index":22,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.58":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.58.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.59":{"__typename":"Dropzone","index":23,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.60":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.60.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.61":{"__typename":"Dropzone","index":24,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.62":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.62.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.63":{"__typename":"Dropzone","index":25,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.64":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.65":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.65.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.66":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.66.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.68":{"__typename":"Dropzone","index":26,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.69":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.69.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.70":{"__typename":"Dropzone","index":27,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.72":{"__typename":"Dropzone","index":28,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.73":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.73.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.74":{"__typename":"Dropzone","index":29,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.75":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.76":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.76.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.78":{"__typename":"Dropzone","index":30,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.3","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.80":{"__typename":"Dropzone","index":31,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.81":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.81.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.82":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.82.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.83":{"__typename":"Dropzone","index":32,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.84":{"__typename":"RelatedLinksBlock","displayStyle":"STANDARD","title":[],"description":[],"related@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]","typename":"Interactive"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody":{"content@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.14","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.15","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.22","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.23","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.24","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.25","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.26","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.27","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.28","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.29","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.30","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.31","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.32","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.34","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.35","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.36","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.37","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.38","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.39","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.40","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.41","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.42","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.43","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.44","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.45","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.46","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.47","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.48","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.52","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.53","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.59","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.60","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.61","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.62","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.63","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.64","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.65","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.66","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.75","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.76","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.78","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.80","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.81","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.82","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.83","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.84","typename":"RelatedLinksBlock"}],"__typename":"DocumentBlock","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.2","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.3","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.4","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.5","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.6","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.7","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.8","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.9","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.10","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.11","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.12","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.13","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.14","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.15","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.21","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.22","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.23","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.24","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.25","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.26","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.27","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.28","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.29","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.30","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.31","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.32","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.33","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.34","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.35","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.36","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.37","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.38","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.39","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.40","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.41","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.42","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.43","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.44","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.45","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.46","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.47","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.48","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.49","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.52","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.53","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.54","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.55","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.56","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.57","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.58","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.59","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.60","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.61","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.62","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.63","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.64","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.65","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.66","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.75","typename":"ImageBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.76","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.77","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.78","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.79","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.80","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.81","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.82","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.83","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.84","typename":"RelatedLinksBlock"}]},"AdTargetingParam:si_sectionnyregion":{"key":"si_section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:keywords":{"key":"keywords","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:templatearticle":{"key":"template","value":"article","__typename":"AdTargetingParam"},"AdTargetingParam:platweb":{"key":"plat","value":"web","__typename":"AdTargetingParam"},"AdTargetingParam:authcoreykilgannon":{"key":"auth","value":"coreykilgannon","__typename":"AdTargetingParam"},"AdTargetingParam:typart,oak":{"key":"typ","value":"art,oak","__typename":"AdTargetingParam"},"AdTargetingParam:ednus":{"key":"edn","value":"us","__typename":"AdTargetingParam"},"AdTargetingParam:trend":{"key":"trend","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:deswater,winterseason,infrastructurepublicworks,potholes,manholes":{"key":"des","value":"water,winterseason,infrastructurepublicworks,potholes,manholes","__typename":"AdTargetingParam"},"AdTargetingParam:per":{"key":"per","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:orgconsolidatededisoninc,departmentofenvironmentalprote":{"key":"org","value":"consolidatededisoninc,departmentofenvironmentalprote","__typename":"AdTargetingParam"},"AdTargetingParam:collnewyork":{"key":"coll","value":"newyork","__typename":"AdTargetingParam"},"AdTargetingParam:gui":{"key":"gui","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:id100000006355641":{"key":"id","value":"100000006355641","__typename":"AdTargetingParam"},"AdTargetingParam:geomanhattannyc":{"key":"geo","value":"manhattannyc","__typename":"AdTargetingParam"},"AdTargetingParam:col":{"key":"col","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:als_test1550884468686":{"key":"als_test","value":"1550884468686","__typename":"AdTargetingParam"},"AdTargetingParam:brandsensitivefalse":{"key":"brandsensitive","value":"false","__typename":"AdTargetingParam"},"AdTargetingParam:spon":{"key":"spon","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:ledemedsznone":{"key":"ledemedsz","value":"none","__typename":"AdTargetingParam"},"AdTargetingParam:propnyt":{"key":"prop","value":"nyt","__typename":"AdTargetingParam"},"AdTargetingParam:sectionnyregion":{"key":"section","value":"nyregion","__typename":"AdTargetingParam"},"AdTargetingParam:artlenmedium":{"key":"artlen","value":"medium","__typename":"AdTargetingParam"},"AdTargetingParam:emotionsinterest,sadness,not_nostalgic,not_competitive,not_inspired,not_hope,not_indulgent,not_happiness,not_amused,not_hate,not_boredom":{"key":"emotions","value":"interest,sadness,not_nostalgic,not_competitive,not_inspired,not_hope,not_indulgent,not_happiness,not_amused,not_hate,not_boredom","__typename":"AdTargetingParam"},"AdTargetingParam:gscatneg_mastercard,gs_science,neg_hearts,gs_science_environ,gs_business_energy,gv_safe":{"key":"gscat","value":"neg_mastercard,gs_science,neg_hearts,gs_science_environ,gs_business_energy,gv_safe","__typename":"AdTargetingParam"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0":{"displayName":"Corey Kilgannon","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0":{"creators":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline","renderedRepresentation":"By Corey Kilgannon"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.displayProperties":{"fullBleedDisplayStyle":"","__typename":"CreativeWorkDisplayProperties","serveAsNyt4":false},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.0":{"__typename":"Subject","vernacular":"Water","isAdvertisingBrandSensitive":false,"displayName":"Water"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.1":{"__typename":"Subject","vernacular":"Winter","isAdvertisingBrandSensitive":false,"displayName":"Winter (Season)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.2":{"__typename":"Subject","vernacular":"Infrastructure","isAdvertisingBrandSensitive":false,"displayName":"Infrastructure (Public Works)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.3":{"__typename":"Subject","vernacular":"Pothole","isAdvertisingBrandSensitive":false,"displayName":"Potholes"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.4":{"__typename":"Subject","vernacular":"Manhole","isAdvertisingBrandSensitive":false,"displayName":"Manholes"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.5":{"__typename":"Organization","vernacular":"Con Edison","isAdvertisingBrandSensitive":false,"displayName":"Consolidated Edison Inc"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.6":{"__typename":"Organization","vernacular":"Department of Environmental Protection NYC","isAdvertisingBrandSensitive":false,"displayName":"Department of Environmental Protection (NYC)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.timesTags@filterEmpty.7":{"__typename":"Location","vernacular":"Manhattan","isAdvertisingBrandSensitive":false,"displayName":"Manhattan (NYC)"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.headline":{"default":"Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C.","__typename":"CreativeWorkHeadline","default@stripHtml":"Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C."},"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=":{"id":"T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","displayName":"New York Times","__typename":"Organization"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.printInformation":{"page":"22","section":"A","publicationDate":"2019-02-21T05:00:00.000Z","__typename":"PrintInformation","edition":"NewYork","headline@stripHtml":"Under the City’s Streets, A Battle Against Winter"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.0":{"name":"mobile","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.1":{"name":"desktop","stride":7,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.2":{"name":"mobileHoldout","stride":6,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.3":{"name":"desktopHoldout","stride":8,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled":{"configs":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.0","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.1","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.2","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkled.configs.3","typename":"SprinkledConfig"}],"__typename":"SprinkledContent"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.2":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.3":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.4":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.5":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.6":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.7":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.8":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.9":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.10":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.11":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.12":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.13":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.14":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.15":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.17":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.19":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.21":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.22":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.23":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.24":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.25":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.26":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.27":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.28":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.29":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.30":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.31":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.32":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.33":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.34":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.35":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.36":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.37":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.38":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.39":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.40":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.41":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.42":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.43":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.44":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.45":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.46":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.47":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.48":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.49":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.51":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.52":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.53":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.54":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.55":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.56":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.57":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.58":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.59":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.60":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.61":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.62":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.63":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.64":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.65":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.66":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.68":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.70":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.72":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.74":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.75":{"__typename":"ImageBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.76":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.77":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.78":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.79":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.80":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.81":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.82":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.83":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content.84":{"__typename":"RelatedLinksBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0":{"name":"MASTER","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002Fmerlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg","height":400,"width":600,"name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002Fmerlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg","height":1366,"width":2048,"name":"superJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1":{"name":"SMALL_SQUARE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-thumbLarge.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002F00winterutilities1-thumbStandard.jpg","height":75,"width":75,"name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002F00winterutilities1-thumbLarge.jpg","height":150,"width":150,"name":"thumbLarge","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2":{"name":"SIXTEEN_BY_NINE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002F00winterutilities1-videoSixteenByNineJumbo1600.jpg","height":900,"width":1600,"name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3":{"name":"FACEBOOK","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002F00winterutilities1-facebookJumbo.jpg","height":550,"width":1050,"name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4":{"name":"WATCH","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-watch308.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities100winterutilities1-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002F00winterutilities1-watch308.jpg","height":348,"width":312,"name":"watch308","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia":{"crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.promotionalMedia.caption":{"text":"A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.headline":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.headline.content.0","typename":"TextInline"}],"__typename":"Heading1Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.headline.content.0":{"__typename":"TextInline","text@stripHtml":"Manhole Fires and Burst Pipes: How Winter Wreaks Havoc on What’s Underneath N.Y.C.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.summary":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.summary.content.0","typename":"TextInline"}],"__typename":"SummaryBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.summary.content.0":{"__typename":"TextInline","text":"New York’s aging below-street infrastructure is tough to maintain, and the corrosive rock salt and “freeze-thaw” cycles of winter make it even worse.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.ledeMedia":{"__typename":"ImageBlock","size":"LARGE","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi","typename":"Image"}},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1.html","uri":"nyt:\u002F\u002Fimage\u002F16c956e9-16c0-5cb5-aa5a-846b5be9746b","credit":"Chang W. Lee\u002FThe New York Times","legacyHtmlCaption":"A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002Fmerlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-popup.jpg","name":"popup","width":650,"height":434,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002Fmerlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilities1\u002Fmerlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilities1merlin_150498339_cf9085e5-9756-4169-a5a5-5b516316a3fa-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMTZjOTU2ZTktMTZjMC01Y2I1LWFhNWEtODQ2YjViZTk3NDZi.caption":{"text":"A Con Edison worker repairing underground cables this month in Flushing, Queens. The likely source of the problem was water and rock salt that had seeped underground.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline":{"textAlign":"LEFT","hideHeadshots":false,"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0","typename":"Byline"}],"role@filterEmpty":[],"__typename":"BylineBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0":{"prefix":"By","creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0":{"displayName":"Corey Kilgannon","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fcorey-kilgannon","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia","typename":"Image"},"__typename":"Person"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-articleLarge.jpg","name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-popup.jpg","name":"popup","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog480.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blog480.jpg","name":"blog480","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog533.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blog533.jpg","name":"blog533","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog427.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blog427.jpg","name":"blog427","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-tmagSF.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-tmagSF.jpg","name":"tmagSF","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-tmagArticle.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-tmagArticle.jpg","name":"tmagArticle","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-slide.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-slide.jpg","name":"slide","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-jumbo.jpg","name":"jumbo","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-superJumbo.jpg","name":"superJumbo","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog225.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blog225.jpg","name":"blog225","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master675.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-master675.jpg","name":"master675","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master495.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-master495.jpg","name":"master495","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master180.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-master180.jpg","name":"master180","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master315.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-master315.jpg","name":"master315","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master768.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-master768.jpg","name":"master768","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog480.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog533.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog427.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-tmagSF.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-tmagArticle.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-slide.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-superJumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blog225.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master675.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master495.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master180.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master315.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-master768.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-thumbStandard.jpg","name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blogSmallThumb.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blogSmallThumb.jpg","name":"blogSmallThumb","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-thumbLarge.jpg","name":"thumbLarge","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-smallSquare168.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-smallSquare168.jpg","name":"smallSquare168","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-smallSquare252.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-smallSquare252.jpg","name":"smallSquare252","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blogSmallThumb.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-smallSquare168.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-smallSquare252.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-square320.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-square320.jpg","name":"square320","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-moth.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-moth.jpg","name":"moth","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-filmstrip.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-filmstrip.jpg","name":"filmstrip","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-square640.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-square640.jpg","name":"square640","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumSquare149.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumSquare149.jpg","name":"mediumSquare149","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-square320.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-moth.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-filmstrip.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-square640.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumSquare149.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-sfSpan.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-sfSpan.jpg","name":"sfSpan","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeHorizontal375.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-largeHorizontal375.jpg","name":"largeHorizontal375","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeHorizontalJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-largeHorizontalJumbo.jpg","name":"largeHorizontalJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-sfSpan.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeHorizontal375.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeHorizontalJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-hpLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-hpLarge.jpg","name":"hpLarge","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeWidescreen573.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-largeWidescreen573.jpg","name":"largeWidescreen573","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-hpLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-largeWidescreen573.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbWide.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-thumbWide.jpg","name":"thumbWide","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoThumb.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoThumb.jpg","name":"videoThumb","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo210.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumThreeByTwo210.jpg","name":"mediumThreeByTwo210","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo225.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumThreeByTwo225.jpg","name":"mediumThreeByTwo225","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo252.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumThreeByTwo252.jpg","name":"mediumThreeByTwo252","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo378.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumThreeByTwo378.jpg","name":"mediumThreeByTwo378","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-thumbWide.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoThumb.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo210.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo225.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo252.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumThreeByTwo378.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-articleInline.jpg","name":"articleInline","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-hpSmall.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-hpSmall.jpg","name":"hpSmall","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blogSmallInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-blogSmallInline.jpg","name":"blogSmallInline","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumFlexible177.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-mediumFlexible177.jpg","name":"mediumFlexible177","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-articleInline.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-hpSmall.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-blogSmallInline.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-mediumFlexible177.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSmall.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSmall.jpg","name":"videoSmall","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoHpMedium.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoHpMedium.jpg","name":"videoHpMedium","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine600.jpg","name":"videoSixteenByNine600","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine540.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine540.jpg","name":"videoSixteenByNine540","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine495.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine495.jpg","name":"videoSixteenByNine495","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine390.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine390.jpg","name":"videoSixteenByNine390","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine480.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine480.jpg","name":"videoSixteenByNine480","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine310.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine310.jpg","name":"videoSixteenByNine310","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine225.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine225.jpg","name":"videoSixteenByNine225","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine96.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine96.jpg","name":"videoSixteenByNine96","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine768.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine768.jpg","name":"videoSixteenByNine768","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine150.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNine150.jpg","name":"videoSixteenByNine150","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-videoSixteenByNineJumbo1600.jpg","name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSmall.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoHpMedium.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine600.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine540.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine495.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine390.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine480.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine310.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine225.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine96.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine768.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNine150.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-miniMoth.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-miniMoth.jpg","name":"miniMoth","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-windowsTile336H.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-windowsTile336H.jpg","name":"windowsTile336H","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-miniMoth.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-windowsTile336H.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9":{"renditions":[],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-facebookJumbo.jpg","name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-watch308.jpg","name":"watch308","__typename":"ImageRendition"},"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-watch268.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F02\u002F20\u002Fmultimedia\u002Fauthor-corey-kilgannon\u002Fauthor-corey-kilgannon-watch268.jpg","name":"watch268","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-watch308.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180220multimediaauthor-corey-kilgannonauthor-corey-kilgannon-watch268.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12":{"renditions":[],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia":{"crops":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.4","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.5","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.6","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.7","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.8","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.9","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.10","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.11","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0.promotionalMedia.crops.12","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.0.timestampBlock":{"timestamp":"2019-02-21T08:00:08.000Z","align":"LEFT","__typename":"TimestampBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.0":{"__typename":"TextInline","text":"[What you need to know to start the day: ","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.0.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.0.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1":{"__typename":"TextInline","text":"Get New York Today in your inbox","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1.formats.0","typename":"ItalicFormat"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1.formats.1","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.1.formats.1":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002Fnewsletters\u002Fnewyorktoday?module=inline","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.2":{"__typename":"TextInline","text":".]","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.2.formats.0","typename":"ItalicFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.1.content.2.formats.0":{"__typename":"ItalicFormat","type":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.0":{"__typename":"TextInline","text":"A series of recent ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.1":{"__typename":"TextInline","text":"manhole fires","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fnypost.com\u002F2019\u002F02\u002F17\u002Fmanhole-fires-force-theater-evacuations-in-midtown\u002F","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.2.content.2":{"__typename":"TextInline","text":" in the heart of Manhattan forced the evacuation of several theaters and was a stark reminder that the subway is not the only creaky infrastructure beneath the streets of New York City. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.4.content.0":{"__typename":"TextInline","text":"Underground lies a chaotic assemblage of utilities that, much like the subway, are lifelines for the city: a sprawling tangle of water mains, power cables, gas and steam lines, telecom wires and sewers.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.6.content.0":{"__typename":"TextInline","text":"The city has one of the oldest and largest networks of subterranean infrastructure in the world, with some portions dating more than a century and prone to leaks and cracks.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.0":{"__typename":"TextInline","text":"And ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.1":{"__typename":"TextInline","text":"winter","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.8.content.2":{"__typename":"TextInline","text":" — from the corrosive rock salt used on streets and sidewalks to “freeze-thaw” cycles that weaken pipes — makes infrastructure problems even worse. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.10.content.0":{"__typename":"TextInline","text":"In the late 1800s, many of the city’s overhead utilities were buried to lessen the exposure to winter weather. “People think it’s all protected and safe, but it’s really not,” said Patrick McHugh, vice president of electrical engineering and planning for Con Edison, which maintains about 90,000 miles of underground cable in the city.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.12.content.0":{"__typename":"TextInline","text":"“You have water, sewage, electricity and gas down there, and people don’t appreciate the effort that goes into keeping all that working,” he added.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15.html","uri":"nyt:\u002F\u002Fimage\u002F5a4d4a06-29a1-518e-bc27-f3569511f1a7","credit":"Kirsten Luce for The New York Times","legacyHtmlCaption":"In the late 1800s, overhead utilities were buried to lessen the exposure to winter weather.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15\u002Fmerlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15\u002Fmerlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15\u002Fmerlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-jumbo.jpg","name":"jumbo","width":1024,"height":682,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15\u002Fmerlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-superJumbo.jpg","name":"superJumbo","width":2000,"height":1333,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK15\u002Fmerlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK15merlin_56025490_f9412a36-eeb9-4a10-a41e-f324eb7a3248-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWE0ZDRhMDYtMjlhMS01MThlLWJjMjctZjM1Njk1MTFmMWE3.caption":{"text":"In the late 1800s, overhead utilities were buried to lessen the exposure to winter weather.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.15.content.0":{"__typename":"TextInline","text":"Rock salt on icy streets can cause mayhem below them","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.16.content.0":{"__typename":"TextInline","text":"When rock salt melts ice, and the water seeps down manholes and into electrical units, it can set off fires and explosions strong enough to pop a 300-pound manhole cover five stories into the air.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.18.content.0":{"__typename":"TextInline","text":"For days after a storm, Con Edison officials say, they often deal with scores of electrical fires caused by the rock salt eating away at electrical cable insulation. The wet salt can create sparking that burns the insulation, producing both fire and gases that can combust and pop the manhole lids.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.20.content.0":{"__typename":"TextInline","text":"To alleviate the threat, the officials said, the utility switched most of its manhole covers to vented ones that allow gases to escape, “so they cannot form a combustible amount,” Mr. McHugh said.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.22.content.0":{"__typename":"TextInline","text":"“It also lets smoke escape, which can tip off the public to notify the authorities,” he added.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.23.content.0":{"__typename":"TextInline","text":"Winter can also bring an increase in gas-line breakages. Con Edison, which maintains 4,300 miles of gas mains in and around New York City, records about 500 leaks — most of them nonemergencies — in a typical month, but many more in winter.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.25.content.0":{"__typename":"TextInline","text":"Even this past January, which was unseasonably mild, there were 750 leaks, Con Edison officials said.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F00winterutilitiesOAK11.html","uri":"nyt:\u002F\u002Fimage\u002Fac3158e3-ee4b-5690-9021-ebf5cc19cc2e","credit":"Michael Appleton for The New York Times","legacyHtmlCaption":"There are typically between 400 and 600 water main breaks each year in New York City, an official said.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK11\u002Fmerlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK11\u002Fmerlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK11\u002Fmerlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK11\u002Fmerlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-superJumbo.jpg","name":"superJumbo","width":2048,"height":1365,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK11\u002Fmerlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK11merlin_94083158_9e622a52-ec2f-4fbd-845c-5d530e94bc82-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvYWMzMTU4ZTMtZWU0Yi01NjkwLTkwMjEtZWJmNWNjMTljYzJl.caption":{"text":"There are typically between 400 and 600 water main breaks each year in New York City, an official said.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.28.content.0":{"__typename":"TextInline","text":"‘Freeze-thaws’ linked to climate change can imperil utilities","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.29.content.0":{"__typename":"TextInline","text":"The extreme temperature swings that many researchers link to climate change are adding to the challenges of winter. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.31.content.0":{"__typename":"TextInline","text":"Officials monitor weather forecasts closely for freeze-thaw cycles, when they put extra repair crews on call.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.0":{"__typename":"TextInline","text":"During a polar vortex in late January, for instance, single-digit temperatures in the city quickly ballooned into the 50s. The thaw, much welcomed by many New Yorkers, worried Tasos Georgelis, deputy commissioner for water and sewer operations at the Department of Environmental Protection, which operates the city’s ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.1":{"__typename":"TextInline","text":"water system","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002Finteractive\u002F2016\u002F03\u002F24\u002Fnyregion\u002Fhow-nyc-gets-its-water-new-york-101.html?action=click&contentCollection=New%20York&region=Footer&module=WhatsNext&version=WhatsNext&contentID=WhatsNext&moduleDetail=undefined&pgtype=Multimedia","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.33.content.2":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.35.content.0":{"__typename":"TextInline","text":"“When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” Mr. Georgelis said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.37.content.0":{"__typename":"TextInline","text":"Along the city’s roughly 6,500 miles of water mains, there are typically between 400 and 600 breaks a year, he added. The majority occur in winter, when the cold can make older cast-iron mains brittle.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.39.content.0":{"__typename":"TextInline","text":"Environmental Protection officials said the department repaired 75 water-main breaks in January, including one in Lower Manhattan that disrupted rush-hour subway service and another on the West Side that snarled traffic and left nearby buildings without water for hours.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.41.content.0":{"__typename":"TextInline","text":"The city’s 7,500 miles of sewer lines are less affected by cold weather because they are generally buried deeper than other utilities, below the frost line, agency officials said.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13.html","uri":"nyt:\u002F\u002Fimage\u002F5fb3a5fa-f0f4-5e0a-89e1-9e9c7022b94d","credit":"Fred R. Conrad\u002FThe New York Times","legacyHtmlCaption":"In 1978, a water main break caused severe flooding in Bushwick, Brooklyn.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13\u002Fmerlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg","name":"articleLarge","width":600,"height":869,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13\u002Fmerlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-popup.jpg","name":"popup","width":346,"height":500,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13\u002Fmerlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-jumbo.jpg","name":"jumbo","width":708,"height":1024,"__typename":"ImageRendition"},"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13\u002Fmerlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-superJumbo.jpg","name":"superJumbo","width":1415,"height":2048,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F21winterutilitiesOAK13\u002Fmerlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleInline.jpg","name":"articleInline","width":190,"height":275,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190221nyregion21winterutilitiesOAK13merlin_77720485_1f5be529-e659-49c3-a0bc-a3f312835d14-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNWZiM2E1ZmEtZjBmNC01ZTBhLTg5ZTEtOWU5YzcwMjJiOTRk.caption":{"text":"In 1978, a water main break caused severe flooding in Bushwick, Brooklyn.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.44.content.0":{"__typename":"TextInline","text":"How to replace century-old utilities: slowly, and carefully ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.45.content.0":{"__typename":"TextInline","text":"Upgrading the city’s below-street utilities is a slow, painstaking process, “because you have such a fixed-in-place system,” said Rae Zimmerman, a research professor of planning and public administration at New York University.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.47.content.0":{"__typename":"TextInline","text":"But there is progress. Con Edison officials said they had begun replacing the city’s nearly 1,600 miles of natural gas lines — which were made of either cast iron or unprotected steel — with plastic piping. The plastic is less susceptible to corrosion, cracks and leaks, said the officials, who added that they were swapping about 100 miles of line each year.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49.content.0":{"__typename":"TextInline","text":"The city is also replacing older, leak-prone ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.49.content.1":{"__typename":"TextInline","text":"water and sewer mains.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.0":{"__typename":"TextInline","text":"Some pipes that are more than a century old hold up because they were built with a thicker grade of cast iron, according to Environmental Protection Department officials. For less healthy ones, the agency has invested more than $1 billion in the past five years — with an additional $1.4 billion budgeted over the next five years — for upgrades and replacements. New pipes will be made of a more durable, graphite-rich cast iron known as ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.1":{"__typename":"TextInline","text":"ductile ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.50.content.2":{"__typename":"TextInline","text":"iron.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk","imageType":"photo","url":"\u002Fimagepages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4.html","uri":"nyt:\u002F\u002Fimage\u002F9a9c89de-60c1-583f-a4bc-6caaafc7896d","credit":"Hiroko Masuike\u002FThe New York Times","legacyHtmlCaption":"Matt Cruz snowboarded through Manhattan’s Lower East Side after a snowstorm in 2016 left the streets coated in slush and rock salt.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20171207nyregion00winter400winter4-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4\u002F00winter4-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20171207nyregion00winter400winter4-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4\u002F00winter4-popup.jpg","name":"popup","width":650,"height":433,"__typename":"ImageRendition"},"ImageRendition:images20171207nyregion00winter400winter4-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4\u002F00winter4-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20171207nyregion00winter400winter4-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4\u002F00winter4-superJumbo.jpg","name":"superJumbo","width":2048,"height":1365,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20171207nyregion00winter400winter4-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20171207nyregion00winter400winter4-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20171207nyregion00winter400winter4-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20171207nyregion00winter400winter4-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20171207nyregion00winter400winter4-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2017\u002F12\u002F07\u002Fnyregion\u002F00winter4\u002F00winter4-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20171207nyregion00winter400winter4-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvOWE5Yzg5ZGUtNjBjMS01ODNmLWE0YmMtNmNhYWFmYzc4OTZk.caption":{"text":"Matt Cruz snowboarded through Manhattan’s Lower East Side after a snowstorm in 2016 left the streets coated in slush and rock salt.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.53.content.0":{"__typename":"TextInline","text":"Construction during the winter isn’t always a good idea","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.54.content.0":{"__typename":"TextInline","text":"Of course, winter also poses problems aboveground. Most nonemergency repair and construction work involving concrete is halted because concrete and some types of dirt, used to fill in trenches, freeze in colder temperatures, said Ian Michaels, a spokesman for the city’s Department of Design and Construction.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.56.content.0":{"__typename":"TextInline","text":"Digging by hand is also a challenge in frozen ground, so many excavations that are close to pipes and other utilities are put off, Mr. Michaels said. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.58.content.0":{"__typename":"TextInline","text":"And asphalt is harder to obtain because it must be kept and transported at high temperatures, he added.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.60.content.0":{"__typename":"TextInline","text":"In the extreme cold, city officials will not risk shutting down water mains for construction because spillage into the street could freeze, Mr. Michaels said. He added that stopping the water flow could freeze the private water-service connections that branch off the mains, he said.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.62.content.0":{"__typename":"TextInline","text":"Even the basic task of locating utilities under the street can be complicated because infrastructure has been added piecemeal over the decades.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F00winterutilitiesOAK12.html","uri":"nyt:\u002F\u002Fimage\u002F697df895-9d93-5db8-938a-f00807904ac4","credit":"Ãngel Franco\u002FThe New York Times","legacyHtmlCaption":"A water main break in Manhattan in 2014. “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” said Tasos Georgelis of the city's Department of Environmental Protection.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK12\u002Fmerlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg","name":"articleLarge","width":600,"height":401,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK12\u002Fmerlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-popup.jpg","name":"popup","width":650,"height":434,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK12\u002Fmerlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-jumbo.jpg","name":"jumbo","width":1024,"height":684,"__typename":"ImageRendition"},"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK12\u002Fmerlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-superJumbo.jpg","name":"superJumbo","width":2048,"height":1368,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F15\u002Fnyregion\u002F00winterutilitiesOAK12\u002Fmerlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190215nyregion00winterutilitiesOAK12merlin_77751796_7f1b7a7a-23e9-49b2-b12e-1edfed680911-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNjk3ZGY4OTUtOWQ5My01ZGI4LTkzOGEtZjAwODA3OTA0YWM0.caption":{"text":"A water main break in Manhattan in 2014. “When you get a freeze and a thaw, the ground around the water mains expands and contracts, and puts external pressure on the pipes,” said Tasos Georgelis of the city's Department of Environmental Protection.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.65.content.0":{"__typename":"TextInline","text":"Almost 1.8 million potholes filled since de Blasio took office","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.66.content.0":{"__typename":"TextInline","text":"Street surfaces are affected by winter weather, too: Last year, the city filled 255,904 potholes.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.0":{"__typename":"TextInline","text":"And should anyone forget that filling potholes, like snow removal, is a sacred staple of constituent services, transportation officials have compiled the number of potholes the city has filled — more than 1,786,300","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.1":{"__typename":"TextInline","text":" — since Mayor Bill de Blasio took office in 2014","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.67.content.2":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.69.content.0":{"__typename":"TextInline","text":"Potholes form when water and salt seep into cracks, freeze and expand, creating a larger crevice, said Joe Carbone, who works for the Transportation Department, where he is known as the pothole chief.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.0":{"__typename":"TextInline","text":"Simply put, more freeze-thaw cycles ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.1":{"__typename":"TextInline","text":"result in more potholes","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2011\u002F02\u002F07\u002Fnyregion\u002F07pothole.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.71.content.2":{"__typename":"TextInline","text":", he said. Currently, the department has 25 crews repairing potholes. During peak pothole-repair season in early March, that number can expand to more than 60.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.73.content.0":{"__typename":"TextInline","text":"Still, the department is continually resurfacing the city’s more than 6,000 miles of streets and 19,000 lane miles. Each year, agency officials said, it uses more than one million tons of asphalt to repave more than 1,300 lane-miles of street.","formats":[]},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4","imageType":"photo","url":"\u002Fimagepages\u002F2019\u002F02\u002F21\u002Fnyregion\u002F00winterutilities2.html","uri":"nyt:\u002F\u002Fimage\u002F0e0dd71f-e2f7-5d01-8616-93a4ae58c468","credit":"Chang W. Lee\u002FThe New York Times","legacyHtmlCaption":"Workers learning how to fix water main breaks at a training center in Queens.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F12\u002Fnyregion\u002F00winterutilities2\u002Fmerlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg","name":"articleLarge","width":600,"height":400,"__typename":"ImageRendition"},"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F12\u002Fnyregion\u002F00winterutilities2\u002Fmerlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-popup.jpg","name":"popup","width":650,"height":434,"__typename":"ImageRendition"},"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F12\u002Fnyregion\u002F00winterutilities2\u002Fmerlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-jumbo.jpg","name":"jumbo","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F12\u002Fnyregion\u002F00winterutilities2\u002Fmerlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-superJumbo.jpg","name":"superJumbo","width":2048,"height":1366,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2019\u002F02\u002F12\u002Fnyregion\u002F00winterutilities2\u002Fmerlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleInline.jpg","name":"articleInline","width":190,"height":127,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20190212nyregion00winterutilities2merlin_150504129_e893b874-01eb-4d8f-8158-18512153e414-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvMGUwZGQ3MWYtZTJmNy01ZDAxLTg2MTYtOTNhNGFlNThjNDY4.caption":{"text":"Workers learning how to fix water main breaks at a training center in Queens.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.76.content.0":{"__typename":"TextInline","text":"So, where do people learn how to fix some of these issues?","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.0":{"__typename":"TextInline","text":"Of the 400 ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.1":{"__typename":"TextInline","text":"city","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.77.content.2":{"__typename":"TextInline","text":" laborers who work on water mains, many learn the finer points of leak repair at a training center in Queens, where underground pipes are made to spring leaks for repair drills.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.0":{"__typename":"TextInline","text":"Workers","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.1":{"__typename":"TextInline","text":" from the Department of Environmental Protection recently gathered around a muddy hole as a co-worker, Nehemiah ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.2":{"__typename":"TextInline","text":"Dejesus","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.79.content.3":{"__typename":"TextInline","text":", scrambled to apply a stainless-steel repair clamp around a cracked segment that was spewing water.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.81.content.0":{"__typename":"TextInline","text":"“Don’t get nervous,” instructed Milton Velez, the agency’s district supervisor for Queens.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@filterEmpty.82.content.0":{"__typename":"TextInline","text":"“I’m not,” Mr. Dejesus said as he secured the clamp and stopped the leak. “It’s ‘Showtime at the Apollo.’”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]":{"__typename":"Interactive","promotionalHeadline":"Why Are New York City’s Streets Always Under Construction?","promotionalSummary":"The answer, in large measure, lies in what's buried beneath.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]","typename":"CreativeWorkHeadline"},"summary":"The answer, in large measure, lies in what's buried beneath.","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzM5NDgwMzc0LTY2ZDMtNTYwMy05Y2UxLTU4Y2ZhMTI5ODhlMg==","typename":"Section"},"url":"https:\u002F\u002Fwww.nytimes.com\u002Finteractive\u002F2016\u002F08\u002F18\u002Fnyregion\u002Fnew-york-101-streets-repair-and-maintenance.html","firstPublished":"2016-08-18T08:50:14.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]":{"default":"Why Are New York City’s Streets Always Under Construction?","__typename":"CreativeWorkHeadline"},"ImageRendition:images20160812nyregionnyc101-01nyc101-01-videoLarge-v7.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2016\u002F08\u002F12\u002Fnyregion\u002Fnyc101-01\u002Fnyc101-01-videoLarge-v7.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20160812nyregionnyc101-01nyc101-01-mediumThreeByTwo440-v7.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2016\u002F08\u002F12\u002Fnyregion\u002Fnyc101-01\u002Fnyc101-01-mediumThreeByTwo440-v7.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20160812nyregionnyc101-01nyc101-01-videoLarge-v7.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20160812nyregionnyc101-01nyc101-01-mediumThreeByTwo440-v7.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.legacy":{"reviewInformation":"","__typename":"ArticleLegacyData","htmlExtendedAuthorOrArticleInformation":"","htmlInfoBox":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.0":{"type":"facebook","account":"corey.kilgannon.9","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.1":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fcorey-kilgannon","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.2":{"type":"twitter","account":"coreykilgannon","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.contactDetails.socialMedia.2","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==.bylines.0.creators.0.legacyData":{"htmlShortBiography":"\u003Cp\u003ECorey Kilgannon is a Metro reporter covering news and human interest stories. His writes the \u003Ca href=\"https:\u002F\u002Fwww.nytimes.com\u002Fcolumn\u002Fcharacter-study\"\u003ECharacter Study\u003C\u002Fa\u003E column in the Sunday Metropolitan section. He was also part of the team that won the 2009 Pulitzer Prize for Breaking News.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"ROOT_QUERY":{"workOrLocation({\"id\":\"\u002F2019\u002F02\u002F21\u002Fnyregion\u002Fwinter-weather-manholes-pipes.html\"})":{"type":"id","generated":false,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlL2QwYWJhMGFkLTQ4NjEtNTQ4Yy04ZmYzLTFkOTYwNmRiNTk2MA==","typename":"Article"}}},"config":{"gqlUrl":"https:\u002F\u002Fsamizdat-graphql.nytimes.com\u002Fgraphql\u002Fv2","gqlRequestHeaders":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.3","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYOpRoYg5X01qAqNyBDM32EI\u002FE77nkFzd2rrVjhdi\u002FVAZfBIrPayyYykIIN+d5GMImm3wg6CmTTkBo7ixmwd7Xv24QSDpjuX0gQ1eqxOEWZ0FHWZWkh4jfLcwqkgKmfHJuvOctEiE\u002FWic5Qrle323SMDKF8sAqClv8VKA8hyrXHbPDAlAaxq3EPOGjJqpHEdWNVg2S0pN62NSmSudT\u002Fap\u002FBqZf7FqsI2cUxv2mUKzmyy+rYwbhd8TRgj1kFprNOaldrluO4dXjubJIY4qEyJY5Dc\u002FF03sGED4AiGBPVYtPh8zscG64yJJ9Njs1ReyUCSX4jYmxoZOnO+6GfXE0s2xQIDAQAB","x-nyt-continent":"NA","x-nyt-country":"US","x-nyt-region":"AL","x-nyt-gmt-offset":"-600"},"gqlFetchTimeout":4000,"disablePersistedQueries":false,"serviceWorkerFile":"service-worker-test-1550877239857.js","initialDeviceType":"desktop","abraTest":{}},"ssrQuery":{},"externalAssets":[]};
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ !function(s){function e(e){for(var t,d,r=e[0],a=e[1],c=e[2],n=0,o=[];n<r.length;n++)d=r[n],b[d]&&o.push(b[d][0]),b[d]=0;for(t in a)Object.prototype.hasOwnProperty.call(a,t)&&(s[t]=a[t]);for(p&&p(e);o.length;)o.shift()();return f.push.apply(f,c||[]),i()}function i(){for(var e,t=0;t<f.length;t++){for(var d=f[t],r=!0,a=1;a<d.length;a++){var c=d[a];0!==b[c]&&(r=!1)}r&&(f.splice(t--,1),e=u(u.s=d[0]))}return e}var d={},l={8:0},b={8:0},f=[];function u(e){if(d[e])return d[e].exports;var t=d[e]={i:e,l:!1,exports:{}};return s[e].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.e=function(f){var e=[];l[f]?e.push(l[f]):0!==l[f]&&{13:1,23:1,30:1,36:1}[f]&&e.push(l[f]=new Promise(function(e,r){for(var t=({1:"vendors~answerpage~audio~byline~collections~home~hubpage~paidpost~reviews~search~slideshow~story~tim~23412e0e",2:"answerpage~byline~collections~hubpage~reviews~search~slideshow~timeswire~trending~weddings",3:"answerpage~hubpage~search~timeswire~weddings",4:"vendors~audio~home~paidpost~story~trending",5:"vendors~audio~home~paidpost~story",6:"byline~your-list",7:"newsletter~regilite",9:"answerpage",10:"audio",11:"byline",12:"collections",13:"comments",14:"getstarted",15:"home",16:"hubpage",19:"newsletter",20:"newsletters",21:"paidpost",22:"privacy",23:"recirculation",24:"regilite",25:"reviews",26:"search",27:"slide",28:"slideshow",29:"stickyfilljs",30:"story",31:"timeswire",32:"trending",33:"vendors~collections",34:"vendors~getstarted",35:"vendors~slideshow",36:"weddings",37:"your-list"}[f]||f)+"-"+{1:"31d6cfe0d16ae931b73c",2:"31d6cfe0d16ae931b73c",3:"31d6cfe0d16ae931b73c",4:"31d6cfe0d16ae931b73c",5:"31d6cfe0d16ae931b73c",6:"31d6cfe0d16ae931b73c",7:"31d6cfe0d16ae931b73c",9:"31d6cfe0d16ae931b73c",10:"31d6cfe0d16ae931b73c",11:"31d6cfe0d16ae931b73c",12:"31d6cfe0d16ae931b73c",13:"bd0b5475a3386d2edf5e",14:"31d6cfe0d16ae931b73c",15:"31d6cfe0d16ae931b73c",16:"31d6cfe0d16ae931b73c",19:"31d6cfe0d16ae931b73c",20:"31d6cfe0d16ae931b73c",21:"31d6cfe0d16ae931b73c",22:"31d6cfe0d16ae931b73c",23:"0bf326d1cb2aaa1d6a66",24:"31d6cfe0d16ae931b73c",25:"31d6cfe0d16ae931b73c",26:"31d6cfe0d16ae931b73c",27:"31d6cfe0d16ae931b73c",28:"31d6cfe0d16ae931b73c",29:"31d6cfe0d16ae931b73c",30:"5a85d00610931f4dd91d",31:"31d6cfe0d16ae931b73c",32:"31d6cfe0d16ae931b73c",33:"31d6cfe0d16ae931b73c",34:"31d6cfe0d16ae931b73c",35:"31d6cfe0d16ae931b73c",36:"9e51dcb64d66fd0dcd9f",37:"31d6cfe0d16ae931b73c"}[f]+".css",a=u.p+t,d=document.getElementsByTagName("link"),c=0;c<d.length;c++){var n=(s=d[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(n===t||n===a))return e()}var o=document.getElementsByTagName("style");for(c=0;c<o.length;c++){var s;if((n=(s=o[c]).getAttribute("data-href"))===t||n===a)return e()}var i=document.createElement("link");i.rel="stylesheet",i.type="text/css",i.onload=e,i.onerror=function(e){var t=e&&e.target&&e.target.src||a,d=new Error("Loading CSS chunk "+f+" failed.\n("+t+")");d.request=t,delete l[f],i.parentNode.removeChild(i),r(d)},i.href=a,document.getElementsByTagName("head")[0].appendChild(i)}).then(function(){l[f]=0}));var t,d=b[f];if(0!==d)if(d)e.push(d[2]);else{var r=new Promise(function(e,t){d=b[f]=[e,t]});e.push(d[2]=r);var a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,u.nc&&c.setAttribute("nonce",u.nc),c.src=u.p+""+({1:"vendors~answerpage~audio~byline~collections~home~hubpage~paidpost~reviews~search~slideshow~story~tim~23412e0e",2:"answerpage~byline~collections~hubpage~reviews~search~slideshow~timeswire~trending~weddings",3:"answerpage~hubpage~search~timeswire~weddings",4:"vendors~audio~home~paidpost~story~trending",5:"vendors~audio~home~paidpost~story",6:"byline~your-list",7:"newsletter~regilite",9:"answerpage",10:"audio",11:"byline",12:"collections",13:"comments",14:"getstarted",15:"home",16:"hubpage",19:"newsletter",20:"newsletters",21:"paidpost",22:"privacy",23:"recirculation",24:"regilite",25:"reviews",26:"search",27:"slide",28:"slideshow",29:"stickyfilljs",30:"story",31:"timeswire",32:"trending",33:"vendors~collections",34:"vendors~getstarted",35:"vendors~slideshow",36:"weddings",37:"your-list"}[t=f]||t)+"-"+{1:"b722453924901ab03273",2:"4647020c440817f3f0f5",3:"56cfea35b474bdafbfab",4:"ad28408ffcfe728262f1",5:"3a48a154dc74332f3715",6:"cc3948166df1731c694f",7:"a307a6a3734818b95a52",9:"18781537de048c38da38",10:"e43b49e5ecb489a53ce1",11:"e42864335b4f50526f17",12:"5ff17d591da28ff2d117",13:"a26ed5e274585dcf62e8",14:"ed76ffcd24df7ae73b2a",15:"98cb19631aeed75f46c7",16:"90e1ba7434d6670462dd",19:"d0f2c3094a66a6658ae1",20:"0c213c1f088940791259",21:"ed53612bd54ff549e3d0",22:"4ceba937c7af8d3e8bda",23:"8c9606ce1361269935b4",24:"3b704e6f5bf40005aa34",25:"e20ca1355cc0bb42b277",26:"01ec1d35ef19a3a19f3b",27:"33ca9863a256583f6fc9",28:"3d2cb353b8d890725d7c",29:"e6b8e69cbb7eae83c6cf",30:"706cf1fc739ffad9ced5",31:"233a4a430e82b1db8fc4",32:"13f43a5c7ab52db37e70",33:"aa3f1b78f44cf9b9dcac",34:"59460b122b6d99a93e33",35:"816209e0f10fd5f52950",36:"6d88054727245a0da1cd",37:"d001d1f10496c8b8ca4c"}[t]+".js",a=function(e){c.onerror=c.onload=null,clearTimeout(n);var t=b[f];if(0!==t){if(t){var d=e&&("load"===e.type?"missing":e.type),r=e&&e.target&&e.target.src,a=new Error("Loading chunk "+f+" failed.\n("+d+": "+r+")");a.type=d,a.request=r,t[1](a)}b[f]=void 0}};var n=setTimeout(function(){a({type:"timeout",target:c})},12e4);c.onerror=c.onload=a,document.head.appendChild(c)}return Promise.all(e)},u.m=s,u.c=d,u.d=function(e,t,d){u.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:d})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(t,e){if(1&e&&(t=u(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var d=Object.create(null);if(u.r(d),Object.defineProperty(d,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)u.d(d,r,function(e){return t[e]}.bind(null,r));return d},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,"a",t),t},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},u.p="/vi-assets/static-assets/",u.oe=function(e){throw console.error(e),e};var t=window.webpackJsonp=window.webpackJsonp||[],r=t.push.bind(t);t.push=e,t=t.slice();for(var a=0;a<t.length;a++)e(t[a]);var p=r;i()}([]);
+ //# sourceMappingURL=runtime-537f832c50cff9e60e0f.js.map
+ ]]>
+ </script>
+ <script defer="defer" src="/vi-assets/static-assets/vendor-57d51a4f3f5c2e792393.js"></script>
+ <script defer="defer" src="/vi-assets/static-assets/main-f5a7464055d2603cfff7.js"></script>
+ <script>
+ <![CDATA[
+
+ (function(w, l) {
+ w[l] = w[l] || [];
+ w[l].push({
+ 'gtm.start': new Date().getTime(),
+ event: 'gtm.js'
+ });
+ })(window, 'dataLayer');
+ (function(){
+ var url = 'https://et.nytimes.com/pixel' +
+ '?url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-page-pixel%22%2C%22pgType%22%3A%22%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%7D' +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ var img = document.createElement('img');
+ img.src = url;
+ img.style.cssText = 'position: absolute; z-index: -999999; left: -1000px; top: -1000px;';
+ document.body.appendChild(img);
+ })();
+ ]]>
+ </script>
+ <script defer="defer" src="https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&amp;gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&amp;gtm_preview=env-130&amp;gtm_cookies_win=x"></script> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P528B3&amp;gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&amp;gtm_preview=env-130&amp;gtm_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+ <div id="RavenInstaller">
+ <script>
+ <![CDATA[
+ if (window.INSTALL_RAVEN) {
+ window.addEventListener('load', function(event) {
+ var includeRaven = document.getElementById("RavenInstaller");
+ var script = document.createElement("script");
+ script.src = "/vi-assets/static-assets/raven.min-830a6d04a55c283934dd1893d6ddc66d.js";
+ script.onload = function() {
+ /* eslint-disable */
+ // Install Raven
+ window.Raven.config('https://[email protected]/178860', {
+ release: vi.env.RELEASE,
+ environment: vi.env.ENVIRONMENT,
+ ignoreErrors: [/SecurityError: Blocked a frame with origin.*/]
+ }).install(); // Stop using our error handler
+
+ window.nyt_errors.ravenInstalled = true;
+ var regex = /nyt-a=(.*?)(;|$)/;
+ var id = regex.exec(document.cookie);
+
+ if (id !== null) {
+ id = id[1];
+ } else {
+ id = '';
+ } // Setting nyt-a as user context
+
+
+ window.Raven.setUserContext({
+ id: id
+ }); // Pass collected errors to Raven
+
+ window.nyt_errors.list.forEach(function (err) {
+ // weird?
+ if (!err) {
+ return;
+ } // also weird ... ?
+
+
+ if (!err.err) {
+ // maybe err itself is an Error?
+ if (err instanceof Error) {
+ window.Raven.captureException(err, err.data || {});
+ } // else { silently ignore? }
+
+ } // just making sure ...
+
+
+ if (err.err instanceof Error) {
+ window.Raven.captureException(err.err, err.data || {});
+ } // else { silently ignore? }
+
+ }); // Pass collected Tags to Raven
+
+ window.nyt_errors.tags.forEach(function (tag) {
+ window.Raven.setTagsContext(tag);
+ });
+ };
+ includeRaven.appendChild(script);
+ });
+ }
+ ]]>
+ </script>
+ </div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-images.json
new file mode 100644
index 000000000..58b77887f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-images.json
@@ -0,0 +1,4 @@
+[
+ "https:\/\/static01.nyt.com\/images\/2018\/09\/15\/business\/15DEBTS01\/15DEBTS01-facebookJumbo.jpg",
+ "https:\/\/static01.nyt.com\/images\/2018\/09\/15\/business\/15DEBTS01\/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=75&auto=webp&disable=upscale"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-metadata.json
new file mode 100644
index 000000000..52b7f138d
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "By Nelson D. Schwartz",
+ "Direction": null,
+ "Excerpt": "Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.",
+ "Image": "https:\/\/static01.nyt.com\/images\/2018\/09\/15\/business\/15DEBTS01\/15DEBTS01-facebookJumbo.jpg",
+ "Title": "As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected.html
new file mode 100644
index 000000000..855eb5595
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/expected.html
@@ -0,0 +1,214 @@
+<article id="story">
+
+ <header>
+
+
+ <p>
+ Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.
+ </p>
+ <div data-testid="photoviewer-wrapper">
+ <figure aria-label="media" role="group" itemscope="itemscope" itemprop="associatedMedia" itemid="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <p><span>Image</span><img alt src="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale">
+ </p>
+ <figcaption itemprop="caption description">
+ <span>Interest payments on the federal debt could surpass the Defense Department budget in 2023.</span><span itemprop="copyrightHolder"><span>Credit</span><span><span>Credit</span><span>Jeon Heon-Kyun/EPA, via Shutterstock</span></span></span>
+ </figcaption>
+ </figure>
+ </div>
+
+ </header>
+ <section name="articleBody" itemprop="articleBody">
+ <div>
+ <p>
+ The federal government could soon pay more in interest on its debt than it spends on the military, Medicaid or children’s programs.
+ </p>
+ <p>
+ The run-up in borrowing costs is a one-two punch brought on by the need to finance a fast-growing budget deficit, worsened by tax cuts and steadily rising interest rates that will make the debt more expensive.
+ </p>
+ <p>
+ With less money coming in and more going toward interest, political leaders will find it harder to address pressing needs like fixing crumbling roads and bridges or to make emergency moves like pulling the economy out of future recessions.
+ </p>
+ <p>
+ Within a decade, more than $900 billion in interest payments will be due annually, easily outpacing spending on myriad other programs. Already the fastest-growing major government expense, the cost of interest is on track to hit $390 billion next year, nearly 50 percent more than in 2017, according to the Congressional Budget Office.
+ </p>
+ </div>
+ <div>
+ <p>
+ “It’s very much something to worry about,” said C. Eugene Steuerle, a fellow at the Urban Institute and a co-founder of the Urban-Brookings Tax Policy Center in Washington. “Everything else is getting squeezed.”
+ </p>
+ <p>
+ Gradually rising interest rates would have made borrowing more expensive even without additional debt. But the tax cuts passed late last year have created a deeper hole, with the deficit increasing faster than expected. A budget bill <a href="https://www.nytimes.com/2018/02/08/us/politics/congress-budget-deal-vote.html?module=inline" title>approved in February that raised</a> spending by $300 billion over two years will add to the financial pressure.
+ </p>
+ <p>
+ The deficit is expected to total nearly $1 trillion next year — the first time it has been that big since 2012, when the economy was still struggling to recover from the financial crisis and interest rates were near zero.
+ </p>
+ </div>
+
+ <div>
+ <p>
+ Deficit hawks have gone silent, even proposing changes that would exacerbate the deficit. House Republicans introduced legislation this month that would make the tax cuts permanent.
+ </p>
+ <p>
+ “The issue has just disappeared,” said Senator Mark Warner, a Virginia Democrat. “There’s collective amnesia.”
+ </p>
+ </div>
+ <div>
+ <p>
+ The combination, say economists, marks a journey into mostly uncharted financial territory.
+ </p>
+ <p>
+ In the past, government borrowing expanded during recessions and waned in recoveries. That countercyclical policy has been a part of the standard Keynesian toolbox to combat downturns since the Great Depression.
+ </p>
+ <p>
+ The deficit is soaring now as the economy booms, meaning the stimulus is pro-cyclical. The risk is that the government would have less room to maneuver if the economy slows.
+ </p>
+ </div>
+
+ <div>
+ <p>
+ Aside from wartime or a deep downturn like the 1930s or 2008-9, “this sort of aggressive fiscal stimulus is unprecedented in U.S. history,” said Jeffrey Frankel, an economist at Harvard.
+ </p>
+ <p>
+ Pouring gasoline on an already hot economy has resulted in faster growth — the economy expanded at an annualized rate of 4.2 percent in the second quarter. But Mr. Frankel warns that when the economy weakens, the government will find it more difficult to cut taxes or increase spending.
+ </p>
+ <p>
+ Lawmakers might, in fact, feel compelled to cut spending as tax revenue falls, further depressing the economy. “There will eventually be another recession, and this increases the chances we will have to slam on the brakes when the car is already going too slowly,” Mr. Frankel said.
+ </p>
+ <h2 id="link-cb5ee12">
+ Interest costs make it harder for the government to do other things
+ </h2>
+ </div>
+
+ <div>
+ <p>
+ Finding the money to pay investors who hold government debt will crimp other parts of the budget. In a decade, interest on the debt will eat up 13 percent of government spending, up from 6.6 percent in 2017.
+ </p>
+ <p>
+ “By 2020, we will spend more on interest than we do on kids, including education, food stamps and aid to families,” said Marc Goldwein, senior policy director at the Committee for a Responsible Federal Budget, a research and advocacy organization.
+ </p>
+ </div>
+ <div>
+ <p>
+ Interest costs already dwarf spending on many popular programs. For example, grants to students from low-income families for college total roughly $30 billion — about one-tenth of what the government will pay in interest this year. Interest payments will overtake Medicaid in 2020 and the Department of Defense budget in 2023.
+ </p>
+ <p>
+ What’s more, the heavy burden of interest payments could make it harder for the government to repair aging infrastructure or take on other big new projects.
+ </p>
+ <p>
+ Mr. Trump has called for spending $1 trillion on infrastructure, but Congress has not taken up that idea.
+ </p>
+ </div>
+ <div>
+ <p>
+ More about the federal debt and the economy
+ </p>
+
+ </div>
+ <div>
+ <h2 id="link-1a1f1f7a">
+ The U.S. hasn’t faced this issue for years
+ </h2>
+ <p>
+ Until recently, ultralow interest rates, set by the Federal Reserve to support the economy, allowed lawmakers to borrow without fretting too much about the cost of that debt.
+ </p>
+ <p>
+ But as the economy has strengthened, the Fed has gradually raised rates, starting in December 2015. The central bank is expected to push rates up again on Wednesday, and more increases are in store.
+ </p>
+ <p>
+ “When rates went down to record lows, it allowed the government to take on more debt without paying more interest,” Mr. Goldwein said. “That party is ending.”
+ </p>
+ </div>
+
+ <div>
+ <p>
+ Since the beginning of the year, the yield on the 10-year Treasury note has risen by more than half a percentage point, to 3.1 percent. The Congressional Budget Office estimates that the yield will climb to 4.2 percent in 2021. Given that the total public debt of the United States stands at nearly $16 trillion, even a small uptick in rates can cost the government billions.
+ </p>
+
+ </div>
+ <div>
+ <p>
+ There’s no guarantee that these forecasts will prove accurate. If the economy weakens, rates might fall or rise only slightly, reducing interest payments. But rates could also overshoot the budget office forecast.
+ </p>
+ <p>
+ Some members of Congress want to set the stage for even more red ink. Republicans in the House want to make last year’s tax cuts permanent, instead of letting some of them expire at the end of 2025. That would reduce federal revenue by an additional $631 billion over 10 years, according to the <a href="https://www.taxpolicycenter.org/publications/analysis-protecting-family-and-small-business-tax-cuts-act-2018" title rel="noopener noreferrer" target="_blank">Tax Policy Center</a>.
+ </p>
+ <h2 id="link-7b39a7bd">
+ No, the United States isn’t at risk of becoming the next Greece
+ </h2>
+ </div>
+
+ <div>
+ <p>
+ Deficit hawks have warned for years that a day of reckoning is coming, exposing the United States to the kind of economic crisis that overtook profligate borrowers in the past like Greece or Argentina.
+ </p>
+ <p>
+ But most experts say that isn’t likely because the dollar is the world’s reserve currency. As a result, the United States still has plenty of borrowing capacity left because the Fed can print money with fewer consequences than other central banks.
+ </p>
+ <p>
+ And interest rates plunged over the last decade, even as the government turned to the market for trillions each year after the recession. That’s because Treasury bonds are still the favored port of international investors in any economic storm.
+ </p>
+ <p>
+ “We exported a financial crisis a decade ago, and the world responded by sending us money,” said William G. Gale, a senior fellow at the Brookings Institution.
+ </p>
+ <p>
+ But that privileged position has allowed politicians in both parties to avoid politically painful steps like cutting spending or raising taxes.
+ </p>
+ </div>
+ <div>
+ <p>
+ That doesn’t mean rapidly rising interest costs and a bigger deficit won’t eventually catch up with us.
+ </p>
+ <p>
+ Charles Schultze, chairman of the Council of Economic Advisers in the Carter administration, once summed up the danger of deficits with a metaphor. “It’s not so much a question of the wolf at the door, but termites in the woodwork.”
+ </p>
+ <h2 id="link-12df6cc7">
+ But Washington doesn’t want to hear about the potential problems
+ </h2>
+ <p>
+ Rather than simply splitting along party lines, lawmakers’ attitudes toward the deficit also depend on which party is in power. Republicans pilloried the Obama administration for proposing a large stimulus in the depths of the recession in 2009 and complained about the deficit for years.
+ </p>
+ <p>
+ In 2013, Senator Mitch McConnell of Kentucky called the debt and deficit “the transcendent issue of our era.” By 2017, as Senate majority leader, he quickly shepherded the tax cut through Congress.
+ </p>
+ <p>
+ Senator James Lankford, an Oklahoma Republican who warned of the deficit’s dangers in the past, nevertheless played down that threat on the Senate floor as the tax billed neared passage.
+ </p>
+ <p>
+ “I understand it’s a risk, but I think it’s an appropriate risk to be able to say let’s allow Americans to keep more of their own money to invest in this economy,” he said.
+ </p>
+ <p>
+ He also claimed the tax cuts would pay for themselves even as the Congressional Budget Office estimated that they would add $250 billion to the deficit on average from 2019 to 2024.
+ </p>
+ </div>
+ <div>
+ <p>
+ In an interview, Mr. Lankford insisted that the jury was still out on whether the tax cuts would generate additional revenue, citing the strong economic growth recently.
+ </p>
+ <p>
+ While the Republican about-face has been much more striking, Democrats have adjusted their position, too.
+ </p>
+ <p>
+ Mr. Warner, the Virginia Democrat, called last year’s tax bill “the worst piece of legislation we have passed since I arrived in the Senate.” In 2009, however, when Congress passed an $800 billion stimulus bill backed by the Obama administration, he called it “a responsible mix of tax cuts and investments that will create jobs.”
+ </p>
+ <p>
+ The difference, Mr. Warner said, was that the economy was near the precipice then.
+ </p>
+ <p>
+ “There was virtual unanimity among economists that we needed a stimulus,” he said. “But a $2 trillion tax cut at the end of a business cycle with borrowed money won’t end well.”
+ </p>
+ </div>
+ </section>
+ <div>
+
+ <div>
+ <p>
+ Nelson D. Schwartz has covered economics since 2012. Previously, he wrote about Wall Street and banking, and also served as European economic correspondent in Paris. He joined The Times in 2007 as a feature writer for the Sunday Business section. <span><a href="https://twitter.com/NelsonSchwartz" rel="noopener noreferrer" target="_blank"><span>@</span>NelsonSchwartz</a></span>
+ </p>
+ </div>
+ <div><p>
+ A version of this article appears in print on </p><p>, on Page </p><p>A</p><p>1</p><p> of the New York edition</p><p> with the headline: </p><p>What May Soon Exceed Cost of U.S. Military? Interest on U.S. Debt <span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span>
+ </p></div>
+
+ </div>
+
+ </article> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/source.html
new file mode 100644
index 000000000..81a2a68c3
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/nytimes-4/source.html
@@ -0,0 +1,3896 @@
+<!DOCTYPE html>
+<html lang="en" itemid="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" itemtype="http://schema.org/NewsArticle" itemscope="true" class="story" xmlns:og="http://opengraphprotocol.org/schema/" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <title data-rh="true">
+ As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military - The New York Times
+ </title>
+ <meta data-rh="true" itemprop="inLanguage" content="en-US" />
+ <meta data-rh="true" property="article:published" itemprop="datePublished" content="2018-09-25T21:28:31.000Z" />
+ <meta data-rh="true" property="article:modified" itemprop="dateModified" content="2018-09-28T13:09:07.032Z" />
+ <meta data-rh="true" http-equiv="Content-Language" content="en" />
+ <meta data-rh="true" name="robots" content="noarchive" />
+ <meta data-rh="true" name="articleid" itemprop="identifier" content="100000006102576" />
+ <meta data-rh="true" name="nyt_uri" itemprop="identifier" content="nyt://article/5563b851-3a8e-58f7-8f67-0716698cebaa" />
+ <meta data-rh="true" name="pubp_event_id" itemprop="identifier" content="pubp://event/98755cd27ffd446db9ef9870a3fb9db8" />
+ <meta data-rh="true" name="description" itemprop="description" content="Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs." />
+ <meta data-rh="true" name="image" itemprop="image" content="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/15DEBTS01-facebookJumbo.jpg" />
+ <meta data-rh="true" name="byl" content="By Nelson D. Schwartz" />
+ <meta data-rh="true" name="thumbnail" itemprop="thumbnailUrl" content="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/15DEBTS01-thumbStandard.jpg" />
+ <meta data-rh="true" name="news_keywords" content="US National Debt,Federal Budget,US Politics,Donald Trump,Interest rate,US Military,US Economy,Federal Taxes,US Dollar,Recession and Depression,Congressional Budget Office,Federal Reserve" />
+ <meta data-rh="true" name="pdate" content="20180925" />
+ <meta data-rh="true" property="og:url" content="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <meta data-rh="true" property="og:type" content="article" />
+ <meta data-rh="true" property="og:title" content="As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military" />
+ <meta data-rh="true" property="og:image" content="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/15DEBTS01-facebookJumbo.jpg" />
+ <meta data-rh="true" property="og:description" content="Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs." />
+ <meta data-rh="true" property="twitter:url" content="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <meta data-rh="true" property="twitter:title" content="As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military" />
+ <meta data-rh="true" property="twitter:description" content="Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs." />
+ <meta data-rh="true" property="twitter:image" content="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/15DEBTS01-videoSixteenByNineJumbo1600.jpg" />
+ <meta data-rh="true" property="twitter:image:alt" content="Interest payments on the federal debt could surpass the Defense Department budget in 2023." />
+ <meta data-rh="true" property="twitter:card" content="summary_large_image" />
+ <meta data-rh="true" property="article:section" itemprop="articleSection" content="Business" />
+ <meta data-rh="true" property="article:tag" content="National Debt (US)" />
+ <meta data-rh="true" property="article:tag" content="Federal Budget (US)" />
+ <meta data-rh="true" property="article:tag" content="United States Politics and Government" />
+ <meta data-rh="true" property="article:tag" content="Trump, Donald J" />
+ <meta data-rh="true" property="article:tag" content="Interest Rates" />
+ <meta data-rh="true" property="article:tag" content="United States Defense and Military Forces" />
+ <meta data-rh="true" property="article:tag" content="United States Economy" />
+ <meta data-rh="true" property="article:tag" content="Federal Taxes (US)" />
+ <meta data-rh="true" property="article:tag" content="US Dollar (Currency)" />
+ <meta data-rh="true" property="article:tag" content="Recession and Depression" />
+ <meta data-rh="true" property="article:tag" content="Congressional Budget Office" />
+ <meta data-rh="true" property="article:tag" content="Federal Reserve System" />
+ <meta data-rh="true" name="CG" content="business" />
+ <meta data-rh="true" name="SCG" content="economy" />
+ <meta data-rh="true" name="CN" content="" />
+ <meta data-rh="true" name="CT" content="" />
+ <meta data-rh="true" name="PT" content="article" />
+ <meta data-rh="true" name="PST" content="News" />
+ <meta data-rh="true" name="genre" itemprop="genre" content="News" />
+ <meta data-rh="true" name="url" itemprop="url" content="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <meta data-rh="true" name="msapplication-starturl" content="https://www.nytimes.com" />
+ <meta data-rh="true" property="al:android:url" content="nytimes://reader/id/100000006102576" />
+ <meta data-rh="true" property="al:android:package" content="com.nytimes.android" />
+ <meta data-rh="true" property="al:android:app_name" content="NYTimes" />
+ <meta data-rh="true" name="twitter:app:name:googleplay" content="NYTimes" />
+ <meta data-rh="true" name="twitter:app:id:googleplay" content="com.nytimes.android" />
+ <meta data-rh="true" name="twitter:app:url:googleplay" content="nytimes://reader/id/100000006102576" />
+ <meta data-rh="true" property="al:iphone:url" content="nytimes://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <meta data-rh="true" property="al:iphone:app_store_id" content="284862083" />
+ <meta data-rh="true" property="al:iphone:app_name" content="NYTimes" />
+ <meta data-rh="true" property="al:ipad:url" content="nytimes://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <meta data-rh="true" property="al:ipad:app_store_id" content="357066198" />
+ <meta data-rh="true" property="al:ipad:app_name" content="NYTimes" />
+ <script>
+ <![CDATA[
+
+ (function() {
+ var gqlUrl = 'https://samizdat-graphql.nytimes.com/graphql/v2';
+ try {
+ var URLparams = window.location.search.slice(1).split('&');
+ var qs = URLparams.reduce(function(acc, cur){
+ if (cur.split('=')[0] === 'ip-override'){
+ return ('?' + cur);
+ }
+ return acc;
+ }, '');
+ gqlUrl = gqlUrl + qs;
+ }
+ catch (e) {
+ console.warn(e);
+ }
+ var xhr = new XMLHttpRequest();
+ xhr.withCredentials = true;
+ xhr.open('POST', gqlUrl, true);
+ xhr.setRequestHeader('Content-Type', 'application/json');
+ xhr.setRequestHeader('nyt-app-type', 'project-vi');
+ xhr.setRequestHeader('nyt-app-version', '0.0.3');
+ xhr.setRequestHeader('nyt-token', 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYOpRoYg5X01qAqNyBDM32EI/E77nkFzd2rrVjhdi/VAZfBIrPayyYykIIN+d5GMImm3wg6CmTTkBo7ixmwd7Xv24QSDpjuX0gQ1eqxOEWZ0FHWZWkh4jfLcwqkgKmfHJuvOctEiE/Wic5Qrle323SMDKF8sAqClv8VKA8hyrXHbPDAlAaxq3EPOGjJqpHEdWNVg2S0pN62NSmSudT/ap/BqZf7FqsI2cUxv2mUKzmyy+rYwbhd8TRgj1kFprNOaldrluO4dXjubJIY4qEyJY5Dc/F03sGED4AiGBPVYtPh8zscG64yJJ9Njs1ReyUCSX4jYmxoZOnO+6GfXE0s2xQIDAQAB');
+ xhr.send('{"operationName":"UserQuery","variables":{},"query":" query UserQuery { user { __typename profile { displayName } userInfo { regiId entitlements demographics { emailSubscriptions wat bundleSubscriptions { bundle inGrace promotion source } } } subscriptionDetails { graceStartDate graceEndDate isFreeTrial hasQueuedSub startDate endDate status entitlements } } } "}');
+ window.userXhrObject = xhr;
+ })();
+
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.vi = window.vi || {};
+ window.vi.env = Object.freeze({"JKIDD_PATH":"https://a.nytimes.com/svc/nyt/data-layer","ET2_URL":"https://a.et.nytimes.com","WEDDINGS_PATH":"https://content.api.nytimes.com","GDPR_PATH":"https://us-central1-nyt-wfvi-prd.cloudfunctions.net/gdpr-email-form","ABRA_ET_URL":"//et.nytimes.com","NODE_ENV":"production","SENTRY_SAMPLE_RATE":"10","EXPERIMENTAL_ROUTE_PREFIX":"","ENVIRONMENT":"prd","RELEASE":"3e64731fc0cf7fc3a5426ede69c85fe494706439","AUTH_HOST":"https://myaccount.nytimes.com","SWG_PUBLICATION_ID":"nytimes.com"});
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ window.swgUserInfoXhrObject = new XMLHttpRequest();
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ document.domain = 'nytimes.com';
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ var userAgent = window.navigator.userAgent || window.navigator.vendor || window.opera;
+ var inAndroid = userAgent.indexOf('nyt_android') !== -1;
+ var iniOS = userAgent.indexOf('nytios') !== -1;
+ if (inAndroid || iniOS) document.documentElement.classList.add('NYTApp');
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ !function(r,e){var i,a,c,p,s,l=[],
+ u="object"==typeof r.navigator&&r.navigator.sendBeacon?"beacon":"polybeacon";function f(){var e,t,
+ n=r.crypto||r.msCrypto;if(n)t=n.getRandomValues(new Uint8Array(18));else for(t=[];t.length<18;
+ )t.push(256*Math.random()^255&(e=e||+new Date)),e=Math.floor(e/256);return btoa(
+ String.fromCharCode.apply(String,t)).replace(/\+/g,"-").replace(/\//g,"_")}if(r.nyt_et)try{
+ console.warn("et2 snippet should only load once per page")}catch(e){}else r.nyt_et=function(){var e,
+ t,n=arguments;function o(){l.length&&(function(e,t){if("beacon"===u)return r.navigator.sendBeacon(e,
+ t);var n="function"==typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP")
+ ;n.open("POST",e),n.withCredentials=!0,n.setRequestHeader("Accept","*/*"),
+ "string"==typeof t?n.setRequestHeader("Content-Type","text/plain;charset=UTF-8"
+ ):"[object Blob]"==={}.toString.call(t)&&t.type&&n.setRequestHeader("Content-Type",t.type);try{
+ n.send(t)}catch(e){}}(i+"/track",JSON.stringify(l)),l.length=0,clearTimeout(s),s=null)}if(
+ "string"==typeof n[0]&&/init/.test(n[0])&&(c=f(),"init"==n[0]&&!a)){if(a=f(),
+ "string"!=typeof n[1]||!/^http/.test(n[1]))throw new Error("init must include an et host url")
+ ;i=String(n[1]).replace(/\/$/,""),"string"==typeof n[2]&&(p=n[2])}e=n[n.length-1],
+ i&&"object"==typeof e&&(t="page"==e.subject?c:f(),e.sourceApp&&(p=e.sourceApp),e.sourceApp=p,l.push(
+ {context_id:a,pageview_id:c,event_id:t,client_lib:"cfc97c2",sourceApp:p,how:u,client_ts:+new Date,
+ data:JSON.parse(JSON.stringify(e))}),"send"==n[0]||t==c?o():s||(s=setTimeout(o,5500)))},
+ r.nyt_et.get_pageview_id=function(){return c}}(window);
+ ;
+ nyt_et('init', "https://a.et.nytimes.com", "nyt-vi",
+ {
+ subject: 'page',
+ assetUrl: (document.querySelector('link[rel=canonical]') || {}).href,
+ url: location.href,
+ referrer: document.referrer || void 0,
+ client_tz_offset: (new Date).getTimezoneOffset(),
+ sourceApp: "nyt-vi",
+ });
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ var NYTD = NYTD || {};
+ NYTD.PageViewId = {};
+ NYTD.PageViewId.update = function() {
+ NYTD.PageViewId.current = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ const r = (Math.random() * 16) | 0;
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ });
+ return NYTD.PageViewId.current;
+ };
+ NYTD.PageViewId.update();
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ 100*Math.random()<=vi.env.SENTRY_SAMPLE_RATE?(window.INSTALL_RAVEN=!0,window.nyt_errors={ravenInstalled:!1,list:[],tags:[]},window.onerror=function(n,r,o,w,i){if(!window.nyt_errors.ravenInstalled){var t={err:i,data:{}};window.nyt_errors.list.push(t)}}):window.INSTALL_RAVEN=!1;
+ ]]>
+ </script>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
+ <link rel="shortcut icon" href="/vi-assets/static-assets/favicon-4bf96cb6a1093748bf5b3c429accb9b4.ico" />
+ <link rel="apple-touch-icon" href="/vi-assets/static-assets/apple-touch-icon-319373aaf4524d94d38aa599c56b8655.png" />
+ <link rel="apple-touch-icon-precomposed" sizes="144×144" href="/vi-assets/static-assets/ios-ipad-144x144-319373aaf4524d94d38aa599c56b8655.png" />
+ <link rel="apple-touch-icon-precomposed" sizes="114×114" href="/vi-assets/static-assets/ios-iphone-114x144-61d373c43aa8365d3940c5f1135f4597.png" />
+ <link rel="apple-touch-icon-precomposed" href="/vi-assets/static-assets/ios-default-homescreen-57x57-7cccbfb151c7db793e92ea58c30b9e72.png" />
+ <meta property="fb:app_id" content="9869919170" />
+ <meta name="twitter:site" value="@nytimes" />
+ <script>
+ <![CDATA[
+ var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function e(t){var e=r[t];return e&&e[1]||null}function n(t,e){if(t){var n,r,o=e[0],i=e[1],c=0,u=0;if(1!==i.length||4294967296!==i[0])for(n=a(t+" "+o)>>>0,c=0,u=0;r=i[c++];)if(n<(u+=r[0]))return r}}function a(t){for(var e,n,a,r,o,i,c,u=0,l=0,s=[],f=[e=1732584193,n=4023233417,~e,~n,3285377520],h=[],p=t.length;l<=p;)h[l>>2]|=(l<p?t.charCodeAt(l):128)<<8*(3-l++%4);for(h[c=p+8>>2|15]=p<<3;u<=c;u+=16){for(e=f,l=0;l<80;e=[0|[(i=((t=e[0])<<5|t>>>27)+e[4]+(s[l]=l<16?~~h[u+l]:i<<1|i>>>31)+1518500249)+((n=e[1])&(a=e[2])|~n&(r=e[3])),o=i+(n^a^r)+341275144,i+(n&a|n&r|a&r)+882459459,o+1535694389][0|l++/20],t,n<<30|n>>>2,a,r])i=s[l-3]^s[l-8]^s[l-14]^s[l-16];for(l=5;l;)f[--l]=f[l]+e[l]|0}return f[0]}var r,o={};return t.dataLayer=t.dataLayer||[],e.init=function(e){var a,o,i,c,u,l,s,f,h,p,d=[],v=[],m=(t.document.cookie.match(/(?:^|;) *nyt-a=([^;]*)/)||[])[1],g=(t.document.cookie.match(/(?:^|;) *ab7=([^;]*)/)||[])[1],b=(t.location.search.match(/(?:^\?|&)abra=([^&]*)/)||[])[1];if(r)throw new Error("can't init twice");for(r={},u=(decodeURIComponent(g||"")+"&"+decodeURIComponent(b||"")).split("&"),a=u.length-1;a>=0;a--)l=u[a].split("="),l.length<2||(s=l[0])&&!r[s]&&(f=l[1]||null,r[s]=[,f,1],f&&d.push(s+"="+f),v.push({test:s,variant:f||"0"}));for(a=0;a<e.length;a++)i=e[a],(o=i[0])in r||(c=n(m,i)||[],c[0],h=c[1],p=!!c[2],r[o]=c,h&&d.push(o.replace(/[^\w-]/g)+"="+(""+h).replace(/[^\w-]/g)),p&&v.push({test:o,variant:h||"0"}));d.length&&t.document.documentElement.setAttribute("data-nyt-ab",d.join(" ")),v.length&&t.dataLayer.push({event:"ab-alloc",allocs:v})},e.reportExposure=function(e,n){if(!o[e]){o[e]=1;var a=r[e];if(a){var i=a[1];a[2]&&t.dataLayer.push({event:"ab-expose",abtest:{test:e,variant:i||"0"}})}n&&t.setTimeout(function(){n(null)},0)}},e}(this);;
+ NYTD.Abra.init([["WP_Platform",[[4294967296,"vi",0]]],["vi-ads-et",[[257698038,"2_remainder",1],[4037269258,null,0]]],["messaging-optimizely",[[4294967296,"1",0]]],["PER_MoreIn_AU_NZ",[[858993460,"0_control",1],[858993459,"1_au_top_stories",1],[858993459,"2_au_section_front",1],[858993459,"3_au_most_popular",1],[858993459,"4_editors_picks",1]]],["PER_MoreIn_World",[[85899346,"0_control",1],[85899346,"1_au_top_stories",1],[85899346,"2_au_section_front",1],[85899346,"3_au_most_popular",1],[85899346,"4_editors_picks",1],[3865470566,null,0]]],["PER_Vi_Personalization",[[429496730,"0_control",1],[429496730,"1_personalized_best",1],[3435973836,"2_personalized",1]]],["PER_Vi_Personalization_Ramp",[[4294967296,"0_per_on",0]]],["PER_vi_personalization_story_trending",[[858993460,"0_trending_trending",1],[429496729,"1_trending_popular",1],[429496730,"2_trending_als",1],[429496729,"3_popular_trending",1],[429496730,"4_popular_popular",1],[429496730,"5_popular_als",1],[429496729,"6_recommended_trending",1],[429496730,"7_recommended_popular",1],[429496729,"8_recommended_als",1]]],["STORY_bn_disco",[[1431655766,"0_control",1],[1431655765,"1_interactive1",1],[1431655765,"2_interactive2",1]]],["STORY_comment_btn",[[1073741824,"0_default",1],[1073741824,"1_bab",1],[2147483648,null,0]]],["STORY_relatedLinks",[[4294967296,"0",0]]],["STORY_EP_Recirc",[[1431655766,"0_control",1],[1431655765,"1_picksAboveMore",1],[1431655765,"2_picksBelowMore",1]]],["AD_MPC-355",[[1460288881,"0_control",1],[1417339208,"1_adslotwhitelist",1],[1417339207,"2_adslotunblock",1]]],["STORY_newsletter",[[1417339208,"0_control",1],[1417339208,"1_footertop",1],[1460288880,"2_ccol",1]]],["DTI_ET2",[[4294967296,"on",0]]],["STORY_Survey",[[4037269259,"0_control",1],[85899346,"1_question1",1],[85899346,"2_question2",1],[85899345,"3_question3",1]]],["HOMEPAGE_midterms",[[85899346,"0_default",1],[4209067950,"1_midterms",1]]],["dfp_lazy_load_api",[[4294968,"0_control",1],[4294967,"1",1],[4286377361,null,0]]],["medianet_toggle",[[4294967296,"0_default",1]]],["STORY_Packaging",[[858993460,"0_control",1],[858993459,"1",1],[858993459,"2",1],[858993459,"3",1],[858993459,"4",1]]],["MKT_incognito_msg_0918",[[644245095,"0_inline_sub",1],[644245094,"1_inline_app",1],[644245095,"2_expanded_sub",1],[644245094,"3_expanded_app",1],[644245094,"4_trunct_regi",1],[429496730,"5_survey",1],[644245094,null,0]]],["MKT_Redbird_Intl",[[613566757,"0_Control",1],[613566757,"1_GW2_FT_CC",1],[613566756,"2_GW2_FT_NoCC",1],[613566757,"3_GW2_Regi",1],[613566756,"4_GW3_FT_CC",1],[613566757,"5_GW3_FT_NoCC",1],[613566756,"6_GW3_Regi",1]]],["MKT_abandonment_1118",[[1431655766,"0_control",1],[1431655765,"1_clarity",1],[1431655765,"2_urgency",1]]],["MKT_Redbird_US",[[128849019,"0_Control",1],[128849019,"1_GW2_FT_CC",1],[128849019,"2_GW2_FT_NoCC",1],[128849019,"3_GW2_Regi",1],[128849019,"4_GW3_FT_CC",1],[128849019,"5_GW3_FT_NoCC",1],[128849019,"6_GW3_Regi",1],[3393024163,"Outside_Redbird",0]]],["MKT_wcm_dfp_propensity_price",[[12025909,"0",1],[12025908,"1",1],[12025909,"2",1],[12025908,"3",1],[12025909,"4",1],[12025908,"5",1],[12025909,"6",1],[12025908,"7",1],[12025908,"8",1],[12025909,"9",1],[12025908,"10",1],[12025909,"11",1],[12025908,"12",1],[12025909,"13",1],[12025908,"14",1],[12025908,"15",1],[12025909,"16",1],[12025908,"17",1],[12025909,"18",1],[12025908,"19",1],[12025909,"20",1],[12025908,"21",1],[12025908,"22",1],[12025909,"23",1],[12025908,"24",1],[12025909,"25",1],[12025908,"26",1],[12025909,"27",1],[12025908,"28",1],[12025908,"29",1],[12025909,"30",1],[12025908,"31",1],[12025909,"32",1],[12025908,"33",1],[12025909,"34",1],[12025908,"35",1],[12025908,"36",1],[12025909,"37",1],[12025908,"38",1],[12025909,"39",1],[12025908,"40",1],[12025909,"41",1],[12025908,"42",1],[12025908,"43",1],[12025909,"44",1],[12025908,"45",1],[12025909,"46",1],[12025908,"47",1],[12025909,"48",1],[12025908,"49",1],[12025908,"50",1],[12025909,"51",1],[12025908,"52",1],[12025909,"53",1],[12025908,"54",1],[12025909,"55",1],[12025908,"56",1],[12025908,"57",1],[12025909,"58",1],[12025908,"59",1],[12025909,"60",1],[12025908,"61",1],[12025909,"62",1],[12025908,"63",1],[12025908,"64",1],[12025909,"65",1],[12025908,"66",1],[12025909,"67",1],[12025908,"68",1],[12025909,"69",1],[12025908,"70",1],[12025908,"71",1],[12025909,"72",1],[12025908,"73",1],[12025909,"74",1],[12025908,"75",1],[12025909,"76",1],[12025908,"77",1],[12025908,"78",1],[12025909,"79",1],[12025908,"80",1],[12025909,"81",1],[12025908,"82",1],[12025909,"83",1],[12025908,"84",1],[12025908,"85",1],[12025909,"86",1],[12025908,"87",1],[12025909,"88",1],[12025908,"89",1],[12025909,"90",1],[12025908,"91",1],[12025908,"92",1],[12025909,"93",1],[12025908,"94",1],[12025909,"95",1],[12025908,"96",1],[12025909,"97",1],[12025908,"98",1],[12025908,"99",1],[12025909,"100",1],[12025908,"101",1],[12025909,"102",1],[12025908,"103",1],[12025909,"104",1],[12025908,"105",1],[12025908,"106",1],[12025909,"107",1],[12025908,"108",1],[12025909,"109",1],[12025908,"110",1],[12025909,"111",1],[12025908,"112",1],[12025908,"113",1],[12025909,"114",1],[12025908,"115",1],[12025909,"116",1],[12025908,"117",1],[12025909,"118",1],[12025908,"119",1],[12025908,"120",1],[12025909,"121",1],[12025908,"122",1],[12025909,"123",1],[12025908,"124",1],[12025909,"125",1],[12025908,"126",1],[12025908,"127",1],[12025909,"128",1],[12025908,"129",1],[12025909,"130",1],[12025908,"131",1],[12025909,"132",1],[12025908,"133",1],[12025908,"134",1],[12025909,"135",1],[12025908,"136",1],[12025909,"137",1],[12025908,"138",1],[12025909,"139",1],[12025908,"140",1],[12025908,"141",1],[12025909,"142",1],[12025908,"143",1],[3006477,"0",1],[3006477,"1",1],[3006478,"2",1],[3006477,"3",1],[3006477,"4",1],[3006477,"5",1],[3006477,"6",1],[3006477,"7",1],[3006477,"8",1],[3006477,"9",1],[3006477,"10",1],[3006478,"11",1],[3006477,"12",1],[3006477,"13",1],[3006477,"14",1],[3006477,"15",1],[3006477,"16",1],[3006477,"17",1],[3006477,"18",1],[3006477,"19",1],[3006477,"20",1],[3006478,"21",1],[3006477,"22",1],[3006477,"23",1],[3006477,"24",1],[3006477,"25",1],[3006477,"26",1],[3006477,"27",1],[3006477,"28",1],[3006477,"29",1],[3006478,"30",1],[3006477,"31",1],[3006477,"32",1],[3006477,"33",1],[3006477,"34",1],[3006477,"35",1],[3006477,"36",1],[3006477,"37",1],[3006477,"38",1],[3006478,"39",1],[3006477,"40",1],[3006477,"41",1],[3006477,"42",1],[3006477,"43",1],[3006477,"44",1],[3006477,"45",1],[3006477,"46",1],[3006477,"47",1],[3006478,"48",1],[3006477,"49",1],[3006477,"50",1],[3006477,"51",1],[3006477,"52",1],[3006477,"53",1],[3006477,"54",1],[3006477,"55",1],[3006477,"56",1],[3006477,"57",1],[3006478,"58",1],[3006477,"59",1],[3006477,"60",1],[3006477,"61",1],[3006477,"62",1],[3006477,"63",1],[3006477,"64",1],[3006477,"65",1],[3006477,"66",1],[3006478,"67",1],[3006477,"68",1],[3006477,"69",1],[3006477,"70",1],[3006477,"71",1],[3006477,"72",1],[3006477,"73",1],[3006477,"74",1],[3006477,"75",1],[3006478,"76",1],[3006477,"77",1],[3006477,"78",1],[3006477,"79",1],[3006477,"80",1],[3006477,"81",1],[3006477,"82",1],[3006477,"83",1],[3006477,"84",1],[3006477,"85",1],[3006478,"86",1],[3006477,"87",1],[3006477,"88",1],[3006477,"89",1],[3006477,"90",1],[3006477,"91",1],[3006477,"92",1],[3006477,"93",1],[3006477,"94",1],[3006478,"95",1],[3006477,"96",1],[3006477,"97",1],[3006477,"98",1],[3006477,"99",1],[3006477,"100",1],[3006477,"101",1],[3006477,"102",1],[3006477,"103",1],[3006478,"104",1],[3006477,"105",1],[3006477,"106",1],[3006477,"107",1],[3006477,"108",1],[3006477,"109",1],[3006477,"110",1],[3006477,"111",1],[3006477,"112",1],[3006477,"113",1],[3006478,"114",1],[3006477,"115",1],[3006477,"116",1],[3006477,"117",1],[3006477,"118",1],[3006477,"119",1],[3006477,"120",1],[3006477,"121",1],[3006477,"122",1],[3006478,"123",1],[3006477,"124",1],[3006477,"125",1],[3006477,"126",1],[3006477,"127",1],[3006477,"128",1],[3006477,"129",1],[3006477,"130",1],[3006477,"131",1],[3006478,"132",1],[3006477,"133",1],[3006477,"134",1],[3006477,"135",1],[3006477,"136",1],[3006477,"137",1],[3006477,"138",1],[3006477,"139",1],[3006477,"140",1],[3006477,"141",1],[3006478,"142",1],[3006477,"143",1],[42949673,"144",1],[2104533975,"outside_propensity",0]]],["ON_app_dl_mobile_0119",[[1431655766,"0_control",1],[1431655765,"1_appdl",1],[1431655765,"2_pill",1]]],["ON_app_dl_desktop_0119",[[4294967296,null,0]]],["ON_simplified_1218",[[4294967296,null,0]]],["DFP_house_conversion",[[2147483648,"0_control",1],[2147483648,"1_psa",1]]],["MKT_gwlp_cta_0118",[[715541552,"0_ctahidden",1],[715541552,"1_ctaexposed",1],[715541551,"3_ctaexposed_offer",1],[2148342641,null,0]]],["FREEX_FT_Reassure",[[858993460,"0_control",1],[858993459,"1_no_cc_copy",1],[858993459,"2_unlimited_access",1],[858993459,"3_free_weeks",1],[858993459,"4_continue_reading",1]]],["FREEX_Gateway_Stories",[[1431655766,"0_Control",1],[1431655765,"1_More_Section",1],[1431655765,"3_Extra",1]]],["RET_ingrace_truncator_0219",[[1431655766,"0_Grace_Control",1],[1431655765,"1_Grace_DismissableTruncator",1],[1431655765,"2_Grace_NonDismissableTruncator",1]]],["MKT_dfp_ocean_messaging",[[1431655766,"0_control",0],[1431655765,"1_relevance",0],[1431655765,"2_breadth",0]]],["HL_sample",[[2147483648,"0",1],[2147483648,"1",1]]]],"//et.nytimes.com");
+ ]]>
+ </script>
+ <link data-rh="true" rel="alternate" itemprop="mainEntityOfPage" hreflang="en-US" href="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <link data-rh="true" rel="canonical" href="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.html" />
+ <link data-rh="true" rel="alternate" href="android-app://com.nytimes.android/nytimes/reader/id/100000006102576" />
+ <link data-rh="true" rel="amphtml" href="https://www.nytimes.com/2018/09/25/business/economy/us-government-debt-interest.amp.html" />
+ <link data-rh="true" rel="alternate" type="application/json+oembed" href="https://www.nytimes.com/svc/oembed/json/?url=https%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html" title="As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military" />
+ <script data-rh="true">
+ <![CDATA[
+ if (typeof testCookie === 'undefined') {
+ var testCookie = function (name) {
+ var match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ if (testCookie('nyt-gdpr') !== '1') {
+ var gptScript = document.createElement('script');
+ gptScript.async = 'async';
+ gptScript.src = '//www.googletagservices.com/tag/js/gpt.js';
+ document.head.appendChild(gptScript);
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('dfp_story_toggle') !== '1_block') {
+
+ var googletag = googletag || {};
+ googletag.cmd = googletag.cmd || [];
+
+ if (testCookie('nyt-gdpr') == '1') {
+ googletag.cmd.push(function() {
+ googletag.pubads().setRequestNonPersonalizedAds(1);
+ });
+ }
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ (function() {
+ var getScripts = function() {
+ if (window.NYTD.Abra('medianet_toggle') !== '1_block') {
+ var readCookie = function(name) {
+ match = document.cookie.match(new RegExp(name + '=([^;]+)'));
+ if (match) return match[1];
+ }
+ // Allows media.net if user is not from EEA
+ if (readCookie('nyt-gdpr') !== '1') {
+ // Allows media.net only if prebid testing is not on
+ if (!readCookie('ab7') || readCookie('ab7') !== 'vi-prebid-header=1') {
+ var mediaScript = document.createElement("script");
+ var cid = '8CU2553YN';
+ var domain = 'www.nytimes.com';
+ if (window.innerWidth < 600) {
+ cid = '8CULO58R6';
+ }
+ mediaScript.async = true;
+ mediaScript.src="https://contextual.media.net/bidexchange.js?cid="+cid+"&dn="+domain+"&https=1";
+ document.head.appendChild(mediaScript);
+ }
+ }
+
+ }
+ if (window.NYTD.Abra('medianet_toggle') !== '1_block') {
+ var mediaNetCID = '8CU2553YN';
+ if (window.innerWidth < 600) {
+ mediaNetCID = '8CULO58R6';
+ }
+ window.advBidxc = window.advBidxc || {};window.advBidxc.renderAd = function() {};
+ window.advBidxc.startTime = new Date().getTime(); window.advBidxc.customerId = {mediaNetCID: mediaNetCID};
+ window.advBidxc.misc = {"isGptDisabled": 1};
+
+ }
+ if (window.NYTD.Abra('amazon_toggle') !== '1_block') {
+
+ !function(a9,a,p,s,t,A,g){if(a[a9])return;
+ function q(c,r){a[a9]._Q.push([c,r])}a[a9]={
+ init:function(){q("i",arguments)},
+ fetchBids:function(){q("f",arguments)},
+ setDisplayBids:function(){},
+ targetingKeys:function(){return[]},_Q:[]};
+ A=p.createElement(s);
+ A.async=!0;
+ A.src=t;
+ g=p.getElementsByTagName(s)[0];
+ g.parentNode.insertBefore(A,g)}
+ ("apstag",window,document,"script","//c.amazon-adsystem.com/aax2/apstag.js");
+ apstag.init({
+ pubID: '3030',
+ adServer: 'googletag',
+ params: {
+ si_section: 'business'
+ }
+ });
+
+ }
+ if (window.NYTD.Abra('index_toggle') !== '1_block') {
+
+ var indexScript = document.createElement("script");
+ indexScript.async = 'async';
+ indexScript.src="https://js-sec.indexww.com/ht/p/183760-179626133031071.js";
+ document.head.appendChild(indexScript);
+
+ };
+ };
+ if (window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('DFP_prioritize_defer').indexOf('hb') !== -1 && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird') {
+ var scriptAdded = false;
+ window.googletag = window.googletag || {};
+ window.googletag.cmd = window.googletag.cmd || [];
+ window.googletag.cmd.push(function() {
+ window.googletag.pubads().addEventListener('slotOnload', function(e) {
+ if (e.slot && typeof e.slot.getSlotElementId === 'function' && e.slot.getSlotElementId() === 'top' && !scriptAdded) {
+ getScripts();
+ scriptAdded = true;
+ }
+ });
+ });
+ setTimeout(function() {
+ if (!scriptAdded) {
+ getScripts();
+ scriptAdded = true;
+ }
+ }, 10000);
+ } else {
+ getScripts();
+ }
+ }());
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if (window.NYTD.Abra('vi-ads-et') || (window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird')) {
+ window.addEventListener('beforeunload', function(e) {
+ function measureExit() {
+ try {
+ var time;
+ if (performance) {
+ performance.mark('exit-event');
+ performance.measure('visit-time', 'responseStart', 'exit-event');
+ time = performance.getEntriesByName('visit-time')[0].duration;
+ }
+ return time;
+ } catch (err) {
+ // move on
+ }
+ };
+
+ var etUrl = 'https://et.nytimes.com/';
+ var data = 'url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-exit-pixel%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%2C%22mData%22%3A%22' + measureExit() + '%22%7D' +
+ '&page_view_id=' + window.NYTD.PageViewId.current +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ if ('sendBeacon' in navigator) {
+ navigator.sendBeacon(etUrl, data);
+ }
+ });
+ }
+ ]]>
+ </script>
+ <script data-rh="true">
+ <![CDATA[
+ if ((window.NYTD.Abra('DFP_prioritize_defer') !== null && window.NYTD.Abra('MKT_Redbird_US') === 'Outside_Redbird') && !(testCookie('nyt-gdpr') === '1' && testCookie('NYT-T') === 'out')) {
+
+ var noop=function(){return{}},noopArr=function(){return[]},performance=window.performance||{};performance.mark=performance.mark||noop,performance.measure=performance.measure||noop,performance.getEntriesByName=performance.getEntriesByName||noopArr,performance.getEntriesByType=performance.getEntriesByType||noopArr;var ADF={isRefresh:!1,isDisplayed:!1,isManualRefresh:window.performance&&window.performance.navigation&&1===window.performance.navigation.type,observer:null,trackEvent:function(e){var t={module:"top",action:"ad-impression"};window.Object.keys(e).forEach(function(r){t[r]=e[r]});var r=document.createElement("img"),n="https://et.nytimes.com/pixel?url="+encodeURIComponent(window.location.href)+"&referrer="+document.referrer+"&subject=module-interactions&page_view_id="+window.NYTD.PageViewId.current+"&moduleData="+encodeURIComponent(window.JSON.stringify(t))+"&sourceApp=nyt-vi&instant=1&_="+Date.now();r.src=n,r.style.cssText="position: absolute; z-index: -999999; left: -1000px; top: -1000px;",document.body&&document.body.appendChild(r)},trackTimeCalled:function(e,t){performance.timing&&performance.timing.responseStart&&t.setTargeting("request_time",(Date.now()-performance.timing.responseStart).toString());var r="top-timeCalled";performance.mark(r),performance.measure(e,"responseStart",r);var n=performance.getEntriesByName(e).pop();n&&this.trackEvent({eventName:"timeCalled",moduleDetail:Math.round(n.duration)})},getDeviceType:function(){var e="tablet",t="desktop",r="smartphone";return window.matchMedia("(min-width: 740px)").matches&&(r=e),window.matchMedia("(min-width: 1150px)").matches&&(r=t),r},getAbraDfpVariants:function(){var e=window.document.documentElement.getAttribute("data-nyt-ab");return e?e.split(" ").reduce(function(e,t){var r=t.split("="),n=r[0].toLowerCase(),o=r[1];return(n.indexOf("dfp")>-1||n.indexOf("redbird")>-1)&&e.push(n+"_"+o),e},[]):""},getSub:function(e,t){var r=e&&e.demographics,n=r&&r.emailSubscriptions,o=r&&r.bundleSubscriptions;if(r&&o&&t&&(t.sub="reg",n&&n.length&&(t.em=n.toString().toLowerCase()),r.wat&&(t.wat=r.wat.toLowerCase()),o&&o.length&&o[0].bundle)){var i=o[0];t.sub=i.bundle.toLowerCase(),i.source&&(t.subsrc=i.source.toLowerCase()),i.promotion&&(t.subprm=i.promotion),i.in_grace&&(t.grace=i.in_grace.toString())}return t},getUserInfo:function(){var e=window.userInfoXhrObject&&""!==window.userInfoXhrObject.responseText&&window.JSON.parse(window.userInfoXhrObject.responseText).data||null,t=null;return e&&e.user&&(t=e.user.userInfo?{demographics:e.user.userInfo.demographics}:{}),t},getViewport:function(e){var t={smartphone:"small",tablet:"medium",desktop:"large"};return e?t[e]:t.desktop},getTargeting:function(e,t){var r=this.getUserInfo();r?e=this.getSub(r,e):e.sub="anon",1===testCookie("nyt-gdpr")&&(e.gdprUser=!0);var n=testCookie("NYT-T");return n&&"out"===n.toLowerCase()&&(e.noTracking=!0),"/"===location.pathname&&(e.topref=document.referrer,this.isManualRefresh&&(e.refresh="manual")),e.aid=testCookie("nyt-a")||"",e.abra_dfp=this.getAbraDfpVariants(),e.page_view_id=window.NYTD.PageViewId.current,e.vp=this.getViewport(t),e},defineAd:function(e,t){var r=window.googletag.defineSlot(t,[],e);if(r){var n="top-timeDefined";performance.mark(n),performance.measure(e,"responseStart",n);var o=performance.getEntriesByName(e).pop();o&&this.trackEvent({eventName:"timeDefined",moduleDetail:Math.round(o.duration)})}return r},observeAd:function(e,t){var r=document.getElementById(e);if(this.observer)this.observer.unobserve(r),this.observer.observe(r);else{window.IntersectionObserver.prototype.POLL_INTERVAL=1e3;var n=new IntersectionObserver(function(n,o){n[0].isIntersecting&&(this.trackTimeCalled(e,t),this.isRefresh&&this.isDisplayed?window.googletag.pubads().refresh([t]):(window.googletag.display(t),this.isDisplayed=!0),o.unobserve(r))}.bind(this),{root:null,rootMargin:"400px",threshold:0});n.observe(r),this.observer=n}},callAd:function(e,t){void 0!==window.IntersectionObserver&&this.isManualRefresh?this.observeAd(e,t):(this.trackTimeCalled(e,t),window.googletag.display(e),this.isDisplayed=!0)},createTopAd:function(e,t){var r="top",n=this.getDeviceType();if("smartphone"!==n){var o=this.defineAd(r,t);if(o){var i=window.googletag.sizeMapping().addSize([970,0],["fluid",[728,90],[970,90],[970,250],[1605,300]]).addSize([728,0],["fluid",[728,90],[300,250],[1605,300]]).addSize([0,0],["fluid",[300,250],[300,420]]).build();o.defineSizeMapping(i);var a=this.getTargeting(e,n);window.Object.keys(a).forEach(function(e){o.setTargeting(e,a[e])}),o.addService(window.googletag.pubads()),window.googletag.enableServices(),this.callAd(r,o),window.googletag.pubads().addEventListener("slotRenderEnded",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeRendered";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeRendered",moduleDetail:Math.round(n.duration)}),e.isEmpty&&(document.getElementById(r).parentNode.style.display="none")}}.bind(this)),window.googletag.pubads().addEventListener("slotOnload",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeLoaded";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeLoaded",moduleDetail:Math.round(n.duration)})}}.bind(this)),window.googletag.pubads().addEventListener("impressionViewable",function(e){if(e.slot.getSlotElementId()===r){var t="top-timeViewed";performance.mark(t),performance.measure(r,"top-timeCalled",t);var n=performance.getEntriesByName(r).pop();n&&this.trackEvent({eventName:"timeViewed",moduleDetail:Math.round(n.duration)})}}.bind(this)),document.addEventListener("topAdRefresh",function(e){o.setTargeting("page_view_id",window.NYTD.PageViewId.current),o.setTargeting("refresh",e.detail),this.isRefresh=!0,void 0!==window.IntersectionObserver?this.observeAd(r,o):(this.trackTimeCalled(r,o),window.googletag.pubads().refresh([o]))}.bind(this))}}}};
+ window.googletag = window.googletag || {};
+ window.googletag.cmd = window.googletag.cmd || [];
+ window.googletag.cmd.push(ADF.createTopAd.bind(ADF, {"div":"top","gpt-beta":"vqwdtftx","pos":"top","sov":null,"test":"projectvi","ver":"vi","hasVideo":false,"template":"article","si_section":"business","plat":"web","auth":"nelsondschwartz","typ":"art,oak","edn":"us","des":"nationaldebtus,federalbudgetus,unitedstatespoliticsandgovernm,interestrates,unitedstatesdefenseandmilitary,unitedstateseconomy,federaltaxesus,usdollarcurrency,recessionanddepression","per":"trumpdonaldj","org":"congressionalbudgetoffice,federalreservesystem","coll":"politics,economy,business,amp","id":"100000006102576","als_test":"1551234976794","brandsensitive":"false","ledemedsz":"none","prop":"nyt","section":"business","artlen":"long","emotions":"fear,optimistic,interest,informed,hate,not_selfconfident,not_happiness,not_adventurous,not_inthemoodtospend,not_boredom,not_indulgent,not_nostalgic,not_love,not_amused,not_inspired","gscat":"neg_mastercard,gs_politics,gs_economy,gs_economy_misc,gs_finance,gs_politics_misc,gs_politics_american,gs_finance_loans,neg_hearts,gs_finance_tax,gv_safe"}, '/29390238/nyt/business/economy'));
+
+ }
+ ]]>
+ </script>
+ <link rel="stylesheet" href="/vi-assets/static-assets/global-42db6c8821fec0e2b3837b2ea2ece8fe.css" />
+ <style>
+ <![CDATA[
+ .css-1dv1kvn{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-nuvmzp{font-size:14.25px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;text-transform:uppercase;-webkit-letter-spacing:0.7px;-moz-letter-spacing:0.7px;-ms-letter-spacing:0.7px;letter-spacing:0.7px;line-height:19px;}.css-nuvmzp:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1gz70xg{border-left:1px solid #ccc;color:#326891;height:12px;margin-left:8px;padding-left:8px;}.css-9e9ivx{display:none;font-size:10px;margin-left:auto;text-transform:uppercase;}.hasLinks .css-9e9ivx{display:block;}@media (min-width:740px){.hasLinks .css-9e9ivx{margin:none;position:absolute;right:20px;}}@media (min-width:1024px){.hasLinks .css-9e9ivx{display:none;}}.css-2bwtzy{display:inline-block;padding:6px 4px 4px;margin-bottom:12px;font-size:12px;border-radius:3px;-webkit-transition:background 0.6s ease;transition:background 0.6s ease;}.css-2bwtzy:hover{background-color:#f7f7f7;}.css-6n7j50{display:inline;}.css-1kj7lfb{display:none;}@media (min-width:1024px){.css-1kj7lfb{display:inline-block;margin-right:7px;}}.css-10m9xeu{display:block;width:16px;height:16px;}.css-vz7hjd{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.css-1fe7a5q{display:inline-block;height:16px;vertical-align:sub;width:16px;}.css-1rn5q1r{border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;background:#fff;display:inline-block;left:44px;text-transform:uppercase;-webkit-transition:none;transition:none;}.css-1rn5q1r:active,.css-1rn5q1r:focus{-webkit-clip:auto;clip:auto;overflow:visible;width:auto;height:auto;}.css-1rn5q1r::-moz-focus-inner{padding:0;border:0;}.css-1rn5q1r:-moz-focusring{outline:1px dotted;}.css-1rn5q1r:disabled,.css-1rn5q1r.disabled{opacity:0.5;cursor:default;}.css-1rn5q1r:active,.css-1rn5q1r.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1rn5q1r:hover{background-color:#f7f7f7;}}.css-1rn5q1r:focus{margin-top:3px;padding:8px 8px 6px;}@media (min-width:1024px){.css-1rn5q1r{left:112px;}}.css-10488qs{display:none;}@media (min-width:1024px){.css-10488qs{display:inline-block;position:relative;}}.css-1iruc8t{list-style:none;margin:0;padding:0;}.css-1ropbjl::before{background-color:$white;border-bottom:1px solid #e2e2e2;border-top:2px solid #e2e2e2;content:'';display:block;height:1px;margin-top:0;}@media (min-width:1150px){.css-1ropbjl{margin:0 auto;max-width:1200px;padding:0 3% 9px;}}.NYTApp .css-1ropbjl{display:none;}@media print{.css-1ropbjl{display:none;}}.css-uw59u{padding:0 20px;}@media (min-width:740px){.css-uw59u{padding:0 3%;}}@media (min-width:1150px){.css-uw59u{padding:0;}}.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-oylsik{display:block;height:44px;vertical-align:middle;width:184px;}.css-1otr2jl{margin:18px 0 0 auto;}.css-1c8n994{color:#6288a5;font-family:nyt-franklin;font-size:11px;font-style:normal;font-weight:400;line-height:11px;-webkit-text-decoration:none;text-decoration:none;}.css-qtw155{display:block;}@media (min-width:1150px){.css-qtw155{display:none;}}.css-v0l3hm{display:none;}@media (min-width:1150px){.css-v0l3hm{display:block;}}.css-g4gku8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;min-width:600px;}.css-1rr4qq7{-webkit-flex:1;-ms-flex:1;flex:1;}.css-6xhk3s{border-left:1px solid #e2e2e2;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:15px;}.css-rxqrcl{color:#333;font-size:13px;font-weight:700;font-family:nyt-franklin;height:25px;line-height:15px;margin:0;text-transform:uppercase;width:150px;}.css-tj0ten{margin-bottom:5px;white-space:nowrap;}.css-tj0ten:last-child{margin-bottom:10px;}.css-ist4u3.desktop{display:none;}@media (min-width:740px){.css-ist4u3.desktop{display:block;}.css-ist4u3.smartphone{display:none;}}.css-1gprdgz{list-style:none;margin:0;padding:0;-webkit-columns:2;columns:2;padding:0 0 15px;}.css-10t7hia{height:34px;line-height:34px;list-style-type:none;}.css-10t7hia.desktop{display:none;}@media (min-width:740px){.css-10t7hia.desktop{display:block;}.css-10t7hia.smartphone{display:none;}}.css-mzqdl{color:#333;display:block;font-family:nyt-franklin;font-size:15px;font-weight:500;height:34px;line-height:34px;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;}.css-kwpx34{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:14px;font-weight:500;height:23px;line-height:16px;}.css-kwpx34:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-kwpx34{color:#fff;}.css-1k2cjfc{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:16px;font-weight:700;height:25px;line-height:15px;padding-bottom:0;}.css-1k2cjfc:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1k2cjfc{color:#fff;}.css-1vhk1ks{color:#000;display:inline-block;font-family:nyt-franklin;-webkit-text-decoration:none;text-decoration:none;text-transform:capitalize;width:150px;font-size:11px;font-weight:500;height:23px;line-height:21px;}.css-1vhk1ks:hover{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}body.dark .css-1vhk1ks{color:#fff;}.css-6td9kr{list-style:none;margin:0;padding:0;border-top:1px solid #e2e2e2;margin-top:2px;padding-top:10px;}.css-r5ic95{display:inline-block;height:13px;width:13px;margin-right:7px;vertical-align:middle;}.css-15uy5yv{border-top:1px solid #ebebeb;padding-top:9px;}.css-1p8nkc0{color:#999;font-family:nyt-franklin,helvetica,arial,sans-serif;padding:10px 0;-webkit-text-decoration:none;text-decoration:none;white-space:nowrap;}.css-1p8nkc0:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-1hyfx7x{display:none;}@-webkit-keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@keyframes animation-f8wsfj{0%{opacity:1;}50%{opacity:0;}100%{opacity:0;}}@-webkit-keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}@keyframes animation-mhvv8m{0%{opacity:0;}50%{opacity:0;}100%{opacity:1;}}.css-qremme{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:32px;background:#333;box-shadow:0 2.5px 5px rgba(0,0,0,0.25);border-radius:101px;z-index:1000000101;}@media (min-width:768px){.css-qremme{height:35px;}}.css-1f85ym4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;padding:0 13px 0 17px;background-color:transparent;color:#fff;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:0.875rem;line-height:0.875rem;}@media (min-width:768px){.css-1f85ym4{font-size:0.9375rem;line-height:0.9375rem;}}.css-7inim5{border:0.5px solid #ccc;height:60%;}.css-133m5b6{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;padding:0 16px 0 13px;background-color:transparent;}.css-133m5b6 svg{fill:none;}.css-133m5b6 svg path{stroke-width:2px;-webkit-transform:translate(10.57px,-1.46px);-ms-transform:translate(10.57px,-1.46px);transform:translate(10.57px,-1.46px);}.css-1lc20wh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:fixed;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100vw;bottom:2.5vh;-webkit-transform:translateY(75px);-ms-transform:translateY(75px);transform:translateY(75px);}.css-1lc20wh.shown{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-webkit-transition:200ms -webkit-transform ease-in-out;-webkit-transition:200ms transform ease-in-out;transition:200ms transform ease-in-out;}@media print{.css-1lc20wh{display:none;}}@-webkit-keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}@keyframes animation-1m9j9gf{from{background-color:#f7f7f5;}to{background-color:transparent;}}.css-1g7m0tk{color:#326891;}.css-1g7m0tk:visited{color:#326891;}.sizeSmall .css-bsn42l{width:50%;}@media (min-width:600px){.sizeSmall .css-bsn42l{width:300px;}}@media (min-width:1440px){.sizeSmall .css-bsn42l{width:300px;}}@media (max-width:600px){.sizeSmall .css-bsn42l{width:50%;}}.sizeSmall.sizeSmallNoCaption .css-bsn42l{margin-left:auto;margin-right:auto;}@media (min-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:1024px){.sizeSmall.layoutVertical .css-bsn42l{width:250px;}}@media (max-width:740px){.sizeSmall.layoutVertical .css-bsn42l{max-width:250px;}}@media (min-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:1024px){.sizeSmall.layoutHorizontal .css-bsn42l{width:300px;}}@media (max-width:740px){.sizeSmall.layoutHorizontal .css-bsn42l{max-width:300px;}}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-bsn42l{width:310px;}}.css-11cwn6f{width:100%;vertical-align:top;}.css-11cwn6f img{width:100%;vertical-align:top;}.css-d8bdto{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;}@media print{.css-d8bdto{display:none;}}.css-y8aj3r{padding:0;}.css-60hakz{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-60hakz a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-60hakz:nth-of-type(3),.css-60hakz:nth-of-type(4){display:none;}}.css-60hakz:last-of-type{margin-right:0;}.css-i29ckm{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 2rem;}@media (min-width:1440px){.css-i29ckm{width:600px;max-width:600px;}}@media (min-width:600px){.css-i29ckm{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (max-width:600px){.css-i29ckm .facebook,.css-i29ckm .twitter,.css-i29ckm .email{display:inline-block;}}.css-1ri25x2{display:none;}@media (min-width:740px){.css-1ri25x2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:16px;height:31px;}}@media (min-width:1024px){.css-1ri25x2{display:none;}}.css-12fr9lp{height:23px;margin-top:6px;}.css-1hfdzay{display:none;}@media (min-width:1024px){.css-1hfdzay{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:0;}}.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-eqw76k{display:none;}@media (min-width:740px){.css-eqw76k{position:fixed;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;opacity:0;z-index:1;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;width:100%;height:32.063px;background:white;padding:5px 0 5px 0;top:0;text-align:center;font-family:'nyt-cheltenham';box-shadow:rgba(0,0,0,0.08) 0 0 5px 1px;border-bottom:1px solid #e2e2e2;}}.css-m6xlts{margin-left:20px;margin-right:20px;max-width:1605px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;width:100%;}@media (min-width:1360px){.css-m6xlts{margin-left:20px;margin-right:20px;}}@media (min-width:1780px){.css-m6xlts{margin-left:auto;margin-right:auto;}}.css-1ahhg7f{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;max-width:1605px;overflow:hidden;position:absolute;width:56%;margin-left:calc((100% - 56%) / 2);}@media (min-width:1024px){.css-1ahhg7f{width:56%;margin-left:calc((100% - 56%) / 2);}}@media (min-width:1024px){.css-1ahhg7f{width:53%;margin-left:calc((100% - 53%) / 2);}}.css-rs6kf8{font-family:nyt-cheltenham-small,georgia,'times new roman';font-weight:700;font-size:13px;-webkit-letter-spacing:0.015em;-moz-letter-spacing:0.015em;-ms-letter-spacing:0.015em;letter-spacing:0.015em;font-weight:400;margin-top:10.5px;margin-right:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-17xtcya{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;font-size:12.5px;text-transform:uppercase;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;margin-top:12.5px;margin-bottom:auto;margin-left:auto;white-space:nowrap;}.css-17xtcya:hover{-webkit-text-decoration:underline;text-decoration:underline;}.css-x15j1o{display:inline-block;padding-left:7px;padding-right:7px;font-size:13px;margin-top:10px;margin-bottom:auto;color:#ccc;}.css-19gb6gw{margin-top:auto;margin-bottom:auto;margin-left:auto;background-color:white;z-index:50;box-shadow:-14px 2px 7px -2px rgba(255,255,255,0.7);}@media (min-width:740px){.css-1iwv8en{margin-top:1px;}}@media (min-width:1024px){.css-1iwv8en{margin-top:0;}}.css-1sy8kpn{display:none;}@media (min-width:765px){.css-1sy8kpn{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;display:block;padding-bottom:15px;padding-top:15px;margin:0;min-height:90px;}}@media print{.css-1sy8kpn{display:none;}}.css-19vbshk{color:#ccc;display:none;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-left:auto;text-align:center;text-transform:uppercase;}@media (min-width:600px){.css-19vbshk{display:inline-block;}}.css-19vbshk p{margin-bottom:auto;margin-right:7px;margin-top:auto;text-transform:none;}.css-l9onyx{color:#ccc;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.5625rem;font-weight:300;-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;line-height:0.5625rem;margin-bottom:9px;text-align:center;text-transform:uppercase;}@-webkit-keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-b7n1on{0%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}.css-1rj8to8{display:inline-block;line-height:1em;}.css-1rj8to8 .css-0{-webkit-text-decoration:none;text-decoration:none;display:inline-block;}.css-4w91ra{display:inline-block;padding-left:3px;}.css-1rjzas3{font-family:nyt-imperial,georgia,'times new roman',times,serif;font-style:italic;font-size:1.0625rem;line-height:1.5rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 0.75rem;margin-top:1rem;}@media (min-width:740px){.css-1rjzas3{font-size:1.1875rem;line-height:1.75rem;margin-bottom:1.25rem;}}@media (min-width:1440px){.css-1rjzas3{width:600px;max-width:600px;}}@media print{.css-1rjzas3{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-acwcvw{margin-bottom:1rem;}@-webkit-keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}@keyframes animation-1egl8em{from{opacity:0;-webkit-transform:translate3d(0,13%,0);-ms-transform:translate3d(0,13%,0);transform:translate3d(0,13%,0);}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.css-vdv0al{font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:0.75rem;line-height:1rem;width:calc(100% - 40px);max-width:600px;margin:0 auto 1em;color:#999;}.css-vdv0al a{color:#999;-webkit-text-decoration:none;text-decoration:none;}.css-vdv0al a:hover{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:1440px){.css-vdv0al{width:600px;max-width:600px;}}@media print{.css-vdv0al{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-vdv0al span{display:none;}}.css-1i2y565 .e6idgb70 + .e1h9rw200{margin-top:0;}.css-1i2y565 .eoo0vm40 + .e1gnsphs0{margin-top:-0.3em;}.css-1i2y565 .e6idgb70 + .eoo0vm40{margin-top:0;}.css-1i2y565 .eoo0vm40 + figure{margin-top:1.2rem;}.css-1i2y565 .e1gnsphs0 + figure{margin-top:1.2rem;}.css-o6xoe7{display:none;}@media (min-width:1024px){.css-o6xoe7{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:0;margin-left:auto;width:130px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}@media (min-width:1150px){.css-o6xoe7{width:210px;}}@media print{.css-o6xoe7{display:none;}}.css-1fanzo5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:1rem;}@media (min-width:1024px){.css-1fanzo5{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;height:100%;width:945px;margin-left:auto;margin-right:auto;}}@media (min-width:1150px){.css-1fanzo5{width:1110px;margin-left:auto;margin-right:auto;}}@media (min-width:1280px){.css-1fanzo5{width:1170px;}}@media (min-width:1440px){.css-1fanzo5{width:1200px;}}@media print{.css-1fanzo5{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1fanzo5{margin-bottom:1em;display:block;}}.css-53u6y8{margin-left:auto;margin-right:auto;width:100%;}@media (min-width:1024px){.css-53u6y8{margin-left:calc((100% - 600px) / 2);margin-right:0;width:600px;}}@media (min-width:1440px){.css-53u6y8{max-width:600px;width:600px;margin-left:calc((100% - 600px) / 2);}}@media print{.css-53u6y8{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-z3e15g{position:fixed;opacity:0;-webkit-scroll-events:none;-moz-scroll-events:none;-ms-scroll-events:none;scroll-events:none;top:0;left:0;bottom:0;right:0;-webkit-transition:opacity 0.2s;transition:opacity 0.2s;background-color:#fff;pointer-events:none;}.css-cl76n0{margin:0 0 1rem;}.css-1vs7yia{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.9375rem;line-height:1.25rem;}.css-irejme{margin:10px auto 20px;max-width:100%;line-height:0;}.css-1ct2c9h{margin:0;display:inline;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.75rem;line-height:1rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;}@media (min-width:1150px){.css-1ct2c9h{font-size:0.8125rem;line-height:1.0625rem;}}.css-1ct2c9h:not(:last-child):after{content:'•';color:#e2e2e2;margin:0 10px 0 10px;font-size:10px;white-space:no-wrap;}.css-13nfagi{margin:2.3125rem auto;width:calc(100% - 20px);max-width:600px;}@media (min-width:340px) and (max-width:630px){.css-13nfagi{width:calc(100% - 40px);}}@media (min-width:1440px){.css-13nfagi{max-width:630px;}}@-webkit-keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@keyframes animation-1b9egsl{0%{-webkit-transform:rotate(20deg);-ms-transform:rotate(20deg);transform:rotate(20deg);}100%{-webkit-transform:rotate(380deg);-ms-transform:rotate(380deg);transform:rotate(380deg);}}@-webkit-keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@keyframes animation-1c5cfvc{0%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}50%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}75%{-webkit-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);transform:translate(0px,0px) scale(1,0.95) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,1) translate(0px,0px);transform:translate(0px,0px) scale(1,1) translate(0px,0px);}}@-webkit-keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@keyframes animation-htgkrt{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}25%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}50%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}75%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);transform:translate(0px,0px) translate(0px,0px) translate(0px,5px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);transform:translate(0px,0px) translate(0px,0px) translate(0px,0px);}}@-webkit-keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@keyframes animation-e64et{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}25%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,1) translate(-11.329999923706055px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}75%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.95) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@keyframes animation-9zaqp9{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}25%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,0px);}50%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}75%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,5px);}}@-webkit-keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@keyframes animation-16fq4rz{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}25%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}50%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,1) translate(-22.670000076293945px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.95) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@keyframes animation-1kjk1j2{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}25%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}50%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,0px);}75%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,5px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}}@-webkit-keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@keyframes animation-88g286{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}25%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}50%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}75%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,0px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,5px);}}@-webkit-keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@keyframes animation-12yx39b{0%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}25%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}50%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}75%{-webkit-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,1) translate(-34px,0px);transform:translate(34px,0px) scale(1,1) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.95) translate(-34px,0px);}}@-webkit-keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@keyframes animation-4hu8jm{0%{-webkit-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);transform:translate(0px,0px) scale(1,0.85) translate(0px,0px);}33.33%{-webkit-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);transform:translate(0px,0px) scale(1,0.9) translate(0px,0px);}100%{-webkit-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);-ms-transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);transform:translate(0px,0px) scale(1,0.1) translate(0px,0px);}}@-webkit-keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@keyframes animation-1wqz2f4{0%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);transform:translate(0px,0px) translate(0px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);transform:translate(0px,0px) translate(0px,0px) translate(0px,10px);}100%{-webkit-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);-ms-transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);transform:translate(0px,0px) translate(0px,0px) translate(0px,30px);}}@-webkit-keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@keyframes animation-yl3z84{0%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.85) translate(-11.329999923706055px,0px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.9) translate(-11.329999923706055px,0px);}100%{-webkit-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);-ms-transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);transform:translate(11.329999923706055px,0px) scale(1,0.1) translate(-11.329999923706055px,0px);}}@-webkit-keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@keyframes animation-1q3gjvc{0%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,10px);}100%{-webkit-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);-ms-transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);transform:translate(11.329999923706055px,0px) translate(-11.329999923706055px,0px) translate(0px,30px);}}@-webkit-keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@keyframes animation-nc39ev{0%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.85) translate(-22.670000076293945px,0px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.9) translate(-22.670000076293945px,0px);}100%{-webkit-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);-ms-transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);transform:translate(22.670000076293945px,0px) scale(1,0.1) translate(-22.670000076293945px,0px);}}@-webkit-keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@keyframes animation-amd09y{0%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,10px);}100%{-webkit-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);-ms-transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);transform:translate(22.670000076293945px,0px) translate(-22.670000076293945px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@keyframes animation-ru1vxe{0%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,15px);}33.33%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,10px);}100%{-webkit-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);-ms-transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);transform:translate(34px,0px) translate(-34px,0px) translate(0px,30px);}}@-webkit-keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}@keyframes animation-ajnadh{0%{-webkit-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.85) translate(-34px,0px);}33.33%{-webkit-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.9) translate(-34px,0px);}100%{-webkit-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);-ms-transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);transform:translate(34px,0px) scale(1,0.1) translate(-34px,0px);}}.css-1baulvz{display:inline-block;}.css-79elbk{position:relative;}.css-v89234{overflow:hidden;height:100%;}@media print{.css-13lpfd6{margin-bottom:15px;}}@media (min-width:1024px){.css-13lpfd6{position:fixed;width:100%;top:0;left:0;z-index:200;background-color:#fff;border-bottom:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}}@media (min-width:1024px){.css-1bymuyk{position:relative;border-bottom:1px solid #e2e2e2;}}.css-1waixk9{background:#fff;border-bottom:1px solid #e2e2e2;height:36px;padding:8px 15px 3px;position:relative;}@media (min-width:740px){.css-1waixk9{background:#fff;padding:10px 15px 6px;}}@media (min-width:1024px){.css-1waixk9{background:transparent;border-bottom:0;padding:4px 15px 2px;}}@media print{.css-1waixk9{background:transparent;}}@media (min-width:740px){}@media (min-width:1024px){.css-1waixk9{margin:0 auto;max-width:1605px;}}.css-1f7ibof{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;left:10px;position:absolute;}@media (min-width:1024px){}@media print{.css-1f7ibof{display:none;}}.css-l2ztic{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;padding:8px 9px;text-transform:uppercase;}.css-l2ztic.hidden{opacity:0;visibility:hidden;}.css-l2ztic.hidden:focus{opacity:1;}.css-l2ztic::-moz-focus-inner{padding:0;border:0;}.css-l2ztic:-moz-focusring{outline:1px dotted;}.css-l2ztic:disabled,.css-l2ztic.disabled{opacity:0.5;cursor:default;}.css-l2ztic:active,.css-l2ztic.active{background-color:#f7f7f7;}@media (min-width:740px){.css-l2ztic:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-l2ztic{display:none;}}.css-19lv58h{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;-webkit-appearance:button;-moz-appearance:button;appearance:button;background-color:#fff;border:1px solid #ebebeb;color:#333;display:inline-block;font-size:11px;font-weight:500;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;line-height:13px;margin:0;padding:8px 9px;text-transform:uppercase;vertical-align:middle;display:none;}.css-19lv58h::-moz-focus-inner{padding:0;border:0;}.css-19lv58h:-moz-focusring{outline:1px dotted;}.css-19lv58h:disabled,.css-19lv58h.disabled{opacity:0.5;cursor:default;}.css-19lv58h:active,.css-19lv58h.active{background-color:#f7f7f7;}@media (min-width:740px){.css-19lv58h:hover{background-color:#f7f7f7;}}@media (min-width:1024px){.css-19lv58h{border:0;display:inline-block;margin-right:8px;}}.css-mgtjo2{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;}.css-mgtjo2::-moz-focus-inner{padding:0;border:0;}.css-mgtjo2:-moz-focusring{outline:1px dotted;}.css-mgtjo2:disabled,.css-mgtjo2.disabled{opacity:0.5;cursor:default;}.css-mgtjo2:active,.css-mgtjo2.active{background-color:#f7f7f7;}@media (min-width:740px){.css-mgtjo2:hover{background-color:#f7f7f7;}}.css-mgtjo2.activeSearchButton{background-color:#f7f7f7;}@media (min-width:1024px){.css-mgtjo2{padding:8px 9px 9px;}}.css-1wr3we4{display:none;}@media (min-width:1024px){.css-1wr3we4{display:block;position:absolute;left:105px;line-height:19px;top:10px;}}.css-10698na{text-align:center;}@media (min-width:740px){.css-10698na{padding-top:0;}}@media (min-width:1024px){}@media print{.css-10698na a[href]::after{content:'';}.css-10698na svg{fill:black;}}.css-nhjhh0{display:block;width:189px;height:26px;margin:5px auto 0;}@media (min-width:740px){.css-nhjhh0{width:225px;height:31px;margin:4px auto 0;}}@media (min-width:1024px){.css-nhjhh0{width:195px;height:26px;margin:6px auto 0;}}.css-o2c64h{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;position:absolute;right:10px;top:9px;}@media (min-width:1024px){.css-o2c64h{top:4px;}}@media print{.css-o2c64h{display:none;}}.css-1bnxwmn{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:#6288a5;border:1px solid #326891;color:#fff;font-size:11px;font-weight:700;-webkit-letter-spacing:0.05em;-moz-letter-spacing:0.05em;-ms-letter-spacing:0.05em;letter-spacing:0.05em;line-height:11px;padding:8px 9px 6px;text-transform:uppercase;}.css-1bnxwmn::-moz-focus-inner{padding:0;border:0;}.css-1bnxwmn:-moz-focusring{outline:1px dotted;}.css-1bnxwmn:disabled,.css-1bnxwmn.disabled{opacity:0.5;cursor:default;}@media (min-width:740px){.css-1bnxwmn:hover{background-color:#326891;}}@media (min-width:1024px){.css-1bnxwmn{padding:11px 12px 8px;}}.css-1bnxwmn:hover{border:1px solid #326891;}.css-1nkps6a{height:100%;display:none;}.css-1i8g3m4{border-radius:3px;cursor:pointer;font-family:nyt-franklin,helvetica,arial,sans-serif;-webkit-transition:ease 0.6s;transition:ease 0.6s;background-color:transparent;color:#000;font-size:11px;font-weight:700;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;padding:7px 9px 9px;border:0;display:block;}.css-1i8g3m4.hidden{opacity:0;visibility:hidden;}.css-1i8g3m4.hidden:focus{opacity:1;}.css-1i8g3m4::-moz-focus-inner{padding:0;border:0;}.css-1i8g3m4:-moz-focusring{outline:1px dotted;}.css-1i8g3m4:disabled,.css-1i8g3m4.disabled{opacity:0.5;cursor:default;}.css-1i8g3m4:active,.css-1i8g3m4.active{background-color:#f7f7f7;}@media (min-width:740px){.css-1i8g3m4:hover{background-color:#f7f7f7;}}@media (min-width:740px){.css-1i8g3m4{border:none;line-height:13px;padding:9px 9px 12px;}}@media (min-width:1024px){.css-1i8g3m4{display:none;}}@media (min-width:1150px){}.css-3qijnq{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:11px;-webkit-box-pack:space-around;-webkit-justify-content:space-around;-ms-flex-pack:space-around;justify-content:space-around;padding:13px 20px 12px;}@media (min-width:740px){.css-3qijnq{position:relative;}}@media (min-width:1024px){.css-3qijnq{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border:none;padding:0;height:0;-webkit-transform:translateY(42px);-ms-transform:translateY(42px);transform:translateY(42px);}}@media print{.css-3qijnq{display:none;}}.css-uqyvli{color:#121212;font-size:13px;font-family:nyt-franklin,helvetica,arial,sans-serif;display:none;width:auto;}@media (min-width:740px){.css-uqyvli{text-align:center;width:100%;}}@media (min-width:1024px){.css-uqyvli{font-size:12px;margin-bottom:10px;width:auto;}}.css-1uqjmks{color:#121212;font-size:12px;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;display:none;}@media (min-width:740px){.css-1uqjmks{margin:0;position:absolute;left:20px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;}}@media (min-width:1024px){.css-1uqjmks{display:none;}}.css-1bvtpon{display:none;}@media (min-width:1024px){}.css-l72opv{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;position:relative;right:3px;}.css-l72opv a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-l72opv:nth-of-type(3),.css-l72opv:nth-of-type(4){display:none;}}.css-l72opv:last-of-type{margin-right:0;}.css-4skfbu{color:#999;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-size:17px;margin-bottom:5px;margin-bottom:0;}@media print{.css-4skfbu{display:none;}}.css-1fcn4th{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-1fcn4th a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1fcn4th:nth-of-type(3),.css-1fcn4th:nth-of-type(4){display:none;}}.css-1fcn4th:last-of-type{margin-right:0;}@media (max-width:1150px){.css-1fcn4th:nth-of-type(1),.css-1fcn4th:nth-of-type(2),.css-1fcn4th:nth-of-type(3){display:none;}}.css-13zu7ev{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:14px;height:14px;}.css-13zu7ev.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-13zu7ev.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-13zu7ev.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-13zu7ev.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-13zu7ev.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-13zu7ev.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-13zu7ev.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-13zu7ev:hover{background-color:#fff;border:1px solid #ccc;}.css-f7l8cz{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:14px;height:14px;bottom:4px;}.css-f7l8cz.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-f7l8cz.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-f7l8cz.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-f7l8cz.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-f7l8cz.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-f7l8cz.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-f7l8cz.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-16ogagc{background:transparent;display:inline-block;height:20px;width:20px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:27px;height:27px;}.css-16ogagc.hidden{opacity:0;visibility:hidden;}.css-16ogagc.hidden:focus{opacity:1;}.css-16ogagc:hover{background-color:#fff;border:1px solid #ccc;}.css-1vxca1d{position:relative;margin:0 auto;}@media (min-width:600px){.css-1vxca1d{margin:0 auto 20px;}}.css-1vxca1d .relatedcoverage + .recirculation{margin-top:20px;}.css-1vxca1d .wrap + .recirculation{margin-top:20px;}@media (min-width:1024px){.css-1vxca1d{padding-top:40px;}}.css-17ai7jg{color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;margin:10px 20px 0;text-align:left;}.css-17ai7jg a{color:#326891;-webkit-text-decoration:none;text-decoration:none;}.css-17ai7jg a:hover,.css-17ai7jg a:focus{-webkit-text-decoration:underline;text-decoration:underline;}@media (min-width:600px){.css-17ai7jg{margin-left:0;}}.sizeSmall .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:calc(50% - 15px);margin:auto 0 15px 15px;}@media (min-width:600px){.sizeSmall .css-17ai7jg{width:260px;margin-left:15px;}}@media (min-width:740px){.sizeSmall .css-17ai7jg{margin-left:15px;}}@media (min-width:1440px){.sizeSmall .css-17ai7jg{width:330px;margin-left:15px;}}@media (max-width:600px){.sizeSmall .css-17ai7jg{margin:auto 0 0 15px;}}.sizeSmall.sizeSmallNoCaption .css-17ai7jg{margin-left:auto;margin-right:auto;margin-top:10px;}.sizeMedium .css-17ai7jg{max-width:900px;}.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{margin-left:0;margin-right:0;}@media (min-width:600px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:255px;margin:auto 0 15px 15px;}}@media (min-width:1440px){.sizeMedium.layoutVertical.verticalVideo .css-17ai7jg{width:325px;}}.sizeLarge .css-17ai7jg{max-width:none;}@media (min-width:600px){.sizeLarge .css-17ai7jg{margin-left:20px;}}@media (min-width:740px){.sizeLarge .css-17ai7jg{margin-left:20px;max-width:900px;}}@media (min-width:1024px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:720px;}}@media (min-width:1440px){.sizeLarge .css-17ai7jg{margin-left:0;max-width:900px;}}@media (min-width:740px){.sizeLarge.layoutVertical .css-17ai7jg{margin-left:0;}}.sizeFull .css-17ai7jg{margin-left:20px;}@media (min-width:600px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:740px){.sizeFull .css-17ai7jg{max-width:900px;}}@media (min-width:1440px){.sizeFull .css-17ai7jg{max-width:900px;}}@media print{.css-17ai7jg{display:none;}}.css-8i9d0s{margin-right:7px;color:#666;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:0.875rem;line-height:1.125rem;}@media (min-width:740px){.css-8i9d0s{font-size:0.9375rem;line-height:1.25rem;}}.css-8i9d0s strong{font-weight:700;}.css-8i9d0s em{font-style:italic;}.css-8i9d0s a{color:#326891;}.css-8i9d0s a:visited{color:#326891;}.css-xt80pu{width:100%;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-xt80pu{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-xt80pu{width:600px;}}@media (min-width:1440px){.css-xt80pu{width:600px;max-width:600px;}}@media print{.css-xt80pu{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-17xsp6v{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;width:100%;}.css-16vrk19{display:inline-block;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.875rem;line-height:1.125rem;margin:0;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#121212;}@media (min-width:740px){.css-16vrk19{font-size:0.9375rem;line-height:1.25rem;}}.css-1riqqik{display:inline;color:#333;}.css-1riqqik span{-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration-color:#ccc;text-decoration-color:#ccc;}.css-1riqqik span:hover,.css-1riqqik span:focus{-webkit-text-decoration:none;text-decoration:none;}.css-1w5cs23{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-1w5cs23 li{list-style:none;}.css-qddhf4{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.8125rem;line-height:1.125rem;margin-bottom:1rem;margin-bottom:0;margin-top:0;}.css-4brsb6{display:inline-block;height:15px;vertical-align:middle;width:15px;background-color:#eee;border:1px #eee solid;border-radius:100%;padding:5px;width:15px;height:15px;}.css-4brsb6.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-4brsb6.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-4brsb6.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-4brsb6.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-4brsb6.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-4brsb6.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-4brsb6.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-4brsb6:hover{background-color:#fff;border:1px solid #ccc;}.css-uhuo44{display:inline-block;height:15px;vertical-align:middle;width:15px;bottom:5px;position:relative;width:15px;height:15px;bottom:4px;}.css-uhuo44.facebook{background-image:url(/vi-assets/static-assets/icon-fb-circle-2ec7780140bd9e8e8398bbcdf5661569.svg);}.css-uhuo44.twitter{background-image:url(/vi-assets/static-assets/icon-twitter-circle-fc7c2748f5613c68963a0df203bffc05.svg);}.css-uhuo44.email{background-image:url(/vi-assets/static-assets/icon-share-email-circle-a2acce7e23b21d47bb606b628a6c7e34.svg);}.css-uhuo44.link{background-image:url(/vi-assets/static-assets/icon-share-permalink-circle-3ff3876a106221ee493d9542c0895863.svg);}.css-uhuo44.linkedin{background-image:url(/vi-assets/static-assets/icon-share-linkedin-circle-4d7bcf236c5f3a086738746f41f46f7b.svg);}.css-uhuo44.whatsapp{background-image:url(/vi-assets/static-assets/icon-whatsapp-video-a9503bf2b3c73111106c496d3ebc8c67.svg);}.css-uhuo44.reddit{background-image:url(/vi-assets/static-assets/icon-share-reddit-f882338200fd1971b767627fa5f60124.svg);}.css-1ygdjhk{margin-bottom:0.75rem;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.0625rem;line-height:1.5rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;}@media (min-width:740px){.css-1ygdjhk{margin-bottom:1.25rem;}}.css-1ygdjhk .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-1ygdjhk .css-1g7m0tk:hover,.css-1ygdjhk .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-1ygdjhk{font-size:1.1875rem;line-height:1.8125rem;}}.css-1ygdjhk:first-child{margin-top:0;}.css-1ygdjhk:last-child{margin-bottom:0;}@media (min-width:600px){.css-1ygdjhk{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1ygdjhk{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1ygdjhk{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1505tg{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:600;font-size:1.625rem;line-height:1.875rem;margin-left:20px;margin-right:20px;width:calc(100% - 40px);max-width:600px;margin:30px 20px 0.75rem;text-align:left;}@media (min-width:740px){.css-1505tg{font-size:1.75rem;line-height:2.125rem;}}.css-1505tg .css-1g7m0tk{border-bottom:1px solid #6288a5;-webkit-text-decoration:none;text-decoration:none;}.css-1505tg .css-1g7m0tk:hover,.css-1505tg .css-1g7m0tk:focus{border-bottom:1px solid #b3c4ca;-webkit-text-decoration:none;text-decoration:none;}.css-1505tg:first-child{margin-top:0;}.css-1505tg:last-child{margin-bottom:0;}@media (min-width:600px){.css-1505tg{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1505tg{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media print{.css-1505tg{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-1505tg{margin-top:35px;margin-left:auto;margin-right:auto;margin-bottom:1.25rem;}}@media print{.css-1505tg{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1kwfo8p{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;width:calc(100% - 40px);max-width:600px;}.css-1kwfo8p a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-1kwfo8p:nth-of-type(3),.css-1kwfo8p:nth-of-type(4){display:none;}}.css-1kwfo8p:last-of-type{margin-right:0;}.css-1kwfo8p:nth-of-type(1),.css-1kwfo8p:nth-of-type(2),.css-1kwfo8p:nth-of-type(3),.css-1kwfo8p:nth-of-type(4){display:inline;}@media (min-width:600px){.css-1kwfo8p{width:330px;}}.css-ar1l6a{color:#999;display:inline;margin-right:16px;padding:10px 0;width:100%;}.css-ar1l6a a{-webkit-text-decoration:none;text-decoration:none;}@media (max-width:659px){.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:none;}}.css-ar1l6a:last-of-type{margin-right:0;}.css-ar1l6a:nth-of-type(1),.css-ar1l6a:nth-of-type(2),.css-ar1l6a:nth-of-type(3),.css-ar1l6a:nth-of-type(4){display:inline;}.css-1ede5it{background-color:#f7f7f7;border-bottom:1px solid #f3f3f3;border-top:1px solid #f3f3f3;margin:37px auto;padding-bottom:30px;padding-top:12px;text-align:center;margin-top:60px;}@media (min-width:740px){.css-1ede5it{margin:43px auto;}}@media print{.css-1ede5it{display:none;}}@media (min-width:740px){.css-1ede5it{margin-bottom:0;margin-top:0;}}.css-mn5hq9{cursor:pointer;margin:0;border-top:1px solid #ebebeb;color:#333;font-family:nyt-franklin;font-size:13px;font-weight:700;height:44px;-webkit-letter-spacing:0.04rem;-moz-letter-spacing:0.04rem;-ms-letter-spacing:0.04rem;letter-spacing:0.04rem;line-height:44px;text-transform:uppercase;}.accordionExpanded .css-mn5hq9{color:#b3b3b3;}.css-1qmnftd{font-size:11px;text-align:center;}@media (max-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:600px){.css-1qmnftd{padding-bottom:25px;}}@media (min-width:1024px){.css-1qmnftd{padding:0 3% 9px;}}@media (min-width:1150px){.css-1qmnftd{margin:0 auto;max-width:1200px;}}.NYTApp .css-1qmnftd{display:none;}@media print{.css-1qmnftd{display:none;}}.css-1ho5u4o{list-style:none;margin:0 0 15px;padding:0;}@media (min-width:600px){.css-1ho5u4o{display:inline-block;}}.css-13o0c9t{list-style:none;line-height:8px;margin:0 0 35px;padding:0;}@media (min-width:600px){.css-13o0c9t{display:inline-block;}}.css-1yo489b{display:inline-block;line-height:20px;padding:0 10px;}.css-1yo489b:first-child{border-left:none;}.css-1yo489b.desktop{display:none;}@media (min-width:740px){.css-1yo489b.smartphone{display:none;}.css-1yo489b.desktop{display:inline-block;}}.css-z6dj7x{font-style:normal;font-stretch:normal;margin-bottom:1.6rem;color:#333;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:300;-webkit-letter-spacing:0.005em;-moz-letter-spacing:0.005em;-ms-letter-spacing:0.005em;letter-spacing:0.005em;font-size:1.25rem;line-height:1.5625rem;text-align:left;margin:0 20px 1.6rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:740px){.css-z6dj7x{font-size:1.375rem;line-height:1.75rem;}}@media (min-width:600px){.css-z6dj7x{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-z6dj7x{width:600px;}}@media (min-width:1440px){.css-z6dj7x{width:600px;max-width:600px;}}@media print{.css-z6dj7x{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-1a48zt4{opacity:1;-webkit-transition:opacity 0.3s 0.2s;transition:opacity 0.3s 0.2s;}.css-1b4fpzk{margin:37px auto;margin-top:20px !important;margin-bottom:32px;}.css-1b4fpzk strong{font-weight:700;}.css-1b4fpzk em{font-style:italic;}.css-1b4fpzk.sizeSmall{width:calc(100% - 40px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}@media (min-width:600px){.css-1b4fpzk.sizeSmall{max-width:600px;margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-1b4fpzk.sizeSmall{width:100%;}}@media (min-width:1440px){.css-1b4fpzk.sizeSmall{max-width:600px;}}.css-1b4fpzk.sizeSmall.sizeSmallNoCaption{display:block;}@media print{.css-1b4fpzk.sizeSmall.sizeSmallNoCaption{display:none;}}.css-1b4fpzk.sizeMedium{width:100%;max-width:600px;margin-right:auto;margin-left:auto;}@media (min-width:600px){.css-1b4fpzk.sizeMedium{width:calc(100% - 40px);}}@media (min-width:740px){.css-1b4fpzk.sizeMedium{max-width:600px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium{max-width:720px;}}@media (min-width:600px){.css-1b4fpzk.sizeMedium.layoutVertical{width:420px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium.layoutVertical{width:480px;}}.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{width:calc(100% - 40px);}@media (min-width:600px){.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:600px;}}@media (min-width:1440px){.css-1b4fpzk.sizeMedium.layoutVertical.verticalVideo{width:600px;}}.css-1b4fpzk.sizeLarge{width:100%;max-width:1200px;margin-left:auto;margin-right:auto;}@media (min-width:600px){.css-1b4fpzk.sizeLarge{width:auto;}}@media (min-width:740px){.css-1b4fpzk.sizeLarge.layoutVertical{width:600px;}.css-1b4fpzk.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:1024px){.css-1b4fpzk.sizeLarge{width:945px;}}@media (min-width:1440px){.css-1b4fpzk.sizeLarge{width:1200px;}.css-1b4fpzk.sizeLarge.layoutVertical{width:720px;}.css-1b4fpzk.sizeLarge.layoutVertical.verticalVideo{width:600px;}}@media (min-width:600px){.css-1b4fpzk{margin:43px auto;}}@media print{.css-1b4fpzk{display:none;}}@media (min-width:740px){.css-1b4fpzk{margin-top:25px !important;}}.css-1nwzsjy{display:inline-block;color:#888;font-family:nyt-imperial,georgia,'times new roman',times,serif;line-height:1.125rem;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;font-size:0.75rem;}@media (min-width:740px){.css-1nwzsjy{font-size:0.75rem;}}@media (min-width:1150px){.css-1nwzsjy{font-size:0.8125rem;}}@media (min-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1024px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:5px;}}@media (min-width:1440px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:40px;}}@media (max-width:600px){.sizeSmall.sizeSmallNoCaption .css-1nwzsjy{margin-left:-8px;}}@media print{.css-1nwzsjy{display:none;}}.css-1ly73wi{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;-webkit-clip:rect(0 0 0 0);clip:rect(0 0 0 0);overflow:hidden;}.css-wg1cha{margin-left:20px;margin-right:20px;}@media (min-width:600px){.css-wg1cha{width:calc(100% - 40px);max-width:600px;margin:1.5rem auto 1em;}}@media (min-width:1440px){.css-wg1cha{width:600px;max-width:600px;margin:1.5rem auto 1em;}}.css-x8f8u9{font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;color:#333;font-size:0.9375rem;line-height:1.25rem;}.css-x8f8u9 p{margin-bottom:0.75rem;}.css-x8f8u9 a,.css-x8f8u9 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-x8f8u9 a:hover,.css-x8f8u9 a:focus{color:#326891;}@media print{.css-x8f8u9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:740px){.css-x8f8u9{font-size:1rem;line-height:1.375rem;}}.css-x8f8u9 p{margin-bottom:0.75rem;}.css-x8f8u9 a,.css-x8f8u9 a:visited{color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-x8f8u9 a:hover,.css-x8f8u9 a:focus{color:#326891;}@media print{.css-x8f8u9{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-rlzall{width:100%;margin:0 auto;height:auto;max-width:600px;min-width:300px;}.css-rlzall .e13l8dds0 h1{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:700;font-style:italic;font-size:1.8125rem;line-height:2.125rem;}@media (min-width:740px){.css-rlzall .e13l8dds0 h1{font-size:2.25rem;line-height:2.5rem;}}.css-rlzall .e13l8dds0 h2{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:600;font-size:1.625rem;line-height:1.875rem;}@media (min-width:740px){.css-rlzall .e13l8dds0 h2{font-size:1.75rem;line-height:2.125rem;}}.css-rlzall .e13l8dds0 h2 .css-1g7m0tk{border-bottom:1px solid #6288a5;-webkit-text-decoration:none;text-decoration:none;}.css-rlzall .e13l8dds0 h2 .css-1g7m0tk:hover,.css-rlzall .e13l8dds0 h2 .css-1g7m0tk:focus{border-bottom:1px solid #b3c4ca;-webkit-text-decoration:none;text-decoration:none;}.css-rlzall .e13l8dds0 h3{margin-bottom:0.75rem;color:#333;font-family:nyt-franklin;font-weight:700;font-size:1.0625rem;line-height:1.5rem;}@media (min-width:740px){.css-rlzall .e13l8dds0 h3{margin-bottom:0.9375rem;}}@media (min-width:740px){.css-rlzall .e13l8dds0 h3{font-size:1.1875rem;line-height:1.75rem;}}.css-rlzall .e13l8dds0 p{margin-bottom:0.75rem;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.0625rem;line-height:1.5rem;}@media (min-width:740px){.css-rlzall .e13l8dds0 p{margin-bottom:1.25rem;}}.css-rlzall .e13l8dds0 p .css-1g7m0tk{-webkit-text-decoration:underline;text-decoration:underline;}.css-rlzall .e13l8dds0 p .css-1g7m0tk:hover,.css-rlzall .e13l8dds0 p .css-1g7m0tk:focus{-webkit-text-decoration:none;text-decoration:none;}@media (min-width:740px){.css-rlzall .e13l8dds0 p{font-size:1.1875rem;line-height:1.8125rem;}}.css-rlzall .e13l8dds0 ul{list-style:none;}.css-rlzall .e13l8dds0 li{margin-bottom:1rem;list-style:disc;padding-left:0;margin-left:20px;}.css-rlzall .e13l8dds0 a{font-family:nyt-imperial,georgia,'times new roman',times,serif;color:#326891;-webkit-text-decoration:underline;text-decoration:underline;}.css-rlzall .e13l8dds0 a:visited{color:#326891;}.css-rlzall .e13l8dds0 a:hover,.css-rlzall .e13l8dds0 a:focus{-webkit-text-decoration:none;text-decoration:none;}.css-rlzall .e13l8dds0 video,.css-rlzall .e13l8dds0 img,.css-rlzall .e13l8dds0 iframe{margin:0;padding:0;border:0;}.css-17ih8de{box-sizing:border-box;vertical-align:top;}.css-1ukm2ij{font-size:1rem;line-height:1.25rem;font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:700;color:#333;}.css-15g2oxy{margin-top:1rem;}.css-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.css-1yil5bp{font-family:nyt-franklin,helvetica,arial,sans-serif;font-weight:500;color:#333;-webkit-letter-spacing:0.02em;-moz-letter-spacing:0.02em;-ms-letter-spacing:0.02em;letter-spacing:0.02em;font-size:0.8125rem;line-height:1.125rem;margin-bottom:1rem;}@-webkit-keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}@keyframes animation-7y3qfv{0%{opacity:0;}10%,90%{opacity:1;}100%{opacity:0;}}.css-103xxh4{margin-top:0.3125rem;}.css-103xxh4 .e6idgb70{margin-top:1.875rem;color:#121212;font-weight:700;line-height:0.75rem;margin-bottom:0.625rem;}@media print{.css-103xxh4 .e6idgb70{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-103xxh4 .e1h9rw200{margin-bottom:1rem;margin-bottom:10px;}.css-103xxh4 .e1wiw3jv0{color:#333;}.css-103xxh4 .e16638kd0{width:auto;margin-bottom:0;margin-left:0;display:inline-block;}.css-103xxh4 .euiyums0{margin-bottom:20px;color:#121212;}@media print{.css-103xxh4 .euiyums0{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:600px){.css-103xxh4{margin-top:0.9375rem;}}@media (min-width:1024px){.css-103xxh4{margin-top:2.8125rem;}}.css-2tpadd{color:#121212;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:700;font-style:italic;font-size:1.8125rem;line-height:2.125rem;margin:0 20px 1rem;position:relative;text-align:left;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}@media (min-width:740px){.css-2tpadd{font-size:2.25rem;line-height:2.5rem;}}@media (min-width:600px){.css-2tpadd{margin-left:auto;margin-right:auto;}}@media print{.css-2tpadd{margin-left:0;margin-right:0;width:100%;max-width:100%;}}@media (min-width:600px){.css-2tpadd{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-2tpadd{width:600px;}}@media (min-width:1440px){.css-2tpadd{width:600px;max-width:600px;}}@media print{.css-2tpadd{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-tmydge{margin:0.5rem 0 1.5rem;padding-top:0.5rem;width:calc(100% - 40px);max-width:600px;margin-left:20px;margin-right:20px;}.css-tmydge:before{content:'';display:block;width:100%;margin-bottom:0.5rem;border-bottom:1px solid #e2e2e2;}.css-tmydge:after{content:'';display:block;width:100%;margin-top:0.5rem;border-bottom:1px solid #e2e2e2;}.css-tmydge .e16ij5yr6{border-top:none;}.css-tmydge:before{width:50%;}.css-tmydge .epkadsg0{display:inline-block;margin-right:0.35rem;text-transform:uppercase;-webkit-letter-spacing:0.03rem;-moz-letter-spacing:0.03rem;-ms-letter-spacing:0.03rem;letter-spacing:0.03rem;font-size:0.875rem;line-height:1.125rem;}.css-tmydge .epkadsg1{display:inline;}@media (min-width:600px){.css-tmydge{margin-left:auto;margin-right:auto;}}@media (min-width:1024px){.css-tmydge{width:600px;}}@media (min-width:1440px){.css-tmydge{width:600px;max-width:600px;}}@media print{.css-tmydge{margin-left:0;margin-right:0;width:100%;max-width:100%;}}.css-113dckd{margin-bottom:1rem;}.css-113dckd .e16638kd0{color:#999;margin-top:5px;margin-bottom:0;display:inline-block;font-size:0.75rem;line-height:1.0625rem;}.css-113dckd:hover .e16ij5yr2,.css-113dckd:visited .e16ij5yr2{color:#326891;}.css-ty8is0{font-size:1.1875rem;line-height:1.4375rem;font-family:nyt-cheltenham,georgia,'times new roman',times,serif;font-weight:500;color:#121212;margin-right:10px;display:inline;-webkit-text-decoration:underline;text-decoration:underline;color:#326891;font-family:nyt-imperial,georgia,'times new roman',times,serif;font-size:1.0625rem;line-height:1.5rem;font-weight:400;}.css-ty8is0:hover,.css-ty8is0:focus{-webkit-text-decoration:none;text-decoration:none;}.css-77hcv{display:none;}@-webkit-keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@keyframes animation-g7rb99{0%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0);}100%{-webkit-transform:scale(1.05) rotate(-90deg);-ms-transform:scale(1.05) rotate(-90deg);transform:scale(1.05) rotate(-90deg);}}@-webkit-keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}@keyframes animation-m6999o{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;}}
+ ]]>
+ </style>
+ <script>
+ <![CDATA[
+ window.__emotion = ["0","1dv1kvn","nuvmzp","1gz70xg","9e9ivx","2bwtzy","6n7j50","1kj7lfb","10m9xeu","vz7hjd","1fe7a5q","1rn5q1r","10488qs","1iruc8t","1ropbjl","uw59u","jxzr5i","oylsik","1otr2jl","1c8n994","qtw155","v0l3hm","g4gku8","1rr4qq7","6xhk3s","rxqrcl","tj0ten","ist4u3","1gprdgz","10t7hia","mzqdl","kwpx34","1k2cjfc","1vhk1ks","6td9kr","r5ic95","15uy5yv","1p8nkc0","1hyfx7x","f8wsfj","mhvv8m","qremme","1f85ym4","7inim5","133m5b6","1lc20wh","1m9j9gf","1g7m0tk","bsn42l","11cwn6f","d8bdto","y8aj3r","60hakz","i29ckm","1ri25x2","12fr9lp","1hfdzay","k008qs","eqw76k","m6xlts","1ahhg7f","rs6kf8","17xtcya","x15j1o","19gb6gw","1iwv8en","1sy8kpn","19vbshk","l9onyx","b7n1on","1rj8to8","4w91ra","1rjzas3","acwcvw","1egl8em","vdv0al","1i2y565","o6xoe7","1fanzo5","53u6y8","z3e15g","cl76n0","1vs7yia","irejme","1ct2c9h","13nfagi","1b9egsl","1c5cfvc","htgkrt","e64et","9zaqp9","16fq4rz","1kjk1j2","88g286","12yx39b","4hu8jm","1wqz2f4","yl3z84","1q3gjvc","nc39ev","amd09y","ru1vxe","ajnadh","1baulvz","79elbk","v89234","13lpfd6","1bymuyk","1waixk9","1f7ibof","l2ztic","19lv58h","mgtjo2","1wr3we4","10698na","nhjhh0","o2c64h","1bnxwmn","1nkps6a","1i8g3m4","3qijnq","uqyvli","1uqjmks","1bvtpon","l72opv","4skfbu","1fcn4th","13zu7ev","f7l8cz","16ogagc","1vxca1d","1rk3iho","17ai7jg","8i9d0s","xt80pu","17xsp6v","16vrk19","1riqqik","1w5cs23","qddhf4","4brsb6","uhuo44","1ygdjhk","1505tg","1kwfo8p","ar1l6a","1ede5it","mn5hq9","1qmnftd","1ho5u4o","13o0c9t","1yo489b","z6dj7x","1a48zt4","1b4fpzk","1nwzsjy","1ly73wi","wg1cha","x8f8u9","rlzall","17ih8de","1ukm2ij","15g2oxy","i9gxme","1yil5bp","7y3qfv","103xxh4","2tpadd","tmydge","113dckd","ty8is0","77hcv","g7rb99","m6999o"]
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (function () { var _f=function(t,e,n){var a=window,A=document,o=function(t){var e=A.createElement("style");e.appendChild(A.createTextNode(t)),A.querySelector("head").appendChild(e)},r=function(t,e,n,a,A){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onreadystatechange=function(){if(4===r.readyState&&200===r.status){o(r.responseText);try{localStorage.setItem("nyt-fontFormat",e),localStorage.setItem(a,n)}catch(t){return}localStorage.setItem(A,r.responseText)}return!0},r.send(null)},c=function(e,n){var A;try{A=localStorage.getItem("nyt-fontFormat")}catch(t){}A||(A=function(){if(!("FontFace"in a))return!1;var t=new FontFace("t",'url("data:application/font-woff2;base64,d09GMgABAAAAAADcAAoAAAAAAggAAACWAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABk4ALAoUNAE2AiQDCAsGAAQgBSAHIBtvAcieB3aD8wURQ+TZazbRE9HvF5vde4KCYGhiCgq/NKPF0i6UIsZynbP+Xi9Ng+XLbNlmNz/xIBBqq61FIQRJhC/+QA/08PJQJ3sK5TZFMlWzC/iK5GUN40psgqvxwBjBOg6JUSJ7ewyKE2AAaXZrfUB4v+hze37ugJ9d+DeYqiDwVgCawviwVFGnuttkLqIMGivmDg") format("woff2")',{});return t.load().catch(function(){}),"loading"==t.status||"loaded"==t.status}()?"woff2":"woff");for(var c=0;c<e.length;c++){var i=e[c],l="shared"!==i?"-"+i:"",d="nyt-fontHash"+l,s="nyt-fontFace"+l,f=t[i][A],u=localStorage.getItem(d),g=localStorage.getItem(s);if(u===f.hash&&g)o(g);else{var h=function(t,e,n,a,A){return function(){r(t,e,n,a,A)}}(f.url,A,f.hash,d,s);n?h():document.addEventListener("DOMContentLoaded",h)}}};c(e),window.addEventListener("load",function(){c(n,!0)})};;_f.apply(null, [{"shared":{"woff":{"hash":"f2adc73415c5bbb437e993c14559e70e","url":"/vi-assets/static-assets/shared-woff.fonts-f2adc73415c5bbb437e993c14559e70e.css"},"woff2":{"hash":"22b34a6a6fd840943496b658184afdd3","url":"/vi-assets/static-assets/shared-woff2.fonts-22b34a6a6fd840943496b658184afdd3.css"}},"story":{"woff":{"hash":"d5c4f7d33f59d401af5121eb86eade0d","url":"/vi-assets/static-assets/story-woff.fonts-d5c4f7d33f59d401af5121eb86eade0d.css"},"woff2":{"hash":"8cda51537d027e0df92bea96a094bfe3","url":"/vi-assets/static-assets/story-woff2.fonts-8cda51537d027e0df92bea96a094bfe3.css"}},"opinion":{"woff":{"hash":"dfc5106c9c0aaa76688687e664474b04","url":"/vi-assets/static-assets/opinion-woff.fonts-dfc5106c9c0aaa76688687e664474b04.css"},"woff2":{"hash":"e2b27ff317927dfd77bdd429409627e0","url":"/vi-assets/static-assets/opinion-woff2.fonts-e2b27ff317927dfd77bdd429409627e0.css"}},"tmag":{"woff":{"hash":"4634f3c7ddebb9113b69d4578d9a0ba0","url":"/vi-assets/static-assets/tmag-woff.fonts-4634f3c7ddebb9113b69d4578d9a0ba0.css"},"woff2":{"hash":"8622c93c260fa93b229b7249df708fb1","url":"/vi-assets/static-assets/tmag-woff2.fonts-8622c93c260fa93b229b7249df708fb1.css"}},"mag":{"woff":{"hash":"109e6d301ed49c8078086b5892696adf","url":"/vi-assets/static-assets/mag-woff.fonts-109e6d301ed49c8078086b5892696adf.css"},"woff2":{"hash":"fb42c728dc70cc4ef6010a60cb10b0bd","url":"/vi-assets/static-assets/mag-woff2.fonts-fb42c728dc70cc4ef6010a60cb10b0bd.css"}},"well":{"woff":{"hash":"f0e613b89006e99b4622d88aa5563a81","url":"/vi-assets/static-assets/well-woff.fonts-f0e613b89006e99b4622d88aa5563a81.css"},"woff2":{"hash":"77806b85de524283fe742b916c9d0ee4","url":"/vi-assets/static-assets/well-woff2.fonts-77806b85de524283fe742b916c9d0ee4.css"}}},["shared","story"],["opinion","tmag","mag","well"]]); })();
+ (function() {
+ var thisHour = (new Date()).getHours();
+ var styles = '[data-timezone][data-timezone~="' + thisHour +'"] { display: block }';
+ var s = document.createElement('style');
+ s.innerHTML = styles;
+ document.head.appendChild(s);
+ })();
+
+ !function(){if('PerformanceLongTaskTiming' in window){var g=window.__tti={e:[]};
+ g.o=new PerformanceObserver(function(l){g.e=g.e.concat(l.getEntries())});
+ g.o.observe({entryTypes:['longtask']})}}();
+
+
+ !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener);
+
+ try {
+ var observer = new window.PerformanceObserver(function (list) {
+ var entries = list.getEntries();
+
+ for (var i = 0; i < entries.length; i += 1) {
+ var entry = entries[i];
+ var performance = {};
+
+ performance[entry.name] = Math.round(entry.startTime + entry.duration);
+ (window.dataLayer = window.dataLayer || []).push({
+ event: "performance",
+ pageview: {
+ performance: performance
+ }
+ });
+ }
+ });
+ observer.observe({
+ entryTypes: ["paint"]
+ });
+ } catch (e) {}
+ ]]>
+ </script>
+ <style>
+ <![CDATA[
+ [data-timezone] { display: none }
+ ]]>
+ </style>
+ <style type="text/css" media="screen,print">
+ /*<![CDATA[*/
+ #g-0916-biz-web-DEBT-CHART-1-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiSymbol {
+ position: absolute;
+ box-sizing: border-box;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:600px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle0 {
+ line-height:16px;
+ height:16px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle1 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle3 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle4 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 {
+ position:relative;
+ overflow:hidden;
+ width:300px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle3 {
+ line-height:16px;
+ height:16px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle4 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+
+ /*]]>*/
+ </style>
+ <style type="text/css" media="screen,print">
+ /*<![CDATA[*/
+ #g-0916-biz-web-DEBT-CHART-2-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiSymbol {
+ position: absolute;
+ box-sizing: border-box;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:600px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle3 {
+ font-weight:500;
+ font-size:11px;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle4 {
+ font-weight:500;
+ font-size:11px;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle5 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 {
+ position:relative;
+ overflow:hidden;
+ width:300px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle3 {
+ font-weight:500;
+ font-size:11px;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle4 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+
+ /*]]>*/
+ </style>
+ <style type="text/css" media="screen,print">
+ /*<![CDATA[*/
+ #g-0916-biz-web-DEBT-CHART-3-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiSymbol {
+ position: absolute;
+ box-sizing: border-box;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:600px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle3 {
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle4 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 {
+ position:relative;
+ overflow:hidden;
+ width:300px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle3 {
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle4 {
+ font-weight:500;
+ height:18px;
+ text-align:center;
+ }
+
+ /*]]>*/
+ </style>
+ <style type="text/css" media="screen,print">
+ /*<![CDATA[*/
+ #g-0916-biz-web-DEBT-CHART-5-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiSymbol {
+ position: absolute;
+ box-sizing: border-box;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:600px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:500;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle0 {
+ font-weight:700;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle1 {
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle2 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle3 {
+ font-size:11px;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle4 {
+ font-size:11px;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 {
+ position:relative;
+ overflow:hidden;
+ width:300px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:700;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle0 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle1 {
+ font-weight:500;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle2 {
+ font-weight:500;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle3 {
+ font-weight:500;
+ font-size:11px;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle4 {
+ font-weight:500;
+ font-size:11px;
+ height:18px;
+ text-align:center;
+ }
+
+ /*]]>*/
+ </style>
+ <style type="text/css" media="screen,print">
+ /*<![CDATA[*/
+ #g-0916-biz-web-DEBT-CHART-4-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiSymbol {
+ position: absolute;
+ box-sizing: border-box;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:600px;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:500;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle0 {
+ font-weight:700;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle1 {
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle2 {
+ font-size:11px;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle3 {
+ font-size:11px;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle4 {
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 {
+ position:relative;
+ overflow:hidden;
+ width:300px;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:500;
+ font-size:13px;
+ line-height:18px;
+ height:auto;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0em;
+ text-align:left;
+ color:rgb(51,51,51);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle0 {
+ font-weight:700;
+ height:18px;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle1 {
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle2 {
+ font-size:11px;
+ height:18px;
+ text-align:right;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle3 {
+ font-size:11px;
+ height:18px;
+ text-align:center;
+ }
+ #g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle4 {
+ height:18px;
+ }
+
+ /*]]>*/
+ </style>
+ </head>
+ <body>
+ <div id="swg-script"></div>
+ <script>
+ <![CDATA[
+ window.swgUserInfoXhrObject.checkSwgResponse = false;
+ !function(){function e(e){window.console.log("aborted ".concat(e)),window.swgUserInfoXhrObject.checkSwgResponse={};var t=new Event("aborted");return window.swgUserInfoXhrObject.dispatchEvent(t),window.swgUserInfoXhrObject.abort(),!1}function t(e){return!!window.dataLayer&&((window.dataLayer=window.dataLayer||[]).push({event:"impression",module:e}),!0)}function n(){return"undefined"==typeof window?e("no window"):-1!==document.cookie.indexOf("NYT-S")?e("NYT-S"):!0===function(){if(!window.localStorage)return!1;var e=window.localStorage.getItem("nyt-swgOptOut");if(!e)return!1;var t=parseInt(e,10);return((new Date).getTime()-t)/864e5<1||(window.localStorage.removeItem("nyt-swgOptOut"),!1)}()?e("opt-out"):window.SWG?((window.SWG=window.SWG||[]).push(function(n){return n.init(vi.env.SWG_PUBLICATION_ID),n.getEntitlements().then(function(o){if(void 0===o||!o.raw)return e("entitlements 1");var a={entitlements_token:o.raw};return window.swgUserInfoXhrObject.withCredentials=!0,window.swgUserInfoXhrObject.open("POST","".concat(vi.env.AUTH_HOST,"/svc/account/auth/v1/login-swg-web"),!0),window.swgUserInfoXhrObject.setRequestHeader("Content-Type","application/json"),window.swgUserInfoXhrObject.send(JSON.stringify(a)),window.swgUserInfoXhrObject.onload=function(){switch(window.swgUserInfoXhrObject.status){case 200:return t({name:"swg",context:"Seamless",label:"Seamless Signin",region:"login"}),window.location.reload(!0),!0;case 412:return e("412"),function(e,n){return e.completeDeferredAccountCreation({entitlements:n,consent:!1}).then(function(e){var n="".concat(vi.env.AUTH_HOST,"/svc/account/auth/v1/swg-dal-web"),o=e.purchaseData.raw.data?e.purchaseData.raw.data:e.purchaseData.raw,a=JSON.parse(o),r={package_name:a.packageName,product_id:a.productId,purchase_token:a.purchaseToken,google_id_token:e.userData.idToken,google_user_email:e.userData.email,google_user_id:e.userData.id,google_user_name:e.userData.name},i=new XMLHttpRequest;i.withCredentials=!0,i.open("POST",n,!0),i.setRequestHeader("Content-Type","application/json"),i.send(JSON.stringify(r)),i.onload=function(){200===i.status?(t({name:"swg",context:"Deferred",label:"Seamless Signin",region:"swg-modal"}),e.complete().then(function(){window.location.reload(!0)})):(e.complete(),window.location=encodeURI("".concat(vi.env.AUTH_HOST,"/get-started/swg-link?redirect=").concat(window.location.href)))}}).catch(function(){return!!window.localStorage&&!window.localStorage.getItem("nyt-swgOptOut")&&(window.localStorage.setItem("nyt-swgOptOut",(new Date).getTime()),!0)}),!0}(n,o);default:return e(window.swgUserInfoXhrObject.status)}},o}).catch(function(){return e("entitlements 2")}),!0}),!0):e("swg")}if(-1===document.cookie.indexOf("NYT-S")){var o=document.createElement("script");o.src="https://news.google.com/swg/js/v1/swg.js",o.setAttribute("subscriptions-control","manual"),o.setAttribute("async",!0),o.onload=function(){n()},o.onerror=function(){e("swg")},document.getElementById("swg-script").appendChild(o)}}();
+ ]]>
+ </script>
+ <div id="app">
+ <div class="css-v89234 e3w10z60">
+ <div>
+ <div>
+ <div class="css-13lpfd6 e1nre7570">
+ <header class="css-1bymuyk e1nre7571">
+ <section class="css-1waixk9 e1nre7572">
+ <div class="css-1f7ibof emxkhtz0">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="Sections Navigation &amp; Search" class="emxkhtz1 css-l2ztic" data-testid="nav-button"><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <rect x="1" y="3" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="7" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button>
+ </div><button id="desktop-sections-button" aria-label="Sections Navigation" class="css-19lv58h emxkhtz2"><span class="css-vz7hjd">Sections</span><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <rect x="1" y="3" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="7" fill="#333333" width="14" height="2"></rect>
+ <rect x="1" y="11" fill="#333333" width="14" height="2"></rect></svg></button>
+ <div class="css-10488qs">
+ <button class="css-mgtjo2 e1a6adlb0" data-test-id="search-button"><span class="css-vz7hjd">SEARCH</span><svg class="css-1fe7a5q" viewbox="0 0 16 16">
+ <path fill="#333" d="M11.3,9.2C11.7,8.4,12,7.5,12,6.5C12,3.5,9.5,1,6.5,1S1,3.5,1,6.5S3.5,12,6.5,12c1,0,1.9-0.3,2.7-0.7l3.3,3.3c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4c0.6-0.6,0.6-1.5,0-2.1L11.3,9.2zM6.5,10.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.7,3.8,3.8C10.3,8.6,8.6,10.3,6.5,10.3z"></path></svg></button>
+ </div><a class="css-1rn5q1r" href="#site-content">Skip to content</a><a class="css-1rn5q1r" href="#site-index">Skip to site index</a>
+ </div>
+ <div class="css-1wr3we4 e14k9kmx0">
+ <a href="https://www.nytimes.com/pages/business/economy/index.html" class="css-nuvmzp">Economy</a>
+ </div>
+ <div class="css-10698na e1ngbli50">
+ <a aria-label="New York Times Logo. Click to visit the homepage" class="css-nhjhh0 e1ngbli51" href="/"><svg xmlns="http://www.w3.org/2000/svg" class="" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a>
+ </div>
+ <div class="css-o2c64h e1c1i1hy1">
+ <a href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU.html?campaignId=6W74R" class="css-1kj7lfb nytcp-opt" data-testid="subscribe-button"><button class="css-1bnxwmn e1c1i1hy0">Subscribe</button>
+ <div class="optimizelyOK vi_bar1 css-1nkps6a"></div></a><a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1kj7lfb"><button class="css-1bnxwmn e1c1i1hy0" data-testid="login-button">Log In</button></a>
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="User Settings" class="e1c1i1hy4 css-1i8g3m4" data-testid="user-settings-button"><svg class="css-10m9xeu" viewbox="0 0 16 16" fill="#333">
+ <path d="M8,10c-2.5,0-7,1.1-7,3.5V16h14v-2.5C15,11.1,10.5,10,8,10z"></path>
+ <circle cx="8" cy="4" r="4"></circle></svg></button>
+ </div>
+ </div>
+ </section>
+ <section class="hasLinks css-3qijnq ea53akk3">
+ <div class="css-uqyvli ea53akk0"></div>
+ <div class="css-1uqjmks ea53akk1"></div>
+ <div class="css-9e9ivx">
+ <a href="https://myaccount.nytimes.com/auth/login?response_type=cookie&amp;client_id=vi" class="css-1gz70xg">Log In</a>
+ </div>
+ <div class="css-1bvtpon ea53akk2">
+ <a href="https://www.nytimes.com/section/todayspaper" class="css-2bwtzy">Today’s Paper</a>
+ </div>
+ </section>
+ </header>
+ </div>
+ </div>
+ <main id="site-content">
+ <div>
+ <div class="css-eqw76k" style="opacity:0.000000001;z-index:-1;visibility:hidden">
+ <div class="css-m6xlts">
+ <div class="css-1ahhg7f">
+ <span class="css-17xtcya"><a href="/pages/business/economy/index.html">Economy</a></span><span class="css-x15j1o">|</span><span class="css-rs6kf8">As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military</span>
+ </div>
+ <div class="css-k008qs">
+ <div class="css-1iwv8en">
+ <a href="/"><svg class="css-1ri25x2" viewbox="0 0 16 22">
+ <path d="M15.863 13.08c-.687 1.818-1.923 3.147-3.64 3.916v-3.917l2.129-1.958-2.129-1.889V6.505c1.923-.14 3.228-1.609 3.228-3.358C15.45.84 13.32 0 12.086 0c-.275 0-.55 0-.962.14v.14h.481c.824 0 1.51.42 1.51 1.189 0 .63-.48 1.189-1.304 1.189-2.129 0-4.6-1.749-7.279-1.749C2.13.91.481 2.728.481 4.546c0 1.819 1.03 2.448 2.128 2.798v-.14c-.343-.21-.618-.63-.618-1.189 0-.84.756-1.469 1.648-1.469 2.267 0 5.906 1.959 8.172 1.959h.206v2.727l-2.129 1.889 2.13 1.958v3.987c-.894.35-1.786.49-2.748.49-3.502 0-5.768-2.169-5.768-5.806 0-.839.137-1.678.344-2.518l1.785-.769v7.973l3.57-1.608V6.575L3.984 8.953c.55-1.61 1.648-2.728 2.953-3.358v-.07C3.433 6.295 0 9.023 0 13.08c0 4.686 3.914 7.974 8.446 7.974 4.807 0 7.485-3.288 7.554-7.974h-.137z" fill="#000"></path></svg></a>
+ <div>
+ <span class="css-1hfdzay"><a href="/" aria-label="New York Times Logo. Click to visit the homepage"><svg xmlns="http://www.w3.org/2000/svg" class="css-12fr9lp" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a></span>
+ </div>
+ </div>
+ <div class="css-19gb6gw">
+ <div class="">
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-4skfbu" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-1fcn4th">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html&amp;smid=fb-share&amp;name=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-13zu7ev" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NC9vam&amp;text=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military" target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-13zu7ev" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <a href="mailto:?subject=NYTimes.com%3A%20As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;body=From%20The%20New%20York%20Times%3A%0A%0AAs%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military%0A%0ATax%20cuts%2C%20spending%20increases%20and%20higher%20interest%20rates%20could%20make%20it%20harder%20to%20respond%20to%20future%20recessions%20and%20deal%20with%20other%20needs.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-13zu7ev" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-1fcn4th">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-f7l8cz" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <meta itemprop="isAccessibleForFree" content="false" /><span itemprop="isPartOf" itemscope="itemscope" itemtype="http://schema.org/CreativeWork%20http://schema.org/Product">
+ <meta itemprop="name" content="The New York Times Company" />
+ <meta itemprop="productID" content="nytimes.com:basic" /></span>
+ <article id="story" class="css-1vxca1d e1qksbhf0">
+ <div id="top-wrapper" class="css-1sy8kpn">
+ <div id="top" style="display: block; height: 100%; min-height: 90px; text-align: center;"></div>
+ </div>
+ <header class="css-103xxh4 euiyums1">
+ <div id="sponsor-wrapper" class="css-1hyfx7x">
+ <div id="sponsor-slug" class="css-19vbshk">
+ <p>
+ Supported by
+ </p>
+ </div>
+ <div class="ad sponsor-wrapper" style="text-align:center;height:100%;display:block">
+ <div id="sponsor"></div>
+ </div>
+ </div>
+ <div class="css-1rk3iho ehdk2mb0">
+ <h1 class="css-2tpadd e1h9rw200" itemprop="headline" id="link-68f40e13">
+ <span>As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military</span>
+ </h1>
+ </div>
+ <p class="css-z6dj7x e1wiw3jv0">
+ Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.
+ </p>
+ <div data-testid="photoviewer-wrapper" class="css-79elbk ehw59r11">
+ <div class="css-z3e15g" data-testid="photoviewer-wrapper-hidden"></div>
+ <div data-testid="photoviewer-children" class="css-1a48zt4 ehw59r111">
+ <figure class="sizeMedium layoutHorizontal css-1b4fpzk toneNews" aria-label="media" role="group" itemscope="itemscope" itemprop="associatedMedia" itemid="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=90&amp;auto=webp" itemtype="http://schema.org/ImageObject">
+ <div class="css-bsn42l">
+ <span class="css-1dv1kvn">Image</span><img alt="" class="css-11cwn6f" src="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" srcset="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=90&amp;auto=webp 600w,https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-jumbo.jpg?quality=90&amp;auto=webp 1024w,https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg?quality=90&amp;auto=webp 2048w" sizes="((min-width: 600px) and (max-width: 1004px)) 84vw, (min-width: 1005px) 60vw, 100vw" itemprop="url" itemid="https://static01.nyt.com/images/2018/09/15/business/15DEBTS01/merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg?quality=75&amp;auto=webp&amp;disable=upscale" />
+ </div>
+ <figcaption itemprop="caption description" class="css-17ai7jg emkp2hg0">
+ <span class="css-8i9d0s e13ogyst0">Interest payments on the federal debt could surpass the Defense Department budget in 2023.</span><span itemprop="copyrightHolder" class="emkp2hg2 css-1nwzsjy e1z0qqy90"><span class="css-1ly73wi e1tej78p0">Credit</span><span><span class="css-1dv1kvn">Credit</span><span>Jeon Heon-Kyun/EPA, via Shutterstock</span></span></span>
+ </figcaption>
+ </figure>
+ </div>
+ </div>
+ <div class="css-xt80pu euiyums0">
+ <div class="css-acwcvw">
+ <div class="css-17xsp6v epjyd6m0">
+ <div class="css-1baulvz">
+ <p class="css-16vrk19 e1jsehar1" itemprop="author creator" itemscope="itemscope" itemtype="http://schema.org/Person" itemid="">
+ By<!-- --> <a href="https://www.nytimes.com/by/nelson-d-schwartz" class="css-1riqqik e1jsehar0"><span class="css-1baulvz" itemprop="name">Nelson D. Schwartz</span></a>
+ </p>
+ </div>
+ </div>
+ <ul class="css-1w5cs23 epjyd6m1">
+ <li>
+ <time class="css-qddhf4 e16638kd0" datetime="2018-09-25">Sept. 25, 2018</time>
+ </li>
+ <li class="css-6n7j50">
+ <div class="">
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-60hakz">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html&amp;smid=fb-share&amp;name=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NC9vam&amp;text=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military" target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-4brsb6" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <a href="mailto:?subject=NYTimes.com%3A%20As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;body=From%20The%20New%20York%20Times%3A%0A%0AAs%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military%0A%0ATax%20cuts%2C%20spending%20increases%20and%20higher%20interest%20rates%20could%20make%20it%20harder%20to%20respond%20to%20future%20recessions%20and%20deal%20with%20other%20needs.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-4brsb6" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-60hakz">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </header>
+ <section name="articleBody" itemprop="articleBody" class="css-1i2y565">
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ The federal government could soon pay more in interest on its debt than it spends on the military, Medicaid or children’s programs.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The run-up in borrowing costs is a one-two punch brought on by the need to finance a fast-growing budget deficit, worsened by tax cuts and steadily rising interest rates that will make the debt more expensive.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ With less money coming in and more going toward interest, political leaders will find it harder to address pressing needs like fixing crumbling roads and bridges or to make emergency moves like pulling the economy out of future recessions.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Within a decade, more than $900 billion in interest payments will be due annually, easily outpacing spending on myriad other programs. Already the fastest-growing major government expense, the cost of interest is on track to hit $390 billion next year, nearly 50 percent more than in 2017, according to the Congressional Budget Office.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ “It’s very much something to worry about,” said C. Eugene Steuerle, a fellow at the Urban Institute and a co-founder of the Urban-Brookings Tax Policy Center in Washington. “Everything else is getting squeezed.”
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Gradually rising interest rates would have made borrowing more expensive even without additional debt. But the tax cuts passed late last year have created a deeper hole, with the deficit increasing faster than expected. A budget bill <a class="css-1g7m0tk" href="https://www.nytimes.com/2018/02/08/us/politics/congress-budget-deal-vote.html?module=inline" title="">approved in February that raised</a> spending by $300 billion over two years will add to the financial pressure.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The deficit is expected to total nearly $1 trillion next year — the first time it has been that big <!-- -->since 2012<!-- -->, when the economy was still struggling to recover from the financial crisis and interest rates were near zero.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-13nfagi">
+ <section id="interest-on-national-debt" data-id="100000006106654" class="interactive-embedded interactive-size-scoop custom-graphic-container css-rlzall e13l8dds1">
+ <header class="css-cl76n0 interactive-header">
+ <p data-testid="leadin" class="css-1vs7yia interactive-leadin custom-leadin">
+ Annual interest payments on the national debt are expected to triple over the next decade, according to the Congressional Budget Office.
+ </p>
+ </header>
+ <div class="interactive-graphic custom-graphic css-17ih8de e13l8dds0">
+ <!-- Generated by ai2html v0.74.0 - 2018-09-14 15:18 -->
+ <!-- ai file: 0916 biz web DEBT CHART 1.ai -->
+ <!-- preview: 2018-09-14-interest-on-national-debt -->
+ <!-- scoop: interest-on-national-debt -->
+ <div id="g-0916-biz-web-DEBT-CHART-1-box" class="ai2html ai2html-box-v5">
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-0916-biz-web-DEBT-CHART-1-Artboard_2" class="g-artboard" data-aspect-ratio="1.382" data-min-width="600">
+ <img id="g-0916-biz-web-DEBT-CHART-1-Artboard_2-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/interest-on-national-debt/313e919f83bb85b62966d7f70121c5f3f3ea740b/0916-biz-web-DEBT-CHART-1-Artboard_2.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai0-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.8869%;margin-top:-16.2px;left:96.5906%;margin-left:-30px;width:60px;">
+ <p class="g-pstyle0">
+ $915
+ </p>
+ <p class="g-pstyle0">
+ billion
+ </p>
+ </div>
+ <div id="g-ai0-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.0838%;width:243px;">
+ <p class="g-pstyle1">
+ Interest payments on the national debt
+ </p>
+ </div>
+ <div id="g-ai0-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:94.9386%;width:52px;">
+ <p class="g-pstyle2">
+ $900
+ </p>
+ </div>
+ <div id="g-ai0-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:5.4133%;width:55px;">
+ <p class="g-pstyle3">
+ billion
+ </p>
+ </div>
+ <div id="g-ai0-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:34.841%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle2">
+ 600
+ </p>
+ </div>
+ <div id="g-ai0-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:60.4108%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle2">
+ 300
+ </p>
+ </div>
+ <div id="g-ai0-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:70.9998%;margin-top:-16.2px;left:5.8153%;margin-left:-30px;width:60px;">
+ <p class="g-pstyle0">
+ $263
+ </p>
+ <p class="g-pstyle0">
+ billion
+ </p>
+ </div>
+ <div id="g-ai0-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle2">
+ 0
+ </p>
+ </div>
+ <div id="g-ai0-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:6.1605%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’17
+ </p>
+ </div>
+ <div id="g-ai0-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:14.4067%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ <div id="g-ai0-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:22.6527%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’19
+ </p>
+ </div>
+ <div id="g-ai0-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:30.9281%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai0-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:39.1744%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’21
+ </p>
+ </div>
+ <div id="g-ai0-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:47.4205%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’22
+ </p>
+ </div>
+ <div id="g-ai0-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:55.6667%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’23
+ </p>
+ </div>
+ <div id="g-ai0-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:63.9128%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’24
+ </p>
+ </div>
+ <div id="g-ai0-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:72.1591%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’25
+ </p>
+ </div>
+ <div id="g-ai0-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:80.4054%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’26
+ </p>
+ </div>
+ <div id="g-ai0-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:88.6513%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’27
+ </p>
+ </div>
+ <div id="g-ai0-20" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:96.8975%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’28
+ </p>
+ </div>
+ </div><!-- Artboard: Artboard_3 -->
+ <div id="g-0916-biz-web-DEBT-CHART-1-Artboard_3" class="g-artboard" data-aspect-ratio="0.691" data-min-width="300" data-max-width="599">
+ <img id="g-0916-biz-web-DEBT-CHART-1-Artboard_3-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/interest-on-national-debt/313e919f83bb85b62966d7f70121c5f3f3ea740b/0916-biz-web-DEBT-CHART-1-Artboard_3.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai1-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.2844%;width:243px;">
+ <p class="g-pstyle0">
+ Interest payments on the national debt
+ </p>
+ </div>
+ <div id="g-ai1-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:90.0367%;width:52px;">
+ <p class="g-pstyle1">
+ $900
+ </p>
+ </div>
+ <div id="g-ai1-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:10.6594%;width:55px;">
+ <p class="g-pstyle2">
+ billion
+ </p>
+ </div>
+ <div id="g-ai1-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:17.787%;margin-top:-16.2px;left:90.6989%;margin-left:-30px;width:60px;">
+ <p class="g-pstyle3">
+ $915
+ </p>
+ <p class="g-pstyle3">
+ billion
+ </p>
+ </div>
+ <div id="g-ai1-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:34.841%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 600
+ </p>
+ </div>
+ <div id="g-ai1-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:60.4108%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 300
+ </p>
+ </div>
+ <div id="g-ai1-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:71.2301%;margin-top:-16.2px;left:10.5497%;margin-left:-30px;width:60px;">
+ <p class="g-pstyle3">
+ $263
+ </p>
+ <p class="g-pstyle3">
+ billion
+ </p>
+ </div>
+ <div id="g-ai1-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai1-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:10.8422%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’17
+ </p>
+ </div>
+ <div id="g-ai1-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:18.0987%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ <div id="g-ai1-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:25.3552%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’19
+ </p>
+ </div>
+ <div id="g-ai1-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:32.6703%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai1-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:39.9268%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’21
+ </p>
+ </div>
+ <div id="g-ai1-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:47.1836%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’22
+ </p>
+ </div>
+ <div id="g-ai1-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:54.4401%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’23
+ </p>
+ </div>
+ <div id="g-ai1-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:61.6967%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’24
+ </p>
+ </div>
+ <div id="g-ai1-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:68.9535%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’25
+ </p>
+ </div>
+ <div id="g-ai1-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:76.2102%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’26
+ </p>
+ </div>
+ <div id="g-ai1-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:83.4665%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’27
+ </p>
+ </div>
+ <div id="g-ai1-20" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:90.7234%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’28
+ </p>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function (scriptEnvironment, nameSpace) {
+ // Use a sentinel class to ensure that this version of the resizer only initializes once
+ if (document.documentElement.className.indexOf(nameSpace + "resizer-v5-init") > -1) return;
+ document.documentElement.className += " " + nameSpace + "resizer-v5-init";
+ // requires IE9+
+ if (!("querySelector" in document)) return;
+ var observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;
+ var visibilityIndex = {}; // visibility of each graphic, indexed by container id (used with InteractionObserver)
+
+ updateAllGraphics();
+ window.addEventListener('nyt:embed:load', updateAllGraphics); // for nyt vi compatibility
+ document.addEventListener("DOMContentLoaded", updateAllGraphics);
+ window.addEventListener("resize", throttle(updateAllGraphics, 200));
+
+ function updateAllGraphics() {
+ selectElements(".ai2html-box-v5").forEach(updateGraphic);
+ if (scriptEnvironment == "nyt-preview") {
+ nytOnResize();
+ }
+ }
+
+ function updateGraphic(container) {
+ var artboards = selectElements("." + nameSpace + "artboard[data-min-width]", container),
+ width = Math.round(container.getBoundingClientRect().width),
+ id = container.id, // assume container has an id
+ showImages = !observer || visibilityIndex[id] == 'visible';
+
+ // Set artboard visibility based on container width
+ artboards.forEach(function(el) {
+ var minwidth = el.getAttribute("data-min-width"),
+ maxwidth = el.getAttribute("data-max-width");
+ if (+minwidth <= width && (+maxwidth >= width || maxwidth === null)) {
+ if (showImages) {
+ selectElements("." + nameSpace + "aiImg", el).forEach(updateImgSrc);
+ }
+ el.style.display = "block";
+ } else {
+ el.style.display = "none";
+ }
+ });
+
+ // Initialize lazy loading on first call, if IntersectionObserver is available
+ if (observer && !visibilityIndex[id]) {
+ if (containerIsVisible(container)) {
+ // Skip IntersectionObserver if graphic is initially visible
+ // Note: We're doing this after artboard visibility is first calculated
+ // (above) -- otherwise all artboard images are display:block and the
+ // calculated height of the graphic is huge.
+ // TODO: Consider making artboard images position:absolute and setting
+ // height as a padding % (calculated from the aspect ratio of the graphic).
+ // This will correctly set the initial height of the graphic before
+ // an image is loaded.
+ visibilityIndex[id] = 'visible';
+ updateGraphic(container); // Call again to start loading right away
+ } else {
+ visibilityIndex[id] = 'hidden';
+ observer.observe(container);
+ }
+ }
+ }
+
+ function containerIsVisible(container) {
+ var bounds = container.getBoundingClientRect();
+ return bounds.top < window.innerHeight && bounds.bottom > 0;
+ }
+
+ // Replace blank placeholder image with actual image
+ // (only relevant if use_lazy_loader option is true)
+ function updateImgSrc(img) {
+ var src = img.getAttribute("data-src");
+ if (src && img.getAttribute("src") != src) {
+ img.setAttribute("src", src);
+ }
+ }
+
+ function onIntersectionChange(entries) {
+ entries.forEach(function(entry) {
+ if (entry.isIntersecting) {
+ visibilityIndex[entry.target.id] = 'visible';
+ observer.unobserve(entry.target);
+ updateGraphic(entry.target);
+ }
+ });
+ }
+
+ function selectElements(selector, parent) {
+ var selection = (parent || document).querySelectorAll(selector);
+ return Array.prototype.slice.call(selection);
+ }
+
+ function nytOnResize() {
+ // TODO: add comments
+ try {
+ if (window.parent && window.parent.$) {
+ window.parent.$("body").trigger("resizedcontent", [window]);
+ }
+ document.documentElement.dispatchEvent(new Event("resizedcontent"));
+ if (window.require && document.querySelector("meta[name=sourceApp]") && document.querySelector("meta[name=sourceApp]").content == "nyt-v5") {
+ require(["foundation/main"], function() {
+ require(["shared/interactive/instances/app-communicator"], function(AppCommunicator) {
+ AppCommunicator.triggerResize();
+ });
+ });
+ }
+ } catch(e) { console.log(e); }
+ }
+
+ // based on underscore.js
+ function throttle(func, wait) {
+ var _now = Date.now || function() { return +new Date(); },
+ timeout = null, previous = 0;
+ var run = function() {
+ previous = _now();
+ timeout = null;
+ func();
+ };
+ return function() {
+ var remaining = wait - (_now() - previous);
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ run();
+ } else if (!timeout) {
+ timeout = setTimeout(run, remaining);
+ }
+ };
+ }
+ })("nyt-preview", "g-");
+ //]]>
+ </script> <!-- End ai2html - 2018-09-14 15:18 -->
+ <!-- Pipeline: 2018-09-14-interest-on-national-debt | September 14, 2018, 03:20PM | 313e919f83bb85b62966d7f70121c5f3f3ea740b -->
+ </div>
+ <footer class="css-irejme interactive-footer custom-footer">
+ <p data-testid="credit" class="css-1ct2c9h interactive-credit custom-credit">
+ By The New York Times | Source: Congressional Budget Office
+ </p>
+ </footer>
+ </section>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Deficit hawks have gone silent, even proposing changes that would exacerbate the deficit. House Republicans introduced legislation this month that would make the tax cuts permanent.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “The issue has just disappeared,” said Senator Mark Warner, a Virginia Democrat. “There’s collective amnesia.”
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ The combination, say economists, marks a journey into mostly uncharted financial territory.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ In the past, government borrowing expanded during recessions and waned in recoveries. That countercyclical policy has been a part of the standard Keynesian toolbox to combat downturns since the Great Depression.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The deficit is soaring now as the economy booms, meaning the stimulus is pro-cyclical. The risk is that the government would have less room to maneuver if the economy slows.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-13nfagi">
+ <section id="debt-as-a-share-of-gdp" data-id="100000006106750" class="interactive-embedded interactive-size-scoop custom-graphic-container css-rlzall e13l8dds1">
+ <header class="css-cl76n0 interactive-header">
+ <p data-testid="leadin" class="css-1vs7yia interactive-leadin custom-leadin">
+ Debt as a percentage of gross domestic product tends to increase during recessions and fall during recoveries. But the debt is increasing now, even as the economy is growing, because of tax cuts and spending increases.
+ </p>
+ </header>
+ <div class="interactive-graphic custom-graphic css-17ih8de e13l8dds0">
+ <!-- Generated by ai2html v0.74.0 - 2018-09-14 13:34 -->
+ <!-- ai file: 0916 biz web DEBT CHART 2.ai -->
+ <!-- preview: 2018-09-14-debt-as-a-share-of-gdp -->
+ <div id="g-0916-biz-web-DEBT-CHART-2-box" class="ai2html ai2html-box-v5">
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-0916-biz-web-DEBT-CHART-2-Artboard_2" class="g-artboard" data-aspect-ratio="1.382" data-min-width="600">
+ <img id="g-0916-biz-web-DEBT-CHART-2-Artboard_2-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/debt-as-a-share-of-gdp/dad2c5186b9c0b968d766fa279d9ed6b76ce776b/0916-biz-web-DEBT-CHART-2-Artboard_2.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai0-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.0838%;width:299px;">
+ <p class="g-pstyle0">
+ Public debt as a share of gross domestic product
+ </p>
+ </div>
+ <div id="g-ai0-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle1">
+ 100
+ </p>
+ </div>
+ <div id="g-ai0-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai0-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:16.8643%;margin-top:-9.2px;left:23.0468%;margin-left:-42.5px;width:85px;">
+ <p class="g-pstyle3">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai0-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:16.8643%;margin-top:-9.2px;left:78.0253%;width:79px;">
+ <p class="g-pstyle4">
+ PROJECTED
+ </p>
+ </div>
+ <div id="g-ai0-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:24.7052%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 80
+ </p>
+ </div>
+ <div id="g-ai0-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:39.9089%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 60
+ </p>
+ </div>
+ <div id="g-ai0-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:55.3429%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 40
+ </p>
+ </div>
+ <div id="g-ai0-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:70.5466%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 20
+ </p>
+ </div>
+ <div id="g-ai0-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai0-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:8.5381%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’78
+ </p>
+ </div>
+ <div id="g-ai0-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:12.2413%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’80
+ </p>
+ </div>
+ <div id="g-ai0-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:29.7156%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’90
+ </p>
+ </div>
+ <div id="g-ai0-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:47.1898%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’00
+ </p>
+ </div>
+ <div id="g-ai0-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:64.635%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle5">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai0-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:82.1384%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai0-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:96.0294%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle5">
+ ’28
+ </p>
+ </div>
+ </div><!-- Artboard: Artboard_3 -->
+ <div id="g-0916-biz-web-DEBT-CHART-2-Artboard_3" class="g-artboard" data-aspect-ratio="0.691" data-min-width="300" data-max-width="599">
+ <img id="g-0916-biz-web-DEBT-CHART-2-Artboard_3-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/debt-as-a-share-of-gdp/dad2c5186b9c0b968d766fa279d9ed6b76ce776b/0916-biz-web-DEBT-CHART-2-Artboard_3.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai1-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.2844%;width:299px;">
+ <p class="g-pstyle0">
+ Public debt as a share of gross domestic product
+ </p>
+ </div>
+ <div id="g-ai1-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 100
+ </p>
+ </div>
+ <div id="g-ai1-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai1-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:24.7052%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 80
+ </p>
+ </div>
+ <div id="g-ai1-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:39.9089%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 60
+ </p>
+ </div>
+ <div id="g-ai1-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:55.3429%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 40
+ </p>
+ </div>
+ <div id="g-ai1-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:70.5465%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 20
+ </p>
+ </div>
+ <div id="g-ai1-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:80.4432%;margin-top:-9.2px;left:22.2287%;width:85px;">
+ <p class="g-pstyle3">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai1-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:80.4432%;margin-top:-9.2px;left:74.1042%;width:79px;">
+ <p class="g-pstyle3">
+ PROJECTED
+ </p>
+ </div>
+ <div id="g-ai1-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai1-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:16.2259%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’80
+ </p>
+ </div>
+ <div id="g-ai1-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:31.6032%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’90
+ </p>
+ </div>
+ <div id="g-ai1-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:46.9805%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’00
+ </p>
+ </div>
+ <div id="g-ai1-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:62.2997%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai1-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:77.7354%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai1-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:89.9593%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’28
+ </p>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function (scriptEnvironment, nameSpace) {
+ // Use a sentinel class to ensure that this version of the resizer only initializes once
+ if (document.documentElement.className.indexOf(nameSpace + "resizer-v5-init") > -1) return;
+ document.documentElement.className += " " + nameSpace + "resizer-v5-init";
+ // requires IE9+
+ if (!("querySelector" in document)) return;
+ var observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;
+ var visibilityIndex = {}; // visibility of each graphic, indexed by container id (used with InteractionObserver)
+
+ updateAllGraphics();
+ window.addEventListener('nyt:embed:load', updateAllGraphics); // for nyt vi compatibility
+ document.addEventListener("DOMContentLoaded", updateAllGraphics);
+ window.addEventListener("resize", throttle(updateAllGraphics, 200));
+
+ function updateAllGraphics() {
+ selectElements(".ai2html-box-v5").forEach(updateGraphic);
+ if (scriptEnvironment == "nyt-preview") {
+ nytOnResize();
+ }
+ }
+
+ function updateGraphic(container) {
+ var artboards = selectElements("." + nameSpace + "artboard[data-min-width]", container),
+ width = Math.round(container.getBoundingClientRect().width),
+ id = container.id, // assume container has an id
+ showImages = !observer || visibilityIndex[id] == 'visible';
+
+ // Set artboard visibility based on container width
+ artboards.forEach(function(el) {
+ var minwidth = el.getAttribute("data-min-width"),
+ maxwidth = el.getAttribute("data-max-width");
+ if (+minwidth <= width && (+maxwidth >= width || maxwidth === null)) {
+ if (showImages) {
+ selectElements("." + nameSpace + "aiImg", el).forEach(updateImgSrc);
+ }
+ el.style.display = "block";
+ } else {
+ el.style.display = "none";
+ }
+ });
+
+ // Initialize lazy loading on first call, if IntersectionObserver is available
+ if (observer && !visibilityIndex[id]) {
+ if (containerIsVisible(container)) {
+ // Skip IntersectionObserver if graphic is initially visible
+ // Note: We're doing this after artboard visibility is first calculated
+ // (above) -- otherwise all artboard images are display:block and the
+ // calculated height of the graphic is huge.
+ // TODO: Consider making artboard images position:absolute and setting
+ // height as a padding % (calculated from the aspect ratio of the graphic).
+ // This will correctly set the initial height of the graphic before
+ // an image is loaded.
+ visibilityIndex[id] = 'visible';
+ updateGraphic(container); // Call again to start loading right away
+ } else {
+ visibilityIndex[id] = 'hidden';
+ observer.observe(container);
+ }
+ }
+ }
+
+ function containerIsVisible(container) {
+ var bounds = container.getBoundingClientRect();
+ return bounds.top < window.innerHeight && bounds.bottom > 0;
+ }
+
+ // Replace blank placeholder image with actual image
+ // (only relevant if use_lazy_loader option is true)
+ function updateImgSrc(img) {
+ var src = img.getAttribute("data-src");
+ if (src && img.getAttribute("src") != src) {
+ img.setAttribute("src", src);
+ }
+ }
+
+ function onIntersectionChange(entries) {
+ entries.forEach(function(entry) {
+ if (entry.isIntersecting) {
+ visibilityIndex[entry.target.id] = 'visible';
+ observer.unobserve(entry.target);
+ updateGraphic(entry.target);
+ }
+ });
+ }
+
+ function selectElements(selector, parent) {
+ var selection = (parent || document).querySelectorAll(selector);
+ return Array.prototype.slice.call(selection);
+ }
+
+ function nytOnResize() {
+ // TODO: add comments
+ try {
+ if (window.parent && window.parent.$) {
+ window.parent.$("body").trigger("resizedcontent", [window]);
+ }
+ document.documentElement.dispatchEvent(new Event("resizedcontent"));
+ if (window.require && document.querySelector("meta[name=sourceApp]") && document.querySelector("meta[name=sourceApp]").content == "nyt-v5") {
+ require(["foundation/main"], function() {
+ require(["shared/interactive/instances/app-communicator"], function(AppCommunicator) {
+ AppCommunicator.triggerResize();
+ });
+ });
+ }
+ } catch(e) { console.log(e); }
+ }
+
+ // based on underscore.js
+ function throttle(func, wait) {
+ var _now = Date.now || function() { return +new Date(); },
+ timeout = null, previous = 0;
+ var run = function() {
+ previous = _now();
+ timeout = null;
+ func();
+ };
+ return function() {
+ var remaining = wait - (_now() - previous);
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ run();
+ } else if (!timeout) {
+ timeout = setTimeout(run, remaining);
+ }
+ };
+ }
+ })("nyt-preview", "g-");
+ //]]>
+ </script> <!-- End ai2html - 2018-09-14 13:34 -->
+ <!-- Pipeline: 2018-09-14-debt-as-a-share-of-gdp | September 14, 2018, 01:34PM | dad2c5186b9c0b968d766fa279d9ed6b76ce776b -->
+ </div>
+ <footer class="css-irejme interactive-footer custom-footer">
+ <p data-testid="credit" class="css-1ct2c9h interactive-credit custom-credit">
+ By The New York Times | Source: Congressional Budget Office
+ </p>
+ </footer>
+ </section>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Aside from wartime or a deep downturn like the 1930s or 2008-9, “this sort of aggressive fiscal stimulus is unprecedented in U.S. history,” said Jeffrey Frankel, an economist at Harvard.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Pouring gasoline on an already hot economy has resulted in faster growth — the economy expanded at an annualized rate of 4.2 percent in the second quarter. But Mr. Frankel warns that when the economy weakens, the government will find it more difficult to cut taxes or increase spending.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Lawmakers might, in fact, feel compelled to cut spending as tax revenue falls, further depressing the economy. “There will eventually be another recession, and this increases the chances we will have to slam on the brakes when the car is already going too slowly,” Mr. Frankel said.
+ </p>
+ <h2 class="css-1505tg eoo0vm40" id="link-cb5ee12">
+ Interest costs make it harder for the government to do other things
+ </h2>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-13nfagi">
+ <section id="expenditures-as-a-share-of-national-budget" data-id="100000006106770" class="interactive-embedded interactive-size-scoop custom-graphic-container css-rlzall e13l8dds1">
+ <header class="css-cl76n0 interactive-header">
+ <p data-testid="leadin" class="css-1vs7yia interactive-leadin custom-leadin">
+ Interest payments will make up 13 percent of the federal budget a decade from now, surpassing spending on Medicaid and defense.
+ </p>
+ </header>
+ <div class="interactive-graphic custom-graphic css-17ih8de e13l8dds0">
+ <!-- Generated by ai2html v0.74.0 - 2018-09-14 14:03 -->
+ <!-- ai file: 0916 biz web DEBT CHART 3.ai -->
+ <!-- preview: 2018-09-14-expenditures-as-a-share-of-national-budget -->
+ <!-- scoop: expenditures-as-a-share-of-national-budget -->
+ <div id="g-0916-biz-web-DEBT-CHART-3-box" class="ai2html ai2html-box-v5">
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-0916-biz-web-DEBT-CHART-3-Artboard_2" class="g-artboard" data-aspect-ratio="1.382" data-min-width="600">
+ <img id="g-0916-biz-web-DEBT-CHART-3-Artboard_2-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/expenditures-as-a-share-of-national-budget/3311a2358867f7423b4d30b424829c1ff1228a7a/0916-biz-web-DEBT-CHART-3-Artboard_2.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai0-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.0838%;width:258px;">
+ <p class="g-pstyle0">
+ Expenditures as a share of overall budget
+ </p>
+ </div>
+ <div id="g-ai0-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 15
+ </p>
+ </div>
+ <div id="g-ai0-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai0-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:17.5566%;margin-top:-9.2px;left:81.708%;width:90px;">
+ <p class="g-pstyle0">
+ Net interest
+ </p>
+ </div>
+ <div id="g-ai0-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:17.5566%;margin-top:-9.2px;left:96.8984%;margin-left:-29.5px;width:59px;">
+ <p class="g-pstyle3">
+ 13.0%
+ </p>
+ </div>
+ <div id="g-ai0-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:33.6891%;margin-top:-9.2px;left:81.708%;width:67px;">
+ <p class="g-pstyle2">
+ Defense
+ </p>
+ </div>
+ <div id="g-ai0-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:34.841%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 10
+ </p>
+ </div>
+ <div id="g-ai0-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:43.825%;margin-top:-9.2px;left:81.708%;width:72px;">
+ <p class="g-pstyle2">
+ Medicaid
+ </p>
+ </div>
+ <div id="g-ai0-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:50.0371%;margin-top:-9.2px;left:6.8178%;margin-left:-26px;width:52px;">
+ <p class="g-pstyle3">
+ 6.6%
+ </p>
+ </div>
+ <div id="g-ai0-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:60.4108%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 5
+ </p>
+ </div>
+ <div id="g-ai0-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai0-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:6.0116%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’17
+ </p>
+ </div>
+ <div id="g-ai0-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:14.2578%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ <div id="g-ai0-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:22.5039%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’19
+ </p>
+ </div>
+ <div id="g-ai0-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:30.7793%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai0-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:39.0255%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’21
+ </p>
+ </div>
+ <div id="g-ai0-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:47.2716%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’22
+ </p>
+ </div>
+ <div id="g-ai0-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:55.5179%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’23
+ </p>
+ </div>
+ <div id="g-ai0-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:63.764%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’24
+ </p>
+ </div>
+ <div id="g-ai0-20" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:72.0103%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’25
+ </p>
+ </div>
+ <div id="g-ai0-21" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:80.2565%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’26
+ </p>
+ </div>
+ <div id="g-ai0-22" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:88.5024%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’27
+ </p>
+ </div>
+ <div id="g-ai0-23" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:96.7487%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’28
+ </p>
+ </div>
+ </div><!-- Artboard: Artboard_3 -->
+ <div id="g-0916-biz-web-DEBT-CHART-3-Artboard_3" class="g-artboard" data-aspect-ratio="0.691" data-min-width="300" data-max-width="599">
+ <img id="g-0916-biz-web-DEBT-CHART-3-Artboard_3-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/expenditures-as-a-share-of-national-budget/3311a2358867f7423b4d30b424829c1ff1228a7a/0916-biz-web-DEBT-CHART-3-Artboard_3.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai1-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.2844%;width:258px;">
+ <p class="g-pstyle0">
+ Expenditures as a share of overall budget
+ </p>
+ </div>
+ <div id="g-ai1-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 15
+ </p>
+ </div>
+ <div id="g-ai1-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai1-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:17.5566%;margin-top:-9.2px;right:13.9762%;width:90px;">
+ <p class="g-pstyle3">
+ Net interest
+ </p>
+ </div>
+ <div id="g-ai1-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:17.5566%;margin-top:-9.2px;left:87.5494%;width:59px;">
+ <p class="g-pstyle0">
+ 13.0%
+ </p>
+ </div>
+ <div id="g-ai1-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:33.6892%;margin-top:-9.2px;right:14.1158%;width:67px;">
+ <p class="g-pstyle1">
+ Defense
+ </p>
+ </div>
+ <div id="g-ai1-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:34.841%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 10
+ </p>
+ </div>
+ <div id="g-ai1-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:44.2857%;margin-top:-9.2px;right:14.0525%;width:72px;">
+ <p class="g-pstyle1">
+ Medicaid
+ </p>
+ </div>
+ <div id="g-ai1-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:56.0265%;margin-top:-9.2px;left:13.3422%;width:52px;">
+ <p class="g-pstyle0">
+ 6.6%
+ </p>
+ </div>
+ <div id="g-ai1-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:60.4108%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 5
+ </p>
+ </div>
+ <div id="g-ai1-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai1-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:10.7111%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’17
+ </p>
+ </div>
+ <div id="g-ai1-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:17.9678%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ <div id="g-ai1-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:25.2243%;margin-left:-19.5px;width:39px;">
+ <p class="g-pstyle4">
+ ’19
+ </p>
+ </div>
+ <div id="g-ai1-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:32.5394%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’20
+ </p>
+ </div>
+ <div id="g-ai1-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:39.7959%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’21
+ </p>
+ </div>
+ <div id="g-ai1-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:47.0526%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’22
+ </p>
+ </div>
+ <div id="g-ai1-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:54.3093%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’23
+ </p>
+ </div>
+ <div id="g-ai1-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:61.5658%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’24
+ </p>
+ </div>
+ <div id="g-ai1-20" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:68.8225%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’25
+ </p>
+ </div>
+ <div id="g-ai1-21" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:76.0791%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’26
+ </p>
+ </div>
+ <div id="g-ai1-22" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:83.3357%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’27
+ </p>
+ </div>
+ <div id="g-ai1-23" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.9699%;margin-top:-9.2px;left:90.5923%;margin-left:-20px;width:40px;">
+ <p class="g-pstyle4">
+ ’28
+ </p>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function (scriptEnvironment, nameSpace) {
+ // Use a sentinel class to ensure that this version of the resizer only initializes once
+ if (document.documentElement.className.indexOf(nameSpace + "resizer-v5-init") > -1) return;
+ document.documentElement.className += " " + nameSpace + "resizer-v5-init";
+ // requires IE9+
+ if (!("querySelector" in document)) return;
+ var observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;
+ var visibilityIndex = {}; // visibility of each graphic, indexed by container id (used with InteractionObserver)
+
+ updateAllGraphics();
+ window.addEventListener('nyt:embed:load', updateAllGraphics); // for nyt vi compatibility
+ document.addEventListener("DOMContentLoaded", updateAllGraphics);
+ window.addEventListener("resize", throttle(updateAllGraphics, 200));
+
+ function updateAllGraphics() {
+ selectElements(".ai2html-box-v5").forEach(updateGraphic);
+ if (scriptEnvironment == "nyt-preview") {
+ nytOnResize();
+ }
+ }
+
+ function updateGraphic(container) {
+ var artboards = selectElements("." + nameSpace + "artboard[data-min-width]", container),
+ width = Math.round(container.getBoundingClientRect().width),
+ id = container.id, // assume container has an id
+ showImages = !observer || visibilityIndex[id] == 'visible';
+
+ // Set artboard visibility based on container width
+ artboards.forEach(function(el) {
+ var minwidth = el.getAttribute("data-min-width"),
+ maxwidth = el.getAttribute("data-max-width");
+ if (+minwidth <= width && (+maxwidth >= width || maxwidth === null)) {
+ if (showImages) {
+ selectElements("." + nameSpace + "aiImg", el).forEach(updateImgSrc);
+ }
+ el.style.display = "block";
+ } else {
+ el.style.display = "none";
+ }
+ });
+
+ // Initialize lazy loading on first call, if IntersectionObserver is available
+ if (observer && !visibilityIndex[id]) {
+ if (containerIsVisible(container)) {
+ // Skip IntersectionObserver if graphic is initially visible
+ // Note: We're doing this after artboard visibility is first calculated
+ // (above) -- otherwise all artboard images are display:block and the
+ // calculated height of the graphic is huge.
+ // TODO: Consider making artboard images position:absolute and setting
+ // height as a padding % (calculated from the aspect ratio of the graphic).
+ // This will correctly set the initial height of the graphic before
+ // an image is loaded.
+ visibilityIndex[id] = 'visible';
+ updateGraphic(container); // Call again to start loading right away
+ } else {
+ visibilityIndex[id] = 'hidden';
+ observer.observe(container);
+ }
+ }
+ }
+
+ function containerIsVisible(container) {
+ var bounds = container.getBoundingClientRect();
+ return bounds.top < window.innerHeight && bounds.bottom > 0;
+ }
+
+ // Replace blank placeholder image with actual image
+ // (only relevant if use_lazy_loader option is true)
+ function updateImgSrc(img) {
+ var src = img.getAttribute("data-src");
+ if (src && img.getAttribute("src") != src) {
+ img.setAttribute("src", src);
+ }
+ }
+
+ function onIntersectionChange(entries) {
+ entries.forEach(function(entry) {
+ if (entry.isIntersecting) {
+ visibilityIndex[entry.target.id] = 'visible';
+ observer.unobserve(entry.target);
+ updateGraphic(entry.target);
+ }
+ });
+ }
+
+ function selectElements(selector, parent) {
+ var selection = (parent || document).querySelectorAll(selector);
+ return Array.prototype.slice.call(selection);
+ }
+
+ function nytOnResize() {
+ // TODO: add comments
+ try {
+ if (window.parent && window.parent.$) {
+ window.parent.$("body").trigger("resizedcontent", [window]);
+ }
+ document.documentElement.dispatchEvent(new Event("resizedcontent"));
+ if (window.require && document.querySelector("meta[name=sourceApp]") && document.querySelector("meta[name=sourceApp]").content == "nyt-v5") {
+ require(["foundation/main"], function() {
+ require(["shared/interactive/instances/app-communicator"], function(AppCommunicator) {
+ AppCommunicator.triggerResize();
+ });
+ });
+ }
+ } catch(e) { console.log(e); }
+ }
+
+ // based on underscore.js
+ function throttle(func, wait) {
+ var _now = Date.now || function() { return +new Date(); },
+ timeout = null, previous = 0;
+ var run = function() {
+ previous = _now();
+ timeout = null;
+ func();
+ };
+ return function() {
+ var remaining = wait - (_now() - previous);
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ run();
+ } else if (!timeout) {
+ timeout = setTimeout(run, remaining);
+ }
+ };
+ }
+ })("nyt-preview", "g-");
+ //]]>
+ </script> <!-- End ai2html - 2018-09-14 14:03 -->
+ <!-- Pipeline: 2018-09-14-expenditures-as-a-share-of-national-budget | September 14, 2018, 02:04PM | 3311a2358867f7423b4d30b424829c1ff1228a7a -->
+ </div>
+ <footer class="css-irejme interactive-footer custom-footer">
+ <p data-testid="credit" class="css-1ct2c9h interactive-credit custom-credit">
+ By The New York Times | Source: Congressional Budget Office
+ </p>
+ </footer>
+ </section>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Finding the money to pay investors who hold government debt will crimp other parts of the budget. In a decade, interest on the debt will eat up 13 percent of government spending, up from 6.6 percent in 2017.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “By 2020, we will spend more on interest than we do on kids, including education, food stamps and aid to families,” said Marc Goldwein, senior policy director at the Committee for a Responsible Federal Budget, a research and advocacy organization.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Interest costs already dwarf spending on many popular programs. For example, grants to students from low-income families for college total roughly $30 billion — about one-tenth of what the government will pay in interest this year. Interest payments will overtake Medicaid in 2020 and the Department of Defense budget in 2023.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ What’s more, the heavy burden of interest payments could make it harder for the government to repair aging infrastructure or take on other big new projects.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Mr. Trump has called for spending $1 trillion on infrastructure, but Congress has not taken up that idea.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-tmydge epkadsg3">
+ <div class="css-1ukm2ij epkadsg0">
+ More about the federal debt and the economy
+ </div>
+ <div class="css-15g2oxy epkadsg2">
+ <div class="css-113dckd e16ij5yr6">
+ <a class="css-1g7m0tk" href="https://www.nytimes.com/2018/07/30/us/politics/trump-tax-cuts-rich.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article">
+ <div class="css-i9gxme e16ij5yr4">
+ <div class="css-ty8is0 e16ij5yr2">
+ Trump Administration Mulls a Unilateral Tax Cut for the Rich
+ </div><time class="css-1yil5bp e16638kd0" datetime="2018-07-30">July 30, 2018</time>
+ </div>
+ <div class="css-77hcv e16ij5yr0"></div></a>
+ </div>
+ <div class="css-113dckd e16ij5yr6">
+ <a class="css-1g7m0tk" href="https://www.nytimes.com/2018/07/25/business/trump-corporate-tax-cut-deficit.html?action=click&amp;module=RelatedLinks&amp;pgtype=Article">
+ <div class="css-i9gxme e16ij5yr4">
+ <div class="css-ty8is0 e16ij5yr2">
+ How the Trump Tax Cut Is Helping to Push the Federal Deficit to $1 Trillion
+ </div><time class="css-1yil5bp e16638kd0" datetime="2018-07-25">July 25, 2018</time>
+ </div>
+ <div class="css-77hcv e16ij5yr0"></div></a>
+ </div>
+ </div>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <h2 class="css-1505tg eoo0vm40" id="link-1a1f1f7a">
+ The U.S. hasn’t faced this issue for years
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Until recently, ultralow interest rates, set by the Federal Reserve to support the economy, allowed lawmakers to borrow without fretting too much about the cost of that debt.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ But as the economy has strengthened, the Fed has gradually raised rates, starting in December 2015. The central bank is expected to push rates up again on Wednesday, and more increases are in store.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “When rates went down to record lows, it allowed the government to take on more debt without paying more interest,” Mr. Goldwein said. “That party is ending.”
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-13nfagi">
+ <section id="10-year-treasury-note" data-id="100000006106857" class="interactive-embedded interactive-size-scoop custom-graphic-container css-rlzall e13l8dds1">
+ <header class="css-cl76n0 interactive-header">
+ <p data-testid="leadin" class="css-1vs7yia interactive-leadin custom-leadin">
+ After bottoming out below 2 percent, the yield on the 10-year Treasury note has climbed to over 3 percent recently.
+ </p>
+ </header>
+ <div class="interactive-graphic custom-graphic css-17ih8de e13l8dds0">
+ <!-- Generated by ai2html v0.74.0 - 2018-09-25 16:50 -->
+ <!-- ai file: 0916 biz web DEBT CHART 5.ai -->
+ <!-- preview: 2018-09-14-10-year-treasury-note -->
+ <!-- scoop: 10-year-treasury-note -->
+ <div id="g-0916-biz-web-DEBT-CHART-5-box" class="ai2html ai2html-box-v5">
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-0916-biz-web-DEBT-CHART-5-Artboard_2" class="g-artboard" data-aspect-ratio="1.382" data-min-width="600">
+ <img id="g-0916-biz-web-DEBT-CHART-5-Artboard_2-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/10-year-treasury-note/e6a342acf0db9b8a88e9ae36f0db5438e5e5124f/0916-biz-web-DEBT-CHART-5-Artboard_2.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai0-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.0644%;width:196px;">
+ <p class="g-pstyle0">
+ Yield on 10-year Treasury note
+ </p>
+ </div>
+ <div id="g-ai0-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 8
+ </p>
+ </div>
+ <div id="g-ai0-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai0-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.7232%;margin-top:-9.2px;right:0.1584%;width:70px;">
+ <p class="g-pstyle3">
+ MONTHLY
+ </p>
+ </div>
+ <div id="g-ai0-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:21.2411%;margin-top:-9.2px;left:37.9228%;margin-left:-42.5px;width:85px;">
+ <p class="g-pstyle4">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai0-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:28.6213%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 6
+ </p>
+ </div>
+ <div id="g-ai0-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:47.5106%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 4
+ </p>
+ </div>
+ <div id="g-ai0-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:66.6304%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 2
+ </p>
+ </div>
+ <div id="g-ai0-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai0-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:7.6353%;width:40px;">
+ <p class="g-pstyle2">
+ ’98
+ </p>
+ </div>
+ <div id="g-ai0-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:16.3776%;width:40px;">
+ <p class="g-pstyle2">
+ ’00
+ </p>
+ </div>
+ <div id="g-ai0-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:25.1199%;width:40px;">
+ <p class="g-pstyle2">
+ ’02
+ </p>
+ </div>
+ <div id="g-ai0-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:33.8621%;width:40px;">
+ <p class="g-pstyle2">
+ ’04
+ </p>
+ </div>
+ <div id="g-ai0-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:42.6044%;width:40px;">
+ <p class="g-pstyle2">
+ ’06
+ </p>
+ </div>
+ <div id="g-ai0-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:51.3468%;width:40px;">
+ <p class="g-pstyle2">
+ ’08
+ </p>
+ </div>
+ <div id="g-ai0-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:60.0889%;width:39px;">
+ <p class="g-pstyle2">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai0-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:68.8313%;width:39px;">
+ <p class="g-pstyle2">
+ ’12
+ </p>
+ </div>
+ <div id="g-ai0-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:77.5735%;width:39px;">
+ <p class="g-pstyle2">
+ ’14
+ </p>
+ </div>
+ <div id="g-ai0-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:86.3158%;width:39px;">
+ <p class="g-pstyle2">
+ ’16
+ </p>
+ </div>
+ <div id="g-ai0-20" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:95.058%;width:39px;">
+ <p class="g-pstyle2">
+ ’18
+ </p>
+ </div>
+ </div><!-- Artboard: Artboard_3 -->
+ <div id="g-0916-biz-web-DEBT-CHART-5-Artboard_3" class="g-artboard" data-aspect-ratio="0.691" data-min-width="300" data-max-width="599">
+ <img id="g-0916-biz-web-DEBT-CHART-5-Artboard_3-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/10-year-treasury-note/e6a342acf0db9b8a88e9ae36f0db5438e5e5124f/0916-biz-web-DEBT-CHART-5-Artboard_3.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai1-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.2844%;width:196px;">
+ <p class="g-pstyle0">
+ Yield on 10-year Treasury note
+ </p>
+ </div>
+ <div id="g-ai1-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 8
+ </p>
+ </div>
+ <div id="g-ai1-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;">
+ <p class="g-pstyle2">
+ %
+ </p>
+ </div>
+ <div id="g-ai1-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.7232%;margin-top:-9.2px;right:6.6448%;width:70px;">
+ <p class="g-pstyle3">
+ MONTHLY
+ </p>
+ </div>
+ <div id="g-ai1-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:21.2411%;margin-top:-9.2px;left:38.8379%;margin-left:-42.5px;width:85px;">
+ <p class="g-pstyle4">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai1-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:28.6214%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 6
+ </p>
+ </div>
+ <div id="g-ai1-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:47.5107%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 4
+ </p>
+ </div>
+ <div id="g-ai1-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:66.6305%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 2
+ </p>
+ </div>
+ <div id="g-ai1-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;">
+ <p class="g-pstyle1">
+ 0
+ </p>
+ </div>
+ <div id="g-ai1-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:12.306%;width:40px;">
+ <p class="g-pstyle2">
+ ’98
+ </p>
+ </div>
+ <div id="g-ai1-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:27.6924%;width:40px;">
+ <p class="g-pstyle2">
+ ’02
+ </p>
+ </div>
+ <div id="g-ai1-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:43.0788%;width:40px;">
+ <p class="g-pstyle2">
+ ’06
+ </p>
+ </div>
+ <div id="g-ai1-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:58.4652%;width:39px;">
+ <p class="g-pstyle2">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai1-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:73.8516%;width:39px;">
+ <p class="g-pstyle2">
+ ’14
+ </p>
+ </div>
+ <div id="g-ai1-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:89.238%;width:39px;">
+ <p class="g-pstyle2">
+ ’18
+ </p>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function (scriptEnvironment, nameSpace) {
+ // Use a sentinel class to ensure that this version of the resizer only initializes once
+ if (document.documentElement.className.indexOf(nameSpace + "resizer-v5-init") > -1) return;
+ document.documentElement.className += " " + nameSpace + "resizer-v5-init";
+ // requires IE9+
+ if (!("querySelector" in document)) return;
+ var observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;
+ var visibilityIndex = {}; // visibility of each graphic, indexed by container id (used with InteractionObserver)
+
+ updateAllGraphics();
+ window.addEventListener('nyt:embed:load', updateAllGraphics); // for nyt vi compatibility
+ document.addEventListener("DOMContentLoaded", updateAllGraphics);
+ window.addEventListener("resize", throttle(updateAllGraphics, 200));
+
+ function updateAllGraphics() {
+ selectElements(".ai2html-box-v5").forEach(updateGraphic);
+ if (scriptEnvironment == "nyt-preview") {
+ nytOnResize();
+ }
+ }
+
+ function updateGraphic(container) {
+ var artboards = selectElements("." + nameSpace + "artboard[data-min-width]", container),
+ width = Math.round(container.getBoundingClientRect().width),
+ id = container.id, // assume container has an id
+ showImages = !observer || visibilityIndex[id] == 'visible';
+
+ // Set artboard visibility based on container width
+ artboards.forEach(function(el) {
+ var minwidth = el.getAttribute("data-min-width"),
+ maxwidth = el.getAttribute("data-max-width");
+ if (+minwidth <= width && (+maxwidth >= width || maxwidth === null)) {
+ if (showImages) {
+ selectElements("." + nameSpace + "aiImg", el).forEach(updateImgSrc);
+ }
+ el.style.display = "block";
+ } else {
+ el.style.display = "none";
+ }
+ });
+
+ // Initialize lazy loading on first call, if IntersectionObserver is available
+ if (observer && !visibilityIndex[id]) {
+ if (containerIsVisible(container)) {
+ // Skip IntersectionObserver if graphic is initially visible
+ // Note: We're doing this after artboard visibility is first calculated
+ // (above) -- otherwise all artboard images are display:block and the
+ // calculated height of the graphic is huge.
+ // TODO: Consider making artboard images position:absolute and setting
+ // height as a padding % (calculated from the aspect ratio of the graphic).
+ // This will correctly set the initial height of the graphic before
+ // an image is loaded.
+ visibilityIndex[id] = 'visible';
+ updateGraphic(container); // Call again to start loading right away
+ } else {
+ visibilityIndex[id] = 'hidden';
+ observer.observe(container);
+ }
+ }
+ }
+
+ function containerIsVisible(container) {
+ var bounds = container.getBoundingClientRect();
+ return bounds.top < window.innerHeight && bounds.bottom > 0;
+ }
+
+ // Replace blank placeholder image with actual image
+ // (only relevant if use_lazy_loader option is true)
+ function updateImgSrc(img) {
+ var src = img.getAttribute("data-src");
+ if (src && img.getAttribute("src") != src) {
+ img.setAttribute("src", src);
+ }
+ }
+
+ function onIntersectionChange(entries) {
+ entries.forEach(function(entry) {
+ if (entry.isIntersecting) {
+ visibilityIndex[entry.target.id] = 'visible';
+ observer.unobserve(entry.target);
+ updateGraphic(entry.target);
+ }
+ });
+ }
+
+ function selectElements(selector, parent) {
+ var selection = (parent || document).querySelectorAll(selector);
+ return Array.prototype.slice.call(selection);
+ }
+
+ function nytOnResize() {
+ // TODO: add comments
+ try {
+ if (window.parent && window.parent.$) {
+ window.parent.$("body").trigger("resizedcontent", [window]);
+ }
+ document.documentElement.dispatchEvent(new Event("resizedcontent"));
+ if (window.require && document.querySelector("meta[name=sourceApp]") && document.querySelector("meta[name=sourceApp]").content == "nyt-v5") {
+ require(["foundation/main"], function() {
+ require(["shared/interactive/instances/app-communicator"], function(AppCommunicator) {
+ AppCommunicator.triggerResize();
+ });
+ });
+ }
+ } catch(e) { console.log(e); }
+ }
+
+ // based on underscore.js
+ function throttle(func, wait) {
+ var _now = Date.now || function() { return +new Date(); },
+ timeout = null, previous = 0;
+ var run = function() {
+ previous = _now();
+ timeout = null;
+ func();
+ };
+ return function() {
+ var remaining = wait - (_now() - previous);
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ run();
+ } else if (!timeout) {
+ timeout = setTimeout(run, remaining);
+ }
+ };
+ }
+ })("nyt-preview", "g-");
+ //]]>
+ </script> <!-- End ai2html - 2018-09-25 16:50 -->
+ <!-- Pipeline: 2018-09-14-10-year-treasury-note | September 25, 2018, 04:51PM | e6a342acf0db9b8a88e9ae36f0db5438e5e5124f -->
+ </div>
+ <footer class="css-irejme interactive-footer custom-footer">
+ <p data-testid="credit" class="css-1ct2c9h interactive-credit custom-credit">
+ By The New York Times | Source: Reuters
+ </p>
+ </footer>
+ </section>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Since the beginning of the year, the yield on the 10-year Treasury note has risen by more than half a percentage point, to <!-- -->3.1 percent<!-- -->. The Congressional Budget Office estimates that the yield will climb to 4.2 percent in 2021. Given that the total public debt of the United States stands at nearly $16 trillion, even a small uptick in rates can cost the government billions.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ There’s no guarantee that these forecasts will prove accurate. If the economy weakens, rates might fall or rise only slightly, reducing interest payments. But rates could also overshoot the budget office forecast.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Some members of Congress want to set the stage for even more red ink. Republicans in the House want to make last year’s tax cuts permanent, instead of letting some of them expire at the end of 2025. That would reduce federal revenue by an additional $631 billion <!-- -->over 10 year<!-- -->s, according to the <a class="css-1g7m0tk" href="https://www.taxpolicycenter.org/publications/analysis-protecting-family-and-small-business-tax-cuts-act-2018" title="" rel="noopener noreferrer" target="_blank">Tax Policy Center</a>.
+ </p>
+ <h2 class="css-1505tg eoo0vm40" id="link-7b39a7bd">
+ No, the United States isn’t at risk of becoming the next Greece
+ </h2>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-13nfagi">
+ <section id="dollar-index" data-id="100000006106834" class="interactive-embedded interactive-size-scoop custom-graphic-container css-rlzall e13l8dds1">
+ <header class="css-cl76n0 interactive-header">
+ <p data-testid="leadin" class="css-1vs7yia interactive-leadin custom-leadin">
+ The dollar has strengthened even as government borrowing has increased.
+ </p>
+ </header>
+ <div class="interactive-graphic custom-graphic css-17ih8de e13l8dds0">
+ <!-- Generated by ai2html v0.74.0 - 2018-09-21 18:43 -->
+ <!-- ai file: 0916 biz web DEBT CHART 4.ai -->
+ <!-- preview: 2018-09-14-dollar-index -->
+ <!-- scoop: dollar-index -->
+ <div id="g-0916-biz-web-DEBT-CHART-4-box" class="ai2html ai2html-box-v5">
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-0916-biz-web-DEBT-CHART-4-Artboard_2" class="g-artboard" data-aspect-ratio="1.382" data-min-width="600">
+ <img id="g-0916-biz-web-DEBT-CHART-4-Artboard_2-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/dollar-index/3753490c8fd0afa3e42df37d132f5c87da5e1c36/0916-biz-web-DEBT-CHART-4-Artboard_2.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai0-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.0838%;width:117px;">
+ <p class="g-pstyle0">
+ U.S. Dollar index
+ </p>
+ </div>
+ <div id="g-ai0-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle1">
+ 140
+ </p>
+ </div>
+ <div id="g-ai0-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.7232%;margin-top:-9.2px;right:0.1584%;width:70px;">
+ <p class="g-pstyle2">
+ MONTHLY
+ </p>
+ </div>
+ <div id="g-ai0-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:21.2411%;margin-top:-9.2px;left:37.9228%;margin-left:-42.5px;width:85px;">
+ <p class="g-pstyle3">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai0-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:28.6213%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle1">
+ 120
+ </p>
+ </div>
+ <div id="g-ai0-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:47.5106%;margin-top:-9.2px;right:95.0369%;width:44px;">
+ <p class="g-pstyle1">
+ 100
+ </p>
+ </div>
+ <div id="g-ai0-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:66.6304%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 80
+ </p>
+ </div>
+ <div id="g-ai0-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:94.9686%;width:37px;">
+ <p class="g-pstyle1">
+ 60
+ </p>
+ </div>
+ <div id="g-ai0-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:7.6353%;width:40px;">
+ <p class="g-pstyle4">
+ ’98
+ </p>
+ </div>
+ <div id="g-ai0-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:16.3776%;width:40px;">
+ <p class="g-pstyle4">
+ ’00
+ </p>
+ </div>
+ <div id="g-ai0-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:25.1199%;width:40px;">
+ <p class="g-pstyle4">
+ ’02
+ </p>
+ </div>
+ <div id="g-ai0-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:33.8621%;width:40px;">
+ <p class="g-pstyle4">
+ ’04
+ </p>
+ </div>
+ <div id="g-ai0-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:42.6044%;width:40px;">
+ <p class="g-pstyle4">
+ ’06
+ </p>
+ </div>
+ <div id="g-ai0-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:51.3468%;width:40px;">
+ <p class="g-pstyle4">
+ ’08
+ </p>
+ </div>
+ <div id="g-ai0-15" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:60.0889%;width:39px;">
+ <p class="g-pstyle4">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai0-16" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:68.8313%;width:39px;">
+ <p class="g-pstyle4">
+ ’12
+ </p>
+ </div>
+ <div id="g-ai0-17" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:77.5735%;width:39px;">
+ <p class="g-pstyle4">
+ ’14
+ </p>
+ </div>
+ <div id="g-ai0-18" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:86.3158%;width:39px;">
+ <p class="g-pstyle4">
+ ’16
+ </p>
+ </div>
+ <div id="g-ai0-19" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:95.058%;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ </div><!-- Artboard: Artboard_3 -->
+ <div id="g-0916-biz-web-DEBT-CHART-4-Artboard_3" class="g-artboard" data-aspect-ratio="0.691" data-min-width="300" data-max-width="599">
+ <img id="g-0916-biz-web-DEBT-CHART-4-Artboard_3-img" class="g-aiImg" data-src="https://static01.nyt.com/newsgraphics/2018/09/14/dollar-index/3753490c8fd0afa3e42df37d132f5c87da5e1c36/0916-biz-web-DEBT-CHART-4-Artboard_3.png" src="data:image/gif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==" />
+ <div id="g-ai1-1" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:4.4262%;margin-top:-9.2px;left:0.2844%;width:117px;">
+ <p class="g-pstyle0">
+ U.S. Dollar index
+ </p>
+ </div>
+ <div id="g-ai1-2" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.5016%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 140
+ </p>
+ </div>
+ <div id="g-ai1-3" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:9.7232%;margin-top:-9.2px;right:6.6448%;width:70px;">
+ <p class="g-pstyle2">
+ MONTHLY
+ </p>
+ </div>
+ <div id="g-ai1-4" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:21.2411%;margin-top:-9.2px;left:38.8379%;margin-left:-42.5px;width:85px;">
+ <p class="g-pstyle3">
+ RECESSIONS
+ </p>
+ </div>
+ <div id="g-ai1-5" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:28.6214%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 120
+ </p>
+ </div>
+ <div id="g-ai1-6" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:47.5107%;margin-top:-9.2px;right:90.2334%;width:44px;">
+ <p class="g-pstyle1">
+ 100
+ </p>
+ </div>
+ <div id="g-ai1-7" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:66.6305%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 80
+ </p>
+ </div>
+ <div id="g-ai1-8" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:85.7502%;margin-top:-9.2px;right:90.0968%;width:37px;">
+ <p class="g-pstyle1">
+ 60
+ </p>
+ </div>
+ <div id="g-ai1-9" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:12.306%;width:40px;">
+ <p class="g-pstyle4">
+ ’98
+ </p>
+ </div>
+ <div id="g-ai1-10" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:27.6924%;width:40px;">
+ <p class="g-pstyle4">
+ ’02
+ </p>
+ </div>
+ <div id="g-ai1-11" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:43.0788%;width:40px;">
+ <p class="g-pstyle4">
+ ’06
+ </p>
+ </div>
+ <div id="g-ai1-12" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:58.4652%;width:39px;">
+ <p class="g-pstyle4">
+ ’10
+ </p>
+ </div>
+ <div id="g-ai1-13" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:73.8516%;width:39px;">
+ <p class="g-pstyle4">
+ ’14
+ </p>
+ </div>
+ <div id="g-ai1-14" class="g-Layer_1 g-aiAbs g-aiPointText" style="top:91.0485%;margin-top:-9.2px;left:89.238%;width:39px;">
+ <p class="g-pstyle4">
+ ’18
+ </p>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function (scriptEnvironment, nameSpace) {
+ // Use a sentinel class to ensure that this version of the resizer only initializes once
+ if (document.documentElement.className.indexOf(nameSpace + "resizer-v5-init") > -1) return;
+ document.documentElement.className += " " + nameSpace + "resizer-v5-init";
+ // requires IE9+
+ if (!("querySelector" in document)) return;
+ var observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;
+ var visibilityIndex = {}; // visibility of each graphic, indexed by container id (used with InteractionObserver)
+
+ updateAllGraphics();
+ window.addEventListener('nyt:embed:load', updateAllGraphics); // for nyt vi compatibility
+ document.addEventListener("DOMContentLoaded", updateAllGraphics);
+ window.addEventListener("resize", throttle(updateAllGraphics, 200));
+
+ function updateAllGraphics() {
+ selectElements(".ai2html-box-v5").forEach(updateGraphic);
+ if (scriptEnvironment == "nyt-preview") {
+ nytOnResize();
+ }
+ }
+
+ function updateGraphic(container) {
+ var artboards = selectElements("." + nameSpace + "artboard[data-min-width]", container),
+ width = Math.round(container.getBoundingClientRect().width),
+ id = container.id, // assume container has an id
+ showImages = !observer || visibilityIndex[id] == 'visible';
+
+ // Set artboard visibility based on container width
+ artboards.forEach(function(el) {
+ var minwidth = el.getAttribute("data-min-width"),
+ maxwidth = el.getAttribute("data-max-width");
+ if (+minwidth <= width && (+maxwidth >= width || maxwidth === null)) {
+ if (showImages) {
+ selectElements("." + nameSpace + "aiImg", el).forEach(updateImgSrc);
+ }
+ el.style.display = "block";
+ } else {
+ el.style.display = "none";
+ }
+ });
+
+ // Initialize lazy loading on first call, if IntersectionObserver is available
+ if (observer && !visibilityIndex[id]) {
+ if (containerIsVisible(container)) {
+ // Skip IntersectionObserver if graphic is initially visible
+ // Note: We're doing this after artboard visibility is first calculated
+ // (above) -- otherwise all artboard images are display:block and the
+ // calculated height of the graphic is huge.
+ // TODO: Consider making artboard images position:absolute and setting
+ // height as a padding % (calculated from the aspect ratio of the graphic).
+ // This will correctly set the initial height of the graphic before
+ // an image is loaded.
+ visibilityIndex[id] = 'visible';
+ updateGraphic(container); // Call again to start loading right away
+ } else {
+ visibilityIndex[id] = 'hidden';
+ observer.observe(container);
+ }
+ }
+ }
+
+ function containerIsVisible(container) {
+ var bounds = container.getBoundingClientRect();
+ return bounds.top < window.innerHeight && bounds.bottom > 0;
+ }
+
+ // Replace blank placeholder image with actual image
+ // (only relevant if use_lazy_loader option is true)
+ function updateImgSrc(img) {
+ var src = img.getAttribute("data-src");
+ if (src && img.getAttribute("src") != src) {
+ img.setAttribute("src", src);
+ }
+ }
+
+ function onIntersectionChange(entries) {
+ entries.forEach(function(entry) {
+ if (entry.isIntersecting) {
+ visibilityIndex[entry.target.id] = 'visible';
+ observer.unobserve(entry.target);
+ updateGraphic(entry.target);
+ }
+ });
+ }
+
+ function selectElements(selector, parent) {
+ var selection = (parent || document).querySelectorAll(selector);
+ return Array.prototype.slice.call(selection);
+ }
+
+ function nytOnResize() {
+ // TODO: add comments
+ try {
+ if (window.parent && window.parent.$) {
+ window.parent.$("body").trigger("resizedcontent", [window]);
+ }
+ document.documentElement.dispatchEvent(new Event("resizedcontent"));
+ if (window.require && document.querySelector("meta[name=sourceApp]") && document.querySelector("meta[name=sourceApp]").content == "nyt-v5") {
+ require(["foundation/main"], function() {
+ require(["shared/interactive/instances/app-communicator"], function(AppCommunicator) {
+ AppCommunicator.triggerResize();
+ });
+ });
+ }
+ } catch(e) { console.log(e); }
+ }
+
+ // based on underscore.js
+ function throttle(func, wait) {
+ var _now = Date.now || function() { return +new Date(); },
+ timeout = null, previous = 0;
+ var run = function() {
+ previous = _now();
+ timeout = null;
+ func();
+ };
+ return function() {
+ var remaining = wait - (_now() - previous);
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ run();
+ } else if (!timeout) {
+ timeout = setTimeout(run, remaining);
+ }
+ };
+ }
+ })("nyt-preview", "g-");
+ //]]>
+ </script> <!-- End ai2html - 2018-09-21 18:43 -->
+ <!-- Pipeline: 2018-09-14-dollar-index | September 21, 2018, 06:44PM | 3753490c8fd0afa3e42df37d132f5c87da5e1c36 -->
+ </div>
+ <footer class="css-irejme interactive-footer custom-footer">
+ <p data-testid="credit" class="css-1ct2c9h interactive-credit custom-credit">
+ By The New York Times | Source: Reuters
+ </p>
+ </footer>
+ </section>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ Deficit hawks have warned for years that a day of reckoning is coming, exposing the United States to the kind of economic crisis that overtook profligate borrowers in the past like Greece or Argentina.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ But most experts say that isn’t likely because the dollar is the world’s reserve currency. As a result, the United States still has plenty of borrowing capacity left because the Fed can print money with fewer consequences than other central banks.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ And interest rates plunged over the last decade, even as the government turned to the market for trillions each year after the recession. That’s because Treasury bonds are still the favored port of international investors in any economic storm.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “We exported a financial crisis a decade ago, and the world responded by sending us money,” <!-- -->said<!-- --> William G. Gale, a senior fellow at the Brookings Institution.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ But that privileged position has allowed politicians in both parties to avoid politically painful steps like cutting spending or raising taxes.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ That doesn’t mean rapidly rising interest costs and a bigger deficit won’t eventually catch up with us.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Charles Schultze, chairman of the Council of Economic Advisers in the Carter administration, once summed up the danger of deficits with a metaphor. “It’s not so much a question of the wolf at the door, but termites in the woodwork.”
+ </p>
+ <h2 class="css-1505tg eoo0vm40" id="link-12df6cc7">
+ But Washington doesn’t want to hear about the potential problems
+ </h2>
+ <p class="css-1ygdjhk evys1bk0">
+ Rather than simply splitting along party lines, lawmakers’ attitudes toward the deficit also depend on which party is in power. Republicans pilloried the Obama administration for proposing a large stimulus in the depths of the recession in 2009 and complained about the deficit for years.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ In 2013, Senator Mitch McConnell of Kentucky called the debt and deficit “the transcendent issue of our era.” By 2017, as Senate majority leader, he quickly shepherded the tax cut through Congress.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Senator James Lankford, an Oklahoma Republican who warned of the deficit’s dangers in the past, nevertheless played down that threat on the Senate floor as the tax billed neared passage.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “I understand it’s a risk, but I think it’s an appropriate risk to be able to say let’s allow Americans to keep more of their own money to invest in this economy,” he said.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ He also claimed the tax cuts would pay for themselves even as the Congressional Budget Office estimated that they would add $250 billion to the deficit on average from 2019 to 2024.
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ <div class="css-1fanzo5 StoryBodyCompanionColumn">
+ <div class="css-53u6y8">
+ <p class="css-1ygdjhk evys1bk0">
+ In an interview, Mr. Lankford insisted that the jury was still out on whether the tax cuts would generate additional revenue, citing the strong economic growth recently.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ While the Republican about-face has been much more striking, Democrats have adjusted their position, too.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ Mr. Warner, the Virginia Democrat, called last year’s tax bill “the worst piece of legislation we have passed since I arrived in the Senate.” In 2009, however, when Congress passed an $800 billion stimulus bill backed by the Obama administration, he called it “a responsible mix of tax cuts and investments that will create jobs.”
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ The difference, Mr. Warner said, was that the economy was near the precipice then.
+ </p>
+ <p class="css-1ygdjhk evys1bk0">
+ “There was virtual unanimity among economists that we needed a stimulus,” he said. “But a $2 trillion tax cut at the end of a business cycle with borrowed money won’t end well.”
+ </p>
+ </div>
+ <aside class="css-o6xoe7"></aside>
+ </div>
+ </section>
+ <div class="bottom-of-article">
+ <div class="css-1rjzas3"></div>
+ <div class="css-wg1cha e17092zo0">
+ <div class="css-x8f8u9 e1e7j8ap0">
+ <div>
+ <p>
+ Nelson D. Schwartz has covered economics since 2012. Previously, he wrote about Wall Street and banking, and also served as European economic correspondent in Paris. He joined The Times in 2007 as a feature writer for the Sunday Business section. <span class="css-4w91ra"><a href="https://twitter.com/NelsonSchwartz" class="css-1rj8to8" rel="noopener noreferrer" target="_blank"><span class="css-0">@</span>NelsonSchwartz</a></span>
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="css-vdv0al">
+ A version of this article appears in print on <!-- -->, on Page <!-- -->A<!-- -->1<!-- --> of the New York edition<!-- --> with the headline: <!-- -->What May Soon Exceed Cost of U.S. Military? Interest on U.S. Debt <span>. <a href="http://www.nytreprints.com/">Order Reprints</a> | <a href="http://www.nytimes.com/pages/todayspaper/index.html">Today’s Paper</a> | <a href="https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY">Subscribe</a></span>
+ </div>
+ <div class="css-i29ckm">
+ <div class="css-1kwfo8p"></div>
+ <div role="toolbar" aria-label="Social Media Share buttons, Save button, and Comments Panel with current comment count" class="css-d8bdto" data-testid="share-tools">
+ <ul class="css-y8aj3r">
+ <li class="css-ar1l6a">
+ <a href="https://www.facebook.com/dialog/feed?app_id=9869919170&amp;link=https%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html&amp;smid=fb-share&amp;name=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;redirect_uri=https%3A%2F%2Fwww.facebook.com%2F" target="_blank" rel="noopener noreferrer" aria-label="Share on Facebook"><svg class="css-4brsb6" viewbox="0 0 7 15" width="7" height="15">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.775 14.163V7.08h1.923l.255-2.441H4.775l.004-1.222c0-.636.06-.977.958-.977H6.94V0H5.016c-2.31 0-3.123 1.184-3.123 3.175V4.64H.453v2.44h1.44v7.083h2.882z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnyti.ms%2F2NC9vam&amp;text=As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military" target="_blank" rel="noopener noreferrer" aria-label="Share on Twitter"><svg viewbox="0 0 13 10" class="css-4brsb6" width="13" height="10">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M5.987 2.772l.025.425-.429-.052c-1.562-.2-2.927-.876-4.086-2.011L.93.571.784.987c-.309.927-.111 1.906.533 2.565.343.364.266.416-.327.2-.206-.07-.386-.122-.403-.096-.06.06.146.85.309 1.161.223.434.678.858 1.176 1.11l.42.199-.497.009c-.481 0-.498.008-.447.19.172.564.85 1.162 1.606 1.422l.532.182-.464.277a4.833 4.833 0 0 1-2.3.641c-.387.009-.704.044-.704.07 0 .086 1.047.572 1.657.762 1.828.564 4 .32 5.631-.641 1.159-.685 2.318-2.045 2.859-3.363.292-.702.583-1.984.583-2.6 0-.398.026-.45.507-.927.283-.277.55-.58.6-.667.087-.165.078-.165-.36-.018-.73.26-.832.226-.472-.164.266-.278.584-.78.584-.928 0-.026-.129.018-.275.096a4.79 4.79 0 0 1-.755.294l-.464.148-.42-.286C9.66.467 9.335.293 9.163.24 8.725.12 8.055.137 7.66.276c-1.074.39-1.752 1.395-1.674 2.496z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <a href="mailto:?subject=NYTimes.com%3A%20As%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military&amp;body=From%20The%20New%20York%20Times%3A%0A%0AAs%20Debt%20Rises%2C%20the%20Government%20Will%20Soon%20Spend%20More%20on%20Interest%20Than%20on%20the%20Military%0A%0ATax%20cuts%2C%20spending%20increases%20and%20higher%20interest%20rates%20could%20make%20it%20harder%20to%20respond%20to%20future%20recessions%20and%20deal%20with%20other%20needs.%0A%0Ahttps%3A%2F%2Fwww.nytimes.com%2F2018%2F09%2F25%2Fbusiness%2Feconomy%2Fus-government-debt-interest.html" target="_blank" rel="noopener noreferrer" aria-label="Email"><svg viewbox="0 0 15 9" class="css-4brsb6" width="15" height="9">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M.906 8.418V0L5.64 4.76.906 8.419zm13 0L9.174 4.761 13.906 0v8.418zM7.407 6.539l-1.13-1.137L.907 9h13l-5.37-3.598-1.13 1.137zM1.297 0h12.22l-6.11 5.095L1.297 0z" fill="#000"></path></svg></a>
+ </li>
+ <li class="css-ar1l6a">
+ <div class="css-6n7j50">
+ <button aria-haspopup="true" aria-expanded="false" aria-label="More sharing options" class="css-16ogagc" data-testid=""><svg class="css-uhuo44" viewbox="0 0 16 13" width="16" height="13">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.406 5.359L8.978 0v3.215C3.82 3.215.406 8.107.406 12.66 1.653 9.133 4.29 7.517 8.978 7.517v3.2l6.428-5.358z" fill="#000"></path></svg></button>
+ </div>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div id="bottom-wrapper" class="css-1ede5it">
+ <div id="bottom-slug" class="css-l9onyx">
+ <p>
+ Advertisement
+ </p>
+ </div>
+ <div class="ad bottom-wrapper" style="text-align:center;height:100%;display:block;min-height:90px">
+ <div id="bottom"></div>
+ </div>
+ </div>
+ </article>
+ <div class="css-1lc20wh">
+ <div class="css-qremme">
+ <button class="css-1f85ym4" type="button">Open in the app</button>
+ <div class="css-7inim5"></div><button class="css-133m5b6" type="button"><svg height="11" width="11" xmlns="http://www.w3.org/2000/svg">
+ <path stroke="#fff" d="M-0.86,2.17l-4.5,4.5-4.5-4.5"></path>
+ <path stroke="#fff" d="M-0.86,11.17l-4.5-4.5-4.5,4.5"></path></svg></button>
+ </div>
+ </div>
+ </div>
+ </main>
+ <nav class="css-1ropbjl" id="site-index" aria-labelledby="site-index-label" data-testid="site-index">
+ <div class="css-uw59u">
+ <header class="css-jxzr5i" data-testid="site-index-header">
+ <h2 class="css-vz7hjd" id="site-index-label">
+ Site Index
+ </h2><a href="/"><svg xmlns="http://www.w3.org/2000/svg" class="css-oylsik" viewbox="0 0 184 25" fill="#000">
+ <path d="M13.8 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8C6.2 1.4 5 1 4 1 2 1 .6 2.5.6 4.2c0 1.5 1.1 2 1.5 2.2l.1-.2c-.2-.2-.5-.4-.5-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8v3.1L9 10.2v.1l1.5 1.3v4.3c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2C3.6 6.9 4.7 6 5.8 5.4l-.1-.3c-3 .8-5.7 3.6-5.7 7 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1l-1.6-1.3V5.8c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7 0-1.5.2-2.1l2.1-.9v6.2zm10.6 2.3l-1.3 1 .2.2.6-.5 2.2 2 3-2-.1-.2-.8.5-1-1V9.4l.8-.6 1.7 1.4v6.1c0 3.8-.8 4.4-2.5 5v.3c2.8.1 5.4-.8 5.4-5.7V9.3l.9-.7-.2-.2-.8.6-2.5-2.1L18.5 9V.8h-.2l-3.5 2.4v.2c.4.2 1 .4 1 1.5l-.1 11.3zM34 15.1L31.5 17 29 15v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM53.1 2c0-.3-.1-.6-.2-.9h-.2c-.3.8-.7 1.2-1.7 1.2-.9 0-1.5-.5-1.9-.9l-2.9 3.3.2.2 1-.9c.6.5 1.1.9 2.5 1v8.3L44 3.2c-.5-.8-1.2-1.9-2.6-1.9-1.6 0-3 1.4-2.8 3.6h.3c.1-.6.4-1.3 1.1-1.3.5 0 1 .5 1.3 1v3.3c-1.8 0-3 .8-3 2.3 0 .8.4 2 1.6 2.3v-.2c-.2-.2-.3-.4-.3-.7 0-.5.4-.9 1.1-.9h.5v4.2c-2.1 0-3.8 1.2-3.8 3.2 0 1.9 1.6 2.8 3.4 2.7v-.2c-1.1-.1-1.6-.6-1.6-1.3 0-.9.6-1.3 1.4-1.3.8 0 1.5.5 2 1.1l2.9-3.2-.2-.2-.7.8c-1.1-1-1.7-1.3-3-1.5V5l8 14h.6V5c1.5-.1 2.9-1.3 2.9-3zm7.3 13.1L57.9 17l-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.6l-1 .8.2.2.9-.7 3.4 2.5 4.5-3.6-.1-.4zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zM76.7 8l-.7.5-1.9-1.6-2.2 2 .9.9v7.5l-2.4-1.5V9.6l.8-.5-2.3-2.2-2.2 2 .9.9V17l-.3.2-2.1-1.5v-6c0-1.4-.7-1.8-1.5-2.3-.7-.5-1.1-.8-1.1-1.5 0-.6.6-.9.9-1.1v-.2c-.8 0-2.9.8-2.9 2.7 0 1 .5 1.4 1 1.9s1 .9 1 1.8v5.8l-1.1.8.2.2 1-.8 2.3 2 2.5-1.7 2.8 1.7 5.3-3.1V9.2l1.3-1-.2-.2zm18.6-5.5l-1 .9-2.2-2-3.3 2.4V1.6h-.3l.1 16.2c-.3 0-1.2-.2-1.9-.4l-.2-13.5c0-1-.7-2.4-2.5-2.4s-3 1.4-3 2.8h.3c.1-.6.4-1.1 1-1.1s1.1.4 1.1 1.7v3.9c-1.8.1-2.9 1.1-2.9 2.4 0 .8.4 2 1.6 2V13c-.4-.2-.5-.5-.5-.7 0-.6.5-.8 1.3-.8h.4v6.2c-1.5.5-2.1 1.6-2.1 2.8 0 1.7 1.3 2.9 3.3 2.9 1.4 0 2.6-.2 3.8-.5 1-.2 2.3-.5 2.9-.5.8 0 1.1.4 1.1.9 0 .7-.3 1-.7 1.1v.2c1.6-.3 2.6-1.3 2.6-2.8s-1.5-2.4-3.1-2.4c-.8 0-2.5.3-3.7.5-1.4.3-2.8.5-3.2.5-.7 0-1.5-.3-1.5-1.3 0-.8.7-1.5 2.4-1.5.9 0 2 .1 3.1.4 1.2.3 2.3.6 3.3.6 1.5 0 2.8-.5 2.8-2.6V3.7l1.2-1-.2-.2zm-4.1 6.1c-.3.3-.7.6-1.2.6s-1-.3-1.2-.6V4.2l1-.7 1.4 1.3v3.8zm0 3c-.2-.2-.7-.5-1.2-.5s-1 .3-1.2.5V9c.2.2.7.5 1.2.5s1-.3 1.2-.5v2.6zm0 4.7c0 .8-.5 1.6-1.6 1.6h-.8V12c.2-.2.7-.5 1.2-.5s.9.3 1.2.5v4.3zm13.7-7.1l-3.2-2.3-4.9 2.8v6.5l-1 .8.1.2.8-.6 3.2 2.4 5-3V9.2zm-5.4 6.3V8.3l2.5 1.8v7.1l-2.5-1.7zm14.9-8.4h-.2c-.3.2-.6.4-.9.4-.4 0-.9-.2-1.1-.5h-.2l-1.7 1.9-1.7-1.9-3 2 .1.2.8-.5 1 1.1v6.3l-1.3 1 .2.2.6-.5 2.4 2 3.1-2.1-.1-.2-.9.5-1.2-1V9c.5.5 1.1 1 1.8 1 1.4.1 2.2-1.3 2.3-2.9zm12 9.6L123 19l-4.6-7 3.3-5.1h.2c.4.4 1 .8 1.7.8s1.2-.4 1.5-.8h.2c-.1 2-1.5 3.2-2.5 3.2s-1.5-.5-2.1-.8l-.3.5 5 7.4 1-.6v.1zm-11-.5l-1.3 1 .2.2.6-.5 2.2 2 3-2-.2-.2-.8.5-1-1V.8h-.1l-3.6 2.4v.2c.4.2 1 .3 1 1.5v11.3zM143 2.9c0-2-1.9-2.5-3.4-2.5v.3c.9 0 1.6.3 1.6 1 0 .4-.3 1-1.2 1-.7 0-2.2-.4-3.3-.8-1.3-.4-2.5-.8-3.5-.8-2 0-3.4 1.5-3.4 3.2 0 1.5 1.1 2 1.5 2.2l.1-.2c-.3-.2-.6-.4-.6-1 0-.4.4-1.1 1.4-1.1.9 0 2.1.4 3.7.9 1.4.4 2.9.7 3.7.8V9l-1.5 1.3v.1l1.5 1.3V16c-.8.5-1.7.6-2.5.6-1.5 0-2.8-.4-3.9-1.6l4.1-2V6l-5 2.2c.5-1.3 1.6-2.2 2.6-2.9l-.1-.2c-3 .8-5.7 3.5-5.7 6.9 0 4 3.3 7 7 7 4 0 6.6-3.2 6.6-6.5h-.2c-.6 1.3-1.5 2.5-2.6 3.1v-4.1l1.6-1.3v-.1L140 8.8v-3c1.5 0 3-1 3-2.9zm-8.7 11l-1.2.6c-.7-.9-1.1-2.1-1.1-3.8 0-.7.1-1.5.3-2.1l2.1-.9-.1 6.2zm12.2-12h-.1l-2 1.7v.1l1.7 1.9h.2l2-1.7v-.1l-1.8-1.9zm3 14.8l-.8.5-1-1V9.3l1-.7-.2-.2-.7.6-1.8-2.1-2.9 2 .2.3.7-.5.9 1.1v6.5l-1.3 1 .1.2.7-.5 2.2 2 3-2-.1-.3zm16.7-.1l-.7.5-1.1-1V9.3l1-.8-.2-.2-.8.7-2.3-2.1-3 2.1-2.3-2.1L154 9l-1.8-2.1-2.9 2 .1.3.7-.5 1 1.1v6.5l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.9-.6 1.5 1.4v6l-.8.8 2.3 1.9 2.2-2-.9-.9V9.3l.8-.5 1.6 1.4v6l-.7.7 2.3 2.1 3.1-2.1v-.3zm8.7-1.5l-2.5 1.9-2.5-2v-1.2l4.7-3.2v-.1l-2.4-3.6-5.2 2.8v6.8l3.5 2.5 4.5-3.6-.1-.3zm-5-1.7V8.5l.2-.1 2.2 3.5-2.4 1.5zm14.1-.9l-1.9-1.5c1.3-1.1 1.8-2.6 1.8-3.6v-.6h-.2c-.2.5-.6 1-1.4 1-.8 0-1.3-.4-1.8-1L176 9.3v3.6l1.7 1.3c-1.7 1.5-2 2.5-2 3.3 0 1 .5 1.7 1.3 2l.1-.2c-.2-.2-.4-.3-.4-.8 0-.3.4-.8 1.2-.8 1 0 1.6.7 1.9 1l4.3-2.6v-3.6h-.1zm-1.1-3c-.7 1.2-2.2 2.4-3.1 3l-1.1-.9V8.1c.4 1 1.5 1.8 2.6 1.8.7 0 1.1-.1 1.6-.4zm-1.7 8c-.5-1.1-1.7-1.9-2.9-1.9-.3 0-1.1 0-1.9.5.5-.8 1.8-2.2 3.5-3.2l1.2 1 .1 3.6z"></path></svg></a>
+ <div class="css-1otr2jl" data-testid="go-to-homepage">
+ <a class="css-1c8n994" href="/">Go to Home Page »</a>
+ </div>
+ </header>
+ <div class="css-qtw155" data-testid="site-index-accordion">
+ <div class="" role="tablist" aria-multiselectable="true" data-testid="accordion">
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-0" id="item-siteindex-0" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ news
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-0" aria-labelledby="item-siteindex-0" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com" data-testid="accordion-item-list-link">home page</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/world" data-testid="accordion-item-list-link">world</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/us" data-testid="accordion-item-list-link">U.S.</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/politics" data-testid="accordion-item-list-link">politics</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/nyregion" data-testid="accordion-item-list-link">New York</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/business" data-testid="accordion-item-list-link">business</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/technology" data-testid="accordion-item-list-link">tech</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/science" data-testid="accordion-item-list-link">science</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/climate" data-testid="accordion-item-list-link">climate</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/sports" data-testid="accordion-item-list-link">sports</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/obituaries" data-testid="accordion-item-list-link">obituaries</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/upshot" data-testid="accordion-item-list-link">the upshot</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/todayspaper" data-testid="accordion-item-list-link">today's paper</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/corrections" data-testid="accordion-item-list-link">corrections</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-1" id="item-siteindex-1" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ opinion
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-1" aria-labelledby="item-siteindex-1" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion" data-testid="accordion-item-list-link">today's opinion</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/columnists" data-testid="accordion-item-list-link">op-ed columnists</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/editorials" data-testid="accordion-item-list-link">editorials</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/contributors" data-testid="accordion-item-list-link">op-ed Contributors</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/letters" data-testid="accordion-item-list-link">letters</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/opinion/sunday" data-testid="accordion-item-list-link">sunday review</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video/opinion" data-testid="accordion-item-list-link">video: opinion</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-2" id="item-siteindex-2" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ arts
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-2" aria-labelledby="item-siteindex-2" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts" data-testid="accordion-item-list-link">today's arts</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/design" data-testid="accordion-item-list-link">art &amp; design</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/books" data-testid="accordion-item-list-link">books</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/dance" data-testid="accordion-item-list-link">dance</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/movies" data-testid="accordion-item-list-link">movies</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/music" data-testid="accordion-item-list-link">music</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="accordion-item-list-link">Pop Culture</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/arts/television" data-testid="accordion-item-list-link">television</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/theater" data-testid="accordion-item-list-link">theater</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://www.nytimes.com/watching" data-testid="accordion-item-list-link">watching</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video/arts" data-testid="accordion-item-list-link">video: arts</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-3" id="item-siteindex-3" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ living
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-3" aria-labelledby="item-siteindex-3" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/automobiles" data-testid="accordion-item-list-link">automobiles</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/crosswords" data-testid="accordion-item-list-link">crossword</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/food" data-testid="accordion-item-list-link">food</a>
+ </li>
+ <li class="css-10t7hia smartphone">
+ <a class="css-mzqdl" href="https://cooking.nytimes.com/" data-testid="accordion-item-list-link">Cooking</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/education" data-testid="accordion-item-list-link">education</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/style" data-testid="accordion-item-list-link">style</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/health" data-testid="accordion-item-list-link">health</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/jobs" data-testid="accordion-item-list-link">jobs</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/magazine" data-testid="accordion-item-list-link">magazine</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/realestate" data-testid="accordion-item-list-link">real estate</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/t-magazine" data-testid="accordion-item-list-link">t magazine</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/travel" data-testid="accordion-item-list-link">travel</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/fashion/weddings" data-testid="accordion-item-list-link">weddings</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="" data-testid="accordion-item">
+ <header aria-controls="body-siteindex-4" id="item-siteindex-4" class="css-mn5hq9" role="tab" tabindex="0" aria-expanded="false" data-testid="accordion-item-header">
+ listings &amp; more
+ </header>
+ <div class="css-1hyfx7x" id="body-siteindex-4" aria-labelledby="item-siteindex-4" aria-expanded="false" role="tabpanel" data-testid="accordion-item-body">
+ <ul class="css-1gprdgz" data-testid="site-index-accordion-list">
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/reader-center" data-testid="accordion-item-list-link">Reader Center</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://thewirecutter.com" data-testid="accordion-item-list-link">Wirecutter</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="http://nytconferences.com/" data-testid="accordion-item-list-link">Live Events</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/learning" data-testid="accordion-item-list-link">The Learning Network</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="accordion-item-list-link">tools &amp; services</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/events" data-testid="accordion-item-list-link">N.Y.C. events guide</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/multimedia" data-testid="accordion-item-list-link">multimedia</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/section/lens" data-testid="accordion-item-list-link">photography</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/video" data-testid="accordion-item-list-link">video</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/store" data-testid="accordion-item-list-link">NYT store</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://www.nytimes.com/times-journeys" data-testid="accordion-item-list-link">times journeys</a>
+ </li>
+ <li class="css-10t7hia">
+ <a class="css-mzqdl" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="accordion-item-list-link">manage my account</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="css-v0l3hm" data-testid="site-index-sections">
+ <div class="css-g4gku8" data-testid="site-index-section">
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-0">
+ <h3 class="css-rxqrcl" id="site-index-section-label-0">
+ news
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com" data-testid="site-index-section-list-link">home page</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/world" data-testid="site-index-section-list-link">world</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/us" data-testid="site-index-section-list-link">U.S.</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/politics" data-testid="site-index-section-list-link">politics</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/nyregion" data-testid="site-index-section-list-link">New York</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/business" data-testid="site-index-section-list-link">business</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/technology" data-testid="site-index-section-list-link">tech</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/science" data-testid="site-index-section-list-link">science</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/climate" data-testid="site-index-section-list-link">climate</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/sports" data-testid="site-index-section-list-link">sports</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/obituaries" data-testid="site-index-section-list-link">obituaries</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/upshot" data-testid="site-index-section-list-link">the upshot</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/todayspaper" data-testid="site-index-section-list-link">today's paper</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/corrections" data-testid="site-index-section-list-link">corrections</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-1">
+ <h3 class="css-rxqrcl" id="site-index-section-label-1">
+ opinion
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion" data-testid="site-index-section-list-link">today's opinion</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/columnists" data-testid="site-index-section-list-link">op-ed columnists</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/editorials" data-testid="site-index-section-list-link">editorials</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/contributors" data-testid="site-index-section-list-link">op-ed Contributors</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/letters" data-testid="site-index-section-list-link">letters</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/opinion/sunday" data-testid="site-index-section-list-link">sunday review</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video/opinion" data-testid="site-index-section-list-link">video: opinion</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-2">
+ <h3 class="css-rxqrcl" id="site-index-section-label-2">
+ arts
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts" data-testid="site-index-section-list-link">today's arts</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/design" data-testid="site-index-section-list-link">art &amp; design</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/books" data-testid="site-index-section-list-link">books</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/dance" data-testid="site-index-section-list-link">dance</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/movies" data-testid="site-index-section-list-link">movies</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/music" data-testid="site-index-section-list-link">music</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/spotlight/pop-culture" data-testid="site-index-section-list-link">Pop Culture</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/arts/television" data-testid="site-index-section-list-link">television</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/theater" data-testid="site-index-section-list-link">theater</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://www.nytimes.com/watching" data-testid="site-index-section-list-link">watching</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video/arts" data-testid="site-index-section-list-link">video: arts</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-3">
+ <h3 class="css-rxqrcl" id="site-index-section-label-3">
+ living
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/automobiles" data-testid="site-index-section-list-link">automobiles</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/crosswords" data-testid="site-index-section-list-link">crossword</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/food" data-testid="site-index-section-list-link">food</a>
+ </li>
+ <li class="css-ist4u3 smartphone">
+ <a class="css-kwpx34" href="https://cooking.nytimes.com/" data-testid="site-index-section-list-link">Cooking</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/education" data-testid="site-index-section-list-link">education</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/style" data-testid="site-index-section-list-link">style</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/health" data-testid="site-index-section-list-link">health</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/jobs" data-testid="site-index-section-list-link">jobs</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/magazine" data-testid="site-index-section-list-link">magazine</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/realestate" data-testid="site-index-section-list-link">real estate</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/t-magazine" data-testid="site-index-section-list-link">t magazine</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/travel" data-testid="site-index-section-list-link">travel</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/fashion/weddings" data-testid="site-index-section-list-link">weddings</a>
+ </li>
+ </ul>
+ </section>
+ <section class="css-1rr4qq7" aria-labelledby="site-index-section-label-4">
+ <h3 class="css-rxqrcl" id="site-index-section-label-4">
+ more
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-section-list">
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/reader-center" data-testid="site-index-section-list-link">Reader Center</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://thewirecutter.com" data-testid="site-index-section-list-link">Wirecutter</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="http://nytconferences.com/" data-testid="site-index-section-list-link">Live Events</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/learning" data-testid="site-index-section-list-link">The Learning Network</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="http://www.nytimes.com/marketing/tools-and-services" data-testid="site-index-section-list-link">tools &amp; services</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/events" data-testid="site-index-section-list-link">N.Y.C. events guide</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/multimedia" data-testid="site-index-section-list-link">multimedia</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/section/lens" data-testid="site-index-section-list-link">photography</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/video" data-testid="site-index-section-list-link">video</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/store" data-testid="site-index-section-list-link">NYT store</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://www.nytimes.com/times-journeys" data-testid="site-index-section-list-link">times journeys</a>
+ </li>
+ <li class="css-ist4u3">
+ <a class="css-kwpx34" href="https://myaccount.nytimes.com/membercenter/myaccount.html" data-testid="site-index-section-list-link">manage my account</a>
+ </li>
+ </ul>
+ </section>
+ <div class="css-6xhk3s" aria-labelledby="site-index-subscribe-label">
+ <h3 class="css-rxqrcl" id="site-index-subscribe-label">
+ Subscribe
+ </h3>
+ <ul class="css-1iruc8t" data-testid="site-index-subscribe-list">
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/hdleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 14 13" fill="#000">
+ <path d="M13.1,11.7H3.5V1.2h9.6V11.7zM13.1,0.4H3.5C3,0.4,2.6,0.8,2.6,1.2v2.2H0.9C0.4,3.4,0,3.8,0,4.3v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9V1.2C14,0.8,13.6,0.4,13.1,0.4"></path>
+ <polygon points="10.9,3 5.2,3 5.2,3.9 11.4,3.9 11.4,3"></polygon>
+ <rect x="5.2" y="4.7" width="6.1" height="0.9"></rect>
+ <rect x="5.2" y="6.5" width="6.1" height="0.9"></rect></svg>home delivery</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/digitalleftnav" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 10 13">
+ <path fill="#000" d="M9.9,8c-0.4,1.1-1.2,1.9-2.3,2.4V8l1.3-1.2L7.6,5.7V4c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7C6,1.7,4.5,0.6,2.8,0.6c-1.5,0-2.5,1.1-2.5,2.2C0.3,4,1,4.3,1.6,4.6l0-0.1C1.4,4.4,1.3,4.1,1.3,3.8c0-0.5,0.5-0.9,1-0.9C3.7,2.9,6,4,7.4,4h0.1v1.7L6.2,6.8L7.5,8v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5V10l2.2-1v-5L2.5,5.5c0.3-1,1-1.7,1.8-2l0,0C2.2,3.9,0.1,5.6,0.1,8c0,2.9,2.4,4.8,5.2,4.8C8.2,12.9,9.9,10.9,9.9,8L9.9,8z"></path></svg>digital subscriptions</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/subscription/games/lp897H9.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 13 13" fill="#000">
+ <polygon points="0,-93.6 0,-86.9 6.6,-93.6"></polygon>
+ <polygon points="0.9,-86 7.5,-86 7.5,-92.6"></polygon>
+ <polygon points="0,-98 0,-94.8 8.8,-94.8 8.8,-86 12,-86 12,-98"></polygon>
+ <path d="M11.9-40c-0.4,1.1-1.2,1.9-2.3,2.4V-40l1.3-1.2l-1.3-1.2V-44c1.2-0.1,2-1,2-2c0-1.4-1.3-1.9-2.1-1.9c-0.2,0-0.3,0-0.6,0.1v0.1c0.1,0,0.2,0,0.3,0c0.5,0,0.9,0.2,0.9,0.7c0,0.4-0.3,0.7-0.8,0.7c-1.3,0-2.8-1.1-4.5-1.1c-1.5,0-2.5,1.1-2.5,2.2c0,1.1,0.6,1.5,1.3,1.7l0-0.1c-0.2-0.1-0.4-0.4-0.4-0.7c0-0.5,0.5-0.9,1-0.9C5.7-45.1,8-44,9.4-44h0.1v1.7l-1.3,1.1L9.5-40v2.4c-0.5,0.2-1.1,0.3-1.7,0.3c-2.2,0-3.6-1.3-3.6-3.5c0-0.5,0.1-1,0.2-1.5l1.1-0.5v4.9l2.2-1v-5l-3.3,1.5c0.3-1,1-1.7,1.8-2l0,0c-2.2,0.5-4.3,2.1-4.3,4.6c0,2.9,2.4,4.8,5.2,4.8C10.2-35.1,11.9-37.1,11.9-40L11.9-40z"></path>
+ <path d="M12.2-23.7c-0.2,0-0.4,0.2-0.4,0.4v0.4L0.4-19.1v2.3l3,1l-0.2,0.6c-0.3,0.8,0.1,1.8,0.9,2.1l1.7,0.7c0.2,0.1,0.4,0.1,0.6,0.1c0.6,0,1.3-0.4,1.5-1l0.4-0.9l3.5,1.2v0.4c0,0.2,0.2,0.4,0.4,0.4c0.2,0,0.4-0.2,0.4-0.4v-10.7C12.6-23.5,12.4-23.7,12.2-23.7M7.1-13.6c-0.2,0.4-0.6,0.6-1,0.4l-1.7-0.7c-0.4-0.2-0.6-0.6-0.4-1l0.3-0.7l3.3,1.1L7.1-13.6z"></path>
+ <path d="M13.1-60.3H3.5v-10.5h9.6V-60.3zM13.1-71.6H3.5c-0.5,0-0.9,0.4-0.9,0.9v2.2H0.9c-0.5,0-0.9,0.4-0.9,0.9v5.2v1.5c0,0.8,0.8,1.5,1.8,1.5h1.7h0h7.4h2.2c0.5,0,0.9-0.4,0.9-0.9v-10.5C14-71.2,13.6-71.6,13.1-71.6"></path>
+ <polygon points="10.9,-69 5.2,-69 5.2,-68.1 11.4,-68.1 11.4,-69"></polygon>
+ <rect x="5.2" y="-67.3" width="6.1" height="0.9"></rect>
+ <rect x="5.2" y="-65.5" width="6.1" height="0.9"></rect>
+ <path d="M12,6.5H6.5V12H1V6.5h5.5V1H12V6.5zM12,0H1C0.4,0,0,0.5,0,1v11c0,0.6,0.4,1,1,1h11c0.5,0,1-0.4,1-1V1C13,0.5,12.5,0,12,0"></path></svg>Crossword</a>
+ </li>
+ <li class="css-tj0ten">
+ <a class="css-1k2cjfc" href="https://www.nytimes.com/subscriptions/Multiproduct/lp8R3WU.html" data-testid="site-index-subscribe-list-link"><svg class="css-r5ic95" viewbox="0 0 13 13" fill="#000">
+ <path d="M12,2.9L9.6,5.2c-0.1,0.1-0.3,0.1-0.4,0C9.1,5.2,9.1,5,9.3,4.9l2.4-2.4c-0.2-0.2-0.3-0.3-0.5-0.5L8.7,4.3c-0.1,0.1-0.3,0.1-0.4,0C8.2,4.3,8.2,4.1,8.4,4l2.4-2.4c-0.3-0.3-0.5-0.5-0.5-0.5L7.6,3.4C7.1,4,6.8,5.1,7.1,5.8c-1.4,1-4.6,3.5-5.1,4c-0.8,0.8-0.4,1.8-0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,1.1,0.5,1.9-0.3c0.4-0.4,2.9-3.6,3.9-5C8.4,6.9,9.6,6.6,10.2,6l2.3-2.6C12.5,3.4,12.3,3.2,12,2.9z"></path>
+ <path d="M0.8,1.9l0.3-0.3c0.9-0.9,3.2,1.1,3.8,1.7s0.9,1.8,0.4,2.6c1.4,1.1,4.6,3.5,5,3.9c0.8,0.8,0.4,1.8,0.3,1.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0.1-1.1,0.5-1.9-0.3c-0.4-0.4-2.9-3.7-4-5.1C3.9,6.7,2.9,6.4,2.3,5.8S-0.2,2.9,0.8,1.9z"></path></svg>Cooking</a>
+ </li>
+ </ul>
+ <ul class="css-1iruc8t" data-testid="site-index-corporate-links">
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/marketing/newsletters">email newsletters</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/corporateleftnav">corporate subscriptions</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/educationleftnav">education rate</a>
+ </li>
+ </ul>
+ <ul class="css-6td9kr" data-testid="site-index-alternate-links">
+ <li>
+ <a class="css-1vhk1ks" href="https://www.nytimes.com/services/mobile/index.html">mobile applications</a>
+ </li>
+ <li>
+ <a class="css-1vhk1ks" href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">replica edition</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </nav>
+ <footer role="contentinfo" class="css-1qmnftd e1ksinrk0">
+ <nav data-testid="footer" class="css-15uy5yv">
+ <h2 class="css-vz7hjd">
+ Site Information Navigation
+ </h2>
+ <ul class="css-1ho5u4o e1ksinrk1">
+ <li data-testid="copyright">
+ <a class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">©&#160;<span itemprop="copyrightYear">2019</span><span itemprop="publisher copyrightHolder provider sourceOrganization" itemscope="itemscope" itemtype="http://schema.org/NewsMediaOrganization" itemid="https://www.nytimes.com">&#160;
+ <meta itemprop="diversityPolicy" content="https://www.nytco.com/diversity-and-inclusion-at-the-new-york-times/" />
+ <meta itemprop="ethicsPolicy" content="https://www.nytco.com/who-we-are/culture/standards-and-ethics/" />
+ <meta itemprop="foundingDate" content="1851-09-18" /><span itemprop="logo" itemscope="itemscope" itemtype="https://schema.org/ImageObject">
+ <meta itemprop="url" content="https://static01.nyt.com/images/misc/NYT_logo_rss_250x40.png" /></span>
+ <meta itemprop="url" content="https://www.nytimes.com/" />
+ <meta itemprop="masthead" content="https://www.nytimes.com/interactive/2018/09/28/admin/the-new-york-times-masthead.html" /><span itemprop="name">The New York Times Company</span></span></a>
+ </li>
+ </ul>
+ <ul class="css-13o0c9t e1ksinrk2">
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://myaccount.nytimes.com/membercenter/feedback.html">Contact Us</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://www.nytco.com/careers">Work with us</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://nytmediakit.com/">Advertise</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/privacy">Privacy</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/ref/membercenter/help/agree.html">Terms of Service</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="http://spiderbites.nytimes.com">Site Map</a>
+ </li>
+ <li class="smartphone css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://mobile.nytimes.com/help">Help</a>
+ </li>
+ <li class="desktop css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a>
+ </li>
+ <li class="css-1yo489b e1ksinrk3">
+ <a data-testid="footer-link" class="css-1p8nkc0" href="https://www.nytimes.com/subscription/multiproduct/lp8HYKU?campaignId=37WXW">Subscriptions</a>
+ </li>
+ </ul>
+ </nav>
+ </footer>
+ </div>
+ </div>
+ </div>
+ <script>
+ <![CDATA[
+ window.__preloadedData = {"initialState":{"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==":{"__typename":"Article","id":"QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==","compatibility":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.compatibility","typename":"CompatibilityFeatures"},"collections@filterEmpty":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uL2RiNjYxNjRiLWVhNWYtNTUyMS1hZGE0LTI4NGFjYmI1OWMyOQ==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzZhNDIyMjc1LThmM2YtNTFiZC04MTlkLTZiZTcyMDQxZDgwMQ==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU0YzJkNTFjLTE0ZjYtNTgyMC04MzJkLTk2ODk0NmZiMzM4ZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4NzljYmY2LTg0NjYtNWY0NC1hNmM4LTg4NDZlZjk3NjA2Yw==","typename":"LegacyCollection"}],"tone":"NEWS","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzA0MTViMmIwLTUxM2EtNWU3OC04MGRhLTIxYWI3NzBjYjc1Mw==","typename":"Section"},"subsection":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzE3YjM1OWM0LTY3YTEtNTE4Yy05YTM0LTIyZmMyNTU2YzQ5ZA==","typename":"Section"},"sprinkledBody":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody","typename":"DocumentBlock"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2018\u002F09\u002F25\u002Fbusiness\u002Feconomy\u002Fus-government-debt-interest.html","adTargetingParams({\"clientAdParams\":{\"edn\":\"us\",\"plat\":\"web\",\"prop\":\"nyt\"}})":[{"type":"id","generated":false,"id":"AdTargetingParam:si_sectionbusiness","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:keywords","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:templatearticle","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:platweb","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:authnelsondschwartz","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:typart,oak","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ednus","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:trend","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:desnationaldebtus,federalbudgetus,unitedstatespoliticsandgovernm,interestrates,unitedstatesdefenseandmilitary,unitedstateseconomy,federaltaxesus,usdollarcurrency,recessionanddepression","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:pertrumpdonaldj","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:orgcongressionalbudgetoffice,federalreservesystem","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:collpolitics,economy,business,amp","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gui","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:id100000006102576","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:geo","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:col","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:als_test1551234976794","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:brandsensitivefalse","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:spon","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:ledemedsznone","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:propnyt","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:sectionbusiness","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:artlenlong","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:emotionsfear,optimistic,interest,informed,hate,not_selfconfident,not_happiness,not_adventurous,not_inthemoodtospend,not_boredom,not_indulgent,not_nostalgic,not_love,not_amused,not_inspired","typename":"AdTargetingParam"},{"type":"id","generated":false,"id":"AdTargetingParam:gscatneg_mastercard,gs_politics,gs_economy,gs_economy_misc,gs_finance,gs_politics_misc,gs_politics_american,gs_finance_loans,neg_hearts,gs_finance_tax,gv_safe","typename":"AdTargetingParam"}],"sourceId":"100000006102576","type":"article","wordCount":1466,"bylines":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0","typename":"Byline"}],"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.displayProperties","typename":"CreativeWorkDisplayProperties"},"typeOfMaterials":{"type":"json","json":["News"]},"collections":[{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uL2RiNjYxNjRiLWVhNWYtNTUyMS1hZGE0LTI4NGFjYmI1OWMyOQ==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzZhNDIyMjc1LThmM2YtNTFiZC04MTlkLTZiZTcyMDQxZDgwMQ==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU0YzJkNTFjLTE0ZjYtNTgyMC04MzJkLTk2ODk0NmZiMzM4ZA==","typename":"LegacyCollection"},{"type":"id","generated":false,"id":"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4NzljYmY2LTg0NjYtNWY0NC1hNmM4LTg4NDZlZjk3NjA2Yw==","typename":"LegacyCollection"}],"timesTags@filterEmpty":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.0","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.1","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.2","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.3","typename":"Person"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.4","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.5","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.6","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.7","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.8","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.9","typename":"Subject"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.10","typename":"Organization"},{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.11","typename":"Organization"}],"language":null,"desk":"Business","kicker":"","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.headline","typename":"CreativeWorkHeadline"},"commentStatus":"ACCEPT_AND_DISPLAY_COMMENTS","firstPublished":"2018-09-25T21:28:31.000Z","lastModified":"2018-09-28T13:09:07.032Z","originalDesk":"Business","source":{"type":"id","generated":false,"id":"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","typename":"Organization"},"printInformation":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.printInformation","typename":"PrintInformation"},"sprinkled":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled","typename":"SprinkledContent"},"dfpTaxonomyException":null,"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"reviewItems":[],"translations":[],"summary":"Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.","uri":"nyt:\u002F\u002Farticle\u002F5563b851-3a8e-58f7-8f67-0716698cebaa","eventId":"pubp:\u002F\u002Fevent\u002F98755cd27ffd446db9ef9870a3fb9db8","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia","typename":"Image"},"shortUrl":"https:\u002F\u002Fnyti.ms\u002F2NC9vam","promotionalHeadline":"As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military","promotionalSummary":"Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.","column":null,"newsStatus":"DEFAULT","reviewSummary":"","legacy":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.legacy","typename":"ArticleLegacyData"},"addendums":[],"related@filterEmpty":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.compatibility":{"isOak":true,"__typename":"CompatibilityFeatures","hasVideo":false,"hasOakConversionError":false,"isArtReview":false,"isBookReview":false,"isDiningReview":false,"isMovieReview":false,"isTheaterReview":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uL2RiNjYxNjRiLWVhNWYtNTUyMS1hZGE0LTI4NGFjYmI1OWMyOQ==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uL2RiNjYxNjRiLWVhNWYtNTUyMS1hZGE0LTI4NGFjYmI1OWMyOQ==","slug":"politics","__typename":"LegacyCollection","name":"Politics","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002Fdb66164b-ea5f-5521-ada4-284acbb59c29","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzZhNDIyMjc1LThmM2YtNTFiZC04MTlkLTZiZTcyMDQxZDgwMQ==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzZhNDIyMjc1LThmM2YtNTFiZC04MTlkLTZiZTcyMDQxZDgwMQ==","slug":"business-economy","__typename":"LegacyCollection","name":"Economy","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F6a422275-8f3f-51bd-819d-6be72041d801","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU0YzJkNTFjLTE0ZjYtNTgyMC04MzJkLTk2ODk0NmZiMzM4ZA==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU0YzJkNTFjLTE0ZjYtNTgyMC04MzJkLTk2ODk0NmZiMzM4ZA==","slug":"business","__typename":"LegacyCollection","name":"Business","collectionType":"SECTION","uri":"nyt:\u002F\u002Flegacycollection\u002F54c2d51c-14f6-5820-832d-968946fb338d","header":"","showCollectionStories":false},"LegacyCollection:TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4NzljYmY2LTg0NjYtNWY0NC1hNmM4LTg4NDZlZjk3NjA2Yw==":{"id":"TGVnYWN5Q29sbGVjdGlvbjpueXQ6Ly9sZWdhY3ljb2xsZWN0aW9uLzU4NzljYmY2LTg0NjYtNWY0NC1hNmM4LTg4NDZlZjk3NjA2Yw==","slug":"amp","__typename":"LegacyCollection","name":"amp","collectionType":"SYNDICATED","uri":"nyt:\u002F\u002Flegacycollection\u002F5879cbf6-8466-5f44-a6c8-8846ef97606c","header":"","showCollectionStories":false},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzA0MTViMmIwLTUxM2EtNWU3OC04MGRhLTIxYWI3NzBjYjc1Mw==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzA0MTViMmIwLTUxM2EtNWU3OC04MGRhLTIxYWI3NzBjYjc1Mw==","name":"business","displayName":"Business","url":"\u002Fsection\u002Fbusiness","uri":"nyt:\u002F\u002Fsection\u002F0415b2b0-513a-5e78-80da-21ab770cb753","__typename":"Section"},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzE3YjM1OWM0LTY3YTEtNTE4Yy05YTM0LTIyZmMyNTU2YzQ5ZA==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzE3YjM1OWM0LTY3YTEtNTE4Yy05YTM0LTIyZmMyNTU2YzQ5ZA==","name":"economy","displayName":"Economy","url":"https:\u002F\u002Fwww.nytimes.com\u002Fpages\u002Fbusiness\u002Feconomy\u002Findex.html","uri":"nyt:\u002F\u002Fsection\u002F17b359c4-67a1-518c-9a34-22fc2556c49d","__typename":"Section"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0":{"__typename":"HeaderBasicBlock","label":null,"headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.headline","typename":"Heading1Block"},"summary":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.summary","typename":"SummaryBlock"},"ledeMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.ledeMedia","typename":"ImageBlock"},"byline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline","typename":"BylineBlock"},"timestampBlock":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.timestampBlock","typename":"TimestampBlock"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.1":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.1.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.2":{"__typename":"Dropzone","index":0,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.3":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.3.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.4":{"__typename":"Dropzone","index":1,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.5":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.5.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.6":{"__typename":"Dropzone","index":2,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.7":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.7.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.8":{"__typename":"Dropzone","index":3,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.9":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.9.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.10":{"__typename":"Dropzone","index":4,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.12":{"__typename":"Dropzone","index":5,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.14":{"__typename":"Dropzone","index":6,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15":{"__typename":"InteractiveBlock","size":"MEDIUM","media":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media","typename":"EmbeddedInteractive"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.16":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.16.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.17":{"__typename":"Dropzone","index":7,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.18":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.18.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.19":{"__typename":"Dropzone","index":8,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.20":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.20.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.21":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.21.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.22":{"__typename":"Dropzone","index":9,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.23":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.23.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.24":{"__typename":"Dropzone","index":10,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25":{"__typename":"InteractiveBlock","size":"MEDIUM","media":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media","typename":"EmbeddedInteractive"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.26":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.26.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.27":{"__typename":"Dropzone","index":11,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.28":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.28.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.29":{"__typename":"Dropzone","index":12,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.30":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.30.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.31":{"__typename":"Dropzone","index":13,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.32":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.32.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33":{"__typename":"InteractiveBlock","size":"MEDIUM","media":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media","typename":"EmbeddedInteractive"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.34":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.34.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.35":{"__typename":"Dropzone","index":14,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.36":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.36.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.37":{"__typename":"Dropzone","index":15,"bad":false,"adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.38":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.38.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.39":{"__typename":"Dropzone","index":16,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.40":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.40.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.41":{"__typename":"Dropzone","index":17,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.42":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.42.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.43":{"__typename":"Dropzone","index":18,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.44":{"__typename":"RelatedLinksBlock","displayStyle":"COMPACT","title":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.44.title.0","typename":"TextInline"}],"description":[],"related@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Article"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Article"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.45":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.45.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.46":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.46.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.47":{"__typename":"Dropzone","index":19,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.48":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.48.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.49":{"__typename":"Dropzone","index":20,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.50":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.50.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.51":{"__typename":"Dropzone","index":21,"bad":true,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52":{"__typename":"InteractiveBlock","size":"MEDIUM","media":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media","typename":"EmbeddedInteractive"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.54":{"__typename":"Dropzone","index":22,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.55":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.55.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.56":{"__typename":"Dropzone","index":23,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.2","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.3","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.4","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.58":{"__typename":"Dropzone","index":24,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.59":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.59.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60":{"__typename":"InteractiveBlock","size":"MEDIUM","media":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media","typename":"EmbeddedInteractive"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.61":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.61.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.62":{"__typename":"Dropzone","index":25,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.63":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.63.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.64":{"__typename":"Dropzone","index":26,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.65":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.65.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.66":{"__typename":"Dropzone","index":27,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.0","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.1","typename":"TextInline"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.2","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.68":{"__typename":"Dropzone","index":28,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.69":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.69.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.70":{"__typename":"Dropzone","index":29,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.71":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.71.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.72":{"__typename":"Dropzone","index":30,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.73":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.73.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.74":{"__typename":"Dropzone","index":31,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.75":{"__typename":"Heading2Block","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.75.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.76":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.76.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.77":{"__typename":"Dropzone","index":32,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.78":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.78.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.79":{"__typename":"Dropzone","index":33,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.80":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.80.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.81":{"__typename":"Dropzone","index":34,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.82":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.82.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.83":{"__typename":"Dropzone","index":35,"bad":false,"adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.84":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.84.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.85":{"__typename":"Dropzone","index":36,"bad":false,"adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.86":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.86.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.87":{"__typename":"Dropzone","index":37,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.88":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.88.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.89":{"__typename":"Dropzone","index":38,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.90":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.90.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.91":{"__typename":"Dropzone","index":39,"bad":false,"adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.92":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.92.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.93":{"__typename":"ParagraphBlock","textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.93.content.0","typename":"TextInline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody":{"content@filterEmpty":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.2","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.3","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.4","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.5","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.6","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.7","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.8","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.9","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.10","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.12","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.14","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.21","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.22","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.23","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.24","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.32","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.44","typename":"RelatedLinksBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.45","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.54","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.55","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.56","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.58","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.59","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.75","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.76","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.77","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.78","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.79","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.80","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.81","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.82","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.83","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.84","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.85","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.86","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.87","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.88","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.89","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.90","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.91","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.92","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.93","typename":"ParagraphBlock"}],"__typename":"DocumentBlock","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.0","typename":"HeaderBasicBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.1","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.2","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.3","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.4","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.5","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.6","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.7","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.8","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.9","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.10","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.11","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.12","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.13","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.14","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.15","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.16","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.17","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.18","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.19","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.20","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.21","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.22","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.23","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.24","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.25","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.26","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.27","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.28","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.29","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.30","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.31","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.32","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.33","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.34","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.35","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.36","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.37","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.38","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.39","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.40","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.41","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.42","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.43","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.44","typename":"RelatedLinksBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.45","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.46","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.47","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.48","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.49","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.50","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.51","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.52","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.53","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.54","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.55","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.56","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.57","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.58","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.59","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.60","typename":"InteractiveBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.61","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.62","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.63","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.64","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.65","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.66","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.67","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.68","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.69","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.70","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.71","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.72","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.73","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.74","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.75","typename":"Heading2Block"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.76","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.77","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.78","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.79","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.80","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.81","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.82","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.83","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.84","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.85","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.86","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.87","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.88","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.89","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.90","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.91","typename":"Dropzone"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.92","typename":"ParagraphBlock"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.93","typename":"ParagraphBlock"}]},"AdTargetingParam:si_sectionbusiness":{"key":"si_section","value":"business","__typename":"AdTargetingParam"},"AdTargetingParam:keywords":{"key":"keywords","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:templatearticle":{"key":"template","value":"article","__typename":"AdTargetingParam"},"AdTargetingParam:platweb":{"key":"plat","value":"web","__typename":"AdTargetingParam"},"AdTargetingParam:authnelsondschwartz":{"key":"auth","value":"nelsondschwartz","__typename":"AdTargetingParam"},"AdTargetingParam:typart,oak":{"key":"typ","value":"art,oak","__typename":"AdTargetingParam"},"AdTargetingParam:ednus":{"key":"edn","value":"us","__typename":"AdTargetingParam"},"AdTargetingParam:trend":{"key":"trend","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:desnationaldebtus,federalbudgetus,unitedstatespoliticsandgovernm,interestrates,unitedstatesdefenseandmilitary,unitedstateseconomy,federaltaxesus,usdollarcurrency,recessionanddepression":{"key":"des","value":"nationaldebtus,federalbudgetus,unitedstatespoliticsandgovernm,interestrates,unitedstatesdefenseandmilitary,unitedstateseconomy,federaltaxesus,usdollarcurrency,recessionanddepression","__typename":"AdTargetingParam"},"AdTargetingParam:pertrumpdonaldj":{"key":"per","value":"trumpdonaldj","__typename":"AdTargetingParam"},"AdTargetingParam:orgcongressionalbudgetoffice,federalreservesystem":{"key":"org","value":"congressionalbudgetoffice,federalreservesystem","__typename":"AdTargetingParam"},"AdTargetingParam:collpolitics,economy,business,amp":{"key":"coll","value":"politics,economy,business,amp","__typename":"AdTargetingParam"},"AdTargetingParam:gui":{"key":"gui","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:id100000006102576":{"key":"id","value":"100000006102576","__typename":"AdTargetingParam"},"AdTargetingParam:geo":{"key":"geo","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:col":{"key":"col","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:als_test1551234976794":{"key":"als_test","value":"1551234976794","__typename":"AdTargetingParam"},"AdTargetingParam:brandsensitivefalse":{"key":"brandsensitive","value":"false","__typename":"AdTargetingParam"},"AdTargetingParam:spon":{"key":"spon","value":"","__typename":"AdTargetingParam"},"AdTargetingParam:ledemedsznone":{"key":"ledemedsz","value":"none","__typename":"AdTargetingParam"},"AdTargetingParam:propnyt":{"key":"prop","value":"nyt","__typename":"AdTargetingParam"},"AdTargetingParam:sectionbusiness":{"key":"section","value":"business","__typename":"AdTargetingParam"},"AdTargetingParam:artlenlong":{"key":"artlen","value":"long","__typename":"AdTargetingParam"},"AdTargetingParam:emotionsfear,optimistic,interest,informed,hate,not_selfconfident,not_happiness,not_adventurous,not_inthemoodtospend,not_boredom,not_indulgent,not_nostalgic,not_love,not_amused,not_inspired":{"key":"emotions","value":"fear,optimistic,interest,informed,hate,not_selfconfident,not_happiness,not_adventurous,not_inthemoodtospend,not_boredom,not_indulgent,not_nostalgic,not_love,not_amused,not_inspired","__typename":"AdTargetingParam"},"AdTargetingParam:gscatneg_mastercard,gs_politics,gs_economy,gs_economy_misc,gs_finance,gs_politics_misc,gs_politics_american,gs_finance_loans,neg_hearts,gs_finance_tax,gv_safe":{"key":"gscat","value":"neg_mastercard,gs_politics,gs_economy,gs_economy_misc,gs_finance,gs_politics_misc,gs_politics_american,gs_finance_loans,neg_hearts,gs_finance_tax,gv_safe","__typename":"AdTargetingParam"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0":{"displayName":"Nelson D. Schwartz","__typename":"Person","url":"","contactDetails":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails","typename":"ContactDetails"},"legacyData":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.legacyData","typename":"PersonLegacyData"}},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0":{"creators":[{"type":"id","generated":true,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline","renderedRepresentation":"By Nelson D. Schwartz"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.displayProperties":{"fullBleedDisplayStyle":"","__typename":"CreativeWorkDisplayProperties","serveAsNyt4":false},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.0":{"__typename":"Subject","vernacular":"US National Debt","isAdvertisingBrandSensitive":false,"displayName":"National Debt (US)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.1":{"__typename":"Subject","vernacular":"Federal Budget","isAdvertisingBrandSensitive":false,"displayName":"Federal Budget (US)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.2":{"__typename":"Subject","vernacular":"US Politics","isAdvertisingBrandSensitive":false,"displayName":"United States Politics and Government"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.3":{"__typename":"Person","vernacular":"Donald Trump","isAdvertisingBrandSensitive":false,"displayName":"Trump, Donald J"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.4":{"__typename":"Subject","vernacular":"Interest rate","isAdvertisingBrandSensitive":false,"displayName":"Interest Rates"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.5":{"__typename":"Subject","vernacular":"US Military","isAdvertisingBrandSensitive":false,"displayName":"United States Defense and Military Forces"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.6":{"__typename":"Subject","vernacular":"US Economy","isAdvertisingBrandSensitive":false,"displayName":"United States Economy"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.7":{"__typename":"Subject","vernacular":"Federal Taxes","isAdvertisingBrandSensitive":false,"displayName":"Federal Taxes (US)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.8":{"__typename":"Subject","vernacular":"US Dollar","isAdvertisingBrandSensitive":false,"displayName":"US Dollar (Currency)"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.9":{"__typename":"Subject","vernacular":"Recession and Depression","isAdvertisingBrandSensitive":false,"displayName":"Recession and Depression"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.10":{"__typename":"Organization","vernacular":"Congressional Budget Office","isAdvertisingBrandSensitive":false,"displayName":"Congressional Budget Office"},"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.timesTags@filterEmpty.11":{"__typename":"Organization","vernacular":"Federal Reserve","isAdvertisingBrandSensitive":false,"displayName":"Federal Reserve System"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.headline":{"default":"As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military","__typename":"CreativeWorkHeadline","default@stripHtml":"As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military"},"Organization:T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=":{"id":"T3JnYW5pemF0aW9uOm55dDovL29yZ2FuaXphdGlvbi9jMjc5MTM4OC02YjE2LTVmZmQtYTExOS05NmVhY2IxOTg5YzE=","displayName":"New York Times","__typename":"Organization"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.printInformation":{"page":"1","section":"A","publicationDate":"2018-09-26T04:00:00.000Z","__typename":"PrintInformation","edition":"NewYork","headline@stripHtml":"What May Soon Exceed Cost of U.S. Military? Interest on U.S. Debt "},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.0":{"name":"mobile","stride":4,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.1":{"name":"desktop","stride":7,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.2":{"name":"mobileHoldout","stride":6,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.3":{"name":"desktopHoldout","stride":8,"threshold":3,"__typename":"SprinkledConfig"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled":{"configs":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.0","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.1","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.2","typename":"SprinkledConfig"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkled.configs.3","typename":"SprinkledConfig"}],"__typename":"SprinkledContent"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.0":{"__typename":"HeaderBasicBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.1":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.2":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.3":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.4":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.5":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.6":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.7":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.8":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.9":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.10":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.11":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.12":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.13":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.14":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.15":{"__typename":"InteractiveBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.16":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.17":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.18":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.19":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.20":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.21":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.22":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.23":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.24":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.25":{"__typename":"InteractiveBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.26":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.27":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.28":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.29":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.30":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.31":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.32":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.33":{"__typename":"InteractiveBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.34":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.35":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.36":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.37":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.38":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.39":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.40":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.41":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.42":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.43":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.44":{"__typename":"RelatedLinksBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.45":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.46":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.47":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.48":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.49":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.50":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.51":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.52":{"__typename":"InteractiveBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.53":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.54":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.55":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.56":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.57":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.58":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.59":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.60":{"__typename":"InteractiveBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.61":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.62":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.63":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.64":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.65":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.66":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.67":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.68":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.69":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.70":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.71":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.72":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.73":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.74":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.75":{"__typename":"Heading2Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.76":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.77":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.78":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.79":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.80":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.81":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.82":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.83":{"__typename":"Dropzone","adsMobile":true,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.84":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.85":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":true},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.86":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.87":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.88":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.89":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.90":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.91":{"__typename":"Dropzone","adsMobile":false,"adsDesktop":false},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.92":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content.93":{"__typename":"ParagraphBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0":{"name":"MASTER","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002Fmerlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg","height":380,"width":600,"name":"articleLarge","__typename":"ImageRendition"},"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002Fmerlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg","height":1296,"width":2048,"name":"superJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1":{"name":"SMALL_SQUARE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS0115DEBTS01-thumbStandard.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS0115DEBTS01-thumbLarge.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS0115DEBTS01-thumbStandard.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002F15DEBTS01-thumbStandard.jpg","height":75,"width":75,"name":"thumbStandard","__typename":"ImageRendition"},"ImageRendition:images20180915business15DEBTS0115DEBTS01-thumbLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002F15DEBTS01-thumbLarge.jpg","height":150,"width":150,"name":"thumbLarge","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2":{"name":"SIXTEEN_BY_NINE","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS0115DEBTS01-videoSixteenByNineJumbo1600.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS0115DEBTS01-videoSixteenByNineJumbo1600.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002F15DEBTS01-videoSixteenByNineJumbo1600.jpg","height":899,"width":1600,"name":"videoSixteenByNineJumbo1600","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3":{"name":"FACEBOOK","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS0115DEBTS01-facebookJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS0115DEBTS01-facebookJumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002F15DEBTS01-facebookJumbo.jpg","height":549,"width":1050,"name":"facebookJumbo","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4":{"name":"WATCH","renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS0115DEBTS01-watch308.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS0115DEBTS01-watch308.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002F15DEBTS01-watch308.jpg","height":348,"width":312,"name":"watch308","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia":{"crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.crops({\"renditionNames\":[\"thumbStandard\",\"thumbLarge\",\"watch308\",\"facebookJumbo\",\"videoSixteenByNineJumbo1600\",\"articleLarge\",\"superJumbo\"]}).4","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.promotionalMedia.caption":{"text":"Interest payments on the federal debt could surpass the Defense Department budget in 2023.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.headline":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.headline.content.0","typename":"TextInline"}],"__typename":"Heading1Block"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.headline.content.0":{"__typename":"TextInline","text@stripHtml":"As Debt Rises, the Government Will Soon Spend More on Interest Than on the Military","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.summary":{"textAlign":"LEFT","content":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.summary.content.0","typename":"TextInline"}],"__typename":"SummaryBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.summary.content.0":{"__typename":"TextInline","text":"Tax cuts, spending increases and higher interest rates could make it harder to respond to future recessions and deal with other needs.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.ledeMedia":{"__typename":"ImageBlock","size":"MEDIUM","media":{"type":"id","generated":false,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh","typename":"Image"}},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh":{"id":"SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh","imageType":"photo","url":"\u002Fimagepages\u002F2018\u002F09\u002F25\u002Fbusiness\u002F15DEBTS01.html","uri":"nyt:\u002F\u002Fimage\u002F6a332d63-8bb1-5a9b-bbc5-c3ebecf5001a","credit":"Jeon Heon-Kyun\u002FEPA, via Shutterstock","legacyHtmlCaption":"Interest payments on the federal debt could surpass the Defense Department budget in 2023.","crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]})":[{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1","typename":"ImageCrop"}],"caption":{"type":"id","generated":true,"id":"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.caption","typename":"TextOnlyDocumentBlock"},"__typename":"Image"},"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-popup.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002Fmerlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-popup.jpg","name":"popup","width":650,"height":411,"__typename":"ImageRendition"},"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-jumbo.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002Fmerlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-jumbo.jpg","name":"jumbo","width":1024,"height":648,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-popup.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-jumbo.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-superJumbo.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleInline.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F15\u002Fbusiness\u002F15DEBTS01\u002Fmerlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleInline.jpg","name":"articleInline","width":190,"height":120,"__typename":"ImageRendition"},"Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.crops({\"renditionNames\":[\"articleLarge\",\"jumbo\",\"superJumbo\",\"articleInline\",\"popup\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180915business15DEBTS01merlin_138209730_5f3b5746-4962-4207-a24f-aea644a8636f-articleInline.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Image:SW1hZ2U6bnl0Oi8vaW1hZ2UvNmEzMzJkNjMtOGJiMS01YTliLWJiYzUtYzNlYmVjZjUwMDFh.caption":{"text":"Interest payments on the federal debt could surpass the Defense Department budget in 2023.","__typename":"TextOnlyDocumentBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline":{"textAlign":"LEFT","hideHeadshots":false,"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline.bylines.0","typename":"Byline"}],"role@filterEmpty":[],"__typename":"BylineBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline.bylines.0":{"prefix":"By","creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.byline.bylines.0.creators.0":{"displayName":"Nelson D. Schwartz","bioUrl":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fnelson-d-schwartz","promotionalMedia":null,"__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.0.timestampBlock":{"timestamp":"2018-09-25T21:28:31.000Z","align":"LEFT","__typename":"TimestampBlock"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.1.content.0":{"__typename":"TextInline","text":"The federal government could soon pay more in interest on its debt than it spends on the military, Medicaid or children’s programs.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.3.content.0":{"__typename":"TextInline","text":"The run-up in borrowing costs is a one-two punch brought on by the need to finance a fast-growing budget deficit, worsened by tax cuts and steadily rising interest rates that will make the debt more expensive. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.5.content.0":{"__typename":"TextInline","text":"With less money coming in and more going toward interest, political leaders will find it harder to address pressing needs like fixing crumbling roads and bridges or to make emergency moves like pulling the economy out of future recessions.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.7.content.0":{"__typename":"TextInline","text":"Within a decade, more than $900 billion in interest payments will be due annually, easily outpacing spending on myriad other programs. Already the fastest-growing major government expense, the cost of interest is on track to hit $390 billion next year, nearly 50 percent more than in 2017, according to the Congressional Budget Office.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.9.content.0":{"__typename":"TextInline","text":"“It’s very much something to worry about,” said C. Eugene Steuerle, a fellow at the Urban Institute and a co-founder of the Urban-Brookings Tax Policy Center in Washington. “Everything else is getting squeezed.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.0":{"__typename":"TextInline","text":"Gradually rising interest rates would have made borrowing more expensive even without additional debt. But the tax cuts passed late last year have created a deeper hole, with the deficit increasing faster than expected. A budget bill ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.1":{"__typename":"TextInline","text":"approved in February that raised","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.1.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.1.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.nytimes.com\u002F2018\u002F02\u002F08\u002Fus\u002Fpolitics\u002Fcongress-budget-deal-vote.html","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.11.content.2":{"__typename":"TextInline","text":" spending by $300 billion over two years will add to the financial pressure. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.0":{"__typename":"TextInline","text":"The deficit is expected to total nearly $1 trillion next year — the first time it has been that big ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.1":{"__typename":"TextInline","text":"since 2012","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.13.content.2":{"__typename":"TextInline","text":", when the economy was still struggling to recover from the financial crisis and interest rates were near zero. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media":{"__typename":"EmbeddedInteractive","slug":"interest-on-national-debt","html":"\n\u003C!-- Generated by ai2html v0.74.0 - 2018-09-14 15:18 --\u003E\n\u003C!-- ai file: 0916 biz web DEBT CHART 1.ai --\u003E\n\u003C!-- preview: 2018-09-14-interest-on-national-debt --\u003E\n\u003C!-- scoop: interest-on-national-debt --\u003E\n\u003Cstyle type='text\u002Fcss' media='screen,print'\u003E\n\t#g-0916-biz-web-DEBT-CHART-1-box .g-artboard {\n\t\tmargin:0 auto;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-box .g-artboard p {\n\t\tmargin:0;\n\t}\n\t.g-aiAbs {\n\t\tposition:absolute;\n\t}\n\t.g-aiImg {\n\t\tdisplay:block;\n\t\twidth:100% !important;\n\t}\n\t.g-aiSymbol {\n\t\tposition: absolute;\n\t\tbox-sizing: border-box;\n\t}\n\t.g-aiPointText p { white-space: nowrap; }\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:600px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:700;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle0 {\n\t\tline-height:16px;\n\t\theight:16px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle1 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle2 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle3 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_2 .g-pstyle4 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:300px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:700;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle0 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle1 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle2 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle3 {\n\t\tline-height:16px;\n\t\theight:16px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-1-Artboard_3 .g-pstyle4 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\n\u003C\u002Fstyle\u003E\n\n\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-1-box\" class=\"ai2html ai2html-box-v5\"\u003E\n\n\t\u003C!-- Artboard: Artboard_2 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-1-Artboard_2\" class=\"g-artboard\" data-aspect-ratio=\"1.382\" data-min-width=\"600\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-1-Artboard_2-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Finterest-on-national-debt\u002F313e919f83bb85b62966d7f70121c5f3f3ea740b\u002F0916-biz-web-DEBT-CHART-1-Artboard_2.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai0-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.8869%;margin-top:-16.2px;left:96.5906%;margin-left:-30px;width:60px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E$915\u003C\u002Fp\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E billion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.0838%;width:243px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003EInterest payments on the national debt\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:94.9386%;width:52px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E$900\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:5.4133%;width:55px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003Ebillion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:34.841%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E600\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:60.4108%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E300\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:70.9998%;margin-top:-16.2px;left:5.8153%;margin-left:-30px;width:60px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E$263\u003C\u002Fp\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E billion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:6.1605%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;17\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:14.4067%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:22.6527%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;19\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:30.9281%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;20\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:39.1744%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;21\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:47.4205%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;22\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:55.6667%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;23\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:63.9128%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;24\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:72.1591%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;25\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:80.4054%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;26\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:88.6513%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;27\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-20\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:96.8975%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;28\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\t\u003C!-- Artboard: Artboard_3 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-1-Artboard_3\" class=\"g-artboard\" data-aspect-ratio=\"0.691\" data-min-width=\"300\" data-max-width=\"599\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-1-Artboard_3-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Finterest-on-national-debt\u002F313e919f83bb85b62966d7f70121c5f3f3ea740b\u002F0916-biz-web-DEBT-CHART-1-Artboard_3.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai1-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.2844%;width:243px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EInterest payments on the national debt\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:90.0367%;width:52px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E$900\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:10.6594%;width:55px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003Ebillion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:17.787%;margin-top:-16.2px;left:90.6989%;margin-left:-30px;width:60px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E$915\u003C\u002Fp\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E billion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:34.841%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E600\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:60.4108%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E300\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:71.2301%;margin-top:-16.2px;left:10.5497%;margin-left:-30px;width:60px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E$263\u003C\u002Fp\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E billion\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:10.8422%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;17\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:18.0987%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:25.3552%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;19\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:32.6703%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;20\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:39.9268%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;21\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:47.1836%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;22\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:54.4401%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;23\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:61.6967%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;24\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:68.9535%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;25\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:76.2102%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;26\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:83.4665%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;27\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-20\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:90.7234%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;28\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cscript type=\"text\u002Fjavascript\"\u003E\n\t(function (scriptEnvironment, nameSpace) {\n\t\t\u002F\u002F Use a sentinel class to ensure that this version of the resizer only initializes once\n\t\tif (document.documentElement.className.indexOf(nameSpace + \"resizer-v5-init\") \u003E -1) return;\n\t\tdocument.documentElement.className += \" \" + nameSpace + \"resizer-v5-init\";\n\t\t\u002F\u002F requires IE9+\n\t\tif (!(\"querySelector\" in document)) return;\n\t\tvar observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;\n\t\tvar visibilityIndex = {}; \u002F\u002F visibility of each graphic, indexed by container id (used with InteractionObserver)\n\n\t\tupdateAllGraphics();\n\t\twindow.addEventListener('nyt:embed:load', updateAllGraphics); \u002F\u002F for nyt vi compatibility\n\t\tdocument.addEventListener(\"DOMContentLoaded\", updateAllGraphics);\n\t\twindow.addEventListener(\"resize\", throttle(updateAllGraphics, 200));\n\n\t\tfunction updateAllGraphics() {\n\t\t\tselectElements(\".ai2html-box-v5\").forEach(updateGraphic);\n\t\t\tif (scriptEnvironment == \"nyt-preview\") {\n\t\t\t\tnytOnResize();\n\t\t\t}\n\t\t}\n\n\t\tfunction updateGraphic(container) {\n\t\t\tvar artboards = selectElements(\".\" + nameSpace + \"artboard[data-min-width]\", container),\n\t\t\t\t\twidth = Math.round(container.getBoundingClientRect().width),\n\t\t\t\t\tid = container.id, \u002F\u002F assume container has an id\n\t\t\t\t\tshowImages = !observer || visibilityIndex[id] == 'visible';\n\n\t\t\t\u002F\u002F Set artboard visibility based on container width\n\t\t\tartboards.forEach(function(el) {\n\t\t\t\tvar minwidth = el.getAttribute(\"data-min-width\"),\n\t\t\t\t\t\tmaxwidth = el.getAttribute(\"data-max-width\");\n\t\t\t\tif (+minwidth \u003C= width && (+maxwidth \u003E= width || maxwidth === null)) {\n\t\t\t\t\tif (showImages) {\n\t\t\t\t\t\tselectElements(\".\" + nameSpace + \"aiImg\", el).forEach(updateImgSrc);\n\t\t\t\t\t}\n\t\t\t\t\tel.style.display = \"block\";\n\t\t\t\t} else {\n\t\t\t\t\tel.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t\u002F\u002F Initialize lazy loading on first call, if IntersectionObserver is available\n\t\t\tif (observer && !visibilityIndex[id]) {\n\t\t\t\tif (containerIsVisible(container)) {\n\t\t\t\t\t\u002F\u002F Skip IntersectionObserver if graphic is initially visible\n\t\t\t\t\t\u002F\u002F Note: We're doing this after artboard visibility is first calculated\n\t\t\t\t\t\u002F\u002F\t (above) -- otherwise all artboard images are display:block and the\n\t\t\t\t\t\u002F\u002F\t calculated height of the graphic is huge.\n\t\t\t\t\t\u002F\u002F TODO: Consider making artboard images position:absolute and setting\n\t\t\t\t\t\u002F\u002F\t height as a padding % (calculated from the aspect ratio of the graphic).\n\t\t\t\t\t\u002F\u002F\t This will correctly set the initial height of the graphic before\n\t\t\t\t\t\u002F\u002F\t an image is loaded.\n\t\t\t\t\tvisibilityIndex[id] = 'visible';\n\t\t\t\t\tupdateGraphic(container); \u002F\u002F Call again to start loading right away\n\t\t\t\t} else {\n\t\t\t\t\tvisibilityIndex[id] = 'hidden';\n\t\t\t\t\tobserver.observe(container);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction containerIsVisible(container) {\n\t\t\tvar bounds = container.getBoundingClientRect();\n\t\t\treturn bounds.top \u003C window.innerHeight && bounds.bottom \u003E 0;\n\t\t}\n\n\t\t\u002F\u002F Replace blank placeholder image with actual image\n\t\t\u002F\u002F (only relevant if use_lazy_loader option is true)\n\t\tfunction updateImgSrc(img) {\n\t\t\tvar src = img.getAttribute(\"data-src\");\n\t\t\tif (src && img.getAttribute(\"src\") != src) {\n\t\t\t\timg.setAttribute(\"src\", src);\n\t\t\t}\n\t\t}\n\n\t\tfunction onIntersectionChange(entries) {\n\t\t\tentries.forEach(function(entry) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tvisibilityIndex[entry.target.id] = 'visible';\n\t\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t\t\tupdateGraphic(entry.target);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction selectElements(selector, parent) {\n\t\t\tvar selection = (parent || document).querySelectorAll(selector);\n\t\t\treturn Array.prototype.slice.call(selection);\n\t\t}\n\n\t\tfunction nytOnResize() {\n\t\t\t\u002F\u002F TODO: add comments\n\t\t\ttry {\n\t\t\t\tif (window.parent && window.parent.$) {\n\t\t\t\t\twindow.parent.$(\"body\").trigger(\"resizedcontent\", [window]);\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"resizedcontent\"));\n\t\t\t\tif (window.require && document.querySelector(\"meta[name=sourceApp]\") && document.querySelector(\"meta[name=sourceApp]\").content == \"nyt-v5\") {\n\t\t\t\t\trequire([\"foundation\u002Fmain\"], function() {\n\t\t\t\t\t\trequire([\"shared\u002Finteractive\u002Finstances\u002Fapp-communicator\"], function(AppCommunicator) {\n\t\t\t\t\t\t\tAppCommunicator.triggerResize();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch(e) { console.log(e); }\n\t\t}\n\n\t\t\u002F\u002F based on underscore.js\n\t\tfunction throttle(func, wait) {\n\t\t\tvar _now = Date.now || function() { return +new Date(); },\n\t\t\t\t\ttimeout = null, previous = 0;\n\t\t\tvar run = function() {\n\t\t\t\t\tprevious = _now();\n\t\t\t\t\ttimeout = null;\n\t\t\t\t\tfunc();\n\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar remaining = wait - (_now() - previous);\n\t\t\t\tif (remaining \u003C= 0 || remaining \u003E wait) {\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t}\n\t\t\t\t\trun();\n\t\t\t\t} else if (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(run, remaining);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t})(\"nyt-preview\", \"g-\");\n\u003C\u002Fscript\u003E\n\u003C!-- End ai2html - 2018-09-14 15:18 --\u003E\n\u003C!-- Pipeline: 2018-09-14-interest-on-national-debt | September 14, 2018, 03:20PM | 313e919f83bb85b62966d7f70121c5f3f3ea740b --\u003E\n","compatibility":"INLINE","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.headline","typename":"CreativeWorkHeadline"},"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.displayProperties","typename":"CreativeWorkDisplayProperties"},"bylines":[],"sourceId":"100000006106654","credit":"By The New York Times | Source: Congressional Budget Office","leadin":"Annual interest payments on the national debt are expected to triple over the next decade, according to the Congressional Budget Office.","note":"","dataSource":"","uri":"nyt:\u002F\u002Fembeddedinteractive\u002F0cea6231-99b4-5b9a-851a-a2a290fb15e8","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.headline":{"default":"Interest on the National Debt","__typename":"CreativeWorkHeadline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.displayProperties":{"displayForPromotionOnly":true,"maximumWidth":600,"minimumWidth":300,"__typename":"CreativeWorkDisplayProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia":{"__typename":"Image","caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4","typename":"ImageCrop"}],"promotionalMedia":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.caption":{"text@stripHtml":"","__typename":"TextOnlyDocumentBlock"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-articleLarge.png":{"name":"articleLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-articleLarge.png","width":600,"height":434,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-articleLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-thumbLarge.png":{"name":"thumbLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-thumbLarge.png","width":150,"height":150,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-thumbLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-square640.png":{"name":"square640","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-square640.png","width":640,"height":640,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-square640.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-largeHorizontalJumbo.png":{"name":"largeHorizontalJumbo","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-largeHorizontalJumbo.png","width":1024,"height":683,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-largeHorizontalJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-videoLarge.png":{"name":"videoLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-videoLarge.png","width":768,"height":507,"__typename":"ImageRendition"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoLargeAt2X.png":{"name":"threeByTwoLargeAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-threeByTwoLargeAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoMediumAt2X.png":{"name":"threeByTwoMediumAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-threeByTwoMediumAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoSmallAt2X.png":{"name":"threeByTwoSmallAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Finterest-on-national-debt-1536943625607\u002Finterest-on-national-debt-1536943625607-threeByTwoSmallAt2X.png","width":600,"height":400,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.15.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessinterest-on-national-debt-1536943625607interest-on-national-debt-1536943625607-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.16.content.0":{"__typename":"TextInline","text":"Deficit hawks have gone silent, even proposing changes that would exacerbate the deficit. House Republicans introduced legislation this month that would make the tax cuts permanent.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.18.content.0":{"__typename":"TextInline","text":"“The issue has just disappeared,” said Senator Mark Warner, a Virginia Democrat. “There’s collective amnesia.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.20.content.0":{"__typename":"TextInline","text":"The combination, say economists, marks a journey into mostly uncharted financial territory.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.21.content.0":{"__typename":"TextInline","text":"In the past, government borrowing expanded during recessions and waned in recoveries. That countercyclical policy has been a part of the standard Keynesian toolbox to combat downturns since the Great Depression.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.23.content.0":{"__typename":"TextInline","text":"The deficit is soaring now as the economy booms, meaning the stimulus is pro-cyclical. The risk is that the government would have less room to maneuver if the economy slows.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media":{"__typename":"EmbeddedInteractive","slug":"debt-as-a-share-of-gdp","html":"\u003C!-- Generated by ai2html v0.74.0 - 2018-09-14 13:34 --\u003E\r\n\u003C!-- ai file: 0916 biz web DEBT CHART 2.ai --\u003E\r\n\u003C!-- preview: 2018-09-14-debt-as-a-share-of-gdp --\u003E\r\n\u003Cstyle type='text\u002Fcss' media='screen,print'\u003E\r\n\t#g-0916-biz-web-DEBT-CHART-2-box .g-artboard {\r\n\t\tmargin:0 auto;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-box .g-artboard p {\r\n\t\tmargin:0;\r\n\t}\r\n\t.g-aiAbs {\r\n\t\tposition:absolute;\r\n\t}\r\n\t.g-aiImg {\r\n\t\tdisplay:block;\r\n\t\twidth:100% !important;\r\n\t}\r\n\t.g-aiSymbol {\r\n\t\tposition: absolute;\r\n\t\tbox-sizing: border-box;\r\n\t}\r\n\t.g-aiPointText p { white-space: nowrap; }\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 {\r\n\t\tposition:relative;\r\n\t\toverflow:hidden;\r\n\t\twidth:600px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 p {\r\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\r\n\t\tfont-weight:700;\r\n\t\tfont-size:13px;\r\n\t\tline-height:18px;\r\n\t\theight:auto;\r\n\t\tfilter:alpha(opacity=100);\r\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\r\n\t\topacity:1;\r\n\t\tletter-spacing:0em;\r\n\t\ttext-align:left;\r\n\t\tcolor:rgb(51,51,51);\r\n\t\ttext-transform:none;\r\n\t\tpadding-bottom:0;\r\n\t\tpadding-top:0;\r\n\t\tmix-blend-mode:normal;\r\n\t\tfont-style:normal;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle0 {\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle1 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t\ttext-align:right;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle2 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle3 {\r\n\t\tfont-weight:500;\r\n\t\tfont-size:11px;\r\n\t\theight:18px;\r\n\t\ttext-align:center;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle4 {\r\n\t\tfont-weight:500;\r\n\t\tfont-size:11px;\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_2 .g-pstyle5 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t\ttext-align:center;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 {\r\n\t\tposition:relative;\r\n\t\toverflow:hidden;\r\n\t\twidth:300px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 p {\r\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\r\n\t\tfont-weight:700;\r\n\t\tfont-size:13px;\r\n\t\tline-height:18px;\r\n\t\theight:auto;\r\n\t\tfilter:alpha(opacity=100);\r\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\r\n\t\topacity:1;\r\n\t\tletter-spacing:0em;\r\n\t\ttext-align:left;\r\n\t\tcolor:rgb(51,51,51);\r\n\t\ttext-transform:none;\r\n\t\tpadding-bottom:0;\r\n\t\tpadding-top:0;\r\n\t\tmix-blend-mode:normal;\r\n\t\tfont-style:normal;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle0 {\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle1 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t\ttext-align:right;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle2 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle3 {\r\n\t\tfont-weight:500;\r\n\t\tfont-size:11px;\r\n\t\theight:18px;\r\n\t}\r\n\t#g-0916-biz-web-DEBT-CHART-2-Artboard_3 .g-pstyle4 {\r\n\t\tfont-weight:500;\r\n\t\theight:18px;\r\n\t\ttext-align:center;\r\n\t}\r\n\r\n\u003C\u002Fstyle\u003E\r\n\r\n\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-2-box\" class=\"ai2html ai2html-box-v5\"\u003E\r\n\r\n\t\u003C!-- Artboard: Artboard_2 --\u003E\r\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-2-Artboard_2\" class=\"g-artboard\" data-aspect-ratio=\"1.382\" data-min-width=\"600\"\u003E\r\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-2-Artboard_2-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fdebt-as-a-share-of-gdp\u002Fdad2c5186b9c0b968d766fa279d9ed6b76ce776b\u002F0916-biz-web-DEBT-CHART-2-Artboard_2.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.0838%;width:299px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EPublic debt as a share of gross domestic product\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E100\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:16.8643%;margin-top:-9.2px;left:23.0468%;margin-left:-42.5px;width:85px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003ERECESSIONS\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:16.8643%;margin-top:-9.2px;left:78.0253%;width:79px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003EPROJECTED\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:24.7052%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E80\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:39.9089%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E60\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:55.3429%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E40\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:70.5466%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E20\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:8.5381%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;78\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:12.2413%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;80\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:29.7156%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;90\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:47.1898%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;00\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:64.635%;margin-left:-19.5px;width:39px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;10\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:82.1384%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;20\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai0-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:96.0294%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle5\"\u003E&rsquo;28\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\u003C\u002Fdiv\u003E\r\n\r\n\t\u003C!-- Artboard: Artboard_3 --\u003E\r\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-2-Artboard_3\" class=\"g-artboard\" data-aspect-ratio=\"0.691\" data-min-width=\"300\" data-max-width=\"599\"\u003E\r\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-2-Artboard_3-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fdebt-as-a-share-of-gdp\u002Fdad2c5186b9c0b968d766fa279d9ed6b76ce776b\u002F0916-biz-web-DEBT-CHART-2-Artboard_3.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.2844%;width:299px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EPublic debt as a share of gross domestic product\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E100\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:24.7052%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E80\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:39.9089%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E60\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:55.3429%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E40\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:70.5465%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E20\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:80.4432%;margin-top:-9.2px;left:22.2287%;width:85px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003ERECESSIONS\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:80.4432%;margin-top:-9.2px;left:74.1042%;width:79px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003EPROJECTED\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:16.2259%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;80\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:31.6032%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;90\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:46.9805%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;00\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:62.2997%;margin-left:-19.5px;width:39px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;10\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:77.7354%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;20\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\t\u003Cdiv id=\"g-ai1-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:89.9593%;margin-left:-20px;width:40px;\"\u003E\r\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;28\u003C\u002Fp\u003E\r\n\t\t\u003C\u002Fdiv\u003E\r\n\t\u003C\u002Fdiv\u003E\r\n\r\n\u003C\u002Fdiv\u003E\r\n\r\n\u003Cscript type=\"text\u002Fjavascript\"\u003E\r\n\t(function (scriptEnvironment, nameSpace) {\r\n\t\t\u002F\u002F Use a sentinel class to ensure that this version of the resizer only initializes once\r\n\t\tif (document.documentElement.className.indexOf(nameSpace + \"resizer-v5-init\") \u003E -1) return;\r\n\t\tdocument.documentElement.className += \" \" + nameSpace + \"resizer-v5-init\";\r\n\t\t\u002F\u002F requires IE9+\r\n\t\tif (!(\"querySelector\" in document)) return;\r\n\t\tvar observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;\r\n\t\tvar visibilityIndex = {}; \u002F\u002F visibility of each graphic, indexed by container id (used with InteractionObserver)\r\n\r\n\t\tupdateAllGraphics();\r\n\t\twindow.addEventListener('nyt:embed:load', updateAllGraphics); \u002F\u002F for nyt vi compatibility\r\n\t\tdocument.addEventListener(\"DOMContentLoaded\", updateAllGraphics);\r\n\t\twindow.addEventListener(\"resize\", throttle(updateAllGraphics, 200));\r\n\r\n\t\tfunction updateAllGraphics() {\r\n\t\t\tselectElements(\".ai2html-box-v5\").forEach(updateGraphic);\r\n\t\t\tif (scriptEnvironment == \"nyt-preview\") {\r\n\t\t\t\tnytOnResize();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction updateGraphic(container) {\r\n\t\t\tvar artboards = selectElements(\".\" + nameSpace + \"artboard[data-min-width]\", container),\r\n\t\t\t\t\twidth = Math.round(container.getBoundingClientRect().width),\r\n\t\t\t\t\tid = container.id, \u002F\u002F assume container has an id\r\n\t\t\t\t\tshowImages = !observer || visibilityIndex[id] == 'visible';\r\n\r\n\t\t\t\u002F\u002F Set artboard visibility based on container width\r\n\t\t\tartboards.forEach(function(el) {\r\n\t\t\t\tvar minwidth = el.getAttribute(\"data-min-width\"),\r\n\t\t\t\t\t\tmaxwidth = el.getAttribute(\"data-max-width\");\r\n\t\t\t\tif (+minwidth \u003C= width && (+maxwidth \u003E= width || maxwidth === null)) {\r\n\t\t\t\t\tif (showImages) {\r\n\t\t\t\t\t\tselectElements(\".\" + nameSpace + \"aiImg\", el).forEach(updateImgSrc);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tel.style.display = \"block\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tel.style.display = \"none\";\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t\u002F\u002F Initialize lazy loading on first call, if IntersectionObserver is available\r\n\t\t\tif (observer && !visibilityIndex[id]) {\r\n\t\t\t\tif (containerIsVisible(container)) {\r\n\t\t\t\t\t\u002F\u002F Skip IntersectionObserver if graphic is initially visible\r\n\t\t\t\t\t\u002F\u002F Note: We're doing this after artboard visibility is first calculated\r\n\t\t\t\t\t\u002F\u002F\t (above) -- otherwise all artboard images are display:block and the\r\n\t\t\t\t\t\u002F\u002F\t calculated height of the graphic is huge.\r\n\t\t\t\t\t\u002F\u002F TODO: Consider making artboard images position:absolute and setting\r\n\t\t\t\t\t\u002F\u002F\t height as a padding % (calculated from the aspect ratio of the graphic).\r\n\t\t\t\t\t\u002F\u002F\t This will correctly set the initial height of the graphic before\r\n\t\t\t\t\t\u002F\u002F\t an image is loaded.\r\n\t\t\t\t\tvisibilityIndex[id] = 'visible';\r\n\t\t\t\t\tupdateGraphic(container); \u002F\u002F Call again to start loading right away\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvisibilityIndex[id] = 'hidden';\r\n\t\t\t\t\tobserver.observe(container);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction containerIsVisible(container) {\r\n\t\t\tvar bounds = container.getBoundingClientRect();\r\n\t\t\treturn bounds.top \u003C window.innerHeight && bounds.bottom \u003E 0;\r\n\t\t}\r\n\r\n\t\t\u002F\u002F Replace blank placeholder image with actual image\r\n\t\t\u002F\u002F (only relevant if use_lazy_loader option is true)\r\n\t\tfunction updateImgSrc(img) {\r\n\t\t\tvar src = img.getAttribute(\"data-src\");\r\n\t\t\tif (src && img.getAttribute(\"src\") != src) {\r\n\t\t\t\timg.setAttribute(\"src\", src);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction onIntersectionChange(entries) {\r\n\t\t\tentries.forEach(function(entry) {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tvisibilityIndex[entry.target.id] = 'visible';\r\n\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\tupdateGraphic(entry.target);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction selectElements(selector, parent) {\r\n\t\t\tvar selection = (parent || document).querySelectorAll(selector);\r\n\t\t\treturn Array.prototype.slice.call(selection);\r\n\t\t}\r\n\r\n\t\tfunction nytOnResize() {\r\n\t\t\t\u002F\u002F TODO: add comments\r\n\t\t\ttry {\r\n\t\t\t\tif (window.parent && window.parent.$) {\r\n\t\t\t\t\twindow.parent.$(\"body\").trigger(\"resizedcontent\", [window]);\r\n\t\t\t\t}\r\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"resizedcontent\"));\r\n\t\t\t\tif (window.require && document.querySelector(\"meta[name=sourceApp]\") && document.querySelector(\"meta[name=sourceApp]\").content == \"nyt-v5\") {\r\n\t\t\t\t\trequire([\"foundation\u002Fmain\"], function() {\r\n\t\t\t\t\t\trequire([\"shared\u002Finteractive\u002Finstances\u002Fapp-communicator\"], function(AppCommunicator) {\r\n\t\t\t\t\t\t\tAppCommunicator.triggerResize();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} catch(e) { console.log(e); }\r\n\t\t}\r\n\r\n\t\t\u002F\u002F based on underscore.js\r\n\t\tfunction throttle(func, wait) {\r\n\t\t\tvar _now = Date.now || function() { return +new Date(); },\r\n\t\t\t\t\ttimeout = null, previous = 0;\r\n\t\t\tvar run = function() {\r\n\t\t\t\t\tprevious = _now();\r\n\t\t\t\t\ttimeout = null;\r\n\t\t\t\t\tfunc();\r\n\t\t\t};\r\n\t\t\treturn function() {\r\n\t\t\t\tvar remaining = wait - (_now() - previous);\r\n\t\t\t\tif (remaining \u003C= 0 || remaining \u003E wait) {\r\n\t\t\t\t\tif (timeout) {\r\n\t\t\t\t\t\tclearTimeout(timeout);\r\n\t\t\t\t\t}\r\n\t\t\t\t\trun();\r\n\t\t\t\t} else if (!timeout) {\r\n\t\t\t\t\ttimeout = setTimeout(run, remaining);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t})(\"nyt-preview\", \"g-\");\r\n\u003C\u002Fscript\u003E\r\n\u003C!-- End ai2html - 2018-09-14 13:34 --\u003E\r\n\u003C!-- Pipeline: 2018-09-14-debt-as-a-share-of-gdp | September 14, 2018, 01:34PM | dad2c5186b9c0b968d766fa279d9ed6b76ce776b --\u003E\r\n","compatibility":"INLINE","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.headline","typename":"CreativeWorkHeadline"},"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.displayProperties","typename":"CreativeWorkDisplayProperties"},"bylines":[],"sourceId":"100000006106750","credit":"By The New York Times | Source: Congressional Budget Office","leadin":"Debt as a percentage of gross domestic product tends to increase during recessions and fall during recoveries. But the debt is increasing now, even as the economy is growing, because of tax cuts and spending increases.","note":"","dataSource":"","uri":"nyt:\u002F\u002Fembeddedinteractive\u002F1f511369-8957-5aa0-88ec-346220864536","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.headline":{"default":"Debt as a Share of G.D.P.","__typename":"CreativeWorkHeadline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.displayProperties":{"displayForPromotionOnly":true,"maximumWidth":600,"minimumWidth":300,"__typename":"CreativeWorkDisplayProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia":{"__typename":"Image","caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4","typename":"ImageCrop"}],"promotionalMedia":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.caption":{"text@stripHtml":"","__typename":"TextOnlyDocumentBlock"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-articleLarge.png":{"name":"articleLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-articleLarge.png","width":600,"height":434,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-articleLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-thumbLarge.png":{"name":"thumbLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-thumbLarge.png","width":150,"height":150,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-thumbLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-square640.png":{"name":"square640","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-square640.png","width":640,"height":640,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-square640.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-largeHorizontalJumbo.png":{"name":"largeHorizontalJumbo","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-largeHorizontalJumbo.png","width":1024,"height":683,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-largeHorizontalJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-videoLarge.png":{"name":"videoLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-videoLarge.png","width":768,"height":507,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoLargeAt2X.png":{"name":"threeByTwoLargeAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-threeByTwoLargeAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoMediumAt2X.png":{"name":"threeByTwoMediumAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-threeByTwoMediumAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoSmallAt2X.png":{"name":"threeByTwoSmallAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdebt-as-a-share-of-gdp-1536946401142\u002Fdebt-as-a-share-of-gdp-1536946401142-threeByTwoSmallAt2X.png","width":600,"height":400,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.25.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdebt-as-a-share-of-gdp-1536946401142debt-as-a-share-of-gdp-1536946401142-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.26.content.0":{"__typename":"TextInline","text":"Aside from wartime or a deep downturn like the 1930s or 2008-9, “this sort of aggressive fiscal stimulus is unprecedented in U.S. history,” said Jeffrey Frankel, an economist at Harvard.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.28.content.0":{"__typename":"TextInline","text":"Pouring gasoline on an already hot economy has resulted in faster growth — the economy expanded at an annualized rate of 4.2 percent in the second quarter. But Mr. Frankel warns that when the economy weakens, the government will find it more difficult to cut taxes or increase spending.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.30.content.0":{"__typename":"TextInline","text":"Lawmakers might, in fact, feel compelled to cut spending as tax revenue falls, further depressing the economy. “There will eventually be another recession, and this increases the chances we will have to slam on the brakes when the car is already going too slowly,” Mr. Frankel said.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.32.content.0":{"__typename":"TextInline","text":"Interest costs make it harder for the government to do other things","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media":{"__typename":"EmbeddedInteractive","slug":"expenditures-as-a-share-of-national-budget","html":"\n\u003C!-- Generated by ai2html v0.74.0 - 2018-09-14 14:03 --\u003E\n\u003C!-- ai file: 0916 biz web DEBT CHART 3.ai --\u003E\n\u003C!-- preview: 2018-09-14-expenditures-as-a-share-of-national-budget --\u003E\n\u003C!-- scoop: expenditures-as-a-share-of-national-budget --\u003E\n\u003Cstyle type='text\u002Fcss' media='screen,print'\u003E\n\t#g-0916-biz-web-DEBT-CHART-3-box .g-artboard {\n\t\tmargin:0 auto;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-box .g-artboard p {\n\t\tmargin:0;\n\t}\n\t.g-aiAbs {\n\t\tposition:absolute;\n\t}\n\t.g-aiImg {\n\t\tdisplay:block;\n\t\twidth:100% !important;\n\t}\n\t.g-aiSymbol {\n\t\tposition: absolute;\n\t\tbox-sizing: border-box;\n\t}\n\t.g-aiPointText p { white-space: nowrap; }\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:600px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:700;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle0 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle1 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle2 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle3 {\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_2 .g-pstyle4 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:300px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:700;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle0 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle1 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle2 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle3 {\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-3-Artboard_3 .g-pstyle4 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\n\u003C\u002Fstyle\u003E\n\n\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-3-box\" class=\"ai2html ai2html-box-v5\"\u003E\n\n\t\u003C!-- Artboard: Artboard_2 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-3-Artboard_2\" class=\"g-artboard\" data-aspect-ratio=\"1.382\" data-min-width=\"600\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-3-Artboard_2-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fexpenditures-as-a-share-of-national-budget\u002F3311a2358867f7423b4d30b424829c1ff1228a7a\u002F0916-biz-web-DEBT-CHART-3-Artboard_2.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai0-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.0838%;width:258px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EExpenditures as a share of overall budget\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E15\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:17.5566%;margin-top:-9.2px;left:81.708%;width:90px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003ENet interest\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:17.5566%;margin-top:-9.2px;left:96.8984%;margin-left:-29.5px;width:59px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E13.0%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:33.6891%;margin-top:-9.2px;left:81.708%;width:67px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003EDefense\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:34.841%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:43.825%;margin-top:-9.2px;left:81.708%;width:72px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003EMedicaid\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:50.0371%;margin-top:-9.2px;left:6.8178%;margin-left:-26px;width:52px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003E6.6%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:60.4108%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E5\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:6.0116%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;17\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:14.2578%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:22.5039%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;19\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:30.7793%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;20\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:39.0255%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;21\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:47.2716%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;22\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:55.5179%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;23\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:63.764%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;24\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-20\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:72.0103%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;25\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-21\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:80.2565%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;26\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-22\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:88.5024%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;27\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-23\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:96.7487%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;28\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\t\u003C!-- Artboard: Artboard_3 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-3-Artboard_3\" class=\"g-artboard\" data-aspect-ratio=\"0.691\" data-min-width=\"300\" data-max-width=\"599\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-3-Artboard_3-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fexpenditures-as-a-share-of-national-budget\u002F3311a2358867f7423b4d30b424829c1ff1228a7a\u002F0916-biz-web-DEBT-CHART-3-Artboard_3.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai1-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.2844%;width:258px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EExpenditures as a share of overall budget\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E15\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:17.5566%;margin-top:-9.2px;right:13.9762%;width:90px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003ENet interest\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:17.5566%;margin-top:-9.2px;left:87.5494%;width:59px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E13.0%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:33.6892%;margin-top:-9.2px;right:14.1158%;width:67px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003EDefense\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:34.841%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:44.2857%;margin-top:-9.2px;right:14.0525%;width:72px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003EMedicaid\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:56.0265%;margin-top:-9.2px;left:13.3422%;width:52px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003E6.6%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:60.4108%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E5\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:10.7111%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;17\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:17.9678%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:25.2243%;margin-left:-19.5px;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;19\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:32.5394%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;20\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:39.7959%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;21\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:47.0526%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;22\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:54.3093%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;23\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:61.5658%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;24\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-20\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:68.8225%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;25\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-21\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:76.0791%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;26\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-22\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:83.3357%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;27\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-23\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.9699%;margin-top:-9.2px;left:90.5923%;margin-left:-20px;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;28\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cscript type=\"text\u002Fjavascript\"\u003E\n\t(function (scriptEnvironment, nameSpace) {\n\t\t\u002F\u002F Use a sentinel class to ensure that this version of the resizer only initializes once\n\t\tif (document.documentElement.className.indexOf(nameSpace + \"resizer-v5-init\") \u003E -1) return;\n\t\tdocument.documentElement.className += \" \" + nameSpace + \"resizer-v5-init\";\n\t\t\u002F\u002F requires IE9+\n\t\tif (!(\"querySelector\" in document)) return;\n\t\tvar observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;\n\t\tvar visibilityIndex = {}; \u002F\u002F visibility of each graphic, indexed by container id (used with InteractionObserver)\n\n\t\tupdateAllGraphics();\n\t\twindow.addEventListener('nyt:embed:load', updateAllGraphics); \u002F\u002F for nyt vi compatibility\n\t\tdocument.addEventListener(\"DOMContentLoaded\", updateAllGraphics);\n\t\twindow.addEventListener(\"resize\", throttle(updateAllGraphics, 200));\n\n\t\tfunction updateAllGraphics() {\n\t\t\tselectElements(\".ai2html-box-v5\").forEach(updateGraphic);\n\t\t\tif (scriptEnvironment == \"nyt-preview\") {\n\t\t\t\tnytOnResize();\n\t\t\t}\n\t\t}\n\n\t\tfunction updateGraphic(container) {\n\t\t\tvar artboards = selectElements(\".\" + nameSpace + \"artboard[data-min-width]\", container),\n\t\t\t\t\twidth = Math.round(container.getBoundingClientRect().width),\n\t\t\t\t\tid = container.id, \u002F\u002F assume container has an id\n\t\t\t\t\tshowImages = !observer || visibilityIndex[id] == 'visible';\n\n\t\t\t\u002F\u002F Set artboard visibility based on container width\n\t\t\tartboards.forEach(function(el) {\n\t\t\t\tvar minwidth = el.getAttribute(\"data-min-width\"),\n\t\t\t\t\t\tmaxwidth = el.getAttribute(\"data-max-width\");\n\t\t\t\tif (+minwidth \u003C= width && (+maxwidth \u003E= width || maxwidth === null)) {\n\t\t\t\t\tif (showImages) {\n\t\t\t\t\t\tselectElements(\".\" + nameSpace + \"aiImg\", el).forEach(updateImgSrc);\n\t\t\t\t\t}\n\t\t\t\t\tel.style.display = \"block\";\n\t\t\t\t} else {\n\t\t\t\t\tel.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t\u002F\u002F Initialize lazy loading on first call, if IntersectionObserver is available\n\t\t\tif (observer && !visibilityIndex[id]) {\n\t\t\t\tif (containerIsVisible(container)) {\n\t\t\t\t\t\u002F\u002F Skip IntersectionObserver if graphic is initially visible\n\t\t\t\t\t\u002F\u002F Note: We're doing this after artboard visibility is first calculated\n\t\t\t\t\t\u002F\u002F\t (above) -- otherwise all artboard images are display:block and the\n\t\t\t\t\t\u002F\u002F\t calculated height of the graphic is huge.\n\t\t\t\t\t\u002F\u002F TODO: Consider making artboard images position:absolute and setting\n\t\t\t\t\t\u002F\u002F\t height as a padding % (calculated from the aspect ratio of the graphic).\n\t\t\t\t\t\u002F\u002F\t This will correctly set the initial height of the graphic before\n\t\t\t\t\t\u002F\u002F\t an image is loaded.\n\t\t\t\t\tvisibilityIndex[id] = 'visible';\n\t\t\t\t\tupdateGraphic(container); \u002F\u002F Call again to start loading right away\n\t\t\t\t} else {\n\t\t\t\t\tvisibilityIndex[id] = 'hidden';\n\t\t\t\t\tobserver.observe(container);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction containerIsVisible(container) {\n\t\t\tvar bounds = container.getBoundingClientRect();\n\t\t\treturn bounds.top \u003C window.innerHeight && bounds.bottom \u003E 0;\n\t\t}\n\n\t\t\u002F\u002F Replace blank placeholder image with actual image\n\t\t\u002F\u002F (only relevant if use_lazy_loader option is true)\n\t\tfunction updateImgSrc(img) {\n\t\t\tvar src = img.getAttribute(\"data-src\");\n\t\t\tif (src && img.getAttribute(\"src\") != src) {\n\t\t\t\timg.setAttribute(\"src\", src);\n\t\t\t}\n\t\t}\n\n\t\tfunction onIntersectionChange(entries) {\n\t\t\tentries.forEach(function(entry) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tvisibilityIndex[entry.target.id] = 'visible';\n\t\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t\t\tupdateGraphic(entry.target);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction selectElements(selector, parent) {\n\t\t\tvar selection = (parent || document).querySelectorAll(selector);\n\t\t\treturn Array.prototype.slice.call(selection);\n\t\t}\n\n\t\tfunction nytOnResize() {\n\t\t\t\u002F\u002F TODO: add comments\n\t\t\ttry {\n\t\t\t\tif (window.parent && window.parent.$) {\n\t\t\t\t\twindow.parent.$(\"body\").trigger(\"resizedcontent\", [window]);\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"resizedcontent\"));\n\t\t\t\tif (window.require && document.querySelector(\"meta[name=sourceApp]\") && document.querySelector(\"meta[name=sourceApp]\").content == \"nyt-v5\") {\n\t\t\t\t\trequire([\"foundation\u002Fmain\"], function() {\n\t\t\t\t\t\trequire([\"shared\u002Finteractive\u002Finstances\u002Fapp-communicator\"], function(AppCommunicator) {\n\t\t\t\t\t\t\tAppCommunicator.triggerResize();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch(e) { console.log(e); }\n\t\t}\n\n\t\t\u002F\u002F based on underscore.js\n\t\tfunction throttle(func, wait) {\n\t\t\tvar _now = Date.now || function() { return +new Date(); },\n\t\t\t\t\ttimeout = null, previous = 0;\n\t\t\tvar run = function() {\n\t\t\t\t\tprevious = _now();\n\t\t\t\t\ttimeout = null;\n\t\t\t\t\tfunc();\n\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar remaining = wait - (_now() - previous);\n\t\t\t\tif (remaining \u003C= 0 || remaining \u003E wait) {\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t}\n\t\t\t\t\trun();\n\t\t\t\t} else if (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(run, remaining);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t})(\"nyt-preview\", \"g-\");\n\u003C\u002Fscript\u003E\n\u003C!-- End ai2html - 2018-09-14 14:03 --\u003E\n\u003C!-- Pipeline: 2018-09-14-expenditures-as-a-share-of-national-budget | September 14, 2018, 02:04PM | 3311a2358867f7423b4d30b424829c1ff1228a7a --\u003E\n","compatibility":"INLINE","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.headline","typename":"CreativeWorkHeadline"},"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.displayProperties","typename":"CreativeWorkDisplayProperties"},"bylines":[],"sourceId":"100000006106770","credit":"By The New York Times | Source: Congressional Budget Office","leadin":"Interest payments will make up 13 percent of the federal budget a decade from now, surpassing spending on Medicaid and defense.","note":"","dataSource":"","uri":"nyt:\u002F\u002Fembeddedinteractive\u002F27973d52-5f82-509c-b7a1-bd8323702ed1","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.headline":{"default":"Interest as a Share of the Budget","__typename":"CreativeWorkHeadline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.displayProperties":{"displayForPromotionOnly":true,"maximumWidth":600,"minimumWidth":300,"__typename":"CreativeWorkDisplayProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia":{"__typename":"Image","caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4","typename":"ImageCrop"}],"promotionalMedia":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.caption":{"text@stripHtml":"","__typename":"TextOnlyDocumentBlock"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-articleLarge.png":{"name":"articleLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-articleLarge.png","width":600,"height":434,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-articleLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-thumbLarge.png":{"name":"thumbLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-thumbLarge.png","width":150,"height":150,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-thumbLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-square640.png":{"name":"square640","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-square640.png","width":640,"height":640,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-square640.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-largeHorizontalJumbo.png":{"name":"largeHorizontalJumbo","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-largeHorizontalJumbo.png","width":1024,"height":683,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-largeHorizontalJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-videoLarge.png":{"name":"videoLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-videoLarge.png","width":768,"height":507,"__typename":"ImageRendition"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoLargeAt2X.png":{"name":"threeByTwoLargeAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-threeByTwoLargeAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoMediumAt2X.png":{"name":"threeByTwoMediumAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-threeByTwoMediumAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoSmallAt2X.png":{"name":"threeByTwoSmallAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fexpenditures-as-a-share-of-national-budget-1536946929937\u002Fexpenditures-as-a-share-of-national-budget-1536946929937-threeByTwoSmallAt2X.png","width":600,"height":400,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.33.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessexpenditures-as-a-share-of-national-budget-1536946929937expenditures-as-a-share-of-national-budget-1536946929937-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.34.content.0":{"__typename":"TextInline","text":"Finding the money to pay investors who hold government debt will crimp other parts of the budget. In a decade, interest on the debt will eat up 13 percent of government spending, up from 6.6 percent in 2017.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.36.content.0":{"__typename":"TextInline","text":"“By 2020, we will spend more on interest than we do on kids, including education, food stamps and aid to families,” said Marc Goldwein, senior policy director at the Committee for a Responsible Federal Budget, a research and advocacy organization. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.38.content.0":{"__typename":"TextInline","text":"Interest costs already dwarf spending on many popular programs. For example, grants to students from low-income families for college total roughly $30 billion — about one-tenth of what the government will pay in interest this year. Interest payments will overtake Medicaid in 2020 and the Department of Defense budget in 2023.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.40.content.0":{"__typename":"TextInline","text":"What’s more, the heavy burden of interest payments could make it harder for the government to repair aging infrastructure or take on other big new projects. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.42.content.0":{"__typename":"TextInline","text":"Mr. Trump has called for spending $1 trillion on infrastructure, but Congress has not taken up that idea.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.44.title.0":{"__typename":"TextInline","text":"More about the federal debt and the economy","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"__typename":"Article","promotionalHeadline":"Trump Treasury Chief Considers $100 Billion Tax Cut for Wealthy","promotionalSummary":"A proposal under consideration at the Treasury Department would bypass Congress and use federal regulation to index capital gains for inflation, a $100 billion boost for high earners.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"CreativeWorkHeadline"},"summary":"A proposal under consideration at the Treasury Department would bypass Congress and use federal regulation to index capital gains for inflation, a $100 billion boost for high earners.","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2EzNGQzZDZjLWM3N2YtNTkzMS1iOTUxLTI0MWI0ZTI4NjgxYw==","typename":"Section"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2018\u002F07\u002F30\u002Fus\u002Fpolitics\u002Ftrump-tax-cuts-rich.html","firstPublished":"2018-07-30T20:33:59.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Image"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"default":"Trump Administration Mulls a Unilateral Tax Cut for the Rich","__typename":"CreativeWorkHeadline"},"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2EzNGQzZDZjLWM3N2YtNTkzMS1iOTUxLTI0MWI0ZTI4NjgxYw==":{"id":"U2VjdGlvbjpueXQ6Ly9zZWN0aW9uL2EzNGQzZDZjLWM3N2YtNTkzMS1iOTUxLTI0MWI0ZTI4NjgxYw==","displayName":"U.S.","__typename":"Section"},"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-videoLarge.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F31\u002Fus\u002F31dc-tax-print\u002F31dc-TAX-alpha-videoLarge.jpg","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-mediumThreeByTwo440.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F31\u002Fus\u002F31dc-tax-print\u002F31dc-TAX-alpha-mediumThreeByTwo440.jpg","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-threeByTwoSmallAt2X.jpg":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F31\u002Fus\u002F31dc-tax-print\u002F31dc-TAX-alpha-threeByTwoSmallAt2X.jpg","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-videoLarge.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-mediumThreeByTwo440.jpg","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180731us31dc-tax-print31dc-TAX-alpha-threeByTwoSmallAt2X.jpg","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"displayName":"Alan Rappeport","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"displayName":"Jim Tankersley","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Person"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"__typename":"Article","promotionalHeadline":"Trump Tax Cut Is Pushing the Federal Deficit to $1 Trillion","promotionalSummary":"The amount of corporate taxes collected by the federal government has plunged to historically low levels, pushing up the federal budget deficit much faster than economists had predicted.","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"CreativeWorkHeadline"},"summary":"Corporate income tax collections are near a 75-year low, as a share of the economy, after a new law reduced rates and allowed companies to deduct investments immediately. ","section":{"type":"id","generated":false,"id":"Section:U2VjdGlvbjpueXQ6Ly9zZWN0aW9uLzA0MTViMmIwLTUxM2EtNWU3OC04MGRhLTIxYWI3NzBjYjc1Mw==","typename":"Section"},"url":"https:\u002F\u002Fwww.nytimes.com\u002F2018\u002F07\u002F25\u002Fbusiness\u002Ftrump-corporate-tax-cut-deficit.html","firstPublished":"2018-07-25T09:00:12.000Z","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Image"},"bylines":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Byline"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"default":"How the Trump Tax Cut Is Helping to Push the Federal Deficit to $1 Trillion","__typename":"CreativeWorkHeadline"},"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-videoLarge.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F21\u002Fbusiness\u002Fcorptax-75year-low-1532120471295\u002Fcorptax-75year-low-1532120471295-videoLarge.png","name":"videoLarge","__typename":"ImageRendition"},"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-mediumThreeByTwo440.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F21\u002Fbusiness\u002Fcorptax-75year-low-1532120471295\u002Fcorptax-75year-low-1532120471295-mediumThreeByTwo440.png","name":"mediumThreeByTwo440","__typename":"ImageRendition"},"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-threeByTwoSmallAt2X.png":{"url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F07\u002F21\u002Fbusiness\u002Fcorptax-75year-low-1532120471295\u002Fcorptax-75year-low-1532120471295-threeByTwoSmallAt2X.png","name":"threeByTwoSmallAt2X","__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-mediumThreeByTwo440.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180721businesscorptax-75year-low-1532120471295corptax-75year-low-1532120471295-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"crops({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]({\"renditionNames\":[\"threeByTwoSmallAt2X\",\"videoLarge\",\"mediumThreeByTwo440\"]}).0","typename":"ImageCrop"}],"__typename":"Image"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"displayName":"Jim Tankersley","__typename":"Person"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]":{"creators":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@[email protected]","typename":"Person"}],"__typename":"Byline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.45.content.0":{"__typename":"TextInline","text":"The U.S. hasn’t faced this issue for years","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.46.content.0":{"__typename":"TextInline","text":"Until recently, ultralow interest rates, set by the Federal Reserve to support the economy, allowed lawmakers to borrow without fretting too much about the cost of that debt. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.48.content.0":{"__typename":"TextInline","text":"But as the economy has strengthened, the Fed has gradually raised rates, starting in December 2015. The central bank is expected to push rates up again on Wednesday, and more increases are in store.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.50.content.0":{"__typename":"TextInline","text":"“When rates went down to record lows, it allowed the government to take on more debt without paying more interest,” Mr. Goldwein said. “That party is ending.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media":{"__typename":"EmbeddedInteractive","slug":"10-year-treasury-note","html":"\n\u003C!-- Generated by ai2html v0.74.0 - 2018-09-25 16:50 --\u003E\n\u003C!-- ai file: 0916 biz web DEBT CHART 5.ai --\u003E\n\u003C!-- preview: 2018-09-14-10-year-treasury-note --\u003E\n\u003C!-- scoop: 10-year-treasury-note --\u003E\n\u003Cstyle type='text\u002Fcss' media='screen,print'\u003E\n\t#g-0916-biz-web-DEBT-CHART-5-box .g-artboard {\n\t\tmargin:0 auto;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-box .g-artboard p {\n\t\tmargin:0;\n\t}\n\t.g-aiAbs {\n\t\tposition:absolute;\n\t}\n\t.g-aiImg {\n\t\tdisplay:block;\n\t\twidth:100% !important;\n\t}\n\t.g-aiSymbol {\n\t\tposition: absolute;\n\t\tbox-sizing: border-box;\n\t}\n\t.g-aiPointText p { white-space: nowrap; }\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:600px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:500;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle0 {\n\t\tfont-weight:700;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle1 {\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle2 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle3 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_2 .g-pstyle4 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:300px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:700;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle0 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle1 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle2 {\n\t\tfont-weight:500;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle3 {\n\t\tfont-weight:500;\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-5-Artboard_3 .g-pstyle4 {\n\t\tfont-weight:500;\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\n\u003C\u002Fstyle\u003E\n\n\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-5-box\" class=\"ai2html ai2html-box-v5\"\u003E\n\n\t\u003C!-- Artboard: Artboard_2 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-5-Artboard_2\" class=\"g-artboard\" data-aspect-ratio=\"1.382\" data-min-width=\"600\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-5-Artboard_2-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002F10-year-treasury-note\u002Fe6a342acf0db9b8a88e9ae36f0db5438e5e5124f\u002F0916-biz-web-DEBT-CHART-5-Artboard_2.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai0-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.0644%;width:196px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EYield on 10-year Treasury note\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E8\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:5.4133%;width:33px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.7232%;margin-top:-9.2px;right:0.1584%;width:70px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003EMONTHLY\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:21.2411%;margin-top:-9.2px;left:37.9228%;margin-left:-42.5px;width:85px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003ERECESSIONS\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:28.6213%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E6\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:47.5106%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E4\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:66.6304%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E2\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:95.0669%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:7.6353%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;98\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:16.3776%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;00\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:25.1199%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;02\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:33.8621%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;04\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:42.6044%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;06\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:51.3468%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;08\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:60.0889%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:68.8313%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;12\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:77.5735%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;14\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:86.3158%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;16\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-20\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:95.058%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\t\u003C!-- Artboard: Artboard_3 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-5-Artboard_3\" class=\"g-artboard\" data-aspect-ratio=\"0.691\" data-min-width=\"300\" data-max-width=\"599\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-5-Artboard_3-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002F10-year-treasury-note\u002Fe6a342acf0db9b8a88e9ae36f0db5438e5e5124f\u002F0916-biz-web-DEBT-CHART-5-Artboard_3.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai1-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.2844%;width:196px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EYield on 10-year Treasury note\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E8\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;left:10.2054%;width:33px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E%\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.7232%;margin-top:-9.2px;right:6.6448%;width:70px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003EMONTHLY\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:21.2411%;margin-top:-9.2px;left:38.8379%;margin-left:-42.5px;width:85px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003ERECESSIONS\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:28.6214%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E6\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:47.5107%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E4\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:66.6305%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E2\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:90.2934%;width:29px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E0\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:12.306%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;98\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:27.6924%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;02\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:43.0788%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;06\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:58.4652%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:73.8516%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;14\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:89.238%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cscript type=\"text\u002Fjavascript\"\u003E\n\t(function (scriptEnvironment, nameSpace) {\n\t\t\u002F\u002F Use a sentinel class to ensure that this version of the resizer only initializes once\n\t\tif (document.documentElement.className.indexOf(nameSpace + \"resizer-v5-init\") \u003E -1) return;\n\t\tdocument.documentElement.className += \" \" + nameSpace + \"resizer-v5-init\";\n\t\t\u002F\u002F requires IE9+\n\t\tif (!(\"querySelector\" in document)) return;\n\t\tvar observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;\n\t\tvar visibilityIndex = {}; \u002F\u002F visibility of each graphic, indexed by container id (used with InteractionObserver)\n\n\t\tupdateAllGraphics();\n\t\twindow.addEventListener('nyt:embed:load', updateAllGraphics); \u002F\u002F for nyt vi compatibility\n\t\tdocument.addEventListener(\"DOMContentLoaded\", updateAllGraphics);\n\t\twindow.addEventListener(\"resize\", throttle(updateAllGraphics, 200));\n\n\t\tfunction updateAllGraphics() {\n\t\t\tselectElements(\".ai2html-box-v5\").forEach(updateGraphic);\n\t\t\tif (scriptEnvironment == \"nyt-preview\") {\n\t\t\t\tnytOnResize();\n\t\t\t}\n\t\t}\n\n\t\tfunction updateGraphic(container) {\n\t\t\tvar artboards = selectElements(\".\" + nameSpace + \"artboard[data-min-width]\", container),\n\t\t\t\t\twidth = Math.round(container.getBoundingClientRect().width),\n\t\t\t\t\tid = container.id, \u002F\u002F assume container has an id\n\t\t\t\t\tshowImages = !observer || visibilityIndex[id] == 'visible';\n\n\t\t\t\u002F\u002F Set artboard visibility based on container width\n\t\t\tartboards.forEach(function(el) {\n\t\t\t\tvar minwidth = el.getAttribute(\"data-min-width\"),\n\t\t\t\t\t\tmaxwidth = el.getAttribute(\"data-max-width\");\n\t\t\t\tif (+minwidth \u003C= width && (+maxwidth \u003E= width || maxwidth === null)) {\n\t\t\t\t\tif (showImages) {\n\t\t\t\t\t\tselectElements(\".\" + nameSpace + \"aiImg\", el).forEach(updateImgSrc);\n\t\t\t\t\t}\n\t\t\t\t\tel.style.display = \"block\";\n\t\t\t\t} else {\n\t\t\t\t\tel.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t\u002F\u002F Initialize lazy loading on first call, if IntersectionObserver is available\n\t\t\tif (observer && !visibilityIndex[id]) {\n\t\t\t\tif (containerIsVisible(container)) {\n\t\t\t\t\t\u002F\u002F Skip IntersectionObserver if graphic is initially visible\n\t\t\t\t\t\u002F\u002F Note: We're doing this after artboard visibility is first calculated\n\t\t\t\t\t\u002F\u002F\t (above) -- otherwise all artboard images are display:block and the\n\t\t\t\t\t\u002F\u002F\t calculated height of the graphic is huge.\n\t\t\t\t\t\u002F\u002F TODO: Consider making artboard images position:absolute and setting\n\t\t\t\t\t\u002F\u002F\t height as a padding % (calculated from the aspect ratio of the graphic).\n\t\t\t\t\t\u002F\u002F\t This will correctly set the initial height of the graphic before\n\t\t\t\t\t\u002F\u002F\t an image is loaded.\n\t\t\t\t\tvisibilityIndex[id] = 'visible';\n\t\t\t\t\tupdateGraphic(container); \u002F\u002F Call again to start loading right away\n\t\t\t\t} else {\n\t\t\t\t\tvisibilityIndex[id] = 'hidden';\n\t\t\t\t\tobserver.observe(container);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction containerIsVisible(container) {\n\t\t\tvar bounds = container.getBoundingClientRect();\n\t\t\treturn bounds.top \u003C window.innerHeight && bounds.bottom \u003E 0;\n\t\t}\n\n\t\t\u002F\u002F Replace blank placeholder image with actual image\n\t\t\u002F\u002F (only relevant if use_lazy_loader option is true)\n\t\tfunction updateImgSrc(img) {\n\t\t\tvar src = img.getAttribute(\"data-src\");\n\t\t\tif (src && img.getAttribute(\"src\") != src) {\n\t\t\t\timg.setAttribute(\"src\", src);\n\t\t\t}\n\t\t}\n\n\t\tfunction onIntersectionChange(entries) {\n\t\t\tentries.forEach(function(entry) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tvisibilityIndex[entry.target.id] = 'visible';\n\t\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t\t\tupdateGraphic(entry.target);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction selectElements(selector, parent) {\n\t\t\tvar selection = (parent || document).querySelectorAll(selector);\n\t\t\treturn Array.prototype.slice.call(selection);\n\t\t}\n\n\t\tfunction nytOnResize() {\n\t\t\t\u002F\u002F TODO: add comments\n\t\t\ttry {\n\t\t\t\tif (window.parent && window.parent.$) {\n\t\t\t\t\twindow.parent.$(\"body\").trigger(\"resizedcontent\", [window]);\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"resizedcontent\"));\n\t\t\t\tif (window.require && document.querySelector(\"meta[name=sourceApp]\") && document.querySelector(\"meta[name=sourceApp]\").content == \"nyt-v5\") {\n\t\t\t\t\trequire([\"foundation\u002Fmain\"], function() {\n\t\t\t\t\t\trequire([\"shared\u002Finteractive\u002Finstances\u002Fapp-communicator\"], function(AppCommunicator) {\n\t\t\t\t\t\t\tAppCommunicator.triggerResize();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch(e) { console.log(e); }\n\t\t}\n\n\t\t\u002F\u002F based on underscore.js\n\t\tfunction throttle(func, wait) {\n\t\t\tvar _now = Date.now || function() { return +new Date(); },\n\t\t\t\t\ttimeout = null, previous = 0;\n\t\t\tvar run = function() {\n\t\t\t\t\tprevious = _now();\n\t\t\t\t\ttimeout = null;\n\t\t\t\t\tfunc();\n\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar remaining = wait - (_now() - previous);\n\t\t\t\tif (remaining \u003C= 0 || remaining \u003E wait) {\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t}\n\t\t\t\t\trun();\n\t\t\t\t} else if (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(run, remaining);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t})(\"nyt-preview\", \"g-\");\n\u003C\u002Fscript\u003E\n\u003C!-- End ai2html - 2018-09-25 16:50 --\u003E\n\u003C!-- Pipeline: 2018-09-14-10-year-treasury-note | September 25, 2018, 04:51PM | e6a342acf0db9b8a88e9ae36f0db5438e5e5124f --\u003E\n","compatibility":"INLINE","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.headline","typename":"CreativeWorkHeadline"},"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.displayProperties","typename":"CreativeWorkDisplayProperties"},"bylines":[],"sourceId":"100000006106857","credit":"By The New York Times | Source: Reuters","leadin":"After bottoming out below 2 percent, the yield on the 10-year Treasury note has climbed to over 3 percent recently.","note":"","dataSource":"","uri":"nyt:\u002F\u002Fembeddedinteractive\u002F943e4e1b-3e67-58d9-ba03-dc74c18e6a8c","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.headline":{"default":"10-Year Treasury Note","__typename":"CreativeWorkHeadline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.displayProperties":{"displayForPromotionOnly":true,"maximumWidth":600,"minimumWidth":300,"__typename":"CreativeWorkDisplayProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia":{"__typename":"Image","caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4","typename":"ImageCrop"}],"promotionalMedia":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.caption":{"text@stripHtml":"","__typename":"TextOnlyDocumentBlock"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-articleLarge.png":{"name":"articleLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-articleLarge.png","width":600,"height":434,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-articleLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-thumbLarge.png":{"name":"thumbLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-thumbLarge.png","width":150,"height":150,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-thumbLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-square640.png":{"name":"square640","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-square640.png","width":640,"height":640,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-square640.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-largeHorizontalJumbo.png":{"name":"largeHorizontalJumbo","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-largeHorizontalJumbo.png","width":1024,"height":683,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-largeHorizontalJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-videoLarge.png":{"name":"videoLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-videoLarge.png","width":768,"height":507,"__typename":"ImageRendition"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoLargeAt2X.png":{"name":"threeByTwoLargeAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-threeByTwoLargeAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoMediumAt2X.png":{"name":"threeByTwoMediumAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-threeByTwoMediumAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoSmallAt2X.png":{"name":"threeByTwoSmallAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002F10-year-treasury-note-1536949005388\u002F10-year-treasury-note-1536949005388-threeByTwoSmallAt2X.png","width":600,"height":400,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.52.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914business10-year-treasury-note-153694900538810-year-treasury-note-1536949005388-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.0":{"__typename":"TextInline","text":"Since the beginning of the year, the yield on the 10-year Treasury note has risen by more than half a percentage point, to ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.1":{"__typename":"TextInline","text":"3.1 percent","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.53.content.2":{"__typename":"TextInline","text":". The Congressional Budget Office estimates that the yield will climb to 4.2 percent in 2021. Given that the total public debt of the United States stands at nearly $16 trillion, even a small uptick in rates can cost the government billions.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.55.content.0":{"__typename":"TextInline","text":"There’s no guarantee that these forecasts will prove accurate. If the economy weakens, rates might fall or rise only slightly, reducing interest payments. But rates could also overshoot the budget office forecast.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.0":{"__typename":"TextInline","text":"Some members of Congress want to set the stage for even more red ink. Republicans in the House want to make last year’s tax cuts permanent, instead of letting some of them expire at the end of 2025. That would reduce federal revenue by an additional $631 billion ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.1":{"__typename":"TextInline","text":"over 10 year","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.2":{"__typename":"TextInline","text":"s, according to the ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.3":{"__typename":"TextInline","text":"Tax Policy Center","formats":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.3.formats.0","typename":"LinkFormat"}]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.3.formats.0":{"__typename":"LinkFormat","url":"https:\u002F\u002Fwww.taxpolicycenter.org\u002Fpublications\u002Fanalysis-protecting-family-and-small-business-tax-cuts-act-2018","title":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.57.content.4":{"__typename":"TextInline","text":".","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.59.content.0":{"__typename":"TextInline","text":"No, the United States isn’t at risk of becoming the next Greece","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media":{"__typename":"EmbeddedInteractive","slug":"dollar-index","html":"\n\u003C!-- Generated by ai2html v0.74.0 - 2018-09-21 18:43 --\u003E\n\u003C!-- ai file: 0916 biz web DEBT CHART 4.ai --\u003E\n\u003C!-- preview: 2018-09-14-dollar-index --\u003E\n\u003C!-- scoop: dollar-index --\u003E\n\u003Cstyle type='text\u002Fcss' media='screen,print'\u003E\n\t#g-0916-biz-web-DEBT-CHART-4-box .g-artboard {\n\t\tmargin:0 auto;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-box .g-artboard p {\n\t\tmargin:0;\n\t}\n\t.g-aiAbs {\n\t\tposition:absolute;\n\t}\n\t.g-aiImg {\n\t\tdisplay:block;\n\t\twidth:100% !important;\n\t}\n\t.g-aiSymbol {\n\t\tposition: absolute;\n\t\tbox-sizing: border-box;\n\t}\n\t.g-aiPointText p { white-space: nowrap; }\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:600px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:500;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle0 {\n\t\tfont-weight:700;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle1 {\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle2 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle3 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_2 .g-pstyle4 {\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 {\n\t\tposition:relative;\n\t\toverflow:hidden;\n\t\twidth:300px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 p {\n\t\tfont-family:nyt-franklin,arial,helvetica,sans-serif;\n\t\tfont-weight:500;\n\t\tfont-size:13px;\n\t\tline-height:18px;\n\t\theight:auto;\n\t\tfilter:alpha(opacity=100);\n\t\t-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n\t\topacity:1;\n\t\tletter-spacing:0em;\n\t\ttext-align:left;\n\t\tcolor:rgb(51,51,51);\n\t\ttext-transform:none;\n\t\tpadding-bottom:0;\n\t\tpadding-top:0;\n\t\tmix-blend-mode:normal;\n\t\tfont-style:normal;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle0 {\n\t\tfont-weight:700;\n\t\theight:18px;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle1 {\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle2 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:right;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle3 {\n\t\tfont-size:11px;\n\t\theight:18px;\n\t\ttext-align:center;\n\t}\n\t#g-0916-biz-web-DEBT-CHART-4-Artboard_3 .g-pstyle4 {\n\t\theight:18px;\n\t}\n\n\u003C\u002Fstyle\u003E\n\n\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-4-box\" class=\"ai2html ai2html-box-v5\"\u003E\n\n\t\u003C!-- Artboard: Artboard_2 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-4-Artboard_2\" class=\"g-artboard\" data-aspect-ratio=\"1.382\" data-min-width=\"600\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-4-Artboard_2-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fdollar-index\u002F3753490c8fd0afa3e42df37d132f5c87da5e1c36\u002F0916-biz-web-DEBT-CHART-4-Artboard_2.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai0-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.0838%;width:117px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EU.S. Dollar index\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E140\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.7232%;margin-top:-9.2px;right:0.1584%;width:70px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003EMONTHLY\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:21.2411%;margin-top:-9.2px;left:37.9228%;margin-left:-42.5px;width:85px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003ERECESSIONS\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:28.6213%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E120\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:47.5106%;margin-top:-9.2px;right:95.0369%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E100\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:66.6304%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E80\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:94.9686%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E60\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:7.6353%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;98\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:16.3776%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;00\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:25.1199%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;02\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:33.8621%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;04\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:42.6044%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;06\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:51.3468%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;08\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-15\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:60.0889%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-16\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:68.8313%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;12\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-17\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:77.5735%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;14\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-18\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:86.3158%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;16\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai0-19\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:95.058%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\t\u003C!-- Artboard: Artboard_3 --\u003E\n\t\u003Cdiv id=\"g-0916-biz-web-DEBT-CHART-4-Artboard_3\" class=\"g-artboard\" data-aspect-ratio=\"0.691\" data-min-width=\"300\" data-max-width=\"599\"\u003E\n\t\t\u003Cimg id=\"g-0916-biz-web-DEBT-CHART-4-Artboard_3-img\" class=\"g-aiImg\" data-src=\"https:\u002F\u002Fstatic01.nyt.com\u002Fnewsgraphics\u002F2018\u002F09\u002F14\u002Fdollar-index\u002F3753490c8fd0afa3e42df37d132f5c87da5e1c36\u002F0916-biz-web-DEBT-CHART-4-Artboard_3.png\" src=\"data:image\u002Fgif;base64,R0lGODlhCgAKAIAAAB8fHwAAACH5BAEAAAAALAAAAAAKAAoAAAIIhI+py+0PYysAOw==\"\u002F\u003E\n\t\t\u003Cdiv id=\"g-ai1-1\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:4.4262%;margin-top:-9.2px;left:0.2844%;width:117px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle0\"\u003EU.S. Dollar index\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-2\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.5016%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E140\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-3\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:9.7232%;margin-top:-9.2px;right:6.6448%;width:70px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle2\"\u003EMONTHLY\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-4\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:21.2411%;margin-top:-9.2px;left:38.8379%;margin-left:-42.5px;width:85px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle3\"\u003ERECESSIONS\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-5\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:28.6214%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E120\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-6\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:47.5107%;margin-top:-9.2px;right:90.2334%;width:44px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E100\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-7\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:66.6305%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E80\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-8\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:85.7502%;margin-top:-9.2px;right:90.0968%;width:37px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle1\"\u003E60\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-9\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:12.306%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;98\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-10\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:27.6924%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;02\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-11\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:43.0788%;width:40px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;06\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-12\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:58.4652%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;10\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-13\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:73.8516%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;14\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\t\u003Cdiv id=\"g-ai1-14\" class=\"g-Layer_1 g-aiAbs g-aiPointText\" style=\"top:91.0485%;margin-top:-9.2px;left:89.238%;width:39px;\"\u003E\n\t\t\t\u003Cp class=\"g-pstyle4\"\u003E&rsquo;18\u003C\u002Fp\u003E\n\t\t\u003C\u002Fdiv\u003E\n\t\u003C\u002Fdiv\u003E\n\n\u003C\u002Fdiv\u003E\n\n\u003Cscript type=\"text\u002Fjavascript\"\u003E\n\t(function (scriptEnvironment, nameSpace) {\n\t\t\u002F\u002F Use a sentinel class to ensure that this version of the resizer only initializes once\n\t\tif (document.documentElement.className.indexOf(nameSpace + \"resizer-v5-init\") \u003E -1) return;\n\t\tdocument.documentElement.className += \" \" + nameSpace + \"resizer-v5-init\";\n\t\t\u002F\u002F requires IE9+\n\t\tif (!(\"querySelector\" in document)) return;\n\t\tvar observer = window.IntersectionObserver ? new IntersectionObserver(onIntersectionChange, {}) : null;\n\t\tvar visibilityIndex = {}; \u002F\u002F visibility of each graphic, indexed by container id (used with InteractionObserver)\n\n\t\tupdateAllGraphics();\n\t\twindow.addEventListener('nyt:embed:load', updateAllGraphics); \u002F\u002F for nyt vi compatibility\n\t\tdocument.addEventListener(\"DOMContentLoaded\", updateAllGraphics);\n\t\twindow.addEventListener(\"resize\", throttle(updateAllGraphics, 200));\n\n\t\tfunction updateAllGraphics() {\n\t\t\tselectElements(\".ai2html-box-v5\").forEach(updateGraphic);\n\t\t\tif (scriptEnvironment == \"nyt-preview\") {\n\t\t\t\tnytOnResize();\n\t\t\t}\n\t\t}\n\n\t\tfunction updateGraphic(container) {\n\t\t\tvar artboards = selectElements(\".\" + nameSpace + \"artboard[data-min-width]\", container),\n\t\t\t\t\twidth = Math.round(container.getBoundingClientRect().width),\n\t\t\t\t\tid = container.id, \u002F\u002F assume container has an id\n\t\t\t\t\tshowImages = !observer || visibilityIndex[id] == 'visible';\n\n\t\t\t\u002F\u002F Set artboard visibility based on container width\n\t\t\tartboards.forEach(function(el) {\n\t\t\t\tvar minwidth = el.getAttribute(\"data-min-width\"),\n\t\t\t\t\t\tmaxwidth = el.getAttribute(\"data-max-width\");\n\t\t\t\tif (+minwidth \u003C= width && (+maxwidth \u003E= width || maxwidth === null)) {\n\t\t\t\t\tif (showImages) {\n\t\t\t\t\t\tselectElements(\".\" + nameSpace + \"aiImg\", el).forEach(updateImgSrc);\n\t\t\t\t\t}\n\t\t\t\t\tel.style.display = \"block\";\n\t\t\t\t} else {\n\t\t\t\t\tel.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t\u002F\u002F Initialize lazy loading on first call, if IntersectionObserver is available\n\t\t\tif (observer && !visibilityIndex[id]) {\n\t\t\t\tif (containerIsVisible(container)) {\n\t\t\t\t\t\u002F\u002F Skip IntersectionObserver if graphic is initially visible\n\t\t\t\t\t\u002F\u002F Note: We're doing this after artboard visibility is first calculated\n\t\t\t\t\t\u002F\u002F\t (above) -- otherwise all artboard images are display:block and the\n\t\t\t\t\t\u002F\u002F\t calculated height of the graphic is huge.\n\t\t\t\t\t\u002F\u002F TODO: Consider making artboard images position:absolute and setting\n\t\t\t\t\t\u002F\u002F\t height as a padding % (calculated from the aspect ratio of the graphic).\n\t\t\t\t\t\u002F\u002F\t This will correctly set the initial height of the graphic before\n\t\t\t\t\t\u002F\u002F\t an image is loaded.\n\t\t\t\t\tvisibilityIndex[id] = 'visible';\n\t\t\t\t\tupdateGraphic(container); \u002F\u002F Call again to start loading right away\n\t\t\t\t} else {\n\t\t\t\t\tvisibilityIndex[id] = 'hidden';\n\t\t\t\t\tobserver.observe(container);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction containerIsVisible(container) {\n\t\t\tvar bounds = container.getBoundingClientRect();\n\t\t\treturn bounds.top \u003C window.innerHeight && bounds.bottom \u003E 0;\n\t\t}\n\n\t\t\u002F\u002F Replace blank placeholder image with actual image\n\t\t\u002F\u002F (only relevant if use_lazy_loader option is true)\n\t\tfunction updateImgSrc(img) {\n\t\t\tvar src = img.getAttribute(\"data-src\");\n\t\t\tif (src && img.getAttribute(\"src\") != src) {\n\t\t\t\timg.setAttribute(\"src\", src);\n\t\t\t}\n\t\t}\n\n\t\tfunction onIntersectionChange(entries) {\n\t\t\tentries.forEach(function(entry) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tvisibilityIndex[entry.target.id] = 'visible';\n\t\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t\t\tupdateGraphic(entry.target);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction selectElements(selector, parent) {\n\t\t\tvar selection = (parent || document).querySelectorAll(selector);\n\t\t\treturn Array.prototype.slice.call(selection);\n\t\t}\n\n\t\tfunction nytOnResize() {\n\t\t\t\u002F\u002F TODO: add comments\n\t\t\ttry {\n\t\t\t\tif (window.parent && window.parent.$) {\n\t\t\t\t\twindow.parent.$(\"body\").trigger(\"resizedcontent\", [window]);\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.dispatchEvent(new Event(\"resizedcontent\"));\n\t\t\t\tif (window.require && document.querySelector(\"meta[name=sourceApp]\") && document.querySelector(\"meta[name=sourceApp]\").content == \"nyt-v5\") {\n\t\t\t\t\trequire([\"foundation\u002Fmain\"], function() {\n\t\t\t\t\t\trequire([\"shared\u002Finteractive\u002Finstances\u002Fapp-communicator\"], function(AppCommunicator) {\n\t\t\t\t\t\t\tAppCommunicator.triggerResize();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch(e) { console.log(e); }\n\t\t}\n\n\t\t\u002F\u002F based on underscore.js\n\t\tfunction throttle(func, wait) {\n\t\t\tvar _now = Date.now || function() { return +new Date(); },\n\t\t\t\t\ttimeout = null, previous = 0;\n\t\t\tvar run = function() {\n\t\t\t\t\tprevious = _now();\n\t\t\t\t\ttimeout = null;\n\t\t\t\t\tfunc();\n\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar remaining = wait - (_now() - previous);\n\t\t\t\tif (remaining \u003C= 0 || remaining \u003E wait) {\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t}\n\t\t\t\t\trun();\n\t\t\t\t} else if (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(run, remaining);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t})(\"nyt-preview\", \"g-\");\n\u003C\u002Fscript\u003E\n\u003C!-- End ai2html - 2018-09-21 18:43 --\u003E\n\u003C!-- Pipeline: 2018-09-14-dollar-index | September 21, 2018, 06:44PM | 3753490c8fd0afa3e42df37d132f5c87da5e1c36 --\u003E\n","compatibility":"INLINE","headline":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.headline","typename":"CreativeWorkHeadline"},"advertisingProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.advertisingProperties","typename":"CreativeWorkAdvertisingProperties"},"displayProperties":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.displayProperties","typename":"CreativeWorkDisplayProperties"},"bylines":[],"sourceId":"100000006106834","credit":"By The New York Times | Source: Reuters","leadin":"The dollar has strengthened even as government borrowing has increased.","note":"","dataSource":"","uri":"nyt:\u002F\u002Fembeddedinteractive\u002Fa299a392-22c7-5402-8602-dd3919c3b661","promotionalMedia":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia","typename":"Image"}},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.headline":{"default":"Dollar Index","__typename":"CreativeWorkHeadline"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.advertisingProperties":{"sensitivity":"SHOW_ADS","__typename":"CreativeWorkAdvertisingProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.displayProperties":{"displayForPromotionOnly":true,"maximumWidth":600,"minimumWidth":300,"__typename":"CreativeWorkDisplayProperties"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia":{"__typename":"Image","caption":{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.caption","typename":"TextOnlyDocumentBlock"},"crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]})":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3","typename":"ImageCrop"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4","typename":"ImageCrop"}],"promotionalMedia":null},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.caption":{"text@stripHtml":"","__typename":"TextOnlyDocumentBlock"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-articleLarge.png":{"name":"articleLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-articleLarge.png","width":600,"height":434,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).0":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-articleLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-thumbLarge.png":{"name":"thumbLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-thumbLarge.png","width":150,"height":150,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).1":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-thumbLarge.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-square640.png":{"name":"square640","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-square640.png","width":640,"height":640,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).2":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-square640.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-largeHorizontalJumbo.png":{"name":"largeHorizontalJumbo","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-largeHorizontalJumbo.png","width":1024,"height":683,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).3":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-largeHorizontalJumbo.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-videoLarge.png":{"name":"videoLarge","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-videoLarge.png","width":768,"height":507,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoLargeAt2X.png":{"name":"threeByTwoLargeAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-threeByTwoLargeAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoMediumAt2X.png":{"name":"threeByTwoMediumAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-threeByTwoMediumAt2X.png","width":1024,"height":683,"__typename":"ImageRendition"},"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoSmallAt2X.png":{"name":"threeByTwoSmallAt2X","url":"https:\u002F\u002Fstatic01.nyt.com\u002Fimages\u002F2018\u002F09\u002F14\u002Fbusiness\u002Fdollar-index-1536948400579\u002Fdollar-index-1536948400579-threeByTwoSmallAt2X.png","width":600,"height":400,"__typename":"ImageRendition"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.60.media.promotionalMedia.crops({\"renditionNames\":[\"threeByTwoLargeAt2X\",\"threeByTwoSmallAt2X\",\"videoLarge\",\"largeHorizontalJumbo\",\"articleLarge\",\"master1050\",\"square640\",\"thumbLarge\",\"threeByTwoSmallAt2X\",\"threeByTwoMediumAt2X\",\"threeByTwoLargeAt2X\"]}).4":{"renditions":[{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-videoLarge.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoLargeAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoMediumAt2X.png","typename":"ImageRendition"},{"type":"id","generated":false,"id":"ImageRendition:images20180914businessdollar-index-1536948400579dollar-index-1536948400579-threeByTwoSmallAt2X.png","typename":"ImageRendition"}],"__typename":"ImageCrop"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.61.content.0":{"__typename":"TextInline","text":"Deficit hawks have warned for years that a day of reckoning is coming, exposing the United States to the kind of economic crisis that overtook profligate borrowers in the past like Greece or Argentina.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.63.content.0":{"__typename":"TextInline","text":"But most experts say that isn’t likely because the dollar is the world’s reserve currency. As a result, the United States still has plenty of borrowing capacity left because the Fed can print money with fewer consequences than other central banks. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.65.content.0":{"__typename":"TextInline","text":"And interest rates plunged over the last decade, even as the government turned to the market for trillions each year after the recession. That’s because Treasury bonds are still the favored port of international investors in any economic storm. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.0":{"__typename":"TextInline","text":"“We exported a financial crisis a decade ago, and the world responded by sending us money,” ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.1":{"__typename":"TextInline","text":"said","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.67.content.2":{"__typename":"TextInline","text":" William G. Gale, a senior fellow at the Brookings Institution. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.69.content.0":{"__typename":"TextInline","text":"But that privileged position has allowed politicians in both parties to avoid politically painful steps like cutting spending or raising taxes.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.71.content.0":{"__typename":"TextInline","text":"That doesn’t mean rapidly rising interest costs and a bigger deficit won’t eventually catch up with us. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.73.content.0":{"__typename":"TextInline","text":"Charles Schultze, chairman of the Council of Economic Advisers in the Carter administration, once summed up the danger of deficits with a metaphor. “It’s not so much a question of the wolf at the door, but termites in the woodwork.” ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.75.content.0":{"__typename":"TextInline","text":"But Washington doesn’t want to hear about the potential problems","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.76.content.0":{"__typename":"TextInline","text":"Rather than simply splitting along party lines, lawmakers’ attitudes toward the deficit also depend on which party is in power. Republicans pilloried the Obama administration for proposing a large stimulus in the depths of the recession in 2009 and complained about the deficit for years.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.78.content.0":{"__typename":"TextInline","text":"In 2013, Senator Mitch McConnell of Kentucky called the debt and deficit “the transcendent issue of our era.” By 2017, as Senate majority leader, he quickly shepherded the tax cut through Congress.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.80.content.0":{"__typename":"TextInline","text":"Senator James Lankford, an Oklahoma Republican who warned of the deficit’s dangers in the past, nevertheless played down that threat on the Senate floor as the tax billed neared passage. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.82.content.0":{"__typename":"TextInline","text":"“I understand it’s a risk, but I think it’s an appropriate risk to be able to say let’s allow Americans to keep more of their own money to invest in this economy,” he said.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.84.content.0":{"__typename":"TextInline","text":"He also claimed the tax cuts would pay for themselves even as the Congressional Budget Office estimated that they would add $250 billion to the deficit on average from 2019 to 2024. ","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.86.content.0":{"__typename":"TextInline","text":"In an interview, Mr. Lankford insisted that the jury was still out on whether the tax cuts would generate additional revenue, citing the strong economic growth recently.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.88.content.0":{"__typename":"TextInline","text":"While the Republican about-face has been much more striking, Democrats have adjusted their position, too.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.90.content.0":{"__typename":"TextInline","text":"Mr. Warner, the Virginia Democrat, called last year’s tax bill “the worst piece of legislation we have passed since I arrived in the Senate.” In 2009, however, when Congress passed an $800 billion stimulus bill backed by the Obama administration, he called it “a responsible mix of tax cuts and investments that will create jobs.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.92.content.0":{"__typename":"TextInline","text":"The difference, Mr. Warner said, was that the economy was near the precipice then.","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.sprinkledBody.content@filterEmpty.93.content.0":{"__typename":"TextInline","text":"“There was virtual unanimity among economists that we needed a stimulus,” he said. “But a $2 trillion tax cut at the end of a business cycle with borrowed money won’t end well.”","formats":[]},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.legacy":{"reviewInformation":"","__typename":"ArticleLegacyData","htmlExtendedAuthorOrArticleInformation":"","htmlInfoBox":""},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails.socialMedia.0":{"type":"url","account":"https:\u002F\u002Fwww.nytimes.com\u002Fby\u002Fnelson-d-schwartz","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails.socialMedia.1":{"type":"twitter","account":"NelsonSchwartz","__typename":"ContactDetailsSocialMedia"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails":{"socialMedia":[{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails.socialMedia.0","typename":"ContactDetailsSocialMedia"},{"type":"id","generated":true,"id":"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.contactDetails.socialMedia.1","typename":"ContactDetailsSocialMedia"}],"__typename":"ContactDetails"},"$Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==.bylines.0.creators.0.legacyData":{"htmlShortBiography":"\u003Cp\u003ENelson D. Schwartz has covered economics since 2012. Previously, he wrote about Wall Street and banking, and also served as European economic correspondent in Paris. He joined The Times in 2007 as a feature writer for the Sunday Business section.\u003C\u002Fp\u003E","__typename":"PersonLegacyData"},"ROOT_QUERY":{"workOrLocation({\"id\":\"\u002F2018\u002F09\u002F25\u002Fbusiness\u002Feconomy\u002Fus-government-debt-interest.html\"})":{"type":"id","generated":false,"id":"Article:QXJ0aWNsZTpueXQ6Ly9hcnRpY2xlLzU1NjNiODUxLTNhOGUtNThmNy04ZjY3LTA3MTY2OThjZWJhYQ==","typename":"Article"}}},"config":{"gqlUrl":"https:\u002F\u002Fsamizdat-graphql.nytimes.com\u002Fgraphql\u002Fv2","gqlRequestHeaders":{"nyt-app-type":"project-vi","nyt-app-version":"0.0.3","nyt-token":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYOpRoYg5X01qAqNyBDM32EI\u002FE77nkFzd2rrVjhdi\u002FVAZfBIrPayyYykIIN+d5GMImm3wg6CmTTkBo7ixmwd7Xv24QSDpjuX0gQ1eqxOEWZ0FHWZWkh4jfLcwqkgKmfHJuvOctEiE\u002FWic5Qrle323SMDKF8sAqClv8VKA8hyrXHbPDAlAaxq3EPOGjJqpHEdWNVg2S0pN62NSmSudT\u002Fap\u002FBqZf7FqsI2cUxv2mUKzmyy+rYwbhd8TRgj1kFprNOaldrluO4dXjubJIY4qEyJY5Dc\u002FF03sGED4AiGBPVYtPh8zscG64yJJ9Njs1ReyUCSX4jYmxoZOnO+6GfXE0s2xQIDAQAB","x-nyt-continent":"NA","x-nyt-country":"US","x-nyt-region":"AL","x-nyt-gmt-offset":"-600"},"gqlFetchTimeout":4000,"disablePersistedQueries":false,"serviceWorkerFile":"service-worker-test-1551225575917.js","initialDeviceType":"desktop","abraTest":{}},"ssrQuery":{},"externalAssets":[]};
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ !function(s){function e(e){for(var t,r,d=e[0],a=e[1],c=e[2],n=0,o=[];n<d.length;n++)r=d[n],l[r]&&o.push(l[r][0]),l[r]=0;for(t in a)Object.prototype.hasOwnProperty.call(a,t)&&(s[t]=a[t]);for(p&&p(e);o.length;)o.shift()();return f.push.apply(f,c||[]),i()}function i(){for(var e,t=0;t<f.length;t++){for(var r=f[t],d=!0,a=1;a<r.length;a++){var c=r[a];0!==l[c]&&(d=!1)}d&&(f.splice(t--,1),e=u(u.s=r[0]))}return e}var r={},b={8:0},l={8:0},f=[];function u(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return s[e].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.e=function(f){var e=[];b[f]?e.push(b[f]):0!==b[f]&&{13:1,23:1,30:1,36:1}[f]&&e.push(b[f]=new Promise(function(e,d){for(var t=({1:"vendors~answerpage~audio~byline~collections~home~hubpage~paidpost~reviews~search~slideshow~story~tim~23412e0e",2:"answerpage~byline~collections~hubpage~reviews~search~slideshow~timeswire~trending~weddings",3:"answerpage~hubpage~search~timeswire~weddings",4:"vendors~audio~home~paidpost~story~trending",5:"vendors~audio~home~paidpost~story",6:"byline~your-list",7:"newsletter~regilite",9:"answerpage",10:"audio",11:"byline",12:"collections",13:"comments",14:"getstarted",15:"home",16:"hubpage",19:"newsletter",20:"newsletters",21:"paidpost",22:"privacy",23:"recirculation",24:"regilite",25:"reviews",26:"search",27:"slide",28:"slideshow",29:"stickyfilljs",30:"story",31:"timeswire",32:"trending",33:"vendors~collections",34:"vendors~getstarted",35:"vendors~slideshow",36:"weddings",37:"your-list"}[f]||f)+"-"+{1:"31d6cfe0d16ae931b73c",2:"31d6cfe0d16ae931b73c",3:"31d6cfe0d16ae931b73c",4:"31d6cfe0d16ae931b73c",5:"31d6cfe0d16ae931b73c",6:"31d6cfe0d16ae931b73c",7:"31d6cfe0d16ae931b73c",9:"31d6cfe0d16ae931b73c",10:"31d6cfe0d16ae931b73c",11:"31d6cfe0d16ae931b73c",12:"31d6cfe0d16ae931b73c",13:"bd0b5475a3386d2edf5e",14:"31d6cfe0d16ae931b73c",15:"31d6cfe0d16ae931b73c",16:"31d6cfe0d16ae931b73c",19:"31d6cfe0d16ae931b73c",20:"31d6cfe0d16ae931b73c",21:"31d6cfe0d16ae931b73c",22:"31d6cfe0d16ae931b73c",23:"0bf326d1cb2aaa1d6a66",24:"31d6cfe0d16ae931b73c",25:"31d6cfe0d16ae931b73c",26:"31d6cfe0d16ae931b73c",27:"31d6cfe0d16ae931b73c",28:"31d6cfe0d16ae931b73c",29:"31d6cfe0d16ae931b73c",30:"c2f71b82852b3b6d2cae",31:"31d6cfe0d16ae931b73c",32:"31d6cfe0d16ae931b73c",33:"31d6cfe0d16ae931b73c",34:"31d6cfe0d16ae931b73c",35:"31d6cfe0d16ae931b73c",36:"9e51dcb64d66fd0dcd9f",37:"31d6cfe0d16ae931b73c"}[f]+".css",a=u.p+t,r=document.getElementsByTagName("link"),c=0;c<r.length;c++){var n=(s=r[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(n===t||n===a))return e()}var o=document.getElementsByTagName("style");for(c=0;c<o.length;c++){var s;if((n=(s=o[c]).getAttribute("data-href"))===t||n===a)return e()}var i=document.createElement("link");i.rel="stylesheet",i.type="text/css",i.onload=e,i.onerror=function(e){var t=e&&e.target&&e.target.src||a,r=new Error("Loading CSS chunk "+f+" failed.\n("+t+")");r.request=t,delete b[f],i.parentNode.removeChild(i),d(r)},i.href=a,document.getElementsByTagName("head")[0].appendChild(i)}).then(function(){b[f]=0}));var t,r=l[f];if(0!==r)if(r)e.push(r[2]);else{var d=new Promise(function(e,t){r=l[f]=[e,t]});e.push(r[2]=d);var a,c=document.createElement("script");c.charset="utf-8",c.timeout=120,u.nc&&c.setAttribute("nonce",u.nc),c.src=u.p+""+({1:"vendors~answerpage~audio~byline~collections~home~hubpage~paidpost~reviews~search~slideshow~story~tim~23412e0e",2:"answerpage~byline~collections~hubpage~reviews~search~slideshow~timeswire~trending~weddings",3:"answerpage~hubpage~search~timeswire~weddings",4:"vendors~audio~home~paidpost~story~trending",5:"vendors~audio~home~paidpost~story",6:"byline~your-list",7:"newsletter~regilite",9:"answerpage",10:"audio",11:"byline",12:"collections",13:"comments",14:"getstarted",15:"home",16:"hubpage",19:"newsletter",20:"newsletters",21:"paidpost",22:"privacy",23:"recirculation",24:"regilite",25:"reviews",26:"search",27:"slide",28:"slideshow",29:"stickyfilljs",30:"story",31:"timeswire",32:"trending",33:"vendors~collections",34:"vendors~getstarted",35:"vendors~slideshow",36:"weddings",37:"your-list"}[t=f]||t)+"-"+{1:"cf3d06cc205cbab76cc6",2:"695085c3b95a0b3062dc",3:"adb69d32613cebdb8763",4:"ad28408ffcfe728262f1",5:"3a48a154dc74332f3715",6:"69e102137f5b3c13791a",7:"a307a6a3734818b95a52",9:"feb37a0cae78ec3454a5",10:"7ae270294dc5127a8023",11:"c531aa5897e53ad02164",12:"04354c54c976531a2493",13:"d76fdea4ac7f3b0511d9",14:"02579f11c43cc96d3245",15:"b1376dbb390dba1f45b0",16:"8df64d517b9336c5fdc7",19:"39f7c61b900c78aa1cd5",20:"a53b83e2fc69b07ba9ba",21:"e3517d4b960328561cde",22:"4ceba937c7af8d3e8bda",23:"8c9606ce1361269935b4",24:"d2117a73296a4c317a95",25:"5ebe9de932618c566453",26:"eb1fb870df308285dec7",27:"33ca9863a256583f6fc9",28:"1ed4722d7f93bda68662",29:"e6b8e69cbb7eae83c6cf",30:"001d14ee0c0d56abdf45",31:"ab6612f37b12740c1e30",32:"8b81d2cd6c2326e0c0ce",33:"aa3f1b78f44cf9b9dcac",34:"48db96f1efd43f8902d4",35:"816209e0f10fd5f52950",36:"e59145f5d6c8eb4ba02e",37:"67439e348c6138b3eb99"}[t]+".js",a=function(e){c.onerror=c.onload=null,clearTimeout(n);var t=l[f];if(0!==t){if(t){var r=e&&("load"===e.type?"missing":e.type),d=e&&e.target&&e.target.src,a=new Error("Loading chunk "+f+" failed.\n("+r+": "+d+")");a.type=r,a.request=d,t[1](a)}l[f]=void 0}};var n=setTimeout(function(){a({type:"timeout",target:c})},12e4);c.onerror=c.onload=a,document.head.appendChild(c)}return Promise.all(e)},u.m=s,u.c=r,u.d=function(e,t,r){u.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(t,e){if(1&e&&(t=u(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(u.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var d in t)u.d(r,d,function(e){return t[e]}.bind(null,d));return r},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,"a",t),t},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},u.p="/vi-assets/static-assets/",u.oe=function(e){throw console.error(e),e};var t=window.webpackJsonp=window.webpackJsonp||[],d=t.push.bind(t);t.push=e,t=t.slice();for(var a=0;a<t.length;a++)e(t[a]);var p=d;i()}([]);
+ //# sourceMappingURL=runtime-868be1a9e98d7fb1c782.js.map
+ ]]>
+ </script>
+ <script defer="defer" src="/vi-assets/static-assets/vendor-d51751135f37523a83e1.js"></script>
+ <script defer="defer" src="/vi-assets/static-assets/main-4d98e4226a600a92612c.js"></script>
+ <script>
+ <![CDATA[
+
+ (function(w, l) {
+ w[l] = w[l] || [];
+ w[l].push({
+ 'gtm.start': new Date().getTime(),
+ event: 'gtm.js'
+ });
+ })(window, 'dataLayer');
+ (function(){
+ var url = 'https://et.nytimes.com/pixel' +
+ '?url=' + window.location.href +
+ '&referrer=' + document.referrer +
+ '&subject=module-interactions' +
+ '&moduleData=%7B%22module%22%3A%22nyt-vi-page-pixel%22%2C%22pgType%22%3A%22%22%2C%22eventName%22%3A%22Impression%22%2C%22action%22%3A%22Impression%22%7D' +
+ '&sourceApp=nyt-vi&instant=1' +
+ '&_=' + Date.now();
+ var img = document.createElement('img');
+ img.src = url;
+ img.style.cssText = 'position: absolute; z-index: -999999; left: -1000px; top: -1000px;';
+ document.body.appendChild(img);
+ })();
+ ]]>
+ </script>
+ <script defer="defer" src="https://www.googletagmanager.com/gtm.js?id=GTM-P528B3&amp;gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&amp;gtm_preview=env-130&amp;gtm_cookies_win=x"></script> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P528B3&amp;gtm_auth=tfAzqo1rYDLgYhmTnSjPqw&amp;gtm_preview=env-130&amp;gtm_cookies_win=x" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+ <div id="RavenInstaller">
+ <script>
+ <![CDATA[
+ if (window.INSTALL_RAVEN) {
+ window.addEventListener('load', function(event) {
+ var includeRaven = document.getElementById("RavenInstaller");
+ var script = document.createElement("script");
+ script.src = "/vi-assets/static-assets/raven.min-830a6d04a55c283934dd1893d6ddc66d.js";
+ script.onload = function() {
+ /* eslint-disable */
+ // Install Raven
+ window.Raven.config('https://[email protected]/178860', {
+ release: vi.env.RELEASE,
+ environment: vi.env.ENVIRONMENT,
+ ignoreErrors: [/SecurityError: Blocked a frame with origin.*/]
+ }).install(); // Stop using our error handler
+
+ window.nyt_errors.ravenInstalled = true;
+ var regex = /nyt-a=(.*?)(;|$)/;
+ var id = regex.exec(document.cookie);
+
+ if (id !== null) {
+ id = id[1];
+ } else {
+ id = '';
+ } // Setting nyt-a as user context
+
+
+ window.Raven.setUserContext({
+ id: id
+ }); // Pass collected errors to Raven
+
+ window.nyt_errors.list.forEach(function (err) {
+ // weird?
+ if (!err) {
+ return;
+ } // also weird ... ?
+
+
+ if (!err.err) {
+ // maybe err itself is an Error?
+ if (err instanceof Error) {
+ window.Raven.captureException(err, err.data || {});
+ } // else { silently ignore? }
+
+ } // just making sure ...
+
+
+ if (err.err instanceof Error) {
+ window.Raven.captureException(err.err, err.data || {});
+ } // else { silently ignore? }
+
+ }); // Pass collected Tags to Raven
+
+ window.nyt_errors.tags.forEach(function (tag) {
+ window.Raven.setTagsContext(tag);
+ });
+ };
+ includeRaven.appendChild(script);
+ });
+ }
+ ]]>
+ </script>
+ </div>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json
index dafb56b44..577686706 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": "史蒂文的家_藍天 (stevenhgm)",
+ "Author": "\u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929 (stevenhgm)",
"Direction": null,
- "Excerpt": "一波波接續性低溫寒流報到 已將新竹尖石鄉後山一帶層層山巒披上嫣紅的彩衣 玉峰道路一路上雲氣山嵐滯留山頭 順路下切蜿蜒道路後不久即抵達來到&quot;玉峰國小&quot; &quot;美樹&quot;美",
+ "Excerpt": "\u4e00\u6ce2\u6ce2\u63a5\u7e8c\u6027\u4f4e\u6eab\u5bd2\u6d41\u5831\u5230 \u5df2\u5c07\u65b0\u7af9\u5c16\u77f3\u9109\u5f8c\u5c71\u4e00\u5e36\u5c64\u5c64\u5c71\u5dd2\u62ab\u4e0a\u5ae3\u7d05\u7684\u5f69\u8863 \u7389\u5cf0\u9053\u8def\u4e00\u8def\u4e0a\u96f2\u6c23\u5c71\u5d50\u6eef\u7559\u5c71\u982d \u9806\u8def\u4e0b\u5207\u873f\u8712\u9053\u8def\u5f8c\u4e0d\u4e45\u5373\u62b5\u9054\u4f86\u5230\"\u7389\u5cf0\u570b\u5c0f\" \"\u7f8e\u6a39\"\u7f8e",
"Image": "http:\/\/pic.pimg.tw\/stevenhgm\/1387895093-631461272.jpg",
- "Title": "新竹尖石_美樹營地賞楓 (2) @ 史蒂文的家_藍天 :: 痞客邦 PIXNET ::",
- "SiteName": "史蒂文的家_藍天"
-}
+ "Title": "\u65b0\u7af9\u5c16\u77f3_\u7f8e\u6a39\u71df\u5730\u8cde\u6953 (2) @ \u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929 :: \u75de\u5ba2\u90a6 PIXNET ::",
+ "SiteName": "\u53f2\u8482\u6587\u7684\u5bb6_\u85cd\u5929"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html
index ffa81c794..80a2e4a7b 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/pixnet/expected.html
@@ -1,6 +1,6 @@
<div id="article-content-inner">
<p>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="12-IMG_3886.jpg" height="359" original="http://pic.pimg.tw/stevenhgm/1387894842-1217674167.jpg" src="http://pic.pimg.tw/stevenhgm/1387894842-1217674167.jpg" title="12-IMG_3886.jpg" width="521"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="12-IMG_3886.jpg" src="http://pic.pimg.tw/stevenhgm/1387894842-1217674167.jpg" alt="12-IMG_3886.jpg" original="http://pic.pimg.tw/stevenhgm/1387894842-1217674167.jpg" width="521" height="359"></a>
</p>
<p><span>一波波<span>接續性</span>低溫寒流報到 已將新竹尖石鄉後山一帶層層山巒披上嫣紅的彩衣</span>
</p>
@@ -14,7 +14,7 @@
<p><span><span><span>營區內</span></span>除了露營、民宿、餐飲</span><span><span>、</span>賞楓項目<span>多了許多原木飾品更有畫龍點睛加乘效果</span></span>
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396919"><img alt="30-IMG_4228.jpg" original="http://pic.pimg.tw/stevenhgm/1387894971-1486345289.jpg" src="http://pic.pimg.tw/stevenhgm/1387894971-1486345289.jpg" title="30-IMG_4228.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396919"><img title="30-IMG_4228.jpg" src="http://pic.pimg.tw/stevenhgm/1387894971-1486345289.jpg" alt="30-IMG_4228.jpg" original="http://pic.pimg.tw/stevenhgm/1387894971-1486345289.jpg"></a></span></p>
<p><span>廣受歡迎的美樹營地有個很大特色就是<span>楓紅時期楓香樹由綠轉黃、轉紅到楓紅層層</span> </span>
</p>
<p><span><span>一來到"美樹"馬上眼睛為之一亮 也會深深地為那</span></span><span><span>多種顏色多層次渲染之下楓紅而迷惑</span></span>
@@ -29,66 +29,66 @@
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396943"><img alt="31-IMG_4231.jpg" original="http://pic.pimg.tw/stevenhgm/1387894979-1252095111.jpg" src="http://pic.pimg.tw/stevenhgm/1387894979-1252095111.jpg" title="31-IMG_4231.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396943"><img title="31-IMG_4231.jpg" src="http://pic.pimg.tw/stevenhgm/1387894979-1252095111.jpg" alt="31-IMG_4231.jpg" original="http://pic.pimg.tw/stevenhgm/1387894979-1252095111.jpg"></a></span></p>
<p><span> 每年12月向來是攝影班外拍的絕佳場所之一 楓紅期間入園費$50元</span></p>
<p><span>園區給愛攝一族淨空場景而不是散搭帳蓬之下反</span><span>而影響拍照畫面與構圖取景</span></p>
<p><span>露營的話則須待中午過後再進場搭帳的彈性做法個人也相當支持這樣的權宜之計</span></p>
<p><span> </span>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610088.jpg" original="http://pic.pimg.tw/stevenhgm/1387971416-4261675924.jpg" src="http://pic.pimg.tw/stevenhgm/1387971416-4261675924.jpg" title="P1610088.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610088.jpg" src="http://pic.pimg.tw/stevenhgm/1387971416-4261675924.jpg" alt="P1610088.jpg" original="http://pic.pimg.tw/stevenhgm/1387971416-4261675924.jpg"></a>
</p>
<p> <span>來到現場已是落葉飄飄堆疊滿地 不時隨著風吹雨襲而葉落垂地</span></p>
<p><span> </span>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610069.jpg" original="http://pic.pimg.tw/stevenhgm/1387971406-2480195851.jpg" src="http://pic.pimg.tw/stevenhgm/1387971406-2480195851.jpg" title="P1610069.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610069.jpg" src="http://pic.pimg.tw/stevenhgm/1387971406-2480195851.jpg" alt="P1610069.jpg" original="http://pic.pimg.tw/stevenhgm/1387971406-2480195851.jpg"></a>
</p>
<p><span>不忍踩過剛剛掉落的樹葉 沿著前人足跡踏痕輕踩而行</span></p>
<p><span>雖然只是一廂情願的想法 終究還是不可避免地將會化為塵土</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470383005"><img alt="02-P1610080.jpg" original="http://pic.pimg.tw/stevenhgm/1387894752-3567294980.jpg" src="http://pic.pimg.tw/stevenhgm/1387894752-3567294980.jpg" title="02-P1610080.jpg"></img></a> </span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470383005"><img title="02-P1610080.jpg" src="http://pic.pimg.tw/stevenhgm/1387894752-3567294980.jpg" alt="02-P1610080.jpg" original="http://pic.pimg.tw/stevenhgm/1387894752-3567294980.jpg"></a> </span></p>
<p><span> 葉落繽紛顯得幾分蕭瑟氣息 空氣中可以嗅得出來<span>依然</span>瀰漫著濕寒水氣</span>
</p>
<p><span>偶而還會飄下來一些霧氣水滴 不時張望尋找最佳楓葉主題</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470384469"><img alt="04-P1610087.jpg" original="http://pic.pimg.tw/stevenhgm/1387894771-2897027724.jpg" src="http://pic.pimg.tw/stevenhgm/1387894771-2897027724.jpg" title="04-P1610087.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470384469"><img title="04-P1610087.jpg" src="http://pic.pimg.tw/stevenhgm/1387894771-2897027724.jpg" alt="04-P1610087.jpg" original="http://pic.pimg.tw/stevenhgm/1387894771-2897027724.jpg"></a></span></p>
<p><span> 外拍的攝影班學員一堆早已不時穿梭其間</span></p>
<p><span>各自努力地找尋自認為最好的拍攝角度</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470384925"><img alt="05-P1610099.jpg" original="http://pic.pimg.tw/stevenhgm/1387894778-2035483089.jpg" src="http://pic.pimg.tw/stevenhgm/1387894778-2035483089.jpg" title="05-P1610099.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470384925"><img title="05-P1610099.jpg" src="http://pic.pimg.tw/stevenhgm/1387894778-2035483089.jpg" alt="05-P1610099.jpg" original="http://pic.pimg.tw/stevenhgm/1387894778-2035483089.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610095.jpg" original="http://pic.pimg.tw/stevenhgm/1387897405-3236217457.jpg" src="http://pic.pimg.tw/stevenhgm/1387897405-3236217457.jpg" title="P1610095.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610095.jpg" src="http://pic.pimg.tw/stevenhgm/1387897405-3236217457.jpg" alt="P1610095.jpg" original="http://pic.pimg.tw/stevenhgm/1387897405-3236217457.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470389803"><img alt="13-IMG_3891.jpg" original="http://pic.pimg.tw/stevenhgm/1387894848-3695967443.jpg" src="http://pic.pimg.tw/stevenhgm/1387894848-3695967443.jpg" title="13-IMG_3891.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470389803"><img title="13-IMG_3891.jpg" src="http://pic.pimg.tw/stevenhgm/1387894848-3695967443.jpg" alt="13-IMG_3891.jpg" original="http://pic.pimg.tw/stevenhgm/1387894848-3695967443.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470390760"><img alt="15-IMG_3906.jpg" original="http://pic.pimg.tw/stevenhgm/1387894863-3269042540.jpg" src="http://pic.pimg.tw/stevenhgm/1387894863-3269042540.jpg" title="15-IMG_3906.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470390760"><img title="15-IMG_3906.jpg" src="http://pic.pimg.tw/stevenhgm/1387894863-3269042540.jpg" alt="15-IMG_3906.jpg" original="http://pic.pimg.tw/stevenhgm/1387894863-3269042540.jpg"></a></span></p>
<p><span>"水槽"上面的這幾隻彩繪版貓頭鷹也太可愛了</span></p>
<p><span>同樣的造型加上不同色彩宛如賦予不同的生命力一般 cool!</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391000"><img alt="16-IMG_3916.jpg" original="http://pic.pimg.tw/stevenhgm/1387894868-3997219746.jpg" src="http://pic.pimg.tw/stevenhgm/1387894868-3997219746.jpg" title="16-IMG_3916.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391000"><img title="16-IMG_3916.jpg" src="http://pic.pimg.tw/stevenhgm/1387894868-3997219746.jpg" alt="16-IMG_3916.jpg" original="http://pic.pimg.tw/stevenhgm/1387894868-3997219746.jpg"></a></span></p>
<p><span> 雨水洗塵後的枝頭固然掉落些葉片是否也洗去塵勞憂傷</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391519"><img alt="17-IMG_3919.jpg" original="http://pic.pimg.tw/stevenhgm/1387894873-1524806724.jpg" src="http://pic.pimg.tw/stevenhgm/1387894873-1524806724.jpg" title="17-IMG_3919.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391519"><img title="17-IMG_3919.jpg" src="http://pic.pimg.tw/stevenhgm/1387894873-1524806724.jpg" alt="17-IMG_3919.jpg" original="http://pic.pimg.tw/stevenhgm/1387894873-1524806724.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470385711"><img alt="06-IMG_3853.jpg" original="http://pic.pimg.tw/stevenhgm/1387894788-105924953.jpg" src="http://pic.pimg.tw/stevenhgm/1387894788-105924953.jpg" title="06-IMG_3853.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470385711"><img title="06-IMG_3853.jpg" src="http://pic.pimg.tw/stevenhgm/1387894788-105924953.jpg" alt="06-IMG_3853.jpg" original="http://pic.pimg.tw/stevenhgm/1387894788-105924953.jpg"></a></span></p>
<p><span> 喜歡拍照的不論是平面掃描、天空搜尋、</span><span>地上地毯式搜索</span></p>
<p><span>有如小說偵探一般 不放過蛛絲馬跡地用力尋尋覓覓找尋最美角度</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470386749"><img alt="07-P1610104.jpg" original="http://pic.pimg.tw/stevenhgm/1387894798-1063855065.jpg" src="http://pic.pimg.tw/stevenhgm/1387894798-1063855065.jpg" title="07-P1610104.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470386749"><img title="07-P1610104.jpg" src="http://pic.pimg.tw/stevenhgm/1387894798-1063855065.jpg" alt="07-P1610104.jpg" original="http://pic.pimg.tw/stevenhgm/1387894798-1063855065.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470387232"><img alt="08-IMG_3862.jpg" original="http://pic.pimg.tw/stevenhgm/1387894807-309560703.jpg" src="http://pic.pimg.tw/stevenhgm/1387894807-309560703.jpg" title="08-IMG_3862.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470387232"><img title="08-IMG_3862.jpg" src="http://pic.pimg.tw/stevenhgm/1387894807-309560703.jpg" alt="08-IMG_3862.jpg" original="http://pic.pimg.tw/stevenhgm/1387894807-309560703.jpg"></a></span></p>
<p><span> 原本這周是由小朱團長早在一年前就跟"簍信"預定下來的場子</span></p>
<p><span>早上從台北出門之際還是小雨不斷細雨紛飛來到此地雖雨已停</span></p>
<p><span>但多日來的雨勢不斷已有部分區域水漬成攤並不適合落置帳篷</span></p>
@@ -98,32 +98,32 @@
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391732"><img alt="18-P1610141.jpg" original="http://pic.pimg.tw/stevenhgm/1387894882-1881930036.jpg" src="http://pic.pimg.tw/stevenhgm/1387894882-1881930036.jpg" title="18-P1610141.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470391732"><img title="18-P1610141.jpg" src="http://pic.pimg.tw/stevenhgm/1387894882-1881930036.jpg" alt="18-P1610141.jpg" original="http://pic.pimg.tw/stevenhgm/1387894882-1881930036.jpg"></a></span></p>
<p><span>午後從"秀巒"回到美樹之際已經全數撤退只剩下我們三車留下來</span></p>
<p><span>唯有"離開地球表面"睡車上的才可以不受到地上泥濘而影響</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470392077"><img alt="19-IMG_3933.jpg" original="http://pic.pimg.tw/stevenhgm/1387894887-407829597.jpg" src="http://pic.pimg.tw/stevenhgm/1387894887-407829597.jpg" title="19-IMG_3933.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470392077"><img title="19-IMG_3933.jpg" src="http://pic.pimg.tw/stevenhgm/1387894887-407829597.jpg" alt="19-IMG_3933.jpg" original="http://pic.pimg.tw/stevenhgm/1387894887-407829597.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470390364"><img alt="14-P1610134.jpg" original="http://pic.pimg.tw/stevenhgm/1387894857-470378275.jpg" src="http://pic.pimg.tw/stevenhgm/1387894857-470378275.jpg" title="14-P1610134.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470390364"><img title="14-P1610134.jpg" src="http://pic.pimg.tw/stevenhgm/1387894857-470378275.jpg" alt="14-P1610134.jpg" original="http://pic.pimg.tw/stevenhgm/1387894857-470378275.jpg"></a></span></p>
<p><span> 午後山嵐興起雲氣遊蕩<span>盤旋在對岸山頭 人潮來來去去似乎也沒有減少</span></span>
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470403381"><img alt="44-P1610283.jpg" original="http://pic.pimg.tw/stevenhgm/1387895099-4119123008.jpg" src="http://pic.pimg.tw/stevenhgm/1387895099-4119123008.jpg" title="44-P1610283.jpg"></img></a></span></p>
- <p><span> 美樹民宿有開設餐廳 室內簡單佈置提供伙食餐飲 <br></br></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470403381"><img title="44-P1610283.jpg" src="http://pic.pimg.tw/stevenhgm/1387895099-4119123008.jpg" alt="44-P1610283.jpg" original="http://pic.pimg.tw/stevenhgm/1387895099-4119123008.jpg"></a></span></p>
+ <p><span> 美樹民宿有開設餐廳 室內簡單佈置提供伙食餐飲 <br></span></p>
<p>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610212.jpg" original="http://pic.pimg.tw/stevenhgm/1387971426-4277312474.jpg" src="http://pic.pimg.tw/stevenhgm/1387971426-4277312474.jpg" title="P1610212.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610212.jpg" src="http://pic.pimg.tw/stevenhgm/1387971426-4277312474.jpg" alt="P1610212.jpg" original="http://pic.pimg.tw/stevenhgm/1387971426-4277312474.jpg"></a>
</p>
<p> <span>這兩間是民宿房間 跟著民宿主人"簍信"聊起來還提到日後將改變成兩層木屋</span></p>
<p><span>一樓則是咖啡飲料/賣店提供訪客來賓有個落腳席座之地 二樓才會是民宿房間</span></p>
- <p><span>心中有了計畫想法才會有日後的夢想藍圖 相信將會改變得更好的民宿露營環境<br></br></span></p>
+ <p><span>心中有了計畫想法才會有日後的夢想藍圖 相信將會改變得更好的民宿露營環境<br></span></p>
<p>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610219.jpg" original="http://pic.pimg.tw/stevenhgm/1387971436-2828193592.jpg" src="http://pic.pimg.tw/stevenhgm/1387971436-2828193592.jpg" title="P1610219.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610219.jpg" src="http://pic.pimg.tw/stevenhgm/1387971436-2828193592.jpg" alt="P1610219.jpg" original="http://pic.pimg.tw/stevenhgm/1387971436-2828193592.jpg"></a>
</p>
<p><span> 民宿前這一大區楓香林為土質營位 大致區分前、後兩個營區</span></p>
<p><span>前面這一區約可搭上十二帳/車/廳 後面那區也大約4~5帳/車/廳</span></p>
@@ -131,26 +131,26 @@
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470388054"><img alt="10-P1610114.jpg" original="http://pic.pimg.tw/stevenhgm/1387894823-4061326865.jpg" src="http://pic.pimg.tw/stevenhgm/1387894823-4061326865.jpg" title="10-P1610114.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470388054"><img title="10-P1610114.jpg" src="http://pic.pimg.tw/stevenhgm/1387894823-4061326865.jpg" alt="10-P1610114.jpg" original="http://pic.pimg.tw/stevenhgm/1387894823-4061326865.jpg"></a></span></p>
<p><span> 營區水電方便 水槽也很有特色</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470393178"><img alt="22-P1610245.jpg" original="http://pic.pimg.tw/stevenhgm/1387894911-3706194096.jpg" src="http://pic.pimg.tw/stevenhgm/1387894911-3706194096.jpg" title="22-P1610245.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470393178"><img title="22-P1610245.jpg" src="http://pic.pimg.tw/stevenhgm/1387894911-3706194096.jpg" alt="22-P1610245.jpg" original="http://pic.pimg.tw/stevenhgm/1387894911-3706194096.jpg"></a></span></p>
<p><span> 這次選擇左側地勢高些以防午夜下雨泥濘</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470392404"><img alt="20-P1610238.jpg" original="http://pic.pimg.tw/stevenhgm/1387894894-1173705525.jpg" src="http://pic.pimg.tw/stevenhgm/1387894894-1173705525.jpg" title="20-P1610238.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470392404"><img title="20-P1610238.jpg" src="http://pic.pimg.tw/stevenhgm/1387894894-1173705525.jpg" alt="20-P1610238.jpg" original="http://pic.pimg.tw/stevenhgm/1387894894-1173705525.jpg"></a></span></p>
<p><span> "野馬"特地帶來了冬至應景食材ㄜ<span>---湯圓</span></span>
</p>
<p><span>這家還是最近被評比第一名氣的湯圓專賣店 </span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470393130"><img alt="21-P1610241.jpg" original="http://pic.pimg.tw/stevenhgm/1387894901-1058040075.jpg" src="http://pic.pimg.tw/stevenhgm/1387894901-1058040075.jpg" title="21-P1610241.jpg"></img></a></span></p>
- <p><span> 向來對於湯圓是敬謝不敏 沒想到是出乎意料之外的好吃 <span>沒話說!</span><br></br></span>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470393130"><img title="21-P1610241.jpg" src="http://pic.pimg.tw/stevenhgm/1387894901-1058040075.jpg" alt="21-P1610241.jpg" original="http://pic.pimg.tw/stevenhgm/1387894901-1058040075.jpg"></a></span></p>
+ <p><span> 向來對於湯圓是敬謝不敏 沒想到是出乎意料之外的好吃 <span>沒話說!</span><br></span>
</p>
- <p><span> <a href="http://stevenhgm.pixnet.net/album/photo/470394156"><img alt="24-IMG_4113.jpg" original="http://pic.pimg.tw/stevenhgm/1387894925-1582979930.jpg" src="http://pic.pimg.tw/stevenhgm/1387894925-1582979930.jpg" title="24-IMG_4113.jpg"></img></a></span></p>
+ <p><span> <a href="http://stevenhgm.pixnet.net/album/photo/470394156"><img title="24-IMG_4113.jpg" src="http://pic.pimg.tw/stevenhgm/1387894925-1582979930.jpg" alt="24-IMG_4113.jpg" original="http://pic.pimg.tw/stevenhgm/1387894925-1582979930.jpg"></a></span></p>
<p><span> 喜歡原住民朋友的坦率、真誠 要將民宿營地經營的有聲有色並非容易之事</span></p>
<p><span><span>午茶時間與"簍信"閒聊分享著他的觀點理念之時很支持對於環境應有生態保護</span> </span>
</p>
@@ -159,46 +159,46 @@
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470397399"><img alt="32-IMG_4248.jpg" original="http://pic.pimg.tw/stevenhgm/1387894989-1689510758.jpg" src="http://pic.pimg.tw/stevenhgm/1387894989-1689510758.jpg" title="32-IMG_4248.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470397399"><img title="32-IMG_4248.jpg" src="http://pic.pimg.tw/stevenhgm/1387894989-1689510758.jpg" alt="32-IMG_4248.jpg" original="http://pic.pimg.tw/stevenhgm/1387894989-1689510758.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470394732"><img alt="25-IMG_4152.jpg" original="http://pic.pimg.tw/stevenhgm/1387894933-2886337976.jpg" src="http://pic.pimg.tw/stevenhgm/1387894933-2886337976.jpg" title="25-IMG_4152.jpg"></img></a> </span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470394732"><img title="25-IMG_4152.jpg" src="http://pic.pimg.tw/stevenhgm/1387894933-2886337976.jpg" alt="25-IMG_4152.jpg" original="http://pic.pimg.tw/stevenhgm/1387894933-2886337976.jpg"></a> </span></p>
<p><span> 入夜前雨絲終於漸漸緩和下來 雖然氣溫很低卻沒感受到寒冷的跡象</span></p>
<p><span>是山谷中少了寒氣還是美樹營區裡的人熱情洋溢暖化了不少寒意</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470404359"><img alt="IMG_4158.jpg" original="http://pic.pimg.tw/stevenhgm/1387895113-4041265313.jpg" src="http://pic.pimg.tw/stevenhgm/1387895113-4041265313.jpg" title="IMG_4158.jpg"></img></a></span></p>
- <p><span> 聖誕前夕裝點些聖誕飾品 感受一下節慶的氛圍<br></br></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470404359"><img title="IMG_4158.jpg" src="http://pic.pimg.tw/stevenhgm/1387895113-4041265313.jpg" alt="IMG_4158.jpg" original="http://pic.pimg.tw/stevenhgm/1387895113-4041265313.jpg"></a></span></p>
+ <p><span> 聖誕前夕裝點些聖誕飾品 感受一下節慶的氛圍<br></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470394948"><img alt="26-P1610261.jpg" original="http://pic.pimg.tw/stevenhgm/1387894940-3359449338.jpg" src="http://pic.pimg.tw/stevenhgm/1387894940-3359449338.jpg" title="26-P1610261.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470394948"><img title="26-P1610261.jpg" src="http://pic.pimg.tw/stevenhgm/1387894940-3359449338.jpg" alt="26-P1610261.jpg" original="http://pic.pimg.tw/stevenhgm/1387894940-3359449338.jpg"></a></span></p>
<p><span>晚餐準備了砂鍋魚頭</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470403921"><img alt="46-1021221美樹露營.jpg" original="http://pic.pimg.tw/stevenhgm/1387895106-1387217970.jpg" src="http://pic.pimg.tw/stevenhgm/1387895106-1387217970.jpg" title="46-1021221美樹露營.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470403921"><img title="46-1021221美樹露營.jpg" src="http://pic.pimg.tw/stevenhgm/1387895106-1387217970.jpg" alt="46-1021221美樹露營.jpg" original="http://pic.pimg.tw/stevenhgm/1387895106-1387217970.jpg"></a></span></p>
<p><span>"蒯嫂"還特地準備著羊肩排、鹹豬肉、柳葉魚...哇!這哩澎湃哩...</span></p>
<p><span> "永老爺"早已備妥了好酒為遠自台南來的蒯兄嫂敬一杯囉</span></p>
<p><span>感謝蒯嫂精心準備的好料理 食指大動好菜色感恩ㄟ!</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470395164"><img alt="27-IMG_4173.jpg" original="http://pic.pimg.tw/stevenhgm/1387894947-2636431527.jpg" src="http://pic.pimg.tw/stevenhgm/1387894947-2636431527.jpg" title="27-IMG_4173.jpg"></img></a></span></p>
- <p><span> 吃得快精光之際...才想到忘了拍合照...(哇哩咧 ^&amp;*()<br></br></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470395164"><img title="27-IMG_4173.jpg" src="http://pic.pimg.tw/stevenhgm/1387894947-2636431527.jpg" alt="27-IMG_4173.jpg" original="http://pic.pimg.tw/stevenhgm/1387894947-2636431527.jpg"></a></span></p>
+ <p><span> 吃得快精光之際...才想到忘了拍合照...(哇哩咧 ^&amp;*()<br></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470395614"><img alt="28-IMG_4178.jpg" original="http://pic.pimg.tw/stevenhgm/1387894956-618198074.jpg" src="http://pic.pimg.tw/stevenhgm/1387894956-618198074.jpg" title="28-IMG_4178.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470395614"><img title="28-IMG_4178.jpg" src="http://pic.pimg.tw/stevenhgm/1387894956-618198074.jpg" alt="28-IMG_4178.jpg" original="http://pic.pimg.tw/stevenhgm/1387894956-618198074.jpg"></a></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396325"><img alt="29-IMG_4188.jpg" original="http://pic.pimg.tw/stevenhgm/1387894961-2201609427.jpg" src="http://pic.pimg.tw/stevenhgm/1387894961-2201609427.jpg" title="29-IMG_4188.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470396325"><img title="29-IMG_4188.jpg" src="http://pic.pimg.tw/stevenhgm/1387894961-2201609427.jpg" alt="29-IMG_4188.jpg" original="http://pic.pimg.tw/stevenhgm/1387894961-2201609427.jpg"></a></span></p>
<p><span> 隔日睡到很晚才起床 不用拍日出晨光的營地對我來說都是個幸福的睡眠</span></p>
<p><span>哪怕是葉落飄零落滿地還是睡夢周公召見而去 起床的事~差點都忘記了</span></p>
<p>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="IMG_4205.jpg" original="http://pic.pimg.tw/stevenhgm/1387971396-2999285851.jpg" src="http://pic.pimg.tw/stevenhgm/1387971396-2999285851.jpg" title="IMG_4205.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="IMG_4205.jpg" src="http://pic.pimg.tw/stevenhgm/1387971396-2999285851.jpg" alt="IMG_4205.jpg" original="http://pic.pimg.tw/stevenhgm/1387971396-2999285851.jpg"></a>
</p>
<p> <span> 昨天細雨紛飛依然打落了不少落葉中間這株整個都快變成枯枝了</span></p>
<p><span>昨天依稀凋零稀疏的楓葉殘留今兒個完全不復存在(上周是最美的代名詞)</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470397765"><img alt="33-IMG_4255.jpg" original="http://pic.pimg.tw/stevenhgm/1387894999-1588465034.jpg" src="http://pic.pimg.tw/stevenhgm/1387894999-1588465034.jpg" title="33-IMG_4255.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470397765"><img title="33-IMG_4255.jpg" src="http://pic.pimg.tw/stevenhgm/1387894999-1588465034.jpg" alt="33-IMG_4255.jpg" original="http://pic.pimg.tw/stevenhgm/1387894999-1588465034.jpg"></a></span></p>
<p><span><span>上回來得太早沒能見到楓葉泛紅 這次晚了一周已陸續落葉也</span>無從比對楓葉差異性 </span>
</p>
<p><span><span> 另一種角度看不論青楓、金黃葉紅的楓香、葉落飄零秋滿霜、落葉枯枝的蕭瑟</span></span>
@@ -207,44 +207,44 @@
</p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470398749"><img alt="34-P1610269.jpg" original="http://pic.pimg.tw/stevenhgm/1387895007-4184988815.jpg" src="http://pic.pimg.tw/stevenhgm/1387895007-4184988815.jpg" title="34-P1610269.jpg"></img></a></span></p>
- <p><span> 早起的"蒯嫂"已經備好熱騰騰中式稀飯、包子、蔬果 頓時~有幸福的感覺<br></br></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470398749"><img title="34-P1610269.jpg" src="http://pic.pimg.tw/stevenhgm/1387895007-4184988815.jpg" alt="34-P1610269.jpg" original="http://pic.pimg.tw/stevenhgm/1387895007-4184988815.jpg"></a></span></p>
+ <p><span> 早起的"蒯嫂"已經備好熱騰騰中式稀飯、包子、蔬果 頓時~有幸福的感覺<br></span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470399232"><img alt="35-IMG_4303.jpg" original="http://pic.pimg.tw/stevenhgm/1387895016-2193615729.jpg" src="http://pic.pimg.tw/stevenhgm/1387895016-2193615729.jpg" title="35-IMG_4303.jpg"></img></a> </span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470399232"><img title="35-IMG_4303.jpg" src="http://pic.pimg.tw/stevenhgm/1387895016-2193615729.jpg" alt="35-IMG_4303.jpg" original="http://pic.pimg.tw/stevenhgm/1387895016-2193615729.jpg"></a> </span></p>
<p><span> 星期天早上趁著攝影團還沒入場先來人物場景特寫</span></p>
<p><span>野馬家兩張新"座椅"就當作是試坐囉!拍謝哩</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470400471"><img alt="38-IMG_4330.jpg" original="http://pic.pimg.tw/stevenhgm/1387895047-92554161.jpg" src="http://pic.pimg.tw/stevenhgm/1387895047-92554161.jpg" title="38-IMG_4330.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470400471"><img title="38-IMG_4330.jpg" src="http://pic.pimg.tw/stevenhgm/1387895047-92554161.jpg" alt="38-IMG_4330.jpg" original="http://pic.pimg.tw/stevenhgm/1387895047-92554161.jpg"></a></span></p>
<p>
- <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img alt="P1610279.jpg" original="http://pic.pimg.tw/stevenhgm/1387971446-966387512.jpg" src="http://pic.pimg.tw/stevenhgm/1387971446-966387512.jpg" title="P1610279.jpg"></img></a>
+ <a href="http://stevenhgm.pixnet.net/album/photo/470389413"><img title="P1610279.jpg" src="http://pic.pimg.tw/stevenhgm/1387971446-966387512.jpg" alt="P1610279.jpg" original="http://pic.pimg.tw/stevenhgm/1387971446-966387512.jpg"></a>
</p>
<p><span> 難得有此無人美景在楓樹下的聖誕氛圍也一定要來一張才行</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470399946"><img alt="37-IMG_4323.jpg" original="http://pic.pimg.tw/stevenhgm/1387895036-848978834.jpg" src="http://pic.pimg.tw/stevenhgm/1387895036-848978834.jpg" title="37-IMG_4323.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470399946"><img title="37-IMG_4323.jpg" src="http://pic.pimg.tw/stevenhgm/1387895036-848978834.jpg" alt="37-IMG_4323.jpg" original="http://pic.pimg.tw/stevenhgm/1387895036-848978834.jpg"></a></span></p>
<p><span> 三家合照(Hero也一定要入鏡的)</span></p>
- <p><span> <a href="http://stevenhgm.pixnet.net/album/photo/470401161"><img alt="40-IMG_4342.jpg" original="http://pic.pimg.tw/stevenhgm/1387895067-717977929.jpg" src="http://pic.pimg.tw/stevenhgm/1387895067-717977929.jpg" title="40-IMG_4342.jpg"></img></a></span></p>
+ <p><span> <a href="http://stevenhgm.pixnet.net/album/photo/470401161"><img title="40-IMG_4342.jpg" src="http://pic.pimg.tw/stevenhgm/1387895067-717977929.jpg" alt="40-IMG_4342.jpg" original="http://pic.pimg.tw/stevenhgm/1387895067-717977929.jpg"></a></span></p>
<p><span> 接著攝影團入場帶隊老師請求借個時間也來讓學員練習楓樹下的聖誕飾品</span></p>
<p><span>此時剛好也遇到早在FB社團相互回應卻頭一次謀面的Mr."大雄"真是幸會了</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402037"><img alt="42-IMG_4382.jpg" original="http://pic.pimg.tw/stevenhgm/1387895083-1227791497.jpg" src="http://pic.pimg.tw/stevenhgm/1387895083-1227791497.jpg" title="42-IMG_4382.jpg"></img></a> </span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402037"><img title="42-IMG_4382.jpg" src="http://pic.pimg.tw/stevenhgm/1387895083-1227791497.jpg" alt="42-IMG_4382.jpg" original="http://pic.pimg.tw/stevenhgm/1387895083-1227791497.jpg"></a> </span></p>
<p><span> 接近中午時分陽光漸露 藍天帷幕再次嶄露頭角 ~ 久違了!</span></p>
<p><span>期盼下的天空終於放晴 沒有缺席的藍天還是準時赴約如期出席</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402682"><img alt="41-IMG_4366.jpg" original="http://pic.pimg.tw/stevenhgm/1387895075-2647157523.jpg" src="http://pic.pimg.tw/stevenhgm/1387895075-2647157523.jpg" title="41-IMG_4366.jpg"></img></a></span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402682"><img title="41-IMG_4366.jpg" src="http://pic.pimg.tw/stevenhgm/1387895075-2647157523.jpg" alt="41-IMG_4366.jpg" original="http://pic.pimg.tw/stevenhgm/1387895075-2647157523.jpg"></a></span></p>
<p><span> 這兩天肉肉(Hero)天雨濕滑無法自由奔跑都快悶壞了</span></p>
<p><span>天晴後"蒯嫂"帶著散步遊園也好解解悶</span></p>
- <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402898"><img alt="43-IMG_4383.jpg" original="http://pic.pimg.tw/stevenhgm/1387895093-631461272.jpg" src="http://pic.pimg.tw/stevenhgm/1387895093-631461272.jpg" title="43-IMG_4383.jpg"></img></a> </span></p>
+ <p><span><a href="http://stevenhgm.pixnet.net/album/photo/470402898"><img title="43-IMG_4383.jpg" src="http://pic.pimg.tw/stevenhgm/1387895093-631461272.jpg" alt="43-IMG_4383.jpg" original="http://pic.pimg.tw/stevenhgm/1387895093-631461272.jpg"></a> </span></p>
<p><span>收拾好裝備準備離開營地 亮麗的</span><span>天空鮮明對比下的楓樹林又讓人覺得有點捨不得離開</span></p>
<p><span><span>道別了"美樹營地"準備前往而行</span>"石磊國小"一個很生疏的小學座落在這深山部落裡</span>
</p>
@@ -255,7 +255,7 @@
</span>
</a> </span><span lang="EN-US"><span>資訊</span></span>
</p>
- <p><span lang="EN-US"><span><span>聯絡電話:</span><span lang="EN-US">03-584-7231</span><span>  </span><span lang="EN"> </span><span>行動</span><span lang="EN">:</span><span lang="EN-US"> 0937-141993</span><span lang="EN-US"><br></br></span><span>林錦武<span lang="EN-US"> (泰雅族名: 摟信)</span></span><span lang="EN"><br></br></span><span>營地地址:<span>新竹縣尖石鄉玉峰村<span lang="EN-US">6鄰20號</span></span>
+ <p><span lang="EN-US"><span><span>聯絡電話:</span><span lang="EN-US">03-584-7231</span><span>  </span><span lang="EN"> </span><span>行動</span><span lang="EN">:</span><span lang="EN-US"> 0937-141993</span><span lang="EN-US"><br></span><span>林錦武<span lang="EN-US"> (泰雅族名: 摟信)</span></span><span lang="EN"><br></span><span>營地地址:<span>新竹縣尖石鄉玉峰村<span lang="EN-US">6鄰20號</span></span>
</span>
</span>
</span>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-metadata.json
new file mode 100644
index 000000000..b026cb40a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua.",
+ "Image": null,
+ "Title": "Remove aria-hidden elements test",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected.html
new file mode 100644
index 000000000..8d2152d5b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/expected.html
@@ -0,0 +1,7 @@
+<div>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua.</p>
+ <p>Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat.</p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/source.html
new file mode 100644
index 000000000..1c558e6e7
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/remove-aria-hidden/source.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8"/>
+ <title>Remove aria-hidden elements test</title>
+</head>
+<body>
+ <article>
+ <h1>Lorem</h1>
+ <div>
+ <p><span aria-hidden="true">**WRONG**</span>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua.</p>
+ <p>Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat.</p>
+ </div>
+ </article>
+</body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html
index 4a46dd585..500f6872f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/reordering-paragraphs/expected.html
@@ -1,4 +1,5 @@
<div>
+
<p id="first">Regarding item# 11111, under sufficiently extreme conditions, quarks may
become deconfined and exist as free particles. In the course of asymptotic
freedom, the strong interaction becomes weaker at higher temperatures.
@@ -23,4 +24,5 @@
of matter is called quark-gluon plasma.[81] The exact conditions needed
to give rise to this state are unknown and have been the subject of a great
deal of speculation and experimentation.</p>
- <br id="br2"></br></div> \ No newline at end of file
+ <br id="br2">
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html
index 56e36a4bc..778fdc062 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-brs/expected.html
@@ -1,14 +1,14 @@
<div><p>
- Lorem ipsum<br></br>dolor sit</p><p>amet, consectetur adipisicing elit, sed do eiusmod<br></br>
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br></br>
+ Lorem ipsum<br>dolor sit</p><p>amet, consectetur adipisicing elit, sed do eiusmod<br>
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br>
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo</p><p>
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br></br>
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br></br>
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse<br>
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br>
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p></div><div><p>
- Tempor</p><p>incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br></br>
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br></br>
+ Tempor</p><p>incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,<br>
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo<br>
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse</p><p>
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br></br>
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non<br>
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html
index a36b1a252..cb19cbf17 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/expected.html
@@ -1,5 +1,6 @@
<article>
- <p><span face="Arial" size="2">Lorem ipsum dolor</span> sit amet, consectetur adipisicing elit, sed do eiusmod
+ <h2>Lorem</h2>
+ <p><span face="Arial" size="2"><span face="Times" size="10">Lorem</span> ipsum dolor</span> sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. <span face="Arial" size="2">Duis</span> aute irure dolor in reprehenderit in voluptate velit esse
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html
index 5789e5676..d47851d25 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/replace-font-tags/source.html
@@ -8,7 +8,7 @@
<article>
<h1>Lorem</h1>
<div>
- <font face="Arial" size="2">Lorem ipsum dolor</font> sit amet, consectetur adipisicing elit, sed do eiusmod
+ <font face="Arial" size="2"><font face="Times" size="10">Lorem</font> ipsum dolor</font> sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. <font face="Arial" size="2">Duis</font> aute irure dolor in reprehenderit in voluptate velit esse
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html
index eba1686e9..9c611c9e6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-1/expected.html
@@ -1,4 +1,6 @@
-<div><article>
+<div>
+ <article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -8,4 +10,5 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article></div> \ No newline at end of file
+ </article>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html
index eba1686e9..9c611c9e6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-2/expected.html
@@ -1,4 +1,6 @@
-<div><article>
+<div>
+ <article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -8,4 +10,5 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article></div> \ No newline at end of file
+ </article>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html
index 75448882b..789260191 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-3/expected.html
@@ -1,4 +1,6 @@
-<div dir="rtl"><article>
+<div dir="rtl">
+ <article>
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -8,4 +10,5 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article></div> \ No newline at end of file
+ </article>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html
index 14724e72d..0d55d33d5 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/rtl-4/expected.html
@@ -1,4 +1,6 @@
-<div><article dir="rtl">
+<div>
+ <article dir="rtl">
+ <h2>Lorem</h2>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -8,4 +10,5 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article></div> \ No newline at end of file
+ </article>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html
index d1cb60ef1..4df6b4287 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/salon-1/expected.html
@@ -12,7 +12,7 @@
murdering his ex-wife, seized hostages in a café that was located in Sydney’s
Central Business District or “CBD.” In the process he put up an Islamic
flag – “igniting,” as <a href="http://www.reuters.com/article/2014/12/15/us-australia-security-idUSKBN0JS0WX20141215">Reuters</a> reported,
- “fears of a jihadist attack in the heart of the country’s biggest city.”</p><p>In the midst of the fear, Uber stepped in and tweeted this announcement: 
+ “fears of a jihadist attack in the heart of the country’s biggest city.”</p><p>In the midst of the fear, Uber stepped in and tweeted this announcement:&nbsp;
<span>“We are all concerned with events in CBD. Fares have increased to encourage
more drivers to come online &amp; pick up passengers in the area.”</span>
</p><p>As <a href="http://mashable.com/2014/12/14/uber-sydney-surge-pricing/">Mashable </a>reports,
@@ -196,7 +196,7 @@
<p>And then there’s the matter of our collective psyche. In her book “A Paradise
Built in Hell: The Extraordinary Communities that Arise in Disaster,” Rebecca
Solnit wrote of the purpose, meaning and deep satisfaction people find
- when they pull together to help one another in the face of adversity. 
+ when they pull together to help one another in the face of adversity.&nbsp;
But in the world Uber seeks to create, those surges of the spirit would
be replaced by surge pricing.<em></em>
</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-images.json
new file mode 100644
index 000000000..cae59d312
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-images.json
@@ -0,0 +1,4 @@
+[
+ "https:\/\/static.seattletimes.com\/wp-content\/uploads\/2019\/04\/120028-1200x630.jpg",
+ "https:\/\/static.seattletimes.com\/wp-content\/uploads\/2019\/04\/120109-1020x680.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-metadata.json
new file mode 100644
index 000000000..7eaff99a2
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "April 28, 2019 at 6:01 am Updated April 29, 2019 at 3:33 pm",
+ "Direction": null,
+ "Excerpt": "The story of Whole Foods\u2019 halibut deal opens a window into Amazon\u2019s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the dominant economic force of the 21st.",
+ "Image": "https:\/\/static.seattletimes.com\/wp-content\/uploads\/2019\/04\/120028-1200x630.jpg",
+ "Title": "Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon\u2019s strategy with Whole Foods",
+ "SiteName": "The Seattle Times"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected.html
new file mode 100644
index 000000000..27397d835
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/expected.html
@@ -0,0 +1,179 @@
+<div itemprop="articleBody" id="article-content">
+ <p>
+ From the deck of his 106-year-old halibut schooner, undergoing a seasonal overhaul at Fisherman’s Terminal in Seattle, skipper Wade Bassi has better insight than most into what’s happening at Amazon-owned Whole Foods Market, at least as pertains to the product he knows best.
+ </p>
+ <p>
+ While he doesn’t buy halibut much — he’s got a freezer full of it — Bassi, 43 years a fisherman, keeps an eye on how it’s handled and presented in the grocery stores and fish markets.
+ </p>
+ <p>
+ “When you look at nice halibut, I mean it is pure white,” he said. “And it is flaky-looking, and it is beautiful. It’s translucent. If you’ve got that in the fish market, people are going to buy it.”
+ </p>
+ <p>
+ A few days earlier, Whole Foods touted a rarely seen promotional price for halibut as part of its ongoing campaign to revise the grocery chain’s high-cost reputation while maintaining its image for quality and sustainability.
+ </p>
+ <p>
+ “Whole Foods is one of the better ones, to be honest with you,” Bassi said. “But you know, Whole Foods, whole paycheck. … They usually do charge way more for everything than anywhere else. Which really surprises me that they’re selling this for $16-something a pound, because they’re not making anything on it.”
+ </p>
+ <p>
+ Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy as it seeks to combine the defining characteristics of each brand, leverage its juggernaut Prime membership program and take a larger share of the grocery business from competitors such as Walmart, Kroger and Costco.
+ </p>
+
+ <p>
+ It also draws a long line from a major Seattle industry with roots in the 19<sup>th</sup> century to the dominant economic force of the 21<sup>st</sup>.
+ </p>
+ <p>
+ Amazon bought Whole Foods in August 2017 for $13.7 billion, its largest acquisition and an aggressive move into the grocery business.
+ </p>
+ <p>
+ The combination of the two has been steady, said Tom Forte, who follows Amazon as a managing director at the D.A. Davidson brokerage. In a few more years, he said, “You won’t recognize the original Whole Foods.”
+ </p>
+ <p>
+ Within months of the acquisition, Forte said, Whole Foods was selling cheaper cage-free eggs and organic ground beef, prices it said were a result of the deal.
+ </p>
+ <p>
+ Then came the integration of Prime, Amazon’s $119-a-year shipping and media-subscription program, which Amazon founder Jeff Bezos said last year had surpassed 100 million members. In Whole Foods, Prime operates as a hybrid of the customer-loyalty discount programs offered by most grocers — in which consumers trade details of their purchasing habits for lower prices — and a paid membership like at Costco or Sam’s Club.
+ </p>
+ <p>
+ Whole Foods stores have been festooned with yellow and blue signs pointing out Prime member benefits, one of which was fresh halibut fillets priced at $16.99 a pound, albeit only for a week earlier this month.
+ </p>
+
+ <p>
+ “I was shocked to see that level,” said Tyler Besecker, president of Mercer Island-based Dana F. Besecker Company, the largest buyer of Pacific halibut. The price, which was matched at Kroger-owned QFC stores in the region last week, is “as low as I’ve ever seen.” (Besecker does not currently supply Whole Foods.)
+ </p>
+ <p>
+ Fresh halibut fillets routinely sell for $24 to $28 a pound, and often more.
+ </p>
+ <p>
+ He said there’s little if any room for a profit at the promotional price offered by Whole Foods and QFC. “They might be selling those at cost or as loss leaders just to get people into the stores,” Besecker said.
+ </p>
+
+ <p>
+ In the competitive grocery business, promotions like this happen all the time. The thinking is that shoppers will be attracted by the discount on a staple or a prestige item, and then fill their carts with other groceries sold at a profit.
+ </p>
+ <p>
+ A Whole Foods spokeswoman declined to comment on pricing. The temporary halibut discount is one of more than 300 such Prime promotions Whole Foods plans in the next few months. The company also said it was lowering prices across the store, its third such announcement since the acquisition.
+ </p>
+ <p>
+ At the seafood counter in the Whole Foods store on Westlake, surrounded by Amazon headquarters buildings, a sign advertised “First of the Season Fresh Alaskan Halibut” and sported the blue Marine Stewardship Council (MSC) Certified Sustainable Seafood label.
+ </p>
+
+ <p>
+ Whole Foods has been a pioneer in sustainable-seafood marketing, beginning in 1999 when it began to stock fish with the MSC label. In the mid-2000s, Pacific halibut fishermen sought the certification — a system of third-party audits that tracks seafood from catch to market — and Whole Foods was there from the beginning.
+ </p>
+ <p>
+ “They were the first ones to market the MSC halibut,” said Bob Alverson, head of the Fishing Vessel Owners Association, representing boats that catch halibut and black cod and a driver of the certification effort. “It turned into quite a marketing advantage. Whole Foods saw that early. They were focusing on sustainable, high-quality food products. They had quite a bit of foresight, I think, in that direction.”
+ </p>
+ <p>
+ The certification comes with added costs borne by the fishermen and buyers, and passed on to consumers. But it’s also an assurance “that people are watching out for the resource,” he said.
+ </p>
+
+ <p>
+ As it tries to convince people it has lower prices, Whole Foods has been very careful to maintain the reputation built on products like MSC-certified halibut.
+ </p>
+ <div>
+ <figure id="image-11519494">
+ <img data-ratio="1.5" data-caption="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" class alt="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" src="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg" srcset="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w" sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" data-sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" data-old-src="https://www.seattletimes.com/wp-content/themes/st_refresh/img/lazy-loading-14x9.png" data-src="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg" data-srcset="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w">
+ <figcaption>
+ <span>Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)</span>
+ </figcaption>
+ </figure>
+ </div>
+ <p>
+ <strong>Whole Foods future</strong>
+ </p>
+ <p>
+ New signs in stores appeared this month, spelling out the value proposition it’s trying to strike: “New lower prices. Same high standards,” reads one, against a background image of carrots.
+ </p>
+ <p>
+ At the same time, the company claims its new prices and Prime deals have saved customers “hundreds of millions of dollars” since the Amazon acquisition.
+ </p>
+
+ <p>
+ If prices are being lowered and the quality bar stays the same, something else has to give.
+ </p>
+ <p>
+ Analysts provided a few theories:
+ </p>
+ <p>
+ Amazon could be willing to accept losses or slimmer profits within Whole Foods, as it has done in other businesses, in an effort to expand its customer base.
+ </p>
+ <p>
+ “Do they take the profit from their non-retail efforts, which today is primarily cloud computing, and then reinvest those profits to take share in grocery?” Forte said.
+ </p>
+
+ <p>
+ That could eventually open up an avenue to growth as the rate of expansion slows in Amazon’s broader U.S. retail sales.
+ </p>
+ <p>
+ “That’s why they need grocery to work,” Forte said. “Grocery’s a very big category.”
+ </p>
+ <p>
+ Whole Foods could also <span data-st-annotation-ref="1792ba">press suppliers to reduce their prices</span>, essentially cutting their profit.
+ </p>
+
+ <p>
+ “The worry with that is that it puts the squeeze on the producer upstream,” said Ananth Iyer, a professor at Purdue University whose research includes sustainability in supply chains. If producers are squeezed too much, he noted, they may start to cut corners.
+ </p>
+ <p>
+ So far, there’s no evidence this is happening in halibut, where fishery practices have been carefully managed with a goal of sustainability for nearly a century. Also, Whole Foods does not yet have the scale as a buyer to dictate prices the way a company like Costco does.
+ </p>
+ <p>
+ Forte said that even if it did have such clout, this would be a risky strategy that would undermine the very attributes of the Whole Foods brand that make it most valuable.
+ </p>
+ <p>
+ Another theory is that Amazon could apply more of its technology and expertise in logistics to create supply-chain efficiencies that would maintain its profits while benefiting producers and consumers, particularly with perishable grocery products, Iyer said. This is part of the promise of the acquisition in the first place.
+ </p>
+ <p>
+ “That’s a powerful combination,” Forte said. “The sustainable, the organic, the healthier food — all those qualities of Whole Foods, with the supply-chain technology of Amazon. It plays to the strengths of both sides.”
+ </p>
+ <p>
+ Forte said he expects Amazon to continue its aggressive moves on grocery pricing at Whole Foods. But he wonders when the price cuts will be broader, particularly as Amazon competes with the likes of Walmart and Kroger for a bigger slice of U.S. food and beverage retail sales, which totaled $726 billion in 2017. Whole Foods said it has lowered prices on hundreds of items, with an emphasis on fresh produce.
+ </p>
+
+ <p>
+ Forte described his attempt after the acquisition to get the ingredients for Rice Krispies Treats at Whole Foods. It was perhaps doomed from the start: Whole Foods doesn’t carry Rice Krispies. But he found an organic brown rice puff cereal and organic marshmallows. They were “so wildly expensive that we didn’t finish the exercise. I took the kids to Walmart and bought the ingredients for a pittance,” Forte said.
+ </p>
+ <p>
+ That points to the bigger question of how Amazon plans to position Whole Foods for the long term in its expanding array of physical retail-grocery formats. It now has 11 automated Go convenience stores and is rumored to be planning a new, low-priced grocery chain of its own that may deploy the same cashierless checkout technology.
+ </p>
+ <p>
+ Meanwhile, Whole Foods is not opening any new 365 stores, a smaller, lower-priced version of the main brand highlighting the company’s private-label products. Whole Foods co-founder and CEO John Mackey said in an internal memo that the “price distinction between the two brands has become less relevant” as Whole Foods lowered its prices, Yahoo Finance <a href="https://finance.yahoo.com/news/amazonowned-whole-foods-scraps-smaller-365-store-expansion-203543290.html" target="_blank">reported</a> earlier this year.
+ </p>
+ <p>
+ Amazon, too, is finding success with a growing stable of private-label brands — it had more than 100 as of last July, according to Coresight Research, double the number in 2017. One of these, Solimo, sells generic versions of everything from K-Cup coffee pods to Epsom salts to garbage bags and racked up more than $6 million in sales in January alone, according to data analysis firm 1010data.
+ </p>
+ <p>
+ Of course, there’s nothing generic about a “fresh, sustainable wild-caught halibut fillet.”
+ </p>
+ <p>
+ <strong>Back on the schooner</strong>
+ </p>
+ <p>
+ The day after Easter, Bassi and his crew — three family members and an unrelated father-and-son team — loaded up the Polaris, one of four century-old wooden schooners still chasing halibut out of Seattle. (The broader Washington-based halibut fleet numbers about 100 vessels.) Bassi’s father fished on the Polaris, which Bassi co-owns with&nbsp;Rolfe McCartney. Bassi’s grandfather fished halibut back when schooners carried small dories out to the fishing grounds, which made the landing of a fish that can grow to 500 pounds all the more exciting.
+ </p>
+
+ <p>
+ The Polaris motored out of Fisherman’s Terminal and through the Ballard Locks to begin the three-day journey through the Inside Passage to Ketchikan, Alaska. There, they take on tons of ice and bait, herring for the black cod Bassi will target first, and later chum salmon, codfish or octopus for the halibut.
+ </p>
+ <p>
+ From a base in Kodiak, Alaska, the Polaris makes a series of trips, at sea for a week or longer at a time, to fish as far away as Attu Island at the far western edge of the Aleutian Islands chain. “It’s a big range that we fish,” Bassi said.
+ </p>
+ <p>
+ The Polaris will trail long lines of hooks, leaving them to soak for several hours before reeling them in. The fish are stunned, bled and dressed, and put on ice in the hold. It is this fishing method that contributes to the quality of the halibut and sustainability of the fishery, as it reduces by-catch — the inadvertent taking of other <span data-st-annotation-ref="53071e">species</span>.
+ </p>
+ <p>
+ They negotiate to sell the fish with four or five buyers, such as Besecker, at a price that fluctuates throughout the season. This is a peak time of year for halibut, with consumers seeking out fresh fish for Easter and Mother’s Day, Besecker said. Fishermen are typically paid between $5 and $6 a pound for halibut.
+ </p>
+ <p>
+ The Alaskan halibut fishery has its troubles — as nearly all fisheries do — but has been rationalized and managed successfully, particularly over the last quarter-century. Alverson, a commissioner on the Seattle-based International Pacific Halibut Commission, which has managed catch limits for U.S. and Canadian fishermen since 1924, described it as a stable but declining resource.
+ </p>
+ <p>
+ This year, the <a href="https://iphc.int/management/fisheries" target="_blank">halibut fishery</a> in the Northern Pacific and Bering Sea is <a href="https://iphc.int/data/landings-2019" target="_blank">capped at 29.4 million pounds</a>, with most of that allocated to commercial fishing and smaller amounts reserved for recreational and tribal fishing, as well as by-catch of other commercial fisheries.
+ </p>
+
+ <p>
+ Alverson summed up the journey from a wooden fishing boat in the Bering Sea to the fish counter of a grocery store owned by a company that has redefined modern buying and selling: “It’s Seattle old school meets Seattle new school with Amazon.”
+ </p>
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/source.html
new file mode 100644
index 000000000..f9a577e3c
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/seattletimes-1/source.html
@@ -0,0 +1,1659 @@
+<!DOCTYPE html>
+<!--[if lt IE 10]> <html class="no-js lt-ie10 no-support" lang="en-US" itemscope itemtype="https://schema.org/Article" > <![endif]--><!--[if gt IE 9]><!-->
+<html class="no-js" lang="en-US" itemscope="itemscope" itemtype="https://schema.org/Article" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <!--<![endif]-->
+ <head>
+ <meta charset="UTF-8" />
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=7kovnr5xE4" />
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=7kovnr5xE4" />
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=7kovnr5xE4" />
+ <link rel="manifest" href="/site.webmanifest?v=7kovnr5xE4" />
+ <link rel="mask-icon" href="/safari-pinned-tab.svg?v=7kovnr5xE4" color="#5bbad5" />
+ <link rel="shortcut icon" href="/favicon.ico?v=7kovnr5xE4" />
+ <meta name="msapplication-TileColor" content="#2b5797" />
+ <meta name="theme-color" content="#ffffff" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <script type="text/javascript">
+ //<![CDATA[
+ (window.NREUM||(NREUM={})).loader_config={xpid:"XAcAVFdRGwIFUVhQBAIB"};window.NREUM||(NREUM={}),__nr_require=function(t,n,e){function r(e){if(!n[e]){var o=n[e]={exports:{}};t[e][0].call(o.exports,function(n){var o=t[e][1][n];return r(o||n)},o,o.exports)}return n[e].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<e.length;o++)r(e[o]);return r}({1:[function(t,n,e){function r(t){try{s.console&&console.log(t)}catch(n){}}var o,i=t("ee"),a=t(18),s={};try{o=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(s.console=!0,o.indexOf("dev")!==-1&&(s.dev=!0),o.indexOf("nr_dev")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on("internal-error",function(t){r(t.stack)}),s.dev&&i.on("fn-err",function(t,n,e){r(e.stack)}),s.dev&&(r("NR AGENT IN DEVELOPMENT MODE"),r("flags: "+a(s,function(t,n){return t}).join(", ")))},{}],2:[function(t,n,e){function r(t,n,e,r,s){try{p?p-=1:o(s||new UncaughtException(t,n,e),!0)}catch(f){try{i("ierr",[f,c.now(),!0])}catch(d){}}return"function"==typeof u&&u.apply(this,a(arguments))}function UncaughtException(t,n,e){this.message=t||"Uncaught error with no additional information",this.sourceURL=n,this.line=e}function o(t,n){var e=n?null:c.now();i("err",[t,e])}var i=t("handle"),a=t(19),s=t("ee"),c=t("loader"),f=t("gos"),u=window.onerror,d=!1,l="nr@seenError",p=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(h){"stack"in h&&(t(8),t(7),"addEventListener"in window&&t(5),c.xhrWrappable&&t(9),d=!0)}s.on("fn-start",function(t,n,e){d&&(p+=1)}),s.on("fn-err",function(t,n,e){d&&!e[l]&&(f(e,l,function(){return!0}),this.thrown=!0,o(e))}),s.on("fn-end",function(){d&&!this.thrown&&p>0&&(p-=1)}),s.on("internal-error",function(t){i("ierr",[t,c.now(),!0])})},{}],3:[function(t,n,e){t("loader").features.ins=!0},{}],4:[function(t,n,e){function r(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var o=t("ee"),i=t("handle"),a=t(8),s=t(7),c="learResourceTimings",f="addEventListener",u="resourcetimingbufferfull",d="bstResource",l="resource",p="-start",h="-end",m="fn"+p,w="fn"+h,v="bstTimer",y="pushState",g=t("loader");g.features.stn=!0,t(6);var x=NREUM.o.EV;o.on(m,function(t,n){var e=t[0];e instanceof x&&(this.bstStart=g.now())}),o.on(w,function(t,n){var e=t[0];e instanceof x&&i("bst",[e,n,this.bstStart,g.now()])}),a.on(m,function(t,n,e){this.bstStart=g.now(),this.bstType=e}),a.on(w,function(t,n){i(v,[n,this.bstStart,g.now(),this.bstType])}),s.on(m,function(){this.bstStart=g.now()}),s.on(w,function(t,n){i(v,[n,this.bstStart,g.now(),"requestAnimationFrame"])}),o.on(y+p,function(t){this.time=g.now(),this.startPath=location.pathname+location.hash}),o.on(y+h,function(t){i("bstHist",[location.pathname+location.hash,this.startPath,this.time])}),f in window.performance&&(window.performance["c"+c]?window.performance[f](u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["c"+c]()},!1):window.performance[f]("webkit"+u,function(t){i(d,[window.performance.getEntriesByType(l)]),window.performance["webkitC"+c]()},!1)),document[f]("scroll",r,{passive:!0}),document[f]("keypress",r,!1),document[f]("click",r,!1)}},{}],5:[function(t,n,e){function r(t){for(var n=t;n&&!n.hasOwnProperty(u);)n=Object.getPrototypeOf(n);n&&o(n)}function o(t){s.inPlace(t,[u,d],"-",i)}function i(t,n){return t[1]}var a=t("ee").get("events"),s=t(21)(a,!0),c=t("gos"),f=XMLHttpRequest,u="addEventListener",d="removeEventListener";n.exports=a,"getPrototypeOf"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+"-start",function(t,n){var e=t[1],r=c(e,"nr@wrapped",function(){function t(){if("function"==typeof e.handleEvent)return e.handleEvent.apply(e,arguments)}var n={object:t,"function":e}[typeof e];return n?s(n,"fn-",null,n.name||"anonymous"):e});this.wrapped=t[1]=r}),a.on(d+"-start",function(t){t[1]=this.wrapped||t[1]})},{}],6:[function(t,n,e){var r=t("ee").get("history"),o=t(21)(r);n.exports=r,o.inPlace(window.history,["pushState","replaceState"],"-")},{}],7:[function(t,n,e){var r=t("ee").get("raf"),o=t(21)(r),i="equestAnimationFrame";n.exports=r,o.inPlace(window,["r"+i,"mozR"+i,"webkitR"+i,"msR"+i],"raf-"),r.on("raf-start",function(t){t[0]=o(t[0],"fn-")})},{}],8:[function(t,n,e){function r(t,n,e){t[0]=a(t[0],"fn-",null,e)}function o(t,n,e){this.method=e,this.timerDuration=isNaN(t[1])?0:+t[1],t[0]=a(t[0],"fn-",this,e)}var i=t("ee").get("timer"),a=t(21)(i),s="setTimeout",c="setInterval",f="clearTimeout",u="-start",d="-";n.exports=i,a.inPlace(window,[s,"setImmediate"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,"clearImmediate"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],9:[function(t,n,e){function r(t,n){d.inPlace(n,["onreadystatechange"],"fn-",s)}function o(){var t=this,n=u.context(t);t.readyState>3&&!n.resolved&&(n.resolved=!0,u.emit("xhr-resolved",[],t)),d.inPlace(t,y,"fn-",s)}function i(t){g.push(t),h&&(b?b.then(a):w?w(a):(E=-E,R.data=E))}function a(){for(var t=0;t<g.length;t++)r([],g[t]);g.length&&(g=[])}function s(t,n){return n}function c(t,n){for(var e in t)n[e]=t[e];return n}t(5);var f=t("ee"),u=f.get("xhr"),d=t(21)(u),l=NREUM.o,p=l.XHR,h=l.MO,m=l.PR,w=l.SI,v="readystatechange",y=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],g=[];n.exports=u;var x=window.XMLHttpRequest=function(t){var n=new p(t);try{u.emit("new-xhr",[n],n),n.addEventListener(v,o,!1)}catch(e){try{u.emit("internal-error",[e])}catch(r){}}return n};if(c(p,x),x.prototype=p.prototype,d.inPlace(x.prototype,["open","send"],"-xhr-",s),u.on("send-xhr-start",function(t,n){r(t,n),i(n)}),u.on("open-xhr-start",r),h){var b=m&&m.resolve();if(!w&&!m){var E=1,R=document.createTextNode(E);new h(a).observe(R,{characterData:!0})}}else f.on("fn-end",function(t){t[0]&&t[0].type===v||a()})},{}],10:[function(t,n,e){function r(){var t=window.NREUM,n=t.info.accountID||null,e=t.info.agentID||null,r=t.info.trustKey||null,i="btoa"in window&&"function"==typeof window.btoa;if(!n||!e||!i)return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:e,id:o.generateCatId(),tr:o.generateCatId(),ti:Date.now()}};return r&&n!==r&&(a.d.tk=r),btoa(JSON.stringify(a))}var o=t(16);n.exports={generateTraceHeader:r}},{}],11:[function(t,n,e){function r(t){var n=this.params,e=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<p;r++)t.removeEventListener(l[r],this.listener,!1);n.aborted||(e.duration=s.now()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==n.status&&(n.status=0):a(this,t),e.cbTime=this.cbTime,d.emit("xhr-done",[t],t),c("xhr",[n,e,this.startTime]))}}function o(t,n){var e=t.responseType;if("json"===e&&null!==n)return n;var r="arraybuffer"===e||"blob"===e||"json"===e?t.response:t.responseText;return w(r)}function i(t,n){var e=f(n),r=t.params;r.host=e.hostname+":"+e.port,r.pathname=e.pathname,t.sameOrigin=e.sameOrigin}function a(t,n){t.params.status=n.status;var e=o(n,t.lastSize);if(e&&(t.metrics.rxSize=e),t.sameOrigin){var r=n.getResponseHeader("X-NewRelic-App-Data");r&&(t.params.cat=r.split(", ").pop())}t.loadCaptureCalled=!0}var s=t("loader");if(s.xhrWrappable){var c=t("handle"),f=t(12),u=t(10).generateTraceHeader,d=t("ee"),l=["load","error","abort","timeout"],p=l.length,h=t("id"),m=t(15),w=t(14),v=window.XMLHttpRequest;s.features.xhr=!0,t(9),d.on("new-xhr",function(t){var n=this;n.totalCbs=0,n.called=0,n.cbTime=0,n.end=r,n.ended=!1,n.xhrGuids={},n.lastSize=null,n.loadCaptureCalled=!1,t.addEventListener("load",function(e){a(n,t)},!1),m&&(m>34||m<10)||window.opera||t.addEventListener("progress",function(t){n.lastSize=t.loaded},!1)}),d.on("open-xhr-start",function(t){this.params={method:t[0]},i(this,t[1]),this.metrics={}}),d.on("open-xhr-end",function(t,n){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&n.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid);var e=!1;if("init"in NREUM&&"distributed_tracing"in NREUM.init&&(e=!!NREUM.init.distributed_tracing.enabled),e&&this.sameOrigin){var r=u();r&&n.setRequestHeader("newrelic",r)}}),d.on("send-xhr-start",function(t,n){var e=this.metrics,r=t[0],o=this;if(e&&r){var i=w(r);i&&(e.txSize=i)}this.startTime=s.now(),this.listener=function(t){try{"abort"!==t.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof n.onload))&&o.end(n)}catch(e){try{d.emit("internal-error",[e])}catch(r){}}};for(var a=0;a<p;a++)n.addEventListener(l[a],this.listener,!1)}),d.on("xhr-cb-time",function(t,n,e){this.cbTime+=t,n?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof e.onload||this.end(e)}),d.on("xhr-load-added",function(t,n){var e=""+h(t)+!!n;this.xhrGuids&&!this.xhrGuids[e]&&(this.xhrGuids[e]=!0,this.totalCbs+=1)}),d.on("xhr-load-removed",function(t,n){var e=""+h(t)+!!n;this.xhrGuids&&this.xhrGuids[e]&&(delete this.xhrGuids[e],this.totalCbs-=1)}),d.on("addEventListener-end",function(t,n){n instanceof v&&"load"===t[0]&&d.emit("xhr-load-added",[t[1],t[2]],n)}),d.on("removeEventListener-end",function(t,n){n instanceof v&&"load"===t[0]&&d.emit("xhr-load-removed",[t[1],t[2]],n)}),d.on("fn-start",function(t,n,e){n instanceof v&&("onload"===e&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=s.now()))}),d.on("fn-end",function(t,n){this.xhrCbStart&&d.emit("xhr-cb-time",[s.now()-this.xhrCbStart,this.onload,n],n)})}},{}],12:[function(t,n,e){n.exports=function(t){var n=document.createElement("a"),e=window.location,r={};n.href=t,r.port=n.port;var o=n.href.split("://");!r.port&&o[1]&&(r.port=o[1].split("/")[0].split("@").pop().split(":")[1]),r.port&&"0"!==r.port||(r.port="https"===o[0]?"443":"80"),r.hostname=n.hostname||e.hostname,r.pathname=n.pathname,r.protocol=o[0],"/"!==r.pathname.charAt(0)&&(r.pathname="/"+r.pathname);var i=!n.protocol||":"===n.protocol||n.protocol===e.protocol,a=n.hostname===document.domain&&n.port===e.port;return r.sameOrigin=i&&(!n.hostname||a),r}},{}],13:[function(t,n,e){function r(){}function o(t,n,e){return function(){return i(t,[f.now()].concat(s(arguments)),n?null:this,e),n?void 0:this}}var i=t("handle"),a=t(18),s=t(19),c=t("ee").get("tracer"),f=t("loader"),u=NREUM;"undefined"==typeof window.newrelic&&(newrelic=u);var d=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],l="api-",p=l+"ixn-";a(d,function(t,n){u[n]=o(l+n,!0,"api")}),u.addPageAction=o(l+"addPageAction",!0),u.setCurrentRouteName=o(l+"routeName",!0),n.exports=newrelic,u.interaction=function(){return(new r).get()};var h=r.prototype={createTracer:function(t,n){var e={},r=this,o="function"==typeof n;return i(p+"tracer",[f.now(),t,e],r),function(){if(c.emit((o?"":"no-")+"fn-start",[f.now(),r,o],e),o)try{return n.apply(this,arguments)}catch(t){throw c.emit("fn-err",[arguments,this,t],e),t}finally{c.emit("fn-end",[f.now()],e)}}}};a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,n){h[n]=o(p+n)}),newrelic.noticeError=function(t,n){"string"==typeof t&&(t=new Error(t)),i("err",[t,f.now(),!1,n])}},{}],14:[function(t,n,e){n.exports=function(t){if("string"==typeof t&&t.length)return t.length;if("object"==typeof t){if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!("undefined"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(n){return}}}},{}],15:[function(t,n,e){var r=0,o=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);o&&(r=+o[1]),n.exports=r},{}],16:[function(t,n,e){function r(){function t(){return n?15&n[e++]:16*Math.random()|0}var n=null,e=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(n=r.getRandomValues(new Uint8Array(31)));for(var o,i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",a="",s=0;s<i.length;s++)o=i[s],"x"===o?a+=t().toString(16):"y"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}function o(){function t(){return n?15&n[e++]:16*Math.random()|0}var n=null,e=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&Uint8Array&&(n=r.getRandomValues(new Uint8Array(31)));for(var o=[],i=0;i<16;i++)o.push(t().toString(16));return o.join("")}n.exports={generateUuid:r,generateCatId:o}},{}],17:[function(t,n,e){function r(t,n){if(!o)return!1;if(t!==o)return!1;if(!n)return!0;if(!i)return!1;for(var e=i.split("."),r=n.split("."),a=0;a<r.length;a++)if(r[a]!==e[a])return!1;return!0}var o=null,i=null,a=/Version\/(\S+)\s+Safari/;if(navigator.userAgent){var s=navigator.userAgent,c=s.match(a);c&&s.indexOf("Chrome")===-1&&s.indexOf("Chromium")===-1&&(o="Safari",i=c[1])}n.exports={agent:o,version:i,match:r}},{}],18:[function(t,n,e){function r(t,n){var e=[],r="",i=0;for(r in t)o.call(t,r)&&(e[i]=n(r,t[r]),i+=1);return e}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],19:[function(t,n,e){function r(t,n,e){n||(n=0),"undefined"==typeof e&&(e=t?t.length:0);for(var r=-1,o=e-n||0,i=Array(o<0?0:o);++r<o;)i[r]=t[n+r];return i}n.exports=r},{}],20:[function(t,n,e){n.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],21:[function(t,n,e){function r(t){return!(t&&t instanceof Function&&t.apply&&!t[a])}var o=t("ee"),i=t(19),a="nr@original",s=Object.prototype.hasOwnProperty,c=!1;n.exports=function(t,n){function e(t,n,e,o){function nrWrapper(){var r,a,s,c;try{a=this,r=i(arguments),s="function"==typeof e?e(r,a):e||{}}catch(f){l([f,"",[r,a,o],s])}u(n+"start",[r,a,o],s);try{return c=t.apply(a,r)}catch(d){throw u(n+"err",[r,a,d],s),d}finally{u(n+"end",[r,a,c],s)}}return r(t)?t:(n||(n=""),nrWrapper[a]=t,d(t,nrWrapper),nrWrapper)}function f(t,n,o,i){o||(o="");var a,s,c,f="-"===o.charAt(0);for(c=0;c<n.length;c++)s=n[c],a=t[s],r(a)||(t[s]=e(a,f?s+o:o,i,s))}function u(e,r,o){if(!c||n){var i=c;c=!0;try{t.emit(e,r,o,n)}catch(a){l([a,e,r,o])}c=i}}function d(t,n){if(Object.defineProperty&&Object.keys)try{var e=Object.keys(t);return e.forEach(function(e){Object.defineProperty(n,e,{get:function(){return t[e]},set:function(n){return t[e]=n,n}})}),n}catch(r){l([r])}for(var o in t)s.call(t,o)&&(n[o]=t[o]);return n}function l(n){try{t.emit("internal-error",n)}catch(e){}}return t||(t=o),e.inPlace=f,e.flag=a,e}},{}],ee:[function(t,n,e){function r(){}function o(t){function n(t){return t&&t instanceof r?t:t?c(t,s,i):i()}function e(e,r,o,i){if(!l.aborted||i){t&&t(e,r,o);for(var a=n(o),s=m(e),c=s.length,f=0;f<c;f++)s[f].apply(a,r);var d=u[g[e]];return d&&d.push([x,e,r,a]),a}}function p(t,n){y[t]=m(t).concat(n)}function h(t,n){var e=y[t];if(e)for(var r=0;r<e.length;r++)e[r]===n&&e.splice(r,1)}function m(t){return y[t]||[]}function w(t){return d[t]=d[t]||o(e)}function v(t,n){f(t,function(t,e){n=n||"feature",g[e]=n,n in u||(u[n]=[])})}var y={},g={},x={on:p,addEventListener:p,removeEventListener:h,emit:e,get:w,listeners:m,context:n,buffer:v,abort:a,aborted:!1};return x}function i(){return new r}function a(){(u.api||u.feature)&&(l.aborted=!0,u=l.backlog={})}var s="nr@context",c=t("gos"),f=t(18),u={},d={},l=n.exports=o();l.backlog=u},{}],gos:[function(t,n,e){function r(t,n,e){if(o.call(t,n))return t[n];var r=e();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,n,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[n]=r,r}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],handle:[function(t,n,e){function r(t,n,e,r){o.buffer([t],r),o.emit(t,n,e)}var o=t("ee").get("handle");n.exports=r,r.ee=o},{}],id:[function(t,n,e){function r(t){var n=typeof t;return!t||"object"!==n&&"function"!==n?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i="nr@id",a=t("gos");n.exports=r},{}],loader:[function(t,n,e){function r(){if(!E++){var t=b.info=NREUM.info,n=p.getElementsByTagName("script")[0];if(setTimeout(u.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&n))return u.abort();f(g,function(n,e){t[n]||(t[n]=e)}),c("mark",["onload",a()+b.offset],null,"api");var e=p.createElement("script");e.src="https://"+t.agent,n.parentNode.insertBefore(e,n)}}function o(){"complete"===p.readyState&&i()}function i(){c("mark",["domContent",a()+b.offset],null,"api")}function a(){return R.exists&&performance.now?Math.round(performance.now()):(s=Math.max((new Date).getTime(),s))-b.offset}var s=(new Date).getTime(),c=t("handle"),f=t(18),u=t("ee"),d=t(17),l=window,p=l.document,h="addEventListener",m="attachEvent",w=l.XMLHttpRequest,v=w&&w.prototype;NREUM.o={ST:setTimeout,SI:l.setImmediate,CT:clearTimeout,XHR:w,REQ:l.Request,EV:l.Event,PR:l.Promise,MO:l.MutationObserver};var y=""+location,g={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-1123.min.js"},x=w&&v&&v[h]&&!/CriOS/.test(navigator.userAgent),b=n.exports={offset:s,now:a,origin:y,features:{},xhrWrappable:x,userAgent:d};t(13),p[h]?(p[h]("DOMContentLoaded",i,!1),l[h]("load",r,!1)):(p[m]("onreadystatechange",o),l[m]("onload",r)),c("mark",["firstbyte",s],null,"api");var E=0,R=t(20)},{}]},{},["loader",2,11,4,3]);
+ //]]>
+ </script>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>
+ Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods | The Seattle Times
+ </title>
+ <meta name="robots" content="noarchive" />
+ <link rel="canonical" href="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/" /><!-- Klangoo Additions, PROD-5183 -->
+ <meta itemprop="identifier" content="11469382" />
+ <meta itemprop="pageType" content="article" />
+ <meta itemprop="dateModified" content="2019-04-29 15:33:39" />
+ <meta itemprop="url" content="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/" />
+ <meta itemprop="inLanguage" content="en" />
+ <meta itemprop="author" content="Benjamin Romano" />
+ <meta itemprop="thumbnailUrl" content="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1200x630.jpg" />
+ <meta itemprop="articleBody" content="The story of Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the dominant economic force of the 21st." />
+ <meta name="description" content="The story of Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the..." /><!-- Google+ -->
+ <meta itemprop="name" content="Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods" />
+ <meta itemprop="headline" content="Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods" />
+ <meta itemprop="datePublished" content="2019-04-28 06:01:07" />
+ <meta itemprop="description" content="The story of Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the..." />
+ <meta itemprop="image" content="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-780x489.jpg" /><!-- Twitter Card -->
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:site" content="@seattletimes" />
+ <meta name="twitter:creator" content="@bromano" />
+ <meta name="twitter:title" content="Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods" />
+ <meta name="twitter:description" content="The story of Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the dominant economic force of the 21st." />
+ <meta name="twitter:image" content="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-780x489.jpg" /><!-- Open Graph -->
+ <meta property="og:title" content="Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods" />
+ <meta property="og:type" content="article" />
+ <meta property="og:url" content="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/" />
+ <meta property="og:image" content="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1200x630.jpg" />
+ <meta property="og:image:width" content="1200" />
+ <meta property="og:image:height" content="630" />
+ <meta property="og:description" content="The story of Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy and draws a line from a Seattle industry with roots in the 19th century to the dominant economic force of the 21st." />
+ <meta property="og:site_name" content="The Seattle Times" /><!-- Miscellaneous -->
+ <meta property="article:published_time" content="2019-04-28 06:01:07" />
+ <meta property="article:modified_time" content="2019-04-29 15:33:39" />
+ <meta property="article:section" content="Amazon" />
+ <meta property="article:tag" content="Maritime Industry" />
+ <meta name="news_keywords" content="Business, Amazon, Environment, Local Business, Nation, Retail" />
+ <meta property="fb:app_id" content="1166894493389754" />
+ <meta property="fb:pages" content="38472826214" />
+ <meta name="msvalidate.01" content="A8C10DCF8621D573190E61A9BB5E1782" />
+ <link rel="publisher" href="https://plus.google.com/+Seattletimesplus" />
+ <script type="text/javascript">
+ //<![CDATA[
+ // Chartbeat
+ // Sets a start time to compare to an end time in the chartbeat.js
+ // http://support.chartbeat.com/docs/#code
+ var _sf_startpt=(new Date()).getTime()
+ //]]>
+ </script>
+ <style id="chartbeat-flicker-control-style" type="text/css">
+ /*<![CDATA[*/
+ /* Will be removed by ChartBeat's async flicker control below */
+ body { visibility: hidden !important; }
+ /*]]>*/
+ </style>
+ <script>
+ <![CDATA[
+ // ChartBeat async flicker
+ // http://support.chartbeat.com/docs/headlinetesting.html#asynchronousflicker
+ var _sf_async_config = _sf_async_config || {};
+
+ window.SEATIMESCO = window.SEATIMESCO || {};
+
+ // turn on seatimesco domain to segment by actual domain instead of grouping under df
+ if ( window.SEATIMESCO.contentInfo ) {
+ if ( window.SEATIMESCO.contentInfo.domain =='seattletimes.com' || window.SEATIMESCO.contentInfo.domain =='www.seattletimes.com' ) {
+ _sf_async_config.domain = 'seattletimes.com'
+ } else {
+ _sf_async_config.domain = window.SEATIMESCO.contentInfo.domain !== undefined ? window.SEATIMESCO.contentInfo.domain : null;
+ }
+ } else {
+ _sf_async_config.domain = null;
+ }
+
+ /** CONFIGURATION START **/
+ _sf_async_config.uid = 22565;
+ _sf_async_config.useCanonical = true;
+ /** CONFIGURATION END **/
+ // Set a timeout event for 1 second that will remove the body hiding
+ // tag from the document if it has not already been removed. This
+ // gives the Headline Tester script a total of 1 second to load and run to limit
+ // the potential for flicker of headlines.
+ // The one second time limit can be adjusted to client preferences.
+ window.setTimeout(function() {
+ var hider = document.getElementById('chartbeat-flicker-control-style');
+ if (hider) {
+ hider.parentNode.removeChild(hider);
+ }
+ }, 1000);
+ ]]>
+ </script>
+ <script async="async" src="//static.chartbeat.com/js/chartbeat_mab.js"></script>
+ <script>
+ <![CDATA[
+ // Header scripts that can't otherwise be placed lower in the page. Keep as minimal as possible.
+
+ // Sets 'js' on html element and removes 'no-js' if present (here to prevent flashing)
+ (function(){
+ document.documentElement.className = document.documentElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + (' js ');
+ })();
+
+
+ // Load TypeKit webfonts
+ (function(d) {
+ var config = {
+ kitId: 'lty1dar',
+ scriptTimeout: 3000,
+ async: true,
+ active: function() {
+ if (window.events) {
+ window.events.trigger('fonts:loaded');
+ }
+ }
+ },
+ h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='//fonts.seattletimes.com/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s)
+ })(document);
+
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.SEATIMESCO.comments = window.SEATIMESCO.comments || {};
+
+ window.SEATIMESCO.comments.enabled = 1;
+
+ window.SEATIMESCO.comments.postID = '11469382';
+
+ window.SEATIMESCO.comments.postTitle = 'Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon&#8217;s strategy with Whole Foods';
+
+ window.SEATIMESCO.comments.ssoEnvironment = 'secure.';
+
+ window.SEATIMESCO.comments.coralURL = 'https://seattletimes.talk.coralproject.net/';
+
+ //]]>
+ </script>
+ <link rel="dns-prefetch" href="//talk-seattletimes.global.ssl.fastly.net" />
+ <link rel="dns-prefetch" href="//s.ntv.io" />
+ <link rel="dns-prefetch" href="//s.w.org" />
+ <link rel="dns-prefetch" href="//fonts.seattletimes.com" />
+ <link rel="dns-prefetch" href="//awsapi.seattletimes.com" />
+ <link rel="dns-prefetch" href="//ad.crwdcntrl.net" />
+ <link rel="dns-prefetch" href="//static.chartbeat.com" />
+ <link rel="dns-prefetch" href="//mab.chartbeat.com" />
+ <link rel="alternate" type="application/rss+xml" title="The Seattle Times » Feed" href="https://www.seattletimes.com/feed/" />
+ <link rel="alternate" type="application/rss+xml" title="The Seattle Times » Comments Feed" href="https://www.seattletimes.com/comments/feed/" />
+ <link rel="alternate" type="application/rss+xml" title="The Seattle Times » Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods Comments Feed" href="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/feed/" />
+ <script type="text/javascript">
+ //<![CDATA[
+
+ dataLayer = [{"timestamp":1556678554,"contentType":"story","canonicalURL":"https:\/\/www.seattletimes.com\/business\/amazon\/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods\/","domain":"www.seattletimes.com","post_id":11469382,"author":"Benjamin Romano","publishdate":"2019-04-28 06:01:07","modifieddate":"2019-04-29 15:33:39","title":"Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon&#039;s strategy with Whole Foods","credit":"Seattle Times business reporter","tags":"Maritime Industry","categories":"","wordcount":2248,"paragraphCount":53,"galleryType":"fullwidth","age":2,"source":"wordpress","meter":"on","ads":"on","allowComments":"on","section_tier1":"business","section_tier2":"amazon","sections_all":"amazon|business|environment|local-business|nation|retail","othersections":"environment, local-business, nation, retail","wordgroup":"1500+","internalTags":"","articleTemplate":"2019-redesign"}];
+
+ window.SEATIMESCO = window.SEATIMESCO || {}; window.SEATIMESCO.contentInfo = {"timestamp":1556678554,"contentType":"story","canonicalURL":"https:\/\/www.seattletimes.com\/business\/amazon\/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods\/","domain":"www.seattletimes.com","post_id":11469382,"author":"Benjamin Romano","publishdate":"2019-04-28 06:01:07","modifieddate":"2019-04-29 15:33:39","title":"Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon&#039;s strategy with Whole Foods","credit":"Seattle Times business reporter","tags":"Maritime Industry","categories":"","wordcount":2248,"paragraphCount":53,"galleryType":"fullwidth","age":2,"source":"wordpress","meter":"on","ads":"on","allowComments":"on","section_tier1":"business","section_tier2":"amazon","sections_all":"amazon|business|environment|local-business|nation|retail","othersections":"environment, local-business, nation, retail","wordgroup":"1500+","internalTags":"","articleTemplate":"2019-redesign"};
+
+ //]]>
+ </script><!-- Page-hiding snippet -->
+
+ <style>
+ <![CDATA[
+ .async-hide { opacity: 0 !important}
+ ]]>
+ </style>
+ <script>
+ <![CDATA[
+ (function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
+ h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
+ (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
+ })(window,document.documentElement,'async-hide','dataLayer',4000,
+ {'GTM-TWNDJBM':true});
+ ]]>
+ </script><!-- Modified Google Analytics for Google Optimize -->
+
+ <script>
+ <![CDATA[
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+ ga('create', 'UA-52488759-1', 'auto', { allowLinker: true, useAmpClientId: true }); // Google Analytics
+ ga('require', 'GTM-TWNDJBM'); // Google Optimize
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.4\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.4\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/www.seattletimes.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=4.9.4"}};
+ !function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55357,56692,8205,9792,65039],[55357,56692,8203,9792,65039]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
+ //]]>
+ </script><!-- Google Tag Manager -->
+
+ <script>
+ <![CDATA[
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+ '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+ })(window,document,'script','dataLayer','GTM-KDZ92J');
+ ]]>
+ </script>
+ <style type="text/css">
+ /*<![CDATA[*/
+ img.wp-smiley,
+ img.emoji {
+ display: inline !important;
+ border: none !important;
+ box-shadow: none !important;
+ height: 1em !important;
+ width: 1em !important;
+ margin: 0 .07em !important;
+ vertical-align: -0.1em !important;
+ background: none !important;
+ padding: 0 !important;
+ }
+ /*]]>*/
+ </style>
+ <link rel="stylesheet" id="st-shortcode-public-styles-css" href="https://www.seattletimes.com/wp-content/plugins/shortcodes_plugin/css/shortcodes-public.css?ver=4.9.4" type="text/css" media="all" />
+ <link rel="stylesheet" id="st-style-css" href="https://www.seattletimes.com/wp-content/themes/st_refresh/css/styles.min.css?ver=1556659261" type="text/css" media="all" />
+ <link rel="stylesheet" id="article-styles-css" href="https://www.seattletimes.com/wp-content/plugins/st-article-template/assets/css/dist/main.css?ver=1556659254" type="text/css" media="all" />
+ <link rel="stylesheet" id="st-coraltalk-style-css" href="https://www.seattletimes.com/wp-content/plugins/st-coral-talk/dist/main.css?ver=1555567319" type="text/css" media="all" />
+ <link rel="stylesheet" id="nativo-style-css" href="https://www.seattletimes.com/wp-content/plugins/st-nativo/assets/css/st-nativo.css?ver=1556659261" type="text/css" media="all" />
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/st-analytics/dist/st-analytics-article-bundle.js"></script>
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/st-privacy-detection/js/src/ads/ad-test.js?ver=0.0.2"></script>
+ <script type="text/javascript" async="async" src="//s.ntv.io/serve/load.js?ver=1556659261"></script>
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/st-privacy-detection/js/dist/st-detect.min.js?ver=1548788763"></script>
+ <link rel="https://api.w.org/" href="https://www.seattletimes.com/wp-json/" />
+ <link rel="shortlink" href="https://www.seattletimes.com/?p=11469382" />
+ <script type="text/javascript" src="/wp-content/themes/st_refresh/js/vendor/pubmatic_openwrap.js?ver=1556659261"></script>
+ <script type="text/javascript" src="//ad.crwdcntrl.net/5/c=8381/pe=y/var=ccauds"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ var dartCCKey = "ccaud";
+ var audience, cci, dartCC, lotameTPID;
+ if ( typeof ccauds !== "undefined" && ccauds.Profile ) {
+ audience = ccauds.Profile.Audiences.Audience;
+ dartCC = "";
+ lotameTPID = (typeof ccauds.Profile.tpid !== "undefined") ? ccauds.Profile.tpid : "";
+ for (cci = 0; cci < audience.length; cci++) {
+ if (cci > 0) { dartCC += ","; }
+ dartCC += audience[cci].abbr;
+ }
+ }
+ googletag.cmd.push(function() {
+ googletag.pubads().setTargeting("tpid", [lotameTPID]).setTargeting(dartCCKey, [dartCC]);
+ });
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+ !function(a9,a,p,s,t,A,g){if(a[a9])return;function q(c,r){a[a9]._Q.push([c,r])}a[a9]={init:function(){q("i",arguments)},fetchBids:function(){q("f",arguments)},setDisplayBids:function(){},targetingKeys:function(){return[]},_Q:[]};A=p.createElement(s);A.async=!0;A.src=t;g=p.getElementsByTagName(s)[0];g.parentNode.insertBefore(A,g)}("apstag",window,document,"script","//c.amazon-adsystem.com/aax2/apstag.js");
+ ]]>
+ </script>
+ <script type="text/javascript" src="//get.s-onetag.com/b0e9d553-9782-4104-843d-d750dc2fbac3/tag.min.js?ver=1556659261" async="async" defer="defer"></script>
+ <script>
+ <![CDATA[
+ window.SEATIMESCO = window.SEATIMESCO || {};
+ window.SEATIMESCO.ads = window.SEATIMESCO.ads || {};
+ window.SEATIMESCO.ads.adUnitPathV2 = "/81279359/seattletimes.com/business/amazon";
+ window.SEATIMESCO.ads.dfpEnv = "prod";
+ window.SEATIMESCO.ads.defaultInsetAdPositions = [{"type":"advertisement","position":6,"ad_slot_config":[{"position_name":"body1a","devices":["mobile","tablet","desktop"],"targeting":{"pos":["body1a","elite","premium"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,600]]]},{"position_name":"body1b","devices":["tablet","desktop"],"targeting":{"pos":["body1b","premium"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,250]]]},{"position_name":"body1c","devices":["desktop"],"targeting":{"pos":["body1c","premium"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,250]]]}]},{"type":"advertisement","position":12,"ad_slot_config":[{"position_name":"body2a","targeting":{"pos":["body2a","premium"]},"devices":["mobile","tablet","desktop"],"mapping":[[[1020,1],[970,250]],[[768,1],[728,90]],[[0,0],[300,250]]]}]},{"type":"advertisement","position":30,"ad_slot_config":[{"position_name":"body5a","targeting":{"pos":["body5a"]},"devices":["mobile","tablet","desktop"],"mapping":[[[1020,1],[970,250]],[[768,1],[728,90]],[[0,0],[300,250]]]}]},{"type":"advertisement","position":36,"ad_slot_config":[{"position_name":"body6a","targeting":{"pos":["body6a"]},"devices":["mobile","tablet","desktop"],"mapping":[[[1020,1],[970,250]],[[768,1],[728,90]],[[0,0],[300,250]]]}]},{"type":"advertisement","position":42,"ad_slot_config":[{"position_name":"body7a","devices":["mobile","tablet","desktop"],"targeting":{"pos":["body7a"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,250]]]},{"position_name":"body7b","devices":["tablet","desktop"],"targeting":{"pos":["body7b"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,250]]]},{"position_name":"body7c","devices":["desktop"],"targeting":{"pos":["body7c"]},"mapping":[[[1020,1],[300,250]],[[768,1],[300,250]],[[0,0],[300,250]]]}]},{"type":"advertisement","position":48,"ad_slot_config":[{"position_name":"body8a","devices":["mobile","tablet","desktop"],"targeting":{"pos":["body8a"]},"mapping":[[[1020,1],[970,250]],[[768,1],[728,90]],[[0,0],[300,250]]]}]}];
+ window.SEATIMESCO.ads.mainAdSlots = ["bottom","recirc1a","recirc1b","recirc1c","top","wallpaper"];
+ window.SEATIMESCO.ads.headerBidders = {"PubmaticOpenWrap":true,"amazon":true};
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.SEATIMESCO.article = window.SEATIMESCO.article || {};
+ window.SEATIMESCO.article.template = "2019-redesign";
+ //]]>
+ </script>
+ <meta property="fb:admins" content="2737159" />
+ <link rel="amphtml" href="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/?amp=1" />
+ </head>
+ <body class="post-template-default single single-post postid-11469382 single-format-standard alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods">
+ <!-- Google Tag Manager (noscript) -->
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KDZ92J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <a class="skip-link screen-reader-text" href="#content">Skip to content</a>
+ <div id="container" class="site container">
+ <header class="global-header standard">
+ <div class="global-header-top">
+ <div class="wrapper">
+ <div class="main-nav">
+ <div class="main-nav-header">
+ <button id="hamburger-button" aria-label="Open" class="menu-button" aria-controls="menu-hamburger-accordion-menu" aria-expanded="false"><span class="menu-label">Menu</span></button> <a href="https://www.seattletimes.com" class="header-wordmark" title="The Seattle Times"></a>
+ </div>
+ <nav class="popup main-nav-body">
+ <div class="main-nav-header highlighted">
+ <button id="hamburger-close-button" aria-label="Close" class="menu-button" aria-controls="menu-hamburger-accordion-menu" aria-expanded="false"></button> <a href="https://www.seattletimes.com" class="header-wordmark white" title="The Seattle Times"></a>
+ </div>
+ <div id="main-nav-container" class="main-nav-container">
+ <ul id="menu-hamburger-accordion-menu" class="nav-accordion">
+ <li id="menu-item-9817233" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817233">
+ <a href="/seattle-news/">Local News</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9817255" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817255">
+ <a href="/seattle-news/transportation/">Traffic Lab</a>
+ </li>
+ <li id="menu-item-9818656" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818656">
+ <a href="/seattle-news/crime/">Crime</a>
+ </li>
+ <li id="menu-item-9817246" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817246">
+ <a href="/seattle-news/politics/">Local Politics</a>
+ </li>
+ <li id="menu-item-9818658" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818658">
+ <a href="/seattle-news/education/">Education</a>
+ </li>
+ <li id="menu-item-10273892" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10273892">
+ <a href="/education-lab/">Education Lab</a>
+ </li>
+ <li id="menu-item-9818657" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818657">
+ <a href="/seattle-news/eastside/">Eastside</a>
+ </li>
+ <li id="menu-item-9818659" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818659">
+ <a href="/seattle-news/health/">Health</a>
+ </li>
+ <li id="menu-item-9876206" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876206">
+ <a href="/seattle-news/data/">Data</a>
+ </li>
+ <li id="menu-item-10552763" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10552763">
+ <a href="/seattle-news/homeless/">Project Homeless</a>
+ </li>
+ <li id="menu-item-9876219" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876219">
+ <a href="/seattle-news/times-watchdog/">Times Watchdog</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9817234" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817234">
+ <a href="/business/">Business &amp; Tech</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9818664" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818664">
+ <a href="/business/boeing-aerospace/">Boeing &amp; Aerospace</a>
+ </li>
+ <li id="menu-item-9876204" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876204">
+ <a href="/business/amazon/">Amazon</a>
+ </li>
+ <li id="menu-item-9818666" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818666">
+ <a href="/business/microsoft/">Microsoft</a>
+ </li>
+ <li id="menu-item-9818662" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818662">
+ <a href="/business/technology/">Technology</a>
+ </li>
+ <li id="menu-item-10896521" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10896521">
+ <a href="/business/real-estate/">Real Estate</a>
+ </li>
+ <li id="menu-item-9818665" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818665">
+ <a href="/business/economy/">Economy</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9817235" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817235">
+ <a href="/nation-world/">Nation &amp; World</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9876207" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876207">
+ <a href="/nation-world/nation-politics/">Nation &amp; World Politics</a>
+ </li>
+ <li id="menu-item-9876208" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876208">
+ <a href="/nation-world/oddities/">Oddities</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9817237" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817237">
+ <a href="/sports/">Sports</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9817253" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817253">
+ <a href="/sports/seahawks/">Seahawks</a>
+ </li>
+ <li id="menu-item-9817251" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817251">
+ <a href="/sports/uw-huskies/">Huskies</a>
+ </li>
+ <li id="menu-item-9817250" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817250">
+ <a href="/sports/wsu-cougars/">Cougars</a>
+ </li>
+ <li id="menu-item-9817252" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817252">
+ <a href="/sports/mariners/">Mariners</a>
+ </li>
+ <li id="menu-item-9817254" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817254">
+ <a href="/sports/sounders/">Sounders</a>
+ </li>
+ <li id="menu-item-9817279" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817279">
+ <a href="/sports/storm/">Storm</a>
+ </li>
+ <li id="menu-item-9817280" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817280">
+ <a href="/sports/high-school/">High School Sports</a>
+ </li>
+ <li id="menu-item-10842305" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10842305">
+ <a href="https://www.seattletimes.com/sports/hockey/">Hockey</a>
+ </li>
+ <li id="menu-item-9921458" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9921458">
+ <a href="http://forums.seattletimes.com/forums/?from=stnv2">Forums</a>
+ </li>
+ <li id="menu-item-9921459" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9921459">
+ <a href="/sports/sports-on-tv-radio-2/">On TV/Radio</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9817238" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817238">
+ <a href="/entertainment/">Entertainment</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9818621" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818621">
+ <a href="/entertainment/movies/">Movies</a>
+ </li>
+ <li id="menu-item-9818619" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818619">
+ <a href="/entertainment/books/">Books</a>
+ </li>
+ <li id="menu-item-9818616" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818616">
+ <a href="/entertainment/music/">Music</a>
+ </li>
+ <li id="menu-item-9818617" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818617">
+ <a href="/entertainment/theater/">Theater</a>
+ </li>
+ <li id="menu-item-9818620" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818620">
+ <a href="/entertainment/classical-music/">Classical Music</a>
+ </li>
+ <li id="menu-item-9876209" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876209">
+ <a href="/entertainment/tv/">Television</a>
+ </li>
+ <li id="menu-item-10270568" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10270568">
+ <a href="/entertainment/comics/">Comics</a>
+ </li>
+ <li id="menu-item-10270569" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10270569">
+ <a href="/entertainment/games/">Games &amp; Puzzles</a>
+ </li>
+ <li id="menu-item-10364413" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10364413">
+ <a href="https://www.seattletimes.com/horoscopes/">Horoscopes</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9817239" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817239">
+ <a href="/life/">Life</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9818643" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818643">
+ <a href="/life/food-drink/">Food &amp; Drink</a>
+ </li>
+ <li id="menu-item-9818653" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818653">
+ <a href="/life/travel/">Travel &amp; Outdoors</a>
+ </li>
+ <li id="menu-item-9818654" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818654">
+ <a href="/life/wellness/">Wellness</a>
+ </li>
+ <li id="menu-item-9876210" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876210">
+ <a href="/life/pets/">Pets</a>
+ </li>
+ <li id="menu-item-9818655" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9818655">
+ <a href="https://www.seattletimes.com/category/rant-and-rave/">Rant &amp; Rave</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9818651" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9818651">
+ <a href="/pacific-nw-magazine/">Pacific NW Magazine</a>
+ </li>
+ <li id="menu-item-9817269" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9817269">
+ <a href="/homes-real-estate">Homes &amp; Real Estate</a>
+ </li>
+ <li id="menu-item-9817240" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9817240">
+ <a href="/opinion/">Opinion</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9817247" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817247">
+ <a href="/opinion/editorials/">Editorials</a>
+ </li>
+ <li id="menu-item-9817248" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9817248">
+ <a href="/opinion/letters-to-the-editor/">Letters to the Editor</a>
+ </li>
+ <li id="menu-item-11126979" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11126979">
+ <a href="https://www.seattletimes.com/author/david-horsey/">David Horsey</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-10051574" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10051574">
+ <a title="Video" href="/video/">Video</a>
+ </li>
+ <li id="menu-item-10082928" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10082928">
+ <a href="/photo-video/">Photography</a>
+ </li>
+ <li id="menu-item-9817274" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-9817274">
+ <a href="http://www.legacy.com/obituaries/seattletimes/#_ga=1.72389267.1837675783.1379017650">Obituaries</a>
+ <ul class="sub-menu">
+ <li id="menu-item-10203898" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10203898">
+ <a href="/obituaries/">News Obituaries</a>
+ </li>
+ <li id="menu-item-10203899" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10203899">
+ <a href="http://www.legacy.com/obituaries/seattletimes/#_ga=1.15101558.1560921668.1447363166">Paid Obituaries</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-11044943" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11044943">
+ <a href="http://seattletimes.com/newsletters/">Newsletters</a>
+ </li>
+ <li id="menu-item-10785263" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10785263">
+ <a href="https://secure.seattletimes.com/accountcenter/replica">Print Replica</a>
+ </li>
+ <li id="menu-item-10828531" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10828531">
+ <a href="http://www.seattletimes.com/tag/inside-the-times/">Inside The Times</a>
+ </li>
+ <li id="menu-item-9817258" class="text-gray menu-item menu-item-type-custom menu-item-object-custom menu-item-9817258">
+ <a href="/explore/">Explore</a>
+ </li>
+ <li id="menu-item-9817256" class="text-gray menu-item menu-item-type-custom menu-item-object-custom menu-item-9817256">
+ <a href="http://jobs.seattletimes.com/">Jobs</a>
+ </li>
+ <li id="menu-item-9817271" class="text-gray menu-item menu-item-type-custom menu-item-object-custom menu-item-9817271">
+ <a href="http://autos.seattletimes.com">Autos</a>
+ </li>
+ </ul>
+ <div class="main-nav-separator"></div>
+ <div id="hamburger-ad-desktop"></div>
+ <ul class="hamburger-login-nav main-nav-list"></ul>
+ <div id="hamburger-ad-mobile"></div>
+ </div>
+ </nav>
+ </div>
+ <nav class="header-utils">
+ <ul>
+ <li>
+ <a href="https://%3C?php%20echo%20SSO_PREFIX;?%3Eseattletimes.com/accountcenter/" class="login st-return">Log In</a>
+ </li>
+ <li>
+ <a id="header-subscribe-link" href="/subscribe/signup-offers?subsource=voluntary" class="subscribe st-return">Subscribe</a>
+ </li>
+ </ul>
+ </nav><button class="header-search-icon global-search-button"> <span id="search-button-text" class="header-search-text">Search</span></button>
+ </div>
+ <div class="secondary-nav">
+ <a href="/business/amazon/" class="section-title">Amazon</a>
+ </div>
+ </div>
+ <nav class="section-nav">
+ <div class="wrapper">
+ <ul id="menu-home-navbar" class="primary-navigation">
+ <li id="menu-item-41596" class="menu-item menu-item-type-taxonomy menu-item-object-section current-post-ancestor menu-item-41596">
+ <a title="Seattle News" href="/seattle-news/">Local</a>
+ </li>
+ <li id="menu-item-41597" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-41597">
+ <a title="Seattle Business" href="/business/">Biz/Tech</a>
+ </li>
+ <li id="menu-item-41598" class="menu-item menu-item-type-taxonomy menu-item-object-section current-post-ancestor current-menu-parent current-post-parent menu-item-41598">
+ <a title="Seattle Sports" href="/sports/">Sports</a>
+ </li>
+ <li id="menu-item-41600" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-41600">
+ <a title="Seattle Entertainment" href="/entertainment/">Entertainment</a>
+ </li>
+ <li id="menu-item-41601" class="menu-item menu-item-type-taxonomy menu-item-object-section current-post-ancestor menu-item-41601">
+ <a title="Seattle Life" href="/life/">Life</a>
+ </li>
+ <li id="menu-item-9595840" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9595840">
+ <a href="/life/travel/">Travel</a>
+ </li>
+ <li id="menu-item-9717308" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9717308">
+ <a href="/homes-real-estate/">Homes</a>
+ </li>
+ <li id="menu-item-42489" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-42489">
+ <a title="Seattle Opinion" href="/opinion/">Opinion</a>
+ </li>
+ <li id="menu-item-9805207" class="menu-item menu-item-type-separator menu-item-object-custom menu-item-9805207">
+ <a>|</a>
+ </li>
+ <li id="menu-item-42648" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42648">
+ <a href="http://jobs.seattletimes.com">Jobs</a>
+ </li>
+ <li id="menu-item-9756150" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9756150">
+ <a href="http://autos.seattletimes.com/">Autos</a>
+ </li>
+ <li id="menu-item-42651" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42651">
+ <a href="/explore/">Explore</a>
+ </li>
+ </ul>
+ <ul id="menu-section-business-navbar" class="secondary-navigation">
+ <li id="menu-item-20617" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-20617">
+ <a href="/business/boeing-aerospace/">Boeing &amp; Aerospace</a>
+ </li>
+ <li id="menu-item-9876234" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876234">
+ <a href="/business/amazon/">Amazon</a>
+ </li>
+ <li id="menu-item-20622" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-20622">
+ <a href="/business/microsoft/">Microsoft</a>
+ </li>
+ <li id="menu-item-43530" class="menu-item menu-item-type-taxonomy menu-item-object-section current-post-ancestor current-menu-parent current-post-parent menu-item-43530">
+ <a href="/business/technology/">Technology</a>
+ </li>
+ <li id="menu-item-43529" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-43529">
+ <a href="/business/economy/">Economy</a>
+ </li>
+ <li id="menu-item-9483205" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9483205">
+ <a href="/business/real-estate/">Real Estate</a>
+ </li>
+ </ul>
+ <div class="nav-all-sections">
+ <button class="nav-all-sections-toggle" aria-label="Toggle mega menu" aria-controls="navAllSections" aria-expanded="false">All Sections</button>
+ <div class="nav-all-sections-wrapper" id="navAllSections">
+ <ul id="menu-all-sections-tier-1" class="all-sections-primary">
+ <li id="menu-item-9850750" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-9850750">
+ <a href="/seattle-news/">Local</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845534" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845534">
+ <a href="/seattle-news/transportation/">Traffic Lab</a>
+ </li>
+ <li id="menu-item-10554575" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10554575">
+ <a href="/seattle-news/homeless/">Project Homeless</a>
+ </li>
+ <li id="menu-item-9845529" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845529">
+ <a href="/seattle-news/crime/">Crime</a>
+ </li>
+ <li id="menu-item-9845533" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845533">
+ <a href="/seattle-news/politics/">Local Politics</a>
+ </li>
+ <li id="menu-item-9845531" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845531">
+ <a href="/seattle-news/education/">Education</a>
+ </li>
+ <li id="menu-item-10273896" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10273896">
+ <a href="/education-lab/">Education Lab</a>
+ </li>
+ <li id="menu-item-9845530" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845530">
+ <a href="/seattle-news/eastside/">Eastside</a>
+ </li>
+ <li id="menu-item-9875159" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9875159">
+ <a href="/seattle-news/northwest/">Northwest</a>
+ </li>
+ <li id="menu-item-9874852" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9874852">
+ <a href="/seattle-news/data/">Data</a>
+ </li>
+ <li id="menu-item-9845532" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845532">
+ <a href="/seattle-news/health/">Health</a>
+ </li>
+ <li id="menu-item-9874851" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9874851">
+ <a href="/seattle-news/times-watchdog/">Times Watchdog</a>
+ </li>
+ <li id="menu-item-10828536" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10828536">
+ <a href="http://www.seattletimes.com/tag/inside-the-times/">Inside The Times</a>
+ </li>
+ <li id="menu-item-9845537" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9845537">
+ <a href="/obituaries/">News Obituaries</a>
+ </li>
+ <li id="menu-item-9845491" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845491">
+ <a href="/photo-video/">Photo &amp; Video</a>
+ </li>
+ <li id="menu-item-9845487" class="top-level menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845487">
+ <a href="/nation-world/">Nation &amp; World</a>
+ </li>
+ <li id="menu-item-9845488" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845488">
+ <a href="/nation-world/nation-politics/">Politics</a>
+ </li>
+ <li id="menu-item-9845538" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845538">
+ <a href="/nation-world/oddities/">Oddities</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845475" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845475">
+ <a href="/business/">Business</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845525" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845525">
+ <a href="/business/boeing-aerospace/">Boeing</a>
+ </li>
+ <li id="menu-item-9845524" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845524">
+ <a href="/business/amazon/">Amazon</a>
+ </li>
+ <li id="menu-item-9845526" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845526">
+ <a href="/business/microsoft/">Microsoft</a>
+ </li>
+ <li id="menu-item-9845499" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845499">
+ <a href="/business/technology/">Technology</a>
+ </li>
+ <li id="menu-item-9845539" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845539">
+ <a href="/business/economy/">Economy</a>
+ </li>
+ <li id="menu-item-9845498" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845498">
+ <a href="/business/real-estate/">Real Estate</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845492" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845492">
+ <a href="/sports/">Sports</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845553" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845553">
+ <a href="/sports/seahawks/">Seahawks</a>
+ </li>
+ <li id="menu-item-9845550" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845550">
+ <a href="/sports/uw-huskies/">Huskies</a>
+ </li>
+ <li id="menu-item-9845548" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845548">
+ <a href="/sports/wsu-cougars/">Cougars</a>
+ </li>
+ <li id="menu-item-9845549" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845549">
+ <a href="/sports/high-school/">High Schools</a>
+ </li>
+ <li id="menu-item-9845547" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845547">
+ <a href="/sports/mariners/">Mariners</a>
+ </li>
+ <li id="menu-item-9845493" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845493">
+ <a href="/sports/sounders/">Sounders</a>
+ </li>
+ <li id="menu-item-9849008" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9849008">
+ <a href="/sports/snow-sports/">Snow Sports</a>
+ </li>
+ <li id="menu-item-9848996" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848996">
+ <a href="/author/geoff-baker">Geoff Baker</a>
+ </li>
+ <li id="menu-item-9848994" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848994">
+ <a href="/author/matt-calkins">Matt Calkins</a>
+ </li>
+ <li id="menu-item-9848995" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848995">
+ <a href="/author/larry-stone">Larry Stone</a>
+ </li>
+ <li id="menu-item-9848993" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848993">
+ <a href="/author/bob-condotta">Bob Condotta</a>
+ </li>
+ <li id="menu-item-9921450" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9921450">
+ <a href="http://forums.seattletimes.com/forums/?from=stnv2">Forums</a>
+ </li>
+ <li id="menu-item-9848954" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848954">
+ <a href="/sports/sports-on-tv-radio-2/">On TV/Radio</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845476" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845476">
+ <a href="/entertainment/">Entertainment</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9848965" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848965">
+ <a href="/entertainment/movies/">Movies</a>
+ </li>
+ <li id="menu-item-9848968" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848968">
+ <a href="/entertainment/books/">Books</a>
+ </li>
+ <li id="menu-item-9848966" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848966">
+ <a href="/entertainment/music/">Music</a>
+ </li>
+ <li id="menu-item-9848979" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848979">
+ <a href="/entertainment/theater/">Theater</a>
+ </li>
+ <li id="menu-item-9849076" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9849076">
+ <a href="/entertainment/classical-music/">Classical Music</a>
+ </li>
+ <li id="menu-item-9875161" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9875161">
+ <a href="/entertainment/tv/">Television</a>
+ </li>
+ <li id="menu-item-10270563" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10270563">
+ <a href="/entertainment/comics/">Comics</a>
+ </li>
+ <li id="menu-item-10270565" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-10270565">
+ <a href="/entertainment/games/">Games &amp; Puzzles</a>
+ </li>
+ <li id="menu-item-10364416" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10364416">
+ <a href="https://www.seattletimes.com/horoscopes/">Horoscopes</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845478" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845478">
+ <a href="/life/">Life</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845490" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845490">
+ <a href="/pacific-nw-magazine/">Pacific NW Magazine</a>
+ </li>
+ <li id="menu-item-9848964" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848964">
+ <a href="/life/food-drink/">Food &amp; Drink</a>
+ </li>
+ <li id="menu-item-9848961" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9848961">
+ <a href="https://www.seattletimes.com/category/seattle-happy-hours/">Happy Hour</a>
+ </li>
+ <li id="menu-item-9848980" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9848980">
+ <a href="/life/wellness/">Wellness</a>
+ </li>
+ <li id="menu-item-9849021" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9849021">
+ <a href="/life/home-decor/">Home &amp; Decor</a>
+ </li>
+ <li id="menu-item-9875160" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9875160">
+ <a href="/life/pets/">Pets</a>
+ </li>
+ <li id="menu-item-9848981" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9848981">
+ <a href="https://www.seattletimes.com/category/rant-and-rave/">Rant &amp; Rave</a>
+ </li>
+ <li id="menu-item-9849075" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849075">
+ <a href="/author/bethany-jean-clement">Bethany Jean Clement</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845497" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845497">
+ <a href="/life/travel/">Travel</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845496" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845496">
+ <a href="/life/outdoors/">Outdoors</a>
+ </li>
+ <li id="menu-item-9849016" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9849016">
+ <a href="https://www.seattletimes.com/category/northwest-hikes/">Northwest Hikes</a>
+ </li>
+ <li id="menu-item-9849020" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9849020">
+ <a href="https://www.seattletimes.com/category/travel-in-washington-state/">Washington</a>
+ </li>
+ <li id="menu-item-9849019" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9849019">
+ <a href="https://www.seattletimes.com/category/travel-to-oregon/">Oregon</a>
+ </li>
+ <li id="menu-item-9849017" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9849017">
+ <a href="https://www.seattletimes.com/category/travel-to-british-columbia/">B.C.</a>
+ </li>
+ <li id="menu-item-9849018" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9849018">
+ <a href="https://www.seattletimes.com/category/travel-to-hawaii/">Hawaii</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845477" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-has-children menu-item-9845477">
+ <a href="/opinion/">Opinion</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9845551" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845551">
+ <a href="/opinion/editorials/">Editorials</a>
+ </li>
+ <li id="menu-item-9845552" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9845552">
+ <a href="/opinion/letters-to-the-editor/">Letters</a>
+ </li>
+ <li id="menu-item-9848983" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9848983">
+ <a href="https://www.seattletimes.com/category/op-eds/">Op-Eds</a>
+ </li>
+ <li id="menu-item-9848985" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848985">
+ <a href="/author/kate-riley/">Kate Riley</a>
+ </li>
+ <li id="menu-item-9848986" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848986">
+ <a href="/author/mark-higgins/">Mark Higgins</a>
+ </li>
+ <li id="menu-item-9848987" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848987">
+ <a href="/author/brier-dudley/">Brier Dudley</a>
+ </li>
+ <li id="menu-item-9848988" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848988">
+ <a href="/author/melissa-santos/">Melissa Santos</a>
+ </li>
+ <li id="menu-item-9848989" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9848989">
+ <a href="/author/donna-gordon-blankinship">Donna Gordon Blankenship</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-9845540" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-9845540">
+ <a href="/newsroom-staff/#news-columnists">Columnists</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9849034" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849034">
+ <a href="/author/nicole-brodeur/">Nicole Brodeur</a>
+ </li>
+ <li id="menu-item-9849057" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849057">
+ <a href="/author/gene-balk-fyi-guy">FYI Guy</a>
+ </li>
+ <li id="menu-item-11149670" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11149670">
+ <a href="https://www.seattletimes.com/author/tyrone-beason/">Tyrone Beason</a>
+ </li>
+ <li id="menu-item-9849058" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849058">
+ <a href="/author/gabriel-campanario-seattle-sketcher/">Seattle Sketcher</a>
+ </li>
+ <li id="menu-item-9849039" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849039">
+ <a href="/author/jon-talton/">Jon Talton</a>
+ </li>
+ <li id="menu-item-9849037" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849037">
+ <a href="/author/danny-westneat/">Danny Westneat</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <ul id="menu-all-sections-tier-2" class="all-sections-secondary">
+ <li id="menu-item-9849281" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849281">
+ <a href="http://jobs.seattletimes.com/">Jobs</a>
+ </li>
+ <li id="menu-item-9849284" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849284">
+ <a href="http://autos.seattletimes.com/">Autos</a>
+ </li>
+ <li id="menu-item-9849285" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849285">
+ <a href="/explore/nwhomes/">Homes Listings</a>
+ </li>
+ <li id="menu-item-9849286" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849286">
+ <a href="http://classifieds.seattletimes.com/">Classifieds</a>
+ </li>
+ <li id="menu-item-10203919" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10203919">
+ <a href="http://www.legacy.com/obituaries/seattletimes/#_ga=1.6704882.1560921668.1447363166">Paid Obituaries</a>
+ </li>
+ <li id="menu-item-9849287" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849287">
+ <a href="/explore/">Explore</a>
+ </li>
+ <li id="menu-item-10270535" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10270535">
+ <a href="/sponsored/">Sponsored Posts</a>
+ </li>
+ <li id="menu-item-9849288" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849288">
+ <a href="/explore/shop-northwest/">ShopNW</a>
+ </li>
+ <li id="menu-item-9849290" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849290">
+ <a href="http://company.seattletimes.com/store/">Seattle Times Store</a>
+ </li>
+ </ul>
+ <ul id="menu-all-sections-tier-3" class="all-sections-footer">
+ <li id="menu-item-9849310" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9849310">
+ <a href="https://www.seattletimes.com/contact/">Contact</a>
+ </li>
+ <li id="menu-item-9849312" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849312">
+ <a href="/help/">FAQs</a>
+ </li>
+ <li id="menu-item-9849313" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849313">
+ <a href="https://secure.seattletimes.com/accountcenter/managesubscriptions">Subscriber Services</a>
+ </li>
+ <li id="menu-item-9849314" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849314">
+ <a href="https://secure.seattletimes.com/accountcenter/replica">Print Replica</a>
+ </li>
+ <li id="menu-item-9849315" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849315">
+ <a href="https://itunes.apple.com/us/app/seattle-times-mobile/id329502124">iOS App</a>
+ </li>
+ <li id="menu-item-9849318" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9849318">
+ <a href="https://play.google.com/store/apps/details?id=com.seattletimes.android.SeattleTimesMobileNews">Android App</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="show-mobile">
+ <div class="section-nav-popup">
+ <div class="section-nav-popup-header">
+ <span class="section-nav-button">Amazon</span> <a class="section-nav-button close" href="#"></a>
+ </div>
+ <div class="section-nav-popup-container">
+ <ul id="menu-section-business-navbar" class="secondary-navigation">
+ <li id="menu-item-20617" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-20617">
+ <a href="/business/boeing-aerospace/">Boeing &amp; Aerospace</a>
+ </li>
+ <li id="menu-item-9876234" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9876234">
+ <a href="/business/amazon/">Amazon</a>
+ </li>
+ <li id="menu-item-20622" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-20622">
+ <a href="/business/microsoft/">Microsoft</a>
+ </li>
+ <li id="menu-item-43530" class="menu-item menu-item-type-taxonomy menu-item-object-section current-post-ancestor current-menu-parent current-post-parent menu-item-43530">
+ <a href="/business/technology/">Technology</a>
+ </li>
+ <li id="menu-item-43529" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-43529">
+ <a href="/business/economy/">Economy</a>
+ </li>
+ <li id="menu-item-9483205" class="menu-item menu-item-type-taxonomy menu-item-object-section menu-item-9483205">
+ <a href="/business/real-estate/">Real Estate</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </nav>
+ <div class="ad ad-top-one">
+ <div id="ad-flex-top" class="wrapper ad-top-two">
+ <div id="div-gpt-ad-top" class="dfp-ad dfp-top"></div>
+ </div>
+ </div>
+ <div class="secondary-nav-mobile">
+ <div class="wrapper">
+ <a href="/business/amazon/" class="section-title section-nav-button">Amazon</a>
+ <nav class="header-utils">
+ <ul>
+ <li>
+ <a href="https://%3C?php%20echo%20SSO_PREFIX;?%3Eseattletimes.com/accountcenter/" class="login st-return">Log In</a>
+ </li>
+ <li>
+ <a id="header-subscribe-link" href="/subscribe/signup-offers?subsource=voluntary" class="subscribe st-return">Subscribe</a>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </header>
+ <section id="content" class="content-well">
+ <div class="wrapper">
+ <article id="post-11469382" class="post-11469382 post type-post status-publish format-standard hentry tag-maritime-industry section-amazon section-business section-environment section-local-business section-nation section-retail h-entry">
+ <header class="article-header">
+ <ul class="article-slug">
+ <li>
+ <a href="/business/amazon/" rel="tag">Amazon</a>
+ </li>
+ <li>
+ <a href="/business/" rel="tag">Business</a>
+ </li>
+ <li>
+ <a href="/seattle-news/environment/" rel="tag">Environment</a>
+ </li>
+ <li>
+ <a href="/business/local-business/" rel="tag">Local Business</a>
+ </li>
+ <li>
+ <a href="/nation-world/nation/" rel="tag">Nation</a>
+ </li>
+ <li>
+ <a href="/business/retail/" rel="tag">Retail</a>
+ </li>
+ </ul>
+ <h1 class="article-title p-name entry-title">
+ Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods
+ </h1>
+ <div class="article-dateline">
+ <time class="line published dt-published" datetime="2019-04-28 06:01:07">April 28, 2019 at 6:01 am</time> <time class="line update updated dt-updated" datetime="2019-04-29 15:33:39">Updated April 29, 2019 at 3:33 pm</time>
+ <div class="article-share m-0" data-utm="article_inset_1.1">
+ <a class="social-share mt-0 mr-0 mb-0 pl-24" aria-label="Share this article via Facebook"></a> <a class="social-share mt-0 mr-0 mb-0 pl-24" aria-label="Share this article via email"></a> <a class="social-share mt-0 mr-0 mb-0 pl-24" aria-label="Share this article via Twitter"></a>
+ </div>
+ </div>
+ </header>
+ <div class="featured-media full-width">
+ <div id="gallery-11519493-11519494-2062128799" class="gallery-wrapper layout-standard">
+ <div class="gallery align-none">
+ <div class="gallery-slider-wrapper">
+ <div class="gallery-slides">
+ <figure id="slide-11519493" class="slide image-slide">
+ <div class="lazy-loading"></div><img data-count="1" data-ratio="1.59363" data-src-facebook="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1200x630.jpg" data-caption="Wade Bassi, skipper and co-owner of the 106-year-old halibut fishing vessel Polaris, stands near his boat at Fisherman’s Terminal in Seattle. Bassi and his crew left the day after Easter for Alaska, where they will fish for halibut and black cod. (Ellen M. Banner / The Seattle Times)" class="" alt="Wade Bassi, skipper and co-owner of the 106-year-old halibut fishing vessel Polaris, stands near his boat at Fisherman’s Terminal in Seattle. Bassi and his crew left the day after Easter for Alaska, where they will fish for halibut and black cod. (Ellen M. Banner / The Seattle Times)" src="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1020x640.jpg" srcset="https://static.seattletimes.com/wp-content/uploads/2019/04/120028-300x188.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-768x482.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1024x643.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-780x489.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1020x640.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-1560x979.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120028-375x235.jpg 375w" sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" data-sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" />
+ </figure>
+ <figure id="slide-11519494" class="slide image-slide">
+ <div class="lazy-loading"></div><img data-count="2" data-ratio="1.5" data-src-facebook="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1200x630.jpg" data-caption="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" class="lazy wait" alt="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" src="https://www.seattletimes.com/wp-content/themes/st_refresh/img/lazy-loading-14x9.png" data-src="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg" data-srcset="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w" data-sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" /><noscript><img data-count="2" data-ratio="1.5" data-src-facebook='https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1200x630.jpg' data-caption="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" class='wait' alt='Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)' src='https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg' srcset='https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w' sizes='(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px' data-sizes='(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px' /></noscript>
+ </figure>
+ </div>
+ <div class="gallery-navigation hide-nav">
+ <div class="prev"></div>
+ <div class="next"></div>
+ <div class="button-contract contract"></div>
+ </div>
+ </div>
+ <div class="gallery-meta-panel"></div>
+ </div>
+ </div>
+ </div>
+ <div class="article-body e-content">
+ <div class="article-byline">
+ <a href="/author/cap-ben-romano" class="headshot article-columnist-headshot"><img src="https://static.seattletimes.com/wp-content/uploads/2018/10/BenRomano-copy-100x100.jpg" alt="Benjamin Romano" /></a>
+ <div class="byline-text single_author">
+ <span class="byline-copy">By</span>
+ <div class="name vcard">
+ <a href="/author/cap-ben-romano/" rel="author" class="p-author h-card hcard url fn">Benjamin Romano</a> <a target="_blank" href="https://www.twitter.com/bromano"></a>
+ </div>
+ <div class="title vcard">
+ <span class="p-author fn">Seattle Times business reporter</span>
+ </div>
+ </div>
+ </div>
+ <div itemprop="articleBody" id="article-content" class="article-content entry-content">
+ <p>
+ From the deck of his 106-year-old halibut schooner, undergoing a seasonal overhaul at Fisherman’s Terminal in Seattle, skipper Wade Bassi has better insight than most into what’s happening at Amazon-owned Whole Foods Market, at least as pertains to the product he knows best.
+ </p>
+ <p>
+ While he doesn’t buy halibut much — he’s got a freezer full of it — Bassi, 43 years a fisherman, keeps an eye on how it’s handled and presented in the grocery stores and fish markets.
+ </p>
+ <p>
+ “When you look at nice halibut, I mean it is pure white,” he said. “And it is flaky-looking, and it is beautiful. It’s translucent. If you’ve got that in the fish market, people are going to buy it.”
+ </p>
+ <p>
+ A few days earlier, Whole Foods touted a rarely seen promotional price for halibut as part of its ongoing campaign to revise the grocery chain’s high-cost reputation while maintaining its image for quality and sustainability.
+ </p>
+ <p>
+ “Whole Foods is one of the better ones, to be honest with you,” Bassi said. “But you know, Whole Foods, whole paycheck. … They usually do charge way more for everything than anywhere else. Which really surprises me that they’re selling this for $16-something a pound, because they’re not making anything on it.”
+ </p>
+ <p>
+ Whole Foods’ halibut deal opens a window into Amazon’s grocery strategy as it seeks to combine the defining characteristics of each brand, leverage its juggernaut Prime membership program and take a larger share of the grocery business from competitors such as Walmart, Kroger and Costco.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-multiple body1">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body1a" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ <div id="div-gpt-ad-body1b" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ <div id="div-gpt-ad-body1c" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ It also draws a long line from a major Seattle industry with roots in the 19<sup>th</sup> century to the dominant economic force of the 21<sup>st</sup>.
+ </p>
+ <p>
+ Amazon bought Whole Foods in August 2017 for $13.7 billion, its largest acquisition and an aggressive move into the grocery business.
+ </p>
+ <p>
+ The combination of the two has been steady, said Tom Forte, who follows Amazon as a managing director at the D.A. Davidson brokerage. In a few more years, he said, “You won’t recognize the original Whole Foods.”
+ </p>
+ <p>
+ Within months of the acquisition, Forte said, Whole Foods was selling cheaper cage-free eggs and organic ground beef, prices it said were a result of the deal.
+ </p>
+ <p>
+ Then came the integration of Prime, Amazon’s $119-a-year shipping and media-subscription program, which Amazon founder Jeff Bezos said last year had surpassed 100 million members. In Whole Foods, Prime operates as a hybrid of the customer-loyalty discount programs offered by most grocers — in which consumers trade details of their purchasing habits for lower prices — and a paid membership like at Costco or Sam’s Club.
+ </p>
+ <p>
+ Whole Foods stores have been festooned with yellow and blue signs pointing out Prime member benefits, one of which was fresh halibut fillets priced at $16.99 a pound, albeit only for a week earlier this month.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-single">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body2a" class="dfp-ad ad ad-single">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ “I was shocked to see that level,” said Tyler Besecker, president of Mercer Island-based Dana F. Besecker Company, the largest buyer of Pacific halibut. The price, which was matched at Kroger-owned QFC stores in the region last week, is “as low as I’ve ever seen.” (Besecker does not currently supply Whole Foods.)
+ </p>
+ <p>
+ Fresh halibut fillets routinely sell for $24 to $28 a pound, and often more.
+ </p>
+ <p>
+ He said there’s little if any room for a profit at the promotional price offered by Whole Foods and QFC. “They might be selling those at cost or as loss leaders just to get people into the stores,” Besecker said.
+ </p>
+ <div id="userMessagingInset" class="user-messaging animate"></div>
+ <p>
+ In the competitive grocery business, promotions like this happen all the time. The thinking is that shoppers will be attracted by the discount on a staple or a prestige item, and then fill their carts with other groceries sold at a profit.
+ </p>
+ <p>
+ A Whole Foods spokeswoman declined to comment on pricing. The temporary halibut discount is one of more than 300 such Prime promotions Whole Foods plans in the next few months. The company also said it was lowering prices across the store, its third such announcement since the acquisition.
+ </p>
+ <p>
+ At the seafood counter in the Whole Foods store on Westlake, surrounded by Amazon headquarters buildings, a sign advertised “First of the Season Fresh Alaskan Halibut” and sported the blue Marine Stewardship Council (MSC) Certified Sustainable Seafood label.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pv-2">
+ <div class="teadsNative"></div>
+ </div>
+ <p>
+ Whole Foods has been a pioneer in sustainable-seafood marketing, beginning in 1999 when it began to stock fish with the MSC label. In the mid-2000s, Pacific halibut fishermen sought the certification — a system of third-party audits that tracks seafood from catch to market — and Whole Foods was there from the beginning.
+ </p>
+ <p>
+ “They were the first ones to market the MSC halibut,” said Bob Alverson, head of the Fishing Vessel Owners Association, representing boats that catch halibut and black cod and a driver of the certification effort. “It turned into quite a marketing advantage. Whole Foods saw that early. They were focusing on sustainable, high-quality food products. They had quite a bit of foresight, I think, in that direction.”
+ </p>
+ <p>
+ The certification comes with added costs borne by the fishermen and buyers, and passed on to consumers. But it’s also an assurance “that people are watching out for the resource,” he said.
+ </p>
+ <div data-section="business" class="most-read-container module most-shared truncate show u-border-t u-border-b u-border-light-gray embed-container mt-40 mb-40">
+ <div class="most-read-wrapper mb-17">
+ <h2 class="mrw-header pt-27">
+ Most Read Business Stories
+ </h2>
+ <ul class="pl-20 mb-0">
+ <li class="u-relative pv-1 pl-3 most-read-widget-item most-read-widget-item-1">
+ <a class="no-image u-href font-list u-off-black" href="//www.seattletimes.com/business/real-estate/metro-seattle-home-prices-ease-in-expensive-areas-surge-in-lower-cost-cities/"><span>Seattle-area housing market splits into 2 dramatically different pieces</span></a>
+ </li>
+ <li class="u-relative pv-1 pl-3 most-read-widget-item most-read-widget-item-2">
+ <a class="no-image u-href font-list u-off-black" href="//www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/"><span>Alaskan halibut, caught by a century-old Seattle boat, provides a glimpse of Amazon’s strategy with Whole Foods</span></a>
+ </li>
+ <li class="u-relative pv-1 pl-3 most-read-widget-item most-read-widget-item-3">
+ <a class="no-image u-href font-list u-off-black" href="//www.seattletimes.com/business/boeing-aerospace/facing-sharp-questions-boeing-ceo-refuses-to-admit-flaws-in-737-max-design/"><span>Facing sharp questions, Boeing CEO refuses to admit flaws in 737 MAX design</span></a>
+ </li>
+ <li class="u-relative pv-1 pl-3 most-read-widget-item most-read-widget-item-4">
+ <a class="no-image u-href font-list u-off-black" href="//www.seattletimes.com/business/real-estate/amazon-again-expands-in-bellevue-with-another-big-lease/"><span>Amazon again expands in Bellevue with lease of two future towers</span></a>
+ </li>
+ <li class="u-relative pv-1 pl-3 most-read-widget-item most-read-widget-item-5">
+ <a class="no-image u-href font-list u-off-black" href="//www.seattletimes.com/business/how-to-stop-robocall-spammers-and-exact-revenge/"><span>How to stop robocall spammers and exact revenge | Tech Review</span></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <p>
+ As it tries to convince people it has lower prices, Whole Foods has been very careful to maintain the reputation built on products like MSC-certified halibut.
+ </p>
+ <div class="image-single-wrapper image-11519494-499029239 layout-column-width">
+ <figure id="image-11519494" class="article-figure align-none">
+ <img data-ratio="1.5" data-caption="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" class="lazy" alt="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" src="https://www.seattletimes.com/wp-content/themes/st_refresh/img/lazy-loading-14x9.png" data-src="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg" data-srcset="https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w" data-sizes="(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px" /><noscript><img data-ratio="1.5" data-caption="Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)" class='' alt='Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)' src='https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg' srcset='https://static.seattletimes.com/wp-content/uploads/2019/04/120109-300x200.jpg 300w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-768x512.jpg 768w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1024x683.jpg 1024w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-780x520.jpg 780w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1020x680.jpg 1020w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-1560x1040.jpg 1560w, https://static.seattletimes.com/wp-content/uploads/2019/04/120109-375x250.jpg 375w' sizes='(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px' data-sizes='(max-width: 767px) calc(100vw - 20px), (max-width: 1019px) calc(100vw - 30px), (max-width: 1044px) calc(100vw - 60px), 970px' /></noscript>
+ <figcaption class="article-figure-caption">
+ <span class="caption">Amazon-owned Whole Foods touted a price cut on halibut as part of an announcement recently about lower prices on hundreds of items. (Ellen M. Banner / The Seattle Times)</span>
+ </figcaption>
+ </figure>
+ </div>
+ <p>
+ <strong>Whole Foods future</strong>
+ </p>
+ <p>
+ New signs in stores appeared this month, spelling out the value proposition it’s trying to strike: “New lower prices. Same high standards,” reads one, against a background image of carrots.
+ </p>
+ <p>
+ At the same time, the company claims its new prices and Prime deals have saved customers “hundreds of millions of dollars” since the Amazon acquisition.
+ </p>
+ <div class="native-ad-article u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap"></div>
+ </div>
+ <p>
+ If prices are being lowered and the quality bar stays the same, something else has to give.
+ </p>
+ <p>
+ Analysts provided a few theories:
+ </p>
+ <p>
+ Amazon could be willing to accept losses or slimmer profits within Whole Foods, as it has done in other businesses, in an effort to expand its customer base.
+ </p>
+ <p>
+ “Do they take the profit from their non-retail efforts, which today is primarily cloud computing, and then reinvest those profits to take share in grocery?” Forte said.
+ </p>
+ <div id="userMessagingPostscript" class="user-messaging animate"></div>
+ <p>
+ That could eventually open up an avenue to growth as the rate of expansion slows in Amazon’s broader U.S. retail sales.
+ </p>
+ <p>
+ “That’s why they need grocery to work,” Forte said. “Grocery’s a very big category.”
+ </p>
+ <p>
+ Whole Foods could also <span class="annotated" data-st-annotation-ref="1792ba">press suppliers to reduce their prices</span>, essentially cutting their profit.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-single">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body5a" class="dfp-ad ad ad-single">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ “The worry with that is that it puts the squeeze on the producer upstream,” said Ananth Iyer, a professor at Purdue University whose research includes sustainability in supply chains. If producers are squeezed too much, he noted, they may start to cut corners.
+ </p>
+ <p>
+ So far, there’s no evidence this is happening in halibut, where fishery practices have been carefully managed with a goal of sustainability for nearly a century. Also, Whole Foods does not yet have the scale as a buyer to dictate prices the way a company like Costco does.
+ </p>
+ <p>
+ Forte said that even if it did have such clout, this would be a risky strategy that would undermine the very attributes of the Whole Foods brand that make it most valuable.
+ </p>
+ <p>
+ Another theory is that Amazon could apply more of its technology and expertise in logistics to create supply-chain efficiencies that would maintain its profits while benefiting producers and consumers, particularly with perishable grocery products, Iyer said. This is part of the promise of the acquisition in the first place.
+ </p>
+ <p>
+ “That’s a powerful combination,” Forte said. “The sustainable, the organic, the healthier food — all those qualities of Whole Foods, with the supply-chain technology of Amazon. It plays to the strengths of both sides.”
+ </p>
+ <p>
+ Forte said he expects Amazon to continue its aggressive moves on grocery pricing at Whole Foods. But he wonders when the price cuts will be broader, particularly as Amazon competes with the likes of Walmart and Kroger for a bigger slice of U.S. food and beverage retail sales, which totaled $726 billion in 2017. Whole Foods said it has lowered prices on hundreds of items, with an emphasis on fresh produce.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-single">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body6a" class="dfp-ad ad ad-single">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ Forte described his attempt after the acquisition to get the ingredients for Rice Krispies Treats at Whole Foods. It was perhaps doomed from the start: Whole Foods doesn’t carry Rice Krispies. But he found an organic brown rice puff cereal and organic marshmallows. They were “so wildly expensive that we didn’t finish the exercise. I took the kids to Walmart and bought the ingredients for a pittance,” Forte said.
+ </p>
+ <p>
+ That points to the bigger question of how Amazon plans to position Whole Foods for the long term in its expanding array of physical retail-grocery formats. It now has 11 automated Go convenience stores and is rumored to be planning a new, low-priced grocery chain of its own that may deploy the same cashierless checkout technology.
+ </p>
+ <p>
+ Meanwhile, Whole Foods is not opening any new 365 stores, a smaller, lower-priced version of the main brand highlighting the company’s private-label products. Whole Foods co-founder and CEO John Mackey said in an internal memo that the “price distinction between the two brands has become less relevant” as Whole Foods lowered its prices, Yahoo Finance <a href="https://finance.yahoo.com/news/amazonowned-whole-foods-scraps-smaller-365-store-expansion-203543290.html" target="_blank" class="content-link external">reported</a> earlier this year.
+ </p>
+ <p>
+ Amazon, too, is finding success with a growing stable of private-label brands — it had more than 100 as of last July, according to Coresight Research, double the number in 2017. One of these, Solimo, sells generic versions of everything from K-Cup coffee pods to Epsom salts to garbage bags and racked up more than $6 million in sales in January alone, according to data analysis firm 1010data.
+ </p>
+ <p>
+ Of course, there’s nothing generic about a “fresh, sustainable wild-caught halibut fillet.”
+ </p>
+ <p>
+ <strong>Back on the schooner</strong>
+ </p>
+ <p>
+ The day after Easter, Bassi and his crew — three family members and an unrelated father-and-son team — loaded up the Polaris, one of four century-old wooden schooners still chasing halibut out of Seattle. (The broader Washington-based halibut fleet numbers about 100 vessels.) Bassi’s father fished on the Polaris, which Bassi co-owns with&#160;Rolfe McCartney. Bassi’s grandfather fished halibut back when schooners carried small dories out to the fishing grounds, which made the landing of a fish that can grow to 500 pounds all the more exciting.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-multiple">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body7a" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ <div id="div-gpt-ad-body7b" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ <div id="div-gpt-ad-body7c" class="dfp-ad ad ad-multiple">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ The Polaris motored out of Fisherman’s Terminal and through the Ballard Locks to begin the three-day journey through the Inside Passage to Ketchikan, Alaska. There, they take on tons of ice and bait, herring for the black cod Bassi will target first, and later chum salmon, codfish or octopus for the halibut.
+ </p>
+ <p>
+ From a base in Kodiak, Alaska, the Polaris makes a series of trips, at sea for a week or longer at a time, to fish as far away as Attu Island at the far western edge of the Aleutian Islands chain. “It’s a big range that we fish,” Bassi said.
+ </p>
+ <p>
+ The Polaris will trail long lines of hooks, leaving them to soak for several hours before reeling them in. The fish are stunned, bled and dressed, and put on ice in the hold. It is this fishing method that contributes to the quality of the halibut and sustainability of the fishery, as it reduces by-catch — the inadvertent taking of other <span class="annotated" data-st-annotation-ref="53071e">species</span>.
+ </p>
+ <p>
+ They negotiate to sell the fish with four or five buyers, such as Besecker, at a price that fluctuates throughout the season. This is a peak time of year for halibut, with consumers seeking out fresh fish for Easter and Mother’s Day, Besecker said. Fishermen are typically paid between $5 and $6 a pound for halibut.
+ </p>
+ <p>
+ The Alaskan halibut fishery has its troubles — as nearly all fisheries do — but has been rationalized and managed successfully, particularly over the last quarter-century. Alverson, a commissioner on the Seattle-based International Pacific Halibut Commission, which has managed catch limits for U.S. and Canadian fishermen since 1924, described it as a stable but declining resource.
+ </p>
+ <p>
+ This year, the <a href="https://iphc.int/management/fisheries" target="_blank" class="content-link external">halibut fishery</a> in the Northern Pacific and Bering Sea is <a href="https://iphc.int/data/landings-2019" target="_blank" class="content-link external">capped at 29.4 million pounds</a>, with most of that allocated to commercial fishing and smaller amounts reserved for recreational and tribal fishing, as well as by-catch of other commercial fisheries.
+ </p>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-4 mt-4 pt-0 ad-container-single">
+ <div class="ad-label font-micro u-tc u-mid-light-gray u-sans pv-10 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-body8a" class="dfp-ad ad ad-single">
+ <div class="ad-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ <p>
+ Alverson summed up the journey from a wooden fishing boat in the Bering Sea to the fish counter of a grocery store owned by a company that has redefined modern buying and selling: “It’s Seattle old school meets Seattle new school with Amazon.”
+ </p>
+ <div class="multi-related-article-links embed-container u-sans u-border-t u-border-b u-border-light-gray mv-40 pv-20">
+ <div class="multi-related-article-links-wrapper u-dib">
+ <h3 class="related-article-label u-middle-gray u-dib u-upper u-bold font-tiny pb-10 mb-0">
+ Related
+ </h3><a class="related-article-link-label u-off-black u-upper u-bold font-tiny pb-10 u-sans u-blue-hfa:hover" href="https://www.seattletimes.com/business/amazon/">More on Amazon</a>
+ <ul class="related-article-links-list mb-0 ml-1 u-serif">
+ <li class="list-item">
+ <a class="related-article-headline font-list u-off-black u-blue-hfa:hover pb-10" href="https://www.seattletimes.com/business/amazon-posts-first-jobs-for-new-virginia-headquarters-says-project-is-ahead-of-schedule/">Amazon posts first jobs for new Virginia headquarters, says project is ahead of schedule</a>
+ </li>
+ <li class="list-item">
+ <a class="related-article-headline font-list u-off-black u-blue-hfa:hover pb-10" href="https://www.seattletimes.com/business/amazon/amazon-posts-3-6-billion-quarterly-profit-outrunning-expectations/">Amazon earns $3.6 billion profit, vows to shift to 1-day delivery for Prime members</a>
+ </li>
+ <li class="list-item">
+ <a class="related-article-headline font-list u-off-black u-blue-hfa:hover pb-10" href="https://www.seattletimes.com/business/amazon/amazon-grabs-large-downtown-bellevue-property-next-to-transit-hub/">Amazon grabs large downtown Bellevue property next to transit hub</a>
+ </li>
+ </ul>
+ <ul class="related-article-links-list-more u-serif hide"></ul>
+ <div class="show-hide-btn u-middle-gray u-dif u-navy-hfa hide">
+ <p class="icon-text font-list u-bold u-sans u-dib mb-0">
+ More
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="extended-byline">
+ <div class="single-byline">
+ <span class="name">Benjamin Romano:</span> <span>206-652-6593</span> or <span><a href="mailto:[email protected]">[email protected]</a>;</span> <span>on Twitter: <a target="_blank" href="https://www.twitter.com/bromano">@bromano</a>.</span>
+ </div>
+ </div>
+ </div>
+ </div><a id="comments" class="article-comments-bar" href="#comments"> View <span class="comment-count talk_comment_count">Comments</span></a>
+ <div class="comments-container">
+ <div class="u-tc mb-4 mt-2 u-sans hide">
+ You must be logged in to leave a comment. <a href="https://secure.seattletimes.com/accountcenter" class="coral-login-link">Log in</a> or <a href="https://secure.seattletimes.com/accountcenter/register" class="coral-create-account-link">create an account</a>.
+ </div>
+ <div id="coral_talk_stream"></div>
+ <p class="u-sans font-small mb-5">
+ The opinions expressed in reader comments are those of the author only, and do not reflect the opinions of The Seattle Times.
+ </p>
+ </div>
+ </article>
+ <div id="article-recommended-wrapper">
+ <div class="OUTBRAIN outbrain-recommended" data-src="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/" data-widget-id="AR_6" data-ob-template="seattletimes"></div>
+ </div>
+ <div class="recirculation-widget"></div>
+ <div class="ad-container u-bg-dark-off-white full-width-inset mb-135 pt-0 ad-container-multiple">
+ <div class="font-tiny u-tc u-mid-light-gray u-sans pv-6 u-upper">
+ Advertising
+ </div>
+ <div class="ad-container-inner mh-auto u-df justify-content-between flex-nowrap">
+ <div id="div-gpt-ad-recirc1a" class="dfp-ad ad"></div>
+ <div id="div-gpt-ad-recirc1b" class="dfp-ad ad"></div>
+ <div id="div-gpt-ad-recirc1c" class="dfp-ad ad"></div>
+ </div>
+ </div>
+ <div class="OUTBRAIN outbrain-around-the-web" data-src="https://www.seattletimes.com/business/amazon/alaskan-halibut-caught-by-a-century-old-seattle-boat-provides-a-glimpse-of-amazons-strategy-with-whole-foods/" data-widget-id="AR_5" data-ob-template="seattletimes"></div>
+ <script type="text/javascript" async="async" src="https://widgets.outbrain.com/outbrain.js"></script>
+ <div id="userMessagingFooter" class="full-width-content user-messaging animate"></div>
+ <div id="ad-container-bottom">
+ <div id="div-gpt-ad-bottom" class="dfp-ad ad"></div>
+ </div>
+ </div>
+ </section>
+ </div>
+ <div id="ad-position-right11-small-mobile" class="footer-right11-ad ad small-mobile medium-rect">
+ <!-- Mobile Only Right11 Ad Position -->
+ </div>
+ <footer class="global-footer">
+ <div class="seattle-horizon"></div>
+ <div class="footer-top">
+ <div class="wrapper">
+ <ul class="footer-nav-primary">
+ <li id="menu-item-42879" class="menu-item menu-item-type-taxonomy menu-item-object-post_format menu-item-has-children menu-item-42879">
+ <a href="https://www.seattletimes.com/type/link/">Contact</a>
+ <ul class="sub-menu">
+ <li id="menu-item-9619487" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9619487">
+ <a href="https://www.seattletimes.com/newsroom-staff/">Newsroom staff list</a>
+ </li>
+ <li id="menu-item-42783" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-42783">
+ <a href="https://www.seattletimes.com/help/">FAQ</a>
+ </li>
+ <li id="menu-item-9487380" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9487380">
+ <a href="https://www.seattletimes.com/contact/">Contact form</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-5522511" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-5522511">
+ <a href="http://company.seattletimes.com/who-we-are/">About the company</a>
+ <ul class="sub-menu">
+ <li id="menu-item-42813" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42813">
+ <a href="https://srw.seattletimes.com/">Seattle Restaurant Week</a>
+ </li>
+ <li id="menu-item-42808" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42808">
+ <a href="http://nie.seattletimes.com">Newspapers in Education</a>
+ </li>
+ <li id="menu-item-42809" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42809">
+ <a href="http://ffn.seattletimes.com">Fund for the Needy</a>
+ </li>
+ <li id="menu-item-42799" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42799">
+ <a href="http://company.seattletimes.com/careers/">Employment</a>
+ </li>
+ <li id="menu-item-42803" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42803">
+ <a href="http://nl.newsbank.com/nl-search/we/Archives/?p_product=HA-SE&amp;p_theme=histpaper&amp;p_action=keyword">Historical Archives</a>
+ </li>
+ <li id="menu-item-9591853" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9591853">
+ <a href="https://www.seattletimes.com/pulitzers/">Pulitzers</a>
+ </li>
+ <li id="menu-item-42786" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42786">
+ <a href="http://company.seattletimes.com/contact-us/">Company information</a>
+ </li>
+ <li id="menu-item-9639172" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9639172">
+ <a href="https://stux.wufoo.com/forms/permissions-and-licensing-request/">Permissions</a>
+ </li>
+ <li id="menu-item-9639173" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-9639173">
+ <a href="http://company.seattletimes.com/store/">Seattle Times Store</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-42880" class="menu-item menu-item-type-taxonomy menu-item-object-post_format menu-item-has-children menu-item-42880">
+ <a href="https://www.seattletimes.com/type/link/">Advertise</a>
+ <ul class="sub-menu">
+ <li id="menu-item-42825" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42825">
+ <a href="http://classifieds.seattletimes.com/">Classifieds</a>
+ </li>
+ <li id="menu-item-42832" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42832">
+ <a href="http://autos.seattletimes.com/">Autos</a>
+ </li>
+ <li id="menu-item-42834" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42834">
+ <a href="http://homes.seattletimes.com/postlisting.html">Homes</a>
+ </li>
+ <li id="menu-item-42830" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42830">
+ <a href="http://services.nwsource.com/ClassifiedWeb/ObituaryNotice.aspx">Obituary</a>
+ </li>
+ <li id="menu-item-42831" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42831">
+ <a href="http://jobs.seattletimes.com/employer-home">Jobs</a>
+ </li>
+ <li id="menu-item-42817" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42817">
+ <a href="http://mediakit.seattletimes.com/">Media Kit</a>
+ </li>
+ <li id="menu-item-42824" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42824">
+ <a href="http://mediakit.seattletimes.com/">Advertise with Us</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-42874" class="menu-item menu-item-type-taxonomy menu-item-object-post_format menu-item-has-children menu-item-42874">
+ <a href="https://www.seattletimes.com/type/link/">Subscriber Services</a>
+ <ul class="sub-menu">
+ <li id="menu-item-42839" class="st-return menu-item menu-item-type-custom menu-item-object-custom menu-item-42839">
+ <a href="/subscribe/signup-offers/?subsource=voluntary">Subscribe</a>
+ </li>
+ <li id="menu-item-42843" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42843">
+ <a href="https://secure.seattletimes.com/accountcenter/linksubscription">Activate Account</a>
+ </li>
+ <li id="menu-item-42841" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42841">
+ <a href="https://secure.seattletimes.com/accountcenter/managesubscriptions">Manage Subscription</a>
+ </li>
+ <li id="menu-item-42842" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42842">
+ <a href="https://secure.seattletimes.com/accountcenter/deliveryholds">Place Temporary Hold</a>
+ </li>
+ <li id="menu-item-5522514" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5522514">
+ <a href="https://secure.seattletimes.com/accountcenter/reportdeliveryissue">Report Delivery Issue</a>
+ </li>
+ <li id="menu-item-42846" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42846">
+ <a href="https://secure.seattletimes.com/accountcenter/paymybill">Make a Payment</a>
+ </li>
+ <li id="menu-item-42847" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42847">
+ <a href="https://secure.seattletimes.com/accountcenter/replica">Print Replica</a>
+ </li>
+ </ul>
+ </li>
+ <li id="menu-item-42857" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42857">
+ <a href="/PDF/frontpage.pdf">Today’s Front Page</a>
+ </li>
+ <li id="menu-item-42875" class="facebook separated menu-item menu-item-type-custom menu-item-object-custom menu-item-42875">
+ <a target="_blank" href="https://www.facebook.com/seattletimes">Facebook</a>
+ </li>
+ <li id="menu-item-42876" class="twitter menu-item menu-item-type-custom menu-item-object-custom menu-item-42876">
+ <a target="_blank" href="https://twitter.com/seattletimes">Twitter</a>
+ </li>
+ </ul>
+ <ul id="menu-footer-secondary" class="footer-nav-secondary">
+ <li id="menu-item-9604572" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9604572">
+ <a href="https://www.seattletimes.com/rss-feeds/">RSS Feeds</a>
+ </li>
+ <li id="menu-item-9927432" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9927432">
+ <a href="https://www.seattletimes.com/newsletters/">Newsletters</a>
+ </li>
+ <li id="menu-item-5522517" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-5522517">
+ <a href="https://www.seattletimes.com/mobile-apps/">Mobile Apps</a>
+ </li>
+ <li id="menu-item-9471222" class="st-return menu-item menu-item-type-custom menu-item-object-custom menu-item-9471222">
+ <a href="/subscribe/signup/">Subscribe</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="footer-btm">
+ <div class="wrapper">
+ <section class="footer-copyright">
+ <a href="https://company.seattletimes.com/notices/notice3.html">Copyright © 2019 The Seattle Times</a> | <a href="https://company.seattletimes.com/notices/notice2.html">Privacy statement</a> | <a href="https://company.seattletimes.com/notices/notice1.html">Terms of service</a>
+ </section>
+ </div>
+ </div>
+ </footer>
+ <div class="modals">
+ <div class="global-modal">
+ <div class="modal-content"></div>
+ </div>
+ <div id="message-container"></div>
+ <div id="ad-inter"></div>
+ <div id="ad-wallpaper"></div>
+ <div id="userMessagingOverlay" class="user-messaging"></div>
+ </div>
+ <div class="footer-scripts">
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/st-article-template/js/article-template/dist/article-main.js?ver=1554930831"></script>
+ <script type="text/javascript">
+
+ /* <![CDATA[ */
+ var globalStub = [];
+ var SEATIMESCO = SEATIMESCO || {};
+
+ window.SEATIMESCO.singleSignOn = window.SEATIMESCO.singleSignOn || {};
+ window.SEATIMESCO.singleSignOn.info = window.SEATIMESCO.singleSignOn.info || {};
+ window.SEATIMESCO.singleSignOn.info.ssoEnvironment = "secure.";
+ window.SEATIMESCO.singleSignOn.info.subscriberSessionURL = "https://secure.seattletimes.com/accountcenter/getsubscribersession.js?method=ajax&session=";
+ window.SEATIMESCO.singleSignOn.info.commenterSessionURL = "https://secure.seattletimes.com/accountcenter/coraltoken.js?token=";
+ window.SEATIMESCO.singleSignOn.info.analyticsURL = "https://secure.seattletimes.com/accountcenter/soa.js?method=ajax&session=";
+
+ window.SEATIMESCO.ads = window.SEATIMESCO.ads || {};
+ window.SEATIMESCO.ads.disabled = false;
+
+ window.SEATIMESCO.ads = window.SEATIMESCO.ads || {};
+ window.SEATIMESCO.ads.nucleusCategories = window.SEATIMESCO.ads.nucleusCategories || {};
+ window.SEATIMESCO.ads.nucleusCategories = ["Business","Technology"];
+ window.SEATIMESCO.subscriptionSalePromo = window.SEATIMESCO.subscriptionSalePromo || {};
+
+ window.SEATIMESCO.subscriptionSalePromo.enabled = false;
+
+ window.SEATIMESCO.subscriptionSalePromo.text = "Sale extended! Last day to save over 90% on unlimited digital access for 8 weeks.";
+
+ window.SEATIMESCO.subscriptionSalePromo.cta = "Subscribe now";
+
+ window.SEATIMESCO.subscriptionSalePromo.url = "https://www.seattletimes.com/subscribe/signup-offers/?subsource=promo";
+ window.SEATIMESCO.images = window.SEATIMESCO.images || {};
+ window.SEATIMESCO.images.lazyLoadingDisabled = true;
+ window.SEATIMESCO.images.forceSSL = true;
+
+ window.SEATIMESCO.userMessaging = window.SEATIMESCO.userMessaging || {};
+ window.SEATIMESCO.userMessaging = {"messages":[{"id":"g5zaus","type":"declined-payment","dateCreated":1555531087433,"enabled":1,"userTypes":[{"value":"subscriber","label":"Subscriber"}],"priority":4,"slot":"overlay","pageTypes":[{"value":"story","label":"Story"}],"deviceTypes":[{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"headline":"Attention!","message":"Your subscription will be suspended unless you update your credit card.","buttonText":"Update payment","url":"https:\/\/secure.seattletimes.com\/accountcenter\/autopay"},{"id":"vvinb2","type":"paywall","dateCreated":1552956908229,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"pageviewCount":4,"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","headline":"Last article.","buttonText":"Get a risk-free trial","buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter"},{"id":"e8p618","type":"paywall","dateCreated":1552956854830,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","pageviewCount":3,"buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter","buttonText":"Start trial","headline":"Get 1 month free"},{"id":"889xhs","type":"paywall","dateCreated":1552956727598,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","pageviewCount":2,"headline":"1 month free trial","buttonText":"Subscribe","buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter"},{"id":"c5jxpx","type":"paywall","dateCreated":1552956277763,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","pageviewCount":4,"buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter","headline":"This is your last free article.","message":"Try our news free for a month. No credit card needed, cancel anytime.","buttonText":"Sign up"},{"id":"k3glxy","type":"paywall","dateCreated":1552956145989,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","pageviewCount":3,"headline":"You\u2019ve been selected for a free trial subscription.","buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter","message":"Read all you want for a month, no credit card required.","buttonText":"See offer"},{"id":"l5yn8i","type":"paywall","dateCreated":1552955895627,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"Freetrial","value":"freetrial"}],"layout":"bar","pageviewCount":2,"headline":"Free trial subscription. No strings attached.","message":"Sign up for a free month, no credit card needed.","buttonText":"Sign up","buttonUrl":"https:\/\/secure.seattletimes.com\/accountcenter\/subscribe\/freetrialsubscription?subsource=meter"},{"id":"aaph9p","type":"generic","dateCreated":1552954836969,"enabled":1,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":432000,"userTypes":[{"value":"free-trial-user","label":"Free Trial User"}],"pageTypes":[{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"layout":"bar","name":"free-trial-story-mobile","headline":"Get more of a good thing.","buttonText":"Continue your subscription beyond your free trial.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=free-trial"},{"id":"lnebab","type":"generic","dateCreated":1552954681258,"enabled":1,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":432000,"userTypes":[{"value":"free-trial-user","label":"Free Trial User"}],"pageTypes":[{"value":"story","label":"Story"}],"deviceTypes":[{"value":"desktop","label":"Desktop"}],"layout":"bar","name":"free-trial-story-desktop","headline":"Get more of a good thing.","message":"Continue your subscription beyond your free trial.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=free-trial","buttonText":"Learn more"},{"id":"602xps","type":"generic","dateCreated":1552954586993,"enabled":1,"priority":4,"slot":"overlay","closeFrequency":604800,"frequency":259200,"userTypes":[{"value":"free-trial-user","label":"Free Trial User"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"desktop","label":"Desktop"}],"name":"free-trial-homepage-section-desktop","layout":"bar","headline":"Don\u2019t let your free subscription come to an end.","message":"Continued unlimited Seattle Times access by subscribing now.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=free-trial","buttonText":"Subscribe"},{"id":"o5q7zw","type":"generic","dateCreated":1552954379676,"enabled":1,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"free-trial-user","label":"Free Trial User"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=free-trial","name":"free-trial-homepage-section-mobile","layout":"bar","headline":"Don\u2019t let your free subscription come to an end.","buttonText":"Continued unlimited Seattle Times access by subscribing now."},{"id":"e9oap1","type":"generic","dateCreated":1542763411965,"enabled":0,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"pageTypes":[{"value":"story","label":"Story"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"layout":"bar","name":"EdLabSurveyNov18mobile","sections":[{"label":"Education","value":"education"},{"label":"Education Lab","value":"education-lab"}],"headline":"Help us shape our education content by answering a few questions.","buttonUrl":"https:\/\/www.research.net\/r\/K5J8P5X","buttonText":"Start now"},{"id":"ygb38p","type":"generic","dateCreated":1542763070736,"enabled":0,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"print-replica","label":"Print Replica"},{"value":"subscriber","label":"Subscriber"}],"pageTypes":[{"value":"story","label":"Story"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"name":"EdLabSurveyNov18","layout":"bar","sections":[{"label":"Education","value":"education"},{"label":"Education Lab","value":"education-lab"}],"headline":"Share your thoughts on Education Lab","message":"Help us shape our education content by answering a few questions about our coverage.","buttonText":"Start now","buttonUrl":"https:\/\/www.research.net\/r\/K5J8P5X"},{"id":"82pc1e","type":"paywall","dateCreated":1542227121741,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"paywall2","value":"paywall2"}],"layout":"bar","pageviewCount":1,"headline":"There\u2019s an easier way of getting around the paywall.","message":"Become a subscriber \u2013 just $1 \u2013 for unlimited access to our news.","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"d41njx","type":"paywall","dateCreated":1542227070616,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"paywall2","value":"paywall2"}],"layout":"bar","pageviewCount":2,"headline":"For a dollar to start, the paywall comes down.","message":"Try a subscription and get unlimited access to seattletimes.com.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Subscribe now"},{"id":"kob2zz","type":"generic","dateCreated":1541203510246,"enabled":0,"priority":4,"slot":"overlay","frequency":86400,"closeFrequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"layout":"bar","name":"Endorsements2018mobile","headline":"Still haven\u2019t cast your ballot?","message":"","buttonText":"Read recommendations from The Seattle Times Editorial Board.","buttonUrl":"https:\/\/www.seattletimes.com\/opinion\/editorials\/seattle-times-editorial-board-endorsements-for-nov-6-general-election\/"},{"id":"pgnmve","type":"generic","dateCreated":1540227038100,"enabled":0,"priority":4,"slot":"overlay","frequency":86400,"closeFrequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"sections":[{"label":"Agriculture","value":"agriculture"},{"label":"Boeing & Aerospace","value":"boeing-aerospace"},{"label":"Other Sports","value":"other-sports"},{"label":"Auto Racing","value":"auto-racing"},{"label":"Business","value":"business"},{"label":"Books","value":"books"},{"label":"Amazon","value":"amazon"},{"label":"Classical Music","value":"classical-music"},{"label":"College Basketball","value":"college-basketball"},{"label":"College Football","value":"college-football"},{"label":"College Sports","value":"college"},{"label":"Comics","value":"comics"},{"label":"Cougar Football","value":"wsu-cougar-football"},{"label":"Cougar Basketball","value":"wsu-cougar-basketball"},{"label":"Cougars","value":"wsu-cougars"},{"label":"Crime","value":"crime"},{"label":"Dance","value":"dance"},{"label":"Data","value":"data"},{"label":"Eastside","value":"eastside"},{"label":"Economy","value":"economy"},{"label":"Editorials","value":"editorials"},{"label":"Education","value":"education"},{"label":"Education Lab","value":"education-lab"},{"label":"Entertainment","value":"entertainment"},{"label":"Environment","value":"environment"},{"label":"Events","value":"events"},{"label":"Fashion","value":"fashion"},{"label":"Fitness","value":"fitness"},{"label":"Food & Drink","value":"food-drink"},{"label":"Games & Puzzles","value":"games"},{"label":"Garden","value":"garden"},{"label":"Golf","value":"golf"},{"label":"Gonzaga","value":"gonzaga-bulldogs"},{"label":"Health","value":"health"},{"label":"High School Sports","value":"high-school"},{"label":"Hockey","value":"hockey"},{"label":"Home & Decor","value":"home-decor"},{"label":"Homes & Real Estate","value":"homes-real-estate"},{"label":"Horse Racing","value":"horse-racing"},{"label":"Huskies","value":"uw-huskies"},{"label":"Husky Basketball","value":"uw-husky-basketball"},{"label":"Husky Football","value":"uw-husky-football"},{"label":"International Trade","value":"international-trade"},{"label":"Letters to the Editor","value":"letters-to-the-editor"},{"label":"Life","value":"life"},{"label":"Lifestyle","value":"lifestyle"},{"label":"Local Business","value":"local-business"},{"label":"Local News","value":"seattle-news"},{"label":"Local Politics","value":"politics"},{"label":"Marijuana","value":"marijuana"},{"label":"Mariners","value":"mariners"},{"label":"Markets","value":"markets"},{"label":"Microsoft","value":"microsoft"},{"label":"MLB","value":"mlb"},{"label":"Movies","value":"movies"},{"label":"Nation","value":"nation"},{"label":"Music","value":"music"},{"label":"Nation & World","value":"nation-world"},{"label":"Nation & World Politics","value":"nation-politics"},{"label":"NBA","value":"nba"},{"label":"NCAA Tournament","value":"ncaa-tournament"},{"label":"News","value":"news"},{"label":"NFL","value":"nfl"},{"label":"Nightlife","value":"nightlife"},{"label":"Northwest","value":"northwest"},{"label":"Northwest Voices","value":"northwest-voices"},{"label":"Obituaries","value":"obituaries"},{"label":"Oddities","value":"oddities"},{"label":"Olympics","value":"olympics"},{"label":"Opinion","value":"opinion"},{"label":"Outdoors","value":"outdoors"},{"label":"Pac-12","value":"pac-12"},{"label":"Pacific NW Magazine","value":"pacific-nw-magazine"},{"label":"Pets","value":"pets"},{"label":"Photo & Video","value":"photo-video"},{"label":"Photography","value":"photography"},{"label":"Project Homeless","value":"homeless"},{"label":"Puget Sound","value":"puget-sound"},{"label":"Quail Run","value":"quail-run"},{"label":"Real Estate","value":"real-estate"},{"label":"Reign","value":"reign"},{"label":"Retail","value":"retail"},{"label":"Science","value":"science"},{"label":"Seahawks","value":"seahawks"},{"label":"Seattle University","value":"seattle-university"},{"label":"Shopping","value":"shop-northwest"},{"label":"Snow Sports","value":"snow-sports"},{"label":"Soccer","value":"soccer"},{"label":"Sounders","value":"sounders"},{"label":"Special Reports","value":"special-reports"},{"label":"Special Sections","value":"special-sections"},{"label":"Sponsored","value":"sponsored"},{"label":"Sports","value":"sports"},{"label":"Starbucks","value":"starbucks"},{"label":"Storm","value":"storm"},{"label":"Technology","value":"technology"},{"label":"Television","value":"tv"},{"label":"Theater","value":"theater"},{"label":"Times Watchdog","value":"times-watchdog"},{"label":"Traffic Lab","value":"transportation"},{"label":"Travel","value":"travel"},{"label":"Video","value":"video"},{"label":"Video Games","value":"video-games"},{"label":"Visual Arts","value":"visual-arts"},{"label":"Weather","value":"weather"},{"label":"Wellness","value":"wellness"},{"label":"WNBA","value":"wnba"},{"label":"World","value":"world"},{"label":"World Cup","value":"world-cup"}],"layout":"bar","name":"EndorsementsOct18","headline":"Still haven\u2019t cast your ballot?","message":"The Seattle Times editorial board interviewed over 130 candidates.","buttonText":"Read their opinions.","buttonUrl":"https:\/\/www.seattletimes.com\/opinion\/editorials\/seattle-times-editorial-board-endorsements-for-nov-6-general-election\/"},{"id":"3s7h3i","type":"paywall","dateCreated":1538501663329,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"layout":"bar","paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"pageviewCount":3,"headline":"For a dollar to start, the paywall comes down.","message":"Try a subscription and get unlimited access to seattletimes.com.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Subscribe now"},{"id":"qpe7bn","type":"paywall","dateCreated":1538501399997,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"layout":"bar","pageviewCount":2,"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","headline":"There\u2019s an easier way of getting around the paywall.","buttonText":"Subscribe now","message":"Become a subscriber \u2013 just $1 \u2013 for unlimited access to our news."},{"id":"6geoqr","type":"paywall","dateCreated":1538441184751,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"pageviewCount":4,"paywallConfigs":[{"label":"Politics","value":"politics"}],"layout":"bar","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","message":"Follow the stories as they develop, subscribe now for just $1 to start.","headline":"This is your last free article.","buttonText":"Subscribe now"},{"id":"1jz5fg","type":"paywall","dateCreated":1538441032909,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"Politics","value":"politics"}],"layout":"bar","pageviewCount":2,"headline":"Stay informed on the issues.","message":"Subscribe and enjoy unlimited journalism for just $1 to start.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Learn more"},{"id":"tve5bb","type":"paywall","dateCreated":1538440906020,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"pageviewCount":4,"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","layout":"bar","paywallConfigs":[{"label":"Politics","value":"politics"}],"headline":"Last free article!","buttonText":"Subscribe now"},{"id":"ulm4cq","type":"paywall","dateCreated":1538440848086,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Politics","value":"politics"}],"layout":"bar","pageviewCount":2,"headline":"Stay informed","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"osqb2g","type":"paywall","dateCreated":1538439079104,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Seahawks","value":"seahawks"}],"layout":"bar","pageviewCount":4,"headline":"Last free article!","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"dakmdn","type":"paywall","dateCreated":1538439024952,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Seahawks","value":"seahawks"}],"layout":"bar","pageviewCount":2,"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","headline":"Follow the Hawks","buttonText":"Subscribe now"},{"id":"znbh34","type":"paywall","dateCreated":1538438839647,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"pageviewCount":4,"paywallConfigs":[{"label":"Seahawks","value":"seahawks"}],"layout":"bar","headline":"You\u2019ve reached your limit of free articles.","message":"For just $1 to start, subscribe now to enjoy more Seahawks content.","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"fuo9t1","type":"paywall","dateCreated":1538438711404,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"Seahawks","value":"seahawks"}],"layout":"bar","pageviewCount":2,"headline":"53-men on the field. One place with all the insight.","message":"Subscribe for just $1 to start and enjoy Bob Condotta\u2019s Hawks coverage.","buttonText":"Learn more","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"jiotri","type":"paywall","dateCreated":1538433313570,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Huskies","value":"huskies"}],"layout":"bar","pageviewCount":4,"headline":"Last free article!","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"e0qwxq","type":"paywall","dateCreated":1538433187364,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"Huskies","value":"huskies"}],"layout":"bar","pageviewCount":2,"buttonText":"Subscribe now","headline":"Follow the Dawgs","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"yvxg9l","type":"paywall","dateCreated":1538433092935,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"pageviewCount":4,"paywallConfigs":[{"label":"Huskies","value":"huskies"}],"layout":"bar","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Subscribe now","message":"Keep the Huskies stories coming by subscribing now for just $1 to start.","headline":"This is your last free article."},{"id":"w85tj8","type":"paywall","dateCreated":1538432949871,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"layout":"bar","paywallConfigs":[{"label":"Huskies","value":"huskies"}],"pageviewCount":2,"headline":"Recruiting, national rankings and analysis.","message":"Subscribe and keep up on our Huskies coverage for just $1.","buttonText":"Learn more","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"4m9wg8","type":"newsletter-signup","dateCreated":1535154422497,"enabled":1,"priority":4,"slot":"overlay","frequency":259200,"closeFrequency":604800,"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"pageTypes":[{"value":"story","label":"Story"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"newsletter":10349060,"layout":"bar","sections":[{"label":"Books","value":"books"},{"label":"Classical Music","value":"classical-music"},{"label":"Dance","value":"dance"},{"label":"Entertainment","value":"entertainment"},{"label":"Visual Arts","value":"visual-arts"},{"label":"Video Games","value":"video-games"},{"label":"Travel","value":"travel"},{"label":"Food & Drink","value":"food-drink"},{"label":"Fitness","value":"fitness"},{"label":"Lifestyle","value":"lifestyle"},{"label":"Life","value":"life"},{"label":"Nightlife","value":"nightlife"},{"label":"Home & Decor","value":"home-decor"},{"label":"Movies","value":"movies"},{"label":"Music","value":"music"},{"label":"Outdoors","value":"outdoors"},{"label":"Marijuana","value":"marijuana"},{"label":"Theater","value":"theater"},{"label":"Television","value":"tv"}],"message":"Keep up on the food scene. Sign up for our free [title] newsletter."},{"id":"1b7nn9","type":"newsletter-signup","dateCreated":1534546172642,"enabled":1,"priority":3,"newsletter":10349079,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"registered","label":"Registered"},{"value":"anonymous","label":"Anonymous"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"layout":"bar","message":"Sign up for the [title] newsletter for Ed Lab features as well as education-related content and news.","sections":[{"label":"Education","value":"education"},{"label":"Education Lab","value":"education-lab"}]},{"id":"ww4vcr","type":"newsletter-signup","dateCreated":1534545585601,"enabled":1,"priority":3,"slot":"overlay","frequency":259200,"closeFrequency":604800,"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"layout":"bar","message":"Sign up for the [title] newsletter for a quick recap of the day's top stories and need-to-know news.","newsletter":10728545,"sections":[{"label":"Amazon","value":"amazon"},{"label":"Boeing & Aerospace","value":"boeing-aerospace"},{"label":"Business","value":"business"},{"label":"Careers","value":"careers"},{"label":"Economy","value":"economy"},{"label":"International Trade","value":"international-trade"},{"label":"Local Business","value":"local-business"},{"label":"Microsoft","value":"microsoft"},{"label":"Markets","value":"markets"},{"label":"Technology","value":"technology"}],"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}]},{"id":"3shnwq","type":"newsletter-signup","dateCreated":1534452981298,"enabled":1,"priority":3,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"registered","label":"Registered"},{"value":"anonymous","label":"Anonymous"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"newsletter":10349065,"layout":"bar","message":"Sign up for the [title] newsletter, all things sports, every weekday.","sections":[{"label":"Sports","value":"sports"},{"label":"Auto Racing","value":"auto-racing"},{"label":"College Basketball","value":"college-basketball"},{"label":"College Football","value":"college-football"},{"label":"College Sports","value":"college"},{"label":"Cougar Basketball","value":"wsu-cougar-basketball"},{"label":"Cougar Football","value":"wsu-cougar-football"},{"label":"Cougars","value":"wsu-cougars"},{"label":"Golf","value":"golf"},{"label":"Gonzaga","value":"gonzaga-bulldogs"},{"label":"High School Sports","value":"high-school"},{"label":"Hockey","value":"hockey"},{"label":"World Cup","value":"world-cup"},{"label":"WNBA","value":"wnba"},{"label":"Storm","value":"storm"},{"label":"Sounders","value":"sounders"},{"label":"Soccer","value":"soccer"},{"label":"Snow Sports","value":"snow-sports"},{"label":"Seattle University","value":"seattle-university"},{"label":"Seahawks","value":"seahawks"},{"label":"Pac-12","value":"pac-12"},{"label":"Other Sports","value":"other-sports"},{"label":"MLB","value":"mlb"},{"label":"Mariners","value":"mariners"},{"label":"Olympics","value":"olympics"},{"label":"NBA","value":"nba"},{"label":"NCAA Tournament","value":"ncaa-tournament"},{"label":"NFL","value":"nfl"},{"label":"Reign","value":"reign"},{"label":"Husky Football","value":"uw-husky-football"},{"label":"Huskies","value":"uw-huskies"},{"label":"Husky Basketball","value":"uw-husky-basketball"},{"label":"Horse Racing","value":"horse-racing"},{"label":"Outdoors","value":"outdoors"}]},{"id":"3rdsjy","type":"newsletter-signup","dateCreated":1534202011972,"enabled":1,"priority":3,"slot":"overlay","frequency":259200,"closeFrequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"},{"value":"page","label":"Page"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"layout":"bar","newsletter":10349021,"message":"Sign up for the [title] newsletter, a quick overview of today's top stories and need-to-know news.","sections":[{"label":"Crime","value":"crime"},{"label":"Data","value":"data"},{"label":"Local News","value":"seattle-news"},{"label":"Local Politics","value":"politics"},{"label":"Environment","value":"environment"},{"label":"Weather","value":"weather"},{"label":"Northwest","value":"northwest"},{"label":"Traffic Lab","value":"transportation"},{"label":"Project Homeless","value":"homeless"},{"label":"Eastside","value":"eastside"},{"label":"Health","value":"health"},{"label":"Obituaries","value":"obituaries"},{"label":"Times Watchdog","value":"times-watchdog"},{"label":"Homes & Real Estate","value":"homes-real-estate"},{"label":"Real Estate","value":"real-estate"},{"label":"Comics","value":"comics"},{"label":"Games & Puzzles","value":"games"},{"label":"Marijuana","value":"marijuana"},{"label":"Nation","value":"nation"},{"label":"Nation & World","value":"nation-world"},{"label":"Nation & World Politics","value":"nation-politics"},{"label":"World","value":"world"},{"label":"Puget Sound","value":"puget-sound"},{"label":"News","value":"news"},{"label":"Editorials","value":"editorials"},{"label":"Letters to the Editor","value":"letters-to-the-editor"},{"label":"Opinion","value":"opinion"},{"label":"Pacific NW Magazine","value":"pacific-nw-magazine"},{"label":"Northwest Voices","value":"northwest-voices"}],"pageIds":[10281555,10275124,10230502,10281558,10260050,10230487,10275133,10230508,10260044,10599705]},{"id":"g4pxrw","type":"paywall","dateCreated":1532991866025,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"layout":"bar","pageviewCount":2,"headline":"Start supporting independent journalism today.","message":"Get unlimited digital access for just $1.","buttonText":"Learn more","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","hideFooter":0},{"id":"b6uo1v","type":"paywall","dateCreated":1532991804346,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"layout":"bar","pageviewCount":3,"headline":"This is your last free article.","message":"Free press takes time and money to produce. Support us today.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Subscribe now","hideFooter":0},{"id":"j3y8m2","type":"paywall","dateCreated":1532991623248,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"layout":"bar","pageviewCount":2,"headline":"We need your support!","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"75rmeb","type":"paywall","dateCreated":1532991545081,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"layout":"bar","paywallConfigs":[{"label":"mmtest","value":"mmtest"}],"pageviewCount":3,"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","headline":"Last free article","buttonText":"Subscribe now"},{"id":"481vgj","type":"paywall","dateCreated":1530132812773,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"bar","pageviewCount":3,"headline":"Sale! Save over 90%!","buttonText":"Subscribe","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"zqckxe","type":"paywall","dateCreated":1529304159902,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"bar","pageviewCount":4,"headline":"Last article. Save 90%!","buttonText":"Subscribe","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","hideFooter":1},{"id":"nc1zpf","type":"paywall","dateCreated":1529303998668,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"bar","pageviewCount":2,"buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","headline":"Sale! Save 90%!","buttonText":"Subscribe now","hideFooter":1},{"id":"wxlgrq","type":"generic","dateCreated":1526595620171,"enabled":0,"priority":4,"slot":"overlay","frequency":86400,"deviceTypes":[{"value":"mobile","label":"Mobile"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"name":"ReaderFeedbackMobileMarch2019","layout":"bar","headline":"Give us your feedback.","buttonText":"Take a brief survey","buttonUrl":"https:\/\/www.research.net\/r\/FRSNQ79","closeFrequency":604800,"message":""},{"id":"a4l4ey","type":"generic","dateCreated":1526595233752,"enabled":0,"priority":4,"slot":"overlay","frequency":86400,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"subscriber","label":"Subscriber"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"}],"pageTypes":[{"value":"homepage","label":"Homepage"},{"value":"subsection_front","label":"Subsection Front"},{"value":"section_front","label":"Section Front"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"name":"ReaderFeedbackDesktopMarch2019","layout":"bar","headline":"Give us your feedback.","message":"Help us improve The Seattle Times by answering a few short questions.","buttonText":"Take a brief survey","buttonUrl":"https:\/\/www.research.net\/r\/FRSNQ79","closeFrequency":604800},{"id":"hgd791","type":"newsletter-signup","dateCreated":1525968760872,"enabled":1,"priority":3,"slot":"atf","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"desktop","label":"Desktop"}],"newsletter":10728545,"sections":[{"label":"Nation & World","value":"nation-world"}]},{"id":"5b0ohv","type":"newsletter-signup","dateCreated":1525968649832,"enabled":1,"priority":3,"slot":"atf","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"}],"deviceTypes":[{"value":"desktop","label":"Desktop"}],"newsletter":10349065,"sections":[{"label":"Sports","value":"sports"}]},{"id":"b3kuim","type":"newsletter-signup","dateCreated":1525968144208,"enabled":1,"priority":3,"slot":"atf","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"subscriber","label":"Subscriber"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"}],"deviceTypes":[{"value":"desktop","label":"Desktop"}],"newsletter":10349021,"sections":[{"label":"Home","value":"home"}]},{"id":"pi9sc7","type":"newsletter-signup","dateCreated":1525720892798,"enabled":1,"priority":3,"slot":"overlay","frequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349060,"layout":"splash","sections":[{"label":"Food & Drink","value":"food-drink"}],"message":"Sign up for the [title] newsletter and eat, drink, and be happy with this custom-curated newsletter full of epicurean delights.","closeFrequency":1209600},{"id":"7nsynx","type":"newsletter-signup","dateCreated":1525720828438,"enabled":1,"priority":3,"slot":"overlay","frequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349079,"layout":"splash","sections":[{"label":"Education","value":"education"}],"message":"Sign up for the [title] newsletter for Ed Lab features as well as education-related content and news.","closeFrequency":1209600},{"id":"5grj1d","type":"newsletter-signup","dateCreated":1525720745435,"enabled":1,"priority":3,"slot":"overlay","frequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349021,"layout":"splash","message":"Sign up for the [title] newsletter, a quick overview of today's top stories and need-to-know news.","sections":[{"label":"Business","value":"business"},{"label":"Crime","value":"crime"},{"label":"Local Business","value":"local-business"},{"label":"Local Politics","value":"politics"},{"label":"Microsoft","value":"microsoft"}],"closeFrequency":604800},{"id":"e0ql4c","type":"newsletter-signup","dateCreated":1525720662994,"enabled":1,"priority":3,"slot":"overlay","frequency":604800,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349065,"layout":"splash","message":"Sign up for the [title] newsletter, all things sports, every weekday.","sections":[{"label":"Auto Racing","value":"auto-racing"},{"label":"College Basketball","value":"college-basketball"},{"label":"College Sports","value":"college"},{"label":"Cougars","value":"wsu-cougars"},{"label":"Seattle University","value":"seattle-university"},{"label":"Sounders","value":"sounders"},{"label":"Sports","value":"sports"}],"closeFrequency":604800},{"id":"613j17","type":"newsletter-signup","dateCreated":1525715776700,"enabled":1,"priority":2,"slot":"overlay","frequency":259200,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349060,"layout":"splash","sections":[{"label":"Life","value":"life"},{"label":"Marijuana","value":"marijuana"},{"label":"Movies","value":"movies"},{"label":"Music","value":"music"},{"label":"Nightlife","value":"nightlife"}],"message":"Sign up for the [title] newsletter and eat, drink, and be happy with this custom-curated newsletter full of epicurean delights.","closeFrequency":604800},{"id":"oq9zar","type":"newsletter-signup","dateCreated":1525715654553,"enabled":1,"priority":2,"slot":"overlay","frequency":259200,"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10728545,"layout":"splash","message":"Sign up for the [title] newsletter for a quick recap of the day's top stories and need-to-know news.","sections":[{"label":"Education","value":"education"},{"label":"Environment","value":"environment"},{"label":"Markets","value":"markets"},{"label":"Northwest","value":"northwest"},{"label":"Northwest Voices","value":"northwest-voices"},{"label":"Science","value":"science"}],"closeFrequency":604800},{"id":"xwp6hb","type":"newsletter-signup","dateCreated":1525715538006,"enabled":1,"priority":2,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"frequency":259200,"newsletter":10349079,"layout":"splash","sections":[{"label":"Education Lab","value":"education-lab"}],"message":"Sign up for the [title] newsletter for Ed Lab features as well as education-related content and news.","closeFrequency":604800},{"id":"i1xzlb","type":"newsletter-signup","dateCreated":1525715372910,"enabled":1,"priority":2,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349065,"layout":"splash","message":"Sign up for the [title] newsletter, all things sports, every weekday.","sections":[{"label":"College Football","value":"college-football"},{"label":"Cougar Basketball","value":"wsu-cougar-basketball"},{"label":"Cougar Football","value":"wsu-cougar-football"},{"label":"Gonzaga","value":"gonzaga-bulldogs"},{"label":"Golf","value":"golf"},{"label":"Hockey","value":"hockey"},{"label":"High School Sports","value":"high-school"},{"label":"Husky Basketball","value":"uw-husky-basketball"},{"label":"Husky Football","value":"uw-husky-football"},{"label":"Mariners","value":"mariners"},{"label":"MLB","value":"mlb"},{"label":"NBA","value":"nba"},{"label":"NCAA Tournament","value":"ncaa-tournament"},{"label":"NFL","value":"nfl"},{"label":"Olympics","value":"olympics"},{"label":"Other Sports","value":"other-sports"},{"label":"Pac-12","value":"pac-12"},{"label":"Reign","value":"reign"},{"label":"Snow Sports","value":"snow-sports"},{"label":"Soccer","value":"soccer"},{"label":"Storm","value":"storm"},{"label":"WNBA","value":"wnba"},{"label":"World Cup","value":"world-cup"},{"label":"Seahawks","value":"seahawks"},{"label":"Huskies","value":"uw-huskies"}],"frequency":259200,"closeFrequency":604800},{"id":"ta72uz","type":"newsletter-signup","dateCreated":1525715279007,"enabled":1,"priority":2,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"desktop","label":"Desktop"},{"value":"tablet","label":"Tablet"}],"newsletter":10812646,"layout":"splash","message":"Sign up for [title]. Designed for those who want to know what happens next.","sections":[{"label":"Books","value":"books"},{"label":"Fashion","value":"fashion"},{"label":"Fitness","value":"fitness"},{"label":"Garden","value":"garden"}],"frequency":259200,"closeFrequency":604800},{"id":"38mwpg","type":"newsletter-signup","dateCreated":1525715145626,"enabled":1,"priority":2,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349041,"layout":"splash","message":"Sign up for [title]. When a story breaks, you'll be among the first to know.","sections":[{"label":"Amazon","value":"amazon"},{"label":"Boeing & Aerospace","value":"boeing-aerospace"},{"label":"Eastside","value":"eastside"},{"label":"Traffic Lab","value":"transportation"},{"label":"Weather","value":"weather"}],"frequency":259200,"closeFrequency":604800},{"id":"v9ikqn","type":"newsletter-signup","dateCreated":1525715015890,"enabled":1,"priority":2,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"},{"value":"story","label":"Story"},{"value":"page","label":"Page"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349021,"layout":"splash","message":"Sign up for the [title] newsletter, a quick overview of today's top stories and need-to-know news.","frequency":259200,"sections":[{"label":"Agriculture","value":"agriculture"},{"label":"Data","value":"data"},{"label":"Economy","value":"economy"},{"label":"Editorials","value":"editorials"},{"label":"Huskies","value":"uw-huskies"},{"label":"Local News","value":"seattle-news"},{"label":"Nation","value":"nation"},{"label":"Nation & World","value":"nation-world"},{"label":"Nation & World Politics","value":"nation-politics"},{"label":"Project Homeless","value":"homeless"},{"label":"Puget Sound","value":"puget-sound"},{"label":"Real Estate","value":"real-estate"},{"label":"Seattle University","value":"seattle-university"},{"label":"Special Reports","value":"special-reports"},{"label":"Special Sections","value":"special-sections"},{"label":"Starbucks","value":"starbucks"},{"label":"Technology","value":"technology"},{"label":"Times Watchdog","value":"times-watchdog"},{"label":"World","value":"world"},{"label":"Comics","value":"comics"},{"label":"Games & Puzzles","value":"games"}],"closeFrequency":604800,"pageIds":[10281555,10275124,10230502,10281558,10260050,10230487,10275133,10230508,10260044,10599705]},{"id":"wnuh01","type":"newsletter-signup","dateCreated":1525713022668,"enabled":1,"priority":3,"slot":"inset","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349060,"sections":[{"label":"Entertainment","value":"entertainment"},{"label":"Food & Drink","value":"food-drink"},{"label":"Home & Decor","value":"home-decor"},{"label":"Life","value":"life"},{"label":"Movies","value":"movies"},{"label":"Music","value":"music"},{"label":"Nightlife","value":"nightlife"},{"label":"Television","value":"tv"},{"label":"Theater","value":"theater"},{"label":"Travel","value":"travel"},{"label":"Wellness","value":"wellness"},{"label":"Pacific NW Magazine","value":"pacific-nw-magazine"}]},{"id":"kjyo9l","type":"newsletter-signup","dateCreated":1525712953873,"enabled":1,"priority":3,"slot":"inset","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349079,"sections":[{"label":"Education","value":"education"},{"label":"Education Lab","value":"education-lab"}]},{"id":"srdryd","type":"newsletter-signup","dateCreated":1525712790950,"enabled":1,"priority":3,"slot":"inset","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"print-replica","label":"Print Replica"},{"value":"registered","label":"Registered"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349065,"sections":[{"label":"Auto Racing","value":"auto-racing"},{"label":"College Basketball","value":"college-basketball"},{"label":"College Football","value":"college-football"},{"label":"College Sports","value":"college"},{"label":"Cougar Basketball","value":"wsu-cougar-basketball"},{"label":"Cougar Football","value":"wsu-cougar-football"},{"label":"Cougars","value":"wsu-cougars"},{"label":"Golf","value":"golf"},{"label":"Gonzaga","value":"gonzaga-bulldogs"},{"label":"High School Sports","value":"high-school"},{"label":"Hockey","value":"hockey"},{"label":"Horse Racing","value":"horse-racing"},{"label":"Huskies","value":"uw-huskies"},{"label":"Husky Basketball","value":"uw-husky-basketball"},{"label":"Husky Football","value":"uw-husky-football"},{"label":"Mariners","value":"mariners"},{"label":"MLB","value":"mlb"},{"label":"NBA","value":"nba"},{"label":"NCAA Tournament","value":"ncaa-tournament"},{"label":"NFL","value":"nfl"},{"label":"Olympics","value":"olympics"},{"label":"Other Sports","value":"other-sports"},{"label":"Pac-12","value":"pac-12"},{"label":"Reign","value":"reign"},{"label":"Seahawks","value":"seahawks"},{"label":"Seattle University","value":"seattle-university"},{"label":"Snow Sports","value":"snow-sports"},{"label":"Soccer","value":"soccer"},{"label":"Sounders","value":"sounders"},{"label":"Sports","value":"sports"},{"label":"Storm","value":"storm"},{"label":"WNBA","value":"wnba"},{"label":"World Cup","value":"world-cup"}]},{"id":"drr5td","type":"newsletter-signup","dateCreated":1525712647039,"enabled":1,"priority":3,"slot":"inset","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10728545,"sections":[{"label":"Amazon","value":"amazon"},{"label":"Boeing & Aerospace","value":"boeing-aerospace"},{"label":"Business","value":"business"},{"label":"Crime","value":"crime"},{"label":"Environment","value":"environment"},{"label":"Homes & Real Estate","value":"homes-real-estate"},{"label":"Local Business","value":"local-business"},{"label":"Local Politics","value":"politics"},{"label":"Nation","value":"nation"},{"label":"Nation & World","value":"nation-world"},{"label":"Nation & World Politics","value":"nation-politics"},{"label":"Puget Sound","value":"puget-sound"},{"label":"Real Estate","value":"real-estate"},{"label":"Science","value":"science"},{"label":"Special Reports","value":"special-reports"},{"label":"Special Sections","value":"special-sections"},{"label":"Starbucks","value":"starbucks"},{"label":"Technology","value":"technology"},{"label":"World","value":"world"}]},{"id":"20r75r","type":"newsletter-signup","dateCreated":1525712452818,"enabled":1,"priority":3,"slot":"inset","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"},{"value":"print-replica","label":"Print Replica"},{"value":"shared-subscriber","label":"Shared Subscriber"},{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"newsletter":10349021,"sections":[{"label":"Agriculture","value":"agriculture"},{"label":"Data","value":"data"},{"label":"Eastside","value":"eastside"},{"label":"Economy","value":"economy"},{"label":"Editorials","value":"editorials"},{"label":"Health","value":"health"},{"label":"International Trade","value":"international-trade"},{"label":"Letters to the Editor","value":"letters-to-the-editor"},{"label":"Local News","value":"seattle-news"},{"label":"Markets","value":"markets"},{"label":"Microsoft","value":"microsoft"},{"label":"News","value":"news"},{"label":"Northwest","value":"northwest"},{"label":"Northwest Voices","value":"northwest-voices"},{"label":"Opinion","value":"opinion"},{"label":"Project Homeless","value":"homeless"},{"label":"Times Watchdog","value":"times-watchdog"},{"label":"Traffic Lab","value":"transportation"},{"label":"Weather","value":"weather"}]},{"id":"q7s7cc","type":"paywall","dateCreated":1525676475056,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"layout":"bar","pageviewCount":4,"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"headline":"Last free article!","buttonText":"Subscribe","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"vmag46","type":"paywall","dateCreated":1525676408880,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"layout":"bar","pageviewCount":2,"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"headline":"We need your support!","buttonText":"Subscribe","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"7g7g98","type":"paywall","dateCreated":1525676312920,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"pageviewCount":4,"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"bar","headline":"This is your last free article.","message":"Free press takes time and money to produce. Support us today.","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"o3nmdv","type":"paywall","dateCreated":1525676214214,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"layout":"bar","pageviewCount":2,"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"headline":"Start supporting independent journalism today.","message":"Get unlimited digital access for just $1.","buttonText":"Learn more","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"eb9x99","type":"generic","dateCreated":1522791778702,"enabled":0,"priority":5,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"pageTypes":[{"value":"section_front","label":"Section Front"},{"value":"subsection_front","label":"Subsection Front"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"name":"saleSectionFrontMobile","layout":"bar","headline":"Don't miss out!","buttonText":"Save over 90% on digital access and support the local free press.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=promo","frequency":86400,"closeFrequency":""},{"id":"8bsbsn","type":"generic","dateCreated":1522791238254,"enabled":0,"priority":5,"slot":"overlay","pageTypes":[{"value":"homepage","label":"Homepage"}],"userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"}],"layout":"bar","name":"saleHomepageMobile","headline":"Save during our One Day Sale!","buttonText":"Get digital access for 90% off. Cancel anytime.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=promo","frequency":86400,"closeFrequency":""},{"id":"nmey9l","type":"paywall","dateCreated":1510037731186,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"layout":"bar","paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"pageviewCount":4,"headline":"This is your last free article.","message":"Save over 90% on a subscription. This sale ends soon.","buttonText":"Subscribe now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"gyjlpj","type":"paywall","dateCreated":1510037662307,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"anonymous","label":"Anonymous"},{"value":"registered","label":"Registered"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"pageviewCount":3,"layout":"bar","paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"headline":"Support local news during our One Day Sale.","message":"Save over 90% on a digital subscription.","buttonText":"Try it now","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter"},{"id":"6ve0oh","type":"paywall","dateCreated":1510037513769,"enabled":0,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"registered","label":"Registered"},{"value":"anonymous","label":"Anonymous"}],"deviceTypes":[{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"bar","pageviewCount":2,"headline":"Save during our One Day Sale!","message":"Get over 90% off unlimited digital access. Cancel anytime.","buttonUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=meter","buttonText":"Subscribe now","hideFooter":0},{"id":"qkvtj8","type":"paywall","dateCreated":1508998721526,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"print-replica","label":"Print Replica"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"corner","pageviewCount":2,"message":"For unlimited seattletimes.com access, please call customer service at 1.800.542.0820 to upgrade your subscription."},{"id":"7tudyd","type":"paywall","dateCreated":1508998698353,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"print-replica","label":"Print Replica"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"pageviewCount":4,"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"corner","message":"For unlimited seattletimes.com access, please call customer service at 1.800.542.0820 to upgrade your subscription."},{"id":"nvr4c8","type":"paywall","dateCreated":1508998666696,"enabled":1,"pageTypes":[{"value":"story","label":"Story"}],"priority":4,"slot":"overlay","userTypes":[{"value":"print-replica","label":"Print Replica"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"paywallConfigs":[{"label":"stdotcom","value":"stdotcom"}],"layout":"corner","pageviewCount":3,"message":"For unlimited seattletimes.com access, please call customer service at 1.800.542.0820 to upgrade your subscription."},{"id":"v0fma7","type":"ad-block","dateCreated":1508287536514,"enabled":1,"priority":5,"slot":"overlay","pageTypes":[{"value":"story","label":"Story"}],"abTesting":0,"headline":"We noticed you're blocking ads.","message":"Great journalism depends on ad revenue. To keep reading, please turn off your ad blocker, create an account or support us by becoming a subscriber.","buttonOneUrl":"https:\/\/www.seattletimes.com\/how-to-turn-off-ad-blockers\/","buttonOneText":"Unblock ads","buttonTwoText":"Subscribe","buttonTwoUrl":"https:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=adblock","userTypes":[{"value":"anonymous","label":"Anonymous"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}]},{"id":"jpa4jw","type":"autopay","dateCreated":1503525230341,"enabled":0,"priority":3,"slot":"overlay","message":"With AutoPay, you'll spend less time paying your Seattle Times bill - so you can spend more time reading our stories.","buttonText":"Sign up for AutoPay","url":"https:\/\/secure.seattletimes.com\/accountcenter\/autopay","pageTypes":[{"value":"story","label":"Story"}],"userTypes":[{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"frequency":1209600},{"id":"t7olub","type":"bill-overdue","dateCreated":1503524391249,"enabled":1,"priority":4,"slot":"overlay","message":"Our records show your bill is past due. Take a few minutes to pay it now, and get back to your reading.","url":"https:\/\/secure.seattletimes.com\/accountcenter\/paymybill","buttonText":"Pay your Bill","pageTypes":[{"value":"story","label":"Story"}],"userTypes":[{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"frequency":604800},{"id":"50vut3","type":"subscription-promo","dateCreated":1502315575699,"enabled":1,"slot":"postscript","priority":4,"headline":"We need your support","message":"In-depth journalism takes time and effort to produce, and it depends on paying subscribers. If you value these kinds of stories, consider subscribing.","buttonText":"Subscribe","url":"http:\/\/www.seattletimes.com\/subscribe\/signup-offers\/?subsource=promo","userTypes":[{"value":"anonymous","label":"Anonymous"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}]},{"id":"jbdbno","type":"declined-payment","dateCreated":1502314271094,"enabled":1,"priority":3,"slot":"overlay","headline":"We\u2019re unable to process your payment.","message":"Update your information to prevent your subscription from being cancelled.","url":"https:\/\/secure.seattletimes.com\/accountcenter\/autopay","buttonText":"Update payment","pageTypes":[{"value":"story","label":"Story"}],"userTypes":[{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"}],"frequency":""},{"id":"gae1qu","type":"credit-card-expiring","dateCreated":1502314216718,"enabled":1,"priority":3,"slot":"overlay","message":"Your subscription will be suspended unless you update your credit card.","buttonText":"Update payment","url":"https:\/\/secure.seattletimes.com\/accountcenter\/managesubscriptions","pageTypes":[{"value":"story","label":"Story"}],"userTypes":[{"value":"subscriber","label":"Subscriber"}],"deviceTypes":[{"value":"mobile","label":"Mobile"},{"value":"tablet","label":"Tablet"},{"value":"desktop","label":"Desktop"}],"frequency":86400}],"newsletters":{"subscriptionEndpoint":"https:\/\/secure.seattletimes.com\/api\/newsletter-signup","dataExtensionIdExtra":"F8EF9EFF-502A-4BD4-AFE0-9C0B701EA6A3","userDataEndpoint":"https:\/\/secure.seattletimes.com\/api\/newsletter-user","emailsNewsroom":{"10349041":{"id":10349041,"title":"Breaking News","name":"breaking-news","permalink":"https:\/\/www.seattletimes.com\/newsletters\/breaking-news\/","callToAction":"Sign up for Breaking News Alerts","description":"Know what's going on as soon as it happens. Delivered as needed to your inbox.","newsletterType":"Alert","buttonText":"Sign up","frequency":"Delivered as needed.","listId":2117,"dataExtensionId":"053B79F0-EC2B-4625-BA83-CF49F48A9408","serviceProvider":"marketingcloud","excerpt":"We cover the news 24\/7, and when a story breaks, you\u2019ll be among the first to know. Breaking News alerts don\u2019t follow a schedule. As soon as something happens, in our community or out in the world, you\u2019ll get an email.","signupTitle":"Sign up for Breaking News Alerts","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/BreakingNews_StaticPhone.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/BreakingNews_TopImg_2000-780x500.jpg"},"10812646":{"id":10812646,"title":"Don&#8217;t Miss","name":"dont-miss","permalink":"https:\/\/www.seattletimes.com\/newsletters\/dont-miss\/","callToAction":"Sign up for Don't Miss","description":"Delivered periodically, these email alerts cover developing stories and follow-ups on breaking news, focusing on local events and national stories with a Northwest connection.","newsletterType":"Alert","buttonText":"Sign up","frequency":"Delivered as needed.","listId":3060,"dataExtensionId":"099E22DB-B3CB-4EFE-AD7D-45EC743F9B85","serviceProvider":"marketingcloud","excerpt":"Keep up with developing stories with Don\u2019t Miss alerts, designed for those who want to know what happens next. Like Breaking Alerts, only for non-breaking stories and news.","signupTitle":"Sign up for Don't Miss","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/04\/DontMiss-Alert_Landing-Page.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/04\/News-Alert_Landing-Page_big-780x500.jpg"},"10349060":{"id":10349060,"title":"Eats & Drinks","name":"eats-drinks","permalink":"https:\/\/www.seattletimes.com\/newsletters\/eats-drinks\/","callToAction":"Sign up for Eats & Drinks","description":"The latest restaurant news, happy-hour hangouts and more. Delivered to your inbox Tuesdays.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered Tuesdays.","listId":1961,"dataExtensionId":"066C4A93-0DC8-4776-B1AF-B63A5F673D12","serviceProvider":"marketingcloud","excerpt":"Eat, drink and be happy with this custom-curated newsletter full of epicurean delights. The Seattle Times\u2019 food and drink staff serve up the week\u2019s best items and deliver them to your inbox every Tuesday.","signupTitle":"Sign up for Eats &amp; Drinks","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/EatsDrinks_StaticPhone.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/EatsDrinks_TopImg_2000-780x500.jpg"},"10349079":{"id":10349079,"title":"Education Lab","name":"education-lab","permalink":"https:\/\/www.seattletimes.com\/newsletters\/education-lab\/","callToAction":"Sign up for Education Lab","description":"An easy way to stay connected to education. Delivered to your inbox Thursdays.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered Thursdays.","listId":2095,"dataExtensionId":"B708F3DE-B396-4403-AEE3-720BC31B42BE","serviceProvider":"marketingcloud","excerpt":"Education Lab is an ongoing journalism initiative dedicated to exploring solutions for improving public education in Washington state. This weekly newsletter showcases Ed Lab features, as well as the week\u2019s education-related content and news.","signupTitle":"Sign up for Education Lab","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/EducationLab_StaticPhone.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/EducationLab_TopImg_2000-780x500.jpg"},"10728545":{"id":10728545,"title":"Evening Brief","name":"evening-brief","permalink":"https:\/\/www.seattletimes.com\/newsletters\/evening-brief\/","callToAction":"Sign up for Evening Brief","description":"Delivered weeknights, this email newsletter gives you a quick recap of the day's top stories and need-to-know news, as well as intriguing photos and topics to spark conversation as you wind down from your day.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered weekday evenings.","listId":3004,"dataExtensionId":"9708A948-A963-4A59-A0BC-BFA38E9E9087","serviceProvider":"marketingcloud","excerpt":"Delivered weeknights, this email newsletter gives you a quick recap of the day's top stories and need-to-know news, as well as intriguing photos and topics to spark conversation as you wind down from your day.","signupTitle":"Sign up for Evening Brief","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/03\/Retina-WhitePhone.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/03\/EveningBrief-Header-image-780x500.jpg"},"10349065":{"id":10349065,"title":"Fan Fix","name":"fan-fix","permalink":"https:\/\/www.seattletimes.com\/newsletters\/fan-fix\/","callToAction":"Sign up for Fan Fix","description":"Your dose of local sports news. Delivered Monday through Friday.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered Monday through Friday.","listId":2544,"dataExtensionId":"8739B97E-1448-4AE1-9FDF-EE0AC5BA3DCD","serviceProvider":"marketingcloud","excerpt":"Delivered weekdays, Fan Fix covers all things sports, with an emphasis on local teams and athletes. From the preps to the pros, it's essential reading for local sports fans.","signupTitle":"Sign up for Fan Fix","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/iPhone_Landing-Page_FanFix.gif","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/209409_dr_Padres_Mariners_17_2000x1071-780x500.jpg"},"10349021":{"id":10349021,"title":"Morning Brief","name":"morning-brief","permalink":"https:\/\/www.seattletimes.com\/newsletters\/morning-brief\/","callToAction":"Sign up for Morning Brief","description":"Delivered bright and early weekday mornings, this email provides a quick overview of top stories and need-to-know news.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered weekday mornings.","listId":2116,"dataExtensionId":"CBCC013B-4181-4475-B06E-C288599392FD","serviceProvider":"marketingcloud","excerpt":"Delivered bright and early weekday mornings, this newsletter provides a quick overview of top stories and need-to-know news, along with intriguing photos and water-cooler-worthy items you might otherwise miss.","signupTitle":"Sign up for Morning Brief","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/MorningBrief_StaticPhone.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2017\/04\/MorningBrief2_TopImg_2000-780x500.jpg"},"10912645":{"id":10912645,"title":"Pacific NW","name":"pacific-nw","permalink":"https:\/\/www.seattletimes.com\/newsletters\/pacific-nw\/","callToAction":"Sign up for Pacific NW","description":"Designed for leisurely Sundays, this handy email newsletter brings you stories from Pacific NW magazine, featuring deep reporting, compelling storytelling and powerful visuals.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered Sundays.","listId":3371,"dataExtensionId":"D77CF9AA-D4A5-4171-BF17-6DB6E53D3E78","serviceProvider":"marketingcloud","excerpt":"Designed for leisurely Sundays, this handy email newsletter brings you stories from Pacific NW magazine, featuring deep reporting, compelling storytelling and powerful visuals.","signupTitle":"Sign up for Pacific NW","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/07\/Newsletter_iPhone_Landing-Page.png","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2018\/07\/PNW-newsletter_1-780x500.jpg"},"11251488":{"id":11251488,"title":"Top of the Times","name":"top-of-the-times","permalink":"https:\/\/www.seattletimes.com\/newsletters\/top-of-the-times\/","callToAction":"Sign up for Top of the Times","description":"Delivered on Saturday mornings, this email features a collection of the week's best reads.","newsletterType":"Newsletter","buttonText":"Sign up","frequency":"Delivered on Saturdays.","listId":1798,"dataExtensionId":"07BBCDCC-02F0-451C-9366-CCFD4E0B5DEB","serviceProvider":"marketingcloud","excerpt":"Stay on top of the week's news with this Saturday newsletter, highlighting the most important and interesting stories from each Seattle Times section.","signupTitle":"Sign up for Top of the Times","signupDescription":"Enter your email address to get on the list.","deviceImage":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2019\/02\/iPhone_Landing-Page_3TopOfT.gif","image":"https:\/\/static.seattletimes.com\/wp-content\/uploads\/2019\/02\/209103_traffic_04_2000x1071-780x500.jpg"}},"emailsCompany":[{"title":"Company Updates","excerpt":"Information on new site features, services and promotions from the Seattle Times Company.","listId":580,"dataExtensionId":"","serviceProvider":"marketingcloud","userLevel":1},{"title":"Print Replica Notifications","excerpt":"Receive a daily email when the replica of today&#039;s newspaper is ready to be viewed.","listId":1015,"dataExtensionId":"80FCE1FE-2E8D-4194-B211-A32F066773CF","serviceProvider":"marketingcloud","userLevel":3},{"title":"Subscriber rewards","excerpt":"Coupons and deals exclusively for our subscribers.","listId":310,"dataExtensionId":"","serviceProvider":"marketingcloud","userLevel":3}]},"settings":{"ssoEnv":"secure.","adBlockMessageTimeout":6000,"nonBlockingMessagesDelay":3000,"newslettersUrl":"https:\/\/www.seattletimes.com\/newsletters"}};
+ SEATIMESCO.paywall = SEATIMESCO.paywall || {"contentMetered":true,"pageExcluded":false,"configs":[{"target":"all","config":"https:\/\/www.seattletimes.com\/paywallconfig\/stdotcom\/"},{"target":"privateMode=on","config":"https:\/\/www.seattletimes.com\/paywallconfig\/mmtest\/"},{"target":"paywall2=on","config":"https:\/\/www.seattletimes.com\/paywallconfig\/paywall2\/"},{"target":"STsegment=paywall2","config":"https:\/\/www.seattletimes.com\/paywallconfig\/paywall2\/"},{"target":"_matherSegments=MATHER_U2_HIGHMODALGROUPB_20190215","config":"https:\/\/www.seattletimes.com\/paywallconfig\/freetrial\/"}]};
+ window.SEATIMESCO.browser = window.SEATIMESCO.browser || {};
+ window.SEATIMESCO.browser.privacy = window.SEATIMESCO.browser.privacy || {};
+ window.SEATIMESCO.browser.privacy.detectionEnabled = true;
+ window.SEATIMESCO.browser.privacy.doNotTrack = 0;
+
+ window.SEATIMESCO.browser.adBlock = window.SEATIMESCO.browser.adBlock || {};
+ window.SEATIMESCO.browser.adBlock.detectionEnabled = true;
+ window.SEATIMESCO.browser.adBlock.detectionTimeout = 300;
+ ;
+ /* ]]> */
+ </script>
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/themes/st_refresh/js/bundle.min.js?ver=1556659261"></script>
+ <script type="text/javascript" src="https://talk-seattletimes.global.ssl.fastly.net/static/embed/count.js?id=11469382"></script>
+ <script type="text/javascript" src="https://talk-seattletimes.global.ssl.fastly.net/static/embed.js"></script>
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/st-coral-talk/dist/st-coraltalk-bundle.js?ver=1555567319"></script>
+ <script type="text/javascript">
+
+ /* <![CDATA[ */
+ var recirculationData = {"postID":"11469382","sectionName":"Business","sectionSlug":"business"};
+ /* ]]> */
+ </script>
+ <script type="text/javascript" async="async" src="https://www.seattletimes.com/wp-content/plugins/st-recirculation/dist/st-recirculation-bundle.js?ver=1548788763"></script>
+ <script type="text/javascript" async="async" src="https://www.seattletimes.com/wp-content/plugins/st-user-messaging/dist/st-user-messaging-main-bundle.js?ver=1556659261"></script> <!--[if lt IE 10]>
+<script type="text/javascript">
+document.addEventListener('DOMContentLoaded', function() {
+
+ if ( helpers.getCookie( 'st_browser_upgrade_message_seen' ) == false && helpers.getCookie('st_browser_upgrade_message_seen') != 'true' ) {
+ var browserUpdateDiv = document.createElement('div');
+ browserUpdateDiv.className = "no-support-message";
+ browserUpdateDiv.innerHTML = "Your browser appears to be outdated and can't take advantage of many features on the site. Please <a href=\"http://outdatedbrowser.com/en\">consider upgrading your browser</a> to receive our intended user experience."
+ document.body.insertBefore(browserUpdateDiv, document.body.childNodes[0]);
+
+ helpers.writeCookie('st_browser_upgrade_message_seen', 'true', (30 * 24 * 60 * 60 * 1000), '/', '.seattletimes.com' );
+ }
+});
+</script>
+<![endif]-->
+ </div>
+ <script type="text/javascript" src="https://www.seattletimes.com/wp-content/plugins/shortcodes_plugin/js/responsive-frame.min.js?ver=4.0" async="async"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ // Chartbeat
+ // http://support.chartbeat.com/docs/#code
+ var _sf_async_config = _sf_async_config || {};
+
+ _sf_async_config.sections = null;
+ _sf_async_config.authors = null;
+ _sf_async_config.title = null;
+
+ /** CONFIGURATION START **/
+ if(dataLayer[0]){
+ _sf_async_config.sections = dataLayer[0].section_tier1 !== undefined ? dataLayer[0].section_tier1 : _sf_async_config.sections;
+ _sf_async_config.authors = dataLayer[0].author !== undefined ? dataLayer[0].author : _sf_async_config.authors;
+ _sf_async_config.title = dataLayer[0].title !== undefined ? dataLayer[0].title : _sf_async_config.title;
+ }
+ /** CONFIGURATION END **/
+
+ (function(){
+ function loadChartbeat() {
+ window._sf_endpt=(new Date()).getTime();
+ var e = document.createElement("script");
+ e.setAttribute("language", "javascript");
+ e.setAttribute("type", "text/javascript");
+ e.setAttribute('src', '//static.chartbeat.com/js/chartbeat.js');
+ document.body.appendChild(e);
+ }
+ var oldonload = window.onload;
+ window.onload = (typeof window.onload != "function") ?
+ loadChartbeat : function() { oldonload(); loadChartbeat(); };
+ })();
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var theHash = window.location.hash;
+ if ( typeof theHash !== 'undefined' && theHash !== null ) {
+ var hashPos = theHash.indexOf( "#close_window" );
+ if ( hashPos > -1 ) { window.close(); }
+ }
+ //]]>
+ </script> <!-- Teads inline video script -->
+
+ <script type="text/javascript" class="teads" async="true" src="//a.teads.tv/page/63231/tag"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+ window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"c4b9c42d06","applicationID":"15592336","transactionName":"Z1xRZ0tSXhZYWxFdX14WZkFQHFkLXV0dGkBYSQ==","queueTime":0,"applicationTime":253,"atts":"SxtSEQNITRg=","errorBeacon":"bam.nr-data.net","agent":""}
+ //]]>
+ </script><!-- Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/
+
+Object Caching 1637/1682 objects using memcached
+
+ Served from: www.seattletimes.com @ 2019-04-30 19:42:34 by W3 Total Cache -->
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html
index 55b74a98c..8e8313dc6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/simplyfound-1/expected.html
@@ -1,18 +1,18 @@
<div>
- <p>The Raspberry Pi Foundation started by a handful of volunteers in 2012 when they released the original Raspberry Pi 256MB Model B without knowing what to expect.  In a short four-year period they have grown to over sixty full-time employees and have shipped over <b>eight million</b> units to-date.  Raspberry Pi has achieved new heights by being shipped to the International Space Station for research and by being an affordable computing platforms used by teachers throughout the world.  "It has become the all-time best-selling computer in the UK".</p>
+ <p>The Raspberry Pi Foundation started by a handful of volunteers in 2012 when they released the original Raspberry Pi 256MB Model B without knowing what to expect. &nbsp;In a short four-year period they have grown to over sixty full-time&nbsp;employees&nbsp;and have shipped over <b>eight million</b> units to-date. &nbsp;Raspberry Pi has achieved new heights by being shipped to the&nbsp;International&nbsp;Space Station for research and by being an affordable computing platforms used by teachers throughout the world. &nbsp;"It has become the all-time best-selling computer in the UK".</p>
<p>Raspberry Pi 3 - A credit card sized PC that only costs $35 - Image: Raspberry Pi Foundation</p>
- <p>Raspberry Pi Foundation is charity organization that pushes for a digital revolution with a mission to inspire kids to learn by creating computer-powered objects.  The foundation also helps teachers learn computing  skills through free training and readily available tutorials &amp; example code for creating cool things such as music.</p>
+ <p>Raspberry Pi Foundation is charity organization that pushes for a digital revolution with a mission to inspire kids to learn by&nbsp;creating computer-powered objects. &nbsp;The foundation also helps teachers learn computing &nbsp;skills through free training and readily available tutorials &amp; example code for creating cool things such as music.</p>
<p>Raspberry Pi in educations - Image: Raspberry Pi Foundation</p>
- <p>In celebration of their 4th year anniversary, the foundation has released <b>Raspberry Pi 3</b> with the same price tag of<b> </b>$35 USD.  The 3rd revision features a <b>1.2GHz 64-bit quad-core</b> ARM CPU with integrated Bluetooth 4.1 and 802.11n wireless LAN chipsets.  The ARM Cortex-A53 CPU along with other architectural enhancements making it the fastest Raspberry Pi to-date.  The 3rd revision is reportedly about 50-60% times faster than its predecessor Raspberry Pi 2 and about 10 times faster then the original Raspberry PI.</p>
+ <p>In celebration of their 4th year&nbsp;anniversary, the foundation has released&nbsp;<b>Raspberry Pi 3</b> with the same price tag of<b>&nbsp;</b>$35 USD. &nbsp;The 3rd revision features a <b>1.2GHz 64-bit quad-core</b>&nbsp;ARM CPU with integrated Bluetooth 4.1 and 802.11n wireless LAN chipsets. &nbsp;The ARM Cortex-A53 CPU along with other architectural enhancements making it the fastest Raspberry Pi to-date. &nbsp;The 3rd revision is reportedly about 50-60% times faster than its predecessor Raspberry Pi 2 and about 10 times faster then the original Raspberry PI.</p>
<p>Raspberry Pi - Various Usage</p>
- <p>Raspberry Pi 3 is now available via many online resellers.  At this time, you should use a recent <b>32-bit </b>NOOBS or Raspbian image from their <a href="https://www.raspberrypi.org/downloads/" rel="nofollow" target="_blank">downloads</a> page with a promise of a switch to a 64-bit version only if further investigation proves that there is indeed some value in moving to 64-bit mode.</p>
+ <p>Raspberry Pi 3 is now available via many online resellers. &nbsp;At this time, you should use a recent <b>32-bit </b>NOOBS or Raspbian image from their&nbsp;<a href="https://www.raspberrypi.org/downloads/" rel="nofollow" target="_blank">downloads</a> page with a promise of a switch to a 64-bit version only if further investigation proves that there is indeed some value in moving to 64-bit mode.</p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html
index 6d135be2c..30c09b2ec 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/social-buttons/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>Lorem ipsum dolor</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html
index d3a8806b4..a5ba2c6d7 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/style-tags-removal/expected.html
@@ -1,4 +1,6 @@
<article>
+ <h2>Lorem</h2>
+
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
@@ -7,6 +9,7 @@
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
+
<h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html
index 1cc45591b..faa8ff814 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/svg-parsing/expected.html
@@ -11,7 +11,13 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-<svg height="50" style="position: absolute;" version="1.1" viewbox="0 0 50 50" width="50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><clippath id="hex-mask-large"><polygon points="15,35 10,35 10,0 10,0 45,0 45,35 45,35 25,35 15,43"></polygon></clippath><clippath id="hex-mask-small"><polygon points="5,1 5,16 3,23 10,20 24,20 24,1"></polygon></clippath></g></svg><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+<svg version="1.1" viewBox="0 0 50 50" height="50" width="50" style="position: absolute;" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <g>
+ <clipPath id="hex-mask-large"><polygon points="15,35 10,35 10,0 10,0 45,0 45,35 45,35 25,35 15,43" /></clipPath>
+ <clipPath id="hex-mask-small"><polygon points="5,1 5,16 3,23 10,20 24,20 24,1" /></clipPath>
+ </g>
+</svg>
+<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json
index c2a1ea915..dc3706450 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected-images.json
@@ -1,3 +1,3 @@
[
- "http:\/\/fakehost\/test\/..\/compass1.gif"
+ "http:\/\/fakehost\/compass1.gif"
] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html
index 77c083b21..7ded97c76 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/table-style-attributes/expected.html
@@ -1,17 +1,21 @@
<div>
<p>
<span size="+3"><b>linux usability
- <span size="4"><br></br>...or, why do I bother.</span></b></span><br></br> © 2002, 2003
+ <span size="4"><br>...or, why do I bother.</span></b></span><br> © 2002, 2003
<a href="mailto:/dev/[email protected]?subject=Please%20delete%20this%20message%20without%20reading%20it.">Jamie Zawinski</a> </p>
<div>
- <table readabilityDataTable="0"><tbody><tr><td>
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
<p> In December 2002, I tried to install some software on my computer. The experience was, shall we say, less than pleasant. On many levels. I wrote about my experience, as I so often do. </p>
<p> Then in January, the jackasses over at Slashdot <a href="http://slashdot.org/article.pl?sid=03/01/24/1440207">posted</a> a link to it, calling it a "review" of Linux video software. I guess you could consider it a review, if you were to squint at it just right. But really what it is is a <i>rant</i> about how I had an evening stolen from me by crap software design. It is a flame about the pathetic state of Linux usability in general, and the handful of video players I tried out in particular. It makes no attempt to be balanced or objective or exhaustive. It is a description of my experience. Perhaps your experience was different. Good for you. </p>
<p> So of course that day I got hundreds of emails about it. Every Linux apologist in the world wanted to make sure I was fully informed of their opinion. The replies were roughly in the following groups: </p>
- <ul><li> "Right on! I had exactly the same experience! Thank you for putting it into words." <i>(This was about 1/3 of the replies.)</i>
+ <ul>
+ <li> "Right on! I had exactly the same experience! Thank you for putting it into words." <i>(This was about 1/3 of the replies.)</i>
</li>
<li> "You're clearly an idiot, Linux is too sophisticated for you, you clearly are incapable of understanding anything, you should go back to kindergarten and/or use a Mac." <i>(Oddly, all of these messages used the word</i> `clearly' <i>repeatedly.)</i>
@@ -29,29 +33,38 @@
<li> "While you have some valid complaints, I'm going to focus on this one inconsequential error you made in your characterization of one of the many roadblocks you encountered. You suck!"
</li>
- <li> "It's your fault for using Red Hat! You should be using Debian/<wbr></wbr>Mandrake/<wbr></wbr>Gentoo instead!"
+ <li> "It's your fault for using Red Hat! You should be using Debian/<wbr>Mandrake/<wbr>Gentoo instead!"
</li>
<li> "Red Hat 7.2 is totally obsolete! It's almost 14 months old! What were you expecting!" </li>
- </ul></td>
+ </ul>
+ </td>
<td>
<p> While I am flattered that so many logorrheic Linux fanboys are sufficiently interested in my opinions and experiences to share their deeply heartfelt views with me, you can all rest assured that: </p>
- <ul><ul type="A"><li> I've heard it before; and </li>
+ <ul>
+ <ul type="A">
+ <li> I've heard it before; and </li>
<li> I didn't care the first time. </li>
- </ul></ul><p> So please. Don't bother sending me any more mail about this. It's a near certainty that I will just delete it unread, so you might as well not waste your time. Feel free to call me names on your own web page if you feel the need to get it out of your system. But kindly stay out of my inbox.
+ </ul>
+ </ul>
+ <p> So please. Don't bother sending me any more mail about this. It's a near certainty that I will just delete it unread, so you might as well not waste your time. Feel free to call me names on your own web page if you feel the need to get it out of your system. But kindly stay out of my inbox.
</p>
</td>
- </tr></tbody></table></div>
+ </tr>
+ </tbody>
+ </table>
+ </div>
<p>
<span size="+3"><b>that said...</b></span>
</p>
<p> I understand that one can play videos on one's computer. I understand these videos come in many different formats. Every now and then I try to figure out what the Done Thing is, as far as playing movies on one's Linux machine. </p>
- <ul> (Really my eventual goal is to be able to <i>create</i> video on Linux, but I figured I'd start small, and see if I could just get <i>playback</i> working before trying something that is undoubtedly ten thousand times harder.) </ul><p> I finally found <a href="http://mirrors.sctpc.com/dominik/linux/pkgs/mplayer/">RPMs</a> of <a href="http://www.mplayerhq.hu/">mplayer</a> that would consent to install themselves on a Red Hat 7.2 machine, and actually got it to play some videos. Amazing. But it's a total pain in the ass to use due to rampant "themeing." <i>Why do people do this?</i> They map this stupid shaped window with no titlebar (oh, sorry, your choice of a dozen stupidly-shaped windows without titlebars) all of which use fonts that are way too small to read. But, here's the best part, there's no way to raise the window to the top. So if another window ever gets on top of it, well, sorry, you're out of luck. And half of the themes always map the window at the very bottom of the
+ <ul> (Really my eventual goal is to be able to <i>create</i> video on Linux, but I figured I'd start small, and see if I could just get <i>playback</i> working before trying something that is undoubtedly ten thousand times harder.) </ul>
+ <p> I finally found <a href="http://mirrors.sctpc.com/dominik/linux/pkgs/mplayer/">RPMs</a> of <a href="http://www.mplayerhq.hu/">mplayer</a> that would consent to install themselves on a Red Hat 7.2 machine, and actually got it to play some videos. Amazing. But it's a total pain in the ass to use due to rampant "themeing." <i>Why do people do this?</i> They map this stupid shaped window with no titlebar (oh, sorry, your choice of a dozen stupidly-shaped windows without titlebars) all of which use fonts that are way too small to read. But, here's the best part, there's no way to raise the window to the top. So if another window ever gets on top of it, well, sorry, you're out of luck. And half of the themes always map the window at the very bottom of the
<nobr>screen --</nobr> conveniently <i>under</i> my panel where I can't reach it. </p>
<p> Resizing the window changes the aspect ratio of the video! Yeah, I'm sure someone has <i>ever</i> wanted that. </p>
<p> It moves the mouse to the upper left corner of every dialog box it creates! Which is great, because that means that when it gets into this cute little state of popping up a blank dialog that says "Error" five times a second, you can't even move the mouse over to another window to kill the program, you have to log in from another machine. </p>
@@ -65,38 +78,45 @@ RPMs</a>, and it sucks about the same as mplayer, and in about the same ways, th
<p> Oh, and even though I have libdvdcss installed (as evidenced by the fact that Ogle actually works) Xine won't play the same disc that Ogle will play. It seems to be claiming that the CSS stuff isn't installed, which it clearly is. </p>
<p> An idiocy that all of these programs have in common is that, in addition to opening a window for the movie, and a window for the control panel, they <i>also</i> spray a constant spatter of curses crud on the terminal they were started from. I imagine at some point, there was some user who said, ``this program is pretty nice, but you know what it's missing? It's missing a lot of pointless chatter about what plugins and fonts have been loaded!'' </p>
- <hr></hr><b>And here's the Random Commentary section:</b>
+ <hr> <b>And here's the Random Commentary section:</b>
<blockquote> <b><a href="http://www.lazycat.org/">Makali</a> wrote:</b>
<ul><i>
Whenever a programmer thinks, "Hey, skins, what a cool idea", their
computer's speakers should create some sort of cock-shaped soundwave
and plunge it repeatedly through their skulls.
- </i></ul><p> I am fully in support of this proposed audio-cock technology. </p>
+ </i></ul>
+ <p> I am fully in support of this proposed audio-cock technology. </p>
<p><b>Various people wrote:</b> </p>
<ul><i>
You shouldn't even bother compiling the GUI into mplayer!
- </i></ul><p> So I should solve the problem of ``crappy GUI'' by replacing it with ``no GUI at all?'' I should use the program only from the command line, or by memorizing magic keystrokes? Awesome idea. </p>
+ </i></ul>
+ <p> So I should solve the problem of ``crappy GUI'' by replacing it with ``no GUI at all?'' I should use the program only from the command line, or by memorizing magic keystrokes? Awesome idea. </p>
<p><b>Various other people wrote:</b> </p>
<ul><i>
You didn't try <a href="http://www.videolan.org/vlc/">vlc</a>!
- </i></ul><p> True, I hadn't. Now I have. It has an overly-complicated UI, (the Preferences panel is a festival of overkill) but at least it uses standard menus and buttons, so it doesn't make you want to claw your eyes out immediately. But, it can only play a miniscule number of video formats, so it's mostly useless. <i>*plonk*</i> </p>
+ </i></ul>
+ <p> True, I hadn't. Now I have. It has an overly-complicated UI, (the Preferences panel is a festival of overkill) but at least it uses standard menus and buttons, so it doesn't make you want to claw your eyes out immediately. But, it can only play a miniscule number of video formats, so it's mostly useless. <i>*plonk*</i> </p>
<p><b>Someone else wrote:</b> </p>
<ul><i>
Have you considered changing distributions?
- </i></ul><p> Yes, every single time I try something like this, I very seriously consider <a href="http://fakehost/test/../gruntle/bittybox.html">getting a Mac</a>. </p>
+ </i></ul>
+ <p> Yes, every single time I try something like this, I very seriously consider <a href="http://fakehost/gruntle/bittybox.html">getting a Mac</a>. </p>
<p> Really the only thing that's stopping me is that I fear the <a href="http://www.xemacs.org/">Emacs situation</a>. </p>
<p> (By which I mean, ``Lack of a usable version thereof.'' No, running RMSmacs inside a terminal window doesn't qualify. Nor does running an X server on the Mac: if I were going to switch, why in the world would I continue inflicting the X Windows Disaster on myself? Wouldn't getting away from that be the <i>whole
point?</i>) </p>
- <ul><span size="-1"> (I understand there is an almost-functional Aqua version of <a href="http://fakehost/test/../hacks/why-cooperation-with-rms-is-impossible.mp3">
+ <ul>
+ <span size="-1"> (I understand there is an almost-functional Aqua version of <a href="http://fakehost/hacks/why-cooperation-with-rms-is-impossible.mp3">
RMSmacs</a> now. I'll probably check it out at some point, but the problem with <i><a href="http://fakehost/test/lemacs.html">me</a></i> switching from XEmacs to RMSmacs is that it would probably result in another <a href="http://slashdot.org/article.pl?sid=03/01/24/1440207">
Slashdork</a> post, meaning I'd wake up to another 150+ poorly spelled flames in my inbox... I'm hoping for a Aquafied XEmacs, but I know that's not likely to happen any time soon.)</span>
- </ul><p> By the way, the suggestion to switch Linux distrubutions in order to get a single app to work might sound absurd at first. And that's because <a href="http://fakehost/test/linux.html">it is</a>. But I've been saturated with Unix-peanut-gallery effluvia for so long that it no longer even surprises me when every
+ </ul>
+ <p> By the way, the suggestion to switch Linux distrubutions in order to get a single app to work might sound absurd at first. And that's because <a href="http://fakehost/test/linux.html">it is</a>. But I've been saturated with Unix-peanut-gallery effluvia for so long that it no longer even surprises me when every
<nobr>question --</nobr> no matter how
<nobr>simple --</nobr> results in someone suggesting that you either A) patch your kernel or B) change distros. It's inevitable and inescapable, like Hitler. </p>
</blockquote>
- <hr></hr>
- <p> <a href="http://fakehost/test/../"><img alt="[ up ]" onmouseout="this.src=&quot;../compass1.gif&quot;" onmouseover="this.src=&quot;../compass2.gif&quot;" src="http://fakehost/test/../compass1.gif"></img></a> </p>
+ <hr>
+
+ <p> <a href="http://fakehost/"><img alt="[ up ]" src="http://fakehost/compass1.gif" onmouseover="this.src=&quot;../compass2.gif&quot;" onmouseout="this.src=&quot;../compass1.gif&quot;"></a> </p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json
index be19af16d..26924de7f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected-metadata.json
@@ -1,8 +1,8 @@
{
- "Author": "Our Foreign Staff \n \n\n16 November 2017 • 2:15pm",
+ "Author": null,
"Direction": null,
- "Excerpt": "Zimbabwe President Robert Mugabe, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's &quot;Blue House&quot; compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.",
+ "Excerpt": "Zimbabwe President Robert Mugabe, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's \"Blue House\" compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.",
"Image": "http:\/\/www.telegraph.co.uk\/content\/dam\/news\/2017\/11\/16\/TELEMMGLPICT000146889449-xlarge_trans_NvBQzQNjv4BqySoB6nTCgtc7U4LQ_FPO4hKi2sT3vi7ux2-RDZwC4QA.jpeg",
"Title": "Zimbabwe coup: Robert Mugabe and wife Grace 'insisting he finishes his term', as priest steps in to mediate",
"SiteName": "The Telegraph"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html
index 23a2a74ed..352b47d57 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/telegraph/expected.html
@@ -1,38 +1,20 @@
<div>
- <div>
- <div>
<p><span>Z</span>imbabwe President <a href="http://www.telegraph.co.uk/news/2017/11/17/zimbabwes-ruling-party-drafting-motion-fire-robert-mugabe-sunday/">Robert Mugabe</a>, his wife Grace and two key figures from her G40 political faction are under house arrest at Mugabe's "Blue House" compound in Harare and are insisting the 93 year-old finishes his presidential term, a source said.</p>
<p>The G40 figures are cabinet ministers Jonathan Moyo and Saviour Kasukuwere, who fled to the compound after their homes were attacked by troops in Tuesday night's coup, the source, who said he had spoken to people inside the compound, told Reuters.</p>
<p>Mr Mugabe is resisting mediation by a Catholic priest to allow the former guerrilla a graceful exit after the military takeover.</p>
<p>The priest, Fidelis Mukonori, is acting as a middle-man between Mr Mugabe and the generals, <a href="http://www.telegraph.co.uk/news/2017/11/15/zimbabwe-crisis-have-spent-long-careful-really-change/">who seized power in a targeted operation against "criminals" in his entourage</a>, a senior political source told Reuters.</p>
<p>The source could not provide details of the talks, which appear to be aimed at a smooth and bloodless transition after the departure of Mr Mugabe, who has led Zimbabwe since independence in 1980.</p>
<p>Mr Mugabe, still seen by many Africans as a liberation hero, is reviled in the West as a despot whose disastrous handling of the economy and willingness to resort to violence to maintain power destroyed one of Africa's most promising states.</p>
- </div>
- </div>
- </div><div>
- <div>
+ </div><div>
<p><span>Z</span>imbabwean intelligence reports seen by Reuters suggest that former security chief Emmerson Mnangagwa, who was ousted as vice-president this month, has been mapping out a post-Mugabe vision with the military and opposition for more than a year.</p>
- </div>
- </div><div>
- <div>
- <div>
+ </div><div>
<p><span>F</span>uelling speculation that Mnangagwa's plan might be rolling into action, opposition leader Morgan Tsvangirai, who has been receiving cancer treatment in Britain and South Africa, returned to Harare late on Wednesday, his spokesman said.</p>
<p>South Africa said Mr Mugabe had told President Jacob Zuma by telephone on Wednesday that he was confined to his home but was otherwise fine and the military said it was keeping him and his family, including wife Grace, safe.</p>
- </div>
- </div>
- </div><div>
- <div>
- <div>
+ </div><div>
<p><span>D</span>espite the lingering admiration for Mr Mugabe, there is little public affection for 52-year-old Grace, a former government typist who started having an affair with Mr Mugabe in the early 1990s as his first wife, Sally, was dying of kidney disease.</p>
<p>Dubbed "DisGrace" or "Gucci Grace" on account of her reputed love of shopping, she enjoyed a meteoric rise through the ranks of Mugabe's ruling Zanu-PF in the last two years, culminating in Mnangagwa's removal a week ago - a move seen as clearing the way for her to succeed her husband.</p>
- </div>
- </div>
- </div><div>
- <div>
+ </div><div>
<p><span>I</span>n contrast to the high political drama unfolding behind closed doors, the streets of the capital remained calm, with people going about their daily business, albeit under the watch of soldiers on armoured vehicles at strategic locations.</p>
- </div>
- </div><div>
- <div>
+ </div><div>
<p><span>W</span>hatever the final outcome, the events could signal a once-in-a-generation change for the former British colony, a regional breadbasket reduced to destitution by economic policies Mr Mugabe's critics have long blamed on him.</p>
- </div>
- </div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html
index e4fa77ae9..8eded27c6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/title-and-h1-discrepancy/expected.html
@@ -1,4 +1,5 @@
<article>
+ <h2>This is a long title with a colon: But the final text here is different</h2>
<p>
Lorem
ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html
index 6eb48b97d..6849dfe5a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tmz-1/expected.html
@@ -1,6 +1,6 @@
<div id="post-2015_02_26_lupita-nyongo-pearl-dress-stolen-oscars">
<p>
- <h2>Lupita Nyong'o</h2>
+
<h4>$150K Pearl Oscar Dress ... STOLEN!!!!</h4>
@@ -13,22 +13,23 @@
<p><span>EXCLUSIVE</span>
</p>
<p>
- <img alt="0225-lupita-nyongo-getty-01" src="http://ll-media.tmz.com/2015/02/26/0225-lupita-nyongo-getty-4.jpg"></img><strong>Lupita Nyong</strong>'<strong>o</strong>'s now-famous Oscar dress
+ <img alt="0225-lupita-nyongo-getty-01" src="http://ll-media.tmz.com/2015/02/26/0225-lupita-nyongo-getty-4.jpg"><strong>Lupita Nyong</strong>'<strong>o</strong>'s now-famous Oscar dress
-- adorned in pearls -- was stolen right out of her hotel room ... TMZ
has learned.</p>
<p>Law enforcement sources tell TMZ ... the dress was taken out of Lupita's
room at The London West Hollywood. The dress is made of pearls ... 6,000
white Akoya pearls. It's valued at $150,000.</p>
<p>Our sources say Lupita told cops it was taken from her room sometime between
- 8 AM and 9 PM Wednesday ... while she was gone.  </p>
+ 8 AM and 9 PM Wednesday ... while she was gone. &nbsp;</p>
<p>We're told there is security footage that cops are looking at that could
- catch the culprit right in the act. </p>
+ catch the culprit right in the act.&nbsp;</p>
<p>
- <img alt="update_graphic_red_bar" src="http://ll-media.tmz.com/2013/11/20/update-graphic-red-bar.jpg"></img><strong>12:00 PM PT</strong> -- Sheriff's deputies were at The London Thursday
- morning.  We know they were in the manager's office and we're told
+ <img alt="update_graphic_red_bar" src="http://ll-media.tmz.com/2013/11/20/update-graphic-red-bar.jpg"><strong>12:00 PM PT</strong> -- Sheriff's deputies were at The London Thursday
+ morning. &nbsp;We know they were in the manager's office and we're told
they have looked at security footage to determine if they can ID the culprit.</p>
<p>
- <img alt="0226-SUB-london-hotel-swipe-tmz-02" src="http://ll-media.tmz.com/2015/02/26/0226-sub-london-hotel-swipe-tmz-11.jpg"></img></p>
+ <img alt="0226-SUB-london-hotel-swipe-tmz-02" src="http://ll-media.tmz.com/2015/02/26/0226-sub-london-hotel-swipe-tmz-11.jpg">
+ </p>
</div>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-images.json
new file mode 100644
index 000000000..61e175c39
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-images.json
@@ -0,0 +1,3 @@
+[
+ "https:\/\/topicseed.com\/static\/9c97da26f6eeee98fc2e628ca3416226\/57090\/content-depth-seo.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-metadata.json
new file mode 100644
index 000000000..cfac45994
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Content writers and marketers find it hard to write a lot of content about a very specific topic. They lose a lot of points on their content depth because they would rather focus on pushing thin content about plenty of topics.",
+ "Image": "https:\/\/topicseed.com\/static\/9c97da26f6eeee98fc2e628ca3416226\/57090\/content-depth-seo.png",
+ "Title": "Content Depth \u2014 Write Comprehensively About Your Core Topics",
+ "SiteName": "topicseed"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected.html
new file mode 100644
index 000000000..18cd12890
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/expected.html
@@ -0,0 +1,93 @@
+<div>
+ <ul>
+ <li>
+ <a href="#assess-how-deep-is-your-content">Assess How Deep Is Your Content</a>
+ </li>
+ <li>
+ <a href="#rewrite-with-content-depth-in-mind">Rewrite With Content Depth In Mind</a>
+ </li>
+ <li>
+ <a href="#yes-content-depth-and-breadth-overlap">Yes, Content Depth and Breadth Overlap</a>
+ </li>
+ <li>
+ <a href="#depth-of-content--quality--frequency">Depth of Content = Quality + Frequency</a>
+ </li>
+ </ul>
+ <p>
+ <strong>Content depth</strong> is an arbitrary score or rating of how comprehensive the coverage of a specific topic is within a piece of content. <strong>Content breadth</strong> is an arbitrary grading of how many related subjects are you covering within your content.
+ </p>
+ <p>
+ And this distinction is important to make and establish from the beginning. Effective <a href="https://topicseed.com/blog/what-is-topical-authority" target="_blank" rel="nofollow noopener noreferrer"><strong>topical authority</strong></a> can only be gained when you use both content depth and content breadth in your overall content strategy for rapid search engine optimization gains. However, because most content writers prefer to write a little bit about many things rather than write a lot about one thing, you end up with a too little substance spread very thin.
+ </p>
+ <p>
+ Content depth should be the urgent priority for your content marketing strategy, and clearly defined in your <a href="http://fakehost/blog/content-briefs">content briefs</a>. Start by dominating your own core topics, before venturing across the pond and write about linked subject matters. Otherwise, you are the opposite of an authority as the definition states that an authority is <em>“a person with extensive or specialized knowledge about a subject; an expert”.</em> Lastly, do not mistake&nbsp;article depth vs. article length: a&nbsp;blog post’s extreme wordcount has nothing to do with its content depth.
+ </p>
+ <h2 id="assess-how-deep-is-your-content">
+ <a href="#assess-how-deep-is-your-content" aria-label="assess how deep is your content permalink"></a>Assess How Deep Is Your Content
+ </h2>
+ <p>
+ The first task on your list, right now, is to shortlist your core topics. What are you trying to be an expert on? Then, go through each one of your pieces of content and understand how well each blog post is covering&nbsp;its focus topic(s). Not how many times specific keywords appear, or how well the article is outlined and structured.
+ </p>
+ <p>
+ Put yourself in the shoes of an ignorant reader who seeks information. Read your article. <strong>And ask yourself how in-depth was the content you have written?</strong> I know the excuse you will come up with: this was written for beginners, therefore, it shouldn’t be too in-depth. And you are correct. Not every blog post is about absolute content depth otherwise we would only write one 10,000-word-long article, once and for all. But then, how well your beginner-level content pointing to your expert-level content?
+ </p>
+ <p>
+ In other words, each article should reach an incredible level of content depth for its expertise level. And then, provide further reading <em>(i.e. links)</em> to gain more knowledge, and depth. A lot of content editors write a beginner’s blog post and wait to see it perform well in order to write a more advanced sequel. Wrong. Give all the value so search engines can grade you highly on their authority scale for your core topics. Yes, it is a risk and you may write a dozen of articles on a specific topic that will never really rank at the top of SERPs, but <strong>reaching content depth is the first step towards SEO gains</strong>.
+ </p>
+ <p>
+ Remember that <strong>skyscraper content</strong> and <strong>10x content</strong> are not necessarily the answer. These content writing strategies state that in order to beat another piece of content, you need to write 10x more. Either in quantity with a 10x word count or in quality by putting times more information within your own piece of content. Such articles often become unreadable and discourage visitors from absorbing all the knowledge. The best alternative is the create <a href="https://topicseed.com/blog/how-broad-should-topics-be-for-pillar-pages" target="_blank" rel="nofollow noopener noreferrer">pillar pages</a> centered around core topics, and several articles dealing with each specific section in depth. This is <strong>deep content powered by a <a href="https://topicseed.com/blog/internal-linking-strategies-for-topic-clustering" target="_blank" rel="nofollow noopener noreferrer">smart internal linking strategy</a></strong>&nbsp;and search engines love that in this day and age where attention spans are short! <em>With that being said, avoid writing 600-word articles!</em>
+ </p>
+ <h2 id="rewrite-with-content-depth-in-mind">
+ <a href="#rewrite-with-content-depth-in-mind" aria-label="rewrite with content depth in mind permalink"></a>Rewrite With Content Depth In Mind
+ </h2>
+ <p>
+ Once you know which articles are lacking depth of knowledge and information, it is time to rethink each one. For each article, make a list of what essential pieces of information or data are missing. Then decide where to fit them, and decide whether the article would benefit from a full rewrite or not. As a rule of thumb, if you need to change a third of your article, you may need to rewrite it entirely. Of course, this does not mean erasing all work done prior, but it means starting afresh! Trying to <strong>fit deep content into an existing blog</strong> post gives you constraints so doing it from scratch can actually be easier to fight thin content.
+ </p>
+
+ <p>
+ As explained above, make sure you do not force yourself to write a much longer article to reach a <a href="https://moz.com/blog/blog-post-length-frequency" target="_blank" rel="nofollow noopener noreferrer">magic word count</a>. And if you do, it has to be natural. In many cases, articles written months or years ago may need some upkeeping: trimming the fat and removing parts that are not bringing much value. Replace these with your newer and deeper content.
+ </p>
+ <p>
+ All content writers know that when you open Google Docs, WordPress, or your text editor of choice, you will inevitably count your focus keywords’ frequency. Although I understand (yet question) the value of keywords in modern SEO, do not become obsessed with reaching a magic number for your keywords. No reader coming from Google is out there counting how often your keywords are appearing. And search engine algorithms will penalize you for writing for robots, rather than humans.
+ </p>
+ <p>
+ With the massive rise of voice searches, <a href="http://fakehost/blog/featured-snippets-using-questions">users tend to use full questions for their search queries</a>. What used to be <code>top bottled water brands</code>&nbsp;is now <code>OK google, what is the best bottled-water brand in Texas</code>?&nbsp;The point being, <a href="https://topicseed.com/blog/keyword-search-volume-overrated" target="_blank" rel="nofollow noopener noreferrer"><strong>keywords are losing traction</strong></a> to leave space for a more natural language understanding of a blog post’s textual content, and meaning.
+ </p>
+ <h2 id="yes-content-depth-and-breadth-overlap">
+ <a href="#yes-content-depth-and-breadth-overlap" aria-label="yes content depth and breadth overlap permalink"></a>Yes, Content Depth and Breadth Overlap
+ </h2>
+ <p>
+ <em>“A topic can be defined as the company it keeps.”</em> A very accurate saying loved by ontologists&nbsp;within the fields of&nbsp;computational linguistics, and information science. In simpler terms, a topic and all the terminology it is encompassing will inevitably overlap with related topics. Which, in turn, will form <a href="https://topicseed.com/blog/topic-clusters-relationships" target="_blank" rel="nofollow noopener noreferrer"><strong>topic clusters</strong></a>.
+ </p>
+ <p>
+ For example, it is obvious that despite being two different topics, <code>digital advertising</code>&nbsp;and <code>content marketing</code>&nbsp;share some common phrases and terms. Inevitably, a website picking one as its core topic will use words in some blog posts that will identify the article as belonging to both topics, with a specific weight for each.
+ </p>
+ <p>
+ A keyword, phrase, or term, is not a prisoner to a single concept at all. This is how algorithms in natural language understanding can understand how two topics are related (e.g. read about <a href="https://en.wikipedia.org/wiki/Topic_model" target="_blank" rel="nofollow noopener noreferrer"><em>topic modeling</em></a>). Each topic has a specific <strong>vocabulary</strong>, a list of words and phrases commonly used in its context, and some of these terms are present in different vocabularies.
+ </p>
+ <p>
+ Therefore, content depth and content breadth are not to be opposed. Content marketers should use both strategies in order to reach ultimate <strong>topical authority</strong> over their choice of subject matters.
+ </p>
+ <h2 id="depth-of-content--quality--frequency">
+ <a href="#depth-of-content--quality--frequency" aria-label="depth of content quality frequency permalink"></a>Depth of Content = Quality + Frequency
+ </h2>
+ <p>
+ Up until recently, long-form blog posts generally were <strong>evergreen articles</strong> that generated a constant stream of organic traffic for a website. This was a lead magnet generation strategy which worked well: hire a writer, include the right keywords, reach over a 5,000-word word count, and hit publish. Then, wait.
+ </p>
+ <p>
+ Nowadays, in-depth content requires more effort over time in order to pay off. Writing a big article, as good as it is, will not get your anywhere near the level of <a href="https://topicseed.com/blog/topical-seo" target="_blank" rel="nofollow noopener noreferrer">topical breadth</a>&nbsp;required by Google to rank you first. Instead, your content marketing plan should be about having:
+ </p>
+ <ul>
+ <li>a <strong>comprehensive pillar page</strong> covering a unique topic, and
+ </li>
+ <li>
+ <strong>narrow-focused children articles</strong> to dig deeper.
+ </li>
+ </ul>
+ <p>
+ Search engines also look at how often you publish about a specific topic, and when was the last time it was written about. Nobody likes a <a href="https://www.copypress.com/blog/avoiding-blog-graveyard/" target="_blank" rel="nofollow noopener noreferrer">graveyard blog</a>, it just makes the reader lose trust; as if the writer was not good enough, therefore had no traffic, before entirely giving up. Deep content requires a sustained effort on your part to always new find ways to write about a specific subject. Sure, it will be easy at first. But what about five years later? Well, you will still need to hit publish, all about the very same topics you already covered years ago.
+ </p>
+ <p>
+ Tools and platforms such as topicseed are here to <a href="https://topicseed.com/blog/how-to-find-new-blog-post-ideas" target="_blank" rel="nofollow noopener noreferrer">help you find new article ideas</a> pertaining to your core topics within a few clicks and a few minutes. The number of web pages, Wikipedia articles, and pieces of content, our machine-learning algorithms can analyze in seconds would take you months to digest. Our <em>topicgraph</em>&nbsp;finds closely related concepts in order for your domain to <strong>reach topical authority through content depth and content breadth</strong>.
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/source.html
new file mode 100644
index 000000000..fca1c0081
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/topicseed-1/source.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="x-ua-compatible" content="ie=edge" />
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+ <style data-href="/styles.4554427a2ff1ec4c9b41.css">
+ <![CDATA[
+ .index-module--Section--2wwdv{padding:2% 4%;background-color:#fff}.index-module--Section--2wwdv:nth-child(odd){background-color:#f9f9f9}.index-module--Section--2wwdv h1,.index-module--Section--2wwdv h2,.index-module--Section--2wwdv h3,.index-module--Section--2wwdv h4,.index-module--Section--2wwdv h5{font-family:Lato}.index-module--Section--2wwdv h2{color:#00ced1;text-shadow:0 0 1rem rgba(187,235,234,.64);line-height:1.25;font-size:2rem;margin:1.5em 0;text-align:center}.index-module--OurLocation--39dZN{margin-top:3rem}.index-module--OurLocation--39dZN a{color:#00ced1;font-weight:500;text-decoration:none}.index-module--OurLocation--39dZN .index-module--Pin--1M4gn{text-align:center}.index-module--OurLocation--39dZN .index-module--Pin--1M4gn img{height:64px;width:64px}.index-module--OurLocation--39dZN .index-module--Location--3wrrA p{font-size:1.2rem;padding:0;margin:0 auto;line-height:1.2;max-width:600px;font-weight:100;font-style:italic}.index-module--SectionExcerpt--36zdZ{max-width:800px;margin:auto auto 3rem;font-size:1.5em;line-height:1.5;text-align:center}.index-module--Listing--2-O97{font-size:1.2em;line-height:1.5;display:block;list-style:none;margin:0;padding:0}.index-module--Listing--2-O97>li{display:block;text-align:center;padding:1rem;border-radius:10px}.index-module--ListingIcon--2Hsao{padding-bottom:1rem}.index-module--ListingIcon--2Hsao img{width:64px;height:64px;display:block;margin:auto}.index-module--SubListingTitle--HZOQi{font-weight:700;padding:1rem 0;display:block}.index-module--SubListing--MrsDd{list-style:none;margin:0;padding:0}.index-module--SubListing--MrsDd li{text-transform:uppercase;font-size:.6em;letter-spacing:1px;margin:0;padding:.35rem 0}@media (min-width:1200px){.index-module--Listing--2-O97{display:flex}.index-module--Listing--2-O97>li{flex:1 1}}.index-module--Container--3Xdxi{overflow:hidden;max-width:100%;padding:2.5% 0 4%}.index-module--Container--2hTRH{background-color:#f9f9f9}.index-module--OptinArea--oMoVV{max-width:900px;background-color:transparent;margin:0 auto;border-radius:10px;padding:0 1rem}.index-module--Steps--2Plqq{margin:auto;text-align:left;padding:5% 1rem 0;max-width:400px;line-height:1}.index-module--Steps--2Plqq h4,.index-module--Steps--2Plqq li,.index-module--Steps--2Plqq ul{list-style-type:none;padding:0;margin:0}.index-module--Steps--2Plqq li{margin-bottom:1rem}.index-module--Steps--2Plqq .index-module--Inner--1eYQv{display:flex;flex-flow:nowrap;padding:1rem 1rem 0}.index-module--Steps--2Plqq .index-module--Index--2iAgE{flex-shrink:1}.index-module--Steps--2Plqq .index-module--Index--2iAgE strong{position:relative;display:inline-block;text-align:center;font-weight:700;border-radius:50%;background-color:#fff;color:#40e0d0;font-size:1em;padding:.5em .75em;box-shadow:0 0 1em rgba(64,224,208,.4)}.index-module--Steps--2Plqq .index-module--Text--1Xgj4{flex-grow:1;padding-left:1rem}.index-module--Steps--2Plqq .index-module--Text--1Xgj4 h4{padding-top:.5em;color:#00ced1;font-weight:400}.index-module--Steps--2Plqq .index-module--Text--1Xgj4 h4 em{font-style:normal;font-weight:900}.index-module--Steps--2Plqq .index-module--Text--1Xgj4 .index-module--Description--2Zoob{margin-top:.7rem;font-size:.8rem;padding-right:1rem;line-height:1.25}@media screen and (min-width:800px){.index-module--Steps--2Plqq{max-width:1000px}.index-module--Steps--2Plqq ul{display:flex}.index-module--Steps--2Plqq ul li{flex:1 1;margin-bottom:0}}.container-fluid{margin-right:auto;margin-left:auto;padding-right:2rem;padding-left:2rem}.row{box-sizing:border-box;display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.row.reverse{flex-direction:row-reverse}.col.reverse{flex-direction:column-reverse}.col-xs,.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{box-sizing:border-box;flex:0 0 auto;padding-right:1rem;padding-left:1rem}.col-xs{flex-grow:1;flex-basis:0;max-width:100%}.col-xs-1{flex-basis:8.333%;max-width:8.333%}.col-xs-2{flex-basis:16.667%;max-width:16.667%}.col-xs-3{flex-basis:25%;max-width:25%}.col-xs-4{flex-basis:33.333%;max-width:33.333%}.col-xs-5{flex-basis:41.667%;max-width:41.667%}.col-xs-6{flex-basis:50%;max-width:50%}.col-xs-7{flex-basis:58.333%;max-width:58.333%}.col-xs-8{flex-basis:66.667%;max-width:66.667%}.col-xs-9{flex-basis:75%;max-width:75%}.col-xs-10{flex-basis:83.333%;max-width:83.333%}.col-xs-11{flex-basis:91.667%;max-width:91.667%}.col-xs-12{flex-basis:100%;max-width:100%}.col-xs-offset-1{margin-left:8.333%}.col-xs-offset-2{margin-left:16.667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.333%}.col-xs-offset-5{margin-left:41.667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.333%}.col-xs-offset-8{margin-left:66.667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.333%}.col-xs-offset-11{margin-left:91.667%}.start-xs{justify-content:flex-start;text-align:start}.center-xs{justify-content:center;text-align:center}.end-xs{justify-content:flex-end;text-align:end}.top-xs{align-items:flex-start}.middle-xs{align-items:center}.bottom-xs{align-items:flex-end}.around-xs{justify-content:space-around}.between-xs{justify-content:space-between}.first-xs{order:-1}.last-xs{order:1}@media only screen and (min-width:48em){.container{width:46rem}.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{box-sizing:border-box;flex:0 0 auto;padding-right:1rem;padding-left:1rem}.col-sm{flex-grow:1;flex-basis:0;max-width:100%}.col-sm-1{flex-basis:8.333%;max-width:8.333%}.col-sm-2{flex-basis:16.667%;max-width:16.667%}.col-sm-3{flex-basis:25%;max-width:25%}.col-sm-4{flex-basis:33.333%;max-width:33.333%}.col-sm-5{flex-basis:41.667%;max-width:41.667%}.col-sm-6{flex-basis:50%;max-width:50%}.col-sm-7{flex-basis:58.333%;max-width:58.333%}.col-sm-8{flex-basis:66.667%;max-width:66.667%}.col-sm-9{flex-basis:75%;max-width:75%}.col-sm-10{flex-basis:83.333%;max-width:83.333%}.col-sm-11{flex-basis:91.667%;max-width:91.667%}.col-sm-12{flex-basis:100%;max-width:100%}.col-sm-offset-1{margin-left:8.333%}.col-sm-offset-2{margin-left:16.667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.333%}.col-sm-offset-5{margin-left:41.667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333%}.col-sm-offset-8{margin-left:66.667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.333%}.col-sm-offset-11{margin-left:91.667%}.start-sm{justify-content:flex-start;text-align:start}.center-sm{justify-content:center;text-align:center}.end-sm{justify-content:flex-end;text-align:end}.top-sm{align-items:flex-start}.middle-sm{align-items:center}.bottom-sm{align-items:flex-end}.around-sm{justify-content:space-around}.between-sm{justify-content:space-between}.first-sm{order:-1}.last-sm{order:1}}@media only screen and (min-width:62em){.container{width:61rem}.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{box-sizing:border-box;flex:0 0 auto;padding-right:1rem;padding-left:1rem}.col-md{flex-grow:1;flex-basis:0;max-width:100%}.col-md-1{flex-basis:8.333%;max-width:8.333%}.col-md-2{flex-basis:16.667%;max-width:16.667%}.col-md-3{flex-basis:25%;max-width:25%}.col-md-4{flex-basis:33.333%;max-width:33.333%}.col-md-5{flex-basis:41.667%;max-width:41.667%}.col-md-6{flex-basis:50%;max-width:50%}.col-md-7{flex-basis:58.333%;max-width:58.333%}.col-md-8{flex-basis:66.667%;max-width:66.667%}.col-md-9{flex-basis:75%;max-width:75%}.col-md-10{flex-basis:83.333%;max-width:83.333%}.col-md-11{flex-basis:91.667%;max-width:91.667%}.col-md-12{flex-basis:100%;max-width:100%}.col-md-offset-1{margin-left:8.333%}.col-md-offset-2{margin-left:16.667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.333%}.col-md-offset-5{margin-left:41.667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333%}.col-md-offset-8{margin-left:66.667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.333%}.col-md-offset-11{margin-left:91.667%}.start-md{justify-content:flex-start;text-align:start}.center-md{justify-content:center;text-align:center}.end-md{justify-content:flex-end;text-align:end}.top-md{align-items:flex-start}.middle-md{align-items:center}.bottom-md{align-items:flex-end}.around-md{justify-content:space-around}.between-md{justify-content:space-between}.first-md{order:-1}.last-md{order:1}}@media only screen and (min-width:75em){.container{width:71rem}.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{box-sizing:border-box;flex:0 0 auto;padding-right:1rem;padding-left:1rem}.col-lg{flex-grow:1;flex-basis:0;max-width:100%}.col-lg-1{flex-basis:8.333%;max-width:8.333%}.col-lg-2{flex-basis:16.667%;max-width:16.667%}.col-lg-3{flex-basis:25%;max-width:25%}.col-lg-4{flex-basis:33.333%;max-width:33.333%}.col-lg-5{flex-basis:41.667%;max-width:41.667%}.col-lg-6{flex-basis:50%;max-width:50%}.col-lg-7{flex-basis:58.333%;max-width:58.333%}.col-lg-8{flex-basis:66.667%;max-width:66.667%}.col-lg-9{flex-basis:75%;max-width:75%}.col-lg-10{flex-basis:83.333%;max-width:83.333%}.col-lg-11{flex-basis:91.667%;max-width:91.667%}.col-lg-12{flex-basis:100%;max-width:100%}.col-lg-offset-1{margin-left:8.333%}.col-lg-offset-2{margin-left:16.667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.333%}.col-lg-offset-5{margin-left:41.667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333%}.col-lg-offset-8{margin-left:66.667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.333%}.col-lg-offset-11{margin-left:91.667%}.start-lg{justify-content:flex-start;text-align:start}.center-lg{justify-content:center;text-align:center}.end-lg{justify-content:flex-end;text-align:end}.top-lg{align-items:flex-start}.middle-lg{align-items:center}.bottom-lg{align-items:flex-end}.around-lg{justify-content:space-around}.between-lg{justify-content:space-between}.first-lg{order:-1}.last-lg{order:1}}.no-gutter{padding:0;margin:0}
+
+ /*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */*{max-width:100%;box-sizing:border-box}html{font-size:20px;line-height:1.15;-webkit-text-size-adjust:100%}body{font-family:Source Sans Pro,"sans-serif";font-weight:300;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,h1{margin:0}h1{font-size:2rem}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1rem}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1rem}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25rem}sup{top:-.5rem}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625rem}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-itrem}[hidden],template{display:none}.pad-s{padding:1rem}.pad-m{padding:2.5rem}.pad-l{padding:5rem}.topicseed-copy{font-family:Georgia,serif;font-weight:700;letter-spacing:1pt;background-image:url(https://topicseed.com/assets/logos/topicseed-visual-black-xs.png);background-size:1.2rem 1.2rem;background-repeat:no-repeat;background-position:100%;padding-right:1.5rem;color:#000}:root{--padding-xs:1rem;--header-size:.9rem;--max-width:1000px;--max-hero-width:70%;--side-padding:5%;--serif:Georgia,"Times New Roman",Times,serif;--sans-serif:"Source Sans Pro","Open Sans",sans;--sans-serif-title:Lato,"Source Sans Pro",sans}.row-valign-center{align-items:center;justify-content:center}.Navigation-module--navigation--2Ttnx{background-color:transparent;display:flex;font-family:Source Sans Pro;font-size:var(--header-size)}.Navigation-module--navigation--2Ttnx *{padding:0;margin:0;line-height:1;list-style-type:none}.Navigation-module--navigation--2Ttnx .Navigation-module--padding--JanqS{padding:1rem}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4{flex-shrink:1}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4 a{display:block}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4 a img{display:inline-block;height:var(--header-size)}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4 span{font-family:Georgia,Times New Roman,Times,serif;font-weight:600}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4 .Navigation-module--navLink--3Ceps{opacity:1}.Navigation-module--navigation--2Ttnx .Navigation-module--branding--QzOe4 .Navigation-module--navLink--3Ceps:hover{color:#000}.Navigation-module--navigation--2Ttnx .Navigation-module--toggler--1HP5t{display:block;padding:1rem!important;margin:0!important;font-size:1rem;outline:0;border:0;font-weight:600;cursor:pointer;float:right}.Navigation-module--navigation--2Ttnx .Navigation-module--menuToggle--2a0Fx{display:none}.Navigation-module--navigation--2Ttnx .Navigation-module--menuToggle--2a0Fx:checked+.Navigation-module--menu--3ilH3{display:block}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps{padding:1rem 0;margin:0 1rem;display:block;color:#000;font-weight:600;text-decoration:none;opacity:.6}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps.Navigation-module--active--tC-lF{opacity:1;border-top-color:#40e0d0}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps.Navigation-module--active--tC-lF:hover{border-top-color:#40e0d0}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps:hover{opacity:1;color:#40e0d0;border-top-color:#f0f0f0}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K{flex-grow:1}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K ul{display:none;text-align:center;padding:5%;position:fixed;top:3rem;left:0;height:100%;width:100%;background-color:#fff;z-index:99999}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K li{display:block;letter-spacing:.5pt}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K .Navigation-module--SigninNI--1oVXc{opacity:1!important}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K .Navigation-module--SigninNI--1oVXc a{background:#40e0d0;color:#fff;padding:.5rem .75em!important;opacity:1!important;border-radius:5px;border:0!important}@media screen and (min-width:771px){.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K ul{display:block;position:static;padding:0;text-align:right}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K ul li{display:inline-block;letter-spacing:.5pt}.Navigation-module--navigation--2Ttnx .Navigation-module--topMenu--2WS0K .Navigation-module--toggler--1HP5t{display:none}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps{border-top:8px solid #fafafa;opacity:.6}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps:hover{opacity:1;border-top-color:#f0f0f0}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps.Navigation-module--active--tC-lF{opacity:1;border-top-color:#40e0d0}.Navigation-module--navigation--2Ttnx .Navigation-module--navLink--3Ceps.Navigation-module--active--tC-lF:hover{color:#000}}.SiteFooter-module--siteFooter--2ZMf7{padding:5%;background-color:#f9f9f9;font-size:.8rem;border-top:1px solid #fefefe}.SiteFooter-module--LineOfLinks--17SUL{text-align:center}.SiteFooter-module--LineOfLinks--17SUL a{display:inline-block;color:#999;margin:0 .5rem;text-decoration:none}.SiteFooter-module--copyrightNotice--3uQ14{padding:2rem 0 0}.SiteFooter-module--copyrightNotice--3uQ14>p{width:100%;margin:0;text-align:center;color:#999;text-transform:uppercase;letter-spacing:1pt}.SimpleOptinForm-module--container--3JpKE{background-color:#fff;box-shadow:0 0 20px rgba(43,45,56,.08)!important;border:0 solid #eee;transition:all .15s ease;border-radius:5px}.SimpleOptinForm-module--container--3JpKE.SimpleOptinForm-module--fluid--1iPrt{width:100%}.SimpleOptinForm-module--container--3JpKE.SimpleOptinForm-module--maxed--1ICi6{max-width:1000px;margin:5% auto}.SimpleOptinForm-module--inner--1YsM0{padding:5%;background-color:#ff0;border-radius:5px}.SimpleOptinForm-module--inner--1YsM0 fieldset{border:0;padding:0;margin:0}.SimpleOptinForm-module--header--36bBg{text-align:center}.SimpleOptinForm-module--header--36bBg h1{display:block;text-transform:uppercase;font-weight:700;font-family:Lato;letter-spacing:1pt;font-size:1.5rem;margin-bottom:5px}.SimpleOptinForm-module--header--36bBg h2{display:block;font-size:1rem;padding:0;margin:0 0 5px;line-height:1.5}.SimpleOptinForm-module--fields--3BB2p{padding:1em 0 0}.SimpleOptinForm-module--fields--3BB2p .SimpleOptinForm-module--field--jE8AR{padding:0 0 20px;margin:5px 0;order:5;height:100%}.SimpleOptinForm-module--fields--3BB2p input[type=color],.SimpleOptinForm-module--fields--3BB2p input[type=date],.SimpleOptinForm-module--fields--3BB2p input[type=datetime-local],.SimpleOptinForm-module--fields--3BB2p input[type=datetime],.SimpleOptinForm-module--fields--3BB2p input[type=email],.SimpleOptinForm-module--fields--3BB2p input[type=month],.SimpleOptinForm-module--fields--3BB2p input[type=number],.SimpleOptinForm-module--fields--3BB2p input[type=password],.SimpleOptinForm-module--fields--3BB2p input[type=range],.SimpleOptinForm-module--fields--3BB2p input[type=search],.SimpleOptinForm-module--fields--3BB2p input[type=tel],.SimpleOptinForm-module--fields--3BB2p input[type=text],.SimpleOptinForm-module--fields--3BB2p input[type=time],.SimpleOptinForm-module--fields--3BB2p input[type=url],.SimpleOptinForm-module--fields--3BB2p input[type=week],.SimpleOptinForm-module--fields--3BB2p textarea{color:#666;border:1px solid #ccc;border-radius:3px;height:100%;width:100%;padding:1rem;font-weight:700}.SimpleOptinForm-module--fields--3BB2p select{position:relative;width:100%;height:100%;color:#666;background:#fff;line-height:1rem;border:1px solid #ccc;font-weight:700;min-height:3rem;padding-left:1rem}.SimpleOptinForm-module--btnWrapper--140rB .SimpleOptinForm-module--btn--2iMm_{width:100%;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;background:#e6e6e6;color:rgba(0,0,0,.8);font-size:12px;font-size:.75rem;line-height:1;cursor:pointer;outline:none;white-space:nowrap;display:inline-block;height:2.7rem;line-height:2.7rem;padding:0 1.25rem;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);background:#fff;border-radius:4px;font-size:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.05rem;color:#000;text-decoration:none;transition:all .15s ease;color:#fff;background-color:#40e0d0;text-shadow:0 1px 3px rgba(36,180,126,.4)}.SimpleOptinForm-module--errors--1zBn2{background-color:#fff;color:red;padding:1rem;margin:5px}.SimpleOptinForm-module--successful--3chKn .SimpleOptinForm-module--inner--1YsM0{background:#008b8b;color:#fff;text-align:center}.SimpleOptinForm-module--successful--3chKn .SimpleOptinForm-module--icon--2twVV{max-width:30%;margin:5% auto}.SimpleOptinForm-module--successful--3chKn .SimpleOptinForm-module--icon--2twVV img{display:block}.SimpleOptinForm-module--successful--3chKn .SimpleOptinForm-module--big--2ofKD{font-weight:700;font-size:1.2rem;max-width:70%;margin:auto}.changelog-module--Timeline--2qo-C,.changelog-module--TimelineItem--Lhj7q{list-style-type:none;padding:0;margin:0}.changelog-module--Timeline--2qo-C{position:relative;padding:5%;margin:auto;max-width:900px}.changelog-module--TimelineItem--Lhj7q{border-left:2px solid #00ced1;padding-left:2rem;padding-bottom:4rem;position:relative}@media (min-width:768px){.changelog-module--TimelineItem--Lhj7q{padding-bottom:3rem}}@media (min-width:1400px){.changelog-module--TimelineItem--Lhj7q{padding-bottom:5rem}}.changelog-module--TimelineItem--Lhj7q h2{margin-top:0;line-height:.5;color:#00ced1;font-size:1.5rem;font-weight:400}.changelog-module--TimelineItem--Lhj7q p{margin:0 0 1rem}.changelog-module--TimelineItem--Lhj7q:before{content:" ";width:14px;height:14px;position:absolute;left:-8px;background-color:#00ced1;border-radius:50%}.changelog-module--TimelineItem--Lhj7q:first-child:before{left:-8px}.changelog-module--TimelineItem--Lhj7q:last-child:before{left:-6px}.changelog-module--TimelineItem--Lhj7q:last-of-type{padding-bottom:0;border:0}.changelog-module--TimelineEntry--4YMAW{padding-top:15px;display:block}.changelog-module--TimelineEntry--4YMAW+.changelog-module--TimelineEntry--4YMAW{margin-top:15px}.changelog-module--TimelineEntry--4YMAW .changelog-module--TimelineEntryLabel--21UAa{font-size:16px;margin-bottom:1.5rem;color:#1a1a1a;display:block}@media (min-width:768px){.changelog-module--TimelineEntry--4YMAW{display:flex}.changelog-module--TimelineEntry--4YMAW .changelog-module--TimelineEntryLabel--21UAa{flex-shrink:1;min-width:100px}.changelog-module--TimelineEntry--4YMAW .changelog-module--TimelineEntryData--36e08{flex-grow:1;padding-left:2rem;padding-top:.25rem}}.changelog-module--Badge--2SdHf{font-weight:700;font-size:.8rem;text-transform:uppercase;padding:5px 10px;border-radius:5px;display:inline-block;letter-spacing:1px}.changelog-module--Badge--2SdHf.changelog-module--Success--1Ed07{background-color:#3dc372;color:#fff}.changelog-module--Badge--2SdHf.changelog-module--Warning--GE_Hw{background-color:#ffb24e;color:#fff}.changelog-module--Badge--2SdHf.changelog-module--Danger--2aJE-{background-color:#e44e56;color:#fff}.index-module--section--l4Kpe{position:relative}.index-module--sectionSplash--Wjz_m{padding:0 0 2rem;background-color:#fff}.index-module--sectionSplash--Wjz_m .index-module--left--1Ebqu{padding:1rem}.index-module--sectionSplash--Wjz_m header{text-align:left!important}@media screen and (min-width:1200px){.index-module--sectionSplash--Wjz_m{padding:5% 0}.index-module--sectionSplash--Wjz_m .index-module--left--1Ebqu{padding:10% 0 10% 10%}}.index-module--sectionSplash--Wjz_m .index-module--right--1qcuo{padding:5%}.index-module--sectionSplash--Wjz_m .index-module--mainTitle--FW4Uw{font-family:Lato;font-size:1.4rem}@media screen and (min-width:800px){.index-module--sectionSplash--Wjz_m .index-module--mainTitle--FW4Uw{font-size:1.9rem}}.index-module--sectionSplash--Wjz_m .index-module--changelogLink---xSR7{margin-top:.5rem}.index-module--sectionSplash--Wjz_m .index-module--changelogLink---xSR7 span{font-size:.85rem;font-style:italic}.index-module--sectionSplash--Wjz_m .index-module--changelogLink---xSR7 a{text-decoration:none;color:#999}.index-module--sectionSplash--Wjz_m p{margin-bottom:0;padding-bottom:0}.index-module--sectionSplash--Wjz_m .index-module--subheader--3gKPq{line-height:1.4}.index-module--sectionSplash--Wjz_m .index-module--splashScreenshot--2OaaW{max-width:100%;display:block;border-radius:3px;box-shadow:0 0 20px rgba(43,45,56,.08)!important;border:0 solid #eee}.index-module--sectionSplash--Wjz_m .index-module--btnList--K3Sjr>*{margin-bottom:.25rem}.index-module--sectionSplash--Wjz_m .index-module--btnList--K3Sjr>:last-child{opacity:.66}.index-module--sectionMentions--370ct{text-align:center;background-color:#f9f9f9;padding:2rem 1rem}.index-module--sectionMentions--370ct .index-module--mentionHeader--cYdR- p{display:block;text-transform:uppercase;color:#999;font-size:1.25em;text-align:center}.index-module--sectionMentions--370ct .index-module--mentionBox--1BzX5{padding:1rem 2rem}.index-module--sectionMentions--370ct .index-module--mentionBox--1BzX5 .index-module--imgMention--3R5vh{display:block;width:100%}@media screen and (min-width:900px){.index-module--sectionMentions--370ct{padding:2rem}.index-module--sectionMentions--370ct .index-module--mentionBox--1BzX5{padding:2rem 1rem}}.index-module--sectionPersonas--14yif{padding:2rem 0}@media screen and (min-width:900px){.index-module--sectionPersonas--14yif{padding:5% 0}}.index-module--sectionPersonas--14yif h3{color:#000;margin:0 0 2rem;text-align:center;font-size:1rem}@media screen and (min-width:900px){.index-module--sectionPersonas--14yif h3{font-size:1.7rem}}@media screen and (min-width:1200px){.index-module--sectionPersonas--14yif{padding:10% 5% 5%}}.index-module--sectionPersonas--14yif .index-module--box--2C1yX{border-radius:10px;box-shadow:0 0 3rem hsla(0,0%,39.2%,.1);background-color:hsla(0,0%,78.4%,.2);padding:2rem;margin-bottom:2rem;text-align:center}.index-module--sectionPersonas--14yif .index-module--box--2C1yX .index-module--heading--2EiHG{white-space:nowrap;line-height:1;text-transform:uppercase;margin-bottom:1rem}.index-module--sectionPersonas--14yif .index-module--box--2C1yX .index-module--heading--2EiHG img{height:3rem;display:inline-block}.index-module--sectionPersonas--14yif .index-module--box--2C1yX .index-module--heading--2EiHG h4{font-family:var(--sans-serif);font-size:1.5rem}.index-module--sectionPersonas--14yif .index-module--box--2C1yX p{font-family:var(--sans-serif);margin:0;padding:0;font-size:1rem}.index-module--Feature--3DL7n{padding:5% 0}.index-module--Feature--3DL7n .index-module--container--2IQ43{margin:auto}.index-module--Feature--3DL7n .index-module--Description--3WXED li,.index-module--Feature--3DL7n .index-module--Description--3WXED ul{list-style:none;padding:0;margin:0}.index-module--Feature--3DL7n .index-module--Description--3WXED li{line-height:1.5;font-size:.8em}@media screen and (min-width:800px){.index-module--Feature--3DL7n .index-module--Description--3WXED li{font-size:1em}}.index-module--Feature--3DL7n .index-module--Description--3WXED .index-module--svgListItem--1SQhP{height:1em;width:1em;vertical-align:middle;display:inline-block;margin-right:.5rem}@media screen and (min-width:800px){.index-module--Feature--3DL7n .index-module--Description--3WXED{font-size:1.25rem}}.index-module--Feature--3DL7n .index-module--Head--IJzHL{text-align:left;padding-bottom:1rem}.index-module--Feature--3DL7n .index-module--Head--IJzHL img{width:1.5rem}@media screen and (min-width:900px){.index-module--Feature--3DL7n .index-module--Head--IJzHL img{width:3rem}}.index-module--Feature--3DL7n .index-module--Head--IJzHL h2{line-height:1;font-size:1.5rem;margin:.5rem 0;padding:0}.index-module--Feature--3DL7n .index-module--Head--IJzHL h2 em,.index-module--Feature--3DL7n .index-module--Head--IJzHL h2 strong{font-family:Lato;text-transform:uppercase;font-style:normal}.index-module--Feature--3DL7n .index-module--Head--IJzHL h2 strong{font-weight:800}.index-module--Feature--3DL7n .index-module--Head--IJzHL h2 em{font-weight:100}@media screen and (min-width:900px){.index-module--Feature--3DL7n .index-module--Head--IJzHL h2{font-size:2.3rem}.index-module--Feature--3DL7n .index-module--Head--IJzHL h2 em{display:block}}.index-module--sectionLeadGenA--2Wqpy{padding:0 5% 5%;color:#fff;text-align:center}.index-module--sectionLeadGenA--2Wqpy .index-module--box--2C1yX{background-color:#40e0d0;padding:3% 10%}.index-module--sectionLatestBlogs--3ZHEt{margin-top:5%;padding:5%;background-color:#f9f9f9}.pricing-module--Container--tuRnU{padding:0 0 2rem}.pricing-module--RedAnn--16W00{text-align:center;margin:5% 0 0}.pricing-module--RedAnn--16W00 p{display:inline-block;background:#008b8b;color:#fff;font-weight:700;padding:1rem;margin:0 1rem 1rem;border-radius:10px}@media (max-width:900px){.pricing-module--paddedColLg--1M4yw{padding:0;margin:0}}.pricing-module--Comparison--Cbw4q{max-width:1200px;margin:0 auto;text-align:center;box-shadow:0 0 2rem rgba(68,74,102,.15);border-radius:5px}@media (min-width:900px){.pricing-module--Comparison--Cbw4q{margin:5% auto 2rem}}.pricing-module--Comparison--Cbw4q table{width:100%;border-collapse:collapse;border-spacing:0}.pricing-module--Comparison--Cbw4q td,.pricing-module--Comparison--Cbw4q th{empty-cells:show;padding:1rem}.pricing-module--Comparison--Cbw4q .pricing-module--Heading--2voQH{font-size:1.1rem;font-weight:700!important;border-bottom:0!important;padding-bottom:.5rem!important;padding-top:1rem!important}@media (min-width:900px){.pricing-module--Comparison--Cbw4q .pricing-module--Heading--2voQH{padding-top:2rem!important}}.pricing-module--Comparison--Cbw4q tfoot{background-color:#f5f5f5}.pricing-module--Comparison--Cbw4q tbody .pricing-module--FeatureNameRow--33vpW{display:none}.pricing-module--Comparison--Cbw4q tbody tr.pricing-module--GroupRow--ICQ71{color:#195a5b;background:#afeeee;font-weight:700}.pricing-module--Comparison--Cbw4q tbody tr.pricing-module--GroupRow--ICQ71 td{text-align:center}.pricing-module--Comparison--Cbw4q .pricing-module--Row--1jsXC{background:#f5f5f5}.pricing-module--Comparison--Cbw4q .pricing-module--TrWords--PzU-G{font-weight:900}.pricing-module--Comparison--Cbw4q .pricing-module--BlueTick--2_BxZ,.pricing-module--Comparison--Cbw4q .pricing-module--GreenTick--OVE5b,.pricing-module--Comparison--Cbw4q .pricing-module--RedTick--3es5i{font-weight:400}.pricing-module--Comparison--Cbw4q .pricing-module--BlueTick--2_BxZ{color:#0078c1}.pricing-module--Comparison--Cbw4q .pricing-module--RedTick--3es5i{color:#8b0000}.pricing-module--Comparison--Cbw4q .pricing-module--GreenTick--OVE5b{color:#009e2c}.pricing-module--Comparison--Cbw4q th{font-weight:400;padding:0}.pricing-module--Comparison--Cbw4q tr td:first-child{font-weight:700;text-align:left}.pricing-module--Comparison--Cbw4q .pricing-module--Qbo--3r0N0,.pricing-module--Comparison--Cbw4q .pricing-module--Qbse--2LRrW,.pricing-module--Comparison--Cbw4q .pricing-module--Tl--2lWYs{color:#fff;padding:1rem;font-size:13px;border-bottom:0}.pricing-module--Comparison--Cbw4q .pricing-module--Heading--2voQH th,.pricing-module--Comparison--Cbw4q .pricing-module--Tl--2lWYs th{padding-top:2rem}.pricing-module--Comparison--Cbw4q .pricing-module--Qbse--2LRrW{background:#0078c1;border-top-left-radius:3px;border-left:0}.pricing-module--Comparison--Cbw4q .pricing-module--Qbo--3r0N0{background:#009e2c;border-top-right-radius:3px;border-right:0}.pricing-module--Comparison--Cbw4q .pricing-module--PriceButton--2nANz{display:none;margin:1rem 0}.pricing-module--Comparison--Cbw4q .pricing-module--PriceInfo--OibUh{padding:.25rem}@media (min-width:639px){.pricing-module--Comparison--Cbw4q .pricing-module--PriceInfo--OibUh{padding:.5rem 1.5rem 1.5rem}}.pricing-module--Comparison--Cbw4q .pricing-module--PriceWas--V1z1e{display:none;color:#999;text-decoration:line-through}.pricing-module--Comparison--Cbw4q .pricing-module--PriceNow--3bQ-P span{color:#00ced1;font-size:2.5rem;font-weight:700}.pricing-module--Comparison--Cbw4q .pricing-module--PriceNow--3bQ-P span .pricing-module--PriceSmall--2JZYR{font-size:.6rem}.pricing-module--Comparison--Cbw4q .pricing-module--PriceTry--1DZ0J{display:none;font-size:.8rem}.pricing-module--Comparison--Cbw4q .pricing-module--PriceTry--1DZ0J a{color:#202020}@media (max-width:900px){.pricing-module--Comparison--Cbw4q td:first-child,.pricing-module--Comparison--Cbw4q th:first-child{display:none}.pricing-module--Comparison--Cbw4q tbody tr.pricing-module--GroupRow--ICQ71{display:table-row}.pricing-module--Comparison--Cbw4q tbody tr.pricing-module--GroupRow--ICQ71 td{display:table-cell}.pricing-module--Comparison--Cbw4q tbody tr.pricing-module--FeatureNameRow--33vpW{display:table-row;background:#f7f7f7}.pricing-module--Comparison--Cbw4q .pricing-module--Row--1jsXC{background:#fff}.pricing-module--Comparison--Cbw4q .pricing-module--PriceInfo--OibUh{border-top:0!important}}@media (max-width:639px){.pricing-module--Comparison--Cbw4q .pricing-module--PriceBuy--2O6fz{padding:.5rem 1rem}.pricing-module--Comparison--Cbw4q td,.pricing-module--Comparison--Cbw4q th{padding:.7rem .5rem}.pricing-module--Comparison--Cbw4q .pricing-module--HideMobile--3uRP8{display:none}.pricing-module--Comparison--Cbw4q .pricing-module--PriceNow--3bQ-P span{font-size:16px}.pricing-module--Comparison--Cbw4q .pricing-module--PriceSmall--2JZYR{font-size:16px!important;top:0;left:0}.pricing-module--Comparison--Cbw4q .pricing-module--Qbo--3r0N0,.pricing-module--Comparison--Cbw4q .pricing-module--Qbse--2LRrW{font-size:12px;padding:1rem .5rem}.pricing-module--Comparison--Cbw4q .pricing-module--PriceBuy--2O6fz{margin-top:1rem}.pricing-module--Comparison--Cbw4q .pricing-module--Heading--2voQH{font-size:13px}}.pricing-module--Comparison--Cbw4q .pricing-module--Promo--1P4K_{position:relative;text-align:left}.pricing-module--Comparison--Cbw4q .pricing-module--Promo--1P4K_ div{font-weight:700;line-height:1.3;color:#fff;position:relative;z-index:1;height:10rem;width:15.5rem;padding:1rem 0;left:.25rem;display:flex;align-items:center}.pricing-module--Comparison--Cbw4q .pricing-module--Promo--1P4K_ div span{display:block;padding-right:6rem;font-size:1.5rem;margin:-.5rem 0 0}.pricing-module--Comparison--Cbw4q .pricing-module--Promo--1P4K_ div:before{content:"";position:absolute;top:0;left:-1.55rem;width:100%;height:100%;background:url(https://copywritely.com/wp-content/themes/copywritely/design/assets/img/new-pricing/Vector-1.svg) no-repeat;background-size:contain;z-index:-1}.pricing-module--Comparison--Cbw4q .pricing-module--Promo--1P4K_ div:after{content:"";position:absolute;top:-6px;left:-1rem;width:1rem;height:100%;background:url(https://copywritely.com/wp-content/themes/copywritely/design/assets/img/new-pricing/Vector.svg) no-repeat;background-size:contain;z-index:-2}.StartScreen-module--StartScreen--2axSL{max-width:800px;margin-left:auto;margin-right:auto;text-align:center;padding:5% 0}.StartScreen-module--PageSelector--lVxle input{font-size:1rem;height:3rem;line-height:1rem;padding-left:.4rem;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;width:100%;border-radius:5px;-ms-box-shadow:inset 0 1px 2px rgba(0,0,0,.18);-o-box-shadow:inset 0 1px 2px rgba(0,0,0,.18);box-shadow:inset 0 1px 2px rgba(0,0,0,.18);-webkit-font-smoothing:antialiased;border:1px solid #bbb;border-top-color:#999;background:#fff}.StartScreen-module--PageSelector--lVxle ul{display:flex;list-style:none;padding:0;margin:0;flex-flow:row wrap}.StartScreen-module--PageSelector--lVxle ul li{flex-grow:1;display:block}.StartScreen-module--PageSelector--lVxle ul li strong{color:#999;font-weight:700;font-size:.9rem;letter-spacing:.3pt;border-radius:5px;margin:5px;background:#f9f9f9;display:block;padding:.5rem;cursor:pointer}.StartScreen-module--PageSelector--lVxle ul li strong:hover{color:#fff;background:#3ecf8e;text-shadow:0 1px 3px rgba(36,180,126,.4)}.Categories-module--CategoriesItem--2cxew,.Categories-module--CategoriesList--11a-r{padding:0;margin:0;list-style-type:none}.Categories-module--CategoriesList--11a-r{display:flex;flex-flow:row wrap;align-items:center;justify-content:center}.Categories-module--CategoryItem--1z3tl{flex-shrink:1;padding:.5rem;background:#fefbf3;border:1px solid #fff}.Categories-module--CategoryBox--3ZiK8 a{padding:5px 0 5px 1.75rem;display:inline-block;background-image:url(https://image.flaticon.com/icons/svg/148/148946.svg);background-repeat:no-repeat;background-size:1.1em 1.1rem;background-position:0;font-size:.7rem;color:#eb7937}.Header-module--header--3iSqR{padding:3% 1rem;background:#40e0d0;color:#fff}.Header-module--header--3iSqR h1{font-size:2.5rem;padding:0;margin:0;text-align:center}.Sections-module--sections--1_XZN{padding:5% 0}.Sections-module--SectionList--2P5Kd{position:relative;text-align:center;padding:0;margin:0}.Sections-module--SectionList--2P5Kd a{text-decoration:none}.Sections-module--SectionList--2P5Kd li,.Sections-module--SectionList--2P5Kd ul{list-style-type:none;padding:0;margin:0}.Sections-module--SectionList--2P5Kd .Sections-module--SectionList--2P5Kd{margin:2%}.Sections-module--SectionList--2P5Kd .Sections-module--ChildrenList--PftMZ .Sections-module--SectionBox--cSSDW{border-radius:5px}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW{padding:3% 2%;margin-bottom:3%}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW.Sections-module--depth1--3mZ7e{background:#f4f4f4}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW.Sections-module--depth2--3hZ_z{background:#e6e6e6}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW.Sections-module--depth3--yRnNL{background:#d2d2d2}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW.Sections-module--depth4--29pv1{background:#b7b7b7}.Sections-module--SectionList--2P5Kd :target:before{display:block;content:" ";padding-top:70px;visibility:hidden;pointer-events:none}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv{margin:0 0 50px;padding:0;line-height:1;font-size:1rem;opacity:1;font-weight:700}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d1--2w3x-{font-size:2rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d2--30bth{font-size:1.6rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d3--3A50T{font-size:1.3rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d4--18dhX{font-size:1.1rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d5---0OCD,.Sections-module--SectionList--2P5Kd .Sections-module--SectionBox--cSSDW .Sections-module--SectionTitle--2RPrv.Sections-module--d6--1ITSu{font-size:1rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionTitle--2RPrv small{display:inline-block;opacity:.7;margin-left:.5rem;font-size:.7rem;vertical-align:middle}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetails--3aWNI{font-size:.7rem;padding:0}.Sections-module--SectionList--2P5Kd ul.Sections-module--SectionDetailsList--vmAzD{display:flex;flex-flow:row wrap}.Sections-module--SectionList--2P5Kd ul.Sections-module--SectionDetailsList--vmAzD>li{flex:1 1}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetailsList--vmAzD>li em{font-style:normal;font-weight:700;text-transform:uppercase;margin-right:1rem;opacity:.6}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetailsList--vmAzD>li .Sections-module--all--1bdeY,.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetailsList--vmAzD>li .Sections-module--own--1YvPj{opacity:.5}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetailsList--vmAzD>li .Sections-module--own--1YvPj{margin-right:.5rem}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetailsList--vmAzD>li .Sections-module--all--1bdeY{opacity:.3}.Sections-module--SectionList--2P5Kd .Sections-module--SectionDetails--3aWNI li{display:block}.Sections-module--SectionList--2P5Kd ul.Sections-module--LinkList--RV43i{display:flex;flex-flow:row wrap;padding-top:1rem;justify-content:center;align-items:center}.Sections-module--SectionList--2P5Kd li.Sections-module--linkToItem--1Lhxz{margin:0 .5em .5em 0;flex-shrink:1}.Sections-module--SectionList--2P5Kd .Sections-module--linkToItem--1Lhxz>span{cursor:pointer;padding:.3em .6rem;border:1px solid #fff;background:#fff;border-radius:4px;flex-shrink:1;display:inline-block;font-size:.7rem;color:#999}.Sections-module--SectionList--2P5Kd .Sections-module--linkToItem--1Lhxz>span:hover{background:#999;color:#fff}.Sections-module--SectionList--2P5Kd>li:last-child .Sections-module--SectionBox--cSSDW{margin-bottom:0}.Related-module--related--mNNbZ li,.Related-module--related--mNNbZ ul{list-style-type:none;padding:0;margin:0;display:block;text-align:center}.Related-module--related--mNNbZ span{display:block;text-decoration:none;cursor:pointer}.Related-module--related--mNNbZ .Related-module--linkItem--3FTnw{position:relative}.Related-module--related--mNNbZ .Related-module--bg--32Ltm{position:absolute;left:0;right:0;margin-left:auto;margin-right:auto;height:100%;background:rgba(64,224,208,.2);z-index:1}.Related-module--related--mNNbZ .Related-module--box--2DbuI{position:relative;padding:5px;border-bottom:1px solid #fff;z-index:2;text-align:center}.Related-module--related--mNNbZ .Related-module--label--1ZZ9i,.Related-module--related--mNNbZ em{position:relative;display:inline-block;z-index:2;font-size:.8rem;padding:0;margin-top:10px;vertical-align:-webkit-baseline-middle}.Related-module--related--mNNbZ .Related-module--label--1ZZ9i{font-weight:700;color:#000;padding-right:.5rem}.Related-module--related--mNNbZ em{background:#fff;color:#666;min-width:2.5rem;text-align:center;font-weight:700;border-radius:5px;margin-left:5px;font-size:.7rem;padding:5px}.TableOfContents-module--ToC--2HVzo{background-color:#fff}.TableOfContents-module--ToC--2HVzo li,.TableOfContents-module--ToC--2HVzo ol{list-style-type:none;padding:0;margin:0}.TableOfContents-module--ToC--2HVzo a{text-decoration:none}.TableOfContents-module--TableOfContentsList--2LCac{display:flex;flex-flow:row wrap;text-align:left}.TableOfContents-module--TableOfContentsList--2LCac:first-child{counter-reset:section!important;list-style-type:none!important}.TableOfContents-module--TableOfContentsList--2LCac .TableOfContents-module--Shadowed--2Iym6{background-color:#fff;border-radius:5px;box-shadow:0 0 20px rgba(43,45,56,.08)!important;border:0 solid #eee;transition:all .15s ease}.TableOfContents-module--TableOfContentsList--2LCac ol{counter-reset:section!important;list-style-type:none!important;background:hsla(0,0%,78.4%,.2);font-size:90%}.TableOfContents-module--TableOfContentsList--2LCac .TableOfContents-module--TocSectionTitle--kaY7f{margin:0;line-height:1.5;opacity:1;font-weight:300;font-size:90%}.TableOfContents-module--TableOfContentsList--2LCac .TableOfContents-module--TocSectionTitle--kaY7f a{display:block;color:#666;padding:.5rem}.TableOfContents-module--TableOfContentsList--2LCac .TableOfContents-module--TocSectionTitle--kaY7f a:hover{color:#000}.TableOfContents-module--TableOfContentsList--2LCac .TableOfContents-module--TocSectionTitle--kaY7f a:before{counter-increment:section!important;content:counters(section,".") ". "!important}.TableOfContents-module--TableOfContentsList--2LCac>li{flex-grow:1}.TableOfContents-module--TableOfContentsList--2LCac>li>.TableOfContents-module--TocSectionBox--2ZPU0{margin:1rem;background:#fefefe;border:1px solid #f9f9f9;border-radius:5px}.TableOfContents-module--TableOfContentsList--2LCac>li>.TableOfContents-module--TocSectionBox--2ZPU0>.TableOfContents-module--TocSectionTitle--kaY7f{font-weight:700;margin:0}.TableOfContents-module--TableOfContentsList--2LCac>li:last-child .TableOfContents-module--TocSectionTitle--kaY7f{border-bottom:0}.TableOfContents-module--TableOfContentsList--2LCac>li .TableOfContents-module--TableOfContents--2GtsK .TableOfContents-module--SectionBox--3-WZI.TableOfContents-module--depth1--1qbk4{background:#f4f4f4}.TableOfContents-module--TableOfContentsList--2LCac>li .TableOfContents-module--TableOfContents--2GtsK .TableOfContents-module--SectionBox--3-WZI.TableOfContents-module--depth2--_vEYp{background:#e6e6e6}.TableOfContents-module--TableOfContentsList--2LCac>li .TableOfContents-module--TableOfContents--2GtsK .TableOfContents-module--SectionBox--3-WZI.TableOfContents-module--depth3--szDg6{background:#d2d2d2}.TableOfContents-module--TableOfContentsList--2LCac>li .TableOfContents-module--TableOfContents--2GtsK .TableOfContents-module--SectionBox--3-WZI.TableOfContents-module--depth4--3OJcj{background:#b7b7b7}.BigLoader-module--BigLoader--3aHwt p{font-size:2rem;font-weight:100;max-width:600px;margin:5% auto;text-align:center}.BigLoader-module--BigLoader--3aHwt .BigLoader-module--spinner--1n6pq{margin:5em auto;width:200px;height:200px;position:relative;text-align:center;animation:BigLoader-module--sk-rotate--1cV2B 2s linear infinite}.BigLoader-module--BigLoader--3aHwt .BigLoader-module--dot1--g3Ddg,.BigLoader-module--BigLoader--3aHwt .BigLoader-module--dot2--2BVb6{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#40e0d0;border-radius:100%;animation:BigLoader-module--sk-bounce--1Lgu8 2s ease-in-out infinite}.BigLoader-module--BigLoader--3aHwt .BigLoader-module--dot2--2BVb6{top:auto;bottom:0;animation-delay:-1s;background-color:#40e0d0}@keyframes BigLoader-module--sk-rotate--1cV2B{to{transform:rotate(1turn);-webkit-transform:rotate(1turn)}}@keyframes BigLoader-module--sk-bounce--1Lgu8{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}.PageHeader-module--pageHeader--3O4Vw{text-align:center;background-color:#f9f9f9}.PageHeader-module--inner---KwJO{padding:5%}.PageHeader-module--inner---KwJO>p{margin-left:auto;margin-right:auto;font-weight:400;line-height:1.5}.PageHeader-module--inner---KwJO>p:last-child{margin-bottom:0}@media (min-width:768px){.PageHeader-module--inner---KwJO>p{max-width:60%;font-size:1.5rem}}.FeatureListItem-module--Section--14Rwp{padding:3rem 1rem;margin:auto}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp{padding:5% 2rem}}@media screen and (max-width:991px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Row--o6opq>*{margin:0;padding:0}}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Visual--FLmjs img{display:block;border-radius:10px;padding:0;margin-left:auto;margin-right:auto;width:80%;max-width:500px}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Visual--FLmjs img{width:100%;max-width:none}}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h{position:relative;vertical-align:middle;text-align:center}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h h2{font-size:2rem}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h h2{margin:0 0 1em}}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h .FeatureListItem-module--Description--1Yj5u{padding:0 1rem}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h .FeatureListItem-module--Description--1Yj5u{padding:0}}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h .FeatureListItem-module--Description--1Yj5u p{letter-spacing:.5pt;font-weight:100;color:#666;font-size:1.1rem}.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h .FeatureListItem-module--Description--1Yj5u p strong{letter-spacing:.1pt;font-weight:400;color:#000}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h{padding:0 5% 0 10%}}@media screen and (min-width:1200px){.FeatureListItem-module--Section--14Rwp .FeatureListItem-module--Text--31U5h{padding:0 20% 0 10%}}@media screen and (min-width:991px){.FeatureListItem-module--Section--14Rwp.FeatureListItem-module--NotReverse--3-77E .FeatureListItem-module--Text--31U5h{text-align:left}.FeatureListItem-module--Section--14Rwp.FeatureListItem-module--Reverse--2CLbw .FeatureListItem-module--Text--31U5h{text-align:right;padding:0 10% 0 5%}}@media screen and (min-width:1200px){.FeatureListItem-module--Section--14Rwp.FeatureListItem-module--Reverse--2CLbw .FeatureListItem-module--Text--31U5h{text-align:right;padding:0 10% 0 20%}}.resources-module--Container--2tk_N{background-color:#f9f9f9;padding:0 1rem 2rem;margin:0}.resources-module--Container--2tk_N ol{list-style:none;max-width:1200px;margin:0 auto;padding:0;line-height:1}.resources-module--RI--U3JIv{position:relative;box-shadow:0 0 2rem hsla(0,0%,78.4%,.3);border-radius:10px;margin-bottom:2rem}.resources-module--Index--3vmnU{display:none;text-align:center;padding:1rem}.resources-module--Index--3vmnU span{font-size:2rem;font-weight:900;font-family:Lato,sans-serif;text-rendering:optimizeLegibility}.resources-module--Text--2NHJ6{padding:1rem}.resources-module--Text--2NHJ6 h3{margin:0 0 1rem;padding:0}.resources-module--Visual--1ktgu{padding:1rem}.resources-module--Visual--1ktgu svg{padding:5%}.resources-module--Visual--1ktgu img{width:100%;border-radius:10px!important}@media screen and (min-width:900px){.resources-module--Inner--2yfpW{display:flex;margin:0;max-width:none}.resources-module--Inner--2yfpW>*{align-self:center}.resources-module--Index--3vmnU{flex:1 1}.resources-module--Text--2NHJ6{flex:5 1}.resources-module--Visual--1ktgu{width:40%;flex:4 1}.resources-module--Visual--1ktgu img{padding:0}}@media screen and (min-width:1100px){.resources-module--Index--3vmnU{display:block}}.tags-module--vignetteList--2EhMa{padding:0 5% 5%;list-style-type:none;align-items:center;justify-content:center}.tags-module--vignetteList--2EhMa>*{padding:1%;list-style-type:none}.tags-module--vignetteList--2EhMa a{line-height:1;text-decoration:none;display:block;padding:1rem;border-radius:5px;background-color:#fff;color:#00ced1;font-weight:700;text-transform:uppercase;border:3px solid #00ced1}.tags-module--vignetteList--2EhMa a:hover{background-color:#00ced1;color:#fff}.tags-module--vignetteList--2EhMa a small{background:#fff;display:inline-block;text-align:center;color:#000;font-size:.7rem;padding:5px 8px;border-radius:50%}.ArticleVignette-module--vignette--z54ew{position:relative;background-color:#fff;border-radius:5px;box-shadow:0 0 10px rgba(43,45,56,.06)!important;border:0 solid #eee;transition:all .15s ease;margin:0 0 1.5rem}.ArticleVignette-module--vignette--z54ew:hover{box-shadow:0 0 20px rgba(43,45,56,.08)!important}.ArticleVignette-module--vignette--z54ew a{text-decoration:none;color:#000}.ArticleVignette-module--visual--2tA77{display:block}.ArticleVignette-module--heroImage--3Mc3z{height:auto;max-width:100%;width:100%;display:block;border-top-right-radius:5px;border-top-left-radius:5px}.ArticleVignette-module--textual--27b6d{padding:30px;border:none}.ArticleVignette-module--title--m_Ood{margin:0;padding:0;font-size:1.25rem;font-family:Lato}.ArticleVignette-module--meta--1q63w{font-weight:400;text-align:left;font-size:.8rem;letter-spacing:1px}.ArticleVignette-module--meta--1q63w>span{display:inline-block;margin:.75rem 0 .25rem;color:#666;white-space:nowrap;overflow:hidden;text-overflow:clip;padding-right:16px}.ArticleVignette-module--meta--1q63w>span:last-child{border-right:0;padding-right:0;margin-right:0}.ArticleVignette-module--updated--1iGG3{display:none}.ArticleVignette-module--excerpt--Kdaxc{padding:0;margin:0 auto;color:#666;font-size:.9rem;line-height:1.4}.blog-module--blogHeader--2rEBf{padding:5%;text-align:center}.blog-module--subheader--1bWY5{text-align:center;max-width:800px;padding:1rem;margin:auto;font-size:1.5rem;font-weight:100;font-style:italic;color:#999}.blog-module--vignetteList--BdqsD{padding:0 5% 5%}.blog-module--vignetteList--BdqsD>*{padding:2.5%;align-items:center;justify-content:center}.tag-module--vignetteList--1tB18{padding:0 5% 5%}.tag-module--vignetteList--1tB18>*{padding:2.5%;align-items:center;justify-content:center}.tag-module--bottom--28SSj{text-align:center;padding:0 5% 5%}.index-module--TeaserOptin--FVea1{font-size:1rem}.index-module--TeaserOptin--FVea1 header{font-weight:700;padding-bottom:.5em}@media screen and (max-width:600px){.index-module--TeaserOptin--FVea1{font-size:.8em}}.index-module--container--34rxR{background-color:#fff;box-shadow:0 0 20px rgba(43,45,56,.08)!important;border:0 solid #eee;transition:all .15s ease;border-radius:5px;background:#f9f9f9}.index-module--container--34rxR fieldset,.index-module--container--34rxR p{border:0;padding:0;margin:0}.index-module--inner--3kOD7{background:#fff;padding:.5em .5em .5em .75em}.index-module--inner--3kOD7 .index-module--email--3jzSr,.index-module--inner--3kOD7 .index-module--website--2It4m{display:flex}.index-module--inner--3kOD7 .index-module--email--3jzSr>input,.index-module--inner--3kOD7 .index-module--website--2It4m>input{flex-grow:1}.index-module--inner--3kOD7 .index-module--email--3jzSr .index-module--submitter--2CsUF,.index-module--inner--3kOD7 .index-module--website--2It4m .index-module--submitter--2CsUF{flex-shrink:1}.index-module--inner--3kOD7 input[type=color],.index-module--inner--3kOD7 input[type=date],.index-module--inner--3kOD7 input[type=datetime-local],.index-module--inner--3kOD7 input[type=datetime],.index-module--inner--3kOD7 input[type=email],.index-module--inner--3kOD7 input[type=month],.index-module--inner--3kOD7 input[type=number],.index-module--inner--3kOD7 input[type=password],.index-module--inner--3kOD7 input[type=range],.index-module--inner--3kOD7 input[type=search],.index-module--inner--3kOD7 input[type=tel],.index-module--inner--3kOD7 input[type=text],.index-module--inner--3kOD7 input[type=time],.index-module--inner--3kOD7 input[type=url],.index-module--inner--3kOD7 input[type=week],.index-module--inner--3kOD7 textarea{color:#666;border:1px solid #fff;border-radius:3px;padding:0;font-weight:400;outline:none}.index-module--Steps--W963K{display:flex;flex-flow:column wrap;flex-shrink:1;padding:0 0 0 .5em;justify-content:center;flex-direction:column;text-align:center}.index-module--Steps--W963K>div{flex-shrink:1;width:10px;height:10px;border-radius:50%;margin:3px 0;border:1px solid}.index-module--Steps--W963K>div.index-module--Done--3wzyP{background:#40e0d0;border-color:#40e0d0}.index-module--Steps--W963K>div.index-module--NotDone--1xW0M{border-color:rgba(175,238,238,.5)}.index-module--btn--324SS{border:0;width:100%;border-radius:3px;background:#e6e6e6;color:rgba(0,0,0,.8);font-size:12px;font-size:.75em;cursor:pointer;outline:none;white-space:nowrap;display:inline-block;height:2.7em;line-height:1;padding:0 1.25em;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px hsla(0,0%,39.2%,.08);background:#fff;border-radius:4px;font-size:1em;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#000;text-decoration:none;transition:all .15s ease;color:#fff;background-color:#40e0d0;text-shadow:0 1px 3px rgba(36,180,126,.4)}.index-module--ErrorList--oKLl3{margin:0 0 1em}.index-module--ErrorList--oKLl3 li{color:red}.index-module--optedIn--1c026 .index-module--inside--3uwon{color:#00ced1;display:flex;font-size:1.5em;padding:1em}.index-module--optedIn--1c026 .index-module--icon--1qvDc{flex-shrink:1;display:inline-block}.index-module--optedIn--1c026 .index-module--icon--1qvDc img{display:inline-block;height:1em;width:1em}.index-module--optedIn--1c026 .index-module--text--35wJN{padding-left:1em;flex-grow:1;font-weight:700;font-size:.9em}.index-module--optedIn--1c026 .index-module--text--35wJN em{display:block;margin-top:.5em;font-size:.8em;line-height:1;font-style:normal}.index-module--optedInNok--20AKD .index-module--inside--3uwon{color:#8b0000}.index-module--Submitting--22pTe{display:flex}.index-module--Submitting--22pTe .index-module--SubmittingText--18Hyc{flex-grow:1}.index-module--Submitting--22pTe .index-module--SubmittingText--18Hyc p{margin:0;padding:.4em 0 0;text-align:center;font-size:1em;color:#40e0d0;font-weight:700}.index-module--Submitting--22pTe .index-module--SubmittingGrid--1KSJ9{flex-shrink:1}.index-module--SubmittingGrid--1KSJ9{display:inline-block;position:relative;width:64px;height:64px}.index-module--SubmittingGrid--1KSJ9 div{position:absolute;width:13px;height:13px;border-radius:50%;background:#40e0d0;animation:index-module--LoadingGrid--2ksRm 1.5s linear infinite}.index-module--SubmittingGrid--1KSJ9 div:first-child{top:6px;left:6px;animation-delay:0s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(2){top:6px;left:26px;animation-delay:-.4s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(3){top:6px;left:45px;animation-delay:-.8s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(4){top:26px;left:6px;animation-delay:-.4s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(5){top:26px;left:26px;animation-delay:-.8s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(6){top:26px;left:45px;animation-delay:-1.2s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(7){top:45px;left:6px;animation-delay:-.8s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(8){top:45px;left:26px;animation-delay:-1.2s}.index-module--SubmittingGrid--1KSJ9 div:nth-child(9){top:45px;left:45px;animation-delay:-1.6s}@keyframes index-module--LoadingGrid--2ksRm{0%,to{opacity:1}50%{opacity:.3}}.index-module--Logo--48XJj .index-module--ToolName--1OHdX{display:inline-block;margin-left:1rem}.index-module--Name--2h7KK{margin:0;font-size:1.5rem}p.index-module--Excerpt--250I9{padding:0 5%;font-size:1rem!important;font-weight:300}.index-module--Container--lfHSi{padding:1rem}.index-module--Container--lfHSi li,.index-module--Container--lfHSi ul{list-style-type:none;padding:0;margin:0}.index-module--AddressBar--2timP{margin:1rem 0;padding:.5rem;font-size:.8rem;width:auto;display:inline-block;background-color:#fff;border-radius:10px;letter-spacing:1px}.index-module--AddressBar--2timP>.index-module--HostName--aSwf5,.index-module--AddressBar--2timP>.index-module--PathName--3Dn-s,.index-module--AddressBar--2timP>.index-module--Protocol--2v1sw{display:inline-block}.index-module--AddressBar--2timP>.index-module--HostName--aSwf5,.index-module--AddressBar--2timP>.index-module--Protocol--2v1sw{color:#006400}.index-module--AddressBar--2timP>.index-module--PathName--3Dn-s{color:#666}.index-module--ToC--NOuEy{text-align:center}.index-module--ToC--NOuEy a{display:block;padding:0 0 .5rem;text-transform:uppercase;text-decoration:none;color:#666}.index-module--ToC--NOuEy a:hover{color:#000}@media screen and (min-width:1000px){.index-module--Container--lfHSi{display:flex;padding:2rem 5%}.index-module--ToC--NOuEy{flex:1 1;align-self:flex-start;position:-webkit-sticky;position:sticky;top:0;text-align:right;margin-right:2rem;margin-bottom:2rem}.index-module--SectionArea--360Dr{flex:4 1}.index-module--SectionArea--360Dr .index-module--Section--g6OzV:last-of-type{margin-bottom:2rem}}@media screen and (min-width:1400px){.index-module--Container--lfHSi{padding:2rem 15%}}.index-module--Section--g6OzV{font-size:.9rem;padding-top:2rem}.index-module--Section--g6OzV .index-module--Empty--36Qlb{background-color:rgba(139,0,0,.1);color:#8b0000}.index-module--Section--g6OzV .index-module--Empty--36Qlb p{font-weight:700;padding:1em}@media screen and (min-width:800px){.index-module--Section--g6OzV .index-module--Empty--36Qlb p{padding:1em 1em 1em 5rem}}@media screen and (min-width:800px){.index-module--Section--g6OzV{font-size:1rem}}.index-module--Section--g6OzV .index-module--Padded--TRfUZ{padding:1rem}@media screen and (min-width:800px){.index-module--Section--g6OzV .index-module--Padded--TRfUZ{padding:2rem}}.index-module--Section--g6OzV .index-module--Inner--UoRCq{box-shadow:0 0 2.5rem hsla(0,0%,78.4%,.4);border-radius:10px}.index-module--Section--g6OzV ul{margin:0;padding:0;background-color:rgba(175,238,238,.329)}.index-module--Section--g6OzV li{padding:1em;border-bottom:1px solid #fff}@media screen and (min-width:800px){.index-module--Section--g6OzV li{padding:1rem 0 1rem 5rem}}.index-module--Section--g6OzV li .index-module--Icon--j19_I{height:.7em;vertical-align:middle}.index-module--Section--g6OzV p{font-size:1em;font-weight:300;margin:0 0 1em}.index-module--Section--g6OzV p:last-child{margin-bottom:0}.index-module--CallToAction--2wvfY{padding:4rem 0 2rem}.index-module--CallToAction--2wvfY p{padding:0;margin:0;font-weight:900}.index-module--CallToAction--2wvfY .index-module--Inner--UoRCq{box-shadow:0 0 2.5rem hsla(0,0%,78.4%,.5);border-radius:10px;padding:1rem;display:flex;align-items:center}.index-module--One--3iXeb .index-module--Inner--UoRCq{background-color:#00ced1;color:#fff;box-shadow:0 0 2.5rem rgba(0,206,209,.5)}.index-module--One--3iXeb .index-module--Inner--UoRCq .index-module--A--K9VGn{flex-grow:1;font-size:1.2em;padding-left:.5rem}.index-module--One--3iXeb .index-module--Inner--UoRCq .index-module--B--1rXOO{flex-shrink:1}.index-module--Two--NioYl .index-module--Inner--UoRCq{background-color:#673ab7;color:#fff;box-shadow:0 0 2.5rem rgba(103,58,183,.5)}.index-module--Two--NioYl .index-module--Inner--UoRCq .index-module--A--K9VGn{flex-grow:1;font-size:1.2em;padding-left:.5rem}.index-module--Two--NioYl .index-module--Inner--UoRCq .index-module--B--1rXOO{flex-shrink:1}.index-module--Point--3fnfO{position:relative;line-height:1.5}.index-module--Point--3fnfO .index-module--Title--1HSab{margin:0 0 1em;padding:0;font-weight:600;color:#2a305e;font-size:2em;line-height:1}@media screen and (min-width:800px){.index-module--Point--3fnfO{padding-left:3em}.index-module--Point--3fnfO:after,.index-module--Point--3fnfO:before{content:" ";position:absolute;border-radius:50%;left:0;top:0}.index-module--Point--3fnfO:before{width:2em;height:2em;background-color:#fff;box-shadow:0 .3em .6em 0 rgba(68,74,102,.1)}.index-module--Point--3fnfO:after{width:1em;height:1em;margin-left:.5em;margin-top:.5em}.index-module--Point--3fnfO.index-module--Purple--1T084:after{background-color:#795fdf}.index-module--Point--3fnfO.index-module--Gold--2BQoR:after{background-color:gold}.index-module--Point--3fnfO.index-module--Cyan--hXnrR:after{background-color:#0ff}.index-module--Point--3fnfO.index-module--Green--3vzjk:after{background-color:#adff2f}.index-module--Point--3fnfO.index-module--Gray--3TQb5:after{background-color:#dcdcdc}}.index-module--Loader--1ONIT{padding:5% 0;text-align:center}.index-module--Loader--1ONIT>*{margin:0;padding:0;font-weight:100}.index-module--Loader--1ONIT .index-module--Primary--7e9Vp{font-size:2rem}.index-module--Loader--1ONIT .index-module--Secondary--2p6O3{font-size:1rem}.index-module--Loader--1ONIT svg{width:300px;height:300px;margin:2rem auto;display:block}.index-module--ErrorPage--QYGDs{color:#8b0000;text-align:center;padding:5%}.Button-module--Button--3uC_E{display:inline-block;position:relative;text-align:center;font-size:1em}.Button-module--Button--3uC_E a{position:relative;cursor:pointer;outline:none;white-space:nowrap;display:inline-block;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);background:#fff;border-radius:4px;font-weight:600;text-transform:uppercase;letter-spacing:.05rem;color:#000;text-decoration:none;transition:all .15s ease;color:#fff;background:#40e0d0;text-shadow:0 1px 3px rgba(33,150,243,.4);border:1px solid #40e0d0}.Button-module--Button--3uC_E a:hover{background:#42e6d5;top:-1px}.Button-module--Button--3uC_E.Button-module--InvertedGreen--2Ek2f a{color:#40e0d0;border:1px solid #40e0d0;text-shadow:none;background:#fff}.Button-module--Button--3uC_E.Button-module--InvertedGreen--2Ek2f a:hover{background:#fcfcfc}.Button-module--Button--3uC_E.Button-module--InvertedPurple--2vyeI a{color:#673ab7;border:1px solid #673ab7;text-shadow:none;background:#fff}.Button-module--Button--3uC_E.Button-module--InvertedPurple--2vyeI a:hover{background:#fcfcfc}.Button-module--Button--3uC_E.Button-module--FluidButton--1xDTC,.Button-module--Button--3uC_E.Button-module--FluidButton--1xDTC a{display:block}.Button-module--Button--3uC_E.Button-module--Normal--OqCcE a{font-size:.9rem;padding:.75rem 1rem}.Button-module--Button--3uC_E.Button-module--Large--3-Fg7 a{font-size:1rem;padding:1rem 1.3rem}.Button-module--Button--3uC_E.Button-module--Small--3h1yA a{font-size:.8rem;padding:.6rem 1rem}.post-module--article--1SjHg h1,.post-module--article--1SjHg h2,.post-module--article--1SjHg h3,.post-module--article--1SjHg h4,.post-module--article--1SjHg h5{font-family:Lato}.post-module--article--1SjHg h2{color:#00ced1}.post-module--articleHeaderText--2QLQM{text-align:center;padding:5% 5% 0;margin:auto}.post-module--articleHeaderText--2QLQM h1{font-size:1.4rem;line-height:1.25;color:#00ced1}.post-module--excerpt--11hub{font-family:Source Sans Pro;font-weight:100;padding-top:1rem;padding-bottom:1rem;font-size:1.1rem;line-height:1.25;margin:auto}.post-module--metaList--WV8cT{list-style-type:none;margin:0;padding:0;font-style:italic}.post-module--metaList--WV8cT li{list-style-type:none;margin:0;padding:1em 0}.post-module--articleHero--yMBPa{margin:5% 0}.post-module--articleMain--2iunI{padding-bottom:3rem}.post-module--articleContents--iGVdC{font-family:Source Sans Pro}.post-module--articleContents--iGVdC>div>*{max-width:var(--max-width);padding-left:var(--side-padding);padding-right:var(--side-padding);margin:2rem auto}.post-module--articleContents--iGVdC>div>ul:first-of-type{border:1px solid #fcfcfc;padding:1rem 2rem;border-radius:10px;box-shadow:0 0 2rem rgba(0,0,0,.05);background:hsla(0,0%,78.4%,.05);margin:2rem 1rem 4rem}.post-module--articleContents--iGVdC>div>ul:first-of-type a{font-size:.8rem;text-decoration:none;color:#666}.post-module--articleContents--iGVdC>div>ul:first-of-type a:hover{color:#000}@media screen and (min-width:771px){.post-module--articleContents--iGVdC>div>ul:first-of-type a{font-size:1rem}}.post-module--articleContents--iGVdC>div>ul:first-of-type p{margin:0;padding:0}.post-module--articleContents--iGVdC>div>ul:first-of-type li{margin:0;padding:0 0 .25rem}.post-module--articleContents--iGVdC>div>ol li,.post-module--articleContents--iGVdC>div>ul li{margin-left:2rem}.post-module--articleContents--iGVdC>div>p code{background:#f0f0f0;padding:3px 8px;border-radius:5px;border:1px solid #c6c6c6;margin:0;color:#333}.post-module--articleContents--iGVdC>div>h1,.post-module--articleContents--iGVdC>div>h2,.post-module--articleContents--iGVdC>div>h3,.post-module--articleContents--iGVdC>div>h4,.post-module--articleContents--iGVdC>div>h5{line-height:1.25;margin-top:2.5em;margin-bottom:1em}.post-module--articleContents--iGVdC>div>h1 a,.post-module--articleContents--iGVdC>div>h2 a,.post-module--articleContents--iGVdC>div>h3 a,.post-module--articleContents--iGVdC>div>h4 a,.post-module--articleContents--iGVdC>div>h5 a{visibility:hidden}.post-module--articleContents--iGVdC>div>h1{font-size:2.2rem}.post-module--articleContents--iGVdC>div>h2{font-size:2rem;text-shadow:0 0 1rem rgba(187,235,234,.64)}.post-module--articleContents--iGVdC>div>h4{font-weight:400}.post-module--articleContents--iGVdC>div figcaption{font-size:.7rem;line-height:1.25;color:#cacaca;margin:.8em 2rem;text-align:center}.post-module--articleContents--iGVdC>div a{color:#009597;font-weight:400;text-decoration:underline}.post-module--articleContents--iGVdC>div a:hover{color:#00696b}@media screen and (min-width:771px){.post-module--articleHeaderText--2QLQM{padding:5% 5% 0}.post-module--articleHeaderText--2QLQM h1{font-size:2.5rem}.post-module--excerpt--11hub{font-size:1.5rem;line-height:1.5}.post-module--articleHero--yMBPa{max-width:var(--max-hero-width);margin:5% auto}.post-module--articleHero--yMBPa img{display:block;width:100%;max-width:100%;border-radius:10px!important;border:1px solid #eee}.post-module--articleContents--iGVdC{font-size:1.2rem;line-height:1.5}.post-module--articleContents--iGVdC>div>ul:first-of-type{padding:1rem 3rem;margin-left:auto;margin-right:auto}}@media screen and (min-width:1200px){.post-module--articleHeaderText--2QLQM{max-width:60%}}
+ ]]>
+ </style>
+ <meta name="generator" content="Gatsby 2.22.9" />
+ <link rel="shortcut icon" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/favicon.ico" />
+ <link rel="icon" type="image/png" sizes="16x16" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/favicon-16x16.png" />
+ <link rel="icon" type="image/png" sizes="32x32" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/favicon-32x32.png" />
+ <link rel="manifest" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/manifest.json" />
+ <meta name="mobile-web-app-capable" content="yes" />
+ <meta name="theme-color" content="#fff" />
+ <meta name="application-name" content="topicseed-website" />
+ <link rel="apple-touch-icon" sizes="57x57" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-57x57.png" />
+ <link rel="apple-touch-icon" sizes="60x60" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-60x60.png" />
+ <link rel="apple-touch-icon" sizes="72x72" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-72x72.png" />
+ <link rel="apple-touch-icon" sizes="76x76" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-76x76.png" />
+ <link rel="apple-touch-icon" sizes="114x114" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-114x114.png" />
+ <link rel="apple-touch-icon" sizes="120x120" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-120x120.png" />
+ <link rel="apple-touch-icon" sizes="144x144" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-144x144.png" />
+ <link rel="apple-touch-icon" sizes="152x152" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-152x152.png" />
+ <link rel="apple-touch-icon" sizes="167x167" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-167x167.png" />
+ <link rel="apple-touch-icon" sizes="180x180" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-180x180.png" />
+ <link rel="apple-touch-icon" sizes="1024x1024" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-icon-1024x1024.png" />
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+ <meta name="apple-mobile-web-app-title" content="topicseed-website" />
+ <link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 1)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-320x460.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-640x920.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-640x1096.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-750x1294.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-1182x2208.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-1242x2148.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-748x1024.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-768x1004.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-1496x2048.png" />
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" href="/icons-5f7390f8df97283d5b517dead9b4a9d5/apple-touch-startup-image-1536x2008.png" />
+ <title data-react-helmet="true">
+ Content Depth — Write Comprehensively About Your Core Topics | topicseed
+ </title>
+ <meta data-react-helmet="true" name="description" content="Content writers and marketers find it hard to write a lot of content about a very specific topic. They lose a lot of points on their content depth because they would rather focus on pushing thin content about plenty of topics." />
+ <meta data-react-helmet="true" name="tags" content="Content Depth,Topical Authority" />
+ <meta data-react-helmet="true" property="og:title" content="Content Depth — Write Comprehensively About Your Core Topics" />
+ <meta data-react-helmet="true" property="og:type" content="article" />
+ <meta data-react-helmet="true" property="og:url" content="https://topicseed.com/blog/content-depth-for-seo" />
+ <meta data-react-helmet="true" property="og:image" content="https://topicseed.com/static/9c97da26f6eeee98fc2e628ca3416226/57090/content-depth-seo.png" />
+ <meta data-react-helmet="true" property="og:description" content="Content writers and marketers find it hard to write a lot of content about a very specific topic. They lose a lot of points on their content depth because they would rather focus on pushing thin content about plenty of topics." />
+ <meta data-react-helmet="true" property="og:site_name" content="topicseed" />
+ <meta data-react-helmet="true" property="og:locale" content="en_US" />
+ <meta data-react-helmet="true" property="og:updated_time" content="2018-06-12T23:00:00.000Z" />
+ <meta data-react-helmet="true" property="article:modified_time" content="2018-06-12T23:00:00.000Z" />
+ <meta data-react-helmet="true" property="article:published_time" content="2018-06-12T23:00:00.000Z" />
+ <link rel="canonical" href="https://topicseed.com/blog/content-depth-for-seo" data-baseprotocol="https:" data-basehost="topicseed.com" />
+ <style type="text/css">
+ /*<![CDATA[*/
+ .anchor {
+ float: left;
+ padding-right: 4px;
+ margin-left: -20px;
+ }
+ h1 .anchor svg,
+ h2 .anchor svg,
+ h3 .anchor svg,
+ h4 .anchor svg,
+ h5 .anchor svg,
+ h6 .anchor svg {
+ visibility: hidden;
+ }
+ h1:hover .anchor svg,
+ h2:hover .anchor svg,
+ h3:hover .anchor svg,
+ h4:hover .anchor svg,
+ h5:hover .anchor svg,
+ h6:hover .anchor svg,
+ h1 .anchor:focus svg,
+ h2 .anchor:focus svg,
+ h3 .anchor:focus svg,
+ h4 .anchor:focus svg,
+ h5 .anchor:focus svg,
+ h6 .anchor:focus svg {
+ visibility: visible;
+ }
+ /*]]>*/
+ </style>
+ <script>
+ <![CDATA[
+ document.addEventListener("DOMContentLoaded", function(event) {
+ var hash = window.decodeURI(location.hash.replace('#', ''))
+ if (hash !== '') {
+ var element = document.getElementById(hash)
+ if (element) {
+ var offset = element.offsetTop
+ // Wait for the browser to finish rendering before scrolling.
+ setTimeout((function() {
+ window.scrollTo(0, offset - 0)
+ }), 0)
+ }
+ }
+ })
+ ]]>
+ </script>
+ <link rel="sitemap" type="application/xml" href="/sitemap.xml" />
+ <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:100,100i,200,200i,300,300i,400,400i,600,600i,700,700i,900,900i|Lato:300,400,400i,700" rel="stylesheet" />
+ <link as="script" rel="preload" href="/webpack-runtime-0492a572fdd49b8e1c9d.js" />
+ <link as="script" rel="preload" href="/framework-c078ab5cc0599490105f.js" />
+ <link as="script" rel="preload" href="/app-e61cbb9e5f9aaa06b962.js" />
+ <link as="script" rel="preload" href="/styles-9b6f388623a2ec93d35f.js" />
+ <link as="script" rel="preload" href="/885eb025e981378eedf422d5b3545d4eebce3f62-c969f725392e18e66f50.js" />
+ <link as="script" rel="preload" href="/a46159e2a7241999ec544c326fa84cca5dda2ca8-419ee48c76badafe338c.js" />
+ <link as="script" rel="preload" href="/4d8bd03769955e7ffa305e9df9fd8c45ea8ce544-20cfe20204c6ef10aa5c.js" />
+ <link as="script" rel="preload" href="/494aa2667243fb352b6c4f73ed1a8fa80c641942-1149805138126f0ca2a7.js" />
+ <link as="script" rel="preload" href="/component---src-templates-post-js-a7f7cfc98fbcd66feb7e.js" />
+ <link as="fetch" rel="preload" href="/page-data/blog/content-depth-for-seo/page-data.json" crossorigin="anonymous" />
+ <link as="fetch" rel="preload" href="/page-data/app-data.json" crossorigin="anonymous" />
+ </head>
+ <body>
+ <div id="___gatsby">
+ <div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper">
+ <div>
+ <div>
+ <nav class="Navigation-module--navigation--2Ttnx">
+ <div class="Navigation-module--branding--QzOe4">
+ <a class="Navigation-module--navLink--3Ceps" href="/"><span>topicseed<!-- --> <img src="https://topicseed.com/assets/logos/topicseed-visual-black-xs.png" alt="topicseed logo" /></span></a>
+ </div>
+ <div class="Navigation-module--topMenu--2WS0K">
+ <label class="Navigation-module--navLink--3Ceps Navigation-module--toggler--1HP5t" for="menu-toggle">☰</label><input type="checkbox" id="menu-toggle" class="Navigation-module--menuToggle--2a0Fx" aria-label="Toggle Menu" />
+ <ul class="Navigation-module--menu--3ilH3">
+ <li>
+ <a class="Navigation-module--navLink--3Ceps" href="/features">Features</a>
+ </li>
+ <li>
+ <a class="Navigation-module--navLink--3Ceps" href="/pricing">Pricing</a>
+ </li>
+ <li>
+ <a class="Navigation-module--navLink--3Ceps" href="/resources">Free SEO Tools</a>
+ </li>
+ <li>
+ <a class="Navigation-module--navLink--3Ceps Navigation-module--active--tC-lF" href="/blog">Blog</a>
+ </li>
+ </ul>
+ </div>
+ </nav>
+ </div>
+ <main class="siteMain">
+ <article class="post-module--article--1SjHg">
+ <header>
+ <div class="post-module--articleHeaderText--2QLQM">
+ <h1>
+ Content Depth — Write Comprehensively About Your Core Topics
+ </h1>
+ <p class="post-module--excerpt--11hub">
+ Content writers and marketers find it hard to write a lot of content about a very specific topic. They lose a lot of points on their content depth because they would rather focus on pushing thin content about plenty of topics.
+ </p>
+ <ul class="post-module--metaList--WV8cT">
+ <li>
+ <small>On <!-- -->6/13/2018<!-- --> by <!-- -->@lazharichir</small>
+ </li>
+ </ul>
+ </div>
+ <div class="post-module--articleHero--yMBPa">
+ <div class="gatsby-image-wrapper" style="position:relative;overflow:hidden">
+ <div aria-hidden="true" style="width:100%;padding-bottom:50%"></div><img aria-hidden="true" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABgElEQVQoz2WSS2vCUBCF88dFfJt3dBFJ3fmKG7vTWruwIEithbQiXVmkEhvjTWq0xih10dNcShUPNzA35JtzZgjzdaHNZnM4HEajUTweVxSFZVlRFFVVRZ1IJOKhstksx3HMJbzF2W4JIbqup1IpWZIeB4PpZFIul2OxmCgKsiyjXS6X+4e3odbr9Wq1wpUslyvHue92FVkGhq95noc5JaFMJsPsQgVBgMchxDJNe7FAC9uyng3jdTzWazVk7vV6T8Mh4HQ6nUwmaXgmONHa83CoP8LfttuFgorZqpXqTauVz+cjkQhgls0Kwm/4E3i/3/m+6zjwRITv4/FtMtE0DQuLRqM8x103GjjoBX+anDlh93Ajtv3pupgZV8uyapXKXadTKpUe+v0Xw6jX6xSjk5/Fhnzf9zwP/mjxYZrmbPY+nV5pmiAKXCgwkiTR+gzeBwEYaz5f2jbMsXaXkFaziTlhxYdiQ6E4n/nPGQujNX4VbKFYLGK98AEjCDx1Bok3P/kSytq5UkC3AAAAAElFTkSuQmCC" alt="Content Depth — Write Comprehensively About Your Core Topics" style="position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:center;opacity:1;transition-delay:500ms" /><noscript><picture><source srcset="/static/9c97da26f6eeee98fc2e628ca3416226/d9446/content-depth-seo.png 158w, /static/9c97da26f6eeee98fc2e628ca3416226/2f6e7/content-depth-seo.png 315w, /static/9c97da26f6eeee98fc2e628ca3416226/57090/content-depth-seo.png 630w, /static/9c97da26f6eeee98fc2e628ca3416226/4ace0/content-depth-seo.png 945w, /static/9c97da26f6eeee98fc2e628ca3416226/fb0fe/content-depth-seo.png 1260w, /static/9c97da26f6eeee98fc2e628ca3416226/dc9f7/content-depth-seo.png 2000w" sizes="(max-width: 630px) 100vw, 630px" /><img loading="lazy" sizes="(max-width: 630px) 100vw, 630px" srcset="/static/9c97da26f6eeee98fc2e628ca3416226/d9446/content-depth-seo.png 158w, /static/9c97da26f6eeee98fc2e628ca3416226/2f6e7/content-depth-seo.png 315w, /static/9c97da26f6eeee98fc2e628ca3416226/57090/content-depth-seo.png 630w, /static/9c97da26f6eeee98fc2e628ca3416226/4ace0/content-depth-seo.png 945w, /static/9c97da26f6eeee98fc2e628ca3416226/fb0fe/content-depth-seo.png 1260w, /static/9c97da26f6eeee98fc2e628ca3416226/dc9f7/content-depth-seo.png 2000w" src="/static/9c97da26f6eeee98fc2e628ca3416226/57090/content-depth-seo.png" alt="Content Depth — Write Comprehensively About Your Core Topics" style="position:absolute;top:0;left:0;opacity:1;width:100%;height:100%;object-fit:cover;object-position:center" /></picture></noscript>
+ </div>
+ </div>
+ </header>
+ <main class="post-module--articleMain--2iunI">
+ <div class="post-module--articleContents--iGVdC">
+ <div>
+ <ul>
+ <li>
+ <a href="#assess-how-deep-is-your-content">Assess How Deep Is Your Content</a>
+ </li>
+ <li>
+ <a href="#rewrite-with-content-depth-in-mind">Rewrite With Content Depth In Mind</a>
+ </li>
+ <li>
+ <a href="#yes-content-depth-and-breadth-overlap">Yes, Content Depth and Breadth Overlap</a>
+ </li>
+ <li>
+ <a href="#depth-of-content--quality--frequency">Depth of Content = Quality + Frequency</a>
+ </li>
+ </ul>
+ <p>
+ <strong>Content depth</strong> is an arbitrary score or rating of how comprehensive the coverage of a specific topic is within a piece of content. <strong>Content breadth</strong> is an arbitrary grading of how many related subjects are you covering within your content.
+ </p>
+ <p>
+ And this distinction is important to make and establish from the beginning. Effective <a href="https://topicseed.com/blog/what-is-topical-authority" target="_blank" rel="nofollow noopener noreferrer"><strong>topical authority</strong></a> can only be gained when you use both content depth and content breadth in your overall content strategy for rapid search engine optimization gains. However, because most content writers prefer to write a little bit about many things rather than write a lot about one thing, you end up with a too little substance spread very thin.
+ </p>
+ <p>
+ Content depth should be the urgent priority for your content marketing strategy, and clearly defined in your <a href="/blog/content-briefs">content briefs</a>. Start by dominating your own core topics, before venturing across the pond and write about linked subject matters. Otherwise, you are the opposite of an authority as the definition states that an authority is <em>“a person with extensive or specialized knowledge about a subject; an expert”.</em> Lastly, do not mistake&#160;article depth vs. article length: a&#160;blog post’s extreme wordcount has nothing to do with its content depth.
+ </p>
+ <h2 id="assess-how-deep-is-your-content">
+ <a href="#assess-how-deep-is-your-content" aria-label="assess how deep is your content permalink" class="anchor"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16">
+ <path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Assess How Deep Is Your Content
+ </h2>
+ <p>
+ The first task on your list, right now, is to shortlist your core topics. What are you trying to be an expert on? Then, go through each one of your pieces of content and understand how well each blog post is covering&#160;its focus topic(s). Not how many times specific keywords appear, or how well the article is outlined and structured.
+ </p>
+ <p>
+ Put yourself in the shoes of an ignorant reader who seeks information. Read your article. <strong>And ask yourself how in-depth was the content you have written?</strong> I know the excuse you will come up with: this was written for beginners, therefore, it shouldn’t be too in-depth. And you are correct. Not every blog post is about absolute content depth otherwise we would only write one 10,000-word-long article, once and for all. But then, how well your beginner-level content pointing to your expert-level content?
+ </p>
+ <p>
+ In other words, each article should reach an incredible level of content depth for its expertise level. And then, provide further reading <em>(i.e. links)</em> to gain more knowledge, and depth. A lot of content editors write a beginner’s blog post and wait to see it perform well in order to write a more advanced sequel. Wrong. Give all the value so search engines can grade you highly on their authority scale for your core topics. Yes, it is a risk and you may write a dozen of articles on a specific topic that will never really rank at the top of SERPs, but <strong>reaching content depth is the first step towards SEO gains</strong>.
+ </p>
+ <p>
+ Remember that <strong>skyscraper content</strong> and <strong>10x content</strong> are not necessarily the answer. These content writing strategies state that in order to beat another piece of content, you need to write 10x more. Either in quantity with a 10x word count or in quality by putting times more information within your own piece of content. Such articles often become unreadable and discourage visitors from absorbing all the knowledge. The best alternative is the create <a href="https://topicseed.com/blog/how-broad-should-topics-be-for-pillar-pages" target="_blank" rel="nofollow noopener noreferrer">pillar pages</a> centered around core topics, and several articles dealing with each specific section in depth. This is <strong>deep content powered by a <a href="https://topicseed.com/blog/internal-linking-strategies-for-topic-clustering" target="_blank" rel="nofollow noopener noreferrer">smart internal linking strategy</a></strong>&#160;and search engines love that in this day and age where attention spans are short! <em>With that being said, avoid writing 600-word articles!</em>
+ </p>
+ <h2 id="rewrite-with-content-depth-in-mind">
+ <a href="#rewrite-with-content-depth-in-mind" aria-label="rewrite with content depth in mind permalink" class="anchor"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16">
+ <path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Rewrite With Content Depth In Mind
+ </h2>
+ <p>
+ Once you know which articles are lacking depth of knowledge and information, it is time to rethink each one. For each article, make a list of what essential pieces of information or data are missing. Then decide where to fit them, and decide whether the article would benefit from a full rewrite or not. As a rule of thumb, if you need to change a third of your article, you may need to rewrite it entirely. Of course, this does not mean erasing all work done prior, but it means starting afresh! Trying to <strong>fit deep content into an existing blog</strong> post gives you constraints so doing it from scratch can actually be easier to fight thin content.
+ </p>
+ <div>
+ <aside class="index-module--TeaserOptin--FVea1">
+ <header>
+ Optimize one of your blog posts immediately – for FREE!
+ </header>
+ <div class="index-module--container--34rxR">
+ <div class="index-module--inner--3kOD7">
+ <form class="index-module--website--2It4m">
+ <input type="url" placeholder="Blog Post URL" value="" required="" aria-label="Blog Post URL" />
+ <div class="index-module--submitter--2CsUF">
+ <button type="submit" class="index-module--btn--324SS">Next</button>
+ </div>
+ <div class="index-module--Steps--W963K">
+ <div class="index-module--Done--3wzyP"></div>
+ <div class="index-module--NotDone--1xW0M"></div>
+ <div class="index-module--NotDone--1xW0M"></div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </aside>
+ </div>
+ <p>
+ As explained above, make sure you do not force yourself to write a much longer article to reach a <a href="https://moz.com/blog/blog-post-length-frequency" target="_blank" rel="nofollow noopener noreferrer">magic word count</a>. And if you do, it has to be natural. In many cases, articles written months or years ago may need some upkeeping: trimming the fat and removing parts that are not bringing much value. Replace these with your newer and deeper content.
+ </p>
+ <p>
+ All content writers know that when you open Google Docs, WordPress, or your text editor of choice, you will inevitably count your focus keywords’ frequency. Although I understand (yet question) the value of keywords in modern SEO, do not become obsessed with reaching a magic number for your keywords. No reader coming from Google is out there counting how often your keywords are appearing. And search engine algorithms will penalize you for writing for robots, rather than humans.
+ </p>
+ <p>
+ With the massive rise of voice searches, <a href="/blog/featured-snippets-using-questions">users tend to use full questions for their search queries</a>. What used to be <code>top bottled water brands</code>&#160;is now <code>OK google, what is the best bottled-water brand in Texas</code>?&#160;The point being, <a href="https://topicseed.com/blog/keyword-search-volume-overrated" target="_blank" rel="nofollow noopener noreferrer"><strong>keywords are losing traction</strong></a> to leave space for a more natural language understanding of a blog post’s textual content, and meaning.
+ </p>
+ <h2 id="yes-content-depth-and-breadth-overlap">
+ <a href="#yes-content-depth-and-breadth-overlap" aria-label="yes content depth and breadth overlap permalink" class="anchor"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16">
+ <path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Yes, Content Depth and Breadth Overlap
+ </h2>
+ <p>
+ <em>“A topic can be defined as the company it keeps.”</em> A very accurate saying loved by ontologists&#160;within the fields of&#160;computational linguistics, and information science. In simpler terms, a topic and all the terminology it is encompassing will inevitably overlap with related topics. Which, in turn, will form <a href="https://topicseed.com/blog/topic-clusters-relationships" target="_blank" rel="nofollow noopener noreferrer"><strong>topic clusters</strong></a>.
+ </p>
+ <p>
+ For example, it is obvious that despite being two different topics, <code>digital advertising</code>&#160;and <code>content marketing</code>&#160;share some common phrases and terms. Inevitably, a website picking one as its core topic will use words in some blog posts that will identify the article as belonging to both topics, with a specific weight for each.
+ </p>
+ <p>
+ A keyword, phrase, or term, is not a prisoner to a single concept at all. This is how algorithms in natural language understanding can understand how two topics are related (e.g. read about <a href="https://en.wikipedia.org/wiki/Topic_model" target="_blank" rel="nofollow noopener noreferrer"><em>topic modeling</em></a>). Each topic has a specific <strong>vocabulary</strong>, a list of words and phrases commonly used in its context, and some of these terms are present in different vocabularies.
+ </p>
+ <p>
+ Therefore, content depth and content breadth are not to be opposed. Content marketers should use both strategies in order to reach ultimate <strong>topical authority</strong> over their choice of subject matters.
+ </p>
+ <h2 id="depth-of-content--quality--frequency">
+ <a href="#depth-of-content--quality--frequency" aria-label="depth of content quality frequency permalink" class="anchor"><svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16">
+ <path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Depth of Content = Quality + Frequency
+ </h2>
+ <p>
+ Up until recently, long-form blog posts generally were <strong>evergreen articles</strong> that generated a constant stream of organic traffic for a website. This was a lead magnet generation strategy which worked well: hire a writer, include the right keywords, reach over a 5,000-word word count, and hit publish. Then, wait.
+ </p>
+ <p>
+ Nowadays, in-depth content requires more effort over time in order to pay off. Writing a big article, as good as it is, will not get your anywhere near the level of <a href="https://topicseed.com/blog/topical-seo" target="_blank" rel="nofollow noopener noreferrer">topical breadth</a>&#160;required by Google to rank you first. Instead, your content marketing plan should be about having:
+ </p>
+ <ul>
+ <li>a <strong>comprehensive pillar page</strong> covering a unique topic, and
+ </li>
+ <li>
+ <strong>narrow-focused children articles</strong> to dig deeper.
+ </li>
+ </ul>
+ <p>
+ Search engines also look at how often you publish about a specific topic, and when was the last time it was written about. Nobody likes a <a href="https://www.copypress.com/blog/avoiding-blog-graveyard/" target="_blank" rel="nofollow noopener noreferrer">graveyard blog</a>, it just makes the reader lose trust; as if the writer was not good enough, therefore had no traffic, before entirely giving up. Deep content requires a sustained effort on your part to always new find ways to write about a specific subject. Sure, it will be easy at first. But what about five years later? Well, you will still need to hit publish, all about the very same topics you already covered years ago.
+ </p>
+ <p>
+ Tools and platforms such as topicseed are here to <a href="https://topicseed.com/blog/how-to-find-new-blog-post-ideas" target="_blank" rel="nofollow noopener noreferrer">help you find new article ideas</a> pertaining to your core topics within a few clicks and a few minutes. The number of web pages, Wikipedia articles, and pieces of content, our machine-learning algorithms can analyze in seconds would take you months to digest. Our <em>topicgraph</em>&#160;finds closely related concepts in order for your domain to <strong>reach topical authority through content depth and content breadth</strong>.
+ </p>
+ </div>
+ </div>
+ </main>
+ </article>
+ </main>
+ <aside class="SimpleOptinForm-module--container--3JpKE SimpleOptinForm-module--fluid--1iPrt">
+ <div class="SimpleOptinForm-module--inner--1YsM0">
+ <header class="SimpleOptinForm-module--header--36bBg">
+ <h1>
+ RECEIVE TOPICAL SEO TIPS
+ </h1>
+ <h2>
+ Learn about topical SEO, keyword clustering, and cool SEO content tools.
+ </h2>
+ </header>
+ <form>
+ <fieldset>
+ <div class="SimpleOptinForm-module--fields--3BB2p">
+ <div class="row">
+ <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
+ <p class="SimpleOptinForm-module--field--jE8AR">
+ <input type="text" placeholder="Full Name" value="" aria-label="Full Name" />
+ </p>
+ </div>
+ <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
+ <p class="SimpleOptinForm-module--field--jE8AR">
+ <input type="email" placeholder="Work Email" value="" required="" aria-label="Work Email" />
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
+ <p class="SimpleOptinForm-module--field--jE8AR">
+ <input type="text" placeholder="Organization" value="" aria-label="Organization" />
+ </p>
+ </div>
+ <div class="col-xs-12 col-sm-12 col-md-6 col-lg-6">
+ <p class="SimpleOptinForm-module--field--jE8AR">
+ <select>
+ <option value="Founder">
+ Founder
+ </option>
+ <option value="Director">
+ Director
+ </option>
+ <option value="Marketing Manager">
+ Marketing Manager
+ </option>
+ <option value="Marketing Executive">
+ Marketing Executive
+ </option>
+ <option value="Content Writer">
+ Content Writer
+ </option>
+ <option value="Content Editor">
+ Content Editor
+ </option>
+ </select>
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="SimpleOptinForm-module--btnWrapper--140rB">
+ <div class="row">
+ <div class="col-xs-12">
+ <button type="submit" class="SimpleOptinForm-module--btn--2iMm_">Let's go!</button>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+ </div>
+ </aside>
+ <footer class="SiteFooter-module--siteFooter--2ZMf7">
+ <div class="row row-valign-center">
+ <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
+ <div class="SiteFooter-module--LineOfLinks--17SUL">
+ <a href="/blog">Blog</a><a href="/agency">Agency</a><a href="/changelog">Changelog</a><a href="/contact">Contact</a><a href="/privacy">Privacy Policy</a>
+ </div>
+ </div>
+ </div>
+ <div class="row SiteFooter-module--copyrightNotice--3uQ14">
+ <p>
+ topicseed, 2018-2019 © All rights reserved. Operated by TOPICSEED LIMITED, a company registered in England &amp; Wales (Company No. 11746352)
+ </p>
+ </div>
+ </footer>
+ </div>
+ </div>
+ <div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div>
+ </div>
+ <script id="gatsby-script-loader">
+ /*<![CDATA[*/window.pagePath="/blog/content-depth-for-seo";/*]]>*/
+ </script>
+ <script id="gatsby-chunk-mapping">
+ /*<![CDATA[*/window.___chunkMapping={"app":["/app-e61cbb9e5f9aaa06b962.js"],"component---src-pages-404-js":["/component---src-pages-404-js-629775d27a2dc4ec3d2d.js"],"component---src-pages-agency-index-js":["/component---src-pages-agency-index-js-156249e08af981271f31.js"],"component---src-pages-blog-js":["/component---src-pages-blog-js-ed62d4c0a6ea689b9a52.js"],"component---src-pages-changelog-js":["/component---src-pages-changelog-js-b7fbb55334e481c3936b.js"],"component---src-pages-contact-js":["/component---src-pages-contact-js-4ceb754adec5e981fce7.js"],"component---src-pages-features-index-js":["/component---src-pages-features-index-js-27c81d134ae9eaf9e882.js"],"component---src-pages-index-js":["/component---src-pages-index-js-b673e5e0ada88bfb9d4f.js"],"component---src-pages-optimize-index-js":["/component---src-pages-optimize-index-js-4781b3602ad3a2bbb0da.js"],"component---src-pages-pricing-js":["/component---src-pages-pricing-js-77b60e8075370d840e83.js"],"component---src-pages-privacy-js":["/component---src-pages-privacy-js-d5d0d0327a6c36487ae1.js"],"component---src-pages-resources-js":["/component---src-pages-resources-js-22268944990d8ceb3017.js"],"component---src-pages-tags-js":["/component---src-pages-tags-js-32e47399c0e44d54942a.js"],"component---src-pages-wikibrowser-big-loader-js":["/component---src-pages-wikibrowser-big-loader-js-2480c4a479d098fa3c79.js"],"component---src-pages-wikibrowser-categories-js":["/component---src-pages-wikibrowser-categories-js-be322cf37349abed6674.js"],"component---src-pages-wikibrowser-header-js":["/component---src-pages-wikibrowser-header-js-27d60f97d0bfaa86d7d6.js"],"component---src-pages-wikibrowser-index-js":["/component---src-pages-wikibrowser-index-js-bd277474980a4e601169.js"],"component---src-pages-wikibrowser-page-selector-js":["/component---src-pages-wikibrowser-page-selector-js-9ffd7523bf4f0e012591.js"],"component---src-pages-wikibrowser-page-view-js":["/component---src-pages-wikibrowser-page-view-js-90d9ace6d852090ab3e0.js"],"component---src-pages-wikibrowser-related-js":["/component---src-pages-wikibrowser-related-js-268c847fb46795e93a25.js"],"component---src-pages-wikibrowser-sections-js":["/component---src-pages-wikibrowser-sections-js-29f9686b1aeaba46d44a.js"],"component---src-pages-wikibrowser-start-screen-js":["/component---src-pages-wikibrowser-start-screen-js-56c75be8ad98a4738dbc.js"],"component---src-pages-wikibrowser-table-of-contents-js":["/component---src-pages-wikibrowser-table-of-contents-js-311cd188a98614de1993.js"],"component---src-templates-post-js":["/component---src-templates-post-js-a7f7cfc98fbcd66feb7e.js"],"component---src-templates-tag-js":["/component---src-templates-tag-js-4475dea6846e23127a9d.js"]};/*]]>*/
+ </script>
+ <script src="/component---src-templates-post-js-a7f7cfc98fbcd66feb7e.js" async="async"></script>
+ <script src="/494aa2667243fb352b6c4f73ed1a8fa80c641942-1149805138126f0ca2a7.js" async="async"></script>
+ <script src="/4d8bd03769955e7ffa305e9df9fd8c45ea8ce544-20cfe20204c6ef10aa5c.js" async="async"></script>
+ <script src="/a46159e2a7241999ec544c326fa84cca5dda2ca8-419ee48c76badafe338c.js" async="async"></script>
+ <script src="/885eb025e981378eedf422d5b3545d4eebce3f62-c969f725392e18e66f50.js" async="async"></script>
+ <script src="/styles-9b6f388623a2ec93d35f.js" async="async"></script>
+ <script src="/app-e61cbb9e5f9aaa06b962.js" async="async"></script>
+ <script src="/framework-c078ab5cc0599490105f.js" async="async"></script>
+ <script src="/webpack-runtime-0492a572fdd49b8e1c9d.js" async="async"></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html
index 56df59658..92cea2194 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/tumblr/expected.html
@@ -1,11 +1,4 @@
-<div>
- <div id="posts">
-
-
- <div>
+<div id="posts">
<h3><a href="http://mcupdate.tumblr.com/post/96439224994/minecraft-18-the-bountiful-update">Minecraft 1.8 - The Bountiful Update</a></h3>
- <div><p>+ Added Granite, Andesite, and Diorite stone blocks, with smooth versions<br></br>+ Added Slime Block<br></br>+ Added Iron Trapdoor<br></br>+ Added Prismarine and Sea Lantern blocks<br></br>+ Added the Ocean Monument<br></br>+ Added Red Sandstone<br></br>+ Added Banners<br></br>+ Added Armor Stands<br></br>+ Added Coarse Dirt (dirt where grass won’t grow)<br></br>+ Added Guardian mobs, with item drops<br></br>+ Added Endermite mob<br></br>+ Added Rabbits, with item drops<br></br>+ Added Mutton and Cooked Mutton<br></br>+ Villagers will harvest crops and plant new ones<br></br>+ Mossy Cobblestone and Mossy Stone Bricks are now craftable<br></br>+ Chiseled Stone Bricks are now craftable<br></br>+ Doors and fences now come in all wood type variants<br></br>+ Sponge block has regained its water-absorbing ability and becomes wet<br></br>+ Added a spectator game mode (game mode 3)<br></br>+ Added one new achievement<br></br>+ Added “Customized” world type<br></br>+ Added hidden “Debug Mode” world type<br></br>+ Worlds can now have a world barrier<br></br>+ Added @e target selector for Command Blocks<br></br>+ Added /blockdata command<br></br>+ Added /clone command<br></br>+ Added /execute command<br></br>+ Added /fill command<br></br>+ Added /particle command<br></br>+ Added /testforblocks command<br></br>+ Added /title command<br></br>+ Added /trigger command<br></br>+ Added /worldborder command<br></br>+ Added /stats command<br></br>+ Containers can be locked in custom maps by using the “Lock” data tag<br></br>+ Added logAdminCommands, showDeathMessages, reducedDebugInfo, sendCommandFeedback, and randomTickSpeed game rules<br></br>+ Added three new statistics<br></br>+ Player skins can now have double layers across the whole model, and left/right arms/legs can be edited independently<br></br>+ Added a new player model with smaller arms, and a new player skin called Alex?<br></br>+ Added options for configuring what pieces of the skin that are visible<br></br>+ Blocks can now have custom visual variations in the resource packs<br></br>+ Minecraft Realms now has an activity chart, so you can see who has been online<br></br>+ Minecraft Realms now lets you upload your maps<br></br>* Difficulty setting is saved per world, and can be locked if wanted<br></br>* Enchanting has been redone, now costs lapis lazuli in addition to enchantment levels<br></br>* Villager trading has been rebalanced<br></br>* Anvil repairing has been rebalanced<br></br>* Considerable faster client-side performance<br></br>* Max render distance has been increased to 32 chunks (512 blocks)<br></br>* Adventure mode now prevents you from destroying blocks, unless your items have the CanDestroy data tag<br></br>* Resource packs can now also define the shape of blocks and items, and not just their textures<br></br>* Scoreboards have been given a lot of new features<br></br>* Tweaked the F3 debug screen<br></br>* Block ID numbers (such as 1 for stone), are being replaced by ID names (such as minecraft:stone)<br></br>* Server list has been improved<br></br>* A few minor changes to village and temple generation<br></br>* Mob heads for players now show both skin layers<br></br>* Buttons can now be placed on the ceiling<br></br>* Lots and lots of other changes<br></br>* LOTS AND LOTS of other changes<br></br>- Removed Herobrine</p></div>
- </div>
-
- </div>
- </div> \ No newline at end of file
+ <div><p>+ Added Granite, Andesite, and Diorite stone blocks, with smooth versions<br>+ Added Slime Block<br>+ Added Iron Trapdoor<br>+ Added Prismarine and Sea Lantern blocks<br>+ Added the Ocean Monument<br>+ Added Red Sandstone<br>+ Added Banners<br>+ Added Armor Stands<br>+ Added Coarse Dirt (dirt where grass won’t grow)<br>+ Added Guardian mobs, with item drops<br>+ Added Endermite mob<br>+ Added Rabbits, with item drops<br>+ Added Mutton and Cooked Mutton<br>+ Villagers will harvest crops and plant new ones<br>+ Mossy Cobblestone and Mossy Stone Bricks are now craftable<br>+ Chiseled Stone Bricks are now craftable<br>+ Doors and fences now come in all wood type variants<br>+ Sponge block has regained its water-absorbing ability and becomes wet<br>+ Added a spectator game mode (game mode 3)<br>+ Added one new achievement<br>+ Added “Customized” world type<br>+ Added hidden “Debug Mode” world type<br>+ Worlds can now have a world barrier<br>+ Added @e target selector for Command Blocks<br>+ Added /blockdata command<br>+ Added /clone command<br>+ Added /execute command<br>+ Added /fill command<br>+ Added /particle command<br>+ Added /testforblocks command<br>+ Added /title command<br>+ Added /trigger command<br>+ Added /worldborder command<br>+ Added /stats command<br>+ Containers can be locked in custom maps by using the “Lock” data tag<br>+ Added logAdminCommands, showDeathMessages, reducedDebugInfo, sendCommandFeedback, and randomTickSpeed game rules<br>+ Added three new statistics<br>+ Player skins can now have double layers across the whole model, and left/right arms/legs can be edited independently<br>+ Added a new player model with smaller arms, and a new player skin called Alex?<br>+ Added options for configuring what pieces of the skin that are visible<br>+ Blocks can now have custom visual variations in the resource packs<br>+ Minecraft Realms now has an activity chart, so you can see who has been online<br>+ Minecraft Realms now lets you upload your maps<br>* Difficulty setting is saved per world, and can be locked if wanted<br>* Enchanting has been redone, now costs lapis lazuli in addition to enchantment levels<br>* Villager trading has been rebalanced<br>* Anvil repairing has been rebalanced<br>* Considerable faster client-side performance<br>* Max render distance has been increased to 32 chunks (512 blocks)<br>* Adventure mode now prevents you from destroying blocks, unless your items have the CanDestroy data tag<br>* Resource packs can now also define the shape of blocks and items, and not just their textures<br>* Scoreboards have been given a lot of new features<br>* Tweaked the F3 debug screen<br>* Block ID numbers (such as 1 for stone), are being replaced by ID names (such as minecraft:stone)<br>* Server list has been improved<br>* A few minor changes to village and temple generation<br>* Mob heads for players now show both skin layers<br>* Buttons can now be placed on the ceiling<br>* Lots and lots of other changes<br>* LOTS AND LOTS of other changes<br>- Removed Herobrine</p></div>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html
index 21644834f..09cd2478d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/uses-getfirstelementchild-function/expected.html
@@ -1,9 +1,11 @@
-<div><td>
- <div>
- <p><img height="235" src="http://fakehost/test/logo.jpg" width="400"></img></p>
+<div>
+ <p><img src="http://fakehost/test/logo.jpg" width="400" height="235">
+ </p>
<div>
- <br></br>
+ <br>
+
+ <h2><a name="general" id="general"></a>General Info</h2>
<p>The Seattle Thunderbirds are excited to announce the dates of their
annual Summer Hockey Clinic! This three day hockey school will feature top level
instruction, both on and off-ice, from Thunderbirds players and coaches. Each day
@@ -21,8 +23,8 @@
You will begin your daily training on-ice and complete the day off-ice (see the next
page for a complete schedule). Please come prepared with appropriate work-out gear and
sneakers!</p>
- <p>• GROUP A: 7, 8 &amp; 9 yrs old $125<br></br> • GROUP B: 10 &amp; 11 yrs old $125<br></br> • GROUP
- C: 12, 13 &amp; 14 yrs old $125<br></br> • ADULTS: 18 &amp; Over $160</p>
+ <p>• GROUP A: 7, 8 &amp; 9 yrs old $125<br> • GROUP B: 10 &amp; 11 yrs old $125<br> • GROUP
+ C: 12, 13 &amp; 14 yrs old $125<br> • ADULTS: 18 &amp; Over $160</p>
<div>
<p>To reserve your space in the T-Birds Summer Hockey Clinic and receive
your Ticket Special, fill out the registration form on reverse. Space is limited and
@@ -31,17 +33,17 @@
hockey players of all ages to improve their skills and enjoy their time with us. To help
ensure this, the Thunderbirds\' training staff will be at the clinic for its
entirety.</p>
- <p>Elevate your game!<br></br> Improve your skating…<br></br> • lengthen your stride<br></br>
- • gain power<br></br> • balance and agility</p>
- <p>Improve your puck skills…<br></br> • puck control and deking<br></br> • power moves
+ <p>Elevate your game!<br> Improve your skating…<br> • lengthen your stride<br>
+ • gain power<br> • balance and agility</p>
+ <p>Improve your puck skills…<br> • puck control and deking<br> • power moves
and puck protection</p>
- <p>Improve your passing and team play…<br></br> • puck support and \'ice
- vision\'<br></br> • shooting for accuracy vs rebounds<br></br> • game systems</p>
- <p><br></br> Instructors: Instructors for the 2007 Summer Hockey Clinics will
+ <p>Improve your passing and team play…<br> • puck support and \'ice
+ vision\'<br> • shooting for accuracy vs rebounds<br> • game systems</p>
+ <p><br> Instructors: Instructors for the 2007 Summer Hockey Clinics will
include Seattle Thunderbirds Head Coach Rob Sumner, Assistant Coach Turner Stevenson,
past Thunderbirds Ryan Gibbons and Tyler Metcalfe and past and present Seattle
Thunderbirds players.</p>
-
+ <h2><a name="when" id="when"></a>When/Where</h2>
<p>The Thunderbirds Summer Hockey Clinic will take place from Tuesday,
August 14th, through Thursday, August 16th, at Kingsgate Ice Arena, 14326 124th Ave. NE,
Kirkland, WA 98034.</p>
@@ -49,67 +51,124 @@
certified helmet with full facemask. Youth players must also wear a mouth guard. Adult
players may wear a half visor, however full cages and mouth guards are highly
recommended.</p>
-
- <p>• To register and pay for your clinic online, compelte the form below<br></br> •
+ <h2><br> <a name="register" id="register"></a>Registration</h2>
+ <p>• To register and pay for your clinic online, compelte the form below<br> •
To register and pay for your clinic via mail, click here to download the registration
form</p>
- <table bordercolor="#666666" readabilityDataTable="0"><tbody><tr><td bordercolor="#666666">
+ <table bordercolor="#666666" readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td bordercolor="#666666">
<div>
<p>
Summer Hockey Clinic Registration Form
</p>
- </div></td>
- </tr><tr><td bordercolor="#FFFFFF">
- <table readabilityDataTable="0"><tbody><tr><td><p>Player Name</p></td>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td bordercolor="#FFFFFF">
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td><p>Player Name</p></td>
<td colspan="3"></td>
- </tr><tr><td nowrap="nowrap"><p>Email Address</p></td>
+ </tr>
+ <tr>
+ <td nowrap><p>Email Address</p></td>
<td colspan="3"></td>
- </tr><tr><td><p>Birthdate</p></td>
+ </tr>
+ <tr>
+ <td><p>Birthdate</p></td>
<td colspan="3"></td>
- </tr><tr><td><p>Address</p></td>
+ </tr>
+ <tr>
+ <td><p>Address</p></td>
<td colspan="3"></td>
- </tr><tr><td><p>City/St</p></td>
+ </tr>
+ <tr>
+ <td><p>City/St</p></td>
<td></td>
<td><p>Zip</p></td>
<td></td>
- </tr><tr><td><p>Day Phone</p></td>
+ </tr>
+ <tr>
+ <td><p>Day Phone</p></td>
<td></td>
<td><p>Eve Phone</p></td>
<td></td>
- </tr><tr><td colspan="4"><p>Please indicate your curreny hockey association or
+ </tr>
+ <tr>
+ <td colspan="4"><p>Please indicate your curreny hockey association or
league:</p></td>
- </tr><tr><td></td>
- <td colspan="3"><p>SKAHA   SJHA    KVAHA   
- GSHL    Other</p></td>
- </tr><tr><td colspan="4"><p>If other, pelase specify:</p></td>
- </tr><tr><td><p>Position:</p></td>
- <td colspan="3"><p>Forward    Defense    Goalie</p>
+ </tr>
+ <tr>
+ <td></td>
+ <td colspan="3"><p>SKAHA&nbsp;&nbsp; SJHA &nbsp;&nbsp; KVAHA &nbsp;&nbsp;
+ GSHL &nbsp;&nbsp; Other</p></td>
+ </tr>
+ <tr>
+ <td colspan="4"><p>If other, pelase specify:</p></td>
+ </tr>
+ <tr>
+ <td><p>Position:</p></td>
+ <td colspan="3"><p>Forward &nbsp;&nbsp; Defense &nbsp;&nbsp; Goalie</p>
</td>
- </tr><tr><td><p>Jersey Size</p></td>
- <td colspan="3"><p>S   M    L    XL   
+ </tr>
+ <tr>
+ <td><p>Jersey Size</p></td>
+ <td colspan="3"><p>S&nbsp;&nbsp; M &nbsp;&nbsp; L &nbsp;&nbsp; XL &nbsp;&nbsp;
XXL</p></td>
- </tr><tr><td><p>I want to purchase the following T-Birds Summer Hockey
+ </tr>
+ <tr>
+ <td><p>I want to purchase the following T-Birds Summer Hockey
Clinic:</p></td>
<td colspan="3">
- <table readabilityDataTable="0"><tbody><tr><td><p>GROUP A<br></br> 7, 8 &amp; 9<br></br> $125<br></br></p></td>
- <td><p>GROUP B<br></br> 10 &amp; 11<br></br> $125<br></br></p></td>
- <td><p>GROUP C<br></br> 12, 13 &amp; 14<br></br>
- $125<br></br></p></td>
- <td><p>ADULTS<br></br> 18 &amp; Over<br></br> $160<br></br></p></td>
- </tr></tbody></table></td>
- </tr><tr><td colspan="4"> </td>
- </tr><tr><td colspan="4"><p>Waiver and Release</p></td>
- </tr><tr><td colspan="4"><p>By checking this box, I understand that participation
+ <table readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td><p>GROUP A<br> 7, 8 &amp; 9<br> $125<br>
+ </p></td>
+ <td><p>GROUP B<br> 10 &amp; 11<br> $125<br>
+ </p></td>
+ <td><p>GROUP C<br> 12, 13 &amp; 14<br>
+ $125<br></p></td>
+ <td><p>ADULTS<br> 18 &amp; Over<br> $160<br>
+ </p></td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="4">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="4"><p>Waiver and Release</p></td>
+ </tr>
+ <tr>
+ <td colspan="4"><p>By checking this box, I understand that participation
of the sport constitutes a risk to me (or my child). I voluntarily
recognize, accept and assume risk and release the Seattle
Thunderbirds and Kingsgate Arena from any and all liability.</p>
</td>
- </tr><tr><td colspan="4"></td>
- </tr><tr><td colspan="4"></td>
- </tr><tr><td colspan="4"><p>Once you click submit, you will be
+ </tr>
+ <tr>
+ <td colspan="4"></td>
+ </tr>
+ <tr>
+ <td colspan="4"></td>
+ </tr>
+ <tr>
+ <td colspan="4"><p>Once you click submit, you will be
given the link to continue to online payment</p></td>
- </tr></tbody></table></td>
- </tr></tbody></table>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
</div>
- </div></td>
- </div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-images.json
new file mode 100644
index 000000000..0637a088a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-images.json
@@ -0,0 +1 @@
+[] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-metadata.json
new file mode 100644
index 000000000..76403c342
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": null,
+ "Direction": null,
+ "Excerpt": "Emscripten now supports standalone Wasm files, which do not need JavaScript.",
+ "Image": null,
+ "Title": "standalone WebAssembly binaries using Emscripten \u00b7 V8",
+ "SiteName": null
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected.html
new file mode 100644
index 000000000..ba1132111
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/expected.html
@@ -0,0 +1,178 @@
+<div itemprop="articleBody">
+ <p>
+ Emscripten has always focused first and foremost on compiling to the Web and other JavaScript environments like Node.js. But as WebAssembly starts to be used <em>without</em> JavaScript, new use cases are appearing, and so we've been working on support for emitting <a href="https://github.com/emscripten-core/emscripten/wiki/WebAssembly-Standalone"><strong>standalone Wasm</strong></a> files from Emscripten, that do not depend on the Emscripten JS runtime! This post explains why that's interesting.
+ </p>
+ <h2 id="using-standalone-mode-in-emscripten">
+ Using standalone mode in Emscripten <a href="#using-standalone-mode-in-emscripten">#</a>
+ </h2>
+ <p>
+ First, let's see what you can do with this new feature! Similar to <a href="https://hacks.mozilla.org/2018/01/shrinking-webassembly-and-javascript-code-sizes-in-emscripten/">this post</a> let's start with a "hello world" type program that exports a single function that adds two numbers:
+ </p>
+ <pre><code><span>// add.c</span><br><span><span>#</span><span>include</span> <span>&lt;emscripten.h&gt;</span></span><p>EMSCRIPTEN_KEEPALIVE<br><span>int</span> <span>add</span><span>(</span><span>int</span> x<span>,</span> <span>int</span> y<span>)</span> <span>{</span><br> <span>return</span> x <span>+</span> y<span>;</span><br><span>}</span></p></code></pre>
+ <p>
+ We'd normally build this with something like <code>emcc -O3 add.c -o add.js</code> which would emit <code>add.js</code> and <code>add.wasm</code>. Instead, let's ask <code>emcc</code> to only emit Wasm:
+ </p>
+ <pre><code>emcc -O3 add.c -o add.wasm
+</code></pre>
+ <p>
+ When <code>emcc</code> sees we only want Wasm then it makes it "standalone" - a Wasm file that can run by itself as much as possible, without any JavaScript runtime code from Emscripten.
+ </p>
+ <p>
+ Disassembling it, it's very minimal - just 87 bytes! It contains the obvious <code>add</code> function
+ </p>
+ <pre><code><span>(</span><span>func</span> $add <span>(</span><span>param</span> $0 i32<span>)</span> <span>(</span><span>param</span> $1 i32<span>)</span> <span>(</span><span>result</span> i32<span>)</span><br> <span>(</span><span>i32</span>.add<br> <span>(</span><span>local</span>.get $0<span>)</span><br> <span>(</span><span>local</span>.get $1<span>)</span><br> <span>)</span><br><span>)</span></code></pre>
+ <p>
+ and one more function, <code>_start</code>,
+ </p>
+ <pre><code><span>(</span><span>func</span> $_start<br> <span>(</span><span>nop</span><span>)</span><br><span>)</span></code></pre>
+ <p>
+ <code>_start</code> is part of the <a href="https://github.com/WebAssembly/WASI">WASI</a> spec, and Emscripten's standalone mode emits it so that we can run in WASI runtimes. (Normally <code>_start</code> would do global initialization, but here we just don't need any so it's empty.)
+ </p>
+ <h3 id="write-your-own-javascript-loader">
+ Write your own JavaScript loader <a href="#write-your-own-javascript-loader">#</a>
+ </h3>
+ <p>
+ One nice thing about a standalone Wasm file like this is that you can write custom JavaScript to load and run it, which can be very minimal depending on your use case. For example, we can do this in Node.js:
+ </p>
+ <pre><code><span>// load-add.js</span><br><span>const</span> binary <span>=</span> <span>require</span><span>(</span><span>'fs'</span><span>)</span><span>.</span><span>readFileSync</span><span>(</span><span>'add.wasm'</span><span>)</span><span>;</span><p>WebAssembly<span>.</span><span>instantiate</span><span>(</span>binary<span>)</span><span>.</span><span>then</span><span>(</span><span>(</span><span><span>{</span> instance <span>}</span></span><span>)</span> <span>=&gt;</span> <span>{</span><br> console<span>.</span><span>log</span><span>(</span>instance<span>.</span>exports<span>.</span><span>add</span><span>(</span><span>40</span><span>,</span> <span>2</span><span>)</span><span>)</span><span>;</span><br><span>}</span><span>)</span><span>;</span></p></code></pre>
+ <p>
+ Just 4 lines! Running that prints <code>42</code> as expected. Note that while this example is very simplistic, there are cases where you simply don't need much JavaScript, and may be able to do better than Emscripten's default JavaScript runtime (which supports a bunch of environments and options). A real-world example of that is in <a href="https://github.com/zeux/meshoptimizer/blob/bdc3006532dd29b03d83dc819e5fa7683815b88e/js/meshopt_decoder.js">zeux's meshoptimizer</a> - just 57 lines, including memory management, growth, etc.!
+ </p>
+ <h3 id="running-in-wasm-runtimes">
+ Running in Wasm runtimes <a href="#running-in-wasm-runtimes">#</a>
+ </h3>
+ <p>
+ Another nice thing about standalone Wasm files is that you can run them in Wasm runtimes like <a href="https://wasmer.io">wasmer</a>, <a href="https://github.com/bytecodealliance/wasmtime">wasmtime</a>, or <a href="https://github.com/WAVM/WAVM">WAVM</a>. For example, consider this hello world:
+ </p>
+ <pre><code><span>// hello.cpp</span><br><span><span>#</span><span>include</span> <span>&lt;stdio.h&gt;</span></span><p><span>int</span> <span>main</span><span>(</span><span>)</span> <span>{</span><br> <span>printf</span><span>(</span><span>"hello, world!\n"</span><span>)</span><span>;</span><br> <span>return</span> <span>0</span><span>;</span><br><span>}</span></p></code></pre>
+ <p>
+ We can build and run that in any of those runtimes:
+ </p>
+ <pre><code>$ emcc hello.cpp -O3 -o hello.wasm<br>$ wasmer run hello.wasm<br>hello, world<span>!</span><br>$ wasmtime hello.wasm<br>hello, world<span>!</span><br>$ wavm run hello.wasm<br>hello, world<span>!</span></code></pre>
+ <p>
+ Emscripten uses WASI APIs as much as possible, so programs like this end up using 100% WASI and can run in WASI-supporting runtimes (see notes later on what programs require more than WASI).
+ </p>
+ <h3 id="building-wasm-plugins">
+ Building Wasm plugins <a href="#building-wasm-plugins">#</a>
+ </h3>
+ <p>
+ Aside from the Web and the server, an exciting area for Wasm is <strong>plugins</strong>. For example, an image editor might have Wasm plugins that can perform filters and other operations on the image. For that type of use case you want a standalone Wasm binary, just like in the examples so far, but where it also has a proper API for the embedding application.
+ </p>
+ <p>
+ Plugins are sometimes related to dynamic libraries, as dynamic libraries are one way to implement them. Emscripten has support for dynamic libraries with the <a href="https://github.com/emscripten-core/emscripten/wiki/Linking#general-dynamic-linking">SIDE_MODULE</a> option, and this has been a way to build Wasm plugins. The new standalone Wasm option described here is an improvement on that in several ways: First, a dynamic library has relocatable memory, which adds overhead if you don’t need it (and you don’t if you aren’t linking the Wasm with another Wasm after loading it). Second, standalone output is designed to run in Wasm runtimes as well, as mentioned earlier.
+ </p>
+ <p>
+ Okay, so far so good: Emscripten can either emit JavaScript + WebAssembly as it always did, and now it can also emit just WebAssembly by itself, which lets you run it in places that don't have JavaScript like Wasm runtimes, or you can write your own custom JavaScript loader code, etc. Now let's talk about the background and the technical details!
+ </p>
+ <h2 id="webassembly's-two-standard-apis">
+ WebAssembly's two standard APIs <a href="#webassembly's-two-standard-apis">#</a>
+ </h2>
+ <p>
+ WebAssembly can only access the APIs it receives as imports - the core Wasm spec has no concrete API details. Given the current trajectory of Wasm, it looks like there will be 3 main categories of APIs that people import and use:
+ </p>
+ <ul>
+ <li>
+ <strong>Web APIs</strong>: This is what Wasm programs use on the Web, which are the existing standardized APIs that JavaScript can use too. Currently these are called indirectly, through JS glue code, but in the future with <a href="https://github.com/WebAssembly/interface-types/blob/master/proposals/interface-types/Explainer.md">interface types</a> they will be called directly.
+ </li>
+ <li>
+ <strong>WASI APIs</strong>: WASI focuses on standardizing APIs for Wasm on the server.
+ </li>
+ <li>
+ <strong>Other APIs</strong>: Various custom embeddings will define their own application-specific APIs. For example, we gave the example earlier of an image editor with Wasm plugins that implement an API to do visual effects. Note that a plugin might also have access to “system” APIs, like a native dynamic library would, or it might be very sandboxed and have no imports at all (if the embedding just calls its methods).
+ </li>
+ </ul>
+ <p>
+ WebAssembly is in the interesting position of having <a href="https://www.goodreads.com/quotes/589703-the-good-thing-about-standards-is-that-there-are-so">two standardized sets of APIs</a>. This does makes sense in that one is for the Web and one for the server, and those environments do have different requirements; for similar reasons Node.js does not have identical APIs to JavaScript on the Web.
+ </p>
+ <p>
+ However, there is more than the Web and the server, in particular there are also Wasm plugins. For one thing, plugins can run inside an application that may be on the Web (just like <a href="https://www.figma.com/blog/an-update-on-plugin-security/#a-technology-change">JS plugins</a>) or off the Web; for another, regardless of where the embedding application is, a plugin environment is not a Web nor a server environment. So it's not immediately obvious which sets of APIs will be used - it may depend on the code being ported, the Wasm runtime being embedded, etc.
+ </p>
+ <h2 id="let's-unify-as-much-as-possible">
+ Let's unify as much as possible <a href="#let's-unify-as-much-as-possible">#</a>
+ </h2>
+ <p>
+ One concrete way Emscripten hopes to help here is that by using WASI APIs as much as possible we can avoid <strong>unnecessary</strong> API differences. As mentioned earlier, on the Web Emscripten code accesses Web APIs indirectly, through JavaScript, so where that JavaScript API could look like WASI, we'd be removing an unnecessary API difference, and that same binary can also run on the server. In other words, if Wasm wants to log some info, it needs to call into JS, something like this:
+ </p>
+ <pre><code><span>wasm</span> <span>=&gt;</span> <span>function</span> <span>musl_writev</span><span>(</span><span><span>.</span><span>.</span></span><span>)</span> <span>{</span> <span>.</span><span>.</span> console<span>.</span><span>log</span><span>(</span><span>.</span><span>.</span><span>)</span> <span>.</span><span>.</span> <span>}</span></code></pre>
+ <p>
+ <code>musl_writev</code> is an implementation of the Linux syscall interface that <a href="https://www.musl-libc.org">musl libc</a> uses to write data to a file descriptor, and that ends up calling <code>console.log</code> with the proper data. The Wasm module imports and calls that <code>musl_writev</code>, which defines an ABI between the JS and the Wasm. That ABI is arbitrary (and in fact Emscripten has changed its ABI over time to optimize it). If we replace that with an ABI that matches WASI, we can get this:
+ </p>
+ <pre><code><span>wasm</span> <span>=&gt;</span> <span>function</span> <span>__wasi_fd_write</span><span>(</span><span><span>.</span><span>.</span></span><span>)</span> <span>{</span> <span>.</span><span>.</span> console<span>.</span><span>log</span><span>(</span><span>.</span><span>.</span><span>)</span> <span>.</span><span>.</span> <span>}</span></code></pre>
+ <p>
+ This isn't a big change, just requiring some refactoring of the ABI, and when running in a JS environment it doesn't matter much. But now the Wasm can run without the JS since that WASI API is recognized by WASI runtimes! That’s how the standalone Wasm examples from before work, just by refactoring Emscripten to use WASI APIs.
+ </p>
+ <p>
+ Another advantage of Emscripten using WASI APIs is that we can help the WASI spec by finding real-world issues. For example, we found that <a href="https://github.com/WebAssembly/WASI/pull/106">changing the WASI "whence" constants</a> would be useful, and we've started some discussions around <a href="https://github.com/WebAssembly/WASI/issues/109">code size</a> and <a href="https://github.com/WebAssembly/WASI/issues/122">POSIX compatibility</a>.
+ </p>
+ <p>
+ Emscripten using WASI as much as possible is also useful in that it lets users use a single SDK to target Web, server, and plugin environments. Emscripten isn't the only SDK allowing that, as the WASI SDK's output can be run on the Web using the <a href="https://wasi.dev/polyfill/">WASI Web Polyfill</a> or Wasmer's <a href="https://github.com/wasmerio/wasmer-js">wasmer-js</a>, but Emscripten’s Web output is more compact, so it lets a single SDK be used without compromising Web performance.
+ </p>
+ <p>
+ Speaking of which, you can emit a standalone Wasm file from Emscripten with optional JS in a single command:
+ </p>
+ <pre><code>emcc -O3 add.c -o add.js -s STANDALONE_WASM
+</code></pre>
+ <p>
+ That emits <code>add.js</code> and <code>add.wasm</code>. The Wasm file is standalone just like earlier when we only emitted a Wasm file by itself (<code>STANDALONE_WASM</code> was set automatically when we said <code>-o add.wasm</code>), but now in addition there is a JS file that can load and run it. The JS is useful for running it on the Web if you don't want to write your own JS for that.
+ </p>
+ <h2 id="do-we-need-non-standalone-wasm%3F">
+ Do we need <em>non</em>-standalone Wasm? <a href="#do-we-need-non-standalone-wasm%3F">#</a>
+ </h2>
+ <p>
+ Why does the <code>STANDALONE_WASM</code> flag exist? In theory Emscripten could always set <code>STANDALONE_WASM</code>, which would be simpler. But standalone Wasm files can't depend on JS, and that has some downsides:
+ </p>
+ <ul>
+ <li>We can't minify the Wasm import and export names, as the minification only works if both sides agree, the Wasm and what loads it.
+ </li>
+ <li>Normally we create the Wasm Memory in JS so that JS can start to use it during startup, which lets us do work in parallel. But in standalone Wasm we have to create the Memory in the Wasm.
+ </li>
+ <li>Some APIs are just easy to do in JS. For example <a href="https://github.com/emscripten-core/emscripten/pull/9558"><code>__assert_fail</code></a>, which is called when a C assertion fails, is normally <a href="https://github.com/emscripten-core/emscripten/blob/2b42a35f61f9a16600c78023391d8033740a019f/src/library.js#L1235">implemented in JS</a>. It takes just a single line, and even if you include the JS functions it calls, the total code size is quite small. On the other hand, in a standalone build we can't depend on JS, so we use <a href="https://github.com/emscripten-core/emscripten/blob/b8896d18f2163dbf2fa173694eeac71f6c90b68c/system/lib/libc/musl/src/exit/assert.c#L4">musl's <code>assert.c</code></a>. That uses <code>fprintf</code>, which means it ends up pulling in a bunch of C <code>stdio</code> support, including things with indirect calls that make it hard to remove unused functions. Overall, there are many such details that end up making a difference in total code size.
+ </li>
+ </ul>
+ <p>
+ If you want to run both on the Web and elsewhere, and you want 100% optimal code size and startup times, you should make two separate builds, one with <code>-s STANDALONE</code> and one without. That's very easy as it's just flipping one flag!
+ </p>
+ <h2 id="necessary-api-differences">
+ Necessary API differences <a href="#necessary-api-differences">#</a>
+ </h2>
+ <p>
+ We saw that Emscripten uses WASI APIs as much as possible to avoid <strong>unnecessary</strong> API differences. Are there any <strong>necessary</strong> ones? Sadly, yes - some WASI APIs require tradeoffs. For example:
+ </p>
+ <ul>
+ <li>WASI does not support various POSIX features, like <a href="https://github.com/WebAssembly/WASI/issues/122">user/group/world file permissions</a>, as a result of which you can't fully implement a (Linux) system <code>ls</code> for example (see details in that link). Emscripten's existing filesystem layer does support some of those things, so if we switched to WASI APIs for all filesystem operations then we'd be <a href="https://github.com/emscripten-core/emscripten/issues/9479#issuecomment-542815711">losing some POSIX support</a>.
+ </li>
+ <li>WASI's <code>path_open</code> <a href="https://github.com/WebAssembly/WASI/issues/109">has a cost in code size</a> because it forces extra permissions handling in the Wasm itself. That code is unnecessary on the Web.
+ </li>
+ <li>WASI doesn't provide a <a href="https://github.com/WebAssembly/WASI/issues/82">notification API for memory growth</a>, and as a result, JS runtimes must constantly check if memory grew and if so update their views, on every import and export. To avoid that overhead, Emscripten provides a notification API, <code>emscripten_notify_memory_growth</code>, which <a href="https://github.com/zeux/meshoptimizer/blob/bdc3006532dd29b03d83dc819e5fa7683815b88e/js/meshopt_decoder.js#L10">you can see implemented in a single line</a> in zeux's meshoptimizer that we mentioned earlier.
+ </li>
+ </ul>
+ <p>
+ In time WASI may add more POSIX support, a memory growth notification, etc. - WASI is still highly experimental and expected to change significantly. For now, to avoid regressions in Emscripten we do not emit 100% WASI binaries if you use certain features. In particular, opening files uses a POSIX method instead of WASI, which means that if you call <code>fopen</code> then the resulting Wasm file will not be 100% WASI - however, if all you do is use <code>printf</code>, which operates on the already-open <code>stdout</code>, then it will be 100% WASI, as in the "hello world" example we saw near the beginning, where Emscripten's output does run in WASI runtimes.
+ </p>
+ <p>
+ If it would be useful for users we can add a <code>PURE_WASI</code> option which would sacrifice code size in return for strict WASI compliance, but if that's not urgent (and most plugin use cases we’ve seen so far don’t need full file I/O) then maybe we can wait for WASI to improve to where Emscripten can remove these non-WASI APIs. That would be the best outcome, and we’re working towards that as you can see in the links above.
+ </p>
+ <p>
+ However, even if WASI does improve, there is no avoiding the fact that Wasm has two standardized APIs as mentioned earlier. In the future I expect Emscripten will call Web APIs directly using interface types, because that will be more compact than calling a WASI-looking JS API that then calls a Web API (as in the <code>musl_writev</code> example from before). We could have a polyfill or a translation layer of some sort to help here, but we wouldn't want to use it unnecessarily, so we will need separate builds for Web and WASI environments. (This is somewhat unfortunate; in theory this could have been avoided if WASI were a superset of Web APIs, but obviously that would have meant compromises on the server side.)
+ </p>
+ <h2 id="current-status">
+ Current status <a href="#current-status">#</a>
+ </h2>
+ <p>
+ Quite a lot works already! The main limitations are:
+ </p>
+ <ul>
+ <li>
+ <strong>WebAssembly limitations</strong>: Various features, like C++ exceptions, setjmp, and pthreads, depend on JavaScript due to Wasm limitations, and there is no good non-JS replacement yet. (Emscripten may start to support some of them <a href="https://www.youtube.com/watch?v=qQOP6jqZqf8&amp;list=PLqh1Mztq_-N2OnEXkdtF5yymcihwqG57y&amp;index=2&amp;t=0s">using Asyncify</a>, or maybe we'll just wait for <a href="https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md">native Wasm features</a> to arrive to VMs.)
+ </li>
+ <li>
+ <strong>WASI limitations</strong>: Libraries and APIs like OpenGL and SDL don't have corresponding WASI APIs yet.
+ </li>
+ </ul>
+ <p>
+ You <strong>can</strong> still use all those in Emscripten's standalone mode, but the output will contain calls to JS runtime support code. As a result, it will not be 100% WASI (for similar reasons those features also do not work in the WASI SDK). Those Wasm files won't run in WASI runtimes, but you can use them on the Web and you can write your own JS runtime for them. You can also use them as plugins; for example, a game engine could have plugins that render using OpenGL, and the developer would compile them in standalone mode and then implement the OpenGL imports in the engine's Wasm runtime. Standalone Wasm mode still helps here because it makes the output as standalone as Emscripten can make it.
+ </p>
+ <p>
+ You may also find APIs that <strong>do</strong> have a non-JS replacement that we haven’t converted yet, as work is still ongoing. Please <a href="https://github.com/emscripten-core/emscripten/issues">file bugs</a>, and as always help is welcome!
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/source.html
new file mode 100644
index 000000000..4a23d093f
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/v8-blog/source.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html>
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <title>
+ Outside the web: standalone WebAssembly binaries using Emscripten · V8
+ </title>
+ <meta content="width=device-width,initial-scale=1" name="viewport" />
+ <meta content="dark light" name="color-scheme" />
+ <link href="/_css/main.css" rel="stylesheet" />
+ <link href="/.webmanifest" rel="manifest" />
+ <meta content="#4285F4" name="theme-color" />
+ <link href="/blog.atom" rel="alternate" title="V8 Atom feed" type="application/atom+xml" />
+ <link href="/features.atom" rel="alternate" title="V8 JS/Wasm features Atom feed" type="application/atom+xml" />
+ <script>
+ <![CDATA[
+ document.documentElement.className+=' js'
+ ]]>
+ </script>
+ <meta content="Emscripten now supports standalone Wasm files, which do not need JavaScript." name="description" />
+ </head>
+ <body>
+ <header id="header">
+ <h1>
+ <a href="/">V8</a>
+ </h1><a href="#navigation-toggle" id="nav-toggle">Show navigation</a>
+ <nav>
+ <ul>
+ <li>
+ <a href="/">Home</a>
+ </li>
+ <li class="current">
+ <a href="/blog">Blog</a>
+ </li>
+ <li>
+ <a href="/docs">Docs</a>
+ </li>
+ <li>
+ <a href="/features" title="JavaScript and WebAssembly language features">JS/Wasm features</a>
+ </li>
+ <li>
+ <a href="/grant">Research</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main id="main">
+ <article itemscope="itemscope" itemtype="http://schema.org/BlogPosting">
+ <header>
+ <h1 itemprop="headline">
+ Outside the web: standalone WebAssembly binaries using Emscripten
+ </h1>
+ <p class="meta">
+ Published <time datetime="2019-11-21" itemprop="datePublished">21 November 2019</time> · Tagged with <a href="/blog/tags/webassembly" class="tag">WebAssembly</a> <a href="/blog/tags/tooling" class="tag">tooling</a>
+ </p>
+ </header>
+ <div itemprop="articleBody">
+ <p>
+ Emscripten has always focused first and foremost on compiling to the Web and other JavaScript environments like Node.js. But as WebAssembly starts to be used <em>without</em> JavaScript, new use cases are appearing, and so we've been working on support for emitting <a href="https://github.com/emscripten-core/emscripten/wiki/WebAssembly-Standalone"><strong>standalone Wasm</strong></a> files from Emscripten, that do not depend on the Emscripten JS runtime! This post explains why that's interesting.
+ </p>
+ <h2 id="using-standalone-mode-in-emscripten">
+ Using standalone mode in Emscripten <a href="#using-standalone-mode-in-emscripten" class="bookmark">#</a>
+ </h2>
+ <p>
+ First, let's see what you can do with this new feature! Similar to <a href="https://hacks.mozilla.org/2018/01/shrinking-webassembly-and-javascript-code-sizes-in-emscripten/">this post</a> let's start with a "hello world" type program that exports a single function that adds two numbers:
+ </p>
+ <pre class="language-c"><code class="language-c"><span class="token comment">// add.c</span><br /><span class="token macro property"><span class="token directive-hash">#</span><span class="token keyword directive">include</span> <span class="token string">&lt;emscripten.h&gt;</span></span><br /><br />EMSCRIPTEN_KEEPALIVE<br /><span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token keyword">return</span> x <span class="token operator">+</span> y<span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
+ <p>
+ We'd normally build this with something like <code>emcc -O3 add.c -o add.js</code> which would emit <code>add.js</code> and <code>add.wasm</code>. Instead, let's ask <code>emcc</code> to only emit Wasm:
+ </p>
+ <pre><code>emcc -O3 add.c -o add.wasm
+</code></pre>
+ <p>
+ When <code>emcc</code> sees we only want Wasm then it makes it "standalone" - a Wasm file that can run by itself as much as possible, without any JavaScript runtime code from Emscripten.
+ </p>
+ <p>
+ Disassembling it, it's very minimal - just 87 bytes! It contains the obvious <code>add</code> function
+ </p>
+ <pre class="language-lisp"><code class="language-lisp"><span class="token punctuation">(</span><span class="token car">func</span> $add <span class="token punctuation">(</span><span class="token car">param</span> $0 i32<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">param</span> $1 i32<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token car">result</span> i32<span class="token punctuation">)</span><br /> <span class="token punctuation">(</span><span class="token car">i32</span>.add<br /> <span class="token punctuation">(</span><span class="token car">local</span>.get $0<span class="token punctuation">)</span><br /> <span class="token punctuation">(</span><span class="token car">local</span>.get $1<span class="token punctuation">)</span><br /> <span class="token punctuation">)</span><br /><span class="token punctuation">)</span></code></pre>
+ <p>
+ and one more function, <code>_start</code>,
+ </p>
+ <pre class="language-lisp"><code class="language-lisp"><span class="token punctuation">(</span><span class="token car">func</span> $_start<br /> <span class="token punctuation">(</span><span class="token car">nop</span><span class="token punctuation">)</span><br /><span class="token punctuation">)</span></code></pre>
+ <p>
+ <code>_start</code> is part of the <a href="https://github.com/WebAssembly/WASI">WASI</a> spec, and Emscripten's standalone mode emits it so that we can run in WASI runtimes. (Normally <code>_start</code> would do global initialization, but here we just don't need any so it's empty.)
+ </p>
+ <h3 id="write-your-own-javascript-loader">
+ Write your own JavaScript loader <a href="#write-your-own-javascript-loader" class="bookmark">#</a>
+ </h3>
+ <p>
+ One nice thing about a standalone Wasm file like this is that you can write custom JavaScript to load and run it, which can be very minimal depending on your use case. For example, we can do this in Node.js:
+ </p>
+ <pre class="language-js"><code class="language-js"><span class="token comment">// load-add.js</span><br /><span class="token keyword">const</span> binary <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'fs'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">readFileSync</span><span class="token punctuation">(</span><span class="token string">'add.wasm'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><br />WebAssembly<span class="token punctuation">.</span><span class="token function">instantiate</span><span class="token punctuation">(</span>binary<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> instance <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span><br /> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>instance<span class="token punctuation">.</span>exports<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
+ <p>
+ Just 4 lines! Running that prints <code>42</code> as expected. Note that while this example is very simplistic, there are cases where you simply don't need much JavaScript, and may be able to do better than Emscripten's default JavaScript runtime (which supports a bunch of environments and options). A real-world example of that is in <a href="https://github.com/zeux/meshoptimizer/blob/bdc3006532dd29b03d83dc819e5fa7683815b88e/js/meshopt_decoder.js">zeux's meshoptimizer</a> - just 57 lines, including memory management, growth, etc.!
+ </p>
+ <h3 id="running-in-wasm-runtimes">
+ Running in Wasm runtimes <a href="#running-in-wasm-runtimes" class="bookmark">#</a>
+ </h3>
+ <p>
+ Another nice thing about standalone Wasm files is that you can run them in Wasm runtimes like <a href="https://wasmer.io">wasmer</a>, <a href="https://github.com/bytecodealliance/wasmtime">wasmtime</a>, or <a href="https://github.com/WAVM/WAVM">WAVM</a>. For example, consider this hello world:
+ </p>
+ <pre class="language-cpp"><code class="language-cpp"><span class="token comment">// hello.cpp</span><br /><span class="token macro property"><span class="token directive-hash">#</span><span class="token keyword directive">include</span> <span class="token string">&lt;stdio.h&gt;</span></span><br /><br /><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><br /> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"hello, world!\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span></code></pre>
+ <p>
+ We can build and run that in any of those runtimes:
+ </p>
+ <pre class="language-bash"><code class="language-bash">$ emcc hello.cpp -O3 -o hello.wasm<br />$ wasmer run hello.wasm<br />hello, world<span class="token operator">!</span><br />$ wasmtime hello.wasm<br />hello, world<span class="token operator">!</span><br />$ wavm run hello.wasm<br />hello, world<span class="token operator">!</span></code></pre>
+ <p>
+ Emscripten uses WASI APIs as much as possible, so programs like this end up using 100% WASI and can run in WASI-supporting runtimes (see notes later on what programs require more than WASI).
+ </p>
+ <h3 id="building-wasm-plugins">
+ Building Wasm plugins <a href="#building-wasm-plugins" class="bookmark">#</a>
+ </h3>
+ <p>
+ Aside from the Web and the server, an exciting area for Wasm is <strong>plugins</strong>. For example, an image editor might have Wasm plugins that can perform filters and other operations on the image. For that type of use case you want a standalone Wasm binary, just like in the examples so far, but where it also has a proper API for the embedding application.
+ </p>
+ <p>
+ Plugins are sometimes related to dynamic libraries, as dynamic libraries are one way to implement them. Emscripten has support for dynamic libraries with the <a href="https://github.com/emscripten-core/emscripten/wiki/Linking#general-dynamic-linking">SIDE_MODULE</a> option, and this has been a way to build Wasm plugins. The new standalone Wasm option described here is an improvement on that in several ways: First, a dynamic library has relocatable memory, which adds overhead if you don’t need it (and you don’t if you aren’t linking the Wasm with another Wasm after loading it). Second, standalone output is designed to run in Wasm runtimes as well, as mentioned earlier.
+ </p>
+ <p>
+ Okay, so far so good: Emscripten can either emit JavaScript + WebAssembly as it always did, and now it can also emit just WebAssembly by itself, which lets you run it in places that don't have JavaScript like Wasm runtimes, or you can write your own custom JavaScript loader code, etc. Now let's talk about the background and the technical details!
+ </p>
+ <h2 id="webassembly's-two-standard-apis">
+ WebAssembly's two standard APIs <a href="#webassembly's-two-standard-apis" class="bookmark">#</a>
+ </h2>
+ <p>
+ WebAssembly can only access the APIs it receives as imports - the core Wasm spec has no concrete API details. Given the current trajectory of Wasm, it looks like there will be 3 main categories of APIs that people import and use:
+ </p>
+ <ul>
+ <li>
+ <strong>Web APIs</strong>: This is what Wasm programs use on the Web, which are the existing standardized APIs that JavaScript can use too. Currently these are called indirectly, through JS glue code, but in the future with <a href="https://github.com/WebAssembly/interface-types/blob/master/proposals/interface-types/Explainer.md">interface types</a> they will be called directly.
+ </li>
+ <li>
+ <strong>WASI APIs</strong>: WASI focuses on standardizing APIs for Wasm on the server.
+ </li>
+ <li>
+ <strong>Other APIs</strong>: Various custom embeddings will define their own application-specific APIs. For example, we gave the example earlier of an image editor with Wasm plugins that implement an API to do visual effects. Note that a plugin might also have access to “system” APIs, like a native dynamic library would, or it might be very sandboxed and have no imports at all (if the embedding just calls its methods).
+ </li>
+ </ul>
+ <p>
+ WebAssembly is in the interesting position of having <a href="https://www.goodreads.com/quotes/589703-the-good-thing-about-standards-is-that-there-are-so">two standardized sets of APIs</a>. This does makes sense in that one is for the Web and one for the server, and those environments do have different requirements; for similar reasons Node.js does not have identical APIs to JavaScript on the Web.
+ </p>
+ <p>
+ However, there is more than the Web and the server, in particular there are also Wasm plugins. For one thing, plugins can run inside an application that may be on the Web (just like <a href="https://www.figma.com/blog/an-update-on-plugin-security/#a-technology-change">JS plugins</a>) or off the Web; for another, regardless of where the embedding application is, a plugin environment is not a Web nor a server environment. So it's not immediately obvious which sets of APIs will be used - it may depend on the code being ported, the Wasm runtime being embedded, etc.
+ </p>
+ <h2 id="let's-unify-as-much-as-possible">
+ Let's unify as much as possible <a href="#let's-unify-as-much-as-possible" class="bookmark">#</a>
+ </h2>
+ <p>
+ One concrete way Emscripten hopes to help here is that by using WASI APIs as much as possible we can avoid <strong>unnecessary</strong> API differences. As mentioned earlier, on the Web Emscripten code accesses Web APIs indirectly, through JavaScript, so where that JavaScript API could look like WASI, we'd be removing an unnecessary API difference, and that same binary can also run on the server. In other words, if Wasm wants to log some info, it needs to call into JS, something like this:
+ </p>
+ <pre class="language-js"><code class="language-js"><span class="token parameter">wasm</span> <span class="token operator">=&gt;</span> <span class="token keyword">function</span> <span class="token function">musl_writev</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">.</span><span class="token punctuation">.</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span></code></pre>
+ <p>
+ <code>musl_writev</code> is an implementation of the Linux syscall interface that <a href="https://www.musl-libc.org">musl libc</a> uses to write data to a file descriptor, and that ends up calling <code>console.log</code> with the proper data. The Wasm module imports and calls that <code>musl_writev</code>, which defines an ABI between the JS and the Wasm. That ABI is arbitrary (and in fact Emscripten has changed its ABI over time to optimize it). If we replace that with an ABI that matches WASI, we can get this:
+ </p>
+ <pre class="language-js"><code class="language-js"><span class="token parameter">wasm</span> <span class="token operator">=&gt;</span> <span class="token keyword">function</span> <span class="token function">__wasi_fd_write</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">.</span><span class="token punctuation">.</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span></code></pre>
+ <p>
+ This isn't a big change, just requiring some refactoring of the ABI, and when running in a JS environment it doesn't matter much. But now the Wasm can run without the JS since that WASI API is recognized by WASI runtimes! That’s how the standalone Wasm examples from before work, just by refactoring Emscripten to use WASI APIs.
+ </p>
+ <p>
+ Another advantage of Emscripten using WASI APIs is that we can help the WASI spec by finding real-world issues. For example, we found that <a href="https://github.com/WebAssembly/WASI/pull/106">changing the WASI "whence" constants</a> would be useful, and we've started some discussions around <a href="https://github.com/WebAssembly/WASI/issues/109">code size</a> and <a href="https://github.com/WebAssembly/WASI/issues/122">POSIX compatibility</a>.
+ </p>
+ <p>
+ Emscripten using WASI as much as possible is also useful in that it lets users use a single SDK to target Web, server, and plugin environments. Emscripten isn't the only SDK allowing that, as the WASI SDK's output can be run on the Web using the <a href="https://wasi.dev/polyfill/">WASI Web Polyfill</a> or Wasmer's <a href="https://github.com/wasmerio/wasmer-js">wasmer-js</a>, but Emscripten’s Web output is more compact, so it lets a single SDK be used without compromising Web performance.
+ </p>
+ <p>
+ Speaking of which, you can emit a standalone Wasm file from Emscripten with optional JS in a single command:
+ </p>
+ <pre><code>emcc -O3 add.c -o add.js -s STANDALONE_WASM
+</code></pre>
+ <p>
+ That emits <code>add.js</code> and <code>add.wasm</code>. The Wasm file is standalone just like earlier when we only emitted a Wasm file by itself (<code>STANDALONE_WASM</code> was set automatically when we said <code>-o add.wasm</code>), but now in addition there is a JS file that can load and run it. The JS is useful for running it on the Web if you don't want to write your own JS for that.
+ </p>
+ <h2 id="do-we-need-non-standalone-wasm%3F">
+ Do we need <em>non</em>-standalone Wasm? <a href="#do-we-need-non-standalone-wasm%3F" class="bookmark">#</a>
+ </h2>
+ <p>
+ Why does the <code>STANDALONE_WASM</code> flag exist? In theory Emscripten could always set <code>STANDALONE_WASM</code>, which would be simpler. But standalone Wasm files can't depend on JS, and that has some downsides:
+ </p>
+ <ul>
+ <li>We can't minify the Wasm import and export names, as the minification only works if both sides agree, the Wasm and what loads it.
+ </li>
+ <li>Normally we create the Wasm Memory in JS so that JS can start to use it during startup, which lets us do work in parallel. But in standalone Wasm we have to create the Memory in the Wasm.
+ </li>
+ <li>Some APIs are just easy to do in JS. For example <a href="https://github.com/emscripten-core/emscripten/pull/9558"><code>__assert_fail</code></a>, which is called when a C assertion fails, is normally <a href="https://github.com/emscripten-core/emscripten/blob/2b42a35f61f9a16600c78023391d8033740a019f/src/library.js#L1235">implemented in JS</a>. It takes just a single line, and even if you include the JS functions it calls, the total code size is quite small. On the other hand, in a standalone build we can't depend on JS, so we use <a href="https://github.com/emscripten-core/emscripten/blob/b8896d18f2163dbf2fa173694eeac71f6c90b68c/system/lib/libc/musl/src/exit/assert.c#L4">musl's <code>assert.c</code></a>. That uses <code>fprintf</code>, which means it ends up pulling in a bunch of C <code>stdio</code> support, including things with indirect calls that make it hard to remove unused functions. Overall, there are many such details that end up making a difference in total code size.
+ </li>
+ </ul>
+ <p>
+ If you want to run both on the Web and elsewhere, and you want 100% optimal code size and startup times, you should make two separate builds, one with <code>-s STANDALONE</code> and one without. That's very easy as it's just flipping one flag!
+ </p>
+ <h2 id="necessary-api-differences">
+ Necessary API differences <a href="#necessary-api-differences" class="bookmark">#</a>
+ </h2>
+ <p>
+ We saw that Emscripten uses WASI APIs as much as possible to avoid <strong>unnecessary</strong> API differences. Are there any <strong>necessary</strong> ones? Sadly, yes - some WASI APIs require tradeoffs. For example:
+ </p>
+ <ul>
+ <li>WASI does not support various POSIX features, like <a href="https://github.com/WebAssembly/WASI/issues/122">user/group/world file permissions</a>, as a result of which you can't fully implement a (Linux) system <code>ls</code> for example (see details in that link). Emscripten's existing filesystem layer does support some of those things, so if we switched to WASI APIs for all filesystem operations then we'd be <a href="https://github.com/emscripten-core/emscripten/issues/9479#issuecomment-542815711">losing some POSIX support</a>.
+ </li>
+ <li>WASI's <code>path_open</code> <a href="https://github.com/WebAssembly/WASI/issues/109">has a cost in code size</a> because it forces extra permissions handling in the Wasm itself. That code is unnecessary on the Web.
+ </li>
+ <li>WASI doesn't provide a <a href="https://github.com/WebAssembly/WASI/issues/82">notification API for memory growth</a>, and as a result, JS runtimes must constantly check if memory grew and if so update their views, on every import and export. To avoid that overhead, Emscripten provides a notification API, <code>emscripten_notify_memory_growth</code>, which <a href="https://github.com/zeux/meshoptimizer/blob/bdc3006532dd29b03d83dc819e5fa7683815b88e/js/meshopt_decoder.js#L10">you can see implemented in a single line</a> in zeux's meshoptimizer that we mentioned earlier.
+ </li>
+ </ul>
+ <p>
+ In time WASI may add more POSIX support, a memory growth notification, etc. - WASI is still highly experimental and expected to change significantly. For now, to avoid regressions in Emscripten we do not emit 100% WASI binaries if you use certain features. In particular, opening files uses a POSIX method instead of WASI, which means that if you call <code>fopen</code> then the resulting Wasm file will not be 100% WASI - however, if all you do is use <code>printf</code>, which operates on the already-open <code>stdout</code>, then it will be 100% WASI, as in the "hello world" example we saw near the beginning, where Emscripten's output does run in WASI runtimes.
+ </p>
+ <p>
+ If it would be useful for users we can add a <code>PURE_WASI</code> option which would sacrifice code size in return for strict WASI compliance, but if that's not urgent (and most plugin use cases we’ve seen so far don’t need full file I/O) then maybe we can wait for WASI to improve to where Emscripten can remove these non-WASI APIs. That would be the best outcome, and we’re working towards that as you can see in the links above.
+ </p>
+ <p>
+ However, even if WASI does improve, there is no avoiding the fact that Wasm has two standardized APIs as mentioned earlier. In the future I expect Emscripten will call Web APIs directly using interface types, because that will be more compact than calling a WASI-looking JS API that then calls a Web API (as in the <code>musl_writev</code> example from before). We could have a polyfill or a translation layer of some sort to help here, but we wouldn't want to use it unnecessarily, so we will need separate builds for Web and WASI environments. (This is somewhat unfortunate; in theory this could have been avoided if WASI were a superset of Web APIs, but obviously that would have meant compromises on the server side.)
+ </p>
+ <h2 id="current-status">
+ Current status <a href="#current-status" class="bookmark">#</a>
+ </h2>
+ <p>
+ Quite a lot works already! The main limitations are:
+ </p>
+ <ul>
+ <li>
+ <strong>WebAssembly limitations</strong>: Various features, like C++ exceptions, setjmp, and pthreads, depend on JavaScript due to Wasm limitations, and there is no good non-JS replacement yet. (Emscripten may start to support some of them <a href="https://www.youtube.com/watch?v=qQOP6jqZqf8&amp;list=PLqh1Mztq_-N2OnEXkdtF5yymcihwqG57y&amp;index=2&amp;t=0s">using Asyncify</a>, or maybe we'll just wait for <a href="https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md">native Wasm features</a> to arrive to VMs.)
+ </li>
+ <li>
+ <strong>WASI limitations</strong>: Libraries and APIs like OpenGL and SDL don't have corresponding WASI APIs yet.
+ </li>
+ </ul>
+ <p>
+ You <strong>can</strong> still use all those in Emscripten's standalone mode, but the output will contain calls to JS runtime support code. As a result, it will not be 100% WASI (for similar reasons those features also do not work in the WASI SDK). Those Wasm files won't run in WASI runtimes, but you can use them on the Web and you can write your own JS runtime for them. You can also use them as plugins; for example, a game engine could have plugins that render using OpenGL, and the developer would compile them in standalone mode and then implement the OpenGL imports in the engine's Wasm runtime. Standalone Wasm mode still helps here because it makes the output as standalone as Emscripten can make it.
+ </p>
+ <p>
+ You may also find APIs that <strong>do</strong> have a non-JS replacement that we haven’t converted yet, as work is still ongoing. Please <a href="https://github.com/emscripten-core/emscripten/issues">file bugs</a>, and as always help is welcome!
+ </p>
+ </div>
+ <footer>
+ <div>
+ <picture><source srcset="/_img/avatars/alon-zakai.avif, /_img/avatars/[email protected] 2x" type="image/avif" /><img alt="" height="96" loading="lazy" src="/_img/avatars/alon-zakai.jpg" srcset="/_img/avatars/[email protected] 2x" width="96" /></picture>
+ <p>
+ Posted by Alon Zakai.
+ </p>
+ </div><a href="https://twitter.com/v8js/status/1197547645729988608" class="retweet">Retweet this article!</a>
+ </footer>
+ </article>
+ </main>
+ <footer id="footer">
+ <div>
+ <nav>
+ <a href="/logo">Branding</a> · <a href="/terms">Terms</a> · <a href="https://policies.google.com/privacy">Privacy</a> · <a href="https://twitter.com/v8js" rel="me nofollow">Twitter</a> · <a href="https://github.com/v8/v8.dev/tree/main/./src/blog/emscripten-standalone-wasm.md" rel="nofollow">Edit this page on GitHub</a>
+ </nav>
+ </div>
+ <p>
+ <small>Except as otherwise noted, any code samples from the V8 project are licensed under <a href="https://chromium.googlesource.com/v8/v8.git/+/master/LICENSE">V8’s BSD-style license</a>. Other content on this page is licensed under <a href="https://creativecommons.org/licenses/by/3.0/">the Creative Commons Attribution 3.0 License</a>. For details, see <a href="/terms#site-policies">our site policies</a>.</small>
+ </p>
+ </footer>
+ <script src="/_js/dark-mode-toggle.mjs" type="module"></script>
+ <script src="/_js/main.mjs" type="module"></script>
+ <script src="/_js/legacy.js" nomodule=""></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-images.json
new file mode 100644
index 000000000..e9012bd01
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-images.json
@@ -0,0 +1,3 @@
+[
+ "https:\/\/cdn.vox-cdn.com\/thumbor\/7WyjCLC7n6i1IG2eJB06qi1o7kQ=\/0x148:2300x1352\/fit-in\/1200x630\/cdn.vox-cdn.com\/uploads\/chorus_asset\/file\/9871033\/Movies_end_of_year_2017.jpg"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-metadata.json
new file mode 100644
index 000000000..4d61d3bd9
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Alissa Wilkinson",
+ "Direction": null,
+ "Excerpt": "It was an extraordinary year for movies.",
+ "Image": "https:\/\/cdn.vox-cdn.com\/thumbor\/7WyjCLC7n6i1IG2eJB06qi1o7kQ=\/0x148:2300x1352\/fit-in\/1200x630\/cdn.vox-cdn.com\/uploads\/chorus_asset\/file\/9871033\/Movies_end_of_year_2017.jpg",
+ "Title": "How to watch the 21 best films of 2017",
+ "SiteName": "Vox"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected.html
new file mode 100644
index 000000000..82740b180
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/expected.html
@@ -0,0 +1,309 @@
+<div>
+ <p id="oFNvY2">
+ In the introduction to her review anthology <em>For Keeps: 30 Years at the Movies</em>, the legendary film critic Pauline Kael wrote, “I’m frequently asked why I don’t write my memoirs. I think I have.” She meant what most movie critics realize at some point: that reading your past reviews and revisiting the lists of films you liked most during the year reveals not just something about a particular year in cinema, but something about you as well.
+ </p>
+ <p id="49aoQQ">
+ That’s the feeling I get constructing my list of the best films of 2017, a year that overflowed with great films in every genre, from horror and romantic comedy to documentary and arthouse drama. Some of the films on my list have commonalities — ghosts, meditations on memory and interpersonal connection, and women who refuse to behave — but mostly they underscore just how vibrant cinema remains as an art form, even in the midst of massive cultural shifts in the industry and beyond. And it is a keen reminder to me of all the 2017 conversations I’ve had around and at the movies — and the ways I will never be the same.
+ </p>
+ <p id="dC0oTJ">
+ Here are my top 21 films of 2017 and how to watch them at home, with 14 honorable mentions.
+ </p>
+ <h3 id="jDDW9T">
+ 21) <a href="https://www.vox.com/culture/2017/12/12/16765308/last-jedi-star-wars-review-rey-carrie-fisher-poe-finn-kylo-ren"><em>Star Wars: The Last Jedi</em></a>
+ </h3>
+ <div id="x5htN5">
+ <p>
+ <iframe src="https://www.youtube.com/embed/Q0CbN8sfihY?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="WdtoaT">
+ I am as shocked as anyone that a <em>Star Wars</em> movie found its way onto my list — but I was bowled over by <em>The Last Jedi</em>, which may be one of the series’ best. In the hands of writer-director <a href="https://www.vox.com/culture/2017/12/13/16761916/rian-johnson-star-wars-last-jedi-looper-brick-brothers-bloom-fly-breaking-bad">Rian Johnson</a> (who will also oversee <a href="https://www.theverge.com/2017/11/9/16630902/star-wars-new-trilogy-rian-johnson-disney-lucasfilm">a new <em>Star Wars</em> trilogy</a>), <em>The Last Jedi</em> is beautiful to look at and keeps its eye on the relationships between characters and how they communicate with one another, in addition to the bigger galactic story. The same characters are back, but they seem infused with new life, and the galaxy with a new kind of hope. The movie’s best details are in the strong bonds that develop between characters, and I left the film with the realization that for the first time in my life, I loved a <em>Star Wars</em> movie. Now I understand the magic.
+ </p>
+ <p id="m6vJQd">
+ Star Wars: The Last Jedi <em>is currently</em> <a href="https://www.netflix.com/watch/80192018?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=fgPqJgZepxM"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=fgPqJgZepxM"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="3XHosO">
+ 20) <a href="https://www.vox.com/2017/10/6/16434046/faces-places-review-agnes-varda-jr"><em>Faces Places</em></a>
+ </h3>
+ <div id="FZOPyv">
+ <p>
+ <iframe src="https://www.youtube.com/embed/KKbjnLpxv70?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="zP5jCd">
+ The unusual documentary <a href="https://www.vox.com/2017/10/6/16434046/faces-places-review-agnes-varda-jr"><em>Faces Places</em></a> (in French, <em>Visages Villages</em>) turns on the friendship between the accomplished street artist JR and legendary film director Agnès Varda, whose work was central to the development of the French New Wave movement. The pair (whose difference in age is 55 years) met after years of admiring each other’s work and decided to create a documentary portrait of France — by making a number of actual portraits. The film chronicles a leg of the "Inside Outside Project," a roving art initiative in which JR makes enormous portraits of people he meets and pastes them onto buildings and walls. In the film, Varda joins him, and as they talk to people around the country, they grow in their understanding of themselves and of each other. The development of their friendship, which is both affectionate and mutually sharpening, forms <em>Faces Places</em>’ emotional center.
+ </p>
+ <p id="yIfUci">
+ Faces Places <em>is currently</em> <a href="https://www.netflix.com/watch/80194288?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=WuB9Fl8nrzM"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=WuB9Fl8nrzM"><em>YouTube</em></a><em>.</em>
+ </p>
+
+ <h3 id="R0KXNO">
+ 19) <a href="https://www.vox.com/summer-movies/2017/8/8/16107088/ingrid-goes-west-review-aubrey-plaza-elizabeth-olsen"><em>Ingrid Goes West</em></a>
+ </h3>
+ <div id="94aRXv">
+ <p>
+ <iframe src="https://www.youtube.com/embed/xP4vD1tWbPU?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="d2ZAUw">
+ <a href="https://www.vox.com/summer-movies/2017/8/8/16107088/ingrid-goes-west-review-aubrey-plaza-elizabeth-olsen"><em>Ingrid Goes West</em></a> is a twisted and <a href="https://www.vox.com/culture/2017/8/9/16107140/matt-spicer-interview-ingrid-goes-west-dark-comedy-aubrey-plaza-sundance?utm_campaign=vox&amp;utm_content=chorus&amp;utm_medium=social&amp;utm_source=twitter">dark comedy</a> — part addiction narrative, part stalker story — and yet it’s set in a world that’s almost pathologically cheery: the glossy, sunny, nourishing, superfood- and superlative-loving universe of Instagram celebrity. But despite <em>Ingrid Goes West</em>’s spot-on take on that world, the best thing about the film is that it refuses to traffic in lazy buzzwords and easy skewering, particularly at the expense of young women. Instead, the movie conveys that behind every Instagram image and meltdown is a real person, with real insecurities, real feelings, and real problems. And it recognizes that living a life performed in public can be its own kind of self-deluding prison.
+ </p>
+ <p id="oGMXK4">
+ Ingrid Goes West <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1205749" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=c2O7KouP5CM"><em>YouTube</em></a> <em>and</em> <a href="https://play.google.com/store/movies/details?id=c2O7KouP5CM"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="qfZ4Iv">
+ 18) <a href="https://www.vox.com/summer-movies/2017/7/14/15955888/review-lady-macbeth-florence-pugh"><em>Lady Macbeth</em></a>
+ </h3>
+ <div id="0ZWzkX">
+ <p>
+ <iframe src="https://www.youtube.com/embed/2Z0N8ULhuUA?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="Ii1QS5">
+ <a href="https://www.vox.com/summer-movies/2017/7/14/15955888/review-lady-macbeth-florence-pugh"><em>Lady Macbeth</em></a> is no placid costume drama. Adapted from an 1865 Russian novella by Nikolai Leskov, the movie follows Katherine (the astounding Florence Pugh), a woman in the Lady Macbeth line characterized by a potent cocktail of very few scruples and a lot of determination. She's a chilling avatar for the ways that class and privilege — both obvious and hidden — insulate some people from the consequences of their actions while damning others. <em>Lady Macbeth</em> is also a dazzling directorial debut from William Oldroyd, a thrilling combination of sex, murder, intrigue, and power plays. It’s visually stunning, each frame composed so carefully and deliberately that the wildness and danger roiling just below the surface feels even more frightening. Each scene ratchets up the tension to an explosive, chilling end.
+ </p>
+ <p id="e2nBAO">
+ Lady Macbeth <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWrEd3wdB_LiWwwEAAAIk?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWrEd3wdB_LiWwwEAAAIk?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and it is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB074HJGH3F%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F891310" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=l8vAACgcUCo"><em>YouTube</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=l8vAACgcUCo"><em>iTunes</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=l8vAACgcUCo"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="JhEBod">
+ 17) <em>BPM (Beats Per Minute)</em>
+ </h3>
+ <div id="t3derk">
+ <p>
+ <iframe src="https://www.youtube.com/embed/2fhO2A4SL24?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="DEyp0A">
+ <em>BPM (Beats Per Minute)</em> is a remarkably tender and stirring story of the Paris chapter of ACT UP, an AIDS activism group, and the young people who found themselves caught in the crosshairs of the AIDS crisis in the early 1990s. The film follows both the group's actions and the individual members’ shifting relationships to one another — enemies becoming friends, friends becoming lovers, lovers becoming caretakers — as well as their struggles with the disease wracking their community. As an account of the period, it’s riveting; as an exploration of life and love set at the urgent intersection of the political and the personal, it’s devastating.
+ </p>
+ <p id="8vBdkS">
+ BPM (Beats Per Minute) <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1258801" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=xrjoEWj6gLg"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=xrjoEWj6gLg"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="jocryI">
+ 16) <a href="https://www.vox.com/summer-movies/2017/6/21/15837678/big-sick-review-kumail-nanjiani-emily-gordon-zoe-kazan-islam"><em>The Big Sick</em></a>
+ </h3>
+ <div id="ZRFycn">
+ <p>
+ <iframe src="https://www.youtube.com/embed/PJmpSMRQhhs?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="DqZc5Q">
+ Few 2017 movies could top the charm and tenderness of <a href="https://www.vox.com/summer-movies/2017/6/21/15837678/big-sick-review-kumail-nanjiani-emily-gordon-zoe-kazan-islam"><em>The Big Sick</em></a>, which hits all the right romantic comedy notes with one unusual distinction: It feels like real life. That’s probably because <em>The Big Sick</em> is written by <a href="https://www.vox.com/2017/11/22/16687092/the-big-sick-kumail-nanjiani-emily-gordon-real-story">real-life married couple</a> Emily V. Gordon and <em>Silicon Valley</em>'s Kumail Nanjiani, and based on their real-life romance. <em>The Big Sick</em> — which stars Nanjiani as a version of himself, alongside Zoe Kazan as Emily — is funny and sweet while not backing away from matters that romantic comedies don’t usually touch on, like serious illness, struggles in long-term marriages, and religion. As it tells the couple’s story, which takes a serious turn when Emily falls ill with a mysterious infection and her parents (played by Holly Hunter and Ray Romano) come to town, it becomes a funny and wise story about real love.
+ </p>
+ <p id="Wgpjgu">
+ The Big Sick <em>is currently</em> <em>streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FBig-Sick-Kumail-Nanjiani%2Fdp%2FB07193L7RD%2Fref%3Dsr_1_1%3Fie%3DUTF8%26qid%3D1532454848" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fthe-big-sick%2Fid1246483301" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F865258" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB071HFCYDH%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=WUX0wW2OMkA"><em>YouTube</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=WUX0wW2OMkA"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="dFyVjw">
+ 15) <a href="https://www.vox.com/culture/2017/9/10/16277234/mother-review-aronofsky-lawrence-bardem-tiff"><em>Mother!</em></a>
+ </h3>
+ <div id="kUMpyj">
+ <p>
+ <iframe src="https://www.youtube.com/embed/XpICoc65uh0?rel=0&amp;amp;start=17" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="LA1s4n">
+ There’s so much pulsing beneath <a href="https://www.vox.com/culture/2017/9/10/16277234/mother-review-aronofsky-lawrence-bardem-tiff">the surface of <em>Mother!</em></a> that it’s hard to grab on to just one theme as what it “means.” It’s full-on apocalyptic fiction, and like all stories of apocalypse, it’s intended to draw back the veil on reality and show us what’s really beneath. And this movie gets wild: If its gleeful cracking apart of traditional theologies doesn’t get you (there’s a lot of Catholic folk imagery here, complete with an Ash Wednesday-like mud smearing on the foreheads of the faithful), its bonkers scenes of chaos probably will. <em>Mother!</em> is a movie designed to provoke fury, ecstasy, madness, catharsis, and more than a little awe. Watching it, and then participating in the flurry of arguments and discussions unpacking it, was among my best moviegoing experiences of 2017.
+ </p>
+ <p id="mxI0Kb">
+ Mother! <em>is available to digitally purchase on</em> <a href="https://play.google.com/store/movies/details?id=F9p9HlSbIuU"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=F9p9HlSbIuU"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="PL5PTS">
+ 14) <a href="https://www.vox.com/culture/2017/7/7/15925272/ghost-story-review-rooney-mara-casey-affleck"><em>A Ghost Story</em></a>
+ </h3>
+ <div id="76I1cH">
+ <p>
+ <iframe src="https://www.youtube.com/embed/0Vb0F_CN83E?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="JWA6Pb">
+ Director <a href="https://www.vox.com/summer-movies/2017/7/13/15960236/david-lowery-ghost-story-interview">David Lowery</a> filmed <a href="https://www.vox.com/culture/2017/7/7/15925272/ghost-story-review-rooney-mara-casey-affleck"><em>A Ghost Story</em></a> in secret, then premiered it at the Sundance Film Festival to critical acclaim. The movie starts out being about a grieving widow (Rooney Mara) trying to live through the pain of losing her beloved husband, but it soon shifts focus to the ghost of her husband (Casey Affleck, covered in a sheet), evolving into a compelling rumination on the nature of time, memory, history, and the universe. Bathed in warm humor and wistful longing, it's a film that stays with you long after it’s over, a lingering reminder of the inextricable link between love and place.
+ </p>
+ <p id="9CatN2">
+ A Ghost Story <em>is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fa-ghost-story%2Fid1252853654%3Fat%3D1001l6hu%26ct%3Dgca_organic_movie-title_1252853654" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F875682" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB075K4YG8P%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=cGUoTWQIcP0"><em>Google Play</em></a><em>, and</em> <a href="https://www.youtube.com/watch?v=cGUoTWQIcP0"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="rRIM9r">
+ 13) <a href="https://www.vox.com/2017/10/24/16523642/square-review-ruben-ostlund-claes-bang-elisabeth-moss"><em>The Square</em></a>
+ </h3>
+ <div id="z1g0Cs">
+ <p>
+ <iframe src="https://www.youtube.com/embed/EUzRjRv0Ib0?rel=0" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="NavzzU">
+ Winner of the Palme d’Or at the 2017 Cannes Film Festival, <a href="https://www.vox.com/2017/10/24/16523642/square-review-ruben-ostlund-claes-bang-elisabeth-moss"><em>The Square</em></a> is a hilariously needling comedy about the contemporary art world, as well as the kind of idealistic liberalism that is tough to maintain in the face of real problems. The outstanding Claes Bang stars as Christian, a curator whose cluelessness leads him into some outlandishly rough spots, with Elisabeth Moss in a too-short but brilliant part as an American journalist who won’t let him get away with his shenanigans. It’s a heady film with a lot of ideas ricocheting around — and a <em>lot</em> of uncomfortable satire — but if you (like me) are the sort of viewer who loves that stuff, its sly jabs at the veneer of civilization that keeps the social contract intact are intoxicating.
+ </p>
+ <p id="2iTOd5">
+ The Square <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1228556" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=OaD-B0aK9aw"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=OaD-B0aK9aw"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="Px2hT6">
+ 12) <a href="https://www.vox.com/culture/2017/7/17/15984026/dunkirk-review-nolan-rylance-hardy-styles-spoilers"><em>Dunkirk</em></a>
+ </h3>
+ <div id="TDSYe7">
+ <p>
+ <iframe src="https://www.youtube.com/embed/F-eMt3SrfFU?rel=0&amp;amp;start=24" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="MLatLf">
+ <a href="https://www.vox.com/culture/2017/7/17/15984026/dunkirk-review-nolan-rylance-hardy-styles-spoilers"><em>Dunkirk</em></a>, a true cinematic achievement from acclaimed director Christopher Nolan, backs off conventional notions of narrative and chronology as much as possible, while leaning headfirst into everything else that makes a movie a visceral work of art aimed at the senses: the images, the sounds, the scale, the swelling vibrations of it all. You can’t smell the sea spray, but your brain may trick you into thinking you can. Nolan’s camera pushes the edges of the screen as far as it can as <em>Dunkirk</em> engulfs the audience in something that feels like a lot more than a war movie. It’s a symphony for the brave and broken, and it resolves in a major key — but one with an undercurrent of sorrow, and of sober warning. Courage in the face of danger is not just for characters in movies.
+ </p>
+ <p id="cmMBuS">
+ Dunkirk <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWqvX7wxdtyl0YAEAAAFv?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWqvX7wxdtyl0YAEAAAFv?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=yOJhvgczBNk"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=yOJhvgczBNk"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="CPlXz5">
+ 11) <em>Rat Film</em>
+ </h3>
+ <div id="s6q4gj">
+ <p>
+ <iframe src="https://www.youtube.com/embed/f-kpMAKc0l4?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="GFFO6D">
+ <em>Rat Film</em> is about rats, yes — and rat poison experts and rat hunters and people who keep rats as pets. But it’s also about the history of eugenics, dubious science, <a href="https://en.wikipedia.org/wiki/Redlining">“redlining,”</a> and segregated housing in Baltimore. All these pieces come together to form one big essay, where the meaning of each vignette only becomes clearer in light of the whole. It’s a fast-paced, no-holds-barred exploration of a damning history, and it accrues meaning as the images, sounds, and text pile up.
+ </p>
+ <p id="HkeUxt">
+ Rat Film <em>is available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=ZZlweN7XXJ4"><em>YouTube</em></a> <em>and</em> <a href="https://play.google.com/store/movies/details?id=ZZlweN7XXJ4"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="Qgio0l">
+ 10) <a href="https://www.vox.com/culture/2017/4/13/15243556/quiet-passion-review-emily-dickinson-passover-easter"><em>A Quiet Passion</em></a>
+ </h3>
+ <div id="Ya6IEK">
+ <p>
+ <iframe src="https://www.youtube.com/embed/T3SyPbUTEeU?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="EO0XbC">
+ <a href="https://www.vox.com/culture/2017/4/13/15243556/quiet-passion-review-emily-dickinson-passover-easter"><em>A Quiet Passion</em></a> is technically a biographical film about Emily Dickinson, but it transcends its genre to become something more like poetry. It’s a perplexing and challenging film, crafted without the traditional guardrails that guide most biographical movies — dates, times, major accomplishments, and so on. Time slips away in the film almost imperceptibly, and the narrative arc doesn’t yield easily to the viewer. Cynthia Nixon plays Emily Dickinson, whose poetry and life is a perfect match for the signature style of director Terence Davies: rich in detail, deeply enigmatic, and weighed down with a kind of sparkling, joy-tinged sorrow. <em>A Quiet Passion</em> is a portrait, both visual and narrative, of the kind of saint most modern people can understand: one who is certain of her uncertainty, and yearning to walk the path on which her passion and longing meet.
+ </p>
+ <p id="YuHQ0h">
+ A Quiet Passion <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072FP21C5%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent or purchase on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fa-quiet-passion%2Fid1238938795" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F859491" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072FP21C5%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=de0ELdfPGik"><em>YouTube</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=de0ELdfPGik"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="7dz2o3">
+ 9) <em>Columbus</em>
+ </h3>
+ <div id="ZfQfEI">
+ <p>
+ <iframe src="https://www.youtube.com/embed/r3dcnV6Z9Zs?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="pM0BdD">
+ <em>Columbus</em> is a stunner of a debut from video essayist turned director Kogonada. Haley Lu Richardson stars as Casey, a young woman living in Columbus, Indiana, who cares for her mother, works at a library, and harbors a passion for architecture. (Columbus is a mecca for modernist architecture scholars and enthusiasts.) When a visiting architecture scholar falls into a coma in Columbus, his estranged son Jin (John Cho) arrives to wait for him and strikes up a friendship with Casey, who starts to show him her favorite buildings. The two begin to unlock something in each other that’s hard to define but life-changing for both. <em>Columbus</em> is beautiful and subtle, letting us feel how the places we build and the people we let near us move and mold us.
+ </p>
+ <p id="P7j9oY">
+ Columbus <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1185842" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to rent on</em> <a href="https://play.google.com/store/movies/details?id=I-j0IqPQaYU"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=I-j0IqPQaYU"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="wkyPUl">
+ 8) <a href="https://www.vox.com/culture/2017/5/31/15706424/florida-project-review-cannes-sean-baker"><em>The Florida Project</em></a>
+ </h3>
+ <div id="RLHf4Z">
+ <p>
+ <iframe src="https://www.youtube.com/embed/WwQ-NH1rRT4?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="J6kOkz">
+ Sean Baker’s <a href="https://www.vox.com/culture/2017/5/31/15706424/florida-project-review-cannes-sean-baker"><em>The Florida Project</em></a> unfolds at first like a series of sketches about the characters who live in a purple-painted, $35-a-night motel called the Magic Castle down the street from Disney World. The film is held together by the hysterical antics of a kid named Moonee and her pack of young friends, as well as long-suffering hotel manager Bobby (a splendid, warm Willem Dafoe), who tries to put up with it all while keeping some kind of order. But as <em>The Florida Project</em> goes on, a narrative starts to form, one that chronicles with heartbreaking attention the sort of dilemmas that face poor parents and their children in America, and the broken systems that try to cope with impossible situations.
+ </p>
+ <p id="xG8Q8C">
+ The Florida Project <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FFlorida-Project-Willem-Dafoe%2Fdp%2FB0764MS7GQ%2Fref%3Dsr_1_2%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455499%26sr%3D1-2%26keywords%3Dthe%2Bflorida%2Bproject" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=MLsXQdPAlws"><em>YouTube</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2Fdetails%2Ftitle%2F922802" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=MLsXQdPAlws"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="rLGNAf">
+ 7) <a href="https://www.vox.com/2017/11/21/16552862/call-me-by-your-name-review-timothee-chalamet-armie-hammer"><em>Call Me</em> <em>b</em><em>y Your Name</em></a>
+ </h3>
+ <div id="xGksjG">
+ <p>
+ <iframe src="https://www.youtube.com/embed/Z9AYPxH5NTM?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="KyeOGQ">
+ Luca Guadagnino’s gorgeous film <a href="https://www.vox.com/2017/11/21/16552862/call-me-by-your-name-review-timothee-chalamet-armie-hammer"><em>Call Me</em> <em>b</em><em>y Your Name</em></a> adapts André Aciman’s <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FCall-Me-Your-Name-Novel%2Fdp%2F031242678X" rel="nofollow noopener" target="_blank">2007 novel</a> about a precocious 17-year-old named Elio (Timothée Chalamet), who falls in lust and love with his father’s 24-year-old graduate student Oliver (Armie Hammer). It’s remarkable for how it turns literature into pure cinema, all emotion and image and heady sensation. Set in 1983 in Northern Italy, <em>Call Me</em> <em>b</em><em>y Your Name</em> is less about coming out than coming of age, but it also captures a particular sort of love that’s equal parts passion and torment, a kind of irrational heart fire that opens a gate into something longer-lasting. The film is a lush, heady experience for the body, but it’s also an arousal for the soul.
+ </p>
+ <p id="VA1se2">
+ <em>Call Me By Your Name</em> is available to digitally purchase on <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FCall-Your-Name-Armie-Hammer%2Fdp%2FB0791VJLVB%2Fref%3Dsr_1_2%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686%26sr%3D1-2%26keywords%3Dcall%2Bme%2Bby%2Byour%2Bname" rel="nofollow noopener" target="_blank">Amazon,</a> <a href="https://www.youtube.com/watch?v=48o3YYnEUQ4">YouTube</a>, and <a href="https://play.google.com/store/movies/details?id=48o3YYnEUQ4">Google Play</a>.
+ </p>
+ <h3 id="h6Biwc">
+ 6) <em>Personal Shopper</em>
+ </h3>
+ <div id="NSQg2p">
+ <p>
+ <iframe src="https://www.youtube.com/embed/xC8AjoqpBAY?rel=0&amp;amp;start=15" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="pofJH9">
+ In her second collaboration with French director <a href="http://www.imdb.com/name/nm0000801/?ref_=fn_al_nm_1">Olivier Assayas</a>, Kristen Stewart plays a personal shopper to a wealthy socialite, with a sideline as an amateur ghost hunter who’s searching for her dead twin brother. <em>Personal Shopper</em> is deeper than it seems at first blush, a meditation on grief and an exploration of “between” places — on the fringes of wealth, and in the space between life and death. Some souls are linked in a way that can’t be shaken, and whether or not there’s an afterlife doesn’t change the fact that we see and sense them everywhere. (<em>Personal Shopper</em> also has one of the most tense extended scenes involving text messaging ever seen onscreen.)
+ </p>
+ <p id="8hmlTU">
+ Personal Shopper <em>is currently</em> <a href="https://www.showtime.com/#/movie/3436534"><em>streaming on Showtime</em></a> <em>and available to rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F871777" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=-BgiO6uDH7I"><em>YouTube</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072YWLGT2%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fpersonal-shopper%2Fid1241184797" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=-BgiO6uDH7I"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="0RkMKy">
+ 5) <em>Princess Cyd</em>
+ </h3>
+ <div id="7Tj1H6">
+ <p>
+ <iframe src="https://www.youtube.com/embed/sr64EJfnJwE?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="2tSIHW">
+ Stephen Cone is a master of small, carefully realized filmmaking; his earlier films such as <em>The Wise Kids</em> and <em>Henry Gamble’s Birthday Party</em> combine an unusual level of empathy for his characters with an unusual combination of interests: love, desire, sexual awakenings, and religion. <em>Princess Cyd</em> is his most accomplished film yet, about a young woman named Cyd (<a href="http://www.imdb.com/name/nm6570557/?ref_=tt_cl_t2">Jessie Pinnick</a>) who finds herself attracted to Katie (<a href="http://www.imdb.com/name/nm5154548/?ref_=tt_cl_t3">Malic White</a>), a barista, while visiting her Aunt Miranda (<a href="http://www.imdb.com/name/nm2050642/?ref_=tt_cl_t1">Rebecca Spence</a>, playing a character modeled on the author Marilynne Robinson) in Chicago. As she works through her own sexual awakening with Katie, Cyd unwinds some of the ways Miranda’s life has gotten too safe. They provoke each other while forming a bond and being prodded toward a bigger understanding of the world. It is a graceful and honest film, and it feels like a modest miracle.
+ </p>
+ <p id="HDD90m">
+ Princess Cyd <em>is currently</em> <a href="https://www.netflix.com/watch/80201497?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=sy8otjxDw8w"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=sy8otjxDw8w"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="ADtiAV">
+ 4) <a href="https://www.vox.com/culture/2017/2/24/14698632/get-out-review-jordan-peele"><em>Get Out</em></a>
+ </h3>
+ <div id="swjmhh">
+ <p>
+ <iframe src="https://www.youtube.com/embed/sRfnevzM9kQ?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="h1ighb">
+ Racism is sinister, frightening, and deadly. But <a href="https://www.vox.com/culture/2017/2/24/14698632/get-out-review-jordan-peele"><em>Get Out</em></a> (a stunning directorial debut from <em>Key &amp; Peele</em>'s Jordan Peele) isn’t about the blatantly, obviously scary kind of racism — burning crosses and lynchings and snarling hate. Instead, it’s interested in showing how the parts of racism that try to be aggressively unscary are just as horrifying, and it’s interested in making us feel that horror in a visceral, bodily way. In the tradition of the best classic social thrillers, <em>Get Out</em> takes a topic that is often approached cerebrally — casual racism — and turns it into something you feel in your tummy. And it does it with a wicked sense of humor.
+ </p>
+ <p id="2ef6GU">
+ Get Out <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWbhJDwNIacPCwgEAAAG5?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWbhJDwNIacPCwgEAAAG5?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fget-out%2Fid1202441786" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB06Y1H48K7%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=YfLSryEaAfw"><em>Google Play</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=YfLSryEaAfw"><em>YouTube</em></a><em>, and</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F832496%2FGet-Out" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>.</em>
+ </p>
+ <h3 id="TQbjNr">
+ 3) <em>The Work</em>
+ </h3>
+ <div id="GYqgVe">
+ <p>
+ <iframe src="https://www.youtube.com/embed/h8OVXG2GhpQ?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="3Uotb3">
+ <em>The Work</em> is an outstanding, astonishing accomplishment and a viewing experience that will leave you shaken (but in a good way). At Folsom Prison in California, incarcerated men regularly participate in group therapy, and each year other men from the “outside” apply to participate in an intense four-day period of group therapy alongside Folsom’s inmates. <em>The Work</em> spends almost all of its time inside the room where that therapy happens, observing the strong, visceral, and sometimes violent emotions the men feel as they expose the hurt and raw nerves that have shaped how they encounter the world. Watching is not always easy, but by letting us peek in, the film invites viewers to become part of the experience — as if we, too, are being asked to let go.
+ </p>
+ <p id="qjxiQW">
+ The Work <em>is</em> <a href="https://www.topic.com/the-work"><em>streaming on Topic.com</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=iddt4sVZTvI"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=iddt4sVZTvI"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="kUrRP6">
+ 2) <em>Ex Libris</em>
+ </h3>
+ <div id="Lb1IzW">
+ <p>
+ <iframe src="https://www.youtube.com/embed/YzKrlOFZBD8?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="rGpjUU">
+ Frederick Wiseman is one of the towering giants of nonfiction film, a keen observer of American institutions — ranging from prisons to dance companies to welfare offices — for the past half-century. <em>Ex Libris</em> is his mesmerizing look at the New York Public Library and the many functions it fills, which go far beyond housing books. Wiseman works in the observational mode, which means his films contain no captions, dates, or talking-head interviews: We just see what his camera captured, which in this case includes community meetings, benefit dinners, after-school programs, readings with authors and scholars (including Richard Dawkins and Ta-Nehisi Coates), and NYPL patrons going about their business in the library’s branches all over the city. The result is almost hypnotic and, perhaps surprisingly, deeply moving. It makes a case for having faith in the public institutions where ordinary people work — away from the limelight, without trying to score political points — in order to make our communities truly better.
+ </p>
+ <p id="40B8Wq">
+ Ex Libris <em>will air on PBS in the fall and then be available to cardholders in many library systems across the country via</em> <a href="https://www.kanopy.com/"><em>Kanopy</em></a><em>.</em>
+ </p>
+ <h3 id="QJNuyl">
+ 1) <a href="https://www.vox.com/2017/11/2/16552860/lady-bird-review-saoirse-ronan-greta-gerwig"><em>Lady Bird</em></a>
+ </h3>
+ <div id="mgxqrA">
+ <p>
+ <iframe src="https://www.youtube.com/embed/cNi_HC839Wo?rel=0&amp;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </p>
+ </div>
+ <p id="z8uM1l">
+ <em>Lady Bird</em> topped my list almost instantly, and only rose in my estimation on repeated viewings. For many who saw it (including me), it felt like a movie made not just for but <em>about</em> me. <em>Lady Bird</em> is a masterful, exquisite coming-of-age comedy starring the great Saoirse Ronan as Christine — or “Lady Bird,” as she’s re-christened herself — and it’s as funny, smart, and filled with yearning as its heroine. Writer-director Greta Gerwig made the film as an act of love, not just toward her hometown of Sacramento but also toward girlhood, and toward the feeling of always being on the outside of wherever real life is happening. <em>Lady Bird</em> is the rare movie that manages to be affectionate, entertaining, hilarious, witty, and confident. And one line from it struck me as the guiding principle of many of the year’s best films: “Don’t you think they are the same thing? Love, and attention?”
+ </p>
+ <p id="jqSCLV">
+ Lady Bird <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FLady-Bird-Saoirse-Ronan%2Fdp%2FB07734STRN%2Fref%3Dsr_1_3%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FLady-Bird-Saoirse-Ronan%2Fdp%2FB07734STRN%2Fref%3Dsr_1_3%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=yBIPcwJ03V4"><em>Google Play</em></a><em>, and</em> <a href="https://www.youtube.com/watch?v=yBIPcwJ03V4"><em>YouTube</em></a><em>.</em>
+ </p>
+ <p id="EVymKt">
+ <strong>Honorable mentions:</strong> <em>Marjorie Prime</em>, <em>Phantom Thread</em>, <a href="https://www.vox.com/culture/2017/4/28/15437008/casting-jonbenet-kitty-green-interview-netflix"><em>Casting JonBenet</em></a>, <a href="https://www.vox.com/2017/12/6/16682926/the-post-review-spieberg-streep-hanks-pentagon-nixon"><em>The Post</em></a>, <a href="https://www.vox.com/culture/2017/9/12/16288080/shape-of-water-del-toro-review-tiff"><em>The Shape of Water</em></a>, <a href="https://www.vox.com/summer-movies/2017/8/17/16150634/logan-lucky-review-soderbergh-tatum-driver-craig"><em>Logan Lucky</em></a>, <a href="https://www.vox.com/culture/2017/9/14/16301552/i-tonya-harding-kerrigan-review-tiff"><em>I, Tonya</em></a>, <a href="https://www.vox.com/culture/2017/4/13/15243584/lost-city-of-z-review-james-gray-charlie-hunnam-robert-pattinson"><em>The Lost City of Z</em></a>, <em>Graduation</em>, <em>Spettacolo</em>, <em>Loveless</em>, <em>Restless Creature: Wendy Whelan</em>, <em>In Transit</em>, <a href="https://www.vox.com/culture/2017/6/29/15844952/reagan-show-review"><em>The Reagan Show</em></a>
+ </p>
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/source.html
new file mode 100644
index 000000000..9e407bc38
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-1/source.html
@@ -0,0 +1,1319 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>
+ How to watch the 21 best films of 2017 - Vox
+ </title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+ <meta name="apple-mobile-web-app-title" content="Vox" />
+ <script type="text/javascript" src="https://optimize-stats.voxmedia.com/loader.min.js?key=beb6b278a131e3b9"></script>
+ <meta property="article:publisher" content="https://www.facebook.com/Vox" />
+ <meta property="author" content="Alissa Wilkinson" />
+ <meta property="article:author" content="http://facebook.com/alissawilkinson" />
+ <meta property="article:published_time" content="2017-12-15T08:50:02-05:00" />
+ <meta property="article:modified_time" content="2018-07-24T14:15:58-04:00" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bookitalic.woff2" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-book.woff2" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bolditalic.woff2" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bold.woff2" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_text_regular_italic.woff2" as="font" type="font/woff2" crossorigin="" />
+ <link rel="preload" href="https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_display_black.woff2" as="font" type="font/woff2" crossorigin="" />
+ <meta id="chorus-fonts" data-cid="site/font_loader-1551300229_5055_12234" data-cdata="{&quot;version&quot;:&quot;9f8ee6f3bdedf804934bcc0183d202bf&quot;,&quot;fonts_catalog&quot;:[{&quot;slug&quot;:&quot;vox-balto&quot;,&quot;family&quot;:&quot;Balto&quot;,&quot;weight&quot;:&quot;400&quot;,&quot;style&quot;:&quot;italic&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bookitalic.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bookitalic.woff&quot;},{&quot;slug&quot;:&quot;vox-balto&quot;,&quot;family&quot;:&quot;Balto&quot;,&quot;weight&quot;:&quot;400&quot;,&quot;style&quot;:&quot;normal&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-book.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-book.woff&quot;},{&quot;slug&quot;:&quot;vox-balto&quot;,&quot;family&quot;:&quot;Balto&quot;,&quot;weight&quot;:&quot;600&quot;,&quot;style&quot;:&quot;italic&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bolditalic.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bolditalic.woff&quot;},{&quot;slug&quot;:&quot;vox-balto&quot;,&quot;family&quot;:&quot;Balto&quot;,&quot;weight&quot;:&quot;700&quot;,&quot;style&quot;:&quot;normal&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bold.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/baltoweb-bold.woff&quot;},{&quot;slug&quot;:&quot;vox-harriet&quot;,&quot;family&quot;:&quot;Harriet&quot;,&quot;weight&quot;:&quot;400&quot;,&quot;style&quot;:&quot;italic&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_text_regular_italic.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_text_regular_italic.woff&quot;},{&quot;slug&quot;:&quot;vox-harriet-black&quot;,&quot;family&quot;:&quot;HarrietDisplayBlack&quot;,&quot;weight&quot;:&quot;400&quot;,&quot;style&quot;:&quot;italic&quot;,&quot;woff2_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_display_black.woff2&quot;,&quot;woff_url&quot;:&quot;https://cdn.vox-cdn.com/shared_fonts/unison/vox/webfonts/harriet_display_black.woff&quot;}],&quot;font_stylesheets&quot;:[&quot;https://fonts.voxmedia.com/unison/stylesheets/vox.0e5fbdb944cfd2ebf347dcc8f8246d7b.css&quot;],&quot;font_tracker_stylesheets&quot;:[],&quot;typekit_ids&quot;:[],&quot;headline_balance_div_classes&quot;:&quot;.c-page-title,.c-entry-summary,.c-entry-box__title,.c-entry-box--compact__title,.c-entry-box--compact__dek,.c-rock-list__entry-title&quot;,&quot;headline_balance_fraction&quot;:0.5}" />
+ <script>
+ <![CDATA[
+ var chorusInitQueue=[],volume_embed_host="https://volume.vox-cdn.com";var Chorus=Chorus||{};Chorus.windowLoaded=!1,Chorus.AddScript=function(t,e){var o=document.createElement("script");o.async=!0,o.type="text/javascript",o.src=t,"function"==typeof e&&(o.onload=e);var a=document.getElementsByTagName("script")[0];return a.parentNode.insertBefore(o,a),o},Chorus.ready=function(t){"loading"!=document.readyState?t():document.addEventListener?document.addEventListener("DOMContentLoaded",t):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&t()})},Chorus.OnLoad=function(t){if(Chorus.windowLoaded=!0)return void t();var e=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){e(),t()}},Chorus.OnLoad(function(){Chorus.windowLoaded=!0});var dataLayer=dataLayer||[];Chorus.OnLoad(function(){var t;void 0!==navigator.doNotTrack?t=navigator.doNotTrack:void 0!==window.doNotTrack?t=window.doNotTrack:void 0!==navigator.msDoNotTrack&&(t=navigator.msDoNotTrack),t=void 0!==t?/1|yes|true/.test(String(t).toLowerCase())?"true":"false":"undefined";var e={DNT:t};dataLayer.push(e)});var VoxMediaFontLoader=function(t){function e(t,e){var o=window.performance;if(o&&o.mark&&o.measure){var a=t.toLocaleLowerCase().replace(/\W+/g,"_")+(e?"_"+e:"");o.mark(a),o.measure(a+"_time","navigationStart",a)}}function o(){s.classList.add(c),e("fonts_success")}function a(){s.classList.add(c),e("fonts_fail")}function n(t){var o=[t.family,t.style,t.weight,"loaded"].join(" ");e(o)}function r(t){var e=u.font_stylesheets||[];t&&(e=e.filter(function(e){return!e.match(t)})),e.forEach(i)}function i(e){var o=t.createElement("link");o.href=e,o.rel="stylesheet",o.media="all",f.parentNode.insertBefore(o,f)}function d(e){var o,a=t,n=a.documentElement,r=setTimeout(function(){n.className=n.className.replace(/\bwf-loading\b/g,"")+" wf-inactive"},e.scriptTimeout),i=a.createElement("script"),d=!1,c=a.getElementsByTagName("script")[0];n.className+=" wf-loading",i.src="https://use.typekit.net/"+e.kitId+".js",i.async=!0,i.onload=i.onreadystatechange=function(){if(o=this.readyState,!(d||o&&"complete"!=o&&"loaded"!=o)){d=!0,clearTimeout(r);try{Typekit.load(e)}catch(t){}}},c.parentNode.insertBefore(i,c)}var c="fonts-loaded",s=t.documentElement,f=t.getElementById("chorus-fonts");if(f){var u=JSON.parse(f.getAttribute("data-cdata"));t.fonts?(r("voxmedia.com"),u.fonts_catalog.forEach(function(e){if(e.woff2_url||e.woff_url){var o=[e.woff2_url,e.woff_url].filter(function(t){return t}).map(function(t){return"url("+t+")"}).join(", "),a=new FontFace(e.family,o,{weight:e.weight,style:e.style});t.fonts.add(a),a.load().then(n)}}),t.fonts.ready.then(o,a)):r(),u.typekit_ids.forEach(function(t){d({kitId:t,scriptTimeout:3e3,async:!0})}),u.font_tracker_stylesheets.forEach(i)}};VoxMediaFontLoader(document);
+ ]]>
+ </script>
+ <script class="kxint" type="text/javascript">
+ //<![CDATA[
+ window.Krux||((Krux=function(){Krux.q.push(arguments);}).q=[]);
+ (function(){
+ function retrieve(e){var r,o="kxvoxmedia_"+e;return window.localStorage?window.localStorage[o]||"":navigator.cookieEnabled?(r=document.cookie.match(o+"=([^;]*)"),r&&unescape(r[1])||""):""}Krux.user=retrieve("user"),Krux.segments=retrieve("segs")&&retrieve("segs").split(",")||[];
+ })();
+ //]]>
+ </script>
+ <script>
+ <![CDATA[
+ dataLayer = [{"Network":"vox","Community":"vox","GA Primary ID":"UA-48698701-1","GA CrossDomains":"vox.com","Content ID":"16515179","Story Word Count":3472,"Entry Groups":"front-page:movies:culture:awards-season:2017-in-review","Hidden Groups":"Category—Evergreen","Author":"Alissa Wilkinson","Last Time Updated":"2018-07-24 14:16","Hour of Update":"14","Publish Date":"2017-12-15 08:50","Hour of Publish":"08","Demand Post":"no","All Chorus Categories":"vox:vox:front-page:movies:culture:awards-season:2017-in-review:Category—Evergreen","Content Type":"article","chartbeat_domain":"vox.com","chartbeat_zone":"172968584/vox/vox.com/2017-in-review","chartbeat_authors":"Alissa Wilkinson","Logged in Status":"Logged Out"}];
+ ]]>
+ </script><!-- Google Tag Manager -->
+
+ <script>
+ <![CDATA[
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+ })(window,document,'script','dataLayer','GTM-W8JKW6');
+ ]]>
+ </script><!-- End Google Tag Manager -->
+
+ <script>
+ <![CDATA[
+ var concertAdsQueue = concertAdsQueue || [];
+
+ CONCERT_ADS_CONFIG = {"production":true,"slug":"/172968584/vox/vox.com/2017-in-review","dfpVariables":{"network":["vox"],"affiliation":["general"],"unison":[true],"entry_id":[16515179],"entry_type":["article"],"entry_slug":["2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch"],"entry_author":["Alissa Wilkinson"],"entry_group":["front-page","movies","culture","awards-season","2017-in-review","category-evergreen"],"hub_page":["culture","2017-in-review"],"page_type":["interior_page"],"keywords":"how to watch the best films of vox"},"isUnison":true,"is_unison":true,"prebid":{"enabled":false,"timeout":1000,"defaultConfig":{"openx":{"delDomain":"sbnationbidder-d.openx.net"},"rubicon":{"accountId":7470,"position":"btf"},"rubiconLite":{"accountId":18288,"siteId":193902,"sizes":[213,270,271,272],"position":"btf"},"consumable":{"networkId":9969,"siteId":1039096}},"prelude":{"trustx":{"uid":2663}},"reskin":{"trustx":{"uid":2664}},"desktop_leaderboard_variable":{"trustx":{"uid":2665}},"medium_rectangle_variable":{"trustx":{"uid":2666}},"btf_medium_rectangle_variable":{"trustx":{"uid":2668}},"desktop_article_medrec_dynamic":{"trustx":{"uid":2669}},"btf_leaderboard_variable":{"trustx":{"uid":2670}},"native_ad_latest":{"trustx":{"uid":2671}},"native_ad_ymal_link":{"trustx":{"uid":2672}},"mobile_leaderboard":{"trustx":{"uid":2673}},"mobile_article_body":{"trustx":{"uid":2674}},"native_ad_mobile":{"trustx":{"uid":2675}},"mobile_article_body_med_rec_dynamic":{"trustx":{"uid":2676}},"mobile_footer":{"trustx":{"uid":2677}},"tablet_leaderboard":{"trustx":{"uid":2678}},"tablet_medium_rectangle":{"trustx":{"uid":2679}},"tablet_btf_leaderboard":{"trustx":{"uid":2680}},"native_ad_content_link":{"trustx":{"uid":2681}},"hub_river_leaderboard":{"trustx":{"uid":2682}},"hub_river_med_rec":{"trustx":{"uid":2684}},"mobile_med_rec_athena":{"trustx":{"uid":2685}}},"slots":[{"name":"editorially_placed_athena_mobile","className":"m-ad__editorially_placed_athena","prebidName":"editorially_placed_athena","selector":".m-ad.m-ad__editorial-athena-placement","sizes":[[1030,590],[325,508],[325,203],[325,236],[325,204]],"holdSize":[300,500],"filters":{"viewportWidth":{"max":727}}},{"name":"editorially_placed_athena_desktop","className":"m-ad__editorially_placed_athena","prebidName":"editorially_placed_athena","selector":".m-ad.m-ad__editorial-athena-placement","sizes":[[1030,590],{"size":[1060,610],"filters":{"containerWidth":{"min":1060}}},{"size":[620,366],"filters":{"containerWidth":{"max":1059}}},{"size":[1060,619],"filters":{"containerWidth":{"min":1060}}},{"size":[1060,694],"filters":{"containerWidth":{"min":1060}}}],"holdSize":[728,295],"filters":{"viewportWidth":{"min":728}}},{"name":"editorially_placed_leaderboard","selector":".m-ad.m-ad__editorial-leaderboard-placement","sizes":[[728,90]],"holdSize":[728,90],"filters":{"viewportWidth":{"min":728}}},{"name":"native_quicklistings","selector":".l-hub-page .river-segment-0 .c-compact-river__entry:nth-child(2), .l-hub-page .river-segment-0 .c-compact-river__entry:nth-child(6), .l-hub-page .river-segment-0 .c-compact-river__entry:nth-child(8), .l-hub-page .river-segment-0 .c-compact-river__entry:nth-child(10)","sizes":["fluid"],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"matchDomain":{"domains":"curbed.com, atlanta.curbed.com, austin.curbed.com, boston.curbed.com, chicago.curbed.com, detroit.curbed.com, hamptons.curbed.com, la.curbed.com, miami.curbed.com, nola.curbed.com, ny.curbed.com, philly.curbed.com, sf.curbed.com, seattle.curbed.com, dc.curbed.com"}}},{"name":"native_quicklistings_article","selector":".l-segment .l-segment .c-compact-river__entry","sizes":["fluid"],"maxSlots":1,"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"insertion":"after","filters":{"matchDomain":{"domains":"curbed.com, atlanta.curbed.com, austin.curbed.com, boston.curbed.com, chicago.curbed.com, detroit.curbed.com, hamptons.curbed.com, la.curbed.com, miami.curbed.com, nola.curbed.com, ny.curbed.com, philly.curbed.com, sf.curbed.com, seattle.curbed.com, dc.curbed.com"}}},{"name":"prelude","selector":".l-root","sizes":[[1400,600]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"allowSiblings":true,"filters":{"viewportWidth":{"min":881},"deviceType":"desktop"}},{"name":"reskin","selector":".l-root","sizes":[[2,2]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"viewportWidth":{"min":1280},"hideIfPresent":{"selector":".l-feature, .c-maps-hub"}}},{"name":"desktop_leaderboard_variable","selector":".l-header","sizes":[[728,90],[970,250],[970,90],[1020,90]],"holdSize":[728,90],"insertion":"after","filters":{"viewportWidth":{"min":881},"hideIfPresent":{"selector":".l-feature"}}},{"name":"tablet_leaderboard","selector":".l-header","sizes":[[728,90]],"holdSize":[728,90],"insertion":"after","filters":{"viewportWidth":{"min":729,"max":880}}},{"name":"mobile_leaderboard_hub","className":"m-ad__mobile_leaderboard","prebidName":"mobile_leaderboard","selector":".l-hub-page .l-header","sizes":[[320,50],[300,250]],"holdSize":[300,250],"insertion":"after","maxSlots":1,"filters":{"viewportWidth":{"max":728}}},{"name":"mobile_leaderboard_group","className":"m-ad__mobile_leaderboard","prebidName":"mobile_leaderboard","selector":".l-group-page .l-header","sizes":[[320,50]],"holdSize":[320,50],"insertion":"after","maxSlots":1,"filters":{"viewportWidth":{"max":728}}},{"name":"package_cover_ad","selector":".c-package-subnav","sizes":[[728,90],[970,250],[970,90],[1020,90],[1030,590],{"size":[1060,610],"filters":{"containerWidth":{"min":1060}}},{"size":[620,366],"filters":{"containerWidth":{"max":1059}}},{"size":[1060,619],"filters":{"containerWidth":{"min":1060}}},{"size":[1060,694],"filters":{"containerWidth":{"min":1060}}}],"holdSize":[728,90],"insertion":"after","filters":{"viewportWidth":{"min":729}}},{"name":"package_cover_ad_mobile","selector":".c-package-subnav","sizes":[[320,50],[300,250],[1030,590],[325,508],[325,203],[325,236],[325,204],[1020,90]],"holdSize":[320,50],"insertion":"after","filters":{"viewportWidth":{"max":729}}},{"name":"btf_leaderboard_variable","selector":".c-footer","sizes":[[728,90],[1020,90]],"holdSize":[728,90],"filters":{"viewportWidth":{"min":881}}},{"name":"tablet_btf_leaderboard","selector":".c-footer","sizes":[[728,90]],"holdSize":[728,90],"filters":{"viewportWidth":{"min":729,"max":888}}},{"name":"mobile_footer","selector":"body:not(.entry_layout_unison_package_landing) .c-footer","sizes":[[320,50],[300,250],[325,203],[325,236],[325,204]],"holdSize":[300,250],"filters":{"viewportWidth":{"min":0,"max":728}}},{"name":"package_mobile_footer","selector":".entry_layout_unison_package_landing .c-footer","sizes":[[320,50],[300,250],[1030,590],[325,508],[325,203],[325,236],[325,204]],"holdSize":[300,250],"filters":{"viewportWidth":{"min":0,"max":728}}},{"name":"mobile_feature_body","className":"m-ad__mobile_article_body_med_rec_dynamic","prebidName":"mobile_article_body_med_rec_dynamic","selector":".l-feature .c-entry-content \u003e p + p","sizes":[[300,250],[325,508],[325,203],[325,236],[325,204],[320,50],[1030,590]],"previewHoldSize":[300,250],"maxSlots":1,"filters":{"spacing":{"before":150},"viewportWidth":{"max":779}}},{"name":"desktop_feature_body","selector":".l-feature .c-entry-content \u003e p + p + p","sizes":[[728,90],[620,366],[1030,590]],"previewHoldSize":[728,90],"maxSlots":1,"insertion":"after","filters":{"avoidFloats":true,"viewportWidth":{"min":780},"hideIfPresent":{"selector":".c-buying-guide"}}},{"name":"desktop_feature_body_dynamic","className":"m-ad__desktop_feature_body","prebidName":"desktop_feature_body","selector":".l-feature .c-entry-content \u003e p + p","sizes":[[728,90],[300,250],[620,366],[1030,590]],"previewHoldSize":[728,90],"maxSlots":3,"filters":{"avoidFloats":true,"spacing":{"before":1500},"paragraphHeight":{"above":200},"viewportWidth":{"min":780},"hideIfPresent":{"selector":".c-buying-guide"}}},{"name":"athena_features_mobile","className":"m-ad__athena_features","prebidName":"athena_features","selector":".l-feature .c-entry-content \u003e p + p","sizes":[[1030,590],[325,508],[300,250],[300,265],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"maxSlots":1,"filters":{"avoidFloats":true,"paragraphHeight":{"above":200},"viewportWidth":{"max":779},"spacing":{"before":1500}}},{"name":"athena_features_dynamic_mobile","className":"m-ad__athena_features_dynamic","prebidName":"athena_features_dynamic","selector":".l-feature .c-entry-content \u003e p + p","sizes":[[1030,590],[325,508],[300,250],[300,265],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"maxSlots":2,"filters":{"avoidFloats":true,"paragraphHeight":{"above":200},"viewportWidth":{"max":779},"spacing":{"before":1500}}},{"name":"athena_features_desktop","className":"m-ad__athena_features","prebidName":"athena_features","selector":".l-feature .c-entry-content \u003e p + p","sizes":[[1030,590],[620,366],[620,371],[620,415]],"previewHoldSize":[726,415],"maxSlots":3,"filters":{"paragraphHeight":{"above":200},"avoidFloats":true,"viewportWidth":{"min":779},"spacing":{"before":2000}}},{"name":"mobile_leaderboard","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p","sizes":[[320,50],[300,250]],"holdSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"max":728}}},{"name":"desktop_article_body","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p, .l-article .c-entry-content \u003e p + p","sizes":[[1030,590],[620,366],[620,371],[620,415],{"size":[728,90],"filters":{"containerWidth":{"min":700}}}],"previewHoldSize":[726,415],"maxSlots":1,"filters":{"avoidFloats":true,"spacing":{"before":750,"after":450},"containerWidth":{"min":620}}},{"name":"mobile_article_body","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p","sizes":[[1030,590],[325,508],[300,250],[300,265],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"max":728},"spacing":{"before":600}}},{"name":"native_ad_mobile","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p","sizes":[[1030,590],[325,508],[300,250],[300,265],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"max":728},"spacing":{"before":600}}},{"name":"mobile_article_body_med_rec_dynamic","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p","sizes":[[300,250],[1030,590],[325,508],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"filters":{"viewportWidth":{"max":728},"spacing":{"before":900}}},{"name":"desktop_article_medrec_dynamic","selector":".l-segment:not(.l-feature) .c-entry-content \u003e p + p, .l-article .c-entry-content \u003e p + p","sizes":[[300,250]],"holdSize":[300,250],"filters":{"paragraphHeight":{"above":150,"below":250},"viewportWidth":{"min":729},"avoidFloats":true,"spacing":{"before":1500,"after":750}}},{"name":"medium_rectangle_variable","selector":".l-col__sidebar:not(.c-sports-blog-directory__filter) \u003e div:first-of-type, .l-article-sidebar \u003e *:first-child","sizes":[[300,250],[300,600]],"holdSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"min":881},"hideIfPresent":{"selector":".l-full-archives"},"elementHeight":{"selector":".l-article-body-segment .l-col__main, .l-main-content \u003e .l-col__main","min":2001}}},{"name":"medium_rectangle_short","selector":".l-col__sidebar:not(.c-sports-blog-directory__filter) \u003e div:first-of-type, .l-article-sidebar \u003e *:first-child","sizes":[[300,250]],"holdSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"min":881},"hideIfPresent":{"selector":".l-full-archives"},"elementHeight":{"selector":".l-article-body-segment .l-col__main, .l-main-content \u003e .l-col__main","max":2000}}},{"name":"btf_medium_rectangle_variable_article","className":"m-ad__btf_medium_rectangle_variable","prebidName":"btf_medium_rectangle_variable","selector":"body[data-entry-id] .l-col__sidebar:not(.c-sports-blog-directory__filter) \u003e div:last-of-type","sticky":true,"sizes":[[300,250],{"size":[300,600],"filters":{"viewportHeight":{"min":600}}}],"holdSize":[300,250],"insertion":"after","maxSlots":1,"filters":{"viewportWidth":{"min":881}}},{"name":"btf_medium_rectangle_variable_hub","className":"m-ad__btf_medium_rectangle_variable","prebidName":"btf_medium_rectangle_variable","selector":".l-hub-page .river-segment-1 .l-col__sidebar \u003e div:last-of-type, .l-hub-page .river-segment-0 .l-col__sidebar \u003e div:last-of-type, .l-group-page .river-segment-0 .l-col__sidebar \u003e div:last-of-type","sizes":[[300,250]],"holdSize":[300,250],"insertion":"after","maxSlots":2,"filters":{"viewportWidth":{"min":881},"hideIfPresent":{"selector":".l-full-archives"}}},{"name":"in_map_legacy","className":"m-ad__in_map","prebidName":"in_map","selector":".c-mapstack__ad","sizes":[[300,250]],"previewHoldSize":[300,250]},{"name":"in_map","selector":".c-mapstack__card--ad","sizes":[[300,250],[1030,590],[620,366],[620,371],[620,415]],"previewHoldSize":[300,250],"insertion":"after"},{"name":"mapstack_sponsorship","className":"m-ad__mapstack_sponsorship","selector":".c-mapstack__content","insertion":"before","maxSlots":1,"sizes":[[200,40]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"athena_hub","className":"m-ad__athena","prebidName":"athena","selector":".l-hub-page .river-segment-0, .l-group-page .river-segment-0","sizes":[[1030,590],{"size":[1060,610],"filters":{"containerWidth":{"min":1060}}},{"size":[620,366],"filters":{"containerWidth":{"max":1059}}},{"size":[1060,619],"filters":{"containerWidth":{"min":1060}}},{"size":[1060,694],"filters":{"containerWidth":{"min":1060}}}],"holdSize":[728,295],"maxSlots":1,"insertion":"after","filters":{"viewportWidth":{"min":728}}},{"name":"athena_article","className":"m-ad__athena","prebidName":"athena","selector":".l-article-body-segment","sizes":[[1030,590],[728,90],{"size":[1060,610],"filters":{"containerWidth":{"min":1060}}},{"size":[620,366],"filters":{"containerWidth":{"max":1059}}},{"size":[970,250],"filters":{"viewportWidth":{"min":970}}},{"size":[620,371],"filters":{"containerWidth":{"max":1059}}},{"size":[620,415],"filters":{"containerWidth":{"max":1059}}}],"holdSize":[728,295],"maxSlots":1,"insertion":"after","filters":{"viewportWidth":{"min":728}}},{"name":"hub_river_leaderboard","selector":".l-hub-page .c-compact-river__entry, .l-group-page .c-compact-river__entry","sizes":[[728,90],[1030,590],[620,366]],"holdSize":[728,90],"filters":{"spacing":{"before":700,"after":500,"exceptSlot":"native_quicklistings"},"containerWidth":{"min":728}}},{"name":"mobile_med_rec_athena","selector":".l-hub-page .river-segment-0","sizes":[[300,250],[1030,590],[325,508],[300,265],[325,203],[325,236],[325,204]],"holdSize":[300,250],"maxSlots":1,"insertion":"after","filters":{"viewportWidth":{"max":728}}},{"name":"hub_river_med_rec","selector":".l-hub-wrapper .c-compact-river__entry, .l-group-page .c-compact-river__entry","sizes":[[300,250],[1030,590]],"customSizes":[{"placement":1,"sizes":[[1030,590]]}],"holdSize":[300,250],"filters":{"spacing":{"before":600,"after":400},"viewportWidth":{"max":728}}},{"name":"gift_guide_leaderboard_variable_desktop","className":"m-ad__desktop_article_body","prebidName":"desktop_article_body","selector":".l-feature .c-buying-guide","sizes":[[1030,590],[620,366],[728,90],[620,371],[620,415]],"previewHoldSize":[726,415],"maxSlots":1,"filters":{"viewportWidth":{"min":728}}},{"name":"gift_guide_leaderboard_mobile","className":"m-ad__mobile_leaderboard","prebidName":"mobile_leaderboard","selector":".l-feature .c-buying-guide","sizes":[[320,50],[300,250],[1030,590]],"holdSize":[300,250],"maxSlots":1,"filters":{"viewportWidth":{"max":728}}},{"name":"storystream_top_leaderboard_desktop","className":"m-ad__hub_river_leaderboard","prebidName":"hub_river_leaderboard","selector":".l-main-content \u003e .c-entry-group-labels--stream","sizes":[[728,90]],"holdSize":[728,90],"maxSlots":1,"filters":{"viewportWidth":{"min":880}}},{"name":"storystream_bottom_leaderboard_variable_desktop","className":"m-ad__desktop_article_body","prebidName":"desktop_article_body","selector":".c-entry-group-labels--stream ~ .c-entry-update-bar","sizes":[[1030,590],[620,366],[620,371],[620,415],[728,90]],"previewHoldSize":[726,415],"maxSlots":1,"filters":{"avoidFloats":true,"containerWidth":{"min":729}}},{"name":"storystream_river_leaderboard_variable_desktop","className":"m-ad__hub_river_leaderboard","prebidName":"hub_river_leaderboard","selector":".c-stream-list .c-stream-list__entry:nth-of-type(6n) .c-entry-box--stream-item","sizes":[[1030,590],[620,366],[620,371],[620,415],[728,90]],"previewHoldSize":[726,415],"insertion":"after","filters":{"viewportWidth":{"min":729}}},{"name":"storystream_top_leaderboard_mobile","className":"m-ad__hub_river_leaderboard","prebidName":"hub_river_leaderboard","selector":".l-main-content \u003e .c-entry-group-labels--stream","sizes":[[320,50]],"holdSize":[320,50],"maxSlots":1,"filters":{"viewportWidth":{"max":728}}},{"name":"storystream_bottom_leaderboard_variable_mobile","className":"m-ad__mobile_article_body_med_rec_dynamic","prebidName":"mobile_article_body_med_rec_dynamic","selector":".c-entry-group-labels--stream ~ .c-entry-update-bar","sizes":[[320,50],[300,250],[1030,590],[325,508],[325,203],[325,236],[325,204]],"previewHoldSize":[300,250],"maxSlots":1,"filters":{"containerWidth":{"max":728}}},{"name":"storystream_river_leaderboard_variable_mobile","className":"m-ad__mobile_article_body_med_rec_dynamic","prebidName":"mobile_article_body_med_rec_dynamic","selector":".c-stream-list .c-stream-list__entry:nth-of-type(6n) .c-entry-box--stream-item","sizes":[[320,50],[300,250]],"customSizes":[{"placement":2,"sizes":[[320,50],[300,250],[1030,590],[325,508],[325,203],[325,236],[325,204]]}],"previewHoldSize":[300,250],"insertion":"after","filters":{"viewportWidth":{"max":728}}},{"name":"site_sponsorship_logo_white","selector":".site_sponsorship_logo.site_sponsorship_logo-white","sizes":[[26,1]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"viewportWidth":{"min":601}}},{"name":"site_sponsorship_logo_color","selector":".site_sponsorship_logo:not(.site_sponsorship_logo-white), .c-tab-bar__sponsorship","sizes":[[26,2]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"viewportWidth":{"min":601}}},{"name":"site_sponsorship_logo_mobile_white","selector":".site_sponsorship_logo_mobile.site_sponsorship_logo-white","sizes":[[26,3]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"viewportWidth":{"max":600}}},{"name":"site_sponsorship_logo_mobile_color","selector":".site_sponsorship_logo_mobile:not(.site_sponsorship_logo-white), .c-tab-bar__sponsorship","sizes":[[26,4]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"filters":{"viewportWidth":{"max":600}}},{"name":"native_ad_latest","selector":".dynamic-native-ad-native_ad_latest","sizes":[[300,100]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"native_ad_video","selector":".dynamic-native-ad-native_ad_video","sizes":[[200,200]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"native_ad_ymal_link","selector":".dynamic-native-ad-native_ad_ymal_link","sizes":[[1200,100]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"native_ad_linkset_link","selector":".dynamic-native-ad-native_ad_linkset_link","sizes":[[1200,100]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"native_ad_content_link","selector":".dynamic-native-ad-native_ad_content_link","sizes":[[650,150]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"native_ad_module","selector":".c-related-list","sizes":["fluid"],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"maxSlots":1},{"name":"branded_content_feedback_form","selector":".branded_content_feedback_form","sizes":[[300,200]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false,"maxSlots":1},{"name":"article_sponsorship","className":"m-ad__article_sponsorship","selector":"body.entry_layout_unison_main .c-entry-hero--feature .c-entry-hero__content .c-byline, body.entry_layout_unison_main div.c-entry-hero:not(.c-entry-hero--feature)","insertion":"after","maxSlots":1,"sizes":[[200,40]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"hub_sponsorship","className":"m-ad__hub_sponsorship","selector":".c-hub-title__inner","insertion":"after","maxSlots":1,"sizes":[[200,40]],"prebidEligible":false,"refreshEligible":false,"watcherEligible":false},{"name":"failsafe_article_med_rec_athena_mobile","className":"m-ad__mobile_med_rec_athena","prebidName":"mobile_med_rec_athena","selector":"body:not(.entry_template_stream):not(.entry_template_package_landing) .c-entry-content \u003e *:last-child","sizes":[[300,250],[1030,590],[325,508],[300,265],[325,203],[325,236],[325,204]],"holdSize":[300,250],"maxSlots":1,"insertion":"after","filters":{"viewportWidth":{"max":728},"spacing":{"before":600},"hideIfPresent":{"selector":".c-entry-content .m-ad","count":2}}}],"adConfigurationUrl":"https://concertads-configs.vox-cdn.com/sbn/vox/config.json"};
+ ]]>
+ </script>
+ <link href="https://www.vox.com/style/community/441/a623a9b794a00fd0f8dd38707abe8547/chorus.css" data-chorus-theme="chorus" rel="stylesheet" media="all" />
+ <meta name="style-tools" content="https://www.vox.com/style/community/441/70ae1812f16cb0c331c92973ff144d2c/tools.css" />
+ <script class="kxct" data-id="JImdKGAx" data-timing="async" data-version="1.9" type="text/javascript" src="https://cdn.krxd.net/controltag?confid=JImdKGAx" async="async"></script>
+ <script src="https://cdn.vox-cdn.com/packs/concert_ads-7bf774bff743c7c1754a.js" async="async" integrity="sha256-4dNLiLp3y7pWVI7g4NovGrh4zlj6JGUJjVgkw2174l4= sha384-xOqsESSDXn9YorwH4hcmLmfu0z4zZIooD902iAqx+FznU7KPYSm+aaFSLyVLhsZT" crossorigin="anonymous"></script>
+ <script src="https://c.amazon-adsystem.com/aax2/apstag.js" async="async"></script>
+ <script src="https://www.googletagservices.com/tag/js/gpt.js" async="async"></script>
+ <script src="https://cdn.concert.io/lib/concert-concierge.2.3.5.min.js" async="async"></script>
+ <script src="https://sejs.moatads.com/voxprebidheader841653991752/yi.js" async="async"></script>
+ <meta name="p:domain_verify" content="d4410485bd6277c2bf2ce0f277819dc6" />
+ <meta name="msvalidate.01" content="D385D0326A3AE144205C298DB34B4E94" />
+ <meta name="ahrefs-site-verification" content="1e57a609922037a3fbdc1c22efd7334113f174f15608f37e1b8538a7b4ce64c3" />
+ <meta name="description" content="It was an extraordinary year for movies." />
+ <link rel="canonical" href="https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch" />
+ <meta property="og:description" content="How to watch the greatest movies of the year, from Lady Bird and Dunkirk to Get Out and The Big Sick." />
+ <meta property="fb:app_id" content="549923288395304" />
+ <meta property="og:image" content="https://cdn.vox-cdn.com/thumbor/7WyjCLC7n6i1IG2eJB06qi1o7kQ=/0x148:2300x1352/fit-in/1200x630/cdn.vox-cdn.com/uploads/chorus_asset/file/9871033/Movies_end_of_year_2017.jpg" />
+ <meta property="og:image:height" content="630" />
+ <meta property="og:image:width" content="1200" />
+ <meta property="og:site_name" content="Vox" />
+ <meta property="og:title" content="The 21 best movies of 2017" />
+ <meta property="og:type" content="article" />
+ <meta property="og:url" content="https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:url" content="https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch" />
+ <meta name="twitter:title" content="The 21 best movies of 2017" />
+ <meta name="twitter:description" content="How to watch the greatest movies of the year, from Lady Bird and Dunkirk to Get Out and The Big Sick." />
+ <meta name="twitter:image" content="https://cdn.vox-cdn.com/thumbor/sFp0spZtjdLgZplwyh3Eb_98Ej0=/0x175:2300x1325/fit-in/1200x600/cdn.vox-cdn.com/uploads/chorus_asset/file/9871033/Movies_end_of_year_2017.jpg" />
+ <meta name="twitter:site" content="voxdotcom" />
+ <meta name="sailthru.title" content="The 21 best movies of 2017" />
+ <meta name="sailthru.tags" content="general,vox" />
+ <meta name="sailthru.date" content="2018-07-24" />
+ <meta name="sailthru.description" content="It was an extraordinary year for movies." />
+ <link rel="icon" type="image/png" href="https://cdn.vox-cdn.com/community_logos/52517/voxv.png" sizes="32x32" />
+ <link rel="icon" type="image/png" href="https://cdn.vox-cdn.com/uploads/hub/sbnu_logo_minimal/441/touch_icon_iphone_retina_1000_yellow.755.png" sizes="192x192" />
+ <link rel="apple-touch-icon" href="https://cdn.vox-cdn.com/uploads/hub/sbnu_logo_minimal/441/touch_icon_iphone_retina_1000_yellow.755.png" sizes="180x180" />
+ <meta name="msapplication-TileImage" content="https://cdn.vox-cdn.com/uploads/hub/sbnu_logo_minimal/441/touch_icon_ipad_retina_1000_yellow.755.png" />
+ <meta name="msapplication-TileColor" content="#4f7177" />
+ <meta name="theme-color" content="" />
+ <meta data-chorus-version="c783e43305ce80adb5ec31a186ab9723a92ef2c7" />
+ <link rel="amphtml" href="https://www.vox.com/platform/amp/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch" />
+ <link rel="alternate" type="application/rss+xml" title="Vox" href="/rss/index.xml" />
+ <script type="application/ld+json">
+ <![CDATA[
+ {"@context":"http://schema.org","@type":"NewsArticle","mainEntityOfPage":"https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch","headline":"How to watch the 21 best films of 2017","description":"It was an extraordinary year for movies.","speakable":{"@type":"SpeakableSpecification","xpath":["/html/head/title","/html/head/meta[@name='description']/@content"]},"datePublished":"2017-12-15T08:50:02-05:00","dateModified":"2018-07-24T14:15:58-04:00","author":{"@type":"Person","name":"Alissa Wilkinson"},"publisher":{"@type":"Organization","name":"Vox","logo":{"@type":"ImageObject","url":"https://cdn.vox-cdn.com/uploads/chorus_asset/file/13668548/google_amp.0.png","width":600,"height":60}},"image":[{"@type":"ImageObject","url":"https://cdn.vox-cdn.com/thumbor/TSO6Uy4UkB9DOZWUxOU1Kks5dzo=/1400x1400/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/9871033/Movies_end_of_year_2017.jpg","width":1400,"height":1400},{"@type":"ImageObject","url":"https://cdn.vox-cdn.com/thumbor/-_58CyCjSLS36byYJ3jyjvy4Akg=/1400x1050/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/9871033/Movies_end_of_year_2017.jpg","width":1400,"height":1050},{"@type":"ImageObject","url":"https://cdn.vox-cdn.com/thumbor/WvgnZiNPS0Pomau4kVrKvRcmHog=/1400x788/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/9871033/Movies_end_of_year_2017.jpg","width":1400,"height":788}]}
+ ]]>
+ </script>
+ <meta name="outbrainsection" content="awards-season" />
+ <style id="custom-entry-styles" type="text/css"></style>
+ </head><!--[if lte IE 9]><body class="ie9"><![endif]-->
+ <!--[if gte IE 10]><body class="ie"><![endif]-->
+ <body class="entry_key_unison_standard entry_layout_unison_main entry_template_standard" data-entry-id="16515179">
+ <!-- Google Tag Manager (noscript) -->
+ <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W8JKW6" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) -->
+ <svg width="0" height="0" style="position:absolute;display:none;">
+ <symbol viewbox="90 0 689 645" id="icon-clock" xmlns="http://www.w3.org/2000/svg">
+ <title>
+ clock
+ </title>
+ <path d="M489.1 322.5c0 15-5.4 27.9-16 38.6-10.7 10.7-23.6 16-38.6 16-23.7 0-40.3-10.9-49.9-32.8h-125c-6.4 0-11.6-2.1-15.7-6.1-4-4.1-6.1-9.3-6.1-15.7 0-6.4 2.1-11.6 6.1-15.7 4.1-4.1 9.4-6.1 15.8-6.1h125c5.9-13.2 15.3-22.5 28-28V125.8c0-6.4 2.1-11.6 6.1-15.7 4.1-4.1 9.3-6.1 15.7-6.1 6.4 0 11.6 2 15.7 6.1s6.1 9.3 6.1 15.7v146.8c21.9 9.5 32.9 26.1 32.8 49.9zm-54.6-306c84.2 0 156.3 29.9 216.2 89.8 59.9 59.9 89.8 131.9 89.8 216.2s-29.9 156.3-89.8 216.2c-59.9 59.9-131.9 89.8-216.2 89.8s-156.3-29.9-216.2-89.8c-59.9-59.9-89.8-131.9-89.8-216.2s29.9-156.3 89.8-216.2c59.9-59.9 132-89.8 216.2-89.8zm0 546.4c66.5 0 123.2-23.4 170.1-70.4 46.9-46.9 70.4-103.6 70.4-170.1s-23.4-123.2-70.4-170.1C557.7 105.5 501 82.1 434.5 82.1s-123.2 23.4-170.1 70.4C217.5 199.4 194 256.1 194 322.6s23.4 123.2 70.4 170.1c46.9 46.8 103.6 70.2 170.1 70.2z"></path>
+ </symbol>
+ <symbol viewbox="0 0 1000 1000" id="icon-close" xmlns="http://www.w3.org/2000/svg">
+ <path d="M638.6 500l322.7-322.7c38.3-38.3 38.3-100.3 0-138.6S861 .4 822.7 38.7L500 361.4 177.3 38.7C139 .4 77 .4 38.7 38.7S.4 139 38.7 177.3L361.4 500 38.7 822.7C.4 861 .4 923 38.7 961.3 57.9 980.4 82.9 990 108 990s50.1-9.6 69.3-28.7L500 638.6l322.7 322.7c19.1 19.1 44.2 28.7 69.3 28.7 25.1 0 50.1-9.6 69.3-28.7 38.3-38.3 38.3-100.3 0-138.6L638.6 500z"></path>
+ </symbol>
+ <symbol viewbox="0 0 14 14" id="icon-close-map" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M13.074 12.27L7.698 6.958l5.376-5.312-.896-.896-5.312 5.376L1.554.75l-.896.864 5.376 5.312L.658 12.27l.896.896L6.898 7.79l5.312 5.376z"></path>
+ </symbol>
+ <symbol viewbox="0 0 18 17" id="icon-comment" xmlns="http://www.w3.org/2000/svg">
+ <path d="M15.667 6.654c0 3.532-3.432 6.397-7.667 6.397-.945 0-1.85-.14-2.686-.4l-4.406 2.1 1.725-3.52c-1.42-1.16-2.3-2.78-2.3-4.56C.333 3.12 3.765.257 8 .257c4.235 0 7.667 2.863 7.667 6.4z"></path>
+ </symbol>
+ <symbol viewbox="-135.7 744.2 1008.1 429.7" id="icon-down" xmlns="http://www.w3.org/2000/svg">
+ <path d="M872.3 788.5c0 12.1-5.1 25.2-18.2 35.3l-446 335c-12.1 10.1-28.3 15.2-40.4 15.2-15.2 0-28.3-5.1-40.4-15.2l-446.1-335c-18.2-15.2-22.2-40.4-10.1-60.5s40.4-22.2 58.5-10.1l439.1 330.9 435.9-331c18.2-15.2 45.4-10.1 58.5 10.1 7.2 8.1 9.2 15.1 9.2 25.3"></path>
+ </symbol>
+ <symbol viewbox="0 0 50.062 37.479" id="icon-email" xmlns="http://www.w3.org/2000/svg">
+ <path d="M25.085 21.866L.082 3.114A3.114 3.114 0 0 1 3.207-.012H46.96a3.113 3.113 0 0 1 3.126 3.126l-25 18.752zm0 5.613L50.087 8.726v25.64a3.113 3.113 0 0 1-3.125 3.125H3.208a3.113 3.113 0 0 1-3.125-3.125V8.727L25.085 27.48z" class="afshape-1"></path>
+ </symbol>
+ <symbol viewbox="0 0 21.406 43.754" id="icon-facebook" xmlns="http://www.w3.org/2000/svg">
+ <path d="M5.43 43.754v-20.53H0V15.83h5.43V9.518C5.43 4.558 8.635 0 16.024 0c2.99 0 5.204.286 5.204.286l-.175 6.903s-2.257-.03-4.72-.03c-2.663 0-3.09 1.23-3.09 3.26v5.4h8.022l-.35 7.39h-7.672v20.53H5.43z"></path>
+ </symbol>
+ <symbol viewbox="0 0 140 200" id="icon-foursquare" xmlns="http://www.w3.org/2000/svg">
+ <path d="M114.697 27.581l-4.278 22.294c-.511 2.41-3.545 4.945-6.358 4.945h-39.7c-4.467 0-7.664 3.045-7.664 7.508v4.86c0 4.467 3.216 7.632 7.686 7.632h33.681c3.154 0 6.25 3.459 5.568 6.826-.685 3.373-3.886 20.08-4.271 21.924-.387 1.846-2.5 5-6.25 5H65.618c-5.007 0-6.521.654-9.87 4.818-3.353 4.166-33.477 40.342-33.477 40.342-.305.35-.603.249-.603-.134V27.25c0-2.85 2.478-6.194 6.194-6.194h81.78c3.01 0 5.822 2.829 5.055 6.525m3.59 87.418c1.137-4.602 13.899-69.93 18.16-90.656M120.716 0H18.809C4.745 0 .61 10.575.61 17.235v161.916c0 7.503 4.032 10.285 6.296 11.203 2.267.919 8.519 1.692 12.266-2.632 0 0 48.111-55.826 48.938-56.652 1.25-1.25 1.25-1.25 2.5-1.25h31.127c13.08 0 15.183-9.327 16.549-14.821 1.137-4.602 13.899-69.93 18.16-90.656C139.699 8.526 135.681 0 120.716 0"></path>
+ </symbol>
+ <symbol viewbox="-295 387 20 20" id="icon-full-screen" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ccc" d="M-275 387.7c0-.2-.1-.4-.2-.5-.1-.1-.3-.2-.5-.2h-5.5c-.4 0-.7.3-.7.7 0 .4.4.8.6 1l1.4 1.4-3.9 3.9 1.9 1.9 3.9-3.9 1.4 1.4c.3.3.6.6 1 .6s.7-.3.7-.7l-.1-5.6zm-13.1 10.5l-3.9 4-1.4-1.4c-.3-.3-.6-.6-1-.6s-.6.3-.6.6v5.4c0 .2.1.4.2.5.1.1.3.2.5.2h5.4c.4 0 .6-.3.6-.6 0-.4-.4-.8-.6-.9l-1.4-1.4 4-3.9-1.8-1.9z"></path>
+ </symbol>
+ <symbol viewbox="-295 387 20 20" id="icon-full-screen-exit" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ccc" d="M-293.2 406.9l3.9-4 1.4 1.4c.3.3.6.6 1 .6s.6-.3.6-.6v-5.4c0-.2-.1-.4-.2-.5-.1-.1-.3-.2-.5-.2h-5.4c-.4 0-.6.3-.6.6 0 .4.4.8.6.9l1.4 1.4-4 3.9 1.8 1.9zM-276.91 387.05l-3.9 4-1.4-1.4c-.3-.3-.6-.6-1-.6s-.6.3-.6.6v5.4c0 .2.1.4.2.5.1.1.3.2.5.2h5.4c.4 0 .6-.3.6-.6 0-.4-.4-.8-.6-.9l-1.4-1.4 4-3.9-1.8-1.9z"></path>
+ </symbol>
+ <symbol viewbox="0 0 39.605 39.633" id="icon-google-plus" xmlns="http://www.w3.org/2000/svg">
+ <path d="M12.488 37.682c-4.69 0-8.08-2.97-8.08-6.537 0-3.496 3.976-6.51 8.667-6.46a10.21 10.21 0 0 1 3.04.488c2.547 1.77 4.6 2.876 5.117 4.894.096.41.15.83.15 1.26 0 3.567-2.3 6.355-8.894 6.355m1.233-21.46c-3.14-.093-6.14-2.982-6.68-7.116-.54-4.136 1.57-7.3 4.72-7.206 3.15.094 5.84 3.486 6.39 7.62.55 4.136-1.27 6.797-4.41 6.703m6.75 6.457c-1.08-.813-3.44-2.478-3.44-3.596 0-1.31.38-1.955 2.35-3.495 2.03-1.58 3.46-3.67 3.46-6.25 0-2.82-1.15-5.37-3.31-6.61h3.06L25.2 0H13.51C7.584 0 2.644 4.37 2.644 9.18c0 4.912 3.246 8.83 8.82 8.83.388 0 .764-.02 1.133-.048-.36.694-.62 1.467-.62 2.277 0 1.36.75 2.14 1.68 3.04-.702 0-1.38.02-2.12.02C4.75 23.3 0 27.97 0 32.46c0 4.412 5.726 7.173 12.513 7.173 7.737 0 12.495-4.39 12.495-8.8 0-3.54-.764-5.32-4.536-8.15M31.52.54v5.388h-5.388v2.695h5.39v5.39h2.694v-5.39h5.39V5.928h-5.39V.538"></path>
+ </symbol>
+ <symbol viewbox="0 0 105.4 105.7" class="alinline-svg" id="icon-grid" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#ccc" d="M0 0h47.7v47.7H0z" class="alshape-1"></path>
+ <path fill="#ccc" d="M57.7 0h47.7v47.7H57.7z" class="alshape-2"></path>
+ <path fill="#ccc" d="M0 58h47.7v47.7H0z" class="alshape-3"></path>
+ <path fill="#ccc" d="M57.7 58h47.7v47.7H57.7z" class="alshape-4"></path>
+ </symbol>
+ <symbol viewbox="0 0 64.37 40.34" id="icon-hamburger" xmlns="http://www.w3.org/2000/svg">
+ <path class="amcls-1" d="M0 30h64.37v10.34H0zm0-15h64.37v10.34H0zM0 0h64.37v10.34H0z"></path>
+ </symbol>
+ <symbol viewbox="0 0 671.78668 671.78668" id="icon-instagram" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(.13333 0 0 -.13333 0 671.787)">
+ <path d="M2519.21 5038.41c-684.18 0-769.97-2.9-1038.67-15.16-268.14-12.23-451.27-54.82-611.513-117.09-165.66-64.38-306.148-150.52-446.203-290.57-140.051-140.05-226.191-280.55-290.57-446.21-62.273-160.24-104.86-343.37-117.098-611.51C2.898 3289.17 0 3203.38 0 2519.2c0-684.17 2.898-769.96 15.156-1038.66 12.239-268.14 54.825-451.27 117.098-611.509 64.379-165.66 150.519-306.152 290.57-446.211 140.055-140.05 280.543-226.191 446.203-290.57C1029.27 69.98 1212.4 27.39 1480.54 15.16 1749.24 2.902 1835.03 0 2519.21 0c684.17 0 769.96 2.902 1038.66 15.16 268.14 12.23 451.27 54.82 611.51 117.09 165.66 64.379 306.15 150.52 446.21 290.57 140.05 140.059 226.19 280.551 290.57 446.211 62.27 160.239 104.86 343.369 117.09 611.509 12.26 268.7 15.16 354.49 15.16 1038.66 0 684.18-2.9 769.97-15.16 1038.67-12.23 268.14-54.82 451.27-117.09 611.51-64.38 165.66-150.52 306.16-290.57 446.21-140.06 140.05-280.55 226.19-446.21 290.57-160.24 62.27-343.37 104.86-611.51 117.09-268.7 12.26-354.49 15.16-1038.66 15.16zm0-453.91c672.65 0 752.33-2.57 1017.97-14.69 245.62-11.2 379.01-52.24 467.78-86.74 117.59-45.7 201.51-100.29 289.66-188.44 88.16-88.16 142.75-172.08 188.45-289.67 34.5-88.77 75.54-222.16 86.74-467.78 12.12-265.64 14.69-345.32 14.69-1017.98 0-672.65-2.57-752.33-14.69-1017.97-11.2-245.62-52.24-379.01-86.74-467.78-45.7-117.591-100.29-201.509-188.45-289.661-88.15-88.16-172.07-142.75-289.66-188.449-88.77-34.5-222.16-75.539-467.78-86.738-265.6-12.122-345.27-14.692-1017.97-14.692-672.71 0-752.37 2.57-1017.98 14.692-245.62 11.199-379.01 52.238-467.78 86.738-117.591 45.699-201.509 100.289-289.661 188.449-88.152 88.152-142.75 172.07-188.449 289.661-34.5 88.77-75.535 222.16-86.742 467.78-12.121 265.64-14.688 345.32-14.688 1017.97 0 672.66 2.567 752.34 14.688 1017.98 11.207 245.62 52.242 379.01 86.742 467.78 45.699 117.59 100.293 201.51 188.445 289.66 88.156 88.16 172.074 142.75 289.665 188.45 88.77 34.5 222.16 75.54 467.78 86.74 265.64 12.12 345.32 14.69 1017.98 14.69"></path>
+ <path d="M2519.21 1679.47c-463.78 0-839.74 375.96-839.74 839.73 0 463.78 375.96 839.74 839.74 839.74 463.77 0 839.73-375.96 839.73-839.74 0-463.77-375.96-839.73-839.73-839.73zm0 2133.38c-714.47 0-1293.65-579.18-1293.65-1293.65 0-714.46 579.18-1293.64 1293.65-1293.64 714.46 0 1293.64 579.18 1293.64 1293.64 0 714.47-579.18 1293.65-1293.64 1293.65M4166.27 3863.96c0-166.96-135.35-302.3-302.31-302.3-166.95 0-302.3 135.34-302.3 302.3s135.35 302.31 302.3 302.31c166.96 0 302.31-135.35 302.31-302.31"></path>
+ </g>
+ </symbol>
+ <symbol viewbox="-27.7 455.1 337.2 791.1" id="icon-left" xmlns="http://www.w3.org/2000/svg">
+ <path fill="inherit" d="M274.8 1246.2c-9.5 0-19.8-4-27.7-14.3l-262.9-350c-7.9-9.5-11.9-22.2-11.9-31.7 0-11.9 4-22.2 11.9-31.7l262.9-350.1c11.9-14.3 31.7-17.4 47.5-7.9 15.8 9.5 17.4 31.7 7.9 45.9L42.8 851l259.8 342.1c11.9 14.3 7.9 35.6-7.9 45.9-6.4 5.6-11.9 7.2-19.9 7.2"></path>
+ </symbol>
+ <symbol viewbox="0 0 18 18" id="icon-link" xmlns="http://www.w3.org/2000/svg">
+ <g opacity=".4">
+ <path d="M10.546 13.732l.623-.623a.957.957 0 0 0 .121-.137c.263-.273.48-.582.65-.905a4.44 4.44 0 0 0 .46-2.733 3.766 3.766 0 0 0-.158-.692 3.61 3.61 0 0 0-.244-.604 4.355 4.355 0 0 0-.877-1.245 4.35 4.35 0 0 0-1.245-.876l-1.14 1.14c-.08.08-.146.163-.204.256a2.735 2.735 0 0 1 2.07 2.07c.044.21.066.426.06.644a2.601 2.601 0 0 1-.765 1.81l-.69.689-.513.513-.485.485-1.237 1.237c-1.037 1.037-2.737 1.024-3.79-.029-1.052-1.052-1.064-2.753-.028-3.789L4.39 9.706a5.663 5.663 0 0 1-.208-2.338L1.881 9.67c-1.73 1.73-1.709 4.56.048 6.316 1.757 1.757 4.586 1.778 6.316.048l2.302-2.302z"></path>
+ <path d="M7.339 7.802a2.54 2.54 0 0 1 .1-.668c.114-.42.339-.814.665-1.14l.693-.694.51-.51.48-.48 1.242-1.241c1.036-1.036 2.736-1.024 3.789.029 1.052 1.052 1.064 2.753.029 3.789l-1.241 1.24c.233.76.302 1.556.211 2.335l2.303-2.303c1.73-1.73 1.708-4.558-.049-6.315C14.314.087 11.485.066 9.756 1.796L7.453 4.098l-.623.623a.934.934 0 0 0-.121.138 3.904 3.904 0 0 0-.645.9 4.39 4.39 0 0 0-.46 2.733c.028.244.08.472.153.696.065.206.142.41.245.604.209.452.503.87.877 1.244.373.374.791.668 1.244.878l1.14-1.141a1.38 1.38 0 0 0 .204-.256 2.68 2.68 0 0 1-1.335-.734 2.685 2.685 0 0 1-.793-1.98z"></path>
+ </g>
+ </symbol>
+ <symbol viewbox="0 0 16 16" id="icon-linkedin" xmlns="http://www.w3.org/2000/svg">
+ <path d="M.2 15.876h3.394V5.222H.2v10.654zM1.997 0C.8 0 0 .836 0 1.88s.8 1.88 1.997 1.88 1.997-.836 1.997-1.88C3.794.836 2.994 0 1.997 0zm9.985 4.804c-1.798 0-2.596 1.045-2.996 1.88V5.222H5.392c.2 1.045 0 10.862 0 10.862h3.395V9.818c0-.21 0-.627.2-.836.2-.626.798-1.253 1.796-1.253 1.2 0 1.798 1.04 1.798 2.5v5.64h3.4V9.82c0-3.342-1.79-5.014-3.99-5.014z"></path>
+ </symbol>
+ <symbol viewbox="0 0 35.4 51" id="icon-map-marker" xmlns="http://www.w3.org/2000/svg">
+ <path d="M18 51.733c11.8-15.9 17.7-27.1 17.7-33.5 0-9.7-7.9-17.5-17.7-17.5S.3 8.533.3 18.233c0 6.4 5.9 17.6 17.7 33.5z"></path>
+ <circle r="8" cy="18" cx="18" fill="#fff"></circle>
+ </symbol>
+ <symbol viewbox="-375 489.5 37.2 30.3" id="icon-menu" xmlns="http://www.w3.org/2000/svg">
+ <title>
+ menu
+ </title>
+ <path d="M-367 489.5h29.1v3.8H-367zm-8 0h4.4v3.8h-4.4zm8 12.8h29.1v3.8H-367zm-8 0h4.4v3.8h-4.4zm8 13.7h29.1v3.8H-367zm-8 0h4.4v3.8h-4.4z"></path>
+ </symbol>
+ <symbol viewbox="0 0 179 96" id="icon-more" xmlns="http://www.w3.org/2000/svg">
+ <title>
+ more-arrow
+ </title>
+ <path d="M178.86 47.677L129.776 0v34.313H0v26.625h116.296v.103h13.48v34.31l49.084-47.67"></path>
+ </symbol>
+ <symbol viewbox="0 0 50.062 37.479" id="icon-newsletter_signup" xmlns="http://www.w3.org/2000/svg">
+ <path d="M25.085 21.866L.082 3.114A3.114 3.114 0 0 1 3.207-.012H46.96a3.113 3.113 0 0 1 3.126 3.126l-25 18.752zm0 5.613L50.087 8.726v25.64a3.113 3.113 0 0 1-3.125 3.125H3.208a3.113 3.113 0 0 1-3.125-3.125V8.727L25.085 27.48z" class="aushape-1"></path>
+ </symbol>
+ <symbol viewbox="0 0 832 512" id="icon-norgie-down" xmlns="http://www.w3.org/2000/svg">
+ <path d="M15.244 98.497L379.433 495.43c20.249 22.24 53.137 22.23 73.373-.021.51-.608.71-1.47 1.25-2.077L817.152 98.259c20.233-22.224 20.223-58.326-.028-80.54-.202-.1-.531-.202-.735-.404C807.065 6.732 793.993-.005 779.353 0L52.923.208C38.073.212 24.903 7.286 15.43 18.18l-.2-.227c-20.314 22.325-20.304 58.33.023 80.543h-.008z"></path>
+ </symbol>
+ <symbol viewbox="0 0 512 832.328" id="icon-norgie-right" xmlns="http://www.w3.org/2000/svg">
+ <path d="M98.278 817.088l397.038-364.076c22.245-20.243 22.245-53.13 0-73.373-.608-.51-1.47-.71-2.077-1.25L98.27 15.18c-22.218-20.24-58.32-20.24-80.54.005-.1.202-.202.53-.404.734C6.74 25.24 0 38.31 0 52.95v726.43c0 14.85 7.07 28.022 17.963 37.5l-.228.2c22.32 20.32 58.324 20.32 80.543 0z"></path>
+ </symbol>
+ <symbol viewbox="0 0 47.3 34.3" id="icon-opentable" xmlns="http://www.w3.org/2000/svg">
+ <path d="M30.1 0C20.7 0 13 7.7 13 17.2s7.7 17.2 17.2 17.2 17.2-7.7 17.2-17.2C47.3 7.7 39.6 0 30.1 0zm0 21.5c-2.4 0-4.3-1.9-4.3-4.3s1.9-4.3 4.3-4.3 4.3 1.9 4.3 4.3c0 2.3-1.9 4.3-4.3 4.3zM0 17.2c0 2.4 1.9 4.3 4.3 4.3s4.3-1.9 4.3-4.3-1.9-4.3-4.3-4.3S0 14.8 0 17.2"></path>
+ </symbol>
+ <symbol viewbox="0 0 12 12" id="icon-pencil" xmlns="http://www.w3.org/2000/svg">
+ <path d="M1.3 8.4c0 .1 0 .1 0 0L0 11.6c0 .1 0 .2.1.3 0 .1.1.1.1.1h.1l3.1-1.2s.1 0 .1-.1l6.2-6.2-2.2-2.3-6.2 6.2zm10.5-7L10.6.2c-.3-.3-.8-.3-1.1 0L8.2 1.5l2.2 2.2 1.3-1.3c.4-.2.4-.7.1-1z"></path>
+ </symbol>
+ <symbol viewbox="0 0 60.7 93.3" id="icon-pin" xmlns="http://www.w3.org/2000/svg">
+ <path d="M57.2 34.6c0 4.8-1.3 9.3-3.5 13.2L31.8 87.5c-.3.5-.9.8-1.5.8-.7 0-1.2-.4-1.5-.8L6.9 47.7c-2.2-3.8-3.5-8.4-3.5-13.2 0-14.8 12-26.9 26.9-26.9 14.9.1 26.9 12.1 26.9 27zm-16.8 0c0-5.6-4.5-10.1-10.1-10.1S20.2 29 20.2 34.6s4.5 10.1 10.1 10.1 10.1-4.5 10.1-10.1z" xmlns="http://www.w3.org/2000/svg"></path>
+ </symbol>
+ <symbol viewbox="-285 377 40 40" id="icon-pinterest" xmlns="http://www.w3.org/2000/svg">
+ <path d="M-265 377.1c-10.9 0-19.7 8.9-19.7 19.8 0 8.1 4.9 15 11.8 18.1-.1-1.4 0-3 .3-4.5.4-1.6 2.5-10.8 2.5-10.8s-.6-1.3-.6-3.1c0-2.9 1.7-5.1 3.8-5.1 1.8 0 2.7 1.3 2.7 3 0 1.8-1.2 4.5-1.7 7-.5 2.1 1 3.8 3.1 3.8 3.7 0 6.3-4.8 6.3-10.5 0-4.3-2.9-7.6-8.2-7.6-6 0-9.7 4.5-9.7 9.5 0 1.7.5 2.9 1.3 3.9.4.4.4.6.3 1.1l-.4 1.6c-.1.5-.5.7-1 .5-2.8-1.1-4-4.1-4-7.5 0-5.6 4.7-12.3 14.1-12.3 7.5 0 12.5 5.5 12.5 11.3 0 7.7-4.3 13.5-10.7 13.5-2.1 0-4.1-1.2-4.8-2.5 0 0-1.1 4.5-1.4 5.4-.4 1.5-1.2 3-2 4.2 1.8.5 3.7.8 5.6.8 10.9 0 19.7-8.8 19.7-19.7 0-11-8.9-19.9-19.8-19.9z"></path>
+ </symbol>
+ <symbol viewbox="-230 372 50 50" id="icon-play" xmlns="http://www.w3.org/2000/svg">
+ <path fill="#999" d="M-214 376l25.6 21.1L-214 418v-42z"></path>
+ </symbol>
+ <symbol viewbox="0 0 17 17" id="icon-rec" xmlns="http://www.w3.org/2000/svg">
+ <path d="M7.544.405l2.305 4.64 5.15.743L11.27 9.4l.88 5.1-4.61-2.407-4.6 2.407.88-5.1L.087 5.79l5.153-.744L7.545.404z"></path>
+ </symbol>
+ <symbol viewbox="0 0 450 386" id="icon-refresh" xmlns="http://www.w3.org/2000/svg">
+ <path d="M352.629 288.14l96-111.9h-64.7c-2.3-27.9-10.5-54-23.5-77.3-27.4-49.2-75.8-85.1-133-95.6-.7-.1-1.5-.3-2.2-.4-.5-.1-.9-.2-1.4-.2-10.1-1.7-20.6-2.6-31.2-2.6h-.4c-90.9.2-167 63.6-186.7 148.6v.1c-.3 1.1-.5 2.2-.7 3.3-.1.5-.2.9-.3 1.4-.1.7-.3 1.4-.4 2.1-.2.9-.3 1.7-.5 2.6-.1.4-.1.7-.2 1.1l-.6 3.6v.2c-1 6.3-1.6 12.7-1.9 19.1v.8c-.1 1.4-.1 2.7-.2 4.1 0 1.6-.1 3.3-.1 5 0 1.7 0 3.3.1 5 0 1.4.1 2.7.2 4.1v.9c.3 6.5 1 12.9 1.9 19.1v.2l.6 3.6c.1.4.1.7.2 1.1.2.9.3 1.8.5 2.6.1.7.3 1.4.4 2.1.1.5.2 1 .3 1.4.2 1.1.5 2.2.7 3.2v.1c19.7 85 96.1 148.4 187.1 148.6 42.9-.1 83.1-14.2 116.9-40.7l7.5-5.9-43.2-46.2-6.2 4.6c-22.1 16.3-47.5 24.2-75 24.2-70.6 0-128-57-128-128s57.4-128 128-128c66.4 0 122.8 46.6 129.5 112h-73.5l104 112z" xmlns:bx="https://boxy-svg.com" bx:origin="0.5 0.5"></path>
+ </symbol>
+ <symbol viewbox="-27.7 455.1 337.2 791.1" id="icon-right" xmlns="http://www.w3.org/2000/svg">
+ <path fill="inherit" d="M6.9 455.1c9.5 0 19.8 4 27.7 14.3l262.9 350.1c7.9 9.5 11.9 22.2 11.9 31.7 0 11.9-4 22.2-11.9 31.7l-262.8 350c-11.9 14.3-31.7 17.4-47.5 7.9-15.8-9.5-17.4-31.7-7.9-45.9L239 850.3-20.8 508.2c-11.9-14.3-7.9-35.6 7.9-45.9 6.4-5.6 11.9-7.2 19.8-7.2"></path>
+ </symbol>
+ <symbol viewbox="0 0 1000 1000" preserveaspectratio="xMinYMin meet" id="icon-rss" xmlns="http://www.w3.org/2000/svg">
+ <path d="M0 866q0-55 39-94t94-39 94 39 39 94q0 56-39 94.5T133 999t-94-39-39-94zm0-335V340q179 0 331 88.5T571.5 669t88.5 331H468q0-194-137-331Q193 531 0 531zm0-339V0q203 0 388 79.5T707 293t213.5 319 79.5 388H808q0-164-64-314T571.5 428t-258-172T0 192z"></path>
+ </symbol>
+ <symbol viewbox="373.3 133.3 533.3 533.3" id="icon-search" xmlns="http://www.w3.org/2000/svg">
+ <path d="M754.7 468.7l-22.3-22.3c24.3-33.3 37.5-73.4 37.7-114.7 0-109.5-88.8-198.3-198.3-198.3s-198.3 88.8-198.3 198.3S462.1 530 571.7 530c41.2-.2 81.3-13.4 114.7-37.7l22.3 22.3 152.7 152 45.3-45.3-152-152.6zm-183 0c-75.8 0-137.3-61.5-137.3-137.3S495.8 194 571.7 194 709 255.5 709 331.3c.2 75.7-61 137.1-136.7 137.3-.2.1-.4.1-.6.1z"></path>
+ </symbol>
+ <symbol viewbox="206 29.9 642.1 681.3" id="icon-settings" xmlns="http://www.w3.org/2000/svg">
+ <path d="M843 467.2c4.8 3.2 6.3 9.5 4 15-13.5 41.2-36.4 79.2-64.2 111.7-4 4.8-9.5 6.3-15 4l-81.6-28.5c-20.6 16.6-43.6 30.1-67.3 39.6l-16.6 84.7c-.8 5.5-5.5 10.3-11.1 11.1-21.4 4-42.8 6.3-64.2 6.3-22.2 0-43.6-2.4-64.2-6.3-5.5-.8-10.3-5.5-11.1-11.1L435.2 609c-24.6-9.5-48.3-23-67.3-39.6l-81.6 28.5c-5.5 2.4-11.1.8-15-4-28.5-32.5-51.5-70.5-64.2-111.7-2.4-5.5-.8-11.9 4-15l64.9-57c-2.4-12.7-3.2-26.1-3.2-39.6s.8-26.9 3.2-39.6l-65-57c-4.8-3.2-6.3-9.5-4-15 13.5-41.2 36.4-79.2 64.2-111.7 4-4.8 9.5-6.3 15-4l81.6 28.5c19.8-16.6 43.6-30.1 67.3-39.6l16.6-84.7c.8-5.5 5.5-10.3 11.1-11.1 42.8-8.7 86.3-8.7 129.1 0 5.5.8 10.3 5.5 11.1 11.1l15 85.5c24.6 9.5 47.5 23 67.3 39.6l81.6-28.5c5.5-2.4 11.1-.8 15 4 28.5 32.5 51.5 70.5 64.2 111.7 2.4 5.5.8 11.9-4 15l-65.7 57c2.4 12.7 3.2 26.1 3.2 39.6s-.8 26.9-3.2 39.6l66.6 56.2zm-190-95.8c0-69.7-57.8-127.5-127.5-127.5-70.5 0-127.5 57-127.5 127.5s57 127.5 127.5 127.5S653 441.9 653 371.4z"></path>
+ </symbol>
+ <symbol viewbox="0 0 16 16" id="icon-snapchat" xmlns="http://www.w3.org/2000/svg">
+ <path d="M8.155.48c.662 0 2.903.185 3.96 2.552.354.797.27 2.15.2 3.237l-.002.04c-.008.12-.015.23-.02.34.05.03.135.06.268.06.2-.01.44-.08.69-.2.11-.06.23-.07.31-.07.12 0 .24.02.34.06.3.1.49.32.49.56.01.3-.26.56-.81.78-.06.02-.14.05-.23.08-.3.09-.76.24-.89.54-.06.15-.04.35.08.58l.01.01c.04.09 1.02 2.32 3.2 2.68.17.03.29.18.28.34 0 .05-.01.1-.03.15-.16.38-.85.66-2.1.85-.04.06-.08.25-.11.38-.02.12-.05.24-.09.37-.05.18-.18.27-.37.27h-.02c-.09 0-.21-.02-.36-.05-.24-.05-.51-.09-.85-.09-.2 0-.4.01-.61.05-.4.07-.75.31-1.15.59-.57.4-1.22.86-2.2.86-.04 0-.08-.01-.12-.01h-.1c-.98 0-1.62-.45-2.19-.86-.4-.28-.74-.52-1.14-.59-.21-.03-.42-.05-.62-.05-.36 0-.64.06-.85.1-.14.03-.26.05-.36.05-.25 0-.35-.15-.39-.28-.04-.13-.06-.26-.09-.38s-.07-.33-.11-.38C.89 12.9.2 12.62.04 12.23a.413.413 0 0 1-.036-.15.332.332 0 0 1 .28-.34c2.18-.36 3.16-2.59 3.2-2.684l.01-.02c.12-.23.15-.43.08-.58-.13-.29-.59-.44-.89-.54-.08-.02-.16-.05-.23-.08-.74-.29-.84-.62-.8-.85.06-.32.45-.53.78-.53.097 0 .18.02.256.05.28.13.527.2.737.2a.63.63 0 0 0 .31-.07l-.03-.38c-.065-1.086-.15-2.438.205-3.23C4.94.67 7.175.49 7.835.49l.28-.01h.04z"></path>
+ </symbol>
+ <symbol viewbox="0 0 17 17" id="icon-star" xmlns="http://www.w3.org/2000/svg">
+ <path d="M7.544.405l2.305 4.64 5.15.743L11.27 9.4l.88 5.1-4.61-2.407-4.6 2.407.88-5.1L.087 5.79l5.153-.744L7.545.404z"></path>
+ </symbol>
+ <symbol viewbox="19.3 54.3 26.9 33.7" id="icon-thumb-down" xmlns="http://www.w3.org/2000/svg">
+ <title>
+ no
+ </title>
+ <path d="M19.3 84.4c0-4.8 0-9.4.1-14 0-.4 1-1 1.6-1.2 4.2-1.1 7.7-3.2 9.6-7.3.7-1.6.9-3.4 1.5-5 .4-.9 1.2-1.7 1.8-2.5.7.8 2 1.6 2.1 2.5.2 2.2 0 4.5-.2 6.8-.1.9-.4 1.8-.6 3h5.1c1.2 0 2.4 0 3.5.2 1.9.3 2.4 1.3 2.2 3.2-.1 1.2.1 2.4.1 3.6 0 1 0 1.9-.1 2.9-.1 1.1 0 2.2-.3 3.1-1 2.6-2.1 5.2-3.4 7.6-.3.6-1.8.7-2.7.7-2.4.1-4.8.2-7.2 0-1.4-.1-2.9-.5-4-1.3-2.2-1.7-4.4-2.3-7.1-2.1-.6-.1-1.2-.2-2-.2z"></path>
+ </symbol>
+ <symbol viewbox="19.3 54.3 26.9 33.7" id="icon-thumb-up" xmlns="http://www.w3.org/2000/svg">
+ <title>
+ yes
+ </title>
+ <path d="M19.3 84.4c0-4.8 0-9.4.1-14 0-.4 1-1 1.6-1.2 4.2-1.1 7.7-3.2 9.6-7.3.7-1.6.9-3.4 1.5-5 .4-.9 1.2-1.7 1.8-2.5.7.8 2 1.6 2.1 2.5.2 2.2 0 4.5-.2 6.8-.1.9-.4 1.8-.6 3h5.1c1.2 0 2.4 0 3.5.2 1.9.3 2.4 1.3 2.2 3.2-.1 1.2.1 2.4.1 3.6 0 1 0 1.9-.1 2.9-.1 1.1 0 2.2-.3 3.1-1 2.6-2.1 5.2-3.4 7.6-.3.6-1.8.7-2.7.7-2.4.1-4.8.2-7.2 0-1.4-.1-2.9-.5-4-1.3-2.2-1.7-4.4-2.3-7.1-2.1-.6-.1-1.2-.2-2-.2z"></path>
+ </symbol>
+ <symbol viewbox="0 0 60.7 93.3" id="icon-topics" xmlns="http://www.w3.org/2000/svg">
+ <g xmlns="http://www.w3.org/2000/svg">
+ <path d="M2.5 21.5h55.2v11.8H2.5zM2.5 42.1h55.2v11.8H2.5zM2.5 64.3h55.2v11.8H2.5z"></path>
+ </g>
+ </symbol>
+ <symbol viewbox="0 0 87 60" id="icon-trending" xmlns="http://www.w3.org/2000/svg">
+ <path d="M1.906 46.826c2.213 1.787 5.466 1.46 7.262-.743v-.006l5.26-6.45 8.378 11.286a5.171 5.171 0 0 0 4.827 2.035 5.128 5.128 0 0 0 4.124-3.215l7.96-20.208L51.26 56.577a5.155 5.155 0 0 0 4.754 3.13c.097 0 .19 0 .286-.007a5.172 5.172 0 0 0 4.66-3.667l10.98-36.787 4.854 9.902c1.234 2.552 4.33 3.613 6.89 2.37 2.56-1.234 3.636-4.314 2.386-6.86L75.42 2.888a5.15 5.15 0 0 0-5.067-2.87 5.135 5.135 0 0 0-4.52 3.653L55.146 39.42 44.28 13.93a5.142 5.142 0 0 0-4.827-3.127 5.157 5.157 0 0 0-4.73 3.263L25.56 37.343l-6.79-9.148a5.197 5.197 0 0 0-4.033-2.08 5.139 5.139 0 0 0-4.124 1.897L1.153 39.6a5.125 5.125 0 0 0 .753 7.226" fill-rule="evenodd"></path>
+ </symbol>
+ <symbol viewbox="0 0 23.62 41.098" id="icon-tumblr" xmlns="http://www.w3.org/2000/svg">
+ <path d="M21.643 32.826c-.764.364-2.226.682-3.316.71-3.29.088-3.927-2.31-3.955-4.052V16.69h8.252v-6.22h-8.222V0h-6.02c-.1 0-.272.087-.296.307C7.734 3.512 6.234 9.135 0 11.382v5.31h4.16V30.12c0 4.595 3.39 11.126 12.343 10.974 3.02-.053 6.375-1.318 7.117-2.408l-1.977-5.86z"></path>
+ </symbol>
+ <symbol viewbox="0 0 44.71 36.327" id="icon-twitter" xmlns="http://www.w3.org/2000/svg">
+ <path d="M44.71 4.295c-1.656.724-3.415 1.242-5.278 1.45A9.146 9.146 0 0 0 43.468.673a18.75 18.75 0 0 1-5.796 2.225C35.965 1.138 33.584 0 30.945 0a9.145 9.145 0 0 0-9.16 9.16c0 .724.052 1.448.208 2.12-7.607-.413-14.335-3.88-18.888-9.417-.777 1.345-1.242 2.742-1.242 4.45 0 3.157 1.604 5.95 4.088 7.607a9.376 9.376 0 0 1-4.14-1.138v.103c0 4.45 3.16 8.176 7.35 9.004-.77.2-1.6.31-2.43.31-.57 0-1.14-.06-1.71-.16 1.14 3.62 4.56 6.31 8.54 6.36-3.1 2.48-7.09 4.34-11.38 4.34-.72 0-1.45-.05-2.17-.16 4.04 2.59 8.9 3.72 14.08 3.72 16.87 0 26.08-13.97 26.08-26.08V9.05c1.76-1.294 3.32-2.9 4.56-4.76"></path>
+ </symbol>
+ <symbol viewbox="-235.8 423.2 35.7 21.3" id="icon-up" xmlns="http://www.w3.org/2000/svg">
+ <path fill="none" d="M-200.5 444.2L-218 424l-17.5 20.2"></path>
+ </symbol>
+ <symbol viewbox="373.3 133.3 533.3 533.3" id="icon-user" xmlns="http://www.w3.org/2000/svg">
+ <path d="M640 400c73.6 0 133.3-59.7 133.3-133.3S713.6 133.3 640 133.3 506.7 193 506.7 266.7 566.4 400 640 400zm0 66.7c-89 0-266.7 44.7-266.7 133.3v66.7h533.3V600c.1-88.7-177.6-133.3-266.6-133.3z"></path>
+ </symbol>
+ <symbol viewbox="0 0 1146 1000" id="icon-vimeo" xmlns="http://www.w3.org/2000/svg">
+ <path d="M0 272q55-65 110-116t95.5-77.5 72.5-43T326 14l17-4q12-2 24-2 19 0 35 6 26 10 42.5 34.5t29 55 21.5 72 15 77.5 13.5 79.5T538 403q32 125 51.5 177.5T631 633q24 0 66.5-55.5T791 426q26-48 26-91 0-13-2-23-9-52-51-65-11-4-24-4-35 0-83 26 22-130 134-209Q876 0 965 0q12 0 24 1 102 8 139 90 18 38 18 88 0 29-6 61-18 102-69.5 208t-113 187.5-132.5 155-123.5 117T611 976q-42 24-78.5 24T463 979t-56-48-38-57q-18-38-97.5-298.5T175 295q-1-2-4-4t-13.5-4.5-24 0-36.5 14T47 333z"></path>
+ </symbol>
+ <symbol viewbox="0 0 86.965 87.642" id="icon-whatsapp" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M44.038 13.007c-16.58 0-30.02 13.44-30.02 30.02a29.883 29.883 0 0 0 4.307 15.503l-5.418 16.106 16.62-5.32a29.915 29.915 0 0 0 14.512 3.733c16.58 0 30.02-13.45 30.02-30.03C74.06 26.44 60.61 13 44.03 13zm0 55.013a24.85 24.85 0 0 1-13.75-4.132l-9.604 3.074 3.122-9.28a24.858 24.858 0 0 1-4.76-14.653c0-13.79 11.212-25 24.993-25 13.78 0 24.99 11.21 24.99 24.99 0 13.78-11.22 24.99-25 24.99zm14.075-18.17c-.753-.412-4.45-2.407-5.143-2.69-.693-.28-1.2-.427-1.74.32s-2.072 2.418-2.538 2.913c-.467.495-.916.54-1.668.128-.752-.41-3.19-1.31-6.02-4.03-2.202-2.11-3.646-4.68-4.065-5.46-.42-.78-.01-1.18.39-1.55.35-.33.8-.86 1.2-1.3.4-.43.54-.74.81-1.25.27-.5.16-.95-.02-1.34s-1.57-4.22-2.15-5.77c-.58-1.56-1.23-1.32-1.68-1.34-.45-.01-.96-.1-1.47-.12-.51-.02-1.35.14-2.08.89-.73.74-2.78 2.52-2.92 6.29-.14 3.77 2.47 7.52 2.83 8.04.36.53 4.98 8.7 12.66 12.06 7.67 3.36 7.71 2.34 9.12 2.26 1.41-.07 4.6-1.68 5.31-3.45.7-1.76.76-3.3.58-3.62-.18-.32-.68-.54-1.43-.95z"></path>
+ </symbol>
+ <symbol viewbox="130.35156 177.43359 300 300" overflow="visible" id="icon-yahoo" xmlns="http://www.w3.org/2000/svg">
+ <path d="M420.926 272.27c-5.2.514-26.85 5.365-34.13 6.925-7.79 2.073-78.983 57.075-83.66 70.58-1.036 4.674-1.556 11.866-1.556 18.624l-.52 10.91c-.002 7.79 2.162 20.35 3.198 27.1 4.68 1.04 38.555.13 44.79 1.17l-.768 13.97c-6.09-.45-49.106-.34-73.68-.34-12.475 0-52.576 1.37-64.897 1l2.33-13.29c6.755-.53 34.728 1.2 40.878-5.29 3.06-3.22 2.09-6.67 2.09-25.38v-8.83c0-4.16 0-11.96-1.04-19.24-2.59-7.8-65.3-86.09-81.41-98.56-4.68-1.56-33.99-4.49-41.26-6.05l-.36-11.97c3.63-1.82 36.22.44 67.85-.73 20.79-.77 68.22 0 74.07.7l-1.5 10.55c-6.23 1.56-36.26 2.14-44.06 4.21 20.27 30.14 52.31 68.94 62.71 84.01 5.72-8.31 55.96-42.87 57.51-54.82-7.79-1.57-33.6-5.28-37.76-5.28l-2.47-13.61c7.08-1.11 44.28 0 62.78 0 15.96 0 50.07 0 59.76.79l-8.86 12.81"></path>
+ </symbol>
+ <symbol viewbox="0 0 462 325" id="icon-youtube" xmlns="http://www.w3.org/2000/svg">
+ <path d="M234.28 1.691c-53.492 0-132.53 3.24-156.188 4.031C52.396 8.02 42.884 9.366 28.811 21.41 7.368 40.48 2.28 77.954 2.28 135.285v54.562c0 65.439 8.69 98.684 23 110.844 16.517 14.17 27.407 15.302 38.406 17 4.27.646 34.49 6 168.594 6 83.626 0 155.507-3.95 162.937-4.906 11.945-1.508 29.104-3.696 42.063-18.094 19.183-21.803 23-57.999 23-110.437V126.69c0-33.943-1.891-81.916-23-102-15.991-13.536-21.848-17.367-54.938-19.031-9.358-.462-91.02-3.969-148.062-3.969zm-49.5 97l123.5 63.75-123.5 64.25v-128z"></path>
+ </symbol></svg>
+ <div class="l-root l-reskin">
+ <div class="l-header">
+ <div class="chorus-emc__content" data-emc-slug="UnisonCustomNavCell" data-emc-bucket="441::">
+ <header class="c-global-header" data-cid="site/global_header" role="banner" data-analytics-placement="navigation">
+ <div class="l-wrapper">
+ <div class="c-global-header__logo">
+ <a href="/" tabindex="1" id="chorus-brand" data-analytics-link="home"><span class="c-global-header__logo-large"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 242 121">
+ <path fill="#444745" d="M110.674 3.528h3.474L114.564 2H71.63l-.418 1.528h6.253c5.418 0 9.726 3.75 9.726 11.255 0 4.168-1.8 9.587-4.72 16.118L54.82 92.32l-6.81-79.756c-.556-6.252 2.5-9.03 9.59-9.03h4.027L62.042 2H1.6l-.557 1.528h3.89c4.725 0 6.532 2.918 7.087 8.615l10.7 103.1h25.427l42.518-90.038c6.392-13.48 13.2-21.677 20.01-21.677zm-5.002 112.27c-3.89 0-6.253-1.25-6.253-7.642 0-8.06 2.91-23.76 6.11-38.072.41 6.67 5 13.2 11.81 13.2 1.67 0 3.06-.138 4.44-.417-6.26 27.236-8.76 32.932-16.12 32.932zm121.024-54.19c8.06 0 13.2-6.67 13.2-14.173 0-6.392-4.585-11.116-11.115-11.116-11.81 0-17.36 9.31-27.09 26.53-2.08-10.7-6.94-24.73-19.45-24.73-14.03 0-30.15 20.01-45.02 32.37-6.67 5.56-14.17 9.17-20.15 9.17-6.11 0-9.72-6.26-9.72-17.23 4.31-17.93 6.67-22.65 13.34-22.65 4.59 0 6.53 2.64 6.53 8.06 0 5.69-1.25 15.42-3.75 27.51 6.67-2.09 16.68-10.42 25.01-19.45-4.44-10.56-13.89-17.79-27.65-17.79-25.42 0-47.66 22.78-47.66 48.35 0 17.65 12.51 30.984 32.1 30.984 32.38 0 45.86-28.066 45.86-47.52 0-2.78-.14-4.86-.42-7.364C155.717 57.14 162.108 52 167.388 52c5.975 0 10.7 15.007 15.423 37.657-4.17 4.58-8.34 13.474-10.42 15.002-.836-8.06-6.115-13.06-13.2-13.06-7.92 0-13.48 7.5-13.48 13.893 0 7.226 5 11.95 11.53 11.95 13.76 0 17.65-13.062 26.265-24.595 2.64 12.363 8.754 24.59 19.313 24.59 12.506 0 24.178-10.7 30.15-18.34l-1.11-1.81c-3.89 3.753-7.642 6.254-11.95 6.254-7.78 0-13.34-16.81-17.645-37.1 2.5-3.47 6.53-12.225 9.31-15.28 1.95 3.612 5.978 10.42 15.15 10.42z"></path></svg></span> <span class="c-global-header__logo-small"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 242 121">
+ <path fill="#444745" d="M110.674 3.528h3.474L114.564 2H71.63l-.418 1.528h6.253c5.418 0 9.726 3.75 9.726 11.255 0 4.168-1.8 9.587-4.72 16.118L54.82 92.32l-6.81-79.756c-.556-6.252 2.5-9.03 9.59-9.03h4.027L62.042 2H1.6l-.557 1.528h3.89c4.725 0 6.532 2.918 7.087 8.615l10.7 103.1h25.427l42.518-90.038c6.392-13.48 13.2-21.677 20.01-21.677zm-5.002 112.27c-3.89 0-6.253-1.25-6.253-7.642 0-8.06 2.91-23.76 6.11-38.072.41 6.67 5 13.2 11.81 13.2 1.67 0 3.06-.138 4.44-.417-6.26 27.236-8.76 32.932-16.12 32.932zm121.024-54.19c8.06 0 13.2-6.67 13.2-14.173 0-6.392-4.585-11.116-11.115-11.116-11.81 0-17.36 9.31-27.09 26.53-2.08-10.7-6.94-24.73-19.45-24.73-14.03 0-30.15 20.01-45.02 32.37-6.67 5.56-14.17 9.17-20.15 9.17-6.11 0-9.72-6.26-9.72-17.23 4.31-17.93 6.67-22.65 13.34-22.65 4.59 0 6.53 2.64 6.53 8.06 0 5.69-1.25 15.42-3.75 27.51 6.67-2.09 16.68-10.42 25.01-19.45-4.44-10.56-13.89-17.79-27.65-17.79-25.42 0-47.66 22.78-47.66 48.35 0 17.65 12.51 30.984 32.1 30.984 32.38 0 45.86-28.066 45.86-47.52 0-2.78-.14-4.86-.42-7.364C155.717 57.14 162.108 52 167.388 52c5.975 0 10.7 15.007 15.423 37.657-4.17 4.58-8.34 13.474-10.42 15.002-.836-8.06-6.115-13.06-13.2-13.06-7.92 0-13.48 7.5-13.48 13.893 0 7.226 5 11.95 11.53 11.95 13.76 0 17.65-13.062 26.265-24.595 2.64 12.363 8.754 24.59 19.313 24.59 12.506 0 24.178-10.7 30.15-18.34l-1.11-1.81c-3.89 3.753-7.642 6.254-11.95 6.254-7.78 0-13.34-16.81-17.645-37.1 2.5-3.47 6.53-12.225 9.31-15.28 1.95 3.612 5.978 10.42 15.15 10.42z"></path></svg></span></a>
+ </div>
+ <ul class="c-global-header__social">
+ <li>
+ <a href="https://twitter.com/voxdotcom" class="twitter"><svg class="p-svg-icon">
+ <use xlink:href="#icon-twitter"></use></svg></a>
+ </li>
+ <li>
+ <a href="https://www.facebook.com/Vox" class="facebook"><svg class="p-svg-icon">
+ <use xlink:href="#icon-facebook"></use></svg></a>
+ </li>
+ <li>
+ <a href="http://bit.ly/voxyoutube" class="youtube"><svg class="p-svg-icon">
+ <use xlink:href="#icon-youtube"></use></svg></a>
+ </li>
+ <li>
+ <a href="/rss/index.xml" class="rss"><svg class="p-svg-icon">
+ <use xlink:href="#icon-rss"></use></svg></a>
+ </li>
+ </ul>
+ <div class="c-global-header__actions">
+ <div class="c-global-header__login">
+ <a class="c-global-header__login-icon" href="https://auth.voxmedia.com/login?return_to=https%3A%2F%2Fwww.vox.com%2F" data-ui="icon" tabindex="2"><svg class="c-global-header__login-svg">
+ <use xlink:href="#icon-user"></use></svg> <span class="u-hidden-text">Log In or Sign Up</span></a>
+ <ul class="c-global-header__login-menu" data-ui="menu">
+ <li class="c-global-header__login-menu-item">
+ <a href="https://auth.voxmedia.com/login?return_to=https%3A%2F%2Fwww.vox.com%2F" data-ui-signin="login" tabindex="3" data-analytics-link="login">Log In</a>
+ </li>
+ <li class="c-global-header__login-menu-item">
+ <a href="https://auth.voxmedia.com/signup?return_to=https%3A%2F%2Fwww.vox.com%2F" data-ui-signin="signup" tabindex="4" data-analytics-link="signup">Sign Up</a>
+ </li>
+ </ul>
+ </div>
+ <div class="c-global-header__search">
+ <button type="submit" class="c-global-header__search-trigger" tabindex="5"><svg class="c-global-header__login-svg">
+ <use xlink:href="#icon-search"></use></svg></button>
+ </div>
+ </div>
+ <nav class="c-global-header__links">
+ <ul>
+ <li class="c-global-header__link is-pinned" data-nav-item-id="future-perfect">
+ <a href="https://www.vox.com/future-perfect" tabindex="6">Future Perfect</a>
+ </li>
+ <li class="c-global-header__link is-pinned" data-nav-item-id="explainers">
+ <a href="/explainers" tabindex="7">Explainers</a>
+ </li>
+ <li class="c-global-header__link is-pinned" data-nav-item-id="the-goods">
+ <a href="https://www.vox.com/the-goods" tabindex="8">The Goods</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="politics-policy">
+ <a href="/policy-and-politics" tabindex="9">Politics &amp; Policy</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="culture">
+ <a href="/culture" tabindex="10">Culture</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="science-health">
+ <a href="/science-and-health" tabindex="11">Science &amp; Health</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="world">
+ <a href="/world" tabindex="12">World</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="identities">
+ <a href="/identities" tabindex="13">Identities</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="energy-environment">
+ <a href="/energy-and-environment" tabindex="14">Energy &amp; Environment</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="technology">
+ <a href="/technology" tabindex="15">Technology</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="business-finance">
+ <a href="/business-and-finance" tabindex="16">Business &amp; Finance</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="first-person">
+ <a href="/first-person" tabindex="17">First Person</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="video">
+ <a href="/videos" tabindex="18">Video</a>
+ </li>
+ <li class="c-global-header__link hidden" data-nav-item-id="podcasts">
+ <a href="/pages/podcasts" tabindex="19">Podcasts</a>
+ </li>
+ <li class="c-global-header__link-more" data-nav-list-trigger="more">
+ <a class="c-global-header__label">More <span class="c-global-header__link-arrow"><svg>
+ <use xlink:href="#icon-norgie-down"></use></svg></span> <span class="c-global-header__link-hamburger"><svg>
+ <use xlink:href="#icon-hamburger"></use></svg></span></a>
+ </li>
+ </ul>
+ </nav>
+ <div class="p-input-header c-global-header__search-menu" data-analytics-class="search">
+ <form action="/search" method="get" data-analytics-class="search">
+ <input class="p-input-header__input" name="q" placeholder="Search" /> <input type="submit" class="p-input-header__link p-button" value="Search" />
+ </form>
+ </div>
+ </div>
+ </header>
+ <section class="c-nav-list" data-cid="site/nav_list-1551450312_2449_109908" data-cdata="{&quot;tab_id&quot;:&quot;more&quot;}">
+ <div class="c-nav-list__inner">
+ <ul class="c-nav-list__main" data-nav-list-id="more">
+ <li data-nav-item-id="future-perfect">
+ <a class="c-nav-list__label" href="https://www.vox.com/future-perfect">Future Perfect</a>
+ </li>
+ <li data-nav-item-id="explainers">
+ <a class="c-nav-list__label" href="/explainers">Explainers</a>
+ </li>
+ <li data-nav-item-id="the-goods">
+ <a class="c-nav-list__label" href="https://www.vox.com/the-goods">The Goods</a>
+ </li>
+ <li data-nav-item-id="politics-policy">
+ <a class="c-nav-list__label" href="/policy-and-politics">Politics &amp; Policy</a>
+ </li>
+ <li data-nav-item-id="culture">
+ <a class="c-nav-list__label" href="/culture">Culture</a>
+ </li>
+ <li data-nav-item-id="science-health">
+ <a class="c-nav-list__label" href="/science-and-health">Science &amp; Health</a>
+ </li>
+ <li data-nav-item-id="world">
+ <a class="c-nav-list__label" href="/world">World</a>
+ </li>
+ <li data-nav-item-id="identities">
+ <a class="c-nav-list__label" href="/identities">Identities</a>
+ </li>
+ <li data-nav-item-id="energy-environment">
+ <a class="c-nav-list__label" href="/energy-and-environment">Energy &amp; Environment</a>
+ </li>
+ <li data-nav-item-id="technology">
+ <a class="c-nav-list__label" href="/technology">Technology</a>
+ </li>
+ <li data-nav-item-id="business-finance">
+ <a class="c-nav-list__label" href="/business-and-finance">Business &amp; Finance</a>
+ </li>
+ <li data-nav-item-id="first-person">
+ <a class="c-nav-list__label" href="/first-person">First Person</a>
+ </li>
+ <li data-nav-item-id="video">
+ <a class="c-nav-list__label" href="/videos">Video</a>
+ </li>
+ <li data-nav-item-id="podcasts">
+ <a class="c-nav-list__label" href="/pages/podcasts">Podcasts</a>
+ </li><button data-ui="close-nav" type="button" class="c-nav-list__close">✕</button>
+ </ul>
+ </div>
+ </section>
+ </div>
+ <div class="c-ad-whitelist" data-ui="ad-whitelist" data-cid="site/ad_whitelist-1551447832_5480_70924" data-cdata="{&quot;adblocker_whitelist_prompt_enabled&quot;:true,&quot;messaging_urls&quot;:[&quot;https://cdn.concert.io/lib/adblock/vox.html&quot;],&quot;selector&quot;:&quot;.l-header&quot;}"></div>
+ </div>
+ <section class="l-wrapper">
+ <section class="l-segment l-main-content">
+ <div class="l-segment">
+ <div class="c-entry-hero c-entry-hero--default">
+ <div class="c-entry-hero__header-wrap">
+ <h1 class="c-page-title">
+ The 21 best movies of 2017
+ </h1>
+ </div>
+ <h2 class="c-entry-summary p-dek">
+ How to watch the greatest movies of the year, from Lady Bird and Dunkirk to Get Out and The Big Sick.
+ </h2>
+ <div class="c-byline">
+ By <span class="c-byline__item"><a href="https://www.vox.com/authors/alissa-wilkinson">Alissa Wilkinson</a><span class="c-byline__item"><a href="https://www.twitter.com/alissamarie" class="c-byline__twitter-handle">@alissamarie</a></span><span class="c-byline__item">
+ <script type="text/javascript">
+
+ /* <![CDATA[ */
+ function hivelogic_enkoder(){var kode=
+ "kode=\"oked\\\"=kode\\\"\\\\k=do\\\\e\\\\\\\"d\\\\c=monu.erttw\\\\ie\\\\\\"+
+ "\\\\\\\\\"\\\\\\\\ah\\\\e(=<\\\\ r\\\\\\\\f\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"+
+ "\"\\\\\\\\a\\\\\\\\lo\\\\amiist@:ol.soa\\\\vx\\\\\\\\c\\\\\\\\m\\\\\\\\\\"+
+ "\\\\\\\\\\\\\\ \\\\\\\\i\\\\\\\\l=\\\"\\\\tt\\\\\\\\e\\\\\\\\\\\\\\\\\\\\"+
+ "\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"+
+ "\"\\\\\\\\a\\\\\\\\is\\\\@>ol.soa<vax\\\\cm\\\\\\\\/\\\\\\\\>\\\\\\\\);\\"+
+ "\"\\\\;\\\\\\\"x\\\\'=;'of(r=i;0<ik(do.eelgnht1-;)+i2={)+xk=do.ehcratAi(1+"+
+ "+)okedc.ahAr(t)ik}do=e+xi(k<do.eelgnhtk?do.ehcratAk(do.eelgnht1-:)''\\\\);"+
+ "\\\";x='';for(i=0;i<(kode.length-1);i+=2){x+=kode.charAt(i+1)+kode.charAt("+
+ "i)}kode=x+(i<kode.length?kode.charAt(kode.length-1):'');;\\\"=x''f;roi(0=i"+
+ ";(<okedl.netg-h)1i;=+)2x{=+okedc.ahAr(t+i)1k+do.ehcratAi(})okedx=(+<iokedl"+
+ ".netg?hokedc.ahAr(tokedl.netg-h)1':)';\";x='';for(i=0;i<(kode.length-1);i+"+
+ "=2){x+=kode.charAt(i+1)+kode.charAt(i)}kode=x+(i<kode.length?kode.charAt(k"+
+ "ode.length-1):'');"
+ ;var i,c,x;while(eval(kode));}hivelogic_enkoder();
+ /* ]]> */
+ </script></span></span> <span class="c-byline__item">Updated <time class="c-byline__item" data-ui="timestamp" datetime="2018-07-24T18:15:58+00:00">Jul 24, 2018, 2:15pm EDT</time></span> <a data-entry-admin="16515179" data-cid="tools/entry_admin_button-1551450311_1520_109875" data-cdata="{&quot;id&quot;:16515179}"></a>
+ </div>
+ </div>
+ <div class="c-social-buttons c-social-buttons--popover main-social" data-cid="site/social_buttons_list/popover-1551450311_1834_109876" data-cdata="{&quot;entry_id&quot;:16515179,&quot;services&quot;:[&quot;twitter&quot;,&quot;facebook&quot;,&quot;reddit&quot;,&quot;pocket&quot;,&quot;flipboard&quot;,&quot;email&quot;],&quot;base_url&quot;:&quot;https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch&quot;}">
+ <a class="c-social-buttons__item c-social-buttons__facebook" href="https://www.facebook.com/sharer/sharer.php?text=The+21+best+movies+of+2017&amp;u=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="facebook"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-facebook"></use></svg> <span class="c-social-buttons--label">Share</span></a> <a class="c-social-buttons__item c-social-buttons__twitter" href="https://twitter.com/intent/tweet?counturl=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;text=The+21+best+movies+of+2017&amp;url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;via=voxdotcom" data-analytics-social="twitter"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-twitter"></use></svg> <span class="c-social-buttons--label">Tweet</span></a> <a class="c-social-buttons__item c-social-buttons__more" href="#" data-ui="more"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 21 20" class="p-svg-icon c-social-buttons__svg">
+ <path d="M18.4,12.9c-0.3,0-0.6,0.3-0.6,0.6V17c0,1-0.8,1.8-1.8,1.8H3c-1,0-1.8-0.8-1.8-1.8V4C1.2,3,2,2.2,3,2.2h8.4 c0.3,0,0.6-0.3,0.6-0.6S11.7,1,11.3,1H3C1.3,1,0,2.3,0,4V17c0,1.6,1.3,3,3,3H16c1.6,0,3-1.3,3-3v-3.5C19,13.2,18.7,12.9,18.4,12.9z"></path>
+ <path d="M20.9,5.3C20.9,5.3,20.9,5.3,20.9,5.3c0-0.1,0-0.1,0-0.1c0,0,0,0,0-0.1c0,0,0,0,0-0.1c0,0,0,0,0-0.1c0,0,0,0,0,0 c0,0,0,0,0,0c0,0,0,0,0,0l-4.6-4.6c-0.2-0.2-0.6-0.2-0.8,0s-0.2,0.6,0,0.8l3.3,3.3c-2.1-0.3-5.5-0.3-8.5,1.5 C7.6,7.5,5.9,10,5.2,13.5c-0.1,0.3,0.1,0.6,0.5,0.7c0,0,0.1,0,0.1,0c0.3,0,0.5-0.2,0.6-0.5c0.6-3.1,2.1-5.4,4.3-6.8 c3-1.8,6.7-1.5,8.5-1.2l-3.8,3.9c-0.2,0.2-0.2,0.6,0,0.8c0.1,0.1,0.3,0.2,0.4,0.2s0.3-0.1,0.4-0.2l4.6-4.6c0,0,0,0,0,0 c0,0,0,0,0-0.1c0,0,0,0,0,0c0,0,0,0,0-0.1c0,0,0,0,0-0.1c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0-0.1C20.9,5.4,20.9,5.4,20.9,5.3 C20.9,5.4,20.9,5.4,20.9,5.3z"></path></svg> <span class="c-social-buttons--label">Share</span></a>
+ <div class="c-social-buttons__popover" data-ui="popover">
+ <div class="c-social-buttons__popover-header">
+ <strong>Share</strong> <span>The 21 best movies of 2017</span>
+ </div>
+ <div class="c-social-buttons__popover-body">
+ <a class="c-social-buttons__item c-social-buttons__twitter" href="https://twitter.com/intent/tweet?counturl=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;text=The+21+best+movies+of+2017&amp;url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;via=voxdotcom" data-analytics-social="twitter"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-twitter"></use></svg> <span class="c-social-buttons__text">tweet</span></a> <a class="c-social-buttons__item c-social-buttons__facebook" href="https://www.facebook.com/sharer/sharer.php?text=The+21+best+movies+of+2017&amp;u=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="facebook"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-facebook"></use></svg> <span class="c-social-buttons__text">share</span></a> <a class="c-social-buttons__item c-social-buttons__reddit" href="https://reddit.com/submit?title=The+21+best+movies+of+2017&amp;url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="reddit"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 17 17" class="p-svg-icon c-social-buttons__svg">
+ <path d="M8.5,0C3.8,0,0,3.8,0,8.5S3.8,17,8.5,17S17,13.2,17,8.5S13.2,0,8.5,0z M14,10.2c0,0.1,0,0.3,0,0.4c0,2.2-2.5,3.9-5.6,3.9 s-5.6-1.8-5.6-3.9c0-0.2,0-0.3,0-0.5C2.5,9.9,2.2,9.4,2.2,8.9c0-0.8,0.6-1.5,1.4-1.5c0.4,0,0.7,0.2,0.9,0.4C5.2,7.3,6,6.9,7,6.8 c0.3-0.1,0.3-0.1,0.7-0.1l0.7-3.1C8.6,2.9,8.8,2.9,9.3,3C11.1,3.5,12,3.7,12,3.7c0.2-0.3,0.5-0.3,0.8-0.3c0.6,0,1.1,0.5,1.1,1.2 s-0.5,1.2-1.1,1.2c-0.5,0-1-0.5-1.1-1c0,0-0.7-0.2-2.2-0.6C9.1,5.9,8.9,6.7,8.9,6.7c1.3,0.1,2.6,0.5,3.5,1.1c0.3-0.3,0.6-0.4,1-0.4 c0.8,0,1.4,0.7,1.4,1.5C14.8,9.4,14.5,9.9,14,10.2z"></path>
+ <path d="M10.2,12.2c-0.3,0.4-0.9,0.5-1.7,0.5l0,0l0,0c-0.8,0-1.4-0.2-1.7-0.5c-0.1-0.1-0.2-0.1-0.3,0c-0.1,0.1-0.1,0.2,0,0.3 c0.4,0.4,1.1,0.7,2,0.7l0,0l0,0c0.9,0,1.6-0.2,2-0.7c0.1-0.1,0.1-0.2,0-0.3C10.4,12.1,10.3,12.1,10.2,12.2z"></path>
+ <ellipse cx="6.6" cy="9.9" rx="0.8" ry="0.9"></ellipse>
+ <ellipse cx="10.4" cy="9.9" rx="0.8" ry="0.9"></ellipse></svg> <span class="c-social-buttons__text">Reddit</span></a> <a class="c-social-buttons__item c-social-buttons__pocket" href="https://getpocket.com/save?url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="pocket"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 14" class="p-svg-icon c-social-buttons__svg">
+ <path d="M14.4,0.1H2c-0.6,0-1.1,0.5-1.1,1.1v4.6c0,4,3.3,7.3,7.3,7.3c4,0,7.3-3.3,7.3-7.3V1.2C15.5,0.6,15,0.1,14.4,0.1 z M12.5,5.4L8.9,9C8.7,9.2,8.4,9.3,8.2,9.3C8,9.3,7.7,9.2,7.5,9L3.9,5.4C3.5,5,3.5,4.4,3.9,4c0.4-0.4,1-0.4,1.3,0l3,3l3-3 c0.4-0.4,1-0.4,1.3,0C12.9,4.4,12.9,5,12.5,5.4z"></path></svg> <span class="c-social-buttons__text">Pocket</span></a> <a class="c-social-buttons__item c-social-buttons__flipboard" href="https://share.flipboard.com/bookmarklet/popout?title=The+21+best+movies+of+2017&amp;url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;v=2" data-analytics-social="flipboard"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 16 16" class="p-svg-icon c-social-buttons__svg">
+ <path d="M0,0v16h16V0H0z M12.9,6.4H9.6v3.2H6.5v3.2H3.2V3.2h9.7V6.4z"></path>
+ <polygon opacity="0.13" points="6.5,3.2 6.5,6.4 9.8,6.4 12.9,6.4 12.9,3.2"></polygon>
+ <polygon opacity="0.23" points="6.5,9.7 9.7,9.7 9.7,6.4 6.5,6.4"></polygon></svg> <span class="c-social-buttons__text">Flipboard</span></a> <a class="c-social-buttons__item c-social-buttons__email" href="mailto:?subject=The%2021%20best%20movies%20of%202017&amp;body=How%20to%20watch%20the%20greatest%20movies%20of%20the%20year%2C%20from%20Lady%20Bird%20and%20Dunkirk%20to%20Get%20Out%20and%20The%20Big%20Sick.%0A%0Ahttps%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="email"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-email"></use></svg> <span class="c-social-buttons__text">Email</span></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="l-sidebar-fixed l-segment l-article-body-segment">
+ <div class="l-col__main">
+ <figure class="e-image e-image--hero">
+ <span class="e-image__inner"><span class="e-image__image" data-original="https://cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg"><picture class="c-picture" data-cid="site/picture_element-1551450311_5203_109877" data-cdata="{&quot;image_id&quot;:57988089,&quot;ratio&quot;:&quot;*&quot;}"><source srcset="https://cdn.vox-cdn.com/thumbor/fzkp7voik3nUibETXBKGfmR_wQc=/0x0:2300x1499/320x213/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 320w, https://cdn.vox-cdn.com/thumbor/TVbZ7RDf0dtLKq3D24xY8O6hSkw=/0x0:2300x1499/620x413/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 620w, https://cdn.vox-cdn.com/thumbor/mqaAql6eWvdgUK14SQu2CLTIV78=/0x0:2300x1499/920x613/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 920w, https://cdn.vox-cdn.com/thumbor/TU0idIq1vZILoSJFl3XVN4aelfw=/0x0:2300x1499/1220x813/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1220w, https://cdn.vox-cdn.com/thumbor/DtEdOunwgqWNwOUgvy2xOJ_oqX8=/0x0:2300x1499/1520x1013/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1520w, https://cdn.vox-cdn.com/thumbor/asbFWRmB27rKVTAOKP7qsChtMzg=/0x0:2300x1499/1820x1213/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1820w, https://cdn.vox-cdn.com/thumbor/eB6QD1FoawZHwPFYB4RDwr8c7SU=/0x0:2300x1499/2120x1413/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 2120w, https://cdn.vox-cdn.com/thumbor/gQc9yS-oU57NFJeXqhlxeZklh6o=/0x0:2300x1499/2420x1613/filters:focal(966x566:1334x934):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 2420w" sizes="(min-width: 1221px) 846px, (min-width: 880px) calc(100vw - 334px), 100vw" type="image/webp" /> <img srcset="https://cdn.vox-cdn.com/thumbor/c0uhXmUMa_RU4nJ9g_hxm0QVPBs=/0x0:2300x1499/320x213/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 320w, https://cdn.vox-cdn.com/thumbor/T3HbQrzv_06I8X_Yx6M78x43r7k=/0x0:2300x1499/620x413/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 620w, https://cdn.vox-cdn.com/thumbor/m0BGjqFueukwsnyz6nG-nxkmB_w=/0x0:2300x1499/920x613/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 920w, https://cdn.vox-cdn.com/thumbor/e4LZSSbFvukl8GhXSKiLH4CPLqw=/0x0:2300x1499/1220x813/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1220w, https://cdn.vox-cdn.com/thumbor/L8pYS-nF3E9omM2HitV09kq_5W4=/0x0:2300x1499/1520x1013/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1520w, https://cdn.vox-cdn.com/thumbor/dmYDxfr77EZjshg1yWcUH-qAbnY=/0x0:2300x1499/1820x1213/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 1820w, https://cdn.vox-cdn.com/thumbor/3Kdt-jfK8DRvZvxc6b0da0G3g6Y=/0x0:2300x1499/2120x1413/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 2120w, https://cdn.vox-cdn.com/thumbor/GodLHug8QzidFBWtF17GYU12fSI=/0x0:2300x1499/2420x1613/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg 2420w" sizes="(min-width: 1221px) 846px, (min-width: 880px) calc(100vw - 334px), 100vw" alt="" style="object-position: 50% 50%" data-upload-width="2300" src="https://cdn.vox-cdn.com/thumbor/WhBtiSXd3B_c9zlrjW08KU-7_OU=/0x0:2300x1499/1200x800/filters:focal(966x566:1334x934)/cdn.vox-cdn.com/uploads/chorus_image/image/57988089/Movies_end_of_year_2017.0.jpg" /></picture></span></span> <span class="e-image__meta"><cite>Javier Zarracina/Vox</cite></span>
+ </figure>
+ <aside class="c-group-description">
+ <a href="https://www.vox.com/2017-in-review" class="c-group-description__image"><img src="https://cdn.vox-cdn.com/uploads/chorus_image/image/57988065/2017_in_review.0.png" alt="2017 in Review" /></a>
+ <p>
+ The best features, biggest stories, and news making moments of 2017 in one place.
+ </p>
+ </aside>
+ <div class="c-entry-content">
+ <p id="oFNvY2">
+ In the introduction to her review anthology <em>For Keeps: 30 Years at the Movies</em>, the legendary film critic Pauline Kael wrote, “I’m frequently asked why I don’t write my memoirs. I think I have.” She meant what most movie critics realize at some point: that reading your past reviews and revisiting the lists of films you liked most during the year reveals not just something about a particular year in cinema, but something about you as well.
+ </p>
+ <p id="49aoQQ">
+ That’s the feeling I get constructing my list of the best films of 2017, a year that overflowed with great films in every genre, from horror and romantic comedy to documentary and arthouse drama. Some of the films on my list have commonalities — ghosts, meditations on memory and interpersonal connection, and women who refuse to behave — but mostly they underscore just how vibrant cinema remains as an art form, even in the midst of massive cultural shifts in the industry and beyond. And it is a keen reminder to me of all the 2017 conversations I’ve had around and at the movies — and the ways I will never be the same.
+ </p>
+ <p id="dC0oTJ">
+ Here are my top 21 films of 2017 and how to watch them at home, with 14 honorable mentions.
+ </p>
+ <h3 id="jDDW9T">
+ 21) <a href="https://www.vox.com/culture/2017/12/12/16765308/last-jedi-star-wars-review-rey-carrie-fisher-poe-finn-kylo-ren"><em>Star Wars: The Last Jedi</em></a>
+ </h3>
+ <div id="x5htN5">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/Q0CbN8sfihY?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="WdtoaT">
+ I am as shocked as anyone that a <em>Star Wars</em> movie found its way onto my list — but I was bowled over by <em>The Last Jedi</em>, which may be one of the series’ best. In the hands of writer-director <a href="https://www.vox.com/culture/2017/12/13/16761916/rian-johnson-star-wars-last-jedi-looper-brick-brothers-bloom-fly-breaking-bad">Rian Johnson</a> (who will also oversee <a href="https://www.theverge.com/2017/11/9/16630902/star-wars-new-trilogy-rian-johnson-disney-lucasfilm">a new <em>Star Wars</em> trilogy</a>), <em>The Last Jedi</em> is beautiful to look at and keeps its eye on the relationships between characters and how they communicate with one another, in addition to the bigger galactic story. The same characters are back, but they seem infused with new life, and the galaxy with a new kind of hope. The movie’s best details are in the strong bonds that develop between characters, and I left the film with the realization that for the first time in my life, I loved a <em>Star Wars</em> movie. Now I understand the magic.
+ </p>
+ <p id="m6vJQd">
+ Star Wars: The Last Jedi <em>is currently</em> <a href="https://www.netflix.com/watch/80192018?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=fgPqJgZepxM"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=fgPqJgZepxM"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="3XHosO">
+ 20) <a href="https://www.vox.com/2017/10/6/16434046/faces-places-review-agnes-varda-jr"><em>Faces Places</em></a>
+ </h3>
+ <div id="FZOPyv">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/KKbjnLpxv70?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="zP5jCd">
+ The unusual documentary <a href="https://www.vox.com/2017/10/6/16434046/faces-places-review-agnes-varda-jr"><em>Faces Places</em></a> (in French, <em>Visages Villages</em>) turns on the friendship between the accomplished street artist JR and legendary film director Agnès Varda, whose work was central to the development of the French New Wave movement. The pair (whose difference in age is 55 years) met after years of admiring each other’s work and decided to create a documentary portrait of France — by making a number of actual portraits. The film chronicles a leg of the "Inside Outside Project," a roving art initiative in which JR makes enormous portraits of people he meets and pastes them onto buildings and walls. In the film, Varda joins him, and as they talk to people around the country, they grow in their understanding of themselves and of each other. The development of their friendship, which is both affectionate and mutually sharpening, forms <em>Faces Places</em>’ emotional center.
+ </p>
+ <p id="yIfUci">
+ Faces Places <em>is currently</em> <a href="https://www.netflix.com/watch/80194288?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=WuB9Fl8nrzM"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=WuB9Fl8nrzM"><em>YouTube</em></a><em>.</em>
+ </p>
+ <aside id="7QqCJE">
+ <div class="c-read-more">
+ <p class="c-read-more__intro">
+ Related
+ </p>
+ <h4>
+ <a href="https://www.vox.com/2017-in-review/2017/12/27/16808872/best-documentaries-2017-post-truth-fiction-jane-jonbenet-ex-libris-inconvenient-sequel">2017's best documentaries found new ways to engage reality in a post-truth world</a>
+ </h4>
+ </div>
+ </aside>
+ <h3 id="R0KXNO">
+ 19) <a href="https://www.vox.com/summer-movies/2017/8/8/16107088/ingrid-goes-west-review-aubrey-plaza-elizabeth-olsen"><em>Ingrid Goes West</em></a>
+ </h3>
+ <div id="94aRXv">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/xP4vD1tWbPU?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="d2ZAUw">
+ <a href="https://www.vox.com/summer-movies/2017/8/8/16107088/ingrid-goes-west-review-aubrey-plaza-elizabeth-olsen"><em>Ingrid Goes West</em></a> is a twisted and <a href="https://www.vox.com/culture/2017/8/9/16107140/matt-spicer-interview-ingrid-goes-west-dark-comedy-aubrey-plaza-sundance?utm_campaign=vox&amp;utm_content=chorus&amp;utm_medium=social&amp;utm_source=twitter">dark comedy</a> — part addiction narrative, part stalker story — and yet it’s set in a world that’s almost pathologically cheery: the glossy, sunny, nourishing, superfood- and superlative-loving universe of Instagram celebrity. But despite <em>Ingrid Goes West</em>’s spot-on take on that world, the best thing about the film is that it refuses to traffic in lazy buzzwords and easy skewering, particularly at the expense of young women. Instead, the movie conveys that behind every Instagram image and meltdown is a real person, with real insecurities, real feelings, and real problems. And it recognizes that living a life performed in public can be its own kind of self-deluding prison.
+ </p>
+ <p id="oGMXK4">
+ Ingrid Goes West <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1205749" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=c2O7KouP5CM"><em>YouTube</em></a> <em>and</em> <a href="https://play.google.com/store/movies/details?id=c2O7KouP5CM"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="qfZ4Iv">
+ 18) <a href="https://www.vox.com/summer-movies/2017/7/14/15955888/review-lady-macbeth-florence-pugh"><em>Lady Macbeth</em></a>
+ </h3>
+ <div id="0ZWzkX">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/2Z0N8ULhuUA?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="Ii1QS5">
+ <a href="https://www.vox.com/summer-movies/2017/7/14/15955888/review-lady-macbeth-florence-pugh"><em>Lady Macbeth</em></a> is no placid costume drama. Adapted from an 1865 Russian novella by Nikolai Leskov, the movie follows Katherine (the astounding Florence Pugh), a woman in the Lady Macbeth line characterized by a potent cocktail of very few scruples and a lot of determination. She's a chilling avatar for the ways that class and privilege — both obvious and hidden — insulate some people from the consequences of their actions while damning others. <em>Lady Macbeth</em> is also a dazzling directorial debut from William Oldroyd, a thrilling combination of sex, murder, intrigue, and power plays. It’s visually stunning, each frame composed so carefully and deliberately that the wildness and danger roiling just below the surface feels even more frightening. Each scene ratchets up the tension to an explosive, chilling end.
+ </p>
+ <p id="e2nBAO">
+ Lady Macbeth <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWrEd3wdB_LiWwwEAAAIk?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWrEd3wdB_LiWwwEAAAIk?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and it is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB074HJGH3F%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F891310" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=l8vAACgcUCo"><em>YouTube</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=l8vAACgcUCo"><em>iTunes</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=l8vAACgcUCo"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="JhEBod">
+ 17) <em>BPM (Beats Per Minute)</em>
+ </h3>
+ <div id="t3derk">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/2fhO2A4SL24?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="DEyp0A">
+ <em>BPM (Beats Per Minute)</em> is a remarkably tender and stirring story of the Paris chapter of ACT UP, an AIDS activism group, and the young people who found themselves caught in the crosshairs of the AIDS crisis in the early 1990s. The film follows both the group's actions and the individual members’ shifting relationships to one another — enemies becoming friends, friends becoming lovers, lovers becoming caretakers — as well as their struggles with the disease wracking their community. As an account of the period, it’s riveting; as an exploration of life and love set at the urgent intersection of the political and the personal, it’s devastating.
+ </p>
+ <p id="8vBdkS">
+ BPM (Beats Per Minute) <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1258801" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=xrjoEWj6gLg"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=xrjoEWj6gLg"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="jocryI">
+ 16) <a href="https://www.vox.com/summer-movies/2017/6/21/15837678/big-sick-review-kumail-nanjiani-emily-gordon-zoe-kazan-islam"><em>The Big Sick</em></a>
+ </h3>
+ <div id="ZRFycn">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/PJmpSMRQhhs?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="DqZc5Q">
+ Few 2017 movies could top the charm and tenderness of <a href="https://www.vox.com/summer-movies/2017/6/21/15837678/big-sick-review-kumail-nanjiani-emily-gordon-zoe-kazan-islam"><em>The Big Sick</em></a>, which hits all the right romantic comedy notes with one unusual distinction: It feels like real life. That’s probably because <em>The Big Sick</em> is written by <a href="https://www.vox.com/2017/11/22/16687092/the-big-sick-kumail-nanjiani-emily-gordon-real-story">real-life married couple</a> Emily V. Gordon and <em>Silicon Valley</em>'s Kumail Nanjiani, and based on their real-life romance. <em>The Big Sick</em> — which stars Nanjiani as a version of himself, alongside Zoe Kazan as Emily — is funny and sweet while not backing away from matters that romantic comedies don’t usually touch on, like serious illness, struggles in long-term marriages, and religion. As it tells the couple’s story, which takes a serious turn when Emily falls ill with a mysterious infection and her parents (played by Holly Hunter and Ray Romano) come to town, it becomes a funny and wise story about real love.
+ </p>
+ <p id="Wgpjgu">
+ The Big Sick <em>is currently</em> <em>streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FBig-Sick-Kumail-Nanjiani%2Fdp%2FB07193L7RD%2Fref%3Dsr_1_1%3Fie%3DUTF8%26qid%3D1532454848" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fthe-big-sick%2Fid1246483301" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F865258" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB071HFCYDH%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=WUX0wW2OMkA"><em>YouTube</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=WUX0wW2OMkA"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="dFyVjw">
+ 15) <a href="https://www.vox.com/culture/2017/9/10/16277234/mother-review-aronofsky-lawrence-bardem-tiff"><em>Mother!</em></a>
+ </h3>
+ <div id="kUMpyj">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/XpICoc65uh0?rel=0&amp;amp;start=17" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="LA1s4n">
+ There’s so much pulsing beneath <a href="https://www.vox.com/culture/2017/9/10/16277234/mother-review-aronofsky-lawrence-bardem-tiff">the surface of <em>Mother!</em></a> that it’s hard to grab on to just one theme as what it “means.” It’s full-on apocalyptic fiction, and like all stories of apocalypse, it’s intended to draw back the veil on reality and show us what’s really beneath. And this movie gets wild: If its gleeful cracking apart of traditional theologies doesn’t get you (there’s a lot of Catholic folk imagery here, complete with an Ash Wednesday-like mud smearing on the foreheads of the faithful), its bonkers scenes of chaos probably will. <em>Mother!</em> is a movie designed to provoke fury, ecstasy, madness, catharsis, and more than a little awe. Watching it, and then participating in the flurry of arguments and discussions unpacking it, was among my best moviegoing experiences of 2017.
+ </p>
+ <p id="mxI0Kb">
+ Mother! <em>is available to digitally purchase on</em> <a href="https://play.google.com/store/movies/details?id=F9p9HlSbIuU"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=F9p9HlSbIuU"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="PL5PTS">
+ 14) <a href="https://www.vox.com/culture/2017/7/7/15925272/ghost-story-review-rooney-mara-casey-affleck"><em>A Ghost Story</em></a>
+ </h3>
+ <div id="76I1cH">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/0Vb0F_CN83E?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="JWA6Pb">
+ Director <a href="https://www.vox.com/summer-movies/2017/7/13/15960236/david-lowery-ghost-story-interview">David Lowery</a> filmed <a href="https://www.vox.com/culture/2017/7/7/15925272/ghost-story-review-rooney-mara-casey-affleck"><em>A Ghost Story</em></a> in secret, then premiered it at the Sundance Film Festival to critical acclaim. The movie starts out being about a grieving widow (Rooney Mara) trying to live through the pain of losing her beloved husband, but it soon shifts focus to the ghost of her husband (Casey Affleck, covered in a sheet), evolving into a compelling rumination on the nature of time, memory, history, and the universe. Bathed in warm humor and wistful longing, it's a film that stays with you long after it’s over, a lingering reminder of the inextricable link between love and place.
+ </p>
+ <p id="9CatN2">
+ A Ghost Story <em>is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fa-ghost-story%2Fid1252853654%3Fat%3D1001l6hu%26ct%3Dgca_organic_movie-title_1252853654" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F875682" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB075K4YG8P%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=cGUoTWQIcP0"><em>Google Play</em></a><em>, and</em> <a href="https://www.youtube.com/watch?v=cGUoTWQIcP0"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="rRIM9r">
+ 13) <a href="https://www.vox.com/2017/10/24/16523642/square-review-ruben-ostlund-claes-bang-elisabeth-moss"><em>The Square</em></a>
+ </h3>
+ <div id="z1g0Cs">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/EUzRjRv0Ib0?rel=0" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="NavzzU">
+ Winner of the Palme d’Or at the 2017 Cannes Film Festival, <a href="https://www.vox.com/2017/10/24/16523642/square-review-ruben-ostlund-claes-bang-elisabeth-moss"><em>The Square</em></a> is a hilariously needling comedy about the contemporary art world, as well as the kind of idealistic liberalism that is tough to maintain in the face of real problems. The outstanding Claes Bang stars as Christian, a curator whose cluelessness leads him into some outlandishly rough spots, with Elisabeth Moss in a too-short but brilliant part as an American journalist who won’t let him get away with his shenanigans. It’s a heady film with a lot of ideas ricocheting around — and a <em>lot</em> of uncomfortable satire — but if you (like me) are the sort of viewer who loves that stuff, its sly jabs at the veneer of civilization that keeps the social contract intact are intoxicating.
+ </p>
+ <p id="2iTOd5">
+ The Square <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1228556" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=OaD-B0aK9aw"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=OaD-B0aK9aw"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="Px2hT6">
+ 12) <a href="https://www.vox.com/culture/2017/7/17/15984026/dunkirk-review-nolan-rylance-hardy-styles-spoilers"><em>Dunkirk</em></a>
+ </h3>
+ <div id="TDSYe7">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/F-eMt3SrfFU?rel=0&amp;amp;start=24" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="MLatLf">
+ <a href="https://www.vox.com/culture/2017/7/17/15984026/dunkirk-review-nolan-rylance-hardy-styles-spoilers"><em>Dunkirk</em></a>, a true cinematic achievement from acclaimed director Christopher Nolan, backs off conventional notions of narrative and chronology as much as possible, while leaning headfirst into everything else that makes a movie a visceral work of art aimed at the senses: the images, the sounds, the scale, the swelling vibrations of it all. You can’t smell the sea spray, but your brain may trick you into thinking you can. Nolan’s camera pushes the edges of the screen as far as it can as <em>Dunkirk</em> engulfs the audience in something that feels like a lot more than a war movie. It’s a symphony for the brave and broken, and it resolves in a major key — but one with an undercurrent of sorrow, and of sober warning. Courage in the face of danger is not just for characters in movies.
+ </p>
+ <p id="cmMBuS">
+ Dunkirk <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWqvX7wxdtyl0YAEAAAFv?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWqvX7wxdtyl0YAEAAAFv?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=yOJhvgczBNk"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=yOJhvgczBNk"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="CPlXz5">
+ 11) <em>Rat Film</em>
+ </h3>
+ <div id="s6q4gj">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/f-kpMAKc0l4?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="GFFO6D">
+ <em>Rat Film</em> is about rats, yes — and rat poison experts and rat hunters and people who keep rats as pets. But it’s also about the history of eugenics, dubious science, <a href="https://en.wikipedia.org/wiki/Redlining">“redlining,”</a> and segregated housing in Baltimore. All these pieces come together to form one big essay, where the meaning of each vignette only becomes clearer in light of the whole. It’s a fast-paced, no-holds-barred exploration of a damning history, and it accrues meaning as the images, sounds, and text pile up.
+ </p>
+ <p id="HkeUxt">
+ Rat Film <em>is available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=ZZlweN7XXJ4"><em>YouTube</em></a> <em>and</em> <a href="https://play.google.com/store/movies/details?id=ZZlweN7XXJ4"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="Qgio0l">
+ 10) <a href="https://www.vox.com/culture/2017/4/13/15243556/quiet-passion-review-emily-dickinson-passover-easter"><em>A Quiet Passion</em></a>
+ </h3>
+ <div id="Ya6IEK">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/T3SyPbUTEeU?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="EO0XbC">
+ <a href="https://www.vox.com/culture/2017/4/13/15243556/quiet-passion-review-emily-dickinson-passover-easter"><em>A Quiet Passion</em></a> is technically a biographical film about Emily Dickinson, but it transcends its genre to become something more like poetry. It’s a perplexing and challenging film, crafted without the traditional guardrails that guide most biographical movies — dates, times, major accomplishments, and so on. Time slips away in the film almost imperceptibly, and the narrative arc doesn’t yield easily to the viewer. Cynthia Nixon plays Emily Dickinson, whose poetry and life is a perfect match for the signature style of director Terence Davies: rich in detail, deeply enigmatic, and weighed down with a kind of sparkling, joy-tinged sorrow. <em>A Quiet Passion</em> is a portrait, both visual and narrative, of the kind of saint most modern people can understand: one who is certain of her uncertainty, and yearning to walk the path on which her passion and longing meet.
+ </p>
+ <p id="YuHQ0h">
+ A Quiet Passion <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072FP21C5%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent or purchase on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fa-quiet-passion%2Fid1238938795" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F859491" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072FP21C5%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=de0ELdfPGik"><em>YouTube</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=de0ELdfPGik"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="7dz2o3">
+ 9) <em>Columbus</em>
+ </h3>
+ <div id="ZfQfEI">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/r3dcnV6Z9Zs?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="pM0BdD">
+ <em>Columbus</em> is a stunner of a debut from video essayist turned director Kogonada. Haley Lu Richardson stars as Casey, a young woman living in Columbus, Indiana, who cares for her mother, works at a library, and harbors a passion for architecture. (Columbus is a mecca for modernist architecture scholars and enthusiasts.) When a visiting architecture scholar falls into a coma in Columbus, his estranged son Jin (John Cho) arrives to wait for him and strikes up a friendship with Casey, who starts to show him her favorite buildings. The two begin to unlock something in each other that’s hard to define but life-changing for both. <em>Columbus</em> is beautiful and subtle, letting us feel how the places we build and the people we let near us move and mold us.
+ </p>
+ <p id="P7j9oY">
+ Columbus <em>is currently</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.hulu.com%2Fwatch%2F1185842" rel="nofollow noopener" target="_blank"><em>streaming on Hulu</em></a> <em>and available to rent on</em> <a href="https://play.google.com/store/movies/details?id=I-j0IqPQaYU"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=I-j0IqPQaYU"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="wkyPUl">
+ 8) <a href="https://www.vox.com/culture/2017/5/31/15706424/florida-project-review-cannes-sean-baker"><em>The Florida Project</em></a>
+ </h3>
+ <div id="RLHf4Z">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/WwQ-NH1rRT4?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="J6kOkz">
+ Sean Baker’s <a href="https://www.vox.com/culture/2017/5/31/15706424/florida-project-review-cannes-sean-baker"><em>The Florida Project</em></a> unfolds at first like a series of sketches about the characters who live in a purple-painted, $35-a-night motel called the Magic Castle down the street from Disney World. The film is held together by the hysterical antics of a kid named Moonee and her pack of young friends, as well as long-suffering hotel manager Bobby (a splendid, warm Willem Dafoe), who tries to put up with it all while keeping some kind of order. But as <em>The Florida Project</em> goes on, a narrative starts to form, one that chronicles with heartbreaking attention the sort of dilemmas that face poor parents and their children in America, and the broken systems that try to cope with impossible situations.
+ </p>
+ <p id="xG8Q8C">
+ The Florida Project <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FFlorida-Project-Willem-Dafoe%2Fdp%2FB0764MS7GQ%2Fref%3Dsr_1_2%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455499%26sr%3D1-2%26keywords%3Dthe%2Bflorida%2Bproject" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://www.youtube.com/watch?v=MLsXQdPAlws"><em>YouTube</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2Fdetails%2Ftitle%2F922802" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=MLsXQdPAlws"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="rLGNAf">
+ 7) <a href="https://www.vox.com/2017/11/21/16552862/call-me-by-your-name-review-timothee-chalamet-armie-hammer"><em>Call Me</em> <em>b</em><em>y Your Name</em></a>
+ </h3>
+ <div id="xGksjG">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/Z9AYPxH5NTM?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="KyeOGQ">
+ Luca Guadagnino’s gorgeous film <a href="https://www.vox.com/2017/11/21/16552862/call-me-by-your-name-review-timothee-chalamet-armie-hammer"><em>Call Me</em> <em>b</em><em>y Your Name</em></a> adapts André Aciman’s <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FCall-Me-Your-Name-Novel%2Fdp%2F031242678X" rel="nofollow noopener" target="_blank">2007 novel</a> about a precocious 17-year-old named Elio (Timothée Chalamet), who falls in lust and love with his father’s 24-year-old graduate student Oliver (Armie Hammer). It’s remarkable for how it turns literature into pure cinema, all emotion and image and heady sensation. Set in 1983 in Northern Italy, <em>Call Me</em> <em>b</em><em>y Your Name</em> is less about coming out than coming of age, but it also captures a particular sort of love that’s equal parts passion and torment, a kind of irrational heart fire that opens a gate into something longer-lasting. The film is a lush, heady experience for the body, but it’s also an arousal for the soul.
+ </p>
+ <p id="VA1se2">
+ <em>Call Me By Your Name</em> is available to digitally purchase on <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FCall-Your-Name-Armie-Hammer%2Fdp%2FB0791VJLVB%2Fref%3Dsr_1_2%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686%26sr%3D1-2%26keywords%3Dcall%2Bme%2Bby%2Byour%2Bname" rel="nofollow noopener" target="_blank">Amazon,</a> <a href="https://www.youtube.com/watch?v=48o3YYnEUQ4">YouTube</a>, and <a href="https://play.google.com/store/movies/details?id=48o3YYnEUQ4">Google Play</a>.
+ </p>
+ <h3 id="h6Biwc">
+ 6) <em>Personal Shopper</em>
+ </h3>
+ <div id="NSQg2p">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/xC8AjoqpBAY?rel=0&amp;amp;start=15" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="pofJH9">
+ In her second collaboration with French director <a href="http://www.imdb.com/name/nm0000801/?ref_=fn_al_nm_1">Olivier Assayas</a>, Kristen Stewart plays a personal shopper to a wealthy socialite, with a sideline as an amateur ghost hunter who’s searching for her dead twin brother. <em>Personal Shopper</em> is deeper than it seems at first blush, a meditation on grief and an exploration of “between” places — on the fringes of wealth, and in the space between life and death. Some souls are linked in a way that can’t be shaken, and whether or not there’s an afterlife doesn’t change the fact that we see and sense them everywhere. (<em>Personal Shopper</em> also has one of the most tense extended scenes involving text messaging ever seen onscreen.)
+ </p>
+ <p id="8hmlTU">
+ Personal Shopper <em>is currently</em> <a href="https://www.showtime.com/#/movie/3436534"><em>streaming on Showtime</em></a> <em>and available to rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F871777" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=-BgiO6uDH7I"><em>YouTube</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB072YWLGT2%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fpersonal-shopper%2Fid1241184797" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>, and</em> <a href="https://play.google.com/store/movies/details?id=-BgiO6uDH7I"><em>Google Play</em></a><em>.</em>
+ </p>
+ <h3 id="0RkMKy">
+ 5) <em>Princess Cyd</em>
+ </h3>
+ <div id="7Tj1H6">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/sr64EJfnJwE?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="2tSIHW">
+ Stephen Cone is a master of small, carefully realized filmmaking; his earlier films such as <em>The Wise Kids</em> and <em>Henry Gamble’s Birthday Party</em> combine an unusual level of empathy for his characters with an unusual combination of interests: love, desire, sexual awakenings, and religion. <em>Princess Cyd</em> is his most accomplished film yet, about a young woman named Cyd (<a href="http://www.imdb.com/name/nm6570557/?ref_=tt_cl_t2">Jessie Pinnick</a>) who finds herself attracted to Katie (<a href="http://www.imdb.com/name/nm5154548/?ref_=tt_cl_t3">Malic White</a>), a barista, while visiting her Aunt Miranda (<a href="http://www.imdb.com/name/nm2050642/?ref_=tt_cl_t1">Rebecca Spence</a>, playing a character modeled on the author Marilynne Robinson) in Chicago. As she works through her own sexual awakening with Katie, Cyd unwinds some of the ways Miranda’s life has gotten too safe. They provoke each other while forming a bond and being prodded toward a bigger understanding of the world. It is a graceful and honest film, and it feels like a modest miracle.
+ </p>
+ <p id="HDD90m">
+ Princess Cyd <em>is currently</em> <a href="https://www.netflix.com/watch/80201497?source=35"><em>streaming on Netflix</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=sy8otjxDw8w"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=sy8otjxDw8w"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="ADtiAV">
+ 4) <a href="https://www.vox.com/culture/2017/2/24/14698632/get-out-review-jordan-peele"><em>Get Out</em></a>
+ </h3>
+ <div id="swjmhh">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/sRfnevzM9kQ?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="h1ighb">
+ Racism is sinister, frightening, and deadly. But <a href="https://www.vox.com/culture/2017/2/24/14698632/get-out-review-jordan-peele"><em>Get Out</em></a> (a stunning directorial debut from <em>Key &amp; Peele</em>'s Jordan Peele) isn’t about the blatantly, obviously scary kind of racism — burning crosses and lynchings and snarling hate. Instead, it’s interested in showing how the parts of racism that try to be aggressively unscary are just as horrifying, and it’s interested in making us feel that horror in a visceral, bodily way. In the tradition of the best classic social thrillers, <em>Get Out</em> takes a topic that is often approached cerebrally — casual racism — and turns it into something you feel in your tummy. And it does it with a wicked sense of humor.
+ </p>
+ <p id="2ef6GU">
+ Get Out <em>is currently streaming on</em> <a href="https://play.hbogo.com/feature/urn:hbo:feature:GWbhJDwNIacPCwgEAAAG5?camp=Search&amp;play=true"><em>HBO Go</em></a> <em>and</em> <a href="https://play.hbonow.com/feature/urn:hbo:feature:GWbhJDwNIacPCwgEAAAG5?camp=Search&amp;play=true"><em>HBO Now</em></a><em>, and is available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fitunes.apple.com%2Fus%2Fmovie%2Fget-out%2Fid1202441786" rel="nofollow noopener" target="_blank"><em>iTunes</em></a><em>,</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fvideo%2Fdetail%2FB06Y1H48K7%2Fref%3Datv_dl_rdr" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=YfLSryEaAfw"><em>Google Play</em></a><em>,</em> <a href="https://www.youtube.com/watch?v=YfLSryEaAfw"><em>YouTube</em></a><em>, and</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.vudu.com%2Fcontent%2Fmovies%2F%23%21content%2F832496%2FGet-Out" rel="nofollow noopener" target="_blank"><em>Vudu</em></a><em>.</em>
+ </p>
+ <h3 id="TQbjNr">
+ 3) <em>The Work</em>
+ </h3>
+ <div id="GYqgVe">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/h8OVXG2GhpQ?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="3Uotb3">
+ <em>The Work</em> is an outstanding, astonishing accomplishment and a viewing experience that will leave you shaken (but in a good way). At Folsom Prison in California, incarcerated men regularly participate in group therapy, and each year other men from the “outside” apply to participate in an intense four-day period of group therapy alongside Folsom’s inmates. <em>The Work</em> spends almost all of its time inside the room where that therapy happens, observing the strong, visceral, and sometimes violent emotions the men feel as they expose the hurt and raw nerves that have shaped how they encounter the world. Watching is not always easy, but by letting us peek in, the film invites viewers to become part of the experience — as if we, too, are being asked to let go.
+ </p>
+ <p id="qjxiQW">
+ The Work <em>is</em> <a href="https://www.topic.com/the-work"><em>streaming on Topic.com</em></a> <em>and available to digitally rent on</em> <a href="https://play.google.com/store/movies/details?id=iddt4sVZTvI"><em>Google Play</em></a> <em>and</em> <a href="https://www.youtube.com/watch?v=iddt4sVZTvI"><em>YouTube</em></a><em>.</em>
+ </p>
+ <h3 id="kUrRP6">
+ 2) <em>Ex Libris</em>
+ </h3>
+ <div id="Lb1IzW">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/YzKrlOFZBD8?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="rGpjUU">
+ Frederick Wiseman is one of the towering giants of nonfiction film, a keen observer of American institutions — ranging from prisons to dance companies to welfare offices — for the past half-century. <em>Ex Libris</em> is his mesmerizing look at the New York Public Library and the many functions it fills, which go far beyond housing books. Wiseman works in the observational mode, which means his films contain no captions, dates, or talking-head interviews: We just see what his camera captured, which in this case includes community meetings, benefit dinners, after-school programs, readings with authors and scholars (including Richard Dawkins and Ta-Nehisi Coates), and NYPL patrons going about their business in the library’s branches all over the city. The result is almost hypnotic and, perhaps surprisingly, deeply moving. It makes a case for having faith in the public institutions where ordinary people work — away from the limelight, without trying to score political points — in order to make our communities truly better.
+ </p>
+ <p id="40B8Wq">
+ Ex Libris <em>will air on PBS in the fall and then be available to cardholders in many library systems across the country via</em> <a href="https://www.kanopy.com/"><em>Kanopy</em></a><em>.</em>
+ </p>
+ <h3 id="QJNuyl">
+ 1) <a href="https://www.vox.com/2017/11/2/16552860/lady-bird-review-saoirse-ronan-greta-gerwig"><em>Lady Bird</em></a>
+ </h3>
+ <div id="mgxqrA">
+ <div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;">
+ <iframe src="https://www.youtube.com/embed/cNi_HC839Wo?rel=0&amp;" style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;" allowfullscreen="allowfullscreen" scrolling="no"></iframe>
+ </div>
+ </div>
+ <p id="z8uM1l">
+ <em>Lady Bird</em> topped my list almost instantly, and only rose in my estimation on repeated viewings. For many who saw it (including me), it felt like a movie made not just for but <em>about</em> me. <em>Lady Bird</em> is a masterful, exquisite coming-of-age comedy starring the great Saoirse Ronan as Christine — or “Lady Bird,” as she’s re-christened herself — and it’s as funny, smart, and filled with yearning as its heroine. Writer-director Greta Gerwig made the film as an act of love, not just toward her hometown of Sacramento but also toward girlhood, and toward the feeling of always being on the outside of wherever real life is happening. <em>Lady Bird</em> is the rare movie that manages to be affectionate, entertaining, hilarious, witty, and confident. And one line from it struck me as the guiding principle of many of the year’s best films: “Don’t you think they are the same thing? Love, and attention?”
+ </p>
+ <p id="jqSCLV">
+ Lady Bird <em>is currently streaming on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FLady-Bird-Saoirse-Ronan%2Fdp%2FB07734STRN%2Fref%3Dsr_1_3%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686" rel="nofollow noopener" target="_blank"><em>Amazon Prime</em></a> <em>and available to digitally rent on</em> <a href="https://go.redirectingat.com?id=66960X1516588&amp;xs=1&amp;url=https%3A%2F%2Fwww.amazon.com%2FLady-Bird-Saoirse-Ronan%2Fdp%2FB07734STRN%2Fref%3Dsr_1_3%3Fs%3Dinstant-video%26ie%3DUTF8%26qid%3D1532455686" rel="nofollow noopener" target="_blank"><em>Amazon</em></a><em>,</em> <a href="https://play.google.com/store/movies/details?id=yBIPcwJ03V4"><em>Google Play</em></a><em>, and</em> <a href="https://www.youtube.com/watch?v=yBIPcwJ03V4"><em>YouTube</em></a><em>.</em>
+ </p>
+ <p id="EVymKt">
+ <strong>Honorable mentions:</strong> <em>Marjorie Prime</em>, <em>Phantom Thread</em>, <a href="https://www.vox.com/culture/2017/4/28/15437008/casting-jonbenet-kitty-green-interview-netflix"><em>Casting JonBenet</em></a>, <a href="https://www.vox.com/2017/12/6/16682926/the-post-review-spieberg-streep-hanks-pentagon-nixon"><em>The Post</em></a>, <a href="https://www.vox.com/culture/2017/9/12/16288080/shape-of-water-del-toro-review-tiff"><em>The Shape of Water</em></a>, <a href="https://www.vox.com/summer-movies/2017/8/17/16150634/logan-lucky-review-soderbergh-tatum-driver-craig"><em>Logan Lucky</em></a>, <a href="https://www.vox.com/culture/2017/9/14/16301552/i-tonya-harding-kerrigan-review-tiff"><em>I, Tonya</em></a>, <a href="https://www.vox.com/culture/2017/4/13/15243584/lost-city-of-z-review-james-gray-charlie-hunnam-robert-pattinson"><em>The Lost City of Z</em></a>, <em>Graduation</em>, <em>Spettacolo</em>, <em>Loveless</em>, <em>Restless Creature: Wendy Whelan</em>, <em>In Transit</em>, <a href="https://www.vox.com/culture/2017/6/29/15844952/reagan-show-review"><em>The Reagan Show</em></a>
+ </p>
+ </div>
+ <div class="u-hidden-text" id="formatter-datter" data-cid="site/entry_formatter-1551450311_5805_109878" data-cdata="{&quot;svg_hr_illustration&quot;:&quot;&quot;}"></div>
+ <section class="c-nextclick">
+ <div class="c-related-list" data-cid="site/related_list-1551450312_8083_109879" data-cdata="{}">
+ <h2 class="c-related-list__head">
+ Next Up In <a href="https://www.vox.com/culture" class="c-related-list__group-name"><span>Culture</span></a>
+ </h2>
+ <ul>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="I have always been a True Detective skeptic. Season 3 made a believer." href="https://www.vox.com/culture/2019/3/1/18243121/true-detective-season-3-finale-recap-review">I have always been a True Detective skeptic. Season 3 made a believer.</a>
+ </li>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="Captain Marvel hits theaters on March 8, 2019" href="https://www.vox.com/2019/2/28/18243513/captain-marvel-brie-larson-carol-danvers-news-updates">Captain Marvel hits theaters on March 8, 2019</a>
+ </li>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="The 5 best TV debuts of February 2019" href="https://www.vox.com/culture/2019/2/28/18243599/best-tv-february-russian-doll-pen15-one-day-at-a-time">The 5 best TV debuts of February 2019</a>
+ </li>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="How face tattoos turn unknown teens into internet stars" href="https://www.vox.com/the-goods/2019/2/28/18243480/face-tattoos-soundcloud-rap-youtube-justin-bieber">How face tattoos turn unknown teens into internet stars</a>
+ </li>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="Leaving Neverland makes a devastating case against Michael Jackson" href="https://www.vox.com/culture/2019/2/27/18241432/leaving-neverland-review-michael-jackson-hbo-safechuck-robson">Leaving Neverland makes a devastating case against Michael Jackson</a>
+ </li>
+ <li>
+ <a data-analytics-link="nextclicks" data-analytics-viewport="nextclicks" data-vars-analytics-link-title="The Masked Singer is one of TV’s oddest shows. Here’s how it was made." href="https://www.vox.com/culture/2019/2/27/18241269/masked-singer-interview-finale-recap-preview">The Masked Singer is one of TV’s oddest shows. Here’s how it was made.</a>
+ </li>
+ <div data-cid="site/entry_sponsorship/native_ad-zuIS/VvNjWwhJTgtGIpuyA==">
+ <div class="m-native_ad_unit dynamic-native-ad-native_ad_linkset_link"></div>
+ </div>
+ </ul>
+ </div>
+ </section>
+ </div>
+ <div class="l-col__sidebar" data-analytics-placement="sidebar">
+ <div class="u-desktop-only">
+ <aside class="c-rock-list c-rock-list--image c-rock-list--trending" id="rock-">
+ <h3 class="p-rock-head c-rock-list__title">
+ <span class="c-rock-list__title-wrapper"><span class="c-rock-list__title-text">Most Read</span></span>
+ </h3>
+ <div class="c-rock-list__body">
+ <ol class="c-rock-list__items">
+ <li data-analytics-placement="sidebar:1">
+ <a href="https://www.vox.com/world/2019/2/28/18244874/trump-north-korea-summit-kim-jong-un-sanctions" class="c-rock-list__link" data-analytics-link="trending" data-analytics-viewport="trending" data-chorus-optimize-id="18008915" data-chorus-optimize-module="entry-list">
+ <div class="c-rock-list__image">
+ <picture class="c-picture" data-chorus-optimize-field="main_image" data-cid="site/picture_element-1551450312_4906_109881" data-cdata="{&quot;image_id&quot;:63147211,&quot;ratio&quot;:&quot;standard&quot;,&quot;dynamic_type&quot;:&quot;picture&quot;,&quot;lazy&quot;:true}">
+ <script type="text/template-picture" style="display: none;">
+ <![CDATA[
+
+
+
+
+ <source
+ srcset="https://cdn.vox-cdn.com/thumbor/ENoVUrKI5X0Fk3PahkN--cr5KEA=/0x0:1671x1065/250x188/filters:focal(312x284:578x550):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/21MY5RHwhN_S8dDAfqmc8IVlY5o=/0x0:1671x1065/500x375/filters:focal(312x284:578x550):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg 500w"
+ sizes="250px"
+ type="image/webp"
+ >
+
+
+ <img srcset="https://cdn.vox-cdn.com/thumbor/MXRg_vFgBk_4xPXkijJAVy1p6Y8=/0x0:1671x1065/250x188/filters:focal(312x284:578x550)/cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/Ritqzfzn_9eZUAnBywIOlIVL2UM=/0x0:1671x1065/500x375/filters:focal(312x284:578x550)/cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg 500w" sizes="250px" alt="" style="object-position: 26% 39%" data-upload-width="1671" src="https://cdn.vox-cdn.com/thumbor/ha469LK2mm7dB98rx9B-kyHTtlQ=/0x0:1671x1065/1200x900/filters:focal(312x284:578x550)/cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg" />
+
+ ]]>
+ </script>
+ <script type="text/template-dynamic" style="display: none">
+ <![CDATA[
+
+
+ <img class="c-dynamic-image " alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_3115_109880" data-cdata='{"image_id":63147211,"ratio":"standard"}'>
+ <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63147211/1128043327.jpg.0.jpg"></noscript>
+
+ ]]>
+ </script></picture>
+ </div><span class="c-rock-list__item--body"><span data-chorus-optimize-field="hed">North Korea contradicts Trump on the reason a summit deal fell apart</span> <span class="c-rock-list__entry-blurb">Trump said North Korea wanted all sanctions lifted. Pyongyang says that’s not quite what it wanted — but it still had a big ask.</span></span></a>
+ </li>
+ <li data-analytics-placement="sidebar:2">
+ <a href="https://www.vox.com/the-goods/2019/2/28/18244996/tiktok-children-privacy-data-ftc-settlement" class="c-rock-list__link" data-analytics-link="trending" data-analytics-viewport="trending" data-chorus-optimize-id="18009037" data-chorus-optimize-module="entry-list">
+ <div class="c-rock-list__image">
+ <picture class="c-picture" data-chorus-optimize-field="main_image" data-cid="site/picture_element-1551450312_5607_109883" data-cdata="{&quot;image_id&quot;:63146546,&quot;ratio&quot;:&quot;standard&quot;,&quot;dynamic_type&quot;:&quot;picture&quot;,&quot;lazy&quot;:true}">
+ <script type="text/template-picture" style="display: none;">
+ <![CDATA[
+
+
+
+
+ <source
+ srcset="https://cdn.vox-cdn.com/thumbor/kPAYmuWtuYOLLfddx__DHdtElD0=/0x0:3045x2000/250x188/filters:focal(996x780:1482x1266):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/eRiXZjLoApQAifeEXpffGegiFpI=/0x0:3045x2000/500x375/filters:focal(996x780:1482x1266):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg 500w"
+ sizes="250px"
+ type="image/webp"
+ >
+
+
+ <img srcset="https://cdn.vox-cdn.com/thumbor/ykKujJmTBMrtwyck12Blb8M1hEc=/0x0:3045x2000/250x188/filters:focal(996x780:1482x1266)/cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/wNqU2CyFT-CUKMFs8kGVDZR3Kjo=/0x0:3045x2000/500x375/filters:focal(996x780:1482x1266)/cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg 500w" sizes="250px" alt="" style="object-position: 40% 51%" data-upload-width="3045" src="https://cdn.vox-cdn.com/thumbor/n98GqNFShyig8DEhcuHQSndxQ7U=/0x0:3045x2000/1200x900/filters:focal(996x780:1482x1266)/cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg" />
+
+ ]]>
+ </script>
+ <script type="text/template-dynamic" style="display: none">
+ <![CDATA[
+
+
+ <img class="c-dynamic-image " alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_7653_109882" data-cdata='{"image_id":63146546,"ratio":"standard"}'>
+ <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63146546/GettyImages_1058608380.0.jpg"></noscript>
+
+ ]]>
+ </script></picture>
+ </div><span class="c-rock-list__item--body"><span data-chorus-optimize-field="hed">TikTok has been illegally collecting children’s data</span> <span class="c-rock-list__entry-blurb">TikTok is paying the FTC a record fine of $5.7 million for collecting the data of kids under 13.</span></span></a>
+ </li>
+ <li data-analytics-placement="sidebar:3">
+ <a href="https://www.vox.com/policy-and-politics/2019/2/28/18244677/alexandria-ocasio-cortez-michael-cohen-testimony-tax-returns" class="c-rock-list__link" data-analytics-link="trending" data-analytics-viewport="trending" data-chorus-optimize-id="18008718" data-chorus-optimize-module="entry-list">
+ <div class="c-rock-list__image">
+ <picture class="c-picture" data-chorus-optimize-field="main_image" data-cid="site/picture_element-1551450312_2340_109885" data-cdata="{&quot;image_id&quot;:63145492,&quot;ratio&quot;:&quot;standard&quot;,&quot;dynamic_type&quot;:&quot;picture&quot;,&quot;lazy&quot;:true}">
+ <script type="text/template-picture" style="display: none;">
+ <![CDATA[
+
+
+
+
+ <source
+ srcset="https://cdn.vox-cdn.com/thumbor/4SGZBjAUMHw3DSklg1bmL2z49RA=/0x0:5472x3648/250x188/filters:focal(1350x1084:2224x1958):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/sizqc89NV4OhAKFd8JpyfbgQwwY=/0x0:5472x3648/500x375/filters:focal(1350x1084:2224x1958):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg 500w"
+ sizes="250px"
+ type="image/webp"
+ >
+
+
+ <img srcset="https://cdn.vox-cdn.com/thumbor/mjnSDoG8dT8yAxRMSAmogp-I09s=/0x0:5472x3648/250x188/filters:focal(1350x1084:2224x1958)/cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/ukLWFDZ4zR-pSR1CLnv2MI8b1Hg=/0x0:5472x3648/500x375/filters:focal(1350x1084:2224x1958)/cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg 500w" sizes="250px" alt="" style="object-position: 32% 41%" data-upload-width="5472" src="https://cdn.vox-cdn.com/thumbor/_svmCTZK-rfxLF-oNBCOXU8fpQQ=/0x0:5472x3648/1200x900/filters:focal(1350x1084:2224x1958)/cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg" />
+
+ ]]>
+ </script>
+ <script type="text/template-dynamic" style="display: none">
+ <![CDATA[
+
+
+ <img class="c-dynamic-image " alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_6930_109884" data-cdata='{"image_id":63145492,"ratio":"standard"}'>
+ <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63145492/1127850147.jpg.0.jpg"></noscript>
+
+ ]]>
+ </script></picture>
+ </div><span class="c-rock-list__item--body"><span data-chorus-optimize-field="hed">Why the answers Michael Cohen gave to Alexandria Ocasio-Cortez’s questions mattered</span> <span class="c-rock-list__entry-blurb">AOC got Cohen to name names — and help build a case for getting Trump’s tax returns.</span></span></a>
+ </li>
+ <li data-analytics-placement="sidebar:4">
+ <a href="https://www.vox.com/culture/2019/2/27/18241432/leaving-neverland-review-michael-jackson-hbo-safechuck-robson" class="c-rock-list__link" data-analytics-link="trending" data-analytics-viewport="trending" data-chorus-optimize-id="18005473" data-chorus-optimize-module="entry-list">
+ <div class="c-rock-list__image">
+ <picture class="c-picture" data-chorus-optimize-field="main_image" data-cid="site/picture_element-1551450312_9172_109887" data-cdata="{&quot;image_id&quot;:63138269,&quot;ratio&quot;:&quot;standard&quot;,&quot;dynamic_type&quot;:&quot;picture&quot;,&quot;lazy&quot;:true}">
+ <script type="text/template-picture" style="display: none;">
+ <![CDATA[
+
+
+
+
+ <source
+ srcset="https://cdn.vox-cdn.com/thumbor/R6F7-XNG2jfQfNdGdDYF39JgaHk=/0x0:1920x1080/250x188/filters:focal(727x100:1033x406):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/wKhFDWTO9JmAUnyVuqFAMxna6xE=/0x0:1920x1080/500x375/filters:focal(727x100:1033x406):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg 500w"
+ sizes="250px"
+ type="image/webp"
+ >
+
+
+ <img srcset="https://cdn.vox-cdn.com/thumbor/5sq1aQzafRYgjxW8ovMRs5fNap4=/0x0:1920x1080/250x188/filters:focal(727x100:1033x406)/cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/6wHou6Pw2KXE4KySJrghvxM28sI=/0x0:1920x1080/500x375/filters:focal(727x100:1033x406)/cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg 500w" sizes="250px" alt="" style="object-position: 45% 23%" data-upload-width="1920" src="https://cdn.vox-cdn.com/thumbor/pXmgbg1MtWYq2t5bsNoovGFUApw=/0x0:1920x1080/1200x900/filters:focal(727x100:1033x406)/cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg" />
+
+ ]]>
+ </script>
+ <script type="text/template-dynamic" style="display: none">
+ <![CDATA[
+
+
+ <img class="c-dynamic-image " alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_1856_109886" data-cdata='{"image_id":63138269,"ratio":"standard"}'>
+ <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63138269/neverland2.0.jpg"></noscript>
+
+ ]]>
+ </script></picture>
+ </div><span class="c-rock-list__item--body"><span data-chorus-optimize-field="hed">Leaving Neverland makes a devastating case against Michael Jackson</span> <span class="c-rock-list__entry-blurb">The HBO documentary may forever change the legacy of the pop icon.</span></span></a>
+ </li>
+ <li data-analytics-placement="sidebar:5">
+ <a href="https://www.vox.com/policy-and-politics/2019/2/28/18245334/jared-kushner-clearance-trump-mueller" class="c-rock-list__link" data-analytics-link="trending" data-analytics-viewport="trending" data-chorus-optimize-id="18009375" data-chorus-optimize-module="entry-list">
+ <div class="c-rock-list__image">
+ <picture class="c-picture" data-chorus-optimize-field="main_image" data-cid="site/picture_element-1551450312_5418_109889" data-cdata="{&quot;image_id&quot;:63148042,&quot;ratio&quot;:&quot;standard&quot;,&quot;dynamic_type&quot;:&quot;picture&quot;,&quot;lazy&quot;:true}">
+ <script type="text/template-picture" style="display: none;">
+ <![CDATA[
+
+
+
+
+ <source
+ srcset="https://cdn.vox-cdn.com/thumbor/KchmnOS96Tb7U8afvKnAZLog1OE=/0x0:4886x3257/250x188/filters:focal(1197x977:1977x1757):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/Dzdo4OcR9Odvvw06dm2XScWtv5w=/0x0:4886x3257/500x375/filters:focal(1197x977:1977x1757):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg 500w"
+ sizes="250px"
+ type="image/webp"
+ >
+
+
+ <img srcset="https://cdn.vox-cdn.com/thumbor/1tFO3qttpCYK6arCXuUj13GXBpY=/0x0:4886x3257/250x188/filters:focal(1197x977:1977x1757)/cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg 250w, https://cdn.vox-cdn.com/thumbor/AEg61YKp1GDVAmb3dU7LX1S37u8=/0x0:4886x3257/500x375/filters:focal(1197x977:1977x1757)/cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg 500w" sizes="250px" alt="" style="object-position: 32% 41%" data-upload-width="4886" src="https://cdn.vox-cdn.com/thumbor/p-AobimwHqY_T2GWGO81mLOZvXQ=/0x0:4886x3257/1200x900/filters:focal(1197x977:1977x1757)/cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg" />
+
+ ]]>
+ </script>
+ <script type="text/template-dynamic" style="display: none">
+ <![CDATA[
+
+
+ <img class="c-dynamic-image " alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_8533_109888" data-cdata='{"image_id":63148042,"ratio":"standard"}'>
+ <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63148042/GettyImages_822521748.0.jpg"></noscript>
+
+ ]]>
+ </script></picture>
+ </div><span class="c-rock-list__item--body"><span data-chorus-optimize-field="hed">Trump reportedly ordered Jared Kushner get a security clearance over multiple objections</span> <span class="c-rock-list__entry-blurb">The New York Times reports that John Kelly and Don McGahn both documented their concerns in memos.</span></span></a>
+ </li>
+ </ol>
+ <div data-cid="site/entry_sponsorship/native_ad-96FwghPeMAxXH35ohlVtFQ==">
+ <div class="m-native_ad_unit dynamic-native-ad-native_ad_latest"></div>
+ </div>
+ </div>
+ </aside>
+ <script type="text/javascript">
+ //<![CDATA[
+ concertAdsQueue.push(function() {ConcertAds.addVariable("trending_sidebar", ["true"])});
+ //]]>
+ </script>
+ </div>
+ <div class="u-desktop-only">
+ <div class="c-newsletter_signup_box" id="newsletter-signup-short-form" data-newsletter-slug="vox_sentences">
+ <div class="c-newsletter_signup_box__main">
+ <span class="c-newsletter_signup_box__icon"><svg width="386px" height="385px" viewbox="0 0 386 385" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>
+ vox-mark
+ </title>
+ <defs></defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <path d="M239.811,0 L238.424,6 L259.374,6 C278.011,6 292.908,17.38 292.908,43.002 C292.908,56.967 287.784,75.469 276.598,96.888 L182.689,305.687 L159.283,35.693 C159.283,13.809 168.134,6 191.88,6 L205.854,6 L207.247,0 L1.409,0 L0,6 L13.049,6 C28.88,6 35.863,15.885 37.264,34.514 L73.611,385 L160.221,385 L304.525,79.217 C328.749,31.719 349.237,6 372.525,6 L384.162,6 L385.557,0 L239.811,0" id="vox-mark" fill="#444745"></path>
+ </g></svg></span>
+ <h3 class="c-newsletter_signup_box__title">
+ Vox Sentences
+ </h3>
+ <p class="c-newsletter_signup_box__blurb">
+ The news, but shorter, delivered straight to your inbox.
+ </p>
+ <form action="https://voxmedia.createsend.com/t/d/s/uuijkl/" method="post" id="subForm" class="c-newsletter_signup_box--form &lt;%= c-newsletter_signup_box--form__1" data-analytics-class="newsletter" data-analytics-placement="sidebar" name="subForm">
+ <div class="c-newsletter_signup_box--form__body">
+ <label for="field_email"><input id="field_email" class="p-text-input" name="email" placeholder="Email Address" type="email" /></label> <button type="submit" class="p-button">Subscribe</button>
+ </div>
+ </form>
+ </div>
+ <div class="c-newsletter_signup_box__disclaimer">
+ By signing up, you agree to our <a href="https://www.voxmedia.com/pages/privacy-policy">Privacy Policy</a> and European users agree to the data transfer policy. For more newsletters, check out our <a href="https://www.vox.com/newsletters">newsletters page</a>.
+ </div>
+ </div>
+ </div>
+ <div id="sidebar-debugger-data" class="u-hidden-text">
+ This Article has a component height of 131. The sidebar size is long.
+ </div>
+ </div>
+ </div>
+ <div class="l-segment">
+ <div class="OUTBRAIN" data-src="https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch" data-widget-id="AR_2" data-ob-template="Vox.com"></div>
+ <script type="text/javascript" charset="utf-8">
+ //<![CDATA[
+ (function(){
+ // load outbrain js
+ function loadOutbrain(){
+ var ref = document.querySelector("div.OUTBRAIN");
+
+ var script = document.createElement('script');
+ script.setAttribute('type','text/javascript');
+ script.setAttribute('src', 'https://widgets.outbrain.com/outbrain.js');
+ script.setAttribute('async', 'async');
+
+ ref.appendChild(script);
+ }
+
+ // Disable on mobile and tablet screens
+ // 880px is the upper bound for the `medium` breakpoint defined in UserAgent JS lib.
+ var shouldDisable = false && screen.width <= 880;
+
+ if (!shouldDisable) {
+ // first, set a timeout to loadOutbrain, in case no ads load in 5s
+ // (i.e., blocked). once an ad has loaded, create a new timeout that
+ // will load outbrain if openmic doesn't get loaded in 2s
+ //
+ var adBlockerTimeoutId = setTimeout(loadOutbrain, 5000);
+ document.body.addEventListener('first_ad_rendered', function(){
+ clearTimeout(adBlockerTimeoutId);
+ var outbrainTimeoutId = setTimeout(loadOutbrain, 2000);
+ document.body.addEventListener('playlistRendered', function(){
+ clearTimeout(outbrainTimeoutId);
+ });
+ });
+ }
+ })();
+ //]]>
+ </script>
+ </div>
+ <div class="l-sidebar-fixed l-segment">
+ <div class="l-col__main">
+ <div class="c-compact-river">
+ <h2 class="p-breaker-head">
+ <span class="p-breaker-head__wrapper">The Latest</span>
+ </h2>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="18007162" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/culture/2019/3/1/18243121/true-detective-season-3-finale-recap-review" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_5005_109890" data-cdata="{&quot;image_id&quot;:63147493,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63147493/977e098a78e99ec5d862748155c99425dd2109bb9cfc46a2e531e45d389c978c.0.jpg" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/culture/2019/3/1/18243121/true-detective-season-3-finale-recap-review">I have always been a True Detective skeptic. Season 3 made a believer.</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_1408_109892" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/authors/todd-vanderwerff">Todd VanDerWerff</a></span> <a data-entry-admin="18007162" data-cid="tools/entry_admin_button-1551450312_6812_109891" data-cdata="{&quot;id&quot;:18007162}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="18005733" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/2019/3/1/18241692/undocumented-immigrants-pay-state-local-taxes" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_8116_109893" data-cdata="{&quot;image_id&quot;:63147587,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63147587/GettyImages_641694866.0.jpg" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/2019/3/1/18241692/undocumented-immigrants-pay-state-local-taxes">Undocumented immigrants pay millions of dollars in state taxes — even in the reddest states</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_4973_109895" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/authors/alexia-fernandez-campbell">Alexia Fernández Campbell</a></span> <a data-entry-admin="18005733" data-cid="tools/entry_admin_button-1551450312_4209_109894" data-cdata="{&quot;id&quot;:18005733}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="18008247" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/energy-and-environment/2019/3/1/18244206/jay-inslee-2020-campaign-president-climate-change-interview" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_8715_109896" data-cdata="{&quot;image_id&quot;:63150911,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63150911/932014976.jpg.0.jpg" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/energy-and-environment/2019/3/1/18244206/jay-inslee-2020-campaign-president-climate-change-interview">Meet the first Democrat running for president on climate change</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_8538_109898" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/authors/david-roberts">David Roberts</a></span> <a data-entry-admin="18008247" data-cid="tools/entry_admin_button-1551450312_4926_109897" data-cdata="{&quot;id&quot;:18008247}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="18005633" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/the-goods/2019/3/1/18241592/gradients-facebook-coachella-daily-fading-pastel-design-trend" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_1126_109899" data-cdata="{&quot;image_id&quot;:63138163,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63138163/Gradients_05.1551300684.png" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/the-goods/2019/3/1/18241592/gradients-facebook-coachella-daily-fading-pastel-design-trend">The colorful design trend aiming to soothe these anxious times</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_7168_109901" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/users/Daisy%20Alioto">Daisy Alioto</a></span> <a data-entry-admin="18005633" data-cid="tools/entry_admin_button-1551450312_762_109900" data-cdata="{&quot;id&quot;:18005633}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="17986741" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/2019/3/1/18222700/jay-inslee-2020-campaign-president-climate-change" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_1535_109902" data-cdata="{&quot;image_id&quot;:63149565,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63149565/AP_19012706159131_t.0.jpg" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/2019/3/1/18222700/jay-inslee-2020-campaign-president-climate-change">Jay Inslee just launched a presidential campaign that will be all about climate change</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_9395_109904" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/authors/ella-nilsen">Ella Nilsen</a></span> <a data-entry-admin="17986741" data-cid="tools/entry_admin_button-1551450312_2496_109903" data-cdata="{&quot;id&quot;:17986741}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="c-compact-river__entry">
+ <div class="c-entry-box--compact c-entry-box--compact--article" data-chorus-optimize-id="18009377" data-chorus-optimize-module="entry-box">
+ <a href="https://www.vox.com/vox-sentences/2019/2/28/18245336/vox-sentences-trump-kim-summit-no-deal" class="c-entry-box--compact__image-wrapper" data-analytics-link="article:image">
+ <div class="c-entry-box--compact__image">
+ <img class="c-dynamic-image" alt="" data-chorus-optimize-field="main_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs" data-cid="site/dynamic_size_image-1551450312_6781_109905" data-cdata="{&quot;image_id&quot;:63148041,&quot;ratio&quot;:&quot;*&quot;}" /> <noscript><img alt="" src="https://cdn.vox-cdn.com/uploads/chorus_image/image/63148041/2.28.0.jpg" /></noscript>
+ </div></a>
+ <div class="c-entry-box--compact__body">
+ <h2 class="c-entry-box--compact__title">
+ <a data-chorus-optimize-field="hed" data-analytics-link="article" href="https://www.vox.com/vox-sentences/2019/2/28/18245336/vox-sentences-trump-kim-summit-no-deal">Vox Sentences: Trump gets nothing</a>
+ </h2>
+ <div class="c-byline" data-cid="site/byline-1551450312_4919_109907" data-cdata="{&quot;timestamp&quot;:null}">
+ By <span class="c-byline__item"><a href="https://www.vox.com/users/NicoleFallert">Nicole Fallert</a></span> <a data-entry-admin="18009377" data-cid="tools/entry_admin_button-1551450312_395_109906" data-cdata="{&quot;id&quot;:18009377}"></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div data-cid="site/entry_sponsorship/native_ad-dkySUYQ8YppIKwcBGKtnmg==">
+ <div class="m-native_ad_unit dynamic-native-ad-native_ad_ymal_link"></div>
+ </div>
+ </div>
+ </div>
+ <div class="l-col__sidebar" id="comments-sidebar" data-analytics-placement="sidebar"></div>
+ </div>
+ </section>
+ </section>
+ <footer class="c-footer" role="contentinfo">
+ <div class="l-wrapper c-footer__wrapper">
+ <div class="c-footer__section c-footer__section-logo">
+ <a rel="nofollow" href="/" class="c-footer__logo-link"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 242 121">
+ <path fill="#444745" d="M110.674 3.528h3.474L114.564 2H71.63l-.418 1.528h6.253c5.418 0 9.726 3.75 9.726 11.255 0 4.168-1.8 9.587-4.72 16.118L54.82 92.32l-6.81-79.756c-.556-6.252 2.5-9.03 9.59-9.03h4.027L62.042 2H1.6l-.557 1.528h3.89c4.725 0 6.532 2.918 7.087 8.615l10.7 103.1h25.427l42.518-90.038c6.392-13.48 13.2-21.677 20.01-21.677zm-5.002 112.27c-3.89 0-6.253-1.25-6.253-7.642 0-8.06 2.91-23.76 6.11-38.072.41 6.67 5 13.2 11.81 13.2 1.67 0 3.06-.138 4.44-.417-6.26 27.236-8.76 32.932-16.12 32.932zm121.024-54.19c8.06 0 13.2-6.67 13.2-14.173 0-6.392-4.585-11.116-11.115-11.116-11.81 0-17.36 9.31-27.09 26.53-2.08-10.7-6.94-24.73-19.45-24.73-14.03 0-30.15 20.01-45.02 32.37-6.67 5.56-14.17 9.17-20.15 9.17-6.11 0-9.72-6.26-9.72-17.23 4.31-17.93 6.67-22.65 13.34-22.65 4.59 0 6.53 2.64 6.53 8.06 0 5.69-1.25 15.42-3.75 27.51 6.67-2.09 16.68-10.42 25.01-19.45-4.44-10.56-13.89-17.79-27.65-17.79-25.42 0-47.66 22.78-47.66 48.35 0 17.65 12.51 30.984 32.1 30.984 32.38 0 45.86-28.066 45.86-47.52 0-2.78-.14-4.86-.42-7.364C155.717 57.14 162.108 52 167.388 52c5.975 0 10.7 15.007 15.423 37.657-4.17 4.58-8.34 13.474-10.42 15.002-.836-8.06-6.115-13.06-13.2-13.06-7.92 0-13.48 7.5-13.48 13.893 0 7.226 5 11.95 11.53 11.95 13.76 0 17.65-13.062 26.265-24.595 2.64 12.363 8.754 24.59 19.313 24.59 12.506 0 24.178-10.7 30.15-18.34l-1.11-1.81c-3.89 3.753-7.642 6.254-11.95 6.254-7.78 0-13.34-16.81-17.645-37.1 2.5-3.47 6.53-12.225 9.31-15.28 1.95 3.612 5.978 10.42 15.15 10.42z"></path></svg> <span class="u-hidden-text">Chorus</span></a>
+ </div>
+ <div class="c-footer__section c-footer__section-links">
+ <ul class="u-list-dot-sep">
+ <li>
+ <a rel="nofollow" href="https://www.voxmedia.com/legal/terms-of-use">Terms of Use</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.voxmedia.com/legal/privacy-policy">Privacy Policy</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.voxmedia.com/legal/cookie-policy">Cookie Policy</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.voxmedia.com/legal/gdpr-commitment">GDPR Commitment</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.voxmedia.com/communications-preferences">Communications Preferences</a>
+ </li>
+ </ul>
+ <ul class="u-list-dot-sep">
+ <li>
+ <a rel="nofollow" href="/contact">Contact</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="/contact#tip">Send Us a Tip</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="/masthead">Masthead</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="/pages/about-us">About Us</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.vox.com/2018/12/7/18113237/ethics-and-guidelines-at-vox-com">Editorial Ethics and Guidelines</a>
+ </li>
+ </ul>
+ <div class="c-footer__status">
+ <span id="status_io" class="m-footer__bottom__status">All Systems Operational <a href="http://status.voxmedia.com" rel="nofollow" target="_blank">Check out our status page for more details.</a></span>
+ </div>
+ </div>
+ <div class="c-footer__section c-footer__section-vox">
+ <a rel="nofollow" class="u-block" href="http://www.voxmedia.com"><span class="u-hidden-text">Vox Media</span><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewbox="-147 464.2 484 79.5" class="c-footer__vox-logo">
+ <g>
+ <path fill="#4E4E50" class="vox-media-logo-text" d="M-133.2 498l9.9 29 6.4-19.2c1.1-3.3 2.1-6.6 3-9.4h13.3l-13.2 32.4c-2.1 5.3-3.4 8.4-4.6 12l-10 .6-13.2-32c-1.6-4-3.6-9-5.4-12.9l13.8-.5zm38.8 23.6c0-14 9.3-24.4 23.2-24.4 13.3 0 22.1 9.8 22.1 22.1 0 14-9.4 24.4-23.2 24.4-13.4.1-22.1-9.8-22.1-22.1zm33-.9c0-8.4-4.3-13.6-10.3-13.6-6.4 0-10.5 6-10.5 13.2 0 8.4 4.3 13.6 10.3 13.6 6.4 0 10.5-6 10.5-13.2zm19.2 21.9l15.3-22.7-6-8.8-8.6-12.7 13.9-.5 9.1 14.2 3.1-5.3c1.6-2.6 3.8-6.1 5.4-8.6H3.7l-14.6 21.9 5.4 7.9c2.5 3.8 6.8 10.3 9.6 14.4l-14 .5-9.3-15.1-2.9 4.7c-1.4 2.3-4.4 7.2-6.1 9.8h-14v.3zm79.4-15.2l1.9-13.9c.6-4 1.6-12 1.8-15.3l9.6-.4c1.1 2.5 2.7 6.1 4 8.9l8.2 18.2 8-18.5c1.2-2.7 2.6-6 3.7-8.5h9.3c.4 3.7 1.4 11.5 2 15.6l2 13.9c.6 4.1 1.8 11.9 2.5 15.2l-12.4.5c-.1-1.8-.7-7.1-1.1-9.6l-1.8-14c-3.1 7.7-8.6 21.4-9.4 23.6l-6.6.3-9.5-23.3-1.5 13.5c-.3 2.5-.8 7.3-.8 9.1H34.7c.7-3.3 1.9-11.2 2.5-15.3zm96.1 15.5c-4.2-.3-9.3-.3-14.2-.3-5.5 0-11.5.1-16.2.3.3-3 .4-11.3.4-15.4v-14c0-4-.1-12.5-.4-15.6 4.6.2 9.6.3 15.3.3 5.2 0 10-.1 14.3-.3-.3 3.1-.5 6.2-.5 10-3.2-.1-6.4-.1-10.3-.1-1.9 0-4 0-5.8.1-.1.9-.1 2.2-.1 2.8v4.9l13.7-.1c-.1 2.6-.2 5.5-.2 8.8h-13.5v5.7c0 .7 0 2 .1 2.9 1.8 0 3.9.1 5.8.1 4.5 0 8.3-.1 12-.2-.2 3.2-.4 6.2-.4 10.1zm30-.3h-16.6c.3-3 .4-11.1.4-15.2v-13.9c0-4-.1-12-.4-15.1 2.3 0 7.9-.4 14.9-.4 16.7 0 26 8 26 21.5 0 14.2-9.5 23.1-24.3 23.1zm-.2-35c-1.3 0-2.1.1-3.1.2-.1.8-.1 2.1-.1 2.8v19.6c0 .8 0 1.7.1 2.6 1 .1 1.8.2 3.3.2 8.4 0 12-5.5 12-13-.1-7.9-4.7-12.4-12.2-12.4zm37.2 35c.3-3 .4-11.1.4-15.2v-13.9c0-4-.1-12.2-.4-15.2 2.5 0 11.3-.1 13.4-.3-.2 1.8-.3 6.9-.3 9.3v26.2c0 2.4.1 7.3.3 9.1h-13.4zm38.1-32.2c2.2-5.2 3.7-8.5 4.9-12l10.1-.6 13.8 32c1.6 3.9 4 9 5.8 12.9l-13.4.5-3.4-8.4h-15.4c-.8 2.1-2.6 7.1-3 7.9h-13.1l13.7-32.3zm4.9 16.5h10.1l-5.1-13.7-5 13.7z"></path>
+ <path fill="#F6A01A" d="M337 464.2V498l-30-16.9 30-16.9z"></path>
+ <path fill="#FBE346" d="M276.9 464.2V498l30.1-16.9-30.1-16.9z"></path>
+ <path fill="#F47B20" d="M307 481.1V515l30-17-30-16.9z"></path>
+ <path fill="#F8CC15" d="M307 481.1V515l-30.1-17 30.1-16.9z"></path>
+ </g></svg></a> <a rel="nofollow" class="u-block c-footer__corporate-link" href="https://www.voxmedia.com/vox-advertising">Advertise with us</a> <a rel="nofollow" class="u-block c-footer__corporate-link" href="https://jobs.voxmedia.com">Jobs @ Vox Media</a> © 2019 <a rel="nofollow" href="http://www.voxmedia.com">Vox Media</a>, Inc. All Rights Reserved
+ </div>
+ </div>
+ </footer>
+ <div class="c-tab-bar" data-cid="site/tab_bar/index-1551450312_6342_109910" data-cdata="{}">
+ <a href="/" class="c-tab-bar__logo"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 242 121">
+ <path fill="#444745" d="M110.674 3.528h3.474L114.564 2H71.63l-.418 1.528h6.253c5.418 0 9.726 3.75 9.726 11.255 0 4.168-1.8 9.587-4.72 16.118L54.82 92.32l-6.81-79.756c-.556-6.252 2.5-9.03 9.59-9.03h4.027L62.042 2H1.6l-.557 1.528h3.89c4.725 0 6.532 2.918 7.087 8.615l10.7 103.1h25.427l42.518-90.038c6.392-13.48 13.2-21.677 20.01-21.677zm-5.002 112.27c-3.89 0-6.253-1.25-6.253-7.642 0-8.06 2.91-23.76 6.11-38.072.41 6.67 5 13.2 11.81 13.2 1.67 0 3.06-.138 4.44-.417-6.26 27.236-8.76 32.932-16.12 32.932zm121.024-54.19c8.06 0 13.2-6.67 13.2-14.173 0-6.392-4.585-11.116-11.115-11.116-11.81 0-17.36 9.31-27.09 26.53-2.08-10.7-6.94-24.73-19.45-24.73-14.03 0-30.15 20.01-45.02 32.37-6.67 5.56-14.17 9.17-20.15 9.17-6.11 0-9.72-6.26-9.72-17.23 4.31-17.93 6.67-22.65 13.34-22.65 4.59 0 6.53 2.64 6.53 8.06 0 5.69-1.25 15.42-3.75 27.51 6.67-2.09 16.68-10.42 25.01-19.45-4.44-10.56-13.89-17.79-27.65-17.79-25.42 0-47.66 22.78-47.66 48.35 0 17.65 12.51 30.984 32.1 30.984 32.38 0 45.86-28.066 45.86-47.52 0-2.78-.14-4.86-.42-7.364C155.717 57.14 162.108 52 167.388 52c5.975 0 10.7 15.007 15.423 37.657-4.17 4.58-8.34 13.474-10.42 15.002-.836-8.06-6.115-13.06-13.2-13.06-7.92 0-13.48 7.5-13.48 13.893 0 7.226 5 11.95 11.53 11.95 13.76 0 17.65-13.062 26.265-24.595 2.64 12.363 8.754 24.59 19.313 24.59 12.506 0 24.178-10.7 30.15-18.34l-1.11-1.81c-3.89 3.753-7.642 6.254-11.95 6.254-7.78 0-13.34-16.81-17.645-37.1 2.5-3.47 6.53-12.225 9.31-15.28 1.95 3.612 5.978 10.42 15.15 10.42z"></path></svg></a>
+ <div class="c-social-buttons" data-analytics-placement="sticky" data-cid="site/social_buttons_list-1551450312_4843_109909" data-cdata="{&quot;entry_id&quot;:16515179,&quot;services&quot;:[&quot;twitter&quot;,&quot;facebook&quot;],&quot;base_url&quot;:&quot;https://www.vox.com/2017-in-review/2017/12/15/16751138/best-movies-2017-streaming-how-to-watch&quot;}">
+ <a class="c-social-buttons__item c-social-buttons__twitter" href="https://twitter.com/intent/tweet?counturl=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;text=The+21+best+movies+of+2017&amp;url=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch&amp;via=voxdotcom" data-analytics-social="twitter"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-twitter"></use></svg> <span class="c-social-buttons__text">tweet</span></a> <a class="c-social-buttons__item c-social-buttons__facebook" href="https://www.facebook.com/sharer/sharer.php?text=The+21+best+movies+of+2017&amp;u=https%3A%2F%2Fwww.vox.com%2F2017-in-review%2F2017%2F12%2F15%2F16751138%2Fbest-movies-2017-streaming-how-to-watch" data-analytics-social="facebook"><svg class="p-svg-icon c-social-buttons__svg">
+ <use xlink:href="#icon-facebook"></use></svg> <span class="c-social-buttons__text">share</span></a>
+ </div>
+ </div>
+ </div>
+ <script src="https://cdn.vox-cdn.com/packs/chorus-95d6a425234d55b36191.js" async="async" integrity="sha256-TMEAF0AVhZm0JUpTe84mXXTZONaJ1d9ADjSTEDSDB/U= sha384-mrNz9RuysydpcSWB6AxELlKRb2uOllPXkHY8hr84ggvbgUUlir7CK3R/cWoPnWeO" crossorigin="anonymous"></script> <!-- Phonograph -->
+
+ <script src="https://phonograph2.voxmedia.com/pickup.js?v=1529075019264" id="phonograph-pickup" async="async" defer="defer"></script>
+ <script>
+ <![CDATA[
+
+ var phonographEvents = phonographEvents || [];
+ (function() {
+ var continent = document.cookie.match(/_chorus_geoip_continent=([^;]+)/i) || [];
+ var data = { 'Page Title':document.title, 'GA Track Prefix':'t1.', 'geoip_continent': continent[1] };
+ var dataLayer = window.dataLayer || [];
+ dataLayer
+ .filter(function(m) { return !!m['Network'] })
+ .forEach(function(m) {
+ Object.keys(m).forEach(function(k) { data[k] = m[k] });
+ });
+
+ var userid = data['Logged in Status'];
+ data['User ID'] = (typeof userid === 'number') ? userid : null;
+ phonographEvents.push(['pageload', data]);
+ })();
+ ]]>
+ </script> <!-- End Phonograph -->
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-images.json
new file mode 100644
index 000000000..d572c8db2
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-images.json
@@ -0,0 +1,3 @@
+[
+ "https:\/\/medias.liberation.fr\/photo\/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;picto=fb&amp;ratio_x=191&amp;ratio_y=100&amp;width=600"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-metadata.json
new file mode 100644
index 000000000..00c0019ac
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Alexandre Hervaud, J\u00e9r\u00e9my Piette",
+ "Direction": null,
+ "Excerpt": "S\u00e9ries, documentaires, programmes jeunesse\u2026 Retrouvez les recommandations de\u00a0Lib\u00e9ration\u00a0pour savoir quoi regarder sur vos \u00e9crans cette semaine.\nPour d\u00e9passer...",
+ "Image": "https:\/\/medias.liberation.fr\/photo\/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;picto=fb&amp;ratio_x=191&amp;ratio_y=100&amp;width=600",
+ "Title": "Screenshot\u00a0: \u00abVape Wave\u00bb, \u00ab6\u00a0Days\u00bb, \u00abAlphonse Pr\u00e9sident\u00bb\u2026",
+ "SiteName": "Lib\u00e9ration"
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected.html
new file mode 100644
index 000000000..77e6011d2
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/expected.html
@@ -0,0 +1,107 @@
+<div>
+ <p>
+ Séries, documentaires, programmes jeunesse… Retrouvez les recommandations de&nbsp;<em>Libération</em>&nbsp;pour savoir quoi regarder sur vos écrans cette semaine.
+ </p>
+ <h3>
+ Pour dépasser le tabac
+ </h3>
+ <p>
+ <strong><em>Vape Wave</em> (documentaire, 1h28, Planète+)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/lGL7RgHn5f0" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Pendant quelques jours, le doute a plané&nbsp;: l’Etat comptait-il vraiment légiférer contre la cigarette dans les films français, que ce soit via une interdiction pure et simple ou via un système de «punition» (coupe des aides CNC, par exemple) pour les longs-métrages qui sentent le mégot&nbsp;? Si <a href="https://www.liberation.fr/direct/element/agnes-buzyn-assure-quelle-na-jamais-envisage-linterdiction-de-la-cigarette-au-cinema_73855/" target="_blank">le rétropédalage de la ministre Buzyn</a> n’en est pas vraiment un (elle n’avait jamais clairement menacé le septième art), la polémique a le mérite de pointer la (sur)représentation clopesque sur écran. Et si, comme c’est le cas dans la vie quotidienne, on voyait progressivement les cigarettes électroniques remplacer les tiges nicotinées authentiques&nbsp;? Que ceux qui mettraient en doute le potentiel cinématographique des vapoteuses se ruent sur <a href="http://www.vapewave.net/" target="_blank"><em>Vape Wave</em></a>, documentaire militant signé Jan Kounen, ex-fumeur reconverti à la vape dont les images magnifient les volutes de vapeur recrachée.
+ </p>
+ <p>
+ Si le film du réalisateur de <em>Dobermann</em> et <em>99 Francs</em> part un peu dans tous les sens, il a le mérite de défendre avec une passion contagieuse ce qui semble, de loin, être <a href="https://www.liberation.fr/societe/2015/08/20/une-e-cigarette-tres-frequentable_1366687" target="_blank">le meilleur et plus sain substitut à la clope</a>, n’en déplaise aux mesures restrictives imposées en France <a href="https://www.liberation.fr/france/2017/10/03/la-cigarette-electronique-bannie-de-certains-lieux-publics_1600601" target="_blank">à son égard</a>. Financé en partie via crowdfunding, le documentaire a été présenté par Kounen à travers toute la France lors de projection tenant quasiment de l’évangélisation. Disponible en VOD/DVD, il a été diffusé cette semaine sur la chaîne Planète+, qui le rediffusera les 25/11, 30/11 et 02/12 prochains. <strong>(Alexandre Hervaud)</strong>
+ </p>
+ <h3>
+ Pour écouter parler un génie
+ </h3>
+ <p>
+ <strong><em>Dans la tête d’Alan Moore</em> (websérie documentaire, 8x5min, Arte Creative)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/s_rw5fPHz2g" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Le week-end dernier, <em>Libération</em> publiait <a href="http://next.liberation.fr/livres/2017/11/17/alan-moore-dernier-barde-avant-la-fin-du-monde_1610854" target="_blank">un portrait de der consacré à l’auteur britannique Alan Moore</a>, connu pour ses BD cultes (<em>V pour Vendetta, Watchmen, From Hell</em>), à l’occasion de la sortie de son deuxième roman, le pavé <em>Jérusalem</em>. En attendant l’imminente sortie d’une version longue de son entretien avec <em>Libé</em>, on pourra se replonger dans les épisodes d’une websérie documentaire d’Arte Creative en 8 épisodes consacré au maître. Brexit, magie, Anonymous font partie des sujets discutés avec le maître au fil de ce programme sobrement intitulé <a href="https://www.arte.tv/fr/videos/RC-014342/dans-la-tete-d-alan-moore/" target="_blank"><em>Dans la tête d’Alan Moore</em></a>. <strong>(A.H.)</strong>
+ </p>
+ <h3>
+ Pour honorer la mémoire d’une icône queer
+ </h3>
+ <p>
+ <strong><em>The Death and Life of Marsha P. Johnson</em> (docu, 1h45, Netflix)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/pADsuuPd79E" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Marsha, la <em>«Rosa Parks du mouvement LGBTQ»</em>. Marsha <em>«la prostituée, l’actrice et la sainte, modèle d’Andy Warhol»</em> ou encore Marsha l’élaborée, la radicale, <em>«avec ses plumes et ce maquillage qu’elle ne mettait jamais bien»</em>. «Queen Marsha» a été retrouvée morte dans l’Hudson en juillet&nbsp;1992, alors qu’on la voyait encore parader dans les rues de Greenwich Village quelques jours auparavant. Un choc glaçant. Là où son corps a été repêché puis ingratement déposé, les sans-abri ont constitué le lendemain un mémorial de bouteilles et de plantes qui délimitent les contours de l’absente.
+ </p>
+ <p>
+ Marsha P. Johnson de son nom complet, icône queer, femme transgenre noire américaine et emblème de la lutte pour les droits des LGBTQ avait été l’une des premières à s’engager lors des émeutes de Stonewall à New York, en&nbsp;1969&nbsp;: <em>«C’est la révolution. Dieu merci.»</em> Marsha était une fleur souriante au parfum d’espoir. Le documentaire <em>The Death and Life of Marsha P. Johnson</em> du cinéaste David France relate l’enquête de l’activiste Victoria Cruz, membre de l’organisation Anti-Violence Project à New York qui, avant de prendre sa retraite, réclame que lumière soit faite sur la disparition de l’icône […]&nbsp;<a href="http://next.liberation.fr/cinema/2017/11/17/docu-marsha-p-johnson-unique-en-son-genre_1610846" target="_blank">Lire la suite de la critique de Jérémy Piette sur Libération.fr</a>
+ </p>
+ <h3>
+ Pour Michel Vuilermoz (et rien d’autre)
+ </h3>
+ <p>
+ <strong><em>Alphonse President</em> (série, 10x26, OCS Max)</strong>
+ </p>
+ <p>
+ <iframe width="100%" frameborder="0" src="https://www.dailymotion.com/embed/video/x67iqc9" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Un temps baptisée <em>French Touch</em>, la série <em>Alphonse Président</em> est le dernier né des programmes originaux made in OCS. On savait les budgets de la chaîne bien moins généreux que ceux de Canal+ (voire que ceux de France 3 Limousin), et cette série le prouve à nouveau régulièrement, notamment lors d’une scène de conférence de presse alternant plans larges d’une authentique conf' à l’Elysée période François Hollande et plans serrés d’acteurs filmés dans un château des Pays de la Loire où a eu lieu le tournage. Le principal atout (et quel atout) de cette série écrite et réalisée par Nicolas Castro (<em>Des lendemains qui chantent</em>, 2014) réside dans son interprète principal, Michel Vuillermoz.
+ </p>
+ <p>
+ Dans le rôle d’un sénateur ringard devenu par un concours de circonstances président de la République, ce pensionnaire de la Comédie-Française et complice d’Albert Dupontel fait des merveilles, notamment lorsque le scénario lui prête des répliques enflammées typiques de la langue de bois politicienne –&nbsp;pas étonnant qu’il brasse du vent, son personnage de prof d’histoire retraité s’appelle Alphonse Dumoulin. C’est lorsqu’il n’est plus à l’écran que les choses se gâtent&nbsp;: si Jean-Michel Lahmi (de la bande d’Edouard Baer) fait le job en grand patron des flics, difficile de croire une seconde à Nabiha Akkari dans le rôle de la Première ministre –&nbsp;et pas uniquement parce que l’idée d’avoir une femme trentenaire issue de la diversité à Matignon sonne hélas comme un doux rêve en&nbsp;2017. Si, en matière de fiction politique sérieuse, un <em>Baron Noir</em> n’a pas grand-chose à envier à un <em>House of Cards</em>, côté comique la France est encore loin d’avoir son <em>Veep</em>. Gageons que la génération LREM saura largement inspirer des scénaristes moqueurs. <strong>(A.H.)</strong>
+ </p>
+ <h3>
+ Pour les coulisses d’un tournage dément
+ </h3>
+ <p>
+ <strong><em>Jim &amp; Andy</em> (documentaire, 1h33, Netflix)&nbsp;</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/kB15UFO5ebA" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ A la sortie de <em>Man on the Moon</em> (2000), le magnifique film de Milos Forman consacré à Andy Kaufman –&nbsp;comique et génie de la performance absurde mort en 1984&nbsp;–, le cinéaste et les acteurs insistaient dans chaque interview sur l’in­croyable comportement de Jim Carrey pendant le tournage&nbsp;: il aurait été comme possédé par Kaufman, se prenant pour lui 24&nbsp;heures sur 24. Certains affirmaient même ne jamais avoir eu l’impression que l’acteur était présent, tant son modèle avait littéralement pris sa place. Nous en avons aujourd’hui la preuve en images car tout cela avait été filmé par Bob Zmuda et Lynne Margulies, l’ancien complice et la veuve de Kaufman.
+ </p>
+ <p>
+ Dans le passionnant <em>Jim &amp; Andy&nbsp;: the Great Beyond</em>, disponible sur Netflix, Chris Smith a monté ces documents inédits parallèlement à un entretien dans lequel Jim Carrey revient sur cette expérience unique. <a href="http://next.liberation.fr/cinema,58" target="_blank">Lire la suite de la critique de Marcos Uzal sur Liberation.fr</a>
+ </p>
+ <h3>
+ Pour un trip sibérien en totale autarcie
+ </h3>
+ <p>
+ <strong><em>Braguino</em> (documentaire, 50min, Arte)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/OIS-P-0-cRk" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ La querelle peut se trouver derrière toutes les portes, y compris celle de l’exil. On a beau croire avoir tourné le dos à tout, à cette inclination humaine à nourrir sa&nbsp;propre haine, l’allergie peut regermer fissa sur une&nbsp;peau qui frissonne à&nbsp;l’approche de ce voisin que l’on ne comprend pas. Issu&nbsp;d’une lignée de vieux-croyants orthodoxes russes, Sacha Braguine a pris sa famille sous le bras, loin de toute autre présence humaine en taïga sibérienne. Un autre groupe, les Kiline, a décidé d’en faire de même et de s’installer de l’autre côté de la rivière. Qui est arrivé en premier&nbsp;? Qui menace l’autre&nbsp;? L’histoire de l’impossible communauté peut commencer.
+ </p>
+ <p>
+ La lecture d’<em>Ermites dans la taïga</em>&nbsp;(1992) de Vassili Peskov, authentique récit sur la famille Lykov opérant une migration similaire en&nbsp;1938, a poussé l’artiste&nbsp;<a href="http://next.liberation.fr/images/2017/09/29/clement-cogitore-j-essaye-de-raconter-les-terreurs-profondes-de-l-etre-humain_1599854">Clément Cogitore</a>&nbsp;à&nbsp;rencontrer les Braguine, puis à se faire témoin de la&nbsp;bisbille de voisinage en&nbsp;2016. Il en est revenu avec un nouveau film d’une cinquantaine de minutes&nbsp;:&nbsp;<em>Braguino,</em>&nbsp;soutenu par le prix Le&nbsp;Bal de la&nbsp;jeune création avec l’ADAGP.<em>&nbsp;</em>Le documentaire y frôle son déguisement fictionnel, tant ce qui s’y déroule convoque une dramaturgie comme invoquée par on ne sait quel rituel vaudou […] <a href="http://next.liberation.fr/cinema/2017/10/30/braguino-prises-de-bec-dans-la-taiga_1606859" target="_blank">Lire la suite de la critique de Jérémy Piette sur Liberation.fr</a>, le film diffusé cette semaine sur Arte est visible en intégralité ci-dessus.
+ </p>
+ <h3>
+ Pour un thriller tiré de faits réels
+ </h3>
+ <p>
+ <strong><em>6 Days</em> (film, 1h34, Netflix)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/7HthiTi_IcI" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Fin avril 1980, l’ambassade d’Iran à Londres a été le théâtre d’une prise d’otages largement médiatisée : une trentaine de personnes ont ainsi été retenues pendant six jours par des soldats iraniens dissidents exigeant la libération de 91 prisonniers. Avec Margaret Thatcher au 10 Downing Street à l’époque, pas question pour l’Angleterre d’avoir l’air mou du genou sur la réponse à apporter à cette crise scrutée par les caméras du monde entier. Le SAS (Special Air Service) est sur le coup : l’opération Nimrod se met en place pour prendre d’assaut l’ambassade.
+ </p>
+ <p>
+ Inspiré par cet épisode, <em>6 Days</em> de&nbsp;Toa Fraser (<em>The Dead Lands</em>, 2014) est un thriller carré pouvant compter sur l'autorité naturelle de Mark Strong (<em>Kingsman</em>) ici recyclé en flic londonien et sur la néo-badass attitude de Jamie Bell, bien loin du freluquet danseur de <em>Billy Elliot</em> puisqu'on le retrouve ici&nbsp;en soldat chargé d’organiser l’opération de secours. Attention, la bande-annonce ci-dessus dévoile à peu près l’intégralité des scènes d’action du film. <strong>(A.H.)</strong>
+ </p><p><span><span><a href="https://www.liberation.fr/auteur/5631-alexandre-hervaud">Alexandre Hervaud</a></span> , <span><a href="https://www.liberation.fr/auteur/17350-jeremy-piette">Jérémy Piette</a></span></span>
+ </p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/source.html
new file mode 100644
index 000000000..5cfc0ba14
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/videos-2/source.html
@@ -0,0 +1,2043 @@
+<!DOCTYPE html>
+<html lang="fr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+ <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
+ <title>
+ Screenshot&#160;: «Vape Wave», «6&#160;Days», «Alphonse Président»… - Culture / Next
+ </title>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="description" content="Séries, documentaires, programmes jeunesse… Retrouvez les recommandations de&#160;Libération&#160;pour savoir quoi regarder sur vos écrans cette semaine. Pour dépasser..." />
+ <meta name="keywords" content="Documentaire, Libération, Netflix, Arte, Marsha P. Johnson, Alan Moore, France, New York, Cinéaste, Thriller, Special Air Service, Acteur, Web-série, Opération Nimrod, Jim Carrey, Winamp, Planète+, Queer, LGBT, Icône, From Hell, Comique, Etty Buzyn, Bande-annonce, Jefferson Starship, Vieux-croyants, Greenwich Village, V pour Vendetta, Michel Vuillermoz, Évangélisation, Sans-abri, Frein de bicyclette, Cigarette, Allergie, États-Unis, Dieu merci!, Londres, Édouard Baer, Clément Cogitore, Margaret Thatcher, Vidéo à la demande, Pays de la Loire, Cinéma, Brasses, Réalisateur, 10 Downing Street, Jérusalem, Orange Cinéhappy, Mégot, Long métrage, Un grand patron, Droits de l'homme, Baron noir, Ermites dans la taïga, DVD, Parfum, Financement participatif, Révolution, Albert Dupontel, Sénat, Andy Kaufman, Autarcie, Royaume-Uni, Famille Lykov, Brexit, Captures d'écran, Jan Kounen, Dobermann, Comédie-Française, Famille, Taïga, Queen, Prise d'otages des Jeux olympiques de Munich, Président de la République, 99 francs, Langue de bois, Miloš Forman, Torture, Watchmen, Anonymous, François Hollande, The Dead Lands, Mark Strong, Jamie Bell, Nabiha Akkari, Jean-Michel Lahmi, France 3 Limousin, Tournage, Élysée, Cigarette électronique, Billy Elliot, Andy Warhol, Vaudou, Des lendemains qui chantent, Prostitution, Angleterre, Rosa Parks, Bob Zmuda, Émeutes de Stonewall, CNC, MtF, Tabac, Michel Serres, Violence, ADAGP, French Touch, Premier ministre, Canal+, Danse, Man on the Moon, The Great Beyond, Veep, House of Cards, Vassili Peskov, actualités, news" />
+ <meta name="apple-itunes-app" content="app-id=371288979" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:site" content="@libe" />
+ <meta name="twitter:creator" content="@libe" />
+ <meta name="twitter:title" content="Screenshot&#160;: «Vape Wave», «6&#160;Days», «Alphonse Président»…" />
+ <meta name="twitter:description" content="Séries, documentaires, programmes jeunesse… Retrouvez les recommandations de&#160;Libération&#160;pour savoir quoi regarder sur vos écrans cette semaine. Pour dépasser..." />
+ <meta name="twitter:url" content="https://next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047" />
+ <meta name="twitter:image" content="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;amp;picto=fb&amp;amp;ratio_x=191&amp;amp;ratio_y=100&amp;amp;width=600" />
+ <meta property="article:section" content="Culture" />
+ <meta property="article:published_time" content="2017-11-24T18:42:20" />
+ <meta property="article:modified_time" content="2017-11-24T18:42:20" />
+ <meta property="article:author" content="https://www.liberation.fr/auteur/5631-alexandre-hervaud" />
+ <meta property="article:author" content="https://www.liberation.fr/auteur/17350-jeremy-piette" />
+ <meta name="news_keywords" content="Documentaire, Libération, Netflix, Arte, Marsha P. Johnson, Alan Moore, France, New York, Cinéaste, Thriller, Special Air Service, Acteur, Web-série, Opération Nimrod, Jim Carrey, Winamp, Planète+, Queer, LGBT, Icône, From Hell, Comique, Etty Buzyn, Bande-annonce, Jefferson Starship, Vieux-croyants, Greenwich Village, V pour Vendetta, Michel Vuillermoz, Évangélisation, Sans-abri, Frein de bicyclette, Cigarette, Allergie, États-Unis, Dieu merci!, Londres, Édouard Baer, Clément Cogitore, Margaret Thatcher, Vidéo à la demande, Pays de la Loire, Cinéma, Brasses, Réalisateur, 10 Downing Street, Jérusalem, Orange Cinéhappy, Mégot, Long métrage, Un grand patron, Droits de l'homme, Baron noir, Ermites dans la taïga, DVD, Parfum, Financement participatif, Révolution, Albert Dupontel, Sénat, Andy Kaufman, Autarcie, Royaume-Uni, Famille Lykov, Brexit, Captures d'écran, Jan Kounen, Dobermann, Comédie-Française, Famille, Taïga, Queen, Prise d'otages des Jeux olympiques de Munich, Président de la République, 99 francs, Langue de bois, Miloš Forman, Torture, Watchmen, Anonymous, François Hollande, The Dead Lands, Mark Strong, Jamie Bell, Nabiha Akkari, Jean-Michel Lahmi, France 3 Limousin, Tournage, Élysée, Cigarette électronique, Billy Elliot, Andy Warhol, Vaudou, Des lendemains qui chantent, Prostitution, Angleterre, Rosa Parks, Bob Zmuda, Émeutes de Stonewall, CNC, MtF, Tabac, Michel Serres, Violence, ADAGP, French Touch, Premier ministre, Canal+, Danse, Man on the Moon, The Great Beyond, Veep, House of Cards, Vassili Peskov" />
+ <meta property="article:tag" content="Documentaire" />
+ <meta property="article:tag" content="Libération" />
+ <meta property="article:tag" content="Netflix" />
+ <meta property="article:tag" content="Arte" />
+ <meta property="article:tag" content="Marsha P. Johnson" />
+ <meta property="article:tag" content="Alan Moore" />
+ <meta property="article:tag" content="France" />
+ <meta property="article:tag" content="New York" />
+ <meta property="article:tag" content="Cinéaste" />
+ <meta property="article:tag" content="Thriller" />
+ <meta property="article:tag" content="Special Air Service" />
+ <meta property="article:tag" content="Acteur" />
+ <meta property="article:tag" content="Web-série" />
+ <meta property="article:tag" content="Opération Nimrod" />
+ <meta property="article:tag" content="Jim Carrey" />
+ <meta property="article:tag" content="Winamp" />
+ <meta property="article:tag" content="Planète+" />
+ <meta property="article:tag" content="Queer" />
+ <meta property="article:tag" content="LGBT" />
+ <meta property="article:tag" content="Icône" />
+ <meta property="article:tag" content="From Hell" />
+ <meta property="article:tag" content="Comique" />
+ <meta property="article:tag" content="Etty Buzyn" />
+ <meta property="article:tag" content="Bande-annonce" />
+ <meta property="article:tag" content="Jefferson Starship" />
+ <meta property="article:tag" content="Vieux-croyants" />
+ <meta property="article:tag" content="Greenwich Village" />
+ <meta property="article:tag" content="V pour Vendetta" />
+ <meta property="article:tag" content="Michel Vuillermoz" />
+ <meta property="article:tag" content="Évangélisation" />
+ <meta property="article:tag" content="Sans-abri" />
+ <meta property="article:tag" content="Frein de bicyclette" />
+ <meta property="article:tag" content="Cigarette" />
+ <meta property="article:tag" content="Allergie" />
+ <meta property="article:tag" content="États-Unis" />
+ <meta property="article:tag" content="Dieu merci!" />
+ <meta property="article:tag" content="Londres" />
+ <meta property="article:tag" content="Édouard Baer" />
+ <meta property="article:tag" content="Clément Cogitore" />
+ <meta property="article:tag" content="Margaret Thatcher" />
+ <meta property="article:tag" content="Vidéo à la demande" />
+ <meta property="article:tag" content="Pays de la Loire" />
+ <meta property="article:tag" content="Cinéma" />
+ <meta property="article:tag" content="Brasses" />
+ <meta property="article:tag" content="Réalisateur" />
+ <meta property="article:tag" content="10 Downing Street" />
+ <meta property="article:tag" content="Jérusalem" />
+ <meta property="article:tag" content="Orange Cinéhappy" />
+ <meta property="article:tag" content="Mégot" />
+ <meta property="article:tag" content="Long métrage" />
+ <meta property="article:tag" content="Un grand patron" />
+ <meta property="article:tag" content="Droits de l'homme" />
+ <meta property="article:tag" content="Baron noir" />
+ <meta property="article:tag" content="Ermites dans la taïga" />
+ <meta property="article:tag" content="DVD" />
+ <meta property="article:tag" content="Parfum" />
+ <meta property="article:tag" content="Financement participatif" />
+ <meta property="article:tag" content="Révolution" />
+ <meta property="article:tag" content="Albert Dupontel" />
+ <meta property="article:tag" content="Sénat" />
+ <meta property="article:tag" content="Andy Kaufman" />
+ <meta property="article:tag" content="Autarcie" />
+ <meta property="article:tag" content="Royaume-Uni" />
+ <meta property="article:tag" content="Famille Lykov" />
+ <meta property="article:tag" content="Brexit" />
+ <meta property="article:tag" content="Captures d'écran" />
+ <meta property="article:tag" content="Jan Kounen" />
+ <meta property="article:tag" content="Dobermann" />
+ <meta property="article:tag" content="Comédie-Française" />
+ <meta property="article:tag" content="Famille" />
+ <meta property="article:tag" content="Taïga" />
+ <meta property="article:tag" content="Queen" />
+ <meta property="article:tag" content="Prise d'otages des Jeux olympiques de Munich" />
+ <meta property="article:tag" content="Président de la République" />
+ <meta property="article:tag" content="99 francs" />
+ <meta property="article:tag" content="Langue de bois" />
+ <meta property="article:tag" content="Miloš Forman" />
+ <meta property="article:tag" content="Torture" />
+ <meta property="article:tag" content="Watchmen" />
+ <meta property="article:tag" content="Anonymous" />
+ <meta property="article:tag" content="François Hollande" />
+ <meta property="article:tag" content="The Dead Lands" />
+ <meta property="article:tag" content="Mark Strong" />
+ <meta property="article:tag" content="Jamie Bell" />
+ <meta property="article:tag" content="Nabiha Akkari" />
+ <meta property="article:tag" content="Jean-Michel Lahmi" />
+ <meta property="article:tag" content="France 3 Limousin" />
+ <meta property="article:tag" content="Tournage" />
+ <meta property="article:tag" content="Élysée" />
+ <meta property="article:tag" content="Cigarette électronique" />
+ <meta property="article:tag" content="Billy Elliot" />
+ <meta property="article:tag" content="Andy Warhol" />
+ <meta property="article:tag" content="Vaudou" />
+ <meta property="article:tag" content="Des lendemains qui chantent" />
+ <meta property="article:tag" content="Prostitution" />
+ <meta property="article:tag" content="Angleterre" />
+ <meta property="article:tag" content="Rosa Parks" />
+ <meta property="article:tag" content="Bob Zmuda" />
+ <meta property="article:tag" content="Émeutes de Stonewall" />
+ <meta property="article:tag" content="CNC" />
+ <meta property="article:tag" content="MtF" />
+ <meta property="article:tag" content="Tabac" />
+ <meta property="article:tag" content="Michel Serres" />
+ <meta property="article:tag" content="Violence" />
+ <meta property="article:tag" content="ADAGP" />
+ <meta property="article:tag" content="French Touch" />
+ <meta property="article:tag" content="Premier ministre" />
+ <meta property="article:tag" content="Canal+" />
+ <meta property="article:tag" content="Danse" />
+ <meta property="article:tag" content="Man on the Moon" />
+ <meta property="article:tag" content="The Great Beyond" />
+ <meta property="article:tag" content="Veep" />
+ <meta property="article:tag" content="House of Cards" />
+ <meta property="article:tag" content="Vassili Peskov" />
+ <link rel="amphtml" href="https://next.liberation.fr/amphtml/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047" />
+ <script type="application/ld+json">
+ <![CDATA[
+ {"publisher": {"url": "https://www.liberation.fr", "logo": {"url": "https://statics.liberation.fr/newnext/images/logo-libe-meta.png", "width": "131", "@type": "ImageObject", "height": "60"}, "@type": "Organization", "name": "Lib\u00e9ration"}, "description": "S\u00e9ries, documentaires, programmes jeunesse\u2026 Retrouvez les recommandations de\u00a0Lib\u00e9ration\u00a0pour savoir quoi regarder sur vos \u00e9crans cette semaine.\nPour d\u00e9passer...", "author": [{"url": "https://www.liberation.fr/auteur/5631-alexandre-hervaud", "@type": "Person", "name": "Alexandre Hervaud"}, {"url": "https://www.liberation.fr/auteur/17350-jeremy-piette", "@type": "Person", "name": "J\u00e9r\u00e9my Piette"}], "headline": "Screenshot\u00a0: \u00abVape Wave\u00bb, \u00ab6\u00a0Days\u00bb, \u00abAlphonse Pr\u00e9sident\u00bb\u2026", "image": {"url": "https://statics.liberation.fr/newnext/images/social-placeholder.jpg", "width": "1000", "@type": "ImageObject", "height": "500"}, "datePublished": "2017-11-24T18:42:20.314667", "keywords": "Documentaire,Lib\u00e9ration,Netflix,Arte,Marsha P. Johnson,Alan Moore,France,New York,Cin\u00e9aste,Thriller,Special Air Service,Acteur,Web-s\u00e9rie,Op\u00e9ration Nimrod,Jim Carrey,Winamp,Plan\u00e8te+,Queer,LGBT,Ic\u00f4ne,From Hell,Comique,Etty Buzyn,Bande-annonce,Jefferson Starship,Vieux-croyants,Greenwich Village,V pour Vendetta,Michel Vuillermoz,\u00c9vang\u00e9lisation,Sans-abri,Frein de bicyclette,Cigarette,Allergie,\u00c9tats-Unis,Dieu merci!,Londres,\u00c9douard Baer,Cl\u00e9ment Cogitore,Margaret Thatcher,Vid\u00e9o \u00e0 la demande,Pays de la Loire,Cin\u00e9ma,Brasses,R\u00e9alisateur,10 Downing Street,J\u00e9rusalem,Orange Cin\u00e9happy,M\u00e9got,Long m\u00e9trage,Un grand patron,Droits de l'homme,Baron noir,Ermites dans la ta\u00efga,DVD,Parfum,Financement participatif,R\u00e9volution,Albert Dupontel,S\u00e9nat,Andy Kaufman,Autarcie,Royaume-Uni,Famille Lykov,Brexit,Captures d'\u00e9cran,Jan Kounen,Dobermann,Com\u00e9die-Fran\u00e7aise,Famille,Ta\u00efga,Queen,Prise d'otages des Jeux olympiques de Munich,Pr\u00e9sident de la R\u00e9publique,99 francs,Langue de bois,Milo\u0161 Forman,Torture,Watchmen,Anonymous,Fran\u00e7ois Hollande,The Dead Lands,Mark Strong,Jamie Bell,Nabiha Akkari,Jean-Michel Lahmi,France 3 Limousin,Tournage,\u00c9lys\u00e9e,Cigarette \u00e9lectronique,Billy Elliot,Andy Warhol,Vaudou,Des lendemains qui chantent,Prostitution,Angleterre,Rosa Parks,Bob Zmuda,\u00c9meutes de Stonewall,CNC,MtF,Tabac,Michel Serres,Violence,ADAGP,French Touch,Premier ministre,Canal+,Danse,Man on the Moon,The Great Beyond,Veep,House of Cards,Vassili Peskov", "@type": "NewsArticle", "mainEntityOfPage": {"@id": "https://next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047", "@type": "URL"}, "@context": "http://schema.org", "dateCreated": "2017-11-24T18:42:20.314667", "dateModified": "2017-11-24T18:42:20.314667"}
+ ]]>
+ </script>
+ <meta name="google-site-verification" content="zVHLmJdGBN-aytKJzwnoPQeYRQZLOwePkL6terUtF8U" />
+ <meta property="fb:pages" content="147126052393" />
+ <meta property="og:site_name" content="Libération.fr" />
+ <meta property="og:type" content="article" />
+ <meta property="og:title" content="Screenshot&#160;: «Vape Wave», «6&#160;Days», «Alphonse Président»…" />
+ <meta property="og:image" content="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;amp;picto=fb&amp;amp;ratio_x=191&amp;amp;ratio_y=100&amp;amp;width=600" />
+ <meta property="al:ios:url" content="liberation://article?id=1612047" />
+ <meta property="al:ios:app_store_id" content="336173383" />
+ <meta property="al:ios:app_name" content="Libération" />
+ <meta property="al:android:package" content="com.visuamobile.liberation" />
+ <meta property="al:android:app_name" content="Libération - Toute l'actualité" />
+ <meta property="al:android:url" content="liberation://article?id=1612047" />
+ <meta name="twitter:app:country" content="FR" />
+ <meta name="twitter:app:name:iphone" content="Libération" />
+ <meta name="twitter:app:id:iphone" content="336173383" />
+ <meta name="twitter:app:url:iphone" content="liberation://article?id=1612047" />
+ <meta name="twitter:app:name:ipad" content="Libération" />
+ <meta name="twitter:app:id:ipad" content="336173383" />
+ <meta name="twitter:app:url:ipad" content="liberation://article?id=1612047" />
+ <meta name="twitter:app:name:googleplay" content="Libération - Toute l'actualité" />
+ <meta name="twitter:app:id:googleplay" content="com.visuamobile.liberation" />
+ <meta name="twitter:app:url:googleplay" content="liberation://article?id=1612047" />
+ <meta property="og:url" content="https://next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047" />
+ <meta property="og:description" content="Séries, documentaires, programmes jeunesse… Retrouvez les recommandations de&#160;Libération&#160;pour savoir quoi regarder sur vos écrans cette semaine. Pour dépasser..." />
+ <meta property="libe:image" content="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;amp;width=750" />
+ <link rel="canonical" href="https://next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047" />
+ <link rel="shortcut icon" href="https://www.liberation.fr/favicon.ico" />
+ <link rel="stylesheet" href="https://statics.liberation.fr/newnext/cache/css/46a524bbe7a5.css" type="text/css" media="all" />
+ <link rel="stylesheet" href="https://statics.liberation.fr/newnext/cache/css/db0902551ea0.css" type="text/css" media="all" />
+ <link rel="dns-prefetch" href="https://medias.liberation.fr" />
+ <link rel="dns-prefetch" href="http://m0.libe.com/" />
+ <link rel="dns-prefetch" href="https://statics.liberation.fr/newnext/" />
+ <link rel="dns-prefetch" href="http://asqliberation.nuggad.net/" />
+ <link rel="dns-prefetch" href="http://logliberation.xiti.com/" />
+ <link rel="dns-prefetch" href="http://www.google-analytics.com/" />
+ <link rel="dns-prefetch" href="http://static.chartbeat.com/" />
+ <link rel="dns-prefetch" href="http://ping.chartbeat.com/" />
+ <link rel="dns-prefetch" href="http://widgets.outbrain.com/" />
+ <link rel="dns-prefetch" href="http://images.outbrain.com/" />
+ <link rel="dns-prefetch" href="http://odb.outbrain.com/" />
+ <link rel="dns-prefetch" href="http://platform.twitter.com/" />
+ <link rel="dns-prefetch" href="http://connect.facebook.net/" />
+ <link rel="dns-prefetch" href="http://www.facebook.com/" />
+ <link rel="dns-prefetch" href="https://www6.smartadserver.com/" />
+ <link rel="dns-prefetch" href="http://ak-ns.sascdn.com/" />
+ <link rel="dns-prefetch" href="http://cdn1.smartadserver.com/" />
+ <link rel="dns-prefetch" href="http://ib.adnxs.com/" />
+ <link rel="dns-prefetch" href="http://cdn.adslvr.com/" />
+ <link rel="dns-prefetch" href="http://d.ligatus.com/" />
+ <link rel="dns-prefetch" href="http://x.ligatus.com/" />
+ <link rel="dns-prefetch" href="http://l.ligatus.com/" />
+ <link rel="dns-prefetch" href="http://cdn.elasticad.net/" />
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/6cc7f5d7edf1.js"></script>
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/ec1d4b0cc5cb.js"></script>
+ </head>
+ <body class="contentmodel next article article-screenshot-vape-wave-6-days-alphonse-president article">
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/47759a0c4465.js"></script> <svg xmlns="http://www.w3.org/2000/svg" style="height: 0; width: 0; position: absolute; visibility: hidden;"> <!-- LAYOUT -->
+ <symbol id="icon-search" viewbox="0 0 21 22">
+ <title>
+ Search
+ </title>
+ <g stroke-width="2" stroke-miterlimit="10" fill="none">
+ <circle cx="8.4" cy="8.5" r="7.1"></circle>
+ <path d="M12.9 13.8l7.1 7.1"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-direct-anim" viewbox="0 0 26 22">
+ <title>
+ Direct
+ </title>
+ <path class="stroke-anim" stroke="#000" stroke-width="2" stroke-miterlimit="10" d="M15.5 8c.7-1 2-2 4-2 3 0 5 2.1 5 5s-2.1 5-5 5c-3.3 0-5-2.1-6.5-5s-3.2-5-6.5-5c-2.9 0-5 2.1-5 5s2 5 5 5c2 0 3.2-.9 4-2" fill="none"></path>
+ </symbol>
+ <symbol id="icon-user" viewbox="0 0 21 22">
+ <title>
+ User
+ </title>
+ <g stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M7.1 12.2c-3.3 1.3-5.6 4.3-5.6 8.3h17.9c0-4-2.3-7-5.6-8.3"></path>
+ <circle cx="10.5" cy="7.1" r="5.6"></circle>
+ </g>
+ </symbol>
+ <symbol id="icon-100" viewbox="0 0 26 22">
+ <title>
+ 100
+ </title>
+ <g stroke="#000" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M14.8 8c0-1.7-1.3-3-3-3s-3 1.3-3 3v6c0 1.7 1.3 3 3 3s3-1.3 3-3v-6zM24.8 8c0-1.7-1.3-3-3-3s-3 1.3-3 3v6c0 1.7 1.3 3 3 3s3-1.3 3-3v-6zM.8 7l2.6-2h.4v13"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-zoom" viewbox="0 0 22 22">
+ <title>
+ Zoom
+ </title>
+ <path fill="#ffffff" d="M9 22v-2h-5.5l6.5-6.5-1.5-1.5-6.5 6.5v-5.5h-2v9zM13 0v2h5.5l-6.5 6.5 1.5 1.5 6.5-6.5v5.5h2v-9z"></path>
+ </symbol>
+ <symbol id="icon-quiz" viewbox="0 0 60 60">
+ <title>
+ Quiz
+ </title>
+ <text transform="translate(23.727 40.574)" fill="#fff" font-family="'Liberation-x2750.00_x1500.00'" font-size="26.585" letter-spacing="2">
+ ?
+ </text>
+ <path stroke="#fff" d="M30 12v-7M21.1 14.5l-3.6-6.2M14.5 21.1l-6.2-3.6M12 30h-7M14.5 38.9l-6.2 3.6M21.1 45.5l-3.6 6.2M30 48v7M38.9 45.5l3.6 6.2M45.5 38.9l6.2 3.6M48 30h7M45.5 21.1l6.2-3.6M38.9 14.5l3.6-6.2"></path>
+ </symbol><!-- LIVE -->
+ <symbol id="icon-diamond" viewbox="0 0 26 11">
+ <title>
+ Libération Diamond
+ </title>
+ <path stroke="#000" stroke-linejoin="round" stroke-miterlimit="10" fill="none" d="M1.1 5.5l11.9-4.4 11.9 4.4-11.9 4.4z"></path>
+ </symbol><!-- EVENEMENT -->
+ <symbol id="icon-clock" viewbox="0 0 18 18">
+ <title>
+ clock
+ </title>
+ <g stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" fill="none">
+ <circle cx="9" cy="9" r="7.5"></circle>
+ <path d="M9 3.9v5.1h2.6"></path>
+ </g>
+ </symbol><!-- RSS -->
+ <symbol id="icon-xml" viewbox="0 0 14.6 14.6">
+ <title>
+ xml
+ </title>
+ <path fill="#fff" d="M0 7.8c1.8 0 3.5.7 4.8 2 1.3 1.3 2 3 2 4.8h2.8c0-5.3-4.3-9.6-9.6-9.6v2.8zm0-5c6.5 0 11.8 5.3 11.8 11.8h2.8c0-8-6.6-14.6-14.6-14.6v2.8zm3.9 9.9c0 1.1-.9 1.9-1.9 1.9-1.1 0-1.9-.9-1.9-1.9 0-1.1.9-1.9 1.9-1.9 1-.1 1.9.8 1.9 1.9z"></path>
+ </symbol>
+ <symbol id="icon-netvibes" viewbox="0 0 14 14">
+ <title>
+ netvibes
+ </title>
+ <g fill="#fff">
+ <path d="M6 0h2v14h-2zM0 6h14v2h-14z"></path>
+ </g>
+ </symbol><!-- CATEGORIES -->
+ <symbol id="icon-live" viewbox="0 0 60 60">
+ <title>
+ live
+ </title>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" d="M33 26c1.3-2 3.1-4 6-4 5 0 8 3.7 8 8s-3 8-8 8c-4.9 0-6.8-3.7-9-8s-4.1-8-9-8c-5.1 0-8 3.7-8 8s2.9 8 8 8c3 0 4.8-2.4 6-4" fill="none"></path>
+ </symbol>
+ <symbol id="icon-anciens-numeros" viewbox="0 0 60 60">
+ <title>
+ anciens-numeros
+ </title>
+ <path fill="#fff" d="M20.2 22.5l7.1-2.5 6.9 2.5-6.9 2.5z"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M15 17h24v32h-24zM20 14v-2h24v32h-2"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M20 29h14v8h-14zM19 41h7M19 44h7M28 41h7M28 44h7"></path>
+ </symbol>
+ <symbol id="icon-data" viewbox="0 0 60 60">
+ <title>
+ data
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <circle cx="30" cy="30" r="15.7"></circle>
+ <path d="M30 14v16l-10.6 11.6M18.8 19l11.2 11"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-desintox" viewbox="0 0 60 60">
+ <title>
+ desintox
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" fill="none">
+ <circle cx="20.6" cy="40.8" r="6.5"></circle>
+ <path d="M23.4 40.8c0-1.5-1.3-2.8-2.8-2.8M42.4 40.8c0-1.5-1.3-2.8-2.8-2.8M14 41v-14.7c0-3.5 3-6.3 6.5-6.3s6.5 2.8 6.5 6.3v14.7"></path>
+ </g>
+ <g stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" fill="none">
+ <circle cx="39.6" cy="40.8" r="6.5"></circle>
+ <path d="M33 41v-14.7c0-3.5 3-6.3 6.5-6.3s6.5 2.8 6.5 6.3v14.7"></path>
+ </g>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M19 20v-4.2c0-2.1 1.9-3.7 4-3.7s4 1.7 4 3.7v9.2M41 20v-4.2c0-2.1-1.9-3.7-4-3.7s-4 1.7-4 3.7v9.2" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" fill="none" d="M27 25h6v11h-6z"></path>
+ </symbol>
+ <symbol id="icon-diapo" viewbox="0 0 60 60">
+ <title>
+ diapo
+ </title>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M11 23h33v21h-33zM11.2 38l7.1-6.2 10 12.2M27.2 42.5l7-6.2 10.1 7.7"></path>
+ <circle fill="#fff" cx="38" cy="29.3" r="3.3"></circle>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M17 20v-3h33v21h-3"></path>
+ </symbol>
+ <symbol id="icon-edito" viewbox="0 0 60 60">
+ <title>
+ edito
+ </title>
+ <g fill="#fff">
+ <path d="M10.2 23h6.5v2.7h-3.7v2.6h3.5v2.6h-3.5v3.1h3.7v2.7h-6.5v-13.7zM18.5 23h3.9c3.1 0 4.1 1.2 4.1 4.5v4.6c0 3.3-1 4.5-4.1 4.5h-3.9v-13.6zm2.8 2.6v8.5h1.1c.9 0 1.3-.4 1.3-2.2v-4c0-1.8-.4-2.2-1.3-2.2h-1.1zM28.4 23h2.9v13.7h-2.9v-13.7zM37.5 25.9v10.8h-2.9v-10.8h-2v-2.9h6.9v2.9h-2zM45.1 36.8c-2.9 0-4.1-1.2-4.1-4.4v-5.2c0-3 1.2-4.3 4.1-4.3 2.9 0 4.1 1.3 4.1 4.3v5.2c0 3.1-1.3 4.4-4.1 4.4zm-.1-11.2c-.9 0-1.3.4-1.3 2v4.5c0 1.6.4 2 1.3 2s1.3-.4 1.3-2v-4.5c0-1.6-.4-2-1.3-2z"></path>
+ </g>
+ <path fill="#fff" d="M11.7 21l2.2-3h2.3l-2.7 3z"></path>
+ </symbol>
+ <symbol id="icon-election-2017" viewbox="0 0 60 60">
+ <title>
+ election-2017
+ </title>
+ <g fill="#fff">
+ <path d="M17.1 49.4c3.9-4.7 4-4.7 4-5.5v-.3c0-.7-.2-1-.9-1-.6 0-.9.3-.9 1.2v.5h-2.3v-.6c0-2.1.9-3 3.2-3 2.2 0 3.1.7 3.1 2.6v.3c0 1.2-.2 1.5-3.4 5.7h3.3v2h-6.2v-1.9zM28 51.4c-2.3 0-3.2-.9-3.2-3.4v-4c0-2.3.9-3.3 3.2-3.3 2.3 0 3.2 1 3.2 3.3v4c0 2.4-1 3.4-3.2 3.4zm0-8.7c-.7 0-1 .3-1 1.5v3.5c0 1.2.3 1.5 1 1.5s1-.3 1-1.5v-3.5c0-1.2-.3-1.5-1-1.5zM33.8 51.3v-8l-1.3.6v-2.1l2.3-1.1h1.2v10.6h-2.2zM38.4 51.3c.3-4.1 1.7-6.5 2.9-8.6h-3.8v-2h6.2v1.6c-1.5 2.7-2.6 4.9-2.9 9h-2.4z"></path>
+ </g>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M24 13h-10v12h32v-12h-6"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M14 25h32v9h-32z"></path>
+ <path fill="#fff" d="M32 21l7-7-7-7-10 10 4 4z"></path>
+ </symbol>
+ <symbol id="icon-election" viewbox="0 0 60 60">
+ <title>
+ election
+ </title>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M20.9 21h-7v12h32v-12h-5"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M13.9 33h32v10h-32z"></path>
+ <path fill="#fff" d="M31.1 29l8.6-7.4-7.4-8.6-12.3 11.1 4.1 4.9z"></path>
+ </symbol>
+ <symbol id="icon-essentiel" viewbox="0 0 60 60">
+ <title>
+ essentiel
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M19 24h-2.5c-3.9 0-6.8 3.1-6.8 7s3 7 6.8 7h26.3c3.9 0 6.8-3.1 6.8-7s-3-7-6.8-7h-18.8M28.2 28.4l-4.4-4.4 4.4-4.4"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-generique" viewbox="0 0 60 60">
+ <title>
+ generique
+ </title>
+ <path fill="#fff" d="M12 30l18-6.6 18 6.6-18 6.6-18-6.6"></path>
+ </symbol>
+ <symbol id="icon-idee" viewbox="0 0 60 60">
+ <title>
+ idee
+ </title>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M41.5 35c-1.8 3.2-6 2.5-5.7 7.3M38.4 46.9c5-3.4-.5-7.9 3.1-11.9M39.4 30.9c2.6-2.9 8.1-1.3 7.3 3.6M31 31.9c0 .9.3 5 5.3 2.2M31 31.9c0-2.3 3.5-2.6 5.7-5.3" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M24.6 13c-2.8 1.4-3.9 3.7-3 6" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" d="M31 45.3c0 5.6 16 2.6 16-14.4 0-16.9-16-23.3-16-15.5v29.9zM31 45.3c0 5.6-16 2.6-16-14.4 0-16.9 16-23.3 16-15.5v29.9z" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M20.2 35.2c5.3-1.3 4.3 3 10.8 3M20.7 35.1c3.9-.7 3.9-1.5 6.5-2M15.6 25.4c-.6 3.5 2.4 5.3 4.4 4.9 2-.4 3.5-1.1 4.6-1.1" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M28.3 25.1c-2.6-1.9-2.8-5.3-1.5-7.8M31 31.1c0-5.1-5-9.8-10-6.3" fill="none"></path>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M21.9 40c3.1 1.4 2.8 2.7 5.6 3.7" fill="none"></path>
+ <g stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" fill="none">
+ <path d="M36.1 22.4c-.3-1.8.9-3.1 2.5-3.4M35.9 17.3c-.4 2 .1 3.8.2 5.2"></path>
+ </g>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M44.7 30c-2.2-1.4-4.2-3.4-3.9-6.3" fill="none"></path>
+ </symbol>
+ <symbol id="icon-jo" viewbox="0 0 60 60">
+ <title>
+ jo
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <circle cx="44.9" cy="28.1" r="6.1"></circle>
+ <circle cx="37.6" cy="33.9" r="6.1"></circle>
+ <circle cx="23" cy="33.9" r="6.1"></circle>
+ <circle cx="30.3" cy="28.1" r="6.1"></circle>
+ <circle cx="15.7" cy="28.1" r="6.1"></circle>
+ </g>
+ </symbol>
+ <symbol id="icon-next" viewbox="0 0 60 60">
+ <title>
+ next
+ </title>
+ <g fill="#fff">
+ <path d="M15.4 29.6v7.1h-2.6v-13.7h2.5l2.9 7.1v-7.1h2.6v13.7h-2.5l-2.9-7.1zM22.6 23h6.5v2.7h-3.7v2.6h3.5v2.6h-3.5v3.1h3.7v2.7h-6.5v-13.7zM30.9 23h3l1 5.9 1-5.9h3l-1.6 6.8 1.6 6.8h-3l-1.1-6-1.1 6h-3l1.6-6.8-1.4-6.8zM44.9 25.9v10.8h-2.9v-10.8h-2v-2.9h6.9v2.9h-2z"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-portrait" viewbox="0 0 60 60">
+ <title>
+ portrait
+ </title>
+ <path stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M46 30c0-2.4 2-1.7 2-4s-2-1.7-2-4v-7c1-.5 1.8-3.2 0-5s-5.2-1.2-6.1.7c-2.3.4-2.3-1.5-4.7-1.5s-2.9 1.8-5.2 1.8-2.9-1.8-5.2-1.8-2.4 1.9-4.7 1.5c-.9-1.9-4.3-2.5-6.1-.7s-1.2 4.5 0 5v7l-2 4s2 1.6 2 4-2 1.7-2 3.9 2 1.7 2 4v7c-1 .5-1.8 3.2 0 5s5.2 1.2 6.1-.7c2.3-.4 2.3 1.5 4.7 1.5s2.9-1.8 5.2-1.8 2.9 1.8 5.2 1.8 2.4-1.9 4.7-1.5c.9 1.9 4.3 2.5 6.1.7s1.2-4.5 0-5v-7l2-4s-2-1.5-2-3.9z" fill="none"></path>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M28 24v8h3M22 25h6M32 25h5M24 36c1.8 1.3 3.5 2 6 2 2.3 0 3.3-.9 5-2"></path>
+ </g>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M18 15h24v30h-24z"></path>
+ </symbol>
+ <symbol id="icon-radio" viewbox="0 0 60 60">
+ <title>
+ radio
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M20 22h30v20h-30z"></path>
+ <path stroke-linecap="round" stroke-linejoin="round" d="M29 15.3l17.9 6.7"></path>
+ <circle cx="30" cy="32" r="4.5"></circle>
+ <path d="M38 28h7M38 32h7M38 36h7M7 32h5M11.6 23.2l3.6 3.6M15.2 37.2l-3.6 3.6"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-son" viewbox="0 0 60 60">
+ <title>
+ son
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M22 26h6v8h-6zM28 34l7 5v-18l-7 5z"></path>
+ <circle cx="30" cy="30" r="18"></circle>
+ </g>
+ </symbol>
+ <symbol id="icon-alerte" viewbox="0 0 60 60">
+ <title>
+ alerte
+ </title>
+ <path fill="#fff" d="M25.9 42l2.3-10h-5.3l4.8-14h9.6l-6 10h6.6z"></path>
+ </symbol>
+ <symbol id="icon-top-100" viewbox="0 0 60 60">
+ <title>
+ top-100
+ </title>
+ <g fill="#fff">
+ <path d="M27.2 36.7v-10.4l-1.7.8v-2.7l3-1.4h1.6v13.7h-2.9zM36.4 36.8c-2.9 0-4.1-1.2-4.1-4.4v-5.2c0-3 1.2-4.3 4.1-4.3 2.9 0 4.1 1.3 4.1 4.3v5.2c0 3.1-1.2 4.4-4.1 4.4zm0-11.2c-.9 0-1.3.4-1.3 2v4.6c0 1.6.4 2 1.3 2s1.3-.4 1.3-2v-4.6c0-1.6-.4-2-1.3-2zM46.4 36.8c-2.9 0-4.1-1.2-4.1-4.4v-5.2c0-3 1.2-4.3 4.1-4.3 2.9 0 4.1 1.3 4.1 4.3v5.2c.1 3.1-1.2 4.4-4.1 4.4zm0-11.2c-.9 0-1.3.4-1.3 2v4.6c0 1.6.4 2 1.3 2s1.3-.4 1.3-2v-4.6c0-1.6-.4-2-1.3-2z"></path>
+ </g>
+ <path fill="#fff" d="M22 31l-7-8-7 8h3v5h8v-5z"></path>
+ </symbol>
+ <symbol id="icon-star" viewbox="0 0 20 20">
+ <title>
+ star
+ </title>
+ <path d="M10 2.3l1.9 5.9h6.2l-5 3.6 1.9 5.9-5-3.6-5 3.6 1.9-5.9-5-3.6h6.2z"></path>
+ </symbol>
+ <symbol id="icon-une" viewbox="0 0 60 60">
+ <title>
+ une
+ </title>
+ <path fill="#fff" d="M23.5 16.5l6.5-2.5 6.5 2.5-6.5 2.5z"></path>
+ <path stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none" d="M15 10h30v40h-30zM21 24h18v12h-18zM20 40h9M20 44h9M31 40h9M31 44h9"></path>
+ </symbol>
+ <symbol id="icon-video" viewbox="0 0 60 60">
+ <title>
+ video
+ </title>
+ <path fill="#fff" d="M37.4 30l-11.4-7.9v15.8z"></path>
+ <circle stroke="#fff" stroke-width="2" stroke-miterlimit="10" cx="30.2" cy="30" r="18" fill="none"></circle>
+ </symbol>
+ <symbol id="icon-scroll" viewbox="0 0 16 26">
+ <title>
+ scroll
+ </title>
+ <path stroke="#282828" stroke-width="2" stroke-miterlimit="10" d="M8 24.5c-3.6 0-6.5-2.9-6.5-6.5v-10c0-3.6 2.9-6.5 6.5-6.5s6.5 2.9 6.5 6.5v10c0 3.6-2.9 6.5-6.5 6.5z" fill="none"></path>
+ <circle fill="#2D2D2D" cx="8" cy="6.9" r="1.5"></circle>
+ </symbol>
+ <symbol id="icon-politiques" viewbox="0 0 60 60">
+ <title>
+ politiques
+ </title>
+ <g transform="translate(0.2,-104.59999)">
+ <rect style="fill:none;stroke-width:0.36275697" height="60" width="60" y="104.59999" x="-0.2"></rect>
+ <g transform="matrix(0.36275697,0,0,0.36275697,-0.12744861,104.8902)">
+ <path style="fill:#ffffff" d="m 93.2,64.4 c -4.1,0 -9.4,-4.5 -10.5,-5.5 L 81.8,58.1 82.2,48 c -2.9,-3.7 -4.6,-8.2 -4.6,-12.7 0,-10.2 7,-18.5 15.5,-18.5 8.5,0 15.5,8.3 15.5,18.5 0,4.5 -1.7,9 -4.6,12.7 l 0.4,10.1 -0.9,0.8 c -0.9,0.9 -6.2,5.5 -10.3,5.5 z m -6.3,-8.5 c 2.1,1.6 4.9,3.5 6.3,3.5 1.3,0 4.2,-1.8 6.2,-3.5 L 99,46.3 99.7,45.5 c 2.5,-2.9 4,-6.6 4,-10.2 0,-7.5 -4.7,-13.5 -10.5,-13.5 -5.8,0 -10.5,6.1 -10.5,13.5 0,3.6 1.5,7.3 4,10.2 l 0.7,0.8 z"></path>
+ <path style="fill:#ffffff" d="m 104.4,59 c 4.6,1.2 10.7,2.9 13.1,3.7 l 0.2,0.1 c 1,0.3 2.3,0.8 2.6,1.1 0.1,0.1 0.7,0.9 0.9,4.3 0.3,5.6 1.3,21.7 1.8,30.2 H 98.1 L 104.4,59 M 82,59 88.1,98.3 H 63.5 C 64,89.9 65,73.8 65.3,68.1 c 0.2,-3.5 0.8,-4.2 0.9,-4.3 0.2,-0.3 1.5,-0.7 2.6,-1.1 L 69,62.6 C 71.3,62 77.4,60.3 82,59 m 18.3,-6.2 -7.2,45.4 -7,-45.4 c 0,0 -14.7,3.9 -18.8,5.3 -4.1,1.4 -6.5,2.1 -7,9.9 -0.5,7.8 -2.1,35.5 -2.1,35.5 h 34.9 35.1 c 0,0 -1.7,-27.7 -2.1,-35.5 -0.5,-7.8 -2.8,-8.5 -7,-9.9 -4.1,-1.5 -18.8,-5.3 -18.8,-5.3 z"></path>
+ <path style="fill:#ffffff" d="M 126.8,144 H 35.2 V 114.5 L 20.8,98.8 h 120.8 l -14.8,15.8 z m -86.6,-5 h 81.6 v -26.5 l 8.2,-8.8 H 32.1 l 8.1,8.8 z"></path>
+ <rect style="fill:#ffffff" height="20.6" width="5" y="80.699997" x="27"></rect>
+ <path style="fill:#ffffff" d="m 21.6,88.3 c -0.7,0 -1.4,-0.3 -1.9,-1 -0.7,-1 -0.4,-2.4 0.6,-3.1 L 36.7,73 c 1,-0.7 2.4,-0.4 3.1,0.6 0.7,1 0.4,2.4 -0.6,3.1 L 22.9,87.9 c -0.4,0.2 -0.8,0.4 -1.3,0.4 z"></path>
+ <circle style="fill:#ffffff" r="6.0999999" cy="73.199997" cx="40.599998"></circle>
+ </g>
+ </g>
+ </symbol>
+ <symbol id="icon-food" viewbox="0 0 60 60">
+ <title>
+ food
+ </title>
+ <g transform="matrix(0.3,0,0,0.3,0.003,0)">
+ <polyline style="fill:none" points="-0.01 200 -0.01 0 199.99 0 199.99 200"></polyline>
+ <path style="fill:#ffffff" d="M 68.55,79.13 25.61,37.31 21.05,42 l 38,37.14 H 41 v 3.26 c 0,48.1 18.31,63.11 24.64,66.86 v 11.6 h 69.57 v -11.58 c 6.39,-3.69 24.64,-18.5 24.64,-66.88 v -3.27 z m 62.25,65.07 -2.13,0.79 v 9.32 H 72.19 v -7 -2.21 l -2,-0.83 C 69.97,144.18 48.55,134.81 47.64,85.71 h 105.7 c -0.97,49.4 -22.34,58.41 -22.54,58.49 z"></path>
+ <path style="fill:#ffffff" d="m 103,69.23 a 3.65,3.65 0 0 1 -3.09,-0.44 2.7,2.7 0 0 1 -0.62,-4.11 c 5.23,-6 2.82,-10.12 -0.51,-15.78 -3,-5.12 -6.76,-11.49 -2.85,-19.5 a 3.53,3.53 0 0 1 4.39,-1.56 2.82,2.82 0 0 1 1.75,3.86 c -2.67,5.45 -0.21,9.63 2.64,14.47 3.43,5.82 7.69,13.06 -0.12,22.06 a 3.38,3.38 0 0 1 -1.59,1"></path>
+ <path style="fill:#ffffff" d="m 120.73,69.21 a 3.38,3.38 0 0 0 1.53,-1.09 c 4.25,-5.5 5.18,-11.25 1.23,-17.57 -2.7,-4.31 -1.75,-6.21 -1.27,-8.39 0.48,-2.18 -0.23,-3.21 -2,-3.75 a 3.54,3.54 0 0 0 -4.3,1.8 c 0,0 -2.34,4.62 -0.6,8.93 0.93,2.29 2.48,4 3.22,5.85 1.23,3 1.23,5.93 -1.82,9.88 a 2.71,2.71 0 0 0 0.85,4.08 3.72,3.72 0 0 0 3.12,0.26"></path>
+ <path style="fill:#ffffff" d="m 86.72,69 a 3.39,3.39 0 0 0 1.41,-1.24 c 3.69,-5.91 4,-11.72 -0.52,-17.61 -3.11,-4 -2.36,-6 -2.1,-8.22 0.26,-2.22 -0.55,-3.17 -2.33,-3.54 a 3.54,3.54 0 0 0 -4.09,2.22 c 0,0 -1.88,4.84 0.29,9 1.15,2.18 2.87,3.75 3.79,5.49 1.53,2.91 1.81,5.79 -0.83,10 a 2.71,2.71 0 0 0 1.25,4 3.72,3.72 0 0 0 3.13,0"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-sciences" viewbox="0 0 60 60">
+ <title>
+ sciences
+ </title>
+ <g transform="matrix(3.7795275,0,0,3.7795275,982.69996,-913.79113)">
+ <g transform="matrix(0.09597945,0,0,0.09597945,-259.98684,241.89388)">
+ <path style="fill:#ffffff" d="m 74.33,34.86 a 6.49,6.49 0 1 1 6.48,-6.48 6.49,6.49 0 0 1 -6.48,6.48 z m 0,-9 a 2.49,2.49 0 1 0 2.48,2.49 2.49,2.49 0 0 0 -2.48,-2.46 z"></path>
+ <path style="fill:#ffffff" d="m 91.51,25.46 a 7.91,7.91 0 1 1 7.91,-7.91 7.92,7.92 0 0 1 -7.91,7.91 z m 0,-11.82 a 3.91,3.91 0 1 0 3.91,3.91 3.91,3.91 0 0 0 -3.91,-3.91 z"></path>
+ <path style="fill:#ffffff" d="M 125.5,134.07 97.2,71.41 V 48.88 c 4,-2.44 3.57,-4.47 3.41,-5.19 -0.69,-2.95 -4.52,-2.95 -6.15,-2.95 H 70.33 c -1.84,0 -5.66,0 -6.33,3 -0.41,1.86 0.76,3.57 3.59,5.19 v 22.5 l -28,62.41 -0.1,0.24 c -1.38,4.1 -1.26,7.19 0.37,9.46 2.63,3.63 7.91,3.62 13.52,3.61 h 59.27 c 5.2,0 10,-0.2 12.47,-3.61 1.64,-2.28 1.76,-5.37 0.38,-9.47 z M 72.89,72.55 V 46 h 19 v 6.07 h -8.8 v 4 h 8.81 v 4.57 h -8.81 v 4 h 8.81 v 4.58 h -8.81 v 4 h 9.13 l 15.48,34.25 H 57.21 Z m 47.94,67.88 c -1,1.43 -5.56,1.42 -9.2,1.41 H 53.37 c -3.63,0 -8.16,0 -9.2,-1.41 -0.51,-0.72 -0.4,-2.38 0.32,-4.55 l 10.34,-23.07 h 55.26 l 10.42,23.07 c 0.72,2.17 0.83,3.83 0.32,4.55 z"></path>
+ </g>
+ </g>
+ </symbol><!-- SOCIAL ICON -->
+ <symbol id="icon-facebook" viewbox="0 0 20 20">
+ <title>
+ Facebook
+ </title>
+ <path d="M5.7 7h1.8v-1.8000000000000003c0-.8 0-2 .6-2.8.6-.7 1.5-1.3 2.9-1.3 2.3 0 3.3.3 3.3.3l-.5 2.7s-.8-.2-1.5-.2-1.3.3-1.3 1v2.1h2.9l-.2 2.7h-2.7v9.2h-3.5v-9.2h-1.8v-2.7z"></path>
+ </symbol>
+ <symbol id="icon-whatsapp" viewbox="15 15 80.000000 80.000000">
+ <title>
+ Whatsapp
+ </title>
+ <g transform="matrix(1.25 0 0 -1.25 0 109.553)">
+ <path d="M58.113 37.793c-.752.412-4.45 2.407-5.143 2.69-.693.28-1.2.428-1.738-.32-.54-.747-2.074-2.418-2.54-2.913-.466-.495-.915-.54-1.667-.128-.752.41-3.192 1.314-6.02 4.033-2.202 2.116-3.646 4.683-4.065 5.467-.42.783-.003 1.183.395 1.55.358.33.8.867 1.2 1.3.4.433.54.747.814 1.25.272.5.16.953-.016 1.343-.178.39-1.57 4.22-2.15 5.777-.58 1.557-1.23 1.326-1.676 1.343-.448.017-.957.1-1.468.12-.51.018-1.348-.142-2.08-.884-.73-.736-2.78-2.516-2.92-6.29-.14-3.77 2.467-7.514 2.83-8.04.365-.524 4.983-8.7 12.658-12.06 7.677-3.36 7.716-2.335 9.125-2.26 1.41.075 4.604 1.685 5.31 3.45.706 1.764.763 3.3.583 3.626-.18.326-.684.538-1.435.95m-14.075-18.17a24.858 24.858 0 0 0-13.75 4.13l-9.604-3.073 3.123 9.28a24.86 24.86 0 0 0-4.76 14.654c0 13.782 11.212 24.993 24.992 24.993 13.78 0 24.992-11.21 24.992-24.994 0-13.78-11.213-24.99-24.994-24.99m0 55.012c-16.58 0-30.02-13.44-30.02-30.022a29.893 29.893 0 0 1 4.307-15.502L12.9 13.008l16.623 5.32a29.897 29.897 0 0 1 14.51-3.733c16.58 0 30.022 13.442 30.022 30.02 0 16.582-13.443 30.023-30.023 30.023" fill-rule="evenodd"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-twitter" viewbox="0 0 20 20">
+ <title>
+ Twitter
+ </title>
+ <path d="M19.5 4.1c-.7.3-1.5.5-2.2.6.8-.5 1.4-1.2 1.7-2.2-.8.4-1.6.8-2.5.9-.7-.8-1.7-1.2-2.8-1.2-2.2 0-3.9 1.7-3.9 3.9 0 .3 0 .6.1.9-3.3-.1-6.2-1.7-8.1-4-.3.6-.5 1.2-.5 2 0 1.3.7 2.5 1.7 3.2-.6 0-1.2-.2-1.7-.5 0 1.9 1.3 3.5 3.1 3.8-.3.1-.7.1-1 .1-.3 0-.5 0-.7-.1.5 1.5 1.9 2.7 3.6 2.7-1.3 1-3 1.7-4.8 1.7-.3 0-.6 0-.9-.1 1.7 1.1 3.8 1.8 6 1.8 7.2 0 11.1-5.9 11.1-11.1v-.5c.6-.4 1.3-1.1 1.8-1.9"></path>
+ </symbol>
+ <symbol id="icon-insta" viewbox="0 0 20 20">
+ <title>
+ insta
+ </title>
+ <path d="M14.6 2.5h-9.2c-1.6 0-2.9 1.3-2.9 2.9v9.3c0 1.6 1.3 2.9 2.9 2.9h9.3c1.6 0 2.9-1.3 2.9-2.9v-9.3c-.1-1.6-1.4-2.9-3-2.9zm.9 1.7h.3v2.5h-2.5v-2.6l2.2.1zm-7.7 4.3c.5-.7 1.3-1.2 2.2-1.2.9 0 1.7.4 2.2 1.1.3.4.5 1 .5 1.5 0 1.5-1.2 2.7-2.7 2.7s-2.7-1.1-2.7-2.6c0-.6.2-1.1.5-1.5zm8.3 6.1c0 .8-.6 1.4-1.4 1.4h-9.3c-.8 0-1.4-.6-1.4-1.4v-6.1h2.3c-.3.4-.4 1-.4 1.5 0 2.3 1.9 4.1 4.1 4.1 2.3 0 4.1-1.9 4.1-4.1 0-.5-.1-1.1-.3-1.5h2.3v6.1z"></path>
+ </symbol>
+ <symbol id="icon-vine" viewbox="0 0 20 20">
+ <title>
+ vine
+ </title>
+ <path d="M17 10c-.4.1-.8.1-1.2.1-2 0-3.6-1.4-3.6-3.9 0-1.2.5-1.8 1.1-1.8.6 0 1 .6 1 1.7 0 .6-.2 1.4-.3 1.8 0 0 .6 1.1 2.3.8.5-.9.7-1.9.7-2.8 0-2.5-1.2-3.9-3.5-3.9-2.4 0-3.7 1.8-3.7 4.2 0 2.4 1.1 4.4 2.9 5.3-.8 1.5-1.7 2.9-2.8 3.9-1.8-2.2-3.5-5.2-4.2-11h-2.7c1.3 9.7 5 12.8 6 13.4.6.3 1 .3 1.6 0 .8-.5 3.2-2.9 4.6-5.7.6 0 1.2-.1 1.9-.2v-1.9z"></path>
+ </symbol>
+ <symbol id="icon-later" viewbox="0 0 16 22">
+ <title>
+ later
+ </title>
+ <path d="M13.5 4.5h-11c0 3.4 2.1 6 5.5 6s5.5-2.6 5.5-6m-3.5 3h-4c-.7 0-1.2-.8-2-2h8c-.8 1.1-1.4 2-2 2"></path>
+ <path d="M.5 18.5h15v2h-15zM.5 1.5h15v2h-15zM2.5 17.5h11c0-3.4-2.1-6-5.5-6s-5.5 2.6-5.5 6m5.5-5c1.5 0 2.2.8 3 2h-6c.8-1.2 1.5-2 3-2"></path>
+ <path d="M9 10.5h-2v1h2z"></path>
+ </symbol>
+ <symbol id="icon-glass" viewbox="0 0 37 22">
+ <title>
+ glass
+ </title>
+ <path d="M27.8 4.5c-3.5 0-6.6 2-8.9 2-2.3 0-5.7-2-9.2-2s-4.2.2-9.2 1v1s2.3.1 2.3 4c0 3.5 3.5 7 7.1 7 3.6 0 7-2.5 7-5.9 0-3.4 2.1-3.1 2.1-3.1s2-.2 2 3c0 4.3 3.4 6 7 6s6.7-3.6 6.7-7.1c0-3.7 1.8-3.9 1.8-3.9v-1c-5-.8-5.2-1-8.7-1m-17.8 11c-2.9 0-5-1.8-5-4 0-2.8.5-3.5 1-4s2-1 4-1c1.8 0 3.5.7 4 1 1 .7 1 2.9 1 4 0 2.2-2.1 4-5 4m18 0c-2.9 0-5-1.8-5-4 0-1.1 0-3.3 1-4 .5-.3 2.2-1 4-1 2 0 3.5.5 4 1s1 1.2 1 4c0 2.2-2.1 4-5 4M9.5 8v1.5c2 0 2.5 1 2.5 2h1.5c0-3-1-3.5-4-3.5M27.5 8v1.5c2 0 2.5 1 2.5 2h1.5c0-3.1-1-3.5-4-3.5"></path>
+ </symbol>
+ <symbol id="icon-mail" viewbox="0 0 21 22">
+ <title>
+ Mail
+ </title>
+ <path d="M14.5 11.5l-4 3-4-3-6 6h20zM.5 6.5v9l5-5zM20.5 15.5v-9l-5 4zM20.5 4.5h-20l10 8z"></path>
+ </symbol>
+ <symbol id="icon-print" viewbox="0 0 27 22">
+ <title>
+ print
+ </title>
+ <path d="M23 6h-19c-1.6 0-3 1.3-3 3v4c0 1.7 1.4 3 3 3h2v-5h15v5h2c1.6 0 3-1.3 3-3v-4c0-1.7-1.4-3-3-3m1 4h-2v-2h2v2zM8 0h11v5h-11zM8 22h11v-10h-11v10zm9-3h-3v-1h3v1zm-6-4h6v1h-6v-1z"></path>
+ </symbol>
+ <symbol id="icon-losange-facebook" viewbox="0 0 116 43">
+ <title>
+ Facebook
+ </title>
+ <path d="M58 .6l-57.3 20.8 57.3 21 57.3-21-57.3-20.8zm1.7 20.9v8h-4v-8h-1v-3h1v-1.5c0-1.3.8-3.3 3.4-3.3h2.6v2.8h-1.8c-.3 0-.2 0-.2.6v1.4h1.9l-.3 3h-1.6z"></path>
+ </symbol>
+ <symbol id="icon-losange-insta" viewbox="0 0 116 43">
+ <title>
+ Instagram
+ </title>
+ <path d="M62.8 21.4c0 2.6-2.1 4.8-4.8 4.8-2.6 0-4.8-2.2-4.8-4.8 0-.6.1-.9.3-1.9h-3.1v7.3c0 .9 1.2 1.7 2.2 1.7h10.7c.9 0 2.2-.7 2.2-1.7v-7.3h-3.1c.2 1 .4 1.3.4 1.9zM58 24.6c1.7 0 3.1-1.4 3.1-3.1 0-.7-.2-1.3-.6-1.8-.6-.8-1.5-1.3-2.5-1.3s-1.9.5-2.5 1.3c-.4.5-.6 1.1-.6 1.8 0 1.7 1.4 3.1 3.1 3.1zM64.5 17.8v-3h-2.8l-.1 3zM58 .6l-57.3 20.8 57.3 21 57.3-21-57.3-20.8zm8.5 26.2c0 1.9-1.3 3.7-3.2 3.7h-10.6c-1.9 0-3.2-1.8-3.2-3.7v-10.6c0-1.9 1.3-3.7 3.2-3.7h10.7c1.9 0 3.2 1.8 3.2 3.7v10.6z"></path>
+ </symbol>
+ <symbol id="icon-losange-twitter" viewbox="0 0 116 43">
+ <title>
+ Twitter
+ </title>
+ <path d="M58 .6l-57.3 20.8 57.3 21 57.3-21-57.3-20.8zm6.5 18c0 4.4-3.4 9.6-9.6 9.6-1.9 0-3.7-.6-5.2-1.5h.8c1.6 0 3-.5 4.2-1.4-1.5 0-2.7-1-3.1-2.3l.6.1c.3 0 .5 0 .7-.1-1.5-.3-2.8-1.7-2.8-3.3 0 .3 1.1.4 1.7.4-.9-.6-1.4-1.6-1.4-2.8 0-.6.2-1.2.5-1.7 1.7 2 4.2 3.4 7 3.5-.1-.2-.1-.5-.1-.8 0-1.9 1.5-3.4 3.4-3.4 1 0 1.8.4 2.5 1.1.8-.2 1.5-.4 2.1-.8-.3.8-.8 1.4-1.5 1.9.7-.1 1.3-.3 1.9-.5-.5.7-1 1.3-1.7 1.7v.3z"></path>
+ </symbol><!-- READER -->
+ <symbol id="icon-reader-calendar" viewbox="0 0 31 40">
+ <title>
+ Calendar
+ </title>
+ <path d="M1 7v26h29v-26h-29zm2 8h7v7h-7v-7zm9 0h7v7h-7v-7zm-9 16v-7h7v7h-7zm9 0v-7h7v7h-7zm16 0h-7v-7h7v7zm0-9h-7v-7h7v7zm-7-9h-18v-4h25v4h-7z"></path>
+ </symbol>
+ <symbol id="icon-reader-download" viewbox="0 0 29 40">
+ <title>
+ download
+ </title>
+ <path d="M10 19.9l5.2 5.2 5.1-5.2-1.4-1.4-2.9 2.7v-19.2h-2v19l-2.6-2.5zM18 8v2h8v21h-23v-21h9v-2h-11v25h27v-25z"></path>
+ </symbol>
+ <symbol id="icon-reader-cross" viewbox="0 0 40 45">
+ <title>
+ cross
+ </title>
+ <path stroke-miterlimit="10" fill="none" d="M35.2 7.3l-30.4 30.4M35.2 37.7l-30.4-30.4"></path>
+ </symbol>
+ <symbol id="icon-reader-zoom-in" viewbox="0 0 43 45">
+ <title>
+ zoom-in
+ </title>
+ <g stroke="#fff" stroke-miterlimit="10" fill="none">
+ <circle stroke-width="1.2" cx="21.5" cy="22.5" r="20"></circle>
+ <path stroke-linecap="round" d="M22.1 16.1v14M29.6 22.6h-15"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-reader-zoom-out" viewbox="0 0 43 45">
+ <title>
+ zoom-out
+ </title>
+ <g stroke="#fff" stroke-miterlimit="10" fill="none">
+ <circle stroke-width="1.2" cx="21.5" cy="22.5" r="20"></circle>
+ <path stroke-linecap="round" d="M29.6 22.6h-15"></path>
+ </g>
+ </symbol><!-- READER -->
+ <symbol id="icon-viewer-previous" viewbox="0 0 20.7 40.8">
+ <title>
+ previous
+ </title>
+ <path fill="#878787" d="M.4.4l20 20"></path>
+ <path stroke="#fff" stroke-miterlimit="10" d="M.4.4l20 20" fill="none"></path>
+ <path fill="#878787" d="M20.4 20.4l-20 20"></path>
+ <path stroke="#fff" stroke-miterlimit="10" d="M20.4 20.4l-20 20" fill="none"></path>
+ </symbol>
+ <symbol id="icon-viewer-next" viewbox="0 0 20.7 40.8">
+ <title>
+ next
+ </title>
+ <path fill="#878787" d="M20.4 40.4l-20-20"></path>
+ <path stroke="#fff" stroke-miterlimit="10" d="M20.4 40.4l-20-20" fill="none"></path>
+ <path fill="#878787" d="M.4 20.4l20-20"></path>
+ <path stroke="#fff" stroke-miterlimit="10" d="M.4 20.4l20-20" fill="none"></path>
+ </symbol><!-- EBOOK -->
+ <symbol id="icon-truck" viewbox="0 0 29 21">
+ <title>
+ truck
+ </title>
+ <g stroke="#000" stroke-miterlimit="10" fill="none">
+ <circle stroke-width="2" stroke-linecap="round" cx="6.6" cy="16.3" r="2.8"></circle>
+ <path stroke-width="1.5" stroke-linejoin="round" d="M24.1 7.3l-2.1-5.6h-20.3v14h2.2c.3-1.2 1.4-2.1 2.7-2.1s2.4.9 2.7 2.1h10c.3-1.2 1.4-2.1 2.7-2.1 1.3 0 2.4.9 2.7 2.1h2.5v-6.3l-3.1-2.1z"></path>
+ <circle stroke-width="2" stroke-linecap="round" cx="22" cy="16.3" r="2.8"></circle>
+ <path stroke-width="2" stroke-linejoin="round" d="M26.2 8.7h-10v-4h7"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-visa" viewbox="0 0 27 20">
+ <title>
+ visa
+ </title>
+ <g fill-rule="evenodd" clip-rule="evenodd">
+ <path fill="#F6A90F" d="M2.8 17.9c5.1-2.2 12.3-4.2 21.8-2.2l.1-2.4c-10-1.1-17.2 2.1-21.9 4.4v.2z"></path>
+ <path fill="#005495" d="M8.1 11.6l2.3-7.3h1.9l-2.2 7.3zM7.3 4.3l-1.8 3.1c-.5.8-.7 1.2-.9 1.7 0-.6-.1-1.4-.1-1.9l-.2-2.9h-3.3v.2c.9 0 1.4.4 1.5 1.3l.6 5.8h2l4.1-7.3h-1.9zM22.6 11.6l-.1-1.1h-2.5l-.5 1.1h-2.1l3.9-7.3h2.7l.7 7.3h-2.1zm-.2-4.4v-1.7c-.1.4-.6 1.5-.9 2l-.7 1.6h1.7l-.1-1.9zM14.4 11.8c-1.4 0-2.3-.4-3-.8l.9-1.4c.6.3 1.1.7 2.1.7.3 0 .7-.1.9-.4.3-.5-.1-.7-.8-1.2l-.4-.2c-1.1-.9-1.6-1.7-1.1-2.9.3-.8 1.3-1.5 2.8-1.5 1 0 2 .4 2.6.9l-1.1 1.3c-.6-.4-1-.7-1.5-.7-.4 0-.7.2-.8.4-.3.4 0 .6.6 1l.4.3c1.4.9 1.7 1.8 1.4 2.7-.6 1.4-1.8 1.8-3 1.8M25.2 5.4h-.2v-.8h.3c.2 0 .3.1.3.2 0 .2-.1.2-.2.2l.2.3h-.1l-.2-.3h-.1v.4zm.1-.5c.1 0 .2 0 .2-.1s-.1-.1-.2-.1h-.2v.2h.2zm0 .8c-.4 0-.7-.3-.7-.7 0-.4.3-.7.7-.7.4 0 .7.2.7.7 0 .4-.3.7-.7.7m0-1.3c-.3 0-.6.2-.6.6 0 .3.2.6.6.6.3 0 .5-.2.5-.6.1-.4-.2-.6-.5-.6"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-mastercard" viewbox="0 0 26 20">
+ <title>
+ mastercard
+ </title>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F8B31E" d="M18 17.4h1.1l.4-.1.3-.1.4-.1.3-.1.4-.1.3-.2.3-.2.3-.1.3-.2.3-.2.3-.3.3-.2.2-.2.3-.3.2-.3.2-.3.3-.2.2-.3.1-.4.2-.3.1-.3.2-.4.1-.3.1-.4.1-.3v-.4l.1-.4v-1.5l-.1-.3v-.4l-.1-.4-.1-.3-.1-.4-.2-.3-.1-.3-.2-.3-.1-.4-.2-.3-.3-.3-.2-.2-.2-.3-.3-.3-.2-.2-.3-.2-.3-.3-.3-.2-.3-.2-.3-.1-.3-.2-.3-.2-.4-.1-.3-.1-.4-.1-.3-.1-.4-.1h-2.3l-.3.1-.4.1-.3.1-.4.1-.3.1-.3.2-.4.2-.3.1-.3.2-.3.2-.2.3-.3.2-.3.2-.2.3-.3.3-.2.2-.2.3-.2.3-.2.4-.1.3-.2.3-.1.3-.1.4-.1.3-.1.4-.1.4v.7l-.1.4.1.4v.7l.1.4.1.3.1.4.1.3.1.4.2.3.1.3.2.4.2.3.2.2.2.3.3.3.2.3.3.2.3.2.2.3.3.2.3.2.3.1.4.2.3.2.3.1.4.1.3.1.4.1.3.1h.8z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E20520" d="M8 17.4h1.2000000000000002l.3-.1.4-.1.3-.1.4-.1.3-.1.3-.2.4-.2.3-.1.3-.2.3-.2.2-.3.3-.2.3-.2.2-.3.3-.3.2-.3.2-.2.2-.3.2-.4.1-.3.2-.3.1-.4.1-.3.1-.4.1-.3.1-.4v-2.1999999999999997l-.1-.4-.1-.4-.1-.3-.1-.4-.1-.3-.2-.3-.1-.3-.2-.4-.2-.3-.2-.3-.2-.2-.3-.3-.2-.3-.3-.2-.3-.2-.2-.3-.3-.2-.3-.2-.3-.1-.4-.2-.3-.2-.3-.1-.4-.1-.3-.1-.4-.1-.3-.1h-2.3000000000000003l-.4.1-.3.1-.4.1-.3.1-.4.1-.3.2-.3.2-.3.1-.3.2-.3.2-.3.3-.3.2-.2.2-.3.3-.2.3-.3.2-.2.3-.2.3-.1.4-.2.3-.1.3-.2.3-.1.4-.1.3-.1.4v.4l-.1.3v1.5000000000000002l.1.4v.4l.1.3.1.4.1.3.2.4.1.3.2.3.1.4.2.3.2.2.3.3.2.3.3.3.2.2.3.2.3.3.3.2.3.2.3.1.3.2.3.2.4.1.3.1.4.1.3.1.4.1h.7z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F8B31E" d="M11.5 6.3h4.6v-.4h-4.3zM11.1 7.2h5v-.4h-4.8zM10.8 8.1h5.3v-.4h-5.2zM11 12.4h5.1v-.4h-5.3zM11.3 13.3h4.8v-.4h-4.9zM11.9 14.2h4.2v-.4h-4.5zM12.6 15.1h3.5v-.4h-3.8zM10.6 9h5.5v-.4h-5.4zM13.9 11.6h2.1v-.5h-2zM14.1 10.7h1.9v-.5h-1.8zM10.5 10.2h.5v.5h-.5z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M9.5 9.8h-.1v-.1h-.7l-.1.1h-.1v.30000000000000004h.1v.1h.2l.1.1h.1l.1.1h.1v.1h.1l.1.1v.7l-.1.1v.1l-.1.1-.1.1h-.1l-.1.1h-.1l-.1.1h-.9999999999999999l-.1-.1h-.2l.1-.6h.1v.1h.8999999999999999l.1-.1v-.30000000000000004l-.1-.1h-.1l-.1-.1h-.1l-.1-.1h-.1l-.1-.1h-.1l-.1-.1v-.7l.1-.1v-.1l.1-.1.1-.1.1-.1h.30000000000000004l.1-.1h.7999999999999999v.1h.30000000000000004z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M9.5 9.8h-.1v-.1h-.7l-.1.1h-.1v.30000000000000004h.1v.1h.2l.1.1h.1l.1.1h.1v.1h.1l.1.1v.7l-.1.1v.1l-.1.1-.1.1h-.1l-.1.1h-.1l-.1.1h-.9999999999999999l-.1-.1h-.2l.1-.6h.1v.1h.8999999999999999l.1-.1v-.30000000000000004l-.1-.1h-.1l-.1-.1h-.1l-.1-.1h-.1l-.1-.1h-.1l-.1-.1v-.7l.1-.1v-.1l.1-.1.1-.1.1-.1h.30000000000000004l.1-.1h.7999999999999999v.1h.30000000000000004l-.1.6"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M10.1 8.6h.7l-.1.6h.4l-.1.5h-.5l-.2 1.4v.2h.5v.5h-.30000000000000004v.1h-.5l-.1-.1h-.2v-.1h-.1v-.4z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M10.1 8.6h.7l-.1.6h.4l-.1.5h-.5l-.2 1.4v.2h.5v.5h-.30000000000000004v.1h-.5l-.1-.1h-.2v-.1h-.1v-.4l.5-2.7"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M11.6 10.7v.2l.1.1v.1h.1v.1h.1l.1.1h.8999999999999999v-.1h.2l.1-.1-.1.6h-.1v.1h-.30000000000000004l-.1.1h-.6l-.1-.1h-.30000000000000004l-.1-.1h-.1l-.1-.1-.1-.1-.1-.1-.1-.1v-.2l-.1-.1v-.8l.1-.1v-.1l.1-.2v-.1l.1-.1.1-.1.1-.1h.1l.1-.1.1-.1h.2l.2-.1h.4l.1.1h.2l.1.1h.1l.1.1v.1l.1.1.1.1v.8999999999999999l-.1.1h-1.8l.1-.5h1.1v-.30000000000000004l-.1-.1-.1-.1h-.4v.1h-.1v.1h-.1v.2h-.1v.1z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M11.6 10.7v.2l.1.1v.1h.1v.1h.1l.1.1h.8999999999999999v-.1h.2l.1-.1-.1.6h-.1v.1h-.30000000000000004l-.1.1h-.6l-.1-.1h-.30000000000000004l-.1-.1h-.1l-.1-.1-.1-.1-.1-.1-.1-.1v-.2l-.1-.1v-.8l.1-.1v-.1l.1-.2v-.1l.1-.1.1-.1.1-.1h.1l.1-.1.1-.1h.2l.2-.1h.4l.1.1h.2l.1.1h.1l.1.1v.1l.1.1.1.1v.8999999999999999l-.1.1h-1.8l.1-.5h1.1v-.30000000000000004l-.1-.1-.1-.1h-.4v.1h-.1v.1h-.1v.2h-.1v.1l-.1.5"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M17.6 9.3h-.1l-.1-.1h-.8999999999999999l-.1.1h-.1l-.1.1-.1.1v.1l-.1.1v.1l-.1.2v.2l-.1.1v.30000000000000004l.1.1v.1l.1.1v.1h.1l.1.1h.1v.1h.7999999999999999l.1-.1h.1v-.1l-.1.7h-.1v.1h-.30000000000000004l-.1.1h-.5l-.1-.1h-.2l-.1-.1h-.2l-.1-.1-.1-.1-.1-.1v-.1l-.1-.1-.1-.2v-1.0999999999999999l.1-.1v-.2l.1-.1v-.2l.1-.1.1-.1v-.1h.1v-.1h.1v-.1h.1v-.1h.2v-.1h.2l.1-.1h1.0999999999999999l.1.1h.2z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M17.6 9.3h-.1l-.1-.1h-.8999999999999999l-.1.1h-.1l-.1.1-.1.1v.1l-.1.1v.1l-.1.2v.2l-.1.1v.30000000000000004l.1.1v.1l.1.1v.1h.1l.1.1h.1v.1h.7999999999999999l.1-.1h.1v-.1l-.1.7h-.1v.1h-.30000000000000004l-.1.1h-.5l-.1-.1h-.2l-.1-.1h-.2l-.1-.1-.1-.1-.1-.1v-.1l-.1-.1-.1-.2v-1.0999999999999999l.1-.1v-.2l.1-.1v-.2l.1-.1.1-.1v-.1h.1v-.1h.1v-.1h.1v-.1h.2v-.1h.2l.1-.1h1.0999999999999999l.1.1h.2l-.1.7"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M23.8 11.9h-.7v-.3.1h-.1l-.1.1h-.1l-.1.1h-.6000000000000001l-.1-.1h-.1l-.1-.1v-.1l-.1-.1-.1-.1v-.1l-.1-.1v-.7999999999999999l.1-.1v-.2l.1-.1v-.1l.1-.1.1-.1v-.1l.1-.1.1-.1h.1l.1-.1h.1l.1-.1h.6l.1.1h.1l.1.1v.1h.1v.1l.2-1h.7z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M23.8 11.9h-.7v-.3.1h-.1l-.1.1h-.1l-.1.1h-.6000000000000001l-.1-.1h-.1l-.1-.1v-.1l-.1-.1-.1-.1v-.1l-.1-.1v-.7999999999999999l.1-.1v-.2l.1-.1v-.1l.1-.1.1-.1v-.1l.1-.1.1-.1h.1l.1-.1h.1l.1-.1h.6l.1.1h.1l.1.1v.1h.1v.1l.2-1h.7l-.6 3.3"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F8B31E" d="M22.7 11.3l.1-.1h.2v-.1h.1v-.1l.1-.1v-.1h.1v-.7999999999999999h-.1v-.1h-.1v-.1h-.4v.1h-.1v.1h-.1v.1l-.1.1v.1l-.1.1v.5l.1.1v.1l.1.1h.1z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M7.2 11.3l-.1.6h-.6v-.30000000000000004h.1-.1l-.1.1-.1.1h-.2v.1h-.6l-.1-.1h-.2v-.1h-.1v-.1l-.1-.1v-.7l.1-.1v-.1h.1v-.1l.1-.1h.1v-.1h.2l.1-.1h.6v-.1h.1l.1.1h.2v-.4h-.2v-.1h-.5l-.1.1h-.5v.1l.1-.6.1-.1h.6v-.1h.30000000000000004l.1.1h.4l.1.1h.1l.1.1.1.1.1.1v.4z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M7.2 11.3l-.1.6h-.6v-.30000000000000004h.1-.1l-.1.1-.1.1h-.2v.1h-.6l-.1-.1h-.2v-.1h-.1v-.1l-.1-.1v-.7l.1-.1v-.1h.1v-.1l.1-.1h.1v-.1h.2l.1-.1h.6v-.1h.1l.1.1h.2v-.4h-.2v-.1h-.5l-.1.1h-.5v.1l.1-.6.1-.1h.6v-.1h.30000000000000004l.1.1h.4l.1.1h.1l.1.1.1.1.1.1v.4l-.3 1.3"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E20520" d="M6.6 10.7v-.1h-.4v.1h-.2l-.1.1h-.1v.1l-.1.1v.2h.1v.1h.5v-.1h.1l.1-.1v-.1h.1v-.30000000000000004z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M2 11.9h-.7l.5-3.3h1.2l.1 1.9.9-1.9h1.2l-.6 3.3h-.7l.5-2.5h-.1l-1 2.5h-.7l-.1-.1v-1.6l-.1-.4v-.4z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M2 11.9h-.7l.5-3.3h1.2l.1 1.9.9-1.9h1.2l-.6 3.3h-.7l.5-2.5h-.1l-1 2.5h-.7l-.1-.1v-1.6l-.1-.4v-.4l-.4 2.5"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M19.7 11.3l-.1.6h-.6v-.30000000000000004h-.1v.1h-.1v.1h-.2l-.1.1h-.6l-.1-.1h-.1v-.1h-.1v-.1h-.1v-.2h-.1v-.4l.1-.1v-.2l.1-.1.1-.1.1-.1.1-.1h.2v-.1h.7v-.1h.1v.1h.30000000000000004v-.30000000000000004l-.1-.1h-.1l-.1-.1h-.5l-.1.1h-.4v.1h-.1l.2-.6.1-.1h.5l.1-.1h.2l.1.1h.5l.1.1.1.1h.1v.1h.1v.1l.1.1v.30000000000000004zM19.6 11.9l.1-.6-.1.6zM18.9 11.9h.7999999999999999-.6-.1zM19 11.6v.2l-.1.1h.1v-.30000000000000004zM18 11.9h.6v-.1h.2v-.1h.1l.1-.1h-.1l-.1.1-.1.1h-.2l-.1.1h-.4zM17.4 11.1v.30000000000000004l.1.1v.1l.1.1.1.1h.1v.1h.2-.1l-.1-.1h-.1v-.1h-.1v-.1h-.1v-.2l-.1-.1v-.2zM18.3 10.2h-.30000000000000004v.1h-.1l-.1.1h-.1v.1l-.1.1-.1.1v.1l-.1.1v.2l.1-.1v-.2l.1-.1v-.1l.1-.1h.1v-.1h.1l.1-.1h.1l.1-.1h.1zM18.8 10.1h-.2v.1h-.30000000000000004.1.1.1.1.1zM19.2 10.2v-.1h-.4v.1h.4zM19.2 10v.2-.1-.1zM18.9 9.8h.2v.1h.1v.1-.1-.1h-.1l-.1-.1h-.1zM17.8 9.9h.1v-.1h.6l.1-.1h.2l.1.1v-.1h-.6l-.1.1h-.4v.1zM18 9.3l-.2.6.2-.6zM19.1 9.1h-.7v.1h-.30000000000000004l-.1.1h.1v-.1h.9999999999999999zM20 10v-.30000000000000004l-.1-.1v-.1l-.1-.1h-.1v-.1h-.1l-.1-.1h-.2l-.1-.1h-.1v.1h.30000000000000004l.1.1h.1l.1.1h.1v.1l.1.1v.1l.1.1v.1l-.1.1zM19.7 11.3l.3-1.3h-.1l-.2 1.3z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#F8B31E" d="M19.1 10.7v-.1h-.4l-.1.1h-.2v.1h-.1v.1h-.1v.30000000000000004l.1.1h.5v-.1h.1v-.1h.1v-.1l.1-.1v-.2z"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M24.3 11.5v-.2h.1v-.1h.4l.1.1v.1l.1.1h-.1v-.1h-.1v-.1h-.1l-.1-.1v.1h-.2v.1l-.1.1zM24.5 11.5v-.1h.2v.1h-.1.1v-.1h-.2v.1zM24.3 11.5v.2l.1.1.1.1h.2l.1-.1h.1v-.1l.1-.1v-.1h-.1v.2h-.1v.1h-.30000000000000004l-.1-.1-.1-.1v-.1zM24.5 11.5v.2-.1h.1l.1.1v-.2h-.2z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" d="M24.3 11.5v-.30000000000000004h.7999999999999999v.7h-.7999999999999999v-.4m.2.2l-.1-.3h.1l.1.1h-.1l-.1-.1h-.1v.3m.3-.2v-.1h-.1l.1.1m0 .3h.1v-.4h-.4v.4h.3" fill="none"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M19.9 11.9h.7l.2-1.5h.1v-.2l.1-.1v-.1h.1v-.1h.2v-.1h.4l.1-.6h-.4l-.1.1-.1.1h-.1v.1l-.1.1.1-.4h-.7z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M19.9 11.9h.7l.2-1.5h.1v-.2l.1-.1v-.1h.1v-.1h.2v-.1h.4l.1-.6h-.4l-.1.1-.1.1h-.1v.1l-.1.1.1-.4h-.7l-.5 2.7"></path>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M13.2 11.9h.7999999999999999l.2-1.5v-.1l.1-.1v-.1l.1-.1.1-.1h.30000000000000004l.1-.1v.1h.1v-.30000000000000004l.1-.1v-.2h.1v-.1h-.5v.1h-.1v.1h-.1l-.1.1v.1h-.1l.1-.4h-.7z"></path>
+ <path stroke="#fff" stroke-width=".216" stroke-miterlimit="2.613" fill="none" d="M13.2 11.9h.7999999999999999l.2-1.5v-.1l.1-.1v-.1l.1-.1.1-.1h.30000000000000004l.1-.1v.1h.1v-.30000000000000004l.1-.1v-.2h.1v-.1h-.5v.1h-.1v.1h-.1l-.1.1v.1h-.1l.1-.4h-.7l-.5 2.7"></path>
+ </symbol><!-- USER MENU -->
+ <symbol id="icon-user-libe" viewbox="0 0 34 30">
+ <title>
+ user-libe
+ </title>
+ <path d="M17 21.2h-.2l-15.5-5.7c-.2-.1-.4-.3-.4-.6s.2-.5.4-.6l15.5-5.6h.4l15.5 5.6c.2.1.4.3.4.6s-.2.5-.4.6l-15.5 5.7h-.2zm-13.7-6.2l13.7 5 13.7-5-13.7-5-13.7 5z"></path>
+ </symbol>
+ <symbol id="icon-user-doc" viewbox="0 0 30 30">
+ <title>
+ user-doc
+ </title>
+ <path fill="#fff" d="M22 6v18h-14v-18h14m0-1h-14c-.5 0-1 .5-1 1v18c0 .5.5 1 1 1h14c.5 0 1-.5 1-1v-18c0-.5-.5-1-1-1zM10 9h10v1h-10zM10 12h10v1h-10zM10 15h10v1h-10zM10 18h6v1h-6z"></path>
+ </symbol>
+ <symbol id="icon-user-doc-list" viewbox="0 0 30 30">
+ <title>
+ user-doc-list
+ </title>
+ <path d="M22.5 5.5v19h-15v-19h15m0-1h-15c-.5 0-1 .5-1 1v19c0 .5.5 1 1 1h15c.5 0 1-.5 1-1v-19c0-.5-.5-1-1-1zm-13 5h6.8v1h-6.8zm0 5h6.8v1h-6.8zm0 5h6.8v1h-6.8z"></path>
+ <circle cx="19.4" cy="10" r="1.1"></circle>
+ <circle cx="19.4" cy="14.8" r="1.1"></circle>
+ <circle cx="19.4" cy="19.7" r="1.1"></circle>
+ </symbol>
+ <symbol id="icon-user-mail" viewbox="0 0 30 30">
+ <title>
+ user-mail
+ </title>
+ <path fill="#fff" d="M23.6 8.2v13.6h-17.2v-13.6h17.2m0-1h-17.2c-.5 0-1 .5-1 1v13.6c0 .5.5 1 1 1h17.2c.5 0 1-.5 1-1v-13.6c0-.5-.5-1-1-1z"></path>
+ <path stroke="#fff" stroke-linejoin="round" stroke-miterlimit="10" fill="none" d="M6.1 8l8.9 9.3 8.9-9.3M6.1 21.7l7.1-6.5M23.9 21.7l-7.1-6.5"></path>
+ </symbol>
+ <symbol id="icon-user-security" viewbox="0 0 30 30">
+ <title>
+ user-security
+ </title>
+ <path d="M19 13v-4c0-2.2-1.8-4-4-4s-4 1.8-4 4v4h-2v11h12v-11h-2zm-7-4c0-1.6 1.4-3 3-3s3 1.4 3 3v4h-6v-4zm8 14h-10v-9h10v9zM12 16h6v1h-6zM12 19h6v1h-6z"></path>
+ </symbol>
+ <symbol id="icon-user-settings" viewbox="0 0 30 30">
+ <title>
+ user-settings
+ </title>
+ <path stroke="#fff" stroke-linejoin="round" stroke-miterlimit="10" d="M21.5 14.9v-.6l2-1-1-2.3-1.9.5c-.5-.9-1.3-1.6-2.2-2.2l.6-2-2.3-.9-1 1.9h-.6c-.8 0-1.5.1-2.2.4l-1.5-1.7-2 1.4 1 1.9c-.6.7-1.2 1.5-1.5 2.4h-2.1l-.2 2.4 2.1.5c.1 1 .5 1.8 1 2.6l-1.4 1.8 1.8 1.7 1.7-1.2c.7.4 1.5.7 2.3.8l.6 2.2 2.4-.2v-2.2c1-.3 1.8-.7 2.5-1.5l1.9 1 1.3-2-1.7-1.4c.2-.7.4-1.5.4-2.3zm-6.5 2.5c-1.3 0-2.4-1.1-2.4-2.4 0-1.3 1.1-2.4 2.4-2.4 1.3 0 2.4 1.1 2.4 2.4 0 1.3-1.1 2.4-2.4 2.4z" fill="none"></path>
+ </symbol>
+ <symbol id="icon-user-shop" viewbox="0 0 30 30">
+ <title>
+ user-shop
+ </title>
+ <path fill="#fff" d="M21.2 8.7l-.8 7.8h-13.3l-1.6-7.8h15.7m1.1-1h-18l2 9.8h15l1-9.8zM15.3 8.7h1v7.8h-1zM10.3 8.7h1v7.8h-1z"></path>
+ <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" fill="none" d="M25.2 5.6h-2.9l-1.7 14.6h-13.9"></path>
+ <circle fill="#fff" cx="10" cy="23.3" r="1.7"></circle>
+ <circle fill="#fff" cx="17.6" cy="23.3" r="1.7"></circle>
+ </symbol>
+ <symbol id="icon-user-star" viewbox="0 0 30 30">
+ <title>
+ user-star
+ </title>
+ <path fill="#fff" d="M15 9.2l1.3 4h4.2l-3.4 2.5 1.3 4-3.4-2.5-3.4 2.5 1.3-4-3.4-2.5h4.2l1.3-4m0-1c-.4 0-.8.3-1 .7l-1 3.3h-3.5c-.4 0-.8.3-1 .7-.1.4 0 .9.4 1.1l2.8 2.1-1.1 3.3c-.1.4 0 .9.4 1.1.2.1.4.2.6.2s.4-.1.6-.2l2.8-2.1 2.8 2.1c.2.1.4.2.6.2s.4-.1.6-.2c.4-.3.5-.7.4-1.1l-1.1-3.3 2.8-2.1c.4-.3.5-.7.4-1.1-.1-.4-.5-.7-1-.7h-3.5l-1-3.3c-.2-.5-.6-.7-1-.7z"></path>
+ <circle stroke="#fff" stroke-width="1.5" stroke-linejoin="round" stroke-miterlimit="10" cx="15" cy="15" r="12" fill="none"></circle>
+ </symbol><!-- ABO -->
+ <symbol id="icon-abo-ribbon" viewbox="0 0 15 24">
+ <title>
+ Ruban abo
+ </title>
+ <path fill="#fff" d="M13.2 23c-.2 0-.4-.1-.5-.2l-5.2-5.3-5.2 5.3c-.2.2-.5.3-.8.2-.3-.2-.5-.4-.5-.7v-20.5c0-.2.1-.4.2-.5s.4-.3.6-.3h11.5c.4 0 .7.3.7.7v20.5c0 .3-.2.6-.5.7-.1.1-.2.1-.3.1zm-5.7-7.4c.2 0 .4.1.5.2l4.5 4.7v-18l-10-.1v17.9l4.5-4.4c.1-.2.3-.3.5-.3z"></path>
+ </symbol>
+ <symbol id="icon-gold-diamond" viewbox="0 0 40 15">
+ <title>
+ Losange orange
+ </title>
+ <path fill="#F7AF13" d="M.8 7.5l19.2-7 19.2 7-19.2 7-19.2-7"></path>
+ </symbol>
+ <symbol id="icon-list-check" viewbox="0 0 20 15">
+ <title>
+ List check
+ </title>
+ <path fill="#00BC84" d="M1.54 6.758l2.828-2.828 5.657 5.657-2.828 2.828zM5.743 11.051l9.899-9.899 2.828 2.828-9.899 9.899z"></path>
+ </symbol>
+ <symbol id="icon-most-read" viewbox="0 0 94 161">
+ <title>
+ Most read
+ </title>
+ <path fill="#1D1D1B" d="M47 .3l-46.3 80.2 46.3 80.2 46.3-80.2z"></path>
+ </symbol>
+ <symbol id="icon-ptit-libe" viewbox="-269 271 60 60">
+ <title>
+ Ptit Libé
+ </title>
+ <path fill="#fff" d="M-243.5 292.5c.2.6 1.1.8 1.6.5s.7-.9.5-1.5-.9-.7-1.3-.6c-.9.1-1 1.1-.8 1.6zM-238.7 291.5c0 .7.4 1.2.9 1.3 1.1.2 1.6-.5 1.6-1.3s-.6-1.7-1.8-1.4c-.4.2-.7.8-.7 1.4zM-239.4 307.6c-.5 0-3.1 1.9-3.1 2.4 0 .4 2.6 2 3 2.1.4.1 3.5-1.1 3.5-2.1 0-.6-2.6-2.4-3.4-2.4z"></path>
+ <path fill="#fff" d="M-228.8 304.3c-.3-.3-.7-.4-1.2-.4-.3 0-1.6.4-1.7.4 0-.1-1.1-4.1-1.3-5.7v-.2c3.5-1.5 5-4.1 5.1-7.5.1-5.1-3.2-8.5-7.3-9.7-.9-.3-1.7.2-1.8.8-.1.7.3 1.1.9 1.3 2.7.8 5.6 2.9 6.1 6.3s-1.9 6-4.4 6.9c-1.8.6-4.1 1-6.3 1-2.7 0-9.2-1-9.5-6.5-.2-3.6 2.5-6.3 5.4-7.5.6-.2 1.1-.9.8-1.5-.2-.5-1-.6-1.8-.3-3.9 1.6-5.9 4.5-6.5 7.8-.9 6.9 6.3 9.3 6.7 9.4-.3 1-.9 5.1-.9 5.1-.2 0-2-.2-2.1-.2h-.7c-1.8 0-2.2 1.1-2.3 1.8-.1.9-.2 2 .5 2.6.5.5 1.3.5 1.5.5h1.8c.5 0 .9-.1 1.3-.3l-.8 5.7c-.1.7.3 1.4 1 1.5.8.2 2 .3 2.9.4-.1.7-.1 1.6-.2 2.9-.6-.1-1.5-.1-2.1-.1h-.5c-.7 0-1.3.6-1.3 1.3 0 .1-.2 2.1.3 2.8.5 1 4.4.4 5-.2.6-.6.7-1.4.8-2.3.1-1 .3-4 .3-4 .8 0 1.5.1 2.3.1h.8c0 .9 0 2.2.1 3v.6s0-.1 0 0c0 1 .2 1.9.7 2.6.6.7 3.4.4 3.6.3 1.2-.3 1.7-2.5 1.7-2.6.1-.4.1-.7-.1-1.1-.2-.3-.7-.5-1.1-.5 0 0-1.7-.1-2.3-.1 0-.8 0-1.4-.1-2.5.5 0 4.2-.4 4.8-1.5.3-.6-.4-5.1-.5-5.7h.5c.7 0 1.4-.2 1.7-.3 1.2-.3 1-3.8.2-4.4zm-18.9 2.9c-.3.2-2.1 0-2.3-.2s-.2-.6 0-1.1c.2-.5.7-.4 1.1-.4h1.6c0 .5-.3 1.6-.4 1.7zm4.1 14.8c-.5.1-1 .3-1.7.3-.6.1-.6-.1-.6-.6-.1-.4 0-.7 0-1.1 1 0 1.9.1 2.9.3-.2.3 0 1-.6 1.1zm9.6-1.8c-.1.2-.1.5-.2.7-.2.5-.3.5-.8.6-.4 0-.9.1-1.1 0-.5-.2-.4-.7-.4-1.2.8 0 1.7 0 2.5-.1zm1-7c-3.5.8-8 1.2-12.1.1l1.3-13.7c.6.1 2.5.2 3.1.2 1.6 0 3.8-.2 5.8-.7.7 4.5 2 14 1.9 14.1zm3.3-5.8c-.2 0-1.3.5-1.6.2-.1-.1-.3-1.4-.3-1.8.4-.1 1.4-.6 1.9-.2 0 .1.4 1.7 0 1.8z"></path>
+ </symbol>
+ <symbol id="icon-sport" viewbox="0 0 60 60">
+ <title>
+ sport
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <circle cx="30" cy="30" r="18"></circle>
+ <path d="M29.6 48c-.1-4.5-1.9-8.9-5.3-12.3-3.4-3.4-7.9-5.2-12.3-5.3m18.4-18.4c.1 4.5 1.9 8.9 5.3 12.3 3.4 3.4 7.9 5.2 12.3 5.3m-30.7-12.3l25.4 25.4m0-25.4l-25.4 25.4"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-blog" viewbox="0 0 60 60">
+ <title>
+ blog
+ </title>
+ <g stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none">
+ <path d="M39 28v21h-24v-32h17M27.035 27.005l16.97-16.97 4.03 4.03-16.97 16.97zm3.965 3.995l-4-4-2 6zm-12 10h7m2 0h7m-16-3h7m2 0h7m-16 6h7m2 0h7"></path>
+ </g>
+ </symbol>
+ <symbol id="icon-voyage" viewbox="0 0 60 60">
+ <title>
+ voyage
+ </title>
+ <path d="M47 45c-2.7-6.6-9.5-11-17-11s-14.3 4.4-17 11h34zm-38 0h38m-25 4h12m16-4h3m-37 4h3m13-29v14h-3v-14m3 0c.8-.5 7.3.3 10 3-1.1-4.7-7.1-8-11-8h-1c-3.9 0-9.9 3.3-11 8 2.7-2.7 9-3.5 10-3m-4-4s-1.7-2.1-6-1.5c2.4-3.5 9.2-3.3 11.6.3m5.4 1.2s1.7-2.1 6-1.5c-2.4-3.5-9.1-3.3-11.6.3" stroke="#fff" stroke-width="2" stroke-miterlimit="10" fill="none"></path>
+ </symbol><!-- 2017 -->
+ <defs>
+ <lineargradient id="Gradient_1" gradientunits="userSpaceOnUse" x1="0" y1="18.5" x2="37" y2="18.5">
+ <stop offset="0" stop-color="#3857C4"></stop>
+ <stop offset="1" stop-color="#E72743"></stop>
+ </lineargradient>
+ </defs>
+ <symbol id="icon-2017" viewbox="0, 0, 37, 37">
+ <g id="Calque_1">
+ <path d="M37,37 L0,37 L0,0 L37,0 z" fill="url(#Gradient_1)"></path>
+ <g>
+ <path d="M8.312,15.566 C5.879,15.566 4.71,16.56 4.403,18.24 L4.403,18.42 L6.539,18.42 L6.539,18.145 C6.662,17.539 7.231,17.195 8.291,17.195 C9.334,17.195 9.957,17.714 9.957,17.714 L9.957,17.721 C9.957,18.063 9.781,18.162 4.83,19.957 L4.83,21.41 L11.665,21.41 L11.665,20.128 L8.502,20.128 C8.502,20.128 11.775,18.327 11.665,17.589 L11.665,17.524 C11.775,16.26 10.701,15.566 8.312,15.566" fill="#FFFFFF"></path>
+ <path d="M18.073,18.612 C18.073,19.534 17.516,19.841 16.353,19.841 C15.168,19.841 14.655,19.519 14.655,18.612 L14.655,18.546 C14.655,17.595 15.189,17.302 16.353,17.302 C17.538,17.302 18.073,17.58 18.073,18.546 z M16.154,15.587 C13.63,15.587 12.519,16.609 12.519,18.394 L12.519,18.561 C12.519,20.687 13.666,21.571 16.154,21.571 C18.57,21.571 19.781,20.636 19.781,18.561 L19.781,18.394 C19.781,16.588 18.613,15.587 16.154,15.587" fill="#FFFFFF"></path>
+ <path d="M20.636,16.618 L20.636,18.437 L21.917,17.758 L21.917,21.41 L24.054,21.41 L24.054,15.429 L22.958,15.429 z" fill="#FFFFFF"></path>
+ <path d="M25.762,15.429 L25.762,17.137 L30.145,17.137 C28.656,18.209 27.158,20.03 26.791,21.402 L29.103,21.409 C29.419,20.176 30.497,18.635 32.597,16.741 L32.597,15.429 z" fill="#FFFFFF"></path>
+ </g>
+ </g>
+ </symbol></svg>
+ <script>
+ <![CDATA[
+
+ // Facebook PW
+ var getParameterByName = function(name, url) {
+ if (!url) url = window.location.href;
+ name = name.replace(/[\[\]]/g, '\\$&');
+ var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
+ results = regex.exec(url);
+ if (!results) return null;
+ if (!results[2]) return '';
+ return decodeURIComponent(results[2].replace(/\+/g, ' '));
+ }
+
+ var FBRedirect = function() {
+ var search = location.search.substring(1);
+ var hasSurface = getParameterByName('surface')
+ if(hasSurface) {
+ var nxturl = 'https://bolq.liberation.fr/paywall' + document.location.search;
+ document.location.href= nxturl;
+ }
+ };
+ FBRedirect();
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var session_cookie = getCookie('djazsession'); var libeUserInfo = { authenticated: false, access_level: "BAS", }; var isPubActive = true; if (session_cookie) { document.write('<script type="text/javascript" src="/session_info/?format=json&confirm=' + escape(session_cookie) + '"></' + 'script>'); };
+ var is_responsive_mobile = (document.documentElement.clientWidth <= 640);
+ var releaseSuffix = "c05ba9975432d75cc66fb3e70859d5b6";
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ libeUserInfo["cookie_domain"] = '.liberation.Fr';
+ libeUserInfo["softwarer_blocker"] = 1;
+ libeUserInfo["token_host"] = 'token.liberation.fr';
+ var dispayName = (typeof libeUserInfo['displayname'] == 'undefined') ? '' : libeUserInfo['displayname']; var accessLevel = (typeof libeUserInfo['access_level'] == 'undefined') ? 'BAS' : libeUserInfo['access_level']; var isPubActive = !(accessLevel == 'PRE' || accessLevel == 'ESS' || accessLevel == 'MAYDAY'); var bodyClass = ' ' + 'access-' + accessLevel.toLowerCase(); bodyClass += ' ' + (libeUserInfo['authenticated'] ? 'authenticated' : 'unlogged'); document.body.className = document.body.className + bodyClass;
+ // Global api url
+ apiUrl = "https://www.liberation.fr/api/v3/";
+ currentPath = '/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047';
+ flavour = 'desktop';
+ libeSiteUrl = 'https://www.liberation.fr';
+
+ objectId = '1612047'
+
+ // Check kill switch for ads.
+
+ // Recovery
+ if (typeof libeUserInfo !== 'undefined' && libeUserInfo.access_level == 'MAYDAY') { document.body.className = document.body.className + ' recovery-mode'; }
+ //]]>
+ </script>
+ <div role="navigation">
+ <div class="header-fix-nav">
+ <div class="alert-nav red-alert js-alert">
+ <a href="" class="alert-nav-label js-alert-link"></a>
+ </div>
+ <nav class="main-nav">
+ <div class="left-nav v-centerer">
+ <a role="button" class="button menu-nav open v-centered open"><span class="menu-nav-label">Menu</span></a> <a href="https://www.liberation.fr" class="menu-nav-libe-logo v-centered"><img src="https://statics.liberation.fr/newnext/images/logo-libe.svg" height="42" alt="Libération" /></a>
+ </div>
+ <div class="subs-label v-centerer js-nav-label"></div>
+ <div class="right-nav v-centerer">
+ <a href="" role="button" class="button v-centered init twitter-share"><span class="button-icon"><svg class="icon fill-black" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></span></a> <a href="" role="button" class="button v-centered init facebook-share"><span class="button-icon"><svg class="icon fill-black" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></span></a>
+ <div class="button search-nav v-centered">
+ <form action="https://www.liberation.fr/recherche/" method="get">
+ <input type="search" name="q" class="search-nav-input" placeholder="rechercher" /> <button type="submit" class="search-nav-button"><svg class="icon fill-black" role="img" width="21" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-search"></use></svg></button>
+ </form>
+ </div><a href="https://www.liberation.fr/direct/" class="button v-centered js-nav-live-button"><span class="button-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon" width="26" height="22" viewbox="0 0 26 22">
+ <path class="stroke-anim" stroke="#000" stroke-width="2" stroke-miterlimit="10" d="M15.5 8c.7-1 2-2 4-2 3 0 5 2.1 5 5s-2.1 5-5 5c-3.3 0-5-2.1-6.5-5s-3.2-5-6.5-5c-2.9 0-5 2.1-5 5s2 5 5 5c2 0 3.2-.9 4-2" fill="none"></path></svg></span></a> <a href="https://www.liberation.fr/top100/" role="button" class="button v-centered"><span class="button-icon"><svg class="icon fill-black" role="img" width="26" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-100"></use></svg></span></a> <a href="http://token.liberation.fr/accounts/login/" role="button" class="button nav-user-button v-centered js-nav-user-button"><span class="button-icon"><svg class="icon fill-black" role="img" width="21" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-user"></use></svg></span> <span class="button-label js-nav-user-button-name">Connexion</span></a> <a href="http://token.liberation.fr/accounts/offers/" role="button" class="subscribe-button v-centered js-nav-subscribe-button"><span>Abonnement</span></a>
+ </div>
+ <div class="title-nav-container">
+ <div class="title-nav-wrap width-wrap width-padded v-centerer">
+ <div class="title-nav hide v-centered">
+ <div class="title-nav-article ellipsis show">
+ <div class="share">
+ <div class="share-link js-nav-share">
+ <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;t=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6" class="js-share-facebook" rel="nofollow"><svg class="icon share-link-fb" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></a> <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;text=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6&amp;via=libe&amp;related=libe" class="js-share-twitter" rel="nofollow"><svg class="icon share-link-tw" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></a>
+ </div>
+ </div><span class="nav-title js-nav-title">Screenshot&#160;: «Vape Wave», «6&#160;Days», «Alphonse Président»…</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </nav>
+ </div>
+ <div class="menu hide">
+ <div class="menu-container">
+ <div class="mosaic">
+ <div class="mosaic-container clearfix">
+ <ul class="menu-univers">
+ <li class="menu-univer">
+ <a class="menu-univer-item v-centerer active" data-item-target="first-item" href="https://www.liberation.fr/france,11">
+ <div class="v-centered">
+ <span class="menu-univer-title">France</span>
+ </div></a>
+ </li>
+ <li class="menu-univer">
+ <a class="menu-univer-item v-centerer" data-item-target="second-item" href="https://www.liberation.fr/planete,10">
+ <div class="v-centered">
+ <span class="menu-univer-title">Planète</span>
+ </div></a>
+ </li>
+ <li class="menu-univer">
+ <a class="menu-univer-item v-centerer" data-item-target="third-item" href="https://www.liberation.fr/debats,18">
+ <div class="v-centered">
+ <span class="menu-univer-title">Idées</span>
+ </div></a>
+ </li>
+ <li class="menu-univer">
+ <a class="menu-univer-item v-centerer" data-item-target="fourth-item" href="/">
+ <div class="v-centered">
+ <span class="menu-univer-title">Culture</span>
+ </div></a>
+ </li>
+ <li class="menu-univer">
+ <a class="menu-univer-item v-centerer" data-item-target="fifth-item" href="https://www.liberation.fr/checknews,100893">
+ <div class="v-centered">
+ <span class="menu-univer-title">Checknews</span>
+ </div></a>
+ </li>
+ </ul>
+ <div class="menu-univers-pictures">
+ <div class="menu-pictures first-item clearfix show">
+ <div class="menu-pictures-col-1">
+ <a href="https://www.liberation.fr/france/2019/03/01/c-est-important-que-les-agricultures-alternatives-soient-visibles-au-salon_1712334" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199482-imagappel-agriculture.jpg?modified_at=1551361794&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ «C'est important que les agricultures alternatives soient visibles au Salon»
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 15:20</span>
+ </div></a> <a href="https://www.liberation.fr/france/2019/03/01/immobilier-a-paris-le-metre-carre-frole-la-barre-des-10-000-euros_1712329" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199725-000_17v5u6.jpg?modified_at=1551449721&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Immobilier&#160;: à Paris, le mètre carré frôle la barre des 10&#160;000&#160;euros
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 15:15</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2">
+ <a href="https://www.liberation.fr/france/2019/03/01/air-france-klm-paris-et-la-haye-calment-le-jeu_1712338" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199678-le-ministre-de-l-economie-bruno-le-maire-d-et-son-homologue-wopke-hoekstra-g-lors-d-une-conference-d.jpg?modified_at=1551444312&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Air France-KLM&#160;: Paris et La&#160;Haye calment le jeu
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 13:16</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2 menu-pictures-last-col">
+ <a href="https://www.liberation.fr/france/2019/03/01/ligue-du-lol-deux-salaries-licencies-aux-inrocks_1712320" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1169564-logo-a-chaud.png?modified_at=1551434128&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Ligue du LOL : deux salariés licenciés aux «Inrocks»
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 10:55</span>
+ </div></a>
+ </div>
+ </div>
+ <div class="menu-pictures second-item clearfix">
+ <div class="menu-pictures-col-2">
+ <a href="https://www.liberation.fr/planete/2019/03/01/fespaco-des-actrices-lancent-une-petition-contre-un-realisateur-burkinabe_1712360" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199722-000_1e1213.jpg?modified_at=1551448366&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Fespaco&#160;: des actrices lancent une pétition contre un réalisateur burkinabè
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 15:17</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-1">
+ <a href="https://www.liberation.fr/planete/2019/03/01/vonhier-un-hashtag-ou-debattre-de-l-obsession-des-allemands-pour-les-origines_1712171" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199676-outrerhin.jpg?modified_at=1551433451&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ #VonHier, un hashtag où débattre de l'obsession des Allemands pour les origines
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 10:44</span>
+ </div></a> <a href="https://www.liberation.fr/planete/2019/02/28/proces-nemmouche-defense-et-indecence_1712248" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199577-prodlibe-2019-0257-proces-nemmouche-a-bruxelles.jpg?modified_at=1551383309&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Procès Nemmouche&#160;: défense et indécence
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 20:36</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2 menu-pictures-last-col">
+ <a href="https://www.liberation.fr/planete/2019/02/28/triple-inculpation-imminente-pour-un-roi-bibi-toujours-dans-le-deni_1712244" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199581-netanyahu-and-wife-sara-attend-the-mimona-ceremony-at-the-israeli-town-of-or-akiva.jpg?modified_at=1551383141&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Triple inculpation imminente pour un «roi Bibi» toujours dans le déni
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 20:36</span>
+ </div></a>
+ </div>
+ </div>
+ <div class="menu-pictures third-item clearfix">
+ <div class="menu-pictures-col-2">
+ <a href="/debats/2019/03/01/quand-le-genre-et-la-race-divisent-le-milieu-universitaire_1712336" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199702-mouvement.jpg?modified_at=1551439556&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Quand le genre et la race divisent le milieu universitaire
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 12:26</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2">
+ <a href="https://www.liberation.fr/debats/2019/02/28/l-anarchisme-convivial-d-illich-seduit-ceux-qui-veulent-vivre-leur-autonomie-face-aux-institutions_1712214" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199543-ivan-illich.jpg?modified_at=1551374904&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ «L’anarchisme convivial d’Illich&#160;séduit ceux qui&#160;veulent vivre leur&#160;autonomie face aux institutions»
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 18:06</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-1 menu-pictures-last-col">
+ <a href="https://www.liberation.fr/debats/2019/02/28/quand-le-genre-et-la-race-divisent-le-milieu-universitaire_1712211" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199674-mouvement.jpg?modified_at=1551432871&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Quand le genre et la&#160;race&#160;divisent le&#160;milieu universitaire
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 17:56</span>
+ </div></a> <a href="https://www.liberation.fr/debats/2019/02/28/oscars-le-black-le-green-et-miss-daisy-ii_1712209" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1198527-oscars-2019.jpg?modified_at=1551086117&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Oscars : le black, le&#160;green et «Miss&#160;Daisy&#160;II»
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 17:56</span>
+ </div></a>
+ </div>
+ </div>
+ <div class="menu-pictures fourth-item clearfix">
+ <div class="menu-pictures-col-1">
+ <a href="/musique/2019/03/01/de-little-simz-a-sakamoto-cinq-sons-de-sortie-ce-vendredi_1711753" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1192248-1139650-infographie-illustration-disques-dans-les-bacs.jpg?modified_at=1551369474&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ De Little Simz à Sakamoto, cinq sons de sortie ce vendredi
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 06:43</span>
+ </div></a> <a href="/culture/2019/03/01/fashion-week-au-petit-trot_1712148" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199621-prodlibe-pacorabane1.jpg?modified_at=1551393234&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Fashion Week&#160;: au petit trot
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 06:14</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2">
+ <a href="/theatre/2019/02/28/eins-zwei-drei-le-clown-du-spectacle_1712205" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199527-martin-zimmermann_einszweidrei_photo1_nelly_rodriguezjpg.jpg?modified_at=1551376407&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ «Eins Zwei Drei», le clown du spectacle
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 18:46</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2 menu-pictures-last-col">
+ <a href="/theatre/2019/02/28/direction-d-operas-prise-de-tetes-a-paris-et-lyon_1712204" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199528-palais-garnier-1-c-jean-pierre-delagarde-opera-national-de-parisjpg.jpg?modified_at=1551376301&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Direction d’opéras&#160;: prise de têtes à Paris et Lyon
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 18:46</span>
+ </div></a>
+ </div>
+ </div>
+ <div class="menu-pictures fifth-item clearfix">
+ <div class="menu-pictures-col-1">
+ <a href="https://www.liberation.fr/checknews/2019/03/01/le-colonialisme-a-t-il-ete-presente-comme-une-oeuvre-civilisatrice-a-l-ecole-publique_1712332" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1185761--.jpg?modified_at=1547122257&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Le colonialisme a-t-il été présenté comme une «œuvre civilisatrice» à l'école publique ?
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 13:38</span>
+ </div></a> <a href="https://www.liberation.fr/checknews/2019/03/01/l-euro-a-t-il-vraiment-fait-perdre-56-000-a-chaque-francais_1712170" class="menu-picture" style="background-image: url(https://medias.liberation.fr/photo/1199693-cep4.jpg?modified_at=1551436916&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ L'Euro a-t-il vraiment fait perdre 56 000€ à chaque Français?
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 12:54</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2">
+ <a href="https://www.liberation.fr/checknews/2019/03/01/les-animaux-exposes-au-salon-de-l-agriculture-seront-ils-directement-envoyes-a-l-abattoir_1712212" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1199451-checknews_prodlibe-2019-0337-salon-de-l-agriculture-2019.jpg?modified_at=1551356738&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Les animaux exposés au salon de l'Agriculture seront-ils directement envoyés à l'abattoir&#160;?
+ </p><span class="menu-picture-desc-authors">1 mars 2019 à 12:45</span>
+ </div></a>
+ </div>
+ <div class="menu-pictures-col-2 menu-pictures-last-col">
+ <a href="https://www.liberation.fr/checknews/2019/02/28/si-un-depute-est-elu-au-parlement-europeen-organise-t-on-une-nouvelle-election_1707531" class="menu-picture menu-high-picture" style="background-image: url(https://medias.liberation.fr/photo/1193398-checknews.jpg?modified_at=1549392233&amp;amp;ratio_x=03&amp;amp;ratio_y=02&amp;amp;width=580);">
+ <div class="menu-picture-desc">
+ <p>
+ Si un député est élu au Parlement européen, organise-t-on une nouvelle élection ?
+ </p><span class="menu-picture-desc-authors">28 février 2019 à 17:44</span>
+ </div></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="menu-rubric clearfix">
+ <ul class="menu-rubric-bloc">
+ <li>
+ <a href="https://www.liberation.fr/liseuse/publication/01-03-2019/" class="menu-rubric-link menu-rubric-direct"><span>Le journal du jour</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/direct/" class="menu-rubric-link menu-rubric-live"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-live"></use></svg> <span>Le direct</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/libe-labo-data-nouveaux-formats,100538" class="menu-rubric-link menu-rubric-data"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-data"></use></svg> <span>Libé Labo</span></a>
+ </li>
+ <li>
+ <a href="/food,100293" class="menu-rubric-link menu-rubric-food"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-food"></use></svg> <span>Food</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/photographie,99965" class="menu-rubric-link menu-rubric-diapo"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-diapo"></use></svg> <span>Photo</span></a>
+ </li>
+ <li>
+ <a href="http://www.leptitlibe.fr" class="menu-rubric-link menu-rubric-ptitlibe"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-ptit-libe"></use></svg> <span>Le P'tit Libé</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/politiques,100666" class="menu-rubric-link menu-rubric-politiques"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-politiques"></use></svg> <span>Politiques</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/portrait,67" class="menu-rubric-link menu-rubric-portrait"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-portrait"></use></svg> <span>Portrait</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/sports,14" class="menu-rubric-link menu-rubric-sport"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-sport"></use></svg> <span>Sports</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/voyages,55" class="menu-rubric-link menu-rubric-voyage"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-voyage"></use></svg> <span>Voyages</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/blogs,26" class="menu-rubric-link menu-rubric-blogs"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-blog"></use></svg> <span>Blogs</span></a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/sciences,90" class="menu-rubric-link menu-rubric-sciences"><svg class="icon" role="img" width="60" height="60">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-sciences"></use></svg> <span>Sciences</span></a>
+ </li>
+ </ul>
+ <div class="menu-link-bloc-subscription">
+ <div class="menu-link-bloc-subscription-title">
+ <div class="bloc-subscription-link-title">
+ <a href="http://token.liberation.fr/accounts/offers/">Abonnement</a>
+ </div><a href="/offre-numerique/" class="menu-link-bloc-title">100% numérique<br />
+ <span class="small-link-title"><span class="yellow-title">8€ par mois sans engagement</span></span></a> <a href="/offre-integrale/" class="menu-link-bloc-title">Formule Intégrale<br />
+ <span class="small-link-title"><span class="yellow-title">Libération en version papier et numérique</span></span></a>
+ </div>
+ </div>
+ <div class="menu-link-bloc-event">
+ <div class="menu-link-bloc-event-title">
+ <div class="bloc-event-link-title">
+ <a href="https://www.liberation.fr/evenements/">Èvénements</a>
+ </div>
+ </div>
+ </div>
+ <div class="menu-link-bloc-store">
+ <div class="menu-link-bloc-store-title">
+ <div class="bloc-store-link-title">
+ <a href="http://boutique.liberation.fr/">La Boutique</a>
+ </div><a href="http://boutique.liberation.fr/collections/unes" class="menu-link-bloc-title">Unes en affiches<br />
+ <span class="small-link-title"><span class="green-title">Les unes cultes en tirage photo</span></span></a> <a href="http://boutique.liberation.fr/collections/all" class="menu-link-bloc-title">Relire Libé<br />
+ <span class="small-link-title"><span class="green-title">Commander des anciens numéros</span></span></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <footer class="footer-menu clearfix">
+ <div class="footer-social-links">
+ <a href="/" role="button" class="button v-centered init facebook-share"><span class="button-icon"><svg class="icon fill-black" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></span></a> <a href="/" role="button" class="button v-centered init twitter-share"><span class="button-icon"><svg class="icon fill-black" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></span></a>
+ </div>
+ <div class="footer-newsletter">
+ <span class="newsletter-title-bloc">newsletter</span>
+ <form class="newsletter-inscription">
+ <input type="email" class="input-email newsletter-bar" value="" placeholder="email" /> <button class="newsletter-bar-submit" onclick="return validForm(this, 'newsletter-form');">ok</button>
+ </form>
+ </div>
+ <ul class="footer-menu-links clearfix">
+ <li class="footer-menu-link">
+ <a href="https://liberation.zendesk.com/hc/fr" class="link-footer">FAQ</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/cgvu/#mentions-legales" class="link-footer">La rédaction</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/contacts/" class="link-footer">Contact</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="http://www.alticemediapublicite.fr/marques/liberation-presse/" class="link-footer">Publicité</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/cgvu/#donnees-personnelles" class="link-footer">Données personnelles</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/cgvu/#cgv" class="link-footer">CGV</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/cgvu/#charte-ethique" class="link-footer">Charte éthique</a>
+ </li>
+ <li class="footer-menu-link">
+ <a href="/cgvu/#credits" class="link-footer">Crédits</a>
+ </li>
+ </ul>
+ </footer>
+ </div>
+ <div class="modal-shadow"></div>
+ <script type="text/javascript">
+ //<![CDATA[
+ var body = document.getElementsByTagName('body')[0];
+
+ var navSubscribeButton = document.getElementsByClassName('js-nav-subscribe-button')[0];
+ var navUserButton = document.getElementsByClassName('js-nav-user-button')[0];
+ var navUserButtonName = document.getElementsByClassName('js-nav-user-button-name')[0];
+
+ if (libeUserInfo.authenticated) {
+ body.className += ' authenticated';
+ navUserButtonName.innerHTML = libeUserInfo.displayname;
+ if(navUserButtonName.href) {
+ navUserButtonName.href = 'http://token.liberation.fr/accounts/home/';
+ } else {
+ navUserButton.href = 'http://token.liberation.fr/accounts/home/';
+ }
+ }
+
+ if (libeUserInfo.access_level === 'PRE' || libeUserInfo.access_level === 'ESS' ) {
+ body.className += ' subscribed';
+ navSubscribeButton.style.display = 'none';
+ }
+
+ // staff
+ if (typeof libeUserInfo !== 'undefined' && libeUserInfo.is_staff) {
+ var elements = document.getElementsByClassName('header-fix-nav');
+ if(elements.length > 0) {
+ var headerElem = elements[0];
+
+ // div
+ var adminNav = document.createElement('div');
+ adminNav.className = 'admin-nav active';
+
+ // span
+ var titleElem = document.createElement('span');
+ var titleTxt = document.createTextNode('Réservés aux administrateurs');
+ titleElem.appendChild(titleTxt);
+
+ adminNav.appendChild(titleElem);
+
+
+ // buttons
+ var adminButtons = [{
+ text: 'Annuaire',
+ href: libeUserInfo.url_dock + '/annuaire/',
+ },{
+ text: 'Back office',
+ href: libeUserInfo.url_quai + '/quai/',
+ },{
+ text: 'Éditer',
+ href: "javascript:location.href = '"+ libeUserInfo.url_quai +"/quai/redirect_to_change_view?u=' + location.href;",
+ },{
+ text: 'Actualiser',
+ href: "javascript: window.location.href = window.location.pathname + '?refresh=' + Math.floor((Math.random() * 1000000) + 1);",
+ }];
+
+ if (libeUserInfo.is_superuser && typeof(objectId) !== 'undefined') {
+ adminButtons.push({
+ text: 'Compose',
+ href: libeUserInfo.url_dock + '/compose/' + objectId + '/'
+ })
+ }
+
+ for (i = 0; i < adminButtons.length; i++) {
+ var elem = document.createElement('a');
+ elem.href = adminButtons[i]['href'];
+ var txt = document.createTextNode(adminButtons[i]['text']);
+ elem.appendChild(txt);
+ adminNav.appendChild(elem);
+ }
+
+ headerElem.insertBefore(adminNav, headerElem.firstChild);
+ headerFixNavHeight = headerElem.offsetHeight;
+ document.body.style.paddingTop = headerFixNavHeight + 'px';
+ }
+ }
+
+ //]]>
+ </script>
+ <script src="https://statics.liberation.fr/newnext/js/advertisement.js"></script>
+ </div>
+ <nav class="next-nav white-bg">
+ <ul class="next-nav-cat next-color-07-c">
+ <li>
+ <a href="/cinema,58">Cinéma</a>
+ </li>
+ <li>
+ <a href="/musique,59">Musique</a>
+ </li>
+ <li>
+ <a href="/livres,60">Livres</a>
+ </li>
+ <li>
+ <a href="/theatre,28">Scènes</a>
+ </li>
+ <li>
+ <a href="/arts,99964">Arts</a>
+ </li>
+ <li>
+ <a href="/images,100296">Images</a>
+ </li>
+ <li>
+ <a href="/vous,15">Lifestyle</a>
+ </li>
+ <li>
+ <a href="/mode,99924">Mode</a>
+ </li>
+ <li>
+ <a href="https://www.liberation.fr/beaute,100215">Beauté</a>
+ </li>
+ <li>
+ <a href="/food,100293">Food</a>
+ </li>
+ </ul>
+ </nav>
+ <main id="main-content" class="main-content page-next">
+ <div class="viewer-container js-viewer">
+ <div class="viewer-photo">
+ <ul class="viewer-slider-container js-viewer-pictures-container"></ul>
+ </div>
+ <div class="reader-nav">
+ <a href="javascript:void(0)" class="reader-nav-bloc reader-nav-button js-viewer-close-button"><svg class="icon" role="img" width="40" height="44">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-reader-cross"></use></svg></a> <a href="javascript:void(0)" class="reader-nav-bloc reader-nav-button js-viewer-next-button"><svg class="icon" role="img" width="38" height="44">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-viewer-previous"></use></svg></a> <a href="javascript:void(0)" class="reader-nav-bloc reader-nav-button js-viewer-prev-button"><svg class="icon" role="img" width="40" height="44">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-viewer-next"></use></svg></a> <a href="javascript:void(0)" class="reader-nav-bloc reader-nav-button viewer-infos-button js-viewer-info-button">info</a> <a href="javascript:void(0)" class="reader-nav-bloc reader-nav-button js-viewer-next-button">/</a>
+ </div>
+ </div>
+ <div class="pub-container ad-container">
+ <div id="sas_28993"></div>
+ </div>
+ <div class="width-wrap">
+ <article data-progress-bar="push" class="article-box top-line" data-url="/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047">
+ <div class="width-padded">
+ <header class="article-header">
+ <div class="read-left-padding">
+ <div class="article-subhead">
+ Sur vos écrans cette semaine
+ </div>
+ <h1 class="article-headline">
+ Screenshot&#160;: «Vape Wave», «6&#160;Days», «Alphonse Président»…
+ </h1>
+ <div class="article-head-metas">
+ <span class="authors">Par <span class="author"><a href="https://www.liberation.fr/auteur/5631-alexandre-hervaud">Alexandre Hervaud</a></span> et <span class="author"><a href="https://www.liberation.fr/auteur/17350-jeremy-piette">Jérémy Piette</a></span></span> — <span class="date"><time datetime="2017-11-24T18:42:20">24 novembre 2017 à 18:42</time></span>
+ </div>
+ </div>
+ </header>
+ </div>
+ <div class="container-column clearfix">
+ <div class="wide-column width-padded-left">
+ <figure class="article-image article-header-image">
+ <a role="button" class="figure-zoom js-figure-zoom"><img src="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;width=975" alt="«Vape Wave», «6 Days», «Alphonse président» et «Braguino»" data-src="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;width=975" data-src-retina="https://medias.liberation.fr/photo/1075029-screenshot-alphonse-vape-wave-6-days.jpg?modified_at=1511536242&amp;width=975" data-lazy-load="false" width="975" /> <i class="zoom-icon"><svg class="icon" role="img" width="22" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-zoom"></use></svg></i></a>
+ <figcaption class="read-left-padding caption">
+ <span class="desc">«Vape Wave», «6 Days», «Alphonse président» et «Braguino»</span> <span class="copy">DR</span>
+ <div class="share-link">
+ <span class="share"><a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;t=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6" class="js-share-facebook" rel="nofollow"><svg class="icon share-link-fb" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></a> <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;text=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6&amp;via=libe&amp;related=libe" class="js-share-twitter" rel="nofollow"><svg class="icon share-link-tw" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></a></span>
+ </div>
+ </figcaption>
+ </figure>
+ <div class="article-body read-left-padding js-figure-zoom">
+ <p>
+ Séries, documentaires, programmes jeunesse… Retrouvez les recommandations de&#160;<em>Libération</em>&#160;pour savoir quoi regarder sur vos écrans cette semaine.
+ </p>
+ <h3>
+ Pour dépasser le tabac
+ </h3>
+ <p>
+ <strong><em>Vape Wave</em> (documentaire, 1h28, Planète+)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/lGL7RgHn5f0" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Pendant quelques jours, le doute a plané&#160;: l’Etat comptait-il vraiment légiférer contre la cigarette dans les films français, que ce soit via une interdiction pure et simple ou via un système de «punition» (coupe des aides CNC, par exemple) pour les longs-métrages qui sentent le mégot&#160;? Si <a href="https://www.liberation.fr/direct/element/agnes-buzyn-assure-quelle-na-jamais-envisage-linterdiction-de-la-cigarette-au-cinema_73855/" target="_blank">le rétropédalage de la ministre Buzyn</a> n’en est pas vraiment un (elle n’avait jamais clairement menacé le septième art), la polémique a le mérite de pointer la (sur)représentation clopesque sur écran. Et si, comme c’est le cas dans la vie quotidienne, on voyait progressivement les cigarettes électroniques remplacer les tiges nicotinées authentiques&#160;? Que ceux qui mettraient en doute le potentiel cinématographique des vapoteuses se ruent sur <a href="http://www.vapewave.net/" target="_blank"><em>Vape Wave</em></a>, documentaire militant signé Jan Kounen, ex-fumeur reconverti à la vape dont les images magnifient les volutes de vapeur recrachée.
+ </p>
+ <p>
+ Si le film du réalisateur de <em>Dobermann</em> et <em>99 Francs</em> part un peu dans tous les sens, il a le mérite de défendre avec une passion contagieuse ce qui semble, de loin, être <a href="https://www.liberation.fr/societe/2015/08/20/une-e-cigarette-tres-frequentable_1366687" target="_blank">le meilleur et plus sain substitut à la clope</a>, n’en déplaise aux mesures restrictives imposées en France <a href="https://www.liberation.fr/france/2017/10/03/la-cigarette-electronique-bannie-de-certains-lieux-publics_1600601" target="_blank">à son égard</a>. Financé en partie via crowdfunding, le documentaire a été présenté par Kounen à travers toute la France lors de projection tenant quasiment de l’évangélisation. Disponible en VOD/DVD, il a été diffusé cette semaine sur la chaîne Planète+, qui le rediffusera les 25/11, 30/11 et 02/12 prochains. <strong>(Alexandre Hervaud)</strong>
+ </p>
+ <h3>
+ Pour écouter parler un génie
+ </h3>
+ <p>
+ <strong><em>Dans la tête d’Alan Moore</em> (websérie documentaire, 8x5min, Arte Creative)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/s_rw5fPHz2g" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Le week-end dernier, <em>Libération</em> publiait <a href="http://next.liberation.fr/livres/2017/11/17/alan-moore-dernier-barde-avant-la-fin-du-monde_1610854" target="_blank">un portrait de der consacré à l’auteur britannique Alan Moore</a>, connu pour ses BD cultes (<em>V pour Vendetta, Watchmen, From Hell</em>), à l’occasion de la sortie de son deuxième roman, le pavé <em>Jérusalem</em>. En attendant l’imminente sortie d’une version longue de son entretien avec <em>Libé</em>, on pourra se replonger dans les épisodes d’une websérie documentaire d’Arte Creative en 8 épisodes consacré au maître. Brexit, magie, Anonymous font partie des sujets discutés avec le maître au fil de ce programme sobrement intitulé <a href="https://www.arte.tv/fr/videos/RC-014342/dans-la-tete-d-alan-moore/" target="_blank"><em>Dans la tête d’Alan Moore</em></a>. <strong>(A.H.)</strong>
+ </p>
+ <h3>
+ Pour honorer la mémoire d’une icône queer
+ </h3>
+ <p>
+ <strong><em>The Death and Life of Marsha P. Johnson</em> (docu, 1h45, Netflix)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/pADsuuPd79E" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Marsha, la <em>«Rosa Parks du mouvement LGBTQ»</em>. Marsha <em>«la prostituée, l’actrice et la sainte, modèle d’Andy Warhol»</em> ou encore Marsha l’élaborée, la radicale, <em>«avec ses plumes et ce maquillage qu’elle ne mettait jamais bien»</em>. «Queen Marsha» a été retrouvée morte dans l’Hudson en juillet&#160;1992, alors qu’on la voyait encore parader dans les rues de Greenwich Village quelques jours auparavant. Un choc glaçant. Là où son corps a été repêché puis ingratement déposé, les sans-abri ont constitué le lendemain un mémorial de bouteilles et de plantes qui délimitent les contours de l’absente.
+ </p>
+ <p>
+ Marsha P. Johnson de son nom complet, icône queer, femme transgenre noire américaine et emblème de la lutte pour les droits des LGBTQ avait été l’une des premières à s’engager lors des émeutes de Stonewall à New York, en&#160;1969&#160;: <em>«C’est la révolution. Dieu merci.»</em> Marsha était une fleur souriante au parfum d’espoir. Le documentaire <em>The Death and Life of Marsha P. Johnson</em> du cinéaste David France relate l’enquête de l’activiste Victoria Cruz, membre de l’organisation Anti-Violence Project à New York qui, avant de prendre sa retraite, réclame que lumière soit faite sur la disparition de l’icône […]&#160;<a href="http://next.liberation.fr/cinema/2017/11/17/docu-marsha-p-johnson-unique-en-son-genre_1610846" target="_blank">Lire la suite de la critique de Jérémy Piette sur Libération.fr</a>
+ </p>
+ <h3>
+ Pour Michel Vuilermoz (et rien d’autre)
+ </h3>
+ <p>
+ <strong><em>Alphonse President</em> (série, 10x26, OCS Max)</strong>
+ </p>
+ <p>
+ <iframe width="100%" frameborder="0" src="https://www.dailymotion.com/embed/video/x67iqc9" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Un temps baptisée <em>French Touch</em>, la série <em>Alphonse Président</em> est le dernier né des programmes originaux made in OCS. On savait les budgets de la chaîne bien moins généreux que ceux de Canal+ (voire que ceux de France 3 Limousin), et cette série le prouve à nouveau régulièrement, notamment lors d’une scène de conférence de presse alternant plans larges d’une authentique conf' à l’Elysée période François Hollande et plans serrés d’acteurs filmés dans un château des Pays de la Loire où a eu lieu le tournage. Le principal atout (et quel atout) de cette série écrite et réalisée par Nicolas Castro (<em>Des lendemains qui chantent</em>, 2014) réside dans son interprète principal, Michel Vuillermoz.
+ </p>
+ <p>
+ Dans le rôle d’un sénateur ringard devenu par un concours de circonstances président de la République, ce pensionnaire de la Comédie-Française et complice d’Albert Dupontel fait des merveilles, notamment lorsque le scénario lui prête des répliques enflammées typiques de la langue de bois politicienne –&#160;pas étonnant qu’il brasse du vent, son personnage de prof d’histoire retraité s’appelle Alphonse Dumoulin. C’est lorsqu’il n’est plus à l’écran que les choses se gâtent&#160;: si Jean-Michel Lahmi (de la bande d’Edouard Baer) fait le job en grand patron des flics, difficile de croire une seconde à Nabiha Akkari dans le rôle de la Première ministre –&#160;et pas uniquement parce que l’idée d’avoir une femme trentenaire issue de la diversité à Matignon sonne hélas comme un doux rêve en&#160;2017. Si, en matière de fiction politique sérieuse, un <em>Baron Noir</em> n’a pas grand-chose à envier à un <em>House of Cards</em>, côté comique la France est encore loin d’avoir son <em>Veep</em>. Gageons que la génération LREM saura largement inspirer des scénaristes moqueurs. <strong>(A.H.)</strong>
+ </p>
+ <h3>
+ Pour les coulisses d’un tournage dément
+ </h3>
+ <p>
+ <strong><em>Jim &amp; Andy</em> (documentaire, 1h33, Netflix)&#160;</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/kB15UFO5ebA" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ A la sortie de <em>Man on the Moon</em> (2000), le magnifique film de Milos Forman consacré à Andy Kaufman –&#160;comique et génie de la performance absurde mort en 1984&#160;–, le cinéaste et les acteurs insistaient dans chaque interview sur l’in­croyable comportement de Jim Carrey pendant le tournage&#160;: il aurait été comme possédé par Kaufman, se prenant pour lui 24&#160;heures sur 24. Certains affirmaient même ne jamais avoir eu l’impression que l’acteur était présent, tant son modèle avait littéralement pris sa place. Nous en avons aujourd’hui la preuve en images car tout cela avait été filmé par Bob Zmuda et Lynne Margulies, l’ancien complice et la veuve de Kaufman.
+ </p>
+ <p>
+ Dans le passionnant <em>Jim &amp; Andy&#160;: the Great Beyond</em>, disponible sur Netflix, Chris Smith a monté ces documents inédits parallèlement à un entretien dans lequel Jim Carrey revient sur cette expérience unique. <a href="http://next.liberation.fr/cinema,58" target="_blank">Lire la suite de la critique de Marcos Uzal sur Liberation.fr</a>
+ </p>
+ <h3>
+ Pour un trip sibérien en totale autarcie
+ </h3>
+ <p>
+ <strong><em>Braguino</em> (documentaire, 50min, Arte)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/OIS-P-0-cRk" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ La querelle peut se trouver derrière toutes les portes, y compris celle de l’exil. On a beau croire avoir tourné le dos à tout, à cette inclination humaine à nourrir sa&#160;propre haine, l’allergie peut regermer fissa sur une&#160;peau qui frissonne à&#160;l’approche de ce voisin que l’on ne comprend pas. Issu&#160;d’une lignée de vieux-croyants orthodoxes russes, Sacha Braguine a pris sa famille sous le bras, loin de toute autre présence humaine en taïga sibérienne. Un autre groupe, les Kiline, a décidé d’en faire de même et de s’installer de l’autre côté de la rivière. Qui est arrivé en premier&#160;? Qui menace l’autre&#160;? L’histoire de l’impossible communauté peut commencer.
+ </p>
+ <p>
+ La lecture d’<em>Ermites dans la taïga</em>&#160;(1992) de Vassili Peskov, authentique récit sur la famille Lykov opérant une migration similaire en&#160;1938, a poussé l’artiste&#160;<a href="http://next.liberation.fr/images/2017/09/29/clement-cogitore-j-essaye-de-raconter-les-terreurs-profondes-de-l-etre-humain_1599854">Clément Cogitore</a>&#160;à&#160;rencontrer les Braguine, puis à se faire témoin de la&#160;bisbille de voisinage en&#160;2016. Il en est revenu avec un nouveau film d’une cinquantaine de minutes&#160;:&#160;<em>Braguino,</em>&#160;soutenu par le prix Le&#160;Bal de la&#160;jeune création avec l’ADAGP.<em>&#160;</em>Le documentaire y frôle son déguisement fictionnel, tant ce qui s’y déroule convoque une dramaturgie comme invoquée par on ne sait quel rituel vaudou […] <a href="http://next.liberation.fr/cinema/2017/10/30/braguino-prises-de-bec-dans-la-taiga_1606859" target="_blank">Lire la suite de la critique de Jérémy Piette sur Liberation.fr</a>, le film diffusé cette semaine sur Arte est visible en intégralité ci-dessus.
+ </p>
+ <h3>
+ Pour un thriller tiré de faits réels
+ </h3>
+ <p>
+ <strong><em>6 Days</em> (film, 1h34, Netflix)</strong>
+ </p>
+ <p>
+ <iframe width="100%" src="https://www.youtube.com/embed/7HthiTi_IcI" frameborder="0" allowfullscreen="allowfullscreen" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ </p>
+ <p>
+ Fin avril 1980, l’ambassade d’Iran à Londres a été le théâtre d’une prise d’otages largement médiatisée : une trentaine de personnes ont ainsi été retenues pendant six jours par des soldats iraniens dissidents exigeant la libération de 91 prisonniers. Avec Margaret Thatcher au 10 Downing Street à l’époque, pas question pour l’Angleterre d’avoir l’air mou du genou sur la réponse à apporter à cette crise scrutée par les caméras du monde entier. Le SAS (Special Air Service) est sur le coup : l’opération Nimrod se met en place pour prendre d’assaut l’ambassade.
+ </p>
+ <p>
+ Inspiré par cet épisode, <em>6 Days</em> de&#160;Toa Fraser (<em>The Dead Lands</em>, 2014) est un thriller carré pouvant compter sur l'autorité naturelle de Mark Strong (<em>Kingsman</em>) ici recyclé en flic londonien et sur la néo-badass attitude de Jamie Bell, bien loin du freluquet danseur de <em>Billy Elliot</em> puisqu'on le retrouve ici&#160;en soldat chargé d’organiser l’opération de secours. Attention, la bande-annonce ci-dessus dévoile à peu près l’intégralité des scènes d’action du film. <strong>(A.H.)</strong>
+ </p><span class="authors"><span class="author"><a href="https://www.liberation.fr/auteur/5631-alexandre-hervaud">Alexandre Hervaud</a></span> , <span class="author"><a href="https://www.liberation.fr/auteur/17350-jeremy-piette">Jérémy Piette</a></span></span>
+ </div>
+ </div>
+ <aside class="aside-column side-flow-bloc width-padded">
+ <div class="bloc-share clearfix">
+ <div class="bloc-share-button">
+ <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;t=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6" class="js-share-facebook bloc-share-social fb" rel="nofollow"><i class="button-icon fb"><svg class="icon" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></i>
+ <p>
+ partager
+ </p></a>
+ </div>
+ <div class="bloc-share-button">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;text=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6&amp;via=libe&amp;related=libe" class="js-share-twitter bloc-share-social tw" rel="nofollow"><i class="button-icon tw"><svg class="icon" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></i>
+ <p>
+ tweeter
+ </p></a>
+ </div>
+ <div class="bloc-share-tools">
+ <a data-libe-tooltip="Imprimer" class="bloc-share-action js-share-print" href="javascript:;" onclick="window.print();"><svg class="icon" role="img" width="27" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-print"></use></svg></a> <a data-libe-tooltip="Envoyer par mail" class="bloc-share-action" href="mailto:?subject=Lu%20sur%20liberation.fr%20&amp;body=Screenshot%C2%A0%3A%20%C2%ABVape%20Wave%C2%BB%2C%20%C2%AB6%C2%A0Days%C2%BB%2C%20%C2%ABAlphonse%20Pr%C3%A9sident%C2%BB%E2%80%A6%0D%0A%0D%0A%0D%0ARetrouvez%20cet%20article%20sur%20le%20site%20de%20Lib%C3%A9ration%20:%20https%3A//next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047"><svg class="icon" role="img" width="23" height="24">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-mail"></use></svg></a>
+ </div>
+ </div>
+ <div class="sticky-element-container sideblocks-container js-sideblocks-container">
+ <div class="unsubs-content sticky-element">
+ <div class="bloc-yellow-header unsubs-content">
+ <a href="http://token.liberation.fr/accounts/personal-data/"><svg class="icon" role="img" width="15" height="24">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-abo-ribbon"></use></svg>
+ <div class="header-title js-nav-user-button-name"></div><span class="header-text">Vous êtes abonné à Libération</span></a>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function() {
+ buttons = document.getElementsByClassName('header-title js-nav-user-button-name')
+ for( pos = 0 ; pos < buttons.length ; pos++ ){
+ buttons[pos].innerHTML = libeUserInfo['full_name'] ? libeUserInfo['full_name'] : libeUserInfo['displayname'];
+ }
+ })();
+ //]]>
+ </script>
+ <div class="flow-bloc flow-bloc-subscription">
+ <div class="bloc-title">
+ Le journal d'aujourd'hui
+ </div>
+ <div class="flow-bloc-content">
+ <a href="/liseuse/publication/01-03-2019/" class="">
+ <div class="flow-bloc-journal">
+ <img src="/liseuse/paperpage/262207/" alt="" class="journal-une-img" width="229" />
+ </div></a>
+ <ul class="list-bottom-box">
+ <li>
+ <a class="list-bottom-item" href="/publication/">découvrir le sommaire</a>
+ </li>
+ <li>
+ <a class="list-bottom-item" href="https://www.liberation.fr/france/2019/02/28/dilemmes_1712264">lire l'édito</a>
+ </li>
+ <li>
+ <a class="list-bottom-item" href="/liseuse/publication/01-03-2019/">feuilleter</a>
+ </li>
+ <li>
+ <a class="list-bottom-item subscription-bloc" href="http://token.liberation.fr/accounts/offers"><strong>s'abonner</strong> à partir de 8€</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="sticky-element js-replace-asq" style="display: none;">
+ <div class="flow-bloc flow-bloc-subscription subs-desc single full-bg subs-content">
+ <div class="subs-punch">
+ Offre 100% numérique: <strong>8€ par mois sans engagement</strong>
+ </div><img width="170" height="100" alt="" src="https://statics.liberation.fr/newnext/images/illu-daily-journal-wb.svg" />
+ <p class="desc-txt">
+ Le journal du jour en exclusivité et le journal de demain avant tout le monde
+ </p><a href="http://token.liberation.fr/accounts/offers" class="subscription-desc-button">Voir les offres d’abonnement</a>
+ </div>
+ </div>
+ </div>
+ <div class="pined-bottom">
+ <div class="bloc-share clearfix">
+ <div class="bloc-share-button">
+ <a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;t=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6" class="js-share-facebook bloc-share-social fb" rel="nofollow"><i class="button-icon fb"><svg class="icon" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-facebook"></use></svg></i>
+ <p>
+ partager
+ </p></a>
+ </div>
+ <div class="bloc-share-button">
+ <a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot-vape-wave-6-days-alphonse-president_1612047&amp;text=Screenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6&amp;via=libe&amp;related=libe" class="js-share-twitter bloc-share-social tw" rel="nofollow"><i class="button-icon tw"><svg class="icon" role="img" width="20" height="20">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-twitter"></use></svg></i>
+ <p>
+ tweeter
+ </p></a>
+ </div>
+ <div class="bloc-share-tools">
+ <a data-libe-tooltip="Imprimer" class="bloc-share-action js-share-print" href="javascript:;" onclick="window.print();"><svg class="icon" role="img" width="27" height="22">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-print"></use></svg></a> <a data-libe-tooltip="Envoyer par mail" class="bloc-share-action" href="mailto:?subject=Lu%20sur%20liberation.fr%20&amp;body=Screenshot%C2%A0%3A%20%C2%ABVape%20Wave%C2%BB%2C%20%C2%AB6%C2%A0Days%C2%BB%2C%20%C2%ABAlphonse%20Pr%C3%A9sident%C2%BB%E2%80%A6%0D%0A%0D%0A%0D%0ARetrouvez%20cet%20article%20sur%20le%20site%20de%20Lib%C3%A9ration%20:%20https%3A//next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047"><svg class="icon" role="img" width="23" height="24">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-mail"></use></svg></a>
+ </div>
+ </div>
+ </div>
+ </aside>
+ </div>
+ </article>
+ </div>
+ <div class="width-wrap category-container">
+ <div class="container-column clearfix">
+ <div class="wide-column js-infinity-section-container next-footer-section">
+ <link rel="next" href="/?page=1&amp;list" />
+ </div>
+ <aside class="next-aside-container aside-column width-padded">
+ <div class="sticky-element-container sideblocks-container js-sideblocks-container">
+ <div class="unsubs-content sticky-element">
+ <div class="bloc-yellow-header unsubs-content">
+ <a href="http://token.liberation.fr/accounts/personal-data/"><svg class="icon" role="img" width="15" height="24">
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-abo-ribbon"></use></svg>
+ <div class="header-title js-nav-user-button-name"></div><span class="header-text">Vous êtes abonné à Libération</span></a>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+ (function() {
+ buttons = document.getElementsByClassName('header-title js-nav-user-button-name')
+ for( pos = 0 ; pos < buttons.length ; pos++ ){
+ buttons[pos].innerHTML = libeUserInfo['full_name'] ? libeUserInfo['full_name'] : libeUserInfo['displayname'];
+ }
+ })();
+ //]]>
+ </script>
+ <div class="flow-bloc flow-bloc-subscription">
+ <div class="bloc-title">
+ Le journal d'aujourd'hui
+ </div>
+ <div class="flow-bloc-content">
+ <a href="/liseuse/publication/01-03-2019/" class="">
+ <div class="flow-bloc-journal">
+ <img src="/liseuse/paperpage/262207/" alt="" class="journal-une-img" width="229" />
+ </div></a>
+ <ul class="list-bottom-box">
+ <li>
+ <a class="list-bottom-item" href="/publication/">découvrir le sommaire</a>
+ </li>
+ <li>
+ <a class="list-bottom-item" href="https://www.liberation.fr/france/2019/02/28/dilemmes_1712264">lire l'édito</a>
+ </li>
+ <li>
+ <a class="list-bottom-item" href="/liseuse/publication/01-03-2019/">feuilleter</a>
+ </li>
+ <li>
+ <a class="list-bottom-item subscription-bloc" href="http://token.liberation.fr/accounts/offers"><strong>s'abonner</strong> à partir de 8€</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="sticky-element bloc-ads ad-container">
+ <div id="sas_28999"></div>
+ </div>
+ </div>
+ </aside>
+ </div>
+ </div>
+ <div class="js-infinity-contentmodel-container"></div>
+ <div class="libe-aside-comment js-stop-scroll-propagation">
+ <div class="libe-comment-header">
+ <a href="" class="libe-comment-close"></a>
+ <div class="libe-comment-header-title">
+ Un mot à ajouter ?
+ </div>
+ </div>
+ </div>
+ <div id="sas_28991"></div>
+ <div id="sas_28990"></div>
+ </main>
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/321bd053e6d6.js"></script>
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/107fa81103c2.js"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ var JSONData = JSON.parse("{\u0022title\u0022: \u0022Screenshot\u005Cu00a0: \u005Cu00abVape Wave\u005Cu00bb, \u005Cu00ab6\u005Cu00a0Days\u005Cu00bb, \u005Cu00abAlphonse Pr\u005Cu00e9sident\u005Cu00bb\u005Cu2026\u0022, \u0022xiti_level\u0022: \u002242\u0022, \u0022section\u0022: \u0022Culture\u0022, \u0022author\u0022: \u0022Web\u0022, \u0022xiti_page\u0022: \u0022Culture::Article_\u002D_Screenshot_Vape_Wave_6_Days_Alphonse_President_\u002D_1612047\u0022, \u0022facebook\u0022: \u0022https://www.facebook.com/sharer/sharer.php?u\u003Dhttps%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot\u002Dvape\u002Dwave\u002D6\u002Ddays\u002Dalphonse\u002Dpresident_1612047\u0026t\u003DScreenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6\u0022, \u0022pw_date\u0022: \u00222019\u002D03\u002D01T15:32:22.666827\u0022, \u0022pk\u0022: 1612047, \u0022twitter\u0022: \u0022https://twitter.com/intent/tweet?url\u003Dhttps%3A%2F%2Fnext.liberation.fr%2Fculture%2F2017%2F11%2F24%2Fscreenshot\u002Dvape\u002Dwave\u002D6\u002Ddays\u002Dalphonse\u002Dpresident_1612047\u0026text\u003DScreenshot%C2%A0%3A+%C2%ABVape+Wave%C2%BB%2C+%C2%AB6%C2%A0Days%C2%BB%2C+%C2%ABAlphonse+Pr%C3%A9sident%C2%BB%E2%80%A6\u0026via\u003Dlibe\u0026related\u003Dlibe\u0022}");
+
+
+ var genericSettings = {};
+
+ genericSettings['paddix'] = JSON.parse('{"enabled": true}');
+
+ genericSettings['paywall'] = JSON.parse('{"enabled": true}');
+
+ genericSettings['ads'] = JSON.parse('{"enabled": true}');
+
+ genericSettings['elections'] = JSON.parse('{"election_tour": "2", "election_name": "Pr\u00e9sidentielle 2017", "enabled": false, "election_constant": "PR2017", "file_path": "/data/ftp/fremen/data/PR2017/", "election_url": "/elections/presidentielle-2017/"}');
+
+ var StaticUrl = "https://statics.liberation.fr/newnext/";
+ //]]>
+ </script>
+ <script type="text/javascript" src="https://www6.smartadserver.com/config.js?nwid=14"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ if (typeof sas !== 'undefined') {
+ sas.setup({domain: 'https://www6.smartadserver.com', async: true, renderMode: 0});
+ }
+ //]]>
+ </script>
+ <script type="text/javascript" src="https://widgets.outbrain.com/outbrain.js"></script>
+ <script id="twitter-wjs" type="text/javascript" async="async" defer="defer" src="https://platform.twitter.com/widgets.js"></script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ (function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id)) return;js=d.createElement(s);js.id=id;js.src='//connect.facebook.net/fr_FR/all.js#xfbml=1&appId=WWWWWW';fjs.parentNode.insertBefore(js,fjs);}(document,'script','facebook-jssdk'));
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+
+ var pw_duration = 7;
+ var pw_session_time = 30;
+ var pw_session_count = 4;
+ var pw_date = '2019-03-01T15:32:23.483787';
+
+
+
+
+ var pw_constants = {"PW_DENY": {"footer_link": "https://token.liberation.fr/accounts/login/", "cta_link": "https://next.liberation.fr/offre-numerique/", "text": "Pour continuer \u00e0 consulter nos articles et nous soutenir, abonnez-vous d\u00e8s maintenant", "title": "Vous avez profit\u00e9 des 4 visites\n offertes par Lib\u00e9ration", "cta_text": "Je m'abonne", "poster": "https://statics.liberation.fr/newnext/images/paywall/paywall-5.jpg", "offer_name": "100% num\u00e9rique", "offer_price": "8\u20ac", "footer_text": "Je suis d\u00e9j\u00e0 abonn\u00e9"}, "PW_MSG": [{"count": 1, "status": "Lib\u00e9ration vous offre 4 visites !", "cta_link": null, "text": "Soutenez notre culture de d\u00e9bats et de libert\u00e9 en rejoignant la communaut\u00e9 des abonn\u00e9s et des journalistes de Lib\u00e9ration", "title": "Nos contenus ont de la valeur\npour vous comme pour nous", "cta_text": "Poursuivre ma lecture", "poster": "https://statics.liberation.fr/newnext/images/paywall/paywall-1.jpg", "footer_text": "D\u00e9couvrir l'offre", "footer_link": "https://token.liberation.fr/accounts/offers/"}, {"count": 2, "status": "Lib\u00e9ration vous offre encore 3 visites !", "cta_link": null, "text": "en \u00e9tant toujours honn\u00eate, tol\u00e9rant et prospectif", "title": "Cr\u00e9er le d\u00e9bat et le nourrir", "cta_text": "Poursuivre ma lecture", "poster": "https://statics.liberation.fr/newnext/images/paywall/paywall-2.jpg", "footer_text": "D\u00e9couvrir l'offre", "footer_link": "https://token.liberation.fr/accounts/offers/"}, {"count": 3, "status": "Lib\u00e9ration vous offre encore 2 visites !", "cta_link": "https://next.liberation.fr/offre-numerique/", "text": "Contribuez \u00e0 faire vivre le journalisme exigeant en vous abonnant", "title": "Soyons r\u00e9alistes:\nIl n'y a pas de qualit\u00e9 sans financement", "cta_text": "M'abonner sans engagement - 8\u20ac/MOIS", "poster": "https://statics.liberation.fr/newnext/images/paywall/paywall-3.jpg", "footer_text": "D\u00e9couvrir l'offre", "footer_link": "https://token.liberation.fr/accounts/offers/"}, {"count": 4, "status": "C'est votre derni\u00e8re visite gratuite", "cta_link": "https://next.liberation.fr/offre-numerique/", "text": "Soutenez le journalisme vigilant et progressiste en vous abonnant", "title": "Si vous \u00eates arriv\u00e9(e) jusque l\u00e0 c\u2019est que vous aimez Lib\u00e9, merci", "cta_text": "M'abonner sans engagement - 8\u20ac/MOIS", "poster": "https://statics.liberation.fr/newnext/images/paywall/paywall-4.jpg", "footer_text": "D\u00e9couvrir l'offre", "footer_link": "https://token.liberation.fr/accounts/offers/"}]};
+ var pw_json_alert = "\n<div class=\"pws anim-in\">\n <div class=\"pw-container\">\n <a class=\"pw-action-close discard\">\n <img src=\"https://statics.liberation.fr/newnext/images/paywall/icons/close-cross.png\" alt=\"\">\n <\/a>\n <div class=\"pw-status\">\n <p class=\"pw-status-text\">%%status%%<\/p>\n <\/div>\n\n <div class=\"pw-poster\" style=\"background-image: url(%%poster%%);\">\n <img src=\"https://statics.liberation.fr/newnext/images/paywall/calque-paywall.png\" alt=\"\" class=\"pw-poster__image__calque\">\n <\/div>\n\n <div class=\"pw-text\">\n <div class=\"pw-text__title\">\n <p class=\"pw-text__title__text\">%%title%%<\/p>\n <\/div>\n <div class=\"pw-text__desc\">\n <p class=\"pw-text__desc__text\">%%text%%<\/p>\n <\/div>\n <\/div>\n <div class=\"pw-footer\">\n <button class=\"pw-footer__main-cta ldg__main-button\">%%cta_text%%<\/button>\n <a href=\"%%footer_link%%\" class=\"pw-footer__offer-cta\">%%footer_text%%<\/a>\n <\/div>\n <\/div>\n<\/div>\n";
+ var pw_json_deny = "\n<div class=\"pws\">\n <!-- PAYWALL DENY -->\n <div class=\"pw-container pw-container--last\">\n <div class=\"pw-poster\" style=\"background-image: url(%%poster%%);\">\n <img src=\"https://statics.liberation.fr/newnext/images/paywall/calque-paywall.png\" alt=\"\" class=\"pw-poster__image__calque\">\n <\/div>\n <div class=\"pw-text\">\n <div class=\"pw-text__title\">\n <p class=\"pw-text__title__text\">%%title%%<\/p>\n <\/div>\n <div class=\"pw-text__desc\">\n <p class=\"pw-text__desc__text\">%%text%%<\/p>\n <\/div>\n <\/div>\n <div class=\"pw-cta cta-paywall-1\">\n <div class=\"cta-paywall-1__mockup\">\n <img class=\"cta-paywall-1__mockup__image\" src=\"https://statics.liberation.fr/newnext/images/paywall/offer-numerique-mobile.png\" alt=\"\">\n <\/div>\n <div class=\"cta-paywall-1__body\">\n <span class=\"cta-paywall-1__body__info\">%%offer_name%%<\/span>\n <div class=\"cta-paywall-1__body__price\">\n <span class=\"cta-paywall-1__body__price__item\">%%offer_price%%<\/span>\n <p class=\"cta-paywall-1__body__price__text\">\n <span class=\"cta-paywall-1__body__price__text__1\">par mois<\/span>\n <span class=\"cta-paywall-1__body__price__text__2\">sans engagement<\/span>\n <\/p>\n <\/div>\n <\/div>\n <div class=\"cta-paywall-1__footer\">\n <button class=\"ldg__main-button cta-paywall-1__footer__cta ldg__main-button\" data-location=\"%%cta_link%%\">%%cta_text%%<\/button>\n <\/div>\n <\/div>\n <div class=\"pw-footer\">\n <a href=\"%%footer_link%%?next=/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047\" class=\"pw-footer__offer-cta\">%%footer_text%%<\/a>\n <\/div>\n <\/div>\n<\/div>\n";
+
+
+ var paywall = new Paywall();
+
+ paywall.updateCurrentSession();
+
+ paywall.readArticle();
+
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ /*************************************************
+ * Chartbeat *
+ *************************************************/
+
+ var _sf_async_config = {};
+ _sf_async_config.uid = 43601;
+ _sf_async_config.domain = 'liberation.fr';
+ _sf_async_config.useCanonical = true;
+
+
+ _sf_async_config.sections = 'Culture';
+
+
+
+ _sf_async_config.authors = 'Web';
+
+
+ (function() {
+ function loadChartbeat() {
+ window._sf_endpt = (new Date()).getTime();
+ var e = document.createElement('script');
+ e.setAttribute('language', 'javascript');
+ e.setAttribute('type', 'text/javascript');
+ e.setAttribute('src', '//static.chartbeat.com/js/chartbeat.js');
+ document.body.appendChild(e);
+ }
+
+ var oldonload = window.onload;
+ window.onload = (typeof window.onload != "function") ?
+ loadChartbeat : function() { oldonload(); loadChartbeat(); };
+ })();
+
+ /*************************************************
+ * Google Analytics *
+ *************************************************/
+
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+
+ ga('create', 'UA-41822557-1', 'auto');
+
+ ga('set', 'dimension1', libeUserInfo.authenticated.toString()); // authenticated
+ ga('set', 'dimension2', libeUserInfo.access_level); // level
+ ga('set', 'dimension3', libeUserInfo.softwarer_blocker ? 'true': 'false'); // adblock
+ ga('set', 'dimension4', libeUserInfo.xiti_user_id ? // uid
+ libeUserInfo.xiti_user_id.toString() :
+ null
+ );
+
+ if ('undefined' !== typeof libe_ga_datas) {
+ for(var key in libe_ga_datas) {
+ var value = libe_ga_datas[key];
+ ga('set', key, value);
+ }
+ }
+
+ ga('send', 'pageview');
+ //]]>
+ </script> <!--**********************************************
+* Xiti *
+***********************************************-->
+
+ <script type="text/javascript">
+ //<![CDATA[
+
+ xtnv = document; //parent.document or top.document or document
+ xtsd = "https://logs1091";
+ xtsite = "381060";
+ xtn2 = "42"; // level 2
+ xtpage = "Culture::Article_\u002D_Screenshot_Vape_Wave_6_Days_Alphonse_President_\u002D_1612047"; //page name (with the use of :: to create chapters)
+ xtdi = "";
+ xt_pagetype = "2\u002D1\u002D0";
+ xt_multc = "\u0026x1\u003D0\u0026x2\u003D40\u0026x3\u003D10\u0026x4\u003D\u0026x5\u003D20171124\u0026x6\u003D20\u0026x7\u003D1612047";
+
+ // if the user is part of the staff we don't take it into account
+ if (typeof(libeUserInfo["is_staff"]) != "undefined" && libeUserInfo["is_staff"]) {
+ xt_an = "";
+ xt_ac = "";
+ }
+ else {
+ // it is ok to test against libeUserInfo because the script that sets it is blocking
+ xt_an = typeof(libeUserInfo["xiti_user_id"]) == "undefined" ? "" : libeUserInfo["xiti_user_id"];
+ xt_ac = typeof(libeUserInfo["xiti_access_level"]) == "undefined" ? "" : libeUserInfo["xiti_access_level"];
+ }
+
+ // software blocker
+ if (typeof(libeUserInfo["softwarer_blocker"]) != "undefined") {
+ xt_multc += "&x8=" + libeUserInfo["softwarer_blocker"]
+ }
+
+ if (window.xtparam==null) { window.xtparam = ''; }
+ window.xtparam += "&ptype="+xt_pagetype+"&ac="+xt_ac+"&an="+xt_an+xt_multc;
+ //]]>
+ </script> <noscript><img width="1" height="1" alt="xiti" src="https://logs1091.xiti.com/hit.xiti?s=381060&amp;s2=42&amp;p=Culture::Article_-_Screenshot_Vape_Wave_6_Days_Alphonse_President_-_1612047&amp;ptype=2-1-0&amp;di=&amp;ac=&amp;an=&amp;x1=0&amp;x2=40&amp;x3=10&amp;x4=&amp;x5=20171124&amp;x6=20&amp;x7=1612047" /></noscript>
+ <script type="text/javascript" src="https://statics.liberation.fr/newnext/cache/js/8f00b3ddc4db.js"></script> <!--/*********************************************
+* Mediametrie *
+**********************************************/-->
+ <script>
+ <![CDATA[
+
+ (function(){
+ // 1. Loading the measurement system
+ var aS = document.createElement('script');
+ aS.type = 'text/javascript';
+ aS.async = true;
+ aS.src = 'https://tag.audience.acpm.fr/js/on-1.0.min.js';
+
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(aS, s);
+
+ // 2. Sending the measurement
+ if(aS.addEventListener) {
+ aS.addEventListener('load', function(){
+ aSloaded();
+ }, false)
+ } else {
+ aS.onreadystatechange = function () {
+ if (aS.readyState in {complete: 1, loaded: 1}) {
+ aSloaded();
+ }
+ };
+ }
+ aSloaded = function(){
+ var tag = new Acpm.Tag("201001216586"); // Insert the serial provided by ACPM
+ tag.send();
+ };
+ })();
+ ]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var sasOptions = {
+ siteId: 130093,
+ pageId: 736918,
+ formats: ['28993', '28999', '28991', '28990', '29000'],
+ target: {
+ support: 'article',
+ objectId: '1612047',
+ primarySection: '54',
+ typology: '10',
+ section: [9,54],
+ site: '2'
+ }
+ };
+
+
+ Article.init();
+
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ initInfinityScroll({
+ $container: $('.js-infinity-section-container'),
+ replaceState: false,
+ limitPages: 1,
+ });
+ $(document).on('infinityScrollNewPage', function(){
+ $('img').unveil();
+ })
+ //]]>
+ </script> <!-- Eulerian Analytics - Tag Generique -->
+
+ <script type="text/javascript">
+
+ /*<![CDATA[*/
+ var dmp = {
+ cat1: '',
+ cats: '',
+ keywords: '',
+ uid: libeUserInfo.email_hash
+ };
+
+ dmp.keywords = ['Documentaire', 'Libération', 'Netflix', 'Arte', 'Marsha P. Johnson', 'Alan Moore', 'France', 'New York', 'Cinéaste', 'Thriller', 'Special Air Service', 'Acteur', 'Web\u002Dsérie', 'Opération Nimrod', 'Jim Carrey', 'Winamp', 'Planète+', 'Queer', 'LGBT', 'Icône', 'From Hell', 'Comique', 'Etty Buzyn', 'Bande\u002Dannonce', 'Jefferson Starship', 'Vieux\u002Dcroyants', 'Greenwich Village', 'V pour Vendetta', 'Michel Vuillermoz', 'Évangélisation', 'Sans\u002Dabri', 'Frein de bicyclette', 'Cigarette', 'Allergie', 'États\u002DUnis', 'Dieu merci!', 'Londres', 'Édouard Baer', 'Clément Cogitore', 'Margaret Thatcher', 'Vidéo à la demande', 'Pays de la Loire', 'Cinéma', 'Brasses', 'Réalisateur', '10 Downing Street', 'Jérusalem', 'Orange Cinéhappy', 'Mégot', 'Long métrage', 'Un grand patron', 'Droits de l\u0027homme', 'Baron noir', 'Ermites dans la taïga', 'DVD', 'Parfum', 'Financement participatif', 'Révolution', 'Albert Dupontel', 'Sénat', 'Andy Kaufman', 'Autarcie', 'Royaume\u002DUni', 'Famille Lykov', 'Brexit', 'Captures d\u0027écran', 'Jan Kounen', 'Dobermann', 'Comédie\u002DFrançaise', 'Famille', 'Taïga', 'Queen', 'Prise d\u0027otages des Jeux olympiques de Munich', 'Président de la République', '99 francs', 'Langue de bois', 'Miloš Forman', 'Torture', 'Watchmen', 'Anonymous', 'François Hollande', 'The Dead Lands', 'Mark Strong', 'Jamie Bell', 'Nabiha Akkari', 'Jean\u002DMichel Lahmi', 'France 3 Limousin', 'Tournage', 'Élysée', 'Cigarette électronique', 'Billy Elliot', 'Andy Warhol', 'Vaudou', 'Des lendemains qui chantent', 'Prostitution', 'Angleterre', 'Rosa Parks', 'Bob Zmuda', 'Émeutes de Stonewall', 'CNC', 'MtF', 'Tabac', 'Michel Serres', 'Violence', 'ADAGP', 'French Touch', 'Premier ministre', 'Canal+', 'Danse', 'Man on the Moon', 'The Great Beyond', 'Veep', 'House of Cards', 'Vassili Peskov', ];
+ dmp.cat1 = 'culture';
+ dmp.cats = ['la-une','culture'];
+
+
+ var EA_data = [
+ 'path','LIB_WEB/https://next.liberation.fr/culture/2017/11/24/screenshot-vape-wave-6-days-alphonse-president_1612047'.replace('http://', '') /*Nom de page*/
+ ,'uid',dmp.uid /*Email hashé*/
+ ,'cflag-key','keywords'
+ ,'cflag-val',dmp.keywords /*Mots-clef gestion de type array*/
+ ,'adblocker',Boolean(libeUserInfo.softwarer_blocker) ? 'oui' : 'non' /*Présence adblocker actif*/
+ ,'abonnement',libeUserInfo.access_level/*Niveau d'abonnement*/
+ ,'login_status', libeUserInfo.authenticated ? 'oui' : 'non' /*Statut login*/
+ ,'cflag-key','site'
+ ,'cflag-val','LIB_WEB'/*sites apps*/
+ ,'cflag-key','sous-domaine'
+ ,'cflag-val','next.liberation.fr'/*Sous domaine*/
+ ,'cflag-key','page_cat1'
+ ,'cflag-val',dmp.cat1/*Catégorie page niv.1*/
+ ,'cflag-key','page-cats'
+ ,'cflag-val',dmp.cats/*gestion de type array*/
+ ,'cflag-key','Login_status'
+ ,'cflag-val',libeUserInfo.authenticated ? 'oui' : 'non'/*Statut login*/
+ ];
+ (function(){var td='f7ds.liberation.fr',d=document,l=d.location;if(!l.protocol.indexOf('http')){var
+ o=d.createElement('script'),a=d.getElementsByTagName('script')[0],cn=parseInt((new Date()).getTime()/3600000),cj='',cdh=(l.host+td).replace(/[^az]/g,''),cdr=cdh+cdh.toUpperCase(),acdr=cdr.split('');for(var
+ i=-1;i<cn%7;i++){cj+=acdr[(cn+i)%acdr.length];}o.type='text/javascript';o.async='async';o.defer='defer';o.src='//'+td+'/'+cj+(cn%8760)+'.js';a.parentNode.insertBefore(o,a);}})();
+ /*]]>*/
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ var n_pbt='';
+ var nuggrid = encodeURIComponent(top.location.href);
+ document.write(
+ '<scr' + 'ipt type="text/javascript" src="//asqliberation.nuggad.net/rc?nuggn=400929945&nuggsid=1709843951&nuggrid=' + nuggrid + '"><\/scr' + 'ipt>');
+ //]]>
+ </script>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ // -- Libération -- //
+
+ !function(a,b,c){"use strict";function d(a){var b=e[c]||{};e[c]=b,b[a]||(b[a]=function(){e._queue[c].push({method:a,args:Array.prototype.slice.apply(arguments)})})}var e=a.scimhtiraidem||{},f="init call config push pushDefault addProperties addProperty onFinish onStart _reset".split(" ");e._queue=e._queue||{},e._names=e._names||[],e._names.push(c),e._queue[c]=e._queue[c]||[],e._startTime=(new Date).getTime(),e._snippetVersion="2.0";for(var g=0;g<f.length;g++)d(f[g]);a.scimhtiraidem=e,a[c]=e[c];var h=b.createElement("script");h.setAttribute("type","text/javascript"),h.setAttribute("src","//static.mediarithmics.com/tag/1/tag.min.js"),h.setAttribute("async","true"),b.getElementsByTagName("script")[0].parentNode.appendChild(h)}(window,document,"gravity");
+
+ gravity.init({
+ mode: "VISIT",
+ site_token: "lib-main17"
+ });
+
+ var drProperties = {"page_keywords": "Documentaire,Lib\u00e9ration,Netflix,Arte,Marsha P. Johnson,Alan Moore,France,New York,Cin\u00e9aste,Thriller,Special Air Service,Acteur,Web-s\u00e9rie,Op\u00e9ration Nimrod,Jim Carrey,Winamp,Plan\u00e8te+,Queer,LGBT,Ic\u00f4ne,From Hell,Comique,Etty Buzyn,Bande-annonce,Jefferson Starship,Vieux-croyants,Greenwich Village,V pour Vendetta,Michel Vuillermoz,\u00c9vang\u00e9lisation,Sans-abri,Frein de bicyclette,Cigarette,Allergie,\u00c9tats-Unis,Dieu merci!,Londres,\u00c9douard Baer,Cl\u00e9ment Cogitore,Margaret Thatcher,Vid\u00e9o \u00e0 la demande,Pays de la Loire,Cin\u00e9ma,Brasses,R\u00e9alisateur,10 Downing Street,J\u00e9rusalem,Orange Cin\u00e9happy,M\u00e9got,Long m\u00e9trage,Un grand patron,Droits de l'homme,Baron noir,Ermites dans la ta\u00efga,DVD,Parfum,Financement participatif,R\u00e9volution,Albert Dupontel,S\u00e9nat,Andy Kaufman,Autarcie,Royaume-Uni,Famille Lykov,Brexit,Captures d'\u00e9cran,Jan Kounen,Dobermann,Com\u00e9die-Fran\u00e7aise,Famille,Ta\u00efga,Queen,Prise d'otages des Jeux olympiques de Munich,Pr\u00e9sident de la R\u00e9publique,99 francs,Langue de bois,Milo\u0161 Forman,Torture,Watchmen,Anonymous,Fran\u00e7ois Hollande,The Dead Lands,Mark Strong,Jamie Bell,Nabiha Akkari,Jean-Michel Lahmi,France 3 Limousin,Tournage,\u00c9lys\u00e9e,Cigarette \u00e9lectronique,Billy Elliot,Andy Warhol,Vaudou,Des lendemains qui chantent,Prostitution,Angleterre,Rosa Parks,Bob Zmuda,\u00c9meutes de Stonewall,CNC,MtF,Tabac,Michel Serres,Violence,ADAGP,French Touch,Premier ministre,Canal+,Danse,Man on the Moon,The Great Beyond,Veep,House of Cards,Vassili Peskov", "page_typology": "Article", "page_domain": "next.liberation.fr", "page_title": "Screenshot\u00a0: \u00abVape Wave\u00bb, \u00ab6\u00a0Days\u00bb, \u00abAlphonse Pr\u00e9sident\u00bb\u2026", "page_section": "culture"};
+
+ gravity.push("$page_view", drProperties);
+
+ //]]>
+ </script> <!-- Google Tag Manager -->
+ <!-- <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-V9PX"
+height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+})(window,document,'script','dataLayer','GTM-V9PX');</script> -->
+ <!-- End Google Tag Manager -->
+ <!-- Twitter universal website tag code -->
+ <script>
+ <![CDATA[
+
+ !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
+ },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',
+ a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
+ // Insert Twitter Pixel ID and Standard Event data below
+ twq('init','nx3h2');
+ twq('track','PageView');
+ ]]>
+ </script> <!-- End Twitter universal website tag code -->
+ <!-- Facebook Pixel Code -->
+ <script>
+ <![CDATA[
+
+ !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
+ n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
+ n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
+ t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
+ document,'script','https://connect.facebook.net/en_US/fbevents.js');
+ fbq('init', '342040669704613'); // Insert your pixel ID here.
+ fbq('track', 'PageView');
+ ]]>
+ </script> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=342040669704613&amp;ev=PageView&amp;noscript=1" /></noscript> <!-- DO NOT MODIFY -->
+ <!-- End Facebook Pixel Code -->
+ <!-- Code Google de la balise de remarketing -->
+ <script type="text/javascript">
+
+ /* <![CDATA[ */
+ var google_conversion_id = 964330869;
+ var google_custom_params = window.google_tag_params;
+ var google_remarketing_only = true;
+ /* ]]> */
+ </script>
+ <script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js"></script> <noscript>
+ <div style="display:inline;">
+ <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/964330869/?guid=ON&amp;script=0" />
+ </div></noscript> <!-- Quantcast Tag -->
+ <script>
+ <![CDATA[
+
+ var ezt = ezt ||[];
+
+ (function(){
+ var elem = document.createElement('script');
+ elem.src = (document.location.protocol == "https:" ? "https://secure" : "http://pixel") + ".quantserve.com/aquant.js?a=p-9E79g-9qXk8bk";
+ elem.async = true;
+ elem.type = "text/javascript";
+ var scpt = document.getElementsByTagName('script')[0];
+ scpt.parentNode.insertBefore(elem,scpt);
+ }());
+
+
+ ezt.push({qacct: 'p-9E79g-9qXk8bk',
+ uid: ''
+ });
+ ]]>
+ </script> <noscript><img src="//pixel.quantserve.com/pixel/p-9E79g-9qXk8bk.gif" style="display: none;" border="0" height="1" width="1" alt="Quantcast" /></noscript> <!-- End Quantcast Tag -->
+ <!-- Pixel MathTag Tag -->
+ <img src="//pixel.mathtag.com/event/img?mt_id=1202018&amp;mt_adid=192531&amp;mt_exem=&amp;mt_excl=&amp;v1=&amp;v2=&amp;v3=&amp;s1=&amp;s2=&amp;s3=" width="1" height="1" /> <!-- End Pixel MathTag Tag-->
+
+ <script src="https://dhpikd1t89arn.cloudfront.net/js/include/sharethefacts-v1.js"></script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html
index ed051e882..7fd81feaf 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-1/expected.html
@@ -1,4 +1,5 @@
<article>
+
<p> <span>CAIRO —</span> Gunmen opened fire on visitors at
Tunisia’s most renowned museum on Wednesday, killing at least 19 people,
including 17 foreigners, in an assault that threatened to upset the fragile
@@ -112,7 +113,9 @@
<p>In January, Libyan militants loyal to the Islamic State <a href="http://www.washingtonpost.com/world/middle_east/video-shows-purported-beheading-of-egyptian-christians-in-libya/2015/02/15/b8d0f092-b548-11e4-bc30-a4e75503948a_story.html">beheaded 21 Christians</a> —
20 of them Egyptian Copts — along the country’s coast. They later seized
the Libyan city of Sirte.</p>
- <p><img data-hi-res-src="https://img.washingtonpost.com/rf/image_1484w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ" data-low-res-src="https://img.washingtonpost.com/rf/image_480w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ" src="https://img.washingtonpost.com/rf/image_480w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ"></img><br></br></p>
+ <p><img data-hi-res-src="https://img.washingtonpost.com/rf/image_1484w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ" data-low-res-src="https://img.washingtonpost.com/rf/image_480w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ" src="https://img.washingtonpost.com/rf/image_480w/2010-2019/WashingtonPost/2015/03/18/Foreign/Graphics/tunisia600.jpg?uuid=1_yuLs2LEeSHME9HNBbnWQ">
+ <br>
+ </p>
<p>Officials are worried about the number of Tunisian militants who may have
joined the jihadists in Libya — with the goal of returning home to fight
the Tunis government.</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html
index cb2a8ceda..d87cb3755 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wapo-2/expected.html
@@ -1,6 +1,8 @@
<p><a name="1c164a7079bfe20ebd611d79f96418b5a225cbc6"></a>
- <img data-hi-res-src="https://img.washingtonpost.com/rf/image_1484w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg" data-low-res-src="https://img.washingtonpost.com/rf/image_400w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg" src="https://img.washingtonpost.com/rf/image_400w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg"></img><br></br><span>Israeli Prime Minister Benjamin Netanyahu reacts as he visits the Western Wall in Jerusalem on March 18 following his party's victory in Israel's general election. (Thomas Coex/AFP/Getty Images)</span>
- </p><article><p>President Obama told the U.N. General Assembly 18 months ago that he would
+ <img src="https://img.washingtonpost.com/rf/image_400w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg" data-hi-res-src="https://img.washingtonpost.com/rf/image_1484w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg" data-low-res-src="https://img.washingtonpost.com/rf/image_400w/2010-2019/WashingtonPost/2015/03/18/National-Economy/Images/Nic6429750-1140.jpg?uuid=zLIZQs2KEeSip5UXo6cFBg">
+ <br> <span>Israeli Prime Minister Benjamin Netanyahu reacts as he visits the Western Wall in Jerusalem on March 18 following his party's victory in Israel's general election. (Thomas Coex/AFP/Getty Images)</span>
+ </p><article>
+ <p>President Obama told the U.N. General Assembly 18 months ago that he would
seek “real breakthroughs on these two issues — Iran’s nuclear program and
­Israeli-Palestinian peace.”</p>
<p>But <a href="http://www.washingtonpost.com/world/netanyahu-sweeps-to-victory-in-israeli-election/2015/03/18/af4e50ca-ccf2-11e4-8730-4f473416e759_story.html" title="www.washingtonpost.com">Benjamin Netanyahu’s triumph</a> in Tuesday’s
@@ -95,7 +97,7 @@
<p>“That could be an issue forced onto the agenda about the same time as
a potential nuclear deal.”</p>
- </article><div><p><a href="http://www.washingtonpost.com/people/steven-mufson"><img src="http://img.washingtonpost.com/wp-apps/imrs.php?src=http://www.washingtonpost.com/blogs/wonkblog/files/2014/07/mufson_steve.jpg&amp;h=180&amp;w=180"></img></a></p><p>Steven Mufson covers the White House. Since joining The Post, he has covered
+ </article><div><p><a href="http://www.washingtonpost.com/people/steven-mufson"><img src="http://img.washingtonpost.com/wp-apps/imrs.php?src=http://www.washingtonpost.com/blogs/wonkblog/files/2014/07/mufson_steve.jpg&amp;h=180&amp;w=180"></a></p><p>Steven Mufson covers the White House. Since joining The Post, he has covered
economics, China, foreign policy and energy.</p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html
index d9e181691..f9f1d5d73 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/webmd-2/expected.html
@@ -6,18 +6,19 @@
- <p>April 17, 2015 -- Imagine being sick in the hospital with a <a class="" href="http://www.webmd.com/a-to-z-guides/bacterial-and-viral-infections" onclick="return sl(this,'','embd-lnk');">bacterial infection</a> and doctors can't stop it from spreading. This so-called "superbug" scenario is not science fiction. It's an urgent, worldwide worry that is prompting swift action.</p>
+ <p>April 17, 2015 -- Imagine being sick in the hospital with a <a href="http://www.webmd.com/a-to-z-guides/bacterial-and-viral-infections" onclick="return sl(this,'','embd-lnk');" class>bacterial infection</a> and doctors can't stop it from spreading. This so-called "superbug" scenario is not science fiction. It's an urgent, worldwide worry that is prompting swift action.</p>
<p xmlns:xalan="http://xml.apache.org/xalan">Every year, about 2 million people get sick from a superbug, according to the CDC. About 23,000 die. Earlier this year, an outbreak of CRE (carbapenem-resistant enterobacteriaceae) linked to contaminated medical tools sickened 11 people at two Los-Angeles area hospitals. Two people died, and more than 200 others may have been exposed.</p>
- <p>The White House recently released a <a href="http://www.webmd.com/click?url=https://www.whitehouse.gov/sites/default/files/docs/national_action_plan_for_combating_antibotic-resistant_bacteria.pdf" onclick="return sl(this,'','embd-lnk');">comprehensive plan</a> outlining steps to combat drug-resistant bacteria. The plan identifies three "urgent" and several "serious" threats. We asked infectious disease experts to explain what some of them are and when to worry.</p>
+ <p>The White House recently released a <a onclick="return sl(this,'','embd-lnk');" href="http://www.webmd.com/click?url=https://www.whitehouse.gov/sites/default/files/docs/national_action_plan_for_combating_antibotic-resistant_bacteria.pdf">comprehensive plan</a> outlining steps to combat drug-resistant bacteria. The plan identifies three "urgent" and several "serious" threats. We asked infectious disease experts to explain what some of them are and when to worry.</p>
+
<h3>But First: What's a Superbug? </h3>
- <p>It's a term coined by the media to describe bacteria that cannot be killed using multiple <a class="" href="http://www.webmd.com/cold-and-flu/rm-quiz-antibiotics-myths-facts" onclick="return sl(this,'','embd-lnk');">antibiotics</a>. "It resonates because it's scary," says Stephen Calderwood, MD, president of the Infectious Diseases Society of America. "But in fairness, there is no real definition."</p>
+ <p>It's a term coined by the media to describe bacteria that cannot be killed using multiple <a href="http://www.webmd.com/cold-and-flu/rm-quiz-antibiotics-myths-facts" onclick="return sl(this,'','embd-lnk');" class>antibiotics</a>. "It resonates because it's scary," says Stephen Calderwood, MD, president of the Infectious Diseases Society of America. "But in fairness, there is no real definition."</p>
<p>Instead, doctors often use phrases like "multidrug-resistant bacteria." That's because a superbug isn't necessarily resistant to all antibiotics. It refers to bacteria that can't be treated using two or more, says Brian K. Coombes, PhD, of McMaster University in Ontario.</p>
<p>Any species of bacteria can turn into a superbug.</p>
<p>Misusing antibiotics (such as taking them when you don't need them or not finishing all of your medicine) is the "single leading factor" contributing to this problem, the CDC says. The concern is that eventually doctors will run out of antibiotics to treat them.</p>
<p>"What the public should know is that the more antibiotics you’ve taken, the higher your superbug risk," says Eric Biondi, MD, who runs a program to decrease unnecessary antibiotic use. "The more encounters you have with the hospital setting, the higher your superbug risk."</p>
- <p>"Superbugs should be a concern to everyone," Coombes says. "Antibiotics are the foundation on which all modern medicine rests. Cancer <a class="" href="http://www.webmd.com/cancer/chemotherapy-what-to-expect" onclick="return sl(this,'','embd-lnk');">chemotherapy</a>, <a class="" href="http://www.webmd.com/a-to-z-guides/organ-donation-facts" onclick="return sl(this,'','embd-lnk');">organ transplants</a>, surgeries, and <a class="" href="http://www.webmd.com/baby/guide/delivery-methods" onclick="return sl(this,'','embd-lnk');">childbirth</a> all rely on antibiotics to prevent infections. If you can't treat those, then we lose the medical advances we have made in the last 50 years."</p>
+ <p>"Superbugs should be a concern to everyone," Coombes says. "Antibiotics are the foundation on which all modern medicine rests. Cancer <a href="http://www.webmd.com/cancer/chemotherapy-what-to-expect" onclick="return sl(this,'','embd-lnk');" class>chemotherapy</a>, <a href="http://www.webmd.com/a-to-z-guides/organ-donation-facts" onclick="return sl(this,'','embd-lnk');" class>organ transplants</a>, surgeries, and <a href="http://www.webmd.com/baby/guide/delivery-methods" onclick="return sl(this,'','embd-lnk');" class>childbirth</a> all rely on antibiotics to prevent infections. If you can't treat those, then we lose the medical advances we have made in the last 50 years."</p>
<p>Here are some of the growing superbug threats identified in the 2015 White House report.</p>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html
index de18ee3f3..eb8eb6e55 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikia/expected.html
@@ -1,25 +1,26 @@
<div>
- <p>Although Lucasfilm is already planning a birthday bash for the Star Wars Saga at <a data-is="trackable" href="http://starwars.wikia.com/wiki/Celebration_Orlando" riot-tag="trackable">Celebration Orlando</a> this April, fans might get another present for the saga’s 40th anniversary. According to fan site <a data-is="trackable" href="http://makingstarwars.net/2017/02/rumor-unaltered-original-star-wars-trilogy-re-released-year/" riot-tag="trackable">MakingStarWars.net</a>, rumors abound that Lucasfilm might re-release the unaltered cuts of the saga’s original trilogy.</p>
+ <p>Although Lucasfilm is already planning a birthday bash for the Star Wars Saga at <a href="http://starwars.wikia.com/wiki/Celebration_Orlando" data-is="trackable" riot-tag="trackable">Celebration Orlando</a> this April, fans might get another present for the saga’s 40th anniversary. According to fan site <a href="http://makingstarwars.net/2017/02/rumor-unaltered-original-star-wars-trilogy-re-released-year/" data-is="trackable" riot-tag="trackable">MakingStarWars.net</a>, rumors abound that Lucasfilm might re-release the unaltered cuts of the saga’s original trilogy.</p>
<p>If the rumors are true, this is big news for Star Wars fans. Aside from limited VHS releases, the unaltered cuts of the original trilogy films haven’t been available since they premiered in theaters in the 1970s and ’80s. If Lucasfilm indeed re-releases the films’ original cuts, then this will be the first time in decades that fans can see the films in their original forms. Here’s what makes the unaltered cuts of the original trilogy so special.</p>
<h2>The Star Wars Special Editions Caused Controversy
- <a data-is="trackable" href="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b" riot-tag="trackable"><img alt="star wars han solo" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px" src="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/627" srcset="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/1200 1200w"></img></a>
+ <a href="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b" data-is="trackable" riot-tag="trackable"><img src="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/627" alt="star wars han solo" srcset="https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/e80dae8a-b955-43f6-8ada-f023385e622b/scale-to-width-down/1200 1200w" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px"></a>
</h2>
- <p>Thanks to the commercial success of Star Wars, <a data-is="trackable" href="http://starwars.wikia.com/wiki/George_Lucas" riot-tag="trackable">George Lucas</a> has revisited and further edited his films for re-releases. The most notable — and controversial — release were the <a data-is="trackable" href="http://starwars.wikia.com/wiki/The_Star_Wars_Trilogy_Special_Edition" riot-tag="trackable">Special Editions</a> of the original trilogy. In 1997, to celebrate the saga’s 20th anniversary, Lucasfilm spent a total of $15 million to remaster <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_IV_A_New_Hope" riot-tag="trackable"><em>A New Hope</em></a>, <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_V_The_Empire_Strikes_Back" riot-tag="trackable"><em>The Empire Strikes Back</em></a>, and <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_VI_Return_of_the_Jedi" riot-tag="trackable"><em>Return of the Jedi</em></a>. The Special Editions had stints in theaters before moving to home media.</p>
- <p>Although most of the Special Editions’ changes were cosmetic, others significantly affected the plot of the films. The most notable example is the “<a data-is="trackable" href="http://starwars.wikia.com/wiki/Han_shot_first" riot-tag="trackable">Han shot first</a>” scene in <em>A New Hope</em>. As a result, the Special Editions generated significant controversy among Star Wars fans. Many fans remain skeptical about George Lucas’s decision to finish each original trilogy film “the way it was meant to be.”</p>
+ <p>Thanks to the commercial success of Star Wars, <a href="http://starwars.wikia.com/wiki/George_Lucas" data-is="trackable" riot-tag="trackable">George Lucas</a> has revisited and further edited his films for re-releases. The most notable — and controversial — release were the <a href="http://starwars.wikia.com/wiki/The_Star_Wars_Trilogy_Special_Edition" data-is="trackable" riot-tag="trackable">Special Editions</a> of the original trilogy. In 1997, to celebrate the saga’s 20th anniversary, Lucasfilm spent a total of $15 million to remaster <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_IV_A_New_Hope" data-is="trackable" riot-tag="trackable"><em>A New Hope</em></a>, <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_V_The_Empire_Strikes_Back" data-is="trackable" riot-tag="trackable"><em>The Empire Strikes Back</em></a>, and <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_VI_Return_of_the_Jedi" data-is="trackable" riot-tag="trackable"><em>Return of the Jedi</em></a>. The Special Editions had stints in theaters before moving to home media.</p>
+ <p>Although most of the Special Editions’ changes were cosmetic, others significantly affected the plot of the films. The most notable example is the “<a href="http://starwars.wikia.com/wiki/Han_shot_first" data-is="trackable" riot-tag="trackable">Han shot first</a>” scene in <em>A New Hope</em>. As a result, the Special Editions generated significant controversy among Star Wars fans. Many fans remain skeptical about George Lucas’s decision to finish each original trilogy film “the way it was meant to be.”</p>
<p>
- <a data-is="trackable" href="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9" riot-tag="trackable"><img alt="star wars" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px" src="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/627" srcset="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/1200 1200w"></img></a>
+ <a href="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9" data-is="trackable" riot-tag="trackable"><img src="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/627" alt="star wars" srcset="https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/375e0e5a-170d-4560-8f20-240c9f0624e9/scale-to-width-down/1200 1200w" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px"></a>
</p>
- <p>While the Special Editions represent the most significant edits to the original trilogy, the saga has undergone other changes. Following up on the saga’s first Blu-ray release in 2011, Industrial Light &amp; Magic (ILM) began remastering the entire saga in 3D, starting with the prequel trilogy. <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_I_The_Phantom_Menace" riot-tag="trackable"><em>The Phantom Menace</em></a> saw a theatrical 3D re-release in 2012, but Disney’s 2012 acquisition of Lucasfilm indefinitely postponed further 3D releases.</p>
- <p>In 2015, <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_II_Attack_of_the_Clones" riot-tag="trackable"><em>Attack of the Clones</em></a> and <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_III_Revenge_of_the_Sith" riot-tag="trackable"><em>Revenge of the Sith</em></a> received limited 3D showings at <a data-is="trackable" href="http://starwars.wikia.com/wiki/Celebration_Anaheim" riot-tag="trackable">Celebration Anaheim</a>. Other than that, it seems as though Disney has decided to refocus Lucasfilm’s efforts to new films. Of course, that’s why the saga has produced new content beginning with <a data-is="trackable" href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_VII_The_Force_Awakens" riot-tag="trackable"><em>The Force Awakens</em></a>. However, it looks like Lucasfilm isn’t likely to generate 3D versions of the original trilogy anytime soon.</p>
+ <p>While the Special Editions represent the most significant edits to the original trilogy, the saga has undergone other changes. Following up on the saga’s first Blu-ray release in 2011, Industrial Light &amp; Magic (ILM) began remastering the entire saga in 3D, starting with the prequel trilogy. <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_I_The_Phantom_Menace" data-is="trackable" riot-tag="trackable"><em>The Phantom Menace</em></a> saw a theatrical 3D re-release in 2012, but Disney’s 2012 acquisition of Lucasfilm indefinitely postponed further 3D releases.</p>
+ <p>In 2015, <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_II_Attack_of_the_Clones" data-is="trackable" riot-tag="trackable"><em>Attack of the Clones</em></a> and <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_III_Revenge_of_the_Sith" data-is="trackable" riot-tag="trackable"><em>Revenge of the Sith</em></a> received limited 3D showings at <a href="http://starwars.wikia.com/wiki/Celebration_Anaheim" data-is="trackable" riot-tag="trackable">Celebration Anaheim</a>. Other than that, it seems as though Disney has decided to refocus Lucasfilm’s efforts to new films. Of course, that’s why the saga has produced new content beginning with <a href="http://starwars.wikia.com/wiki/Star_Wars:_Episode_VII_The_Force_Awakens" data-is="trackable" riot-tag="trackable"><em>The Force Awakens</em></a>. However, it looks like Lucasfilm isn’t likely to generate 3D versions of the original trilogy anytime soon.</p>
<h2>Why the Original Film Cuts Matter</h2>
<p>
- <a data-is="trackable" href="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9" riot-tag="trackable"><img alt="" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px" src="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/627" srcset="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/1200 1200w"></img></a>
+ <a href="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9" data-is="trackable" riot-tag="trackable"><img src="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/627" alt srcset="https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/400 400w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/627 627w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/800 800w, https://vignette.wikia.nocookie.net/1fb5ee36-d9ae-4125-96d9-f52eb403f1c9/scale-to-width-down/1200 1200w" sizes="(max-width: 840px) 100vw, (max-width: 1064px) calc(100vw - 300px), 627px"></a>
</p>
- <p>Admittedly, the differences between the original trilogy’s unaltered cuts and the Special Editions appeal to more hardcore fans. Casual fans are less likely to care about whether <a data-is="trackable" href="http://starwars.wikia.com/wiki/Greedo" riot-tag="trackable">Greedo</a> or <a data-is="trackable" href="http://starwars.wikia.com/wiki/Han_Solo" riot-tag="trackable">Han Solo</a> shot first. Still, given Star Wars’ indelible impact on pop culture, there’s certainly a market for the original trilogy’s unaltered cuts. They might not be for every Star Wars fan, but many of us care about them.</p>
- <p>ILM supervisor <a data-is="trackable" href="http://starwars.wikia.com/wiki/John_Knoll" riot-tag="trackable">John Knoll</a>, who first pitched the <a data-is="trackable" href="http://fandom.wikia.com/videos/john-knoll-important-rogue-one" riot-tag="trackable">story idea</a> for <a data-is="trackable" href="http://starwars.wikia.com/wiki/Rogue_One:_A_Star_Wars_Story" riot-tag="trackable"><em>Rogue One</em></a>, said <a data-is="trackable" href="http://lwlies.com/interviews/gareth-edwards-rogue-one-a-star-wars-story/" riot-tag="trackable">last year</a> that ILM finished a brand new 4K restoration print of <em>A New Hope</em>. For that reason, it seems likely that Lucasfilm will finally give diehard fans the original film cuts that they’ve clamored for. There’s no word yet whether the unaltered cuts will be released in theaters or on home media. At the very least, however, fans will likely get them after all this time. After all, the Special Editions marked the saga’s 20th anniversary. Star Wars turns 40 years old this year, so there’s no telling what’s in store.</p>
- <hr></hr><p>
+ <p>Admittedly, the differences between the original trilogy’s unaltered cuts and the Special Editions appeal to more hardcore fans. Casual fans are less likely to care about whether <a href="http://starwars.wikia.com/wiki/Greedo" data-is="trackable" riot-tag="trackable">Greedo</a> or <a href="http://starwars.wikia.com/wiki/Han_Solo" data-is="trackable" riot-tag="trackable">Han Solo</a> shot first. Still, given Star Wars’ indelible impact on pop culture, there’s certainly a market for the original trilogy’s unaltered cuts. They might not be for every Star Wars fan, but many of us care about them.</p>
+ <p>ILM supervisor <a href="http://starwars.wikia.com/wiki/John_Knoll" data-is="trackable" riot-tag="trackable">John Knoll</a>, who first pitched the <a href="http://fandom.wikia.com/videos/john-knoll-important-rogue-one" data-is="trackable" riot-tag="trackable">story idea</a> for <a href="http://starwars.wikia.com/wiki/Rogue_One:_A_Star_Wars_Story" data-is="trackable" riot-tag="trackable"><em>Rogue One</em></a>, said <a href="http://lwlies.com/interviews/gareth-edwards-rogue-one-a-star-wars-story/" data-is="trackable" riot-tag="trackable">last year</a> that ILM finished a brand new 4K restoration print of <em>A New Hope</em>. For that reason, it seems likely that Lucasfilm will finally give diehard fans the original film cuts that they’ve clamored for. There’s no word yet whether the unaltered cuts will be released in theaters or on home media. At the very least, however, fans will likely get them after all this time. After all, the Special Editions marked the saga’s 20th anniversary. Star Wars turns 40 years old this year, so there’s no telling what’s in store.</p>
+ <hr>
+ <p>
<em>
- Would you like to be part of the Fandom team? <a data-is="trackable" href="http://fandom.wikia.com/fan-contributor" riot-tag="trackable">Join our Fan Contributor Program</a> and share your voice on <a data-is="trackable" href="http://fandom.wikia.com" riot-tag="trackable">Fandom.com</a>! </em>
+ Would you like to be part of the Fandom team? <a href="http://fandom.wikia.com/fan-contributor" data-is="trackable" riot-tag="trackable">Join our Fan Contributor Program</a> and share your voice on <a href="http://fandom.wikia.com" data-is="trackable" riot-tag="trackable">Fandom.com</a>! </em>
</p>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-images.json
new file mode 100644
index 000000000..c72eb5af8
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-images.json
@@ -0,0 +1,47 @@
+[
+ "https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/3e\/Flag_of_New_Zealand.svg\/1200px-Flag_of_New_Zealand.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/3e\/Flag_of_New_Zealand.svg\/125px-Flag_of_New_Zealand.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d3\/Coat_of_arms_of_New_Zealand.svg\/85px-Coat_of_arms_of_New_Zealand.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/29\/NZL_orthographic_NaturalEarth.svg\/250px-NZL_orthographic_NaturalEarth.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/b\/b0\/Increase2.svg\/11px-Increase2.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/a\/ab\/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png\/220px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/4b\/Polynesian_Migration.svg\/290px-Polynesian_Migration.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/22\/Cook_chart_of_New_Zealand.jpg\/170px-Cook_chart_of_New_Zealand.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/8\/87\/Treatyofwaitangi.jpg\/170px-Treatyofwaitangi.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/3b\/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg\/290px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/a\/ad\/Queen_Elizabeth_II_of_New_Zealand_2.jpg\/152px-Queen_Elizabeth_II_of_New_Zealand_2.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/6\/6f\/Ardern_Cropped.png\/152px-Ardern_Cropped.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/32\/Seddon_Statue_in_Parliament_Grounds.jpg\/220px-Seddon_Statue_in_Parliament_Grounds.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/77\/E_003261_E_Maoris_in_North_Africa_July_1941.jpg\/220px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d4\/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg\/220px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/4b\/NZL_orthographic_NaturalEarth_labelled_en.svg\/400px-NZL_orthographic_NaturalEarth_labelled_en.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/3e\/Flag_of_New_Zealand.svg\/23px-Flag_of_New_Zealand.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/35\/Flag_of_the_Cook_Islands.svg\/23px-Flag_of_the_Cook_Islands.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/0\/01\/Flag_of_Niue.svg\/23px-Flag_of_Niue.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/8\/8e\/Flag_of_Tokelau.svg\/23px-Flag_of_Tokelau.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/a\/a5\/New_Zealand_23_October_2002.jpg\/170px-New_Zealand_23_October_2002.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/44\/Mt_Cook%2C_NZ.jpg\/220px-Mt_Cook%2C_NZ.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/7b\/New_Zealand_moutain_ranges.jpg\/220px-New_Zealand_moutain_ranges.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/e\/e5\/Lake_Gunn.jpg\/269px-Lake_Gunn.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d4\/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg\/269px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/8\/82\/TeTuatahianui.jpg\/170px-TeTuatahianui.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/2d\/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg\/220px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/e\/e1\/Auckland_Waterfrt.jpg\/220px-Auckland_Waterfrt.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/4\/42\/MilfordSound.jpg\/220px-MilfordSound.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/6\/6e\/Fauna_de_Nueva_Zelanda07.JPG\/220px-Fauna_de_Nueva_Zelanda07.JPG",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/1\/11\/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg\/220px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/2\/27\/New_Zealandpop.svg\/280px-New_Zealandpop.svg.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/1\/1e\/Auckland_Cbd_%28217403753%29.jpeg\/120px-Auckland_Cbd_%28217403753%29.jpeg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/7b\/Wellington_at_dawn.jpg\/120px-Wellington_at_dawn.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/0\/0e\/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg\/120px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/8\/87\/HamiltonNZfromUni.jpg\/120px-HamiltonNZfromUni.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/b\/bb\/Queen_Street_Midtown_Auckland.jpg\/220px-Queen_Street_Midtown_Auckland.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/1\/16\/TeReoMaori2013.png\/220px-TeReoMaori2013.png",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/70\/Ratana_Church_Raetihi.jpg\/170px-Ratana_Church_Raetihi.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/5\/53\/KupeWheke.jpg\/150px-KupeWheke.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/7b\/Hinepare.jpg\/170px-Hinepare.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/8\/89\/Hobbit_holes_reflected_in_water.jpg\/220px-Hobbit_holes_reflected_in_water.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d2\/Haka_2006.jpg\/220px-Haka_2006.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/9\/91\/Hangi_ingredients.jpg\/220px-Hangi_ingredients.jpg",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/f\/f3\/Gnome-globe.svg\/16px-Gnome-globe.svg.png"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-metadata.json
new file mode 100644
index 000000000..115048eec
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Contributors to Wikimedia projects",
+ "Direction": "ltr",
+ "Excerpt": "Coordinates: 42\u00b0S 174\u00b0E\ufeff \/ \ufeff42\u00b0S 174\u00b0E",
+ "Image": "https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/3e\/Flag_of_New_Zealand.svg\/1200px-Flag_of_New_Zealand.svg.png",
+ "Title": "New Zealand",
+ "SiteName": "Wikimedia Foundation, Inc."
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected.html
new file mode 100644
index 000000000..4fed8d184
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/expected.html
@@ -0,0 +1,3107 @@
+<div id="mw-content-text" lang="en" dir="ltr">
+
+
+
+
+ <p>
+ <span><span id="coordinates"><a href="http://fakehost/wiki/Geographic_coordinate_system" title="Geographic coordinate system">Coordinates</a>: <span><a href="http://tools.wmflabs.org/geohack/geohack.php?pagename=New_Zealand&amp;params=42_S_174_E_scale:5000000_source:GNS"><span><span title="Maps, aerial photos, and other data for this location"><span>42°S</span> <span>174°E</span></span></span><span> / </span><span><span title="Maps, aerial photos, and other data for this location">42°S 174°E</span></span></a></span></span></span>
+ </p>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="2">
+ <p>
+ New Zealand
+ </p><br>
+ <div>
+ <p><i lang="mi" title="Māori language text" xml:lang="mi">Aotearoa</i>&nbsp;&nbsp;<span>(<a href="http://fakehost/wiki/M%C4%81ori_language" title="Māori language">Māori</a>)</span>
+ </p></div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Flag_of_New_Zealand.svg" title="Flag of New Zealand"><img alt="Blue field with the Union Flag in the top right corner, and four red stars with white borders to the right." src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/125px-Flag_of_New_Zealand.svg.png" decoding="async" width="125" height="63" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/188px-Flag_of_New_Zealand.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/250px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600"></a>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/Flag_of_New_Zealand" title="Flag of New Zealand">Flag</a>
+ </p></div>
+ </div>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Coat_of_arms_of_New_Zealand.svg" title="Coat of arms of New Zealand"><img alt="A quartered shield, flanked by two figures, topped with a crown." src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/85px-Coat_of_arms_of_New_Zealand.svg.png" decoding="async" width="85" height="82" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/128px-Coat_of_arms_of_New_Zealand.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/170px-Coat_of_arms_of_New_Zealand.svg.png 2x" data-file-width="725" data-file-height="699"></a>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/Coat_of_arms_of_New_Zealand" title="Coat of arms of New Zealand">Coat of arms</a>
+ </p></div>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <div>
+ <p><b><a href="http://fakehost/wiki/National_anthems_of_New_Zealand" title="National anthems of New Zealand">Anthems</a>:</b></p><div>
+ <ul>
+ <li>"<a href="http://fakehost/wiki/God_Defend_New_Zealand" title="God Defend New Zealand">God Defend New Zealand</a>"<br>
+
+ </li>
+ <li>
+ <span>"<a href="http://fakehost/wiki/God_Save_the_Queen" title="God Save the Queen">God Save the Queen</a>"<sup id="cite_ref-2"><a href="#cite_note-2">[n 1]</a></sup></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <a href="http://fakehost/wiki/File:NZL_orthographic_NaturalEarth.svg" title="Location of New Zealand, including outlying islands, its territorial claim in the Antarctic, and Tokelau"><img alt="A map of the hemisphere centred on New Zealand, using an orthographic projection." src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/250px-NZL_orthographic_NaturalEarth.svg.png" decoding="async" width="250" height="250" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/375px-NZL_orthographic_NaturalEarth.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/500px-NZL_orthographic_NaturalEarth.svg.png 2x" data-file-width="512" data-file-height="512"></a>
+ <div><p>
+ Location of New Zealand, including outlying islands, its <a href="http://fakehost/wiki/Ross_Dependency" title="Ross Dependency">territorial claim in the Antarctic</a>, and <a href="http://fakehost/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </p></div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Capital
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a><br>
+ <span><a href="http://tools.wmflabs.org/geohack/geohack.php?pagename=New_Zealand&amp;params=41_17_S_174_27_E_type:city"><span><span title="Maps, aerial photos, and other data for this location"><span>41°17′S</span> <span>174°27′E</span></span></span><span> / </span><span><span title="Maps, aerial photos, and other data for this location">41.283°S 174.450°E</span></span></a></span>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Largest city
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Official&nbsp;languages
+ </th>
+ <td>
+ <div>
+ <ul>
+ <li>
+ <a href="http://fakehost/wiki/New_Zealand_English" title="New Zealand English">English</a><sup id="cite_ref-4"><a href="#cite_note-4">[n 2]</a></sup>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/M%C4%81ori_language" title="Māori language">Māori</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/NZ_Sign_Language" title="NZ Sign Language">NZ Sign Language</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Ethnic_group" title="Ethnic group">Ethnic&nbsp;groups</a>
+ <div><p>
+ (<a href="http://fakehost/wiki/2018_New_Zealand_census" title="2018 New Zealand census">2018</a>)
+ </p></div>
+ </th>
+ <td>
+ <div>
+ <ul>
+ <li>70.2% <a href="http://fakehost/wiki/European_New_Zealanders" title="European New Zealanders">European</a>
+ </li>
+ <li>16.5% <a href="http://fakehost/wiki/M%C4%81ori_people" title="Māori people">Māori</a>
+ </li>
+ <li>15.1% <a href="http://fakehost/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asian</a>
+ </li>
+ <li>8.1% <a href="http://fakehost/wiki/Pacific_Islander" title="Pacific Islander">Pacific peoples</a>
+ </li>
+ <li>1.6% <a href="http://fakehost/wiki/Middle_Eastern_people" title="Middle Eastern people">ME</a>/<a href="http://fakehost/wiki/Latin_Americans" title="Latin Americans">LA</a>/<a href="http://fakehost/wiki/African_New_Zealanders" title="African New Zealanders">African</a>
+ </li>
+ <li>1.9% Other<sup id="cite_ref-Census2018_pdc_5-0"><a href="#cite_note-Census2018_pdc-5">[3]</a></sup><sup id="cite_ref-ethnicity_6-0"><a href="#cite_note-ethnicity-6">[n 3]</a></sup>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Demonym" title="Demonym">Demonym(s)</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/New_Zealanders" title="New Zealanders">New Zealander</a><br>
+ <span><a href="http://fakehost/wiki/Kiwi_(people)" title="Kiwi (people)">Kiwi</a> (informal)</span>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Politics_of_New_Zealand" title="Politics of New Zealand">Government</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Unitary_state" title="Unitary state">Unitary</a> <a href="http://fakehost/wiki/Parliamentary_system" title="Parliamentary system">parliamentary</a> <a href="http://fakehost/wiki/Constitutional_monarchy" title="Constitutional monarchy">constitutional monarchy</a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"></td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/Monarchy_of_New_Zealand" title="Monarchy of New Zealand">Monarch</a>
+ </p></div>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Elizabeth_II" title="Elizabeth II">Elizabeth II</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<span><a href="http://fakehost/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">Governor-General</a></span>
+ </p></div>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Patsy_Reddy" title="Patsy Reddy">Patsy Reddy</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">Prime Minister</a>
+ </p></div>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>
+ </td>
+ </tr>
+
+ <tr>
+ <th scope="row">
+ Legislature
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/New_Zealand_Parliament" title="New Zealand Parliament">Parliament</a><br>
+ (<a href="http://fakehost/wiki/New_Zealand_House_of_Representatives" title="New Zealand House of Representatives">House of Representatives</a>)
+ </td>
+ </tr>
+ <tr>
+ <th colspan="2">
+ <a href="http://fakehost/wiki/Independence_of_New_Zealand" title="Independence of New Zealand">Stages of independence</a>&nbsp;
+ <div><p>
+ from the <a href="http://fakehost/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </p></div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2"></td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/1856_Sewell_Ministry" title="1856 Sewell Ministry">Responsible government</a>
+ </p></div>
+ </th>
+ <td>
+ 7 May 1856
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">Dominion</a>
+ </p></div>
+ </th>
+ <td>
+ 26 September 1907
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/Statute_of_Westminster_Adoption_Act_1947" title="Statute of Westminster Adoption Act 1947">Statute of Westminster adopted</a>
+ </p></div>
+ </th>
+ <td>
+ <br>
+ 25 November 1947
+ </td>
+ </tr>
+
+ <tr>
+ <th colspan="2">
+ <a href="http://fakehost/wiki/Geography_of_New_Zealand" title="Geography of New Zealand">Area</a>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Total
+ </p>
+ </th>
+ <td>
+ 268,021&nbsp;km<sup>2</sup> (103,483&nbsp;sq&nbsp;mi) (<a href="http://fakehost/wiki/List_of_countries_and_dependencies_by_area" title="List of countries and dependencies by area">75th</a>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Water&nbsp;(%)
+ </p>
+ </th>
+ <td>
+ 1.6<sup id="cite_ref-8"><a href="#cite_note-8">[n 4]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th colspan="2">
+ <a href="http://fakehost/wiki/Demographics_of_New_Zealand" title="Demographics of New Zealand">Population</a>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;September 2019 estimate
+ </p>
+ </th>
+ <td>
+ 4,933,210<sup id="cite_ref-populationestimate_9-0"><a href="#cite_note-populationestimate-9">[5]</a></sup> (<a href="http://fakehost/wiki/List_of_countries_and_dependencies_by_population" title="List of countries and dependencies by population">120th</a>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <div><p>
+ •&nbsp;<a href="http://fakehost/wiki/2018_New_Zealand_census" title="2018 New Zealand census">2018</a>&nbsp;census
+ </p></div>
+ </th>
+ <td>
+ 4,699,755
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Density
+ </p>
+ </th>
+ <td>
+ 18.2/km<sup>2</sup> (47.1/sq&nbsp;mi) (<a href="http://fakehost/wiki/List_of_countries_and_dependencies_by_population_density" title="List of countries and dependencies by population density">203rd</a>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Gross_domestic_product" title="Gross domestic product">GDP</a>&nbsp;<span>(<a href="http://fakehost/wiki/Purchasing_power_parity" title="Purchasing power parity">PPP</a>)</span>
+ </th>
+ <td>
+ 2018&nbsp;estimate
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Total
+ </p>
+ </th>
+ <td>
+ $199 billion<sup id="cite_ref-imf2_10-0"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Per capita
+ </p>
+ </th>
+ <td>
+ $40,266<sup id="cite_ref-imf2_10-1"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Gross_domestic_product" title="Gross domestic product">GDP</a>&nbsp;<span>(nominal)</span>
+ </th>
+ <td>
+ 2018&nbsp;estimate
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Total
+ </p>
+ </th>
+ <td>
+ $206 billion<sup id="cite_ref-imf2_10-2"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Per capita
+ </p>
+ </th>
+ <td>
+ $41,616<sup id="cite_ref-imf2_10-3"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Gini_coefficient" title="Gini coefficient">Gini</a>&nbsp;<span>(2014)</span>
+ </th>
+ <td>
+ 33.0<sup id="cite_ref-11"><a href="#cite_note-11">[7]</a></sup><br>
+ <span><span>medium</span></span>&nbsp;·&nbsp;<a href="http://fakehost/wiki/List_of_countries_by_income_equality" title="List of countries by income equality">22nd</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Human_Development_Index" title="Human Development Index">HDI</a>&nbsp;<span>(2017)</span>
+ </th>
+ <td>
+ <img alt="Increase" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/11px-Increase2.svg.png" decoding="async" title="Increase" width="11" height="11" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" data-file-width="300" data-file-height="300">&nbsp;0.917<sup id="cite_ref-HDI_12-0"><a href="#cite_note-HDI-12">[8]</a></sup><br>
+ <span><span>very high</span></span>&nbsp;·&nbsp;<a href="http://fakehost/wiki/List_of_countries_by_Human_Development_Index" title="List of countries by Human Development Index">16th</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Currency
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/New_Zealand_dollar" title="New Zealand dollar">New Zealand dollar</a> ($) (<a href="http://fakehost/wiki/ISO_4217" title="ISO 4217">NZD</a>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Time zone
+ </th>
+ <td>
+ <span><a href="http://fakehost/wiki/Coordinated_Universal_Time" title="Coordinated Universal Time">UTC</a>+12</span> (<a href="http://fakehost/wiki/Time_in_New_Zealand" title="Time in New Zealand">NZST</a><sup id="cite_ref-13"><a href="#cite_note-13">[n 5]</a></sup>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <p>
+ •&nbsp;Summer&nbsp;(<a href="http://fakehost/wiki/Daylight_saving_time" title="Daylight saving time">DST</a>)
+ </p>
+ </th>
+ <td>
+ <span><a href="http://fakehost/wiki/Coordinated_Universal_Time" title="Coordinated Universal Time">UTC</a>+13</span> (<a href="http://fakehost/wiki/Time_in_New_Zealand" title="Time in New Zealand">NZDT</a><sup id="cite_ref-15"><a href="#cite_note-15">[n 6]</a></sup>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Date format
+ </th>
+ <td>
+ <abbr title="day">dd</abbr>/<abbr title="month">mm</abbr>/<abbr title="year">yyyy</abbr><br>
+ <abbr title="year">yyyy</abbr>-<abbr title="month">mm</abbr>-<abbr title="day">dd</abbr><sup id="cite_ref-16"><a href="#cite_note-16">[10]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Left-_and_right-hand_traffic" title="Left- and right-hand traffic">Driving side</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/Right-_and_left-hand_traffic#New_Zealand" title="Right- and left-hand traffic">left</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Telephone_numbers_in_New_Zealand" title="Telephone numbers in New Zealand">Calling code</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/%2B64" title="+64">+64</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/ISO_3166" title="ISO 3166">ISO 3166 code</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">NZ</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="http://fakehost/wiki/Country_code_top-level_domain" title="Country code top-level domain">Internet TLD</a>
+ </th>
+ <td>
+ <a href="http://fakehost/wiki/.nz" title=".nz">.nz</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ <b>New Zealand</b> (<a href="http://fakehost/wiki/M%C4%81ori_language" title="Māori language">Māori</a>: <i lang="mi" xml:lang="mi"><a href="http://fakehost/wiki/Aotearoa" title="Aotearoa">Aotearoa</a></i> <span title="Representation in the International Phonetic Alphabet (IPA)"><a href="http://fakehost/wiki/Help:IPA/M%C4%81ori" title="Help:IPA/Māori">[aɔˈtɛaɾɔa]</a></span>) is a <a href="http://fakehost/wiki/Sovereign_state" title="Sovereign state">sovereign</a> <a href="http://fakehost/wiki/Island_country" title="Island country">island country</a> in the southwestern <a href="http://fakehost/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a>. The country geographically comprises two main landmasses—the <a href="http://fakehost/wiki/North_Island" title="North Island">North Island</a> (<i>Te Ika-a-Māui</i>), and the <a href="http://fakehost/wiki/South_Island" title="South Island">South Island</a> (<i>Te Waipounamu</i>)—and around 600 <a href="http://fakehost/wiki/List_of_islands_of_New_Zealand" title="List of islands of New Zealand">smaller islands</a>. It has a total land area of 268,000 square kilometres (103,500&nbsp;sq&nbsp;mi). New Zealand is situated some 2,000 kilometres (1,200&nbsp;mi) east of <a href="http://fakehost/wiki/Australia" title="Australia">Australia</a> across the <a href="http://fakehost/wiki/Tasman_Sea" title="Tasman Sea">Tasman Sea</a> and roughly 1,000 kilometres (600&nbsp;mi) south of the <a href="http://fakehost/wiki/List_of_islands_in_the_Pacific_Ocean" title="List of islands in the Pacific Ocean">Pacific island areas</a> of <a href="http://fakehost/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a>, <a href="http://fakehost/wiki/Fiji" title="Fiji">Fiji</a>, and <a href="http://fakehost/wiki/Tonga" title="Tonga">Tonga</a>. Because of its remoteness, it was one of the last lands to be settled by humans. During its long period of isolation, New Zealand developed a distinct <a href="http://fakehost/wiki/Biodiversity_of_New_Zealand" title="Biodiversity of New Zealand">biodiversity</a> of animal, fungal, and plant life. The country's varied topography and its sharp mountain peaks, such as the <a href="http://fakehost/wiki/Southern_Alps" title="Southern Alps">Southern Alps</a>, owe much to the <a href="http://fakehost/wiki/Tectonic_uplift" title="Tectonic uplift">tectonic uplift</a> of land and volcanic eruptions. New Zealand's <a href="http://fakehost/wiki/Capital_of_New_Zealand" title="Capital of New Zealand">capital city</a> is <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a>, while its most populous city is <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a>.
+ </p>
+ <p>
+ Sometime between 1250 and 1300, <a href="http://fakehost/wiki/Polynesians" title="Polynesians">Polynesians</a> settled in the islands that later were named New Zealand and developed a distinctive <a href="http://fakehost/wiki/M%C4%81ori_culture" title="Māori culture">Māori culture</a>. In 1642, Dutch explorer <a href="http://fakehost/wiki/Abel_Tasman" title="Abel Tasman">Abel Tasman</a> became the first European to sight New Zealand. In 1840, representatives of the United Kingdom and <a href="http://fakehost/wiki/M%C4%81ori_people" title="Māori people">Māori</a> chiefs signed the <a href="http://fakehost/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a>, which declared British sovereignty over the islands. In 1841, New Zealand <a href="http://fakehost/wiki/Colony_of_New_Zealand" title="Colony of New Zealand">became a colony</a> within the <a href="http://fakehost/wiki/British_Empire" title="British Empire">British Empire</a> and in 1907 it <a href="http://fakehost/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">became a dominion</a>; it gained <a href="http://fakehost/wiki/Independence_of_New_Zealand" title="Independence of New Zealand">full statutory independence</a> in 1947 and the British monarch remained the <a href="http://fakehost/wiki/Head_of_state" title="Head of state">head of state</a>. Today, the majority of <a href="http://fakehost/wiki/New_Zealand%27s_population" title="New Zealand's population">New Zealand's population</a> of 4.9&nbsp;million is of <a href="http://fakehost/wiki/European_New_Zealanders" title="European New Zealanders">European descent</a>; the indigenous Māori are the largest minority, followed by <a href="http://fakehost/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asians</a> and <a href="http://fakehost/wiki/Pacific_Islander" title="Pacific Islander">Pacific Islanders</a>. Reflecting this, <a href="http://fakehost/wiki/New_Zealand%27s_culture" title="New Zealand's culture">New Zealand's culture</a> is mainly derived from Māori and early British settlers, with recent broadening arising from increased <a href="http://fakehost/wiki/Immigration_to_New_Zealand" title="Immigration to New Zealand">immigration</a>. The <a href="http://fakehost/wiki/Languages_of_New_Zealand" title="Languages of New Zealand">official languages</a> are <a href="http://fakehost/wiki/English_language" title="English language">English</a>, <a href="http://fakehost/wiki/M%C4%81ori_language" title="Māori language">Māori</a>, and <a href="http://fakehost/wiki/New_Zealand_Sign_Language" title="New Zealand Sign Language">New Zealand Sign Language</a>, with English being very dominant.
+ </p>
+ <p>
+ A <a href="http://fakehost/wiki/Developed_country" title="Developed country">developed country</a>, New Zealand <a href="http://fakehost/wiki/International_rankings_of_New_Zealand" title="International rankings of New Zealand">ranks highly</a> in international comparisons of national performance, such as quality of life, health, education, protection of <a href="http://fakehost/wiki/Civil_liberties" title="Civil liberties">civil liberties</a>, and <a href="http://fakehost/wiki/Economic_freedom" title="Economic freedom">economic freedom</a>. New Zealand underwent <a href="http://fakehost/wiki/Rogernomics" title="Rogernomics">major economic changes</a> during the 1980s, which transformed it from a <a href="http://fakehost/wiki/Protectionist" title="Protectionist">protectionist</a> to a <a href="http://fakehost/wiki/Economic_liberalization" title="Economic liberalization">liberalised</a> <a href="http://fakehost/wiki/Free-trade" title="Free-trade">free-trade</a> economy. The service sector dominates the <a href="http://fakehost/wiki/Economy_of_New_Zealand" title="Economy of New Zealand">national economy</a>, followed by the industrial sector, and <a href="http://fakehost/wiki/Agriculture_in_New_Zealand" title="Agriculture in New Zealand">agriculture</a>; international <a href="http://fakehost/wiki/Tourism_in_New_Zealand" title="Tourism in New Zealand">tourism</a> is a significant source of revenue. Nationally, legislative authority is vested in an elected, <a href="http://fakehost/wiki/Unicameral" title="Unicameral">unicameral</a> <a href="http://fakehost/wiki/New_Zealand_Parliament" title="New Zealand Parliament">Parliament</a>, while executive political power is exercised by the <a href="http://fakehost/wiki/Cabinet_of_New_Zealand" title="Cabinet of New Zealand">Cabinet</a>, led by the <a href="http://fakehost/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">prime minister</a>, currently <a href="http://fakehost/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>. <a href="http://fakehost/wiki/Queen_Elizabeth_II" title="Queen Elizabeth II">Queen Elizabeth II</a> is the <a href="http://fakehost/wiki/Monarchy_of_New_Zealand" title="Monarchy of New Zealand">country's monarch</a> and is represented by a <a href="http://fakehost/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">governor-general</a>, currently <a href="http://fakehost/wiki/Dame_Patsy_Reddy" title="Dame Patsy Reddy">Dame Patsy Reddy</a>. In addition, New Zealand is organised into 11 <a href="http://fakehost/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">regional councils</a> and 67 <a href="http://fakehost/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">territorial authorities</a> for local government purposes. The <a href="http://fakehost/wiki/Realm_of_New_Zealand" title="Realm of New Zealand">Realm of New Zealand</a> also includes <a href="http://fakehost/wiki/Tokelau" title="Tokelau">Tokelau</a> (a <a href="http://fakehost/wiki/Dependent_territory" title="Dependent territory">dependent territory</a>); the <a href="http://fakehost/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a> and <a href="http://fakehost/wiki/Niue" title="Niue">Niue</a> (self-governing states in <a href="http://fakehost/wiki/Associated_state" title="Associated state">free association</a> with New Zealand); and the <a href="http://fakehost/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>, which is New Zealand's <a href="http://fakehost/wiki/Territorial_claim_in_Antarctica" title="Territorial claim in Antarctica">territorial claim in Antarctica</a>. New Zealand is a member of the <a href="http://fakehost/wiki/United_Nations" title="United Nations">United Nations</a>, <a href="http://fakehost/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a>, <a href="http://fakehost/wiki/ANZUS" title="ANZUS">ANZUS</a>, <a href="http://fakehost/wiki/Organisation_for_Economic_Co-operation_and_Development" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a>, <a href="http://fakehost/wiki/Association_of_Southeast_Asian_Nations#ASEAN_Plus_Three_and_Six" title="Association of Southeast Asian Nations">ASEAN Plus Six</a>, <a href="http://fakehost/wiki/Asia-Pacific_Economic_Cooperation" title="Asia-Pacific Economic Cooperation">Asia-Pacific Economic Cooperation</a>, the <a href="http://fakehost/wiki/Pacific_Community" title="Pacific Community">Pacific Community</a> and the <a href="http://fakehost/wiki/Pacific_Islands_Forum" title="Pacific Islands Forum">Pacific Islands Forum</a>.
+ </p>
+
+ <h2>
+ <span id="Etymology">Etymology</span>
+ </h2>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius,_showing_Nova_Zeelandia.png"><img alt="Brown square paper with Dutch writing and a thick red, curved line" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/220px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png" decoding="async" width="220" height="171" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/330px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/440px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png 2x" data-file-width="684" data-file-height="532"></a></p><div>
+ <p>Detail from a 1657 map showing the western coastline of "Nova Zeelandia". (In this map, north is at the bottom.)
+ </p></div>
+ </div>
+ <p>
+ <a href="http://fakehost/wiki/Netherlands" title="Netherlands">Dutch</a> explorer Abel Tasman sighted New Zealand in 1642 and named it <i>Staten Land</i> "in honour of the <a href="http://fakehost/wiki/States_General_of_the_Netherlands" title="States General of the Netherlands">States General</a>" (Dutch parliament). He wrote, "it is possible that this land joins to the Staten Land but it is uncertain",<sup id="cite_ref-17"><a href="#cite_note-17">[11]</a></sup> referring to <a href="http://fakehost/wiki/Isla_de_los_Estados" title="Isla de los Estados">a landmass of the same name</a> at the southern tip of South America, discovered by <a href="http://fakehost/wiki/Jacob_Le_Maire" title="Jacob Le Maire">Jacob Le Maire</a> in 1616.<sup id="cite_ref-18"><a href="#cite_note-18">[12]</a></sup><sup id="cite_ref-19"><a href="#cite_note-19">[13]</a></sup> In 1645, Dutch <a href="http://fakehost/wiki/Cartographers" title="Cartographers">cartographers</a> renamed the land <i>Nova Zeelandia</i> after the <a href="http://fakehost/wiki/Seventeen_Provinces" title="Seventeen Provinces">Dutch province</a> of <a href="http://fakehost/wiki/Zeeland" title="Zeeland">Zeeland</a>.<sup id="cite_ref-20"><a href="#cite_note-20">[14]</a></sup><sup id="cite_ref-21"><a href="#cite_note-21">[15]</a></sup> British explorer <a href="http://fakehost/wiki/James_Cook" title="James Cook">James Cook</a> subsequently <a href="http://fakehost/wiki/Anglicisation" title="Anglicisation">anglicised</a> the name to New Zealand.<sup id="cite_ref-NZ_name_22-0"><a href="#cite_note-NZ_name-22">[16]</a></sup>
+ </p>
+ <p>
+ <i><a href="http://fakehost/wiki/Aotearoa" title="Aotearoa">Aotearoa</a></i> (pronounced <span></span>; often translated as "land of the long white cloud")<sup id="cite_ref-FOOTNOTEKing200341_23-0"><a href="#cite_note-FOOTNOTEKing200341-23">[17]</a></sup> is the current Māori name for New Zealand. It is unknown whether Māori had a name for the whole country before the arrival of Europeans, with <i>Aotearoa</i> originally referring to just the <a href="http://fakehost/wiki/North_Island" title="North Island">North Island</a>.<sup id="cite_ref-FOOTNOTEHayMaclaganGordon200872_24-0"><a href="#cite_note-FOOTNOTEHayMaclaganGordon200872-24">[18]</a></sup> Māori had several traditional names for the two main islands, including <i>Te Ika-a-Māui</i> (the fish of <a href="http://fakehost/wiki/M%C4%81ui_(M%C4%81ori_mythology)" title="Māui (Māori mythology)">Māui</a>) for the North Island and <i>Te Waipounamu</i> (the waters of <a href="http://fakehost/wiki/Pounamu" title="Pounamu">greenstone</a>) or <i>Te Waka o Aoraki</i> (the canoe of <a href="http://fakehost/wiki/Aoraki" title="Aoraki">Aoraki</a>) for the <a href="http://fakehost/wiki/South_Island" title="South Island">South Island</a>.<sup id="cite_ref-FOOTNOTEMein_Smith20056_25-0"><a href="#cite_note-FOOTNOTEMein_Smith20056-25">[19]</a></sup> Early European maps labelled the islands North (North Island), Middle (South Island) and South (<a href="http://fakehost/wiki/Stewart_Island_/_Rakiura" title="Stewart Island / Rakiura">Stewart Island / Rakiura</a>).<sup id="cite_ref-26"><a href="#cite_note-26">[20]</a></sup> In 1830, mapmakers began to use "North" and "South" on their maps to distinguish the two largest islands and by 1907 this was the accepted norm.<sup id="cite_ref-NZ_name_22-1"><a href="#cite_note-NZ_name-22">[16]</a></sup> The <a href="http://fakehost/wiki/New_Zealand_Geographic_Board" title="New Zealand Geographic Board">New Zealand Geographic Board</a> discovered in 2009 that the names of the North Island and South Island had never been formalised, and names and alternative names were formalised in 2013. This set the names as North Island or Te Ika-a-Māui, and South Island or Te Waipounamu.<sup id="cite_ref-Williamson2013_27-0"><a href="#cite_note-Williamson2013-27">[21]</a></sup> For each island, either its English or Māori name can be used, or both can be used together.<sup id="cite_ref-Williamson2013_27-1"><a href="#cite_note-Williamson2013-27">[21]</a></sup>
+ </p>
+
+ <h2>
+ <span id="History">History</span>
+ </h2>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Polynesian_Migration.svg"><img alt="One set of arrows point from Taiwan to Melanesia to Fiji/Samoa and then to the Marquesas Islands. The population then spread, some going south to New Zealand and others going north to Hawai'i. A second set start in southern Asia and end in Melanesia." src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/290px-Polynesian_Migration.svg.png" decoding="async" width="290" height="290" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/435px-Polynesian_Migration.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/580px-Polynesian_Migration.svg.png 2x" data-file-width="553" data-file-height="553"></a></p><div>
+ <p>The <a href="http://fakehost/wiki/M%C4%81ori_people" title="Māori people">Māori people</a> are most likely descended from people who emigrated from <a href="http://fakehost/wiki/Taiwan" title="Taiwan">Taiwan</a> to <a href="http://fakehost/wiki/Melanesia" title="Melanesia">Melanesia</a> and then travelled east through to the <a href="http://fakehost/wiki/Society_Islands" title="Society Islands">Society Islands</a>. After a pause of 70 to 265 years, a new wave of exploration led to the discovery and settlement of New Zealand.<sup id="cite_ref-28"><a href="#cite_note-28">[22]</a></sup>
+ </p></div>
+ </div>
+ <p>
+ New Zealand was one of the last major landmasses settled by humans. <a href="http://fakehost/wiki/Radiocarbon_dating" title="Radiocarbon dating">Radiocarbon dating</a>, evidence of <a href="http://fakehost/wiki/Deforestation" title="Deforestation">deforestation</a><sup id="cite_ref-29"><a href="#cite_note-29">[23]</a></sup> and <a href="http://fakehost/wiki/Mitochondrial_DNA" title="Mitochondrial DNA">mitochondrial DNA</a> variability within <a href="http://fakehost/wiki/M%C4%81ori_people" title="Māori people">Māori</a> populations<sup id="cite_ref-30"><a href="#cite_note-30">[24]</a></sup> suggest New Zealand was first settled by Eastern <a href="http://fakehost/wiki/Polynesians" title="Polynesians">Polynesians</a> between 1250 and 1300,<sup id="cite_ref-FOOTNOTEMein_Smith20056_25-1"><a href="#cite_note-FOOTNOTEMein_Smith20056-25">[19]</a></sup><sup id="cite_ref-31"><a href="#cite_note-31">[25]</a></sup> concluding a long series of voyages through the southern Pacific islands.<sup id="cite_ref-32"><a href="#cite_note-32">[26]</a></sup> Over the centuries that followed, these settlers developed a distinct culture now known as Māori. The population was divided into <i><a href="http://fakehost/wiki/Iwi" title="Iwi">iwi</a></i> (tribes) and <i><a href="http://fakehost/wiki/Hap%C5%AB" title="Hapū">hapū</a></i> (subtribes) who would sometimes cooperate, sometimes compete and sometimes fight against each other.<sup id="cite_ref-33"><a href="#cite_note-33">[27]</a></sup> At some point a group of Māori migrated to <i>Rēkohu</i>, now known as the <a href="http://fakehost/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a>, where they developed their distinct <a href="http://fakehost/wiki/Moriori" title="Moriori">Moriori</a> culture.<sup id="cite_ref-34"><a href="#cite_note-34">[28]</a></sup><sup id="cite_ref-35"><a href="#cite_note-35">[29]</a></sup> The Moriori population was all but wiped out between 1835 and 1862, largely because of <a href="http://fakehost/wiki/Taranaki_(iwi)" title="Taranaki (iwi)">Taranaki</a> Māori invasion and enslavement in the 1830s, although European diseases also contributed. In 1862 only 101 survived, and the last known full-blooded Moriori died in 1933.<sup id="cite_ref-36"><a href="#cite_note-36">[30]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Cook_chart_of_New_Zealand.jpg"><img alt="An engraving of a sketched coastline on white background" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/170px-Cook_chart_of_New_Zealand.jpg" decoding="async" width="170" height="235" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/255px-Cook_chart_of_New_Zealand.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/340px-Cook_chart_of_New_Zealand.jpg 2x" data-file-width="1093" data-file-height="1508"></a></p><div>
+ <p>Map of the New Zealand coastline as Cook charted it on his <a href="http://fakehost/wiki/First_voyage_of_James_Cook" title="First voyage of James Cook">first visit</a> in 1769–70. The track of the <i><a href="http://fakehost/wiki/HMS_Endeavour" title="HMS Endeavour">Endeavour</a></i> is also shown.
+ </p></div>
+ </div>
+ <p>
+ The first <a href="http://fakehost/wiki/Ethnic_groups_in_Europe" title="Ethnic groups in Europe">Europeans</a> known to have reached New Zealand were Dutch explorer <a href="http://fakehost/wiki/Abel_Tasman" title="Abel Tasman">Abel Tasman</a> and his crew in 1642.<sup id="cite_ref-FOOTNOTEMein_Smith200523_37-0"><a href="#cite_note-FOOTNOTEMein_Smith200523-37">[31]</a></sup> In a hostile encounter, four crew members were killed and at least one Māori was hit by <a href="http://fakehost/wiki/Canister_shot" title="Canister shot">canister shot</a>.<sup id="cite_ref-38"><a href="#cite_note-38">[32]</a></sup> Europeans did not revisit New Zealand until 1769 when British explorer <a href="http://fakehost/wiki/James_Cook" title="James Cook">James Cook</a> mapped almost the entire coastline.<sup id="cite_ref-FOOTNOTEMein_Smith200523_37-1"><a href="#cite_note-FOOTNOTEMein_Smith200523-37">[31]</a></sup> Following Cook, New Zealand was visited by numerous European and North American <a href="http://fakehost/wiki/History_of_whaling" title="History of whaling">whaling</a>, <a href="http://fakehost/wiki/Seal_hunting" title="Seal hunting">sealing</a> and trading ships. They traded European food, metal tools, weapons and other goods for timber, Māori food, artefacts and water.<sup id="cite_ref-FOOTNOTEKing2003122_39-0"><a href="#cite_note-FOOTNOTEKing2003122-39">[33]</a></sup> The introduction of the potato and the <a href="http://fakehost/wiki/Musket" title="Musket">musket</a> transformed Māori agriculture and warfare. Potatoes provided a reliable food surplus, which enabled longer and more sustained military campaigns.<sup id="cite_ref-40"><a href="#cite_note-40">[34]</a></sup> The resulting intertribal <a href="http://fakehost/wiki/Musket_Wars" title="Musket Wars">Musket Wars</a> encompassed over 600 battles between 1801 and 1840, killing 30,000–40,000 Māori.<sup id="cite_ref-41"><a href="#cite_note-41">[35]</a></sup> From the early 19th century, Christian <a href="http://fakehost/wiki/Missionary" title="Missionary">missionaries</a> began to settle New Zealand, eventually <a href="http://fakehost/wiki/Religious_conversion" title="Religious conversion">converting</a> most of the Māori population.<sup id="cite_ref-42"><a href="#cite_note-42">[36]</a></sup> The Māori population declined to around 40% of its pre-contact level during the 19th century; introduced diseases were the major factor.<sup id="cite_ref-43"><a href="#cite_note-43">[37]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Treatyofwaitangi.jpg"><img alt="A torn sheet of paper" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/170px-Treatyofwaitangi.jpg" decoding="async" width="170" height="318" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/255px-Treatyofwaitangi.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/340px-Treatyofwaitangi.jpg 2x" data-file-width="3091" data-file-height="5788"></a></p>
+ </div>
+ <p>
+ In 1788 Captain <a href="http://fakehost/wiki/Arthur_Phillip" title="Arthur Phillip">Arthur Phillip</a> assumed the position of <a href="http://fakehost/wiki/Governor_of_New_South_Wales" title="Governor of New South Wales">Governor</a> of the new British colony of <a href="http://fakehost/wiki/Colony_of_New_South_Wales" title="Colony of New South Wales">New South Wales</a> which according to his commission included New Zealand.<sup id="cite_ref-44"><a href="#cite_note-44">[38]</a></sup> The British Government appointed <a href="http://fakehost/wiki/James_Busby" title="James Busby">James Busby</a> as British Resident to New Zealand in 1832 following a petition from northern Māori.<sup id="cite_ref-Busby_45-0"><a href="#cite_note-Busby-45">[39]</a></sup> In 1835, following an announcement of impending French settlement by <a href="http://fakehost/wiki/Charles_de_Thierry" title="Charles de Thierry">Charles de Thierry</a>, the nebulous <a href="http://fakehost/wiki/United_Tribes_of_New_Zealand" title="United Tribes of New Zealand">United Tribes of New Zealand</a> sent a <a href="http://fakehost/wiki/Declaration_of_the_Independence_of_New_Zealand" title="Declaration of the Independence of New Zealand">Declaration of Independence</a> to King <a href="http://fakehost/wiki/William_IV_of_the_United_Kingdom" title="William IV of the United Kingdom">William IV of the United Kingdom</a> asking for protection.<sup id="cite_ref-Busby_45-1"><a href="#cite_note-Busby-45">[39]</a></sup> Ongoing unrest, the proposed settlement of New Zealand by the <a href="http://fakehost/wiki/New_Zealand_Company" title="New Zealand Company">New Zealand Company</a> (which had already sent its first ship of surveyors to buy land from Māori) and the dubious legal standing of the Declaration of Independence prompted the <a href="http://fakehost/wiki/Colonial_Office" title="Colonial Office">Colonial Office</a> to send Captain <a href="http://fakehost/wiki/William_Hobson" title="William Hobson">William Hobson</a> to claim sovereignty for the <a href="http://fakehost/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a> and negotiate a treaty with the Māori.<sup id="cite_ref-46"><a href="#cite_note-46">[40]</a></sup> The <a href="http://fakehost/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a> was first signed in the <a href="http://fakehost/wiki/Bay_of_Islands" title="Bay of Islands">Bay of Islands</a> on 6 February 1840.<sup id="cite_ref-Wilson2009_47-0"><a href="#cite_note-Wilson2009-47">[41]</a></sup> In response to the New Zealand Company's attempts to establish an independent settlement in <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a><sup id="cite_ref-48"><a href="#cite_note-48">[42]</a></sup> and French settlers purchasing land in <a href="http://fakehost/wiki/Akaroa" title="Akaroa">Akaroa</a>,<sup id="cite_ref-49"><a href="#cite_note-49">[43]</a></sup> Hobson declared British sovereignty over all of New Zealand on 21 May 1840, even though copies of the Treaty were still circulating throughout the country for Māori to sign.<sup id="cite_ref-50"><a href="#cite_note-50">[44]</a></sup> With the signing of the Treaty and declaration of sovereignty the number of immigrants, particularly from the United Kingdom, began to increase.<sup id="cite_ref-51"><a href="#cite_note-51">[45]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay,_New_Zealand.jpg"><img alt="Black and white engraving depicting a crowd of people" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/290px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg" decoding="async" width="290" height="208" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/435px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/580px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg 2x" data-file-width="6000" data-file-height="4300"></a></p>
+ </div>
+ <p>
+ New Zealand, still part of the colony of New South Wales, became a separate <a href="http://fakehost/wiki/Crown_colony" title="Crown colony">Colony</a> <a href="http://fakehost/wiki/Colony_of_New_Zealand" title="Colony of New Zealand">of New Zealand</a> on 1 July 1841.<sup id="cite_ref-52"><a href="#cite_note-52">[46]</a></sup> Armed conflict began between the Colonial government and Māori in 1843 with the <a href="http://fakehost/wiki/Wairau_Affray" title="Wairau Affray">Wairau Affray</a> over land and disagreements over sovereignty. These conflicts, mainly in the North Island, saw thousands of Imperial troops and the Royal Navy come to New Zealand and became known as the <a href="http://fakehost/wiki/New_Zealand_Wars" title="New Zealand Wars">New Zealand Wars</a>. Following these armed conflicts, large amounts of <a href="http://fakehost/wiki/New_Zealand_land_confiscations" title="New Zealand land confiscations">Māori land was confiscated by the government</a> to meet settler demands.<sup id="cite_ref-53"><a href="#cite_note-53">[47]</a></sup>
+ </p>
+ <p>
+ The colony gained a <a href="http://fakehost/wiki/New_Zealand_Constitution_Act_1852" title="New Zealand Constitution Act 1852">representative government in 1852</a> and the <a href="http://fakehost/wiki/1st_New_Zealand_Parliament" title="1st New Zealand Parliament">first Parliament</a> met in 1854.<sup id="cite_ref-G_and_N_54-0"><a href="#cite_note-G_and_N-54">[48]</a></sup> In 1856 the colony effectively became self-governing, gaining responsibility over all domestic matters other than <a href="http://fakehost/wiki/Indigenous_peoples" title="Indigenous peoples">native</a> policy.<sup id="cite_ref-G_and_N_54-1"><a href="#cite_note-G_and_N-54">[48]</a></sup> (Control over native policy was granted in the mid-1860s.<sup id="cite_ref-G_and_N_54-2"><a href="#cite_note-G_and_N-54">[48]</a></sup>) Following concerns that the South Island might form a separate colony, premier <a href="http://fakehost/wiki/Alfred_Domett" title="Alfred Domett">Alfred Domett</a> moved a resolution to transfer the <a href="http://fakehost/wiki/Capital_of_New_Zealand" title="Capital of New Zealand">capital</a> from Auckland to a locality near <a href="http://fakehost/wiki/Cook_Strait" title="Cook Strait">Cook Strait</a>.<sup id="cite_ref-55"><a href="#cite_note-55">[49]</a></sup> Wellington was chosen for its central location, with Parliament officially sitting there for the first time in 1865.<sup id="cite_ref-56"><a href="#cite_note-56">[50]</a></sup>
+ </p>
+ <p>
+ In 1891 the <a href="http://fakehost/wiki/New_Zealand_Liberal_Party" title="New Zealand Liberal Party">Liberal Party</a> came to power as the first organised political party.<sup id="cite_ref-Liberal_57-0"><a href="#cite_note-Liberal-57">[51]</a></sup> The <a href="http://fakehost/wiki/Liberal_Government_of_New_Zealand" title="Liberal Government of New Zealand">Liberal Government</a>, led by <a href="http://fakehost/wiki/Richard_Seddon" title="Richard Seddon">Richard Seddon</a> for most of its period in office,<sup id="cite_ref-58"><a href="#cite_note-58">[52]</a></sup> passed many important social and economic measures. In 1893 New Zealand was the first nation in the world to grant all <a href="http://fakehost/wiki/Women%27s_suffrage_in_New_Zealand" title="Women's suffrage in New Zealand">women the right to vote</a><sup id="cite_ref-Liberal_57-1"><a href="#cite_note-Liberal-57">[51]</a></sup> and in 1894 pioneered the <a href="http://fakehost/wiki/Industrial_Conciliation_and_Arbitration_Act_1894" title="Industrial Conciliation and Arbitration Act 1894">adoption of compulsory arbitration between employers and unions</a>.<sup id="cite_ref-59"><a href="#cite_note-59">[53]</a></sup>
+ </p>
+ <p>
+ In 1907, at the request of the New Zealand Parliament, King <a href="http://fakehost/wiki/Edward_VII" title="Edward VII">Edward VII</a> proclaimed New Zealand a <a href="http://fakehost/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">Dominion</a> within the British Empire,<sup id="cite_ref-60"><a href="#cite_note-60">[54]</a></sup> reflecting its self-governing status.<sup id="cite_ref-61"><a href="#cite_note-61">[55]</a></sup> In 1947 the country <a href="http://fakehost/wiki/Statute_of_Westminster_Adoption_Act_1947" title="Statute of Westminster Adoption Act 1947">adopted</a> the <a href="http://fakehost/wiki/Statute_of_Westminster_1931" title="Statute of Westminster 1931">Statute of Westminster</a>, confirming that the British Parliament could no longer legislate for New Zealand without the consent of New Zealand.<sup id="cite_ref-G_and_N_54-3"><a href="#cite_note-G_and_N-54">[48]</a></sup>
+ </p>
+ <p>
+ Early in the 20th century, New Zealand was involved in world affairs, fighting in the <a href="http://fakehost/wiki/Military_history_of_New_Zealand_in_World_War_I" title="Military history of New Zealand in World War I">First</a> and <a href="http://fakehost/wiki/Military_history_of_New_Zealand_during_World_War_II" title="Military history of New Zealand during World War II">Second World Wars</a><sup id="cite_ref-62"><a href="#cite_note-62">[56]</a></sup> and suffering through the <a href="http://fakehost/wiki/Great_Depression" title="Great Depression">Great Depression</a>.<sup id="cite_ref-63"><a href="#cite_note-63">[57]</a></sup> The depression led to the election of the <a href="http://fakehost/wiki/First_Labour_Government_of_New_Zealand" title="First Labour Government of New Zealand">First Labour Government</a> and the establishment of a comprehensive <a href="http://fakehost/wiki/Welfare_state" title="Welfare state">welfare state</a> and a <a href="http://fakehost/wiki/Protectionist" title="Protectionist">protectionist</a> economy.<sup id="cite_ref-64"><a href="#cite_note-64">[58]</a></sup> New Zealand experienced increasing prosperity following the Second World War<sup id="cite_ref-65"><a href="#cite_note-65">[59]</a></sup> and Māori began to leave their traditional rural life and move to the cities in search of work.<sup id="cite_ref-66"><a href="#cite_note-66">[60]</a></sup> A <a href="http://fakehost/wiki/M%C4%81ori_protest_movement" title="Māori protest movement">Māori protest movement</a> developed, which criticised <a href="http://fakehost/wiki/Eurocentrism" title="Eurocentrism">Eurocentrism</a> and worked for greater recognition of <a href="http://fakehost/wiki/M%C4%81ori_culture" title="Māori culture">Māori culture</a> and of the Treaty of Waitangi.<sup id="cite_ref-67"><a href="#cite_note-67">[61]</a></sup> In 1975, a <a href="http://fakehost/wiki/Waitangi_Tribunal" title="Waitangi Tribunal">Waitangi Tribunal</a> was set up to investigate alleged breaches of the Treaty, and it was enabled to investigate historic grievances in 1985.<sup id="cite_ref-Wilson2009_47-1"><a href="#cite_note-Wilson2009-47">[41]</a></sup> The government has negotiated <a href="http://fakehost/wiki/Treaty_of_Waitangi_claims_and_settlements" title="Treaty of Waitangi claims and settlements">settlements of these grievances</a> with many iwi,<sup id="cite_ref-68"><a href="#cite_note-68">[62]</a></sup> although <a href="http://fakehost/wiki/New_Zealand_foreshore_and_seabed_controversy" title="New Zealand foreshore and seabed controversy">Māori claims to the foreshore and seabed</a> have proved controversial in the 2000s.<sup id="cite_ref-69"><a href="#cite_note-69">[63]</a></sup><sup id="cite_ref-70"><a href="#cite_note-70">[64]</a></sup>
+ </p>
+ <h2>
+ <span id="Government_and_politics">Government and politics</span>
+ </h2>
+
+ <div>
+ <div>
+ <p><a href="http://fakehost/wiki/Elizabeth_II" title="Elizabeth II"><img alt="The Queen wearing her New Zealand insignia" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/152px-Queen_Elizabeth_II_of_New_Zealand_2.jpg" decoding="async" width="152" height="190" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/228px-Queen_Elizabeth_II_of_New_Zealand_2.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/304px-Queen_Elizabeth_II_of_New_Zealand_2.jpg 2x" data-file-width="1182" data-file-height="1478"></a>
+ </p>
+
+ </div>
+ <div>
+ <p><a href="http://fakehost/wiki/Jacinda_Ardern" title="Jacinda Ardern"><img alt="A smiling woman wearing a black dress" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/152px-Ardern_Cropped.png" decoding="async" width="152" height="191" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/228px-Ardern_Cropped.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/304px-Ardern_Cropped.png 2x" data-file-width="499" data-file-height="627"></a>
+ </p>
+
+ </div>
+ </div>
+ <p>
+ New Zealand is a <a href="http://fakehost/wiki/Constitutional_monarchy" title="Constitutional monarchy">constitutional monarchy</a> with a <a href="http://fakehost/wiki/Parliamentary_democracy" title="Parliamentary democracy">parliamentary democracy</a>,<sup id="cite_ref-GG_constitution_71-0"><a href="#cite_note-GG_constitution-71">[65]</a></sup> although <a href="http://fakehost/wiki/Constitution_of_New_Zealand" title="Constitution of New Zealand">its constitution</a> is <a href="http://fakehost/wiki/Uncodified_constitution" title="Uncodified constitution">not codified</a>.<sup id="cite_ref-Economist_factsheet_72-0"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> <a href="http://fakehost/wiki/Elizabeth_II" title="Elizabeth II">Elizabeth II</a> is the <a href="http://fakehost/wiki/Queen_of_New_Zealand" title="Queen of New Zealand">Queen of New Zealand</a><sup id="cite_ref-73"><a href="#cite_note-73">[67]</a></sup> and thus the <a href="http://fakehost/wiki/Head_of_state" title="Head of state">head of state</a>.<sup id="cite_ref-74"><a href="#cite_note-74">[68]</a></sup> The Queen is represented by the <a href="http://fakehost/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">governor-general</a>, whom she appoints on the <a href="http://fakehost/wiki/Advice_(constitutional)" title="Advice (constitutional)">advice</a> of the <a href="http://fakehost/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">prime minister</a>.<sup id="cite_ref-75"><a href="#cite_note-75">[69]</a></sup> The governor-general can exercise the Crown's <a href="http://fakehost/wiki/Prerogative_powers" title="Prerogative powers">prerogative powers</a>, such as reviewing cases of injustice and making appointments of <a href="http://fakehost/wiki/Ministers_of_the_New_Zealand_Government" title="Ministers of the New Zealand Government">ministers</a>, ambassadors and other key public officials,<sup id="cite_ref-76"><a href="#cite_note-76">[70]</a></sup> and in rare situations, the <a href="http://fakehost/wiki/Reserve_power" title="Reserve power">reserve powers</a> (e.g. the power to dissolve parliament or refuse the <a href="http://fakehost/wiki/Royal_assent" title="Royal assent">royal assent</a> of a <a href="http://fakehost/wiki/Bill_(law)" title="Bill (law)">bill</a> into law).<sup id="cite_ref-reserve_Powers_77-0"><a href="#cite_note-reserve_Powers-77">[71]</a></sup> The powers of the monarch and the governor-general are limited by constitutional constraints and they cannot normally be exercised without the advice of ministers.<sup id="cite_ref-reserve_Powers_77-1"><a href="#cite_note-reserve_Powers-77">[71]</a></sup>
+ </p>
+ <p>
+ The <a href="http://fakehost/wiki/New_Zealand_Parliament" title="New Zealand Parliament">New Zealand Parliament</a> holds <a href="http://fakehost/wiki/Legislative_power" title="Legislative power">legislative power</a> and consists of the Queen and the <a href="http://fakehost/wiki/New_Zealand_House_of_Representatives" title="New Zealand House of Representatives">House of Representatives</a>.<sup id="cite_ref-parliament_facts_78-0"><a href="#cite_note-parliament_facts-78">[72]</a></sup> It also included an upper house, the <a href="http://fakehost/wiki/New_Zealand_Legislative_Council" title="New Zealand Legislative Council">Legislative Council</a>, until this was abolished in 1950.<sup id="cite_ref-parliament_facts_78-1"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The <a href="http://fakehost/wiki/Supremacy_of_parliament" title="Supremacy of parliament">supremacy of parliament</a> over the Crown and other government institutions was established in England by the <a href="http://fakehost/wiki/Bill_of_Rights_1689" title="Bill of Rights 1689">Bill of Rights 1689</a> and has been ratified as law in New Zealand.<sup id="cite_ref-parliament_facts_78-2"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The House of Representatives is democratically elected and a government is formed from the party or <a href="http://fakehost/wiki/Coalition_government" title="Coalition government">coalition</a> with the majority of seats. If no majority is formed, a <a href="http://fakehost/wiki/Minority_government" title="Minority government">minority government</a> can be formed if support from other parties during <a href="http://fakehost/wiki/Confidence_and_supply" title="Confidence and supply">confidence and supply</a> votes is assured.<sup id="cite_ref-parliament_facts_78-3"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The governor-general appoints ministers under advice from the prime minister, who is by <a href="http://fakehost/wiki/Constitutional_convention_(political_custom)" title="Constitutional convention (political custom)">convention</a> the <a href="http://fakehost/wiki/Parliamentary_leader" title="Parliamentary leader">parliamentary leader</a> of the governing party or coalition.<sup id="cite_ref-79"><a href="#cite_note-79">[73]</a></sup> <a href="http://fakehost/wiki/Cabinet_of_New_Zealand" title="Cabinet of New Zealand">Cabinet</a>, formed by ministers and led by the prime minister, is the highest policy-making body in government and responsible for deciding significant government actions.<sup id="cite_ref-80"><a href="#cite_note-80">[74]</a></sup> Members of Cabinet make major decisions collectively, and are therefore <a href="http://fakehost/wiki/Cabinet_collective_responsibility" title="Cabinet collective responsibility">collectively responsible</a> for the consequences of these decisions.<sup id="cite_ref-81"><a href="#cite_note-81">[75]</a></sup>
+ </p>
+ <p>
+ A <a href="http://fakehost/wiki/Elections_in_New_Zealand" title="Elections in New Zealand">parliamentary general election</a> must be called no later than three years after the previous election.<sup id="cite_ref-82"><a href="#cite_note-82">[76]</a></sup> Almost all general elections between <a href="http://fakehost/wiki/1853_New_Zealand_general_election" title="1853 New Zealand general election">1853</a> and <a href="http://fakehost/wiki/1993_New_Zealand_general_election" title="1993 New Zealand general election">1993</a> were held under the <a href="http://fakehost/wiki/First-past-the-post_voting" title="First-past-the-post voting">first-past-the-post voting</a> system.<sup id="cite_ref-road_83-0"><a href="#cite_note-road-83">[77]</a></sup> Since the <a href="http://fakehost/wiki/1996_New_Zealand_general_election" title="1996 New Zealand general election">1996 election</a>, a form of <a href="http://fakehost/wiki/Proportional_representation" title="Proportional representation">proportional representation</a> called <a href="http://fakehost/wiki/Mixed-member_proportional" title="Mixed-member proportional">mixed-member proportional</a> (MMP) has been used.<sup id="cite_ref-Economist_factsheet_72-1"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> Under the MMP system, each person has two votes; one is for a candidate standing in the voter's <a href="http://fakehost/wiki/New_Zealand_electorates" title="New Zealand electorates">electorate</a> and the other is for a party. Since the <a href="http://fakehost/wiki/2014_New_Zealand_general_election" title="2014 New Zealand general election">2014 election</a>, there have been 71 electorates (which include seven <a href="http://fakehost/wiki/M%C4%81ori_electorates" title="Māori electorates">Māori electorates</a> in which only Māori can optionally vote),<sup id="cite_ref-84"><a href="#cite_note-84">[78]</a></sup> and the remaining 49 of the 120 seats are assigned so that representation in parliament reflects the party vote, with the threshold that a party must win at least one electorate or 5% of the total party vote before it is eligible for a seat.<sup id="cite_ref-85"><a href="#cite_note-85">[79]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Seddon_Statue_in_Parliament_Grounds.jpg"><img alt="A block of buildings fronted by a large statue." src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/220px-Seddon_Statue_in_Parliament_Grounds.jpg" decoding="async" width="220" height="171" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/330px-Seddon_Statue_in_Parliament_Grounds.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/440px-Seddon_Statue_in_Parliament_Grounds.jpg 2x" data-file-width="3297" data-file-height="2557"></a></p>
+ </div>
+ <p>
+ Elections since the 1930s have been dominated by two political parties, <a href="http://fakehost/wiki/New_Zealand_National_Party" title="New Zealand National Party">National</a> and <a href="http://fakehost/wiki/New_Zealand_Labour_Party" title="New Zealand Labour Party">Labour</a>.<sup id="cite_ref-road_83-1"><a href="#cite_note-road-83">[77]</a></sup> Between March 2005 and August 2006, New Zealand became the first country in the world in which all the highest offices in the land—head of state, governor-general, prime minister, <a href="http://fakehost/wiki/Speaker_of_the_New_Zealand_House_of_Representatives" title="Speaker of the New Zealand House of Representatives">speaker</a> and <a href="http://fakehost/wiki/Chief_Justice_of_New_Zealand" title="Chief Justice of New Zealand">chief justice</a>—were occupied simultaneously by women.<sup id="cite_ref-86"><a href="#cite_note-86">[80]</a></sup> The current prime minister is <a href="http://fakehost/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>, who has been in office since 26 October 2017.<sup id="cite_ref-87"><a href="#cite_note-87">[81]</a></sup> She is the country's third female prime minister.<sup id="cite_ref-88"><a href="#cite_note-88">[82]</a></sup>
+ </p>
+ <p>
+ <a href="http://fakehost/wiki/Judiciary_of_New_Zealand" title="Judiciary of New Zealand">New Zealand's judiciary</a>, headed by the chief justice,<sup id="cite_ref-89"><a href="#cite_note-89">[83]</a></sup> includes the <a href="http://fakehost/wiki/Supreme_Court_of_New_Zealand" title="Supreme Court of New Zealand">Supreme Court</a>, <a href="http://fakehost/wiki/Court_of_Appeal_of_New_Zealand" title="Court of Appeal of New Zealand">Court of Appeal</a>, the <a href="http://fakehost/wiki/High_Court_of_New_Zealand" title="High Court of New Zealand">High Court</a>, and subordinate courts.<sup id="cite_ref-90"><a href="#cite_note-90">[84]</a></sup> Judges and judicial officers are appointed non-politically and under strict rules regarding tenure to help maintain <a href="http://fakehost/wiki/Judicial_independence" title="Judicial independence">judicial independence</a>.<sup id="cite_ref-Economist_factsheet_72-2"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> This theoretically allows the judiciary to interpret the law based solely on the legislation enacted by Parliament without other influences on their decisions.<sup id="cite_ref-91"><a href="#cite_note-91">[85]</a></sup>
+ </p>
+ <p>
+ New Zealand is identified as one of the world's most stable and well-governed states.<sup id="cite_ref-92"><a href="#cite_note-92">[86]</a></sup> As at 2017, the country was ranked fourth in the strength of its democratic institutions,<sup id="cite_ref-93"><a href="#cite_note-93">[87]</a></sup> and first in government transparency and <a href="http://fakehost/wiki/Corruption_in_New_Zealand" title="Corruption in New Zealand">lack of corruption</a>.<sup id="cite_ref-94"><a href="#cite_note-94">[88]</a></sup> A 2017 <a href="http://fakehost/wiki/Country_Reports_on_Human_Rights_Practices" title="Country Reports on Human Rights Practices">Human Rights Report</a> by the U.S. Department of State noted that the government generally <a href="http://fakehost/wiki/Human_rights_in_New_Zealand" title="Human rights in New Zealand">respected the rights</a> of individuals, but voiced concerns regarding the social status of the Māori population.<sup id="cite_ref-95"><a href="#cite_note-95">[89]</a></sup> New Zealand ranks highly for civic participation in the political process, with 77% <a href="http://fakehost/wiki/Voter_turnout" title="Voter turnout">voter turnout</a> during recent elections, compared to an <abbr title="Organisation for Economic Co-operation and Development">OECD</abbr> average of 69%.<sup id="cite_ref-96"><a href="#cite_note-96">[90]</a></sup>
+ </p>
+
+ <h3>
+ <span id="Foreign_relations_and_military">Foreign relations and military</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:E_003261_E_Maoris_in_North_Africa_July_1941.jpg"><img alt="A squad of men kneel in the desert sand while performing a war dance" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/220px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg" decoding="async" width="220" height="217" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/330px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/440px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg 2x" data-file-width="3040" data-file-height="2999"></a></p>
+ </div>
+ <p>
+ Early colonial New Zealand allowed the British Government to determine external trade and be responsible for foreign policy.<sup id="cite_ref-97"><a href="#cite_note-97">[91]</a></sup> The 1923 and 1926 <a href="http://fakehost/wiki/Imperial_Conference" title="Imperial Conference">Imperial Conferences</a> decided that New Zealand should be allowed to negotiate its own political <a href="http://fakehost/wiki/Treaty" title="Treaty">treaties</a> and the first commercial treaty was ratified in 1928 with Japan. On 3 September 1939 New Zealand allied itself with Britain and <a href="http://fakehost/wiki/Declaration_of_war" title="Declaration of war">declared war</a> on Germany with Prime Minister <a href="http://fakehost/wiki/Michael_Joseph_Savage" title="Michael Joseph Savage">Michael Joseph Savage</a> proclaiming, "Where she goes, we go; where she stands, we stand."<sup id="cite_ref-98"><a href="#cite_note-98">[92]</a></sup>
+ </p>
+ <p>
+ In 1951 the United Kingdom became increasingly focused on its European interests,<sup id="cite_ref-99"><a href="#cite_note-99">[93]</a></sup> while New Zealand joined <a href="http://fakehost/wiki/Australia%E2%80%93New_Zealand_relations" title="Australia–New Zealand relations">Australia</a> and the <a href="http://fakehost/wiki/New_Zealand%E2%80%93United_States_relations" title="New Zealand–United States relations">United States</a> in the <a href="http://fakehost/wiki/ANZUS" title="ANZUS">ANZUS</a> security treaty.<sup id="cite_ref-100"><a href="#cite_note-100">[94]</a></sup> The influence of the United States on New Zealand weakened following protests over the <a href="http://fakehost/wiki/New_Zealand_in_the_Vietnam_War" title="New Zealand in the Vietnam War">Vietnam War</a>,<sup id="cite_ref-101"><a href="#cite_note-101">[95]</a></sup> the refusal of the United States to admonish France after the <a href="http://fakehost/wiki/Sinking_of_the_Rainbow_Warrior" title="Sinking of the Rainbow Warrior">sinking of the <i>Rainbow Warrior</i></a>,<sup id="cite_ref-102"><a href="#cite_note-102">[96]</a></sup> disagreements over environmental and agricultural trade issues and <a href="http://fakehost/wiki/New_Zealand_nuclear-free_zone" title="New Zealand nuclear-free zone">New Zealand's nuclear-free policy</a>.<sup id="cite_ref-103"><a href="#cite_note-103">[97]</a></sup><sup id="cite_ref-104"><a href="#cite_note-104">[98]</a></sup> Despite the United States' suspension of ANZUS obligations the treaty remained in effect between New Zealand and Australia, whose foreign policy has followed a similar historical trend.<sup id="cite_ref-105"><a href="#cite_note-105">[99]</a></sup> Close political contact is maintained between the two countries, with <a href="http://fakehost/wiki/Closer_Economic_Relations" title="Closer Economic Relations">free trade agreements</a> and <a href="http://fakehost/wiki/Trans-Tasman_Travel_Arrangement" title="Trans-Tasman Travel Arrangement">travel arrangements</a> that allow citizens to visit, live and work in both countries without restrictions.<sup id="cite_ref-NZ_in_brief_106-0"><a href="#cite_note-NZ_in_brief-106">[100]</a></sup> In 2013 there were about 650,000 New Zealand citizens living in Australia, which is equivalent to 15% of the resident population of New Zealand.<sup id="cite_ref-107"><a href="#cite_note-107">[101]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_(20).jpg"><img alt="A soldier in a green army uniform faces forwards" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/220px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/330px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/440px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg 2x" data-file-width="3888" data-file-height="2592"></a></p><div>
+ <p><a href="http://fakehost/wiki/Anzac_Day" title="Anzac Day">Anzac Day</a> service at the National War Memorial
+ </p></div>
+ </div>
+ <p>
+ New Zealand has a strong presence among the <a href="http://fakehost/wiki/Pacific_Island" title="Pacific Island">Pacific Island</a> countries. A large proportion of New Zealand's aid goes to these countries and many Pacific people migrate to New Zealand for employment.<sup id="cite_ref-108"><a href="#cite_note-108">[102]</a></sup> Permanent migration is regulated under the 1970 Samoan Quota Scheme and the 2002 Pacific Access Category, which allow up to 1,100 Samoan nationals and up to 750 other Pacific Islanders respectively to become permanent New Zealand residents each year. A seasonal workers scheme for temporary migration was introduced in 2007 and in 2009 about 8,000 Pacific Islanders were employed under it.<sup id="cite_ref-109"><a href="#cite_note-109">[103]</a></sup> A <a href="http://fakehost/wiki/Regional_power" title="Regional power">regional power</a>,<sup id="cite_ref-110"><a href="#cite_note-110">[104]</a></sup> New Zealand is involved in the <a href="http://fakehost/wiki/Pacific_Islands_Forum" title="Pacific Islands Forum">Pacific Islands Forum</a>, the <a href="http://fakehost/wiki/Pacific_Community" title="Pacific Community">Pacific Community</a>, <a href="http://fakehost/wiki/Asia-Pacific_Economic_Cooperation" title="Asia-Pacific Economic Cooperation">Asia-Pacific Economic Cooperation</a> and the <a href="http://fakehost/wiki/Association_of_Southeast_Asian_Nations" title="Association of Southeast Asian Nations">Association of Southeast Asian Nations</a> Regional Forum (including the <a href="http://fakehost/wiki/East_Asia_Summit" title="East Asia Summit">East Asia Summit</a>).<sup id="cite_ref-NZ_in_brief_106-1"><a href="#cite_note-NZ_in_brief-106">[100]</a></sup> New Zealand is a member of the <a href="http://fakehost/wiki/New_Zealand_and_the_United_Nations" title="New Zealand and the United Nations">United Nations</a>,<sup id="cite_ref-111"><a href="#cite_note-111">[105]</a></sup> the <a href="http://fakehost/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a><sup id="cite_ref-112"><a href="#cite_note-112">[106]</a></sup> and the <a href="http://fakehost/wiki/Organisation_for_Economic_Co-operation_and_Development" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a> (OECD),<sup id="cite_ref-113"><a href="#cite_note-113">[107]</a></sup> and participates in the <a href="http://fakehost/wiki/Five_Power_Defence_Arrangements" title="Five Power Defence Arrangements">Five Power Defence Arrangements</a>.<sup id="cite_ref-114"><a href="#cite_note-114">[108]</a></sup>
+ </p>
+ <p>
+ New Zealand's military services—the Defence Force—comprise the <a href="http://fakehost/wiki/New_Zealand_Army" title="New Zealand Army">New Zealand Army</a>, the <a href="http://fakehost/wiki/Royal_New_Zealand_Air_Force" title="Royal New Zealand Air Force">Royal New Zealand Air Force</a> and the <a href="http://fakehost/wiki/Royal_New_Zealand_Navy" title="Royal New Zealand Navy">Royal New Zealand Navy</a>.<sup id="cite_ref-115"><a href="#cite_note-115">[109]</a></sup> New Zealand's <a href="http://fakehost/wiki/National_security" title="National security">national defence</a> needs are modest, since a direct attack is unlikely.<sup id="cite_ref-116"><a href="#cite_note-116">[110]</a></sup> However, its military has <a href="http://fakehost/wiki/Military_history_of_New_Zealand" title="Military history of New Zealand">had a global presence</a>. The country fought in both world wars, with notable campaigns in <a href="http://fakehost/wiki/Gallipoli_Campaign" title="Gallipoli Campaign">Gallipoli</a>, <a href="http://fakehost/wiki/Battle_of_Crete" title="Battle of Crete">Crete</a>,<sup id="cite_ref-117"><a href="#cite_note-117">[111]</a></sup> <a href="http://fakehost/wiki/Second_Battle_of_El_Alamein" title="Second Battle of El Alamein">El Alamein</a><sup id="cite_ref-118"><a href="#cite_note-118">[112]</a></sup> and <a href="http://fakehost/wiki/Battle_of_Monte_Cassino" title="Battle of Monte Cassino">Cassino</a>.<sup id="cite_ref-119"><a href="#cite_note-119">[113]</a></sup> The Gallipoli campaign played an important part in fostering New Zealand's <a href="http://fakehost/wiki/National_identity" title="National identity">national identity</a><sup id="cite_ref-120"><a href="#cite_note-120">[114]</a></sup><sup id="cite_ref-121"><a href="#cite_note-121">[115]</a></sup> and strengthened the <a href="http://fakehost/wiki/Australian_and_New_Zealand_Army_Corps" title="Australian and New Zealand Army Corps">ANZAC</a> tradition it shares with Australia.<sup id="cite_ref-122"><a href="#cite_note-122">[116]</a></sup>
+ </p>
+ <p>
+ In addition to Vietnam and the two world wars, New Zealand fought in the <a href="http://fakehost/wiki/Second_Boer_War" title="Second Boer War">Second Boer War</a>,<sup id="cite_ref-123"><a href="#cite_note-123">[117]</a></sup> the <a href="http://fakehost/wiki/New_Zealand_in_the_Korean_War" title="New Zealand in the Korean War">Korean War</a>,<sup id="cite_ref-124"><a href="#cite_note-124">[118]</a></sup> the <a href="http://fakehost/wiki/Malayan_Emergency" title="Malayan Emergency">Malayan Emergency</a>,<sup id="cite_ref-125"><a href="#cite_note-125">[119]</a></sup> the <a href="http://fakehost/wiki/Gulf_War" title="Gulf War">Gulf War</a> and the <a href="http://fakehost/wiki/War_in_Afghanistan_(2001%E2%80%93present)" title="War in Afghanistan (2001–present)">Afghanistan War</a>. It has contributed forces to several regional and global peacekeeping missions, such as those in <a href="http://fakehost/wiki/Cyprus_dispute" title="Cyprus dispute">Cyprus</a>, <a href="http://fakehost/wiki/Somali_Civil_War" title="Somali Civil War">Somalia</a>, <a href="http://fakehost/wiki/Bosnian_War" title="Bosnian War">Bosnia and Herzegovina</a>, the <a href="http://fakehost/wiki/Suez_Crisis" title="Suez Crisis">Sinai</a>, <a href="http://fakehost/wiki/Angolan_Civil_War" title="Angolan Civil War">Angola</a>, <a href="http://fakehost/wiki/Cambodian%E2%80%93Vietnamese_War" title="Cambodian–Vietnamese War">Cambodia</a>, the <a href="http://fakehost/wiki/Iran%E2%80%93Iraq_War" title="Iran–Iraq War">Iran–Iraq</a> border, <a href="http://fakehost/wiki/Bougainville_Campaign" title="Bougainville Campaign">Bougainville</a>, <a href="http://fakehost/wiki/Operation_Astute" title="Operation Astute">East Timor</a>, and the <a href="http://fakehost/wiki/Solomon_Islands#Civil_war" title="Solomon Islands">Solomon Islands</a>.<sup id="cite_ref-126"><a href="#cite_note-126">[120]</a></sup>
+ </p>
+ <h3>
+ <span id="Local_government_and_external_territories">Local government and external territories</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:NZL_orthographic_NaturalEarth_labelled_en.svg"><img alt="Map with the North, South, Stewart/Rakiura, Tokelau, Cook, Niue, Kermadec, Chatham, Bounty, Antipodes, Snare, Auckland and Campbell Islands highlighted. New Zealand's segment of Antarctica (the Ross Dependency) is also highlighted." src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/400px-NZL_orthographic_NaturalEarth_labelled_en.svg.png" decoding="async" width="400" height="400" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/600px-NZL_orthographic_NaturalEarth_labelled_en.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/800px-NZL_orthographic_NaturalEarth_labelled_en.svg.png 2x" data-file-width="553" data-file-height="553"></a></p>
+ </div>
+ <p>
+ The early European settlers divided New Zealand into <a href="http://fakehost/wiki/Provinces_of_New_Zealand" title="Provinces of New Zealand">provinces</a>, which had a degree of autonomy.<sup id="cite_ref-nine_provinces_127-0"><a href="#cite_note-nine_provinces-127">[121]</a></sup> Because of financial pressures and the desire to consolidate railways, education, land sales and other policies, government was centralised and the provinces were abolished in 1876.<sup id="cite_ref-128"><a href="#cite_note-128">[122]</a></sup> The provinces are remembered in <a href="http://fakehost/wiki/Public_holidays_in_New_Zealand" title="Public holidays in New Zealand">regional public holidays</a><sup id="cite_ref-129"><a href="#cite_note-129">[123]</a></sup> and sporting rivalries.<sup id="cite_ref-130"><a href="#cite_note-130">[124]</a></sup>
+ </p>
+ <p>
+ Since 1876, various councils have administered local areas under legislation determined by the central government.<sup id="cite_ref-nine_provinces_127-1"><a href="#cite_note-nine_provinces-127">[121]</a></sup><sup id="cite_ref-131"><a href="#cite_note-131">[125]</a></sup> In 1989, the government reorganised local government into the current two-tier structure of <a href="http://fakehost/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">regional councils</a> and <a href="http://fakehost/wiki/Territorial_authorities" title="Territorial authorities">territorial authorities</a>.<sup id="cite_ref-Sancton2000_132-0"><a href="#cite_note-Sancton2000-132">[126]</a></sup> The <a href="http://fakehost/wiki/List_of_former_territorial_authorities_in_New_Zealand" title="List of former territorial authorities in New Zealand">249 municipalities</a><sup id="cite_ref-Sancton2000_132-1"><a href="#cite_note-Sancton2000-132">[126]</a></sup> that existed in 1975 have now been consolidated into 67 territorial authorities and 11 regional councils.<sup id="cite_ref-133"><a href="#cite_note-133">[127]</a></sup> The regional councils' role is to regulate "the natural environment with particular emphasis on <a href="http://fakehost/wiki/Resource_Management_Act_1991" title="Resource Management Act 1991">resource management</a>",<sup id="cite_ref-Sancton2000_132-2"><a href="#cite_note-Sancton2000-132">[126]</a></sup> while territorial authorities are responsible for sewage, water, local roads, building consents and other local matters.<sup id="cite_ref-FOOTNOTESmeltJui_Lin200933_134-0"><a href="#cite_note-FOOTNOTESmeltJui_Lin200933-134">[128]</a></sup><sup id="cite_ref-glossary_135-0"><a href="#cite_note-glossary-135">[129]</a></sup> Five of the territorial councils are <a href="http://fakehost/wiki/Unitary_authority" title="Unitary authority">unitary authorities</a> and also act as regional councils.<sup id="cite_ref-glossary_135-1"><a href="#cite_note-glossary-135">[129]</a></sup> The territorial authorities consist of 13 city councils, 53 <a href="http://fakehost/wiki/Districts_of_New_Zealand" title="Districts of New Zealand">district</a> councils, and the <a href="http://fakehost/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a> Council. While officially the Chatham Islands Council is not a unitary authority, it undertakes many functions of a regional council.<sup id="cite_ref-136"><a href="#cite_note-136">[130]</a></sup>
+ </p>
+ <p>
+ The Realm of New Zealand, one of 16 <a href="http://fakehost/wiki/Commonwealth_realm" title="Commonwealth realm">Commonwealth realms</a>,<sup id="cite_ref-137"><a href="#cite_note-137">[131]</a></sup> is the entire area over which the Queen of New Zealand is <a href="http://fakehost/wiki/Sovereign" title="Sovereign">sovereign</a>, and comprises New Zealand, <a href="http://fakehost/wiki/Tokelau" title="Tokelau">Tokelau</a>, the <a href="http://fakehost/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>, the <a href="http://fakehost/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a> and <a href="http://fakehost/wiki/Niue" title="Niue">Niue</a>.<sup id="cite_ref-GG_constitution_71-1"><a href="#cite_note-GG_constitution-71">[65]</a></sup> The Cook Islands and Niue are self-governing states in <a href="http://fakehost/wiki/Associated_state" title="Associated state">free association</a> with New Zealand.<sup id="cite_ref-138"><a href="#cite_note-138">[132]</a></sup><sup id="cite_ref-139"><a href="#cite_note-139">[133]</a></sup> The New Zealand Parliament cannot pass legislation for these countries, but with their consent can act on behalf of them in foreign affairs and defence. Tokelau is classified as a <a href="http://fakehost/wiki/United_Nations_list_of_Non-Self-Governing_Territories" title="United Nations list of Non-Self-Governing Territories">non-self-governing territory</a>, but is administered by a council of three elders (one from each Tokelauan <a href="http://fakehost/wiki/Atoll" title="Atoll">atoll</a>).<sup id="cite_ref-140"><a href="#cite_note-140">[134]</a></sup> The Ross Dependency is New Zealand's <a href="http://fakehost/wiki/Territorial_claims_in_Antarctica" title="Territorial claims in Antarctica">territorial claim in Antarctica</a>, where it operates the <a href="http://fakehost/wiki/Scott_Base" title="Scott Base">Scott Base</a> research facility.<sup id="cite_ref-141"><a href="#cite_note-141">[135]</a></sup> <a href="http://fakehost/wiki/New_Zealand_nationality_law" title="New Zealand nationality law">New Zealand nationality law</a> treats all parts of the realm equally, so most people born in New Zealand, the Cook Islands, Niue, Tokelau and the Ross Dependency are New Zealand citizens.<sup id="cite_ref-142"><a href="#cite_note-142">[136]</a></sup><sup id="cite_ref-144"><a href="#cite_note-144">[n 7]</a></sup>
+ </p>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="12">
+ <div>
+ <ul>
+ <li>
+ <a href="http://fakehost/wiki/Template:Administrative_divisions_of_New_Zealand" title="Template:Administrative divisions of New Zealand"><abbr title="View this template">v</abbr></a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Template_talk:Administrative_divisions_of_New_Zealand" title="Template talk:Administrative divisions of New Zealand"><abbr title="Discuss this template">t</abbr></a>
+ </li>
+ <li>
+ <a href="https://en.wikipedia.org/w/index.php?title=Template:Administrative_divisions_of_New_Zealand&amp;action=edit"><abbr title="Edit this template">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Administrative divisions of the Realm of New Zealand
+ </p>
+ </th>
+ </tr>
+ <tr>
+ <th>
+ Countries
+ </th>
+ <td colspan="7">
+ <span><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/23px-Flag_of_New_Zealand.svg.png" decoding="async" width="23" height="12" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/35px-Flag_of_New_Zealand.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/46px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600">&nbsp;</span><a>New Zealand</a>
+ </td>
+ <td rowspan="4">
+ &nbsp;
+ </td>
+ <td rowspan="4">
+ &nbsp;
+ </td>
+ <td rowspan="1">
+ <span><span><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/23px-Flag_of_the_Cook_Islands.svg.png" decoding="async" width="23" height="12" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/35px-Flag_of_the_Cook_Islands.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/46px-Flag_of_the_Cook_Islands.svg.png 2x" data-file-width="1200" data-file-height="600">&nbsp;</span><a href="http://fakehost/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></span>
+ </td>
+ <td rowspan="1">
+ <span><span><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/23px-Flag_of_Niue.svg.png" decoding="async" width="23" height="12" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/35px-Flag_of_Niue.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/46px-Flag_of_Niue.svg.png 2x" data-file-width="600" data-file-height="300">&nbsp;</span><a href="http://fakehost/wiki/Niue" title="Niue">Niue</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <a href="http://fakehost/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Regions</a>
+ </th>
+ <td>
+ 11 non-unitary regions
+ </td>
+ <td rowspan="2">
+ 5 unitary regions
+ </td>
+ <td rowspan="2">
+ <a href="http://fakehost/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a>
+ </td>
+ <td rowspan="3">
+ &nbsp;
+ </td>
+ <td rowspan="2">
+ <a href="http://fakehost/wiki/New_Zealand_outlying_islands" title="New Zealand outlying islands">Outlying islands</a> outside any regional authority<br>
+ (the <a href="http://fakehost/wiki/Kermadec_Islands" title="Kermadec Islands">Kermadec Islands</a>, <a href="http://fakehost/wiki/Three_Kings_Islands" title="Three Kings Islands">Three Kings Islands</a>, and <a href="http://fakehost/wiki/New_Zealand_Subantarctic_Islands" title="New Zealand Subantarctic Islands">Subantarctic Islands</a>)
+ </td>
+ <td rowspan="2">
+ <a href="http://fakehost/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>
+ </td>
+ <td rowspan="2">
+ <span><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/23px-Flag_of_Tokelau.svg.png" decoding="async" width="23" height="12" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/35px-Flag_of_Tokelau.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/46px-Flag_of_Tokelau.svg.png 2x" data-file-width="1800" data-file-height="900">&nbsp;</span><a href="http://fakehost/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </td>
+ <td rowspan="2">
+ <span>15 islands</span>
+ </td>
+ <td rowspan="2">
+ <span>14 <a href="http://fakehost/wiki/List_of_villages_in_Niue" title="List of villages in Niue">villages</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <a href="http://fakehost/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">Territorial authorities</a>
+ </th>
+ <td>
+ 13 cities and 53 districts
+ </td>
+ </tr>
+ <tr>
+ <th>
+ Notes
+ </th>
+ <td>
+ Some districts lie in more than one region
+ </td>
+ <td>
+ These combine the regional and the territorial authority levels in one
+ </td>
+ <td>
+ Special territorial authority
+ </td>
+ <td colspan="1">
+ The outlying <a href="http://fakehost/wiki/Solander_Islands" title="Solander Islands">Solander Islands</a> form part of the <a href="http://fakehost/wiki/Southland_Region" title="Southland Region">Southland Region</a>
+ </td>
+ <td>
+ New&nbsp;Zealand's <a href="http://fakehost/wiki/Territorial_claims_in_Antarctica" title="Territorial claims in Antarctica">Antarctic territory</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/United_Nations_list_of_Non-Self-Governing_Territories" title="United Nations list of Non-Self-Governing Territories">Non-self-governing territory</a> of New&nbsp;Zealand
+ </td>
+ <td colspan="2">
+ States in <a href="http://fakehost/wiki/Associated_state" title="Associated state">free association</a> with New&nbsp;Zealand
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>
+ <span id="Environment">Environment</span>
+ </h2>
+
+ <h3>
+ <span id="Geography">Geography</span>
+ </h3>
+
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:New_Zealand_23_October_2002.jpg"><img alt="Islands of New Zealand as seen from satellite" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/170px-New_Zealand_23_October_2002.jpg" decoding="async" width="170" height="227" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/255px-New_Zealand_23_October_2002.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/340px-New_Zealand_23_October_2002.jpg 2x" data-file-width="4200" data-file-height="5600"></a></p>
+ </div>
+ <p>
+ New Zealand is located near the centre of the <a href="http://fakehost/wiki/Water_hemisphere" title="Water hemisphere">water hemisphere</a> and is made up of two main islands and a number of <a href="http://fakehost/wiki/List_of_islands_of_New_Zealand" title="List of islands of New Zealand">smaller islands</a>. The two main islands (the <a href="http://fakehost/wiki/North_Island" title="North Island">North Island</a>, or <i>Te Ika-a-Māui</i>, and the <a href="http://fakehost/wiki/South_Island" title="South Island">South Island</a>, or <i>Te Waipounamu</i>) are separated by <a href="http://fakehost/wiki/Cook_Strait" title="Cook Strait">Cook Strait</a>, 22 kilometres (14&nbsp;mi) wide at its narrowest point.<sup id="cite_ref-145"><a href="#cite_note-145">[138]</a></sup> Besides the North and South Islands, the five largest inhabited islands are <a href="http://fakehost/wiki/Stewart_Island" title="Stewart Island">Stewart Island</a> (across the <a href="http://fakehost/wiki/Foveaux_Strait" title="Foveaux Strait">Foveaux Strait</a>), <a href="http://fakehost/wiki/Chatham_Island" title="Chatham Island">Chatham Island</a>, <a href="http://fakehost/wiki/Great_Barrier_Island" title="Great Barrier Island">Great Barrier Island</a> (in the <a href="http://fakehost/wiki/Hauraki_Gulf" title="Hauraki Gulf">Hauraki Gulf</a>),<sup id="cite_ref-146"><a href="#cite_note-146">[139]</a></sup> <a href="http://fakehost/wiki/D%27Urville_Island_(New_Zealand)" title="D'Urville Island (New Zealand)">D'Urville Island</a> (in the <a href="http://fakehost/wiki/Marlborough_Sounds" title="Marlborough Sounds">Marlborough Sounds</a>)<sup id="cite_ref-147"><a href="#cite_note-147">[140]</a></sup> and <a href="http://fakehost/wiki/Waiheke_Island" title="Waiheke Island">Waiheke Island</a> (about 22&nbsp;km (14&nbsp;mi) from central Auckland).<sup id="cite_ref-148"><a href="#cite_note-148">[141]</a></sup>
+ </p>
+
+ <div>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Mt_Cook,_NZ.jpg"><img alt="A large mountain with a lake in the foreground" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/220px-Mt_Cook%2C_NZ.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/330px-Mt_Cook%2C_NZ.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/440px-Mt_Cook%2C_NZ.jpg 2x" data-file-width="4608" data-file-height="3072"></a>
+ </p>
+
+ </div>
+ <div>
+ <p><a href="http://fakehost/wiki/File:New_Zealand_moutain_ranges.jpg"><img alt="Snow-capped mountain range" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/220px-New_Zealand_moutain_ranges.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/330px-New_Zealand_moutain_ranges.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/440px-New_Zealand_moutain_ranges.jpg 2x" data-file-width="4272" data-file-height="2848"></a>
+ </p>
+ <p>
+ The Southern Alps stretch for 500 kilometres down the South Island
+ </p>
+ </div>
+ </div>
+ <p>
+ New Zealand is long and narrow (over 1,600 kilometres (990&nbsp;mi) along its north-north-east axis with a maximum width of 400 kilometres (250&nbsp;mi)),<sup id="cite_ref-149"><a href="#cite_note-149">[142]</a></sup> with about 15,000&nbsp;km (9,300&nbsp;mi) of coastline<sup id="cite_ref-CIA_150-0"><a href="#cite_note-CIA-150">[143]</a></sup> and a total land area of 268,000 square kilometres (103,500&nbsp;sq&nbsp;mi).<sup id="cite_ref-151"><a href="#cite_note-151">[144]</a></sup> Because of its far-flung outlying islands and long coastline, the country has extensive marine resources. Its <a href="http://fakehost/wiki/Exclusive_economic_zone_of_New_Zealand" title="Exclusive economic zone of New Zealand">exclusive economic zone</a> is one of the largest in the world, covering more than 15 times its land area.<sup id="cite_ref-152"><a href="#cite_note-152">[145]</a></sup>
+ </p>
+ <p>
+ The South Island is the largest landmass of New Zealand. It is divided along its length by the <a href="http://fakehost/wiki/Southern_Alps" title="Southern Alps">Southern Alps</a>.<sup id="cite_ref-153"><a href="#cite_note-153">[146]</a></sup> There are 18 peaks over 3,000 metres (9,800&nbsp;ft), the highest of which is <a href="http://fakehost/wiki/Aoraki_/_Mount_Cook" title="Aoraki / Mount Cook">Aoraki / Mount Cook</a> at 3,754 metres (12,316&nbsp;ft).<sup id="cite_ref-FOOTNOTEGarden200552_154-0"><a href="#cite_note-FOOTNOTEGarden200552-154">[147]</a></sup> <a href="http://fakehost/wiki/Fiordland" title="Fiordland">Fiordland</a>'s steep mountains and deep <a href="http://fakehost/wiki/Fiord" title="Fiord">fiords</a> record the extensive ice age glaciation of this southwestern corner of the South Island.<sup id="cite_ref-155"><a href="#cite_note-155">[148]</a></sup> The North Island is less mountainous but is <a href="http://fakehost/wiki/Volcanology_of_New_Zealand" title="Volcanology of New Zealand">marked by volcanism</a>.<sup id="cite_ref-156"><a href="#cite_note-156">[149]</a></sup> The highly active <a href="http://fakehost/wiki/Taupo_Volcanic_Zone" title="Taupo Volcanic Zone">Taupo Volcanic Zone</a> has formed a large <a href="http://fakehost/wiki/North_Island_Volcanic_Plateau" title="North Island Volcanic Plateau">volcanic plateau</a>, punctuated by the North Island's highest mountain, <a href="http://fakehost/wiki/Mount_Ruapehu" title="Mount Ruapehu">Mount Ruapehu</a> (2,797 metres (9,177&nbsp;ft)). The plateau also hosts the country's largest lake, <a href="http://fakehost/wiki/Lake_Taupo" title="Lake Taupo">Lake Taupo</a>,<sup id="cite_ref-157"><a href="#cite_note-157">[150]</a></sup> nestled in the <a href="http://fakehost/wiki/Caldera" title="Caldera">caldera</a> of one of the world's most active <a href="http://fakehost/wiki/Supervolcano" title="Supervolcano">supervolcanoes</a>.<sup id="cite_ref-158"><a href="#cite_note-158">[151]</a></sup>
+ </p>
+ <p>
+ The country owes its varied topography, and perhaps even its emergence above the waves, to the dynamic boundary it straddles between the <a href="http://fakehost/wiki/Pacific_Plate" title="Pacific Plate">Pacific</a> and <a href="http://fakehost/wiki/Indo-Australian_Plate" title="Indo-Australian Plate">Indo-Australian Plates</a>.<sup id="cite_ref-Keith_2009_159-0"><a href="#cite_note-Keith_2009-159">[152]</a></sup> New Zealand is part of <a href="http://fakehost/wiki/Zealandia" title="Zealandia">Zealandia</a>, a <a href="http://fakehost/wiki/Microcontinent" title="Microcontinent">microcontinent</a> nearly half the size of Australia that gradually submerged after breaking away from the <a href="http://fakehost/wiki/Gondwana" title="Gondwana">Gondwanan</a> supercontinent.<sup id="cite_ref-160"><a href="#cite_note-160">[153]</a></sup> About 25 million years ago, a shift in <a href="http://fakehost/wiki/Plate_tectonic" title="Plate tectonic">plate tectonic</a> movements began to <a href="http://fakehost/wiki/Kaikoura_Orogeny" title="Kaikoura Orogeny">contort and crumple</a> the region. This is now most evident in the Southern Alps, formed by <a href="http://fakehost/wiki/Continental_collision" title="Continental collision">compression of the crust</a> beside the <a href="http://fakehost/wiki/Alpine_Fault" title="Alpine Fault">Alpine Fault</a>. Elsewhere the plate boundary involves the <a href="http://fakehost/wiki/Subduction" title="Subduction">subduction</a> of one plate under the other, producing the <a href="http://fakehost/wiki/Puysegur_Trench" title="Puysegur Trench">Puysegur Trench</a> to the south, the <a href="http://fakehost/wiki/Hikurangi_Trench" title="Hikurangi Trench">Hikurangi Trench</a> east of the North Island, and the <a href="http://fakehost/wiki/Kermadec_Trench" title="Kermadec Trench">Kermadec</a> and <a href="http://fakehost/wiki/Tonga_Trench" title="Tonga Trench">Tonga Trenches</a><sup id="cite_ref-161"><a href="#cite_note-161">[154]</a></sup> further north.<sup id="cite_ref-Keith_2009_159-1"><a href="#cite_note-Keith_2009-159">[152]</a></sup>
+ </p>
+ <p>
+ New Zealand is part of a region known as <a href="http://fakehost/wiki/Australasia" title="Australasia">Australasia</a>, together with Australia.<sup id="cite_ref-NZOD_162-0"><a href="#cite_note-NZOD-162">[155]</a></sup> It also forms the southwestern extremity of the geographic and ethnographic region called <a href="http://fakehost/wiki/Polynesia" title="Polynesia">Polynesia</a>.<sup id="cite_ref-163"><a href="#cite_note-163">[156]</a></sup> The term <a href="http://fakehost/wiki/Oceania" title="Oceania">Oceania</a> is often used to denote the wider region encompassing the <a href="http://fakehost/wiki/Australia_(continent)" title="Australia (continent)">Australian continent</a>, New Zealand and various islands in the Pacific Ocean that are not included in the <a href="http://fakehost/wiki/Continent" title="Continent">seven-continent</a> model.<sup id="cite_ref-164"><a href="#cite_note-164">[157]</a></sup>
+ </p>
+
+ <ul>
+ <li>Landscapes of New Zealand
+ </li>
+ <li>
+
+ </li>
+ <li>
+
+ </li>
+ <li>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Lake_Gunn.jpg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/269px-Lake_Gunn.jpg" decoding="async" width="180" height="120" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/404px-Lake_Gunn.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/538px-Lake_Gunn.jpg 2x" data-file-width="1000" data-file-height="669"></a>
+ </p>
+ </div>
+ </li>
+ <li>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Pencarrow_Head,_Wellington,_New_Zealand_from_Santa_Regina,_24_Feb._2007.jpg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/269px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg" decoding="async" width="180" height="120" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/404px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/538px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg 2x" data-file-width="3872" data-file-height="2592"></a>
+ </p>
+ </div>
+ </li>
+ </ul>
+ <h3>
+ <span id="Climate">Climate</span>
+ </h3>
+
+ <p>
+ New Zealand's climate is predominantly temperate <a href="http://fakehost/wiki/Oceanic_climate" title="Oceanic climate">maritime</a> (<a href="http://fakehost/wiki/K%C3%B6ppen_climate_classification" title="Köppen climate classification">Köppen</a>: Cfb), with mean annual temperatures ranging from 10&nbsp;°C (50&nbsp;°F) in the south to 16&nbsp;°C (61&nbsp;°F) in the north.<sup id="cite_ref-Mullan2009_165-0"><a href="#cite_note-Mullan2009-165">[158]</a></sup> Historical <a href="http://fakehost/wiki/Maxima_and_minima" title="Maxima and minima">maxima and minima</a> are 42.4&nbsp;°C (108.32&nbsp;°F) in <a href="http://fakehost/wiki/Rangiora" title="Rangiora">Rangiora</a>, <a href="http://fakehost/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a> and −25.6&nbsp;°C (−14.08&nbsp;°F) in <a href="http://fakehost/wiki/Ranfurly,_New_Zealand" title="Ranfurly, New Zealand">Ranfurly</a>, <a href="http://fakehost/wiki/Otago" title="Otago">Otago</a>.<sup id="cite_ref-niwa_166-0"><a href="#cite_note-niwa-166">[159]</a></sup> Conditions vary sharply across regions from extremely wet on the <a href="http://fakehost/wiki/West_Coast,_New_Zealand" title="West Coast, New Zealand">West Coast</a> of the South Island to almost <a href="http://fakehost/wiki/Semi-arid_climate" title="Semi-arid climate">semi-arid</a> in <a href="http://fakehost/wiki/Central_Otago" title="Central Otago">Central Otago</a> and the <a href="http://fakehost/wiki/Mackenzie_Basin" title="Mackenzie Basin">Mackenzie Basin</a> of inland Canterbury and <a href="http://fakehost/wiki/Subtropical" title="Subtropical">subtropical</a> in <a href="http://fakehost/wiki/Northland_Peninsula" title="Northland Peninsula">Northland</a>.<sup id="cite_ref-167"><a href="#cite_note-167">[160]</a></sup> Of the seven largest cities, <a href="http://fakehost/wiki/Christchurch" title="Christchurch">Christchurch</a> is the driest, receiving on average only 640 millimetres (25&nbsp;in) of rain per year and Wellington the wettest, receiving almost twice that amount.<sup id="cite_ref-168"><a href="#cite_note-168">[161]</a></sup> Auckland, Wellington and Christchurch all receive a yearly average of more than 2,000 hours of sunshine. The southern and southwestern parts of the South Island have a cooler and cloudier climate, with around 1,400–1,600 hours; the northern and northeastern parts of the South Island are the sunniest areas of the country and receive about 2,400–2,500 hours.<sup id="cite_ref-169"><a href="#cite_note-169">[162]</a></sup> The general snow season is early June until early October, though <a href="http://fakehost/wiki/Cold_snap" title="Cold snap">cold snaps</a> can occur outside this season.<sup id="cite_ref-170"><a href="#cite_note-170">[163]</a></sup> Snowfall is common in the eastern and southern parts of the South Island and mountain areas across the country.<sup id="cite_ref-Mullan2009_165-1"><a href="#cite_note-Mullan2009-165">[158]</a></sup>
+ </p>
+ <p>
+ The table below lists climate normals for the warmest and coldest months in New Zealand's six largest cities. North Island cities are generally warmest in February. South Island cities are warmest in January.
+ </p>
+ <table readabilityDataTable="1">
+ <caption>
+ Average daily maximum and minimum temperatures for the six largest cities of New Zealand<sup id="cite_ref-171"><a href="#cite_note-171">[164]</a></sup>
+ </caption>
+ <tbody>
+ <tr>
+ <th>
+ Location
+ </th>
+ <th>
+ Jan/Feb (°C)
+ </th>
+ <th>
+ Jan/Feb (°F)
+ </th>
+ <th>
+ July (°C)
+ </th>
+ <th>
+ July (°F)
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ <td>
+ 23/16
+ </td>
+ <td>
+ 74/60
+ </td>
+ <td>
+ 14/7
+ </td>
+ <td>
+ 58/45
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td>
+ 20/13
+ </td>
+ <td>
+ 68/56
+ </td>
+ <td>
+ 11/6
+ </td>
+ <td>
+ 52/42
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Christchurch" title="Christchurch">Christchurch</a>
+ </td>
+ <td>
+ 22/12
+ </td>
+ <td>
+ 72/53
+ </td>
+ <td>
+ 10/0
+ </td>
+ <td>
+ 51/33
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ <td>
+ 24/13
+ </td>
+ <td>
+ 75/56
+ </td>
+ <td>
+ 14/4
+ </td>
+ <td>
+ 57/39
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Tauranga" title="Tauranga">Tauranga</a>
+ </td>
+ <td>
+ 24/15
+ </td>
+ <td>
+ 75/59
+ </td>
+ <td>
+ 14/6
+ </td>
+ <td>
+ 58/42
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/Dunedin" title="Dunedin">Dunedin</a>
+ </td>
+ <td>
+ 19/11
+ </td>
+ <td>
+ 66/53
+ </td>
+ <td>
+ 10/3
+ </td>
+ <td>
+ 50/37
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <h3>
+ <span id="Biodiversity">Biodiversity</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:TeTuatahianui.jpg"><img alt="Kiwi amongst sticks" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/170px-TeTuatahianui.jpg" decoding="async" width="170" height="227" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/255px-TeTuatahianui.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/340px-TeTuatahianui.jpg 2x" data-file-width="994" data-file-height="1325"></a></p><div>
+ <p>The endemic flightless <a href="http://fakehost/wiki/Kiwi" title="Kiwi">kiwi</a> is a national icon.
+ </p></div>
+ </div>
+ <p>
+ New Zealand's <a href="http://fakehost/wiki/Geographic_isolation" title="Geographic isolation">geographic isolation</a> for 80 million years<sup id="cite_ref-172"><a href="#cite_note-172">[165]</a></sup> and island <a href="http://fakehost/wiki/Biogeography" title="Biogeography">biogeography</a> has influenced evolution of the country's species of <a href="http://fakehost/wiki/Fauna" title="Fauna">animals</a>, <a href="http://fakehost/wiki/Fungus" title="Fungus">fungi</a> and <a href="http://fakehost/wiki/Flora" title="Flora">plants</a>. Physical isolation has caused biological isolation, resulting in a dynamic evolutionary ecology with examples of very distinctive plants and animals as well as populations of widespread species.<sup id="cite_ref-173"><a href="#cite_note-173">[166]</a></sup><sup id="cite_ref-174"><a href="#cite_note-174">[167]</a></sup> About 82% of New Zealand's indigenous <a href="http://fakehost/wiki/Vascular_plant" title="Vascular plant">vascular plants</a> are <a href="http://fakehost/wiki/Endemism" title="Endemism">endemic</a>, covering 1,944 species across 65 <a href="http://fakehost/wiki/Genus" title="Genus">genera</a>.<sup id="cite_ref-FAQ_175-0"><a href="#cite_note-FAQ-175">[168]</a></sup><sup id="cite_ref-NZPCN_2006_176-0"><a href="#cite_note-NZPCN_2006-176">[169]</a></sup> The number of fungi recorded from New Zealand, including lichen-forming species, is not known, nor is the proportion of those fungi which are endemic, but one estimate suggests there are about 2,300 species of lichen-forming fungi in New Zealand<sup id="cite_ref-FAQ_175-1"><a href="#cite_note-FAQ-175">[168]</a></sup> and 40% of these are endemic.<sup id="cite_ref-177"><a href="#cite_note-177">[170]</a></sup> The two main types of forest are those dominated by broadleaf trees with emergent <a href="http://fakehost/wiki/Podocarp" title="Podocarp">podocarps</a>, or by <a href="http://fakehost/wiki/Nothofagus" title="Nothofagus">southern beech</a> in cooler climates.<sup id="cite_ref-178"><a href="#cite_note-178">[171]</a></sup> The remaining vegetation types consist of grasslands, the majority of which are <a href="http://fakehost/wiki/Tussock_grasslands_of_New_Zealand" title="Tussock grasslands of New Zealand">tussock</a>.<sup id="cite_ref-179"><a href="#cite_note-179">[172]</a></sup>
+ </p>
+ <p>
+ Before the arrival of humans, an estimated 80% of the land was covered in forest, with only <a href="http://fakehost/wiki/Tree_line" title="Tree line">high alpine</a>, wet, infertile and volcanic areas without trees.<sup id="cite_ref-180"><a href="#cite_note-180">[173]</a></sup> Massive <a href="http://fakehost/wiki/Deforestation_in_New_Zealand" title="Deforestation in New Zealand">deforestation</a> occurred after humans arrived, with around half the forest cover lost to fire after Polynesian settlement.<sup id="cite_ref-181"><a href="#cite_note-181">[174]</a></sup> Much of the remaining forest fell after European settlement, being logged or cleared to make room for pastoral farming, leaving forest occupying only 23% of the land.<sup id="cite_ref-182"><a href="#cite_note-182">[175]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg"><img alt="An artist's rendition of a Haast's eagle attacking two moa" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/220px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg" decoding="async" width="220" height="176" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/330px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/440px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg 2x" data-file-width="1375" data-file-height="1101"></a></p><div>
+ <p>The giant <a href="http://fakehost/wiki/Haast%27s_eagle" title="Haast's eagle">Haast's eagle</a> died out when humans hunted its main prey, the <a href="http://fakehost/wiki/Moa" title="Moa">moa</a>, to extinction.
+ </p></div>
+ </div>
+ <p>
+ The forests were dominated by <a href="http://fakehost/wiki/Birds_of_New_Zealand" title="Birds of New Zealand">birds</a>, and the lack of mammalian predators led to some like the <a href="http://fakehost/wiki/Kiwi" title="Kiwi">kiwi</a>, <a href="http://fakehost/wiki/Kakapo" title="Kakapo">kakapo</a>, <a href="http://fakehost/wiki/Weka" title="Weka">weka</a> and <a href="http://fakehost/wiki/Takah%C4%93" title="Takahē">takahē</a> evolving <a href="http://fakehost/wiki/Flightless_bird" title="Flightless bird">flightlessness</a>.<sup id="cite_ref-183"><a href="#cite_note-183">[176]</a></sup> The arrival of humans, associated changes to habitat, and the introduction of <a href="http://fakehost/wiki/Polynesian_rat" title="Polynesian rat">rats</a>, ferrets and other mammals led to the <a href="http://fakehost/wiki/List_of_New_Zealand_animals_extinct_in_the_Holocene" title="List of New Zealand animals extinct in the Holocene">extinction</a> of many bird species, including <a href="http://fakehost/wiki/Megafauna" title="Megafauna">large birds</a> like the <a href="http://fakehost/wiki/Moa" title="Moa">moa</a> and <a href="http://fakehost/wiki/Haast%27s_eagle" title="Haast's eagle">Haast's eagle</a>.<sup id="cite_ref-Holdaway2009_184-0"><a href="#cite_note-Holdaway2009-184">[177]</a></sup><sup id="cite_ref-185"><a href="#cite_note-185">[178]</a></sup>
+ </p>
+ <p>
+ Other indigenous animals are represented by reptiles (<a href="http://fakehost/wiki/Tuatara" title="Tuatara">tuatara</a>, <a href="http://fakehost/wiki/Skink" title="Skink">skinks</a> and <a href="http://fakehost/wiki/List_of_geckos_of_New_Zealand" title="List of geckos of New Zealand">geckos</a>), <a href="http://fakehost/wiki/Leiopelmatidae" title="Leiopelmatidae">frogs</a>,<sup id="cite_ref-186"><a href="#cite_note-186">[179]</a></sup> <a href="http://fakehost/wiki/Spiders_of_New_Zealand" title="Spiders of New Zealand">spiders</a>,<sup id="cite_ref-187"><a href="#cite_note-187">[180]</a></sup> insects (<a href="http://fakehost/wiki/Weta" title="Weta">weta</a>)<sup id="cite_ref-188"><a href="#cite_note-188">[181]</a></sup> and snails.<sup id="cite_ref-189"><a href="#cite_note-189">[182]</a></sup> Some, such as the tuatara, are so unique that they have been called <a href="http://fakehost/wiki/Living_fossil" title="Living fossil">living fossils</a>.<sup id="cite_ref-190"><a href="#cite_note-190">[183]</a></sup> Three species of bats (<a href="http://fakehost/wiki/New_Zealand_greater_short-tailed_bat" title="New Zealand greater short-tailed bat">one</a> since extinct) were the only sign of native land mammals in New Zealand until the 2006 discovery of bones from <a href="http://fakehost/wiki/Saint_Bathans_mammal" title="Saint Bathans mammal">a unique, mouse-sized land mammal</a> at least 16 million years old.<sup id="cite_ref-191"><a href="#cite_note-191">[184]</a></sup><sup id="cite_ref-192"><a href="#cite_note-192">[185]</a></sup> Marine mammals however are abundant, with almost half the world's <a href="http://fakehost/wiki/Cetacea" title="Cetacea">cetaceans</a> (whales, dolphins, and <a href="http://fakehost/wiki/Porpoise" title="Porpoise">porpoises</a>) and large numbers of <a href="http://fakehost/wiki/Fur_seal" title="Fur seal">fur seals</a> reported in New Zealand waters.<sup id="cite_ref-193"><a href="#cite_note-193">[186]</a></sup> Many seabirds breed in New Zealand, a third of them unique to the country.<sup id="cite_ref-194"><a href="#cite_note-194">[187]</a></sup> More <a href="http://fakehost/wiki/List_of_birds_of_New_Zealand#Penguins" title="List of birds of New Zealand">penguin</a> species are found in New Zealand than in any other country.<sup id="cite_ref-195"><a href="#cite_note-195">[188]</a></sup>
+ </p>
+ <p>
+ Since human arrival, almost half of the country's vertebrate species have become extinct, including at least fifty-one birds, three frogs, three lizards, one freshwater fish, and one bat. Others are endangered or have had their range severely reduced.<sup id="cite_ref-Holdaway2009_184-1"><a href="#cite_note-Holdaway2009-184">[177]</a></sup> However, New Zealand conservationists have pioneered several methods to help threatened wildlife recover, including island sanctuaries, pest control, wildlife translocation, fostering, and ecological <a href="http://fakehost/wiki/Island_restoration" title="Island restoration">restoration of islands</a> and <a href="http://fakehost/wiki/Ecological_island" title="Ecological island">other selected areas</a>.<sup id="cite_ref-196"><a href="#cite_note-196">[189]</a></sup><sup id="cite_ref-197"><a href="#cite_note-197">[190]</a></sup><sup id="cite_ref-198"><a href="#cite_note-198">[191]</a></sup><sup id="cite_ref-199"><a href="#cite_note-199">[192]</a></sup>
+ </p>
+
+ <h2>
+ <span id="Economy">Economy</span>
+ </h2>
+
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Auckland_Waterfrt.jpg"><img alt="Boats docked in blue-green water. Plate glass skyscrapers rising up in the background." src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/220px-Auckland_Waterfrt.jpg" decoding="async" width="220" height="145" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/330px-Auckland_Waterfrt.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/440px-Auckland_Waterfrt.jpg 2x" data-file-width="4568" data-file-height="3019"></a></p>
+ </div>
+ <p>
+ New Zealand has an <a href="http://fakehost/wiki/Advanced_economy" title="Advanced economy">advanced</a> <a href="http://fakehost/wiki/Market_economy" title="Market economy">market economy</a>,<sup id="cite_ref-200"><a href="#cite_note-200">[193]</a></sup> ranked 16th in the 2018 <a href="http://fakehost/wiki/Human_Development_Index" title="Human Development Index">Human Development Index</a><sup id="cite_ref-HDI_12-1"><a href="#cite_note-HDI-12">[8]</a></sup> and third in the 2018 <a href="http://fakehost/wiki/Index_of_Economic_Freedom" title="Index of Economic Freedom">Index of Economic Freedom</a>.<sup id="cite_ref-201"><a href="#cite_note-201">[194]</a></sup> It is a <a href="http://fakehost/wiki/High-income_economy" title="High-income economy">high-income economy</a> with a <a href="http://fakehost/wiki/Nominal_value" title="Nominal value">nominal</a> <a href="http://fakehost/wiki/Gross_domestic_product" title="Gross domestic product">gross domestic product</a> (GDP) per capita of <a href="http://fakehost/wiki/United_States_dollar" title="United States dollar">US$</a>36,254.<sup id="cite_ref-imf2_10-4"><a href="#cite_note-imf2-10">[6]</a></sup> The currency is the <a href="http://fakehost/wiki/New_Zealand_dollar" title="New Zealand dollar">New Zealand dollar</a>, informally known as the "Kiwi dollar"; it also circulates in the Cook Islands (see <a href="http://fakehost/wiki/Cook_Islands_dollar" title="Cook Islands dollar">Cook Islands dollar</a>), Niue, Tokelau, and the <a href="http://fakehost/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a>.<sup id="cite_ref-202"><a href="#cite_note-202">[195]</a></sup>
+ </p>
+ <p>
+ Historically, extractive industries have contributed strongly to New Zealand's economy, focussing at different times on sealing, whaling, <a href="http://fakehost/wiki/Phormium" title="Phormium">flax</a>, gold, <a href="http://fakehost/wiki/Kauri_gum" title="Kauri gum">kauri gum</a>, and native timber.<sup id="cite_ref-RWT_export_evolution_203-0"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> The first shipment of refrigerated meat on the <i><a href="http://fakehost/wiki/Dunedin_(ship)" title="Dunedin (ship)">Dunedin</a></i> in 1882 led to the establishment of meat and dairy exports to Britain, a trade which provided the basis for strong economic growth in New Zealand.<sup id="cite_ref-204"><a href="#cite_note-204">[197]</a></sup> High demand for agricultural products from the United Kingdom and the United States helped New Zealanders achieve higher living standards than both Australia and Western Europe in the 1950s and 1960s.<sup id="cite_ref-205"><a href="#cite_note-205">[198]</a></sup> In 1973, New Zealand's export market was reduced when the United Kingdom joined the <a href="http://fakehost/wiki/European_Economic_Community" title="European Economic Community">European Economic Community</a><sup id="cite_ref-206"><a href="#cite_note-206">[199]</a></sup> and other compounding factors, such as the <a href="http://fakehost/wiki/1973_oil_crisis" title="1973 oil crisis">1973 oil</a> and <a href="http://fakehost/wiki/1979_oil_crisis" title="1979 oil crisis">1979 energy</a> crises, led to a severe <a href="http://fakehost/wiki/Depression_(economics)" title="Depression (economics)">economic depression</a>.<sup id="cite_ref-207"><a href="#cite_note-207">[200]</a></sup> Living standards in New Zealand fell behind those of Australia and Western Europe, and by 1982 New Zealand had the lowest per-capita income of all the developed nations surveyed by <a href="http://fakehost/wiki/World_Bank_Group" title="World Bank Group">the World Bank</a>.<sup id="cite_ref-208"><a href="#cite_note-208">[201]</a></sup> In the mid-1980s New Zealand deregulated its <a href="http://fakehost/wiki/Agriculture_in_New_Zealand" title="Agriculture in New Zealand">agricultural sector</a> by phasing out <a href="http://fakehost/wiki/Agricultural_subsidy" title="Agricultural subsidy">subsidies</a> over a three-year period.<sup id="cite_ref-209"><a href="#cite_note-209">[202]</a></sup><sup id="cite_ref-210"><a href="#cite_note-210">[203]</a></sup> Since 1984, successive governments engaged in major <a href="http://fakehost/wiki/Macroeconomic" title="Macroeconomic">macroeconomic</a> restructuring (known first as <a href="http://fakehost/wiki/Rogernomics" title="Rogernomics">Rogernomics</a> and then <a href="http://fakehost/wiki/Ruthanasia" title="Ruthanasia">Ruthanasia</a>), rapidly transforming New Zealand from a <a href="http://fakehost/wiki/Protectionism" title="Protectionism">protected</a> and highly regulated economy to a liberalised <a href="http://fakehost/wiki/Free-trade" title="Free-trade">free-trade</a> economy.<sup id="cite_ref-Liberalisation_211-0"><a href="#cite_note-Liberalisation-211">[204]</a></sup><sup id="cite_ref-212"><a href="#cite_note-212">[205]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:MilfordSound.jpg"><img alt="Blue water against a backdrop of snow-capped mountains" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/220px-MilfordSound.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/330px-MilfordSound.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/440px-MilfordSound.jpg 2x" data-file-width="2048" data-file-height="1364"></a></p><div>
+ <p><a href="http://fakehost/wiki/Milford_Sound" title="Milford Sound">Milford Sound</a> is one of New Zealand's most famous tourist destinations.<sup id="cite_ref-213"><a href="#cite_note-213">[206]</a></sup>
+ </p></div>
+ </div>
+ <p>
+ Unemployment peaked above 10% in 1991 and 1992,<sup id="cite_ref-unemployment_214-0"><a href="#cite_note-unemployment-214">[207]</a></sup> following the <a href="http://fakehost/wiki/Black_Monday_(1987)" title="Black Monday (1987)">1987 share market crash</a>, but eventually fell to a record low (since 1986) of 3.7% in 2007 (ranking third from twenty-seven comparable OECD nations).<sup id="cite_ref-unemployment_214-1"><a href="#cite_note-unemployment-214">[207]</a></sup> However, the <a href="http://fakehost/wiki/Financial_crisis_of_2007%E2%80%932008" title="Financial crisis of 2007–2008">global financial crisis</a> that followed had a major impact on New Zealand, with the GDP shrinking for five consecutive quarters, the longest recession in over thirty years,<sup id="cite_ref-215"><a href="#cite_note-215">[208]</a></sup><sup id="cite_ref-216"><a href="#cite_note-216">[209]</a></sup> and unemployment rising back to 7% in late 2009.<sup id="cite_ref-217"><a href="#cite_note-217">[210]</a></sup> Unemployment rates for different age groups follow similar trends, but are consistently higher among youth. In the December 2014 quarter, the general unemployment rate was around 5.8%, while the unemployment rate for youth aged 15 to 21 was 15.6%.<sup id="cite_ref-unemployment_214-2"><a href="#cite_note-unemployment-214">[207]</a></sup> New Zealand has experienced a series of "<a href="http://fakehost/wiki/Brain_drain" title="Brain drain">brain drains</a>" since the 1970s<sup id="cite_ref-218"><a href="#cite_note-218">[211]</a></sup> that still continue today.<sup id="cite_ref-219"><a href="#cite_note-219">[212]</a></sup> Nearly one quarter of highly skilled workers live overseas, mostly in Australia and Britain, which is the largest proportion from any developed nation.<sup id="cite_ref-220"><a href="#cite_note-220">[213]</a></sup> In recent decades, however, a "brain gain" has brought in educated professionals from Europe and less developed countries.<sup id="cite_ref-221"><a href="#cite_note-221">[214]</a></sup><sup id="cite_ref-FOOTNOTEBain200644_222-0"><a href="#cite_note-FOOTNOTEBain200644-222">[215]</a></sup> Today New Zealand's economy benefits from a high level of <a href="http://fakehost/wiki/Innovation" title="Innovation">innovation</a>.<sup id="cite_ref-223"><a href="#cite_note-223">[216]</a></sup>
+ </p>
+ <h3>
+ <span id="Trade">Trade</span>
+ </h3>
+ <p>
+ New Zealand is heavily dependent on international trade,<sup id="cite_ref-224"><a href="#cite_note-224">[217]</a></sup> particularly in agricultural products.<sup id="cite_ref-225"><a href="#cite_note-225">[218]</a></sup> Exports account for 24% of its output,<sup id="cite_ref-CIA_150-1"><a href="#cite_note-CIA-150">[143]</a></sup> making New Zealand vulnerable to international commodity prices and global <a href="http://fakehost/wiki/Recession" title="Recession">economic slowdowns</a>. Food products made up 55% of the value of all the country's exports in 2014; wood was the second largest earner (7%).<sup id="cite_ref-226"><a href="#cite_note-226">[219]</a></sup> New Zealand's main trading partners, as at June 2018, are China (<a href="http://fakehost/wiki/NZ$" title="NZ$">NZ$</a>27.8b), Australia ($26.2b), the <a href="http://fakehost/wiki/European_Union" title="European Union">European Union</a> ($22.9b), the United States ($17.6b), and Japan ($8.4b).<sup id="cite_ref-GSTC_StatNZ_227-0"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> On 7 April 2008, New Zealand and China signed the <a href="http://fakehost/wiki/New_Zealand%E2%80%93China_Free_Trade_Agreement" title="New Zealand–China Free Trade Agreement">New Zealand–China Free Trade Agreement</a>, the first such agreement China has signed with a developed country.<sup id="cite_ref-228"><a href="#cite_note-228">[221]</a></sup> The service sector is the largest sector in the economy, followed by manufacturing and construction and then farming and raw material extraction.<sup id="cite_ref-CIA_150-2"><a href="#cite_note-CIA-150">[143]</a></sup> <a href="http://fakehost/wiki/Tourism_in_New_Zealand" title="Tourism in New Zealand">Tourism</a> plays a significant role in the economy, contributing $12.9 billion (or 5.6%) to New Zealand's total GDP and supporting 7.5% of the total workforce in 2016.<sup id="cite_ref-TourismStats_229-0"><a href="#cite_note-TourismStats-229">[222]</a></sup> International visitor arrivals are expected to increase at a rate of 5.4% annually up to 2022.<sup id="cite_ref-TourismStats_229-1"><a href="#cite_note-TourismStats-229">[222]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Fauna_de_Nueva_Zelanda07.JPG"><img alt="A Romney ewe with her two lambs" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/220px-Fauna_de_Nueva_Zelanda07.JPG" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/330px-Fauna_de_Nueva_Zelanda07.JPG 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/440px-Fauna_de_Nueva_Zelanda07.JPG 2x" data-file-width="3888" data-file-height="2592"></a></p><div>
+ <p>Wool has historically been one of New Zealand's major exports.
+ </p></div>
+ </div>
+ <p>
+ Wool was New Zealand's major agricultural export during the late 19th century.<sup id="cite_ref-RWT_export_evolution_203-1"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> Even as late as the 1960s it made up over a third of all export revenues,<sup id="cite_ref-RWT_export_evolution_203-2"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> but since then its price has steadily dropped relative to other commodities<sup id="cite_ref-230"><a href="#cite_note-230">[223]</a></sup> and wool is no longer profitable for many farmers.<sup id="cite_ref-231"><a href="#cite_note-231">[224]</a></sup> In contrast <a href="http://fakehost/wiki/Dairy_farming_in_New_Zealand" title="Dairy farming in New Zealand">dairy farming</a> increased, with the number of dairy cows doubling between 1990 and 2007,<sup id="cite_ref-232"><a href="#cite_note-232">[225]</a></sup> to become New Zealand's largest export earner.<sup id="cite_ref-233"><a href="#cite_note-233">[226]</a></sup> In the year to June 2018, dairy products accounted for 17.7% ($14.1 billion) of total exports,<sup id="cite_ref-GSTC_StatNZ_227-1"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> and the country's largest company, <a href="http://fakehost/wiki/Fonterra" title="Fonterra">Fonterra</a>, controls almost one-third of the international dairy trade.<sup id="cite_ref-234"><a href="#cite_note-234">[227]</a></sup> Other exports in 2017-18 were meat (8.8%), wood and wood products (6.2%), fruit (3.6%), machinery (2.2%) and wine (2.1%).<sup id="cite_ref-GSTC_StatNZ_227-2"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> <a href="http://fakehost/wiki/New_Zealand_wine" title="New Zealand wine">New Zealand's wine</a> industry has followed a similar trend to dairy, the number of vineyards doubling over the same period,<sup id="cite_ref-235"><a href="#cite_note-235">[228]</a></sup> overtaking wool exports for the first time in 2007.<sup id="cite_ref-236"><a href="#cite_note-236">[229]</a></sup><sup id="cite_ref-237"><a href="#cite_note-237">[230]</a></sup>
+ </p>
+ <h3>
+ <span id="Infrastructure">Infrastructure</span>
+ </h3>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Air_New_Zealand,_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_(27091961041).jpg"><img alt="A mid-size jet airliner in flight. The plane livery is all-black and features a New Zealand silver fern mark." src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/220px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/330px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/440px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg 2x" data-file-width="5625" data-file-height="3750"></a></p>
+ </div>
+ <p>
+ In 2015, <a href="http://fakehost/wiki/Renewable_energy_in_New_Zealand" title="Renewable energy in New Zealand">renewable energy</a>, primarily <a href="http://fakehost/wiki/Geothermal_power_in_New_Zealand" title="Geothermal power in New Zealand">geothermal</a> and <a href="http://fakehost/wiki/Hydroelectric_power_in_New_Zealand" title="Hydroelectric power in New Zealand">hydroelectric power</a>, generated 40.1% of <a href="http://fakehost/wiki/Energy_in_New_Zealand" title="Energy in New Zealand">New Zealand's gross energy</a> supply.<sup id="cite_ref-Energy2015_238-0"><a href="#cite_note-Energy2015-238">[231]</a></sup> Geothermal power alone accounted for 22% of New Zealand's energy in 2015.<sup id="cite_ref-Energy2015_238-1"><a href="#cite_note-Energy2015-238">[231]</a></sup>
+ </p>
+ <p>
+ The provision of <a href="http://fakehost/wiki/Water_supply_and_sanitation_in_New_Zealand" title="Water supply and sanitation in New Zealand">water supply and sanitation</a> is generally of good quality. Regional authorities provide water abstraction, treatment and distribution infrastructure to most developed areas.<sup id="cite_ref-239"><a href="#cite_note-239">[232]</a></sup><sup id="cite_ref-240"><a href="#cite_note-240">[233]</a></sup>
+ </p>
+ <p>
+ <a href="http://fakehost/wiki/Transport_in_New_Zealand" title="Transport in New Zealand">New Zealand's transport</a> network comprises 94,000 kilometres (58,410&nbsp;mi) of roads, including 199 kilometres (124&nbsp;mi) of motorways,<sup id="cite_ref-241"><a href="#cite_note-241">[234]</a></sup> and 4,128 kilometres (2,565&nbsp;mi) of railway lines.<sup id="cite_ref-CIA_150-3"><a href="#cite_note-CIA-150">[143]</a></sup> Most major cities and towns are linked by bus services, although the private car is the predominant mode of transport.<sup id="cite_ref-242"><a href="#cite_note-242">[235]</a></sup> The <a href="http://fakehost/wiki/Rail_transport_in_New_Zealand" title="Rail transport in New Zealand">railways</a> were privatised in 1993, but were re-nationalised by the government in stages between 2004 and 2008. The state-owned enterprise <a href="http://fakehost/wiki/KiwiRail" title="KiwiRail">KiwiRail</a> now operates the railways, with the exception of commuter services in Auckland and Wellington which are operated by <a href="http://fakehost/wiki/Transdev_Auckland" title="Transdev Auckland">Transdev</a><sup id="cite_ref-243"><a href="#cite_note-243">[236]</a></sup> and <a href="http://fakehost/wiki/Public_transport_in_the_Wellington_Region" title="Public transport in the Wellington Region">Metlink</a>,<sup id="cite_ref-244"><a href="#cite_note-244">[237]</a></sup> respectively. Railways run the length of the country, although most lines now carry freight rather than passengers.<sup id="cite_ref-245"><a href="#cite_note-245">[238]</a></sup> Most international visitors arrive via air<sup id="cite_ref-246"><a href="#cite_note-246">[239]</a></sup> and New Zealand has <a href="http://fakehost/wiki/List_of_airports_in_New_Zealand" title="List of airports in New Zealand">six international airports</a>, but currently only the <a href="http://fakehost/wiki/Auckland_Airport" title="Auckland Airport">Auckland</a> and <a href="http://fakehost/wiki/Christchurch_International_Airport" title="Christchurch International Airport">Christchurch airports</a> connect directly with countries other than Australia or Fiji.<sup id="cite_ref-247"><a href="#cite_note-247">[240]</a></sup>
+ </p>
+ <p>
+ The <a href="http://fakehost/wiki/New_Zealand_Post_Office" title="New Zealand Post Office">New Zealand Post Office</a> had a monopoly over <a href="http://fakehost/wiki/Telecommunications_in_New_Zealand" title="Telecommunications in New Zealand">telecommunications in New Zealand</a> until 1987 when <a href="http://fakehost/wiki/Spark_New_Zealand" title="Spark New Zealand">Telecom New Zealand</a> was formed, initially as a state-owned enterprise and then privatised in 1990.<sup id="cite_ref-Wilson2010_248-0"><a href="#cite_note-Wilson2010-248">[241]</a></sup> <a href="http://fakehost/wiki/Chorus_Limited" title="Chorus Limited">Chorus</a>, which was split from Telecom (now Spark) in 2011,<sup id="cite_ref-249"><a href="#cite_note-249">[242]</a></sup> still owns the majority of the telecommunications infrastructure, but competition from other providers has increased.<sup id="cite_ref-Wilson2010_248-1"><a href="#cite_note-Wilson2010-248">[241]</a></sup> A large-scale rollout of gigabit-capable <a href="http://fakehost/wiki/Fibre_to_the_premises" title="Fibre to the premises">fibre to the premises</a>, branded as <a href="http://fakehost/wiki/Ultra-Fast_Broadband" title="Ultra-Fast Broadband">Ultra-Fast Broadband</a>, began in 2009 with a target of being available to 87% of the population by 2022.<sup id="cite_ref-250"><a href="#cite_note-250">[243]</a></sup> As of 2017, the United Nations <a href="http://fakehost/wiki/International_Telecommunication_Union" title="International Telecommunication Union">International Telecommunication Union</a> ranks New Zealand 13th in the development of information and communications infrastructure.<sup id="cite_ref-251"><a href="#cite_note-251">[244]</a></sup>
+ </p>
+ <h2>
+ <span id="Demography">Demography</span>
+ </h2>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:New_Zealandpop.svg"><img alt="Stationary population pyramid broken down into 21 age ranges." src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/280px-New_Zealandpop.svg.png" decoding="async" width="280" height="210" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/420px-New_Zealandpop.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/560px-New_Zealandpop.svg.png 2x" data-file-width="800" data-file-height="600"></a></p>
+ </div>
+ <p>
+ The <a href="http://fakehost/wiki/2013_New_Zealand_census" title="2013 New Zealand census">2013 New Zealand census</a> enumerated a resident population of 4,242,048, an increase of 5.3% over the 2006 figure.<sup id="cite_ref-252"><a href="#cite_note-252">[245]</a></sup><sup id="cite_ref-254"><a href="#cite_note-254">[n 8]</a></sup> As of September 2019, the total population has risen to an estimated 4,933,210.<sup id="cite_ref-populationestimate_9-1"><a href="#cite_note-populationestimate-9">[5]</a></sup>
+ </p>
+ <p>
+ New Zealand is a predominantly urban country, with 73.0% of the population living in the seventeen main <a href="http://fakehost/wiki/Urban_area" title="Urban area">urban areas</a> (i.e. population 30,000 or greater) and 55.1% living in the four largest cities of <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a>, <a href="http://fakehost/wiki/Christchurch" title="Christchurch">Christchurch</a>, <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a>, and <a href="http://fakehost/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>.<sup id="cite_ref-Urban_255-0"><a href="#cite_note-Urban-255">[247]</a></sup> New Zealand cities generally rank highly on international livability measures. For instance, in 2016 Auckland was ranked the world's third <a href="http://fakehost/wiki/Most_liveable_city" title="Most liveable city">most liveable city</a> and Wellington the twelfth by the <a href="http://fakehost/wiki/Mercer_Quality_of_Living_Survey" title="Mercer Quality of Living Survey">Mercer Quality of Living Survey</a>.<sup id="cite_ref-256"><a href="#cite_note-256">[248]</a></sup>
+ </p>
+ <p>
+ Life expectancy for New Zealanders in 2012 was 84 years for females, and 80.2 years for males.<sup id="cite_ref-257"><a href="#cite_note-257">[249]</a></sup> Life expectancy at birth is forecast to increase from 80 years to 85 years in 2050 and infant mortality is expected to decline.<sup id="cite_ref-UNtwspop_258-0"><a href="#cite_note-UNtwspop-258">[250]</a></sup> New Zealand's <a href="http://fakehost/wiki/Fertility_rate" title="Fertility rate">fertility rate</a> of 2.1 is relatively high for a developed country, and natural births account for a significant proportion of <a href="http://fakehost/wiki/Replacement_fertility_rate" title="Replacement fertility rate">population growth</a>. Consequently, the country has a young population compared to most industrialised nations, with 20% of New Zealanders being 14 years old or younger.<sup id="cite_ref-CIA_150-4"><a href="#cite_note-CIA-150">[143]</a></sup> In 2018 the <a href="http://fakehost/wiki/Median_age" title="Median age">median age</a> of the New Zealand population was 38.1 years.<sup id="cite_ref-259"><a href="#cite_note-259">[251]</a></sup> By 2050 the median age is projected to rise to 43 years and the percentage of people 60 years of age and older to rise from 18% to 29%.<sup id="cite_ref-UNtwspop_258-1"><a href="#cite_note-UNtwspop-258">[250]</a></sup> In 2008 the leading cause of premature death was <a href="http://fakehost/wiki/Cancer" title="Cancer">cancer</a>, at 29.8%, followed by <a href="http://fakehost/wiki/Ischaemic_heart_disease" title="Ischaemic heart disease">ischaemic heart disease</a>, 19.7%, and then <a href="http://fakehost/wiki/Cerebrovascular_disease" title="Cerebrovascular disease">cerebrovascular disease</a>, 9.2%.<sup id="cite_ref-260"><a href="#cite_note-260">[252]</a></sup> As of 2016, total expenditure on <a href="http://fakehost/wiki/Health_care_in_New_Zealand" title="Health care in New Zealand">health care</a> (including private sector spending) is 9.2% of GDP.<sup id="cite_ref-261"><a href="#cite_note-261">[253]</a></sup><br>
+ </p>
+ <table readabilityDataTable="1">
+ <tbody>
+ <tr>
+ <th colspan="10">
+
+ <div>
+ <ul>
+ <li>
+ <a href="http://fakehost/wiki/Template:Largest_cities_in_New_Zealand" title="Template:Largest cities in New Zealand"><abbr title="View this template">v</abbr></a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Template_talk:Largest_cities_in_New_Zealand" title="Template talk:Largest cities in New Zealand"><abbr title="Discuss this template">t</abbr></a>
+ </li>
+ <li>
+ <a href="https://en.wikipedia.org/w/index.php?title=Template:Largest_cities_in_New_Zealand&amp;action=edit"><abbr title="Edit this template">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div>
+ <p><span>Largest urban areas in New Zealand</span></p><div>
+ <p><a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a> June 2018 estimate (<abbr title="New Zealand Standard Areas Classification 1992">NZSAC92</abbr> boundaries)<sup id="cite_ref-NZ_population_data_262-0"><a href="#cite_note-NZ_population_data-262">[254]</a></sup>
+ </p></div>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th></th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Rank</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_cities_in_New_Zealand" title="List of cities in New Zealand">Name</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Region</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Pop.</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Rank</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_cities_in_New_Zealand" title="List of cities in New Zealand">Name</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Region</a>
+ </th>
+ <th>
+ <a href="http://fakehost/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Pop.</a>
+ </th>
+ <th></th>
+ </tr>
+ <tr>
+ <td rowspan="11">
+ <a href="http://fakehost/wiki/File:Auckland_Cbd_(217403753).jpeg" title="Auckland"><img alt="Auckland" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/120px-Auckland_Cbd_%28217403753%29.jpeg" decoding="async" width="120" height="80" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/180px-Auckland_Cbd_%28217403753%29.jpeg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/240px-Auckland_Cbd_%28217403753%29.jpeg 2x" data-file-width="2048" data-file-height="1362"></a><br>
+ <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a><br>
+ <a href="http://fakehost/wiki/File:Wellington_at_dawn.jpg" title="Wellington"><img alt="Wellington" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/120px-Wellington_at_dawn.jpg" decoding="async" width="120" height="80" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/180px-Wellington_at_dawn.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/240px-Wellington_at_dawn.jpg 2x" data-file-width="3718" data-file-height="2479"></a><br>
+ <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td>
+ 1
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Auckland_Region" title="Auckland Region">Auckland</a>
+ </td>
+ <td>
+ 1,628,900
+ </td>
+ <td>
+ 11
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Whangarei" title="Whangarei">Whangarei</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Northland_Region" title="Northland Region">Northland</a>
+ </td>
+ <td>
+ 58,800
+ </td>
+ <td rowspan="11">
+ <a href="http://fakehost/wiki/File:Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_(2).jpg" title="Christchurch"><img alt="Christchurch" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/120px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg" decoding="async" width="120" height="80" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/180px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/240px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg 2x" data-file-width="1800" data-file-height="1200"></a><br>
+ <a href="http://fakehost/wiki/Christchurch" title="Christchurch">Christchurch</a><br>
+ <a href="http://fakehost/wiki/File:HamiltonNZfromUni.jpg" title="Hamilton"><img alt="Hamilton" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/120px-HamiltonNZfromUni.jpg" decoding="async" width="120" height="85" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/180px-HamiltonNZfromUni.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/240px-HamiltonNZfromUni.jpg 2x" data-file-width="3581" data-file-height="2528"></a><br>
+ <a href="http://fakehost/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 2
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Wellington_Region" title="Wellington Region">Wellington</a>
+ </td>
+ <td>
+ 418,500
+ </td>
+ <td>
+ 12
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/New_Plymouth" title="New Plymouth">New Plymouth</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Taranaki" title="Taranaki">Taranaki</a>
+ </td>
+ <td>
+ 58,300
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 3
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Christchurch" title="Christchurch">Christchurch</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a>
+ </td>
+ <td>
+ 404,500
+ </td>
+ <td>
+ 13
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Invercargill" title="Invercargill">Invercargill</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Southland,_New_Zealand" title="Southland, New Zealand">Southland</a>
+ </td>
+ <td>
+ 51,200
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 4
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Waikato" title="Waikato">Waikato</a>
+ </td>
+ <td>
+ 241,200
+ </td>
+ <td>
+ 14
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Kapiti_Urban_Area" title="Kapiti Urban Area">Kapiti</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Wellington_Region" title="Wellington Region">Wellington</a>
+ </td>
+ <td>
+ 42,700
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 5
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Tauranga" title="Tauranga">Tauranga</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Bay_of_Plenty" title="Bay of Plenty">Bay of Plenty</a>
+ </td>
+ <td>
+ 141,600
+ </td>
+ <td>
+ 15
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Whanganui" title="Whanganui">Whanganui</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Manawatu-Wanganui" title="Manawatu-Wanganui">Manawatu-Wanganui</a>
+ </td>
+ <td>
+ 40,900
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 6
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Napier-Hastings_Urban_Area" title="Napier-Hastings Urban Area">Napier-Hastings</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Hawke%27s_Bay_Region" title="Hawke's Bay Region">Hawke's Bay</a>
+ </td>
+ <td>
+ 134,500
+ </td>
+ <td>
+ 16
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Gisborne,_New_Zealand" title="Gisborne, New Zealand">Gisborne</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Gisborne_Region" title="Gisborne Region">Gisborne</a>
+ </td>
+ <td>
+ 37,200
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 7
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Dunedin" title="Dunedin">Dunedin</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Otago" title="Otago">Otago</a>
+ </td>
+ <td>
+ 122,000
+ </td>
+ <td>
+ 17
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Blenheim,_New_Zealand" title="Blenheim, New Zealand">Blenheim</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Marlborough_Region" title="Marlborough Region">Marlborough</a>
+ </td>
+ <td>
+ 31,600
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 8
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Palmerston_North" title="Palmerston North">Palmerston North</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Manawatu-Wanganui" title="Manawatu-Wanganui">Manawatu-Wanganui</a>
+ </td>
+ <td>
+ 86,600
+ </td>
+ <td>
+ 18
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Pukekohe" title="Pukekohe">Pukekohe</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Auckland_Region" title="Auckland Region">Auckland</a>
+ </td>
+ <td>
+ 31,400
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 9
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Nelson,_New_Zealand" title="Nelson, New Zealand">Nelson</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Nelson_Region" title="Nelson Region">Nelson</a>
+ </td>
+ <td>
+ 67,500
+ </td>
+ <td>
+ 19
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Timaru" title="Timaru">Timaru</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a>
+ </td>
+ <td>
+ 29,100
+ </td>
+ </tr>
+ <tr>
+ <td>
+ 10
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Rotorua" title="Rotorua">Rotorua</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Bay_of_Plenty" title="Bay of Plenty">Bay of Plenty</a>
+ </td>
+ <td>
+ 59,500
+ </td>
+ <td>
+ 20
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Taupo" title="Taupo">Taupo</a>
+ </td>
+ <td>
+ <a href="http://fakehost/wiki/Waikato" title="Waikato">Waikato</a>
+ </td>
+ <td>
+ 24,700
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <h3>
+ <span id="Ethnicity_and_immigration">Ethnicity and immigration</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Queen_Street_Midtown_Auckland.jpg"><img alt="Pedestrians crossing a wide street which is flanked by storefronts" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/220px-Queen_Street_Midtown_Auckland.jpg" decoding="async" width="220" height="158" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/330px-Queen_Street_Midtown_Auckland.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/440px-Queen_Street_Midtown_Auckland.jpg 2x" data-file-width="841" data-file-height="604"></a></p><div>
+ <p>Pedestrians on <a href="http://fakehost/wiki/Queen_Street,_Auckland" title="Queen Street, Auckland">Queen Street</a> in Auckland, an ethnically diverse city
+ </p></div>
+ </div>
+ <p>
+ In the 2013 census, 74.0% of New Zealand residents identified ethnically as European, and 14.9% as Māori. Other major ethnic groups include <a href="http://fakehost/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asian</a> (11.8%) and Pacific peoples (7.4%), two-thirds of whom live in the <a href="http://fakehost/wiki/Auckland_Region" title="Auckland Region">Auckland Region</a>.<sup id="cite_ref-QuickStats_ethnicity_263-0"><a href="#cite_note-QuickStats_ethnicity-263">[255]</a></sup><sup id="cite_ref-ethnicity_6-1"><a href="#cite_note-ethnicity-6">[n 3]</a></sup> The population has become more diverse in recent decades: in 1961, the census reported that the population of New Zealand was 92% European and 7% Māori, with Asian and Pacific minorities sharing the remaining 1%.<sup id="cite_ref-264"><a href="#cite_note-264">[256]</a></sup>
+ </p>
+ <p>
+ While the <a href="http://fakehost/wiki/Demonym" title="Demonym">demonym</a> for a New Zealand citizen is New Zealander, the informal "<a href="http://fakehost/wiki/Kiwi_(people)" title="Kiwi (people)">Kiwi</a>" is commonly used both internationally<sup id="cite_ref-265"><a href="#cite_note-265">[257]</a></sup> and by locals.<sup id="cite_ref-266"><a href="#cite_note-266">[258]</a></sup> The Māori loanword <a href="http://fakehost/wiki/P%C4%81keh%C4%81" title="Pākehā">Pākehā</a> has been used to refer to <a href="http://fakehost/wiki/European_New_Zealanders" title="European New Zealanders">New Zealanders of European descent</a>, although others reject this appellation.<sup id="cite_ref-FOOTNOTEBain200631_267-0"><a href="#cite_note-FOOTNOTEBain200631-267">[259]</a></sup><sup id="cite_ref-268"><a href="#cite_note-268">[260]</a></sup> The word Pākehā today is increasingly used to refer to all non-Polynesian New Zealanders.<sup id="cite_ref-Pakeha_269-0"><a href="#cite_note-Pakeha-269">[261]</a></sup>
+ </p>
+ <p>
+ The Māori were the first people to reach New Zealand, followed by the early <a href="http://fakehost/wiki/P%C4%81keh%C4%81_settlers" title="Pākehā settlers">European settlers</a>. Following colonisation, immigrants were predominantly from Britain, Ireland and Australia because of restrictive policies similar to the <a href="http://fakehost/wiki/White_Australia_policy" title="White Australia policy">White Australia policy</a>.<sup id="cite_ref-270"><a href="#cite_note-270">[262]</a></sup> There was also significant Dutch, <a href="http://fakehost/wiki/Dalmatia" title="Dalmatia">Dalmatian</a>,<sup id="cite_ref-271"><a href="#cite_note-271">[263]</a></sup> German, and Italian immigration, together with indirect European immigration through Australia, North America, South America and South Africa.<sup id="cite_ref-272"><a href="#cite_note-272">[264]</a></sup><sup id="cite_ref-Immigration_history_273-0"><a href="#cite_note-Immigration_history-273">[265]</a></sup> Net migration increased after the Second World War; in the 1970s and 1980s policies were relaxed and immigration from Asia was promoted.<sup id="cite_ref-Immigration_history_273-1"><a href="#cite_note-Immigration_history-273">[265]</a></sup><sup id="cite_ref-274"><a href="#cite_note-274">[266]</a></sup> In 2009–10, an annual target of 45,000–50,000 permanent residence approvals was set by the New Zealand Immigration Service—more than one new migrant for every 100 New Zealand residents.<sup id="cite_ref-Recent_immigration_275-0"><a href="#cite_note-Recent_immigration-275">[267]</a></sup> Just over 25% of New Zealand's population was born overseas, with the majority (52%) living in the Auckland Region. The United Kingdom remains the largest source of New Zealand's overseas population, with a quarter of all overseas-born New Zealanders born there; other major sources of New Zealand's overseas-born population are China, India, Australia, South Africa, Fiji and Samoa.<sup id="cite_ref-276"><a href="#cite_note-276">[268]</a></sup> The number of fee-paying <a href="http://fakehost/wiki/International_student" title="International student">international students</a> increased sharply in the late 1990s, with more than 20,000 studying in public <a href="http://fakehost/wiki/Tertiary_education" title="Tertiary education">tertiary institutions</a> in 2002.<sup id="cite_ref-277"><a href="#cite_note-277">[269]</a></sup>
+ </p>
+ <h3>
+ <span id="Language">Language</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:TeReoMaori2013.png"><img alt="Map of New Zealand showing the percentage of people in each census area unit who speak Māori. Areas of the North Island exhibit the highest Māori proficiency." src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/220px-TeReoMaori2013.png" decoding="async" width="220" height="165" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/330px-TeReoMaori2013.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/440px-TeReoMaori2013.png 2x" data-file-width="5000" data-file-height="3759"></a></p><div>
+ <p>Speakers of Māori according to the 2013 census<sup id="cite_ref-278"><a href="#cite_note-278">[270]</a></sup></p><p><span>&nbsp;</span>&nbsp;Less than 5%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 5%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 10%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 20%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 30%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 40%
+ </p>
+ <p><span>&nbsp;</span>&nbsp;More than 50%
+ </p>
+ </div>
+ </div>
+ <p>
+ English is the predominant language in New Zealand, spoken by 96.1% of the population.<sup id="cite_ref-SpokenLanguage_279-0"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup> <a href="http://fakehost/wiki/New_Zealand_English" title="New Zealand English">New Zealand English</a> is similar to <a href="http://fakehost/wiki/Australian_English" title="Australian English">Australian English</a> and many speakers from the Northern Hemisphere are unable to tell the <a href="http://fakehost/wiki/Accent_(sociolinguistics)" title="Accent (sociolinguistics)">accents</a> apart.<sup id="cite_ref-FOOTNOTEHayMaclaganGordon200814_280-0"><a href="#cite_note-FOOTNOTEHayMaclaganGordon200814-280">[272]</a></sup> The most prominent differences between the New Zealand English dialect and other English dialects are the shifts in the short front vowels: the short-"i" sound (as in "kit") has centralised towards the <a href="http://fakehost/wiki/Schwa" title="Schwa">schwa</a> sound (the "a" in "comma" and "about"); the short-"e" sound (as in "dress") has moved towards the short-"i" sound; and the short-"a" sound (as in "trap") has moved to the short-"e" sound.<sup id="cite_ref-281"><a href="#cite_note-281">[273]</a></sup>
+ </p>
+ <p>
+ After the Second World War, Māori were discouraged from speaking their own language (<i><a href="http://fakehost/wiki/Te_reo_M%C4%81ori" title="Te reo Māori">te reo Māori</a></i>) in schools and workplaces and it existed as a community language only in a few remote areas.<sup id="cite_ref-Maori_language_282-0"><a href="#cite_note-Maori_language-282">[274]</a></sup> It has recently undergone a process of revitalisation,<sup id="cite_ref-283"><a href="#cite_note-283">[275]</a></sup> being declared one of New Zealand's official languages in 1987,<sup id="cite_ref-284"><a href="#cite_note-284">[276]</a></sup> and is spoken by 3.7% of the population.<sup id="cite_ref-SpokenLanguage_279-1"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup><sup id="cite_ref-286"><a href="#cite_note-286">[n 9]</a></sup> There are now Māori language immersion schools and two television channels that broadcast predominantly in Māori.<sup id="cite_ref-287"><a href="#cite_note-287">[278]</a></sup> <a href="http://fakehost/wiki/List_of_dual_place_names_in_New_Zealand" title="List of dual place names in New Zealand">Many places</a> have both their Māori and English names officially recognised.<sup id="cite_ref-288"><a href="#cite_note-288">[279]</a></sup>
+ </p>
+ <p>
+ As recorded in the 2013 census,<sup id="cite_ref-SpokenLanguage_279-2"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup> <a href="http://fakehost/wiki/Samoan_language" title="Samoan language">Samoan</a> is the most widely spoken non-official language (2.2%),<sup id="cite_ref-289"><a href="#cite_note-289">[n 10]</a></sup> followed by <a href="http://fakehost/wiki/Hindi" title="Hindi">Hindi</a> (1.7%), "Northern Chinese" (including <a href="http://fakehost/wiki/Mandarin_Chinese" title="Mandarin Chinese">Mandarin</a>, 1.3%) and French (1.2%). 20,235 people (0.5%) reported the ability to use <a href="http://fakehost/wiki/New_Zealand_Sign_Language" title="New Zealand Sign Language">New Zealand Sign Language</a>. It was declared one of New Zealand's official languages in 2006.<sup id="cite_ref-290"><a href="#cite_note-290">[280]</a></sup>
+ </p>
+ <h3>
+ <span id="Religion">Religion</span>
+ </h3>
+
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Ratana_Church_Raetihi.jpg"><img alt="Simple white building with two red domed towers" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/170px-Ratana_Church_Raetihi.jpg" decoding="async" width="170" height="227" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/255px-Ratana_Church_Raetihi.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/340px-Ratana_Church_Raetihi.jpg 2x" data-file-width="1624" data-file-height="2164"></a></p><div>
+ <p>A <a href="http://fakehost/wiki/R%C4%81tana" title="Rātana">Rātana</a> church on a hill near <a href="http://fakehost/wiki/Raetihi" title="Raetihi">Raetihi</a>. The two-tower construction is characteristic of Rātana buildings.
+ </p></div>
+ </div>
+ <p>
+ <a href="http://fakehost/wiki/Christianity_in_New_Zealand" title="Christianity in New Zealand">Christianity</a> is the predominant religion in New Zealand, although its society is among the most <a href="http://fakehost/wiki/Secular" title="Secular">secular</a> in the world.<sup id="cite_ref-291"><a href="#cite_note-291">[281]</a></sup><sup id="cite_ref-292"><a href="#cite_note-292">[282]</a></sup> In the 2018 census, 51.4% of the population identified with one or more religions, including 38.6% identifying as Christians. Another 48.6% indicated that they had no religion.<sup id="cite_ref-293"><a href="#cite_note-293">[n 11]</a></sup> The main Christian denominations are, by number of adherents, <a href="http://fakehost/wiki/Catholic_Church_in_New_Zealand" title="Catholic Church in New Zealand">Roman Catholicism</a> (10.1%), <a href="http://fakehost/wiki/Anglican_Church_in_Aotearoa,_New_Zealand_and_Polynesia" title="Anglican Church in Aotearoa, New Zealand and Polynesia">Anglicanism</a> (6.8%), <a href="http://fakehost/wiki/Presbyterian_Church_of_Aotearoa_New_Zealand" title="Presbyterian Church of Aotearoa New Zealand">Presbyterianism</a> (5.5%) and "Christian not further defined" (i.e. people identifying as Christian but not stating the denomination, 6.6%). The Māori-based <a href="http://fakehost/wiki/Ringat%C5%AB" title="Ringatū">Ringatū</a> and <a href="http://fakehost/wiki/R%C4%81tana" title="Rātana">Rātana</a> religions (1.3%) are also Christian in origin.<sup id="cite_ref-2013statstables_295-0"><a href="#cite_note-2013statstables-295">[284]</a></sup><sup id="cite_ref-296"><a href="#cite_note-296">[285]</a></sup> Immigration and demographic change in recent decades has contributed to the growth of minority religions,<sup id="cite_ref-297"><a href="#cite_note-297">[286]</a></sup> such as <a href="http://fakehost/wiki/Hinduism_in_New_Zealand" title="Hinduism in New Zealand">Hinduism</a> (2.6%), <a href="http://fakehost/wiki/Buddhism_in_New_Zealand" title="Buddhism in New Zealand">Buddhism</a> (1.1%), <a href="http://fakehost/wiki/Islam_in_New_Zealand" title="Islam in New Zealand">Islam</a> (1.3%) and <a href="http://fakehost/wiki/Sikhism_in_New_Zealand" title="Sikhism in New Zealand">Sikhism</a> (0.5%).<sup id="cite_ref-2013statstables_295-1"><a href="#cite_note-2013statstables-295">[284]</a></sup> The Auckland Region exhibited the greatest religious diversity.<sup id="cite_ref-2013statstables_295-2"><a href="#cite_note-2013statstables-295">[284]</a></sup>
+ </p>
+ <h3>
+ <span id="Education">Education</span>
+ </h3>
+
+ <p>
+ Primary and secondary schooling is compulsory for children aged 6 to 16, with the majority attending from the age of 5.<sup id="cite_ref-Education_Stats_298-0"><a href="#cite_note-Education_Stats-298">[287]</a></sup> There are 13 school years and attending <a href="http://fakehost/wiki/State_school" title="State school">state (public) schools</a> is free to New Zealand citizens and permanent residents from a person's 5th birthday to the end of the calendar year following their 19th birthday.<sup id="cite_ref-299"><a href="#cite_note-299">[288]</a></sup> New Zealand has an adult literacy rate of 99%,<sup id="cite_ref-CIA_150-5"><a href="#cite_note-CIA-150">[143]</a></sup> and over half of the population aged 15 to 29 hold a tertiary qualification.<sup id="cite_ref-Education_Stats_298-1"><a href="#cite_note-Education_Stats-298">[287]</a></sup> There are five types of government-owned tertiary institutions: universities, colleges of education, <a href="http://fakehost/wiki/Institute_of_technology#New_Zealand" title="Institute of technology">polytechnics</a>, specialist colleges, and <a href="http://fakehost/wiki/W%C4%81nanga" title="Wānanga">wānanga</a>,<sup id="cite_ref-EducationAct1989_300-0"><a href="#cite_note-EducationAct1989-300">[289]</a></sup> in addition to private training establishments.<sup id="cite_ref-NZQA_301-0"><a href="#cite_note-NZQA-301">[290]</a></sup> In the adult population 14.2% have a <a href="http://fakehost/wiki/Bachelor%27s_degree" title="Bachelor's degree">bachelor's degree</a> or higher, 30.4% have some form of secondary qualification as their highest qualification and 22.4% have no formal qualification.<sup id="cite_ref-TertiaryEdStats_302-0"><a href="#cite_note-TertiaryEdStats-302">[291]</a></sup> The OECD's <a href="http://fakehost/wiki/Programme_for_International_Student_Assessment" title="Programme for International Student Assessment">Programme for International Student Assessment</a> ranks New Zealand's education system as the seventh best in the world, with students performing exceptionally well in reading, mathematics and science.<sup id="cite_ref-303"><a href="#cite_note-303">[292]</a></sup>
+ </p>
+
+ <h2>
+ <span id="Culture">Culture</span>
+ </h2>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:KupeWheke.jpg" title="Use the scrollbar to see the full image."><img alt="Tall wooden carving showing Kupe above two tentacled sea creatures" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/150px-KupeWheke.jpg" decoding="async" width="150" height="605" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/225px-KupeWheke.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/300px-KupeWheke.jpg 2x" data-file-width="389" data-file-height="1570"></a>
+ </p>
+ <div>
+ <p>Late 20th-century house-post depicting the navigator <a href="http://fakehost/wiki/Kupe" title="Kupe">Kupe</a> fighting two sea creatures
+ </p></div>
+ </div>
+ <p>
+ Early Māori adapted the tropically based east <a href="http://fakehost/wiki/Polynesian_culture" title="Polynesian culture">Polynesian culture</a> in line with the challenges associated with a larger and more diverse environment, eventually developing their own distinctive culture. Social organisation was largely communal with families (<i><a href="http://fakehost/wiki/Wh%C4%81nau" title="Whānau">whānau</a></i>), subtribes (<i>hapū</i>) and tribes (<i>iwi</i>) ruled by a chief (<i><a href="http://fakehost/wiki/Rangatira" title="Rangatira">rangatira</a></i>), whose position was subject to the community's approval.<sup id="cite_ref-FOOTNOTEKennedy2007398_304-0"><a href="#cite_note-FOOTNOTEKennedy2007398-304">[293]</a></sup> The British and Irish immigrants brought aspects of their own culture to New Zealand and also influenced Māori culture,<sup id="cite_ref-305"><a href="#cite_note-305">[294]</a></sup><sup id="cite_ref-306"><a href="#cite_note-306">[295]</a></sup> particularly with the introduction of Christianity.<sup id="cite_ref-307"><a href="#cite_note-307">[296]</a></sup> However, Māori still regard their allegiance to tribal groups as a vital part of <a href="http://fakehost/wiki/Cultural_identity" title="Cultural identity">their identity</a>, and Māori kinship roles resemble <a href="http://fakehost/wiki/Hawaiian_kinship" title="Hawaiian kinship">those of other Polynesian peoples</a>.<sup id="cite_ref-308"><a href="#cite_note-308">[297]</a></sup> More recently <a href="http://fakehost/wiki/Culture_of_the_United_States" title="Culture of the United States">American</a>, <a href="http://fakehost/wiki/Culture_of_Australia" title="Culture of Australia">Australian</a>, <a href="http://fakehost/wiki/Culture_of_Asia" title="Culture of Asia">Asian</a> and other <a href="http://fakehost/wiki/Culture_of_Europe" title="Culture of Europe">European cultures</a> have exerted influence on New Zealand. Non-Māori Polynesian cultures are also apparent, with <a href="http://fakehost/wiki/Pasifika_Festival" title="Pasifika Festival">Pasifika</a>, the world's largest Polynesian festival, now an annual event in Auckland.<sup id="cite_ref-309"><a href="#cite_note-309">[298]</a></sup>
+ </p>
+ <p>
+ The largely rural life in early New Zealand led to the image of New Zealanders being rugged, industrious problem solvers.<sup id="cite_ref-FOOTNOTEKennedy2007400_310-0"><a href="#cite_note-FOOTNOTEKennedy2007400-310">[299]</a></sup> Modesty was expected and enforced through the "<a href="http://fakehost/wiki/Tall_poppy_syndrome" title="Tall poppy syndrome">tall poppy syndrome</a>", where high achievers received harsh criticism.<sup id="cite_ref-FOOTNOTEKennedy2007399_311-0"><a href="#cite_note-FOOTNOTEKennedy2007399-311">[300]</a></sup> At the time New Zealand was not known as an intellectual country.<sup id="cite_ref-312"><a href="#cite_note-312">[301]</a></sup> From the early 20th century until the late 1960s, Māori culture was suppressed by the attempted <a href="http://fakehost/wiki/Forced_assimilation" title="Forced assimilation">assimilation</a> of Māori into British New Zealanders.<sup id="cite_ref-Maori_language_282-1"><a href="#cite_note-Maori_language-282">[274]</a></sup> In the 1960s, as tertiary education became more available and <a href="http://fakehost/wiki/Urbanization" title="Urbanization">cities expanded</a><sup id="cite_ref-313"><a href="#cite_note-313">[302]</a></sup> urban culture began to dominate.<sup id="cite_ref-314"><a href="#cite_note-314">[303]</a></sup> However, rural imagery and themes are common in New Zealand's art, literature and media.<sup id="cite_ref-315"><a href="#cite_note-315">[304]</a></sup>
+ </p>
+ <p>
+ <a href="http://fakehost/wiki/National_symbols_of_New_Zealand" title="National symbols of New Zealand">New Zealand's national symbols</a> are influenced by natural, historical, and Māori sources. The <a href="http://fakehost/wiki/Silver_fern" title="Silver fern">silver fern</a> is an emblem appearing on army insignia and sporting team uniforms.<sup id="cite_ref-Wilson2016_316-0"><a href="#cite_note-Wilson2016-316">[305]</a></sup> Certain items of popular culture thought to be unique to New Zealand are called "<a href="http://fakehost/wiki/Kiwiana" title="Kiwiana">Kiwiana</a>".<sup id="cite_ref-Wilson2016_316-1"><a href="#cite_note-Wilson2016-316">[305]</a></sup>
+ </p>
+ <h3>
+ <span id="Art">Art</span>
+ </h3>
+
+ <p>
+ As part of the resurgence of Māori culture, the traditional crafts of carving and weaving are now more widely practised and Māori artists are increasing in number and influence.<sup id="cite_ref-Creative_317-0"><a href="#cite_note-Creative-317">[306]</a></sup> Most Māori carvings feature human figures, generally with three fingers and either a natural-looking, detailed head or a grotesque head.<sup id="cite_ref-318"><a href="#cite_note-318">[307]</a></sup> Surface patterns consisting of spirals, ridges, notches and fish scales decorate most carvings.<sup id="cite_ref-319"><a href="#cite_note-319">[308]</a></sup> The pre-eminent Māori architecture consisted of carved meeting houses (<i><a href="http://fakehost/wiki/Wharenui" title="Wharenui">wharenui</a></i>) decorated with symbolic carvings and illustrations. These buildings were originally designed to be constantly rebuilt, changing and adapting to different whims or needs.<sup id="cite_ref-320"><a href="#cite_note-320">[309]</a></sup>
+ </p>
+ <p>
+ Māori decorated the white wood of buildings, canoes and cenotaphs using red (a mixture of red <a href="http://fakehost/wiki/Ochre" title="Ochre">ochre</a> and shark fat) and black (made from soot) paint and painted pictures of birds, reptiles and other designs on cave walls.<sup id="cite_ref-321"><a href="#cite_note-321">[310]</a></sup> Māori tattoos (<i><a href="http://fakehost/wiki/T%C4%81_moko" title="Tā moko">moko</a></i>) consisting of coloured soot mixed with gum were cut into the flesh with a bone chisel.<sup id="cite_ref-322"><a href="#cite_note-322">[311]</a></sup> Since European arrival paintings and photographs have been dominated by landscapes, originally not as works of art but as factual portrayals of New Zealand.<sup id="cite_ref-beginnings_323-0"><a href="#cite_note-beginnings-323">[312]</a></sup> Portraits of Māori were also common, with early painters often portraying them as "<a href="http://fakehost/wiki/Noble_savage" title="Noble savage">noble savages</a>", exotic beauties or friendly natives.<sup id="cite_ref-beginnings_323-1"><a href="#cite_note-beginnings-323">[312]</a></sup> The country's isolation delayed the influence of European artistic trends allowing local artists to develop their own distinctive style of <a href="http://fakehost/wiki/Regionalism_(art)" title="Regionalism (art)">regionalism</a>.<sup id="cite_ref-324"><a href="#cite_note-324">[313]</a></sup> During the 1960s and 1970s many artists combined traditional Māori and Western techniques, creating unique art forms.<sup id="cite_ref-325"><a href="#cite_note-325">[314]</a></sup> New Zealand art and craft has gradually achieved an international audience, with exhibitions in the <a href="http://fakehost/wiki/Venice_Biennale" title="Venice Biennale">Venice Biennale</a> in 2001 and the "Paradise Now" exhibition in New York in 2004.<sup id="cite_ref-Creative_317-1"><a href="#cite_note-Creative-317">[306]</a></sup><sup id="cite_ref-326"><a href="#cite_note-326">[315]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Hinepare.jpg"><img alt="Refer to caption" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/170px-Hinepare.jpg" decoding="async" width="170" height="218" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/255px-Hinepare.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/340px-Hinepare.jpg 2x" data-file-width="545" data-file-height="700"></a></p>
+ </div>
+ <p>
+ Māori cloaks are made of fine flax fibre and patterned with black, red and white triangles, diamonds and other geometric shapes.<sup id="cite_ref-327"><a href="#cite_note-327">[316]</a></sup> <a href="http://fakehost/wiki/Pounamu" title="Pounamu">Greenstone</a> was fashioned into earrings and necklaces, with the most well-known design being the <a href="http://fakehost/wiki/Hei-tiki" title="Hei-tiki">hei-tiki</a>, a distorted human figure sitting cross-legged with its head tilted to the side.<sup id="cite_ref-328"><a href="#cite_note-328">[317]</a></sup> Europeans brought English fashion etiquette to New Zealand, and until the 1950s most people dressed up for social occasions.<sup id="cite_ref-329"><a href="#cite_note-329">[318]</a></sup> Standards have since relaxed and New Zealand fashion has received a reputation for being casual, practical and lacklustre.<sup id="cite_ref-330"><a href="#cite_note-330">[319]</a></sup><sup id="cite_ref-The_Economist_print_edition_331-0"><a href="#cite_note-The_Economist_print_edition-331">[320]</a></sup> However, the local fashion industry has grown significantly since 2000, doubling exports and increasing from a handful to about 50 established labels, with some labels gaining international recognition.<sup id="cite_ref-The_Economist_print_edition_331-1"><a href="#cite_note-The_Economist_print_edition-331">[320]</a></sup>
+ </p>
+ <h3>
+ <span id="Literature">Literature</span>
+ </h3>
+
+ <p>
+ Māori quickly adopted writing as a means of sharing ideas, and many of their oral stories and poems were converted to the written form.<sup id="cite_ref-332"><a href="#cite_note-332">[321]</a></sup> Most early English literature was obtained from Britain and it was not until the 1950s when local publishing outlets increased that New Zealand literature started to become widely known.<sup id="cite_ref-333"><a href="#cite_note-333">[322]</a></sup> Although still largely influenced by global trends (<a href="http://fakehost/wiki/Literary_modernism" title="Literary modernism">modernism</a>) and events (the Great Depression), writers in the 1930s began to develop stories increasingly focused on their experiences in New Zealand. During this period literature changed from a <a href="http://fakehost/wiki/Journalism" title="Journalism">journalistic</a> activity to a more academic pursuit.<sup id="cite_ref-334"><a href="#cite_note-334">[323]</a></sup> Participation in the world wars gave some New Zealand writers a new perspective on New Zealand culture and with the post-war expansion of universities local literature flourished.<sup id="cite_ref-335"><a href="#cite_note-335">[324]</a></sup> Dunedin is a UNESCO <a href="http://fakehost/wiki/City_of_Literature" title="City of Literature">City of Literature</a>.<sup id="cite_ref-336"><a href="#cite_note-336">[325]</a></sup>
+ </p>
+ <h3>
+ <span id="Media_and_entertainment">Media and entertainment</span>
+ </h3>
+
+ <p>
+ New Zealand music has been influenced by <a href="http://fakehost/wiki/Blues" title="Blues">blues</a>, <a href="http://fakehost/wiki/Jazz" title="Jazz">jazz</a>, <a href="http://fakehost/wiki/Country_music" title="Country music">country</a>, <a href="http://fakehost/wiki/Rock_and_roll" title="Rock and roll">rock and roll</a> and <a href="http://fakehost/wiki/Hip_hop_music" title="Hip hop music">hip hop</a>, with many of these genres given a unique New Zealand interpretation.<sup id="cite_ref-music_337-0"><a href="#cite_note-music-337">[326]</a></sup> Māori developed traditional chants and songs from their ancient Southeast Asian origins, and after centuries of isolation created a unique "monotonous" and "<a href="https://en.wiktionary.org/wiki/doleful" title="wikt:doleful">doleful</a>" sound.<sup id="cite_ref-338"><a href="#cite_note-338">[327]</a></sup> Flutes and trumpets were used as musical instruments<sup id="cite_ref-339"><a href="#cite_note-339">[328]</a></sup> or as signalling devices during war or special occasions.<sup id="cite_ref-340"><a href="#cite_note-340">[329]</a></sup> Early settlers brought over their ethnic music, with <a href="http://fakehost/wiki/Brass_band" title="Brass band">brass bands</a> and <a href="http://fakehost/wiki/Choir" title="Choir">choral music</a> being popular, and musicians began touring New Zealand in the 1860s.<sup id="cite_ref-341"><a href="#cite_note-341">[330]</a></sup><sup id="cite_ref-342"><a href="#cite_note-342">[331]</a></sup> <a href="http://fakehost/wiki/Pipe_band" title="Pipe band">Pipe bands</a> became widespread during the early 20th century.<sup id="cite_ref-343"><a href="#cite_note-343">[332]</a></sup> The New Zealand recording industry began to develop from 1940 onwards and many New Zealand musicians have obtained success in Britain and the United States.<sup id="cite_ref-music_337-1"><a href="#cite_note-music-337">[326]</a></sup> Some artists release Māori language songs and the Māori tradition-based art of <i><a href="http://fakehost/wiki/Kapa_haka" title="Kapa haka">kapa haka</a></i> (song and dance) has made a resurgence.<sup id="cite_ref-344"><a href="#cite_note-344">[333]</a></sup> The <a href="http://fakehost/wiki/New_Zealand_Music_Awards" title="New Zealand Music Awards">New Zealand Music Awards</a> are held annually by <a href="http://fakehost/wiki/Recorded_Music_NZ" title="Recorded Music NZ">Recorded Music NZ</a>; the awards were first held in 1965 by <a href="http://fakehost/wiki/Reckitt_%26_Colman" title="Reckitt &amp; Colman">Reckitt &amp; Colman</a> as the <a href="http://fakehost/wiki/Loxene_Golden_Disc" title="Loxene Golden Disc">Loxene Golden Disc</a> awards.<sup id="cite_ref-345"><a href="#cite_note-345">[334]</a></sup> Recorded Music NZ also publishes the country's <a href="http://fakehost/wiki/Official_New_Zealand_Music_Chart" title="Official New Zealand Music Chart">official weekly record charts</a>.<sup id="cite_ref-346"><a href="#cite_note-346">[335]</a></sup>
+ </p>
+ <div>
+ <p><a href="http://fakehost/wiki/File:Hobbit_holes_reflected_in_water.jpg"><img alt="Hills with inset, round doors. Reflected in water." src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/220px-Hobbit_holes_reflected_in_water.jpg" decoding="async" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/330px-Hobbit_holes_reflected_in_water.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/440px-Hobbit_holes_reflected_in_water.jpg 2x" data-file-width="5184" data-file-height="3456"></a></p>
+ </div>
+ <p>
+ Public <a href="http://fakehost/wiki/Radio_in_New_Zealand" title="Radio in New Zealand">radio</a> was introduced in New Zealand in 1922.<sup id="cite_ref-348"><a href="#cite_note-348">[337]</a></sup> A state-owned <a href="http://fakehost/wiki/Television_in_New_Zealand" title="Television in New Zealand">television service</a> began in 1960.<sup id="cite_ref-349"><a href="#cite_note-349">[338]</a></sup> Deregulation in the 1980s saw a sudden increase in the numbers of radio and television stations.<sup id="cite_ref-NZ_TV_350-0"><a href="#cite_note-NZ_TV-350">[339]</a></sup> New Zealand television primarily broadcasts American and British programming, along with a large number of Australian and local shows.<sup id="cite_ref-351"><a href="#cite_note-351">[340]</a></sup> The number of <a href="http://fakehost/wiki/List_of_New_Zealand_films" title="List of New Zealand films">New Zealand films</a> significantly increased during the 1970s. In 1978 the <a href="http://fakehost/wiki/New_Zealand_Film_Commission" title="New Zealand Film Commission">New Zealand Film Commission</a> started assisting local film-makers and many films attained a world audience, some receiving international acknowledgement.<sup id="cite_ref-NZ_TV_350-1"><a href="#cite_note-NZ_TV-350">[339]</a></sup> The highest-grossing New Zealand films are <i><a href="http://fakehost/wiki/Hunt_for_the_Wilderpeople" title="Hunt for the Wilderpeople">Hunt for the Wilderpeople</a></i>, <i><a href="http://fakehost/wiki/Boy_(2010_film)" title="Boy (2010 film)">Boy</a></i>, <i><a href="http://fakehost/wiki/The_World%27s_Fastest_Indian" title="The World's Fastest Indian">The World's Fastest Indian</a></i>, <i><a href="http://fakehost/wiki/Once_Were_Warriors_(film)" title="Once Were Warriors (film)">Once Were Warriors</a></i> and <i><a href="http://fakehost/wiki/Whale_Rider" title="Whale Rider">Whale Rider</a></i>.<sup id="cite_ref-352"><a href="#cite_note-352">[341]</a></sup> The country's diverse scenery and compact size, plus government incentives,<sup id="cite_ref-353"><a href="#cite_note-353">[342]</a></sup> have encouraged some <a href="http://fakehost/wiki/Film_producer" title="Film producer">producers</a> to shoot big-budget productions in New Zealand, including <i><a href="http://fakehost/wiki/Avatar_(2009_film)" title="Avatar (2009 film)">Avatar</a></i>, <i><a href="http://fakehost/wiki/The_Lord_of_the_Rings_(film_series)" title="The Lord of the Rings (film series)">The Lord of the Rings</a></i>, <i><a href="http://fakehost/wiki/The_Hobbit_(film_series)" title="The Hobbit (film series)">The Hobbit</a></i>, <i><a href="http://fakehost/wiki/The_Chronicles_of_Narnia_(film_series)" title="The Chronicles of Narnia (film series)">The Chronicles of Narnia</a></i>, <i><a href="http://fakehost/wiki/King_Kong_(2005_film)" title="King Kong (2005 film)">King Kong</a></i> and <i><a href="http://fakehost/wiki/The_Last_Samurai" title="The Last Samurai">The Last Samurai</a></i>.<sup id="cite_ref-354"><a href="#cite_note-354">[343]</a></sup> The New Zealand media industry is dominated by a small number of companies, most of which are foreign-owned, although the <a href="http://fakehost/wiki/Crown_entity" title="Crown entity">state retains ownership</a> of some television and radio stations.<sup id="cite_ref-355"><a href="#cite_note-355">[344]</a></sup> Since 1994, <a href="http://fakehost/wiki/Freedom_House" title="Freedom House">Freedom House</a> has consistently ranked New Zealand's press freedom in the top twenty, with the 19th freest media in 2015.<sup id="cite_ref-356"><a href="#cite_note-356">[345]</a></sup>
+ </p>
+
+ <h3>
+ <span id="Sports">Sports</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Haka_2006.jpg"><img alt="Rugby team wearing all black, facing the camera, knees bent, and facing toward a team wearing white" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/220px-Haka_2006.jpg" decoding="async" width="220" height="146" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/330px-Haka_2006.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/440px-Haka_2006.jpg 2x" data-file-width="3008" data-file-height="2000"></a></p>
+ </div>
+ <p>
+ Most of the major sporting codes played in New Zealand have British origins.<sup id="cite_ref-357"><a href="#cite_note-357">[346]</a></sup> <a href="http://fakehost/wiki/Rugby_union" title="Rugby union">Rugby union</a> is considered the <a href="http://fakehost/wiki/National_sport" title="National sport">national sport</a><sup id="cite_ref-358"><a href="#cite_note-358">[347]</a></sup> and attracts the most spectators.<sup id="cite_ref-Organised_Sport_359-0"><a href="#cite_note-Organised_Sport-359">[348]</a></sup> <a href="http://fakehost/wiki/Golf" title="Golf">Golf</a>, <a href="http://fakehost/wiki/Netball" title="Netball">netball</a>, <a href="http://fakehost/wiki/Tennis" title="Tennis">tennis</a> and <a href="http://fakehost/wiki/Cricket" title="Cricket">cricket</a> have the highest rates of adult participation, while netball, rugby union and <a href="http://fakehost/wiki/Association_football" title="Association football">football (soccer)</a> are particularly popular among young people.<sup id="cite_ref-Organised_Sport_359-1"><a href="#cite_note-Organised_Sport-359">[348]</a></sup><sup id="cite_ref-nzsssc_360-0"><a href="#cite_note-nzsssc-360">[349]</a></sup> Around 54% of New Zealand adolescents participate in sports for their school.<sup id="cite_ref-nzsssc_360-1"><a href="#cite_note-nzsssc-360">[349]</a></sup> Victorious rugby tours to Australia and the United Kingdom in the <a href="http://fakehost/wiki/1888%E2%80%9389_New_Zealand_Native_football_team" title="1888–89 New Zealand Native football team">late 1880s</a> and the <a href="http://fakehost/wiki/The_Original_All_Blacks" title="The Original All Blacks">early 1900s</a> played an early role in instilling a national identity.<sup id="cite_ref-361"><a href="#cite_note-361">[350]</a></sup> <a href="http://fakehost/wiki/Horseracing_in_New_Zealand" title="Horseracing in New Zealand">Horseracing</a> was also a popular <a href="http://fakehost/wiki/Spectator_sport" title="Spectator sport">spectator sport</a> and became part of the "Rugby, Racing and Beer" culture during the 1960s.<sup id="cite_ref-362"><a href="#cite_note-362">[351]</a></sup> Māori participation in European sports was particularly evident in rugby and the country's team performs a <a href="http://fakehost/wiki/Haka_(sports)" title="Haka (sports)">haka</a>, a traditional Māori challenge, before international matches.<sup id="cite_ref-363"><a href="#cite_note-363">[352]</a></sup> New Zealand is known for its <a href="http://fakehost/wiki/Extreme_sport" title="Extreme sport">extreme sports</a>, <a href="http://fakehost/wiki/Adventure_travel" title="Adventure travel">adventure tourism</a><sup id="cite_ref-FOOTNOTEBain200669_364-0"><a href="#cite_note-FOOTNOTEBain200669-364">[353]</a></sup> and strong <a href="http://fakehost/wiki/Mountaineering" title="Mountaineering">mountaineering</a> tradition, as seen in the success of notable New Zealander <a href="http://fakehost/wiki/Edmund_Hillary" title="Edmund Hillary">Sir Edmund Hillary</a>.<sup id="cite_ref-365"><a href="#cite_note-365">[354]</a></sup><sup id="cite_ref-366"><a href="#cite_note-366">[355]</a></sup> Other outdoor pursuits such as <a href="http://fakehost/wiki/Cycling_in_New_Zealand" title="Cycling in New Zealand">cycling</a>, fishing, swimming, running, <a href="http://fakehost/wiki/Tramping_in_New_Zealand" title="Tramping in New Zealand">tramping</a>, canoeing, hunting, snowsports, surfing and sailing are also popular.<sup id="cite_ref-SportsParticipation_367-0"><a href="#cite_note-SportsParticipation-367">[356]</a></sup> The Polynesian sport of <a href="http://fakehost/wiki/Waka_ama" title="Waka ama">waka ama</a> racing has experienced a resurgence of interest in New Zealand since the 1980s.<sup id="cite_ref-368"><a href="#cite_note-368">[357]</a></sup>
+ </p>
+ <p>
+ New Zealand has competitive international teams in <a href="http://fakehost/wiki/New_Zealand_national_rugby_union_team" title="New Zealand national rugby union team">rugby union</a>, <a href="http://fakehost/wiki/New_Zealand_national_rugby_league_team" title="New Zealand national rugby league team">rugby league</a>, <a href="http://fakehost/wiki/New_Zealand_national_netball_team" title="New Zealand national netball team">netball</a>, <a href="http://fakehost/wiki/New_Zealand_national_cricket_team" title="New Zealand national cricket team">cricket</a>, <a href="http://fakehost/wiki/New_Zealand_men%27s_national_softball_team" title="New Zealand men's national softball team">softball</a>, and <a href="http://fakehost/wiki/Team_New_Zealand" title="Team New Zealand">sailing</a>. New Zealand participated at the <a href="http://fakehost/wiki/Summer_Olympics" title="Summer Olympics">Summer Olympics</a> in 1908 and 1912 as <a href="http://fakehost/wiki/Australasia_at_the_Olympics" title="Australasia at the Olympics">a joint team with Australia</a>, before first participating <a href="http://fakehost/wiki/New_Zealand_at_the_Olympics" title="New Zealand at the Olympics">on its own</a> in 1920.<sup id="cite_ref-369"><a href="#cite_note-369">[358]</a></sup> The country has ranked highly on a medals-to-population ratio at recent Games.<sup id="cite_ref-370"><a href="#cite_note-370">[359]</a></sup><sup id="cite_ref-371"><a href="#cite_note-371">[360]</a></sup> The "All Blacks", the national rugby union team, are the most successful in the history of international rugby<sup id="cite_ref-372"><a href="#cite_note-372">[361]</a></sup> and the reigning <a href="http://fakehost/wiki/Rugby_World_Cup" title="Rugby World Cup">World Cup</a> champions.<sup id="cite_ref-373"><a href="#cite_note-373">[362]</a></sup>
+ </p>
+ <h3>
+ <span id="Cuisine">Cuisine</span>
+ </h3>
+
+ <div>
+ <p><a href="http://fakehost/wiki/File:Hangi_ingredients.jpg"><img alt="Raw meat and vegetables" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/220px-Hangi_ingredients.jpg" decoding="async" width="220" height="123" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/330px-Hangi_ingredients.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/440px-Hangi_ingredients.jpg 2x" data-file-width="3264" data-file-height="1832"></a></p><div>
+ <p>Ingredients to be prepared for a <a href="http://fakehost/wiki/H%C4%81ngi" title="Hāngi">hāngi</a>
+ </p></div>
+ </div>
+ <p>
+ The national cuisine has been described as <a href="http://fakehost/wiki/Pacific_Rim" title="Pacific Rim">Pacific Rim</a>, incorporating the native <a href="http://fakehost/wiki/M%C4%81ori_cuisine" title="Māori cuisine">Māori cuisine</a> and diverse culinary traditions introduced by settlers and immigrants from Europe, Polynesia and Asia.<sup id="cite_ref-cuisine_374-0"><a href="#cite_note-cuisine-374">[363]</a></sup> New Zealand yields produce from land and sea—most crops and livestock, such as maize, potatoes and pigs, were gradually introduced by the early European settlers.<sup id="cite_ref-375"><a href="#cite_note-375">[364]</a></sup> Distinctive ingredients or dishes include <a href="http://fakehost/wiki/Lamb_and_mutton" title="Lamb and mutton">lamb</a>, salmon, <a href="http://fakehost/wiki/K%C5%8Dura" title="Kōura">kōura</a> (crayfish),<sup id="cite_ref-376"><a href="#cite_note-376">[365]</a></sup> <a href="http://fakehost/wiki/Dredge_oyster" title="Dredge oyster">dredge oysters</a>, <a href="http://fakehost/wiki/Whitebait" title="Whitebait">whitebait</a>, <a href="http://fakehost/wiki/P%C4%81ua" title="Pāua">pāua</a> (abalone), mussels, scallops, <a href="http://fakehost/wiki/Paphies_australis" title="Paphies australis">pipis</a> and <a href="http://fakehost/wiki/Tuatua" title="Tuatua">tuatua</a> (both are types of New Zealand shellfish),<sup id="cite_ref-377"><a href="#cite_note-377">[366]</a></sup> <a href="http://fakehost/wiki/K%C5%ABmara" title="Kūmara">kūmara</a> (sweet potato), <a href="http://fakehost/wiki/Kiwifruit" title="Kiwifruit">kiwifruit</a>, <a href="http://fakehost/wiki/Tamarillo" title="Tamarillo">tamarillo</a> and <a href="http://fakehost/wiki/Pavlova_(food)" title="Pavlova (food)">pavlova</a> (considered a national dish).<sup id="cite_ref-378"><a href="#cite_note-378">[367]</a></sup><sup id="cite_ref-cuisine_374-1"><a href="#cite_note-cuisine-374">[363]</a></sup> A <a href="http://fakehost/wiki/H%C4%81ngi" title="Hāngi">hāngi</a> is a traditional Māori method of cooking food using heated rocks buried in a pit oven. After European colonisation, Māori began cooking with pots and ovens and the hāngi was used less frequently, although it is still used for formal occasions such as <a href="http://fakehost/wiki/Tangihanga" title="Tangihanga">tangihanga</a>.<sup id="cite_ref-379"><a href="#cite_note-379">[368]</a></sup>
+ </p>
+
+ <h2>
+ <span id="See_also">See also</span>
+ </h2>
+
+ <ul>
+ <li>
+ <a href="http://fakehost/wiki/Outline_of_New_Zealand" title="Outline of New Zealand">Outline of New Zealand</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/List_of_New_Zealand-related_topics" title="List of New Zealand-related topics">List of New Zealand-related topics</a>
+ </li>
+ </ul>
+
+ <h2>
+ <span id="Footnotes">Footnotes</span>
+ </h2>
+ <div>
+ <ol>
+ <li id="cite_note-2">
+ <span><b><a href="#cite_ref-2">^</a></b></span> <span>"God Save the Queen" is officially a national anthem but is generally used only on regal and viceregal occasions.<sup id="cite_ref-1"><a href="#cite_note-1">[1]</a></sup></span>
+ </li>
+ <li id="cite_note-4">
+ <span><b><a href="#cite_ref-4">^</a></b></span> <span>English is a <i>de facto</i> official language due to its widespread use.<sup id="cite_ref-3"><a href="#cite_note-3">[2]</a></sup></span>
+ </li>
+ <li id="cite_note-ethnicity-6">
+ <span>^ <a href="#cite_ref-ethnicity_6-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-ethnicity_6-1"><sup><i><b>b</b></i></sup></a></span> <span>Ethnicity figures add to more than 100% as people could choose more than one ethnic group.</span>
+ </li>
+ <li id="cite_note-8">
+ <span><b><a href="#cite_ref-8">^</a></b></span> <span>The proportion of New Zealand's area (excluding estuaries) covered by rivers, lakes and ponds, based on figures from the New Zealand Land Cover Database,<sup id="cite_ref-7"><a href="#cite_note-7">[4]</a></sup> is (357526 + 81936) / (26821559 – 92499–26033 – 19216) = 1.6%. If estuarine open water, mangroves, and herbaceous saline vegetation are included, the figure is 2.2%.</span>
+ </li>
+ <li id="cite_note-13">
+ <span><b><a href="#cite_ref-13">^</a></b></span> <span>The Chatham Islands have a <a href="http://fakehost/wiki/Chatham_Standard_Time_Zone" title="Chatham Standard Time Zone">separate time zone</a>, 45 minutes ahead of the rest of New Zealand.</span>
+ </li>
+ <li id="cite_note-15">
+ <span><b><a href="#cite_ref-15">^</a></b></span> <span>Clocks are advanced by an hour from the last Sunday in September until the first Sunday in April.<sup id="cite_ref-14"><a href="#cite_note-14">[9]</a></sup> Daylight saving time is also observed in the Chatham Islands, 45 minutes ahead of NZDT.</span>
+ </li>
+ <li id="cite_note-144">
+ <span><b><a href="#cite_ref-144">^</a></b></span> <span>A person born on or after 1 January 2006 acquires New Zealand citizenship at birth only if at least one parent is a New Zealand citizen or permanent resident. People born on or before 31 December 2005 acquired citizenship at birth (<i><a href="http://fakehost/wiki/Jus_soli" title="Jus soli">jus soli</a></i>).<sup id="cite_ref-143"><a href="#cite_note-143">[137]</a></sup></span>
+ </li>
+ <li id="cite_note-254">
+ <span><b><a href="#cite_ref-254">^</a></b></span> <span>The population is increasing at a rate of 1.4–2.0% per year and is projected to rise to 5.01–5.51 million in 2025.<sup id="cite_ref-253"><a href="#cite_note-253">[246]</a></sup></span>
+ </li>
+ <li id="cite_note-286">
+ <span><b><a href="#cite_ref-286">^</a></b></span> <span>In 2015, 55% of Māori adults (aged 15 years and over) reported knowledge of <i>te reo Māori</i>. Of these speakers, 64% use Māori at home and 50,000 can speak the language "very well" or "well".<sup id="cite_ref-tereoMaori_285-0"><a href="#cite_note-tereoMaori-285">[277]</a></sup></span>
+ </li>
+ <li id="cite_note-289">
+ <span><b><a href="#cite_ref-289">^</a></b></span> <span>Of the 86,403 people that replied they spoke Samoan, 51,336 lived in the Auckland Region.</span>
+ </li>
+ <li id="cite_note-293">
+ <span><b><a href="#cite_ref-293">^</a></b></span> <span>Religion percentages may not add to 100% as people could claim multiple religions or object to answering the question.</span>
+ </li>
+ </ol>
+ </div>
+ <h2>
+ <span id="Citations">Citations</span>
+ </h2>
+ <div>
+ <ol>
+ <li id="cite_note-1">
+ <span><b><a href="#cite_ref-1">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mch.govt.nz/nz-identity-heritage/national-anthems/protocols">"Protocol for using New Zealand's National Anthems"</a>. <a href="http://fakehost/wiki/Ministry_for_Culture_and_Heritage" title="Ministry for Culture and Heritage">Ministry for Culture and Heritage</a><span>. Retrieved <span>17 February</span> 2008</span>.</cite></span>
+ </li>
+ <li id="cite_note-3">
+ <span><b><a href="#cite_ref-3">^</a></b></span> <span><cite>New Zealand Government (21 December 2007). <a rel="nofollow" href="https://web.archive.org/web/20150124193521/http://mfat.govt.nz/downloads/humanrights/5th-ICCPR-report.pdf">International Covenant on Civil and Political Rights Fifth Periodic Report of the Government of New Zealand</a> <span>(PDF)</span> (Report). p.&nbsp;89. Archived from <a rel="nofollow" href="http://www.mfat.govt.nz/downloads/humanrights/5th-ICCPR-report.pdf">the original</a> <span>(PDF)</span> on 24 January 2015<span>. Retrieved <span>18 November</span> 2015</span>. <q>In addition to the Māori language, New Zealand Sign Language is also an official language of New Zealand. The New Zealand Sign Language Act 2006 permits the use of NZSL in legal proceedings, facilitates competency standards for its interpretation and guides government departments in its promotion and use. English, the medium for teaching and learning in most schools, is a de facto official language by virtue of its widespread use. For these reasons, these three languages have special mention in the New Zealand Curriculum.</q></cite></span>
+
+ </li>
+ <li id="cite_note-Census2018_pdc-5">
+ <span><b><a href="#cite_ref-Census2018_pdc_5-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.stats.govt.nz/information-releases/2018-census-population-and-dwelling-counts">"2018 Census population and dwelling counts"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span>. Retrieved <span>26 September</span> 2019</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-7">
+ <span><b><a href="#cite_ref-7">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mfe.govt.nz/issues/land/land-cover-dbase/index.html">"The New Zealand Land Cover Database"</a>. <i>New Zealand Land Cover Database 2</i>. <a href="http://fakehost/wiki/Ministry_for_the_Environment_(New_Zealand)" title="Ministry for the Environment (New Zealand)">Ministry for the Environment</a>. 1 July 2009<span>. Retrieved <span>26 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-populationestimate-9">
+ <span>^ <a href="#cite_ref-populationestimate_9-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-populationestimate_9-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/tools_and_services/population_clock.aspx">"Population clock"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span>. Retrieved <span>14 April</span> 2016</span>.</cite></span>
+ The population estimate shown is automatically calculated daily at 00:00 UTC and is based on data obtained from the population clock on the date shown in the citation.
+ </li>
+ <li id="cite_note-imf2-10">
+ <span>^ <a href="#cite_ref-imf2_10-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-imf2_10-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-imf2_10-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-imf2_10-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-imf2_10-4"><sup><i><b>e</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://www.imf.org/external/pubs/ft/weo/2018/02/weodata/weorept.aspx?sy=2018&amp;ey=2023&amp;scsm=1&amp;ssd=1&amp;sort=country&amp;ds=.&amp;br=1&amp;pr1.x=45&amp;pr1.y=1&amp;c=196&amp;s=NGDPD%2CPPPGDP%2CNGDPDPC%2CPPPPC&amp;grp=0&amp;a=">"New Zealand"</a>. International Monetary Fund<span>. Retrieved <span>9 October</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-11">
+ <span><b><a href="#cite_ref-11">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/snapshots-of-nz/nz-social-indicators/Home/Standard%20of%20living/income-inequality.aspx#anchor26">"Income inequality"</a>. Statistics New Zealand<span>. Retrieved <span>14 June</span> 2015</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-HDI-12">
+ <span>^ <a href="#cite_ref-HDI_12-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-HDI_12-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://hdr.undp.org/sites/default/files/2018_human_development_statistical_update.pdf">"Human Development Report 2018"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Human_Development_Report" title="Human Development Report">HDRO (Human Development Report Office)</a> <a href="http://fakehost/wiki/United_Nations_Development_Programme" title="United Nations Development Programme">United Nations Development Programme</a>. p.&nbsp;22<span>. Retrieved <span>14 September</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-14">
+ <span><b><a href="#cite_ref-14">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/regulation/public/2007/0185/latest/whole.html">"New Zealand Daylight Time Order 2007 (SR 2007/185)"</a>. New Zealand Parliamentary Counsel Office. 6 July 2007<span>. Retrieved <span>6 March</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-16">
+ <span><b><a href="#cite_ref-16">^</a></b></span> <span>There is no official all-numeric date format for New Zealand, but government recommendations generally follow <a href="http://fakehost/wiki/Date_and_time_notation_in_Australia" title="Date and time notation in Australia">Australian date and time notation</a>. See <cite><a rel="nofollow" href="https://www.govt.nz/about/about-this-website/style-and-design/the-govt-nz-style-guide/">"The Govt.nz style guide"</a>, <i>New Zealand Government</i>, 9 December 2016<span>, retrieved <span>7 March</span> 2019</span></cite> </span>
+ .
+ </li>
+ <li id="cite_note-17">
+ <span><b><a href="#cite_ref-17">^</a></b></span> <span><cite>Tasman, Abel. <a rel="nofollow" href="http://gutenberg.net.au/ebooks06/0600611.txt">"JOURNAL or DESCRIPTION By me <i>Abel Jansz Tasman</i>, Of a Voyage from <i>Batavia</i> for making Discoveries of the <i>Unknown South Land</i> in the year 1642"</a>. Project Gutenberg Australia<span>. Retrieved <span>26 March</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-18">
+ <span><b><a href="#cite_ref-18">^</a></b></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.teara.govt.nz/en/european-discovery-of-new-zealand/3">"European discovery of New Zealand – Tasman's achievement"</a>. <i><a href="http://fakehost/wiki/Te_Ara:_The_Encyclopedia_of_New_Zealand" title="Te Ara: The Encyclopedia of New Zealand">Te Ara: The Encyclopedia of New Zealand</a></i><span>. Retrieved <span>24 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-19">
+ <span><b><a href="#cite_ref-19">^</a></b></span> <span><cite>John Bathgate. <a rel="nofollow" href="http://nzetc.victoria.ac.nz//tm/scholarly/tei-Stout44-t2-body-d1-d1.html">"The Pamphlet Collection of Sir Robert Stout:Volume 44. Chapter 1, Discovery and Settlement"</a>. NZETC<span>. Retrieved <span>17 August</span> 2018</span>. <q>He named the country Staaten Land, in honour of the States-General of Holland, in the belief that it was part of the great southern continent.</q></cite></span>
+
+ </li>
+ <li id="cite_note-20">
+ <span><b><a href="#cite_ref-20">^</a></b></span> <span><cite>Wilson, John (September 2007). <a rel="nofollow" href="http://www.teara.govt.nz/en/european-discovery-of-new-zealand/3">"Tasman's achievement"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>16 February</span> 2008</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-21">
+ <span><b><a href="#cite_ref-21">^</a></b></span> <span><cite>Mackay, Duncan (1986). "The Search For The Southern Land". In Fraser, B (ed.). <i>The New Zealand Book Of Events</i>. Auckland: <a href="http://fakehost/wiki/Methuen_Publishing" title="Methuen Publishing">Reed Methuen</a>. pp.&nbsp;52–54.</cite></span>
+
+ </li>
+ <li id="cite_note-NZ_name-22">
+ <span>^ <a href="#cite_ref-NZ_name_22-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_name_22-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://fakehost/wiki/Malcolm_McKinnon" title="Malcolm McKinnon">McKinnon, Malcolm</a> (November 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/place-names/1">"Place names – Naming the country and the main islands"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>24 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEKing200341-23">
+ <span><b><a href="#cite_ref-FOOTNOTEKing200341_23-0">^</a></b></span> <span><a href="#CITEREFKing2003">King 2003</a>, p.&nbsp;41.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEHayMaclaganGordon200872-24">
+ <span><b><a href="#cite_ref-FOOTNOTEHayMaclaganGordon200872_24-0">^</a></b></span> <span><a href="#CITEREFHayMaclaganGordon2008">Hay, Maclagan &amp; Gordon 2008</a>, p.&nbsp;72.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEMein_Smith20056-25">
+ <span>^ <a href="#cite_ref-FOOTNOTEMein_Smith20056_25-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTEMein_Smith20056_25-1"><sup><i><b>b</b></i></sup></a></span> <span><a href="#CITEREFMein_Smith2005">Mein Smith 2005</a>, p.&nbsp;6.</span>
+ </li>
+ <li id="cite_note-26">
+ <span><b><a href="#cite_ref-26">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Thomas_Brunner" title="Thomas Brunner">Brunner, Thomas</a> (1851). <a rel="nofollow" href="http://www.nzetc.org/tm/scholarly/BruJour-fig-BruJour_P001a.html"><i>The Great Journey: an expedition to explore the interior of the Middle Island, New Zealand, 1846-8</i></a>. <a href="http://fakehost/wiki/Royal_Geographical_Society" title="Royal Geographical Society">Royal Geographical Society</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-Williamson2013-27">
+ <span>^ <a href="#cite_ref-Williamson2013_27-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Williamson2013_27-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Williamson, Maurice (10 October 2013). <a rel="nofollow" href="https://www.beehive.govt.nz/release/names-nz%E2%80%99s-two-main-islands-formalised">"Names of NZ's two main islands formalised"</a> (Press release). New Zealand Government<span>. Retrieved <span>1 May</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-28">
+ <span><b><a href="#cite_ref-28">^</a></b></span> <span><cite>Wilmshurst, J. M.; Hunt, T. L.; Lipo, C. P.; Anderson, A. J. (2010). <a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3033267">"High-precision radiocarbon dating shows recent and rapid initial human colonization of East Polynesia"</a>. <i>Proceedings of the National Academy of Sciences</i>. <b>108</b> (5): 1815. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/2011PNAS..108.1815W">2011PNAS..108.1815W</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1073%2Fpnas.1015876108">10.1073/pnas.1015876108</a>. <a href="http://fakehost/wiki/PubMed_Central" title="PubMed Central">PMC</a>&nbsp;<span title="Freely accessible"><a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3033267">3033267</a></span>. <a href="http://fakehost/wiki/PubMed_Identifier" title="PubMed Identifier">PMID</a>&nbsp;<a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pubmed/21187404">21187404</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-29">
+ <span><b><a href="#cite_ref-29">^</a></b></span> <span><cite>McGlone, M.; Wilmshurst, J. M. (1999). "Dating initial Maori environmental impact in New Zealand". <i>Quaternary International</i>. <b>59</b>: 5–16. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/1999QuInt..59....5M">1999QuInt..59....5M</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1016%2FS1040-6182%2898%2900067-6">10.1016/S1040-6182(98)00067-6</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-30">
+ <span><b><a href="#cite_ref-30">^</a></b></span> <span><cite>Murray-McIntosh, Rosalind P.; Scrimshaw, Brian J.; Hatfield, Peter J.; Penny, David (1998). <a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC21200">"Testing migration patterns and estimating founding population size in Polynesia by using human mtDNA sequences"</a>. <i><a href="http://fakehost/wiki/Proceedings_of_the_National_Academy_of_Sciences_of_the_United_States_of_America" title="Proceedings of the National Academy of Sciences of the United States of America">Proceedings of the National Academy of Sciences of the United States of America</a></i>. <b>95</b> (15): 9047–52. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/1998PNAS...95.9047M">1998PNAS...95.9047M</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1073%2Fpnas.95.15.9047">10.1073/pnas.95.15.9047</a>. <a href="http://fakehost/wiki/PubMed_Central" title="PubMed Central">PMC</a>&nbsp;<span title="Freely accessible"><a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC21200">21200</a></span>.</cite></span>
+
+ </li>
+ <li id="cite_note-31">
+ <span><b><a href="#cite_ref-31">^</a></b></span> <span><cite>Wilmshurst, J. M.; Anderson, A. J.; Higham, T. F. G.; Worthy, T. H. (2008). <a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2409139">"Dating the late prehistoric dispersal of Polynesians to New Zealand using the commensal Pacific rat"</a>. <i>Proceedings of the National Academy of Sciences</i>. <b>105</b> (22): 7676. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/2008PNAS..105.7676W">2008PNAS..105.7676W</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1073%2Fpnas.0801507105">10.1073/pnas.0801507105</a>. <a href="http://fakehost/wiki/PubMed_Central" title="PubMed Central">PMC</a>&nbsp;<span title="Freely accessible"><a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2409139">2409139</a></span>. <a href="http://fakehost/wiki/PubMed_Identifier" title="PubMed Identifier">PMID</a>&nbsp;<a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pubmed/18523023">18523023</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-32">
+ <span><b><a href="#cite_ref-32">^</a></b></span> <span><cite>Moodley, Y.; Linz, B.; Yamaoka, Y.; Windsor, H.M.; Breurec, S.; Wu, J.-Y.; Maady, A.; Bernhöft, S.; Thiberge, J.-M.; et al. (2009). <a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2827536">"The Peopling of the Pacific from a Bacterial Perspective"</a>. <i>Science</i>. <b>323</b> (5913): 527–530. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/2009Sci...323..527M">2009Sci...323..527M</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1126%2Fscience.1166083">10.1126/science.1166083</a>. <a href="http://fakehost/wiki/PubMed_Central" title="PubMed Central">PMC</a>&nbsp;<span title="Freely accessible"><a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2827536">2827536</a></span>. <a href="http://fakehost/wiki/PubMed_Identifier" title="PubMed Identifier">PMID</a>&nbsp;<a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pubmed/19164753">19164753</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-33">
+ <span><b><a href="#cite_ref-33">^</a></b></span> <span><cite>Ballara, Angela (1998). <i>Iwi: The Dynamics of Māori Tribal Organisation from c. 1769 to c. 1945</i> (1st ed.). Wellington: Victoria University Press. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9780864733283" title="Special:BookSources/9780864733283"><bdi>9780864733283</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-34">
+ <span><b><a href="#cite_ref-34">^</a></b></span> <span><cite>Clark, Ross (1994). "Moriori and Māori: The Linguistic Evidence". In Sutton, Douglas (ed.). <i>The Origins of the First New Zealanders</i>. Auckland: <a href="http://fakehost/wiki/Auckland_University_Press" title="Auckland University Press">Auckland University Press</a>. pp.&nbsp;123–135.</cite></span>
+
+ </li>
+ <li id="cite_note-35">
+ <span><b><a href="#cite_ref-35">^</a></b></span> <span><cite>Davis, Denise (September 2007). <a rel="nofollow" href="http://www.teara.govt.nz/en/moriori/4">"The impact of new arrivals"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-36">
+ <span><b><a href="#cite_ref-36">^</a></b></span> <span><cite>Davis, Denise; Solomon, Māui (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/moriori/4">"<span>'</span>Moriori – The impact of new arrivals<span>'</span>"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>23 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEMein_Smith200523-37">
+ <span>^ <a href="#cite_ref-FOOTNOTEMein_Smith200523_37-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTEMein_Smith200523_37-1"><sup><i><b>b</b></i></sup></a></span> <span><a href="#CITEREFMein_Smith2005">Mein Smith 2005</a>, p.&nbsp;23.</span>
+ </li>
+ <li id="cite_note-38">
+ <span><b><a href="#cite_ref-38">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Anne_Salmond" title="Anne Salmond">Salmond, Anne</a>. <i>Two Worlds: First Meetings Between Maori and Europeans 1642–1772</i>. Auckland: <a href="http://fakehost/wiki/Penguin_Books" title="Penguin Books">Penguin Books</a>. p.&nbsp;82. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-670-83298-7" title="Special:BookSources/0-670-83298-7"><bdi>0-670-83298-7</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEKing2003122-39">
+ <span><b><a href="#cite_ref-FOOTNOTEKing2003122_39-0">^</a></b></span> <span><a href="#CITEREFKing2003">King 2003</a>, p.&nbsp;122.</span>
+ </li>
+ <li id="cite_note-40">
+ <span><b><a href="#cite_ref-40">^</a></b></span> <span><cite>Fitzpatrick, John (2004). <a rel="nofollow" href="https://web.archive.org/web/20110511142553/https://www.adelaide.edu.au/apsa/docs_papers/Others/Fitzpatrick.pdf">"Food, warfare and the impact of Atlantic capitalism in Aotearo/New Zealand"</a> <span>(PDF)</span>. <i>Australasian Political Studies Association Conference: APSA 2004 Conference Papers</i>. Archived from <a rel="nofollow" href="https://www.adelaide.edu.au/apsa/docs_papers/Others/Fitzpatrick.pdf">the original</a> <span>(PDF)</span> on 11 May 2011.</cite></span>
+
+ </li>
+ <li id="cite_note-41">
+ <span><b><a href="#cite_ref-41">^</a></b></span> <span><cite>Brailsford, Barry (1972). <i>Arrows of Plague</i>. Wellington: Hick Smith and Sons. p.&nbsp;35. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-456-01060-2" title="Special:BookSources/0-456-01060-2"><bdi>0-456-01060-2</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-42">
+ <span><b><a href="#cite_ref-42">^</a></b></span> <span><cite>Wagstrom, Thor (2005). "Broken Tongues and Foreign Hearts". In Brock, Peggy (ed.). <i>Indigenous Peoples and Religious Change</i>. Boston: Brill Academic Publishers. pp.&nbsp;71 and 73. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-90-04-13899-5" title="Special:BookSources/978-90-04-13899-5"><bdi>978-90-04-13899-5</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-43">
+ <span><b><a href="#cite_ref-43">^</a></b></span> <span><cite>Lange, Raeburn (1999). <i>May the people live: a history of Māori health development 1900–1920</i>. Auckland University Press. p.&nbsp;18. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-86940-214-3" title="Special:BookSources/978-1-86940-214-3"><bdi>978-1-86940-214-3</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-44">
+ <span><b><a href="#cite_ref-44">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20150228231623/http://www.heritageaustralia.com.au/articles/features/4576-a-nation-subdivided">"A Nation sub-divided"</a>. <i>Australian Heritage</i>. Heritage Australia Publishing. 2011. Archived from <a rel="nofollow" href="http://www.heritageaustralia.com.au/articles/features/4576-a-nation-subdivided">the original</a> on 28 February 2015<span>. Retrieved <span>27 December</span> 2014</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Busby-45">
+ <span>^ <a href="#cite_ref-Busby_45-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Busby_45-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Rutherford, James (April 2009) [originally published in 1966]. <a href="http://fakehost/wiki/Alexander_Hare_McLintock" title="Alexander Hare McLintock">McLintock, Alexander</a> (ed.). <a rel="nofollow" href="http://www.teara.govt.nz/en/1966/busby-james/1"><i>Busby, James</i></a>. <a href="http://fakehost/wiki/An_Encyclopaedia_of_New_Zealand" title="An Encyclopaedia of New Zealand">An Encyclopaedia of New Zealand</a><span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-46">
+ <span><b><a href="#cite_ref-46">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/gipps-sir-george/1"><i>Sir George Gipps</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Wilson2009-47">
+ <span>^ <a href="#cite_ref-Wilson2009_47-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2009_47-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/government-and-nation/1">"Government and nation – The origins of nationhood"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-48">
+ <span><b><a href="#cite_ref-48">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.teara.govt.nz/en/1966/land-settlement/3"><i>Settlement from 1840 to 1852</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-49">
+ <span><b><a href="#cite_ref-49">^</a></b></span> <span><cite>Foster, Bernard (April 2009) [originally published in 1966]. McLintock, Alexander (ed.). <a rel="nofollow" href="http://www.teara.govt.nz/en/1966/akaroa-french-settlement-at/1"><i>Akaroa, French Settlement At</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-50">
+ <span><b><a href="#cite_ref-50">^</a></b></span> <span><cite>Simpson, K (September 2010). <a rel="nofollow" href="http://www.teara.govt.nz/en/biographies/1h29/1">"Hobson, William – Biography"</a>. In McLintock, Alexander (ed.). <i><a href="http://fakehost/wiki/Dictionary_of_New_Zealand_Biography" title="Dictionary of New Zealand Biography">Dictionary of New Zealand Biography</a></i>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-51">
+ <span><b><a href="#cite_ref-51">^</a></b></span> <span><cite>Phillips, Jock (April 2010). <a rel="nofollow" href="http://www.teara.govt.nz/en/history-of-immigration/3">"British immigration and the New Zealand Company"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-52">
+ <span><b><a href="#cite_ref-52">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/politics/history-of-the-governor-general/crown-colony-era">"Crown colony era – the Governor-General"</a>. Ministry for Culture and Heritage. March 2009<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-53">
+ <span><b><a href="#cite_ref-53">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/new-zealands-19th-century-wars/introduction">"New Zealand's 19th-century wars – overview"</a>. Ministry for Culture and Heritage. April 2009<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-G_and_N-54">
+ <span>^ <a href="#cite_ref-G_and_N_54-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-G_and_N_54-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-G_and_N_54-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-G_and_N_54-3"><sup><i><b>d</b></i></sup></a></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/nation-and-government">"Government and nation – The constitution"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>2 February</span> 2011</span>.</cite></span>
+ See pages 2 and 3.
+ </li>
+ <li id="cite_note-55">
+ <span><b><a href="#cite_ref-55">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Philip_Temple" title="Philip Temple">Temple, Philip</a> (1980). <i>Wellington Yesterday</i>. John McIndoe. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-86868-012-5" title="Special:BookSources/0-86868-012-5"><bdi>0-86868-012-5</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-56">
+ <span><b><a href="#cite_ref-56">^</a></b></span> <span><cite><a rel="nofollow" href="https://nzhistory.govt.nz/parliament-sits-for-the-first-time-in-wellington">"Parliament moves to Wellington"</a>. Ministry for Culture and Heritage. January 2017<span>. Retrieved <span>27 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Liberal-57">
+ <span>^ <a href="#cite_ref-Liberal_57-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Liberal_57-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/history/page-5">"History – Liberal to Labour"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>27 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-58">
+ <span><b><a href="#cite_ref-58">^</a></b></span> <span><cite>Hamer, David. <a rel="nofollow" href="http://www.teara.govt.nz/en/biographies/2s11">"Seddon, Richard John"</a>. <i><a href="http://fakehost/wiki/Dictionary_of_New_Zealand_Biography" title="Dictionary of New Zealand Biography">Dictionary of New Zealand Biography</a></i>. <a href="http://fakehost/wiki/Ministry_for_Culture_and_Heritage" title="Ministry for Culture and Heritage">Ministry for Culture and Heritage</a><span>. Retrieved <span>27 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-59">
+ <span><b><a href="#cite_ref-59">^</a></b></span> <span><cite>Boxall, Peter; Haynes, Peter (1997). <a rel="nofollow" href="https://web.archive.org/web/20110511134417/http://www.gurn.info/en/topics/global-trade-union-strategies-union-renewal/organizational-innovation-and-change/industrial-relations-and-labour-regulations-affecting-unions2019-structure/strategy-and-trade-union-effectiveness-in-a-neo-liberal-environment">"Strategy and Trade Union Effectiveness in a Neo-liberal Environment"</a>. <i>British Journal of Industrial Relations</i>. <b>35</b> (4): 567–591. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1111%2F1467-8543.00069">10.1111/1467-8543.00069</a>. Archived from <a rel="nofollow" href="http://www.gurn.info/en/topics/global-trade-union-strategies-union-renewal/organizational-innovation-and-change/industrial-relations-and-labour-regulations-affecting-unions2019-structure/strategy-and-trade-union-effectiveness-in-a-neo-liberal-environment">the original</a> <span>(PDF)</span> on 11 May 2011.</cite></span>
+
+ </li>
+ <li id="cite_note-60">
+ <span><b><a href="#cite_ref-60">^</a></b></span> <span><cite id="CITEREFGazette28058"><a rel="nofollow" href="https://www.thegazette.co.uk/London/issue/28058/page/6149">"Proclamation"</a>. <i><a href="http://fakehost/wiki/The_London_Gazette" title="The London Gazette">The London Gazette</a></i>. No.&nbsp;28058. 10 September 1907. p.&nbsp;6149.</cite></span>
+
+ </li>
+ <li id="cite_note-61">
+ <span><b><a href="#cite_ref-61">^</a></b></span> <span><cite><a rel="nofollow" href="https://nzhistory.govt.nz/culture/dominion-day/becoming-dominion">"Dominion status – Becoming a dominion"</a>. Ministry for Culture and Heritage. September 2014<span>. Retrieved <span>26 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-62">
+ <span><b><a href="#cite_ref-62">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war-and-society">"War and Society"</a>. Ministry for Culture and Heritage<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-63">
+ <span><b><a href="#cite_ref-63">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Brian_Easton_(economist)" title="Brian Easton (economist)">Easton, Brian</a> (April 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/economic-history/7">"Economic history – Interwar years and the great depression"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-64">
+ <span><b><a href="#cite_ref-64">^</a></b></span> <span><cite>Derby, Mark (May 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/strikes-and-labour-disputes/6">"Strikes and labour disputes – Wars, depression and first Labour government"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>1 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-65">
+ <span><b><a href="#cite_ref-65">^</a></b></span> <span><cite>Easton, Brian (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/economic-history/9">"Economic history – Great boom, 1935–1966"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>1 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-66">
+ <span><b><a href="#cite_ref-66">^</a></b></span> <span><cite>Keane, Basil (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/te-maori-i-te-ohanga-maori-in-the-economy/6">"Te Māori i te ohanga – Māori in the economy – Urbanisation"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-67">
+ <span><b><a href="#cite_ref-67">^</a></b></span> <span><cite>Royal, Te Ahukaramū (March 2009). <a rel="nofollow" href="http://www.teara.govt.nz/en/maori/5">"Māori – Urbanisation and renaissance"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>1 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-68">
+ <span><b><a href="#cite_ref-68">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.govt.nz/assets/Documents/Red-Book-Healing-the-past-building-a-future.pdf"><i>Healing the past, building a future: A Guide to Treaty of Waitangi Claims and Negotiations with the Crown</i></a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Office_of_Treaty_Settlements" title="Office of Treaty Settlements">Office of Treaty Settlements</a>. March 2015. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-478-32436-5" title="Special:BookSources/978-0-478-32436-5"><bdi>978-0-478-32436-5</bdi></a><span>. Retrieved <span>26 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-69">
+ <span><b><a href="#cite_ref-69">^</a></b></span> <span><cite><a rel="nofollow" href="https://forms.justice.govt.nz/search/WT/reports/reportSummary.html?reportId=wt_DOC_68000605">Report on the Crown's Foreshore and Seabed Policy</a> (Report). <a href="http://fakehost/wiki/Minister_of_Justice_(New_Zealand)" title="Minister of Justice (New Zealand)">Ministry of Justice</a><span>. Retrieved <span>26 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-70">
+ <span><b><a href="#cite_ref-70">^</a></b></span> <span><cite>Barker, Fiona (June 2012). <a rel="nofollow" href="http://www.teara.govt.nz/en/video/34605/debate-about-the-foreshore-and-seabed">"Debate about the foreshore and seabed"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>26 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-GG_constitution-71">
+ <span>^ <a href="#cite_ref-GG_constitution_71-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-GG_constitution_71-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.gg.govt.nz/role/constofnz.htm">"New Zealand's Constitution"</a>. The Governor-General of New Zealand<span>. Retrieved <span>13 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Economist_factsheet-72">
+ <span>^ <a href="#cite_ref-Economist_factsheet_72-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Economist_factsheet_72-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Economist_factsheet_72-2"><sup><i><b>c</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20060514204533/http://economist.com/countries/NewZealand/profile.cfm?folder=Profile-Political%20Forces">"Factsheet – New Zealand – Political Forces"</a>. <i><a href="http://fakehost/wiki/The_Economist" title="The Economist">The Economist</a></i>. <a href="http://fakehost/wiki/The_Economist_Group" title="The Economist Group">The Economist Group</a>. 15 February 2005. Archived from <a rel="nofollow" href="http://economist.com/countries/NewZealand/profile.cfm?folder=Profile-Political%20Forces">the original</a> on 14 May 2006<span>. Retrieved <span>4 August</span> 2009</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-73">
+ <span><b><a href="#cite_ref-73">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1974/0001/latest/DLM411814.html">"Royal Titles Act 1974"</a>. New Zealand Parliamentary Counsel Office. February 1974. Section 1<span>. Retrieved <span>8 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-74">
+ <span><b><a href="#cite_ref-74">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1986/0114/latest/whole.html#DLM94210">"Constitution Act 1986"</a>. New Zealand Parliamentary Counsel Office. 1 January 1987. Section 2.1<span>. Retrieved <span>15 July</span> 2018</span>. <q>The Sovereign in right of New Zealand is the head of State of New Zealand, and shall be known by the royal style and titles proclaimed from time to time.</q></cite> </span>
+
+ </li>
+ <li id="cite_note-75">
+ <span><b><a href="#cite_ref-75">^</a></b></span> <span><cite><a rel="nofollow" href="https://gg.govt.nz/role">"The Role of the Governor-General"</a>. The Governor-General of New Zealand<span>. Retrieved <span>6 July</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-76">
+ <span><b><a href="#cite_ref-76">^</a></b></span> <span><cite>Harris, Bruce (2009). <a rel="nofollow" href="https://web.archive.org/web/20110718005846/http://www.britannica.com/bps/additionalcontent/18/41876855/REPLACEMENT-OF-THE-ROYAL-PREROGATIVE-IN-NEW-ZEALAND">"Replacement of the Royal Prerogative in New Zealand"</a>. <i>New Zealand Universities Law Review</i>. <b>23</b>: 285–314. Archived from <a rel="nofollow" href="http://www.britannica.com/bps/additionalcontent/18/41876855/REPLACEMENT-OF-THE-ROYAL-PREROGATIVE-IN-NEW-ZEALAND">the original</a> on 18 July 2011<span>. Retrieved <span>28 August</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-reserve_Powers-77">
+ <span>^ <a href="#cite_ref-reserve_Powers_77-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-reserve_Powers_77-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.gg.govt.nz/role/powers.htm">"The Reserve Powers"</a>. The Governor-General of New Zealand<span>. Retrieved <span>8 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-parliament_facts-78">
+ <span>^ <a href="#cite_ref-parliament_facts_78-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-3"><sup><i><b>d</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://www.parliament.nz/en/visit-and-learn/how-parliament-works/fact-sheets/pbrief7/">"Parliament Brief: What is Parliament?"</a>. New Zealand Parliament<span>. Retrieved <span>30 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-79">
+ <span><b><a href="#cite_ref-79">^</a></b></span> <span><cite>McLean, Gavin (February 2015). <a rel="nofollow" href="http://www.teara.govt.nz/en/premiers-and-prime-ministers">"Premiers and prime ministers"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>30 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-80">
+ <span><b><a href="#cite_ref-80">^</a></b></span> <span><cite>Wilson, John (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/government-and-nation/4">"Government and nation – System of government"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-81">
+ <span><b><a href="#cite_ref-81">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.cabinetmanual.cabinetoffice.govt.nz/5.11">"Principles of Cabinet decision making"</a>. <i>Cabinet Manual</i>. Department of the Prime Minister and Cabinet. 2008<span>. Retrieved <span>1 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-82">
+ <span><b><a href="#cite_ref-82">^</a></b></span> <span><cite><a rel="nofollow" href="https://cabinetmanual.cabinetoffice.govt.nz/6.2">"The electoral cycle"</a>. <i>Cabinet Manual</i>. Department of the Prime Minister and Cabinet. 2008<span>. Retrieved <span>30 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-road-83">
+ <span>^ <a href="#cite_ref-road_83-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-road_83-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/politics/fpp-to-mmp/first-past-the-post">"First past the post – the road to MMP"</a>. Ministry for Culture and Heritage. September 2009<span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-84">
+ <span><b><a href="#cite_ref-84">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20111109013802/http://www.elections.org.nz/elections/electorates/reviewing-electorates.html">"Reviewing electorate numbers and boundaries"</a>. <a href="http://fakehost/wiki/Electoral_Commission_(New_Zealand)" title="Electoral Commission (New Zealand)">Electoral Commission</a>. 8 May 2005. Archived from <a rel="nofollow" href="http://www.elections.org.nz/elections/electorates/reviewing-electorates.html">the original</a> on 9 November 2011<span>. Retrieved <span>7 July</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-85">
+ <span><b><a href="#cite_ref-85">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.elections.org.nz/voting-system/mmp-voting-system/sainte-lagu%C3%AB-allocation-formula">"Sainte-Laguë allocation formula"</a>. Electoral Commission. 4 February 2013<span>. Retrieved <span>31 May</span> 2014</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-86">
+ <span><b><a href="#cite_ref-86">^</a></b></span> <span><cite>Paxton, Pamela; Hughes, Melanie M. (2015). <a rel="nofollow" href="https://books.google.com/books?id=lf4QCgAAQBAJ&amp;pg=PT107"><i>Women, Politics, and Power: A Global Perspective</i></a>. CQ Press. p.&nbsp;107. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-48-337701-8" title="Special:BookSources/978-1-48-337701-8"><bdi>978-1-48-337701-8</bdi></a><span>. Retrieved <span>25 July</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-87">
+ <span><b><a href="#cite_ref-87">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=11936791">"Jacinda Ardern sworn in as new Prime Minister"</a>. <i>New Zealand Herald</i>. 26 October 2017<span>. Retrieved <span>26 October</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-88">
+ <span><b><a href="#cite_ref-88">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.stuff.co.nz/national/politics/86217670/female-political-leaders-have-been-smashing-glass-ceilings-for-ages">"Female political leaders have been smashing glass ceilings for ages"</a>. <i><a href="http://fakehost/wiki/Stuff.co.nz" title="Stuff.co.nz">Stuff.co.nz</a></i>. Fairfax NZ. 27 October 2017<span>. Retrieved <span>19 July</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-89">
+ <span><b><a href="#cite_ref-89">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.courtsofnz.govt.nz/about-the-judiciary/role-judges/role-chief">"Role of the Chief Justice"</a>. Courts of New Zealand<span>. Retrieved <span>9 June</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-90">
+ <span><b><a href="#cite_ref-90">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.courtsofnz.govt.nz/about-the-judiciary/structure-of-the-court-system">"Structure of the court system"</a>. Courts of New Zealand<span>. Retrieved <span>9 June</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-91">
+ <span><b><a href="#cite_ref-91">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101124005516/http://justice.govt.nz/courts/the-judiciary">"The Judiciary"</a>. <a href="http://fakehost/wiki/Minister_of_Justice_(New_Zealand)" title="Minister of Justice (New Zealand)">Ministry of Justice</a>. Archived from <a rel="nofollow" href="http://www.justice.govt.nz/courts/the-judiciary">the original</a> on 24 November 2010<span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-92">
+ <span><b><a href="#cite_ref-92">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20170204213240/http://fsi.fundforpeace.org/rankings-2016">"The Fragile States Index 2016"</a>. The Fund for Peace. Archived from <a rel="nofollow" href="http://fsi.fundforpeace.org/rankings-2016">the original</a> on 4 February 2017<span>. Retrieved <span>30 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-93">
+ <span><b><a href="#cite_ref-93">^</a></b></span> <span><cite><a rel="nofollow" href="http://pages.eiu.com/rs/753-RIQ-438/images/Democracy_Index_2017.pdf">"Democracy Index 2017"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Economist_Intelligence_Unit" title="Economist Intelligence Unit">Economist Intelligence Unit</a>. 2018. p.&nbsp;5<span>. Retrieved <span>9 December</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-94">
+ <span><b><a href="#cite_ref-94">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.transparency.org/news/feature/corruption_perceptions_index_2017">"Corruption Perceptions Index 2017"</a>. <a href="http://fakehost/wiki/Transparency_International" title="Transparency International">Transparency International</a>. 21 February 2018<span>. Retrieved <span>9 December</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-95">
+ <span><b><a href="#cite_ref-95">^</a></b></span> <span><cite><a rel="nofollow" href="https://2009-2017.state.gov/j/drl/rls/hrrpt/humanrightsreport/index.htm?year=2017&amp;dlid=277105">"New Zealand"</a>. <i>Country Reports on Human Rights Practices for 2017</i>. <a href="http://fakehost/wiki/United_States_Department_of_State" title="United States Department of State">United States Department of State</a><span>. Retrieved <span>9 December</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-96">
+ <span><b><a href="#cite_ref-96">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.oecdbetterlifeindex.org/countries/new-zealand/">"New Zealand"</a>. OECD Better Life Index. 2016<span>. Retrieved <span>30 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-97">
+ <span><b><a href="#cite_ref-97">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.teara.govt.nz/en/1966/history-constitutional/10"><i>External Relations</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-98">
+ <span><b><a href="#cite_ref-98">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/people/michael-joseph-savage-biography">"Michael Joseph Savage"</a>. Ministry for Culture and Heritage. July 2010<span>. Retrieved <span>29 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-99">
+ <span><b><a href="#cite_ref-99">^</a></b></span> <span><cite>Patman, Robert (2005). <a rel="nofollow" href="https://web.archive.org/web/20070925192858/http://www.victoria.ac.nz/css/docs/Working_Papers/WP21.pdf">"Globalisation, Sovereignty, and the Transformation of New Zealand Foreign Policy"</a> <span>(PDF)</span>. <i>Working Paper 21/05</i>. Centre for Strategic Studies, Victoria University of Wellington. p.&nbsp;8. Archived from <a rel="nofollow" href="http://www.victoria.ac.nz/css/docs/Working_Papers/WP21.pdf">the original</a> <span>(PDF)</span> on 25 September 2007<span>. Retrieved <span>12 March</span> 2007</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-100">
+ <span><b><a href="#cite_ref-100">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110629153135/http://www.australianpolitics.com/foreign/anzus/anzus-treaty.shtml">"Department Of External Affairs: Security Treaty between Australia, New Zealand and the United States of America"</a>. <a href="http://fakehost/wiki/Government_of_Australia" title="Government of Australia">Australian Government</a>. September 1951. Archived from <a rel="nofollow" href="http://www.australianpolitics.com/foreign/anzus/anzus-treaty.shtml">the original</a> on 29 June 2011<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-101">
+ <span><b><a href="#cite_ref-101">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/vietnam-war">"The Vietnam War"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. June 2008<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-102">
+ <span><b><a href="#cite_ref-102">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/politics/nuclear-free-new-zealand/rainbow-warrior">"Sinking the Rainbow Warrior – nuclear-free New Zealand"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. August 2008<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-103">
+ <span><b><a href="#cite_ref-103">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/politics/nuclear-free-new-zealand/nuclear-free-zone">"Nuclear-free legislation – nuclear-free New Zealand"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. August 2008<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-104">
+ <span><b><a href="#cite_ref-104">^</a></b></span> <span><cite><a href="http://fakehost/wiki/David_Lange" title="David Lange">Lange, David</a> (1990). <i>Nuclear Free: The New Zealand Way</i>. New Zealand: <a href="http://fakehost/wiki/Penguin_Books" title="Penguin Books">Penguin Books</a>. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-14-014519-2" title="Special:BookSources/0-14-014519-2"><bdi>0-14-014519-2</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-105">
+ <span><b><a href="#cite_ref-105">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101222174922/http://www.dfat.gov.au/aib/history.html">"Australia in brief"</a>. <a href="http://fakehost/wiki/Department_of_Foreign_Affairs_and_Trade_(Australia)" title="Department of Foreign Affairs and Trade (Australia)">Australian Department of Foreign Affairs and Trade</a>. Archived from <a rel="nofollow" href="http://www.dfat.gov.au/aib/history.html">the original</a> on 22 December 2010<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZ_in_brief-106">
+ <span>^ <a href="#cite_ref-NZ_in_brief_106-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_in_brief_106-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.dfat.gov.au/geo/new_zealand/nz_country_brief.html">"New Zealand country brief"</a>. Australian Department of Foreign Affairs and Trade<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-107">
+ <span><b><a href="#cite_ref-107">^</a></b></span> <span><cite>Collett, John (4 September 2013). <a rel="nofollow" href="http://www.smh.com.au/money/super-and-funds/kiwis-face-hurdles-in-pursuit-of-lost-funds-20130903-2t1jl.html#ixzz2glaaulCe">"Kiwis face hurdles in pursuit of lost funds"</a><span>. Retrieved <span>4 October</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-108">
+ <span><b><a href="#cite_ref-108">^</a></b></span> <span><cite>Bertram, Geoff (April 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/south-pacific-economic-relations/4">"South Pacific economic relations – Aid, remittances and tourism"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-109">
+ <span><b><a href="#cite_ref-109">^</a></b></span> <span><cite>Howes, Stephen (November 2010). <a rel="nofollow" href="http://devpolicy.org/making-migration-work-lessons-from-new-zealand/">"Making migration work: Lessons from New Zealand"</a>. Development Policy Centre<span>. Retrieved <span>23 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-110">
+ <span><b><a href="#cite_ref-110">^</a></b></span> <span><cite>Ayele, Yoseph (28 September 2017). <a rel="nofollow" href="https://stories.ehf.org/the-growing-momentum-for-global-impact-in-new-zealand-13bdc5597ad2">"The Growing Momentum for Global Impact in New Zealand"</a>. <i>Edmund Hillary Fellowship</i><span>. Retrieved <span>9 July</span> 2019</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-111">
+ <span><b><a href="#cite_ref-111">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.un.org/en/members/index.shtml#n">"Member States of the United Nations"</a>. United Nations<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-112">
+ <span><b><a href="#cite_ref-112">^</a></b></span> <span><cite><a rel="nofollow" href="http://thecommonwealth.org/our-member-countries/new-zealand">"New Zealand"</a>. The Commonwealth<span>. Retrieved <span>1 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-113">
+ <span><b><a href="#cite_ref-113">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.oecd.org/pages/0,3417,en_36734052_36761800_1_1_1_1_1,00.html">"Members and partners"</a>. Organisation for Economic Co-operation and Development<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-114">
+ <span><b><a href="#cite_ref-114">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.aspistrategist.org.au/the-future-of-the-five-power-defence-arrangements/">"The future of the Five Power Defence Arrangements"</a>. The Strategist. 8 November 2012<span>. Retrieved <span>1 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-115">
+ <span><b><a href="#cite_ref-115">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzdf.mil.nz/about-us/">"About Us: Role and Responsibilities"</a>. New Zealand Defence Force<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-116">
+ <span><b><a href="#cite_ref-116">^</a></b></span> <span><cite>Ayson, Robert (2007). "New Zealand Defence and Security Policy,1990–2005". In Alley, Roderic (ed.). <i>New Zealand In World Affairs, Volume IV: 1990–2005</i>. Wellington: <a href="http://fakehost/wiki/Victoria_University_Press" title="Victoria University Press">Victoria University Press</a>. p.&nbsp;132. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-86473-548-5" title="Special:BookSources/978-0-86473-548-5"><bdi>978-0-86473-548-5</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-117">
+ <span><b><a href="#cite_ref-117">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/the-battle-for-crete">"The Battle for Crete"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. May 2010<span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-118">
+ <span><b><a href="#cite_ref-118">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/the-north-african-campaign/el-alamein">"El Alamein – The North African Campaign"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. May 2009<span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-119">
+ <span><b><a href="#cite_ref-119">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Richard_Holmes_(military_historian)" title="Richard Holmes (military historian)">Holmes, Richard</a> (September 2010). <a rel="nofollow" href="http://www.bbc.co.uk/history/worldwars/wwtwo/battle_cassino_01.shtml">"World War Two: The Battle of Monte Cassino"</a><span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-120">
+ <span><b><a href="#cite_ref-120">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=10122323">"Gallipoli stirred new sense of national identity says Clark"</a>. <i>New Zealand Herald</i>. April 2005<span>. Retrieved <span>9 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-121">
+ <span><b><a href="#cite_ref-121">^</a></b></span> <span><cite>Prideaux, Bruce (2007). Ryan, Chris (ed.). <i>Battlefield tourism: history, place and interpretation</i>. <a href="http://fakehost/wiki/Elsevier" title="Elsevier">Elsevier</a> Science. p.&nbsp;18. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-08-045362-0" title="Special:BookSources/978-0-08-045362-0"><bdi>978-0-08-045362-0</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-122">
+ <span><b><a href="#cite_ref-122">^</a></b></span> <span><cite>Burke, Arthur. <a rel="nofollow" href="https://web.archive.org/web/20101226110037/http://www.anzacday.org.au/spirit/spirit2.html">"The Spirit of ANZAC"</a>. ANZAC Day Commemoration Committee. Archived from <a rel="nofollow" href="http://www.anzacday.org.au/spirit/spirit2.html">the original</a> on 26 December 2010<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-123">
+ <span><b><a href="#cite_ref-123">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/the-south-african-boer-war/introduction">"South African War 1899–1902"</a>. Ministry for Culture and Heritage. February 2009<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-124">
+ <span><b><a href="#cite_ref-124">^</a></b></span> <span><cite><a rel="nofollow" href="https://nzhistory.govt.nz/war/korean-war">"New Zealand in the Korean War"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage<span>. Retrieved <span>1 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-125">
+ <span><b><a href="#cite_ref-125">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/war/the-malayan-emergency">"NZ and the Malayan Emergency"</a>. Ministry for Culture and Heritage. August 2010<span>. Retrieved <span>11 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-126">
+ <span><b><a href="#cite_ref-126">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20080125104529/http://www.nzdf.mil.nz/operations/default.htm">"New Zealand Defence Force Overseas Operations"</a>. <a href="http://fakehost/wiki/New_Zealand_Defence_Force" title="New Zealand Defence Force">New Zealand Defence Force</a>. January 2008. Archived from <a rel="nofollow" href="http://www.nzdf.mil.nz/operations/default.htm">the original</a> on 25 January 2008<span>. Retrieved <span>17 February</span> 2008</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-nine_provinces-127">
+ <span>^ <a href="#cite_ref-nine_provinces_127-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-nine_provinces_127-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.library.otago.ac.nz/pdf/hoc_fr_bulletins/31_bulletin.pdf">"New Zealand's Nine Provinces (1853–76)"</a> <span>(PDF)</span>. <i>Friends of the Hocken Collections</i>. University of Otago. March 2000<span>. Retrieved <span>13 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-128">
+ <span><b><a href="#cite_ref-128">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/provinces-and-provincial-districts/3"><i>Provincial Divergencies</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>7 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-129">
+ <span><b><a href="#cite_ref-129">^</a></b></span> <span><cite>Swarbrick, Nancy (September 2016). <a rel="nofollow" href="http://TeAra.govt.nz/en/public-holidays">"Public holidays"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>25 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-130">
+ <span><b><a href="#cite_ref-130">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/regional-rugby/overview">"Overview – regional rugby"</a>. Ministry for Culture and Heritage. September 2010<span>. Retrieved <span>13 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-131">
+ <span><b><a href="#cite_ref-131">^</a></b></span> <span><cite>Dollery, Brian; Keogh, Ciaran; Crase, Lin (2007). <a rel="nofollow" href="https://web.archive.org/web/20070829001212/http://www.anzrsai.org/system/files/f8/f9/f39/f40/o186//Dollery%20sustaining%20regions%20article.pdf">"Alternatives to Amalgamation in Australian Local Government: Lessons from the New Zealand Experience"</a> <span>(PDF)</span>. <i>Sustaining Regions</i>. <b>6</b> (1): 50–69. Archived from <a rel="nofollow" href="http://www.anzrsai.org/system/files/f8/f9/f39/f40/o186//Dollery%20sustaining%20regions%20article.pdf">the original</a> <span>(PDF)</span> on 29 August 2007.</cite></span>
+
+ </li>
+ <li id="cite_note-Sancton2000-132">
+ <span>^ <a href="#cite_ref-Sancton2000_132-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Sancton2000_132-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Sancton2000_132-2"><sup><i><b>c</b></i></sup></a></span> <span><cite>Sancton, Andrew (2000). <i>Merger mania: the assault on local government</i>. <a href="http://fakehost/wiki/McGill-Queen%27s_University_Press" title="McGill-Queen's University Press">McGill-Queen's University Press</a>. p.&nbsp;84. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-7735-2163-1" title="Special:BookSources/0-7735-2163-1"><bdi>0-7735-2163-1</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-133">
+ <span><b><a href="#cite_ref-133">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110610051916/http://www.stats.govt.nz/~/media/Statistics/Methods%20and%20Services/Tables/Subnational%20population%20estimates/subpopest2001-10.ashx">"Subnational population estimates at 30 June 2010 (boundaries at 1 November 2010)"</a>. Statistics New Zealand. 26 October 2010. Archived from <a rel="nofollow" href="http://www.stats.govt.nz/~/media/Statistics/Methods%20and%20Services/Tables/Subnational%20population%20estimates/subpopest2001-10.ashx">the original</a> on 10 June 2011<span>. Retrieved <span>2 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTESmeltJui_Lin200933-134">
+ <span><b><a href="#cite_ref-FOOTNOTESmeltJui_Lin200933_134-0">^</a></b></span> <span><a href="#CITEREFSmeltJui_Lin2009">Smelt &amp; Jui Lin 2009</a>, p.&nbsp;33.</span>
+ </li>
+ <li id="cite_note-glossary-135">
+ <span>^ <a href="#cite_ref-glossary_135-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-glossary_135-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.localcouncils.govt.nz/lgip.nsf/wpgurl/Resources-Glossary-Index">"Glossary"</a>. Department of Internal Affairs<span>. Retrieved <span>28 August</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-136">
+ <span><b><a href="#cite_ref-136">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1995/0041/latest/whole.html">"Chatham Islands Council Act 1995 No 41"</a>. New Zealand Parliamentary Counsel Office. 29 July 1995<span>. Retrieved <span>8 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-137">
+ <span><b><a href="#cite_ref-137">^</a></b></span> <span><cite>Gimpel, Diane (2011). <a rel="nofollow" href="https://books.google.com/books?id=Hvqnkc5nP54C&amp;pg=PA22"><i>Monarchies</i></a>. ABDO Publishing Company. p.&nbsp;22. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-617-14792-0" title="Special:BookSources/978-1-617-14792-0"><bdi>978-1-617-14792-0</bdi></a><span>. Retrieved <span>18 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-138">
+ <span><b><a href="#cite_ref-138">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101113024046/http://www.gov.nu/wb/pages/system-of-government-fakatokaaga-he-fakatufono.php">"System of Government"</a>. Government of Niue. Archived from <a rel="nofollow" href="http://www.gov.nu/wb/pages/system-of-government-fakatokaaga-he-fakatufono.php">the original</a> on 13 November 2010<span>. Retrieved <span>13 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-139">
+ <span><b><a href="#cite_ref-139">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.ck/govt.htm#con">"Government – Structure, Personnel"</a>. Government of the Cook Islands<span>. Retrieved <span>13 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-140">
+ <span><b><a href="#cite_ref-140">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.tokelau.org.nz/Tokelau+Government.html">"Tokelau Government"</a>. Government of Tokelau<span>. Retrieved <span>16 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-141">
+ <span><b><a href="#cite_ref-141">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.antarcticanz.govt.nz/scott-base">"Scott Base"</a>. <a href="http://fakehost/wiki/Antarctica_New_Zealand" title="Antarctica New Zealand">Antarctica New Zealand</a><span>. Retrieved <span>13 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-142">
+ <span><b><a href="#cite_ref-142">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1977/0061/latest/whole.html">"Citizenship Act 1977 No 61"</a>. Zealand Parliamentary Counsel Office. 1 December 1977<span>. Retrieved <span>26 May</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-143">
+ <span><b><a href="#cite_ref-143">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Services-Citizenship-Check-if-you%E2%80%99re-a-New-Zealand-citizen?OpenDocument">"Check if you're a New Zealand citizen"</a>. Department of Internal Affairs<span>. Retrieved <span>20 January</span> 2015</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-145">
+ <span><b><a href="#cite_ref-145">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/cook-strait/1"><i>The Sea Floor</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>13 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-146">
+ <span><b><a href="#cite_ref-146">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101225020855/http://www.aucklandcity.govt.nz/auckland/introduction/hauraki/default.asp">"Hauraki Gulf islands"</a>. <a href="http://fakehost/wiki/Auckland_City_Council" title="Auckland City Council">Auckland City Council</a>. Archived from <a rel="nofollow" href="http://www.aucklandcity.govt.nz/auckland/introduction/hauraki/default.asp">the original</a> on 25 December 2010<span>. Retrieved <span>13 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-147">
+ <span><b><a href="#cite_ref-147">^</a></b></span> <span><cite>Hindmarsh (2006). <a rel="nofollow" href="https://web.archive.org/web/20110511071150/http://www.historic.org.nz/en/Publications/HeritageNZMagazine/HeritageNz2006/HNZ06-DiscoveringDUrville.aspx">"Discovering D'Urville"</a>. Heritage New Zealand. Archived from <a rel="nofollow" href="http://www.historic.org.nz/en/Publications/HeritageNZMagazine/HeritageNz2006/HNZ06-DiscoveringDUrville.aspx">the original</a> on 11 May 2011<span>. Retrieved <span>13 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-148">
+ <span><b><a href="#cite_ref-148">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110123074649/http://www.auckland-coastguard.org.nz/Information/Distance%2BTables.html">"Distance tables"</a>. Auckland Coastguard. Archived from <a rel="nofollow" href="http://www.auckland-coastguard.org.nz/Information/Distance+Tables.html">the original</a> on 23 January 2011<span>. Retrieved <span>2 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-149">
+ <span><b><a href="#cite_ref-149">^</a></b></span> <span><cite>McKenzie, D. W. (1987). <i>Heinemann New Zealand atlas</i>. <a href="http://fakehost/wiki/Heinemann_(publisher)" title="Heinemann (publisher)">Heinemann Publishers</a>. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-7900-0187-X" title="Special:BookSources/0-7900-0187-X"><bdi>0-7900-0187-X</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-CIA-150">
+ <span>^ <a href="#cite_ref-CIA_150-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-CIA_150-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-CIA_150-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-CIA_150-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-CIA_150-4"><sup><i><b>e</b></i></sup></a> <a href="#cite_ref-CIA_150-5"><sup><i><b>f</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">"CIA – The World Factbook"</a>. Cia.gov<span>. Retrieved <span>4 May</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-151">
+ <span><b><a href="#cite_ref-151">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20100522061011/http://www2.stats.govt.nz/domino/external/PASFull/pasfull.nsf/84bf91b1a7b5d7204c256809000460a4/4c2567ef00247c6acc25697a00043f15?OpenDocument">"Geography"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 1999. Archived from <a rel="nofollow" href="http://www2.stats.govt.nz/domino/external/PASFull/pasfull.nsf/84bf91b1a7b5d7204c256809000460a4/4c2567ef00247c6acc25697a00043f15?OpenDocument">the original</a> on 22 May 2010<span>. Retrieved <span>21 December</span> 2009</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-152">
+ <span><b><a href="#cite_ref-152">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mfe.govt.nz/sites/default/files/offshore-options-jun05.pdf"><i>Offshore Options: Managing Environmental Effects in New Zealand's Exclusive Economic Zone</i></a> <span>(PDF)</span>. Wellington: <a href="http://fakehost/wiki/Ministry_for_the_Environment_(New_Zealand)" title="Ministry for the Environment (New Zealand)">Ministry for the Environment</a>. 2005. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-478-25916-6" title="Special:BookSources/0-478-25916-6"><bdi>0-478-25916-6</bdi></a><span>. Retrieved <span>23 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-153">
+ <span><b><a href="#cite_ref-153">^</a></b></span> <span><cite>Coates, Glen (2002). <i>The rise and fall of the Southern Alps</i>. Canterbury University Press. p.&nbsp;15. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-908812-93-0" title="Special:BookSources/0-908812-93-0"><bdi>0-908812-93-0</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEGarden200552-154">
+ <span><b><a href="#cite_ref-FOOTNOTEGarden200552_154-0">^</a></b></span> <span><a href="#CITEREFGarden2005">Garden 2005</a>, p.&nbsp;52.</span>
+ </li>
+ <li id="cite_note-155">
+ <span><b><a href="#cite_ref-155">^</a></b></span> <span><cite>Grant, David (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/southland-places/10">"Southland places – Fiordland's coast"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>14 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-156">
+ <span><b><a href="#cite_ref-156">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101229222806/http://www.doc.govt.nz/parks-and-recreation/national-parks/tongariro/features/central-north-island-volcanoes/">"Central North Island volcanoes"</a>. Department of Conservation. Archived from <a rel="nofollow" href="http://www.doc.govt.nz/parks-and-recreation/national-parks/tongariro/features/central-north-island-volcanoes/">the original</a> on 29 December 2010<span>. Retrieved <span>14 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-157">
+ <span><b><a href="#cite_ref-157">^</a></b></span> <span><cite>Walrond, Carl (March 2009). <a rel="nofollow" href="http://www.teara.govt.nz/en/natural-environment/1">"Natural environment – Geography and geology"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>14 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-158">
+ <span><b><a href="#cite_ref-158">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110324025353/http://www.geonet.org.nz/volcano/activity/taupo/about.html">"Taupo"</a>. <a href="http://fakehost/wiki/GNS_Science" title="GNS Science">GNS Science</a>. Archived from <a rel="nofollow" href="http://www.geonet.org.nz/volcano/activity/taupo/about.html">the original</a> on 24 March 2011<span>. Retrieved <span>2 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Keith_2009-159">
+ <span>^ <a href="#cite_ref-Keith_2009_159-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Keith_2009_159-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Lewis, Keith; Nodder, Scott; Carter, Lionel (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/sea-floor-geology/2">"Sea floor geology – Active plate boundaries"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-160">
+ <span><b><a href="#cite_ref-160">^</a></b></span> <span><cite>Wallis, G. P.; Trewick, S. A. (2009). "New Zealand phylogeography: evolution on a small continent". <i>Molecular Ecology</i>. <b>18</b> (17): 3548–3580. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1111%2Fj.1365-294X.2009.04294.x">10.1111/j.1365-294X.2009.04294.x</a>. <a href="http://fakehost/wiki/PubMed_Identifier" title="PubMed Identifier">PMID</a>&nbsp;<a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pubmed/19674312">19674312</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-161">
+ <span><b><a href="#cite_ref-161">^</a></b></span> <span><cite>Wright, Dawn; Bloomer, Sherman; MacLeod, Christopher; Taylor, Brian; Goodliffe, Andrew (2000). "Bathymetry of the Tonga Trench and Forearc: A Map Series". <i>Marine Geophysical Researches</i>. <b>21</b> (5): 489–512. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/2000MarGR..21..489W">2000MarGR..21..489W</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1023%2FA%3A1026514914220">10.1023/A:1026514914220</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZOD-162">
+ <span><b><a href="#cite_ref-NZOD_162-0">^</a></b></span> <span><cite>"Australasia". <i>New Zealand Oxford Dictionary</i>. Oxford University Press. 2005. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1093%2Facref%2F9780195584516.001.0001">10.1093/acref/9780195584516.001.0001</a>. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9780195584516" title="Special:BookSources/9780195584516"><bdi>9780195584516</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-163">
+ <span><b><a href="#cite_ref-163">^</a></b></span> <span><cite>Hobbs, Joseph J. (2016). <a rel="nofollow" href="https://books.google.com/books?id=0rUaCgAAQBAJ&amp;pg=PA367"><i>Fundamentals of World Regional Geography</i></a>. Cengage Learning. p.&nbsp;367. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9781305854956" title="Special:BookSources/9781305854956"><bdi>9781305854956</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-164">
+ <span><b><a href="#cite_ref-164">^</a></b></span> <span><cite>Hillstrom, Kevin; Hillstrom, Laurie Collier (2003). <i>Australia, Oceania, and Antarctica: A Continental Overview of Environmental Issues</i>. <b>3</b>. ABC-CLIO. p.&nbsp;25. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9781576076941" title="Special:BookSources/9781576076941"><bdi>9781576076941</bdi></a>. <q>…defined here as the continent nation of Australia, New Zealand, and twenty-two other island countries and territories sprinkled over more than 40 million square kilometres of the South Pacific.</q></cite></span>
+
+ </li>
+ <li id="cite_note-Mullan2009-165">
+ <span>^ <a href="#cite_ref-Mullan2009_165-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Mullan2009_165-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Mullan, Brett; Tait, Andrew; Thompson, Craig (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/climate/1">"Climate – New Zealand's climate"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>15 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-niwa-166">
+ <span><b><a href="#cite_ref-niwa_166-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.niwa.co.nz/education-and-training/schools/resources/climate/extreme">"Summary of New Zealand climate extremes"</a>. <a href="http://fakehost/wiki/National_Institute_of_Water_and_Atmospheric_Research" title="National Institute of Water and Atmospheric Research">National Institute of Water and Atmospheric Research</a>. 2004<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-167">
+ <span><b><a href="#cite_ref-167">^</a></b></span> <span><cite>Walrond, Carl (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/natural-environment/3">"Natural environment – Climate"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>15 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-168">
+ <span><b><a href="#cite_ref-168">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110503221956/http://www.niwa.co.nz/__data/assets/file/0006/44268/rain.xls">"Mean monthly rainfall"</a>. National Institute of Water and Atmospheric Research. Archived from <a rel="nofollow" href="http://www.niwa.co.nz/__data/assets/file/0006/44268/rain.xls">the original</a> <span>(XLS)</span> on 3 May 2011<span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-169">
+ <span><b><a href="#cite_ref-169">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20081015102420/http://www.niwascience.co.nz/__data/assets/file/0006/44655/sunshine.xls">"Mean monthly sunshine hours"</a>. National Institute of Water and Atmospheric Research. Archived from <a rel="nofollow" href="http://www.niwascience.co.nz/__data/assets/file/0006/44655/sunshine.xls">the original</a> <span>(XLS)</span> on 15 October 2008<span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-170">
+ <span><b><a href="#cite_ref-170">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.newzealand.com/int/feature/new-zealand-climate-and-weather/">"New Zealand climate and weather"</a>. Tourism New Zealand<span>. Retrieved <span>13 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-171">
+ <span><b><a href="#cite_ref-171">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.niwa.co.nz/education-and-training/schools/resources/climate">"Climate data and activities"</a>. National Institute of Water and Atmospheric Research<span>. Retrieved <span>11 February</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-172">
+ <span><b><a href="#cite_ref-172">^</a></b></span> <span><cite>Cooper, R.; Millener, P. (1993). "The New Zealand biota: Historical background and new research". <i>Trends in Ecology &amp; Evolution</i>. <b>8</b> (12): 429. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1016%2F0169-5347%2893%2990004-9">10.1016/0169-5347(93)90004-9</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-173">
+ <span><b><a href="#cite_ref-173">^</a></b></span> <span>Trewick SA, Morgan-Richards M. 2014. New Zealand Wild Life. Penguin, New Zealand.</span>
+ <span><a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9780143568896" title="Special:BookSources/9780143568896">9780143568896</a></span>
+ </li>
+ <li id="cite_note-174">
+ <span><b><a href="#cite_ref-174">^</a></b></span> <span><cite>Lindsey, Terence; Morris, Rod (2000). <i>Collins Field Guide to New Zealand Wildlife</i>. <a href="http://fakehost/wiki/HarperCollins" title="HarperCollins">HarperCollins</a> (New Zealand) Limited. p.&nbsp;14. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-86950-300-0" title="Special:BookSources/978-1-86950-300-0"><bdi>978-1-86950-300-0</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-FAQ-175">
+ <span>^ <a href="#cite_ref-FAQ_175-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FAQ_175-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.nzpcn.org.nz/page.asp?help_faqs_NZ_plants">"Frequently asked questions about New Zealand plants"</a>. <a href="http://fakehost/wiki/New_Zealand_Plant_Conservation_Network" title="New Zealand Plant Conservation Network">New Zealand Plant Conservation Network</a>. May 2010<span>. Retrieved <span>15 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZPCN_2006-176">
+ <span><b><a href="#cite_ref-NZPCN_2006_176-0">^</a></b></span> <span><cite>De Lange, Peter James; Sawyer, John William David &amp; Rolfe, Jeremy (2006). <i>New Zealand indigenous vascular plant checklist</i>. New Zealand Plant Conservation Network. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-473-11306-6" title="Special:BookSources/0-473-11306-6"><bdi>0-473-11306-6</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-177">
+ <span><b><a href="#cite_ref-177">^</a></b></span> <span><cite>Wassilieff, Maggy (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/lichens/2">"Lichens – Lichens in New Zealand"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>16 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-178">
+ <span><b><a href="#cite_ref-178">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2010) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/forests-indigenous/4"><i>Mixed Broadleaf Podocarp and Kauri Forest</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-179">
+ <span><b><a href="#cite_ref-179">^</a></b></span> <span><cite>Mark, Alan (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/grasslands/1">"Grasslands – Tussock grasslands"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>17 January</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-180">
+ <span><b><a href="#cite_ref-180">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.fao.org/docrep/w7730e/w7730e09.htm#new%20zealand">"Commentary on Forest Policy in the Asia-Pacific Region (A Review for Indonesia, Malaysia, New Zealand, Papua New Guinea, Philippines, Thailand and Western Samoa)"</a>. Forestry Department. 1997<span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-181">
+ <span><b><a href="#cite_ref-181">^</a></b></span> <span><cite>McGlone, M.S. (1989). <a rel="nofollow" href="https://web.archive.org/web/20140717220413/http://nzes.org.nz/nzje/free_issues/NZJEcol12_s_115.pdf">"The Polynesian settlement of New Zealand in relation to environmental and biotic changes"</a> <span>(PDF)</span>. <i>New Zealand Journal of Ecology</i>. 12(S): 115–129. Archived from <a rel="nofollow" href="http://nzes.org.nz/nzje/free_issues/NZJEcol12_s_115.pdf">the original</a> <span>(PDF)</span> on 17 July 2014.</cite></span>
+
+ </li>
+ <li id="cite_note-182">
+ <span><b><a href="#cite_ref-182">^</a></b></span> <span>Taylor, R. and Smith, I. (1997). <a rel="nofollow" href="http://www.mfe.govt.nz/publications/ser/ser1997/index.html">The state of New Zealand’s environment 1997</a>. Ministry for the Environment, Wellington.</span>
+ </li>
+ <li id="cite_note-183">
+ <span><b><a href="#cite_ref-183">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.terranature.org/flightlessbirds.htm">"New Zealand ecology: Flightless birds"</a>. TerraNature<span>. Retrieved <span>17 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Holdaway2009-184">
+ <span>^ <a href="#cite_ref-Holdaway2009_184-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Holdaway2009_184-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Holdaway, Richard (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/extinctions/4">"Extinctions – New Zealand extinctions since human arrival"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-185">
+ <span><b><a href="#cite_ref-185">^</a></b></span> <span><cite>Kirby, Alex (January 2005). <a rel="nofollow" href="http://news.bbc.co.uk/2/hi/science/nature/4138147.stm">"Huge eagles 'dominated NZ skies<span>'</span>"</a>. <i>BBC News</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-186">
+ <span><b><a href="#cite_ref-186">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20150129135945/http://www.doc.govt.nz/conservation/native-animals/reptiles-and-frogs/">"Reptiles and frogs"</a>. Department of Conservation. Archived from <a rel="nofollow" href="http://www.doc.govt.nz/conservation/native-animals/reptiles-and-frogs">the original</a> on 29 January 2015<span>. Retrieved <span>25 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-187">
+ <span><b><a href="#cite_ref-187">^</a></b></span> <span><cite>Pollard, Simon (September 2007). <a rel="nofollow" href="https://teara.govt.nz/en/spiders-and-other-arachnids">"Spiders and other arachnids"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>25 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-188">
+ <span><b><a href="#cite_ref-188">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.doc.govt.nz/nature/native-animals/invertebrates/weta/">"Wētā"</a>. Department of Conservation<span>. Retrieved <span>25 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-189">
+ <span><b><a href="#cite_ref-189">^</a></b></span> <span><cite>Ryan, Paddy (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/snails-and-slugs/2">"Snails and slugs – Flax snails, giant snails and veined slugs"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-190">
+ <span><b><a href="#cite_ref-190">^</a></b></span> <span><cite>Herrera-Flores, Jorge A.; Stubbs, Thomas L.; Benton, Michael J.; Ruta, Marcello (May 2017). "Macroevolutionary patterns in Rhynchocephalia: is the tuatara (Sphenodon punctatus) a living fossil?". <i>Palaeontology</i>. <b>60</b> (3): 319–328. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1111%2Fpala.12284">10.1111/pala.12284</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-191">
+ <span><b><a href="#cite_ref-191">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20070531085218/http://www.science.unsw.edu.au/news/2006/nzmammal.html">"Tiny Bones Rewrite Textbooks, first New Zealand land mammal fossil"</a>. University of New South Wales. 31 May 2007. Archived from <a rel="nofollow" href="http://www.science.unsw.edu.au/news/2006/nzmammal.html">the original</a> on 31 May 2007.</cite></span>
+
+ </li>
+ <li id="cite_note-192">
+ <span><b><a href="#cite_ref-192">^</a></b></span> <span><cite>Worthy, Trevor H.; Tennyson, Alan J. D.; Archer, Michael; Musser, Anne M.; Hand, Suzanne J.; Jones, Craig; Douglas, Barry J.; McNamara, James A.; Beck, Robin M. D. (2006). <a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1697831">"Miocene mammal reveals a Mesozoic ghost lineage on insular New Zealand, southwest Pacific"</a>. <i><a href="http://fakehost/wiki/Proceedings_of_the_National_Academy_of_Sciences_of_the_United_States_of_America" title="Proceedings of the National Academy of Sciences of the United States of America">Proceedings of the National Academy of Sciences of the United States of America</a></i>. <b>103</b> (51): 19419–23. <a href="http://fakehost/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" href="https://ui.adsabs.harvard.edu/abs/2006PNAS..10319419W">2006PNAS..10319419W</a>. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1073%2Fpnas.0605684103">10.1073/pnas.0605684103</a>. <a href="http://fakehost/wiki/PubMed_Central" title="PubMed Central">PMC</a>&nbsp;<span title="Freely accessible"><a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1697831">1697831</a></span>. <a href="http://fakehost/wiki/PubMed_Identifier" title="PubMed Identifier">PMID</a>&nbsp;<a rel="nofollow" href="http://www.ncbi.nlm.nih.gov/pubmed/17159151">17159151</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-193">
+ <span><b><a href="#cite_ref-193">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110308103617/http://www.doc.govt.nz/conservation/native-animals/marine-mammals/">"Marine Mammals"</a>. Department of Conservation. Archived from <a rel="nofollow" href="http://www.doc.govt.nz/conservation/native-animals/marine-mammals/">the original</a> on 8 March 2011<span>. Retrieved <span>17 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-194">
+ <span><b><a href="#cite_ref-194">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.doc.govt.nz/nature/native-animals/birds/sea-and-shore-birds/">"Sea and shore birds"</a>. Department of Conservation<span>. Retrieved <span>7 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-195">
+ <span><b><a href="#cite_ref-195">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.doc.govt.nz/nature/native-animals/birds/birds-a-z/penguins/">"Penguins"</a>. Department of Conservation<span>. Retrieved <span>7 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-196">
+ <span><b><a href="#cite_ref-196">^</a></b></span> <span><cite>Jones, Carl (2002). "Reptiles and Amphibians". In Perrow, Martin; Davy, Anthony (eds.). <i>Handbook of ecological restoration: Principles of Restoration</i>. <b>2</b>. Cambridge University Press. p.&nbsp;362. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-521-79128-6" title="Special:BookSources/0-521-79128-6"><bdi>0-521-79128-6</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-197">
+ <span><b><a href="#cite_ref-197">^</a></b></span> <span><cite>Towns, D.; Ballantine, W. (1993). "Conservation and restoration of New Zealand Island ecosystems". <i>Trends in Ecology &amp; Evolution</i>. <b>8</b> (12): 452. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1016%2F0169-5347%2893%2990009-E">10.1016/0169-5347(93)90009-E</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-198">
+ <span><b><a href="#cite_ref-198">^</a></b></span> <span><cite>Rauzon, Mark (2008). <a rel="nofollow" href="http://marineornithology.org/PDF/35_2/35_2_97-107.pdf">"Island restoration: Exploring the past, anticipating the future"</a> <span>(PDF)</span>. <i>Marine Ornithology</i>. <b>35</b>: 97–107.</cite></span>
+
+ </li>
+ <li id="cite_note-199">
+ <span><b><a href="#cite_ref-199">^</a></b></span> <span><cite>Diamond, Jared (1990). Towns, D; Daugherty, C; Atkinson, I (eds.). <a rel="nofollow" href="http://www.doc.govt.nz/documents/science-and-technical/EcologicalRestorationNZIslands.pdf"><i>New Zealand as an archipelago: An international perspective</i></a> <span>(PDF)</span>. Wellington: Conservation Sciences Publication No. 2. Department of Conservation. pp.&nbsp;3–8.</cite></span>
+
+ </li>
+ <li id="cite_note-200">
+ <span><b><a href="#cite_ref-200">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.imf.org/en/Publications/WEO/Issues/2018/03/20/~/media/Files/Publications/WEO/2018/April/text.ashx?la=en"><i>World Economic Outlook</i></a>. <a href="http://fakehost/wiki/International_Monetary_Fund" title="International Monetary Fund">International Monetary Fund</a>. April 2018. p.&nbsp;63. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-48434-971-7" title="Special:BookSources/978-1-48434-971-7"><bdi>978-1-48434-971-7</bdi></a><span>. Retrieved <span>21 June</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-201">
+ <span><b><a href="#cite_ref-201">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.heritage.org/index/ranking">"Rankings on Economic Freedom"</a>. <a href="http://fakehost/wiki/The_Heritage_Foundation" title="The Heritage Foundation">The Heritage Foundation</a>. 2016<span>. Retrieved <span>30 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-202">
+ <span><b><a href="#cite_ref-202">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.bsi.si/en/financial-data.asp?MapaId=1239">"Currencies of the territories listed in the BS exchange rate lists"</a>. Bank of Slovenia<span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-RWT_export_evolution-203">
+ <span>^ <a href="#cite_ref-RWT_export_evolution_203-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-RWT_export_evolution_203-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-RWT_export_evolution_203-2"><sup><i><b>c</b></i></sup></a></span> <span><cite>McLintock, Alexander, ed. (November 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/trade-external/1"><i>Historical evolution and trade patterns</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>10 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-204">
+ <span><b><a href="#cite_ref-204">^</a></b></span> <span><cite>Stringleman, Hugh; Peden, Robert (October 2009). <a rel="nofollow" href="http://www.teara.govt.nz/en/sheep-farming/5/2">"Sheep farming – Growth of the frozen meat trade, 1882–2001"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>6 May</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-205">
+ <span><b><a href="#cite_ref-205">^</a></b></span> <span><cite>Baker, John (February 2010) [1966]. McLintock, Alexander (ed.). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/standard-of-living/1/1"><i>Some Indicators of Comparative Living Standards</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+ <a rel="nofollow" href="http://www.teara.govt.nz/files/3_308_StandardOfLiving_Comparison_0.pdf">PDF Table</a>
+ </li>
+ <li id="cite_note-206">
+ <span><b><a href="#cite_ref-206">^</a></b></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/history/6">"History – The later 20th century"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>2 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-207">
+ <span><b><a href="#cite_ref-207">^</a></b></span> <span><cite>Nixon, Chris; Yeabsley, John (April 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/overseas-trade-policy/5">"Overseas trade policy – Difficult times – the 1970s and early 1980s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-208">
+ <span><b><a href="#cite_ref-208">^</a></b></span> <span><cite>Evans, N. "Up From Down Under: After a Century of Socialism, Australia and New Zealand are Cutting Back Government and Freeing Their Economies". <i>National Review</i>. <b>46</b> (16): 47–51.</cite></span>
+
+ </li>
+ <li id="cite_note-209">
+ <span><b><a href="#cite_ref-209">^</a></b></span> <span><cite><i>Trade, Food Security, and Human Rights: The Rules for International Trade in Agricultural Products and the Evolving World Food Crisis</i>. Routledge. 2016. p.&nbsp;125. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9781317008521" title="Special:BookSources/9781317008521"><bdi>9781317008521</bdi></a>.</cite></span>
+
+ </li>
+ <li id="cite_note-210">
+ <span><b><a href="#cite_ref-210">^</a></b></span> <span><cite>Wayne Arnold (2 August 2007). <a rel="nofollow" href="https://www.nytimes.com/2007/08/02/business/worldbusiness/02farm.html?pagewanted=all">"Surviving Without Subsidies"</a>. <i><a href="http://fakehost/wiki/The_New_York_Times" title="The New York Times">The New York Times</a></i><span>. Retrieved <span>11 August</span> 2015</span>. <q>... ever since a liberal but free-market government swept to power in 1984 and essentially canceled handouts to farmers ... They went cold turkey and in the process it was very rough on their farming economy</q></cite></span>
+
+ </li>
+ <li id="cite_note-Liberalisation-211">
+ <span><b><a href="#cite_ref-Liberalisation_211-0">^</a></b></span> <span><cite>Easton, Brian (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/economic-history/11">"Economic history – Government and market liberalisation"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>1 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-212">
+ <span><b><a href="#cite_ref-212">^</a></b></span> <span><cite>Hazledine, Tim (1998). <a rel="nofollow" href="https://web.archive.org/web/20110510082643/http://www.ariplex.com/~economic-myth-busters/hazledine-taking%20nz%20seriously.pdf"><i>Taking New Zealand Seriously: The Economics of Decency</i></a> <span>(PDF)</span>. HarperCollins Publishers. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/1-86950-283-3" title="Special:BookSources/1-86950-283-3"><bdi>1-86950-283-3</bdi></a>. Archived from <a rel="nofollow" href="http://www.ariplex.com/~economic-myth-busters/hazledine-taking%20nz%20seriously.pdf">the original</a> <span>(PDF)</span> on 10 May 2011.</cite></span>
+
+ </li>
+ <li id="cite_note-213">
+ <span><b><a href="#cite_ref-213">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stuff.co.nz/travel/396410">"NZ tops Travellers' Choice Awards"</a>. Stuff Travel. May 2008<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-unemployment-214">
+ <span>^ <a href="#cite_ref-unemployment_214-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-unemployment_214-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-unemployment_214-2"><sup><i><b>c</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.socialreport.msd.govt.nz/paid-work/unemployment.html">"Unemployment: the Social Report 2016 – Te pūrongo oranga tangata"</a>. Ministry of Social Development<span>. Retrieved <span>18 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-215">
+ <span><b><a href="#cite_ref-215">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.nytimes.com/2009/06/11/business/global/11nzrate.html">"New Zealand Takes a Pause in Cutting Rates"</a>. <i>The New York Times</i>. 10 June 2009<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-216">
+ <span><b><a href="#cite_ref-216">^</a></b></span> <span><cite><a rel="nofollow" href="http://news.bbc.co.uk/2/hi/business/8120196.stm">"New Zealand's slump longest ever"</a>. <i>BBC News</i>. 26 June 2009<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-217">
+ <span><b><a href="#cite_ref-217">^</a></b></span> <span><cite>Bascand, Geoff (February 2011). <a rel="nofollow" href="https://web.archive.org/web/20110429174323/http://www.stats.govt.nz/browse_for_stats/work_income_and_spending/employment_and_unemployment/HouseholdLabourForceSurvey_MRDec10qtr.aspx">"Household Labour Force Survey: December 2010 quarter – Media Release"</a>. Statistics New Zealand. Archived from <a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/work_income_and_spending/employment_and_unemployment/HouseholdLabourForceSurvey_MRDec10qtr.aspx">the original</a> on 29 April 2011<span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-218">
+ <span><b><a href="#cite_ref-218">^</a></b></span> <span><cite>Davenport, Sally (2004). "Panic and panacea: brain drain and science and technology human capital policy". <i>Research Policy</i>. <b>33</b> (4): 617–630. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1016%2Fj.respol.2004.01.006">10.1016/j.respol.2004.01.006</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-219">
+ <span><b><a href="#cite_ref-219">^</a></b></span> <span><cite>O'Hare, Sean (September 2010). <a rel="nofollow" href="https://www.telegraph.co.uk/expat/expatnews/7973220/New-Zealand-brain-drain-worst-in-world.html">"New Zealand brain-drain worst in world"</a>. <i>The Daily Telegraph</i>. United Kingdom.</cite></span>
+
+ </li>
+ <li id="cite_note-220">
+ <span><b><a href="#cite_ref-220">^</a></b></span> <span><cite>Collins, Simon (March 2005). <a rel="nofollow" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=10114923">"Quarter of NZ's brightest are gone"</a>. <i>New Zealand Herald</i>.</cite></span>
+
+ </li>
+ <li id="cite_note-221">
+ <span><b><a href="#cite_ref-221">^</a></b></span> <span><cite>Winkelmann, Rainer (2000). "The labour market performance of European immigrants in New Zealand in the 1980s and 1990s". <i>The International Migration Review</i>. The Center for Migration Studies of New York. <b>33</b> (1): 33–58. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.2307%2F2676011">10.2307/2676011</a>. <a href="http://fakehost/wiki/JSTOR" title="JSTOR">JSTOR</a>&nbsp;<a rel="nofollow" href="http://www.jstor.org/stable/2676011">2676011</a>.</cite></span>
+ Journal subscription required
+ </li>
+ <li id="cite_note-FOOTNOTEBain200644-222">
+ <span><b><a href="#cite_ref-FOOTNOTEBain200644_222-0">^</a></b></span> <span><a href="#CITEREFBain2006">Bain 2006</a>, p.&nbsp;44.</span>
+ </li>
+ <li id="cite_note-223">
+ <span><b><a href="#cite_ref-223">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.globalinnovationindex.org/userfiles/file/reportpdf/gii-full-report-2016-v1.pdf#">"GII 2016 Report"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Global_Innovation_Index" title="Global Innovation Index">Global Innovation Index</a><span>. Retrieved <span>21 June</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-224">
+ <span><b><a href="#cite_ref-224">^</a></b></span> <span><cite>Groser, Tim (March 2009). <a rel="nofollow" href="https://www.beehive.govt.nz/speech/speech-asean-australia-new-zealand-free-trade-agreement-seminars">"Speech to ASEAN-Australia-New Zealand Free Trade Agreement Seminars"</a>. New Zealand Government<span>. Retrieved <span>30 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-225">
+ <span><b><a href="#cite_ref-225">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mfat.govt.nz/Trade-and-Economic-Relations/NZ-and-the-WTO/Improving-access-to-markets/0-agriculturenegs.php">"Improving Access to Markets:Agriculture"</a>. <a href="http://fakehost/wiki/New_Zealand_Ministry_of_Foreign_Affairs_and_Trade" title="New Zealand Ministry of Foreign Affairs and Trade">New Zealand Ministry of Foreign Affairs and Trade</a><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-226">
+ <span><b><a href="#cite_ref-226">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/infoshare">"Standard International Trade Classification R4 – Exports (Annual-Jun)"</a>. Statistics New Zealand. April 2015<span>. Retrieved <span>3 April</span> 2015</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-GSTC_StatNZ-227">
+ <span>^ <a href="#cite_ref-GSTC_StatNZ_227-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-GSTC_StatNZ_227-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-GSTC_StatNZ_227-2"><sup><i><b>c</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://www.stats.govt.nz/information-releases/goods-and-services-trade-by-country-year-ended-june-2018">"Goods and services trade by country: Year ended June 2018 – corrected"</a>. Statistics New Zealand<span>. Retrieved <span>17 February</span> 2019</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-228">
+ <span><b><a href="#cite_ref-228">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.nytimes.com/2008/04/07/business/worldbusiness/07iht-7tradefw.11718461.html">"China and New Zealand sign free trade deal"</a>. <i>The New York Times</i>. April 2008.</cite></span>
+
+ </li>
+ <li id="cite_note-TourismStats-229">
+ <span>^ <a href="#cite_ref-TourismStats_229-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-TourismStats_229-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.mbie.govt.nz/info-services/sectors-industries/tourism/documents-image-library/key-tourism-statistics.pdf">"Key Tourism Statistics"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Ministry_of_Business,_Innovation_and_Employment" title="Ministry of Business, Innovation and Employment">Ministry of Business, Innovation and Employment</a>. 26 April 2017<span>. Retrieved <span>26 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-230">
+ <span><b><a href="#cite_ref-230">^</a></b></span> <span><cite>Easton, Brian (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/economy/2">"Economy – Agricultural production"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-231">
+ <span><b><a href="#cite_ref-231">^</a></b></span> <span><cite>Stringleman, Hugh; Peden, Robert (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/sheep-farming/7">"Sheep farming – Changes from the 20th century"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-232">
+ <span><b><a href="#cite_ref-232">^</a></b></span> <span><cite>Stringleman, Hugh; Scrimgeour, Frank (November 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/10">"Dairying and dairy products – Dairying in the 2000s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-233">
+ <span><b><a href="#cite_ref-233">^</a></b></span> <span><cite>Stringleman, Hugh; Scrimgeour, Frank (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/11">"Dairying and dairy products – Dairy exports"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-234">
+ <span><b><a href="#cite_ref-234">^</a></b></span> <span><cite>Stringleman, Hugh; Scrimgeour, Frank (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/12">"Dairying and dairy products – Manufacturing and marketing in the 2000s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-235">
+ <span><b><a href="#cite_ref-235">^</a></b></span> <span><cite>Dalley, Bronwyn (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/wine/6">"Wine – The wine boom, 1980s and beyond"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-236">
+ <span><b><a href="#cite_ref-236">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.economist.com/node/10926423">"Wine in New Zealand"</a>. <i>The Economist</i>. 27 March 2008<span>. Retrieved <span>29 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-237">
+ <span><b><a href="#cite_ref-237">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110510042204/http://www.maf.govt.nz/news-resources/statistics-forecasting/international-trade.aspx">"Agricultural and forestry exports from New Zealand: Primary sector export values for the year ending June 2010"</a>. Ministry of Agriculture and Forestry. 14 January 2011. Archived from <a rel="nofollow" href="http://www.maf.govt.nz/news-resources/statistics-forecasting/international-trade.aspx">the original</a> on 10 May 2011<span>. Retrieved <span>8 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Energy2015-238">
+ <span>^ <a href="#cite_ref-Energy2015_238-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Energy2015_238-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20170503234030/http://www.mbie.govt.nz/info-services/sectors-industries/energy/energy-data-modelling/publications/energy-in-new-zealand/energy-in-nz-2016.pdf">Energy in New Zealand 2016</a> <span>(PDF)</span> (Report). Ministry of Business, Innovation and Employment. September 2016. p.&nbsp;47. <a href="http://fakehost/wiki/International_Standard_Serial_Number" title="International Standard Serial Number">ISSN</a>&nbsp;<a rel="nofollow" href="http://www.worldcat.org/issn/2324-5913">2324-5913</a>. Archived from <a rel="nofollow" href="http://www.mbie.govt.nz/info-services/sectors-industries/energy/energy-data-modelling/publications/energy-in-new-zealand/energy-in-nz-2016.pdf">the original</a> <span>(PDF)</span> on 3 May 2017.</cite></span>
+
+ </li>
+ <li id="cite_note-239">
+ <span><b><a href="#cite_ref-239">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.oag.govt.nz/2010/water/part1.htm">"Appendix 1: Technical information about drinking water supply in the eight local authorities"</a>. Office of the Auditor-General<span>. Retrieved <span>2 September</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-240">
+ <span><b><a href="#cite_ref-240">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.gw.govt.nz/water/">"Water supply"</a>. Greater Wellington Regional Council<span>. Retrieved <span>2 September</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-241">
+ <span><b><a href="#cite_ref-241">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzta.govt.nz/roads-and-rail/research-and-data/state-highway-frequently-asked-questions/">"State highway frequently asked questions"</a>. <a href="http://fakehost/wiki/NZ_Transport_Agency" title="NZ Transport Agency">NZ Transport Agency</a><span>. Retrieved <span>28 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-242">
+ <span><b><a href="#cite_ref-242">^</a></b></span> <span><cite>Humphris, Adrian (April 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/public-transport/8">"Public transport – Passenger trends"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-243">
+ <span><b><a href="#cite_ref-243">^</a></b></span> <span><cite>Atkinson, Neill (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/railways/11">"Railways – Rail transformed"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-244">
+ <span><b><a href="#cite_ref-244">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.metlink.org.nz/about-us/">"About Metlink"</a><span>. Retrieved <span>27 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-245">
+ <span><b><a href="#cite_ref-245">^</a></b></span> <span><cite>Atkinson, Neill (April 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/railways/6">"Railways – Freight transport"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-246">
+ <span><b><a href="#cite_ref-246">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.tourismresearch.govt.nz/Documents/International%20Market%20Profiles/Total%20Profile.pdf">"International Visitors"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Ministry_of_Economic_Development_(New_Zealand)" title="Ministry of Economic Development (New Zealand)">Ministry of Economic Development</a>. June 2009<span>. Retrieved <span>30 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-247">
+ <span><b><a href="#cite_ref-247">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20100522203825/http://www.med.govt.nz/templates/MultipageDocumentPage____9038.aspx">"10. Airports"</a>. <i>Infrastructure Stocktake: Infrastructure Audit</i>. Ministry of Economic Development. December 2005. Archived from <a rel="nofollow" href="http://www.med.govt.nz/templates/MultipageDocumentPage____9038.aspx#P5641_412038">the original</a> on 22 May 2010<span>. Retrieved <span>30 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Wilson2010-248">
+ <span>^ <a href="#cite_ref-Wilson2010_248-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2010_248-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Wilson, A. C. (March 2010). <a rel="nofollow" href="https://www.teara.govt.nz/en/telecommunications/page-6">"Telecommunications - Telecom"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>11 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-249">
+ <span><b><a href="#cite_ref-249">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mbie.govt.nz/info-services/sectors-industries/technology-communications/communications/previous-reviews-and-consultations/telecom-separation">"Telecom separation"</a>. Ministry of Business, Innovation and Employment. 14 September 2015<span>. Retrieved <span>11 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-250">
+ <span><b><a href="#cite_ref-250">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.mbie.govt.nz/science-and-technology/it-communications-and-broadband/fast-broadband/broadband-and-mobile-programmes/">"Broadband and mobile programmes - Ministry of Business, Innovation &amp; Employment"</a>. <i>www.mbie.govt.nz</i>.</cite></span>
+
+ </li>
+ <li id="cite_note-251">
+ <span><b><a href="#cite_ref-251">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.itu.int/net4/ITU-D/idi/2017/">"2017 Global ICT Development Index"</a>. International Telecommunication Union (ITU). 2018<span>. Retrieved <span>18 September</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-252">
+ <span><b><a href="#cite_ref-252">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.stats.govt.nz/information-releases/2013-census-usually-resident-population-counts">"2013 Census usually resident population counts"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 14 October 2013<span>. Retrieved <span>20 September</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-253">
+ <span><b><a href="#cite_ref-253">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.stats.govt.nz/information-releases/national-population-projections-2016base2068">"National population projections: 2016(base)–2068"</a> (Press release). Statistics New Zealand. 18 October 2016<span>. Retrieved <span>20 October</span> 2018</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Urban-255">
+ <span><b><a href="#cite_ref-Urban_255-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/methods_and_services/access-data/tables/subnational-pop-estimates.aspx">"Subnational population estimates at 30 June 2009"</a>. Statistics New Zealand. 30 June 2007<span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-256">
+ <span><b><a href="#cite_ref-256">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.mercer.com/newsroom/2016-quality-of-living-survey.html">"Quality of Living Ranking 2016"</a>. London: Mercer. 23 February 2016<span>. Retrieved <span>28 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-257">
+ <span><b><a href="#cite_ref-257">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stuff.co.nz/national/health/10053308/NZ-life-expectancy-among-worlds-best">"NZ life expectancy among world's best"</a>. <i><a href="http://fakehost/wiki/Stuff.co.nz" title="Stuff.co.nz">Stuff.co.nz</a></i>. Fairfax NZ<span>. Retrieved <span>6 July</span> 2014</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-UNtwspop-258">
+ <span>^ <a href="#cite_ref-UNtwspop_258-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-UNtwspop_258-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://fakehost/wiki/United_Nations_Department_of_Economic_and_Social_Affairs" title="United Nations Department of Economic and Social Affairs">Department of Economic and Social Affairs Population Division</a> (2009). <a rel="nofollow" href="https://www.un.org/esa/population/publications/wpp2008/wpp2008_text_tables.pdf">"World Population Prospects"</a> <span>(PDF)</span>. 2008 revision. United Nations<span>. Retrieved <span>29 August</span> 2009</span>.</cite> </span>
+
+ </li>
+ <li id="cite_note-259">
+ <span><b><a href="#cite_ref-259">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">"World Factbook EUROPE&nbsp;: NEW ZEALAND"</a>, <i><a href="http://fakehost/wiki/The_World_Factbook" title="The World Factbook">The World Factbook</a></i>, 12 July 2018</cite></span>
+
+ </li>
+ <li id="cite_note-260">
+ <span><b><a href="#cite_ref-260">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.health.govt.nz/system/files/documents/publications/nz-mortality-statistics-1950-2009-provisional.pdf">"New Zealand mortality statistics: 1950 to 2010"</a> <span>(PDF)</span>. Ministry of Health of New Zealand. 2 March 2011<span>. Retrieved <span>16 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-261">
+ <span><b><a href="#cite_ref-261">^</a></b></span> <span><cite><a rel="nofollow" href="http://stats.oecd.org/Index.aspx?DataSetCode=SHA">"Health expenditure and financing"</a>. <i>stats.oecd.org</i>. <a href="http://fakehost/wiki/OECD" title="OECD">OECD</a>. 2016<span>. Retrieved <span>8 December</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZ_population_data-262">
+ <span><b><a href="#cite_ref-NZ_population_data_262-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/SubnationalPopulationEstimates_HOTPAt30Jun17.aspx">"Subnational Population Estimates: At 30 June 2018 (provisional)"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 23 October 2018<span>. Retrieved <span>23 October</span> 2018</span>.</cite></span>
+ For urban areas, <cite><a rel="nofollow" href="http://nzdotstat.stats.govt.nz/wbos/Index.aspx?DataSetCode=TABLECODE7541">"Subnational population estimates (UA, AU), by age and sex, at 30 June 1996, 2001, 2006-18 (2017 boundaries)"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 23 October 2018<span>. Retrieved <span>23 October</span> 2018</span>.</cite>
+
+ </li>
+ <li id="cite_note-QuickStats_ethnicity-263">
+ <span><b><a href="#cite_ref-QuickStats_ethnicity_263-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/ethnic-groups-NZ.aspx">"2013 Census QuickStats about culture and identity – Ethnic groups in New Zealand"</a>. Statistics New Zealand<span>. Retrieved <span>29 August</span> 2014</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-264">
+ <span><b><a href="#cite_ref-264">^</a></b></span> <span><cite>Pool, Ian (May 2011). <a rel="nofollow" href="https://web.archive.org/web/20170818220947/https://teara.govt.nz/en/graph/28720/new-zealand-population-by-ethnicity-1840-2006">"Population change - Key population trends"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i>. Archived from <a rel="nofollow" href="https://teara.govt.nz/en/graph/28720/new-zealand-population-by-ethnicity-1840-2006">the original</a> on 18 August 2017<span>. Retrieved <span>18 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-265">
+ <span><b><a href="#cite_ref-265">^</a></b></span> <span><cite id="CITEREFDalby1993"><a href="http://fakehost/wiki/Simon_Dalby" title="Simon Dalby">Dalby, Simon</a> (September 1993). "The 'Kiwi disease': geopolitical discourse in Aotearoa/New Zealand and the South Pacific". <i><a href="http://fakehost/wiki/Political_Geography_(journal)" title="Political Geography (journal)">Political Geography</a></i>. <b>12</b> (5): 437–456. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1016%2F0962-6298%2893%2990012-V">10.1016/0962-6298(93)90012-V</a>.</cite></span>
+
+ </li>
+ <li id="cite_note-266">
+ <span><b><a href="#cite_ref-266">^</a></b></span> <span><cite>Callister, Paul (2004). <a rel="nofollow" href="http://panz.rsnz.org/wp-content/uploads/2010/01/nzpr-vol-30-1and-2_callister.pdf">"Seeking an Ethnic Identity: Is "New Zealander" a Valid Ethnic Category?"</a> <span>(PDF)</span>. <i>New Zealand Population Review</i>. <b>30</b> (1&amp;2): 5–22.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEBain200631-267">
+ <span><b><a href="#cite_ref-FOOTNOTEBain200631_267-0">^</a></b></span> <span><a href="#CITEREFBain2006">Bain 2006</a>, p.&nbsp;31.</span>
+ </li>
+ <li id="cite_note-268">
+ <span><b><a href="#cite_ref-268">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/~/media/Statistics/browse-categories/people-and-communities/households/review-ethnicity/draft-reportof-reviewo-official-ethnicity-standard.pdf">"Draft Report of a Review of the Official Ethnicity Statistical Standard: Proposals to Address the 'New Zealander' Response Issue"</a> <span>(PDF)</span>. Statistics New Zealand. April 2009<span>. Retrieved <span>18 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Pakeha-269">
+ <span><b><a href="#cite_ref-Pakeha_269-0">^</a></b></span> <span><cite>Ranford, Jodie. <a rel="nofollow" href="http://maorinews.com/writings/papers/other/pakeha.htm">"<span>'</span>Pakeha', Its Origin and Meaning"</a>. Māori News<span>. Retrieved <span>20 February</span> 2008</span>. <q>Originally the Pakeha were the early European settlers, however, today ‘Pakeha’ is used to describe any peoples of non-Maori or non-Polynesian heritage. Pakeha is not an ethnicity but rather a way to differentiate between the historical origins of our settlers, the Polynesians and the Europeans, the Maori and the other</q></cite></span>
+
+ </li>
+ <li id="cite_note-270">
+ <span><b><a href="#cite_ref-270">^</a></b></span> <span><cite>Socidad Peruana de Medicina Intensiva (SOPEMI) (2000). <i>Trends in international migration: continuous reporting system on migration</i>. <a href="http://fakehost/wiki/Organisation_for_Economic_Co-operation_and_Development" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a>. pp.&nbsp;276–278.</cite></span>
+
+ </li>
+ <li id="cite_note-271">
+ <span><b><a href="#cite_ref-271">^</a></b></span> <span><cite>Walrond, Carl (21 September 2007). <a rel="nofollow" href="http://www.teara.govt.nz/en/dalmatians">"Dalmatians"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>30 April</span> 2010</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-272">
+ <span><b><a href="#cite_ref-272">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.teara.govt.nz/en/peoples">"Peoples"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i>. 2005<span>. Retrieved <span>2 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Immigration_history-273">
+ <span>^ <a href="#cite_ref-Immigration_history_273-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Immigration_history_273-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Phillips, Jock (11 August 2015). <a rel="nofollow" href="http://www.teara.govt.nz/en/history-of-immigration">"History of immigration"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>2 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-274">
+ <span><b><a href="#cite_ref-274">^</a></b></span> <span><cite>Brawley, Sean (1993). <a rel="nofollow" href="http://www.nzjh.auckland.ac.nz/docs/1993/NZJH_27_1_03.pdf">"<span>'</span>No White Policy in NZ': Fact and Fiction in New Zealand's Asian Immigration Record, 1946-1978"</a> <span>(PDF)</span>. <i>New Zealand Journal of History</i>. <b>27</b> (1): 33–36<span>. Retrieved <span>2 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Recent_immigration-275">
+ <span><b><a href="#cite_ref-Recent_immigration_275-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110511071208/http://www.dol.govt.nz/publications/research/sopemi/2009-2010/imo-2009-2010.pdf">"International Migration Outlook – New Zealand 2009/10"</a> <span>(PDF)</span>. New Zealand Department of Labour. 2010. p.&nbsp;2. <a href="http://fakehost/wiki/International_Standard_Serial_Number" title="International Standard Serial Number">ISSN</a>&nbsp;<a rel="nofollow" href="http://www.worldcat.org/issn/1179-5085">1179-5085</a>. Archived from <a rel="nofollow" href="http://www.dol.govt.nz/publications/research/sopemi/2009-2010/imo-2009-2010.pdf">the original</a> <span>(PDF)</span> on 11 May 2011<span>. Retrieved <span>16 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-276">
+ <span><b><a href="#cite_ref-276">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/birthplace.aspx">"2013 Census QuickStats about culture and identity – Birthplace and people born overseas"</a>. Statistics New Zealand<span>. Retrieved <span>29 August</span> 2014</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-277">
+ <span><b><a href="#cite_ref-277">^</a></b></span> <span><cite>Butcher, Andrew; McGrath, Terry (2004). <a rel="nofollow" href="http://ehlt.flinders.edu.au/education/iej/articles/v5n4/butcher/paper.pdf">"International Students in New Zealand: Needs and Responses"</a> <span>(PDF)</span>. <i>International Education Journal</i>. <b>5</b> (4).</cite></span>
+
+ </li>
+ <li id="cite_note-278">
+ <span><b><a href="#cite_ref-278">^</a></b></span> <span><cite><i>2013 Census QuickStats</i>, Statistics New Zealand, 2013, <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-478-40864-5" title="Special:BookSources/978-0-478-40864-5"><bdi>978-0-478-40864-5</bdi></a></cite></span>
+
+ </li>
+ <li id="cite_note-SpokenLanguage-279">
+ <span>^ <a href="#cite_ref-SpokenLanguage_279-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-SpokenLanguage_279-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-SpokenLanguage_279-2"><sup><i><b>c</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/languages.aspx">"2013 Census QuickStats about culture and identity – Languages spoken"</a>. <a href="http://fakehost/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span>. Retrieved <span>8 September</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEHayMaclaganGordon200814-280">
+ <span><b><a href="#cite_ref-FOOTNOTEHayMaclaganGordon200814_280-0">^</a></b></span> <span><a href="#CITEREFHayMaclaganGordon2008">Hay, Maclagan &amp; Gordon 2008</a>, p.&nbsp;14.</span>
+ </li>
+ <li id="cite_note-281">
+ <span><b><a href="#cite_ref-281">^</a></b></span> <span>* <cite id="CITEREFBauerWarrenBardsleyKennedy2007">Bauer, Laurie; Warren, Paul; Bardsley, Dianne; Kennedy, Marianna; Major, George (2007), <a rel="nofollow" href="https://www.researchgate.net/publication/282778721_ILLUSTRATIONS_OF_THE_IPA_New_Zealand_English">"New Zealand English"</a>, <i>Journal of the International Phonetic Association</i>, <b>37</b> (1): 97–102, <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1017%2FS0025100306002830">10.1017/S0025100306002830</a></cite></span>
+
+ </li>
+ <li id="cite_note-Maori_language-282">
+ <span>^ <a href="#cite_ref-Maori_language_282-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Maori_language_282-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Phillips, Jock (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/the-new-zealanders/12">"The New Zealanders – Bicultural New Zealand"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-283">
+ <span><b><a href="#cite_ref-283">^</a></b></span> <span><cite>Squires, Nick (May 2005). <a rel="nofollow" href="https://www.telegraph.co.uk/news/worldnews/australiaandthepacific/newzealand/1490814/British-influence-ebbs-as-New-Zealand-takes-to-talking-Maori.html">"British influence ebbs as New Zealand takes to talking Māori"</a>. <i>The Daily Telegraph</i><span>. Retrieved <span>3 May</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-284">
+ <span><b><a href="#cite_ref-284">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/maori-language-week/waitangi-tribunal-claim">"Waitangi Tribunal claim – Māori Language Week"</a>. Ministry for Culture and Heritage. July 2010<span>. Retrieved <span>19 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-tereoMaori-285">
+ <span><b><a href="#cite_ref-tereoMaori_285-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/people_and_communities/maori/te-kupenga/use-te-reo-infographic-english.aspx">"Ngā puna kōrero: Where Māori speak te reo – infographic"</a>. Statistics New Zealand<span>. Retrieved <span>8 September</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-287">
+ <span><b><a href="#cite_ref-287">^</a></b></span> <span><cite>Drinnan, John (8 July 2016). <a rel="nofollow" href="http://www.nzherald.co.nz/business/news/article.cfm?c_id=3&amp;objectid=11670518">"<span>'</span>Maori' will remain in the name Maori Television"</a>. <i>New Zealand Herald</i><span>. Retrieved <span>28 August</span> 2016</span>. <q>According to 2015 figures supplied by Maori TV, its two channels broadcast an average of 72 per cent Maori language content - 59 per cent on the main channel and 99 per cent on te reo.</q></cite></span>
+
+ </li>
+ <li id="cite_note-288">
+ <span><b><a href="#cite_ref-288">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1998/0097/latest/DLM429090.html">"Ngāi Tahu Claims Settlement Act 1998"</a>. New Zealand Parliamentary Counsel Office. 20 May 2014 [1 October 1998]<span>. Retrieved <span>10 March</span> 2019</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-290">
+ <span><b><a href="#cite_ref-290">^</a></b></span> <span><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/2006/0018/latest/DLM372754.html">New Zealand Sign Language Act 2006 No 18 (as at 30 June 2008), Public Act</a>. New Zealand Parliamentary Counsel Office. Retrieved 29 November 2011.</span>
+ </li>
+ <li id="cite_note-291">
+ <span><b><a href="#cite_ref-291">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Phil_Zuckerman" title="Phil Zuckerman">Zuckerman, Phil</a> (2006). Martin, Michael (ed.). <a rel="nofollow" href="http://pdfs.semanticscholar.org/f379/ed99e57782aca6391ef5f666da7ba41f1333.pdf"><i>The Cambridge Companion to Atheism</i></a> <span>(PDF)</span>. Cambridge University Press. pp.&nbsp;47–66. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-521-84270-9" title="Special:BookSources/978-0-521-84270-9"><bdi>978-0-521-84270-9</bdi></a><span>. Retrieved <span>8 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-292">
+ <span><b><a href="#cite_ref-292">^</a></b></span> <span><cite>Walrond, Carl (May 2012). <a rel="nofollow" href="https://teara.govt.nz/en/atheism-and-secularism/page-3">"Atheism and secularism – Who is secular?"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>8 August</span> 2017</span>.</cite></span>
+
+ </li>
+
+ <li id="cite_note-2013statstables-295">
+ <span>^ <a href="#cite_ref-2013statstables_295-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-2013statstables_295-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-2013statstables_295-2"><sup><i><b>c</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://archive.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/tables.aspx">"2013 Census QuickStats about culture and identity – tables"</a>. Statistics New Zealand. 15 April 2014<span>. Retrieved <span>14 April</span> 2018</span>.</cite></span>
+ <a rel="nofollow" href="http://archive.stats.govt.nz/~/media/Statistics/Census/2013%20Census/profile-and-summary-reports/quickstats-culture-identity/tables.xls">Excel download</a>
+ </li>
+ <li id="cite_note-296">
+ <span><b><a href="#cite_ref-296">^</a></b></span> <span><cite>Kaa, Hirini (May 2011). <a rel="nofollow" href="http://www.teara.govt.nz/en/nga-hahi-maori-and-christian-denominations/page-7">"Māori and Christian denominations"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>20 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-297">
+ <span><b><a href="#cite_ref-297">^</a></b></span> <span><cite>Morris, Paul (May 2011). <a rel="nofollow" href="http://www.teara.govt.nz/en/diverse-religions">"Diverse religions"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>20 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Education_Stats-298">
+ <span>^ <a href="#cite_ref-Education_Stats_298-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Education_Stats_298-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Dench, Olivia (July 2010). <a rel="nofollow" href="http://www.educationcounts.govt.nz/publications/ECE/2507/80221">"Education Statistics of New Zealand: 2009"</a>. Education Counts<span>. Retrieved <span>19 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-299">
+ <span><b><a href="#cite_ref-299">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1989/0080/latest/DLM177440.html">"Education Act 1989 No 80"</a>. New Zealand Parliamentary Counsel Office. 1989. Section 3<span>. Retrieved <span>5 January</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-EducationAct1989-300">
+ <span><b><a href="#cite_ref-EducationAct1989_300-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.legislation.govt.nz/act/public/1989/0080/latest/DLM183668.html">"Education Act 1989 No 80 (as at 01 February 2011), Public Act. Part 14: Establishment and disestablishment of tertiary institutions, Section 62: Establishment of institutions"</a>. <i>Education Act 1989 No 80</i>. New Zealand Parliamentary Counsel Office. 1 February 2011<span>. Retrieved <span>15 August</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZQA-301">
+ <span><b><a href="#cite_ref-NZQA_301-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzqa.govt.nz/studying-in-new-zealand/tertiary-education">"Studying in New Zealand: Tertiary education"</a>. New Zealand Qualifications Authority<span>. Retrieved <span>15 August</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-TertiaryEdStats-302">
+ <span><b><a href="#cite_ref-TertiaryEdStats_302-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20081015143050/http://www.educationcounts.govt.nz/__data/assets/excel_doc/0007/17836/Education_attainment_of_the_population.xls">"Educational attainment of the population"</a>. Education Counts. 2006. Archived from <a rel="nofollow" href="http://www.educationcounts.govt.nz/__data/assets/excel_doc/0007/17836/Education_attainment_of_the_population.xls">the original</a> <span>(xls)</span> on 15 October 2008<span>. Retrieved <span>21 February</span> 2008</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-303">
+ <span><b><a href="#cite_ref-303">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.oecd.org/dataoecd/54/12/46643496.pdf">"What Students Know and Can Do: Student Performance in Reading, Mathematics and Science 2010"</a> <span>(PDF)</span>.</cite></span>
+ OECD. Retrieved 21 July 2012.
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007398-304">
+ <span><b><a href="#cite_ref-FOOTNOTEKennedy2007398_304-0">^</a></b></span> <span><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&nbsp;398.</span>
+ </li>
+ <li id="cite_note-305">
+ <span><b><a href="#cite_ref-305">^</a></b></span> <span><cite>Hearn, Terry (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/english/">"English – Importance and influence"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-306">
+ <span><b><a href="#cite_ref-306">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/home-away-from-home/conclusions">"Conclusions – British and Irish immigration"</a>. Ministry for Culture and Heritage. March 2007<span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-307">
+ <span><b><a href="#cite_ref-307">^</a></b></span> <span><cite>Stenhouse, John (November 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/religion-and-society/4">"Religion and society – Māori religion"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-308">
+ <span><b><a href="#cite_ref-308">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.justice.govt.nz/publications/publications-archived/2001/he-hinatore-ki-te-ao-maori-a-glimpse-into-the-maori-world/part-1-traditional-maori-concepts/maori-social-structures">"Māori Social Structures"</a>. Ministry of Justice. March 2001<span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-309">
+ <span><b><a href="#cite_ref-309">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.radionz.co.nz/international/pacific-news/327424/thousands-turn-out-for-pasifika-festival">"Thousands turn out for Pasifika Festival"</a>. <i><a href="http://fakehost/wiki/Radio_New_Zealand" title="Radio New Zealand">Radio New Zealand</a></i>. 25 March 2017<span>. Retrieved <span>18 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007400-310">
+ <span><b><a href="#cite_ref-FOOTNOTEKennedy2007400_310-0">^</a></b></span> <span><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&nbsp;400.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007399-311">
+ <span><b><a href="#cite_ref-FOOTNOTEKennedy2007399_311-0">^</a></b></span> <span><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&nbsp;399.</span>
+ </li>
+ <li id="cite_note-312">
+ <span><b><a href="#cite_ref-312">^</a></b></span> <span><cite>Phillips, Jock (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/the-new-zealanders/10">"The New Zealanders – Post-war New Zealanders"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-313">
+ <span><b><a href="#cite_ref-313">^</a></b></span> <span><cite>Phillips, Jock (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/the-new-zealanders/11">"The New Zealanders – Ordinary blokes and extraordinary sheilas"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-314">
+ <span><b><a href="#cite_ref-314">^</a></b></span> <span><cite>Phillips, Jock (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/rural-mythologies/5">"Rural mythologies – The cult of the pioneer"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-315">
+ <span><b><a href="#cite_ref-315">^</a></b></span> <span><cite>Barker, Fiona (June 2012). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/new-zealand-identity/page-6">"New Zealand identity – Culture and arts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>7 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Wilson2016-316">
+ <span>^ <a href="#cite_ref-Wilson2016_316-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2016_316-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Wilson, John (September 2016). <a rel="nofollow" href="http://www.teara.govt.nz/en/nation-and-government/page-9">"Nation and government – Nationhood and identity"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>3 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-Creative-317">
+ <span>^ <a href="#cite_ref-Creative_317-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Creative_317-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/2">"Creative life – Visual arts and crafts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-318">
+ <span><b><a href="#cite_ref-318">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-art/4"><i>Elements of Carving</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-319">
+ <span><b><a href="#cite_ref-319">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-art/5"><i>Surface Patterns</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-320">
+ <span><b><a href="#cite_ref-320">^</a></b></span> <span><cite>McKay, Bill (2004). <a rel="nofollow" href="https://web.archive.org/web/20110513145228/http://www.library.uq.edu.au/ojs/index.php/fab/article/viewFile/108/126">"Māori architecture: transforming western notions of architecture"</a>. <i>Fabrications</i>. <b>14</b> (1&amp;2): 1–12. <a href="http://fakehost/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" href="http://doi.org/10.1080%2F10331867.2004.10525189">10.1080/10331867.2004.10525189</a>. Archived from <a rel="nofollow" href="http://www.library.uq.edu.au/ojs/index.php/fab/article/viewFile/108/126">the original</a> on 13 May 2011.</cite></span>
+
+ </li>
+ <li id="cite_note-321">
+ <span><b><a href="#cite_ref-321">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-art/8"><i>Painted Designs</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-322">
+ <span><b><a href="#cite_ref-322">^</a></b></span> <span><cite>McLintock, Alexander, ed. (2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-art/9"><i>Tattooing</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-beginnings-323">
+ <span>^ <a href="#cite_ref-beginnings_323-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-beginnings_323-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/nz-painting-history/beginnings">"Beginnings – history of NZ painting"</a>. Ministry for Culture and Heritage. December 2010<span>. Retrieved <span>17 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-324">
+ <span><b><a href="#cite_ref-324">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/nz-painting-history/a-new-new-zealand-art">"A new New Zealand art – history of NZ painting"</a>. Ministry for Culture and Heritage. November 2010<span>. Retrieved <span>16 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-325">
+ <span><b><a href="#cite_ref-325">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/nz-painting-history/contemporary-maori-art">"Contemporary Maori art"</a>. Ministry for Culture and Heritage. November 2010<span>. Retrieved <span>16 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-326">
+ <span><b><a href="#cite_ref-326">^</a></b></span> <span><cite>Rauer, Julie. <a rel="nofollow" href="http://www.asianart.com/exhibitions/paradise/article.html">"Paradise Lost: Contemporary Pacific Art At The Asia Society"</a>. Asia Society and Museum<span>. Retrieved <span>17 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-327">
+ <span><b><a href="#cite_ref-327">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-art/10"><i>Textile Designs</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-328">
+ <span><b><a href="#cite_ref-328">^</a></b></span> <span><cite>Keane, Basil (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/pounamu-jade-or-greenstone/4">"Pounamu – jade or greenstone – Implements and adornment"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>17 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-329">
+ <span><b><a href="#cite_ref-329">^</a></b></span> <span><cite>Wilson, John (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/society/9">"Society – Food, drink and dress"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>17 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-330">
+ <span><b><a href="#cite_ref-330">^</a></b></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/3">"Creative life – Design and fashion"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-The_Economist_print_edition-331">
+ <span>^ <a href="#cite_ref-The_Economist_print_edition_331-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-The_Economist_print_edition_331-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.economist.com/displayStory.cfm?Story_ID=E1_TDSGGNTD">"Fashion in New Zealand – New Zealand's fashion industry"</a>. <i>The Economist</i>. 28 February 2008<span>. Retrieved <span>6 August</span> 2009</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-332">
+ <span><b><a href="#cite_ref-332">^</a></b></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/6">"Creative life – Writing and publishing"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-333">
+ <span><b><a href="#cite_ref-333">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/literature-in-new-zealand-1930-1960">"The making of New Zealand literature"</a>. Ministry for Culture and Heritage. November 2010<span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-334">
+ <span><b><a href="#cite_ref-334">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/literature-1940-60/1930s">"New directions in the 1930s – New Zealand literature"</a>. Ministry for Culture and Heritage. August 2008<span>. Retrieved <span>12 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-335">
+ <span><b><a href="#cite_ref-335">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/culture/nz-literature/the-growth-of-publishing">"The war and beyond – New Zealand literature"</a>. Ministry for Culture and Heritage. November 2007<span>. Retrieved <span>12 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-336">
+ <span><b><a href="#cite_ref-336">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.unesco.org/new/en/media-services/single-view/news/28_cities_join_the_unesco_creative_cities_network/back/9597/#.VPojtC6RNiR">"28 cities join the UNESCO Creative Cities Network"</a>. UNESCO. December 2014<span>. Retrieved <span>7 March</span> 2015</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-music-337">
+ <span>^ <a href="#cite_ref-music_337-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-music_337-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/7">"Creative life – Music"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-338">
+ <span><b><a href="#cite_ref-338">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-music/1"><i>Maori Music</i></a>. <a href="http://fakehost/wiki/An_Encyclopaedia_of_New_Zealand" title="An Encyclopaedia of New Zealand">An Encyclopaedia of New Zealand</a><span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-339">
+ <span><b><a href="#cite_ref-339">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-music/6"><i>Musical Instruments</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>16 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-340">
+ <span><b><a href="#cite_ref-340">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/maori-music/7"><i>Instruments Used for Non-musical Purposes</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>16 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-341">
+ <span><b><a href="#cite_ref-341">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/music/1"><i>Music: General History</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>15 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-342">
+ <span><b><a href="#cite_ref-342">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/music/3"><i>Music: Brass Bands</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>14 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-343">
+ <span><b><a href="#cite_ref-343">^</a></b></span> <span><cite>McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" href="http://www.TeAra.govt.nz/en/1966/music/7"><i>Music: Pipe Bands</i></a>. An Encyclopaedia of New Zealand<span>. Retrieved <span>14 April</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-344">
+ <span><b><a href="#cite_ref-344">^</a></b></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/8">"Creative life – Performing arts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-345">
+ <span><b><a href="#cite_ref-345">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110914072406/http://rianz.org.nz/awards2008/history.asp">"History – celebrating our music since 1965"</a>. <a href="http://fakehost/wiki/Recording_Industry_Association_of_New_Zealand" title="Recording Industry Association of New Zealand">Recording Industry Association of New Zealand</a>. 2008. Archived from <a rel="nofollow" href="http://rianz.org.nz/awards2008/history.asp">the original</a> on 14 September 2011<span>. Retrieved <span>23 January</span> 2012</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-346">
+ <span><b><a href="#cite_ref-346">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20111221160800/http://www.rianz.org.nz/rianz/rianz_about.asp">"About RIANZ – Introduction"</a>. Recording Industry Association of New Zealand. Archived from <a rel="nofollow" href="http://www.rianz.org.nz/rianz/rianz_about.asp">the original</a> on 21 December 2011<span>. Retrieved <span>23 January</span> 2012</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-347">
+ <span><b><a href="#cite_ref-347">^</a></b></span> <span><cite>Downes, Siobhan (1 January 2017). <a rel="nofollow" href="http://www.stuff.co.nz/travel/destinations/nz/87903487/world-famous-in-new-zealand-hobbiton-movie-set">"World famous in New Zealand: Hobbiton Movie Set"</a>. Stuff Travel<span>. Retrieved <span>6 July</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-348">
+ <span><b><a href="#cite_ref-348">^</a></b></span> <span><cite>Brian, Pauling (October 2014). <a rel="nofollow" href="https://teara.govt.nz/en/radio/page-1">"Radio – The early years, 1921 to 1932"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>6 July</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-349">
+ <span><b><a href="#cite_ref-349">^</a></b></span> <span><cite><a rel="nofollow" href="https://nzhistory.govt.nz/first-official-tv-broadcast">"New Zealand's first official TV broadcast"</a>. Ministry for Culture and Heritage. December 2016<span>. Retrieved <span>6 July</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-NZ_TV-350">
+ <span>^ <a href="#cite_ref-NZ_TV_350-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_TV_350-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Swarbrick, Nancy (June 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/creative-life/5">"Creative life – Film and broadcasting"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-351">
+ <span><b><a href="#cite_ref-351">^</a></b></span> <span><cite>Horrocks, Roger. <a rel="nofollow" href="https://www.nzonscreen.com/history">"A History of Television in New Zealand"</a>. <a href="http://fakehost/wiki/NZ_On_Screen" title="NZ On Screen">NZ On Screen</a><span>. Retrieved <span>13 September</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-352">
+ <span><b><a href="#cite_ref-352">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.flicks.co.nz/blog/list/top-10-highest-grossing-new-zealand-movies-ever/">"Top 10 Highest Grossing New Zealand Movies Ever"</a>. Flicks.co.nz. May 2016<span>. Retrieved <span>11 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-353">
+ <span><b><a href="#cite_ref-353">^</a></b></span> <span><cite>Cieply, Michael; Rose, Jeremy (October 2010). <a rel="nofollow" href="https://www.nytimes.com/2010/10/28/business/media/28hobbit.html">"New Zealand Bends and 'Hobbit' Stays"</a>. <i>The New York Times</i><span>. Retrieved <span>11 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-354">
+ <span><b><a href="#cite_ref-354">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101107112931/http://www.filmnz.com/production-guide/locations.html">"Production Guide: Locations"</a>. Film New Zealand. Archived from <a rel="nofollow" href="http://www.filmnz.com/production-guide/locations.html">the original</a> on 7 November 2010<span>. Retrieved <span>21 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-355">
+ <span><b><a href="#cite_ref-355">^</a></b></span> <span><cite>Myllylahti, Merja (December 2016). <a rel="nofollow" href="https://web.archive.org/web/20170521074651/http://www.aut.ac.nz/__data/assets/pdf_file/0019/704053/JMAD-Report-2016.pdf">JMAD New Zealand Media Ownership Report 2016</a> <span>(PDF)</span> (Report). <a href="http://fakehost/wiki/Auckland_University_of_Technology" title="Auckland University of Technology">Auckland University of Technology</a>. pp.&nbsp;4–29. Archived from <a rel="nofollow" href="http://www.aut.ac.nz/__data/assets/pdf_file/0019/704053/JMAD-Report-2016.pdf">the original</a> <span>(PDF)</span> on 21 May 2017<span>. Retrieved <span>11 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-356">
+ <span><b><a href="#cite_ref-356">^</a></b></span> <span><cite><a rel="nofollow" href="https://freedomhouse.org/sites/default/files/FOTP2015%20Scores%20and%20Status%201980-2015.xls">"Scores and Status Data 1980-2015"</a>. <i>Freedom of the Press 2015</i>. Freedom House<span>. Retrieved <span>23 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-357">
+ <span><b><a href="#cite_ref-357">^</a></b></span> <span><cite>Hearn, Terry (March 2009). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/english/12">"English – Popular culture"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>22 January</span> 2012</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-358">
+ <span><b><a href="#cite_ref-358">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20110607011003/http://www2.stats.govt.nz/domino/external/web/nzstories.nsf/0/479c4ffcbb884149cc256b1f00001198?OpenDocument">"Sport, Fitness and Leisure"</a>. <i>New Zealand Official Yearbook</i>. Statistics New Zealand. 2000. Archived from <a rel="nofollow" href="http://www2.stats.govt.nz/domino/external/web/nzstories.nsf/0/479c4ffcbb884149cc256b1f00001198?OpenDocument">the original</a> on 7 June 2011<span>. Retrieved <span>21 July</span> 2008</span>. <q>Traditionally New Zealanders have excelled in rugby union, which is regarded as the national sport, and track and field athletics.</q></cite></span>
+
+ </li>
+ <li id="cite_note-Organised_Sport-359">
+ <span>^ <a href="#cite_ref-Organised_Sport_359-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Organised_Sport_359-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Phillips, Jock (February 2011). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/sports-and-leisure/4">"Sports and leisure – Organised sports"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>23 March</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-nzsssc-360">
+ <span>^ <a href="#cite_ref-nzsssc_360-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-nzsssc_360-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.sportsground.co.nz/Article.asp?SiteID=19259&amp;ArticleID=44316">"More and more students wear school sports colours"</a>. New Zealand Secondary School Sports Council<span>. Retrieved <span>30 March</span> 2015</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-361">
+ <span><b><a href="#cite_ref-361">^</a></b></span> <span><cite>Crawford, Scott (January 1999). "Rugby and the Forging of National Identity". In Nauright, John (ed.). <a rel="nofollow" href="https://web.archive.org/web/20120119025021/http://www.la84foundation.org/SportsLibrary/ASSHSSH/ASSHSSH11.pdf"><i>Sport, Power And Society In New Zealand: Historical And Contemporary Perspectives</i></a> <span>(PDF)</span>. ASSH Studies In Sports History. Archived from <a rel="nofollow" href="http://www.la84foundation.org/SportsLibrary/ASSHSSH/ASSHSSH11.pdf">the original</a> <span>(PDF)</span> on 19 January 2012<span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-362">
+ <span><b><a href="#cite_ref-362">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.nzhistory.net.nz/media/photo/rugby-racing-and-beer">"Rugby, racing and beer"</a>. Ministry for Culture and Heritage. August 2010<span>. Retrieved <span>22 January</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-363">
+ <span><b><a href="#cite_ref-363">^</a></b></span> <span><cite>Derby, Mark (December 2010). <a rel="nofollow" href="http://www.TeAra.govt.nz/en/maori-pakeha-relations/4">"Māori–Pākehā relations – Sports and race"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>4 February</span> 2011</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-FOOTNOTEBain200669-364">
+ <span><b><a href="#cite_ref-FOOTNOTEBain200669_364-0">^</a></b></span> <span><a href="#CITEREFBain2006">Bain 2006</a>, p.&nbsp;69.</span>
+ </li>
+ <li id="cite_note-365">
+ <span><b><a href="#cite_ref-365">^</a></b></span> <span><cite>Langton, Graham (1996). <a rel="nofollow" href="https://ir.canterbury.ac.nz/handle/10092/3549"><i>A history of mountain climbing in New Zealand to 1953</i></a> (Thesis). Christchurch: University of Canterbury. p.&nbsp;28<span>. Retrieved <span>12 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-366">
+ <span><b><a href="#cite_ref-366">^</a></b></span> <span><cite><a rel="nofollow" href="http://news.theage.com.au/national/world-mourns-sir-edmund-hillary-20080111-1ldx.html">"World mourns Sir Edmund Hillary"</a>. <i>The Age</i>. Melbourne. 11 January 2008.</cite></span>
+
+ </li>
+ <li id="cite_note-SportsParticipation-367">
+ <span><b><a href="#cite_ref-SportsParticipation_367-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20150115065459/http://www.activenzsurvey.org.nz/Documents/Participation-Levels.pdf">"Sport and Recreation Participation Levels"</a> <span>(PDF)</span>. <a href="http://fakehost/wiki/Sport_New_Zealand" title="Sport New Zealand">Sport and Recreation New Zealand</a>. 2009. Archived from <a rel="nofollow" href="http://www.activenzsurvey.org.nz/Documents/Participation-Levels.pdf">the original</a> <span>(PDF)</span> on 15 January 2015<span>. Retrieved <span>27 November</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-368">
+ <span><b><a href="#cite_ref-368">^</a></b></span> <span><cite>Barclay-Kerr, Hoturoa (September 2013). <a rel="nofollow" href="https://teara.govt.nz/en/waka-ama-outrigger-canoeing">"Waka ama – outrigger canoeing"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>12 August</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-369">
+ <span><b><a href="#cite_ref-369">^</a></b></span> <span><cite><a rel="nofollow" href="https://nzhistory.govt.nz/culture/olympics/overview">"NZ's first Olympic century"</a>. Ministry for Culture and Heritage. August 2016<span>. Retrieved <span>27 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-370">
+ <span><b><a href="#cite_ref-370">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/olympics.aspx">"London 2012 Olympic Games: Medal strike rate – Final count (revised)"</a>. Statistics New Zealand. 14 August 2012<span>. Retrieved <span>4 December</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-371">
+ <span><b><a href="#cite_ref-371">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/olympics-2016.aspx">"Rio 2016 Olympic Games: Medals per capita"</a>. Statistics New Zealand. 30 August 2016<span>. Retrieved <span>27 April</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-372">
+ <span><b><a href="#cite_ref-372">^</a></b></span> <span><cite>Kerr, James (14 November 2013). <a rel="nofollow" href="https://www.telegraph.co.uk/men/active/10427619/The-All-Blacks-guide-to-being-successful-off-the-field.html">"The All Blacks guide to being successful (off the field)"</a>. <i>The Daily Telegraph</i>. London<span>. Retrieved <span>4 December</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-373">
+ <span><b><a href="#cite_ref-373">^</a></b></span> <span><cite>Fordyce, Tom (23 October 2011). <a rel="nofollow" href="https://www.bbc.com/sport/0/rugby-union/15405316">"2011 Rugby World Cup final: New Zealand 8-7 France"</a>. <i>BBC Sport</i><span>. Retrieved <span>4 December</span> 2013</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-cuisine-374">
+ <span>^ <a href="#cite_ref-cuisine_374-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-cuisine_374-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.tourism.net.nz/new-zealand/nz/cuisine-and-dining">"New Zealand Cuisine"</a>. New Zealand Tourism Guide. January 2016<span>. Retrieved <span>4 January</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-375">
+ <span><b><a href="#cite_ref-375">^</a></b></span> <span><cite>Petrie, Hazel (November 2008). <a rel="nofollow" href="https://teara.govt.nz/en/kai-pakeha-introduced-foods">"Kai Pākehā – introduced foods"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>27 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-376">
+ <span><b><a href="#cite_ref-376">^</a></b></span> <span><cite>Whaanga, Mere (June 2006). <a rel="nofollow" href="https://teara.govt.nz/en/mataitai-shellfish-gathering/page-6">"Mātaitai – shellfish gathering"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>27 June</span> 2017</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-377">
+ <span><b><a href="#cite_ref-377">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.teara.govt.nz/en/shellfish">"Story: Shellfish"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>29 August</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-378">
+ <span><b><a href="#cite_ref-378">^</a></b></span> <span><cite>Burton, David (September 2013). <a rel="nofollow" href="http://www.teara.govt.nz/en/cooking/page-2">"Cooking – Cooking methods"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>11 December</span> 2016</span>.</cite></span>
+
+ </li>
+ <li id="cite_note-379">
+ <span><b><a href="#cite_ref-379">^</a></b></span> <span><cite>Royal, Charles; Kaka-Scott, Jenny (September 2013). <a rel="nofollow" href="http://www.teara.govt.nz/en/maori-foods-kai-maori/page-4">"Māori foods – kai Māori"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span>. Retrieved <span>1 September</span> 2016</span>.</cite></span>
+
+ </li>
+ </ol>
+ </div>
+ <h2>
+ <span id="References">References</span>
+ </h2>
+ <div>
+ <ul>
+ <li>
+ <cite>Alley, Roderic (2008). <a rel="nofollow" href="https://books.google.com/books?id=VEa-0PKh__oC"><i>New Zealand in World Affairs IV 1990–2005</i></a>. New Zealand: Victoria University Press. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-864-73548-5" title="Special:BookSources/978-0-864-73548-5"><bdi>978-0-864-73548-5</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFBain2006">Bain, Carolyn (2006). <i>New Zealand</i>. Lonely Planet. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/1-74104-535-5" title="Special:BookSources/1-74104-535-5"><bdi>1-74104-535-5</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFGarden2005">Garden, Donald (2005). Stoll, Mark (ed.). <i>Australia, New Zealand, and the Pacific: An Environmental History</i>. Nature and Human Societies. ABC-CLIO/Greenwood. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-57607-868-6" title="Special:BookSources/978-1-57607-868-6"><bdi>978-1-57607-868-6</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFHayMaclaganGordon2008">Hay, Jennifer; Maclagan, Margaret; Gordon, Elizabeth (2008). <i>Dialects of English: New Zealand English</i>. Edinburgh University Press. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-7486-2529-1" title="Special:BookSources/978-0-7486-2529-1"><bdi>978-0-7486-2529-1</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFKennedy2007">Kennedy, Jeffrey (2007). "Leadership and Culture in New Zealand". In Chhokar, Jagdeep; Brodbeck, Felix; House, Robert (eds.). <i>Culture and Leadership Across the World: The GLOBE Book of In-Depth Studies of 25 Societies</i>. United States: Psychology Press. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-8058-5997-3" title="Special:BookSources/978-0-8058-5997-3"><bdi>978-0-8058-5997-3</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFKing2003"><a href="http://fakehost/wiki/Michael_King" title="Michael King">King, Michael</a> (2003). <i>The Penguin History of New Zealand</i>. New Zealand: Penguin Books. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-14-301867-4" title="Special:BookSources/978-0-14-301867-4"><bdi>978-0-14-301867-4</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFMein_Smith2005">Mein Smith, Philippa (2005). <i>A Concise History of New Zealand</i>. Australia: Cambridge University Press. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/0-521-54228-6" title="Special:BookSources/0-521-54228-6"><bdi>0-521-54228-6</bdi></a>.</cite>
+
+ </li>
+ <li>
+ <cite id="CITEREFSmeltJui_Lin2009">Smelt, Roselynn; Jui Lin, Yong (2009). <i>New Zealand</i>. Cultures of the World (2nd ed.). New York: <a href="http://fakehost/wiki/Marshall_Cavendish" title="Marshall Cavendish">Marshall Cavendish</a>. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-0-7614-3415-3" title="Special:BookSources/978-0-7614-3415-3"><bdi>978-0-7614-3415-3</bdi></a>.</cite>
+
+ </li>
+ </ul>
+ </div>
+ <h2>
+ <span id="Further_reading">Further reading</span>
+ </h2>
+
+
+ <h2>
+ <span id="External_links">External links</span>
+ </h2>
+
+ <dl>
+ <dt>
+ Government
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" href="https://www.govt.nz/">New Zealand Government portal</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.mch.govt.nz/">Ministry for Culture and Heritage</a> – includes information on flag, anthems and coat of arms
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.stats.govt.nz/">Statistics New Zealand</a>
+ </li>
+ </ul>
+ <dl>
+ <dt>
+ Travel
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" href="http://www.newzealand.com/int/">Official site of New Zealand Tourism</a>
+ </li>
+ </ul>
+ <dl>
+ <dt>
+ General Information
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">New Zealand</a> entry from <i><a href="http://fakehost/wiki/The_World_Factbook" title="The World Factbook">The World Factbook</a></i>. <a href="http://fakehost/wiki/Central_Intelligence_Agency" title="Central Intelligence Agency">Central Intelligence Agency</a>.
+ </li>
+ <li>
+ <a rel="nofollow" href="https://curlie.org/Regional/Oceania/New_Zealand">New Zealand</a> at <a href="http://fakehost/wiki/Curlie" title="Curlie">Curlie</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.bbc.co.uk/news/world-asia-pacific-15357770">New Zealand</a> from <a href="http://fakehost/wiki/BBC_News" title="BBC News">BBC News</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.teara.govt.nz/">Te Ara: The Encyclopedia of New Zealand</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.oecd.org/newzealand/">New Zealand</a> <a href="http://fakehost/wiki/Organisation_for_Economic_Co-operation_and_Development" title="Organisation for Economic Co-operation and Development">OECD</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="https://web.archive.org/web/20080607085330/http://ucblibraries.colorado.edu/govpubs/for/newzealand.htm">New Zealand</a>, directory from <i>UCB Libraries GovPubs</i>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.britannica.com/EBchecked/topic/412636/New-Zealand">New Zealand</a> at <i><a href="http://fakehost/wiki/Encyclop%C3%A6dia_Britannica" title="Encyclopædia Britannica">Encyclopædia Britannica</a></i>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.metservice.co.nz/">New Zealand weather</a>
+ </li>
+ <li>
+ <a rel="nofollow" href="http://www.ifs.du.edu/ifs/frm_CountryProfile.aspx?Country=NZ">Key Development Forecasts for New Zealand</a> from <a href="http://fakehost/wiki/International_Futures" title="International Futures">International Futures</a>
+ </li>
+ <li>
+ <img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/16px-Gnome-globe.svg.png" decoding="async" width="16" height="16" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/24px-Gnome-globe.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/32px-Gnome-globe.svg.png 2x" data-file-width="48" data-file-height="48"> <a href="https://commons.wikimedia.org/wiki/Atlas_of_New_Zealand" title="commons:Atlas of New Zealand">Wikimedia Atlas of New Zealand</a>
+ </li>
+ </ul>
+
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/source.html
new file mode 100644
index 000000000..09839304a
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-2/source.html
@@ -0,0 +1,7228 @@
+<!DOCTYPE html>
+<html class="client-nojs" lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <title>
+ New Zealand - Wikipedia
+ </title>
+ <script>
+ <![CDATA[
+ document.documentElement.className="client-js";RLCONF={"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"New_Zealand","wgTitle":"New Zealand","wgCurRevisionId":917976458,"wgRevisionId":917976458,"wgArticleId":4913064,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["CS1 errors: markup","CS1: Julian–Gregorian uncertainty","CS1 errors: missing periodical","CS1: long volume value","Wikipedia indefinitely move-protected pages","Wikipedia pages semi-protected against vandalism","Articles with short description","Good articles","Coordinates on Wikidata","Use dmy dates from March 2019","Use New Zealand English from May 2012","All Wikipedia articles written in New Zealand English","Articles containing Māori-language text","Pages using multiple image with auto scaled images","Articles containing potentially dated statements from 2017",
+ "All articles containing potentially dated statements","Articles containing potentially dated statements from 2013","Articles containing potentially dated statements from 2018","Articles containing potentially dated statements from June 2018","Articles containing potentially dated statements from February 2011","Articles containing potentially dated statements from 2016","Articles containing potentially dated statements from 2015","Articles with Curlie links","Wikipedia articles with BNF identifiers","Wikipedia articles with GND identifiers","Wikipedia articles with HDS identifiers","Wikipedia articles with ISNI identifiers","Wikipedia articles with LCCN identifiers","Wikipedia articles with MusicBrainz area identifiers","Wikipedia articles with NARA identifiers","Wikipedia articles with NDL identifiers","Wikipedia articles with NKC identifiers","Wikipedia articles with NLA-person identifiers","Wikipedia articles with NLI identifiers","Wikipedia articles with SUDOC identifiers",
+ "Wikipedia articles with VIAF identifiers","Wikipedia articles with WorldCat-VIAF identifiers","New Zealand","Archipelagoes of the Pacific Ocean","Countries in Australasia","Countries in Polynesia","English-speaking countries and territories","Island countries","Member states of the Commonwealth of Nations","Member states of the United Nations","States and territories established in 1907","Zealandia"],"wgBreakFrames":!1,"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"New_Zealand","wgRelevantArticleId":4913064,"wgRequestId":"XYyimgpAICEAAFEVnlgAAACY","wgCSPNonce":!1,"wgIsProbablyEditable":!1,"wgRelevantPageIsProbablyEditable":
+ !1,"wgRestrictionEdit":["autoconfirmed"],"wgRestrictionMove":["sysop"],"wgMediaViewerOnClick":!0,"wgMediaViewerEnabledByDefault":!0,"wgPopupsReferencePreviews":!1,"wgPopupsConflictsWithNavPopupGadget":!1,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":!0,"nearby":!0,"watchlist":!0,"tagline":!1},"wgWMESchemaEditAttemptStepOversample":!1,"wgPoweredByHHVM":!1,"wgULSCurrentAutonym":"English","wgNoticeProject":"wikipedia","wgCoordinates":{"lat":-42,"lon":174},"wgWikibaseItemId":"Q664","wgCentralAuthMobileDomain":!1,"wgEditSubmitButtonLabelPublish":!0};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","noscript":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"ready","user.tokens":"loading","ext.cite.styles":"ready","mediawiki.page.gallery.styles":"ready","ext.tmh.thumbnail.styles":"ready",
+ "mediawiki.legacy.shared":"ready","mediawiki.legacy.commonPrint":"ready","jquery.tablesorter.styles":"ready","jquery.makeCollapsible.styles":"ready","mediawiki.toc.styles":"ready","wikibase.client.init":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","ext.wikimediaBadges":"ready","ext.3d.styles":"ready","mediawiki.skinning.interface":"ready","skins.vector.styles":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","mediawiki.page.gallery","mw.MediaWikiPlayer.loader","mw.PopUpMediaTransform","mw.TMHGalleryHook.js","site","mediawiki.page.startup","mediawiki.page.ready","jquery.tablesorter","jquery.makeCollapsible","mediawiki.toc","mediawiki.searchSuggest","ext.gadget.teahouse","ext.gadget.ReferenceTooltips","ext.gadget.watchlist-notice","ext.gadget.DRN-wizard","ext.gadget.charinsert","ext.gadget.refToolbar","ext.gadget.extra-toolbar-buttons","ext.gadget.switcher","ext.centralauth.centralautologin","mmv.head","mmv.bootstrap.autostart",
+ "ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.quicksurveys.init","ext.centralNotice.geoIP","ext.centralNotice.startUp","skins.vector.js"];
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.tokens@tffin",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({"editToken":"+\\","patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});
+ });});
+ ]]>
+ </script>
+ <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.3d.styles%7Cext.cite.styles%7Cext.tmh.thumbnail.styles%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cjquery.makeCollapsible.styles%7Cjquery.tablesorter.styles%7Cmediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.page.gallery.styles%7Cmediawiki.skinning.interface%7Cmediawiki.toc.styles%7Cskins.vector.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector" />
+ <script async="async" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script>
+ <meta name="ResourceLoaderDynamicStyles" content="" />
+ <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector" />
+ <meta name="generator" content="MediaWiki 1.34.0-wmf.23" />
+ <meta name="referrer" content="origin" />
+ <meta name="referrer" content="origin-when-crossorigin" />
+ <meta name="referrer" content="origin-when-cross-origin" />
+ <meta property="og:image" content="https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/1200px-Flag_of_New_Zealand.svg.png" />
+ <link rel="alternate" href="android-app://org.wikipedia/http/en.m.wikipedia.org/wiki/New_Zealand" />
+ <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png" />
+ <link rel="shortcut icon" href="/static/favicon/wikipedia.ico" />
+ <link rel="search" type="application/opensearchdescription+xml" href="/w/opensearch_desc.php" title="Wikipedia (en)" />
+ <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd" />
+ <link rel="license" href="//creativecommons.org/licenses/by-sa/3.0/" />
+ <link rel="canonical" href="https://en.wikipedia.org/wiki/New_Zealand" />
+ <link rel="dns-prefetch" href="//login.wikimedia.org" />
+ <link rel="dns-prefetch" href="//meta.wikimedia.org" /><!--[if lt IE 9]><script src="/w/resources/lib/html5shiv/html5shiv.js"></script><![endif]-->
+
+ <style data-mw-deduplicate="TemplateStyles:r886046785">
+ <![CDATA[
+ .mw-parser-output .toclimit-2 .toclevel-1 ul,.mw-parser-output .toclimit-3 .toclevel-2 ul,.mw-parser-output .toclimit-4 .toclevel-3 ul,.mw-parser-output .toclimit-5 .toclevel-4 ul,.mw-parser-output .toclimit-6 .toclevel-5 ul,.mw-parser-output .toclimit-7 .toclevel-6 ul{display:none}
+ ]]>
+ </style>
+ <style data-mw-deduplicate="TemplateStyles:r889293853/mw-parser-output/.tmulti">
+ <![CDATA[
+ .mw-parser-output .tmulti .thumbinner{display:flex;flex-direction:column}.mw-parser-output .tmulti .trow{display:flex;flex-direction:row;clear:left;flex-wrap:wrap;width:100%;box-sizing:border-box}.mw-parser-output .tmulti .tsingle{margin:1px;float:left}.mw-parser-output .tmulti .theader{clear:both;font-weight:bold;text-align:center;align-self:center;background-color:transparent;width:100%}.mw-parser-output .tmulti .thumbcaption{text-align:left;background-color:transparent}.mw-parser-output .tmulti .text-align-left{text-align:left}.mw-parser-output .tmulti .text-align-right{text-align:right}.mw-parser-output .tmulti .text-align-center{text-align:center}@media all and (max-width:720px){.mw-parser-output .tmulti .thumbinner{width:100%!important;box-sizing:border-box;max-width:none!important;align-items:center}.mw-parser-output .tmulti .trow{justify-content:center}.mw-parser-output .tmulti .tsingle{float:none!important;max-width:100%!important;box-sizing:border-box;text-align:center}.mw-parser-output .tmulti .thumbcaption{text-align:center}}
+ ]]>
+ </style>
+ <style data-mw-deduplicate="TemplateStyles:r886058088">
+ <![CDATA[
+ .mw-parser-output cite.citation{font-style:inherit}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration{color:#555}.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration span{border-bottom:1px dotted;cursor:help}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/12px-Wikisource-logo.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output code.cs1-code{color:inherit;background:inherit;border:inherit;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;font-size:100%}.mw-parser-output .cs1-visible-error{font-size:100%}.mw-parser-output .cs1-maint{display:none;color:#33aa33;margin-left:0.3em}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-right{padding-right:0.2em}
+ ]]>
+ </style>
+ <style data-mw-deduplicate="TemplateStyles:r886047268">
+ <![CDATA[
+ .mw-parser-output .refbegin{font-size:90%;margin-bottom:0.5em}.mw-parser-output .refbegin-hanging-indents>ul{list-style-type:none;margin-left:0}.mw-parser-output .refbegin-hanging-indents>ul>li,.mw-parser-output .refbegin-hanging-indents>dl>dd{margin-left:0;padding-left:3.2em;text-indent:-3.2em;list-style:none}.mw-parser-output .refbegin-100{font-size:100%}
+ ]]>
+ </style>
+ <style data-mw-deduplicate="TemplateStyles:r886047488">
+ <![CDATA[
+ .mw-parser-output .nobold{font-weight:normal}
+ ]]>
+ </style>
+ </head>
+ <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-New_Zealand rootpage-New_Zealand skin-vector action-view">
+ <div id="mw-page-base" class="noprint"></div>
+ <div id="mw-head-base" class="noprint"></div>
+ <div id="content" class="mw-body" role="main">
+ <a id="top"></a>
+ <div id="siteNotice" class="mw-body-content">
+ <!-- CentralNotice -->
+ </div>
+ <div class="mw-indicators mw-body-content">
+ <div id="mw-indicator-good-star" class="mw-indicator">
+ <a href="/wiki/Wikipedia:Good_articles" title="This is a good article. Follow the link for more information."><img alt="This is a good article. Follow the link for more information." src="//upload.wikimedia.org/wikipedia/en/thumb/9/94/Symbol_support_vote.svg/19px-Symbol_support_vote.svg.png" decoding="async" width="19" height="20" srcset="//upload.wikimedia.org/wikipedia/en/thumb/9/94/Symbol_support_vote.svg/29px-Symbol_support_vote.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/9/94/Symbol_support_vote.svg/39px-Symbol_support_vote.svg.png 2x" data-file-width="180" data-file-height="185" /></a>
+ </div>
+ <div id="mw-indicator-pp-default" class="mw-indicator">
+ <a href="/wiki/Wikipedia:Protection_policy#semi" title="This article is semi-protected due to vandalism"><img alt="Page semi-protected" src="//upload.wikimedia.org/wikipedia/en/thumb/1/1b/Semi-protection-shackle.svg/20px-Semi-protection-shackle.svg.png" decoding="async" width="20" height="20" srcset="//upload.wikimedia.org/wikipedia/en/thumb/1/1b/Semi-protection-shackle.svg/30px-Semi-protection-shackle.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/1/1b/Semi-protection-shackle.svg/40px-Semi-protection-shackle.svg.png 2x" data-file-width="512" data-file-height="512" /></a>
+ </div>
+ </div>
+ <h1 id="firstHeading" class="firstHeading" lang="en" xml:lang="en">
+ New Zealand
+ </h1>
+ <div id="bodyContent" class="mw-body-content">
+ <div id="siteSub" class="noprint">
+ From Wikipedia, the free encyclopedia
+ </div>
+ <div id="contentSub"></div>
+ <div id="jump-to-nav"></div><a class="mw-jump-link" href="#mw-head">Jump to navigation</a> <a class="mw-jump-link" href="#p-search">Jump to search</a>
+ <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr" xml:lang="en">
+ <div class="mw-parser-output">
+ <div role="note" class="hatnote navigation-not-searchable">
+ This article is about the country. For other uses, see <a href="/wiki/New_Zealand_(disambiguation)" class="mw-disambig" title="New Zealand (disambiguation)">New Zealand (disambiguation)</a>.
+ </div>
+ <div role="note" class="hatnote navigation-not-searchable">
+ "NZ" redirects here. For other uses, see <a href="/wiki/NZ_(disambiguation)" class="mw-disambig" title="NZ (disambiguation)">NZ (disambiguation)</a>.
+ </div>
+ <p class="mw-empty-elt"></p>
+ <div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">
+ Country in Oceania
+ </div>
+ <p>
+ <span style="font-size: small;"><span id="coordinates"><a href="/wiki/Geographic_coordinate_system" title="Geographic coordinate system">Coordinates</a>: <span class="plainlinks nourlexpansion"><a class="external text" href="//tools.wmflabs.org/geohack/geohack.php?pagename=New_Zealand&amp;params=42_S_174_E_scale:5000000_source:GNS"><span class="geo-default"><span class="geo-dms" title="Maps, aerial photos, and other data for this location"><span class="latitude">42°S</span> <span class="longitude">174°E</span></span></span><span class="geo-multi-punct"> / </span><span class="geo-nondefault"><span class="geo-dec" title="Maps, aerial photos, and other data for this location">42°S 174°E</span><span style="display:none"> / <span class="geo">-42; 174</span></span></span></a></span></span></span>
+ </p>
+ <table class="infobox geography vcard" style="width:22em;font-size:88%;">
+ <tbody>
+ <tr>
+ <th colspan="2" class="adr" style="text-align:center;font-size:125%;font-weight:bold;padding:0.25em 0.33em 0.33em;line-height:1.2em;font-size:1.25em;">
+ <div style="display:inline" class="fn org country-name">
+ New Zealand
+ </div><br />
+ <div style="padding-top:0.25em; font-weight:normal;">
+ <i lang="mi" title="Māori language text" xml:lang="mi">Aotearoa</i>&#160;&#160;<span class="languageicon" style="font-size:85%;font-weight:normal;">(<a href="/wiki/M%C4%81ori_language" title="Māori language">Māori</a>)</span>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" style="text-align:center;text-align:center;padding:0.5em 0;">
+ <div style="display:table; width:100%;">
+ <div style="display:table-cell; width:58%; vertical-align:middle; padding-left:5px;">
+ <div style="padding-bottom:3px;">
+ <a href="/wiki/File:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"><img alt="Blue field with the Union Flag in the top right corner, and four red stars with white borders to the right." src="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/125px-Flag_of_New_Zealand.svg.png" decoding="async" width="125" height="63" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/188px-Flag_of_New_Zealand.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/250px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600" /></a>
+ </div>
+ <div style="font-size:90%;">
+ <a href="/wiki/Flag_of_New_Zealand" title="Flag of New Zealand">Flag</a>
+ </div>
+ </div>
+ <div style="display:table-cell; vertical-align:middle; padding: 0px 5px;">
+ <div style="padding-bottom:3px;">
+ <a href="/wiki/File:Coat_of_arms_of_New_Zealand.svg" class="image" title="Coat of arms of New Zealand"><img alt="A quartered shield, flanked by two figures, topped with a crown." src="//upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/85px-Coat_of_arms_of_New_Zealand.svg.png" decoding="async" width="85" height="82" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/128px-Coat_of_arms_of_New_Zealand.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Coat_of_arms_of_New_Zealand.svg/170px-Coat_of_arms_of_New_Zealand.svg.png 2x" data-file-width="725" data-file-height="699" /></a>
+ </div>
+ <div style="font-size:90%;">
+ <a href="/wiki/Coat_of_arms_of_New_Zealand" title="Coat of arms of New Zealand">Coat of arms</a>
+ </div>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" style="text-align:center">
+ <div style="line-height:1.2em;">
+ <b><a href="/wiki/National_anthems_of_New_Zealand" title="National anthems of New Zealand">Anthems</a>:</b><br />
+ <div class="plainlist">
+ <ul>
+ <li>"<a href="/wiki/God_Defend_New_Zealand" title="God Defend New Zealand">God Defend New Zealand</a>"<br />
+ <div class="center">
+ <div class="floatnone">
+ <div class="mediaContainer" style="width:220px">
+ <span style="position: relative; top: 0.2em;"><audio id="mwe_player_0" controls="" preload="none" style="width:220px" class="kskin" data-durationhint="62.772244897959" data-startoffset="0" data-mwtitle="New_Zealand_national_anthem,_performed_by_the_United_States_Navy_Band.wav" data-mwprovider="wikimediacommons"><span style="position: relative; top: 0.2em;"><source src="//upload.wikimedia.org/wikipedia/commons/transcoded/2/23/New_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav/New_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav.ogg" type="audio/ogg; codecs=&quot;vorbis&quot;" data-title="Ogg Vorbis" data-shorttitle="Ogg Vorbis" data-transcodekey="ogg" data-width="0" data-height="0" data-bandwidth="106160" /><source src="//upload.wikimedia.org/wikipedia/commons/transcoded/2/23/New_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav/New_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav.mp3" type="audio/mpeg" data-title="MP3" data-shorttitle="MP3" data-transcodekey="mp3" data-width="0" data-height="0" data-bandwidth="195360" /><source src="//upload.wikimedia.org/wikipedia/commons/2/23/New_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav" type="audio/wav" data-title="Original WAV file (2.82 Mbps)" data-shorttitle="WAV source" data-width="0" data-height="0" data-bandwidth="2822400" /></span>
+ <track src="https://commons.wikimedia.org/w/api.php?action=timedtext&amp;title=File%3ANew_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav&amp;lang=en&amp;trackformat=srt&amp;origin=%2A" kind="subtitles" type="text/x-srt" srclang="en" label="English (en) subtitles" data-dir="ltr" />
+ <track src="https://commons.wikimedia.org/w/api.php?action=timedtext&amp;title=File%3ANew_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav&amp;lang=ko&amp;trackformat=srt&amp;origin=%2A" kind="subtitles" type="text/x-srt" srclang="ko" label="한국어 (ko) subtitles" data-dir="ltr" />
+ <track src="https://commons.wikimedia.org/w/api.php?action=timedtext&amp;title=File%3ANew_Zealand_national_anthem%2C_performed_by_the_United_States_Navy_Band.wav&amp;lang=mi&amp;trackformat=srt&amp;origin=%2A" kind="subtitles" type="text/x-srt" srclang="mi" label="Māori (mi) subtitles" data-dir="ltr" /></audio></span>
+ </div>
+ </div>
+ </div>
+ </li>
+ <li>
+ <span style="position: relative; top: 0.2em;">"<a href="/wiki/God_Save_the_Queen" title="God Save the Queen">God Save the Queen</a>"<sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[n 1]</a></sup></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" style="text-align:center">
+ <a href="/wiki/File:NZL_orthographic_NaturalEarth.svg" class="image" title="Location of New Zealand, including outlying islands, its territorial claim in the Antarctic, and Tokelau"><img alt="A map of the hemisphere centred on New Zealand, using an orthographic projection." src="//upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/250px-NZL_orthographic_NaturalEarth.svg.png" decoding="async" width="250" height="250" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/375px-NZL_orthographic_NaturalEarth.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/29/NZL_orthographic_NaturalEarth.svg/500px-NZL_orthographic_NaturalEarth.svg.png 2x" data-file-width="512" data-file-height="512" /></a>
+ <div style="position:relative;top:0.3em;">
+ Location of New Zealand, including outlying islands, its <a href="/wiki/Ross_Dependency" title="Ross Dependency">territorial claim in the Antarctic</a>, and <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Capital
+ </th>
+ <td>
+ <a href="/wiki/Wellington" title="Wellington">Wellington</a><br />
+ <span class="plainlinks nourlexpansion"><a class="external text" href="//tools.wmflabs.org/geohack/geohack.php?pagename=New_Zealand&amp;params=41_17_S_174_27_E_type:city"><span class="geo-default"><span class="geo-dms" title="Maps, aerial photos, and other data for this location"><span class="latitude">41°17′S</span> <span class="longitude">174°27′E</span></span></span><span class="geo-multi-punct"> / </span><span class="geo-nondefault"><span class="geo-dec" title="Maps, aerial photos, and other data for this location">41.283°S 174.450°E</span><span style="display:none"> / <span class="geo">-41.283; 174.450</span></span></span></a></span>
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ Largest city
+ </th>
+ <td>
+ <a href="/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th scope="row">
+ Official&#160;languages
+ </th>
+ <td>
+ <div class="plainlist">
+ <ul>
+ <li style="white-space:nowrap;">
+ <a href="/wiki/New_Zealand_English" title="New Zealand English">English</a><sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[n 2]</a></sup>
+ </li>
+ <li style="white-space:nowrap;">
+ <a href="/wiki/M%C4%81ori_language" title="Māori language">Māori</a>
+ </li>
+ <li style="white-space:nowrap;">
+ <a href="/wiki/NZ_Sign_Language" class="mw-redirect" title="NZ Sign Language">NZ Sign Language</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Ethnic_group" title="Ethnic group">Ethnic&#160;groups</a>
+ <div style="font-weight:normal;display:inline;">
+ (<a href="/wiki/2018_New_Zealand_census" title="2018 New Zealand census">2018</a>)
+ </div>
+ </th>
+ <td>
+ <div class="plainlist">
+ <ul>
+ <li style="white-space:nowrap;">70.2% <a href="/wiki/European_New_Zealanders" title="European New Zealanders">European</a>
+ </li>
+ <li style="white-space:nowrap;">16.5% <a href="/wiki/M%C4%81ori_people" title="Māori people">Māori</a>
+ </li>
+ <li style="white-space:nowrap;">15.1% <a href="/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asian</a>
+ </li>
+ <li style="white-space:nowrap;">8.1% <a href="/wiki/Pacific_Islander" title="Pacific Islander">Pacific peoples</a>
+ </li>
+ <li style="white-space:nowrap;">1.6% <a href="/wiki/Middle_Eastern_people" class="mw-redirect" title="Middle Eastern people">ME</a>/<a href="/wiki/Latin_Americans" title="Latin Americans">LA</a>/<a href="/wiki/African_New_Zealanders" title="African New Zealanders">African</a>
+ </li>
+ <li style="white-space:nowrap;">1.9% Other<sup id="cite_ref-Census2018_pdc_5-0" class="reference"><a href="#cite_note-Census2018_pdc-5">[3]</a></sup><sup id="cite_ref-ethnicity_6-0" class="reference"><a href="#cite_note-ethnicity-6">[n 3]</a></sup>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Demonym" title="Demonym">Demonym(s)</a>
+ </th>
+ <td>
+ <a href="/wiki/New_Zealanders" title="New Zealanders">New Zealander</a><br />
+ <span class="nowrap"><a href="/wiki/Kiwi_(people)" title="Kiwi (people)">Kiwi</a> (informal)</span>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Politics_of_New_Zealand" title="Politics of New Zealand">Government</a>
+ </th>
+ <td>
+ <a href="/wiki/Unitary_state" title="Unitary state">Unitary</a> <a href="/wiki/Parliamentary_system" title="Parliamentary system">parliamentary</a> <a href="/wiki/Constitutional_monarchy" title="Constitutional monarchy">constitutional monarchy</a>
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <td colspan="2" style="text-align:center"></td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/Monarchy_of_New_Zealand" title="Monarchy of New Zealand">Monarch</a>
+ </div>
+ </th>
+ <td>
+ <a href="/wiki/Elizabeth_II" title="Elizabeth II">Elizabeth II</a>
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<span class="nowrap"><a href="/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">Governor-General</a></span>
+ </div>
+ </th>
+ <td>
+ <a href="/wiki/Patsy_Reddy" title="Patsy Reddy">Patsy Reddy</a>
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">Prime Minister</a>
+ </div>
+ </th>
+ <td>
+ <a href="/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>
+ </td>
+ </tr>
+ <tr style="display:none">
+ <td colspan="2"></td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Legislature
+ </th>
+ <td>
+ <a href="/wiki/New_Zealand_Parliament" title="New Zealand Parliament">Parliament</a><br />
+ (<a href="/wiki/New_Zealand_House_of_Representatives" title="New Zealand House of Representatives">House of Representatives</a>)
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th colspan="2" style="text-align:center;text-align:left;">
+ <a href="/wiki/Independence_of_New_Zealand" title="Independence of New Zealand">Stages of independence</a>&#160;
+ <div style="font-weight:normal;display:inline;">
+ from the <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </div>
+ </th>
+ </tr>
+ <tr class="mergedrow">
+ <td colspan="2" style="text-align:center"></td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/1856_Sewell_Ministry" title="1856 Sewell Ministry">Responsible government</a>
+ </div>
+ </th>
+ <td>
+ 7 May 1856
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">Dominion</a>
+ </div>
+ </th>
+ <td>
+ 26 September 1907
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/Statute_of_Westminster_Adoption_Act_1947" title="Statute of Westminster Adoption Act 1947">Statute of Westminster adopted</a>
+ </div>
+ </th>
+ <td>
+ <br />
+ 25 November 1947
+ </td>
+ </tr>
+ <tr style="display:none">
+ <td colspan="2"></td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th colspan="2" style="text-align:center;text-align:left;">
+ <a href="/wiki/Geography_of_New_Zealand" title="Geography of New Zealand">Area</a>
+ </th>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Total
+ </div>
+ </th>
+ <td>
+ 268,021&#160;km<sup>2</sup> (103,483&#160;sq&#160;mi) (<a href="/wiki/List_of_countries_and_dependencies_by_area" title="List of countries and dependencies by area">75th</a>)
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Water&#160;(%)
+ </div>
+ </th>
+ <td>
+ 1.6<sup id="cite_ref-8" class="reference"><a href="#cite_note-8">[n 4]</a></sup>
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th colspan="2" style="text-align:center;text-align:left;">
+ <a href="/wiki/Demographics_of_New_Zealand" title="Demographics of New Zealand">Population</a>
+ </th>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;September 2019 estimate
+ </div>
+ </th>
+ <td>
+ 4,933,210<sup id="cite_ref-populationestimate_9-0" class="reference"><a href="#cite_note-populationestimate-9">[5]</a></sup> (<a href="/wiki/List_of_countries_and_dependencies_by_population" title="List of countries and dependencies by population">120th</a>)
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;<a href="/wiki/2018_New_Zealand_census" title="2018 New Zealand census">2018</a>&#160;census
+ </div>
+ </th>
+ <td>
+ 4,699,755
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Density
+ </div>
+ </th>
+ <td>
+ 18.2/km<sup>2</sup> (47.1/sq&#160;mi) (<a href="/wiki/List_of_countries_and_dependencies_by_population_density" title="List of countries and dependencies by population density">203rd</a>)
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th scope="row">
+ <a href="/wiki/Gross_domestic_product" title="Gross domestic product">GDP</a>&#160;<span style="font-weight:normal;">(<a href="/wiki/Purchasing_power_parity" title="Purchasing power parity">PPP</a>)</span>
+ </th>
+ <td>
+ 2018&#160;estimate
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Total
+ </div>
+ </th>
+ <td>
+ $199 billion<sup id="cite_ref-imf2_10-0" class="reference"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Per capita
+ </div>
+ </th>
+ <td>
+ $40,266<sup id="cite_ref-imf2_10-1" class="reference"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th scope="row">
+ <a href="/wiki/Gross_domestic_product" title="Gross domestic product">GDP</a>&#160;<span style="font-weight:normal;">(nominal)</span>
+ </th>
+ <td>
+ 2018&#160;estimate
+ </td>
+ </tr>
+ <tr class="mergedrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Total
+ </div>
+ </th>
+ <td>
+ $206 billion<sup id="cite_ref-imf2_10-2" class="reference"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Per capita
+ </div>
+ </th>
+ <td>
+ $41,616<sup id="cite_ref-imf2_10-3" class="reference"><a href="#cite_note-imf2-10">[6]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Gini_coefficient" title="Gini coefficient">Gini</a>&#160;<span style="font-weight:normal;">(2014)</span>
+ </th>
+ <td>
+ 33.0<sup id="cite_ref-11" class="reference"><a href="#cite_note-11">[7]</a></sup><br />
+ <span style="white-space:nowrap;"><span style="color:orange">medium</span></span>&#160;·&#160;<a href="/wiki/List_of_countries_by_income_equality" title="List of countries by income equality">22nd</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Human_Development_Index" title="Human Development Index">HDI</a>&#160;<span style="font-weight:normal;">(2017)</span>
+ </th>
+ <td>
+ <img alt="Increase" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/11px-Increase2.svg.png" decoding="async" title="Increase" width="11" height="11" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/17px-Increase2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Increase2.svg/22px-Increase2.svg.png 2x" data-file-width="300" data-file-height="300" />&#160;0.917<sup id="cite_ref-HDI_12-0" class="reference"><a href="#cite_note-HDI-12">[8]</a></sup><br />
+ <span style="white-space:nowrap;"><span style="color:darkgreen">very high</span></span>&#160;·&#160;<a href="/wiki/List_of_countries_by_Human_Development_Index" title="List of countries by Human Development Index">16th</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Currency
+ </th>
+ <td>
+ <a href="/wiki/New_Zealand_dollar" title="New Zealand dollar">New Zealand dollar</a> ($) (<a href="/wiki/ISO_4217" title="ISO 4217">NZD</a>)
+ </td>
+ </tr>
+ <tr class="mergedtoprow">
+ <th scope="row">
+ Time zone
+ </th>
+ <td>
+ <span class="nowrap"><a href="/wiki/Coordinated_Universal_Time" title="Coordinated Universal Time">UTC</a>+12</span> (<a href="/wiki/Time_in_New_Zealand" title="Time in New Zealand">NZST</a><sup id="cite_ref-13" class="reference"><a href="#cite_note-13">[n 5]</a></sup>)
+ </td>
+ </tr>
+ <tr class="mergedbottomrow">
+ <th scope="row">
+ <div style="text-indent:-0.9em;margin-left:1.2em;font-weight:normal;">
+ •&#160;Summer&#160;(<a href="/wiki/Daylight_saving_time" title="Daylight saving time">DST</a>)
+ </div>
+ </th>
+ <td>
+ <span class="nowrap"><a href="/wiki/Coordinated_Universal_Time" title="Coordinated Universal Time">UTC</a>+13</span> (<a href="/wiki/Time_in_New_Zealand" title="Time in New Zealand">NZDT</a><sup id="cite_ref-15" class="reference"><a href="#cite_note-15">[n 6]</a></sup>)
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ Date format
+ </th>
+ <td>
+ <abbr title="day">dd</abbr>/<abbr title="month">mm</abbr>/<abbr title="year">yyyy</abbr><br />
+ <abbr title="year">yyyy</abbr>-<abbr title="month">mm</abbr>-<abbr title="day">dd</abbr><sup id="cite_ref-16" class="reference"><a href="#cite_note-16">[10]</a></sup>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Left-_and_right-hand_traffic" title="Left- and right-hand traffic">Driving side</a>
+ </th>
+ <td>
+ <a href="/wiki/Right-_and_left-hand_traffic#New_Zealand" class="mw-redirect" title="Right- and left-hand traffic">left</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Telephone_numbers_in_New_Zealand" title="Telephone numbers in New Zealand">Calling code</a>
+ </th>
+ <td>
+ <a href="/wiki/%2B64" class="mw-redirect" title="+64">+64</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/ISO_3166" title="ISO 3166">ISO 3166 code</a>
+ </th>
+ <td>
+ <a href="/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">NZ</a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">
+ <a href="/wiki/Country_code_top-level_domain" title="Country code top-level domain">Internet TLD</a>
+ </th>
+ <td>
+ <a href="/wiki/.nz" title=".nz">.nz</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ <b>New Zealand</b> (<a href="/wiki/M%C4%81ori_language" title="Māori language">Māori</a>: <i lang="mi" xml:lang="mi"><a href="/wiki/Aotearoa" title="Aotearoa">Aotearoa</a></i> <span title="Representation in the International Phonetic Alphabet (IPA)" class="IPA"><a href="/wiki/Help:IPA/M%C4%81ori" title="Help:IPA/Māori">[aɔˈtɛaɾɔa]</a></span>) is a <a href="/wiki/Sovereign_state" title="Sovereign state">sovereign</a> <a href="/wiki/Island_country" title="Island country">island country</a> in the southwestern <a href="/wiki/Pacific_Ocean" title="Pacific Ocean">Pacific Ocean</a>. The country geographically comprises two main landmasses—the <a href="/wiki/North_Island" title="North Island">North Island</a> (<i>Te Ika-a-Māui</i>), and the <a href="/wiki/South_Island" title="South Island">South Island</a> (<i>Te Waipounamu</i>)—and around 600 <a href="/wiki/List_of_islands_of_New_Zealand" title="List of islands of New Zealand">smaller islands</a>. It has a total land area of 268,000 square kilometres (103,500&#160;sq&#160;mi). New Zealand is situated some 2,000 kilometres (1,200&#160;mi) east of <a href="/wiki/Australia" title="Australia">Australia</a> across the <a href="/wiki/Tasman_Sea" title="Tasman Sea">Tasman Sea</a> and roughly 1,000 kilometres (600&#160;mi) south of the <a href="/wiki/List_of_islands_in_the_Pacific_Ocean" title="List of islands in the Pacific Ocean">Pacific island areas</a> of <a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a>, <a href="/wiki/Fiji" title="Fiji">Fiji</a>, and <a href="/wiki/Tonga" title="Tonga">Tonga</a>. Because of its remoteness, it was one of the last lands to be settled by humans. During its long period of isolation, New Zealand developed a distinct <a href="/wiki/Biodiversity_of_New_Zealand" title="Biodiversity of New Zealand">biodiversity</a> of animal, fungal, and plant life. The country's varied topography and its sharp mountain peaks, such as the <a href="/wiki/Southern_Alps" title="Southern Alps">Southern Alps</a>, owe much to the <a href="/wiki/Tectonic_uplift" title="Tectonic uplift">tectonic uplift</a> of land and volcanic eruptions. New Zealand's <a href="/wiki/Capital_of_New_Zealand" title="Capital of New Zealand">capital city</a> is <a href="/wiki/Wellington" title="Wellington">Wellington</a>, while its most populous city is <a href="/wiki/Auckland" title="Auckland">Auckland</a>.
+ </p>
+ <p>
+ Sometime between 1250 and 1300, <a href="/wiki/Polynesians" title="Polynesians">Polynesians</a> settled in the islands that later were named New Zealand and developed a distinctive <a href="/wiki/M%C4%81ori_culture" title="Māori culture">Māori culture</a>. In 1642, Dutch explorer <a href="/wiki/Abel_Tasman" title="Abel Tasman">Abel Tasman</a> became the first European to sight New Zealand. In 1840, representatives of the United Kingdom and <a href="/wiki/M%C4%81ori_people" title="Māori people">Māori</a> chiefs signed the <a href="/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a>, which declared British sovereignty over the islands. In 1841, New Zealand <a href="/wiki/Colony_of_New_Zealand" title="Colony of New Zealand">became a colony</a> within the <a href="/wiki/British_Empire" title="British Empire">British Empire</a> and in 1907 it <a href="/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">became a dominion</a>; it gained <a href="/wiki/Independence_of_New_Zealand" title="Independence of New Zealand">full statutory independence</a> in 1947 and the British monarch remained the <a href="/wiki/Head_of_state" title="Head of state">head of state</a>. Today, the majority of <a href="/wiki/New_Zealand%27s_population" class="mw-redirect" title="New Zealand's population">New Zealand's population</a> of 4.9&#160;million is of <a href="/wiki/European_New_Zealanders" title="European New Zealanders">European descent</a>; the indigenous Māori are the largest minority, followed by <a href="/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asians</a> and <a href="/wiki/Pacific_Islander" title="Pacific Islander">Pacific Islanders</a>. Reflecting this, <a href="/wiki/New_Zealand%27s_culture" class="mw-redirect" title="New Zealand's culture">New Zealand's culture</a> is mainly derived from Māori and early British settlers, with recent broadening arising from increased <a href="/wiki/Immigration_to_New_Zealand" title="Immigration to New Zealand">immigration</a>. The <a href="/wiki/Languages_of_New_Zealand" title="Languages of New Zealand">official languages</a> are <a href="/wiki/English_language" title="English language">English</a>, <a href="/wiki/M%C4%81ori_language" title="Māori language">Māori</a>, and <a href="/wiki/New_Zealand_Sign_Language" title="New Zealand Sign Language">New Zealand Sign Language</a>, with English being very dominant.
+ </p>
+ <p>
+ A <a href="/wiki/Developed_country" title="Developed country">developed country</a>, New Zealand <a href="/wiki/International_rankings_of_New_Zealand" title="International rankings of New Zealand">ranks highly</a> in international comparisons of national performance, such as quality of life, health, education, protection of <a href="/wiki/Civil_liberties" title="Civil liberties">civil liberties</a>, and <a href="/wiki/Economic_freedom" title="Economic freedom">economic freedom</a>. New Zealand underwent <a href="/wiki/Rogernomics" title="Rogernomics">major economic changes</a> during the 1980s, which transformed it from a <a href="/wiki/Protectionist" class="mw-redirect" title="Protectionist">protectionist</a> to a <a href="/wiki/Economic_liberalization" title="Economic liberalization">liberalised</a> <a href="/wiki/Free-trade" class="mw-redirect" title="Free-trade">free-trade</a> economy. The service sector dominates the <a href="/wiki/Economy_of_New_Zealand" title="Economy of New Zealand">national economy</a>, followed by the industrial sector, and <a href="/wiki/Agriculture_in_New_Zealand" title="Agriculture in New Zealand">agriculture</a>; international <a href="/wiki/Tourism_in_New_Zealand" title="Tourism in New Zealand">tourism</a> is a significant source of revenue. Nationally, legislative authority is vested in an elected, <a href="/wiki/Unicameral" class="mw-redirect" title="Unicameral">unicameral</a> <a href="/wiki/New_Zealand_Parliament" title="New Zealand Parliament">Parliament</a>, while executive political power is exercised by the <a href="/wiki/Cabinet_of_New_Zealand" title="Cabinet of New Zealand">Cabinet</a>, led by the <a href="/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">prime minister</a>, currently <a href="/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>. <a href="/wiki/Queen_Elizabeth_II" class="mw-redirect" title="Queen Elizabeth II">Queen Elizabeth II</a> is the <a href="/wiki/Monarchy_of_New_Zealand" title="Monarchy of New Zealand">country's monarch</a> and is represented by a <a href="/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">governor-general</a>, currently <a href="/wiki/Dame_Patsy_Reddy" class="mw-redirect" title="Dame Patsy Reddy">Dame Patsy Reddy</a>. In addition, New Zealand is organised into 11 <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">regional councils</a> and 67 <a href="/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">territorial authorities</a> for local government purposes. The <a href="/wiki/Realm_of_New_Zealand" title="Realm of New Zealand">Realm of New Zealand</a> also includes <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a> (a <a href="/wiki/Dependent_territory" title="Dependent territory">dependent territory</a>); the <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a> and <a href="/wiki/Niue" title="Niue">Niue</a> (self-governing states in <a href="/wiki/Associated_state" title="Associated state">free association</a> with New Zealand); and the <a href="/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>, which is New Zealand's <a href="/wiki/Territorial_claim_in_Antarctica" class="mw-redirect" title="Territorial claim in Antarctica">territorial claim in Antarctica</a>. New Zealand is a member of the <a href="/wiki/United_Nations" title="United Nations">United Nations</a>, <a href="/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a>, <a href="/wiki/ANZUS" title="ANZUS">ANZUS</a>, <a href="/wiki/Organisation_for_Economic_Co-operation_and_Development" class="mw-redirect" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a>, <a href="/wiki/Association_of_Southeast_Asian_Nations#ASEAN_Plus_Three_and_Six" title="Association of Southeast Asian Nations">ASEAN Plus Six</a>, <a href="/wiki/Asia-Pacific_Economic_Cooperation" title="Asia-Pacific Economic Cooperation">Asia-Pacific Economic Cooperation</a>, the <a href="/wiki/Pacific_Community" title="Pacific Community">Pacific Community</a> and the <a href="/wiki/Pacific_Islands_Forum" title="Pacific Islands Forum">Pacific Islands Forum</a>.
+ </p>
+ <div class="toclimit-3">
+ <div id="toc" class="toc">
+ <input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" />
+ <div class="toctitle" lang="en" dir="ltr" xml:lang="en">
+ <h2>
+ Contents
+ </h2>
+ </div>
+ <ul>
+ <li class="toclevel-1 tocsection-1">
+ <a href="#Etymology"><span class="tocnumber">1</span> <span class="toctext">Etymology</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-2">
+ <a href="#History"><span class="tocnumber">2</span> <span class="toctext">History</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-3">
+ <a href="#Government_and_politics"><span class="tocnumber">3</span> <span class="toctext">Government and politics</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-4">
+ <a href="#Foreign_relations_and_military"><span class="tocnumber">3.1</span> <span class="toctext">Foreign relations and military</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-5">
+ <a href="#Local_government_and_external_territories"><span class="tocnumber">3.2</span> <span class="toctext">Local government and external territories</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-6">
+ <a href="#Environment"><span class="tocnumber">4</span> <span class="toctext">Environment</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-7">
+ <a href="#Geography"><span class="tocnumber">4.1</span> <span class="toctext">Geography</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-8">
+ <a href="#Climate"><span class="tocnumber">4.2</span> <span class="toctext">Climate</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-9">
+ <a href="#Biodiversity"><span class="tocnumber">4.3</span> <span class="toctext">Biodiversity</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-10">
+ <a href="#Economy"><span class="tocnumber">5</span> <span class="toctext">Economy</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-11">
+ <a href="#Trade"><span class="tocnumber">5.1</span> <span class="toctext">Trade</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-12">
+ <a href="#Infrastructure"><span class="tocnumber">5.2</span> <span class="toctext">Infrastructure</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-13">
+ <a href="#Demography"><span class="tocnumber">6</span> <span class="toctext">Demography</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-14">
+ <a href="#Ethnicity_and_immigration"><span class="tocnumber">6.1</span> <span class="toctext">Ethnicity and immigration</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-15">
+ <a href="#Language"><span class="tocnumber">6.2</span> <span class="toctext">Language</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-16">
+ <a href="#Religion"><span class="tocnumber">6.3</span> <span class="toctext">Religion</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-17">
+ <a href="#Education"><span class="tocnumber">6.4</span> <span class="toctext">Education</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-18">
+ <a href="#Culture"><span class="tocnumber">7</span> <span class="toctext">Culture</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-19">
+ <a href="#Art"><span class="tocnumber">7.1</span> <span class="toctext">Art</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-20">
+ <a href="#Literature"><span class="tocnumber">7.2</span> <span class="toctext">Literature</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-21">
+ <a href="#Media_and_entertainment"><span class="tocnumber">7.3</span> <span class="toctext">Media and entertainment</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-22">
+ <a href="#Sports"><span class="tocnumber">7.4</span> <span class="toctext">Sports</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-23">
+ <a href="#Cuisine"><span class="tocnumber">7.5</span> <span class="toctext">Cuisine</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-24">
+ <a href="#See_also"><span class="tocnumber">8</span> <span class="toctext">See also</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-25">
+ <a href="#Footnotes"><span class="tocnumber">9</span> <span class="toctext">Footnotes</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-26">
+ <a href="#Citations"><span class="tocnumber">10</span> <span class="toctext">Citations</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-27">
+ <a href="#References"><span class="tocnumber">11</span> <span class="toctext">References</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-28">
+ <a href="#Further_reading"><span class="tocnumber">12</span> <span class="toctext">Further reading</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-29">
+ <a href="#External_links"><span class="tocnumber">13</span> <span class="toctext">External links</span></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <h2>
+ <span class="mw-headline" id="Etymology">Etymology</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ See also: <a href="/wiki/New_Zealand_place_names" title="New Zealand place names">New Zealand place names</a>
+ </div>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius,_showing_Nova_Zeelandia.png" class="image"><img alt="Brown square paper with Dutch writing and a thick red, curved line" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/220px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png" decoding="async" width="220" height="171" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/330px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png/440px-Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius%2C_showing_Nova_Zeelandia.png 2x" data-file-width="684" data-file-height="532" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Detail_of_1657_map_Polus_Antarcticus_by_Jan_Janssonius,_showing_Nova_Zeelandia.png" class="internal" title="Enlarge"></a>
+ </div>Detail from a 1657 map showing the western coastline of "Nova Zeelandia". (In this map, north is at the bottom.)
+ </div>
+ </div>
+ </div>
+ <p>
+ <a href="/wiki/Netherlands" title="Netherlands">Dutch</a> explorer Abel Tasman sighted New Zealand in 1642 and named it <i>Staten Land</i> "in honour of the <a href="/wiki/States_General_of_the_Netherlands" title="States General of the Netherlands">States General</a>" (Dutch parliament). He wrote, "it is possible that this land joins to the Staten Land but it is uncertain",<sup id="cite_ref-17" class="reference"><a href="#cite_note-17">[11]</a></sup> referring to <a href="/wiki/Isla_de_los_Estados" title="Isla de los Estados">a landmass of the same name</a> at the southern tip of South America, discovered by <a href="/wiki/Jacob_Le_Maire" title="Jacob Le Maire">Jacob Le Maire</a> in 1616.<sup id="cite_ref-18" class="reference"><a href="#cite_note-18">[12]</a></sup><sup id="cite_ref-19" class="reference"><a href="#cite_note-19">[13]</a></sup> In 1645, Dutch <a href="/wiki/Cartographers" class="mw-redirect" title="Cartographers">cartographers</a> renamed the land <i>Nova Zeelandia</i> after the <a href="/wiki/Seventeen_Provinces" title="Seventeen Provinces">Dutch province</a> of <a href="/wiki/Zeeland" title="Zeeland">Zeeland</a>.<sup id="cite_ref-20" class="reference"><a href="#cite_note-20">[14]</a></sup><sup id="cite_ref-21" class="reference"><a href="#cite_note-21">[15]</a></sup> British explorer <a href="/wiki/James_Cook" title="James Cook">James Cook</a> subsequently <a href="/wiki/Anglicisation" title="Anglicisation">anglicised</a> the name to New Zealand.<sup id="cite_ref-NZ_name_22-0" class="reference"><a href="#cite_note-NZ_name-22">[16]</a></sup>
+ </p>
+ <p>
+ <i><a href="/wiki/Aotearoa" title="Aotearoa">Aotearoa</a></i> (pronounced <span class="nowrap"><span class="IPA nopopups noexcerpt"><a href="/wiki/Help:IPA/English" title="Help:IPA/English">/<span style="border-bottom:1px dotted"><span title="/ˌ/: secondary stress follows">ˌ</span><span title="/aʊ/: 'ou' in 'mouth'">aʊ</span><span title="'t' in 'tie'">t</span><span title="/ɛəˈr/: 'ere' in 'thereof'">ɛəˈr</span><span title="/oʊ/: 'o' in 'code'">oʊ</span><span title="/./: syllable break">.</span><span title="/ə/: 'a' in 'about'">ə</span></span>/</a></span></span>; often translated as "land of the long white cloud")<sup id="cite_ref-FOOTNOTEKing200341_23-0" class="reference"><a href="#cite_note-FOOTNOTEKing200341-23">[17]</a></sup> is the current Māori name for New Zealand. It is unknown whether Māori had a name for the whole country before the arrival of Europeans, with <i>Aotearoa</i> originally referring to just the <a href="/wiki/North_Island" title="North Island">North Island</a>.<sup id="cite_ref-FOOTNOTEHayMaclaganGordon200872_24-0" class="reference"><a href="#cite_note-FOOTNOTEHayMaclaganGordon200872-24">[18]</a></sup> Māori had several traditional names for the two main islands, including <i>Te Ika-a-Māui</i> (the fish of <a href="/wiki/M%C4%81ui_(M%C4%81ori_mythology)" title="Māui (Māori mythology)">Māui</a>) for the North Island and <i>Te Waipounamu</i> (the waters of <a href="/wiki/Pounamu" title="Pounamu">greenstone</a>) or <i>Te Waka o Aoraki</i> (the canoe of <a href="/wiki/Aoraki" class="mw-redirect" title="Aoraki">Aoraki</a>) for the <a href="/wiki/South_Island" title="South Island">South Island</a>.<sup id="cite_ref-FOOTNOTEMein_Smith20056_25-0" class="reference"><a href="#cite_note-FOOTNOTEMein_Smith20056-25">[19]</a></sup> Early European maps labelled the islands North (North Island), Middle (South Island) and South (<a href="/wiki/Stewart_Island_/_Rakiura" class="mw-redirect" title="Stewart Island / Rakiura">Stewart Island / Rakiura</a>).<sup id="cite_ref-26" class="reference"><a href="#cite_note-26">[20]</a></sup> In 1830, mapmakers began to use "North" and "South" on their maps to distinguish the two largest islands and by 1907 this was the accepted norm.<sup id="cite_ref-NZ_name_22-1" class="reference"><a href="#cite_note-NZ_name-22">[16]</a></sup> The <a href="/wiki/New_Zealand_Geographic_Board" title="New Zealand Geographic Board">New Zealand Geographic Board</a> discovered in 2009 that the names of the North Island and South Island had never been formalised, and names and alternative names were formalised in 2013. This set the names as North Island or Te Ika-a-Māui, and South Island or Te Waipounamu.<sup id="cite_ref-Williamson2013_27-0" class="reference"><a href="#cite_note-Williamson2013-27">[21]</a></sup> For each island, either its English or Māori name can be used, or both can be used together.<sup id="cite_ref-Williamson2013_27-1" class="reference"><a href="#cite_note-Williamson2013-27">[21]</a></sup>
+ </p>
+ <div style="clear:left;"></div>
+ <h2>
+ <span class="mw-headline" id="History">History</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/History_of_New_Zealand" title="History of New Zealand">History of New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:292px;">
+ <a href="/wiki/File:Polynesian_Migration.svg" class="image"><img alt="One set of arrows point from Taiwan to Melanesia to Fiji/Samoa and then to the Marquesas Islands. The population then spread, some going south to New Zealand and others going north to Hawai'i. A second set start in southern Asia and end in Melanesia." src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/290px-Polynesian_Migration.svg.png" decoding="async" width="290" height="290" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/435px-Polynesian_Migration.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Polynesian_Migration.svg/580px-Polynesian_Migration.svg.png 2x" data-file-width="553" data-file-height="553" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Polynesian_Migration.svg" class="internal" title="Enlarge"></a>
+ </div>The <a href="/wiki/M%C4%81ori_people" title="Māori people">Māori people</a> are most likely descended from people who emigrated from <a href="/wiki/Taiwan" title="Taiwan">Taiwan</a> to <a href="/wiki/Melanesia" title="Melanesia">Melanesia</a> and then travelled east through to the <a href="/wiki/Society_Islands" title="Society Islands">Society Islands</a>. After a pause of 70 to 265 years, a new wave of exploration led to the discovery and settlement of New Zealand.<sup id="cite_ref-28" class="reference"><a href="#cite_note-28">[22]</a></sup>
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand was one of the last major landmasses settled by humans. <a href="/wiki/Radiocarbon_dating" title="Radiocarbon dating">Radiocarbon dating</a>, evidence of <a href="/wiki/Deforestation" title="Deforestation">deforestation</a><sup id="cite_ref-29" class="reference"><a href="#cite_note-29">[23]</a></sup> and <a href="/wiki/Mitochondrial_DNA" title="Mitochondrial DNA">mitochondrial DNA</a> variability within <a href="/wiki/M%C4%81ori_people" title="Māori people">Māori</a> populations<sup id="cite_ref-30" class="reference"><a href="#cite_note-30">[24]</a></sup> suggest New Zealand was first settled by Eastern <a href="/wiki/Polynesians" title="Polynesians">Polynesians</a> between 1250 and 1300,<sup id="cite_ref-FOOTNOTEMein_Smith20056_25-1" class="reference"><a href="#cite_note-FOOTNOTEMein_Smith20056-25">[19]</a></sup><sup id="cite_ref-31" class="reference"><a href="#cite_note-31">[25]</a></sup> concluding a long series of voyages through the southern Pacific islands.<sup id="cite_ref-32" class="reference"><a href="#cite_note-32">[26]</a></sup> Over the centuries that followed, these settlers developed a distinct culture now known as Māori. The population was divided into <i><a href="/wiki/Iwi" title="Iwi">iwi</a></i> (tribes) and <i><a href="/wiki/Hap%C5%AB" title="Hapū">hapū</a></i> (subtribes) who would sometimes cooperate, sometimes compete and sometimes fight against each other.<sup id="cite_ref-33" class="reference"><a href="#cite_note-33">[27]</a></sup> At some point a group of Māori migrated to <i>Rēkohu</i>, now known as the <a href="/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a>, where they developed their distinct <a href="/wiki/Moriori" title="Moriori">Moriori</a> culture.<sup id="cite_ref-34" class="reference"><a href="#cite_note-34">[28]</a></sup><sup id="cite_ref-35" class="reference"><a href="#cite_note-35">[29]</a></sup> The Moriori population was all but wiped out between 1835 and 1862, largely because of <a href="/wiki/Taranaki_(iwi)" title="Taranaki (iwi)">Taranaki</a> Māori invasion and enslavement in the 1830s, although European diseases also contributed. In 1862 only 101 survived, and the last known full-blooded Moriori died in 1933.<sup id="cite_ref-36" class="reference"><a href="#cite_note-36">[30]</a></sup>
+ </p>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:Cook_chart_of_New_Zealand.jpg" class="image"><img alt="An engraving of a sketched coastline on white background" src="//upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/170px-Cook_chart_of_New_Zealand.jpg" decoding="async" width="170" height="235" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/255px-Cook_chart_of_New_Zealand.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/22/Cook_chart_of_New_Zealand.jpg/340px-Cook_chart_of_New_Zealand.jpg 2x" data-file-width="1093" data-file-height="1508" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Cook_chart_of_New_Zealand.jpg" class="internal" title="Enlarge"></a>
+ </div>Map of the New Zealand coastline as Cook charted it on his <a href="/wiki/First_voyage_of_James_Cook" title="First voyage of James Cook">first visit</a> in 1769–70. The track of the <i><a href="/wiki/HMS_Endeavour" title="HMS Endeavour">Endeavour</a></i> is also shown.
+ </div>
+ </div>
+ </div>
+ <p>
+ The first <a href="/wiki/Ethnic_groups_in_Europe" title="Ethnic groups in Europe">Europeans</a> known to have reached New Zealand were Dutch explorer <a href="/wiki/Abel_Tasman" title="Abel Tasman">Abel Tasman</a> and his crew in 1642.<sup id="cite_ref-FOOTNOTEMein_Smith200523_37-0" class="reference"><a href="#cite_note-FOOTNOTEMein_Smith200523-37">[31]</a></sup> In a hostile encounter, four crew members were killed and at least one Māori was hit by <a href="/wiki/Canister_shot" title="Canister shot">canister shot</a>.<sup id="cite_ref-38" class="reference"><a href="#cite_note-38">[32]</a></sup> Europeans did not revisit New Zealand until 1769 when British explorer <a href="/wiki/James_Cook" title="James Cook">James Cook</a> mapped almost the entire coastline.<sup id="cite_ref-FOOTNOTEMein_Smith200523_37-1" class="reference"><a href="#cite_note-FOOTNOTEMein_Smith200523-37">[31]</a></sup> Following Cook, New Zealand was visited by numerous European and North American <a href="/wiki/History_of_whaling" title="History of whaling">whaling</a>, <a href="/wiki/Seal_hunting" title="Seal hunting">sealing</a> and trading ships. They traded European food, metal tools, weapons and other goods for timber, Māori food, artefacts and water.<sup id="cite_ref-FOOTNOTEKing2003122_39-0" class="reference"><a href="#cite_note-FOOTNOTEKing2003122-39">[33]</a></sup> The introduction of the potato and the <a href="/wiki/Musket" title="Musket">musket</a> transformed Māori agriculture and warfare. Potatoes provided a reliable food surplus, which enabled longer and more sustained military campaigns.<sup id="cite_ref-40" class="reference"><a href="#cite_note-40">[34]</a></sup> The resulting intertribal <a href="/wiki/Musket_Wars" title="Musket Wars">Musket Wars</a> encompassed over 600 battles between 1801 and 1840, killing 30,000–40,000 Māori.<sup id="cite_ref-41" class="reference"><a href="#cite_note-41">[35]</a></sup> From the early 19th century, Christian <a href="/wiki/Missionary" title="Missionary">missionaries</a> began to settle New Zealand, eventually <a href="/wiki/Religious_conversion" title="Religious conversion">converting</a> most of the Māori population.<sup id="cite_ref-42" class="reference"><a href="#cite_note-42">[36]</a></sup> The Māori population declined to around 40% of its pre-contact level during the 19th century; introduced diseases were the major factor.<sup id="cite_ref-43" class="reference"><a href="#cite_note-43">[37]</a></sup>
+ </p>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:Treatyofwaitangi.jpg" class="image"><img alt="A torn sheet of paper" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/170px-Treatyofwaitangi.jpg" decoding="async" width="170" height="318" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/255px-Treatyofwaitangi.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/87/Treatyofwaitangi.jpg/340px-Treatyofwaitangi.jpg 2x" data-file-width="3091" data-file-height="5788" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Treatyofwaitangi.jpg" class="internal" title="Enlarge"></a>
+ </div>The Waitangi sheet from the <a href="/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a>
+ </div>
+ </div>
+ </div>
+ <p>
+ In 1788 Captain <a href="/wiki/Arthur_Phillip" title="Arthur Phillip">Arthur Phillip</a> assumed the position of <a href="/wiki/Governor_of_New_South_Wales" title="Governor of New South Wales">Governor</a> of the new British colony of <a href="/wiki/Colony_of_New_South_Wales" title="Colony of New South Wales">New South Wales</a> which according to his commission included New Zealand.<sup id="cite_ref-44" class="reference"><a href="#cite_note-44">[38]</a></sup> The British Government appointed <a href="/wiki/James_Busby" title="James Busby">James Busby</a> as British Resident to New Zealand in 1832 following a petition from northern Māori.<sup id="cite_ref-Busby_45-0" class="reference"><a href="#cite_note-Busby-45">[39]</a></sup> In 1835, following an announcement of impending French settlement by <a href="/wiki/Charles_de_Thierry" title="Charles de Thierry">Charles de Thierry</a>, the nebulous <a href="/wiki/United_Tribes_of_New_Zealand" title="United Tribes of New Zealand">United Tribes of New Zealand</a> sent a <a href="/wiki/Declaration_of_the_Independence_of_New_Zealand" title="Declaration of the Independence of New Zealand">Declaration of Independence</a> to King <a href="/wiki/William_IV_of_the_United_Kingdom" title="William IV of the United Kingdom">William IV of the United Kingdom</a> asking for protection.<sup id="cite_ref-Busby_45-1" class="reference"><a href="#cite_note-Busby-45">[39]</a></sup> Ongoing unrest, the proposed settlement of New Zealand by the <a href="/wiki/New_Zealand_Company" title="New Zealand Company">New Zealand Company</a> (which had already sent its first ship of surveyors to buy land from Māori) and the dubious legal standing of the Declaration of Independence prompted the <a href="/wiki/Colonial_Office" title="Colonial Office">Colonial Office</a> to send Captain <a href="/wiki/William_Hobson" title="William Hobson">William Hobson</a> to claim sovereignty for the <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a> and negotiate a treaty with the Māori.<sup id="cite_ref-46" class="reference"><a href="#cite_note-46">[40]</a></sup> The <a href="/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a> was first signed in the <a href="/wiki/Bay_of_Islands" title="Bay of Islands">Bay of Islands</a> on 6 February 1840.<sup id="cite_ref-Wilson2009_47-0" class="reference"><a href="#cite_note-Wilson2009-47">[41]</a></sup> In response to the New Zealand Company's attempts to establish an independent settlement in <a href="/wiki/Wellington" title="Wellington">Wellington</a><sup id="cite_ref-48" class="reference"><a href="#cite_note-48">[42]</a></sup> and French settlers purchasing land in <a href="/wiki/Akaroa" title="Akaroa">Akaroa</a>,<sup id="cite_ref-49" class="reference"><a href="#cite_note-49">[43]</a></sup> Hobson declared British sovereignty over all of New Zealand on 21 May 1840, even though copies of the Treaty were still circulating throughout the country for Māori to sign.<sup id="cite_ref-50" class="reference"><a href="#cite_note-50">[44]</a></sup> With the signing of the Treaty and declaration of sovereignty the number of immigrants, particularly from the United Kingdom, began to increase.<sup id="cite_ref-51" class="reference"><a href="#cite_note-51">[45]</a></sup>
+ </p>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:292px;">
+ <a href="/wiki/File:1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay,_New_Zealand.jpg" class="image"><img alt="Black and white engraving depicting a crowd of people" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/290px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg" decoding="async" width="290" height="208" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/435px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/3b/1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg/580px-1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay%2C_New_Zealand.jpg 2x" data-file-width="6000" data-file-height="4300" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:1863_Meeting_of_Settlers_and_Maoris_at_Hawke%27s_Bay,_New_Zealand.jpg" class="internal" title="Enlarge"></a>
+ </div>A meeting of European and Māori inhabitants of <a href="/wiki/Hawke%27s_Bay_Province" title="Hawke's Bay Province">Hawke's Bay Province</a>. Engraving, 1863.
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand, still part of the colony of New South Wales, became a separate <a href="/wiki/Crown_colony" title="Crown colony">Colony</a> <a href="/wiki/Colony_of_New_Zealand" title="Colony of New Zealand">of New Zealand</a> on 1 July 1841.<sup id="cite_ref-52" class="reference"><a href="#cite_note-52">[46]</a></sup> Armed conflict began between the Colonial government and Māori in 1843 with the <a href="/wiki/Wairau_Affray" title="Wairau Affray">Wairau Affray</a> over land and disagreements over sovereignty. These conflicts, mainly in the North Island, saw thousands of Imperial troops and the Royal Navy come to New Zealand and became known as the <a href="/wiki/New_Zealand_Wars" title="New Zealand Wars">New Zealand Wars</a>. Following these armed conflicts, large amounts of <a href="/wiki/New_Zealand_land_confiscations" class="mw-redirect" title="New Zealand land confiscations">Māori land was confiscated by the government</a> to meet settler demands.<sup id="cite_ref-53" class="reference"><a href="#cite_note-53">[47]</a></sup>
+ </p>
+ <p>
+ The colony gained a <a href="/wiki/New_Zealand_Constitution_Act_1852" title="New Zealand Constitution Act 1852">representative government in 1852</a> and the <a href="/wiki/1st_New_Zealand_Parliament" title="1st New Zealand Parliament">first Parliament</a> met in 1854.<sup id="cite_ref-G_and_N_54-0" class="reference"><a href="#cite_note-G_and_N-54">[48]</a></sup> In 1856 the colony effectively became self-governing, gaining responsibility over all domestic matters other than <a href="/wiki/Indigenous_peoples" title="Indigenous peoples">native</a> policy.<sup id="cite_ref-G_and_N_54-1" class="reference"><a href="#cite_note-G_and_N-54">[48]</a></sup> (Control over native policy was granted in the mid-1860s.<sup id="cite_ref-G_and_N_54-2" class="reference"><a href="#cite_note-G_and_N-54">[48]</a></sup>) Following concerns that the South Island might form a separate colony, premier <a href="/wiki/Alfred_Domett" title="Alfred Domett">Alfred Domett</a> moved a resolution to transfer the <a href="/wiki/Capital_of_New_Zealand" title="Capital of New Zealand">capital</a> from Auckland to a locality near <a href="/wiki/Cook_Strait" title="Cook Strait">Cook Strait</a>.<sup id="cite_ref-55" class="reference"><a href="#cite_note-55">[49]</a></sup> Wellington was chosen for its central location, with Parliament officially sitting there for the first time in 1865.<sup id="cite_ref-56" class="reference"><a href="#cite_note-56">[50]</a></sup>
+ </p>
+ <p>
+ In 1891 the <a href="/wiki/New_Zealand_Liberal_Party" title="New Zealand Liberal Party">Liberal Party</a> came to power as the first organised political party.<sup id="cite_ref-Liberal_57-0" class="reference"><a href="#cite_note-Liberal-57">[51]</a></sup> The <a href="/wiki/Liberal_Government_of_New_Zealand" title="Liberal Government of New Zealand">Liberal Government</a>, led by <a href="/wiki/Richard_Seddon" title="Richard Seddon">Richard Seddon</a> for most of its period in office,<sup id="cite_ref-58" class="reference"><a href="#cite_note-58">[52]</a></sup> passed many important social and economic measures. In 1893 New Zealand was the first nation in the world to grant all <a href="/wiki/Women%27s_suffrage_in_New_Zealand" title="Women's suffrage in New Zealand">women the right to vote</a><sup id="cite_ref-Liberal_57-1" class="reference"><a href="#cite_note-Liberal-57">[51]</a></sup> and in 1894 pioneered the <a href="/wiki/Industrial_Conciliation_and_Arbitration_Act_1894" title="Industrial Conciliation and Arbitration Act 1894">adoption of compulsory arbitration between employers and unions</a>.<sup id="cite_ref-59" class="reference"><a href="#cite_note-59">[53]</a></sup>
+ </p>
+ <p>
+ In 1907, at the request of the New Zealand Parliament, King <a href="/wiki/Edward_VII" title="Edward VII">Edward VII</a> proclaimed New Zealand a <a href="/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">Dominion</a> within the British Empire,<sup id="cite_ref-60" class="reference"><a href="#cite_note-60">[54]</a></sup> reflecting its self-governing status.<sup id="cite_ref-61" class="reference"><a href="#cite_note-61">[55]</a></sup> In 1947 the country <a href="/wiki/Statute_of_Westminster_Adoption_Act_1947" title="Statute of Westminster Adoption Act 1947">adopted</a> the <a href="/wiki/Statute_of_Westminster_1931" title="Statute of Westminster 1931">Statute of Westminster</a>, confirming that the British Parliament could no longer legislate for New Zealand without the consent of New Zealand.<sup id="cite_ref-G_and_N_54-3" class="reference"><a href="#cite_note-G_and_N-54">[48]</a></sup>
+ </p>
+ <p>
+ Early in the 20th century, New Zealand was involved in world affairs, fighting in the <a href="/wiki/Military_history_of_New_Zealand_in_World_War_I" class="mw-redirect" title="Military history of New Zealand in World War I">First</a> and <a href="/wiki/Military_history_of_New_Zealand_during_World_War_II" title="Military history of New Zealand during World War II">Second World Wars</a><sup id="cite_ref-62" class="reference"><a href="#cite_note-62">[56]</a></sup> and suffering through the <a href="/wiki/Great_Depression" title="Great Depression">Great Depression</a>.<sup id="cite_ref-63" class="reference"><a href="#cite_note-63">[57]</a></sup> The depression led to the election of the <a href="/wiki/First_Labour_Government_of_New_Zealand" title="First Labour Government of New Zealand">First Labour Government</a> and the establishment of a comprehensive <a href="/wiki/Welfare_state" title="Welfare state">welfare state</a> and a <a href="/wiki/Protectionist" class="mw-redirect" title="Protectionist">protectionist</a> economy.<sup id="cite_ref-64" class="reference"><a href="#cite_note-64">[58]</a></sup> New Zealand experienced increasing prosperity following the Second World War<sup id="cite_ref-65" class="reference"><a href="#cite_note-65">[59]</a></sup> and Māori began to leave their traditional rural life and move to the cities in search of work.<sup id="cite_ref-66" class="reference"><a href="#cite_note-66">[60]</a></sup> A <a href="/wiki/M%C4%81ori_protest_movement" title="Māori protest movement">Māori protest movement</a> developed, which criticised <a href="/wiki/Eurocentrism" title="Eurocentrism">Eurocentrism</a> and worked for greater recognition of <a href="/wiki/M%C4%81ori_culture" title="Māori culture">Māori culture</a> and of the Treaty of Waitangi.<sup id="cite_ref-67" class="reference"><a href="#cite_note-67">[61]</a></sup> In 1975, a <a href="/wiki/Waitangi_Tribunal" title="Waitangi Tribunal">Waitangi Tribunal</a> was set up to investigate alleged breaches of the Treaty, and it was enabled to investigate historic grievances in 1985.<sup id="cite_ref-Wilson2009_47-1" class="reference"><a href="#cite_note-Wilson2009-47">[41]</a></sup> The government has negotiated <a href="/wiki/Treaty_of_Waitangi_claims_and_settlements" title="Treaty of Waitangi claims and settlements">settlements of these grievances</a> with many iwi,<sup id="cite_ref-68" class="reference"><a href="#cite_note-68">[62]</a></sup> although <a href="/wiki/New_Zealand_foreshore_and_seabed_controversy" title="New Zealand foreshore and seabed controversy">Māori claims to the foreshore and seabed</a> have proved controversial in the 2000s.<sup id="cite_ref-69" class="reference"><a href="#cite_note-69">[63]</a></sup><sup id="cite_ref-70" class="reference"><a href="#cite_note-70">[64]</a></sup>
+ </p>
+ <h2>
+ <span class="mw-headline" id="Government_and_politics">Government and politics</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Government_of_New_Zealand" title="Government of New Zealand">Government of New Zealand</a> and <a href="/wiki/Politics_of_New_Zealand" title="Politics of New Zealand">Politics of New Zealand</a>
+ </div>
+ <div class="thumb tmulti tright">
+ <div class="thumbinner" style="width:312px;max-width:312px">
+ <div class="trow">
+ <div class="tsingle" style="width:154px;max-width:154px">
+ <div class="thumbimage" style="height:190px;overflow:hidden">
+ <a href="/wiki/Elizabeth_II" title="Elizabeth II"><img alt="The Queen wearing her New Zealand insignia" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/152px-Queen_Elizabeth_II_of_New_Zealand_2.jpg" decoding="async" width="152" height="190" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/228px-Queen_Elizabeth_II_of_New_Zealand_2.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Queen_Elizabeth_II_of_New_Zealand_2.jpg/304px-Queen_Elizabeth_II_of_New_Zealand_2.jpg 2x" data-file-width="1182" data-file-height="1478" /></a>
+ </div>
+ <div class="thumbcaption">
+ <a href="/wiki/Elizabeth_II" title="Elizabeth II">Elizabeth II</a>, Queen of New Zealand
+ </div>
+ </div>
+ <div class="tsingle" style="width:154px;max-width:154px">
+ <div class="thumbimage" style="height:190px;overflow:hidden">
+ <a href="/wiki/Jacinda_Ardern" title="Jacinda Ardern"><img alt="A smiling woman wearing a black dress" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/152px-Ardern_Cropped.png" decoding="async" width="152" height="191" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/228px-Ardern_Cropped.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Ardern_Cropped.png/304px-Ardern_Cropped.png 2x" data-file-width="499" data-file-height="627" /></a>
+ </div>
+ <div class="thumbcaption">
+ <a href="/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>, Prime Minister of New Zealand
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand is a <a href="/wiki/Constitutional_monarchy" title="Constitutional monarchy">constitutional monarchy</a> with a <a href="/wiki/Parliamentary_democracy" class="mw-redirect" title="Parliamentary democracy">parliamentary democracy</a>,<sup id="cite_ref-GG_constitution_71-0" class="reference"><a href="#cite_note-GG_constitution-71">[65]</a></sup> although <a href="/wiki/Constitution_of_New_Zealand" title="Constitution of New Zealand">its constitution</a> is <a href="/wiki/Uncodified_constitution" title="Uncodified constitution">not codified</a>.<sup id="cite_ref-Economist_factsheet_72-0" class="reference"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> <a href="/wiki/Elizabeth_II" title="Elizabeth II">Elizabeth II</a> is the <a href="/wiki/Queen_of_New_Zealand" class="mw-redirect" title="Queen of New Zealand">Queen of New Zealand</a><sup id="cite_ref-73" class="reference"><a href="#cite_note-73">[67]</a></sup> and thus the <a href="/wiki/Head_of_state" title="Head of state">head of state</a>.<sup id="cite_ref-74" class="reference"><a href="#cite_note-74">[68]</a></sup> The Queen is represented by the <a href="/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">governor-general</a>, whom she appoints on the <a href="/wiki/Advice_(constitutional)" title="Advice (constitutional)">advice</a> of the <a href="/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">prime minister</a>.<sup id="cite_ref-75" class="reference"><a href="#cite_note-75">[69]</a></sup> The governor-general can exercise the Crown's <a href="/wiki/Prerogative_powers" class="mw-redirect" title="Prerogative powers">prerogative powers</a>, such as reviewing cases of injustice and making appointments of <a href="/wiki/Ministers_of_the_New_Zealand_Government" title="Ministers of the New Zealand Government">ministers</a>, ambassadors and other key public officials,<sup id="cite_ref-76" class="reference"><a href="#cite_note-76">[70]</a></sup> and in rare situations, the <a href="/wiki/Reserve_power" title="Reserve power">reserve powers</a> (e.g. the power to dissolve parliament or refuse the <a href="/wiki/Royal_assent" title="Royal assent">royal assent</a> of a <a href="/wiki/Bill_(law)" title="Bill (law)">bill</a> into law).<sup id="cite_ref-reserve_Powers_77-0" class="reference"><a href="#cite_note-reserve_Powers-77">[71]</a></sup> The powers of the monarch and the governor-general are limited by constitutional constraints and they cannot normally be exercised without the advice of ministers.<sup id="cite_ref-reserve_Powers_77-1" class="reference"><a href="#cite_note-reserve_Powers-77">[71]</a></sup>
+ </p>
+ <p>
+ The <a href="/wiki/New_Zealand_Parliament" title="New Zealand Parliament">New Zealand Parliament</a> holds <a href="/wiki/Legislative_power" class="mw-redirect" title="Legislative power">legislative power</a> and consists of the Queen and the <a href="/wiki/New_Zealand_House_of_Representatives" title="New Zealand House of Representatives">House of Representatives</a>.<sup id="cite_ref-parliament_facts_78-0" class="reference"><a href="#cite_note-parliament_facts-78">[72]</a></sup> It also included an upper house, the <a href="/wiki/New_Zealand_Legislative_Council" title="New Zealand Legislative Council">Legislative Council</a>, until this was abolished in 1950.<sup id="cite_ref-parliament_facts_78-1" class="reference"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The <a href="/wiki/Supremacy_of_parliament" class="mw-redirect" title="Supremacy of parliament">supremacy of parliament</a> over the Crown and other government institutions was established in England by the <a href="/wiki/Bill_of_Rights_1689" title="Bill of Rights 1689">Bill of Rights 1689</a> and has been ratified as law in New Zealand.<sup id="cite_ref-parliament_facts_78-2" class="reference"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The House of Representatives is democratically elected and a government is formed from the party or <a href="/wiki/Coalition_government" title="Coalition government">coalition</a> with the majority of seats. If no majority is formed, a <a href="/wiki/Minority_government" title="Minority government">minority government</a> can be formed if support from other parties during <a href="/wiki/Confidence_and_supply" title="Confidence and supply">confidence and supply</a> votes is assured.<sup id="cite_ref-parliament_facts_78-3" class="reference"><a href="#cite_note-parliament_facts-78">[72]</a></sup> The governor-general appoints ministers under advice from the prime minister, who is by <a href="/wiki/Constitutional_convention_(political_custom)" title="Constitutional convention (political custom)">convention</a> the <a href="/wiki/Parliamentary_leader" title="Parliamentary leader">parliamentary leader</a> of the governing party or coalition.<sup id="cite_ref-79" class="reference"><a href="#cite_note-79">[73]</a></sup> <a href="/wiki/Cabinet_of_New_Zealand" title="Cabinet of New Zealand">Cabinet</a>, formed by ministers and led by the prime minister, is the highest policy-making body in government and responsible for deciding significant government actions.<sup id="cite_ref-80" class="reference"><a href="#cite_note-80">[74]</a></sup> Members of Cabinet make major decisions collectively, and are therefore <a href="/wiki/Cabinet_collective_responsibility" title="Cabinet collective responsibility">collectively responsible</a> for the consequences of these decisions.<sup id="cite_ref-81" class="reference"><a href="#cite_note-81">[75]</a></sup>
+ </p>
+ <p>
+ A <a href="/wiki/Elections_in_New_Zealand" title="Elections in New Zealand">parliamentary general election</a> must be called no later than three years after the previous election.<sup id="cite_ref-82" class="reference"><a href="#cite_note-82">[76]</a></sup> Almost all general elections between <a href="/wiki/1853_New_Zealand_general_election" title="1853 New Zealand general election">1853</a> and <a href="/wiki/1993_New_Zealand_general_election" title="1993 New Zealand general election">1993</a> were held under the <a href="/wiki/First-past-the-post_voting" title="First-past-the-post voting">first-past-the-post voting</a> system.<sup id="cite_ref-road_83-0" class="reference"><a href="#cite_note-road-83">[77]</a></sup> Since the <a href="/wiki/1996_New_Zealand_general_election" title="1996 New Zealand general election">1996 election</a>, a form of <a href="/wiki/Proportional_representation" title="Proportional representation">proportional representation</a> called <a href="/wiki/Mixed-member_proportional" class="mw-redirect" title="Mixed-member proportional">mixed-member proportional</a> (MMP) has been used.<sup id="cite_ref-Economist_factsheet_72-1" class="reference"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> Under the MMP system, each person has two votes; one is for a candidate standing in the voter's <a href="/wiki/New_Zealand_electorates" title="New Zealand electorates">electorate</a> and the other is for a party. Since the <a href="/wiki/2014_New_Zealand_general_election" title="2014 New Zealand general election">2014 election</a>, there have been 71 electorates (which include seven <a href="/wiki/M%C4%81ori_electorates" title="Māori electorates">Māori electorates</a> in which only Māori can optionally vote),<sup id="cite_ref-84" class="reference"><a href="#cite_note-84">[78]</a></sup> and the remaining 49 of the 120 seats are assigned so that representation in parliament reflects the party vote, with the threshold that a party must win at least one electorate or 5% of the total party vote before it is eligible for a seat.<sup id="cite_ref-85" class="reference"><a href="#cite_note-85">[79]</a></sup>
+ </p>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Seddon_Statue_in_Parliament_Grounds.jpg" class="image"><img alt="A block of buildings fronted by a large statue." src="//upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/220px-Seddon_Statue_in_Parliament_Grounds.jpg" decoding="async" width="220" height="171" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/330px-Seddon_Statue_in_Parliament_Grounds.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/32/Seddon_Statue_in_Parliament_Grounds.jpg/440px-Seddon_Statue_in_Parliament_Grounds.jpg 2x" data-file-width="3297" data-file-height="2557" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Seddon_Statue_in_Parliament_Grounds.jpg" class="internal" title="Enlarge"></a>
+ </div>A statue of <a href="/wiki/Richard_Seddon" title="Richard Seddon">Richard Seddon</a>, the "<a href="/wiki/Beehive_(New_Zealand)" title="Beehive (New Zealand)">Beehive</a>" (Executive Wing), and <a href="/wiki/Parliament_House,_Wellington" title="Parliament House, Wellington">Parliament House</a> (right), in Parliament Grounds, <a href="/wiki/Wellington" title="Wellington">Wellington</a>.
+ </div>
+ </div>
+ </div>
+ <p>
+ Elections since the 1930s have been dominated by two political parties, <a href="/wiki/New_Zealand_National_Party" title="New Zealand National Party">National</a> and <a href="/wiki/New_Zealand_Labour_Party" title="New Zealand Labour Party">Labour</a>.<sup id="cite_ref-road_83-1" class="reference"><a href="#cite_note-road-83">[77]</a></sup> Between March 2005 and August 2006, New Zealand became the first country in the world in which all the highest offices in the land—head of state, governor-general, prime minister, <a href="/wiki/Speaker_of_the_New_Zealand_House_of_Representatives" title="Speaker of the New Zealand House of Representatives">speaker</a> and <a href="/wiki/Chief_Justice_of_New_Zealand" title="Chief Justice of New Zealand">chief justice</a>—were occupied simultaneously by women.<sup id="cite_ref-86" class="reference"><a href="#cite_note-86">[80]</a></sup> The current prime minister is <a href="/wiki/Jacinda_Ardern" title="Jacinda Ardern">Jacinda Ardern</a>, who has been in office since 26 October 2017.<sup id="cite_ref-87" class="reference"><a href="#cite_note-87">[81]</a></sup> She is the country's third female prime minister.<sup id="cite_ref-88" class="reference"><a href="#cite_note-88">[82]</a></sup>
+ </p>
+ <p>
+ <a href="/wiki/Judiciary_of_New_Zealand" title="Judiciary of New Zealand">New Zealand's judiciary</a>, headed by the chief justice,<sup id="cite_ref-89" class="reference"><a href="#cite_note-89">[83]</a></sup> includes the <a href="/wiki/Supreme_Court_of_New_Zealand" title="Supreme Court of New Zealand">Supreme Court</a>, <a href="/wiki/Court_of_Appeal_of_New_Zealand" title="Court of Appeal of New Zealand">Court of Appeal</a>, the <a href="/wiki/High_Court_of_New_Zealand" title="High Court of New Zealand">High Court</a>, and subordinate courts.<sup id="cite_ref-90" class="reference"><a href="#cite_note-90">[84]</a></sup> Judges and judicial officers are appointed non-politically and under strict rules regarding tenure to help maintain <a href="/wiki/Judicial_independence" title="Judicial independence">judicial independence</a>.<sup id="cite_ref-Economist_factsheet_72-2" class="reference"><a href="#cite_note-Economist_factsheet-72">[66]</a></sup> This theoretically allows the judiciary to interpret the law based solely on the legislation enacted by Parliament without other influences on their decisions.<sup id="cite_ref-91" class="reference"><a href="#cite_note-91">[85]</a></sup>
+ </p>
+ <p>
+ New Zealand is identified as one of the world's most stable and well-governed states.<sup id="cite_ref-92" class="reference"><a href="#cite_note-92">[86]</a></sup> As at 2017<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup>, the country was ranked fourth in the strength of its democratic institutions,<sup id="cite_ref-93" class="reference"><a href="#cite_note-93">[87]</a></sup> and first in government transparency and <a href="/wiki/Corruption_in_New_Zealand" title="Corruption in New Zealand">lack of corruption</a>.<sup id="cite_ref-94" class="reference"><a href="#cite_note-94">[88]</a></sup> A 2017 <a href="/wiki/Country_Reports_on_Human_Rights_Practices" title="Country Reports on Human Rights Practices">Human Rights Report</a> by the U.S. Department of State noted that the government generally <a href="/wiki/Human_rights_in_New_Zealand" title="Human rights in New Zealand">respected the rights</a> of individuals, but voiced concerns regarding the social status of the Māori population.<sup id="cite_ref-95" class="reference"><a href="#cite_note-95">[89]</a></sup> New Zealand ranks highly for civic participation in the political process, with 77% <a href="/wiki/Voter_turnout" title="Voter turnout">voter turnout</a> during recent elections, compared to an <abbr title="Organisation for Economic Co-operation and Development">OECD</abbr> average of 69%.<sup id="cite_ref-96" class="reference"><a href="#cite_note-96">[90]</a></sup>
+ </p>
+ <div role="note" class="hatnote navigation-not-searchable">
+ See also: <a href="/wiki/International_rankings_of_New_Zealand" title="International rankings of New Zealand">International rankings of New Zealand</a>
+ </div>
+ <h3>
+ <span class="mw-headline" id="Foreign_relations_and_military">Foreign relations and military</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Foreign_relations_of_New_Zealand" title="Foreign relations of New Zealand">Foreign relations of New Zealand</a> and <a href="/wiki/New_Zealand_Defence_Force" title="New Zealand Defence Force">New Zealand Defence Force</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:E_003261_E_Maoris_in_North_Africa_July_1941.jpg" class="image"><img alt="A squad of men kneel in the desert sand while performing a war dance" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/220px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg" decoding="async" width="220" height="217" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/330px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/77/E_003261_E_Maoris_in_North_Africa_July_1941.jpg/440px-E_003261_E_Maoris_in_North_Africa_July_1941.jpg 2x" data-file-width="3040" data-file-height="2999" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:E_003261_E_Maoris_in_North_Africa_July_1941.jpg" class="internal" title="Enlarge"></a>
+ </div><a href="/wiki/M%C4%81ori_Battalion" title="Māori Battalion">Māori Battalion</a> <a href="/wiki/Haka" title="Haka">haka</a> in Egypt, 1941
+ </div>
+ </div>
+ </div>
+ <p>
+ Early colonial New Zealand allowed the British Government to determine external trade and be responsible for foreign policy.<sup id="cite_ref-97" class="reference"><a href="#cite_note-97">[91]</a></sup> The 1923 and 1926 <a href="/wiki/Imperial_Conference" title="Imperial Conference">Imperial Conferences</a> decided that New Zealand should be allowed to negotiate its own political <a href="/wiki/Treaty" title="Treaty">treaties</a> and the first commercial treaty was ratified in 1928 with Japan. On 3 September 1939 New Zealand allied itself with Britain and <a href="/wiki/Declaration_of_war" title="Declaration of war">declared war</a> on Germany with Prime Minister <a href="/wiki/Michael_Joseph_Savage" title="Michael Joseph Savage">Michael Joseph Savage</a> proclaiming, "Where she goes, we go; where she stands, we stand."<sup id="cite_ref-98" class="reference"><a href="#cite_note-98">[92]</a></sup>
+ </p>
+ <p>
+ In 1951 the United Kingdom became increasingly focused on its European interests,<sup id="cite_ref-99" class="reference"><a href="#cite_note-99">[93]</a></sup> while New Zealand joined <a href="/wiki/Australia%E2%80%93New_Zealand_relations" title="Australia–New Zealand relations">Australia</a> and the <a href="/wiki/New_Zealand%E2%80%93United_States_relations" title="New Zealand–United States relations">United States</a> in the <a href="/wiki/ANZUS" title="ANZUS">ANZUS</a> security treaty.<sup id="cite_ref-100" class="reference"><a href="#cite_note-100">[94]</a></sup> The influence of the United States on New Zealand weakened following protests over the <a href="/wiki/New_Zealand_in_the_Vietnam_War" title="New Zealand in the Vietnam War">Vietnam War</a>,<sup id="cite_ref-101" class="reference"><a href="#cite_note-101">[95]</a></sup> the refusal of the United States to admonish France after the <a href="/wiki/Sinking_of_the_Rainbow_Warrior" title="Sinking of the Rainbow Warrior">sinking of the <i>Rainbow Warrior</i></a>,<sup id="cite_ref-102" class="reference"><a href="#cite_note-102">[96]</a></sup> disagreements over environmental and agricultural trade issues and <a href="/wiki/New_Zealand_nuclear-free_zone" title="New Zealand nuclear-free zone">New Zealand's nuclear-free policy</a>.<sup id="cite_ref-103" class="reference"><a href="#cite_note-103">[97]</a></sup><sup id="cite_ref-104" class="reference"><a href="#cite_note-104">[98]</a></sup> Despite the United States' suspension of ANZUS obligations the treaty remained in effect between New Zealand and Australia, whose foreign policy has followed a similar historical trend.<sup id="cite_ref-105" class="reference"><a href="#cite_note-105">[99]</a></sup> Close political contact is maintained between the two countries, with <a href="/wiki/Closer_Economic_Relations" title="Closer Economic Relations">free trade agreements</a> and <a href="/wiki/Trans-Tasman_Travel_Arrangement" title="Trans-Tasman Travel Arrangement">travel arrangements</a> that allow citizens to visit, live and work in both countries without restrictions.<sup id="cite_ref-NZ_in_brief_106-0" class="reference"><a href="#cite_note-NZ_in_brief-106">[100]</a></sup> In 2013<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup> there were about 650,000 New Zealand citizens living in Australia, which is equivalent to 15% of the resident population of New Zealand.<sup id="cite_ref-107" class="reference"><a href="#cite_note-107">[101]</a></sup>
+ </p>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_(20).jpg" class="image"><img alt="A soldier in a green army uniform faces forwards" src="//upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/220px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg" decoding="async" width="220" height="147" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/330px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d4/ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg/440px-ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_%2820%29.jpg 2x" data-file-width="3888" data-file-height="2592" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:ANZAC_Day_service_at_the_National_War_Memorial_-_Flickr_-_NZ_Defence_Force_(20).jpg" class="internal" title="Enlarge"></a>
+ </div><a href="/wiki/Anzac_Day" title="Anzac Day">Anzac Day</a> service at the National War Memorial
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand has a strong presence among the <a href="/wiki/Pacific_Island" class="mw-redirect" title="Pacific Island">Pacific Island</a> countries. A large proportion of New Zealand's aid goes to these countries and many Pacific people migrate to New Zealand for employment.<sup id="cite_ref-108" class="reference"><a href="#cite_note-108">[102]</a></sup> Permanent migration is regulated under the 1970 Samoan Quota Scheme and the 2002 Pacific Access Category, which allow up to 1,100 Samoan nationals and up to 750 other Pacific Islanders respectively to become permanent New Zealand residents each year. A seasonal workers scheme for temporary migration was introduced in 2007 and in 2009 about 8,000 Pacific Islanders were employed under it.<sup id="cite_ref-109" class="reference"><a href="#cite_note-109">[103]</a></sup> A <a href="/wiki/Regional_power" title="Regional power">regional power</a>,<sup id="cite_ref-110" class="reference"><a href="#cite_note-110">[104]</a></sup> New Zealand is involved in the <a href="/wiki/Pacific_Islands_Forum" title="Pacific Islands Forum">Pacific Islands Forum</a>, the <a href="/wiki/Pacific_Community" title="Pacific Community">Pacific Community</a>, <a href="/wiki/Asia-Pacific_Economic_Cooperation" title="Asia-Pacific Economic Cooperation">Asia-Pacific Economic Cooperation</a> and the <a href="/wiki/Association_of_Southeast_Asian_Nations" title="Association of Southeast Asian Nations">Association of Southeast Asian Nations</a> Regional Forum (including the <a href="/wiki/East_Asia_Summit" title="East Asia Summit">East Asia Summit</a>).<sup id="cite_ref-NZ_in_brief_106-1" class="reference"><a href="#cite_note-NZ_in_brief-106">[100]</a></sup> New Zealand is a member of the <a href="/wiki/New_Zealand_and_the_United_Nations" title="New Zealand and the United Nations">United Nations</a>,<sup id="cite_ref-111" class="reference"><a href="#cite_note-111">[105]</a></sup> the <a href="/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a><sup id="cite_ref-112" class="reference"><a href="#cite_note-112">[106]</a></sup> and the <a href="/wiki/Organisation_for_Economic_Co-operation_and_Development" class="mw-redirect" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a> (OECD),<sup id="cite_ref-113" class="reference"><a href="#cite_note-113">[107]</a></sup> and participates in the <a href="/wiki/Five_Power_Defence_Arrangements" title="Five Power Defence Arrangements">Five Power Defence Arrangements</a>.<sup id="cite_ref-114" class="reference"><a href="#cite_note-114">[108]</a></sup>
+ </p>
+ <p>
+ New Zealand's military services—the Defence Force—comprise the <a href="/wiki/New_Zealand_Army" title="New Zealand Army">New Zealand Army</a>, the <a href="/wiki/Royal_New_Zealand_Air_Force" title="Royal New Zealand Air Force">Royal New Zealand Air Force</a> and the <a href="/wiki/Royal_New_Zealand_Navy" title="Royal New Zealand Navy">Royal New Zealand Navy</a>.<sup id="cite_ref-115" class="reference"><a href="#cite_note-115">[109]</a></sup> New Zealand's <a href="/wiki/National_security" title="National security">national defence</a> needs are modest, since a direct attack is unlikely.<sup id="cite_ref-116" class="reference"><a href="#cite_note-116">[110]</a></sup> However, its military has <a href="/wiki/Military_history_of_New_Zealand" title="Military history of New Zealand">had a global presence</a>. The country fought in both world wars, with notable campaigns in <a href="/wiki/Gallipoli_Campaign" class="mw-redirect" title="Gallipoli Campaign">Gallipoli</a>, <a href="/wiki/Battle_of_Crete" title="Battle of Crete">Crete</a>,<sup id="cite_ref-117" class="reference"><a href="#cite_note-117">[111]</a></sup> <a href="/wiki/Second_Battle_of_El_Alamein" title="Second Battle of El Alamein">El Alamein</a><sup id="cite_ref-118" class="reference"><a href="#cite_note-118">[112]</a></sup> and <a href="/wiki/Battle_of_Monte_Cassino" title="Battle of Monte Cassino">Cassino</a>.<sup id="cite_ref-119" class="reference"><a href="#cite_note-119">[113]</a></sup> The Gallipoli campaign played an important part in fostering New Zealand's <a href="/wiki/National_identity" title="National identity">national identity</a><sup id="cite_ref-120" class="reference"><a href="#cite_note-120">[114]</a></sup><sup id="cite_ref-121" class="reference"><a href="#cite_note-121">[115]</a></sup> and strengthened the <a href="/wiki/Australian_and_New_Zealand_Army_Corps" title="Australian and New Zealand Army Corps">ANZAC</a> tradition it shares with Australia.<sup id="cite_ref-122" class="reference"><a href="#cite_note-122">[116]</a></sup>
+ </p>
+ <p>
+ In addition to Vietnam and the two world wars, New Zealand fought in the <a href="/wiki/Second_Boer_War" title="Second Boer War">Second Boer War</a>,<sup id="cite_ref-123" class="reference"><a href="#cite_note-123">[117]</a></sup> the <a href="/wiki/New_Zealand_in_the_Korean_War" title="New Zealand in the Korean War">Korean War</a>,<sup id="cite_ref-124" class="reference"><a href="#cite_note-124">[118]</a></sup> the <a href="/wiki/Malayan_Emergency" title="Malayan Emergency">Malayan Emergency</a>,<sup id="cite_ref-125" class="reference"><a href="#cite_note-125">[119]</a></sup> the <a href="/wiki/Gulf_War" title="Gulf War">Gulf War</a> and the <a href="/wiki/War_in_Afghanistan_(2001%E2%80%93present)" title="War in Afghanistan (2001–present)">Afghanistan War</a>. It has contributed forces to several regional and global peacekeeping missions, such as those in <a href="/wiki/Cyprus_dispute" title="Cyprus dispute">Cyprus</a>, <a href="/wiki/Somali_Civil_War" title="Somali Civil War">Somalia</a>, <a href="/wiki/Bosnian_War" title="Bosnian War">Bosnia and Herzegovina</a>, the <a href="/wiki/Suez_Crisis" title="Suez Crisis">Sinai</a>, <a href="/wiki/Angolan_Civil_War" title="Angolan Civil War">Angola</a>, <a href="/wiki/Cambodian%E2%80%93Vietnamese_War" title="Cambodian–Vietnamese War">Cambodia</a>, the <a href="/wiki/Iran%E2%80%93Iraq_War" title="Iran–Iraq War">Iran–Iraq</a> border, <a href="/wiki/Bougainville_Campaign" class="mw-redirect" title="Bougainville Campaign">Bougainville</a>, <a href="/wiki/Operation_Astute" title="Operation Astute">East Timor</a>, and the <a href="/wiki/Solomon_Islands#Civil_war" title="Solomon Islands">Solomon Islands</a>.<sup id="cite_ref-126" class="reference"><a href="#cite_note-126">[120]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Local_government_and_external_territories">Local government and external territories</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Local_government_in_New_Zealand" title="Local government in New Zealand">Local government in New Zealand</a> and <a href="/wiki/Realm_of_New_Zealand" title="Realm of New Zealand">Realm of New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:402px;">
+ <a href="/wiki/File:NZL_orthographic_NaturalEarth_labelled_en.svg" class="image"><img alt="Map with the North, South, Stewart/Rakiura, Tokelau, Cook, Niue, Kermadec, Chatham, Bounty, Antipodes, Snare, Auckland and Campbell Islands highlighted. New Zealand's segment of Antarctica (the Ross Dependency) is also highlighted." src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/400px-NZL_orthographic_NaturalEarth_labelled_en.svg.png" decoding="async" width="400" height="400" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/600px-NZL_orthographic_NaturalEarth_labelled_en.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4b/NZL_orthographic_NaturalEarth_labelled_en.svg/800px-NZL_orthographic_NaturalEarth_labelled_en.svg.png 2x" data-file-width="553" data-file-height="553" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:NZL_orthographic_NaturalEarth_labelled_en.svg" class="internal" title="Enlarge"></a>
+ </div>Locations of the countries and territories within the <a href="/wiki/Realm_of_New_Zealand" title="Realm of New Zealand">Realm of New Zealand</a>
+ </div>
+ </div>
+ </div>
+ <p>
+ The early European settlers divided New Zealand into <a href="/wiki/Provinces_of_New_Zealand" title="Provinces of New Zealand">provinces</a>, which had a degree of autonomy.<sup id="cite_ref-nine_provinces_127-0" class="reference"><a href="#cite_note-nine_provinces-127">[121]</a></sup> Because of financial pressures and the desire to consolidate railways, education, land sales and other policies, government was centralised and the provinces were abolished in 1876.<sup id="cite_ref-128" class="reference"><a href="#cite_note-128">[122]</a></sup> The provinces are remembered in <a href="/wiki/Public_holidays_in_New_Zealand" title="Public holidays in New Zealand">regional public holidays</a><sup id="cite_ref-129" class="reference"><a href="#cite_note-129">[123]</a></sup> and sporting rivalries.<sup id="cite_ref-130" class="reference"><a href="#cite_note-130">[124]</a></sup>
+ </p>
+ <p>
+ Since 1876, various councils have administered local areas under legislation determined by the central government.<sup id="cite_ref-nine_provinces_127-1" class="reference"><a href="#cite_note-nine_provinces-127">[121]</a></sup><sup id="cite_ref-131" class="reference"><a href="#cite_note-131">[125]</a></sup> In 1989, the government reorganised local government into the current two-tier structure of <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">regional councils</a> and <a href="/wiki/Territorial_authorities" class="mw-redirect" title="Territorial authorities">territorial authorities</a>.<sup id="cite_ref-Sancton2000_132-0" class="reference"><a href="#cite_note-Sancton2000-132">[126]</a></sup> The <a href="/wiki/List_of_former_territorial_authorities_in_New_Zealand" title="List of former territorial authorities in New Zealand">249 municipalities</a><sup id="cite_ref-Sancton2000_132-1" class="reference"><a href="#cite_note-Sancton2000-132">[126]</a></sup> that existed in 1975 have now been consolidated into 67 territorial authorities and 11 regional councils.<sup id="cite_ref-133" class="reference"><a href="#cite_note-133">[127]</a></sup> The regional councils' role is to regulate "the natural environment with particular emphasis on <a href="/wiki/Resource_Management_Act_1991" title="Resource Management Act 1991">resource management</a>",<sup id="cite_ref-Sancton2000_132-2" class="reference"><a href="#cite_note-Sancton2000-132">[126]</a></sup> while territorial authorities are responsible for sewage, water, local roads, building consents and other local matters.<sup id="cite_ref-FOOTNOTESmeltJui_Lin200933_134-0" class="reference"><a href="#cite_note-FOOTNOTESmeltJui_Lin200933-134">[128]</a></sup><sup id="cite_ref-glossary_135-0" class="reference"><a href="#cite_note-glossary-135">[129]</a></sup> Five of the territorial councils are <a href="/wiki/Unitary_authority" title="Unitary authority">unitary authorities</a> and also act as regional councils.<sup id="cite_ref-glossary_135-1" class="reference"><a href="#cite_note-glossary-135">[129]</a></sup> The territorial authorities consist of 13 city councils, 53 <a href="/wiki/Districts_of_New_Zealand" title="Districts of New Zealand">district</a> councils, and the <a href="/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a> Council. While officially the Chatham Islands Council is not a unitary authority, it undertakes many functions of a regional council.<sup id="cite_ref-136" class="reference"><a href="#cite_note-136">[130]</a></sup>
+ </p>
+ <p>
+ The Realm of New Zealand, one of 16 <a href="/wiki/Commonwealth_realm" title="Commonwealth realm">Commonwealth realms</a>,<sup id="cite_ref-137" class="reference"><a href="#cite_note-137">[131]</a></sup> is the entire area over which the Queen of New Zealand is <a href="/wiki/Sovereign" title="Sovereign">sovereign</a>, and comprises New Zealand, <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>, the <a href="/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>, the <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a> and <a href="/wiki/Niue" title="Niue">Niue</a>.<sup id="cite_ref-GG_constitution_71-1" class="reference"><a href="#cite_note-GG_constitution-71">[65]</a></sup> The Cook Islands and Niue are self-governing states in <a href="/wiki/Associated_state" title="Associated state">free association</a> with New Zealand.<sup id="cite_ref-138" class="reference"><a href="#cite_note-138">[132]</a></sup><sup id="cite_ref-139" class="reference"><a href="#cite_note-139">[133]</a></sup> The New Zealand Parliament cannot pass legislation for these countries, but with their consent can act on behalf of them in foreign affairs and defence. Tokelau is classified as a <a href="/wiki/United_Nations_list_of_Non-Self-Governing_Territories" title="United Nations list of Non-Self-Governing Territories">non-self-governing territory</a>, but is administered by a council of three elders (one from each Tokelauan <a href="/wiki/Atoll" title="Atoll">atoll</a>).<sup id="cite_ref-140" class="reference"><a href="#cite_note-140">[134]</a></sup> The Ross Dependency is New Zealand's <a href="/wiki/Territorial_claims_in_Antarctica" title="Territorial claims in Antarctica">territorial claim in Antarctica</a>, where it operates the <a href="/wiki/Scott_Base" title="Scott Base">Scott Base</a> research facility.<sup id="cite_ref-141" class="reference"><a href="#cite_note-141">[135]</a></sup> <a href="/wiki/New_Zealand_nationality_law" title="New Zealand nationality law">New Zealand nationality law</a> treats all parts of the realm equally, so most people born in New Zealand, the Cook Islands, Niue, Tokelau and the Ross Dependency are New Zealand citizens.<sup id="cite_ref-142" class="reference"><a href="#cite_note-142">[136]</a></sup><sup id="cite_ref-144" class="reference"><a href="#cite_note-144">[n 7]</a></sup>
+ </p>
+ <table class="navbox collapsible">
+ <tbody>
+ <tr>
+ <th colspan="12" class="navbox-title">
+ <div class="plainlinks hlist navbar mini" style="float:left; text-align:left">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Administrative_divisions_of_New_Zealand" title="Template:Administrative divisions of New Zealand"><abbr title="View this template">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Administrative_divisions_of_New_Zealand" title="Template talk:Administrative divisions of New Zealand"><abbr title="Discuss this template">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Administrative_divisions_of_New_Zealand&amp;action=edit"><abbr title="Edit this template">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div style="font-size:114%;margin:0 4em">
+ Administrative divisions of the Realm of New Zealand
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ Countries
+ </th>
+ <td colspan="7" style="background:#ddf;">
+ <span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/23px-Flag_of_New_Zealand.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/35px-Flag_of_New_Zealand.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/46px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600" />&#160;</span><a class="mw-selflink selflink">New Zealand</a>
+ </td>
+ <td rowspan="4">
+ &#160;
+ </td>
+ <td rowspan="4">
+ &#160;
+ </td>
+ <td rowspan="1" style="background:#e2e2ff;">
+ <span class="nowrap"><span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/23px-Flag_of_the_Cook_Islands.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/35px-Flag_of_the_Cook_Islands.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/46px-Flag_of_the_Cook_Islands.svg.png 2x" data-file-width="1200" data-file-height="600" />&#160;</span><a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></span>
+ </td>
+ <td rowspan="1" style="background:#e2e2ff;">
+ <span class="nowrap"><span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/23px-Flag_of_Niue.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/35px-Flag_of_Niue.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/46px-Flag_of_Niue.svg.png 2x" data-file-width="600" data-file-height="300" />&#160;</span><a href="/wiki/Niue" title="Niue">Niue</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Regions</a>
+ </th>
+ <td style="background:#e7e7ff;">
+ 11 non-unitary regions
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ 5 unitary regions
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a>
+ </td>
+ <td rowspan="3">
+ &#160;
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/New_Zealand_outlying_islands" title="New Zealand outlying islands">Outlying islands</a> outside any regional authority<br />
+ (the <a href="/wiki/Kermadec_Islands" title="Kermadec Islands">Kermadec Islands</a>, <a href="/wiki/Three_Kings_Islands" title="Three Kings Islands">Three Kings Islands</a>, and <a href="/wiki/New_Zealand_Subantarctic_Islands" title="New Zealand Subantarctic Islands">Subantarctic Islands</a>)
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/23px-Flag_of_Tokelau.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/35px-Flag_of_Tokelau.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/46px-Flag_of_Tokelau.svg.png 2x" data-file-width="1800" data-file-height="900" />&#160;</span><a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="nowrap">15 islands</span>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="nowrap">14 <a href="/wiki/List_of_villages_in_Niue" title="List of villages in Niue">villages</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ <a href="/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">Territorial authorities</a>
+ </th>
+ <td style="background:#f4f4ff;">
+ 13 cities and 53 districts
+ </td>
+ </tr>
+ <tr style="line-height:12px;font-size:90%;">
+ <th style="background:#fcfcff;">
+ Notes
+ </th>
+ <td style="background:#fcfcff;">
+ Some districts lie in more than one region
+ </td>
+ <td style="background:#fcfcff;">
+ These combine the regional and the territorial authority levels in one
+ </td>
+ <td style="background:#fcfcff;">
+ Special territorial authority
+ </td>
+ <td colspan="1" style="background:#fcfcff;">
+ The outlying <a href="/wiki/Solander_Islands" title="Solander Islands">Solander Islands</a> form part of the <a href="/wiki/Southland_Region" class="mw-redirect" title="Southland Region">Southland Region</a>
+ </td>
+ <td style="background:#fcfcff;">
+ New&#160;Zealand's <a href="/wiki/Territorial_claims_in_Antarctica" title="Territorial claims in Antarctica">Antarctic territory</a>
+ </td>
+ <td style="background:#fcfcff;">
+ <a href="/wiki/United_Nations_list_of_Non-Self-Governing_Territories" title="United Nations list of Non-Self-Governing Territories">Non-self-governing territory</a> of New&#160;Zealand
+ </td>
+ <td colspan="2" style="background:#fcfcff;">
+ States in <a href="/wiki/Associated_state" title="Associated state">free association</a> with New&#160;Zealand
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>
+ <span class="mw-headline" id="Environment">Environment</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Environment_of_New_Zealand" title="Environment of New Zealand">Environment of New Zealand</a>
+ </div>
+ <h3>
+ <span class="mw-headline" id="Geography">Geography</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Geography_of_New_Zealand" title="Geography of New Zealand">Geography of New Zealand</a> and <a href="/wiki/Geology_of_New_Zealand" title="Geology of New Zealand">Geology of New Zealand</a>
+ </div>
+ <div role="note" class="hatnote navigation-not-searchable">
+ <img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/12px-Commons-logo.svg.png" decoding="async" width="12" height="16" srcset="//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/18px-Commons-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/24px-Commons-logo.svg.png 2x" data-file-width="1024" data-file-height="1376" /> See also: <a href="https://commons.wikimedia.org/wiki/Atlas_of_New_Zealand" class="extiw" title="commons:Atlas of New Zealand">Atlas of New Zealand</a> at <a href="/wiki/Wikimedia_Commons" title="Wikimedia Commons">Wikimedia Commons</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:New_Zealand_23_October_2002.jpg" class="image"><img alt="Islands of New Zealand as seen from satellite" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/170px-New_Zealand_23_October_2002.jpg" decoding="async" width="170" height="227" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/255px-New_Zealand_23_October_2002.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/a5/New_Zealand_23_October_2002.jpg/340px-New_Zealand_23_October_2002.jpg 2x" data-file-width="4200" data-file-height="5600" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:New_Zealand_23_October_2002.jpg" class="internal" title="Enlarge"></a>
+ </div>The snow-capped <a href="/wiki/Southern_Alps" title="Southern Alps">Southern Alps</a> dominate the South Island, while the North Island's <a href="/wiki/Northland_Peninsula" title="Northland Peninsula">Northland Peninsula</a> stretches towards the subtropics
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand is located near the centre of the <a href="/wiki/Water_hemisphere" class="mw-redirect" title="Water hemisphere">water hemisphere</a> and is made up of two main islands and a number of <a href="/wiki/List_of_islands_of_New_Zealand" title="List of islands of New Zealand">smaller islands</a>. The two main islands (the <a href="/wiki/North_Island" title="North Island">North Island</a>, or <i>Te Ika-a-Māui</i>, and the <a href="/wiki/South_Island" title="South Island">South Island</a>, or <i>Te Waipounamu</i>) are separated by <a href="/wiki/Cook_Strait" title="Cook Strait">Cook Strait</a>, 22 kilometres (14&#160;mi) wide at its narrowest point.<sup id="cite_ref-145" class="reference"><a href="#cite_note-145">[138]</a></sup> Besides the North and South Islands, the five largest inhabited islands are <a href="/wiki/Stewart_Island" title="Stewart Island">Stewart Island</a> (across the <a href="/wiki/Foveaux_Strait" title="Foveaux Strait">Foveaux Strait</a>), <a href="/wiki/Chatham_Island" title="Chatham Island">Chatham Island</a>, <a href="/wiki/Great_Barrier_Island" title="Great Barrier Island">Great Barrier Island</a> (in the <a href="/wiki/Hauraki_Gulf" title="Hauraki Gulf">Hauraki Gulf</a>),<sup id="cite_ref-146" class="reference"><a href="#cite_note-146">[139]</a></sup> <a href="/wiki/D%27Urville_Island_(New_Zealand)" title="D'Urville Island (New Zealand)">D'Urville Island</a> (in the <a href="/wiki/Marlborough_Sounds" title="Marlborough Sounds">Marlborough Sounds</a>)<sup id="cite_ref-147" class="reference"><a href="#cite_note-147">[140]</a></sup> and <a href="/wiki/Waiheke_Island" title="Waiheke Island">Waiheke Island</a> (about 22&#160;km (14&#160;mi) from central Auckland).<sup id="cite_ref-148" class="reference"><a href="#cite_note-148">[141]</a></sup>
+ </p>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r889293853/mw-parser-output/.tmulti" />
+ <div class="thumb tmulti tleft">
+ <div class="thumbinner" style="width:224px;max-width:224px">
+ <div class="trow">
+ <div class="tsingle" style="width:222px;max-width:222px">
+ <div class="thumbimage">
+ <a href="/wiki/File:Mt_Cook,_NZ.jpg" class="image"><img alt="A large mountain with a lake in the foreground" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/220px-Mt_Cook%2C_NZ.jpg" decoding="async" width="220" height="147" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/330px-Mt_Cook%2C_NZ.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/44/Mt_Cook%2C_NZ.jpg/440px-Mt_Cook%2C_NZ.jpg 2x" data-file-width="4608" data-file-height="3072" /></a>
+ </div>
+ <div class="thumbcaption">
+ <a href="/wiki/Aoraki_/_Mount_Cook" title="Aoraki / Mount Cook">Aoraki / Mount Cook</a> is the highest point of New Zealand, at 3,754 metres
+ </div>
+ </div>
+ </div>
+ <div class="trow">
+ <div class="tsingle" style="width:222px;max-width:222px">
+ <div class="thumbimage">
+ <a href="/wiki/File:New_Zealand_moutain_ranges.jpg" class="image"><img alt="Snow-capped mountain range" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/220px-New_Zealand_moutain_ranges.jpg" decoding="async" width="220" height="147" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/330px-New_Zealand_moutain_ranges.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/7b/New_Zealand_moutain_ranges.jpg/440px-New_Zealand_moutain_ranges.jpg 2x" data-file-width="4272" data-file-height="2848" /></a>
+ </div>
+ <div class="thumbcaption">
+ The Southern Alps stretch for 500 kilometres down the South Island
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand is long and narrow (over 1,600 kilometres (990&#160;mi) along its north-north-east axis with a maximum width of 400 kilometres (250&#160;mi)),<sup id="cite_ref-149" class="reference"><a href="#cite_note-149">[142]</a></sup> with about 15,000&#160;km (9,300&#160;mi) of coastline<sup id="cite_ref-CIA_150-0" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> and a total land area of 268,000 square kilometres (103,500&#160;sq&#160;mi).<sup id="cite_ref-151" class="reference"><a href="#cite_note-151">[144]</a></sup> Because of its far-flung outlying islands and long coastline, the country has extensive marine resources. Its <a href="/wiki/Exclusive_economic_zone_of_New_Zealand" title="Exclusive economic zone of New Zealand">exclusive economic zone</a> is one of the largest in the world, covering more than 15 times its land area.<sup id="cite_ref-152" class="reference"><a href="#cite_note-152">[145]</a></sup>
+ </p>
+ <p>
+ The South Island is the largest landmass of New Zealand. It is divided along its length by the <a href="/wiki/Southern_Alps" title="Southern Alps">Southern Alps</a>.<sup id="cite_ref-153" class="reference"><a href="#cite_note-153">[146]</a></sup> There are 18 peaks over 3,000 metres (9,800&#160;ft), the highest of which is <a href="/wiki/Aoraki_/_Mount_Cook" title="Aoraki / Mount Cook">Aoraki / Mount Cook</a> at 3,754 metres (12,316&#160;ft).<sup id="cite_ref-FOOTNOTEGarden200552_154-0" class="reference"><a href="#cite_note-FOOTNOTEGarden200552-154">[147]</a></sup> <a href="/wiki/Fiordland" title="Fiordland">Fiordland</a>'s steep mountains and deep <a href="/wiki/Fiord" class="mw-redirect" title="Fiord">fiords</a> record the extensive ice age glaciation of this southwestern corner of the South Island.<sup id="cite_ref-155" class="reference"><a href="#cite_note-155">[148]</a></sup> The North Island is less mountainous but is <a href="/wiki/Volcanology_of_New_Zealand" title="Volcanology of New Zealand">marked by volcanism</a>.<sup id="cite_ref-156" class="reference"><a href="#cite_note-156">[149]</a></sup> The highly active <a href="/wiki/Taupo_Volcanic_Zone" title="Taupo Volcanic Zone">Taupo Volcanic Zone</a> has formed a large <a href="/wiki/North_Island_Volcanic_Plateau" title="North Island Volcanic Plateau">volcanic plateau</a>, punctuated by the North Island's highest mountain, <a href="/wiki/Mount_Ruapehu" title="Mount Ruapehu">Mount Ruapehu</a> (2,797 metres (9,177&#160;ft)). The plateau also hosts the country's largest lake, <a href="/wiki/Lake_Taupo" title="Lake Taupo">Lake Taupo</a>,<sup id="cite_ref-157" class="reference"><a href="#cite_note-157">[150]</a></sup> nestled in the <a href="/wiki/Caldera" title="Caldera">caldera</a> of one of the world's most active <a href="/wiki/Supervolcano" title="Supervolcano">supervolcanoes</a>.<sup id="cite_ref-158" class="reference"><a href="#cite_note-158">[151]</a></sup>
+ </p>
+ <p>
+ The country owes its varied topography, and perhaps even its emergence above the waves, to the dynamic boundary it straddles between the <a href="/wiki/Pacific_Plate" title="Pacific Plate">Pacific</a> and <a href="/wiki/Indo-Australian_Plate" title="Indo-Australian Plate">Indo-Australian Plates</a>.<sup id="cite_ref-Keith_2009_159-0" class="reference"><a href="#cite_note-Keith_2009-159">[152]</a></sup> New Zealand is part of <a href="/wiki/Zealandia" title="Zealandia">Zealandia</a>, a <a href="/wiki/Microcontinent" class="mw-redirect" title="Microcontinent">microcontinent</a> nearly half the size of Australia that gradually submerged after breaking away from the <a href="/wiki/Gondwana" title="Gondwana">Gondwanan</a> supercontinent.<sup id="cite_ref-160" class="reference"><a href="#cite_note-160">[153]</a></sup> About 25 million years ago, a shift in <a href="/wiki/Plate_tectonic" class="mw-redirect" title="Plate tectonic">plate tectonic</a> movements began to <a href="/wiki/Kaikoura_Orogeny" class="mw-redirect" title="Kaikoura Orogeny">contort and crumple</a> the region. This is now most evident in the Southern Alps, formed by <a href="/wiki/Continental_collision" title="Continental collision">compression of the crust</a> beside the <a href="/wiki/Alpine_Fault" title="Alpine Fault">Alpine Fault</a>. Elsewhere the plate boundary involves the <a href="/wiki/Subduction" title="Subduction">subduction</a> of one plate under the other, producing the <a href="/wiki/Puysegur_Trench" title="Puysegur Trench">Puysegur Trench</a> to the south, the <a href="/wiki/Hikurangi_Trench" title="Hikurangi Trench">Hikurangi Trench</a> east of the North Island, and the <a href="/wiki/Kermadec_Trench" title="Kermadec Trench">Kermadec</a> and <a href="/wiki/Tonga_Trench" title="Tonga Trench">Tonga Trenches</a><sup id="cite_ref-161" class="reference"><a href="#cite_note-161">[154]</a></sup> further north.<sup id="cite_ref-Keith_2009_159-1" class="reference"><a href="#cite_note-Keith_2009-159">[152]</a></sup>
+ </p>
+ <p>
+ New Zealand is part of a region known as <a href="/wiki/Australasia" title="Australasia">Australasia</a>, together with Australia.<sup id="cite_ref-NZOD_162-0" class="reference"><a href="#cite_note-NZOD-162">[155]</a></sup> It also forms the southwestern extremity of the geographic and ethnographic region called <a href="/wiki/Polynesia" title="Polynesia">Polynesia</a>.<sup id="cite_ref-163" class="reference"><a href="#cite_note-163">[156]</a></sup> The term <a href="/wiki/Oceania" title="Oceania">Oceania</a> is often used to denote the wider region encompassing the <a href="/wiki/Australia_(continent)" title="Australia (continent)">Australian continent</a>, New Zealand and various islands in the Pacific Ocean that are not included in the <a href="/wiki/Continent" title="Continent">seven-continent</a> model.<sup id="cite_ref-164" class="reference"><a href="#cite_note-164">[157]</a></sup>
+ </p>
+ <div style="clear:both;"></div>
+ <ul class="gallery mw-gallery-packed">
+ <li class="gallerycaption">Landscapes of New Zealand
+ </li>
+ <li class="gallerybox" style="width: 182px">
+ <div style="width: 182px">
+ <div class="thumb" style="width: 180px;">
+ <div style="margin:0px auto;">
+ <a href="/wiki/File:NZ_Landscape.jpg" class="image"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/44/NZ_Landscape.jpg/270px-NZ_Landscape.jpg" decoding="async" width="180" height="120" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/44/NZ_Landscape.jpg/405px-NZ_Landscape.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/44/NZ_Landscape.jpg/540px-NZ_Landscape.jpg 2x" data-file-width="5963" data-file-height="3975" /></a>
+ </div>
+ </div>
+ <div class="gallerytext">
+ <p>
+ Rural scene near <a href="/wiki/Queenstown,_New_Zealand" title="Queenstown, New Zealand">Queenstown</a>
+ </p>
+ </div>
+ </div>
+ </li>
+ <li class="gallerybox" style="width: 182px">
+ <div style="width: 182px">
+ <div class="thumb" style="width: 180px;">
+ <div style="margin:0px auto;">
+ <a href="/wiki/File:Emerald_Lakes,_New_Zealand.jpg" class="image"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/61/Emerald_Lakes%2C_New_Zealand.jpg/270px-Emerald_Lakes%2C_New_Zealand.jpg" decoding="async" width="180" height="120" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/61/Emerald_Lakes%2C_New_Zealand.jpg/405px-Emerald_Lakes%2C_New_Zealand.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/61/Emerald_Lakes%2C_New_Zealand.jpg/540px-Emerald_Lakes%2C_New_Zealand.jpg 2x" data-file-width="4272" data-file-height="2848" /></a>
+ </div>
+ </div>
+ <div class="gallerytext">
+ <p>
+ The Emerald Lakes, <a href="/wiki/Mt_Tongariro" class="mw-redirect" title="Mt Tongariro">Mt Tongariro</a>
+ </p>
+ </div>
+ </div>
+ </li>
+ <li class="gallerybox" style="width: 181.33333333333px">
+ <div style="width: 181.33333333333px">
+ <div class="thumb" style="width: 179.33333333333px;">
+ <div style="margin:0px auto;">
+ <a href="/wiki/File:Lake_Gunn.jpg" class="image"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/269px-Lake_Gunn.jpg" decoding="async" width="180" height="120" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/404px-Lake_Gunn.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Lake_Gunn.jpg/538px-Lake_Gunn.jpg 2x" data-file-width="1000" data-file-height="669" /></a>
+ </div>
+ </div>
+ <div class="gallerytext">
+ <p>
+ <a href="/wiki/Lake_Gunn" title="Lake Gunn">Lake Gunn</a>
+ </p>
+ </div>
+ </div>
+ </li>
+ <li class="gallerybox" style="width: 181.33333333333px">
+ <div style="width: 181.33333333333px">
+ <div class="thumb" style="width: 179.33333333333px;">
+ <div style="margin:0px auto;">
+ <a href="/wiki/File:Pencarrow_Head,_Wellington,_New_Zealand_from_Santa_Regina,_24_Feb._2007.jpg" class="image"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/269px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg" decoding="async" width="180" height="120" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/404px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg/538px-Pencarrow_Head%2C_Wellington%2C_New_Zealand_from_Santa_Regina%2C_24_Feb._2007.jpg 2x" data-file-width="3872" data-file-height="2592" /></a>
+ </div>
+ </div>
+ <div class="gallerytext">
+ <p>
+ <a href="/wiki/Pencarrow_Head" title="Pencarrow Head">Pencarrow Head</a>, Wellington
+ </p>
+ </div>
+ </div>
+ </li>
+ </ul>
+ <h3>
+ <span class="mw-headline" id="Climate">Climate</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Climate_of_New_Zealand" title="Climate of New Zealand">Climate of New Zealand</a>
+ </div>
+ <p>
+ New Zealand's climate is predominantly temperate <a href="/wiki/Oceanic_climate" title="Oceanic climate">maritime</a> (<a href="/wiki/K%C3%B6ppen_climate_classification" title="Köppen climate classification">Köppen</a>: Cfb), with mean annual temperatures ranging from 10&#160;°C (50&#160;°F) in the south to 16&#160;°C (61&#160;°F) in the north.<sup id="cite_ref-Mullan2009_165-0" class="reference"><a href="#cite_note-Mullan2009-165">[158]</a></sup> Historical <a href="/wiki/Maxima_and_minima" title="Maxima and minima">maxima and minima</a> are 42.4&#160;°C (108.32&#160;°F) in <a href="/wiki/Rangiora" title="Rangiora">Rangiora</a>, <a href="/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a> and −25.6&#160;°C (−14.08&#160;°F) in <a href="/wiki/Ranfurly,_New_Zealand" title="Ranfurly, New Zealand">Ranfurly</a>, <a href="/wiki/Otago" title="Otago">Otago</a>.<sup id="cite_ref-niwa_166-0" class="reference"><a href="#cite_note-niwa-166">[159]</a></sup> Conditions vary sharply across regions from extremely wet on the <a href="/wiki/West_Coast,_New_Zealand" title="West Coast, New Zealand">West Coast</a> of the South Island to almost <a href="/wiki/Semi-arid_climate" title="Semi-arid climate">semi-arid</a> in <a href="/wiki/Central_Otago" title="Central Otago">Central Otago</a> and the <a href="/wiki/Mackenzie_Basin" title="Mackenzie Basin">Mackenzie Basin</a> of inland Canterbury and <a href="/wiki/Subtropical" class="mw-redirect" title="Subtropical">subtropical</a> in <a href="/wiki/Northland_Peninsula" title="Northland Peninsula">Northland</a>.<sup id="cite_ref-167" class="reference"><a href="#cite_note-167">[160]</a></sup> Of the seven largest cities, <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a> is the driest, receiving on average only 640 millimetres (25&#160;in) of rain per year and Wellington the wettest, receiving almost twice that amount.<sup id="cite_ref-168" class="reference"><a href="#cite_note-168">[161]</a></sup> Auckland, Wellington and Christchurch all receive a yearly average of more than 2,000 hours of sunshine. The southern and southwestern parts of the South Island have a cooler and cloudier climate, with around 1,400–1,600 hours; the northern and northeastern parts of the South Island are the sunniest areas of the country and receive about 2,400–2,500 hours.<sup id="cite_ref-169" class="reference"><a href="#cite_note-169">[162]</a></sup> The general snow season is early June until early October, though <a href="/wiki/Cold_snap" class="mw-redirect" title="Cold snap">cold snaps</a> can occur outside this season.<sup id="cite_ref-170" class="reference"><a href="#cite_note-170">[163]</a></sup> Snowfall is common in the eastern and southern parts of the South Island and mountain areas across the country.<sup id="cite_ref-Mullan2009_165-1" class="reference"><a href="#cite_note-Mullan2009-165">[158]</a></sup>
+ </p>
+ <p>
+ The table below lists climate normals for the warmest and coldest months in New Zealand's six largest cities. North Island cities are generally warmest in February. South Island cities are warmest in January.
+ </p>
+ <table class="wikitable collapsible sortable" style="margin:auto; width:25%;">
+ <caption>
+ Average daily maximum and minimum temperatures for the six largest cities of New Zealand<sup id="cite_ref-171" class="reference"><a href="#cite_note-171">[164]</a></sup>
+ </caption>
+ <tbody>
+ <tr>
+ <th>
+ Location
+ </th>
+ <th>
+ Jan/Feb (°C)
+ </th>
+ <th>
+ Jan/Feb (°F)
+ </th>
+ <th>
+ July (°C)
+ </th>
+ <th>
+ July (°F)
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ <td>
+ 23/16
+ </td>
+ <td>
+ 74/60
+ </td>
+ <td>
+ 14/7
+ </td>
+ <td>
+ 58/45
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td>
+ 20/13
+ </td>
+ <td>
+ 68/56
+ </td>
+ <td>
+ 11/6
+ </td>
+ <td>
+ 52/42
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a>
+ </td>
+ <td>
+ 22/12
+ </td>
+ <td>
+ 72/53
+ </td>
+ <td>
+ 10/0
+ </td>
+ <td>
+ 51/33
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ <td>
+ 24/13
+ </td>
+ <td>
+ 75/56
+ </td>
+ <td>
+ 14/4
+ </td>
+ <td>
+ 57/39
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Tauranga" title="Tauranga">Tauranga</a>
+ </td>
+ <td>
+ 24/15
+ </td>
+ <td>
+ 75/59
+ </td>
+ <td>
+ 14/6
+ </td>
+ <td>
+ 58/42
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="/wiki/Dunedin" title="Dunedin">Dunedin</a>
+ </td>
+ <td>
+ 19/11
+ </td>
+ <td>
+ 66/53
+ </td>
+ <td>
+ 10/3
+ </td>
+ <td>
+ 50/37
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <h3>
+ <span class="mw-headline" id="Biodiversity">Biodiversity</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Biodiversity_of_New_Zealand" title="Biodiversity of New Zealand">Biodiversity of New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:TeTuatahianui.jpg" class="image"><img alt="Kiwi amongst sticks" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/170px-TeTuatahianui.jpg" decoding="async" width="170" height="227" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/255px-TeTuatahianui.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/82/TeTuatahianui.jpg/340px-TeTuatahianui.jpg 2x" data-file-width="994" data-file-height="1325" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:TeTuatahianui.jpg" class="internal" title="Enlarge"></a>
+ </div>The endemic flightless <a href="/wiki/Kiwi" title="Kiwi">kiwi</a> is a national icon.
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand's <a href="/wiki/Geographic_isolation" class="mw-redirect" title="Geographic isolation">geographic isolation</a> for 80 million years<sup id="cite_ref-172" class="reference"><a href="#cite_note-172">[165]</a></sup> and island <a href="/wiki/Biogeography" title="Biogeography">biogeography</a> has influenced evolution of the country's species of <a href="/wiki/Fauna" title="Fauna">animals</a>, <a href="/wiki/Fungus" title="Fungus">fungi</a> and <a href="/wiki/Flora" title="Flora">plants</a>. Physical isolation has caused biological isolation, resulting in a dynamic evolutionary ecology with examples of very distinctive plants and animals as well as populations of widespread species.<sup id="cite_ref-173" class="reference"><a href="#cite_note-173">[166]</a></sup><sup id="cite_ref-174" class="reference"><a href="#cite_note-174">[167]</a></sup> About 82% of New Zealand's indigenous <a href="/wiki/Vascular_plant" title="Vascular plant">vascular plants</a> are <a href="/wiki/Endemism" title="Endemism">endemic</a>, covering 1,944 species across 65 <a href="/wiki/Genus" title="Genus">genera</a>.<sup id="cite_ref-FAQ_175-0" class="reference"><a href="#cite_note-FAQ-175">[168]</a></sup><sup id="cite_ref-NZPCN_2006_176-0" class="reference"><a href="#cite_note-NZPCN_2006-176">[169]</a></sup> The number of fungi recorded from New Zealand, including lichen-forming species, is not known, nor is the proportion of those fungi which are endemic, but one estimate suggests there are about 2,300 species of lichen-forming fungi in New Zealand<sup id="cite_ref-FAQ_175-1" class="reference"><a href="#cite_note-FAQ-175">[168]</a></sup> and 40% of these are endemic.<sup id="cite_ref-177" class="reference"><a href="#cite_note-177">[170]</a></sup> The two main types of forest are those dominated by broadleaf trees with emergent <a href="/wiki/Podocarp" class="mw-redirect" title="Podocarp">podocarps</a>, or by <a href="/wiki/Nothofagus" title="Nothofagus">southern beech</a> in cooler climates.<sup id="cite_ref-178" class="reference"><a href="#cite_note-178">[171]</a></sup> The remaining vegetation types consist of grasslands, the majority of which are <a href="/wiki/Tussock_grasslands_of_New_Zealand" title="Tussock grasslands of New Zealand">tussock</a>.<sup id="cite_ref-179" class="reference"><a href="#cite_note-179">[172]</a></sup>
+ </p>
+ <p>
+ Before the arrival of humans, an estimated 80% of the land was covered in forest, with only <a href="/wiki/Tree_line" title="Tree line">high alpine</a>, wet, infertile and volcanic areas without trees.<sup id="cite_ref-180" class="reference"><a href="#cite_note-180">[173]</a></sup> Massive <a href="/wiki/Deforestation_in_New_Zealand" title="Deforestation in New Zealand">deforestation</a> occurred after humans arrived, with around half the forest cover lost to fire after Polynesian settlement.<sup id="cite_ref-181" class="reference"><a href="#cite_note-181">[174]</a></sup> Much of the remaining forest fell after European settlement, being logged or cleared to make room for pastoral farming, leaving forest occupying only 23% of the land.<sup id="cite_ref-182" class="reference"><a href="#cite_note-182">[175]</a></sup>
+ </p>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg" class="image"><img alt="An artist's rendition of a Haast's eagle attacking two moa" src="//upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/220px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg" decoding="async" width="220" height="176" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/330px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg/440px-Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg 2x" data-file-width="1375" data-file-height="1101" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Giant_Haasts_eagle_attacking_New_Zealand_moa.jpg" class="internal" title="Enlarge"></a>
+ </div>The giant <a href="/wiki/Haast%27s_eagle" title="Haast's eagle">Haast's eagle</a> died out when humans hunted its main prey, the <a href="/wiki/Moa" title="Moa">moa</a>, to extinction.
+ </div>
+ </div>
+ </div>
+ <p>
+ The forests were dominated by <a href="/wiki/Birds_of_New_Zealand" title="Birds of New Zealand">birds</a>, and the lack of mammalian predators led to some like the <a href="/wiki/Kiwi" title="Kiwi">kiwi</a>, <a href="/wiki/Kakapo" title="Kakapo">kakapo</a>, <a href="/wiki/Weka" title="Weka">weka</a> and <a href="/wiki/Takah%C4%93" class="mw-redirect" title="Takahē">takahē</a> evolving <a href="/wiki/Flightless_bird" title="Flightless bird">flightlessness</a>.<sup id="cite_ref-183" class="reference"><a href="#cite_note-183">[176]</a></sup> The arrival of humans, associated changes to habitat, and the introduction of <a href="/wiki/Polynesian_rat" title="Polynesian rat">rats</a>, ferrets and other mammals led to the <a href="/wiki/List_of_New_Zealand_animals_extinct_in_the_Holocene" title="List of New Zealand animals extinct in the Holocene">extinction</a> of many bird species, including <a href="/wiki/Megafauna" title="Megafauna">large birds</a> like the <a href="/wiki/Moa" title="Moa">moa</a> and <a href="/wiki/Haast%27s_eagle" title="Haast's eagle">Haast's eagle</a>.<sup id="cite_ref-Holdaway2009_184-0" class="reference"><a href="#cite_note-Holdaway2009-184">[177]</a></sup><sup id="cite_ref-185" class="reference"><a href="#cite_note-185">[178]</a></sup>
+ </p>
+ <p>
+ Other indigenous animals are represented by reptiles (<a href="/wiki/Tuatara" title="Tuatara">tuatara</a>, <a href="/wiki/Skink" title="Skink">skinks</a> and <a href="/wiki/List_of_geckos_of_New_Zealand" title="List of geckos of New Zealand">geckos</a>), <a href="/wiki/Leiopelmatidae" class="mw-redirect" title="Leiopelmatidae">frogs</a>,<sup id="cite_ref-186" class="reference"><a href="#cite_note-186">[179]</a></sup> <a href="/wiki/Spiders_of_New_Zealand" title="Spiders of New Zealand">spiders</a>,<sup id="cite_ref-187" class="reference"><a href="#cite_note-187">[180]</a></sup> insects (<a href="/wiki/Weta" title="Weta">weta</a>)<sup id="cite_ref-188" class="reference"><a href="#cite_note-188">[181]</a></sup> and snails.<sup id="cite_ref-189" class="reference"><a href="#cite_note-189">[182]</a></sup> Some, such as the tuatara, are so unique that they have been called <a href="/wiki/Living_fossil" title="Living fossil">living fossils</a>.<sup id="cite_ref-190" class="reference"><a href="#cite_note-190">[183]</a></sup> Three species of bats (<a href="/wiki/New_Zealand_greater_short-tailed_bat" title="New Zealand greater short-tailed bat">one</a> since extinct) were the only sign of native land mammals in New Zealand until the 2006 discovery of bones from <a href="/wiki/Saint_Bathans_mammal" title="Saint Bathans mammal">a unique, mouse-sized land mammal</a> at least 16 million years old.<sup id="cite_ref-191" class="reference"><a href="#cite_note-191">[184]</a></sup><sup id="cite_ref-192" class="reference"><a href="#cite_note-192">[185]</a></sup> Marine mammals however are abundant, with almost half the world's <a href="/wiki/Cetacea" title="Cetacea">cetaceans</a> (whales, dolphins, and <a href="/wiki/Porpoise" title="Porpoise">porpoises</a>) and large numbers of <a href="/wiki/Fur_seal" title="Fur seal">fur seals</a> reported in New Zealand waters.<sup id="cite_ref-193" class="reference"><a href="#cite_note-193">[186]</a></sup> Many seabirds breed in New Zealand, a third of them unique to the country.<sup id="cite_ref-194" class="reference"><a href="#cite_note-194">[187]</a></sup> More <a href="/wiki/List_of_birds_of_New_Zealand#Penguins" title="List of birds of New Zealand">penguin</a> species are found in New Zealand than in any other country.<sup id="cite_ref-195" class="reference"><a href="#cite_note-195">[188]</a></sup>
+ </p>
+ <p>
+ Since human arrival, almost half of the country's vertebrate species have become extinct, including at least fifty-one birds, three frogs, three lizards, one freshwater fish, and one bat. Others are endangered or have had their range severely reduced.<sup id="cite_ref-Holdaway2009_184-1" class="reference"><a href="#cite_note-Holdaway2009-184">[177]</a></sup> However, New Zealand conservationists have pioneered several methods to help threatened wildlife recover, including island sanctuaries, pest control, wildlife translocation, fostering, and ecological <a href="/wiki/Island_restoration" title="Island restoration">restoration of islands</a> and <a href="/wiki/Ecological_island" title="Ecological island">other selected areas</a>.<sup id="cite_ref-196" class="reference"><a href="#cite_note-196">[189]</a></sup><sup id="cite_ref-197" class="reference"><a href="#cite_note-197">[190]</a></sup><sup id="cite_ref-198" class="reference"><a href="#cite_note-198">[191]</a></sup><sup id="cite_ref-199" class="reference"><a href="#cite_note-199">[192]</a></sup>
+ </p>
+ <div style="clear:both;"></div>
+ <h2>
+ <span class="mw-headline" id="Economy">Economy</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Economy_of_New_Zealand" title="Economy of New Zealand">Economy of New Zealand</a>
+ </div>
+ <div role="note" class="hatnote navigation-not-searchable">
+ See also: <a href="/wiki/List_of_companies_of_New_Zealand" title="List of companies of New Zealand">List of companies of New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Auckland_Waterfrt.jpg" class="image"><img alt="Boats docked in blue-green water. Plate glass skyscrapers rising up in the background." src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/220px-Auckland_Waterfrt.jpg" decoding="async" width="220" height="145" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/330px-Auckland_Waterfrt.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Auckland_Waterfrt.jpg/440px-Auckland_Waterfrt.jpg 2x" data-file-width="4568" data-file-height="3019" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Auckland_Waterfrt.jpg" class="internal" title="Enlarge"></a>
+ </div><a href="/wiki/Auckland_waterfront" title="Auckland waterfront">Waterfront</a> along <a href="/wiki/Auckland_CBD" title="Auckland CBD">Auckland CBD</a>, a major hub of economic activity
+ </div>
+ </div>
+ </div>
+ <p>
+ New Zealand has an <a href="/wiki/Advanced_economy" class="mw-redirect" title="Advanced economy">advanced</a> <a href="/wiki/Market_economy" title="Market economy">market economy</a>,<sup id="cite_ref-200" class="reference"><a href="#cite_note-200">[193]</a></sup> ranked 16th in the 2018<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup> <a href="/wiki/Human_Development_Index" title="Human Development Index">Human Development Index</a><sup id="cite_ref-HDI_12-1" class="reference"><a href="#cite_note-HDI-12">[8]</a></sup> and third in the 2018<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup> <a href="/wiki/Index_of_Economic_Freedom" title="Index of Economic Freedom">Index of Economic Freedom</a>.<sup id="cite_ref-201" class="reference"><a href="#cite_note-201">[194]</a></sup> It is a <a href="/wiki/High-income_economy" class="mw-redirect" title="High-income economy">high-income economy</a> with a <a href="/wiki/Nominal_value" class="mw-redirect" title="Nominal value">nominal</a> <a href="/wiki/Gross_domestic_product" title="Gross domestic product">gross domestic product</a> (GDP) per capita of <a href="/wiki/United_States_dollar" title="United States dollar">US$</a>36,254.<sup id="cite_ref-imf2_10-4" class="reference"><a href="#cite_note-imf2-10">[6]</a></sup> The currency is the <a href="/wiki/New_Zealand_dollar" title="New Zealand dollar">New Zealand dollar</a>, informally known as the "Kiwi dollar"; it also circulates in the Cook Islands (see <a href="/wiki/Cook_Islands_dollar" title="Cook Islands dollar">Cook Islands dollar</a>), Niue, Tokelau, and the <a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a>.<sup id="cite_ref-202" class="reference"><a href="#cite_note-202">[195]</a></sup>
+ </p>
+ <p>
+ Historically, extractive industries have contributed strongly to New Zealand's economy, focussing at different times on sealing, whaling, <a href="/wiki/Phormium" title="Phormium">flax</a>, gold, <a href="/wiki/Kauri_gum" title="Kauri gum">kauri gum</a>, and native timber.<sup id="cite_ref-RWT_export_evolution_203-0" class="reference"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> The first shipment of refrigerated meat on the <i><a href="/wiki/Dunedin_(ship)" title="Dunedin (ship)">Dunedin</a></i> in 1882 led to the establishment of meat and dairy exports to Britain, a trade which provided the basis for strong economic growth in New Zealand.<sup id="cite_ref-204" class="reference"><a href="#cite_note-204">[197]</a></sup> High demand for agricultural products from the United Kingdom and the United States helped New Zealanders achieve higher living standards than both Australia and Western Europe in the 1950s and 1960s.<sup id="cite_ref-205" class="reference"><a href="#cite_note-205">[198]</a></sup> In 1973, New Zealand's export market was reduced when the United Kingdom joined the <a href="/wiki/European_Economic_Community" title="European Economic Community">European Economic Community</a><sup id="cite_ref-206" class="reference"><a href="#cite_note-206">[199]</a></sup> and other compounding factors, such as the <a href="/wiki/1973_oil_crisis" title="1973 oil crisis">1973 oil</a> and <a href="/wiki/1979_oil_crisis" title="1979 oil crisis">1979 energy</a> crises, led to a severe <a href="/wiki/Depression_(economics)" title="Depression (economics)">economic depression</a>.<sup id="cite_ref-207" class="reference"><a href="#cite_note-207">[200]</a></sup> Living standards in New Zealand fell behind those of Australia and Western Europe, and by 1982 New Zealand had the lowest per-capita income of all the developed nations surveyed by <a href="/wiki/World_Bank_Group" title="World Bank Group">the World Bank</a>.<sup id="cite_ref-208" class="reference"><a href="#cite_note-208">[201]</a></sup> In the mid-1980s New Zealand deregulated its <a href="/wiki/Agriculture_in_New_Zealand" title="Agriculture in New Zealand">agricultural sector</a> by phasing out <a href="/wiki/Agricultural_subsidy" title="Agricultural subsidy">subsidies</a> over a three-year period.<sup id="cite_ref-209" class="reference"><a href="#cite_note-209">[202]</a></sup><sup id="cite_ref-210" class="reference"><a href="#cite_note-210">[203]</a></sup> Since 1984, successive governments engaged in major <a href="/wiki/Macroeconomic" class="mw-redirect" title="Macroeconomic">macroeconomic</a> restructuring (known first as <a href="/wiki/Rogernomics" title="Rogernomics">Rogernomics</a> and then <a href="/wiki/Ruthanasia" title="Ruthanasia">Ruthanasia</a>), rapidly transforming New Zealand from a <a href="/wiki/Protectionism" title="Protectionism">protected</a> and highly regulated economy to a liberalised <a href="/wiki/Free-trade" class="mw-redirect" title="Free-trade">free-trade</a> economy.<sup id="cite_ref-Liberalisation_211-0" class="reference"><a href="#cite_note-Liberalisation-211">[204]</a></sup><sup id="cite_ref-212" class="reference"><a href="#cite_note-212">[205]</a></sup>
+ </p>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:MilfordSound.jpg" class="image"><img alt="Blue water against a backdrop of snow-capped mountains" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/220px-MilfordSound.jpg" decoding="async" width="220" height="147" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/330px-MilfordSound.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/42/MilfordSound.jpg/440px-MilfordSound.jpg 2x" data-file-width="2048" data-file-height="1364" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:MilfordSound.jpg" class="internal" title="Enlarge"></a>
+ </div><a href="/wiki/Milford_Sound" title="Milford Sound">Milford Sound</a> is one of New Zealand's most famous tourist destinations.<sup id="cite_ref-213" class="reference"><a href="#cite_note-213">[206]</a></sup>
+ </div>
+ </div>
+ </div>
+ <p>
+ Unemployment peaked above 10% in 1991 and 1992,<sup id="cite_ref-unemployment_214-0" class="reference"><a href="#cite_note-unemployment-214">[207]</a></sup> following the <a href="/wiki/Black_Monday_(1987)" title="Black Monday (1987)">1987 share market crash</a>, but eventually fell to a record low (since 1986) of 3.7% in 2007 (ranking third from twenty-seven comparable OECD nations).<sup id="cite_ref-unemployment_214-1" class="reference"><a href="#cite_note-unemployment-214">[207]</a></sup> However, the <a href="/wiki/Financial_crisis_of_2007%E2%80%932008" title="Financial crisis of 2007–2008">global financial crisis</a> that followed had a major impact on New Zealand, with the GDP shrinking for five consecutive quarters, the longest recession in over thirty years,<sup id="cite_ref-215" class="reference"><a href="#cite_note-215">[208]</a></sup><sup id="cite_ref-216" class="reference"><a href="#cite_note-216">[209]</a></sup> and unemployment rising back to 7% in late 2009.<sup id="cite_ref-217" class="reference"><a href="#cite_note-217">[210]</a></sup> Unemployment rates for different age groups follow similar trends, but are consistently higher among youth. In the December 2014 quarter, the general unemployment rate was around 5.8%, while the unemployment rate for youth aged 15 to 21 was 15.6%.<sup id="cite_ref-unemployment_214-2" class="reference"><a href="#cite_note-unemployment-214">[207]</a></sup> New Zealand has experienced a series of "<a href="/wiki/Brain_drain" class="mw-redirect" title="Brain drain">brain drains</a>" since the 1970s<sup id="cite_ref-218" class="reference"><a href="#cite_note-218">[211]</a></sup> that still continue today.<sup id="cite_ref-219" class="reference"><a href="#cite_note-219">[212]</a></sup> Nearly one quarter of highly skilled workers live overseas, mostly in Australia and Britain, which is the largest proportion from any developed nation.<sup id="cite_ref-220" class="reference"><a href="#cite_note-220">[213]</a></sup> In recent decades, however, a "brain gain" has brought in educated professionals from Europe and less developed countries.<sup id="cite_ref-221" class="reference"><a href="#cite_note-221">[214]</a></sup><sup id="cite_ref-FOOTNOTEBain200644_222-0" class="reference"><a href="#cite_note-FOOTNOTEBain200644-222">[215]</a></sup> Today New Zealand's economy benefits from a high level of <a href="/wiki/Innovation" title="Innovation">innovation</a>.<sup id="cite_ref-223" class="reference"><a href="#cite_note-223">[216]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Trade">Trade</span>
+ </h3>
+ <p>
+ New Zealand is heavily dependent on international trade,<sup id="cite_ref-224" class="reference"><a href="#cite_note-224">[217]</a></sup> particularly in agricultural products.<sup id="cite_ref-225" class="reference"><a href="#cite_note-225">[218]</a></sup> Exports account for 24% of its output,<sup id="cite_ref-CIA_150-1" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> making New Zealand vulnerable to international commodity prices and global <a href="/wiki/Recession" title="Recession">economic slowdowns</a>. Food products made up 55% of the value of all the country's exports in 2014; wood was the second largest earner (7%).<sup id="cite_ref-226" class="reference"><a href="#cite_note-226">[219]</a></sup> New Zealand's main trading partners, as at June 2018<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup>, are China (<a href="/wiki/NZ$" class="mw-redirect" title="NZ$">NZ$</a>27.8b), Australia ($26.2b), the <a href="/wiki/European_Union" title="European Union">European Union</a> ($22.9b), the United States ($17.6b), and Japan ($8.4b).<sup id="cite_ref-GSTC_StatNZ_227-0" class="reference"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> On 7 April 2008, New Zealand and China signed the <a href="/wiki/New_Zealand%E2%80%93China_Free_Trade_Agreement" title="New Zealand–China Free Trade Agreement">New Zealand–China Free Trade Agreement</a>, the first such agreement China has signed with a developed country.<sup id="cite_ref-228" class="reference"><a href="#cite_note-228">[221]</a></sup> The service sector is the largest sector in the economy, followed by manufacturing and construction and then farming and raw material extraction.<sup id="cite_ref-CIA_150-2" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> <a href="/wiki/Tourism_in_New_Zealand" title="Tourism in New Zealand">Tourism</a> plays a significant role in the economy, contributing $12.9 billion (or 5.6%) to New Zealand's total GDP and supporting 7.5% of the total workforce in 2016.<sup id="cite_ref-TourismStats_229-0" class="reference"><a href="#cite_note-TourismStats-229">[222]</a></sup> International visitor arrivals are expected to increase at a rate of 5.4% annually up to 2022.<sup id="cite_ref-TourismStats_229-1" class="reference"><a href="#cite_note-TourismStats-229">[222]</a></sup>
+ </p>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Fauna_de_Nueva_Zelanda07.JPG" class="image"><img alt="A Romney ewe with her two lambs" src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/220px-Fauna_de_Nueva_Zelanda07.JPG" decoding="async" width="220" height="147" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/330px-Fauna_de_Nueva_Zelanda07.JPG 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Fauna_de_Nueva_Zelanda07.JPG/440px-Fauna_de_Nueva_Zelanda07.JPG 2x" data-file-width="3888" data-file-height="2592" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Fauna_de_Nueva_Zelanda07.JPG" class="internal" title="Enlarge"></a>
+ </div>Wool has historically been one of New Zealand's major exports.
+ </div>
+ </div>
+ </div>
+ <p>
+ Wool was New Zealand's major agricultural export during the late 19th century.<sup id="cite_ref-RWT_export_evolution_203-1" class="reference"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> Even as late as the 1960s it made up over a third of all export revenues,<sup id="cite_ref-RWT_export_evolution_203-2" class="reference"><a href="#cite_note-RWT_export_evolution-203">[196]</a></sup> but since then its price has steadily dropped relative to other commodities<sup id="cite_ref-230" class="reference"><a href="#cite_note-230">[223]</a></sup> and wool is no longer profitable for many farmers.<sup id="cite_ref-231" class="reference"><a href="#cite_note-231">[224]</a></sup> In contrast <a href="/wiki/Dairy_farming_in_New_Zealand" title="Dairy farming in New Zealand">dairy farming</a> increased, with the number of dairy cows doubling between 1990 and 2007,<sup id="cite_ref-232" class="reference"><a href="#cite_note-232">[225]</a></sup> to become New Zealand's largest export earner.<sup id="cite_ref-233" class="reference"><a href="#cite_note-233">[226]</a></sup> In the year to June 2018, dairy products accounted for 17.7% ($14.1 billion) of total exports,<sup id="cite_ref-GSTC_StatNZ_227-1" class="reference"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> and the country's largest company, <a href="/wiki/Fonterra" title="Fonterra">Fonterra</a>, controls almost one-third of the international dairy trade.<sup id="cite_ref-234" class="reference"><a href="#cite_note-234">[227]</a></sup> Other exports in 2017-18 were meat (8.8%), wood and wood products (6.2%), fruit (3.6%), machinery (2.2%) and wine (2.1%).<sup id="cite_ref-GSTC_StatNZ_227-2" class="reference"><a href="#cite_note-GSTC_StatNZ-227">[220]</a></sup> <a href="/wiki/New_Zealand_wine" title="New Zealand wine">New Zealand's wine</a> industry has followed a similar trend to dairy, the number of vineyards doubling over the same period,<sup id="cite_ref-235" class="reference"><a href="#cite_note-235">[228]</a></sup> overtaking wool exports for the first time in 2007.<sup id="cite_ref-236" class="reference"><a href="#cite_note-236">[229]</a></sup><sup id="cite_ref-237" class="reference"><a href="#cite_note-237">[230]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Infrastructure">Infrastructure</span>
+ </h3>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Air_New_Zealand,_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_(27091961041).jpg" class="image"><img alt="A mid-size jet airliner in flight. The plane livery is all-black and features a New Zealand silver fern mark." src="//upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/220px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg" decoding="async" width="220" height="147" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/330px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/11/Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg/440px-Air_New_Zealand%2C_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_%2827091961041%29.jpg 2x" data-file-width="5625" data-file-height="3750" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Air_New_Zealand,_Boeing_787-9_ZK-NZE_%27All_Blacks%27_NRT_(27091961041).jpg" class="internal" title="Enlarge"></a>
+ </div>A <a href="/wiki/Boeing_787_Dreamliner" title="Boeing 787 Dreamliner">Boeing 787-9 Dreamliner</a> of <a href="/wiki/Air_New_Zealand" title="Air New Zealand">Air New Zealand</a>, the flag carrier of New Zealand
+ </div>
+ </div>
+ </div>
+ <p>
+ In 2015, <a href="/wiki/Renewable_energy_in_New_Zealand" title="Renewable energy in New Zealand">renewable energy</a>, primarily <a href="/wiki/Geothermal_power_in_New_Zealand" title="Geothermal power in New Zealand">geothermal</a> and <a href="/wiki/Hydroelectric_power_in_New_Zealand" title="Hydroelectric power in New Zealand">hydroelectric power</a>, generated 40.1% of <a href="/wiki/Energy_in_New_Zealand" title="Energy in New Zealand">New Zealand's gross energy</a> supply.<sup id="cite_ref-Energy2015_238-0" class="reference"><a href="#cite_note-Energy2015-238">[231]</a></sup> Geothermal power alone accounted for 22% of New Zealand's energy in 2015.<sup id="cite_ref-Energy2015_238-1" class="reference"><a href="#cite_note-Energy2015-238">[231]</a></sup>
+ </p>
+ <p>
+ The provision of <a href="/wiki/Water_supply_and_sanitation_in_New_Zealand" title="Water supply and sanitation in New Zealand">water supply and sanitation</a> is generally of good quality. Regional authorities provide water abstraction, treatment and distribution infrastructure to most developed areas.<sup id="cite_ref-239" class="reference"><a href="#cite_note-239">[232]</a></sup><sup id="cite_ref-240" class="reference"><a href="#cite_note-240">[233]</a></sup>
+ </p>
+ <p>
+ <a href="/wiki/Transport_in_New_Zealand" title="Transport in New Zealand">New Zealand's transport</a> network comprises 94,000 kilometres (58,410&#160;mi) of roads, including 199 kilometres (124&#160;mi) of motorways,<sup id="cite_ref-241" class="reference"><a href="#cite_note-241">[234]</a></sup> and 4,128 kilometres (2,565&#160;mi) of railway lines.<sup id="cite_ref-CIA_150-3" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> Most major cities and towns are linked by bus services, although the private car is the predominant mode of transport.<sup id="cite_ref-242" class="reference"><a href="#cite_note-242">[235]</a></sup> The <a href="/wiki/Rail_transport_in_New_Zealand" title="Rail transport in New Zealand">railways</a> were privatised in 1993, but were re-nationalised by the government in stages between 2004 and 2008. The state-owned enterprise <a href="/wiki/KiwiRail" title="KiwiRail">KiwiRail</a> now operates the railways, with the exception of commuter services in Auckland and Wellington which are operated by <a href="/wiki/Transdev_Auckland" title="Transdev Auckland">Transdev</a><sup id="cite_ref-243" class="reference"><a href="#cite_note-243">[236]</a></sup> and <a href="/wiki/Public_transport_in_the_Wellington_Region" title="Public transport in the Wellington Region">Metlink</a>,<sup id="cite_ref-244" class="reference"><a href="#cite_note-244">[237]</a></sup> respectively. Railways run the length of the country, although most lines now carry freight rather than passengers.<sup id="cite_ref-245" class="reference"><a href="#cite_note-245">[238]</a></sup> Most international visitors arrive via air<sup id="cite_ref-246" class="reference"><a href="#cite_note-246">[239]</a></sup> and New Zealand has <a href="/wiki/List_of_airports_in_New_Zealand" title="List of airports in New Zealand">six international airports</a>, but currently<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup> only the <a href="/wiki/Auckland_Airport" title="Auckland Airport">Auckland</a> and <a href="/wiki/Christchurch_International_Airport" title="Christchurch International Airport">Christchurch airports</a> connect directly with countries other than Australia or Fiji.<sup id="cite_ref-247" class="reference"><a href="#cite_note-247">[240]</a></sup>
+ </p>
+ <p>
+ The <a href="/wiki/New_Zealand_Post_Office" title="New Zealand Post Office">New Zealand Post Office</a> had a monopoly over <a href="/wiki/Telecommunications_in_New_Zealand" title="Telecommunications in New Zealand">telecommunications in New Zealand</a> until 1987 when <a href="/wiki/Spark_New_Zealand" title="Spark New Zealand">Telecom New Zealand</a> was formed, initially as a state-owned enterprise and then privatised in 1990.<sup id="cite_ref-Wilson2010_248-0" class="reference"><a href="#cite_note-Wilson2010-248">[241]</a></sup> <a href="/wiki/Chorus_Limited" title="Chorus Limited">Chorus</a>, which was split from Telecom (now Spark) in 2011,<sup id="cite_ref-249" class="reference"><a href="#cite_note-249">[242]</a></sup> still owns the majority of the telecommunications infrastructure, but competition from other providers has increased.<sup id="cite_ref-Wilson2010_248-1" class="reference"><a href="#cite_note-Wilson2010-248">[241]</a></sup> A large-scale rollout of gigabit-capable <a href="/wiki/Fibre_to_the_premises" class="mw-redirect" title="Fibre to the premises">fibre to the premises</a>, branded as <a href="/wiki/Ultra-Fast_Broadband" title="Ultra-Fast Broadband">Ultra-Fast Broadband</a>, began in 2009 with a target of being available to 87% of the population by 2022.<sup id="cite_ref-250" class="reference"><a href="#cite_note-250">[243]</a></sup> As of 2017<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup>, the United Nations <a href="/wiki/International_Telecommunication_Union" title="International Telecommunication Union">International Telecommunication Union</a> ranks New Zealand 13th in the development of information and communications infrastructure.<sup id="cite_ref-251" class="reference"><a href="#cite_note-251">[244]</a></sup>
+ </p>
+ <h2>
+ <span class="mw-headline" id="Demography">Demography</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Demographics_of_New_Zealand" title="Demographics of New Zealand">Demographics of New Zealand</a>
+ </div>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:282px;">
+ <a href="/wiki/File:New_Zealandpop.svg" class="image"><img alt="Stationary population pyramid broken down into 21 age ranges." src="//upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/280px-New_Zealandpop.svg.png" decoding="async" width="280" height="210" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/420px-New_Zealandpop.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/27/New_Zealandpop.svg/560px-New_Zealandpop.svg.png 2x" data-file-width="800" data-file-height="600" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:New_Zealandpop.svg" class="internal" title="Enlarge"></a>
+ </div><a href="/wiki/Population_pyramid" title="Population pyramid">Population pyramid</a> (2017)
+ </div>
+ </div>
+ </div>
+ <p>
+ The <a href="/wiki/2013_New_Zealand_census" title="2013 New Zealand census">2013 New Zealand census</a> enumerated a resident population of 4,242,048, an increase of 5.3% over the 2006 figure.<sup id="cite_ref-252" class="reference"><a href="#cite_note-252">[245]</a></sup><sup id="cite_ref-254" class="reference"><a href="#cite_note-254">[n 8]</a></sup> As of September 2019, the total population has risen to an estimated 4,933,210.<sup id="cite_ref-populationestimate_9-1" class="reference"><a href="#cite_note-populationestimate-9">[5]</a></sup>
+ </p>
+ <p>
+ New Zealand is a predominantly urban country, with 73.0% of the population living in the seventeen main <a href="/wiki/Urban_area" title="Urban area">urban areas</a> (i.e. population 30,000 or greater) and 55.1% living in the four largest cities of <a href="/wiki/Auckland" title="Auckland">Auckland</a>, <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a>, <a href="/wiki/Wellington" title="Wellington">Wellington</a>, and <a href="/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>.<sup id="cite_ref-Urban_255-0" class="reference"><a href="#cite_note-Urban-255">[247]</a></sup> New Zealand cities generally rank highly on international livability measures. For instance, in 2016 Auckland was ranked the world's third <a href="/wiki/Most_liveable_city" class="mw-redirect" title="Most liveable city">most liveable city</a> and Wellington the twelfth by the <a href="/wiki/Mercer_Quality_of_Living_Survey" title="Mercer Quality of Living Survey">Mercer Quality of Living Survey</a>.<sup id="cite_ref-256" class="reference"><a href="#cite_note-256">[248]</a></sup>
+ </p>
+ <p>
+ Life expectancy for New Zealanders in 2012 was 84 years for females, and 80.2 years for males.<sup id="cite_ref-257" class="reference"><a href="#cite_note-257">[249]</a></sup> Life expectancy at birth is forecast to increase from 80 years to 85 years in 2050 and infant mortality is expected to decline.<sup id="cite_ref-UNtwspop_258-0" class="reference"><a href="#cite_note-UNtwspop-258">[250]</a></sup> New Zealand's <a href="/wiki/Fertility_rate" class="mw-redirect" title="Fertility rate">fertility rate</a> of 2.1 is relatively high for a developed country, and natural births account for a significant proportion of <a href="/wiki/Replacement_fertility_rate" class="mw-redirect" title="Replacement fertility rate">population growth</a>. Consequently, the country has a young population compared to most industrialised nations, with 20% of New Zealanders being 14 years old or younger.<sup id="cite_ref-CIA_150-4" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> In 2018 the <a href="/wiki/Median_age" class="mw-redirect" title="Median age">median age</a> of the New Zealand population was 38.1 years.<sup id="cite_ref-259" class="reference"><a href="#cite_note-259">[251]</a></sup> By 2050 the median age is projected to rise to 43 years and the percentage of people 60 years of age and older to rise from 18% to 29%.<sup id="cite_ref-UNtwspop_258-1" class="reference"><a href="#cite_note-UNtwspop-258">[250]</a></sup> In 2008 the leading cause of premature death was <a href="/wiki/Cancer" title="Cancer">cancer</a>, at 29.8%, followed by <a href="/wiki/Ischaemic_heart_disease" class="mw-redirect" title="Ischaemic heart disease">ischaemic heart disease</a>, 19.7%, and then <a href="/wiki/Cerebrovascular_disease" title="Cerebrovascular disease">cerebrovascular disease</a>, 9.2%.<sup id="cite_ref-260" class="reference"><a href="#cite_note-260">[252]</a></sup> As of 2016<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup>, total expenditure on <a href="/wiki/Health_care_in_New_Zealand" title="Health care in New Zealand">health care</a> (including private sector spending) is 9.2% of GDP.<sup id="cite_ref-261" class="reference"><a href="#cite_note-261">[253]</a></sup><br />
+ </p>
+ <table class="navbox">
+ <tbody>
+ <tr>
+ <th colspan="10" class="navbox-title">
+ <div style="float:right; width:6em; height:2.6em">
+ &#160;
+ </div>
+ <div class="plainlinks hlist navbar mini" style="float: left;height:2.6em;">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Largest_cities_in_New_Zealand" title="Template:Largest cities in New Zealand"><abbr title="View this template">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Largest_cities_in_New_Zealand" title="Template talk:Largest cities in New Zealand"><abbr title="Discuss this template">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Largest_cities_in_New_Zealand&amp;action=edit"><abbr title="Edit this template">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div style="height:2.6em;line-height:1.3em;">
+ <span style="font-size:110%;">Largest urban areas in New Zealand</span><br />
+ <div style="display:inline;font-weight:normal;">
+ <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a> June 2018 estimate (<abbr title="New Zealand Standard Areas Classification 1992">NZSAC92</abbr> boundaries)<sup id="cite_ref-NZ_population_data_262-0" class="reference"><a href="#cite_note-NZ_population_data-262">[254]</a></sup>
+ </div>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th></th>
+ <th>
+ <a href="/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Rank</a>
+ </th>
+ <th>
+ <a href="/wiki/List_of_cities_in_New_Zealand" title="List of cities in New Zealand">Name</a>
+ </th>
+ <th>
+ <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Region</a>
+ </th>
+ <th>
+ <a href="/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Pop.</a>
+ </th>
+ <th>
+ <a href="/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Rank</a>
+ </th>
+ <th>
+ <a href="/wiki/List_of_cities_in_New_Zealand" title="List of cities in New Zealand">Name</a>
+ </th>
+ <th>
+ <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Region</a>
+ </th>
+ <th>
+ <a href="/wiki/List_of_New_Zealand_urban_areas_by_population" title="List of New Zealand urban areas by population">Pop.</a>
+ </th>
+ <th></th>
+ </tr>
+ <tr>
+ <td rowspan="11" style="text-align: center">
+ <a href="/wiki/File:Auckland_Cbd_(217403753).jpeg" class="image" title="Auckland"><img alt="Auckland" src="//upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/120px-Auckland_Cbd_%28217403753%29.jpeg" decoding="async" width="120" height="80" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/180px-Auckland_Cbd_%28217403753%29.jpeg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Auckland_Cbd_%28217403753%29.jpeg/240px-Auckland_Cbd_%28217403753%29.jpeg 2x" data-file-width="2048" data-file-height="1362" /></a><br />
+ <a href="/wiki/Auckland" title="Auckland">Auckland</a><br />
+ <a href="/wiki/File:Wellington_at_dawn.jpg" class="image" title="Wellington"><img alt="Wellington" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/120px-Wellington_at_dawn.jpg" decoding="async" width="120" height="80" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/180px-Wellington_at_dawn.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Wellington_at_dawn.jpg/240px-Wellington_at_dawn.jpg 2x" data-file-width="3718" data-file-height="2479" /></a><br />
+ <a href="/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 1
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Auckland" title="Auckland">Auckland</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Auckland_Region" title="Auckland Region">Auckland</a>
+ </td>
+ <td style="text-align:right;">
+ 1,628,900
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 11
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Whangarei" title="Whangarei">Whangarei</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Northland_Region" title="Northland Region">Northland</a>
+ </td>
+ <td style="text-align:right;">
+ 58,800
+ </td>
+ <td rowspan="11" style="text-align: center">
+ <a href="/wiki/File:Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_(2).jpg" class="image" title="Christchurch"><img alt="Christchurch" src="//upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/120px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg" decoding="async" width="120" height="80" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/180px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg/240px-Aerial_image_of_Christchurch_suburbs_-_Flickr_-_NZ_Defence_Force_%282%29.jpg 2x" data-file-width="1800" data-file-height="1200" /></a><br />
+ <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a><br />
+ <a href="/wiki/File:HamiltonNZfromUni.jpg" class="image" title="Hamilton"><img alt="Hamilton" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/120px-HamiltonNZfromUni.jpg" decoding="async" width="120" height="85" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/180px-HamiltonNZfromUni.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/87/HamiltonNZfromUni.jpg/240px-HamiltonNZfromUni.jpg 2x" data-file-width="3581" data-file-height="2528" /></a><br />
+ <a href="/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 2
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Wellington" title="Wellington">Wellington</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Wellington_Region" title="Wellington Region">Wellington</a>
+ </td>
+ <td style="text-align:right;">
+ 418,500
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 12
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/New_Plymouth" title="New Plymouth">New Plymouth</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Taranaki" title="Taranaki">Taranaki</a>
+ </td>
+ <td style="text-align:right;">
+ 58,300
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 3
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a>
+ </td>
+ <td style="text-align:right;">
+ 404,500
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 13
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Invercargill" title="Invercargill">Invercargill</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Southland,_New_Zealand" title="Southland, New Zealand">Southland</a>
+ </td>
+ <td style="text-align:right;">
+ 51,200
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 4
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Waikato" title="Waikato">Waikato</a>
+ </td>
+ <td style="text-align:right;">
+ 241,200
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 14
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Kapiti_Urban_Area" title="Kapiti Urban Area">Kapiti</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Wellington_Region" title="Wellington Region">Wellington</a>
+ </td>
+ <td style="text-align:right;">
+ 42,700
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 5
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Tauranga" title="Tauranga">Tauranga</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Bay_of_Plenty" title="Bay of Plenty">Bay of Plenty</a>
+ </td>
+ <td style="text-align:right;">
+ 141,600
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 15
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Whanganui" title="Whanganui">Whanganui</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Manawatu-Wanganui" title="Manawatu-Wanganui">Manawatu-Wanganui</a>
+ </td>
+ <td style="text-align:right;">
+ 40,900
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 6
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Napier-Hastings_Urban_Area" title="Napier-Hastings Urban Area">Napier-Hastings</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Hawke%27s_Bay_Region" title="Hawke's Bay Region">Hawke's Bay</a>
+ </td>
+ <td style="text-align:right;">
+ 134,500
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 16
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Gisborne,_New_Zealand" title="Gisborne, New Zealand">Gisborne</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Gisborne_Region" class="mw-redirect" title="Gisborne Region">Gisborne</a>
+ </td>
+ <td style="text-align:right;">
+ 37,200
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 7
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Dunedin" title="Dunedin">Dunedin</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Otago" title="Otago">Otago</a>
+ </td>
+ <td style="text-align:right;">
+ 122,000
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 17
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Blenheim,_New_Zealand" title="Blenheim, New Zealand">Blenheim</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Marlborough_Region" title="Marlborough Region">Marlborough</a>
+ </td>
+ <td style="text-align:right;">
+ 31,600
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 8
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Palmerston_North" title="Palmerston North">Palmerston North</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Manawatu-Wanganui" title="Manawatu-Wanganui">Manawatu-Wanganui</a>
+ </td>
+ <td style="text-align:right;">
+ 86,600
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 18
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Pukekohe" title="Pukekohe">Pukekohe</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Auckland_Region" title="Auckland Region">Auckland</a>
+ </td>
+ <td style="text-align:right;">
+ 31,400
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 9
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Nelson,_New_Zealand" title="Nelson, New Zealand">Nelson</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Nelson_Region" class="mw-redirect" title="Nelson Region">Nelson</a>
+ </td>
+ <td style="text-align:right;">
+ 67,500
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 19
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Timaru" title="Timaru">Timaru</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Canterbury,_New_Zealand" title="Canterbury, New Zealand">Canterbury</a>
+ </td>
+ <td style="text-align:right;">
+ 29,100
+ </td>
+ </tr>
+ <tr>
+ <td style="text-align:center;background:#f0f0f0;">
+ 10
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Rotorua" title="Rotorua">Rotorua</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Bay_of_Plenty" title="Bay of Plenty">Bay of Plenty</a>
+ </td>
+ <td style="text-align:right;">
+ 59,500
+ </td>
+ <td style="text-align:center;background:#f0f0f0;">
+ 20
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Taupo" title="Taupo">Taupo</a>
+ </td>
+ <td style="text-align:left;">
+ <a href="/wiki/Waikato" title="Waikato">Waikato</a>
+ </td>
+ <td style="text-align:right;">
+ 24,700
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <p>
+ <br />
+ </p>
+ <h3>
+ <span class="mw-headline" id="Ethnicity_and_immigration">Ethnicity and immigration</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/New_Zealanders" title="New Zealanders">New Zealanders</a> and <a href="/wiki/Immigration_to_New_Zealand" title="Immigration to New Zealand">Immigration to New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Queen_Street_Midtown_Auckland.jpg" class="image"><img alt="Pedestrians crossing a wide street which is flanked by storefronts" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/220px-Queen_Street_Midtown_Auckland.jpg" decoding="async" width="220" height="158" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/330px-Queen_Street_Midtown_Auckland.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Queen_Street_Midtown_Auckland.jpg/440px-Queen_Street_Midtown_Auckland.jpg 2x" data-file-width="841" data-file-height="604" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Queen_Street_Midtown_Auckland.jpg" class="internal" title="Enlarge"></a>
+ </div>Pedestrians on <a href="/wiki/Queen_Street,_Auckland" title="Queen Street, Auckland">Queen Street</a> in Auckland, an ethnically diverse city
+ </div>
+ </div>
+ </div>
+ <p>
+ In the 2013 census, 74.0% of New Zealand residents identified ethnically as European, and 14.9% as Māori. Other major ethnic groups include <a href="/wiki/Asian_New_Zealanders" title="Asian New Zealanders">Asian</a> (11.8%) and Pacific peoples (7.4%), two-thirds of whom live in the <a href="/wiki/Auckland_Region" title="Auckland Region">Auckland Region</a>.<sup id="cite_ref-QuickStats_ethnicity_263-0" class="reference"><a href="#cite_note-QuickStats_ethnicity-263">[255]</a></sup><sup id="cite_ref-ethnicity_6-1" class="reference"><a href="#cite_note-ethnicity-6">[n 3]</a></sup> The population has become more diverse in recent decades: in 1961, the census reported that the population of New Zealand was 92% European and 7% Māori, with Asian and Pacific minorities sharing the remaining 1%.<sup id="cite_ref-264" class="reference"><a href="#cite_note-264">[256]</a></sup>
+ </p>
+ <p>
+ While the <a href="/wiki/Demonym" title="Demonym">demonym</a> for a New Zealand citizen is New Zealander, the informal "<a href="/wiki/Kiwi_(people)" title="Kiwi (people)">Kiwi</a>" is commonly used both internationally<sup id="cite_ref-265" class="reference"><a href="#cite_note-265">[257]</a></sup> and by locals.<sup id="cite_ref-266" class="reference"><a href="#cite_note-266">[258]</a></sup> The Māori loanword <a href="/wiki/P%C4%81keh%C4%81" title="Pākehā">Pākehā</a> has been used to refer to <a href="/wiki/European_New_Zealanders" title="European New Zealanders">New Zealanders of European descent</a>, although others reject this appellation.<sup id="cite_ref-FOOTNOTEBain200631_267-0" class="reference"><a href="#cite_note-FOOTNOTEBain200631-267">[259]</a></sup><sup id="cite_ref-268" class="reference"><a href="#cite_note-268">[260]</a></sup> The word Pākehā today is increasingly used to refer to all non-Polynesian New Zealanders.<sup id="cite_ref-Pakeha_269-0" class="reference"><a href="#cite_note-Pakeha-269">[261]</a></sup>
+ </p>
+ <p>
+ The Māori were the first people to reach New Zealand, followed by the early <a href="/wiki/P%C4%81keh%C4%81_settlers" title="Pākehā settlers">European settlers</a>. Following colonisation, immigrants were predominantly from Britain, Ireland and Australia because of restrictive policies similar to the <a href="/wiki/White_Australia_policy" title="White Australia policy">White Australia policy</a>.<sup id="cite_ref-270" class="reference"><a href="#cite_note-270">[262]</a></sup> There was also significant Dutch, <a href="/wiki/Dalmatia" title="Dalmatia">Dalmatian</a>,<sup id="cite_ref-271" class="reference"><a href="#cite_note-271">[263]</a></sup> German, and Italian immigration, together with indirect European immigration through Australia, North America, South America and South Africa.<sup id="cite_ref-272" class="reference"><a href="#cite_note-272">[264]</a></sup><sup id="cite_ref-Immigration_history_273-0" class="reference"><a href="#cite_note-Immigration_history-273">[265]</a></sup> Net migration increased after the Second World War; in the 1970s and 1980s policies were relaxed and immigration from Asia was promoted.<sup id="cite_ref-Immigration_history_273-1" class="reference"><a href="#cite_note-Immigration_history-273">[265]</a></sup><sup id="cite_ref-274" class="reference"><a href="#cite_note-274">[266]</a></sup> In 2009–10, an annual target of 45,000–50,000 permanent residence approvals was set by the New Zealand Immigration Service—more than one new migrant for every 100 New Zealand residents.<sup id="cite_ref-Recent_immigration_275-0" class="reference"><a href="#cite_note-Recent_immigration-275">[267]</a></sup> Just over 25% of New Zealand's population was born overseas, with the majority (52%) living in the Auckland Region. The United Kingdom remains the largest source of New Zealand's overseas population, with a quarter of all overseas-born New Zealanders born there; other major sources of New Zealand's overseas-born population are China, India, Australia, South Africa, Fiji and Samoa.<sup id="cite_ref-276" class="reference"><a href="#cite_note-276">[268]</a></sup> The number of fee-paying <a href="/wiki/International_student" title="International student">international students</a> increased sharply in the late 1990s, with more than 20,000 studying in public <a href="/wiki/Tertiary_education" title="Tertiary education">tertiary institutions</a> in 2002.<sup id="cite_ref-277" class="reference"><a href="#cite_note-277">[269]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Language">Language</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Languages_of_New_Zealand" title="Languages of New Zealand">Languages of New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:TeReoMaori2013.png" class="image"><img alt="Map of New Zealand showing the percentage of people in each census area unit who speak Māori. Areas of the North Island exhibit the highest Māori proficiency." src="//upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/220px-TeReoMaori2013.png" decoding="async" width="220" height="165" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/330px-TeReoMaori2013.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/16/TeReoMaori2013.png/440px-TeReoMaori2013.png 2x" data-file-width="5000" data-file-height="3759" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:TeReoMaori2013.png" class="internal" title="Enlarge"></a>
+ </div>Speakers of Māori according to the 2013 census<sup id="cite_ref-278" class="reference"><a href="#cite_note-278">[270]</a></sup>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #fef0d9; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;Less than 5%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #fdd8a4; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 5%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #fcb779; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 10%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #fc8d59; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 20%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #eb603f; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 30%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #d33121; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 40%
+ </div>
+ <div class="legend" style="-webkit-column-break-inside: avoid;page-break-inside: avoid;break-inside: avoid-column">
+ <span class="legend-color" style="display:inline-block; width:1.5em; height:1.5em; margin:1px 0; border:1px solid black; background-color: #a50c0c; color:black; font-size:100%; text-align:center;">&#160;</span>&#160;More than 50%
+ </div>
+ </div>
+ </div>
+ </div>
+ <p>
+ English is the predominant language in New Zealand, spoken by 96.1% of the population.<sup id="cite_ref-SpokenLanguage_279-0" class="reference"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup> <a href="/wiki/New_Zealand_English" title="New Zealand English">New Zealand English</a> is similar to <a href="/wiki/Australian_English" title="Australian English">Australian English</a> and many speakers from the Northern Hemisphere are unable to tell the <a href="/wiki/Accent_(sociolinguistics)" title="Accent (sociolinguistics)">accents</a> apart.<sup id="cite_ref-FOOTNOTEHayMaclaganGordon200814_280-0" class="reference"><a href="#cite_note-FOOTNOTEHayMaclaganGordon200814-280">[272]</a></sup> The most prominent differences between the New Zealand English dialect and other English dialects are the shifts in the short front vowels: the short-"i" sound (as in "kit") has centralised towards the <a href="/wiki/Schwa" title="Schwa">schwa</a> sound (the "a" in "comma" and "about"); the short-"e" sound (as in "dress") has moved towards the short-"i" sound; and the short-"a" sound (as in "trap") has moved to the short-"e" sound.<sup id="cite_ref-281" class="reference"><a href="#cite_note-281">[273]</a></sup>
+ </p>
+ <p>
+ After the Second World War, Māori were discouraged from speaking their own language (<i><a href="/wiki/Te_reo_M%C4%81ori" class="mw-redirect" title="Te reo Māori">te reo Māori</a></i>) in schools and workplaces and it existed as a community language only in a few remote areas.<sup id="cite_ref-Maori_language_282-0" class="reference"><a href="#cite_note-Maori_language-282">[274]</a></sup> It has recently undergone a process of revitalisation,<sup id="cite_ref-283" class="reference"><a href="#cite_note-283">[275]</a></sup> being declared one of New Zealand's official languages in 1987,<sup id="cite_ref-284" class="reference"><a href="#cite_note-284">[276]</a></sup> and is spoken by 3.7% of the population.<sup id="cite_ref-SpokenLanguage_279-1" class="reference"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup><sup id="cite_ref-286" class="reference"><a href="#cite_note-286">[n 9]</a></sup> There are now Māori language immersion schools and two television channels that broadcast predominantly in Māori.<sup id="cite_ref-287" class="reference"><a href="#cite_note-287">[278]</a></sup> <a href="/wiki/List_of_dual_place_names_in_New_Zealand" title="List of dual place names in New Zealand">Many places</a> have both their Māori and English names officially recognised.<sup id="cite_ref-288" class="reference"><a href="#cite_note-288">[279]</a></sup>
+ </p>
+ <p>
+ As recorded in the 2013 census,<sup id="cite_ref-SpokenLanguage_279-2" class="reference"><a href="#cite_note-SpokenLanguage-279">[271]</a></sup> <a href="/wiki/Samoan_language" title="Samoan language">Samoan</a> is the most widely spoken non-official language (2.2%),<sup id="cite_ref-289" class="reference"><a href="#cite_note-289">[n 10]</a></sup> followed by <a href="/wiki/Hindi" title="Hindi">Hindi</a> (1.7%), "Northern Chinese" (including <a href="/wiki/Mandarin_Chinese" title="Mandarin Chinese">Mandarin</a>, 1.3%) and French (1.2%). 20,235 people (0.5%) reported the ability to use <a href="/wiki/New_Zealand_Sign_Language" title="New Zealand Sign Language">New Zealand Sign Language</a>. It was declared one of New Zealand's official languages in 2006.<sup id="cite_ref-290" class="reference"><a href="#cite_note-290">[280]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Religion">Religion</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Religion_in_New_Zealand" title="Religion in New Zealand">Religion in New Zealand</a>
+ </div>
+ <div role="note" class="hatnote navigation-not-searchable">
+ See also: <a href="/wiki/Irreligion_in_New_Zealand" title="Irreligion in New Zealand">Irreligion in New Zealand</a>
+ </div>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:Ratana_Church_Raetihi.jpg" class="image"><img alt="Simple white building with two red domed towers" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/170px-Ratana_Church_Raetihi.jpg" decoding="async" width="170" height="227" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/255px-Ratana_Church_Raetihi.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/70/Ratana_Church_Raetihi.jpg/340px-Ratana_Church_Raetihi.jpg 2x" data-file-width="1624" data-file-height="2164" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Ratana_Church_Raetihi.jpg" class="internal" title="Enlarge"></a>
+ </div>A <a href="/wiki/R%C4%81tana" title="Rātana">Rātana</a> church on a hill near <a href="/wiki/Raetihi" title="Raetihi">Raetihi</a>. The two-tower construction is characteristic of Rātana buildings.
+ </div>
+ </div>
+ </div>
+ <p>
+ <a href="/wiki/Christianity_in_New_Zealand" title="Christianity in New Zealand">Christianity</a> is the predominant religion in New Zealand, although its society is among the most <a href="/wiki/Secular" class="mw-redirect" title="Secular">secular</a> in the world.<sup id="cite_ref-291" class="reference"><a href="#cite_note-291">[281]</a></sup><sup id="cite_ref-292" class="reference"><a href="#cite_note-292">[282]</a></sup> In the 2018 census, 51.4% of the population identified with one or more religions, including 38.6% identifying as Christians. Another 48.6% indicated that they had no religion.<sup id="cite_ref-293" class="reference"><a href="#cite_note-293">[n 11]</a></sup><sup id="cite_ref-2013religiouscommentary_294-0" class="reference"><a href="#cite_note-2013religiouscommentary-294">[283]</a></sup> The main Christian denominations are, by number of adherents, <a href="/wiki/Catholic_Church_in_New_Zealand" title="Catholic Church in New Zealand">Roman Catholicism</a> (10.1%), <a href="/wiki/Anglican_Church_in_Aotearoa,_New_Zealand_and_Polynesia" title="Anglican Church in Aotearoa, New Zealand and Polynesia">Anglicanism</a> (6.8%), <a href="/wiki/Presbyterian_Church_of_Aotearoa_New_Zealand" title="Presbyterian Church of Aotearoa New Zealand">Presbyterianism</a> (5.5%) and "Christian not further defined" (i.e. people identifying as Christian but not stating the denomination, 6.6%).<sup id="cite_ref-2013religiouscommentary_294-1" class="reference"><a href="#cite_note-2013religiouscommentary-294">[283]</a></sup> The Māori-based <a href="/wiki/Ringat%C5%AB" title="Ringatū">Ringatū</a> and <a href="/wiki/R%C4%81tana" title="Rātana">Rātana</a> religions (1.3%) are also Christian in origin.<sup id="cite_ref-2013statstables_295-0" class="reference"><a href="#cite_note-2013statstables-295">[284]</a></sup><sup id="cite_ref-296" class="reference"><a href="#cite_note-296">[285]</a></sup> Immigration and demographic change in recent decades has contributed to the growth of minority religions,<sup id="cite_ref-297" class="reference"><a href="#cite_note-297">[286]</a></sup> such as <a href="/wiki/Hinduism_in_New_Zealand" title="Hinduism in New Zealand">Hinduism</a> (2.6%), <a href="/wiki/Buddhism_in_New_Zealand" title="Buddhism in New Zealand">Buddhism</a> (1.1%), <a href="/wiki/Islam_in_New_Zealand" title="Islam in New Zealand">Islam</a> (1.3%) and <a href="/wiki/Sikhism_in_New_Zealand" title="Sikhism in New Zealand">Sikhism</a> (0.5%).<sup id="cite_ref-2013statstables_295-1" class="reference"><a href="#cite_note-2013statstables-295">[284]</a></sup> The Auckland Region exhibited the greatest religious diversity.<sup id="cite_ref-2013statstables_295-2" class="reference"><a href="#cite_note-2013statstables-295">[284]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Education">Education</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Education_in_New_Zealand" title="Education in New Zealand">Education in New Zealand</a> and <a href="/wiki/Tertiary_education_in_New_Zealand" title="Tertiary education in New Zealand">Tertiary education in New Zealand</a>
+ </div>
+ <p>
+ Primary and secondary schooling is compulsory for children aged 6 to 16, with the majority attending from the age of 5.<sup id="cite_ref-Education_Stats_298-0" class="reference"><a href="#cite_note-Education_Stats-298">[287]</a></sup> There are 13 school years and attending <a href="/wiki/State_school" title="State school">state (public) schools</a> is free to New Zealand citizens and permanent residents from a person's 5th birthday to the end of the calendar year following their 19th birthday.<sup id="cite_ref-299" class="reference"><a href="#cite_note-299">[288]</a></sup> New Zealand has an adult literacy rate of 99%,<sup id="cite_ref-CIA_150-5" class="reference"><a href="#cite_note-CIA-150">[143]</a></sup> and over half of the population aged 15 to 29 hold a tertiary qualification.<sup id="cite_ref-Education_Stats_298-1" class="reference"><a href="#cite_note-Education_Stats-298">[287]</a></sup> There are five types of government-owned tertiary institutions: universities, colleges of education, <a href="/wiki/Institute_of_technology#New_Zealand" title="Institute of technology">polytechnics</a>, specialist colleges, and <a href="/wiki/W%C4%81nanga" title="Wānanga">wānanga</a>,<sup id="cite_ref-EducationAct1989_300-0" class="reference"><a href="#cite_note-EducationAct1989-300">[289]</a></sup> in addition to private training establishments.<sup id="cite_ref-NZQA_301-0" class="reference"><a href="#cite_note-NZQA-301">[290]</a></sup> In the adult population 14.2% have a <a href="/wiki/Bachelor%27s_degree" title="Bachelor's degree">bachelor's degree</a> or higher, 30.4% have some form of secondary qualification as their highest qualification and 22.4% have no formal qualification.<sup id="cite_ref-TertiaryEdStats_302-0" class="reference"><a href="#cite_note-TertiaryEdStats-302">[291]</a></sup> The OECD's <a href="/wiki/Programme_for_International_Student_Assessment" title="Programme for International Student Assessment">Programme for International Student Assessment</a> ranks New Zealand's education system as the seventh best in the world, with students performing exceptionally well in reading, mathematics and science.<sup id="cite_ref-303" class="reference"><a href="#cite_note-303">[292]</a></sup>
+ </p>
+ <div style="clear:both;"></div>
+ <h2>
+ <span class="mw-headline" id="Culture">Culture</span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Culture_of_New_Zealand" title="Culture of New Zealand">Culture of New Zealand</a>
+ </div>
+ <div class="thumb tright" style="width:180px;">
+ <div class="thumbinner">
+ <div class="overflowbugy" style="height:350px;overflow:auto;">
+ <a href="/wiki/File:KupeWheke.jpg" class="image" title="Use the scrollbar to see the full image."><img alt="Tall wooden carving showing Kupe above two tentacled sea creatures" src="//upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/150px-KupeWheke.jpg" decoding="async" width="150" height="605" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/225px-KupeWheke.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/5/53/KupeWheke.jpg/300px-KupeWheke.jpg 2x" data-file-width="389" data-file-height="1570" /></a>
+ </div>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:KupeWheke.jpg" title="File:KupeWheke.jpg"></a>
+ </div>Late 20th-century house-post depicting the navigator <a href="/wiki/Kupe" title="Kupe">Kupe</a> fighting two sea creatures
+ </div>
+ </div>
+ </div>
+ <p>
+ Early Māori adapted the tropically based east <a href="/wiki/Polynesian_culture" title="Polynesian culture">Polynesian culture</a> in line with the challenges associated with a larger and more diverse environment, eventually developing their own distinctive culture. Social organisation was largely communal with families (<i><a href="/wiki/Wh%C4%81nau" title="Whānau">whānau</a></i>), subtribes (<i>hapū</i>) and tribes (<i>iwi</i>) ruled by a chief (<i><a href="/wiki/Rangatira" title="Rangatira">rangatira</a></i>), whose position was subject to the community's approval.<sup id="cite_ref-FOOTNOTEKennedy2007398_304-0" class="reference"><a href="#cite_note-FOOTNOTEKennedy2007398-304">[293]</a></sup> The British and Irish immigrants brought aspects of their own culture to New Zealand and also influenced Māori culture,<sup id="cite_ref-305" class="reference"><a href="#cite_note-305">[294]</a></sup><sup id="cite_ref-306" class="reference"><a href="#cite_note-306">[295]</a></sup> particularly with the introduction of Christianity.<sup id="cite_ref-307" class="reference"><a href="#cite_note-307">[296]</a></sup> However, Māori still regard their allegiance to tribal groups as a vital part of <a href="/wiki/Cultural_identity" title="Cultural identity">their identity</a>, and Māori kinship roles resemble <a href="/wiki/Hawaiian_kinship" title="Hawaiian kinship">those of other Polynesian peoples</a>.<sup id="cite_ref-308" class="reference"><a href="#cite_note-308">[297]</a></sup> More recently <a href="/wiki/Culture_of_the_United_States" title="Culture of the United States">American</a>, <a href="/wiki/Culture_of_Australia" title="Culture of Australia">Australian</a>, <a href="/wiki/Culture_of_Asia" title="Culture of Asia">Asian</a> and other <a href="/wiki/Culture_of_Europe" title="Culture of Europe">European cultures</a> have exerted influence on New Zealand. Non-Māori Polynesian cultures are also apparent, with <a href="/wiki/Pasifika_Festival" title="Pasifika Festival">Pasifika</a>, the world's largest Polynesian festival, now an annual event in Auckland.<sup id="cite_ref-309" class="reference"><a href="#cite_note-309">[298]</a></sup>
+ </p>
+ <p>
+ The largely rural life in early New Zealand led to the image of New Zealanders being rugged, industrious problem solvers.<sup id="cite_ref-FOOTNOTEKennedy2007400_310-0" class="reference"><a href="#cite_note-FOOTNOTEKennedy2007400-310">[299]</a></sup> Modesty was expected and enforced through the "<a href="/wiki/Tall_poppy_syndrome" title="Tall poppy syndrome">tall poppy syndrome</a>", where high achievers received harsh criticism.<sup id="cite_ref-FOOTNOTEKennedy2007399_311-0" class="reference"><a href="#cite_note-FOOTNOTEKennedy2007399-311">[300]</a></sup> At the time New Zealand was not known as an intellectual country.<sup id="cite_ref-312" class="reference"><a href="#cite_note-312">[301]</a></sup> From the early 20th century until the late 1960s, Māori culture was suppressed by the attempted <a href="/wiki/Forced_assimilation" title="Forced assimilation">assimilation</a> of Māori into British New Zealanders.<sup id="cite_ref-Maori_language_282-1" class="reference"><a href="#cite_note-Maori_language-282">[274]</a></sup> In the 1960s, as tertiary education became more available and <a href="/wiki/Urbanization" title="Urbanization">cities expanded</a><sup id="cite_ref-313" class="reference"><a href="#cite_note-313">[302]</a></sup> urban culture began to dominate.<sup id="cite_ref-314" class="reference"><a href="#cite_note-314">[303]</a></sup> However, rural imagery and themes are common in New Zealand's art, literature and media.<sup id="cite_ref-315" class="reference"><a href="#cite_note-315">[304]</a></sup>
+ </p>
+ <p>
+ <a href="/wiki/National_symbols_of_New_Zealand" title="National symbols of New Zealand">New Zealand's national symbols</a> are influenced by natural, historical, and Māori sources. The <a href="/wiki/Silver_fern" class="mw-redirect" title="Silver fern">silver fern</a> is an emblem appearing on army insignia and sporting team uniforms.<sup id="cite_ref-Wilson2016_316-0" class="reference"><a href="#cite_note-Wilson2016-316">[305]</a></sup> Certain items of popular culture thought to be unique to New Zealand are called "<a href="/wiki/Kiwiana" title="Kiwiana">Kiwiana</a>".<sup id="cite_ref-Wilson2016_316-1" class="reference"><a href="#cite_note-Wilson2016-316">[305]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Art">Art</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/New_Zealand_art" title="New Zealand art">New Zealand art</a>
+ </div>
+ <p>
+ As part of the resurgence of Māori culture, the traditional crafts of carving and weaving are now more widely practised and Māori artists are increasing in number and influence.<sup id="cite_ref-Creative_317-0" class="reference"><a href="#cite_note-Creative-317">[306]</a></sup> Most Māori carvings feature human figures, generally with three fingers and either a natural-looking, detailed head or a grotesque head.<sup id="cite_ref-318" class="reference"><a href="#cite_note-318">[307]</a></sup> Surface patterns consisting of spirals, ridges, notches and fish scales decorate most carvings.<sup id="cite_ref-319" class="reference"><a href="#cite_note-319">[308]</a></sup> The pre-eminent Māori architecture consisted of carved meeting houses (<i><a href="/wiki/Wharenui" title="Wharenui">wharenui</a></i>) decorated with symbolic carvings and illustrations. These buildings were originally designed to be constantly rebuilt, changing and adapting to different whims or needs.<sup id="cite_ref-320" class="reference"><a href="#cite_note-320">[309]</a></sup>
+ </p>
+ <p>
+ Māori decorated the white wood of buildings, canoes and cenotaphs using red (a mixture of red <a href="/wiki/Ochre" title="Ochre">ochre</a> and shark fat) and black (made from soot) paint and painted pictures of birds, reptiles and other designs on cave walls.<sup id="cite_ref-321" class="reference"><a href="#cite_note-321">[310]</a></sup> Māori tattoos (<i><a href="/wiki/T%C4%81_moko" title="Tā moko">moko</a></i>) consisting of coloured soot mixed with gum were cut into the flesh with a bone chisel.<sup id="cite_ref-322" class="reference"><a href="#cite_note-322">[311]</a></sup> Since European arrival paintings and photographs have been dominated by landscapes, originally not as works of art but as factual portrayals of New Zealand.<sup id="cite_ref-beginnings_323-0" class="reference"><a href="#cite_note-beginnings-323">[312]</a></sup> Portraits of Māori were also common, with early painters often portraying them as "<a href="/wiki/Noble_savage" title="Noble savage">noble savages</a>", exotic beauties or friendly natives.<sup id="cite_ref-beginnings_323-1" class="reference"><a href="#cite_note-beginnings-323">[312]</a></sup> The country's isolation delayed the influence of European artistic trends allowing local artists to develop their own distinctive style of <a href="/wiki/Regionalism_(art)" title="Regionalism (art)">regionalism</a>.<sup id="cite_ref-324" class="reference"><a href="#cite_note-324">[313]</a></sup> During the 1960s and 1970s many artists combined traditional Māori and Western techniques, creating unique art forms.<sup id="cite_ref-325" class="reference"><a href="#cite_note-325">[314]</a></sup> New Zealand art and craft has gradually achieved an international audience, with exhibitions in the <a href="/wiki/Venice_Biennale" title="Venice Biennale">Venice Biennale</a> in 2001 and the "Paradise Now" exhibition in New York in 2004.<sup id="cite_ref-Creative_317-1" class="reference"><a href="#cite_note-Creative-317">[306]</a></sup><sup id="cite_ref-326" class="reference"><a href="#cite_note-326">[315]</a></sup>
+ </p>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:172px;">
+ <a href="/wiki/File:Hinepare.jpg" class="image"><img alt="Refer to caption" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/170px-Hinepare.jpg" decoding="async" width="170" height="218" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/255px-Hinepare.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Hinepare.jpg/340px-Hinepare.jpg 2x" data-file-width="545" data-file-height="700" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Hinepare.jpg" class="internal" title="Enlarge"></a>
+ </div>Portrait of Hinepare of <a href="/wiki/Ng%C4%81ti_Kahungunu" title="Ngāti Kahungunu">Ngāti Kahungunu</a> by <a href="/wiki/Gottfried_Lindauer" title="Gottfried Lindauer">Gottfried Lindauer</a>, showing chin <a href="/wiki/T%C4%81_moko" title="Tā moko">moko</a>, <a href="/wiki/Pounamu" title="Pounamu">pounamu</a> <a href="/wiki/Hei-tiki" title="Hei-tiki">hei-tiki</a> and woven cloak
+ </div>
+ </div>
+ </div>
+ <p>
+ Māori cloaks are made of fine flax fibre and patterned with black, red and white triangles, diamonds and other geometric shapes.<sup id="cite_ref-327" class="reference"><a href="#cite_note-327">[316]</a></sup> <a href="/wiki/Pounamu" title="Pounamu">Greenstone</a> was fashioned into earrings and necklaces, with the most well-known design being the <a href="/wiki/Hei-tiki" title="Hei-tiki">hei-tiki</a>, a distorted human figure sitting cross-legged with its head tilted to the side.<sup id="cite_ref-328" class="reference"><a href="#cite_note-328">[317]</a></sup> Europeans brought English fashion etiquette to New Zealand, and until the 1950s most people dressed up for social occasions.<sup id="cite_ref-329" class="reference"><a href="#cite_note-329">[318]</a></sup> Standards have since relaxed and New Zealand fashion has received a reputation for being casual, practical and lacklustre.<sup id="cite_ref-330" class="reference"><a href="#cite_note-330">[319]</a></sup><sup id="cite_ref-The_Economist_print_edition_331-0" class="reference"><a href="#cite_note-The_Economist_print_edition-331">[320]</a></sup> However, the local fashion industry has grown significantly since 2000, doubling exports and increasing from a handful to about 50 established labels, with some labels gaining international recognition.<sup id="cite_ref-The_Economist_print_edition_331-1" class="reference"><a href="#cite_note-The_Economist_print_edition-331">[320]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Literature">Literature</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/New_Zealand_literature" title="New Zealand literature">New Zealand literature</a>
+ </div>
+ <p>
+ Māori quickly adopted writing as a means of sharing ideas, and many of their oral stories and poems were converted to the written form.<sup id="cite_ref-332" class="reference"><a href="#cite_note-332">[321]</a></sup> Most early English literature was obtained from Britain and it was not until the 1950s when local publishing outlets increased that New Zealand literature started to become widely known.<sup id="cite_ref-333" class="reference"><a href="#cite_note-333">[322]</a></sup> Although still largely influenced by global trends (<a href="/wiki/Literary_modernism" title="Literary modernism">modernism</a>) and events (the Great Depression), writers in the 1930s began to develop stories increasingly focused on their experiences in New Zealand. During this period literature changed from a <a href="/wiki/Journalism" title="Journalism">journalistic</a> activity to a more academic pursuit.<sup id="cite_ref-334" class="reference"><a href="#cite_note-334">[323]</a></sup> Participation in the world wars gave some New Zealand writers a new perspective on New Zealand culture and with the post-war expansion of universities local literature flourished.<sup id="cite_ref-335" class="reference"><a href="#cite_note-335">[324]</a></sup> Dunedin is a UNESCO <a href="/wiki/City_of_Literature" title="City of Literature">City of Literature</a>.<sup id="cite_ref-336" class="reference"><a href="#cite_note-336">[325]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Media_and_entertainment">Media and entertainment</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main articles: <a href="/wiki/Music_of_New_Zealand" title="Music of New Zealand">Music of New Zealand</a>, <a href="/wiki/Cinema_of_New_Zealand" title="Cinema of New Zealand">Cinema of New Zealand</a>, and <a href="/wiki/Media_of_New_Zealand" title="Media of New Zealand">Media of New Zealand</a>
+ </div>
+ <p>
+ New Zealand music has been influenced by <a href="/wiki/Blues" title="Blues">blues</a>, <a href="/wiki/Jazz" title="Jazz">jazz</a>, <a href="/wiki/Country_music" title="Country music">country</a>, <a href="/wiki/Rock_and_roll" title="Rock and roll">rock and roll</a> and <a href="/wiki/Hip_hop_music" title="Hip hop music">hip hop</a>, with many of these genres given a unique New Zealand interpretation.<sup id="cite_ref-music_337-0" class="reference"><a href="#cite_note-music-337">[326]</a></sup> Māori developed traditional chants and songs from their ancient Southeast Asian origins, and after centuries of isolation created a unique "monotonous" and "<a href="https://en.wiktionary.org/wiki/doleful" class="extiw" title="wikt:doleful">doleful</a>" sound.<sup id="cite_ref-338" class="reference"><a href="#cite_note-338">[327]</a></sup> Flutes and trumpets were used as musical instruments<sup id="cite_ref-339" class="reference"><a href="#cite_note-339">[328]</a></sup> or as signalling devices during war or special occasions.<sup id="cite_ref-340" class="reference"><a href="#cite_note-340">[329]</a></sup> Early settlers brought over their ethnic music, with <a href="/wiki/Brass_band" title="Brass band">brass bands</a> and <a href="/wiki/Choir" title="Choir">choral music</a> being popular, and musicians began touring New Zealand in the 1860s.<sup id="cite_ref-341" class="reference"><a href="#cite_note-341">[330]</a></sup><sup id="cite_ref-342" class="reference"><a href="#cite_note-342">[331]</a></sup> <a href="/wiki/Pipe_band" title="Pipe band">Pipe bands</a> became widespread during the early 20th century.<sup id="cite_ref-343" class="reference"><a href="#cite_note-343">[332]</a></sup> The New Zealand recording industry began to develop from 1940 onwards and many New Zealand musicians have obtained success in Britain and the United States.<sup id="cite_ref-music_337-1" class="reference"><a href="#cite_note-music-337">[326]</a></sup> Some artists release Māori language songs and the Māori tradition-based art of <i><a href="/wiki/Kapa_haka" title="Kapa haka">kapa haka</a></i> (song and dance) has made a resurgence.<sup id="cite_ref-344" class="reference"><a href="#cite_note-344">[333]</a></sup> The <a href="/wiki/New_Zealand_Music_Awards" title="New Zealand Music Awards">New Zealand Music Awards</a> are held annually by <a href="/wiki/Recorded_Music_NZ" title="Recorded Music NZ">Recorded Music NZ</a>; the awards were first held in 1965 by <a href="/wiki/Reckitt_%26_Colman" class="mw-redirect" title="Reckitt &amp; Colman">Reckitt &amp; Colman</a> as the <a href="/wiki/Loxene_Golden_Disc" title="Loxene Golden Disc">Loxene Golden Disc</a> awards.<sup id="cite_ref-345" class="reference"><a href="#cite_note-345">[334]</a></sup> Recorded Music NZ also publishes the country's <a href="/wiki/Official_New_Zealand_Music_Chart" title="Official New Zealand Music Chart">official weekly record charts</a>.<sup id="cite_ref-346" class="reference"><a href="#cite_note-346">[335]</a></sup>
+ </p>
+ <div class="thumb tleft">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Hobbit_holes_reflected_in_water.jpg" class="image"><img alt="Hills with inset, round doors. Reflected in water." src="//upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/220px-Hobbit_holes_reflected_in_water.jpg" decoding="async" width="220" height="147" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/330px-Hobbit_holes_reflected_in_water.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/89/Hobbit_holes_reflected_in_water.jpg/440px-Hobbit_holes_reflected_in_water.jpg 2x" data-file-width="5184" data-file-height="3456" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Hobbit_holes_reflected_in_water.jpg" class="internal" title="Enlarge"></a>
+ </div>The <a href="/wiki/Hobbiton_Movie_Set" title="Hobbiton Movie Set">Hobbiton Movie Set</a>, located near <a href="/wiki/Matamata" title="Matamata">Matamata</a>, was used for <i>The Lord of the Rings</i> film trilogy.<sup id="cite_ref-347" class="reference"><a href="#cite_note-347">[336]</a></sup>
+ </div>
+ </div>
+ </div>
+ <p>
+ Public <a href="/wiki/Radio_in_New_Zealand" title="Radio in New Zealand">radio</a> was introduced in New Zealand in 1922.<sup id="cite_ref-348" class="reference"><a href="#cite_note-348">[337]</a></sup> A state-owned <a href="/wiki/Television_in_New_Zealand" title="Television in New Zealand">television service</a> began in 1960.<sup id="cite_ref-349" class="reference"><a href="#cite_note-349">[338]</a></sup> Deregulation in the 1980s saw a sudden increase in the numbers of radio and television stations.<sup id="cite_ref-NZ_TV_350-0" class="reference"><a href="#cite_note-NZ_TV-350">[339]</a></sup> New Zealand television primarily broadcasts American and British programming, along with a large number of Australian and local shows.<sup id="cite_ref-351" class="reference"><a href="#cite_note-351">[340]</a></sup> The number of <a href="/wiki/List_of_New_Zealand_films" title="List of New Zealand films">New Zealand films</a> significantly increased during the 1970s. In 1978 the <a href="/wiki/New_Zealand_Film_Commission" title="New Zealand Film Commission">New Zealand Film Commission</a> started assisting local film-makers and many films attained a world audience, some receiving international acknowledgement.<sup id="cite_ref-NZ_TV_350-1" class="reference"><a href="#cite_note-NZ_TV-350">[339]</a></sup> The highest-grossing New Zealand films are <i><a href="/wiki/Hunt_for_the_Wilderpeople" title="Hunt for the Wilderpeople">Hunt for the Wilderpeople</a></i>, <i><a href="/wiki/Boy_(2010_film)" title="Boy (2010 film)">Boy</a></i>, <i><a href="/wiki/The_World%27s_Fastest_Indian" title="The World's Fastest Indian">The World's Fastest Indian</a></i>, <i><a href="/wiki/Once_Were_Warriors_(film)" title="Once Were Warriors (film)">Once Were Warriors</a></i> and <i><a href="/wiki/Whale_Rider" title="Whale Rider">Whale Rider</a></i>.<sup id="cite_ref-352" class="reference"><a href="#cite_note-352">[341]</a></sup> The country's diverse scenery and compact size, plus government incentives,<sup id="cite_ref-353" class="reference"><a href="#cite_note-353">[342]</a></sup> have encouraged some <a href="/wiki/Film_producer" title="Film producer">producers</a> to shoot big-budget productions in New Zealand, including <i><a href="/wiki/Avatar_(2009_film)" title="Avatar (2009 film)">Avatar</a></i>, <i><a href="/wiki/The_Lord_of_the_Rings_(film_series)" title="The Lord of the Rings (film series)">The Lord of the Rings</a></i>, <i><a href="/wiki/The_Hobbit_(film_series)" title="The Hobbit (film series)">The Hobbit</a></i>, <i><a href="/wiki/The_Chronicles_of_Narnia_(film_series)" title="The Chronicles of Narnia (film series)">The Chronicles of Narnia</a></i>, <i><a href="/wiki/King_Kong_(2005_film)" title="King Kong (2005 film)">King Kong</a></i> and <i><a href="/wiki/The_Last_Samurai" title="The Last Samurai">The Last Samurai</a></i>.<sup id="cite_ref-354" class="reference"><a href="#cite_note-354">[343]</a></sup> The New Zealand media industry is dominated by a small number of companies, most of which are foreign-owned, although the <a href="/wiki/Crown_entity" title="Crown entity">state retains ownership</a> of some television and radio stations.<sup id="cite_ref-355" class="reference"><a href="#cite_note-355">[344]</a></sup> Since 1994, <a href="/wiki/Freedom_House" title="Freedom House">Freedom House</a> has consistently ranked New Zealand's press freedom in the top twenty, with the 19th freest media in 2015<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;action=edit">[update]</a></sup>.<sup id="cite_ref-356" class="reference"><a href="#cite_note-356">[345]</a></sup>
+ </p>
+ <div style="clear:both;"></div>
+ <h3>
+ <span class="mw-headline" id="Sports">Sports</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Sport_in_New_Zealand" title="Sport in New Zealand">Sport in New Zealand</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Haka_2006.jpg" class="image"><img alt="Rugby team wearing all black, facing the camera, knees bent, and facing toward a team wearing white" src="//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/220px-Haka_2006.jpg" decoding="async" width="220" height="146" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/330px-Haka_2006.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Haka_2006.jpg/440px-Haka_2006.jpg 2x" data-file-width="3008" data-file-height="2000" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Haka_2006.jpg" class="internal" title="Enlarge"></a>
+ </div>A <a href="/wiki/Haka_(sports)" title="Haka (sports)">haka</a> performed by the <a href="/wiki/New_Zealand_national_rugby_union_team" title="New Zealand national rugby union team">national rugby union team</a> before a game. The haka is a challenge with vigorous movements and stamping of the feet.
+ </div>
+ </div>
+ </div>
+ <p>
+ Most of the major sporting codes played in New Zealand have British origins.<sup id="cite_ref-357" class="reference"><a href="#cite_note-357">[346]</a></sup> <a href="/wiki/Rugby_union" title="Rugby union">Rugby union</a> is considered the <a href="/wiki/National_sport" title="National sport">national sport</a><sup id="cite_ref-358" class="reference"><a href="#cite_note-358">[347]</a></sup> and attracts the most spectators.<sup id="cite_ref-Organised_Sport_359-0" class="reference"><a href="#cite_note-Organised_Sport-359">[348]</a></sup> <a href="/wiki/Golf" title="Golf">Golf</a>, <a href="/wiki/Netball" title="Netball">netball</a>, <a href="/wiki/Tennis" title="Tennis">tennis</a> and <a href="/wiki/Cricket" title="Cricket">cricket</a> have the highest rates of adult participation, while netball, rugby union and <a href="/wiki/Association_football" title="Association football">football (soccer)</a> are particularly popular among young people.<sup id="cite_ref-Organised_Sport_359-1" class="reference"><a href="#cite_note-Organised_Sport-359">[348]</a></sup><sup id="cite_ref-nzsssc_360-0" class="reference"><a href="#cite_note-nzsssc-360">[349]</a></sup> Around 54% of New Zealand adolescents participate in sports for their school.<sup id="cite_ref-nzsssc_360-1" class="reference"><a href="#cite_note-nzsssc-360">[349]</a></sup> Victorious rugby tours to Australia and the United Kingdom in the <a href="/wiki/1888%E2%80%9389_New_Zealand_Native_football_team" title="1888–89 New Zealand Native football team">late 1880s</a> and the <a href="/wiki/The_Original_All_Blacks" title="The Original All Blacks">early 1900s</a> played an early role in instilling a national identity.<sup id="cite_ref-361" class="reference"><a href="#cite_note-361">[350]</a></sup> <a href="/wiki/Horseracing_in_New_Zealand" class="mw-redirect" title="Horseracing in New Zealand">Horseracing</a> was also a popular <a href="/wiki/Spectator_sport" title="Spectator sport">spectator sport</a> and became part of the "Rugby, Racing and Beer" culture during the 1960s.<sup id="cite_ref-362" class="reference"><a href="#cite_note-362">[351]</a></sup> Māori participation in European sports was particularly evident in rugby and the country's team performs a <a href="/wiki/Haka_(sports)" title="Haka (sports)">haka</a>, a traditional Māori challenge, before international matches.<sup id="cite_ref-363" class="reference"><a href="#cite_note-363">[352]</a></sup> New Zealand is known for its <a href="/wiki/Extreme_sport" title="Extreme sport">extreme sports</a>, <a href="/wiki/Adventure_travel" title="Adventure travel">adventure tourism</a><sup id="cite_ref-FOOTNOTEBain200669_364-0" class="reference"><a href="#cite_note-FOOTNOTEBain200669-364">[353]</a></sup> and strong <a href="/wiki/Mountaineering" title="Mountaineering">mountaineering</a> tradition, as seen in the success of notable New Zealander <a href="/wiki/Edmund_Hillary" title="Edmund Hillary">Sir Edmund Hillary</a>.<sup id="cite_ref-365" class="reference"><a href="#cite_note-365">[354]</a></sup><sup id="cite_ref-366" class="reference"><a href="#cite_note-366">[355]</a></sup> Other outdoor pursuits such as <a href="/wiki/Cycling_in_New_Zealand" title="Cycling in New Zealand">cycling</a>, fishing, swimming, running, <a href="/wiki/Tramping_in_New_Zealand" title="Tramping in New Zealand">tramping</a>, canoeing, hunting, snowsports, surfing and sailing are also popular.<sup id="cite_ref-SportsParticipation_367-0" class="reference"><a href="#cite_note-SportsParticipation-367">[356]</a></sup> The Polynesian sport of <a href="/wiki/Waka_ama" class="mw-redirect" title="Waka ama">waka ama</a> racing has experienced a resurgence of interest in New Zealand since the 1980s.<sup id="cite_ref-368" class="reference"><a href="#cite_note-368">[357]</a></sup>
+ </p>
+ <p>
+ New Zealand has competitive international teams in <a href="/wiki/New_Zealand_national_rugby_union_team" title="New Zealand national rugby union team">rugby union</a>, <a href="/wiki/New_Zealand_national_rugby_league_team" title="New Zealand national rugby league team">rugby league</a>, <a href="/wiki/New_Zealand_national_netball_team" title="New Zealand national netball team">netball</a>, <a href="/wiki/New_Zealand_national_cricket_team" title="New Zealand national cricket team">cricket</a>, <a href="/wiki/New_Zealand_men%27s_national_softball_team" title="New Zealand men's national softball team">softball</a>, and <a href="/wiki/Team_New_Zealand" title="Team New Zealand">sailing</a>. New Zealand participated at the <a href="/wiki/Summer_Olympics" class="mw-redirect" title="Summer Olympics">Summer Olympics</a> in 1908 and 1912 as <a href="/wiki/Australasia_at_the_Olympics" title="Australasia at the Olympics">a joint team with Australia</a>, before first participating <a href="/wiki/New_Zealand_at_the_Olympics" title="New Zealand at the Olympics">on its own</a> in 1920.<sup id="cite_ref-369" class="reference"><a href="#cite_note-369">[358]</a></sup> The country has ranked highly on a medals-to-population ratio at recent Games.<sup id="cite_ref-370" class="reference"><a href="#cite_note-370">[359]</a></sup><sup id="cite_ref-371" class="reference"><a href="#cite_note-371">[360]</a></sup> The "All Blacks", the national rugby union team, are the most successful in the history of international rugby<sup id="cite_ref-372" class="reference"><a href="#cite_note-372">[361]</a></sup> and the reigning <a href="/wiki/Rugby_World_Cup" title="Rugby World Cup">World Cup</a> champions.<sup id="cite_ref-373" class="reference"><a href="#cite_note-373">[362]</a></sup>
+ </p>
+ <h3>
+ <span class="mw-headline" id="Cuisine">Cuisine</span>
+ </h3>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/New_Zealand_cuisine" title="New Zealand cuisine">New Zealand cuisine</a>
+ </div>
+ <div class="thumb tright">
+ <div class="thumbinner" style="width:222px;">
+ <a href="/wiki/File:Hangi_ingredients.jpg" class="image"><img alt="Raw meat and vegetables" src="//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/220px-Hangi_ingredients.jpg" decoding="async" width="220" height="123" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/330px-Hangi_ingredients.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/9/91/Hangi_ingredients.jpg/440px-Hangi_ingredients.jpg 2x" data-file-width="3264" data-file-height="1832" /></a>
+ <div class="thumbcaption">
+ <div class="magnify">
+ <a href="/wiki/File:Hangi_ingredients.jpg" class="internal" title="Enlarge"></a>
+ </div>Ingredients to be prepared for a <a href="/wiki/H%C4%81ngi" title="Hāngi">hāngi</a>
+ </div>
+ </div>
+ </div>
+ <p>
+ The national cuisine has been described as <a href="/wiki/Pacific_Rim" title="Pacific Rim">Pacific Rim</a>, incorporating the native <a href="/wiki/M%C4%81ori_cuisine" class="mw-redirect" title="Māori cuisine">Māori cuisine</a> and diverse culinary traditions introduced by settlers and immigrants from Europe, Polynesia and Asia.<sup id="cite_ref-cuisine_374-0" class="reference"><a href="#cite_note-cuisine-374">[363]</a></sup> New Zealand yields produce from land and sea—most crops and livestock, such as maize, potatoes and pigs, were gradually introduced by the early European settlers.<sup id="cite_ref-375" class="reference"><a href="#cite_note-375">[364]</a></sup> Distinctive ingredients or dishes include <a href="/wiki/Lamb_and_mutton" title="Lamb and mutton">lamb</a>, salmon, <a href="/wiki/K%C5%8Dura" class="mw-redirect" title="Kōura">kōura</a> (crayfish),<sup id="cite_ref-376" class="reference"><a href="#cite_note-376">[365]</a></sup> <a href="/wiki/Dredge_oyster" title="Dredge oyster">dredge oysters</a>, <a href="/wiki/Whitebait" title="Whitebait">whitebait</a>, <a href="/wiki/P%C4%81ua" title="Pāua">pāua</a> (abalone), mussels, scallops, <a href="/wiki/Paphies_australis" title="Paphies australis">pipis</a> and <a href="/wiki/Tuatua" title="Tuatua">tuatua</a> (both are types of New Zealand shellfish),<sup id="cite_ref-377" class="reference"><a href="#cite_note-377">[366]</a></sup> <a href="/wiki/K%C5%ABmara" class="mw-redirect" title="Kūmara">kūmara</a> (sweet potato), <a href="/wiki/Kiwifruit" title="Kiwifruit">kiwifruit</a>, <a href="/wiki/Tamarillo" title="Tamarillo">tamarillo</a> and <a href="/wiki/Pavlova_(food)" class="mw-redirect" title="Pavlova (food)">pavlova</a> (considered a national dish).<sup id="cite_ref-378" class="reference"><a href="#cite_note-378">[367]</a></sup><sup id="cite_ref-cuisine_374-1" class="reference"><a href="#cite_note-cuisine-374">[363]</a></sup> A <a href="/wiki/H%C4%81ngi" title="Hāngi">hāngi</a> is a traditional Māori method of cooking food using heated rocks buried in a pit oven. After European colonisation, Māori began cooking with pots and ovens and the hāngi was used less frequently, although it is still used for formal occasions such as <a href="/wiki/Tangihanga" title="Tangihanga">tangihanga</a>.<sup id="cite_ref-379" class="reference"><a href="#cite_note-379">[368]</a></sup>
+ </p>
+ <div style="clear:both;"></div>
+ <h2>
+ <span class="mw-headline" id="See_also">See also</span>
+ </h2>
+ <div role="navigation" aria-label="Portals" class="noprint portal plainlist tright" style="margin:0.5em 0 0.5em 1em;border:solid #aaa 1px">
+ <ul style="display:table;box-sizing:border-box;padding:0.1em;max-width:175px;background:#f9f9f9;font-size:85%;line-height:110%;font-style:italic;font-weight:bold">
+ <li style="display:table-row">
+ <span style="display:table-cell;padding:0.2em;vertical-align:middle;text-align:center"><img alt="flag" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/32px-Flag_of_New_Zealand.svg.png" decoding="async" width="32" height="16" class="noviewer thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/48px-Flag_of_New_Zealand.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/64px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600" /></span><span style="display:table-cell;padding:0.2em 0.2em 0.2em 0.3em;vertical-align:middle"><a href="/wiki/Portal:New_Zealand" title="Portal:New Zealand">New Zealand portal</a></span>
+ </li>
+ <li style="display:table-row">
+ <span style="display:table-cell;padding:0.2em;vertical-align:middle;text-align:center"><a href="/wiki/File:%E5%A4%A7%E6%B4%8B.png" class="image"><img alt="icon" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/%E5%A4%A7%E6%B4%8B.png/32px-%E5%A4%A7%E6%B4%8B.png" decoding="async" width="32" height="26" class="noviewer" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/%E5%A4%A7%E6%B4%8B.png/48px-%E5%A4%A7%E6%B4%8B.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/7b/%E5%A4%A7%E6%B4%8B.png/64px-%E5%A4%A7%E6%B4%8B.png 2x" data-file-width="756" data-file-height="617" /></a></span><span style="display:table-cell;padding:0.2em 0.2em 0.2em 0.3em;vertical-align:middle"><a href="/wiki/Portal:Oceania" title="Portal:Oceania">Oceania portal</a></span>
+ </li>
+ </ul>
+ </div>
+ <ul>
+ <li>
+ <a href="/wiki/Outline_of_New_Zealand" title="Outline of New Zealand">Outline of New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_New_Zealand-related_topics" title="List of New Zealand-related topics">List of New Zealand-related topics</a>
+ </li>
+ </ul>
+ <div style="clear:both;"></div>
+ <h2>
+ <span class="mw-headline" id="Footnotes">Footnotes</span>
+ </h2>
+ <div class="reflist columns references-column-width" style="-moz-column-width: 30em; -webkit-column-width: 30em; column-width: 30em; list-style-type: decimal;">
+ <ol class="references">
+ <li id="cite_note-2">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">"God Save the Queen" is officially a national anthem but is generally used only on regal and viceregal occasions.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup></span>
+ </li>
+ <li id="cite_note-4">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text">English is a <i>de facto</i> official language due to its widespread use.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">[2]</a></sup></span>
+ </li>
+ <li id="cite_note-ethnicity-6">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-ethnicity_6-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-ethnicity_6-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">Ethnicity figures add to more than 100% as people could choose more than one ethnic group.</span>
+ </li>
+ <li id="cite_note-8">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text">The proportion of New Zealand's area (excluding estuaries) covered by rivers, lakes and ponds, based on figures from the New Zealand Land Cover Database,<sup id="cite_ref-7" class="reference"><a href="#cite_note-7">[4]</a></sup> is (357526 + 81936) / (26821559 – 92499–26033 – 19216) = 1.6%. If estuarine open water, mangroves, and herbaceous saline vegetation are included, the figure is 2.2%.</span>
+ </li>
+ <li id="cite_note-13">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text">The Chatham Islands have a <a href="/wiki/Chatham_Standard_Time_Zone" title="Chatham Standard Time Zone">separate time zone</a>, 45 minutes ahead of the rest of New Zealand.</span>
+ </li>
+ <li id="cite_note-15">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text">Clocks are advanced by an hour from the last Sunday in September until the first Sunday in April.<sup id="cite_ref-14" class="reference"><a href="#cite_note-14">[9]</a></sup> Daylight saving time is also observed in the Chatham Islands, 45 minutes ahead of NZDT.</span>
+ </li>
+ <li id="cite_note-144">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-144">^</a></b></span> <span class="reference-text">A person born on or after 1 January 2006 acquires New Zealand citizenship at birth only if at least one parent is a New Zealand citizen or permanent resident. People born on or before 31 December 2005 acquired citizenship at birth (<i><a href="/wiki/Jus_soli" title="Jus soli">jus soli</a></i>).<sup id="cite_ref-143" class="reference"><a href="#cite_note-143">[137]</a></sup></span>
+ </li>
+ <li id="cite_note-254">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-254">^</a></b></span> <span class="reference-text">The population is increasing at a rate of 1.4–2.0% per year and is projected to rise to 5.01–5.51 million in 2025.<sup id="cite_ref-253" class="reference"><a href="#cite_note-253">[246]</a></sup></span>
+ </li>
+ <li id="cite_note-286">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-286">^</a></b></span> <span class="reference-text">In 2015, 55% of Māori adults (aged 15 years and over) reported knowledge of <i>te reo Māori</i>. Of these speakers, 64% use Māori at home and 50,000 can speak the language "very well" or "well".<sup id="cite_ref-tereoMaori_285-0" class="reference"><a href="#cite_note-tereoMaori-285">[277]</a></sup></span>
+ </li>
+ <li id="cite_note-289">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-289">^</a></b></span> <span class="reference-text">Of the 86,403 people that replied they spoke Samoan, 51,336 lived in the Auckland Region.</span>
+ </li>
+ <li id="cite_note-293">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-293">^</a></b></span> <span class="reference-text">Religion percentages may not add to 100% as people could claim multiple religions or object to answering the question.</span>
+ </li>
+ </ol>
+ </div>
+ <h2>
+ <span class="mw-headline" id="Citations">Citations</span>
+ </h2>
+ <div class="reflist columns references-column-width" style="-moz-column-width: 30em; -webkit-column-width: 30em; column-width: 30em; list-style-type: decimal;">
+ <ol class="references">
+ <li id="cite_note-1">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mch.govt.nz/nz-identity-heritage/national-anthems/protocols">"Protocol for using New Zealand's National Anthems"</a>. <a href="/wiki/Ministry_for_Culture_and_Heritage" title="Ministry for Culture and Heritage">Ministry for Culture and Heritage</a><span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2008</span>.</cite></span>
+ </li>
+ <li id="cite_note-3">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation report">New Zealand Government (21 December 2007). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20150124193521/http://mfat.govt.nz/downloads/humanrights/5th-ICCPR-report.pdf">International Covenant on Civil and Political Rights Fifth Periodic Report of the Government of New Zealand</a> <span class="cs1-format">(PDF)</span> (Report). p.&#160;89. Archived from <a rel="nofollow" class="external text" href="http://www.mfat.govt.nz/downloads/humanrights/5th-ICCPR-report.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 24 January 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">18 November</span> 2015</span>. <q>In addition to the Māori language, New Zealand Sign Language is also an official language of New Zealand. The New Zealand Sign Language Act 2006 permits the use of NZSL in legal proceedings, facilitates competency standards for its interpretation and guides government departments in its promotion and use. English, the medium for teaching and learning in most schools, is a de facto official language by virtue of its widespread use. For these reasons, these three languages have special mention in the New Zealand Curriculum.</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Census2018_pdc-5">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-Census2018_pdc_5-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.stats.govt.nz/information-releases/2018-census-population-and-dwelling-counts">"2018 Census population and dwelling counts"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">26 September</span> 2019</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-7">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mfe.govt.nz/issues/land/land-cover-dbase/index.html">"The New Zealand Land Cover Database"</a>. <i>New Zealand Land Cover Database 2</i>. <a href="/wiki/Ministry_for_the_Environment_(New_Zealand)" title="Ministry for the Environment (New Zealand)">Ministry for the Environment</a>. 1 July 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-populationestimate-9">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-populationestimate_9-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-populationestimate_9-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/tools_and_services/population_clock.aspx">"Population clock"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">14 April</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />The population estimate shown is automatically calculated daily at 00:00 UTC and is based on data obtained from the population clock on the date shown in the citation.
+ </li>
+ <li id="cite_note-imf2-10">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-imf2_10-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-imf2_10-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-imf2_10-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-imf2_10-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-imf2_10-4"><sup><i><b>e</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.imf.org/external/pubs/ft/weo/2018/02/weodata/weorept.aspx?sy=2018&amp;ey=2023&amp;scsm=1&amp;ssd=1&amp;sort=country&amp;ds=.&amp;br=1&amp;pr1.x=45&amp;pr1.y=1&amp;c=196&amp;s=NGDPD%2CPPPGDP%2CNGDPDPC%2CPPPPC&amp;grp=0&amp;a=">"New Zealand"</a>. International Monetary Fund<span class="reference-accessdate">. Retrieved <span class="nowrap">9 October</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-11">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/snapshots-of-nz/nz-social-indicators/Home/Standard%20of%20living/income-inequality.aspx#anchor26">"Income inequality"</a>. Statistics New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">14 June</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-HDI-12">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-HDI_12-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-HDI_12-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://hdr.undp.org/sites/default/files/2018_human_development_statistical_update.pdf">"Human Development Report 2018"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Human_Development_Report" title="Human Development Report">HDRO (Human Development Report Office)</a> <a href="/wiki/United_Nations_Development_Programme" title="United Nations Development Programme">United Nations Development Programme</a>. p.&#160;22<span class="reference-accessdate">. Retrieved <span class="nowrap">14 September</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-14">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/regulation/public/2007/0185/latest/whole.html">"New Zealand Daylight Time Order 2007 (SR 2007/185)"</a>. New Zealand Parliamentary Counsel Office. 6 July 2007<span class="reference-accessdate">. Retrieved <span class="nowrap">6 March</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-16">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text">There is no official all-numeric date format for New Zealand, but government recommendations generally follow <a href="/wiki/Date_and_time_notation_in_Australia" title="Date and time notation in Australia">Australian date and time notation</a>. See <cite class="citation"><a rel="nofollow" class="external text" href="https://www.govt.nz/about/about-this-website/style-and-design/the-govt-nz-style-guide/">"The Govt.nz style guide"</a>, <i>New Zealand Government</i>, 9 December 2016<span class="reference-accessdate">, retrieved <span class="nowrap">7 March</span> 2019</span></cite> <span class="cs1-visible-error error citation-comment">Italic or bold markup not allowed in: <code class="cs1-code">|website=</code> (<a href="/wiki/Help:CS1_errors#apostrophe_markup" title="Help:CS1 errors">help</a>)</span></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />.
+ </li>
+ <li id="cite_note-17">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><cite class="citation web">Tasman, Abel. <a rel="nofollow" class="external text" href="http://gutenberg.net.au/ebooks06/0600611.txt">"JOURNAL or DESCRIPTION By me <i>Abel Jansz Tasman</i>, Of a Voyage from <i>Batavia</i> for making Discoveries of the <i>Unknown South Land</i> in the year 1642"</a>. Project Gutenberg Australia<span class="reference-accessdate">. Retrieved <span class="nowrap">26 March</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-18">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-18">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/european-discovery-of-new-zealand/3">"European discovery of New Zealand – Tasman's achievement"</a>. <i><a href="/wiki/Te_Ara:_The_Encyclopedia_of_New_Zealand" title="Te Ara: The Encyclopedia of New Zealand">Te Ara: The Encyclopedia of New Zealand</a></i><span class="reference-accessdate">. Retrieved <span class="nowrap">24 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-19">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-19">^</a></b></span> <span class="reference-text"><cite class="citation web">John Bathgate. <a rel="nofollow" class="external text" href="http://nzetc.victoria.ac.nz//tm/scholarly/tei-Stout44-t2-body-d1-d1.html">"The Pamphlet Collection of Sir Robert Stout:Volume 44. Chapter 1, Discovery and Settlement"</a>. NZETC<span class="reference-accessdate">. Retrieved <span class="nowrap">17 August</span> 2018</span>. <q>He named the country Staaten Land, in honour of the States-General of Holland, in the belief that it was part of the great southern continent.</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-20">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-20">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (September 2007). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/european-discovery-of-new-zealand/3">"Tasman's achievement"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">16 February</span> 2008</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-21">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-21">^</a></b></span> <span class="reference-text"><cite class="citation book">Mackay, Duncan (1986). "The Search For The Southern Land". In Fraser, B (ed.). <i>The New Zealand Book Of Events</i>. Auckland: <a href="/wiki/Methuen_Publishing" title="Methuen Publishing">Reed Methuen</a>. pp.&#160;52–54.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZ_name-22">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-NZ_name_22-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_name_22-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia"><a href="/wiki/Malcolm_McKinnon" title="Malcolm McKinnon">McKinnon, Malcolm</a> (November 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/place-names/1">"Place names – Naming the country and the main islands"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">24 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEKing200341-23">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEKing200341_23-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFKing2003">King 2003</a>, p.&#160;41.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEHayMaclaganGordon200872-24">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEHayMaclaganGordon200872_24-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFHayMaclaganGordon2008">Hay, Maclagan &amp; Gordon 2008</a>, p.&#160;72.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEMein_Smith20056-25">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTEMein_Smith20056_25-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTEMein_Smith20056_25-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFMein_Smith2005">Mein Smith 2005</a>, p.&#160;6.</span>
+ </li>
+ <li id="cite_note-26">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-26">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/Thomas_Brunner" title="Thomas Brunner">Brunner, Thomas</a> (1851). <a rel="nofollow" class="external text" href="http://www.nzetc.org/tm/scholarly/BruJour-fig-BruJour_P001a.html"><i>The Great Journey: an expedition to explore the interior of the Middle Island, New Zealand, 1846-8</i></a>. <a href="/wiki/Royal_Geographical_Society" title="Royal Geographical Society">Royal Geographical Society</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Williamson2013-27">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Williamson2013_27-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Williamson2013_27-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation pressrelease">Williamson, Maurice (10 October 2013). <a rel="nofollow" class="external text" href="https://www.beehive.govt.nz/release/names-nz%E2%80%99s-two-main-islands-formalised">"Names of NZ's two main islands formalised"</a> (Press release). New Zealand Government<span class="reference-accessdate">. Retrieved <span class="nowrap">1 May</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-28">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-28">^</a></b></span> <span class="reference-text"><cite class="citation journal">Wilmshurst, J. M.; Hunt, T. L.; Lipo, C. P.; Anderson, A. J. (2010). <a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC3033267">"High-precision radiocarbon dating shows recent and rapid initial human colonization of East Polynesia"</a>. <i>Proceedings of the National Academy of Sciences</i>. <b>108</b> (5): 1815. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/2011PNAS..108.1815W">2011PNAS..108.1815W</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1073%2Fpnas.1015876108">10.1073/pnas.1015876108</a>. <a href="/wiki/PubMed_Central" title="PubMed Central">PMC</a>&#160;<span class="cs1-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC3033267">3033267</a></span>. <a href="/wiki/PubMed_Identifier" class="mw-redirect" title="PubMed Identifier">PMID</a>&#160;<a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pubmed/21187404">21187404</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-29">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-29">^</a></b></span> <span class="reference-text"><cite class="citation journal">McGlone, M.; Wilmshurst, J. M. (1999). "Dating initial Maori environmental impact in New Zealand". <i>Quaternary International</i>. <b>59</b>: 5–16. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/1999QuInt..59....5M">1999QuInt..59....5M</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1016%2FS1040-6182%2898%2900067-6">10.1016/S1040-6182(98)00067-6</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-30">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-30">^</a></b></span> <span class="reference-text"><cite class="citation journal">Murray-McIntosh, Rosalind P.; Scrimshaw, Brian J.; Hatfield, Peter J.; Penny, David (1998). <a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC21200">"Testing migration patterns and estimating founding population size in Polynesia by using human mtDNA sequences"</a>. <i><a href="/wiki/Proceedings_of_the_National_Academy_of_Sciences_of_the_United_States_of_America" title="Proceedings of the National Academy of Sciences of the United States of America">Proceedings of the National Academy of Sciences of the United States of America</a></i>. <b>95</b> (15): 9047–52. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/1998PNAS...95.9047M">1998PNAS...95.9047M</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1073%2Fpnas.95.15.9047">10.1073/pnas.95.15.9047</a>. <a href="/wiki/PubMed_Central" title="PubMed Central">PMC</a>&#160;<span class="cs1-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC21200">21200</a></span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-31">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-31">^</a></b></span> <span class="reference-text"><cite class="citation journal">Wilmshurst, J. M.; Anderson, A. J.; Higham, T. F. G.; Worthy, T. H. (2008). <a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC2409139">"Dating the late prehistoric dispersal of Polynesians to New Zealand using the commensal Pacific rat"</a>. <i>Proceedings of the National Academy of Sciences</i>. <b>105</b> (22): 7676. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/2008PNAS..105.7676W">2008PNAS..105.7676W</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1073%2Fpnas.0801507105">10.1073/pnas.0801507105</a>. <a href="/wiki/PubMed_Central" title="PubMed Central">PMC</a>&#160;<span class="cs1-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC2409139">2409139</a></span>. <a href="/wiki/PubMed_Identifier" class="mw-redirect" title="PubMed Identifier">PMID</a>&#160;<a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pubmed/18523023">18523023</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-32">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-32">^</a></b></span> <span class="reference-text"><cite class="citation journal">Moodley, Y.; Linz, B.; Yamaoka, Y.; Windsor, H.M.; Breurec, S.; Wu, J.-Y.; Maady, A.; Bernhöft, S.; Thiberge, J.-M.; et al. (2009). <a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC2827536">"The Peopling of the Pacific from a Bacterial Perspective"</a>. <i>Science</i>. <b>323</b> (5913): 527–530. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/2009Sci...323..527M">2009Sci...323..527M</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1126%2Fscience.1166083">10.1126/science.1166083</a>. <a href="/wiki/PubMed_Central" title="PubMed Central">PMC</a>&#160;<span class="cs1-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC2827536">2827536</a></span>. <a href="/wiki/PubMed_Identifier" class="mw-redirect" title="PubMed Identifier">PMID</a>&#160;<a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pubmed/19164753">19164753</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-33">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-33">^</a></b></span> <span class="reference-text"><cite class="citation book">Ballara, Angela (1998). <i>Iwi: The Dynamics of Māori Tribal Organisation from c. 1769 to c. 1945</i> (1st ed.). Wellington: Victoria University Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9780864733283" title="Special:BookSources/9780864733283"><bdi>9780864733283</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-34">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-34">^</a></b></span> <span class="reference-text"><cite class="citation book">Clark, Ross (1994). "Moriori and Māori: The Linguistic Evidence". In Sutton, Douglas (ed.). <i>The Origins of the First New Zealanders</i>. Auckland: <a href="/wiki/Auckland_University_Press" title="Auckland University Press">Auckland University Press</a>. pp.&#160;123–135.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-35">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-35">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Davis, Denise (September 2007). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/moriori/4">"The impact of new arrivals"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-36">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-36">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Davis, Denise; Solomon, Māui (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/moriori/4">"<span class="cs1-kern-left">'</span>Moriori – The impact of new arrivals<span class="cs1-kern-right">'</span>"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">23 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEMein_Smith200523-37">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTEMein_Smith200523_37-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTEMein_Smith200523_37-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFMein_Smith2005">Mein Smith 2005</a>, p.&#160;23.</span>
+ </li>
+ <li id="cite_note-38">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-38">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/Anne_Salmond" title="Anne Salmond">Salmond, Anne</a>. <i>Two Worlds: First Meetings Between Maori and Europeans 1642–1772</i>. Auckland: <a href="/wiki/Penguin_Books" title="Penguin Books">Penguin Books</a>. p.&#160;82. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-670-83298-7" title="Special:BookSources/0-670-83298-7"><bdi>0-670-83298-7</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEKing2003122-39">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEKing2003122_39-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFKing2003">King 2003</a>, p.&#160;122.</span>
+ </li>
+ <li id="cite_note-40">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-40">^</a></b></span> <span class="reference-text"><cite class="citation journal">Fitzpatrick, John (2004). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110511142553/https://www.adelaide.edu.au/apsa/docs_papers/Others/Fitzpatrick.pdf">"Food, warfare and the impact of Atlantic capitalism in Aotearo/New Zealand"</a> <span class="cs1-format">(PDF)</span>. <i>Australasian Political Studies Association Conference: APSA 2004 Conference Papers</i>. Archived from <a rel="nofollow" class="external text" href="https://www.adelaide.edu.au/apsa/docs_papers/Others/Fitzpatrick.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 11 May 2011.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-41">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-41">^</a></b></span> <span class="reference-text"><cite class="citation book">Brailsford, Barry (1972). <i>Arrows of Plague</i>. Wellington: Hick Smith and Sons. p.&#160;35. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-456-01060-2" title="Special:BookSources/0-456-01060-2"><bdi>0-456-01060-2</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-42">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-42">^</a></b></span> <span class="reference-text"><cite class="citation book">Wagstrom, Thor (2005). "Broken Tongues and Foreign Hearts". In Brock, Peggy (ed.). <i>Indigenous Peoples and Religious Change</i>. Boston: Brill Academic Publishers. pp.&#160;71 and 73. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-90-04-13899-5" title="Special:BookSources/978-90-04-13899-5"><bdi>978-90-04-13899-5</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-43">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-43">^</a></b></span> <span class="reference-text"><cite class="citation book">Lange, Raeburn (1999). <i>May the people live: a history of Māori health development 1900–1920</i>. Auckland University Press. p.&#160;18. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-86940-214-3" title="Special:BookSources/978-1-86940-214-3"><bdi>978-1-86940-214-3</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-44">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-44">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20150228231623/http://www.heritageaustralia.com.au/articles/features/4576-a-nation-subdivided">"A Nation sub-divided"</a>. <i>Australian Heritage</i>. Heritage Australia Publishing. 2011. Archived from <a rel="nofollow" class="external text" href="http://www.heritageaustralia.com.au/articles/features/4576-a-nation-subdivided">the original</a> on 28 February 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">27 December</span> 2014</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Busby-45">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Busby_45-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Busby_45-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Rutherford, James (April 2009) [originally published in 1966]. <a href="/wiki/Alexander_Hare_McLintock" title="Alexander Hare McLintock">McLintock, Alexander</a> (ed.). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/1966/busby-james/1"><i>Busby, James</i></a>. <a href="/wiki/An_Encyclopaedia_of_New_Zealand" title="An Encyclopaedia of New Zealand">An Encyclopaedia of New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-46">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-46">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/gipps-sir-george/1"><i>Sir George Gipps</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Wilson2009-47">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Wilson2009_47-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2009_47-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/government-and-nation/1">"Government and nation – The origins of nationhood"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-48">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-48">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/1966/land-settlement/3"><i>Settlement from 1840 to 1852</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-49">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-49">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Foster, Bernard (April 2009) [originally published in 1966]. McLintock, Alexander (ed.). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/1966/akaroa-french-settlement-at/1"><i>Akaroa, French Settlement At</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-50">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-50">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Simpson, K (September 2010). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/biographies/1h29/1">"Hobson, William – Biography"</a>. In McLintock, Alexander (ed.). <i><a href="/wiki/Dictionary_of_New_Zealand_Biography" title="Dictionary of New Zealand Biography">Dictionary of New Zealand Biography</a></i>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-51">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-51">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (April 2010). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/history-of-immigration/3">"British immigration and the New Zealand Company"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-52">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-52">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/politics/history-of-the-governor-general/crown-colony-era">"Crown colony era – the Governor-General"</a>. Ministry for Culture and Heritage. March 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-53">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-53">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/new-zealands-19th-century-wars/introduction">"New Zealand's 19th-century wars – overview"</a>. Ministry for Culture and Heritage. April 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-G_and_N-54">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-G_and_N_54-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-G_and_N_54-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-G_and_N_54-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-G_and_N_54-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/nation-and-government">"Government and nation – The constitution"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />See pages 2 and 3.
+ </li>
+ <li id="cite_note-55">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-55">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/Philip_Temple" title="Philip Temple">Temple, Philip</a> (1980). <i>Wellington Yesterday</i>. John McIndoe. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-86868-012-5" title="Special:BookSources/0-86868-012-5"><bdi>0-86868-012-5</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-56">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-56">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://nzhistory.govt.nz/parliament-sits-for-the-first-time-in-wellington">"Parliament moves to Wellington"</a>. Ministry for Culture and Heritage. January 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">27 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Liberal-57">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Liberal_57-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Liberal_57-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/history/page-5">"History – Liberal to Labour"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">27 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-58">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-58">^</a></b></span> <span class="reference-text"><cite class="citation web">Hamer, David. <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/biographies/2s11">"Seddon, Richard John"</a>. <i><a href="/wiki/Dictionary_of_New_Zealand_Biography" title="Dictionary of New Zealand Biography">Dictionary of New Zealand Biography</a></i>. <a href="/wiki/Ministry_for_Culture_and_Heritage" title="Ministry for Culture and Heritage">Ministry for Culture and Heritage</a><span class="reference-accessdate">. Retrieved <span class="nowrap">27 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-59">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-59">^</a></b></span> <span class="reference-text"><cite class="citation journal">Boxall, Peter; Haynes, Peter (1997). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110511134417/http://www.gurn.info/en/topics/global-trade-union-strategies-union-renewal/organizational-innovation-and-change/industrial-relations-and-labour-regulations-affecting-unions2019-structure/strategy-and-trade-union-effectiveness-in-a-neo-liberal-environment">"Strategy and Trade Union Effectiveness in a Neo-liberal Environment"</a>. <i>British Journal of Industrial Relations</i>. <b>35</b> (4): 567–591. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1111%2F1467-8543.00069">10.1111/1467-8543.00069</a>. Archived from <a rel="nofollow" class="external text" href="http://www.gurn.info/en/topics/global-trade-union-strategies-union-renewal/organizational-innovation-and-change/industrial-relations-and-labour-regulations-affecting-unions2019-structure/strategy-and-trade-union-effectiveness-in-a-neo-liberal-environment">the original</a> <span class="cs1-format">(PDF)</span> on 11 May 2011.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-60">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-60">^</a></b></span> <span class="reference-text"><cite id="CITEREFGazette28058" class="citation magazine"><a rel="nofollow" class="external text" href="https://www.thegazette.co.uk/London/issue/28058/page/6149">"Proclamation"</a>. <i><a href="/wiki/The_London_Gazette" title="The London Gazette">The London Gazette</a></i>. No.&#160;28058. 10 September 1907. p.&#160;6149.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-61">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-61">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://nzhistory.govt.nz/culture/dominion-day/becoming-dominion">"Dominion status – Becoming a dominion"</a>. Ministry for Culture and Heritage. September 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-62">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-62">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war-and-society">"War and Society"</a>. Ministry for Culture and Heritage<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-63">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-63">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia"><a href="/wiki/Brian_Easton_(economist)" title="Brian Easton (economist)">Easton, Brian</a> (April 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/economic-history/7">"Economic history – Interwar years and the great depression"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-64">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-64">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Derby, Mark (May 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/strikes-and-labour-disputes/6">"Strikes and labour disputes – Wars, depression and first Labour government"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">1 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-65">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-65">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Easton, Brian (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/economic-history/9">"Economic history – Great boom, 1935–1966"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">1 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-66">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-66">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Keane, Basil (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/te-maori-i-te-ohanga-maori-in-the-economy/6">"Te Māori i te ohanga – Māori in the economy – Urbanisation"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-67">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-67">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Royal, Te Ahukaramū (March 2009). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/maori/5">"Māori – Urbanisation and renaissance"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">1 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-68">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-68">^</a></b></span> <span class="reference-text"><cite class="citation book"><a rel="nofollow" class="external text" href="https://www.govt.nz/assets/Documents/Red-Book-Healing-the-past-building-a-future.pdf"><i>Healing the past, building a future: A Guide to Treaty of Waitangi Claims and Negotiations with the Crown</i></a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Office_of_Treaty_Settlements" title="Office of Treaty Settlements">Office of Treaty Settlements</a>. March 2015. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-478-32436-5" title="Special:BookSources/978-0-478-32436-5"><bdi>978-0-478-32436-5</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-69">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-69">^</a></b></span> <span class="reference-text"><cite class="citation report"><a rel="nofollow" class="external text" href="https://forms.justice.govt.nz/search/WT/reports/reportSummary.html?reportId=wt_DOC_68000605">Report on the Crown's Foreshore and Seabed Policy</a> (Report). <a href="/wiki/Minister_of_Justice_(New_Zealand)" title="Minister of Justice (New Zealand)">Ministry of Justice</a><span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-70">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-70">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Barker, Fiona (June 2012). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/video/34605/debate-about-the-foreshore-and-seabed">"Debate about the foreshore and seabed"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-GG_constitution-71">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-GG_constitution_71-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-GG_constitution_71-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.gg.govt.nz/role/constofnz.htm">"New Zealand's Constitution"</a>. The Governor-General of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Economist_factsheet-72">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Economist_factsheet_72-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Economist_factsheet_72-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Economist_factsheet_72-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20060514204533/http://economist.com/countries/NewZealand/profile.cfm?folder=Profile-Political%20Forces">"Factsheet – New Zealand – Political Forces"</a>. <i><a href="/wiki/The_Economist" title="The Economist">The Economist</a></i>. <a href="/wiki/The_Economist_Group" class="mw-redirect" title="The Economist Group">The Economist Group</a>. 15 February 2005. Archived from <a rel="nofollow" class="external text" href="http://economist.com/countries/NewZealand/profile.cfm?folder=Profile-Political%20Forces">the original</a> on 14 May 2006<span class="reference-accessdate">. Retrieved <span class="nowrap">4 August</span> 2009</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-73">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-73">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1974/0001/latest/DLM411814.html">"Royal Titles Act 1974"</a>. New Zealand Parliamentary Counsel Office. February 1974. Section 1<span class="reference-accessdate">. Retrieved <span class="nowrap">8 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-74">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-74">^</a></b></span> <span class="reference-text"><cite class="citation journal"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1986/0114/latest/whole.html#DLM94210">"Constitution Act 1986"</a>. New Zealand Parliamentary Counsel Office. 1 January 1987. Section 2.1<span class="reference-accessdate">. Retrieved <span class="nowrap">15 July</span> 2018</span>. <q>The Sovereign in right of New Zealand is the head of State of New Zealand, and shall be known by the royal style and titles proclaimed from time to time.</q></cite> <span class="cs1-hidden-error error citation-comment">Cite journal requires <code class="cs1-code">|journal=</code> (<a href="/wiki/Help:CS1_errors#missing_periodical" title="Help:CS1 errors">help</a>)</span></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-75">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-75">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://gg.govt.nz/role">"The Role of the Governor-General"</a>. The Governor-General of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-76">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-76">^</a></b></span> <span class="reference-text"><cite class="citation journal">Harris, Bruce (2009). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110718005846/http://www.britannica.com/bps/additionalcontent/18/41876855/REPLACEMENT-OF-THE-ROYAL-PREROGATIVE-IN-NEW-ZEALAND">"Replacement of the Royal Prerogative in New Zealand"</a>. <i>New Zealand Universities Law Review</i>. <b>23</b>: 285–314. Archived from <a rel="nofollow" class="external text" href="http://www.britannica.com/bps/additionalcontent/18/41876855/REPLACEMENT-OF-THE-ROYAL-PREROGATIVE-IN-NEW-ZEALAND">the original</a> on 18 July 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">28 August</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-reserve_Powers-77">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-reserve_Powers_77-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-reserve_Powers_77-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.gg.govt.nz/role/powers.htm">"The Reserve Powers"</a>. The Governor-General of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">8 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-parliament_facts-78">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-parliament_facts_78-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-parliament_facts_78-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.parliament.nz/en/visit-and-learn/how-parliament-works/fact-sheets/pbrief7/">"Parliament Brief: What is Parliament?"</a>. New Zealand Parliament<span class="reference-accessdate">. Retrieved <span class="nowrap">30 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-79">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-79">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLean, Gavin (February 2015). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/premiers-and-prime-ministers">"Premiers and prime ministers"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">30 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-80">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-80">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/government-and-nation/4">"Government and nation – System of government"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-81">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-81">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.cabinetmanual.cabinetoffice.govt.nz/5.11">"Principles of Cabinet decision making"</a>. <i>Cabinet Manual</i>. Department of the Prime Minister and Cabinet. 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">1 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-82">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-82">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://cabinetmanual.cabinetoffice.govt.nz/6.2">"The electoral cycle"</a>. <i>Cabinet Manual</i>. Department of the Prime Minister and Cabinet. 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-road-83">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-road_83-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-road_83-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/politics/fpp-to-mmp/first-past-the-post">"First past the post – the road to MMP"</a>. Ministry for Culture and Heritage. September 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-84">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-84">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20111109013802/http://www.elections.org.nz/elections/electorates/reviewing-electorates.html">"Reviewing electorate numbers and boundaries"</a>. <a href="/wiki/Electoral_Commission_(New_Zealand)" title="Electoral Commission (New Zealand)">Electoral Commission</a>. 8 May 2005. Archived from <a rel="nofollow" class="external text" href="http://www.elections.org.nz/elections/electorates/reviewing-electorates.html">the original</a> on 9 November 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">7 July</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-85">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-85">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.elections.org.nz/voting-system/mmp-voting-system/sainte-lagu%C3%AB-allocation-formula">"Sainte-Laguë allocation formula"</a>. Electoral Commission. 4 February 2013<span class="reference-accessdate">. Retrieved <span class="nowrap">31 May</span> 2014</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-86">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-86">^</a></b></span> <span class="reference-text"><cite class="citation book">Paxton, Pamela; Hughes, Melanie M. (2015). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=lf4QCgAAQBAJ&amp;pg=PT107"><i>Women, Politics, and Power: A Global Perspective</i></a>. CQ Press. p.&#160;107. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-48-337701-8" title="Special:BookSources/978-1-48-337701-8"><bdi>978-1-48-337701-8</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">25 July</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-87">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-87">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=11936791">"Jacinda Ardern sworn in as new Prime Minister"</a>. <i>New Zealand Herald</i>. 26 October 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">26 October</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-88">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-88">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="https://www.stuff.co.nz/national/politics/86217670/female-political-leaders-have-been-smashing-glass-ceilings-for-ages">"Female political leaders have been smashing glass ceilings for ages"</a>. <i><a href="/wiki/Stuff.co.nz" title="Stuff.co.nz">Stuff.co.nz</a></i>. Fairfax NZ. 27 October 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">19 July</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-89">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-89">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.courtsofnz.govt.nz/about-the-judiciary/role-judges/role-chief">"Role of the Chief Justice"</a>. Courts of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">9 June</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-90">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-90">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.courtsofnz.govt.nz/about-the-judiciary/structure-of-the-court-system">"Structure of the court system"</a>. Courts of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">9 June</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-91">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-91">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101124005516/http://justice.govt.nz/courts/the-judiciary">"The Judiciary"</a>. <a href="/wiki/Minister_of_Justice_(New_Zealand)" title="Minister of Justice (New Zealand)">Ministry of Justice</a>. Archived from <a rel="nofollow" class="external text" href="http://www.justice.govt.nz/courts/the-judiciary">the original</a> on 24 November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-92">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-92">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170204213240/http://fsi.fundforpeace.org/rankings-2016">"The Fragile States Index 2016"</a>. The Fund for Peace. Archived from <a rel="nofollow" class="external text" href="http://fsi.fundforpeace.org/rankings-2016">the original</a> on 4 February 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">30 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-93">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-93">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://pages.eiu.com/rs/753-RIQ-438/images/Democracy_Index_2017.pdf">"Democracy Index 2017"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Economist_Intelligence_Unit" title="Economist Intelligence Unit">Economist Intelligence Unit</a>. 2018. p.&#160;5<span class="reference-accessdate">. Retrieved <span class="nowrap">9 December</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-94">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-94">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.transparency.org/news/feature/corruption_perceptions_index_2017">"Corruption Perceptions Index 2017"</a>. <a href="/wiki/Transparency_International" title="Transparency International">Transparency International</a>. 21 February 2018<span class="reference-accessdate">. Retrieved <span class="nowrap">9 December</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-95">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-95">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://2009-2017.state.gov/j/drl/rls/hrrpt/humanrightsreport/index.htm?year=2017&amp;dlid=277105">"New Zealand"</a>. <i>Country Reports on Human Rights Practices for 2017</i>. <a href="/wiki/United_States_Department_of_State" title="United States Department of State">United States Department of State</a><span class="reference-accessdate">. Retrieved <span class="nowrap">9 December</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-96">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-96">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.oecdbetterlifeindex.org/countries/new-zealand/">"New Zealand"</a>. OECD Better Life Index. 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">30 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-97">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-97">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/1966/history-constitutional/10"><i>External Relations</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-98">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-98">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/people/michael-joseph-savage-biography">"Michael Joseph Savage"</a>. Ministry for Culture and Heritage. July 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">29 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-99">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-99">^</a></b></span> <span class="reference-text"><cite class="citation web">Patman, Robert (2005). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20070925192858/http://www.victoria.ac.nz/css/docs/Working_Papers/WP21.pdf">"Globalisation, Sovereignty, and the Transformation of New Zealand Foreign Policy"</a> <span class="cs1-format">(PDF)</span>. <i>Working Paper 21/05</i>. Centre for Strategic Studies, Victoria University of Wellington. p.&#160;8. Archived from <a rel="nofollow" class="external text" href="http://www.victoria.ac.nz/css/docs/Working_Papers/WP21.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 25 September 2007<span class="reference-accessdate">. Retrieved <span class="nowrap">12 March</span> 2007</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-100">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-100">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110629153135/http://www.australianpolitics.com/foreign/anzus/anzus-treaty.shtml">"Department Of External Affairs: Security Treaty between Australia, New Zealand and the United States of America"</a>. <a href="/wiki/Government_of_Australia" title="Government of Australia">Australian Government</a>. September 1951. Archived from <a rel="nofollow" class="external text" href="http://www.australianpolitics.com/foreign/anzus/anzus-treaty.shtml">the original</a> on 29 June 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-101">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-101">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/vietnam-war">"The Vietnam War"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. June 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-102">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-102">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/politics/nuclear-free-new-zealand/rainbow-warrior">"Sinking the Rainbow Warrior – nuclear-free New Zealand"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. August 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-103">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-103">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/politics/nuclear-free-new-zealand/nuclear-free-zone">"Nuclear-free legislation – nuclear-free New Zealand"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. August 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-104">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-104">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/David_Lange" title="David Lange">Lange, David</a> (1990). <i>Nuclear Free: The New Zealand Way</i>. New Zealand: <a href="/wiki/Penguin_Books" title="Penguin Books">Penguin Books</a>. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-14-014519-2" title="Special:BookSources/0-14-014519-2"><bdi>0-14-014519-2</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-105">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-105">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101222174922/http://www.dfat.gov.au/aib/history.html">"Australia in brief"</a>. <a href="/wiki/Department_of_Foreign_Affairs_and_Trade_(Australia)" title="Department of Foreign Affairs and Trade (Australia)">Australian Department of Foreign Affairs and Trade</a>. Archived from <a rel="nofollow" class="external text" href="http://www.dfat.gov.au/aib/history.html">the original</a> on 22 December 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZ_in_brief-106">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-NZ_in_brief_106-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_in_brief_106-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.dfat.gov.au/geo/new_zealand/nz_country_brief.html">"New Zealand country brief"</a>. Australian Department of Foreign Affairs and Trade<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-107">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-107">^</a></b></span> <span class="reference-text"><cite class="citation news">Collett, John (4 September 2013). <a rel="nofollow" class="external text" href="http://www.smh.com.au/money/super-and-funds/kiwis-face-hurdles-in-pursuit-of-lost-funds-20130903-2t1jl.html#ixzz2glaaulCe">"Kiwis face hurdles in pursuit of lost funds"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">4 October</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-108">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-108">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Bertram, Geoff (April 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/south-pacific-economic-relations/4">"South Pacific economic relations – Aid, remittances and tourism"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-109">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-109">^</a></b></span> <span class="reference-text"><cite class="citation web">Howes, Stephen (November 2010). <a rel="nofollow" class="external text" href="http://devpolicy.org/making-migration-work-lessons-from-new-zealand/">"Making migration work: Lessons from New Zealand"</a>. Development Policy Centre<span class="reference-accessdate">. Retrieved <span class="nowrap">23 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-110">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-110">^</a></b></span> <span class="reference-text"><cite class="citation web">Ayele, Yoseph (28 September 2017). <a rel="nofollow" class="external text" href="https://stories.ehf.org/the-growing-momentum-for-global-impact-in-new-zealand-13bdc5597ad2">"The Growing Momentum for Global Impact in New Zealand"</a>. <i>Edmund Hillary Fellowship</i><span class="reference-accessdate">. Retrieved <span class="nowrap">9 July</span> 2019</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-111">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-111">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.un.org/en/members/index.shtml#n">"Member States of the United Nations"</a>. United Nations<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-112">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-112">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://thecommonwealth.org/our-member-countries/new-zealand">"New Zealand"</a>. The Commonwealth<span class="reference-accessdate">. Retrieved <span class="nowrap">1 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-113">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-113">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.oecd.org/pages/0,3417,en_36734052_36761800_1_1_1_1_1,00.html">"Members and partners"</a>. Organisation for Economic Co-operation and Development<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-114">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-114">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.aspistrategist.org.au/the-future-of-the-five-power-defence-arrangements/">"The future of the Five Power Defence Arrangements"</a>. The Strategist. 8 November 2012<span class="reference-accessdate">. Retrieved <span class="nowrap">1 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-115">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-115">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzdf.mil.nz/about-us/">"About Us: Role and Responsibilities"</a>. New Zealand Defence Force<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-116">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-116">^</a></b></span> <span class="reference-text"><cite class="citation book">Ayson, Robert (2007). "New Zealand Defence and Security Policy,1990–2005". In Alley, Roderic (ed.). <i>New Zealand In World Affairs, Volume IV: 1990–2005</i>. Wellington: <a href="/wiki/Victoria_University_Press" title="Victoria University Press">Victoria University Press</a>. p.&#160;132. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-86473-548-5" title="Special:BookSources/978-0-86473-548-5"><bdi>978-0-86473-548-5</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-117">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-117">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/the-battle-for-crete">"The Battle for Crete"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. May 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-118">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-118">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/the-north-african-campaign/el-alamein">"El Alamein – The North African Campaign"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage. May 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-119">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-119">^</a></b></span> <span class="reference-text"><cite class="citation web"><a href="/wiki/Richard_Holmes_(military_historian)" title="Richard Holmes (military historian)">Holmes, Richard</a> (September 2010). <a rel="nofollow" class="external text" href="http://www.bbc.co.uk/history/worldwars/wwtwo/battle_cassino_01.shtml">"World War Two: The Battle of Monte Cassino"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-120">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-120">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=10122323">"Gallipoli stirred new sense of national identity says Clark"</a>. <i>New Zealand Herald</i>. April 2005<span class="reference-accessdate">. Retrieved <span class="nowrap">9 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-121">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-121">^</a></b></span> <span class="reference-text"><cite class="citation book">Prideaux, Bruce (2007). Ryan, Chris (ed.). <i>Battlefield tourism: history, place and interpretation</i>. <a href="/wiki/Elsevier" title="Elsevier">Elsevier</a> Science. p.&#160;18. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-08-045362-0" title="Special:BookSources/978-0-08-045362-0"><bdi>978-0-08-045362-0</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-122">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-122">^</a></b></span> <span class="reference-text"><cite class="citation web">Burke, Arthur. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20101226110037/http://www.anzacday.org.au/spirit/spirit2.html">"The Spirit of ANZAC"</a>. ANZAC Day Commemoration Committee. Archived from <a rel="nofollow" class="external text" href="http://www.anzacday.org.au/spirit/spirit2.html">the original</a> on 26 December 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-123">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-123">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/the-south-african-boer-war/introduction">"South African War 1899–1902"</a>. Ministry for Culture and Heritage. February 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-124">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-124">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://nzhistory.govt.nz/war/korean-war">"New Zealand in the Korean War"</a>. <i>New Zealand History</i>. Ministry for Culture and Heritage<span class="reference-accessdate">. Retrieved <span class="nowrap">1 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-125">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-125">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/war/the-malayan-emergency">"NZ and the Malayan Emergency"</a>. Ministry for Culture and Heritage. August 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">11 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-126">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-126">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20080125104529/http://www.nzdf.mil.nz/operations/default.htm">"New Zealand Defence Force Overseas Operations"</a>. <a href="/wiki/New_Zealand_Defence_Force" title="New Zealand Defence Force">New Zealand Defence Force</a>. January 2008. Archived from <a rel="nofollow" class="external text" href="http://www.nzdf.mil.nz/operations/default.htm">the original</a> on 25 January 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2008</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-nine_provinces-127">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-nine_provinces_127-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-nine_provinces_127-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.library.otago.ac.nz/pdf/hoc_fr_bulletins/31_bulletin.pdf">"New Zealand's Nine Provinces (1853–76)"</a> <span class="cs1-format">(PDF)</span>. <i>Friends of the Hocken Collections</i>. University of Otago. March 2000<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-128">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-128">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/provinces-and-provincial-districts/3"><i>Provincial Divergencies</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">7 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-129">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-129">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (September 2016). <a rel="nofollow" class="external text" href="http://TeAra.govt.nz/en/public-holidays">"Public holidays"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-130">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-130">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/regional-rugby/overview">"Overview – regional rugby"</a>. Ministry for Culture and Heritage. September 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-131">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-131">^</a></b></span> <span class="reference-text"><cite class="citation journal">Dollery, Brian; Keogh, Ciaran; Crase, Lin (2007). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20070829001212/http://www.anzrsai.org/system/files/f8/f9/f39/f40/o186//Dollery%20sustaining%20regions%20article.pdf">"Alternatives to Amalgamation in Australian Local Government: Lessons from the New Zealand Experience"</a> <span class="cs1-format">(PDF)</span>. <i>Sustaining Regions</i>. <b>6</b> (1): 50–69. Archived from <a rel="nofollow" class="external text" href="http://www.anzrsai.org/system/files/f8/f9/f39/f40/o186//Dollery%20sustaining%20regions%20article.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 29 August 2007.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Sancton2000-132">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Sancton2000_132-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Sancton2000_132-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-Sancton2000_132-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation book">Sancton, Andrew (2000). <i>Merger mania: the assault on local government</i>. <a href="/wiki/McGill-Queen%27s_University_Press" class="mw-redirect" title="McGill-Queen's University Press">McGill-Queen's University Press</a>. p.&#160;84. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-7735-2163-1" title="Special:BookSources/0-7735-2163-1"><bdi>0-7735-2163-1</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-133">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-133">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110610051916/http://www.stats.govt.nz/~/media/Statistics/Methods%20and%20Services/Tables/Subnational%20population%20estimates/subpopest2001-10.ashx">"Subnational population estimates at 30 June 2010 (boundaries at 1 November 2010)"</a>. Statistics New Zealand. 26 October 2010. Archived from <a rel="nofollow" class="external text" href="http://www.stats.govt.nz/~/media/Statistics/Methods%20and%20Services/Tables/Subnational%20population%20estimates/subpopest2001-10.ashx">the original</a> on 10 June 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">2 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTESmeltJui_Lin200933-134">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESmeltJui_Lin200933_134-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSmeltJui_Lin2009">Smelt &amp; Jui Lin 2009</a>, p.&#160;33.</span>
+ </li>
+ <li id="cite_note-glossary-135">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-glossary_135-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-glossary_135-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.localcouncils.govt.nz/lgip.nsf/wpgurl/Resources-Glossary-Index">"Glossary"</a>. Department of Internal Affairs<span class="reference-accessdate">. Retrieved <span class="nowrap">28 August</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-136">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-136">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1995/0041/latest/whole.html">"Chatham Islands Council Act 1995 No 41"</a>. New Zealand Parliamentary Counsel Office. 29 July 1995<span class="reference-accessdate">. Retrieved <span class="nowrap">8 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-137">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-137">^</a></b></span> <span class="reference-text"><cite class="citation book">Gimpel, Diane (2011). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=Hvqnkc5nP54C&amp;pg=PA22"><i>Monarchies</i></a>. ABDO Publishing Company. p.&#160;22. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-617-14792-0" title="Special:BookSources/978-1-617-14792-0"><bdi>978-1-617-14792-0</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">18 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-138">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-138">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101113024046/http://www.gov.nu/wb/pages/system-of-government-fakatokaaga-he-fakatufono.php">"System of Government"</a>. Government of Niue. Archived from <a rel="nofollow" class="external text" href="http://www.gov.nu/wb/pages/system-of-government-fakatokaaga-he-fakatufono.php">the original</a> on 13 November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-139">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-139">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.ck/govt.htm#con">"Government – Structure, Personnel"</a>. Government of the Cook Islands<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-140">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-140">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.tokelau.org.nz/Tokelau+Government.html">"Tokelau Government"</a>. Government of Tokelau<span class="reference-accessdate">. Retrieved <span class="nowrap">16 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-141">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-141">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.antarcticanz.govt.nz/scott-base">"Scott Base"</a>. <a href="/wiki/Antarctica_New_Zealand" title="Antarctica New Zealand">Antarctica New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-142">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-142">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1977/0061/latest/whole.html">"Citizenship Act 1977 No 61"</a>. Zealand Parliamentary Counsel Office. 1 December 1977<span class="reference-accessdate">. Retrieved <span class="nowrap">26 May</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-143">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-143">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Services-Citizenship-Check-if-you%E2%80%99re-a-New-Zealand-citizen?OpenDocument">"Check if you're a New Zealand citizen"</a>. Department of Internal Affairs<span class="reference-accessdate">. Retrieved <span class="nowrap">20 January</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-145">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-145">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/cook-strait/1"><i>The Sea Floor</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-146">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-146">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101225020855/http://www.aucklandcity.govt.nz/auckland/introduction/hauraki/default.asp">"Hauraki Gulf islands"</a>. <a href="/wiki/Auckland_City_Council" title="Auckland City Council">Auckland City Council</a>. Archived from <a rel="nofollow" class="external text" href="http://www.aucklandcity.govt.nz/auckland/introduction/hauraki/default.asp">the original</a> on 25 December 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-147">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-147">^</a></b></span> <span class="reference-text"><cite class="citation web">Hindmarsh (2006). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110511071150/http://www.historic.org.nz/en/Publications/HeritageNZMagazine/HeritageNz2006/HNZ06-DiscoveringDUrville.aspx">"Discovering D'Urville"</a>. Heritage New Zealand. Archived from <a rel="nofollow" class="external text" href="http://www.historic.org.nz/en/Publications/HeritageNZMagazine/HeritageNz2006/HNZ06-DiscoveringDUrville.aspx">the original</a> on 11 May 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">13 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-148">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-148">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110123074649/http://www.auckland-coastguard.org.nz/Information/Distance%2BTables.html">"Distance tables"</a>. Auckland Coastguard. Archived from <a rel="nofollow" class="external text" href="http://www.auckland-coastguard.org.nz/Information/Distance+Tables.html">the original</a> on 23 January 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">2 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-149">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-149">^</a></b></span> <span class="reference-text"><cite class="citation book">McKenzie, D. W. (1987). <i>Heinemann New Zealand atlas</i>. <a href="/wiki/Heinemann_(publisher)" title="Heinemann (publisher)">Heinemann Publishers</a>. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-7900-0187-X" title="Special:BookSources/0-7900-0187-X"><bdi>0-7900-0187-X</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-CIA-150">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-CIA_150-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-CIA_150-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-CIA_150-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-CIA_150-3"><sup><i><b>d</b></i></sup></a> <a href="#cite_ref-CIA_150-4"><sup><i><b>e</b></i></sup></a> <a href="#cite_ref-CIA_150-5"><sup><i><b>f</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">"CIA – The World Factbook"</a>. Cia.gov<span class="reference-accessdate">. Retrieved <span class="nowrap">4 May</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-151">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-151">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20100522061011/http://www2.stats.govt.nz/domino/external/PASFull/pasfull.nsf/84bf91b1a7b5d7204c256809000460a4/4c2567ef00247c6acc25697a00043f15?OpenDocument">"Geography"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 1999. Archived from <a rel="nofollow" class="external text" href="http://www2.stats.govt.nz/domino/external/PASFull/pasfull.nsf/84bf91b1a7b5d7204c256809000460a4/4c2567ef00247c6acc25697a00043f15?OpenDocument">the original</a> on 22 May 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">21 December</span> 2009</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-152">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-152">^</a></b></span> <span class="reference-text"><cite class="citation book"><a rel="nofollow" class="external text" href="http://www.mfe.govt.nz/sites/default/files/offshore-options-jun05.pdf"><i>Offshore Options: Managing Environmental Effects in New Zealand's Exclusive Economic Zone</i></a> <span class="cs1-format">(PDF)</span>. Wellington: <a href="/wiki/Ministry_for_the_Environment_(New_Zealand)" title="Ministry for the Environment (New Zealand)">Ministry for the Environment</a>. 2005. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-478-25916-6" title="Special:BookSources/0-478-25916-6"><bdi>0-478-25916-6</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">23 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-153">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-153">^</a></b></span> <span class="reference-text"><cite class="citation book">Coates, Glen (2002). <i>The rise and fall of the Southern Alps</i>. Canterbury University Press. p.&#160;15. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-908812-93-0" title="Special:BookSources/0-908812-93-0"><bdi>0-908812-93-0</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEGarden200552-154">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEGarden200552_154-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFGarden2005">Garden 2005</a>, p.&#160;52.</span>
+ </li>
+ <li id="cite_note-155">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-155">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Grant, David (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/southland-places/10">"Southland places – Fiordland's coast"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">14 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-156">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-156">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101229222806/http://www.doc.govt.nz/parks-and-recreation/national-parks/tongariro/features/central-north-island-volcanoes/">"Central North Island volcanoes"</a>. Department of Conservation. Archived from <a rel="nofollow" class="external text" href="http://www.doc.govt.nz/parks-and-recreation/national-parks/tongariro/features/central-north-island-volcanoes/">the original</a> on 29 December 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">14 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-157">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-157">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Walrond, Carl (March 2009). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/natural-environment/1">"Natural environment – Geography and geology"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">14 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-158">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-158">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110324025353/http://www.geonet.org.nz/volcano/activity/taupo/about.html">"Taupo"</a>. <a href="/wiki/GNS_Science" title="GNS Science">GNS Science</a>. Archived from <a rel="nofollow" class="external text" href="http://www.geonet.org.nz/volcano/activity/taupo/about.html">the original</a> on 24 March 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">2 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Keith_2009-159">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Keith_2009_159-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Keith_2009_159-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Lewis, Keith; Nodder, Scott; Carter, Lionel (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/sea-floor-geology/2">"Sea floor geology – Active plate boundaries"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-160">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-160">^</a></b></span> <span class="reference-text"><cite class="citation journal">Wallis, G. P.; Trewick, S. A. (2009). "New Zealand phylogeography: evolution on a small continent". <i>Molecular Ecology</i>. <b>18</b> (17): 3548–3580. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1111%2Fj.1365-294X.2009.04294.x">10.1111/j.1365-294X.2009.04294.x</a>. <a href="/wiki/PubMed_Identifier" class="mw-redirect" title="PubMed Identifier">PMID</a>&#160;<a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pubmed/19674312">19674312</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-161">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-161">^</a></b></span> <span class="reference-text"><cite class="citation journal">Wright, Dawn; Bloomer, Sherman; MacLeod, Christopher; Taylor, Brian; Goodliffe, Andrew (2000). "Bathymetry of the Tonga Trench and Forearc: A Map Series". <i>Marine Geophysical Researches</i>. <b>21</b> (5): 489–512. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/2000MarGR..21..489W">2000MarGR..21..489W</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1023%2FA%3A1026514914220">10.1023/A:1026514914220</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZOD-162">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-NZOD_162-0">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">"Australasia". <i>New Zealand Oxford Dictionary</i>. Oxford University Press. 2005. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1093%2Facref%2F9780195584516.001.0001">10.1093/acref/9780195584516.001.0001</a>. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9780195584516" title="Special:BookSources/9780195584516"><bdi>9780195584516</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-163">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-163">^</a></b></span> <span class="reference-text"><cite class="citation book">Hobbs, Joseph J. (2016). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=0rUaCgAAQBAJ&amp;pg=PA367"><i>Fundamentals of World Regional Geography</i></a>. Cengage Learning. p.&#160;367. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9781305854956" title="Special:BookSources/9781305854956"><bdi>9781305854956</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-164">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-164">^</a></b></span> <span class="reference-text"><cite class="citation book">Hillstrom, Kevin; Hillstrom, Laurie Collier (2003). <i>Australia, Oceania, and Antarctica: A Continental Overview of Environmental Issues</i>. <b>3</b>. ABC-CLIO. p.&#160;25. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9781576076941" title="Special:BookSources/9781576076941"><bdi>9781576076941</bdi></a>. <q>…defined here as the continent nation of Australia, New Zealand, and twenty-two other island countries and territories sprinkled over more than 40 million square kilometres of the South Pacific.</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Mullan2009-165">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Mullan2009_165-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Mullan2009_165-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Mullan, Brett; Tait, Andrew; Thompson, Craig (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/climate/1">"Climate – New Zealand's climate"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">15 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-niwa-166">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-niwa_166-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.niwa.co.nz/education-and-training/schools/resources/climate/extreme">"Summary of New Zealand climate extremes"</a>. <a href="/wiki/National_Institute_of_Water_and_Atmospheric_Research" title="National Institute of Water and Atmospheric Research">National Institute of Water and Atmospheric Research</a>. 2004<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-167">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-167">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Walrond, Carl (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/natural-environment/3">"Natural environment – Climate"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">15 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-168">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-168">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110503221956/http://www.niwa.co.nz/__data/assets/file/0006/44268/rain.xls">"Mean monthly rainfall"</a>. National Institute of Water and Atmospheric Research. Archived from <a rel="nofollow" class="external text" href="http://www.niwa.co.nz/__data/assets/file/0006/44268/rain.xls">the original</a> <span class="cs1-format">(XLS)</span> on 3 May 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-169">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-169">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20081015102420/http://www.niwascience.co.nz/__data/assets/file/0006/44655/sunshine.xls">"Mean monthly sunshine hours"</a>. National Institute of Water and Atmospheric Research. Archived from <a rel="nofollow" class="external text" href="http://www.niwascience.co.nz/__data/assets/file/0006/44655/sunshine.xls">the original</a> <span class="cs1-format">(XLS)</span> on 15 October 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-170">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-170">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.newzealand.com/int/feature/new-zealand-climate-and-weather/">"New Zealand climate and weather"</a>. Tourism New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">13 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-171">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-171">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.niwa.co.nz/education-and-training/schools/resources/climate">"Climate data and activities"</a>. National Institute of Water and Atmospheric Research<span class="reference-accessdate">. Retrieved <span class="nowrap">11 February</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-172">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-172">^</a></b></span> <span class="reference-text"><cite class="citation journal">Cooper, R.; Millener, P. (1993). "The New Zealand biota: Historical background and new research". <i>Trends in Ecology &amp; Evolution</i>. <b>8</b> (12): 429. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1016%2F0169-5347%2893%2990004-9">10.1016/0169-5347(93)90004-9</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-173">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-173">^</a></b></span> <span class="reference-text">Trewick SA, Morgan-Richards M. 2014. New Zealand Wild Life. Penguin, New Zealand.</span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" /><span class="reference-text"><a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9780143568896" title="Special:BookSources/9780143568896">9780143568896</a></span>
+ </li>
+ <li id="cite_note-174">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-174">^</a></b></span> <span class="reference-text"><cite class="citation book">Lindsey, Terence; Morris, Rod (2000). <i>Collins Field Guide to New Zealand Wildlife</i>. <a href="/wiki/HarperCollins" title="HarperCollins">HarperCollins</a> (New Zealand) Limited. p.&#160;14. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-86950-300-0" title="Special:BookSources/978-1-86950-300-0"><bdi>978-1-86950-300-0</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FAQ-175">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-FAQ_175-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FAQ_175-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzpcn.org.nz/page.asp?help_faqs_NZ_plants">"Frequently asked questions about New Zealand plants"</a>. <a href="/wiki/New_Zealand_Plant_Conservation_Network" title="New Zealand Plant Conservation Network">New Zealand Plant Conservation Network</a>. May 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">15 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZPCN_2006-176">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-NZPCN_2006_176-0">^</a></b></span> <span class="reference-text"><cite class="citation book">De Lange, Peter James; Sawyer, John William David &amp; Rolfe, Jeremy (2006). <i>New Zealand indigenous vascular plant checklist</i>. New Zealand Plant Conservation Network. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-473-11306-6" title="Special:BookSources/0-473-11306-6"><bdi>0-473-11306-6</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-177">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-177">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wassilieff, Maggy (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/lichens/2">"Lichens – Lichens in New Zealand"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">16 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-178">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-178">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2010) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/forests-indigenous/4"><i>Mixed Broadleaf Podocarp and Kauri Forest</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-179">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-179">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Mark, Alan (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/grasslands/1">"Grasslands – Tussock grasslands"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">17 January</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-180">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-180">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.fao.org/docrep/w7730e/w7730e09.htm#new%20zealand">"Commentary on Forest Policy in the Asia-Pacific Region (A Review for Indonesia, Malaysia, New Zealand, Papua New Guinea, Philippines, Thailand and Western Samoa)"</a>. Forestry Department. 1997<span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-181">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-181">^</a></b></span> <span class="reference-text"><cite class="citation journal">McGlone, M.S. (1989). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20140717220413/http://nzes.org.nz/nzje/free_issues/NZJEcol12_s_115.pdf">"The Polynesian settlement of New Zealand in relation to environmental and biotic changes"</a> <span class="cs1-format">(PDF)</span>. <i>New Zealand Journal of Ecology</i>. 12(S): 115–129. Archived from <a rel="nofollow" class="external text" href="http://nzes.org.nz/nzje/free_issues/NZJEcol12_s_115.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 17 July 2014.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-182">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-182">^</a></b></span> <span class="reference-text">Taylor, R. and Smith, I. (1997). <a rel="nofollow" class="external text" href="http://www.mfe.govt.nz/publications/ser/ser1997/index.html">The state of New Zealand’s environment 1997</a>. Ministry for the Environment, Wellington.</span>
+ </li>
+ <li id="cite_note-183">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-183">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.terranature.org/flightlessbirds.htm">"New Zealand ecology: Flightless birds"</a>. TerraNature<span class="reference-accessdate">. Retrieved <span class="nowrap">17 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Holdaway2009-184">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Holdaway2009_184-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Holdaway2009_184-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Holdaway, Richard (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/extinctions/4">"Extinctions – New Zealand extinctions since human arrival"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-185">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-185">^</a></b></span> <span class="reference-text"><cite class="citation news">Kirby, Alex (January 2005). <a rel="nofollow" class="external text" href="http://news.bbc.co.uk/2/hi/science/nature/4138147.stm">"Huge eagles 'dominated NZ skies<span class="cs1-kern-right">'</span>"</a>. <i>BBC News</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-186">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-186">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20150129135945/http://www.doc.govt.nz/conservation/native-animals/reptiles-and-frogs/">"Reptiles and frogs"</a>. Department of Conservation. Archived from <a rel="nofollow" class="external text" href="http://www.doc.govt.nz/conservation/native-animals/reptiles-and-frogs">the original</a> on 29 January 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">25 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-187">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-187">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Pollard, Simon (September 2007). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/spiders-and-other-arachnids">"Spiders and other arachnids"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">25 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-188">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-188">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.doc.govt.nz/nature/native-animals/invertebrates/weta/">"Wētā"</a>. Department of Conservation<span class="reference-accessdate">. Retrieved <span class="nowrap">25 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-189">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-189">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Ryan, Paddy (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/snails-and-slugs/2">"Snails and slugs – Flax snails, giant snails and veined slugs"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-190">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-190">^</a></b></span> <span class="reference-text"><cite class="citation journal">Herrera-Flores, Jorge A.; Stubbs, Thomas L.; Benton, Michael J.; Ruta, Marcello (May 2017). "Macroevolutionary patterns in Rhynchocephalia: is the tuatara (Sphenodon punctatus) a living fossil?". <i>Palaeontology</i>. <b>60</b> (3): 319–328. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1111%2Fpala.12284">10.1111/pala.12284</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-191">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-191">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20070531085218/http://www.science.unsw.edu.au/news/2006/nzmammal.html">"Tiny Bones Rewrite Textbooks, first New Zealand land mammal fossil"</a>. University of New South Wales. 31 May 2007. Archived from <a rel="nofollow" class="external text" href="http://www.science.unsw.edu.au/news/2006/nzmammal.html">the original</a> on 31 May 2007.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-192">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-192">^</a></b></span> <span class="reference-text"><cite class="citation journal">Worthy, Trevor H.; Tennyson, Alan J. D.; Archer, Michael; Musser, Anne M.; Hand, Suzanne J.; Jones, Craig; Douglas, Barry J.; McNamara, James A.; Beck, Robin M. D. (2006). <a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC1697831">"Miocene mammal reveals a Mesozoic ghost lineage on insular New Zealand, southwest Pacific"</a>. <i><a href="/wiki/Proceedings_of_the_National_Academy_of_Sciences_of_the_United_States_of_America" title="Proceedings of the National Academy of Sciences of the United States of America">Proceedings of the National Academy of Sciences of the United States of America</a></i>. <b>103</b> (51): 19419–23. <a href="/wiki/Bibcode" title="Bibcode">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/2006PNAS..10319419W">2006PNAS..10319419W</a>. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1073%2Fpnas.0605684103">10.1073/pnas.0605684103</a>. <a href="/wiki/PubMed_Central" title="PubMed Central">PMC</a>&#160;<span class="cs1-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pmc/articles/PMC1697831">1697831</a></span>. <a href="/wiki/PubMed_Identifier" class="mw-redirect" title="PubMed Identifier">PMID</a>&#160;<a rel="nofollow" class="external text" href="//www.ncbi.nlm.nih.gov/pubmed/17159151">17159151</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-193">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-193">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110308103617/http://www.doc.govt.nz/conservation/native-animals/marine-mammals/">"Marine Mammals"</a>. Department of Conservation. Archived from <a rel="nofollow" class="external text" href="http://www.doc.govt.nz/conservation/native-animals/marine-mammals/">the original</a> on 8 March 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">17 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-194">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-194">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.doc.govt.nz/nature/native-animals/birds/sea-and-shore-birds/">"Sea and shore birds"</a>. Department of Conservation<span class="reference-accessdate">. Retrieved <span class="nowrap">7 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-195">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-195">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.doc.govt.nz/nature/native-animals/birds/birds-a-z/penguins/">"Penguins"</a>. Department of Conservation<span class="reference-accessdate">. Retrieved <span class="nowrap">7 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-196">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-196">^</a></b></span> <span class="reference-text"><cite class="citation book">Jones, Carl (2002). "Reptiles and Amphibians". In Perrow, Martin; Davy, Anthony (eds.). <i>Handbook of ecological restoration: Principles of Restoration</i>. <b>2</b>. Cambridge University Press. p.&#160;362. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-521-79128-6" title="Special:BookSources/0-521-79128-6"><bdi>0-521-79128-6</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-197">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-197">^</a></b></span> <span class="reference-text"><cite class="citation journal">Towns, D.; Ballantine, W. (1993). "Conservation and restoration of New Zealand Island ecosystems". <i>Trends in Ecology &amp; Evolution</i>. <b>8</b> (12): 452. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1016%2F0169-5347%2893%2990009-E">10.1016/0169-5347(93)90009-E</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-198">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-198">^</a></b></span> <span class="reference-text"><cite class="citation journal">Rauzon, Mark (2008). <a rel="nofollow" class="external text" href="http://marineornithology.org/PDF/35_2/35_2_97-107.pdf">"Island restoration: Exploring the past, anticipating the future"</a> <span class="cs1-format">(PDF)</span>. <i>Marine Ornithology</i>. <b>35</b>: 97–107.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-199">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-199">^</a></b></span> <span class="reference-text"><cite class="citation book">Diamond, Jared (1990). Towns, D; Daugherty, C; Atkinson, I (eds.). <a rel="nofollow" class="external text" href="http://www.doc.govt.nz/documents/science-and-technical/EcologicalRestorationNZIslands.pdf"><i>New Zealand as an archipelago: An international perspective</i></a> <span class="cs1-format">(PDF)</span>. Wellington: Conservation Sciences Publication No. 2. Department of Conservation. pp.&#160;3–8.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-200">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-200">^</a></b></span> <span class="reference-text"><cite class="citation book"><a rel="nofollow" class="external text" href="https://www.imf.org/en/Publications/WEO/Issues/2018/03/20/~/media/Files/Publications/WEO/2018/April/text.ashx?la=en"><i>World Economic Outlook</i></a>. <a href="/wiki/International_Monetary_Fund" title="International Monetary Fund">International Monetary Fund</a>. April 2018. p.&#160;63. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-48434-971-7" title="Special:BookSources/978-1-48434-971-7"><bdi>978-1-48434-971-7</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">21 June</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-201">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-201">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.heritage.org/index/ranking">"Rankings on Economic Freedom"</a>. <a href="/wiki/The_Heritage_Foundation" title="The Heritage Foundation">The Heritage Foundation</a>. 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">30 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-202">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-202">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.bsi.si/en/financial-data.asp?MapaId=1239">"Currencies of the territories listed in the BS exchange rate lists"</a>. Bank of Slovenia<span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-RWT_export_evolution-203">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-RWT_export_evolution_203-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-RWT_export_evolution_203-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-RWT_export_evolution_203-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (November 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/trade-external/1"><i>Historical evolution and trade patterns</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">10 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-204">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-204">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stringleman, Hugh; Peden, Robert (October 2009). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/sheep-farming/5/2">"Sheep farming – Growth of the frozen meat trade, 1882–2001"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">6 May</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-205">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-205">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Baker, John (February 2010) [1966]. McLintock, Alexander (ed.). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/standard-of-living/1/1"><i>Some Indicators of Comparative Living Standards</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" /><a rel="nofollow" class="external text" href="http://www.teara.govt.nz/files/3_308_StandardOfLiving_Comparison_0.pdf">PDF Table</a>
+ </li>
+ <li id="cite_note-206">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-206">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/history/6">"History – The later 20th century"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-207">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-207">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Nixon, Chris; Yeabsley, John (April 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/overseas-trade-policy/5">"Overseas trade policy – Difficult times – the 1970s and early 1980s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-208">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-208">^</a></b></span> <span class="reference-text"><cite class="citation journal">Evans, N. "Up From Down Under: After a Century of Socialism, Australia and New Zealand are Cutting Back Government and Freeing Their Economies". <i>National Review</i>. <b>46</b> (16): 47–51.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-209">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-209">^</a></b></span> <span class="reference-text"><cite class="citation book"><i>Trade, Food Security, and Human Rights: The Rules for International Trade in Agricultural Products and the Evolving World Food Crisis</i>. Routledge. 2016. p.&#160;125. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9781317008521" title="Special:BookSources/9781317008521"><bdi>9781317008521</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-210">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-210">^</a></b></span> <span class="reference-text"><cite class="citation news">Wayne Arnold (2 August 2007). <a rel="nofollow" class="external text" href="https://www.nytimes.com/2007/08/02/business/worldbusiness/02farm.html?pagewanted=all">"Surviving Without Subsidies"</a>. <i><a href="/wiki/The_New_York_Times" title="The New York Times">The New York Times</a></i><span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2015</span>. <q>... ever since a liberal but free-market government swept to power in 1984 and essentially canceled handouts to farmers ... They went cold turkey and in the process it was very rough on their farming economy</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Liberalisation-211">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-Liberalisation_211-0">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Easton, Brian (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/economic-history/11">"Economic history – Government and market liberalisation"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">1 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-212">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-212">^</a></b></span> <span class="reference-text"><cite class="citation book">Hazledine, Tim (1998). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110510082643/http://www.ariplex.com/~economic-myth-busters/hazledine-taking%20nz%20seriously.pdf"><i>Taking New Zealand Seriously: The Economics of Decency</i></a> <span class="cs1-format">(PDF)</span>. HarperCollins Publishers. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/1-86950-283-3" title="Special:BookSources/1-86950-283-3"><bdi>1-86950-283-3</bdi></a>. Archived from <a rel="nofollow" class="external text" href="http://www.ariplex.com/~economic-myth-busters/hazledine-taking%20nz%20seriously.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 10 May 2011.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-213">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-213">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stuff.co.nz/travel/396410">"NZ tops Travellers' Choice Awards"</a>. Stuff Travel. May 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-unemployment-214">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-unemployment_214-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-unemployment_214-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-unemployment_214-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.socialreport.msd.govt.nz/paid-work/unemployment.html">"Unemployment: the Social Report 2016 – Te pūrongo oranga tangata"</a>. Ministry of Social Development<span class="reference-accessdate">. Retrieved <span class="nowrap">18 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-215">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-215">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="https://www.nytimes.com/2009/06/11/business/global/11nzrate.html">"New Zealand Takes a Pause in Cutting Rates"</a>. <i>The New York Times</i>. 10 June 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-216">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-216">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://news.bbc.co.uk/2/hi/business/8120196.stm">"New Zealand's slump longest ever"</a>. <i>BBC News</i>. 26 June 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-217">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-217">^</a></b></span> <span class="reference-text"><cite class="citation web">Bascand, Geoff (February 2011). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110429174323/http://www.stats.govt.nz/browse_for_stats/work_income_and_spending/employment_and_unemployment/HouseholdLabourForceSurvey_MRDec10qtr.aspx">"Household Labour Force Survey: December 2010 quarter – Media Release"</a>. Statistics New Zealand. Archived from <a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/work_income_and_spending/employment_and_unemployment/HouseholdLabourForceSurvey_MRDec10qtr.aspx">the original</a> on 29 April 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-218">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-218">^</a></b></span> <span class="reference-text"><cite class="citation journal">Davenport, Sally (2004). "Panic and panacea: brain drain and science and technology human capital policy". <i>Research Policy</i>. <b>33</b> (4): 617–630. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1016%2Fj.respol.2004.01.006">10.1016/j.respol.2004.01.006</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-219">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-219">^</a></b></span> <span class="reference-text"><cite class="citation news">O'Hare, Sean (September 2010). <a rel="nofollow" class="external text" href="https://www.telegraph.co.uk/expat/expatnews/7973220/New-Zealand-brain-drain-worst-in-world.html">"New Zealand brain-drain worst in world"</a>. <i>The Daily Telegraph</i>. United Kingdom.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-220">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-220">^</a></b></span> <span class="reference-text"><cite class="citation news">Collins, Simon (March 2005). <a rel="nofollow" class="external text" href="http://www.nzherald.co.nz/nz/news/article.cfm?c_id=1&amp;objectid=10114923">"Quarter of NZ's brightest are gone"</a>. <i>New Zealand Herald</i>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-221">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-221">^</a></b></span> <span class="reference-text"><cite class="citation journal">Winkelmann, Rainer (2000). "The labour market performance of European immigrants in New Zealand in the 1980s and 1990s". <i>The International Migration Review</i>. The Center for Migration Studies of New York. <b>33</b> (1): 33–58. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.2307%2F2676011">10.2307/2676011</a>. <a href="/wiki/JSTOR" title="JSTOR">JSTOR</a>&#160;<a rel="nofollow" class="external text" href="//www.jstor.org/stable/2676011">2676011</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />Journal subscription required
+ </li>
+ <li id="cite_note-FOOTNOTEBain200644-222">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEBain200644_222-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFBain2006">Bain 2006</a>, p.&#160;44.</span>
+ </li>
+ <li id="cite_note-223">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-223">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.globalinnovationindex.org/userfiles/file/reportpdf/gii-full-report-2016-v1.pdf#">"GII 2016 Report"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Global_Innovation_Index" title="Global Innovation Index">Global Innovation Index</a><span class="reference-accessdate">. Retrieved <span class="nowrap">21 June</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-224">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-224">^</a></b></span> <span class="reference-text"><cite class="citation web">Groser, Tim (March 2009). <a rel="nofollow" class="external text" href="https://www.beehive.govt.nz/speech/speech-asean-australia-new-zealand-free-trade-agreement-seminars">"Speech to ASEAN-Australia-New Zealand Free Trade Agreement Seminars"</a>. New Zealand Government<span class="reference-accessdate">. Retrieved <span class="nowrap">30 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-225">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-225">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mfat.govt.nz/Trade-and-Economic-Relations/NZ-and-the-WTO/Improving-access-to-markets/0-agriculturenegs.php">"Improving Access to Markets:Agriculture"</a>. <a href="/wiki/New_Zealand_Ministry_of_Foreign_Affairs_and_Trade" class="mw-redirect" title="New Zealand Ministry of Foreign Affairs and Trade">New Zealand Ministry of Foreign Affairs and Trade</a><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-226">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-226">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/infoshare">"Standard International Trade Classification R4 – Exports (Annual-Jun)"</a>. Statistics New Zealand. April 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">3 April</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-GSTC_StatNZ-227">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-GSTC_StatNZ_227-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-GSTC_StatNZ_227-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-GSTC_StatNZ_227-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.stats.govt.nz/information-releases/goods-and-services-trade-by-country-year-ended-june-2018">"Goods and services trade by country: Year ended June 2018 – corrected"</a>. Statistics New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2019</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-228">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-228">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="https://www.nytimes.com/2008/04/07/business/worldbusiness/07iht-7tradefw.11718461.html">"China and New Zealand sign free trade deal"</a>. <i>The New York Times</i>. April 2008.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-TourismStats-229">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-TourismStats_229-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-TourismStats_229-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mbie.govt.nz/info-services/sectors-industries/tourism/documents-image-library/key-tourism-statistics.pdf">"Key Tourism Statistics"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Ministry_of_Business,_Innovation_and_Employment" title="Ministry of Business, Innovation and Employment">Ministry of Business, Innovation and Employment</a>. 26 April 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">26 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-230">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-230">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Easton, Brian (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/economy/2">"Economy – Agricultural production"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-231">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-231">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stringleman, Hugh; Peden, Robert (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/sheep-farming/7">"Sheep farming – Changes from the 20th century"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-232">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-232">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stringleman, Hugh; Scrimgeour, Frank (November 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/10">"Dairying and dairy products – Dairying in the 2000s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-233">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-233">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stringleman, Hugh; Scrimgeour, Frank (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/11">"Dairying and dairy products – Dairy exports"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-234">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-234">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stringleman, Hugh; Scrimgeour, Frank (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/dairying-and-dairy-products/12">"Dairying and dairy products – Manufacturing and marketing in the 2000s"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-235">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-235">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Dalley, Bronwyn (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/wine/6">"Wine – The wine boom, 1980s and beyond"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-236">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-236">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.economist.com/node/10926423">"Wine in New Zealand"</a>. <i>The Economist</i>. 27 March 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">29 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-237">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-237">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110510042204/http://www.maf.govt.nz/news-resources/statistics-forecasting/international-trade.aspx">"Agricultural and forestry exports from New Zealand: Primary sector export values for the year ending June 2010"</a>. Ministry of Agriculture and Forestry. 14 January 2011. Archived from <a rel="nofollow" class="external text" href="http://www.maf.govt.nz/news-resources/statistics-forecasting/international-trade.aspx">the original</a> on 10 May 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">8 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Energy2015-238">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Energy2015_238-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Energy2015_238-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation report"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170503234030/http://www.mbie.govt.nz/info-services/sectors-industries/energy/energy-data-modelling/publications/energy-in-new-zealand/energy-in-nz-2016.pdf">Energy in New Zealand 2016</a> <span class="cs1-format">(PDF)</span> (Report). Ministry of Business, Innovation and Employment. September 2016. p.&#160;47. <a href="/wiki/International_Standard_Serial_Number" title="International Standard Serial Number">ISSN</a>&#160;<a rel="nofollow" class="external text" href="//www.worldcat.org/issn/2324-5913">2324-5913</a>. Archived from <a rel="nofollow" class="external text" href="http://www.mbie.govt.nz/info-services/sectors-industries/energy/energy-data-modelling/publications/energy-in-new-zealand/energy-in-nz-2016.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 3 May 2017.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-239">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-239">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.oag.govt.nz/2010/water/part1.htm">"Appendix 1: Technical information about drinking water supply in the eight local authorities"</a>. Office of the Auditor-General<span class="reference-accessdate">. Retrieved <span class="nowrap">2 September</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-240">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-240">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.gw.govt.nz/water/">"Water supply"</a>. Greater Wellington Regional Council<span class="reference-accessdate">. Retrieved <span class="nowrap">2 September</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-241">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-241">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzta.govt.nz/roads-and-rail/research-and-data/state-highway-frequently-asked-questions/">"State highway frequently asked questions"</a>. <a href="/wiki/NZ_Transport_Agency" title="NZ Transport Agency">NZ Transport Agency</a><span class="reference-accessdate">. Retrieved <span class="nowrap">28 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-242">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-242">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Humphris, Adrian (April 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/public-transport/8">"Public transport – Passenger trends"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-243">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-243">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Atkinson, Neill (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/railways/11">"Railways – Rail transformed"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-244">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-244">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.metlink.org.nz/about-us/">"About Metlink"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">27 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-245">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-245">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Atkinson, Neill (April 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/railways/6">"Railways – Freight transport"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-246">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-246">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.tourismresearch.govt.nz/Documents/International%20Market%20Profiles/Total%20Profile.pdf">"International Visitors"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Ministry_of_Economic_Development_(New_Zealand)" title="Ministry of Economic Development (New Zealand)">Ministry of Economic Development</a>. June 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">30 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-247">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-247">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20100522203825/http://www.med.govt.nz/templates/MultipageDocumentPage____9038.aspx">"10. Airports"</a>. <i>Infrastructure Stocktake: Infrastructure Audit</i>. Ministry of Economic Development. December 2005. Archived from <a rel="nofollow" class="external text" href="http://www.med.govt.nz/templates/MultipageDocumentPage____9038.aspx#P5641_412038">the original</a> on 22 May 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">30 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Wilson2010-248">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Wilson2010_248-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2010_248-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, A. C. (March 2010). <a rel="nofollow" class="external text" href="https://www.teara.govt.nz/en/telecommunications/page-6">"Telecommunications - Telecom"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-249">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-249">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mbie.govt.nz/info-services/sectors-industries/technology-communications/communications/previous-reviews-and-consultations/telecom-separation">"Telecom separation"</a>. Ministry of Business, Innovation and Employment. 14 September 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-250">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-250">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.mbie.govt.nz/science-and-technology/it-communications-and-broadband/fast-broadband/broadband-and-mobile-programmes/">"Broadband and mobile programmes - Ministry of Business, Innovation &amp; Employment"</a>. <i>www.mbie.govt.nz</i>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-251">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-251">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.itu.int/net4/ITU-D/idi/2017/">"2017 Global ICT Development Index"</a>. International Telecommunication Union (ITU). 2018<span class="reference-accessdate">. Retrieved <span class="nowrap">18 September</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-252">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-252">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.stats.govt.nz/information-releases/2013-census-usually-resident-population-counts">"2013 Census usually resident population counts"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 14 October 2013<span class="reference-accessdate">. Retrieved <span class="nowrap">20 September</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-253">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-253">^</a></b></span> <span class="reference-text"><cite class="citation pressrelease"><a rel="nofollow" class="external text" href="https://www.stats.govt.nz/information-releases/national-population-projections-2016base2068">"National population projections: 2016(base)–2068"</a> (Press release). Statistics New Zealand. 18 October 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">20 October</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Urban-255">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-Urban_255-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/methods_and_services/access-data/tables/subnational-pop-estimates.aspx">"Subnational population estimates at 30 June 2009"</a>. Statistics New Zealand. 30 June 2007<span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-256">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-256">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.mercer.com/newsroom/2016-quality-of-living-survey.html">"Quality of Living Ranking 2016"</a>. London: Mercer. 23 February 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">28 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-257">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-257">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stuff.co.nz/national/health/10053308/NZ-life-expectancy-among-worlds-best">"NZ life expectancy among world's best"</a>. <i><a href="/wiki/Stuff.co.nz" title="Stuff.co.nz">Stuff.co.nz</a></i>. Fairfax NZ<span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2014</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-UNtwspop-258">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-UNtwspop_258-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-UNtwspop_258-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation journal"><a href="/wiki/United_Nations_Department_of_Economic_and_Social_Affairs" title="United Nations Department of Economic and Social Affairs">Department of Economic and Social Affairs Population Division</a> (2009). <a rel="nofollow" class="external text" href="https://www.un.org/esa/population/publications/wpp2008/wpp2008_text_tables.pdf">"World Population Prospects"</a> <span class="cs1-format">(PDF)</span>. 2008 revision. United Nations<span class="reference-accessdate">. Retrieved <span class="nowrap">29 August</span> 2009</span>.</cite> <span class="cs1-hidden-error error citation-comment">Cite journal requires <code class="cs1-code">|journal=</code> (<a href="/wiki/Help:CS1_errors#missing_periodical" title="Help:CS1 errors">help</a>)</span></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-259">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-259">^</a></b></span> <span class="reference-text"><cite class="citation"><a rel="nofollow" class="external text" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">"World Factbook EUROPE&#160;: NEW ZEALAND"</a>, <i><a href="/wiki/The_World_Factbook" title="The World Factbook">The World Factbook</a></i>, 12 July 2018</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-260">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-260">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.health.govt.nz/system/files/documents/publications/nz-mortality-statistics-1950-2009-provisional.pdf">"New Zealand mortality statistics: 1950 to 2010"</a> <span class="cs1-format">(PDF)</span>. Ministry of Health of New Zealand. 2 March 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">16 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-261">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-261">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://stats.oecd.org/Index.aspx?DataSetCode=SHA">"Health expenditure and financing"</a>. <i>stats.oecd.org</i>. <a href="/wiki/OECD" title="OECD">OECD</a>. 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">8 December</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZ_population_data-262">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-NZ_population_data_262-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/SubnationalPopulationEstimates_HOTPAt30Jun17.aspx">"Subnational Population Estimates: At 30 June 2018 (provisional)"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 23 October 2018<span class="reference-accessdate">. Retrieved <span class="nowrap">23 October</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />For urban areas, <cite class="citation web"><a rel="nofollow" class="external text" href="http://nzdotstat.stats.govt.nz/wbos/Index.aspx?DataSetCode=TABLECODE7541">"Subnational population estimates (UA, AU), by age and sex, at 30 June 1996, 2001, 2006-18 (2017 boundaries)"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a>. 23 October 2018<span class="reference-accessdate">. Retrieved <span class="nowrap">23 October</span> 2018</span>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-QuickStats_ethnicity-263">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-QuickStats_ethnicity_263-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/ethnic-groups-NZ.aspx">"2013 Census QuickStats about culture and identity – Ethnic groups in New Zealand"</a>. Statistics New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">29 August</span> 2014</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-264">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-264">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Pool, Ian (May 2011). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170818220947/https://teara.govt.nz/en/graph/28720/new-zealand-population-by-ethnicity-1840-2006">"Population change - Key population trends"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i>. Archived from <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/graph/28720/new-zealand-population-by-ethnicity-1840-2006">the original</a> on 18 August 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">18 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-265">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-265">^</a></b></span> <span class="reference-text"><cite id="CITEREFDalby1993" class="citation journal"><a href="/wiki/Simon_Dalby" title="Simon Dalby">Dalby, Simon</a> (September 1993). "The 'Kiwi disease': geopolitical discourse in Aotearoa/New Zealand and the South Pacific". <i><a href="/wiki/Political_Geography_(journal)" title="Political Geography (journal)">Political Geography</a></i>. <b>12</b> (5): 437–456. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1016%2F0962-6298%2893%2990012-V">10.1016/0962-6298(93)90012-V</a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-266">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-266">^</a></b></span> <span class="reference-text"><cite class="citation journal">Callister, Paul (2004). <a rel="nofollow" class="external text" href="http://panz.rsnz.org/wp-content/uploads/2010/01/nzpr-vol-30-1and-2_callister.pdf">"Seeking an Ethnic Identity: Is "New Zealander" a Valid Ethnic Category?"</a> <span class="cs1-format">(PDF)</span>. <i>New Zealand Population Review</i>. <b>30</b> (1&amp;2): 5–22.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEBain200631-267">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEBain200631_267-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFBain2006">Bain 2006</a>, p.&#160;31.</span>
+ </li>
+ <li id="cite_note-268">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-268">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/~/media/Statistics/browse-categories/people-and-communities/households/review-ethnicity/draft-reportof-reviewo-official-ethnicity-standard.pdf">"Draft Report of a Review of the Official Ethnicity Statistical Standard: Proposals to Address the 'New Zealander' Response Issue"</a> <span class="cs1-format">(PDF)</span>. Statistics New Zealand. April 2009<span class="reference-accessdate">. Retrieved <span class="nowrap">18 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Pakeha-269">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-Pakeha_269-0">^</a></b></span> <span class="reference-text"><cite class="citation web">Ranford, Jodie. <a rel="nofollow" class="external text" href="http://maorinews.com/writings/papers/other/pakeha.htm">"<span class="cs1-kern-left">'</span>Pakeha', Its Origin and Meaning"</a>. Māori News<span class="reference-accessdate">. Retrieved <span class="nowrap">20 February</span> 2008</span>. <q>Originally the Pakeha were the early European settlers, however, today ‘Pakeha’ is used to describe any peoples of non-Maori or non-Polynesian heritage. Pakeha is not an ethnicity but rather a way to differentiate between the historical origins of our settlers, the Polynesians and the Europeans, the Maori and the other</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-270">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-270">^</a></b></span> <span class="reference-text"><cite class="citation book">Socidad Peruana de Medicina Intensiva (SOPEMI) (2000). <i>Trends in international migration: continuous reporting system on migration</i>. <a href="/wiki/Organisation_for_Economic_Co-operation_and_Development" class="mw-redirect" title="Organisation for Economic Co-operation and Development">Organisation for Economic Co-operation and Development</a>. pp.&#160;276–278.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-271">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-271">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Walrond, Carl (21 September 2007). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/dalmatians">"Dalmatians"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">30 April</span> 2010</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-272">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-272">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia"><a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/peoples">"Peoples"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i>. 2005<span class="reference-accessdate">. Retrieved <span class="nowrap">2 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Immigration_history-273">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Immigration_history_273-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Immigration_history_273-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (11 August 2015). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/history-of-immigration">"History of immigration"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-274">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-274">^</a></b></span> <span class="reference-text"><cite class="citation journal">Brawley, Sean (1993). <a rel="nofollow" class="external text" href="http://www.nzjh.auckland.ac.nz/docs/1993/NZJH_27_1_03.pdf">"<span class="cs1-kern-left">'</span>No White Policy in NZ': Fact and Fiction in New Zealand's Asian Immigration Record, 1946-1978"</a> <span class="cs1-format">(PDF)</span>. <i>New Zealand Journal of History</i>. <b>27</b> (1): 33–36<span class="reference-accessdate">. Retrieved <span class="nowrap">2 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Recent_immigration-275">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-Recent_immigration_275-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110511071208/http://www.dol.govt.nz/publications/research/sopemi/2009-2010/imo-2009-2010.pdf">"International Migration Outlook – New Zealand 2009/10"</a> <span class="cs1-format">(PDF)</span>. New Zealand Department of Labour. 2010. p.&#160;2. <a href="/wiki/International_Standard_Serial_Number" title="International Standard Serial Number">ISSN</a>&#160;<a rel="nofollow" class="external text" href="//www.worldcat.org/issn/1179-5085">1179-5085</a>. Archived from <a rel="nofollow" class="external text" href="http://www.dol.govt.nz/publications/research/sopemi/2009-2010/imo-2009-2010.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 11 May 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">16 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-276">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-276">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/birthplace.aspx">"2013 Census QuickStats about culture and identity – Birthplace and people born overseas"</a>. Statistics New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">29 August</span> 2014</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-277">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-277">^</a></b></span> <span class="reference-text"><cite class="citation journal">Butcher, Andrew; McGrath, Terry (2004). <a rel="nofollow" class="external text" href="http://ehlt.flinders.edu.au/education/iej/articles/v5n4/butcher/paper.pdf">"International Students in New Zealand: Needs and Responses"</a> <span class="cs1-format">(PDF)</span>. <i>International Education Journal</i>. <b>5</b> (4).</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-278">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-278">^</a></b></span> <span class="reference-text"><cite class="citation"><i>2013 Census QuickStats</i>, Statistics New Zealand, 2013, <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-478-40864-5" title="Special:BookSources/978-0-478-40864-5"><bdi>978-0-478-40864-5</bdi></a></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-SpokenLanguage-279">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-SpokenLanguage_279-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-SpokenLanguage_279-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-SpokenLanguage_279-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/languages.aspx">"2013 Census QuickStats about culture and identity – Languages spoken"</a>. <a href="/wiki/Statistics_New_Zealand" title="Statistics New Zealand">Statistics New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">8 September</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEHayMaclaganGordon200814-280">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEHayMaclaganGordon200814_280-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFHayMaclaganGordon2008">Hay, Maclagan &amp; Gordon 2008</a>, p.&#160;14.</span>
+ </li>
+ <li id="cite_note-281">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-281">^</a></b></span> <span class="reference-text">* <cite id="CITEREFBauerWarrenBardsleyKennedy2007" class="citation">Bauer, Laurie; Warren, Paul; Bardsley, Dianne; Kennedy, Marianna; Major, George (2007), <a rel="nofollow" class="external text" href="https://www.researchgate.net/publication/282778721_ILLUSTRATIONS_OF_THE_IPA_New_Zealand_English">"New Zealand English"</a>, <i>Journal of the International Phonetic Association</i>, <b>37</b> (1): 97–102, <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1017%2FS0025100306002830">10.1017/S0025100306002830</a></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Maori_language-282">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Maori_language_282-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Maori_language_282-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/the-new-zealanders/12">"The New Zealanders – Bicultural New Zealand"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-283">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-283">^</a></b></span> <span class="reference-text"><cite class="citation news">Squires, Nick (May 2005). <a rel="nofollow" class="external text" href="https://www.telegraph.co.uk/news/worldnews/australiaandthepacific/newzealand/1490814/British-influence-ebbs-as-New-Zealand-takes-to-talking-Maori.html">"British influence ebbs as New Zealand takes to talking Māori"</a>. <i>The Daily Telegraph</i><span class="reference-accessdate">. Retrieved <span class="nowrap">3 May</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-284">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-284">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/maori-language-week/waitangi-tribunal-claim">"Waitangi Tribunal claim – Māori Language Week"</a>. Ministry for Culture and Heritage. July 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">19 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-tereoMaori-285">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-tereoMaori_285-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/people_and_communities/maori/te-kupenga/use-te-reo-infographic-english.aspx">"Ngā puna kōrero: Where Māori speak te reo – infographic"</a>. Statistics New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">8 September</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-287">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-287">^</a></b></span> <span class="reference-text"><cite class="citation news">Drinnan, John (8 July 2016). <a rel="nofollow" class="external text" href="http://www.nzherald.co.nz/business/news/article.cfm?c_id=3&amp;objectid=11670518">"<span class="cs1-kern-left">'</span>Maori' will remain in the name Maori Television"</a>. <i>New Zealand Herald</i><span class="reference-accessdate">. Retrieved <span class="nowrap">28 August</span> 2016</span>. <q>According to 2015 figures supplied by Maori TV, its two channels broadcast an average of 72 per cent Maori language content - 59 per cent on the main channel and 99 per cent on te reo.</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-288">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-288">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1998/0097/latest/DLM429090.html">"Ngāi Tahu Claims Settlement Act 1998"</a>. New Zealand Parliamentary Counsel Office. 20 May 2014 [1 October 1998]<span class="reference-accessdate">. Retrieved <span class="nowrap">10 March</span> 2019</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-290">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-290">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/2006/0018/latest/DLM372754.html">New Zealand Sign Language Act 2006 No 18 (as at 30 June 2008), Public Act</a>. New Zealand Parliamentary Counsel Office. Retrieved 29 November 2011.</span>
+ </li>
+ <li id="cite_note-291">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-291">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/Phil_Zuckerman" title="Phil Zuckerman">Zuckerman, Phil</a> (2006). Martin, Michael (ed.). <a rel="nofollow" class="external text" href="http://pdfs.semanticscholar.org/f379/ed99e57782aca6391ef5f666da7ba41f1333.pdf"><i>The Cambridge Companion to Atheism</i></a> <span class="cs1-format">(PDF)</span>. Cambridge University Press. pp.&#160;47–66. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-521-84270-9" title="Special:BookSources/978-0-521-84270-9"><bdi>978-0-521-84270-9</bdi></a><span class="reference-accessdate">. Retrieved <span class="nowrap">8 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-292">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-292">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Walrond, Carl (May 2012). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/atheism-and-secularism/page-3">"Atheism and secularism – Who is secular?"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">8 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-2013religiouscommentary-294">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-2013religiouscommentary_294-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-2013religiouscommentary_294-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.stats.govt.nz/information-releases/2018-census-totals-by-topic-national-highlights">"2013 Census QuickStats about culture and identity – Religious affiliation"</a>. Statistics New Zealand. 15 April 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">25 July</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-2013statstables-295">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-2013statstables_295-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-2013statstables_295-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-2013statstables_295-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://archive.stats.govt.nz/Census/2013-census/profile-and-summary-reports/quickstats-culture-identity/tables.aspx">"2013 Census QuickStats about culture and identity – tables"</a>. Statistics New Zealand. 15 April 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">14 April</span> 2018</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" /><a rel="nofollow" class="external text" href="http://archive.stats.govt.nz/~/media/Statistics/Census/2013%20Census/profile-and-summary-reports/quickstats-culture-identity/tables.xls">Excel download</a>
+ </li>
+ <li id="cite_note-296">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-296">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Kaa, Hirini (May 2011). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/nga-hahi-maori-and-christian-denominations/page-7">"Māori and Christian denominations"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">20 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-297">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-297">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Morris, Paul (May 2011). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/diverse-religions">"Diverse religions"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">20 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Education_Stats-298">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Education_Stats_298-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Education_Stats_298-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web">Dench, Olivia (July 2010). <a rel="nofollow" class="external text" href="http://www.educationcounts.govt.nz/publications/ECE/2507/80221">"Education Statistics of New Zealand: 2009"</a>. Education Counts<span class="reference-accessdate">. Retrieved <span class="nowrap">19 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-299">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-299">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1989/0080/latest/DLM177440.html">"Education Act 1989 No 80"</a>. New Zealand Parliamentary Counsel Office. 1989. Section 3<span class="reference-accessdate">. Retrieved <span class="nowrap">5 January</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-EducationAct1989-300">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-EducationAct1989_300-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.legislation.govt.nz/act/public/1989/0080/latest/DLM183668.html">"Education Act 1989 No 80 (as at 01 February 2011), Public Act. Part 14: Establishment and disestablishment of tertiary institutions, Section 62: Establishment of institutions"</a>. <i>Education Act 1989 No 80</i>. New Zealand Parliamentary Counsel Office. 1 February 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">15 August</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZQA-301">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-NZQA_301-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzqa.govt.nz/studying-in-new-zealand/tertiary-education">"Studying in New Zealand: Tertiary education"</a>. New Zealand Qualifications Authority<span class="reference-accessdate">. Retrieved <span class="nowrap">15 August</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-TertiaryEdStats-302">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-TertiaryEdStats_302-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20081015143050/http://www.educationcounts.govt.nz/__data/assets/excel_doc/0007/17836/Education_attainment_of_the_population.xls">"Educational attainment of the population"</a>. Education Counts. 2006. Archived from <a rel="nofollow" class="external text" href="http://www.educationcounts.govt.nz/__data/assets/excel_doc/0007/17836/Education_attainment_of_the_population.xls">the original</a> <span class="cs1-format">(xls)</span> on 15 October 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">21 February</span> 2008</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-303">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-303">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.oecd.org/dataoecd/54/12/46643496.pdf">"What Students Know and Can Do: Student Performance in Reading, Mathematics and Science 2010"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />OECD. Retrieved 21 July 2012.
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007398-304">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEKennedy2007398_304-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&#160;398.</span>
+ </li>
+ <li id="cite_note-305">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-305">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Hearn, Terry (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/english/">"English – Importance and influence"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-306">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-306">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/home-away-from-home/conclusions">"Conclusions – British and Irish immigration"</a>. Ministry for Culture and Heritage. March 2007<span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-307">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-307">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Stenhouse, John (November 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/religion-and-society/4">"Religion and society – Māori religion"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-308">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-308">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.justice.govt.nz/publications/publications-archived/2001/he-hinatore-ki-te-ao-maori-a-glimpse-into-the-maori-world/part-1-traditional-maori-concepts/maori-social-structures">"Māori Social Structures"</a>. Ministry of Justice. March 2001<span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-309">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-309">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.radionz.co.nz/international/pacific-news/327424/thousands-turn-out-for-pasifika-festival">"Thousands turn out for Pasifika Festival"</a>. <i><a href="/wiki/Radio_New_Zealand" title="Radio New Zealand">Radio New Zealand</a></i>. 25 March 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">18 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007400-310">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEKennedy2007400_310-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&#160;400.</span>
+ </li>
+ <li id="cite_note-FOOTNOTEKennedy2007399-311">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEKennedy2007399_311-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFKennedy2007">Kennedy 2007</a>, p.&#160;399.</span>
+ </li>
+ <li id="cite_note-312">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-312">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/the-new-zealanders/10">"The New Zealanders – Post-war New Zealanders"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-313">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-313">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/the-new-zealanders/11">"The New Zealanders – Ordinary blokes and extraordinary sheilas"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-314">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-314">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/rural-mythologies/5">"Rural mythologies – The cult of the pioneer"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-315">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-315">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Barker, Fiona (June 2012). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/new-zealand-identity/page-6">"New Zealand identity – Culture and arts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">7 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Wilson2016-316">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Wilson2016_316-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Wilson2016_316-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (September 2016). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/nation-and-government/page-9">"Nation and government – Nationhood and identity"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">3 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Creative-317">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Creative_317-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Creative_317-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/2">"Creative life – Visual arts and crafts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-318">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-318">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-art/4"><i>Elements of Carving</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-319">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-319">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-art/5"><i>Surface Patterns</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-320">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-320">^</a></b></span> <span class="reference-text"><cite class="citation journal">McKay, Bill (2004). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110513145228/http://www.library.uq.edu.au/ojs/index.php/fab/article/viewFile/108/126">"Māori architecture: transforming western notions of architecture"</a>. <i>Fabrications</i>. <b>14</b> (1&amp;2): 1–12. <a href="/wiki/Digital_object_identifier" title="Digital object identifier">doi</a>:<a rel="nofollow" class="external text" href="//doi.org/10.1080%2F10331867.2004.10525189">10.1080/10331867.2004.10525189</a>. Archived from <a rel="nofollow" class="external text" href="http://www.library.uq.edu.au/ojs/index.php/fab/article/viewFile/108/126">the original</a> on 13 May 2011.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-321">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-321">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-art/8"><i>Painted Designs</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-322">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-322">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-art/9"><i>Tattooing</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-beginnings-323">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-beginnings_323-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-beginnings_323-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/nz-painting-history/beginnings">"Beginnings – history of NZ painting"</a>. Ministry for Culture and Heritage. December 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-324">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-324">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/nz-painting-history/a-new-new-zealand-art">"A new New Zealand art – history of NZ painting"</a>. Ministry for Culture and Heritage. November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">16 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-325">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-325">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/nz-painting-history/contemporary-maori-art">"Contemporary Maori art"</a>. Ministry for Culture and Heritage. November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">16 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-326">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-326">^</a></b></span> <span class="reference-text"><cite class="citation web">Rauer, Julie. <a rel="nofollow" class="external text" href="http://www.asianart.com/exhibitions/paradise/article.html">"Paradise Lost: Contemporary Pacific Art At The Asia Society"</a>. Asia Society and Museum<span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-327">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-327">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-art/10"><i>Textile Designs</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-328">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-328">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Keane, Basil (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/pounamu-jade-or-greenstone/4">"Pounamu – jade or greenstone – Implements and adornment"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-329">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-329">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Wilson, John (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/society/9">"Society – Food, drink and dress"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">17 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-330">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-330">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/3">"Creative life – Design and fashion"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-The_Economist_print_edition-331">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-The_Economist_print_edition_331-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-The_Economist_print_edition_331-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.economist.com/displayStory.cfm?Story_ID=E1_TDSGGNTD">"Fashion in New Zealand – New Zealand's fashion industry"</a>. <i>The Economist</i>. 28 February 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">6 August</span> 2009</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-332">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-332">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/6">"Creative life – Writing and publishing"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-333">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-333">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/literature-in-new-zealand-1930-1960">"The making of New Zealand literature"</a>. Ministry for Culture and Heritage. November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-334">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-334">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/literature-1940-60/1930s">"New directions in the 1930s – New Zealand literature"</a>. Ministry for Culture and Heritage. August 2008<span class="reference-accessdate">. Retrieved <span class="nowrap">12 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-335">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-335">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/culture/nz-literature/the-growth-of-publishing">"The war and beyond – New Zealand literature"</a>. Ministry for Culture and Heritage. November 2007<span class="reference-accessdate">. Retrieved <span class="nowrap">12 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-336">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-336">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.unesco.org/new/en/media-services/single-view/news/28_cities_join_the_unesco_creative_cities_network/back/9597/#.VPojtC6RNiR">"28 cities join the UNESCO Creative Cities Network"</a>. UNESCO. December 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">7 March</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-music-337">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-music_337-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-music_337-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/7">"Creative life – Music"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-338">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-338">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [originally published in 1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-music/1"><i>Maori Music</i></a>. <a href="/wiki/An_Encyclopaedia_of_New_Zealand" title="An Encyclopaedia of New Zealand">An Encyclopaedia of New Zealand</a><span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-339">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-339">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-music/6"><i>Musical Instruments</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">16 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-340">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-340">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/maori-music/7"><i>Instruments Used for Non-musical Purposes</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">16 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-341">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-341">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/music/1"><i>Music: General History</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">15 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-342">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-342">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/music/3"><i>Music: Brass Bands</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">14 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-343">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-343">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">McLintock, Alexander, ed. (April 2009) [1966]. <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/1966/music/7"><i>Music: Pipe Bands</i></a>. An Encyclopaedia of New Zealand<span class="reference-accessdate">. Retrieved <span class="nowrap">14 April</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-344">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-344">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/8">"Creative life – Performing arts"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-345">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-345">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110914072406/http://rianz.org.nz/awards2008/history.asp">"History – celebrating our music since 1965"</a>. <a href="/wiki/Recording_Industry_Association_of_New_Zealand" class="mw-redirect" title="Recording Industry Association of New Zealand">Recording Industry Association of New Zealand</a>. 2008. Archived from <a rel="nofollow" class="external text" href="http://rianz.org.nz/awards2008/history.asp">the original</a> on 14 September 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">23 January</span> 2012</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-346">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-346">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20111221160800/http://www.rianz.org.nz/rianz/rianz_about.asp">"About RIANZ – Introduction"</a>. Recording Industry Association of New Zealand. Archived from <a rel="nofollow" class="external text" href="http://www.rianz.org.nz/rianz/rianz_about.asp">the original</a> on 21 December 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">23 January</span> 2012</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-347">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-347">^</a></b></span> <span class="reference-text"><cite class="citation news">Downes, Siobhan (1 January 2017). <a rel="nofollow" class="external text" href="http://www.stuff.co.nz/travel/destinations/nz/87903487/world-famous-in-new-zealand-hobbiton-movie-set">"World famous in New Zealand: Hobbiton Movie Set"</a>. Stuff Travel<span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-348">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-348">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Brian, Pauling (October 2014). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/radio/page-1">"Radio – The early years, 1921 to 1932"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-349">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-349">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://nzhistory.govt.nz/first-official-tv-broadcast">"New Zealand's first official TV broadcast"</a>. Ministry for Culture and Heritage. December 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">6 July</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-NZ_TV-350">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-NZ_TV_350-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NZ_TV_350-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Swarbrick, Nancy (June 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/creative-life/5">"Creative life – Film and broadcasting"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-351">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-351">^</a></b></span> <span class="reference-text"><cite class="citation web">Horrocks, Roger. <a rel="nofollow" class="external text" href="https://www.nzonscreen.com/history">"A History of Television in New Zealand"</a>. <a href="/wiki/NZ_On_Screen" title="NZ On Screen">NZ On Screen</a><span class="reference-accessdate">. Retrieved <span class="nowrap">13 September</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-352">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-352">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.flicks.co.nz/blog/list/top-10-highest-grossing-new-zealand-movies-ever/">"Top 10 Highest Grossing New Zealand Movies Ever"</a>. Flicks.co.nz. May 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-353">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-353">^</a></b></span> <span class="reference-text"><cite class="citation news">Cieply, Michael; Rose, Jeremy (October 2010). <a rel="nofollow" class="external text" href="https://www.nytimes.com/2010/10/28/business/media/28hobbit.html">"New Zealand Bends and 'Hobbit' Stays"</a>. <i>The New York Times</i><span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-354">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-354">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20101107112931/http://www.filmnz.com/production-guide/locations.html">"Production Guide: Locations"</a>. Film New Zealand. Archived from <a rel="nofollow" class="external text" href="http://www.filmnz.com/production-guide/locations.html">the original</a> on 7 November 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">21 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-355">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-355">^</a></b></span> <span class="reference-text"><cite class="citation report">Myllylahti, Merja (December 2016). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170521074651/http://www.aut.ac.nz/__data/assets/pdf_file/0019/704053/JMAD-Report-2016.pdf">JMAD New Zealand Media Ownership Report 2016</a> <span class="cs1-format">(PDF)</span> (Report). <a href="/wiki/Auckland_University_of_Technology" title="Auckland University of Technology">Auckland University of Technology</a>. pp.&#160;4–29. Archived from <a rel="nofollow" class="external text" href="http://www.aut.ac.nz/__data/assets/pdf_file/0019/704053/JMAD-Report-2016.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 21 May 2017<span class="reference-accessdate">. Retrieved <span class="nowrap">11 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-356">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-356">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://freedomhouse.org/sites/default/files/FOTP2015%20Scores%20and%20Status%201980-2015.xls">"Scores and Status Data 1980-2015"</a>. <i>Freedom of the Press 2015</i>. Freedom House<span class="reference-accessdate">. Retrieved <span class="nowrap">23 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-357">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-357">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Hearn, Terry (March 2009). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/english/12">"English – Popular culture"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2012</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-358">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-358">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110607011003/http://www2.stats.govt.nz/domino/external/web/nzstories.nsf/0/479c4ffcbb884149cc256b1f00001198?OpenDocument">"Sport, Fitness and Leisure"</a>. <i>New Zealand Official Yearbook</i>. Statistics New Zealand. 2000. Archived from <a rel="nofollow" class="external text" href="http://www2.stats.govt.nz/domino/external/web/nzstories.nsf/0/479c4ffcbb884149cc256b1f00001198?OpenDocument">the original</a> on 7 June 2011<span class="reference-accessdate">. Retrieved <span class="nowrap">21 July</span> 2008</span>. <q>Traditionally New Zealanders have excelled in rugby union, which is regarded as the national sport, and track and field athletics.</q></cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-Organised_Sport-359">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-Organised_Sport_359-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Organised_Sport_359-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation encyclopaedia">Phillips, Jock (February 2011). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/sports-and-leisure/4">"Sports and leisure – Organised sports"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">23 March</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-nzsssc-360">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-nzsssc_360-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-nzsssc_360-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://www.sportsground.co.nz/Article.asp?SiteID=19259&amp;ArticleID=44316">"More and more students wear school sports colours"</a>. New Zealand Secondary School Sports Council<span class="reference-accessdate">. Retrieved <span class="nowrap">30 March</span> 2015</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-361">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-361">^</a></b></span> <span class="reference-text"><cite class="citation book">Crawford, Scott (January 1999). "Rugby and the Forging of National Identity". In Nauright, John (ed.). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20120119025021/http://www.la84foundation.org/SportsLibrary/ASSHSSH/ASSHSSH11.pdf"><i>Sport, Power And Society In New Zealand: Historical And Contemporary Perspectives</i></a> <span class="cs1-format">(PDF)</span>. ASSH Studies In Sports History. Archived from <a rel="nofollow" class="external text" href="http://www.la84foundation.org/SportsLibrary/ASSHSSH/ASSHSSH11.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 19 January 2012<span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-362">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-362">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.nzhistory.net.nz/media/photo/rugby-racing-and-beer">"Rugby, racing and beer"</a>. Ministry for Culture and Heritage. August 2010<span class="reference-accessdate">. Retrieved <span class="nowrap">22 January</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-363">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-363">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Derby, Mark (December 2010). <a rel="nofollow" class="external text" href="http://www.TeAra.govt.nz/en/maori-pakeha-relations/4">"Māori–Pākehā relations – Sports and race"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 February</span> 2011</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-FOOTNOTEBain200669-364">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEBain200669_364-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFBain2006">Bain 2006</a>, p.&#160;69.</span>
+ </li>
+ <li id="cite_note-365">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-365">^</a></b></span> <span class="reference-text"><cite class="citation thesis">Langton, Graham (1996). <a rel="nofollow" class="external text" href="https://ir.canterbury.ac.nz/handle/10092/3549"><i>A history of mountain climbing in New Zealand to 1953</i></a> (Thesis). Christchurch: University of Canterbury. p.&#160;28<span class="reference-accessdate">. Retrieved <span class="nowrap">12 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-366">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-366">^</a></b></span> <span class="reference-text"><cite class="citation news"><a rel="nofollow" class="external text" href="http://news.theage.com.au/national/world-mourns-sir-edmund-hillary-20080111-1ldx.html">"World mourns Sir Edmund Hillary"</a>. <i>The Age</i>. Melbourne. 11 January 2008.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-SportsParticipation-367">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-SportsParticipation_367-0">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20150115065459/http://www.activenzsurvey.org.nz/Documents/Participation-Levels.pdf">"Sport and Recreation Participation Levels"</a> <span class="cs1-format">(PDF)</span>. <a href="/wiki/Sport_New_Zealand" title="Sport New Zealand">Sport and Recreation New Zealand</a>. 2009. Archived from <a rel="nofollow" class="external text" href="http://www.activenzsurvey.org.nz/Documents/Participation-Levels.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 15 January 2015<span class="reference-accessdate">. Retrieved <span class="nowrap">27 November</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-368">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-368">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Barclay-Kerr, Hoturoa (September 2013). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/waka-ama-outrigger-canoeing">"Waka ama – outrigger canoeing"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">12 August</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-369">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-369">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://nzhistory.govt.nz/culture/olympics/overview">"NZ's first Olympic century"</a>. Ministry for Culture and Heritage. August 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">27 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-370">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-370">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/olympics.aspx">"London 2012 Olympic Games: Medal strike rate – Final count (revised)"</a>. Statistics New Zealand. 14 August 2012<span class="reference-accessdate">. Retrieved <span class="nowrap">4 December</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-371">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-371">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.stats.govt.nz/browse_for_stats/population/estimates_and_projections/olympics-2016.aspx">"Rio 2016 Olympic Games: Medals per capita"</a>. Statistics New Zealand. 30 August 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">27 April</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-372">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-372">^</a></b></span> <span class="reference-text"><cite class="citation news">Kerr, James (14 November 2013). <a rel="nofollow" class="external text" href="https://www.telegraph.co.uk/men/active/10427619/The-All-Blacks-guide-to-being-successful-off-the-field.html">"The All Blacks guide to being successful (off the field)"</a>. <i>The Daily Telegraph</i>. London<span class="reference-accessdate">. Retrieved <span class="nowrap">4 December</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-373">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-373">^</a></b></span> <span class="reference-text"><cite class="citation news">Fordyce, Tom (23 October 2011). <a rel="nofollow" class="external text" href="https://www.bbc.com/sport/0/rugby-union/15405316">"2011 Rugby World Cup final: New Zealand 8-7 France"</a>. <i>BBC Sport</i><span class="reference-accessdate">. Retrieved <span class="nowrap">4 December</span> 2013</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-cuisine-374">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-cuisine_374-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-cuisine_374-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.tourism.net.nz/new-zealand/nz/cuisine-and-dining">"New Zealand Cuisine"</a>. New Zealand Tourism Guide. January 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">4 January</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-375">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-375">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Petrie, Hazel (November 2008). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/kai-pakeha-introduced-foods">"Kai Pākehā – introduced foods"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">27 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-376">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-376">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Whaanga, Mere (June 2006). <a rel="nofollow" class="external text" href="https://teara.govt.nz/en/mataitai-shellfish-gathering/page-6">"Mātaitai – shellfish gathering"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">27 June</span> 2017</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-377">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-377">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia"><a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/shellfish">"Story: Shellfish"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">29 August</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-378">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-378">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Burton, David (September 2013). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/cooking/page-2">"Cooking – Cooking methods"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">11 December</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li id="cite_note-379">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-379">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia">Royal, Charles; Kaka-Scott, Jenny (September 2013). <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/en/maori-foods-kai-maori/page-4">"Māori foods – kai Māori"</a>. <i>Te Ara: The Encyclopedia of New Zealand</i><span class="reference-accessdate">. Retrieved <span class="nowrap">1 September</span> 2016</span>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ </ol>
+ </div>
+ <h2>
+ <span class="mw-headline" id="References">References</span>
+ </h2>
+ <div class="refbegin columns references-column-width" style="-moz-column-width: 30em; -webkit-column-width: 30em; column-width: 30em;">
+ <ul>
+ <li>
+ <cite class="citation book">Alley, Roderic (2008). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=VEa-0PKh__oC"><i>New Zealand in World Affairs IV 1990–2005</i></a>. New Zealand: Victoria University Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-864-73548-5" title="Special:BookSources/978-0-864-73548-5"><bdi>978-0-864-73548-5</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFBain2006" class="citation book">Bain, Carolyn (2006). <i>New Zealand</i>. Lonely Planet. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/1-74104-535-5" title="Special:BookSources/1-74104-535-5"><bdi>1-74104-535-5</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFGarden2005" class="citation book">Garden, Donald (2005). Stoll, Mark (ed.). <i>Australia, New Zealand, and the Pacific: An Environmental History</i>. Nature and Human Societies. ABC-CLIO/Greenwood. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-57607-868-6" title="Special:BookSources/978-1-57607-868-6"><bdi>978-1-57607-868-6</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFHayMaclaganGordon2008" class="citation book">Hay, Jennifer; Maclagan, Margaret; Gordon, Elizabeth (2008). <i>Dialects of English: New Zealand English</i>. Edinburgh University Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-7486-2529-1" title="Special:BookSources/978-0-7486-2529-1"><bdi>978-0-7486-2529-1</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFKennedy2007" class="citation book">Kennedy, Jeffrey (2007). "Leadership and Culture in New Zealand". In Chhokar, Jagdeep; Brodbeck, Felix; House, Robert (eds.). <i>Culture and Leadership Across the World: The GLOBE Book of In-Depth Studies of 25 Societies</i>. United States: Psychology Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-8058-5997-3" title="Special:BookSources/978-0-8058-5997-3"><bdi>978-0-8058-5997-3</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFKing2003" class="citation book"><a href="/wiki/Michael_King" title="Michael King">King, Michael</a> (2003). <i>The Penguin History of New Zealand</i>. New Zealand: Penguin Books. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-14-301867-4" title="Special:BookSources/978-0-14-301867-4"><bdi>978-0-14-301867-4</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFMein_Smith2005" class="citation book">Mein Smith, Philippa (2005). <i>A Concise History of New Zealand</i>. Australia: Cambridge University Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-521-54228-6" title="Special:BookSources/0-521-54228-6"><bdi>0-521-54228-6</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite id="CITEREFSmeltJui_Lin2009" class="citation book">Smelt, Roselynn; Jui Lin, Yong (2009). <i>New Zealand</i>. Cultures of the World (2nd ed.). New York: <a href="/wiki/Marshall_Cavendish" title="Marshall Cavendish">Marshall Cavendish</a>. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-7614-3415-3" title="Special:BookSources/978-0-7614-3415-3"><bdi>978-0-7614-3415-3</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ </ul>
+ </div>
+ <h2>
+ <span class="mw-headline" id="Further_reading">Further reading</span>
+ </h2>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886047268" />
+ <div class="refbegin" style="">
+ <ul>
+ <li>
+ <cite class="citation book">Bateman, David, ed. (2005). <i>Bateman New Zealand Encyclopedia</i> (6th ed.). <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/1-86953-601-0" title="Special:BookSources/1-86953-601-0"><bdi>1-86953-601-0</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>
+ <cite class="citation book"><a href="/wiki/Keith_Sinclair" title="Keith Sinclair">Sinclair, Keith</a>; revised by Dalziel, Raewyn (2000). <i>A History of New Zealand</i>. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-0-14-029875-8" title="Special:BookSources/978-0-14-029875-8"><bdi>978-0-14-029875-8</bdi></a>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" />
+ </li>
+ <li>Statistics New Zealand. <i>New Zealand Official Yearbook</i> (annual).
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886058088" /><a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/1-86953-776-9" title="Special:BookSources/1-86953-776-9">1-86953-776-9</a> (2010).
+ </li>
+ </ul>
+ </div>
+ <h2>
+ <span class="mw-headline" id="External_links">External links</span>
+ </h2>
+ <div role="navigation" aria-labelledby="sister-projects" class="metadata plainlinks sistersitebox plainlist mbox-small" style="border:1px solid #aaa; padding:0; background:#f9f9f9;">
+ <div style="padding: 0.75em 0; text-align: center;">
+ <b style="display:block;">New Zealand</b>at Wikipedia's <a href="/wiki/Wikipedia:Wikimedia_sister_projects" title="Wikipedia:Wikimedia sister projects"><span id="sister-projects">sister projects</span></a>
+ </div>
+ <ul style="border-top:1px solid #aaa; padding: 0.75em 0; width:217px; margin:0 auto;">
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/0/06/Wiktionary-logo-v2.svg/27px-Wiktionary-logo-v2.svg.png" decoding="async" width="27" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/en/thumb/0/06/Wiktionary-logo-v2.svg/41px-Wiktionary-logo-v2.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/0/06/Wiktionary-logo-v2.svg/54px-Wiktionary-logo-v2.svg.png 2x" data-file-width="391" data-file-height="391" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wiktionary.org/wiki/Special:Search/New_Zealand" class="extiw" title="wikt:Special:Search/New Zealand">Definitions</a> from Wiktionary</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/20px-Commons-logo.svg.png" decoding="async" width="20" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/40px-Commons-logo.svg.png 2x" data-file-width="1024" data-file-height="1376" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://commons.wikimedia.org/wiki/Special:Search/New_Zealand" class="extiw" title="c:Special:Search/New Zealand">Media</a> from Wikimedia Commons</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/2/24/Wikinews-logo.svg/27px-Wikinews-logo.svg.png" decoding="async" width="27" height="15" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/24/Wikinews-logo.svg/41px-Wikinews-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/24/Wikinews-logo.svg/54px-Wikinews-logo.svg.png 2x" data-file-width="759" data-file-height="415" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikinews.org/wiki/Special:Search/New_Zealand" class="extiw" title="n:Special:Search/New Zealand">News</a> from Wikinews</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikiquote-logo.svg/23px-Wikiquote-logo.svg.png" decoding="async" width="23" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikiquote-logo.svg/35px-Wikiquote-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikiquote-logo.svg/46px-Wikiquote-logo.svg.png 2x" data-file-width="300" data-file-height="355" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikiquote.org/wiki/Special:Search/New_Zealand" class="extiw" title="q:Special:Search/New Zealand">Quotations</a> from Wikiquote</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/26px-Wikisource-logo.svg.png" decoding="async" width="26" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/39px-Wikisource-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/51px-Wikisource-logo.svg.png 2x" data-file-width="410" data-file-height="430" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikisource.org/wiki/Special:Search/New_Zealand" class="extiw" title="s:Special:Search/New Zealand">Texts</a> from Wikisource</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikibooks-logo.svg/27px-Wikibooks-logo.svg.png" decoding="async" width="27" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikibooks-logo.svg/41px-Wikibooks-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Wikibooks-logo.svg/54px-Wikibooks-logo.svg.png 2x" data-file-width="300" data-file-height="300" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikibooks.org/wiki/Special:Search/New_Zealand" class="extiw" title="b:Special:Search/New Zealand">Textbooks</a> from Wikibooks</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/27px-Wikivoyage-Logo-v3-icon.svg.png" decoding="async" width="27" height="27" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/41px-Wikivoyage-Logo-v3-icon.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/54px-Wikivoyage-Logo-v3-icon.svg.png 2x" data-file-width="193" data-file-height="193" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikivoyage.org/wiki/New_Zealand#Q664" class="extiw" title="voy:New Zealand">Travel guide</a> from Wikivoyage</span>
+ </li>
+ <li style="min-height: 31px;">
+ <span style="display: inline-block; width: 31px; line-height: 31px; vertical-align: middle; text-align: center;"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Wikiversity-logo-en.svg/27px-Wikiversity-logo-en.svg.png" decoding="async" width="27" height="24" style="vertical-align: middle" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Wikiversity-logo-en.svg/41px-Wikiversity-logo-en.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Wikiversity-logo-en.svg/54px-Wikiversity-logo-en.svg.png 2x" data-file-width="1000" data-file-height="900" /></span><span style="display: inline-block; margin-left: 4px; width: 182px; vertical-align: middle;"><a href="https://en.wikiversity.org/wiki/Special:Search/New_Zealand" class="extiw" title="v:Special:Search/New Zealand">Resources</a> from Wikiversity</span>
+ </li>
+ </ul>
+ </div>
+ <dl>
+ <dt>
+ Government
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" class="external text" href="https://www.govt.nz/">New Zealand Government portal</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.mch.govt.nz/">Ministry for Culture and Heritage</a> – includes information on flag, anthems and coat of arms
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.stats.govt.nz/">Statistics New Zealand</a>
+ </li>
+ </ul>
+ <dl>
+ <dt>
+ Travel
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.newzealand.com/int/">Official site of New Zealand Tourism</a>
+ </li>
+ </ul>
+ <dl>
+ <dt>
+ General Information
+ </dt>
+ </dl>
+ <ul>
+ <li>
+ <a rel="nofollow" class="external text" href="https://www.cia.gov/library/publications/the-world-factbook/geos/nz.html">New Zealand</a> entry from <i><a href="/wiki/The_World_Factbook" title="The World Factbook">The World Factbook</a></i>. <a href="/wiki/Central_Intelligence_Agency" title="Central Intelligence Agency">Central Intelligence Agency</a>.
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="https://curlie.org/Regional/Oceania/New_Zealand">New Zealand</a> at <a href="/wiki/Curlie" class="mw-redirect" title="Curlie">Curlie</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="https://www.bbc.co.uk/news/world-asia-pacific-15357770">New Zealand</a> from <a href="/wiki/BBC_News" title="BBC News">BBC News</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.teara.govt.nz/">Te Ara: The Encyclopedia of New Zealand</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.oecd.org/newzealand/">New Zealand</a> <a href="/wiki/Organisation_for_Economic_Co-operation_and_Development" class="mw-redirect" title="Organisation for Economic Co-operation and Development">OECD</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="https://web.archive.org/web/20080607085330/http://ucblibraries.colorado.edu/govpubs/for/newzealand.htm">New Zealand</a>, directory from <i>UCB Libraries GovPubs</i>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.britannica.com/EBchecked/topic/412636/New-Zealand">New Zealand</a> at <i><a href="/wiki/Encyclop%C3%A6dia_Britannica" title="Encyclopædia Britannica">Encyclopædia Britannica</a></i>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.metservice.co.nz/">New Zealand weather</a>
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="http://www.ifs.du.edu/ifs/frm_CountryProfile.aspx?Country=NZ">Key Development Forecasts for New Zealand</a> from <a href="/wiki/International_Futures" title="International Futures">International Futures</a>
+ </li>
+ <li>
+ <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/16px-Gnome-globe.svg.png" decoding="async" width="16" height="16" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/24px-Gnome-globe.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Gnome-globe.svg/32px-Gnome-globe.svg.png 2x" data-file-width="48" data-file-height="48" /> <a href="https://commons.wikimedia.org/wiki/Atlas_of_New_Zealand" class="extiw" title="commons:Atlas of New Zealand">Wikimedia Atlas of New Zealand</a>
+ </li>
+ </ul>
+ <div role="navigation" class="navbox" aria-labelledby="New_Zealand_articles" style="padding:3px">
+ <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:New_Zealand_topics" title="Template:New Zealand topics"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:New_Zealand_topics" title="Template talk:New Zealand topics"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:New_Zealand_topics&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="New_Zealand_articles" style="font-size:114%;margin:0 4em">
+ <a class="mw-selflink selflink">New Zealand</a>&#160;articles
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/History_of_New_Zealand" title="History of New Zealand">History</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Timeline_of_New_Zealand_history" title="Timeline of New Zealand history">Timeline</a>
+ </li>
+ <li>
+ <a href="/wiki/Military_history_of_New_Zealand" title="Military history of New Zealand">Military history</a>
+ </li>
+ <li>
+ <a href="/wiki/Archaeology_of_New_Zealand" title="Archaeology of New Zealand">Archaeology</a>
+ </li>
+ <li>
+ <a href="/wiki/M%C4%81ori_history" title="Māori history">Māori history</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Treaty_of_Waitangi" title="Treaty of Waitangi">Treaty of Waitangi</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_Wars" title="New Zealand Wars">New Zealand Wars</a>
+ </li>
+ <li>
+ <a href="/wiki/Women%27s_suffrage_in_New_Zealand" title="Women's suffrage in New Zealand">Women's suffrage</a>
+ </li>
+ <li>
+ <a href="/wiki/Timeline_of_New_Zealand%27s_links_with_Antarctica" title="Timeline of New Zealand's links with Antarctica">New Zealand and Antarctica</a>
+ </li>
+ <li>
+ <a href="/wiki/Colony_of_New_Zealand" title="Colony of New Zealand">Colony</a>
+ </li>
+ <li>
+ <a href="/wiki/Dominion_of_New_Zealand" title="Dominion of New Zealand">Dominion</a>
+ </li>
+ <li>
+ <a href="/wiki/Independence_of_New_Zealand" title="Independence of New Zealand">Independence</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Geography_of_New_Zealand" title="Geography of New Zealand">Geography</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Biodiversity_of_New_Zealand" title="Biodiversity of New Zealand">Biodiversity</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_caves_in_New_Zealand" title="List of caves in New Zealand">Caves</a>
+ </li>
+ <li>
+ <a href="/wiki/Climate_of_New_Zealand" title="Climate of New Zealand">Climate</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_earthquakes_in_New_Zealand" title="List of earthquakes in New Zealand">Earthquakes</a>
+ </li>
+ <li>
+ <a href="/wiki/Environment_of_New_Zealand" title="Environment of New Zealand">Environment</a>
+ </li>
+ <li>
+ <a href="/wiki/Geology_of_New_Zealand" title="Geology of New Zealand">Geology</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_islands_of_New_Zealand" title="List of islands of New Zealand">Islands</a>
+ <ul>
+ <li>
+ <a href="/wiki/North_Island" title="North Island">North Island</a>
+ </li>
+ <li>
+ <a href="/wiki/South_Island" title="South Island">South Island</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Lakes_of_New_Zealand" title="Lakes of New Zealand">Lakes</a>
+ </li>
+ <li>
+ <a href="/wiki/Marine_reserves_of_New_Zealand" title="Marine reserves of New Zealand">Marine reserves</a>
+ </li>
+ <li>
+ <a href="/wiki/National_parks_of_New_Zealand" title="National parks of New Zealand">National parks</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_rivers_of_New_Zealand" title="List of rivers of New Zealand">Rivers</a>
+ </li>
+ <li>
+ <a href="/wiki/Time_in_New_Zealand" title="Time in New Zealand">Time zones</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;padding-left:0.5em;padding-right:0.5em;font-weight:normal;">
+ <a href="/wiki/List_of_cities_in_New_Zealand" title="List of cities in New Zealand">Cities</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Auckland" title="Auckland">Auckland</a>
+ </li>
+ <li>
+ <a href="/wiki/Christchurch" title="Christchurch">Christchurch</a>
+ </li>
+ <li>
+ <a href="/wiki/Dunedin" title="Dunedin">Dunedin</a>
+ </li>
+ <li>
+ <a href="/wiki/Hamilton,_New_Zealand" title="Hamilton, New Zealand">Hamilton</a>
+ </li>
+ <li>
+ <a href="/wiki/Hastings,_New_Zealand" title="Hastings, New Zealand">Hastings</a>
+ </li>
+ <li>
+ <a href="/wiki/Invercargill" title="Invercargill">Invercargill</a>
+ </li>
+ <li>
+ <a href="/wiki/Napier,_New_Zealand" title="Napier, New Zealand">Napier</a>
+ </li>
+ <li>
+ <a href="/wiki/Nelson,_New_Zealand" title="Nelson, New Zealand">Nelson</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Plymouth" title="New Plymouth">New Plymouth</a>
+ </li>
+ <li>
+ <a href="/wiki/Palmerston_North" title="Palmerston North">Palmerston North</a>
+ </li>
+ <li>
+ <a href="/wiki/Rotorua" title="Rotorua">Rotorua</a>
+ </li>
+ <li>
+ <a href="/wiki/Tauranga" title="Tauranga">Tauranga</a>
+ </li>
+ <li>
+ <a href="/wiki/Wellington" title="Wellington">Wellington</a>
+ <ul>
+ <li>
+ <a href="/wiki/Capital_of_New_Zealand" title="Capital of New Zealand">capital</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Whangarei" title="Whangarei">Whangarei</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;padding-left:0.5em;padding-right:0.5em;font-weight:normal;">
+ <a href="/wiki/Local_government_in_New_Zealand" title="Local government in New Zealand">Subdivisions</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Regions</a>
+ </li>
+ <li>
+ <a href="/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">Territorial authorities</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Politics_of_New_Zealand" title="Politics of New Zealand">Politics</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Constitution_of_New_Zealand" title="Constitution of New Zealand">Constitution</a>
+ </li>
+ <li>
+ <a href="/wiki/Elections_in_New_Zealand" title="Elections in New Zealand">Elections</a>
+ <ul>
+ <li>
+ <a href="/wiki/Electoral_system_of_New_Zealand" title="Electoral system of New Zealand">Electoral system</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_political_parties_in_New_Zealand" title="List of political parties in New Zealand">Political parties</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Foreign_relations_of_New_Zealand" title="Foreign relations of New Zealand">Foreign relations</a>
+ </li>
+ <li>
+ <a href="/wiki/Human_rights_in_New_Zealand" title="Human rights in New Zealand">Human rights</a>
+ <ul>
+ <li>
+ <a href="/wiki/Disability_rights_in_New_Zealand" title="Disability rights in New Zealand">Disability</a>
+ </li>
+ <li>
+ <a href="/wiki/Intersex_rights_in_New_Zealand" title="Intersex rights in New Zealand">Intersex</a>
+ </li>
+ <li>
+ <a href="/wiki/LGBT_rights_in_New_Zealand" title="LGBT rights in New Zealand">LGBT</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Judiciary_of_New_Zealand" title="Judiciary of New Zealand">Judiciary</a>
+ <ul>
+ <li>
+ <a href="/wiki/Supreme_Court_of_New_Zealand" title="Supreme Court of New Zealand">Supreme Court</a>
+ </li>
+ <li>
+ <a href="/wiki/Chief_Justice_of_New_Zealand" title="Chief Justice of New Zealand">Chief Justice</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Law_of_New_Zealand" title="Law of New Zealand">Law</a>
+ <ul>
+ <li>
+ <a href="/wiki/Law_enforcement_in_New_Zealand" class="mw-redirect" title="Law enforcement in New Zealand">enforcement</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_Defence_Force" title="New Zealand Defence Force">Military</a>
+ </li>
+ <li>
+ <a href="/wiki/Monarchy_of_New_Zealand" title="Monarchy of New Zealand">Monarchy</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_Parliament" title="New Zealand Parliament">Parliament</a> (<a href="/wiki/New_Zealand_House_of_Representatives" title="New Zealand House of Representatives">House of Representatives</a>)
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;padding-left:0.5em;padding-right:0.5em;font-weight:normal;">
+ <a href="/wiki/Government_of_New_Zealand" title="Government of New Zealand">Government</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Cabinet_of_New_Zealand" title="Cabinet of New Zealand">Cabinet</a>
+ </li>
+ <li>
+ <a href="/wiki/Governor-General_of_New_Zealand" title="Governor-General of New Zealand">Governor-General</a>
+ <ul>
+ <li>
+ <a href="/wiki/List_of_Governors-General_of_New_Zealand" class="mw-redirect" title="List of Governors-General of New Zealand">list</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Ministers_of_the_New_Zealand_Government" title="Ministers of the New Zealand Government">Ministers</a>
+ </li>
+ <li>
+ <a href="/wiki/Prime_Minister_of_New_Zealand" title="Prime Minister of New Zealand">Prime Minister</a>
+ <ul>
+ <li>
+ <a href="/wiki/List_of_Prime_Ministers_of_New_Zealand" class="mw-redirect" title="List of Prime Ministers of New Zealand">list</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Economy_of_New_Zealand" title="Economy of New Zealand">Economy</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Agriculture_in_New_Zealand" title="Agriculture in New Zealand">Agriculture</a>
+ <ul>
+ <li>
+ <a href="/wiki/Dairy_farming_in_New_Zealand" title="Dairy farming in New Zealand">Dairy farming</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_wine" title="New Zealand wine">Wine industry</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/List_of_companies_of_New_Zealand" title="List of companies of New Zealand">Companies</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_dollar" title="New Zealand dollar">Dollar</a>
+ </li>
+ <li>
+ <a href="/wiki/Energy_in_New_Zealand" title="Energy in New Zealand">Energy</a>
+ </li>
+ <li>
+ <a href="/wiki/Mining_in_New_Zealand" title="Mining in New Zealand">Mining</a>
+ </li>
+ <li>
+ <a href="/wiki/Poverty_in_New_Zealand" title="Poverty in New Zealand">Poverty</a>
+ </li>
+ <li>
+ <a href="/wiki/Reserve_Bank_of_New_Zealand" title="Reserve Bank of New Zealand">Reserve Bank</a>
+ </li>
+ <li>
+ <a href="/wiki/Rogernomics" title="Rogernomics">Rogernomics</a>
+ </li>
+ <li>
+ <a href="/wiki/Taxation_in_New_Zealand" title="Taxation in New Zealand">Taxation</a>
+ </li>
+ <li>
+ <a href="/wiki/Telecommunications_in_New_Zealand" title="Telecommunications in New Zealand">Telecommunications</a>
+ </li>
+ <li>
+ <a href="/wiki/Tourism_in_New_Zealand" title="Tourism in New Zealand">Tourism</a>
+ </li>
+ <li>
+ <a href="/wiki/Transport_in_New_Zealand" title="Transport in New Zealand">Transportation</a>
+ <ul>
+ <li>
+ <a href="/wiki/Rail_transport_in_New_Zealand" title="Rail transport in New Zealand">Rail transport</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Welfare_in_New_Zealand" title="Welfare in New Zealand">Welfare</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Category:New_Zealand_society" title="Category:New Zealand society">Society</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/New_Zealand_nationality_law" title="New Zealand nationality law">Citizenship</a>
+ </li>
+ <li>
+ <a href="/wiki/Crime_in_New_Zealand" title="Crime in New Zealand">Crime</a>
+ </li>
+ <li>
+ <a href="/wiki/Demographics_of_New_Zealand" title="Demographics of New Zealand">Demographics</a>
+ <ul>
+ <li>
+ <a href="/wiki/List_of_ethnic_origins_of_New_Zealanders" title="List of ethnic origins of New Zealanders">Ethnic origins</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Education_in_New_Zealand" title="Education in New Zealand">Education</a>
+ </li>
+ <li>
+ <a href="/wiki/Gender_equality_in_New_Zealand" title="Gender equality in New Zealand">Gender equality</a>
+ </li>
+ <li>
+ <a href="/wiki/Health_care_in_New_Zealand" title="Health care in New Zealand">Health care</a>
+ </li>
+ <li>
+ <a href="/wiki/Homelessness_in_New_Zealand" title="Homelessness in New Zealand">Homelessness</a>
+ </li>
+ <li>
+ <a href="/wiki/Immigration_to_New_Zealand" title="Immigration to New Zealand">Immigration</a>
+ </li>
+ <li>
+ <a href="/wiki/Languages_of_New_Zealand" title="Languages of New Zealand">Languages</a>
+ <ul>
+ <li>
+ <a href="/wiki/M%C4%81ori_language" title="Māori language">Māori</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_English" title="New Zealand English">New Zealand English</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_Sign_Language" title="New Zealand Sign Language">New Zealand Sign Language</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/LGBT_in_New_Zealand" title="LGBT in New Zealand">LGBT issues</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealanders" title="New Zealanders">People</a>
+ <ul>
+ <li>
+ <a href="/wiki/Kiwi_(people)" title="Kiwi (people)">"Kiwi"</a>
+ </li>
+ <li>
+ <a href="/wiki/M%C4%81ori_people" title="Māori people">Māori</a>
+ </li>
+ <li>
+ <a href="/wiki/Women_in_New_Zealand" title="Women in New Zealand">Women</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Religion_in_New_Zealand" title="Religion in New Zealand">Religion</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;padding-left:0.5em;padding-right:0.5em;font-weight:normal;">
+ <a href="/wiki/Culture_of_New_Zealand" title="Culture of New Zealand">Culture</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Architecture_of_New_Zealand" title="Architecture of New Zealand">Architecture</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_art" title="New Zealand art">Art</a>
+ </li>
+ <li>
+ <a href="/wiki/Cinema_of_New_Zealand" title="Cinema of New Zealand">Cinema</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_cuisine" title="New Zealand cuisine">Cuisine</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Zealand_literature" title="New Zealand literature">Literature</a>
+ </li>
+ <li>
+ <a href="/wiki/M%C4%81ori_culture" title="Māori culture">Māori culture</a>
+ </li>
+ <li>
+ <a href="/wiki/Media_of_New_Zealand" title="Media of New Zealand">Media</a>
+ </li>
+ <li>
+ <a href="/wiki/Music_of_New_Zealand" title="Music of New Zealand">Music</a>
+ </li>
+ <li>
+ <a href="/wiki/Public_holidays_in_New_Zealand" title="Public holidays in New Zealand">Public holidays</a>
+ </li>
+ <li>
+ <a href="/wiki/Radio_in_New_Zealand" title="Radio in New Zealand">Radio</a>
+ </li>
+ <li>
+ <a href="/wiki/Sport_in_New_Zealand" title="Sport in New Zealand">Sport</a>
+ </li>
+ <li>
+ <a href="/wiki/National_symbols_of_New_Zealand" title="National symbols of New Zealand">Symbols</a>
+ </li>
+ <li>
+ <a href="/wiki/Television_in_New_Zealand" title="Television in New Zealand">Television</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="navbox-abovebelow" colspan="2" style="font-weight:bold;">
+ <div>
+ <div style="margin-bottom:-0.4em;">
+ <ul>
+ <li>
+ <span class="nobold"><a href="/wiki/Outline_of_New_Zealand" title="Outline of New Zealand">Outline</a></span>
+ </li>
+ </ul>
+ </div>
+ <ul>
+ <li>
+ <a href="/wiki/Book:New_Zealand" title="Book:New Zealand">Book</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:New_Zealand" title="Category:New Zealand">Category</a>
+ </li>
+ <li>
+ <a href="/wiki/Portal:New_Zealand" title="Portal:New Zealand">Portal</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox" aria-labelledby="Articles_relating_to_New_Zealand" style="padding:3px">
+ <table class="nowraplinks mw-collapsible mw-collapsed navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2" style="background:#e8e8ff;">
+ <div id="Articles_relating_to_New_Zealand" style="font-size:114%;margin:0 4em">
+ Articles relating to New Zealand
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px;font-size:114%">
+ <div style="padding:0px">
+ <table class="navbox collapsible">
+ <tbody>
+ <tr>
+ <th colspan="12" class="navbox-title">
+ <div class="plainlinks hlist navbar mini" style="float:left; text-align:left">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Administrative_divisions_of_New_Zealand" title="Template:Administrative divisions of New Zealand"><abbr title="View this template">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Administrative_divisions_of_New_Zealand" title="Template talk:Administrative divisions of New Zealand"><abbr title="Discuss this template">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Administrative_divisions_of_New_Zealand&amp;action=edit"><abbr title="Edit this template">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div style="font-size:114%;margin:0 4em">
+ Administrative divisions of the Realm of New Zealand
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ Countries
+ </th>
+ <td colspan="7" style="background:#ddf;">
+ <span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/23px-Flag_of_New_Zealand.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/35px-Flag_of_New_Zealand.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/46px-Flag_of_New_Zealand.svg.png 2x" data-file-width="1200" data-file-height="600" />&#160;</span><a class="mw-selflink selflink">New Zealand</a>
+ </td>
+ <td rowspan="4">
+ &#160;
+ </td>
+ <td rowspan="4">
+ &#160;
+ </td>
+ <td rowspan="1" style="background:#e2e2ff;">
+ <span class="nowrap"><span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/23px-Flag_of_the_Cook_Islands.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/35px-Flag_of_the_Cook_Islands.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/46px-Flag_of_the_Cook_Islands.svg.png 2x" data-file-width="1200" data-file-height="600" />&#160;</span><a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></span>
+ </td>
+ <td rowspan="1" style="background:#e2e2ff;">
+ <span class="nowrap"><span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/23px-Flag_of_Niue.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/35px-Flag_of_Niue.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/46px-Flag_of_Niue.svg.png 2x" data-file-width="600" data-file-height="300" />&#160;</span><a href="/wiki/Niue" title="Niue">Niue</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ <a href="/wiki/Regions_of_New_Zealand" title="Regions of New Zealand">Regions</a>
+ </th>
+ <td style="background:#e7e7ff;">
+ 11 non-unitary regions
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ 5 unitary regions
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/Chatham_Islands" title="Chatham Islands">Chatham Islands</a>
+ </td>
+ <td rowspan="3">
+ &#160;
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/New_Zealand_outlying_islands" title="New Zealand outlying islands">Outlying islands</a> outside any regional authority<br />
+ (the <a href="/wiki/Kermadec_Islands" title="Kermadec Islands">Kermadec Islands</a>, <a href="/wiki/Three_Kings_Islands" title="Three Kings Islands">Three Kings Islands</a>, and <a href="/wiki/New_Zealand_Subantarctic_Islands" title="New Zealand Subantarctic Islands">Subantarctic Islands</a>)
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <a href="/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="flagicon"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/23px-Flag_of_Tokelau.svg.png" decoding="async" width="23" height="12" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/35px-Flag_of_Tokelau.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/46px-Flag_of_Tokelau.svg.png 2x" data-file-width="1800" data-file-height="900" />&#160;</span><a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="nowrap">15 islands</span>
+ </td>
+ <td rowspan="2" style="background:#eef;">
+ <span class="nowrap">14 <a href="/wiki/List_of_villages_in_Niue" title="List of villages in Niue">villages</a></span>
+ </td>
+ </tr>
+ <tr>
+ <th class="navbox-title">
+ <a href="/wiki/Territorial_authorities_of_New_Zealand" title="Territorial authorities of New Zealand">Territorial authorities</a>
+ </th>
+ <td style="background:#f4f4ff;">
+ 13 cities and 53 districts
+ </td>
+ </tr>
+ <tr style="line-height:12px;font-size:90%;">
+ <th style="background:#fcfcff;">
+ Notes
+ </th>
+ <td style="background:#fcfcff;">
+ Some districts lie in more than one region
+ </td>
+ <td style="background:#fcfcff;">
+ These combine the regional and the territorial authority levels in one
+ </td>
+ <td style="background:#fcfcff;">
+ Special territorial authority
+ </td>
+ <td colspan="1" style="background:#fcfcff;">
+ The outlying <a href="/wiki/Solander_Islands" title="Solander Islands">Solander Islands</a> form part of the <a href="/wiki/Southland_Region" class="mw-redirect" title="Southland Region">Southland Region</a>
+ </td>
+ <td style="background:#fcfcff;">
+ New&#160;Zealand's <a href="/wiki/Territorial_claims_in_Antarctica" title="Territorial claims in Antarctica">Antarctic territory</a>
+ </td>
+ <td style="background:#fcfcff;">
+ <a href="/wiki/United_Nations_list_of_Non-Self-Governing_Territories" title="United Nations list of Non-Self-Governing Territories">Non-self-governing territory</a> of New&#160;Zealand
+ </td>
+ <td colspan="2" style="background:#fcfcff;">
+ States in <a href="/wiki/Associated_state" title="Associated state">free association</a> with New&#160;Zealand
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div role="navigation" class="navbox" aria-labelledby="Members_of_the_Commonwealth_of_Nations" style="padding:3px">
+ <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:The_Commonwealth" title="Template:The Commonwealth"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:The_Commonwealth" title="Template talk:The Commonwealth"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:The_Commonwealth&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="Members_of_the_Commonwealth_of_Nations" style="font-size:114%;margin:0 4em">
+ <a href="/wiki/Member_states_of_the_Commonwealth_of_Nations" title="Member states of the Commonwealth of Nations">Members of the</a> <a href="/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/List_of_sovereign_states" title="List of sovereign states">Sovereign states</a><br />
+ (Members)
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a>
+ </li>
+ <li>
+ <a href="/wiki/Australia" title="Australia">Australia</a>
+ </li>
+ <li>
+ <a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a>
+ </li>
+ <li>
+ <a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a>
+ </li>
+ <li>
+ <a href="/wiki/Barbados" title="Barbados">Barbados</a>
+ </li>
+ <li>
+ <a href="/wiki/Belize" title="Belize">Belize</a>
+ </li>
+ <li>
+ <a href="/wiki/Botswana" title="Botswana">Botswana</a>
+ </li>
+ <li>
+ <a href="/wiki/Brunei" title="Brunei">Brunei</a>
+ </li>
+ <li>
+ <a href="/wiki/Cameroon" title="Cameroon">Cameroon</a>
+ </li>
+ <li>
+ <a href="/wiki/Canada" title="Canada">Canada</a>
+ </li>
+ <li>
+ <a href="/wiki/Cyprus" title="Cyprus">Cyprus</a>
+ </li>
+ <li>
+ <a href="/wiki/Dominica" title="Dominica">Dominica</a>
+ </li>
+ <li>
+ <a href="/wiki/Eswatini" title="Eswatini">Eswatini (Swaziland)</a>
+ </li>
+ <li>
+ <a href="/wiki/Fiji" title="Fiji">Fiji</a>
+ </li>
+ <li>
+ <a href="/wiki/The_Gambia" title="The Gambia">The Gambia</a>
+ </li>
+ <li>
+ <a href="/wiki/Ghana" title="Ghana">Ghana</a>
+ </li>
+ <li>
+ <a href="/wiki/Grenada" title="Grenada">Grenada</a>
+ </li>
+ <li>
+ <a href="/wiki/Guyana" title="Guyana">Guyana</a>
+ </li>
+ <li>
+ <a href="/wiki/India" title="India">India</a>
+ </li>
+ <li>
+ <a href="/wiki/Jamaica" title="Jamaica">Jamaica</a>
+ </li>
+ <li>
+ <a href="/wiki/Kenya" title="Kenya">Kenya</a>
+ </li>
+ <li>
+ <a href="/wiki/Kiribati" title="Kiribati">Kiribati</a>
+ </li>
+ <li>
+ <a href="/wiki/Lesotho" title="Lesotho">Lesotho</a>
+ </li>
+ <li>
+ <a href="/wiki/Malawi" title="Malawi">Malawi</a>
+ </li>
+ <li>
+ <a href="/wiki/Malaysia" title="Malaysia">Malaysia</a>
+ </li>
+ <li>
+ <a href="/wiki/Malta" title="Malta">Malta</a>
+ </li>
+ <li>
+ <a href="/wiki/Mauritius" title="Mauritius">Mauritius</a>
+ </li>
+ <li>
+ <a href="/wiki/Mozambique" title="Mozambique">Mozambique</a>
+ </li>
+ <li>
+ <a href="/wiki/Namibia" title="Namibia">Namibia</a>
+ </li>
+ <li>
+ <a href="/wiki/Nauru" title="Nauru">Nauru</a>
+ </li>
+ <li>
+ <a class="mw-selflink selflink">New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/Nigeria" title="Nigeria">Nigeria</a>
+ </li>
+ <li>
+ <a href="/wiki/Pakistan" title="Pakistan">Pakistan</a>
+ </li>
+ <li>
+ <a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a>
+ </li>
+ <li>
+ <a href="/wiki/Rwanda" title="Rwanda">Rwanda</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">St. Kitts and Nevis</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Lucia" title="Saint Lucia">St. Lucia</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">St. Vincent and the Grenadines</a>
+ </li>
+ <li>
+ <a href="/wiki/Samoa" title="Samoa">Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/Seychelles" title="Seychelles">Seychelles</a>
+ </li>
+ <li>
+ <a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a>
+ </li>
+ <li>
+ <a href="/wiki/Singapore" title="Singapore">Singapore</a>
+ </li>
+ <li>
+ <a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/South_Africa" title="South Africa">South Africa</a>
+ </li>
+ <li>
+ <a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a>
+ </li>
+ <li>
+ <a href="/wiki/Tanzania" title="Tanzania">Tanzania</a>
+ </li>
+ <li>
+ <a href="/wiki/Tonga" title="Tonga">Tonga</a>
+ </li>
+ <li>
+ <a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a>
+ </li>
+ <li>
+ <a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a>
+ </li>
+ <li>
+ <a href="/wiki/Uganda" title="Uganda">Uganda</a>
+ </li>
+ <li>
+ <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </li>
+ <li>
+ <a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a>
+ </li>
+ <li>
+ <a href="/wiki/Zambia" title="Zambia">Zambia</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Dependent_territory" title="Dependent territory">Dependencies</a><br />
+ of Members
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Australia
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Ashmore_and_Cartier_Islands" title="Ashmore and Cartier Islands">Ashmore and Cartier Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Australian_Antarctic_Territory" title="Australian Antarctic Territory">Australian Antarctic Territory</a>
+ </li>
+ <li>
+ <a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a>
+ </li>
+ <li>
+ <a href="/wiki/Cocos_(Keeling)_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Coral_Sea_Islands" title="Coral Sea Islands">Coral Sea Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ New Zealand
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Niue" title="Niue">Niue</a>
+ </li>
+ <li>
+ <a href="/wiki/Ross_Dependency" title="Ross Dependency">Ross Dependency</a>
+ </li>
+ <li>
+ <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ United Kingdom
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Akrotiri_and_Dhekelia" title="Akrotiri and Dhekelia">Akrotiri and Dhekelia</a>
+ </li>
+ <li>
+ <a href="/wiki/Anguilla" title="Anguilla">Anguilla</a>
+ </li>
+ <li>
+ <a href="/wiki/Bermuda" title="Bermuda">Bermuda</a>
+ </li>
+ <li>
+ <a href="/wiki/British_Antarctic_Territory" title="British Antarctic Territory">British Antarctic Territory</a>
+ </li>
+ <li>
+ <a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a>
+ </li>
+ <li>
+ <a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a>
+ </li>
+ <li>
+ <a href="/wiki/Guernsey" title="Guernsey">Guernsey</a>
+ </li>
+ <li>
+ <a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a>
+ </li>
+ <li>
+ <a href="/wiki/Jersey" title="Jersey">Jersey</a>
+ </li>
+ <li>
+ <a href="/wiki/Montserrat" title="Montserrat">Montserrat</a>
+ </li>
+ <li>
+ <a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Helena,_Ascension_and_Tristan_da_Cunha" title="Saint Helena, Ascension and Tristan da Cunha">St. Helena, Ascension and Tristan da Cunha</a>
+ </li>
+ <li>
+ <a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="navbox-abovebelow" colspan="2">
+ <div>
+ Source: <a rel="nofollow" class="external text" href="http://www.thecommonwealth.org/Internal/142227/members/">Commonwealth Secretariat - Member States</a>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox" aria-labelledby="Polynesia" style="padding:3px">
+ <table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Polynesia" title="Template:Polynesia"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Polynesia" title="Template talk:Polynesia"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Polynesia&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="Polynesia" style="font-size:114%;margin:0 4em">
+ <a href="/wiki/Polynesia" title="Polynesia">Polynesia</a>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Polynesian_Triangle" title="Polynesian Triangle">Polynesian triangle</a>
+ </th>
+ <td class="navbox-list navbox-odd hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Easter_Island" title="Easter Island">Easter Island</a>
+ </li>
+ <li>
+ <a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a>
+ <ul>
+ <li>
+ <a href="/wiki/Austral_Islands" title="Austral Islands">Austral Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Gambier_Islands" title="Gambier Islands">Gambier Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Marquesas_Islands" title="Marquesas Islands">Marquesas Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Society_Islands" title="Society Islands">Society Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Tuamotus" title="Tuamotus">Tuamotus</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Hawaiian_Islands" title="Hawaiian Islands">Hawaiian Islands</a>
+ </li>
+ <li>
+ <a class="mw-selflink selflink">New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/Niue" title="Niue">Niue</a>
+ </li>
+ <li>
+ <a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Rotuma" title="Rotuma">Rotuma</a>
+ </li>
+ <li>
+ <a href="/wiki/Isla_Salas_y_G%C3%B3mez" title="Isla Salas y Gómez">Sala y Gómez</a>
+ </li>
+ <li>
+ <a href="/wiki/Samoan_Islands" title="Samoan Islands">Samoan Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </li>
+ <li>
+ <a href="/wiki/Tonga" title="Tonga">Tonga</a>
+ </li>
+ <li>
+ <a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a>
+ </li>
+ <li>
+ <a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna Islands</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Polynesian_outlier" title="Polynesian outlier">Polynesian outliers</a>
+ </th>
+ <td class="navbox-list navbox-even hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Aniwa_Island" title="Aniwa Island">Aniwa</a>
+ </li>
+ <li>
+ <a href="/wiki/Anuta" title="Anuta">Anuta</a>
+ </li>
+ <li>
+ <a href="/wiki/Emae" title="Emae">Emae</a>
+ </li>
+ <li>
+ <a href="/wiki/Futuna_Island,_Vanuatu" title="Futuna Island, Vanuatu">Futuna</a>
+ </li>
+ <li>
+ <a href="/wiki/Kapingamarangi" title="Kapingamarangi">Kapingamarangi</a>
+ </li>
+ <li>
+ <a href="/wiki/Loyalty_Islands" class="mw-redirect" title="Loyalty Islands">Loyalty Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Mele_(island)" class="mw-redirect" title="Mele (island)">Mele</a>
+ </li>
+ <li>
+ <a href="/wiki/Nuguria" title="Nuguria">Nuguria</a>
+ </li>
+ <li>
+ <a href="/wiki/Nukumanu_Islands" title="Nukumanu Islands">Nukumanu</a>
+ </li>
+ <li>
+ <a href="/wiki/Nukuoro" title="Nukuoro">Nukuoro</a>
+ </li>
+ <li>
+ <a href="/wiki/Ontong_Java_Atoll" title="Ontong Java Atoll">Ontong Java</a>
+ </li>
+ <li>
+ <a href="/wiki/Ouv%C3%A9a" title="Ouvéa">Ouvéa</a>
+ </li>
+ <li>
+ <a href="/wiki/Pileni" title="Pileni">Pileni</a>
+ </li>
+ <li>
+ <a href="/wiki/Rennell_and_Bellona_Province" title="Rennell and Bellona Province">Rennell</a>
+ </li>
+ <li>
+ <a href="/wiki/Sikaiana" title="Sikaiana">Sikaiana</a>
+ </li>
+ <li>
+ <a href="/wiki/Takuu_Atoll" title="Takuu Atoll">Takuu</a>
+ </li>
+ <li>
+ <a href="/wiki/Tikopia" title="Tikopia">Tikopia</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Polynesian-influenced
+ </th>
+ <td class="navbox-list navbox-odd hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Lau_Islands" title="Lau Islands">Lau Islands</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox" aria-labelledby="Countries_and_territories_of_Oceania" style="padding:3px">
+ <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="3">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Countries_and_territories_of_Oceania" title="Template:Countries and territories of Oceania"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Countries_and_territories_of_Oceania" title="Template talk:Countries and territories of Oceania"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Countries_and_territories_of_Oceania&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="Countries_and_territories_of_Oceania" style="font-size:114%;margin:0 4em">
+ <a href="/wiki/List_of_sovereign_states_and_dependent_territories_in_Oceania" title="List of sovereign states and dependent territories in Oceania">Countries and territories</a> of <a href="/wiki/Oceania" title="Oceania">Oceania</a>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Sovereign_state" title="Sovereign state">Sovereign states</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ Entire
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Australia" title="Australia">Australia</a>
+ </li>
+ <li>
+ <a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Federated States of Micronesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Fiji" title="Fiji">Fiji</a>
+ </li>
+ <li>
+ <a href="/wiki/Kiribati" title="Kiribati">Kiribati</a>
+ </li>
+ <li>
+ <a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Nauru" title="Nauru">Nauru</a>
+ </li>
+ <li>
+ <a class="mw-selflink selflink">New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/Palau" title="Palau">Palau</a>
+ </li>
+ <li>
+ <a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a>
+ </li>
+ <li>
+ <a href="/wiki/Samoa" title="Samoa">Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Tonga" title="Tonga">Tonga</a>
+ </li>
+ <li>
+ <a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a>
+ </li>
+ <li>
+ <a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ In part
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Chile" title="Chile">Chile</a>
+ <ul>
+ <li>
+ <a href="/wiki/Easter_Island" title="Easter Island">Easter Island</a>
+ </li>
+ <li>
+ <a href="/wiki/Juan_Fern%C3%A1ndez_Islands" title="Juan Fernández Islands">Juan Fernández Islands</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Indonesia" title="Indonesia">Indonesia</a>
+ <ul>
+ <li>
+ <a href="/wiki/West_Papua_(province)" title="West Papua (province)">West Papua</a>
+ </li>
+ <li>
+ <a href="/wiki/Papua_(province)" title="Papua (province)">Papua</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/Japan" title="Japan">Japan</a>
+ <ul>
+ <li>
+ <a href="/wiki/Bonin_Islands" title="Bonin Islands">Bonin Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Minami-Tori-Shima" class="mw-redirect" title="Minami-Tori-Shima">Minami-Tori-Shima</a>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="/wiki/United_States" title="United States">United States</a>
+ <ul>
+ <li>
+ <a href="/wiki/Hawaii" title="Hawaii">Hawaii</a>
+ </li>
+ <li>
+ <a href="/wiki/Palmyra_Atoll" title="Palmyra Atoll">Palmyra Atoll</a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td class="navbox-image" rowspan="3" style="width:1px;padding:0px 0px 0px 2px">
+ <div>
+ <a href="/wiki/Oceania" title="Oceania"><img alt="Oceania (orthographic projection).svg" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Oceania_%28orthographic_projection%29.svg/150px-Oceania_%28orthographic_projection%29.svg.png" decoding="async" width="150" height="150" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Oceania_%28orthographic_projection%29.svg/225px-Oceania_%28orthographic_projection%29.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Oceania_%28orthographic_projection%29.svg/300px-Oceania_%28orthographic_projection%29.svg.png 2x" data-file-width="541" data-file-height="541" /></a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <div style="padding:0.1em 0;line-height:1.2em;">
+ <a href="/wiki/Realm_of_New_Zealand" title="Realm of New Zealand">Associated states<br />
+ of New Zealand</a>
+ </div>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Niue" title="Niue">Niue</a>
+ </li>
+ <li>
+ <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <div style="padding:0.1em 0;line-height:1.2em;">
+ <a href="/wiki/Dependent_territory" title="Dependent territory">Dependencies</a> and<br />
+ other territories
+ </div>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ Australia
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Ashmore_and_Cartier_Islands" title="Ashmore and Cartier Islands">Ashmore and Cartier Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Coral_Sea_Islands" title="Coral Sea Islands">Coral Sea Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ <a href="/wiki/United_States" title="United States">United States</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/Baker_Island" title="Baker Island">Baker Island</a>
+ </li>
+ <li>
+ <a href="/wiki/Guam" title="Guam">Guam</a>
+ </li>
+ <li>
+ <a href="/wiki/Howland_Island" title="Howland Island">Howland Island</a>
+ </li>
+ <li>
+ <a href="/wiki/Jarvis_Island" title="Jarvis Island">Jarvis Island</a>
+ </li>
+ <li>
+ <a href="/wiki/Johnston_Atoll" title="Johnston Atoll">Johnston Atoll</a>
+ </li>
+ <li>
+ <a href="/wiki/Kingman_Reef" title="Kingman Reef">Kingman Reef</a>
+ </li>
+ <li>
+ <a href="/wiki/Midway_Atoll" title="Midway Atoll">Midway Atoll</a>
+ </li>
+ <li>
+ <a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Wake_Island" title="Wake Island">Wake Island</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ <a class="mw-selflink selflink">New Zealand</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ <a href="/wiki/France" title="France">France</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a>
+ </li>
+ <li>
+ <a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">
+ <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox" aria-labelledby="English-speaking_world" style="padding:3px">
+ <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:English_official_language_clickable_map" title="Template:English official language clickable map"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:English_official_language_clickable_map" title="Template talk:English official language clickable map"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:English_official_language_clickable_map&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="English-speaking_world" style="font-size:114%;margin:0 4em">
+ <a href="/wiki/English_language#Geographic_distribution" title="English language">English-speaking world</a>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <div style="text-align: center;">
+ <p>
+ <i>Click on a coloured area to see an article about English in that country or region</i>
+ </p>
+ </div>
+ <div class="center">
+ <div class="floatnone">
+ <div class="noresize">
+ <map name="ImageMap_5a6fc4d7f2adc147" id="ImageMap_5a6fc4d7f2adc147">
+ <area href="/wiki/British_English" shape="poly" coords="233,91,274,79,277,93,310,94,311,88,295,88,298,80,303,73,298,41,307,20,269,22,254,41,259,57,244,63,235,72,231,82" alt="British English" title="British English" />
+ <area href="/wiki/Languages_of_Malta" shape="circle" coords="273,90,5" alt="Languages of Malta" title="Languages of Malta" />
+ <area href="/wiki/Canadian_English" shape="poly" coords="67,25,46,40,50,43,52,46,52,49,49,53,48,58,46,56,46,64,52,64,54,63,100,64,109,66,112,70,115,70,114,73,112,77,130,71,129,68,125,67,125,61,124,55,127,49,117,44,124,37,130,37,136,37,142,36,150,35,154,40,160,40,169,29,157,18,172,12,190,2,144,6,95,16" alt="Canadian English" title="Canadian English" />
+ <area href="/wiki/Quebec_English" shape="poly" coords="147,36,133,42,126,55,126,61,125,67,130,70,138,67,151,67,163,58,150,56,150,54,154,52,157,44" alt="Quebec English" title="Quebec English" />
+ <area href="/wiki/Canadian_English" shape="poly" coords="158,41,154,52,148,52,149,56,153,58,161,58,160,60,155,65,140,67,140,72,142,73,168,65,168,51" alt="Canadian English" title="Canadian English" />
+ <area href="/wiki/Alaska#Languages" shape="poly" coords="67,23,43,43,30,45,4,53,4,46,24,27,43,22,65,22" alt="Alaska#Languages" title="Alaska#Languages" />
+ <area href="/wiki/Falkland_Islands_English" shape="circle" coords="158,265,11" alt="Falkland Islands English" title="Falkland Islands English" />
+ <area href="/wiki/Scottish_English" shape="rect" coords="242,40,251,53" alt="Scottish English" title="Scottish English" />
+ <area href="/wiki/Hiberno-English" shape="poly" coords="246,55,235,52,232,61,242,62" alt="Hiberno-English" title="Hiberno-English" />
+ <area href="/wiki/Mid-Ulster_English" shape="rect" coords="233,48,243,55" alt="Mid-Ulster English" title="Mid-Ulster English" />
+ <area href="/wiki/British_English" shape="poly" coords="246,54,244,63,252,62,256,51" alt="British English" title="British English" />
+ <area href="/wiki/Demographics_of_Lesotho" shape="poly" coords="301,216,296,220,305,231,309,223" alt="Demographics of Lesotho" title="Demographics of Lesotho" />
+ <area href="/wiki/South_African_English" shape="poly" coords="304,231,295,221,301,215,310,223,314,214,305,216,305,213,307,213,307,208,304,206,295,213,292,211,289,215,286,211,283,218,278,217,280,230,302,232" alt="South African English" title="South African English" />
+ <area href="/wiki/Languages_of_Eswatini" shape="poly" coords="309,211,305,214,305,217,308,217,313,217,314,208" alt="Languages of Eswatini" title="Languages of Eswatini" />
+ <area href="/wiki/Languages_of_Madagascar" shape="poly" coords="339,185,328,193,327,213,337,217,345,187" alt="Languages of Madagascar" title="Languages of Madagascar" />
+ <area href="/wiki/Languages_of_Mauritius" shape="circle" coords="357,205,16" alt="Languages of Mauritius" title="Languages of Mauritius" />
+ <area href="/wiki/Sierra_Leonean_English" shape="poly" coords="224,151,233,144,229,140,220,142" alt="Sierra Leonean English" title="Sierra Leonean English" />
+ <area href="/wiki/Liberian_English" shape="poly" coords="224,153,232,145,238,149,234,158" alt="Liberian English" title="Liberian English" />
+ <area href="/wiki/Ghanaian_English" shape="rect" coords="243,137,253,157" alt="Ghanaian English" title="Ghanaian English" />
+ <area href="/wiki/Namlish" shape="poly" coords="261,194,289,196,284,217,265,219" alt="Namlish" title="Namlish" />
+ <area href="/wiki/Languages_of_Botswana" shape="poly" coords="298,198,289,197,286,209,288,215,291,210,294,212,302,207" alt="Languages of Botswana" title="Languages of Botswana" />
+ <area href="/wiki/Languages_of_Zimbabwe" shape="poly" coords="304,193,301,198,303,205,308,205,311,199,311,194" alt="Languages of Zimbabwe" title="Languages of Zimbabwe" />
+ <area href="/wiki/Languages_of_Zambia" shape="poly" coords="292,197,301,198,310,189,313,181,307,178,301,180,301,184,292,182,289,189" alt="Languages of Zambia" title="Languages of Zambia" />
+ <area href="/wiki/Malawian_English" shape="poly" coords="310,178,310,190,315,196,319,191,316,183" alt="Malawian English" title="Malawian English" />
+ <area href="/wiki/Languages_of_Tanzania" shape="poly" coords="322,170,312,164,307,164,304,171,305,178,313,181,318,184,331,184,331,170" alt="Languages of Tanzania" title="Languages of Tanzania" />
+ <area href="/wiki/Languages_of_Rwanda" shape="poly" coords="299,161,307,166,303,171,296,168" alt="Languages of Rwanda" title="Languages of Rwanda" />
+ <area href="/wiki/Ugandan_English" shape="rect" coords="306,154,313,169" alt="Ugandan English" title="Ugandan English" />
+ <area href="/wiki/Languages_of_Kenya" shape="poly" coords="316,153,313,160,313,163,322,169,330,165,329,153" alt="Languages of Kenya" title="Languages of Kenya" />
+ <area href="/wiki/Languages_of_Sudan" shape="poly" coords="295,116,289,136,299,154,319,154,312,145,319,116" alt="Languages of Sudan" title="Languages of Sudan" />
+ <area href="/wiki/Languages_of_Nigeria" shape="poly" coords="256,132,253,149,253,156,263,157,266,152,268,146,272,147,280,136,276,132" alt="Languages of Nigeria" title="Languages of Nigeria" />
+ <area href="/wiki/Cameroon_English" shape="poly" coords="278,141,268,147,265,158,271,164,282,161,283,145" alt="Cameroon English" title="Cameroon English" />
+ <area href="/wiki/Pakistani_English" shape="poly" coords="386,91,379,92,383,97,378,104,376,107,378,111,369,122,356,115,352,99,374,82,381,81,387,85" alt="Pakistani English" title="Pakistani English" />
+ <area href="/wiki/Indian_English" shape="poly" coords="405,100,408,105,415,106,420,101,427,105,418,120,403,127,396,144,389,146,379,127,374,117,377,109,376,106,382,97,380,92,390,85" alt="Indian English" title="Indian English" />
+ <area href="/wiki/Australian_English" shape="poly" coords="499,257,477,234,436,237,445,192,488,183,517,184,532,214,525,238" alt="Australian English" title="Australian English" />
+ <area href="/wiki/New_Zealand_English" shape="poly" coords="547,226,520,246,521,264,565,260,577,226" alt="New Zealand English" title="New Zealand English" />
+ <area href="/wiki/Languages_of_Papua_New_Guinea" shape="rect" coords="511,160,526,190" alt="Languages of Papua New Guinea" title="Languages of Papua New Guinea" />
+ <area href="/wiki/Solomon_Islands#Demographics" shape="rect" coords="529,165,547,190" alt="Solomon Islands#Demographics" title="Solomon Islands#Demographics" />
+ <area href="/wiki/Palau#Demographics" shape="circle" coords="494,151,7" alt="Palau#Demographics" title="Palau#Demographics" />
+ <area href="/wiki/Federated_States_of_Micronesia#Languages" shape="poly" coords="503,136,497,143,531,158,544,155,546,151" alt="Federated States of Micronesia#Languages" title="Federated States of Micronesia#Languages" />
+ <area href="/wiki/Languages_of_Fiji" shape="rect" coords="565,184,601,211" alt="Languages of Fiji" title="Languages of Fiji" />
+ <area href="/wiki/Singapore_English" shape="circle" coords="442,161,4" alt="Singapore English" title="Singapore English" />
+ <area href="/wiki/Philippine_English" shape="rect" coords="461,122,493,142" alt="Philippine English" title="Philippine English" />
+ <area href="/wiki/Hong_Kong_English" shape="circle" coords="456,116,6" alt="Hong Kong English" title="Hong Kong English" />
+ <area href="/wiki/Marshall_Islands#Culture" shape="circle" coords="550,140,11" alt="Marshall Islands#Culture" title="Marshall Islands#Culture" />
+ <area href="/wiki/Demographics_of_Nauru#Language" shape="circle" coords="559,163,7" alt="Languages of Nauru" title="Languages of Nauru" />
+ <area href="/wiki/Bahamian_English" shape="poly" coords="107,103,104,113,119,121,126,115,119,105" alt="Bahamian English" title="Bahamian English" />
+ <area href="/wiki/American_English" shape="poly" coords="52,64,101,64,115,70,117,75,142,65,145,69,136,74,118,94,107,100,106,110,104,112,95,104,75,112,28,91,41,65" alt="American English" title="American English" />
+ <area href="/wiki/Demographics_of_the_Cayman_Islands#Languages" shape="circle" coords="100,123,5" alt="Demographics of the Cayman Islands#Languages" title="Demographics of the Cayman Islands#Languages" />
+ <area href="/wiki/Jamaican_English" shape="circle" coords="108,128,6" alt="Jamaican English" title="Jamaican English" />
+ <area href="/wiki/Languages_of_Belize" shape="rect" coords="82,119,94,135" alt="Languages of Belize" title="Languages of Belize" />
+ <area href="/wiki/Demographics_of_Saint_Helena,_Ascension_and_Tristan_da_Cunha" shape="circle" coords="240,196,15" alt="Demographics of Saint Helena, Ascension and Tristan da Cunha" title="Demographics of Saint Helena, Ascension and Tristan da Cunha" />
+ <area href="/wiki/Languages_of_Guyana" shape="rect" coords="132,145,151,168" alt="Languages of Guyana" title="Languages of Guyana" />
+ <area href="/wiki/Puerto_Rico#Languages" shape="rect" coords="123,117,131,133" alt="Puerto Rico#Languages" title="Puerto Rico#Languages" />
+ <area href="/wiki/Caribbean_English" shape="rect" coords="131,117,148,145" alt="English of the Windward Islands and Leeward Islands" title="English of the Windward Islands and Leeward Islands" />
+ <area href="/wiki/Bermudian_English" shape="circle" coords="138,97,9" alt="Bermudian English" title="Bermudian English" />
+ </map><img alt="English speaking countries" src="//upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Anglospeak%28800px%29Countries.png/600px-Anglospeak%28800px%29Countries.png" decoding="async" width="600" height="263" srcset="//upload.wikimedia.org/wikipedia/commons/c/ca/Anglospeak%28800px%29Countries.png 1.5x" data-file-width="800" data-file-height="351" usemap="#ImageMap_5a6fc4d7f2adc147" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks mw-collapsible mw-collapsed navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="2">
+ <div id="Further_links" style="font-size:114%;margin:0 4em">
+ Further links
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;width:8.25em;">
+ Articles
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px;width:auto;">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/English-speaking_world" title="English-speaking world">English-speaking world</a>
+ </li>
+ <li>
+ <a href="/wiki/History_of_the_English_language" class="mw-redirect" title="History of the English language">History of the English language</a>
+ </li>
+ <li>
+ <a href="/wiki/British_Empire" title="British Empire">British Empire</a>
+ </li>
+ <li>
+ <a href="/wiki/English_in_the_Commonwealth_of_Nations" title="English in the Commonwealth of Nations">English in the Commonwealth of Nations</a>
+ </li>
+ <li>
+ <a href="/wiki/Anglosphere" title="Anglosphere">Anglosphere</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;width:8.25em;">
+ Lists
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px;width:auto;;text-align:left;color:darkblue;">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/List_of_countries_by_English-speaking_population" title="List of countries by English-speaking population">List of countries by English-speaking population</a>
+ </li>
+ <li>
+ <a href="/wiki/List_of_countries_where_English_is_an_official_language" class="mw-redirect" title="List of countries where English is an official language">List of countries where English is an official language</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0px;width:auto;">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;background:blue;">
+ <span style="padding-left:1.0em;">&#160;</span>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td class="navbox-abovebelow" colspan="2">
+ <div id="*_Countries_and_territories_where_English_is_the_national_language_or_the_native_language_of_the_majority">
+ <ul>
+ <li>
+ <b>Countries and territories where English is the national language or the native language of the majority</b>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Languages_of_Africa" title="Languages of Africa">Africa</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Saint_Helena,_Ascension_and_Tristan_da_Cunha" title="Saint Helena, Ascension and Tristan da Cunha">Saint Helena, Ascension and Tristan da Cunha</a></i>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Anglo-America" title="Anglo-America">Americas</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a>
+ </li>
+ <li>
+ <a href="/wiki/The_Bahamas" title="The Bahamas">The Bahamas</a>
+ </li>
+ <li>
+ <a href="/wiki/Barbados" title="Barbados">Barbados</a>
+ </li>
+ <li>
+ <a href="/wiki/Belize" title="Belize">Belize</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Canada" title="Canada">Canada</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Dominica" title="Dominica">Dominica</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Grenada" title="Grenada">Grenada</a>
+ </li>
+ <li>
+ <a href="/wiki/Guyana" title="Guyana">Guyana</a>
+ </li>
+ <li>
+ <a href="/wiki/Jamaica" title="Jamaica">Jamaica</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Saba" title="Saba">Saba</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a>
+ </li>
+ <li>
+ <a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Sint_Eustatius" title="Sint Eustatius">Sint Eustatius</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Sint_Maarten" title="Sint Maarten">Sint Maarten</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/United_States" title="United States">United States</a>
+ </li>
+ <li>
+ <i><a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">United States Virgin Islands</a></i>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/English_language_in_Europe" title="English language in Europe">Europe</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Jersey" title="Jersey">Jersey</a></i>
+ </li>
+ <li>
+ <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Languages_of_Oceania" title="Languages of Oceania">Oceania</a>
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Australia" title="Australia">Australia</a>
+ </li>
+ <li>
+ <a class="mw-selflink selflink">New Zealand</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a></i>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%;background:lightblue;">
+ <span style="padding-left:1.0em;">&#160;</span>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em"></div>
+ <table class="nowraplinks navbox-subgroup" style="border-spacing:0">
+ <tbody>
+ <tr>
+ <td class="navbox-abovebelow" colspan="2">
+ <div id="*_Countries_and_territories_where_English_is_an_official_language,_but_not_the_majority_first_language">
+ <ul>
+ <li>
+ <b>Countries and territories where English is an official language, but not the majority first language</b>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Africa
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Botswana" title="Botswana">Botswana</a>
+ </li>
+ <li>
+ <a href="/wiki/Cameroon" title="Cameroon">Cameroon</a>
+ </li>
+ <li>
+ <a href="/wiki/Eswatini" title="Eswatini">Eswatini (Swaziland)</a>
+ </li>
+ <li>
+ <a href="/wiki/The_Gambia" title="The Gambia">The Gambia</a>
+ </li>
+ <li>
+ <a href="/wiki/Ghana" title="Ghana">Ghana</a>
+ </li>
+ <li>
+ <a href="/wiki/Kenya" title="Kenya">Kenya</a>
+ </li>
+ <li>
+ <a href="/wiki/Lesotho" title="Lesotho">Lesotho</a>
+ </li>
+ <li>
+ <a href="/wiki/Liberia" title="Liberia">Liberia</a>
+ </li>
+ <li>
+ <a href="/wiki/Malawi" title="Malawi">Malawi</a>
+ </li>
+ <li>
+ <a href="/wiki/Mauritius" title="Mauritius">Mauritius</a>
+ </li>
+ <li>
+ <a href="/wiki/Namibia" title="Namibia">Namibia</a>
+ </li>
+ <li>
+ <a href="/wiki/Nigeria" title="Nigeria">Nigeria</a>
+ </li>
+ <li>
+ <a href="/wiki/Rwanda" title="Rwanda">Rwanda</a>
+ </li>
+ <li>
+ <a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Somaliland" title="Somaliland">Somaliland</a></i>
+ </li>
+ <li>
+ <a href="/wiki/South_Africa" title="South Africa">South Africa</a>
+ </li>
+ <li>
+ <a href="/wiki/South_Sudan" title="South Sudan">South Sudan</a>
+ </li>
+ <li>
+ <a href="/wiki/Sudan" title="Sudan">Sudan</a>
+ </li>
+ <li>
+ <a href="/wiki/Tanzania" title="Tanzania">Tanzania</a>
+ </li>
+ <li>
+ <a href="/wiki/Uganda" title="Uganda">Uganda</a>
+ </li>
+ <li>
+ <a href="/wiki/Zambia" title="Zambia">Zambia</a>
+ </li>
+ <li>
+ <a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Americas
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></i>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Languages_of_Asia" title="Languages of Asia">Asia</a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Cocos_(Keeling)_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></i>
+ </li>
+ <li>
+ <a href="/wiki/India" title="India">India</a>
+ </li>
+ <li>
+ <a href="/wiki/Pakistan" title="Pakistan">Pakistan</a>
+ </li>
+ <li>
+ <a href="/wiki/Philippines" title="Philippines">Philippines</a>
+ </li>
+ <li>
+ <a href="/wiki/Singapore" title="Singapore">Singapore</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Europe
+ </th>
+ <td class="navbox-list navbox-even" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></i>
+ </li>
+ <li>
+ <i><a href="/wiki/Akrotiri_and_Dhekelia" title="Akrotiri and Dhekelia">Akrotiri and Dhekelia</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Malta" title="Malta">Malta</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Oceania
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <i><a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Fiji" title="Fiji">Fiji</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Guam" title="Guam">Guam</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Kiribati" title="Kiribati">Kiribati</a>
+ </li>
+ <li>
+ <a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Nauru" title="Nauru">Nauru</a>
+ </li>
+ <li>
+ <a href="/wiki/Niue" title="Niue">Niue</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Palau" title="Palau">Palau</a>
+ </li>
+ <li>
+ <a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a>
+ </li>
+ <li>
+ <a href="/wiki/Samoa" title="Samoa">Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a>
+ </li>
+ <li>
+ <i><a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></i>
+ </li>
+ <li>
+ <a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a>
+ </li>
+ <li>
+ <a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td class="navbox-abovebelow" colspan="2">
+ <div>
+ <a href="/wiki/Dependent_territory" title="Dependent territory">Dependencies</a> shown in <i>italics</i>.
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox" aria-labelledby="Pacific_Islands_Forum_(PIF)" style="padding:3px">
+ <table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th scope="col" class="navbox-title" colspan="3">
+ <div class="plainlinks hlist navbar mini">
+ <ul>
+ <li class="nv-view">
+ <a href="/wiki/Template:Pacific_Islands_Forum_(PIF)" title="Template:Pacific Islands Forum (PIF)"><abbr title="View this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">v</abbr></a>
+ </li>
+ <li class="nv-talk">
+ <a href="/wiki/Template_talk:Pacific_Islands_Forum_(PIF)" title="Template talk:Pacific Islands Forum (PIF)"><abbr title="Discuss this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">t</abbr></a>
+ </li>
+ <li class="nv-edit">
+ <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Template:Pacific_Islands_Forum_(PIF)&amp;action=edit"><abbr title="Edit this template" style=";;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;">e</abbr></a>
+ </li>
+ </ul>
+ </div>
+ <div id="Pacific_Islands_Forum_(PIF)" style="font-size:114%;margin:0 4em">
+ <a href="/wiki/Pacific_Islands_Forum" title="Pacific Islands Forum">Pacific Islands Forum (PIF)</a>
+ </div>
+ </th>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Members
+ </th>
+ <td class="navbox-list navbox-odd hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Australia" title="Australia">Australia</a>
+ </li>
+ <li>
+ <a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Fiji" title="Fiji">Fiji</a>
+ </li>
+ <li>
+ <a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Kiribati" title="Kiribati">Kiribati</a>
+ </li>
+ <li>
+ <a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Micronesia" title="Micronesia">Micronesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Nauru" title="Nauru">Nauru</a>
+ </li>
+ <li>
+ <a class="mw-selflink selflink">New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/Niue" title="Niue">Niue</a>
+ </li>
+ <li>
+ <a href="/wiki/Palau" title="Palau">Palau</a>
+ </li>
+ <li>
+ <a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a>
+ </li>
+ <li>
+ <a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a>
+ </li>
+ <li>
+ <a href="/wiki/Samoa" title="Samoa">Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Tonga" title="Tonga">Tonga</a>
+ </li>
+ <li>
+ <a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a>
+ </li>
+ <li>
+ <a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ <td class="navbox-image" rowspan="6" style="width:1px;padding:0px 0px 0px 2px">
+ <div>
+ <a href="/wiki/File:Pacific_Islands_Forum_Logo.svg" class="image" title="Logo of the Pacific Islands Forum"><img alt="Logo of the Pacific Islands Forum" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Pacific_Islands_Forum_Logo.svg/70px-Pacific_Islands_Forum_Logo.svg.png" decoding="async" width="70" height="70" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Pacific_Islands_Forum_Logo.svg/105px-Pacific_Islands_Forum_Logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Pacific_Islands_Forum_Logo.svg/140px-Pacific_Islands_Forum_Logo.svg.png 2x" data-file-width="500" data-file-height="500" /></a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Associate members
+ </th>
+ <td class="navbox-list navbox-even hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Tokelau" title="Tokelau">Tokelau</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Observers
+ </th>
+ <td class="navbox-list navbox-odd hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a>
+ </li>
+ <li>
+ <a href="/wiki/East_Timor" title="East Timor">East Timor</a>
+ </li>
+ <li>
+ <a href="/wiki/Guam" title="Guam">Guam</a>
+ </li>
+ <li>
+ <a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a>
+ </li>
+ <li>
+ <a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Observer Organisations
+ </th>
+ <td class="navbox-list navbox-even hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/African,_Caribbean_and_Pacific_Group_of_States" title="African, Caribbean and Pacific Group of States">African, Caribbean and Pacific Group of States</a>
+ </li>
+ <li>
+ <a href="/wiki/Asian_Development_Bank" title="Asian Development Bank">Asian Development Bank</a>
+ </li>
+ <li>
+ <a href="/wiki/Commonwealth_of_Nations" title="Commonwealth of Nations">Commonwealth of Nations</a>
+ </li>
+ <li>
+ <a href="/wiki/International_Organization_for_Migration" title="International Organization for Migration">International Organization for Migration</a>
+ </li>
+ <li>
+ <a href="/wiki/United_Nations" title="United Nations">United Nations</a>
+ </li>
+ <li>
+ <a href="/wiki/Western_and_Central_Pacific_Fisheries_Commission" title="Western and Central Pacific Fisheries Commission">Western and Central Pacific Fisheries Commission (WCPFC)</a>
+ </li>
+ <li>
+ <a href="/wiki/World_Bank" title="World Bank">World Bank</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Dialogue partners
+ </th>
+ <td class="navbox-list navbox-odd hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/Canada" title="Canada">Canada</a>
+ </li>
+ <li>
+ <a href="/wiki/China" title="China">China</a>
+ </li>
+ <li>
+ <a href="/wiki/Cuba" title="Cuba">Cuba</a>
+ </li>
+ <li>
+ <a href="/wiki/European_Union" title="European Union">European Union</a>
+ </li>
+ <li>
+ <a href="/wiki/France" title="France">France</a>
+ </li>
+ <li>
+ <a href="/wiki/Germany" title="Germany">Germany</a>
+ </li>
+ <li>
+ <a href="/wiki/India" title="India">India</a>
+ </li>
+ <li>
+ <a href="/wiki/Indonesia" title="Indonesia">Indonesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Italy" title="Italy">Italy</a>
+ </li>
+ <li>
+ <a href="/wiki/Japan" title="Japan">Japan</a>
+ </li>
+ <li>
+ <a href="/wiki/South_Korea" title="South Korea">Korea</a>
+ </li>
+ <li>
+ <a href="/wiki/Malaysia" title="Malaysia">Malaysia</a>
+ </li>
+ <li>
+ <a href="/wiki/Philippines" title="Philippines">Philippines</a>
+ </li>
+ <li>
+ <a href="/wiki/Spain" title="Spain">Spain</a>
+ </li>
+ <li>
+ <a href="/wiki/Thailand" title="Thailand">Thailand</a>
+ </li>
+ <li>
+ <a href="/wiki/Turkey" title="Turkey">Turkey</a>
+ </li>
+ <li>
+ <a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a>
+ </li>
+ <li>
+ <a href="/wiki/United_States" title="United States">United States</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row" class="navbox-group" style="width:1%">
+ Meetings
+ </th>
+ <td class="navbox-list navbox-even hlist" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <a href="/wiki/45th_Pacific_Islands_Forum" title="45th Pacific Islands Forum">45th</a>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td class="navbox-abovebelow" colspan="3"></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div role="navigation" class="navbox authority-control" aria-labelledby="Authority_control_frameless_&amp;#124;text-top_&amp;#124;10px_&amp;#124;alt=Edit_this_at_Wikidata_&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q664&amp;#124;Edit_this_at_Wikidata" style="padding:3px">
+ <table class="nowraplinks hlist navbox-inner" style="border-spacing:0;background:transparent;color:inherit">
+ <tbody>
+ <tr>
+ <th id="Authority_control_frameless_&amp;#124;text-top_&amp;#124;10px_&amp;#124;alt=Edit_this_at_Wikidata_&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q664&amp;#124;Edit_this_at_Wikidata" scope="row" class="navbox-group" style="width:1%">
+ <a href="/wiki/Help:Authority_control" title="Help:Authority control">Authority control</a> <a href="https://www.wikidata.org/wiki/Q664" title="Edit this at Wikidata"><img alt="Edit this at Wikidata" src="//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/10px-OOjs_UI_icon_edit-ltr-progressive.svg.png" decoding="async" width="10" height="10" style="vertical-align: text-top" srcset="//upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/15px-OOjs_UI_icon_edit-ltr-progressive.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/8/8a/OOjs_UI_icon_edit-ltr-progressive.svg/20px-OOjs_UI_icon_edit-ltr-progressive.svg.png 2x" data-file-width="20" data-file-height="20" /></a>
+ </th>
+ <td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px">
+ <div style="padding:0em 0.25em">
+ <ul>
+ <li>
+ <span class="nowrap"><a href="/wiki/Biblioth%C3%A8que_nationale_de_France" title="Bibliothèque nationale de France">BNF</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://catalogue.bnf.fr/ark:/12148/cb12581707j">cb12581707j</a> <a rel="nofollow" class="external text" href="https://data.bnf.fr/ark:/12148/cb12581707j">(data)</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/Integrated_Authority_File" title="Integrated Authority File">GND</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4041915-0">4041915-0</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/Historical_Dictionary_of_Switzerland" title="Historical Dictionary of Switzerland">HDS</a>: <span class="uid"><a rel="nofollow" class="external text" href="http://www.hls-dhs-dss.ch/textes/f/F3478.php">3478</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/International_Standard_Name_Identifier" title="International Standard Name Identifier">ISNI</a>: <span class="uid"><a rel="nofollow" class="external text" href="http://isni.org/isni/0000000122081006">0000 0001 2208 1006</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/Library_of_Congress_Control_Number" title="Library of Congress Control Number">LCCN</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://id.loc.gov/authorities/names/n79021322">n79021322</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/MusicBrainz" title="MusicBrainz">MusicBrainz</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://musicbrainz.org/area/8524c7d9-f472-3890-a458-f28d5081d9c4">8524c7d9-f472-3890-a458-f28d5081d9c4</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/National_Archives_and_Records_Administration" title="National Archives and Records Administration">NARA</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://catalog.archives.gov/id/10035727">10035727</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/National_Diet_Library" title="National Diet Library">NDL</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://id.ndl.go.jp/auth/ndlna/00568770">00568770</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/National_Library_of_the_Czech_Republic" title="National Library of the Czech Republic">NKC</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://aleph.nkp.cz/F/?func=find-c&amp;local_base=aut&amp;ccl_term=ica=ge130252&amp;CON_LNG=ENG">ge130252</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/National_Library_of_Australia" title="National Library of Australia">NLA-person</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://trove.nla.gov.au/people/933239">933239</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/National_Library_of_Israel" title="National Library of Israel">NLI</a>: <span class="uid"><a rel="nofollow" class="external text" href="http://aleph.nli.org.il/F/?func=find-b&amp;local_base=NNL10&amp;find_code=SYS&amp;con_lng=eng&amp;request=000974583">000974583</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/Syst%C3%A8me_universitaire_de_documentation" title="Système universitaire de documentation">SUDOC</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://www.idref.fr/149871848">149871848</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/Virtual_International_Authority_File" title="Virtual International Authority File">VIAF</a>: <span class="uid"><a rel="nofollow" class="external text" href="https://viaf.org/viaf/130102165">130102165</a></span></span>
+ </li>
+ <li>
+ <span class="nowrap"><a href="/wiki/WorldCat_Identities" class="mw-redirect" title="WorldCat Identities">WorldCat Identities</a> (via VIAF): <a rel="nofollow" class="external text" href="https://www.worldcat.org/identities/containsVIAFID/130102165">130102165</a></span>
+ </li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div><!--
+NewPP limit report
+Parsed by mw1331
+Cached time: 20190926113600
+Cache expiry: 86400
+Dynamic content: true
+Complications: [vary‐revision‐sha1]
+CPU time usage: 4.724 seconds
+Real time usage: 5.994 seconds
+Preprocessor visited node count: 29561/1000000
+Preprocessor generated node count: 0/1500000
+Post‐expand include size: 939991/2097152 bytes
+Template argument size: 96801/2097152 bytes
+Highest expansion depth: 21/40
+Expensive parser function count: 58/500
+Unstrip recursion depth: 1/20
+Unstrip post‐expand size: 1116291/5000000 bytes
+Number of Wikibase entities loaded: 6/400
+Lua time usage: 2.802/10.000 seconds
+Lua memory usage: 33.29 MB/50 MB
+Lua Profile:
+ ? 480 ms 15.1%
+ Scribunto_LuaSandboxCallback::getEntity 380 ms 11.9%
+ Scribunto_LuaSandboxCallback::match 300 ms 9.4%
+ Scribunto_LuaSandboxCallback::gsub 280 ms 8.8%
+ recursiveClone <mwInit.lua:41> 260 ms 8.2%
+ <mw.lua:684> 160 ms 5.0%
+ type 160 ms 5.0%
+ Scribunto_LuaSandboxCallback::callParserFunction 120 ms 3.8%
+ dataWrapper <mw.lua:662> 120 ms 3.8%
+ Scribunto_LuaSandboxCallback::getExpandedArgument 100 ms 3.1%
+ [others] 820 ms 25.8%
+-->
+ <!--
+Transclusion expansion time report (%,ms,calls,template)
+100.00% 5262.657 1 -total
+ 44.81% 2358.352 2 Template:Reflist
+ 19.19% 1010.093 2 Template:Coord
+ 16.78% 883.023 160 Template:Cite_web
+ 10.24% 538.992 99 Template:Cite_encyclopedia
+ 10.13% 533.130 1 Template:Infobox_country
+ 10.00% 526.478 3 Template:Infobox
+ 5.12% 269.426 27 Template:Cite_journal
+ 3.50% 184.297 1 Template:Native_name
+ 3.50% 184.037 41 Template:Cite_book
+-->
+ <!-- Saved in parser cache with key enwiki:pcache:idhash:4913064-0!canonical and timestamp 20190926113554 and revision id 917976458
+ -->
+ </div><noscript><img src="//en.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;" /></noscript>
+ </div>
+ <div class="printfooter">
+ Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;oldid=917976458">https://en.wikipedia.org/w/index.php?title=New_Zealand&amp;oldid=917976458</a>"
+ </div>
+ <div id="catlinks" class="catlinks" data-mw="interface">
+ <div id="mw-normal-catlinks" class="mw-normal-catlinks">
+ <a href="/wiki/Help:Category" title="Help:Category">Categories</a>:
+ <ul>
+ <li>
+ <a href="/wiki/Category:New_Zealand" title="Category:New Zealand">New Zealand</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Archipelagoes_of_the_Pacific_Ocean" title="Category:Archipelagoes of the Pacific Ocean">Archipelagoes of the Pacific Ocean</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Countries_in_Australasia" title="Category:Countries in Australasia">Countries in Australasia</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Countries_in_Polynesia" title="Category:Countries in Polynesia">Countries in Polynesia</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:English-speaking_countries_and_territories" title="Category:English-speaking countries and territories">English-speaking countries and territories</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Island_countries" title="Category:Island countries">Island countries</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Member_states_of_the_Commonwealth_of_Nations" title="Category:Member states of the Commonwealth of Nations">Member states of the Commonwealth of Nations</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Member_states_of_the_United_Nations" title="Category:Member states of the United Nations">Member states of the United Nations</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:States_and_territories_established_in_1907" title="Category:States and territories established in 1907">States and territories established in 1907</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Zealandia" title="Category:Zealandia">Zealandia</a>
+ </li>
+ </ul>
+ </div>
+ <div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">
+ Hidden categories:
+ <ul>
+ <li>
+ <a href="/wiki/Category:CS1_errors:_markup" title="Category:CS1 errors: markup">CS1 errors: markup</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:CS1:_Julian%E2%80%93Gregorian_uncertainty" title="Category:CS1: Julian–Gregorian uncertainty">CS1: Julian–Gregorian uncertainty</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:CS1_errors:_missing_periodical" title="Category:CS1 errors: missing periodical">CS1 errors: missing periodical</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:CS1:_long_volume_value" title="Category:CS1: long volume value">CS1: long volume value</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_indefinitely_move-protected_pages" title="Category:Wikipedia indefinitely move-protected pages">Wikipedia indefinitely move-protected pages</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_pages_semi-protected_against_vandalism" title="Category:Wikipedia pages semi-protected against vandalism">Wikipedia pages semi-protected against vandalism</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_with_short_description" title="Category:Articles with short description">Articles with short description</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Good_articles" title="Category:Good articles">Good articles</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Coordinates_on_Wikidata" title="Category:Coordinates on Wikidata">Coordinates on Wikidata</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Use_dmy_dates_from_March_2019" title="Category:Use dmy dates from March 2019">Use dmy dates from March 2019</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Use_New_Zealand_English_from_May_2012" title="Category:Use New Zealand English from May 2012">Use New Zealand English from May 2012</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:All_Wikipedia_articles_written_in_New_Zealand_English" title="Category:All Wikipedia articles written in New Zealand English">All Wikipedia articles written in New Zealand English</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_M%C4%81ori-language_text" title="Category:Articles containing Māori-language text">Articles containing Māori-language text</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Pages_using_multiple_image_with_auto_scaled_images" title="Category:Pages using multiple image with auto scaled images">Pages using multiple image with auto scaled images</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_2017" title="Category:Articles containing potentially dated statements from 2017">Articles containing potentially dated statements from 2017</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:All_articles_containing_potentially_dated_statements" title="Category:All articles containing potentially dated statements">All articles containing potentially dated statements</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_2013" title="Category:Articles containing potentially dated statements from 2013">Articles containing potentially dated statements from 2013</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_2018" title="Category:Articles containing potentially dated statements from 2018">Articles containing potentially dated statements from 2018</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_June_2018" title="Category:Articles containing potentially dated statements from June 2018">Articles containing potentially dated statements from June 2018</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_February_2011" title="Category:Articles containing potentially dated statements from February 2011">Articles containing potentially dated statements from February 2011</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_2016" title="Category:Articles containing potentially dated statements from 2016">Articles containing potentially dated statements from 2016</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_2015" title="Category:Articles containing potentially dated statements from 2015">Articles containing potentially dated statements from 2015</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_with_Curlie_links" title="Category:Articles with Curlie links">Articles with Curlie links</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_BNF_identifiers" title="Category:Wikipedia articles with BNF identifiers">Wikipedia articles with BNF identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_GND_identifiers" title="Category:Wikipedia articles with GND identifiers">Wikipedia articles with GND identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_HDS_identifiers" title="Category:Wikipedia articles with HDS identifiers">Wikipedia articles with HDS identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_ISNI_identifiers" title="Category:Wikipedia articles with ISNI identifiers">Wikipedia articles with ISNI identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_LCCN_identifiers" title="Category:Wikipedia articles with LCCN identifiers">Wikipedia articles with LCCN identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_MusicBrainz_area_identifiers" title="Category:Wikipedia articles with MusicBrainz area identifiers">Wikipedia articles with MusicBrainz area identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_NARA_identifiers" title="Category:Wikipedia articles with NARA identifiers">Wikipedia articles with NARA identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_NDL_identifiers" title="Category:Wikipedia articles with NDL identifiers">Wikipedia articles with NDL identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_NKC_identifiers" title="Category:Wikipedia articles with NKC identifiers">Wikipedia articles with NKC identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_NLA-person_identifiers" title="Category:Wikipedia articles with NLA-person identifiers">Wikipedia articles with NLA-person identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_NLI_identifiers" title="Category:Wikipedia articles with NLI identifiers">Wikipedia articles with NLI identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_SUDOC_identifiers" title="Category:Wikipedia articles with SUDOC identifiers">Wikipedia articles with SUDOC identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_VIAF_identifiers" title="Category:Wikipedia articles with VIAF identifiers">Wikipedia articles with VIAF identifiers</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Wikipedia_articles_with_WorldCat-VIAF_identifiers" title="Category:Wikipedia articles with WorldCat-VIAF identifiers">Wikipedia articles with WorldCat-VIAF identifiers</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="visualClear"></div>
+ </div>
+ </div>
+ <div id="mw-data-after-content">
+ <div class="read-more-container"></div>
+ </div>
+ <div id="mw-navigation">
+ <h2>
+ Navigation menu
+ </h2>
+ <div id="mw-head">
+ <div id="p-personal" role="navigation" aria-labelledby="p-personal-label">
+ <h3 id="p-personal-label">
+ Personal tools
+ </h3>
+ <ul>
+ <li id="pt-anonuserpage">Not logged in
+ </li>
+ <li id="pt-anontalk">
+ <a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n">Talk</a>
+ </li>
+ <li id="pt-anoncontribs">
+ <a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y">Contributions</a>
+ </li>
+ <li id="pt-createaccount">
+ <a href="/w/index.php?title=Special:CreateAccount&amp;returnto=New+Zealand" title="You are encouraged to create an account and log in; however, it is not mandatory">Create account</a>
+ </li>
+ <li id="pt-login">
+ <a href="/w/index.php?title=Special:UserLogin&amp;returnto=New+Zealand" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o">Log in</a>
+ </li>
+ </ul>
+ </div>
+ <div id="left-navigation">
+ <div id="p-namespaces" role="navigation" class="vectorTabs" aria-labelledby="p-namespaces-label">
+ <h3 id="p-namespaces-label">
+ Namespaces
+ </h3>
+ <ul>
+ <li id="ca-nstab-main" class="selected">
+ <span><a href="/wiki/New_Zealand" title="View the content page [c]" accesskey="c">Article</a></span>
+ </li>
+ <li id="ca-talk">
+ <span><a href="/wiki/Talk:New_Zealand" rel="discussion" title="Discussion about the content page [t]" accesskey="t">Talk</a></span>
+ </li>
+ </ul>
+ </div>
+ <div id="p-variants" role="navigation" class="vectorMenu emptyPortlet" aria-labelledby="p-variants-label">
+ <input type="checkbox" class="vectorMenuCheckbox" aria-labelledby="p-variants-label" />
+ <h3 id="p-variants-label">
+ <span>Variants</span>
+ </h3>
+ <ul class="menu"></ul>
+ </div>
+ </div>
+ <div id="right-navigation">
+ <div id="p-views" role="navigation" class="vectorTabs" aria-labelledby="p-views-label">
+ <h3 id="p-views-label">
+ Views
+ </h3>
+ <ul>
+ <li id="ca-view" class="collapsible selected">
+ <span><a href="/wiki/New_Zealand">Read</a></span>
+ </li>
+ <li id="ca-viewsource" class="collapsible">
+ <span><a href="/w/index.php?title=New_Zealand&amp;action=edit" title="This page is protected. You can view its source [e]" accesskey="e">View source</a></span>
+ </li>
+ <li id="ca-history" class="collapsible">
+ <span><a href="/w/index.php?title=New_Zealand&amp;action=history" title="Past revisions of this page [h]" accesskey="h">View history</a></span>
+ </li>
+ </ul>
+ </div>
+ <div id="p-cactions" role="navigation" class="vectorMenu emptyPortlet" aria-labelledby="p-cactions-label">
+ <input type="checkbox" class="vectorMenuCheckbox" aria-labelledby="p-cactions-label" />
+ <h3 id="p-cactions-label">
+ <span>More</span>
+ </h3>
+ <ul class="menu"></ul>
+ </div>
+ <div id="p-search" role="search">
+ <h3>
+ <label for="searchInput">Search</label>
+ </h3>
+ <form action="/w/index.php" id="searchform" name="searchform">
+ <div id="simpleSearch">
+ <input type="search" name="search" placeholder="Search Wikipedia" title="Search Wikipedia [f]" accesskey="f" id="searchInput" /><input type="hidden" value="Special:Search" name="title" /><input type="submit" name="fulltext" value="Search" title="Search Wikipedia for this text" id="mw-searchButton" class="searchButton mw-fallbackSearchButton" /><input type="submit" name="go" value="Go" title="Go to a page with this exact name if it exists" id="searchButton" class="searchButton" />
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div id="mw-panel">
+ <div id="p-logo" role="banner">
+ <a class="mw-wiki-logo" href="/wiki/Main_Page" title="Visit the main page"></a>
+ </div>
+ <div class="portal" role="navigation" id="p-navigation" aria-labelledby="p-navigation-label">
+ <h3 id="p-navigation-label">
+ Navigation
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="n-mainpage-description">
+ <a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z">Main page</a>
+ </li>
+ <li id="n-contents">
+ <a href="/wiki/Portal:Contents" title="Guides to browsing Wikipedia">Contents</a>
+ </li>
+ <li id="n-featuredcontent">
+ <a href="/wiki/Portal:Featured_content" title="Featured content – the best of Wikipedia">Featured content</a>
+ </li>
+ <li id="n-currentevents">
+ <a href="/wiki/Portal:Current_events" title="Find background information on current events">Current events</a>
+ </li>
+ <li id="n-randompage">
+ <a href="/wiki/Special:Random" title="Load a random article [x]" accesskey="x">Random article</a>
+ </li>
+ <li id="n-sitesupport">
+ <a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en" title="Support us">Donate to Wikipedia</a>
+ </li>
+ <li id="n-shoplink">
+ <a href="//shop.wikimedia.org" title="Visit the Wikipedia store">Wikipedia store</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-interaction" aria-labelledby="p-interaction-label">
+ <h3 id="p-interaction-label">
+ Interaction
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="n-help">
+ <a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia">Help</a>
+ </li>
+ <li id="n-aboutsite">
+ <a href="/wiki/Wikipedia:About" title="Find out about Wikipedia">About Wikipedia</a>
+ </li>
+ <li id="n-portal">
+ <a href="/wiki/Wikipedia:Community_portal" title="About the project, what you can do, where to find things">Community portal</a>
+ </li>
+ <li id="n-recentchanges">
+ <a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r">Recent changes</a>
+ </li>
+ <li id="n-contactpage">
+ <a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia">Contact page</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-tb" aria-labelledby="p-tb-label">
+ <h3 id="p-tb-label">
+ Tools
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="t-whatlinkshere">
+ <a href="/wiki/Special:WhatLinksHere/New_Zealand" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j">What links here</a>
+ </li>
+ <li id="t-recentchangeslinked">
+ <a href="/wiki/Special:RecentChangesLinked/New_Zealand" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k">Related changes</a>
+ </li>
+ <li id="t-upload">
+ <a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u">Upload file</a>
+ </li>
+ <li id="t-specialpages">
+ <a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q">Special pages</a>
+ </li>
+ <li id="t-permalink">
+ <a href="/w/index.php?title=New_Zealand&amp;oldid=917976458" title="Permanent link to this revision of the page">Permanent link</a>
+ </li>
+ <li id="t-info">
+ <a href="/w/index.php?title=New_Zealand&amp;action=info" title="More information about this page">Page information</a>
+ </li>
+ <li id="t-wikibase">
+ <a href="https://www.wikidata.org/wiki/Special:EntityPage/Q664" title="Link to connected data repository item [g]" accesskey="g">Wikidata item</a>
+ </li>
+ <li id="t-cite">
+ <a href="/w/index.php?title=Special:CiteThisPage&amp;page=New_Zealand&amp;id=917976458" title="Information on how to cite this page">Cite this page</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-wikibase-otherprojects" aria-labelledby="p-wikibase-otherprojects-label">
+ <h3 id="p-wikibase-otherprojects-label">
+ In other projects
+ </h3>
+ <div class="body">
+ <ul>
+ <li class="wb-otherproject-link wb-otherproject-commons">
+ <a href="https://commons.wikimedia.org/wiki/Category:New_Zealand" hreflang="en">Wikimedia Commons</a>
+ </li>
+ <li class="wb-otherproject-link wb-otherproject-wikinews">
+ <a href="https://en.wikinews.org/wiki/Category:New_Zealand" hreflang="en">Wikinews</a>
+ </li>
+ <li class="wb-otherproject-link wb-otherproject-wikiquote">
+ <a href="https://en.wikiquote.org/wiki/New_Zealand" hreflang="en">Wikiquote</a>
+ </li>
+ <li class="wb-otherproject-link wb-otherproject-wikivoyage">
+ <a href="https://en.wikivoyage.org/wiki/New_Zealand" hreflang="en">Wikivoyage</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-coll-print_export" aria-labelledby="p-coll-print_export-label">
+ <h3 id="p-coll-print_export-label">
+ Print/export
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="coll-create_a_book">
+ <a href="/w/index.php?title=Special:Book&amp;bookcmd=book_creator&amp;referer=New+Zealand">Create a book</a>
+ </li>
+ <li id="coll-download-as-rl">
+ <a href="/w/index.php?title=Special:ElectronPdf&amp;page=New+Zealand&amp;action=show-download-screen">Download as PDF</a>
+ </li>
+ <li id="t-print">
+ <a href="/w/index.php?title=New_Zealand&amp;printable=yes" title="Printable version of this page [p]" accesskey="p">Printable version</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-lang" aria-labelledby="p-lang-label">
+ <h3 id="p-lang-label">
+ Languages
+ </h3>
+ <div class="body">
+ <ul>
+ <li class="interlanguage-link interwiki-ace">
+ <a href="https://ace.wikipedia.org/wiki/Seulandia_Bar%C3%B4" title="Seulandia Barô – Achinese" lang="ace" hreflang="ace" class="interlanguage-link-target" xml:lang="ace">Acèh</a>
+ </li>
+ <li class="interlanguage-link interwiki-kbd">
+ <a href="https://kbd.wikipedia.org/wiki/%D0%A9I%D1%8D_%D0%97%D0%B8%D0%BB%D1%8D%D0%BD%D0%B4" title="ЩIэ Зилэнд – Kabardian" lang="kbd" hreflang="kbd" class="interlanguage-link-target" xml:lang="kbd">Адыгэбзэ</a>
+ </li>
+ <li class="interlanguage-link interwiki-af badge-Q17437796 badge-featuredarticle" title="featured article">
+ <a href="https://af.wikipedia.org/wiki/Nieu-Seeland" title="Nieu-Seeland – Afrikaans" lang="af" hreflang="af" class="interlanguage-link-target" xml:lang="af">Afrikaans</a>
+ </li>
+ <li class="interlanguage-link interwiki-als">
+ <a href="https://als.wikipedia.org/wiki/Neuseeland" title="Neuseeland – Alemannisch" lang="gsw" hreflang="gsw" class="interlanguage-link-target" xml:lang="gsw">Alemannisch</a>
+ </li>
+ <li class="interlanguage-link interwiki-am">
+ <a href="https://am.wikipedia.org/wiki/%E1%8A%92%E1%8B%8D_%E1%8B%9A%E1%88%8B%E1%8A%95%E1%8B%B5" title="ኒው ዚላንድ – Amharic" lang="am" hreflang="am" class="interlanguage-link-target" xml:lang="am">አማርኛ</a>
+ </li>
+ <li class="interlanguage-link interwiki-ang">
+ <a href="https://ang.wikipedia.org/wiki/N%C4%ABws%C7%A3land" title="Nīwsǣland – Old English" lang="ang" hreflang="ang" class="interlanguage-link-target" xml:lang="ang">Ænglisc</a>
+ </li>
+ <li class="interlanguage-link interwiki-ar">
+ <a href="https://ar.wikipedia.org/wiki/%D9%86%D9%8A%D9%88%D8%B2%D9%8A%D9%84%D9%86%D8%AF%D8%A7" title="نيوزيلندا – Arabic" lang="ar" hreflang="ar" class="interlanguage-link-target" xml:lang="ar">العربية</a>
+ </li>
+ <li class="interlanguage-link interwiki-an">
+ <a href="https://an.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Aragonese" lang="an" hreflang="an" class="interlanguage-link-target" xml:lang="an">Aragonés</a>
+ </li>
+ <li class="interlanguage-link interwiki-arc">
+ <a href="https://arc.wikipedia.org/wiki/%DC%A2%DC%9D%DC%98_%DC%99%DC%9D%DC%A0%DC%A2%DC%95" title="ܢܝܘ ܙܝܠܢܕ – Aramaic" lang="arc" hreflang="arc" class="interlanguage-link-target" xml:lang="arc">ܐܪܡܝܐ</a>
+ </li>
+ <li class="interlanguage-link interwiki-frp">
+ <a href="https://frp.wikipedia.org/wiki/Nov%C3%A8la-Z%C3%A8landa" title="Novèla-Zèlanda – Arpitan" lang="frp" hreflang="frp" class="interlanguage-link-target" xml:lang="frp">Arpetan</a>
+ </li>
+ <li class="interlanguage-link interwiki-as">
+ <a href="https://as.wikipedia.org/wiki/%E0%A6%A8%E0%A6%BF%E0%A6%89%E0%A6%9C%E0%A6%BF%E0%A6%B2%E0%A7%87%E0%A6%A3%E0%A7%8D%E0%A6%A1" title="নিউজিলেণ্ড – Assamese" lang="as" hreflang="as" class="interlanguage-link-target" xml:lang="as">অসমীয়া</a>
+ </li>
+ <li class="interlanguage-link interwiki-ast">
+ <a href="https://ast.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Asturian" lang="ast" hreflang="ast" class="interlanguage-link-target" xml:lang="ast">Asturianu</a>
+ </li>
+ <li class="interlanguage-link interwiki-gn">
+ <a href="https://gn.wikipedia.org/wiki/Sel%C3%A1nda_Pyahu" title="Selánda Pyahu – Guarani" lang="gn" hreflang="gn" class="interlanguage-link-target" xml:lang="gn">Avañe'ẽ</a>
+ </li>
+ <li class="interlanguage-link interwiki-az">
+ <a href="https://az.wikipedia.org/wiki/Yeni_Zelandiya" title="Yeni Zelandiya – Azerbaijani" lang="az" hreflang="az" class="interlanguage-link-target" xml:lang="az">Azərbaycanca</a>
+ </li>
+ <li class="interlanguage-link interwiki-azb">
+ <a href="https://azb.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%DB%8C%D9%84%D9%86%D8%AF" title="نیوزیلند – South Azerbaijani" lang="azb" hreflang="azb" class="interlanguage-link-target" xml:lang="azb">تۆرکجه</a>
+ </li>
+ <li class="interlanguage-link interwiki-bm">
+ <a href="https://bm.wikipedia.org/wiki/New_Zealand" title="New Zealand – Bambara" lang="bm" hreflang="bm" class="interlanguage-link-target" xml:lang="bm">Bamanankan</a>
+ </li>
+ <li class="interlanguage-link interwiki-bn">
+ <a href="https://bn.wikipedia.org/wiki/%E0%A6%A8%E0%A6%BF%E0%A6%89%E0%A6%9C%E0%A6%BF%E0%A6%B2%E0%A7%8D%E0%A6%AF%E0%A6%BE%E0%A6%A8%E0%A7%8D%E0%A6%A1" title="নিউজিল্যান্ড – Bangla" lang="bn" hreflang="bn" class="interlanguage-link-target" xml:lang="bn">বাংলা</a>
+ </li>
+ <li class="interlanguage-link interwiki-zh-min-nan">
+ <a href="https://zh-min-nan.wikipedia.org/wiki/New_Zealand" title="New Zealand – Chinese (Min Nan)" lang="nan" hreflang="nan" class="interlanguage-link-target" xml:lang="nan">Bân-lâm-gú</a>
+ </li>
+ <li class="interlanguage-link interwiki-ba">
+ <a href="https://ba.wikipedia.org/wiki/%D0%AF%D2%A3%D1%8B_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Яңы Зеландия – Bashkir" lang="ba" hreflang="ba" class="interlanguage-link-target" xml:lang="ba">Башҡортса</a>
+ </li>
+ <li class="interlanguage-link interwiki-be">
+ <a href="https://be.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0%D1%8F_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D1%8B%D1%8F" title="Новая Зеландыя – Belarusian" lang="be" hreflang="be" class="interlanguage-link-target" xml:lang="be">Беларуская</a>
+ </li>
+ <li class="interlanguage-link interwiki-be-x-old">
+ <a href="https://be-x-old.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0%D1%8F_%D0%97%D1%8D%D0%BB%D1%8F%D0%BD%D0%B4%D1%8B%D1%8F" title="Новая Зэляндыя – Belarusian (Taraškievica orthography)" lang="be-tarask" hreflang="be-tarask" class="interlanguage-link-target" xml:lang="be-tarask">Беларуская (тарашкевіца)‎</a>
+ </li>
+ <li class="interlanguage-link interwiki-bh">
+ <a href="https://bh.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%9C%E0%A5%80%E0%A4%B2%E0%A5%88%E0%A4%82%E0%A4%A1" title="न्यूजीलैंड – Bhojpuri" lang="bh" hreflang="bh" class="interlanguage-link-target" xml:lang="bh">भोजपुरी</a>
+ </li>
+ <li class="interlanguage-link interwiki-bcl">
+ <a href="https://bcl.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Central Bikol" lang="bcl" hreflang="bcl" class="interlanguage-link-target" xml:lang="bcl">Bikol Central</a>
+ </li>
+ <li class="interlanguage-link interwiki-bi">
+ <a href="https://bi.wikipedia.org/wiki/Niusilan" title="Niusilan – Bislama" lang="bi" hreflang="bi" class="interlanguage-link-target" xml:lang="bi">Bislama</a>
+ </li>
+ <li class="interlanguage-link interwiki-bg">
+ <a href="https://bg.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Нова Зеландия – Bulgarian" lang="bg" hreflang="bg" class="interlanguage-link-target" xml:lang="bg">Български</a>
+ </li>
+ <li class="interlanguage-link interwiki-bar">
+ <a href="https://bar.wikipedia.org/wiki/Neiseeland" title="Neiseeland – Bavarian" lang="bar" hreflang="bar" class="interlanguage-link-target" xml:lang="bar">Boarisch</a>
+ </li>
+ <li class="interlanguage-link interwiki-bo">
+ <a href="https://bo.wikipedia.org/wiki/%E0%BD%93%E0%BD%B2%E0%BD%A0%E0%BD%B4%E0%BC%8B%E0%BD%9B%E0%BD%B2%E0%BC%8B%E0%BD%A3%E0%BD%BA%E0%BD%93%E0%BC%8B%E0%BD%8C%E0%BD%B2%E0%BC%8D" title="ནིའུ་ཛི་ལེན་ཌི། – Tibetan" lang="bo" hreflang="bo" class="interlanguage-link-target" xml:lang="bo">བོད་ཡིག</a>
+ </li>
+ <li class="interlanguage-link interwiki-bs">
+ <a href="https://bs.wikipedia.org/wiki/Novi_Zeland" title="Novi Zeland – Bosnian" lang="bs" hreflang="bs" class="interlanguage-link-target" xml:lang="bs">Bosanski</a>
+ </li>
+ <li class="interlanguage-link interwiki-br">
+ <a href="https://br.wikipedia.org/wiki/Zeland-Nevez" title="Zeland-Nevez – Breton" lang="br" hreflang="br" class="interlanguage-link-target" xml:lang="br">Brezhoneg</a>
+ </li>
+ <li class="interlanguage-link interwiki-bxr">
+ <a href="https://bxr.wikipedia.org/wiki/%D0%A8%D1%8D%D0%BD%D1%8D_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4" title="Шэнэ Зеланд – Russia Buriat" lang="bxr" hreflang="bxr" class="interlanguage-link-target" xml:lang="bxr">Буряад</a>
+ </li>
+ <li class="interlanguage-link interwiki-ca">
+ <a href="https://ca.wikipedia.org/wiki/Nova_Zelanda" title="Nova Zelanda – Catalan" lang="ca" hreflang="ca" class="interlanguage-link-target" xml:lang="ca">Català</a>
+ </li>
+ <li class="interlanguage-link interwiki-cv">
+ <a href="https://cv.wikipedia.org/wiki/%C3%87%C4%95%D0%BD%C4%95_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8" title="Çĕнĕ Зеланди – Chuvash" lang="cv" hreflang="cv" class="interlanguage-link-target" xml:lang="cv">Чӑвашла</a>
+ </li>
+ <li class="interlanguage-link interwiki-ceb">
+ <a href="https://ceb.wikipedia.org/wiki/Nuzeland" title="Nuzeland – Cebuano" lang="ceb" hreflang="ceb" class="interlanguage-link-target" xml:lang="ceb">Cebuano</a>
+ </li>
+ <li class="interlanguage-link interwiki-cs">
+ <a href="https://cs.wikipedia.org/wiki/Nov%C3%BD_Z%C3%A9land" title="Nový Zéland – Czech" lang="cs" hreflang="cs" class="interlanguage-link-target" xml:lang="cs">Čeština</a>
+ </li>
+ <li class="interlanguage-link interwiki-cbk-zam">
+ <a href="https://cbk-zam.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Chavacano" lang="cbk" hreflang="cbk" class="interlanguage-link-target" xml:lang="cbk">Chavacano de Zamboanga</a>
+ </li>
+ <li class="interlanguage-link interwiki-sn">
+ <a href="https://sn.wikipedia.org/wiki/New_Zealand" title="New Zealand – Shona" lang="sn" hreflang="sn" class="interlanguage-link-target" xml:lang="sn">ChiShona</a>
+ </li>
+ <li class="interlanguage-link interwiki-co">
+ <a href="https://co.wikipedia.org/wiki/Nova_Zilanda" title="Nova Zilanda – Corsican" lang="co" hreflang="co" class="interlanguage-link-target" xml:lang="co">Corsu</a>
+ </li>
+ <li class="interlanguage-link interwiki-cy">
+ <a href="https://cy.wikipedia.org/wiki/Seland_Newydd" title="Seland Newydd – Welsh" lang="cy" hreflang="cy" class="interlanguage-link-target" xml:lang="cy">Cymraeg</a>
+ </li>
+ <li class="interlanguage-link interwiki-da">
+ <a href="https://da.wikipedia.org/wiki/New_Zealand" title="New Zealand – Danish" lang="da" hreflang="da" class="interlanguage-link-target" xml:lang="da">Dansk</a>
+ </li>
+ <li class="interlanguage-link interwiki-se">
+ <a href="https://se.wikipedia.org/wiki/Aotearoa" title="Aotearoa – Northern Sami" lang="se" hreflang="se" class="interlanguage-link-target" xml:lang="se">Davvisámegiella</a>
+ </li>
+ <li class="interlanguage-link interwiki-de badge-Q17437798 badge-goodarticle" title="good article">
+ <a href="https://de.wikipedia.org/wiki/Neuseeland" title="Neuseeland – German" lang="de" hreflang="de" class="interlanguage-link-target" xml:lang="de">Deutsch</a>
+ </li>
+ <li class="interlanguage-link interwiki-dv">
+ <a href="https://dv.wikipedia.org/wiki/%DE%82%DE%A8%DE%87%DE%AA%DE%92%DE%A8%DE%8D%DE%AD%DE%82%DE%B0%DE%91%DE%AA" title="ނިއުޒިލޭންޑު – Divehi" lang="dv" hreflang="dv" class="interlanguage-link-target" xml:lang="dv">ދިވެހިބަސް</a>
+ </li>
+ <li class="interlanguage-link interwiki-dsb">
+ <a href="https://dsb.wikipedia.org/wiki/Nowoseelandska" title="Nowoseelandska – Lower Sorbian" lang="dsb" hreflang="dsb" class="interlanguage-link-target" xml:lang="dsb">Dolnoserbski</a>
+ </li>
+ <li class="interlanguage-link interwiki-dty">
+ <a href="https://dty.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%81%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A5%8D%E0%A4%AF%E0%A4%BE%E0%A4%A3%E0%A5%8D%E0%A4%A1" title="न्युजिल्याण्ड – Doteli" lang="dty" hreflang="dty" class="interlanguage-link-target" xml:lang="dty">डोटेली</a>
+ </li>
+ <li class="interlanguage-link interwiki-dz">
+ <a href="https://dz.wikipedia.org/wiki/%E0%BD%93%E0%BD%B2%E0%BD%A0%E0%BD%B4%E0%BC%8B%E0%BD%9B%E0%BD%B2%E0%BC%8B%E0%BD%A3%E0%BD%BA%E0%BD%93%E0%BD%8C%E0%BC%8B" title="ནིའུ་ཛི་ལེནཌ་ – Dzongkha" lang="dz" hreflang="dz" class="interlanguage-link-target" xml:lang="dz">ཇོང་ཁ</a>
+ </li>
+ <li class="interlanguage-link interwiki-et">
+ <a href="https://et.wikipedia.org/wiki/Uus-Meremaa" title="Uus-Meremaa – Estonian" lang="et" hreflang="et" class="interlanguage-link-target" xml:lang="et">Eesti</a>
+ </li>
+ <li class="interlanguage-link interwiki-el">
+ <a href="https://el.wikipedia.org/wiki/%CE%9D%CE%AD%CE%B1_%CE%96%CE%B7%CE%BB%CE%B1%CE%BD%CE%B4%CE%AF%CE%B1" title="Νέα Ζηλανδία – Greek" lang="el" hreflang="el" class="interlanguage-link-target" xml:lang="el">Ελληνικά</a>
+ </li>
+ <li class="interlanguage-link interwiki-myv">
+ <a href="https://myv.wikipedia.org/wiki/%D0%9E%D0%B4_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Од Зеландия – Erzya" lang="myv" hreflang="myv" class="interlanguage-link-target" xml:lang="myv">Эрзянь</a>
+ </li>
+ <li class="interlanguage-link interwiki-es badge-Q17437798 badge-goodarticle" title="good article">
+ <a href="https://es.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Spanish" lang="es" hreflang="es" class="interlanguage-link-target" xml:lang="es">Español</a>
+ </li>
+ <li class="interlanguage-link interwiki-eo">
+ <a href="https://eo.wikipedia.org/wiki/Nov-Zelando" title="Nov-Zelando – Esperanto" lang="eo" hreflang="eo" class="interlanguage-link-target" xml:lang="eo">Esperanto</a>
+ </li>
+ <li class="interlanguage-link interwiki-ext">
+ <a href="https://ext.wikipedia.org/wiki/Nueva_Zelanda" title="Nueva Zelanda – Extremaduran" lang="ext" hreflang="ext" class="interlanguage-link-target" xml:lang="ext">Estremeñu</a>
+ </li>
+ <li class="interlanguage-link interwiki-eu">
+ <a href="https://eu.wikipedia.org/wiki/Zeelanda_Berria" title="Zeelanda Berria – Basque" lang="eu" hreflang="eu" class="interlanguage-link-target" xml:lang="eu">Euskara</a>
+ </li>
+ <li class="interlanguage-link interwiki-ee">
+ <a href="https://ee.wikipedia.org/wiki/New_Zealand" title="New Zealand – Ewe" lang="ee" hreflang="ee" class="interlanguage-link-target" xml:lang="ee">Eʋegbe</a>
+ </li>
+ <li class="interlanguage-link interwiki-fa">
+ <a href="https://fa.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%DB%8C%D9%84%D9%86%D8%AF" title="نیوزیلند – Persian" lang="fa" hreflang="fa" class="interlanguage-link-target" xml:lang="fa">فارسی</a>
+ </li>
+ <li class="interlanguage-link interwiki-hif">
+ <a href="https://hif.wikipedia.org/wiki/New_Zealand" title="New Zealand – Fiji Hindi" lang="hif" hreflang="hif" class="interlanguage-link-target" xml:lang="hif">Fiji Hindi</a>
+ </li>
+ <li class="interlanguage-link interwiki-fo">
+ <a href="https://fo.wikipedia.org/wiki/N%C3%BDs%C3%A6land" title="Nýsæland – Faroese" lang="fo" hreflang="fo" class="interlanguage-link-target" xml:lang="fo">Føroyskt</a>
+ </li>
+ <li class="interlanguage-link interwiki-fr badge-Q17437798 badge-goodarticle" title="good article">
+ <a href="https://fr.wikipedia.org/wiki/Nouvelle-Z%C3%A9lande" title="Nouvelle-Zélande – French" lang="fr" hreflang="fr" class="interlanguage-link-target" xml:lang="fr">Français</a>
+ </li>
+ <li class="interlanguage-link interwiki-fy">
+ <a href="https://fy.wikipedia.org/wiki/Nij-Seel%C3%A2n" title="Nij-Seelân – Western Frisian" lang="fy" hreflang="fy" class="interlanguage-link-target" xml:lang="fy">Frysk</a>
+ </li>
+ <li class="interlanguage-link interwiki-ga">
+ <a href="https://ga.wikipedia.org/wiki/An_Nua-Sh%C3%A9alainn" title="An Nua-Shéalainn – Irish" lang="ga" hreflang="ga" class="interlanguage-link-target" xml:lang="ga">Gaeilge</a>
+ </li>
+ <li class="interlanguage-link interwiki-gv">
+ <a href="https://gv.wikipedia.org/wiki/Yn_Teelynn_Noa" title="Yn Teelynn Noa – Manx" lang="gv" hreflang="gv" class="interlanguage-link-target" xml:lang="gv">Gaelg</a>
+ </li>
+ <li class="interlanguage-link interwiki-gag">
+ <a href="https://gag.wikipedia.org/wiki/Eni_Zelandiya" title="Eni Zelandiya – Gagauz" lang="gag" hreflang="gag" class="interlanguage-link-target" xml:lang="gag">Gagauz</a>
+ </li>
+ <li class="interlanguage-link interwiki-gd">
+ <a href="https://gd.wikipedia.org/wiki/Sealainn_Nuadh" title="Sealainn Nuadh – Scottish Gaelic" lang="gd" hreflang="gd" class="interlanguage-link-target" xml:lang="gd">Gàidhlig</a>
+ </li>
+ <li class="interlanguage-link interwiki-gl badge-Q17437796 badge-featuredarticle" title="featured article">
+ <a href="https://gl.wikipedia.org/wiki/Nova_Zelandia" title="Nova Zelandia – Galician" lang="gl" hreflang="gl" class="interlanguage-link-target" xml:lang="gl">Galego</a>
+ </li>
+ <li class="interlanguage-link interwiki-inh">
+ <a href="https://inh.wikipedia.org/wiki/%D0%9A%D0%B5%D1%80%D0%B4%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8" title="Керда Зеланди – Ingush" lang="inh" hreflang="inh" class="interlanguage-link-target" xml:lang="inh">ГӀалгӀай</a>
+ </li>
+ <li class="interlanguage-link interwiki-gu">
+ <a href="https://gu.wikipedia.org/wiki/%E0%AA%A8%E0%AB%8D%E0%AA%AF%E0%AB%82%E0%AA%9D%E0%AB%80%E0%AA%B2%E0%AB%87%E0%AA%A8%E0%AB%8D%E0%AA%A1" title="ન્યૂઝીલેન્ડ – Gujarati" lang="gu" hreflang="gu" class="interlanguage-link-target" xml:lang="gu">ગુજરાતી</a>
+ </li>
+ <li class="interlanguage-link interwiki-got">
+ <a href="https://got.wikipedia.org/wiki/%F0%90%8C%BD%F0%90%8C%B9%F0%90%8C%BF%F0%90%8C%BE%F0%90%8C%B9%F0%90%8D%83_%F0%90%8D%83%F0%90%8C%B0%F0%90%8C%B9%F0%90%8D%85%F0%90%8C%B0%F0%90%8C%BB%F0%90%8C%B0%F0%90%8C%BD%F0%90%8C%B3" title="𐌽𐌹𐌿𐌾𐌹𐍃 𐍃𐌰𐌹𐍅𐌰𐌻𐌰𐌽𐌳 – Gothic" lang="got" hreflang="got" class="interlanguage-link-target" xml:lang="got">𐌲𐌿𐍄𐌹𐍃𐌺</a>
+ </li>
+ <li class="interlanguage-link interwiki-gom">
+ <a href="https://gom.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%9D%E0%A5%80%E0%A4%B2%E0%A4%82%E0%A4%A1" title="न्यूझीलंड – Goan Konkani" lang="gom" hreflang="gom" class="interlanguage-link-target" xml:lang="gom">गोंयची कोंकणी / Gõychi Konknni</a>
+ </li>
+ <li class="interlanguage-link interwiki-hak">
+ <a href="https://hak.wikipedia.org/wiki/New_Zealand" title="New Zealand – Hakka Chinese" lang="hak" hreflang="hak" class="interlanguage-link-target" xml:lang="hak">客家語/Hak-kâ-ngî</a>
+ </li>
+ <li class="interlanguage-link interwiki-xal">
+ <a href="https://xal.wikipedia.org/wiki/%D0%A8%D0%B8%D0%BD%D0%B7%D0%B5%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD_%D0%9E%D1%80%D0%BD" title="Шинзелендин Орн – Kalmyk" lang="xal" hreflang="xal" class="interlanguage-link-target" xml:lang="xal">Хальмг</a>
+ </li>
+ <li class="interlanguage-link interwiki-ko">
+ <a href="https://ko.wikipedia.org/wiki/%EB%89%B4%EC%A7%88%EB%9E%9C%EB%93%9C" title="뉴질랜드 – Korean" lang="ko" hreflang="ko" class="interlanguage-link-target" xml:lang="ko">한국어</a>
+ </li>
+ <li class="interlanguage-link interwiki-hy">
+ <a href="https://hy.wikipedia.org/wiki/%D5%86%D5%B8%D6%80_%D4%B6%D5%A5%D5%AC%D5%A1%D5%B6%D5%A4%D5%AB%D5%A1" title="Նոր Զելանդիա – Armenian" lang="hy" hreflang="hy" class="interlanguage-link-target" xml:lang="hy">Հայերեն</a>
+ </li>
+ <li class="interlanguage-link interwiki-hi">
+ <a href="https://hi.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%9C%E0%A4%BC%E0%A5%80%E0%A4%B2%E0%A5%88%E0%A4%A3%E0%A5%8D%E0%A4%A1" title="न्यूज़ीलैण्ड – Hindi" lang="hi" hreflang="hi" class="interlanguage-link-target" xml:lang="hi">हिन्दी</a>
+ </li>
+ <li class="interlanguage-link interwiki-hsb">
+ <a href="https://hsb.wikipedia.org/wiki/Nowoseelandska" title="Nowoseelandska – Upper Sorbian" lang="hsb" hreflang="hsb" class="interlanguage-link-target" xml:lang="hsb">Hornjoserbsce</a>
+ </li>
+ <li class="interlanguage-link interwiki-hr">
+ <a href="https://hr.wikipedia.org/wiki/Novi_Zeland" title="Novi Zeland – Croatian" lang="hr" hreflang="hr" class="interlanguage-link-target" xml:lang="hr">Hrvatski</a>
+ </li>
+ <li class="interlanguage-link interwiki-io">
+ <a href="https://io.wikipedia.org/wiki/Nova-Zelando" title="Nova-Zelando – Ido" lang="io" hreflang="io" class="interlanguage-link-target" xml:lang="io">Ido</a>
+ </li>
+ <li class="interlanguage-link interwiki-ilo">
+ <a href="https://ilo.wikipedia.org/wiki/Baro_a_Selanda" title="Baro a Selanda – Iloko" lang="ilo" hreflang="ilo" class="interlanguage-link-target" xml:lang="ilo">Ilokano</a>
+ </li>
+ <li class="interlanguage-link interwiki-bpy">
+ <a href="https://bpy.wikipedia.org/wiki/%E0%A6%A8%E0%A6%BF%E0%A6%89%E0%A6%9C%E0%A6%BF%E0%A6%B2%E0%A7%8D%E0%A6%AF%E0%A6%BE%E0%A6%A8%E0%A7%8D%E0%A6%A1" title="নিউজিল্যান্ড – Bishnupriya" lang="bpy" hreflang="bpy" class="interlanguage-link-target" xml:lang="bpy">বিষ্ণুপ্রিয়া মণিপুরী</a>
+ </li>
+ <li class="interlanguage-link interwiki-id">
+ <a href="https://id.wikipedia.org/wiki/Selandia_Baru" title="Selandia Baru – Indonesian" lang="id" hreflang="id" class="interlanguage-link-target" xml:lang="id">Bahasa Indonesia</a>
+ </li>
+ <li class="interlanguage-link interwiki-ia">
+ <a href="https://ia.wikipedia.org/wiki/Nove_Zelanda" title="Nove Zelanda – Interlingua" lang="ia" hreflang="ia" class="interlanguage-link-target" xml:lang="ia">Interlingua</a>
+ </li>
+ <li class="interlanguage-link interwiki-ie">
+ <a href="https://ie.wikipedia.org/wiki/Nov-Zeland" title="Nov-Zeland – Interlingue" lang="ie" hreflang="ie" class="interlanguage-link-target" xml:lang="ie">Interlingue</a>
+ </li>
+ <li class="interlanguage-link interwiki-os">
+ <a href="https://os.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B3_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8" title="Ног Зеланди – Ossetic" lang="os" hreflang="os" class="interlanguage-link-target" xml:lang="os">Ирон</a>
+ </li>
+ <li class="interlanguage-link interwiki-zu">
+ <a href="https://zu.wikipedia.org/wiki/INyuzilandi" title="INyuzilandi – Zulu" lang="zu" hreflang="zu" class="interlanguage-link-target" xml:lang="zu">IsiZulu</a>
+ </li>
+ <li class="interlanguage-link interwiki-is">
+ <a href="https://is.wikipedia.org/wiki/N%C3%BDja-Sj%C3%A1land" title="Nýja-Sjáland – Icelandic" lang="is" hreflang="is" class="interlanguage-link-target" xml:lang="is">Íslenska</a>
+ </li>
+ <li class="interlanguage-link interwiki-it">
+ <a href="https://it.wikipedia.org/wiki/Nuova_Zelanda" title="Nuova Zelanda – Italian" lang="it" hreflang="it" class="interlanguage-link-target" xml:lang="it">Italiano</a>
+ </li>
+ <li class="interlanguage-link interwiki-he">
+ <a href="https://he.wikipedia.org/wiki/%D7%A0%D7%99%D7%95_%D7%96%D7%99%D7%9C%D7%A0%D7%93" title="ניו זילנד – Hebrew" lang="he" hreflang="he" class="interlanguage-link-target" xml:lang="he">עברית</a>
+ </li>
+ <li class="interlanguage-link interwiki-jv">
+ <a href="https://jv.wikipedia.org/wiki/Niu_S%C3%A9lan" title="Niu Sélan – Javanese" lang="jv" hreflang="jv" class="interlanguage-link-target" xml:lang="jv">Jawa</a>
+ </li>
+ <li class="interlanguage-link interwiki-kbp">
+ <a href="https://kbp.wikipedia.org/wiki/Seeland%C9%A9_K%C9%A9fal%CA%8A%CA%8A" title="Seelandɩ Kɩfalʊʊ – Kabiye" lang="kbp" hreflang="kbp" class="interlanguage-link-target" xml:lang="kbp">Kabɩyɛ</a>
+ </li>
+ <li class="interlanguage-link interwiki-kl">
+ <a href="https://kl.wikipedia.org/wiki/New_Zealand" title="New Zealand – Kalaallisut" lang="kl" hreflang="kl" class="interlanguage-link-target" xml:lang="kl">Kalaallisut</a>
+ </li>
+ <li class="interlanguage-link interwiki-kn">
+ <a href="https://kn.wikipedia.org/wiki/%E0%B2%A8%E0%B3%8D%E0%B2%AF%E0%B3%82_%E0%B2%9C%E0%B3%80%E0%B2%B2%E0%B3%8D%E0%B2%AF%E0%B2%BE%E0%B2%82%E0%B2%A1%E0%B3%8D" title="ನ್ಯೂ ಜೀಲ್ಯಾಂಡ್ – Kannada" lang="kn" hreflang="kn" class="interlanguage-link-target" xml:lang="kn">ಕನ್ನಡ</a>
+ </li>
+ <li class="interlanguage-link interwiki-pam">
+ <a href="https://pam.wikipedia.org/wiki/New_Zealand" title="New Zealand – Pampanga" lang="pam" hreflang="pam" class="interlanguage-link-target" xml:lang="pam">Kapampangan</a>
+ </li>
+ <li class="interlanguage-link interwiki-krc">
+ <a href="https://krc.wikipedia.org/wiki/%D0%94%D0%B6%D0%B0%D0%BD%D0%B3%D1%8B_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Джангы Зеландия – Karachay-Balkar" lang="krc" hreflang="krc" class="interlanguage-link-target" xml:lang="krc">Къарачай-малкъар</a>
+ </li>
+ <li class="interlanguage-link interwiki-ka">
+ <a href="https://ka.wikipedia.org/wiki/%E1%83%90%E1%83%AE%E1%83%90%E1%83%9A%E1%83%98_%E1%83%96%E1%83%94%E1%83%9A%E1%83%90%E1%83%9C%E1%83%93%E1%83%98%E1%83%90" title="ახალი ზელანდია – Georgian" lang="ka" hreflang="ka" class="interlanguage-link-target" xml:lang="ka">ქართული</a>
+ </li>
+ <li class="interlanguage-link interwiki-csb">
+ <a href="https://csb.wikipedia.org/wiki/Now%C3%B4_Zelandzk%C3%B4" title="Nowô Zelandzkô – Kashubian" lang="csb" hreflang="csb" class="interlanguage-link-target" xml:lang="csb">Kaszëbsczi</a>
+ </li>
+ <li class="interlanguage-link interwiki-kk">
+ <a href="https://kk.wikipedia.org/wiki/%D0%96%D0%B0%D2%A3%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Жаңа Зеландия – Kazakh" lang="kk" hreflang="kk" class="interlanguage-link-target" xml:lang="kk">Қазақша</a>
+ </li>
+ <li class="interlanguage-link interwiki-kw">
+ <a href="https://kw.wikipedia.org/wiki/Mordir_Nowydh" title="Mordir Nowydh – Cornish" lang="kw" hreflang="kw" class="interlanguage-link-target" xml:lang="kw">Kernowek</a>
+ </li>
+ <li class="interlanguage-link interwiki-rw">
+ <a href="https://rw.wikipedia.org/wiki/Nuveli_Zelande" title="Nuveli Zelande – Kinyarwanda" lang="rw" hreflang="rw" class="interlanguage-link-target" xml:lang="rw">Kinyarwanda</a>
+ </li>
+ <li class="interlanguage-link interwiki-rn">
+ <a href="https://rn.wikipedia.org/wiki/Nouvelle-Z%C3%A9lande" title="Nouvelle-Zélande – Rundi" lang="rn" hreflang="rn" class="interlanguage-link-target" xml:lang="rn">Kirundi</a>
+ </li>
+ <li class="interlanguage-link interwiki-sw">
+ <a href="https://sw.wikipedia.org/wiki/Nyuzilandi" title="Nyuzilandi – Swahili" lang="sw" hreflang="sw" class="interlanguage-link-target" xml:lang="sw">Kiswahili</a>
+ </li>
+ <li class="interlanguage-link interwiki-kv">
+ <a href="https://kv.wikipedia.org/wiki/%D0%92%D1%8B%D0%BB%D1%8C_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Выль Зеландия – Komi" lang="kv" hreflang="kv" class="interlanguage-link-target" xml:lang="kv">Коми</a>
+ </li>
+ <li class="interlanguage-link interwiki-ht">
+ <a href="https://ht.wikipedia.org/wiki/Nouv%C3%A8l_Zelann" title="Nouvèl Zelann – Haitian Creole" lang="ht" hreflang="ht" class="interlanguage-link-target" xml:lang="ht">Kreyòl ayisyen</a>
+ </li>
+ <li class="interlanguage-link interwiki-ku">
+ <a href="https://ku.wikipedia.org/wiki/N%C3%BB_Zelenda" title="Nû Zelenda – Kurdish" lang="ku" hreflang="ku" class="interlanguage-link-target" xml:lang="ku">Kurdî</a>
+ </li>
+ <li class="interlanguage-link interwiki-ky">
+ <a href="https://ky.wikipedia.org/wiki/%D0%96%D0%B0%D2%A3%D1%8B_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Жаңы Зеландия – Kyrgyz" lang="ky" hreflang="ky" class="interlanguage-link-target" xml:lang="ky">Кыргызча</a>
+ </li>
+ <li class="interlanguage-link interwiki-mrj">
+ <a href="https://mrj.wikipedia.org/wiki/%D0%A3_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8" title="У Зеланди – Western Mari" lang="mrj" hreflang="mrj" class="interlanguage-link-target" xml:lang="mrj">Кырык мары</a>
+ </li>
+ <li class="interlanguage-link interwiki-lad">
+ <a href="https://lad.wikipedia.org/wiki/Mueva_Zelanda" title="Mueva Zelanda – Ladino" lang="lad" hreflang="lad" class="interlanguage-link-target" xml:lang="lad">Ladino</a>
+ </li>
+ <li class="interlanguage-link interwiki-lo">
+ <a href="https://lo.wikipedia.org/wiki/%E0%BA%9B%E0%BA%B0%E0%BB%80%E0%BA%97%E0%BA%94%E0%BA%99%E0%BA%B4%E0%BA%A7%E0%BA%8A%E0%BA%B5%E0%BB%81%E0%BA%A5%E0%BA%99%E0%BA%94%E0%BB%8C" title="ປະເທດນິວຊີແລນດ໌ – Lao" lang="lo" hreflang="lo" class="interlanguage-link-target" xml:lang="lo">ລາວ</a>
+ </li>
+ <li class="interlanguage-link interwiki-la">
+ <a href="https://la.wikipedia.org/wiki/Nova_Zelandia" title="Nova Zelandia – Latin" lang="la" hreflang="la" class="interlanguage-link-target" xml:lang="la">Latina</a>
+ </li>
+ <li class="interlanguage-link interwiki-lv">
+ <a href="https://lv.wikipedia.org/wiki/Jaunz%C4%93lande" title="Jaunzēlande – Latvian" lang="lv" hreflang="lv" class="interlanguage-link-target" xml:lang="lv">Latviešu</a>
+ </li>
+ <li class="interlanguage-link interwiki-lb">
+ <a href="https://lb.wikipedia.org/wiki/Neis%C3%A9iland" title="Neiséiland – Luxembourgish" lang="lb" hreflang="lb" class="interlanguage-link-target" xml:lang="lb">Lëtzebuergesch</a>
+ </li>
+ <li class="interlanguage-link interwiki-lez">
+ <a href="https://lez.wikipedia.org/wiki/%D0%A6%D3%80%D0%B8%D0%B9%D0%B8_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="ЦӀийи Зеландия – Lezghian" lang="lez" hreflang="lez" class="interlanguage-link-target" xml:lang="lez">Лезги</a>
+ </li>
+ <li class="interlanguage-link interwiki-lt">
+ <a href="https://lt.wikipedia.org/wiki/Naujoji_Zelandija" title="Naujoji Zelandija – Lithuanian" lang="lt" hreflang="lt" class="interlanguage-link-target" xml:lang="lt">Lietuvių</a>
+ </li>
+ <li class="interlanguage-link interwiki-lij">
+ <a href="https://lij.wikipedia.org/wiki/Neuva_Zelanda" title="Neuva Zelanda – Ligurian" lang="lij" hreflang="lij" class="interlanguage-link-target" xml:lang="lij">Ligure</a>
+ </li>
+ <li class="interlanguage-link interwiki-li">
+ <a href="https://li.wikipedia.org/wiki/Nui-Zieland" title="Nui-Zieland – Limburgish" lang="li" hreflang="li" class="interlanguage-link-target" xml:lang="li">Limburgs</a>
+ </li>
+ <li class="interlanguage-link interwiki-lfn">
+ <a href="https://lfn.wikipedia.org/wiki/Zeland_Nova" title="Zeland Nova – Lingua Franca Nova" lang="lfn" hreflang="lfn" class="interlanguage-link-target" xml:lang="lfn">Lingua Franca Nova</a>
+ </li>
+ <li class="interlanguage-link interwiki-olo">
+ <a href="https://olo.wikipedia.org/wiki/Uuzi_Zelandii" title="Uuzi Zelandii – Livvi-Karelian" lang="olo" hreflang="olo" class="interlanguage-link-target" xml:lang="olo">Livvinkarjala</a>
+ </li>
+ <li class="interlanguage-link interwiki-jbo">
+ <a href="https://jbo.wikipedia.org/wiki/zis._poi_cnino" title="zis. poi cnino – Lojban" lang="jbo" hreflang="jbo" class="interlanguage-link-target" xml:lang="jbo">La .lojban.</a>
+ </li>
+ <li class="interlanguage-link interwiki-lmo">
+ <a href="https://lmo.wikipedia.org/wiki/N%C3%B6va_Zelanda" title="Növa Zelanda – Lombard" lang="lmo" hreflang="lmo" class="interlanguage-link-target" xml:lang="lmo">Lumbaart</a>
+ </li>
+ <li class="interlanguage-link interwiki-hu">
+ <a href="https://hu.wikipedia.org/wiki/%C3%9Aj-Z%C3%A9land" title="Új-Zéland – Hungarian" lang="hu" hreflang="hu" class="interlanguage-link-target" xml:lang="hu">Magyar</a>
+ </li>
+ <li class="interlanguage-link interwiki-mai">
+ <a href="https://mai.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%81%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A5%8D%E0%A4%AF%E0%A4%BE%E0%A4%A8%E0%A5%8D%E0%A4%A1" title="न्युजिल्यान्ड – Maithili" lang="mai" hreflang="mai" class="interlanguage-link-target" xml:lang="mai">मैथिली</a>
+ </li>
+ <li class="interlanguage-link interwiki-mk">
+ <a href="https://mk.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4" title="Нов Зеланд – Macedonian" lang="mk" hreflang="mk" class="interlanguage-link-target" xml:lang="mk">Македонски</a>
+ </li>
+ <li class="interlanguage-link interwiki-mg">
+ <a href="https://mg.wikipedia.org/wiki/Novely_Zelandy" title="Novely Zelandy – Malagasy" lang="mg" hreflang="mg" class="interlanguage-link-target" xml:lang="mg">Malagasy</a>
+ </li>
+ <li class="interlanguage-link interwiki-ml">
+ <a href="https://ml.wikipedia.org/wiki/%E0%B4%A8%E0%B5%8D%E0%B4%AF%E0%B5%82%E0%B4%B8%E0%B5%80%E0%B4%B2%E0%B5%BB%E0%B4%A1%E0%B5%8D" title="ന്യൂസീലൻഡ് – Malayalam" lang="ml" hreflang="ml" class="interlanguage-link-target" xml:lang="ml">മലയാളം</a>
+ </li>
+ <li class="interlanguage-link interwiki-mt">
+ <a href="https://mt.wikipedia.org/wiki/New_Zealand" title="New Zealand – Maltese" lang="mt" hreflang="mt" class="interlanguage-link-target" xml:lang="mt">Malti</a>
+ </li>
+ <li class="interlanguage-link interwiki-mi">
+ <a href="https://mi.wikipedia.org/wiki/Aotearoa" title="Aotearoa – Maori" lang="mi" hreflang="mi" class="interlanguage-link-target" xml:lang="mi">Māori</a>
+ </li>
+ <li class="interlanguage-link interwiki-mr">
+ <a href="https://mr.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82_%E0%A4%9D%E0%A5%80%E0%A4%B2%E0%A4%81%E0%A4%A1" title="न्यू झीलँड – Marathi" lang="mr" hreflang="mr" class="interlanguage-link-target" xml:lang="mr">मराठी</a>
+ </li>
+ <li class="interlanguage-link interwiki-xmf">
+ <a href="https://xmf.wikipedia.org/wiki/%E1%83%90%E1%83%AE%E1%83%90%E1%83%9A%E1%83%98_%E1%83%96%E1%83%94%E1%83%9A%E1%83%90%E1%83%9C%E1%83%93%E1%83%98%E1%83%90" title="ახალი ზელანდია – Mingrelian" lang="xmf" hreflang="xmf" class="interlanguage-link-target" xml:lang="xmf">მარგალური</a>
+ </li>
+ <li class="interlanguage-link interwiki-arz">
+ <a href="https://arz.wikipedia.org/wiki/%D9%86%D9%8A%D9%88%D8%B2%D9%8A%D9%84%D8%A7%D9%86%D8%AF%D8%A7" title="نيوزيلاندا – Egyptian Arabic" lang="arz" hreflang="arz" class="interlanguage-link-target" xml:lang="arz">مصرى</a>
+ </li>
+ <li class="interlanguage-link interwiki-mzn">
+ <a href="https://mzn.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%D9%84%D9%86%D8%AF" title="نیوزلند – Mazanderani" lang="mzn" hreflang="mzn" class="interlanguage-link-target" xml:lang="mzn">مازِرونی</a>
+ </li>
+ <li class="interlanguage-link interwiki-ms">
+ <a href="https://ms.wikipedia.org/wiki/New_Zealand" title="New Zealand – Malay" lang="ms" hreflang="ms" class="interlanguage-link-target" xml:lang="ms">Bahasa Melayu</a>
+ </li>
+ <li class="interlanguage-link interwiki-cdo">
+ <a href="https://cdo.wikipedia.org/wiki/Ni%C5%AB-s%C4%83%CC%A4-l%C3%A0ng" title="Niū-să̤-làng – Min Dong Chinese" lang="cdo" hreflang="cdo" class="interlanguage-link-target" xml:lang="cdo">Mìng-dĕ̤ng-ngṳ̄</a>
+ </li>
+ <li class="interlanguage-link interwiki-mn badge-Q17437796 badge-featuredarticle" title="featured article">
+ <a href="https://mn.wikipedia.org/wiki/%D0%A8%D0%B8%D0%BD%D1%8D_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4" title="Шинэ Зеланд – Mongolian" lang="mn" hreflang="mn" class="interlanguage-link-target" xml:lang="mn">Монгол</a>
+ </li>
+ <li class="interlanguage-link interwiki-my">
+ <a href="https://my.wikipedia.org/wiki/%E1%80%94%E1%80%9A%E1%80%B0%E1%80%B8%E1%80%87%E1%80%AE%E1%80%9C%E1%80%94%E1%80%BA%E1%80%94%E1%80%AD%E1%80%AF%E1%80%84%E1%80%BA%E1%80%84%E1%80%B6" title="နယူးဇီလန်နိုင်ငံ – Burmese" lang="my" hreflang="my" class="interlanguage-link-target" xml:lang="my">မြန်မာဘာသာ</a>
+ </li>
+ <li class="interlanguage-link interwiki-na">
+ <a href="https://na.wikipedia.org/wiki/Niu_Djiran" title="Niu Djiran – Nauru" lang="na" hreflang="na" class="interlanguage-link-target" xml:lang="na">Dorerin Naoero</a>
+ </li>
+ <li class="interlanguage-link interwiki-nl">
+ <a href="https://nl.wikipedia.org/wiki/Nieuw-Zeeland" title="Nieuw-Zeeland – Dutch" lang="nl" hreflang="nl" class="interlanguage-link-target" xml:lang="nl">Nederlands</a>
+ </li>
+ <li class="interlanguage-link interwiki-nds-nl">
+ <a href="https://nds-nl.wikipedia.org/wiki/Ni%27j-Zeelaand" title="Ni'j-Zeelaand – Low Saxon" lang="nds-NL" hreflang="nds-NL" class="interlanguage-link-target" xml:lang="nds-NL">Nedersaksies</a>
+ </li>
+ <li class="interlanguage-link interwiki-ne">
+ <a href="https://ne.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%81%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A5%8D%E0%A4%AF%E0%A4%BE%E0%A4%A8%E0%A5%8D%E0%A4%A1" title="न्युजिल्यान्ड – Nepali" lang="ne" hreflang="ne" class="interlanguage-link-target" xml:lang="ne">नेपाली</a>
+ </li>
+ <li class="interlanguage-link interwiki-new">
+ <a href="https://new.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%81_%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A5%8D%E0%A4%AF%E0%A4%BE%E0%A4%A8%E0%A5%8D%E0%A4%A6" title="न्यु जिल्यान्द – Newari" lang="new" hreflang="new" class="interlanguage-link-target" xml:lang="new">नेपाल भाषा</a>
+ </li>
+ <li class="interlanguage-link interwiki-ja">
+ <a href="https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B8%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89" title="ニュージーランド – Japanese" lang="ja" hreflang="ja" class="interlanguage-link-target" xml:lang="ja">日本語</a>
+ </li>
+ <li class="interlanguage-link interwiki-nap">
+ <a href="https://nap.wikipedia.org/wiki/N%C3%B2va_Zelanna" title="Nòva Zelanna – Neapolitan" lang="nap" hreflang="nap" class="interlanguage-link-target" xml:lang="nap">Napulitano</a>
+ </li>
+ <li class="interlanguage-link interwiki-ce">
+ <a href="https://ce.wikipedia.org/wiki/%D0%9A%D0%B5%D1%80%D0%BB%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8" title="Керла Зеланди – Chechen" lang="ce" hreflang="ce" class="interlanguage-link-target" xml:lang="ce">Нохчийн</a>
+ </li>
+ <li class="interlanguage-link interwiki-frr">
+ <a href="https://frr.wikipedia.org/wiki/Nei-Sialun" title="Nei-Sialun – Northern Frisian" lang="frr" hreflang="frr" class="interlanguage-link-target" xml:lang="frr">Nordfriisk</a>
+ </li>
+ <li class="interlanguage-link interwiki-pih">
+ <a href="https://pih.wikipedia.org/wiki/Nyuu_Ziilan" title="Nyuu Ziilan – Norfuk / Pitkern" lang="pih" hreflang="pih" class="interlanguage-link-target" xml:lang="pih">Norfuk / Pitkern</a>
+ </li>
+ <li class="interlanguage-link interwiki-no">
+ <a href="https://no.wikipedia.org/wiki/New_Zealand" title="New Zealand – Norwegian" lang="no" hreflang="no" class="interlanguage-link-target" xml:lang="no">Norsk</a>
+ </li>
+ <li class="interlanguage-link interwiki-nn">
+ <a href="https://nn.wikipedia.org/wiki/New_Zealand" title="New Zealand – Norwegian Nynorsk" lang="nn" hreflang="nn" class="interlanguage-link-target" xml:lang="nn">Norsk nynorsk</a>
+ </li>
+ <li class="interlanguage-link interwiki-nrm">
+ <a href="https://nrm.wikipedia.org/wiki/Nouvelle_Z%C3%A9lande" title="Nouvelle Zélande – Norman" lang="nrf" hreflang="nrf" class="interlanguage-link-target" xml:lang="nrf">Nouormand</a>
+ </li>
+ <li class="interlanguage-link interwiki-nov">
+ <a href="https://nov.wikipedia.org/wiki/Novi_Selande" title="Novi Selande – Novial" lang="nov" hreflang="nov" class="interlanguage-link-target" xml:lang="nov">Novial</a>
+ </li>
+ <li class="interlanguage-link interwiki-oc">
+ <a href="https://oc.wikipedia.org/wiki/N%C3%B2va_Zelanda" title="Nòva Zelanda – Occitan" lang="oc" hreflang="oc" class="interlanguage-link-target" xml:lang="oc">Occitan</a>
+ </li>
+ <li class="interlanguage-link interwiki-or">
+ <a href="https://or.wikipedia.org/wiki/%E0%AC%A8%E0%AC%BF%E0%AC%89%E0%AC%9C%E0%AC%BF%E0%AC%B2%E0%AD%8D%E0%AD%9F%E0%AC%BE%E0%AC%A3%E0%AD%8D%E0%AC%A1" title="ନିଉଜିଲ୍ୟାଣ୍ଡ – Odia" lang="or" hreflang="or" class="interlanguage-link-target" xml:lang="or">ଓଡ଼ିଆ</a>
+ </li>
+ <li class="interlanguage-link interwiki-uz">
+ <a href="https://uz.wikipedia.org/wiki/Yangi_Zelandiya" title="Yangi Zelandiya – Uzbek" lang="uz" hreflang="uz" class="interlanguage-link-target" xml:lang="uz">Oʻzbekcha/ўзбекча</a>
+ </li>
+ <li class="interlanguage-link interwiki-pa">
+ <a href="https://pa.wikipedia.org/wiki/%E0%A8%A8%E0%A8%BF%E0%A8%8A%E0%A8%9C%E0%A8%BC%E0%A9%80%E0%A8%B2%E0%A9%88%E0%A8%82%E0%A8%A1" title="ਨਿਊਜ਼ੀਲੈਂਡ – Punjabi" lang="pa" hreflang="pa" class="interlanguage-link-target" xml:lang="pa">ਪੰਜਾਬੀ</a>
+ </li>
+ <li class="interlanguage-link interwiki-pi">
+ <a href="https://pi.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82-%E0%A4%9C%E0%A5%80%E0%A4%B2%E0%A5%88%E0%A4%82%E0%A4%A1" title="न्यू-जीलैंड – Pali" lang="pi" hreflang="pi" class="interlanguage-link-target" xml:lang="pi">पालि</a>
+ </li>
+ <li class="interlanguage-link interwiki-pnb">
+ <a href="https://pnb.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%DB%8C_%D9%84%DB%8C%D9%86%DA%88" title="نیوزی لینڈ – Western Punjabi" lang="pnb" hreflang="pnb" class="interlanguage-link-target" xml:lang="pnb">پنجابی</a>
+ </li>
+ <li class="interlanguage-link interwiki-pap">
+ <a href="https://pap.wikipedia.org/wiki/Nueva_Zelandia" title="Nueva Zelandia – Papiamento" lang="pap" hreflang="pap" class="interlanguage-link-target" xml:lang="pap">Papiamentu</a>
+ </li>
+ <li class="interlanguage-link interwiki-jam">
+ <a href="https://jam.wikipedia.org/wiki/Nyuu_Ziilant" title="Nyuu Ziilant – Jamaican Creole English" lang="jam" hreflang="jam" class="interlanguage-link-target" xml:lang="jam">Patois</a>
+ </li>
+ <li class="interlanguage-link interwiki-km">
+ <a href="https://km.wikipedia.org/wiki/%E1%9E%93%E1%9E%BC%E1%9E%9C%E1%9F%82%E1%9E%9B%E1%9E%9F%E1%9F%81%E1%9E%A1%E1%9E%84%E1%9F%8B" title="នូវែលសេឡង់ – Khmer" lang="km" hreflang="km" class="interlanguage-link-target" xml:lang="km">ភាសាខ្មែរ</a>
+ </li>
+ <li class="interlanguage-link interwiki-pcd">
+ <a href="https://pcd.wikipedia.org/wiki/Nov%C3%A8le-Zilinde" title="Novèle-Zilinde – Picard" lang="pcd" hreflang="pcd" class="interlanguage-link-target" xml:lang="pcd">Picard</a>
+ </li>
+ <li class="interlanguage-link interwiki-pms">
+ <a href="https://pms.wikipedia.org/wiki/Neuva_Zelanda" title="Neuva Zelanda – Piedmontese" lang="pms" hreflang="pms" class="interlanguage-link-target" xml:lang="pms">Piemontèis</a>
+ </li>
+ <li class="interlanguage-link interwiki-tpi">
+ <a href="https://tpi.wikipedia.org/wiki/Niu_Silan" title="Niu Silan – Tok Pisin" lang="tpi" hreflang="tpi" class="interlanguage-link-target" xml:lang="tpi">Tok Pisin</a>
+ </li>
+ <li class="interlanguage-link interwiki-nds">
+ <a href="https://nds.wikipedia.org/wiki/Niegseeland" title="Niegseeland – Low German" lang="nds" hreflang="nds" class="interlanguage-link-target" xml:lang="nds">Plattdüütsch</a>
+ </li>
+ <li class="interlanguage-link interwiki-pl">
+ <a href="https://pl.wikipedia.org/wiki/Nowa_Zelandia" title="Nowa Zelandia – Polish" lang="pl" hreflang="pl" class="interlanguage-link-target" xml:lang="pl">Polski</a>
+ </li>
+ <li class="interlanguage-link interwiki-pnt">
+ <a href="https://pnt.wikipedia.org/wiki/%CE%9D%CE%AD%CE%B1_%CE%96%CE%B7%CE%BB%CE%B1%CE%BD%CE%B4%CE%AF%CE%B1" title="Νέα Ζηλανδία – Pontic" lang="pnt" hreflang="pnt" class="interlanguage-link-target" xml:lang="pnt">Ποντιακά</a>
+ </li>
+ <li class="interlanguage-link interwiki-pt">
+ <a href="https://pt.wikipedia.org/wiki/Nova_Zel%C3%A2ndia" title="Nova Zelândia – Portuguese" lang="pt" hreflang="pt" class="interlanguage-link-target" xml:lang="pt">Português</a>
+ </li>
+ <li class="interlanguage-link interwiki-kaa">
+ <a href="https://kaa.wikipedia.org/wiki/Jan%27a_Zelandiya" title="Jan'a Zelandiya – Kara-Kalpak" lang="kaa" hreflang="kaa" class="interlanguage-link-target" xml:lang="kaa">Qaraqalpaqsha</a>
+ </li>
+ <li class="interlanguage-link interwiki-crh">
+ <a href="https://crh.wikipedia.org/wiki/Ya%C3%B1%C4%B1_Zelandiya" title="Yañı Zelandiya – Crimean Turkish" lang="crh" hreflang="crh" class="interlanguage-link-target" xml:lang="crh">Qırımtatarca</a>
+ </li>
+ <li class="interlanguage-link interwiki-ty">
+ <a href="https://ty.wikipedia.org/wiki/Aotearoa" title="Aotearoa – Tahitian" lang="ty" hreflang="ty" class="interlanguage-link-target" xml:lang="ty">Reo tahiti</a>
+ </li>
+ <li class="interlanguage-link interwiki-ro">
+ <a href="https://ro.wikipedia.org/wiki/Noua_Zeeland%C4%83" title="Noua Zeelandă – Romanian" lang="ro" hreflang="ro" class="interlanguage-link-target" xml:lang="ro">Română</a>
+ </li>
+ <li class="interlanguage-link interwiki-rm">
+ <a href="https://rm.wikipedia.org/wiki/Nova_Zelanda" title="Nova Zelanda – Romansh" lang="rm" hreflang="rm" class="interlanguage-link-target" xml:lang="rm">Rumantsch</a>
+ </li>
+ <li class="interlanguage-link interwiki-qu">
+ <a href="https://qu.wikipedia.org/wiki/Musuq_Silanda" title="Musuq Silanda – Quechua" lang="qu" hreflang="qu" class="interlanguage-link-target" xml:lang="qu">Runa Simi</a>
+ </li>
+ <li class="interlanguage-link interwiki-rue">
+ <a href="https://rue.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D1%8B%D0%B9_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4" title="Новый Зеланд – Rusyn" lang="rue" hreflang="rue" class="interlanguage-link-target" xml:lang="rue">Русиньскый</a>
+ </li>
+ <li class="interlanguage-link interwiki-ru badge-Q17437798 badge-goodarticle" title="good article">
+ <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0%D1%8F_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Новая Зеландия – Russian" lang="ru" hreflang="ru" class="interlanguage-link-target" xml:lang="ru">Русский</a>
+ </li>
+ <li class="interlanguage-link interwiki-sah">
+ <a href="https://sah.wikipedia.org/wiki/%D0%A1%D0%B0%D2%A5%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Саҥа Зеландия – Sakha" lang="sah" hreflang="sah" class="interlanguage-link-target" xml:lang="sah">Саха тыла</a>
+ </li>
+ <li class="interlanguage-link interwiki-sat">
+ <a href="https://sat.wikipedia.org/wiki/%E1%B1%B1%E1%B1%A4%E1%B1%A3%E1%B1%A1%E1%B1%A4%E1%B1%9E%E1%B1%AE%E1%B1%B1%E1%B1%B0" title="ᱱᱤᱣᱡᱤᱞᱮᱱᱰ – Santali" lang="sat" hreflang="sat" class="interlanguage-link-target" xml:lang="sat">ᱥᱟᱱᱛᱟᱲᱤ</a>
+ </li>
+ <li class="interlanguage-link interwiki-sm">
+ <a href="https://sm.wikipedia.org/wiki/Niu_Sila" title="Niu Sila – Samoan" lang="sm" hreflang="sm" class="interlanguage-link-target" xml:lang="sm">Gagana Samoa</a>
+ </li>
+ <li class="interlanguage-link interwiki-sa">
+ <a href="https://sa.wikipedia.org/wiki/%E0%A4%A8%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%9C%E0%A4%BF%E0%A4%B2%E0%A5%88%E0%A4%A3%E0%A5%8D%E0%A4%A1%E0%A5%8D" title="न्यूजिलैण्ड् – Sanskrit" lang="sa" hreflang="sa" class="interlanguage-link-target" xml:lang="sa">संस्कृतम्</a>
+ </li>
+ <li class="interlanguage-link interwiki-sc">
+ <a href="https://sc.wikipedia.org/wiki/Noa_Zelanda" title="Noa Zelanda – Sardinian" lang="sc" hreflang="sc" class="interlanguage-link-target" xml:lang="sc">Sardu</a>
+ </li>
+ <li class="interlanguage-link interwiki-sco">
+ <a href="https://sco.wikipedia.org/wiki/New_Zealand" title="New Zealand – Scots" lang="sco" hreflang="sco" class="interlanguage-link-target" xml:lang="sco">Scots</a>
+ </li>
+ <li class="interlanguage-link interwiki-stq">
+ <a href="https://stq.wikipedia.org/wiki/N%C3%A4i-Seelound" title="Näi-Seelound – Saterland Frisian" lang="stq" hreflang="stq" class="interlanguage-link-target" xml:lang="stq">Seeltersk</a>
+ </li>
+ <li class="interlanguage-link interwiki-nso">
+ <a href="https://nso.wikipedia.org/wiki/New_Zealand" title="New Zealand – Northern Sotho" lang="nso" hreflang="nso" class="interlanguage-link-target" xml:lang="nso">Sesotho sa Leboa</a>
+ </li>
+ <li class="interlanguage-link interwiki-sq">
+ <a href="https://sq.wikipedia.org/wiki/Zelanda_e_Re" title="Zelanda e Re – Albanian" lang="sq" hreflang="sq" class="interlanguage-link-target" xml:lang="sq">Shqip</a>
+ </li>
+ <li class="interlanguage-link interwiki-scn">
+ <a href="https://scn.wikipedia.org/wiki/Nova_Zilanna" title="Nova Zilanna – Sicilian" lang="scn" hreflang="scn" class="interlanguage-link-target" xml:lang="scn">Sicilianu</a>
+ </li>
+ <li class="interlanguage-link interwiki-si">
+ <a href="https://si.wikipedia.org/wiki/%E0%B6%B1%E0%B7%80%E0%B7%83%E0%B7%93%E0%B6%BD%E0%B6%B1%E0%B7%8A%E0%B6%AD%E0%B6%BA" title="නවසීලන්තය – Sinhala" lang="si" hreflang="si" class="interlanguage-link-target" xml:lang="si">සිංහල</a>
+ </li>
+ <li class="interlanguage-link interwiki-simple">
+ <a href="https://simple.wikipedia.org/wiki/New_Zealand" title="New Zealand – Simple English" lang="en-simple" hreflang="en-simple" class="interlanguage-link-target" xml:lang="en-simple">Simple English</a>
+ </li>
+ <li class="interlanguage-link interwiki-sd">
+ <a href="https://sd.wikipedia.org/wiki/%D9%86%D9%8A%D9%88%D8%B2%D9%8A%D9%84%D9%8A%D9%86%DA%8A" title="نيوزيلينڊ – Sindhi" lang="sd" hreflang="sd" class="interlanguage-link-target" xml:lang="sd">سنڌي</a>
+ </li>
+ <li class="interlanguage-link interwiki-sk">
+ <a href="https://sk.wikipedia.org/wiki/Nov%C3%BD_Z%C3%A9land" title="Nový Zéland – Slovak" lang="sk" hreflang="sk" class="interlanguage-link-target" xml:lang="sk">Slovenčina</a>
+ </li>
+ <li class="interlanguage-link interwiki-sl">
+ <a href="https://sl.wikipedia.org/wiki/Nova_Zelandija" title="Nova Zelandija – Slovenian" lang="sl" hreflang="sl" class="interlanguage-link-target" xml:lang="sl">Slovenščina</a>
+ </li>
+ <li class="interlanguage-link interwiki-szl">
+ <a href="https://szl.wikipedia.org/wiki/Nowo_Zylandyjo" title="Nowo Zylandyjo – Silesian" lang="szl" hreflang="szl" class="interlanguage-link-target" xml:lang="szl">Ślůnski</a>
+ </li>
+ <li class="interlanguage-link interwiki-so">
+ <a href="https://so.wikipedia.org/wiki/New_Zealand" title="New Zealand – Somali" lang="so" hreflang="so" class="interlanguage-link-target" xml:lang="so">Soomaaliga</a>
+ </li>
+ <li class="interlanguage-link interwiki-ckb">
+ <a href="https://ckb.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%DB%8C%D9%84%D8%A7%D9%86%D8%AF" title="نیوزیلاند – Central Kurdish" lang="ckb" hreflang="ckb" class="interlanguage-link-target" xml:lang="ckb">کوردی</a>
+ </li>
+ <li class="interlanguage-link interwiki-sr badge-Q17437796 badge-featuredarticle" title="featured article">
+ <a href="https://sr.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B8_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4" title="Нови Зеланд – Serbian" lang="sr" hreflang="sr" class="interlanguage-link-target" xml:lang="sr">Српски / srpski</a>
+ </li>
+ <li class="interlanguage-link interwiki-sh">
+ <a href="https://sh.wikipedia.org/wiki/Novi_Zeland" title="Novi Zeland – Serbo-Croatian" lang="sh" hreflang="sh" class="interlanguage-link-target" xml:lang="sh">Srpskohrvatski / српскохрватски</a>
+ </li>
+ <li class="interlanguage-link interwiki-su">
+ <a href="https://su.wikipedia.org/wiki/Selandia_Anyar" title="Selandia Anyar – Sundanese" lang="su" hreflang="su" class="interlanguage-link-target" xml:lang="su">Sunda</a>
+ </li>
+ <li class="interlanguage-link interwiki-fi badge-Q17559452 badge-recommendedarticle" title="recommended article">
+ <a href="https://fi.wikipedia.org/wiki/Uusi-Seelanti" title="Uusi-Seelanti – Finnish" lang="fi" hreflang="fi" class="interlanguage-link-target" xml:lang="fi">Suomi</a>
+ </li>
+ <li class="interlanguage-link interwiki-sv">
+ <a href="https://sv.wikipedia.org/wiki/Nya_Zeeland" title="Nya Zeeland – Swedish" lang="sv" hreflang="sv" class="interlanguage-link-target" xml:lang="sv">Svenska</a>
+ </li>
+ <li class="interlanguage-link interwiki-tl">
+ <a href="https://tl.wikipedia.org/wiki/New_Zealand" title="New Zealand – Tagalog" lang="tl" hreflang="tl" class="interlanguage-link-target" xml:lang="tl">Tagalog</a>
+ </li>
+ <li class="interlanguage-link interwiki-ta">
+ <a href="https://ta.wikipedia.org/wiki/%E0%AE%A8%E0%AE%BF%E0%AE%AF%E0%AF%82%E0%AE%9A%E0%AE%BF%E0%AE%B2%E0%AE%BE%E0%AE%A8%E0%AF%8D%E0%AE%A4%E0%AF%81" title="நியூசிலாந்து – Tamil" lang="ta" hreflang="ta" class="interlanguage-link-target" xml:lang="ta">தமிழ்</a>
+ </li>
+ <li class="interlanguage-link interwiki-kab">
+ <a href="https://kab.wikipedia.org/wiki/Ziland_Tamaynut" title="Ziland Tamaynut – Kabyle" lang="kab" hreflang="kab" class="interlanguage-link-target" xml:lang="kab">Taqbaylit</a>
+ </li>
+ <li class="interlanguage-link interwiki-roa-tara">
+ <a href="https://roa-tara.wikipedia.org/wiki/Nu%C3%A8ve_Zelanne" title="Nuève Zelanne – Tarantino" lang="nap-x-tara" hreflang="nap-x-tara" class="interlanguage-link-target" xml:lang="nap-x-tara">Tarandíne</a>
+ </li>
+ <li class="interlanguage-link interwiki-tt">
+ <a href="https://tt.wikipedia.org/wiki/%D0%AF%D2%A3%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Яңа Зеландия – Tatar" lang="tt" hreflang="tt" class="interlanguage-link-target" xml:lang="tt">Татарча/tatarça</a>
+ </li>
+ <li class="interlanguage-link interwiki-te">
+ <a href="https://te.wikipedia.org/wiki/%E0%B0%A8%E0%B1%8D%E0%B0%AF%E0%B1%82%E0%B0%9C%E0%B1%80%E0%B0%B2%E0%B0%BE%E0%B0%82%E0%B0%A1%E0%B1%8D" title="న్యూజీలాండ్ – Telugu" lang="te" hreflang="te" class="interlanguage-link-target" xml:lang="te">తెలుగు</a>
+ </li>
+ <li class="interlanguage-link interwiki-th">
+ <a href="https://th.wikipedia.org/wiki/%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B9%80%E0%B8%97%E0%B8%A8%E0%B8%99%E0%B8%B4%E0%B8%A7%E0%B8%8B%E0%B8%B5%E0%B9%81%E0%B8%A5%E0%B8%99%E0%B8%94%E0%B9%8C" title="ประเทศนิวซีแลนด์ – Thai" lang="th" hreflang="th" class="interlanguage-link-target" xml:lang="th">ไทย</a>
+ </li>
+ <li class="interlanguage-link interwiki-tg">
+ <a href="https://tg.wikipedia.org/wiki/%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F%D0%B8_%D0%9D%D0%B0%D0%B2" title="Зеландияи Нав – Tajik" lang="tg" hreflang="tg" class="interlanguage-link-target" xml:lang="tg">Тоҷикӣ</a>
+ </li>
+ <li class="interlanguage-link interwiki-tcy">
+ <a href="https://tcy.wikipedia.org/wiki/%E0%B2%A8%E0%B3%8D%E0%B2%AF%E0%B3%82_%E0%B2%9D%E0%B2%BF%E0%B2%B2%E0%B3%86%E0%B2%82%E0%B2%A1%E0%B3%8D" title="ನ್ಯೂ ಝಿಲೆಂಡ್ – Tulu" lang="tcy" hreflang="tcy" class="interlanguage-link-target" xml:lang="tcy">ತುಳು</a>
+ </li>
+ <li class="interlanguage-link interwiki-tr">
+ <a href="https://tr.wikipedia.org/wiki/Yeni_Zelanda" title="Yeni Zelanda – Turkish" lang="tr" hreflang="tr" class="interlanguage-link-target" xml:lang="tr">Türkçe</a>
+ </li>
+ <li class="interlanguage-link interwiki-tk">
+ <a href="https://tk.wikipedia.org/wiki/T%C3%A4ze_Zelandi%C3%BDa" title="Täze Zelandiýa – Turkmen" lang="tk" hreflang="tk" class="interlanguage-link-target" xml:lang="tk">Türkmençe</a>
+ </li>
+ <li class="interlanguage-link interwiki-udm">
+ <a href="https://udm.wikipedia.org/wiki/%D0%92%D1%8B%D0%BB%D1%8C_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D0%B8%D1%8F" title="Выль Зеландия – Udmurt" lang="udm" hreflang="udm" class="interlanguage-link-target" xml:lang="udm">Удмурт</a>
+ </li>
+ <li class="interlanguage-link interwiki-uk">
+ <a href="https://uk.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0_%D0%97%D0%B5%D0%BB%D0%B0%D0%BD%D0%B4%D1%96%D1%8F" title="Нова Зеландія – Ukrainian" lang="uk" hreflang="uk" class="interlanguage-link-target" xml:lang="uk">Українська</a>
+ </li>
+ <li class="interlanguage-link interwiki-ur">
+ <a href="https://ur.wikipedia.org/wiki/%D9%86%DB%8C%D9%88%D8%B2%DB%8C_%D9%84%DB%8C%D9%86%DA%88" title="نیوزی لینڈ – Urdu" lang="ur" hreflang="ur" class="interlanguage-link-target" xml:lang="ur">اردو</a>
+ </li>
+ <li class="interlanguage-link interwiki-ug">
+ <a href="https://ug.wikipedia.org/wiki/%D9%8A%DB%90%DA%AD%D9%89_%D8%B2%DB%90%D9%84%D8%A7%D9%86%D8%AF%D9%89%D9%8A%DB%95" title="يېڭى زېلاندىيە – Uyghur" lang="ug" hreflang="ug" class="interlanguage-link-target" xml:lang="ug">ئۇيغۇرچە / Uyghurche</a>
+ </li>
+ <li class="interlanguage-link interwiki-za">
+ <a href="https://za.wikipedia.org/wiki/Saen_Saelanz" title="Saen Saelanz – Zhuang" lang="za" hreflang="za" class="interlanguage-link-target" xml:lang="za">Vahcuengh</a>
+ </li>
+ <li class="interlanguage-link interwiki-vec">
+ <a href="https://vec.wikipedia.org/wiki/Nova_Ze%C5%82anda" title="Nova Zełanda – Venetian" lang="vec" hreflang="vec" class="interlanguage-link-target" xml:lang="vec">Vèneto</a>
+ </li>
+ <li class="interlanguage-link interwiki-vep">
+ <a href="https://vep.wikipedia.org/wiki/Uz%27_Zelandii" title="Uz' Zelandii – Veps" lang="vep" hreflang="vep" class="interlanguage-link-target" xml:lang="vep">Vepsän kel’</a>
+ </li>
+ <li class="interlanguage-link interwiki-vi">
+ <a href="https://vi.wikipedia.org/wiki/New_Zealand" title="New Zealand – Vietnamese" lang="vi" hreflang="vi" class="interlanguage-link-target" xml:lang="vi">Tiếng Việt</a>
+ </li>
+ <li class="interlanguage-link interwiki-vo">
+ <a href="https://vo.wikipedia.org/wiki/Nula-Sele%C3%A4ns" title="Nula-Seleäns – Volapük" lang="vo" hreflang="vo" class="interlanguage-link-target" xml:lang="vo">Volapük</a>
+ </li>
+ <li class="interlanguage-link interwiki-fiu-vro">
+ <a href="https://fiu-vro.wikipedia.org/wiki/Vahts%C3%B5n%C3%B5_Meremaa" title="Vahtsõnõ Meremaa – Võro" lang="vro" hreflang="vro" class="interlanguage-link-target" xml:lang="vro">Võro</a>
+ </li>
+ <li class="interlanguage-link interwiki-wa">
+ <a href="https://wa.wikipedia.org/wiki/Nouve_Zelande" title="Nouve Zelande – Walloon" lang="wa" hreflang="wa" class="interlanguage-link-target" xml:lang="wa">Walon</a>
+ </li>
+ <li class="interlanguage-link interwiki-zh-classical">
+ <a href="https://zh-classical.wikipedia.org/wiki/%E7%B4%90%E8%A5%BF%E8%98%AD" title="紐西蘭 – Classical Chinese" lang="lzh" hreflang="lzh" class="interlanguage-link-target" xml:lang="lzh">文言</a>
+ </li>
+ <li class="interlanguage-link interwiki-vls">
+ <a href="https://vls.wikipedia.org/wiki/Nieuw-Z%C3%AAeland" title="Nieuw-Zêeland – West Flemish" lang="vls" hreflang="vls" class="interlanguage-link-target" xml:lang="vls">West-Vlams</a>
+ </li>
+ <li class="interlanguage-link interwiki-war">
+ <a href="https://war.wikipedia.org/wiki/Bag-o_nga_Zelanda" title="Bag-o nga Zelanda – Waray" lang="war" hreflang="war" class="interlanguage-link-target" xml:lang="war">Winaray</a>
+ </li>
+ <li class="interlanguage-link interwiki-wo">
+ <a href="https://wo.wikipedia.org/wiki/Seland-Gu-Bees" title="Seland-Gu-Bees – Wolof" lang="wo" hreflang="wo" class="interlanguage-link-target" xml:lang="wo">Wolof</a>
+ </li>
+ <li class="interlanguage-link interwiki-wuu">
+ <a href="https://wuu.wikipedia.org/wiki/%E6%96%B0%E8%A5%BF%E5%85%B0" title="新西兰 – Wu Chinese" lang="wuu" hreflang="wuu" class="interlanguage-link-target" xml:lang="wuu">吴语</a>
+ </li>
+ <li class="interlanguage-link interwiki-yi">
+ <a href="https://yi.wikipedia.org/wiki/%D7%A0%D7%99%D7%95_%D7%96%D7%99%D7%9C%D7%90%D7%A0%D7%93" title="ניו זילאנד – Yiddish" lang="yi" hreflang="yi" class="interlanguage-link-target" xml:lang="yi">ייִדיש</a>
+ </li>
+ <li class="interlanguage-link interwiki-yo">
+ <a href="https://yo.wikipedia.org/wiki/New_Zealand" title="New Zealand – Yoruba" lang="yo" hreflang="yo" class="interlanguage-link-target" xml:lang="yo">Yorùbá</a>
+ </li>
+ <li class="interlanguage-link interwiki-zh-yue">
+ <a href="https://zh-yue.wikipedia.org/wiki/%E7%B4%90%E8%A5%BF%E8%98%AD" title="紐西蘭 – Cantonese" lang="yue" hreflang="yue" class="interlanguage-link-target" xml:lang="yue">粵語</a>
+ </li>
+ <li class="interlanguage-link interwiki-diq">
+ <a href="https://diq.wikipedia.org/wiki/Zelanda_Newiye" title="Zelanda Newiye – Zazaki" lang="diq" hreflang="diq" class="interlanguage-link-target" xml:lang="diq">Zazaki</a>
+ </li>
+ <li class="interlanguage-link interwiki-zea badge-Q17437796 badge-featuredarticle" title="featured article">
+ <a href="https://zea.wikipedia.org/wiki/Nieuw-Ze%C3%AAland" title="Nieuw-Zeêland – Zeelandic" lang="zea" hreflang="zea" class="interlanguage-link-target" xml:lang="zea">Zeêuws</a>
+ </li>
+ <li class="interlanguage-link interwiki-bat-smg">
+ <a href="https://bat-smg.wikipedia.org/wiki/Naujuoj%C4%97_Zeland%C4%97j%C4%97" title="Naujuojė Zelandėjė – Samogitian" lang="sgs" hreflang="sgs" class="interlanguage-link-target" xml:lang="sgs">Žemaitėška</a>
+ </li>
+ <li class="interlanguage-link interwiki-zh">
+ <a href="https://zh.wikipedia.org/wiki/%E6%96%B0%E8%A5%BF%E5%85%B0" title="新西兰 – Chinese" lang="zh" hreflang="zh" class="interlanguage-link-target" xml:lang="zh">中文</a>
+ </li>
+ </ul>
+ <div class="after-portlet after-portlet-lang">
+ <span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q664#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="footer" role="contentinfo">
+ <ul id="footer-info">
+ <li id="footer-info-lastmod">This page was last edited on 26 September 2019, at 11:35<span class="anonymous-show">&#160;(UTC)</span>.
+ </li>
+ <li id="footer-info-copyright">Text is available under the <a rel="license" href="//en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License">Creative Commons Attribution-ShareAlike License</a><a rel="license" href="//creativecommons.org/licenses/by-sa/3.0/" style="display:none;"></a>; additional terms may apply. By using this site, you agree to the <a href="//foundation.wikimedia.org/wiki/Terms_of_Use">Terms of Use</a> and <a href="//foundation.wikimedia.org/wiki/Privacy_policy">Privacy Policy</a>. Wikipedia® is a registered trademark of the <a href="//www.wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.
+ </li>
+ </ul>
+ <ul id="footer-places">
+ <li id="footer-places-privacy">
+ <a href="https://foundation.wikimedia.org/wiki/Privacy_policy" class="extiw" title="wmf:Privacy policy">Privacy policy</a>
+ </li>
+ <li id="footer-places-about">
+ <a href="/wiki/Wikipedia:About" title="Wikipedia:About">About Wikipedia</a>
+ </li>
+ <li id="footer-places-disclaimer">
+ <a href="/wiki/Wikipedia:General_disclaimer" title="Wikipedia:General disclaimer">Disclaimers</a>
+ </li>
+ <li id="footer-places-contact">
+ <a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a>
+ </li>
+ <li id="footer-places-developers">
+ <a href="https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute">Developers</a>
+ </li>
+ <li id="footer-places-cookiestatement">
+ <a href="https://foundation.wikimedia.org/wiki/Cookie_statement">Cookie statement</a>
+ </li>
+ <li id="footer-places-mobileview">
+ <a href="//en.m.wikipedia.org/w/index.php?title=New_Zealand&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a>
+ </li>
+ </ul>
+ <ul id="footer-icons" class="noprint">
+ <li id="footer-copyrightico">
+ <a href="https://wikimediafoundation.org/"><img src="/static/images/wikimedia-button.png" srcset="/static/images/wikimedia-button-1.5x.png 1.5x, /static/images/wikimedia-button-2x.png 2x" width="88" height="31" alt="Wikimedia Foundation" /></a>
+ </li>
+ <li id="footer-poweredbyico">
+ <a href="https://www.mediawiki.org/"><img src="/static/images/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" srcset="/static/images/poweredby_mediawiki_132x47.png 1.5x, /static/images/poweredby_mediawiki_176x62.png 2x" width="88" height="31" /></a>
+ </li>
+ </ul>
+ <div style="clear: both;"></div>
+ </div>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"4.724","walltime":"5.994","ppvisitednodes":{"value":29561,"limit":1000000},"ppgeneratednodes":{"value":0,"limit":1500000},"postexpandincludesize":{"value":939991,"limit":2097152},"templateargumentsize":{"value":96801,"limit":2097152},"expansiondepth":{"value":21,"limit":40},"expensivefunctioncount":{"value":58,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":1116291,"limit":5000000},"entityaccesscount":{"value":6,"limit":400},"timingprofile":["100.00% 5262.657 1 -total"," 44.81% 2358.352 2 Template:Reflist"," 19.19% 1010.093 2 Template:Coord"," 16.78% 883.023 160 Template:Cite_web"," 10.24% 538.992 99 Template:Cite_encyclopedia"," 10.13% 533.130 1 Template:Infobox_country"," 10.00% 526.478 3 Template:Infobox"," 5.12% 269.426 27 Template:Cite_journal"," 3.50% 184.297 1 Template:Native_name"," 3.50% 184.037 41 Template:Cite_book"]},"scribunto":{"limitreport-timeusage":{"value":"2.802","limit":"10.000"},"limitreport-memusage":{"value":34909298,"limit":52428800},"limitreport-profile":[["?","480","15.1"],["Scribunto_LuaSandboxCallback::getEntity","380","11.9"],["Scribunto_LuaSandboxCallback::match","300","9.4"],["Scribunto_LuaSandboxCallback::gsub","280","8.8"],["recursiveClone \u003CmwInit.lua:41\u003E","260","8.2"],["\u003Cmw.lua:684\u003E","160","5.0"],["type","160","5.0"],["Scribunto_LuaSandboxCallback::callParserFunction","120","3.8"],["dataWrapper \u003Cmw.lua:662\u003E","120","3.8"],["Scribunto_LuaSandboxCallback::getExpandedArgument","100","3.1"],["[others]","820","25.8"]]},"cachereport":{"origin":"mw1331","timestamp":"20190926113600","ttl":86400,"transientcontent":true}}});});
+ ]]>
+ </script>
+ <script type="application/ld+json">
+ <![CDATA[
+ {"@context":"https:\/\/schema.org","@type":"Article","name":"New Zealand","url":"https:\/\/en.wikipedia.org\/wiki\/New_Zealand","sameAs":"http:\/\/www.wikidata.org\/entity\/Q664","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q664","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2001-10-29T01:59:14Z","dateModified":"2019-09-26T11:35:37Z","image":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/3e\/Flag_of_New_Zealand.svg","headline":"constitutional monarchy in Oceania"}
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgBackendResponseTime":6287,"wgHostname":"mw1331"});});
+ ]]>
+ </script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-images.json
new file mode 100644
index 000000000..caa1f9b4b
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-images.json
@@ -0,0 +1,53 @@
+[
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/28a0aaa74b2267a48312e19321211cd9e3a39228",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/6ca00b61ff0e264e6c1e5adc9a00c0d2751feecf",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/7daff47fa58cdfd29dc333def748ff5fa4c923e3",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/d9415702ab196cc26f5df37af2d90e07318e93df",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/291d260bf69b764e75818669ab27870d58771e1f",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/8aa270391d183478251283d2c4b2c72ac4563352",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/5541bfa07743be995242c892c344395e672d6fa2",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/459de45e76bace9d04a80d2e8efc2abbbc246047",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/6425c6e94fa47976601cb44d7564b5d04dcfbfef",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/9a50080b735975d8001c9552ac2134b49ad534c0",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/997ea0350c18735926412de88420ac9ca989f50c",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/54bf0331204e30cba9ec7f695dfea97e6745a7c2",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/92efef0e89bdc77f6a848764195ef5b9d9bfcc6a",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/00ccf11c16396b6ddd4f2254f7132cd8bb2c57ee",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/3f0efab2d7c3a4b4b7caf14cc0705dadd13195a9",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/47136aad860d145f75f3eed3022df827cee94d7a",
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/1\/1c\/Wiki_letter_w_cropped.svg\/44px-Wiki_letter_w_cropped.svg.png",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/4fa8265c5f6d4fc3b7cda6a06558c7d4d9aec855",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/0f1862750b96d01100244370b3fca45f01923ce5",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/251bf4ebbe3b0d119e0a7d19f8fd134c4f072971",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/021893240ff7fa3148b6649b0ba4d88cd207b5f0",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/a28a8250ab35ad60228bb0376eb4b7024f027815",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/a0179c3a7aebe194ccd9a19ba02b972500f88a7a",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/b6cf8185ca7a0687bf959bb65b16db6cf1714ca2",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/d303a1ebcac8547489b170be5d0dd7d8e04e548e",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/992c8ea49fdd26b491180036c5a4d879fec77442",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/46eedb181c0bdae46e8c1526161b03d0ea97b4b4",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/ddeac51c423f6dbefc5f63e483d9aee96e6fa342",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/db65cce3a8fa33e5b7b96badd756c8573aa866c0",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/add78d8608ad86e54951b8c8bd6c8d8416533d20",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/4ea1ea9ac61e6e1e84ac39130f78143c18865719",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/3b7d749931e5f709bcbc0a446638d3b6b8ed0c6c",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/fa91daf9145f27bb95746fd2a37537342d587b77",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/1934e7eadd31fbf6f7d6bcf9c0e9bec934ce8976",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/a1240df64c3010e0be6eae865fdfcfe6f77bf5eb",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/43cc392bdcfbb134dd66d9b469847f6370e29d9d",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/3ef97bb04ce4ab682bcc84cf1059f8da235b483e",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/f4ac665be4943ce769e33109e9f64abcf1e98050",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/0919d2e50fe1008af261f8301f243c002c328dbf",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/f8ed067bb4bc06662d6bdf6210d450779a529ce5",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/6ad9b0047f8437f7b012041d7b2fcd190a5a9ec2",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/b431248ab2f121914608bbd1c2376715cecda9c8",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/d4ee4832d06e8560510d81237d0650c897d476e9",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/b1d54d3c850d35f99329591e3b57cef98d17237f",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/86a67b81c2de995bd608d5b2df50cd8cd7d92455",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/82c24522483ceaf1d54224b69af4244b60c3ac08",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/87f9e315fd7e2ba406057a97300593c4802b53e4",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/486623019ef451e0582b874018e0249a46e0f996",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/18fbf88c578fc9f75d4610ebd18ab55f4f2842ce",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/200db82bfdbc81cd227cb3470aa826d6f11a7653",
+ "https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/957584ae6a35f9edf293cb486d7436fb5b75e803"
+] \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-metadata.json
new file mode 100644
index 000000000..27df15632
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected-metadata.json
@@ -0,0 +1,8 @@
+{
+ "Author": "Contributors to Wikimedia projects",
+ "Direction": "ltr",
+ "Excerpt": "In mathematics, a Hermitian matrix (or self-adjoint matrix) is a complex square matrix that is equal to its own conjugate transpose\u2014that is, the element in the i-th row and j-th column is equal to the complex conjugate of the element in the j-th row and i-th column, for all indices i and j:",
+ "Image": null,
+ "Title": "Hermitian matrix",
+ "SiteName": "Wikimedia Foundation, Inc."
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected.html
new file mode 100644
index 000000000..ff7c62cbf
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/expected.html
@@ -0,0 +1,354 @@
+<div id="mw-content-text" lang="en" dir="ltr">
+
+
+ <p>
+ In mathematics, a <b>Hermitian matrix</b> (or <b>self-adjoint matrix</b>) is a <a href="http://fakehost/wiki/Complex_number" title="Complex number">complex</a> <a href="http://fakehost/wiki/Square_matrix" title="Square matrix">square matrix</a> that is equal to its own <a href="http://fakehost/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a>—that is, the element in the <span>i</span>-th row and <span>j</span>-th column is equal to the <a href="http://fakehost/wiki/Complex_conjugate" title="Complex conjugate">complex conjugate</a> of the element in the <span>j</span>-th row and <span>i</span>-th column, for all indices <span>i</span> and <span>j</span>:
+ </p>
+ <p>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/28a0aaa74b2267a48312e19321211cd9e3a39228" aria-hidden="true" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad a_{ij}={\overline {a_{ji}}}}"></span>
+ </p>
+ <p>
+ or in matrix form:
+ </p>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6ca00b61ff0e264e6c1e5adc9a00c0d2751feecf" aria-hidden="true" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A={\overline {A^{\mathsf {T}}}}}"></span>.
+ </dd>
+ </dl>
+ <p>
+ Hermitian matrices can be understood as the complex extension of real <a href="http://fakehost/wiki/Symmetric_matrix" title="Symmetric matrix">symmetric matrices</a>.
+ </p>
+ <p>
+ If the <a href="http://fakehost/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a> of a matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is denoted by <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d9415702ab196cc26f5df37af2d90e07318e93df" aria-hidden="true" alt="{\displaystyle A^{\mathsf {H}}}"></span>, then the Hermitian property can be written concisely as
+ </p>
+ <p>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/291d260bf69b764e75818669ab27870d58771e1f" aria-hidden="true" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A=A^{\mathsf {H}}}"></span>
+ </p>
+ <p>
+ Hermitian matrices are named after <a href="http://fakehost/wiki/Charles_Hermite" title="Charles Hermite">Charles Hermite</a>, who demonstrated in 1855 that matrices of this form share a property with real symmetric matrices of always having real <a href="http://fakehost/wiki/Eigenvalues_and_eigenvectors" title="Eigenvalues and eigenvectors">eigenvalues</a>. Other, equivalent notations in common use are <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/8aa270391d183478251283d2c4b2c72ac4563352" aria-hidden="true" alt="{\displaystyle A^{\mathsf {H}}=A^{\dagger }=A^{\ast }}"></span>, although note that in <a href="http://fakehost/wiki/Quantum_mechanics" title="Quantum mechanics">quantum mechanics</a>, <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/5541bfa07743be995242c892c344395e672d6fa2" aria-hidden="true" alt="A^{\ast }"></span> typically means the <a href="http://fakehost/wiki/Complex_conjugate" title="Complex conjugate">complex conjugate</a> only, and not the <a href="http://fakehost/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a>.
+ </p>
+
+ <h2>
+ <span id="Alternative_characterizations">Alternative characterizations</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=1" title="Edit section: Alternative characterizations">edit</a><span>]</span></span>
+ </h2>
+ <p>
+ Hermitian matrices can be characterized in a number of equivalent ways, some of which are listed below:
+ </p>
+ <h3>
+ <span id="Equality_with_the_adjoint">Equality with the adjoint</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=2" title="Edit section: Equality with the adjoint">edit</a><span>]</span></span>
+ </h3>
+ <p>
+ A square matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is Hermitian if and only if it is equal to its <a href="http://fakehost/wiki/Hermitian_adjoint" title="Hermitian adjoint">adjoint</a>, that is, it satisfies
+ </p>
+ <div>
+ <p><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/459de45e76bace9d04a80d2e8efc2abbbc246047" aria-hidden="true" alt="{\displaystyle \langle w,Av\rangle =\langle Aw,v\rangle ,}">
+ </p></div><p>for any pair of vectors <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6425c6e94fa47976601cb44d7564b5d04dcfbfef" aria-hidden="true" alt="v,w"></span>, where <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/9a50080b735975d8001c9552ac2134b49ad534c0" aria-hidden="true" alt="{\displaystyle \langle \cdot ,\cdot \rangle }"></span> denotes <a href="http://fakehost/wiki/Dot_product" title="Dot product">the inner product</a> operation.
+ </p><p>
+ This is also the way that the more general concept of <a href="http://fakehost/wiki/Self-adjoint_operator" title="Self-adjoint operator">self-adjoint operator</a> is defined.
+ </p>
+ <h3>
+ <span id="Reality_of_quadratic_forms">Reality of quadratic forms</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=3" title="Edit section: Reality of quadratic forms">edit</a><span>]</span></span>
+ </h3>
+ <p>
+ A square matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is Hermitian if and only if it is such that
+ </p>
+ <div>
+ <p><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/997ea0350c18735926412de88420ac9ca989f50c" aria-hidden="true" alt="{\displaystyle \langle v,Av\rangle \in \mathbb {R} ,\quad v\in V.}">
+ </p></div>
+ <h3>
+ <span id="Spectral_properties">Spectral properties</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=4" title="Edit section: Spectral properties">edit</a><span>]</span></span>
+ </h3>
+ <p>
+ A square matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is Hermitian if and only if it is unitarily <a href="http://fakehost/wiki/Diagonalizable_matrix" title="Diagonalizable matrix">diagonalizable</a> with real <a href="http://fakehost/wiki/Eigenvalues_and_eigenvectors" title="Eigenvalues and eigenvectors">eigenvalues</a>.
+ </p>
+ <h2>
+ <span id="Applications">Applications</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=5" title="Edit section: Applications">edit</a><span>]</span></span>
+ </h2>
+ <p>
+ Hermitian matrices are fundamental to the quantum theory of <a href="http://fakehost/wiki/Matrix_mechanics" title="Matrix mechanics">matrix mechanics</a> created by <a href="http://fakehost/wiki/Werner_Heisenberg" title="Werner Heisenberg">Werner Heisenberg</a>, <a href="http://fakehost/wiki/Max_Born" title="Max Born">Max Born</a>, and <a href="http://fakehost/wiki/Pascual_Jordan" title="Pascual Jordan">Pascual Jordan</a> in 1925.
+ </p>
+ <h2>
+ <span id="Examples">Examples</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=6" title="Edit section: Examples">edit</a><span>]</span></span>
+ </h2>
+ <p>
+ In this section, the conjugate transpose of matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is denoted as <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d9415702ab196cc26f5df37af2d90e07318e93df" aria-hidden="true" alt="{\displaystyle A^{\mathsf {H}}}"></span>, the transpose of matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is denoted as <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/54bf0331204e30cba9ec7f695dfea97e6745a7c2" aria-hidden="true" alt="{\displaystyle A^{\mathsf {T}}}"></span> and conjugate of matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is denoted as <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/92efef0e89bdc77f6a848764195ef5b9d9bfcc6a" aria-hidden="true" alt="{\displaystyle {\overline {A}}}"></span>.
+ </p>
+ <p>
+ See the following example:
+ </p>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/00ccf11c16396b6ddd4f2254f7132cd8bb2c57ee" aria-hidden="true" alt="{\displaystyle {\begin{bmatrix}2&amp;2+i&amp;4\\2-i&amp;3&amp;i\\4&amp;-i&amp;1\\\end{bmatrix}}}"></span>
+ </dd>
+ </dl>
+ <p>
+ The diagonal elements must be <a href="http://fakehost/wiki/Real_number" title="Real number">real</a>, as they must be their own complex conjugate.
+ </p>
+ <p>
+ Well-known families of <a href="http://fakehost/wiki/Pauli_matrices" title="Pauli matrices">Pauli matrices</a>, <a href="http://fakehost/wiki/Gell-Mann_matrices" title="Gell-Mann matrices">Gell-Mann matrices</a> and their generalizations are Hermitian. In <a href="http://fakehost/wiki/Theoretical_physics" title="Theoretical physics">theoretical physics</a> such Hermitian matrices are often multiplied by <a href="http://fakehost/wiki/Imaginary_number" title="Imaginary number">imaginary</a> coefficients,<sup id="cite_ref-1"><a href="#cite_note-1">[1]</a></sup><sup id="cite_ref-2"><a href="#cite_note-2">[2]</a></sup> which results in <i>skew-Hermitian</i> matrices (see <a href="#facts">below</a>).
+ </p>
+ <p>
+ Here, we offer another useful Hermitian matrix using an abstract example. If a square matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> equals the <a href="http://fakehost/wiki/Matrix_multiplication" title="Matrix multiplication">multiplication of a matrix</a> and its conjugate transpose, that is, <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3f0efab2d7c3a4b4b7caf14cc0705dadd13195a9" aria-hidden="true" alt="{\displaystyle A=BB^{\mathsf {H}}}"></span>, then <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is a Hermitian <a href="http://fakehost/wiki/Positive_semi-definite_matrix" title="Positive semi-definite matrix">positive semi-definite matrix</a>. Furthermore, if <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a" aria-hidden="true" alt="B"></span> is row full-rank, then <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" aria-hidden="true" alt="A"></span> is positive definite.
+ </p>
+ <h2>
+ <span id="Properties">Properties</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=7" title="Edit section: Properties">edit</a><span>]</span></span>
+ </h2>
+ <table role="presentation" readabilityDataTable="0">
+ <tbody>
+ <tr>
+ <td>
+ <p><a href="http://fakehost/wiki/File:Wiki_letter_w_cropped.svg"><img alt="[icon]" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/44px-Wiki_letter_w_cropped.svg.png" decoding="async" width="44" height="31" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/66px-Wiki_letter_w_cropped.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/88px-Wiki_letter_w_cropped.svg.png 2x" data-file-width="44" data-file-height="31"></a>
+ </p>
+ </td>
+ <td>
+ <p>
+ This section <b>needs expansion</b> with: Proof of the properties requested. <small>You can help by <a href="https://en.wikipedia.org/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=1">adding to it</a>.</small> <small><i>(<span>February 2018</span>)</i></small>
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <ul>
+ <li>The entries on the <a href="http://fakehost/wiki/Main_diagonal" title="Main diagonal">main diagonal</a> (top left to bottom right) of any Hermitian matrix are <a href="http://fakehost/wiki/Real_number" title="Real number">real</a>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> By definition of the Hermitian matrix
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4fa8265c5f6d4fc3b7cda6a06558c7d4d9aec855" aria-hidden="true" alt="{\displaystyle H_{ij}={\overline {H}}_{ji}}"></span>
+ </dd>
+ </dl>
+ </dd>
+ <dd>
+ so for <span><i>i</i> = <i>j</i></span> the above follows.
+ </dd>
+ <dd>
+ Only the <a href="http://fakehost/wiki/Main_diagonal" title="Main diagonal">main diagonal</a> entries are necessarily real; Hermitian matrices can have arbitrary complex-valued entries in their <a href="http://fakehost/wiki/Off-diagonal_element" title="Off-diagonal element">off-diagonal elements</a>, as long as diagonally-opposite entries are complex conjugates.
+ </dd>
+ </dl>
+ <ul>
+ <li>A matrix that has only real entries is Hermitian <a href="http://fakehost/wiki/If_and_only_if" title="If and only if">if and only if</a> it is <a href="http://fakehost/wiki/Symmetric_matrix" title="Symmetric matrix">symmetric</a>. A real and symmetric matrix is simply a special case of a Hermitian matrix.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4fa8265c5f6d4fc3b7cda6a06558c7d4d9aec855" aria-hidden="true" alt="{\displaystyle H_{ij}={\overline {H}}_{ji}}"></span> by definition. Thus <span>H<sub><i>ij</i></sub> = H<sub><i>ji</i></sub></span> (matrix symmetry) if and only if <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/0f1862750b96d01100244370b3fca45f01923ce5" aria-hidden="true" alt="{\displaystyle H_{ij}={\overline {H}}_{ij}}"></span> (<span>H<sub><i>ij</i></sub></span> is real).
+ </dd>
+ </dl>
+ <ul>
+ <li>Every Hermitian matrix is a <a href="http://fakehost/wiki/Normal_matrix" title="Normal matrix">normal matrix</a>. That is to say, <span>AA<sup>H</sup> = A<sup>H</sup>A</span>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span>A = A<sup>H</sup></span>, so <span>AA<sup>H</sup> = AA = A<sup>H</sup>A</span>.
+ </dd>
+ </dl>
+ <ul>
+ <li>The finite-dimensional <a href="http://fakehost/wiki/Spectral_theorem" title="Spectral theorem">spectral theorem</a> says that any Hermitian matrix can be <a href="http://fakehost/wiki/Diagonalizable_matrix" title="Diagonalizable matrix">diagonalized</a> by a <a href="http://fakehost/wiki/Unitary_matrix" title="Unitary matrix">unitary matrix</a>, and that the resulting diagonal matrix has only real entries. This implies that all <a href="http://fakehost/wiki/Eigenvectors" title="Eigenvectors">eigenvalues</a> of a Hermitian matrix <span>A</span> with dimension <span>n</span> are real, and that <span>A</span> has <span>n</span> linearly independent <a href="http://fakehost/wiki/Eigenvector" title="Eigenvector">eigenvectors</a>. Moreover, a Hermitian matrix has <a href="http://fakehost/wiki/Orthogonal" title="Orthogonal">orthogonal</a> eigenvectors for distinct eigenvalues. Even if there are degenerate eigenvalues, it is always possible to find an <a href="http://fakehost/wiki/Orthogonal_basis" title="Orthogonal basis">orthogonal basis</a> of <span>ℂ<sup><i>n</i></sup></span> consisting of <span>n</span> eigenvectors of <span>A</span>.
+ </li>
+ </ul>
+ <ul>
+ <li>The sum of any two Hermitian matrices is Hermitian.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/251bf4ebbe3b0d119e0a7d19f8fd134c4f072971" aria-hidden="true" alt="{\displaystyle (A+B)_{ij}=A_{ij}+B_{ij}={\overline {A}}_{ji}+{\overline {B}}_{ji}={\overline {(A+B)}}_{ji},}"></span> as claimed.
+ </dd>
+ </dl>
+ <ul>
+ <li>The <a href="http://fakehost/wiki/Inverse_matrix" title="Inverse matrix">inverse</a> of an invertible Hermitian matrix is Hermitian as well.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> If <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/021893240ff7fa3148b6649b0ba4d88cd207b5f0" aria-hidden="true" alt="{\displaystyle A^{-1}A=I}"></span>, then <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a28a8250ab35ad60228bb0376eb4b7024f027815" aria-hidden="true" alt="{\displaystyle I=I^{H}=(A^{-1}A)^{H}=A^{H}(A^{-1})^{H}=A(A^{-1})^{H}}"></span>, so <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a0179c3a7aebe194ccd9a19ba02b972500f88a7a" aria-hidden="true" alt="{\displaystyle A^{-1}=(A^{-1})^{H}}"></span> as claimed.
+ </dd>
+ </dl>
+ <ul>
+ <li>The <a href="http://fakehost/wiki/Matrix_multiplication" title="Matrix multiplication">product</a> of two Hermitian matrices <span>A</span> and <span>B</span> is Hermitian if and only if <span><i>AB</i> = <i>BA</i></span>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> Note that <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b6cf8185ca7a0687bf959bb65b16db6cf1714ca2" aria-hidden="true" alt="{\displaystyle (AB)^{\mathsf {H}}={\overline {(AB)^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}A^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}}}{\overline {A^{\mathsf {T}}}}=B^{\mathsf {H}}A^{\mathsf {H}}=BA.}"></span> Thus <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d303a1ebcac8547489b170be5d0dd7d8e04e548e" aria-hidden="true" alt="{\displaystyle (AB)^{\mathsf {H}}=AB}"></span> <a href="http://fakehost/wiki/If_and_only_if" title="If and only if">if and only if</a> <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/992c8ea49fdd26b491180036c5a4d879fec77442" aria-hidden="true" alt="AB=BA"></span>.
+ </dd>
+ <dd>
+ Thus <span><i>A</i><sup><i>n</i></sup></span> is Hermitian if <span>A</span> is Hermitian and <span>n</span> is an integer.
+ </dd>
+ </dl>
+
+ <ul>
+ <li>The Hermitian complex <span>n</span>-by-<span>n</span> matrices do not form a <a href="http://fakehost/wiki/Vector_space" title="Vector space">vector space</a> over the <a href="http://fakehost/wiki/Complex_number" title="Complex number">complex numbers</a>, <span>ℂ</span>, since the identity matrix <span><i>I</i><sub><i>n</i></sub></span> is Hermitian, but <span><i>i</i> <i>I</i><sub><i>n</i></sub></span> is not. However the complex Hermitian matrices <i>do</i> form a vector space over the <a href="http://fakehost/wiki/Real_numbers" title="Real numbers">real numbers</a> <span>ℝ</span>. In the <span>2<i>n</i><sup>2</sup></span>-<a href="http://fakehost/wiki/Dimension_of_a_vector_space" title="Dimension of a vector space">dimensional</a> vector space of complex <span><i>n</i> × <i>n</i></span> matrices over <span>ℝ</span>, the complex Hermitian matrices form a subspace of dimension <span><i>n</i><sup>2</sup></span>. If <span><i>E</i><sub><i>jk</i></sub></span> denotes the <span>n</span>-by-<span>n</span> matrix with a <span>1</span> in the <span><i>j</i>,<i>k</i></span> position and zeros elsewhere, a basis (orthonormal w.r.t. the Frobenius inner product) can be described as follows:
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/46eedb181c0bdae46e8c1526161b03d0ea97b4b4" aria-hidden="true" alt="{\displaystyle E_{jj}{\text{ for }}1\leq j\leq n\quad (n{\text{ matrices}})}"></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ together with the set of matrices of the form
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/ddeac51c423f6dbefc5f63e483d9aee96e6fa342" aria-hidden="true" alt="{\displaystyle {\frac {1}{\sqrt {2}}}\left(E_{jk}+E_{kj}\right){\text{ for }}1\leq j<k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}"></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ and the matrices
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/db65cce3a8fa33e5b7b96badd756c8573aa866c0" aria-hidden="true" alt="{\displaystyle {\frac {i}{\sqrt {2}}}\left(E_{jk}-E_{kj}\right){\text{ for }}1\leq j<k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}"></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ where <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/add78d8608ad86e54951b8c8bd6c8d8416533d20" aria-hidden="true" alt="i"></span> denotes the complex number <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4ea1ea9ac61e6e1e84ac39130f78143c18865719" aria-hidden="true" alt="{\sqrt {-1}}"></span>, called the <i><a href="http://fakehost/wiki/Imaginary_unit" title="Imaginary unit">imaginary unit</a></i>.
+ </dd>
+ </dl>
+
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3b7d749931e5f709bcbc0a446638d3b6b8ed0c6c" aria-hidden="true" alt="{\displaystyle A=\sum _{j}\lambda _{j}u_{j}u_{j}^{\mathsf {H}},}"></span>
+ </dd>
+ </dl>
+ </dd>
+ <dd>
+ where <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/fa91daf9145f27bb95746fd2a37537342d587b77" aria-hidden="true" alt="\lambda _{j}"></span> are the eigenvalues on the diagonal of the diagonal matrix <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/1934e7eadd31fbf6f7d6bcf9c0e9bec934ce8976" aria-hidden="true" alt="\; \Lambda "></span>.
+ </dd>
+ </dl>
+ <ul>
+ <li>The determinant of a Hermitian matrix is real:
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a1240df64c3010e0be6eae865fdfcfe6f77bf5eb" aria-hidden="true" alt="{\displaystyle \det(A)=\det \left(A^{\mathsf {T}}\right)\quad \Rightarrow \quad \det \left(A^{\mathsf {H}}\right)={\overline {\det(A)}}}"></span>
+ </dd>
+ <dd>
+ Therefore if <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/43cc392bdcfbb134dd66d9b469847f6370e29d9d" aria-hidden="true" alt="{\displaystyle A=A^{\mathsf {H}}\quad \Rightarrow \quad \det(A)={\overline {\det(A)}}}"></span>.
+ </dd>
+ <dd>
+ (Alternatively, the determinant is the product of the matrix's eigenvalues, and as mentioned before, the eigenvalues of a Hermitian matrix are real.)
+ </dd>
+ </dl>
+ <h2>
+ <span id="Decomposition_into_Hermitian_and_skew-Hermitian">Decomposition into Hermitian and skew-Hermitian</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=8" title="Edit section: Decomposition into Hermitian and skew-Hermitian">edit</a><span>]</span></span>
+ </h2>
+ <p>
+ <span id="facts"></span>Additional facts related to Hermitian matrices include:
+ </p>
+ <ul>
+ <li>The sum of a square matrix and its conjugate transpose <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3ef97bb04ce4ab682bcc84cf1059f8da235b483e" aria-hidden="true" alt="{\displaystyle \left(A+A^{\mathsf {H}}\right)}"></span> is Hermitian.
+ </li>
+ </ul>
+ <ul>
+ <li>The difference of a square matrix and its conjugate transpose <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/f4ac665be4943ce769e33109e9f64abcf1e98050" aria-hidden="true" alt="{\displaystyle \left(A-A^{\mathsf {H}}\right)}"></span> is <a href="http://fakehost/wiki/Skew-Hermitian_matrix" title="Skew-Hermitian matrix">skew-Hermitian</a> (also called antihermitian). This implies that the <a href="http://fakehost/wiki/Commutator" title="Commutator">commutator</a> of two Hermitian matrices is skew-Hermitian.
+ </li>
+ </ul>
+ <ul>
+ <li>An arbitrary square matrix <span>C</span> can be written as the sum of a Hermitian matrix <span>A</span> and a skew-Hermitian matrix <span>B</span>. This is known as the Toeplitz decomposition of <span>C</span>.<sup id="cite_ref-HornJohnson_3-0"><a href="#cite_note-HornJohnson-3">[3]</a></sup><sup>:<span>p. 7</span></sup>
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/0919d2e50fe1008af261f8301f243c002c328dbf" aria-hidden="true" alt="{\displaystyle C=A+B\quad {\mbox{with}}\quad A={\frac {1}{2}}\left(C+C^{\mathsf {H}}\right)\quad {\mbox{and}}\quad B={\frac {1}{2}}\left(C-C^{\mathsf {H}}\right)}"></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <h2>
+ <span id="Rayleigh_quotient">Rayleigh quotient</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=9" title="Edit section: Rayleigh quotient">edit</a><span>]</span></span>
+ </h2>
+
+ <p>
+ In mathematics, for a given complex Hermitian matrix <i>M</i> and nonzero vector <i>x</i>, the Rayleigh quotient<sup id="cite_ref-4"><a href="#cite_note-4">[4]</a></sup> <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/f8ed067bb4bc06662d6bdf6210d450779a529ce5" aria-hidden="true" alt="R(M, x)"></span>, is defined as:<sup id="cite_ref-HornJohnson_3-1"><a href="#cite_note-HornJohnson-3">[3]</a></sup><sup>:<span>p. 234</span></sup><sup id="cite_ref-5"><a href="#cite_note-5">[5]</a></sup>
+ </p>
+ <dl>
+ <dd>
+ <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6ad9b0047f8437f7b012041d7b2fcd190a5a9ec2" aria-hidden="true" alt="{\displaystyle R(M,x):={\frac {x^{\mathsf {H}}Mx}{x^{\mathsf {H}}x}}}"></span>.
+ </dd>
+ </dl>
+ <p>
+ For real matrices and vectors, the condition of being Hermitian reduces to that of being symmetric, and the conjugate transpose <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b431248ab2f121914608bbd1c2376715cecda9c8" aria-hidden="true" alt="{\displaystyle x^{\mathsf {H}}}"></span> to the usual transpose <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d4ee4832d06e8560510d81237d0650c897d476e9" aria-hidden="true" alt="{\displaystyle x^{\mathsf {T}}}"></span>. Note that <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b1d54d3c850d35f99329591e3b57cef98d17237f" aria-hidden="true" alt="{\displaystyle R(M,cx)=R(M,x)}"></span> for any non-zero real scalar <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/86a67b81c2de995bd608d5b2df50cd8cd7d92455" aria-hidden="true" alt="c"></span>. Also, recall that a Hermitian (or real symmetric) matrix has real eigenvalues.
+ </p>
+ <p>
+ It can be shown<sup>[<i><a href="http://fakehost/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"><span title="This claim needs references to reliable sources. (September 2019)">citation needed</span></a></i>]</sup> that, for a given matrix, the Rayleigh quotient reaches its minimum value <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/82c24522483ceaf1d54224b69af4244b60c3ac08" aria-hidden="true" alt="\lambda_\min"></span> (the smallest eigenvalue of M) when <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/87f9e315fd7e2ba406057a97300593c4802b53e4" aria-hidden="true" alt="x"></span> is <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/486623019ef451e0582b874018e0249a46e0f996" aria-hidden="true" alt="v_\min"></span> (the corresponding eigenvector). Similarly, <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/18fbf88c578fc9f75d4610ebd18ab55f4f2842ce" aria-hidden="true" alt="R(M, x) \leq \lambda_\max"></span> and <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/200db82bfdbc81cd227cb3470aa826d6f11a7653" aria-hidden="true" alt="R(M, v_\max) = \lambda_\max"></span>.
+ </p>
+ <p>
+ The Rayleigh quotient is used in the min-max theorem to get exact values of all eigenvalues. It is also used in eigenvalue algorithms to obtain an eigenvalue approximation from an eigenvector approximation. Specifically, this is the basis for Rayleigh quotient iteration.
+ </p>
+ <p>
+ The range of the Rayleigh quotient (for matrix that is not necessarily Hermitian) is called a numerical range (or spectrum in functional analysis). When the matrix is Hermitian, the numerical range is equal to the spectral norm. Still in functional analysis, <span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/957584ae6a35f9edf293cb486d7436fb5b75e803" aria-hidden="true" alt="\lambda_\max"></span> is known as the spectral radius. In the context of C*-algebras or algebraic quantum mechanics, the function that to <span><i>M</i></span> associates the Rayleigh quotient <span><i>R</i>(<i>M</i>, <i>x</i>)</span> for a fixed <span><i>x</i></span> and <span><i>M</i></span> varying through the algebra would be referred to as "vector state" of the algebra.
+ </p>
+ <h2>
+ <span id="See_also">See also</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=10" title="Edit section: See also">edit</a><span>]</span></span>
+ </h2>
+ <ul>
+ <li>
+ <a href="http://fakehost/wiki/Vector_space" title="Vector space">Vector space</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Skew-Hermitian_matrix" title="Skew-Hermitian matrix">Skew-Hermitian matrix</a> (anti-Hermitian matrix)
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Haynsworth_inertia_additivity_formula" title="Haynsworth inertia additivity formula">Haynsworth inertia additivity formula</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Hermitian_form" title="Hermitian form">Hermitian form</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Self-adjoint_operator" title="Self-adjoint operator">Self-adjoint operator</a>
+ </li>
+ <li>
+ <a href="http://fakehost/wiki/Unitary_matrix" title="Unitary matrix">Unitary matrix</a>
+ </li>
+ </ul>
+ <h2>
+ <span id="References">References</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=11" title="Edit section: References">edit</a><span>]</span></span>
+ </h2>
+
+ <h2>
+ <span id="External_links">External links</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=12" title="Edit section: External links">edit</a><span>]</span></span>
+ </h2>
+ <ul>
+ <li>
+ <cite id="CITEREFHazewinkel2001"><a href="http://fakehost/wiki/Michiel_Hazewinkel" title="Michiel Hazewinkel">Hazewinkel, Michiel</a>, ed. (2001) [1994], <a rel="nofollow" href="https://www.encyclopediaofmath.org/index.php?title=p/h047070">"Hermitian matrix"</a>, <i><a href="http://fakehost/wiki/Encyclopedia_of_Mathematics" title="Encyclopedia of Mathematics">Encyclopedia of Mathematics</a></i>, Springer Science+Business Media B.V. / Kluwer Academic Publishers, <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/978-1-55608-010-4" title="Special:BookSources/978-1-55608-010-4"><bdi>978-1-55608-010-4</bdi></a></cite>
+
+ </li>
+ <li>
+ <a rel="nofollow" href="https://www.cyut.edu.tw/~ckhung/b/la/hermitian.en.php">Visualizing Hermitian Matrix as An Ellipse with Dr. Geo</a>, by Chao-Kuei Hung from Chaoyang University, gives a more geometric explanation.
+ </li>
+ <li>
+ <cite><a rel="nofollow" href="http://www.mathpages.com/home/kmath306/kmath306.htm">"Hermitian Matrices"</a>. <i>MathPages.com</i>.</cite>
+
+ </li>
+ </ul>
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/source.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/source.html
new file mode 100644
index 000000000..c22e2b4ee
--- /dev/null
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia-3/source.html
@@ -0,0 +1,3757 @@
+<!DOCTYPE html>
+<html class="client-nojs" lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <title>
+ Hermitian matrix - Wikipedia
+ </title>
+ <script>
+ <![CDATA[
+ document.documentElement.className="client-js";RLCONF={"wgBreakFrames":!1,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRequestId":"XlQ4hQpAMFMAAF2Dp-oAAABV","wgCSPNonce":!1,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"Hermitian_matrix","wgTitle":"Hermitian matrix","wgCurRevisionId":942460710,"wgRevisionId":942460710,"wgArticleId":189682,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Use American English from January 2019","All Wikipedia articles written in American English","Articles with short description","Articles to be expanded from February 2018","All articles to be expanded",
+ "All articles with unsourced statements","Articles with unsourced statements from September 2019","Matrices"],"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Hermitian_matrix","wgRelevantArticleId":189682,"wgIsProbablyEditable":!0,"wgRelevantPageIsProbablyEditable":!0,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgMediaViewerOnClick":!0,"wgMediaViewerEnabledByDefault":!0,"wgPopupsReferencePreviews":!1,"wgPopupsConflictsWithNavPopupGadget":!1,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":!0,"nearby":!0,"watchlist":!0,"tagline":!1},"wgWMESchemaEditAttemptStepOversample":!1,"wgULSCurrentAutonym":"English","wgNoticeProject":"wikipedia","wgWikibaseItemId":"Q652941","wgCentralAuthMobileDomain":!1,"wgEditSubmitButtonLabelPublish":!0};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","noscript":"ready","user.styles":
+ "ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"ready","user.tokens":"loading","ext.math.styles":"ready","ext.cite.styles":"ready","mediawiki.legacy.shared":"ready","mediawiki.legacy.commonPrint":"ready","mediawiki.toc.styles":"ready","skins.vector.styles":"ready","wikibase.client.init":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.math.scripts","ext.cite.ux-enhancements","site","mediawiki.page.startup","skins.vector.js","mediawiki.page.ready","mediawiki.toc","ext.gadget.ReferenceTooltips","ext.gadget.watchlist-notice","ext.gadget.DRN-wizard","ext.gadget.charinsert","ext.gadget.refToolbar","ext.gadget.extra-toolbar-buttons","ext.gadget.switcher","ext.centralauth.centralautologin","mmv.head","mmv.bootstrap.autostart","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.eventLogging","ext.wikimediaEvents",
+ "ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.quicksurveys.init","ext.centralNotice.geoIP","ext.centralNotice.startUp"];
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.tokens@tffin",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});
+ });});
+ ]]>
+ </script>
+ <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.cite.styles%7Cext.math.styles%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cmediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.toc.styles%7Cskins.vector.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector" />
+ <script async="async" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script>
+ <meta name="ResourceLoaderDynamicStyles" content="" />
+ <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector" />
+ <meta name="generator" content="MediaWiki 1.35.0-wmf.20" />
+ <meta name="referrer" content="origin" />
+ <meta name="referrer" content="origin-when-crossorigin" />
+ <meta name="referrer" content="origin-when-cross-origin" />
+ <link rel="alternate" type="application/x-wiki" title="Edit this page" href="/w/index.php?title=Hermitian_matrix&amp;action=edit" />
+ <link rel="edit" title="Edit this page" href="/w/index.php?title=Hermitian_matrix&amp;action=edit" />
+ <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png" />
+ <link rel="shortcut icon" href="/static/favicon/wikipedia.ico" />
+ <link rel="search" type="application/opensearchdescription+xml" href="/w/opensearch_desc.php" title="Wikipedia (en)" />
+ <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd" />
+ <link rel="license" href="//creativecommons.org/licenses/by-sa/3.0/" />
+ <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom" />
+ <link rel="canonical" href="https://en.wikipedia.org/wiki/Hermitian_matrix" />
+ <link rel="dns-prefetch" href="//login.wikimedia.org" />
+ <link rel="dns-prefetch" href="//meta.wikimedia.org" /><!--[if lt IE 9]><script src="/w/resources/lib/html5shiv/html5shiv.js"></script><![endif]-->
+
+ <style data-mw-deduplicate="TemplateStyles:r935243608">
+ <![CDATA[
+ .mw-parser-output cite.citation{font-style:inherit}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration{color:#555}.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration span{border-bottom:1px dotted;cursor:help}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/12px-Wikisource-logo.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output code.cs1-code{color:inherit;background:inherit;border:inherit;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;font-size:100%}.mw-parser-output .cs1-visible-error{font-size:100%}.mw-parser-output .cs1-maint{display:none;color:#33aa33;margin-left:0.3em}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-right{padding-right:0.2em}
+ ]]>
+ </style>
+ </head>
+ <body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Hermitian_matrix rootpage-Hermitian_matrix skin-vector action-view">
+ <div id="mw-page-base" class="noprint"></div>
+ <div id="mw-head-base" class="noprint"></div>
+ <div id="content" class="mw-body" role="main">
+ <a id="top"></a>
+ <div id="siteNotice" class="mw-body-content">
+ <!-- CentralNotice -->
+ </div>
+ <div class="mw-indicators mw-body-content"></div>
+ <h1 id="firstHeading" class="firstHeading" lang="en" xml:lang="en">
+ Hermitian matrix
+ </h1>
+ <div id="bodyContent" class="mw-body-content">
+ <div id="siteSub" class="noprint">
+ From Wikipedia, the free encyclopedia
+ </div>
+ <div id="contentSub"></div>
+ <div id="jump-to-nav"></div><a class="mw-jump-link" href="#mw-head">Jump to navigation</a> <a class="mw-jump-link" href="#p-search">Jump to search</a>
+ <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr" xml:lang="en">
+ <div class="mw-parser-output">
+ <div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">
+ Matrix equal to its conjugate-transpose
+ </div>
+ <div role="note" class="hatnote navigation-not-searchable">
+ For matrices with symmetry over the <a href="/wiki/Real_number" title="Real number">real number</a> field, see <a href="/wiki/Symmetric_matrix" title="Symmetric matrix">symmetric matrix</a>.
+ </div>
+ <p>
+ In mathematics, a <b>Hermitian matrix</b> (or <b>self-adjoint matrix</b>) is a <a href="/wiki/Complex_number" title="Complex number">complex</a> <a href="/wiki/Square_matrix" title="Square matrix">square matrix</a> that is equal to its own <a href="/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a>—that is, the element in the <span class="texhtml mvar" style="font-style:italic;">i</span>-th row and <span class="texhtml mvar" style="font-style:italic;">j</span>-th column is equal to the <a href="/wiki/Complex_conjugate" title="Complex conjugate">complex conjugate</a> of the element in the <span class="texhtml mvar" style="font-style:italic;">j</span>-th row and <span class="texhtml mvar" style="font-style:italic;">i</span>-th column, for all indices <span class="texhtml mvar" style="font-style:italic;">i</span> and <span class="texhtml mvar" style="font-style:italic;">j</span>:
+ </p>
+ <div class="equation-box" style="margin: ;padding: 6px; border-width:2px; border-style: solid; border-color: #0073CF; background-color: #F5FFFA; text-align: center; display: table">
+ <p>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad a_{ij}={\overline {a_{ji}}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;Hermitian
+ </mtext>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mspace width="thickmathspace"></mspace>
+ <mo stretchy="false">
+ ⟺<!-- ⟺ -->
+ </mo>
+ <mspace width="thickmathspace"></mspace>
+ <mspace width="1em"></mspace>
+ <msub>
+ <mi>
+ a
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <msub>
+ <mi>
+ a
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A{\text{ Hermitian}}\quad \iff \quad a_{ij}={\overline {a_{ji}}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/28a0aaa74b2267a48312e19321211cd9e3a39228" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:32.77ex; height:3.009ex;" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad a_{ij}={\overline {a_{ji}}}}" /></span>
+ </p>
+ </div>
+ <p>
+ or in matrix form:
+ </p>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A={\overline {A^{\mathsf {T}}}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;Hermitian
+ </mtext>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mspace width="thickmathspace"></mspace>
+ <mo stretchy="false">
+ ⟺<!-- ⟺ -->
+ </mo>
+ <mspace width="thickmathspace"></mspace>
+ <mspace width="1em"></mspace>
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A{\text{ Hermitian}}\quad \iff \quad A={\overline {A^{\mathsf {T}}}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6ca00b61ff0e264e6c1e5adc9a00c0d2751feecf" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:32.194ex; height:3.509ex;" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A={\overline {A^{\mathsf {T}}}}}" /></span>.
+ </dd>
+ </dl>
+ <p>
+ Hermitian matrices can be understood as the complex extension of real <a href="/wiki/Symmetric_matrix" title="Symmetric matrix">symmetric matrices</a>.
+ </p>
+ <p>
+ If the <a href="/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a> of a matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is denoted by <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d9415702ab196cc26f5df37af2d90e07318e93df" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:3.139ex; height:2.676ex;" alt="{\displaystyle A^{\mathsf {H}}}" /></span>, then the Hermitian property can be written concisely as
+ </p>
+ <div class="equation-box" style="margin: ;padding: 6px; border-width:2px; border-style: solid; border-color: #0073CF; background-color: #F5FFFA; text-align: center; display: table">
+ <p>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A=A^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;Hermitian
+ </mtext>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mspace width="thickmathspace"></mspace>
+ <mo stretchy="false">
+ ⟺<!-- ⟺ -->
+ </mo>
+ <mspace width="thickmathspace"></mspace>
+ <mspace width="1em"></mspace>
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A{\text{ Hermitian}}\quad \iff \quad A=A^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/291d260bf69b764e75818669ab27870d58771e1f" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:32.123ex; height:2.676ex;" alt="{\displaystyle A{\text{ Hermitian}}\quad \iff \quad A=A^{\mathsf {H}}}" /></span>
+ </p>
+ </div>
+ <p>
+ Hermitian matrices are named after <a href="/wiki/Charles_Hermite" title="Charles Hermite">Charles Hermite</a>, who demonstrated in 1855 that matrices of this form share a property with real symmetric matrices of always having real <a href="/wiki/Eigenvalues_and_eigenvectors" title="Eigenvalues and eigenvectors">eigenvalues</a>. Other, equivalent notations in common use are <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{\mathsf {H}}=A^{\dagger }=A^{\ast }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ †<!-- † -->
+ </mo>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ ∗<!-- ∗ -->
+ </mo>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{\mathsf {H}}=A^{\dagger }=A^{\ast }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/8aa270391d183478251283d2c4b2c72ac4563352" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:14.839ex; height:2.676ex;" alt="{\displaystyle A^{\mathsf {H}}=A^{\dagger }=A^{\ast }}" /></span>, although note that in <a href="/wiki/Quantum_mechanics" title="Quantum mechanics">quantum mechanics</a>, <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{\ast }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ ∗<!-- ∗ -->
+ </mo>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{\ast }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/5541bfa07743be995242c892c344395e672d6fa2" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:2.797ex; height:2.343ex;" alt="A^{\ast }" /></span> typically means the <a href="/wiki/Complex_conjugate" title="Complex conjugate">complex conjugate</a> only, and not the <a href="/wiki/Conjugate_transpose" title="Conjugate transpose">conjugate transpose</a>.
+ </p>
+ <div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading">
+ <input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" />
+ <div class="toctitle" lang="en" dir="ltr" xml:lang="en">
+ <h2 id="mw-toc-heading">
+ Contents
+ </h2>
+ </div>
+ <ul>
+ <li class="toclevel-1 tocsection-1">
+ <a href="#Alternative_characterizations"><span class="tocnumber">1</span> <span class="toctext">Alternative characterizations</span></a>
+ <ul>
+ <li class="toclevel-2 tocsection-2">
+ <a href="#Equality_with_the_adjoint"><span class="tocnumber">1.1</span> <span class="toctext">Equality with the adjoint</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-3">
+ <a href="#Reality_of_quadratic_forms"><span class="tocnumber">1.2</span> <span class="toctext">Reality of quadratic forms</span></a>
+ </li>
+ <li class="toclevel-2 tocsection-4">
+ <a href="#Spectral_properties"><span class="tocnumber">1.3</span> <span class="toctext">Spectral properties</span></a>
+ </li>
+ </ul>
+ </li>
+ <li class="toclevel-1 tocsection-5">
+ <a href="#Applications"><span class="tocnumber">2</span> <span class="toctext">Applications</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-6">
+ <a href="#Examples"><span class="tocnumber">3</span> <span class="toctext">Examples</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-7">
+ <a href="#Properties"><span class="tocnumber">4</span> <span class="toctext">Properties</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-8">
+ <a href="#Decomposition_into_Hermitian_and_skew-Hermitian"><span class="tocnumber">5</span> <span class="toctext">Decomposition into Hermitian and skew-Hermitian</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-9">
+ <a href="#Rayleigh_quotient"><span class="tocnumber">6</span> <span class="toctext">Rayleigh quotient</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-10">
+ <a href="#See_also"><span class="tocnumber">7</span> <span class="toctext">See also</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-11">
+ <a href="#References"><span class="tocnumber">8</span> <span class="toctext">References</span></a>
+ </li>
+ <li class="toclevel-1 tocsection-12">
+ <a href="#External_links"><span class="tocnumber">9</span> <span class="toctext">External links</span></a>
+ </li>
+ </ul>
+ </div>
+ <h2>
+ <span class="mw-headline" id="Alternative_characterizations">Alternative characterizations</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=1" title="Edit section: Alternative characterizations">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <p>
+ Hermitian matrices can be characterized in a number of equivalent ways, some of which are listed below:
+ </p>
+ <h3>
+ <span class="mw-headline" id="Equality_with_the_adjoint">Equality with the adjoint</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=2" title="Edit section: Equality with the adjoint">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h3>
+ <p>
+ A square matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is Hermitian if and only if it is equal to its <a href="/wiki/Hermitian_adjoint" title="Hermitian adjoint">adjoint</a>, that is, it satisfies
+ </p>
+ <div class="mwe-math-element">
+ <div class="mwe-math-mathml-display mwe-math-mathml-a11y" style="display: none;">
+ <math display="block" xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \langle w,Av\rangle =\langle Aw,v\rangle ,}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo fence="false" stretchy="false">
+ ⟨<!-- ⟨ -->
+ </mo>
+ <mi>
+ w
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ v
+ </mi>
+ <mo fence="false" stretchy="false">
+ ⟩<!-- ⟩ -->
+ </mo>
+ <mo>
+ =
+ </mo>
+ <mo fence="false" stretchy="false">
+ ⟨<!-- ⟨ -->
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ w
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ v
+ </mi>
+ <mo fence="false" stretchy="false">
+ ⟩<!-- ⟩ -->
+ </mo>
+ <mo>
+ ,
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \langle w,Av\rangle =\langle Aw,v\rangle ,}
+ </annotation>
+ </semantics></math>
+ </div><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/459de45e76bace9d04a80d2e8efc2abbbc246047" class="mwe-math-fallback-image-display" aria-hidden="true" style="vertical-align: -0.838ex; width:18.501ex; height:2.843ex;" alt="{\displaystyle \langle w,Av\rangle =\langle Aw,v\rangle ,}" />
+ </div>for any pair of vectors <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v,w}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ v
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ w
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle v,w}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6425c6e94fa47976601cb44d7564b5d04dcfbfef" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.671ex; width:3.826ex; height:2.009ex;" alt="v,w" /></span>, where <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \langle \cdot ,\cdot \rangle }">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo fence="false" stretchy="false">
+ ⟨<!-- ⟨ -->
+ </mo>
+ <mo>
+ ⋅<!-- ⋅ -->
+ </mo>
+ <mo>
+ ,
+ </mo>
+ <mo>
+ ⋅<!-- ⋅ -->
+ </mo>
+ <mo fence="false" stretchy="false">
+ ⟩<!-- ⟩ -->
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \langle \cdot ,\cdot \rangle }
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/9a50080b735975d8001c9552ac2134b49ad534c0" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:4.137ex; height:2.843ex;" alt="{\displaystyle \langle \cdot ,\cdot \rangle }" /></span> denotes <a href="/wiki/Dot_product" title="Dot product">the inner product</a> operation.
+ <p>
+ This is also the way that the more general concept of <a href="/wiki/Self-adjoint_operator" title="Self-adjoint operator">self-adjoint operator</a> is defined.
+ </p>
+ <h3>
+ <span class="mw-headline" id="Reality_of_quadratic_forms">Reality of quadratic forms</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=3" title="Edit section: Reality of quadratic forms">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h3>
+ <p>
+ A square matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is Hermitian if and only if it is such that
+ </p>
+ <div class="mwe-math-element">
+ <div class="mwe-math-mathml-display mwe-math-mathml-a11y" style="display: none;">
+ <math display="block" xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \langle v,Av\rangle \in \mathbb {R} ,\quad v\in V.}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo fence="false" stretchy="false">
+ ⟨<!-- ⟨ -->
+ </mo>
+ <mi>
+ v
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ v
+ </mi>
+ <mo fence="false" stretchy="false">
+ ⟩<!-- ⟩ -->
+ </mo>
+ <mo>
+ ∈<!-- ∈ -->
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="double-struck">
+ R
+ </mi>
+ </mrow>
+ <mo>
+ ,
+ </mo>
+ <mspace width="1em"></mspace>
+ <mi>
+ v
+ </mi>
+ <mo>
+ ∈<!-- ∈ -->
+ </mo>
+ <mi>
+ V
+ </mi>
+ <mo>
+ .
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \langle v,Av\rangle \in \mathbb {R} ,\quad v\in V.}
+ </annotation>
+ </semantics></math>
+ </div><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/997ea0350c18735926412de88420ac9ca989f50c" class="mwe-math-fallback-image-display" aria-hidden="true" style="vertical-align: -0.838ex; width:21.119ex; height:2.843ex;" alt="{\displaystyle \langle v,Av\rangle \in \mathbb {R} ,\quad v\in V.}" />
+ </div>
+ <h3>
+ <span class="mw-headline" id="Spectral_properties">Spectral properties</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=4" title="Edit section: Spectral properties">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h3>
+ <p>
+ A square matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is Hermitian if and only if it is unitarily <a href="/wiki/Diagonalizable_matrix" title="Diagonalizable matrix">diagonalizable</a> with real <a href="/wiki/Eigenvalues_and_eigenvectors" title="Eigenvalues and eigenvectors">eigenvalues</a>.
+ </p>
+ <h2>
+ <span class="mw-headline" id="Applications">Applications</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=5" title="Edit section: Applications">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <p>
+ Hermitian matrices are fundamental to the quantum theory of <a href="/wiki/Matrix_mechanics" title="Matrix mechanics">matrix mechanics</a> created by <a href="/wiki/Werner_Heisenberg" title="Werner Heisenberg">Werner Heisenberg</a>, <a href="/wiki/Max_Born" title="Max Born">Max Born</a>, and <a href="/wiki/Pascual_Jordan" title="Pascual Jordan">Pascual Jordan</a> in 1925.
+ </p>
+ <h2>
+ <span class="mw-headline" id="Examples">Examples</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=6" title="Edit section: Examples">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <p>
+ In this section, the conjugate transpose of matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is denoted as <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d9415702ab196cc26f5df37af2d90e07318e93df" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:3.139ex; height:2.676ex;" alt="{\displaystyle A^{\mathsf {H}}}" /></span>, the transpose of matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is denoted as <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{\mathsf {T}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{\mathsf {T}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/54bf0331204e30cba9ec7f695dfea97e6745a7c2" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:3.095ex; height:2.676ex;" alt="{\displaystyle A^{\mathsf {T}}}" /></span> and conjugate of matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is denoted as <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\overline {A}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ A
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle {\overline {A}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/92efef0e89bdc77f6a848764195ef5b9d9bfcc6a" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.858ex; height:3.009ex;" alt="{\displaystyle {\overline {A}}}" /></span>.
+ </p>
+ <p>
+ See the following example:
+ </p>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\begin{bmatrix}2&amp;2+i&amp;4\\2-i&amp;3&amp;i\\4&amp;-i&amp;1\\\end{bmatrix}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow>
+ <mo>
+ [
+ </mo>
+ <mtable rowspacing="4pt" columnspacing="1em">
+ <mtr>
+ <mtd>
+ <mn>
+ 2
+ </mn>
+ </mtd>
+ <mtd>
+ <mn>
+ 2
+ </mn>
+ <mo>
+ +
+ </mo>
+ <mi>
+ i
+ </mi>
+ </mtd>
+ <mtd>
+ <mn>
+ 4
+ </mn>
+ </mtd>
+ </mtr>
+ <mtr>
+ <mtd>
+ <mn>
+ 2
+ </mn>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mi>
+ i
+ </mi>
+ </mtd>
+ <mtd>
+ <mn>
+ 3
+ </mn>
+ </mtd>
+ <mtd>
+ <mi>
+ i
+ </mi>
+ </mtd>
+ </mtr>
+ <mtr>
+ <mtd>
+ <mn>
+ 4
+ </mn>
+ </mtd>
+ <mtd>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mi>
+ i
+ </mi>
+ </mtd>
+ <mtd>
+ <mn>
+ 1
+ </mn>
+ </mtd>
+ </mtr>
+ </mtable>
+ <mo>
+ ]
+ </mo>
+ </mrow>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle {\begin{bmatrix}2&amp;2+i&amp;4\\2-i&amp;3&amp;i\\4&amp;-i&amp;1\\\end{bmatrix}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/00ccf11c16396b6ddd4f2254f7132cd8bb2c57ee" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -4.005ex; width:19.27ex; height:9.176ex;" alt="{\displaystyle {\begin{bmatrix}2&amp;2+i&amp;4\\2-i&amp;3&amp;i\\4&amp;-i&amp;1\\\end{bmatrix}}}" /></span>
+ </dd>
+ </dl>
+ <p>
+ The diagonal elements must be <a href="/wiki/Real_number" title="Real number">real</a>, as they must be their own complex conjugate.
+ </p>
+ <p>
+ Well-known families of <a href="/wiki/Pauli_matrices" title="Pauli matrices">Pauli matrices</a>, <a href="/wiki/Gell-Mann_matrices" title="Gell-Mann matrices">Gell-Mann matrices</a> and their generalizations are Hermitian. In <a href="/wiki/Theoretical_physics" title="Theoretical physics">theoretical physics</a> such Hermitian matrices are often multiplied by <a href="/wiki/Imaginary_number" title="Imaginary number">imaginary</a> coefficients,<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup><sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[2]</a></sup> which results in <i>skew-Hermitian</i> matrices (see <a href="#facts">below</a>).
+ </p>
+ <p>
+ Here, we offer another useful Hermitian matrix using an abstract example. If a square matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> equals the <a href="/wiki/Matrix_multiplication" title="Matrix multiplication">multiplication of a matrix</a> and its conjugate transpose, that is, <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A=BB^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mi>
+ B
+ </mi>
+ <msup>
+ <mi>
+ B
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A=BB^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3f0efab2d7c3a4b4b7caf14cc0705dadd13195a9" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:9.765ex; height:2.676ex;" alt="{\displaystyle A=BB^{\mathsf {H}}}" /></span>, then <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is a Hermitian <a href="/wiki/Positive_semi-definite_matrix" class="mw-redirect" title="Positive semi-definite matrix">positive semi-definite matrix</a>. Furthermore, if <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle B}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ B
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle B}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/47136aad860d145f75f3eed3022df827cee94d7a" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.764ex; height:2.176ex;" alt="B" /></span> is row full-rank, then <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/7daff47fa58cdfd29dc333def748ff5fa4c923e3" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.743ex; height:2.176ex;" alt="A" /></span> is positive definite.
+ </p>
+ <h2>
+ <span class="mw-headline" id="Properties">Properties</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=7" title="Edit section: Properties">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <table class="box-Expand_section plainlinks metadata ambox ambox-content" role="presentation">
+ <tbody>
+ <tr>
+ <td class="mbox-image">
+ <div style="width:52px">
+ <a href="/wiki/File:Wiki_letter_w_cropped.svg" class="image"><img alt="[icon]" src="//upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/44px-Wiki_letter_w_cropped.svg.png" decoding="async" width="44" height="31" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/66px-Wiki_letter_w_cropped.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Wiki_letter_w_cropped.svg/88px-Wiki_letter_w_cropped.svg.png 2x" data-file-width="44" data-file-height="31" /></a>
+ </div>
+ </td>
+ <td class="mbox-text">
+ <div class="mbox-text-span">
+ This section <b>needs expansion</b> with: Proof of the properties requested. <small>You can help by <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=1">adding to it</a>.</small> <small class="date-container"><i>(<span class="date">February 2018</span>)</i></small>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <ul>
+ <li>The entries on the <a href="/wiki/Main_diagonal" title="Main diagonal">main diagonal</a> (top left to bottom right) of any Hermitian matrix are <a href="/wiki/Real_number" title="Real number">real</a>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> By definition of the Hermitian matrix
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{ij}={\overline {H}}_{ji}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ H
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ H
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle H_{ij}={\overline {H}}_{ji}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4fa8265c5f6d4fc3b7cda6a06558c7d4d9aec855" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:10.249ex; height:3.676ex;" alt="{\displaystyle H_{ij}={\overline {H}}_{ji}}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ <dd>
+ so for <span class="texhtml"><i>i</i> = <i>j</i></span> the above follows.
+ </dd>
+ <dd>
+ Only the <a href="/wiki/Main_diagonal" title="Main diagonal">main diagonal</a> entries are necessarily real; Hermitian matrices can have arbitrary complex-valued entries in their <a href="/wiki/Off-diagonal_element" class="mw-redirect" title="Off-diagonal element">off-diagonal elements</a>, as long as diagonally-opposite entries are complex conjugates.
+ </dd>
+ </dl>
+ <ul>
+ <li>A matrix that has only real entries is Hermitian <a href="/wiki/If_and_only_if" title="If and only if">if and only if</a> it is <a href="/wiki/Symmetric_matrix" title="Symmetric matrix">symmetric</a>. A real and symmetric matrix is simply a special case of a Hermitian matrix.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{ij}={\overline {H}}_{ji}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ H
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ H
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle H_{ij}={\overline {H}}_{ji}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4fa8265c5f6d4fc3b7cda6a06558c7d4d9aec855" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:10.249ex; height:3.676ex;" alt="{\displaystyle H_{ij}={\overline {H}}_{ji}}" /></span> by definition. Thus <span class="texhtml">H<sub><i>ij</i></sub> = H<sub><i>ji</i></sub></span> (matrix symmetry) if and only if <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle H_{ij}={\overline {H}}_{ij}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ H
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ H
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle H_{ij}={\overline {H}}_{ij}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/0f1862750b96d01100244370b3fca45f01923ce5" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:10.249ex; height:3.676ex;" alt="{\displaystyle H_{ij}={\overline {H}}_{ij}}" /></span> (<span class="texhtml">H<sub><i>ij</i></sub></span> is real).
+ </dd>
+ </dl>
+ <ul>
+ <li>Every Hermitian matrix is a <a href="/wiki/Normal_matrix" title="Normal matrix">normal matrix</a>. That is to say, <span class="texhtml">AA<sup>H</sup> = A<sup>H</sup>A</span>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span class="texhtml">A = A<sup>H</sup></span>, so <span class="texhtml">AA<sup>H</sup> = AA = A<sup>H</sup>A</span>.
+ </dd>
+ </dl>
+ <ul>
+ <li>The finite-dimensional <a href="/wiki/Spectral_theorem" title="Spectral theorem">spectral theorem</a> says that any Hermitian matrix can be <a href="/wiki/Diagonalizable_matrix" title="Diagonalizable matrix">diagonalized</a> by a <a href="/wiki/Unitary_matrix" title="Unitary matrix">unitary matrix</a>, and that the resulting diagonal matrix has only real entries. This implies that all <a href="/wiki/Eigenvectors" class="mw-redirect" title="Eigenvectors">eigenvalues</a> of a Hermitian matrix <span class="texhtml mvar" style="font-style:italic;">A</span> with dimension <span class="texhtml mvar" style="font-style:italic;">n</span> are real, and that <span class="texhtml mvar" style="font-style:italic;">A</span> has <span class="texhtml mvar" style="font-style:italic;">n</span> linearly independent <a href="/wiki/Eigenvector" class="mw-redirect" title="Eigenvector">eigenvectors</a>. Moreover, a Hermitian matrix has <a href="/wiki/Orthogonal" class="mw-redirect" title="Orthogonal">orthogonal</a> eigenvectors for distinct eigenvalues. Even if there are degenerate eigenvalues, it is always possible to find an <a href="/wiki/Orthogonal_basis" title="Orthogonal basis">orthogonal basis</a> of <span class="texhtml">ℂ<sup><i>n</i></sup></span> consisting of <span class="texhtml mvar" style="font-style:italic;">n</span> eigenvectors of <span class="texhtml mvar" style="font-style:italic;">A</span>.
+ </li>
+ </ul>
+ <ul>
+ <li>The sum of any two Hermitian matrices is Hermitian.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (A+B)_{ij}=A_{ij}+B_{ij}={\overline {A}}_{ji}+{\overline {B}}_{ji}={\overline {(A+B)}}_{ji},}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo>
+ +
+ </mo>
+ <mi>
+ B
+ </mi>
+ <msub>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ +
+ </mo>
+ <msub>
+ <mi>
+ B
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ i
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ A
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ +
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mi>
+ B
+ </mi>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mrow>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo>
+ +
+ </mo>
+ <mi>
+ B
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mrow>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ i
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ ,
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle (A+B)_{ij}=A_{ij}+B_{ij}={\overline {A}}_{ji}+{\overline {B}}_{ji}={\overline {(A+B)}}_{ji},}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/251bf4ebbe3b0d119e0a7d19f8fd134c4f072971" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.338ex; width:48.159ex; height:4.176ex;" alt="{\displaystyle (A+B)_{ij}=A_{ij}+B_{ij}={\overline {A}}_{ji}+{\overline {B}}_{ji}={\overline {(A+B)}}_{ji},}" /></span> as claimed.
+ </dd>
+ </dl>
+ <ul>
+ <li>The <a href="/wiki/Inverse_matrix" class="mw-redirect" title="Inverse matrix">inverse</a> of an invertible Hermitian matrix is Hermitian as well.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> If <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{-1}A=I}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mi>
+ I
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{-1}A=I}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/021893240ff7fa3148b6649b0ba4d88cd207b5f0" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:10.089ex; height:2.676ex;" alt="{\displaystyle A^{-1}A=I}" /></span>, then <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle I=I^{H}=(A^{-1}A)^{H}=A^{H}(A^{-1})^{H}=A(A^{-1})^{H}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ I
+ </mi>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ I
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <mi>
+ A
+ </mi>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ <mo stretchy="false">
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle I=I^{H}=(A^{-1}A)^{H}=A^{H}(A^{-1})^{H}=A(A^{-1})^{H}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a28a8250ab35ad60228bb0376eb4b7024f027815" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:46.124ex; height:3.176ex;" alt="{\displaystyle I=I^{H}=(A^{-1}A)^{H}=A^{H}(A^{-1})^{H}=A(A^{-1})^{H}}" /></span>, so <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A^{-1}=(A^{-1})^{H}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msup>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ H
+ </mi>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A^{-1}=(A^{-1})^{H}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a0179c3a7aebe194ccd9a19ba02b972500f88a7a" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:14.751ex; height:3.176ex;" alt="{\displaystyle A^{-1}=(A^{-1})^{H}}" /></span> as claimed.
+ </dd>
+ </dl>
+ <ul>
+ <li>The <a href="/wiki/Matrix_multiplication" title="Matrix multiplication">product</a> of two Hermitian matrices <span class="texhtml mvar" style="font-style:italic;">A</span> and <span class="texhtml mvar" style="font-style:italic;">B</span> is Hermitian if and only if <span class="texhtml"><i>AB</i> = <i>BA</i></span>.
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> Note that <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (AB)^{\mathsf {H}}={\overline {(AB)^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}A^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}}}{\overline {A^{\mathsf {T}}}}=B^{\mathsf {H}}A^{\mathsf {H}}=BA.}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ B
+ </mi>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mrow>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ B
+ </mi>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mrow>
+ <msup>
+ <mi>
+ B
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <msup>
+ <mi>
+ B
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ B
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mi>
+ B
+ </mi>
+ <mi>
+ A
+ </mi>
+ <mo>
+ .
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle (AB)^{\mathsf {H}}={\overline {(AB)^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}A^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}}}{\overline {A^{\mathsf {T}}}}=B^{\mathsf {H}}A^{\mathsf {H}}=BA.}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b6cf8185ca7a0687bf959bb65b16db6cf1714ca2" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:52.205ex; height:4.009ex;" alt="{\displaystyle (AB)^{\mathsf {H}}={\overline {(AB)^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}A^{\mathsf {T}}}}={\overline {B^{\mathsf {T}}}}{\overline {A^{\mathsf {T}}}}=B^{\mathsf {H}}A^{\mathsf {H}}=BA.}" /></span> Thus <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (AB)^{\mathsf {H}}=AB}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ B
+ </mi>
+ <msup>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mi>
+ B
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle (AB)^{\mathsf {H}}=AB}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d303a1ebcac8547489b170be5d0dd7d8e04e548e" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:13.318ex; height:3.176ex;" alt="{\displaystyle (AB)^{\mathsf {H}}=AB}" /></span> <a href="/wiki/If_and_only_if" title="If and only if">if and only if</a> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle AB=BA}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mi>
+ B
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mi>
+ B
+ </mi>
+ <mi>
+ A
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle AB=BA}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/992c8ea49fdd26b491180036c5a4d879fec77442" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:10.113ex; height:2.176ex;" alt="AB=BA" /></span>.
+ </dd>
+ <dd>
+ Thus <span class="texhtml"><i>A</i><sup><i>n</i></sup></span> is Hermitian if <span class="texhtml mvar" style="font-style:italic;">A</span> is Hermitian and <span class="texhtml mvar" style="font-style:italic;">n</span> is an integer.
+ </dd>
+ </dl>
+ <ul>
+ <li>For an arbitrary complex valued vector <span class="texhtml mvar" style="font-style:italic;">v</span> the product <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v^{\mathsf {H}}Av}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ v
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ A
+ </mi>
+ <mi>
+ v
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle v^{\mathsf {H}}Av}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3c23d6757968a2267ee906cffc07cfe1bbc8aecc" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:5.394ex; height:2.676ex;" alt="{\displaystyle v^{\mathsf {H}}Av}" /></span> is real because of <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v^{\mathsf {H}}Av=\left(v^{\mathsf {H}}Av\right)^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ v
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ A
+ </mi>
+ <mi>
+ v
+ </mi>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <msup>
+ <mi>
+ v
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ A
+ </mi>
+ <mi>
+ v
+ </mi>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle v^{\mathsf {H}}Av=\left(v^{\mathsf {H}}Av\right)^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b7839ef3cdbc89c3ea1acd17a507d03a33ed79df" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:17.412ex; height:3.843ex;" alt="{\displaystyle v^{\mathsf {H}}Av=\left(v^{\mathsf {H}}Av\right)^{\mathsf {H}}}" /></span>. This is especially important in quantum physics where Hermitian matrices are operators that measure properties of a system e.g. total <a href="/wiki/Spin_(physics)" title="Spin (physics)">spin</a> which have to be real.
+ </li>
+ </ul>
+ <ul>
+ <li>The Hermitian complex <span class="texhtml mvar" style="font-style:italic;">n</span>-by-<span class="texhtml mvar" style="font-style:italic;">n</span> matrices do not form a <a href="/wiki/Vector_space" title="Vector space">vector space</a> over the <a href="/wiki/Complex_number" title="Complex number">complex numbers</a>, <span class="texhtml">ℂ</span>, since the identity matrix <span class="texhtml"><i>I</i><sub><i>n</i></sub></span> is Hermitian, but <span class="texhtml"><i>i</i> <i>I</i><sub><i>n</i></sub></span> is not. However the complex Hermitian matrices <i>do</i> form a vector space over the <a href="/wiki/Real_numbers" class="mw-redirect" title="Real numbers">real numbers</a> <span class="texhtml">ℝ</span>. In the <span class="texhtml">2<i>n</i><sup>2</sup></span>-<a href="/wiki/Dimension_of_a_vector_space" class="mw-redirect" title="Dimension of a vector space">dimensional</a> vector space of complex <span class="texhtml"><i>n</i> × <i>n</i></span> matrices over <span class="texhtml">ℝ</span>, the complex Hermitian matrices form a subspace of dimension <span class="texhtml"><i>n</i><sup>2</sup></span>. If <span class="texhtml"><i>E</i><sub><i>jk</i></sub></span> denotes the <span class="texhtml mvar" style="font-style:italic;">n</span>-by-<span class="texhtml mvar" style="font-style:italic;">n</span> matrix with a <span class="texhtml">1</span> in the <span class="texhtml"><i>j</i>,<i>k</i></span> position and zeros elsewhere, a basis (orthonormal w.r.t. the Frobenius inner product) can be described as follows:
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle E_{jj}{\text{ for }}1\leq j\leq n\quad (n{\text{ matrices}})}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ E
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;for&nbsp;
+ </mtext>
+ </mrow>
+ <mn>
+ 1
+ </mn>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ j
+ </mi>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ n
+ </mi>
+ <mspace width="1em"></mspace>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ n
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;matrices
+ </mtext>
+ </mrow>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle E_{jj}{\text{ for }}1\leq j\leq n\quad (n{\text{ matrices}})}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/46eedb181c0bdae46e8c1526161b03d0ea97b4b4" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:31.612ex; height:3.009ex;" alt="{\displaystyle E_{jj}{\text{ for }}1\leq j\leq n\quad (n{\text{ matrices}})}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ together with the set of matrices of the form
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{\sqrt {2}}}\left(E_{jk}+E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mn>
+ 1
+ </mn>
+ <msqrt>
+ <mn>
+ 2
+ </mn>
+ </msqrt>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <msub>
+ <mi>
+ E
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ k
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ +
+ </mo>
+ <msub>
+ <mi>
+ E
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ k
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;for&nbsp;
+ </mtext>
+ </mrow>
+ <mn>
+ 1
+ </mn>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ j
+ </mi>
+ <mo>
+ &lt;
+ </mo>
+ <mi>
+ k
+ </mi>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ n
+ </mi>
+ <mspace width="1em"></mspace>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mrow>
+ <msup>
+ <mi>
+ n
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mn>
+ 2
+ </mn>
+ </mrow>
+ </msup>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mi>
+ n
+ </mi>
+ </mrow>
+ <mn>
+ 2
+ </mn>
+ </mfrac>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;matrices
+ </mtext>
+ </mrow>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle {\frac {1}{\sqrt {2}}}\left(E_{jk}+E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/ddeac51c423f6dbefc5f63e483d9aee96e6fa342" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -2.838ex; width:57.064ex; height:6.676ex;" alt="{\displaystyle {\frac {1}{\sqrt {2}}}\left(E_{jk}+E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ and the matrices
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {i}{\sqrt {2}}}\left(E_{jk}-E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mi>
+ i
+ </mi>
+ <msqrt>
+ <mn>
+ 2
+ </mn>
+ </msqrt>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <msub>
+ <mi>
+ E
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ <mi>
+ k
+ </mi>
+ </mrow>
+ </msub>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <msub>
+ <mi>
+ E
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ k
+ </mi>
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;for&nbsp;
+ </mtext>
+ </mrow>
+ <mn>
+ 1
+ </mn>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ j
+ </mi>
+ <mo>
+ &lt;
+ </mo>
+ <mi>
+ k
+ </mi>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <mi>
+ n
+ </mi>
+ <mspace width="1em"></mspace>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mrow>
+ <msup>
+ <mi>
+ n
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mn>
+ 2
+ </mn>
+ </mrow>
+ </msup>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mi>
+ n
+ </mi>
+ </mrow>
+ <mn>
+ 2
+ </mn>
+ </mfrac>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mtext>
+ &nbsp;matrices
+ </mtext>
+ </mrow>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle {\frac {i}{\sqrt {2}}}\left(E_{jk}-E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/db65cce3a8fa33e5b7b96badd756c8573aa866c0" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -2.838ex; width:57.064ex; height:6.676ex;" alt="{\displaystyle {\frac {i}{\sqrt {2}}}\left(E_{jk}-E_{kj}\right){\text{ for }}1\leq j&lt;k\leq n\quad \left({\frac {n^{2}-n}{2}}{\text{ matrices}}\right)}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ where <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle i}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ i
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle i}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/add78d8608ad86e54951b8c8bd6c8d8416533d20" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:0.802ex; height:2.176ex;" alt="i" /></span> denotes the complex number <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\sqrt {-1}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow class="MJX-TeXAtom-ORD">
+ <msqrt>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <mn>
+ 1
+ </mn>
+ </msqrt>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle {\sqrt {-1}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/4ea1ea9ac61e6e1e84ac39130f78143c18865719" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:4.906ex; height:3.009ex;" alt="{\sqrt {-1}}" /></span>, called the <i><a href="/wiki/Imaginary_unit" title="Imaginary unit">imaginary unit</a></i>.
+ </dd>
+ </dl>
+ <ul>
+ <li>If <span class="texhtml mvar" style="font-style:italic;">n</span> orthonormal eigenvectors <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{1},\dots ,u_{n}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ u
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mn>
+ 1
+ </mn>
+ </mrow>
+ </msub>
+ <mo>
+ ,
+ </mo>
+ <mo>
+ …<!-- … -->
+ </mo>
+ <mo>
+ ,
+ </mo>
+ <msub>
+ <mi>
+ u
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ n
+ </mi>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle u_{1},\dots ,u_{n}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/ba291b64c0d3afa90b4556a7a601116dfd74ef2e" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.671ex; width:10.11ex; height:2.009ex;" alt="{\displaystyle u_{1},\dots ,u_{n}}" /></span> of a Hermitian matrix are chosen and written as the columns of the matrix <span class="texhtml mvar" style="font-style:italic;">U</span>, then one <a href="/wiki/Eigendecomposition_of_a_matrix" title="Eigendecomposition of a matrix">eigendecomposition</a> of <span class="texhtml mvar" style="font-style:italic;">A</span> is <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A=U\Lambda U^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mi>
+ U
+ </mi>
+ <mi mathvariant="normal">
+ Λ<!-- Λ -->
+ </mi>
+ <msup>
+ <mi>
+ U
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A=U\Lambda U^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d89ef5bade4fb04b1aaf53c0d73e4763d4d154eb" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:11.474ex; height:2.676ex;" alt="{\displaystyle A=U\Lambda U^{\mathsf {H}}}" /></span> where <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle UU^{\mathsf {H}}=I=U^{\mathsf {H}}U}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ U
+ </mi>
+ <msup>
+ <mi>
+ U
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ =
+ </mo>
+ <mi>
+ I
+ </mi>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ U
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ U
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle UU^{\mathsf {H}}=I=U^{\mathsf {H}}U}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b819b015c1984e6cb07153c675815d4657b90da8" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:17.408ex; height:2.676ex;" alt="{\displaystyle UU^{\mathsf {H}}=I=U^{\mathsf {H}}U}" /></span> and therefore
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A=\sum _{j}\lambda _{j}u_{j}u_{j}^{\mathsf {H}},}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <munder>
+ <mo>
+ ∑<!-- ∑ -->
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </munder>
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <msub>
+ <mi>
+ u
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ <msubsup>
+ <mi>
+ u
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ </mrow>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msubsup>
+ <mo>
+ ,
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A=\sum _{j}\lambda _{j}u_{j}u_{j}^{\mathsf {H}},}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3b7d749931e5f709bcbc0a446638d3b6b8ed0c6c" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -3.338ex; width:16.46ex; height:5.843ex;" alt="{\displaystyle A=\sum _{j}\lambda _{j}u_{j}u_{j}^{\mathsf {H}},}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ <dd>
+ where <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \lambda _{j}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi>
+ j
+ </mi>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \lambda _{j}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/fa91daf9145f27bb95746fd2a37537342d587b77" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:2.265ex; height:2.843ex;" alt="\lambda _{j}" /></span> are the eigenvalues on the diagonal of the diagonal matrix <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \;\Lambda }">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mspace width="thickmathspace"></mspace>
+ <mi mathvariant="normal">
+ Λ<!-- Λ -->
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \;\Lambda }
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/1934e7eadd31fbf6f7d6bcf9c0e9bec934ce8976" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:2.258ex; height:2.176ex;" alt="\; \Lambda " /></span>.
+ </dd>
+ </dl>
+ <ul>
+ <li>The determinant of a Hermitian matrix is real:
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <i>Proof:</i> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \det(A)=\det \left(A^{\mathsf {T}}\right)\quad \Rightarrow \quad \det \left(A^{\mathsf {H}}\right)={\overline {\det(A)}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ =
+ </mo>
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mo stretchy="false">
+ ⇒<!-- ⇒ -->
+ </mo>
+ <mspace width="1em"></mspace>
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mrow>
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mrow>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \det(A)=\det \left(A^{\mathsf {T}}\right)\quad \Rightarrow \quad \det \left(A^{\mathsf {H}}\right)={\overline {\det(A)}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/a1240df64c3010e0be6eae865fdfcfe6f77bf5eb" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:45.862ex; height:3.843ex;" alt="{\displaystyle \det(A)=\det \left(A^{\mathsf {T}}\right)\quad \Rightarrow \quad \det \left(A^{\mathsf {H}}\right)={\overline {\det(A)}}}" /></span>
+ </dd>
+ <dd>
+ Therefore if <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle A=A^{\mathsf {H}}\quad \Rightarrow \quad \det(A)={\overline {\det(A)}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mspace width="1em"></mspace>
+ <mo stretchy="false">
+ ⇒<!-- ⇒ -->
+ </mo>
+ <mspace width="1em"></mspace>
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mover>
+ <mrow>
+ <mo movablelimits="true" form="prefix">
+ det
+ </mo>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mrow>
+ <mo accent="false">
+ ¯<!-- ¯ -->
+ </mo>
+ </mover>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle A=A^{\mathsf {H}}\quad \Rightarrow \quad \det(A)={\overline {\det(A)}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/43cc392bdcfbb134dd66d9b469847f6370e29d9d" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:33.017ex; height:3.676ex;" alt="{\displaystyle A=A^{\mathsf {H}}\quad \Rightarrow \quad \det(A)={\overline {\det(A)}}}" /></span>.
+ </dd>
+ <dd>
+ (Alternatively, the determinant is the product of the matrix's eigenvalues, and as mentioned before, the eigenvalues of a Hermitian matrix are real.)
+ </dd>
+ </dl>
+ <h2>
+ <span class="mw-headline" id="Decomposition_into_Hermitian_and_skew-Hermitian">Decomposition into Hermitian and skew-Hermitian</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=8" title="Edit section: Decomposition into Hermitian and skew-Hermitian">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <p>
+ <span id="facts"></span>Additional facts related to Hermitian matrices include:
+ </p>
+ <ul>
+ <li>The sum of a square matrix and its conjugate transpose <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left(A+A^{\mathsf {H}}\right)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mi>
+ A
+ </mi>
+ <mo>
+ +
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \left(A+A^{\mathsf {H}}\right)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/3ef97bb04ce4ab682bcc84cf1059f8da235b483e" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:9.852ex; height:3.343ex;" alt="{\displaystyle \left(A+A^{\mathsf {H}}\right)}" /></span> is Hermitian.
+ </li>
+ </ul>
+ <ul>
+ <li>The difference of a square matrix and its conjugate transpose <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left(A-A^{\mathsf {H}}\right)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mi>
+ A
+ </mi>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <msup>
+ <mi>
+ A
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \left(A-A^{\mathsf {H}}\right)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/f4ac665be4943ce769e33109e9f64abcf1e98050" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.005ex; width:9.852ex; height:3.343ex;" alt="{\displaystyle \left(A-A^{\mathsf {H}}\right)}" /></span> is <a href="/wiki/Skew-Hermitian_matrix" title="Skew-Hermitian matrix">skew-Hermitian</a> (also called antihermitian). This implies that the <a href="/wiki/Commutator" title="Commutator">commutator</a> of two Hermitian matrices is skew-Hermitian.
+ </li>
+ </ul>
+ <ul>
+ <li>An arbitrary square matrix <span class="texhtml mvar" style="font-style:italic;">C</span> can be written as the sum of a Hermitian matrix <span class="texhtml mvar" style="font-style:italic;">A</span> and a skew-Hermitian matrix <span class="texhtml mvar" style="font-style:italic;">B</span>. This is known as the Toeplitz decomposition of <span class="texhtml mvar" style="font-style:italic;">C</span>.<sup id="cite_ref-HornJohnson_3-0" class="reference"><a href="#cite_note-HornJohnson-3">[3]</a></sup><sup class="reference" style="white-space:nowrap;">:<span>p. 7</span></sup>
+ </li>
+ </ul>
+ <dl>
+ <dd>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle C=A+B\quad {\mbox{with}}\quad A={\frac {1}{2}}\left(C+C^{\mathsf {H}}\right)\quad {\mbox{and}}\quad B={\frac {1}{2}}\left(C-C^{\mathsf {H}}\right)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ C
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mi>
+ A
+ </mi>
+ <mo>
+ +
+ </mo>
+ <mi>
+ B
+ </mi>
+ <mspace width="1em"></mspace>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="false" scriptlevel="0">
+ <mtext>
+ with
+ </mtext>
+ </mstyle>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mi>
+ A
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mn>
+ 1
+ </mn>
+ <mn>
+ 2
+ </mn>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mi>
+ C
+ </mi>
+ <mo>
+ +
+ </mo>
+ <msup>
+ <mi>
+ C
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="false" scriptlevel="0">
+ <mtext>
+ and
+ </mtext>
+ </mstyle>
+ </mrow>
+ <mspace width="1em"></mspace>
+ <mi>
+ B
+ </mi>
+ <mo>
+ =
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mn>
+ 1
+ </mn>
+ <mn>
+ 2
+ </mn>
+ </mfrac>
+ </mrow>
+ <mrow>
+ <mo>
+ (
+ </mo>
+ <mrow>
+ <mi>
+ C
+ </mi>
+ <mo>
+ −<!-- − -->
+ </mo>
+ <msup>
+ <mi>
+ C
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mrow>
+ <mo>
+ )
+ </mo>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle C=A+B\quad {\mbox{with}}\quad A={\frac {1}{2}}\left(C+C^{\mathsf {H}}\right)\quad {\mbox{and}}\quad B={\frac {1}{2}}\left(C-C^{\mathsf {H}}\right)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/0919d2e50fe1008af261f8301f243c002c328dbf" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -1.838ex; width:63.495ex; height:5.176ex;" alt="{\displaystyle C=A+B\quad {\mbox{with}}\quad A={\frac {1}{2}}\left(C+C^{\mathsf {H}}\right)\quad {\mbox{and}}\quad B={\frac {1}{2}}\left(C-C^{\mathsf {H}}\right)}" /></span>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ <h2>
+ <span class="mw-headline" id="Rayleigh_quotient">Rayleigh quotient</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=9" title="Edit section: Rayleigh quotient">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <div role="note" class="hatnote navigation-not-searchable">
+ Main article: <a href="/wiki/Rayleigh_quotient" title="Rayleigh quotient">Rayleigh quotient</a>
+ </div>
+ <p>
+ In mathematics, for a given complex Hermitian matrix <i>M</i> and nonzero vector <i>x</i>, the Rayleigh quotient<sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[4]</a></sup> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle R(M,x)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ x
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle R(M,x)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/f8ed067bb4bc06662d6bdf6210d450779a529ce5" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:8.379ex; height:2.843ex;" alt="R(M, x)" /></span>, is defined as:<sup id="cite_ref-HornJohnson_3-1" class="reference"><a href="#cite_note-HornJohnson-3">[3]</a></sup><sup class="reference" style="white-space:nowrap;">:<span>p. 234</span></sup><sup id="cite_ref-5" class="reference"><a href="#cite_note-5">[5]</a></sup>
+ </p>
+ <dl>
+ <dd>
+ <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle R(M,x):={\frac {x^{\mathsf {H}}Mx}{x^{\mathsf {H}}x}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ x
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ :=
+ </mo>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mfrac>
+ <mrow>
+ <msup>
+ <mi>
+ x
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ M
+ </mi>
+ <mi>
+ x
+ </mi>
+ </mrow>
+ <mrow>
+ <msup>
+ <mi>
+ x
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ <mi>
+ x
+ </mi>
+ </mrow>
+ </mfrac>
+ </mrow>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle R(M,x):={\frac {x^{\mathsf {H}}Mx}{x^{\mathsf {H}}x}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/6ad9b0047f8437f7b012041d7b2fcd190a5a9ec2" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -2.171ex; width:19.458ex; height:6.009ex;" alt="{\displaystyle R(M,x):={\frac {x^{\mathsf {H}}Mx}{x^{\mathsf {H}}x}}}" /></span>.
+ </dd>
+ </dl>
+ <p>
+ For real matrices and vectors, the condition of being Hermitian reduces to that of being symmetric, and the conjugate transpose <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x^{\mathsf {H}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ x
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ H
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle x^{\mathsf {H}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b431248ab2f121914608bbd1c2376715cecda9c8" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:2.726ex; height:2.676ex;" alt="{\displaystyle x^{\mathsf {H}}}" /></span> to the usual transpose <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x^{\mathsf {T}}}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msup>
+ <mi>
+ x
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mrow class="MJX-TeXAtom-ORD">
+ <mi mathvariant="sans-serif">
+ T
+ </mi>
+ </mrow>
+ </mrow>
+ </msup>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle x^{\mathsf {T}}}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/d4ee4832d06e8560510d81237d0650c897d476e9" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:2.681ex; height:2.676ex;" alt="{\displaystyle x^{\mathsf {T}}}" /></span>. Note that <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle R(M,cx)=R(M,x)}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ c
+ </mi>
+ <mi>
+ x
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ =
+ </mo>
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ x
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle R(M,cx)=R(M,x)}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/b1d54d3c850d35f99329591e3b57cef98d17237f" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:20.864ex; height:2.843ex;" alt="{\displaystyle R(M,cx)=R(M,x)}" /></span> for any non-zero real scalar <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle c}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ c
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle c}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/86a67b81c2de995bd608d5b2df50cd8cd7d92455" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.007ex; height:1.676ex;" alt="c" /></span>. Also, recall that a Hermitian (or real symmetric) matrix has real eigenvalues.
+ </p>
+ <p>
+ It can be shown<sup class="noprint Inline-Template Template-Fact" style="white-space:nowrap;">[<i><a href="/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"><span title="This claim needs references to reliable sources. (September 2019)">citation needed</span></a></i>]</sup> that, for a given matrix, the Rayleigh quotient reaches its minimum value <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \lambda _{\min }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ min
+ </mo>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \lambda _{\min }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/82c24522483ceaf1d54224b69af4244b60c3ac08" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.671ex; width:4.328ex; height:2.509ex;" alt="\lambda_\min" /></span> (the smallest eigenvalue of M) when <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ x
+ </mi>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle x}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/87f9e315fd7e2ba406057a97300593c4802b53e4" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.338ex; width:1.33ex; height:1.676ex;" alt="x" /></span> is <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v_{\min }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ v
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ min
+ </mo>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle v_{\min }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/486623019ef451e0582b874018e0249a46e0f996" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.671ex; width:4.1ex; height:2.009ex;" alt="v_\min" /></span> (the corresponding eigenvector). Similarly, <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle R(M,x)\leq \lambda _{\max }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <mi>
+ x
+ </mi>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ ≤<!-- ≤ -->
+ </mo>
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ max
+ </mo>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle R(M,x)\leq \lambda _{\max }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/18fbf88c578fc9f75d4610ebd18ab55f4f2842ce" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:16.124ex; height:2.843ex;" alt="R(M, x) \leq \lambda_\max" /></span> and <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle R(M,v_{\max })=\lambda _{\max }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <mi>
+ R
+ </mi>
+ <mo stretchy="false">
+ (
+ </mo>
+ <mi>
+ M
+ </mi>
+ <mo>
+ ,
+ </mo>
+ <msub>
+ <mi>
+ v
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ max
+ </mo>
+ </mrow>
+ </msub>
+ <mo stretchy="false">
+ )
+ </mo>
+ <mo>
+ =
+ </mo>
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ max
+ </mo>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle R(M,v_{\max })=\lambda _{\max }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/200db82bfdbc81cd227cb3470aa826d6f11a7653" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.838ex; width:19.213ex; height:2.843ex;" alt="R(M, v_\max) = \lambda_\max" /></span>.
+ </p>
+ <p>
+ The Rayleigh quotient is used in the min-max theorem to get exact values of all eigenvalues. It is also used in eigenvalue algorithms to obtain an eigenvalue approximation from an eigenvector approximation. Specifically, this is the basis for Rayleigh quotient iteration.
+ </p>
+ <p>
+ The range of the Rayleigh quotient (for matrix that is not necessarily Hermitian) is called a numerical range (or spectrum in functional analysis). When the matrix is Hermitian, the numerical range is equal to the spectral norm. Still in functional analysis, <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \lambda _{\max }}">
+ <semantics>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mstyle displaystyle="true" scriptlevel="0">
+ <msub>
+ <mi>
+ λ<!-- λ -->
+ </mi>
+ <mrow class="MJX-TeXAtom-ORD">
+ <mo movablelimits="true" form="prefix">
+ max
+ </mo>
+ </mrow>
+ </msub>
+ </mstyle>
+ </mrow>
+ <annotation encoding="application/x-tex">
+ {\displaystyle \lambda _{\max }}
+ </annotation>
+ </semantics></math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/957584ae6a35f9edf293cb486d7436fb5b75e803" class="mwe-math-fallback-image-inline" aria-hidden="true" style="vertical-align: -0.671ex; width:4.646ex; height:2.509ex;" alt="\lambda_\max" /></span> is known as the spectral radius. In the context of C*-algebras or algebraic quantum mechanics, the function that to <span class="texhtml"><i>M</i></span> associates the Rayleigh quotient <span class="texhtml"><i>R</i>(<i>M</i>, <i>x</i>)</span> for a fixed <span class="texhtml"><i>x</i></span> and <span class="texhtml"><i>M</i></span> varying through the algebra would be referred to as "vector state" of the algebra.
+ </p>
+ <h2>
+ <span class="mw-headline" id="See_also">See also</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=10" title="Edit section: See also">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <ul>
+ <li>
+ <a href="/wiki/Vector_space" title="Vector space">Vector space</a>
+ </li>
+ <li>
+ <a href="/wiki/Skew-Hermitian_matrix" title="Skew-Hermitian matrix">Skew-Hermitian matrix</a> (anti-Hermitian matrix)
+ </li>
+ <li>
+ <a href="/wiki/Haynsworth_inertia_additivity_formula" title="Haynsworth inertia additivity formula">Haynsworth inertia additivity formula</a>
+ </li>
+ <li>
+ <a href="/wiki/Hermitian_form" class="mw-redirect" title="Hermitian form">Hermitian form</a>
+ </li>
+ <li>
+ <a href="/wiki/Self-adjoint_operator" title="Self-adjoint operator">Self-adjoint operator</a>
+ </li>
+ <li>
+ <a href="/wiki/Unitary_matrix" title="Unitary matrix">Unitary matrix</a>
+ </li>
+ </ul>
+ <h2>
+ <span class="mw-headline" id="References">References</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=11" title="Edit section: References">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <div class="reflist" style="list-style-type: decimal;">
+ <div class="mw-references-wrap">
+ <ol class="references">
+ <li id="cite_note-1">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><cite class="citation book"><a href="/wiki/Theodore_Frankel" title="Theodore Frankel">Frankel, Theodore</a> (2004). <a rel="nofollow" class="external text" href="https://books.google.com/books?id=DUnjs6nEn8wC&amp;lpg=PA652&amp;dq=%22Lie%20algebra%22%20physics%20%22skew-Hermitian%22&amp;pg=PA652#v=onepage&amp;q&amp;f=false"><i>The Geometry of Physics: an introduction</i></a>. <a href="/wiki/Cambridge_University_Press" title="Cambridge University Press">Cambridge University Press</a>. p.&#160;652. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/0-521-53927-7" title="Special:BookSources/0-521-53927-7"><bdi>0-521-53927-7</bdi></a>.</cite></span>
+ </li>
+ <li id="cite_note-2">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.hep.caltech.edu/~fcp/physics/quantumMechanics/angularMomentum/angularMomentum.pdf">Physics 125 Course Notes</a> at <a href="/wiki/California_Institute_of_Technology" title="California Institute of Technology">California Institute of Technology</a></span>
+ </li>
+ <li id="cite_note-HornJohnson-3">
+ <span class="mw-cite-backlink">^ <a href="#cite_ref-HornJohnson_3-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-HornJohnson_3-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation book">Horn, Roger A.; Johnson, Charles R. (2013). <i>Matrix Analysis, second edition</i>. Cambridge University Press. <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9780521839402" title="Special:BookSources/9780521839402"><bdi>9780521839402</bdi></a>.</cite></span>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r935243608" />
+ </li>
+ <li id="cite_note-4">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text">Also known as the <b>Rayleigh–Ritz ratio</b>; named after <a href="/wiki/Walther_Ritz" title="Walther Ritz">Walther Ritz</a> and <a href="/wiki/Lord_Rayleigh" class="mw-redirect" title="Lord Rayleigh">Lord Rayleigh</a>.</span>
+ </li>
+ <li id="cite_note-5">
+ <span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text">Parlet B. N. <i>The symmetric eigenvalue problem</i>, SIAM, Classics in Applied Mathematics,1998</span>
+ </li>
+ </ol>
+ </div>
+ </div>
+ <h2>
+ <span class="mw-headline" id="External_links">External links</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Hermitian_matrix&amp;action=edit&amp;section=12" title="Edit section: External links">edit</a><span class="mw-editsection-bracket">]</span></span>
+ </h2>
+ <ul>
+ <li>
+ <cite id="CITEREFHazewinkel2001" class="citation"><a href="/wiki/Michiel_Hazewinkel" title="Michiel Hazewinkel">Hazewinkel, Michiel</a>, ed. (2001) [1994], <a rel="nofollow" class="external text" href="https://www.encyclopediaofmath.org/index.php?title=p/h047070">"Hermitian matrix"</a>, <i><a href="/wiki/Encyclopedia_of_Mathematics" title="Encyclopedia of Mathematics">Encyclopedia of Mathematics</a></i>, Springer Science+Business Media B.V. / Kluwer Academic Publishers, <a href="/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-55608-010-4" title="Special:BookSources/978-1-55608-010-4"><bdi>978-1-55608-010-4</bdi></a></cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r935243608" />
+ </li>
+ <li>
+ <a rel="nofollow" class="external text" href="https://www.cyut.edu.tw/~ckhung/b/la/hermitian.en.php">Visualizing Hermitian Matrix as An Ellipse with Dr. Geo</a>, by Chao-Kuei Hung from Chaoyang University, gives a more geometric explanation.
+ </li>
+ <li>
+ <cite class="citation web"><a rel="nofollow" class="external text" href="http://www.mathpages.com/home/kmath306/kmath306.htm">"Hermitian Matrices"</a>. <i>MathPages.com</i>.</cite>
+ <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r935243608" />
+ </li>
+ </ul><!--
+NewPP limit report
+Parsed by mw1375
+Cached time: 20200224203345
+Cache expiry: 2592000
+Dynamic content: false
+Complications: [vary‐revision‐sha1]
+CPU time usage: 0.344 seconds
+Real time usage: 0.623 seconds
+Preprocessor visited node count: 1719/1000000
+Post‐expand include size: 18736/2097152 bytes
+Template argument size: 1789/2097152 bytes
+Highest expansion depth: 13/40
+Expensive parser function count: 3/500
+Unstrip recursion depth: 1/20
+Unstrip post‐expand size: 14154/5000000 bytes
+Number of Wikibase entities loaded: 0/400
+Lua time usage: 0.107/10.000 seconds
+Lua memory usage: 3.33 MB/50 MB
+-->
+ <!--
+Transclusion expansion time report (%,ms,calls,template)
+100.00% 423.690 1 -total
+ 26.69% 113.077 1 Template:Use_American_English
+ 21.93% 92.904 1 Template:Reflist
+ 19.39% 82.135 2 Template:Cite_book
+ 14.77% 62.599 1 Template:Short_description
+ 9.97% 42.248 1 Template:Expand_section
+ 7.81% 33.100 1 Template:Ambox
+ 7.76% 32.863 1 Template:Pagetype
+ 6.13% 25.975 1 Template:Citation_needed
+ 5.21% 22.058 1 Template:Fix
+-->
+ <!-- Saved in parser cache with key enwiki:pcache:idhash:189682-0!canonical!math=5 and timestamp 20200224203346 and revision id 942460710
+ -->
+ </div><noscript><img src="//en.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;" /></noscript>
+ </div>
+ <div class="printfooter">
+ Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=Hermitian_matrix&amp;oldid=942460710">https://en.wikipedia.org/w/index.php?title=Hermitian_matrix&amp;oldid=942460710</a>"
+ </div>
+ <div id="catlinks" class="catlinks" data-mw="interface">
+ <div id="mw-normal-catlinks" class="mw-normal-catlinks">
+ <a href="/wiki/Help:Category" title="Help:Category">Categories</a>:
+ <ul>
+ <li>
+ <a href="/wiki/Category:Matrices" title="Category:Matrices">Matrices</a>
+ </li>
+ </ul>
+ </div>
+ <div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">
+ Hidden categories:
+ <ul>
+ <li>
+ <a href="/wiki/Category:Use_American_English_from_January_2019" title="Category:Use American English from January 2019">Use American English from January 2019</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:All_Wikipedia_articles_written_in_American_English" title="Category:All Wikipedia articles written in American English">All Wikipedia articles written in American English</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_with_short_description" title="Category:Articles with short description">Articles with short description</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_to_be_expanded_from_February_2018" title="Category:Articles to be expanded from February 2018">Articles to be expanded from February 2018</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:All_articles_to_be_expanded" title="Category:All articles to be expanded">All articles to be expanded</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:All_articles_with_unsourced_statements" title="Category:All articles with unsourced statements">All articles with unsourced statements</a>
+ </li>
+ <li>
+ <a href="/wiki/Category:Articles_with_unsourced_statements_from_September_2019" title="Category:Articles with unsourced statements from September 2019">Articles with unsourced statements from September 2019</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="visualClear"></div>
+ </div>
+ </div>
+ <div id="mw-data-after-content">
+ <div class="read-more-container"></div>
+ </div>
+ <div id="mw-navigation">
+ <h2>
+ Navigation menu
+ </h2>
+ <div id="mw-head">
+ <div id="p-personal" role="navigation" class="" aria-labelledby="p-personal-label">
+ <h3 id="p-personal-label">
+ Personal tools
+ </h3>
+ <ul>
+ <li id="pt-anonuserpage">Not logged in
+ </li>
+ <li id="pt-anontalk">
+ <a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n">Talk</a>
+ </li>
+ <li id="pt-anoncontribs">
+ <a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y">Contributions</a>
+ </li>
+ <li id="pt-createaccount">
+ <a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Hermitian+matrix" title="You are encouraged to create an account and log in; however, it is not mandatory">Create account</a>
+ </li>
+ <li id="pt-login">
+ <a href="/w/index.php?title=Special:UserLogin&amp;returnto=Hermitian+matrix" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o">Log in</a>
+ </li>
+ </ul>
+ </div>
+ <div id="left-navigation">
+ <div id="p-namespaces" role="navigation" class="vectorTabs" aria-labelledby="p-namespaces-label">
+ <h3 id="p-namespaces-label">
+ Namespaces
+ </h3>
+ <ul>
+ <li id="ca-nstab-main" class="selected">
+ <a href="/wiki/Hermitian_matrix" title="View the content page [c]" accesskey="c">Article</a>
+ </li>
+ <li id="ca-talk">
+ <a href="/wiki/Talk:Hermitian_matrix" rel="discussion" title="Discussion about the content page [t]" accesskey="t">Talk</a>
+ </li>
+ </ul>
+ </div>
+ <div id="p-variants" role="navigation" class="vectorMenu emptyPortlet" aria-labelledby="p-variants-label">
+ <input type="checkbox" class="vectorMenuCheckbox" aria-labelledby="p-variants-label" />
+ <h3 id="p-variants-label">
+ <span>Variants</span>
+ </h3>
+ <ul class="menu"></ul>
+ </div>
+ </div>
+ <div id="right-navigation">
+ <div id="p-views" role="navigation" class="vectorTabs" aria-labelledby="p-views-label">
+ <h3 id="p-views-label">
+ Views
+ </h3>
+ <ul>
+ <li id="ca-view" class="collapsible selected">
+ <a href="/wiki/Hermitian_matrix">Read</a>
+ </li>
+ <li id="ca-edit" class="collapsible">
+ <a href="/w/index.php?title=Hermitian_matrix&amp;action=edit" title="Edit this page [e]" accesskey="e">Edit</a>
+ </li>
+ <li id="ca-history" class="collapsible">
+ <a href="/w/index.php?title=Hermitian_matrix&amp;action=history" title="Past revisions of this page [h]" accesskey="h">View history</a>
+ </li>
+ </ul>
+ </div>
+ <div id="p-cactions" role="navigation" class="vectorMenu emptyPortlet" aria-labelledby="p-cactions-label">
+ <input type="checkbox" class="vectorMenuCheckbox" aria-labelledby="p-cactions-label" />
+ <h3 id="p-cactions-label">
+ <span>More</span>
+ </h3>
+ <ul class="menu"></ul>
+ </div>
+ <div id="p-search" role="search">
+ <h3>
+ <label for="searchInput">Search</label>
+ </h3>
+ <form action="/w/index.php" id="searchform" name="searchform">
+ <div id="simpleSearch">
+ <input type="search" name="search" placeholder="Search Wikipedia" title="Search Wikipedia [f]" accesskey="f" id="searchInput" /> <input type="hidden" value="Special:Search" name="title" /> <input type="submit" name="fulltext" value="Search" title="Search Wikipedia for this text" id="mw-searchButton" class="searchButton mw-fallbackSearchButton" /> <input type="submit" name="go" value="Go" title="Go to a page with this exact name if it exists" id="searchButton" class="searchButton" />
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div id="mw-panel">
+ <div id="p-logo" role="banner">
+ <a title="Visit the main page" class="mw-wiki-logo" href="/wiki/Main_Page"></a>
+ </div>
+ <div class="portal" role="navigation" id="p-navigation" aria-labelledby="p-navigation-label">
+ <h3 id="p-navigation-label">
+ Navigation
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="n-mainpage-description">
+ <a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z">Main page</a>
+ </li>
+ <li id="n-contents">
+ <a href="/wiki/Wikipedia:Contents" title="Guides to browsing Wikipedia">Contents</a>
+ </li>
+ <li id="n-featuredcontent">
+ <a href="/wiki/Wikipedia:Featured_content" title="Featured content – the best of Wikipedia">Featured content</a>
+ </li>
+ <li id="n-currentevents">
+ <a href="/wiki/Portal:Current_events" title="Find background information on current events">Current events</a>
+ </li>
+ <li id="n-randompage">
+ <a href="/wiki/Special:Random" title="Load a random article [x]" accesskey="x">Random article</a>
+ </li>
+ <li id="n-sitesupport">
+ <a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en" title="Support us">Donate to Wikipedia</a>
+ </li>
+ <li id="n-shoplink">
+ <a href="//shop.wikimedia.org" title="Visit the Wikipedia store">Wikipedia store</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-interaction" aria-labelledby="p-interaction-label">
+ <h3 id="p-interaction-label">
+ Interaction
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="n-help">
+ <a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia">Help</a>
+ </li>
+ <li id="n-aboutsite">
+ <a href="/wiki/Wikipedia:About" title="Find out about Wikipedia">About Wikipedia</a>
+ </li>
+ <li id="n-portal">
+ <a href="/wiki/Wikipedia:Community_portal" title="About the project, what you can do, where to find things">Community portal</a>
+ </li>
+ <li id="n-recentchanges">
+ <a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r">Recent changes</a>
+ </li>
+ <li id="n-contactpage">
+ <a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia">Contact page</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-tb" aria-labelledby="p-tb-label">
+ <h3 id="p-tb-label">
+ Tools
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="t-whatlinkshere">
+ <a href="/wiki/Special:WhatLinksHere/Hermitian_matrix" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j">What links here</a>
+ </li>
+ <li id="t-recentchangeslinked">
+ <a href="/wiki/Special:RecentChangesLinked/Hermitian_matrix" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k">Related changes</a>
+ </li>
+ <li id="t-upload">
+ <a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u">Upload file</a>
+ </li>
+ <li id="t-specialpages">
+ <a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q">Special pages</a>
+ </li>
+ <li id="t-permalink">
+ <a href="/w/index.php?title=Hermitian_matrix&amp;oldid=942460710" title="Permanent link to this revision of the page">Permanent link</a>
+ </li>
+ <li id="t-info">
+ <a href="/w/index.php?title=Hermitian_matrix&amp;action=info" title="More information about this page">Page information</a>
+ </li>
+ <li id="t-wikibase">
+ <a href="https://www.wikidata.org/wiki/Special:EntityPage/Q652941" title="Link to connected data repository item [g]" accesskey="g">Wikidata item</a>
+ </li>
+ <li id="t-cite">
+ <a href="/w/index.php?title=Special:CiteThisPage&amp;page=Hermitian_matrix&amp;id=942460710" title="Information on how to cite this page">Cite this page</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-coll-print_export" aria-labelledby="p-coll-print_export-label">
+ <h3 id="p-coll-print_export-label">
+ Print/export
+ </h3>
+ <div class="body">
+ <ul>
+ <li id="coll-create_a_book">
+ <a href="/w/index.php?title=Special:Book&amp;bookcmd=book_creator&amp;referer=Hermitian+matrix">Create a book</a>
+ </li>
+ <li id="coll-download-as-rl">
+ <a href="/w/index.php?title=Special:ElectronPdf&amp;page=Hermitian+matrix&amp;action=show-download-screen">Download as PDF</a>
+ </li>
+ <li id="t-print">
+ <a href="/w/index.php?title=Hermitian_matrix&amp;printable=yes" title="Printable version of this page [p]" accesskey="p">Printable version</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="portal" role="navigation" id="p-lang" aria-labelledby="p-lang-label">
+ <h3 id="p-lang-label">
+ Languages
+ </h3>
+ <div class="body">
+ <ul>
+ <li class="interlanguage-link interwiki-ar">
+ <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A9_%D9%87%D9%8A%D8%B1%D9%85%D9%8A%D8%AA%D9%8A%D8%A9" title="مصفوفة هيرميتية – Arabic" lang="ar" hreflang="ar" class="interlanguage-link-target" xml:lang="ar">العربية</a>
+ </li>
+ <li class="interlanguage-link interwiki-bn">
+ <a href="https://bn.wikipedia.org/wiki/%E0%A6%B9%E0%A6%BE%E0%A6%B0%E0%A6%AE%E0%A6%BF%E0%A6%B6%E0%A6%BF%E0%A6%AF%E0%A6%BC%E0%A6%BE%E0%A6%A8" title="হারমিশিয়ান – Bangla" lang="bn" hreflang="bn" class="interlanguage-link-target" xml:lang="bn">বাংলা</a>
+ </li>
+ <li class="interlanguage-link interwiki-be">
+ <a href="https://be.wikipedia.org/wiki/%D0%AD%D1%80%D0%BC%D1%96%D1%82%D0%B0%D0%B2%D0%B0_%D0%BC%D0%B0%D1%82%D1%80%D1%8B%D1%86%D0%B0" title="Эрмітава матрыца – Belarusian" lang="be" hreflang="be" class="interlanguage-link-target" xml:lang="be">Беларуская</a>
+ </li>
+ <li class="interlanguage-link interwiki-ca">
+ <a href="https://ca.wikipedia.org/wiki/Matriu_herm%C3%ADtica" title="Matriu hermítica – Catalan" lang="ca" hreflang="ca" class="interlanguage-link-target" xml:lang="ca">Català</a>
+ </li>
+ <li class="interlanguage-link interwiki-cs">
+ <a href="https://cs.wikipedia.org/wiki/Hermitovsk%C3%A1_matice" title="Hermitovská matice – Czech" lang="cs" hreflang="cs" class="interlanguage-link-target" xml:lang="cs">Čeština</a>
+ </li>
+ <li class="interlanguage-link interwiki-de">
+ <a href="https://de.wikipedia.org/wiki/Hermitesche_Matrix" title="Hermitesche Matrix – German" lang="de" hreflang="de" class="interlanguage-link-target" xml:lang="de">Deutsch</a>
+ </li>
+ <li class="interlanguage-link interwiki-et">
+ <a href="https://et.wikipedia.org/wiki/Hermiitiline_maatriks" title="Hermiitiline maatriks – Estonian" lang="et" hreflang="et" class="interlanguage-link-target" xml:lang="et">Eesti</a>
+ </li>
+ <li class="interlanguage-link interwiki-es">
+ <a href="https://es.wikipedia.org/wiki/Matriz_hermitiana" title="Matriz hermitiana – Spanish" lang="es" hreflang="es" class="interlanguage-link-target" xml:lang="es">Español</a>
+ </li>
+ <li class="interlanguage-link interwiki-eo">
+ <a href="https://eo.wikipedia.org/wiki/Memadjunkta_matrico" title="Memadjunkta matrico – Esperanto" lang="eo" hreflang="eo" class="interlanguage-link-target" xml:lang="eo">Esperanto</a>
+ </li>
+ <li class="interlanguage-link interwiki-fa">
+ <a href="https://fa.wikipedia.org/wiki/%D9%85%D8%A7%D8%AA%D8%B1%DB%8C%D8%B3_%D9%87%D8%B1%D9%85%DB%8C%D8%AA%DB%8C" title="ماتریس هرمیتی – Persian" lang="fa" hreflang="fa" class="interlanguage-link-target" xml:lang="fa">فارسی</a>
+ </li>
+ <li class="interlanguage-link interwiki-fr">
+ <a href="https://fr.wikipedia.org/wiki/Hermitien" title="Hermitien – French" lang="fr" hreflang="fr" class="interlanguage-link-target" xml:lang="fr">Français</a>
+ </li>
+ <li class="interlanguage-link interwiki-ko">
+ <a href="https://ko.wikipedia.org/wiki/%EC%97%90%EB%A5%B4%EB%AF%B8%ED%8A%B8_%ED%96%89%EB%A0%AC" title="에르미트 행렬 – Korean" lang="ko" hreflang="ko" class="interlanguage-link-target" xml:lang="ko">한국어</a>
+ </li>
+ <li class="interlanguage-link interwiki-it">
+ <a href="https://it.wikipedia.org/wiki/Matrice_hermitiana" title="Matrice hermitiana – Italian" lang="it" hreflang="it" class="interlanguage-link-target" xml:lang="it">Italiano</a>
+ </li>
+ <li class="interlanguage-link interwiki-lv">
+ <a href="https://lv.wikipedia.org/wiki/Ermita_matrica" title="Ermita matrica – Latvian" lang="lv" hreflang="lv" class="interlanguage-link-target" xml:lang="lv">Latviešu</a>
+ </li>
+ <li class="interlanguage-link interwiki-lt">
+ <a href="https://lt.wikipedia.org/wiki/Ermito_matrica" title="Ermito matrica – Lithuanian" lang="lt" hreflang="lt" class="interlanguage-link-target" xml:lang="lt">Lietuvių</a>
+ </li>
+ <li class="interlanguage-link interwiki-hu">
+ <a href="https://hu.wikipedia.org/wiki/Hermitikus_m%C3%A1trix" title="Hermitikus mátrix – Hungarian" lang="hu" hreflang="hu" class="interlanguage-link-target" xml:lang="hu">Magyar</a>
+ </li>
+ <li class="interlanguage-link interwiki-nl">
+ <a href="https://nl.wikipedia.org/wiki/Hermitische_matrix" title="Hermitische matrix – Dutch" lang="nl" hreflang="nl" class="interlanguage-link-target" xml:lang="nl">Nederlands</a>
+ </li>
+ <li class="interlanguage-link interwiki-ja">
+ <a href="https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AB%E3%83%9F%E3%83%BC%E3%83%88%E8%A1%8C%E5%88%97" title="エルミート行列 – Japanese" lang="ja" hreflang="ja" class="interlanguage-link-target" xml:lang="ja">日本語</a>
+ </li>
+ <li class="interlanguage-link interwiki-pl">
+ <a href="https://pl.wikipedia.org/wiki/Macierz_hermitowska" title="Macierz hermitowska – Polish" lang="pl" hreflang="pl" class="interlanguage-link-target" xml:lang="pl">Polski</a>
+ </li>
+ <li class="interlanguage-link interwiki-pt">
+ <a href="https://pt.wikipedia.org/wiki/Matriz_hermitiana" title="Matriz hermitiana – Portuguese" lang="pt" hreflang="pt" class="interlanguage-link-target" xml:lang="pt">Português</a>
+ </li>
+ <li class="interlanguage-link interwiki-ru">
+ <a href="https://ru.wikipedia.org/wiki/%D0%AD%D1%80%D0%BC%D0%B8%D1%82%D0%BE%D0%B2%D0%B0_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0" title="Эрмитова матрица – Russian" lang="ru" hreflang="ru" class="interlanguage-link-target" xml:lang="ru">Русский</a>
+ </li>
+ <li class="interlanguage-link interwiki-sl">
+ <a href="https://sl.wikipedia.org/wiki/Hermitska_matrika" title="Hermitska matrika – Slovenian" lang="sl" hreflang="sl" class="interlanguage-link-target" xml:lang="sl">Slovenščina</a>
+ </li>
+ <li class="interlanguage-link interwiki-sr">
+ <a href="https://sr.wikipedia.org/wiki/%D0%95%D1%80%D0%BC%D0%B8%D1%82%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0" title="Ермитска матрица – Serbian" lang="sr" hreflang="sr" class="interlanguage-link-target" xml:lang="sr">Српски / srpski</a>
+ </li>
+ <li class="interlanguage-link interwiki-fi">
+ <a href="https://fi.wikipedia.org/wiki/Hermiittinen_matriisi" title="Hermiittinen matriisi – Finnish" lang="fi" hreflang="fi" class="interlanguage-link-target" xml:lang="fi">Suomi</a>
+ </li>
+ <li class="interlanguage-link interwiki-sv">
+ <a href="https://sv.wikipedia.org/wiki/Hermitesk_matris" title="Hermitesk matris – Swedish" lang="sv" hreflang="sv" class="interlanguage-link-target" xml:lang="sv">Svenska</a>
+ </li>
+ <li class="interlanguage-link interwiki-ta">
+ <a href="https://ta.wikipedia.org/wiki/%E0%AE%B9%E0%AF%86%E0%AE%B0%E0%AF%8D%E0%AE%AE%E0%AF%88%E0%AE%9F%E0%AF%8D_%E0%AE%85%E0%AE%A3%E0%AE%BF" title="ஹெர்மைட் அணி – Tamil" lang="ta" hreflang="ta" class="interlanguage-link-target" xml:lang="ta">தமிழ்</a>
+ </li>
+ <li class="interlanguage-link interwiki-th">
+ <a href="https://th.wikipedia.org/wiki/%E0%B9%80%E0%B8%A1%E0%B8%97%E0%B8%A3%E0%B8%B4%E0%B8%81%E0%B8%8B%E0%B9%8C%E0%B9%81%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%A1%E0%B8%B4%E0%B8%95" title="เมทริกซ์แอร์มิต – Thai" lang="th" hreflang="th" class="interlanguage-link-target" xml:lang="th">ไทย</a>
+ </li>
+ <li class="interlanguage-link interwiki-tr">
+ <a href="https://tr.wikipedia.org/wiki/Hermisyen_matris" title="Hermisyen matris – Turkish" lang="tr" hreflang="tr" class="interlanguage-link-target" xml:lang="tr">Türkçe</a>
+ </li>
+ <li class="interlanguage-link interwiki-uk">
+ <a href="https://uk.wikipedia.org/wiki/%D0%95%D1%80%D0%BC%D1%96%D1%82%D0%BE%D0%B2%D0%B0_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8F" title="Ермітова матриця – Ukrainian" lang="uk" hreflang="uk" class="interlanguage-link-target" xml:lang="uk">Українська</a>
+ </li>
+ <li class="interlanguage-link interwiki-zh">
+ <a href="https://zh.wikipedia.org/wiki/%E5%9F%83%E5%B0%94%E7%B1%B3%E7%89%B9%E7%9F%A9%E9%98%B5" title="埃尔米特矩阵 – Chinese" lang="zh" hreflang="zh" class="interlanguage-link-target" xml:lang="zh">中文</a>
+ </li>
+ </ul>
+ <div class="after-portlet after-portlet-lang">
+ <span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q652941#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="footer" role="contentinfo">
+ <ul id="footer-info" class="">
+ <li id="footer-info-lastmod">This page was last edited on 24 February 2020, at 20:33<span class="anonymous-show">&#160;(UTC)</span>.
+ </li>
+ <li id="footer-info-copyright">Text is available under the <a rel="license" href="//en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License">Creative Commons Attribution-ShareAlike License</a><a rel="license" href="//creativecommons.org/licenses/by-sa/3.0/" style="display:none;"></a>; additional terms may apply. By using this site, you agree to the <a href="//foundation.wikimedia.org/wiki/Terms_of_Use">Terms of Use</a> and <a href="//foundation.wikimedia.org/wiki/Privacy_policy">Privacy Policy</a>. Wikipedia® is a registered trademark of the <a href="//www.wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.
+ </li>
+ </ul>
+ <ul id="footer-places" class="">
+ <li id="footer-places-privacy">
+ <a href="https://foundation.wikimedia.org/wiki/Privacy_policy" class="extiw" title="wmf:Privacy policy">Privacy policy</a>
+ </li>
+ <li id="footer-places-about">
+ <a href="/wiki/Wikipedia:About" title="Wikipedia:About">About Wikipedia</a>
+ </li>
+ <li id="footer-places-disclaimer">
+ <a href="/wiki/Wikipedia:General_disclaimer" title="Wikipedia:General disclaimer">Disclaimers</a>
+ </li>
+ <li id="footer-places-contact">
+ <a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a>
+ </li>
+ <li id="footer-places-developers">
+ <a href="https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute">Developers</a>
+ </li>
+ <li id="footer-places-statslink">
+ <a href="https://stats.wikimedia.org/#/en.wikipedia.org">Statistics</a>
+ </li>
+ <li id="footer-places-cookiestatement">
+ <a href="https://foundation.wikimedia.org/wiki/Cookie_statement">Cookie statement</a>
+ </li>
+ <li id="footer-places-mobileview">
+ <a href="//en.m.wikipedia.org/w/index.php?title=Hermitian_matrix&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a>
+ </li>
+ </ul>
+ <ul id="footer-icons" class="noprint">
+ <li id="footer-copyrightico">
+ <a href="https://wikimediafoundation.org/"><img src="/static/images/wikimedia-button.png" srcset="/static/images/wikimedia-button-1.5x.png 1.5x, /static/images/wikimedia-button-2x.png 2x" width="88" height="31" alt="Wikimedia Foundation" /></a>
+ </li>
+ <li id="footer-poweredbyico">
+ <a href="https://www.mediawiki.org/"><img src="/static/images/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" srcset="/static/images/poweredby_mediawiki_132x47.png 1.5x, /static/images/poweredby_mediawiki_176x62.png 2x" width="88" height="31" /></a>
+ </li>
+ </ul>
+ <div style="clear: both;"></div>
+ </div>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"0.344","walltime":"0.623","ppvisitednodes":{"value":1719,"limit":1000000},"postexpandincludesize":{"value":18736,"limit":2097152},"templateargumentsize":{"value":1789,"limit":2097152},"expansiondepth":{"value":13,"limit":40},"expensivefunctioncount":{"value":3,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":14154,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 423.690 1 -total"," 26.69% 113.077 1 Template:Use_American_English"," 21.93% 92.904 1 Template:Reflist"," 19.39% 82.135 2 Template:Cite_book"," 14.77% 62.599 1 Template:Short_description"," 9.97% 42.248 1 Template:Expand_section"," 7.81% 33.100 1 Template:Ambox"," 7.76% 32.863 1 Template:Pagetype"," 6.13% 25.975 1 Template:Citation_needed"," 5.21% 22.058 1 Template:Fix"]},"scribunto":{"limitreport-timeusage":{"value":"0.107","limit":"10.000"},"limitreport-memusage":{"value":3494345,"limit":52428800}},"cachereport":{"origin":"mw1375","timestamp":"20200224203345","ttl":2592000,"transientcontent":false}}});});
+ ]]>
+ </script>
+ <script type="application/ld+json">
+ <![CDATA[
+ {"@context":"https:\/\/schema.org","@type":"Article","name":"Hermitian matrix","url":"https:\/\/en.wikipedia.org\/wiki\/Hermitian_matrix","sameAs":"http:\/\/www.wikidata.org\/entity\/Q652941","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q652941","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2003-02-28T21:51:08Z","dateModified":"2020-02-24T20:33:46Z","headline":"matrix equal to its conjugate-transpose"}
+ ]]>
+ </script>
+ <script>
+ <![CDATA[
+ (RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgBackendResponseTime":114,"wgHostname":"mw1248"});});
+ ]]>
+ </script>
+ </body>
+</html>
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json
index 81d1c9d4d..fc1eaf642 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected-images.json
@@ -1,4 +1,5 @@
[
+ "http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/5\/5c\/Mozilla_dinosaur_head_logo.png\/200px-Mozilla_dinosaur_head_logo.png",
"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/7\/76\/Mozilla_Firefox_logo_2013.svg\/220px-Mozilla_Firefox_logo_2013.svg.png",
"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/0\/0d\/SeaMonkey.png",
"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/d\/d7\/Buggie.svg\/220px-Buggie.svg.png",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html
index 8de3ffabc..0764fb833 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wikipedia/expected.html
@@ -1,5 +1,45 @@
-<div dir="ltr" id="mw-content-text" lang="en">
+<div id="mw-content-text" lang="en" dir="ltr">
+ <table readabilityDataTable="1">
+ <caption>Mozilla</caption>
+ <tr>
+ <td colspan="2">
+ <a href="http://fakehost/wiki/File:Mozilla_dinosaur_head_logo.png"><img alt="Mozilla dinosaur head logo.png" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Mozilla_dinosaur_head_logo.png/200px-Mozilla_dinosaur_head_logo.png" width="200" height="143" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Mozilla_dinosaur_head_logo.png/300px-Mozilla_dinosaur_head_logo.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Mozilla_dinosaur_head_logo.png/400px-Mozilla_dinosaur_head_logo.png 2x" data-file-width="1300" data-file-height="929"></a>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">Industry</th>
+ <td><a href="http://fakehost/wiki/Open-source_software" title="Open-source software">Open-source software</a></td>
+ </tr>
+ <tr>
+ <th scope="row">Founded</th>
+ <td>February&nbsp;28, 1998<span>; 18 years ago</span>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">Founder</th>
+ <td><a href="http://fakehost/wiki/Netscape" title="Netscape">Netscape Communications Corporation</a></td>
+ </tr>
+ <tr>
+ <th scope="row">Products</th>
+ <td><a href="http://fakehost/wiki/Mozilla_Application_Suite" title="Mozilla Application Suite">Mozilla Application Suite</a></td>
+ </tr>
+ <tr>
+ <th scope="row"><a href="http://fakehost/wiki/Division_(business)" title="Division (business)">Divisions</a></th>
+ <td>
+ <div>
+ <ul>
+ <li><a href="http://fakehost/wiki/Mozilla_Corporation" title="Mozilla Corporation">Mozilla Corporation</a></li>
+ <li><a href="http://fakehost/wiki/Mozilla_Foundation" title="Mozilla Foundation">Mozilla Foundation</a></li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th scope="row">Website</th>
+ <td><span><a rel="nofollow" href="http://mozilla.org/,%20https://www.mozilla.org/tr/">mozilla<wbr>.org<wbr>/,%20https:<wbr>//www<wbr>.mozilla<wbr>.org<wbr>/tr<wbr>/</a></span></td>
+ </tr>
+ </table>
<p><b>Mozilla</b> is a <a href="http://fakehost/wiki/Free_software" title="Free software">free-software</a> community, created in 1998 by members of <a href="http://fakehost/wiki/Netscape" title="Netscape">Netscape</a>. The Mozilla community uses, develops, spreads and supports Mozilla products, thereby promoting exclusively free software and open standards, with only minor exceptions.<sup id="cite_ref-1"><a href="#cite_note-1">[1]</a></sup> The community is supported institutionally by the <a href="http://fakehost/wiki/Mozilla_Foundation" title="Mozilla Foundation">Mozilla Foundation</a> and its tax-paying subsidiary, the <a href="http://fakehost/wiki/Mozilla_Corporation" title="Mozilla Corporation">Mozilla Corporation</a>.<sup id="cite_ref-2"><a href="#cite_note-2">[2]</a></sup></p>
<p><a href="http://fakehost/wiki/List_of_Mozilla_products" title="List of Mozilla products">Mozilla produces many products</a> such as the <a href="http://fakehost/wiki/Firefox" title="Firefox">Firefox</a> web browser, <a href="http://fakehost/wiki/Mozilla_Thunderbird" title="Mozilla Thunderbird">Thunderbird</a> e-mail client, <a href="http://fakehost/wiki/Firefox_Mobile" title="Firefox Mobile">Firefox Mobile</a> web browser, <a href="http://fakehost/wiki/Firefox_OS" title="Firefox OS">Firefox OS</a> mobile operating system, <a href="http://fakehost/wiki/Bugzilla" title="Bugzilla">Bugzilla</a> bug tracking system and other projects.</p>
@@ -10,8 +50,8 @@
<p>On January 23, 1998, Netscape made two announcements: first, that <a href="http://fakehost/wiki/Netscape_Communicator" title="Netscape Communicator">Netscape Communicator</a> will be free; second, that the source code will also be free.<sup id="cite_ref-3"><a href="#cite_note-3">[3]</a></sup> One day later, <a href="http://fakehost/wiki/Jamie_Zawinski" title="Jamie Zawinski">Jamie Zawinski</a> from Netscape registered <span>mozilla.org</span>.<sup id="cite_ref-4"><a href="#cite_note-4">[4]</a></sup> The project was named Mozilla after the original code name of the <a href="http://fakehost/wiki/Netscape_Navigator" title="Netscape Navigator">Netscape Navigator</a> browser which is a blending of "<a href="http://fakehost/wiki/Mosaic_(web_browser)" title="Mosaic (web browser)">Mosaic</a> and <a href="http://fakehost/wiki/Godzilla" title="Godzilla">Godzilla</a>"<sup id="cite_ref-google_5-0"><a href="#cite_note-google-5">[5]</a></sup> and used to co-ordinate the development of the <a href="http://fakehost/wiki/Mozilla_Application_Suite" title="Mozilla Application Suite">Mozilla Application Suite</a>, the <a href="http://fakehost/wiki/Open_source" title="Open source">open source</a> version of Netscape's internet software, <a href="http://fakehost/wiki/Netscape_Communicator" title="Netscape Communicator">Netscape Communicator</a>.<sup id="cite_ref-Mozilla_Launch_Announcement_6-0"><a href="#cite_note-Mozilla_Launch_Announcement-6">[6]</a></sup><sup id="cite_ref-7"><a href="#cite_note-7">[7]</a></sup> Jamie Zawinski says he came up with the name "Mozilla" at a Netscape staff meeting.<sup id="cite_ref-8"><a href="#cite_note-8">[8]</a></sup><sup id="cite_ref-9"><a href="#cite_note-9">[9]</a></sup> A small group of Netscape employees were tasked with coordination of the new community.</p>
<p>Originally, Mozilla aimed to be a technology provider for companies, such as Netscape, who would commercialize their open source code.<sup id="cite_ref-10"><a href="#cite_note-10">[10]</a></sup> When <a href="http://fakehost/wiki/AOL" title="AOL">AOL</a> (Netscape's parent company) greatly reduced its involvement with Mozilla in July 2003, the <a href="http://fakehost/wiki/Mozilla_Foundation" title="Mozilla Foundation">Mozilla Foundation</a> was designated the legal steward of the project.<sup id="cite_ref-11"><a href="#cite_note-11">[11]</a></sup> Soon after, Mozilla deprecated the Mozilla Suite in favor of creating independent applications for each function, primarily the <a href="http://fakehost/wiki/Firefox" title="Firefox">Firefox</a> web browser and the <a href="http://fakehost/wiki/Mozilla_Thunderbird" title="Mozilla Thunderbird">Thunderbird</a> email client, and moved to supply them directly to the public.<sup id="cite_ref-12"><a href="#cite_note-12">[12]</a></sup></p>
<p>Recently, Mozilla's activities have expanded to include Firefox on mobile platforms (primarily <a href="http://fakehost/wiki/Android_(operating_system)" title="Android (operating system)">Android</a>),<sup id="cite_ref-13"><a href="#cite_note-13">[13]</a></sup> a mobile OS called <a href="http://fakehost/wiki/Firefox_OS" title="Firefox OS">Firefox OS</a>,<sup id="cite_ref-14"><a href="#cite_note-14">[14]</a></sup> a web-based identity system called <a href="http://fakehost/wiki/Mozilla_Persona" title="Mozilla Persona">Mozilla Persona</a> and a marketplace for HTML5 applications.<sup id="cite_ref-15"><a href="#cite_note-15">[15]</a></sup></p>
- <p>In a report released in November 2012, Mozilla reported that their total revenue for 2011 was $163 million, which was up 33% from $123 million in 2010. Mozilla noted that roughly 85% of their revenue comes from their contract with Google.<sup id="cite_ref-16"><a href="#cite_note-16">[16]</a></sup></p>
- <p>At the end of 2013, Mozilla announced a deal with <a href="http://fakehost/wiki/Cisco_Systems" title="Cisco Systems">Cisco Systems</a> whereby Firefox would download and use a Cisco-provided binary build of an open source<sup id="cite_ref-github_17-0"><a href="#cite_note-github-17">[17]</a></sup><a href="http://fakehost/wiki/Codec" title="Codec">codec</a> to play the <a href="http://fakehost/wiki/Proprietary_format" title="Proprietary format">proprietary</a> <a href="http://fakehost/wiki/H.264" title="H.264">H.264</a> video format.<sup id="cite_ref-gigaom_18-0"><a href="#cite_note-gigaom-18">[18]</a></sup><sup id="cite_ref-techrepublic_19-0"><a href="#cite_note-techrepublic-19">[19]</a></sup> As part of the deal, Cisco would pay any patent licensing fees associated with the binaries that it distributes. Mozilla's CTO, <a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Brendan Eich</a>, acknowledged that this is "not a complete solution" and isn't "perfect".<sup id="cite_ref-20"><a href="#cite_note-20">[20]</a></sup> An employee in Mozilla's video formats team, writing in an unofficial capacity, justified<sup id="cite_ref-21"><a href="#cite_note-21">[21]</a></sup> it by the need to maintain their large user base, which would be necessary in future battles for truly free video formats.</p>
+ <p>In a report released in November 2012, Mozilla reported that their total revenue for 2011 was $163&nbsp;million, which was up 33% from $123&nbsp;million in 2010. Mozilla noted that roughly 85% of their revenue comes from their contract with Google.<sup id="cite_ref-16"><a href="#cite_note-16">[16]</a></sup></p>
+ <p>At the end of 2013, Mozilla announced a deal with <a href="http://fakehost/wiki/Cisco_Systems" title="Cisco Systems">Cisco Systems</a> whereby Firefox would download and use a Cisco-provided binary build of an open source<sup id="cite_ref-github_17-0"><a href="#cite_note-github-17">[17]</a></sup> <a href="http://fakehost/wiki/Codec" title="Codec">codec</a> to play the <a href="http://fakehost/wiki/Proprietary_format" title="Proprietary format">proprietary</a> <a href="http://fakehost/wiki/H.264" title="H.264">H.264</a> video format.<sup id="cite_ref-gigaom_18-0"><a href="#cite_note-gigaom-18">[18]</a></sup><sup id="cite_ref-techrepublic_19-0"><a href="#cite_note-techrepublic-19">[19]</a></sup> As part of the deal, Cisco would pay any patent licensing fees associated with the binaries that it distributes. Mozilla's CTO, <a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Brendan Eich</a>, acknowledged that this is "not a complete solution" and isn't "perfect".<sup id="cite_ref-20"><a href="#cite_note-20">[20]</a></sup> An employee in Mozilla's video formats team, writing in an unofficial capacity, justified<sup id="cite_ref-21"><a href="#cite_note-21">[21]</a></sup> it by the need to maintain their large user base, which would be necessary in future battles for truly free video formats.</p>
<p>In December 2013, Mozilla announced funding for the development of non-<a href="http://fakehost/wiki/Free_software" title="Free software">free</a> games<sup id="cite_ref-22"><a href="#cite_note-22">[22]</a></sup> through its Game Creator Challenge. However, even those games that may be released under a non-free software or open source license must be made with open web technologies and Javascript as per the work criteria outlined in the announcement.</p>
<h3><span id="Eich_CEO_promotion_controversy">Eich CEO promotion controversy</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=2" title="Edit section: Eich CEO promotion controversy">edit</a><span>]</span></span>
</h3>
@@ -28,19 +68,19 @@
<p>According to the Mozilla Foundation:<sup id="cite_ref-41"><a href="#cite_note-41">[41]</a></sup></p>
<blockquote>
<p>The Mozilla Foundation pledges to support the Mozilla Manifesto in its activities. Specifically, we will:</p>
- <ul><li>Build and enable open-source technologies and communities that support the Manifesto’s principles;</li>
+ <ul>
+ <li>Build and enable open-source technologies and communities that support the Manifesto’s principles;</li>
<li>Build and deliver great consumer products that support the Manifesto’s principles;</li>
<li>Use the Mozilla assets (intellectual property such as copyrights and trademarks, infrastructure, funds, and reputation) to keep the Internet an open platform;</li>
<li>Promote models for creating economic value for the public benefit; and</li>
<li>Promote the Mozilla Manifesto principles in public discourse and within the Internet industry.</li>
- </ul></blockquote>
+ </ul>
+ </blockquote>
<h2><span id="Software">Software</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=5" title="Edit section: Software">edit</a><span>]</span></span>
</h2>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:Mozilla_Firefox_logo_2013.svg"><img alt="" data-file-height="373" data-file-width="352" height="233" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/220px-Mozilla_Firefox_logo_2013.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/330px-Mozilla_Firefox_logo_2013.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/440px-Mozilla_Firefox_logo_2013.svg.png 2x" width="220"></img></a></p>
+ <p><a href="http://fakehost/wiki/File:Mozilla_Firefox_logo_2013.svg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/220px-Mozilla_Firefox_logo_2013.svg.png" width="220" height="233" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/330px-Mozilla_Firefox_logo_2013.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Mozilla_Firefox_logo_2013.svg/440px-Mozilla_Firefox_logo_2013.svg.png 2x" data-file-width="352" data-file-height="373"></a></p>
</div>
- </div>
<h3><span id="Firefox">Firefox</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=6" title="Edit section: Firefox">edit</a><span>]</span></span>
</h3>
@@ -52,7 +92,7 @@
<p>Firefox Mobile (codenamed <i>Fennec</i>) is the build of the <a href="http://fakehost/wiki/Firefox" title="Firefox">Mozilla Firefox</a> <a href="http://fakehost/wiki/Web_browser" title="Web browser">web browser</a> for devices such as <a href="http://fakehost/wiki/Smartphone" title="Smartphone">smartphones</a> and <a href="http://fakehost/wiki/Tablet_computer" title="Tablet computer">tablet computers</a>.</p>
<p>Firefox Mobile uses the same <a href="http://fakehost/wiki/Gecko_(layout_engine)" title="Gecko (layout engine)">Gecko</a> <a href="http://fakehost/wiki/Layout_engine" title="Layout engine">layout engine</a> as <a href="http://fakehost/wiki/Firefox" title="Firefox">Mozilla Firefox</a>. For example, version 1.0 used the same engine as Firefox 3.6, and the following release, 4.0, shared core code with Firefox 4.0. Its features include <a href="http://fakehost/wiki/HTML5" title="HTML5">HTML5</a> support, <a href="http://fakehost/wiki/Firefox_Sync" title="Firefox Sync">Firefox Sync</a>, <a href="http://fakehost/wiki/Add-on_(Mozilla)" title="Add-on (Mozilla)">add-ons</a> support and <a href="http://fakehost/wiki/Tabbed_browsing" title="Tabbed browsing">tabbed browsing</a>.<sup id="cite_ref-50"><a href="#cite_note-50">[50]</a></sup></p>
- <p>Firefox Mobile is currently available for <a href="http://fakehost/wiki/Android_(operating_system)" title="Android (operating system)">Android</a> 2.2 and above devices with an <a href="http://fakehost/wiki/ARM_architecture" title="ARM architecture">ARMv7</a> or <a href="http://fakehost/wiki/ARM_architecture" title="ARM architecture">ARMv6</a> CPU.<sup id="cite_ref-51"><a href="#cite_note-51">[51]</a></sup> The x86 architecture is not officially supported.<sup id="cite_ref-52"><a href="#cite_note-52">[52]</a></sup><a href="http://fakehost/wiki/Tristan_Nitot" title="Tristan Nitot">Tristan Nitot</a>, president of <a href="http://fakehost/wiki/Mozilla_Europe" title="Mozilla Europe">Mozilla Europe</a>, has said that it's unlikely that an <a href="http://fakehost/wiki/IPhone" title="IPhone">iPhone</a> or a <a href="http://fakehost/wiki/BlackBerry" title="BlackBerry">BlackBerry</a> version will be released, citing <a href="http://fakehost/wiki/Apple_Inc" title="Apple Inc">Apple's</a> iTunes Store application approval policies (which forbid applications competing with Apple's own, and forbid engines which run downloaded code) and BlackBerry's limited operating system as the reasons.<sup id="cite_ref-53"><a href="#cite_note-53">[53]</a></sup></p>
+ <p>Firefox Mobile is currently available for <a href="http://fakehost/wiki/Android_(operating_system)" title="Android (operating system)">Android</a> 2.2 and above devices with an <a href="http://fakehost/wiki/ARM_architecture" title="ARM architecture">ARMv7</a> or <a href="http://fakehost/wiki/ARM_architecture" title="ARM architecture">ARMv6</a> CPU.<sup id="cite_ref-51"><a href="#cite_note-51">[51]</a></sup> The x86 architecture is not officially supported.<sup id="cite_ref-52"><a href="#cite_note-52">[52]</a></sup> <a href="http://fakehost/wiki/Tristan_Nitot" title="Tristan Nitot">Tristan Nitot</a>, president of <a href="http://fakehost/wiki/Mozilla_Europe" title="Mozilla Europe">Mozilla Europe</a>, has said that it's unlikely that an <a href="http://fakehost/wiki/IPhone" title="IPhone">iPhone</a> or a <a href="http://fakehost/wiki/BlackBerry" title="BlackBerry">BlackBerry</a> version will be released, citing <a href="http://fakehost/wiki/Apple_Inc" title="Apple Inc">Apple's</a> iTunes Store application approval policies (which forbid applications competing with Apple's own, and forbid engines which run downloaded code) and BlackBerry's limited operating system as the reasons.<sup id="cite_ref-53"><a href="#cite_note-53">[53]</a></sup></p>
<h3><span id="Firefox_OS">Firefox OS</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=8" title="Edit section: Firefox OS">edit</a><span>]</span></span>
</h3>
@@ -67,10 +107,8 @@
</h3>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:SeaMonkey.png"><img alt="" data-file-height="128" data-file-width="128" height="128" src="http://upload.wikimedia.org/wikipedia/commons/0/0d/SeaMonkey.png" width="128"></img></a></p>
+ <p><a href="http://fakehost/wiki/File:SeaMonkey.png"><img alt src="http://upload.wikimedia.org/wikipedia/commons/0/0d/SeaMonkey.png" width="128" height="128" data-file-width="128" data-file-height="128"></a></p>
</div>
- </div>
<p><a href="http://fakehost/wiki/SeaMonkey" title="SeaMonkey">SeaMonkey</a> (formerly the Mozilla Application Suite) is a free and open source cross platform suite of Internet software components including a web browser component, a client for sending and receiving email and <a href="http://fakehost/wiki/USENET" title="USENET">USENET</a> newsgroup messages, an HTML editor (<a href="http://fakehost/wiki/Mozilla_Composer" title="Mozilla Composer">Mozilla Composer</a>) and the <a href="http://fakehost/wiki/ChatZilla" title="ChatZilla">ChatZilla</a> IRC client.</p>
<p>On March 10, 2005, <a href="http://fakehost/wiki/The_Mozilla_Foundation" title="The Mozilla Foundation">the Mozilla Foundation</a> announced that it would not release any official versions of Mozilla Application Suite beyond 1.7.x, since it had now focused on the standalone applications <a href="http://fakehost/wiki/Mozilla_Firefox" title="Mozilla Firefox">Firefox</a> and <a href="http://fakehost/wiki/Mozilla_Thunderbird" title="Mozilla Thunderbird">Thunderbird</a>.<sup id="cite_ref-57"><a href="#cite_note-57">[57]</a></sup> SeaMonkey is now maintained by the SeaMonkey Council, which has <a href="http://fakehost/wiki/Trademark" title="Trademark">trademarked</a> the SeaMonkey name with help from the Mozilla Foundation.<sup id="cite_ref-58"><a href="#cite_note-58">[58]</a></sup> The Mozilla Foundation provides project hosting for the SeaMonkey developers.</p>
@@ -78,10 +116,8 @@
</h3>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:Buggie.svg"><img alt="" data-file-height="125" data-file-width="95" height="289" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/220px-Buggie.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/330px-Buggie.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/440px-Buggie.svg.png 2x" width="220"></img></a></p>
+ <p><a href="http://fakehost/wiki/File:Buggie.svg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/220px-Buggie.svg.png" width="220" height="289" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/330px-Buggie.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Buggie.svg/440px-Buggie.svg.png 2x" data-file-width="95" data-file-height="125"></a></p>
</div>
- </div>
<p><a href="http://fakehost/wiki/Bugzilla" title="Bugzilla">Bugzilla</a> is a <a href="http://fakehost/wiki/World_Wide_Web" title="World Wide Web">web</a>-based general-purpose <a href="http://fakehost/wiki/Bug_tracking_system" title="Bug tracking system">bug tracking system</a>, which was released as <a href="http://fakehost/wiki/Open_source_software" title="Open source software">open source software</a> by <a href="http://fakehost/wiki/Netscape_Communications" title="Netscape Communications">Netscape Communications</a> in 1998 along with the rest of the Mozilla codebase, and is currently stewarded by Mozilla. It has been adopted by a variety of organizations for use as a <a href="http://fakehost/wiki/Bug_tracking_system" title="Bug tracking system">bug tracking system</a> for both <a href="http://fakehost/wiki/Free_and_open_source_software" title="Free and open source software">free and open source software</a> and <a href="http://fakehost/wiki/Proprietary_software" title="Proprietary software">proprietary</a> projects and products, including the <a href="http://fakehost/wiki/The_Mozilla_Foundation" title="The Mozilla Foundation">Mozilla Foundation</a>, the <a href="http://fakehost/wiki/Linux_kernel" title="Linux kernel">Linux kernel</a>, <a href="http://fakehost/wiki/GNOME" title="GNOME">GNOME</a>, <a href="http://fakehost/wiki/KDE" title="KDE">KDE</a>, <a href="http://fakehost/wiki/Red_Hat" title="Red Hat">Red Hat</a>, <a href="http://fakehost/wiki/Novell" title="Novell">Novell</a>, <a href="http://fakehost/wiki/Eclipse_(software)" title="Eclipse (software)">Eclipse</a> and <a href="http://fakehost/wiki/LibreOffice" title="LibreOffice">LibreOffice</a>.<sup id="cite_ref-59"><a href="#cite_note-59">[59]</a></sup></p>
<h3><span id="Components">Components</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=12" title="Edit section: Components">edit</a><span>]</span></span>
</h3>
@@ -147,38 +183,34 @@
<h3><span id="Local_communities">Local communities</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=28" title="Edit section: Local communities">edit</a><span>]</span></span>
</h3>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:London_Mozilla_Workspace.jpg"><img alt="" data-file-height="1656" data-file-width="2500" height="146" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/220px-London_Mozilla_Workspace.jpg" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/330px-London_Mozilla_Workspace.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/440px-London_Mozilla_Workspace.jpg 2x" width="220"></img></a></p>
+ <p><a href="http://fakehost/wiki/File:London_Mozilla_Workspace.jpg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/220px-London_Mozilla_Workspace.jpg" width="220" height="146" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/330px-London_Mozilla_Workspace.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/London_Mozilla_Workspace.jpg/440px-London_Mozilla_Workspace.jpg 2x" data-file-width="2500" data-file-height="1656"></a></p>
</div>
- </div>
<p>There are a number of sub-communities that exist based on their geographical locations, where contributors near each other work together on particular activities, such as localization, marketing, PR and user support.</p>
<h3><span id="Mozilla_Reps">Mozilla Reps</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=29" title="Edit section: Mozilla Reps">edit</a><span>]</span></span>
</h3>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:Mozilla_Reps.png"><img alt="" data-file-height="183" data-file-width="400" height="101" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mozilla_Reps.png/220px-Mozilla_Reps.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mozilla_Reps.png/330px-Mozilla_Reps.png 1.5x, //upload.wikimedia.org/wikipedia/commons/0/0b/Mozilla_Reps.png 2x" width="220"></img></a></p>
+ <p><a href="http://fakehost/wiki/File:Mozilla_Reps.png"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mozilla_Reps.png/220px-Mozilla_Reps.png" width="220" height="101" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Mozilla_Reps.png/330px-Mozilla_Reps.png 1.5x, http://upload.wikimedia.org/wikipedia/commons/0/0b/Mozilla_Reps.png 2x" data-file-width="400" data-file-height="183"></a></p>
</div>
- </div>
<p>The Mozilla Reps program aims to empower and support volunteer Mozillians who want to become official representatives of Mozilla in their region/locale.</p>
<p>The program provides a simple framework and a specific set of tools to help Mozillians to organize and/or attend events, recruit and mentor new contributors, document and share activities, and support their local communities better.</p>
<p>When joining the program, a Mozilla Rep agrees to take on the following responsibilities:</p>
- <ul><li>Represent Mozilla in their country/region</li>
+ <ul>
+ <li>Represent Mozilla in their country/region</li>
<li>Promote the Mozilla Project and its mission</li>
<li>Build on and support existing/future local community efforts and programs</li>
<li>Inspire, recruit and support new contributors</li>
<li>Support and mentor future Mozilla Reps</li>
<li>Document clearly all their activities</li>
- </ul><h3><span id="Conferences_and_events">Conferences and events</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=30" title="Edit section: Conferences and events">edit</a><span>]</span></span>
+ </ul>
+ <h3><span id="Conferences_and_events">Conferences and events</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=30" title="Edit section: Conferences and events">edit</a><span>]</span></span>
</h3>
<h4><span id="Mozilla_Festival">Mozilla Festival</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=31" title="Edit section: Mozilla Festival">edit</a><span>]</span></span>
</h4>
<div>
- <div>
- <p><a href="http://fakehost/wiki/File:Fireside_Chat,_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg"><img alt="" data-file-height="854" data-file-width="1280" height="147" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/220px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/330px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/440px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg 2x" width="220"></img></a></p><div>
+ <p><a href="http://fakehost/wiki/File:Fireside_Chat,_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg"><img alt src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/220px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg" width="220" height="147" srcset="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/330px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg 1.5x, http://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg/440px-Fireside_Chat%2C_Knight%27s_Michael_Maness_and_Dan_Sinker_-_Flickr_-_Knight_Foundation.jpg 2x" data-file-width="1280" data-file-height="854"></a></p><div>
<p>
Speakers from the <a href="http://fakehost/wiki/Knight_Foundation" title="Knight Foundation">Knight Foundation</a> discuss the future of news at the 2011 Mozilla Festival in London.</p></div>
</div>
- </div>
<p>The Mozilla Festival is an annual event where hundreds of passionate people explore the Web, learn together and make things that can change the world. With the emphasis on <i>making</i>—the mantra of the Festival is "less yack, more hack." Journalists, coders, filmmakers, designers, educators, gamers, makers, youth and anyone else, from all over the world, are encouraged to attend, with attendees from more than 40 countries, working together at the intersection between freedom, the Web, and that years theme.</p>
<p>The event revolves around design challenges which address key issues based on the chosen theme for that years festival. In previous years the Mozilla Festival has focused on Learning, and Media, with the 2012 festival being based around making. The titles of the festival revolve around the main theme, freedom (as in freedom of speech not free beer), and the Web.</p>
<h4><span id="MozCamps">MozCamps</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=32" title="Edit section: MozCamps">edit</a><span>]</span></span>
@@ -190,237 +222,247 @@
<h2><span id="See_also">See also</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=34" title="Edit section: See also">edit</a><span>]</span></span>
</h2>
- <ul><li><a href="http://fakehost/wiki/-zilla_(suffix)" title="-zilla (suffix)">-zilla (suffix)</a></li>
+ <ul>
+ <li><a href="http://fakehost/wiki/-zilla_(suffix)" title="-zilla (suffix)">-zilla (suffix)</a></li>
<li><a href="http://fakehost/wiki/Mozilla_(mascot)" title="Mozilla (mascot)">Mozilla (mascot)</a></li>
<li><i><a href="http://fakehost/wiki/The_Book_of_Mozilla" title="The Book of Mozilla">The Book of Mozilla</a></i></li>
<li><a href="http://fakehost/wiki/Timeline_of_web_browsers" title="Timeline of web browsers">Timeline of web browsers</a></li>
- </ul><h2><span id="References">References</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=35" title="Edit section: References">edit</a><span>]</span></span>
+ </ul>
+ <h2><span id="References">References</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=35" title="Edit section: References">edit</a><span>]</span></span>
</h2>
<div>
- <ol><li id="cite_note-1"><span><b><a href="#cite_ref-1">^</a></b></span> <span>For exceptions, see "Values" section below</span></li>
- <li id="cite_note-2"><span><b><a href="#cite_ref-2">^</a></b></span> <span><cite><a href="https://www.mozilla.org/foundation/moco/" rel="nofollow">"About the Mozilla Corporation"</a>. Mozilla Foundation.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=About+the+Mozilla+Corporation&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Ffoundation%2Fmoco%2F&amp;rft.pub=Mozilla+Foundation&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <ol>
+ <li id="cite_note-1"><span><b><a href="#cite_ref-1">^</a></b></span> <span>For exceptions, see "Values" section below</span></li>
+ <li id="cite_note-2"><span><b><a href="#cite_ref-2">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.mozilla.org/foundation/moco/">"About the Mozilla Corporation"</a>. Mozilla Foundation.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=About+the+Mozilla+Corporation&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Ffoundation%2Fmoco%2F&amp;rft.pub=Mozilla+Foundation&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-3"><span><b><a href="#cite_ref-3">^</a></b></span> <span><cite><a href="http://www.oreilly.com/openbook/opensources/book/netrev.html" rel="nofollow">"Freeing the Source: The Story of Mozilla"</a>. <i>Open Sources: Voices from the Open Source Revolution</i><span>. Retrieved <span>2016-05-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Freeing+the+Source%3A+The+Story+of+Mozilla&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.oreilly.com%2Fopenbook%2Fopensources%2Fbook%2Fnetrev.html&amp;rft.jtitle=Open+Sources%3A+Voices+from+the+Open+Source+Revolution&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-3"><span><b><a href="#cite_ref-3">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.oreilly.com/openbook/opensources/book/netrev.html">"Freeing the Source: The Story of Mozilla"</a>. <i>Open Sources: Voices from the Open Source Revolution</i><span>. Retrieved <span>2016-05-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Freeing+the+Source%3A+The+Story+of+Mozilla&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.oreilly.com%2Fopenbook%2Fopensources%2Fbook%2Fnetrev.html&amp;rft.jtitle=Open+Sources%3A+Voices+from+the+Open+Source+Revolution&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-4"><span><b><a href="#cite_ref-4">^</a></b></span> <span><cite><a href="https://whois.domaintools.com/mozilla.org" rel="nofollow">"Mozilla.org WHOIS, DNS, &amp; Domain Info"</a>. <i>DomainTools</i><span>. Retrieved <span>1 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla.org+WHOIS%2C+DNS%2C+%26+Domain+Info&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwhois.domaintools.com%2Fmozilla.org&amp;rft.jtitle=DomainTools&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-4"><span><b><a href="#cite_ref-4">^</a></b></span> <span><cite><a rel="nofollow" href="https://whois.domaintools.com/mozilla.org">"Mozilla.org WHOIS, DNS, &amp; Domain Info"</a>. <i>DomainTools</i><span>. Retrieved <span>1 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla.org+WHOIS%2C+DNS%2C+%26+Domain+Info&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwhois.domaintools.com%2Fmozilla.org&amp;rft.jtitle=DomainTools&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-google-5"><span><b><a href="#cite_ref-google_5-0">^</a></b></span> <span><cite>Payment, S. (2007). <a href="http://books.google.co.uk/books?id=zyIvOn7sKCsC" rel="nofollow"><i>Marc Andreessen and Jim Clark: The Founders of Netscape</i></a>. Rosen Publishing Group. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a> <a href="http://fakehost/wiki/Special:BookSources/9781404207196" title="Special:BookSources/9781404207196">9781404207196</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=Payment%2C+S.&amp;rft.btitle=Marc+Andreessen+and+Jim+Clark%3A+The+Founders+of+Netscape&amp;rft.date=2007&amp;rft.genre=book&amp;rft_id=%2F%2Fbooks.google.co.uk%2Fbooks%3Fid%3DzyIvOn7sKCsC&amp;rft.isbn=9781404207196&amp;rft.pub=Rosen+Publishing+Group&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-google-5"><span><b><a href="#cite_ref-google_5-0">^</a></b></span> <span><cite>Payment, S. (2007). <a rel="nofollow" href="http://books.google.co.uk/books?id=zyIvOn7sKCsC"><i>Marc Andreessen and Jim Clark: The Founders of Netscape</i></a>. Rosen Publishing Group. <a href="http://fakehost/wiki/International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<a href="http://fakehost/wiki/Special:BookSources/9781404207196" title="Special:BookSources/9781404207196">9781404207196</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=Payment%2C+S.&amp;rft.btitle=Marc+Andreessen+and+Jim+Clark%3A+The+Founders+of+Netscape&amp;rft.date=2007&amp;rft.genre=book&amp;rft_id=%2F%2Fbooks.google.co.uk%2Fbooks%3Fid%3DzyIvOn7sKCsC&amp;rft.isbn=9781404207196&amp;rft.pub=Rosen+Publishing+Group&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-Mozilla_Launch_Announcement-6"><span><b><a href="#cite_ref-Mozilla_Launch_Announcement_6-0">^</a></b></span> <span><cite><a href="https://web.archive.org/web/20021004080737/wp.netscape.com/newsref/pr/newsrelease577.html" rel="nofollow">"Netscape Announces mozilla.org, a Dedicated Team and Web Site Supporting Development of Free Client Source Code"</a>. Netscape. Archived from the original on October 4, 2002<span>. Retrieved <span>2012-08-21</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Netscape+Announces+mozilla.org%2C+a+Dedicated+Team+and+Web+Site+Supporting+Development+of+Free+Client+Source+Code&amp;rft.genre=unknown&amp;rft_id=%2F%2Fwp.netscape.com%2Fnewsref%2Fpr%2Fnewsrelease577.html&amp;rft.pub=Netscape&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> </span>
+ <li id="cite_note-Mozilla_Launch_Announcement-6"><span><b><a href="#cite_ref-Mozilla_Launch_Announcement_6-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20021004080737/wp.netscape.com/newsref/pr/newsrelease577.html">"Netscape Announces mozilla.org, a Dedicated Team and Web Site Supporting Development of Free Client Source Code"</a>. Netscape. Archived from the original on October 4, 2002<span>. Retrieved <span>2012-08-21</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Netscape+Announces+mozilla.org%2C+a+Dedicated+Team+and+Web+Site+Supporting+Development+of+Free+Client+Source+Code&amp;rft.genre=unknown&amp;rft_id=%2F%2Fwp.netscape.com%2Fnewsref%2Fpr%2Fnewsrelease577.html&amp;rft.pub=Netscape&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> </span>
</li>
- <li id="cite_note-7"><span><b><a href="#cite_ref-7">^</a></b></span> <span><cite><a href="http://www.highbeam.com/doc/1G1-20453744.html" rel="nofollow">"Mac vendors ponder Netscape gambit."</a>. <i>Macworld</i>. 1 May 1998<span>. Retrieved <span>2012-08-19</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mac+vendors+ponder+Netscape+gambit.&amp;rft.date=1998-05-01&amp;rft.genre=article&amp;rft_id=http%3A%2F%2Fwww.highbeam.com%2Fdoc%2F1G1-20453744.html&amp;rft.jtitle=Macworld&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-7"><span><b><a href="#cite_ref-7">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.highbeam.com/doc/1G1-20453744.html">"Mac vendors ponder Netscape gambit."</a>. <i>Macworld</i>. 1 May 1998<span>. Retrieved <span>2012-08-19</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mac+vendors+ponder+Netscape+gambit.&amp;rft.date=1998-05-01&amp;rft.genre=article&amp;rft_id=http%3A%2F%2Fwww.highbeam.com%2Fdoc%2F1G1-20453744.html&amp;rft.jtitle=Macworld&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-8"><span><b><a href="#cite_ref-8">^</a></b></span> <span><cite>Zawinski, Jamie (1996). <a href="http://www.jwz.org/gruntle/nscpdorm.html" rel="nofollow">"nscp dorm"</a><span>. Retrieved <span>2007-10-12</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Jamie&amp;rft.aulast=Zawinski&amp;rft.btitle=nscp+dorm&amp;rft.date=1996&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.jwz.org%2Fgruntle%2Fnscpdorm.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-8"><span><b><a href="#cite_ref-8">^</a></b></span> <span><cite>Zawinski, Jamie (1996). <a rel="nofollow" href="http://www.jwz.org/gruntle/nscpdorm.html">"nscp dorm"</a><span>. Retrieved <span>2007-10-12</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Jamie&amp;rft.aulast=Zawinski&amp;rft.btitle=nscp+dorm&amp;rft.date=1996&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.jwz.org%2Fgruntle%2Fnscpdorm.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-9"><span><b><a href="#cite_ref-9">^</a></b></span> <span><cite>Dave Titus with assistance from Andrew Wong. <a href="http://www.davetitus.com/mozilla/" rel="nofollow">"How was Mozilla born"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=Dave+Titus+with+assistance+from+Andrew+Wong&amp;rft.btitle=How+was+Mozilla+born&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.davetitus.com%2Fmozilla%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-9"><span><b><a href="#cite_ref-9">^</a></b></span> <span><cite>Dave Titus with assistance from Andrew Wong. <a rel="nofollow" href="http://www.davetitus.com/mozilla/">"How was Mozilla born"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=Dave+Titus+with+assistance+from+Andrew+Wong&amp;rft.btitle=How+was+Mozilla+born&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.davetitus.com%2Fmozilla%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-10"><span><b><a href="#cite_ref-10">^</a></b></span> <span><cite><a href="http://www-archive.mozilla.org/hacking/coding-introduction.html" rel="nofollow">"Introduction to Mozilla Source Code"</a>. Mozilla<span>. Retrieved <span>2012-08-18</span></span>. <q>However, mozilla.org wants to emphasize that these milestones are being produced for testing purposes only.</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Introduction+to+Mozilla+Source+Code&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww-archive.mozilla.org%2Fhacking%2Fcoding-introduction.html&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-10"><span><b><a href="#cite_ref-10">^</a></b></span> <span><cite><a rel="nofollow" href="http://www-archive.mozilla.org/hacking/coding-introduction.html">"Introduction to Mozilla Source Code"</a>. Mozilla<span>. Retrieved <span>2012-08-18</span></span>. <q>However, mozilla.org wants to emphasize that these milestones are being produced for testing purposes only.</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Introduction+to+Mozilla+Source+Code&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww-archive.mozilla.org%2Fhacking%2Fcoding-introduction.html&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-11"><span><b><a href="#cite_ref-11">^</a></b></span> <span><cite><a href="http://www.mozilla.org/en-US/press/mozilla-foundation.html" rel="nofollow">"mozilla.org Announces Launch of the Mozilla Foundation to Lead Open-Source Browser Efforts"</a><span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=mozilla.org+Announces+Launch+of+the+Mozilla+Foundation+to+Lead+Open-Source+Browser+Efforts&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fen-US%2Fpress%2Fmozilla-foundation.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-11"><span><b><a href="#cite_ref-11">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mozilla.org/en-US/press/mozilla-foundation.html">"mozilla.org Announces Launch of the Mozilla Foundation to Lead Open-Source Browser Efforts"</a><span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=mozilla.org+Announces+Launch+of+the+Mozilla+Foundation+to+Lead+Open-Source+Browser+Efforts&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fen-US%2Fpress%2Fmozilla-foundation.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-12"><span><b><a href="#cite_ref-12">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Eich, Brendan</a>; <a href="http://fakehost/wiki/Dave_Hyatt" title="Dave Hyatt">David Hyatt</a> (April 2, 2003). <a href="http://www-archive.mozilla.org/roadmap/roadmap-02-Apr-2003.html" rel="nofollow">"mozilla development roadmap"</a>. Mozilla<span>. Retrieved <span>2009-08-02</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=David+Hyatt&amp;rft.aufirst=Brendan&amp;rft.aulast=Eich&amp;rft.btitle=mozilla+development+roadmap&amp;rft.date=2003-04-02&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww-archive.mozilla.org%2Froadmap%2Froadmap-02-Apr-2003.html&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-12"><span><b><a href="#cite_ref-12">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Eich, Brendan</a>; <a href="http://fakehost/wiki/Dave_Hyatt" title="Dave Hyatt">David Hyatt</a> (April 2, 2003). <a rel="nofollow" href="http://www-archive.mozilla.org/roadmap/roadmap-02-Apr-2003.html">"mozilla development roadmap"</a>. Mozilla<span>. Retrieved <span>2009-08-02</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.au=David+Hyatt&amp;rft.aufirst=Brendan&amp;rft.aulast=Eich&amp;rft.btitle=mozilla+development+roadmap&amp;rft.date=2003-04-02&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww-archive.mozilla.org%2Froadmap%2Froadmap-02-Apr-2003.html&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-13"><span><b><a href="#cite_ref-13">^</a></b></span> <span><cite><a href="http://allthingsd.com/20120816/better-browsing-on-your-android-smartphone/" rel="nofollow">"Better Browsing on Your Android Smartphone"</a>. AllThingsD<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Better+Browsing+on+Your+Android+Smartphone&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fallthingsd.com%2F20120816%2Fbetter-browsing-on-your-android-smartphone%2F&amp;rft.pub=AllThingsD&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-13"><span><b><a href="#cite_ref-13">^</a></b></span> <span><cite><a rel="nofollow" href="http://allthingsd.com/20120816/better-browsing-on-your-android-smartphone/">"Better Browsing on Your Android Smartphone"</a>. AllThingsD<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Better+Browsing+on+Your+Android+Smartphone&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fallthingsd.com%2F20120816%2Fbetter-browsing-on-your-android-smartphone%2F&amp;rft.pub=AllThingsD&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-14"><span><b><a href="#cite_ref-14">^</a></b></span> <span><cite><a href="http://www.pcmag.com/article2/0,2817,2407468,00.asp" rel="nofollow">"Mozilla Releases Test Version of Firefox OS"</a>. PC Magazine<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Releases+Test+Version+of+Firefox+OS&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.pcmag.com%2Farticle2%2F0%2C2817%2C2407468%2C00.asp&amp;rft.pub=PC+Magazine&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-14"><span><b><a href="#cite_ref-14">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.pcmag.com/article2/0,2817,2407468,00.asp">"Mozilla Releases Test Version of Firefox OS"</a>. PC Magazine<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Releases+Test+Version+of+Firefox+OS&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.pcmag.com%2Farticle2%2F0%2C2817%2C2407468%2C00.asp&amp;rft.pub=PC+Magazine&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-15"><span><b><a href="#cite_ref-15">^</a></b></span> <span><cite><a href="http://www.engadget.com/2012/06/12/mozilla-marketplace-live-web-apps-like-desktop/" rel="nofollow">"Mozilla Marketplace is live, lets you run web apps like desktop programs"</a>. Engadget<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Marketplace+is+live%2C+lets+you+run+web+apps+like+desktop+programs&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.engadget.com%2F2012%2F06%2F12%2Fmozilla-marketplace-live-web-apps-like-desktop%2F&amp;rft.pub=Engadget&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-15"><span><b><a href="#cite_ref-15">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.engadget.com/2012/06/12/mozilla-marketplace-live-web-apps-like-desktop/">"Mozilla Marketplace is live, lets you run web apps like desktop programs"</a>. Engadget<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Marketplace+is+live%2C+lets+you+run+web+apps+like+desktop+programs&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.engadget.com%2F2012%2F06%2F12%2Fmozilla-marketplace-live-web-apps-like-desktop%2F&amp;rft.pub=Engadget&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-16"><span><b><a href="#cite_ref-16">^</a></b></span> <span><cite>Lardinois, Frederic (November 15, 2012). <a href="http://techcrunch.com/2012/11/15/mozilla-releases-annual-report-for-2011-revenue-up-33-to-163m-majority-from-google/" rel="nofollow">"Mozilla Releases Annual Report For 2011: Revenue Up 33% To $163M, Majority From Google"</a>. <i>techcrunch.com</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+Releases+Annual+Report+For+2011%3A+Revenue+Up+33%25+To+%24163M%2C+Majority+From+Google&amp;rft.aufirst=Frederic&amp;rft.aulast=Lardinois&amp;rft.date=2012-11-15&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Ftechcrunch.com%2F2012%2F11%2F15%2Fmozilla-releases-annual-report-for-2011-revenue-up-33-to-163m-majority-from-google%2F&amp;rft.jtitle=techcrunch.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-16"><span><b><a href="#cite_ref-16">^</a></b></span> <span><cite>Lardinois, Frederic (November 15, 2012). <a rel="nofollow" href="http://techcrunch.com/2012/11/15/mozilla-releases-annual-report-for-2011-revenue-up-33-to-163m-majority-from-google/">"Mozilla Releases Annual Report For 2011: Revenue Up 33% To $163M, Majority From Google"</a>. <i>techcrunch.com</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+Releases+Annual+Report+For+2011%3A+Revenue+Up+33%25+To+%24163M%2C+Majority+From+Google&amp;rft.aufirst=Frederic&amp;rft.aulast=Lardinois&amp;rft.date=2012-11-15&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Ftechcrunch.com%2F2012%2F11%2F15%2Fmozilla-releases-annual-report-for-2011-revenue-up-33-to-163m-majority-from-google%2F&amp;rft.jtitle=techcrunch.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-github-17"><span><b><a href="#cite_ref-github_17-0">^</a></b></span> <span><cite><a href="https://github.com/cisco/openh264" rel="nofollow">"cisco/openh264 · GitHub"</a>. github.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=cisco%2Fopenh264+%B7+GitHub&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fgithub.com%2Fcisco%2Fopenh264&amp;rft.pub=github.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-github-17"><span><b><a href="#cite_ref-github_17-0">^</a></b></span> <span><cite><a rel="nofollow" href="https://github.com/cisco/openh264">"cisco/openh264 · GitHub"</a>. github.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=cisco%2Fopenh264+%B7+GitHub&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fgithub.com%2Fcisco%2Fopenh264&amp;rft.pub=github.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-gigaom-18"><span><b><a href="#cite_ref-gigaom_18-0">^</a></b></span> <span><cite><a href="http://gigaom.com/2013/10/30/mozilla-will-add-h-264-to-firefox-as-cisco-makes-eleventh-hour-push-for-webrtcs-future/" rel="nofollow">"Mozilla will add H.264 to Firefox as Cisco makes eleventh-hour push for WebRTC's future — Tech News and Analysis"</a>. gigaom.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+will+add+H.264+to+Firefox+as+Cisco+makes+eleventh-hour+push+for+WebRTC%99s+future+%26mdash%3B+Tech+News+and+Analysis&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fgigaom.com%2F2013%2F10%2F30%2Fmozilla-will-add-h-264-to-firefox-as-cisco-makes-eleventh-hour-push-for-webrtcs-future%2F&amp;rft.pub=gigaom.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-gigaom-18"><span><b><a href="#cite_ref-gigaom_18-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://gigaom.com/2013/10/30/mozilla-will-add-h-264-to-firefox-as-cisco-makes-eleventh-hour-push-for-webrtcs-future/">"Mozilla will add H.264 to Firefox as Cisco makes eleventh-hour push for WebRTC's future — Tech News and Analysis"</a>. gigaom.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+will+add+H.264+to+Firefox+as+Cisco+makes+eleventh-hour+push+for+WebRTC%99s+future+%26mdash%3B+Tech+News+and+Analysis&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fgigaom.com%2F2013%2F10%2F30%2Fmozilla-will-add-h-264-to-firefox-as-cisco-makes-eleventh-hour-push-for-webrtcs-future%2F&amp;rft.pub=gigaom.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-techrepublic-19"><span><b><a href="#cite_ref-techrepublic_19-0">^</a></b></span> <span><cite><a href="http://www.techrepublic.com/blog/australian-technology/cisco-to-release-open-source-h264-codec-mozilla-makes-tactical-retreat/" rel="nofollow">"Cisco to release open-source H.264 codec, Mozilla makes tactical retreat - TechRepublic"</a>. techrepublic.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Cisco+to+release+open-source+H.264+codec%2C+Mozilla+makes+tactical+retreat+-+TechRepublic&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.techrepublic.com%2Fblog%2Faustralian-technology%2Fcisco-to-release-open-source-h264-codec-mozilla-makes-tactical-retreat%2F&amp;rft.pub=techrepublic.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-techrepublic-19"><span><b><a href="#cite_ref-techrepublic_19-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.techrepublic.com/blog/australian-technology/cisco-to-release-open-source-h264-codec-mozilla-makes-tactical-retreat/">"Cisco to release open-source H.264 codec, Mozilla makes tactical retreat - TechRepublic"</a>. techrepublic.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Cisco+to+release+open-source+H.264+codec%2C+Mozilla+makes+tactical+retreat+-+TechRepublic&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.techrepublic.com%2Fblog%2Faustralian-technology%2Fcisco-to-release-open-source-h264-codec-mozilla-makes-tactical-retreat%2F&amp;rft.pub=techrepublic.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-20"><span><b><a href="#cite_ref-20">^</a></b></span> <span><cite><a href="https://blog.mozilla.org/blog/2013/10/30/video-interoperability-on-the-web-gets-a-boost-from-ciscos-h-264-codec/" rel="nofollow">"Video Interoperability on the Web Gets a Boost From Cisco's H.264 Codec"</a>. <q>Of course, this is not a not a complete solution. In a perfect world, codecs, like other basic Internet technologies such as TCP/IP, HTTP, and HTML, would be fully open and free</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Video+Interoperability+on+the+Web+Gets+a+Boost+From+Cisco%99s+H.264+Codec&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2013%2F10%2F30%2Fvideo-interoperability-on-the-web-gets-a-boost-from-ciscos-h-264-codec%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-20"><span><b><a href="#cite_ref-20">^</a></b></span> <span><cite><a rel="nofollow" href="https://blog.mozilla.org/blog/2013/10/30/video-interoperability-on-the-web-gets-a-boost-from-ciscos-h-264-codec/">"Video Interoperability on the Web Gets a Boost From Cisco's H.264 Codec"</a>. <q>Of course, this is not a not a complete solution. In a perfect world, codecs, like other basic Internet technologies such as TCP/IP, HTTP, and HTML, would be fully open and free</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Video+Interoperability+on+the+Web+Gets+a+Boost+From+Cisco%99s+H.264+Codec&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2013%2F10%2F30%2Fvideo-interoperability-on-the-web-gets-a-boost-from-ciscos-h-264-codec%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-21"><span><b><a href="#cite_ref-21">^</a></b></span> <span><cite><a href="http://xiphmont.livejournal.com/61927.html" rel="nofollow">"Comments on Cisco, Mozilla, and H.264"</a>. <q>By endorsing Cisco's plan, there's no getting around the fact that we've caved on our principles. That said, principles can't replace being in a practical position to make a difference in the future.</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Comments+on+Cisco%2C+Mozilla%2C+and+H.264&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fxiphmont.livejournal.com%2F61927.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> - Christopher Montgomery wrote in a personal capacity but works for Mozilla in their codecs team</span>
+ <li id="cite_note-21"><span><b><a href="#cite_ref-21">^</a></b></span> <span><cite><a rel="nofollow" href="http://xiphmont.livejournal.com/61927.html">"Comments on Cisco, Mozilla, and H.264"</a>. <q>By endorsing Cisco's plan, there's no getting around the fact that we've caved on our principles. That said, principles can't replace being in a practical position to make a difference in the future.</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Comments+on+Cisco%2C+Mozilla%2C+and+H.264&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fxiphmont.livejournal.com%2F61927.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> - Christopher Montgomery wrote in a personal capacity but works for Mozilla in their codecs team</span>
</li>
- <li id="cite_note-22"><span><b><a href="#cite_ref-22">^</a></b></span> <span><cite><a href="https://wiki.mozilla.org/Game_Creator_Challenge_-Contest_Terms_and_Conditions" rel="nofollow">"Game Creator Challenge -Contest Terms and Conditions"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Game+Creator+Challenge+-Contest+Terms+and+Conditions&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FGame_Creator_Challenge_-Contest_Terms_and_Conditions&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> - submissions to the "amateur" category have to be released as free software, but not for the other two categories</span>
+ <li id="cite_note-22"><span><b><a href="#cite_ref-22">^</a></b></span> <span><cite><a rel="nofollow" href="https://wiki.mozilla.org/Game_Creator_Challenge_-Contest_Terms_and_Conditions">"Game Creator Challenge -Contest Terms and Conditions"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Game+Creator+Challenge+-Contest+Terms+and+Conditions&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FGame_Creator_Challenge_-Contest_Terms_and_Conditions&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span> - submissions to the "amateur" category have to be released as free software, but not for the other two categories</span>
</li>
- <li id="cite_note-23"><span><b><a href="#cite_ref-23">^</a></b></span> <span><cite><a href="http://projects.latimes.com/prop8/donation/8930/" rel="nofollow">"Los Angeles Times - Brendan Eich contribution to Proposition 8"</a>. latimes.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Los+Angeles+Times+-+Brendan+Eich+contribution+to+Proposition+8&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fprojects.latimes.com%2Fprop8%2Fdonation%2F8930%2F&amp;rft.pub=latimes.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-23"><span><b><a href="#cite_ref-23">^</a></b></span> <span><cite><a rel="nofollow" href="http://projects.latimes.com/prop8/donation/8930/">"Los Angeles Times - Brendan Eich contribution to Proposition 8"</a>. latimes.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Los+Angeles+Times+-+Brendan+Eich+contribution+to+Proposition+8&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fprojects.latimes.com%2Fprop8%2Fdonation%2F8930%2F&amp;rft.pub=latimes.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-arstechnica-24"><span><b><a href="#cite_ref-arstechnica_24-0">^</a></b></span> <span><cite><a href="http://arstechnica.com/business/2014/03/gay-firefox-developers-boycott-mozilla-to-protest-ceo-hire/" rel="nofollow">"Gay Firefox developers boycott Mozilla to protest CEO hire [Updated] | Ars Technica"</a>. arstechnica.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Gay+Firefox+developers+boycott+Mozilla+to+protest+CEO+hire+%26%2391%3BUpdated%26%2393%3B+%26%23124%3B+Ars+Technica&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Farstechnica.com%2Fbusiness%2F2014%2F03%2Fgay-firefox-developers-boycott-mozilla-to-protest-ceo-hire%2F&amp;rft.pub=arstechnica.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-arstechnica-24"><span><b><a href="#cite_ref-arstechnica_24-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://arstechnica.com/business/2014/03/gay-firefox-developers-boycott-mozilla-to-protest-ceo-hire/">"Gay Firefox developers boycott Mozilla to protest CEO hire [Updated] | Ars Technica"</a>. arstechnica.com<span>. Retrieved <span>2014-04-05</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Gay+Firefox+developers+boycott+Mozilla+to+protest+CEO+hire+%26%2391%3BUpdated%26%2393%3B+%26%23124%3B+Ars+Technica&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Farstechnica.com%2Fbusiness%2F2014%2F03%2Fgay-firefox-developers-boycott-mozilla-to-protest-ceo-hire%2F&amp;rft.pub=arstechnica.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-25"><span><b><a href="#cite_ref-25">^</a></b></span> <span><cite>Kelly Faircloth (9 April 2012). <a href="http://betabeat.com/2012/04/tech-celeb-makes-prop-8-donation-internet-goes-berserk/" rel="nofollow">"Tech Celeb Makes Prop-8 Donation; Internet Goes Berserk"</a>. <i>BetaBeat</i>. BetaBeat<span>. Retrieved <span>2014-04-28</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Tech+Celeb+Makes+Prop-8+Donation%3B+Internet+Goes+Berserk&amp;rft.au=Kelly+Faircloth&amp;rft.date=2012-04-09&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fbetabeat.com%2F2012%2F04%2Ftech-celeb-makes-prop-8-donation-internet-goes-berserk%2F&amp;rft.jtitle=BetaBeat&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-25"><span><b><a href="#cite_ref-25">^</a></b></span> <span><cite>Kelly Faircloth (9 April 2012). <a rel="nofollow" href="http://betabeat.com/2012/04/tech-celeb-makes-prop-8-donation-internet-goes-berserk/">"Tech Celeb Makes Prop-8 Donation; Internet Goes Berserk"</a>. <i>BetaBeat</i>. BetaBeat<span>. Retrieved <span>2014-04-28</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Tech+Celeb+Makes+Prop-8+Donation%3B+Internet+Goes+Berserk&amp;rft.au=Kelly+Faircloth&amp;rft.date=2012-04-09&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fbetabeat.com%2F2012%2F04%2Ftech-celeb-makes-prop-8-donation-internet-goes-berserk%2F&amp;rft.jtitle=BetaBeat&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-26"><span><b><a href="#cite_ref-26">^</a></b></span> <span><cite><a href="http://i.huffpost.com/gen/1710681/thumbs/o-OKC-900.jpg" rel="nofollow">"Screenshot of OkCupid's statement towards Firefox users"</a>. huffingtonpost.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Screenshot+of+OkCupid%27s+statement+towards+Firefox+users&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fi.huffpost.com%2Fgen%2F1710681%2Fthumbs%2Fo-OKC-900.jpg&amp;rft.pub=huffingtonpost.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-26"><span><b><a href="#cite_ref-26">^</a></b></span> <span><cite><a rel="nofollow" href="http://i.huffpost.com/gen/1710681/thumbs/o-OKC-900.jpg">"Screenshot of OkCupid's statement towards Firefox users"</a>. huffingtonpost.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Screenshot+of+OkCupid%27s+statement+towards+Firefox+users&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fi.huffpost.com%2Fgen%2F1710681%2Fthumbs%2Fo-OKC-900.jpg&amp;rft.pub=huffingtonpost.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-27"><span><b><a href="#cite_ref-27">^</a></b></span> <span><cite><a href="https://blog.mozilla.org/blog/2014/04/05/faq-on-ceo-resignation/" rel="nofollow">"FAQ on CEO Resignation"</a>. <i>The Mozilla Blog</i><span>. Retrieved <span>2015-04-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=FAQ+on+CEO+Resignation&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2014%2F04%2F05%2Ffaq-on-ceo-resignation%2F&amp;rft.jtitle=The+Mozilla+Blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-27"><span><b><a href="#cite_ref-27">^</a></b></span> <span><cite><a rel="nofollow" href="https://blog.mozilla.org/blog/2014/04/05/faq-on-ceo-resignation/">"FAQ on CEO Resignation"</a>. <i>The Mozilla Blog</i><span>. Retrieved <span>2015-04-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=FAQ+on+CEO+Resignation&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2014%2F04%2F05%2Ffaq-on-ceo-resignation%2F&amp;rft.jtitle=The+Mozilla+Blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-28"><span><b><a href="#cite_ref-28">^</a></b></span> <span><cite>Baker, Mitchell (3 April 2014). <a href="https://blog.mozilla.org/blog/2014/04/03/brendan-eich-steps-down-as-mozilla-ceo/" rel="nofollow">"Brendan Eich Steps Down as Mozilla CEO"</a>. <i>mozilla blog</i>. Mozilla<span>. Retrieved <span>2014-04-04</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Brendan+Eich+Steps+Down+as+Mozilla+CEO&amp;rft.aufirst=Mitchell&amp;rft.aulast=Baker&amp;rft.date=2014-04-03&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2014%2F04%2F03%2Fbrendan-eich-steps-down-as-mozilla-ceo%2F&amp;rft.jtitle=mozilla+blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-28"><span><b><a href="#cite_ref-28">^</a></b></span> <span><cite>Baker, Mitchell (3 April 2014). <a rel="nofollow" href="https://blog.mozilla.org/blog/2014/04/03/brendan-eich-steps-down-as-mozilla-ceo/">"Brendan Eich Steps Down as Mozilla CEO"</a>. <i>mozilla blog</i>. Mozilla<span>. Retrieved <span>2014-04-04</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Brendan+Eich+Steps+Down+as+Mozilla+CEO&amp;rft.aufirst=Mitchell&amp;rft.aulast=Baker&amp;rft.date=2014-04-03&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fblog%2F2014%2F04%2F03%2Fbrendan-eich-steps-down-as-mozilla-ceo%2F&amp;rft.jtitle=mozilla+blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-29"><span><b><a href="#cite_ref-29">^</a></b></span> <span><cite><a href="http://www.opensecrets.org/indivs/search.php?name=Sam+Yagan&amp;cycle=All&amp;sort=R&amp;state=&amp;zip=&amp;employ=&amp;cand=&amp;submit=Submit+Query" rel="nofollow">"opensecrets.org listing of Sam Yagan's contributions to political candidates"</a>. opensecrets.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=opensecrets.org+listing+of+Sam+Yagan%27s+contributions+to+political+candidates&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.opensecrets.org%2Findivs%2Fsearch.php%3Fname%3DSam%2BYagan%26cycle%3DAll%26sort%3DR%26state%3D%26zip%3D%26employ%3D%26cand%3D%26submit%3DSubmit%2BQuery&amp;rft.pub=opensecrets.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-29"><span><b><a href="#cite_ref-29">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.opensecrets.org/indivs/search.php?name=Sam+Yagan&amp;cycle=All&amp;sort=R&amp;state=&amp;zip=&amp;employ=&amp;cand=&amp;submit=Submit+Query">"opensecrets.org listing of Sam Yagan's contributions to political candidates"</a>. opensecrets.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=opensecrets.org+listing+of+Sam+Yagan%27s+contributions+to+political+candidates&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.opensecrets.org%2Findivs%2Fsearch.php%3Fname%3DSam%2BYagan%26cycle%3DAll%26sort%3DR%26state%3D%26zip%3D%26employ%3D%26cand%3D%26submit%3DSubmit%2BQuery&amp;rft.pub=opensecrets.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-30"><span><b><a href="#cite_ref-30">^</a></b></span> <span><cite><a href="http://www.ontheissues.org/house/Chris_Cannon.htm#Civil_Rights" rel="nofollow">"ontheissues.org listing of votes cast by Chris Cannon"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org+listing+of+votes+cast+by+Chris+Cannon&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon.htm%23Civil_Rights&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-30"><span><b><a href="#cite_ref-30">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.ontheissues.org/house/Chris_Cannon.htm#Civil_Rights">"ontheissues.org listing of votes cast by Chris Cannon"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org+listing+of+votes+cast+by+Chris+Cannon&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon.htm%23Civil_Rights&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-31"><span><b><a href="#cite_ref-31">^</a></b></span> <span><cite><a href="http://www.ontheissues.org/HouseVote/Party_2005-627.htm" rel="nofollow">"ontheissues.org listing of votes cast on the permanency of the Patriot Act"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org+listing+of+votes+cast+on+the+permanency+of+the+Patriot+Act&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2FHouseVote%2FParty_2005-627.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-31"><span><b><a href="#cite_ref-31">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.ontheissues.org/HouseVote/Party_2005-627.htm">"ontheissues.org listing of votes cast on the permanency of the Patriot Act"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org+listing+of+votes+cast+on+the+permanency+of+the+Patriot+Act&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2FHouseVote%2FParty_2005-627.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-32"><span><b><a href="#cite_ref-32">^</a></b></span> <span><cite><a href="http://www.ontheissues.org/house/Chris_Cannon_Homeland_Security.htm" rel="nofollow">"ontheissues.org: Chris Cannon on Homeland Security"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org%3A+Chris+Cannon+on+Homeland+Security&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon_Homeland_Security.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-32"><span><b><a href="#cite_ref-32">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.ontheissues.org/house/Chris_Cannon_Homeland_Security.htm">"ontheissues.org: Chris Cannon on Homeland Security"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org%3A+Chris+Cannon+on+Homeland+Security&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon_Homeland_Security.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-33"><span><b><a href="#cite_ref-33">^</a></b></span> <span><cite><a href="http://www.ontheissues.org/house/Chris_Cannon_Abortion.htm" rel="nofollow">"ontheissues.org: Chris Cannon on Abortion"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org%3A+Chris+Cannon+on+Abortion&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon_Abortion.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-33"><span><b><a href="#cite_ref-33">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.ontheissues.org/house/Chris_Cannon_Abortion.htm">"ontheissues.org: Chris Cannon on Abortion"</a>. ontheissues.org<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=ontheissues.org%3A+Chris+Cannon+on+Abortion&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ontheissues.org%2Fhouse%2FChris_Cannon_Abortion.htm&amp;rft.pub=ontheissues.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-34"><span><b><a href="#cite_ref-34">^</a></b></span> <span><cite>Levintova, Hannah (7 April 2014). <a href="http://www.motherjones.com/mojo/2014/04/okcupid-ceo-donate-anti-gay-firefox" rel="nofollow">"OkCupid's CEO Donated to an Anti-Gay Campaign Once, Too"</a>. <i>Hanna Levintova article on motherjones.com</i>. motherjones.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OkCupid%27s+CEO+Donated+to+an+Anti-Gay+Campaign+Once%2C+Too&amp;rft.aufirst=Hannah&amp;rft.aulast=Levintova&amp;rft.date=2014-04-07&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.motherjones.com%2Fmojo%2F2014%2F04%2Fokcupid-ceo-donate-anti-gay-firefox&amp;rft.jtitle=Hanna+Levintova+article+on+motherjones.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-34"><span><b><a href="#cite_ref-34">^</a></b></span> <span><cite>Levintova, Hannah (7 April 2014). <a rel="nofollow" href="http://www.motherjones.com/mojo/2014/04/okcupid-ceo-donate-anti-gay-firefox">"OkCupid's CEO Donated to an Anti-Gay Campaign Once, Too"</a>. <i>Hanna Levintova article on motherjones.com</i>. motherjones.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OkCupid%27s+CEO+Donated+to+an+Anti-Gay+Campaign+Once%2C+Too&amp;rft.aufirst=Hannah&amp;rft.aulast=Levintova&amp;rft.date=2014-04-07&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.motherjones.com%2Fmojo%2F2014%2F04%2Fokcupid-ceo-donate-anti-gay-firefox&amp;rft.jtitle=Hanna+Levintova+article+on+motherjones.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-35"><span><b><a href="#cite_ref-35">^</a></b></span> <span><cite>Lee, Stephanie M. (8 April 2014). <a href="http://blog.sfgate.com/techchron/2014/04/08/okcupid-ceo-once-donated-to-anti-gay-politician/" rel="nofollow">"OKCupid CEO once donated to anti-gay politician"</a>. <i>Stephanie M. Lee's blog on sfgate.com</i>. sfgate.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OKCupid+CEO+once+donated+to+anti-gay+politician&amp;rft.aufirst=Stephanie+M.&amp;rft.aulast=Lee&amp;rft.date=2014-04-08&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fblog.sfgate.com%2Ftechchron%2F2014%2F04%2F08%2Fokcupid-ceo-once-donated-to-anti-gay-politician%2F&amp;rft.jtitle=Stephanie+M.+Lee%27s+blog+on+sfgate.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-35"><span><b><a href="#cite_ref-35">^</a></b></span> <span><cite>Lee, Stephanie M. (8 April 2014). <a rel="nofollow" href="http://blog.sfgate.com/techchron/2014/04/08/okcupid-ceo-once-donated-to-anti-gay-politician/">"OKCupid CEO once donated to anti-gay politician"</a>. <i>Stephanie M. Lee's blog on sfgate.com</i>. sfgate.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OKCupid+CEO+once+donated+to+anti-gay+politician&amp;rft.aufirst=Stephanie+M.&amp;rft.aulast=Lee&amp;rft.date=2014-04-08&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fblog.sfgate.com%2Ftechchron%2F2014%2F04%2F08%2Fokcupid-ceo-once-donated-to-anti-gay-politician%2F&amp;rft.jtitle=Stephanie+M.+Lee%27s+blog+on+sfgate.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-uncrunched.com-36"><span>^ <a href="#cite_ref-uncrunched.com_36-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-uncrunched.com_36-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://uncrunched.com/2014/04/06/the-hypocrisy-of-sam-yagan-okcupid/" rel="nofollow">"The Hypocrisy Of Sam Yagan &amp; OkCupid"</a>. <i>uncrunched.com blog</i>. uncrunched.com. 6 April 2014<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=The+Hypocrisy+Of+Sam+Yagan+%26+OkCupid&amp;rft.date=2014-04-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Funcrunched.com%2F2014%2F04%2F06%2Fthe-hypocrisy-of-sam-yagan-okcupid%2F&amp;rft.jtitle=uncrunched.com+blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-uncrunched.com-36"><span>^ <a href="#cite_ref-uncrunched.com_36-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-uncrunched.com_36-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://uncrunched.com/2014/04/06/the-hypocrisy-of-sam-yagan-okcupid/">"The Hypocrisy Of Sam Yagan &amp; OkCupid"</a>. <i>uncrunched.com blog</i>. uncrunched.com. 6 April 2014<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=The+Hypocrisy+Of+Sam+Yagan+%26+OkCupid&amp;rft.date=2014-04-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Funcrunched.com%2F2014%2F04%2F06%2Fthe-hypocrisy-of-sam-yagan-okcupid%2F&amp;rft.jtitle=uncrunched.com+blog&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-37"><span><b><a href="#cite_ref-37">^</a></b></span> <span><cite>Bellware, Kim (31 March 2014). <a href="http://www.huffingtonpost.com/2014/03/31/okcupid-mozilla_n_5065743.html" rel="nofollow">"OKCupid Publicly Rips Mozilla: 'We Wish Them Nothing But Failure<span>'</span>"</a>. <i>Kim Bellware article on huffingtonpost.com</i>. huffingtonpost.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OKCupid+Publicly+Rips+Mozilla%3A+%27We+Wish+Them+Nothing+But+Failure%27&amp;rft.aufirst=Kim&amp;rft.aulast=Bellware&amp;rft.date=2014-03-31&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.huffingtonpost.com%2F2014%2F03%2F31%2Fokcupid-mozilla_n_5065743.html&amp;rft.jtitle=Kim+Bellware+article+on+huffingtonpost.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-37"><span><b><a href="#cite_ref-37">^</a></b></span> <span><cite>Bellware, Kim (31 March 2014). <a rel="nofollow" href="http://www.huffingtonpost.com/2014/03/31/okcupid-mozilla_n_5065743.html">"OKCupid Publicly Rips Mozilla: 'We Wish Them Nothing But Failure<span>'</span>"</a>. <i>Kim Bellware article on huffingtonpost.com</i>. huffingtonpost.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OKCupid+Publicly+Rips+Mozilla%3A+%27We+Wish+Them+Nothing+But+Failure%27&amp;rft.aufirst=Kim&amp;rft.aulast=Bellware&amp;rft.date=2014-03-31&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.huffingtonpost.com%2F2014%2F03%2F31%2Fokcupid-mozilla_n_5065743.html&amp;rft.jtitle=Kim+Bellware+article+on+huffingtonpost.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-38"><span><b><a href="#cite_ref-38">^</a></b></span> <span><cite><a href="http://www.huffingtonpost.com/2014/03/27/mozilla-ceo-prop-8-_n_5042660.html" rel="nofollow">"Mozilla's Appointment Of Brendan Eich As CEO Sparks Controversy After Prop 8 Donation News Re-Emerges"</a>. <i>huffingtonpost.com article</i>. huffingtonpost.com. 27 March 2014<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla%27s+Appointment+Of+Brendan+Eich+As+CEO+Sparks+Controversy+After+Prop+8+Donation+News+Re-Emerges&amp;rft.date=2014-03-27&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.huffingtonpost.com%2F2014%2F03%2F27%2Fmozilla-ceo-prop-8-_n_5042660.html&amp;rft.jtitle=huffingtonpost.com+article&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-38"><span><b><a href="#cite_ref-38">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.huffingtonpost.com/2014/03/27/mozilla-ceo-prop-8-_n_5042660.html">"Mozilla's Appointment Of Brendan Eich As CEO Sparks Controversy After Prop 8 Donation News Re-Emerges"</a>. <i>huffingtonpost.com article</i>. huffingtonpost.com. 27 March 2014<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla%27s+Appointment+Of+Brendan+Eich+As+CEO+Sparks+Controversy+After+Prop+8+Donation+News+Re-Emerges&amp;rft.date=2014-03-27&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.huffingtonpost.com%2F2014%2F03%2F27%2Fmozilla-ceo-prop-8-_n_5042660.html&amp;rft.jtitle=huffingtonpost.com+article&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-39"><span><b><a href="#cite_ref-39">^</a></b></span> <span><cite>Eidelson, Josh (4 April 2014). <a href="http://www.salon.com/2014/04/04/okcupids_gay_rights_stunt_has_its_limits_taking_a_deeper_look_at_the_savvy_ploy/" rel="nofollow">"OkCupid's gay rights stunt has its limits: Taking a deeper look at the savvy ploy"</a>. <i>Josh Eidelson article on salon.com</i>. salon.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OkCupid%99s+gay+rights+stunt+has+its+limits%3A+Taking+a+deeper+look+at+the+savvy+ploy&amp;rft.aufirst=Josh&amp;rft.aulast=Eidelson&amp;rft.date=2014-04-04&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.salon.com%2F2014%2F04%2F04%2Fokcupids_gay_rights_stunt_has_its_limits_taking_a_deeper_look_at_the_savvy_ploy%2F&amp;rft.jtitle=Josh+Eidelson+article+on+salon.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-39"><span><b><a href="#cite_ref-39">^</a></b></span> <span><cite>Eidelson, Josh (4 April 2014). <a rel="nofollow" href="http://www.salon.com/2014/04/04/okcupids_gay_rights_stunt_has_its_limits_taking_a_deeper_look_at_the_savvy_ploy/">"OkCupid's gay rights stunt has its limits: Taking a deeper look at the savvy ploy"</a>. <i>Josh Eidelson article on salon.com</i>. salon.com<span>. Retrieved <span>2014-07-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=OkCupid%99s+gay+rights+stunt+has+its+limits%3A+Taking+a+deeper+look+at+the+savvy+ploy&amp;rft.aufirst=Josh&amp;rft.aulast=Eidelson&amp;rft.date=2014-04-04&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.salon.com%2F2014%2F04%2F04%2Fokcupids_gay_rights_stunt_has_its_limits_taking_a_deeper_look_at_the_savvy_ploy%2F&amp;rft.jtitle=Josh+Eidelson+article+on+salon.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-manifesto-40"><span>^ <a href="#cite_ref-manifesto_40-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-manifesto_40-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://www.mozilla.org/about/manifesto/" rel="nofollow">"Mozilla Manifesto"</a>. Mozilla.org<span>. Retrieved <span>2012-03-21</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Manifesto&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fabout%2Fmanifesto%2F&amp;rft.pub=Mozilla.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-manifesto-40"><span>^ <a href="#cite_ref-manifesto_40-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-manifesto_40-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a rel="nofollow" href="http://www.mozilla.org/about/manifesto/">"Mozilla Manifesto"</a>. Mozilla.org<span>. Retrieved <span>2012-03-21</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+Manifesto&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fabout%2Fmanifesto%2F&amp;rft.pub=Mozilla.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-41"><span><b><a href="#cite_ref-41">^</a></b></span> <span><cite><a href="https://www.mozilla.org/en-US/about/manifesto/details/" rel="nofollow">"The Mozilla Manifesto"</a><span>. Retrieved <span>24 July</span> 2015</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=The+Mozilla+Manifesto&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Fen-US%2Fabout%2Fmanifesto%2Fdetails%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-41"><span><b><a href="#cite_ref-41">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.mozilla.org/en-US/about/manifesto/details/">"The Mozilla Manifesto"</a><span>. Retrieved <span>24 July</span> 2015</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=The+Mozilla+Manifesto&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Fen-US%2Fabout%2Fmanifesto%2Fdetails%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-42"><span><b><a href="#cite_ref-42">^</a></b></span> <span><cite><a href="https://web.archive.org/web/20101128150117/http://download-firefox.org/spread-firefox/gecko-layout-engine-and-mozilla-firefox/" rel="nofollow">"Gecko Layout Engine"</a>. download-firefox.org. July 17, 2008. Archived from <a href="http://download-firefox.org/spread-firefox/gecko-layout-engine-and-mozilla-firefox/" rel="nofollow">the original</a> on 2010-11-28<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Gecko+Layout+Engine&amp;rft.date=2008-07-17&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fdownload-firefox.org%2Fspread-firefox%2Fgecko-layout-engine-and-mozilla-firefox%2F&amp;rft.pub=download-firefox.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-42"><span><b><a href="#cite_ref-42">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20101128150117/http://download-firefox.org/spread-firefox/gecko-layout-engine-and-mozilla-firefox/">"Gecko Layout Engine"</a>. download-firefox.org. July 17, 2008. Archived from <a rel="nofollow" href="http://download-firefox.org/spread-firefox/gecko-layout-engine-and-mozilla-firefox/">the original</a> on 2010-11-28<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Gecko+Layout+Engine&amp;rft.date=2008-07-17&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fdownload-firefox.org%2Fspread-firefox%2Fgecko-layout-engine-and-mozilla-firefox%2F&amp;rft.pub=download-firefox.org&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-w3counter1-43"><span><b><a href="#cite_ref-w3counter1_43-0">^</a></b></span> <span><cite><a href="http://www.w3counter.com/trends" rel="nofollow">"Web Browser Market Share Trends"</a>. <i>W3Counter</i>. Awio Web Services LLC<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Web+Browser+Market+Share+Trends&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.w3counter.com%2Ftrends&amp;rft.jtitle=W3Counter&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-w3counter1-43"><span><b><a href="#cite_ref-w3counter1_43-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.w3counter.com/trends">"Web Browser Market Share Trends"</a>. <i>W3Counter</i>. Awio Web Services LLC<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Web+Browser+Market+Share+Trends&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.w3counter.com%2Ftrends&amp;rft.jtitle=W3Counter&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-gs.statcounter.com-44"><span><b><a href="#cite_ref-gs.statcounter.com_44-0">^</a></b></span> <span><cite><a href="http://gs.statcounter.com" rel="nofollow">"Top 5 Browsers"</a>. <i>StatCounter Global Stats</i>. StatCounter<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Top+5+Browsers&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fgs.statcounter.com&amp;rft.jtitle=StatCounter+Global+Stats&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-gs.statcounter.com-44"><span><b><a href="#cite_ref-gs.statcounter.com_44-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://gs.statcounter.com">"Top 5 Browsers"</a>. <i>StatCounter Global Stats</i>. StatCounter<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Top+5+Browsers&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fgs.statcounter.com&amp;rft.jtitle=StatCounter+Global+Stats&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-getclicky1-45"><span><b><a href="#cite_ref-getclicky1_45-0">^</a></b></span> <span><cite><a href="http://www.getclicky.com/marketshare/global/web-browsers/" rel="nofollow">"Web browsers (Global marketshare)"</a>. <i>Clicky</i>. Roxr Software Ltd<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Web+browsers+%28Global+marketshare%29&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.getclicky.com%2Fmarketshare%2Fglobal%2Fweb-browsers%2F&amp;rft.jtitle=Clicky&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-getclicky1-45"><span><b><a href="#cite_ref-getclicky1_45-0">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.getclicky.com/marketshare/global/web-browsers/">"Web browsers (Global marketshare)"</a>. <i>Clicky</i>. Roxr Software Ltd<span>. Retrieved <span>2012-05-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Web+browsers+%28Global+marketshare%29&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.getclicky.com%2Fmarketshare%2Fglobal%2Fweb-browsers%2F&amp;rft.jtitle=Clicky&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-46"><span><b><a href="#cite_ref-46">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Ben_Goodger" title="Ben Goodger">Goodger, Ben</a> (February 6, 2006). <a href="https://web.archive.org/web/20110623034401/http://weblogs.mozillazine.org/ben/archives/009698.html" rel="nofollow">"Where Did Firefox Come From?"</a>. Inside Firefox. Archived from <a href="http://weblogs.mozillazine.org/ben/archives/009698.html" rel="nofollow">the original</a> on 2011-06-23<span>. Retrieved <span>2012-01-07</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Ben&amp;rft.aulast=Goodger&amp;rft.btitle=Where+Did+Firefox+Come+From%3F&amp;rft.date=2006-02-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fweblogs.mozillazine.org%2Fben%2Farchives%2F009698.html&amp;rft.pub=Inside+Firefox&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-46"><span><b><a href="#cite_ref-46">^</a></b></span> <span><cite><a href="http://fakehost/wiki/Ben_Goodger" title="Ben Goodger">Goodger, Ben</a> (February 6, 2006). <a rel="nofollow" href="https://web.archive.org/web/20110623034401/http://weblogs.mozillazine.org/ben/archives/009698.html">"Where Did Firefox Come From?"</a>. Inside Firefox. Archived from <a rel="nofollow" href="http://weblogs.mozillazine.org/ben/archives/009698.html">the original</a> on 2011-06-23<span>. Retrieved <span>2012-01-07</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Ben&amp;rft.aulast=Goodger&amp;rft.btitle=Where+Did+Firefox+Come+From%3F&amp;rft.date=2006-02-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fweblogs.mozillazine.org%2Fben%2Farchives%2F009698.html&amp;rft.pub=Inside+Firefox&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-47"><span><b><a href="#cite_ref-47">^</a></b></span> <span><cite><a href="https://web.archive.org/web/20070914035447/http://www.ibphoenix.com/main.nfs?a=ibphoenix&amp;page=ibp_Mozilla0" rel="nofollow">"Mozilla browser becomes Firebird"</a>. IBPhoenix. Archived from <a href="http://www.ibphoenix.com/main.nfs?a=ibphoenix&amp;page=ibp_Mozilla0" rel="nofollow">the original</a> on 2007-09-14<span>. Retrieved <span>2013-06-10</span></span>. <q>We at IBPhoenix think that having a browser and a database with the same name in the same space will confuse the market, especially as browsers and databases are often used in the same applications</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+browser+becomes+Firebird&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ibphoenix.com%2Fmain.nfs%3Fa%3Dibphoenix%26page%3Dibp_Mozilla0&amp;rft.pub=IBPhoenix&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-47"><span><b><a href="#cite_ref-47">^</a></b></span> <span><cite><a rel="nofollow" href="https://web.archive.org/web/20070914035447/http://www.ibphoenix.com/main.nfs?a=ibphoenix&amp;page=ibp_Mozilla0">"Mozilla browser becomes Firebird"</a>. IBPhoenix. Archived from <a rel="nofollow" href="http://www.ibphoenix.com/main.nfs?a=ibphoenix&amp;page=ibp_Mozilla0">the original</a> on 2007-09-14<span>. Retrieved <span>2013-06-10</span></span>. <q>We at IBPhoenix think that having a browser and a database with the same name in the same space will confuse the market, especially as browsers and databases are often used in the same applications</q></cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+browser+becomes+Firebird&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.ibphoenix.com%2Fmain.nfs%3Fa%3Dibphoenix%26page%3Dibp_Mozilla0&amp;rft.pub=IBPhoenix&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-48"><span><b><a href="#cite_ref-48">^</a></b></span> <span><cite>Festa, Paul (May 6, 2003). <a href="http://news.cnet.com/2100-1032_3-1000146.html" rel="nofollow">"Mozilla's Firebird gets wings clipped"</a>. <a href="http://fakehost/wiki/CNET_Networks" title="CNET Networks">CNET</a><span>. Retrieved <span>2007-01-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Paul&amp;rft.aulast=Festa&amp;rft.btitle=Mozilla%27s+Firebird+gets+wings+clipped&amp;rft.date=2003-05-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fnews.cnet.com%2F2100-1032_3-1000146.html&amp;rft.pub=CNET&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-48"><span><b><a href="#cite_ref-48">^</a></b></span> <span><cite>Festa, Paul (May 6, 2003). <a rel="nofollow" href="http://news.cnet.com/2100-1032_3-1000146.html">"Mozilla's Firebird gets wings clipped"</a>. <a href="http://fakehost/wiki/CNET_Networks" title="CNET Networks">CNET</a><span>. Retrieved <span>2007-01-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Paul&amp;rft.aulast=Festa&amp;rft.btitle=Mozilla%27s+Firebird+gets+wings+clipped&amp;rft.date=2003-05-06&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fnews.cnet.com%2F2100-1032_3-1000146.html&amp;rft.pub=CNET&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-49"><span><b><a href="#cite_ref-49">^</a></b></span> <span><cite>Festa, Paul (February 9, 2004). <a href="http://news.cnet.com/2100-7344-5156101.html" rel="nofollow">"Mozilla holds 'fire' in naming fight"</a>. CNET News<span>. Retrieved <span>2007-01-24</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Paul&amp;rft.aulast=Festa&amp;rft.btitle=Mozilla+holds+%27fire%27+in+naming+fight&amp;rft.date=2004-02-09&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fnews.cnet.com%2F2100-7344-5156101.html&amp;rft.pub=CNET+News&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-49"><span><b><a href="#cite_ref-49">^</a></b></span> <span><cite>Festa, Paul (February 9, 2004). <a rel="nofollow" href="http://news.cnet.com/2100-7344-5156101.html">"Mozilla holds 'fire' in naming fight"</a>. CNET News<span>. Retrieved <span>2007-01-24</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Paul&amp;rft.aulast=Festa&amp;rft.btitle=Mozilla+holds+%27fire%27+in+naming+fight&amp;rft.date=2004-02-09&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fnews.cnet.com%2F2100-7344-5156101.html&amp;rft.pub=CNET+News&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-50"><span><b><a href="#cite_ref-50">^</a></b></span> <span><cite><a href="http://www.mozilla.org/en-US/firefox/mobile/features/" rel="nofollow">"Mobile features"</a>. Mozilla<span>. Retrieved <span>2012-06-26</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mobile+features&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fen-US%2Ffirefox%2Fmobile%2Ffeatures%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-50"><span><b><a href="#cite_ref-50">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mozilla.org/en-US/firefox/mobile/features/">"Mobile features"</a>. Mozilla<span>. Retrieved <span>2012-06-26</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mobile+features&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Fen-US%2Ffirefox%2Fmobile%2Ffeatures%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-51"><span><b><a href="#cite_ref-51">^</a></b></span> <span><cite><a href="https://wiki.mozilla.org/Mobile/Platforms/Android#System_Requirements" rel="nofollow">"Mobile System Requirements"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mobile+System+Requirements&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FMobile%2FPlatforms%2FAndroid%23System_Requirements&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-51"><span><b><a href="#cite_ref-51">^</a></b></span> <span><cite><a rel="nofollow" href="https://wiki.mozilla.org/Mobile/Platforms/Android#System_Requirements">"Mobile System Requirements"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mobile+System+Requirements&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FMobile%2FPlatforms%2FAndroid%23System_Requirements&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-52"><span><b><a href="#cite_ref-52">^</a></b></span> <span><cite><a href="https://support.mozilla.org/en-US/kb/will-firefox-work-my-mobile-device" rel="nofollow">"Firefox Mobile supported devices"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Firefox+Mobile+supported+devices&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fsupport.mozilla.org%2Fen-US%2Fkb%2Fwill-firefox-work-my-mobile-device&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-52"><span><b><a href="#cite_ref-52">^</a></b></span> <span><cite><a rel="nofollow" href="https://support.mozilla.org/en-US/kb/will-firefox-work-my-mobile-device">"Firefox Mobile supported devices"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Firefox+Mobile+supported+devices&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fsupport.mozilla.org%2Fen-US%2Fkb%2Fwill-firefox-work-my-mobile-device&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-53"><span><b><a href="#cite_ref-53">^</a></b></span> <span><cite><a href="http://www.mirror.co.uk/news/technology/2009/11/09/mozilla-rules-out-firefox-for-iphone-and-blackberry-115875-21809563/" rel="nofollow">"Mozilla rules out Firefox for iPhone and BlackBerry"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+rules+out+Firefox+for+iPhone+and+BlackBerry&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mirror.co.uk%2Fnews%2Ftechnology%2F2009%2F11%2F09%2Fmozilla-rules-out-firefox-for-iphone-and-blackberry-115875-21809563%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-53"><span><b><a href="#cite_ref-53">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mirror.co.uk/news/technology/2009/11/09/mozilla-rules-out-firefox-for-iphone-and-blackberry-115875-21809563/">"Mozilla rules out Firefox for iPhone and BlackBerry"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Mozilla+rules+out+Firefox+for+iPhone+and+BlackBerry&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mirror.co.uk%2Fnews%2Ftechnology%2F2009%2F11%2F09%2Fmozilla-rules-out-firefox-for-iphone-and-blackberry-115875-21809563%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-54"><span><b><a href="#cite_ref-54">^</a></b></span> <span><cite><a href="http://www.mozilla.org/firefox/os/" rel="nofollow">"Boot to Gecko Project"</a>. Mozilla. March 2012<span>. Retrieved <span>2012-03-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Boot+to+Gecko+Project&amp;rft.date=2012-03&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Ffirefox%2Fos%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-54"><span><b><a href="#cite_ref-54">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mozilla.org/firefox/os/">"Boot to Gecko Project"</a>. Mozilla. March 2012<span>. Retrieved <span>2012-03-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Boot+to+Gecko+Project&amp;rft.date=2012-03&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Ffirefox%2Fos%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-55"><span><b><a href="#cite_ref-55">^</a></b></span> <span><cite><a href="https://www.mozilla.org/en-US/firefox/os/devices/" rel="nofollow">"Firefox OS - Devices &amp; Availability"</a>. <i>Mozilla</i><span>. Retrieved <span>2015-12-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Firefox+OS+-+Devices+%26+Availability&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Fen-US%2Ffirefox%2Fos%2Fdevices%2F&amp;rft.jtitle=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-55"><span><b><a href="#cite_ref-55">^</a></b></span> <span><cite><a rel="nofollow" href="https://www.mozilla.org/en-US/firefox/os/devices/">"Firefox OS - Devices &amp; Availability"</a>. <i>Mozilla</i><span>. Retrieved <span>2015-12-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Firefox+OS+-+Devices+%26+Availability&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.mozilla.org%2Fen-US%2Ffirefox%2Fos%2Fdevices%2F&amp;rft.jtitle=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-56"><span><b><a href="#cite_ref-56">^</a></b></span> <span><cite><a href="https://blog.lizardwrangler.com/2012/07/06/thunderbird-stability-and-community-innovation/" rel="nofollow">"Thunderbird: Stability and Community Innovation | Mitchell's Blog"</a>. <i>blog.lizardwrangler.com</i><span>. Retrieved <span>2015-04-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Thunderbird%3A+Stability+and+Community+Innovation+%7C+Mitchell%27s+Blog&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.lizardwrangler.com%2F2012%2F07%2F06%2Fthunderbird-stability-and-community-innovation%2F&amp;rft.jtitle=blog.lizardwrangler.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-56"><span><b><a href="#cite_ref-56">^</a></b></span> <span><cite><a rel="nofollow" href="https://blog.lizardwrangler.com/2012/07/06/thunderbird-stability-and-community-innovation/">"Thunderbird: Stability and Community Innovation | Mitchell's Blog"</a>. <i>blog.lizardwrangler.com</i><span>. Retrieved <span>2015-04-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Thunderbird%3A+Stability+and+Community+Innovation+%7C+Mitchell%27s+Blog&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.lizardwrangler.com%2F2012%2F07%2F06%2Fthunderbird-stability-and-community-innovation%2F&amp;rft.jtitle=blog.lizardwrangler.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-57"><span><b><a href="#cite_ref-57">^</a></b></span> <span><cite><a href="https://lwn.net/Articles/165080/" rel="nofollow">"Two discontinued browsers"</a>. LWN.net. 21 December 2005<span>. Retrieved <span>2012-08-19</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Two+discontinued+browsers&amp;rft.date=2005-12-21&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F165080%2F&amp;rft.pub=LWN.net&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-57"><span><b><a href="#cite_ref-57">^</a></b></span> <span><cite><a rel="nofollow" href="https://lwn.net/Articles/165080/">"Two discontinued browsers"</a>. LWN.net. 21 December 2005<span>. Retrieved <span>2012-08-19</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Two+discontinued+browsers&amp;rft.date=2005-12-21&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F165080%2F&amp;rft.pub=LWN.net&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-58"><span><b><a href="#cite_ref-58">^</a></b></span> <span><cite><a href="http://home.kairo.at/blog/2007-06/seamonkey_r_trademarks_registered" rel="nofollow">"SeaMonkey trademarks registered!"</a>. kairo.at. 2007-05-22<span>. Retrieved <span>2013-06-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=SeaMonkey+trademarks+registered%21&amp;rft.date=2007-05-22&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fhome.kairo.at%2Fblog%2F2007-06%2Fseamonkey_r_trademarks_registered&amp;rft.pub=kairo.at&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-58"><span><b><a href="#cite_ref-58">^</a></b></span> <span><cite><a rel="nofollow" href="http://home.kairo.at/blog/2007-06/seamonkey_r_trademarks_registered">"SeaMonkey trademarks registered!"</a>. kairo.at. 2007-05-22<span>. Retrieved <span>2013-06-10</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=SeaMonkey+trademarks+registered%21&amp;rft.date=2007-05-22&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fhome.kairo.at%2Fblog%2F2007-06%2Fseamonkey_r_trademarks_registered&amp;rft.pub=kairo.at&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-59"><span><b><a href="#cite_ref-59">^</a></b></span> <span><cite><a href="http://www.bugzilla.org/installation-list/" rel="nofollow">"Bugzilla Installation List"</a><span>. Retrieved <span>2014-09-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Bugzilla+Installation+List&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.bugzilla.org%2Finstallation-list%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-59"><span><b><a href="#cite_ref-59">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.bugzilla.org/installation-list/">"Bugzilla Installation List"</a><span>. Retrieved <span>2014-09-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Bugzilla+Installation+List&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.bugzilla.org%2Finstallation-list%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-BE201106-60"><span>^ <a href="#cite_ref-BE201106_60-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-BE201106_60-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Eich, Brendan</a> (21 June 2011). <a href="http://brendaneich.com/2011/06/new-javascript-engine-module-owner/" rel="nofollow">"New JavaScript Engine Module Owner"</a>. BrendanEich.com.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Brendan&amp;rft.aulast=Eich&amp;rft.btitle=New+JavaScript+Engine+Module+Owner&amp;rft.date=2011-06-21&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fbrendaneich.com%2F2011%2F06%2Fnew-javascript-engine-module-owner%2F&amp;rft.pub=BrendanEich.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-BE201106-60"><span>^ <a href="#cite_ref-BE201106_60-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-BE201106_60-1"><sup><i><b>b</b></i></sup></a></span> <span><cite><a href="http://fakehost/wiki/Brendan_Eich" title="Brendan Eich">Eich, Brendan</a> (21 June 2011). <a rel="nofollow" href="http://brendaneich.com/2011/06/new-javascript-engine-module-owner/">"New JavaScript Engine Module Owner"</a>. BrendanEich.com.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.aufirst=Brendan&amp;rft.aulast=Eich&amp;rft.btitle=New+JavaScript+Engine+Module+Owner&amp;rft.date=2011-06-21&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fbrendaneich.com%2F2011%2F06%2Fnew-javascript-engine-module-owner%2F&amp;rft.pub=BrendanEich.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-61"><span><b><a href="#cite_ref-61">^</a></b></span> <span><cite><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=759422#c0" rel="nofollow">"Bug 759422 - Remove use of e4x in account creation"</a>. Bugzilla@Mozilla. 2012-08-17<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Bug+759422+-+Remove+use+of+e4x+in+account+creation&amp;rft.date=2012-08-17&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fbugzilla.mozilla.org%2Fshow_bug.cgi%3Fid%3D759422%23c0&amp;rft.pub=Bugzilla%40Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-61"><span><b><a href="#cite_ref-61">^</a></b></span> <span><cite><a rel="nofollow" href="https://bugzilla.mozilla.org/show_bug.cgi?id=759422#c0">"Bug 759422 - Remove use of e4x in account creation"</a>. Bugzilla@Mozilla. 2012-08-17<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Bug+759422+-+Remove+use+of+e4x+in+account+creation&amp;rft.date=2012-08-17&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fbugzilla.mozilla.org%2Fshow_bug.cgi%3Fid%3D759422%23c0&amp;rft.pub=Bugzilla%40Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-62"><span><b><a href="#cite_ref-62">^</a></b></span> <span><cite><a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey" rel="nofollow">"SpiderMonkey"</a>. Mozilla Developer Network. 2012-08-15<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=SpiderMonkey&amp;rft.date=2012-08-15&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FSpiderMonkey&amp;rft.pub=Mozilla+Developer+Network&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-62"><span><b><a href="#cite_ref-62">^</a></b></span> <span><cite><a rel="nofollow" href="https://developer.mozilla.org/en-US/docs/SpiderMonkey">"SpiderMonkey"</a>. Mozilla Developer Network. 2012-08-15<span>. Retrieved <span>2012-08-18</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=SpiderMonkey&amp;rft.date=2012-08-15&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FSpiderMonkey&amp;rft.pub=Mozilla+Developer+Network&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-63"><span><b><a href="#cite_ref-63">^</a></b></span> <span><cite><a href="http://www.mozilla.org/rhino/history.html" rel="nofollow">"Rhino History"</a>. <a href="http://fakehost/wiki/Mozilla_Foundation" title="Mozilla Foundation">Mozilla Foundation</a><span>. Retrieved <span>2008-03-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Rhino+History&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Frhino%2Fhistory.html&amp;rft.pub=Mozilla+Foundation&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-63"><span><b><a href="#cite_ref-63">^</a></b></span> <span><cite><a rel="nofollow" href="http://www.mozilla.org/rhino/history.html">"Rhino History"</a>. <a href="http://fakehost/wiki/Mozilla_Foundation" title="Mozilla Foundation">Mozilla Foundation</a><span>. Retrieved <span>2008-03-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Rhino+History&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.mozilla.org%2Frhino%2Fhistory.html&amp;rft.pub=Mozilla+Foundation&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-64"><span><b><a href="#cite_ref-64">^</a></b></span> <span><cite><a href="https://github.com/servo/servo/wiki/Roadmap" rel="nofollow">"Roadmap"</a><span>. Retrieved <span>10 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Roadmap&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fgithub.com%2Fservo%2Fservo%2Fwiki%2FRoadmap&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-64"><span><b><a href="#cite_ref-64">^</a></b></span> <span><cite><a rel="nofollow" href="https://github.com/servo/servo/wiki/Roadmap">"Roadmap"</a><span>. Retrieved <span>10 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Roadmap&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fgithub.com%2Fservo%2Fservo%2Fwiki%2FRoadmap&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-65"><span><b><a href="#cite_ref-65">^</a></b></span> <span><cite>Larabel, Michael. <a href="https://www.phoronix.com/scan.php?page=news_item&amp;px=Servo-9-May-2016" rel="nofollow">"Servo Continues Making Progress For Shipping Components In Gecko, Browser.html"</a>. <i>Phoronix.com</i><span>. Retrieved <span>10 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Servo+Continues+Making+Progress+For+Shipping+Components+In+Gecko%2C+Browser.html&amp;rft.aufirst=Michael&amp;rft.aulast=Larabel&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.phoronix.com%2Fscan.php%3Fpage%3Dnews_item%26px%3DServo-9-May-2016&amp;rft.jtitle=Phoronix.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-65"><span><b><a href="#cite_ref-65">^</a></b></span> <span><cite>Larabel, Michael. <a rel="nofollow" href="https://www.phoronix.com/scan.php?page=news_item&amp;px=Servo-9-May-2016">"Servo Continues Making Progress For Shipping Components In Gecko, Browser.html"</a>. <i>Phoronix.com</i><span>. Retrieved <span>10 May</span> 2016</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Servo+Continues+Making+Progress+For+Shipping+Components+In+Gecko%2C+Browser.html&amp;rft.aufirst=Michael&amp;rft.aulast=Larabel&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwww.phoronix.com%2Fscan.php%3Fpage%3Dnews_item%26px%3DServo-9-May-2016&amp;rft.jtitle=Phoronix.com&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-66"><span><b><a href="#cite_ref-66">^</a></b></span> <span><cite><a href="https://mozvr.com" rel="nofollow">"Mozilla VR"</a>. <i>Mozilla VR</i><span>. Retrieved <span>2016-10-27</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+VR&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fmozvr.com&amp;rft.jtitle=Mozilla+VR&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-66"><span><b><a href="#cite_ref-66">^</a></b></span> <span><cite><a rel="nofollow" href="https://mozvr.com">"Mozilla VR"</a>. <i>Mozilla VR</i><span>. Retrieved <span>2016-10-27</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+VR&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fmozvr.com&amp;rft.jtitle=Mozilla+VR&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-67"><span><b><a href="#cite_ref-67">^</a></b></span> <span><cite><a href="https://login.persona.org/" rel="nofollow"><i>Persona</i></a>, Mozilla</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Persona&amp;rft.genre=book&amp;rft_id=https%3A%2F%2Flogin.persona.org%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-67"><span><b><a href="#cite_ref-67">^</a></b></span> <span><cite><a rel="nofollow" href="https://login.persona.org/"><i>Persona</i></a>, Mozilla</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Persona&amp;rft.genre=book&amp;rft_id=https%3A%2F%2Flogin.persona.org%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-68"><span><b><a href="#cite_ref-68">^</a></b></span> <span><cite><a href="https://developer.mozilla.org/en-US/Persona" rel="nofollow">"Persona"</a>. <i>Mozilla Developer Network</i><span>. Retrieved <span>2016-10-27</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Persona&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2FPersona&amp;rft.jtitle=Mozilla+Developer+Network&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-68"><span><b><a href="#cite_ref-68">^</a></b></span> <span><cite><a rel="nofollow" href="https://developer.mozilla.org/en-US/Persona">"Persona"</a>. <i>Mozilla Developer Network</i><span>. Retrieved <span>2016-10-27</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Persona&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2FPersona&amp;rft.jtitle=Mozilla+Developer+Network&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-69"><span><b><a href="#cite_ref-69">^</a></b></span> <span><cite><a href="https://webmaker.org/en-US/about/" rel="nofollow"><i>About Mozilla Webmaker</i></a>, Mozilla</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=About+Mozilla+Webmaker&amp;rft.genre=book&amp;rft_id=https%3A%2F%2Fwebmaker.org%2Fen-US%2Fabout%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-69"><span><b><a href="#cite_ref-69">^</a></b></span> <span><cite><a rel="nofollow" href="https://webmaker.org/en-US/about/"><i>About Mozilla Webmaker</i></a>, Mozilla</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=About+Mozilla+Webmaker&amp;rft.genre=book&amp;rft_id=https%3A%2F%2Fwebmaker.org%2Fen-US%2Fabout%2F&amp;rft.pub=Mozilla&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-lifehacker.com-70"><span>^ <a href="#cite_ref-lifehacker.com_70-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-lifehacker.com_70-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Alan Henry. <a href="http://lifehacker.com/mozilla-webmaker-teaches-you-how-to-build-web-sites-ap-1553277374" rel="nofollow">"Mozilla Webmaker Teaches You to Build Web Sites, Apps, and More"</a>. <i>Lifehacker</i>. Gawker Media.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+Webmaker+Teaches+You+to+Build+Web+Sites%2C+Apps%2C+and+More&amp;rft.au=Alan+Henry&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Flifehacker.com%2Fmozilla-webmaker-teaches-you-how-to-build-web-sites-ap-1553277374&amp;rft.jtitle=Lifehacker&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
+ <li id="cite_note-lifehacker.com-70"><span>^ <a href="#cite_ref-lifehacker.com_70-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-lifehacker.com_70-1"><sup><i><b>b</b></i></sup></a></span> <span><cite>Alan Henry. <a rel="nofollow" href="http://lifehacker.com/mozilla-webmaker-teaches-you-how-to-build-web-sites-ap-1553277374">"Mozilla Webmaker Teaches You to Build Web Sites, Apps, and More"</a>. <i>Lifehacker</i>. Gawker Media.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.atitle=Mozilla+Webmaker+Teaches+You+to+Build+Web+Sites%2C+Apps%2C+and+More&amp;rft.au=Alan+Henry&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Flifehacker.com%2Fmozilla-webmaker-teaches-you-how-to-build-web-sites-ap-1553277374&amp;rft.jtitle=Lifehacker&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal"></span>
</span>
</li>
- <li id="cite_note-71"><span><b><a href="#cite_ref-71">^</a></b></span> <span><cite><a href="https://wiki.mozilla.org/Air_Mozilla" rel="nofollow">"Air Mozilla"</a>. Mozilla Wiki.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Air+Mozilla&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FAir_Mozilla&amp;rft.pub=Mozilla+Wiki&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-71"><span><b><a href="#cite_ref-71">^</a></b></span> <span><cite><a rel="nofollow" href="https://wiki.mozilla.org/Air_Mozilla">"Air Mozilla"</a>. Mozilla Wiki.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Air+Mozilla&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fwiki.mozilla.org%2FAir_Mozilla&amp;rft.pub=Mozilla+Wiki&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- <li id="cite_note-72"><span><b><a href="#cite_ref-72">^</a></b></span> <span><cite><a href="https://blog.mozilla.org/mrz/2012/04/17/air-mozilla-reboot-phase-i/" rel="nofollow">"Air Mozilla Reboot, Phase I"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Air+Mozilla+Reboot%2C+Phase+I&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fmrz%2F2012%2F04%2F17%2Fair-mozilla-reboot-phase-i%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
+ <li id="cite_note-72"><span><b><a href="#cite_ref-72">^</a></b></span> <span><cite><a rel="nofollow" href="https://blog.mozilla.org/mrz/2012/04/17/air-mozilla-reboot-phase-i/">"Air Mozilla Reboot, Phase I"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3AMozilla&amp;rft.btitle=Air+Mozilla+Reboot%2C+Phase+I&amp;rft.genre=unknown&amp;rft_id=https%3A%2F%2Fblog.mozilla.org%2Fmrz%2F2012%2F04%2F17%2Fair-mozilla-reboot-phase-i%2F&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook"></span>
</span>
</li>
- </ol></div>
- <p><a href="http://www.techsive.com/2014/09/how-to-resume-failed-downloads-in.html" rel="nofollow">Constant downloads failure in firefox</a></p>
+ </ol>
+ </div>
+ <p><a rel="nofollow" href="http://www.techsive.com/2014/09/how-to-resume-failed-downloads-in.html">Constant downloads failure in firefox</a></p>
<h2><span id="External_links">External links</span><span><span>[</span><a href="http://fakehost/w/index.php?title=Mozilla&amp;action=edit&amp;section=36" title="Edit section: External links">edit</a><span>]</span></span>
</h2>
- <table readabilityDataTable="0" role="presentation"><tr><td>
- <a href="http://fakehost/wiki/File:Commons-logo.svg"><img alt="" data-file-height="1376" data-file-width="1024" height="40" src="http://upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png" srcset="//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/45px-Commons-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/59px-Commons-logo.svg.png 2x" width="30"></img></a>
+ <table role="presentation" readabilityDataTable="0">
+ <tr>
+ <td>
+ <a href="http://fakehost/wiki/File:Commons-logo.svg"><img alt src="http://upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png" width="30" height="40" srcset="http://upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/45px-Commons-logo.svg.png 1.5x, http://upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/59px-Commons-logo.svg.png 2x" data-file-width="1024" data-file-height="1376"></a>
</td>
<td>Wikimedia Commons has media related to <i><b><a href="https://commons.wikimedia.org/wiki/Category:Mozilla" title="commons:Category:Mozilla">Mozilla</a></b></i>.</td>
- </tr></table><ul><li><span><span><a href="http://mozilla.org/" rel="nofollow">Official website</a></span></span>, including <a href="https://www.mozilla.org/en-US/about/manifesto/" rel="nofollow">the Mozilla Manifesto</a></li>
- <li><a href="https://wiki.mozilla.org/" rel="nofollow">Mozilla Wiki</a>(<a href="https://wiki.mozilla.org/Timeline" title="mozillawiki:Timeline">Major time line of community development</a>)</li>
- <li><a href="http://hg.mozilla.org/" rel="nofollow">Mozilla Mercurial Repository</a></li>
+ </tr>
+ </table>
+ <ul>
+ <li><span><span><a rel="nofollow" href="http://mozilla.org/">Official website</a></span></span>, including <a rel="nofollow" href="https://www.mozilla.org/en-US/about/manifesto/">the Mozilla Manifesto</a></li>
+ <li><a rel="nofollow" href="https://wiki.mozilla.org/">Mozilla Wiki</a>(<a href="https://wiki.mozilla.org/Timeline" title="mozillawiki:Timeline">Major time line of community development</a>)</li>
+ <li><a rel="nofollow" href="http://hg.mozilla.org/">Mozilla Mercurial Repository</a></li>
</ul>
+
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json
index 9154ef04d..7a5a65f3d 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected-metadata.json
@@ -1,8 +1,8 @@
{
"Author": null,
- "Direction": null,
- "Excerpt": "Stack Overflow published its analysis of 2017 hiring trends based on the targeting options employers selected when posting to Stack Overflow Jobs. The report, which compares data from 200 companies…",
+ "Direction": "ltr",
+ "Excerpt": "Stack Overflow published its analysis of 2017 hiring trends based on the targeting options employers selected when posting to Stack Overflow Jobs. The report, which compares data from 200 companies\u2026",
"Image": "https:\/\/i0.wp.com\/wptavern.com\/wp-content\/uploads\/2016\/07\/stack-overflow.png?fit=1200%2C470&ssl=1",
"Title": "Stack Overflow Jobs Data Shows ReactJS Skills in High Demand, WordPress Market Oversaturated with Developers",
"SiteName": "WordPress Tavern"
-}
+} \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html
index 1f47d8fe1..344eb7d12 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/wordpress/expected.html
@@ -1,14 +1,31 @@
-<article id="post-67202" itemprop="blogPost" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><div itemprop="articleBody">
+<div id="container">
+
+
+
+
+ <main id="content" role="main" tabindex="-1">
+
+
+
+
+
+ <article id="post-67202" itemscope="itemscope" itemtype="http://schema.org/BlogPosting" itemprop="blogPost">
+
+
+
+
+
+ <div itemprop="articleBody">
<p>
- <a href="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?ssl=1"><img alt="" data-attachment-id="57913" data-comments-opened="0" data-image-description="" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="stack-overflow" data-large-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=500%2C196&amp;ssl=1" data-medium-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=300%2C117&amp;ssl=1" data-orig-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=1650%2C646&amp;ssl=1" data-orig-size="1650,646" data-permalink="https://wptavern.com/stack-overflow-documentation-is-now-in-beta/stack-overflow" height="252" sizes="(max-width: 1025px) 100vw, 1025px" src="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=1025%2C401&amp;ssl=1" srcset="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?w=1650&amp;ssl=1 1650w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=300%2C117&amp;ssl=1 300w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=768%2C301&amp;ssl=1 768w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=500%2C196&amp;ssl=1 500w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=1025%2C401&amp;ssl=1 1025w" width="644"></img></a>
+ <a href="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?ssl=1"><img data-attachment-id="57913" data-permalink="https://wptavern.com/stack-overflow-documentation-is-now-in-beta/stack-overflow" data-orig-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=1650%2C646&amp;ssl=1" data-orig-size="1650,646" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="stack-overflow" data-image-description data-medium-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=300%2C117&amp;ssl=1" data-large-file="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?fit=500%2C196&amp;ssl=1" src="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=1025%2C401&amp;ssl=1" alt srcset="https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?w=1650&amp;ssl=1 1650w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=300%2C117&amp;ssl=1 300w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=768%2C301&amp;ssl=1 768w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=500%2C196&amp;ssl=1 500w, https://i0.wp.com/wptavern.com/wp-content/uploads/2016/07/stack-overflow.png?resize=1025%2C401&amp;ssl=1 1025w" sizes="(max-width: 1025px) 100vw, 1025px" width="644" height="252"></a>
</p>
<p>Stack Overflow published its analysis of <a href="https://stackoverflow.blog/2017/03/09/developer-hiring-trends-2017/" target="_blank">2017 hiring trends</a> based on the targeting options employers selected when posting to <a href="http://stackoverflow.com/jobs" target="_blank">Stack Overflow Jobs</a>. The report, which compares data from 200 companies since 2015, ranks ReactJS, Docker, and Ansible at the top of the fastest growing skills in demand. When comparing the percentage change from 2015 to 2016, technologies like AJAX, Backbone.js, jQuery, and WordPress are less in demand.</p>
<p>
- <a href="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?ssl=1"><img alt="" data-attachment-id="67214" data-comments-opened="0" data-image-description="" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ChangesinDemand" data-large-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=437%2C500&amp;ssl=1" data-medium-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=262%2C300&amp;ssl=1" data-orig-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=975%2C1115&amp;ssl=1" data-orig-size="975,1115" data-permalink="https://wptavern.com/stack-overflow-jobs-data-shows-reactjs-skills-in-high-demand-wordpress-market-oversaturated-with-developers/changesindemand" height="736" sizes="(max-width: 975px) 100vw, 975px" src="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=975%2C1115&amp;ssl=1" srcset="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?w=975&amp;ssl=1 975w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=262%2C300&amp;ssl=1 262w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=768%2C878&amp;ssl=1 768w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=437%2C500&amp;ssl=1 437w" width="644"></img></a>
+ <a href="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?ssl=1"><img data-attachment-id="67214" data-permalink="https://wptavern.com/stack-overflow-jobs-data-shows-reactjs-skills-in-high-demand-wordpress-market-oversaturated-with-developers/changesindemand" data-orig-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=975%2C1115&amp;ssl=1" data-orig-size="975,1115" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ChangesinDemand" data-image-description data-medium-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=262%2C300&amp;ssl=1" data-large-file="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?fit=437%2C500&amp;ssl=1" src="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=975%2C1115&amp;ssl=1" alt srcset="https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?w=975&amp;ssl=1 975w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=262%2C300&amp;ssl=1 262w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=768%2C878&amp;ssl=1 768w, https://i2.wp.com/wptavern.com/wp-content/uploads/2017/03/ChangesinDemand.png?resize=437%2C500&amp;ssl=1 437w" sizes="(max-width: 975px) 100vw, 975px" width="644" height="736"></a>
</p>
<p>Stack Overflow also measured the demand relative to the available developers in different tech skills. The demand for backend, mobile, and database engineers is higher than the number of qualified candidates available. WordPress is last among the oversaturated fields with a surplus of developers relative to available positions.</p>
<p>
- <a href="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?ssl=1"><img alt="" data-attachment-id="67216" data-comments-opened="0" data-image-description="" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="HighDemand" data-large-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=500%2C438&amp;ssl=1" data-medium-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=300%2C263&amp;ssl=1" data-orig-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=975%2C854&amp;ssl=1" data-orig-size="975,854" data-permalink="https://wptavern.com/stack-overflow-jobs-data-shows-reactjs-skills-in-high-demand-wordpress-market-oversaturated-with-developers/highdemand" height="564" sizes="(max-width: 975px) 100vw, 975px" src="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=975%2C854&amp;ssl=1" srcset="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?w=975&amp;ssl=1 975w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=300%2C263&amp;ssl=1 300w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=768%2C673&amp;ssl=1 768w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=500%2C438&amp;ssl=1 500w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=571%2C500&amp;ssl=1 571w" width="644"></img></a>
+ <a href="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?ssl=1"><img data-attachment-id="67216" data-permalink="https://wptavern.com/stack-overflow-jobs-data-shows-reactjs-skills-in-high-demand-wordpress-market-oversaturated-with-developers/highdemand" data-orig-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=975%2C854&amp;ssl=1" data-orig-size="975,854" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="HighDemand" data-image-description data-medium-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=300%2C263&amp;ssl=1" data-large-file="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?fit=500%2C438&amp;ssl=1" src="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=975%2C854&amp;ssl=1" alt srcset="https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?w=975&amp;ssl=1 975w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=300%2C263&amp;ssl=1 300w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=768%2C673&amp;ssl=1 768w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=500%2C438&amp;ssl=1 500w, https://i1.wp.com/wptavern.com/wp-content/uploads/2017/03/HighDemand.png?resize=571%2C500&amp;ssl=1 571w" sizes="(max-width: 975px) 100vw, 975px" width="644" height="564"></a>
</p>
<p>In looking at these results, it’s important to consider the inherent biases within the Stack Overflow ecosystem. In 2016, the site surveyed more than 56,000 developers but noted that the survey was “biased against devs who don’t speak English.” The average age of respondents was 29.6 years old and 92.8% of them were male. </p>
<p>For two years running, Stack Overflow survey respondents have <a href="https://wptavern.com/stack-overflow-survey-results-show-wordpress-is-trending-up-despite-being-ranked-among-most-dreaded-technologies" target="_blank">ranked WordPress among the most dreaded technologies</a> that they would prefer not to use. This may be one reason why employers wouldn’t be looking to advertise positions on the site’s job board, which is the primary source of the data for this report.</p>
@@ -26,4 +43,29 @@
</div>
- </article> \ No newline at end of file
+
+
+
+
+ </article>
+
+
+
+
+
+
+
+
+
+
+
+
+ </main>
+
+
+
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html
index deea6c82f..645639393 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-1/expected.html
@@ -1,45 +1,49 @@
-<div data-reactid="406" id="Col1-0-ContentCanvas-Proxy">
- <div data-reactid="407" id="Col1-0-ContentCanvas">
- <article data-reactid="408" data-type="story" data-uuid="80b35014-fba3-377e-adc5-47fb44f61fa7"><figure data-reactid="409" data-type="image"><p><img alt="The PlayStation VR" data-reactid="411" src="http://l1.yimg.com/ny/api/res/1.2/589noY9BZNdmsUUQf6L1AQ--/YXBwaWQ9aGlnaGxhbmRlcjtzbT0xO3c9NzQ0O2g9NjY5/http://media.zenfs.com/en/homerun/feed_manager_auto_publish_494/4406ef57dcb40376c513903b03bef048"></img></p>
+<div id="Col1-0-ContentCanvas-Proxy" data-reactid="406">
+ <article data-uuid="80b35014-fba3-377e-adc5-47fb44f61fa7" data-type="story" data-reactid="408">
+ <figure data-type="image" data-reactid="409">
+ <p><img alt="The PlayStation VR" src="http://l1.yimg.com/ny/api/res/1.2/589noY9BZNdmsUUQf6L1AQ--/YXBwaWQ9aGlnaGxhbmRlcjtzbT0xO3c9NzQ0O2g9NjY5/http://media.zenfs.com/en/homerun/feed_manager_auto_publish_494/4406ef57dcb40376c513903b03bef048"></p>
<div data-reactid="413">
- <figcaption data-reactid="414" title="Sony’s PlayStation VR."><p>Sony’s PlayStation VR.</p>
+ <figcaption title="Sony’s PlayStation VR." data-reactid="414">
+ <p>Sony’s PlayStation VR.</p>
</figcaption></div>
- </figure><div data-reactid="418">
- <p data-reactid="419" data-type="text">Virtual reality has officially reached the consoles. And it’s pretty good! <a href="http://finance.yahoo.com/news/review-playstation-vr-is-comfortable-and-affordable-but-lacks-must-have-games-165053851.html">Sony’s PlayStation VR</a> is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.</p>
- <p data-reactid="420" data-type="text">But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.</p>
- <h3 data-reactid="421" data-type="text"><a href="https://www.playstation.com/en-us/games/rez-infinite-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Rez Infinite” ($30)</a></h3>
- <p data-reactid="422"><iframe data-reactid="423" data-type="videoIframe" src="https://www.youtube.com/embed/YlDxEOwj5j8"></iframe></p>
- <p data-reactid="424" data-type="text">Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.</p>
- <h3 data-reactid="425" data-type="text"><a href="https://www.playstation.com/en-us/games/thumper-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Thumper” ($20)</a></h3>
- <p data-reactid="426"><iframe data-reactid="427" data-type="videoIframe" src="https://www.youtube.com/embed/gtPGX8i1Eaw"></iframe></p>
- <p data-reactid="428" data-type="text">What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.</p>
- <h3 data-reactid="429" data-type="text"><a href="https://www.playstation.com/en-us/games/until-dawn-rush-of-blood-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Until Dawn: Rush of Blood” ($20)</a></h3>
- <p data-reactid="430"><iframe data-reactid="431" data-type="videoIframe" src="https://www.youtube.com/embed/EL3svUfC8Ds"></iframe></p>
- <p data-reactid="432" data-type="text">Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.</p>
- <h3 data-reactid="433" data-type="text"><a href="https://www.playstation.com/en-us/games/headmaster-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Headmaster” ($20)</a></h3>
- <p data-reactid="434"><iframe data-reactid="435" data-type="videoIframe" src="https://www.youtube.com/embed/a7CSMKw1E7g"></iframe></p>
- <p data-reactid="436" data-type="text">Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.</p>
- <h3 data-reactid="437" data-type="text"><a href="https://www.playstation.com/en-us/games/rigs-mechanized-combat-league-ps4/" rel="nofollow noopener noreferrer" target="_blank">“RIGS: Mechanized Combat League” ($50)</a></h3>
- <p data-reactid="438"><iframe data-reactid="439" data-type="videoIframe" src="https://www.youtube.com/embed/Rnqlf9EQ2zA"></iframe></p>
- <p data-reactid="440" data-type="text">Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.</p>
- <h3 data-reactid="441" data-type="text"><a href="https://www.playstation.com/en-us/games/batman-arkham-vr-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Batman Arkham VR” ($20)</a></h3>
- <p data-reactid="442"><iframe data-reactid="443" data-type="videoIframe" src="https://www.youtube.com/embed/eS4g0py16N8"></iframe></p>
- <p data-reactid="444" data-type="text">“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.</p>
- <h3 data-reactid="445" data-type="text"><a href="https://www.playstation.com/en-us/games/job-simulator-the-2050-archives-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Job Simulator” ($30)</a></h3>
- <p data-reactid="446"><iframe data-reactid="447" data-type="videoIframe" src="https://www.youtube.com/embed/3-iMlQIGH8Y"></iframe></p>
- <p data-reactid="448" data-type="text">There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.</p>
- <h3 data-reactid="449" data-type="text"><a href="https://www.playstation.com/en-us/games/eve-valkyrie-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Eve Valkyrie” ($60)</a></h3>
- <p data-reactid="450"><iframe data-reactid="451" data-type="videoIframe" src="https://www.youtube.com/embed/0KFHw12CTbo"></iframe></p>
- <p data-reactid="452" data-type="text">Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)</p>
- <p data-reactid="453" data-type="text"><em><strong>More games news:</strong></em></p>
- <ul data-reactid="454" data-type="list"><li data-reactid="455"><a href="https://www.yahoo.com/tech/skylanders-imaginators-will-let-you-create-and-3d-print-your-own-action-figure-143838550.html">‘Skylanders Imaginators’ will let you create and 3D print your own action figures</a></li>
+ </figure>
+ <div data-reactid="418">
+ <p data-type="text" data-reactid="419">Virtual reality has officially reached the consoles. And it’s pretty good! <a href="http://finance.yahoo.com/news/review-playstation-vr-is-comfortable-and-affordable-but-lacks-must-have-games-165053851.html">Sony’s PlayStation VR</a> is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.</p>
+ <p data-type="text" data-reactid="420">But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.</p>
+ <h3 data-type="text" data-reactid="421"><a href="https://www.playstation.com/en-us/games/rez-infinite-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Rez Infinite” ($30)</a></h3>
+ <p data-reactid="422"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/YlDxEOwj5j8" data-reactid="423"></iframe></p>
+ <p data-type="text" data-reactid="424">Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.</p>
+ <h3 data-type="text" data-reactid="425"><a href="https://www.playstation.com/en-us/games/thumper-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Thumper” ($20)</a></h3>
+ <p data-reactid="426"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/gtPGX8i1Eaw" data-reactid="427"></iframe></p>
+ <p data-type="text" data-reactid="428">What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.</p>
+ <h3 data-type="text" data-reactid="429"><a href="https://www.playstation.com/en-us/games/until-dawn-rush-of-blood-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Until Dawn: Rush of Blood” ($20)</a></h3>
+ <p data-reactid="430"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/EL3svUfC8Ds" data-reactid="431"></iframe></p>
+ <p data-type="text" data-reactid="432">Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.</p>
+ <h3 data-type="text" data-reactid="433"><a href="https://www.playstation.com/en-us/games/headmaster-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Headmaster” ($20)</a></h3>
+ <p data-reactid="434"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/a7CSMKw1E7g" data-reactid="435"></iframe></p>
+ <p data-type="text" data-reactid="436">Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.</p>
+ <h3 data-type="text" data-reactid="437"><a href="https://www.playstation.com/en-us/games/rigs-mechanized-combat-league-ps4/" rel="nofollow noopener noreferrer" target="_blank">“RIGS: Mechanized Combat League” ($50)</a></h3>
+ <p data-reactid="438"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/Rnqlf9EQ2zA" data-reactid="439"></iframe></p>
+ <p data-type="text" data-reactid="440">Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.</p>
+ <h3 data-type="text" data-reactid="441"><a href="https://www.playstation.com/en-us/games/batman-arkham-vr-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Batman Arkham VR” ($20)</a></h3>
+ <p data-reactid="442"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/eS4g0py16N8" data-reactid="443"></iframe></p>
+ <p data-type="text" data-reactid="444">“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.</p>
+ <h3 data-type="text" data-reactid="445"><a href="https://www.playstation.com/en-us/games/job-simulator-the-2050-archives-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Job Simulator” ($30)</a></h3>
+ <p data-reactid="446"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/3-iMlQIGH8Y" data-reactid="447"></iframe></p>
+ <p data-type="text" data-reactid="448">There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.</p>
+ <h3 data-type="text" data-reactid="449"><a href="https://www.playstation.com/en-us/games/eve-valkyrie-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Eve Valkyrie” ($60)</a></h3>
+ <p data-reactid="450"><iframe data-type="videoIframe" src="https://www.youtube.com/embed/0KFHw12CTbo" data-reactid="451"></iframe></p>
+ <p data-type="text" data-reactid="452">Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)</p>
+ <p data-type="text" data-reactid="453"><em><strong>More games news:</strong></em></p>
+ <ul data-type="list" data-reactid="454">
+ <li data-reactid="455"><a href="https://www.yahoo.com/tech/skylanders-imaginators-will-let-you-create-and-3d-print-your-own-action-figure-143838550.html">‘Skylanders Imaginators’ will let you create and 3D print your own action figures</a></li>
<li data-reactid="456"><a href="https://www.yahoo.com/tech/review-high-flying-nba-2k17-has-a-career-year-184135248.html">Review: High-flying ‘NBA 2K17’ has a career year</a></li>
<li data-reactid="457"><a href="https://www.yahoo.com/tech/review-race-at-your-own-speed-in-big-beautiful-forza-horizon-3-195337170.html">Review: Race at your own speed in big, beautiful ‘Forza Horizon 3’</a></li>
<li data-reactid="458"><a href="https://www.yahoo.com/tech/sonys-playstation-4-pro-shows-promise-potential-161304037.html">Sony’s PlayStation 4 Pro shows promise, potential and plenty of pretty lighting</a></li>
<li data-reactid="459"><a href="https://www.yahoo.com/tech/review-madden-nfl-17-runs-000000394.html">Review: ‘Madden NFL 17’ runs hard, plays it safe</a></li>
- </ul><p data-reactid="460" data-type="text"><i>Ben Silverman is on Twitter at</i>
- <a href="https://twitter.com/ben_silverman" rel="nofollow noopener noreferrer" target="_blank"> <i>ben_silverman</i></a><i>.</i></p>
+ </ul>
+ <p data-type="text" data-reactid="460"><i>Ben Silverman is on Twitter at</i>
+ <a href="https://twitter.com/ben_silverman" target="_blank" rel="nofollow noopener noreferrer"> <i>ben_silverman</i></a><i>.</i></p>
</div>
- </article></div>
- </div> \ No newline at end of file
+ </article></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html
index 9bc5f6f5f..92ef4391a 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-2/expected.html
@@ -1,19 +1,11 @@
<div id="tgt1-Col1-2-ContentCanvas-Proxy">
- <div id="tgt1-Col1-2-ContentCanvas">
- <article data-type="story" data-uuid="8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb"><div>
-
- <div>
- <div>
+ <article data-uuid="8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb" data-type="story">
+ <div>
<p><span>1 / 5</span></p>
<div>
- <div>
-
+ <h2>In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)</h2>
<p>In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)</p>
- </div>
-
- </div></div>
- </div>
- </div>
+ </div></div>
<div>
<p data-type="text">MOSCOW (AP) — An unmanned Russian cargo spaceship heading to the International Space Station broke up in the atmosphere over Siberia on Thursday due to an unspecified malfunction, the Russian space agency said.</p>
<p data-type="text">The Progress MS-04 cargo craft broke up at an altitude of 190 kilometers (118 miles) over the remote Russian Tuva region in Siberia that borders Mongolia, Roscosmos said in a statement. It said most of spaceship's debris burnt up as it entered the atmosphere but some fell to Earth over what it called an uninhabited area.</p>
@@ -30,5 +22,4 @@
<p data-type="text">Aerospace Writer Marcia Dunn in Cape Canaveral, Florida, and Vladimir Isachenkov in Moscow contributed to this report.</p>
</div>
- </article></div>
- </div> \ No newline at end of file
+ </article></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json
index 8af68c02b..1af6b8f27 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected-metadata.json
@@ -1,6 +1,6 @@
{
"Author": "By GILLIAN MOHNEY\n March 11, 2015 3:46 PM",
- "Direction": null,
+ "Direction": "ltr",
"Excerpt": "A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.",
"Image": "https:\/\/s.yimg.com\/bt\/api\/res\/1.2\/qZaM9MLUOrxLg4IfXt_Niw--\/YXBwaWQ9eW5ld3NfbGVnbztxPTc1O3c9NjAw\/http:\/\/media.zenfs.com\/en-US\/video\/video.abcnewsplus.com\/559ecdbafdb839129816b5c79a996975.cf.png",
"Title": "Veteran Wraps Baby in American Flag, Photo Sparks Controversy",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html
index c5d7e33dc..21bb560e6 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-3/expected.html
@@ -1,28 +1,30 @@
-<div>
- <div id="Main" role="main" tabindex="0">
- <section data-ylk="mid:mediacontentbreakingnews;mpos:1;t1:a3;t2:mod-bkn;sec:mod-bkn;" id="mediacontentbreakingnews"><p><span>'GMA' Cookie Search:</span> </p>
+<div id="Main" tabindex="0" role="main">
+ <section id="mediacontentbreakingnews" data-ylk="mid:mediacontentbreakingnews;mpos:1;t1:a3;t2:mod-bkn;sec:mod-bkn;">
+ <p><span>'GMA' Cookie Search:</span> </p>
</section>
- <section data-type="story" data-uuid="4250eebf-bbb0-3c95-8fd0-3cb4d3daf93c" data-ylk="t1:a3;t2:ct-mod;sec:ct-mod;itc:0;rspns:nav;" id="mediacontentstory"><div>
-
-
-
-
- <div itemscope="" itemtype="https://schema.org/Article">
+
+ <div itemscope itemtype="https://schema.org/Article" id="mediacontentstory" data-uuid="4250eebf-bbb0-3c95-8fd0-3cb4d3daf93c" data-type="story" data-ylk="t1:a3;t2:ct-mod;sec:ct-mod;itc:0;rspns:nav;">
- <meta content="2015-03-11T19:46:14Z" itemprop="datePublished"></meta><meta content="Veteran Wraps Baby in American Flag, Photo Sparks Controversy" itemprop="headline"></meta><meta content="" itemprop="alternativeHeadline"></meta><meta content="https://media.zenfs.com/en-US/video/video.abcnewsplus.com/559ecdbafdb839129816b5c79a996975" itemprop="image"></meta><meta content="A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot." itemprop="description"></meta><p>A photographer and Navy veteran is fighting back after a photo she posted to <a data-rapid_p="13" href="http://abcnews.go.com/topics/business/companies/facebook-inc.htm" id="ramplink_Facebook_" target="_blank">Facebook</a> started an online backlash.</p>
+ <meta itemprop="datePublished" content="2015-03-11T19:46:14Z">
+ <meta itemprop="headline" content="Veteran Wraps Baby in American Flag, Photo Sparks Controversy">
+ <meta itemprop="alternativeHeadline" content>
+ <meta itemprop="image" content="https://media.zenfs.com/en-US/video/video.abcnewsplus.com/559ecdbafdb839129816b5c79a996975">
+ <meta itemprop="description" content="A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.">
+ <p>A photographer and Navy veteran is fighting back after a photo she posted to <a id="ramplink_Facebook_" href="http://abcnews.go.com/topics/business/companies/facebook-inc.htm" target="_blank" data-rapid_p="13">Facebook</a> started an online backlash.</p>
<p>Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform.</p>
<p>Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.</p>
- <p><a data-rapid_p="14" href="http://abcnews.go.com/WNT/video/pizza-patriots-making-special-super-bowl-delivery-troops-28633975" target="_blank">Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl</a></p>
- <p><a data-rapid_p="15" href="http://abcnews.go.com/Health/superbug-scope-maker-altered-design-make-cleaning-easier/story?id=29417816" target="_blank">Redesigned Scopes Fail to Stop 'Superbug Outbreaks</a></p>
- <p><a data-rapid_p="16" href="http://abcnews.go.com/Travel/video/antarctica-penguin-post-office-job-attracts-record-number-29247380" target="_blank">Antarctica 'Penguin Post Office' Attracts Record Number of Applicants</a></p>
+ <p><a href="http://abcnews.go.com/WNT/video/pizza-patriots-making-special-super-bowl-delivery-troops-28633975" target="_blank" data-rapid_p="14">Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl</a></p>
+ <p><a href="http://abcnews.go.com/Health/superbug-scope-maker-altered-design-make-cleaning-easier/story?id=29417816" target="_blank" data-rapid_p="15">Redesigned Scopes Fail to Stop 'Superbug Outbreaks</a></p>
+ <p><a href="http://abcnews.go.com/Travel/video/antarctica-penguin-post-office-job-attracts-record-number-29247380" target="_blank" data-rapid_p="16">Antarctica 'Penguin Post Office' Attracts Record Number of Applicants</a></p>
<p>“This is what he was fighting for, his son wrapped in an American flag,” Hicks told ABC News. However, when she posted the image on her page, she started to get comments accusing her of desecrating the flag.</p>
<p>On one Facebook page an unidentified poster put up her picture writing and wrote they found it was “disrespectful, rude, tacky, disgusting, and against the U.S. Flag Code.”</p>
- <p><span id="schemaorg"><div><figure data-orig-index="2"><a data-rapid_p="17" id="cover-c9b69c1a26e19ae9fe744763dc31e9ac" name="cover-c9b69c1a26e19ae9fe744763dc31e9ac"></a><div><p>View photo</p><p><span>.</span></p></div><img alt="Vanessa Hicks" data-preembed="image" src="https://s3.yimg.com/bt/api/res/1.2/GNtA09EDJWzWfpBzGYJS0Q--/YXBwaWQ9eW5ld3NfbGVnbztxPTg1O3c9NjMw/http://media.zenfs.com/en_us/gma/us.abcnews.gma.com/HT_flag_baby_jtm_150311_16x9_992.jpg" title="Vanessa Hicks" width="630"></img></figure><p>Vanessa Hicks</p>
+ <p><span id="schemaorg"><div><figure data-orig-index="2"> <a name="cover-c9b69c1a26e19ae9fe744763dc31e9ac" id="cover-c9b69c1a26e19ae9fe744763dc31e9ac" data-rapid_p="17"></a><div><p>View photo</p><p><span>.</span></p></div><img alt="Vanessa Hicks" data-preembed="image" src="https://s3.yimg.com/bt/api/res/1.2/GNtA09EDJWzWfpBzGYJS0Q--/YXBwaWQ9eW5ld3NfbGVnbztxPTg1O3c9NjMw/http://media.zenfs.com/en_us/gma/us.abcnews.gma.com/HT_flag_baby_jtm_150311_16x9_992.jpg" title="Vanessa Hicks" width="630"></figure>
+ <p>Vanessa Hicks</p>
</div>
</span>
- </p><p>The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the <a data-rapid_p="18" href="http://abcnews.go.com/topics/news/us/supreme-court.htm" target="_blank">Supreme Court</a> has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag.
+ </p><p>The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the <a href="http://abcnews.go.com/topics/news/us/supreme-court.htm" target="_blank" data-rapid_p="18">Supreme Court</a> has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag.
</p>
<p>Hicks said she was surprised when messages suddenly started to pop up on her Facebook page and even her own website criticizing her photos.</p>
<p>She said she stayed up until 4 a.m. recently to take down comments from her business and company page, even on shoots that had nothing to do with the flag.</p>
@@ -32,13 +34,12 @@
<p>Hicks, whose husband is still on active duty in the Navy, said the flag is a symbol of U.S. freedoms including the First Amendment right to free speech.</p>
<p>“[My husband] wouldn’t die for a flag, he would die for the freedoms that this country offers,” she told ABC News.</p>
<p>After her story grabbed local headlines, Hicks has been inundated by requests for photos shoots, and she said she plans to give 15 percent of all profits related to these shoots to the USO.</p>
- </div>
- </div>
-
- </section>
+
+
+ </div>
+
- </div>
</div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json
index c8459ad79..18324c4ff 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "Author": null,
+ "Author": "個人",
"Direction": null,
"Excerpt": "トレンドマイクロは3月9日、Wi-Fi利用時の通信を暗号化し保護するスマホ・タブレット - Yahoo!ニュース(CNET Japan)",
"Image": "http:\/\/i.yimg.jp\/images\/jpnews\/cre\/common\/all\/images\/fbico_ogp_600x600.png",
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html
index db7694ab3..04be3c96b 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/yahoo-4/expected.html
@@ -1,9 +1,7 @@
-<div>
- <div><p>
+<div><p>
トレンドマイクロは3月9日、Wi-Fi利用時の通信を暗号化し保護するスマホ・タブレット向けのセキュリティアプリ「フリーWi-Fiプロテクション」(iOS/Android)の発売を開始すると発表した。1年版ライセンスは2900円(税込)で、2年版ライセンスは5000円(税込)。</p><p>  フリーWi-Fiプロテクションは、App Storeおよび、Google Playにて販売され、既に提供しているスマホ・タブレット向け総合セキュリティ対策アプリ「ウイルスバスター モバイル」と併用することで、不正アプリや危険なウェブサイトからの保護に加え、通信の盗み見を防ぐことができる。</p><p>  2020年の東京オリンピック・パラリンピックの開催などを見据え、フリーWi-Fi(公衆無線LAN)の設置が促進され、フリーWi-Fiの利用者も増加している。
</p><p>  一方で、脆弱な設定のフリーWi-Fiや攻撃者が設置した偽のフリーWi-Fiへの接続などによる情報漏えい、通信の盗み見などのセキュリティリスクが危惧されているという。
</p><p>  正規事業者が提供する安全性の高いフリーWi-Fiのほかにも、通信を暗号化していない安全性の低いフリーWi-Fi、さらにはサイバー犯罪者が設置したフリーWi-Fiなどさまざまなものが混在している。また、利用者は、接続する前にひとつひとつ安全性を確認するのは難しい状況だとしている。
</p><p>  トレンドマイクロがスマートフォン保持者でフリーWi-Fiの利用経験がある人に実施した調査では、回答者の約85%が安全なフリーWi-Fiと危険なフリーWi-Fiは「見分けられない」と回答。さらに、約65%がフリーWi-Fiの利用に不安を感じていると回答している。
</p><p>  こうした環境の変化やユーザの状況を鑑み、フリーWi-Fiプロテクションの提供を開始する。同アプリをインストールすることで利用者は、万が一安全性の低いフリーWi-Fiのアクセスポイントに接続してしまった場合でも、その通信を暗号化でき、通信の盗み見やそれによる情報漏えいのリスクを低減できるようになる。
- </p><p>  具体的には、フリーWi-Fi利用時に、スマートフォンがフリーWi-Fiプロテクションインフラに接続することにより、フリーWi-Fiのアクセスポイントを介した通信がVPN(Virtual Private Network)で暗号化される。これにより利用者は、第三者から通信を傍受されることやデータの情報漏えいを防ぐことが可能。さらに、かんたん自動接続の機能により、通信を暗号化していない安全性が低いフリーWi-Fi接続時や利用者が指定したWi-Fiへ接続する際に、自動的に通信を暗号化し、利用者の通信を保護する。</p><p>  また、フリーWi-Fiプロテクションインフラと、莫大なセキュリティ情報のビッグデータを保有するクラウド型セキュリティ技術基盤「Trend Micro Smart Protection Network」(SPN)が連携することで、フリーWi-Fiプロテクションインフラを経由してインターネットを利用する際に、利用者がフィッシング詐欺サイトや偽サイトなどへの不正サイトへアクセスすることをブロックできるという。</p></div>
- </div> \ No newline at end of file
+ </p><p>  具体的には、フリーWi-Fi利用時に、スマートフォンがフリーWi-Fiプロテクションインフラに接続することにより、フリーWi-Fiのアクセスポイントを介した通信がVPN(Virtual Private Network)で暗号化される。これにより利用者は、第三者から通信を傍受されることやデータの情報漏えいを防ぐことが可能。さらに、かんたん自動接続の機能により、通信を暗号化していない安全性が低いフリーWi-Fi接続時や利用者が指定したWi-Fiへ接続する際に、自動的に通信を暗号化し、利用者の通信を保護する。</p><p>  また、フリーWi-Fiプロテクションインフラと、莫大なセキュリティ情報のビッグデータを保有するクラウド型セキュリティ技術基盤「Trend Micro Smart Protection Network」(SPN)が連携することで、フリーWi-Fiプロテクションインフラを経由してインターネットを利用する際に、利用者がフィッシング詐欺サイトや偽サイトなどへの不正サイトへアクセスすることをブロックできるという。</p></div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html
index f4ae9daac..dba688f1f 100644
--- a/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html
+++ b/plugins/af_readability/vendor/fivefilters/readability.php/test/test-pages/youth/expected.html
@@ -1,8 +1,5 @@
-<div>
- <div id="content">
- <div id="container">
- <div>
- <p><img alt="海外留学生看两会:出国前后关注点大不同" height="269" oldsrc="W020170310313653868929.jpg" src="http://fakehost/test/W020170310313653868929.jpg" title="海外留学生看两会:出国前后关注点大不同" width="400"></img></p>
+<div id="content">
+ <p><img title="海外留学生看两会:出国前后关注点大不同" alt="海外留学生看两会:出国前后关注点大不同" src="http://fakehost/test/W020170310313653868929.jpg" oldsrc="W020170310313653868929.jpg" height="269" width="400"></p>
<p>图为马素湘在澳大利亚悉尼游玩时的近影。</p>
<p>  <strong>出国前后关注点大不同</strong></p>
<p>  <strong>出国前:政治科目会出啥考题?</strong></p>
@@ -12,7 +9,7 @@
<p>   无独有偶,英国剑桥大学的李博灏也有着类似的经历。他表示,在国内读本科时,虽然关注过两会,但并不像现在这样,将关注点放在国家社会经济迫切需要解决的难题与问题上。“出国前更关心与我们学生的实际问题以及切身利益相关的议题,比如奖学金、助学金的发放与申请;相关工作行业就业前景等。”</p>
<p>   在英国求学6年后,李博灏希望能够学有所用,为国家发展过程中遇到的难题寻求解决办法。因此随着课题研究的深入,他更加关注国家和社会目前所面临的挑战,比如中等收入陷阱、供给侧改革、创意创新产业的发展等议题。</p>
<p>   还有一些学子表示,出国前对两会不太了解,出国后反而对两会热点多了些思考。在澳大利亚墨尔本留学的马素湘说:“想不关注都难啊!刷微博看新闻到处都是两会的消息。而且我现在学的是新闻专业,对世界发生的大小事都会留意。随着年龄、阅历增长,家国情怀也渐长,会关心国家发展的各方面问题。”</p>
- <p><img alt="" oldsrc="W020170310313654043127.jpg" src="http://fakehost/test/W020170310313654043127.jpg"></img></p>
+ <p><img src="http://fakehost/test/W020170310313654043127.jpg" alt oldsrc="W020170310313654043127.jpg"></p>
<p>图为李博灏在瑞士日内日瓦联合国欧洲总部的近影。</p>
<p>  <strong>关注点多与所学专业相关</strong></p>
<p>  <strong>法学专业热议法定婚龄</strong> <strong>很多人关心供给侧改革</strong></p>
@@ -20,7 +17,7 @@
<p>   对此提案,卢宇有着自己的看法,“百花齐放的局面固然可喜,但也不能一哄而上,国家应该提高行业准入门槛,完善新能源汽车准入管理规则,从源头上进行制度创新,将一些不具备新能源汽车生产资质的厂家淘汰出局,并高度关注电池系统安全问题,严格执行充电桩生产的国际标准。”</p>
<p>   马素湘表示,“出国读研之前,我在国内学习法学,因此对相关的问题比较感兴趣。今年两会上人大代表黄细花提出把法定婚龄降低到18岁的提案;而在微博的热搜榜上,一本儿童性教育读物引起了极大的争议。我认为降低婚龄并不适合我国国情。因为性教育的缺乏导致我国大部分人在18岁之前没有接受过完整的性教育,思想行动上也不够成熟,如何能够对自己的人生和自己的另一半负责?所以我希望能有人大代表提议在国民儿童阶段完善我国的性教育,而不是为了鼓励生育将法定婚龄提前。”</p>
<p>   李博灏是英国剑桥大学制造业研究所创新设计管理中心的一名博士。他格外关注的话题是供给侧结构性改革,知识产权保护,消费升级等议题。“我的博士研究课题是关于推动创新设计密集型产业的发展从而帮助中等收入国家克服中等收入陷阱的探索,因此一直十分关注国内关于供给侧改革的相关议题。通过本届两会对于该议题的进一步关注,我希望可以有效地帮助我了解供给侧改革与中等收入陷阱问题目前的发展状况以及解决情况;也希望可以与更多的机构取得联系,并帮助他们了解该议题最前沿的研究与解决方案。”</p>
- <p><img alt="" oldsrc="W020170310313654453091.jpg" src="http://fakehost/test/W020170310313654453091.jpg"></img></p>
+ <p><img src="http://fakehost/test/W020170310313654453091.jpg" alt oldsrc="W020170310313654453091.jpg"></p>
<p>图为卢宇与祖国五星红旗和联合国会旗的合影。</p>
<p>  <strong> 两会成为了解国情的窗口</strong></p>
<p>  <strong> 盼准确把握国家发展需求 愿寻求机遇回国有所作为</strong></p>
@@ -30,7 +27,4 @@
<p>   在两会上,全国政协委员张近东提出“当前中国经济的发展正在从数量型向质量型转变,消费升级将成为企业新一轮创新发展的动力。”对此,李博灏认为这也是他关注的问题。他认为:“在消费市场持续扩大的大环境下,如何能够通过促进创新设计产业的发展以及消费品品质的提升,推动国内消费增长并促进其在可持续经济增长中的作用,是一个迫切需要解决的问题。在当前供给侧改革的大环境下,消费升级的重要性越发突显。”</p>
<p>   作为两会的资深粉,卢宇聊起两会话题充满了期待。“今年是国家‘十三五’规划的关键时期,‘一带一路’建设也在如火如荼地进行中。作为一名中国留学生,我一直都关注着能在哪些领域为国家、为中外合作共赢做出贡献。‘大众创业、万众创新’提出有几年了。全国各省市在吸引留学人才归国创业就业方面纷纷提出了各种优惠政策,但目前大都集中在沿海发达省份,而且主要惠及理工科博士,政策覆盖面还不够广。期待从国家层面设立工作组加强留学人才的统筹协调,完善顶层设计。人文社科类留学人才是未来国家智库的重要后备力量,也应该适当加强对他们的政策鼓励,更好地服务于‘一带一路’国家战略。”</p>
<p>   卢宇还认为两会应该增设学子代表,列席旁听两会,拓展留学生参政议政渠道。“我相信优秀留学生的国际化视野必将为家乡建设带来新的思路,增添新的活力。”卢宇恳切地说。</p>
- </div>
- </div>
- </div>
- </div> \ No newline at end of file
+ </div> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/LICENSE b/plugins/af_readability/vendor/league/uri-interfaces/LICENSE
new file mode 100644
index 000000000..14c82cd5b
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 ignace nyamagana butera
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/composer.json b/plugins/af_readability/vendor/league/uri-interfaces/composer.json
new file mode 100644
index 000000000..fc34cfe30
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/composer.json
@@ -0,0 +1,68 @@
+{
+ "name": "league/uri-interfaces",
+ "description" : "Common interface for URI representation",
+ "keywords": [
+ "url",
+ "uri",
+ "rfc3986",
+ "rfc3987"
+ ],
+ "license": "MIT",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "authors": [
+ {
+ "name" : "Ignace Nyamagana Butera",
+ "email" : "[email protected]",
+ "homepage" : "https://nyamsprod.com"
+ }
+ ],
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nyamsprod"
+ }
+ ],
+ "require": {
+ "php" : "^7.2 || ^8.0",
+ "ext-json": "*"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "scripts": {
+ "phpunit": "phpunit --coverage-text",
+ "phpcs": "php-cs-fixer fix --dry-run --diff -vvv --allow-risky=yes --ansi",
+ "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi",
+ "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit 192M",
+ "test": [
+ "@phpunit",
+ "@phpstan",
+ "@phpcs:fix"
+ ]
+ },
+ "scripts-descriptions": {
+ "phpunit": "Runs package test suite",
+ "phpstan": "Runs complete codebase static analysis",
+ "phpcs": "Runs coding style testing",
+ "phpcs:fix": "Fix coding style issues",
+ "test": "Runs all tests"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php
new file mode 100644
index 000000000..ed6c2b8d3
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/AuthorityInterface.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface AuthorityInterface extends UriComponentInterface
+{
+ /**
+ * Returns the host component of the authority.
+ */
+ public function getHost(): ?string;
+
+ /**
+ * Returns the port component of the authority.
+ */
+ public function getPort(): ?int;
+
+ /**
+ * Returns the user information component of the authority.
+ */
+ public function getUserInfo(): ?string;
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * A null value provided for the host is equivalent to removing the host
+ * information.
+ *
+ * @param ?string $host
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withHost(?string $host): self;
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param ?int $port
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPort(?int $port): self;
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; a null value for the user is equivalent to removing user
+ * information.
+ *
+ * @param ?string $user
+ * @param ?string $password
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withUserInfo(?string $user, ?string $password = null): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php
new file mode 100644
index 000000000..1e4f38566
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DataPathInterface.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface DataPathInterface extends PathInterface
+{
+ /**
+ * Retrieve the data mime type associated to the URI.
+ *
+ * If no mimetype is present, this method MUST return the default mimetype 'text/plain'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-2
+ */
+ public function getMimeType(): string;
+
+ /**
+ * Retrieve the parameters associated with the Mime Type of the URI.
+ *
+ * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-2
+ */
+ public function getParameters(): string;
+
+ /**
+ * Retrieve the mediatype associated with the URI.
+ *
+ * If no mediatype is present, this method MUST return the default parameter 'text/plain;charset=US-ASCII'.
+ *
+ * @see http://tools.ietf.org/html/rfc2397#section-3
+ *
+ * @return string The URI scheme.
+ */
+ public function getMediaType(): string;
+
+ /**
+ * Retrieves the data string.
+ *
+ * Retrieves the data part of the path. If no data part is provided return
+ * a empty string
+ */
+ public function getData(): string;
+
+ /**
+ * Tells whether the data is binary safe encoded.
+ */
+ public function isBinaryData(): bool;
+
+ /**
+ * Save the data to a specific file.
+ */
+ public function save(string $path, string $mode = 'w'): \SplFileObject;
+
+ /**
+ * Returns an instance where the data part is base64 encoded.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance where the data part is base64 encoded
+ */
+ public function toBinary(): self;
+
+ /**
+ * Returns an instance where the data part is url encoded following RFC3986 rules.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance where the data part is url encoded
+ */
+ public function toAscii(): self;
+
+ /**
+ * Return an instance with the specified mediatype parameters.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified mediatype parameters.
+ *
+ * Users must provide encoded characters.
+ *
+ * An empty parameters value is equivalent to removing the parameter.
+ */
+ public function withParameters(string $parameters): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php
new file mode 100644
index 000000000..2490310f1
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/DomainHostInterface.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+/**
+ * @extends \IteratorAggregate<string>
+ */
+interface DomainHostInterface extends \Countable, HostInterface, \IteratorAggregate
+{
+ /**
+ * Returns the labels total number.
+ */
+ public function count(): int;
+
+ /**
+ * Iterate over the Domain labels.
+ *
+ * @return \Iterator<string>
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Retrieves a single host label.
+ *
+ * If the label offset has not been set, returns the null value.
+ */
+ public function get(int $offset): ?string;
+
+ /**
+ * Returns the associated key for a specific label or all the keys.
+ *
+ * @param ?string $label
+ *
+ * @return int[]
+ */
+ public function keys(?string $label = null): array;
+
+ /**
+ * Tells whether the domain is absolute.
+ */
+ public function isAbsolute(): bool;
+
+ /**
+ * Prepends a label to the host.
+ */
+ public function prepend(string $label): self;
+
+ /**
+ * Appends a label to the host.
+ */
+ public function append(string $label): self;
+
+ /**
+ * Returns an instance with its Root label.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function withRootLabel(): self;
+
+ /**
+ * Returns an instance without its Root label.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function withoutRootLabel(): self;
+
+ /**
+ * Returns an instance with the modified label.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the new label
+ *
+ * If $key is non-negative, the added label will be the label at $key position from the start.
+ * If $key is negative, the added label will be the label at $key position from the end.
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withLabel(int $key, string $label): self;
+
+ /**
+ * Returns an instance without the specified label.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * If $key is non-negative, the removed label will be the label at $key position from the start.
+ * If $key is negative, the removed label will be the label at $key position from the end.
+ *
+ * @param int ...$keys
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withoutLabel(int ...$keys): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php
new file mode 100644
index 000000000..3d80f0661
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/FragmentInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface FragmentInterface extends UriComponentInterface
+{
+ /**
+ * Returns the decoded fragment.
+ */
+ public function decoded(): ?string;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/HostInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/HostInterface.php
new file mode 100644
index 000000000..a8b8bb350
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/HostInterface.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface HostInterface extends UriComponentInterface
+{
+ /**
+ * Returns the ascii representation.
+ */
+ public function toAscii(): ?string;
+
+ /**
+ * Returns the unicode representation.
+ */
+ public function toUnicode(): ?string;
+
+ /**
+ * Returns the IP version.
+ *
+ * If the host is a not an IP this method will return null
+ */
+ public function getIpVersion(): ?string;
+
+ /**
+ * Returns the IP component If the Host is an IP address.
+ *
+ * If the host is a not an IP this method will return null
+ */
+ public function getIp(): ?string;
+
+ /**
+ * Tells whether the host is a domain name.
+ */
+ public function isDomain(): bool;
+
+ /**
+ * Tells whether the host is an IP Address.
+ */
+ public function isIp(): bool;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php
new file mode 100644
index 000000000..1e2242ab5
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/IpHostInterface.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface IpHostInterface extends HostInterface
+{
+ /**
+ * Returns whether or not the host is an IPv4 address.
+ */
+ public function isIpv4(): bool;
+ /**
+ * Returns whether or not the host is an IPv6 address.
+ */
+ public function isIpv6(): bool;
+
+ /**
+ * Returns whether or not the host is an IPv6 address.
+ */
+ public function isIpFuture(): bool;
+
+ /**
+ * Returns whether or not the host has a ZoneIdentifier.
+ *
+ * @see http://tools.ietf.org/html/rfc6874#section-4
+ */
+ public function hasZoneIdentifier(): bool;
+
+ /**
+ * Returns an host without its zone identifier according to RFC6874.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance without the host zone identifier according to RFC6874
+ *
+ * @see http://tools.ietf.org/html/rfc6874#section-4
+ */
+ public function withoutZoneIdentifier(): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PathInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PathInterface.php
new file mode 100644
index 000000000..389c0ff0d
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PathInterface.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+interface PathInterface extends UriComponentInterface
+{
+ /**
+ * Returns the decoded path.
+ */
+ public function decoded(): string;
+
+ /**
+ * Returns whether or not the path is absolute or relative.
+ */
+ public function isAbsolute(): bool;
+
+ /**
+ * Returns whether or not the path has a trailing delimiter.
+ */
+ public function hasTrailingSlash(): bool;
+
+ /**
+ * Returns an instance without dot segments.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component normalized by removing
+ * the dot segment.
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutDotSegments(): self;
+
+ /**
+ * Returns an instance with a leading slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component with a leading slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withLeadingSlash(): self;
+
+ /**
+ * Returns an instance without a leading slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component without a leading slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutLeadingSlash(): self;
+
+ /**
+ * Returns an instance with a trailing slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component with a trailing slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withTrailingSlash(): self;
+
+ /**
+ * Returns an instance without a trailing slash.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component without a trailing slash
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withoutTrailingSlash(): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PortInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PortInterface.php
new file mode 100644
index 000000000..7230c4ad1
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/PortInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface PortInterface extends UriComponentInterface
+{
+ /**
+ * Returns the integer representation of the Port.
+ */
+ public function toInt(): ?int;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php
new file mode 100644
index 000000000..f7081ea25
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/QueryInterface.php
@@ -0,0 +1,227 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+/**
+ * @extends \IteratorAggregate<array{0:string, 1:string|null}>
+ */
+interface QueryInterface extends \Countable, \IteratorAggregate, UriComponentInterface
+{
+ /**
+ * Returns the query separator.
+ */
+ public function getSeparator(): string;
+
+ /**
+ * Returns the number of key/value pairs present in the object.
+ */
+ public function count(): int;
+
+ /**
+ * Returns an iterator allowing to go through all key/value pairs contained in this object.
+ *
+ * The pair is represented as an array where the first value is the pair key
+ * and the second value the pair value.
+ *
+ * The key of each pair is a string
+ * The value of each pair is a scalar or the null value
+ *
+ * @return \Iterator<int, array{0:string, 1:string|null}>
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Returns an iterator allowing to go through all key/value pairs contained in this object.
+ *
+ * The return type is as a Iterator where its offset is the pair key and its value the pair value.
+ *
+ * The key of each pair is a string
+ * The value of each pair is a scalar or the null value
+ *
+ * @return iterable<string, string|null>
+ */
+ public function pairs(): iterable;
+
+ /**
+ * Tells whether a pair with a specific name exists.
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has
+ */
+ public function has(string $key): bool;
+
+ /**
+ * Returns the first value associated to the given pair name.
+ *
+ * If no value is found null is returned
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-get
+ */
+ public function get(string $key): ?string;
+
+ /**
+ * Returns all the values associated to the given pair name as an array or all
+ * the instance pairs.
+ *
+ * If no value is found an empty array is returned
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall
+ *
+ * @return array<int, string|null>
+ */
+ public function getAll(string $key): array;
+
+ /**
+ * Returns the store PHP variables as elements of an array.
+ *
+ * The result is similar as PHP parse_str when used with its
+ * second argument with the difference that variable names are
+ * not mangled.
+ *
+ * If a key is submitted it will returns the value attached to it or null
+ *
+ * @see http://php.net/parse_str
+ * @see https://wiki.php.net/rfc/on_demand_name_mangling
+ *
+ * @param ?string $key
+ * @return mixed the collection of stored PHP variables or the empty array if no input is given,
+ * the single value of a stored PHP variable or null if the variable is not present in the collection
+ */
+ public function params(?string $key = null);
+
+ /**
+ * Returns the RFC1738 encoded query.
+ */
+ public function toRFC1738(): ?string;
+
+ /**
+ * Returns the RFC3986 encoded query.
+ *
+ * @see ::getContent
+ */
+ public function toRFC3986(): ?string;
+
+ /**
+ * Returns an instance with a different separator.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component with a different separator
+ */
+ public function withSeparator(string $separator): self;
+
+ /**
+ * Sorts the query string by offset, maintaining offset to data correlations.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort
+ */
+ public function sort(): self;
+
+ /**
+ * Returns an instance without duplicate key/value pair.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized by removing
+ * duplicate pairs whose key/value are the same.
+ */
+ public function withoutDuplicates(): self;
+
+ /**
+ * Returns an instance without empty key/value where the value is the null value.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized by removing
+ * empty pairs.
+ *
+ * A pair is considered empty if its value is equal to the null value
+ */
+ public function withoutEmptyPairs(): self;
+
+ /**
+ * Returns an instance where numeric indices associated to PHP's array like key are removed.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the query component normalized so that numeric indexes
+ * are removed from the pair key value.
+ *
+ * ie.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar
+ */
+ public function withoutNumericIndices(): self;
+
+ /**
+ * Returns an instance with the a new key/value pair added to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * If the pair already exists the value will replace the existing value.
+ *
+ * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set
+ *
+ * @param ?string $value
+ */
+ public function withPair(string $key, ?string $value): self;
+
+ /**
+ * Returns an instance with the new pairs set to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @see ::withPair
+ */
+ public function merge(string $query): self;
+
+ /**
+ * Returns an instance without the specified keys.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * @param string ...$keys
+ */
+ public function withoutPair(string ...$keys): self;
+
+ /**
+ * Returns a new instance with a specified key/value pair appended as a new pair.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * @param ?string $value
+ */
+ public function appendTo(string $key, ?string $value): self;
+
+ /**
+ * Returns an instance with the new pairs appended to it.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified query
+ *
+ * If the pair already exists the value will be added to it.
+ */
+ public function append(string $query): self;
+
+ /**
+ * Returns an instance without the specified params.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component without PHP's value.
+ * PHP's mangled is not taken into account.
+ *
+ * @param string ...$keys
+ */
+ public function withoutParam(string ...$keys): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php
new file mode 100644
index 000000000..53065fffb
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/SegmentedPathInterface.php
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\SyntaxError;
+
+/**
+ * @extends \IteratorAggregate<string>
+ */
+interface SegmentedPathInterface extends \Countable, \IteratorAggregate, PathInterface
+{
+ /**
+ * Returns the total number of segments in the path.
+ */
+ public function count(): int;
+
+ /**
+ * Iterate over the path segment.
+ *
+ * @return \Iterator<string>
+ */
+ public function getIterator(): \Iterator;
+
+ /**
+ * Returns parent directory's path.
+ */
+ public function getDirname(): string;
+
+ /**
+ * Returns the path basename.
+ */
+ public function getBasename(): string;
+
+ /**
+ * Returns the basename extension.
+ */
+ public function getExtension(): string;
+
+ /**
+ * Retrieves a single path segment.
+ *
+ * If the segment offset has not been set, returns null.
+ */
+ public function get(int $offset): ?string;
+
+ /**
+ * Returns the associated key for a specific segment.
+ *
+ * If a value is specified only the keys associated with
+ * the given value will be returned
+ *
+ * @param ?string $segment
+ *
+ * @return int[]
+ */
+ public function keys(?string $segment = null): array;
+
+ /**
+ * Appends a segment to the path.
+ */
+ public function append(string $segment): self;
+
+ /**
+ * Prepends a segment to the path.
+ */
+ public function prepend(string $segment): self;
+
+ /**
+ * Returns an instance with the modified segment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the new segment
+ *
+ * If $key is non-negative, the added segment will be the segment at $key position from the start.
+ * If $key is negative, the added segment will be the segment at $key position from the end.
+ *
+ * @param ?string $segment
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withSegment(int $key, ?string $segment): self;
+
+ /**
+ * Returns an instance without the specified segment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified component
+ *
+ * If $key is non-negative, the removed segment will be the segment at $key position from the start.
+ * If $key is negative, the removed segment will be the segment at $key position from the end.
+ *
+ * @param int ...$keys remaining keys to remove
+ *
+ * @throws SyntaxError If the key is invalid
+ */
+ public function withoutSegment(int ...$keys): self;
+
+ /**
+ * Returns an instance without duplicate delimiters.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the path component normalized by removing
+ * multiple consecutive empty segment
+ */
+ public function withoutEmptySegments(): self;
+
+ /**
+ * Returns an instance with the specified parent directory's path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $path
+ */
+ public function withDirname(?string $path): self;
+
+ /**
+ * Returns an instance with the specified basename.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $basename
+ */
+ public function withBasename(?string $basename): self;
+
+ /**
+ * Returns an instance with the specified basename extension.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the extension basename modified.
+ *
+ * @param ?string $extension
+ */
+ public function withExtension(?string $extension): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php
new file mode 100644
index 000000000..c7b39bb50
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriComponentInterface.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface UriComponentInterface extends \JsonSerializable
+{
+ /**
+ * Returns the instance content.
+ *
+ * If the instance is defined, the value returned MUST be encoded according to the
+ * selected encoding algorithm. In any case, the value MUST NOT double-encode any character
+ * depending on the selected encoding algorithm.
+ *
+ * To determine what characters to encode, please refer to RFC 3986, Sections 2 and 3.
+ * or RFC 3987 Section 3. By default the content is encoded according to RFC3986
+ *
+ * If the instance is not defined null is returned
+ */
+ public function getContent(): ?string;
+
+ /**
+ * Returns the instance string representation.
+ *
+ * If the instance is defined, the value returned MUST be percent-encoded,
+ * but MUST NOT double-encode any characters. To determine what characters
+ * to encode, please refer to RFC 3986, Sections 2 and 3.
+ *
+ * If the instance is not defined an empty string is returned
+ */
+ public function __toString(): string;
+
+ /**
+ * Returns the instance json representation.
+ *
+ * If the instance is defined, the value returned MUST be percent-encoded,
+ * but MUST NOT double-encode any characters. To determine what characters
+ * to encode, please refer to RFC 3986 or RFC 1738.
+ *
+ * If the instance is not defined null is returned
+ */
+ public function jsonSerialize(): ?string;
+
+ /**
+ * Returns the instance string representation with its optional URI delimiters.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode any
+ * characters. To determine what characters to encode, please refer to RFC 3986,
+ * Sections 2 and 3.
+ *
+ * If the instance is not defined an empty string is returned
+ */
+ public function getUriComponent(): string;
+
+ /**
+ * Returns an instance with the specified content.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified content.
+ *
+ * Users can provide both encoded and decoded content characters.
+ *
+ * A null value is equivalent to removing the component content.
+ *
+ *
+ * @param ?string $content
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withContent(?string $content): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriException.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriException.php
new file mode 100644
index 000000000..c0fec2a12
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriException.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use Throwable;
+
+interface UriException extends Throwable
+{
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriInterface.php
new file mode 100644
index 000000000..b6eb6a1f8
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UriInterface.php
@@ -0,0 +1,292 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+
+interface UriInterface extends \JsonSerializable
+{
+ /**
+ * Returns the string representation as a URI reference.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ */
+ public function __toString(): string;
+
+ /**
+ * Returns the string representation as a URI reference.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ * @see ::__toString
+ */
+ public function jsonSerialize(): string;
+
+ /**
+ * Retrieve the scheme component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.1.
+ *
+ * The trailing ":" character is not part of the scheme and MUST NOT be
+ * added.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ public function getScheme(): ?string;
+
+ /**
+ * Retrieve the authority component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * If the port component is not set or is the standard port for the current
+ * scheme, it SHOULD NOT be included.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2
+ */
+ public function getAuthority(): ?string;
+
+ /**
+ * Retrieve the user information component of the URI.
+ *
+ * If no scheme is present, this method MUST return a null value.
+ *
+ * If a user is present in the URI, this will return that value;
+ * additionally, if the password is also present, it will be appended to the
+ * user value, with a colon (":") separating the values.
+ *
+ * The trailing "@" character is not part of the user information and MUST
+ * NOT be added.
+ */
+ public function getUserInfo(): ?string;
+
+ /**
+ * Retrieve the host component of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.2.2.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ public function getHost(): ?string;
+
+ /**
+ * Retrieve the port component of the URI.
+ *
+ * If a port is present, and it is non-standard for the current scheme,
+ * this method MUST return it as an integer. If the port is the standard port
+ * used with the current scheme, this method SHOULD return null.
+ *
+ * If no port is present, and no scheme is present, this method MUST return
+ * a null value.
+ *
+ * If no port is present, but a scheme is present, this method MAY return
+ * the standard port for that scheme, but SHOULD return null.
+ */
+ public function getPort(): ?int;
+
+ /**
+ * Retrieve the path component of the URI.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Normally, the empty path "" and absolute path "/" are considered equal as
+ * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+ * do this normalization because in contexts with a trimmed base path, e.g.
+ * the front controller, this difference becomes significant. It's the task
+ * of the user to handle both "" and "/".
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.3.
+ *
+ * As an example, if the value should include a slash ("/") not intended as
+ * delimiter between path segments, that value MUST be passed in encoded
+ * form (e.g., "%2F") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.3
+ */
+ public function getPath(): string;
+
+ /**
+ * Retrieve the query string of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The leading "?" character is not part of the query and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.4.
+ *
+ * As an example, if a value in a key/value pair of the query string should
+ * include an ampersand ("&") not intended as a delimiter between values,
+ * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.4
+ */
+ public function getQuery(): ?string;
+
+ /**
+ * Retrieve the fragment component of the URI.
+ *
+ * If no host is present this method MUST return a null value.
+ *
+ * The leading "#" character is not part of the fragment and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.5.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.5
+ */
+ public function getFragment(): ?string;
+
+ /**
+ * Return an instance with the specified scheme.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified scheme.
+ *
+ * A null value provided for the scheme is equivalent to removing the scheme
+ * information.
+ *
+ * @param ?string $scheme
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withScheme(?string $scheme): self;
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; a null value for the user is equivalent to removing user
+ * information.
+ *
+ * @param ?string $user
+ * @param ?string $password
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withUserInfo(?string $user, ?string $password = null): self;
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * A null value provided for the host is equivalent to removing the host
+ * information.
+ *
+ * @param ?string $host
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ * @throws IdnSupportMissing for component or transformations
+ * requiring IDN support when IDN support is not present
+ * or misconfigured.
+ */
+ public function withHost(?string $host): self;
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param ?int $port
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPort(?int $port): self;
+
+ /**
+ * Return an instance with the specified path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified path.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Users can provide both encoded and decoded path characters.
+ * Implementations ensure the correct encoding as outlined in getPath().
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withPath(string $path): self;
+
+ /**
+ * Return an instance with the specified query string.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified query string.
+ *
+ * Users can provide both encoded and decoded query characters.
+ * Implementations ensure the correct encoding as outlined in getQuery().
+ *
+ * A null value provided for the query is equivalent to removing the query
+ * information.
+ *
+ * @param ?string $query
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withQuery(?string $query): self;
+
+ /**
+ * Return an instance with the specified URI fragment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified URI fragment.
+ *
+ * Users can provide both encoded and decoded fragment characters.
+ * Implementations ensure the correct encoding as outlined in getFragment().
+ *
+ * A null value provided for the fragment is equivalent to removing the fragment
+ * information.
+ *
+ * @param ?string $fragment
+ *
+ * @throws SyntaxError for invalid component or transformations
+ * that would result in a object in invalid state.
+ */
+ public function withFragment(?string $fragment): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php
new file mode 100644
index 000000000..6411f9b6d
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Contracts/UserInfoInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Contracts;
+
+interface UserInfoInterface extends UriComponentInterface
+{
+ /**
+ * Returns the user component part.
+ */
+ public function getUser(): ?string;
+
+ /**
+ * Returns the pass component part.
+ */
+ public function getPass(): ?string;
+
+ /**
+ * Returns an instance with the specified user and/or pass.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user.
+ *
+ * An empty user is equivalent to removing the user information.
+ *
+ * @param ?string $user
+ * @param ?string $pass
+ */
+ public function withUserInfo(?string $user, ?string $pass = null): self;
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php
new file mode 100644
index 000000000..0105b2dad
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/FileinfoSupportMissing.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class FileinfoSupportMissing extends \RuntimeException implements UriException
+{
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php
new file mode 100644
index 000000000..8ff3b538c
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnSupportMissing.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class IdnSupportMissing extends \RuntimeException implements UriException
+{
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php
new file mode 100644
index 000000000..80259f3ba
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/IdnaConversionFailed.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Idna\IdnaInfo;
+
+final class IdnaConversionFailed extends SyntaxError
+{
+ /** @var IdnaInfo|null */
+ private $idnaInfo;
+
+ private function __construct(string $message, IdnaInfo $idnaInfo = null)
+ {
+ parent::__construct($message);
+ $this->idnaInfo = $idnaInfo;
+ }
+
+ public static function dueToIDNAError(string $domain, IdnaInfo $idnaInfo): self
+ {
+ return new self(
+ 'The host `'.$domain.'` is invalid : '.implode(', ', $idnaInfo->errorList()).' .',
+ $idnaInfo
+ );
+ }
+
+ public static function dueToInvalidHost(string $domain): self
+ {
+ return new self('The host `'.$domain.'` is not a valid IDN host');
+ }
+
+ public function idnaInfo(): ?IdnaInfo
+ {
+ return $this->idnaInfo;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php
new file mode 100644
index 000000000..1b5e4cbd8
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Exceptions/SyntaxError.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use League\Uri\Contracts\UriException;
+
+class SyntaxError extends \InvalidArgumentException implements UriException
+{
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/Idna.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/Idna.php
new file mode 100644
index 000000000..593068742
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/Idna.php
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Idna;
+
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use function defined;
+use function function_exists;
+use function idn_to_ascii;
+use function idn_to_utf8;
+use function rawurldecode;
+use const INTL_IDNA_VARIANT_UTS46;
+
+/**
+ * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html
+ */
+final class Idna
+{
+ private const REGEXP_IDNA_PATTERN = '/[^\x20-\x7f]/';
+ private const MAX_DOMAIN_LENGTH = 253;
+ private const MAX_LABEL_LENGTH = 63;
+
+ /**
+ * General registered name regular expression.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @see https://regex101.com/r/fptU8V/1
+ */
+ private const REGEXP_REGISTERED_NAME = '/
+ (?(DEFINE)
+ (?<unreserved>[a-z0-9_~\-]) # . is missing as it is used to separate labels
+ (?<sub_delims>[!$&\'()*+,;=])
+ (?<encoded>%[A-F0-9]{2})
+ (?<reg_name>(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*)
+ )
+ ^(?:(?&reg_name)\.)*(?&reg_name)\.?$
+ /ix';
+
+ /**
+ * IDNA options.
+ */
+ public const IDNA_DEFAULT = 0;
+ public const IDNA_ALLOW_UNASSIGNED = 1;
+ public const IDNA_USE_STD3_RULES = 2;
+ public const IDNA_CHECK_BIDI = 4;
+ public const IDNA_CHECK_CONTEXTJ = 8;
+ public const IDNA_NONTRANSITIONAL_TO_ASCII = 0x10;
+ public const IDNA_NONTRANSITIONAL_TO_UNICODE = 0x20;
+ public const IDNA_CHECK_CONTEXTO = 0x40;
+
+ /**
+ * IDNA errors.
+ */
+ public const ERROR_NONE = 0;
+ public const ERROR_EMPTY_LABEL = 1;
+ public const ERROR_LABEL_TOO_LONG = 2;
+ public const ERROR_DOMAIN_NAME_TOO_LONG = 4;
+ public const ERROR_LEADING_HYPHEN = 8;
+ public const ERROR_TRAILING_HYPHEN = 0x10;
+ public const ERROR_HYPHEN_3_4 = 0x20;
+ public const ERROR_LEADING_COMBINING_MARK = 0x40;
+ public const ERROR_DISALLOWED = 0x80;
+ public const ERROR_PUNYCODE = 0x100;
+ public const ERROR_LABEL_HAS_DOT = 0x200;
+ public const ERROR_INVALID_ACE_LABEL = 0x400;
+ public const ERROR_BIDI = 0x800;
+ public const ERROR_CONTEXTJ = 0x1000;
+ public const ERROR_CONTEXTO_PUNCTUATION = 0x2000;
+ public const ERROR_CONTEXTO_DIGITS = 0x4000;
+
+ /**
+ * IDNA default options.
+ */
+ public const IDNA2008_ASCII = self::IDNA_NONTRANSITIONAL_TO_ASCII
+ | self::IDNA_CHECK_BIDI
+ | self::IDNA_USE_STD3_RULES
+ | self::IDNA_CHECK_CONTEXTJ;
+ public const IDNA2008_UNICODE = self::IDNA_NONTRANSITIONAL_TO_UNICODE
+ | self::IDNA_CHECK_BIDI
+ | self::IDNA_USE_STD3_RULES
+ | self::IDNA_CHECK_CONTEXTJ;
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private static function supportsIdna(): void
+ {
+ static $idnSupport;
+ if (null === $idnSupport) {
+ $idnSupport = function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46');
+ }
+
+ if (!$idnSupport) {
+ throw new IdnSupportMissing('IDN host can not be processed. Verify that ext/intl is installed for IDN support and that ICU is at least version 4.6.');
+ }
+ }
+
+ /**
+ * Converts the input to its IDNA ASCII form.
+ *
+ * This method returns the string converted to IDN ASCII form
+ *
+ * @throws SyntaxError if the string can not be converted to ASCII using IDN UTS46 algorithm
+ */
+ public static function toAscii(string $domain, int $options): IdnaInfo
+ {
+ $domain = rawurldecode($domain);
+
+ if (1 === preg_match(self::REGEXP_IDNA_PATTERN, $domain)) {
+ self::supportsIdna();
+
+ /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo);
+ if ([] === $idnaInfo) {
+ return IdnaInfo::fromIntl([
+ 'result' => strtolower($domain),
+ 'isTransitionalDifferent' => false,
+ 'errors' => self::validateDomainAndLabelLength($domain),
+ ]);
+ }
+
+ /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ return IdnaInfo::fromIntl($idnaInfo);
+ }
+
+ $error = self::ERROR_NONE;
+ if (1 !== preg_match(self::REGEXP_REGISTERED_NAME, $domain)) {
+ $error |= self::ERROR_DISALLOWED;
+ }
+
+ return IdnaInfo::fromIntl([
+ 'result' => strtolower($domain),
+ 'isTransitionalDifferent' => false,
+ 'errors' => self::validateDomainAndLabelLength($domain) | $error,
+ ]);
+ }
+
+ /**
+ * Converts the input to its IDNA UNICODE form.
+ *
+ * This method returns the string converted to IDN UNICODE form
+ *
+ * @throws SyntaxError if the string can not be converted to UNICODE using IDN UTS46 algorithm
+ */
+ public static function toUnicode(string $domain, int $options): IdnaInfo
+ {
+ $domain = rawurldecode($domain);
+
+ if (false === stripos($domain, 'xn--')) {
+ return IdnaInfo::fromIntl(['result' => $domain, 'isTransitionalDifferent' => false, 'errors' => self::ERROR_NONE]);
+ }
+
+ self::supportsIdna();
+
+ /* @param-out array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ idn_to_utf8($domain, $options, INTL_IDNA_VARIANT_UTS46, $idnaInfo);
+ if ([] === $idnaInfo) {
+ throw IdnaConversionFailed::dueToInvalidHost($domain);
+ }
+
+ /* @var array{errors: int, isTransitionalDifferent: bool, result: string} $idnaInfo */
+ return IdnaInfo::fromIntl($idnaInfo);
+ }
+
+ /**
+ * Adapted from https://github.com/TRowbotham/idna.
+ *
+ * @see https://github.com/TRowbotham/idna/blob/master/src/Idna.php#L236
+ */
+ private static function validateDomainAndLabelLength(string $domain): int
+ {
+ $error = self::ERROR_NONE;
+ $labels = explode('.', $domain);
+ $maxDomainSize = self::MAX_DOMAIN_LENGTH;
+ $length = count($labels);
+
+ // If the last label is empty and it is not the first label, then it is the root label.
+ // Increase the max size by 1, making it 254, to account for the root label's "."
+ // delimiter. This also means we don't need to check the last label's length for being too
+ // long.
+ if ($length > 1 && $labels[$length - 1] === '') {
+ ++$maxDomainSize;
+ array_pop($labels);
+ }
+
+ if (strlen($domain) > $maxDomainSize) {
+ $error |= self::ERROR_DOMAIN_NAME_TOO_LONG;
+ }
+
+ foreach ($labels as $label) {
+ if (strlen($label) > self::MAX_LABEL_LENGTH) {
+ $error |= self::ERROR_LABEL_TOO_LONG;
+
+ break;
+ }
+ }
+
+ return $error;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php b/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php
new file mode 100644
index 000000000..73610a28d
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri-interfaces/src/Idna/IdnaInfo.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Idna;
+
+use function array_filter;
+use const ARRAY_FILTER_USE_KEY;
+
+/**
+ * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html
+ */
+final class IdnaInfo
+{
+ private const ERRORS = [
+ Idna::ERROR_EMPTY_LABEL => 'a non-final domain name label (or the whole domain name) is empty',
+ Idna::ERROR_LABEL_TOO_LONG => 'a domain name label is longer than 63 bytes',
+ Idna::ERROR_DOMAIN_NAME_TOO_LONG => 'a domain name is longer than 255 bytes in its storage form',
+ Idna::ERROR_LEADING_HYPHEN => 'a label starts with a hyphen-minus ("-")',
+ Idna::ERROR_TRAILING_HYPHEN => 'a label ends with a hyphen-minus ("-")',
+ Idna::ERROR_HYPHEN_3_4 => 'a label contains hyphen-minus ("-") in the third and fourth positions',
+ Idna::ERROR_LEADING_COMBINING_MARK => 'a label starts with a combining mark',
+ Idna::ERROR_DISALLOWED => 'a label or domain name contains disallowed characters',
+ Idna::ERROR_PUNYCODE => 'a label starts with "xn--" but does not contain valid Punycode',
+ Idna::ERROR_LABEL_HAS_DOT => 'a label contains a dot=full stop',
+ Idna::ERROR_INVALID_ACE_LABEL => 'An ACE label does not contain a valid label string',
+ Idna::ERROR_BIDI => 'a label does not meet the IDNA BiDi requirements (for right-to-left characters)',
+ Idna::ERROR_CONTEXTJ => 'a label does not meet the IDNA CONTEXTJ requirements',
+ Idna::ERROR_CONTEXTO_DIGITS => 'a label does not meet the IDNA CONTEXTO requirements for digits',
+ Idna::ERROR_CONTEXTO_PUNCTUATION => 'a label does not meet the IDNA CONTEXTO requirements for punctuation characters. Some punctuation characters "Would otherwise have been DISALLOWED" but are allowed in certain contexts',
+ ];
+
+ /** @var string */
+ private $result;
+
+ /** @var bool */
+ private $isTransitionalDifferent;
+
+ /** @var int */
+ private $errors;
+
+ /**
+ * @var array<int, string>
+ */
+ private $errorList;
+
+ private function __construct(string $result, bool $isTransitionalDifferent, int $errors)
+ {
+ $this->result = $result;
+ $this->errors = $errors;
+ $this->isTransitionalDifferent = $isTransitionalDifferent;
+ $this->errorList = array_filter(
+ self::ERRORS,
+ function (int $error): bool {
+ return 0 !== ($error & $this->errors);
+ },
+ ARRAY_FILTER_USE_KEY
+ );
+ }
+
+ /**
+ * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos
+ */
+ public static function fromIntl(array $infos): self
+ {
+ return new self($infos['result'], $infos['isTransitionalDifferent'], $infos['errors']);
+ }
+
+ /**
+ * @param array{result:string, isTransitionalDifferent:bool, errors:int} $properties
+ */
+ public static function __set_state(array $properties): self
+ {
+ return self::fromIntl($properties);
+ }
+
+ public function result(): string
+ {
+ return $this->result;
+ }
+
+ public function isTransitionalDifferent(): bool
+ {
+ return $this->isTransitionalDifferent;
+ }
+
+ public function errors(): int
+ {
+ return $this->errors;
+ }
+
+ public function error(int $error): ?string
+ {
+ return $this->errorList[$error] ?? null;
+ }
+
+ /**
+ * @return array<int, string>
+ */
+ public function errorList(): array
+ {
+ return $this->errorList;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/LICENSE b/plugins/af_readability/vendor/league/uri/LICENSE
new file mode 100644
index 000000000..3b52528f2
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 ignace nyamagana butera
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/plugins/af_readability/vendor/league/uri/composer.json b/plugins/af_readability/vendor/league/uri/composer.json
new file mode 100644
index 000000000..28edbd845
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/composer.json
@@ -0,0 +1,107 @@
+{
+ "name": "league/uri",
+ "type": "library",
+ "description" : "URI manipulation library",
+ "keywords": [
+ "url",
+ "uri",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "psr-7",
+ "parse_url",
+ "http",
+ "https",
+ "ws",
+ "ftp",
+ "data-uri",
+ "file-uri",
+ "middleware",
+ "parse_str",
+ "query-string",
+ "querystring",
+ "hostname",
+ "uri-template"
+ ],
+ "license": "MIT",
+ "homepage": "https://uri.thephpleague.com",
+ "authors": [
+ {
+ "name" : "Ignace Nyamagana Butera",
+ "email" : "[email protected]",
+ "homepage" : "https://nyamsprod.com"
+ }
+ ],
+ "support": {
+ "forum": "https://thephpleague.slack.com",
+ "docs": "https://uri.thephpleague.com",
+ "issues": "https://github.com/thephpleague/uri/issues"
+ },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nyamsprod"
+ }
+ ],
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "ext-json": "*",
+ "psr/http-message": "^1.0",
+ "league/uri-interfaces": "^2.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v3.3.2",
+ "nyholm/psr7": "^1.5",
+ "php-http/psr7-integration-tests": "^1.1",
+ "phpstan/phpstan": "^1.2.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0.0",
+ "phpstan/phpstan-strict-rules": "^1.1.0",
+ "phpunit/phpunit": "^9.5.10",
+ "psr/http-factory": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "LeagueTest\\Uri\\": "tests"
+ }
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "scripts": {
+ "phpcs": "php-cs-fixer fix -v --diff --dry-run --allow-risky=yes --ansi",
+ "phpcs:fix": "php-cs-fixer fix -vvv --allow-risky=yes --ansi",
+ "phpstan": "phpstan analyse -l max -c phpstan.neon src --ansi --memory-limit=256M",
+ "phpunit": "XDEBUG_MODE=coverage phpunit --coverage-text",
+ "test": [
+ "@phpunit",
+ "@phpstan",
+ "@phpcs"
+ ]
+ },
+ "scripts-descriptions": {
+ "phpcs": "Runs coding style test suite",
+ "phpstan": "Runs complete codebase static analysis",
+ "phpunit": "Runs unit and functional testing",
+ "test": "Runs full test suite"
+ },
+ "suggest": {
+ "league/uri-components" : "Needed to easily manipulate URI objects",
+ "ext-intl" : "Needed to improve host validation",
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "config": {
+ "sort-packages": true
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php b/plugins/af_readability/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php
new file mode 100644
index 000000000..7c24b94c5
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/Exceptions/TemplateCanNotBeExpanded.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\Exceptions;
+
+use InvalidArgumentException;
+use League\Uri\Contracts\UriException;
+
+class TemplateCanNotBeExpanded extends InvalidArgumentException implements UriException
+{
+ public static function dueToUnableToProcessValueListWithPrefix(string $variableName): self
+ {
+ return new self('The ":" modifier can not be applied on "'.$variableName.'" since it is a list of values.');
+ }
+
+ public static function dueToNestedListOfValue(string $variableName): self
+ {
+ return new self('The "'.$variableName.'" can not be a nested list.');
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/Http.php b/plugins/af_readability/vendor/league/uri/src/Http.php
new file mode 100644
index 000000000..daf29c8c0
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/Http.php
@@ -0,0 +1,335 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use JsonSerializable;
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\SyntaxError;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function sprintf;
+
+final class Http implements Psr7UriInterface, JsonSerializable
+{
+ private UriInterface $uri;
+
+ private function __construct(UriInterface $uri)
+ {
+ $this->validate($uri);
+ $this->uri = $uri;
+ }
+
+ /**
+ * Validate the submitted uri against PSR-7 UriInterface.
+ *
+ * @throws SyntaxError if the given URI does not follow PSR-7 UriInterface rules
+ */
+ private function validate(UriInterface $uri): void
+ {
+ $scheme = $uri->getScheme();
+ if (null === $scheme && '' === $uri->getHost()) {
+ throw new SyntaxError(sprintf('an URI without scheme can not contains a empty host string according to PSR-7: %s', (string) $uri));
+ }
+
+ $port = $uri->getPort();
+ if (null !== $port && ($port < 0 || $port > 65535)) {
+ throw new SyntaxError(sprintf('The URI port is outside the established TCP and UDP port ranges: %s', (string) $uri->getPort()));
+ }
+ }
+
+ /**
+ * Static method called by PHP's var export.
+ */
+ public static function __set_state(array $components): self
+ {
+ return new self($components['uri']);
+ }
+
+ /**
+ * Create a new instance from a string.
+ *
+ * @param string|mixed $uri
+ */
+ public static function createFromString($uri = ''): self
+ {
+ return new self(Uri::createFromString($uri));
+ }
+
+ /**
+ * Create a new instance from a hash of parse_url parts.
+ *
+ * @param array $components a hash representation of the URI similar
+ * to PHP parse_url function result
+ */
+ public static function createFromComponents(array $components): self
+ {
+ return new self(Uri::createFromComponents($components));
+ }
+
+ /**
+ * Create a new instance from the environment.
+ */
+ public static function createFromServer(array $server): self
+ {
+ return new self(Uri::createFromServer($server));
+ }
+
+ /**
+ * Create a new instance from a URI and a Base URI.
+ *
+ * The returned URI must be absolute.
+ *
+ * @param mixed $uri the input URI to create
+ * @param mixed $base_uri the base URI used for reference
+ */
+ public static function createFromBaseUri($uri, $base_uri = null): self
+ {
+ return new self(Uri::createFromBaseUri($uri, $base_uri));
+ }
+
+ /**
+ * Create a new instance from a URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri the input URI to create
+ */
+ public static function createFromUri($uri): self
+ {
+ if ($uri instanceof UriInterface) {
+ return new self($uri);
+ }
+
+ return new self(Uri::createFromUri($uri));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getScheme(): string
+ {
+ return (string) $this->uri->getScheme();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAuthority(): string
+ {
+ return (string) $this->uri->getAuthority();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getUserInfo(): string
+ {
+ return (string) $this->uri->getUserInfo();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getHost(): string
+ {
+ return (string) $this->uri->getHost();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPort(): ?int
+ {
+ return $this->uri->getPort();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPath(): string
+ {
+ return $this->uri->getPath();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getQuery(): string
+ {
+ return (string) $this->uri->getQuery();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getFragment(): string
+ {
+ return (string) $this->uri->getFragment();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withScheme($scheme): self
+ {
+ /** @var string $scheme */
+ $scheme = $this->filterInput($scheme);
+ if ('' === $scheme) {
+ $scheme = null;
+ }
+
+ $uri = $this->uri->withScheme($scheme);
+ if ($uri->getScheme() === $this->uri->getScheme()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * Safely stringify input when possible.
+ *
+ * @param mixed $str the value to evaluate as a string
+ *
+ * @throws SyntaxError if the submitted data can not be converted to string
+ *
+ * @return string|mixed
+ */
+ private function filterInput($str)
+ {
+ if (is_scalar($str) || (is_object($str) && method_exists($str, '__toString'))) {
+ return (string) $str;
+ }
+
+ return $str;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withUserInfo($user, $password = null): self
+ {
+ /** @var string $user */
+ $user = $this->filterInput($user);
+ if ('' === $user) {
+ $user = null;
+ }
+
+ $uri = $this->uri->withUserInfo($user, $password);
+ if ($uri->getUserInfo() === $this->uri->getUserInfo()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withHost($host): self
+ {
+ /** @var string $host */
+ $host = $this->filterInput($host);
+ if ('' === $host) {
+ $host = null;
+ }
+
+ $uri = $this->uri->withHost($host);
+ if ($uri->getHost() === $this->uri->getHost()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPort($port): self
+ {
+ $uri = $this->uri->withPort($port);
+ if ($uri->getPort() === $this->uri->getPort()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPath($path): self
+ {
+ $uri = $this->uri->withPath($path);
+ if ($uri->getPath() === $this->uri->getPath()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withQuery($query): self
+ {
+ /** @var string $query */
+ $query = $this->filterInput($query);
+ if ('' === $query) {
+ $query = null;
+ }
+
+ $uri = $this->uri->withQuery($query);
+ if ($uri->getQuery() === $this->uri->getQuery()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withFragment($fragment): self
+ {
+ /** @var string $fragment */
+ $fragment = $this->filterInput($fragment);
+ if ('' === $fragment) {
+ $fragment = null;
+ }
+
+ $uri = $this->uri->withFragment($fragment);
+ if ($uri->getFragment() === $this->uri->getFragment()) {
+ return $this;
+ }
+
+ return new self($uri);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __toString(): string
+ {
+ return $this->uri->__toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function jsonSerialize(): string
+ {
+ return $this->uri->__toString();
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/HttpFactory.php b/plugins/af_readability/vendor/league/uri/src/HttpFactory.php
new file mode 100644
index 000000000..fc3bcfab4
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/HttpFactory.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use Psr\Http\Message\UriFactoryInterface;
+use Psr\Http\Message\UriInterface;
+
+final class HttpFactory implements UriFactoryInterface
+{
+ public function createUri(string $uri = ''): UriInterface
+ {
+ return Http::createFromString($uri);
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/Uri.php b/plugins/af_readability/vendor/league/uri/src/Uri.php
new file mode 100644
index 000000000..421273047
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/Uri.php
@@ -0,0 +1,1333 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use finfo;
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\FileinfoSupportMissing;
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Idna\Idna;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use TypeError;
+use function array_filter;
+use function array_map;
+use function base64_decode;
+use function base64_encode;
+use function count;
+use function explode;
+use function file_get_contents;
+use function filter_var;
+use function implode;
+use function in_array;
+use function inet_pton;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function preg_match;
+use function preg_replace;
+use function preg_replace_callback;
+use function rawurlencode;
+use function sprintf;
+use function str_replace;
+use function strlen;
+use function strpos;
+use function strspn;
+use function strtolower;
+use function substr;
+use const FILEINFO_MIME;
+use const FILTER_FLAG_IPV4;
+use const FILTER_FLAG_IPV6;
+use const FILTER_NULL_ON_FAILURE;
+use const FILTER_VALIDATE_BOOLEAN;
+use const FILTER_VALIDATE_IP;
+
+final class Uri implements UriInterface
+{
+ /**
+ * RFC3986 invalid characters.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ *
+ * @var string
+ */
+ private const REGEXP_INVALID_CHARS = '/[\x00-\x1f\x7f]/';
+
+ /**
+ * RFC3986 Sub delimiter characters regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ *
+ * @var string
+ */
+ private const REGEXP_CHARS_SUBDELIM = "\!\$&'\(\)\*\+,;\=%";
+
+ /**
+ * RFC3986 unreserved characters regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.3
+ *
+ * @var string
+ */
+ private const REGEXP_CHARS_UNRESERVED = 'A-Za-z0-9_\-\.~';
+
+ /**
+ * RFC3986 schema regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ private const REGEXP_SCHEME = ',^[a-z]([-a-z0-9+.]+)?$,i';
+
+ /**
+ * RFC3986 host identified by a registered name regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_HOST_REGNAME = '/^(
+ (?<unreserved>[a-z0-9_~\-\.])|
+ (?<sub_delims>[!$&\'()*+,;=])|
+ (?<encoded>%[A-F0-9]{2})
+ )+$/x';
+
+ /**
+ * RFC3986 delimiters of the generic URI components regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-2.2
+ */
+ private const REGEXP_HOST_GEN_DELIMS = '/[:\/?#\[\]@ ]/'; // Also includes space.
+
+ /**
+ * RFC3986 IPvFuture regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_HOST_IPFUTURE = '/^
+ v(?<version>[A-F0-9])+\.
+ (?:
+ (?<unreserved>[a-z0-9_~\-\.])|
+ (?<sub_delims>[!$&\'()*+,;=:]) # also include the : character
+ )+
+ $/ix';
+
+ /**
+ * RFC3986 IPvFuture host and port component.
+ */
+ private const REGEXP_HOST_PORT = ',^(?<host>(\[.*]|[^:])*)(:(?<port>[^/?#]*))?$,x';
+
+ /**
+ * Significant 10 bits of IP to detect Zone ID regular expression pattern.
+ */
+ private const HOST_ADDRESS_BLOCK = "\xfe\x80";
+
+ /**
+ * Regular expression pattern to for file URI.
+ * <volume> contains the volume but not the volume separator.
+ * The volume separator may be URL-encoded (`|` as `%7C`) by ::formatPath(),
+ * so we account for that here.
+ */
+ private const REGEXP_FILE_PATH = ',^(?<delim>/)?(?<volume>[a-zA-Z])(?:[:|\|]|%7C)(?<rest>.*)?,';
+
+ /**
+ * Mimetype regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ */
+ private const REGEXP_MIMETYPE = ',^\w+/[-.\w]+(?:\+[-.\w]+)?$,';
+
+ /**
+ * Base64 content regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ */
+ private const REGEXP_BINARY = ',(;|^)base64$,';
+
+ /**
+ * Windows file path string regular expression pattern.
+ * <root> contains both the volume and volume separator.
+ */
+ private const REGEXP_WINDOW_PATH = ',^(?<root>[a-zA-Z][:|\|]),';
+
+ /**
+ * Supported schemes and corresponding default port.
+ *
+ * @var array<string, int|null>
+ */
+ private const SCHEME_DEFAULT_PORT = [
+ 'data' => null,
+ 'file' => null,
+ 'ftp' => 21,
+ 'gopher' => 70,
+ 'http' => 80,
+ 'https' => 443,
+ 'ws' => 80,
+ 'wss' => 443,
+ ];
+
+ /**
+ * URI validation methods per scheme.
+ *
+ * @var array<string>
+ */
+ private const SCHEME_VALIDATION_METHOD = [
+ 'data' => 'isUriWithSchemeAndPathOnly',
+ 'file' => 'isUriWithSchemeHostAndPathOnly',
+ 'ftp' => 'isNonEmptyHostUriWithoutFragmentAndQuery',
+ 'gopher' => 'isNonEmptyHostUriWithoutFragmentAndQuery',
+ 'http' => 'isNonEmptyHostUri',
+ 'https' => 'isNonEmptyHostUri',
+ 'ws' => 'isNonEmptyHostUriWithoutFragment',
+ 'wss' => 'isNonEmptyHostUriWithoutFragment',
+ ];
+
+ /**
+ * All ASCII letters sorted by typical frequency of occurrence.
+ *
+ * @var string
+ */
+ private const ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
+
+ private ?string $scheme;
+ private ?string $user_info;
+ private ?string $host;
+ private ?int $port;
+ private ?string $authority;
+ private string $path = '';
+ private ?string $query;
+ private ?string $fragment;
+ private ?string $uri;
+
+ private function __construct(
+ ?string $scheme,
+ ?string $user,
+ ?string $pass,
+ ?string $host,
+ ?int $port,
+ string $path,
+ ?string $query,
+ ?string $fragment
+ ) {
+ $this->scheme = $this->formatScheme($scheme);
+ $this->user_info = $this->formatUserInfo($user, $pass);
+ $this->host = $this->formatHost($host);
+ $this->port = $this->formatPort($port);
+ $this->authority = $this->setAuthority();
+ $this->path = $this->formatPath($path);
+ $this->query = $this->formatQueryAndFragment($query);
+ $this->fragment = $this->formatQueryAndFragment($fragment);
+ $this->assertValidState();
+ }
+
+ /**
+ * Format the Scheme and Host component.
+ *
+ * @param ?string $scheme
+ * @throws SyntaxError if the scheme is invalid
+ */
+ private function formatScheme(?string $scheme): ?string
+ {
+ if (null === $scheme) {
+ return $scheme;
+ }
+
+ $formatted_scheme = strtolower($scheme);
+ if (1 === preg_match(self::REGEXP_SCHEME, $formatted_scheme)) {
+ return $formatted_scheme;
+ }
+
+ throw new SyntaxError(sprintf('The scheme `%s` is invalid.', $scheme));
+ }
+
+ /**
+ * Set the UserInfo component.
+ * @param ?string $user
+ * @param ?string $password
+ */
+ private function formatUserInfo(?string $user, ?string $password): ?string
+ {
+ if (null === $user) {
+ return $user;
+ }
+
+ static $user_pattern = '/(?:[^%'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/';
+ $user = preg_replace_callback($user_pattern, [Uri::class, 'urlEncodeMatch'], $user);
+ if (null === $password) {
+ return $user;
+ }
+
+ static $password_pattern = '/(?:[^%:'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.']++|%(?![A-Fa-f0-9]{2}))/';
+
+ return $user.':'.preg_replace_callback($password_pattern, [Uri::class, 'urlEncodeMatch'], $password);
+ }
+
+ /**
+ * Returns the RFC3986 encoded string matched.
+ */
+ private static function urlEncodeMatch(array $matches): string
+ {
+ return rawurlencode($matches[0]);
+ }
+
+ /**
+ * Validate and Format the Host component.
+ * @param ?string $host
+ */
+ private function formatHost(?string $host): ?string
+ {
+ if (null === $host || '' === $host) {
+ return $host;
+ }
+
+ if ('[' !== $host[0]) {
+ return $this->formatRegisteredName($host);
+ }
+
+ return $this->formatIp($host);
+ }
+
+ /**
+ * Validate and format a registered name.
+ *
+ * The host is converted to its ascii representation if needed
+ *
+ * @throws IdnSupportMissing if the submitted host required missing or misconfigured IDN support
+ * @throws SyntaxError if the submitted host is not a valid registered name
+ */
+ private function formatRegisteredName(string $host): string
+ {
+ $formatted_host = rawurldecode($host);
+ if (1 === preg_match(self::REGEXP_HOST_REGNAME, $formatted_host)) {
+ return $formatted_host;
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, $formatted_host)) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : a registered name can not contain URI delimiters or spaces', $host));
+ }
+
+ $info = Idna::toAscii($host, Idna::IDNA2008_ASCII);
+ if (0 !== $info->errors()) {
+ throw IdnaConversionFailed::dueToIDNAError($host, $info);
+ }
+
+ return $info->result();
+ }
+
+ /**
+ * Validate and Format the IPv6/IPvfuture host.
+ *
+ * @throws SyntaxError if the submitted host is not a valid IP host
+ */
+ private function formatIp(string $host): string
+ {
+ $ip = substr($host, 1, -1);
+ if (false !== filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ return $host;
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_IPFUTURE, $ip, $matches) && !in_array($matches['version'], ['4', '6'], true)) {
+ return $host;
+ }
+
+ $pos = strpos($ip, '%');
+ if (false === $pos) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ if (1 === preg_match(self::REGEXP_HOST_GEN_DELIMS, rawurldecode(substr($ip, $pos)))) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ $ip = substr($ip, 0, $pos);
+ if (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ //Only the address block fe80::/10 can have a Zone ID attach to
+ //let's detect the link local significant 10 bits
+ if (0 === strpos((string) inet_pton($ip), self::HOST_ADDRESS_BLOCK)) {
+ return $host;
+ }
+
+ throw new SyntaxError(sprintf('The host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ /**
+ * Format the Port component.
+ *
+ * @param object|null|int|string $port
+ *
+ * @throws SyntaxError
+ */
+ private function formatPort($port = null): ?int
+ {
+ if (null === $port || '' === $port) {
+ return null;
+ }
+
+ if (!is_int($port) && !(is_string($port) && 1 === preg_match('/^\d*$/', $port))) {
+ throw new SyntaxError('The port is expected to be an integer or a string representing an integer; '.gettype($port).' given.');
+ }
+
+ $port = (int) $port;
+ if (0 > $port) {
+ throw new SyntaxError(sprintf('The port `%s` is invalid', $port));
+ }
+
+ $defaultPort = self::SCHEME_DEFAULT_PORT[$this->scheme] ?? null;
+ if ($defaultPort === $port) {
+ return null;
+ }
+
+ return $port;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $components): self
+ {
+ $components['user'] = null;
+ $components['pass'] = null;
+ if (null !== $components['user_info']) {
+ [$components['user'], $components['pass']] = explode(':', $components['user_info'], 2) + [1 => null];
+ }
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a URI and a Base URI.
+ *
+ * The returned URI must be absolute.
+ *
+ * @param mixed $uri the input URI to create
+ * @param null|mixed $base_uri the base URI used for reference
+ */
+ public static function createFromBaseUri($uri, $base_uri = null): UriInterface
+ {
+ if (!$uri instanceof UriInterface) {
+ $uri = self::createFromString($uri);
+ }
+
+ if (null === $base_uri) {
+ if (null === $uri->getScheme()) {
+ throw new SyntaxError(sprintf('the URI `%s` must be absolute', (string) $uri));
+ }
+
+ if (null === $uri->getAuthority()) {
+ return $uri;
+ }
+
+ /** @var UriInterface $uri */
+ $uri = UriResolver::resolve($uri, $uri->withFragment(null)->withQuery(null)->withPath(''));
+
+ return $uri;
+ }
+
+ if (!$base_uri instanceof UriInterface) {
+ $base_uri = self::createFromString($base_uri);
+ }
+
+ if (null === $base_uri->getScheme()) {
+ throw new SyntaxError(sprintf('the base URI `%s` must be absolute', (string) $base_uri));
+ }
+
+ /** @var UriInterface $uri */
+ $uri = UriResolver::resolve($uri, $base_uri);
+
+ return $uri;
+ }
+
+ /**
+ * Create a new instance from a string.
+ *
+ * @param string|mixed $uri
+ */
+ public static function createFromString($uri = ''): self
+ {
+ $components = UriString::parse($uri);
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a hash representation of the URI similar
+ * to PHP parse_url function result.
+ */
+ public static function createFromComponents(array $components = []): self
+ {
+ $components += [
+ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null,
+ 'port' => null, 'path' => '', 'query' => null, 'fragment' => null,
+ ];
+
+ return new self(
+ $components['scheme'],
+ $components['user'],
+ $components['pass'],
+ $components['host'],
+ $components['port'],
+ $components['path'],
+ $components['query'],
+ $components['fragment']
+ );
+ }
+
+ /**
+ * Create a new instance from a data file path.
+ *
+ * @param resource|null $context
+ *
+ * @throws FileinfoSupportMissing If ext/fileinfo is not installed
+ * @throws SyntaxError If the file does not exist or is not readable
+ */
+ public static function createFromDataPath(string $path, $context = null): self
+ {
+ static $finfo_support = null;
+ $finfo_support = $finfo_support ?? class_exists(finfo::class);
+
+ // @codeCoverageIgnoreStart
+ if (!$finfo_support) {
+ throw new FileinfoSupportMissing(sprintf('Please install ext/fileinfo to use the %s() method.', __METHOD__));
+ }
+ // @codeCoverageIgnoreEnd
+
+ $file_args = [$path, false];
+ $mime_args = [$path, FILEINFO_MIME];
+ if (null !== $context) {
+ $file_args[] = $context;
+ $mime_args[] = $context;
+ }
+
+ $raw = @file_get_contents(...$file_args);
+ if (false === $raw) {
+ throw new SyntaxError(sprintf('The file `%s` does not exist or is not readable', $path));
+ }
+
+ $mimetype = (string) (new finfo(FILEINFO_MIME))->file(...$mime_args);
+
+ return Uri::createFromComponents([
+ 'scheme' => 'data',
+ 'path' => str_replace(' ', '', $mimetype.';base64,'.base64_encode($raw)),
+ ]);
+ }
+
+ /**
+ * Create a new instance from a Unix path string.
+ */
+ public static function createFromUnixPath(string $uri = ''): self
+ {
+ $uri = implode('/', array_map('rawurlencode', explode('/', $uri)));
+ if ('/' !== ($uri[0] ?? '')) {
+ return Uri::createFromComponents(['path' => $uri]);
+ }
+
+ return Uri::createFromComponents(['path' => $uri, 'scheme' => 'file', 'host' => '']);
+ }
+
+ /**
+ * Create a new instance from a local Windows path string.
+ */
+ public static function createFromWindowsPath(string $uri = ''): self
+ {
+ $root = '';
+ if (1 === preg_match(self::REGEXP_WINDOW_PATH, $uri, $matches)) {
+ $root = substr($matches['root'], 0, -1).':';
+ $uri = substr($uri, strlen($root));
+ }
+ $uri = str_replace('\\', '/', $uri);
+ $uri = implode('/', array_map('rawurlencode', explode('/', $uri)));
+
+ //Local Windows absolute path
+ if ('' !== $root) {
+ return Uri::createFromComponents(['path' => '/'.$root.$uri, 'scheme' => 'file', 'host' => '']);
+ }
+
+ //UNC Windows Path
+ if ('//' !== substr($uri, 0, 2)) {
+ return Uri::createFromComponents(['path' => $uri]);
+ }
+
+ $parts = explode('/', substr($uri, 2), 2) + [1 => null];
+
+ return Uri::createFromComponents(['host' => $parts[0], 'path' => '/'.$parts[1], 'scheme' => 'file']);
+ }
+
+ /**
+ * Create a new instance from a URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri the input URI to create
+ */
+ public static function createFromUri($uri): self
+ {
+ if ($uri instanceof UriInterface) {
+ $user_info = $uri->getUserInfo();
+ $user = null;
+ $pass = null;
+ if (null !== $user_info) {
+ [$user, $pass] = explode(':', $user_info, 2) + [1 => null];
+ }
+
+ return new self(
+ $uri->getScheme(),
+ $user,
+ $pass,
+ $uri->getHost(),
+ $uri->getPort(),
+ $uri->getPath(),
+ $uri->getQuery(),
+ $uri->getFragment()
+ );
+ }
+
+ if (!$uri instanceof Psr7UriInterface) {
+ throw new TypeError(sprintf('The object must implement the `%s` or the `%s`', Psr7UriInterface::class, UriInterface::class));
+ }
+
+ $scheme = $uri->getScheme();
+ if ('' === $scheme) {
+ $scheme = null;
+ }
+
+ $fragment = $uri->getFragment();
+ if ('' === $fragment) {
+ $fragment = null;
+ }
+
+ $query = $uri->getQuery();
+ if ('' === $query) {
+ $query = null;
+ }
+
+ $host = $uri->getHost();
+ if ('' === $host) {
+ $host = null;
+ }
+
+ $user_info = $uri->getUserInfo();
+ $user = null;
+ $pass = null;
+ if ('' !== $user_info) {
+ [$user, $pass] = explode(':', $user_info, 2) + [1 => null];
+ }
+
+ return new self(
+ $scheme,
+ $user,
+ $pass,
+ $host,
+ $uri->getPort(),
+ $uri->getPath(),
+ $query,
+ $fragment
+ );
+ }
+
+ /**
+ * Create a new instance from the environment.
+ */
+ public static function createFromServer(array $server): self
+ {
+ [$user, $pass] = self::fetchUserInfo($server);
+ [$host, $port] = self::fetchHostname($server);
+ [$path, $query] = self::fetchRequestUri($server);
+
+ return Uri::createFromComponents([
+ 'scheme' => self::fetchScheme($server),
+ 'user' => $user,
+ 'pass' => $pass,
+ 'host' => $host,
+ 'port' => $port,
+ 'path' => $path,
+ 'query' => $query,
+ ]);
+ }
+
+ /**
+ * Returns the environment scheme.
+ */
+ private static function fetchScheme(array $server): string
+ {
+ $server += ['HTTPS' => ''];
+ $res = filter_var($server['HTTPS'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
+
+ return false !== $res ? 'https' : 'http';
+ }
+
+ /**
+ * Returns the environment user info.
+ *
+ * @return array{0:?string, 1:?string}
+ */
+ private static function fetchUserInfo(array $server): array
+ {
+ $server += ['PHP_AUTH_USER' => null, 'PHP_AUTH_PW' => null, 'HTTP_AUTHORIZATION' => ''];
+ $user = $server['PHP_AUTH_USER'];
+ $pass = $server['PHP_AUTH_PW'];
+ if (0 === strpos(strtolower($server['HTTP_AUTHORIZATION']), 'basic')) {
+ $userinfo = base64_decode(substr($server['HTTP_AUTHORIZATION'], 6), true);
+ if (false === $userinfo) {
+ throw new SyntaxError('The user info could not be detected');
+ }
+ [$user, $pass] = explode(':', $userinfo, 2) + [1 => null];
+ }
+
+ if (null !== $user) {
+ $user = rawurlencode($user);
+ }
+
+ if (null !== $pass) {
+ $pass = rawurlencode($pass);
+ }
+
+ return [$user, $pass];
+ }
+
+ /**
+ * Returns the environment host.
+ *
+ * @throws SyntaxError If the host can not be detected
+ *
+ * @return array{0:string|null, 1:int|null}
+ */
+ private static function fetchHostname(array $server): array
+ {
+ $server += ['SERVER_PORT' => null];
+ if (null !== $server['SERVER_PORT']) {
+ $server['SERVER_PORT'] = (int) $server['SERVER_PORT'];
+ }
+
+ if (isset($server['HTTP_HOST']) && 1 === preg_match(self::REGEXP_HOST_PORT, $server['HTTP_HOST'], $matches)) {
+ if (isset($matches['port'])) {
+ $matches['port'] = (int) $matches['port'];
+ }
+
+ return [
+ $matches['host'],
+ $matches['port'] ?? $server['SERVER_PORT'],
+ ];
+ }
+
+ if (!isset($server['SERVER_ADDR'])) {
+ throw new SyntaxError('The host could not be detected');
+ }
+
+ if (false === filter_var($server['SERVER_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+ $server['SERVER_ADDR'] = '['.$server['SERVER_ADDR'].']';
+ }
+
+ return [$server['SERVER_ADDR'], $server['SERVER_PORT']];
+ }
+
+ /**
+ * Returns the environment path.
+ *
+ * @return array{0:?string, 1:?string}
+ */
+ private static function fetchRequestUri(array $server): array
+ {
+ $server += ['IIS_WasUrlRewritten' => null, 'UNENCODED_URL' => '', 'PHP_SELF' => '', 'QUERY_STRING' => null];
+ if ('1' === $server['IIS_WasUrlRewritten'] && '' !== $server['UNENCODED_URL']) {
+ /** @var array{0:?string, 1:?string} $retval */
+ $retval = explode('?', $server['UNENCODED_URL'], 2) + [1 => null];
+
+ return $retval;
+ }
+
+ if (isset($server['REQUEST_URI'])) {
+ [$path, ] = explode('?', $server['REQUEST_URI'], 2);
+ $query = ('' !== $server['QUERY_STRING']) ? $server['QUERY_STRING'] : null;
+
+ return [$path, $query];
+ }
+
+ return [$server['PHP_SELF'], $server['QUERY_STRING']];
+ }
+
+ /**
+ * Generate the URI authority part.
+ */
+ private function setAuthority(): ?string
+ {
+ $authority = null;
+ if (null !== $this->user_info) {
+ $authority = $this->user_info.'@';
+ }
+
+ if (null !== $this->host) {
+ $authority .= $this->host;
+ }
+
+ if (null !== $this->port) {
+ $authority .= ':'.$this->port;
+ }
+
+ return $authority;
+ }
+
+ /**
+ * Format the Path component.
+ */
+ private function formatPath(string $path): string
+ {
+ $path = $this->formatDataPath($path);
+
+ static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/}{]++|%(?![A-Fa-f0-9]{2}))/';
+
+ $path = (string) preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $path);
+
+ return $this->formatFilePath($path);
+ }
+
+ /**
+ * Filter the Path component.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ *
+ * @throws SyntaxError If the path is not compliant with RFC2397
+ */
+ private function formatDataPath(string $path): string
+ {
+ if ('data' !== $this->scheme) {
+ return $path;
+ }
+
+ if ('' == $path) {
+ return 'text/plain;charset=us-ascii,';
+ }
+
+ if (strlen($path) !== strspn($path, self::ASCII) || false === strpos($path, ',')) {
+ throw new SyntaxError(sprintf('The path `%s` is invalid according to RFC2937', $path));
+ }
+
+ $parts = explode(',', $path, 2) + [1 => null];
+ $mediatype = explode(';', (string) $parts[0], 2) + [1 => null];
+ $data = (string) $parts[1];
+ $mimetype = $mediatype[0];
+ if (null === $mimetype || '' === $mimetype) {
+ $mimetype = 'text/plain';
+ }
+
+ $parameters = $mediatype[1];
+ if (null === $parameters || '' === $parameters) {
+ $parameters = 'charset=us-ascii';
+ }
+
+ $this->assertValidPath($mimetype, $parameters, $data);
+
+ return $mimetype.';'.$parameters.','.$data;
+ }
+
+ /**
+ * Assert the path is a compliant with RFC2397.
+ *
+ * @link https://tools.ietf.org/html/rfc2397
+ *
+ * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397
+ */
+ private function assertValidPath(string $mimetype, string $parameters, string $data): void
+ {
+ if (1 !== preg_match(self::REGEXP_MIMETYPE, $mimetype)) {
+ throw new SyntaxError(sprintf('The path mimetype `%s` is invalid', $mimetype));
+ }
+
+ $is_binary = 1 === preg_match(self::REGEXP_BINARY, $parameters, $matches);
+ if ($is_binary) {
+ $parameters = substr($parameters, 0, - strlen($matches[0]));
+ }
+
+ $res = array_filter(array_filter(explode(';', $parameters), [$this, 'validateParameter']));
+ if ([] !== $res) {
+ throw new SyntaxError(sprintf('The path paremeters `%s` is invalid', $parameters));
+ }
+
+ if (!$is_binary) {
+ return;
+ }
+
+ $res = base64_decode($data, true);
+ if (false === $res || $data !== base64_encode($res)) {
+ throw new SyntaxError(sprintf('The path data `%s` is invalid', $data));
+ }
+ }
+
+ /**
+ * Validate mediatype parameter.
+ */
+ private function validateParameter(string $parameter): bool
+ {
+ $properties = explode('=', $parameter);
+
+ return 2 != count($properties) || 'base64' === strtolower($properties[0]);
+ }
+
+ /**
+ * Format path component for file scheme.
+ */
+ private function formatFilePath(string $path): string
+ {
+ if ('file' !== $this->scheme) {
+ return $path;
+ }
+
+ $replace = static function (array $matches): string {
+ return $matches['delim'].$matches['volume'].':'.$matches['rest'];
+ };
+
+ return (string) preg_replace_callback(self::REGEXP_FILE_PATH, $replace, $path);
+ }
+
+ /**
+ * Format the Query or the Fragment component.
+ *
+ * Returns a array containing:
+ * <ul>
+ * <li> the formatted component (a string or null)</li>
+ * <li> a boolean flag telling wether the delimiter is to be added to the component
+ * when building the URI string representation</li>
+ * </ul>
+ *
+ * @param ?string $component
+ */
+ private function formatQueryAndFragment(?string $component): ?string
+ {
+ if (null === $component || '' === $component) {
+ return $component;
+ }
+
+ static $pattern = '/(?:[^'.self::REGEXP_CHARS_UNRESERVED.self::REGEXP_CHARS_SUBDELIM.'%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/';
+ return preg_replace_callback($pattern, [Uri::class, 'urlEncodeMatch'], $component);
+ }
+
+ /**
+ * assert the URI internal state is valid.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3
+ * @link https://tools.ietf.org/html/rfc3986#section-3.3
+ *
+ * @throws SyntaxError if the URI is in an invalid state according to RFC3986
+ * @throws SyntaxError if the URI is in an invalid state according to scheme specific rules
+ */
+ private function assertValidState(): void
+ {
+ if (null !== $this->authority && ('' !== $this->path && '/' !== $this->path[0])) {
+ throw new SyntaxError('If an authority is present the path must be empty or start with a `/`.');
+ }
+
+ if (null === $this->authority && 0 === strpos($this->path, '//')) {
+ throw new SyntaxError(sprintf('If there is no authority the path `%s` can not start with a `//`.', $this->path));
+ }
+
+ $pos = strpos($this->path, ':');
+ if (null === $this->authority
+ && null === $this->scheme
+ && false !== $pos
+ && false === strpos(substr($this->path, 0, $pos), '/')
+ ) {
+ throw new SyntaxError('In absence of a scheme and an authority the first path segment cannot contain a colon (":") character.');
+ }
+
+ $validationMethod = self::SCHEME_VALIDATION_METHOD[$this->scheme] ?? null;
+ if (null === $validationMethod || true === $this->$validationMethod()) {
+ $this->uri = null;
+
+ return;
+ }
+
+ throw new SyntaxError(sprintf('The uri `%s` is invalid for the `%s` scheme.', (string) $this, $this->scheme));
+ }
+
+ /**
+ * URI validation for URI schemes which allows only scheme and path components.
+ */
+ private function isUriWithSchemeAndPathOnly(): bool
+ {
+ return null === $this->authority
+ && null === $this->query
+ && null === $this->fragment;
+ }
+
+ /**
+ * URI validation for URI schemes which allows only scheme, host and path components.
+ */
+ private function isUriWithSchemeHostAndPathOnly(): bool
+ {
+ return null === $this->user_info
+ && null === $this->port
+ && null === $this->query
+ && null === $this->fragment
+ && !('' != $this->scheme && null === $this->host);
+ }
+
+ /**
+ * URI validation for URI schemes which disallow the empty '' host.
+ */
+ private function isNonEmptyHostUri(): bool
+ {
+ return '' !== $this->host
+ && !(null !== $this->scheme && null === $this->host);
+ }
+
+ /**
+ * URI validation for URIs schemes which disallow the empty '' host
+ * and forbids the fragment component.
+ */
+ private function isNonEmptyHostUriWithoutFragment(): bool
+ {
+ return $this->isNonEmptyHostUri() && null === $this->fragment;
+ }
+
+ /**
+ * URI validation for URIs schemes which disallow the empty '' host
+ * and forbids fragment and query components.
+ */
+ private function isNonEmptyHostUriWithoutFragmentAndQuery(): bool
+ {
+ return $this->isNonEmptyHostUri() && null === $this->fragment && null === $this->query;
+ }
+
+ /**
+ * Generate the URI string representation from its components.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ *
+ * @param ?string $scheme
+ * @param ?string $authority
+ * @param ?string $query
+ * @param ?string $fragment
+ */
+ private function getUriString(
+ ?string $scheme,
+ ?string $authority,
+ string $path,
+ ?string $query,
+ ?string $fragment
+ ): string {
+ if (null !== $scheme) {
+ $scheme = $scheme.':';
+ }
+
+ if (null !== $authority) {
+ $authority = '//'.$authority;
+ }
+
+ if (null !== $query) {
+ $query = '?'.$query;
+ }
+
+ if (null !== $fragment) {
+ $fragment = '#'.$fragment;
+ }
+
+ return $scheme.$authority.$path.$query.$fragment;
+ }
+
+ public function toString(): string
+ {
+ $this->uri = $this->uri ?? $this->getUriString(
+ $this->scheme,
+ $this->authority,
+ $this->path,
+ $this->query,
+ $this->fragment
+ );
+
+ return $this->uri;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __toString(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function jsonSerialize(): string
+ {
+ return $this->toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @return array{scheme:?string, user_info:?string, host:?string, port:?int, path:string, query:?string, fragment:?string}
+ */
+ public function __debugInfo(): array
+ {
+ return [
+ 'scheme' => $this->scheme,
+ 'user_info' => isset($this->user_info) ? preg_replace(',:(.*).?$,', ':***', $this->user_info) : null,
+ 'host' => $this->host,
+ 'port' => $this->port,
+ 'path' => $this->path,
+ 'query' => $this->query,
+ 'fragment' => $this->fragment,
+ ];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getScheme(): ?string
+ {
+ return $this->scheme;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAuthority(): ?string
+ {
+ return $this->authority;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getUserInfo(): ?string
+ {
+ return $this->user_info;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getHost(): ?string
+ {
+ return $this->host;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPort(): ?int
+ {
+ return $this->port;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPath(): string
+ {
+ return $this->path;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getQuery(): ?string
+ {
+ return $this->query;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getFragment(): ?string
+ {
+ return $this->fragment;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withScheme($scheme): UriInterface
+ {
+ $scheme = $this->formatScheme($this->filterString($scheme));
+ if ($scheme === $this->scheme) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->scheme = $scheme;
+ $clone->port = $clone->formatPort($clone->port);
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * Filter a string.
+ *
+ * @param mixed $str the value to evaluate as a string
+ *
+ * @throws SyntaxError if the submitted data can not be converted to string
+ */
+ private function filterString($str): ?string
+ {
+ if (null === $str) {
+ return $str;
+ }
+
+ if (is_object($str) && method_exists($str, '__toString')) {
+ $str = (string) $str;
+ }
+
+ if (!is_scalar($str)) {
+ throw new SyntaxError(sprintf('The component must be a string, a scalar or a stringable object; `%s` given.', gettype($str)));
+ }
+
+ $str = (string) $str;
+ if (1 !== preg_match(self::REGEXP_INVALID_CHARS, $str)) {
+ return $str;
+ }
+
+ throw new SyntaxError(sprintf('The component `%s` contains invalid characters.', $str));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withUserInfo($user, $password = null): UriInterface
+ {
+ $user_info = null;
+ $user = $this->filterString($user);
+ if (null !== $password) {
+ $password = $this->filterString($password);
+ }
+
+ if ('' !== $user) {
+ $user_info = $this->formatUserInfo($user, $password);
+ }
+
+ if ($user_info === $this->user_info) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->user_info = $user_info;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withHost($host): UriInterface
+ {
+ $host = $this->formatHost($this->filterString($host));
+ if ($host === $this->host) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->host = $host;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withPort($port): UriInterface
+ {
+ $port = $this->formatPort($port);
+ if ($port === $this->port) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->port = $port;
+ $clone->authority = $clone->setAuthority();
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @param string|object $path
+ */
+ public function withPath($path): UriInterface
+ {
+ $path = $this->filterString($path);
+ if (null === $path) {
+ throw new TypeError('A path must be a string NULL given.');
+ }
+
+ $path = $this->formatPath($path);
+ if ($path === $this->path) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->path = $path;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withQuery($query): UriInterface
+ {
+ $query = $this->formatQueryAndFragment($this->filterString($query));
+ if ($query === $this->query) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->query = $query;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function withFragment($fragment): UriInterface
+ {
+ $fragment = $this->formatQueryAndFragment($this->filterString($fragment));
+ if ($fragment === $this->fragment) {
+ return $this;
+ }
+
+ $clone = clone $this;
+ $clone->fragment = $fragment;
+ $clone->assertValidState();
+
+ return $clone;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriInfo.php b/plugins/af_readability/vendor/league/uri/src/UriInfo.php
new file mode 100644
index 000000000..ec8473c54
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriInfo.php
@@ -0,0 +1,215 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use TypeError;
+use function explode;
+use function implode;
+use function preg_replace_callback;
+use function rawurldecode;
+use function sprintf;
+
+final class UriInfo
+{
+ private const REGEXP_ENCODED_CHARS = ',%(2[D|E]|3[0-9]|4[1-9|A-F]|5[0-9|AF]|6[1-9|A-F]|7[0-9|E]),i';
+
+ private const WHATWG_SPECIAL_SCHEMES = ['ftp' => 21, 'http' => 80, 'https' => 443, 'ws' => 80, 'wss' => 443];
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private function __construct()
+ {
+ }
+
+ /**
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ private static function emptyComponentValue($uri): ?string
+ {
+ return $uri instanceof Psr7UriInterface ? '' : null;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * To be valid an URI MUST implement at least one of the following interface:
+ * - League\Uri\UriInterface
+ * - Psr\Http\Message\UriInterface
+ *
+ * @param mixed $uri the URI to validate
+ *
+ * @throws TypeError if the URI object does not implements the supported interfaces.
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function filterUri($uri)
+ {
+ if ($uri instanceof Psr7UriInterface || $uri instanceof UriInterface) {
+ return $uri;
+ }
+
+ throw new TypeError(sprintf('The uri must be a valid URI object received `%s`', is_object($uri) ? get_class($uri) : gettype($uri)));
+ }
+
+ /**
+ * Normalize an URI for comparison.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function normalize($uri)
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ $path = $uri->getPath();
+ if ('/' === ($path[0] ?? '') || '' !== $uri->getScheme().$uri->getAuthority()) {
+ $path = UriResolver::resolve($uri, $uri->withPath('')->withQuery($null))->getPath();
+ }
+
+ $query = $uri->getQuery();
+ $fragment = $uri->getFragment();
+ $fragmentOrig = $fragment;
+ $pairs = null === $query ? [] : explode('&', $query);
+ sort($pairs, SORT_REGULAR);
+
+ $replace = static fn (array $matches): string => rawurldecode($matches[0]);
+
+ $retval = preg_replace_callback(self::REGEXP_ENCODED_CHARS, $replace, [$path, implode('&', $pairs), $fragment]);
+ if (null !== $retval) {
+ [$path, $query, $fragment] = $retval + ['', $null, $null];
+ }
+
+ if ($null !== $uri->getAuthority() && '' === $path) {
+ $path = '/';
+ }
+
+ return $uri
+ ->withHost(Uri::createFromComponents(['host' => $uri->getHost()])->getHost())
+ ->withPath($path)
+ ->withQuery([] === $pairs ? $null : $query)
+ ->withFragment($null === $fragmentOrig ? $fragmentOrig : $fragment);
+ }
+
+ /**
+ * Tell whether the URI represents an absolute URI.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isAbsolute($uri): bool
+ {
+ return self::emptyComponentValue($uri) !== self::filterUri($uri)->getScheme();
+ }
+
+ /**
+ * Tell whether the URI represents a network path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isNetworkPath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme() && $null !== $uri->getAuthority();
+ }
+
+ /**
+ * Tell whether the URI represents an absolute path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isAbsolutePath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme()
+ && $null === $uri->getAuthority()
+ && '/' === ($uri->getPath()[0] ?? '');
+ }
+
+ /**
+ * Tell whether the URI represents a relative path.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function isRelativePath($uri): bool
+ {
+ $uri = self::filterUri($uri);
+ $null = self::emptyComponentValue($uri);
+
+ return $null === $uri->getScheme()
+ && $null === $uri->getAuthority()
+ && '/' !== ($uri->getPath()[0] ?? '');
+ }
+
+ /**
+ * Tell whether both URI refers to the same document.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ public static function isSameDocument($uri, $base_uri): bool
+ {
+ $uri = self::normalize($uri);
+ $base_uri = self::normalize($base_uri);
+
+ return (string) $uri->withFragment($uri instanceof Psr7UriInterface ? '' : null)
+ === (string) $base_uri->withFragment($base_uri instanceof Psr7UriInterface ? '' : null);
+ }
+
+ /**
+ * Returns the URI origin property as defined by WHATWG URL living standard.
+ *
+ * {@see https://url.spec.whatwg.org/#origin}
+ *
+ * For URI without a special scheme the method returns null
+ * For URI with the file scheme the method will return null (as this is left to the implementation decision)
+ * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part)
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ public static function getOrigin($uri): ?string
+ {
+ $scheme = self::filterUri($uri)->getScheme();
+ if ('blob' === $scheme) {
+ $uri = Uri::createFromString($uri->getPath());
+ $scheme = $uri->getScheme();
+ }
+
+ if (null === $scheme || !array_key_exists($scheme, self::WHATWG_SPECIAL_SCHEMES)) {
+ return null;
+ }
+
+ $null = self::emptyComponentValue($uri);
+
+ return (string) $uri->withFragment($null)->withQuery($null)->withPath('')->withUserInfo($null);
+ }
+
+ /**
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ public static function isCrossOrigin($uri, $base_uri): bool
+ {
+ return null === ($uriString = self::getOrigin(Uri::createFromUri($uri)))
+ || null === ($baseUriString = self::getOrigin(Uri::createFromUri($base_uri)))
+ || $uriString !== $baseUriString;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriResolver.php b/plugins/af_readability/vendor/league/uri/src/UriResolver.php
new file mode 100644
index 000000000..1090383c8
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriResolver.php
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriInterface;
+use Psr\Http\Message\UriInterface as Psr7UriInterface;
+use TypeError;
+use function array_pop;
+use function array_reduce;
+use function count;
+use function end;
+use function explode;
+use function gettype;
+use function implode;
+use function in_array;
+use function sprintf;
+use function str_repeat;
+use function strpos;
+use function substr;
+
+final class UriResolver
+{
+ /**
+ * @var array<string,int>
+ */
+ const DOT_SEGMENTS = ['.' => 1, '..' => 1];
+
+ /**
+ * @codeCoverageIgnore
+ */
+ private function __construct()
+ {
+ }
+
+ /**
+ * Resolve an URI against a base URI using RFC3986 rules.
+ *
+ * If the first argument is a UriInterface the method returns a UriInterface object
+ * If the first argument is a Psr7UriInterface the method returns a Psr7UriInterface object
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ public static function resolve($uri, $base_uri)
+ {
+ self::filterUri($uri);
+ self::filterUri($base_uri);
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+
+ if ($null !== $uri->getScheme()) {
+ return $uri
+ ->withPath(self::removeDotSegments($uri->getPath()));
+ }
+
+ if ($null !== $uri->getAuthority()) {
+ return $uri
+ ->withScheme($base_uri->getScheme())
+ ->withPath(self::removeDotSegments($uri->getPath()));
+ }
+
+ $user = $null;
+ $pass = null;
+ $userInfo = $base_uri->getUserInfo();
+ if (null !== $userInfo) {
+ [$user, $pass] = explode(':', $userInfo, 2) + [1 => null];
+ }
+
+ [$uri_path, $uri_query] = self::resolvePathAndQuery($uri, $base_uri);
+
+ return $uri
+ ->withPath(self::removeDotSegments($uri_path))
+ ->withQuery($uri_query)
+ ->withHost($base_uri->getHost())
+ ->withPort($base_uri->getPort())
+ ->withUserInfo((string) $user, $pass)
+ ->withScheme($base_uri->getScheme())
+ ;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * @param mixed $uri an URI object
+ *
+ * @throws TypeError if the URI object does not implements the supported interfaces.
+ */
+ private static function filterUri($uri): void
+ {
+ if (!$uri instanceof UriInterface && !$uri instanceof Psr7UriInterface) {
+ throw new TypeError(sprintf('The uri must be a valid URI object received `%s`', gettype($uri)));
+ }
+ }
+
+ /**
+ * Remove dot segments from the URI path.
+ */
+ private static function removeDotSegments(string $path): string
+ {
+ if (false === strpos($path, '.')) {
+ return $path;
+ }
+
+ $old_segments = explode('/', $path);
+ $new_path = implode('/', array_reduce($old_segments, [UriResolver::class, 'reducer'], []));
+ if (isset(self::DOT_SEGMENTS[end($old_segments)])) {
+ $new_path .= '/';
+ }
+
+ // @codeCoverageIgnoreStart
+ // added because some PSR-7 implementations do not respect RFC3986
+ if (0 === strpos($path, '/') && 0 !== strpos($new_path, '/')) {
+ return '/'.$new_path;
+ }
+ // @codeCoverageIgnoreEnd
+
+ return $new_path;
+ }
+
+ /**
+ * Remove dot segments.
+ *
+ * @return array<int, string>
+ */
+ private static function reducer(array $carry, string $segment): array
+ {
+ if ('..' === $segment) {
+ array_pop($carry);
+
+ return $carry;
+ }
+
+ if (!isset(self::DOT_SEGMENTS[$segment])) {
+ $carry[] = $segment;
+ }
+
+ return $carry;
+ }
+
+ /**
+ * Resolve an URI path and query component.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return array{0:string, 1:string|null}
+ */
+ private static function resolvePathAndQuery($uri, $base_uri): array
+ {
+ $target_path = $uri->getPath();
+ $target_query = $uri->getQuery();
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+ $baseNull = $base_uri instanceof Psr7UriInterface ? '' : null;
+
+ if (0 === strpos($target_path, '/')) {
+ return [$target_path, $target_query];
+ }
+
+ if ('' === $target_path) {
+ if ($null === $target_query) {
+ $target_query = $base_uri->getQuery();
+ }
+
+ $target_path = $base_uri->getPath();
+ //@codeCoverageIgnoreStart
+ //because some PSR-7 Uri implementations allow this RFC3986 forbidden construction
+ if ($baseNull !== $base_uri->getAuthority() && 0 !== strpos($target_path, '/')) {
+ $target_path = '/'.$target_path;
+ }
+ //@codeCoverageIgnoreEnd
+
+ return [$target_path, $target_query];
+ }
+
+ $base_path = $base_uri->getPath();
+ if ($baseNull !== $base_uri->getAuthority() && '' === $base_path) {
+ $target_path = '/'.$target_path;
+ }
+
+ if ('' !== $base_path) {
+ $segments = explode('/', $base_path);
+ array_pop($segments);
+ if ([] !== $segments) {
+ $target_path = implode('/', $segments).'/'.$target_path;
+ }
+ }
+
+ return [$target_path, $target_query];
+ }
+
+ /**
+ * Relativize an URI according to a base URI.
+ *
+ * This method MUST retain the state of the submitted URI instance, and return
+ * an URI instance of the same type that contains the applied modifications.
+ *
+ * This method MUST be transparent when dealing with error and exceptions.
+ * It MUST not alter of silence them apart from validating its own parameters.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ public static function relativize($uri, $base_uri)
+ {
+ self::filterUri($uri);
+ self::filterUri($base_uri);
+ $uri = self::formatHost($uri);
+ $base_uri = self::formatHost($base_uri);
+ if (!self::isRelativizable($uri, $base_uri)) {
+ return $uri;
+ }
+
+ $null = $uri instanceof Psr7UriInterface ? '' : null;
+ $uri = $uri->withScheme($null)->withPort(null)->withUserInfo($null)->withHost($null);
+ $target_path = $uri->getPath();
+ if ($target_path !== $base_uri->getPath()) {
+ return $uri->withPath(self::relativizePath($target_path, $base_uri->getPath()));
+ }
+
+ if (self::componentEquals('getQuery', $uri, $base_uri)) {
+ return $uri->withPath('')->withQuery($null);
+ }
+
+ if ($null === $uri->getQuery()) {
+ return $uri->withPath(self::formatPathWithEmptyBaseQuery($target_path));
+ }
+
+ return $uri->withPath('');
+ }
+
+ /**
+ * Tells whether the component value from both URI object equals.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ private static function componentEquals(string $method, $uri, $base_uri): bool
+ {
+ return self::getComponent($method, $uri) === self::getComponent($method, $base_uri);
+ }
+
+ /**
+ * Returns the component value from the submitted URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ */
+ private static function getComponent(string $method, $uri): ?string
+ {
+ $component = $uri->$method();
+ if ($uri instanceof Psr7UriInterface && '' === $component) {
+ return null;
+ }
+
+ return $component;
+ }
+
+ /**
+ * Filter the URI object.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ *
+ * @throws TypeError if the URI object does not implements the supported interfaces.
+ *
+ * @return Psr7UriInterface|UriInterface
+ */
+ private static function formatHost($uri)
+ {
+ if (!$uri instanceof Psr7UriInterface) {
+ return $uri;
+ }
+
+ $host = $uri->getHost();
+ if ('' === $host) {
+ return $uri;
+ }
+
+ return $uri->withHost((string) Uri::createFromComponents(['host' => $host])->getHost());
+ }
+
+ /**
+ * Tell whether the submitted URI object can be relativize.
+ *
+ * @param Psr7UriInterface|UriInterface $uri
+ * @param Psr7UriInterface|UriInterface $base_uri
+ */
+ private static function isRelativizable($uri, $base_uri): bool
+ {
+ return !UriInfo::isRelativePath($uri)
+ && self::componentEquals('getScheme', $uri, $base_uri)
+ && self::componentEquals('getAuthority', $uri, $base_uri);
+ }
+
+ /**
+ * Relative the URI for a authority-less target URI.
+ */
+ private static function relativizePath(string $path, string $basepath): string
+ {
+ $base_segments = self::getSegments($basepath);
+ $target_segments = self::getSegments($path);
+ $target_basename = array_pop($target_segments);
+ array_pop($base_segments);
+ foreach ($base_segments as $offset => $segment) {
+ if (!isset($target_segments[$offset]) || $segment !== $target_segments[$offset]) {
+ break;
+ }
+ unset($base_segments[$offset], $target_segments[$offset]);
+ }
+ $target_segments[] = $target_basename;
+
+ return self::formatPath(
+ str_repeat('../', count($base_segments)).implode('/', $target_segments),
+ $basepath
+ );
+ }
+
+ /**
+ * returns the path segments.
+ *
+ * @return string[]
+ */
+ private static function getSegments(string $path): array
+ {
+ if ('' !== $path && '/' === $path[0]) {
+ $path = substr($path, 1);
+ }
+
+ return explode('/', $path);
+ }
+
+ /**
+ * Formatting the path to keep a valid URI.
+ */
+ private static function formatPath(string $path, string $basepath): string
+ {
+ if ('' === $path) {
+ return in_array($basepath, ['', '/'], true) ? $basepath : './';
+ }
+
+ if (false === ($colon_pos = strpos($path, ':'))) {
+ return $path;
+ }
+
+ $slash_pos = strpos($path, '/');
+ if (false === $slash_pos || $colon_pos < $slash_pos) {
+ return "./$path";
+ }
+
+ return $path;
+ }
+
+ /**
+ * Formatting the path to keep a resolvable URI.
+ */
+ private static function formatPathWithEmptyBaseQuery(string $path): string
+ {
+ $target_segments = self::getSegments($path);
+ /** @var string $basename */
+ $basename = end($target_segments);
+
+ return '' === $basename ? './' : $basename;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriString.php b/plugins/af_readability/vendor/league/uri/src/UriString.php
new file mode 100644
index 000000000..674e1a437
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriString.php
@@ -0,0 +1,467 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Exceptions\IdnaConversionFailed;
+use League\Uri\Exceptions\IdnSupportMissing;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Idna\Idna;
+use TypeError;
+use function array_merge;
+use function explode;
+use function filter_var;
+use function gettype;
+use function inet_pton;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function preg_match;
+use function rawurldecode;
+use function sprintf;
+use function strpos;
+use function substr;
+use const FILTER_FLAG_IPV6;
+use const FILTER_VALIDATE_IP;
+
+/**
+ * A class to parse a URI string according to RFC3986.
+ *
+ * @link https://tools.ietf.org/html/rfc3986
+ * @package League\Uri
+ * @author Ignace Nyamagana Butera <[email protected]>
+ * @since 6.0.0
+ */
+final class UriString
+{
+ /**
+ * Default URI component values.
+ */
+ private const URI_COMPONENTS = [
+ 'scheme' => null, 'user' => null, 'pass' => null, 'host' => null,
+ 'port' => null, 'path' => '', 'query' => null, 'fragment' => null,
+ ];
+
+ /**
+ * Simple URI which do not need any parsing.
+ */
+ private const URI_SCHORTCUTS = [
+ '' => [],
+ '#' => ['fragment' => ''],
+ '?' => ['query' => ''],
+ '?#' => ['query' => '', 'fragment' => ''],
+ '/' => ['path' => '/'],
+ '//' => ['host' => ''],
+ ];
+
+ /**
+ * Range of invalid characters in URI string.
+ */
+ private const REGEXP_INVALID_URI_CHARS = '/[\x00-\x1f\x7f]/';
+
+ /**
+ * RFC3986 regular expression URI splitter.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#appendix-B
+ */
+ private const REGEXP_URI_PARTS = ',^
+ (?<scheme>(?<scontent>[^:/?\#]+):)? # URI scheme component
+ (?<authority>//(?<acontent>[^/?\#]*))? # URI authority part
+ (?<path>[^?\#]*) # URI path component
+ (?<query>\?(?<qcontent>[^\#]*))? # URI query component
+ (?<fragment>\#(?<fcontent>.*))? # URI fragment component
+ ,x';
+
+ /**
+ * URI scheme regular expresssion.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.1
+ */
+ private const REGEXP_URI_SCHEME = '/^([a-z][a-z\d\+\.\-]*)?$/i';
+
+ /**
+ * IPvFuture regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_IP_FUTURE = '/^
+ v(?<version>[A-F0-9])+\.
+ (?:
+ (?<unreserved>[a-z0-9_~\-\.])|
+ (?<sub_delims>[!$&\'()*+,;=:]) # also include the : character
+ )+
+ $/ix';
+
+ /**
+ * General registered name regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_REGISTERED_NAME = '/(?(DEFINE)
+ (?<unreserved>[a-z0-9_~\-]) # . is missing as it is used to separate labels
+ (?<sub_delims>[!$&\'()*+,;=])
+ (?<encoded>%[A-F0-9]{2})
+ (?<reg_name>(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*)
+ )
+ ^(?:(?&reg_name)\.)*(?&reg_name)\.?$/ix';
+
+ /**
+ * Invalid characters in host regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ */
+ private const REGEXP_INVALID_HOST_CHARS = '/
+ [:\/?#\[\]@ ] # gen-delims characters as well as the space character
+ /ix';
+
+ /**
+ * Invalid path for URI without scheme and authority regular expression.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.3
+ */
+ private const REGEXP_INVALID_PATH = ',^(([^/]*):)(.*)?/,';
+
+ /**
+ * Host and Port splitter regular expression.
+ */
+ private const REGEXP_HOST_PORT = ',^(?<host>\[.*\]|[^:]*)(:(?<port>.*))?$,';
+
+ /**
+ * IDN Host detector regular expression.
+ */
+ private const REGEXP_IDN_PATTERN = '/[^\x20-\x7f]/';
+
+ /**
+ * Only the address block fe80::/10 can have a Zone ID attach to
+ * let's detect the link local significant 10 bits.
+ */
+ private const ZONE_ID_ADDRESS_BLOCK = "\xfe\x80";
+
+ /**
+ * Generate an URI string representation from its parsed representation
+ * returned by League\UriString::parse() or PHP's parse_url.
+ *
+ * If you supply your own array, you are responsible for providing
+ * valid components without their URI delimiters.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
+ * @link https://tools.ietf.org/html/rfc3986#section-7.5
+ *
+ * @param array{
+ * scheme:?string,
+ * user:?string,
+ * pass:?string,
+ * host:?string,
+ * port:?int,
+ * path:?string,
+ * query:?string,
+ * fragment:?string
+ * } $components
+ */
+ public static function build(array $components): string
+ {
+ $result = $components['path'] ?? '';
+ if (isset($components['query'])) {
+ $result .= '?'.$components['query'];
+ }
+
+ if (isset($components['fragment'])) {
+ $result .= '#'.$components['fragment'];
+ }
+
+ $scheme = null;
+ if (isset($components['scheme'])) {
+ $scheme = $components['scheme'].':';
+ }
+
+ if (!isset($components['host'])) {
+ return $scheme.$result;
+ }
+
+ $scheme .= '//';
+ $authority = $components['host'];
+ if (isset($components['port'])) {
+ $authority .= ':'.$components['port'];
+ }
+
+ if (!isset($components['user'])) {
+ return $scheme.$authority.$result;
+ }
+
+ $authority = '@'.$authority;
+ if (!isset($components['pass'])) {
+ return $scheme.$components['user'].$authority.$result;
+ }
+
+ return $scheme.$components['user'].':'.$components['pass'].$authority.$result;
+ }
+
+ /**
+ * Parse an URI string into its components.
+ *
+ * This method parses a URI and returns an associative array containing any
+ * of the various components of the URI that are present.
+ *
+ * <code>
+ * $components = (new Parser())->parse('http://[email protected]:42?query#');
+ * var_export($components);
+ * //will display
+ * array(
+ * 'scheme' => 'http', // the URI scheme component
+ * 'user' => 'foo', // the URI user component
+ * 'pass' => null, // the URI pass component
+ * 'host' => 'test.example.com', // the URI host component
+ * 'port' => 42, // the URI port component
+ * 'path' => '', // the URI path component
+ * 'query' => 'query', // the URI query component
+ * 'fragment' => '', // the URI fragment component
+ * );
+ * </code>
+ *
+ * The returned array is similar to PHP's parse_url return value with the following
+ * differences:
+ *
+ * <ul>
+ * <li>All components are always present in the returned array</li>
+ * <li>Empty and undefined component are treated differently. And empty component is
+ * set to the empty string while an undefined component is set to the `null` value.</li>
+ * <li>The path component is never undefined</li>
+ * <li>The method parses the URI following the RFC3986 rules but you are still
+ * required to validate the returned components against its related scheme specific rules.</li>
+ * </ul>
+ *
+ * @link https://tools.ietf.org/html/rfc3986
+ *
+ * @param mixed $uri any scalar or stringable object
+ *
+ * @throws SyntaxError if the URI contains invalid characters
+ * @throws SyntaxError if the URI contains an invalid scheme
+ * @throws SyntaxError if the URI contains an invalid path
+ *
+ * @return array{
+ * scheme:?string,
+ * user:?string,
+ * pass:?string,
+ * host:?string,
+ * port:?int,
+ * path:string,
+ * query:?string,
+ * fragment:?string
+ * }
+ */
+ public static function parse($uri): array
+ {
+ if (is_object($uri) && method_exists($uri, '__toString')) {
+ $uri = (string) $uri;
+ }
+
+ if (!is_scalar($uri)) {
+ throw new TypeError(sprintf('The uri must be a scalar or a stringable object `%s` given', gettype($uri)));
+ }
+
+ $uri = (string) $uri;
+
+ if (isset(self::URI_SCHORTCUTS[$uri])) {
+ /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */
+ $components = array_merge(self::URI_COMPONENTS, self::URI_SCHORTCUTS[$uri]);
+
+ return $components;
+ }
+
+ if (1 === preg_match(self::REGEXP_INVALID_URI_CHARS, $uri)) {
+ throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri));
+ }
+
+ //if the first character is a known URI delimiter parsing can be simplified
+ $first_char = $uri[0];
+
+ //The URI is made of the fragment only
+ if ('#' === $first_char) {
+ [, $fragment] = explode('#', $uri, 2);
+ $components = self::URI_COMPONENTS;
+ $components['fragment'] = $fragment;
+
+ return $components;
+ }
+
+ //The URI is made of the query and fragment
+ if ('?' === $first_char) {
+ [, $partial] = explode('?', $uri, 2);
+ [$query, $fragment] = explode('#', $partial, 2) + [1 => null];
+ $components = self::URI_COMPONENTS;
+ $components['query'] = $query;
+ $components['fragment'] = $fragment;
+
+ return $components;
+ }
+
+ //use RFC3986 URI regexp to split the URI
+ preg_match(self::REGEXP_URI_PARTS, $uri, $parts);
+ $parts += ['query' => '', 'fragment' => ''];
+
+ if (':' === $parts['scheme'] || 1 !== preg_match(self::REGEXP_URI_SCHEME, $parts['scontent'])) {
+ throw new SyntaxError(sprintf('The uri `%s` contains an invalid scheme', $uri));
+ }
+
+ if ('' === $parts['scheme'].$parts['authority'] && 1 === preg_match(self::REGEXP_INVALID_PATH, $parts['path'])) {
+ throw new SyntaxError(sprintf('The uri `%s` contains an invalid path.', $uri));
+ }
+
+ /** @var array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string} $components */
+ $components = array_merge(
+ self::URI_COMPONENTS,
+ '' === $parts['authority'] ? [] : self::parseAuthority($parts['acontent']),
+ [
+ 'path' => $parts['path'],
+ 'scheme' => '' === $parts['scheme'] ? null : $parts['scontent'],
+ 'query' => '' === $parts['query'] ? null : $parts['qcontent'],
+ 'fragment' => '' === $parts['fragment'] ? null : $parts['fcontent'],
+ ]
+ );
+
+ return $components;
+ }
+
+ /**
+ * Parses the URI authority part.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2
+ *
+ * @throws SyntaxError If the port component is invalid
+ *
+ * @return array{user:?string, pass:?string, host:?string, port:?int}
+ */
+ private static function parseAuthority(string $authority): array
+ {
+ $components = ['user' => null, 'pass' => null, 'host' => '', 'port' => null];
+ if ('' === $authority) {
+ return $components;
+ }
+
+ $parts = explode('@', $authority, 2);
+ if (isset($parts[1])) {
+ [$components['user'], $components['pass']] = explode(':', $parts[0], 2) + [1 => null];
+ }
+
+ preg_match(self::REGEXP_HOST_PORT, $parts[1] ?? $parts[0], $matches);
+ $matches += ['port' => ''];
+
+ $components['port'] = self::filterPort($matches['port']);
+ $components['host'] = self::filterHost($matches['host']);
+
+ return $components;
+ }
+
+ /**
+ * Filter and format the port component.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ */
+ private static function filterPort(string $port): ?int
+ {
+ if ('' === $port) {
+ return null;
+ }
+
+ if (1 === preg_match('/^\d*$/', $port)) {
+ return (int) $port;
+ }
+
+ throw new SyntaxError(sprintf('The port `%s` is invalid', $port));
+ }
+
+ /**
+ * Returns whether a hostname is valid.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ */
+ private static function filterHost(string $host): string
+ {
+ if ('' === $host) {
+ return $host;
+ }
+
+ if ('[' !== $host[0] || ']' !== substr($host, -1)) {
+ return self::filterRegisteredName($host);
+ }
+
+ if (!self::isIpHost(substr($host, 1, -1))) {
+ throw new SyntaxError(sprintf('Host `%s` is invalid : the IP host is malformed', $host));
+ }
+
+ return $host;
+ }
+
+ /**
+ * Returns whether the host is an IPv4 or a registered named.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ *
+ * @throws SyntaxError if the registered name is invalid
+ * @throws IdnSupportMissing if IDN support or ICU requirement are not available or met.
+ */
+ private static function filterRegisteredName(string $host): string
+ {
+ $formatted_host = rawurldecode($host);
+ if (1 === preg_match(self::REGEXP_REGISTERED_NAME, $formatted_host)) {
+ return $host;
+ }
+
+ //to test IDN host non-ascii characters must be present in the host
+ if (1 !== preg_match(self::REGEXP_IDN_PATTERN, $formatted_host)) {
+ throw new SyntaxError(sprintf('Host `%s` is invalid : the host is not a valid registered name', $host));
+ }
+
+ $info = Idna::toAscii($host, Idna::IDNA2008_ASCII);
+ if (0 !== $info->errors()) {
+ throw IdnaConversionFailed::dueToIDNAError($host, $info);
+ }
+
+ return $host;
+ }
+
+ /**
+ * Validates a IPv6/IPvfuture host.
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @link https://tools.ietf.org/html/rfc6874#section-2
+ * @link https://tools.ietf.org/html/rfc6874#section-4
+ */
+ private static function isIpHost(string $ip_host): bool
+ {
+ if (false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+ return true;
+ }
+
+ if (1 === preg_match(self::REGEXP_IP_FUTURE, $ip_host, $matches)) {
+ return !in_array($matches['version'], ['4', '6'], true);
+ }
+
+ $pos = strpos($ip_host, '%');
+ if (false === $pos || 1 === preg_match(
+ self::REGEXP_INVALID_HOST_CHARS,
+ rawurldecode(substr($ip_host, $pos))
+ )) {
+ return false;
+ }
+
+ $ip_host = substr($ip_host, 0, $pos);
+
+ return false !== filter_var($ip_host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)
+ && 0 === strpos((string) inet_pton($ip_host), self::ZONE_ID_ADDRESS_BLOCK);
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriTemplate.php b/plugins/af_readability/vendor/league/uri/src/UriTemplate.php
new file mode 100644
index 000000000..ba7a5a333
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriTemplate.php
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri;
+
+use League\Uri\Contracts\UriException;
+use League\Uri\Contracts\UriInterface;
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use League\Uri\UriTemplate\Template;
+use League\Uri\UriTemplate\VariableBag;
+use TypeError;
+
+/**
+ * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference.
+ *
+ * @link https://tools.ietf.org/html/rfc6570
+ * @package League\Uri
+ * @author Ignace Nyamagana Butera <[email protected]>
+ * @since 6.1.0
+ *
+ * Based on GuzzleHttp\UriTemplate class in Guzzle v6.5.
+ * @link https://github.com/guzzle/guzzle/blob/6.5/src/UriTemplate.php
+ */
+final class UriTemplate
+{
+ private Template $template;
+ private VariableBag $defaultVariables;
+
+ /**
+ * @param object|string $template a string or an object with the __toString method
+ *
+ * @throws TypeError if the template is not a string or an object with the __toString method
+ * @throws SyntaxError if the template syntax is invalid
+ * @throws TemplateCanNotBeExpanded if the template variables are invalid
+ */
+ public function __construct($template, array $defaultVariables = [])
+ {
+ $this->template = Template::createFromString($template);
+ $this->defaultVariables = $this->filterVariables($defaultVariables);
+ }
+
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['template']->toString(), $properties['defaultVariables']->all());
+ }
+
+ /**
+ * Filters out variables for the given template.
+ *
+ * @param array<string,string|array<string>> $variables
+ */
+ private function filterVariables(array $variables): VariableBag
+ {
+ $output = new VariableBag();
+ foreach ($this->template->variableNames() as $name) {
+ if (isset($variables[$name])) {
+ $output->assign($name, $variables[$name]);
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * The template string.
+ */
+ public function getTemplate(): string
+ {
+ return $this->template->toString();
+ }
+
+ /**
+ * Returns the names of the variables in the template, in order.
+ *
+ * @return string[]
+ */
+ public function getVariableNames(): array
+ {
+ return $this->template->variableNames();
+ }
+
+ /**
+ * Returns the default values used to expand the template.
+ *
+ * The returned list only contains variables whose name is part of the current template.
+ *
+ * @return array<string,string|array>
+ */
+ public function getDefaultVariables(): array
+ {
+ return $this->defaultVariables->all();
+ }
+
+ /**
+ * Returns a new instance with the updated default variables.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the modified default variables.
+ *
+ * If present, variables whose name is not part of the current template
+ * possible variable names are removed.
+ */
+ public function withDefaultVariables(array $defaultDefaultVariables): self
+ {
+ return new self(
+ $this->template->toString(),
+ $this->filterVariables($defaultDefaultVariables)->all()
+ );
+ }
+
+ /**
+ * @throws TemplateCanNotBeExpanded if the variable contains nested array values
+ * @throws UriException if the resulting expansion can not be converted to a UriInterface instance
+ */
+ public function expand(array $variables = []): UriInterface
+ {
+ return Uri::createFromString(
+ $this->template->expand(
+ $this->filterVariables($variables)->replace($this->defaultVariables)
+ )
+ );
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriTemplate/Expression.php b/plugins/af_readability/vendor/league/uri/src/UriTemplate/Expression.php
new file mode 100644
index 000000000..99ecac98b
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriTemplate/Expression.php
@@ -0,0 +1,329 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use function array_filter;
+use function array_keys;
+use function array_map;
+use function array_unique;
+use function explode;
+use function implode;
+use function preg_match;
+use function rawurlencode;
+use function str_replace;
+use function strpos;
+use function substr;
+
+final class Expression
+{
+ /**
+ * Expression regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.2
+ */
+ private const REGEXP_EXPRESSION = '/^\{
+ (?:
+ (?<operator>[\.\/;\?&\=,\!@\|\+#])?
+ (?<variables>[^\}]*)
+ )
+ \}$/x';
+
+ /**
+ * Reserved Operator characters.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.2
+ */
+ private const RESERVED_OPERATOR = '=,!@|';
+
+ /**
+ * Processing behavior according to the expression type operator.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#appendix-A
+ */
+ private const OPERATOR_HASH_LOOKUP = [
+ '' => ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '+' => ['prefix' => '', 'joiner' => ',', 'query' => false],
+ '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false],
+ '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false],
+ '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false],
+ ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true],
+ '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true],
+ '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true],
+ ];
+
+ private string $operator;
+ /** @var array<VarSpecifier> */
+ private array $varSpecifiers;
+ private string $joiner;
+ /** @var array<string> */
+ private array $variableNames;
+ private string $expressionString;
+
+ private function __construct(string $operator, VarSpecifier ...$varSpecifiers)
+ {
+ $this->operator = $operator;
+ $this->varSpecifiers = $varSpecifiers;
+ $this->joiner = self::OPERATOR_HASH_LOOKUP[$operator]['joiner'];
+ $this->variableNames = $this->setVariableNames();
+ $this->expressionString = $this->setExpressionString();
+ }
+
+ /**
+ * @return array<string>
+ */
+ private function setVariableNames(): array
+ {
+ return array_unique(array_map(
+ static fn (VarSpecifier $varSpecifier): string => $varSpecifier->name(),
+ $this->varSpecifiers
+ ));
+ }
+
+ private function setExpressionString(): string
+ {
+ $varSpecifierString = implode(',', array_map(
+ static fn (VarSpecifier $variable): string => $variable->toString(),
+ $this->varSpecifiers
+ ));
+
+ return '{'.$this->operator.$varSpecifierString.'}';
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['operator'], ...$properties['varSpecifiers']);
+ }
+
+ /**
+ * @throws SyntaxError if the expression is invalid
+ * @throws SyntaxError if the operator used in the expression is invalid
+ * @throws SyntaxError if the variable specifiers is invalid
+ */
+ public static function createFromString(string $expression): self
+ {
+ if (1 !== preg_match(self::REGEXP_EXPRESSION, $expression, $parts)) {
+ throw new SyntaxError('The expression "'.$expression.'" is invalid.');
+ }
+
+ /** @var array{operator:string, variables:string} $parts */
+ $parts = $parts + ['operator' => ''];
+ if ('' !== $parts['operator'] && false !== strpos(self::RESERVED_OPERATOR, $parts['operator'])) {
+ throw new SyntaxError('The operator used in the expression "'.$expression.'" is reserved.');
+ }
+
+ return new Expression($parts['operator'], ...array_map(
+ static fn (string $varSpec): VarSpecifier => VarSpecifier::createFromString($varSpec),
+ explode(',', $parts['variables'])
+ ));
+ }
+
+ /**
+ * Returns the expression string representation.
+ *
+ */
+ public function toString(): string
+ {
+ return $this->expressionString;
+ }
+
+ /**
+ * @return array<string>
+ */
+ public function variableNames(): array
+ {
+ return $this->variableNames;
+ }
+
+ public function expand(VariableBag $variables): string
+ {
+ $parts = [];
+ foreach ($this->varSpecifiers as $varSpecifier) {
+ $parts[] = $this->replace($varSpecifier, $variables);
+ }
+
+ $expanded = implode($this->joiner, array_filter($parts, static fn ($value): bool => '' !== $value));
+ if ('' === $expanded) {
+ return $expanded;
+ }
+
+ $prefix = self::OPERATOR_HASH_LOOKUP[$this->operator]['prefix'];
+ if ('' === $prefix) {
+ return $expanded;
+ }
+
+ return $prefix.$expanded;
+ }
+
+ /**
+ * Replaces an expression with the given variables.
+ *
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ * @throws TemplateCanNotBeExpanded if the variables contains nested array values
+ */
+ private function replace(VarSpecifier $varSpec, VariableBag $variables): string
+ {
+ $value = $variables->fetch($varSpec->name());
+ if (null === $value) {
+ return '';
+ }
+
+ $useQuery = self::OPERATOR_HASH_LOOKUP[$this->operator]['query'];
+ [$expanded, $actualQuery] = $this->inject($value, $varSpec, $useQuery);
+ if (!$actualQuery) {
+ return $expanded;
+ }
+
+ if ('&' !== $this->joiner && '' === $expanded) {
+ return $varSpec->name();
+ }
+
+ return $varSpec->name().'='.$expanded;
+ }
+
+ /**
+ * @param string|array<string> $value
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function inject($value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if (is_string($value)) {
+ return $this->replaceString($value, $varSpec, $useQuery);
+ }
+
+ return $this->replaceList($value, $varSpec, $useQuery);
+ }
+
+ /**
+ * Expands an expression using a string value.
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function replaceString(string $value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if (':' === $varSpec->modifier()) {
+ $value = substr($value, 0, $varSpec->position());
+ }
+
+ $expanded = rawurlencode($value);
+ if ('+' === $this->operator || '#' === $this->operator) {
+ return [$this->decodeReserved($expanded), $useQuery];
+ }
+
+ return [$expanded, $useQuery];
+ }
+
+ /**
+ * Expands an expression using a list of values.
+ *
+ * @param array<string> $value
+ *
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ *
+ * @return array{0:string, 1:bool}
+ */
+ private function replaceList(array $value, VarSpecifier $varSpec, bool $useQuery): array
+ {
+ if ([] === $value) {
+ return ['', false];
+ }
+
+ if (':' === $varSpec->modifier()) {
+ throw TemplateCanNotBeExpanded::dueToUnableToProcessValueListWithPrefix($varSpec->name());
+ }
+
+ $pairs = [];
+ $isAssoc = $this->isAssoc($value);
+ foreach ($value as $key => $var) {
+ if ($isAssoc) {
+ $key = rawurlencode((string) $key);
+ }
+
+ $var = rawurlencode($var);
+ if ('+' === $this->operator || '#' === $this->operator) {
+ $var = $this->decodeReserved($var);
+ }
+
+ if ('*' === $varSpec->modifier()) {
+ if ($isAssoc) {
+ $var = $key.'='.$var;
+ } elseif ($key > 0 && $useQuery) {
+ $var = $varSpec->name().'='.$var;
+ }
+ }
+
+ $pairs[$key] = $var;
+ }
+
+ if ('*' === $varSpec->modifier()) {
+ if ($isAssoc) {
+ // Don't prepend the value name when using the explode
+ // modifier with an associative array.
+ $useQuery = false;
+ }
+
+ return [implode($this->joiner, $pairs), $useQuery];
+ }
+
+ if ($isAssoc) {
+ // When an associative array is encountered and the
+ // explode modifier is not set, then the result must be
+ // a comma separated list of keys followed by their
+ // respective values.
+ foreach ($pairs as $offset => &$data) {
+ $data = $offset.','.$data;
+ }
+
+ unset($data);
+ }
+
+ return [implode(',', $pairs), $useQuery];
+ }
+
+ /**
+ * Determines if an array is associative.
+ *
+ * This makes the assumption that input arrays are sequences or hashes.
+ * This assumption is a trade-off for accuracy in favor of speed, but it
+ * should work in almost every case where input is supplied for a URI
+ * template.
+ */
+ private function isAssoc(array $array): bool
+ {
+ return [] !== $array && 0 !== array_keys($array)[0];
+ }
+
+ /**
+ * Removes percent encoding on reserved characters (used with + and # modifiers).
+ */
+ private function decodeReserved(string $str): string
+ {
+ static $delimiters = [
+ ':', '/', '?', '#', '[', ']', '@', '!', '$',
+ '&', '\'', '(', ')', '*', '+', ',', ';', '=',
+ ];
+
+ static $delimitersEncoded = [
+ '%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24',
+ '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D',
+ ];
+
+ return str_replace($delimitersEncoded, $delimiters, $str);
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriTemplate/Template.php b/plugins/af_readability/vendor/league/uri/src/UriTemplate/Template.php
new file mode 100644
index 000000000..ecd130fe1
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriTemplate/Template.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use TypeError;
+use function array_merge;
+use function array_unique;
+use function gettype;
+use function is_object;
+use function is_string;
+use function method_exists;
+use function preg_match_all;
+use function preg_replace;
+use function sprintf;
+use function strpos;
+use const PREG_SET_ORDER;
+
+final class Template
+{
+ /**
+ * Expression regular expression pattern.
+ */
+ private const REGEXP_EXPRESSION_DETECTOR = '/\{[^\}]*\}/x';
+
+ private string $template;
+ /** @var array<string, Expression> */
+ private array $expressions = [];
+ /** @var array<string> */
+ private array $variableNames;
+
+ private function __construct(string $template, Expression ...$expressions)
+ {
+ $this->template = $template;
+ $variableNames = [];
+ foreach ($expressions as $expression) {
+ $this->expressions[$expression->toString()] = $expression;
+ $variableNames[] = $expression->variableNames();
+ }
+ $this->variableNames = array_unique(array_merge([], ...$variableNames));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['template'], ...array_values($properties['expressions']));
+ }
+
+ /**
+ * @param object|string $template a string or an object with the __toString method
+ *
+ * @throws TypeError if the template is not a string or an object with the __toString method
+ * @throws SyntaxError if the template contains invalid expressions
+ * @throws SyntaxError if the template contains invalid variable specification
+ */
+ public static function createFromString($template): self
+ {
+ if (is_object($template) && method_exists($template, '__toString')) {
+ $template = (string) $template;
+ }
+
+ if (!is_string($template)) {
+ throw new TypeError(sprintf('The template must be a string or a stringable object %s given.', gettype($template)));
+ }
+
+ /** @var string $remainder */
+ $remainder = preg_replace(self::REGEXP_EXPRESSION_DETECTOR, '', $template);
+ if (false !== strpos($remainder, '{') || false !== strpos($remainder, '}')) {
+ throw new SyntaxError('The template "'.$template.'" contains invalid expressions.');
+ }
+
+ $names = [];
+ preg_match_all(self::REGEXP_EXPRESSION_DETECTOR, $template, $findings, PREG_SET_ORDER);
+ $arguments = [];
+ foreach ($findings as $finding) {
+ if (!isset($names[$finding[0]])) {
+ $arguments[] = Expression::createFromString($finding[0]);
+ $names[$finding[0]] = 1;
+ }
+ }
+
+ return new self($template, ...$arguments);
+ }
+
+ public function toString(): string
+ {
+ return $this->template;
+ }
+
+ /**
+ * @return array<string>
+ */
+ public function variableNames(): array
+ {
+ return $this->variableNames;
+ }
+
+ /**
+ * @throws TemplateCanNotBeExpanded if the variables is an array and a ":" modifier needs to be applied
+ * @throws TemplateCanNotBeExpanded if the variables contains nested array values
+ */
+ public function expand(VariableBag $variables): string
+ {
+ $uriString = $this->template;
+ /** @var Expression $expression */
+ foreach ($this->expressions as $pattern => $expression) {
+ $uriString = str_replace($pattern, $expression->expand($variables), $uriString);
+ }
+
+ return $uriString;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriTemplate/VarSpecifier.php b/plugins/af_readability/vendor/league/uri/src/UriTemplate/VarSpecifier.php
new file mode 100644
index 000000000..ac49efb53
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriTemplate/VarSpecifier.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\SyntaxError;
+use function preg_match;
+
+final class VarSpecifier
+{
+ /**
+ * Variables specification regular expression pattern.
+ *
+ * @link https://tools.ietf.org/html/rfc6570#section-2.3
+ */
+ private const REGEXP_VARSPEC = '/^
+ (?<name>(?:[A-z0-9_\.]|%[0-9a-fA-F]{2})+)
+ (?<modifier>\:(?<position>\d+)|\*)?
+ $/x';
+
+ private string $name;
+ private string $modifier;
+ private int $position;
+
+ private function __construct(string $name, string $modifier, int $position)
+ {
+ $this->name = $name;
+ $this->modifier = $modifier;
+ $this->position = $position;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['name'], $properties['modifier'], $properties['position']);
+ }
+
+ public static function createFromString(string $specification): self
+ {
+ if (1 !== preg_match(self::REGEXP_VARSPEC, $specification, $parsed)) {
+ throw new SyntaxError('The variable specification "'.$specification.'" is invalid.');
+ }
+
+ $parsed += ['modifier' => '', 'position' => ''];
+ if ('' !== $parsed['position']) {
+ $parsed['position'] = (int) $parsed['position'];
+ $parsed['modifier'] = ':';
+ }
+
+ if ('' === $parsed['position']) {
+ $parsed['position'] = 0;
+ }
+
+ if (10000 <= $parsed['position']) {
+ throw new SyntaxError('The variable specification "'.$specification.'" is invalid the position modifier must be lower than 10000.');
+ }
+
+ return new self($parsed['name'], $parsed['modifier'], $parsed['position']);
+ }
+
+ public function toString(): string
+ {
+ if (0 < $this->position) {
+ return $this->name.$this->modifier.$this->position;
+ }
+
+ return $this->name.$this->modifier;
+ }
+
+ public function name(): string
+ {
+ return $this->name;
+ }
+
+ public function modifier(): string
+ {
+ return $this->modifier;
+ }
+
+ public function position(): int
+ {
+ return $this->position;
+ }
+}
diff --git a/plugins/af_readability/vendor/league/uri/src/UriTemplate/VariableBag.php b/plugins/af_readability/vendor/league/uri/src/UriTemplate/VariableBag.php
new file mode 100644
index 000000000..cf60de91e
--- /dev/null
+++ b/plugins/af_readability/vendor/league/uri/src/UriTemplate/VariableBag.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use TypeError;
+use function gettype;
+use function is_array;
+use function is_bool;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function sprintf;
+
+final class VariableBag
+{
+ /**
+ * @var array<string,string|array<string>>
+ */
+ private array $variables = [];
+
+ /**
+ * @param iterable<string,string|bool|int|float|array<string|bool|int|float>> $variables
+ */
+ public function __construct(iterable $variables = [])
+ {
+ foreach ($variables as $name => $value) {
+ $this->assign($name, $value);
+ }
+ }
+
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['variables']);
+ }
+
+ /**
+ * @return array<string,string|array<string>>
+ */
+ public function all(): array
+ {
+ return $this->variables;
+ }
+
+ /**
+ * Fetches the variable value if none found returns null.
+ *
+ * @return null|string|array<string>
+ */
+ public function fetch(string $name)
+ {
+ return $this->variables[$name] ?? null;
+ }
+
+ /**
+ * @param string|bool|int|float|array<string|bool|int|float> $value
+ */
+ public function assign(string $name, $value): void
+ {
+ $this->variables[$name] = $this->normalizeValue($value, $name, true);
+ }
+
+ /**
+ * @param mixed $value the value to be expanded
+ *
+ * @throws TemplateCanNotBeExpanded if the value contains nested list
+ *
+ * @return string|array<string>
+ */
+ private function normalizeValue($value, string $name, bool $isNestedListAllowed)
+ {
+ if (is_bool($value)) {
+ return true === $value ? '1' : '0';
+ }
+
+ if (null === $value || is_scalar($value) || (is_object($value) && method_exists($value, '__toString'))) {
+ return (string) $value;
+ }
+
+ if (!is_array($value)) {
+ throw new TypeError(sprintf('The variable '.$name.' must be NULL, a scalar or a stringable object `%s` given', gettype($value)));
+ }
+
+ if (!$isNestedListAllowed) {
+ throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name);
+ }
+
+ foreach ($value as &$var) {
+ $var = self::normalizeValue($var, $name, false);
+ }
+ unset($var);
+
+ return $value;
+ }
+
+ /**
+ * Replaces elements from passed variables into the current instance.
+ */
+ public function replace(VariableBag $variables): self
+ {
+ return new self($this->variables + $variables->variables);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/.gitattributes b/plugins/af_readability/vendor/masterminds/html5/.gitattributes
new file mode 100644
index 000000000..3d291a027
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/.gitattributes
@@ -0,0 +1,8 @@
+.gitattributes export-ignore
+.gitignore export-ignore
+.php_cs.dist export-ignore
+.scrutinizer.yml export-ignore
+.travis.yml export-ignore
+example.php export-ignore
+phpunit.xml.dist export-ignore
+/test export-ignore
diff --git a/plugins/af_readability/vendor/masterminds/html5/.gitignore b/plugins/af_readability/vendor/masterminds/html5/.gitignore
new file mode 100644
index 000000000..1fa9e5861
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/.gitignore
@@ -0,0 +1,5 @@
+vendor/
+scratch.php
+composer.lock
+build/
+.php_cs.cache
diff --git a/plugins/af_readability/vendor/masterminds/html5/.php_cs.dist b/plugins/af_readability/vendor/masterminds/html5/.php_cs.dist
new file mode 100644
index 000000000..d5e49183d
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/.php_cs.dist
@@ -0,0 +1,14 @@
+<?php
+
+$finder = PhpCsFixer\Finder::create()
+ ->in(__DIR__)
+;
+
+return PhpCsFixer\Config::create()
+ ->setRules(array(
+ '@Symfony' => true,
+ 'concat_space' => array('spacing' => 'one'),
+ 'phpdoc_annotation_without_dot' => false,
+ ))
+ ->setFinder($finder)
+;
diff --git a/plugins/af_readability/vendor/masterminds/html5/.scrutinizer.yml b/plugins/af_readability/vendor/masterminds/html5/.scrutinizer.yml
new file mode 100644
index 000000000..dcdd2047c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/.scrutinizer.yml
@@ -0,0 +1,41 @@
+tools:
+ php_mess_detector: true
+ php_analyzer:
+ config:
+ parameter_reference_check: { enabled: false }
+ checkstyle: { enabled: false, no_trailing_whitespace: true, naming: { enabled: true, local_variable: '^[a-z][a-zA-Z0-9]*$', abstract_class_name: ^Abstract|Factory$, utility_class_name: 'Utils?$', constant_name: '^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$', property_name: '^[a-z][a-zA-Z0-9]*$', method_name: '^(?:[a-z]|__)[a-zA-Z0-9]*$', parameter_name: '^[a-z][a-zA-Z0-9]*$', interface_name: '^[A-Z][a-zA-Z0-9]*Interface$', type_name: '^[A-Z][a-zA-Z0-9]*$', exception_name: '^[A-Z][a-zA-Z0-9]*Exception$', isser_method_name: '^(?:is|has|should|may|supports)' } }
+ unreachable_code: { enabled: false }
+ check_access_control: { enabled: false }
+ typo_checks: { enabled: false }
+ check_variables: { enabled: false }
+ check_calls: { enabled: true, too_many_arguments: true, missing_argument: true, argument_type_checks: lenient }
+ suspicious_code: { enabled: false, overriding_parameter: false, overriding_closure_use: false, parameter_closure_use_conflict: false, parameter_multiple_times: false, non_existent_class_in_instanceof_check: false, non_existent_class_in_catch_clause: false, assignment_of_null_return: false, non_commented_switch_fallthrough: false, non_commented_empty_catch_block: false, overriding_private_members: false, use_statement_alias_conflict: false, precedence_in_condition_assignment: false }
+ dead_assignments: { enabled: false }
+ verify_php_doc_comments: { enabled: false, parameters: false, return: false, suggest_more_specific_types: false, ask_for_return_if_not_inferrable: false, ask_for_param_type_annotation: false }
+ loops_must_use_braces: { enabled: false }
+ check_usage_context: { enabled: true, foreach: { value_as_reference: true, traversable: true } }
+ simplify_boolean_return: { enabled: false }
+ phpunit_checks: { enabled: false }
+ reflection_checks: { enabled: false }
+ precedence_checks: { enabled: true, assignment_in_condition: true, comparison_of_bit_result: true }
+ basic_semantic_checks: { enabled: false }
+ unused_code: { enabled: false }
+ deprecation_checks: { enabled: false }
+ useless_function_calls: { enabled: false }
+ metrics_lack_of_cohesion_methods: { enabled: false }
+ metrics_coupling: { enabled: true, stable_code: { namespace_prefixes: { }, classes: { } } }
+ doctrine_parameter_binding: { enabled: false }
+ doctrine_entity_manager_injection: { enabled: false }
+ symfony_request_injection: { enabled: false }
+ doc_comment_fixes: { enabled: false }
+ reflection_fixes: { enabled: false }
+ use_statement_fixes: { enabled: true, remove_unused: true, preserve_multiple: false, preserve_blanklines: false, order_alphabetically: false }
+ php_code_sniffer: true
+ sensiolabs_security_checker: true
+ php_cpd: true
+ php_loc: true
+ php_pdepend: true
+ external_code_coverage: true
+filter:
+ paths:
+ - src/*
diff --git a/plugins/af_readability/vendor/masterminds/html5/.travis.yml b/plugins/af_readability/vendor/masterminds/html5/.travis.yml
new file mode 100644
index 000000000..44661b1d2
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/.travis.yml
@@ -0,0 +1,47 @@
+language: php
+dist: trusty
+sudo: false
+
+matrix:
+ include:
+ - php: 5.3
+ dist: precise
+ env: COMPOSER_FLAGS="--prefer-lowest"
+ - php: 5.4
+ - php: 5.5
+ - php: 5.6
+ env: SCRUTINIZER=1 PHPUNIT_FLAGS="--coverage-clover=coverage.xml"
+ - php: 7.0
+ env: COMPOSER_FLAGS="--prefer-lowest"
+ - php: 7.1
+ env: CS_FIXER=1
+ - php: 7.2
+ - php: 7.3
+ env: BENCHMARK=1
+ - php: 7.4
+ - php: 8.0
+ dist: bionic
+ fast_finish: true
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+before_script:
+ - if [[ SCRUTINIZER != '1' ]]; then phpenv config-rm xdebug.ini || true; fi
+ - composer self-update
+ - if [[ ${TRAVIS_PHP_VERSION:0:1} == "8" ]]; then composer config platform.php 7.4; fi
+ - composer update $COMPOSER_FLAGS --prefer-dist
+
+script:
+ - stty cols 120
+ - if [ "$CS_FIXER" == 1 ]; then wget https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.13.1/php-cs-fixer.phar && php php-cs-fixer.phar fix --dry-run --diff; fi
+ - mkdir -p build/logs
+ - ./vendor/bin/phpunit $PHPUNIT_FLAGS
+
+after_script:
+ - if [ "$SCRUTINIZER" == 1 ]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.xml; fi
+ - if [ "$BENCHMARK" == 1 ]; then php test/benchmark/run.php 10; fi
+
+notifications:
+ irc: "irc.freenode.net#masterminds"
diff --git a/plugins/af_readability/vendor/masterminds/html5/CREDITS b/plugins/af_readability/vendor/masterminds/html5/CREDITS
new file mode 100644
index 000000000..c2dbc4b64
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/CREDITS
@@ -0,0 +1,11 @@
+Matt Butcher [technosophos] <[email protected]> (lead)
+Matt Farina [mattfarina] <[email protected]> (lead)
+Asmir Mustafic [goetas] <[email protected]> (contributor)
+Edward Z. Yang [ezyang] <[email protected]> (contributor)
+Geoffrey Sneddon [gsnedders] <[email protected]> (contributor)
+Kukhar Vasily [ngreduce] <[email protected]> (contributor)
+Rune Christensen [MrElectronic] <[email protected]> (contributor)
+Mišo Belica [miso-belica] <[email protected]> (contributor)
+Asmir Mustafic [goetas] <[email protected]> (contributor)
+KITAITI Makoto [KitaitiMakoto] <[email protected]> (contributor)
+Jacob Floyd [cognifloyd] <[email protected]> (contributor)
diff --git a/plugins/af_readability/vendor/masterminds/html5/LICENSE.txt b/plugins/af_readability/vendor/masterminds/html5/LICENSE.txt
new file mode 100644
index 000000000..3c275b54a
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/LICENSE.txt
@@ -0,0 +1,66 @@
+## HTML5-PHP License
+
+Copyright (c) 2013 The Authors of HTML5-PHP
+
+Matt Butcher - [email protected]
+Matt Farina - [email protected]
+Asmir Mustafic - [email protected]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+## HTML5Lib License
+
+Portions of this are based on html5lib's PHP version, which was a
+sub-project of html5lib. The following is the list of contributors from
+html5lib:
+
+html5lib:
+
+Copyright (c) 2006-2009 The Authors
+
+Contributors:
+James Graham - [email protected]
+Anne van Kesteren - [email protected]
+Lachlan Hunt - [email protected]
+Matt McDonald - [email protected]
+Sam Ruby - [email protected]
+Ian Hickson (Google) - [email protected]
+Thomas Broyer - [email protected]
+Jacques Distler - [email protected]
+Henri Sivonen - [email protected]
+Adam Barth - [email protected]
+Eric Seidel - [email protected]
+The Mozilla Foundation (contributions from Henri Sivonen since 2008)
+David Flanagan (Mozilla) - [email protected]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/plugins/af_readability/vendor/masterminds/html5/README.md b/plugins/af_readability/vendor/masterminds/html5/README.md
new file mode 100644
index 000000000..546d3e24c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/README.md
@@ -0,0 +1,254 @@
+# HTML5-PHP
+
+HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP.
+It is stable and used in many production websites, and has
+well over [five million downloads](https://packagist.org/packages/masterminds/html5).
+
+HTML5 provides the following features.
+
+- An HTML5 serializer
+- Support for PHP namespaces
+- Composer support
+- Event-based (SAX-like) parser
+- A DOM tree builder
+- Interoperability with [QueryPath](https://github.com/technosophos/querypath)
+- Runs on **PHP** 5.3.0 or newer
+
+[![Build Status](https://travis-ci.org/Masterminds/html5-php.png?branch=master)](https://travis-ci.org/Masterminds/html5-php)
+[![Latest Stable Version](https://poser.pugx.org/masterminds/html5/v/stable.png)](https://packagist.org/packages/masterminds/html5)
+[![Code Coverage](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master)
+[![Stability: Sustained](https://masterminds.github.io/stability/sustained.svg)](https://masterminds.github.io/stability/sustained.html)
+
+## Installation
+
+Install HTML5-PHP using [composer](http://getcomposer.org/).
+
+By adding the `masterminds/html5` dependency to your `composer.json` file:
+
+```json
+{
+ "require" : {
+ "masterminds/html5": "^2.0"
+ },
+}
+```
+
+By invoking require command via composer executable:
+
+```bash
+composer require masterminds/html5
+```
+
+## Basic Usage
+
+HTML5-PHP has a high-level API and a low-level API.
+
+Here is how you use the high-level `HTML5` library API:
+
+```php
+<?php
+// Assuming you installed from Composer:
+require "vendor/autoload.php";
+
+use Masterminds\HTML5;
+
+// An example HTML document:
+$html = <<< 'HERE'
+ <html>
+ <head>
+ <title>TEST</title>
+ </head>
+ <body id='foo'>
+ <h1>Hello World</h1>
+ <p>This is a test of the HTML5 parser.</p>
+ </body>
+ </html>
+HERE;
+
+// Parse the document. $dom is a DOMDocument.
+$html5 = new HTML5();
+$dom = $html5->loadHTML($html);
+
+// Render it as HTML5:
+print $html5->saveHTML($dom);
+
+// Or save it to a file:
+$html5->save($dom, 'out.html');
+```
+
+The `$dom` created by the parser is a full `DOMDocument` object. And the
+`save()` and `saveHTML()` methods will take any DOMDocument.
+
+### Options
+
+It is possible to pass in an array of configuration options when loading
+an HTML5 document.
+
+```php
+// An associative array of options
+$options = array(
+ 'option_name' => 'option_value',
+);
+
+// Provide the options to the constructor
+$html5 = new HTML5($options);
+
+$dom = $html5->loadHTML($html);
+```
+
+The following options are supported:
+
+* `encode_entities` (boolean): Indicates that the serializer should aggressively
+ encode characters as entities. Without this, it only encodes the bare
+ minimum.
+* `disable_html_ns` (boolean): Prevents the parser from automatically
+ assigning the HTML5 namespace to the DOM document. This is for
+ non-namespace aware DOM tools.
+* `target_document` (\DOMDocument): A DOM document that will be used as the
+ destination for the parsed nodes.
+* `implicit_namespaces` (array): An assoc array of namespaces that should be
+ used by the parser. Name is tag prefix, value is NS URI.
+
+## The Low-Level API
+
+This library provides the following low-level APIs that you can use to
+create more customized HTML5 tools:
+
+- A SAX-like event-based parser that you can hook into for special kinds
+of parsing.
+- A flexible error-reporting mechanism that can be tuned to document
+syntax checking.
+- A DOM implementation that uses PHP's built-in DOM library.
+
+The unit tests exercise each piece of the API, and every public function
+is well-documented.
+
+### Parser Design
+
+The parser is designed as follows:
+
+- The `Scanner` handles scanning on behalf of the parser.
+- The `Tokenizer` requests data off of the scanner, parses it, clasifies
+it, and sends it to an `EventHandler`. It is a *recursive descent parser.*
+- The `EventHandler` receives notifications and data for each specific
+semantic event that occurs during tokenization.
+- The `DOMBuilder` is an `EventHandler` that listens for tokenizing
+events and builds a document tree (`DOMDocument`) based on the events.
+
+### Serializer Design
+
+The serializer takes a data structure (the `DOMDocument`) and transforms
+it into a character representation -- an HTML5 document.
+
+The serializer is broken into three parts:
+
+- The `OutputRules` contain the rules to turn DOM elements into strings. The
+rules are an implementation of the interface `RulesInterface` allowing for
+different rule sets to be used.
+- The `Traverser`, which is a special-purpose tree walker. It visits
+each node node in the tree and uses the `OutputRules` to transform the node
+into a string.
+- `HTML5` manages the `Traverser` and stores the resultant data
+in the correct place.
+
+The serializer (`save()`, `saveHTML()`) follows the
+[section 8.9 of the HTML 5.0 spec](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments).
+So tags are serialized according to these rules:
+
+- A tag with children: &lt;foo&gt;CHILDREN&lt;/foo&gt;
+- A tag that cannot have content: &lt;foo&gt; (no closing tag)
+- A tag that could have content, but doesn't: &lt;foo&gt;&lt;/foo&gt;
+
+## Known Issues (Or, Things We Designed Against the Spec)
+
+Please check the issue queue for a full list, but the following are
+issues known issues that are not presently on the roadmap:
+
+- Namespaces: HTML5 only [supports a selected list of namespaces](http://www.w3.org/TR/html5/infrastructure.html#namespaces)
+ and they do not operate in the same way as XML namespaces. A `:` has no special
+ meaning.
+ By default the parser does not support XML style namespaces via `:`;
+ to enable the XML namespaces see the [XML Namespaces section](#xml-namespaces)
+- Scripts: This parser does not contain a JavaScript or a CSS
+ interpreter. While one may be supplied, not all features will be
+ supported.
+- Rentrance: The current parser is not re-entrant. (Thus you can't pause
+ the parser to modify the HTML string mid-parse.)
+- Validation: The current tree builder is **not** a validating parser.
+ While it will correct some HTML, it does not check that the HTML
+ conforms to the standard. (Should you wish, you can build a validating
+ parser by extending DOMTree or building your own EventHandler
+ implementation.)
+ * There is limited support for insertion modes.
+ * Some autocorrection is done automatically.
+ * Per the spec, many legacy tags are admitted and correctly handled,
+ even though they are technically not part of HTML5.
+- Attribute names and values: Due to the implementation details of the
+ PHP implementation of DOM, attribute names that do not follow the
+ XML 1.0 standard are not inserted into the DOM. (Effectively, they
+ are ignored.) If you've got a clever fix for this, jump in!
+- Processor Instructions: The HTML5 spec does not allow processor
+ instructions. We do. Since this is a server-side library, we think
+ this is useful. And that means, dear reader, that in some cases you
+ can parse the HTML from a mixed PHP/HTML document. This, however,
+ is an incidental feature, not a core feature.
+- HTML manifests: Unsupported.
+- PLAINTEXT: Unsupported.
+- Adoption Agency Algorithm: Not yet implemented. (8.2.5.4.7)
+
+## XML Namespaces
+
+To use XML style namespaces you have to configure well the main `HTML5` instance.
+
+```php
+use Masterminds\HTML5;
+$html = new HTML5(array(
+ "xmlNamespaces" => true
+));
+
+$dom = $html->loadHTML('<t:tag xmlns:t="http://www.example.com"/>');
+
+$dom->documentElement->namespaceURI; // http://www.example.com
+
+```
+
+You can also add some default prefixes that will not require the namespace declaration,
+but its elements will be namespaced.
+
+```php
+use Masterminds\HTML5;
+$html = new HTML5(array(
+ "implicitNamespaces"=>array(
+ "t"=>"http://www.example.com"
+ )
+));
+
+$dom = $html->loadHTML('<t:tag/>');
+
+$dom->documentElement->namespaceURI; // http://www.example.com
+
+```
+
+## Thanks to...
+
+The dedicated (and patient) contributors of patches small and large,
+who have already made this library better.See the CREDITS file for
+a list of contributors.
+
+We owe a huge debt of gratitude to the original authors of html5lib.
+
+While not much of the original parser remains, we learned a lot from
+reading the html5lib library. And some pieces remain here. In
+particular, much of the UTF-8 and Unicode handling is derived from the
+html5lib project.
+
+## License
+
+This software is released under the MIT license. The original html5lib
+library was also released under the MIT license.
+
+See LICENSE.txt
+
+Certain files contain copyright assertions by specific individuals
+involved with html5lib. Those have been retained where appropriate.
diff --git a/plugins/af_readability/vendor/masterminds/html5/RELEASE.md b/plugins/af_readability/vendor/masterminds/html5/RELEASE.md
new file mode 100644
index 000000000..86c0dac3f
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/RELEASE.md
@@ -0,0 +1,153 @@
+# Release Notes
+
+2.7.5 (2021-07-01)
+
+- #204: Travis: Enable tests on PHP 8.0
+- #207: Fix PHP 8.1 deprecations
+
+2.7.4 (2020-10-01)
+
+- #191: Fix travisci build
+- #195: Add .gitattributes file with export-ignore rules
+- #194: Fix query parameter parsed as character entity
+
+2.7.3 (2020-07-05)
+
+- #190: mitigate cyclic reference between output rules and the traverser objects
+
+2.7.2 (2020-07-01)
+
+- #187: Fixed memory leak in HTML5::saveHTML()
+- #186: Add special case for end tag </br>
+
+2.7.1 (2020-06-14)
+
+- #171: add PHP 7.4 job
+- #178: Prevent infinite loop on un-terminated entity declaration at EOF
+
+2.7.0 (2019-07-25)
+
+- #164: Drop HHVM support
+- #168: Set default encoding in the DOMDocument object
+
+2.6.0 (2019-03-10)
+
+- #163: Allow to pass a charset to the Scanner
+
+2.5.0 (2018-12-27)
+
+- #162, #161, #155, #154, #153, #151: big performance improvements
+- #156: fixed typos
+- #160: adopt and enforce code style
+- #159: remove deprecated php unit base test case
+- #150: backport changes from old master branch
+
+2.4.0 (2018-11-17)
+
+- #148: Improve performance by moving sequence matching
+- #147: Improve the Tokenizer performance
+- #146: Improve performance by relying on a native string instead of InputStream
+- #144: Add DOM extension in composer.json
+- #145: Add more extensions on composer.json, improve phpdocs and remove dead code
+- #143: Remove experimental comment
+
+2.3.1 (2018-10-18)
+
+- #121: Audio is not a block tag (fixed by #141)
+- #136: Handle illegal self-closing according to spec (fixed by #137)
+- #141: Minor fixes in the README
+
+2.3.0 (2017-09-04)
+
+- #129: image within inline svg breaks system (fixed by #133)
+- #131: &sup2; does not work (fixed by #132)
+- #134: Improve tokenizer performance by 20% (alternative version of #130 thanks to @MichaelHeerklotz)
+- #135: Raw & in attributes
+
+2.2.2 (2016-09-22)
+
+- #116: In XML mode, tags are case sensitive
+- #115: Fix PHP Notice in OutputRules
+- #112: fix parsing of options of an optgroup
+- #111: Adding test for the address tag
+
+2.2.1 (2016-05-10)
+
+- #109: Fixed issue where address tag could be written without closing tag (thanks sylus)
+
+2.2.0 (2016-04-11)
+
+- #105: Enable composer cache (for CI/CD)
+- #100: Use mb_substitute_character inset of ini_set for environments where ini_set is disable (e.g., shared hosting)
+- #98: Allow link, meta, style tags in noscript tags
+- #96: Fixed xml:href on svgs that use the "use" breaking
+- #94: Counting UTF8 characters performance improvement
+- #93: Use newer version of coveralls package
+- #90: Remove duplicate test
+- #87: Allow multiple root nodes
+
+2.1.2 (2015-06-07)
+- #82: Support for PHP7
+- #84: Improved boolean attribute handling
+
+2.1.1 (2015-03-23)
+- #78: Fixes bug where unmatched entity like string drops everything after &.
+
+2.1.0 (2015-02-01)
+- #74: Added `disable_html_ns` and `target_doc` dom parsing options
+- Unified option names
+- #73: Fixed alphabet, &szlig; now can be detected
+- #75 and #76: Allow whitespace in RCDATA tags
+- #77: Fixed parsing blunder for json embeds
+- #72: Add options to HTML methods
+
+2.0.2 (2014-12-17)
+- #50: empty document handling
+- #63: tags with strange capitalization
+- #65: dashes and underscores as allowed characters in tag names
+- #68: Fixed issue with non-inline elements inside inline containers
+
+2.0.1 (2014-09-23)
+- #59: Fixed issue parsing some fragments.
+- #56: Incorrectly saw 0 as empty string
+- Sami as new documentation generator
+
+2.0.0 (2014-07-28)
+- #53: Improved boolean attributes handling
+- #52: Facebook HHVM compatibility
+- #48: Adopted PSR-2 as coding standard
+- #47: Moved everything to Masterminds namespace
+- #45: Added custom namespaces
+- #44: Added support to XML-style namespaces
+- #37: Refactored HTML5 class removing static methods
+
+1.0.5 (2014-06-10)
+- #38: Set the dev-master branch as the 1.0.x branch for composer (goetas)
+- #34: Tests use PSR-4 for autoloading. (goetas)
+- #40, #41: Fix entity handling in RCDATA sections. (KitaitiMakoto)
+- #32: Fixed issue where wharacter references were being incorrectly encoded in style tags.
+
+1.0.4 (2014-04-29)
+- #30/#31 Don't throw an exception for invalid tag names.
+
+1.0.3 (2014-02-28)
+- #23 and #29: Ignore attributes with illegal chars in name for the PHP DOM.
+
+1.0.2 (2014-02-12)
+- #23: Handle missing tag close in attribute list.
+- #25: Fixed text escaping in the serializer (HTML% 8.3).
+- #27: Fixed tests on Windows: changed "\n" -> PHP_EOL.
+- #28: Fixed infinite loop for char "&" in unquoted attribute in parser.
+- #26: Updated tag name case handling to deal with uppercase usage.
+- #24: Newlines and tabs are allowed inside quoted attributes (HTML5 8.2.4).
+- Fixed Travis CI testing.
+
+1.0.1 (2013-11-07)
+- CDATA encoding is improved. (Non-standard; Issue #19)
+- Some parser rules were not returning the new current element. (Issue #20)
+- Added, to the README, details on code test coverage and to packagist version.
+- Fixed processor instructions.
+- Improved test coverage and documentation coverage.
+
+1.0.0 (2013-10-02)
+- Initial release.
diff --git a/plugins/af_readability/vendor/masterminds/html5/UPGRADING.md b/plugins/af_readability/vendor/masterminds/html5/UPGRADING.md
new file mode 100644
index 000000000..76e3a19bc
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/UPGRADING.md
@@ -0,0 +1,21 @@
+From 1.x to 2.x
+=================
+
+- All classes uses `Masterminds` namespace.
+- All public static methods has been removed from `HTML5` class and the general API to access the HTML5 functionalities has changed.
+
+ Before:
+
+ $dom = \HTML5::loadHTML('<html>....');
+ \HTML5::saveHTML($dom);
+
+ After:
+
+ use Masterminds\HTML5;
+
+ $html5 = new HTML5();
+
+ $dom = $html5->loadHTML('<html>....');
+ echo $html5->saveHTML($dom);
+
+
diff --git a/plugins/af_readability/vendor/masterminds/html5/bin/entities.php b/plugins/af_readability/vendor/masterminds/html5/bin/entities.php
new file mode 100644
index 000000000..56323a341
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/bin/entities.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Fetch the entities.json file and convert to PHP datastructure.
+ */
+
+// The URL to the official entities JSON file.
+$ENTITIES_URL = 'http://www.w3.org/TR/2012/CR-html5-20121217/entities.json';
+
+$payload = file_get_contents($ENTITIES_URL);
+$json = json_decode($payload);
+
+$table = array();
+foreach ($json as $name => $obj) {
+ $sname = substr($name, 1, -1);
+ $table[$sname] = $obj->characters;
+}
+
+echo '<?php
+namespace Masterminds\\HTML5;
+/** Entity lookup tables. This class is automatically generated. */
+class Entities {
+ public static $byName = ';
+var_export($table);
+echo ';
+}' . PHP_EOL;
+//print serialize($table);
diff --git a/plugins/af_readability/vendor/masterminds/html5/composer.json b/plugins/af_readability/vendor/masterminds/html5/composer.json
new file mode 100644
index 000000000..fb7674e05
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/composer.json
@@ -0,0 +1,42 @@
+{
+ "name": "masterminds/html5",
+ "description": "An HTML5 parser and serializer.",
+ "type": "library",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "license": "MIT",
+ "keywords": ["xml", "html", "html5", "dom", "parser", "serializer", "querypath"],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "[email protected]"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "[email protected]"
+ }
+ ],
+ "require" : {
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-libxml" : "*",
+ "php" : ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit" : "^4.8.35 || ^5.7.21 || ^6 || ^7"
+ },
+ "autoload": {
+ "psr-4": {"Masterminds\\": "src"}
+ },
+ "autoload-dev": {
+ "psr-4": {"Masterminds\\HTML5\\Tests\\": "test/HTML5"}
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/example.php b/plugins/af_readability/vendor/masterminds/html5/example.php
new file mode 100644
index 000000000..e4e1f22f9
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/example.php
@@ -0,0 +1,32 @@
+<?php
+
+require 'vendor/autoload.php';
+use Masterminds\HTML5;
+
+$html = <<< 'HERE'
+ <html>
+ <head>
+ <title>TEST</title>
+ <script language="javascript">
+ if (2 > 1) { alert("Math wins."); }
+ </script>
+ </head>
+ <body id='foo'>
+ <!-- This space intentionally left blank. -->
+ <section class="section-a pretty" id="bar1">
+ <h1>Hello World</h1><p>This is a test of the HTML5 parser.</p>
+ <hr>
+ &amp; Nobody nowhere.
+ </section>
+ <test xmlns:foo="http://example.com/foo">TEST</test>
+ <![CDATA[Because we can.]]>
+ &copy;
+ </body></html>
+HERE;
+
+$html5 = new HTML5();
+$dom = $html5->loadHTML($html);
+
+echo "Converting to HTML 5\n";
+
+$html5->save($dom, fopen('php://stdin', 'w'));
diff --git a/plugins/af_readability/vendor/masterminds/html5/phpunit.xml.dist b/plugins/af_readability/vendor/masterminds/html5/phpunit.xml.dist
new file mode 100644
index 000000000..8e7750d5b
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/phpunit.xml.dist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit colors="true" bootstrap="vendor/autoload.php">
+ <testsuites>
+ <testsuite name="PHPUnit">
+ <directory>test/HTML5/</directory>
+ </testsuite>
+ </testsuites>
+</phpunit>
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5.php
new file mode 100644
index 000000000..c857145fb
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5.php
@@ -0,0 +1,246 @@
+<?php
+
+namespace Masterminds;
+
+use Masterminds\HTML5\Parser\DOMTreeBuilder;
+use Masterminds\HTML5\Parser\Scanner;
+use Masterminds\HTML5\Parser\Tokenizer;
+use Masterminds\HTML5\Serializer\OutputRules;
+use Masterminds\HTML5\Serializer\Traverser;
+
+/**
+ * This class offers convenience methods for parsing and serializing HTML5.
+ * It is roughly designed to mirror the \DOMDocument native class.
+ */
+class HTML5
+{
+ /**
+ * Global options for the parser and serializer.
+ *
+ * @var array
+ */
+ private $defaultOptions = array(
+ // Whether the serializer should aggressively encode all characters as entities.
+ 'encode_entities' => false,
+
+ // Prevents the parser from automatically assigning the HTML5 namespace to the DOM document.
+ 'disable_html_ns' => false,
+ );
+
+ protected $errors = array();
+
+ public function __construct(array $defaultOptions = array())
+ {
+ $this->defaultOptions = array_merge($this->defaultOptions, $defaultOptions);
+ }
+
+ /**
+ * Get the current default options.
+ *
+ * @return array
+ */
+ public function getOptions()
+ {
+ return $this->defaultOptions;
+ }
+
+ /**
+ * Load and parse an HTML file.
+ *
+ * This will apply the HTML5 parser, which is tolerant of many
+ * varieties of HTML, including XHTML 1, HTML 4, and well-formed HTML
+ * 3. Note that in these cases, not all of the old data will be
+ * preserved. For example, XHTML's XML declaration will be removed.
+ *
+ * The rules governing parsing are set out in the HTML 5 spec.
+ *
+ * @param string|resource $file The path to the file to parse. If this is a resource, it is
+ * assumed to be an open stream whose pointer is set to the first
+ * byte of input.
+ * @param array $options Configuration options when parsing the HTML.
+ *
+ * @return \DOMDocument A DOM document. These object type is defined by the libxml
+ * library, and should have been included with your version of PHP.
+ */
+ public function load($file, array $options = array())
+ {
+ // Handle the case where file is a resource.
+ if (is_resource($file)) {
+ return $this->parse(stream_get_contents($file), $options);
+ }
+
+ return $this->parse(file_get_contents($file), $options);
+ }
+
+ /**
+ * Parse a HTML Document from a string.
+ *
+ * Take a string of HTML 5 (or earlier) and parse it into a
+ * DOMDocument.
+ *
+ * @param string $string A html5 document as a string.
+ * @param array $options Configuration options when parsing the HTML.
+ *
+ * @return \DOMDocument A DOM document. DOM is part of libxml, which is included with
+ * almost all distribtions of PHP.
+ */
+ public function loadHTML($string, array $options = array())
+ {
+ return $this->parse($string, $options);
+ }
+
+ /**
+ * Convenience function to load an HTML file.
+ *
+ * This is here to provide backwards compatibility with the
+ * PHP DOM implementation. It simply calls load().
+ *
+ * @param string $file The path to the file to parse. If this is a resource, it is
+ * assumed to be an open stream whose pointer is set to the first
+ * byte of input.
+ * @param array $options Configuration options when parsing the HTML.
+ *
+ * @return \DOMDocument A DOM document. These object type is defined by the libxml
+ * library, and should have been included with your version of PHP.
+ */
+ public function loadHTMLFile($file, array $options = array())
+ {
+ return $this->load($file, $options);
+ }
+
+ /**
+ * Parse a HTML fragment from a string.
+ *
+ * @param string $string the HTML5 fragment as a string
+ * @param array $options Configuration options when parsing the HTML
+ *
+ * @return \DOMDocumentFragment A DOM fragment. The DOM is part of libxml, which is included with
+ * almost all distributions of PHP.
+ */
+ public function loadHTMLFragment($string, array $options = array())
+ {
+ return $this->parseFragment($string, $options);
+ }
+
+ /**
+ * Return all errors encountered into parsing phase.
+ *
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ /**
+ * Return true it some errors were encountered into parsing phase.
+ *
+ * @return bool
+ */
+ public function hasErrors()
+ {
+ return count($this->errors) > 0;
+ }
+
+ /**
+ * Parse an input string.
+ *
+ * @param string $input
+ * @param array $options
+ *
+ * @return \DOMDocument
+ */
+ public function parse($input, array $options = array())
+ {
+ $this->errors = array();
+ $options = array_merge($this->defaultOptions, $options);
+ $events = new DOMTreeBuilder(false, $options);
+ $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8');
+ $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML);
+
+ $parser->parse();
+ $this->errors = $events->getErrors();
+
+ return $events->document();
+ }
+
+ /**
+ * Parse an input stream where the stream is a fragment.
+ *
+ * Lower-level loading function. This requires an input stream instead
+ * of a string, file, or resource.
+ *
+ * @param string $input The input data to parse in the form of a string.
+ * @param array $options An array of options.
+ *
+ * @return \DOMDocumentFragment
+ */
+ public function parseFragment($input, array $options = array())
+ {
+ $options = array_merge($this->defaultOptions, $options);
+ $events = new DOMTreeBuilder(true, $options);
+ $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8');
+ $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML);
+
+ $parser->parse();
+ $this->errors = $events->getErrors();
+
+ return $events->fragment();
+ }
+
+ /**
+ * Save a DOM into a given file as HTML5.
+ *
+ * @param mixed $dom The DOM to be serialized.
+ * @param string|resource $file The filename to be written or resource to write to.
+ * @param array $options Configuration options when serializing the DOM. These include:
+ * - encode_entities: Text written to the output is escaped by default and not all
+ * entities are encoded. If this is set to true all entities will be encoded.
+ * Defaults to false.
+ */
+ public function save($dom, $file, $options = array())
+ {
+ $close = true;
+ if (is_resource($file)) {
+ $stream = $file;
+ $close = false;
+ } else {
+ $stream = fopen($file, 'wb');
+ }
+ $options = array_merge($this->defaultOptions, $options);
+ $rules = new OutputRules($stream, $options);
+ $trav = new Traverser($dom, $stream, $rules, $options);
+
+ $trav->walk();
+ /*
+ * release the traverser to avoid cyclic references and allow PHP to free memory without waiting for gc_collect_cycles
+ */
+ $rules->unsetTraverser();
+ if ($close) {
+ fclose($stream);
+ }
+ }
+
+ /**
+ * Convert a DOM into an HTML5 string.
+ *
+ * @param mixed $dom The DOM to be serialized.
+ * @param array $options Configuration options when serializing the DOM. These include:
+ * - encode_entities: Text written to the output is escaped by default and not all
+ * entities are encoded. If this is set to true all entities will be encoded.
+ * Defaults to false.
+ *
+ * @return string A HTML5 documented generated from the DOM.
+ */
+ public function saveHTML($dom, $options = array())
+ {
+ $stream = fopen('php://temp', 'wb');
+ $this->save($dom, $stream, array_merge($this->defaultOptions, $options));
+
+ $html = stream_get_contents($stream, -1, 0);
+
+ fclose($stream);
+
+ return $html;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php
new file mode 100644
index 000000000..8fe798789
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Elements.php
@@ -0,0 +1,619 @@
+<?php
+/**
+ * Provide general element functions.
+ */
+
+namespace Masterminds\HTML5;
+
+/**
+ * This class provides general information about HTML5 elements,
+ * including syntactic and semantic issues.
+ * Parsers and serializers can
+ * use this class as a reference point for information about the rules
+ * of various HTML5 elements.
+ *
+ * @todo consider using a bitmask table lookup. There is enough overlap in
+ * naming that this could significantly shrink the size and maybe make it
+ * faster. See the Go teams implementation at https://code.google.com/p/go/source/browse/html/atom.
+ */
+class Elements
+{
+ /**
+ * Indicates an element is described in the specification.
+ */
+ const KNOWN_ELEMENT = 1;
+
+ // From section 8.1.2: "script", "style"
+ // From 8.2.5.4.7 ("in body" insertion mode): "noembed"
+ // From 8.4 "style", "xmp", "iframe", "noembed", "noframes"
+ /**
+ * Indicates the contained text should be processed as raw text.
+ */
+ const TEXT_RAW = 2;
+
+ // From section 8.1.2: "textarea", "title"
+ /**
+ * Indicates the contained text should be processed as RCDATA.
+ */
+ const TEXT_RCDATA = 4;
+
+ /**
+ * Indicates the tag cannot have content.
+ */
+ const VOID_TAG = 8;
+
+ // "address", "article", "aside", "blockquote", "center", "details", "dialog", "dir", "div", "dl",
+ // "fieldset", "figcaption", "figure", "footer", "header", "hgroup", "menu",
+ // "nav", "ol", "p", "section", "summary", "ul"
+ // "h1", "h2", "h3", "h4", "h5", "h6"
+ // "pre", "listing"
+ // "form"
+ // "plaintext"
+ /**
+ * Indicates that if a previous event is for a P tag, that element
+ * should be considered closed.
+ */
+ const AUTOCLOSE_P = 16;
+
+ /**
+ * Indicates that the text inside is plaintext (pre).
+ */
+ const TEXT_PLAINTEXT = 32;
+
+ // See https://developer.mozilla.org/en-US/docs/HTML/Block-level_elements
+ /**
+ * Indicates that the tag is a block.
+ */
+ const BLOCK_TAG = 64;
+
+ /**
+ * Indicates that the tag allows only inline elements as child nodes.
+ */
+ const BLOCK_ONLY_INLINE = 128;
+
+ /**
+ * The HTML5 elements as defined in http://dev.w3.org/html5/markup/elements.html.
+ *
+ * @var array
+ */
+ public static $html5 = array(
+ 'a' => 1,
+ 'abbr' => 1,
+ 'address' => 65, // NORMAL | BLOCK_TAG
+ 'area' => 9, // NORMAL | VOID_TAG
+ 'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'audio' => 1, // NORMAL
+ 'b' => 1,
+ 'base' => 9, // NORMAL | VOID_TAG
+ 'bdi' => 1,
+ 'bdo' => 1,
+ 'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'body' => 1,
+ 'br' => 9, // NORMAL | VOID_TAG
+ 'button' => 1,
+ 'canvas' => 65, // NORMAL | BLOCK_TAG
+ 'caption' => 1,
+ 'cite' => 1,
+ 'code' => 1,
+ 'col' => 9, // NORMAL | VOID_TAG
+ 'colgroup' => 1,
+ 'command' => 9, // NORMAL | VOID_TAG
+ // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data
+ 'datalist' => 1,
+ 'dd' => 65, // NORMAL | BLOCK_TAG
+ 'del' => 1,
+ 'details' => 17, // NORMAL | AUTOCLOSE_P,
+ 'dfn' => 1,
+ 'dialog' => 17, // NORMAL | AUTOCLOSE_P,
+ 'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'dt' => 1,
+ 'em' => 1,
+ 'embed' => 9, // NORMAL | VOID_TAG
+ 'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'head' => 1,
+ 'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'hr' => 73, // NORMAL | VOID_TAG
+ 'html' => 1,
+ 'i' => 1,
+ 'iframe' => 3, // NORMAL | TEXT_RAW
+ 'img' => 9, // NORMAL | VOID_TAG
+ 'input' => 9, // NORMAL | VOID_TAG
+ 'kbd' => 1,
+ 'ins' => 1,
+ 'keygen' => 9, // NORMAL | VOID_TAG
+ 'label' => 1,
+ 'legend' => 1,
+ 'li' => 1,
+ 'link' => 9, // NORMAL | VOID_TAG
+ 'map' => 1,
+ 'mark' => 1,
+ 'menu' => 17, // NORMAL | AUTOCLOSE_P,
+ 'meta' => 9, // NORMAL | VOID_TAG
+ 'meter' => 1,
+ 'nav' => 17, // NORMAL | AUTOCLOSE_P,
+ 'noscript' => 65, // NORMAL | BLOCK_TAG
+ 'object' => 1,
+ 'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'optgroup' => 1,
+ 'option' => 1,
+ 'output' => 65, // NORMAL | BLOCK_TAG
+ 'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE
+ 'param' => 9, // NORMAL | VOID_TAG
+ 'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'progress' => 1,
+ 'q' => 1,
+ 'rp' => 1,
+ 'rt' => 1,
+ 'ruby' => 1,
+ 's' => 1,
+ 'samp' => 1,
+ 'script' => 3, // NORMAL | TEXT_RAW
+ 'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'select' => 1,
+ 'small' => 1,
+ 'source' => 9, // NORMAL | VOID_TAG
+ 'span' => 1,
+ 'strong' => 1,
+ 'style' => 3, // NORMAL | TEXT_RAW
+ 'sub' => 1,
+ 'summary' => 17, // NORMAL | AUTOCLOSE_P,
+ 'sup' => 1,
+ 'table' => 65, // NORMAL | BLOCK_TAG
+ 'tbody' => 1,
+ 'td' => 1,
+ 'textarea' => 5, // NORMAL | TEXT_RCDATA
+ 'tfoot' => 65, // NORMAL | BLOCK_TAG
+ 'th' => 1,
+ 'thead' => 1,
+ 'time' => 1,
+ 'title' => 5, // NORMAL | TEXT_RCDATA
+ 'tr' => 1,
+ 'track' => 9, // NORMAL | VOID_TAG
+ 'u' => 1,
+ 'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG
+ 'var' => 1,
+ 'video' => 65, // NORMAL | BLOCK_TAG
+ 'wbr' => 9, // NORMAL | VOID_TAG
+
+ // Legacy?
+ 'basefont' => 8, // VOID_TAG
+ 'bgsound' => 8, // VOID_TAG
+ 'noframes' => 2, // RAW_TEXT
+ 'frame' => 9, // NORMAL | VOID_TAG
+ 'frameset' => 1,
+ 'center' => 16,
+ 'dir' => 16,
+ 'listing' => 16, // AUTOCLOSE_P
+ 'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT
+ 'applet' => 0,
+ 'marquee' => 0,
+ 'isindex' => 8, // VOID_TAG
+ 'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT
+ 'noembed' => 2, // RAW_TEXT
+ );
+
+ /**
+ * The MathML elements.
+ * See http://www.w3.org/wiki/MathML/Elements.
+ *
+ * In our case we are only concerned with presentation MathML and not content
+ * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element.
+ *
+ * @var array
+ */
+ public static $mathml = array(
+ 'maction' => 1,
+ 'maligngroup' => 1,
+ 'malignmark' => 1,
+ 'math' => 1,
+ 'menclose' => 1,
+ 'merror' => 1,
+ 'mfenced' => 1,
+ 'mfrac' => 1,
+ 'mglyph' => 1,
+ 'mi' => 1,
+ 'mlabeledtr' => 1,
+ 'mlongdiv' => 1,
+ 'mmultiscripts' => 1,
+ 'mn' => 1,
+ 'mo' => 1,
+ 'mover' => 1,
+ 'mpadded' => 1,
+ 'mphantom' => 1,
+ 'mroot' => 1,
+ 'mrow' => 1,
+ 'ms' => 1,
+ 'mscarries' => 1,
+ 'mscarry' => 1,
+ 'msgroup' => 1,
+ 'msline' => 1,
+ 'mspace' => 1,
+ 'msqrt' => 1,
+ 'msrow' => 1,
+ 'mstack' => 1,
+ 'mstyle' => 1,
+ 'msub' => 1,
+ 'msup' => 1,
+ 'msubsup' => 1,
+ 'mtable' => 1,
+ 'mtd' => 1,
+ 'mtext' => 1,
+ 'mtr' => 1,
+ 'munder' => 1,
+ 'munderover' => 1,
+ );
+
+ /**
+ * The svg elements.
+ *
+ * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element.
+ * The w3c list appears to be lacking in some areas like filter effect elements.
+ * That list can be found at http://www.w3.org/wiki/SVG/Elements.
+ *
+ * Note, FireFox appears to do a better job rendering filter effects than chrome.
+ * While they are in the spec I'm not sure how widely implemented they are.
+ *
+ * @var array
+ */
+ public static $svg = array(
+ 'a' => 1,
+ 'altGlyph' => 1,
+ 'altGlyphDef' => 1,
+ 'altGlyphItem' => 1,
+ 'animate' => 1,
+ 'animateColor' => 1,
+ 'animateMotion' => 1,
+ 'animateTransform' => 1,
+ 'circle' => 1,
+ 'clipPath' => 1,
+ 'color-profile' => 1,
+ 'cursor' => 1,
+ 'defs' => 1,
+ 'desc' => 1,
+ 'ellipse' => 1,
+ 'feBlend' => 1,
+ 'feColorMatrix' => 1,
+ 'feComponentTransfer' => 1,
+ 'feComposite' => 1,
+ 'feConvolveMatrix' => 1,
+ 'feDiffuseLighting' => 1,
+ 'feDisplacementMap' => 1,
+ 'feDistantLight' => 1,
+ 'feFlood' => 1,
+ 'feFuncA' => 1,
+ 'feFuncB' => 1,
+ 'feFuncG' => 1,
+ 'feFuncR' => 1,
+ 'feGaussianBlur' => 1,
+ 'feImage' => 1,
+ 'feMerge' => 1,
+ 'feMergeNode' => 1,
+ 'feMorphology' => 1,
+ 'feOffset' => 1,
+ 'fePointLight' => 1,
+ 'feSpecularLighting' => 1,
+ 'feSpotLight' => 1,
+ 'feTile' => 1,
+ 'feTurbulence' => 1,
+ 'filter' => 1,
+ 'font' => 1,
+ 'font-face' => 1,
+ 'font-face-format' => 1,
+ 'font-face-name' => 1,
+ 'font-face-src' => 1,
+ 'font-face-uri' => 1,
+ 'foreignObject' => 1,
+ 'g' => 1,
+ 'glyph' => 1,
+ 'glyphRef' => 1,
+ 'hkern' => 1,
+ 'image' => 1,
+ 'line' => 1,
+ 'linearGradient' => 1,
+ 'marker' => 1,
+ 'mask' => 1,
+ 'metadata' => 1,
+ 'missing-glyph' => 1,
+ 'mpath' => 1,
+ 'path' => 1,
+ 'pattern' => 1,
+ 'polygon' => 1,
+ 'polyline' => 1,
+ 'radialGradient' => 1,
+ 'rect' => 1,
+ 'script' => 3, // NORMAL | RAW_TEXT
+ 'set' => 1,
+ 'stop' => 1,
+ 'style' => 3, // NORMAL | RAW_TEXT
+ 'svg' => 1,
+ 'switch' => 1,
+ 'symbol' => 1,
+ 'text' => 1,
+ 'textPath' => 1,
+ 'title' => 1,
+ 'tref' => 1,
+ 'tspan' => 1,
+ 'use' => 1,
+ 'view' => 1,
+ 'vkern' => 1,
+ );
+
+ /**
+ * Some attributes in SVG are case sensitive.
+ *
+ * This map contains key/value pairs with the key as the lowercase attribute
+ * name and the value with the correct casing.
+ */
+ public static $svgCaseSensitiveAttributeMap = array(
+ 'attributename' => 'attributeName',
+ 'attributetype' => 'attributeType',
+ 'basefrequency' => 'baseFrequency',
+ 'baseprofile' => 'baseProfile',
+ 'calcmode' => 'calcMode',
+ 'clippathunits' => 'clipPathUnits',
+ 'contentscripttype' => 'contentScriptType',
+ 'contentstyletype' => 'contentStyleType',
+ 'diffuseconstant' => 'diffuseConstant',
+ 'edgemode' => 'edgeMode',
+ 'externalresourcesrequired' => 'externalResourcesRequired',
+ 'filterres' => 'filterRes',
+ 'filterunits' => 'filterUnits',
+ 'glyphref' => 'glyphRef',
+ 'gradienttransform' => 'gradientTransform',
+ 'gradientunits' => 'gradientUnits',
+ 'kernelmatrix' => 'kernelMatrix',
+ 'kernelunitlength' => 'kernelUnitLength',
+ 'keypoints' => 'keyPoints',
+ 'keysplines' => 'keySplines',
+ 'keytimes' => 'keyTimes',
+ 'lengthadjust' => 'lengthAdjust',
+ 'limitingconeangle' => 'limitingConeAngle',
+ 'markerheight' => 'markerHeight',
+ 'markerunits' => 'markerUnits',
+ 'markerwidth' => 'markerWidth',
+ 'maskcontentunits' => 'maskContentUnits',
+ 'maskunits' => 'maskUnits',
+ 'numoctaves' => 'numOctaves',
+ 'pathlength' => 'pathLength',
+ 'patterncontentunits' => 'patternContentUnits',
+ 'patterntransform' => 'patternTransform',
+ 'patternunits' => 'patternUnits',
+ 'pointsatx' => 'pointsAtX',
+ 'pointsaty' => 'pointsAtY',
+ 'pointsatz' => 'pointsAtZ',
+ 'preservealpha' => 'preserveAlpha',
+ 'preserveaspectratio' => 'preserveAspectRatio',
+ 'primitiveunits' => 'primitiveUnits',
+ 'refx' => 'refX',
+ 'refy' => 'refY',
+ 'repeatcount' => 'repeatCount',
+ 'repeatdur' => 'repeatDur',
+ 'requiredextensions' => 'requiredExtensions',
+ 'requiredfeatures' => 'requiredFeatures',
+ 'specularconstant' => 'specularConstant',
+ 'specularexponent' => 'specularExponent',
+ 'spreadmethod' => 'spreadMethod',
+ 'startoffset' => 'startOffset',
+ 'stddeviation' => 'stdDeviation',
+ 'stitchtiles' => 'stitchTiles',
+ 'surfacescale' => 'surfaceScale',
+ 'systemlanguage' => 'systemLanguage',
+ 'tablevalues' => 'tableValues',
+ 'targetx' => 'targetX',
+ 'targety' => 'targetY',
+ 'textlength' => 'textLength',
+ 'viewbox' => 'viewBox',
+ 'viewtarget' => 'viewTarget',
+ 'xchannelselector' => 'xChannelSelector',
+ 'ychannelselector' => 'yChannelSelector',
+ 'zoomandpan' => 'zoomAndPan',
+ );
+
+ /**
+ * Some SVG elements are case sensitive.
+ * This map contains these.
+ *
+ * The map contains key/value store of the name is lowercase as the keys and
+ * the correct casing as the value.
+ */
+ public static $svgCaseSensitiveElementMap = array(
+ 'altglyph' => 'altGlyph',
+ 'altglyphdef' => 'altGlyphDef',
+ 'altglyphitem' => 'altGlyphItem',
+ 'animatecolor' => 'animateColor',
+ 'animatemotion' => 'animateMotion',
+ 'animatetransform' => 'animateTransform',
+ 'clippath' => 'clipPath',
+ 'feblend' => 'feBlend',
+ 'fecolormatrix' => 'feColorMatrix',
+ 'fecomponenttransfer' => 'feComponentTransfer',
+ 'fecomposite' => 'feComposite',
+ 'feconvolvematrix' => 'feConvolveMatrix',
+ 'fediffuselighting' => 'feDiffuseLighting',
+ 'fedisplacementmap' => 'feDisplacementMap',
+ 'fedistantlight' => 'feDistantLight',
+ 'feflood' => 'feFlood',
+ 'fefunca' => 'feFuncA',
+ 'fefuncb' => 'feFuncB',
+ 'fefuncg' => 'feFuncG',
+ 'fefuncr' => 'feFuncR',
+ 'fegaussianblur' => 'feGaussianBlur',
+ 'feimage' => 'feImage',
+ 'femerge' => 'feMerge',
+ 'femergenode' => 'feMergeNode',
+ 'femorphology' => 'feMorphology',
+ 'feoffset' => 'feOffset',
+ 'fepointlight' => 'fePointLight',
+ 'fespecularlighting' => 'feSpecularLighting',
+ 'fespotlight' => 'feSpotLight',
+ 'fetile' => 'feTile',
+ 'feturbulence' => 'feTurbulence',
+ 'foreignobject' => 'foreignObject',
+ 'glyphref' => 'glyphRef',
+ 'lineargradient' => 'linearGradient',
+ 'radialgradient' => 'radialGradient',
+ 'textpath' => 'textPath',
+ );
+
+ /**
+ * Check whether the given element meets the given criterion.
+ *
+ * Example:
+ *
+ * Elements::isA('script', Elements::TEXT_RAW); // Returns true.
+ *
+ * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false.
+ *
+ * @param string $name The element name.
+ * @param int $mask One of the constants on this class.
+ *
+ * @return bool true if the element matches the mask, false otherwise.
+ */
+ public static function isA($name, $mask)
+ {
+ return (static::element($name) & $mask) === $mask;
+ }
+
+ /**
+ * Test if an element is a valid html5 element.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return bool true if a html5 element and false otherwise.
+ */
+ public static function isHtml5Element($name)
+ {
+ // html5 element names are case insensitive. Forcing lowercase for the check.
+ // Do we need this check or will all data passed here already be lowercase?
+ return isset(static::$html5[strtolower($name)]);
+ }
+
+ /**
+ * Test if an element name is a valid MathML presentation element.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return bool true if a MathML name and false otherwise.
+ */
+ public static function isMathMLElement($name)
+ {
+ // MathML is case-sensitive unlike html5 elements.
+ return isset(static::$mathml[$name]);
+ }
+
+ /**
+ * Test if an element is a valid SVG element.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return bool true if a SVG element and false otherise.
+ */
+ public static function isSvgElement($name)
+ {
+ // SVG is case-sensitive unlike html5 elements.
+ return isset(static::$svg[$name]);
+ }
+
+ /**
+ * Is an element name valid in an html5 document.
+ * This includes html5 elements along with other allowed embedded content
+ * such as svg and mathml.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return bool true if valid and false otherwise.
+ */
+ public static function isElement($name)
+ {
+ return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name);
+ }
+
+ /**
+ * Get the element mask for the given element name.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return int the element mask.
+ */
+ public static function element($name)
+ {
+ if (isset(static::$html5[$name])) {
+ return static::$html5[$name];
+ }
+ if (isset(static::$svg[$name])) {
+ return static::$svg[$name];
+ }
+ if (isset(static::$mathml[$name])) {
+ return static::$mathml[$name];
+ }
+
+ return 0;
+ }
+
+ /**
+ * Normalize a SVG element name to its proper case and form.
+ *
+ * @param string $name The name of the element.
+ *
+ * @return string the normalized form of the element name.
+ */
+ public static function normalizeSvgElement($name)
+ {
+ $name = strtolower($name);
+ if (isset(static::$svgCaseSensitiveElementMap[$name])) {
+ $name = static::$svgCaseSensitiveElementMap[$name];
+ }
+
+ return $name;
+ }
+
+ /**
+ * Normalize a SVG attribute name to its proper case and form.
+ *
+ * @param string $name The name of the attribute.
+ *
+ * @return string The normalized form of the attribute name.
+ */
+ public static function normalizeSvgAttribute($name)
+ {
+ $name = strtolower($name);
+ if (isset(static::$svgCaseSensitiveAttributeMap[$name])) {
+ $name = static::$svgCaseSensitiveAttributeMap[$name];
+ }
+
+ return $name;
+ }
+
+ /**
+ * Normalize a MathML attribute name to its proper case and form.
+ * Note, all MathML element names are lowercase.
+ *
+ * @param string $name The name of the attribute.
+ *
+ * @return string The normalized form of the attribute name.
+ */
+ public static function normalizeMathMlAttribute($name)
+ {
+ $name = strtolower($name);
+
+ // Only one attribute has a mixed case form for MathML.
+ if ('definitionurl' === $name) {
+ $name = 'definitionURL';
+ }
+
+ return $name;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php
new file mode 100644
index 000000000..0e7227dc1
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Entities.php
@@ -0,0 +1,2236 @@
+<?php
+
+namespace Masterminds\HTML5;
+
+/**
+ * Entity lookup tables.
+ * This class is automatically generated.
+ */
+class Entities
+{
+ public static $byName = array(
+ 'Aacute' => 'Á',
+ 'Aacut' => 'Á',
+ 'aacute' => 'á',
+ 'aacut' => 'á',
+ 'Abreve' => 'Ă',
+ 'abreve' => 'ă',
+ 'ac' => '∾',
+ 'acd' => '∿',
+ 'acE' => '∾̳',
+ 'Acirc' => 'Â',
+ 'Acir' => 'Â',
+ 'acirc' => 'â',
+ 'acir' => 'â',
+ 'acute' => '´',
+ 'acut' => '´',
+ 'Acy' => 'А',
+ 'acy' => 'а',
+ 'AElig' => 'Æ',
+ 'AEli' => 'Æ',
+ 'aelig' => 'æ',
+ 'aeli' => 'æ',
+ 'af' => '⁡',
+ 'Afr' => '𝔄',
+ 'afr' => '𝔞',
+ 'Agrave' => 'À',
+ 'Agrav' => 'À',
+ 'agrave' => 'à',
+ 'agrav' => 'à',
+ 'alefsym' => 'ℵ',
+ 'aleph' => 'ℵ',
+ 'Alpha' => 'Α',
+ 'alpha' => 'α',
+ 'Amacr' => 'Ā',
+ 'amacr' => 'ā',
+ 'amalg' => '⨿',
+ 'AMP' => '&',
+ 'AM' => '&',
+ 'amp' => '&',
+ 'am' => '&',
+ 'And' => '⩓',
+ 'and' => '∧',
+ 'andand' => '⩕',
+ 'andd' => '⩜',
+ 'andslope' => '⩘',
+ 'andv' => '⩚',
+ 'ang' => '∠',
+ 'ange' => '⦤',
+ 'angle' => '∠',
+ 'angmsd' => '∡',
+ 'angmsdaa' => '⦨',
+ 'angmsdab' => '⦩',
+ 'angmsdac' => '⦪',
+ 'angmsdad' => '⦫',
+ 'angmsdae' => '⦬',
+ 'angmsdaf' => '⦭',
+ 'angmsdag' => '⦮',
+ 'angmsdah' => '⦯',
+ 'angrt' => '∟',
+ 'angrtvb' => '⊾',
+ 'angrtvbd' => '⦝',
+ 'angsph' => '∢',
+ 'angst' => 'Å',
+ 'angzarr' => '⍼',
+ 'Aogon' => 'Ą',
+ 'aogon' => 'ą',
+ 'Aopf' => '𝔸',
+ 'aopf' => '𝕒',
+ 'ap' => '≈',
+ 'apacir' => '⩯',
+ 'apE' => '⩰',
+ 'ape' => '≊',
+ 'apid' => '≋',
+ 'apos' => '\'',
+ 'ApplyFunction' => '⁡',
+ 'approx' => '≈',
+ 'approxeq' => '≊',
+ 'Aring' => 'Å',
+ 'Arin' => 'Å',
+ 'aring' => 'å',
+ 'arin' => 'å',
+ 'Ascr' => '𝒜',
+ 'ascr' => '𝒶',
+ 'Assign' => '≔',
+ 'ast' => '*',
+ 'asymp' => '≈',
+ 'asympeq' => '≍',
+ 'Atilde' => 'Ã',
+ 'Atild' => 'Ã',
+ 'atilde' => 'ã',
+ 'atild' => 'ã',
+ 'Auml' => 'Ä',
+ 'Aum' => 'Ä',
+ 'auml' => 'ä',
+ 'aum' => 'ä',
+ 'awconint' => '∳',
+ 'awint' => '⨑',
+ 'backcong' => '≌',
+ 'backepsilon' => '϶',
+ 'backprime' => '‵',
+ 'backsim' => '∽',
+ 'backsimeq' => '⋍',
+ 'Backslash' => '∖',
+ 'Barv' => '⫧',
+ 'barvee' => '⊽',
+ 'Barwed' => '⌆',
+ 'barwed' => '⌅',
+ 'barwedge' => '⌅',
+ 'bbrk' => '⎵',
+ 'bbrktbrk' => '⎶',
+ 'bcong' => '≌',
+ 'Bcy' => 'Б',
+ 'bcy' => 'б',
+ 'bdquo' => '„',
+ 'becaus' => '∵',
+ 'Because' => '∵',
+ 'because' => '∵',
+ 'bemptyv' => '⦰',
+ 'bepsi' => '϶',
+ 'bernou' => 'ℬ',
+ 'Bernoullis' => 'ℬ',
+ 'Beta' => 'Β',
+ 'beta' => 'β',
+ 'beth' => 'ℶ',
+ 'between' => '≬',
+ 'Bfr' => '𝔅',
+ 'bfr' => '𝔟',
+ 'bigcap' => '⋂',
+ 'bigcirc' => '◯',
+ 'bigcup' => '⋃',
+ 'bigodot' => '⨀',
+ 'bigoplus' => '⨁',
+ 'bigotimes' => '⨂',
+ 'bigsqcup' => '⨆',
+ 'bigstar' => '★',
+ 'bigtriangledown' => '▽',
+ 'bigtriangleup' => '△',
+ 'biguplus' => '⨄',
+ 'bigvee' => '⋁',
+ 'bigwedge' => '⋀',
+ 'bkarow' => '⤍',
+ 'blacklozenge' => '⧫',
+ 'blacksquare' => '▪',
+ 'blacktriangle' => '▴',
+ 'blacktriangledown' => '▾',
+ 'blacktriangleleft' => '◂',
+ 'blacktriangleright' => '▸',
+ 'blank' => '␣',
+ 'blk12' => '▒',
+ 'blk14' => '░',
+ 'blk34' => '▓',
+ 'block' => '█',
+ 'bne' => '=⃥',
+ 'bnequiv' => '≡⃥',
+ 'bNot' => '⫭',
+ 'bnot' => '⌐',
+ 'Bopf' => '𝔹',
+ 'bopf' => '𝕓',
+ 'bot' => '⊥',
+ 'bottom' => '⊥',
+ 'bowtie' => '⋈',
+ 'boxbox' => '⧉',
+ 'boxDL' => '╗',
+ 'boxDl' => '╖',
+ 'boxdL' => '╕',
+ 'boxdl' => '┐',
+ 'boxDR' => '╔',
+ 'boxDr' => '╓',
+ 'boxdR' => '╒',
+ 'boxdr' => '┌',
+ 'boxH' => '═',
+ 'boxh' => '─',
+ 'boxHD' => '╦',
+ 'boxHd' => '╤',
+ 'boxhD' => '╥',
+ 'boxhd' => '┬',
+ 'boxHU' => '╩',
+ 'boxHu' => '╧',
+ 'boxhU' => '╨',
+ 'boxhu' => '┴',
+ 'boxminus' => '⊟',
+ 'boxplus' => '⊞',
+ 'boxtimes' => '⊠',
+ 'boxUL' => '╝',
+ 'boxUl' => '╜',
+ 'boxuL' => '╛',
+ 'boxul' => '┘',
+ 'boxUR' => '╚',
+ 'boxUr' => '╙',
+ 'boxuR' => '╘',
+ 'boxur' => '└',
+ 'boxV' => '║',
+ 'boxv' => '│',
+ 'boxVH' => '╬',
+ 'boxVh' => '╫',
+ 'boxvH' => '╪',
+ 'boxvh' => '┼',
+ 'boxVL' => '╣',
+ 'boxVl' => '╢',
+ 'boxvL' => '╡',
+ 'boxvl' => '┤',
+ 'boxVR' => '╠',
+ 'boxVr' => '╟',
+ 'boxvR' => '╞',
+ 'boxvr' => '├',
+ 'bprime' => '‵',
+ 'Breve' => '˘',
+ 'breve' => '˘',
+ 'brvbar' => '¦',
+ 'brvba' => '¦',
+ 'Bscr' => 'ℬ',
+ 'bscr' => '𝒷',
+ 'bsemi' => '⁏',
+ 'bsim' => '∽',
+ 'bsime' => '⋍',
+ 'bsol' => '\\',
+ 'bsolb' => '⧅',
+ 'bsolhsub' => '⟈',
+ 'bull' => '•',
+ 'bullet' => '•',
+ 'bump' => '≎',
+ 'bumpE' => '⪮',
+ 'bumpe' => '≏',
+ 'Bumpeq' => '≎',
+ 'bumpeq' => '≏',
+ 'Cacute' => 'Ć',
+ 'cacute' => 'ć',
+ 'Cap' => '⋒',
+ 'cap' => '∩',
+ 'capand' => '⩄',
+ 'capbrcup' => '⩉',
+ 'capcap' => '⩋',
+ 'capcup' => '⩇',
+ 'capdot' => '⩀',
+ 'CapitalDifferentialD' => 'ⅅ',
+ 'caps' => '∩︀',
+ 'caret' => '⁁',
+ 'caron' => 'ˇ',
+ 'Cayleys' => 'ℭ',
+ 'ccaps' => '⩍',
+ 'Ccaron' => 'Č',
+ 'ccaron' => 'č',
+ 'Ccedil' => 'Ç',
+ 'Ccedi' => 'Ç',
+ 'ccedil' => 'ç',
+ 'ccedi' => 'ç',
+ 'Ccirc' => 'Ĉ',
+ 'ccirc' => 'ĉ',
+ 'Cconint' => '∰',
+ 'ccups' => '⩌',
+ 'ccupssm' => '⩐',
+ 'Cdot' => 'Ċ',
+ 'cdot' => 'ċ',
+ 'cedil' => '¸',
+ 'cedi' => '¸',
+ 'Cedilla' => '¸',
+ 'cemptyv' => '⦲',
+ 'cent' => '¢',
+ 'cen' => '¢',
+ 'CenterDot' => '·',
+ 'centerdot' => '·',
+ 'Cfr' => 'ℭ',
+ 'cfr' => '𝔠',
+ 'CHcy' => 'Ч',
+ 'chcy' => 'ч',
+ 'check' => '✓',
+ 'checkmark' => '✓',
+ 'Chi' => 'Χ',
+ 'chi' => 'χ',
+ 'cir' => '○',
+ 'circ' => 'ˆ',
+ 'circeq' => '≗',
+ 'circlearrowleft' => '↺',
+ 'circlearrowright' => '↻',
+ 'circledast' => '⊛',
+ 'circledcirc' => '⊚',
+ 'circleddash' => '⊝',
+ 'CircleDot' => '⊙',
+ 'circledR' => '®',
+ 'circledS' => 'Ⓢ',
+ 'CircleMinus' => '⊖',
+ 'CirclePlus' => '⊕',
+ 'CircleTimes' => '⊗',
+ 'cirE' => '⧃',
+ 'cire' => '≗',
+ 'cirfnint' => '⨐',
+ 'cirmid' => '⫯',
+ 'cirscir' => '⧂',
+ 'ClockwiseContourIntegral' => '∲',
+ 'CloseCurlyDoubleQuote' => '”',
+ 'CloseCurlyQuote' => '’',
+ 'clubs' => '♣',
+ 'clubsuit' => '♣',
+ 'Colon' => '∷',
+ 'colon' => ':',
+ 'Colone' => '⩴',
+ 'colone' => '≔',
+ 'coloneq' => '≔',
+ 'comma' => ',',
+ 'commat' => '@',
+ 'comp' => '∁',
+ 'compfn' => '∘',
+ 'complement' => '∁',
+ 'complexes' => 'ℂ',
+ 'cong' => '≅',
+ 'congdot' => '⩭',
+ 'Congruent' => '≡',
+ 'Conint' => '∯',
+ 'conint' => '∮',
+ 'ContourIntegral' => '∮',
+ 'Copf' => 'ℂ',
+ 'copf' => '𝕔',
+ 'coprod' => '∐',
+ 'Coproduct' => '∐',
+ 'COPY' => '©',
+ 'COP' => '©',
+ 'copy' => '©',
+ 'cop' => '©',
+ 'copysr' => '℗',
+ 'CounterClockwiseContourIntegral' => '∳',
+ 'crarr' => '↵',
+ 'Cross' => '⨯',
+ 'cross' => '✗',
+ 'Cscr' => '𝒞',
+ 'cscr' => '𝒸',
+ 'csub' => '⫏',
+ 'csube' => '⫑',
+ 'csup' => '⫐',
+ 'csupe' => '⫒',
+ 'ctdot' => '⋯',
+ 'cudarrl' => '⤸',
+ 'cudarrr' => '⤵',
+ 'cuepr' => '⋞',
+ 'cuesc' => '⋟',
+ 'cularr' => '↶',
+ 'cularrp' => '⤽',
+ 'Cup' => '⋓',
+ 'cup' => '∪',
+ 'cupbrcap' => '⩈',
+ 'CupCap' => '≍',
+ 'cupcap' => '⩆',
+ 'cupcup' => '⩊',
+ 'cupdot' => '⊍',
+ 'cupor' => '⩅',
+ 'cups' => '∪︀',
+ 'curarr' => '↷',
+ 'curarrm' => '⤼',
+ 'curlyeqprec' => '⋞',
+ 'curlyeqsucc' => '⋟',
+ 'curlyvee' => '⋎',
+ 'curlywedge' => '⋏',
+ 'curren' => '¤',
+ 'curre' => '¤',
+ 'curvearrowleft' => '↶',
+ 'curvearrowright' => '↷',
+ 'cuvee' => '⋎',
+ 'cuwed' => '⋏',
+ 'cwconint' => '∲',
+ 'cwint' => '∱',
+ 'cylcty' => '⌭',
+ 'Dagger' => '‡',
+ 'dagger' => '†',
+ 'daleth' => 'ℸ',
+ 'Darr' => '↡',
+ 'dArr' => '⇓',
+ 'darr' => '↓',
+ 'dash' => '‐',
+ 'Dashv' => '⫤',
+ 'dashv' => '⊣',
+ 'dbkarow' => '⤏',
+ 'dblac' => '˝',
+ 'Dcaron' => 'Ď',
+ 'dcaron' => 'ď',
+ 'Dcy' => 'Д',
+ 'dcy' => 'д',
+ 'DD' => 'ⅅ',
+ 'dd' => 'ⅆ',
+ 'ddagger' => '‡',
+ 'ddarr' => '⇊',
+ 'DDotrahd' => '⤑',
+ 'ddotseq' => '⩷',
+ 'deg' => '°',
+ 'de' => '°',
+ 'Del' => '∇',
+ 'Delta' => 'Δ',
+ 'delta' => 'δ',
+ 'demptyv' => '⦱',
+ 'dfisht' => '⥿',
+ 'Dfr' => '𝔇',
+ 'dfr' => '𝔡',
+ 'dHar' => '⥥',
+ 'dharl' => '⇃',
+ 'dharr' => '⇂',
+ 'DiacriticalAcute' => '´',
+ 'DiacriticalDot' => '˙',
+ 'DiacriticalDoubleAcute' => '˝',
+ 'DiacriticalGrave' => '`',
+ 'DiacriticalTilde' => '˜',
+ 'diam' => '⋄',
+ 'Diamond' => '⋄',
+ 'diamond' => '⋄',
+ 'diamondsuit' => '♦',
+ 'diams' => '♦',
+ 'die' => '¨',
+ 'DifferentialD' => 'ⅆ',
+ 'digamma' => 'ϝ',
+ 'disin' => '⋲',
+ 'div' => '÷',
+ 'divide' => '÷',
+ 'divid' => '÷',
+ 'divideontimes' => '⋇',
+ 'divonx' => '⋇',
+ 'DJcy' => 'Ђ',
+ 'djcy' => 'ђ',
+ 'dlcorn' => '⌞',
+ 'dlcrop' => '⌍',
+ 'dollar' => '$',
+ 'Dopf' => '𝔻',
+ 'dopf' => '𝕕',
+ 'Dot' => '¨',
+ 'dot' => '˙',
+ 'DotDot' => '⃜',
+ 'doteq' => '≐',
+ 'doteqdot' => '≑',
+ 'DotEqual' => '≐',
+ 'dotminus' => '∸',
+ 'dotplus' => '∔',
+ 'dotsquare' => '⊡',
+ 'doublebarwedge' => '⌆',
+ 'DoubleContourIntegral' => '∯',
+ 'DoubleDot' => '¨',
+ 'DoubleDownArrow' => '⇓',
+ 'DoubleLeftArrow' => '⇐',
+ 'DoubleLeftRightArrow' => '⇔',
+ 'DoubleLeftTee' => '⫤',
+ 'DoubleLongLeftArrow' => '⟸',
+ 'DoubleLongLeftRightArrow' => '⟺',
+ 'DoubleLongRightArrow' => '⟹',
+ 'DoubleRightArrow' => '⇒',
+ 'DoubleRightTee' => '⊨',
+ 'DoubleUpArrow' => '⇑',
+ 'DoubleUpDownArrow' => '⇕',
+ 'DoubleVerticalBar' => '∥',
+ 'DownArrow' => '↓',
+ 'Downarrow' => '⇓',
+ 'downarrow' => '↓',
+ 'DownArrowBar' => '⤓',
+ 'DownArrowUpArrow' => '⇵',
+ 'DownBreve' => '̑',
+ 'downdownarrows' => '⇊',
+ 'downharpoonleft' => '⇃',
+ 'downharpoonright' => '⇂',
+ 'DownLeftRightVector' => '⥐',
+ 'DownLeftTeeVector' => '⥞',
+ 'DownLeftVector' => '↽',
+ 'DownLeftVectorBar' => '⥖',
+ 'DownRightTeeVector' => '⥟',
+ 'DownRightVector' => '⇁',
+ 'DownRightVectorBar' => '⥗',
+ 'DownTee' => '⊤',
+ 'DownTeeArrow' => '↧',
+ 'drbkarow' => '⤐',
+ 'drcorn' => '⌟',
+ 'drcrop' => '⌌',
+ 'Dscr' => '𝒟',
+ 'dscr' => '𝒹',
+ 'DScy' => 'Ѕ',
+ 'dscy' => 'ѕ',
+ 'dsol' => '⧶',
+ 'Dstrok' => 'Đ',
+ 'dstrok' => 'đ',
+ 'dtdot' => '⋱',
+ 'dtri' => '▿',
+ 'dtrif' => '▾',
+ 'duarr' => '⇵',
+ 'duhar' => '⥯',
+ 'dwangle' => '⦦',
+ 'DZcy' => 'Џ',
+ 'dzcy' => 'џ',
+ 'dzigrarr' => '⟿',
+ 'Eacute' => 'É',
+ 'Eacut' => 'É',
+ 'eacute' => 'é',
+ 'eacut' => 'é',
+ 'easter' => '⩮',
+ 'Ecaron' => 'Ě',
+ 'ecaron' => 'ě',
+ 'ecir' => 'ê',
+ 'Ecirc' => 'Ê',
+ 'Ecir' => 'Ê',
+ 'ecirc' => 'ê',
+ 'ecolon' => '≕',
+ 'Ecy' => 'Э',
+ 'ecy' => 'э',
+ 'eDDot' => '⩷',
+ 'Edot' => 'Ė',
+ 'eDot' => '≑',
+ 'edot' => 'ė',
+ 'ee' => 'ⅇ',
+ 'efDot' => '≒',
+ 'Efr' => '𝔈',
+ 'efr' => '𝔢',
+ 'eg' => '⪚',
+ 'Egrave' => 'È',
+ 'Egrav' => 'È',
+ 'egrave' => 'è',
+ 'egrav' => 'è',
+ 'egs' => '⪖',
+ 'egsdot' => '⪘',
+ 'el' => '⪙',
+ 'Element' => '∈',
+ 'elinters' => '⏧',
+ 'ell' => 'ℓ',
+ 'els' => '⪕',
+ 'elsdot' => '⪗',
+ 'Emacr' => 'Ē',
+ 'emacr' => 'ē',
+ 'empty' => '∅',
+ 'emptyset' => '∅',
+ 'EmptySmallSquare' => '◻',
+ 'emptyv' => '∅',
+ 'EmptyVerySmallSquare' => '▫',
+ 'emsp' => ' ',
+ 'emsp13' => ' ',
+ 'emsp14' => ' ',
+ 'ENG' => 'Ŋ',
+ 'eng' => 'ŋ',
+ 'ensp' => ' ',
+ 'Eogon' => 'Ę',
+ 'eogon' => 'ę',
+ 'Eopf' => '𝔼',
+ 'eopf' => '𝕖',
+ 'epar' => '⋕',
+ 'eparsl' => '⧣',
+ 'eplus' => '⩱',
+ 'epsi' => 'ε',
+ 'Epsilon' => 'Ε',
+ 'epsilon' => 'ε',
+ 'epsiv' => 'ϵ',
+ 'eqcirc' => '≖',
+ 'eqcolon' => '≕',
+ 'eqsim' => '≂',
+ 'eqslantgtr' => '⪖',
+ 'eqslantless' => '⪕',
+ 'Equal' => '⩵',
+ 'equals' => '=',
+ 'EqualTilde' => '≂',
+ 'equest' => '≟',
+ 'Equilibrium' => '⇌',
+ 'equiv' => '≡',
+ 'equivDD' => '⩸',
+ 'eqvparsl' => '⧥',
+ 'erarr' => '⥱',
+ 'erDot' => '≓',
+ 'Escr' => 'ℰ',
+ 'escr' => 'ℯ',
+ 'esdot' => '≐',
+ 'Esim' => '⩳',
+ 'esim' => '≂',
+ 'Eta' => 'Η',
+ 'eta' => 'η',
+ 'ETH' => 'Ð',
+ 'ET' => 'Ð',
+ 'eth' => 'ð',
+ 'et' => 'ð',
+ 'Euml' => 'Ë',
+ 'Eum' => 'Ë',
+ 'euml' => 'ë',
+ 'eum' => 'ë',
+ 'euro' => '€',
+ 'excl' => '!',
+ 'exist' => '∃',
+ 'Exists' => '∃',
+ 'expectation' => 'ℰ',
+ 'ExponentialE' => 'ⅇ',
+ 'exponentiale' => 'ⅇ',
+ 'fallingdotseq' => '≒',
+ 'Fcy' => 'Ф',
+ 'fcy' => 'ф',
+ 'female' => '♀',
+ 'ffilig' => 'ffi',
+ 'fflig' => 'ff',
+ 'ffllig' => 'ffl',
+ 'Ffr' => '𝔉',
+ 'ffr' => '𝔣',
+ 'filig' => 'fi',
+ 'FilledSmallSquare' => '◼',
+ 'FilledVerySmallSquare' => '▪',
+ 'fjlig' => 'fj',
+ 'flat' => '♭',
+ 'fllig' => 'fl',
+ 'fltns' => '▱',
+ 'fnof' => 'ƒ',
+ 'Fopf' => '𝔽',
+ 'fopf' => '𝕗',
+ 'ForAll' => '∀',
+ 'forall' => '∀',
+ 'fork' => '⋔',
+ 'forkv' => '⫙',
+ 'Fouriertrf' => 'ℱ',
+ 'fpartint' => '⨍',
+ 'frac12' => '½',
+ 'frac1' => '¼',
+ 'frac13' => '⅓',
+ 'frac14' => '¼',
+ 'frac15' => '⅕',
+ 'frac16' => '⅙',
+ 'frac18' => '⅛',
+ 'frac23' => '⅔',
+ 'frac25' => '⅖',
+ 'frac34' => '¾',
+ 'frac3' => '¾',
+ 'frac35' => '⅗',
+ 'frac38' => '⅜',
+ 'frac45' => '⅘',
+ 'frac56' => '⅚',
+ 'frac58' => '⅝',
+ 'frac78' => '⅞',
+ 'frasl' => '⁄',
+ 'frown' => '⌢',
+ 'Fscr' => 'ℱ',
+ 'fscr' => '𝒻',
+ 'gacute' => 'ǵ',
+ 'Gamma' => 'Γ',
+ 'gamma' => 'γ',
+ 'Gammad' => 'Ϝ',
+ 'gammad' => 'ϝ',
+ 'gap' => '⪆',
+ 'Gbreve' => 'Ğ',
+ 'gbreve' => 'ğ',
+ 'Gcedil' => 'Ģ',
+ 'Gcirc' => 'Ĝ',
+ 'gcirc' => 'ĝ',
+ 'Gcy' => 'Г',
+ 'gcy' => 'г',
+ 'Gdot' => 'Ġ',
+ 'gdot' => 'ġ',
+ 'gE' => '≧',
+ 'ge' => '≥',
+ 'gEl' => '⪌',
+ 'gel' => '⋛',
+ 'geq' => '≥',
+ 'geqq' => '≧',
+ 'geqslant' => '⩾',
+ 'ges' => '⩾',
+ 'gescc' => '⪩',
+ 'gesdot' => '⪀',
+ 'gesdoto' => '⪂',
+ 'gesdotol' => '⪄',
+ 'gesl' => '⋛︀',
+ 'gesles' => '⪔',
+ 'Gfr' => '𝔊',
+ 'gfr' => '𝔤',
+ 'Gg' => '⋙',
+ 'gg' => '≫',
+ 'ggg' => '⋙',
+ 'gimel' => 'ℷ',
+ 'GJcy' => 'Ѓ',
+ 'gjcy' => 'ѓ',
+ 'gl' => '≷',
+ 'gla' => '⪥',
+ 'glE' => '⪒',
+ 'glj' => '⪤',
+ 'gnap' => '⪊',
+ 'gnapprox' => '⪊',
+ 'gnE' => '≩',
+ 'gne' => '⪈',
+ 'gneq' => '⪈',
+ 'gneqq' => '≩',
+ 'gnsim' => '⋧',
+ 'Gopf' => '𝔾',
+ 'gopf' => '𝕘',
+ 'grave' => '`',
+ 'GreaterEqual' => '≥',
+ 'GreaterEqualLess' => '⋛',
+ 'GreaterFullEqual' => '≧',
+ 'GreaterGreater' => '⪢',
+ 'GreaterLess' => '≷',
+ 'GreaterSlantEqual' => '⩾',
+ 'GreaterTilde' => '≳',
+ 'Gscr' => '𝒢',
+ 'gscr' => 'ℊ',
+ 'gsim' => '≳',
+ 'gsime' => '⪎',
+ 'gsiml' => '⪐',
+ 'GT' => '>',
+ 'G' => '>',
+ 'Gt' => '≫',
+ 'gt' => '>',
+ 'g' => '>',
+ 'gtcc' => '⪧',
+ 'gtcir' => '⩺',
+ 'gtdot' => '⋗',
+ 'gtlPar' => '⦕',
+ 'gtquest' => '⩼',
+ 'gtrapprox' => '⪆',
+ 'gtrarr' => '⥸',
+ 'gtrdot' => '⋗',
+ 'gtreqless' => '⋛',
+ 'gtreqqless' => '⪌',
+ 'gtrless' => '≷',
+ 'gtrsim' => '≳',
+ 'gvertneqq' => '≩︀',
+ 'gvnE' => '≩︀',
+ 'Hacek' => 'ˇ',
+ 'hairsp' => ' ',
+ 'half' => '½',
+ 'hamilt' => 'ℋ',
+ 'HARDcy' => 'Ъ',
+ 'hardcy' => 'ъ',
+ 'hArr' => '⇔',
+ 'harr' => '↔',
+ 'harrcir' => '⥈',
+ 'harrw' => '↭',
+ 'Hat' => '^',
+ 'hbar' => 'ℏ',
+ 'Hcirc' => 'Ĥ',
+ 'hcirc' => 'ĥ',
+ 'hearts' => '♥',
+ 'heartsuit' => '♥',
+ 'hellip' => '…',
+ 'hercon' => '⊹',
+ 'Hfr' => 'ℌ',
+ 'hfr' => '𝔥',
+ 'HilbertSpace' => 'ℋ',
+ 'hksearow' => '⤥',
+ 'hkswarow' => '⤦',
+ 'hoarr' => '⇿',
+ 'homtht' => '∻',
+ 'hookleftarrow' => '↩',
+ 'hookrightarrow' => '↪',
+ 'Hopf' => 'ℍ',
+ 'hopf' => '𝕙',
+ 'horbar' => '―',
+ 'HorizontalLine' => '─',
+ 'Hscr' => 'ℋ',
+ 'hscr' => '𝒽',
+ 'hslash' => 'ℏ',
+ 'Hstrok' => 'Ħ',
+ 'hstrok' => 'ħ',
+ 'HumpDownHump' => '≎',
+ 'HumpEqual' => '≏',
+ 'hybull' => '⁃',
+ 'hyphen' => '‐',
+ 'Iacute' => 'Í',
+ 'Iacut' => 'Í',
+ 'iacute' => 'í',
+ 'iacut' => 'í',
+ 'ic' => '⁣',
+ 'Icirc' => 'Î',
+ 'Icir' => 'Î',
+ 'icirc' => 'î',
+ 'icir' => 'î',
+ 'Icy' => 'И',
+ 'icy' => 'и',
+ 'Idot' => 'İ',
+ 'IEcy' => 'Е',
+ 'iecy' => 'е',
+ 'iexcl' => '¡',
+ 'iexc' => '¡',
+ 'iff' => '⇔',
+ 'Ifr' => 'ℑ',
+ 'ifr' => '𝔦',
+ 'Igrave' => 'Ì',
+ 'Igrav' => 'Ì',
+ 'igrave' => 'ì',
+ 'igrav' => 'ì',
+ 'ii' => 'ⅈ',
+ 'iiiint' => '⨌',
+ 'iiint' => '∭',
+ 'iinfin' => '⧜',
+ 'iiota' => '℩',
+ 'IJlig' => 'IJ',
+ 'ijlig' => 'ij',
+ 'Im' => 'ℑ',
+ 'Imacr' => 'Ī',
+ 'imacr' => 'ī',
+ 'image' => 'ℑ',
+ 'ImaginaryI' => 'ⅈ',
+ 'imagline' => 'ℐ',
+ 'imagpart' => 'ℑ',
+ 'imath' => 'ı',
+ 'imof' => '⊷',
+ 'imped' => 'Ƶ',
+ 'Implies' => '⇒',
+ 'in' => '∈',
+ 'incare' => '℅',
+ 'infin' => '∞',
+ 'infintie' => '⧝',
+ 'inodot' => 'ı',
+ 'Int' => '∬',
+ 'int' => '∫',
+ 'intcal' => '⊺',
+ 'integers' => 'ℤ',
+ 'Integral' => '∫',
+ 'intercal' => '⊺',
+ 'Intersection' => '⋂',
+ 'intlarhk' => '⨗',
+ 'intprod' => '⨼',
+ 'InvisibleComma' => '⁣',
+ 'InvisibleTimes' => '⁢',
+ 'IOcy' => 'Ё',
+ 'iocy' => 'ё',
+ 'Iogon' => 'Į',
+ 'iogon' => 'į',
+ 'Iopf' => '𝕀',
+ 'iopf' => '𝕚',
+ 'Iota' => 'Ι',
+ 'iota' => 'ι',
+ 'iprod' => '⨼',
+ 'iquest' => '¿',
+ 'iques' => '¿',
+ 'Iscr' => 'ℐ',
+ 'iscr' => '𝒾',
+ 'isin' => '∈',
+ 'isindot' => '⋵',
+ 'isinE' => '⋹',
+ 'isins' => '⋴',
+ 'isinsv' => '⋳',
+ 'isinv' => '∈',
+ 'it' => '⁢',
+ 'Itilde' => 'Ĩ',
+ 'itilde' => 'ĩ',
+ 'Iukcy' => 'І',
+ 'iukcy' => 'і',
+ 'Iuml' => 'Ï',
+ 'Ium' => 'Ï',
+ 'iuml' => 'ï',
+ 'ium' => 'ï',
+ 'Jcirc' => 'Ĵ',
+ 'jcirc' => 'ĵ',
+ 'Jcy' => 'Й',
+ 'jcy' => 'й',
+ 'Jfr' => '𝔍',
+ 'jfr' => '𝔧',
+ 'jmath' => 'ȷ',
+ 'Jopf' => '𝕁',
+ 'jopf' => '𝕛',
+ 'Jscr' => '𝒥',
+ 'jscr' => '𝒿',
+ 'Jsercy' => 'Ј',
+ 'jsercy' => 'ј',
+ 'Jukcy' => 'Є',
+ 'jukcy' => 'є',
+ 'Kappa' => 'Κ',
+ 'kappa' => 'κ',
+ 'kappav' => 'ϰ',
+ 'Kcedil' => 'Ķ',
+ 'kcedil' => 'ķ',
+ 'Kcy' => 'К',
+ 'kcy' => 'к',
+ 'Kfr' => '𝔎',
+ 'kfr' => '𝔨',
+ 'kgreen' => 'ĸ',
+ 'KHcy' => 'Х',
+ 'khcy' => 'х',
+ 'KJcy' => 'Ќ',
+ 'kjcy' => 'ќ',
+ 'Kopf' => '𝕂',
+ 'kopf' => '𝕜',
+ 'Kscr' => '𝒦',
+ 'kscr' => '𝓀',
+ 'lAarr' => '⇚',
+ 'Lacute' => 'Ĺ',
+ 'lacute' => 'ĺ',
+ 'laemptyv' => '⦴',
+ 'lagran' => 'ℒ',
+ 'Lambda' => 'Λ',
+ 'lambda' => 'λ',
+ 'Lang' => '⟪',
+ 'lang' => '⟨',
+ 'langd' => '⦑',
+ 'langle' => '⟨',
+ 'lap' => '⪅',
+ 'Laplacetrf' => 'ℒ',
+ 'laquo' => '«',
+ 'laqu' => '«',
+ 'Larr' => '↞',
+ 'lArr' => '⇐',
+ 'larr' => '←',
+ 'larrb' => '⇤',
+ 'larrbfs' => '⤟',
+ 'larrfs' => '⤝',
+ 'larrhk' => '↩',
+ 'larrlp' => '↫',
+ 'larrpl' => '⤹',
+ 'larrsim' => '⥳',
+ 'larrtl' => '↢',
+ 'lat' => '⪫',
+ 'lAtail' => '⤛',
+ 'latail' => '⤙',
+ 'late' => '⪭',
+ 'lates' => '⪭︀',
+ 'lBarr' => '⤎',
+ 'lbarr' => '⤌',
+ 'lbbrk' => '❲',
+ 'lbrace' => '{',
+ 'lbrack' => '[',
+ 'lbrke' => '⦋',
+ 'lbrksld' => '⦏',
+ 'lbrkslu' => '⦍',
+ 'Lcaron' => 'Ľ',
+ 'lcaron' => 'ľ',
+ 'Lcedil' => 'Ļ',
+ 'lcedil' => 'ļ',
+ 'lceil' => '⌈',
+ 'lcub' => '{',
+ 'Lcy' => 'Л',
+ 'lcy' => 'л',
+ 'ldca' => '⤶',
+ 'ldquo' => '“',
+ 'ldquor' => '„',
+ 'ldrdhar' => '⥧',
+ 'ldrushar' => '⥋',
+ 'ldsh' => '↲',
+ 'lE' => '≦',
+ 'le' => '≤',
+ 'LeftAngleBracket' => '⟨',
+ 'LeftArrow' => '←',
+ 'Leftarrow' => '⇐',
+ 'leftarrow' => '←',
+ 'LeftArrowBar' => '⇤',
+ 'LeftArrowRightArrow' => '⇆',
+ 'leftarrowtail' => '↢',
+ 'LeftCeiling' => '⌈',
+ 'LeftDoubleBracket' => '⟦',
+ 'LeftDownTeeVector' => '⥡',
+ 'LeftDownVector' => '⇃',
+ 'LeftDownVectorBar' => '⥙',
+ 'LeftFloor' => '⌊',
+ 'leftharpoondown' => '↽',
+ 'leftharpoonup' => '↼',
+ 'leftleftarrows' => '⇇',
+ 'LeftRightArrow' => '↔',
+ 'Leftrightarrow' => '⇔',
+ 'leftrightarrow' => '↔',
+ 'leftrightarrows' => '⇆',
+ 'leftrightharpoons' => '⇋',
+ 'leftrightsquigarrow' => '↭',
+ 'LeftRightVector' => '⥎',
+ 'LeftTee' => '⊣',
+ 'LeftTeeArrow' => '↤',
+ 'LeftTeeVector' => '⥚',
+ 'leftthreetimes' => '⋋',
+ 'LeftTriangle' => '⊲',
+ 'LeftTriangleBar' => '⧏',
+ 'LeftTriangleEqual' => '⊴',
+ 'LeftUpDownVector' => '⥑',
+ 'LeftUpTeeVector' => '⥠',
+ 'LeftUpVector' => '↿',
+ 'LeftUpVectorBar' => '⥘',
+ 'LeftVector' => '↼',
+ 'LeftVectorBar' => '⥒',
+ 'lEg' => '⪋',
+ 'leg' => '⋚',
+ 'leq' => '≤',
+ 'leqq' => '≦',
+ 'leqslant' => '⩽',
+ 'les' => '⩽',
+ 'lescc' => '⪨',
+ 'lesdot' => '⩿',
+ 'lesdoto' => '⪁',
+ 'lesdotor' => '⪃',
+ 'lesg' => '⋚︀',
+ 'lesges' => '⪓',
+ 'lessapprox' => '⪅',
+ 'lessdot' => '⋖',
+ 'lesseqgtr' => '⋚',
+ 'lesseqqgtr' => '⪋',
+ 'LessEqualGreater' => '⋚',
+ 'LessFullEqual' => '≦',
+ 'LessGreater' => '≶',
+ 'lessgtr' => '≶',
+ 'LessLess' => '⪡',
+ 'lesssim' => '≲',
+ 'LessSlantEqual' => '⩽',
+ 'LessTilde' => '≲',
+ 'lfisht' => '⥼',
+ 'lfloor' => '⌊',
+ 'Lfr' => '𝔏',
+ 'lfr' => '𝔩',
+ 'lg' => '≶',
+ 'lgE' => '⪑',
+ 'lHar' => '⥢',
+ 'lhard' => '↽',
+ 'lharu' => '↼',
+ 'lharul' => '⥪',
+ 'lhblk' => '▄',
+ 'LJcy' => 'Љ',
+ 'ljcy' => 'љ',
+ 'Ll' => '⋘',
+ 'll' => '≪',
+ 'llarr' => '⇇',
+ 'llcorner' => '⌞',
+ 'Lleftarrow' => '⇚',
+ 'llhard' => '⥫',
+ 'lltri' => '◺',
+ 'Lmidot' => 'Ŀ',
+ 'lmidot' => 'ŀ',
+ 'lmoust' => '⎰',
+ 'lmoustache' => '⎰',
+ 'lnap' => '⪉',
+ 'lnapprox' => '⪉',
+ 'lnE' => '≨',
+ 'lne' => '⪇',
+ 'lneq' => '⪇',
+ 'lneqq' => '≨',
+ 'lnsim' => '⋦',
+ 'loang' => '⟬',
+ 'loarr' => '⇽',
+ 'lobrk' => '⟦',
+ 'LongLeftArrow' => '⟵',
+ 'Longleftarrow' => '⟸',
+ 'longleftarrow' => '⟵',
+ 'LongLeftRightArrow' => '⟷',
+ 'Longleftrightarrow' => '⟺',
+ 'longleftrightarrow' => '⟷',
+ 'longmapsto' => '⟼',
+ 'LongRightArrow' => '⟶',
+ 'Longrightarrow' => '⟹',
+ 'longrightarrow' => '⟶',
+ 'looparrowleft' => '↫',
+ 'looparrowright' => '↬',
+ 'lopar' => '⦅',
+ 'Lopf' => '𝕃',
+ 'lopf' => '𝕝',
+ 'loplus' => '⨭',
+ 'lotimes' => '⨴',
+ 'lowast' => '∗',
+ 'lowbar' => '_',
+ 'LowerLeftArrow' => '↙',
+ 'LowerRightArrow' => '↘',
+ 'loz' => '◊',
+ 'lozenge' => '◊',
+ 'lozf' => '⧫',
+ 'lpar' => '(',
+ 'lparlt' => '⦓',
+ 'lrarr' => '⇆',
+ 'lrcorner' => '⌟',
+ 'lrhar' => '⇋',
+ 'lrhard' => '⥭',
+ 'lrm' => '‎',
+ 'lrtri' => '⊿',
+ 'lsaquo' => '‹',
+ 'Lscr' => 'ℒ',
+ 'lscr' => '𝓁',
+ 'Lsh' => '↰',
+ 'lsh' => '↰',
+ 'lsim' => '≲',
+ 'lsime' => '⪍',
+ 'lsimg' => '⪏',
+ 'lsqb' => '[',
+ 'lsquo' => '‘',
+ 'lsquor' => '‚',
+ 'Lstrok' => 'Ł',
+ 'lstrok' => 'ł',
+ 'LT' => '<',
+ 'L' => '<',
+ 'Lt' => '≪',
+ 'lt' => '<',
+ 'l' => '<',
+ 'ltcc' => '⪦',
+ 'ltcir' => '⩹',
+ 'ltdot' => '⋖',
+ 'lthree' => '⋋',
+ 'ltimes' => '⋉',
+ 'ltlarr' => '⥶',
+ 'ltquest' => '⩻',
+ 'ltri' => '◃',
+ 'ltrie' => '⊴',
+ 'ltrif' => '◂',
+ 'ltrPar' => '⦖',
+ 'lurdshar' => '⥊',
+ 'luruhar' => '⥦',
+ 'lvertneqq' => '≨︀',
+ 'lvnE' => '≨︀',
+ 'macr' => '¯',
+ 'mac' => '¯',
+ 'male' => '♂',
+ 'malt' => '✠',
+ 'maltese' => '✠',
+ 'Map' => '⤅',
+ 'map' => '↦',
+ 'mapsto' => '↦',
+ 'mapstodown' => '↧',
+ 'mapstoleft' => '↤',
+ 'mapstoup' => '↥',
+ 'marker' => '▮',
+ 'mcomma' => '⨩',
+ 'Mcy' => 'М',
+ 'mcy' => 'м',
+ 'mdash' => '—',
+ 'mDDot' => '∺',
+ 'measuredangle' => '∡',
+ 'MediumSpace' => ' ',
+ 'Mellintrf' => 'ℳ',
+ 'Mfr' => '𝔐',
+ 'mfr' => '𝔪',
+ 'mho' => '℧',
+ 'micro' => 'µ',
+ 'micr' => 'µ',
+ 'mid' => '∣',
+ 'midast' => '*',
+ 'midcir' => '⫰',
+ 'middot' => '·',
+ 'middo' => '·',
+ 'minus' => '−',
+ 'minusb' => '⊟',
+ 'minusd' => '∸',
+ 'minusdu' => '⨪',
+ 'MinusPlus' => '∓',
+ 'mlcp' => '⫛',
+ 'mldr' => '…',
+ 'mnplus' => '∓',
+ 'models' => '⊧',
+ 'Mopf' => '𝕄',
+ 'mopf' => '𝕞',
+ 'mp' => '∓',
+ 'Mscr' => 'ℳ',
+ 'mscr' => '𝓂',
+ 'mstpos' => '∾',
+ 'Mu' => 'Μ',
+ 'mu' => 'μ',
+ 'multimap' => '⊸',
+ 'mumap' => '⊸',
+ 'nabla' => '∇',
+ 'Nacute' => 'Ń',
+ 'nacute' => 'ń',
+ 'nang' => '∠⃒',
+ 'nap' => '≉',
+ 'napE' => '⩰̸',
+ 'napid' => '≋̸',
+ 'napos' => 'ʼn',
+ 'napprox' => '≉',
+ 'natur' => '♮',
+ 'natural' => '♮',
+ 'naturals' => 'ℕ',
+ 'nbsp' => ' ',
+ 'nbs' => ' ',
+ 'nbump' => '≎̸',
+ 'nbumpe' => '≏̸',
+ 'ncap' => '⩃',
+ 'Ncaron' => 'Ň',
+ 'ncaron' => 'ň',
+ 'Ncedil' => 'Ņ',
+ 'ncedil' => 'ņ',
+ 'ncong' => '≇',
+ 'ncongdot' => '⩭̸',
+ 'ncup' => '⩂',
+ 'Ncy' => 'Н',
+ 'ncy' => 'н',
+ 'ndash' => '–',
+ 'ne' => '≠',
+ 'nearhk' => '⤤',
+ 'neArr' => '⇗',
+ 'nearr' => '↗',
+ 'nearrow' => '↗',
+ 'nedot' => '≐̸',
+ 'NegativeMediumSpace' => '​',
+ 'NegativeThickSpace' => '​',
+ 'NegativeThinSpace' => '​',
+ 'NegativeVeryThinSpace' => '​',
+ 'nequiv' => '≢',
+ 'nesear' => '⤨',
+ 'nesim' => '≂̸',
+ 'NestedGreaterGreater' => '≫',
+ 'NestedLessLess' => '≪',
+ 'NewLine' => '
+',
+ 'nexist' => '∄',
+ 'nexists' => '∄',
+ 'Nfr' => '𝔑',
+ 'nfr' => '𝔫',
+ 'ngE' => '≧̸',
+ 'nge' => '≱',
+ 'ngeq' => '≱',
+ 'ngeqq' => '≧̸',
+ 'ngeqslant' => '⩾̸',
+ 'nges' => '⩾̸',
+ 'nGg' => '⋙̸',
+ 'ngsim' => '≵',
+ 'nGt' => '≫⃒',
+ 'ngt' => '≯',
+ 'ngtr' => '≯',
+ 'nGtv' => '≫̸',
+ 'nhArr' => '⇎',
+ 'nharr' => '↮',
+ 'nhpar' => '⫲',
+ 'ni' => '∋',
+ 'nis' => '⋼',
+ 'nisd' => '⋺',
+ 'niv' => '∋',
+ 'NJcy' => 'Њ',
+ 'njcy' => 'њ',
+ 'nlArr' => '⇍',
+ 'nlarr' => '↚',
+ 'nldr' => '‥',
+ 'nlE' => '≦̸',
+ 'nle' => '≰',
+ 'nLeftarrow' => '⇍',
+ 'nleftarrow' => '↚',
+ 'nLeftrightarrow' => '⇎',
+ 'nleftrightarrow' => '↮',
+ 'nleq' => '≰',
+ 'nleqq' => '≦̸',
+ 'nleqslant' => '⩽̸',
+ 'nles' => '⩽̸',
+ 'nless' => '≮',
+ 'nLl' => '⋘̸',
+ 'nlsim' => '≴',
+ 'nLt' => '≪⃒',
+ 'nlt' => '≮',
+ 'nltri' => '⋪',
+ 'nltrie' => '⋬',
+ 'nLtv' => '≪̸',
+ 'nmid' => '∤',
+ 'NoBreak' => '⁠',
+ 'NonBreakingSpace' => ' ',
+ 'Nopf' => 'ℕ',
+ 'nopf' => '𝕟',
+ 'Not' => '⫬',
+ 'not' => '¬',
+ 'no' => '¬',
+ 'NotCongruent' => '≢',
+ 'NotCupCap' => '≭',
+ 'NotDoubleVerticalBar' => '∦',
+ 'NotElement' => '∉',
+ 'NotEqual' => '≠',
+ 'NotEqualTilde' => '≂̸',
+ 'NotExists' => '∄',
+ 'NotGreater' => '≯',
+ 'NotGreaterEqual' => '≱',
+ 'NotGreaterFullEqual' => '≧̸',
+ 'NotGreaterGreater' => '≫̸',
+ 'NotGreaterLess' => '≹',
+ 'NotGreaterSlantEqual' => '⩾̸',
+ 'NotGreaterTilde' => '≵',
+ 'NotHumpDownHump' => '≎̸',
+ 'NotHumpEqual' => '≏̸',
+ 'notin' => '∉',
+ 'notindot' => '⋵̸',
+ 'notinE' => '⋹̸',
+ 'notinva' => '∉',
+ 'notinvb' => '⋷',
+ 'notinvc' => '⋶',
+ 'NotLeftTriangle' => '⋪',
+ 'NotLeftTriangleBar' => '⧏̸',
+ 'NotLeftTriangleEqual' => '⋬',
+ 'NotLess' => '≮',
+ 'NotLessEqual' => '≰',
+ 'NotLessGreater' => '≸',
+ 'NotLessLess' => '≪̸',
+ 'NotLessSlantEqual' => '⩽̸',
+ 'NotLessTilde' => '≴',
+ 'NotNestedGreaterGreater' => '⪢̸',
+ 'NotNestedLessLess' => '⪡̸',
+ 'notni' => '∌',
+ 'notniva' => '∌',
+ 'notnivb' => '⋾',
+ 'notnivc' => '⋽',
+ 'NotPrecedes' => '⊀',
+ 'NotPrecedesEqual' => '⪯̸',
+ 'NotPrecedesSlantEqual' => '⋠',
+ 'NotReverseElement' => '∌',
+ 'NotRightTriangle' => '⋫',
+ 'NotRightTriangleBar' => '⧐̸',
+ 'NotRightTriangleEqual' => '⋭',
+ 'NotSquareSubset' => '⊏̸',
+ 'NotSquareSubsetEqual' => '⋢',
+ 'NotSquareSuperset' => '⊐̸',
+ 'NotSquareSupersetEqual' => '⋣',
+ 'NotSubset' => '⊂⃒',
+ 'NotSubsetEqual' => '⊈',
+ 'NotSucceeds' => '⊁',
+ 'NotSucceedsEqual' => '⪰̸',
+ 'NotSucceedsSlantEqual' => '⋡',
+ 'NotSucceedsTilde' => '≿̸',
+ 'NotSuperset' => '⊃⃒',
+ 'NotSupersetEqual' => '⊉',
+ 'NotTilde' => '≁',
+ 'NotTildeEqual' => '≄',
+ 'NotTildeFullEqual' => '≇',
+ 'NotTildeTilde' => '≉',
+ 'NotVerticalBar' => '∤',
+ 'npar' => '∦',
+ 'nparallel' => '∦',
+ 'nparsl' => '⫽⃥',
+ 'npart' => '∂̸',
+ 'npolint' => '⨔',
+ 'npr' => '⊀',
+ 'nprcue' => '⋠',
+ 'npre' => '⪯̸',
+ 'nprec' => '⊀',
+ 'npreceq' => '⪯̸',
+ 'nrArr' => '⇏',
+ 'nrarr' => '↛',
+ 'nrarrc' => '⤳̸',
+ 'nrarrw' => '↝̸',
+ 'nRightarrow' => '⇏',
+ 'nrightarrow' => '↛',
+ 'nrtri' => '⋫',
+ 'nrtrie' => '⋭',
+ 'nsc' => '⊁',
+ 'nsccue' => '⋡',
+ 'nsce' => '⪰̸',
+ 'Nscr' => '𝒩',
+ 'nscr' => '𝓃',
+ 'nshortmid' => '∤',
+ 'nshortparallel' => '∦',
+ 'nsim' => '≁',
+ 'nsime' => '≄',
+ 'nsimeq' => '≄',
+ 'nsmid' => '∤',
+ 'nspar' => '∦',
+ 'nsqsube' => '⋢',
+ 'nsqsupe' => '⋣',
+ 'nsub' => '⊄',
+ 'nsubE' => '⫅̸',
+ 'nsube' => '⊈',
+ 'nsubset' => '⊂⃒',
+ 'nsubseteq' => '⊈',
+ 'nsubseteqq' => '⫅̸',
+ 'nsucc' => '⊁',
+ 'nsucceq' => '⪰̸',
+ 'nsup' => '⊅',
+ 'nsupE' => '⫆̸',
+ 'nsupe' => '⊉',
+ 'nsupset' => '⊃⃒',
+ 'nsupseteq' => '⊉',
+ 'nsupseteqq' => '⫆̸',
+ 'ntgl' => '≹',
+ 'Ntilde' => 'Ñ',
+ 'Ntild' => 'Ñ',
+ 'ntilde' => 'ñ',
+ 'ntild' => 'ñ',
+ 'ntlg' => '≸',
+ 'ntriangleleft' => '⋪',
+ 'ntrianglelefteq' => '⋬',
+ 'ntriangleright' => '⋫',
+ 'ntrianglerighteq' => '⋭',
+ 'Nu' => 'Ν',
+ 'nu' => 'ν',
+ 'num' => '#',
+ 'numero' => '№',
+ 'numsp' => ' ',
+ 'nvap' => '≍⃒',
+ 'nVDash' => '⊯',
+ 'nVdash' => '⊮',
+ 'nvDash' => '⊭',
+ 'nvdash' => '⊬',
+ 'nvge' => '≥⃒',
+ 'nvgt' => '>⃒',
+ 'nvHarr' => '⤄',
+ 'nvinfin' => '⧞',
+ 'nvlArr' => '⤂',
+ 'nvle' => '≤⃒',
+ 'nvlt' => '<⃒',
+ 'nvltrie' => '⊴⃒',
+ 'nvrArr' => '⤃',
+ 'nvrtrie' => '⊵⃒',
+ 'nvsim' => '∼⃒',
+ 'nwarhk' => '⤣',
+ 'nwArr' => '⇖',
+ 'nwarr' => '↖',
+ 'nwarrow' => '↖',
+ 'nwnear' => '⤧',
+ 'Oacute' => 'Ó',
+ 'Oacut' => 'Ó',
+ 'oacute' => 'ó',
+ 'oacut' => 'ó',
+ 'oast' => '⊛',
+ 'ocir' => 'ô',
+ 'Ocirc' => 'Ô',
+ 'Ocir' => 'Ô',
+ 'ocirc' => 'ô',
+ 'Ocy' => 'О',
+ 'ocy' => 'о',
+ 'odash' => '⊝',
+ 'Odblac' => 'Ő',
+ 'odblac' => 'ő',
+ 'odiv' => '⨸',
+ 'odot' => '⊙',
+ 'odsold' => '⦼',
+ 'OElig' => 'Œ',
+ 'oelig' => 'œ',
+ 'ofcir' => '⦿',
+ 'Ofr' => '𝔒',
+ 'ofr' => '𝔬',
+ 'ogon' => '˛',
+ 'Ograve' => 'Ò',
+ 'Ograv' => 'Ò',
+ 'ograve' => 'ò',
+ 'ograv' => 'ò',
+ 'ogt' => '⧁',
+ 'ohbar' => '⦵',
+ 'ohm' => 'Ω',
+ 'oint' => '∮',
+ 'olarr' => '↺',
+ 'olcir' => '⦾',
+ 'olcross' => '⦻',
+ 'oline' => '‾',
+ 'olt' => '⧀',
+ 'Omacr' => 'Ō',
+ 'omacr' => 'ō',
+ 'Omega' => 'Ω',
+ 'omega' => 'ω',
+ 'Omicron' => 'Ο',
+ 'omicron' => 'ο',
+ 'omid' => '⦶',
+ 'ominus' => '⊖',
+ 'Oopf' => '𝕆',
+ 'oopf' => '𝕠',
+ 'opar' => '⦷',
+ 'OpenCurlyDoubleQuote' => '“',
+ 'OpenCurlyQuote' => '‘',
+ 'operp' => '⦹',
+ 'oplus' => '⊕',
+ 'Or' => '⩔',
+ 'or' => '∨',
+ 'orarr' => '↻',
+ 'ord' => 'º',
+ 'order' => 'ℴ',
+ 'orderof' => 'ℴ',
+ 'ordf' => 'ª',
+ 'ordm' => 'º',
+ 'origof' => '⊶',
+ 'oror' => '⩖',
+ 'orslope' => '⩗',
+ 'orv' => '⩛',
+ 'oS' => 'Ⓢ',
+ 'Oscr' => '𝒪',
+ 'oscr' => 'ℴ',
+ 'Oslash' => 'Ø',
+ 'Oslas' => 'Ø',
+ 'oslash' => 'ø',
+ 'oslas' => 'ø',
+ 'osol' => '⊘',
+ 'Otilde' => 'Õ',
+ 'Otild' => 'Õ',
+ 'otilde' => 'õ',
+ 'otild' => 'õ',
+ 'Otimes' => '⨷',
+ 'otimes' => '⊗',
+ 'otimesas' => '⨶',
+ 'Ouml' => 'Ö',
+ 'Oum' => 'Ö',
+ 'ouml' => 'ö',
+ 'oum' => 'ö',
+ 'ovbar' => '⌽',
+ 'OverBar' => '‾',
+ 'OverBrace' => '⏞',
+ 'OverBracket' => '⎴',
+ 'OverParenthesis' => '⏜',
+ 'par' => '¶',
+ 'para' => '¶',
+ 'parallel' => '∥',
+ 'parsim' => '⫳',
+ 'parsl' => '⫽',
+ 'part' => '∂',
+ 'PartialD' => '∂',
+ 'Pcy' => 'П',
+ 'pcy' => 'п',
+ 'percnt' => '%',
+ 'period' => '.',
+ 'permil' => '‰',
+ 'perp' => '⊥',
+ 'pertenk' => '‱',
+ 'Pfr' => '𝔓',
+ 'pfr' => '𝔭',
+ 'Phi' => 'Φ',
+ 'phi' => 'φ',
+ 'phiv' => 'ϕ',
+ 'phmmat' => 'ℳ',
+ 'phone' => '☎',
+ 'Pi' => 'Π',
+ 'pi' => 'π',
+ 'pitchfork' => '⋔',
+ 'piv' => 'ϖ',
+ 'planck' => 'ℏ',
+ 'planckh' => 'ℎ',
+ 'plankv' => 'ℏ',
+ 'plus' => '+',
+ 'plusacir' => '⨣',
+ 'plusb' => '⊞',
+ 'pluscir' => '⨢',
+ 'plusdo' => '∔',
+ 'plusdu' => '⨥',
+ 'pluse' => '⩲',
+ 'PlusMinus' => '±',
+ 'plusmn' => '±',
+ 'plusm' => '±',
+ 'plussim' => '⨦',
+ 'plustwo' => '⨧',
+ 'pm' => '±',
+ 'Poincareplane' => 'ℌ',
+ 'pointint' => '⨕',
+ 'Popf' => 'ℙ',
+ 'popf' => '𝕡',
+ 'pound' => '£',
+ 'poun' => '£',
+ 'Pr' => '⪻',
+ 'pr' => '≺',
+ 'prap' => '⪷',
+ 'prcue' => '≼',
+ 'prE' => '⪳',
+ 'pre' => '⪯',
+ 'prec' => '≺',
+ 'precapprox' => '⪷',
+ 'preccurlyeq' => '≼',
+ 'Precedes' => '≺',
+ 'PrecedesEqual' => '⪯',
+ 'PrecedesSlantEqual' => '≼',
+ 'PrecedesTilde' => '≾',
+ 'preceq' => '⪯',
+ 'precnapprox' => '⪹',
+ 'precneqq' => '⪵',
+ 'precnsim' => '⋨',
+ 'precsim' => '≾',
+ 'Prime' => '″',
+ 'prime' => '′',
+ 'primes' => 'ℙ',
+ 'prnap' => '⪹',
+ 'prnE' => '⪵',
+ 'prnsim' => '⋨',
+ 'prod' => '∏',
+ 'Product' => '∏',
+ 'profalar' => '⌮',
+ 'profline' => '⌒',
+ 'profsurf' => '⌓',
+ 'prop' => '∝',
+ 'Proportion' => '∷',
+ 'Proportional' => '∝',
+ 'propto' => '∝',
+ 'prsim' => '≾',
+ 'prurel' => '⊰',
+ 'Pscr' => '𝒫',
+ 'pscr' => '𝓅',
+ 'Psi' => 'Ψ',
+ 'psi' => 'ψ',
+ 'puncsp' => ' ',
+ 'Qfr' => '𝔔',
+ 'qfr' => '𝔮',
+ 'qint' => '⨌',
+ 'Qopf' => 'ℚ',
+ 'qopf' => '𝕢',
+ 'qprime' => '⁗',
+ 'Qscr' => '𝒬',
+ 'qscr' => '𝓆',
+ 'quaternions' => 'ℍ',
+ 'quatint' => '⨖',
+ 'quest' => '?',
+ 'questeq' => '≟',
+ 'QUOT' => '"',
+ 'QUO' => '"',
+ 'quot' => '"',
+ 'quo' => '"',
+ 'rAarr' => '⇛',
+ 'race' => '∽̱',
+ 'Racute' => 'Ŕ',
+ 'racute' => 'ŕ',
+ 'radic' => '√',
+ 'raemptyv' => '⦳',
+ 'Rang' => '⟫',
+ 'rang' => '⟩',
+ 'rangd' => '⦒',
+ 'range' => '⦥',
+ 'rangle' => '⟩',
+ 'raquo' => '»',
+ 'raqu' => '»',
+ 'Rarr' => '↠',
+ 'rArr' => '⇒',
+ 'rarr' => '→',
+ 'rarrap' => '⥵',
+ 'rarrb' => '⇥',
+ 'rarrbfs' => '⤠',
+ 'rarrc' => '⤳',
+ 'rarrfs' => '⤞',
+ 'rarrhk' => '↪',
+ 'rarrlp' => '↬',
+ 'rarrpl' => '⥅',
+ 'rarrsim' => '⥴',
+ 'Rarrtl' => '⤖',
+ 'rarrtl' => '↣',
+ 'rarrw' => '↝',
+ 'rAtail' => '⤜',
+ 'ratail' => '⤚',
+ 'ratio' => '∶',
+ 'rationals' => 'ℚ',
+ 'RBarr' => '⤐',
+ 'rBarr' => '⤏',
+ 'rbarr' => '⤍',
+ 'rbbrk' => '❳',
+ 'rbrace' => '}',
+ 'rbrack' => ']',
+ 'rbrke' => '⦌',
+ 'rbrksld' => '⦎',
+ 'rbrkslu' => '⦐',
+ 'Rcaron' => 'Ř',
+ 'rcaron' => 'ř',
+ 'Rcedil' => 'Ŗ',
+ 'rcedil' => 'ŗ',
+ 'rceil' => '⌉',
+ 'rcub' => '}',
+ 'Rcy' => 'Р',
+ 'rcy' => 'р',
+ 'rdca' => '⤷',
+ 'rdldhar' => '⥩',
+ 'rdquo' => '”',
+ 'rdquor' => '”',
+ 'rdsh' => '↳',
+ 'Re' => 'ℜ',
+ 'real' => 'ℜ',
+ 'realine' => 'ℛ',
+ 'realpart' => 'ℜ',
+ 'reals' => 'ℝ',
+ 'rect' => '▭',
+ 'REG' => '®',
+ 'RE' => '®',
+ 'reg' => '®',
+ 're' => '®',
+ 'ReverseElement' => '∋',
+ 'ReverseEquilibrium' => '⇋',
+ 'ReverseUpEquilibrium' => '⥯',
+ 'rfisht' => '⥽',
+ 'rfloor' => '⌋',
+ 'Rfr' => 'ℜ',
+ 'rfr' => '𝔯',
+ 'rHar' => '⥤',
+ 'rhard' => '⇁',
+ 'rharu' => '⇀',
+ 'rharul' => '⥬',
+ 'Rho' => 'Ρ',
+ 'rho' => 'ρ',
+ 'rhov' => 'ϱ',
+ 'RightAngleBracket' => '⟩',
+ 'RightArrow' => '→',
+ 'Rightarrow' => '⇒',
+ 'rightarrow' => '→',
+ 'RightArrowBar' => '⇥',
+ 'RightArrowLeftArrow' => '⇄',
+ 'rightarrowtail' => '↣',
+ 'RightCeiling' => '⌉',
+ 'RightDoubleBracket' => '⟧',
+ 'RightDownTeeVector' => '⥝',
+ 'RightDownVector' => '⇂',
+ 'RightDownVectorBar' => '⥕',
+ 'RightFloor' => '⌋',
+ 'rightharpoondown' => '⇁',
+ 'rightharpoonup' => '⇀',
+ 'rightleftarrows' => '⇄',
+ 'rightleftharpoons' => '⇌',
+ 'rightrightarrows' => '⇉',
+ 'rightsquigarrow' => '↝',
+ 'RightTee' => '⊢',
+ 'RightTeeArrow' => '↦',
+ 'RightTeeVector' => '⥛',
+ 'rightthreetimes' => '⋌',
+ 'RightTriangle' => '⊳',
+ 'RightTriangleBar' => '⧐',
+ 'RightTriangleEqual' => '⊵',
+ 'RightUpDownVector' => '⥏',
+ 'RightUpTeeVector' => '⥜',
+ 'RightUpVector' => '↾',
+ 'RightUpVectorBar' => '⥔',
+ 'RightVector' => '⇀',
+ 'RightVectorBar' => '⥓',
+ 'ring' => '˚',
+ 'risingdotseq' => '≓',
+ 'rlarr' => '⇄',
+ 'rlhar' => '⇌',
+ 'rlm' => '‏',
+ 'rmoust' => '⎱',
+ 'rmoustache' => '⎱',
+ 'rnmid' => '⫮',
+ 'roang' => '⟭',
+ 'roarr' => '⇾',
+ 'robrk' => '⟧',
+ 'ropar' => '⦆',
+ 'Ropf' => 'ℝ',
+ 'ropf' => '𝕣',
+ 'roplus' => '⨮',
+ 'rotimes' => '⨵',
+ 'RoundImplies' => '⥰',
+ 'rpar' => ')',
+ 'rpargt' => '⦔',
+ 'rppolint' => '⨒',
+ 'rrarr' => '⇉',
+ 'Rrightarrow' => '⇛',
+ 'rsaquo' => '›',
+ 'Rscr' => 'ℛ',
+ 'rscr' => '𝓇',
+ 'Rsh' => '↱',
+ 'rsh' => '↱',
+ 'rsqb' => ']',
+ 'rsquo' => '’',
+ 'rsquor' => '’',
+ 'rthree' => '⋌',
+ 'rtimes' => '⋊',
+ 'rtri' => '▹',
+ 'rtrie' => '⊵',
+ 'rtrif' => '▸',
+ 'rtriltri' => '⧎',
+ 'RuleDelayed' => '⧴',
+ 'ruluhar' => '⥨',
+ 'rx' => '℞',
+ 'Sacute' => 'Ś',
+ 'sacute' => 'ś',
+ 'sbquo' => '‚',
+ 'Sc' => '⪼',
+ 'sc' => '≻',
+ 'scap' => '⪸',
+ 'Scaron' => 'Š',
+ 'scaron' => 'š',
+ 'sccue' => '≽',
+ 'scE' => '⪴',
+ 'sce' => '⪰',
+ 'Scedil' => 'Ş',
+ 'scedil' => 'ş',
+ 'Scirc' => 'Ŝ',
+ 'scirc' => 'ŝ',
+ 'scnap' => '⪺',
+ 'scnE' => '⪶',
+ 'scnsim' => '⋩',
+ 'scpolint' => '⨓',
+ 'scsim' => '≿',
+ 'Scy' => 'С',
+ 'scy' => 'с',
+ 'sdot' => '⋅',
+ 'sdotb' => '⊡',
+ 'sdote' => '⩦',
+ 'searhk' => '⤥',
+ 'seArr' => '⇘',
+ 'searr' => '↘',
+ 'searrow' => '↘',
+ 'sect' => '§',
+ 'sec' => '§',
+ 'semi' => ';',
+ 'seswar' => '⤩',
+ 'setminus' => '∖',
+ 'setmn' => '∖',
+ 'sext' => '✶',
+ 'Sfr' => '𝔖',
+ 'sfr' => '𝔰',
+ 'sfrown' => '⌢',
+ 'sharp' => '♯',
+ 'SHCHcy' => 'Щ',
+ 'shchcy' => 'щ',
+ 'SHcy' => 'Ш',
+ 'shcy' => 'ш',
+ 'ShortDownArrow' => '↓',
+ 'ShortLeftArrow' => '←',
+ 'shortmid' => '∣',
+ 'shortparallel' => '∥',
+ 'ShortRightArrow' => '→',
+ 'ShortUpArrow' => '↑',
+ 'shy' => '­',
+ 'sh' => '­',
+ 'Sigma' => 'Σ',
+ 'sigma' => 'σ',
+ 'sigmaf' => 'ς',
+ 'sigmav' => 'ς',
+ 'sim' => '∼',
+ 'simdot' => '⩪',
+ 'sime' => '≃',
+ 'simeq' => '≃',
+ 'simg' => '⪞',
+ 'simgE' => '⪠',
+ 'siml' => '⪝',
+ 'simlE' => '⪟',
+ 'simne' => '≆',
+ 'simplus' => '⨤',
+ 'simrarr' => '⥲',
+ 'slarr' => '←',
+ 'SmallCircle' => '∘',
+ 'smallsetminus' => '∖',
+ 'smashp' => '⨳',
+ 'smeparsl' => '⧤',
+ 'smid' => '∣',
+ 'smile' => '⌣',
+ 'smt' => '⪪',
+ 'smte' => '⪬',
+ 'smtes' => '⪬︀',
+ 'SOFTcy' => 'Ь',
+ 'softcy' => 'ь',
+ 'sol' => '/',
+ 'solb' => '⧄',
+ 'solbar' => '⌿',
+ 'Sopf' => '𝕊',
+ 'sopf' => '𝕤',
+ 'spades' => '♠',
+ 'spadesuit' => '♠',
+ 'spar' => '∥',
+ 'sqcap' => '⊓',
+ 'sqcaps' => '⊓︀',
+ 'sqcup' => '⊔',
+ 'sqcups' => '⊔︀',
+ 'Sqrt' => '√',
+ 'sqsub' => '⊏',
+ 'sqsube' => '⊑',
+ 'sqsubset' => '⊏',
+ 'sqsubseteq' => '⊑',
+ 'sqsup' => '⊐',
+ 'sqsupe' => '⊒',
+ 'sqsupset' => '⊐',
+ 'sqsupseteq' => '⊒',
+ 'squ' => '□',
+ 'Square' => '□',
+ 'square' => '□',
+ 'SquareIntersection' => '⊓',
+ 'SquareSubset' => '⊏',
+ 'SquareSubsetEqual' => '⊑',
+ 'SquareSuperset' => '⊐',
+ 'SquareSupersetEqual' => '⊒',
+ 'SquareUnion' => '⊔',
+ 'squarf' => '▪',
+ 'squf' => '▪',
+ 'srarr' => '→',
+ 'Sscr' => '𝒮',
+ 'sscr' => '𝓈',
+ 'ssetmn' => '∖',
+ 'ssmile' => '⌣',
+ 'sstarf' => '⋆',
+ 'Star' => '⋆',
+ 'star' => '☆',
+ 'starf' => '★',
+ 'straightepsilon' => 'ϵ',
+ 'straightphi' => 'ϕ',
+ 'strns' => '¯',
+ 'Sub' => '⋐',
+ 'sub' => '⊂',
+ 'subdot' => '⪽',
+ 'subE' => '⫅',
+ 'sube' => '⊆',
+ 'subedot' => '⫃',
+ 'submult' => '⫁',
+ 'subnE' => '⫋',
+ 'subne' => '⊊',
+ 'subplus' => '⪿',
+ 'subrarr' => '⥹',
+ 'Subset' => '⋐',
+ 'subset' => '⊂',
+ 'subseteq' => '⊆',
+ 'subseteqq' => '⫅',
+ 'SubsetEqual' => '⊆',
+ 'subsetneq' => '⊊',
+ 'subsetneqq' => '⫋',
+ 'subsim' => '⫇',
+ 'subsub' => '⫕',
+ 'subsup' => '⫓',
+ 'succ' => '≻',
+ 'succapprox' => '⪸',
+ 'succcurlyeq' => '≽',
+ 'Succeeds' => '≻',
+ 'SucceedsEqual' => '⪰',
+ 'SucceedsSlantEqual' => '≽',
+ 'SucceedsTilde' => '≿',
+ 'succeq' => '⪰',
+ 'succnapprox' => '⪺',
+ 'succneqq' => '⪶',
+ 'succnsim' => '⋩',
+ 'succsim' => '≿',
+ 'SuchThat' => '∋',
+ 'Sum' => '∑',
+ 'sum' => '∑',
+ 'sung' => '♪',
+ 'Sup' => '⋑',
+ 'sup' => '³',
+ 'sup1' => '¹',
+ 'sup2' => '²',
+ 'sup3' => '³',
+ 'supdot' => '⪾',
+ 'supdsub' => '⫘',
+ 'supE' => '⫆',
+ 'supe' => '⊇',
+ 'supedot' => '⫄',
+ 'Superset' => '⊃',
+ 'SupersetEqual' => '⊇',
+ 'suphsol' => '⟉',
+ 'suphsub' => '⫗',
+ 'suplarr' => '⥻',
+ 'supmult' => '⫂',
+ 'supnE' => '⫌',
+ 'supne' => '⊋',
+ 'supplus' => '⫀',
+ 'Supset' => '⋑',
+ 'supset' => '⊃',
+ 'supseteq' => '⊇',
+ 'supseteqq' => '⫆',
+ 'supsetneq' => '⊋',
+ 'supsetneqq' => '⫌',
+ 'supsim' => '⫈',
+ 'supsub' => '⫔',
+ 'supsup' => '⫖',
+ 'swarhk' => '⤦',
+ 'swArr' => '⇙',
+ 'swarr' => '↙',
+ 'swarrow' => '↙',
+ 'swnwar' => '⤪',
+ 'szlig' => 'ß',
+ 'szli' => 'ß',
+ 'Tab' => ' ',
+ 'target' => '⌖',
+ 'Tau' => 'Τ',
+ 'tau' => 'τ',
+ 'tbrk' => '⎴',
+ 'Tcaron' => 'Ť',
+ 'tcaron' => 'ť',
+ 'Tcedil' => 'Ţ',
+ 'tcedil' => 'ţ',
+ 'Tcy' => 'Т',
+ 'tcy' => 'т',
+ 'tdot' => '⃛',
+ 'telrec' => '⌕',
+ 'Tfr' => '𝔗',
+ 'tfr' => '𝔱',
+ 'there4' => '∴',
+ 'Therefore' => '∴',
+ 'therefore' => '∴',
+ 'Theta' => 'Θ',
+ 'theta' => 'θ',
+ 'thetasym' => 'ϑ',
+ 'thetav' => 'ϑ',
+ 'thickapprox' => '≈',
+ 'thicksim' => '∼',
+ 'ThickSpace' => '  ',
+ 'thinsp' => ' ',
+ 'ThinSpace' => ' ',
+ 'thkap' => '≈',
+ 'thksim' => '∼',
+ 'THORN' => 'Þ',
+ 'THOR' => 'Þ',
+ 'thorn' => 'þ',
+ 'thor' => 'þ',
+ 'Tilde' => '∼',
+ 'tilde' => '˜',
+ 'TildeEqual' => '≃',
+ 'TildeFullEqual' => '≅',
+ 'TildeTilde' => '≈',
+ 'times' => '×',
+ 'time' => '×',
+ 'timesb' => '⊠',
+ 'timesbar' => '⨱',
+ 'timesd' => '⨰',
+ 'tint' => '∭',
+ 'toea' => '⤨',
+ 'top' => '⊤',
+ 'topbot' => '⌶',
+ 'topcir' => '⫱',
+ 'Topf' => '𝕋',
+ 'topf' => '𝕥',
+ 'topfork' => '⫚',
+ 'tosa' => '⤩',
+ 'tprime' => '‴',
+ 'TRADE' => '™',
+ 'trade' => '™',
+ 'triangle' => '▵',
+ 'triangledown' => '▿',
+ 'triangleleft' => '◃',
+ 'trianglelefteq' => '⊴',
+ 'triangleq' => '≜',
+ 'triangleright' => '▹',
+ 'trianglerighteq' => '⊵',
+ 'tridot' => '◬',
+ 'trie' => '≜',
+ 'triminus' => '⨺',
+ 'TripleDot' => '⃛',
+ 'triplus' => '⨹',
+ 'trisb' => '⧍',
+ 'tritime' => '⨻',
+ 'trpezium' => '⏢',
+ 'Tscr' => '𝒯',
+ 'tscr' => '𝓉',
+ 'TScy' => 'Ц',
+ 'tscy' => 'ц',
+ 'TSHcy' => 'Ћ',
+ 'tshcy' => 'ћ',
+ 'Tstrok' => 'Ŧ',
+ 'tstrok' => 'ŧ',
+ 'twixt' => '≬',
+ 'twoheadleftarrow' => '↞',
+ 'twoheadrightarrow' => '↠',
+ 'Uacute' => 'Ú',
+ 'Uacut' => 'Ú',
+ 'uacute' => 'ú',
+ 'uacut' => 'ú',
+ 'Uarr' => '↟',
+ 'uArr' => '⇑',
+ 'uarr' => '↑',
+ 'Uarrocir' => '⥉',
+ 'Ubrcy' => 'Ў',
+ 'ubrcy' => 'ў',
+ 'Ubreve' => 'Ŭ',
+ 'ubreve' => 'ŭ',
+ 'Ucirc' => 'Û',
+ 'Ucir' => 'Û',
+ 'ucirc' => 'û',
+ 'ucir' => 'û',
+ 'Ucy' => 'У',
+ 'ucy' => 'у',
+ 'udarr' => '⇅',
+ 'Udblac' => 'Ű',
+ 'udblac' => 'ű',
+ 'udhar' => '⥮',
+ 'ufisht' => '⥾',
+ 'Ufr' => '𝔘',
+ 'ufr' => '𝔲',
+ 'Ugrave' => 'Ù',
+ 'Ugrav' => 'Ù',
+ 'ugrave' => 'ù',
+ 'ugrav' => 'ù',
+ 'uHar' => '⥣',
+ 'uharl' => '↿',
+ 'uharr' => '↾',
+ 'uhblk' => '▀',
+ 'ulcorn' => '⌜',
+ 'ulcorner' => '⌜',
+ 'ulcrop' => '⌏',
+ 'ultri' => '◸',
+ 'Umacr' => 'Ū',
+ 'umacr' => 'ū',
+ 'uml' => '¨',
+ 'um' => '¨',
+ 'UnderBar' => '_',
+ 'UnderBrace' => '⏟',
+ 'UnderBracket' => '⎵',
+ 'UnderParenthesis' => '⏝',
+ 'Union' => '⋃',
+ 'UnionPlus' => '⊎',
+ 'Uogon' => 'Ų',
+ 'uogon' => 'ų',
+ 'Uopf' => '𝕌',
+ 'uopf' => '𝕦',
+ 'UpArrow' => '↑',
+ 'Uparrow' => '⇑',
+ 'uparrow' => '↑',
+ 'UpArrowBar' => '⤒',
+ 'UpArrowDownArrow' => '⇅',
+ 'UpDownArrow' => '↕',
+ 'Updownarrow' => '⇕',
+ 'updownarrow' => '↕',
+ 'UpEquilibrium' => '⥮',
+ 'upharpoonleft' => '↿',
+ 'upharpoonright' => '↾',
+ 'uplus' => '⊎',
+ 'UpperLeftArrow' => '↖',
+ 'UpperRightArrow' => '↗',
+ 'Upsi' => 'ϒ',
+ 'upsi' => 'υ',
+ 'upsih' => 'ϒ',
+ 'Upsilon' => 'Υ',
+ 'upsilon' => 'υ',
+ 'UpTee' => '⊥',
+ 'UpTeeArrow' => '↥',
+ 'upuparrows' => '⇈',
+ 'urcorn' => '⌝',
+ 'urcorner' => '⌝',
+ 'urcrop' => '⌎',
+ 'Uring' => 'Ů',
+ 'uring' => 'ů',
+ 'urtri' => '◹',
+ 'Uscr' => '𝒰',
+ 'uscr' => '𝓊',
+ 'utdot' => '⋰',
+ 'Utilde' => 'Ũ',
+ 'utilde' => 'ũ',
+ 'utri' => '▵',
+ 'utrif' => '▴',
+ 'uuarr' => '⇈',
+ 'Uuml' => 'Ü',
+ 'Uum' => 'Ü',
+ 'uuml' => 'ü',
+ 'uum' => 'ü',
+ 'uwangle' => '⦧',
+ 'vangrt' => '⦜',
+ 'varepsilon' => 'ϵ',
+ 'varkappa' => 'ϰ',
+ 'varnothing' => '∅',
+ 'varphi' => 'ϕ',
+ 'varpi' => 'ϖ',
+ 'varpropto' => '∝',
+ 'vArr' => '⇕',
+ 'varr' => '↕',
+ 'varrho' => 'ϱ',
+ 'varsigma' => 'ς',
+ 'varsubsetneq' => '⊊︀',
+ 'varsubsetneqq' => '⫋︀',
+ 'varsupsetneq' => '⊋︀',
+ 'varsupsetneqq' => '⫌︀',
+ 'vartheta' => 'ϑ',
+ 'vartriangleleft' => '⊲',
+ 'vartriangleright' => '⊳',
+ 'Vbar' => '⫫',
+ 'vBar' => '⫨',
+ 'vBarv' => '⫩',
+ 'Vcy' => 'В',
+ 'vcy' => 'в',
+ 'VDash' => '⊫',
+ 'Vdash' => '⊩',
+ 'vDash' => '⊨',
+ 'vdash' => '⊢',
+ 'Vdashl' => '⫦',
+ 'Vee' => '⋁',
+ 'vee' => '∨',
+ 'veebar' => '⊻',
+ 'veeeq' => '≚',
+ 'vellip' => '⋮',
+ 'Verbar' => '‖',
+ 'verbar' => '|',
+ 'Vert' => '‖',
+ 'vert' => '|',
+ 'VerticalBar' => '∣',
+ 'VerticalLine' => '|',
+ 'VerticalSeparator' => '❘',
+ 'VerticalTilde' => '≀',
+ 'VeryThinSpace' => ' ',
+ 'Vfr' => '𝔙',
+ 'vfr' => '𝔳',
+ 'vltri' => '⊲',
+ 'vnsub' => '⊂⃒',
+ 'vnsup' => '⊃⃒',
+ 'Vopf' => '𝕍',
+ 'vopf' => '𝕧',
+ 'vprop' => '∝',
+ 'vrtri' => '⊳',
+ 'Vscr' => '𝒱',
+ 'vscr' => '𝓋',
+ 'vsubnE' => '⫋︀',
+ 'vsubne' => '⊊︀',
+ 'vsupnE' => '⫌︀',
+ 'vsupne' => '⊋︀',
+ 'Vvdash' => '⊪',
+ 'vzigzag' => '⦚',
+ 'Wcirc' => 'Ŵ',
+ 'wcirc' => 'ŵ',
+ 'wedbar' => '⩟',
+ 'Wedge' => '⋀',
+ 'wedge' => '∧',
+ 'wedgeq' => '≙',
+ 'weierp' => '℘',
+ 'Wfr' => '𝔚',
+ 'wfr' => '𝔴',
+ 'Wopf' => '𝕎',
+ 'wopf' => '𝕨',
+ 'wp' => '℘',
+ 'wr' => '≀',
+ 'wreath' => '≀',
+ 'Wscr' => '𝒲',
+ 'wscr' => '𝓌',
+ 'xcap' => '⋂',
+ 'xcirc' => '◯',
+ 'xcup' => '⋃',
+ 'xdtri' => '▽',
+ 'Xfr' => '𝔛',
+ 'xfr' => '𝔵',
+ 'xhArr' => '⟺',
+ 'xharr' => '⟷',
+ 'Xi' => 'Ξ',
+ 'xi' => 'ξ',
+ 'xlArr' => '⟸',
+ 'xlarr' => '⟵',
+ 'xmap' => '⟼',
+ 'xnis' => '⋻',
+ 'xodot' => '⨀',
+ 'Xopf' => '𝕏',
+ 'xopf' => '𝕩',
+ 'xoplus' => '⨁',
+ 'xotime' => '⨂',
+ 'xrArr' => '⟹',
+ 'xrarr' => '⟶',
+ 'Xscr' => '𝒳',
+ 'xscr' => '𝓍',
+ 'xsqcup' => '⨆',
+ 'xuplus' => '⨄',
+ 'xutri' => '△',
+ 'xvee' => '⋁',
+ 'xwedge' => '⋀',
+ 'Yacute' => 'Ý',
+ 'Yacut' => 'Ý',
+ 'yacute' => 'ý',
+ 'yacut' => 'ý',
+ 'YAcy' => 'Я',
+ 'yacy' => 'я',
+ 'Ycirc' => 'Ŷ',
+ 'ycirc' => 'ŷ',
+ 'Ycy' => 'Ы',
+ 'ycy' => 'ы',
+ 'yen' => '¥',
+ 'ye' => '¥',
+ 'Yfr' => '𝔜',
+ 'yfr' => '𝔶',
+ 'YIcy' => 'Ї',
+ 'yicy' => 'ї',
+ 'Yopf' => '𝕐',
+ 'yopf' => '𝕪',
+ 'Yscr' => '𝒴',
+ 'yscr' => '𝓎',
+ 'YUcy' => 'Ю',
+ 'yucy' => 'ю',
+ 'Yuml' => 'Ÿ',
+ 'yuml' => 'ÿ',
+ 'yum' => 'ÿ',
+ 'Zacute' => 'Ź',
+ 'zacute' => 'ź',
+ 'Zcaron' => 'Ž',
+ 'zcaron' => 'ž',
+ 'Zcy' => 'З',
+ 'zcy' => 'з',
+ 'Zdot' => 'Ż',
+ 'zdot' => 'ż',
+ 'zeetrf' => 'ℨ',
+ 'ZeroWidthSpace' => '​',
+ 'Zeta' => 'Ζ',
+ 'zeta' => 'ζ',
+ 'Zfr' => 'ℨ',
+ 'zfr' => '𝔷',
+ 'ZHcy' => 'Ж',
+ 'zhcy' => 'ж',
+ 'zigrarr' => '⇝',
+ 'Zopf' => 'ℤ',
+ 'zopf' => '𝕫',
+ 'Zscr' => '𝒵',
+ 'zscr' => '𝓏',
+ 'zwj' => '‍',
+ 'zwnj' => '‌',
+ );
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php
new file mode 100644
index 000000000..64e97e6ff
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Exception.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Masterminds\HTML5;
+
+/**
+ * The base exception for the HTML5 project.
+ */
+class Exception extends \Exception
+{
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php
new file mode 100644
index 000000000..33a73fcfb
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/InstructionProcessor.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * A handler for processor instructions.
+ */
+
+namespace Masterminds\HTML5;
+
+/**
+ * Provide an processor to handle embedded instructions.
+ *
+ * XML defines a mechanism for inserting instructions (like PHP) into a
+ * document. These are called "Processor Instructions." The HTML5 parser
+ * provides an opportunity to handle these processor instructions during
+ * the tree-building phase (before the DOM is constructed), which makes
+ * it possible to alter the document as it is being created.
+ *
+ * One could, for example, use this mechanism to execute well-formed PHP
+ * code embedded inside of an HTML5 document.
+ */
+interface InstructionProcessor
+{
+ /**
+ * Process an individual processing instruction.
+ *
+ * The process() function is responsible for doing the following:
+ * - Determining whether $name is an instruction type it can handle.
+ * - Determining what to do with the data passed in.
+ * - Making any subsequent modifications to the DOM by modifying the
+ * DOMElement or its attached DOM tree.
+ *
+ * @param \DOMElement $element The parent element for the current processing instruction.
+ * @param string $name The instruction's name. E.g. `&lt;?php` has the name `php`.
+ * @param string $data All of the data between the opening and closing PI marks.
+ *
+ * @return \DOMElement The element that should be considered "Current". This may just be
+ * the element passed in, but if the processor added more elements,
+ * it may choose to reset the current element to one of the elements
+ * it created. (When in doubt, return the element passed in.)
+ */
+ public function process(\DOMElement $element, $name, $data);
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php
new file mode 100644
index 000000000..490b5487b
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/CharacterReference.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+use Masterminds\HTML5\Entities;
+
+/**
+ * Manage entity references.
+ *
+ * This is a simple resolver for HTML5 character reference entitites. See Entities for the list of supported entities.
+ */
+class CharacterReference
+{
+ protected static $numeric_mask = array(
+ 0x0,
+ 0x2FFFF,
+ 0,
+ 0xFFFF,
+ );
+
+ /**
+ * Given a name (e.g. 'amp'), lookup the UTF-8 character ('&').
+ *
+ * @param string $name The name to look up.
+ *
+ * @return string The character sequence. In UTF-8 this may be more than one byte.
+ */
+ public static function lookupName($name)
+ {
+ // Do we really want to return NULL here? or FFFD
+ return isset(Entities::$byName[$name]) ? Entities::$byName[$name] : null;
+ }
+
+ /**
+ * Given a decimal number, return the UTF-8 character.
+ *
+ * @param $int
+ *
+ * @return false|string|string[]|null
+ */
+ public static function lookupDecimal($int)
+ {
+ $entity = '&#' . $int . ';';
+
+ // UNTESTED: This may fail on some planes. Couldn't find full documentation
+ // on the value of the mask array.
+ return mb_decode_numericentity($entity, static::$numeric_mask, 'utf-8');
+ }
+
+ /**
+ * Given a hexidecimal number, return the UTF-8 character.
+ *
+ * @param $hexdec
+ *
+ * @return false|string|string[]|null
+ */
+ public static function lookupHex($hexdec)
+ {
+ return static::lookupDecimal(hexdec($hexdec));
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php
new file mode 100644
index 000000000..293d83e2a
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php
@@ -0,0 +1,705 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+use Masterminds\HTML5\Elements;
+use Masterminds\HTML5\InstructionProcessor;
+
+/**
+ * Create an HTML5 DOM tree from events.
+ *
+ * This attempts to create a DOM from events emitted by a parser. This
+ * attempts (but does not guarantee) to up-convert older HTML documents
+ * to HTML5. It does this by applying HTML5's rules, but it will not
+ * change the architecture of the document itself.
+ *
+ * Many of the error correction and quirks features suggested in the specification
+ * are implemented herein; however, not all of them are. Since we do not
+ * assume a graphical user agent, no presentation-specific logic is conducted
+ * during tree building.
+ *
+ * FIXME: The present tree builder does not exactly follow the state machine rules
+ * for insert modes as outlined in the HTML5 spec. The processor needs to be
+ * re-written to accomodate this. See, for example, the Go language HTML5
+ * parser.
+ */
+class DOMTreeBuilder implements EventHandler
+{
+ /**
+ * Defined in http://www.w3.org/TR/html51/infrastructure.html#html-namespace-0.
+ */
+ const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml';
+
+ const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML';
+
+ const NAMESPACE_SVG = 'http://www.w3.org/2000/svg';
+
+ const NAMESPACE_XLINK = 'http://www.w3.org/1999/xlink';
+
+ const NAMESPACE_XML = 'http://www.w3.org/XML/1998/namespace';
+
+ const NAMESPACE_XMLNS = 'http://www.w3.org/2000/xmlns/';
+
+ const OPT_DISABLE_HTML_NS = 'disable_html_ns';
+
+ const OPT_TARGET_DOC = 'target_document';
+
+ const OPT_IMPLICIT_NS = 'implicit_namespaces';
+
+ /**
+ * Holds the HTML5 element names that causes a namespace switch.
+ *
+ * @var array
+ */
+ protected $nsRoots = array(
+ 'html' => self::NAMESPACE_HTML,
+ 'svg' => self::NAMESPACE_SVG,
+ 'math' => self::NAMESPACE_MATHML,
+ );
+
+ /**
+ * Holds the always available namespaces (which does not require the XMLNS declaration).
+ *
+ * @var array
+ */
+ protected $implicitNamespaces = array(
+ 'xml' => self::NAMESPACE_XML,
+ 'xmlns' => self::NAMESPACE_XMLNS,
+ 'xlink' => self::NAMESPACE_XLINK,
+ );
+
+ /**
+ * Holds a stack of currently active namespaces.
+ *
+ * @var array
+ */
+ protected $nsStack = array();
+
+ /**
+ * Holds the number of namespaces declared by a node.
+ *
+ * @var array
+ */
+ protected $pushes = array();
+
+ /**
+ * Defined in 8.2.5.
+ */
+ const IM_INITIAL = 0;
+
+ const IM_BEFORE_HTML = 1;
+
+ const IM_BEFORE_HEAD = 2;
+
+ const IM_IN_HEAD = 3;
+
+ const IM_IN_HEAD_NOSCRIPT = 4;
+
+ const IM_AFTER_HEAD = 5;
+
+ const IM_IN_BODY = 6;
+
+ const IM_TEXT = 7;
+
+ const IM_IN_TABLE = 8;
+
+ const IM_IN_TABLE_TEXT = 9;
+
+ const IM_IN_CAPTION = 10;
+
+ const IM_IN_COLUMN_GROUP = 11;
+
+ const IM_IN_TABLE_BODY = 12;
+
+ const IM_IN_ROW = 13;
+
+ const IM_IN_CELL = 14;
+
+ const IM_IN_SELECT = 15;
+
+ const IM_IN_SELECT_IN_TABLE = 16;
+
+ const IM_AFTER_BODY = 17;
+
+ const IM_IN_FRAMESET = 18;
+
+ const IM_AFTER_FRAMESET = 19;
+
+ const IM_AFTER_AFTER_BODY = 20;
+
+ const IM_AFTER_AFTER_FRAMESET = 21;
+
+ const IM_IN_SVG = 22;
+
+ const IM_IN_MATHML = 23;
+
+ protected $options = array();
+
+ protected $stack = array();
+
+ protected $current; // Pointer in the tag hierarchy.
+ protected $rules;
+ protected $doc;
+
+ protected $frag;
+
+ protected $processor;
+
+ protected $insertMode = 0;
+
+ /**
+ * Track if we are in an element that allows only inline child nodes.
+ *
+ * @var string|null
+ */
+ protected $onlyInline;
+
+ /**
+ * Quirks mode is enabled by default.
+ * Any document that is missing the DT will be considered to be in quirks mode.
+ */
+ protected $quirks = true;
+
+ protected $errors = array();
+
+ public function __construct($isFragment = false, array $options = array())
+ {
+ $this->options = $options;
+
+ if (isset($options[self::OPT_TARGET_DOC])) {
+ $this->doc = $options[self::OPT_TARGET_DOC];
+ } else {
+ $impl = new \DOMImplementation();
+ // XXX:
+ // Create the doctype. For now, we are always creating HTML5
+ // documents, and attempting to up-convert any older DTDs to HTML5.
+ $dt = $impl->createDocumentType('html');
+ // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt);
+ $this->doc = $impl->createDocument(null, '', $dt);
+ $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8';
+ }
+
+ $this->errors = array();
+
+ $this->current = $this->doc; // ->documentElement;
+
+ // Create a rules engine for tags.
+ $this->rules = new TreeBuildingRules();
+
+ $implicitNS = array();
+ if (isset($this->options[self::OPT_IMPLICIT_NS])) {
+ $implicitNS = $this->options[self::OPT_IMPLICIT_NS];
+ } elseif (isset($this->options['implicitNamespaces'])) {
+ $implicitNS = $this->options['implicitNamespaces'];
+ }
+
+ // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options
+ array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces);
+
+ if ($isFragment) {
+ $this->insertMode = static::IM_IN_BODY;
+ $this->frag = $this->doc->createDocumentFragment();
+ $this->current = $this->frag;
+ }
+ }
+
+ /**
+ * Get the document.
+ */
+ public function document()
+ {
+ return $this->doc;
+ }
+
+ /**
+ * Get the DOM fragment for the body.
+ *
+ * This returns a DOMNodeList because a fragment may have zero or more
+ * DOMNodes at its root.
+ *
+ * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context
+ *
+ * @return \DOMDocumentFragment
+ */
+ public function fragment()
+ {
+ return $this->frag;
+ }
+
+ /**
+ * Provide an instruction processor.
+ *
+ * This is used for handling Processor Instructions as they are
+ * inserted. If omitted, PI's are inserted directly into the DOM tree.
+ *
+ * @param InstructionProcessor $proc
+ */
+ public function setInstructionProcessor(InstructionProcessor $proc)
+ {
+ $this->processor = $proc;
+ }
+
+ public function doctype($name, $idType = 0, $id = null, $quirks = false)
+ {
+ // This is used solely for setting quirks mode. Currently we don't
+ // try to preserve the inbound DT. We convert it to HTML5.
+ $this->quirks = $quirks;
+
+ if ($this->insertMode > static::IM_INITIAL) {
+ $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name);
+
+ return;
+ }
+
+ $this->insertMode = static::IM_BEFORE_HTML;
+ }
+
+ /**
+ * Process the start tag.
+ *
+ * @todo - XMLNS namespace handling (we need to parse, even if it's not valid)
+ * - XLink, MathML and SVG namespace handling
+ * - Omission rules: 8.1.2.4 Optional tags
+ *
+ * @param string $name
+ * @param array $attributes
+ * @param bool $selfClosing
+ *
+ * @return int
+ */
+ public function startTag($name, $attributes = array(), $selfClosing = false)
+ {
+ $lname = $this->normalizeTagName($name);
+
+ // Make sure we have an html element.
+ if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) {
+ $this->startTag('html');
+ }
+
+ // Set quirks mode if we're at IM_INITIAL with no doctype.
+ if ($this->insertMode === static::IM_INITIAL) {
+ $this->quirks = true;
+ $this->parseError('No DOCTYPE specified.');
+ }
+
+ // SPECIAL TAG HANDLING:
+ // Spec says do this, and "don't ask."
+ // find the spec where this is defined... looks problematic
+ if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) {
+ $name = 'img';
+ }
+
+ // Autoclose p tags where appropriate.
+ if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) {
+ $this->autoclose('p');
+ }
+
+ // Set insert mode:
+ switch ($name) {
+ case 'html':
+ $this->insertMode = static::IM_BEFORE_HEAD;
+ break;
+ case 'head':
+ if ($this->insertMode > static::IM_BEFORE_HEAD) {
+ $this->parseError('Unexpected head tag outside of head context.');
+ } else {
+ $this->insertMode = static::IM_IN_HEAD;
+ }
+ break;
+ case 'body':
+ $this->insertMode = static::IM_IN_BODY;
+ break;
+ case 'svg':
+ $this->insertMode = static::IM_IN_SVG;
+ break;
+ case 'math':
+ $this->insertMode = static::IM_IN_MATHML;
+ break;
+ case 'noscript':
+ if ($this->insertMode === static::IM_IN_HEAD) {
+ $this->insertMode = static::IM_IN_HEAD_NOSCRIPT;
+ }
+ break;
+ }
+
+ // Special case handling for SVG.
+ if ($this->insertMode === static::IM_IN_SVG) {
+ $lname = Elements::normalizeSvgElement($lname);
+ }
+
+ $pushes = 0;
+ // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace
+ if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) {
+ array_unshift($this->nsStack, array(
+ '' => $this->nsRoots[$lname],
+ ) + $this->nsStack[0]);
+ ++$pushes;
+ }
+ $needsWorkaround = false;
+ if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) {
+ // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack
+ foreach ($attributes as $aName => $aVal) {
+ if ('xmlns' === $aName) {
+ $needsWorkaround = $aVal;
+ array_unshift($this->nsStack, array(
+ '' => $aVal,
+ ) + $this->nsStack[0]);
+ ++$pushes;
+ } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) {
+ array_unshift($this->nsStack, array(
+ substr($aName, $pos + 1) => $aVal,
+ ) + $this->nsStack[0]);
+ ++$pushes;
+ }
+ }
+ }
+
+ if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) {
+ $this->autoclose($this->onlyInline);
+ $this->onlyInline = null;
+ }
+
+ try {
+ $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : '';
+
+ if (false !== $needsWorkaround) {
+ $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>';
+
+ $frag = new \DOMDocument('1.0', 'UTF-8');
+ $frag->loadXML($xml);
+
+ $ele = $this->doc->importNode($frag->documentElement, true);
+ } else {
+ if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) {
+ $ele = $this->doc->createElement($lname);
+ } else {
+ $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname);
+ }
+ }
+ } catch (\DOMException $e) {
+ $this->parseError("Illegal tag name: <$lname>. Replaced with <invalid>.");
+ $ele = $this->doc->createElement('invalid');
+ }
+
+ if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) {
+ $this->onlyInline = $lname;
+ }
+
+ // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them.
+ // When we are on a void tag, we do not need to care about namesapce nesting.
+ if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) {
+ // PHP tends to free the memory used by DOM,
+ // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes
+ // see https://bugs.php.net/bug.php?id=67459
+ $this->pushes[spl_object_hash($ele)] = array($pushes, $ele);
+ }
+
+ foreach ($attributes as $aName => $aVal) {
+ // xmlns attributes can't be set
+ if ('xmlns' === $aName) {
+ continue;
+ }
+
+ if ($this->insertMode === static::IM_IN_SVG) {
+ $aName = Elements::normalizeSvgAttribute($aName);
+ } elseif ($this->insertMode === static::IM_IN_MATHML) {
+ $aName = Elements::normalizeMathMlAttribute($aName);
+ }
+
+ $aVal = (string) $aVal;
+
+ try {
+ $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false;
+
+ if ('xmlns' === $prefix) {
+ $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal);
+ } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) {
+ $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal);
+ } else {
+ $ele->setAttribute($aName, $aVal);
+ }
+ } catch (\DOMException $e) {
+ $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName");
+ continue;
+ }
+
+ // This is necessary on a non-DTD schema, like HTML5.
+ if ('id' === $aName) {
+ $ele->setIdAttribute('id', true);
+ }
+ }
+
+ if ($this->frag !== $this->current && $this->rules->hasRules($name)) {
+ // Some elements have special processing rules. Handle those separately.
+ $this->current = $this->rules->evaluate($ele, $this->current);
+ } else {
+ // Otherwise, it's a standard element.
+ $this->current->appendChild($ele);
+
+ if (!Elements::isA($name, Elements::VOID_TAG)) {
+ $this->current = $ele;
+ }
+
+ // Self-closing tags should only be respected on foreign elements
+ // (and are implied on void elements)
+ // See: https://www.w3.org/TR/html5/syntax.html#start-tags
+ if (Elements::isHtml5Element($name)) {
+ $selfClosing = false;
+ }
+ }
+
+ // This is sort of a last-ditch attempt to correct for cases where no head/body
+ // elements are provided.
+ if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) {
+ $this->insertMode = static::IM_IN_BODY;
+ }
+
+ // When we are on a void tag, we do not need to care about namesapce nesting,
+ // but we have to remove the namespaces pushed to $nsStack.
+ if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) {
+ // remove the namespaced definded by current node
+ for ($i = 0; $i < $pushes; ++$i) {
+ array_shift($this->nsStack);
+ }
+ }
+
+ if ($selfClosing) {
+ $this->endTag($name);
+ }
+
+ // Return the element mask, which the tokenizer can then use to set
+ // various processing rules.
+ return Elements::element($name);
+ }
+
+ public function endTag($name)
+ {
+ $lname = $this->normalizeTagName($name);
+
+ // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag
+ if ('br' === $name) {
+ $this->parseError('Closing tag encountered for void element br.');
+
+ $this->startTag('br');
+ }
+ // Ignore closing tags for other unary elements.
+ elseif (Elements::isA($name, Elements::VOID_TAG)) {
+ return;
+ }
+
+ if ($this->insertMode <= static::IM_BEFORE_HTML) {
+ // 8.2.5.4.2
+ if (in_array($name, array(
+ 'html',
+ 'br',
+ 'head',
+ 'title',
+ ))) {
+ $this->startTag('html');
+ $this->endTag($name);
+ $this->insertMode = static::IM_BEFORE_HEAD;
+
+ return;
+ }
+
+ // Ignore the tag.
+ $this->parseError('Illegal closing tag at global scope.');
+
+ return;
+ }
+
+ // Special case handling for SVG.
+ if ($this->insertMode === static::IM_IN_SVG) {
+ $lname = Elements::normalizeSvgElement($lname);
+ }
+
+ $cid = spl_object_hash($this->current);
+
+ // XXX: HTML has no parent. What do we do, though,
+ // if this element appears in the wrong place?
+ if ('html' === $lname) {
+ return;
+ }
+
+ // remove the namespaced definded by current node
+ if (isset($this->pushes[$cid])) {
+ for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) {
+ array_shift($this->nsStack);
+ }
+ unset($this->pushes[$cid]);
+ }
+
+ if (!$this->autoclose($lname)) {
+ $this->parseError('Could not find closing tag for ' . $lname);
+ }
+
+ switch ($lname) {
+ case 'head':
+ $this->insertMode = static::IM_AFTER_HEAD;
+ break;
+ case 'body':
+ $this->insertMode = static::IM_AFTER_BODY;
+ break;
+ case 'svg':
+ case 'mathml':
+ $this->insertMode = static::IM_IN_BODY;
+ break;
+ }
+ }
+
+ public function comment($cdata)
+ {
+ // TODO: Need to handle case where comment appears outside of the HTML tag.
+ $node = $this->doc->createComment($cdata);
+ $this->current->appendChild($node);
+ }
+
+ public function text($data)
+ {
+ // XXX: Hmmm.... should we really be this strict?
+ if ($this->insertMode < static::IM_IN_HEAD) {
+ // Per '8.2.5.4.3 The "before head" insertion mode' the characters
+ // " \t\n\r\f" should be ignored but no mention of a parse error. This is
+ // practical as most documents contain these characters. Other text is not
+ // expected here so recording a parse error is necessary.
+ $dataTmp = trim($data, " \t\n\r\f");
+ if (!empty($dataTmp)) {
+ // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode);
+ $this->parseError('Unexpected text. Ignoring: ' . $dataTmp);
+ }
+
+ return;
+ }
+ // fprintf(STDOUT, "Appending text %s.", $data);
+ $node = $this->doc->createTextNode($data);
+ $this->current->appendChild($node);
+ }
+
+ public function eof()
+ {
+ // If the $current isn't the $root, do we need to do anything?
+ }
+
+ public function parseError($msg, $line = 0, $col = 0)
+ {
+ $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg);
+ }
+
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ public function cdata($data)
+ {
+ $node = $this->doc->createCDATASection($data);
+ $this->current->appendChild($node);
+ }
+
+ public function processingInstruction($name, $data = null)
+ {
+ // XXX: Ignore initial XML declaration, per the spec.
+ if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) {
+ return;
+ }
+
+ // Important: The processor may modify the current DOM tree however it sees fit.
+ if ($this->processor instanceof InstructionProcessor) {
+ $res = $this->processor->process($this->current, $name, $data);
+ if (!empty($res)) {
+ $this->current = $res;
+ }
+
+ return;
+ }
+
+ // Otherwise, this is just a dumb PI element.
+ $node = $this->doc->createProcessingInstruction($name, $data);
+
+ $this->current->appendChild($node);
+ }
+
+ // ==========================================================================
+ // UTILITIES
+ // ==========================================================================
+
+ /**
+ * Apply normalization rules to a tag name.
+ * See sections 2.9 and 8.1.2.
+ *
+ * @param string $tagName
+ *
+ * @return string The normalized tag name.
+ */
+ protected function normalizeTagName($tagName)
+ {
+ /*
+ * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); }
+ */
+ return $tagName;
+ }
+
+ protected function quirksTreeResolver($name)
+ {
+ throw new \Exception('Not implemented.');
+ }
+
+ /**
+ * Automatically climb the tree and close the closest node with the matching $tag.
+ *
+ * @param string $tagName
+ *
+ * @return bool
+ */
+ protected function autoclose($tagName)
+ {
+ $working = $this->current;
+ do {
+ if (XML_ELEMENT_NODE !== $working->nodeType) {
+ return false;
+ }
+ if ($working->tagName === $tagName) {
+ $this->current = $working->parentNode;
+
+ return true;
+ }
+ } while ($working = $working->parentNode);
+
+ return false;
+ }
+
+ /**
+ * Checks if the given tagname is an ancestor of the present candidate.
+ *
+ * If $this->current or anything above $this->current matches the given tag
+ * name, this returns true.
+ *
+ * @param string $tagName
+ *
+ * @return bool
+ */
+ protected function isAncestor($tagName)
+ {
+ $candidate = $this->current;
+ while (XML_ELEMENT_NODE === $candidate->nodeType) {
+ if ($candidate->tagName === $tagName) {
+ return true;
+ }
+ $candidate = $candidate->parentNode;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns true if the immediate parent element is of the given tagname.
+ *
+ * @param string $tagName
+ *
+ * @return bool
+ */
+ protected function isParent($tagName)
+ {
+ return $this->current->tagName === $tagName;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php
new file mode 100644
index 000000000..9893a718b
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/**
+ * Standard events for HTML5.
+ *
+ * This is roughly analogous to a SAX2 or expat-style interface.
+ * However, it is tuned specifically for HTML5, according to section 8
+ * of the HTML5 specification.
+ *
+ * An event handler receives parser events. For a concrete
+ * implementation, see DOMTreeBuilder.
+ *
+ * Quirks support in the parser is limited to close-in syntax (malformed
+ * tags or attributes). Higher order syntax and semantic issues with a
+ * document (e.g. mismatched tags, illegal nesting, etc.) are the
+ * responsibility of the event handler implementation.
+ *
+ * See HTML5 spec section 8.2.4
+ */
+interface EventHandler
+{
+ const DOCTYPE_NONE = 0;
+
+ const DOCTYPE_PUBLIC = 1;
+
+ const DOCTYPE_SYSTEM = 2;
+
+ /**
+ * A doctype declaration.
+ *
+ * @param string $name The name of the root element.
+ * @param int $idType One of DOCTYPE_NONE, DOCTYPE_PUBLIC, or DOCTYPE_SYSTEM
+ * @param string $id The identifier. For DOCTYPE_PUBLIC, this is the public ID. If DOCTYPE_SYSTEM,
+ * then this is a system ID.
+ * @param bool $quirks Indicates whether the builder should enter quirks mode.
+ */
+ public function doctype($name, $idType = 0, $id = null, $quirks = false);
+
+ /**
+ * A start tag.
+ *
+ * IMPORTANT: The parser watches the return value of this event. If this returns
+ * an integer, the parser will switch TEXTMODE patters according to the int.
+ *
+ * This is how the Tree Builder can tell the Tokenizer when a certain tag should
+ * cause the parser to go into RAW text mode.
+ *
+ * The HTML5 standard requires that the builder is the one that initiates this
+ * step, and this is the only way short of a circular reference that we can
+ * do that.
+ *
+ * Example: if a startTag even for a `script` name is fired, and the startTag()
+ * implementation returns Tokenizer::TEXTMODE_RAW, then the tokenizer will
+ * switch into RAW text mode and consume data until it reaches a closing
+ * `script` tag.
+ *
+ * The textmode is automatically reset to Tokenizer::TEXTMODE_NORMAL when the
+ * closing tag is encounter. **This behavior may change.**
+ *
+ * @param string $name The tag name.
+ * @param array $attributes An array with all of the tag's attributes.
+ * @param bool $selfClosing An indicator of whether or not this tag is self-closing (<foo/>).
+ *
+ * @return int one of the Tokenizer::TEXTMODE_* constants
+ */
+ public function startTag($name, $attributes = array(), $selfClosing = false);
+
+ /**
+ * An end-tag.
+ */
+ public function endTag($name);
+
+ /**
+ * A comment section (unparsed character data).
+ */
+ public function comment($cdata);
+
+ /**
+ * A unit of parsed character data.
+ *
+ * Entities in this text are *already decoded*.
+ */
+ public function text($cdata);
+
+ /**
+ * Indicates that the document has been entirely processed.
+ */
+ public function eof();
+
+ /**
+ * Emitted when the parser encounters an error condition.
+ */
+ public function parseError($msg, $line, $col);
+
+ /**
+ * A CDATA section.
+ *
+ * @param string $data
+ * The unparsed character data
+ */
+ public function cdata($data);
+
+ /**
+ * This is a holdover from the XML spec.
+ *
+ * While user agents don't get PIs, server-side does.
+ *
+ * @param string $name The name of the processor (e.g. 'php').
+ * @param string $data The unparsed data.
+ */
+ public function processingInstruction($name, $data = null);
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php
new file mode 100644
index 000000000..b081ed96b
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/**
+ * The FileInputStream loads a file to be parsed.
+ *
+ * So right now we read files into strings and then process the
+ * string. We chose to do this largely for the sake of expediency of
+ * development, and also because we could optimize toward processing
+ * arbitrarily large chunks of the input. But in the future, we'd
+ * really like to rewrite this class to efficiently handle lower level
+ * stream reads (and thus efficiently handle large documents).
+ *
+ * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead.
+ */
+class FileInputStream extends StringInputStream implements InputStream
+{
+ /**
+ * Load a file input stream.
+ *
+ * @param string $data The file or url path to load.
+ * @param string $encoding The encoding to use for the data.
+ * @param string $debug A fprintf format to use to echo the data on stdout.
+ */
+ public function __construct($data, $encoding = 'UTF-8', $debug = '')
+ {
+ // Get the contents of the file.
+ $content = file_get_contents($data);
+
+ parent::__construct($content, $encoding, $debug);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php
new file mode 100644
index 000000000..ff4ef2266
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/InputStream.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/**
+ * Interface for stream readers.
+ *
+ * The parser only reads from streams. Various input sources can write
+ * an adapater to this InputStream.
+ *
+ * Currently provided InputStream implementations include
+ * FileInputStream and StringInputStream.
+ *
+ * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead.
+ */
+interface InputStream extends \Iterator
+{
+ /**
+ * Returns the current line that is being consumed.
+ *
+ * TODO: Move this to the scanner.
+ */
+ public function currentLine();
+
+ /**
+ * Returns the current column of the current line that the tokenizer is at.
+ *
+ * Newlines are column 0. The first char after a newline is column 1.
+ *
+ * @TODO Move this to the scanner.
+ *
+ * @return int The column number.
+ */
+ public function columnOffset();
+
+ /**
+ * Get all characters until EOF.
+ *
+ * This consumes characters until the EOF.
+ */
+ public function remainingChars();
+
+ /**
+ * Read to a particular match (or until $max bytes are consumed).
+ *
+ * This operates on byte sequences, not characters.
+ *
+ * Matches as far as possible until we reach a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @see strcspn
+ *
+ * @param string $bytes Bytes to match.
+ * @param int $max Maximum number of bytes to scan.
+ *
+ * @return mixed Index or false if no match is found. You should use strong
+ * equality when checking the result, since index could be 0.
+ */
+ public function charsUntil($bytes, $max = null);
+
+ /**
+ * Returns the string so long as $bytes matches.
+ *
+ * Matches as far as possible with a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @see strspn
+ *
+ * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the
+ * current char, the pointer advances and the char is part of the
+ * substring.
+ * @param int $max The max number of chars to read.
+ */
+ public function charsWhile($bytes, $max = null);
+
+ /**
+ * Unconsume one character.
+ *
+ * @param int $howMany The number of characters to move the pointer back.
+ */
+ public function unconsume($howMany = 1);
+
+ /**
+ * Retrieve the next character without advancing the pointer.
+ */
+ public function peek();
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/ParseError.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/ParseError.php
new file mode 100644
index 000000000..640e516c8
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/ParseError.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/**
+ * Emit when the parser has an error.
+ */
+class ParseError extends \Exception
+{
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/README.md b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/README.md
new file mode 100644
index 000000000..9f929570c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/README.md
@@ -0,0 +1,53 @@
+# The Parser Model
+
+The parser model here follows the model in section
+[8.2.1](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#parsing)
+of the HTML5 specification, though we do not assume a networking layer.
+
+ [ InputStream ] // Generic support for reading input.
+ ||
+ [ Scanner ] // Breaks down the stream into characters.
+ ||
+ [ Tokenizer ] // Groups characters into syntactic
+ ||
+ [ Tree Builder ] // Organizes units into a tree of objects
+ ||
+ [ DOM Document ] // The final state of the parsed document.
+
+
+## InputStream
+
+This is an interface with at least two concrete implementations:
+
+- StringInputStream: Reads an HTML5 string.
+- FileInputStream: Reads an HTML5 file.
+
+## Scanner
+
+This is a mechanical piece of the parser.
+
+## Tokenizer
+
+This follows section 8.4 of the HTML5 spec. It is (roughly) a recursive
+descent parser. (Though there are plenty of optimizations that are less
+than purely functional.
+
+## EventHandler and DOMTree
+
+EventHandler is the interface for tree builders. Since not all
+implementations will necessarily build trees, we've chosen a more
+generic name.
+
+The event handler emits tokens during tokenization.
+
+The DOMTree is an event handler that builds a DOM tree. The output of
+the DOMTree builder is a DOMDocument.
+
+## DOMDocument
+
+PHP has a DOMDocument class built-in (technically, it's part of libxml.)
+We use that, thus rendering the output of this process compatible with
+SimpleXML, QueryPath, and many other XML/HTML processing tools.
+
+For cases where the HTML5 is a fragment of a HTML5 document a
+DOMDocumentFragment is returned instead. This is another built-in class.
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Scanner.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Scanner.php
new file mode 100644
index 000000000..1b52983e7
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Scanner.php
@@ -0,0 +1,416 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+use Masterminds\HTML5\Exception;
+
+/**
+ * The scanner scans over a given data input to react appropriately to characters.
+ */
+class Scanner
+{
+ const CHARS_HEX = 'abcdefABCDEF01234567890';
+ const CHARS_ALNUM = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890';
+ const CHARS_ALPHA = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+ /**
+ * The string data we're parsing.
+ */
+ private $data;
+
+ /**
+ * The current integer byte position we are in $data.
+ */
+ private $char;
+
+ /**
+ * Length of $data; when $char === $data, we are at the end-of-file.
+ */
+ private $EOF;
+
+ /**
+ * Parse errors.
+ */
+ public $errors = array();
+
+ /**
+ * Create a new Scanner.
+ *
+ * @param string $data Data to parse.
+ * @param string $encoding The encoding to use for the data.
+ *
+ * @throws Exception If the given data cannot be encoded to UTF-8.
+ */
+ public function __construct($data, $encoding = 'UTF-8')
+ {
+ if ($data instanceof InputStream) {
+ @trigger_error('InputStream objects are deprecated since version 2.4 and will be removed in 3.0. Use strings instead.', E_USER_DEPRECATED);
+ $data = (string) $data;
+ }
+
+ $data = UTF8Utils::convertToUTF8($data, $encoding);
+
+ // There is good reason to question whether it makes sense to
+ // do this here, since most of these checks are done during
+ // parsing, and since this check doesn't actually *do* anything.
+ $this->errors = UTF8Utils::checkForIllegalCodepoints($data);
+
+ $data = $this->replaceLinefeeds($data);
+
+ $this->data = $data;
+ $this->char = 0;
+ $this->EOF = strlen($data);
+ }
+
+ /**
+ * Check if upcomming chars match the given sequence.
+ *
+ * This will read the stream for the $sequence. If it's
+ * found, this will return true. If not, return false.
+ * Since this unconsumes any chars it reads, the caller
+ * will still need to read the next sequence, even if
+ * this returns true.
+ *
+ * Example: $this->scanner->sequenceMatches('</script>') will
+ * see if the input stream is at the start of a
+ * '</script>' string.
+ *
+ * @param string $sequence
+ * @param bool $caseSensitive
+ *
+ * @return bool
+ */
+ public function sequenceMatches($sequence, $caseSensitive = true)
+ {
+ $portion = substr($this->data, $this->char, strlen($sequence));
+
+ return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence);
+ }
+
+ /**
+ * Get the current position.
+ *
+ * @return int The current intiger byte position.
+ */
+ public function position()
+ {
+ return $this->char;
+ }
+
+ /**
+ * Take a peek at the next character in the data.
+ *
+ * @return string The next character.
+ */
+ public function peek()
+ {
+ if (($this->char + 1) <= $this->EOF) {
+ return $this->data[$this->char + 1];
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the next character.
+ * Note: This advances the pointer.
+ *
+ * @return string The next character.
+ */
+ public function next()
+ {
+ ++$this->char;
+
+ if ($this->char < $this->EOF) {
+ return $this->data[$this->char];
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the current character.
+ * Note, this does not advance the pointer.
+ *
+ * @return string The current character.
+ */
+ public function current()
+ {
+ if ($this->char < $this->EOF) {
+ return $this->data[$this->char];
+ }
+
+ return false;
+ }
+
+ /**
+ * Silently consume N chars.
+ *
+ * @param int $count
+ */
+ public function consume($count = 1)
+ {
+ $this->char += $count;
+ }
+
+ /**
+ * Unconsume some of the data.
+ * This moves the data pointer backwards.
+ *
+ * @param int $howMany The number of characters to move the pointer back.
+ */
+ public function unconsume($howMany = 1)
+ {
+ if (($this->char - $howMany) >= 0) {
+ $this->char -= $howMany;
+ }
+ }
+
+ /**
+ * Get the next group of that contains hex characters.
+ * Note, along with getting the characters the pointer in the data will be
+ * moved as well.
+ *
+ * @return string The next group that is hex characters.
+ */
+ public function getHex()
+ {
+ return $this->doCharsWhile(static::CHARS_HEX);
+ }
+
+ /**
+ * Get the next group of characters that are ASCII Alpha characters.
+ * Note, along with getting the characters the pointer in the data will be
+ * moved as well.
+ *
+ * @return string The next group of ASCII alpha characters.
+ */
+ public function getAsciiAlpha()
+ {
+ return $this->doCharsWhile(static::CHARS_ALPHA);
+ }
+
+ /**
+ * Get the next group of characters that are ASCII Alpha characters and numbers.
+ * Note, along with getting the characters the pointer in the data will be
+ * moved as well.
+ *
+ * @return string The next group of ASCII alpha characters and numbers.
+ */
+ public function getAsciiAlphaNum()
+ {
+ return $this->doCharsWhile(static::CHARS_ALNUM);
+ }
+
+ /**
+ * Get the next group of numbers.
+ * Note, along with getting the characters the pointer in the data will be
+ * moved as well.
+ *
+ * @return string The next group of numbers.
+ */
+ public function getNumeric()
+ {
+ return $this->doCharsWhile('0123456789');
+ }
+
+ /**
+ * Consume whitespace.
+ * Whitespace in HTML5 is: formfeed, tab, newline, space.
+ *
+ * @return int The length of the matched whitespaces.
+ */
+ public function whitespace()
+ {
+ if ($this->char >= $this->EOF) {
+ return false;
+ }
+
+ $len = strspn($this->data, "\n\t\f ", $this->char);
+
+ $this->char += $len;
+
+ return $len;
+ }
+
+ /**
+ * Returns the current line that is being consumed.
+ *
+ * @return int The current line number.
+ */
+ public function currentLine()
+ {
+ if (empty($this->EOF) || 0 === $this->char) {
+ return 1;
+ }
+
+ // Add one to $this->char because we want the number for the next
+ // byte to be processed.
+ return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1;
+ }
+
+ /**
+ * Read chars until something in the mask is encountered.
+ *
+ * @param string $mask
+ *
+ * @return mixed
+ */
+ public function charsUntil($mask)
+ {
+ return $this->doCharsUntil($mask);
+ }
+
+ /**
+ * Read chars as long as the mask matches.
+ *
+ * @param string $mask
+ *
+ * @return int
+ */
+ public function charsWhile($mask)
+ {
+ return $this->doCharsWhile($mask);
+ }
+
+ /**
+ * Returns the current column of the current line that the tokenizer is at.
+ *
+ * Newlines are column 0. The first char after a newline is column 1.
+ *
+ * @return int The column number.
+ */
+ public function columnOffset()
+ {
+ // Short circuit for the first char.
+ if (0 === $this->char) {
+ return 0;
+ }
+
+ // strrpos is weird, and the offset needs to be negative for what we
+ // want (i.e., the last \n before $this->char). This needs to not have
+ // one (to make it point to the next character, the one we want the
+ // position of) added to it because strrpos's behaviour includes the
+ // final offset byte.
+ $backwardFrom = $this->char - 1 - strlen($this->data);
+ $lastLine = strrpos($this->data, "\n", $backwardFrom);
+
+ // However, for here we want the length up until the next byte to be
+ // processed, so add one to the current byte ($this->char).
+ if (false !== $lastLine) {
+ $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine);
+ } else {
+ // After a newline.
+ $findLengthOf = substr($this->data, 0, $this->char);
+ }
+
+ return UTF8Utils::countChars($findLengthOf);
+ }
+
+ /**
+ * Get all characters until EOF.
+ *
+ * This consumes characters until the EOF.
+ *
+ * @return int The number of characters remaining.
+ */
+ public function remainingChars()
+ {
+ if ($this->char < $this->EOF) {
+ $data = substr($this->data, $this->char);
+ $this->char = $this->EOF;
+
+ return $data;
+ }
+
+ return ''; // false;
+ }
+
+ /**
+ * Replace linefeed characters according to the spec.
+ *
+ * @param $data
+ *
+ * @return string
+ */
+ private function replaceLinefeeds($data)
+ {
+ /*
+ * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially.
+ * Any CR characters that are followed by LF characters must be removed, and any CR characters not
+ * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are
+ * represented by LF characters, and there are never any CR characters in the input to the tokenization
+ * stage.
+ */
+ $crlfTable = array(
+ "\0" => "\xEF\xBF\xBD",
+ "\r\n" => "\n",
+ "\r" => "\n",
+ );
+
+ return strtr($data, $crlfTable);
+ }
+
+ /**
+ * Read to a particular match (or until $max bytes are consumed).
+ *
+ * This operates on byte sequences, not characters.
+ *
+ * Matches as far as possible until we reach a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @param string $bytes Bytes to match.
+ * @param int $max Maximum number of bytes to scan.
+ *
+ * @return mixed Index or false if no match is found. You should use strong
+ * equality when checking the result, since index could be 0.
+ */
+ private function doCharsUntil($bytes, $max = null)
+ {
+ if ($this->char >= $this->EOF) {
+ return false;
+ }
+
+ if (0 === $max || $max) {
+ $len = strcspn($this->data, $bytes, $this->char, $max);
+ } else {
+ $len = strcspn($this->data, $bytes, $this->char);
+ }
+
+ $string = (string) substr($this->data, $this->char, $len);
+ $this->char += $len;
+
+ return $string;
+ }
+
+ /**
+ * Returns the string so long as $bytes matches.
+ *
+ * Matches as far as possible with a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the
+ * current char, the pointer advances and the char is part of the
+ * substring.
+ * @param int $max The max number of chars to read.
+ *
+ * @return string
+ */
+ private function doCharsWhile($bytes, $max = null)
+ {
+ if ($this->char >= $this->EOF) {
+ return false;
+ }
+
+ if (0 === $max || $max) {
+ $len = strspn($this->data, $bytes, $this->char, $max);
+ } else {
+ $len = strspn($this->data, $bytes, $this->char);
+ }
+
+ $string = (string) substr($this->data, $this->char, $len);
+ $this->char += $len;
+
+ return $string;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php
new file mode 100644
index 000000000..bed9d6eab
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php
@@ -0,0 +1,334 @@
+<?php
+/**
+ * Loads a string to be parsed.
+ */
+
+namespace Masterminds\HTML5\Parser;
+
+/*
+ *
+* Based on code from html5lib:
+
+Copyright 2009 Geoffrey Sneddon <http://gsnedders.com/>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+// Some conventions:
+// - /* */ indicates verbatim text from the HTML 5 specification
+// MPB: Not sure which version of the spec. Moving from HTML5lib to
+// HTML5-PHP, I have been using this version:
+// http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents
+//
+// - // indicates regular comments
+
+/**
+ * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead.
+ */
+class StringInputStream implements InputStream
+{
+ /**
+ * The string data we're parsing.
+ */
+ private $data;
+
+ /**
+ * The current integer byte position we are in $data.
+ */
+ private $char;
+
+ /**
+ * Length of $data; when $char === $data, we are at the end-of-file.
+ */
+ private $EOF;
+
+ /**
+ * Parse errors.
+ */
+ public $errors = array();
+
+ /**
+ * Create a new InputStream wrapper.
+ *
+ * @param string $data Data to parse.
+ * @param string $encoding The encoding to use for the data.
+ * @param string $debug A fprintf format to use to echo the data on stdout.
+ */
+ public function __construct($data, $encoding = 'UTF-8', $debug = '')
+ {
+ $data = UTF8Utils::convertToUTF8($data, $encoding);
+ if ($debug) {
+ fprintf(STDOUT, $debug, $data, strlen($data));
+ }
+
+ // There is good reason to question whether it makes sense to
+ // do this here, since most of these checks are done during
+ // parsing, and since this check doesn't actually *do* anything.
+ $this->errors = UTF8Utils::checkForIllegalCodepoints($data);
+
+ $data = $this->replaceLinefeeds($data);
+
+ $this->data = $data;
+ $this->char = 0;
+ $this->EOF = strlen($data);
+ }
+
+ public function __toString()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Replace linefeed characters according to the spec.
+ */
+ protected function replaceLinefeeds($data)
+ {
+ /*
+ * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially.
+ * Any CR characters that are followed by LF characters must be removed, and any CR characters not
+ * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are
+ * represented by LF characters, and there are never any CR characters in the input to the tokenization
+ * stage.
+ */
+ $crlfTable = array(
+ "\0" => "\xEF\xBF\xBD",
+ "\r\n" => "\n",
+ "\r" => "\n",
+ );
+
+ return strtr($data, $crlfTable);
+ }
+
+ /**
+ * Returns the current line that the tokenizer is at.
+ */
+ public function currentLine()
+ {
+ if (empty($this->EOF) || 0 === $this->char) {
+ return 1;
+ }
+ // Add one to $this->char because we want the number for the next
+ // byte to be processed.
+ return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1;
+ }
+
+ /**
+ * @deprecated
+ */
+ public function getCurrentLine()
+ {
+ return $this->currentLine();
+ }
+
+ /**
+ * Returns the current column of the current line that the tokenizer is at.
+ * Newlines are column 0. The first char after a newline is column 1.
+ *
+ * @return int The column number.
+ */
+ public function columnOffset()
+ {
+ // Short circuit for the first char.
+ if (0 === $this->char) {
+ return 0;
+ }
+ // strrpos is weird, and the offset needs to be negative for what we
+ // want (i.e., the last \n before $this->char). This needs to not have
+ // one (to make it point to the next character, the one we want the
+ // position of) added to it because strrpos's behaviour includes the
+ // final offset byte.
+ $backwardFrom = $this->char - 1 - strlen($this->data);
+ $lastLine = strrpos($this->data, "\n", $backwardFrom);
+
+ // However, for here we want the length up until the next byte to be
+ // processed, so add one to the current byte ($this->char).
+ if (false !== $lastLine) {
+ $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine);
+ } else {
+ // After a newline.
+ $findLengthOf = substr($this->data, 0, $this->char);
+ }
+
+ return UTF8Utils::countChars($findLengthOf);
+ }
+
+ /**
+ * @deprecated
+ */
+ public function getColumnOffset()
+ {
+ return $this->columnOffset();
+ }
+
+ /**
+ * Get the current character.
+ *
+ * @return string The current character.
+ */
+ public function current()
+ {
+ return $this->data[$this->char];
+ }
+
+ /**
+ * Advance the pointer.
+ * This is part of the Iterator interface.
+ */
+ #[\ReturnTypeWillChange]
+ public function next()
+ {
+ ++$this->char;
+ }
+
+ /**
+ * Rewind to the start of the string.
+ */
+ #[\ReturnTypeWillChange]
+ public function rewind()
+ {
+ $this->char = 0;
+ }
+
+ /**
+ * Is the current pointer location valid.
+ *
+ * @return bool Whether the current pointer location is valid.
+ */
+ #[\ReturnTypeWillChange]
+ public function valid()
+ {
+ return $this->char < $this->EOF;
+ }
+
+ /**
+ * Get all characters until EOF.
+ *
+ * This reads to the end of the file, and sets the read marker at the
+ * end of the file.
+ *
+ * Note this performs bounds checking.
+ *
+ * @return string Returns the remaining text. If called when the InputStream is
+ * already exhausted, it returns an empty string.
+ */
+ public function remainingChars()
+ {
+ if ($this->char < $this->EOF) {
+ $data = substr($this->data, $this->char);
+ $this->char = $this->EOF;
+
+ return $data;
+ }
+
+ return ''; // false;
+ }
+
+ /**
+ * Read to a particular match (or until $max bytes are consumed).
+ *
+ * This operates on byte sequences, not characters.
+ *
+ * Matches as far as possible until we reach a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @param string $bytes Bytes to match.
+ * @param int $max Maximum number of bytes to scan.
+ *
+ * @return mixed Index or false if no match is found. You should use strong
+ * equality when checking the result, since index could be 0.
+ */
+ public function charsUntil($bytes, $max = null)
+ {
+ if ($this->char >= $this->EOF) {
+ return false;
+ }
+
+ if (0 === $max || $max) {
+ $len = strcspn($this->data, $bytes, $this->char, $max);
+ } else {
+ $len = strcspn($this->data, $bytes, $this->char);
+ }
+
+ $string = (string) substr($this->data, $this->char, $len);
+ $this->char += $len;
+
+ return $string;
+ }
+
+ /**
+ * Returns the string so long as $bytes matches.
+ *
+ * Matches as far as possible with a certain set of bytes
+ * and returns the matched substring.
+ *
+ * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the
+ * current char, the pointer advances and the char is part of the
+ * substring.
+ * @param int $max The max number of chars to read.
+ *
+ * @return string
+ */
+ public function charsWhile($bytes, $max = null)
+ {
+ if ($this->char >= $this->EOF) {
+ return false;
+ }
+
+ if (0 === $max || $max) {
+ $len = strspn($this->data, $bytes, $this->char, $max);
+ } else {
+ $len = strspn($this->data, $bytes, $this->char);
+ }
+ $string = (string) substr($this->data, $this->char, $len);
+ $this->char += $len;
+
+ return $string;
+ }
+
+ /**
+ * Unconsume characters.
+ *
+ * @param int $howMany The number of characters to unconsume.
+ */
+ public function unconsume($howMany = 1)
+ {
+ if (($this->char - $howMany) >= 0) {
+ $this->char -= $howMany;
+ }
+ }
+
+ /**
+ * Look ahead without moving cursor.
+ */
+ public function peek()
+ {
+ if (($this->char + 1) <= $this->EOF) {
+ return $this->data[$this->char + 1];
+ }
+
+ return false;
+ }
+
+ public function key()
+ {
+ return $this->char;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php
new file mode 100644
index 000000000..300a44626
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php
@@ -0,0 +1,1191 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+use Masterminds\HTML5\Elements;
+
+/**
+ * The HTML5 tokenizer.
+ *
+ * The tokenizer's role is reading data from the scanner and gathering it into
+ * semantic units. From the tokenizer, data is emitted to an event handler,
+ * which may (for example) create a DOM tree.
+ *
+ * The HTML5 specification has a detailed explanation of tokenizing HTML5. We
+ * follow that specification to the maximum extent that we can. If you find
+ * a discrepancy that is not documented, please file a bug and/or submit a
+ * patch.
+ *
+ * This tokenizer is implemented as a recursive descent parser.
+ *
+ * Within the API documentation, you may see references to the specific section
+ * of the HTML5 spec that the code attempts to reproduce. Example: 8.2.4.1.
+ * This refers to section 8.2.4.1 of the HTML5 CR specification.
+ *
+ * @see http://www.w3.org/TR/2012/CR-html5-20121217/
+ */
+class Tokenizer
+{
+ protected $scanner;
+
+ protected $events;
+
+ protected $tok;
+
+ /**
+ * Buffer for text.
+ */
+ protected $text = '';
+
+ // When this goes to false, the parser stops.
+ protected $carryOn = true;
+
+ protected $textMode = 0; // TEXTMODE_NORMAL;
+ protected $untilTag = null;
+
+ const CONFORMANT_XML = 'xml';
+ const CONFORMANT_HTML = 'html';
+ protected $mode = self::CONFORMANT_HTML;
+
+ /**
+ * Create a new tokenizer.
+ *
+ * Typically, parsing a document involves creating a new tokenizer, giving
+ * it a scanner (input) and an event handler (output), and then calling
+ * the Tokenizer::parse() method.`
+ *
+ * @param Scanner $scanner A scanner initialized with an input stream.
+ * @param EventHandler $eventHandler An event handler, initialized and ready to receive events.
+ * @param string $mode
+ */
+ public function __construct($scanner, $eventHandler, $mode = self::CONFORMANT_HTML)
+ {
+ $this->scanner = $scanner;
+ $this->events = $eventHandler;
+ $this->mode = $mode;
+ }
+
+ /**
+ * Begin parsing.
+ *
+ * This will begin scanning the document, tokenizing as it goes.
+ * Tokens are emitted into the event handler.
+ *
+ * Tokenizing will continue until the document is completely
+ * read. Errors are emitted into the event handler, but
+ * the parser will attempt to continue parsing until the
+ * entire input stream is read.
+ */
+ public function parse()
+ {
+ do {
+ $this->consumeData();
+ // FIXME: Add infinite loop protection.
+ } while ($this->carryOn);
+ }
+
+ /**
+ * Set the text mode for the character data reader.
+ *
+ * HTML5 defines three different modes for reading text:
+ * - Normal: Read until a tag is encountered.
+ * - RCDATA: Read until a tag is encountered, but skip a few otherwise-
+ * special characters.
+ * - Raw: Read until a special closing tag is encountered (viz. pre, script)
+ *
+ * This allows those modes to be set.
+ *
+ * Normally, setting is done by the event handler via a special return code on
+ * startTag(), but it can also be set manually using this function.
+ *
+ * @param int $textmode One of Elements::TEXT_*.
+ * @param string $untilTag The tag that should stop RAW or RCDATA mode. Normal mode does not
+ * use this indicator.
+ */
+ public function setTextMode($textmode, $untilTag = null)
+ {
+ $this->textMode = $textmode & (Elements::TEXT_RAW | Elements::TEXT_RCDATA);
+ $this->untilTag = $untilTag;
+ }
+
+ /**
+ * Consume a character and make a move.
+ * HTML5 8.2.4.1.
+ */
+ protected function consumeData()
+ {
+ $tok = $this->scanner->current();
+
+ if ('&' === $tok) {
+ // Character reference
+ $ref = $this->decodeCharacterReference();
+ $this->buffer($ref);
+
+ $tok = $this->scanner->current();
+ }
+
+ // Parse tag
+ if ('<' === $tok) {
+ // Any buffered text data can go out now.
+ $this->flushBuffer();
+
+ $tok = $this->scanner->next();
+
+ if ('!' === $tok) {
+ $this->markupDeclaration();
+ } elseif ('/' === $tok) {
+ $this->endTag();
+ } elseif ('?' === $tok) {
+ $this->processingInstruction();
+ } elseif (ctype_alpha($tok)) {
+ $this->tagName();
+ } else {
+ $this->parseError('Illegal tag opening');
+ // TODO is this necessary ?
+ $this->characterData();
+ }
+
+ $tok = $this->scanner->current();
+ }
+
+ if (false === $tok) {
+ // Handle end of document
+ $this->eof();
+ } else {
+ // Parse character
+ switch ($this->textMode) {
+ case Elements::TEXT_RAW:
+ $this->rawText($tok);
+ break;
+
+ case Elements::TEXT_RCDATA:
+ $this->rcdata($tok);
+ break;
+
+ default:
+ if ('<' === $tok || '&' === $tok) {
+ break;
+ }
+
+ // NULL character
+ if ("\00" === $tok) {
+ $this->parseError('Received null character.');
+
+ $this->text .= $tok;
+ $this->scanner->consume();
+
+ break;
+ }
+
+ $this->text .= $this->scanner->charsUntil("<&\0");
+ }
+ }
+
+ return $this->carryOn;
+ }
+
+ /**
+ * Parse anything that looks like character data.
+ *
+ * Different rules apply based on the current text mode.
+ *
+ * @see Elements::TEXT_RAW Elements::TEXT_RCDATA.
+ */
+ protected function characterData()
+ {
+ $tok = $this->scanner->current();
+ if (false === $tok) {
+ return false;
+ }
+ switch ($this->textMode) {
+ case Elements::TEXT_RAW:
+ return $this->rawText($tok);
+ case Elements::TEXT_RCDATA:
+ return $this->rcdata($tok);
+ default:
+ if ('<' === $tok || '&' === $tok) {
+ return false;
+ }
+
+ return $this->text($tok);
+ }
+ }
+
+ /**
+ * This buffers the current token as character data.
+ *
+ * @param string $tok The current token.
+ *
+ * @return bool
+ */
+ protected function text($tok)
+ {
+ // This should never happen...
+ if (false === $tok) {
+ return false;
+ }
+
+ // NULL character
+ if ("\00" === $tok) {
+ $this->parseError('Received null character.');
+ }
+
+ $this->buffer($tok);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Read text in RAW mode.
+ *
+ * @param string $tok The current token.
+ *
+ * @return bool
+ */
+ protected function rawText($tok)
+ {
+ if (is_null($this->untilTag)) {
+ return $this->text($tok);
+ }
+
+ $sequence = '</' . $this->untilTag . '>';
+ $txt = $this->readUntilSequence($sequence);
+ $this->events->text($txt);
+ $this->setTextMode(0);
+
+ return $this->endTag();
+ }
+
+ /**
+ * Read text in RCDATA mode.
+ *
+ * @param string $tok The current token.
+ *
+ * @return bool
+ */
+ protected function rcdata($tok)
+ {
+ if (is_null($this->untilTag)) {
+ return $this->text($tok);
+ }
+
+ $sequence = '</' . $this->untilTag;
+ $txt = '';
+
+ $caseSensitive = !Elements::isHtml5Element($this->untilTag);
+ while (false !== $tok && !('<' == $tok && ($this->scanner->sequenceMatches($sequence, $caseSensitive)))) {
+ if ('&' == $tok) {
+ $txt .= $this->decodeCharacterReference();
+ $tok = $this->scanner->current();
+ } else {
+ $txt .= $tok;
+ $tok = $this->scanner->next();
+ }
+ }
+ $len = strlen($sequence);
+ $this->scanner->consume($len);
+ $len += $this->scanner->whitespace();
+ if ('>' !== $this->scanner->current()) {
+ $this->parseError('Unclosed RCDATA end tag');
+ }
+
+ $this->scanner->unconsume($len);
+ $this->events->text($txt);
+ $this->setTextMode(0);
+
+ return $this->endTag();
+ }
+
+ /**
+ * If the document is read, emit an EOF event.
+ */
+ protected function eof()
+ {
+ // fprintf(STDOUT, "EOF");
+ $this->flushBuffer();
+ $this->events->eof();
+ $this->carryOn = false;
+ }
+
+ /**
+ * Look for markup.
+ */
+ protected function markupDeclaration()
+ {
+ $tok = $this->scanner->next();
+
+ // Comment:
+ if ('-' == $tok && '-' == $this->scanner->peek()) {
+ $this->scanner->consume(2);
+
+ return $this->comment();
+ } elseif ('D' == $tok || 'd' == $tok) { // Doctype
+ return $this->doctype();
+ } elseif ('[' == $tok) { // CDATA section
+ return $this->cdataSection();
+ }
+
+ // FINISH
+ $this->parseError('Expected <!--, <![CDATA[, or <!DOCTYPE. Got <!%s', $tok);
+ $this->bogusComment('<!');
+
+ return true;
+ }
+
+ /**
+ * Consume an end tag. See section 8.2.4.9.
+ */
+ protected function endTag()
+ {
+ if ('/' != $this->scanner->current()) {
+ return false;
+ }
+ $tok = $this->scanner->next();
+
+ // a-zA-Z -> tagname
+ // > -> parse error
+ // EOF -> parse error
+ // -> parse error
+ if (!ctype_alpha($tok)) {
+ $this->parseError("Expected tag name, got '%s'", $tok);
+ if ("\0" == $tok || false === $tok) {
+ return false;
+ }
+
+ return $this->bogusComment('</');
+ }
+
+ $name = $this->scanner->charsUntil("\n\f \t>");
+ $name = self::CONFORMANT_XML === $this->mode ? $name : strtolower($name);
+ // Trash whitespace.
+ $this->scanner->whitespace();
+
+ $tok = $this->scanner->current();
+ if ('>' != $tok) {
+ $this->parseError("Expected >, got '%s'", $tok);
+ // We just trash stuff until we get to the next tag close.
+ $this->scanner->charsUntil('>');
+ }
+
+ $this->events->endTag($name);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Consume a tag name and body. See section 8.2.4.10.
+ */
+ protected function tagName()
+ {
+ // We know this is at least one char.
+ $name = $this->scanner->charsWhile(':_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
+ $name = self::CONFORMANT_XML === $this->mode ? $name : strtolower($name);
+ $attributes = array();
+ $selfClose = false;
+
+ // Handle attribute parse exceptions here so that we can
+ // react by trying to build a sensible parse tree.
+ try {
+ do {
+ $this->scanner->whitespace();
+ $this->attribute($attributes);
+ } while (!$this->isTagEnd($selfClose));
+ } catch (ParseError $e) {
+ $selfClose = false;
+ }
+
+ $mode = $this->events->startTag($name, $attributes, $selfClose);
+
+ if (is_int($mode)) {
+ $this->setTextMode($mode, $name);
+ }
+
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Check if the scanner has reached the end of a tag.
+ */
+ protected function isTagEnd(&$selfClose)
+ {
+ $tok = $this->scanner->current();
+ if ('/' == $tok) {
+ $this->scanner->consume();
+ $this->scanner->whitespace();
+ $tok = $this->scanner->current();
+
+ if ('>' == $tok) {
+ $selfClose = true;
+
+ return true;
+ }
+ if (false === $tok) {
+ $this->parseError('Unexpected EOF inside of tag.');
+
+ return true;
+ }
+ // Basically, we skip the / token and go on.
+ // See 8.2.4.43.
+ $this->parseError("Unexpected '%s' inside of a tag.", $tok);
+
+ return false;
+ }
+
+ if ('>' == $tok) {
+ return true;
+ }
+ if (false === $tok) {
+ $this->parseError('Unexpected EOF inside of tag.');
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Parse attributes from inside of a tag.
+ *
+ * @param string[] $attributes
+ *
+ * @return bool
+ *
+ * @throws ParseError
+ */
+ protected function attribute(&$attributes)
+ {
+ $tok = $this->scanner->current();
+ if ('/' == $tok || '>' == $tok || false === $tok) {
+ return false;
+ }
+
+ if ('<' == $tok) {
+ $this->parseError("Unexpected '<' inside of attributes list.");
+ // Push the < back onto the stack.
+ $this->scanner->unconsume();
+ // Let the caller figure out how to handle this.
+ throw new ParseError('Start tag inside of attribute.');
+ }
+
+ $name = strtolower($this->scanner->charsUntil("/>=\n\f\t "));
+
+ if (0 == strlen($name)) {
+ $tok = $this->scanner->current();
+ $this->parseError('Expected an attribute name, got %s.', $tok);
+ // Really, only '=' can be the char here. Everything else gets absorbed
+ // under one rule or another.
+ $name = $tok;
+ $this->scanner->consume();
+ }
+
+ $isValidAttribute = true;
+ // Attribute names can contain most Unicode characters for HTML5.
+ // But method "DOMElement::setAttribute" is throwing exception
+ // because of it's own internal restriction so these have to be filtered.
+ // see issue #23: https://github.com/Masterminds/html5-php/issues/23
+ // and http://www.w3.org/TR/2011/WD-html5-20110525/syntax.html#syntax-attribute-name
+ if (preg_match("/[\x1-\x2C\\/\x3B-\x40\x5B-\x5E\x60\x7B-\x7F]/u", $name)) {
+ $this->parseError('Unexpected characters in attribute name: %s', $name);
+ $isValidAttribute = false;
+ } // There is no limitation for 1st character in HTML5.
+ // But method "DOMElement::setAttribute" is throwing exception for the
+ // characters below so they have to be filtered.
+ // see issue #23: https://github.com/Masterminds/html5-php/issues/23
+ // and http://www.w3.org/TR/2011/WD-html5-20110525/syntax.html#syntax-attribute-name
+ elseif (preg_match('/^[0-9.-]/u', $name)) {
+ $this->parseError('Unexpected character at the begining of attribute name: %s', $name);
+ $isValidAttribute = false;
+ }
+ // 8.1.2.3
+ $this->scanner->whitespace();
+
+ $val = $this->attributeValue();
+ if ($isValidAttribute) {
+ $attributes[$name] = $val;
+ }
+
+ return true;
+ }
+
+ /**
+ * Consume an attribute value. See section 8.2.4.37 and after.
+ *
+ * @return string|null
+ */
+ protected function attributeValue()
+ {
+ if ('=' != $this->scanner->current()) {
+ return null;
+ }
+ $this->scanner->consume();
+ // 8.1.2.3
+ $this->scanner->whitespace();
+
+ $tok = $this->scanner->current();
+ switch ($tok) {
+ case "\n":
+ case "\f":
+ case ' ':
+ case "\t":
+ // Whitespace here indicates an empty value.
+ return null;
+ case '"':
+ case "'":
+ $this->scanner->consume();
+
+ return $this->quotedAttributeValue($tok);
+ case '>':
+ // case '/': // 8.2.4.37 seems to allow foo=/ as a valid attr.
+ $this->parseError('Expected attribute value, got tag end.');
+
+ return null;
+ case '=':
+ case '`':
+ $this->parseError('Expecting quotes, got %s.', $tok);
+
+ return $this->unquotedAttributeValue();
+ default:
+ return $this->unquotedAttributeValue();
+ }
+ }
+
+ /**
+ * Get an attribute value string.
+ *
+ * @param string $quote IMPORTANT: This is a series of chars! Any one of which will be considered
+ * termination of an attribute's value. E.g. "\"'" will stop at either
+ * ' or ".
+ *
+ * @return string The attribute value.
+ */
+ protected function quotedAttributeValue($quote)
+ {
+ $stoplist = "\f" . $quote;
+ $val = '';
+
+ while (true) {
+ $tokens = $this->scanner->charsUntil($stoplist . '&');
+ if (false !== $tokens) {
+ $val .= $tokens;
+ } else {
+ break;
+ }
+
+ $tok = $this->scanner->current();
+ if ('&' == $tok) {
+ $val .= $this->decodeCharacterReference(true);
+ continue;
+ }
+ break;
+ }
+ $this->scanner->consume();
+
+ return $val;
+ }
+
+ protected function unquotedAttributeValue()
+ {
+ $val = '';
+ $tok = $this->scanner->current();
+ while (false !== $tok) {
+ switch ($tok) {
+ case "\n":
+ case "\f":
+ case ' ':
+ case "\t":
+ case '>':
+ break 2;
+
+ case '&':
+ $val .= $this->decodeCharacterReference(true);
+ $tok = $this->scanner->current();
+
+ break;
+
+ case "'":
+ case '"':
+ case '<':
+ case '=':
+ case '`':
+ $this->parseError('Unexpected chars in unquoted attribute value %s', $tok);
+ $val .= $tok;
+ $tok = $this->scanner->next();
+ break;
+
+ default:
+ $val .= $this->scanner->charsUntil("\t\n\f >&\"'<=`");
+
+ $tok = $this->scanner->current();
+ }
+ }
+
+ return $val;
+ }
+
+ /**
+ * Consume malformed markup as if it were a comment.
+ * 8.2.4.44.
+ *
+ * The spec requires that the ENTIRE tag-like thing be enclosed inside of
+ * the comment. So this will generate comments like:
+ *
+ * &lt;!--&lt/+foo&gt;--&gt;
+ *
+ * @param string $leading Prepend any leading characters. This essentially
+ * negates the need to backtrack, but it's sort of a hack.
+ *
+ * @return bool
+ */
+ protected function bogusComment($leading = '')
+ {
+ $comment = $leading;
+ $tokens = $this->scanner->charsUntil('>');
+ if (false !== $tokens) {
+ $comment .= $tokens;
+ }
+ $tok = $this->scanner->current();
+ if (false !== $tok) {
+ $comment .= $tok;
+ }
+
+ $this->flushBuffer();
+ $this->events->comment($comment);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Read a comment.
+ * Expects the first tok to be inside of the comment.
+ *
+ * @return bool
+ */
+ protected function comment()
+ {
+ $tok = $this->scanner->current();
+ $comment = '';
+
+ // <!-->. Emit an empty comment because 8.2.4.46 says to.
+ if ('>' == $tok) {
+ // Parse error. Emit the comment token.
+ $this->parseError("Expected comment data, got '>'");
+ $this->events->comment('');
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ // Replace NULL with the replacement char.
+ if ("\0" == $tok) {
+ $tok = UTF8Utils::FFFD;
+ }
+ while (!$this->isCommentEnd()) {
+ $comment .= $tok;
+ $tok = $this->scanner->next();
+ }
+
+ $this->events->comment($comment);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Check if the scanner has reached the end of a comment.
+ *
+ * @return bool
+ */
+ protected function isCommentEnd()
+ {
+ $tok = $this->scanner->current();
+
+ // EOF
+ if (false === $tok) {
+ // Hit the end.
+ $this->parseError('Unexpected EOF in a comment.');
+
+ return true;
+ }
+
+ // If it doesn't start with -, not the end.
+ if ('-' != $tok) {
+ return false;
+ }
+
+ // Advance one, and test for '->'
+ if ('-' == $this->scanner->next() && '>' == $this->scanner->peek()) {
+ $this->scanner->consume(); // Consume the last '>'
+ return true;
+ }
+ // Unread '-';
+ $this->scanner->unconsume(1);
+
+ return false;
+ }
+
+ /**
+ * Parse a DOCTYPE.
+ *
+ * Parse a DOCTYPE declaration. This method has strong bearing on whether or
+ * not Quirksmode is enabled on the event handler.
+ *
+ * @todo This method is a little long. Should probably refactor.
+ *
+ * @return bool
+ */
+ protected function doctype()
+ {
+ // Check that string is DOCTYPE.
+ if ($this->scanner->sequenceMatches('DOCTYPE', false)) {
+ $this->scanner->consume(7);
+ } else {
+ $chars = $this->scanner->charsWhile('DOCTYPEdoctype');
+ $this->parseError('Expected DOCTYPE, got %s', $chars);
+
+ return $this->bogusComment('<!' . $chars);
+ }
+
+ $this->scanner->whitespace();
+ $tok = $this->scanner->current();
+
+ // EOF: die.
+ if (false === $tok) {
+ $this->events->doctype('html5', EventHandler::DOCTYPE_NONE, '', true);
+ $this->eof();
+
+ return true;
+ }
+
+ // NULL char: convert.
+ if ("\0" === $tok) {
+ $this->parseError('Unexpected null character in DOCTYPE.');
+ }
+
+ $stop = " \n\f>";
+ $doctypeName = $this->scanner->charsUntil($stop);
+ // Lowercase ASCII, replace \0 with FFFD
+ $doctypeName = strtolower(strtr($doctypeName, "\0", UTF8Utils::FFFD));
+
+ $tok = $this->scanner->current();
+
+ // If false, emit a parse error, DOCTYPE, and return.
+ if (false === $tok) {
+ $this->parseError('Unexpected EOF in DOCTYPE declaration.');
+ $this->events->doctype($doctypeName, EventHandler::DOCTYPE_NONE, null, true);
+
+ return true;
+ }
+
+ // Short DOCTYPE, like <!DOCTYPE html>
+ if ('>' == $tok) {
+ // DOCTYPE without a name.
+ if (0 == strlen($doctypeName)) {
+ $this->parseError('Expected a DOCTYPE name. Got nothing.');
+ $this->events->doctype($doctypeName, 0, null, true);
+ $this->scanner->consume();
+
+ return true;
+ }
+ $this->events->doctype($doctypeName);
+ $this->scanner->consume();
+
+ return true;
+ }
+ $this->scanner->whitespace();
+
+ $pub = strtoupper($this->scanner->getAsciiAlpha());
+ $white = $this->scanner->whitespace();
+
+ // Get ID, and flag it as pub or system.
+ if (('PUBLIC' == $pub || 'SYSTEM' == $pub) && $white > 0) {
+ // Get the sys ID.
+ $type = 'PUBLIC' == $pub ? EventHandler::DOCTYPE_PUBLIC : EventHandler::DOCTYPE_SYSTEM;
+ $id = $this->quotedString("\0>");
+ if (false === $id) {
+ $this->events->doctype($doctypeName, $type, $pub, false);
+
+ return true;
+ }
+
+ // Premature EOF.
+ if (false === $this->scanner->current()) {
+ $this->parseError('Unexpected EOF in DOCTYPE');
+ $this->events->doctype($doctypeName, $type, $id, true);
+
+ return true;
+ }
+
+ // Well-formed complete DOCTYPE.
+ $this->scanner->whitespace();
+ if ('>' == $this->scanner->current()) {
+ $this->events->doctype($doctypeName, $type, $id, false);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ // If we get here, we have <!DOCTYPE foo PUBLIC "bar" SOME_JUNK
+ // Throw away the junk, parse error, quirks mode, return true.
+ $this->scanner->charsUntil('>');
+ $this->parseError('Malformed DOCTYPE.');
+ $this->events->doctype($doctypeName, $type, $id, true);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ // Else it's a bogus DOCTYPE.
+ // Consume to > and trash.
+ $this->scanner->charsUntil('>');
+
+ $this->parseError('Expected PUBLIC or SYSTEM. Got %s.', $pub);
+ $this->events->doctype($doctypeName, 0, null, true);
+ $this->scanner->consume();
+
+ return true;
+ }
+
+ /**
+ * Utility for reading a quoted string.
+ *
+ * @param string $stopchars Characters (in addition to a close-quote) that should stop the string.
+ * E.g. sometimes '>' is higher precedence than '"' or "'".
+ *
+ * @return mixed String if one is found (quotations omitted).
+ */
+ protected function quotedString($stopchars)
+ {
+ $tok = $this->scanner->current();
+ if ('"' == $tok || "'" == $tok) {
+ $this->scanner->consume();
+ $ret = $this->scanner->charsUntil($tok . $stopchars);
+ if ($this->scanner->current() == $tok) {
+ $this->scanner->consume();
+ } else {
+ // Parse error because no close quote.
+ $this->parseError('Expected %s, got %s', $tok, $this->scanner->current());
+ }
+
+ return $ret;
+ }
+
+ return false;
+ }
+
+ /**
+ * Handle a CDATA section.
+ *
+ * @return bool
+ */
+ protected function cdataSection()
+ {
+ $cdata = '';
+ $this->scanner->consume();
+
+ $chars = $this->scanner->charsWhile('CDAT');
+ if ('CDATA' != $chars || '[' != $this->scanner->current()) {
+ $this->parseError('Expected [CDATA[, got %s', $chars);
+
+ return $this->bogusComment('<![' . $chars);
+ }
+
+ $tok = $this->scanner->next();
+ do {
+ if (false === $tok) {
+ $this->parseError('Unexpected EOF inside CDATA.');
+ $this->bogusComment('<![CDATA[' . $cdata);
+
+ return true;
+ }
+ $cdata .= $tok;
+ $tok = $this->scanner->next();
+ } while (!$this->scanner->sequenceMatches(']]>'));
+
+ // Consume ]]>
+ $this->scanner->consume(3);
+
+ $this->events->cdata($cdata);
+
+ return true;
+ }
+
+ // ================================================================
+ // Non-HTML5
+ // ================================================================
+
+ /**
+ * Handle a processing instruction.
+ *
+ * XML processing instructions are supposed to be ignored in HTML5,
+ * treated as "bogus comments". However, since we're not a user
+ * agent, we allow them. We consume until ?> and then issue a
+ * EventListener::processingInstruction() event.
+ *
+ * @return bool
+ */
+ protected function processingInstruction()
+ {
+ if ('?' != $this->scanner->current()) {
+ return false;
+ }
+
+ $tok = $this->scanner->next();
+ $procName = $this->scanner->getAsciiAlpha();
+ $white = $this->scanner->whitespace();
+
+ // If not a PI, send to bogusComment.
+ if (0 == strlen($procName) || 0 == $white || false == $this->scanner->current()) {
+ $this->parseError("Expected processing instruction name, got $tok");
+ $this->bogusComment('<?' . $tok . $procName);
+
+ return true;
+ }
+
+ $data = '';
+ // As long as it's not the case that the next two chars are ? and >.
+ while (!('?' == $this->scanner->current() && '>' == $this->scanner->peek())) {
+ $data .= $this->scanner->current();
+
+ $tok = $this->scanner->next();
+ if (false === $tok) {
+ $this->parseError('Unexpected EOF in processing instruction.');
+ $this->events->processingInstruction($procName, $data);
+
+ return true;
+ }
+ }
+
+ $this->scanner->consume(2); // Consume the closing tag
+ $this->events->processingInstruction($procName, $data);
+
+ return true;
+ }
+
+ // ================================================================
+ // UTILITY FUNCTIONS
+ // ================================================================
+
+ /**
+ * Read from the input stream until we get to the desired sequene
+ * or hit the end of the input stream.
+ *
+ * @param string $sequence
+ *
+ * @return string
+ */
+ protected function readUntilSequence($sequence)
+ {
+ $buffer = '';
+
+ // Optimization for reading larger blocks faster.
+ $first = substr($sequence, 0, 1);
+ while (false !== $this->scanner->current()) {
+ $buffer .= $this->scanner->charsUntil($first);
+
+ // Stop as soon as we hit the stopping condition.
+ if ($this->scanner->sequenceMatches($sequence, false)) {
+ return $buffer;
+ }
+ $buffer .= $this->scanner->current();
+ $this->scanner->consume();
+ }
+
+ // If we get here, we hit the EOF.
+ $this->parseError('Unexpected EOF during text read.');
+
+ return $buffer;
+ }
+
+ /**
+ * Check if upcomming chars match the given sequence.
+ *
+ * This will read the stream for the $sequence. If it's
+ * found, this will return true. If not, return false.
+ * Since this unconsumes any chars it reads, the caller
+ * will still need to read the next sequence, even if
+ * this returns true.
+ *
+ * Example: $this->scanner->sequenceMatches('</script>') will
+ * see if the input stream is at the start of a
+ * '</script>' string.
+ *
+ * @param string $sequence
+ * @param bool $caseSensitive
+ *
+ * @return bool
+ */
+ protected function sequenceMatches($sequence, $caseSensitive = true)
+ {
+ @trigger_error(__METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. Use Scanner::sequenceMatches() instead.', E_USER_DEPRECATED);
+
+ return $this->scanner->sequenceMatches($sequence, $caseSensitive);
+ }
+
+ /**
+ * Send a TEXT event with the contents of the text buffer.
+ *
+ * This emits an EventHandler::text() event with the current contents of the
+ * temporary text buffer. (The buffer is used to group as much PCDATA
+ * as we can instead of emitting lots and lots of TEXT events.)
+ */
+ protected function flushBuffer()
+ {
+ if ('' === $this->text) {
+ return;
+ }
+ $this->events->text($this->text);
+ $this->text = '';
+ }
+
+ /**
+ * Add text to the temporary buffer.
+ *
+ * @see flushBuffer()
+ *
+ * @param string $str
+ */
+ protected function buffer($str)
+ {
+ $this->text .= $str;
+ }
+
+ /**
+ * Emit a parse error.
+ *
+ * A parse error always returns false because it never consumes any
+ * characters.
+ *
+ * @param string $msg
+ *
+ * @return string
+ */
+ protected function parseError($msg)
+ {
+ $args = func_get_args();
+
+ if (count($args) > 1) {
+ array_shift($args);
+ $msg = vsprintf($msg, $args);
+ }
+
+ $line = $this->scanner->currentLine();
+ $col = $this->scanner->columnOffset();
+ $this->events->parseError($msg, $line, $col);
+
+ return false;
+ }
+
+ /**
+ * Decode a character reference and return the string.
+ *
+ * If $inAttribute is set to true, a bare & will be returned as-is.
+ *
+ * @param bool $inAttribute Set to true if the text is inside of an attribute value.
+ * false otherwise.
+ *
+ * @return string
+ */
+ protected function decodeCharacterReference($inAttribute = false)
+ {
+ // Next char after &.
+ $tok = $this->scanner->next();
+ $start = $this->scanner->position();
+
+ if (false === $tok) {
+ return '&';
+ }
+
+ // These indicate not an entity. We return just
+ // the &.
+ if ("\t" === $tok || "\n" === $tok || "\f" === $tok || ' ' === $tok || '&' === $tok || '<' === $tok) {
+ // $this->scanner->next();
+ return '&';
+ }
+
+ // Numeric entity
+ if ('#' === $tok) {
+ $tok = $this->scanner->next();
+
+ if (false === $tok) {
+ $this->parseError('Expected &#DEC; &#HEX;, got EOF');
+ $this->scanner->unconsume(1);
+
+ return '&';
+ }
+
+ // Hexidecimal encoding.
+ // X[0-9a-fA-F]+;
+ // x[0-9a-fA-F]+;
+ if ('x' === $tok || 'X' === $tok) {
+ $tok = $this->scanner->next(); // Consume x
+
+ // Convert from hex code to char.
+ $hex = $this->scanner->getHex();
+ if (empty($hex)) {
+ $this->parseError('Expected &#xHEX;, got &#x%s', $tok);
+ // We unconsume because we don't know what parser rules might
+ // be in effect for the remaining chars. For example. '&#>'
+ // might result in a specific parsing rule inside of tag
+ // contexts, while not inside of pcdata context.
+ $this->scanner->unconsume(2);
+
+ return '&';
+ }
+ $entity = CharacterReference::lookupHex($hex);
+ } // Decimal encoding.
+ // [0-9]+;
+ else {
+ // Convert from decimal to char.
+ $numeric = $this->scanner->getNumeric();
+ if (false === $numeric) {
+ $this->parseError('Expected &#DIGITS;, got &#%s', $tok);
+ $this->scanner->unconsume(2);
+
+ return '&';
+ }
+ $entity = CharacterReference::lookupDecimal($numeric);
+ }
+ } elseif ('=' === $tok && $inAttribute) {
+ return '&';
+ } else { // String entity.
+ // Attempt to consume a string up to a ';'.
+ // [a-zA-Z0-9]+;
+ $cname = $this->scanner->getAsciiAlphaNum();
+ $entity = CharacterReference::lookupName($cname);
+
+ // When no entity is found provide the name of the unmatched string
+ // and continue on as the & is not part of an entity. The & will
+ // be converted to &amp; elsewhere.
+ if (null === $entity) {
+ if (!$inAttribute || '' === $cname) {
+ $this->parseError("No match in entity table for '%s'", $cname);
+ }
+ $this->scanner->unconsume($this->scanner->position() - $start);
+
+ return '&';
+ }
+ }
+
+ // The scanner has advanced the cursor for us.
+ $tok = $this->scanner->current();
+
+ // We have an entity. We're done here.
+ if (';' === $tok) {
+ $this->scanner->consume();
+
+ return $entity;
+ }
+
+ // Failing to match ; means unconsume the entire string.
+ $this->scanner->unconsume($this->scanner->position() - $start);
+
+ $this->parseError('Expected &ENTITY;, got &ENTITY%s (no trailing ;) ', $tok);
+
+ return '&';
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php
new file mode 100644
index 000000000..00d3951fd
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/**
+ * Handles special-case rules for the DOM tree builder.
+ *
+ * Many tags have special rules that need to be accomodated on an
+ * individual basis. This class handles those rules.
+ *
+ * See section 8.1.2.4 of the spec.
+ *
+ * @todo - colgroup and col special behaviors
+ * - body and head special behaviors
+ */
+class TreeBuildingRules
+{
+ protected static $tags = array(
+ 'li' => 1,
+ 'dd' => 1,
+ 'dt' => 1,
+ 'rt' => 1,
+ 'rp' => 1,
+ 'tr' => 1,
+ 'th' => 1,
+ 'td' => 1,
+ 'thead' => 1,
+ 'tfoot' => 1,
+ 'tbody' => 1,
+ 'table' => 1,
+ 'optgroup' => 1,
+ 'option' => 1,
+ );
+
+ /**
+ * Returns true if the given tagname has special processing rules.
+ */
+ public function hasRules($tagname)
+ {
+ return isset(static::$tags[$tagname]);
+ }
+
+ /**
+ * Evaluate the rule for the current tag name.
+ *
+ * This may modify the existing DOM.
+ *
+ * @return \DOMElement The new Current DOM element.
+ */
+ public function evaluate($new, $current)
+ {
+ switch ($new->tagName) {
+ case 'li':
+ return $this->handleLI($new, $current);
+ case 'dt':
+ case 'dd':
+ return $this->handleDT($new, $current);
+ case 'rt':
+ case 'rp':
+ return $this->handleRT($new, $current);
+ case 'optgroup':
+ return $this->closeIfCurrentMatches($new, $current, array(
+ 'optgroup',
+ ));
+ case 'option':
+ return $this->closeIfCurrentMatches($new, $current, array(
+ 'option',
+ ));
+ case 'tr':
+ return $this->closeIfCurrentMatches($new, $current, array(
+ 'tr',
+ ));
+ case 'td':
+ case 'th':
+ return $this->closeIfCurrentMatches($new, $current, array(
+ 'th',
+ 'td',
+ ));
+ case 'tbody':
+ case 'thead':
+ case 'tfoot':
+ case 'table': // Spec isn't explicit about this, but it's necessary.
+
+ return $this->closeIfCurrentMatches($new, $current, array(
+ 'thead',
+ 'tfoot',
+ 'tbody',
+ ));
+ }
+
+ return $current;
+ }
+
+ protected function handleLI($ele, $current)
+ {
+ return $this->closeIfCurrentMatches($ele, $current, array(
+ 'li',
+ ));
+ }
+
+ protected function handleDT($ele, $current)
+ {
+ return $this->closeIfCurrentMatches($ele, $current, array(
+ 'dt',
+ 'dd',
+ ));
+ }
+
+ protected function handleRT($ele, $current)
+ {
+ return $this->closeIfCurrentMatches($ele, $current, array(
+ 'rt',
+ 'rp',
+ ));
+ }
+
+ protected function closeIfCurrentMatches($ele, $current, $match)
+ {
+ if (in_array($current->tagName, $match, true)) {
+ $current->parentNode->appendChild($ele);
+ } else {
+ $current->appendChild($ele);
+ }
+
+ return $ele;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php
new file mode 100644
index 000000000..f6a70bfac
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Masterminds\HTML5\Parser;
+
+/*
+Portions based on code from html5lib files with the following copyright:
+
+Copyright 2009 Geoffrey Sneddon <http://gsnedders.com/>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+use Masterminds\HTML5\Exception;
+
+class UTF8Utils
+{
+ /**
+ * The Unicode replacement character.
+ */
+ const FFFD = "\xEF\xBF\xBD";
+
+ /**
+ * Count the number of characters in a string.
+ * UTF-8 aware. This will try (in order) iconv, MB, libxml, and finally a custom counter.
+ *
+ * @param string $string
+ *
+ * @return int
+ */
+ public static function countChars($string)
+ {
+ // Get the length for the string we need.
+ if (function_exists('mb_strlen')) {
+ return mb_strlen($string, 'utf-8');
+ }
+
+ if (function_exists('iconv_strlen')) {
+ return iconv_strlen($string, 'utf-8');
+ }
+
+ if (function_exists('utf8_decode')) {
+ // MPB: Will this work? Won't certain decodes lead to two chars
+ // extrapolated out of 2-byte chars?
+ return strlen(utf8_decode($string));
+ }
+
+ $count = count_chars($string);
+
+ // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range)
+ // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range)
+ return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33));
+ }
+
+ /**
+ * Convert data from the given encoding to UTF-8.
+ *
+ * This has not yet been tested with charactersets other than UTF-8.
+ * It should work with ISO-8859-1/-13 and standard Latin Win charsets.
+ *
+ * @param string $data The data to convert
+ * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php
+ *
+ * @return string
+ */
+ public static function convertToUTF8($data, $encoding = 'UTF-8')
+ {
+ /*
+ * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted
+ * to Unicode characters for the tokeniser, as described by the rules for that encoding,
+ * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped
+ * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes
+ * in the original byte stream that could not be converted to Unicode characters must be
+ * converted to U+FFFD REPLACEMENT CHARACTER code points.
+ */
+
+ // mb_convert_encoding is chosen over iconv because of a bug. The best
+ // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643
+ // which contains links to the actual but reports as well as work around
+ // details.
+ if (function_exists('mb_convert_encoding')) {
+ // mb library has the following behaviors:
+ // - UTF-16 surrogates result in false.
+ // - Overlongs and outside Plane 16 result in empty strings.
+
+ // Before we run mb_convert_encoding we need to tell it what to do with
+ // characters it does not know. This could be different than the parent
+ // application executing this library so we store the value, change it
+ // to our needs, and then change it back when we are done. This feels
+ // a little excessive and it would be great if there was a better way.
+ $save = mb_substitute_character();
+ mb_substitute_character('none');
+ $data = mb_convert_encoding($data, 'UTF-8', $encoding);
+ mb_substitute_character($save);
+ }
+ // @todo Get iconv running in at least some environments if that is possible.
+ elseif (function_exists('iconv') && 'auto' !== $encoding) {
+ // fprintf(STDOUT, "iconv found\n");
+ // iconv has the following behaviors:
+ // - Overlong representations are ignored.
+ // - Beyond Plane 16 is replaced with a lower char.
+ // - Incomplete sequences generate a warning.
+ $data = @iconv($encoding, 'UTF-8//IGNORE', $data);
+ } else {
+ throw new Exception('Not implemented, please install mbstring or iconv');
+ }
+
+ /*
+ * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present.
+ */
+ if ("\xEF\xBB\xBF" === substr($data, 0, 3)) {
+ $data = substr($data, 3);
+ }
+
+ return $data;
+ }
+
+ /**
+ * Checks for Unicode code points that are not valid in a document.
+ *
+ * @param string $data A string to analyze
+ *
+ * @return array An array of (string) error messages produced by the scanning
+ */
+ public static function checkForIllegalCodepoints($data)
+ {
+ // Vestigal error handling.
+ $errors = array();
+
+ /*
+ * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs.
+ * Any occurrences of such characters is a parse error.
+ */
+ for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) {
+ $errors[] = 'null-character';
+ }
+
+ /*
+ * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F
+ * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF,
+ * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE,
+ * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF,
+ * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors.
+ * (These are all control characters or permanently undefined Unicode characters.)
+ */
+ // Check PCRE is loaded.
+ $count = preg_match_all(
+ '/(?:
+ [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F
+ |
+ \xC2[\x80-\x9F] # U+0080 to U+009F
+ |
+ \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF
+ |
+ \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF
+ |
+ \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF
+ |
+ [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16})
+ )/x', $data, $matches);
+ for ($i = 0; $i < $count; ++$i) {
+ $errors[] = 'invalid-codepoint';
+ }
+
+ return $errors;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php
new file mode 100644
index 000000000..e9421a12d
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php
@@ -0,0 +1,1533 @@
+<?php
+/**
+ * @file
+ * This contains HTML5 entities to use with serializing.
+ *
+ * The list here is mildly different from the list at Entities because
+ * that list was generated from the w3c. It contains some entities that are
+ * not entirely proper such as &am; which maps to &. This list is meant to be
+ * a fallback for PHP versions prior to PHP 5.4 when dealing with encoding.
+ */
+
+namespace Masterminds\HTML5\Serializer;
+
+/**
+ * A mapping of entities to their html5 representation.
+ * Used for older PHP
+ * versions that don't have the mapping.
+ */
+class HTML5Entities
+{
+ public static $map = array(
+ ' ' => '&Tab;',
+ "\n" => '&NewLine;',
+ '!' => '&excl;',
+ '"' => '&quot;',
+ '#' => '&num;',
+ '$' => '&dollar;',
+ '%' => '&percnt;',
+ '&' => '&amp;',
+ '\'' => '&apos;',
+ '(' => '&lpar;',
+ ')' => '&rpar;',
+ '*' => '&ast;',
+ '+' => '&plus;',
+ ',' => '&comma;',
+ '.' => '&period;',
+ '/' => '&sol;',
+ ':' => '&colon;',
+ ';' => '&semi;',
+ '<' => '&lt;',
+ '<⃒' => '&nvlt',
+ '=' => '&equals;',
+ '=⃥' => '&bne',
+ '>' => '&gt;',
+ '>⃒' => '&nvgt',
+ '?' => '&quest;',
+ '@' => '&commat;',
+ '[' => '&lbrack;',
+ '\\' => '&bsol;',
+ ']' => '&rsqb;',
+ '^' => '&Hat;',
+ '_' => '&lowbar;',
+ '`' => '&grave;',
+ 'fj' => '&fjlig',
+ '{' => '&lbrace;',
+ '|' => '&vert;',
+ '}' => '&rcub;',
+ ' ' => '&nbsp;',
+ '¡' => '&iexcl;',
+ '¢' => '&cent;',
+ '£' => '&pound;',
+ '¤' => '&curren;',
+ '¥' => '&yen;',
+ '¦' => '&brvbar;',
+ '§' => '&sect;',
+ '¨' => '&DoubleDot;',
+ '©' => '&copy;',
+ 'ª' => '&ordf;',
+ '«' => '&laquo;',
+ '¬' => '&not;',
+ '­' => '&shy;',
+ '®' => '&reg;',
+ '¯' => '&macr;',
+ '°' => '&deg;',
+ '±' => '&plusmn;',
+ '²' => '&sup2;',
+ '³' => '&sup3;',
+ '´' => '&DiacriticalAcute;',
+ 'µ' => '&micro;',
+ '¶' => '&para;',
+ '·' => '&CenterDot;',
+ '¸' => '&Cedilla;',
+ '¹' => '&sup1;',
+ 'º' => '&ordm;',
+ '»' => '&raquo;',
+ '¼' => '&frac14;',
+ '½' => '&half;',
+ '¾' => '&frac34;',
+ '¿' => '&iquest;',
+ 'À' => '&Agrave;',
+ 'Á' => '&Aacute;',
+ 'Â' => '&Acirc;',
+ 'Ã' => '&Atilde;',
+ 'Ä' => '&Auml;',
+ 'Å' => '&Aring;',
+ 'Æ' => '&AElig;',
+ 'Ç' => '&Ccedil;',
+ 'È' => '&Egrave;',
+ 'É' => '&Eacute;',
+ 'Ê' => '&Ecirc;',
+ 'Ë' => '&Euml;',
+ 'Ì' => '&Igrave;',
+ 'Í' => '&Iacute;',
+ 'Î' => '&Icirc;',
+ 'Ï' => '&Iuml;',
+ 'Ð' => '&ETH;',
+ 'Ñ' => '&Ntilde;',
+ 'Ò' => '&Ograve;',
+ 'Ó' => '&Oacute;',
+ 'Ô' => '&Ocirc;',
+ 'Õ' => '&Otilde;',
+ 'Ö' => '&Ouml;',
+ '×' => '&times;',
+ 'Ø' => '&Oslash;',
+ 'Ù' => '&Ugrave;',
+ 'Ú' => '&Uacute;',
+ 'Û' => '&Ucirc;',
+ 'Ü' => '&Uuml;',
+ 'Ý' => '&Yacute;',
+ 'Þ' => '&THORN;',
+ 'ß' => '&szlig;',
+ 'à' => '&agrave;',
+ 'á' => '&aacute;',
+ 'â' => '&acirc;',
+ 'ã' => '&atilde;',
+ 'ä' => '&auml;',
+ 'å' => '&aring;',
+ 'æ' => '&aelig;',
+ 'ç' => '&ccedil;',
+ 'è' => '&egrave;',
+ 'é' => '&eacute;',
+ 'ê' => '&ecirc;',
+ 'ë' => '&euml;',
+ 'ì' => '&igrave;',
+ 'í' => '&iacute;',
+ 'î' => '&icirc;',
+ 'ï' => '&iuml;',
+ 'ð' => '&eth;',
+ 'ñ' => '&ntilde;',
+ 'ò' => '&ograve;',
+ 'ó' => '&oacute;',
+ 'ô' => '&ocirc;',
+ 'õ' => '&otilde;',
+ 'ö' => '&ouml;',
+ '÷' => '&divide;',
+ 'ø' => '&oslash;',
+ 'ù' => '&ugrave;',
+ 'ú' => '&uacute;',
+ 'û' => '&ucirc;',
+ 'ü' => '&uuml;',
+ 'ý' => '&yacute;',
+ 'þ' => '&thorn;',
+ 'ÿ' => '&yuml;',
+ 'Ā' => '&Amacr;',
+ 'ā' => '&amacr;',
+ 'Ă' => '&Abreve;',
+ 'ă' => '&abreve;',
+ 'Ą' => '&Aogon;',
+ 'ą' => '&aogon;',
+ 'Ć' => '&Cacute;',
+ 'ć' => '&cacute;',
+ 'Ĉ' => '&Ccirc;',
+ 'ĉ' => '&ccirc;',
+ 'Ċ' => '&Cdot;',
+ 'ċ' => '&cdot;',
+ 'Č' => '&Ccaron;',
+ 'č' => '&ccaron;',
+ 'Ď' => '&Dcaron;',
+ 'ď' => '&dcaron;',
+ 'Đ' => '&Dstrok;',
+ 'đ' => '&dstrok;',
+ 'Ē' => '&Emacr;',
+ 'ē' => '&emacr;',
+ 'Ė' => '&Edot;',
+ 'ė' => '&edot;',
+ 'Ę' => '&Eogon;',
+ 'ę' => '&eogon;',
+ 'Ě' => '&Ecaron;',
+ 'ě' => '&ecaron;',
+ 'Ĝ' => '&Gcirc;',
+ 'ĝ' => '&gcirc;',
+ 'Ğ' => '&Gbreve;',
+ 'ğ' => '&gbreve;',
+ 'Ġ' => '&Gdot;',
+ 'ġ' => '&gdot;',
+ 'Ģ' => '&Gcedil;',
+ 'Ĥ' => '&Hcirc;',
+ 'ĥ' => '&hcirc;',
+ 'Ħ' => '&Hstrok;',
+ 'ħ' => '&hstrok;',
+ 'Ĩ' => '&Itilde;',
+ 'ĩ' => '&itilde;',
+ 'Ī' => '&Imacr;',
+ 'ī' => '&imacr;',
+ 'Į' => '&Iogon;',
+ 'į' => '&iogon;',
+ 'İ' => '&Idot;',
+ 'ı' => '&inodot;',
+ 'IJ' => '&IJlig;',
+ 'ij' => '&ijlig;',
+ 'Ĵ' => '&Jcirc;',
+ 'ĵ' => '&jcirc;',
+ 'Ķ' => '&Kcedil;',
+ 'ķ' => '&kcedil;',
+ 'ĸ' => '&kgreen;',
+ 'Ĺ' => '&Lacute;',
+ 'ĺ' => '&lacute;',
+ 'Ļ' => '&Lcedil;',
+ 'ļ' => '&lcedil;',
+ 'Ľ' => '&Lcaron;',
+ 'ľ' => '&lcaron;',
+ 'Ŀ' => '&Lmidot;',
+ 'ŀ' => '&lmidot;',
+ 'Ł' => '&Lstrok;',
+ 'ł' => '&lstrok;',
+ 'Ń' => '&Nacute;',
+ 'ń' => '&nacute;',
+ 'Ņ' => '&Ncedil;',
+ 'ņ' => '&ncedil;',
+ 'Ň' => '&Ncaron;',
+ 'ň' => '&ncaron;',
+ 'ʼn' => '&napos;',
+ 'Ŋ' => '&ENG;',
+ 'ŋ' => '&eng;',
+ 'Ō' => '&Omacr;',
+ 'ō' => '&omacr;',
+ 'Ő' => '&Odblac;',
+ 'ő' => '&odblac;',
+ 'Œ' => '&OElig;',
+ 'œ' => '&oelig;',
+ 'Ŕ' => '&Racute;',
+ 'ŕ' => '&racute;',
+ 'Ŗ' => '&Rcedil;',
+ 'ŗ' => '&rcedil;',
+ 'Ř' => '&Rcaron;',
+ 'ř' => '&rcaron;',
+ 'Ś' => '&Sacute;',
+ 'ś' => '&sacute;',
+ 'Ŝ' => '&Scirc;',
+ 'ŝ' => '&scirc;',
+ 'Ş' => '&Scedil;',
+ 'ş' => '&scedil;',
+ 'Š' => '&Scaron;',
+ 'š' => '&scaron;',
+ 'Ţ' => '&Tcedil;',
+ 'ţ' => '&tcedil;',
+ 'Ť' => '&Tcaron;',
+ 'ť' => '&tcaron;',
+ 'Ŧ' => '&Tstrok;',
+ 'ŧ' => '&tstrok;',
+ 'Ũ' => '&Utilde;',
+ 'ũ' => '&utilde;',
+ 'Ū' => '&Umacr;',
+ 'ū' => '&umacr;',
+ 'Ŭ' => '&Ubreve;',
+ 'ŭ' => '&ubreve;',
+ 'Ů' => '&Uring;',
+ 'ů' => '&uring;',
+ 'Ű' => '&Udblac;',
+ 'ű' => '&udblac;',
+ 'Ų' => '&Uogon;',
+ 'ų' => '&uogon;',
+ 'Ŵ' => '&Wcirc;',
+ 'ŵ' => '&wcirc;',
+ 'Ŷ' => '&Ycirc;',
+ 'ŷ' => '&ycirc;',
+ 'Ÿ' => '&Yuml;',
+ 'Ź' => '&Zacute;',
+ 'ź' => '&zacute;',
+ 'Ż' => '&Zdot;',
+ 'ż' => '&zdot;',
+ 'Ž' => '&Zcaron;',
+ 'ž' => '&zcaron;',
+ 'ƒ' => '&fnof;',
+ 'Ƶ' => '&imped;',
+ 'ǵ' => '&gacute;',
+ 'ȷ' => '&jmath;',
+ 'ˆ' => '&circ;',
+ 'ˇ' => '&Hacek;',
+ '˘' => '&Breve;',
+ '˙' => '&dot;',
+ '˚' => '&ring;',
+ '˛' => '&ogon;',
+ '˜' => '&DiacriticalTilde;',
+ '˝' => '&DiacriticalDoubleAcute;',
+ '̑' => '&DownBreve;',
+ 'Α' => '&Alpha;',
+ 'Β' => '&Beta;',
+ 'Γ' => '&Gamma;',
+ 'Δ' => '&Delta;',
+ 'Ε' => '&Epsilon;',
+ 'Ζ' => '&Zeta;',
+ 'Η' => '&Eta;',
+ 'Θ' => '&Theta;',
+ 'Ι' => '&Iota;',
+ 'Κ' => '&Kappa;',
+ 'Λ' => '&Lambda;',
+ 'Μ' => '&Mu;',
+ 'Ν' => '&Nu;',
+ 'Ξ' => '&Xi;',
+ 'Ο' => '&Omicron;',
+ 'Π' => '&Pi;',
+ 'Ρ' => '&Rho;',
+ 'Σ' => '&Sigma;',
+ 'Τ' => '&Tau;',
+ 'Υ' => '&Upsilon;',
+ 'Φ' => '&Phi;',
+ 'Χ' => '&Chi;',
+ 'Ψ' => '&Psi;',
+ 'Ω' => '&Omega;',
+ 'α' => '&alpha;',
+ 'β' => '&beta;',
+ 'γ' => '&gamma;',
+ 'δ' => '&delta;',
+ 'ε' => '&epsi;',
+ 'ζ' => '&zeta;',
+ 'η' => '&eta;',
+ 'θ' => '&theta;',
+ 'ι' => '&iota;',
+ 'κ' => '&kappa;',
+ 'λ' => '&lambda;',
+ 'μ' => '&mu;',
+ 'ν' => '&nu;',
+ 'ξ' => '&xi;',
+ 'ο' => '&omicron;',
+ 'π' => '&pi;',
+ 'ρ' => '&rho;',
+ 'ς' => '&sigmav;',
+ 'σ' => '&sigma;',
+ 'τ' => '&tau;',
+ 'υ' => '&upsi;',
+ 'φ' => '&phi;',
+ 'χ' => '&chi;',
+ 'ψ' => '&psi;',
+ 'ω' => '&omega;',
+ 'ϑ' => '&thetasym;',
+ 'ϒ' => '&upsih;',
+ 'ϕ' => '&straightphi;',
+ 'ϖ' => '&piv;',
+ 'Ϝ' => '&Gammad;',
+ 'ϝ' => '&gammad;',
+ 'ϰ' => '&varkappa;',
+ 'ϱ' => '&rhov;',
+ 'ϵ' => '&straightepsilon;',
+ '϶' => '&backepsilon;',
+ 'Ё' => '&IOcy;',
+ 'Ђ' => '&DJcy;',
+ 'Ѓ' => '&GJcy;',
+ 'Є' => '&Jukcy;',
+ 'Ѕ' => '&DScy;',
+ 'І' => '&Iukcy;',
+ 'Ї' => '&YIcy;',
+ 'Ј' => '&Jsercy;',
+ 'Љ' => '&LJcy;',
+ 'Њ' => '&NJcy;',
+ 'Ћ' => '&TSHcy;',
+ 'Ќ' => '&KJcy;',
+ 'Ў' => '&Ubrcy;',
+ 'Џ' => '&DZcy;',
+ 'А' => '&Acy;',
+ 'Б' => '&Bcy;',
+ 'В' => '&Vcy;',
+ 'Г' => '&Gcy;',
+ 'Д' => '&Dcy;',
+ 'Е' => '&IEcy;',
+ 'Ж' => '&ZHcy;',
+ 'З' => '&Zcy;',
+ 'И' => '&Icy;',
+ 'Й' => '&Jcy;',
+ 'К' => '&Kcy;',
+ 'Л' => '&Lcy;',
+ 'М' => '&Mcy;',
+ 'Н' => '&Ncy;',
+ 'О' => '&Ocy;',
+ 'П' => '&Pcy;',
+ 'Р' => '&Rcy;',
+ 'С' => '&Scy;',
+ 'Т' => '&Tcy;',
+ 'У' => '&Ucy;',
+ 'Ф' => '&Fcy;',
+ 'Х' => '&KHcy;',
+ 'Ц' => '&TScy;',
+ 'Ч' => '&CHcy;',
+ 'Ш' => '&SHcy;',
+ 'Щ' => '&SHCHcy;',
+ 'Ъ' => '&HARDcy;',
+ 'Ы' => '&Ycy;',
+ 'Ь' => '&SOFTcy;',
+ 'Э' => '&Ecy;',
+ 'Ю' => '&YUcy;',
+ 'Я' => '&YAcy;',
+ 'а' => '&acy;',
+ 'б' => '&bcy;',
+ 'в' => '&vcy;',
+ 'г' => '&gcy;',
+ 'д' => '&dcy;',
+ 'е' => '&iecy;',
+ 'ж' => '&zhcy;',
+ 'з' => '&zcy;',
+ 'и' => '&icy;',
+ 'й' => '&jcy;',
+ 'к' => '&kcy;',
+ 'л' => '&lcy;',
+ 'м' => '&mcy;',
+ 'н' => '&ncy;',
+ 'о' => '&ocy;',
+ 'п' => '&pcy;',
+ 'р' => '&rcy;',
+ 'с' => '&scy;',
+ 'т' => '&tcy;',
+ 'у' => '&ucy;',
+ 'ф' => '&fcy;',
+ 'х' => '&khcy;',
+ 'ц' => '&tscy;',
+ 'ч' => '&chcy;',
+ 'ш' => '&shcy;',
+ 'щ' => '&shchcy;',
+ 'ъ' => '&hardcy;',
+ 'ы' => '&ycy;',
+ 'ь' => '&softcy;',
+ 'э' => '&ecy;',
+ 'ю' => '&yucy;',
+ 'я' => '&yacy;',
+ 'ё' => '&iocy;',
+ 'ђ' => '&djcy;',
+ 'ѓ' => '&gjcy;',
+ 'є' => '&jukcy;',
+ 'ѕ' => '&dscy;',
+ 'і' => '&iukcy;',
+ 'ї' => '&yicy;',
+ 'ј' => '&jsercy;',
+ 'љ' => '&ljcy;',
+ 'њ' => '&njcy;',
+ 'ћ' => '&tshcy;',
+ 'ќ' => '&kjcy;',
+ 'ў' => '&ubrcy;',
+ 'џ' => '&dzcy;',
+ ' ' => '&ensp;',
+ ' ' => '&emsp;',
+ ' ' => '&emsp13;',
+ ' ' => '&emsp14;',
+ ' ' => '&numsp;',
+ ' ' => '&puncsp;',
+ ' ' => '&ThinSpace;',
+ ' ' => '&hairsp;',
+ '​' => '&ZeroWidthSpace;',
+ '‌' => '&zwnj;',
+ '‍' => '&zwj;',
+ '‎' => '&lrm;',
+ '‏' => '&rlm;',
+ '‐' => '&hyphen;',
+ '–' => '&ndash;',
+ '—' => '&mdash;',
+ '―' => '&horbar;',
+ '‖' => '&Verbar;',
+ '‘' => '&OpenCurlyQuote;',
+ '’' => '&rsquo;',
+ '‚' => '&sbquo;',
+ '“' => '&OpenCurlyDoubleQuote;',
+ '”' => '&rdquo;',
+ '„' => '&bdquo;',
+ '†' => '&dagger;',
+ '‡' => '&Dagger;',
+ '•' => '&bull;',
+ '‥' => '&nldr;',
+ '…' => '&hellip;',
+ '‰' => '&permil;',
+ '‱' => '&pertenk;',
+ '′' => '&prime;',
+ '″' => '&Prime;',
+ '‴' => '&tprime;',
+ '‵' => '&backprime;',
+ '‹' => '&lsaquo;',
+ '›' => '&rsaquo;',
+ '‾' => '&oline;',
+ '⁁' => '&caret;',
+ '⁃' => '&hybull;',
+ '⁄' => '&frasl;',
+ '⁏' => '&bsemi;',
+ '⁗' => '&qprime;',
+ ' ' => '&MediumSpace;',
+ '  ' => '&ThickSpace',
+ '⁠' => '&NoBreak;',
+ '⁡' => '&af;',
+ '⁢' => '&InvisibleTimes;',
+ '⁣' => '&ic;',
+ '€' => '&euro;',
+ '⃛' => '&TripleDot;',
+ '⃜' => '&DotDot;',
+ 'ℂ' => '&complexes;',
+ '℅' => '&incare;',
+ 'ℊ' => '&gscr;',
+ 'ℋ' => '&HilbertSpace;',
+ 'ℌ' => '&Hfr;',
+ 'ℍ' => '&Hopf;',
+ 'ℎ' => '&planckh;',
+ 'ℏ' => '&planck;',
+ 'ℐ' => '&imagline;',
+ 'ℑ' => '&Ifr;',
+ 'ℒ' => '&lagran;',
+ 'ℓ' => '&ell;',
+ 'ℕ' => '&naturals;',
+ '№' => '&numero;',
+ '℗' => '&copysr;',
+ '℘' => '&wp;',
+ 'ℙ' => '&primes;',
+ 'ℚ' => '&rationals;',
+ 'ℛ' => '&realine;',
+ 'ℜ' => '&Rfr;',
+ 'ℝ' => '&Ropf;',
+ '℞' => '&rx;',
+ '™' => '&trade;',
+ 'ℤ' => '&Zopf;',
+ '℧' => '&mho;',
+ 'ℨ' => '&Zfr;',
+ '℩' => '&iiota;',
+ 'ℬ' => '&Bscr;',
+ 'ℭ' => '&Cfr;',
+ 'ℯ' => '&escr;',
+ 'ℰ' => '&expectation;',
+ 'ℱ' => '&Fouriertrf;',
+ 'ℳ' => '&Mellintrf;',
+ 'ℴ' => '&orderof;',
+ 'ℵ' => '&aleph;',
+ 'ℶ' => '&beth;',
+ 'ℷ' => '&gimel;',
+ 'ℸ' => '&daleth;',
+ 'ⅅ' => '&CapitalDifferentialD;',
+ 'ⅆ' => '&DifferentialD;',
+ 'ⅇ' => '&exponentiale;',
+ 'ⅈ' => '&ImaginaryI;',
+ '⅓' => '&frac13;',
+ '⅔' => '&frac23;',
+ '⅕' => '&frac15;',
+ '⅖' => '&frac25;',
+ '⅗' => '&frac35;',
+ '⅘' => '&frac45;',
+ '⅙' => '&frac16;',
+ '⅚' => '&frac56;',
+ '⅛' => '&frac18;',
+ '⅜' => '&frac38;',
+ '⅝' => '&frac58;',
+ '⅞' => '&frac78;',
+ '←' => '&larr;',
+ '↑' => '&uarr;',
+ '→' => '&srarr;',
+ '↓' => '&darr;',
+ '↔' => '&harr;',
+ '↕' => '&UpDownArrow;',
+ '↖' => '&nwarrow;',
+ '↗' => '&UpperRightArrow;',
+ '↘' => '&LowerRightArrow;',
+ '↙' => '&swarr;',
+ '↚' => '&nleftarrow;',
+ '↛' => '&nrarr;',
+ '↝' => '&rarrw;',
+ '↝̸' => '&nrarrw',
+ '↞' => '&Larr;',
+ '↟' => '&Uarr;',
+ '↠' => '&twoheadrightarrow;',
+ '↡' => '&Darr;',
+ '↢' => '&larrtl;',
+ '↣' => '&rarrtl;',
+ '↤' => '&LeftTeeArrow;',
+ '↥' => '&UpTeeArrow;',
+ '↦' => '&map;',
+ '↧' => '&DownTeeArrow;',
+ '↩' => '&larrhk;',
+ '↪' => '&rarrhk;',
+ '↫' => '&larrlp;',
+ '↬' => '&looparrowright;',
+ '↭' => '&harrw;',
+ '↮' => '&nleftrightarrow;',
+ '↰' => '&Lsh;',
+ '↱' => '&rsh;',
+ '↲' => '&ldsh;',
+ '↳' => '&rdsh;',
+ '↵' => '&crarr;',
+ '↶' => '&curvearrowleft;',
+ '↷' => '&curarr;',
+ '↺' => '&olarr;',
+ '↻' => '&orarr;',
+ '↼' => '&leftharpoonup;',
+ '↽' => '&leftharpoondown;',
+ '↾' => '&RightUpVector;',
+ '↿' => '&uharl;',
+ '⇀' => '&rharu;',
+ '⇁' => '&rhard;',
+ '⇂' => '&RightDownVector;',
+ '⇃' => '&dharl;',
+ '⇄' => '&rightleftarrows;',
+ '⇅' => '&udarr;',
+ '⇆' => '&lrarr;',
+ '⇇' => '&llarr;',
+ '⇈' => '&upuparrows;',
+ '⇉' => '&rrarr;',
+ '⇊' => '&downdownarrows;',
+ '⇋' => '&leftrightharpoons;',
+ '⇌' => '&rightleftharpoons;',
+ '⇍' => '&nLeftarrow;',
+ '⇎' => '&nhArr;',
+ '⇏' => '&nrArr;',
+ '⇐' => '&DoubleLeftArrow;',
+ '⇑' => '&DoubleUpArrow;',
+ '⇒' => '&Implies;',
+ '⇓' => '&Downarrow;',
+ '⇔' => '&hArr;',
+ '⇕' => '&Updownarrow;',
+ '⇖' => '&nwArr;',
+ '⇗' => '&neArr;',
+ '⇘' => '&seArr;',
+ '⇙' => '&swArr;',
+ '⇚' => '&lAarr;',
+ '⇛' => '&rAarr;',
+ '⇝' => '&zigrarr;',
+ '⇤' => '&LeftArrowBar;',
+ '⇥' => '&RightArrowBar;',
+ '⇵' => '&DownArrowUpArrow;',
+ '⇽' => '&loarr;',
+ '⇾' => '&roarr;',
+ '⇿' => '&hoarr;',
+ '∀' => '&forall;',
+ '∁' => '&comp;',
+ '∂' => '&part;',
+ '∂̸' => '&npart',
+ '∃' => '&Exists;',
+ '∄' => '&nexist;',
+ '∅' => '&empty;',
+ '∇' => '&nabla;',
+ '∈' => '&isinv;',
+ '∉' => '&notin;',
+ '∋' => '&ReverseElement;',
+ '∌' => '&notniva;',
+ '∏' => '&prod;',
+ '∐' => '&Coproduct;',
+ '∑' => '&sum;',
+ '−' => '&minus;',
+ '∓' => '&MinusPlus;',
+ '∔' => '&plusdo;',
+ '∖' => '&ssetmn;',
+ '∗' => '&lowast;',
+ '∘' => '&compfn;',
+ '√' => '&Sqrt;',
+ '∝' => '&prop;',
+ '∞' => '&infin;',
+ '∟' => '&angrt;',
+ '∠' => '&angle;',
+ '∠⃒' => '&nang',
+ '∡' => '&angmsd;',
+ '∢' => '&angsph;',
+ '∣' => '&mid;',
+ '∤' => '&nshortmid;',
+ '∥' => '&shortparallel;',
+ '∦' => '&nparallel;',
+ '∧' => '&and;',
+ '∨' => '&or;',
+ '∩' => '&cap;',
+ '∩︀' => '&caps',
+ '∪' => '&cup;',
+ '∪︀' => '&cups',
+ '∫' => '&Integral;',
+ '∬' => '&Int;',
+ '∭' => '&tint;',
+ '∮' => '&ContourIntegral;',
+ '∯' => '&DoubleContourIntegral;',
+ '∰' => '&Cconint;',
+ '∱' => '&cwint;',
+ '∲' => '&cwconint;',
+ '∳' => '&awconint;',
+ '∴' => '&there4;',
+ '∵' => '&Because;',
+ '∶' => '&ratio;',
+ '∷' => '&Colon;',
+ '∸' => '&minusd;',
+ '∺' => '&mDDot;',
+ '∻' => '&homtht;',
+ '∼' => '&sim;',
+ '∼⃒' => '&nvsim',
+ '∽' => '&bsim;',
+ '∽̱' => '&race',
+ '∾' => '&ac;',
+ '∾̳' => '&acE',
+ '∿' => '&acd;',
+ '≀' => '&wr;',
+ '≁' => '&NotTilde;',
+ '≂' => '&esim;',
+ '≂̸' => '&nesim',
+ '≃' => '&simeq;',
+ '≄' => '&nsime;',
+ '≅' => '&TildeFullEqual;',
+ '≆' => '&simne;',
+ '≇' => '&ncong;',
+ '≈' => '&approx;',
+ '≉' => '&napprox;',
+ '≊' => '&ape;',
+ '≋' => '&apid;',
+ '≋̸' => '&napid',
+ '≌' => '&bcong;',
+ '≍' => '&CupCap;',
+ '≍⃒' => '&nvap',
+ '≎' => '&bump;',
+ '≎̸' => '&nbump',
+ '≏' => '&HumpEqual;',
+ '≏̸' => '&nbumpe',
+ '≐' => '&esdot;',
+ '≐̸' => '&nedot',
+ '≑' => '&doteqdot;',
+ '≒' => '&fallingdotseq;',
+ '≓' => '&risingdotseq;',
+ '≔' => '&coloneq;',
+ '≕' => '&eqcolon;',
+ '≖' => '&ecir;',
+ '≗' => '&circeq;',
+ '≙' => '&wedgeq;',
+ '≚' => '&veeeq;',
+ '≜' => '&triangleq;',
+ '≟' => '&equest;',
+ '≠' => '&NotEqual;',
+ '≡' => '&Congruent;',
+ '≡⃥' => '&bnequiv',
+ '≢' => '&NotCongruent;',
+ '≤' => '&leq;',
+ '≤⃒' => '&nvle',
+ '≥' => '&ge;',
+ '≥⃒' => '&nvge',
+ '≦' => '&lE;',
+ '≦̸' => '&nlE',
+ '≧' => '&geqq;',
+ '≧̸' => '&NotGreaterFullEqual',
+ '≨' => '&lneqq;',
+ '≨︀' => '&lvertneqq',
+ '≩' => '&gneqq;',
+ '≩︀' => '&gvertneqq',
+ '≪' => '&ll;',
+ '≪̸' => '&nLtv',
+ '≪⃒' => '&nLt',
+ '≫' => '&gg;',
+ '≫̸' => '&NotGreaterGreater',
+ '≫⃒' => '&nGt',
+ '≬' => '&between;',
+ '≭' => '&NotCupCap;',
+ '≮' => '&NotLess;',
+ '≯' => '&ngtr;',
+ '≰' => '&NotLessEqual;',
+ '≱' => '&ngeq;',
+ '≲' => '&LessTilde;',
+ '≳' => '&GreaterTilde;',
+ '≴' => '&nlsim;',
+ '≵' => '&ngsim;',
+ '≶' => '&lessgtr;',
+ '≷' => '&gl;',
+ '≸' => '&ntlg;',
+ '≹' => '&NotGreaterLess;',
+ '≺' => '&prec;',
+ '≻' => '&succ;',
+ '≼' => '&PrecedesSlantEqual;',
+ '≽' => '&succcurlyeq;',
+ '≾' => '&precsim;',
+ '≿' => '&SucceedsTilde;',
+ '≿̸' => '&NotSucceedsTilde',
+ '⊀' => '&npr;',
+ '⊁' => '&NotSucceeds;',
+ '⊂' => '&sub;',
+ '⊂⃒' => '&vnsub',
+ '⊃' => '&sup;',
+ '⊃⃒' => '&nsupset',
+ '⊄' => '&nsub;',
+ '⊅' => '&nsup;',
+ '⊆' => '&SubsetEqual;',
+ '⊇' => '&supe;',
+ '⊈' => '&NotSubsetEqual;',
+ '⊉' => '&NotSupersetEqual;',
+ '⊊' => '&subsetneq;',
+ '⊊︀' => '&vsubne',
+ '⊋' => '&supsetneq;',
+ '⊋︀' => '&vsupne',
+ '⊍' => '&cupdot;',
+ '⊎' => '&UnionPlus;',
+ '⊏' => '&sqsub;',
+ '⊏̸' => '&NotSquareSubset',
+ '⊐' => '&sqsupset;',
+ '⊐̸' => '&NotSquareSuperset',
+ '⊑' => '&SquareSubsetEqual;',
+ '⊒' => '&SquareSupersetEqual;',
+ '⊓' => '&sqcap;',
+ '⊓︀' => '&sqcaps',
+ '⊔' => '&sqcup;',
+ '⊔︀' => '&sqcups',
+ '⊕' => '&CirclePlus;',
+ '⊖' => '&ominus;',
+ '⊗' => '&CircleTimes;',
+ '⊘' => '&osol;',
+ '⊙' => '&CircleDot;',
+ '⊚' => '&ocir;',
+ '⊛' => '&oast;',
+ '⊝' => '&odash;',
+ '⊞' => '&boxplus;',
+ '⊟' => '&boxminus;',
+ '⊠' => '&timesb;',
+ '⊡' => '&sdotb;',
+ '⊢' => '&vdash;',
+ '⊣' => '&dashv;',
+ '⊤' => '&DownTee;',
+ '⊥' => '&perp;',
+ '⊧' => '&models;',
+ '⊨' => '&DoubleRightTee;',
+ '⊩' => '&Vdash;',
+ '⊪' => '&Vvdash;',
+ '⊫' => '&VDash;',
+ '⊬' => '&nvdash;',
+ '⊭' => '&nvDash;',
+ '⊮' => '&nVdash;',
+ '⊯' => '&nVDash;',
+ '⊰' => '&prurel;',
+ '⊲' => '&vartriangleleft;',
+ '⊳' => '&vrtri;',
+ '⊴' => '&LeftTriangleEqual;',
+ '⊴⃒' => '&nvltrie',
+ '⊵' => '&RightTriangleEqual;',
+ '⊵⃒' => '&nvrtrie',
+ '⊶' => '&origof;',
+ '⊷' => '&imof;',
+ '⊸' => '&mumap;',
+ '⊹' => '&hercon;',
+ '⊺' => '&intcal;',
+ '⊻' => '&veebar;',
+ '⊽' => '&barvee;',
+ '⊾' => '&angrtvb;',
+ '⊿' => '&lrtri;',
+ '⋀' => '&xwedge;',
+ '⋁' => '&xvee;',
+ '⋂' => '&bigcap;',
+ '⋃' => '&bigcup;',
+ '⋄' => '&diamond;',
+ '⋅' => '&sdot;',
+ '⋆' => '&Star;',
+ '⋇' => '&divonx;',
+ '⋈' => '&bowtie;',
+ '⋉' => '&ltimes;',
+ '⋊' => '&rtimes;',
+ '⋋' => '&lthree;',
+ '⋌' => '&rthree;',
+ '⋍' => '&backsimeq;',
+ '⋎' => '&curlyvee;',
+ '⋏' => '&curlywedge;',
+ '⋐' => '&Sub;',
+ '⋑' => '&Supset;',
+ '⋒' => '&Cap;',
+ '⋓' => '&Cup;',
+ '⋔' => '&pitchfork;',
+ '⋕' => '&epar;',
+ '⋖' => '&lessdot;',
+ '⋗' => '&gtrdot;',
+ '⋘' => '&Ll;',
+ '⋘̸' => '&nLl',
+ '⋙' => '&Gg;',
+ '⋙̸' => '&nGg',
+ '⋚' => '&lesseqgtr;',
+ '⋚︀' => '&lesg',
+ '⋛' => '&gtreqless;',
+ '⋛︀' => '&gesl',
+ '⋞' => '&curlyeqprec;',
+ '⋟' => '&cuesc;',
+ '⋠' => '&NotPrecedesSlantEqual;',
+ '⋡' => '&NotSucceedsSlantEqual;',
+ '⋢' => '&NotSquareSubsetEqual;',
+ '⋣' => '&NotSquareSupersetEqual;',
+ '⋦' => '&lnsim;',
+ '⋧' => '&gnsim;',
+ '⋨' => '&precnsim;',
+ '⋩' => '&scnsim;',
+ '⋪' => '&nltri;',
+ '⋫' => '&ntriangleright;',
+ '⋬' => '&nltrie;',
+ '⋭' => '&NotRightTriangleEqual;',
+ '⋮' => '&vellip;',
+ '⋯' => '&ctdot;',
+ '⋰' => '&utdot;',
+ '⋱' => '&dtdot;',
+ '⋲' => '&disin;',
+ '⋳' => '&isinsv;',
+ '⋴' => '&isins;',
+ '⋵' => '&isindot;',
+ '⋵̸' => '&notindot',
+ '⋶' => '&notinvc;',
+ '⋷' => '&notinvb;',
+ '⋹' => '&isinE;',
+ '⋹̸' => '&notinE',
+ '⋺' => '&nisd;',
+ '⋻' => '&xnis;',
+ '⋼' => '&nis;',
+ '⋽' => '&notnivc;',
+ '⋾' => '&notnivb;',
+ '⌅' => '&barwed;',
+ '⌆' => '&doublebarwedge;',
+ '⌈' => '&lceil;',
+ '⌉' => '&RightCeiling;',
+ '⌊' => '&LeftFloor;',
+ '⌋' => '&RightFloor;',
+ '⌌' => '&drcrop;',
+ '⌍' => '&dlcrop;',
+ '⌎' => '&urcrop;',
+ '⌏' => '&ulcrop;',
+ '⌐' => '&bnot;',
+ '⌒' => '&profline;',
+ '⌓' => '&profsurf;',
+ '⌕' => '&telrec;',
+ '⌖' => '&target;',
+ '⌜' => '&ulcorner;',
+ '⌝' => '&urcorner;',
+ '⌞' => '&llcorner;',
+ '⌟' => '&drcorn;',
+ '⌢' => '&frown;',
+ '⌣' => '&smile;',
+ '⌭' => '&cylcty;',
+ '⌮' => '&profalar;',
+ '⌶' => '&topbot;',
+ '⌽' => '&ovbar;',
+ '⌿' => '&solbar;',
+ '⍼' => '&angzarr;',
+ '⎰' => '&lmoust;',
+ '⎱' => '&rmoust;',
+ '⎴' => '&OverBracket;',
+ '⎵' => '&bbrk;',
+ '⎶' => '&bbrktbrk;',
+ '⏜' => '&OverParenthesis;',
+ '⏝' => '&UnderParenthesis;',
+ '⏞' => '&OverBrace;',
+ '⏟' => '&UnderBrace;',
+ '⏢' => '&trpezium;',
+ '⏧' => '&elinters;',
+ '␣' => '&blank;',
+ 'Ⓢ' => '&oS;',
+ '─' => '&HorizontalLine;',
+ '│' => '&boxv;',
+ '┌' => '&boxdr;',
+ '┐' => '&boxdl;',
+ '└' => '&boxur;',
+ '┘' => '&boxul;',
+ '├' => '&boxvr;',
+ '┤' => '&boxvl;',
+ '┬' => '&boxhd;',
+ '┴' => '&boxhu;',
+ '┼' => '&boxvh;',
+ '═' => '&boxH;',
+ '║' => '&boxV;',
+ '╒' => '&boxdR;',
+ '╓' => '&boxDr;',
+ '╔' => '&boxDR;',
+ '╕' => '&boxdL;',
+ '╖' => '&boxDl;',
+ '╗' => '&boxDL;',
+ '╘' => '&boxuR;',
+ '╙' => '&boxUr;',
+ '╚' => '&boxUR;',
+ '╛' => '&boxuL;',
+ '╜' => '&boxUl;',
+ '╝' => '&boxUL;',
+ '╞' => '&boxvR;',
+ '╟' => '&boxVr;',
+ '╠' => '&boxVR;',
+ '╡' => '&boxvL;',
+ '╢' => '&boxVl;',
+ '╣' => '&boxVL;',
+ '╤' => '&boxHd;',
+ '╥' => '&boxhD;',
+ '╦' => '&boxHD;',
+ '╧' => '&boxHu;',
+ '╨' => '&boxhU;',
+ '╩' => '&boxHU;',
+ '╪' => '&boxvH;',
+ '╫' => '&boxVh;',
+ '╬' => '&boxVH;',
+ '▀' => '&uhblk;',
+ '▄' => '&lhblk;',
+ '█' => '&block;',
+ '░' => '&blk14;',
+ '▒' => '&blk12;',
+ '▓' => '&blk34;',
+ '□' => '&Square;',
+ '▪' => '&squarf;',
+ '▫' => '&EmptyVerySmallSquare;',
+ '▭' => '&rect;',
+ '▮' => '&marker;',
+ '▱' => '&fltns;',
+ '△' => '&bigtriangleup;',
+ '▴' => '&blacktriangle;',
+ '▵' => '&triangle;',
+ '▸' => '&blacktriangleright;',
+ '▹' => '&rtri;',
+ '▽' => '&bigtriangledown;',
+ '▾' => '&blacktriangledown;',
+ '▿' => '&triangledown;',
+ '◂' => '&blacktriangleleft;',
+ '◃' => '&ltri;',
+ '◊' => '&lozenge;',
+ '○' => '&cir;',
+ '◬' => '&tridot;',
+ '◯' => '&bigcirc;',
+ '◸' => '&ultri;',
+ '◹' => '&urtri;',
+ '◺' => '&lltri;',
+ '◻' => '&EmptySmallSquare;',
+ '◼' => '&FilledSmallSquare;',
+ '★' => '&starf;',
+ '☆' => '&star;',
+ '☎' => '&phone;',
+ '♀' => '&female;',
+ '♂' => '&male;',
+ '♠' => '&spadesuit;',
+ '♣' => '&clubs;',
+ '♥' => '&hearts;',
+ '♦' => '&diamondsuit;',
+ '♪' => '&sung;',
+ '♭' => '&flat;',
+ '♮' => '&natur;',
+ '♯' => '&sharp;',
+ '✓' => '&check;',
+ '✗' => '&cross;',
+ '✠' => '&maltese;',
+ '✶' => '&sext;',
+ '❘' => '&VerticalSeparator;',
+ '❲' => '&lbbrk;',
+ '❳' => '&rbbrk;',
+ '⟈' => '&bsolhsub;',
+ '⟉' => '&suphsol;',
+ '⟦' => '&LeftDoubleBracket;',
+ '⟧' => '&RightDoubleBracket;',
+ '⟨' => '&langle;',
+ '⟩' => '&RightAngleBracket;',
+ '⟪' => '&Lang;',
+ '⟫' => '&Rang;',
+ '⟬' => '&loang;',
+ '⟭' => '&roang;',
+ '⟵' => '&longleftarrow;',
+ '⟶' => '&LongRightArrow;',
+ '⟷' => '&LongLeftRightArrow;',
+ '⟸' => '&xlArr;',
+ '⟹' => '&DoubleLongRightArrow;',
+ '⟺' => '&xhArr;',
+ '⟼' => '&xmap;',
+ '⟿' => '&dzigrarr;',
+ '⤂' => '&nvlArr;',
+ '⤃' => '&nvrArr;',
+ '⤄' => '&nvHarr;',
+ '⤅' => '&Map;',
+ '⤌' => '&lbarr;',
+ '⤍' => '&bkarow;',
+ '⤎' => '&lBarr;',
+ '⤏' => '&dbkarow;',
+ '⤐' => '&drbkarow;',
+ '⤑' => '&DDotrahd;',
+ '⤒' => '&UpArrowBar;',
+ '⤓' => '&DownArrowBar;',
+ '⤖' => '&Rarrtl;',
+ '⤙' => '&latail;',
+ '⤚' => '&ratail;',
+ '⤛' => '&lAtail;',
+ '⤜' => '&rAtail;',
+ '⤝' => '&larrfs;',
+ '⤞' => '&rarrfs;',
+ '⤟' => '&larrbfs;',
+ '⤠' => '&rarrbfs;',
+ '⤣' => '&nwarhk;',
+ '⤤' => '&nearhk;',
+ '⤥' => '&searhk;',
+ '⤦' => '&swarhk;',
+ '⤧' => '&nwnear;',
+ '⤨' => '&toea;',
+ '⤩' => '&seswar;',
+ '⤪' => '&swnwar;',
+ '⤳' => '&rarrc;',
+ '⤳̸' => '&nrarrc',
+ '⤵' => '&cudarrr;',
+ '⤶' => '&ldca;',
+ '⤷' => '&rdca;',
+ '⤸' => '&cudarrl;',
+ '⤹' => '&larrpl;',
+ '⤼' => '&curarrm;',
+ '⤽' => '&cularrp;',
+ '⥅' => '&rarrpl;',
+ '⥈' => '&harrcir;',
+ '⥉' => '&Uarrocir;',
+ '⥊' => '&lurdshar;',
+ '⥋' => '&ldrushar;',
+ '⥎' => '&LeftRightVector;',
+ '⥏' => '&RightUpDownVector;',
+ '⥐' => '&DownLeftRightVector;',
+ '⥑' => '&LeftUpDownVector;',
+ '⥒' => '&LeftVectorBar;',
+ '⥓' => '&RightVectorBar;',
+ '⥔' => '&RightUpVectorBar;',
+ '⥕' => '&RightDownVectorBar;',
+ '⥖' => '&DownLeftVectorBar;',
+ '⥗' => '&DownRightVectorBar;',
+ '⥘' => '&LeftUpVectorBar;',
+ '⥙' => '&LeftDownVectorBar;',
+ '⥚' => '&LeftTeeVector;',
+ '⥛' => '&RightTeeVector;',
+ '⥜' => '&RightUpTeeVector;',
+ '⥝' => '&RightDownTeeVector;',
+ '⥞' => '&DownLeftTeeVector;',
+ '⥟' => '&DownRightTeeVector;',
+ '⥠' => '&LeftUpTeeVector;',
+ '⥡' => '&LeftDownTeeVector;',
+ '⥢' => '&lHar;',
+ '⥣' => '&uHar;',
+ '⥤' => '&rHar;',
+ '⥥' => '&dHar;',
+ '⥦' => '&luruhar;',
+ '⥧' => '&ldrdhar;',
+ '⥨' => '&ruluhar;',
+ '⥩' => '&rdldhar;',
+ '⥪' => '&lharul;',
+ '⥫' => '&llhard;',
+ '⥬' => '&rharul;',
+ '⥭' => '&lrhard;',
+ '⥮' => '&udhar;',
+ '⥯' => '&ReverseUpEquilibrium;',
+ '⥰' => '&RoundImplies;',
+ '⥱' => '&erarr;',
+ '⥲' => '&simrarr;',
+ '⥳' => '&larrsim;',
+ '⥴' => '&rarrsim;',
+ '⥵' => '&rarrap;',
+ '⥶' => '&ltlarr;',
+ '⥸' => '&gtrarr;',
+ '⥹' => '&subrarr;',
+ '⥻' => '&suplarr;',
+ '⥼' => '&lfisht;',
+ '⥽' => '&rfisht;',
+ '⥾' => '&ufisht;',
+ '⥿' => '&dfisht;',
+ '⦅' => '&lopar;',
+ '⦆' => '&ropar;',
+ '⦋' => '&lbrke;',
+ '⦌' => '&rbrke;',
+ '⦍' => '&lbrkslu;',
+ '⦎' => '&rbrksld;',
+ '⦏' => '&lbrksld;',
+ '⦐' => '&rbrkslu;',
+ '⦑' => '&langd;',
+ '⦒' => '&rangd;',
+ '⦓' => '&lparlt;',
+ '⦔' => '&rpargt;',
+ '⦕' => '&gtlPar;',
+ '⦖' => '&ltrPar;',
+ '⦚' => '&vzigzag;',
+ '⦜' => '&vangrt;',
+ '⦝' => '&angrtvbd;',
+ '⦤' => '&ange;',
+ '⦥' => '&range;',
+ '⦦' => '&dwangle;',
+ '⦧' => '&uwangle;',
+ '⦨' => '&angmsdaa;',
+ '⦩' => '&angmsdab;',
+ '⦪' => '&angmsdac;',
+ '⦫' => '&angmsdad;',
+ '⦬' => '&angmsdae;',
+ '⦭' => '&angmsdaf;',
+ '⦮' => '&angmsdag;',
+ '⦯' => '&angmsdah;',
+ '⦰' => '&bemptyv;',
+ '⦱' => '&demptyv;',
+ '⦲' => '&cemptyv;',
+ '⦳' => '&raemptyv;',
+ '⦴' => '&laemptyv;',
+ '⦵' => '&ohbar;',
+ '⦶' => '&omid;',
+ '⦷' => '&opar;',
+ '⦹' => '&operp;',
+ '⦻' => '&olcross;',
+ '⦼' => '&odsold;',
+ '⦾' => '&olcir;',
+ '⦿' => '&ofcir;',
+ '⧀' => '&olt;',
+ '⧁' => '&ogt;',
+ '⧂' => '&cirscir;',
+ '⧃' => '&cirE;',
+ '⧄' => '&solb;',
+ '⧅' => '&bsolb;',
+ '⧉' => '&boxbox;',
+ '⧍' => '&trisb;',
+ '⧎' => '&rtriltri;',
+ '⧏' => '&LeftTriangleBar;',
+ '⧏̸' => '&NotLeftTriangleBar',
+ '⧐' => '&RightTriangleBar;',
+ '⧐̸' => '&NotRightTriangleBar',
+ '⧜' => '&iinfin;',
+ '⧝' => '&infintie;',
+ '⧞' => '&nvinfin;',
+ '⧣' => '&eparsl;',
+ '⧤' => '&smeparsl;',
+ '⧥' => '&eqvparsl;',
+ '⧫' => '&lozf;',
+ '⧴' => '&RuleDelayed;',
+ '⧶' => '&dsol;',
+ '⨀' => '&xodot;',
+ '⨁' => '&bigoplus;',
+ '⨂' => '&bigotimes;',
+ '⨄' => '&biguplus;',
+ '⨆' => '&bigsqcup;',
+ '⨌' => '&iiiint;',
+ '⨍' => '&fpartint;',
+ '⨐' => '&cirfnint;',
+ '⨑' => '&awint;',
+ '⨒' => '&rppolint;',
+ '⨓' => '&scpolint;',
+ '⨔' => '&npolint;',
+ '⨕' => '&pointint;',
+ '⨖' => '&quatint;',
+ '⨗' => '&intlarhk;',
+ '⨢' => '&pluscir;',
+ '⨣' => '&plusacir;',
+ '⨤' => '&simplus;',
+ '⨥' => '&plusdu;',
+ '⨦' => '&plussim;',
+ '⨧' => '&plustwo;',
+ '⨩' => '&mcomma;',
+ '⨪' => '&minusdu;',
+ '⨭' => '&loplus;',
+ '⨮' => '&roplus;',
+ '⨯' => '&Cross;',
+ '⨰' => '&timesd;',
+ '⨱' => '&timesbar;',
+ '⨳' => '&smashp;',
+ '⨴' => '&lotimes;',
+ '⨵' => '&rotimes;',
+ '⨶' => '&otimesas;',
+ '⨷' => '&Otimes;',
+ '⨸' => '&odiv;',
+ '⨹' => '&triplus;',
+ '⨺' => '&triminus;',
+ '⨻' => '&tritime;',
+ '⨼' => '&iprod;',
+ '⨿' => '&amalg;',
+ '⩀' => '&capdot;',
+ '⩂' => '&ncup;',
+ '⩃' => '&ncap;',
+ '⩄' => '&capand;',
+ '⩅' => '&cupor;',
+ '⩆' => '&cupcap;',
+ '⩇' => '&capcup;',
+ '⩈' => '&cupbrcap;',
+ '⩉' => '&capbrcup;',
+ '⩊' => '&cupcup;',
+ '⩋' => '&capcap;',
+ '⩌' => '&ccups;',
+ '⩍' => '&ccaps;',
+ '⩐' => '&ccupssm;',
+ '⩓' => '&And;',
+ '⩔' => '&Or;',
+ '⩕' => '&andand;',
+ '⩖' => '&oror;',
+ '⩗' => '&orslope;',
+ '⩘' => '&andslope;',
+ '⩚' => '&andv;',
+ '⩛' => '&orv;',
+ '⩜' => '&andd;',
+ '⩝' => '&ord;',
+ '⩟' => '&wedbar;',
+ '⩦' => '&sdote;',
+ '⩪' => '&simdot;',
+ '⩭' => '&congdot;',
+ '⩭̸' => '&ncongdot',
+ '⩮' => '&easter;',
+ '⩯' => '&apacir;',
+ '⩰' => '&apE;',
+ '⩰̸' => '&napE',
+ '⩱' => '&eplus;',
+ '⩲' => '&pluse;',
+ '⩳' => '&Esim;',
+ '⩴' => '&Colone;',
+ '⩵' => '&Equal;',
+ '⩷' => '&ddotseq;',
+ '⩸' => '&equivDD;',
+ '⩹' => '&ltcir;',
+ '⩺' => '&gtcir;',
+ '⩻' => '&ltquest;',
+ '⩼' => '&gtquest;',
+ '⩽' => '&les;',
+ '⩽̸' => '&nles',
+ '⩾' => '&ges;',
+ '⩾̸' => '&nges',
+ '⩿' => '&lesdot;',
+ '⪀' => '&gesdot;',
+ '⪁' => '&lesdoto;',
+ '⪂' => '&gesdoto;',
+ '⪃' => '&lesdotor;',
+ '⪄' => '&gesdotol;',
+ '⪅' => '&lap;',
+ '⪆' => '&gap;',
+ '⪇' => '&lne;',
+ '⪈' => '&gne;',
+ '⪉' => '&lnap;',
+ '⪊' => '&gnap;',
+ '⪋' => '&lesseqqgtr;',
+ '⪌' => '&gEl;',
+ '⪍' => '&lsime;',
+ '⪎' => '&gsime;',
+ '⪏' => '&lsimg;',
+ '⪐' => '&gsiml;',
+ '⪑' => '&lgE;',
+ '⪒' => '&glE;',
+ '⪓' => '&lesges;',
+ '⪔' => '&gesles;',
+ '⪕' => '&els;',
+ '⪖' => '&egs;',
+ '⪗' => '&elsdot;',
+ '⪘' => '&egsdot;',
+ '⪙' => '&el;',
+ '⪚' => '&eg;',
+ '⪝' => '&siml;',
+ '⪞' => '&simg;',
+ '⪟' => '&simlE;',
+ '⪠' => '&simgE;',
+ '⪡' => '&LessLess;',
+ '⪡̸' => '&NotNestedLessLess',
+ '⪢' => '&GreaterGreater;',
+ '⪢̸' => '&NotNestedGreaterGreater',
+ '⪤' => '&glj;',
+ '⪥' => '&gla;',
+ '⪦' => '&ltcc;',
+ '⪧' => '&gtcc;',
+ '⪨' => '&lescc;',
+ '⪩' => '&gescc;',
+ '⪪' => '&smt;',
+ '⪫' => '&lat;',
+ '⪬' => '&smte;',
+ '⪬︀' => '&smtes',
+ '⪭' => '&late;',
+ '⪭︀' => '&lates',
+ '⪮' => '&bumpE;',
+ '⪯' => '&preceq;',
+ '⪯̸' => '&NotPrecedesEqual',
+ '⪰' => '&SucceedsEqual;',
+ '⪰̸' => '&NotSucceedsEqual',
+ '⪳' => '&prE;',
+ '⪴' => '&scE;',
+ '⪵' => '&precneqq;',
+ '⪶' => '&scnE;',
+ '⪷' => '&precapprox;',
+ '⪸' => '&succapprox;',
+ '⪹' => '&precnapprox;',
+ '⪺' => '&succnapprox;',
+ '⪻' => '&Pr;',
+ '⪼' => '&Sc;',
+ '⪽' => '&subdot;',
+ '⪾' => '&supdot;',
+ '⪿' => '&subplus;',
+ '⫀' => '&supplus;',
+ '⫁' => '&submult;',
+ '⫂' => '&supmult;',
+ '⫃' => '&subedot;',
+ '⫄' => '&supedot;',
+ '⫅' => '&subE;',
+ '⫅̸' => '&nsubE',
+ '⫆' => '&supseteqq;',
+ '⫆̸' => '&nsupseteqq',
+ '⫇' => '&subsim;',
+ '⫈' => '&supsim;',
+ '⫋' => '&subsetneqq;',
+ '⫋︀' => '&vsubnE',
+ '⫌' => '&supnE;',
+ '⫌︀' => '&varsupsetneqq',
+ '⫏' => '&csub;',
+ '⫐' => '&csup;',
+ '⫑' => '&csube;',
+ '⫒' => '&csupe;',
+ '⫓' => '&subsup;',
+ '⫔' => '&supsub;',
+ '⫕' => '&subsub;',
+ '⫖' => '&supsup;',
+ '⫗' => '&suphsub;',
+ '⫘' => '&supdsub;',
+ '⫙' => '&forkv;',
+ '⫚' => '&topfork;',
+ '⫛' => '&mlcp;',
+ '⫤' => '&Dashv;',
+ '⫦' => '&Vdashl;',
+ '⫧' => '&Barv;',
+ '⫨' => '&vBar;',
+ '⫩' => '&vBarv;',
+ '⫫' => '&Vbar;',
+ '⫬' => '&Not;',
+ '⫭' => '&bNot;',
+ '⫮' => '&rnmid;',
+ '⫯' => '&cirmid;',
+ '⫰' => '&midcir;',
+ '⫱' => '&topcir;',
+ '⫲' => '&nhpar;',
+ '⫳' => '&parsim;',
+ '⫽︀' => '&varsupsetneqq',
+ 'ff' => '&fflig;',
+ 'fi' => '&filig;',
+ 'fl' => '&fllig;',
+ 'ffi' => '&ffilig;',
+ 'ffl' => '&ffllig;',
+ '𝒜' => '&Ascr;',
+ '𝒞' => '&Cscr;',
+ '𝒟' => '&Dscr;',
+ '𝒢' => '&Gscr;',
+ '𝒥' => '&Jscr;',
+ '𝒦' => '&Kscr;',
+ '𝒩' => '&Nscr;',
+ '𝒪' => '&Oscr;',
+ '𝒫' => '&Pscr;',
+ '𝒬' => '&Qscr;',
+ '𝒮' => '&Sscr;',
+ '𝒯' => '&Tscr;',
+ '𝒰' => '&Uscr;',
+ '𝒱' => '&Vscr;',
+ '𝒲' => '&Wscr;',
+ '𝒳' => '&Xscr;',
+ '𝒴' => '&Yscr;',
+ '𝒵' => '&Zscr;',
+ '𝒶' => '&ascr;',
+ '𝒷' => '&bscr;',
+ '𝒸' => '&cscr;',
+ '𝒹' => '&dscr;',
+ '𝒻' => '&fscr;',
+ '𝒽' => '&hscr;',
+ '𝒾' => '&iscr;',
+ '𝒿' => '&jscr;',
+ '𝓀' => '&kscr;',
+ '𝓁' => '&lscr;',
+ '𝓂' => '&mscr;',
+ '𝓃' => '&nscr;',
+ '𝓅' => '&pscr;',
+ '𝓆' => '&qscr;',
+ '𝓇' => '&rscr;',
+ '𝓈' => '&sscr;',
+ '𝓉' => '&tscr;',
+ '𝓊' => '&uscr;',
+ '𝓋' => '&vscr;',
+ '𝓌' => '&wscr;',
+ '𝓍' => '&xscr;',
+ '𝓎' => '&yscr;',
+ '𝓏' => '&zscr;',
+ '𝔄' => '&Afr;',
+ '𝔅' => '&Bfr;',
+ '𝔇' => '&Dfr;',
+ '𝔈' => '&Efr;',
+ '𝔉' => '&Ffr;',
+ '𝔊' => '&Gfr;',
+ '𝔍' => '&Jfr;',
+ '𝔎' => '&Kfr;',
+ '𝔏' => '&Lfr;',
+ '𝔐' => '&Mfr;',
+ '𝔑' => '&Nfr;',
+ '𝔒' => '&Ofr;',
+ '𝔓' => '&Pfr;',
+ '𝔔' => '&Qfr;',
+ '𝔖' => '&Sfr;',
+ '𝔗' => '&Tfr;',
+ '𝔘' => '&Ufr;',
+ '𝔙' => '&Vfr;',
+ '𝔚' => '&Wfr;',
+ '𝔛' => '&Xfr;',
+ '𝔜' => '&Yfr;',
+ '𝔞' => '&afr;',
+ '𝔟' => '&bfr;',
+ '𝔠' => '&cfr;',
+ '𝔡' => '&dfr;',
+ '𝔢' => '&efr;',
+ '𝔣' => '&ffr;',
+ '𝔤' => '&gfr;',
+ '𝔥' => '&hfr;',
+ '𝔦' => '&ifr;',
+ '𝔧' => '&jfr;',
+ '𝔨' => '&kfr;',
+ '𝔩' => '&lfr;',
+ '𝔪' => '&mfr;',
+ '𝔫' => '&nfr;',
+ '𝔬' => '&ofr;',
+ '𝔭' => '&pfr;',
+ '𝔮' => '&qfr;',
+ '𝔯' => '&rfr;',
+ '𝔰' => '&sfr;',
+ '𝔱' => '&tfr;',
+ '𝔲' => '&ufr;',
+ '𝔳' => '&vfr;',
+ '𝔴' => '&wfr;',
+ '𝔵' => '&xfr;',
+ '𝔶' => '&yfr;',
+ '𝔷' => '&zfr;',
+ '𝔸' => '&Aopf;',
+ '𝔹' => '&Bopf;',
+ '𝔻' => '&Dopf;',
+ '𝔼' => '&Eopf;',
+ '𝔽' => '&Fopf;',
+ '𝔾' => '&Gopf;',
+ '𝕀' => '&Iopf;',
+ '𝕁' => '&Jopf;',
+ '𝕂' => '&Kopf;',
+ '𝕃' => '&Lopf;',
+ '𝕄' => '&Mopf;',
+ '𝕆' => '&Oopf;',
+ '𝕊' => '&Sopf;',
+ '𝕋' => '&Topf;',
+ '𝕌' => '&Uopf;',
+ '𝕍' => '&Vopf;',
+ '𝕎' => '&Wopf;',
+ '𝕏' => '&Xopf;',
+ '𝕐' => '&Yopf;',
+ '𝕒' => '&aopf;',
+ '𝕓' => '&bopf;',
+ '𝕔' => '&copf;',
+ '𝕕' => '&dopf;',
+ '𝕖' => '&eopf;',
+ '𝕗' => '&fopf;',
+ '𝕘' => '&gopf;',
+ '𝕙' => '&hopf;',
+ '𝕚' => '&iopf;',
+ '𝕛' => '&jopf;',
+ '𝕜' => '&kopf;',
+ '𝕝' => '&lopf;',
+ '𝕞' => '&mopf;',
+ '𝕟' => '&nopf;',
+ '𝕠' => '&oopf;',
+ '𝕡' => '&popf;',
+ '𝕢' => '&qopf;',
+ '𝕣' => '&ropf;',
+ '𝕤' => '&sopf;',
+ '𝕥' => '&topf;',
+ '𝕦' => '&uopf;',
+ '𝕧' => '&vopf;',
+ '𝕨' => '&wopf;',
+ '𝕩' => '&xopf;',
+ '𝕪' => '&yopf;',
+ '𝕫' => '&zopf;',
+ );
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php
new file mode 100644
index 000000000..ec467f22c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php
@@ -0,0 +1,553 @@
+<?php
+/**
+ * @file
+ * The rules for generating output in the serializer.
+ *
+ * These output rules are likely to generate output similar to the document that
+ * was parsed. It is not intended to output exactly the document that was parsed.
+ */
+
+namespace Masterminds\HTML5\Serializer;
+
+use Masterminds\HTML5\Elements;
+
+/**
+ * Generate the output html5 based on element rules.
+ */
+class OutputRules implements RulesInterface
+{
+ /**
+ * Defined in http://www.w3.org/TR/html51/infrastructure.html#html-namespace-0.
+ */
+ const NAMESPACE_HTML = 'http://www.w3.org/1999/xhtml';
+
+ const NAMESPACE_MATHML = 'http://www.w3.org/1998/Math/MathML';
+
+ const NAMESPACE_SVG = 'http://www.w3.org/2000/svg';
+
+ const NAMESPACE_XLINK = 'http://www.w3.org/1999/xlink';
+
+ const NAMESPACE_XML = 'http://www.w3.org/XML/1998/namespace';
+
+ const NAMESPACE_XMLNS = 'http://www.w3.org/2000/xmlns/';
+
+ /**
+ * Holds the HTML5 element names that causes a namespace switch.
+ *
+ * @var array
+ */
+ protected $implicitNamespaces = array(
+ self::NAMESPACE_HTML,
+ self::NAMESPACE_SVG,
+ self::NAMESPACE_MATHML,
+ self::NAMESPACE_XML,
+ self::NAMESPACE_XMLNS,
+ );
+
+ const IM_IN_HTML = 1;
+
+ const IM_IN_SVG = 2;
+
+ const IM_IN_MATHML = 3;
+
+ /**
+ * Used as cache to detect if is available ENT_HTML5.
+ *
+ * @var bool
+ */
+ private $hasHTML5 = false;
+
+ protected $traverser;
+
+ protected $encode = false;
+
+ protected $out;
+
+ protected $outputMode;
+
+ private $xpath;
+
+ protected $nonBooleanAttributes = array(
+ /*
+ array(
+ 'nodeNamespace'=>'http://www.w3.org/1999/xhtml',
+ 'attrNamespace'=>'http://www.w3.org/1999/xhtml',
+
+ 'nodeName'=>'img', 'nodeName'=>array('img', 'a'),
+ 'attrName'=>'alt', 'attrName'=>array('title', 'alt'),
+ ),
+ */
+ array(
+ 'nodeNamespace' => 'http://www.w3.org/1999/xhtml',
+ 'attrName' => array('href',
+ 'hreflang',
+ 'http-equiv',
+ 'icon',
+ 'id',
+ 'keytype',
+ 'kind',
+ 'label',
+ 'lang',
+ 'language',
+ 'list',
+ 'maxlength',
+ 'media',
+ 'method',
+ 'name',
+ 'placeholder',
+ 'rel',
+ 'rows',
+ 'rowspan',
+ 'sandbox',
+ 'spellcheck',
+ 'scope',
+ 'seamless',
+ 'shape',
+ 'size',
+ 'sizes',
+ 'span',
+ 'src',
+ 'srcdoc',
+ 'srclang',
+ 'srcset',
+ 'start',
+ 'step',
+ 'style',
+ 'summary',
+ 'tabindex',
+ 'target',
+ 'title',
+ 'type',
+ 'value',
+ 'width',
+ 'border',
+ 'charset',
+ 'cite',
+ 'class',
+ 'code',
+ 'codebase',
+ 'color',
+ 'cols',
+ 'colspan',
+ 'content',
+ 'coords',
+ 'data',
+ 'datetime',
+ 'default',
+ 'dir',
+ 'dirname',
+ 'enctype',
+ 'for',
+ 'form',
+ 'formaction',
+ 'headers',
+ 'height',
+ 'accept',
+ 'accept-charset',
+ 'accesskey',
+ 'action',
+ 'align',
+ 'alt',
+ 'bgcolor',
+ ),
+ ),
+ array(
+ 'nodeNamespace' => 'http://www.w3.org/1999/xhtml',
+ 'xpath' => 'starts-with(local-name(), \'data-\')',
+ ),
+ );
+
+ const DOCTYPE = '<!DOCTYPE html>';
+
+ public function __construct($output, $options = array())
+ {
+ if (isset($options['encode_entities'])) {
+ $this->encode = $options['encode_entities'];
+ }
+
+ $this->outputMode = static::IM_IN_HTML;
+ $this->out = $output;
+ $this->hasHTML5 = defined('ENT_HTML5');
+ }
+
+ public function addRule(array $rule)
+ {
+ $this->nonBooleanAttributes[] = $rule;
+ }
+
+ public function setTraverser(Traverser $traverser)
+ {
+ $this->traverser = $traverser;
+
+ return $this;
+ }
+
+ public function unsetTraverser()
+ {
+ $this->traverser = null;
+
+ return $this;
+ }
+
+ public function document($dom)
+ {
+ $this->doctype();
+ if ($dom->documentElement) {
+ foreach ($dom->childNodes as $node) {
+ $this->traverser->node($node);
+ }
+ $this->nl();
+ }
+ }
+
+ protected function doctype()
+ {
+ $this->wr(static::DOCTYPE);
+ $this->nl();
+ }
+
+ public function element($ele)
+ {
+ $name = $ele->tagName;
+
+ // Per spec:
+ // If the element has a declared namespace in the HTML, MathML or
+ // SVG namespaces, we use the lname instead of the tagName.
+ if ($this->traverser->isLocalElement($ele)) {
+ $name = $ele->localName;
+ }
+
+ // If we are in SVG or MathML there is special handling.
+ // Using if/elseif instead of switch because it's faster in PHP.
+ if ('svg' == $name) {
+ $this->outputMode = static::IM_IN_SVG;
+ $name = Elements::normalizeSvgElement($name);
+ } elseif ('math' == $name) {
+ $this->outputMode = static::IM_IN_MATHML;
+ }
+
+ $this->openTag($ele);
+ if (Elements::isA($name, Elements::TEXT_RAW)) {
+ foreach ($ele->childNodes as $child) {
+ if ($child instanceof \DOMCharacterData) {
+ $this->wr($child->data);
+ } elseif ($child instanceof \DOMElement) {
+ $this->element($child);
+ }
+ }
+ } else {
+ // Handle children.
+ if ($ele->hasChildNodes()) {
+ $this->traverser->children($ele->childNodes);
+ }
+
+ // Close out the SVG or MathML special handling.
+ if ('svg' == $name || 'math' == $name) {
+ $this->outputMode = static::IM_IN_HTML;
+ }
+ }
+
+ // If not unary, add a closing tag.
+ if (!Elements::isA($name, Elements::VOID_TAG)) {
+ $this->closeTag($ele);
+ }
+ }
+
+ /**
+ * Write a text node.
+ *
+ * @param \DOMText $ele The text node to write.
+ */
+ public function text($ele)
+ {
+ if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) {
+ $this->wr($ele->data);
+
+ return;
+ }
+
+ // FIXME: This probably needs some flags set.
+ $this->wr($this->enc($ele->data));
+ }
+
+ public function cdata($ele)
+ {
+ // This encodes CDATA.
+ $this->wr($ele->ownerDocument->saveXML($ele));
+ }
+
+ public function comment($ele)
+ {
+ // These produce identical output.
+ // $this->wr('<!--')->wr($ele->data)->wr('-->');
+ $this->wr($ele->ownerDocument->saveXML($ele));
+ }
+
+ public function processorInstruction($ele)
+ {
+ $this->wr('<?')
+ ->wr($ele->target)
+ ->wr(' ')
+ ->wr($ele->data)
+ ->wr('?>');
+ }
+
+ /**
+ * Write the namespace attributes.
+ *
+ * @param \DOMNode $ele The element being written.
+ */
+ protected function namespaceAttrs($ele)
+ {
+ if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) {
+ $this->xpath = new \DOMXPath($ele->ownerDocument);
+ }
+
+ foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) {
+ if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) {
+ $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"');
+ }
+ }
+ }
+
+ /**
+ * Write the opening tag.
+ *
+ * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the
+ * qualified name (8.3).
+ *
+ * @param \DOMNode $ele The element being written.
+ */
+ protected function openTag($ele)
+ {
+ $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName);
+
+ $this->attrs($ele);
+ $this->namespaceAttrs($ele);
+
+ if ($this->outputMode == static::IM_IN_HTML) {
+ $this->wr('>');
+ } // If we are not in html mode we are in SVG, MathML, or XML embedded content.
+ else {
+ if ($ele->hasChildNodes()) {
+ $this->wr('>');
+ } // If there are no children this is self closing.
+ else {
+ $this->wr(' />');
+ }
+ }
+ }
+
+ protected function attrs($ele)
+ {
+ // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements.
+ if (!$ele->hasAttributes()) {
+ return $this;
+ }
+
+ // TODO: Currently, this always writes name="value", and does not do
+ // value-less attributes.
+ $map = $ele->attributes;
+ $len = $map->length;
+ for ($i = 0; $i < $len; ++$i) {
+ $node = $map->item($i);
+ $val = $this->enc($node->value, true);
+
+ // XXX: The spec says that we need to ensure that anything in
+ // the XML, XMLNS, or XLink NS's should use the canonical
+ // prefix. It seems that DOM does this for us already, but there
+ // may be exceptions.
+ $name = $node->nodeName;
+
+ // Special handling for attributes in SVG and MathML.
+ // Using if/elseif instead of switch because it's faster in PHP.
+ if ($this->outputMode == static::IM_IN_SVG) {
+ $name = Elements::normalizeSvgAttribute($name);
+ } elseif ($this->outputMode == static::IM_IN_MATHML) {
+ $name = Elements::normalizeMathMlAttribute($name);
+ }
+
+ $this->wr(' ')->wr($name);
+
+ if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) {
+ $this->wr('="')->wr($val)->wr('"');
+ }
+ }
+ }
+
+ protected function nonBooleanAttribute(\DOMAttr $attr)
+ {
+ $ele = $attr->ownerElement;
+ foreach ($this->nonBooleanAttributes as $rule) {
+ if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) {
+ continue;
+ }
+ if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) {
+ continue;
+ }
+ if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) {
+ continue;
+ }
+ if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) {
+ continue;
+ }
+ if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) {
+ continue;
+ }
+ if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) {
+ continue;
+ }
+ if (isset($rule['xpath'])) {
+ $xp = $this->getXPath($attr);
+ if (isset($rule['prefixes'])) {
+ foreach ($rule['prefixes'] as $nsPrefix => $ns) {
+ $xp->registerNamespace($nsPrefix, $ns);
+ }
+ }
+ if (!$xp->evaluate($rule['xpath'], $attr)) {
+ continue;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private function getXPath(\DOMNode $node)
+ {
+ if (!$this->xpath) {
+ $this->xpath = new \DOMXPath($node->ownerDocument);
+ }
+
+ return $this->xpath;
+ }
+
+ /**
+ * Write the closing tag.
+ *
+ * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the
+ * qualified name (8.3).
+ *
+ * @param \DOMNode $ele The element being written.
+ */
+ protected function closeTag($ele)
+ {
+ if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) {
+ $this->wr('</')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>');
+ }
+ }
+
+ /**
+ * Write to the output.
+ *
+ * @param string $text The string to put into the output
+ *
+ * @return $this
+ */
+ protected function wr($text)
+ {
+ fwrite($this->out, $text);
+
+ return $this;
+ }
+
+ /**
+ * Write a new line character.
+ *
+ * @return $this
+ */
+ protected function nl()
+ {
+ fwrite($this->out, PHP_EOL);
+
+ return $this;
+ }
+
+ /**
+ * Encode text.
+ *
+ * When encode is set to false, the default value, the text passed in is
+ * escaped per section 8.3 of the html5 spec. For details on how text is
+ * escaped see the escape() method.
+ *
+ * When encoding is set to true the text is converted to named character
+ * references where appropriate. Section 8.1.4 Character references of the
+ * html5 spec refers to using named character references. This is useful for
+ * characters that can't otherwise legally be used in the text.
+ *
+ * The named character references are listed in section 8.5.
+ *
+ * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities.
+ * This includes such characters as +.# and many other common ones. By default
+ * encoding here will just escape &'<>".
+ *
+ * Note, PHP 5.4+ has better html5 encoding.
+ *
+ * @todo Use the Entities class in php 5.3 to have html5 entities.
+ *
+ * @param string $text Text to encode.
+ * @param bool $attribute True if we are encoding an attrubute, false otherwise.
+ *
+ * @return string The encoded text.
+ */
+ protected function enc($text, $attribute = false)
+ {
+ // Escape the text rather than convert to named character references.
+ if (!$this->encode) {
+ return $this->escape($text, $attribute);
+ }
+
+ // If we are in PHP 5.4+ we can use the native html5 entity functionality to
+ // convert the named character references.
+
+ if ($this->hasHTML5) {
+ return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false);
+ } // If a version earlier than 5.4 html5 entities are not entirely handled.
+ // This manually handles them.
+ else {
+ return strtr($text, HTML5Entities::$map);
+ }
+ }
+
+ /**
+ * Escape test.
+ *
+ * According to the html5 spec section 8.3 Serializing HTML fragments, text
+ * within tags that are not style, script, xmp, iframe, noembed, and noframes
+ * need to be properly escaped.
+ *
+ * The & should be converted to &amp;, no breaking space unicode characters
+ * converted to &nbsp;, when in attribute mode the " should be converted to
+ * &quot;, and when not in attribute mode the < and > should be converted to
+ * &lt; and &gt;.
+ *
+ * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString
+ *
+ * @param string $text Text to escape.
+ * @param bool $attribute True if we are escaping an attrubute, false otherwise.
+ */
+ protected function escape($text, $attribute = false)
+ {
+ // Not using htmlspecialchars because, while it does escaping, it doesn't
+ // match the requirements of section 8.5. For example, it doesn't handle
+ // non-breaking spaces.
+ if ($attribute) {
+ $replace = array(
+ '"' => '&quot;',
+ '&' => '&amp;',
+ "\xc2\xa0" => '&nbsp;',
+ );
+ } else {
+ $replace = array(
+ '<' => '&lt;',
+ '>' => '&gt;',
+ '&' => '&amp;',
+ "\xc2\xa0" => '&nbsp;',
+ );
+ }
+
+ return strtr($text, $replace);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md
new file mode 100644
index 000000000..849a47f3a
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/README.md
@@ -0,0 +1,33 @@
+# The Serializer (Writer) Model
+
+The serializer roughly follows sections _8.1 Writing HTML documents_ and section
+_8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment,
+and DOMNodeList into HTML5.
+
+ [ HTML5 ] // Interface for saving.
+ ||
+ [ Traverser ] // Walk the DOM
+ ||
+ [ Rules ] // Convert DOM elements into strings.
+ ||
+ [ HTML5 ] // HTML5 document or fragment in text.
+
+
+## HTML5 Class
+
+Provides the top level interface for saving.
+
+## The Traverser
+
+Walks the DOM finding each element and passing it off to the output rules to
+convert to HTML5.
+
+## Output Rules
+
+The output rules are defined in the RulesInterface which can have multiple
+implementations. Currently, the OutputRules is the default implementation that
+converts a DOM as is into HTML5.
+
+## HTML5 String
+
+The output of the process it HTML5 as a string or saved to a file. \ No newline at end of file
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php
new file mode 100644
index 000000000..69a6ecdad
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * @file
+ * The interface definition for Rules to generate output.
+ */
+
+namespace Masterminds\HTML5\Serializer;
+
+/**
+ * To create a new rule set for writing output the RulesInterface needs to be implemented.
+ * The resulting class can be specified in the options with the key of rules.
+ *
+ * For an example implementation see Serializer\OutputRules.
+ */
+interface RulesInterface
+{
+ /**
+ * The class constructor.
+ *
+ * Note, before the rules can be used a traverser must be registered.
+ *
+ * @param mixed $output The output stream to write output to.
+ * @param array $options An array of options.
+ */
+ public function __construct($output, $options = array());
+
+ /**
+ * Register the traverser used in but the rules.
+ *
+ * Note, only one traverser can be used by the rules.
+ *
+ * @param Traverser $traverser The traverser used in the rules.
+ *
+ * @return RulesInterface $this for the current object.
+ */
+ public function setTraverser(Traverser $traverser);
+
+ /**
+ * Write a document element (\DOMDocument).
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param \DOMDocument $dom
+ */
+ public function document($dom);
+
+ /**
+ * Write an element.
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param mixed $ele
+ */
+ public function element($ele);
+
+ /**
+ * Write a text node.
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param mixed $ele
+ */
+ public function text($ele);
+
+ /**
+ * Write a CDATA node.
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param mixed $ele
+ */
+ public function cdata($ele);
+
+ /**
+ * Write a comment node.
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param mixed $ele
+ */
+ public function comment($ele);
+
+ /**
+ * Write a processor instruction.
+ *
+ * To learn about processor instructions see InstructionProcessor
+ *
+ * Instead of returning the result write it to the output stream ($output)
+ * that was passed into the constructor.
+ *
+ * @param mixed $ele
+ */
+ public function processorInstruction($ele);
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php
new file mode 100644
index 000000000..1e8d7924e
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/src/HTML5/Serializer/Traverser.php
@@ -0,0 +1,142 @@
+<?php
+
+namespace Masterminds\HTML5\Serializer;
+
+/**
+ * Traverser for walking a DOM tree.
+ *
+ * This is a concrete traverser designed to convert a DOM tree into an
+ * HTML5 document. It is not intended to be a generic DOMTreeWalker
+ * implementation.
+ *
+ * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments
+ */
+class Traverser
+{
+ /**
+ * Namespaces that should be treated as "local" to HTML5.
+ */
+ protected static $local_ns = array(
+ 'http://www.w3.org/1999/xhtml' => 'html',
+ 'http://www.w3.org/1998/Math/MathML' => 'math',
+ 'http://www.w3.org/2000/svg' => 'svg',
+ );
+
+ protected $dom;
+
+ protected $options;
+
+ protected $encode = false;
+
+ protected $rules;
+
+ protected $out;
+
+ /**
+ * Create a traverser.
+ *
+ * @param \DOMNode|\DOMNodeList $dom The document or node to traverse.
+ * @param resource $out A stream that allows writing. The traverser will output into this
+ * stream.
+ * @param array $options An array of options for the traverser as key/value pairs. These include:
+ * - encode_entities: A bool to specify if full encding should happen for all named
+ * charachter references. Defaults to false which escapes &'<>".
+ * - output_rules: The path to the class handling the output rules.
+ */
+ public function __construct($dom, $out, RulesInterface $rules, $options = array())
+ {
+ $this->dom = $dom;
+ $this->out = $out;
+ $this->rules = $rules;
+ $this->options = $options;
+
+ $this->rules->setTraverser($this);
+ }
+
+ /**
+ * Tell the traverser to walk the DOM.
+ *
+ * @return resource $out Returns the output stream.
+ */
+ public function walk()
+ {
+ if ($this->dom instanceof \DOMDocument) {
+ $this->rules->document($this->dom);
+ } elseif ($this->dom instanceof \DOMDocumentFragment) {
+ // Document fragments are a special case. Only the children need to
+ // be serialized.
+ if ($this->dom->hasChildNodes()) {
+ $this->children($this->dom->childNodes);
+ }
+ } // If NodeList, loop
+ elseif ($this->dom instanceof \DOMNodeList) {
+ // If this is a NodeList of DOMDocuments this will not work.
+ $this->children($this->dom);
+ } // Else assume this is a DOMNode-like datastructure.
+ else {
+ $this->node($this->dom);
+ }
+
+ return $this->out;
+ }
+
+ /**
+ * Process a node in the DOM.
+ *
+ * @param mixed $node A node implementing \DOMNode.
+ */
+ public function node($node)
+ {
+ // A listing of types is at http://php.net/manual/en/dom.constants.php
+ switch ($node->nodeType) {
+ case XML_ELEMENT_NODE:
+ $this->rules->element($node);
+ break;
+ case XML_TEXT_NODE:
+ $this->rules->text($node);
+ break;
+ case XML_CDATA_SECTION_NODE:
+ $this->rules->cdata($node);
+ break;
+ case XML_PI_NODE:
+ $this->rules->processorInstruction($node);
+ break;
+ case XML_COMMENT_NODE:
+ $this->rules->comment($node);
+ break;
+ // Currently we don't support embedding DTDs.
+ default:
+ //print '<!-- Skipped -->';
+ break;
+ }
+ }
+
+ /**
+ * Walk through all the nodes on a node list.
+ *
+ * @param \DOMNodeList $nl A list of child elements to walk through.
+ */
+ public function children($nl)
+ {
+ foreach ($nl as $node) {
+ $this->node($node);
+ }
+ }
+
+ /**
+ * Is an element local?
+ *
+ * @param mixed $ele An element that implement \DOMNode.
+ *
+ * @return bool true if local and false otherwise.
+ */
+ public function isLocalElement($ele)
+ {
+ $uri = $ele->namespaceURI;
+ if (empty($uri)) {
+ return false;
+ }
+
+ return isset(static::$local_ns[$uri]);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/ElementsTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/ElementsTest.php
new file mode 100644
index 000000000..08b5ee425
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/ElementsTest.php
@@ -0,0 +1,485 @@
+<?php
+
+namespace Masterminds\HTML5\Tests;
+
+use Masterminds\HTML5\Elements;
+
+class ElementsTest extends TestCase
+{
+ public $html5Elements = array(
+ 'a',
+ 'abbr',
+ 'address',
+ 'area',
+ 'article',
+ 'aside',
+ 'audio',
+ 'b',
+ 'base',
+ 'bdi',
+ 'bdo',
+ 'blockquote',
+ 'body',
+ 'br',
+ 'button',
+ 'canvas',
+ 'caption',
+ 'cite',
+ 'code',
+ 'col',
+ 'colgroup',
+ 'command',
+ // "data",
+ 'datalist',
+ 'dd',
+ 'del',
+ 'details',
+ 'dfn',
+ 'dialog',
+ 'div',
+ 'dl',
+ 'dt',
+ 'em',
+ 'embed',
+ 'fieldset',
+ 'figcaption',
+ 'figure',
+ 'footer',
+ 'form',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'head',
+ 'header',
+ 'hgroup',
+ 'hr',
+ 'html',
+ 'i',
+ 'iframe',
+ 'img',
+ 'input',
+ 'ins',
+ 'kbd',
+ 'keygen',
+ 'label',
+ 'legend',
+ 'li',
+ 'link',
+ 'map',
+ 'mark',
+ 'menu',
+ 'meta',
+ 'meter',
+ 'nav',
+ 'noscript',
+ 'object',
+ 'ol',
+ 'optgroup',
+ 'option',
+ 'output',
+ 'p',
+ 'param',
+ 'pre',
+ 'progress',
+ 'q',
+ 'rp',
+ 'rt',
+ 'ruby',
+ 's',
+ 'samp',
+ 'script',
+ 'section',
+ 'select',
+ 'small',
+ 'source',
+ 'span',
+ 'strong',
+ 'style',
+ 'sub',
+ 'summary',
+ 'sup',
+ 'table',
+ 'tbody',
+ 'td',
+ 'textarea',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'time',
+ 'title',
+ 'tr',
+ 'track',
+ 'u',
+ 'ul',
+ 'var',
+ 'video',
+ 'wbr',
+ );
+
+ public $mathmlElements = array(
+ 'maction',
+ 'maligngroup',
+ 'malignmark',
+ 'math',
+ 'menclose',
+ 'merror',
+ 'mfenced',
+ 'mfrac',
+ 'mglyph',
+ 'mi',
+ 'mlabeledtr',
+ 'mlongdiv',
+ 'mmultiscripts',
+ 'mn',
+ 'mo',
+ 'mover',
+ 'mpadded',
+ 'mphantom',
+ 'mroot',
+ 'mrow',
+ 'ms',
+ 'mscarries',
+ 'mscarry',
+ 'msgroup',
+ 'msline',
+ 'mspace',
+ 'msqrt',
+ 'msrow',
+ 'mstack',
+ 'mstyle',
+ 'msub',
+ 'msup',
+ 'msubsup',
+ 'mtable',
+ 'mtd',
+ 'mtext',
+ 'mtr',
+ 'munder',
+ 'munderover',
+ );
+
+ public $svgElements = array(
+ 'a',
+ 'altGlyph',
+ 'altGlyphDef',
+ 'altGlyphItem',
+ 'animate',
+ 'animateColor',
+ 'animateMotion',
+ 'animateTransform',
+ 'circle',
+ 'clipPath',
+ 'color-profile',
+ 'cursor',
+ 'defs',
+ 'desc',
+ 'ellipse',
+ 'feBlend',
+ 'feColorMatrix',
+ 'feComponentTransfer',
+ 'feComposite',
+ 'feConvolveMatrix',
+ 'feDiffuseLighting',
+ 'feDisplacementMap',
+ 'feDistantLight',
+ 'feFlood',
+ 'feFuncA',
+ 'feFuncB',
+ 'feFuncG',
+ 'feFuncR',
+ 'feGaussianBlur',
+ 'feImage',
+ 'feMerge',
+ 'feMergeNode',
+ 'feMorphology',
+ 'feOffset',
+ 'fePointLight',
+ 'feSpecularLighting',
+ 'feSpotLight',
+ 'feTile',
+ 'feTurbulence',
+ 'filter',
+ 'font',
+ 'font-face',
+ 'font-face-format',
+ 'font-face-name',
+ 'font-face-src',
+ 'font-face-uri',
+ 'foreignObject',
+ 'g',
+ 'glyph',
+ 'glyphRef',
+ 'hkern',
+ 'image',
+ 'line',
+ 'linearGradient',
+ 'marker',
+ 'mask',
+ 'metadata',
+ 'missing-glyph',
+ 'mpath',
+ 'path',
+ 'pattern',
+ 'polygon',
+ 'polyline',
+ 'radialGradient',
+ 'rect',
+ 'script',
+ 'set',
+ 'stop',
+ 'style',
+ 'svg',
+ 'switch',
+ 'symbol',
+ 'text',
+ 'textPath',
+ 'title',
+ 'tref',
+ 'tspan',
+ 'use',
+ 'view',
+ 'vkern',
+ );
+
+ public function testIsHtml5Element()
+ {
+ foreach ($this->html5Elements as $element) {
+ $this->assertTrue(Elements::isHtml5Element($element), 'html5 element test failed on: ' . $element);
+
+ $this->assertTrue(Elements::isHtml5Element(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
+ }
+
+ $nonhtml5 = array(
+ 'foo',
+ 'bar',
+ 'baz',
+ );
+ foreach ($nonhtml5 as $element) {
+ $this->assertFalse(Elements::isHtml5Element($element), 'html5 element test failed on: ' . $element);
+
+ $this->assertFalse(Elements::isHtml5Element(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
+ }
+ }
+
+ public function testIsMathMLElement()
+ {
+ foreach ($this->mathmlElements as $element) {
+ $this->assertTrue(Elements::isMathMLElement($element), 'MathML element test failed on: ' . $element);
+
+ // MathML is case sensitive so these should all fail.
+ $this->assertFalse(Elements::isMathMLElement(strtoupper($element)), 'MathML element test failed on: ' . strtoupper($element));
+ }
+
+ $nonMathML = array(
+ 'foo',
+ 'bar',
+ 'baz',
+ );
+ foreach ($nonMathML as $element) {
+ $this->assertFalse(Elements::isMathMLElement($element), 'MathML element test failed on: ' . $element);
+ }
+ }
+
+ public function testIsSvgElement()
+ {
+ foreach ($this->svgElements as $element) {
+ $this->assertTrue(Elements::isSvgElement($element), 'SVG element test failed on: ' . $element);
+
+ // SVG is case sensitive so these should all fail.
+ $this->assertFalse(Elements::isSvgElement(strtoupper($element)), 'SVG element test failed on: ' . strtoupper($element));
+ }
+
+ $nonSVG = array(
+ 'foo',
+ 'bar',
+ 'baz',
+ );
+ foreach ($nonSVG as $element) {
+ $this->assertFalse(Elements::isSvgElement($element), 'SVG element test failed on: ' . $element);
+ }
+ }
+
+ public function testIsElement()
+ {
+ foreach ($this->html5Elements as $element) {
+ $this->assertTrue(Elements::isElement($element), 'html5 element test failed on: ' . $element);
+
+ $this->assertTrue(Elements::isElement(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
+ }
+
+ foreach ($this->mathmlElements as $element) {
+ $this->assertTrue(Elements::isElement($element), 'MathML element test failed on: ' . $element);
+
+ // MathML is case sensitive so these should all fail.
+ $this->assertFalse(Elements::isElement(strtoupper($element)), 'MathML element test failed on: ' . strtoupper($element));
+ }
+
+ foreach ($this->svgElements as $element) {
+ $this->assertTrue(Elements::isElement($element), 'SVG element test failed on: ' . $element);
+
+ // SVG is case sensitive so these should all fail. But, there is duplication
+ // html5 and SVG. Since html5 is case insensitive we need to make sure
+ // it's not a html5 element first.
+ if (!in_array($element, $this->html5Elements)) {
+ $this->assertFalse(Elements::isElement(strtoupper($element)), 'SVG element test failed on: ' . strtoupper($element));
+ }
+ }
+
+ $nonhtml5 = array(
+ 'foo',
+ 'bar',
+ 'baz',
+ );
+ foreach ($nonhtml5 as $element) {
+ $this->assertFalse(Elements::isElement($element), 'html5 element test failed on: ' . $element);
+
+ $this->assertFalse(Elements::isElement(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
+ }
+ }
+
+ public function testElement()
+ {
+ foreach ($this->html5Elements as $element) {
+ $this->assertGreaterThan(0, Elements::element($element));
+ }
+ $nonhtml5 = array(
+ 'foo',
+ 'bar',
+ 'baz',
+ );
+ foreach ($nonhtml5 as $element) {
+ $this->assertEquals(0, Elements::element($element));
+ }
+ }
+
+ public function testIsA()
+ {
+ $this->assertTrue(Elements::isA('script', Elements::KNOWN_ELEMENT));
+ $this->assertFalse(Elements::isA('scriptypoo', Elements::KNOWN_ELEMENT));
+ $this->assertTrue(Elements::isA('script', Elements::TEXT_RAW));
+ $this->assertFalse(Elements::isA('script', Elements::TEXT_RCDATA));
+
+ $voidElements = array(
+ 'area',
+ 'base',
+ 'basefont',
+ 'bgsound',
+ 'br',
+ 'col',
+ 'command',
+ 'embed',
+ 'frame',
+ 'hr',
+ 'img',
+ );
+
+ foreach ($voidElements as $element) {
+ $this->assertTrue(Elements::isA($element, Elements::VOID_TAG), 'Void element test failed on: ' . $element);
+ }
+
+ $nonVoid = array(
+ 'span',
+ 'a',
+ 'div',
+ );
+ foreach ($nonVoid as $tag) {
+ $this->assertFalse(Elements::isA($tag, Elements::VOID_TAG), 'Void element test failed on: ' . $tag);
+ }
+
+ $blockTags = array(
+ 'address',
+ 'article',
+ 'aside',
+ 'blockquote',
+ 'canvas',
+ 'dd',
+ 'div',
+ 'dl',
+ 'fieldset',
+ 'figcaption',
+ 'figure',
+ 'footer',
+ 'form',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'header',
+ 'hgroup',
+ 'hr',
+ 'noscript',
+ 'ol',
+ 'output',
+ 'p',
+ 'pre',
+ 'section',
+ 'table',
+ 'tfoot',
+ 'ul',
+ 'video',
+ );
+
+ foreach ($blockTags as $tag) {
+ $this->assertTrue(Elements::isA($tag, Elements::BLOCK_TAG), 'Block tag test failed on: ' . $tag);
+ }
+
+ $nonBlockTags = array(
+ 'span',
+ 'img',
+ 'label',
+ );
+ foreach ($nonBlockTags as $tag) {
+ $this->assertFalse(Elements::isA($tag, Elements::BLOCK_TAG), 'Block tag test failed on: ' . $tag);
+ }
+ }
+
+ public function testNormalizeSvgElement()
+ {
+ $tests = array(
+ 'foo' => 'foo',
+ 'altglyph' => 'altGlyph',
+ 'BAR' => 'bar',
+ 'fespecularlighting' => 'feSpecularLighting',
+ 'bAz' => 'baz',
+ 'foreignobject' => 'foreignObject',
+ );
+
+ foreach ($tests as $input => $expected) {
+ $this->assertEquals($expected, Elements::normalizeSvgElement($input));
+ }
+ }
+
+ public function testNormalizeSvgAttribute()
+ {
+ $tests = array(
+ 'foo' => 'foo',
+ 'attributename' => 'attributeName',
+ 'BAR' => 'bar',
+ 'limitingconeangle' => 'limitingConeAngle',
+ 'bAz' => 'baz',
+ 'patterncontentunits' => 'patternContentUnits',
+ );
+
+ foreach ($tests as $input => $expected) {
+ $this->assertEquals($expected, Elements::normalizeSvgAttribute($input));
+ }
+ }
+
+ public function testNormalizeMathMlAttribute()
+ {
+ $tests = array(
+ 'foo' => 'foo',
+ 'definitionurl' => 'definitionURL',
+ 'BAR' => 'bar',
+ );
+
+ foreach ($tests as $input => $expected) {
+ $this->assertEquals($expected, Elements::normalizeMathMlAttribute($input));
+ }
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/utf-8.html b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/utf-8.html
new file mode 100644
index 000000000..fa5a029ce
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/utf-8.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
+</head>
+<body>
+ <p>Žťčýů</p>
+</body>
+</html>
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/windows-1252.html b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/windows-1252.html
new file mode 100644
index 000000000..f0132da5d
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Fixtures/encoding/windows-1252.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=windows-1252">
+</head>
+<body>
+ <p>�����</p>
+</body>
+</html>
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.html b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.html
new file mode 100644
index 000000000..a976e8be9
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Test</title>
+ </head>
+ <body>
+ <p>This is a test.</p>
+ </body>
+</html> \ No newline at end of file
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.php
new file mode 100644
index 000000000..ed66d8af2
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Html5Test.php
@@ -0,0 +1,492 @@
+<?php
+
+namespace Masterminds\HTML5\Tests;
+
+use Masterminds\HTML5;
+
+class Html5Test extends TestCase
+{
+ /**
+ * @var HTML5
+ */
+ private $html5;
+
+ public function setUp()
+ {
+ $this->html5 = $this->getInstance();
+ }
+
+ /**
+ * Parse and serialize a string.
+ */
+ protected function cycle($html)
+ {
+ $dom = $this->html5->loadHTML('<!DOCTYPE html><html><body>' . $html . '</body></html>');
+ $out = $this->html5->saveHTML($dom);
+
+ return $out;
+ }
+
+ protected function cycleFragment($fragment)
+ {
+ $dom = $this->html5->loadHTMLFragment($fragment);
+ $out = $this->html5->saveHTML($dom);
+
+ return $out;
+ }
+
+ public function testImageTagsInSvg()
+ {
+ $html = '<!DOCTYPE html>
+ <html>
+ <head>
+ <title>foo</title>
+ </head>
+ <body>
+ <svg>
+ <image height="10" width="10"></image>
+ </svg>
+ </body>
+ </html>';
+ $doc = $this->html5->loadHTML($html);
+ $this->assertInstanceOf('DOMElement', $doc->getElementsByTagName('image')->item(0));
+ $this->assertEmpty($this->html5->getErrors());
+ }
+
+ public function testLoadOptions()
+ {
+ // doc
+ $dom = $this->html5->loadHTML($this->wrap('<t:tag/>'), array(
+ 'implicitNamespaces' => array('t' => 'http://example.com'),
+ 'xmlNamespaces' => true,
+ ));
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ $this->assertFalse($this->html5->hasErrors());
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('t', 'http://example.com');
+ $this->assertEquals(1, $xpath->query('//t:tag')->length);
+
+ // doc fragment
+ $frag = $this->html5->loadHTMLFragment('<t:tag/>', array(
+ 'implicitNamespaces' => array('t' => 'http://example.com'),
+ 'xmlNamespaces' => true,
+ ));
+ $this->assertInstanceOf('\DOMDocumentFragment', $frag);
+ $this->assertEmpty($this->html5->getErrors());
+ $this->assertFalse($this->html5->hasErrors());
+
+ $frag->ownerDocument->appendChild($frag);
+ $xpath = new \DOMXPath($frag->ownerDocument);
+ $xpath->registerNamespace('t', 'http://example.com');
+ $this->assertEquals(1, $xpath->query('//t:tag', $frag)->length);
+ }
+
+ public function testEncodingUtf8()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Fixtures/encoding/utf-8.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ $this->assertFalse($this->html5->hasErrors());
+
+ $this->assertContains('Žťčýů', $dom->saveHTML());
+ }
+
+ public function testEncodingWindows1252()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Fixtures/encoding/windows-1252.html', array(
+ 'encoding' => 'Windows-1252',
+ ));
+
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ $this->assertFalse($this->html5->hasErrors());
+
+ $dumpedAsUtf8 = mb_convert_encoding($dom->saveHTML(), 'UTF-8', 'Windows-1252');
+ $this->assertNotFalse(mb_strpos($dumpedAsUtf8, 'Ž'));
+ $this->assertNotFalse(mb_strpos($dumpedAsUtf8, 'è'));
+ $this->assertNotFalse(mb_strpos($dumpedAsUtf8, 'ý'));
+ $this->assertNotFalse(mb_strpos($dumpedAsUtf8, 'ù'));
+ }
+
+ public function testErrors()
+ {
+ $dom = $this->html5->loadHTML('<xx as>');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+
+ $this->assertNotEmpty($this->html5->getErrors());
+ $this->assertTrue($this->html5->hasErrors());
+ }
+
+ public function testLoad()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Html5Test.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ $this->assertFalse($this->html5->hasErrors());
+
+ $file = fopen(__DIR__ . '/Html5Test.html', 'r');
+ $dom = $this->html5->load($file);
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+
+ $dom = $this->html5->loadHTMLFile(__DIR__ . '/Html5Test.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ }
+
+ public function testLoadHTML()
+ {
+ $contents = file_get_contents(__DIR__ . '/Html5Test.html');
+ $dom = $this->html5->loadHTML($contents);
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ }
+
+ public function testLoadHTMLWithComments()
+ {
+ $contents = '<!--[if lte IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
+<!--[if gt IE 8]> <!--><html class="no-js" lang="en"><!--<![endif]-->
+</html>';
+
+ $dom = $this->html5->loadHTML($contents);
+ $this->assertInstanceOf('\DOMDocument', $dom);
+
+ $expected = '<!DOCTYPE html>
+<!--[if lte IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--><!--[if gt IE 8]> <!--><html class="no-js" lang="en"><!--<![endif]--></html>
+';
+ $this->assertEquals($expected, $this->html5->saveHTML($dom));
+ }
+
+ public function testLoadHTMLFragment()
+ {
+ $fragment = '<section id="Foo"><div class="Bar">Baz</div></section>';
+ $dom = $this->html5->loadHTMLFragment($fragment);
+ $this->assertInstanceOf('\DOMDocumentFragment', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+ }
+
+ public function testSaveHTML()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Html5Test.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+
+ $saved = $this->html5->saveHTML($dom);
+ $this->assertRegExp('|<p>This is a test.</p>|', $saved);
+ }
+
+ public function testSaveHTMLFragment()
+ {
+ $fragment = '<section id="Foo"><div class="Bar">Baz</div></section>';
+ $dom = $this->html5->loadHTMLFragment($fragment);
+
+ $string = $this->html5->saveHTML($dom);
+ $this->assertEquals($fragment, $string);
+ }
+
+ public function testSave()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Html5Test.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+
+ // Test resource
+ $file = fopen('php://temp', 'w');
+ $this->html5->save($dom, $file);
+ $content = stream_get_contents($file, -1, 0);
+ $this->assertRegExp('|<p>This is a test.</p>|', $content);
+
+ // Test file
+ $tmpfname = tempnam(sys_get_temp_dir(), 'html5-php');
+ $this->html5->save($dom, $tmpfname);
+ $content = file_get_contents($tmpfname);
+ $this->assertRegExp('|<p>This is a test.</p>|', $content);
+ unlink($tmpfname);
+ }
+
+ // This test reads a document into a dom, turn the dom into a document,
+ // then tries to read that document again. This makes sure we are reading,
+ // and generating a document that works at a high level.
+ public function testItWorks()
+ {
+ $dom = $this->html5->load(__DIR__ . '/Html5Test.html');
+ $this->assertInstanceOf('\DOMDocument', $dom);
+ $this->assertEmpty($this->html5->getErrors());
+
+ $saved = $this->html5->saveHTML($dom);
+
+ $dom2 = $this->html5->loadHTML($saved);
+ $this->assertInstanceOf('\DOMDocument', $dom2);
+ $this->assertEmpty($this->html5->getErrors());
+ }
+
+ public function testConfig()
+ {
+ $html5 = $this->getInstance();
+ $options = $html5->getOptions();
+ $this->assertEquals(false, $options['encode_entities']);
+
+ $html5 = $this->getInstance(array(
+ 'foo' => 'bar',
+ 'encode_entities' => true,
+ ));
+ $options = $html5->getOptions();
+ $this->assertEquals('bar', $options['foo']);
+ $this->assertEquals(true, $options['encode_entities']);
+
+ // Need to reset to original so future tests pass as expected.
+ // $this->getInstance()->setOption('encode_entities', false);
+ }
+
+ public function testSvg()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ <svg width="150" height="100" viewBox="0 0 3 2">
+ <rect width="1" height="2" x="0" fill="#008d46" />
+ <rect width="1" height="2" x="1" fill="#ffffff" />
+ <rect width="1" height="2" x="2" fill="#d2232c" />
+ <text font-family="Verdana" font-size="32">
+ <textPath xlink:href="#Foo">
+ Test Text.
+ </textPath>
+ </text>
+ </svg>
+ </body>
+ </html>');
+
+ $this->assertEmpty($this->html5->getErrors());
+
+ // Test a mixed case attribute.
+ $list = $dom->getElementsByTagName('svg');
+ $this->assertNotEmpty($list->length);
+ $svg = $list->item(0);
+ $this->assertEquals('0 0 3 2', $svg->getAttribute('viewBox'));
+ $this->assertFalse($svg->hasAttribute('viewbox'));
+
+ // Test a mixed case tag.
+ // Note: getElementsByTagName is not case sensitive.
+ $list = $dom->getElementsByTagName('textPath');
+ $this->assertNotEmpty($list->length);
+ $textPath = $list->item(0);
+ $this->assertEquals('textPath', $textPath->tagName);
+ $this->assertNotEquals('textpath', $textPath->tagName);
+
+ $html = $this->html5->saveHTML($dom);
+ $this->assertRegExp('|<svg width="150" height="100" viewBox="0 0 3 2">|', $html);
+ $this->assertRegExp('|<rect width="1" height="2" x="0" fill="#008d46" />|', $html);
+ }
+
+ public function testMathMl()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz" definitionURL="http://example.com">foo bar baz</div>
+ <math>
+ <mi>x</mi>
+ <csymbol definitionURL="http://www.example.com/mathops/multiops.html#plusminus">
+ <mo>&PlusMinus;</mo>
+ </csymbol>
+ <mi>y</mi>
+ </math>
+ </body>
+ </html>');
+
+ $this->assertEmpty($this->html5->getErrors());
+ $list = $dom->getElementsByTagName('math');
+ $this->assertNotEmpty($list->length);
+
+ $list = $dom->getElementsByTagName('div');
+ $this->assertNotEmpty($list->length);
+ $div = $list->item(0);
+ $this->assertEquals('http://example.com', $div->getAttribute('definitionurl'));
+ $this->assertFalse($div->hasAttribute('definitionURL'));
+ $list = $dom->getElementsByTagName('csymbol');
+ $csymbol = $list->item(0);
+ $this->assertEquals('http://www.example.com/mathops/multiops.html#plusminus', $csymbol->getAttribute('definitionURL'));
+ $this->assertFalse($csymbol->hasAttribute('definitionurl'));
+
+ $html = $this->html5->saveHTML($dom);
+ $this->assertRegExp('|<csymbol definitionURL="http://www.example.com/mathops/multiops.html#plusminus">|', $html);
+ $this->assertRegExp('|<mi>y</mi>|', $html);
+ }
+
+ public function testUnknownElements()
+ {
+ // The : should not have special handling accourding to section 2.9 of the
+ // spec. This is differenant than XML. Since we don't know these elements
+ // they are handled as normal elements. Note, to do this is really
+ // an invalid example and you should not embed prefixed xml in html5.
+ $dom = $this->html5->loadHTMLFragment(
+ '<f:rug>
+ <f:name>Big rectangle thing</f:name>
+ <f:width>40</f:width>
+ <f:length>80</f:length>
+ </f:rug>
+ <sarcasm>um, yeah</sarcasm>');
+
+ $this->assertEmpty($this->html5->getErrors());
+ $markup = $this->html5->saveHTML($dom);
+ $this->assertRegExp('|<f:name>Big rectangle thing</f:name>|', $markup);
+ $this->assertRegExp('|<sarcasm>um, yeah</sarcasm>|', $markup);
+ }
+
+ public function testElements()
+ {
+ // Should have content.
+ $res = $this->cycle('<div>FOO</div>');
+ $this->assertRegExp('|<div>FOO</div>|', $res);
+
+ // Should be empty
+ $res = $this->cycle('<span></span>');
+ $this->assertRegExp('|<span></span>|', $res);
+
+ // Should have content.
+ $res = $this->cycleFragment('<div>FOO</div>');
+ $this->assertRegExp('|<div>FOO</div>|', $res);
+
+ // Should be empty
+ $res = $this->cycleFragment('<span></span>');
+ $this->assertRegExp('|<span></span>|', $res);
+
+ // Elements with dashes and underscores
+ $res = $this->cycleFragment('<sp-an></sp-an>');
+ $this->assertRegExp('|<sp-an></sp-an>|', $res);
+ $res = $this->cycleFragment('<sp_an></sp_an>');
+ $this->assertRegExp('|<sp_an></sp_an>|', $res);
+
+ // Should have no closing tag.
+ $res = $this->cycle('<hr>');
+ $this->assertRegExp('|<hr></body>|', $res);
+ }
+
+ public function testAttributes()
+ {
+ $res = $this->cycle('<use xlink:href="#svg-track" xmlns:xlink="http://www.w3.org/1999/xlink"></use>');
+ $this->assertContains('<use xlink:href="#svg-track" xmlns:xlink="http://www.w3.org/1999/xlink"></use>', $res);
+
+ $res = $this->cycle('<div attr="val">FOO</div>');
+ $this->assertRegExp('|<div attr="val">FOO</div>|', $res);
+
+ // XXX: Note that spec does NOT require attrs in the same order.
+ $res = $this->cycle('<div attr="val" class="even">FOO</div>');
+ $this->assertRegExp('|<div attr="val" class="even">FOO</div>|', $res);
+
+ $res = $this->cycle('<div xmlns:foo="http://example.com">FOO</div>');
+ $this->assertRegExp('|<div xmlns:foo="http://example.com">FOO</div>|', $res);
+
+ $res = $this->cycleFragment('<div attr="val">FOO</div>');
+ $this->assertRegExp('|<div attr="val">FOO</div>|', $res);
+
+ // XXX: Note that spec does NOT require attrs in the same order.
+ $res = $this->cycleFragment('<div attr="val" class="even">FOO</div>');
+ $this->assertRegExp('|<div attr="val" class="even">FOO</div>|', $res);
+
+ $res = $this->cycleFragment('<div xmlns:foo="http://example.com">FOO</div>');
+ $this->assertRegExp('|<div xmlns:foo="http://example.com">FOO</div>|', $res);
+ }
+
+ public function testPCData()
+ {
+ $res = $this->cycle('<a>This is a test.</a>');
+ $this->assertRegExp('|This is a test.|', $res);
+
+ $res = $this->cycleFragment('<a>This is a test.</a>');
+ $this->assertRegExp('|This is a test.|', $res);
+
+ $res = $this->cycle('This
+ is
+ a
+ test.');
+
+ // Check that newlines are there, but don't count spaces.
+ $this->assertRegExp('|This\n\s*is\n\s*a\n\s*test.|', $res);
+
+ $res = $this->cycleFragment('This
+ is
+ a
+ test.');
+
+ // Check that newlines are there, but don't count spaces.
+ $this->assertRegExp('|This\n\s*is\n\s*a\n\s*test.|', $res);
+
+ $res = $this->cycle('<a>This <em>is</em> a test.</a>');
+ $this->assertRegExp('|This <em>is</em> a test.|', $res);
+
+ $res = $this->cycleFragment('<a>This <em>is</em> a test.</a>');
+ $this->assertRegExp('|This <em>is</em> a test.|', $res);
+ }
+
+ public function testUnescaped()
+ {
+ $res = $this->cycle('<script>2 < 1</script>');
+ $this->assertRegExp('|2 < 1|', $res);
+
+ $res = $this->cycle('<style>div>div>div</style>');
+ $this->assertRegExp('|div>div>div|', $res);
+
+ $res = $this->cycleFragment('<script>2 < 1</script>');
+ $this->assertRegExp('|2 < 1|', $res);
+
+ $res = $this->cycleFragment('<style>div>div>div</style>');
+ $this->assertRegExp('|div>div>div|', $res);
+ }
+
+ public function testEntities()
+ {
+ $res = $this->cycle('<a>Apples &amp; bananas.</a>');
+ $this->assertRegExp('|Apples &amp; bananas.|', $res);
+
+ $res = $this->cycleFragment('<a>Apples &amp; bananas.</a>');
+ $this->assertRegExp('|Apples &amp; bananas.|', $res);
+
+ $res = $this->cycleFragment('<p>R&D</p>');
+ $this->assertRegExp('|R&amp;D|', $res);
+ }
+
+ public function testCaseSensitiveTags()
+ {
+ $dom = $this->html5->loadHTML(
+ '<html><body><Button color="red">Error</Button></body></html>',
+ array(
+ 'xmlNamespaces' => true,
+ )
+ );
+ $out = $this->html5->saveHTML($dom);
+ $this->assertRegExp('|<html><body><Button color="red">Error</Button></body></html>|', $out);
+ }
+
+ public function testComment()
+ {
+ $res = $this->cycle('a<!-- This is a test. -->b');
+ $this->assertRegExp('|<!-- This is a test. -->|', $res);
+
+ $res = $this->cycleFragment('a<!-- This is a test. -->b');
+ $this->assertRegExp('|<!-- This is a test. -->|', $res);
+ }
+
+ public function testCDATA()
+ {
+ $res = $this->cycle('a<![CDATA[ This <is> a test. ]]>b');
+ $this->assertRegExp('|<!\[CDATA\[ This <is> a test\. \]\]>|', $res);
+
+ $res = $this->cycleFragment('a<![CDATA[ This <is> a test. ]]>b');
+ $this->assertRegExp('|<!\[CDATA\[ This <is> a test\. \]\]>|', $res);
+ }
+
+ public function testAnchorTargetQueryParam()
+ {
+ $res = $this->cycle('<a href="https://domain.com/page.php?foo=bar&target=baz">https://domain.com/page.php?foo=bar&target=baz</a>');
+ $this->assertContains(
+ '<a href="https://domain.com/page.php?foo=bar&amp;target=baz">https://domain.com/page.php?foo=bar&amp;target=baz</a>',
+ $res
+ );
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/CharacterReferenceTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/CharacterReferenceTest.php
new file mode 100644
index 000000000..a5eee73c8
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/CharacterReferenceTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * @file
+ * Test the Scanner. This requires the InputStream tests are all good.
+ */
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\CharacterReference;
+
+class CharacterReferenceTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ public function testLookupName()
+ {
+ $this->assertEquals('&', CharacterReference::lookupName('amp'));
+ $this->assertEquals('<', CharacterReference::lookupName('lt'));
+ $this->assertEquals('>', CharacterReference::lookupName('gt'));
+ $this->assertEquals('"', CharacterReference::lookupName('quot'));
+ $this->assertEquals('∌', CharacterReference::lookupName('NotReverseElement'));
+
+ $this->assertNull(CharacterReference::lookupName('StinkyCheese'));
+ }
+
+ public function testLookupHex()
+ {
+ $this->assertEquals('<', CharacterReference::lookupHex('3c'));
+ $this->assertEquals('<', CharacterReference::lookupHex('003c'));
+ $this->assertEquals('&', CharacterReference::lookupHex('26'));
+ $this->assertEquals('}', CharacterReference::lookupHex('7d'));
+ $this->assertEquals('Σ', CharacterReference::lookupHex('3A3'));
+ $this->assertEquals('Σ', CharacterReference::lookupHex('03A3'));
+ $this->assertEquals('Σ', CharacterReference::lookupHex('3a3'));
+ $this->assertEquals('Σ', CharacterReference::lookupHex('03a3'));
+ }
+
+ public function testLookupDecimal()
+ {
+ $this->assertEquals('&', CharacterReference::lookupDecimal(38));
+ $this->assertEquals('&', CharacterReference::lookupDecimal('38'));
+ $this->assertEquals('<', CharacterReference::lookupDecimal(60));
+ $this->assertEquals('Σ', CharacterReference::lookupDecimal(931));
+ $this->assertEquals('Σ', CharacterReference::lookupDecimal('0931'));
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/DOMTreeBuilderTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/DOMTreeBuilderTest.php
new file mode 100644
index 000000000..659378c68
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/DOMTreeBuilderTest.php
@@ -0,0 +1,743 @@
+<?php
+/**
+ * @file
+ * Test the Tree Builder.
+ */
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\Scanner;
+use Masterminds\HTML5\Parser\Tokenizer;
+use Masterminds\HTML5\Parser\DOMTreeBuilder;
+
+/**
+ * These tests are functional, not necessarily unit tests.
+ */
+class DOMTreeBuilderTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ protected $errors = array();
+
+ /**
+ * Convenience function for parsing.
+ */
+ protected function parse($string, array $options = array())
+ {
+ $treeBuilder = new DOMTreeBuilder(false, $options);
+ $scanner = new Scanner($string);
+ $parser = new Tokenizer($scanner, $treeBuilder);
+
+ $parser->parse();
+ $this->errors = $treeBuilder->getErrors();
+
+ return $treeBuilder->document();
+ }
+
+ /**
+ * Utility function for parsing a fragment of HTML5.
+ */
+ protected function parseFragment($string)
+ {
+ $treeBuilder = new DOMTreeBuilder(true);
+ $scanner = new Scanner($string);
+ $parser = new Tokenizer($scanner, $treeBuilder);
+
+ $parser->parse();
+ $this->errors = $treeBuilder->getErrors();
+
+ return $treeBuilder->fragment();
+ }
+
+ public function testDocument()
+ {
+ $html = '<!DOCTYPE html><html></html>';
+ $doc = $this->parse($html);
+
+ $this->assertEquals('UTF-8', $doc->encoding);
+ $this->assertInstanceOf('\DOMDocument', $doc);
+ $this->assertEquals('html', $doc->documentElement->tagName);
+ $this->assertEquals('http://www.w3.org/1999/xhtml', $doc->documentElement->namespaceURI);
+ }
+
+ public function testBareAmpersand()
+ {
+ $html = "<!doctype html>
+ <html>
+ <body>
+ <img src='a&b' />
+ <img src='a&=' />
+ <img src='a&=c' />
+ <img src='a&=9' />
+ </body>
+ </html>";
+ $doc = $this->parse($html);
+
+ $this->assertEmpty($this->errors);
+ $this->assertXmlStringEqualsXmlString('
+ <!DOCTYPE html>
+ <html xmlns="http://www.w3.org/1999/xhtml"><body>
+ <img src="a&amp;b"/>
+ <img src="a&amp;="/>
+ <img src="a&amp;=c"/>
+ <img src="a&amp;=9"/>
+ </body>
+ </html>', $doc->saveXML());
+ }
+
+ public function testBareAmpersandNotAllowedInAttributes()
+ {
+ $html = "<!doctype html>
+ <html>
+ <body>
+ <img src='a&' />
+ <img src='a&+' />
+ </body>
+ </html>";
+ $doc = $this->parse($html);
+
+ $this->assertCount(2, $this->errors);
+ $this->assertXmlStringEqualsXmlString('
+ <!DOCTYPE html>
+ <html xmlns="http://www.w3.org/1999/xhtml"><body>
+ <img src="a&amp;"/>
+ <img src="a&amp;+"/>
+ </body>
+ </html>', $doc->saveXML());
+ }
+
+ public function testBareAmpersandNotAllowedInBody()
+ {
+ $html = '<!doctype html>
+ <html>
+ <body>
+ a&b
+ a&=
+ a&=c
+ a&=9
+ a&+
+ a& -- valid
+ </body>
+ </html>';
+ $doc = $this->parse($html);
+
+ $this->assertCount(5, $this->errors);
+ $this->assertXmlStringEqualsXmlString('
+ <!DOCTYPE html>
+ <html xmlns="http://www.w3.org/1999/xhtml"><body>
+ a&amp;b
+ a&amp;=
+ a&amp;=c
+ a&amp;=9
+ a&amp;+
+ a&amp; -- valid
+ </body>
+ </html>', $doc->saveXML());
+ }
+
+ public function testEntityAtEndOfFile()
+ {
+ $fragment = $this->parseFragment('&#');
+ $this->assertInstanceOf('DOMDocumentFragment', $fragment);
+ $this->assertSame('&#', $fragment->textContent);
+ $this->assertEquals('Line 1, Col 2: Expected &#DEC; &#HEX;, got EOF', $this->errors[0]);
+ }
+
+ public function testStrangeCapitalization()
+ {
+ $html = '<!doctype html>
+ <html>
+ <head>
+ <Title>Hello, world!</TitlE>
+ </head>
+ <body>TheBody<script>foo</script></body>
+ </html>';
+ $doc = $this->parse($html);
+
+ $this->assertInstanceOf('\DOMDocument', $doc);
+ $this->assertEquals('html', $doc->documentElement->tagName);
+
+ $xpath = new \DOMXPath($doc);
+ $xpath->registerNamespace('x', 'http://www.w3.org/1999/xhtml');
+
+ $this->assertEquals('Hello, world!', $xpath->query('//x:title')->item(0)->nodeValue);
+ $this->assertEquals('foo', $xpath->query('//x:script')->item(0)->nodeValue);
+ }
+
+ public function testDocumentWithDisabledNamespaces()
+ {
+ $html = '<!DOCTYPE html><html></html>';
+ $doc = $this->parse($html, array('disable_html_ns' => true));
+
+ $this->assertInstanceOf('\DOMDocument', $doc);
+ $this->assertEquals('html', $doc->documentElement->tagName);
+ $this->assertNull($doc->documentElement->namespaceURI);
+ }
+
+ public function testDocumentWithATargetDocument()
+ {
+ $targetDom = new \DOMDocument();
+
+ $html = '<!DOCTYPE html><html></html>';
+ $doc = $this->parse($html, array('target_document' => $targetDom));
+
+ $this->assertInstanceOf('\DOMDocument', $doc);
+ $this->assertSame($doc, $targetDom);
+ $this->assertEquals('html', $doc->documentElement->tagName);
+ }
+
+ public function testDocumentFakeAttrAbsence()
+ {
+ $html = '<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><body>foo</body></html>';
+ $doc = $this->parse($html, array('xmlNamespaces' => true));
+
+ $xp = new \DOMXPath($doc);
+ $this->assertEquals(0, $xp->query('//@html5-php-fake-id-attribute')->length);
+ }
+
+ public function testFragment()
+ {
+ $html = '<div>test</div><span>test2</span>';
+ $doc = $this->parseFragment($html);
+
+ $this->assertInstanceOf('\DOMDocumentFragment', $doc);
+ $this->assertTrue($doc->hasChildNodes());
+ $this->assertEquals('div', $doc->childNodes->item(0)->tagName);
+ $this->assertEquals('test', $doc->childNodes->item(0)->textContent);
+ $this->assertEquals('span', $doc->childNodes->item(1)->tagName);
+ $this->assertEquals('test2', $doc->childNodes->item(1)->textContent);
+ }
+
+ public function testElements()
+ {
+ $html = '<!DOCTYPE html><html><head><title></title></head><body></body></html>';
+ $doc = $this->parse($html);
+ $root = $doc->documentElement;
+
+ $this->assertEquals('html', $root->tagName);
+ $this->assertEquals('html', $root->localName);
+ $this->assertEquals('html', $root->nodeName);
+
+ $this->assertEquals(2, $root->childNodes->length);
+ $kids = $root->childNodes;
+
+ $this->assertEquals('head', $kids->item(0)->tagName);
+ $this->assertEquals('body', $kids->item(1)->tagName);
+
+ $head = $kids->item(0);
+ $this->assertEquals(1, $head->childNodes->length);
+ $this->assertEquals('title', $head->childNodes->item(0)->tagName);
+ }
+
+ public function testImplicitNamespaces()
+ {
+ $dom = $this->parse('<!DOCTYPE html><html><body><a xlink:href="bar">foo</a></body></html>');
+ $a = $dom->getElementsByTagName('a')->item(0);
+ $attr = $a->getAttributeNode('xlink:href');
+ $this->assertEquals('http://www.w3.org/1999/xlink', $attr->namespaceURI);
+
+ $dom = $this->parse('<!DOCTYPE html><html><body><a xml:base="bar">foo</a></body></html>');
+ $a = $dom->getElementsByTagName('a')->item(0);
+ $attr = $a->getAttributeNode('xml:base');
+ $this->assertEquals('http://www.w3.org/XML/1998/namespace', $attr->namespaceURI);
+ }
+
+ public function testCustomImplicitNamespaces()
+ {
+ $dom = $this->parse('<!DOCTYPE html><html><body><a t:href="bar">foo</a></body></html>', array(
+ 'implicitNamespaces' => array(
+ 't' => 'http://www.example.com',
+ ),
+ ));
+ $a = $dom->getElementsByTagName('a')->item(0);
+ $attr = $a->getAttributeNode('t:href');
+ $this->assertEquals('http://www.example.com', $attr->namespaceURI);
+
+ $dom = $this->parse('<!DOCTYPE html><html><body><t:a>foo</t:a></body></html>', array(
+ 'implicitNamespaces' => array(
+ 't' => 'http://www.example.com',
+ ),
+ ));
+ $list = $dom->getElementsByTagNameNS('http://www.example.com', 'a');
+ $this->assertEquals(1, $list->length);
+ }
+
+ public function testXmlNamespaces()
+ {
+ $dom = $this->parse(
+ '<!DOCTYPE html><html>
+ <t:body xmlns:t="http://www.example.com">
+ <a t:href="bar">foo</a>
+ </body>
+ <div>foo</div>
+ </html>', array(
+ 'xmlNamespaces' => true,
+ ));
+ $a = $dom->getElementsByTagName('a')->item(0);
+ $attr = $a->getAttributeNode('t:href');
+ $this->assertEquals('http://www.example.com', $attr->namespaceURI);
+
+ $list = $dom->getElementsByTagNameNS('http://www.example.com', 'body');
+ $this->assertEquals(1, $list->length);
+ }
+
+ public function testXmlNamespaceNesting()
+ {
+ $dom = $this->parse(
+ '<!DOCTYPE html><html>
+ <body xmlns:x="http://www.prefixed.com" id="body">
+ <a id="bar1" xmlns="http://www.prefixed.com/bar1">
+ <b id="bar4" xmlns="http://www.prefixed.com/bar4"><x:prefixed id="prefixed"/></b>
+ </a>
+ <svg id="svg"></svg>
+ <c id="bar2" xmlns="http://www.prefixed.com/bar2"></c>
+ <div id="div"></div>
+ <d id="bar3"></d>
+ <xn:d xmlns:xn="http://www.prefixed.com/xn" xmlns="http://www.prefixed.com/bar5_x" id="bar5"><x id="bar5_x"/></xn:d>
+ </body>
+ </html>', array(
+ 'xmlNamespaces' => true,
+ ));
+
+ $this->assertEmpty($this->errors);
+
+ $div = $dom->getElementById('div');
+ $this->assertEquals('http://www.w3.org/1999/xhtml', $div->namespaceURI);
+
+ $body = $dom->getElementById('body');
+ $this->assertEquals('http://www.w3.org/1999/xhtml', $body->namespaceURI);
+
+ $bar1 = $dom->getElementById('bar1');
+ $this->assertEquals('http://www.prefixed.com/bar1', $bar1->namespaceURI);
+
+ $bar2 = $dom->getElementById('bar2');
+ $this->assertEquals('http://www.prefixed.com/bar2', $bar2->namespaceURI);
+
+ $bar3 = $dom->getElementById('bar3');
+ $this->assertEquals('http://www.w3.org/1999/xhtml', $bar3->namespaceURI);
+
+ $bar4 = $dom->getElementById('bar4');
+ $this->assertEquals('http://www.prefixed.com/bar4', $bar4->namespaceURI);
+
+ $svg = $dom->getElementById('svg');
+ $this->assertEquals('http://www.w3.org/2000/svg', $svg->namespaceURI);
+
+ $prefixed = $dom->getElementById('prefixed');
+ $this->assertEquals('http://www.prefixed.com', $prefixed->namespaceURI);
+
+ $prefixed = $dom->getElementById('bar5');
+ $this->assertEquals('http://www.prefixed.com/xn', $prefixed->namespaceURI);
+
+ $prefixed = $dom->getElementById('bar5_x');
+ $this->assertEquals('http://www.prefixed.com/bar5_x', $prefixed->namespaceURI);
+ }
+
+ public function testMoveNonInlineElements()
+ {
+ $doc = $this->parse('<p>line1<br/><hr/>line2</p>');
+ $this->assertEquals('<html xmlns="http://www.w3.org/1999/xhtml"><p>line1<br/></p><hr/>line2</html>', $doc->saveXML($doc->documentElement), 'Move non-inline elements outside of inline containers.');
+
+ $doc = $this->parse('<p>line1<div>line2</div></p>');
+ $this->assertEquals('<html xmlns="http://www.w3.org/1999/xhtml"><p>line1</p><div>line2</div></html>', $doc->saveXML($doc->documentElement), 'Move non-inline elements outside of inline containers.');
+ }
+
+ public function testAttributes()
+ {
+ $html = "<!DOCTYPE html>
+ <html>
+ <head><title></title></head>
+ <body id='a' class='b c'></body>
+ </html>";
+ $doc = $this->parse($html);
+ $root = $doc->documentElement;
+
+ $body = $root->GetElementsByTagName('body')->item(0);
+ $this->assertEquals('body', $body->tagName);
+ $this->assertTrue($body->hasAttributes());
+ $this->assertEquals('a', $body->getAttribute('id'));
+ $this->assertEquals('b c', $body->getAttribute('class'));
+
+ $body2 = $doc->getElementById('a');
+ $this->assertEquals('body', $body2->tagName);
+ $this->assertEquals('a', $body2->getAttribute('id'));
+ }
+
+ public function testSVGAttributes()
+ {
+ $html = "<!DOCTYPE html>
+ <html><body>
+ <svg width='150' viewbox='2'>
+ <rect textlength='2'/>
+ <animatecolor>foo</animatecolor>
+ </svg>
+ </body></html>";
+ $doc = $this->parse($html);
+ $root = $doc->documentElement;
+
+ $svg = $root->getElementsByTagName('svg')->item(0);
+ $this->assertTrue($svg->hasAttribute('viewBox'));
+
+ $rect = $root->getElementsByTagName('rect')->item(0);
+ $this->assertTrue($rect->hasAttribute('textLength'));
+
+ $ac = $root->getElementsByTagName('animateColor');
+ $this->assertEquals(1, $ac->length);
+ }
+
+ public function testMathMLAttribute()
+ {
+ $html = '<!doctype html>
+ <html lang="en">
+ <body>
+ <math>
+ <mi>x</mi>
+ <csymbol definitionurl="http://www.example.com/mathops/multiops.html#plusminus">
+ <mo>&PlusMinus;</mo>
+ </csymbol>
+ <mi>y</mi>
+ </math>
+ </body>
+ </html>';
+
+ $doc = $this->parse($html);
+ $root = $doc->documentElement;
+
+ $csymbol = $root->getElementsByTagName('csymbol')->item(0);
+ $this->assertTrue($csymbol->hasAttribute('definitionURL'));
+ }
+
+ public function testMissingHtmlTag()
+ {
+ $html = '<!DOCTYPE html><title>test</title>';
+ $doc = $this->parse($html);
+
+ $this->assertEquals('html', $doc->documentElement->tagName);
+ $this->assertEquals('title', $doc->documentElement->childNodes->item(0)->tagName);
+ }
+
+ public function testComment()
+ {
+ $html = '<html><!--Hello World.--></html>';
+
+ $doc = $this->parse($html);
+
+ $comment = $doc->documentElement->childNodes->item(0);
+ $this->assertEquals(XML_COMMENT_NODE, $comment->nodeType);
+ $this->assertEquals('Hello World.', $comment->data);
+
+ $html = '<!--Hello World.--><html></html>';
+ $doc = $this->parse($html);
+
+ $comment = $doc->childNodes->item(1);
+ $this->assertEquals(XML_COMMENT_NODE, $comment->nodeType);
+ $this->assertEquals('Hello World.', $comment->data);
+
+ $comment = $doc->childNodes->item(2);
+ $this->assertEquals(XML_ELEMENT_NODE, $comment->nodeType);
+ $this->assertEquals('html', $comment->tagName);
+ }
+
+ public function testCDATA()
+ {
+ $html = '<!DOCTYPE html><html><math><![CDATA[test]]></math></html>';
+ $doc = $this->parse($html);
+
+ $wrapper = $doc->getElementsByTagName('math')->item(0);
+ $this->assertEquals(1, $wrapper->childNodes->length);
+ $cdata = $wrapper->childNodes->item(0);
+ $this->assertEquals(XML_CDATA_SECTION_NODE, $cdata->nodeType);
+ $this->assertEquals('test', $cdata->data);
+ }
+
+ public function testText()
+ {
+ $html = '<!DOCTYPE html><html><head></head><body><math>test</math></body></html>';
+ $doc = $this->parse($html);
+
+ $wrapper = $doc->getElementsByTagName('math')->item(0);
+ $this->assertEquals(1, $wrapper->childNodes->length);
+ $data = $wrapper->childNodes->item(0);
+ $this->assertEquals(XML_TEXT_NODE, $data->nodeType);
+ $this->assertEquals('test', $data->data);
+
+ // The DomTreeBuilder has special handling for text when in before head mode.
+ $html = '<!DOCTYPE html><html>
+ Foo<head></head><body></body></html>';
+ $doc = $this->parse($html);
+ $this->assertEquals('Line 0, Col 0: Unexpected text. Ignoring: Foo', $this->errors[0]);
+ $headElement = $doc->documentElement->firstChild;
+ $this->assertEquals('head', $headElement->tagName);
+ }
+
+ public function testParseErrors()
+ {
+ $html = '<!DOCTYPE html><html><math><![CDATA[test';
+ $doc = $this->parse($html);
+
+ // We're JUST testing that we can access errors. Actual testing of
+ // error messages happen in the Tokenizer's tests.
+ $this->assertGreaterThan(0, count($this->errors));
+ $this->assertTrue(is_string($this->errors[0]));
+ }
+
+ public function testProcessingInstruction()
+ {
+ // Test the simple case, which is where PIs are inserted into the DOM.
+ $doc = $this->parse('<!DOCTYPE html><html><?foo bar?>');
+ $this->assertEquals(1, $doc->documentElement->childNodes->length);
+ $pi = $doc->documentElement->firstChild;
+ $this->assertInstanceOf('\DOMProcessingInstruction', $pi);
+ $this->assertEquals('foo', $pi->nodeName);
+ $this->assertEquals('bar', $pi->data);
+
+ // Leading xml PIs should be ignored.
+ $doc = $this->parse('<?xml version="1.0"?><!DOCTYPE html><html><head></head></html>');
+
+ $this->assertEquals(2, $doc->childNodes->length);
+ $this->assertInstanceOf('\DOMDocumentType', $doc->childNodes->item(0));
+ $this->assertInstanceOf('\DOMElement', $doc->childNodes->item(1));
+ }
+
+ public function testAutocloseP()
+ {
+ $html = '<!DOCTYPE html><html><body><p><figure></body></html>';
+ $doc = $this->parse($html);
+
+ $p = $doc->getElementsByTagName('p')->item(0);
+ $this->assertEquals(0, $p->childNodes->length);
+ $this->assertEquals('figure', $p->nextSibling->tagName);
+ }
+
+ public function testAutocloseLI()
+ {
+ $html = '<!doctype html>
+ <html lang="en">
+ <body>
+ <ul><li>Foo<li>Bar<li>Baz</ul>
+ </body>
+ </html>';
+
+ $doc = $this->parse($html);
+ $length = $doc->getElementsByTagName('ul')->item(0)->childNodes->length;
+ $this->assertEquals(3, $length);
+ }
+
+ public function testMathML()
+ {
+ $html = '<!doctype html>
+ <html lang="en">
+ <body>
+ <math xmlns="http://www.w3.org/1998/Math/MathML">
+ <mi>x</mi>
+ <csymbol definitionurl="http://www.example.com/mathops/multiops.html#plusminus">
+ <mo>&PlusMinus;</mo>
+ </csymbol>
+ <mi>y</mi>
+ </math>
+ </body>
+ </html>';
+
+ $doc = $this->parse($html);
+ $math = $doc->getElementsByTagName('math')->item(0);
+ $this->assertEquals('math', $math->tagName);
+ $this->assertEquals('math', $math->nodeName);
+ $this->assertEquals('math', $math->localName);
+ $this->assertEquals('http://www.w3.org/1998/Math/MathML', $math->namespaceURI);
+ }
+
+ public function testSVG()
+ {
+ $html = '<!doctype html>
+ <html lang="en">
+ <body>
+ <svg width="150" height="100" viewBox="0 0 3 2" xmlns="http://www.w3.org/2000/svg">
+ <rect width="1" height="2" x="2" fill="#d2232c" />
+ <text font-family="Verdana" font-size="32">
+ <textpath xlink:href="#Foo">
+ Test Text.
+ </textPath>
+ </text>
+ </svg>
+ </body>
+ </html>';
+
+ $doc = $this->parse($html);
+ $svg = $doc->getElementsByTagName('svg')->item(0);
+ $this->assertEquals('svg', $svg->tagName);
+ $this->assertEquals('svg', $svg->nodeName);
+ $this->assertEquals('svg', $svg->localName);
+ $this->assertEquals('http://www.w3.org/2000/svg', $svg->namespaceURI);
+
+ $textPath = $doc->getElementsByTagName('textPath')->item(0);
+ $this->assertEquals('textPath', $textPath->tagName);
+ }
+
+ public function testNoScript()
+ {
+ $html = '<!DOCTYPE html><html><head><noscript>No JS</noscript></head></html>';
+ $doc = $this->parse($html);
+ $this->assertEmpty($this->errors);
+ $noscript = $doc->getElementsByTagName('noscript')->item(0);
+ $this->assertEquals('noscript', $noscript->tagName);
+
+ $html = '<!DOCTYPE html><html><body><noscript><p>No JS</p></noscript></body></html>';
+ $doc = $this->parse($html);
+ $this->assertEmpty($this->errors);
+ $p = $doc->getElementsByTagName('p')->item(0);
+ $this->assertEquals('p', $p->tagName);
+ }
+
+ /**
+ * Regression for issue #13.
+ */
+ public function testRegressionHTMLNoBody()
+ {
+ $html = '<!DOCTYPE html><html><span id="test">Test</span></html>';
+ $doc = $this->parse($html);
+ $span = $doc->getElementById('test');
+
+ $this->assertEmpty($this->errors);
+
+ $this->assertEquals('span', $span->tagName);
+ $this->assertEquals('Test', $span->textContent);
+ }
+
+ public function testInstructionProcessor()
+ {
+ $string = '<!DOCTYPE html><html><?foo bar ?></html>';
+
+ $treeBuilder = new DOMTreeBuilder();
+ $is = new InstructionProcessorMock();
+ $treeBuilder->setInstructionProcessor($is);
+
+ $scanner = new Scanner($string);
+ $parser = new Tokenizer($scanner, $treeBuilder);
+
+ $parser->parse();
+ $dom = $treeBuilder->document();
+ $div = $dom->getElementsByTagName('div')->item(0);
+
+ $this->assertEquals(1, $is->count);
+ $this->assertEquals('foo', $is->name);
+ $this->assertEquals('bar ', $is->data);
+ $this->assertEquals('div', $div->tagName);
+ $this->assertEquals('foo', $div->textContent);
+ }
+
+ public function testSelectGroupedOptions()
+ {
+ $html = <<<EOM
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>testSelectGroupedOptions</title>
+ </head>
+ <body>
+ <select>
+ <optgroup id="first" label="first">
+ <option value="foo">foo</option>
+ <option value="bar">bar</option>
+ <option value="baz">baz</option>
+ </optgroup>
+ <optgroup id="second" label="second">
+ <option value="lorem">lorem</option>
+ <option value="ipsum">ipsum</option>
+ </optgroup>
+ </select>
+ </body>
+</html>
+EOM;
+ $dom = $this->parse($html);
+
+ $this->assertSame(3, $dom->getElementById('first')->getElementsByTagName('option')->length);
+ $this->assertSame(2, $dom->getElementById('second')->getElementsByTagName('option')->length);
+ }
+
+ public function testVoidTag()
+ {
+ $html = <<<EOM
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>testVoidTag</title>
+ <meta>
+ <meta>
+ </head>
+ <body></body>
+</html>
+EOM;
+
+ $dom = $this->parse($html);
+ $this->assertSame(2, $dom->getElementsByTagName('meta')->length);
+ $this->assertSame(0, $dom->getElementsByTagName('meta')->item(0)->childNodes->length);
+ $this->assertSame(0, $dom->getElementsByTagName('meta')->item(1)->childNodes->length);
+ }
+
+ public function testIgnoreSelfClosingTag()
+ {
+ $html = <<<EOM
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>testIllegalSelfClosingTag</title>
+ </head>
+ <body>
+ <div /><span>Hello, World!</span></div>
+ </body>
+</html>
+EOM;
+
+ $dom = $this->parse($html);
+ $this->assertSame(1, $dom->getElementsByTagName('div')->item(0)->childNodes->length);
+ }
+
+ public function testIAudioInParagraph()
+ {
+ $html = <<<EOM
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>testIllegalSelfClosingTag</title>
+ </head>
+ <body>
+ <p>
+ <audio preload="none" controls="controls">
+ <source src="https://example.com/test.mp3" type="audio/mpeg" />
+ Your browser does not support the audio element.
+ </audio>
+ </p>
+ </body>
+</html>>
+</html>
+EOM;
+
+ $dom = $this->parse($html);
+ $audio = $dom->getElementsByTagName('audio')->item(0);
+
+ $this->assertSame('p', $audio->parentNode->nodeName);
+ $this->assertSame(3, $audio->childNodes->length);
+ }
+
+ public function testClosingBr()
+ {
+ $html = <<<EOM
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>testClosingBr</title>
+ </head>
+ <body>
+ <p>
+ This line ends with a normal line break <br class="attribute-should-be-retained">
+ This line ends with a line break marked up as a closing tag </br class="attribute-should-be-discarded">
+ </p>
+ </body>
+</html>>
+</html>
+EOM;
+
+ $dom = $this->parse($html);
+
+ $this->assertSame(2, $dom->getElementsByTagName('br')->length);
+ $this->assertSame(1, $dom->getElementsByTagName('br')->item(0)->attributes->length);
+ $this->assertSame(0, $dom->getElementsByTagName('br')->item(1)->attributes->length);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStack.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStack.php
new file mode 100644
index 000000000..3d1de7708
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStack.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Elements;
+use Masterminds\HTML5\Parser\EventHandler;
+
+/**
+ * This testing class gathers events from a parser and builds a stack of events.
+ * It is useful for checking the output of a tokenizer.
+ *
+ * IMPORTANT:
+ *
+ * The startTag event also kicks the parser into TEXT_RAW when it encounters
+ * script or pre tags. This is to match the behavior required by the HTML5 spec,
+ * which says that the tree builder must tell the tokenizer when to switch states.
+ */
+class EventStack implements EventHandler
+{
+ protected $stack;
+
+ public function __construct()
+ {
+ $this->stack = array();
+ }
+
+ /**
+ * Get the event stack.
+ */
+ public function events()
+ {
+ return $this->stack;
+ }
+
+ public function depth()
+ {
+ return count($this->stack);
+ }
+
+ public function get($index)
+ {
+ return $this->stack[$index];
+ }
+
+ protected function store($event, $data = null)
+ {
+ $this->stack[] = array(
+ 'name' => $event,
+ 'data' => $data,
+ );
+ }
+
+ public function doctype($name, $type = 0, $id = null, $quirks = false)
+ {
+ $args = array(
+ $name,
+ $type,
+ $id,
+ $quirks,
+ );
+ $this->store('doctype', $args);
+ }
+
+ public function startTag($name, $attributes = array(), $selfClosing = false)
+ {
+ $args = func_get_args();
+ $this->store('startTag', $args);
+ if ('pre' == $name || 'script' == $name) {
+ return Elements::TEXT_RAW;
+ }
+ }
+
+ public function endTag($name)
+ {
+ $this->store('endTag', array(
+ $name,
+ ));
+ }
+
+ public function comment($cdata)
+ {
+ $this->store('comment', array(
+ $cdata,
+ ));
+ }
+
+ public function cdata($data)
+ {
+ $this->store('cdata', func_get_args());
+ }
+
+ public function text($cdata)
+ {
+ // fprintf(STDOUT, "Received TEXT event with: " . $cdata);
+ $this->store('text', array(
+ $cdata,
+ ));
+ }
+
+ public function eof()
+ {
+ $this->store('eof');
+ }
+
+ public function parseError($msg, $line, $col)
+ {
+ // throw new EventStackParseError(sprintf("%s (line %d, col %d)", $msg, $line, $col));
+ // $this->store(sprintf("%s (line %d, col %d)", $msg, $line, $col));
+ $this->store('error', func_get_args());
+ }
+
+ public function processingInstruction($name, $data = null)
+ {
+ $this->store('pi', func_get_args());
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStackError.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStackError.php
new file mode 100644
index 000000000..05c0a498f
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/EventStackError.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+class EventStackError extends \Exception
+{
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/InstructionProcessorMock.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/InstructionProcessorMock.php
new file mode 100644
index 000000000..4637a802c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/InstructionProcessorMock.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+class InstructionProcessorMock implements \Masterminds\HTML5\InstructionProcessor
+{
+ public $name = null;
+
+ public $data = null;
+
+ public $count = 0;
+
+ public function process(\DOMElement $element, $name, $data)
+ {
+ $this->name = $name;
+ $this->data = $data;
+ ++$this->count;
+
+ $div = $element->ownerDocument->createElement('div');
+ $div->nodeValue = 'foo';
+
+ $element->appendChild($div);
+
+ return $div;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/ScannerTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/ScannerTest.php
new file mode 100644
index 000000000..9f75c4dba
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/ScannerTest.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * @file
+ * Test the Scanner. This requires the InputStream tests are all good.
+ */
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\StringInputStream;
+use Masterminds\HTML5\Parser\Scanner;
+
+class ScannerTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ /**
+ * A canary test to make sure the basics are setup and working.
+ */
+ public function testConstructDeprecated()
+ {
+ $is = new StringInputStream('abc');
+ $s = new Scanner($is);
+
+ $this->assertInstanceOf('\Masterminds\HTML5\Parser\Scanner', $s);
+ }
+
+ public function testConstruct()
+ {
+ $this->assertInstanceOf('\Masterminds\HTML5\Parser\Scanner', new Scanner('abc'));
+ }
+
+ public function testNextDeprecated()
+ {
+ $s = new Scanner(new StringInputStream('abc'));
+
+ $this->assertEquals('b', $s->next());
+ $this->assertEquals('c', $s->next());
+ }
+
+ public function testNext()
+ {
+ $s = new Scanner('abc');
+
+ $this->assertEquals('b', $s->next());
+ $this->assertEquals('c', $s->next());
+ }
+
+ public function testPosition()
+ {
+ $s = new Scanner('abc');
+
+ $this->assertEquals(0, $s->position());
+
+ $s->next();
+ $this->assertEquals(1, $s->position());
+ }
+
+ public function testPeek()
+ {
+ $s = new Scanner('abc');
+
+ $this->assertEquals('b', $s->peek());
+
+ $s->next();
+ $this->assertEquals('c', $s->peek());
+ }
+
+ public function testCurrent()
+ {
+ $s = new Scanner('abc');
+
+ // Before scanning the string begins the current is empty.
+ $this->assertEquals('a', $s->current());
+
+ $c = $s->next();
+ $this->assertEquals('b', $s->current());
+
+ // Test movement through the string.
+ $c = $s->next();
+ $this->assertEquals('c', $s->current());
+ }
+
+ public function testUnconsume()
+ {
+ $s = new Scanner('abcdefghijklmnopqrst');
+
+ // Get initial position.
+ $s->next();
+ $start = $s->position();
+
+ // Move forward a bunch of positions.
+ $amount = 7;
+ for ($i = 0; $i < $amount; ++$i) {
+ $s->next();
+ }
+
+ // Roll back the amount we moved forward.
+ $s->unconsume($amount);
+
+ $this->assertEquals($start, $s->position());
+ }
+
+ public function testGetHex()
+ {
+ $s = new Scanner('ab13ck45DE*');
+
+ $this->assertEquals('ab13c', $s->getHex());
+
+ $s->next();
+ $this->assertEquals('45DE', $s->getHex());
+ }
+
+ public function testGetAsciiAlpha()
+ {
+ $s = new Scanner('abcdef1%mnop*');
+
+ $this->assertEquals('abcdef', $s->getAsciiAlpha());
+
+ // Move past the 1% to scan the next group of text.
+ $s->next();
+ $s->next();
+ $this->assertEquals('mnop', $s->getAsciiAlpha());
+ }
+
+ public function testGetAsciiAlphaNum()
+ {
+ $s = new Scanner('abcdef1ghpo#mn94op');
+
+ $this->assertEquals('abcdef1ghpo', $s->getAsciiAlphaNum());
+
+ // Move past the # to scan the next group of text.
+ $s->next();
+ $this->assertEquals('mn94op', $s->getAsciiAlphaNum());
+ }
+
+ public function testGetNumeric()
+ {
+ $s = new Scanner('1784a 45 9867 #');
+
+ $this->assertEquals('1784', $s->getNumeric());
+
+ // Move past the 'a ' to scan the next group of text.
+ $s->next();
+ $s->next();
+ $this->assertEquals('45', $s->getNumeric());
+ }
+
+ public function testCurrentLine()
+ {
+ $s = new Scanner("1784a\n45\n9867 #\nThis is a test.");
+
+ $this->assertEquals(1, $s->currentLine());
+
+ // Move to the next line.
+ $s->getAsciiAlphaNum();
+ $s->next();
+ $this->assertEquals(2, $s->currentLine());
+ }
+
+ public function testColumnOffset()
+ {
+ $s = new Scanner("1784a a\n45 9867 #\nThis is a test.");
+
+ // Move the pointer to the space.
+ $s->getAsciiAlphaNum();
+ $this->assertEquals(5, $s->columnOffset());
+
+ // We move the pointer ahead. There must be a better way to do this.
+ $s->next();
+ $s->next();
+ $s->next();
+ $s->next();
+ $s->next();
+ $s->next();
+ $this->assertEquals(3, $s->columnOffset());
+ }
+
+ public function testRemainingChars()
+ {
+ $string = "\n45\n9867 #\nThis is a test.";
+ $s = new Scanner("1784a\n45\n9867 #\nThis is a test.");
+
+ $s->getAsciiAlphaNum();
+ $this->assertEquals($string, $s->remainingChars());
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TokenizerTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TokenizerTest.php
new file mode 100644
index 000000000..5284d30df
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TokenizerTest.php
@@ -0,0 +1,978 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\UTF8Utils;
+use Masterminds\HTML5\Parser\Scanner;
+use Masterminds\HTML5\Parser\Tokenizer;
+
+class TokenizerTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ // ================================================================
+ // Additional assertions.
+ // ================================================================
+
+ /**
+ * Tests that an event matches both the event type and the expected value.
+ *
+ * @param string $type
+ * Expected event type
+ * @param string $expects
+ * The value expected in $event['data'][0]
+ */
+ public function assertEventEquals($type, $expects, $event)
+ {
+ $this->assertEquals($type, $event['name'], "Event $type for " . print_r($event, true));
+ if (is_array($expects)) {
+ $this->assertEquals($expects, $event['data'], "Event $type should equal " . print_r($expects, true) . ': ' . print_r($event, true));
+ } else {
+ $d = (is_array($event['data']) ? $event['data'][0] : null);
+ $this->assertEquals($expects, $d, "Event $type should equal $expects: " . print_r($event, true));
+ }
+ }
+
+ /**
+ * Assert that a given event is 'error'.
+ */
+ public function assertEventError($event)
+ {
+ $this->assertEquals('error', $event['name'], 'Expected error for event: ' . print_r($event, true));
+ }
+
+ /**
+ * Asserts that all of the tests are good.
+ *
+ * This loops through a map of tests/expectations and runs a few assertions on each test.
+ *
+ * Checks:
+ * - depth (if depth is > 0)
+ * - event name
+ * - matches on event 0.
+ */
+ protected function isAllGood($name, $depth, $tests, $debug = false)
+ {
+ foreach ($tests as $try => $expects) {
+ if ($debug) {
+ fprintf(STDOUT, "%s expects %s\n", $try, print_r($expects, true));
+ }
+ $e = $this->parse($try);
+ if ($depth > 0) {
+ $this->assertEquals($depth, $e->depth(), "Expected depth $depth for test $try." . print_r($e, true));
+ }
+ $this->assertEventEquals($name, $expects, $e->get(0));
+ }
+ }
+
+ // ================================================================
+ // Utility functions.
+ // ================================================================
+ public function testParse()
+ {
+ list($tok, $events) = $this->createTokenizer('');
+
+ $tok->parse();
+ $e1 = $events->get(0);
+
+ $this->assertEquals(1, $events->Depth());
+ $this->assertEquals('eof', $e1['name']);
+ }
+
+ public function testWhitespace()
+ {
+ $spaces = ' ';
+ list($tok, $events) = $this->createTokenizer($spaces);
+
+ $tok->parse();
+
+ $this->assertEquals(2, $events->depth());
+
+ $e1 = $events->get(0);
+
+ $this->assertEquals('text', $e1['name']);
+ $this->assertEquals($spaces, $e1['data'][0]);
+ }
+
+ public function testCharacterReference()
+ {
+ $good = array(
+ '&amp;' => '&',
+ '&#x0003c;' => '<',
+ '&#38;' => '&',
+ '&' => '&',
+ );
+ $this->isAllGood('text', 2, $good);
+
+ // Test with broken charref
+ $str = '&foo';
+ $events = $this->parse($str);
+ $e1 = $events->get(0);
+ $this->assertEquals('error', $e1['name']);
+
+ $str = '&#xfoo';
+ $events = $this->parse($str);
+ $e1 = $events->get(0);
+ $this->assertEquals('error', $e1['name']);
+
+ $str = '&#foo';
+ $events = $this->parse($str);
+ $e1 = $events->get(0);
+ $this->assertEquals('error', $e1['name']);
+
+ // FIXME: Once the text processor is done, need to verify that the
+ // tokens are transformed correctly into text.
+ }
+
+ public function testBogusComment()
+ {
+ $bogus = array(
+ '</+this is a bogus comment. +>',
+ '<!+this is a bogus comment. !>',
+ '<!D OCTYPE foo bar>',
+ '<!DOCTYEP foo bar>',
+ '<![CADATA[ TEST ]]>',
+ '<![CDATA Hello ]]>',
+ '<![CDATA[ Hello [[>',
+ '<!CDATA[[ test ]]>',
+ '<![CDATA[',
+ '<![CDATA[hellooooo hello',
+ '<? Hello World ?>',
+ '<? Hello World',
+ );
+ foreach ($bogus as $str) {
+ $events = $this->parse($str);
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('comment', $str, $events->get(1));
+ }
+ }
+
+ public function testEndTag()
+ {
+ $succeed = array(
+ '</a>' => 'a',
+ '</test>' => 'test',
+ '</test
+ >' => 'test',
+ '</thisIsTheTagThatDoesntEndItJustGoesOnAndOnMyFriend>' => 'thisisthetagthatdoesntenditjustgoesonandonmyfriend',
+ // See 8.2.4.10, which requires this and does not say error.
+ '</a<b>' => 'a<b',
+ );
+ $this->isAllGood('endTag', 2, $succeed);
+
+ // Recoverable failures
+ $fail = array(
+ '</a class="monkey">' => 'a',
+ '</a <b>' => 'a',
+ '</a <b <c>' => 'a',
+ '</a is the loneliest letter>' => 'a',
+ '</a' => 'a',
+ );
+ foreach ($fail as $test => $result) {
+ $events = $this->parse($test);
+ $this->assertEquals(3, $events->depth());
+ // Should have triggered an error.
+ $this->assertEventError($events->get(0));
+ // Should have tried to parse anyway.
+ $this->assertEventEquals('endTag', $result, $events->get(1));
+ }
+
+ // BogoComments
+ $comments = array(
+ '</>' => '</>',
+ '</ >' => '</ >',
+ '</ a>' => '</ a>',
+ );
+ foreach ($comments as $test => $result) {
+ $events = $this->parse($test);
+ $this->assertEquals(3, $events->depth());
+
+ // Should have triggered an error.
+ $this->assertEventError($events->get(0));
+
+ // Should have tried to parse anyway.
+ $this->assertEventEquals('comment', $result, $events->get(1));
+ }
+ }
+
+ public function testComment()
+ {
+ $good = array(
+ '<!--easy-->' => 'easy',
+ '<!-- 1 > 0 -->' => ' 1 > 0 ',
+ '<!-- --$i -->' => ' --$i ',
+ '<!----$i-->' => '--$i',
+ "<!--\nHello World.\na-->" => "\nHello World.\na",
+ '<!-- <!-- -->' => ' <!-- ',
+ );
+ foreach ($good as $test => $expected) {
+ $events = $this->parse($test);
+ $this->assertEventEquals('comment', $expected, $events->get(0));
+ }
+
+ $fail = array(
+ '<!-->' => '',
+ '<!--Hello' => 'Hello',
+ "<!--\0Hello" => UTF8Utils::FFFD . 'Hello',
+ '<!--' => '',
+ );
+ foreach ($fail as $test => $expected) {
+ $events = $this->parse($test);
+ $this->assertEquals(3, $events->depth());
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('comment', $expected, $events->get(1));
+ }
+ }
+
+ public function testCDATASection()
+ {
+ $good = array(
+ '<![CDATA[ This is a test. ]]>' => ' This is a test. ',
+ '<![CDATA[CDATA]]>' => 'CDATA',
+ '<![CDATA[ ]] > ]]>' => ' ]] > ',
+ '<![CDATA[ ]]>' => ' ',
+ );
+ $this->isAllGood('cdata', 2, $good);
+ }
+
+ public function testDoctype()
+ {
+ $good = array(
+ '<!DOCTYPE html>' => array(
+ 'html',
+ 0,
+ null,
+ false,
+ ),
+ '<!doctype html>' => array(
+ 'html',
+ 0,
+ null,
+ false,
+ ),
+ '<!DocType html>' => array(
+ 'html',
+ 0,
+ null,
+ false,
+ ),
+ "<!DOCTYPE\nhtml>" => array(
+ 'html',
+ 0,
+ null,
+ false,
+ ),
+ "<!DOCTYPE\fhtml>" => array(
+ 'html',
+ 0,
+ null,
+ false,
+ ),
+ '<!DOCTYPE html PUBLIC "foo bar">' => array(
+ 'html',
+ EventStack::DOCTYPE_PUBLIC,
+ 'foo bar',
+ false,
+ ),
+ "<!DOCTYPE html PUBLIC 'foo bar'>" => array(
+ 'html',
+ EventStack::DOCTYPE_PUBLIC,
+ 'foo bar',
+ false,
+ ),
+ '<!DOCTYPE html PUBLIC "foo bar" >' => array(
+ 'html',
+ EventStack::DOCTYPE_PUBLIC,
+ 'foo bar',
+ false,
+ ),
+ "<!DOCTYPE html \nPUBLIC\n'foo bar'>" => array(
+ 'html',
+ EventStack::DOCTYPE_PUBLIC,
+ 'foo bar',
+ false,
+ ),
+ '<!DOCTYPE html SYSTEM "foo bar">' => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo bar',
+ false,
+ ),
+ "<!DOCTYPE html SYSTEM 'foo bar'>" => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo bar',
+ false,
+ ),
+ '<!DOCTYPE html SYSTEM "foo/bar" >' => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo/bar',
+ false,
+ ),
+ "<!DOCTYPE html \nSYSTEM\n'foo bar'>" => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo bar',
+ false,
+ ),
+ );
+ $this->isAllGood('doctype', 2, $good);
+
+ $bad = array(
+ '<!DOCTYPE>' => array(
+ null,
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE >' => array(
+ null,
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo PUB' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo PUB>' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo PUB "Looks good">' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo SYSTME "Looks good"' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+
+ // Can't tell whether these are ids or ID types, since the context is chopped.
+ '<!DOCTYPE foo PUBLIC' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo PUBLIC>' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo SYSTEM' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+ '<!DOCTYPE foo SYSTEM>' => array(
+ 'foo',
+ EventStack::DOCTYPE_NONE,
+ null,
+ true,
+ ),
+
+ '<!DOCTYPE html SYSTEM "foo bar"' => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo bar',
+ true,
+ ),
+ '<!DOCTYPE html SYSTEM "foo bar" more stuff>' => array(
+ 'html',
+ EventStack::DOCTYPE_SYSTEM,
+ 'foo bar',
+ true,
+ ),
+ );
+ foreach ($bad as $test => $expects) {
+ $events = $this->parse($test);
+ // fprintf(STDOUT, $test . PHP_EOL);
+ $this->assertEquals(3, $events->depth(), "Counting events for '$test': " . print_r($events, true));
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('doctype', $expects, $events->get(1));
+ }
+ }
+
+ public function testProcessorInstruction()
+ {
+ $good = array(
+ '<?hph ?>' => 'hph',
+ '<?hph echo "Hello World"; ?>' => array(
+ 'hph',
+ 'echo "Hello World"; ',
+ ),
+ "<?hph \necho 'Hello World';\n?>" => array(
+ 'hph',
+ "echo 'Hello World';\n",
+ ),
+ );
+ $this->isAllGood('pi', 2, $good);
+ }
+
+ /**
+ * This tests just simple tags.
+ */
+ public function testSimpleTags()
+ {
+ $open = array(
+ '<foo>' => 'foo',
+ '<FOO>' => 'foo',
+ '<fOO>' => 'foo',
+ '<foo >' => 'foo',
+ "<foo\n\n\n\n>" => 'foo',
+ '<foo:bar>' => 'foo:bar',
+ );
+ $this->isAllGood('startTag', 2, $open);
+
+ $selfClose = array(
+ '<foo/>' => 'foo',
+ '<FOO/>' => 'foo',
+ '<foo />' => 'foo',
+ "<foo\n\n\n\n/>" => 'foo',
+ '<foo:bar/>' => 'foo:bar',
+ );
+ foreach ($selfClose as $test => $expects) {
+ $events = $this->parse($test);
+ $this->assertEquals(2, $events->depth(), "Counting events for '$test'" . print_r($events, true));
+ $this->assertEventEquals('startTag', $expects, $events->get(0));
+ $event = $events->get(0);
+ $this->assertTrue($event['data'][2]);
+ }
+
+ $bad = array(
+ '<foo' => 'foo',
+ '<foo ' => 'foo',
+ '<foo/' => 'foo',
+ '<foo /' => 'foo',
+ );
+
+ foreach ($bad as $test => $expects) {
+ $events = $this->parse($test);
+ $this->assertEquals(3, $events->depth(), "Counting events for '$test': " . print_r($events, true));
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', $expects, $events->get(1));
+ }
+ }
+
+ public function testTagsWithAttributeAndMissingName()
+ {
+ $cases = array(
+ '<id="top_featured">' => 'id',
+ '<color="white">' => 'color',
+ "<class='neaktivni_stranka'>" => 'class',
+ '<bgcolor="white">' => 'bgcolor',
+ '<class="nom">' => 'class',
+ );
+
+ foreach ($cases as $html => $expected) {
+ $events = $this->parse($html);
+ $this->assertEventError($events->get(0));
+ $this->assertEventError($events->get(1));
+ $this->assertEventError($events->get(2));
+ $this->assertEventEquals('startTag', $expected, $events->get(3));
+ $this->assertEventEquals('eof', null, $events->get(4));
+ }
+ }
+
+ public function testTagNotClosedAfterTagName()
+ {
+ $cases = array(
+ '<noscript<img>' => array(
+ 'noscript',
+ 'img',
+ ),
+ '<center<a>' => array(
+ 'center',
+ 'a',
+ ),
+ '<br<br>' => array(
+ 'br',
+ 'br',
+ ),
+ );
+
+ foreach ($cases as $html => $expected) {
+ $events = $this->parse($html);
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', $expected[0], $events->get(1));
+ $this->assertEventEquals('startTag', $expected[1], $events->get(2));
+ $this->assertEventEquals('eof', null, $events->get(3));
+ }
+
+ $events = $this->parse('<span<>02</span>');
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', 'span', $events->get(1));
+ $this->assertEventError($events->get(2));
+ $this->assertEventEquals('text', '>02', $events->get(3));
+ $this->assertEventEquals('endTag', 'span', $events->get(4));
+ $this->assertEventEquals('eof', null, $events->get(5));
+
+ $events = $this->parse('<p</p>');
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', 'p', $events->get(1));
+ $this->assertEventEquals('endTag', 'p', $events->get(2));
+ $this->assertEventEquals('eof', null, $events->get(3));
+
+ $events = $this->parse('<strong><WordPress</strong>');
+ $this->assertEventEquals('startTag', 'strong', $events->get(0));
+ $this->assertEventError($events->get(1));
+ $this->assertEventEquals('startTag', 'wordpress', $events->get(2));
+ $this->assertEventEquals('endTag', 'strong', $events->get(3));
+ $this->assertEventEquals('eof', null, $events->get(4));
+
+ $events = $this->parse('<src=<a>');
+ $this->assertEventError($events->get(0));
+ $this->assertEventError($events->get(1));
+ $this->assertEventError($events->get(2));
+ $this->assertEventEquals('startTag', 'src', $events->get(3));
+ $this->assertEventEquals('startTag', 'a', $events->get(4));
+ $this->assertEventEquals('eof', null, $events->get(5));
+
+ $events = $this->parse('<br...<a>');
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', 'br', $events->get(1));
+ $this->assertEventEquals('eof', null, $events->get(2));
+ }
+
+ public function testIllegalTagNames()
+ {
+ $cases = array(
+ '<li">' => 'li',
+ '<p">' => 'p',
+ '<b&nbsp; >' => 'b',
+ '<static*all>' => 'static',
+ '<h*0720/>' => 'h',
+ '<st*ATTRIBUTE />' => 'st',
+ );
+
+ foreach ($cases as $html => $expected) {
+ $events = $this->parse($html);
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', $expected, $events->get(1));
+ }
+ }
+
+ public function testTagAttributes()
+ {
+ // Opening tags.
+ $good = array(
+ '<foo bar="baz">' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ false,
+ ),
+ '<foo bar=" baz ">' => array(
+ 'foo',
+ array(
+ 'bar' => ' baz ',
+ ),
+ false,
+ ),
+ "<foo bar=\"\nbaz\n\">" => array(
+ 'foo',
+ array(
+ 'bar' => "\nbaz\n",
+ ),
+ false,
+ ),
+ "<foo bar='baz'>" => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ false,
+ ),
+ '<foo bar="A full sentence.">' => array(
+ 'foo',
+ array(
+ 'bar' => 'A full sentence.',
+ ),
+ false,
+ ),
+ "<foo a='1' b=\"2\">" => array(
+ 'foo',
+ array(
+ 'a' => '1',
+ 'b' => '2',
+ ),
+ false,
+ ),
+ "<foo ns:bar='baz'>" => array(
+ 'foo',
+ array(
+ 'ns:bar' => 'baz',
+ ),
+ false,
+ ),
+ "<foo a='blue&red'>" => array(
+ 'foo',
+ array(
+ 'a' => 'blue&red',
+ ),
+ false,
+ ),
+ "<foo a='blue&amp;red'>" => array(
+ 'foo',
+ array(
+ 'a' => 'blue&red',
+ ),
+ false,
+ ),
+ "<foo a='blue&&amp;&red'>" => array(
+ 'foo',
+ array(
+ 'a' => 'blue&&&red',
+ ),
+ false,
+ ),
+ "<foo a='blue&&amp;red'>" => array(
+ 'foo',
+ array(
+ 'a' => 'blue&&red',
+ ),
+ false,
+ ),
+ "<foo\nbar='baz'\n>" => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ false,
+ ),
+ '<doe a deer>' => array(
+ 'doe',
+ array(
+ 'a' => null,
+ 'deer' => null,
+ ),
+ false,
+ ),
+ '<foo bar=baz>' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ false,
+ ),
+
+ // Updated for 8.1.2.3
+ '<foo bar = "baz" >' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ false,
+ ),
+
+ // The spec allows an unquoted value '/'. This will not be a closing
+ // tag.
+ '<foo bar=/>' => array(
+ 'foo',
+ array(
+ 'bar' => '/',
+ ),
+ false,
+ ),
+ '<foo bar=baz/>' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz/',
+ ),
+ false,
+ ),
+ );
+ $this->isAllGood('startTag', 2, $good);
+
+ // Self-closing tags.
+ $withEnd = array(
+ '<foo bar="baz"/>' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ true,
+ ),
+ '<foo BAR="baz"/>' => array(
+ 'foo',
+ array(
+ 'bar' => 'baz',
+ ),
+ true,
+ ),
+ '<foo BAR="BAZ"/>' => array(
+ 'foo',
+ array(
+ 'bar' => 'BAZ',
+ ),
+ true,
+ ),
+ "<foo a='1' b=\"2\" c=3 d/>" => array(
+ 'foo',
+ array(
+ 'a' => '1',
+ 'b' => '2',
+ 'c' => '3',
+ 'd' => null,
+ ),
+ true,
+ ),
+ );
+ $this->isAllGood('startTag', 2, $withEnd);
+
+ // Cause a parse error.
+ $bad = array(
+ // This will emit an entity lookup failure for &+dark.
+ "<foo a='blue&+dark'>" => array(
+ 'foo',
+ array(
+ 'a' => 'blue&+dark',
+ ),
+ false,
+ ),
+ '<foo bar=>' => array(
+ 'foo',
+ array(
+ 'bar' => null,
+ ),
+ false,
+ ),
+ '<foo bar="oh' => array(
+ 'foo',
+ array(
+ 'bar' => 'oh',
+ ),
+ false,
+ ),
+ '<foo bar=oh">' => array(
+ 'foo',
+ array(
+ 'bar' => 'oh"',
+ ),
+ false,
+ ),
+
+ // these attributes are ignored because of current implementation
+ // of method "DOMElement::setAttribute"
+ // see issue #23: https://github.com/Masterminds/html5-php/issues/23
+ '<foo b"="baz">' => array(
+ 'foo',
+ array(),
+ false,
+ ),
+ '<foo 2abc="baz">' => array(
+ 'foo',
+ array(),
+ false,
+ ),
+ '<foo ?="baz">' => array(
+ 'foo',
+ array(),
+ false,
+ ),
+ '<foo foo?bar="baz">' => array(
+ 'foo',
+ array(),
+ false,
+ ),
+ )
+ ;
+ foreach ($bad as $test => $expects) {
+ $events = $this->parse($test);
+ $this->assertEquals(3, $events->depth(), "Counting events for '$test': " . print_r($events, true));
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', $expects, $events->get(1));
+ }
+
+ // Cause multiple parse errors.
+ $reallyBad = array(
+ '<foo ="bar">' => array(
+ 'foo',
+ array(
+ '=' => null,
+ '"bar"' => null,
+ ),
+ false,
+ ),
+ '<foo////>' => array(
+ 'foo',
+ array(),
+ true,
+ ),
+ // character "&" in unquoted attribute shouldn't cause an infinite loop
+ '<foo bar=index.php?str=1&amp;id=29>' => array(
+ 'foo',
+ array(
+ 'bar' => 'index.php?str=1&id=29',
+ ),
+ false,
+ ),
+ );
+ foreach ($reallyBad as $test => $expects) {
+ $events = $this->parse($test);
+ // fprintf(STDOUT, $test . print_r($events, true));
+ $this->assertEventError($events->get(0));
+ $this->assertEventError($events->get(1));
+ // $this->assertEventEquals('startTag', $expects, $events->get(1));
+ }
+
+ // Regression: Malformed elements should be detected.
+ // '<foo baz="1" <bar></foo>' => array('foo', array('baz' => '1'), false),
+ $events = $this->parse('<foo baz="1" <bar></foo>');
+ $this->assertEventError($events->get(0));
+ $this->assertEventEquals('startTag', array(
+ 'foo',
+ array(
+ 'baz' => '1',
+ ),
+ false,
+ ), $events->get(1));
+ $this->assertEventEquals('startTag', array(
+ 'bar',
+ array(),
+ false,
+ ), $events->get(2));
+ $this->assertEventEquals('endTag', array(
+ 'foo',
+ ), $events->get(3));
+ }
+
+ public function testRawText()
+ {
+ $good = array(
+ '<script>abcd efg hijk lmnop</script> ' => 'abcd efg hijk lmnop',
+ '<script><not/><the/><tag></script>' => '<not/><the/><tag>',
+ '<script><<<<<<<<</script>' => '<<<<<<<<',
+ '<script>hello</script</script>' => 'hello</script',
+ "<script>\nhello</script\n</script>" => "\nhello</script\n",
+ '<script>&amp;</script>' => '&amp;',
+ '<script><!--not a comment--></script>' => '<!--not a comment-->',
+ '<script><![CDATA[not a comment]]></script>' => '<![CDATA[not a comment]]>',
+ );
+ foreach ($good as $test => $expects) {
+ $events = $this->parse($test);
+ $this->assertEventEquals('startTag', 'script', $events->get(0));
+ $this->assertEventEquals('text', $expects, $events->get(1));
+ $this->assertEventEquals('endTag', 'script', $events->get(2));
+ }
+
+ $bad = array(
+ '<script>&amp;</script' => '&amp;</script',
+ '<script>Hello world' => 'Hello world',
+ );
+ foreach ($bad as $test => $expects) {
+ $events = $this->parse($test);
+ $this->assertEquals(4, $events->depth(), "Counting events for '$test': " . print_r($events, true));
+ $this->assertEventEquals('startTag', 'script', $events->get(0));
+ $this->assertEventError($events->get(1));
+ $this->assertEventEquals('text', $expects, $events->get(2));
+ }
+
+ // Testing case sensitivity
+ $events = $this->parse('<TITLE>a test</TITLE>');
+ $this->assertEventEquals('startTag', 'title', $events->get(0));
+ $this->assertEventEquals('text', 'a test', $events->get(1));
+ $this->assertEventEquals('endTag', 'title', $events->get(2));
+
+ // Testing end tags with whitespaces
+ $events = $this->parse('<title>Whitespaces are tasty</title >');
+ $this->assertEventEquals('startTag', 'title', $events->get(0));
+ $this->assertEventEquals('text', 'Whitespaces are tasty', $events->get(1));
+ $this->assertEventEquals('endTag', 'title', $events->get(2));
+ }
+
+ public function testRcdata()
+ {
+ list($tok, $events) = $this->createTokenizer('<title>&#x27;<!-- not a comment --></TITLE>');
+ $tok->setTextMode(\Masterminds\HTML5\Elements::TEXT_RCDATA, 'title');
+ $tok->parse();
+ $this->assertEventEquals('text', "'<!-- not a comment -->", $events->get(1));
+ }
+
+ public function testText()
+ {
+ $events = $this->parse('a<br>b');
+ $this->assertEquals(4, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('text', 'a', $events->get(0));
+ $this->assertEventEquals('startTag', 'br', $events->get(1));
+ $this->assertEventEquals('text', 'b', $events->get(2));
+
+ $events = $this->parse('<a>Test</a>');
+ $this->assertEquals(4, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('startTag', 'a', $events->get(0));
+ $this->assertEventEquals('text', 'Test', $events->get(1));
+ $this->assertEventEquals('endTag', 'a', $events->get(2));
+
+ $events = $this->parse('<p>0</p><p>1</p>');
+ $this->assertEquals(7, $events->depth(), 'Events: ' . print_r($events, true));
+
+ $this->assertEventEquals('startTag', 'p', $events->get(0));
+ $this->assertEventEquals('text', '0', $events->get(1));
+ $this->assertEventEquals('endTag', 'p', $events->get(2));
+
+ $this->assertEventEquals('startTag', 'p', $events->get(3));
+ $this->assertEventEquals('text', '1', $events->get(4));
+ $this->assertEventEquals('endTag', 'p', $events->get(5));
+
+ $events = $this->parse('a<![CDATA[test]]>b');
+ $this->assertEquals(4, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('text', 'a', $events->get(0));
+ $this->assertEventEquals('cdata', 'test', $events->get(1));
+ $this->assertEventEquals('text', 'b', $events->get(2));
+
+ $events = $this->parse('a<!--test-->b');
+ $this->assertEquals(4, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('text', 'a', $events->get(0));
+ $this->assertEventEquals('comment', 'test', $events->get(1));
+ $this->assertEventEquals('text', 'b', $events->get(2));
+
+ $events = $this->parse('a&amp;b');
+ $this->assertEquals(2, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('text', 'a&b', $events->get(0));
+
+ $events = $this->parse('a&sup2;b');
+ $this->assertEquals(2, $events->depth(), 'Events: ' . print_r($events, true));
+ $this->assertEventEquals('text', 'a²b', $events->get(0));
+ }
+
+ // ================================================================
+ // Utility functions.
+ // ================================================================
+ protected function createTokenizer($string, $debug = false)
+ {
+ $eventHandler = new EventStack();
+ $scanner = new Scanner($string);
+
+ $scanner->debug = $debug;
+
+ return array(
+ new Tokenizer($scanner, $eventHandler),
+ $eventHandler,
+ );
+ }
+
+ public function parse($string, $debug = false)
+ {
+ list($tok, $events) = $this->createTokenizer($string, $debug);
+ $tok->parse();
+
+ return $events;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TreeBuildingRulesTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TreeBuildingRulesTest.php
new file mode 100644
index 000000000..45c68bcfb
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/TreeBuildingRulesTest.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * @file
+ * Test the Tree Builder's special-case rules.
+ */
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\TreeBuildingRules;
+use Masterminds\HTML5\Parser\Tokenizer;
+use Masterminds\HTML5\Parser\Scanner;
+use Masterminds\HTML5\Parser\DOMTreeBuilder;
+
+/**
+ * These tests are functional, not necessarily unit tests.
+ */
+class TreeBuildingRulesTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ const HTML_STUB = '<!DOCTYPE html><html><head><title>test</title></head><body>%s</body></html>';
+
+ /**
+ * Convenience function for parsing.
+ */
+ protected function parse($string)
+ {
+ $treeBuilder = new DOMTreeBuilder();
+ $scanner = new Scanner($string);
+ $parser = new Tokenizer($scanner, $treeBuilder);
+
+ $parser->parse();
+
+ return $treeBuilder->document();
+ }
+
+ /**
+ * Convenience function for parsing fragments.
+ */
+ protected function parseFragment($string)
+ {
+ $events = new DOMTreeBuilder(true);
+ $scanner = new Scanner($string);
+ $parser = new Tokenizer($scanner, $events);
+
+ $parser->parse();
+
+ return $events->fragment();
+ }
+
+ public function testTDFragment()
+ {
+ $frag = $this->parseFragment('<td>This is a test of the HTML5 parser</td>');
+
+ $td = $frag->childNodes->item(0);
+
+ $this->assertEquals(1, $frag->childNodes->length);
+ $this->assertEquals('td', $td->tagName);
+ $this->assertEquals('This is a test of the HTML5 parser', $td->nodeValue);
+ }
+
+ public function testHasRules()
+ {
+ $doc = new \DOMDocument('1.0');
+ $engine = new TreeBuildingRules($doc);
+
+ $this->assertTrue($engine->hasRules('li'));
+ $this->assertFalse($engine->hasRules('imaginary'));
+ }
+
+ public function testHandleLI()
+ {
+ $html = sprintf(self::HTML_STUB, '<ul id="a"><li>test<li>test2</ul><a></a>');
+ $doc = $this->parse($html);
+
+ $list = $doc->getElementById('a');
+
+ $this->assertEquals(2, $list->childNodes->length);
+ foreach ($list->childNodes as $ele) {
+ $this->assertEquals('li', $ele->tagName);
+ }
+ }
+
+ public function testHandleDT()
+ {
+ $html = sprintf(self::HTML_STUB, '<dl id="a"><dt>Hello<dd>Hi</dl><a></a>');
+ $doc = $this->parse($html);
+
+ $list = $doc->getElementById('a');
+
+ $this->assertEquals(2, $list->childNodes->length);
+ $this->assertEquals('dt', $list->firstChild->tagName);
+ $this->assertEquals('dd', $list->lastChild->tagName);
+ }
+
+ public function testHandleOptionGroupAndOption()
+ {
+ $html = sprintf(self::HTML_STUB, '<optgroup id="foo" label="foo" ><option value="foo">bar</option></optgroup>');
+ $doc = $this->parse($html);
+
+ $list = $doc->getElementById('foo');
+
+ $this->assertEquals(1, $list->childNodes->length);
+
+ $option = $list->childNodes->item(0);
+ $this->assertEquals('option', $option->tagName);
+ }
+
+ public function testTable()
+ {
+ $html = sprintf(self::HTML_STUB, '<table><thead id="a"><th>foo<td>bar<td>baz');
+ $doc = $this->parse($html);
+
+ $list = $doc->getElementById('a');
+
+ $this->assertEquals(3, $list->childNodes->length);
+ $this->assertEquals('th', $list->firstChild->tagName);
+ $this->assertEquals('td', $list->lastChild->tagName);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/UTF8UtilsTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/UTF8UtilsTest.php
new file mode 100644
index 000000000..72c26a4b3
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Parser/UTF8UtilsTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Parser;
+
+use Masterminds\HTML5\Parser\UTF8Utils;
+
+class UTF8UtilsTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ public function testConvertToUTF8()
+ {
+ $out = UTF8Utils::convertToUTF8('éàa', 'ISO-8859-1');
+ $this->assertEquals('éàa', $out);
+ }
+
+ /**
+ * @todo add tests for invalid codepoints
+ */
+ public function testCheckForIllegalCodepoints()
+ {
+ $smoke = 'Smoke test';
+ $err = UTF8Utils::checkForIllegalCodepoints($smoke);
+ $this->assertEmpty($err);
+
+ $data = "Foo Bar \0 Baz";
+ $errors = UTF8Utils::checkForIllegalCodepoints($data);
+ $this->assertContains('null-character', $errors);
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/OutputRulesTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/OutputRulesTest.php
new file mode 100644
index 000000000..913051657
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/OutputRulesTest.php
@@ -0,0 +1,652 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Serializer;
+
+use Masterminds\HTML5\Serializer\OutputRules;
+use Masterminds\HTML5\Serializer\Traverser;
+use Masterminds\HTML5;
+
+class OutputRulesTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ protected $markup = '<!doctype html>
+ <html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Test</title>
+ </head>
+ <body>
+ <p>This is a test.</p>
+ </body>
+ </html>';
+
+ /**
+ * @var HTML5
+ */
+ protected $html5;
+
+ public function setUp()
+ {
+ $this->html5 = $this->getInstance();
+ }
+
+ /**
+ * Using reflection we make a protected method accessible for testing.
+ *
+ * @param string $name
+ * The name of the method on the Traverser class to test
+ *
+ * @return \ReflectionMethod for the specified method
+ */
+ public function getProtectedMethod($name)
+ {
+ $class = new \ReflectionClass('\Masterminds\HTML5\Serializer\OutputRules');
+ $method = $class->getMethod($name);
+ $method->setAccessible(true);
+
+ return $method;
+ }
+
+ public function getTraverserProtectedProperty($name)
+ {
+ $class = new \ReflectionClass('\Masterminds\HTML5\Serializer\Traverser');
+ $property = $class->getProperty($name);
+ $property->setAccessible(true);
+
+ return $property;
+ }
+
+ public function getOutputRules($options = array())
+ {
+ $options = $options + $this->html5->getOptions();
+ $stream = fopen('php://temp', 'w');
+ $dom = $this->html5->loadHTML($this->markup);
+ $r = new OutputRules($stream, $options);
+ $t = new Traverser($dom, $stream, $r, $options);
+
+ return array(
+ $r,
+ $stream,
+ );
+ }
+
+ public function testDocument()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html><html lang="en"><body>foo</body></html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $r->document($dom);
+ $expected = '<!DOCTYPE html>' . PHP_EOL . '<html lang="en"><body>foo</body></html>' . PHP_EOL;
+ $this->assertEquals($expected, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testEmptyDocument()
+ {
+ $dom = $this->html5->loadHTML('');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $r->document($dom);
+ $expected = '<!DOCTYPE html>' . PHP_EOL;
+ $this->assertEquals($expected, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testDoctype()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html><html lang="en"><body>foo</body></html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $m = $this->getProtectedMethod('doctype');
+ $m->invoke($r, 'foo');
+ $this->assertEquals('<!DOCTYPE html>' . PHP_EOL, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testElement()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ <svg width="150" height="100" viewBox="0 0 3 2">
+ <rect width="1" height="2" x="0" fill="#008d46" />
+ <rect width="1" height="2" x="1" fill="#ffffff" />
+ <rect width="1" height="2" x="2" fill="#d2232c" />
+ </svg>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+ $r->element($list->item(0));
+ $this->assertEquals('<div id="foo" class="bar baz">foo bar baz</div>', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testSerializeWithNamespaces()
+ {
+ $this->html5 = $this->getInstance(array(
+ 'xmlNamespaces' => true,
+ ));
+
+ $source = '
+ <!DOCTYPE html>
+ <html><body id="body" xmlns:x="http://www.prefixed.com">
+ <a id="bar1" xmlns="http://www.prefixed.com/bar1">
+ <b id="bar4" xmlns="http://www.prefixed.com/bar4"><x:prefixed id="prefixed">xy</x:prefixed></b>
+ </a>
+ <svg id="svg">svg</svg>
+ <c id="bar2" xmlns="http://www.prefixed.com/bar2"></c>
+ <div id="div"></div>
+ <d id="bar3"></d>
+ <xn:d id="bar5" xmlns:xn="http://www.prefixed.com/xn" xmlns="http://www.prefixed.com/bar5_x"><x id="bar5_x">y</x></xn:d>
+ </body>
+ </html>';
+
+ $dom = $this->html5->loadHTML($source, array(
+ 'xmlNamespaces' => true,
+ ));
+ $this->assertFalse($this->html5->hasErrors(), print_r($this->html5->getErrors(), 1));
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $t->walk();
+ $rendered = stream_get_contents($stream, -1, 0);
+
+ $clear = function ($s) {
+ return trim(preg_replace('/[\s]+/', ' ', $s));
+ };
+
+ $this->assertEquals($clear($source), $clear($rendered));
+ }
+
+ public function testElementWithScript()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <head>
+ <script>
+ var $jQ = jQuery.noConflict();
+ // Use jQuery via $jQ(...)
+ $jQ(document).ready(function () {
+ $jQ("#mktFrmSubmit").wrap("<div class=\'buttonSubmit\'></div>");
+ $jQ(".buttonSubmit").prepend("<span></span>");
+ });
+ </script>
+ </head>
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $script = $dom->getElementsByTagName('script');
+ $r->element($script->item(0));
+ $this->assertEquals(
+ '<script>
+ var $jQ = jQuery.noConflict();
+ // Use jQuery via $jQ(...)
+ $jQ(document).ready(function () {
+ $jQ("#mktFrmSubmit").wrap("<div class=\'buttonSubmit\'></div>");
+ $jQ(".buttonSubmit").prepend("<span></span>");
+ });
+ </script>', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testElementWithStyle()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <head>
+ <style>
+ body > .bar {
+ display: none;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $style = $dom->getElementsByTagName('style');
+ $r->element($style->item(0));
+ $this->assertEquals('<style>
+ body > .bar {
+ display: none;
+ }
+ </style>', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testOpenTag()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+ $m = $this->getProtectedMethod('openTag');
+ $m->invoke($r, $list->item(0));
+ $this->assertEquals('<div id="foo" class="bar baz">', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testCData()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div><![CDATA[bar]]></div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+ $r->cdata($list->item(0)->childNodes->item(0));
+ $this->assertEquals('<![CDATA[bar]]>', stream_get_contents($stream, -1, 0));
+
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo"></div>
+ </body>
+ </html>');
+
+ $dom->getElementById('foo')->appendChild(new \DOMCdataSection(']]>Foo<[![CDATA test ]]>'));
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+ $list = $dom->getElementsByTagName('div');
+ $r->cdata($list->item(0)->childNodes->item(0));
+
+ $this->assertEquals('<![CDATA[]]]]><![CDATA[>Foo<[![CDATA test ]]]]><![CDATA[>]]>', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testComment()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div><!-- foo --></div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+ $r->comment($list->item(0)->childNodes->item(0));
+ $this->assertEquals('<!-- foo -->', stream_get_contents($stream, -1, 0));
+
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo"></div>
+ </body>
+ </html>');
+ $dom->getElementById('foo')->appendChild(new \DOMComment('<!-- --> --> Foo -->'));
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+ $r->comment($list->item(0)->childNodes->item(0));
+
+ // Could not find more definitive guidelines on what this should be. Went with
+ // what the HTML5 spec says and what \DOMDocument::saveXML() produces.
+ $this->assertEquals('<!--<!-- --> --> Foo -->-->', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testText()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <head>
+ <script>baz();</script>
+ </head>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('script');
+ $r->text($list->item(0)->childNodes->item(0));
+ $this->assertEquals('baz();', stream_get_contents($stream, -1, 0));
+
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <head id="foo"></head>
+ </html>');
+ $foo = $dom->getElementById('foo');
+ $foo->appendChild(new \DOMText('<script>alert("hi");</script>'));
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $r->text($foo->firstChild);
+ $this->assertEquals('&lt;script&gt;alert("hi");&lt;/script&gt;', stream_get_contents($stream, -1, 0));
+ }
+
+ public function testNl()
+ {
+ list($o, $s) = $this->getOutputRules();
+
+ $m = $this->getProtectedMethod('nl');
+ $m->invoke($o);
+ $this->assertEquals(PHP_EOL, stream_get_contents($s, -1, 0));
+ }
+
+ public function testWr()
+ {
+ list($o, $s) = $this->getOutputRules();
+
+ $m = $this->getProtectedMethod('wr');
+ $m->invoke($o, 'foo');
+ $this->assertEquals('foo', stream_get_contents($s, -1, 0));
+ }
+
+ public function getEncData()
+ {
+ return array(
+ array(
+ false,
+ '&\'<>"',
+ '&amp;\'&lt;&gt;"',
+ '&amp;&apos;&lt;&gt;&quot;',
+ ),
+ array(
+ false,
+ 'This + is. a < test',
+ 'This + is. a &lt; test',
+ 'This &plus; is&period; a &lt; test',
+ ),
+ array(
+ false,
+ '.+#',
+ '.+#',
+ '&period;&plus;&num;',
+ ),
+
+ array(
+ true,
+ '.+#\'',
+ '.+#\'',
+ '&period;&plus;&num;&apos;',
+ ),
+ array(
+ true,
+ '&".<',
+ '&amp;&quot;.<',
+ '&amp;&quot;&period;&lt;',
+ ),
+ array(
+ true,
+ '&\'<>"',
+ '&amp;\'<>&quot;',
+ '&amp;&apos;&lt;&gt;&quot;',
+ ),
+ array(
+ true,
+ "\xc2\xa0\"'",
+ '&nbsp;&quot;\'',
+ '&nbsp;&quot;&apos;',
+ ),
+ );
+ }
+
+ /**
+ * Test basic encoding of text.
+ *
+ * @dataProvider getEncData
+ */
+ public function testEnc($isAttribute, $test, $expected, $expectedEncoded)
+ {
+ list($o, $s) = $this->getOutputRules();
+ $m = $this->getProtectedMethod('enc');
+
+ $this->assertEquals($expected, $m->invoke($o, $test, $isAttribute));
+
+ list($o, $s) = $this->getOutputRules(array(
+ 'encode_entities' => true,
+ ));
+ $m = $this->getProtectedMethod('enc');
+ $this->assertEquals($expectedEncoded, $m->invoke($o, $test, $isAttribute));
+ }
+
+ /**
+ * Test basic encoding of text.
+ *
+ * @dataProvider getEncData
+ */
+ public function testEscape($isAttribute, $test, $expected, $expectedEncoded)
+ {
+ list($o, $s) = $this->getOutputRules();
+ $m = $this->getProtectedMethod('escape');
+
+ $this->assertEquals($expected, $m->invoke($o, $test, $isAttribute));
+ }
+
+ public function booleanAttributes()
+ {
+ return array(
+ array('<img alt="" ismap>'),
+ array('<img alt="">'),
+ array('<input type="radio" readonly>'),
+ array('<input type="radio" checked disabled>'),
+ array('<input type="checkbox" checked disabled>'),
+ array('<input type="radio" value="" checked disabled>'),
+ array('<div data-value=""></div>'),
+ array('<select disabled></select>'),
+ array('<div ng-app></div>'),
+ array('<script defer></script>'),
+ );
+ }
+
+ /**
+ * @dataProvider booleanAttributes
+ */
+ public function testBooleanAttrs($html)
+ {
+ $dom = $this->html5->loadHTML('<!doctype html><html lang="en"><body>' . $html . '</body></html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $node = $dom->getElementsByTagName('body')->item(0)->firstChild;
+
+ $m = $this->getProtectedMethod('attrs');
+ $m->invoke($r, $node);
+
+ $content = stream_get_contents($stream, -1, 0);
+
+ $html = preg_replace('~<[a-z]+(.*)></[a-z]+>~', '\1', $html);
+ $html = preg_replace('~<[a-z]+(.*)/?>~', '\1', $html);
+
+ $this->assertEquals($content, $html);
+ }
+
+ public function testAttrs()
+ {
+ $dom = $this->html5->loadHTML('<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('div');
+
+ $m = $this->getProtectedMethod('attrs');
+ $m->invoke($r, $list->item(0));
+
+ $content = stream_get_contents($stream, -1, 0);
+ $this->assertEquals(' id="foo" class="bar baz"', $content);
+ }
+
+ public function testSvg()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ <svg width="150" height="100" viewBox="0 0 3 2">
+ <rect width="1" height="2" x="0" fill="#008d46" />
+ <rect width="1" height="2" x="1" fill="#ffffff" />
+ <rect width="1" height="2" x="2" fill="#d2232c" />
+ <rect id="Bar" x="300" y="100" width="300" height="100" fill="rgb(255,255,0)">
+ <animate attributeName="x" attributeType="XML" begin="0s" dur="9s" fill="freeze" from="300" to="0" />
+ </rect>
+ </svg>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('svg');
+ $r->element($list->item(0));
+ $contents = stream_get_contents($stream, -1, 0);
+ $this->assertRegExp('|<svg width="150" height="100" viewBox="0 0 3 2">|', $contents);
+ $this->assertRegExp('|<rect width="1" height="2" x="0" fill="#008d46" />|', $contents);
+ $this->assertRegExp('|<rect id="Bar" x="300" y="100" width="300" height="100" fill="rgb\(255,255,0\)">|', $contents);
+ }
+
+ public function testMath()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <div id="foo" class="bar baz">foo bar baz</div>
+ <math>
+ <mi>x</mi>
+ <csymbol definitionURL="http://www.example.com/mathops/multiops.html#plusminus">
+ <mo>&PlusMinus;</mo>
+ </csymbol>
+ <mi>y</mi>
+ </math>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('math');
+ $r->element($list->item(0));
+ $content = stream_get_contents($stream, -1, 0);
+ $this->assertRegExp('|<math>|', $content);
+ $this->assertRegExp('|<csymbol definitionURL="http://www.example.com/mathops/multiops.html#plusminus">|', $content);
+ }
+
+ public function testProcessorInstruction()
+ {
+ $dom = $this->html5->loadHTMLFragment('<?foo bar ?>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $r->processorInstruction($dom->firstChild);
+ $content = stream_get_contents($stream, -1, 0);
+ $this->assertRegExp('|<\?foo bar \?>|', $content);
+ }
+
+ public function testAddressTag()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+ <html lang="en">
+ <body>
+ <address>
+ <a href="../People/Raggett/">Dave Raggett</a>,
+ <a href="../People/Arnaud/">Arnaud Le Hors</a>,
+ contact persons for the <a href="Activity">W3C HTML Activity</a>
+ </address>
+ </body>
+ </html>');
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+
+ $list = $dom->getElementsByTagName('address');
+ $r->element($list->item(0));
+ $contents = stream_get_contents($stream, -1, 0);
+
+ $this->assertRegExp('|<address>|', $contents);
+ $this->assertRegExp('|<a href="../People/Raggett/">Dave Raggett</a>,|', $contents);
+ $this->assertRegExp('|<a href="../People/Arnaud/">Arnaud Le Hors</a>,|', $contents);
+ $this->assertRegExp('|contact persons for the <a href="Activity">W3C HTML Activity</a>|', $contents);
+ $this->assertRegExp('|</address>|', $contents);
+ }
+
+ /**
+ * Ensure direct DOM manipulation doesn't break TEXT_RAW elements (iframe, script, etc...).
+ */
+ public function testHandlingInvalidRawContent()
+ {
+ $dom = $this->html5->loadHTML(
+ '<!doctype html>
+<html lang="en" id="base">
+ <body>
+ <script id="template" type="x-tmpl-mustache">
+ <h1>Hello!</h1>
+ </script>
+ </body>
+</html>');
+
+ $badNode = $dom->createElement('p', 'Bar');
+
+ // modify the content of the TEXT_RAW element: <script id="template"> appending dom nodes
+ $styleElement = $dom->getElementById('template');
+ $styleElement->appendChild($badNode);
+
+ $contents = $this->html5->saveHTML($dom);
+
+ $this->assertTrue(false !== strpos($contents, '<script id="template" type="x-tmpl-mustache">
+ <h1>Hello!</h1>
+ <p>Bar</p></script>'));
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/TraverserTest.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/TraverserTest.php
new file mode 100644
index 000000000..d4ae7b351
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/Serializer/TraverserTest.php
@@ -0,0 +1,136 @@
+<?php
+
+namespace Masterminds\HTML5\Tests\Serializer;
+
+use Masterminds\HTML5\Serializer\OutputRules;
+use Masterminds\HTML5\Serializer\Traverser;
+
+class TraverserTest extends \Masterminds\HTML5\Tests\TestCase
+{
+ protected $markup = '<!doctype html>
+ <html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Test</title>
+ </head>
+ <body>
+ <p>This is a test.</p>
+ </body>
+ </html>';
+
+ public function setUp()
+ {
+ $this->html5 = $this->getInstance();
+ }
+
+ /**
+ * Using reflection we make a protected method accessible for testing.
+ *
+ * @param string $name
+ * The name of the method on the Traverser class to test
+ *
+ * @return \ReflectionMethod \ReflectionMethod for the specified method
+ */
+ public function getProtectedMethod($name)
+ {
+ $class = new \ReflectionClass('\Masterminds\HTML5\Serializer\Traverser');
+ $method = $class->getMethod($name);
+ $method->setAccessible(true);
+
+ return $method;
+ }
+
+ public function getTraverser()
+ {
+ $stream = fopen('php://temp', 'w');
+
+ $dom = $this->html5->loadHTML($this->markup);
+ $t = new Traverser($dom, $stream, $html5->getOptions());
+
+ // We return both the traverser and stream so we can pull from it.
+ return array(
+ $t,
+ $stream,
+ );
+ }
+
+ public function testConstruct()
+ {
+ // The traverser needs a place to write the output to. In our case we
+ // use a stream in temp space.
+ $stream = fopen('php://temp', 'w');
+
+ $html5 = $this->getInstance();
+
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $dom = $this->html5->loadHTML($this->markup);
+
+ $t = new Traverser($dom, $stream, $r, $html5->getOptions());
+
+ $this->assertInstanceOf('\Masterminds\HTML5\Serializer\Traverser', $t);
+ }
+
+ public function testFragmentDeprecated()
+ {
+ $html = '<span class="bar">foo</span><span></span><div>bar</div>';
+ $input = new \Masterminds\HTML5\Parser\StringInputStream($html);
+ $dom = $this->html5->parseFragment($input);
+
+ $this->assertInstanceOf('\DOMDocumentFragment', $dom);
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+ $t->walk();
+
+ $this->assertEquals($html, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testFragment()
+ {
+ $html = '<span class="bar">foo</span><span></span><div>bar</div>';
+ $dom = $this->html5->parseFragment($html);
+
+ $this->assertInstanceOf('\DOMDocumentFragment', $dom);
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+ $t->walk();
+
+ $this->assertEquals($html, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testProcessorInstructionDeprecated()
+ {
+ $html = '<?foo bar ?>';
+ $input = new \Masterminds\HTML5\Parser\StringInputStream($html);
+ $dom = $this->html5->parseFragment($input);
+
+ $this->assertInstanceOf('\DOMDocumentFragment', $dom);
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+ $t->walk();
+
+ $this->assertEquals($html, stream_get_contents($stream, -1, 0));
+ }
+
+ public function testProcessorInstruction()
+ {
+ $html = '<?foo bar ?>';
+ $dom = $this->html5->parseFragment($html);
+
+ $this->assertInstanceOf('\DOMDocumentFragment', $dom);
+
+ $stream = fopen('php://temp', 'w');
+ $r = new OutputRules($stream, $this->html5->getOptions());
+
+ $t = new Traverser($dom, $stream, $r, $this->html5->getOptions());
+ $t->walk();
+
+ $this->assertEquals($html, stream_get_contents($stream, -1, 0));
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/HTML5/TestCase.php b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/TestCase.php
new file mode 100644
index 000000000..a25ae215c
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/HTML5/TestCase.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Masterminds\HTML5\Tests;
+
+use Masterminds\HTML5;
+use PHPUnit\Framework\TestCase as BaseTestCase;
+
+class TestCase extends BaseTestCase
+{
+ const DOC_OPEN = '<!DOCTYPE html><html><head><title>test</title></head><body>';
+
+ const DOC_CLOSE = '</body></html>';
+
+ public function getInstance(array $options = array())
+ {
+ return new HTML5($options);
+ }
+
+ protected function wrap($fragment)
+ {
+ return self::DOC_OPEN . $fragment . self::DOC_CLOSE;
+ }
+}
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/benchmark/example.html b/plugins/af_readability/vendor/masterminds/html5/test/benchmark/example.html
new file mode 100644
index 000000000..3e1bed030
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/benchmark/example.html
@@ -0,0 +1,6403 @@
+
+<!DOCTYPE html>
+<!--[if (gt IE 9)|!(IE)]> <!--> <html lang="en" class="no-js edition-domestic app-homepage" itemscope xmlns:og="http://opengraphprotocol.org/schema/"> <!--<![endif]-->
+<!--[if IE 9]> <html lang="en" class="no-js ie9 lt-ie10 edition-domestic app-homepage" xmlns:og="http://opengraphprotocol.org/schema/"> <![endif]-->
+<!--[if IE 8]> <html lang="en" class="no-js ie8 lt-ie10 lt-ie9 edition-domestic app-homepage" xmlns:og="http://opengraphprotocol.org/schema/"> <![endif]-->
+<!--[if (lt IE 8)]> <html lang="en" class="no-js lt-ie10 lt-ie9 lt-ie8 edition-domestic app-homepage" xmlns:og="http://opengraphprotocol.org/schema/"> <![endif]-->
+<head>
+ <title>The New York Times - Breaking News, World News & Multimedia</title>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <link rel="shortcut icon" href="https://static01.nyt.com/favicon.ico" />
+ <link rel="apple-touch-icon-precomposed" sizes="144×144" href="https://static01.nyt.com/images/icons/ios-ipad-144x144.png" />
+ <link rel="apple-touch-icon-precomposed" sizes="114×114" href="https://static01.nyt.com/images/icons/ios-iphone-114x144.png" />
+ <link rel="apple-touch-icon-precomposed" href="https://static01.nyt.com/images/icons/ios-default-homescreen-57x57.png" />
+ <meta name="sourceApp" content="nyt-v5" />
+ <meta id="applicationName" name="applicationName" content="homepage" />
+ <meta id="foundation-build-id" name="foundation-build-id" content="" />
+ <link rel="canonical" href="https://www.nytimes.com" />
+ <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml" />
+ <link rel="alternate" media="only screen and (max-width: 640px)" href="http://mobile.nytimes.com" />
+ <link rel="alternate" media="handheld" href="http://mobile.nytimes.com" />
+ <meta name="robots" content="noarchive,noodp,noydir" />
+ <meta name="description" content="The New York Times: Find breaking news, multimedia, reviews & opinion on Washington, business, sports, movies, travel, books, jobs, education, real estate, cars & more at nytimes.com." />
+ <meta name="CG" content="Homepage" />
+ <meta name="SCG" content="" />
+ <meta name="PT" content="Homepage" />
+ <meta name="PST" content="" />
+ <meta name="application-name" content="The New York Times" />
+ <meta name="msapplication-starturl" content="https://www.nytimes.com" />
+ <meta name="msapplication-task" content="name=Search;action-uri=http://query.nytimes.com/search/sitesearch?src=iepin;icon-uri=https://static01.nyt.com/images/icons/search.ico" />
+ <meta name="msapplication-task" content="name=Most Popular;action-uri=http://www.nytimes.com/gst/mostpopular.html?src=iepin;icon-uri=https://static01.nyt.com/images/icons/mostpopular.ico" />
+ <meta name="msapplication-task" content="name=Video;action-uri=http://video.nytimes.com/?src=iepin;icon-uri=https://static01.nyt.com/images/icons/video.ico" />
+ <meta name="msapplication-task" content="name=Homepage;action-uri=https://www.nytimes.com?src=iepin&amp;adxnnl=1;icon-uri=https://static01.nyt.com/images/icons/homepage.ico" />
+ <meta property="og:url" content="https://www.nytimes.com" />
+ <meta property="og:type" content="website" />
+ <meta property="og:title" content="Breaking News, World News & Multimedia" />
+ <meta property="og:description" content="The New York Times: Find breaking news, multimedia, reviews & opinion on Washington, business, sports, movies, travel, books, jobs, education, real estate, cars & more at nytimes.com." />
+ <meta property="og:image" content="https://static01.nyt.com/images/icons/t_logo_291_black.png" />
+ <meta property="fb:app_id" content="9869919170" />
+ <meta name="apple-itunes-app" content="app-id=357066198, affiliate-data=at=10lIEQ&ct=Web%20iPad%20Smart%20App%20Banner&pt=13036" />
+ <meta name="keywords" content="Hurricane Harvey (2017),Federal Emergency Management Agency,Beaumont (Tex),Houston (Tex),Hurricane Harvey (2017),Hurricanes and Tropical Storms,Weather,Houston (Tex),Beaumont (Tex),Harris County (Tex),Hurricane Harvey (2017),Texas,Floods,Hurricanes and Tropical Storms,Houston (Tex),Hurricane Harvey (2017),Floods,Deaths (Fatalities),Beaumont (Tex),Hurricane Harvey (2017),Deaths (Fatalities),Louisiana,Texas,Hurricane Harvey (2017),National Hurricane Center,Houston (Tex),Hurricane Harvey (2017),Area Planning and Renewal,Houston (Tex),Floods,New Orleans (La),Hurricane Harvey (2017),Corporate Taxes,Tax Credits, Deductions and Exemptions,Philanthropy,Houston (Tex),Hurricane Harvey (2017),Federal Aid (US),Federal Emergency Management Agency,Small Business Administration,Real Estate and Housing (Residential),Floods,Hurricane Harvey (2017),Humanitarian Aid,Frauds and Swindling,Hurricane Harvey (2017),Floods,Texas,Beaumont (Tex),port arthur texas,Floods,Hurricane Harvey (2017),Houston (Tex),Rain,Refineries,Hurricane Harvey (2017),Hurricanes and Tropical Storms,Evacuations and Evacuees,Texas,United States Politics and Government,Taxation,United States Economy,Springfield (Mo),Trump, Donald J,Tax Shelters,United States Economy,Corporate Taxes,Trump, Donald J,Republican Party,United States Politics and Government,Immigration Detention,Law and Legislation,Illegal Immigration,Trump, Donald J,Patient Protection and Affordable Care Act (2010),Health Insurance and Managed Care,State Children's Health Insurance Program (S-CHIP),United States International Relations,Extortion and Blackmail,Trump, Donald J,North Korea,Cohen, Michael D (1966- ),Russian Interference in 2016 US Elections and Ties to Trump Associates,House Committee on Intelligence,Trump, Donald J,Putin, Vladimir V,United States International Relations,Terrorism,United States Politics and Government,Afghanistan War (2001- ),United States Defense and Military Forces,Haqqani Network,Taliban,Trump, Donald J,Tillerson, Rex W,Pakistan,India,Leukemia,Immune System,Genetic Engineering,Cancer,Children's Hospital of Philadelphia,Food and Drug Administration,Novartis AG,University of Pennsylvania,June, Carl H,Whitehead, Emma,vis-multimedia,Accidents and Safety,Buildings (Structures),Mumbai (India),Tennis,United States Open (Tennis),Sharapova, Maria,Think Tanks,Google Inc,Alphabet Inc,New America Foundation,Schmidt, Eric E,Slaughter, Anne-Marie,Lynn, Barry,Open Markets,Computers and the Internet,Brazil,Amazon Jungle,Mines and Mining,Forests and Forestry,Indigenous People,Temer, Michel (1940- ),Zeid Ra'ad Zeid Al Hussein,Trump, Donald J,United Nations,News and News Media,Freedom of the Press,Newspapers,United States Politics and Government,Charlottesville, Va, Violence (August, 2017),United States Politics and Government,Afghanistan War (2001- ),United States Defense and Military Forces,Defense Department,Afghanistan,Exercise,Cooking and Cookbooks,Seasonal Affective Disorder (SAD),Sleep,Airlines and Airplanes,Comedy and Humor,Travel and Vacations,Monuments and Memorials (Structures),Politics and Government,de Blasio, Bill,Columbus, Christopher,New York City,David Tang,Deaths (Obituaries),Fashion and Apparel,Shanghai Tang,Entrepreneurship,London (England),Hong Kong,National Aeronautics and Space Administration,Space and Astronomy,Solar System,Exploration and Explorers,The Big Bang Theory (TV Program),Young Sheldon (TV Program),Television,Lorre, Chuck,Parsons, Jim,Social Media,Family Courts,Ethics and Official Misconduct,Administration for Children's Services (NYC),Legal Aid Society,Hansell, David,vis-multimedia,Australia,Same-Sex Marriage, Civil Unions and Domestic Partnerships,Political Advertising,Whales and Whaling,International Court of Justice (UN),Sea Shepherd Conservation Society,Antarctic Regions,Japan,Southern Ocean,Mathematics,Archaeology and Anthropology,Babylon (Iraq),Mansfield, Daniel F,Wildberger, Norman J,Historia Mathematica (Journal),Olympic Games,Olympic Games (1972),International Olympic Committee,Munich (Germany),Glasgow (Scotland),Great Britain,Travel and Vacations,Writing and Writers,Books and Literature,Ward, Jesmyn" />
+ <meta name="video:playerId" content="2640832222001" />
+ <meta name="video:publisherId" content="1749339200" />
+ <meta name="video:publisherReadToken" content="cE97ArV7TzqBzkmeRVVhJ8O6GWME2iG_bRvjBTlNb4o." />
+ <meta name="dfp-ad-unit-path" content="homepage/us" />
+ <meta name="dfp-amazon-enabled" content="false" />
+ <meta name="adxPage" content="homepage.nytimes.com/index.html" />
+
+ <link id="legacy-zam5nzz" rel="stylesheet" type="text/css" href="https://typeface.nyt.com/css/zam5nzz.css" media="all" />
+ <!--[if (gt IE 9)|!(IE)]> <!-->
+ <link rel="stylesheet" type="text/css" media="screen" href="https://a1.nyt.com/assets/homepage/20170810-135137/css/homepage/styles.css" />
+ <!--<![endif]-->
+ <!--[if lte IE 9]>
+ <link rel="stylesheet" type="text/css" media="screen" href="https://a1.nyt.com/assets/homepage/20170810-135137/css/homepage/styles-ie.css" />
+ <![endif]-->
+ <!-- begin abra -->
+ <script>
+ var NYTD=NYTD||{};NYTD.Abra=function(t){"use strict";function n(t){var n=i[t];return n&&n[1]||null}function e(t,n){if(t){var e,o,r=n[0],i=n[1],u=0,c=0;if(1!==i.length||4294967296!==i[0])for(e=a(t+" "+r)>>>0,u=0,c=0;o=i[u++];)if(e<(c+=o[0]))return o}}function o(n,e,o,a){s+="subject="+n+"&test="+encodeURIComponent(e)+"&variant="+encodeURIComponent(o||0)+"&url="+encodeURIComponent(t.location.href)+"&instant=1&skipAugment=true\n",a&&f.push(a),c||(c=t.setTimeout(r,0))}function r(){var n=new t.XMLHttpRequest,e=f;n.withCredentials=!0,n.open("POST",u),n.onreadystatechange=function(){var t,o;if(4==n.readyState)for(t=200==n.status?null:new Error(n.statusText);o=e.shift();)o(t)},n.send(s),s="",f=[],c=null}function a(t){for(var n,e,o,r,a,i,u,c=0,s=0,f=[],l=[n=1732584193,e=4023233417,~n,~e,3285377520],h=[],p=t.length;s<=p;)h[s>>2]|=(s<p?t.charCodeAt(s):128)<<8*(3-s++%4);for(h[u=p+8>>2|15]=p<<3;c<=u;c+=16){for(n=l,s=0;s<80;n=[0|[(i=((t=n[0])<<5|t>>>27)+n[4]+(f[s]=s<16?~~h[c+s]:i<<1|i>>>31)+1518500249)+((e=n[1])&(o=n[2])|~e&(r=n[3])),a=i+(e^o^r)+341275144,i+(e&o|e&r|o&r)+882459459,a+1535694389][0|s++/20],t,e<<30|e>>>2,o,r])i=f[s-3]^f[s-8]^f[s-14]^f[s-16];for(s=5;s;)l[--s]=l[s]+n[s]|0}return l[0]}var i,u,c,s="",f=[];return n.init=function(n,r){var a,c,s,f,l,h=[],p=(t.document.cookie.match(/(^|;) *nyt-a=([^;]*)/)||[])[2],d=(t.document.cookie.match(/(^|;) *ab7=([^;]*)/)||[])[2],m=new RegExp("[?&]abra(=([^&#]*))"),g=m.exec(t.location.search);if(g&&g[2]&&(d=d?g[2]+"&"+d:g[2]),i)throw new Error("can't init twice");if(u=r,i={},d)for(d=decodeURIComponent(d).split("&"),a=0;a<d.length;a++)l=d[a].split("="),l[0]in i||(i[l[0]]=[,l[1],1],o("ab-alloc",l[0],l[1]),l[1]&&h.push(l[0]+"="+l[1]));for(a=0;a<n.length;a++)s=n[a],(c=s[0])in i||(f=e(p,s)||[],i[c]=f,f[1]&&h.push(c.replace(/[^\w-]/g)+"="+(""+f[1]).replace(/[^\w-]/g)),f[2]&&o("ab-alloc",c,f[1]));h.length&&t.document.documentElement.setAttribute("data-nyt-ab",h.join(" "))},n.reportExposure=function(n,e){var r=i[n];r&&r[2]?o("ab-expose",n,r[1],e):e&&t.setTimeout(function(){e(null)},0)},n}(this);
+ </script>
+ <script>NYTD.Abra.init([["HOME_ComingUp",[[2147483648,"control",1],[2147483648,"comingup",1]]],["HOME_NewsEvent2",[[3865470567,"full",1],[429496729,"control",1]]],["HOME_ElectionPrediction",[[3865470567,"on",1],[429496729,"control",1]]],["HOME_geoTrending",[[1460288881,"Control",1],[1417339208,"Header",1],[1417339207,"NoHeader",1]]],["www-ad-diagnostic",[[21474837,"1",0],[4273492459,null,0]]],["www-signup-favor-test",[[773094114,"0",1],[773094113,"1",1],[773094113,"2",1],[773094114,"3",1],[773094113,"4",1],[429496729,"5",1],[0,null,0]]],["www-readlater-test-1",[[1073741824,"control",1],[360777253,"controlHoldout",1],[1073741824,"variant1",1],[356482286,"variant1Holdout",1],[1073741824,"variant2",1],[356482285,"variant2Holdout",1]]],["www-signup-favor-test-v3",[[1288490189,"1",1],[1288490189,"2",1],[429496730,"4",1],[1288490188,"5",1]]],["www-signup-favor-test-v4",[[214748365,"control",1],[858993459,"1",1],[858993460,"2",1],[644245094,"4",1],[858993459,"5",1],[858993459,"6",1]]],["www-fabrik-off",[[4294967296,"1",1]]],["Liftoff",[[19520627,"0",1],[19520626,"1",1],[19520627,"2",1],[19520626,"3",1],[19520626,"4",1],[19520627,"5",1],[14839112,"0",1],[14839112,"1",1],[14839112,"2",1],[14839112,"3",1],[14839112,"4",1],[14839112,"5",1],[34359738,"8",1],[34359738,"9",1],[34359739,"12",1],[34359738,"13",1],[34359739,"16",1],[34359738,"17",1],[3882650435,null,0]]],["HP_AATest",[[2147483648,"0",1],[2147483648,"1",1]]],["EC_SampleTest",[[2147483648,"variantA",0],[2147483648,"variantB",0]]],["EC_DigiAbandonmentTest",[[4294967296,"sendAbandonmentEmail",1]]],["EC_HdAbandonmentTest",[[4294967296,"sendAbandonmentEmail",1]]],["EC_CrosswordsUpsellTest",[[2147483648,"control",1],[2147483648,"upsell",1]]],["EC_NewSubOnboardingTest",[[2147483648,"control",1],[2147483648,"sov1",1]]],["PaywallAU",[[429496730,"0",1],[3865470566,"1",1]]]], '//et.nytimes.com/')</script>
+ <!-- end abra -->
+
+ <script>
+ (function () {
+ var e;
+ if (/^mobile\./.test(window.location.hostname)) {
+ var vi2 = (document.cookie.match(/(?:^|;) *vi=([^;]*)/) || [])[1] || '',
+ vi1 = (document.cookie.match(/(?:^|;) *nyt\.np\.vi=([^;]*)/) || [])[1] || '';
+ e = /^b1/.test(vi2) ? 'WP_ProjectVi&variant=vi'
+ : /^z1/.test(vi2) ? 'WP_ProjectVi&variant=0'
+ : /^a2/.test(vi2) ? 'WP_ProjectVi2&variant=hp-st'
+ : /^b2/.test(vi2) ? 'WP_ProjectVi2&variant=hp'
+ : /^c2/.test(vi2) ? 'WP_ProjectVi2&variant=st'
+ : /^z2/.test(vi2) ? 'WP_ProjectVi2&variant=0'
+ : /^1\|/.test(vi1) ? 'WP_ProjectVi&variant=vi'
+ : /^2\|/.test(vi1) ? 'WP_ProjectVi&variant=0'
+ : '';
+ } else if (/^www\./.test(window.location.hostname)) {
+ var vi = (document.cookie.match(/(?:^|;) *vi_www_hp=([^;]*)/) || [])[1] || '';
+ e = /^a2/.test(vi) ? 'WP_ProjectVi_www_hp&variant=hp-st'
+ : /^b2/.test(vi) ? 'WP_ProjectVi_www_hp&variant=hp'
+ : /^c2/.test(vi) ? 'WP_ProjectVi_www_hp&variant=st'
+ : /^z2/.test(vi) ? 'WP_ProjectVi_www_hp&variant=0'
+ : '';
+ }
+ if (e) {
+ var x = new XMLHttpRequest();
+ x.withCredentials = true;
+ x.open('POST','//et.nytimes.com/');
+ x.send('subject=ab-alloc&test=' + e + '&url=' + encodeURIComponent(window.location.href) + '&instant=1&skipAugment=true\n');
+ }
+ })();
+ </script>
+ <script type="text/javascript">
+ document.addEventListener('DOMContentLoaded', function () {
+ if (!window.NYTD) {
+ window.NYTD = {};
+ }
+ window.NYTD.Global = {
+ displayBriefings: function (time) {
+ var timedBriefings = document.getElementsByClassName('timedBriefing');
+ if (!timedBriefings.length) {
+ return;
+ }
+ var attrClass, attrStart, attrEnd, startTime, endTime;
+ var reFormat = /^\d{2}:\d{2}$/;
+ var reHide = / timedBriefingHide/i;
+
+ for (var i = 0; i < timedBriefings.length; i++) {
+ attrClass = timedBriefings[i].getAttribute('class');
+ attrStart = timedBriefings[i].getAttribute('data-start-time');
+ attrEnd = timedBriefings[i].getAttribute('data-end-time');
+ if (attrStart && attrEnd && reFormat.test(attrStart) && reFormat.test(attrEnd)) {
+ startTime = Number.parseInt(attrStart.replace(':', ''), 10);
+ endTime = Number.parseInt(attrEnd.replace(':', ''), 10);
+
+ // need to account for when the time span is across midnight
+ if (startTime > endTime) {
+ if (((time >= startTime) || (time < endTime)) && reHide.test(attrClass)) {
+ timedBriefings[i].setAttribute('class', attrClass.replace(reHide, ''));
+ }
+ if (((time < startTime) && (time >= endTime)) && !reHide.test(attrClass)) {
+ timedBriefings[i].setAttribute('class', (attrClass + ' timedBriefingHide'));
+ }
+ } else {
+ if ((time >= startTime) && (time < endTime) && reHide.test(attrClass)) {
+ timedBriefings[i].setAttribute('class', attrClass.replace(reHide, ''));
+ }
+ if (((time < startTime) || (time >= endTime)) && !reHide.test(attrClass)) {
+ timedBriefings[i].setAttribute('class', (attrClass + ' timedBriefingHide'));
+ }
+ }
+ }
+ }
+ },
+ testTZ: function (offset) {
+ var testTime = new Date(new Date().getTime() + (offset * 3600 * 1000));
+ window.NYTD.Global.displayBriefings((testTime.getUTCHours() * 100) + testTime.getUTCMinutes());
+ return testTime.toUTCString().replace(' GMT', '');
+ }
+ };
+ var now = new Date();
+ var previewTime = (now.getHours() * 100) + now.getMinutes();
+ var rePreviewTime = /previewTime=(\d*)/;
+ var matches = window.location.search.match(rePreviewTime);
+ if (matches) {
+ previewTime = Number.parseInt(matches[1]);
+ }
+ window.NYTD.Global.displayBriefings(previewTime);
+ });
+ </script>
+ <script type="text/javascript">var googletag=googletag||{};googletag.cmd=googletag.cmd||[],function(){var t=document.createElement("script");t.async=!0,t.type="text/javascript";var e="https:"==document.location.protocol;t.src=(e?"https:":"http:")+"//www.googletagservices.com/tag/js/gpt.js";var o=document.getElementsByTagName("script")[0];o.parentNode.insertBefore(t,o)}();</script>
+ <script src="https://cdn.optimizely.com/public/3013110282/s/home_prod.js"></script>
+
+ <!--esi
+<script id="user-info-data" type="application/json">
+<esi:include src="/svc/web-products/userinfo-v3.json" />
+</script>
+-->
+ <script id="magnum-feature-flags" type="application/json">["limitFabrikSave","moreFollowSuggestions","unfollowComments","allTheEmphases","videoVHSCover","videoVHSHomepageCover","videoVHSHomepageNewControls","videoVHSNewControls","videoVHSEmbeddedOnly","additionalOpinionRegions","hpViewability","freeTrial","hpPrototype","useCollectionApiForWell","enableFlexFrameAds","weatherLocation","fabrikWebsocketsOnly","NYTExperiment","hpRealEstateAd","jitterbug","updatedVideoPromoSmall","videoEmbed360","PersonalizationApiUpdate","globalBriefings","removeInternationalEdition","clientSideABRA","abraOverrideVersion","signupFavor","mapleFreeTrial","piiBlockDFP","anchorsHttps","smarterLivingRec","viDesktopTest","caslOpt"]</script>
+ <script id="mpulse">
+ (function(){
+ if (window.BOOMR && window.BOOMR.version) { return; }
+ var dom,doc,where,iframe = document.createElement("iframe"),win = window;
+
+ function boomerangSaveLoadTime(e) {
+ win.BOOMR_onload=(e && e.timeStamp) || new Date().getTime();
+ }
+ if (win.addEventListener) {
+ win.addEventListener("load", boomerangSaveLoadTime, false);
+ } else if (win.attachEvent) {
+ win.attachEvent("onload", boomerangSaveLoadTime);
+ }
+
+ iframe.src = "javascript:void(0)";
+ iframe.title = ""; iframe.role = "presentation";
+ (iframe.frameElement || iframe).style.cssText = "width:0;height:0;border:0;display:none;";
+ where = document.getElementsByTagName("script")[0];
+ where.parentNode.insertBefore(iframe, where);
+
+ try {
+ doc = iframe.contentWindow.document;
+ } catch(e) {
+ dom = document.domain;
+ iframe.src="javascript:var d=document.open();d.domain='"+dom+"';void(0);";
+ doc = iframe.contentWindow.document;
+ }
+ doc.open()._l = function() {
+ var js = this.createElement("script");
+ if (dom) { this.domain = dom; }
+ js.id = "boomr-if-as";
+ js.src = "//c.go-mpulse.net/boomerang/" +
+ "ATH8A-MAMN8-XPXCH-N5KAX-8D239";
+ BOOMR_lstart=new Date().getTime();
+ this.body.appendChild(js);
+ };
+ doc.write('<body onload="document._l();">');
+ doc.close();
+ })();
+ </script>
+ <script>
+ var require = {
+ baseUrl: 'https://a1.nyt.com/assets/',
+ waitSeconds: 20,
+ paths: {
+ 'foundation': 'homepage/20170810-135137/js/foundation',
+ 'shared': 'homepage/20170810-135137/js/shared',
+ 'homepage': 'homepage/20170810-135137/js/homepage',
+ 'application': 'homepage/20170810-135137/js/homepage/',
+ 'videoFactory': 'https://static01.nyt.com/js2/build/video/2.0/videofactoryrequire',
+ 'videoPlaylist': 'https://static01.nyt.com/js2/build/video/players/extended/2.0/appRequire',
+ 'auth/mtr': 'https://static01.nyt.com/js/mtr',
+ 'auth/growl': 'https://static01.nyt.com/js/auth/growl/default',
+ 'vhs': 'https://static01.nyt.com/video/vhs/build/vhs-2.x.min',
+ 'vhs3': 'https://static01.nyt.com/video-static/vhs3/vhs.min'
+ }
+ };
+ </script>
+ <!--[if (gte IE 9)|!(IE)]> <!-->
+ <script data-main="foundation/main" src="https://a1.nyt.com/assets/homepage/20170810-135137/js/foundation/lib/framework.js"></script>
+ <!--<![endif]-->
+ <!--[if lt IE 9]>
+ <script>
+ require.map = { '*': { 'foundation/main': 'foundation/legacy_main' } };
+ </script>
+ <script data-main="foundation/legacy_main" src="https://a1.nyt.com/assets/homepage/20170810-135137/js/foundation/lib/framework.js"></script>
+ <![endif]-->
+</head>
+<body>
+
+<style>
+ .lt-ie10 .messenger.suggestions {
+ display: block !important;
+ height: 50px;
+ }
+
+ .lt-ie10 .messenger.suggestions .message-bed {
+ background-color: #f8e9d2;
+ border-bottom: 1px solid #ccc;
+ }
+
+ .lt-ie10 .messenger.suggestions .message-container {
+ padding: 11px 18px 11px 30px;
+ }
+
+ .lt-ie10 .messenger.suggestions .action-link {
+ font-family: "nyt-franklin", arial, helvetica, sans-serif;
+ font-size: 10px;
+ font-weight: bold;
+ color: #a81817;
+ text-transform: uppercase;
+ }
+
+ .lt-ie10 .messenger.suggestions .alert-icon {
+ background: url('https://static01.nyt.com/images/icons/icon-alert-12x12-a81817.png') no-repeat;
+ width: 12px;
+ height: 12px;
+ display: inline-block;
+ margin-top: -2px;
+ float: none;
+ }
+
+ .lt-ie10 .masthead,
+ .lt-ie10 .navigation,
+ .lt-ie10 .comments-panel {
+ margin-top: 50px !important;
+ }
+
+ .lt-ie10 .ribbon {
+ margin-top: 97px !important;
+ }
+</style>
+<div id="suggestions" class="suggestions messenger nocontent robots-nocontent" style="display:none;">
+ <div class="message-bed">
+ <div class="message-container last-message-container">
+ <div class="message">
+ <span class="message-content">
+ <i class="icon alert-icon"></i><span class="message-title">NYTimes.com no longer supports Internet Explorer 9 or earlier. Please upgrade your browser.</span>
+ <a href="http://www.nytimes.com/content/help/site/ie9-support.html" class="action-link">LEARN MORE »</a>
+ </span>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="shell" class="shell">
+ <header id="masthead" class="masthead theme-pinned-masthead" role="banner">
+
+ <div id="announcements-container" class="announcements-container"></div>
+
+ <div id="Header1" class="ad header1-ad"></div>
+
+ <div class="masthead-cap-container">
+
+ <div id="masthead-cap" class="masthead-cap">
+
+ <div class="quick-navigation button-group">
+
+ <button class="button sections-button enable-a11y">
+ <i class="icon sprite-icon"></i><span class="button-text">Sections</span>
+ </button>
+ <button class="button search-button">
+ <i class="icon sprite-icon"></i><span class="button-text">Search</span>
+ </button>
+ <a class="button skip-button skip-to-content visually-hidden focusable" href="#top-news">Skip to content</a>
+ <a class="button skip-button skip-to-navigation visually-hidden focusable" href="#site-index-navigation">Skip to navigation</a>
+ </div><!-- close quick-navigation -->
+
+ <div class="user-tools">
+
+ <div id="Bar1" class="ad bar1-ad"></div>
+
+ <div class="user-tools-button-group button-group">
+ <button class="button subscribe-button hidden" data-href="https://www.nytimes.com/subscriptions/Multiproduct/lp3004.html?campaignId=4XUYF">Subscribe Now</button>
+ <button class="button login-button hidden">Log In</button>
+ <button class="button notifications-button hidden"><i class="icon sprite-icon"></i><span class="button-text">0</span></button>
+ <button class="button user-settings-button">
+ <i class="icon sprite-icon"></i><span class="button-text">Settings</span>
+ </button>
+ </div>
+
+ </div><!-- close user-tools -->
+
+ </div><!-- close masthead-cap -->
+
+ </div><!-- close masthead-cap-container -->
+
+ <div class="masthead-meta">
+ <div class="editions tab">
+
+ <ul class="editions-menu">
+ <li class="edition-domestic-toggle active">English</li>
+ <li class="edition-chinese-toggle"><a href="http://cn.nytimes.com" target="_blank" data-edition="chinese">中文 (Chinese)</a></li>
+ <li class="edition-spanish-toggle"><a href="https://www.nytimes.com/es/" data-edition="spanish">Español</a></li>
+ </ul>
+
+ </div><!-- close editions -->
+
+ <div id="TopLeft" class="ad top-left-ad"></div>
+ <div id="TopRight" class="ad top-right-ad"></div>
+
+ <h2 class="branding"><a href="https://www.nytimes.com/">
+ <svg class="nyt-logo" width="379" height="64" role="img" aria-label="The New York Times">
+ <image width="379" height="64" xlink:href="https://a1.nyt.com/assets/homepage/20170810-135137/images/foundation/logos/nyt-logo-379x64.svg" src="https://a1.nyt.com/assets/homepage/20170810-135137/images/foundation/logos/nyt-logo-379x64.png" alt="The New York Times" border="0"/>
+ </svg>
+
+ </a></h2>
+ <ul class="masthead-menu">
+ <li class="date">Thursday, August 31, 2017</li><li class="todays-paper"><a href="http://www.nytimes.com/pages/todayspaper/index.html" data-collection="todays-paper"><i class="icon sprite-icon"></i>Today’s Paper</a></li><li class="video"><a href="https://www.nytimes.com/video" data-collection="video"><i class="icon sprite-icon"></i>Video</a></li><li id="weather" class="weather hidden" data-collection="weather"><button class="button weather-button"></button></li><li id="markets" class="markets hidden" data-collection="markets"></li>
+ </ul>
+
+ </div><!-- close masthead-meta -->
+
+ <nav id="mini-navigation" class="mini-navigation">
+ <h2 class="visually-hidden">Quick Site Sections Navigation</h2>
+ <ul class="mini-navigation-menu">
+ <li>
+ <button class="button sections-button">
+ <i class="icon sprite-icon"></i>
+ <span class="button-text">Sections</span>
+ </button>
+ </li><li>
+ <button class="button search-button">
+ <i class="icon sprite-icon"></i>
+ <span class="button-text">Search</span>
+ </button>
+ </li>
+
+ <li class="shortcuts-9A43D8FC-F4CF-44D9-9B34-138D30468F8F ">
+ <a href="https://www.nytimes.com/pages/world/index.html">World</a>
+ </li>
+
+
+ <li class="shortcuts-23FD6C8B-62D5-4CEA-A331-6C2A9A1223BE ">
+ <a href="https://www.nytimes.com/pages/national/index.html">U.S.</a>
+ </li>
+
+
+ <li class="shortcuts-80E6DEE6-87E4-4AD0-9152-14FA6B07E5AB ">
+ <a href="https://www.nytimes.com/pages/politics/index.html">Politics</a>
+ </li>
+
+
+ <li class="shortcuts-C4DC8C0C-E148-4201-BF10-82F1C903DBFB ">
+ <a href="https://www.nytimes.com/pages/nyregion/index.html">N.Y.</a>
+ </li>
+
+
+ <li class="shortcuts-104D1E63-9701-497B-8CF4-A4D120C9014E domestic">
+ <a href="https://www.nytimes.com/pages/business/index.html">Business</a>
+ </li>
+
+
+ <li class="shortcuts-A257D89A-0D3C-40AF-9C34-1A25A7947D94 international">
+ <a href="https://www.nytimes.com/pages/business/international/index.html">Business</a>
+ </li>
+
+
+ <li class="shortcuts-AD8090D7-4137-4D71-84C8-70DA3BD89778 domestic">
+ <a href="https://www.nytimes.com/pages/opinion/index.html">Opinion</a>
+ </li>
+
+
+ <li class="shortcuts-09736473-CB3F-4B2F-9772-3AF128ABE12D international">
+ <a href="https://www.nytimes.com/pages/opinion/international/index.html">Opinion</a>
+ </li>
+
+
+ <li class="shortcuts-78FBAD45-31A9-4EC7-B172-7D62A2B9955E ">
+ <a href="https://www.nytimes.com/pages/technology/index.html">Tech</a>
+ </li>
+
+
+ <li class="shortcuts-A4B35924-DB6C-4EA3-997D-450810F4FEE6 ">
+ <a href="https://www.nytimes.com/section/science">Science</a>
+ </li>
+
+
+ <li class="shortcuts-7D6BE1AF-8CD8-430B-8B2A-17CD0EAA99AC ">
+ <a href="https://www.nytimes.com/pages/health/index.html">Health</a>
+ </li>
+
+
+ <li class="shortcuts-DE2B278B-2783-4506-AAD5-C15A5BB6DA1A domestic">
+ <a href="https://www.nytimes.com/pages/sports/index.html">Sports</a>
+ </li>
+
+
+ <li class="shortcuts-BE66F420-C51B-461D-B487-CACF62E94AAE international">
+ <a href="https://www.nytimes.com/pages/sports/international/index.html">Sports</a>
+ </li>
+
+
+ <li class="shortcuts-C5BFA7D5-359C-427B-90E6-6B7245A6CDD8 domestic">
+ <a href="https://www.nytimes.com/pages/arts/index.html">Arts</a>
+ </li>
+
+
+ <li class="shortcuts-0202D0E4-C59B-479A-BD42-6F1766459781 international">
+ <a href="https://www.nytimes.com/pages/arts/international/index.html">Arts</a>
+ </li>
+
+
+ <li class="shortcuts-B3DFBD82-F298-43B3-9458-219B4F6AA2A5 domestic">
+ <a href="https://www.nytimes.com/pages/fashion/index.html">Style</a>
+ </li>
+
+
+ <li class="shortcuts-CC9E2674-F6C4-4A39-813B-F5AB0C515CEA international">
+ <a href="https://www.nytimes.com/pages/style/international/index.html">Style</a>
+ </li>
+
+
+ <li class="shortcuts-D9C94A2B-0364-4D25-8383-592CC66F82D4 domestic">
+ <a href="https://www.nytimes.com/pages/dining/index.html">Food</a>
+ </li>
+
+
+ <li class="shortcuts-FDEFB811-B483-4C3D-A25A-FD07BE5EAD96 international">
+ <a href="https://www.nytimes.com/pages/dining/international/index.html">Food</a>
+ </li>
+
+
+ <li class="shortcuts-FDA10AC4-4738-4099-91E8-15584765C8D7 ">
+ <a href="https://www.nytimes.com/section/travel">Travel</a>
+ </li>
+
+
+ <li class="shortcuts-E57A148E-0CB9-4C02-966D-28B119710151 ">
+ <a href="https://www.nytimes.com/pages/magazine/index.html">Magazine</a>
+ </li>
+
+
+ <li class="shortcuts-052C33AD-1404-4DB6-AA70-0901DB1AD95B ">
+ <a href="https://www.nytimes.com/section/t-magazine">T Magazine</a>
+ </li>
+
+
+ <li class="shortcuts-92720057-BCB6-4BDB-9351-12F29393259F ">
+ <a href="https://www.nytimes.com/section/realestate">Real Estate</a>
+ </li>
+
+ <li><button class="button all-sections-button">all</button></li>
+ </ul>
+ </nav>
+ <div class="search-flyout-panel flyout-panel">
+ <button class="button close-button" type="button"><i class="icon"></i><span class="visually-hidden">Close search</span></button>
+ <nav class="search-form-control form-control layout-horizontal">
+ <h2 class="visually-hidden">Site Search Navigation</h2>
+ <form class="search-form" role="search">
+ <div class="control">
+ <div class="label-container visually-hidden">
+ <label for="search-input">Search NYTimes.com</label>
+ </div>
+ <div class="field-container">
+ <input id="search-input" name="search-input" type="text" class="search-input text" autocomplete="off" placeholder="Search NYTimes.com" />
+
+ <button type="button" class="button clear-button" tabindex="-1" aria-describedby="clear-search-input"><i class="icon"></i><span id="clear-search-input" class="visually-hidden">Clear this text input</span></button>
+ <div class="auto-suggest" style="display: none;">
+ <ol></ol>
+ </div>
+ <button class="button submit-button" type="submit">Go</button>
+ </div>
+ </div><!-- close control -->
+ </form>
+ </nav>
+
+
+ </div><!-- close flyout-panel -->
+ <div id="notification-modals" class="notification-modals"></div>
+
+ </header><!-- close masthead -->
+ <div id="masthead-placeholder" class="masthead-placeholder"></div>
+ <nav id="navigation" class="navigation">
+ <h2 class="visually-hidden">Site Navigation</h2>
+ </nav><!-- close navigation -->
+
+ <nav id="mobile-navigation" class="mobile-navigation hidden">
+ <h2 class="visually-hidden">Site Mobile Navigation</h2>
+ </nav><!-- close mobile-navigation -->
+
+ <div id="navigation-edge" class="navigation-edge"></div>
+ <div id="page" class="page">
+ <main id="main" class="main" role="main">
+ <div id="Top" class="ad hp-top-ad nocontent nojitter robots-nocontent"></div>
+ <div id="Top_Close" class="ad hp-top-ad-close hidden nocontent robots-nocontent"></div>
+ <div id="Top5" class="ad top5-ad hidden nocontent robots-nocontent"></div>
+
+ <div class="span-abc-region region">
+ <div class="collection">
+ <script type="text/javascript">
+ /*! geoip_resolver 2016-06-30 */
+ +function(a){"function"==typeof define&&define.amd?define("nytint-geoip",[],a):window.nytint_geoip=a()}(function(){"use strict";var a="nyt-geoip",b=document.getElementsByTagName("html"),c=!1,d=["continent_code","country_code","region","dma_code","postal_code","time_zone","zone_abbr"],e=function(b){var c=new XMLHttpRequest,d=null,e=null;try{if(d=JSON.parse(sessionStorage.getItem(a)),d&&void 0!==d.country_code)return g(d,b),d}catch(h){}c.onload=function(a){return a.target?(e=f(a.target),"undefined"==typeof e?!1:(g(e,b),e)):!1},c.onreadystatechange=function(){4===c.readyState&&200!==c.status&&console.error(c.status)},c.open("GET","https://geoip.newsdev.nytimes.com/",!0);try{c.responseType="json"}catch(h){}c.send()},f=function(a){var b=null;switch(!0){case"json"===a.responseType:b=a.response.data;break;case null!==a.response:b=JSON.parse(a.response).data;break;case null!==a.responseText:b=JSON.parse(a.responseText).message}return void 0!==b?b:null},g=function(e,f){if(!b)return!1;try{sessionStorage.setItem(a,JSON.stringify(e))}catch(g){}if(void 0!==e&&!c){for(var i,j=0;i=d[j];j++)if(void 0!==e[i]){var k=["geo",h(i),e[i]].join("-");b[0].classList.add(k)}c=!0}return"function"==typeof f&&f(e),e},h=function(a){var b=a;switch(!0){case a.indexOf("zone_abbr")>=0:b=a.replace("zone_abbr","us-timezone");break;case a.indexOf("_zone")>=0:b=a.replace("_zone","zone");break;case a.indexOf("_code")>=0:b=a.replace("_code","")}return b};return window.NYTINT_TESTING||e(),e});
+ (function() { require(['nytint-geoip']); })();
+ </script><!-- HP CSS Fixes -->
+ <style>
+
+ /* Fix for Small Video Promo Heds */
+ .story.theme-feature.video-promo-small.updated-video-promo-small .video-promo-small-container .story-heading{ padding: 0!important; }
+
+
+ /* Fix MM icons in kickers */
+ .kicker .icon:before { top: 0px; }
+ .kicker .media.slideshow { margin-bottom: 0px; }
+
+ /* Hiding Hacks */
+
+ .nythpHideKickers .kicker, .nythpHideBylines .byline, .nythpHideTimestamps .timestamp {
+ display: none;
+ }
+
+ /* banner hed modifications */
+ .span-ab-top-region .story.theme-summary .story-heading {
+ line-height: 2.1rem;
+ }
+
+ /* spacing fixes */
+ .collection.headlines {
+ margin-bottom: 12px;
+ }
+
+
+ /* Alterations to the Centered Feature Photo Spot Treatment */
+
+ .b-column .photo-spot-region .story.theme-feature .story-heading {
+ font-size: 1.35rem;
+ line-height: 1.65rem;
+ }
+
+ .b-column .photo-spot-region .story.theme-feature .story-heading {
+ padding: 0 22px; /* for headline wrapping */
+ }
+ .b-column .photo-spot-region .story.theme-feature .summary {
+ line-height: 18px;
+ }
+
+ .story.theme-feature .summary {
+ line-height: 1.125rem;
+ color: #333;
+ margin: 0 10px 3px;
+ }
+
+
+
+
+ /* Bullet Treatments */
+
+ .ab-column .collection article ul, .span-abc-region .collection article ul {
+ margin-top: 8px;
+ margin-bottom: -3px;
+ }
+
+ .ab-column .collection article ul.refer, .span-abc-region .collection article ul.refer {
+ margin-top: 2px;
+ margin-bottom: 0px;
+ }
+
+ .ab-column .collection article ul li, .span-abc-region .collection article ul li {
+ position: relative;
+ margin-bottom: 8px;
+ padding-left: 9px;
+ font-size: 13px;
+ font-size: 0.8125rem;
+ line-height: 18px;
+ line-height: 1.125rem;
+ font-weight: 400;
+ }
+ .ab-column .collection article ul li:before, .span-abc-region .collection article ul li:before {
+ border-radius: 1px;
+ background-color: #000;
+ width: 3px;
+ height: 3px;
+ content: '';
+ position: absolute;
+ display: block;
+ top: 7px;
+ left: 2px;
+ }
+
+ .ab-column .collection article ul li:last-child, .span-abc-region .collection article ul li:last-child {
+ margin-bottom: 0=;
+ }
+
+ .ab-column .collection article[data-collection-renderstyle="HpSumMediumMedia"] ul {
+ margin-bottom: 0px;
+ }
+
+ .theme-news-headlines li {
+ position: relative!important;
+ margin-bottom: 4px!important;
+ padding-left: 8px!important;
+ }
+ .theme-news-headlines {
+ margin-top: 2px!important;
+ }
+
+ .a-column .story.theme-summary.headline-medium-summary .medium-thumb {
+ float: none;
+ clear: none;
+ margin-left: 0px;
+ }
+
+ .first-column-region .story.theme-summary.headline-medium-summary .story-heading, .a-lede-package-region .story.theme-summary.headline-medium-summary .story-heading {
+ font-style: italic;
+ }
+
+ .first-column-region .collection:first-child .story.theme-summary.headline-medium-summary .story-heading, .a-lede-package-region .collection:first-child .story.theme-summary.headline-medium-summary .story-heading {
+ font-size: 26px;
+ font-size: 1.625rem;
+ line-height: 28px;
+ line-height: 1.75rem;
+ font-weight: 700;
+ }
+
+
+ /* Breaking News/Developing Headers */
+ .nythpBreaking {
+ color: #A81817;
+ border-top: 3px solid #A81817;
+ padding-top: 2px;
+ padding-bottom: 3px;
+ margin-top: 12px;
+ }
+
+ .nythpBreaking h6 {
+ text-transform: uppercase;
+ font-family: "nyt-franklin",arial,helvetica,sans-serif;
+ font-weight: 700;
+ }
+
+ .nythpDeveloping {
+ color: #FD8249;
+ border-top-color: #FD8249;
+ }
+
+ .nythpBreaking.nythpNoRule {
+ border: none;
+ margin-top: 0px;
+ }
+
+ .above-banner-region .nythpBreaking {
+ margin-bottom: 10px;
+ }
+
+
+ /* BEGIN .HPHEADER STYLING */
+
+ .hpHeader, .span-abc-region h3.collection-kicker {
+ margin-bottom: 10px;
+ }
+
+ .hpHeader h6, .span-abc-region h3.collection-kicker {
+ color: #000;
+ font-family: "nyt-franklin",helvetica,arial,sans-serif;
+ text-transform: uppercase;
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: .5px;
+ border-bottom: 2px solid #ccc;
+ display: inline-block;
+ line-height: 15px;
+ }
+
+ .span-abc-region h6, .span-abc-region h3.collection-kicker {
+ font-size: 13px;
+ line-height: 16px;
+
+ }
+
+ .hpHeader h6 a, .span-abc-region h3.collection-kicker a,
+ .hpHeader h6 a:visited, .span-abc-region h3.collection-kicker a:visited {
+ text-decoration: none;
+ color: #000;
+ }
+
+ .hpHeader h6:hover,
+ .hpHeader h6:active {
+ border-color: #222222;
+ }
+
+ .above-banner-region .hpHeader, .span-ab-top-region .hpHeader, .span-ab-lede-package-region .hpHeader, .b-column .hpHeader, .c-column .hpHeader {
+ text-align: center;
+ }
+
+ .above-banner-region .hpHeader h6, .span-ab-top-region .hpHeader h6, .span-ab-lede-package-region .hpHeader h6, .b-column .hpHeader h6, .c-column .hpHeader h6 {
+ margin: 0 auto;
+ padding: 0 2px;
+ }
+
+ .span-ab-top-region .a-column .hpHeader, .span-ab-lede-package-region .a-column .hpHeader, .b-column .split-layout .hpHeader, .b-column .nythpSplitCode .hpHeader {
+ text-align: left;
+ }
+
+ .b-column .split-layout .hpHeader h6, .b-column .nythpSplitCode .hpHeader h6 {
+ margin: 0;
+ padding: 0;
+ }
+
+ .hpLive h6, .hpLive h6:hover, .hpLive h6:active {
+ color: #a81817;
+ border-color: #a81817;
+ }
+
+ .hpDeveloping h6, .hpDeveloping h6:hover, .hpDeveloping h6:active {
+ color: #fd8249;
+ border-color: #fd8249;
+ }
+
+ .hpSingleRule {
+ border-top: 1px solid #e2e2e2;
+ padding-top: 12px;
+ }
+
+
+
+ /* added by matte to fix slideshow bug */
+
+ .loader-container {
+ display: none;
+ }
+
+ /* Newsletter Sign-Up Modules (updated 6/28/2017) */
+
+ div.notification-widget {
+ min-height:38px;
+ }
+ .notification-signup .notifications-title {
+ color: black;
+ font-family: "nyt-cheltenham-sh",georgia,"times new roman",times,serif;
+ font-size: 15px;
+ line-height: 18px;
+ font-weight: 200;
+ }
+ .notification-signup .notification-text {
+ margin-top: 3px;
+ margin-bottom: 5px;
+ color: #999;
+ font-size: 13px;
+ line-height: 18px;
+ }
+
+ .notification-widget input,
+ .notification-widget button {
+ outline: none;
+ }
+
+ .notification-widget .notify-email {
+ height: 30px;
+ width: 312px;
+ margin-top: 0px;
+ padding: 14px;
+ color: #a6a6a6;
+ border: 1px solid rgba(97,136,166,.5);
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-top-right-radius: 0px;
+ border-bottom-right-radius: 0px;
+ box-shadow: none;
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ font-size: 14px;
+ line-height: 1;
+ }
+ .notification-widget .notify-email:hover{
+ border-color:rgba(97,136,166,1);
+ border-width:2px;
+ padding:13px;
+ }
+ .notification-widget .notify-email.error {
+ border-color: #FF9859;
+ }
+ .notification-widget .button {
+ margin-top: 0px;
+ padding: 8px;
+ border: none;
+ border-top-left-radius: 0px;
+ border-bottom-left-radius: 0px;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ background: #6288a5;
+ color: white;
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 1;
+ text-transform: capitalize;
+ }
+
+ .notification-widget .dirtyform .button:hover,
+ .notification-widget .signedin .button:hover {
+ background-color: #326891;
+ }
+
+ .notification-widget .signedin .button {
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ }
+
+ .notification-widget div.error {
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ color: #FF9859;
+ font-size: 12px;
+ margin-top: 5px;
+ }
+
+ /* post subscribe notification */
+ .notification-signup span {
+ font-size: 14px;
+ color: ##ffffff;
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ font-weight: 600;
+ }
+ .notification-widget div[data-status="initial"]{
+ display:inline-block;
+ float:right;
+ }
+
+ .notification-widget div[data-status="working"]{
+ opacity:0;
+ }
+
+ /* already subscribed notification */
+ .notification-widget div[data-status="initial"] div,
+ .notification-widget div[data-status="subscribed"] div,
+ .notification-widget div[data-status="working"] div {
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ font-size: 14px;
+ color: #666 !important;
+ }
+ .notification-widget div[data-status="initial"] div{
+ line-height: 31px;
+ }
+ .notification-widget div[data-status="initial"] div div{
+ margin-right:8px;
+ display:inline-block;
+ }
+
+ .notification-widget div[data-status="initial"] div .account-name,
+ .notification-widget div[data-status="subscribed"] div .account-name{
+ font-weight: 700;
+ }
+ .notification-signup a {
+ font-size: 14px;
+ font-family: 'nyt-franklin', Helvetica, sans-serif;
+ font-weight: 400;
+ margin-top: 10px;
+ display: block;
+ color: #6187a6!important;
+ }
+ .notification-widget .email-address a{
+ margin-top: 5px;
+ display: block;
+ color: #6187a6!important;
+ }
+ .viewport-medium-10 .interactive-leadin, .viewport-medium-10 .notification-signup .notification-text{
+ max-width: 375px;
+ }
+ .notification-signup{
+ padding-top:11px;
+ }
+
+ a[data-reactid=".0.0.2"] {
+ font-size: 11px; }
+
+ .notification-widget div[data-status="initial"][data-show-disclaimer="true"] div.disclaimer {
+ display: none;
+ color: #CCC !important;
+ font-size: 14px;
+ }
+
+ .notification-widget div.signedin[data-status="initial"][data-show-disclaimer="true"] div.disclaimer {
+ top: -20px;
+ right: 14px;
+ position: relative;
+ height: 8px;
+ display: block;
+ }
+
+ .notification-widget div.not-signedin[data-status="initial"][data-show-disclaimer="true"] div.disclaimer {
+ display: block;
+ text-align: right;
+ }
+
+
+ .notification-widget div[data-status="initial"][data-show-disclaimer="true"] div.disclaimer a {
+ color: #CCC !important;
+ text-decoration: underline;
+ }
+
+ .notification-widget div[data-status="initial"][data-show-disclaimer="true"] div.welcome {
+ position: relative;
+ top: -5px;
+ color: #999 !important;
+ }
+
+
+ /* Show All hack */
+ html.showAllGeoAb .timedBriefingHide, html.showAllGeoAb .nythpElectionPredictionCCol, html.showAllGeoAb .nythpNYRegionPromo, html.showAllGeoAb .nythpGeoCanada, html.showAllGeoAb .nythpCAToday { display: block !important }
+
+
+ </style>
+
+
+
+
+ <!-- Begin Smarter Living Styles and Scripts -->
+
+ <script type="text/javascript">
+ require(['foundation/main'], function () {
+ require([
+ 'jquery/nyt',
+ 'foundation/helpers/utils',
+ 'foundation/views/page-manager'
+ ], function ($, utils, pageManager) {
+ $(document).ready(function () {
+ var param = {
+ 'contentCollection': 'smarter-living'
+ };
+ $('.nythpSmarterLiving a').each(function () {
+ var href = $(this).attr('href');
+ href = utils.appendQueryParams(href, param);
+ $(this).attr('href', href);
+ });
+ });
+ });
+ });
+ </script>
+ <style>
+
+ .nythpSmarterLiving {
+ zoom:1;
+ border-bottom: 0px solid #e2e2e2;
+ margin-bottom: 12px;
+ }
+
+ .nythpSmarterLiving:after,
+ .nythpSmarterLiving:before {
+ content: "";
+ display: table;
+ }
+ .nythpSmarterLiving:after{
+ clear: both;
+ }
+ .nythpSmarterLiving article {
+ float:left;
+ width: 177px;
+ }
+ .nythpSmarterLiving article.story.theme-summary {
+ margin-bottom: 0px;
+ }
+
+ .nythpSmarterLiving article:last-child,
+ .nythpSmarterLiving article:nth-of-type(2) {
+ margin-left: 21px;
+ }
+
+ .nythpSmarterLiving .byline, .nythpSmarterLiving .summary, .nythpSmarterLiving article .kicker, .nythpSmarterLiving .theme-comments, .nythpSmarterLiving .refer {
+ display: none;
+ }
+
+ .nythpSmarterLiving .story.theme-summary .story-heading {
+ width: 96px;
+ float: right;
+ }
+
+ .nythpSmarterLiving .story.theme-summary .thumb {
+ margin: 3px 6px 6px 0px;
+ float: left;
+ clear: none;
+ }
+
+
+ </style></div>
+ <div class="collection">
+ <style type="text/css">
+ .span-abc-region .story.theme-summary h1.story-heading {
+ font-size: 38px;
+ font-style: italic;
+ line-height: 44px;
+ margin-bottom: 10px;
+ margin-top:-8px;
+ font-family: "nyt-cheltenham",georgia,"times new roman",times,serif;
+ }
+
+ .span-abc-region .nythpParisMega1stCol article[data-collection-renderstyle="LedeSum"].story.theme-summary h2.story-heading {
+ font-size: 1.625rem;
+ line-height: 1.75rem;
+ font-weight: 700;
+ font-style: italic;
+ font-family: "nyt-cheltenham",georgia,"times new roman",times,serif;
+ letter-spacing: 0.01em;
+ word-spacing: -0.1em;
+ }
+
+ .span-abc-region .nythpParisMega1stCol .story.theme-summary h2.story-heading {
+ font-size: 20px;
+ font-size: 1.25rem;
+ line-height: 22px;
+ line-height: 1.375rem;
+ font-weight: 700;
+ font-style: normal;
+ font-family: "nyt-cheltenham",georgia,"times new roman",times,serif;
+ letter-spacing: 0.01em;
+ word-spacing: -0.1em;
+ }
+
+ .span-abc-region .nythpSpanABCMiddleColumn .nytHPSplit-AB-Half .story.theme-summary h2.story-heading {
+ font-size: 16px;
+ font-size: 1rem;
+ line-height: 22px;
+ line-height: 1.375rem;
+ font-weight: 700;
+ font-style: normal;
+ font-family: "nyt-cheltenham",georgia,"times new roman",times,serif;
+ letter-spacing: 0.01em;
+ word-spacing: -0.1em;
+ }
+
+
+ .span-abc-region .nythpSpanABCMiddleColumn .nytHPSplit-AB-Half .story.theme-summary .thumb {
+ margin-top:-20px;
+ }
+
+
+
+
+ </style><!--FOR ALL CAPS-->
+ <style>
+ .span-ab-top-region .story.theme-summary h1.story-heading{
+ line-height:45px;
+ margin-top:2px;
+ }
+ </style>
+
+ <div class="span-ab-top-region"><article class="story theme-summary banner" data-collection-renderstyle="Banner"><h1 class="story-heading">
+
+ <!-- Link and Hed Go Here -->
+ <a href="https://www.nytimes.com/2017/08/30/us/small-towns-harvey.html">The Storm Marches On as Houston Surveys Wreckage
+ </a>
+
+
+
+
+ <span class="product-label theme-nyt-now" style="display:none;"><span class="visually-hidden">NYT Now</span><i class="icon dot-logo-icon"></i></span></h1></article></div></div>
+ <div class="collection">
+ <style>
+ .nythpSplitCode .column { margin-left: 21px; }
+ .nythpSplitCode .column:first-child { margin-left: 0px; }
+ .nythpSplitCode.layout { background: none; }
+ .nythpSplitCode .media.photo.medium-thumb { float: none; margin-left: 0; }
+ .nythpSpanABCMiddleColumn {width: 573px; float: right;}
+ .nythpSplitCode .nythpSpanABC_ABCol {width: 771px; float: left;}
+ .nythpSplitCode .nythpSpanABC_SpanABBottom {clear: both;}
+ <!--.nythpParisMegaBanner {} -->
+ </style>
+
+ <div class="layout nythpSplitCode nythpParisMega">
+ <div class="nythpSpanABC_ABCol">
+ <div class="column nythpParisMega1stCol"><div>
+
+ </div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005401006" data-story-id="100000005401006" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/small-towns-harvey.html">Hundreds of Towns in Harvey’s Path Hit by Devastating Rain</a></h2>
+
+ <p class="byline">By CAMPBELL ROBERTSON, RICK ROJAS and SHAILA DEWAN </p>
+
+ <p class="summary"><ul> <li>Harvey, downgraded to a tropical depression, moved to the east and punished a region of roughly 11 million people.
+ </li>
+ <li>In Houston, after the first night of a citywide curfew, many residents went outside for the first time in days to survey the wreckage. Officials have reported at least 38 deaths.
+ </li>
+ </ul></p>
+
+
+ </article>
+ </div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005399284" data-story-id="100000005399284" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h3 class="kicker"><span class="timestamp"><strong>Live</strong></span> </h3>
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/hurricane-harvey-flooding-houston.html">Explosions Reported at Chemical Plant</a></h2>
+
+ <p class="byline">By THE NEW YORK TIMES <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="6:47 AM" data-utc-timestamp="1504176457">6:47 AM ET</time></p>
+
+ <p class="summary">Two explosions were reported at a chemical plant about 30 miles from Houston that was damaged by Hurricane Harvey.</p>
+
+ <p class="theme-comments">
+ <a href="https://www.nytimes.com/2017/08/30/us/hurricane-harvey-flooding-houston.html?hp&amp;target=comments#commentsContainer" class="comments-link"><i class="icon sprite-icon comments-icon"></i><span class="comment-count">&nbsp;Comments</span></a>
+ </p>
+
+ </article>
+ </div>
+ <div class="collection">
+ <style>
+ .first-column-region .nythpMakeAColHedLikeB .story.theme-summary .story-heading,
+ .a-lede-package-region .nythpMakeAColHedLikeB .story.theme-summary .story-heading,
+ .span-abc-region .nythpParisMega1stCol .nythpMakeAColHedLikeB .story.theme-summary h2.story-heading {
+ font-size: 14px;
+ font-size: 0.875rem;
+ line-height: 16px;
+ line-height: 1rem;
+ font-weight: 700;
+ font-style: normal;
+ font-family: "nyt-cheltenham-sh",georgia,"times new roman",times,serif;
+ margin-bottom: 2px;
+ }
+ </style>
+
+ <div class="nythpMakeAColHedLikeB"><article class="story theme-summary" id="topnews-100000005395157" data-story-id="100000005395157" data-rank="1" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/28/us/hurricane-harvey-texas.html">A Guide to the Storm</a></h2>
+
+
+ <p class="summary">Here’s an overview of coverage by The New York Times.</p>
+
+
+ </article>
+ </div></div>
+ <div class="collection">
+ </div></div>
+ <div class="column nythpSpanABCMiddleColumn"><div></div>
+ <div class="collection">
+ <!--
+
+======================================================
+
+THIS IS A GENERATED TEMPLATE FILE. DO NOT EDIT.
+
+======================================================
+
+-->
+ <!-- hp promo -->
+
+ <!-- this file is generated from src/style.less -->
+ <style>/*
+ SHOW LIBRARY
+ ===================== */
+ .g-show-xsmall,
+ .g-show-small,
+ .g-show-smallplus,
+ .g-show-submedium,
+ .g-show-sub-medium,
+ .g-show-medium,
+ .g-show-large,
+ .g-show-xlarge {
+ display: none;
+ }
+ .g-show {
+ display: block;
+ }
+ .lt-ie10 .g-aiImg {
+ width: 100%;
+ }
+ /* story top */
+ .story.theme-main .story-header .story-meta .story-heading {
+ max-width: 720px;
+ margin: 0 auto 10px;
+ text-align: center;
+ line-height: 2.844rem;
+ font-size: 2.4rem;
+ }
+ @media only screen and (max-width: 1244px) {
+ .story.theme-main .story-header .story-meta .story-heading {
+ line-height: 2.5596rem;
+ font-size: 2.16rem;
+ }
+ }
+ @media only screen and (max-width: 719px) {
+ .story.theme-main .story-header .story-meta .story-heading {
+ line-height: 2.2752rem;
+ font-size: 1.92rem;
+ }
+ }
+ .story.theme-main .story-header .story-meta .interactive-leadin.summary {
+ max-width: 460px;
+ margin: 0 auto 20px auto;
+ text-align: center;
+ font-size: 17px;
+ line-height: 1.6;
+ }
+ .story.theme-main .story-header .story-meta .byline-dateline {
+ text-align: center;
+ }
+ /* top asset */
+ .g-top-asset {
+ margin-left: auto;
+ margin-right: auto;
+ margin-bottom: 20px;
+ }
+ .g-top-asset img {
+ width: 100%;
+ }
+ /* body text */
+ .g-body {
+ max-width: 460px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .viewport-medium .g-body {
+ font-size: 17px;
+ line-height: 1.6;
+ }
+ .g-body a {
+ text-decoration: underline;
+ }
+ /* subhed */
+ .g-subhed h2 {
+ max-width: 460px;
+ margin: 2em auto 1em auto;
+ font: 700 1.2em/1.3em 'nyt-franklin', arial, sans-serif;
+ text-align: center;
+ }
+ .viewport-small-10 .g-subhed h2 {
+ font-size: 1.5em;
+ }
+ /* refer text box */
+ .g-refer {
+ max-width: 460px;
+ margin: 0 auto 25px;
+ padding: 12px 15px;
+ box-sizing: border-box;
+ background: #fffcd9;
+ }
+ .g-refer .g-body {
+ font-family: 'nyt-franklin', arial, sans-serif;
+ font-size: 16px;
+ line-height: 1.3;
+ margin-bottom: 0;
+ }
+ .g-refer a {
+ text-decoration: underline;
+ }
+ /* images */
+ .g-item-image {
+ margin: 25px auto;
+ }
+ .g-item-image img {
+ width: 100%;
+ }
+ /* video */
+ .g-item-video {
+ margin: 25px auto;
+ }
+ /* sources and credits */
+ .g-asset-source {
+ padding-top: 3px;
+ }
+ .g-asset-source .g-source {
+ font: 400 12px/15px 'nyt-franklin', arial, sans-serif;
+ color: #999;
+ }
+ .g-asset-source .g-pipe {
+ margin: 0 6px 0 3px;
+ font: 400 12px/12px 'nyt-franklin', arial, sans-serif;
+ color: #999;
+ }
+ .g-asset-source .g-caption {
+ font: 300 14px/17px georgia, 'times new roman', times, serif;
+ }
+ .g-asset-source .g-credit {
+ font: 400 12px/17px 'nyt-franklin', arial, sans-serif;
+ display: inline-block;
+ color: #999;
+ }
+ /* graphics */
+ .g-item-ai2html {
+ margin: 25px auto;
+ }
+ p.g-asset-hed {
+ font: 700 16px/18px 'nyt-franklin', arial, sans-serif;
+ margin-bottom: 0;
+ }
+ .g-map-key {
+ float: none;
+ clear: both;
+ overflow: hidden;
+ margin: 10px auto 4px auto;
+ }
+ .g-map-key .g-key-row {
+ margin-bottom: 5px;
+ margin-right: 15px;
+ float: left;
+ }
+ .viewport-small .g-map-key .g-key-row {
+ width: auto;
+ margin-bottom: 0;
+ }
+ .viewport-small-20 .g-map-key .g-key-row {
+ width: auto;
+ }
+ .g-map-key .g-key-row .g-key-rect,
+ .g-map-key .g-key-row .g-key-circle {
+ vertical-align: middle;
+ margin-right: 8px;
+ display: inline-block;
+ }
+ .g-map-key .g-key-row p {
+ font: 500 0.9em/1.6 'nyt-franklin', arial, sans-serif;
+ display: inline-block;
+ vertical-align: middle;
+ margin: -2px 0 0 0;
+ }
+ .viewport-small .g-map-key .g-key-row p {
+ max-width: 92%;
+ }
+ .viewport-small-20 .g-map-key .g-key-row p {
+ width: auto;
+ max-width: none;
+ }
+ .g-map-key .g-key-row .g-key-rect {
+ width: 22px;
+ height: 10px;
+ }
+ .g-map-key .g-key-row .g-key-circle {
+ width: 9px;
+ height: 9px;
+ border-radius: 50%;
+ }
+ .g-map-key .g-key-row .g-key-custom {
+ width: 20px;
+ height: 20px;
+ background-size: 100%;
+ display: block;
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ margin: -4px 2px 0 0;
+ }
+ .viewport-small .g-map-key .g-key-row-title p {
+ width: 100%;
+ max-width: none;
+ }
+ .g-red-dot,
+ .g-black-dot {
+ display: inline-block;
+ background: #d00;
+ color: white;
+ font-weight: bold;
+ width: 20px;
+ height: 20px;
+ font: 700 14px/1.4 'nyt-franklin', arial, sans-serif;
+ text-align: center;
+ border-radius: 10px;
+ line-height: 20px;
+ }
+ .g-black-dot {
+ background: #222;
+ }
+ /* column text */
+ .g-column-container {
+ max-width: 460px;
+ margin: 20px auto 0 auto;
+ }
+ .viewport-medium .g-column-container {
+ max-width: 1050px;
+ }
+ .viewport-large .g-column-container {
+ margin-bottom: 30px;
+ }
+ .g-column-container .g-column-hed {
+ font-family: 'nyt-franklin', arial, sans-serif;
+ font-weight: 700;
+ margin-bottom: 2px;
+ }
+ .g-column-container .g-column-col {
+ vertical-align: top;
+ }
+ .viewport-small .g-column-container .g-column-col {
+ display: block;
+ min-width: 100%;
+ }
+ .viewport-medium .g-column-container .g-column-col {
+ min-width: 0;
+ display: inline-block;
+ margin-right: 15px;
+ }
+ .viewport-medium .g-column-container .g-column-col:last-child {
+ margin-right: 0;
+ }
+ .g-column-container .g-column-asset,
+ .g-column-container .g-column-image {
+ margin-bottom: 8px;
+ }
+ .g-column-container .g-column-image img {
+ width: 100%;
+ }
+ /* tables */
+ .g-table {
+ margin: 0 auto;
+ margin-bottom: 25px;
+ }
+ .g-table tr {
+ border-bottom: 1px solid #ececec;
+ }
+ .g-table p {
+ font: 500 14px/1.4 'nyt-franklin', arial, sans-serif;
+ text-align: left;
+ margin: 6px 0;
+ }
+ /* charts */
+ .g-chart {
+ margin: 0 auto;
+ margin-bottom: 25px;
+ font: 500 14px/1.4 'nyt-franklin', arial, sans-serif;
+ }
+ .g-chart .g-chart-header {
+ font-weight: bold;
+ }
+ .g-chart .g-chart-row,
+ .g-chart .g-chart-header {
+ clear: both;
+ height: 22px;
+ margin-bottom: 9px;
+ }
+ .g-chart .g-chart-bar-container,
+ .g-chart .g-chart-label {
+ float: left;
+ height: 100%;
+ }
+ .g-chart .g-chart-bar-container {
+ margin-left: 20px;
+ }
+ .g-chart .g-chart-bar-pos,
+ .g-chart .g-chart-bar-neg {
+ height: 100%;
+ float: left;
+ }
+ .g-chart .g-chart-label,
+ .g-chart .g-chart-bar {
+ padding-top: 3px;
+ }
+ .g-chart .g-chart-label.not-first {
+ margin-left: 20px;
+ }
+ .g-chart .g-chart-bar {
+ height: 100%;
+ background: lightsteelblue;
+ position: relative;
+ }
+ .g-chart .g-chart-bar-label {
+ padding-left: 6px;
+ }
+ .g-chart .g-chart-bar-neg .g-chart-bar {
+ float: right;
+ }
+ .g-chart .g-chart-bar-neg .g-chart-bar-label {
+ text-align: right;
+ padding-right: 6px;
+ padding-left: 0px;
+ }
+ .g-chart .out-label {
+ padding-top: 3px;
+ display: none;
+ }
+ .g-chart .outside .out-label {
+ display: block;
+ }
+ .g-chart .outside .in-label {
+ display: none;
+ }
+ .g-chart .g-bold {
+ font-weight: bold;
+ }
+ /* grid */
+ .g-grid {
+ margin-bottom: 15px;
+ }
+ .g-grid .g-grid-item {
+ position: relative;
+ display: inline-block;
+ min-width: calc(50% - 5px);
+ }
+ .viewport-small-20 .g-grid .g-grid-item {
+ min-width: calc(33% - 5px);
+ }
+ .viewport-medium .g-grid .g-grid-item {
+ min-width: 0;
+ }
+ .g-grid .g-grid-item p {
+ font: 500 15px/1.4 'nyt-franklin', arial, sans-serif;
+ position: absolute;
+ bottom: 10px;
+ left: 10px;
+ color: #fff;
+ margin-bottom: 0;
+ }
+ /* lazy images */
+ .g-freebird-lazy {
+ display: block;
+ width: 100%;
+ height: auto;
+ }
+ .g-freebird-lazy.ll-init {
+ transition: opacity 0.3s ease-out;
+ opacity: 0;
+ }
+ .g-freebird-lazy.ll-loaded {
+ opacity: 1;
+ }
+ /* Mobile issues */
+ /* Get rid of border under intro and share tools on mobile */
+ .story-header.interactive-header {
+ border-bottom: none !important;
+ }
+ /* Share tools issues */
+ /* Pad out the kicker/sharetool space */
+ .story.theme-main .story-header .story-meta .kicker-container {
+ margin-bottom: 12px;
+ }
+ /* Override the moving sharetools on mobile */
+ .story.theme-main .story-header .story-meta .kicker-container .sharetools {
+ position: relative;
+ float: right;
+ /*right: 0px;*/
+ bottom: auto;
+ left: auto;
+ width: auto;
+ margin-top: -6px;
+ clear: none;
+ }
+ /* Maintain the proper space with the section name and kicker next to share tools */
+ .story.theme-main .story-header .story-meta .interactive-kicker {
+ float: left;
+ width: 70%;
+ display: inline-block;
+ }
+ .g-graphic.g-graphic-freebird .g-ad-wrapper {
+ margin: 30px auto;
+ max-width: 1050px;
+ }
+ .viewport-medium .g-graphic.g-graphic-freebird .g-ad-wrapper {
+ margin: 50px auto;
+ }
+ .g-graphic.g-graphic-freebird .g-ad-wrapper .ad {
+ border-top: 1px solid #e2e2e2 !important;
+ border-bottom: 1px solid #e2e2e2 !important;
+ margin: 0 auto;
+ padding: 10px 0;
+ overflow: hidden;
+ max-width: 100%;
+ }
+ .g-graphic.g-graphic-freebird .g-ad-wrapper .ad div {
+ margin: 0 auto;
+ display: block !important;
+ }
+ .g-graphic.g-graphic-freebird .g-ad-wrapper iframe {
+ margin: 0 auto;
+ display: block;
+ }
+ .g-graphic.g-graphic-freebird .g-ad-wrapper .g-ad-text {
+ text-align: center;
+ font: 500 12px/1.2 "nyt-franklin", arial, sans-serif;
+ color: #bfbfbf;
+ text-transform: uppercase;
+ margin-bottom: 7px;
+ }
+ .ad.top-ad {
+ border: none;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ /* Center headlines for standalone and embedded interactives */
+ /* @import (inline) "nyt5/centered-headline.css"; */
+ /* Fullbleed interactive-graphic container */
+ /* remove left offset */
+ .viewport-medium-50 .masthead.masthead-theme-standard,
+ .viewport-large-20 .masthead.masthead-theme-standard {
+ margin-left: 0;
+ }
+
+ .viewport-large-70 .masthead.masthead-theme-standard {
+ margin-left: auto;
+ }
+
+ .viewport-medium-50 .masthead.masthead-theme-standard .quick-navigation,
+ .viewport-large-20 .masthead.masthead-theme-standard .quick-navigation {
+ left: 15px;
+ }
+
+ #navigation-edge {
+ display: none;
+ }
+
+ /* fullbleed #main */
+ #main {
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ .viewport-medium-10 #main {
+ width: 100%;
+ max-width: 100%;
+ }
+
+ /* constrain template containers */
+ .ad.top-ad {
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+ .story-header.interactive-header,
+ .story.theme-main .story-footer,
+ .related-coverage {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+
+ .viewport-medium-10 .ad.top-ad,
+ .viewport-medium-10 .story-header.interactive-header,
+ .viewport-medium-10 .story.theme-main .story-footer,
+ .viewport-medium-10 .related-coverage {
+ max-width: 720px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .viewport-medium-30 .ad.top-ad,
+ .viewport-medium-30 .story-header.interactive-header,
+ .viewport-medium-30 .story.theme-main .story-footer,
+ .viewport-medium-30 .related-coverage {
+ max-width: 945px;
+ }
+
+ .viewport-large-30 .ad.top-ad,
+ .viewport-large-30 .story-header.interactive-header,
+ .viewport-large-30 .story.theme-main .story-footer,
+ .viewport-large-30 .related-coverage {
+ max-width: 1050px;
+ }
+
+ .g-body, .g-map-key, .g-asset-source, .g-table-container, .g-column-container, .g-asset-hed {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+
+ .viewport-large .g-body,
+ .viewport-large .g-map-key,
+ .viewport-large .g-asset-source,
+ .viewport-large .g-table-container,
+ .viewport-large .g-column-container,
+ .viewport-large .g-asset-hed {
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ /* For use with LaziestLoader */
+ /* @import (inline) "nyt5/laziestloader.css"; */
+ /* Fix spacing at top of story */
+ .has-top-ad .story.theme-interactive,
+ .has-ribbon .story.theme-interactive {
+ margin-top: 10px;
+ }
+
+ /* Fix comments button margin */
+ .story.theme-interactive .comments-button.theme-kicker {
+ margin-top: 0;
+ }
+
+ /* Get rid of border under intro and share tools on mobile */
+ .page-interactive-default .story.theme-main .story-header {
+ border-bottom: none;
+ }
+
+ /* Pad out the kicker/sharetool space */
+ .story.theme-interactive .story-meta .kicker {
+ margin-bottom: 22px;
+ }
+
+ .viewport-medium-10 .story.theme-interactive .story-meta .kicker {
+ margin-bottom: 24px;
+ }
+
+ /* Override the moving sharetools on mobile */
+ .story.theme-interactive .story-header .story-meta .kicker-container .sharetools {
+ position: relative;
+ left: auto;
+ bottom: auto;
+ width: auto;
+ margin-top: -6px;
+ float: right;
+ clear: none;
+ }
+
+ /* Maintain the proper space with the section name and kicker next to share tools */
+ .story.theme-interactive .story-header .story-meta .interactive-kicker {
+ float: left;
+ width: 65%;
+ display: inline-block;
+ }
+
+ /* Gets rid of the extra space under the intro that puts too much space there in mobile and desktop */
+ .page-interactive-default .story.theme-main .story-header {
+ margin-bottom: 0;
+ }
+
+ .page-interactive-default .story.theme-main .story-header .story-meta {
+ margin-bottom: 10px;
+ }
+
+ /*Fixes styling on share tools at bottom of minimal interactives*/
+ .story.theme-minimal .sharetools.layout-horizontal{
+ width:auto;
+ margin-top:11px;
+ }
+ .story.theme-minimal .sharetools.layout-horizontal .sharetool {
+ display: inline-block;
+ border-top: 0;
+ }
+ .story.theme-minimal .sharetools.layout-horizontal .sharetool:first-child a {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: none;
+ }
+ .story.theme-minimal .sharetools.layout-horizontal .sharetool a {
+ padding-left: 15px;
+ padding-right: 5px;
+ height: 20px;
+ border-left: 1px solid #e2e2e2;
+ }
+ .story.theme-minimal .sharetools.layout-horizontal .sharetool a:hover {
+ background-color: transparent;
+ }
+
+ /* uncomment to fix related content and footer layout on max_width: 720 pages */
+ /*
+.related-coverage {
+ max-width: 720px;
+}
+
+.viewport-medium-30 .page-footer nav ul,
+.viewport-medium-50 .page-footer nav ul {
+ margin-left: 28px;
+}
+
+.viewport-medium-30 .page-footer nav.last-nav {
+ float: none;
+}
+
+.viewport-medium-30 .page-footer nav.last-nav ul {
+ margin-left: 239px;
+}
+*/
+
+ .g-subhed h2 {
+ font: 300 24px/1.2 'nyt-franklin', Arial, sans-serif;
+ margin-bottom: 0.65em;
+ }
+ .viewport-small-10 .g-subhed h2 {
+ font-size: 28px;
+ }
+ .g-animation {
+ margin: 0 -15px;
+ max-width: calc(130%);
+ }
+ @media (min-width: 780px) {
+ .g-animation {
+ margin: 0;
+ }
+ }
+ .g-locator {
+ max-width: 300px;
+ margin: 100px auto 30px auto;
+ }
+ .g-locator .g-locator-in {
+ display: inline-block;
+ width: 120px;
+ vertical-align: middle;
+ z-index: -1;
+ position: relative;
+ overflow: hidden;
+ }
+ .viewport-medium .g-locator .g-locator-in {
+ margin: 0 -10px 0 -20px;
+ }
+ .g-locator .g-subhed {
+ display: inline-block;
+ width: calc(100% - 130px);
+ vertical-align: middle;
+ z-index: 100;
+ position: relative;
+ }
+ .g-request p.g-body {
+ padding: 8px 16px;
+ border-radius: 3px;
+ box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.15);
+ border: 1px solid #e4e4e4;
+ font: 300 16px/1.4 'nyt-franklin', Arial, sans-serif;
+ }
+ div.tooltip {
+ top: -1000px;
+ position: fixed;
+ padding: 5px;
+ background: rgba(255, 255, 255, 0.95);
+ border: 1px solid lightgray;
+ pointer-events: none;
+ width: 300px;
+ font: 300 14px / 1.2 'nyt-franklin', Arial, sans-serif;
+ }
+ .tooltip-hidden {
+ opacity: 0;
+ transition: all .3s;
+ transition-delay: .1s;
+ }
+ @media (max-width: 590px) {
+ div.tooltip {
+ bottom: -1px;
+ width: calc(100%);
+ left: -1px !important;
+ right: -1px !important;
+ top: auto !important;
+ width: auto !important;
+ }
+ }
+ #g-harvey_basemap-box {
+ position: relative;
+ }
+ #g-houston-rescue-map-box {
+ position: absolute;
+ top: 0px;
+ font: 300 15px / 1.2 'nyt-franklin';
+ }
+ #g-houston-rescue-map-box .g-key {
+ width: 200px;
+ text-align: center;
+ position: absolute;
+ bottom: 50px;
+ right: 4px;
+ font-size: 20px;
+ font-weight: 600;
+ }
+ #g-houston-rescue-map-box .g-key p {
+ font: 300 15px / 1.2 'nyt-franklin';
+ display: inline-block;
+ margin-bottom: 0px;
+ }
+ #g-houston-rescue-map-box .g-key .g-key-circle {
+ width: 9px;
+ height: 9px;
+ display: inline-block;
+ margin-right: 8px;
+ position: relative;
+ top: -2px;
+ border-radius: 100%;
+ }
+ .description {
+ margin-left: 10px;
+ font-size: 15px;
+ line-height: 15px;
+ max-width: 150px;
+ padding: 8px 12px;
+ color: #000;
+ border-radius: 3px;
+ background: #ffffff;
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.33);
+ }
+ .description:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 50%;
+ width: 0;
+ height: 0;
+ border: 5px solid transparent;
+ border-right-color: #ffffff;
+ border-left: 0;
+ margin-top: -5px;
+ margin-left: -5px;
+ }
+ .description.lefty:after {
+ position: absolute;
+ left: auto;
+ right: 0;
+ top: 50%;
+ width: 0;
+ height: 0;
+ border: 5px solid transparent;
+ border-left-color: #ffffff;
+ box-shadow: none;
+ border-right: 0;
+ margin-top: -5px;
+ margin-right: -5px;
+ }
+ .hpgraphic {
+ width: 573px;
+ position: relative;
+ z-index: 3;
+ min-height: 322px;
+ background: #eee;
+ }
+ .hpgraphic .g-item-ai2html {
+ margin: 0;
+ }
+ .hpgraphic .description {
+ font-size: 13px;
+ border-radius: 2px;
+ padding: 2px 5px;
+ }
+ .g-timer {
+ opacity: 0;
+ }
+ .g-text strong,
+ .g-text b {
+ font-family: 'nyt-franklin', arial, sans-serif;
+ }
+ </style>
+
+ <a href="https://www.nytimes.com/interactive/2017/08/30/us/houston-flood-rescue-cries-for-help.html">
+ <div class="g-graphic hpgraphic g-graphic-freebird" data-preview-slug="2017-08-30-houston-rescues">
+
+ <div class="g-item-ai2html" style="max-width:573px;">
+
+
+
+
+
+ <!-- SCOOP CSS -->
+ <!-- Generated by ai2html v0.65.5 - 2017-08-31 01:22 -->
+ <!-- ai file: harvey_hp.ai -->
+ <!-- preview: 2017-08-30-houston-rescues -->
+ <!-- scoop: houston-rescues-animation-573 -->
+ <style type='text/css' media='screen,print'>
+ #g-harvey_hp-Artboard_2-box {
+ max-width:600px;
+ }
+ #g-harvey_hp-Artboard_2-box .g-artboard {
+ margin:0 auto;
+ }
+ #g-harvey_hp-Artboard_2-box .g-artboard p {
+ margin:0;
+ }
+ .g-aiAbs {
+ position:absolute;
+ }
+ .g-aiImg {
+ display:block;
+ width:100% !important;
+ }
+ .g-aiPointText p { white-space: nowrap; }
+ #g-harvey_hp-Artboard_2 {
+ position:relative;
+ overflow:hidden;
+ width:573px;
+ }
+ #g-harvey_hp-Artboard_2 p {
+ font-family:nyt-franklin,arial,helvetica,sans-serif;
+ font-weight:500;
+ font-size:13px;
+ line-height:17px;
+ filter:alpha(opacity=100);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
+ opacity:1;
+ letter-spacing:0.2em;
+ text-align:left;
+ color:rgb(156,156,156);
+ text-transform:none;
+ padding-bottom:0;
+ padding-top:0;
+ mix-blend-mode:normal;
+ font-style:normal;
+ }
+ #g-harvey_hp-Artboard_2 .g-pstyle0 {
+ font-weight:700;
+ font-size:21px;
+ line-height:23px;
+ filter:alpha(opacity=70);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
+ opacity:0.7;
+ letter-spacing:0em;
+ color:rgb(0,0,0);
+ }
+ #g-harvey_hp-Artboard_2 .g-pstyle1 {
+ text-align:center;
+ }
+ #g-harvey_hp-Artboard_2 .g-pstyle2 {
+ font-weight:300;
+ font-style:italic;
+ filter:alpha(opacity=40);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);
+ opacity:0.4;
+ mix-blend-mode:multiply;
+ letter-spacing:0.3em;
+ text-align:center;
+ color:rgb(5,96,147);
+ }
+ #g-harvey_hp-Artboard_2 .g-pstyle3 {
+ font-weight:300;
+ font-size:15px;
+ line-height:23px;
+ letter-spacing:0em;
+ color:rgb(0,0,0);
+ }
+ #g-harvey_hp-Artboard_2 .g-pstyle4 {
+ font-weight:300;
+ font-size:12px;
+ line-height:23px;
+ filter:alpha(opacity=60);
+ -ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
+ opacity:0.6;
+ letter-spacing:0em;
+ color:rgb(0,0,0);
+ }
+
+ </style>
+
+ <!-- SCOOP HTML -->
+ <!-- Generated by ai2html v0.65.5 - 2017-08-31 01:22 -->
+ <!-- ai file: harvey_hp.ai -->
+ <!-- preview: 2017-08-30-houston-rescues -->
+ <!-- scoop: houston-rescues-animation-573 -->
+ <div id="g-harvey_hp-Artboard_2-box" class="ai2html">
+
+ <!-- Artboard: Artboard_2 -->
+ <div id="g-harvey_hp-Artboard_2" class="g-artboard g-artboard-v3">
+ <img id="g-ai0-0" class="g-aiImg" src="https://static01.nyt.com/newsgraphics/2017/08/30/houston-rescues/3217ab7ea858a2c388ceacbca5f753f34faf5343/harvey_hp-Artboard_2.png"/>
+ <div id="timer" class="g-timer g-aiAbs g-aiPointText" style="top:10.2033%;margin-top:-11.9px;left:5.2511%;width:150px;">
+ <p class="g-pstyle0">12 a.m. Monday</p>
+ </div>
+ <div id="g-ai0-2" class="g-text g-aiAbs g-aiPointText" style="top:31.0397%;margin-top:-8.9px;left:75.3489%;margin-left:-7.8534%;width:92px;">
+ <p class="g-pstyle1">BEAUMONT</p>
+ </div>
+ <div id="g-ai0-3" class="g-text g-aiAbs g-aiPointText" style="top:45.0983%;margin-top:-17.2px;left:81.9842%;margin-left:-5.6719%;width:67px;">
+ <p class="g-pstyle1">PORT</p>
+ <p class="g-pstyle1">ARTHUR</p>
+ </div>
+ <div id="g-ai0-4" class="g-text g-aiAbs g-aiPointText" style="top:60.5454%;margin-top:-8.9px;left:28.1349%;margin-left:-6.719%;width:79px;">
+ <p class="g-pstyle1">HOUSTON</p>
+ </div>
+ <div id="g-ai0-5" class="g-text g-aiAbs g-aiPointText" style="top:72.8327%;margin-top:-17.5px;left:82.169%;margin-left:-6.8063%;width:80px;">
+ <p class="g-pstyle2">GULF OF</p>
+ <p class="g-pstyle2">MEXICO</p>
+ </div>
+ <div id="g-ai0-6" class="g-text g-aiAbs g-aiPointText" style="top:93.7756%;margin-top:-11.9px;left:79.5415%;width:102px;">
+ <p class="g-pstyle3">Rescue request</p>
+ </div>
+ <div id="g-ai0-7" class="g-text g-aiAbs g-aiPointText" style="top:93.4021%;margin-top:-11.7px;left:1.6973%;width:45px;">
+ <p class="g-pstyle4">10 miles</p>
+ </div>
+ </div>
+
+ </div>
+
+
+
+
+
+ </div>
+
+ </div>
+ </a>
+
+ <script>
+ define('_nytg/2017-08-30-houston-rescues/assets', function() { return 'https://static01.nyt.com/newsgraphics/2017/08/30/houston-rescues/3217ab7ea858a2c388ceacbca5f753f34faf5343/'; });
+ define('_nytg/2017-08-30-houston-rescues/big-assets', function() { return 'https://static01.nyt.com/newsgraphics/2017/08/30/houston-rescues/assets/'; });
+
+ require(['foundation/main'], function() {
+ require(['https://static01.nyt.com/newsgraphics/2017/08/30/houston-rescues/3217ab7ea858a2c388ceacbca5f753f34faf5343/build.js']); // generated from src/script.js
+ });
+ </script>
+ <!-- Pipeline: 2017-08-30-houston-rescues August 31, 2017, 01:24AM 3217ab7ea858a2c388ceacbca5f753f34faf5343 --></div>
+ <div class="collection">
+ <div class="photo-spot-region"><div class="story theme-summary lede"><article class="story theme-summary" id="topnews-100000005401681" data-story-id="100000005401681" data-rank="1" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/interactive/2017/08/30/us/houston-flood-rescue-cries-for-help.html">‘Running Out of Time’</a></h2>
+
+
+ <p class="summary">As Houston was overcome by floodwaters, thousands of people cried out for help online.</p>
+
+
+ </article>
+ </div></div></div>
+ <div class="collection">
+ <div style="margin-top: +5px;"></div></div>
+ <div class="collection">
+ <hr class="single-rule" />
+ </div>
+ <div class="collection">
+ <style>
+ .nythpSplitCode .column { margin-left: 21px; }
+ .nythpSplitCode .column:first-child { margin-left: 0px; }
+ .nythpSplitCode.layout { background: none; }
+ .nythpSplitCode .media.photo.medium-thumb { float: none; margin-left: 0; }
+ </style>
+
+ <div class="layout nythpSplitCode wide-b-layout">
+ <div class="column"><div></div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005400393" data-story-id="100000005400393" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/victims-harvey-death-toll-houston.html">Clinging to Her Drowning Mother, a Girl Survives</a></h2>
+
+ <p class="byline">By SIMON ROMERO and JULIE BOSMAN </p>
+
+ <p class="summary">“Mama was saying her prayers,” 3-year-old Jordyn Grace told a relative.</p>
+
+
+ </article>
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <div style="margin-top: -10px;"></div> </li>
+ <li>
+ <article class="story" id="topnews-100000005400407" data-story-id="100000005400407" data-rank="1" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/us/harvey-death-toll.html">Stories Emerge of Harvey’s Victims as Death Toll Rises</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005398786" data-story-id="100000005398786" data-rank="2" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/us/hurricane-center-timeline.html">From Forecast to Disaster: A Timeline</a></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <div class="collection">
+ </div></div>
+ <div class="column b-column"><div></div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005401072" data-story-id="100000005401072" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/houston-flooding-growth-regulation.html">Houston, the Limitless City, Is Forced to Consider Its Limits</a></h2>
+
+ <p class="byline">By MANNY FERNANDEZ and RICHARD FAUSSET </p>
+
+ <p class="summary">A muscular metropolitan area that embraced growth now wonders whether growth made its flooding woes worse.</p>
+
+
+ </article>
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <div style="margin-top: -10px;"></div> </li>
+ <li>
+ <article class="story" id="topnews-100000005396839" data-story-id="100000005396839" data-rank="1" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/business/harvey-recovery-houston-businesses.html">After Harvey, Will Big Business Repay Houston’s Generosity?</a></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005400885" data-story-id="100000005400885" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/business/harvey-aid-sba-disaster-loans.html">Victims Face Hurdles, and Maybe Bills, in Getting Aid</a></h2>
+
+ <p class="byline">By STACY COWLEY </p>
+
+ <p class="summary">Thousands are applying for federal assistance, but it may be slow to arrive and require them to take on debt.</p>
+
+
+ </article>
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <div style="margin-top: -10px;"></div> </li>
+ <li>
+ <article class="story" id="topnews-100000005396158" data-story-id="100000005396158" data-rank="1" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/28/us/donate-harvey-charities-scams.html">Where to Donate to Storm Victims (and How to Avoid Scams)</a></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <div class="collection">
+ </div></div>
+ <div class="column"><div></div>
+ <div class="collection">
+ </div></div></div></div>
+ <div class="collection">
+ </div></div></div>
+ <div class="column megaSPanC"><div></div>
+ <div class="collection">
+ <style type="text/css">
+ .paywall-hp-note {
+ padding: 13px 15px 12px 15px;
+ background-color: #f7f7f7;
+ border-radius: 2px;
+ margin-bottom: 18px;
+ }
+ .paywall-hp-note:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+ .paywall-hp-note h5,
+ .paywall-hp-note p {
+ font: 400 14px/16px 'nyt-cheltenham-sh',georgia,'times new roman',serif;
+ color: #808080;
+ -webkit-font-smoothing: antialiased;
+ }
+ .paywall-hp-note h5 {
+ font-weight: 700;
+ color: #4d4d4d;
+ margin-bottom: 9px;
+ }
+ .paywall-hp-note p {
+ font-style: italic;
+ margin-bottom: 0;
+ }
+ </style>
+ <div class="paywall-hp-note">
+ <h5>To Our Readers</h5>
+ <p>The Times is providing free digital access to coverage of the storm.</p>
+ </div></div>
+ <div class="collection">
+ <hr class="single-rule" style="width: 50%; text-align: center; margin: 12px auto 0;" />
+
+ </div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005399973" data-story-id="100000005399973" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/port-arthur-flooding.html">Port Arthur Overcome by Instant Flooding: ‘Our Whole City Is Underwater’</a></h2>
+
+ <p class="byline">By JONAH ENGEL BROMWICH </p>
+
+ <p class="summary">Jefferson County, Tex., about 100 miles east of Houston, was “slammed with 20 inches of rainfall” overnight. Thousands of people were stranded on their roofs, on top of cars and in attics.</p>
+
+
+ </article>
+ </div>
+ <div class="collection">
+ <figure class="story theme-feature video media video-promo-small updated-video-promo-small">
+ <a href="https://www.nytimes.com/video/us/100000005400001/harvey-houston-port-arthur-flooding.html">
+ <div class="video-promo-small-container" style="background-image: url('https://static01.nyt.com/images/2017/08/31/us/31storm4_xp/31storm4_xp-filmstrip.jpg');">
+ <div class="metadata">
+ <div class="play-button-and-duration">
+ <div class="play-icon">
+ <svg class="play-circle" height="28" width="28">
+ <circle cx="14" cy="14" r="13" stroke="#FFF" fill="transparent" stroke-width="1.5" />
+ </svg>
+ <svg version="1.2" class="play-triangle" height="10" width="10">
+ <polyline points="5,1.2264973081037427 10,9.88675134594813 0,9.88675134594813" transform="rotate(90, 5, 5)"></polyline>
+ </svg>
+ </div>
+ <div class="duration">
+ <span>1:36</span>
+ </div>
+ </div>
+ <h2 class="story-heading">
+ Path of Destruction Continues </h2>
+ <div class="orientation-icon">
+ <svg width="28px" height="28px" viewBox="0 0 28 28" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink">
+ <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Compass-Cover-ACol">
+ <g id="360-View-Indicator">
+ <circle id="Oval-44" fill-opacity="0.1" fill="#000000" cx="14" cy="14" r="12.75"></circle>
+ <path d="M14,28 C21.7319865,28 28,21.7319865 28,14 C28,6.2680135 21.7319865,0 14,0 C6.2680135,0 0,6.2680135 0,14 C0,21.7319865 6.2680135,28 14,28 Z M14,26.75 C21.0416306,26.75 26.75,21.0416306 26.75,14 C26.75,6.95836944 21.0416306,1.25 14,1.25 C6.95836944,1.25 1.25,6.95836944 1.25,14 C1.25,21.0416306 6.95836944,26.75 14,26.75 Z" id="Border" fill="#FFFFFF"></path>
+ <g id="eyes" transform="translate(9.488845, 14.454531)" fill="#FFFFFF">
+ <ellipse id="Oval-12" cx="2.01115463" cy="2.04546933" rx="1.5" ry="1.5"></ellipse>
+ <ellipse id="Oval-12-Copy" cx="7.01115463" cy="2.04546933" rx="1.5" ry="1.5"></ellipse>
+ </g>
+ <path d="M13.9960842,13 L21.5,5.88357462 C19.5796583,4.05113973 16.9264365,3 13.9960843,3 C11.065732,3 8.42034167,4.05113973 6.5,5.88357462 L13.9960842,13 Z" id="view" fill="#FFFFFF"></path>
+ </g>
+ </g>
+ </g>
+ </svg>
+ </div>
+ </div>
+ </div>
+ </a>
+ <figcaption class="caption">
+ <p class="credit">By MALACHY BROWNE, BARBARA MARCOLINI and CHRIS CIRILLO</p>
+ </figcaption>
+ </figure>
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005398038" data-story-id="100000005398038" data-rank="0" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/29/us/harvey-email-callout.html">Are You Affected? We Want to Hear From You</a></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <div class="collection">
+ </div></div>
+
+ <div style="background-color: #fff;"><div></div>
+ </div>
+ </div>
+ </div></div>
+ <div class="collection">
+ <script>function getFlexData() { return {"data":{"item":[{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/09\/01\/science\/01WATER1\/01WATER1-videoSixteenByNine310.jpg","type":"article","headline":"A Sea of Hazards in Floodwaters","link":"https:\/\/www.nytimes.com\/2017\/08\/31\/us\/houston-contaminated-floodwaters.html"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/insider\/mattress-mack\/mattress-mack-videoSixteenByNine310.jpg","type":"video","headline":"A Mattress Store Turned Shelter","link":"https:\/\/www.nytimes.com\/video\/us\/100000005398367\/houston-harvey-mattress-shelter.html"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/us\/stormpics74\/stormpics74-videoSixteenByNine310.jpg","type":"slideshow","headline":"Harvey in Pictures","link":"https:\/\/www.nytimes.com\/2017\/08\/27\/us\/harvey-pictures-hurricane-storm.html?mcubz=0&_r=0"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/dining\/360-tamircover\/360-tamircover-videoSixteenByNine310.jpg","type":"video","headline":"The Daily 360: Submerged Streets ","link":"https:\/\/www.nytimes.com\/video\/us\/100000005399523\/harvey-houston-flooding-rescue.html"}]}}; }var NYTD=NYTD || {}; NYTD.FlexTypes = NYTD.FlexTypes || []; NYTD.FlexTypes.push({"target":"FT100000005396835","type":"HP Thumbstrip","data":{"item":[{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/09\/01\/science\/01WATER1\/01WATER1-videoSixteenByNine310.jpg","type":"article","headline":"A Sea of Hazards in Floodwaters","link":"https:\/\/www.nytimes.com\/2017\/08\/31\/us\/houston-contaminated-floodwaters.html"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/insider\/mattress-mack\/mattress-mack-videoSixteenByNine310.jpg","type":"video","headline":"A Mattress Store Turned Shelter","link":"https:\/\/www.nytimes.com\/video\/us\/100000005398367\/houston-harvey-mattress-shelter.html"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/us\/stormpics74\/stormpics74-videoSixteenByNine310.jpg","type":"slideshow","headline":"Harvey in Pictures","link":"https:\/\/www.nytimes.com\/2017\/08\/27\/us\/harvey-pictures-hurricane-storm.html?mcubz=0&_r=0"},{"thumb":"https:\/\/static01.nyt.com\/images\/2017\/08\/31\/dining\/360-tamircover\/360-tamircover-videoSixteenByNine310.jpg","type":"video","headline":"The Daily 360: Submerged Streets ","link":"https:\/\/www.nytimes.com\/video\/us\/100000005399523\/harvey-houston-flooding-rescue.html"}]}});</script><link rel="stylesheet" type="text/css" href="https://static01.nyt.com/newsgraphics/2015/hp-thumbstrip/assets/build.css" />
+ <style>
+ .nytd-hp-thumbstrip{ display:flex; }
+ .nytd-hp-thumbstrip .ts-link{ width:100%; }
+ .nytd-hp-thumbstrip .ts-link .ts-item{ width:94%; }
+ </style>
+
+ <script>
+ var NYTG_ASSETS = "_assets/";
+ var NYTG_BIG_ASSETS = "_big_assets/";
+ require(['foundation/main'], function() {
+ require(["https://static01.nyt.com/newsgraphics/2015/hp-thumbstrip/assets/build.js"]);
+ });
+ </script><div id="FT100000005396835"></div></div>
+ <div class="collection">
+ <hr class="scotch-rule" /></div>
+ </div><!-- close span-abc-region -->
+
+ <div class="span-ab-layout layout">
+
+ <div class="ab-column column">
+
+ <section id="top-news" class="top-news">
+ <h2 class="section-heading visually-hidden">Top News</h2>
+
+
+
+
+ <div class="wide-b-layout layout">
+
+ <div class="a-column column">
+
+ <div class="first-column-region region">
+
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005399055" data-story-id="100000005399055" data-rank="0" data-collection-renderstyle="HpSumSmallMedia">
+
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/politics/trump-missouri-tax-plan.html">Trump Pitches Tax Cuts on Business as Aiding Middle Class</a></h2>
+
+ <p class="byline">By JULIE HIRSCHFELD DAVIS and BINYAMIN APPELBAUM </p>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/30/us/politics/trump-missouri-tax-plan.html"><img src="https://static01.nyt.com/images/2017/08/31/us/31dc-trump-promo/31dc-trump-promo-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="summary">
+ In a speech on Wednesday in Springfield, Mo., President Trump laid out the case for cutting taxes for businesses and individuals and for simplifying the tax code. </p>
+
+ <p class="theme-comments">
+ <a href="https://www.nytimes.com/2017/08/30/us/politics/trump-missouri-tax-plan.html?hp&amp;target=comments#commentsContainer" class="comments-link"><i class="icon sprite-icon comments-icon"></i><span class="comment-count">&nbsp;Comments</span></a>
+ </p>
+
+ </article>
+
+ </div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005398833" data-story-id="100000005398833" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/29/business/economy/trump-corporate-tax-plan.html">Trump Tax Plan May Free Corporate Dollars. Then What?</a></h2>
+
+ <p class="byline">By PATRICIA COHEN </p>
+
+ <p class="summary">Republicans are promising to stimulate investment and create jobs. But steps to undo tax dodges may not produce the intended economic lift.</p>
+
+ <p class="theme-comments">
+ <a href="https://www.nytimes.com/2017/08/29/business/economy/trump-corporate-tax-plan.html?hp&amp;target=comments#commentsContainer" class="comments-link"><i class="icon sprite-icon comments-icon"></i><span class="comment-count">&nbsp;Comments</span></a>
+ </p>
+
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005401510" data-story-id="100000005401510" data-rank="0" data-collection-renderstyle="HpSumMediumMedia" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/judge-texas-sanctuary-cities.html">Federal Judge Blocks Texas’ Ban on ‘Sanctuary Cities’</a></h2>
+
+ <p class="byline">By MANNY FERNANDEZ </p>
+
+ <p class="summary">
+ The temporary ruling prevents the state from going ahead with provisions that were to go into effect on Friday. </p>
+
+
+
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/2017/08/30/us/judge-texas-sanctuary-cities.html"><img src="https://static01.nyt.com/images/2017/08/31/us/31sanctuary/31sanctuary-mediumFlexible177.jpg" alt="" /></a>
+ </div>
+ </figure>
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005401018" data-story-id="100000005401018" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/politics/trump-obamacare-enrollment-markets-subsidies.html">Seeking to Stabilize Health Markets, but Offering Few Details</a></h2>
+
+ <p class="byline">By ROBERT PEAR </p>
+
+ <p class="summary">A Trump administration official refused to say what, if anything, the government would do to encourage people to sign up for health insurance under the Affordable Care Act.</p>
+
+
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005399964" data-story-id="100000005399964" data-rank="0" data-collection-renderstyle="HpSumMediumMedia" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/us/politics/trump-north-korea-extortion-money.html">On North Korea, Trump Says ‘Talking Is Not the Answer!’</a></h2>
+
+ <p class="byline">By MARK LANDLER </p>
+
+ <p class="summary">
+ While Mr. Trump’s threats against North Korea have been unnerving, it is the prospect of a risky dialogue that most unsettles former officials. </p>
+
+
+
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/2017/08/30/us/politics/trump-north-korea-extortion-money.html"><img src="https://static01.nyt.com/images/2017/08/31/us/31dc-prexy1/merlin-to-scoop-126571670-887690-mediumFlexible177.jpg" alt="" /></a>
+ </div>
+ </figure>
+ </article>
+ </div>
+ <div class="collection headlines">
+ <h3 class="kicker collection-kicker">More in Politics</h3>
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005400483" data-story-id="100000005400483" data-rank="0" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/us/politics/trump-russia-michael-cohen.html">Trump Lawyer ‘Vehemently’ Denies Russian Collusion</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401238" data-story-id="100000005401238" data-rank="1" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/us/politics/us-aid-pakistan-terror.html">U.S. Gives Military Assistance to Pakistan, With Strings Attached</a> </h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005400786" data-story-id="100000005400786" data-rank="0" data-collection-renderstyle="HpSum" data-start-time="" data-end-time="">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/health/gene-therapy-cancer.html">F.D.A. Approves Gene-Altering Leukemia Treatment</a></h2>
+
+ <p class="byline">By DENISE GRADY </p>
+
+ <p class="summary">The Food and Drug Administration approved the first treatment that alters a patient’s cells to fight cancer. It will cost $475,000.</p>
+
+
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection headlines">
+ <h3 class="kicker collection-kicker">More News</h3>
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005401772" data-story-id="100000005401772" data-rank="0" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/31/world/asia/building-collapse-in-mumbai-kills-at-least-7.html">Building Collapse in Mumbai Kills at Least 7</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401309" data-story-id="100000005401309" data-rank="1" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/sports/tennis/maria-sharapova-timea-babos-us-open.html">U.S. Open: Maria Sharapova, With No Tears, Advances</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005399026" data-story-id="100000005399026" data-rank="2" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/us/politics/eric-schmidt-google-new-america.html">Think Tank Backed by Google Ousts Critic of Monopolies</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401178" data-story-id="100000005401178" data-rank="3" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/world/americas/brazil-amazon-mining-temer-environmentalists-judge.html">Brazilian Judge Stymies Plan for Mining in Amazon Region</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005400012" data-story-id="100000005400012" data-rank="4" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/world/europe/trump-press-united-nations.html">U.N. Human Rights Chief Condemns Trump’s Attacks on Media</a></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005400793" data-story-id="100000005400793" data-rank="5" data-collection-renderstyle="HpBlogHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/world/asia/afghanistan-troop-totals.html">11,000 U.S. Troops in Afghanistan, Pentagon Says</a></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <!--
+
+======================================================
+
+THIS IS A GENERATED TEMPLATE FILE. DO NOT EDIT.
+
+======================================================
+
+-->
+ <!-- this is generated from src/style.css -->
+ <style>.tips-promo {
+ position: relative;
+ width: 100%;
+ height: auto; }
+ .tips-promo .nyt-logo {
+ position: absolute;
+ top: 1rem;
+ left: 0;
+ right: 0;
+ margin: 0 auto;
+ width: 6rem; }
+ .tips-promo svg {
+ width: 6rem;
+ margin: 0 auto; }
+ .tips-promo .text-bubble {
+ padding: 1rem 0; }
+ .tips-promo .text-bubble h1 {
+ font-family: "nyt-cheltenham", times, serif;
+ color: black;
+ position: relative;
+ font-size: 1.5rem;
+ font-weight: 400;
+ line-height: 0.9;
+ -webkit-font-smoothing: antialiased;
+ z-index: 0; }
+ .tips-promo .text-bubble h2 {
+ font-family: "nyt-cheltenham-sh", times, serif;
+ color: black;
+ position: relative;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.3;
+ -webkit-font-smoothing: antialiased;
+ z-index: 0;
+ padding-top: 0.5rem; }
+ .tips-promo .text-bubble .contact {
+ font-family: "nyt-cheltenham-sh", times, serif;
+ display: inline-block;
+ border-style: none;
+ border-color: transparent;
+ font-size: 13px;
+ font-weight: bold;
+ padding: 0;
+ background: none;
+ color: #326891;
+ text-decoration: underline; }
+ </style>
+
+ <div id="g-graphic" data-preview-slug="2016-10-31-tips-hp">
+ <div class="tips-promo">
+ <div class="text-bubble">
+ <h1><a href="https://www.nytimes.com/tips">Got a confidential news tip?</a></h1>
+ <h2>The New York Times offers several ways to get in touch with and provide materials to our journalists. <a href="https://www.nytimes.com/tips"><span class="contact">Learn more</span></a>.</h2>
+ </div>
+ </div>
+ </div>
+
+ <script>
+ var _gaq = _gaq || [];
+ define('_nytg/2016-10-31-tips-hp/assets', function() { return 'https://static01.nyt.com/newsgraphics/2016/10/31/tips-hp/00b5b741a6c5682e24f945c547f78fbe98f2c27f/'; });
+ define('_nytg/2016-10-31-tips-hp/big-assets', function() { return 'https://static01.nyt.com/newsgraphics/2016/10/31/tips-hp/assets/'; });
+
+ require(['foundation/main'], function() {
+ require(['https://static01.nyt.com/newsgraphics/2016/10/31/tips-hp/00b5b741a6c5682e24f945c547f78fbe98f2c27f/build.js']); // generated from src/script.js
+ });
+ </script>
+ <!-- Pipeline: 2016-10-31-tips-hp December 22, 2016, 09:17PM 00b5b741a6c5682e24f945c547f78fbe98f2c27f --></div>
+
+ </div><!-- close first-column-region -->
+
+ </div><!-- close a-column -->
+
+ <div class="b-column column">
+
+
+
+ <div class="second-column-region region">
+
+ <div class="collection">
+ <script>function getFlexData() { return {"data":{"options":{"width":375,"height":380,"jsonp":"https:\/\/static01.nyt.com\/slideshow\/2017\/08\/28\/world\/europe\/tk.slideshow.jsonp","link":"https:\/\/www.nytimes.com\/2017\/08\/30\/world\/europe\/princess-diana-death-anniversary.html"},"photos":{"photo":{"url":"","credit":""}},"advanced":{"delay":3,"limitjsonp":0,"rendition":"largeHorizontal375","targetoverride":"","abbreviatecredits":false}}}; }var NYTD=NYTD || {}; NYTD.FlexTypes = NYTD.FlexTypes || []; NYTD.FlexTypes.push({"target":"FT100000005396180","type":"FadingSlideShow","data":{"options":{"width":375,"height":380,"jsonp":"https:\/\/static01.nyt.com\/slideshow\/2017\/08\/28\/world\/europe\/tk.slideshow.jsonp","link":"https:\/\/www.nytimes.com\/2017\/08\/30\/world\/europe\/princess-diana-death-anniversary.html"},"photos":{"photo":{"url":"","credit":""}},"advanced":{"delay":3,"limitjsonp":0,"rendition":"largeHorizontal375","targetoverride":"","abbreviatecredits":false}}});</script><script src="https://static01.nyt.com/packages/js/multimedia/libs/jquery-1.7.1.min.js"></script><script src="https://static01.nyt.com/packages/js/multimedia/bundles/projects/2013/FadingSlideShow2.js"></script>
+ <style type="text/css">
+ .edition-domestic .span-ab-layout .nytmm_FadingSlideShow .credit, .edition-international .span-ab-layout .nytmm_FadingSlideShow .credit {
+ color: #BAB8B3;
+ display: inline-block;
+ font-family: arial,helvetica,sans-serif;
+ font-size: 0.5625rem !important;
+ font-weight: 400;
+ line-height: 0.75rem;
+ }
+ </style><div id="FT100000005396180"></div></div>
+ <div class="collection">
+ <div style="margin-top: +25px;"></div></div>
+ <div class="collection">
+ <article class="story theme-feature" id="topnews-100000005401664" data-story-id="100000005401664" data-rank="0" data-collection-renderstyle="LargeMediaHeadlineSumCentered">
+
+
+
+ <h1 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/world/europe/princess-diana-death-anniversary.html">Death of Diana Transformed </br> the Monarchy, and Britain Itself</a></h1>
+
+ <p class="summary">Twenty years after her death, the influence of Diana, Princess of Wales, can still be felt in unexpected ways in Britain.</p>
+
+ <p class="byline">By SARAH LYALL </p>
+
+
+ <ul class="refer theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005401664">
+ <h2 class="refer-heading"><a href="https://www.nytimes.com/2017/08/30/world/europe/princess-diana-anniversary.html">Diana’s Public Life, in Photos and Headlines</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401664">
+ <h2 class="refer-heading"><a href="https://www.nytimes.com/2017/08/30/world/europe/uk-princess-diana-20th-anniversary.html">Death of a Princess: Times Journalists Recall Covering Diana</a> </h2>
+ </article>
+ </li>
+ </ul>
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary timedBriefing timedBriefingHide" id="topnews-100000005368865" data-story-id="100000005368865" data-rank="0" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="05:00" data-end-time="13:00">
+
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/2017/08/31/briefing/harvey-diana-david-tang.html"><img src="https://static01.nyt.com/images/2017/09/01/world/31USBriefing-Texas/31USBriefing-Texas-mediumFlexible177-v2.gif" alt="" /></a>
+ </div>
+ </figure>
+
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/31/briefing/harvey-diana-david-tang.html">Your Thursday Briefing</a></h2>
+
+ <p class="byline">By CHRIS STANFORD <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="6:34 AM" data-utc-timestamp="1504175651">6:34 AM ET</time></p>
+
+ <p class="summary">
+ Here’s what you need to know to start your day. </p>
+
+
+ <ul class="refer theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005368865">
+ <h2 class="refer-heading"><a href="https://www.nytimes.com/2017/08/31/nyregion/new-york-today-hurricanes-in-nyc-harvey-tropical-storm.html">New York Today: Reflecting on Harvey, in the Northeast</a> <time class="timestamp" data-eastern-timestamp="6:00 AM" datetime="2017-08-31" data-utc-timestamp="1504173618000">6:00 AM</time></h2>
+ </article>
+ </li>
+ </ul>
+
+ </article>
+ </div>
+ <div class="collection">
+ <style>
+ /*default display conditions*/
+ .nythpCAToday {display: none;}
+ /*geocoded display conditions*/
+ html.geo-region-CA .nythpCAToday {display: block;}
+
+ .nythpCAToday article::before {
+ content: "";
+ background: #e2e2e2;
+ width: 187px;
+ height: 1px;
+ margin: 12px 0 12px 93px;
+ }
+
+ .second-column-region .collection:first-child .nythpCAToday article::before {
+ display: none;
+ }
+
+ .second-column-region .collection:first-child .nythpCAToday { border-bottom: 1px solid #ccc;
+ padding-bottom: 8px;
+ }
+
+ </style>
+
+ <div class="nythpCAToday">
+
+
+ </div></div>
+ <hr class="single-rule" /><div class="collection">
+ <link rel="stylesheet" type="text/css" href="https://web-player.art19.com/releases/0.0.42.css">
+ <link rel="stylesheet" type="text/css" href="https://static01.nyt.com/packages/html/mobile/2017/Audio/nyt-micro-player.min.css">
+ <script src="https://static01.nyt.com/packages/html/mobile/2017/Audio/nyt-micro-player-template.min.js"></script>
+ <style>
+ .audio-brief .image {
+ width: 75px;
+ height: 75px;
+ float: right;
+ clear: right;
+ margin: 4px 0 6px 12px;
+ }
+ .audio-brief .summary {
+ padding-bottom: 10px;
+ }
+ .audio-brief .audio {
+ margin: 0;
+ }
+ .audio-brief .art19-web-player {
+ margin-bottom: 0;
+ }
+ .audio-brief .art19-web-player.awp-micro .awp-left {
+ border-right: none;
+ }
+ .audio-brief .art19-web-player.awp-micro .awp-brand-logo {
+ padding: 0;
+ }
+ .audio-brief .awp-brand-logo img {
+ display: none;
+ }
+
+ .audio-brief .awp-embed-button{
+ cursor: pointer;
+ }
+ #daily-sub-links{
+ width:100%;
+ padding:0;
+ margin:-10px 0 0 0;
+ }
+ #daily-sub-links p{
+ font-family:"nyt-franklin",arial,helvetica,sans-serif;
+ font-weight:400;
+ font-size: 12px;
+ line-height: 15px;
+ color:#000;
+ }
+ #daily-sub-links p a{
+ display:inline-block;
+ color: #326891;
+ padding-right: 8px;
+ padding-left: 6px;
+ border-right:1px solid #ccc;
+ }
+ #daily-sub-links p a:last-child{
+ border-right:none;
+ }
+ </style>
+ <article class="story audio-brief theme-summary">
+ <div class="image">
+ <a href="https://www.nytimes.com/column/the-daily">
+ <img src="https://static01.nyt.com/images/2017/02/23/podcasts/the-daily/the-daily-logo-png-version/the-daily-logo-png-version-thumbLarge-v3.png" height="75" width="75" alt="The Daily Logo">
+ </a>
+ </div>
+ <h3 class="kicker"><a href="https://www.nytimes.com/podcasts/">Audio</a></h3>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/thedaily">
+ Listen to ‘The Daily’
+ </a>
+ </h2>
+ <p class="summary">The uniquely American success story of a city built on a swampy bayou, and how Harvey’s destruction recasts the narrative.</p>
+ <figure id="audio" class="art19 media audio" aria-label="media" role="group" data-audio-url="" data-audio-duration="">
+ <span class="visually-hidden">Audio</span>
+ <div data-require-template="art19-web-player/templates/nyt-micro-player" data-preload='false' class="art19-web-player awp-micro awp-theme-light" data-episode-id='1ed84d54-17bf-4d6b-be2f-405f51402cc6' data-squery='max-width:280px=awp-nyt-size-1 max-width:460px=awp-nyt-size-2' data-download-enabled='false' data-embed-enabled='false' data-brand-logo-enabled='false' data-ad-progress-color='#4d7b9f' data-emit-events='true' >
+ </div>
+ </figure>
+ </article>
+ <div id="daily-sub-links">
+ <p>Follow The Daily: <a href="https://itunes.apple.com/us/podcast/the-daily/id1200361736?mt=2&ign-mpt=uo%3D4" target="_blank">Apple Podcasts</a> <a href="https://play.radiopublic.com/88f7d8c3-7289-4dc6-b300-5ba71b43f5e5" target="_blank">Radio Public</a> <a href="http://www.stitcher.com/podcast/the-new-york-times/the-daily-10" target="_blank">Stitcher</a></p>
+ </div>
+ <script src="https://web-player.art19.com/releases/0.0.42.js"></script></div>
+ <hr class="single-rule" /><div class="collection">
+ <div class="hpHeader">
+ <h6><a href="http://www.nytimes.com/spotlight/times-tips?contentCollection=smarter-living">Smarter Living</a></h6>
+ </div><div class="nythpSmarterLiving smarterLiving-promo-region region">
+ <article class="story theme-summary" id="topnews-100000005400342" data-story-id="100000005400342" data-rank="2" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/31/smarter-living/5-cheap-ish-wellness-items-you-didnt-know-you-needed.html">5 Wellness Items You Didn’t Know You Needed</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/31/smarter-living/5-cheap-ish-wellness-items-you-didnt-know-you-needed.html"><img src="https://static01.nyt.com/images/2017/08/31/us/31sl-newsletter/31sl-newsletter-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By TIM HERRERA <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="2:45 AM" data-utc-timestamp="1504161901">2:45 AM ET</time></p>
+
+ <p class="summary">
+ Welcome to the latest edition of the Smarter Living newsletter. </p>
+
+
+ </article>
+ <article class="story theme-summary" id="topnews-100000005278952" data-story-id="100000005278952" data-rank="3" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/07/19/travel/british-airways-flight-safety-videos.html">5 Flight Safety Videos Worth Watching</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/07/19/travel/british-airways-flight-safety-videos.html"><img src="https://static01.nyt.com/images/2017/07/18/travel/18flight-videos1/18flight-videos1-thumbStandard.png" alt=""></a>
+ </div>
+
+ <p class="byline">By JUSTIN SABLICH </p>
+
+ <p class="summary">
+ A new British Airways video featuring some of the country’s best-known actors and comedians is the latest in a long line of entertaining flight safety films. </p>
+
+
+ </article>
+ </div>
+
+
+ <!-- Begin A/B Personalization Test -->
+
+ <style>
+ .flag-smarterLivingRec-on .nythpSmarterLiving {
+ display: none;
+ }
+ </style>
+ <script type="text/javascript">
+ require(['foundation/main'], function (main) {
+ require([
+ 'underscore/nyt',
+ 'jquery/nyt',
+ 'foundation/views/base-view'
+ ],
+ function (_, $, BaseView) {
+ var SmarterLiving = BaseView.extend({
+
+ template: _.template('<article class="story theme-summary" id="topnews-<%= id %>"' +
+ ' data-story-id="<%= id %>" data-collection-renderstyle="HpSumSmallMediaHigh"><h2 class="story-heading">' +
+ '<a href="<%= url %>"><%= headline %></a></h2><div class="thumb"><a href="<%= url %>">' +
+ '<img src="<%= thumb_url %>" alt=""></a></div></article>'),
+
+ events: {
+ 'click article a': 'handleArticleLinkClick'
+ },
+
+ articles: [],
+
+ initialize: function () {
+ const view = this;
+
+ if (!this.pageManager.flag('smarterLivingRec')) {
+ return;
+ }
+
+ this.$el = $('.nythpSmarterLiving');
+ this.setupImpressionTracking = _.once(this._setupImpressionTracking);
+ $.ajax(
+ {
+ url: 'https://rec.api.nytimes.com/svc/recommendations/v4/smarter_living.json',
+ xhrFields: {
+ withCredentials: true
+ }
+ })
+ .done(function(data) {
+ view.setupImpressionTracking();
+ _.each(data.assets, function(item) {
+ view.articles.push(item.url);
+ });
+ // iterate over the existing articles
+ view.$el.find('article').each(function (index) {
+ // replace with articles from rec service
+ $(this).replaceWith(view.template(data.assets[index]));
+ });
+ })
+ .always(function() {
+ // unhide articles
+ view.$el.css('display', 'block');
+ });
+ },
+
+ _setupImpressionTracking: function () {
+ if (this.pageManager.isComponentVisible(this.$el)) {
+ this.recordTrackingImpression();
+ } else {
+ this.subscribe('nyt:page-scroll', this.handleScroll);
+ }
+ },
+
+ handleArticleLinkClick: function (ev) {
+ const view = this;
+ const $el = $(ev.currentTarget);
+ var href = this.trackingAppendParams($el.attr('href'), {
+ 'action': 'click',
+ 'pgtype': 'Homepage',
+ 'clickSource': 'story-heading',
+ 'module': 'smarter-living',
+ 'region': 'second-column-region',
+ 'contentCollection': 'smarter-living',
+ 'mData': $.param({
+ articles: view.articles
+ }),
+ });
+
+ $el.attr('href', href);
+ },
+
+ handleScroll: function () {
+ if (this.pageManager.isComponentVisible(this.$el)) {
+ this.recordTrackingImpression();
+ this.stopSubscribing('nyt:page-scroll');
+ }
+ },
+
+ recordTrackingImpression: function () {
+ const view = this;
+ this.trackingTriggerImpression('Impression', {
+ 'module': 'smarter-living',
+ 'pgtype': 'Homepage',
+ 'region': 'second-column-region',
+ 'action': 'impression',
+ 'proxyEventType': 'impression',
+ 'timestamp': new Date().getTime(),
+ 'mData': {
+ articles: view.articles
+ },
+ });
+ },
+
+ });
+
+ new SmarterLiving();
+ });
+ });
+ </script>
+ <div id="g-graphic" class="nythp-smarter-living-formonly-email-promo notification-widget story">
+ <hr class="single-rule" style="width: 50%; text-align: center; margin: 12px auto 12px;" />
+
+ <p class="theme-summary">Get a weekly roundup of the best advice from The Times on living a better, smarter, more fulfilling life.</p>
+ <div id="smarter-living-form-only"></div>
+
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'smarter-living-form-only',
+ productCode: 'SL',
+ elementToHideOnSubscribe: '.nythp-smarter-living-formonly-email-promo',
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get Smarter Living by email',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get Smarter Living by email'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('smarter-living-form-only');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script></div>
+ <div class="collection">
+ <style>
+ .signup-favor {
+ text-align: center;
+ color: #326891;
+ cursor: pointer;
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+
+ .signup-favor.top-border {
+ margin-top: 8px;
+ padding-top: 32px;
+ border-top: 1px solid #ccc;
+ }
+
+ .signup-favor.bottom-border {
+ padding-bottom: 33px;
+ border-bottom: 1px solid #ccc;
+ }
+
+ .signup-favor a:hover {
+ text-decoration: none;
+ }
+
+ .signup-favor .tagline {
+ display: block;
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+ font-weight: 700;
+ font-style: normal;
+ font-family: "nyt-cheltenham", georgia, "times new roman", times, serif;
+ color: #000;
+ }
+
+ .signup-favor .subscribe {
+ font-size: 12px;
+ line-height: 1.0625rem;
+ font-weight: 500;
+ font-style: normal;
+ font-family: "nyt-franklin", arial, helvetica, sans-serif;
+ color: #326891;
+ border-bottom: 1px solid rgba(50,104,145,.2);
+ letter-spacing: .04em;
+ margin: 5px auto 0;
+ padding-bottom: 1px;
+ text-transform: uppercase;
+ display: inline-block;
+ -moz-transition: border 0.2s ease;
+ -webkit-transition: border 0.2s ease;
+ -ms-transition: border 0.2s ease;
+ transition: border 0.2s ease;
+ }
+ .signup-favor .tagline .support {
+ font-size: 1.25rem;
+ }
+
+ .signup-favor .tagline .no-break {
+ white-space: nowrap;
+ }
+ .signup-favor:hover .subscribe {
+ border-color: rgba(50,104,145,1);
+ }
+
+ #nythp-sub-promo { display: none; }
+
+ </style>
+ <div id="g-graphic" class="sub-promo-click">
+ <div class="signup-favor hidden" id="signup-favor">
+ <a href="https://www.nytimes.com/DesktopHome" class="subscribe-link">
+ <span class="tagline"><span class="no-break">Journalism that matters.</span> <br /><span class="no-break">More essential than ever.</span></span>
+ <span class="subscribe">Subscribe to the Times</span>
+ </a>
+
+ </div>
+ </div>
+
+ <div id="nythp-sub-promo"></div>
+
+ <script type="text/javascript">
+ require(['foundation/main'], function(main) {
+ require(['jquery/nyt', 'underscore/nyt', 'foundation/models/user-data', 'foundation/tracking/tracking-mixin', 'foundation/views/page-manager', 'foundation/hosts'],
+ function ($, _, userData, trackingMixin, pageManager, hosts) {
+ var signupPromo = {
+
+ taglines: {
+ 'promo1': '<span style="white-space: nowrap">Journalism that matters.</span><br /><span style="white-space: nowrap"> More essential than ever.</span>',
+ 'promo2': '<span style="white-space: nowrap">Independent journalism.</span><br /><span style="white-space: nowrap">More essential than ever.</span>',
+ 'promo3': 'Real reporting. Real news.',
+ 'promo4': 'Independent. Trusted. Real.',
+ 'promo5': 'Real journalism. <span style="white-space: nowrap">Like nowhere else.</span>',
+ 'promo6': 'Truth is hard to find.<br /><span style="white-space: nowrap; font-size: 1.25rem;">But easier with 1,000+ journalists looking.</span>'
+ },
+
+ /**
+ * Initialization called when instantiating the view
+ *
+ * @method initialize
+ **/
+ initialize: function () {
+ this.$el = $('#signup-favor');
+ $(document).on('click', "#g-graphic.sub-promo-click", function(e){
+ if (e) {
+ e.preventDefault();
+ }
+ signupPromo.handleClick();
+ });
+
+ this.version = 'promo1';
+
+ userData.ready(function() {
+ signupPromo.handleUserReady();
+ });
+
+ this.link = 'https://www.nytimes.com/DesktopHome';
+
+ },
+
+
+ trackImpression: function() {
+
+ setTimeout(function() {
+ signupPromo.tracking.trackingTriggerRaw(
+ signupPromo.version,
+ {
+ module: 'election-sub-desktop-home',
+ action: 'impression'
+ },
+ 'impression'
+ );
+ }, 1000);
+
+ },
+
+
+
+ handleUserReady: function () {
+
+ var view = this;
+ console.log("abra "+ window.NYTD.Abra('www-signup-favor-test-v4'));
+
+ if (window.NYTD.Abra('www-signup-favor-test-v4') == 'control') {
+ return;
+ }
+
+
+ if (userData) {
+
+ if (!userData.isHomeDeliverySubscriber() &&
+ !userData.isWebSubscriber() &&
+ !userData.isMobileSubscriber() &&
+ !userData.isTabletSubscriber()) {
+ if (!$('html').hasClass('geo-country-US')) {
+ this.link = 'https://www.nytimes.com/DesktopHomeINYT';
+ this.$el.find(".subscribe-link").attr("href", "http://www.nytimes.com/DesktopHomeINYT")
+ }
+ this.switchText();
+ } else {
+ this.$el.find('.tagline').html('<span class="no-break support">Support the mission of The Times.</span>');
+ this.$el.find('.subscribe').html('Sponsor a student subscription today.');
+ this.version = 'studentSponsor';
+ this.link = 'https://www.nytimes.com/NativeSponsor';
+ this.$el.find('.subscribe-link').attr('href', 'https://www.nytimes.com/NativeSponsor');
+ }
+
+ // if user is not already subscribed, show the element
+ this.$el.removeClass('hidden');
+ this.trackImpression();
+ if (this.$el.closest('.column').hasClass('ab-column')){
+ this.$el.addClass('top-border');
+ } else if (this.$el.closest('.column').hasClass('b-column')) {
+ this.$el.addClass('top-border').addClass('bottom-border');
+ }
+
+ }
+
+ },
+
+ switchText: function () {
+ var hasAbra = false;
+
+ hasAbra = window.NYTD && window.NYTD.Abra && window.NYTD.Abra('www-signup-favor-test-v4');
+ // check if this is part of an AB test
+ if (hasAbra) {
+ switch (window.NYTD.Abra('www-signup-favor-test-v4')) {
+ case '1':
+ this.$el.find('.tagline').html(this.taglines['promo1']);
+ this.version = 'promo1';
+ break;
+ case '2':
+ this.$el.find('.tagline').html(this.taglines['promo2']);
+ this.version = 'promo2';
+ break;
+ case '3':
+ this.$el.find('.tagline').html(this.taglines['promo3']);
+ this.version = 'promo3';
+ break;
+ case '4':
+ this.$el.find('.tagline').html(this.taglines['promo4']);
+ this.version = 'promo4';
+ break;
+ case '5':
+ this.$el.find('.tagline').html(this.taglines['promo5']);
+ this.version = 'promo5';
+ break;
+ case '6':
+ this.$el.find('.tagline').html(this.taglines['promo6']);
+ this.version = 'promo6';
+ break;
+ }
+ }
+ },
+
+ handleClick: function (e) {
+
+ if (e) {
+ e.preventDefault();
+ }
+
+ this.tracking.trackingTriggerRaw(
+ this.version,
+ {
+ module: 'election-sub-desktop-home',
+ action: 'click',
+ eventName: 'sign-up'
+ },
+ 'interaction'
+ );
+
+ setTimeout(function() {
+ window.location.href = signupPromo.link;
+ }, 300);
+
+ },
+ };
+
+ signupPromo.tracking = trackingMixin;
+ signupPromo.pageManager = pageManager;
+ signupPromo.hosts = hosts;
+ signupPromo.initialize();
+ });
+ });
+
+ </script></div>
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005400160" data-story-id="100000005400160" data-rank="0" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/nyregion/ordering-review-of-statues-puts-de-blasio-in-tricky-spot.html">Ordering Review of Statues Puts de Blasio in Tricky Spot</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/30/nyregion/ordering-review-of-statues-puts-de-blasio-in-tricky-spot.html"><img src="https://static01.nyt.com/images/2017/08/31/nyregion/31monument1/31monument1-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By WILLIAM NEUMAN </p>
+
+ <p class="summary">
+ Since Mayor de Blasio called for a review of all possible symbols of hate, he has been peppered with questions about how far it will go. </p>
+
+
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005399785" data-story-id="100000005399785" data-rank="0" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/business/david-tang-dead-fashion-retailer.html">David Tang, Fashion Retailer and Raconteur, Dies at 63</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/30/business/david-tang-dead-fashion-retailer.html"><img src="https://static01.nyt.com/images/2017/08/31/business/31TANG1/31TANG1-thumbStandard-v2.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By KEITH BRADSHER and ELIZABETH PATON </p>
+
+ <p class="summary">
+ A lifelong entrepreneur from a wealthy family, he founded a succession of businesses catering to the affluent but also backed democracy for Hong Kong. </p>
+
+
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-video theme-video-updated"
+ id="topnews-100000005343497"
+ data-story-id="100000005343497"
+ data-rank="0"
+ data-collection-renderstyle="VideoEmbed">
+ <figure class="promo media video embedded"
+ data-position="secondcolumn"
+ data-page="homepage"
+ data-videoid="100000005343497"
+ data-headline="Forty Years of Voyager"
+ data-summary="Long after they have stopped communicating with Earth, the twin Voyager spacecraft will forever drift among the stars."
+ data-live="false"
+ data-media-action="inline"
+ data-autoplay="false"
+ data-collection-renderstyle="VideoEmbed">
+ <figcaption class="caption">
+ <p class="credit credit-right" itemprop="copyrightHolder">
+ Video by DENNIS OVERBYE, JONATHAN CORUM and JASON DRAKEFORD </p>
+ </figcaption>
+ </figure>
+ <p class="summary">Long after they have stopped communicating with Earth, the twin Voyager spacecraft will forever drift among the stars.</p>
+ </article>
+ </div>
+ <hr class="single-rule" /><div class="collection">
+ <article class="story theme-summary" id="topnews-100000005387970" data-story-id="100000005387970" data-rank="0" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/31/arts/television/young-sheldon-the-big-bang-theory-spinoff-cbs.html">‘Young Sheldon’ Remakes ‘The Big Bang Theory’ Formula</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/31/arts/television/young-sheldon-the-big-bang-theory-spinoff-cbs.html"><img src="https://static01.nyt.com/images/2017/09/10/arts/10YOUNGSHELDON1/10YOUNGSHELDON1-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By JOHN KOBLIN <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="5:00 AM" data-utc-timestamp="1504170026">5:00 AM ET</time></p>
+
+ <p class="summary">
+ For the CBS prequel, co-creator Chuck Lorre abandoned the format that made him successful by instead using a single camera, voice-over narration and a child actor. </p>
+
+
+ </article>
+ </div>
+ <div class="collection">
+ <style>
+ /*default display conditions*/
+ .nythpNYRegionPromo {display: none;}
+ /*geocoded display conditions*/
+ html.geo-dma-501 .nythpNYRegionPromo, html.geo-region-NJ .nythpNYRegionPromo {display: block;}
+
+ .nythpNYRegionPromo {
+ border-top: 1px solid #e2e2e2;
+ margin-top: 10px;
+ padding-top: 10px;
+ }
+ </style>
+
+
+ <div class="nythpNYRegionPromo nygeo-promo-region region"><div>
+
+ <article class="story theme-summary" id="topnews-100000005398183" data-story-id="100000005398183" data-rank="1" data-collection-renderstyle="HpSumSmallMediaHigh">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/nyregion/acs-legal-aid-lawyers-facebook-posts.html">Lawyers Under Scrutiny for Family Court Facebook Posts</a></h2>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/30/nyregion/acs-legal-aid-lawyers-facebook-posts.html"><img src="https://static01.nyt.com/images/2017/08/31/nyregion/31acs/31acs-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By NIKITA STEWART </p>
+
+ <p class="summary">
+ Lawyers who worked for the Legal Aid Society and the city’s child welfare agency are under review for social media posts that mocked people in Family Court in Queens. </p>
+
+
+ </article>
+ </div></div></div>
+ <hr class="single-rule" /><div class="collection">
+ <style>
+ .nythpGeoMBPromo-AU, .nythpGeoMBPromo-EU, .nythpGeoMBPromo-AS, .nythpGeoCalTodayPromo {
+ display: none;
+ }
+
+ html.geo-continent-AS .nythpGeoMBPromo-AS, html.geo-continent-OC .nythpGeoMBPromo-AU, html.geo-country-AU .nythpGeoMBPromo-AU, html.geo-continent-EU .nythpGeoMBPromo-EU, html.geo-continent-AF .nythpGeoMBPromo-EU, html.geo-continent-NA.geo-region-CA .nythpGeoCalTodayPromo { display: block; }
+ html.geo-continent-AS .nythpGeoMBPromo, html.geo-continent-OC .nythpGeoMBPromo, html.geo-country-AU .nythpGeoMBPromo, html.geo-continent-EU .nythpGeoMBPromo, html.geo-continent-AF .nythpGeoMBPromo, html.geo-continent-NA.geo-region-CA .nythpGeoMBPromo { display: none; }
+
+ </style>
+
+
+
+
+ <article class="story theme-summary nythpGeoMBPromo-AU" id="topnews-100000005085460" data-story-id="100000005085460" data-rank="0" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="" data-end-time="">
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/newsletters/morning-briefing-australia"><img src="https://static01.nyt.com/images/2017/05/08/world/asia/australia-briefing-signup01/australia-briefing-signup01-mediumFlexible177.png" alt=""></a>
+ </div>
+ </figure>
+ <h2 class="story-heading"><a href="https://www.nytimes.com/newsletters/morning-briefing-australia">Morning Briefing: Australia Edition</a></h2>
+ <p class="summary">The news and stories that matter to readers in Australia. Sign up to get it by email, Monday through Friday. </p>
+
+ <div id="g-graphic" class="nythp-morning-briefing-email-promo notification-widget">
+ <div id="morning-briefing-widget-au"></div>
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'morning-briefing-widget-au',
+ productCode: 'MBAU',
+ /* elementToHideOnSubscribe: '.nythp-morning-briefing-email-promo', */
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get the Morning Briefing by email.',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get the Morning Briefing by email.'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('morning-briefing-widget-au');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script>
+
+ </article>
+
+
+
+
+ <article class="story theme-summary nythpGeoMBPromo-AS" id="topnews-100000005085459" data-story-id="100000005085459" data-rank="1" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="" data-end-time="">
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/newsletters/morning-briefing-asia"><img src="https://static01.nyt.com/images/2017/05/26/world/26asiapromo2/26asiapromo2-mediumFlexible177.jpg" alt=""></a>
+ </div>
+ </figure>
+ <h2 class="story-heading"><a href="https://www.nytimes.com/newsletters/morning-briefing-asia">Morning Briefing: Asia Edition</a></h2>
+ <p class="summary">The news and stories that matter to readers in Asia. Sign up to get it by email, Monday through Friday. </p>
+
+ <div id="g-graphic" class="nythp-morning-briefing-email-promo notification-widget">
+ <div id="morning-briefing-widget-as"></div>
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'morning-briefing-widget-as',
+ productCode: 'MBAE',
+ /* elementToHideOnSubscribe: '.nythp-morning-briefing-email-promo', */
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get the Morning Briefing by email.',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get the Morning Briefing by email.'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('morning-briefing-widget-as');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script>
+
+
+ </article>
+
+
+
+
+
+ <article class="story theme-summary nythpGeoMBPromo-EU" id="topnews-100000004906098" data-story-id="100000004906098" data-rank="2" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="" data-end-time="">
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/newsletters/morning-briefing-europe"><img src="https://static01.nyt.com/images/2017/05/26/world/26europeanpromo2/26europeanpromo2-mediumFlexible177.jpg" alt=""></a>
+ </div>
+ </figure>
+ <h2 class="story-heading"><a href="https://www.nytimes.com/newsletters/morning-briefing-europe">Morning Briefing: Europe Edition</a></h2>
+ <p class="summary">The news and stories that matter to readers in Europe. Sign up to get it by email, Monday through Friday. </p>
+ <div id="g-graphic" class="nythp-morning-briefing-email-promo notification-widget">
+ <div id="morning-briefing-widget-eu"></div>
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'morning-briefing-widget-eu',
+ productCode: 'MBE',
+ /* elementToHideOnSubscribe: '.nythp-morning-briefing-email-promo', */
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get the Morning Briefing by email.',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get the Morning Briefing by email.'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('morning-briefing-widget-eu');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script>
+
+ </article>
+
+
+ <!-- California Today -->
+
+ <article class="story theme-summary nythpGeoCalTodayPromo" data-rank="2" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="" data-end-time="">
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="http://www.nytimes.com/newsletters/california-today"><img src="https://static01.nyt.com/packages/images/email/assets/california_news.jpg" alt=""></a>
+ </div>
+ </figure>
+ <h2 class="story-heading"><a href="http://www.nytimes.com/newsletters/california-today">California Today</a></h2>
+ <p class="summary">The news and stories that matter to Californians, delivered weekday mornings.</p>
+
+
+ <div id="g-graphic" class="nythp-morning-briefing-email-promo notification-widget">
+ <div id="california-today-widget"></div>
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'california-today-widget',
+ productCode: 'CA',
+ /* elementToHideOnSubscribe: '.nythp-morning-briefing-email-promo', */
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get California Today by email.',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get California Today by email.'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('california-today-widget');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script>
+ </article>
+
+ <article class="story theme-summary nythpGeoMBPromo" id="topnews-100000004906098" data-story-id="100000004906098" data-rank="2" data-collection-renderstyle="HpSumMediumMediaHigh" data-start-time="" data-end-time="">
+ <figure class="media photo medium-thumb">
+ <div class="image">
+ <a href="https://www.nytimes.com/newsletters/morning-briefing"><img src="https://static01.nyt.com/images/2017/05/25/us/25usbriefing/25usbriefing-mediumFlexible177-v2.jpg" alt=""></a>
+ </div>
+ </figure>
+ <h2 class="story-heading"><a href="https://www.nytimes.com/newsletters/morning-briefing">Morning Briefing</a></h2>
+ <p class="summary">The news and stories that matter. Delivered to your inbox Monday through Friday.</p>
+
+
+ <div id="g-graphic" class="nythp-morning-briefing-email-promo notification-widget">
+ <div id="morning-briefing-widget"></div>
+ </div>
+
+ <script>
+ require.config({
+ paths: {
+ 'nytint/email-subscriber' : 'https://int.nyt.com/applications/email-subscriber/client'
+ }
+ });
+
+ require(['foundation/main'], function() {
+ require(['nytint/email-subscriber'], function(Subscriber) {
+ Subscriber.setup({
+ containerId: 'morning-briefing-widget',
+ productCode: 'NN',
+ /* elementToHideOnSubscribe: '.nythp-morning-briefing-email-promo', */
+ text: {unregisteredButton: 'Sign Up',
+ unregisteredPlaceholder: 'Get the Morning Briefing by email.',
+ registeredButton: 'Sign Up',
+ alreadySubscribedMessage: 'You’re already subscribed.',
+ thanksMessage: 'You’ve signed up as %email%',
+ emailPreferencesLinkText: 'Update your mail preferences »',
+ errorMessage: 'Error submitting, please try again.',
+ registeredWelcome: 'Get the Morning Briefing by email.'}
+ });
+
+ setTimeout(function(){
+ var widget = document.getElementById('morning-briefing-widget');
+ var container = widget.getElementsByTagName('div')[0];
+ var form = widget.getElementsByTagName('form')[0];
+ var status = container.getAttribute('data-status');
+ var notify = widget.getElementsByClassName('notify-email')[0];
+
+ if(notify !== undefined){
+
+ var origtext = notify.getAttribute('placeholder');
+ var newtext = 'Please enter your email address';
+ var button = container.getElementsByTagName('button')[0];
+
+ widget.setAttribute('class','clearfix');
+
+ notify.addEventListener('mouseover',function(){
+ notify.setAttribute('placeholder',newtext);
+ });
+
+ notify.addEventListener('mouseout',function(){
+ notify.setAttribute('placeholder',origtext);
+ });
+
+ notify.addEventListener('focus',function(){
+ notify.setAttribute('placeholder','');
+ });
+
+ }
+
+ if(form !== undefined){
+ notify.addEventListener('keyup',function(){
+ form.setAttribute('class','dirtyform');
+ });
+ container.setAttribute('class','not-signedin');
+ } else {
+ container.setAttribute('class','signedin');
+ }
+ },2000);
+
+ });
+ });
+ </script>
+ </article>
+
+ </div>
+
+ </div><!-- close second-column-region -->
+
+
+ </div><!-- close b-column -->
+
+ </div><!-- close wide-b-layout -->
+
+ <div class="bottom-span-promo-region region">
+ <div class="collection">
+ <style>
+ /*default display conditions*/
+ #span-ab-bottom-au-region {
+ /*display: none;*/
+ display: block;
+ position: absolute;
+ visibility: hidden;
+ }
+ #span-ab-bottom-region .column.column-au-region {
+ /*display: none;*/
+ display: block;
+ position: absolute;
+ visibility: hidden;
+ }
+ /*geocoded display conditions*/
+ html.geo-country-AU #span-ab-bottom-region .column {display: none;}
+ html.geo-country-AU #span-ab-bottom-region .column.column-au-region {
+ display: block;
+ position: inherit;
+ visibility: visible;
+ }
+
+ .span-ab-layout .ab-column .split-3-layout .column:nth-of-type(1),
+ .span-ab-layout .ab-column .split-3-layout .column:nth-of-type(4) {
+ padding-left: 0;
+ }
+
+ .span-ab-layout .ab-column .split-3-layout .column:last-child,
+ .span-ab-layout .ab-column .split-3-layout .column:nth-of-type(3),
+ .span-ab-layout .ab-column .split-3-layout .column:nth-of-type(6) {
+ border-right: none;
+ padding-right: 0px;
+ }
+
+ #span-ab-bottom-region .section-heading-au-region { display: none; }
+ html.geo-country-AU #span-ab-bottom-region .section-heading { display: none; }
+ html.geo-country-AU #span-ab-bottom-region .section-heading-au-region {
+ display: block;
+ text-align: center;
+ }
+ html.geo-country-AU #span-ab-bottom-region .section-heading-au-region h2.section-heading {
+ display: inline-block;
+ color: #000;
+ font-family: "nyt-franklin",helvetica,arial,sans-serif;
+ text-transform: uppercase;
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: .5px;
+ border-bottom: 2px solid #ccc;
+ line-height: 15px;
+ }
+ html.geo-country-AU #span-ab-bottom-region .section-heading-au-region h2.section-heading:hover,
+ html.geo-country-AU #span-ab-bottom-region .section-heading-au-region h2.section-heading:active {
+ border-color: #222222;
+ }
+
+ html.geo-country-AU #span-ab-bottom-region .section-heading a {
+ text-decoration: none;
+ color: #000;
+ }
+ </style>
+
+ <script>
+ require(['foundation/main'], function() {
+ require(['jquery/nyt', 'underscore/nyt'], function($, _) {
+ $("#span-ab-bottom-region div.split-3-layout").append($("#span-ab-bottom-au-region div.split-3-layout > div.column").addClass("column-au-region").remove());
+ $("#span-ab-bottom-region div.split-3-layout").prepend($('<span class="section-heading-au-region"><h2 class="section-heading"><a href="https://www.nytimes.com/section/world/australia">Australia Picks</a></h2></span>'));
+ var auHeight = _.max($("#span-ab-bottom-region div.split-3-layout .column.column-au-region article").map(function(i, el) { return $(el).height(); }));
+ $("#span-ab-bottom-region div.split-3-layout .column.column-au-region").css({"min-height": (auHeight+6)+"px"});
+ }) })
+ </script>
+
+
+ <div id="span-ab-bottom-au-region" class="span-ab-bottom-region-au region"><div>
+ <hr class="scotch-rule">
+ <div class="split-3-layout layout theme-base"><div>
+
+ </div>
+ <h2 class="section-heading">
+ </h2>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005399553" data-story-id="100000005399553" data-rank="0" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/2017/08/30/world/australia/australia-same-sex-marriage-tv-ad.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/world/australia/31oz-marriage/31oz-marriage-mediumThreeByTwo210.jpg" />
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/world/australia/australia-same-sex-marriage-tv-ad.html">What’s Going On in an Australian TV Ad Opposing Gay Marriage?</a>
+ </h2>
+ <p class="summary">
+ The campaign to vote “no” on legalizing same-sex marriage tries to refocus the debate on the welfare of children. </p>
+ </article>
+ </div>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005397818" data-story-id="100000005397818" data-rank="1" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/2017/08/29/world/asia/sea-shepherd-whaling-japan.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/world/29seashepherd/29seashepherd-mediumThreeByTwo210.jpg" />
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/world/asia/sea-shepherd-whaling-japan.html">Sea Shepherd Activists Halt Pursuit of Japanese Whalers</a>
+ </h2>
+ <p class="summary">
+ The group has called off its annual pursuit of Japanese ships in the protected Southern Ocean, saying it can’t compete with the country’s surveillance. </p>
+ </article>
+ </div>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005396021" data-story-id="100000005396021" data-rank="2" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/2017/08/29/science/trigonometry-babylonian-tablet.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/29/science/29TB-BABYLON1/29TB-BABYLON1-mediumThreeByTwo210.jpg" />
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/science/trigonometry-babylonian-tablet.html">Hints of Trigonometry on a 3,700-Year-Old Babylonian Tablet</a>
+ </h2>
+ <p class="summary">
+ Scholars have debated for decades the purpose of 60 numbers written on a small clay tablet. Two Australian mathematicians believe they have figured it out. </p>
+ </article>
+ </div>
+ <div class="collection">
+ </div></div></div></div></div>
+ </div><!-- close bottom-span-promo-region -->
+
+ <div id="span-ab-bottom-region" class="span-ab-bottom-region region">
+ <hr class="scotch-rule" />
+ <div class="split-3-layout layout theme-base">
+ <h2 class="section-heading">
+ </h2>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005395156" data-story-id="100000005395156" data-rank="0" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/2017/08/30/sports/olympics/munich-olympic-massacre-1972-memorial-israeli-athletes.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/multimedia/30MUNIC-alpha/30MUNICweb2-mediumThreeByTwo210.jpg" />
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/sports/olympics/munich-olympic-massacre-1972-memorial-israeli-athletes.html">In Munich, a Tribute to Israeli Athletes</a>
+ </h2>
+ <p class="summary">
+ “There are no happier people, no more satisfied people, than us,” said the wife of a victim who pressed for a worthy memorial. </p>
+ </article>
+ </div>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005399019" data-story-id="100000005399019" data-rank="1" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/interactive/2017/08/31/travel/what-to-do-36-hours-in-glasgow-scotland.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/travel/31HOURS-GLASGOW1/31HOURS-GLASGOW1-mediumThreeByTwo210.jpg" />
+ <div class="media-action-overlay">
+ <i class="icon sprite-icon icon-media-interactive-16x16-ffffff"></i>
+ </div>
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/31/travel/what-to-do-36-hours-in-glasgow-scotland.html">36 Hours in Glasgow</a>
+ </h2>
+ <p class="summary">
+ This historic city, known for its Art Nouveau flourishes, also has a blossoming modern side, with daring new buildings and bars. </p>
+ </article>
+ </div>
+ <div class="column">
+ <article class="story theme-summary " id="topnews-100000005367249" data-story-id="100000005367249" data-rank="2" data-collection-renderstyle="HPMediumMediaHedSumDaypart">
+ <a href="https://www.nytimes.com/2017/08/31/books/review/jesmyn-ward-by-the-book.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/09/03/books/review/0903-BKS-ByTheBook/0903-BKS-ByTheBook-mediumThreeByTwo210-v3.jpg" />
+ </div>
+ </a>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/31/books/review/jesmyn-ward-by-the-book.html">Jesmyn Ward: By the Book</a>
+ </h2>
+ <p class="summary">
+ The author of, most recently, “Sing, Unburied, Sing” is a self-described “reading glutton.” </p>
+ </article>
+ </div>
+ </div>
+ </div><!-- close span-ab-bottom-region -->
+
+ </section><!-- close top-news -->
+
+ </div><!-- close ab-column -->
+
+ <div class="c-column column">
+
+ <div id="Middle" class="ad middle-ad hidden nocontent robots-nocontent"></div>
+
+ <div class="region c-column-top-span-region">
+
+
+ </div><!-- close c-column-top-span-region -->
+
+ <section class="opinion">
+
+ <div class="region opinion-c-col-top-region">
+ <div class="collection">
+ <section class="opinion">
+ <h2 class="section-heading"><a href="http://www.nytimes.com/pages/opinion/index.html">The Opinion Pages</a>
+ </h2>
+ </section></div>
+ </div> <!-- close opinion-c-col-top-region -->
+
+ <div class="layout split-layout">
+
+ <div class="column">
+ <div class="region opinion-c-col-left-region">
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005396602" data-story-id="100000005396602" data-rank="0" data-collection-renderstyle="HpSumXSMedia">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/31/opinion/trump-north-korea.html">What Trump Meant to Say</a></h2>
+
+ <div class="small-thumb">
+ <a href="https://www.nytimes.com/2017/08/31/opinion/trump-north-korea.html"><img src="https://static01.nyt.com/images/2017/09/01/world/01blinken-inyt/01blinken-inyt-blogSmallThumb.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By ANTONY J. BLINKEN </p>
+
+ <p class="summary">
+ The president’s rogue-cop routine has serious foreign policy consequences. </p>
+
+
+ </article>
+
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005400536" data-story-id="100000005400536" data-rank="0" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/31/opinion/voting-reform-illinois-texas.html">Editorial: On Voting Reforms, Follow Illinois, Not Texas</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401080" data-story-id="100000005401080" data-rank="1" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/31/opinion/trump-harvey-storm-army.html">Blow: Trump Raises an Army</a> <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="3:21 AM" data-utc-timestamp="1504164084">3:21 AM ET</time></h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005401128" data-story-id="100000005401128" data-rank="2" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/interactive/2017/08/31/opinion/columnists/yemen-famine-cholera.html">Kristof: The Photos the U.S. and Saudi Arabia Don’t Want You to See</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005400586" data-story-id="100000005400586" data-rank="3" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/31/opinion/hurricanes-climate-capitalists-wealth-.html">Stephens: Hurricanes, Climate and the Capitalist Offset</a> <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="3:21 AM" data-utc-timestamp="1504164083">3:21 AM ET</time></h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000003665755" data-story-id="100000003665755" data-rank="0" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.facebook.com/nytopinion">Join us on Facebook »</a> </h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div class="column">
+ <div class="region opinion-c-col-right-region">
+ <div class="collection">
+ <article class="story theme-summary" id="topnews-100000005398365" data-story-id="100000005398365" data-rank="0" data-collection-renderstyle="HpSumXSMedia">
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/31/opinion/america-nuclear-buildup.html">Risky Nuclear Buildup</a></h2>
+
+ <div class="small-thumb">
+ <a href="https://www.nytimes.com/2017/08/31/opinion/america-nuclear-buildup.html"><img src="https://static01.nyt.com/images/2017/08/31/opinion/31rollo/31rollo-blogSmallThumb.jpg" alt=""></a>
+ </div>
+
+ <p class="byline">By STUART ROLLO <time class="timestamp" datetime="2017-08-31" data-eastern-timestamp="3:21 AM" data-utc-timestamp="1504164083">3:21 AM ET</time></p>
+
+ <p class="summary">
+ It’s not just North Korea. Plans to upgrade America’s nuclear arsenal are also contributing to global instability. </p>
+
+
+ </article>
+
+ </div>
+ <div class="collection headlines">
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story" id="topnews-100000005399880" data-story-id="100000005399880" data-rank="0" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/opinion/texas-farmers-floods-planning.html">A Texas Farmer on Harvey, Bad Planning and Runaway Growth</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005400373" data-story-id="100000005400373" data-rank="1" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/opinion/google-influence-think-tanks.html">Google’s Disturbing Influence Over Think Tanks</a> </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" id="topnews-100000005400487" data-story-id="100000005400487" data-rank="2" data-collection-renderstyle="HpHeadline">
+ <h2 class="story-heading"><i class="icon"></i><a href="https://www.nytimes.com/2017/08/30/opinion/trump-osteen-harvey-church.html">The Cheap Prosperity Gospel of Trump and Osteen</a> </h2>
+ </article>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ </div> <!-- close split-layout -->
+
+ <div class="region opinion-c-col-bottom-region">
+ <div class="collection">
+ <style>
+
+
+ .c-column.column section.opinion div time.timestamp{
+ display:none;
+ }
+
+
+ </style><style>
+ .c-column.column section.opinion div p.theme-comments{
+ display:none;
+ }
+
+
+
+ </style></div>
+ </div> <!-- close opinion-c-col-bottom-region -->
+
+ </section> <!-- close opinion -->
+
+ <section class="user-subscriptions">
+
+ <h2 class="section-heading visually-hidden">User Subscriptions</h2>
+
+ <div class="collection insider-collection">
+ <div id="times-insider-subscription" class="times-insider-subscription hidden">
+ <ul class="theme-news-headlines">
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/26/insider/syphilis-health-investigators-sisterhood-of-sleuths.html">A Sisterhood of Sleuths</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/insider/the-sodden-haunted-fields-of-flanders.html">The Sodden, Haunted Fields of Flanders</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/25/insider/solar-eclipse-carbondale.html">Seeing the Total Eclipse Through 28,000 Eyes</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/24/insider/dale-chihuly-glass-artist-creativity.html">A Journalist Glimpses the Tools of an Artist’s Creativity</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/module/insider-events"></a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/07/28/insider/events/cryptoparty-data-security-new-york-times.html">Live Event: Discussing Data Protection at a New York Times ‘CryptoParty’</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/09/insider/events/live-event-fall-preview-at-joes-pub.html">Live Event: ‘Fall Preview’ at Joe’s Pub</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/07/14/insider/events/health-care-conference-call-what-does-policy-actually-mean-for-your-health.html">Live Event: What Do Policy Changes Actually Mean for Your Health?</a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/06/20/insider/events/new-york-times-podcast-club.html">Live Event: The New York Times Podcast Club</a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ <div class="thumb">
+ <a href="https://www.nytimes.com/section/insider">
+ <svg class="insider-logo" width="65" height="20" role="img" aria-label="Insider">
+ <image width="65" height="20" xlink:href="https://a1.nyt.com/assets/homepage/20170810-135137/images/foundation/logos/insider-logo-240x72.svg" src="https://a1.nyt.com/assets/homepage/20170810-135137/images/foundation/logos/insider-logo-240x72.png" alt="Insider" />
+ </svg>
+ </a>
+ </div>
+ </div><!--close times-insider-subscription -->
+ </div><!-- close collection -->
+
+ <div class="collection">
+ <div id="times-premier-crossword-subscription" class="times-premier-crossword-subscription hidden">
+ <div class="layout split-layout">
+ <div class="column">
+ <div class="collection insider-collection">
+ <article class="story">
+ <h3 class="kicker">
+ <a href="https://www.nytimes.com/section/insider">Times Insider &raquo;</a>
+ </h3>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/26/insider/syphilis-health-investigators-sisterhood-of-sleuths.html">A Sisterhood of Sleuths</a>
+ </h2>
+ </article>
+ </div>
+ </div><!-- close column -->
+ <div class="column">
+ <div class="collection crosswords-collection">
+ <article class="story">
+ <h3 class="kicker">
+ <a href="https://www.nytimes.com/crosswords">The Crossword &raquo;</a>
+ </h3>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/crosswords">Play Today&rsquo;s Puzzle </a>
+ </h2>
+ <div class="thumb">
+ <a href="https://www.nytimes.com/crosswords">
+ <img src="https://static01.nyt.com/images/crosswords/crosswords_30x30.png" alt="" />
+ </a>
+ </div>
+ </article>
+ </div>
+ </div>
+ </div><!--close TimesPremiercrossword -->
+ </div><!--close times-premier-crossword-subscription -->
+ </div><!-- close collection -->
+
+ <div class="collection">
+ <div id="crossword-subscription" class="crossword-subscription hidden">
+ <div class="layout split-layout">
+ <div class="column">
+ <div class="collection crosswords-collection">
+ <article class="story">
+ <h3 class="kicker">
+ <a href="https://www.nytimes.com/crosswords">The Crossword &raquo;</a>
+ </h3>
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/crosswords">Play Today&rsquo;s Puzzle </a>
+ </h2>
+ <div class="thumb">
+ <a href="https://www.nytimes.com/crosswords">
+ <img src="https://static01.nyt.com/images/crosswords/crosswords_30x30.png" alt="" />
+ </a>
+ </div>
+ </article>
+ </div>
+ </div>
+ <div class="column">
+ <div class="collection crosswords-collection">
+ <article class="story">
+ <h3 class="kicker">
+ <a href="http://wordplay.blogs.nytimes.com">Wordplay &raquo;</a>
+ </h3>
+ </article>
+ </div>
+ </div><!-- close column -->
+ </div><!-- close layout -->
+ </div><!-- close crossword-subscription -->
+ </div><!--close collection -->
+
+ </section><!-- close user-subscriptions -->
+
+ <div id="HPMiddle" class="ad hpmiddle-ad nocontent robots-nocontent"></div>
+
+ <div class="region c-column-middle-span-region">
+
+ <div class="collection">
+ <link rel="stylesheet" type="text/css" href="https://int.nyt.com/apps/portals/assets/portal-6d57ae10010ddcfe80e975e769c6947e.css"/>
+
+ <style type="text/css">
+ /*HIDE WATCHING HEADER*/
+ .portal-container>header { display: none }
+ </style>
+
+ <div id="nytint-hp-watching">
+ <div class="portal-container">
+ <header class="portal-header">
+ <h4>Watching</h4>
+ </header>
+ <div class="portal-posts-frame expanded"></div>
+ <footer class="portal-footer"></footer>
+ </div>
+ </div>
+
+ <script type="text/javascript">
+ require(['foundation/main'], function() {
+ require(['homepage/main', 'https://int.nyt.com/apps/portals/assets/portal/app-31573ba689b023d9e52c26c6d6aa32ab.js'
+ ], function() {
+ require(['portal/app'], function(Portal) {
+
+ var opts = {
+ env: 'production_published',
+ matchHeight: {
+ match: '.span-ab-layout.layout > .ab-column',
+ container: '.c-column.column',
+ maxHeight: 2000
+ }
+ }
+
+ if (window.location.search.indexOf('portal_variant=watchingNoScroll') !== -1) {
+ opts.variation = 'simple';
+ opts.poll = false;
+ opts.limit = 20;
+ }
+
+ var watching = Portal.create('#nytint-hp-watching', opts);
+ });
+ });
+ });
+ </script>
+
+ <!-- HpPrototype: WatchingEnabled: DO NOT REMOVE -->
+ </div>
+
+ </div><!-- close c-column-middle-span-region -->
+
+ <div class="region c-column-above-moth-fixed-region">
+
+
+ </div><!-- close c-column-above-moth-fixed-region -->
+
+ <div class="region c-column-above-moth-region">
+
+
+ </div><!-- close c-column-above-moth-region -->
+
+ </div><!-- close c-column -->
+
+ </div><!-- close span-ab-layout -->
+
+ <section id="paid-post-five-pack" class="paid-post-five-pack hidden nocontent robots-nocontent">
+ <h2 class="section-heading">From Our Advertisers</h2>
+ <ul class="story-menu">
+ <li id="PaidPostFivePack1" class="story-menu-item ad"></li>
+ <li id="PaidPostFivePack2" class="story-menu-item ad"></li>
+ <li id="PaidPostFivePack3" class="story-menu-item ad"></li>
+ <li id="PaidPostFivePack4" class="story-menu-item ad"></li>
+ <li id="PaidPostFivePack5" class="story-menu-item ad"></li>
+ </ul>
+ </section>
+ <div id="HPBreak" class="ad hpbreak-ad nocontent robots-nocontent hidden"></div>
+
+ <div id="video-player-region" class="video-player-region region">
+ <div class="collection">
+ <div id="video-module-loader" class="loader-container video-section-loader-container">
+ <div class="loader loader-t-logo-32x32-ecedeb-ffffff"><span class="visually-hidden">Loading...</span></div>
+ </div>
+ <section id="video-section"
+ class="video-section invisible"
+ data-playlist-id="1194811622188"
+ data-api-token="cE97ArV7TzqBzkmeRVVhJ8O6GWME2iG_bRvjBTlNb4o."
+ data-player-id="2640832222001"
+ data-publisher-id="1749339200">
+ <header class="section-header">
+ <h2 class="section-heading"><a class="times-video-link" href="https://www.nytimes.com/video">times<span>video</span></a></h2>
+ <a href="https://www.nytimes.com/video?src=vidm" class="user-action explore-all-videos-link"> explore all videos &raquo;</a>
+ </header>
+ <div class="column a-column">
+ <article class="story">
+ <figure class="media video video-player" aria-label="media" role="group">
+ <span class="visually-hidden">Video Player</span>
+ <img src="" class="poster" alt="" />
+ <div class="video-player-container"></div>
+ <div class="media-action-overlay"></div>
+ <div class="sharetools video-sharetools"
+ data-shares="email|,facebook|,twitter|,embed|,show-all|"
+ data-url=""
+ data-title=""
+ data-description=""
+ data-content-type="video">
+ </div>
+ <figcaption class="credit"></figcaption>
+ </figure>
+ </article>
+ </div>
+ <div class="column b-column">
+ <div id="video-playlist-container" class="video-playlist-container">
+ <ul id="video-playlist" class="video-playlist"></ul>
+ </div>
+ </div> <!-- end b-column -->
+ </section>
+ </div>
+ </div><!-- close video-player-region -->
+
+ <section class="inside-nyt">
+ <div class="inside-nyt-region region">
+ <h2 class="section-heading">Inside Nytimes.com</h2>
+ <div id="inside-nyt-browser" class="inside-nyt-browser">
+ <div class="navigation-control">
+ <button class="button previous deactivated">
+ <div class="arrow arrow-left">
+ <span class="visually-hidden">Go to the previous story</span>
+ <div class="arrow-conceal"></div>
+ </div>
+ </button>
+ <button class="button next">
+ <div class="arrow arrow-right">
+ <span class="visually-hidden">Go to the next story</span>
+ <div class="arrow-conceal"></div>
+ </div>
+ </button>
+ </div>
+ <div class="carousel">
+ <ol class="menu layout-horizontal theme-story">
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/theater">Theater</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005387208" data-rank="0" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/theater/oh-my-sweet-land-amir-nizar-zuabi.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/09/03/arts/27SWEETLAND1/27SWEETLAND1-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">The Kitchen Is Her Stage</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/pages/opinion/index.html">Opinion</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005396481" data-rank="1" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/29/opinion/transgender-trump-chelsea-manning.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/29/opinion/29kirchickWeb/29kirchickWeb-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">When Transgender Trumps Treachery</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/technology">Technology</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005396461" data-rank="2" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/technology/doxxing-protests.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/business/30DOXXING5/30DOXXING5-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">How ‘Doxxing’ Became a Tool</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/pages/dining/index.html">Food</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005388364" data-rank="3" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://cooking.nytimes.com/recipes/12965-spaghetti-carbonara">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2013/12/17/dining/recipes-spaghetticarbonara-copy/recipes-spaghetticarbonara-copy-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">How to Make the Best Spaghetti Carbonara</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/pages/opinion/index.html">Opinion</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005397970" data-rank="4" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/29/opinion/harvey-houston-schools-teachers.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/29/opinion/29danielsSub/29danielsSub-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">I Teach in Houston. I’m Worried for My Students.</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/science">Science</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005398035" data-rank="5" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/science/nova-stars-korea.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/science/31TB-NOVA1/31TB-NOVA1-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">The Mystery of a Vanished Star</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/arts/design">Art & Design</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005391869" data-rank="0" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/arts/design/berkshires-elizabeth-king-helen-frankenthaler-clark-art-mass-moca.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/09/01/arts/01BERKSHIRETOUR1/01BERKSHIRETOUR1-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">Berkshire Tour of Art</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/pages/opinion/index.html">Opinion</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005396484" data-rank="1" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/opinion/corporate-tax-cuts-jobs.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/opinion/30anderson/30anderson-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">The Corporate Tax Cut Myth</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/spotlight/times-tips">Smarter Living</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005390050" data-rank="2" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/smarter-living/how-to-deal-with-all-the-bites-and-stings-of-summer.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/24/smarter-living/24Bites-smarterLiving-slide-21DI/24Bites-smarterLiving-slide-21DI-mediumSquare149-v2.jpg" alt="">
+ </div>
+ <h2 class="story-heading">How to Deal With the Stings of Summer</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/fashion">Fashion & Style</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005396095" data-rank="3" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/fashion/labor-day-weekend-sales-openings.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/fashion/31SCOUTING1combo/31SCOUTING1combo-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">Finding Labor Day Weekend’s Best Sales</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/pages/opinion/index.html">Opinion</a></h2>
+
+ <article class="story theme-summary no-thumb" data-story-id="100000005399960" data-rank="4" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/opinion/washington-remains-united-behind-nato.html">
+ <h2 class="story-heading">Washington Remains United Behind NATO</h2>
+ <p class="summary">There is a strong consensus that a renaissance of NATO offers the best hope to confront our current threats.</p>
+ </a>
+ </article>
+
+ </section>
+ </li>
+ <li>
+ <section>
+ <h2 class="section-heading"><a href="https://www.nytimes.com/section/us">U.S.</a></h2>
+
+ <article class="story theme-summary" data-story-id="100000005399999" data-rank="5" data-collection-renderstyle="Moth">
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/us/fire-ants-harvey-hurricane-storm.html">
+ <div class="wide-thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/us/31xp-fireants/merlin-to-scoop-126550571-982068-mediumSquare149.jpg" alt="">
+ </div>
+ <h2 class="story-heading">Hazard in Houston? Fire Ants</h2>
+ </a>
+ </article>
+
+ </section>
+ </li>
+
+ </ol>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <div id="HPMidLeader" class="ad hpmidleader-ad nocontent robots-nocontent"></div>
+
+ <div class="span-ab-layout layout">
+
+ <div class="ab-column column">
+
+ <hr class="scotch-rule" />
+
+ <section class="well">
+ <div class="region well-region">
+ <h2 class="section-heading visually-hidden">Sections</h2>
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/world/index.html">World &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005392389" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/world/canada/canada-climate-change-arctic.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/world/americas/31CanadaChurchill1/churchill-slide-GEXA-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Churchill Journal: Canadian Town, Isolated After Losing Rail Link, ‘Feels Held Hostage’ </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005399498" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/world/asia/north-korea-south-korea-missile-pictures-bomb.html">
+ After Missile Tests, North and South Korea Wage War of Pictures </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005401178" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/world/americas/brazil-amazon-mining-temer-environmentalists-judge.html">
+ Brazilian Judge Stymies Plan to Allow Mining in Amazon Region </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/business/index.html">Business Day &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005399538" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/technology/personaltech/future-smartphone-camera-augmented-reality.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/business/31techfix/31techfix-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Tech Fix: The Smartphone’s Future: It’s All About the Camera </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005400786" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/health/gene-therapy-cancer.html">
+ F.D.A. Approves First Gene-Altering Leukemia Treatment, Costing $475,000 </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396254" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/business/media/nfl-six-second-commercials.html">
+ Six-Second Commercials Are Coming to N.F.L. Games on Fox </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/opinion/index.html">Opinion &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005400487" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/opinion/trump-osteen-harvey-church.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/opinion/30butlerWeb/30butlerWeb-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Op-Ed Contributor: The Cheap Prosperity Gospel of Trump and Osteen </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005400536" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/31/opinion/voting-reform-illinois-texas.html">
+ Editorial: On Voting Reforms, Follow Illinois, Not Texas </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005401080" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/31/opinion/trump-harvey-storm-army.html">
+ Charles M. Blow: Trump Raises an Army </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/us">U.S. &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005401006" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/us/small-towns-harvey.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/us/31towns4/31towns4-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ As Houston Looks to Recover, Small Towns Now Bear the Brunt </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005401457" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/30/us/houston-flood-rescue-cries-for-help.html">
+ Thousands Cried for Help as Houston Flooded </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005399973" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/us/port-arthur-flooding.html">
+ Port Arthur Faces Harvey Flooding Disaster: ‘Our Whole City Is Underwater’ </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/technology/index.html">Technology &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005399538" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/technology/personaltech/future-smartphone-camera-augmented-reality.html">
+
+
+ <h3 class="story-heading">
+ Tech Fix: The Smartphone’s Future: It’s All About the Camera </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396461" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/technology/doxxing-protests.html">
+ How ‘Doxxing’ Became a Mainstream Tool in the Culture Wars </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005393341" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/technology/kalanick-benchmark-uber-delaware.html">
+ Kalanick’s Feud With Benchmark Goes to Arbitration for Now, Judge Rules </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/arts/index.html">Arts &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005385152" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/arts/design/maiolino-museum-of-contemporary-art.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/09/01/arts/01MAIOLINO1/01MAIOLINO1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ art review: Weekend in Los Angeles: That Touch of Brazil </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005398883" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/arts/television/uk-gbbo-great-british-bake-off-channel-4.html">
+ ‘Great British Bake Off’ Is Still a Treat for Many Viewers </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005399033" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/books/review-cuz-danielle-allen.html">
+ Books of The Times: ‘Cuz’ Mourns a Loss and Denounces a System </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/politics/index.html">Politics &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005401238" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/us/politics/us-aid-pakistan-terror.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/us/31dc-diplo/31dc-diplo-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ U.S. Gives Military Assistance to Pakistan, With Strings Attached </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005401018" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/us/politics/trump-obamacare-enrollment-markets-subsidies.html">
+ Trump Administration Wants to Stabilize Health Markets but Won’t Say How </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005400924" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/us/politics/hurricane-sandy-relief-fact-check.html">
+ Fact Check: Was 2013 Hurricane Sandy Relief Package ‘Full of Pork’? </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/fashion">Fashion & Style &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005398042" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/31/fashion/jean-paul-goude-desigual.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/fashion/31UNBUTTONED-1/31UNBUTTONED-1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Unbuttoned: Desigual Turns to Jean-Paul Goude for a Makeover </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396488" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/fashion/uncle-brother-catskills-gavin-brown.html">
+ A Catskills Art Scene Makes a Splash With Free Curry </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005373132" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/fashion/aura-photography-radiant-human.html">
+ Me Time: Aura Photographs: Selfies for the New Age Set </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/movies">Movies &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005389037" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/29/movies/amid-gung-ho-mentality-stunt-deaths-renew-a-debate-over-safety.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/arts/29STUNT3/29STUNT3-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Amid ‘Gung-Ho Mentality,’ Stunt Deaths Renew a Debate Over Safety </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005364809" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/movies/venice-film-festival-opening-stars-matt-damon-kristen-wiig.html">
+ Venice Film Festival Opening Stars Matt Damon and Kristen Wiig </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395796" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/movies/texas-chain-saw-massacre-tobe-hooper-appraisal.html">
+ An Appraisal: In ‘Texas Chain Saw Massacre,’ Sympathy for the Devil </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/nyregion">New York &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005386266" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/31/nyregion/new-york-today-hurricanes-in-nyc-harvey-tropical-storm.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/nyregion/31NYTODAY1/31NYTODAY1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ New York Today: New York Today: Reflecting on Harvey, in the Northeast </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005400160" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/nyregion/ordering-review-of-statues-puts-de-blasio-in-tricky-spot.html">
+ Ordering Review of Statues Puts de Blasio in Tricky Spot </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005398633" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/nyregion/instagram-places-new-york-travel.html">
+ New York City’s Newest Hot Spot? Check Instagram </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/sports/index.html">Sports &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005399955" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/sports/espn-ed-cunningham-football-concussions.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/sports/31BRAINSweb1/31BRAINSweb1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ ESPN Football Analyst Walks Away, Disturbed by Brain Trauma on Field </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005401613" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/31/sports/tennis/alexander-zverev-borna-coric-us-open.html">
+ Two Zverevs Take the Court in Queens, and Only One Advances </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395156" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/sports/olympics/munich-olympic-massacre-1972-memorial-israeli-athletes.html">
+ In Munich, a Tribute to Israeli Athletes and Families’ Persistence </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/theater/index.html">Theater &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005387208" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/theater/oh-my-sweet-land-amir-nizar-zuabi.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/09/03/arts/27SWEETLAND1/27SWEETLAND1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ The Kitchen Is Her Stage. (It Could Actually Be Your Kitchen.) </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005364092" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/theater/eavesdropping-on-warhol-and-capote.html">
+ Eavesdropping on Warhol and Capote </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005360538" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/theater/great-comet-broadway-race.html">
+ Race, Money and Broadway: How ‘Great Comet’ Burned Out </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/science">Science &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005343497" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/video/science/100000005343497/forty-years-of-voyager.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/29/multimedia/Voyager-Thumb1/Voyager-Thumb1-thumbStandard.png" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Forty Years of Voyager </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005398035" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/science/nova-stars-korea.html">
+ Trilobites: Casting Light on Mystery of a Star That Vanished After 14 Days </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396021" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/science/trigonometry-babylonian-tablet.html">
+ Trilobites: Hints of Trigonometry on a 3,700-Year-Old Babylonian Tablet </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/obituaries">Obituaries &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005401130" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/sports/ncaabasketball/villanova-coach-rollie-massimino-dead.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/obituaries/30massimino1/30massimino1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Rollie Massimino, 82, Dies; Rode Dark Horse Villanova to Basketball Glory </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005398288" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/sports/basketball/jud-heathcote-dead-coached-michigan-state-to-basketball-title.html">
+ Jud Heathcote, 90, Dies; Coached Michigan State to Basketball Title </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005399785" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/business/david-tang-dead-fashion-retailer.html">
+ David Tang, Fashion Retailer and Raconteur, Dies at 63 </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/arts/television">Television &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005398883" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/arts/television/uk-gbbo-great-british-bake-off-channel-4.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/arts/31BAKEOFF-ROUNDUP/31BAKEOFF-ROUNDUP-thumbStandard-v2.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ ‘Great British Bake Off’ Is Still a Treat for Many Viewers </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005367164" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/24/arts/television/the-deuce-hbo-david-simon.html">
+ ‘The Deuce’ Recalls Sex and Sleaze in 1970s Times Square </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396266" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/29/watching/fall-tv-sf-promo.html">
+ Watching: Your Catch-Up Guide to the Best Shows Returning This Fall </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/health/index.html">Health &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005400786" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/health/gene-therapy-cancer.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/science/31GENE3/31GENE3-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ F.D.A. Approves First Gene-Altering Leukemia Treatment, Costing $475,000 </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005390415" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/business/economy/home-health-care-work.html">
+ Economic Scene: Home Health Care: Shouldn’t It Be Work Worth Doing? </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395934" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/health/fda-stem-cell.html">
+ F.D.A. Cracks Down on ‘Unscrupulous’ Stem Cell Clinics </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/travel">Travel &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000004599829" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/travel/peaceful-island-indonesia.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/09/10/travel/10gili1/30gili1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Next Stop: This Indonesian Island Is a Respite From Bali. At Least for Now. </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005388668" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/29/travel/what-to-do-36-hours-in-trieste-italy.html">
+ 36 Hours: 36 Hours in Trieste, Italy </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005385852" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/travel/kodiak-travel-photography.html">
+ Photo Essay: Our Stunning World </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/books">Books &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005399033" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/books/review-cuz-danielle-allen.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/31/books/31bookallen2/31bookallen2-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Books of The Times: ‘Cuz’ Mourns a Loss and Denounces a System </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396584" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/books/review-my-absolute-darling-gabriel-tallent.html">
+ Books of The Times: A Heroine in the Mold of Huck and Scout </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395901" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/books/review-john-le-carre-legacy-of-spies.html">
+ Books of The Times: George Smiley and Other Old Friends Return in John le Carré’s ‘A Legacy of Spies’ </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/education">Education &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005337043" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/interactive/2017/08/24/us/affirmative-action.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/03/us/affirmative-action-in-colleges-and-representation-of-blacks-and-hispanics-1503525136789/affirmative-action-in-colleges-and-representation-of-blacks-and-hispanics-1503525136789-thumbStandard-v5.png" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Even With Affirmative Action, Blacks and Hispanics Are More Underrepresented at Top Colleges Than 35 Years Ago </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005348802" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/24/technology/coding-boot-camps-close.html">
+ As Coding Boot Camps Close, the Field Faces a Reality Check </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005384528" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/22/opinion/washington-lee-university-trump-nationalism.html">
+ On Campus: My University Is Named for Robert E. Lee. What Now? </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/dining/index.html">Food &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005387948" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/29/dining/restaurant-wish-list-pete-wells.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/dining/30WISH3/30WISH3-thumbStandard-v2.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Critic’s Notebook: A Wish List for New Restaurants </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005390036" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/dining/mashed-potato-salad-recipe.html">
+ A Good Appetite: An Accidentally Creamier, Fluffier Potato Salad </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005314050" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/dining/opentable-restaurant-reservations.html">
+ OpenTable Began a Revolution. Now It’s a Power Under Siege. </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/opinion/index.html#sundayreview">Sunday Review &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005391244" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/interactive/2017/08/25/opinion/sunday/worst-and-best-places-to-be-gay.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/24/opinion/sunday/worst-and-best-places-to-be-gay-1503633763145/worst-and-best-places-to-be-gay-1503633763145-thumbStandard.png" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Op-Ed Columnist: The Worst (and Best) Places to Be Gay in America </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005392272" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/26/opinion/sunday/memorize-poems-poetry-education.html">
+ Molly Worthen: Memorize That Poem! </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005388249" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/26/opinion/sunday/obamacare-universal-health-coverage.html">
+ Editorial: Looking Beyond the Obamacare Debate to Improve Health Care </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/realestate/index.html">Real Estate &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005386638" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/realestate/weston-conn-quiet-and-wooded-with-top-notch-schools.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/09/03/realestate/03LIVING-WESTON-slide-537E/03LIVING-WESTON-slide-537E-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Living In: Weston, Conn.: Quiet and Wooded, With Top-Notch Schools </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005390514" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/realestate/house-hunting-in-bali.html">
+ International Real Estate: House Hunting in ... Bali </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395929" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/realestate/900000-homes-in-colorado-pennsylvania-and-vermont.html">
+ What You Get: $900,000 Homes in Colorado, Pennsylvania and Vermont </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/upshot">The Upshot &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005396126" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/interactive/2017/08/29/upshot/statues-quiz.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/26/upshot/up-statue-Lee/up-statue-Lee-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Which Statues Need to Come Down? You Decide </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005393332" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/29/upshot/harvey-rainfall-where-you-live.html">
+ Houston May Get 50 Inches of Rain. How Long Does It Take Your City to Get That Much? </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005395922" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/28/upshot/markets-are-signaling-that-hurricane-harvey-wont-crush-the-economy.html">
+ Pricing a Disaster: Markets Are Signaling That Hurricane Harvey Won’t Crush the Economy </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/magazine">Magazine &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005393258" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/magazine/how-to-get-rich-in-trumps-washington.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/09/03/magazine/03lobbyists1/03lobbyists1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Feature: How to Get Rich in Trump’s Washington </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005381661" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/interactive/2017/08/24/magazine/usopen-federer-nadal-backhand-wonder-year.html">
+ U.S. Open: How Roger Federer Upgraded His Game </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005389041" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/magazine/my-nanny-has-a-gambling-problem-can-i-fire-her.html">
+ The Ethicist: My Nanny Has a Gambling Problem. Can I Fire Her? </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+
+ <div class="split-3-layout layout theme-base">
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/pages/automobiles/index.html">Automobiles &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005398865" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/29/business/ford-driverless-pizza-delivery-dominos.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/business/30FORD1/30FORD1-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ There’s a Pizza Delivery in Ford’s Future, by Driverless Car </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005385761" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/24/automobiles/wheels/pebble-beach-concours-delegance-car-auction.html">
+ Wheels: Bidding Before California Car Show Suggests Collectible Market Is Healthy </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005391881" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/25/business/volkswagen-engineer-prison-diesel-cheating.html">
+ Volkswagen Engineer Gets Prison in Diesel Cheating Case </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column ">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/t-magazine">T Magazine &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005365534" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/t-magazine/travel/sullivan-county-narrowsburg-livingston-manor-callicoon-guide.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/t-magazine/sullivan-slide-VBE5-copy/sullivan-slide-VBE5-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Wanderlust: What to Do (and Where to Stay) in the Western Catskills </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005392498" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/t-magazine/charlottesville-art-robert-longo-toyin-ojih-odutola-sanford-biggers.html">
+ T Agitprop: 5 Artists Respond to: Charlottesville </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005397209" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/29/t-magazine/fashion/maggie-marilyn-hewitt-clothing-designer.html">
+ On the Verge: Person to Know: A Nonconformist New Zealand Designer </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ <div class="column last-column">
+
+ <section>
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/insider">Times Insider &raquo;</a>
+ </h2>
+ <ul>
+ <li>
+ <article class="story theme-summary" data-story-id="100000005400594" data-rank="0" data-collection-renderstyle="HpHedThumbWell">
+
+ <a class="story-link" href="https://www.nytimes.com/2017/08/30/insider/events/game-of-thrones-conference-call-new-york-times.html">
+
+ <div class="thumb">
+ <img src="https://static01.nyt.com/images/2017/08/30/insider/30insider-event-thrones-image/30insider-event-thrones-image-thumbStandard.jpg" alt="" />
+ </div>
+
+ <h3 class="story-heading">
+ Conference Call, Sept. 6: Live Event: Discuss ‘Game of Thrones’ With The New York Times </h3>
+ </a>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005399053" data-rank="1" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/insider/the-sodden-haunted-fields-of-flanders.html">
+ Picturing the First World War: The Sodden, Haunted Fields of Flanders </a>
+ </h2>
+ </article>
+ </li>
+ <li>
+ <article class="story" data-story-id="100000005396519" data-rank="2" data-collection-renderstyle="HpHedThumbWell">
+ <h2 class="story-heading">
+ <a href="https://www.nytimes.com/2017/08/30/insider/newsbook-column-explainer-book-review.html">
+ When the News Begs for a Book: Behind the Newsbook Column </a>
+ </h2>
+ </article>
+ </li>
+ </ul>
+ </section>
+
+ </div> <!-- close column -->
+
+
+ </div><!-- close split-3-layout -->
+
+ </div>
+ </section><!-- close well section -->
+
+ </div><!-- close ab-column -->
+
+ <div class="c-column column">
+
+
+ <section class="real-estate">
+ <div class="layout split-layout theme-base">
+ <div class="column">
+ <div class="region real-estate-left-region">
+
+ <div class="collection">
+ <h2 class="section-heading">
+ <a href="https://www.nytimes.com/section/realestate">Real Estate &raquo;</a>
+ </h2>
+ <article class="story theme-summary" id="topnews-100000005395929" data-story-id="100000005395929" data-rank="0" data-collection-renderstyle="HpSectionSumSmallMedia">
+
+ <h3 class="kicker">What You Get </h3>
+
+ <h2 class="story-heading"><a href="https://www.nytimes.com/2017/08/30/realestate/900000-homes-in-colorado-pennsylvania-and-vermont.html">$900,000 Homes in Colorado, Pennsylvania and Vermont</a></h2>
+
+ <p class="byline">By TIM McKEOUGH </p>
+
+ <div class="thumb">
+ <a href="https://www.nytimes.com/2017/08/30/realestate/900000-homes-in-colorado-pennsylvania-and-vermont.html"><img src="https://static01.nyt.com/images/2017/09/03/realestate/03WYG-slide-FF9B/03WYG-slide-FF9B-thumbStandard.jpg" alt=""></a>
+ </div>
+
+ <p class="summary">
+ A renovated midcentury-modern home in Denver, a 1907 stone house in Philadelphia and a lakeside retreat in Ferrisburgh. </p>
+
+
+ </article>
+
+ </div>
+ <div class="collection">
+ <ul class="theme-module-headlines">
+ <li><article class="story" data-collection-renderstyle="HpHeadline"><h2 class="story-heading"><a href="http://www.nytimes.com/real-estate/find-a-home">Search for Homes for Sale or Rent</a></h2></article></li>
+
+ <li><article class="story" data-collection-renderstyle="HpHeadline"><h2 class="story-heading"><a href="https://www.nytimes.com/real-estate/mortgage-calculator">Mortgage Calculator</a></h2></article></li></ul>
+
+ </div>
+
+ </div><!-- close real-estate-left-region -->
+ </div>
+ <div class="column">
+ <div class="region real-estate-right-region">
+ <div class="collection">
+ <div id="HPmodule-RE2-alternate-content"><div></div>
+ <div class="collection">
+ </div></div></div>
+ <div id="hpmodulere2" class="ad hpmodulere2-ad nocontent robots-nocontent"></div>
+ </div><!-- close real-estate-right-region -->
+ </div>
+ </div>
+ </section>
+
+
+ <section id="recommendations" class="recommendations">
+ <div class="tabs-container">
+ <ul class="tabs">
+ <li data-type="most-emailed" class="most-emailed-tab"><a href="https://www.nytimes.com/trending/">Most Emailed</a></li><li data-type="most-viewed" class="most-viewed-tab"><a href="https://www.nytimes.com/gst/mostpopular.html">Most Viewed</a></li><li data-type="trending" class="trending-tab"><a href="http://www.nytimes.com/trending/">Trending</a></li><li data-type="recommended" class="recommended-tab"><a href="https://www.nytimes.com/recommendations">Recommended for you</a></li>
+ </ul>
+ </div><!-- end tabs-container -->
+
+ <div class="tab-content most-emailed">
+ <div class="loader"></div>
+ </div>
+ <div class="tab-content most-viewed">
+ <div class="loader"></div>
+ </div>
+ <div class="tab-content trending">
+ <div class="loader"></div>
+ </div>
+ <div class="tab-content recommended">
+ <div class="loader"></div>
+ </div>
+
+ <div id="recommendations-module-loader" class="loader-container">
+ <div class="loader loader-t-logo-32x32-ecedeb-ffffff"><span class="visually-hidden">Loading...</span></div>
+ </div>
+ </section>
+
+ <div id="Box1" class="ad box1-ad nocontent robots-nocontent"></div>
+ <div id="HPBottom1" class="ad hpbottom1-ad nocontent robots-nocontent"></div>
+
+ </div><!-- close c-column -->
+
+ </div><!-- close span-ab-layout -->
+
+ <div id="HPSponLink" class="ad hpsponlink-ad nocontent robots-nocontent"></div>
+ <div id="Bottom8" class="ad bottom8-ad nocontent robots-nocontent"></div>
+ <div id="Bottom9" class="ad bottom9-ad nocontent robots-nocontent"></div>
+ <div class="search-overlay"></div>
+ </main><!-- close main -->
+ <section id="site-index" class="site-index">
+ <header class="section-header">
+ <p class="user-action"><a href="https://www.nytimes.com/">Go to Home Page &raquo;</a></p>
+ <h2 class="section-heading">
+ <span class="visually-hidden">Site Index</span>
+ <a id="site-index-branding-link" href="https://www.nytimes.com/">
+ <span class="visually-hidden">The New York Times</span>
+ </a>
+ </h2>
+ <script>window.magnum.writeLogo('small', 'https://a1.nyt.com/assets/homepage/20170810-135137/images/foundation/logos/', '', '', 'standard', 'site-index-branding-link', '');</script>
+ </header>
+
+ <nav id="site-index-navigation" class="site-index-navigation" role="navigation">
+ <h2 class="visually-hidden">Site Index Navigation</h2>
+ <div class="split-6-layout layout">
+
+
+ <div class="column">
+ <h3 class="menu-heading">News</h3>
+ <ul class="menu">
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/world/index.html">World</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/national/index.html">U.S.</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/politics/index.html">Politics</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/nyregion/index.html">N.Y.</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/business/index.html">Business</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/technology/index.html">Tech</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/science">Science</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/health/index.html">Health</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/sports/index.html">Sports</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/education/index.html">Education</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/obituaries/index.html">Obituaries</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/todayspaper/index.html">Today's Paper</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/corrections/index.html">Corrections</a>
+ </li>
+
+
+ </ul>
+ </div><!-- close column -->
+
+
+ <div class="column">
+ <h3 class="menu-heading">Opinion</h3>
+ <ul class="menu">
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html">Today's Opinion</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#columnists">Op-Ed Columnists</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#editorials">Editorials</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#contributing">Contributing Writers</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#op-ed">Op-Ed Contributors</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#opinionator">Opinionator</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#letters">Letters</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#sundayreview">Sunday Review</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/opinion/index.html#takingNote">Taking Note</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/roomfordebate">Room for Debate</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/video/opinion">Video: Opinion</a>
+ </li>
+
+
+ </ul>
+ </div><!-- close column -->
+
+
+ <div class="column">
+ <h3 class="menu-heading">Arts</h3>
+ <ul class="menu">
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/arts/index.html">Today's Arts</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/arts/design/index.html">Art & Design</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/books/index.html">Books</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/arts/dance/index.html">Dance</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/movies/index.html">Movies</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/arts/music/index.html">Music</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/events/">N.Y.C. Events Guide</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/arts/television/index.html">Television</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/theater/index.html">Theater</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/video/arts">Video: Arts</a>
+ </li>
+
+
+ </ul>
+ </div><!-- close column -->
+
+
+ <div class="column">
+ <h3 class="menu-heading">Living</h3>
+ <ul class="menu">
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/automobiles/index.html">Automobiles</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/crosswords/">Crossword</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/dining/index.html">Food</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/education/index.html">Education</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/fashion/index.html">Fashion & Style</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/health/index.html">Health</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/jobs">Jobs</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/magazine/index.html">Magazine</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/events/">N.Y.C. Events Guide</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/realestate">Real Estate</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/t-magazine">T Magazine</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/travel">Travel</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/fashion/weddings/index.html">Weddings & Celebrations</a>
+ </li>
+
+
+ </ul>
+ </div><!-- close column -->
+
+
+ <div class="column">
+ <h3 class="menu-heading">Listings & More</h3>
+ <ul class="menu">
+
+
+ <li>
+ <a href="https://www.nytimes.com/section/reader-center">Reader Center</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/ref/classifieds/">Classifieds</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/marketing/tools-and-services/">Tools & Services</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/topics/">Times Topics</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/events/">N.Y.C. Events Guide</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/interactive/blogs/directory.html">Blogs</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/pages/multimedia/index.html">Multimedia</a>
+ </li>
+
+
+ <li>
+ <a href="https://lens.blogs.nytimes.com/">Photography</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/video">Video</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/store/?&t=qry542&utm_source=nytimes&utm_medium=HPB&utm_content=hp_browsetree&utm_campaign=NYT-HP&module=SectionsNav&action=click&region=TopBar&version=BrowseTree&contentCollection=NYT%20Store&contentPlacement=2&pgtype=Homepage">NYT Store</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/times-journeys/?utm_source=nytimes&utm_medium=HPLink&utm_content=hp_browsetree&utm_campaign=NYT-HP">Times Journeys</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/seeallnav">Subscribe</a>
+ </li>
+
+
+ <li>
+ <a href="https://www.nytimes.com/membercenter">Manage My Account</a>
+ </li>
+
+
+ <li>
+ <a href="http://www.nytco.com">NYTCo</a>
+ </li>
+
+
+ </ul>
+ </div><!-- close column -->
+
+
+ <div class="column last-column">
+
+ <h3 class="menu-heading">Subscribe</h3>
+
+ <ul class="menu primary-menu">
+ <li class="menu-label">Subscribe</li>
+ <li class="home-delivery">
+ <i class="icon sprite-icon"></i>
+ <a class="nyt-home-delivery" href="https://www.nytimes.com/hdleftnav">Home Delivery</a>
+ </li>
+ <li class="digital-subscriptions">
+ <i class="icon sprite-icon"></i>
+ <a class="digital-subscription" href="https://www.nytimes.com/digitalleftnav">Digital Subscriptions</a>
+ </li>
+ <li class="nyt-crossword last-item">
+ <i class="icon sprite-icon"></i>
+ <a id="nyt-crossword" href="https://www.nytimes.com/crosswords/index.html">Crossword</a>
+ </li>
+ </ul>
+
+ <ul class="menu secondary-menu">
+
+ <li class="email-newsletters">
+ <a href="https://www.nytimes.com/marketing/newsletters">Email Newsletters</a>
+ </li>
+ <li>
+ <a href="https://myaccount.nytimes.com/mem/tnt.html">Alerts</a>
+ </li>
+ <li class="gift-subscription">
+ <a href="https://www.nytimes.com/giftleftnav">Gift Subscriptions</a>
+ </li>
+ <li>
+ <a href="https://www.nytimes.com/corporateleftnav">Corporate Subscriptions</a>
+ </li>
+ <li>
+ <a href="https://www.nytimes.com/educationleftnav">Education Rate</a>
+ </li>
+
+ </ul>
+ <ul class="menu secondary-menu">
+ <li>
+ <a href="https://www.nytimes.com/services/mobile/index.html">Mobile Applications</a>
+ </li>
+ <li>
+ <a href="http://eedition.nytimes.com/cgi-bin/signup.cgi?cc=37FYY">Replica Edition</a>
+ </li>
+
+ </ul>
+
+ </div><!-- close column -->
+
+ </div><!-- close split-6-layout -->
+
+ </nav><!-- close nav -->
+
+ </section><!-- close site-index -->
+
+ <footer id="page-footer" class="page-footer" role="contentinfo">
+ <nav>
+ <h2 class="visually-hidden">Site Information Navigation</h2>
+ <ul>
+ <li>
+ <a href="https://www.nytimes.com/content/help/rights/copyright/copyright-notice.html" itemprop="copyrightNotice">
+ &copy; <span itemprop="copyrightYear">2017</span><span itemprop="copyrightHolder provider sourceOrganization" itemscope itemtype="http://schema.org/Organization" itemid="http://www.nytimes.com"><span itemprop="name"> The New York Times Company</span><meta itemprop="tickerSymbol" content="NYSE NYT"/></span>
+ </a>
+ </li>
+ <li class="wide-viewport-item"><a href="https://www.nytimes.com/ref/membercenter/help/infoservdirectory.html">Contact Us</a></li>
+ <li class="wide-viewport-item"><a href="http://www.nytco.com/careers">Work With Us</a></li>
+ <li class="wide-viewport-item"><a href="http://nytmediakit.com/">Advertise</a></li>
+ <li class="wide-viewport-item"><a href="https://www.nytimes.com/content/help/rights/privacy/policy/privacy-policy.html#pp">Your Ad Choices</a></li>
+ <li><a href="https://www.nytimes.com/privacy">Privacy</a></li>
+ <li><a href="https://www.nytimes.com/ref/membercenter/help/agree.html" itemprop="usageTerms">Terms of Service</a></li>
+ <li class="wide-viewport-item last-item"><a href="https://www.nytimes.com/content/help/rights/sale/terms-of-sale.html">Terms of Sale</a></li>
+ </ul>
+ </nav>
+ <nav class="last-nav">
+ <h2 class="visually-hidden">Site Information Navigation</h2>
+ <ul>
+ <li><a href="http://spiderbites.nytimes.com">Site Map</a></li>
+ <li><a href="https://www.nytimes.com/membercenter/sitehelp.html">Help</a></li>
+ <li><a href="https://myaccount.nytimes.com/membercenter/feedback.html">Site Feedback</a></li>
+ <li class="wide-viewport-item last-item"><a href="https://www.nytimes.com/subscriptions/Multiproduct/lp5558.html?campaignId=37WXW">Subscriptions</a></li>
+ </ul>
+ </nav>
+
+ <div id="mobile-banner" class="mobile-banner hidden">
+ <a class="banner-message" href="https://mobile.nytimes.com/">View Mobile Version</a>
+ </div>
+
+ <div id="dfp-perf-test" class="ad hidden"></div>
+ </footer>
+</div><!-- close page -->
+</div><!-- close shell -->
+<script>
+ require(['foundation/main'], function () {
+ require(['homepage/main']);
+ require(['jquery/nyt', 'foundation/views/page-manager'], function ($, pageManager) {
+ if (window.location.search.indexOf('disable_tagx') > 0) {
+ return;
+ }
+ $(document).ready(function () {
+ require(['https://a1.nyt.com/analytics/tagx-simple.min.js'], function () {
+ pageManager.trackingFireEventQueue();
+ });
+ });
+ });
+ });
+</script>
+<!--esi
+<esi:include src="/appconfig/https/show-modal.js" />
+-->
+
+<div id="Inv1" class="ad inv1-ad hidden"></div>
+<div id="Inv2" class="ad inv2-ad hidden"></div>
+<div id="Inv3" class="ad inv3-ad hidden"></div>
+<div id="ab1" class="ad ab1-ad hidden"></div>
+<div id="ab2" class="ad ab2-ad hidden"></div>
+<div id="ab3" class="ad ab3-ad hidden"></div>
+<div id="prop1" class="ad prop1-ad hidden"></div>
+<div id="prop2" class="ad prop2-ad hidden"></div>
+<div id="Anchor" class="ad anchor-ad hidden"></div>
+<div id="ADX_CLIENTSIDE" class="ad adx-clientside-ad hidden"></div>
+</body>
+</html>
diff --git a/plugins/af_readability/vendor/masterminds/html5/test/benchmark/run.php b/plugins/af_readability/vendor/masterminds/html5/test/benchmark/run.php
new file mode 100644
index 000000000..2ca190783
--- /dev/null
+++ b/plugins/af_readability/vendor/masterminds/html5/test/benchmark/run.php
@@ -0,0 +1,29 @@
+<?php
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+$iterations = isset($argv[1]) ? $argv[1] : 100;
+
+$html5 = new Masterminds\HTML5();
+$content = file_get_contents(__DIR__ . '/example.html');
+$dom = $html5->loadHTML($content);
+
+$samples = array();
+for ($i = 0; $i < $iterations; ++$i) {
+ $t = microtime(true);
+ $dom = $html5->loadHTML($content);
+ $samples[] = microtime(true) - $t;
+}
+$time = array_sum($samples) / count($samples);
+echo 'Loading: ' . ($time * 1000) . "\n";
+
+$samples = array();
+for ($i = 0; $i < $iterations; ++$i) {
+ $t = microtime(true);
+ $html5->saveHTML($dom);
+ $samples[] = microtime(true) - $t;
+}
+$time = array_sum($samples) / count($samples);
+echo 'Writing: ' . ($time * 1000) . "\n";
+
+exit(0);
diff --git a/plugins/af_readability/vendor/psr/http-factory/.gitignore b/plugins/af_readability/vendor/psr/http-factory/.gitignore
new file mode 100644
index 000000000..d8a7996ab
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/.gitignore
@@ -0,0 +1,2 @@
+composer.lock
+vendor/
diff --git a/plugins/af_readability/vendor/psr/http-factory/.pullapprove.yml b/plugins/af_readability/vendor/psr/http-factory/.pullapprove.yml
new file mode 100644
index 000000000..8cf081942
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/.pullapprove.yml
@@ -0,0 +1,7 @@
+extends: default
+reviewers:
+ -
+ name: contributors
+ required: 1
+ teams:
+ - http-factory-contributors
diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/plugins/af_readability/vendor/psr/http-factory/LICENSE
index 3f853aaf3..3f1559b2a 100644
--- a/vendor/symfony/polyfill-ctype/LICENSE
+++ b/plugins/af_readability/vendor/psr/http-factory/LICENSE
@@ -1,11 +1,13 @@
-Copyright (c) 2018-2019 Fabien Potencier
+MIT License
+
+Copyright (c) 2018 PHP-FIG
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
@@ -15,5 +17,5 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/plugins/af_readability/vendor/psr/http-factory/README.md b/plugins/af_readability/vendor/psr/http-factory/README.md
new file mode 100644
index 000000000..41d362a62
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/README.md
@@ -0,0 +1,10 @@
+HTTP Factories
+==============
+
+This repository holds all interfaces related to [PSR-17 (HTTP Message Factories)][psr-17].
+Please refer to the specification for a description.
+
+You can find implementations of the specification by looking for packages providing the
+[psr/http-factory-implementation](https://packagist.org/providers/psr/http-factory-implementation) virtual package.
+
+[psr-17]: https://www.php-fig.org/psr/psr-17/
diff --git a/plugins/af_readability/vendor/psr/http-factory/composer.json b/plugins/af_readability/vendor/psr/http-factory/composer.json
new file mode 100644
index 000000000..af62b290f
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/composer.json
@@ -0,0 +1,35 @@
+{
+ "name": "psr/http-factory",
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "psr",
+ "psr-7",
+ "psr-17",
+ "http",
+ "factory",
+ "message",
+ "request",
+ "response"
+ ],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/RequestFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/RequestFactoryInterface.php
new file mode 100644
index 000000000..cb39a08bf
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/RequestFactoryInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface RequestFactoryInterface
+{
+ /**
+ * Create a new request.
+ *
+ * @param string $method The HTTP method associated with the request.
+ * @param UriInterface|string $uri The URI associated with the request. If
+ * the value is a string, the factory MUST create a UriInterface
+ * instance based on it.
+ *
+ * @return RequestInterface
+ */
+ public function createRequest(string $method, $uri): RequestInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/ResponseFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/ResponseFactoryInterface.php
new file mode 100644
index 000000000..212562f00
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/ResponseFactoryInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface ResponseFactoryInterface
+{
+ /**
+ * Create a new response.
+ *
+ * @param int $code HTTP status code; defaults to 200
+ * @param string $reasonPhrase Reason phrase to associate with status code
+ * in generated response; if none is provided implementations MAY use
+ * the defaults as suggested in the HTTP specification.
+ *
+ * @return ResponseInterface
+ */
+ public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php
new file mode 100644
index 000000000..9fe031a8f
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface ServerRequestFactoryInterface
+{
+ /**
+ * Create a new server request.
+ *
+ * Note that server-params are taken precisely as given - no parsing/processing
+ * of the given values is performed, and, in particular, no attempt is made to
+ * determine the HTTP method or URI, which must be provided explicitly.
+ *
+ * @param string $method The HTTP method associated with the request.
+ * @param UriInterface|string $uri The URI associated with the request. If
+ * the value is a string, the factory MUST create a UriInterface
+ * instance based on it.
+ * @param array $serverParams Array of SAPI parameters with which to seed
+ * the generated request instance.
+ *
+ * @return ServerRequestInterface
+ */
+ public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/StreamFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/StreamFactoryInterface.php
new file mode 100644
index 000000000..90e3240c4
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/StreamFactoryInterface.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface StreamFactoryInterface
+{
+ /**
+ * Create a new stream from a string.
+ *
+ * The stream SHOULD be created with a temporary resource.
+ *
+ * @param string $content String content with which to populate the stream.
+ *
+ * @return StreamInterface
+ */
+ public function createStream(string $content = ''): StreamInterface;
+
+ /**
+ * Create a stream from an existing file.
+ *
+ * The file MUST be opened using the given mode, which may be any mode
+ * supported by the `fopen` function.
+ *
+ * The `$filename` MAY be any string supported by `fopen()`.
+ *
+ * @param string $filename Filename or stream URI to use as basis of stream.
+ * @param string $mode Mode with which to open the underlying filename/stream.
+ *
+ * @return StreamInterface
+ * @throws \RuntimeException If the file cannot be opened.
+ * @throws \InvalidArgumentException If the mode is invalid.
+ */
+ public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface;
+
+ /**
+ * Create a new stream from an existing resource.
+ *
+ * The stream MUST be readable and may be writable.
+ *
+ * @param resource $resource PHP resource to use as basis of stream.
+ *
+ * @return StreamInterface
+ */
+ public function createStreamFromResource($resource): StreamInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php
new file mode 100644
index 000000000..7db4e30af
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface UploadedFileFactoryInterface
+{
+ /**
+ * Create a new uploaded file.
+ *
+ * If a size is not provided it will be determined by checking the size of
+ * the file.
+ *
+ * @see http://php.net/manual/features.file-upload.post-method.php
+ * @see http://php.net/manual/features.file-upload.errors.php
+ *
+ * @param StreamInterface $stream Underlying stream representing the
+ * uploaded file content.
+ * @param int $size in bytes
+ * @param int $error PHP file upload error
+ * @param string $clientFilename Filename as provided by the client, if any.
+ * @param string $clientMediaType Media type as provided by the client, if any.
+ *
+ * @return UploadedFileInterface
+ *
+ * @throws \InvalidArgumentException If the file resource is not readable.
+ */
+ public function createUploadedFile(
+ StreamInterface $stream,
+ int $size = null,
+ int $error = \UPLOAD_ERR_OK,
+ string $clientFilename = null,
+ string $clientMediaType = null
+ ): UploadedFileInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-factory/src/UriFactoryInterface.php b/plugins/af_readability/vendor/psr/http-factory/src/UriFactoryInterface.php
new file mode 100644
index 000000000..06df0b46a
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-factory/src/UriFactoryInterface.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Psr\Http\Message;
+
+interface UriFactoryInterface
+{
+ /**
+ * Create a new URI.
+ *
+ * @param string $uri
+ *
+ * @return UriInterface
+ *
+ * @throws \InvalidArgumentException If the given URI cannot be parsed.
+ */
+ public function createUri(string $uri = ''): UriInterface;
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/CHANGELOG.md b/plugins/af_readability/vendor/psr/http-message/CHANGELOG.md
new file mode 100644
index 000000000..74b1ef923
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.0.1 - 2016-08-06
+
+### Added
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Updated all `@return self` annotation references in interfaces to use
+ `@return static`, which more closelly follows the semantics of the
+ specification.
+- Updated the `MessageInterface::getHeaders()` return annotation to use the
+ value `string[][]`, indicating the format is a nested array of strings.
+- Updated the `@link` annotation for `RequestInterface::withRequestTarget()`
+ to point to the correct section of RFC 7230.
+- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation
+ to add the parameter name (`$uploadedFiles`).
+- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()`
+ method to correctly reference the method parameter (it was referencing an
+ incorrect parameter name previously).
+
+## 1.0.0 - 2016-05-18
+
+Initial stable release; reflects accepted PSR-7 specification.
diff --git a/plugins/af_readability/vendor/psr/http-message/LICENSE b/plugins/af_readability/vendor/psr/http-message/LICENSE
new file mode 100644
index 000000000..c2d8e452d
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/plugins/af_readability/vendor/psr/http-message/README.md b/plugins/af_readability/vendor/psr/http-message/README.md
new file mode 100644
index 000000000..28185338f
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/README.md
@@ -0,0 +1,13 @@
+PSR Http Message
+================
+
+This repository holds all interfaces/classes/traits related to
+[PSR-7](http://www.php-fig.org/psr/psr-7/).
+
+Note that this is not a HTTP message implementation of its own. It is merely an
+interface that describes a HTTP message. See the specification for more details.
+
+Usage
+-----
+
+We'll certainly need some stuff in here. \ No newline at end of file
diff --git a/plugins/af_readability/vendor/psr/http-message/composer.json b/plugins/af_readability/vendor/psr/http-message/composer.json
new file mode 100644
index 000000000..b0d2937a0
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "psr/http-message",
+ "description": "Common interface for HTTP messages",
+ "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"],
+ "homepage": "https://github.com/php-fig/http-message",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/MessageInterface.php b/plugins/af_readability/vendor/psr/http-message/src/MessageInterface.php
new file mode 100644
index 000000000..dd46e5ec8
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/MessageInterface.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * HTTP messages consist of requests from a client to a server and responses
+ * from a server to a client. This interface defines the methods common to
+ * each.
+ *
+ * Messages are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ *
+ * @link http://www.ietf.org/rfc/rfc7230.txt
+ * @link http://www.ietf.org/rfc/rfc7231.txt
+ */
+interface MessageInterface
+{
+ /**
+ * Retrieves the HTTP protocol version as a string.
+ *
+ * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0").
+ *
+ * @return string HTTP protocol version.
+ */
+ public function getProtocolVersion();
+
+ /**
+ * Return an instance with the specified HTTP protocol version.
+ *
+ * The version string MUST contain only the HTTP version number (e.g.,
+ * "1.1", "1.0").
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new protocol version.
+ *
+ * @param string $version HTTP protocol version
+ * @return static
+ */
+ public function withProtocolVersion($version);
+
+ /**
+ * Retrieves all message header values.
+ *
+ * The keys represent the header name as it will be sent over the wire, and
+ * each value is an array of strings associated with the header.
+ *
+ * // Represent the headers as a string
+ * foreach ($message->getHeaders() as $name => $values) {
+ * echo $name . ": " . implode(", ", $values);
+ * }
+ *
+ * // Emit headers iteratively:
+ * foreach ($message->getHeaders() as $name => $values) {
+ * foreach ($values as $value) {
+ * header(sprintf('%s: %s', $name, $value), false);
+ * }
+ * }
+ *
+ * While header names are not case-sensitive, getHeaders() will preserve the
+ * exact case in which headers were originally specified.
+ *
+ * @return string[][] Returns an associative array of the message's headers. Each
+ * key MUST be a header name, and each value MUST be an array of strings
+ * for that header.
+ */
+ public function getHeaders();
+
+ /**
+ * Checks if a header exists by the given case-insensitive name.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return bool Returns true if any header names match the given header
+ * name using a case-insensitive string comparison. Returns false if
+ * no matching header name is found in the message.
+ */
+ public function hasHeader($name);
+
+ /**
+ * Retrieves a message header value by the given case-insensitive name.
+ *
+ * This method returns an array of all the header values of the given
+ * case-insensitive header name.
+ *
+ * If the header does not appear in the message, this method MUST return an
+ * empty array.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string[] An array of string values as provided for the given
+ * header. If the header does not appear in the message, this method MUST
+ * return an empty array.
+ */
+ public function getHeader($name);
+
+ /**
+ * Retrieves a comma-separated string of the values for a single header.
+ *
+ * This method returns all of the header values of the given
+ * case-insensitive header name as a string concatenated together using
+ * a comma.
+ *
+ * NOTE: Not all header values may be appropriately represented using
+ * comma concatenation. For such headers, use getHeader() instead
+ * and supply your own delimiter when concatenating.
+ *
+ * If the header does not appear in the message, this method MUST return
+ * an empty string.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @return string A string of values as provided for the given header
+ * concatenated together using a comma. If the header does not appear in
+ * the message, this method MUST return an empty string.
+ */
+ public function getHeaderLine($name);
+
+ /**
+ * Return an instance with the provided value replacing the specified header.
+ *
+ * While header names are case-insensitive, the casing of the header will
+ * be preserved by this function, and returned from getHeaders().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new and/or updated header and value.
+ *
+ * @param string $name Case-insensitive header field name.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withHeader($name, $value);
+
+ /**
+ * Return an instance with the specified header appended with the given value.
+ *
+ * Existing values for the specified header will be maintained. The new
+ * value(s) will be appended to the existing list. If the header did not
+ * exist previously, it will be added.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new header and/or value.
+ *
+ * @param string $name Case-insensitive header field name to add.
+ * @param string|string[] $value Header value(s).
+ * @return static
+ * @throws \InvalidArgumentException for invalid header names or values.
+ */
+ public function withAddedHeader($name, $value);
+
+ /**
+ * Return an instance without the specified header.
+ *
+ * Header resolution MUST be done without case-sensitivity.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the named header.
+ *
+ * @param string $name Case-insensitive header field name to remove.
+ * @return static
+ */
+ public function withoutHeader($name);
+
+ /**
+ * Gets the body of the message.
+ *
+ * @return StreamInterface Returns the body as a stream.
+ */
+ public function getBody();
+
+ /**
+ * Return an instance with the specified message body.
+ *
+ * The body MUST be a StreamInterface object.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return a new instance that has the
+ * new body stream.
+ *
+ * @param StreamInterface $body Body.
+ * @return static
+ * @throws \InvalidArgumentException When the body is not valid.
+ */
+ public function withBody(StreamInterface $body);
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/RequestInterface.php b/plugins/af_readability/vendor/psr/http-message/src/RequestInterface.php
new file mode 100644
index 000000000..a96d4fd63
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/RequestInterface.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, client-side request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * During construction, implementations MUST attempt to set the Host header from
+ * a provided URI if no Host header is provided.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface RequestInterface extends MessageInterface
+{
+ /**
+ * Retrieves the message's request target.
+ *
+ * Retrieves the message's request-target either as it will appear (for
+ * clients), as it appeared at request (for servers), or as it was
+ * specified for the instance (see withRequestTarget()).
+ *
+ * In most cases, this will be the origin-form of the composed URI,
+ * unless a value was provided to the concrete implementation (see
+ * withRequestTarget() below).
+ *
+ * If no URI is available, and no request-target has been specifically
+ * provided, this method MUST return the string "/".
+ *
+ * @return string
+ */
+ public function getRequestTarget();
+
+ /**
+ * Return an instance with the specific request-target.
+ *
+ * If the request needs a non-origin-form request-target — e.g., for
+ * specifying an absolute-form, authority-form, or asterisk-form —
+ * this method may be used to create an instance with the specified
+ * request-target, verbatim.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * changed request target.
+ *
+ * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various
+ * request-target forms allowed in request messages)
+ * @param mixed $requestTarget
+ * @return static
+ */
+ public function withRequestTarget($requestTarget);
+
+ /**
+ * Retrieves the HTTP method of the request.
+ *
+ * @return string Returns the request method.
+ */
+ public function getMethod();
+
+ /**
+ * Return an instance with the provided HTTP method.
+ *
+ * While HTTP method names are typically all uppercase characters, HTTP
+ * method names are case-sensitive and thus implementations SHOULD NOT
+ * modify the given string.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * changed request method.
+ *
+ * @param string $method Case-sensitive method.
+ * @return static
+ * @throws \InvalidArgumentException for invalid HTTP methods.
+ */
+ public function withMethod($method);
+
+ /**
+ * Retrieves the URI instance.
+ *
+ * This method MUST return a UriInterface instance.
+ *
+ * @link http://tools.ietf.org/html/rfc3986#section-4.3
+ * @return UriInterface Returns a UriInterface instance
+ * representing the URI of the request.
+ */
+ public function getUri();
+
+ /**
+ * Returns an instance with the provided URI.
+ *
+ * This method MUST update the Host header of the returned request by
+ * default if the URI contains a host component. If the URI does not
+ * contain a host component, any pre-existing Host header MUST be carried
+ * over to the returned request.
+ *
+ * You can opt-in to preserving the original state of the Host header by
+ * setting `$preserveHost` to `true`. When `$preserveHost` is set to
+ * `true`, this method interacts with the Host header in the following ways:
+ *
+ * - If the Host header is missing or empty, and the new URI contains
+ * a host component, this method MUST update the Host header in the returned
+ * request.
+ * - If the Host header is missing or empty, and the new URI does not contain a
+ * host component, this method MUST NOT update the Host header in the returned
+ * request.
+ * - If a Host header is present and non-empty, this method MUST NOT update
+ * the Host header in the returned request.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * new UriInterface instance.
+ *
+ * @link http://tools.ietf.org/html/rfc3986#section-4.3
+ * @param UriInterface $uri New request URI to use.
+ * @param bool $preserveHost Preserve the original state of the Host header.
+ * @return static
+ */
+ public function withUri(UriInterface $uri, $preserveHost = false);
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/ResponseInterface.php b/plugins/af_readability/vendor/psr/http-message/src/ResponseInterface.php
new file mode 100644
index 000000000..c306514e6
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/ResponseInterface.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an outgoing, server-side response.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - Status code and reason phrase
+ * - Headers
+ * - Message body
+ *
+ * Responses are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ResponseInterface extends MessageInterface
+{
+ /**
+ * Gets the response status code.
+ *
+ * The status code is a 3-digit integer result code of the server's attempt
+ * to understand and satisfy the request.
+ *
+ * @return int Status code.
+ */
+ public function getStatusCode();
+
+ /**
+ * Return an instance with the specified status code and, optionally, reason phrase.
+ *
+ * If no reason phrase is specified, implementations MAY choose to default
+ * to the RFC 7231 or IANA recommended reason phrase for the response's
+ * status code.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated status and reason phrase.
+ *
+ * @link http://tools.ietf.org/html/rfc7231#section-6
+ * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+ * @param int $code The 3-digit integer result code to set.
+ * @param string $reasonPhrase The reason phrase to use with the
+ * provided status code; if none is provided, implementations MAY
+ * use the defaults as suggested in the HTTP specification.
+ * @return static
+ * @throws \InvalidArgumentException For invalid status code arguments.
+ */
+ public function withStatus($code, $reasonPhrase = '');
+
+ /**
+ * Gets the response reason phrase associated with the status code.
+ *
+ * Because a reason phrase is not a required element in a response
+ * status line, the reason phrase value MAY be null. Implementations MAY
+ * choose to return the default RFC 7231 recommended reason phrase (or those
+ * listed in the IANA HTTP Status Code Registry) for the response's
+ * status code.
+ *
+ * @link http://tools.ietf.org/html/rfc7231#section-6
+ * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+ * @return string Reason phrase; must return an empty string if none present.
+ */
+ public function getReasonPhrase();
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/ServerRequestInterface.php b/plugins/af_readability/vendor/psr/http-message/src/ServerRequestInterface.php
new file mode 100644
index 000000000..02512340a
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/ServerRequestInterface.php
@@ -0,0 +1,261 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Representation of an incoming, server-side HTTP request.
+ *
+ * Per the HTTP specification, this interface includes properties for
+ * each of the following:
+ *
+ * - Protocol version
+ * - HTTP method
+ * - URI
+ * - Headers
+ * - Message body
+ *
+ * Additionally, it encapsulates all data as it has arrived to the
+ * application from the CGI and/or PHP environment, including:
+ *
+ * - The values represented in $_SERVER.
+ * - Any cookies provided (generally via $_COOKIE)
+ * - Query string arguments (generally via $_GET, or as parsed via parse_str())
+ * - Upload files, if any (as represented by $_FILES)
+ * - Deserialized body parameters (generally from $_POST)
+ *
+ * $_SERVER values MUST be treated as immutable, as they represent application
+ * state at the time of request; as such, no methods are provided to allow
+ * modification of those values. The other values provide such methods, as they
+ * can be restored from $_SERVER or the request body, and may need treatment
+ * during the application (e.g., body parameters may be deserialized based on
+ * content type).
+ *
+ * Additionally, this interface recognizes the utility of introspecting a
+ * request to derive and match additional parameters (e.g., via URI path
+ * matching, decrypting cookie values, deserializing non-form-encoded body
+ * content, matching authorization headers to users, etc). These parameters
+ * are stored in an "attributes" property.
+ *
+ * Requests are considered immutable; all methods that might change state MUST
+ * be implemented such that they retain the internal state of the current
+ * message and return an instance that contains the changed state.
+ */
+interface ServerRequestInterface extends RequestInterface
+{
+ /**
+ * Retrieve server parameters.
+ *
+ * Retrieves data related to the incoming request environment,
+ * typically derived from PHP's $_SERVER superglobal. The data IS NOT
+ * REQUIRED to originate from $_SERVER.
+ *
+ * @return array
+ */
+ public function getServerParams();
+
+ /**
+ * Retrieve cookies.
+ *
+ * Retrieves cookies sent by the client to the server.
+ *
+ * The data MUST be compatible with the structure of the $_COOKIE
+ * superglobal.
+ *
+ * @return array
+ */
+ public function getCookieParams();
+
+ /**
+ * Return an instance with the specified cookies.
+ *
+ * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST
+ * be compatible with the structure of $_COOKIE. Typically, this data will
+ * be injected at instantiation.
+ *
+ * This method MUST NOT update the related Cookie header of the request
+ * instance, nor related values in the server params.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated cookie values.
+ *
+ * @param array $cookies Array of key/value pairs representing cookies.
+ * @return static
+ */
+ public function withCookieParams(array $cookies);
+
+ /**
+ * Retrieve query string arguments.
+ *
+ * Retrieves the deserialized query string arguments, if any.
+ *
+ * Note: the query params might not be in sync with the URI or server
+ * params. If you need to ensure you are only getting the original
+ * values, you may need to parse the query string from `getUri()->getQuery()`
+ * or from the `QUERY_STRING` server param.
+ *
+ * @return array
+ */
+ public function getQueryParams();
+
+ /**
+ * Return an instance with the specified query string arguments.
+ *
+ * These values SHOULD remain immutable over the course of the incoming
+ * request. They MAY be injected during instantiation, such as from PHP's
+ * $_GET superglobal, or MAY be derived from some other value such as the
+ * URI. In cases where the arguments are parsed from the URI, the data
+ * MUST be compatible with what PHP's parse_str() would return for
+ * purposes of how duplicate query parameters are handled, and how nested
+ * sets are handled.
+ *
+ * Setting query string arguments MUST NOT change the URI stored by the
+ * request, nor the values in the server params.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated query string arguments.
+ *
+ * @param array $query Array of query string arguments, typically from
+ * $_GET.
+ * @return static
+ */
+ public function withQueryParams(array $query);
+
+ /**
+ * Retrieve normalized file upload data.
+ *
+ * This method returns upload metadata in a normalized tree, with each leaf
+ * an instance of Psr\Http\Message\UploadedFileInterface.
+ *
+ * These values MAY be prepared from $_FILES or the message body during
+ * instantiation, or MAY be injected via withUploadedFiles().
+ *
+ * @return array An array tree of UploadedFileInterface instances; an empty
+ * array MUST be returned if no data is present.
+ */
+ public function getUploadedFiles();
+
+ /**
+ * Create a new instance with the specified uploaded files.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param array $uploadedFiles An array tree of UploadedFileInterface instances.
+ * @return static
+ * @throws \InvalidArgumentException if an invalid structure is provided.
+ */
+ public function withUploadedFiles(array $uploadedFiles);
+
+ /**
+ * Retrieve any parameters provided in the request body.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, this method MUST
+ * return the contents of $_POST.
+ *
+ * Otherwise, this method may return any results of deserializing
+ * the request body content; as parsing returns structured content, the
+ * potential types MUST be arrays or objects only. A null value indicates
+ * the absence of body content.
+ *
+ * @return null|array|object The deserialized body parameters, if any.
+ * These will typically be an array or object.
+ */
+ public function getParsedBody();
+
+ /**
+ * Return an instance with the specified body parameters.
+ *
+ * These MAY be injected during instantiation.
+ *
+ * If the request Content-Type is either application/x-www-form-urlencoded
+ * or multipart/form-data, and the request method is POST, use this method
+ * ONLY to inject the contents of $_POST.
+ *
+ * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of
+ * deserializing the request body content. Deserialization/parsing returns
+ * structured data, and, as such, this method ONLY accepts arrays or objects,
+ * or a null value if nothing was available to parse.
+ *
+ * As an example, if content negotiation determines that the request data
+ * is a JSON payload, this method could be used to create a request
+ * instance with the deserialized parameters.
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated body parameters.
+ *
+ * @param null|array|object $data The deserialized body data. This will
+ * typically be in an array or object.
+ * @return static
+ * @throws \InvalidArgumentException if an unsupported argument type is
+ * provided.
+ */
+ public function withParsedBody($data);
+
+ /**
+ * Retrieve attributes derived from the request.
+ *
+ * The request "attributes" may be used to allow injection of any
+ * parameters derived from the request: e.g., the results of path
+ * match operations; the results of decrypting cookies; the results of
+ * deserializing non-form-encoded message bodies; etc. Attributes
+ * will be application and request specific, and CAN be mutable.
+ *
+ * @return array Attributes derived from the request.
+ */
+ public function getAttributes();
+
+ /**
+ * Retrieve a single derived request attribute.
+ *
+ * Retrieves a single derived request attribute as described in
+ * getAttributes(). If the attribute has not been previously set, returns
+ * the default value as provided.
+ *
+ * This method obviates the need for a hasAttribute() method, as it allows
+ * specifying a default value to return if the attribute is not found.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $default Default value to return if the attribute does not exist.
+ * @return mixed
+ */
+ public function getAttribute($name, $default = null);
+
+ /**
+ * Return an instance with the specified derived request attribute.
+ *
+ * This method allows setting a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that has the
+ * updated attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @param mixed $value The value of the attribute.
+ * @return static
+ */
+ public function withAttribute($name, $value);
+
+ /**
+ * Return an instance that removes the specified derived request attribute.
+ *
+ * This method allows removing a single derived request attribute as
+ * described in getAttributes().
+ *
+ * This method MUST be implemented in such a way as to retain the
+ * immutability of the message, and MUST return an instance that removes
+ * the attribute.
+ *
+ * @see getAttributes()
+ * @param string $name The attribute name.
+ * @return static
+ */
+ public function withoutAttribute($name);
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/StreamInterface.php b/plugins/af_readability/vendor/psr/http-message/src/StreamInterface.php
new file mode 100644
index 000000000..f68f39126
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/StreamInterface.php
@@ -0,0 +1,158 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Describes a data stream.
+ *
+ * Typically, an instance will wrap a PHP stream; this interface provides
+ * a wrapper around the most common operations, including serialization of
+ * the entire stream to a string.
+ */
+interface StreamInterface
+{
+ /**
+ * Reads all data from the stream into a string, from the beginning to end.
+ *
+ * This method MUST attempt to seek to the beginning of the stream before
+ * reading data and read the stream until the end is reached.
+ *
+ * Warning: This could attempt to load a large amount of data into memory.
+ *
+ * This method MUST NOT raise an exception in order to conform with PHP's
+ * string casting operations.
+ *
+ * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
+ * @return string
+ */
+ public function __toString();
+
+ /**
+ * Closes the stream and any underlying resources.
+ *
+ * @return void
+ */
+ public function close();
+
+ /**
+ * Separates any underlying resources from the stream.
+ *
+ * After the stream has been detached, the stream is in an unusable state.
+ *
+ * @return resource|null Underlying PHP stream, if any
+ */
+ public function detach();
+
+ /**
+ * Get the size of the stream if known.
+ *
+ * @return int|null Returns the size in bytes if known, or null if unknown.
+ */
+ public function getSize();
+
+ /**
+ * Returns the current position of the file read/write pointer
+ *
+ * @return int Position of the file pointer
+ * @throws \RuntimeException on error.
+ */
+ public function tell();
+
+ /**
+ * Returns true if the stream is at the end of the stream.
+ *
+ * @return bool
+ */
+ public function eof();
+
+ /**
+ * Returns whether or not the stream is seekable.
+ *
+ * @return bool
+ */
+ public function isSeekable();
+
+ /**
+ * Seek to a position in the stream.
+ *
+ * @link http://www.php.net/manual/en/function.fseek.php
+ * @param int $offset Stream offset
+ * @param int $whence Specifies how the cursor position will be calculated
+ * based on the seek offset. Valid values are identical to the built-in
+ * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to
+ * offset bytes SEEK_CUR: Set position to current location plus offset
+ * SEEK_END: Set position to end-of-stream plus offset.
+ * @throws \RuntimeException on failure.
+ */
+ public function seek($offset, $whence = SEEK_SET);
+
+ /**
+ * Seek to the beginning of the stream.
+ *
+ * If the stream is not seekable, this method will raise an exception;
+ * otherwise, it will perform a seek(0).
+ *
+ * @see seek()
+ * @link http://www.php.net/manual/en/function.fseek.php
+ * @throws \RuntimeException on failure.
+ */
+ public function rewind();
+
+ /**
+ * Returns whether or not the stream is writable.
+ *
+ * @return bool
+ */
+ public function isWritable();
+
+ /**
+ * Write data to the stream.
+ *
+ * @param string $string The string that is to be written.
+ * @return int Returns the number of bytes written to the stream.
+ * @throws \RuntimeException on failure.
+ */
+ public function write($string);
+
+ /**
+ * Returns whether or not the stream is readable.
+ *
+ * @return bool
+ */
+ public function isReadable();
+
+ /**
+ * Read data from the stream.
+ *
+ * @param int $length Read up to $length bytes from the object and return
+ * them. Fewer than $length bytes may be returned if underlying stream
+ * call returns fewer bytes.
+ * @return string Returns the data read from the stream, or an empty string
+ * if no bytes are available.
+ * @throws \RuntimeException if an error occurs.
+ */
+ public function read($length);
+
+ /**
+ * Returns the remaining contents in a string
+ *
+ * @return string
+ * @throws \RuntimeException if unable to read or an error occurs while
+ * reading.
+ */
+ public function getContents();
+
+ /**
+ * Get stream metadata as an associative array or retrieve a specific key.
+ *
+ * The keys returned are identical to the keys returned from PHP's
+ * stream_get_meta_data() function.
+ *
+ * @link http://php.net/manual/en/function.stream-get-meta-data.php
+ * @param string $key Specific metadata to retrieve.
+ * @return array|mixed|null Returns an associative array if no key is
+ * provided. Returns a specific key value if a key is provided and the
+ * value is found, or null if the key is not found.
+ */
+ public function getMetadata($key = null);
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/UploadedFileInterface.php b/plugins/af_readability/vendor/psr/http-message/src/UploadedFileInterface.php
new file mode 100644
index 000000000..f8a6901e0
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/UploadedFileInterface.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a file uploaded through an HTTP request.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ */
+interface UploadedFileInterface
+{
+ /**
+ * Retrieve a stream representing the uploaded file.
+ *
+ * This method MUST return a StreamInterface instance, representing the
+ * uploaded file. The purpose of this method is to allow utilizing native PHP
+ * stream functionality to manipulate the file upload, such as
+ * stream_copy_to_stream() (though the result will need to be decorated in a
+ * native PHP stream wrapper to work with such functions).
+ *
+ * If the moveTo() method has been called previously, this method MUST raise
+ * an exception.
+ *
+ * @return StreamInterface Stream representation of the uploaded file.
+ * @throws \RuntimeException in cases when no stream is available or can be
+ * created.
+ */
+ public function getStream();
+
+ /**
+ * Move the uploaded file to a new location.
+ *
+ * Use this method as an alternative to move_uploaded_file(). This method is
+ * guaranteed to work in both SAPI and non-SAPI environments.
+ * Implementations must determine which environment they are in, and use the
+ * appropriate method (move_uploaded_file(), rename(), or a stream
+ * operation) to perform the operation.
+ *
+ * $targetPath may be an absolute path, or a relative path. If it is a
+ * relative path, resolution should be the same as used by PHP's rename()
+ * function.
+ *
+ * The original file or stream MUST be removed on completion.
+ *
+ * If this method is called more than once, any subsequent calls MUST raise
+ * an exception.
+ *
+ * When used in an SAPI environment where $_FILES is populated, when writing
+ * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be
+ * used to ensure permissions and upload status are verified correctly.
+ *
+ * If you wish to move to a stream, use getStream(), as SAPI operations
+ * cannot guarantee writing to stream destinations.
+ *
+ * @see http://php.net/is_uploaded_file
+ * @see http://php.net/move_uploaded_file
+ * @param string $targetPath Path to which to move the uploaded file.
+ * @throws \InvalidArgumentException if the $targetPath specified is invalid.
+ * @throws \RuntimeException on any error during the move operation, or on
+ * the second or subsequent call to the method.
+ */
+ public function moveTo($targetPath);
+
+ /**
+ * Retrieve the file size.
+ *
+ * Implementations SHOULD return the value stored in the "size" key of
+ * the file in the $_FILES array if available, as PHP calculates this based
+ * on the actual size transmitted.
+ *
+ * @return int|null The file size in bytes or null if unknown.
+ */
+ public function getSize();
+
+ /**
+ * Retrieve the error associated with the uploaded file.
+ *
+ * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.
+ *
+ * If the file was uploaded successfully, this method MUST return
+ * UPLOAD_ERR_OK.
+ *
+ * Implementations SHOULD return the value stored in the "error" key of
+ * the file in the $_FILES array.
+ *
+ * @see http://php.net/manual/en/features.file-upload.errors.php
+ * @return int One of PHP's UPLOAD_ERR_XXX constants.
+ */
+ public function getError();
+
+ /**
+ * Retrieve the filename sent by the client.
+ *
+ * Do not trust the value returned by this method. A client could send
+ * a malicious filename with the intention to corrupt or hack your
+ * application.
+ *
+ * Implementations SHOULD return the value stored in the "name" key of
+ * the file in the $_FILES array.
+ *
+ * @return string|null The filename sent by the client or null if none
+ * was provided.
+ */
+ public function getClientFilename();
+
+ /**
+ * Retrieve the media type sent by the client.
+ *
+ * Do not trust the value returned by this method. A client could send
+ * a malicious media type with the intention to corrupt or hack your
+ * application.
+ *
+ * Implementations SHOULD return the value stored in the "type" key of
+ * the file in the $_FILES array.
+ *
+ * @return string|null The media type sent by the client or null if none
+ * was provided.
+ */
+ public function getClientMediaType();
+}
diff --git a/plugins/af_readability/vendor/psr/http-message/src/UriInterface.php b/plugins/af_readability/vendor/psr/http-message/src/UriInterface.php
new file mode 100644
index 000000000..9d7ab9eae
--- /dev/null
+++ b/plugins/af_readability/vendor/psr/http-message/src/UriInterface.php
@@ -0,0 +1,323 @@
+<?php
+namespace Psr\Http\Message;
+
+/**
+ * Value object representing a URI.
+ *
+ * This interface is meant to represent URIs according to RFC 3986 and to
+ * provide methods for most common operations. Additional functionality for
+ * working with URIs can be provided on top of the interface or externally.
+ * Its primary use is for HTTP requests, but may also be used in other
+ * contexts.
+ *
+ * Instances of this interface are considered immutable; all methods that
+ * might change state MUST be implemented such that they retain the internal
+ * state of the current instance and return an instance that contains the
+ * changed state.
+ *
+ * Typically the Host header will be also be present in the request message.
+ * For server-side requests, the scheme will typically be discoverable in the
+ * server parameters.
+ *
+ * @link http://tools.ietf.org/html/rfc3986 (the URI specification)
+ */
+interface UriInterface
+{
+ /**
+ * Retrieve the scheme component of the URI.
+ *
+ * If no scheme is present, this method MUST return an empty string.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.1.
+ *
+ * The trailing ":" character is not part of the scheme and MUST NOT be
+ * added.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.1
+ * @return string The URI scheme.
+ */
+ public function getScheme();
+
+ /**
+ * Retrieve the authority component of the URI.
+ *
+ * If no authority information is present, this method MUST return an empty
+ * string.
+ *
+ * The authority syntax of the URI is:
+ *
+ * <pre>
+ * [user-info@]host[:port]
+ * </pre>
+ *
+ * If the port component is not set or is the standard port for the current
+ * scheme, it SHOULD NOT be included.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-3.2
+ * @return string The URI authority, in "[user-info@]host[:port]" format.
+ */
+ public function getAuthority();
+
+ /**
+ * Retrieve the user information component of the URI.
+ *
+ * If no user information is present, this method MUST return an empty
+ * string.
+ *
+ * If a user is present in the URI, this will return that value;
+ * additionally, if the password is also present, it will be appended to the
+ * user value, with a colon (":") separating the values.
+ *
+ * The trailing "@" character is not part of the user information and MUST
+ * NOT be added.
+ *
+ * @return string The URI user information, in "username[:password]" format.
+ */
+ public function getUserInfo();
+
+ /**
+ * Retrieve the host component of the URI.
+ *
+ * If no host is present, this method MUST return an empty string.
+ *
+ * The value returned MUST be normalized to lowercase, per RFC 3986
+ * Section 3.2.2.
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-3.2.2
+ * @return string The URI host.
+ */
+ public function getHost();
+
+ /**
+ * Retrieve the port component of the URI.
+ *
+ * If a port is present, and it is non-standard for the current scheme,
+ * this method MUST return it as an integer. If the port is the standard port
+ * used with the current scheme, this method SHOULD return null.
+ *
+ * If no port is present, and no scheme is present, this method MUST return
+ * a null value.
+ *
+ * If no port is present, but a scheme is present, this method MAY return
+ * the standard port for that scheme, but SHOULD return null.
+ *
+ * @return null|int The URI port.
+ */
+ public function getPort();
+
+ /**
+ * Retrieve the path component of the URI.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * Normally, the empty path "" and absolute path "/" are considered equal as
+ * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically
+ * do this normalization because in contexts with a trimmed base path, e.g.
+ * the front controller, this difference becomes significant. It's the task
+ * of the user to handle both "" and "/".
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.3.
+ *
+ * As an example, if the value should include a slash ("/") not intended as
+ * delimiter between path segments, that value MUST be passed in encoded
+ * form (e.g., "%2F") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.3
+ * @return string The URI path.
+ */
+ public function getPath();
+
+ /**
+ * Retrieve the query string of the URI.
+ *
+ * If no query string is present, this method MUST return an empty string.
+ *
+ * The leading "?" character is not part of the query and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.4.
+ *
+ * As an example, if a value in a key/value pair of the query string should
+ * include an ampersand ("&") not intended as a delimiter between values,
+ * that value MUST be passed in encoded form (e.g., "%26") to the instance.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.4
+ * @return string The URI query string.
+ */
+ public function getQuery();
+
+ /**
+ * Retrieve the fragment component of the URI.
+ *
+ * If no fragment is present, this method MUST return an empty string.
+ *
+ * The leading "#" character is not part of the fragment and MUST NOT be
+ * added.
+ *
+ * The value returned MUST be percent-encoded, but MUST NOT double-encode
+ * any characters. To determine what characters to encode, please refer to
+ * RFC 3986, Sections 2 and 3.5.
+ *
+ * @see https://tools.ietf.org/html/rfc3986#section-2
+ * @see https://tools.ietf.org/html/rfc3986#section-3.5
+ * @return string The URI fragment.
+ */
+ public function getFragment();
+
+ /**
+ * Return an instance with the specified scheme.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified scheme.
+ *
+ * Implementations MUST support the schemes "http" and "https" case
+ * insensitively, and MAY accommodate other schemes if required.
+ *
+ * An empty scheme is equivalent to removing the scheme.
+ *
+ * @param string $scheme The scheme to use with the new instance.
+ * @return static A new instance with the specified scheme.
+ * @throws \InvalidArgumentException for invalid or unsupported schemes.
+ */
+ public function withScheme($scheme);
+
+ /**
+ * Return an instance with the specified user information.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified user information.
+ *
+ * Password is optional, but the user information MUST include the
+ * user; an empty string for the user is equivalent to removing user
+ * information.
+ *
+ * @param string $user The user name to use for authority.
+ * @param null|string $password The password associated with $user.
+ * @return static A new instance with the specified user information.
+ */
+ public function withUserInfo($user, $password = null);
+
+ /**
+ * Return an instance with the specified host.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified host.
+ *
+ * An empty host value is equivalent to removing the host.
+ *
+ * @param string $host The hostname to use with the new instance.
+ * @return static A new instance with the specified host.
+ * @throws \InvalidArgumentException for invalid hostnames.
+ */
+ public function withHost($host);
+
+ /**
+ * Return an instance with the specified port.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified port.
+ *
+ * Implementations MUST raise an exception for ports outside the
+ * established TCP and UDP port ranges.
+ *
+ * A null value provided for the port is equivalent to removing the port
+ * information.
+ *
+ * @param null|int $port The port to use with the new instance; a null value
+ * removes the port information.
+ * @return static A new instance with the specified port.
+ * @throws \InvalidArgumentException for invalid ports.
+ */
+ public function withPort($port);
+
+ /**
+ * Return an instance with the specified path.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified path.
+ *
+ * The path can either be empty or absolute (starting with a slash) or
+ * rootless (not starting with a slash). Implementations MUST support all
+ * three syntaxes.
+ *
+ * If the path is intended to be domain-relative rather than path relative then
+ * it must begin with a slash ("/"). Paths not starting with a slash ("/")
+ * are assumed to be relative to some base path known to the application or
+ * consumer.
+ *
+ * Users can provide both encoded and decoded path characters.
+ * Implementations ensure the correct encoding as outlined in getPath().
+ *
+ * @param string $path The path to use with the new instance.
+ * @return static A new instance with the specified path.
+ * @throws \InvalidArgumentException for invalid paths.
+ */
+ public function withPath($path);
+
+ /**
+ * Return an instance with the specified query string.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified query string.
+ *
+ * Users can provide both encoded and decoded query characters.
+ * Implementations ensure the correct encoding as outlined in getQuery().
+ *
+ * An empty query string value is equivalent to removing the query string.
+ *
+ * @param string $query The query string to use with the new instance.
+ * @return static A new instance with the specified query string.
+ * @throws \InvalidArgumentException for invalid query strings.
+ */
+ public function withQuery($query);
+
+ /**
+ * Return an instance with the specified URI fragment.
+ *
+ * This method MUST retain the state of the current instance, and return
+ * an instance that contains the specified URI fragment.
+ *
+ * Users can provide both encoded and decoded fragment characters.
+ * Implementations ensure the correct encoding as outlined in getFragment().
+ *
+ * An empty fragment value is equivalent to removing the fragment.
+ *
+ * @param string $fragment The fragment to use with the new instance.
+ * @return static A new instance with the specified fragment.
+ */
+ public function withFragment($fragment);
+
+ /**
+ * Return the string representation as a URI reference.
+ *
+ * Depending on which components of the URI are present, the resulting
+ * string is either a full URI or relative reference according to RFC 3986,
+ * Section 4.1. The method concatenates the various components of the URI,
+ * using the appropriate delimiters:
+ *
+ * - If a scheme is present, it MUST be suffixed by ":".
+ * - If an authority is present, it MUST be prefixed by "//".
+ * - The path can be concatenated without delimiters. But there are two
+ * cases where the path has to be adjusted to make the URI reference
+ * valid as PHP does not allow to throw an exception in __toString():
+ * - If the path is rootless and an authority is present, the path MUST
+ * be prefixed by "/".
+ * - If the path is starting with more than one "/" and no authority is
+ * present, the starting slashes MUST be reduced to one.
+ * - If a query is present, it MUST be prefixed by "?".
+ * - If a fragment is present, it MUST be prefixed by "#".
+ *
+ * @see http://tools.ietf.org/html/rfc3986#section-4.1
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/plugins/af_redditimgur/init.php b/plugins/af_redditimgur/init.php
index f2a04ce24..898f0b49c 100755
--- a/plugins/af_redditimgur/init.php
+++ b/plugins/af_redditimgur/init.php
@@ -376,11 +376,11 @@ class Af_RedditImgur extends Plugin {
}
if ($post_is_nsfw && count($apply_nsfw_tags) > 0) {
- $article["tags"] = array_merge($article["tags"], $apply_nsfw_tags);
+ array_push($article["tags"], ...$apply_nsfw_tags);
}
if (count($link_flairs) > 0) {
- $article["tags"] = array_merge($article["tags"], FeedItem_Common::normalize_categories($link_flairs));
+ array_push($article["tags"], ...FeedItem_Common::normalize_categories($link_flairs));
}
$article["num_comments"] = $num_comments;
@@ -397,7 +397,7 @@ class Af_RedditImgur extends Plugin {
$entries = $xpath->query('//a[@href]');
foreach ($entries as $entry) {
- $entry_href = $entry->getAttribute("href");
+ $entry_href = UrlHelper::rewrite_relative($article["link"], $entry->getAttribute("href"), "a");
$matches = [];
@@ -653,10 +653,14 @@ class Af_RedditImgur extends Plugin {
/** @var ?DOMElement $content_link */
$content_link = $xpath->query("(//a[contains(., '[link]')])")->item(0);
- if ($this->host->get($this, "enable_content_dupcheck")) {
+ if ($content_link) {
+ $content_href = UrlHelper::rewrite_relative($article["link"], $content_link->getAttribute("href"), "a");
+
+ if ($this->is_blacklisted($content_href))
+ return $article;
+
+ if ($this->host->get($this, "enable_content_dupcheck")) {
- if ($content_link) {
- $content_href = $content_link->getAttribute("href");
$entry_guid = $article["guid_hashed"];
$owner_uid = $article["owner_uid"];
@@ -682,20 +686,16 @@ class Af_RedditImgur extends Plugin {
if ($num_found > 0) $article["force_catchup"] = true;
}
}
- }
-
- if ($content_link && $this->is_blacklisted($content_link->getAttribute("href")))
- return $article;
- $found = $this->inline_stuff($article, $doc, $xpath);
+ $found = $this->inline_stuff($article, $doc, $xpath);
+ $node = $doc->getElementsByTagName('body')->item(0);
- $node = $doc->getElementsByTagName('body')->item(0);
-
- if ($node && $found) {
- $article["content"] = $doc->saveHTML($node);
- $article["enclosures"] = $this->generated_enclosures;
- } else if ($content_link) {
- $article = $this->readability($article, $content_link->getAttribute("href"), $doc, $xpath);
+ if ($node && $found) {
+ $article["content"] = $doc->saveHTML($node);
+ $article["enclosures"] = $this->generated_enclosures;
+ } else {
+ $article = $this->readability($article, $content_href, $doc, $xpath);
+ }
}
}
}
@@ -903,7 +903,7 @@ class Af_RedditImgur extends Plugin {
// do not try to embed posts linking back to other reddit posts
// readability.php requires PHP 5.6
- if ($url && strpos($url, "reddit.com") === false && version_compare(PHP_VERSION, '5.6.0', '>=')) {
+ if ($url && strpos($url, "reddit.com") === false) {
/* link may lead to a huge video file or whatever, we need to check content type before trying to
parse it which p much requires curl */
@@ -936,11 +936,12 @@ class Af_RedditImgur extends Plugin {
private function is_blacklisted(string $src, array $also_blacklist = []) : bool {
$src_domain = parse_url($src, PHP_URL_HOST);
- foreach (array_merge($this->domain_blacklist, $also_blacklist) as $domain) {
- if (strstr($src_domain, $domain) !== false) {
- return true;
+ if ($src_domain)
+ foreach ([...$this->domain_blacklist, ...$also_blacklist] as $domain) {
+ if (strstr($src_domain, $domain) !== false) {
+ return true;
+ }
}
- }
return false;
}
diff --git a/plugins/auth_internal/init.php b/plugins/auth_internal/init.php
index 688a0f5d8..882b5506a 100644
--- a/plugins/auth_internal/init.php
+++ b/plugins/auth_internal/init.php
@@ -18,14 +18,14 @@ class Auth_Internal extends Auth_Base {
$otp = (int) ($_REQUEST["otp"] ?? 0);
// don't bother with null/null logins for auth_external etc
- if ($login && get_schema_version() > 96) {
+ if ($login && Config::get_schema_version() > 96) {
$user_id = UserHelper::find_user_by_login($login);
if ($user_id && UserHelper::is_otp_enabled($user_id)) {
// only allow app passwords for service logins if OTP is enabled
- if ($service && get_schema_version() > 138) {
+ if ($service && Config::get_schema_version() > 138) {
return $this->check_app_password($login, $password, $service);
}
@@ -106,7 +106,7 @@ class Auth_Internal extends Auth_Base {
// service logins: check app passwords first but allow regular password
// as a fallback if OTP is not enabled
- if ($service && get_schema_version() > 138) {
+ if ($service && Config::get_schema_version() > 138) {
$user_id = $this->check_app_password($login, $password, $service);
if ($user_id)
@@ -119,7 +119,7 @@ class Auth_Internal extends Auth_Base {
->find_one();
if ($user) {
- if (get_schema_version() >= 145) {
+ if (Config::get_schema_version() >= 145) {
if ($user->last_auth_attempt) {
$last_auth_attempt = strtotime($user->last_auth_attempt);
@@ -145,7 +145,7 @@ class Auth_Internal extends Auth_Base {
if ($auth_result) {
return $auth_result;
} else {
- if (get_schema_version() >= 145) {
+ if (Config::get_schema_version() >= 145) {
$user->last_auth_attempt = Db::NOW();
$user->save();
}
@@ -176,7 +176,7 @@ class Auth_Internal extends Auth_Base {
list ($pwd_algo, $raw_hash) = explode(":", $pwd_hash, 2);
// check app password only if service is specified
- if ($service && get_schema_version() > 138) {
+ if ($service && Config::get_schema_version() > 138) {
return $this->check_app_password($login, $password, $service);
}
diff --git a/plugins/auth_remote/init.php b/plugins/auth_remote/init.php
index 3203d41fe..2fb45fdef 100644
--- a/plugins/auth_remote/init.php
+++ b/plugins/auth_remote/init.php
@@ -45,7 +45,7 @@ class Auth_Remote extends Auth_Base {
foreach (["REMOTE_USER", "HTTP_REMOTE_USER", "REDIRECT_REMOTE_USER", "PHP_AUTH_USER"] as $hdr) {
if (!empty($_SERVER[$hdr])) {
- $try_login = $_SERVER[$hdr];
+ $try_login = strtolower($_SERVER[$hdr]);
break;
}
}
diff --git a/plugins/cache_starred_images/init.php b/plugins/cache_starred_images/init.php
index feec81d62..eed5264c6 100755
--- a/plugins/cache_starred_images/init.php
+++ b/plugins/cache_starred_images/init.php
@@ -84,10 +84,10 @@ class Cache_Starred_Images extends Plugin {
Debug::log("expiring {$this->cache->get_dir()} and {$this->cache_status->get_dir()}...");
- $files = array_merge(
- glob($this->cache->get_dir() . "/*-*"),
- glob($this->cache_status->get_dir() . "/*.status")
- );
+ $files = [
+ ...(glob($this->cache->get_dir() . "/*-*") ?: []),
+ ...(glob($this->cache_status->get_dir() . "/*.status") ?: []),
+ ];
asort($files);
diff --git a/prefs.php b/prefs.php
index 84d89f914..36641e0f3 100644
--- a/prefs.php
+++ b/prefs.php
@@ -1,4 +1,11 @@
<?php
+ // we need a separate check here because functions.php might get parsed
+ // incorrectly before 5.3 because of :: syntax.
+ if (version_compare(PHP_VERSION, '7.4.0', '<')) {
+ print "<b>Fatal Error</b>: PHP version 7.4.0 or newer required. You're using " . PHP_VERSION . ".\n";
+ exit;
+ }
+
set_include_path(__DIR__ ."/include" . PATH_SEPARATOR .
get_include_path());
diff --git a/sql/mysql/migrations/147.sql b/sql/mysql/migrations/147.sql
new file mode 100644
index 000000000..93b754f6b
--- /dev/null
+++ b/sql/mysql/migrations/147.sql
@@ -0,0 +1,2 @@
+create fulltext index ttrss_entries_title_search_idx on ttrss_entries(title);
+create fulltext index ttrss_entries_combined_search_idx on ttrss_entries(title, content);
diff --git a/sql/mysql/schema.sql b/sql/mysql/schema.sql
index 589d1013a..ffabab669 100644
--- a/sql/mysql/schema.sql
+++ b/sql/mysql/schema.sql
@@ -169,6 +169,9 @@ create table ttrss_entries (id integer not null primary key auto_increment,
create index ttrss_entries_date_entered_index on ttrss_entries(date_entered);
create index ttrss_entries_updated_idx on ttrss_entries(updated);
+create fulltext index ttrss_entries_title_search_idx on ttrss_entries(title);
+create fulltext index ttrss_entries_combined_search_idx on ttrss_entries(title, content);
+
create table ttrss_user_entries (
int_id integer not null primary key auto_increment,
ref_id integer not null,
diff --git a/sql/pgsql/migrations/147.sql b/sql/pgsql/migrations/147.sql
new file mode 100644
index 000000000..00ce22962
--- /dev/null
+++ b/sql/pgsql/migrations/147.sql
@@ -0,0 +1,4 @@
+-- no-op, 147 is mysql-specific.
+-- the following dummy query is added because migration engine doesn't support empty schema files.
+
+select true;
diff --git a/themes/compact.css b/themes/compact.css
index 76a532b15..c58d4c419 100644
--- a/themes/compact.css
+++ b/themes/compact.css
@@ -57,6 +57,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -70,6 +71,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1339,6 +1341,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #ddd;
diff --git a/themes/compact_night.css b/themes/compact_night.css
index 16097ec6e..761294d86 100644
--- a/themes/compact_night.css
+++ b/themes/compact_night.css
@@ -57,6 +57,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -70,6 +71,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1339,6 +1341,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #222;
diff --git a/themes/light-high-contrast.css b/themes/light-high-contrast.css
index 8f4729176..12fcb877d 100644
--- a/themes/light-high-contrast.css
+++ b/themes/light-high-contrast.css
@@ -57,6 +57,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -70,6 +71,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1339,6 +1341,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #ddd;
diff --git a/themes/light.css b/themes/light.css
index bfd221eef..82a84c604 100644
--- a/themes/light.css
+++ b/themes/light.css
@@ -57,6 +57,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -70,6 +71,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1339,6 +1341,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #ddd;
diff --git a/themes/light/cdm.less b/themes/light/cdm.less
index 6bb3378c1..05ba3c99a 100644
--- a/themes/light/cdm.less
+++ b/themes/light/cdm.less
@@ -143,6 +143,7 @@
.titleWrap {
white-space : normal;
+ word-break : break-all;
}
.footer {
diff --git a/themes/light/tt-rss.less b/themes/light/tt-rss.less
index 6a1f45d28..1f1242f6b 100644
--- a/themes/light/tt-rss.less
+++ b/themes/light/tt-rss.less
@@ -39,6 +39,7 @@ body.ttrss_main {
.date {
white-space : nowrap;
+ margin-left : 4px;
}
img, i.material-icons {
@@ -53,6 +54,7 @@ body.ttrss_main {
font-weight : 600;
text-rendering: optimizelegibility;
font-family : @fonts-ui;
+ word-break : break-all;
}
}
diff --git a/themes/night.css b/themes/night.css
index 18c370ee4..0bb02e2eb 100644
--- a/themes/night.css
+++ b/themes/night.css
@@ -58,6 +58,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -71,6 +72,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1340,6 +1342,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #222;
diff --git a/themes/night_blue.css b/themes/night_blue.css
index 22ba4fd17..5f9f6b0e6 100644
--- a/themes/night_blue.css
+++ b/themes/night_blue.css
@@ -58,6 +58,7 @@ body.ttrss_main .post .header .comments {
}
body.ttrss_main .post .header .date {
white-space: nowrap;
+ margin-left: 4px;
}
body.ttrss_main .post .header img,
body.ttrss_main .post .header i.material-icons {
@@ -71,6 +72,7 @@ body.ttrss_main .post .header .title {
font-weight: 600;
text-rendering: optimizelegibility;
font-family: system-ui, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ word-break: break-all;
}
body.ttrss_main .post div.content {
padding: 10px;
@@ -1340,6 +1342,7 @@ body.ttrss_utility hr {
}
.cdm.expanded .titleWrap {
white-space: normal;
+ word-break: break-all;
}
.cdm.expanded .footer {
border: 0px solid #222;
diff --git a/update.php b/update.php
index f33458c2e..5e31c805b 100755
--- a/update.php
+++ b/update.php
@@ -99,8 +99,13 @@
"opml-export:" => ["USER:FILE", "export OPML of USER to FILE"],
"opml-import:" => ["USER:FILE", "import OPML for USER from FILE"],
"user-list" => "list all users",
-# "user-add:" => ["USER[:PASSWORD]", "add USER, optionally without prompting for PASSWORD"],
-# "user-remove:" => ["USERNAME", "remove specified user"],
+ "user-add:" => ["USER[:PASSWORD[:ACCESS_LEVEL=0]]", "add USER, prompts for password if unset"],
+ "user-remove:" => ["USERNAME", "remove USER"],
+ "user-check-password:" => ["USER:PASSWORD", "returns 0 if user has specified PASSWORD"],
+ "user-set-password:" => ["USER:PASSWORD", "sets PASSWORD of specified USER"],
+ "user-set-access-level:" => ["USER:LEVEL", "sets access LEVEL of specified USER"],
+ "user-exists:" => ["USER", "returns 0 if specified USER exists in the database"],
+ "force-yes" => "assume 'yes' to all queries",
"help" => "",
];
@@ -136,7 +141,7 @@
printf(" %s %s\n", str_pad($option, $max_key_len + 5), $help_text);
}
- return;
+ exit(0);
}
if (!isset($options['daemon'])) {
@@ -150,7 +155,7 @@
Debug::set_enabled(true);
if (isset($options["log-level"])) {
- Debug::set_loglevel((int)$options["log-level"]);
+ Debug::set_loglevel(Debug::map_loglevel((int)$options["log-level"]));
}
if (isset($options["log"])) {
@@ -159,7 +164,7 @@
Debug::log("Logging to " . $options["log"]);
} else {
if (isset($options['quiet'])) {
- Debug::set_loglevel(Debug::$LOG_DISABLED);
+ Debug::set_loglevel(Debug::LOG_DISABLED);
}
}
@@ -177,7 +182,6 @@
if (isset($options["pidlock"])) {
$my_pid = $options["pidlock"];
$lock_filename = "update_daemon-$my_pid.lock";
-
}
Debug::log("Lock: $lock_filename");
@@ -247,6 +251,7 @@
if (isset($options["daemon-loop"])) {
if (!make_stampfile('update_daemon.stamp')) {
Debug::log("warning: unable to create stampfile\n");
+ exit(1);
}
RSSUtils::update_daemon_common(isset($options["pidlock"]) ? 50 : Config::get(Config::DAEMON_FEED_LIMIT), $options);
@@ -265,21 +270,23 @@
if (isset($options["update-schema"])) {
if (Config::is_migration_needed()) {
- if ($options["update-schema"] != "force-yes") {
+ if (!isset($options['force-yes']) && $options["update-schema"] != "force-yes") {
Debug::log("Type 'yes' to continue.");
if (read_stdin() != 'yes')
- exit;
+ exit(1);
} else {
Debug::log("Proceeding to update without confirmation.");
}
if (!isset($options["log-level"])) {
- Debug::set_loglevel(Debug::$LOG_VERBOSE);
+ Debug::set_loglevel(Debug::LOG_VERBOSE);
}
$migrations = Config::get_migrations();
- $migrations->migrate();
+ $rc = $migrations->migrate();
+
+ exit($rc ? 0 : 1);
} else {
Debug::log("Database schema is already at latest version.");
@@ -343,7 +350,6 @@
}
echo "Plugins marked by * are currently enabled for all users.\n";
-
}
if (isset($options["debug-feed"])) {
@@ -352,11 +358,11 @@
if (isset($options["force-refetch"])) $_REQUEST["force_refetch"] = true;
if (isset($options["force-rehash"])) $_REQUEST["force_rehash"] = true;
- Debug::set_loglevel(Debug::$LOG_EXTENDED);
+ Debug::set_loglevel(Debug::LOG_EXTENDED);
- $rc = RSSUtils::update_rss_feed($feed) != false ? 0 : 1;
+ $rc = RSSUtils::update_rss_feed($feed);
- exit($rc);
+ exit($rc ? 0 : 1);
}
if (isset($options["send-digests"])) {
@@ -385,8 +391,10 @@
$rc = $opml->opml_export($filename, $owner_uid, false, true, true);
Debug::log($rc ? "Success." : "Failed.");
+ exit($rc ? 0 : 1);
} else {
Debug::log("User not found: $user");
+ exit(1);
}
}
@@ -401,10 +409,146 @@
$rc = $opml->opml_import($owner_uid, $filename);
Debug::log($rc ? "Success." : "Failed.");
+ exit($rc ? 0 : 1);
} else {
Debug::log("User not found: $user");
+ exit(1);
+ }
+
+ }
+
+ if (isset($options["user-add"])) {
+ list ($login, $password, $access_level) = explode(":", $options["user-add"], 3);
+
+ $uid = UserHelper::find_user_by_login($login);
+
+ if ($uid) {
+ Debug::log("Error: User already exists: $login");
+ exit(1);
+ }
+
+ if (!$access_level)
+ $access_level = UserHelper::ACCESS_LEVEL_USER;
+
+ if (!in_array($access_level, UserHelper::ACCESS_LEVELS)) {
+ Debug::log("Error: Invalid access level value: $access_level");
+ exit(1);
+ }
+
+ if (!$password) {
+ Debug::log("Please enter password for user $login: ");
+ $password = read_stdin();
+
+ if (!$password) {
+ Debug::log("Error: password may not be blank.");
+ exit(1);
+ }
}
+ Debug::log("Adding user $login with access level $access_level...");
+
+ if (UserHelper::user_add($login, $password, $access_level)) {
+ Debug::log("Success.");
+ } else {
+ Debug::log("Operation failed, check the logs for more information.");
+ exit(1);
+ }
+ }
+
+ if (isset($options["user-set-password"])) {
+ list ($login, $password) = explode(":", $options["user-set-password"], 2);
+
+ $uid = UserHelper::find_user_by_login($login);
+
+ if (!$uid) {
+ Debug::log("Error: User not found: $login");
+ exit(1);
+ }
+
+ Debug::log("Changing password of user $login...");
+
+ if (UserHelper::user_modify($uid, $password)) {
+ Debug::log("Success.");
+ } else {
+ Debug::log("Operation failed, check the logs for more information.");
+ exit(1);
+ }
+ }
+
+ if (isset($options["user-set-access-level"])) {
+ list ($login, $access_level) = explode(":", $options["user-set-access-level"], 2);
+
+ $uid = UserHelper::find_user_by_login($login);
+
+ if (!$uid) {
+ Debug::log("Error: User not found: $login");
+ exit(1);
+ }
+
+ if (!in_array($access_level, UserHelper::ACCESS_LEVELS)) {
+ Debug::log("Error: Invalid access level value: $access_level");
+ exit(1);
+ }
+
+ Debug::log("Changing access level of user $login...");
+
+ if (UserHelper::user_modify($uid, '', UserHelper::map_access_level((int)$access_level))) {
+ Debug::log("Success.");
+ } else {
+ Debug::log("Operation failed, check the logs for more information.");
+ exit(1);
+ }
+ }
+
+ if (isset($options["user-remove"])) {
+ $login = $options["user-remove"];
+
+ $uid = UserHelper::find_user_by_login($login);
+
+ if (!$uid) {
+ Debug::log("Error: User not found: $login");
+ exit(1);
+ }
+
+ if (!isset($options['force-yes'])) {
+ Debug::log("About to remove user $login. Type 'yes' to continue.");
+
+ if (read_stdin() != 'yes')
+ exit(1);
+ }
+
+ Debug::log("Removing user $login...");
+
+ if (UserHelper::user_delete($uid)) {
+ Debug::log("Success.");
+ } else {
+ Debug::log("Operation failed, check the logs for more information.");
+ exit(1);
+ }
+ }
+
+ if (isset($options["user-exists"])) {
+ $login = $options["user-exists"];
+
+ if (UserHelper::find_user_by_login($login))
+ exit(0);
+ else
+ exit(1);
+ }
+
+ if (isset($options["user-check-password"])) {
+ list ($login, $password) = explode(":", $options["user-check-password"], 2);
+
+ $uid = UserHelper::find_user_by_login($login);
+
+ if (!$uid) {
+ Debug::log("Error: User not found: $login");
+ exit(1);
+ }
+
+ $rc = UserHelper::user_has_password($uid, $password);
+
+ exit($rc ? 0 : 1);
}
PluginHost::getInstance()->run_commands($options);
diff --git a/update_daemon2.php b/update_daemon2.php
index eea790c8b..72c13c874 100755
--- a/update_daemon2.php
+++ b/update_daemon2.php
@@ -146,7 +146,7 @@
Debug::set_enabled(true);
if (isset($options["log-level"])) {
- Debug::set_loglevel((int)$options["log-level"]);
+ Debug::set_loglevel(Debug::map_loglevel((int)$options["log-level"]));
}
if (isset($options["log"])) {
@@ -155,7 +155,7 @@
Debug::log("Logging to " . $options["log"]);
} else {
if (isset($options['quiet'])) {
- Debug::set_loglevel(Debug::$LOG_DISABLED);
+ Debug::set_loglevel(Debug::LOG_DISABLED);
}
}
diff --git a/utils/phpstan-watcher.sh b/utils/phpstan-watcher.sh
new file mode 100644
index 000000000..d1acc906f
--- /dev/null
+++ b/utils/phpstan-watcher.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+PHP_VERSION="$1"
+
+[ -z "$PHP_VERSION" ] && PHP_VERSION=8.1
+
+echo PHP_VERSION: ${PHP_VERSION}
+echo PWD: $(pwd)
+
+while true; do
+ inotifywait . -e close_write -r -t 300 | grep -q .php && \
+ (
+ docker run --rm -v $(pwd):/app -v /tmp/phpstan-8.1:/tmp/phpstan \
+ --workdir /app php:${PHP_VERSION}-cli php -d memory_limit=-1 ./vendor/bin/phpstan --memory-limit=2G --error-format=raw
+ echo All done, RC=$?.
+ )
+ sleep 1
+done
diff --git a/vendor/beberlei/assert/.github/workflows/ci.yml b/vendor/beberlei/assert/.github/workflows/ci.yml
new file mode 100644
index 000000000..7003ff495
--- /dev/null
+++ b/vendor/beberlei/assert/.github/workflows/ci.yml
@@ -0,0 +1,64 @@
+on: [push, pull_request]
+name: CI
+jobs:
+ tests:
+ name: Tests
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ php-versions: ['7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v1
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ tools: "cs2pr"
+
+ - name: "Cache dependencies installed with composer"
+ uses: "actions/cache@v1"
+ with:
+ path: "~/.composer/cache"
+ key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}"
+ restore-keys: "php-${{ matrix.php-version }}-composer-locked-"
+
+ - name: "Composer"
+ run: "composer update --prefer-stable"
+
+ - name: "PHPUnit"
+ run: "php vendor/bin/phpunit"
+
+# lint:
+# name: Lint
+# runs-on: ubuntu-latest
+
+# steps:
+# - name: Checkout
+# uses: actions/checkout@v1
+
+# - name: Setup PHP
+# uses: shivammathur/setup-php@v2
+# with:
+# php-version: 7.4
+
+# - name: "Cache dependencies installed with composer"
+# uses: "actions/cache@v1"
+# with:
+# path: "~/.composer/cache"
+# key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}"
+# restore-keys: "php-${{ matrix.php-version }}-composer-locked-"
+
+# - name: "Composer"
+# run: "composer update --prefer-stable"
+
+# - name: "assert:cs-lint"
+# run: "composer assert:cs-lint"
+
+# - name: "assert:sa-code"
+# run: "composer assert:sa-code"
+
+# - name: "assert:sa-tests"
+# run: "composer assert:sa-tests"
diff --git a/vendor/beberlei/assert/composer.json b/vendor/beberlei/assert/composer.json
index 3dd5e7451..1485a0084 100644
--- a/vendor/beberlei/assert/composer.json
+++ b/vendor/beberlei/assert/composer.json
@@ -23,12 +23,17 @@
"sort-packages": true
},
"require": {
- "php": "^7"
+ "php": "^7.0 || ^8.0",
+ "ext-simplexml": "*",
+ "ext-mbstring": "*",
+ "ext-ctype": "*",
+ "ext-json": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "*",
- "phpstan/phpstan-shim": "*",
- "phpunit/phpunit": ">=6.0.0 <8"
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
},
"autoload": {
"psr-4": {
@@ -52,5 +57,8 @@
"assert:cs-fix": "php-cs-fixer fix . -vvv || true",
"assert:sa-code": "vendor/bin/phpstan analyse --configuration=phpstan-code.neon --no-progress --ansi -l 7 bin lib",
"assert:sa-tests": "vendor/bin/phpstan analyse --configuration=phpstan-tests.neon --no-progress --ansi -l 7 tests"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
}
}
diff --git a/vendor/beberlei/assert/lib/Assert/Assert.php b/vendor/beberlei/assert/lib/Assert/Assert.php
index 39bd9d64d..3614b3455 100644
--- a/vendor/beberlei/assert/lib/Assert/Assert.php
+++ b/vendor/beberlei/assert/lib/Assert/Assert.php
@@ -31,6 +31,9 @@ abstract class Assert
* The invocation of this method starts an assertion chain
* that is happening on the passed value.
*
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ *
* @example
*
* Assert::that($value)->notEmpty()->integer();
@@ -38,14 +41,8 @@ abstract class Assert
*
* The assertion chain can be stateful, that means be careful when you reuse
* it. You should never pass around the chain.
- *
- * @param mixed $value
- * @param string $defaultMessage
- * @param string $defaultPropertyPath
- *
- * @return \Assert\AssertionChain
*/
- public static function that($value, $defaultMessage = null, $defaultPropertyPath = null)
+ public static function that($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
$assertionChain = new AssertionChain($value, $defaultMessage, $defaultPropertyPath);
@@ -55,13 +52,10 @@ abstract class Assert
/**
* Start validation on a set of values, returns {@link AssertionChain}.
*
- * @param mixed $values
- * @param string $defaultMessage
- * @param string $defaultPropertyPath
- *
- * @return \Assert\AssertionChain
+ * @param mixed $values
+ * @param string|callable|null $defaultMessage
*/
- public static function thatAll($values, $defaultMessage = null, $defaultPropertyPath = null)
+ public static function thatAll($values, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
return static::that($values, $defaultMessage, $defaultPropertyPath)->all();
}
@@ -69,29 +63,23 @@ abstract class Assert
/**
* Start validation and allow NULL, returns {@link AssertionChain}.
*
- * @param mixed $value
- * @param string $defaultMessage
- * @param string $defaultPropertyPath
- *
- * @return \Assert\AssertionChain
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
*/
- public static function thatNullOr($value, $defaultMessage = null, $defaultPropertyPath = null)
+ public static function thatNullOr($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
return static::that($value, $defaultMessage, $defaultPropertyPath)->nullOr();
}
/**
* Create a lazy assertion object.
- *
- * @return \Assert\LazyAssertion
*/
- public static function lazy()
+ public static function lazy(): LazyAssertion
{
$lazyAssertion = new LazyAssertion();
return $lazyAssertion
->setAssertClass(\get_called_class())
- ->setExceptionClass(static::$lazyAssertionExceptionClass)
- ;
+ ->setExceptionClass(static::$lazyAssertionExceptionClass);
}
}
diff --git a/vendor/beberlei/assert/lib/Assert/Assertion.php b/vendor/beberlei/assert/lib/Assert/Assertion.php
index 0b06b065c..243e64d28 100644
--- a/vendor/beberlei/assert/lib/Assert/Assertion.php
+++ b/vendor/beberlei/assert/lib/Assert/Assertion.php
@@ -14,112 +14,122 @@
namespace Assert;
+use ArrayAccess;
use BadMethodCallException;
+use Countable;
+use DateTime;
+use ReflectionClass;
+use ReflectionException;
+use ResourceBundle;
+use SimpleXMLElement;
+use Throwable;
+use Traversable;
/**
* Assert library.
*
* @author Benjamin Eberlei <[email protected]>
*
- * @method static bool allAlnum(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric for all values.
- * @method static bool allBase64(string $value, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
- * @method static bool allBetween(mixed $value, mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit for all values.
- * @method static bool allBetweenExclusive(mixed $value, mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit for all values.
- * @method static bool allBetweenLength(mixed $value, int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths for all values.
- * @method static bool allBoolean(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is php boolean for all values.
- * @method static bool allChoice(mixed $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices for all values.
- * @method static bool allChoicesNotEmpty(array $values, array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content for all values.
- * @method static bool allClassExists(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the class exists for all values.
- * @method static bool allContains(mixed $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars for all values.
- * @method static bool allCount(array|\Countable|\ResourceBundle|\SimpleXMLElement $countable, int $count, string $message = null, string $propertyPath = null) Assert that the count of countable is equal to count for all values.
- * @method static bool allDate(string $value, string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format for all values.
- * @method static bool allDefined(mixed $constant, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
- * @method static bool allDigit(mixed $value, string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit for all values.
- * @method static bool allDirectory(string $value, string|callable $message = null, string $propertyPath = null) Assert that a directory exists for all values.
- * @method static bool allE164(string $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number for all values.
- * @method static bool allEmail(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL) for all values.
- * @method static bool allEndsWith(mixed $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars for all values.
- * @method static bool allEq(mixed $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==) for all values.
- * @method static bool allEqArraySubset(mixed $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset for all values.
- * @method static bool allExtensionLoaded(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded for all values.
- * @method static bool allExtensionVersion(string $extension, string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed for all values.
- * @method static bool allFalse(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False for all values.
- * @method static bool allFile(string $value, string|callable $message = null, string $propertyPath = null) Assert that a file exists for all values.
- * @method static bool allFloat(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php float for all values.
- * @method static bool allGreaterOrEqualThan(mixed $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit for all values.
- * @method static bool allGreaterThan(mixed $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit for all values.
- * @method static bool allImplementsInterface(mixed $class, string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface for all values.
- * @method static bool allInArray(mixed $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice() for all values.
- * @method static bool allInteger(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer for all values.
- * @method static bool allIntegerish(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish for all values.
- * @method static bool allInterfaceExists(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the interface exists for all values.
- * @method static bool allIp(string $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address for all values.
- * @method static bool allIpv4(string $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address for all values.
- * @method static bool allIpv6(string $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address for all values.
- * @method static bool allIsArray(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array for all values.
- * @method static bool allIsArrayAccessible(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object for all values.
- * @method static bool allIsCallable(mixed $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable for all values.
- * @method static bool allIsCountable(array|\Countable|\ResourceBundle|\SimpleXMLElement $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable for all values.
- * @method static bool allIsInstanceOf(mixed $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name for all values.
- * @method static bool allIsJsonString(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string for all values.
- * @method static bool allIsObject(mixed $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object for all values.
- * @method static bool allIsResource(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a resource for all values.
- * @method static bool allIsTraversable(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object for all values.
- * @method static bool allKeyExists(mixed $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array for all values.
- * @method static bool allKeyIsset(mixed $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset() for all values.
- * @method static bool allKeyNotExists(mixed $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array for all values.
- * @method static bool allLength(mixed $value, int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length for all values.
- * @method static bool allLessOrEqualThan(mixed $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit for all values.
- * @method static bool allLessThan(mixed $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit for all values.
- * @method static bool allMax(mixed $value, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit for all values.
- * @method static bool allMaxCount(array|\Countable|\ResourceBundle|\SimpleXMLElement $countable, int $count, string $message = null, string $propertyPath = null) Assert that the countable have at most $count elements for all values.
- * @method static bool allMaxLength(mixed $value, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars for all values.
- * @method static bool allMethodExists(string $value, mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object for all values.
- * @method static bool allMin(mixed $value, mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit for all values.
- * @method static bool allMinCount(array|\Countable|\ResourceBundle|\SimpleXMLElement $countable, int $count, string $message = null, string $propertyPath = null) Assert that the countable have at least $count elements for all values.
- * @method static bool allMinLength(mixed $value, int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long for all values.
- * @method static bool allNoContent(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is empty for all values.
- * @method static bool allNotBlank(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is not blank for all values.
- * @method static bool allNotContains(mixed $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars for all values.
- * @method static bool allNotEmpty(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is not empty for all values.
- * @method static bool allNotEmptyKey(mixed $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty for all values.
- * @method static bool allNotEq(mixed $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using == ) for all values.
- * @method static bool allNotInArray(mixed $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices for all values.
- * @method static bool allNotIsInstanceOf(mixed $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name for all values.
- * @method static bool allNotNull(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is not null for all values.
- * @method static bool allNotRegex(mixed $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex for all values.
- * @method static bool allNotSame(mixed $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using === ) for all values.
- * @method static bool allNull(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is null for all values.
- * @method static bool allNumeric(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is numeric for all values.
- * @method static bool allObjectOrClass(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists for all values.
- * @method static bool allPhpVersion(string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version for all values.
- * @method static bool allPropertiesExist(mixed $value, array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist for all values.
- * @method static bool allPropertyExists(mixed $value, string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists for all values.
- * @method static bool allRange(mixed $value, mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers for all values.
- * @method static bool allReadable(string $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something readable for all values.
- * @method static bool allRegex(mixed $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex for all values.
- * @method static bool allSame(mixed $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===) for all values.
- * @method static bool allSatisfy(mixed $value, callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback for all values.
- * @method static bool allScalar(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar for all values.
- * @method static bool allStartsWith(mixed $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars for all values.
- * @method static bool allString(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is a string for all values.
- * @method static bool allSubclassOf(mixed $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name for all values.
- * @method static bool allTrue(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True for all values.
- * @method static bool allUrl(mixed $value, string|callable $message = null, string $propertyPath = null) Assert that value is an URL for all values.
- * @method static bool allUuid(string $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID for all values.
- * @method static bool allVersion(string $version1, string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions for all values.
- * @method static bool allWriteable(string $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable for all values.
+ * @method static bool allAlnum(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric for all values.
+ * @method static bool allBase64(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
+ * @method static bool allBetween(mixed[] $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit for all values.
+ * @method static bool allBetweenExclusive(mixed[] $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit for all values.
+ * @method static bool allBetweenLength(mixed[] $value, int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths for all values.
+ * @method static bool allBoolean(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is php boolean for all values.
+ * @method static bool allChoice(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices for all values.
+ * @method static bool allChoicesNotEmpty(array[] $values, array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content for all values.
+ * @method static bool allClassExists(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the class exists for all values.
+ * @method static bool allContains(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars for all values.
+ * @method static bool allCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count for all values.
+ * @method static bool allDate(string[] $value, string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format for all values.
+ * @method static bool allDefined(mixed[] $constant, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined for all values.
+ * @method static bool allDigit(mixed[] $value, string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit for all values.
+ * @method static bool allDirectory(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a directory exists for all values.
+ * @method static bool allE164(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number for all values.
+ * @method static bool allEmail(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL) for all values.
+ * @method static bool allEndsWith(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars for all values.
+ * @method static bool allEq(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==) for all values.
+ * @method static bool allEqArraySubset(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset for all values.
+ * @method static bool allExtensionLoaded(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded for all values.
+ * @method static bool allExtensionVersion(string[] $extension, string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed for all values.
+ * @method static bool allFalse(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False for all values.
+ * @method static bool allFile(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that a file exists for all values.
+ * @method static bool allFloat(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php float for all values.
+ * @method static bool allGreaterOrEqualThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit for all values.
+ * @method static bool allGreaterThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit for all values.
+ * @method static bool allImplementsInterface(mixed[] $class, string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface for all values.
+ * @method static bool allInArray(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice() for all values.
+ * @method static bool allInteger(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer for all values.
+ * @method static bool allIntegerish(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish for all values.
+ * @method static bool allInterfaceExists(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the interface exists for all values.
+ * @method static bool allIp(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address for all values.
+ * @method static bool allIpv4(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address for all values.
+ * @method static bool allIpv6(string[] $value, int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address for all values.
+ * @method static bool allIsArray(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array for all values.
+ * @method static bool allIsArrayAccessible(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object for all values.
+ * @method static bool allIsCallable(mixed[] $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable for all values.
+ * @method static bool allIsCountable(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable for all values.
+ * @method static bool allIsInstanceOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name for all values.
+ * @method static bool allIsJsonString(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string for all values.
+ * @method static bool allIsObject(mixed[] $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object for all values.
+ * @method static bool allIsResource(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a resource for all values.
+ * @method static bool allIsTraversable(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object for all values.
+ * @method static bool allKeyExists(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array for all values.
+ * @method static bool allKeyIsset(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset() for all values.
+ * @method static bool allKeyNotExists(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array for all values.
+ * @method static bool allLength(mixed[] $value, int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length for all values.
+ * @method static bool allLessOrEqualThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit for all values.
+ * @method static bool allLessThan(mixed[] $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit for all values.
+ * @method static bool allMax(mixed[] $value, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit for all values.
+ * @method static bool allMaxCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements for all values.
+ * @method static bool allMaxLength(mixed[] $value, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars for all values.
+ * @method static bool allMethodExists(string[] $value, mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object for all values.
+ * @method static bool allMin(mixed[] $value, mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit for all values.
+ * @method static bool allMinCount(array[]|Countable[]|ResourceBundle[]|SimpleXMLElement[] $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements for all values.
+ * @method static bool allMinLength(mixed[] $value, int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long for all values.
+ * @method static bool allNoContent(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is empty for all values.
+ * @method static bool allNotBlank(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not blank for all values.
+ * @method static bool allNotContains(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars for all values.
+ * @method static bool allNotEmpty(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not empty for all values.
+ * @method static bool allNotEmptyKey(mixed[] $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty for all values.
+ * @method static bool allNotEq(mixed[] $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==) for all values.
+ * @method static bool allNotInArray(mixed[] $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices for all values.
+ * @method static bool allNotIsInstanceOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name for all values.
+ * @method static bool allNotNull(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is not null for all values.
+ * @method static bool allNotRegex(mixed[] $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex for all values.
+ * @method static bool allNotSame(mixed[] $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===) for all values.
+ * @method static bool allNull(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is null for all values.
+ * @method static bool allNumeric(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is numeric for all values.
+ * @method static bool allObjectOrClass(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists for all values.
+ * @method static bool allPhpVersion(string[] $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version for all values.
+ * @method static bool allPropertiesExist(mixed[] $value, array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist for all values.
+ * @method static bool allPropertyExists(mixed[] $value, string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists for all values.
+ * @method static bool allRange(mixed[] $value, mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers for all values.
+ * @method static bool allReadable(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something readable for all values.
+ * @method static bool allRegex(mixed[] $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex for all values.
+ * @method static bool allSame(mixed[] $value, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===) for all values.
+ * @method static bool allSatisfy(mixed[] $value, callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback for all values.
+ * @method static bool allScalar(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar for all values.
+ * @method static bool allStartsWith(mixed[] $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars for all values.
+ * @method static bool allString(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is a string for all values.
+ * @method static bool allSubclassOf(mixed[] $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name for all values.
+ * @method static bool allTrue(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True for all values.
+ * @method static bool allUniqueValues(array[] $values, string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality) for all values.
+ * @method static bool allUrl(mixed[] $value, string|callable $message = null, string $propertyPath = null) Assert that value is an URL for all values.
+ * @method static bool allUuid(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID for all values.
+ * @method static bool allVersion(string[] $version1, string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions for all values.
+ * @method static bool allWriteable(string[] $value, string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable for all values.
* @method static bool nullOrAlnum(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric or that the value is null.
* @method static bool nullOrBase64(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined or that the value is null.
- * @method static bool nullOrBetween(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit or that the value is null.
- * @method static bool nullOrBetweenExclusive(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit or that the value is null.
+ * @method static bool nullOrBetween(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit or that the value is null.
+ * @method static bool nullOrBetweenExclusive(mixed|null $value, mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit or that the value is null.
* @method static bool nullOrBetweenLength(mixed|null $value, int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths or that the value is null.
* @method static bool nullOrBoolean(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is php boolean or that the value is null.
* @method static bool nullOrChoice(mixed|null $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices or that the value is null.
* @method static bool nullOrChoicesNotEmpty(array|null $values, array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content or that the value is null.
* @method static bool nullOrClassExists(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the class exists or that the value is null.
* @method static bool nullOrContains(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars or that the value is null.
- * @method static bool nullOrCount(array|\Countable|\ResourceBundle|\SimpleXMLElement|null $countable, int $count, string $message = null, string $propertyPath = null) Assert that the count of countable is equal to count or that the value is null.
+ * @method static bool nullOrCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count or that the value is null.
* @method static bool nullOrDate(string|null $value, string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format or that the value is null.
* @method static bool nullOrDefined(mixed|null $constant, string|callable $message = null, string $propertyPath = null) Assert that a constant is defined or that the value is null.
* @method static bool nullOrDigit(mixed|null $value, string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit or that the value is null.
@@ -147,7 +157,7 @@ use BadMethodCallException;
* @method static bool nullOrIsArray(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or that the value is null.
* @method static bool nullOrIsArrayAccessible(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object or that the value is null.
* @method static bool nullOrIsCallable(mixed|null $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable or that the value is null.
- * @method static bool nullOrIsCountable(array|\Countable|\ResourceBundle|\SimpleXMLElement|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable or that the value is null.
+ * @method static bool nullOrIsCountable(array|Countable|ResourceBundle|SimpleXMLElement|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is countable or that the value is null.
* @method static bool nullOrIsInstanceOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name or that the value is null.
* @method static bool nullOrIsJsonString(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string or that the value is null.
* @method static bool nullOrIsObject(mixed|null $value, string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object or that the value is null.
@@ -160,23 +170,23 @@ use BadMethodCallException;
* @method static bool nullOrLessOrEqualThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit or that the value is null.
* @method static bool nullOrLessThan(mixed|null $value, mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit or that the value is null.
* @method static bool nullOrMax(mixed|null $value, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit or that the value is null.
- * @method static bool nullOrMaxCount(array|\Countable|\ResourceBundle|\SimpleXMLElement|null $countable, int $count, string $message = null, string $propertyPath = null) Assert that the countable have at most $count elements or that the value is null.
+ * @method static bool nullOrMaxCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements or that the value is null.
* @method static bool nullOrMaxLength(mixed|null $value, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars or that the value is null.
* @method static bool nullOrMethodExists(string|null $value, mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object or that the value is null.
* @method static bool nullOrMin(mixed|null $value, mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit or that the value is null.
- * @method static bool nullOrMinCount(array|\Countable|\ResourceBundle|\SimpleXMLElement|null $countable, int $count, string $message = null, string $propertyPath = null) Assert that the countable have at least $count elements or that the value is null.
+ * @method static bool nullOrMinCount(array|Countable|ResourceBundle|SimpleXMLElement|null $countable, int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements or that the value is null.
* @method static bool nullOrMinLength(mixed|null $value, int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long or that the value is null.
* @method static bool nullOrNoContent(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is empty or that the value is null.
* @method static bool nullOrNotBlank(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not blank or that the value is null.
* @method static bool nullOrNotContains(mixed|null $string, string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars or that the value is null.
* @method static bool nullOrNotEmpty(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not empty or that the value is null.
* @method static bool nullOrNotEmptyKey(mixed|null $value, string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty or that the value is null.
- * @method static bool nullOrNotEq(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using == ) or that the value is null.
+ * @method static bool nullOrNotEq(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==) or that the value is null.
* @method static bool nullOrNotInArray(mixed|null $value, array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices or that the value is null.
* @method static bool nullOrNotIsInstanceOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name or that the value is null.
* @method static bool nullOrNotNull(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is not null or that the value is null.
* @method static bool nullOrNotRegex(mixed|null $value, string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex or that the value is null.
- * @method static bool nullOrNotSame(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using === ) or that the value is null.
+ * @method static bool nullOrNotSame(mixed|null $value1, mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===) or that the value is null.
* @method static bool nullOrNull(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is null or that the value is null.
* @method static bool nullOrNumeric(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is numeric or that the value is null.
* @method static bool nullOrObjectOrClass(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists or that the value is null.
@@ -193,6 +203,7 @@ use BadMethodCallException;
* @method static bool nullOrString(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is a string or that the value is null.
* @method static bool nullOrSubclassOf(mixed|null $value, string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name or that the value is null.
* @method static bool nullOrTrue(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True or that the value is null.
+ * @method static bool nullOrUniqueValues(array|null $values, string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality) or that the value is null.
* @method static bool nullOrUrl(mixed|null $value, string|callable $message = null, string $propertyPath = null) Assert that value is an URL or that the value is null.
* @method static bool nullOrUuid(string|null $value, string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID or that the value is null.
* @method static bool nullOrVersion(string|null $version1, string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions or that the value is null.
@@ -278,6 +289,7 @@ class Assertion
const INVALID_MIN_COUNT = 227;
const INVALID_MAX_COUNT = 228;
const INVALID_STRING_NOT_CONTAINS = 229;
+ const INVALID_UNIQUE_VALUES = 230;
/**
* Exception to throw when an assertion failed.
@@ -289,14 +301,13 @@ class Assertion
/**
* Assert that two values are equal (using ==).
*
- * @param mixed $value
- * @param mixed $value2
+ * @param mixed $value
+ * @param mixed $value2
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function eq($value, $value2, $message = null, $propertyPath = null)
+ public static function eq($value, $value2, $message = null, string $propertyPath = null): bool
{
if ($value != $value2) {
$message = \sprintf(
@@ -314,14 +325,13 @@ class Assertion
/**
* Assert that the array contains the subset.
*
- * @param mixed $value
- * @param mixed $value2
+ * @param mixed $value
+ * @param mixed $value2
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function eqArraySubset($value, $value2, $message = null, $propertyPath = null)
+ public static function eqArraySubset($value, $value2, $message = null, string $propertyPath = null): bool
{
static::isArray($value, $message, $propertyPath);
static::isArray($value2, $message, $propertyPath);
@@ -335,14 +345,20 @@ class Assertion
/**
* Assert that two values are the same (using ===).
*
- * @param mixed $value
- * @param mixed $value2
+ * @param mixed $value
+ * @param mixed $value2
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType
+ * @psalm-param ExpectedType $value2
+ * @psalm-assert =ExpectedType $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function same($value, $value2, $message = null, $propertyPath = null)
+ public static function same($value, $value2, $message = null, string $propertyPath = null): bool
{
if ($value !== $value2) {
$message = \sprintf(
@@ -358,16 +374,15 @@ class Assertion
}
/**
- * Assert that two values are not equal (using == ).
+ * Assert that two values are not equal (using ==).
*
- * @param mixed $value1
- * @param mixed $value2
+ * @param mixed $value1
+ * @param mixed $value2
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function notEq($value1, $value2, $message = null, $propertyPath = null)
+ public static function notEq($value1, $value2, $message = null, string $propertyPath = null): bool
{
if ($value1 == $value2) {
$message = \sprintf(
@@ -382,16 +397,22 @@ class Assertion
}
/**
- * Assert that two values are not the same (using === ).
+ * Assert that two values are not the same (using ===).
*
- * @param mixed $value1
- * @param mixed $value2
+ * @param mixed $value1
+ * @param mixed $value2
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType
+ * @psalm-param ExpectedType $value2
+ * @psalm-assert !=ExpectedType $value1
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function notSame($value1, $value2, $message = null, $propertyPath = null)
+ public static function notSame($value1, $value2, $message = null, string $propertyPath = null): bool
{
if ($value1 === $value2) {
$message = \sprintf(
@@ -408,14 +429,12 @@ class Assertion
/**
* Assert that value is not in array of choices.
*
- * @param mixed $value
- * @param array $choices
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function notInArray($value, array $choices, $message = null, $propertyPath = null)
+ public static function notInArray($value, array $choices, $message = null, string $propertyPath = null): bool
{
if (true === \in_array($value, $choices)) {
$message = \sprintf(
@@ -432,13 +451,17 @@ class Assertion
/**
* Assert that value is a php integer.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert int $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function integer($value, $message = null, $propertyPath = null)
+ public static function integer($value, $message = null, string $propertyPath = null): bool
{
if (!\is_int($value)) {
$message = \sprintf(
@@ -455,13 +478,17 @@ class Assertion
/**
* Assert that value is a php float.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert float $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function float($value, $message = null, $propertyPath = null)
+ public static function float($value, $message = null, string $propertyPath = null): bool
{
if (!\is_float($value)) {
$message = \sprintf(
@@ -478,15 +505,19 @@ class Assertion
/**
* Validates if an integer or integerish is a digit.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function digit($value, $message = null, $propertyPath = null)
+ public static function digit($value, $message = null, string $propertyPath = null): bool
{
- if (!\ctype_digit((string) $value)) {
+ if (!\ctype_digit((string)$value)) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" is not a digit.'),
static::stringify($value)
@@ -501,13 +532,12 @@ class Assertion
/**
* Assert that value is a php integer'ish.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function integerish($value, $message = null, $propertyPath = null)
+ public static function integerish($value, $message = null, string $propertyPath = null): bool
{
if (
\is_resource($value) ||
@@ -537,13 +567,17 @@ class Assertion
/**
* Assert that value is php boolean.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert bool $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function boolean($value, $message = null, $propertyPath = null)
+ public static function boolean($value, $message = null, string $propertyPath = null): bool
{
if (!\is_bool($value)) {
$message = \sprintf(
@@ -560,13 +594,17 @@ class Assertion
/**
* Assert that value is a PHP scalar.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert scalar $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function scalar($value, $message = null, $propertyPath = null)
+ public static function scalar($value, $message = null, string $propertyPath = null): bool
{
if (!\is_scalar($value)) {
$message = \sprintf(
@@ -583,13 +621,17 @@ class Assertion
/**
* Assert that value is not empty.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert !empty $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function notEmpty($value, $message = null, $propertyPath = null)
+ public static function notEmpty($value, $message = null, string $propertyPath = null): bool
{
if (empty($value)) {
$message = \sprintf(
@@ -606,13 +648,17 @@ class Assertion
/**
* Assert that value is empty.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert empty $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function noContent($value, $message = null, $propertyPath = null)
+ public static function noContent($value, $message = null, string $propertyPath = null): bool
{
if (!empty($value)) {
$message = \sprintf(
@@ -629,13 +675,15 @@ class Assertion
/**
* Assert that value is null.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert null $value
*
* @return bool
*/
- public static function null($value, $message = null, $propertyPath = null)
+ public static function null($value, $message = null, string $propertyPath = null): bool
{
if (null !== $value) {
$message = \sprintf(
@@ -652,13 +700,17 @@ class Assertion
/**
* Assert that value is not null.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert !null $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function notNull($value, $message = null, $propertyPath = null)
+ public static function notNull($value, $message = null, string $propertyPath = null): bool
{
if (null === $value) {
$message = \sprintf(
@@ -675,13 +727,17 @@ class Assertion
/**
* Assert that value is a string.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function string($value, $message = null, $propertyPath = null)
+ public static function string($value, $message = null, string $propertyPath = null)
{
if (!\is_string($value)) {
$message = \sprintf(
@@ -699,14 +755,18 @@ class Assertion
/**
* Assert that value matches a regex.
*
- * @param mixed $value
- * @param string $pattern
+ * @param mixed $value
+ * @param string $pattern
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function regex($value, $pattern, $message = null, $propertyPath = null)
+ public static function regex($value, $pattern, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -725,16 +785,16 @@ class Assertion
/**
* Assert that value does not match a regex.
*
- * @param mixed $value
- * @param string $pattern
+ * @param mixed $value
+ * @param string $pattern
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
*
- * @return bool
+ * @psalm-assert !=string $value
*
- * @throws \Assert\AssertionFailedException
+ * @throws AssertionFailedException
*/
- public static function notRegex($value, $pattern, $message = null, $propertyPath = null)
+ public static function notRegex($value, $pattern, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -753,15 +813,19 @@ class Assertion
/**
* Assert that string has a given length.
*
- * @param mixed $value
- * @param int $length
+ * @param mixed $value
+ * @param int $length
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function length($value, $length, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function length($value, $length, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($value, $message, $propertyPath);
@@ -782,15 +846,19 @@ class Assertion
/**
* Assert that a string is at least $minLength chars long.
*
- * @param mixed $value
- * @param int $minLength
+ * @param mixed $value
+ * @param int $minLength
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function minLength($value, $minLength, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function minLength($value, $minLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($value, $message, $propertyPath);
@@ -811,15 +879,19 @@ class Assertion
/**
* Assert that string value is not longer than $maxLength chars.
*
- * @param mixed $value
- * @param int $maxLength
+ * @param mixed $value
+ * @param int $maxLength
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function maxLength($value, $maxLength, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function maxLength($value, $maxLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($value, $message, $propertyPath);
@@ -840,16 +912,20 @@ class Assertion
/**
* Assert that string length is between min and max lengths.
*
- * @param mixed $value
- * @param int $minLength
- * @param int $maxLength
+ * @param mixed $value
+ * @param int $minLength
+ * @param int $maxLength
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function betweenLength($value, $minLength, $maxLength, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function betweenLength($value, $minLength, $maxLength, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($value, $message, $propertyPath);
static::minLength($value, $minLength, $message, $propertyPath, $encoding);
@@ -861,19 +937,23 @@ class Assertion
/**
* Assert that string starts with a sequence of chars.
*
- * @param mixed $string
- * @param string $needle
+ * @param mixed $string
+ * @param string $needle
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function startsWith($string, $needle, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function startsWith($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($string, $message, $propertyPath);
- if (0 !== \mb_strpos($string, $needle, null, $encoding)) {
+ if (0 !== \mb_strpos($string, $needle, 0, $encoding)) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" does not start with "%s".'),
static::stringify($string),
@@ -889,21 +969,25 @@ class Assertion
/**
* Assert that string ends with a sequence of chars.
*
- * @param mixed $string
- * @param string $needle
+ * @param mixed $string
+ * @param string $needle
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function endsWith($string, $needle, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function endsWith($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($string, $message, $propertyPath);
$stringPosition = \mb_strlen($string, $encoding) - \mb_strlen($needle, $encoding);
- if (\mb_strripos($string, $needle, null, $encoding) !== $stringPosition) {
+ if (\mb_strripos($string, $needle, 0, $encoding) !== $stringPosition) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" does not end with "%s".'),
static::stringify($string),
@@ -919,19 +1003,23 @@ class Assertion
/**
* Assert that string contains a sequence of chars.
*
- * @param mixed $string
- * @param string $needle
+ * @param mixed $string
+ * @param string $needle
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function contains($string, $needle, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function contains($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($string, $message, $propertyPath);
- if (false === \mb_strpos($string, $needle, null, $encoding)) {
+ if (false === \mb_strpos($string, $needle, 0, $encoding)) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" does not contain "%s".'),
static::stringify($string),
@@ -947,19 +1035,23 @@ class Assertion
/**
* Assert that string does not contains a sequence of chars.
*
- * @param mixed $string
- * @param string $needle
+ * @param mixed $string
+ * @param string $needle
* @param string|callable|null $message
- * @param string|null $propertyPath
- * @param string $encoding
+ * @param string|null $propertyPath
+ * @param string $encoding
+ *
+ * @psalm-assert =string $string
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function notContains($string, $needle, $message = null, $propertyPath = null, $encoding = 'utf8')
+ public static function notContains($string, $needle, $message = null, string $propertyPath = null, $encoding = 'utf8'): bool
{
static::string($string, $message, $propertyPath);
- if (false !== \mb_strpos($string, $needle, null, $encoding)) {
+ if (false !== \mb_strpos($string, $needle, 0, $encoding)) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" contains "%s".'),
static::stringify($string),
@@ -975,14 +1067,12 @@ class Assertion
/**
* Assert that value is in array of choices.
*
- * @param mixed $value
- * @param array $choices
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function choice($value, array $choices, $message = null, $propertyPath = null)
+ public static function choice($value, array $choices, $message = null, string $propertyPath = null): bool
{
if (!\in_array($value, $choices, true)) {
$message = \sprintf(
@@ -1002,14 +1092,12 @@ class Assertion
*
* This is an alias of {@see choice()}.
*
- * @param mixed $value
- * @param array $choices
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function inArray($value, array $choices, $message = null, $propertyPath = null)
+ public static function inArray($value, array $choices, $message = null, string $propertyPath = null): bool
{
return static::choice($value, $choices, $message, $propertyPath);
}
@@ -1017,13 +1105,17 @@ class Assertion
/**
* Assert that value is numeric.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert numeric $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function numeric($value, $message = null, $propertyPath = null)
+ public static function numeric($value, $message = null, string $propertyPath = null): bool
{
if (!\is_numeric($value)) {
$message = \sprintf(
@@ -1040,13 +1132,15 @@ class Assertion
/**
* Assert that value is a resource.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert resource $value
*
* @return bool
*/
- public static function isResource($value, $message = null, $propertyPath = null)
+ public static function isResource($value, $message = null, string $propertyPath = null): bool
{
if (!\is_resource($value)) {
$message = \sprintf(
@@ -1063,13 +1157,17 @@ class Assertion
/**
* Assert that value is an array.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert array $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isArray($value, $message = null, $propertyPath = null)
+ public static function isArray($value, $message = null, string $propertyPath = null): bool
{
if (!\is_array($value)) {
$message = \sprintf(
@@ -1086,15 +1184,19 @@ class Assertion
/**
* Assert that value is an array or a traversable object.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert iterable $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isTraversable($value, $message = null, $propertyPath = null)
+ public static function isTraversable($value, $message = null, string $propertyPath = null): bool
{
- if (!\is_array($value) && !$value instanceof \Traversable) {
+ if (!\is_array($value) && !$value instanceof Traversable) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" is not an array and does not implement Traversable.'),
static::stringify($value)
@@ -1109,15 +1211,14 @@ class Assertion
/**
* Assert that value is an array or an array-accessible object.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function isArrayAccessible($value, $message = null, $propertyPath = null)
+ public static function isArrayAccessible($value, $message = null, string $propertyPath = null): bool
{
- if (!\is_array($value) && !$value instanceof \ArrayAccess) {
+ if (!\is_array($value) && !$value instanceof ArrayAccess) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" is not an array and does not implement ArrayAccess.'),
static::stringify($value)
@@ -1132,18 +1233,22 @@ class Assertion
/**
* Assert that value is countable.
*
- * @param array|\Countable|\ResourceBundle|\SimpleXMLElement $value
- * @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $value
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert countable $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isCountable($value, $message = null, $propertyPath = null)
+ public static function isCountable($value, $message = null, string $propertyPath = null): bool
{
if (\function_exists('is_countable')) {
$assert = \is_countable($value);
} else {
- $assert = \is_array($value) || $value instanceof \Countable || $value instanceof \ResourceBundle || $value instanceof \SimpleXMLElement;
+ $assert = \is_array($value) || $value instanceof Countable || $value instanceof ResourceBundle || $value instanceof SimpleXMLElement;
}
if (!$assert) {
@@ -1161,14 +1266,13 @@ class Assertion
/**
* Assert that key exists in an array.
*
- * @param mixed $value
- * @param string|int $key
+ * @param mixed $value
+ * @param string|int $key
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function keyExists($value, $key, $message = null, $propertyPath = null)
+ public static function keyExists($value, $key, $message = null, string $propertyPath = null): bool
{
static::isArray($value, $message, $propertyPath);
@@ -1187,14 +1291,13 @@ class Assertion
/**
* Assert that key does not exist in an array.
*
- * @param mixed $value
- * @param string|int $key
+ * @param mixed $value
+ * @param string|int $key
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function keyNotExists($value, $key, $message = null, $propertyPath = null)
+ public static function keyNotExists($value, $key, $message = null, string $propertyPath = null): bool
{
static::isArray($value, $message, $propertyPath);
@@ -1211,16 +1314,39 @@ class Assertion
}
/**
+ * Assert that values in array are unique (using strict equality).
+ *
+ * @param mixed[] $values
+ * @param string|callable|null $message
+ *
+ * @throws AssertionFailedException
+ */
+ public static function uniqueValues(array $values, $message = null, string $propertyPath = null): bool
+ {
+ foreach ($values as $key => $value) {
+ if (\array_search($value, $values, true) !== $key) {
+ $message = \sprintf(
+ static::generateMessage($message ?: 'Value "%s" occurs more than once in array'),
+ static::stringify($value)
+ );
+
+ throw static::createException($value, $message, static::INVALID_UNIQUE_VALUES, $propertyPath, ['value' => $value]);
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Assert that key exists in an array/array-accessible object using isset().
*
- * @param mixed $value
- * @param string|int $key
+ * @param mixed $value
+ * @param string|int $key
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function keyIsset($value, $key, $message = null, $propertyPath = null)
+ public static function keyIsset($value, $key, $message = null, string $propertyPath = null): bool
{
static::isArrayAccessible($value, $message, $propertyPath);
@@ -1239,14 +1365,13 @@ class Assertion
/**
* Assert that key exists in an array/array-accessible object and its value is not empty.
*
- * @param mixed $value
- * @param string|int $key
+ * @param mixed $value
+ * @param string|int $key
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function notEmptyKey($value, $key, $message = null, $propertyPath = null)
+ public static function notEmptyKey($value, $key, $message = null, string $propertyPath = null): bool
{
static::keyIsset($value, $key, $message, $propertyPath);
static::notEmpty($value[$key], $message, $propertyPath);
@@ -1257,13 +1382,12 @@ class Assertion
/**
* Assert that value is not blank.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function notBlank($value, $message = null, $propertyPath = null)
+ public static function notBlank($value, $message = null, string $propertyPath = null): bool
{
if (false === $value || (empty($value) && '0' != $value) || (\is_string($value) && '' === \trim($value))) {
$message = \sprintf(
@@ -1280,14 +1404,20 @@ class Assertion
/**
* Assert that value is instance of given class-name.
*
- * @param mixed $value
- * @param string $className
+ * @param mixed $value
+ * @param string $className
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $className
+ * @psalm-assert ExpectedType $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isInstanceOf($value, $className, $message = null, $propertyPath = null)
+ public static function isInstanceOf($value, $className, $message = null, string $propertyPath = null): bool
{
if (!($value instanceof $className)) {
$message = \sprintf(
@@ -1305,14 +1435,20 @@ class Assertion
/**
* Assert that value is not instance of given class-name.
*
- * @param mixed $value
- * @param string $className
+ * @param mixed $value
+ * @param string $className
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $className
+ * @psalm-assert !ExpectedType $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function notIsInstanceOf($value, $className, $message = null, $propertyPath = null)
+ public static function notIsInstanceOf($value, $className, $message = null, string $propertyPath = null): bool
{
if ($value instanceof $className) {
$message = \sprintf(
@@ -1330,14 +1466,13 @@ class Assertion
/**
* Assert that value is subclass of given class-name.
*
- * @param mixed $value
- * @param string $className
+ * @param mixed $value
+ * @param string $className
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function subclassOf($value, $className, $message = null, $propertyPath = null)
+ public static function subclassOf($value, $className, $message = null, string $propertyPath = null): bool
{
if (!\is_subclass_of($value, $className)) {
$message = \sprintf(
@@ -1355,15 +1490,19 @@ class Assertion
/**
* Assert that value is in range of numbers.
*
- * @param mixed $value
- * @param mixed $minValue
- * @param mixed $maxValue
+ * @param mixed $value
+ * @param mixed $minValue
+ * @param mixed $maxValue
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function range($value, $minValue, $maxValue, $message = null, $propertyPath = null)
+ public static function range($value, $minValue, $maxValue, $message = null, string $propertyPath = null): bool
{
static::numeric($value, $message, $propertyPath);
@@ -1384,14 +1523,18 @@ class Assertion
/**
* Assert that a value is at least as big as a given limit.
*
- * @param mixed $value
- * @param mixed $minValue
+ * @param mixed $value
+ * @param mixed $minValue
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function min($value, $minValue, $message = null, $propertyPath = null)
+ public static function min($value, $minValue, $message = null, string $propertyPath = null): bool
{
static::numeric($value, $message, $propertyPath);
@@ -1411,14 +1554,18 @@ class Assertion
/**
* Assert that a number is smaller as a given limit.
*
- * @param mixed $value
- * @param mixed $maxValue
+ * @param mixed $value
+ * @param mixed $maxValue
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =numeric $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function max($value, $maxValue, $message = null, $propertyPath = null)
+ public static function max($value, $maxValue, $message = null, string $propertyPath = null): bool
{
static::numeric($value, $message, $propertyPath);
@@ -1438,13 +1585,12 @@ class Assertion
/**
* Assert that a file exists.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function file($value, $message = null, $propertyPath = null)
+ public static function file($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
static::notEmpty($value, $message, $propertyPath);
@@ -1464,13 +1610,12 @@ class Assertion
/**
* Assert that a directory exists.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function directory($value, $message = null, $propertyPath = null)
+ public static function directory($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -1489,13 +1634,12 @@ class Assertion
/**
* Assert that the value is something readable.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function readable($value, $message = null, $propertyPath = null)
+ public static function readable($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -1514,13 +1658,12 @@ class Assertion
/**
* Assert that the value is something writeable.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function writeable($value, $message = null, $propertyPath = null)
+ public static function writeable($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -1539,13 +1682,17 @@ class Assertion
/**
* Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function email($value, $message = null, $propertyPath = null)
+ public static function email($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -1566,16 +1713,20 @@ class Assertion
*
* This code snipped was taken from the Symfony project and modified to the special demands of this method.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
*
* @return bool
*
+ * @throws AssertionFailedException
+ *
* @see https://github.com/symfony/Validator/blob/master/Constraints/UrlValidator.php
* @see https://github.com/symfony/Validator/blob/master/Constraints/Url.php
*/
- public static function url($value, $message = null, $propertyPath = null)
+ public static function url($value, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
@@ -1616,17 +1767,16 @@ class Assertion
/**
* Assert that value is alphanumeric.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function alnum($value, $message = null, $propertyPath = null)
+ public static function alnum($value, $message = null, string $propertyPath = null): bool
{
try {
static::regex($value, '(^([a-zA-Z]{1}[a-zA-Z0-9]*)$)', $message, $propertyPath);
- } catch (\Throwable $e) {
+ } catch (Throwable $e) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" is not alphanumeric, starting with letters and containing only letters and numbers.'),
static::stringify($value)
@@ -1641,13 +1791,17 @@ class Assertion
/**
* Assert that the value is boolean True.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert true $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function true($value, $message = null, $propertyPath = null)
+ public static function true($value, $message = null, string $propertyPath = null): bool
{
if (true !== $value) {
$message = \sprintf(
@@ -1664,13 +1818,17 @@ class Assertion
/**
* Assert that the value is boolean False.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert false $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function false($value, $message = null, $propertyPath = null)
+ public static function false($value, $message = null, string $propertyPath = null): bool
{
if (false !== $value) {
$message = \sprintf(
@@ -1687,13 +1845,17 @@ class Assertion
/**
* Assert that the class exists.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert class-string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function classExists($value, $message = null, $propertyPath = null)
+ public static function classExists($value, $message = null, string $propertyPath = null): bool
{
if (!\class_exists($value)) {
$message = \sprintf(
@@ -1710,13 +1872,17 @@ class Assertion
/**
* Assert that the interface exists.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert class-string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function interfaceExists($value, $message = null, $propertyPath = null)
+ public static function interfaceExists($value, $message = null, string $propertyPath = null): bool
{
if (!\interface_exists($value)) {
$message = \sprintf(
@@ -1733,17 +1899,16 @@ class Assertion
/**
* Assert that the class implements the interface.
*
- * @param mixed $class
- * @param string $interfaceName
+ * @param mixed $class
+ * @param string $interfaceName
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function implementsInterface($class, $interfaceName, $message = null, $propertyPath = null)
+ public static function implementsInterface($class, $interfaceName, $message = null, string $propertyPath = null): bool
{
try {
- $reflection = new \ReflectionClass($class);
+ $reflection = new ReflectionClass($class);
if (!$reflection->implementsInterface($interfaceName)) {
$message = \sprintf(
static::generateMessage($message ?: 'Class "%s" does not implement interface "%s".'),
@@ -1753,7 +1918,7 @@ class Assertion
throw static::createException($class, $message, static::INTERFACE_NOT_IMPLEMENTED, $propertyPath, ['interface' => $interfaceName]);
}
- } catch (\ReflectionException $e) {
+ } catch (ReflectionException $e) {
$message = \sprintf(
static::generateMessage($message ?: 'Class "%s" failed reflection.'),
static::stringify($class)
@@ -1773,13 +1938,17 @@ class Assertion
* content afterwards, just to decode and check for yourself instead
* of using this assertion.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert =string $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isJsonString($value, $message = null, $propertyPath = null)
+ public static function isJsonString($value, $message = null, string $propertyPath = null): bool
{
if (null === \json_decode($value) && JSON_ERROR_NONE !== \json_last_error()) {
$message = \sprintf(
@@ -1798,13 +1967,12 @@ class Assertion
*
* Uses code from {@link https://github.com/ramsey/uuid} that is MIT licensed.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function uuid($value, $message = null, $propertyPath = null)
+ public static function uuid($value, $message = null, string $propertyPath = null): bool
{
$value = \str_replace(['urn:', 'uuid:', '{', '}'], '', $value);
@@ -1829,13 +1997,12 @@ class Assertion
*
* @see https://en.wikipedia.org/wiki/E.164
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function e164($value, $message = null, $propertyPath = null)
+ public static function e164($value, $message = null, string $propertyPath = null): bool
{
if (!\preg_match('/^\+?[1-9]\d{1,14}$/', $value)) {
$message = \sprintf(
@@ -1852,14 +2019,16 @@ class Assertion
/**
* Assert that the count of countable is equal to count.
*
- * @param array|\Countable|\ResourceBundle|\SimpleXMLElement $countable
- * @param int $count
- * @param string|null $message
- * @param string|null $propertyPath
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
+ * @param string|null $propertyPath
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function count($countable, $count, $message = null, $propertyPath = null)
+ public static function count($countable, $count, $message = null, string $propertyPath = null): bool
{
if ($count !== \count($countable)) {
$message = \sprintf(
@@ -1877,14 +2046,13 @@ class Assertion
/**
* Assert that the countable have at least $count elements.
*
- * @param array|\Countable|\ResourceBundle|\SimpleXMLElement $countable
- * @param int $count
- * @param string|null $message
- * @param string|null $propertyPath
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function minCount($countable, $count, $message = null, $propertyPath = null)
+ public static function minCount($countable, $count, $message = null, string $propertyPath = null): bool
{
if ($count > \count($countable)) {
$message = \sprintf(
@@ -1902,14 +2070,13 @@ class Assertion
/**
* Assert that the countable have at most $count elements.
*
- * @param array|\Countable|\ResourceBundle|\SimpleXMLElement $countable
- * @param int $count
- * @param string|null $message
- * @param string|null $propertyPath
+ * @param array|Countable|ResourceBundle|SimpleXMLElement $countable
+ * @param int $count
+ * @param string|callable|null $message
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function maxCount($countable, $count, $message = null, $propertyPath = null)
+ public static function maxCount($countable, $count, $message = null, string $propertyPath = null): bool
{
if ($count < \count($countable)) {
$message = \sprintf(
@@ -1930,9 +2097,11 @@ class Assertion
* - "all" delegation.
*
* @param string $method
- * @param array $args
+ * @param array $args
*
* @return bool|mixed
+ *
+ * @throws AssertionFailedException
*/
public static function __callStatic($method, $args)
{
@@ -1974,14 +2143,11 @@ class Assertion
/**
* Determines if the values array has every choice as key and that this choice has content.
*
- * @param array $values
- * @param array $choices
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function choicesNotEmpty(array $values, array $choices, $message = null, $propertyPath = null)
+ public static function choicesNotEmpty(array $values, array $choices, $message = null, string $propertyPath = null): bool
{
static::notEmpty($values, $message, $propertyPath);
@@ -1995,14 +2161,13 @@ class Assertion
/**
* Determines that the named method is defined in the provided object.
*
- * @param string $value
- * @param mixed $object
+ * @param string $value
+ * @param mixed $object
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function methodExists($value, $object, $message = null, $propertyPath = null)
+ public static function methodExists($value, $object, $message = null, string $propertyPath = null): bool
{
static::isObject($object, $message, $propertyPath);
@@ -2021,13 +2186,17 @@ class Assertion
/**
* Determines that the provided value is an object.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert object $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isObject($value, $message = null, $propertyPath = null)
+ public static function isObject($value, $message = null, string $propertyPath = null): bool
{
if (!\is_object($value)) {
$message = \sprintf(
@@ -2044,14 +2213,13 @@ class Assertion
/**
* Determines if the value is less than given limit.
*
- * @param mixed $value
- * @param mixed $limit
+ * @param mixed $value
+ * @param mixed $limit
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function lessThan($value, $limit, $message = null, $propertyPath = null)
+ public static function lessThan($value, $limit, $message = null, string $propertyPath = null): bool
{
if ($value >= $limit) {
$message = \sprintf(
@@ -2069,14 +2237,13 @@ class Assertion
/**
* Determines if the value is less or equal than given limit.
*
- * @param mixed $value
- * @param mixed $limit
+ * @param mixed $value
+ * @param mixed $limit
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function lessOrEqualThan($value, $limit, $message = null, $propertyPath = null)
+ public static function lessOrEqualThan($value, $limit, $message = null, string $propertyPath = null): bool
{
if ($value > $limit) {
$message = \sprintf(
@@ -2094,14 +2261,13 @@ class Assertion
/**
* Determines if the value is greater than given limit.
*
- * @param mixed $value
- * @param mixed $limit
+ * @param mixed $value
+ * @param mixed $limit
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function greaterThan($value, $limit, $message = null, $propertyPath = null)
+ public static function greaterThan($value, $limit, $message = null, string $propertyPath = null): bool
{
if ($value <= $limit) {
$message = \sprintf(
@@ -2119,14 +2285,13 @@ class Assertion
/**
* Determines if the value is greater or equal than given limit.
*
- * @param mixed $value
- * @param mixed $limit
+ * @param mixed $value
+ * @param mixed $limit
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function greaterOrEqualThan($value, $limit, $message = null, $propertyPath = null)
+ public static function greaterOrEqualThan($value, $limit, $message = null, string $propertyPath = null): bool
{
if ($value < $limit) {
$message = \sprintf(
@@ -2144,15 +2309,15 @@ class Assertion
/**
* Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
*
- * @param mixed $value
- * @param mixed $lowerLimit
- * @param mixed $upperLimit
- * @param string $message
+ * @param mixed $value
+ * @param mixed $lowerLimit
+ * @param mixed $upperLimit
+ * @param string|callable|null $message
* @param string $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function between($value, $lowerLimit, $upperLimit, $message = null, $propertyPath = null)
+ public static function between($value, $lowerLimit, $upperLimit, $message = null, string $propertyPath = null): bool
{
if ($lowerLimit > $value || $value > $upperLimit) {
$message = \sprintf(
@@ -2171,15 +2336,15 @@ class Assertion
/**
* Assert that a value is greater than a lower limit, and less than an upper limit.
*
- * @param mixed $value
- * @param mixed $lowerLimit
- * @param mixed $upperLimit
- * @param string $message
+ * @param mixed $value
+ * @param mixed $lowerLimit
+ * @param mixed $upperLimit
+ * @param string|callable|null $message
* @param string $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function betweenExclusive($value, $lowerLimit, $upperLimit, $message = null, $propertyPath = null)
+ public static function betweenExclusive($value, $lowerLimit, $upperLimit, $message = null, string $propertyPath = null): bool
{
if ($lowerLimit >= $value || $value >= $upperLimit) {
$message = \sprintf(
@@ -2198,13 +2363,12 @@ class Assertion
/**
* Assert that extension is loaded.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function extensionLoaded($value, $message = null, $propertyPath = null)
+ public static function extensionLoaded($value, $message = null, string $propertyPath = null): bool
{
if (!\extension_loaded($value)) {
$message = \sprintf(
@@ -2221,22 +2385,21 @@ class Assertion
/**
* Assert that date is valid and corresponds to the given format.
*
- * @param string $value
- * @param string $format supports all of the options date(), except for the following:
- * N, w, W, t, L, o, B, a, A, g, h, I, O, P, Z, c, r
+ * @param string $value
+ * @param string $format supports all of the options date(), except for the following:
+ * N, w, W, t, L, o, B, a, A, g, h, I, O, P, Z, c, r
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*
* @see http://php.net/manual/function.date.php#refsect1-function.date-parameters
*/
- public static function date($value, $format, $message = null, $propertyPath = null)
+ public static function date($value, $format, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
static::string($format, $message, $propertyPath);
- $dateTime = \DateTime::createFromFormat('!'.$format, $value);
+ $dateTime = DateTime::createFromFormat('!'.$format, $value);
if (false === $dateTime || $value !== $dateTime->format($format)) {
$message = \sprintf(
@@ -2254,13 +2417,12 @@ class Assertion
/**
* Assert that the value is an object, or a class that exists.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function objectOrClass($value, $message = null, $propertyPath = null)
+ public static function objectOrClass($value, $message = null, string $propertyPath = null): bool
{
if (!\is_object($value)) {
static::classExists($value, $message, $propertyPath);
@@ -2272,14 +2434,13 @@ class Assertion
/**
* Assert that the value is an object or class, and that the property exists.
*
- * @param mixed $value
- * @param string $property
+ * @param mixed $value
+ * @param string $property
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function propertyExists($value, $property, $message = null, $propertyPath = null)
+ public static function propertyExists($value, $property, $message = null, string $propertyPath = null): bool
{
static::objectOrClass($value);
@@ -2299,14 +2460,12 @@ class Assertion
/**
* Assert that the value is an object or class, and that the properties all exist.
*
- * @param mixed $value
- * @param array $properties
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function propertiesExist($value, array $properties, $message = null, $propertyPath = null)
+ public static function propertiesExist($value, array $properties, $message = null, string $propertyPath = null): bool
{
static::objectOrClass($value);
static::allString($properties, $message, $propertyPath);
@@ -2334,15 +2493,14 @@ class Assertion
/**
* Assert comparison of two versions.
*
- * @param string $version1
- * @param string $operator
- * @param string $version2
+ * @param string $version1
+ * @param string $operator
+ * @param string $version2
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function version($version1, $operator, $version2, $message = null, $propertyPath = null)
+ public static function version($version1, $operator, $version2, $message = null, string $propertyPath = null): bool
{
static::notEmpty($operator, 'versionCompare operator is required and cannot be empty.');
@@ -2363,14 +2521,13 @@ class Assertion
/**
* Assert on PHP version.
*
- * @param string $operator
- * @param mixed $version
+ * @param string $operator
+ * @param mixed $version
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function phpVersion($operator, $version, $message = null, $propertyPath = null)
+ public static function phpVersion($operator, $version, $message = null, string $propertyPath = null): bool
{
static::defined('PHP_VERSION');
@@ -2380,15 +2537,14 @@ class Assertion
/**
* Assert that extension is loaded and a specific version is installed.
*
- * @param string $extension
- * @param string $operator
- * @param mixed $version
+ * @param string $extension
+ * @param string $operator
+ * @param mixed $version
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function extensionVersion($extension, $operator, $version, $message = null, $propertyPath = null)
+ public static function extensionVersion($extension, $operator, $version, $message = null, string $propertyPath = null): bool
{
static::extensionLoaded($extension, $message, $propertyPath);
@@ -2398,13 +2554,17 @@ class Assertion
/**
* Determines that the provided value is callable.
*
- * @param mixed $value
+ * @param mixed $value
* @param string|callable|null $message
- * @param string|null $propertyPath
+ * @param string|null $propertyPath
+ *
+ * @psalm-assert callable $value
*
* @return bool
+ *
+ * @throws AssertionFailedException
*/
- public static function isCallable($value, $message = null, $propertyPath = null)
+ public static function isCallable($value, $message = null, string $propertyPath = null): bool
{
if (!\is_callable($value)) {
$message = \sprintf(
@@ -2423,14 +2583,13 @@ class Assertion
*
* If the callback returns `false` the assertion will fail.
*
- * @param mixed $value
- * @param callable $callback
+ * @param mixed $value
+ * @param callable $callback
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function satisfy($value, $callback, $message = null, $propertyPath = null)
+ public static function satisfy($value, $callback, $message = null, string $propertyPath = null): bool
{
static::isCallable($callback);
@@ -2450,19 +2609,23 @@ class Assertion
* Assert that value is an IPv4 or IPv6 address
* (using input_filter/FILTER_VALIDATE_IP).
*
- * @param string $value
- * @param int|null $flag
+ * @param string $value
+ * @param int|null $flag
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*
* @see http://php.net/manual/filter.filters.flags.php
*/
- public static function ip($value, $flag = null, $message = null, $propertyPath = null)
+ public static function ip($value, $flag = null, $message = null, string $propertyPath = null): bool
{
static::string($value, $message, $propertyPath);
- if (!\filter_var($value, FILTER_VALIDATE_IP, $flag)) {
+ if ($flag === null) {
+ $filterVarResult = \filter_var($value, FILTER_VALIDATE_IP);
+ } else {
+ $filterVarResult = \filter_var($value, FILTER_VALIDATE_IP, $flag);
+ }
+ if (!$filterVarResult) {
$message = \sprintf(
static::generateMessage($message ?: 'Value "%s" was expected to be a valid IP address.'),
static::stringify($value)
@@ -2477,16 +2640,15 @@ class Assertion
* Assert that value is an IPv4 address
* (using input_filter/FILTER_VALIDATE_IP).
*
- * @param string $value
- * @param int|null $flag
+ * @param string $value
+ * @param int|null $flag
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*
* @see http://php.net/manual/filter.filters.flags.php
*/
- public static function ipv4($value, $flag = null, $message = null, $propertyPath = null)
+ public static function ipv4($value, $flag = null, $message = null, string $propertyPath = null): bool
{
static::ip($value, $flag | FILTER_FLAG_IPV4, static::generateMessage($message ?: 'Value "%s" was expected to be a valid IPv4 address.'), $propertyPath);
@@ -2497,16 +2659,15 @@ class Assertion
* Assert that value is an IPv6 address
* (using input_filter/FILTER_VALIDATE_IP).
*
- * @param string $value
- * @param int|null $flag
+ * @param string $value
+ * @param int|null $flag
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*
* @see http://php.net/manual/filter.filters.flags.php
*/
- public static function ipv6($value, $flag = null, $message = null, $propertyPath = null)
+ public static function ipv6($value, $flag = null, $message = null, string $propertyPath = null): bool
{
static::ip($value, $flag | FILTER_FLAG_IPV6, static::generateMessage($message ?: 'Value "%s" was expected to be a valid IPv6 address.'), $propertyPath);
@@ -2516,13 +2677,10 @@ class Assertion
/**
* Assert that a constant is defined.
*
- * @param mixed $constant
+ * @param mixed $constant
* @param string|callable|null $message
- * @param string|null $propertyPath
- *
- * @return bool
*/
- public static function defined($constant, $message = null, $propertyPath = null)
+ public static function defined($constant, $message = null, string $propertyPath = null): bool
{
if (!\defined($constant)) {
$message = \sprintf(static::generateMessage($message ?: 'Value "%s" expected to be a defined constant.'), $constant);
@@ -2536,13 +2694,12 @@ class Assertion
/**
* Assert that a constant is defined.
*
- * @param string $value
+ * @param string $value
* @param string|callable|null $message
- * @param string|null $propertyPath
*
- * @return bool
+ * @throws AssertionFailedException
*/
- public static function base64($value, $message = null, $propertyPath = null)
+ public static function base64($value, $message = null, string $propertyPath = null): bool
{
if (false === \base64_decode($value, true)) {
$message = \sprintf(static::generateMessage($message ?: 'Value "%s" is not a valid base64 string.'), $value);
@@ -2558,11 +2715,9 @@ class Assertion
* They are returned from this method so that the stack trace still shows
* the assertions method.
*
- * @param mixed $value
- * @param string|callable $message
- * @param int $code
- * @param string|null $propertyPath
- * @param array $constraints
+ * @param mixed $value
+ * @param string|callable|null $message
+ * @param int $code
*
* @return mixed
*/
@@ -2577,20 +2732,18 @@ class Assertion
* Make a string version of a value.
*
* @param mixed $value
- *
- * @return string
*/
- protected static function stringify($value)
+ protected static function stringify($value): string
{
$result = \gettype($value);
if (\is_bool($value)) {
$result = $value ? '<TRUE>' : '<FALSE>';
} elseif (\is_scalar($value)) {
- $val = (string) $value;
+ $val = (string)$value;
- if (\strlen($val) > 100) {
- $val = \substr($val, 0, 97).'...';
+ if (\mb_strlen($val) > 100) {
+ $val = \mb_substr($val, 0, 97).'...';
}
$result = $val;
@@ -2610,9 +2763,7 @@ class Assertion
/**
* Generate the message.
*
- * @param string|callable $message
- *
- * @return string
+ * @param string|callable|null $message
*/
protected static function generateMessage($message): string
{
@@ -2622,7 +2773,7 @@ class Assertion
$parameters = [];
try {
- $reflection = new \ReflectionClass($traces[1]['class']);
+ $reflection = new ReflectionClass($traces[1]['class']);
$method = $reflection->getMethod($traces[1]['function']);
foreach ($method->getParameters() as $index => $parameter) {
if ('message' !== $parameter->getName()) {
@@ -2636,11 +2787,11 @@ class Assertion
$message = \call_user_func_array($message, [$parameters]);
} // @codeCoverageIgnoreStart
- catch (\Throwable $exception) {
+ catch (Throwable $exception) {
$message = \sprintf('Unable to generate message : %s', $exception->getMessage());
} // @codeCoverageIgnoreEnd
}
- return (string) $message;
+ return (string)$message;
}
}
diff --git a/vendor/beberlei/assert/lib/Assert/AssertionChain.php b/vendor/beberlei/assert/lib/Assert/AssertionChain.php
index 4d3ca1c01..4c444350f 100644
--- a/vendor/beberlei/assert/lib/Assert/AssertionChain.php
+++ b/vendor/beberlei/assert/lib/Assert/AssertionChain.php
@@ -15,7 +15,6 @@
namespace Assert;
use LogicException;
-use ReflectionClass;
/**
* Chaining builder for assertions.
@@ -24,15 +23,15 @@ use ReflectionClass;
*
* @method AssertionChain alnum(string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric.
* @method AssertionChain base64(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
- * @method AssertionChain between(mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
- * @method AssertionChain betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
+ * @method AssertionChain between(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
+ * @method AssertionChain betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
* @method AssertionChain betweenLength(int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths.
* @method AssertionChain boolean(string|callable $message = null, string $propertyPath = null) Assert that value is php boolean.
* @method AssertionChain choice(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices.
* @method AssertionChain choicesNotEmpty(array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content.
* @method AssertionChain classExists(string|callable $message = null, string $propertyPath = null) Assert that the class exists.
* @method AssertionChain contains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars.
- * @method AssertionChain count(int $count, string $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
+ * @method AssertionChain count(int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
* @method AssertionChain date(string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format.
* @method AssertionChain defined(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
* @method AssertionChain digit(string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit.
@@ -73,23 +72,23 @@ use ReflectionClass;
* @method AssertionChain lessOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit.
* @method AssertionChain lessThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit.
* @method AssertionChain max(mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit.
- * @method AssertionChain maxCount(int $count, string $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
+ * @method AssertionChain maxCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
* @method AssertionChain maxLength(int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars.
* @method AssertionChain methodExists(mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object.
* @method AssertionChain min(mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit.
- * @method AssertionChain minCount(int $count, string $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
+ * @method AssertionChain minCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
* @method AssertionChain minLength(int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long.
* @method AssertionChain noContent(string|callable $message = null, string $propertyPath = null) Assert that value is empty.
* @method AssertionChain notBlank(string|callable $message = null, string $propertyPath = null) Assert that value is not blank.
* @method AssertionChain notContains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars.
* @method AssertionChain notEmpty(string|callable $message = null, string $propertyPath = null) Assert that value is not empty.
* @method AssertionChain notEmptyKey(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty.
- * @method AssertionChain notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using == ).
+ * @method AssertionChain notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==).
* @method AssertionChain notInArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices.
* @method AssertionChain notIsInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name.
* @method AssertionChain notNull(string|callable $message = null, string $propertyPath = null) Assert that value is not null.
* @method AssertionChain notRegex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex.
- * @method AssertionChain notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using === ).
+ * @method AssertionChain notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===).
* @method AssertionChain null(string|callable $message = null, string $propertyPath = null) Assert that value is null.
* @method AssertionChain numeric(string|callable $message = null, string $propertyPath = null) Assert that value is numeric.
* @method AssertionChain objectOrClass(string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists.
@@ -106,6 +105,7 @@ use ReflectionClass;
* @method AssertionChain string(string|callable $message = null, string $propertyPath = null) Assert that value is a string.
* @method AssertionChain subclassOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name.
* @method AssertionChain true(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True.
+ * @method AssertionChain uniqueValues(string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality).
* @method AssertionChain url(string|callable $message = null, string $propertyPath = null) Assert that value is an URL.
* @method AssertionChain uuid(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID.
* @method AssertionChain version(string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions.
@@ -113,8 +113,19 @@ use ReflectionClass;
*/
class AssertionChain
{
+ /**
+ * @var mixed
+ */
private $value;
+
+ /**
+ * @var string|callable|null
+ */
private $defaultMessage;
+
+ /**
+ * @var string|null
+ */
private $defaultPropertyPath;
/**
@@ -134,7 +145,13 @@ class AssertionChain
/** @var string|Assertion Class to use for assertion calls */
private $assertionClassName = 'Assert\Assertion';
- public function __construct($value, $defaultMessage = null, $defaultPropertyPath = null)
+ /**
+ * AssertionChain constructor.
+ *
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ */
+ public function __construct($value, $defaultMessage = null, string $defaultPropertyPath = null)
{
$this->value = $value;
$this->defaultMessage = $defaultMessage;
@@ -145,23 +162,20 @@ class AssertionChain
* Call assertion on the current value in the chain.
*
* @param string $methodName
- * @param array $args
- *
- * @return \Assert\AssertionChain
+ * @param array $args
*/
- public function __call($methodName, $args)
+ public function __call($methodName, $args): AssertionChain
{
if (true === $this->alwaysValid) {
return $this;
}
- if (!\method_exists($this->assertionClassName, $methodName)) {
+ try {
+ $method = new \ReflectionMethod($this->assertionClassName, $methodName);
+ } catch (\ReflectionException $exception) {
throw new \RuntimeException("Assertion '".$methodName."' does not exist.");
}
- $reflClass = new ReflectionClass($this->assertionClassName);
- $method = $reflClass->getMethod($methodName);
-
\array_unshift($args, $this->value);
$params = $method->getParameters();
@@ -170,12 +184,13 @@ class AssertionChain
continue;
}
- if ('message' == $param->getName()) {
- $args[$idx] = $this->defaultMessage;
- }
-
- if ('propertyPath' == $param->getName()) {
- $args[$idx] = $this->defaultPropertyPath;
+ switch ($param->getName()) {
+ case 'message':
+ $args[$idx] = $this->defaultMessage;
+ break;
+ case 'propertyPath':
+ $args[$idx] = $this->defaultPropertyPath;
+ break;
}
}
@@ -190,10 +205,8 @@ class AssertionChain
/**
* Switch chain into validation mode for an array of values.
- *
- * @return \Assert\AssertionChain
*/
- public function all()
+ public function all(): AssertionChain
{
$this->all = true;
@@ -202,10 +215,8 @@ class AssertionChain
/**
* Switch chain into mode allowing nulls, ignoring further assertions.
- *
- * @return \Assert\AssertionChain
*/
- public function nullOr()
+ public function nullOr(): AssertionChain
{
if (null === $this->value) {
$this->alwaysValid = true;
@@ -219,7 +230,7 @@ class AssertionChain
*
* @return $this
*/
- public function setAssertionClassName($className)
+ public function setAssertionClassName($className): AssertionChain
{
if (!\is_string($className)) {
throw new LogicException('Exception class name must be passed as a string');
diff --git a/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php b/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php
index e895aa8e5..7e0b2ec3d 100644
--- a/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php
+++ b/vendor/beberlei/assert/lib/Assert/AssertionFailedException.php
@@ -18,9 +18,15 @@ use Throwable;
interface AssertionFailedException extends Throwable
{
+ /**
+ * @return string|null
+ */
public function getPropertyPath();
+ /**
+ * @return mixed
+ */
public function getValue();
- public function getConstraints();
+ public function getConstraints(): array;
}
diff --git a/vendor/beberlei/assert/lib/Assert/InvalidArgumentException.php b/vendor/beberlei/assert/lib/Assert/InvalidArgumentException.php
index 20c890992..9516e0774 100644
--- a/vendor/beberlei/assert/lib/Assert/InvalidArgumentException.php
+++ b/vendor/beberlei/assert/lib/Assert/InvalidArgumentException.php
@@ -16,11 +16,22 @@ namespace Assert;
class InvalidArgumentException extends \InvalidArgumentException implements AssertionFailedException
{
+ /**
+ * @var string|null
+ */
private $propertyPath;
+
+ /**
+ * @var mixed
+ */
private $value;
+
+ /**
+ * @var array
+ */
private $constraints;
- public function __construct($message, $code, $propertyPath, $value, array $constraints = [])
+ public function __construct($message, $code, string $propertyPath = null, $value = null, array $constraints = [])
{
parent::__construct($message, $code);
@@ -36,7 +47,7 @@ class InvalidArgumentException extends \InvalidArgumentException implements Asse
* Useful to transport information about the nature of the error
* back to higher layers.
*
- * @return string
+ * @return string|null
*/
public function getPropertyPath()
{
@@ -55,10 +66,8 @@ class InvalidArgumentException extends \InvalidArgumentException implements Asse
/**
* Get the constraints that applied to the failed assertion.
- *
- * @return array
*/
- public function getConstraints()
+ public function getConstraints(): array
{
return $this->constraints;
}
diff --git a/vendor/beberlei/assert/lib/Assert/LazyAssertion.php b/vendor/beberlei/assert/lib/Assert/LazyAssertion.php
index abbaf4bcb..b3052178b 100644
--- a/vendor/beberlei/assert/lib/Assert/LazyAssertion.php
+++ b/vendor/beberlei/assert/lib/Assert/LazyAssertion.php
@@ -21,96 +21,97 @@ use LogicException;
*
* @author Benjamin Eberlei <[email protected]>
*
- * @method $this alnum(string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric.
- * @method $this base64(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
- * @method $this between(mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
- * @method $this betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
- * @method $this betweenLength(int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths.
- * @method $this boolean(string|callable $message = null, string $propertyPath = null) Assert that value is php boolean.
- * @method $this choice(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices.
- * @method $this choicesNotEmpty(array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content.
- * @method $this classExists(string|callable $message = null, string $propertyPath = null) Assert that the class exists.
- * @method $this contains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars.
- * @method $this count(int $count, string $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
- * @method $this date(string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format.
- * @method $this defined(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
- * @method $this digit(string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit.
- * @method $this directory(string|callable $message = null, string $propertyPath = null) Assert that a directory exists.
- * @method $this e164(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number.
- * @method $this email(string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
- * @method $this endsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars.
- * @method $this eq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==).
- * @method $this eqArraySubset(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset.
- * @method $this extensionLoaded(string|callable $message = null, string $propertyPath = null) Assert that extension is loaded.
- * @method $this extensionVersion(string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed.
- * @method $this false(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False.
- * @method $this file(string|callable $message = null, string $propertyPath = null) Assert that a file exists.
- * @method $this float(string|callable $message = null, string $propertyPath = null) Assert that value is a php float.
- * @method $this greaterOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit.
- * @method $this greaterThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit.
- * @method $this implementsInterface(string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface.
- * @method $this inArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice().
- * @method $this integer(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer.
- * @method $this integerish(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish.
- * @method $this interfaceExists(string|callable $message = null, string $propertyPath = null) Assert that the interface exists.
- * @method $this ip(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address.
- * @method $this ipv4(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address.
- * @method $this ipv6(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address.
- * @method $this isArray(string|callable $message = null, string $propertyPath = null) Assert that value is an array.
- * @method $this isArrayAccessible(string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object.
- * @method $this isCallable(string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable.
- * @method $this isCountable(string|callable $message = null, string $propertyPath = null) Assert that value is countable.
- * @method $this isInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name.
- * @method $this isJsonString(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string.
- * @method $this isObject(string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object.
- * @method $this isResource(string|callable $message = null, string $propertyPath = null) Assert that value is a resource.
- * @method $this isTraversable(string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object.
- * @method $this keyExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array.
- * @method $this keyIsset(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset().
- * @method $this keyNotExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array.
- * @method $this length(int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length.
- * @method $this lessOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit.
- * @method $this lessThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit.
- * @method $this max(mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit.
- * @method $this maxCount(int $count, string $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
- * @method $this maxLength(int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars.
- * @method $this methodExists(mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object.
- * @method $this min(mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit.
- * @method $this minCount(int $count, string $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
- * @method $this minLength(int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long.
- * @method $this noContent(string|callable $message = null, string $propertyPath = null) Assert that value is empty.
- * @method $this notBlank(string|callable $message = null, string $propertyPath = null) Assert that value is not blank.
- * @method $this notContains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars.
- * @method $this notEmpty(string|callable $message = null, string $propertyPath = null) Assert that value is not empty.
- * @method $this notEmptyKey(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty.
- * @method $this notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using == ).
- * @method $this notInArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices.
- * @method $this notIsInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name.
- * @method $this notNull(string|callable $message = null, string $propertyPath = null) Assert that value is not null.
- * @method $this notRegex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex.
- * @method $this notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using === ).
- * @method $this null(string|callable $message = null, string $propertyPath = null) Assert that value is null.
- * @method $this numeric(string|callable $message = null, string $propertyPath = null) Assert that value is numeric.
- * @method $this objectOrClass(string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists.
- * @method $this phpVersion(mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version.
- * @method $this propertiesExist(array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist.
- * @method $this propertyExists(string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists.
- * @method $this range(mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers.
- * @method $this readable(string|callable $message = null, string $propertyPath = null) Assert that the value is something readable.
- * @method $this regex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex.
- * @method $this same(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===).
- * @method $this satisfy(callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback.
- * @method $this scalar(string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar.
- * @method $this startsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars.
- * @method $this string(string|callable $message = null, string $propertyPath = null) Assert that value is a string.
- * @method $this subclassOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name.
- * @method $this true(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True.
- * @method $this url(string|callable $message = null, string $propertyPath = null) Assert that value is an URL.
- * @method $this uuid(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID.
- * @method $this version(string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions.
- * @method $this writeable(string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable.
- * @method $this all() Switch chain into validation mode for an array of values.
- * @method $this nullOr() Switch chain into mode allowing nulls, ignoring further assertions.
+ * @method LazyAssertion alnum(string|callable $message = null, string $propertyPath = null) Assert that value is alphanumeric.
+ * @method LazyAssertion base64(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method LazyAssertion between(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater or equal than a lower limit, and less than or equal to an upper limit.
+ * @method LazyAssertion betweenExclusive(mixed $lowerLimit, mixed $upperLimit, string|callable $message = null, string $propertyPath = null) Assert that a value is greater than a lower limit, and less than an upper limit.
+ * @method LazyAssertion betweenLength(int $minLength, int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string length is between min and max lengths.
+ * @method LazyAssertion boolean(string|callable $message = null, string $propertyPath = null) Assert that value is php boolean.
+ * @method LazyAssertion choice(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices.
+ * @method LazyAssertion choicesNotEmpty(array $choices, string|callable $message = null, string $propertyPath = null) Determines if the values array has every choice as key and that this choice has content.
+ * @method LazyAssertion classExists(string|callable $message = null, string $propertyPath = null) Assert that the class exists.
+ * @method LazyAssertion contains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string contains a sequence of chars.
+ * @method LazyAssertion count(int $count, string|callable $message = null, string $propertyPath = null) Assert that the count of countable is equal to count.
+ * @method LazyAssertion date(string $format, string|callable $message = null, string $propertyPath = null) Assert that date is valid and corresponds to the given format.
+ * @method LazyAssertion defined(string|callable $message = null, string $propertyPath = null) Assert that a constant is defined.
+ * @method LazyAssertion digit(string|callable $message = null, string $propertyPath = null) Validates if an integer or integerish is a digit.
+ * @method LazyAssertion directory(string|callable $message = null, string $propertyPath = null) Assert that a directory exists.
+ * @method LazyAssertion e164(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid E164 Phone Number.
+ * @method LazyAssertion email(string|callable $message = null, string $propertyPath = null) Assert that value is an email address (using input_filter/FILTER_VALIDATE_EMAIL).
+ * @method LazyAssertion endsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string ends with a sequence of chars.
+ * @method LazyAssertion eq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are equal (using ==).
+ * @method LazyAssertion eqArraySubset(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that the array contains the subset.
+ * @method LazyAssertion extensionLoaded(string|callable $message = null, string $propertyPath = null) Assert that extension is loaded.
+ * @method LazyAssertion extensionVersion(string $operator, mixed $version, string|callable $message = null, string $propertyPath = null) Assert that extension is loaded and a specific version is installed.
+ * @method LazyAssertion false(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean False.
+ * @method LazyAssertion file(string|callable $message = null, string $propertyPath = null) Assert that a file exists.
+ * @method LazyAssertion float(string|callable $message = null, string $propertyPath = null) Assert that value is a php float.
+ * @method LazyAssertion greaterOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater or equal than given limit.
+ * @method LazyAssertion greaterThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is greater than given limit.
+ * @method LazyAssertion implementsInterface(string $interfaceName, string|callable $message = null, string $propertyPath = null) Assert that the class implements the interface.
+ * @method LazyAssertion inArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is in array of choices. This is an alias of Assertion::choice().
+ * @method LazyAssertion integer(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer.
+ * @method LazyAssertion integerish(string|callable $message = null, string $propertyPath = null) Assert that value is a php integer'ish.
+ * @method LazyAssertion interfaceExists(string|callable $message = null, string $propertyPath = null) Assert that the interface exists.
+ * @method LazyAssertion ip(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 or IPv6 address.
+ * @method LazyAssertion ipv4(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv4 address.
+ * @method LazyAssertion ipv6(int $flag = null, string|callable $message = null, string $propertyPath = null) Assert that value is an IPv6 address.
+ * @method LazyAssertion isArray(string|callable $message = null, string $propertyPath = null) Assert that value is an array.
+ * @method LazyAssertion isArrayAccessible(string|callable $message = null, string $propertyPath = null) Assert that value is an array or an array-accessible object.
+ * @method LazyAssertion isCallable(string|callable $message = null, string $propertyPath = null) Determines that the provided value is callable.
+ * @method LazyAssertion isCountable(string|callable $message = null, string $propertyPath = null) Assert that value is countable.
+ * @method LazyAssertion isInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is instance of given class-name.
+ * @method LazyAssertion isJsonString(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid json string.
+ * @method LazyAssertion isObject(string|callable $message = null, string $propertyPath = null) Determines that the provided value is an object.
+ * @method LazyAssertion isResource(string|callable $message = null, string $propertyPath = null) Assert that value is a resource.
+ * @method LazyAssertion isTraversable(string|callable $message = null, string $propertyPath = null) Assert that value is an array or a traversable object.
+ * @method LazyAssertion keyExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array.
+ * @method LazyAssertion keyIsset(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object using isset().
+ * @method LazyAssertion keyNotExists(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key does not exist in an array.
+ * @method LazyAssertion length(int $length, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string has a given length.
+ * @method LazyAssertion lessOrEqualThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less or equal than given limit.
+ * @method LazyAssertion lessThan(mixed $limit, string|callable $message = null, string $propertyPath = null) Determines if the value is less than given limit.
+ * @method LazyAssertion max(mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that a number is smaller as a given limit.
+ * @method LazyAssertion maxCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at most $count elements.
+ * @method LazyAssertion maxLength(int $maxLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string value is not longer than $maxLength chars.
+ * @method LazyAssertion methodExists(mixed $object, string|callable $message = null, string $propertyPath = null) Determines that the named method is defined in the provided object.
+ * @method LazyAssertion min(mixed $minValue, string|callable $message = null, string $propertyPath = null) Assert that a value is at least as big as a given limit.
+ * @method LazyAssertion minCount(int $count, string|callable $message = null, string $propertyPath = null) Assert that the countable have at least $count elements.
+ * @method LazyAssertion minLength(int $minLength, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that a string is at least $minLength chars long.
+ * @method LazyAssertion noContent(string|callable $message = null, string $propertyPath = null) Assert that value is empty.
+ * @method LazyAssertion notBlank(string|callable $message = null, string $propertyPath = null) Assert that value is not blank.
+ * @method LazyAssertion notContains(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string does not contains a sequence of chars.
+ * @method LazyAssertion notEmpty(string|callable $message = null, string $propertyPath = null) Assert that value is not empty.
+ * @method LazyAssertion notEmptyKey(string|int $key, string|callable $message = null, string $propertyPath = null) Assert that key exists in an array/array-accessible object and its value is not empty.
+ * @method LazyAssertion notEq(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not equal (using ==).
+ * @method LazyAssertion notInArray(array $choices, string|callable $message = null, string $propertyPath = null) Assert that value is not in array of choices.
+ * @method LazyAssertion notIsInstanceOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is not instance of given class-name.
+ * @method LazyAssertion notNull(string|callable $message = null, string $propertyPath = null) Assert that value is not null.
+ * @method LazyAssertion notRegex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value does not match a regex.
+ * @method LazyAssertion notSame(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are not the same (using ===).
+ * @method LazyAssertion null(string|callable $message = null, string $propertyPath = null) Assert that value is null.
+ * @method LazyAssertion numeric(string|callable $message = null, string $propertyPath = null) Assert that value is numeric.
+ * @method LazyAssertion objectOrClass(string|callable $message = null, string $propertyPath = null) Assert that the value is an object, or a class that exists.
+ * @method LazyAssertion phpVersion(mixed $version, string|callable $message = null, string $propertyPath = null) Assert on PHP version.
+ * @method LazyAssertion propertiesExist(array $properties, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the properties all exist.
+ * @method LazyAssertion propertyExists(string $property, string|callable $message = null, string $propertyPath = null) Assert that the value is an object or class, and that the property exists.
+ * @method LazyAssertion range(mixed $minValue, mixed $maxValue, string|callable $message = null, string $propertyPath = null) Assert that value is in range of numbers.
+ * @method LazyAssertion readable(string|callable $message = null, string $propertyPath = null) Assert that the value is something readable.
+ * @method LazyAssertion regex(string $pattern, string|callable $message = null, string $propertyPath = null) Assert that value matches a regex.
+ * @method LazyAssertion same(mixed $value2, string|callable $message = null, string $propertyPath = null) Assert that two values are the same (using ===).
+ * @method LazyAssertion satisfy(callable $callback, string|callable $message = null, string $propertyPath = null) Assert that the provided value is valid according to a callback.
+ * @method LazyAssertion scalar(string|callable $message = null, string $propertyPath = null) Assert that value is a PHP scalar.
+ * @method LazyAssertion startsWith(string $needle, string|callable $message = null, string $propertyPath = null, string $encoding = 'utf8') Assert that string starts with a sequence of chars.
+ * @method LazyAssertion string(string|callable $message = null, string $propertyPath = null) Assert that value is a string.
+ * @method LazyAssertion subclassOf(string $className, string|callable $message = null, string $propertyPath = null) Assert that value is subclass of given class-name.
+ * @method LazyAssertion true(string|callable $message = null, string $propertyPath = null) Assert that the value is boolean True.
+ * @method LazyAssertion uniqueValues(string|callable $message = null, string $propertyPath = null) Assert that values in array are unique (using strict equality).
+ * @method LazyAssertion url(string|callable $message = null, string $propertyPath = null) Assert that value is an URL.
+ * @method LazyAssertion uuid(string|callable $message = null, string $propertyPath = null) Assert that the given string is a valid UUID.
+ * @method LazyAssertion version(string $operator, string $version2, string|callable $message = null, string $propertyPath = null) Assert comparison of two versions.
+ * @method LazyAssertion writeable(string|callable $message = null, string $propertyPath = null) Assert that the value is something writeable.
+ * @method LazyAssertion all() Switch chain into validation mode for an array of values.
+ * @method LazyAssertion nullOr() Switch chain into mode allowing nulls, ignoring further assertions.
*/
class LazyAssertion
{
@@ -127,9 +128,12 @@ class LazyAssertion
private $exceptionClass = LazyAssertionException::class;
/**
- * @return $this
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ *
+ * @return static
*/
- public function that($value, $propertyPath, $defaultMessage = null)
+ public function that($value, string $propertyPath = null, $defaultMessage = null)
{
$this->currentChainFailed = false;
$this->thisChainTryAll = false;
@@ -140,7 +144,7 @@ class LazyAssertion
}
/**
- * @return $this
+ * @return static
*/
public function tryAll()
{
@@ -153,6 +157,12 @@ class LazyAssertion
return $this;
}
+ /**
+ * @param string $method
+ * @param array $args
+ *
+ * @return static
+ */
public function __call($method, $args)
{
if (false === $this->alwaysTryAll
@@ -174,10 +184,8 @@ class LazyAssertion
/**
* @throws LazyAssertionException
- *
- * @return bool
*/
- public function verifyNow()
+ public function verifyNow(): bool
{
if ($this->errors) {
throw \call_user_func([$this->exceptionClass, 'fromErrors'], $this->errors);
@@ -189,12 +197,12 @@ class LazyAssertion
/**
* @param string $className
*
- * @return $this
+ * @return static
*/
- public function setAssertClass(string $className)
+ public function setAssertClass(string $className): LazyAssertion
{
if (Assert::class !== $className && !\is_subclass_of($className, Assert::class)) {
- throw new LogicException($className.' is not (a subclass of) '. Assert::class);
+ throw new LogicException($className.' is not (a subclass of) '.Assert::class);
}
$this->assertClass = $className;
@@ -205,9 +213,9 @@ class LazyAssertion
/**
* @param string $className
*
- * @return $this
+ * @return static
*/
- public function setExceptionClass(string $className)
+ public function setExceptionClass(string $className): LazyAssertion
{
if (LazyAssertionException::class !== $className && !\is_subclass_of($className, LazyAssertionException::class)) {
throw new LogicException($className.' is not (a subclass of) '.LazyAssertionException::class);
diff --git a/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php b/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php
index 0a834c1cb..2ba59dd7c 100644
--- a/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php
+++ b/vendor/beberlei/assert/lib/Assert/LazyAssertionException.php
@@ -23,10 +23,8 @@ class LazyAssertionException extends InvalidArgumentException
/**
* @param InvalidArgumentException[] $errors
- *
- * @return self
*/
- public static function fromErrors(array $errors)
+ public static function fromErrors(array $errors): self
{
$message = \sprintf('The following %d assertions failed:', \count($errors))."\n";
@@ -45,7 +43,10 @@ class LazyAssertionException extends InvalidArgumentException
$this->errors = $errors;
}
- public function getErrorExceptions()
+ /**
+ * @return InvalidArgumentException[]
+ */
+ public function getErrorExceptions(): array
{
return $this->errors;
}
diff --git a/vendor/beberlei/assert/lib/Assert/functions.php b/vendor/beberlei/assert/lib/Assert/functions.php
index 67bb6315e..1a4e84d92 100644
--- a/vendor/beberlei/assert/lib/Assert/functions.php
+++ b/vendor/beberlei/assert/lib/Assert/functions.php
@@ -20,6 +20,10 @@ namespace Assert;
* The invocation of this method starts an assertion chain
* that is happening on the passed value.
*
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
+ * @param string $defaultPropertyPath
+ *
* @example
*
* \Assert\that($value)->notEmpty()->integer();
@@ -27,14 +31,8 @@ namespace Assert;
*
* The assertion chain can be stateful, that means be careful when you reuse
* it. You should never pass around the chain.
- *
- * @param mixed $value
- * @param string $defaultMessage
- * @param string $defaultPropertyPath
- *
- * @return \Assert\AssertionChain
*/
-function that($value, $defaultMessage = null, $defaultPropertyPath = null)
+function that($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
return Assert::that($value, $defaultMessage, $defaultPropertyPath);
}
@@ -42,13 +40,11 @@ function that($value, $defaultMessage = null, $defaultPropertyPath = null)
/**
* Start validation on a set of values, returns {@link AssertionChain}.
*
- * @param mixed $values
- * @param string $defaultMessage
+ * @param mixed $values
+ * @param string|callable|null $defaultMessage
* @param string $defaultPropertyPath
- *
- * @return \Assert\AssertionChain
*/
-function thatAll($values, $defaultMessage = null, $defaultPropertyPath = null)
+function thatAll($values, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
return Assert::thatAll($values, $defaultMessage, $defaultPropertyPath);
}
@@ -56,25 +52,21 @@ function thatAll($values, $defaultMessage = null, $defaultPropertyPath = null)
/**
* Start validation and allow NULL, returns {@link AssertionChain}.
*
- * @param mixed $value
- * @param string $defaultMessage
+ * @param mixed $value
+ * @param string|callable|null $defaultMessage
* @param string $defaultPropertyPath
*
- * @return \Assert\AssertionChain
- *
* @deprecated In favour of Assert::thatNullOr($value, $defaultMessage = null, $defaultPropertyPath = null)
*/
-function thatNullOr($value, $defaultMessage = null, $defaultPropertyPath = null)
+function thatNullOr($value, $defaultMessage = null, string $defaultPropertyPath = null): AssertionChain
{
return Assert::thatNullOr($value, $defaultMessage, $defaultPropertyPath);
}
/**
* Create a lazy assertion object.
- *
- * @return \Assert\LazyAssertion
*/
-function lazy()
+function lazy(): LazyAssertion
{
return Assert::lazy();
}
diff --git a/vendor/beberlei/assert/phpstan-code.neon b/vendor/beberlei/assert/phpstan-code.neon
deleted file mode 100644
index 630379dbe..000000000
--- a/vendor/beberlei/assert/phpstan-code.neon
+++ /dev/null
@@ -1,3 +0,0 @@
-parameters:
- autoload_files:
- - bin/MethodDocGenerator.php
diff --git a/vendor/beberlei/assert/phpstan-tests.neon b/vendor/beberlei/assert/phpstan-tests.neon
deleted file mode 100644
index e9ab0bcf9..000000000
--- a/vendor/beberlei/assert/phpstan-tests.neon
+++ /dev/null
@@ -1,10 +0,0 @@
-parameters:
- ignoreErrors:
- # The following errors are ignored as they are testing for errors and exceptions that static analysis correctly identifies as problems.
- - '#Call to an undefined method Assert\\AssertionChain::unknownAssertion\(\)#'
- - '#Call to an undefined static method Assert\\Assertion::nullOrAssertionDoesNotExist\(\)#'
- - '#Class Foo not found#'
- - '#Parameter \#1 $value of static method Assert\\Assertion::isCountable\(\) expects array|Countable|ResourceBundle|SimpleXMLElement, string given#'
- - '#Parameter \#2 \$operator of static method Assert\\Assertion::version\(\) expects string, null given#'
- - '#Static method Assert\\Assertion::allTrue\(\) invoked with 0 parameters, 1-3 required#'
- - '#Static method Assert\\Assertion::nullOrMax\(\) invoked with 0 parameters, 2-4 required#'
diff --git a/vendor/bin/phpunit b/vendor/bin/phpunit
index 2c4893031..e92cddc50 120000..100755
--- a/vendor/bin/phpunit
+++ b/vendor/bin/phpunit
@@ -1 +1,123 @@
-../phpunit/phpunit/phpunit \ No newline at end of file
+#!/usr/bin/env php
+<?php
+
+/**
+ * Proxy PHP file generated by Composer
+ *
+ * This file includes the referenced bin path (../phpunit/phpunit/phpunit)
+ * using a stream wrapper to prevent the shebang from being output on PHP<8
+ *
+ * @generated
+ */
+
+namespace Composer;
+
+$GLOBALS['_composer_bin_dir'] = __DIR__;
+$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
+$GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'] = $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'] = array(realpath(__DIR__ . '/..'.'/phpunit/phpunit/phpunit'));
+
+if (PHP_VERSION_ID < 80000) {
+ if (!class_exists('Composer\BinProxyWrapper')) {
+ /**
+ * @internal
+ */
+ final class BinProxyWrapper
+ {
+ private $handle;
+ private $position;
+ private $realpath;
+
+ public function stream_open($path, $mode, $options, &$opened_path)
+ {
+ // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
+ $opened_path = substr($path, 17);
+ $this->realpath = realpath($opened_path) ?: $opened_path;
+ $opened_path = 'phpvfscomposer://'.$this->realpath;
+ $this->handle = fopen($this->realpath, $mode);
+ $this->position = 0;
+
+ return (bool) $this->handle;
+ }
+
+ public function stream_read($count)
+ {
+ $data = fread($this->handle, $count);
+
+ if ($this->position === 0) {
+ $data = preg_replace('{^#!.*\r?\n}', '', $data);
+ }
+ $data = str_replace('__DIR__', var_export(dirname($this->realpath), true), $data);
+ $data = str_replace('__FILE__', var_export($this->realpath, true), $data);
+
+ $this->position += strlen($data);
+
+ return $data;
+ }
+
+ public function stream_cast($castAs)
+ {
+ return $this->handle;
+ }
+
+ public function stream_close()
+ {
+ fclose($this->handle);
+ }
+
+ public function stream_lock($operation)
+ {
+ return $operation ? flock($this->handle, $operation) : true;
+ }
+
+ public function stream_seek($offset, $whence)
+ {
+ if (0 === fseek($this->handle, $offset, $whence)) {
+ $this->position = ftell($this->handle);
+ return true;
+ }
+
+ return false;
+ }
+
+ public function stream_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return array();
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+
+ public function url_stat($path, $flags)
+ {
+ $path = substr($path, 17);
+ if (file_exists($path)) {
+ return stat($path);
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
+ include("phpvfscomposer://" . __DIR__ . '/..'.'/phpunit/phpunit/phpunit');
+ exit(0);
+ }
+}
+
+include __DIR__ . '/..'.'/phpunit/phpunit/phpunit';
diff --git a/vendor/chillerlan/php-qrcode/.github/FUNDING.yml b/vendor/chillerlan/php-qrcode/.github/FUNDING.yml
index fc89a6739..16a077f52 100644
--- a/vendor/chillerlan/php-qrcode/.github/FUNDING.yml
+++ b/vendor/chillerlan/php-qrcode/.github/FUNDING.yml
@@ -1 +1,2 @@
ko_fi: codemasher
+custom: "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4"
diff --git a/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml b/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml
index 991e6503c..9b26bb201 100644
--- a/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml
+++ b/vendor/chillerlan/php-qrcode/.github/workflows/tests.yml
@@ -2,8 +2,12 @@
# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml
on:
- - pull_request
- - push
+ push:
+ branches:
+ - v4.3.x
+ pull_request:
+ branches:
+ - v4.3.x
name: "Continuous Integration"
@@ -20,7 +24,7 @@ jobs:
steps:
- name: "Checkout"
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: "Install PHP"
uses: shivammathur/setup-php@v2
@@ -46,16 +50,19 @@ jobs:
matrix:
os:
- ubuntu-latest
-# - windows-latest
+ - windows-latest
php-version:
- - "7.2"
- - "7.3"
- "7.4"
- "8.0"
+ - "8.1"
steps:
+# - name: "Configure git to avoid issues with line endings"
+# if: matrix.os == 'windows-latest'
+# run: git config --global core.autocrlf false
+
- name: "Checkout"
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: "Install PHP with extensions"
uses: shivammathur/setup-php@v2
@@ -69,9 +76,7 @@ jobs:
run: composer update --no-ansi --no-interaction --no-progress --no-suggest
- name: "Run tests with phpunit"
- run: php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml
+ run: php vendor/bin/phpunit --configuration=phpunit.xml
- name: "Send code coverage report to Codecov.io"
- uses: codecov/codecov-action@v1
- with:
- token: ${{ secrets.CODECOV_TOKEN }}
+ uses: codecov/codecov-action@v3
diff --git a/vendor/chillerlan/php-qrcode/.gitignore b/vendor/chillerlan/php-qrcode/.gitignore
index ecebb9964..8f74009cd 100644
--- a/vendor/chillerlan/php-qrcode/.gitignore
+++ b/vendor/chillerlan/php-qrcode/.gitignore
@@ -1,5 +1,5 @@
.build/*
.idea/*
+docs/*
vendor/*
composer.lock
-*.phpunit.result.cache
diff --git a/vendor/chillerlan/php-qrcode/.phan/config.php b/vendor/chillerlan/php-qrcode/.phan/config.php
new file mode 100644
index 000000000..442d5f7d5
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/.phan/config.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * This configuration will be read and overlaid on top of the
+ * default configuration. Command-line arguments will be applied
+ * after this file is read.
+ */
+return [
+ // Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`,
+ // `'7.4'`, `null`.
+ // If this is set to `null`,
+ // then Phan assumes the PHP version which is closest to the minor version
+ // of the php executable used to execute Phan.
+ //
+ // Note that the **only** effect of choosing `'5.6'` is to infer
+ // that functions removed in php 7.0 exist.
+ // (See `backward_compatibility_checks` for additional options)
+ 'target_php_version' => '7.4',
+
+ // A list of directories that should be parsed for class and
+ // method information. After excluding the directories
+ // defined in exclude_analysis_directory_list, the remaining
+ // files will be statically analyzed for errors.
+ //
+ // Thus, both first-party and third-party code being used by
+ // your application should be included in this list.
+ 'directory_list' => [
+ 'examples',
+ 'src',
+ 'tests',
+ 'vendor',
+ '.phan/stubs'
+ ],
+
+ // A regex used to match every file name that you want to
+ // exclude from parsing. Actual value will exclude every
+ // "test", "tests", "Test" and "Tests" folders found in
+ // "vendor/" directory.
+ 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
+
+ // A directory list that defines files that will be excluded
+ // from static analysis, but whose class and method
+ // information should be included.
+ //
+ // Generally, you'll want to include the directories for
+ // third-party code (such as "vendor/") in this list.
+ //
+ // n.b.: If you'd like to parse but not analyze 3rd
+ // party code, directories containing that code
+ // should be added to both the `directory_list`
+ // and `exclude_analysis_directory_list` arrays.
+ 'exclude_analysis_directory_list' => [
+ 'vendor/',
+ '.phan/stubs'
+ ],
+];
diff --git a/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php b/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php
new file mode 100644
index 000000000..508d2018f
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/.phan/stubs/imagick.php
@@ -0,0 +1,6744 @@
+<?php
+
+// Start of imagick v.3.4.3
+
+class ImagickException extends Exception {
+}
+
+class ImagickDrawException extends Exception {
+}
+
+class ImagickPixelIteratorException extends Exception {
+}
+
+class ImagickPixelException extends Exception {
+}
+
+/**
+ * @method Imagick clone() (PECL imagick 2.0.0)<br/>Makes an exact copy of the Imagick object
+ * @link https://php.net/manual/en/class.imagick.php
+ */
+class Imagick implements Iterator, Countable {
+ const COLOR_BLACK = 11;
+ const COLOR_BLUE = 12;
+ const COLOR_CYAN = 13;
+ const COLOR_GREEN = 14;
+ const COLOR_RED = 15;
+ const COLOR_YELLOW = 16;
+ const COLOR_MAGENTA = 17;
+ const COLOR_OPACITY = 18;
+ const COLOR_ALPHA = 19;
+ const COLOR_FUZZ = 20;
+ const IMAGICK_EXTNUM = 30403;
+ const IMAGICK_EXTVER = "3.4.3";
+ const QUANTUM_RANGE = 65535;
+ const USE_ZEND_MM = 0;
+ const COMPOSITE_DEFAULT = 40;
+ const COMPOSITE_UNDEFINED = 0;
+ const COMPOSITE_NO = 1;
+ const COMPOSITE_ADD = 2;
+ const COMPOSITE_ATOP = 3;
+ const COMPOSITE_BLEND = 4;
+ const COMPOSITE_BUMPMAP = 5;
+ const COMPOSITE_CLEAR = 7;
+ const COMPOSITE_COLORBURN = 8;
+ const COMPOSITE_COLORDODGE = 9;
+ const COMPOSITE_COLORIZE = 10;
+ const COMPOSITE_COPYBLACK = 11;
+ const COMPOSITE_COPYBLUE = 12;
+ const COMPOSITE_COPY = 13;
+ const COMPOSITE_COPYCYAN = 14;
+ const COMPOSITE_COPYGREEN = 15;
+ const COMPOSITE_COPYMAGENTA = 16;
+ const COMPOSITE_COPYOPACITY = 17;
+ const COMPOSITE_COPYRED = 18;
+ const COMPOSITE_COPYYELLOW = 19;
+ const COMPOSITE_DARKEN = 20;
+ const COMPOSITE_DSTATOP = 21;
+ const COMPOSITE_DST = 22;
+ const COMPOSITE_DSTIN = 23;
+ const COMPOSITE_DSTOUT = 24;
+ const COMPOSITE_DSTOVER = 25;
+ const COMPOSITE_DIFFERENCE = 26;
+ const COMPOSITE_DISPLACE = 27;
+ const COMPOSITE_DISSOLVE = 28;
+ const COMPOSITE_EXCLUSION = 29;
+ const COMPOSITE_HARDLIGHT = 30;
+ const COMPOSITE_HUE = 31;
+ const COMPOSITE_IN = 32;
+ const COMPOSITE_LIGHTEN = 33;
+ const COMPOSITE_LUMINIZE = 35;
+ const COMPOSITE_MINUS = 36;
+ const COMPOSITE_MODULATE = 37;
+ const COMPOSITE_MULTIPLY = 38;
+ const COMPOSITE_OUT = 39;
+ const COMPOSITE_OVER = 40;
+ const COMPOSITE_OVERLAY = 41;
+ const COMPOSITE_PLUS = 42;
+ const COMPOSITE_REPLACE = 43;
+ const COMPOSITE_SATURATE = 44;
+ const COMPOSITE_SCREEN = 45;
+ const COMPOSITE_SOFTLIGHT = 46;
+ const COMPOSITE_SRCATOP = 47;
+ const COMPOSITE_SRC = 48;
+ const COMPOSITE_SRCIN = 49;
+ const COMPOSITE_SRCOUT = 50;
+ const COMPOSITE_SRCOVER = 51;
+ const COMPOSITE_SUBTRACT = 52;
+ const COMPOSITE_THRESHOLD = 53;
+ const COMPOSITE_XOR = 54;
+ const COMPOSITE_CHANGEMASK = 6;
+ const COMPOSITE_LINEARLIGHT = 34;
+ const COMPOSITE_DIVIDE = 55;
+ const COMPOSITE_DISTORT = 56;
+ const COMPOSITE_BLUR = 57;
+ const COMPOSITE_PEGTOPLIGHT = 58;
+ const COMPOSITE_VIVIDLIGHT = 59;
+ const COMPOSITE_PINLIGHT = 60;
+ const COMPOSITE_LINEARDODGE = 61;
+ const COMPOSITE_LINEARBURN = 62;
+ const COMPOSITE_MATHEMATICS = 63;
+ const COMPOSITE_MODULUSADD = 2;
+ const COMPOSITE_MODULUSSUBTRACT = 52;
+ const COMPOSITE_MINUSDST = 36;
+ const COMPOSITE_DIVIDEDST = 55;
+ const COMPOSITE_DIVIDESRC = 64;
+ const COMPOSITE_MINUSSRC = 65;
+ const COMPOSITE_DARKENINTENSITY = 66;
+ const COMPOSITE_LIGHTENINTENSITY = 67;
+ const MONTAGEMODE_FRAME = 1;
+ const MONTAGEMODE_UNFRAME = 2;
+ const MONTAGEMODE_CONCATENATE = 3;
+ const STYLE_NORMAL = 1;
+ const STYLE_ITALIC = 2;
+ const STYLE_OBLIQUE = 3;
+ const STYLE_ANY = 4;
+ const FILTER_UNDEFINED = 0;
+ const FILTER_POINT = 1;
+ const FILTER_BOX = 2;
+ const FILTER_TRIANGLE = 3;
+ const FILTER_HERMITE = 4;
+ const FILTER_HANNING = 5;
+ const FILTER_HAMMING = 6;
+ const FILTER_BLACKMAN = 7;
+ const FILTER_GAUSSIAN = 8;
+ const FILTER_QUADRATIC = 9;
+ const FILTER_CUBIC = 10;
+ const FILTER_CATROM = 11;
+ const FILTER_MITCHELL = 12;
+ const FILTER_LANCZOS = 22;
+ const FILTER_BESSEL = 13;
+ const FILTER_SINC = 14;
+ const FILTER_KAISER = 16;
+ const FILTER_WELSH = 17;
+ const FILTER_PARZEN = 18;
+ const FILTER_LAGRANGE = 21;
+ const FILTER_SENTINEL = 31;
+ const FILTER_BOHMAN = 19;
+ const FILTER_BARTLETT = 20;
+ const FILTER_JINC = 13;
+ const FILTER_SINCFAST = 15;
+ const FILTER_ROBIDOUX = 26;
+ const FILTER_LANCZOSSHARP = 23;
+ const FILTER_LANCZOS2 = 24;
+ const FILTER_LANCZOS2SHARP = 25;
+ const FILTER_ROBIDOUXSHARP = 27;
+ const FILTER_COSINE = 28;
+ const FILTER_SPLINE = 29;
+ const FILTER_LANCZOSRADIUS = 30;
+ const IMGTYPE_UNDEFINED = 0;
+ const IMGTYPE_BILEVEL = 1;
+ const IMGTYPE_GRAYSCALE = 2;
+ const IMGTYPE_GRAYSCALEMATTE = 3;
+ const IMGTYPE_PALETTE = 4;
+ const IMGTYPE_PALETTEMATTE = 5;
+ const IMGTYPE_TRUECOLOR = 6;
+ const IMGTYPE_TRUECOLORMATTE = 7;
+ const IMGTYPE_COLORSEPARATION = 8;
+ const IMGTYPE_COLORSEPARATIONMATTE = 9;
+ const IMGTYPE_OPTIMIZE = 10;
+ const IMGTYPE_PALETTEBILEVELMATTE = 11;
+ const RESOLUTION_UNDEFINED = 0;
+ const RESOLUTION_PIXELSPERINCH = 1;
+ const RESOLUTION_PIXELSPERCENTIMETER = 2;
+ const COMPRESSION_UNDEFINED = 0;
+ const COMPRESSION_NO = 1;
+ const COMPRESSION_BZIP = 2;
+ const COMPRESSION_FAX = 6;
+ const COMPRESSION_GROUP4 = 7;
+ const COMPRESSION_JPEG = 8;
+ const COMPRESSION_JPEG2000 = 9;
+ const COMPRESSION_LOSSLESSJPEG = 10;
+ const COMPRESSION_LZW = 11;
+ const COMPRESSION_RLE = 12;
+ const COMPRESSION_ZIP = 13;
+ const COMPRESSION_DXT1 = 3;
+ const COMPRESSION_DXT3 = 4;
+ const COMPRESSION_DXT5 = 5;
+ const COMPRESSION_ZIPS = 14;
+ const COMPRESSION_PIZ = 15;
+ const COMPRESSION_PXR24 = 16;
+ const COMPRESSION_B44 = 17;
+ const COMPRESSION_B44A = 18;
+ const COMPRESSION_LZMA = 19;
+ const COMPRESSION_JBIG1 = 20;
+ const COMPRESSION_JBIG2 = 21;
+ const PAINT_POINT = 1;
+ const PAINT_REPLACE = 2;
+ const PAINT_FLOODFILL = 3;
+ const PAINT_FILLTOBORDER = 4;
+ const PAINT_RESET = 5;
+ const GRAVITY_NORTHWEST = 1;
+ const GRAVITY_NORTH = 2;
+ const GRAVITY_NORTHEAST = 3;
+ const GRAVITY_WEST = 4;
+ const GRAVITY_CENTER = 5;
+ const GRAVITY_EAST = 6;
+ const GRAVITY_SOUTHWEST = 7;
+ const GRAVITY_SOUTH = 8;
+ const GRAVITY_SOUTHEAST = 9;
+ const GRAVITY_FORGET = 0;
+ const GRAVITY_STATIC = 10;
+ const STRETCH_NORMAL = 1;
+ const STRETCH_ULTRACONDENSED = 2;
+ const STRETCH_EXTRACONDENSED = 3;
+ const STRETCH_CONDENSED = 4;
+ const STRETCH_SEMICONDENSED = 5;
+ const STRETCH_SEMIEXPANDED = 6;
+ const STRETCH_EXPANDED = 7;
+ const STRETCH_EXTRAEXPANDED = 8;
+ const STRETCH_ULTRAEXPANDED = 9;
+ const STRETCH_ANY = 10;
+ const ALIGN_UNDEFINED = 0;
+ const ALIGN_LEFT = 1;
+ const ALIGN_CENTER = 2;
+ const ALIGN_RIGHT = 3;
+ const DECORATION_NO = 1;
+ const DECORATION_UNDERLINE = 2;
+ const DECORATION_OVERLINE = 3;
+ const DECORATION_LINETROUGH = 4;
+ const DECORATION_LINETHROUGH = 4;
+ const NOISE_UNIFORM = 1;
+ const NOISE_GAUSSIAN = 2;
+ const NOISE_MULTIPLICATIVEGAUSSIAN = 3;
+ const NOISE_IMPULSE = 4;
+ const NOISE_LAPLACIAN = 5;
+ const NOISE_POISSON = 6;
+ const NOISE_RANDOM = 7;
+ const CHANNEL_UNDEFINED = 0;
+ const CHANNEL_RED = 1;
+ const CHANNEL_GRAY = 1;
+ const CHANNEL_CYAN = 1;
+ const CHANNEL_GREEN = 2;
+ const CHANNEL_MAGENTA = 2;
+ const CHANNEL_BLUE = 4;
+ const CHANNEL_YELLOW = 4;
+ const CHANNEL_ALPHA = 8;
+ const CHANNEL_OPACITY = 8;
+ const CHANNEL_MATTE = 8;
+ const CHANNEL_BLACK = 32;
+ const CHANNEL_INDEX = 32;
+ const CHANNEL_ALL = 134217727;
+ const CHANNEL_DEFAULT = 134217719;
+ const CHANNEL_RGBA = 15;
+ const CHANNEL_TRUEALPHA = 64;
+ const CHANNEL_RGBS = 128;
+ const CHANNEL_GRAY_CHANNELS = 128;
+ const CHANNEL_SYNC = 256;
+ const CHANNEL_COMPOSITES = 47;
+ const METRIC_UNDEFINED = 0;
+ const METRIC_ABSOLUTEERRORMETRIC = 1;
+ const METRIC_MEANABSOLUTEERROR = 2;
+ const METRIC_MEANERRORPERPIXELMETRIC = 3;
+ const METRIC_MEANSQUAREERROR = 4;
+ const METRIC_PEAKABSOLUTEERROR = 5;
+ const METRIC_PEAKSIGNALTONOISERATIO = 6;
+ const METRIC_ROOTMEANSQUAREDERROR = 7;
+ const METRIC_NORMALIZEDCROSSCORRELATIONERRORMETRIC = 8;
+ const METRIC_FUZZERROR = 9;
+ const PIXEL_CHAR = 1;
+ const PIXEL_DOUBLE = 2;
+ const PIXEL_FLOAT = 3;
+ const PIXEL_INTEGER = 4;
+ const PIXEL_LONG = 5;
+ const PIXEL_QUANTUM = 6;
+ const PIXEL_SHORT = 7;
+ const EVALUATE_UNDEFINED = 0;
+ const EVALUATE_ADD = 1;
+ const EVALUATE_AND = 2;
+ const EVALUATE_DIVIDE = 3;
+ const EVALUATE_LEFTSHIFT = 4;
+ const EVALUATE_MAX = 5;
+ const EVALUATE_MIN = 6;
+ const EVALUATE_MULTIPLY = 7;
+ const EVALUATE_OR = 8;
+ const EVALUATE_RIGHTSHIFT = 9;
+ const EVALUATE_SET = 10;
+ const EVALUATE_SUBTRACT = 11;
+ const EVALUATE_XOR = 12;
+ const EVALUATE_POW = 13;
+ const EVALUATE_LOG = 14;
+ const EVALUATE_THRESHOLD = 15;
+ const EVALUATE_THRESHOLDBLACK = 16;
+ const EVALUATE_THRESHOLDWHITE = 17;
+ const EVALUATE_GAUSSIANNOISE = 18;
+ const EVALUATE_IMPULSENOISE = 19;
+ const EVALUATE_LAPLACIANNOISE = 20;
+ const EVALUATE_MULTIPLICATIVENOISE = 21;
+ const EVALUATE_POISSONNOISE = 22;
+ const EVALUATE_UNIFORMNOISE = 23;
+ const EVALUATE_COSINE = 24;
+ const EVALUATE_SINE = 25;
+ const EVALUATE_ADDMODULUS = 26;
+ const EVALUATE_MEAN = 27;
+ const EVALUATE_ABS = 28;
+ const EVALUATE_EXPONENTIAL = 29;
+ const EVALUATE_MEDIAN = 30;
+ const EVALUATE_SUM = 31;
+ const COLORSPACE_UNDEFINED = 0;
+ const COLORSPACE_RGB = 1;
+ const COLORSPACE_GRAY = 2;
+ const COLORSPACE_TRANSPARENT = 3;
+ const COLORSPACE_OHTA = 4;
+ const COLORSPACE_LAB = 5;
+ const COLORSPACE_XYZ = 6;
+ const COLORSPACE_YCBCR = 7;
+ const COLORSPACE_YCC = 8;
+ const COLORSPACE_YIQ = 9;
+ const COLORSPACE_YPBPR = 10;
+ const COLORSPACE_YUV = 11;
+ const COLORSPACE_CMYK = 12;
+ const COLORSPACE_SRGB = 13;
+ const COLORSPACE_HSB = 14;
+ const COLORSPACE_HSL = 15;
+ const COLORSPACE_HWB = 16;
+ const COLORSPACE_REC601LUMA = 17;
+ const COLORSPACE_REC709LUMA = 19;
+ const COLORSPACE_LOG = 21;
+ const COLORSPACE_CMY = 22;
+ const COLORSPACE_LUV = 23;
+ const COLORSPACE_HCL = 24;
+ const COLORSPACE_LCH = 25;
+ const COLORSPACE_LMS = 26;
+ const COLORSPACE_LCHAB = 27;
+ const COLORSPACE_LCHUV = 28;
+ const COLORSPACE_SCRGB = 29;
+ const COLORSPACE_HSI = 30;
+ const COLORSPACE_HSV = 31;
+ const COLORSPACE_HCLP = 32;
+ const COLORSPACE_YDBDR = 33;
+ const COLORSPACE_REC601YCBCR = 18;
+ const COLORSPACE_REC709YCBCR = 20;
+ const VIRTUALPIXELMETHOD_UNDEFINED = 0;
+ const VIRTUALPIXELMETHOD_BACKGROUND = 1;
+ const VIRTUALPIXELMETHOD_CONSTANT = 2;
+ const VIRTUALPIXELMETHOD_EDGE = 4;
+ const VIRTUALPIXELMETHOD_MIRROR = 5;
+ const VIRTUALPIXELMETHOD_TILE = 7;
+ const VIRTUALPIXELMETHOD_TRANSPARENT = 8;
+ const VIRTUALPIXELMETHOD_MASK = 9;
+ const VIRTUALPIXELMETHOD_BLACK = 10;
+ const VIRTUALPIXELMETHOD_GRAY = 11;
+ const VIRTUALPIXELMETHOD_WHITE = 12;
+ const VIRTUALPIXELMETHOD_HORIZONTALTILE = 13;
+ const VIRTUALPIXELMETHOD_VERTICALTILE = 14;
+ const VIRTUALPIXELMETHOD_HORIZONTALTILEEDGE = 15;
+ const VIRTUALPIXELMETHOD_VERTICALTILEEDGE = 16;
+ const VIRTUALPIXELMETHOD_CHECKERTILE = 17;
+ const PREVIEW_UNDEFINED = 0;
+ const PREVIEW_ROTATE = 1;
+ const PREVIEW_SHEAR = 2;
+ const PREVIEW_ROLL = 3;
+ const PREVIEW_HUE = 4;
+ const PREVIEW_SATURATION = 5;
+ const PREVIEW_BRIGHTNESS = 6;
+ const PREVIEW_GAMMA = 7;
+ const PREVIEW_SPIFF = 8;
+ const PREVIEW_DULL = 9;
+ const PREVIEW_GRAYSCALE = 10;
+ const PREVIEW_QUANTIZE = 11;
+ const PREVIEW_DESPECKLE = 12;
+ const PREVIEW_REDUCENOISE = 13;
+ const PREVIEW_ADDNOISE = 14;
+ const PREVIEW_SHARPEN = 15;
+ const PREVIEW_BLUR = 16;
+ const PREVIEW_THRESHOLD = 17;
+ const PREVIEW_EDGEDETECT = 18;
+ const PREVIEW_SPREAD = 19;
+ const PREVIEW_SOLARIZE = 20;
+ const PREVIEW_SHADE = 21;
+ const PREVIEW_RAISE = 22;
+ const PREVIEW_SEGMENT = 23;
+ const PREVIEW_SWIRL = 24;
+ const PREVIEW_IMPLODE = 25;
+ const PREVIEW_WAVE = 26;
+ const PREVIEW_OILPAINT = 27;
+ const PREVIEW_CHARCOALDRAWING = 28;
+ const PREVIEW_JPEG = 29;
+ const RENDERINGINTENT_UNDEFINED = 0;
+ const RENDERINGINTENT_SATURATION = 1;
+ const RENDERINGINTENT_PERCEPTUAL = 2;
+ const RENDERINGINTENT_ABSOLUTE = 3;
+ const RENDERINGINTENT_RELATIVE = 4;
+ const INTERLACE_UNDEFINED = 0;
+ const INTERLACE_NO = 1;
+ const INTERLACE_LINE = 2;
+ const INTERLACE_PLANE = 3;
+ const INTERLACE_PARTITION = 4;
+ const INTERLACE_GIF = 5;
+ const INTERLACE_JPEG = 6;
+ const INTERLACE_PNG = 7;
+ const FILLRULE_UNDEFINED = 0;
+ const FILLRULE_EVENODD = 1;
+ const FILLRULE_NONZERO = 2;
+ const PATHUNITS_UNDEFINED = 0;
+ const PATHUNITS_USERSPACE = 1;
+ const PATHUNITS_USERSPACEONUSE = 2;
+ const PATHUNITS_OBJECTBOUNDINGBOX = 3;
+ const LINECAP_UNDEFINED = 0;
+ const LINECAP_BUTT = 1;
+ const LINECAP_ROUND = 2;
+ const LINECAP_SQUARE = 3;
+ const LINEJOIN_UNDEFINED = 0;
+ const LINEJOIN_MITER = 1;
+ const LINEJOIN_ROUND = 2;
+ const LINEJOIN_BEVEL = 3;
+ const RESOURCETYPE_UNDEFINED = 0;
+ const RESOURCETYPE_AREA = 1;
+ const RESOURCETYPE_DISK = 2;
+ const RESOURCETYPE_FILE = 3;
+ const RESOURCETYPE_MAP = 4;
+ const RESOURCETYPE_MEMORY = 5;
+ const RESOURCETYPE_TIME = 7;
+ const RESOURCETYPE_THROTTLE = 8;
+ const RESOURCETYPE_THREAD = 6;
+ const DISPOSE_UNRECOGNIZED = 0;
+ const DISPOSE_UNDEFINED = 0;
+ const DISPOSE_NONE = 1;
+ const DISPOSE_BACKGROUND = 2;
+ const DISPOSE_PREVIOUS = 3;
+ const INTERPOLATE_UNDEFINED = 0;
+ const INTERPOLATE_AVERAGE = 1;
+ const INTERPOLATE_BICUBIC = 2;
+ const INTERPOLATE_BILINEAR = 3;
+ const INTERPOLATE_FILTER = 4;
+ const INTERPOLATE_INTEGER = 5;
+ const INTERPOLATE_MESH = 6;
+ const INTERPOLATE_NEARESTNEIGHBOR = 7;
+ const INTERPOLATE_SPLINE = 8;
+ const LAYERMETHOD_UNDEFINED = 0;
+ const LAYERMETHOD_COALESCE = 1;
+ const LAYERMETHOD_COMPAREANY = 2;
+ const LAYERMETHOD_COMPARECLEAR = 3;
+ const LAYERMETHOD_COMPAREOVERLAY = 4;
+ const LAYERMETHOD_DISPOSE = 5;
+ const LAYERMETHOD_OPTIMIZE = 6;
+ const LAYERMETHOD_OPTIMIZEPLUS = 8;
+ const LAYERMETHOD_OPTIMIZETRANS = 9;
+ const LAYERMETHOD_COMPOSITE = 12;
+ const LAYERMETHOD_OPTIMIZEIMAGE = 7;
+ const LAYERMETHOD_REMOVEDUPS = 10;
+ const LAYERMETHOD_REMOVEZERO = 11;
+ const LAYERMETHOD_TRIMBOUNDS = 16;
+ const ORIENTATION_UNDEFINED = 0;
+ const ORIENTATION_TOPLEFT = 1;
+ const ORIENTATION_TOPRIGHT = 2;
+ const ORIENTATION_BOTTOMRIGHT = 3;
+ const ORIENTATION_BOTTOMLEFT = 4;
+ const ORIENTATION_LEFTTOP = 5;
+ const ORIENTATION_RIGHTTOP = 6;
+ const ORIENTATION_RIGHTBOTTOM = 7;
+ const ORIENTATION_LEFTBOTTOM = 8;
+ const DISTORTION_UNDEFINED = 0;
+ const DISTORTION_AFFINE = 1;
+ const DISTORTION_AFFINEPROJECTION = 2;
+ const DISTORTION_ARC = 9;
+ const DISTORTION_BILINEAR = 6;
+ const DISTORTION_PERSPECTIVE = 4;
+ const DISTORTION_PERSPECTIVEPROJECTION = 5;
+ const DISTORTION_SCALEROTATETRANSLATE = 3;
+ const DISTORTION_POLYNOMIAL = 8;
+ const DISTORTION_POLAR = 10;
+ const DISTORTION_DEPOLAR = 11;
+ const DISTORTION_BARREL = 14;
+ const DISTORTION_SHEPARDS = 16;
+ const DISTORTION_SENTINEL = 18;
+ const DISTORTION_BARRELINVERSE = 15;
+ const DISTORTION_BILINEARFORWARD = 6;
+ const DISTORTION_BILINEARREVERSE = 7;
+ const DISTORTION_RESIZE = 17;
+ const DISTORTION_CYLINDER2PLANE = 12;
+ const DISTORTION_PLANE2CYLINDER = 13;
+ const LAYERMETHOD_MERGE = 13;
+ const LAYERMETHOD_FLATTEN = 14;
+ const LAYERMETHOD_MOSAIC = 15;
+ const ALPHACHANNEL_ACTIVATE = 1;
+ const ALPHACHANNEL_RESET = 7;
+ const ALPHACHANNEL_SET = 8;
+ const ALPHACHANNEL_UNDEFINED = 0;
+ const ALPHACHANNEL_COPY = 3;
+ const ALPHACHANNEL_DEACTIVATE = 4;
+ const ALPHACHANNEL_EXTRACT = 5;
+ const ALPHACHANNEL_OPAQUE = 6;
+ const ALPHACHANNEL_SHAPE = 9;
+ const ALPHACHANNEL_TRANSPARENT = 10;
+ const SPARSECOLORMETHOD_UNDEFINED = 0;
+ const SPARSECOLORMETHOD_BARYCENTRIC = 1;
+ const SPARSECOLORMETHOD_BILINEAR = 7;
+ const SPARSECOLORMETHOD_POLYNOMIAL = 8;
+ const SPARSECOLORMETHOD_SPEPARDS = 16;
+ const SPARSECOLORMETHOD_VORONOI = 18;
+ const SPARSECOLORMETHOD_INVERSE = 19;
+ const DITHERMETHOD_UNDEFINED = 0;
+ const DITHERMETHOD_NO = 1;
+ const DITHERMETHOD_RIEMERSMA = 2;
+ const DITHERMETHOD_FLOYDSTEINBERG = 3;
+ const FUNCTION_UNDEFINED = 0;
+ const FUNCTION_POLYNOMIAL = 1;
+ const FUNCTION_SINUSOID = 2;
+ const ALPHACHANNEL_BACKGROUND = 2;
+ const FUNCTION_ARCSIN = 3;
+ const FUNCTION_ARCTAN = 4;
+ const ALPHACHANNEL_FLATTEN = 11;
+ const ALPHACHANNEL_REMOVE = 12;
+ const STATISTIC_GRADIENT = 1;
+ const STATISTIC_MAXIMUM = 2;
+ const STATISTIC_MEAN = 3;
+ const STATISTIC_MEDIAN = 4;
+ const STATISTIC_MINIMUM = 5;
+ const STATISTIC_MODE = 6;
+ const STATISTIC_NONPEAK = 7;
+ const STATISTIC_STANDARD_DEVIATION = 8;
+ const MORPHOLOGY_CONVOLVE = 1;
+ const MORPHOLOGY_CORRELATE = 2;
+ const MORPHOLOGY_ERODE = 3;
+ const MORPHOLOGY_DILATE = 4;
+ const MORPHOLOGY_ERODE_INTENSITY = 5;
+ const MORPHOLOGY_DILATE_INTENSITY = 6;
+ const MORPHOLOGY_DISTANCE = 7;
+ const MORPHOLOGY_OPEN = 8;
+ const MORPHOLOGY_CLOSE = 9;
+ const MORPHOLOGY_OPEN_INTENSITY = 10;
+ const MORPHOLOGY_CLOSE_INTENSITY = 11;
+ const MORPHOLOGY_SMOOTH = 12;
+ const MORPHOLOGY_EDGE_IN = 13;
+ const MORPHOLOGY_EDGE_OUT = 14;
+ const MORPHOLOGY_EDGE = 15;
+ const MORPHOLOGY_TOP_HAT = 16;
+ const MORPHOLOGY_BOTTOM_HAT = 17;
+ const MORPHOLOGY_HIT_AND_MISS = 18;
+ const MORPHOLOGY_THINNING = 19;
+ const MORPHOLOGY_THICKEN = 20;
+ const MORPHOLOGY_VORONOI = 21;
+ const MORPHOLOGY_ITERATIVE = 22;
+ const KERNEL_UNITY = 1;
+ const KERNEL_GAUSSIAN = 2;
+ const KERNEL_DIFFERENCE_OF_GAUSSIANS = 3;
+ const KERNEL_LAPLACIAN_OF_GAUSSIANS = 4;
+ const KERNEL_BLUR = 5;
+ const KERNEL_COMET = 6;
+ const KERNEL_LAPLACIAN = 7;
+ const KERNEL_SOBEL = 8;
+ const KERNEL_FREI_CHEN = 9;
+ const KERNEL_ROBERTS = 10;
+ const KERNEL_PREWITT = 11;
+ const KERNEL_COMPASS = 12;
+ const KERNEL_KIRSCH = 13;
+ const KERNEL_DIAMOND = 14;
+ const KERNEL_SQUARE = 15;
+ const KERNEL_RECTANGLE = 16;
+ const KERNEL_OCTAGON = 17;
+ const KERNEL_DISK = 18;
+ const KERNEL_PLUS = 19;
+ const KERNEL_CROSS = 20;
+ const KERNEL_RING = 21;
+ const KERNEL_PEAKS = 22;
+ const KERNEL_EDGES = 23;
+ const KERNEL_CORNERS = 24;
+ const KERNEL_DIAGONALS = 25;
+ const KERNEL_LINE_ENDS = 26;
+ const KERNEL_LINE_JUNCTIONS = 27;
+ const KERNEL_RIDGES = 28;
+ const KERNEL_CONVEX_HULL = 29;
+ const KERNEL_THIN_SE = 30;
+ const KERNEL_SKELETON = 31;
+ const KERNEL_CHEBYSHEV = 32;
+ const KERNEL_MANHATTAN = 33;
+ const KERNEL_OCTAGONAL = 34;
+ const KERNEL_EUCLIDEAN = 35;
+ const KERNEL_USER_DEFINED = 36;
+ const KERNEL_BINOMIAL = 37;
+ const DIRECTION_LEFT_TO_RIGHT = 2;
+ const DIRECTION_RIGHT_TO_LEFT = 1;
+ const NORMALIZE_KERNEL_NONE = 0;
+ const NORMALIZE_KERNEL_VALUE = 8192;
+ const NORMALIZE_KERNEL_CORRELATE = 65536;
+ const NORMALIZE_KERNEL_PERCENT = 4096;
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Removes repeated portions of images to optimize
+ * @link https://php.net/manual/en/imagick.optimizeimagelayers.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function optimizeImageLayers () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the maximum bounding region between images
+ * @link https://php.net/manual/en/imagick.compareimagelayers.php
+ * @param int $method <p>
+ * One of the layer method constants.
+ * </p>
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function compareImageLayers ($method) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Quickly fetch attributes
+ * @link https://php.net/manual/en/imagick.pingimageblob.php
+ * @param string $image <p>
+ * A string containing the image.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function pingImageBlob ($image) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Get basic image attributes in a lightweight manner
+ * @link https://php.net/manual/en/imagick.pingimagefile.php
+ * @param resource $filehandle <p>
+ * An open filehandle to the image.
+ * </p>
+ * @param string $fileName [optional] <p>
+ * Optional filename for this image.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function pingImageFile ($filehandle, $fileName = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a vertical mirror image
+ * @link https://php.net/manual/en/imagick.transposeimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function transposeImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a horizontal mirror image
+ * @link https://php.net/manual/en/imagick.transverseimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function transverseImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Remove edges from the image
+ * @link https://php.net/manual/en/imagick.trimimage.php
+ * @param float $fuzz <p>
+ * By default target must match a particular pixel color exactly.
+ * However, in many cases two colors may differ by a small amount.
+ * The fuzz member of image defines how much tolerance is acceptable
+ * to consider two colors as the same. This parameter represents the variation
+ * on the quantum range.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function trimImage ($fuzz) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies wave filter to the image
+ * @link https://php.net/manual/en/imagick.waveimage.php
+ * @param float $amplitude <p>
+ * The amplitude of the wave.
+ * </p>
+ * @param float $length <p>
+ * The length of the wave.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function waveImage ($amplitude, $length) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds vignette filter to the image
+ * @link https://php.net/manual/en/imagick.vignetteimage.php
+ * @param float $blackPoint <p>
+ * The black point.
+ * </p>
+ * @param float $whitePoint <p>
+ * The white point
+ * </p>
+ * @param int $x <p>
+ * X offset of the ellipse
+ * </p>
+ * @param int $y <p>
+ * Y offset of the ellipse
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function vignetteImage ($blackPoint, $whitePoint, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Discards all but one of any pixel color
+ * @link https://php.net/manual/en/imagick.uniqueimagecolors.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function uniqueImageColors () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Return if the image has a matte channel
+ * @link https://php.net/manual/en/imagick.getimagematte.php
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function getImageMatte () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image matte channel
+ * @link https://php.net/manual/en/imagick.setimagematte.php
+ * @param bool $matte <p>
+ * True activates the matte channel and false disables it.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageMatte ($matte) {}
+
+ /**
+ * Adaptively resize image with data dependent triangulation
+ *
+ * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+ * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+ * <br>
+ * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched.
+ * In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @link https://php.net/manual/en/imagick.adaptiveresizeimage.php
+ * @param int $columns The number of columns in the scaled image.
+ * @param int $rows The number of rows in the scaled image.
+ * @param bool $bestfit [optional] Whether to fit the image inside a bounding box.<br>
+ * The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool TRUE on success
+ * @throws ImagickException Throws ImagickException on error
+ * @since 2.0.0
+ */
+ public function adaptiveResizeImage ($columns, $rows, $bestfit = false, $legacy = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates a pencil sketch
+ * @link https://php.net/manual/en/imagick.sketchimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels.
+ * </p>
+ * @param float $angle <p>
+ * Apply the effect along this angle.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sketchImage ($radius, $sigma, $angle) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a 3D effect
+ * @link https://php.net/manual/en/imagick.shadeimage.php
+ * @param bool $gray <p>
+ * A value other than zero shades the intensity of each pixel.
+ * </p>
+ * @param float $azimuth <p>
+ * Defines the light source direction.
+ * </p>
+ * @param float $elevation <p>
+ * Defines the light source direction.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function shadeImage ($gray, $azimuth, $elevation) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the size offset
+ * @link https://php.net/manual/en/imagick.getsizeoffset.php
+ * @return int the size offset associated with the Imagick object.
+ */
+ public function getSizeOffset () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the size and offset of the Imagick object
+ * @link https://php.net/manual/en/imagick.setsizeoffset.php
+ * @param int $columns <p>
+ * The width in pixels.
+ * </p>
+ * @param int $rows <p>
+ * The height in pixels.
+ * </p>
+ * @param int $offset <p>
+ * The image offset.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setSizeOffset ($columns, $rows, $offset) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds adaptive blur filter to image
+ * @link https://php.net/manual/en/imagick.adaptiveblurimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel.
+ * Provide a value of 0 and the radius will be chosen automagically.
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function adaptiveBlurImage ($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Enhances the contrast of a color image
+ * @link https://php.net/manual/en/imagick.contraststretchimage.php
+ * @param float $black_point <p>
+ * The black point.
+ * </p>
+ * @param float $white_point <p>
+ * The white point.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. <b>Imagick::CHANNEL_ALL</b>. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function contrastStretchImage ($black_point, $white_point, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adaptively sharpen the image
+ * @link https://php.net/manual/en/imagick.adaptivesharpenimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel. Use 0 for auto-select.
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function adaptiveSharpenImage ($radius, $sigma, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a high-contrast, two-color image
+ * @link https://php.net/manual/en/imagick.randomthresholdimage.php
+ * @param float $low <p>
+ * The low point
+ * </p>
+ * @param float $high <p>
+ * The high point
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function randomThresholdImage ($low, $high, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * @param $xRounding
+ * @param $yRounding
+ * @param $strokeWidth [optional]
+ * @param $displace [optional]
+ * @param $sizeCorrection [optional]
+ */
+ public function roundCornersImage ($xRounding, $yRounding, $strokeWidth, $displace, $sizeCorrection) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Rounds image corners
+ * @link https://php.net/manual/en/imagick.roundcorners.php
+ * @param float $x_rounding <p>
+ * x rounding
+ * </p>
+ * @param float $y_rounding <p>
+ * y rounding
+ * </p>
+ * @param float $stroke_width [optional] <p>
+ * stroke width
+ * </p>
+ * @param float $displace [optional] <p>
+ * image displace
+ * </p>
+ * @param float $size_correction [optional] <p>
+ * size correction
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function roundCorners ($x_rounding, $y_rounding, $stroke_width = 10.0, $displace = 5.0, $size_correction = -6.0) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Set the iterator position
+ * @link https://php.net/manual/en/imagick.setiteratorindex.php
+ * @param int $index <p>
+ * The position to set the iterator to
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setIteratorIndex ($index) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the index of the current active image
+ * @link https://php.net/manual/en/imagick.getiteratorindex.php
+ * @return int an integer containing the index of the image in the stack.
+ */
+ public function getIteratorIndex () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Convenience method for setting crop size and the image geometry
+ * @link https://php.net/manual/en/imagick.transformimage.php
+ * @param string $crop <p>
+ * A crop geometry string. This geometry defines a subregion of the image to crop.
+ * </p>
+ * @param string $geometry <p>
+ * An image geometry string. This geometry defines the final size of the image.
+ * </p>
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function transformImage ($crop, $geometry) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image opacity level
+ * @link https://php.net/manual/en/imagick.setimageopacity.php
+ * @param float $opacity <p>
+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+ * transparent.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageOpacity ($opacity) {}
+
+ /**
+ * (PECL imagick 2.2.2)<br/>
+ * Performs an ordered dither
+ * @link https://php.net/manual/en/imagick.orderedposterizeimage.php
+ * @param string $threshold_map <p>
+ * A string containing the name of the threshold dither map to use
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function orderedPosterizeImage ($threshold_map, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates a Polaroid picture
+ * @link https://php.net/manual/en/imagick.polaroidimage.php
+ * @param ImagickDraw $properties <p>
+ * The polaroid properties
+ * </p>
+ * @param float $angle <p>
+ * The polaroid angle
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function polaroidImage (ImagickDraw $properties, $angle) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the named image property
+ * @link https://php.net/manual/en/imagick.getimageproperty.php
+ * @param string $name <p>
+ * name of the property (for example Exif:DateTime)
+ * </p>
+ * @return string|false a string containing the image property, false if a
+ * property with the given name does not exist.
+ */
+ public function getImageProperty ($name) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets an image property
+ * @link https://php.net/manual/en/imagick.setimageproperty.php
+ * @param string $name
+ * @param string $value
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageProperty ($name, $value) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image interpolate pixel method
+ * @link https://php.net/manual/en/imagick.setimageinterpolatemethod.php
+ * @param int $method <p>
+ * The method is one of the <b>Imagick::INTERPOLATE_*</b> constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageInterpolateMethod ($method) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the interpolation method
+ * @link https://php.net/manual/en/imagick.getimageinterpolatemethod.php
+ * @return int the interpolate method on success.
+ */
+ public function getImageInterpolateMethod () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Stretches with saturation the image intensity
+ * @link https://php.net/manual/en/imagick.linearstretchimage.php
+ * @param float $blackPoint <p>
+ * The image black point
+ * </p>
+ * @param float $whitePoint <p>
+ * The image white point
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function linearStretchImage ($blackPoint, $whitePoint) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image length in bytes
+ * @link https://php.net/manual/en/imagick.getimagelength.php
+ * @return int an int containing the current image size.
+ */
+ public function getImageLength () {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Set image size
+ * @link https://php.net/manual/en/imagick.extentimage.php
+ * @param int $width <p>
+ * The new width
+ * </p>
+ * @param int $height <p>
+ * The new height
+ * </p>
+ * @param int $x <p>
+ * X position for the new size
+ * </p>
+ * @param int $y <p>
+ * Y position for the new size
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function extentImage ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image orientation
+ * @link https://php.net/manual/en/imagick.getimageorientation.php
+ * @return int an int on success.
+ */
+ public function getImageOrientation () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image orientation
+ * @link https://php.net/manual/en/imagick.setimageorientation.php
+ * @param int $orientation <p>
+ * One of the orientation constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageOrientation ($orientation) {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Changes the color value of any pixel that matches target
+ * @link https://php.net/manual/en/imagick.paintfloodfillimage.php
+ * @param mixed $fill <p>
+ * ImagickPixel object or a string containing the fill color
+ * </p>
+ * @param float $fuzz <p>
+ * The amount of fuzz. For example, set fuzz to 10 and the color red at
+ * intensities of 100 and 102 respectively are now interpreted as the
+ * same color for the purposes of the floodfill.
+ * </p>
+ * @param mixed $bordercolor <p>
+ * ImagickPixel object or a string containing the border color
+ * </p>
+ * @param int $x <p>
+ * X start position of the floodfill
+ * </p>
+ * @param int $y <p>
+ * Y start position of the floodfill
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function paintFloodfillImage ($fill, $fuzz, $bordercolor, $x, $y, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Replaces colors in the image from a color lookup table. Optional second parameter to replace colors in a specific channel. This method is available if Imagick has been compiled against ImageMagick version 6.3.6 or newer.
+ * @link https://php.net/manual/en/imagick.clutimage.php
+ * @param Imagick $lookup_table <p>
+ * Imagick object containing the color lookup table
+ * </p>
+ * @param int $channel [optional] <p>
+ * The Channeltype
+ * constant. When not supplied, default channels are replaced.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ * @since 2.0.0
+ */
+ public function clutImage (Imagick $lookup_table, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image properties
+ * @link https://php.net/manual/en/imagick.getimageproperties.php
+ * @param string $pattern [optional] <p>
+ * The pattern for property names.
+ * </p>
+ * @param bool $only_names [optional] <p>
+ * Whether to return only property names. If <b>FALSE</b> then also the values are returned
+ * </p>
+ * @return array an array containing the image properties or property names.
+ */
+ public function getImageProperties ($pattern = "*", $only_names = true) {}
+
+ /**
+ * (PECL imagick 2.2.0)<br/>
+ * Returns the image profiles
+ * @link https://php.net/manual/en/imagick.getimageprofiles.php
+ * @param string $pattern [optional] <p>
+ * The pattern for profile names.
+ * </p>
+ * @param bool $include_values [optional] <p>
+ * Whether to return only profile names. If <b>FALSE</b> then only profile names will be returned.
+ * </p>
+ * @return array an array containing the image profiles or profile names.
+ */
+ public function getImageProfiles ($pattern = "*", $include_values = true) {}
+
+ /**
+ * (PECL imagick 2.0.1)<br/>
+ * Distorts an image using various distortion methods
+ * @link https://php.net/manual/en/imagick.distortimage.php
+ * @param int $method <p>
+ * The method of image distortion. See distortion constants
+ * </p>
+ * @param array $arguments <p>
+ * The arguments for this distortion method
+ * </p>
+ * @param bool $bestfit <p>
+ * Attempt to resize destination to fit distorted source
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function distortImage ($method, array $arguments, $bestfit) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Writes an image to a filehandle
+ * @link https://php.net/manual/en/imagick.writeimagefile.php
+ * @param resource $filehandle <p>
+ * Filehandle where to write the image
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function writeImageFile ($filehandle) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Writes frames to a filehandle
+ * @link https://php.net/manual/en/imagick.writeimagesfile.php
+ * @param resource $filehandle <p>
+ * Filehandle where to write the images
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function writeImagesFile ($filehandle) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Reset image page
+ * @link https://php.net/manual/en/imagick.resetimagepage.php
+ * @param string $page <p>
+ * The page definition. For example 7168x5147+0+0
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function resetImagePage ($page) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Sets image clip mask
+ * @link https://php.net/manual/en/imagick.setimageclipmask.php
+ * @param Imagick $clip_mask <p>
+ * The Imagick object containing the clip mask
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageClipMask (Imagick $clip_mask) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets image clip mask
+ * @link https://php.net/manual/en/imagick.getimageclipmask.php
+ * @return Imagick an Imagick object containing the clip mask.
+ */
+ public function getImageClipMask () {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Animates an image or images
+ * @link https://php.net/manual/en/imagick.animateimages.php
+ * @param string $x_server <p>
+ * X server address
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function animateImages ($x_server) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Recolors image
+ * @link https://php.net/manual/en/imagick.recolorimage.php
+ * @param array $matrix <p>
+ * The matrix containing the color values
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function recolorImage (array $matrix) {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Sets font
+ * @link https://php.net/manual/en/imagick.setfont.php
+ * @param string $font <p>
+ * Font name or a filename
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFont ($font) {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Gets font
+ * @link https://php.net/manual/en/imagick.getfont.php
+ * @return string|false the string containing the font name or <b>FALSE</b> if not font is set.
+ */
+ public function getFont () {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Sets point size
+ * @link https://php.net/manual/en/imagick.setpointsize.php
+ * @param float $point_size <p>
+ * Point size
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setPointSize ($point_size) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets point size
+ * @link https://php.net/manual/en/imagick.getpointsize.php
+ * @return float a float containing the point size.
+ */
+ public function getPointSize () {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Merges image layers
+ * @link https://php.net/manual/en/imagick.mergeimagelayers.php
+ * @param int $layer_method <p>
+ * One of the <b>Imagick::LAYERMETHOD_*</b> constants
+ * </p>
+ * @return Imagick Returns an Imagick object containing the merged image.
+ * @throws ImagickException
+ */
+ public function mergeImageLayers ($layer_method) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Sets image alpha channel
+ * @link https://php.net/manual/en/imagick.setimagealphachannel.php
+ * @param int $mode <p>
+ * One of the <b>Imagick::ALPHACHANNEL_*</b> constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageAlphaChannel ($mode) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Changes the color value of any pixel that matches target
+ * @link https://php.net/manual/en/imagick.floodfillpaintimage.php
+ * @param mixed $fill <p>
+ * ImagickPixel object or a string containing the fill color
+ * </p>
+ * @param float $fuzz <p>
+ * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+ * </p>
+ * @param mixed $target <p>
+ * ImagickPixel object or a string containing the target color to paint
+ * </p>
+ * @param int $x <p>
+ * X start position of the floodfill
+ * </p>
+ * @param int $y <p>
+ * Y start position of the floodfill
+ * </p>
+ * @param bool $invert <p>
+ * If <b>TRUE</b> paints any pixel that does not match the target color.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function floodFillPaintImage ($fill, $fuzz, $target, $x, $y, $invert, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Changes the color value of any pixel that matches target
+ * @link https://php.net/manual/en/imagick.opaquepaintimage.php
+ * @param mixed $target <p>
+ * ImagickPixel object or a string containing the color to change
+ * </p>
+ * @param mixed $fill <p>
+ * The replacement color
+ * </p>
+ * @param float $fuzz <p>
+ * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+ * </p>
+ * @param bool $invert <p>
+ * If <b>TRUE</b> paints any pixel that does not match the target color.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function opaquePaintImage ($target, $fill, $fuzz, $invert, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Paints pixels transparent
+ * @link https://php.net/manual/en/imagick.transparentpaintimage.php
+ * @param mixed $target <p>
+ * The target color to paint
+ * </p>
+ * @param float $alpha <p>
+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.
+ * </p>
+ * @param float $fuzz <p>
+ * The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color.
+ * </p>
+ * @param bool $invert <p>
+ * If <b>TRUE</b> paints any pixel that does not match the target color.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function transparentPaintImage ($target, $alpha, $fuzz, $invert) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Animates an image or images
+ * @link https://php.net/manual/en/imagick.liquidrescaleimage.php
+ * @param int $width <p>
+ * The width of the target size
+ * </p>
+ * @param int $height <p>
+ * The height of the target size
+ * </p>
+ * @param float $delta_x <p>
+ * How much the seam can traverse on x-axis.
+ * Passing 0 causes the seams to be straight.
+ * </p>
+ * @param float $rigidity <p>
+ * Introduces a bias for non-straight seams. This parameter is
+ * typically 0.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function liquidRescaleImage ($width, $height, $delta_x, $rigidity) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Enciphers an image
+ * @link https://php.net/manual/en/imagick.encipherimage.php
+ * @param string $passphrase <p>
+ * The passphrase
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function encipherImage ($passphrase) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Deciphers an image
+ * @link https://php.net/manual/en/imagick.decipherimage.php
+ * @param string $passphrase <p>
+ * The passphrase
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function decipherImage ($passphrase) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Sets the gravity
+ * @link https://php.net/manual/en/imagick.setgravity.php
+ * @param int $gravity <p>
+ * The gravity property. Refer to the list of
+ * gravity constants.
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setGravity ($gravity) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets the gravity
+ * @link https://php.net/manual/en/imagick.getgravity.php
+ * @return int the gravity property. Refer to the list of
+ * gravity constants.
+ */
+ public function getGravity () {}
+
+ /**
+ * (PECL imagick 2.2.1)<br/>
+ * Gets channel range
+ * @link https://php.net/manual/en/imagick.getimagechannelrange.php
+ * @param int $channel <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return array an array containing minima and maxima values of the channel(s).
+ */
+ public function getImageChannelRange ($channel) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets the image alpha channel
+ * @link https://php.net/manual/en/imagick.getimagealphachannel.php
+ * @return int a constant defining the current alpha channel value. Refer to this
+ * list of alpha channel constants.
+ */
+ public function getImageAlphaChannel () {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets channel distortions
+ * @link https://php.net/manual/en/imagick.getimagechanneldistortions.php
+ * @param Imagick $reference <p>
+ * Imagick object containing the reference image
+ * </p>
+ * @param int $metric <p>
+ * Refer to this list of metric type constants.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return float a float describing the channel distortion.
+ */
+ public function getImageChannelDistortions (Imagick $reference, $metric, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Sets the image gravity
+ * @link https://php.net/manual/en/imagick.setimagegravity.php
+ * @param int $gravity <p>
+ * The gravity property. Refer to the list of
+ * gravity constants.
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setImageGravity ($gravity) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Gets the image gravity
+ * @link https://php.net/manual/en/imagick.getimagegravity.php
+ * @return int the images gravity property. Refer to the list of
+ * gravity constants.
+ */
+ public function getImageGravity () {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Imports image pixels
+ * @link https://php.net/manual/en/imagick.importimagepixels.php
+ * @param int $x <p>
+ * The image x position
+ * </p>
+ * @param int $y <p>
+ * The image y position
+ * </p>
+ * @param int $width <p>
+ * The image width
+ * </p>
+ * @param int $height <p>
+ * The image height
+ * </p>
+ * @param string $map <p>
+ * Map of pixel ordering as a string. This can be for example RGB.
+ * The value can be any combination or order of R = red, G = green, B = blue, A = alpha (0 is transparent),
+ * O = opacity (0 is opaque), C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), P = pad.
+ * </p>
+ * @param int $storage <p>
+ * The pixel storage method.
+ * Refer to this list of pixel constants.
+ * </p>
+ * @param array $pixels <p>
+ * The array of pixels
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function importImagePixels ($x, $y, $width, $height, $map, $storage, array $pixels) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Removes skew from the image
+ * @link https://php.net/manual/en/imagick.deskewimage.php
+ * @param float $threshold <p>
+ * Deskew threshold
+ * </p>
+ * @return bool
+ */
+ public function deskewImage ($threshold) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Segments an image
+ * @link https://php.net/manual/en/imagick.segmentimage.php
+ * @param int $COLORSPACE <p>
+ * One of the COLORSPACE constants.
+ * </p>
+ * @param float $cluster_threshold <p>
+ * A percentage describing minimum number of pixels
+ * contained in hexedra before it is considered valid.
+ * </p>
+ * @param float $smooth_threshold <p>
+ * Eliminates noise from the histogram.
+ * </p>
+ * @param bool $verbose [optional] <p>
+ * Whether to output detailed information about recognised classes.
+ * </p>
+ * @return bool
+ */
+ public function segmentImage ($COLORSPACE, $cluster_threshold, $smooth_threshold, $verbose = false) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Interpolates colors
+ * @link https://php.net/manual/en/imagick.sparsecolorimage.php
+ * @param int $SPARSE_METHOD <p>
+ * Refer to this list of sparse method constants
+ * </p>
+ * @param array $arguments <p>
+ * An array containing the coordinates.
+ * The array is in format array(1,1, 2,45)
+ * </p>
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sparseColorImage ($SPARSE_METHOD, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Remaps image colors
+ * @link https://php.net/manual/en/imagick.remapimage.php
+ * @param Imagick $replacement <p>
+ * An Imagick object containing the replacement colors
+ * </p>
+ * @param int $DITHER <p>
+ * Refer to this list of dither method constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function remapImage (Imagick $replacement, $DITHER) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Exports raw image pixels
+ * @link https://php.net/manual/en/imagick.exportimagepixels.php
+ * @param int $x <p>
+ * X-coordinate of the exported area
+ * </p>
+ * @param int $y <p>
+ * Y-coordinate of the exported area
+ * </p>
+ * @param int $width <p>
+ * Width of the exported aread
+ * </p>
+ * @param int $height <p>
+ * Height of the exported area
+ * </p>
+ * @param string $map <p>
+ * Ordering of the exported pixels. For example "RGB".
+ * Valid characters for the map are R, G, B, A, O, C, Y, M, K, I and P.
+ * </p>
+ * @param int $STORAGE <p>
+ * Refer to this list of pixel type constants
+ * </p>
+ * @return array an array containing the pixels values.
+ */
+ public function exportImagePixels ($x, $y, $width, $height, $map, $STORAGE) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * The getImageChannelKurtosis purpose
+ * @link https://php.net/manual/en/imagick.getimagechannelkurtosis.php
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return array an array with kurtosis and skewness
+ * members.
+ */
+ public function getImageChannelKurtosis ($channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Applies a function on the image
+ * @link https://php.net/manual/en/imagick.functionimage.php
+ * @param int $function <p>
+ * Refer to this list of function constants
+ * </p>
+ * @param array $arguments <p>
+ * Array of arguments to pass to this function.
+ * </p>
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function functionImage ($function, array $arguments, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * @param $COLORSPACE
+ */
+ public function transformImageColorspace ($COLORSPACE) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Replaces colors in the image
+ * @link https://php.net/manual/en/imagick.haldclutimage.php
+ * @param Imagick $clut <p>
+ * Imagick object containing the Hald lookup image.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function haldClutImage (Imagick $clut, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * @param $CHANNEL [optional]
+ */
+ public function autoLevelImage ($CHANNEL) {}
+
+ /**
+ * @param $factor [optional]
+ */
+ public function blueShiftImage ($factor) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Get image artifact
+ * @link https://php.net/manual/en/imagick.getimageartifact.php
+ * @param string $artifact <p>
+ * The name of the artifact
+ * </p>
+ * @return string the artifact value on success.
+ */
+ public function getImageArtifact ($artifact) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Set image artifact
+ * @link https://php.net/manual/en/imagick.setimageartifact.php
+ * @param string $artifact <p>
+ * The name of the artifact
+ * </p>
+ * @param string $value <p>
+ * The value of the artifact
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageArtifact ($artifact, $value) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Delete image artifact
+ * @link https://php.net/manual/en/imagick.deleteimageartifact.php
+ * @param string $artifact <p>
+ * The name of the artifact to delete
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function deleteImageArtifact ($artifact) {}
+
+ /**
+ * (PECL imagick 0.9.10-0.9.9)<br/>
+ * Gets the colorspace
+ * @link https://php.net/manual/en/imagick.getcolorspace.php
+ * @return int an integer which can be compared against COLORSPACE constants.
+ */
+ public function getColorspace () {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Set colorspace
+ * @link https://php.net/manual/en/imagick.setcolorspace.php
+ * @param int $COLORSPACE <p>
+ * One of the COLORSPACE constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setColorspace ($COLORSPACE) {}
+
+ /**
+ * @param $CHANNEL [optional]
+ */
+ public function clampImage ($CHANNEL) {}
+
+ /**
+ * @param $stack
+ * @param $offset
+ */
+ public function smushImages ($stack, $offset) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * The Imagick constructor
+ * @link https://php.net/manual/en/imagick.construct.php
+ * @param mixed $files <p>
+ * The path to an image to load or an array of paths. Paths can include
+ * wildcards for file names, or can be URLs.
+ * </p>
+ * @throws ImagickException Throws ImagickException on error.
+ */
+ public function __construct ($files = null) {}
+
+ /**
+ * @return string
+ */
+ public function __toString () {}
+
+ public function count () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a MagickPixelIterator
+ * @link https://php.net/manual/en/imagick.getpixeliterator.php
+ * @return ImagickPixelIterator an ImagickPixelIterator on success.
+ */
+ public function getPixelIterator () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Get an ImagickPixelIterator for an image section
+ * @link https://php.net/manual/en/imagick.getpixelregioniterator.php
+ * @param int $x <p>
+ * The x-coordinate of the region.
+ * </p>
+ * @param int $y <p>
+ * The y-coordinate of the region.
+ * </p>
+ * @param int $columns <p>
+ * The width of the region.
+ * </p>
+ * @param int $rows <p>
+ * The height of the region.
+ * </p>
+ * @return ImagickPixelIterator an ImagickPixelIterator for an image section.
+ */
+ public function getPixelRegionIterator ($x, $y, $columns, $rows) {}
+
+ /**
+ * (PECL imagick 0.9.0-0.9.9)<br/>
+ * Reads image from filename
+ * @link https://php.net/manual/en/imagick.readimage.php
+ * @param string $filename
+ * @return bool <b>TRUE</b> on success.
+ * @throws ImagickException Throws ImagickException on error.
+ */
+ public function readImage ($filename) {}
+
+ /**
+ * @param $filenames
+ * @throws ImagickException Throws ImagickException on error.
+ */
+ public function readImages ($filenames) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Reads image from a binary string
+ * @link https://php.net/manual/en/imagick.readimageblob.php
+ * @param string $image
+ * @param string $filename [optional]
+ * @return bool <b>TRUE</b> on success.
+ * @throws ImagickException Throws ImagickException on error.
+ */
+ public function readImageBlob ($image, $filename = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the format of a particular image
+ * @link https://php.net/manual/en/imagick.setimageformat.php
+ * @param string $format <p>
+ * String presentation of the image format. Format support
+ * depends on the ImageMagick installation.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageFormat ($format) {}
+
+ /**
+ * Scales the size of an image to the given dimensions. Passing zero as either of the arguments will preserve dimension while scaling.<br>
+ * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+ * If false, the calculations should produce the same results as ImageMagick CLI does.
+ * @link https://php.net/manual/en/imagick.scaleimage.php
+ * @param int $cols
+ * @param int $rows
+ * @param bool $bestfit [optional] The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool <b>TRUE</b> on success.
+ * @throws ImagickException Throws ImagickException on error
+ * @since 2.0.0
+ */
+ public function scaleImage ($cols, $rows, $bestfit = false, $legacy = false) {}
+
+ /**
+ * (PECL imagick 0.9.0-0.9.9)<br/>
+ * Writes an image to the specified filename
+ * @link https://php.net/manual/en/imagick.writeimage.php
+ * @param string $filename [optional] <p>
+ * Filename where to write the image. The extension of the filename
+ * defines the type of the file.
+ * Format can be forced regardless of file extension using format: prefix,
+ * for example "jpg:test.png".
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function writeImage ($filename = null) {}
+
+ /**
+ * (PECL imagick 0.9.0-0.9.9)<br/>
+ * Writes an image or image sequence
+ * @link https://php.net/manual/en/imagick.writeimages.php
+ * @param string $filename
+ * @param bool $adjoin
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function writeImages ($filename, $adjoin) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds blur filter to image
+ * @link https://php.net/manual/en/imagick.blurimage.php
+ * @param float $radius <p>
+ * Blur radius
+ * </p>
+ * @param float $sigma <p>
+ * Standard deviation
+ * </p>
+ * @param int $channel [optional] <p>
+ * The Channeltype
+ * constant. When not supplied, all channels are blurred.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function blurImage ($radius, $sigma, $channel = null) {}
+
+ /**
+ * Changes the size of an image to the given dimensions and removes any associated profiles.<br>
+ * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+ * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+ * <br>
+ * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @link https://php.net/manual/en/imagick.thumbnailimage.php
+ * @param int $columns <p>
+ * Image width
+ * </p>
+ * @param int $rows <p>
+ * Image height
+ * </p>
+ * @param bool $bestfit [optional] <p>
+ * Whether to force maximum values
+ * </p>
+ * The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched. In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @param bool $fill [optional]
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool <b>TRUE</b> on success.
+ * @since 2.0.0
+ */
+ public function thumbnailImage ($columns, $rows, $bestfit = false, $fill = false, $legacy = false) {}
+
+ /**
+ * Creates a cropped thumbnail at the requested size.
+ * If legacy is true, uses the incorrect behaviour that was present until Imagick 3.4.0.
+ * If false it uses the correct behaviour.
+ * @link https://php.net/manual/en/imagick.cropthumbnailimage.php
+ * @param int $width The width of the thumbnail
+ * @param int $height The Height of the thumbnail
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool TRUE on succes
+ * @throws ImagickException Throws ImagickException on error
+ * @since 2.0.0
+ */
+ public function cropThumbnailImage ($width, $height, $legacy = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the filename of a particular image in a sequence
+ * @link https://php.net/manual/en/imagick.getimagefilename.php
+ * @return string a string with the filename of the image.
+ */
+ public function getImageFilename () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the filename of a particular image
+ * @link https://php.net/manual/en/imagick.setimagefilename.php
+ * @param string $filename
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageFilename ($filename) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the format of a particular image in a sequence
+ * @link https://php.net/manual/en/imagick.getimageformat.php
+ * @return string a string containing the image format on success.
+ */
+ public function getImageFormat () {}
+
+ /**
+ * @link https://secure.php.net/manual/en/imagick.getimagemimetype.php
+ * @return string Returns the image mime-type.
+ */
+ public function getImageMimeType () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Removes an image from the image list
+ * @link https://php.net/manual/en/imagick.removeimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function removeImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Destroys the Imagick object
+ * @link https://php.net/manual/en/imagick.destroy.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function destroy () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clears all resources associated to Imagick object
+ * @link https://php.net/manual/en/imagick.clear.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function clear () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image length in bytes
+ * @link https://php.net/manual/en/imagick.getimagesize.php
+ * @return int an int containing the current image size.
+ * @deprecated use {@see Imagick::getImageLength()} instead
+ */
+ public function getImageSize () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image sequence as a blob
+ * @link https://php.net/manual/en/imagick.getimageblob.php
+ * @return string a string containing the image.
+ */
+ public function getImageBlob () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns all image sequences as a blob
+ * @link https://php.net/manual/en/imagick.getimagesblob.php
+ * @return string a string containing the images. On failure, throws ImagickException on failure
+ * @throws ImagickException on failure
+ */
+ public function getImagesBlob () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the Imagick iterator to the first image
+ * @link https://php.net/manual/en/imagick.setfirstiterator.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFirstIterator () {}
+
+ /**
+ * (PECL imagick 2.0.1)<br/>
+ * Sets the Imagick iterator to the last image
+ * @link https://php.net/manual/en/imagick.setlastiterator.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setLastIterator () {}
+
+ public function resetIterator () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Move to the previous image in the object
+ * @link https://php.net/manual/en/imagick.previousimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function previousImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Moves to the next image
+ * @link https://php.net/manual/en/imagick.nextimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function nextImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Checks if the object has a previous image
+ * @link https://php.net/manual/en/imagick.haspreviousimage.php
+ * @return bool <b>TRUE</b> if the object has more images when traversing the list in the
+ * reverse direction, returns <b>FALSE</b> if there are none.
+ */
+ public function hasPreviousImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Checks if the object has more images
+ * @link https://php.net/manual/en/imagick.hasnextimage.php
+ * @return bool <b>TRUE</b> if the object has more images when traversing the list in the
+ * forward direction, returns <b>FALSE</b> if there are none.
+ */
+ public function hasNextImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Set the iterator position
+ * @link https://php.net/manual/en/imagick.setimageindex.php
+ * @param int $index <p>
+ * The position to set the iterator to
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageIndex ($index) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the index of the current active image
+ * @link https://php.net/manual/en/imagick.getimageindex.php
+ * @return int an integer containing the index of the image in the stack.
+ */
+ public function getImageIndex () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a comment to your image
+ * @link https://php.net/manual/en/imagick.commentimage.php
+ * @param string $comment <p>
+ * The comment to add
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function commentImage ($comment) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Extracts a region of the image
+ * @link https://php.net/manual/en/imagick.cropimage.php
+ * @param int $width <p>
+ * The width of the crop
+ * </p>
+ * @param int $height <p>
+ * The height of the crop
+ * </p>
+ * @param int $x <p>
+ * The X coordinate of the cropped region's top left corner
+ * </p>
+ * @param int $y <p>
+ * The Y coordinate of the cropped region's top left corner
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function cropImage ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a label to an image
+ * @link https://php.net/manual/en/imagick.labelimage.php
+ * @param string $label <p>
+ * The label to add
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function labelImage ($label) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the width and height as an associative array
+ * @link https://php.net/manual/en/imagick.getimagegeometry.php
+ * @return array an array with the width/height of the image.
+ */
+ public function getImageGeometry () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Renders the ImagickDraw object on the current image
+ * @link https://php.net/manual/en/imagick.drawimage.php
+ * @param ImagickDraw $draw <p>
+ * The drawing operations to render on the image.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function drawImage (ImagickDraw $draw) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Sets the image compression quality
+ * @link https://php.net/manual/en/imagick.setimagecompressionquality.php
+ * @param int $quality <p>
+ * The image compression quality as an integer
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageCompressionQuality ($quality) {}
+
+ /**
+ * (PECL imagick 2.2.2)<br/>
+ * Gets the current image's compression quality
+ * @link https://php.net/manual/en/imagick.getimagecompressionquality.php
+ * @return int integer describing the images compression quality
+ */
+ public function getImageCompressionQuality () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Annotates an image with text
+ * @link https://php.net/manual/en/imagick.annotateimage.php
+ * @param ImagickDraw $draw_settings <p>
+ * The ImagickDraw object that contains settings for drawing the text
+ * </p>
+ * @param float $x <p>
+ * Horizontal offset in pixels to the left of text
+ * </p>
+ * @param float $y <p>
+ * Vertical offset in pixels to the baseline of text
+ * </p>
+ * @param float $angle <p>
+ * The angle at which to write the text
+ * </p>
+ * @param string $text <p>
+ * The string to draw
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function annotateImage (ImagickDraw $draw_settings, $x, $y, $angle, $text) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Composite one image onto another
+ * @link https://php.net/manual/en/imagick.compositeimage.php
+ * @param Imagick $composite_object <p>
+ * Imagick object which holds the composite image
+ * </p>
+ * @param int $composite Composite operator
+ * @param int $x <p>
+ * The column offset of the composited image
+ * </p>
+ * @param int $y <p>
+ * The row offset of the composited image
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function compositeImage (Imagick $composite_object, $composite, $x, $y, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Control the brightness, saturation, and hue
+ * @link https://php.net/manual/en/imagick.modulateimage.php
+ * @param float $brightness
+ * @param float $saturation
+ * @param float $hue
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function modulateImage ($brightness, $saturation, $hue) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the number of unique colors in the image
+ * @link https://php.net/manual/en/imagick.getimagecolors.php
+ * @return int <b>TRUE</b> on success.
+ */
+ public function getImageColors () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a composite image
+ * @link https://php.net/manual/en/imagick.montageimage.php
+ * @param ImagickDraw $draw <p>
+ * The font name, size, and color are obtained from this object.
+ * </p>
+ * @param string $tile_geometry <p>
+ * The number of tiles per row and page (e.g. 6x4+0+0).
+ * </p>
+ * @param string $thumbnail_geometry <p>
+ * Preferred image size and border size of each thumbnail
+ * (e.g. 120x120+4+3>).
+ * </p>
+ * @param int $mode <p>
+ * Thumbnail framing mode, see Montage Mode constants.
+ * </p>
+ * @param string $frame <p>
+ * Surround the image with an ornamental border (e.g. 15x15+3+3). The
+ * frame color is that of the thumbnail's matte color.
+ * </p>
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function montageImage (ImagickDraw $draw, $tile_geometry, $thumbnail_geometry, $mode, $frame) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Identifies an image and fetches attributes
+ * @link https://php.net/manual/en/imagick.identifyimage.php
+ * @param bool $appendRawOutput [optional]
+ * @return array Identifies an image and returns the attributes. Attributes include
+ * the image width, height, size, and others.
+ */
+ public function identifyImage ($appendRawOutput = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Changes the value of individual pixels based on a threshold
+ * @link https://php.net/manual/en/imagick.thresholdimage.php
+ * @param float $threshold
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function thresholdImage ($threshold, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Selects a threshold for each pixel based on a range of intensity
+ * @link https://php.net/manual/en/imagick.adaptivethresholdimage.php
+ * @param int $width <p>
+ * Width of the local neighborhood.
+ * </p>
+ * @param int $height <p>
+ * Height of the local neighborhood.
+ * </p>
+ * @param int $offset <p>
+ * The mean offset
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function adaptiveThresholdImage ($width, $height, $offset) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Forces all pixels below the threshold into black
+ * @link https://php.net/manual/en/imagick.blackthresholdimage.php
+ * @param mixed $threshold <p>
+ * The threshold below which everything turns black
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function blackThresholdImage ($threshold) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Force all pixels above the threshold into white
+ * @link https://php.net/manual/en/imagick.whitethresholdimage.php
+ * @param mixed $threshold
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function whiteThresholdImage ($threshold) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Append a set of images
+ * @link https://php.net/manual/en/imagick.appendimages.php
+ * @param bool $stack [optional] <p>
+ * Whether to stack the images vertically.
+ * By default (or if <b>FALSE</b> is specified) images are stacked left-to-right.
+ * If <i>stack</i> is <b>TRUE</b>, images are stacked top-to-bottom.
+ * </p>
+ * @return Imagick Imagick instance on success.
+ */
+ public function appendImages ($stack = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates a charcoal drawing
+ * @link https://php.net/manual/en/imagick.charcoalimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function charcoalImage ($radius, $sigma) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Enhances the contrast of a color image
+ * @link https://php.net/manual/en/imagick.normalizeimage.php
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function normalizeImage ($channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates an oil painting
+ * @link https://php.net/manual/en/imagick.oilpaintimage.php
+ * @param float $radius <p>
+ * The radius of the circular neighborhood.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function oilPaintImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Reduces the image to a limited number of color level
+ * @link https://php.net/manual/en/imagick.posterizeimage.php
+ * @param int $levels
+ * @param bool $dither
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function posterizeImage ($levels, $dither) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Radial blurs an image
+ * @link https://php.net/manual/en/imagick.radialblurimage.php
+ * @param float $angle
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function radialBlurImage ($angle, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a simulated 3d button-like effect
+ * @link https://php.net/manual/en/imagick.raiseimage.php
+ * @param int $width
+ * @param int $height
+ * @param int $x
+ * @param int $y
+ * @param bool $raise
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function raiseImage ($width, $height, $x, $y, $raise) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Resample image to desired resolution
+ * @link https://php.net/manual/en/imagick.resampleimage.php
+ * @param float $x_resolution
+ * @param float $y_resolution
+ * @param int $filter
+ * @param float $blur
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function resampleImage ($x_resolution, $y_resolution, $filter, $blur) {}
+
+ /**
+ * Scales an image to the desired dimensions with one of these filters:<br>
+ * If legacy is true, the calculations are done with the small rounding bug that existed in Imagick before 3.4.0.<br>
+ * If false, the calculations should produce the same results as ImageMagick CLI does.<br>
+ * <br>
+ * <b>Note:</b> The behavior of the parameter bestfit changed in Imagick 3.0.0. Before this version given dimensions 400x400 an image of dimensions 200x150 would be left untouched.<br>
+ * In Imagick 3.0.0 and later the image would be scaled up to size 400x300 as this is the "best fit" for the given dimensions. If bestfit parameter is used both width and height must be given.
+ * @link https://php.net/manual/en/imagick.resizeimage.php
+ * @param int $columns Width of the image
+ * @param int $rows Height of the image
+ * @param int $filter Refer to the list of filter constants.
+ * @param float $blur The blur factor where > 1 is blurry, < 1 is sharp.
+ * @param bool $bestfit [optional] Added since 2.1.0. Added optional fit parameter. This method now supports proportional scaling. Pass zero as either parameter for proportional scaling
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool TRUE on success
+ * @since 2.0.0
+ */
+ public function resizeImage ($columns, $rows, $filter, $blur, $bestfit = false, $legacy = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Offsets an image
+ * @link https://php.net/manual/en/imagick.rollimage.php
+ * @param int $x <p>
+ * The X offset.
+ * </p>
+ * @param int $y <p>
+ * The Y offset.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function rollImage ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Rotates an image
+ * @link https://php.net/manual/en/imagick.rotateimage.php
+ * @param mixed $background <p>
+ * The background color
+ * </p>
+ * @param float $degrees <p>
+ * The number of degrees to rotate the image
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function rotateImage ($background, $degrees) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Scales an image with pixel sampling
+ * @link https://php.net/manual/en/imagick.sampleimage.php
+ * @param int $columns
+ * @param int $rows
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sampleImage ($columns, $rows) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies a solarizing effect to the image
+ * @link https://php.net/manual/en/imagick.solarizeimage.php
+ * @param int $threshold
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function solarizeImage ($threshold) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates an image shadow
+ * @link https://php.net/manual/en/imagick.shadowimage.php
+ * @param float $opacity
+ * @param float $sigma
+ * @param int $x
+ * @param int $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function shadowImage ($opacity, $sigma, $x, $y) {}
+
+ /**
+ * @param $key
+ * @param $value
+ */
+ public function setImageAttribute ($key, $value) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image background color
+ * @link https://php.net/manual/en/imagick.setimagebackgroundcolor.php
+ * @param mixed $background
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageBackgroundColor ($background) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image composite operator
+ * @link https://php.net/manual/en/imagick.setimagecompose.php
+ * @param int $compose
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageCompose ($compose) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image compression
+ * @link https://php.net/manual/en/imagick.setimagecompression.php
+ * @param int $compression <p>
+ * One of the <b>COMPRESSION</b> constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageCompression ($compression) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image delay
+ * @link https://php.net/manual/en/imagick.setimagedelay.php
+ * @param int $delay <p>
+ * The amount of time expressed in 'ticks' that the image should be
+ * displayed for. For animated GIFs there are 100 ticks per second, so a
+ * value of 20 would be 20/100 of a second aka 1/5th of a second.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageDelay ($delay) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image depth
+ * @link https://php.net/manual/en/imagick.setimagedepth.php
+ * @param int $depth
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageDepth ($depth) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image gamma
+ * @link https://php.net/manual/en/imagick.setimagegamma.php
+ * @param float $gamma
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageGamma ($gamma) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image iterations
+ * @link https://php.net/manual/en/imagick.setimageiterations.php
+ * @param int $iterations <p>
+ * The number of iterations the image should loop over. Set to '0' to loop
+ * continuously.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageIterations ($iterations) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image matte color
+ * @link https://php.net/manual/en/imagick.setimagemattecolor.php
+ * @param mixed $matte
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageMatteColor ($matte) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the page geometry of the image
+ * @link https://php.net/manual/en/imagick.setimagepage.php
+ * @param int $width
+ * @param int $height
+ * @param int $x
+ * @param int $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImagePage ($width, $height, $x, $y) {}
+
+ /**
+ * @param $filename
+ */
+ public function setImageProgressMonitor ($filename) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image resolution
+ * @link https://php.net/manual/en/imagick.setimageresolution.php
+ * @param float $x_resolution
+ * @param float $y_resolution
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageResolution ($x_resolution, $y_resolution) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image scene
+ * @link https://php.net/manual/en/imagick.setimagescene.php
+ * @param int $scene
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageScene ($scene) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image ticks-per-second
+ * @link https://php.net/manual/en/imagick.setimagetickspersecond.php
+ * @param int $ticks_per_second <p>
+ * The duration for which an image should be displayed expressed in ticks
+ * per second.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageTicksPerSecond ($ticks_per_second) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image type
+ * @link https://php.net/manual/en/imagick.setimagetype.php
+ * @param int $image_type
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageType ($image_type) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image units of resolution
+ * @link https://php.net/manual/en/imagick.setimageunits.php
+ * @param int $units
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageUnits ($units) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sharpens an image
+ * @link https://php.net/manual/en/imagick.sharpenimage.php
+ * @param float $radius
+ * @param float $sigma
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sharpenImage ($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Shaves pixels from the image edges
+ * @link https://php.net/manual/en/imagick.shaveimage.php
+ * @param int $columns
+ * @param int $rows
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function shaveImage ($columns, $rows) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creating a parallelogram
+ * @link https://php.net/manual/en/imagick.shearimage.php
+ * @param mixed $background <p>
+ * The background color
+ * </p>
+ * @param float $x_shear <p>
+ * The number of degrees to shear on the x axis
+ * </p>
+ * @param float $y_shear <p>
+ * The number of degrees to shear on the y axis
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function shearImage ($background, $x_shear, $y_shear) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Splices a solid color into the image
+ * @link https://php.net/manual/en/imagick.spliceimage.php
+ * @param int $width
+ * @param int $height
+ * @param int $x
+ * @param int $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function spliceImage ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Fetch basic attributes about the image
+ * @link https://php.net/manual/en/imagick.pingimage.php
+ * @param string $filename <p>
+ * The filename to read the information from.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function pingImage ($filename) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Reads image from open filehandle
+ * @link https://php.net/manual/en/imagick.readimagefile.php
+ * @param resource $filehandle
+ * @param string $fileName [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function readImageFile ($filehandle, $fileName = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Displays an image
+ * @link https://php.net/manual/en/imagick.displayimage.php
+ * @param string $servername <p>
+ * The X server name
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function displayImage ($servername) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Displays an image or image sequence
+ * @link https://php.net/manual/en/imagick.displayimages.php
+ * @param string $servername <p>
+ * The X server name
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function displayImages ($servername) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Randomly displaces each pixel in a block
+ * @link https://php.net/manual/en/imagick.spreadimage.php
+ * @param float $radius
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function spreadImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Swirls the pixels about the center of the image
+ * @link https://php.net/manual/en/imagick.swirlimage.php
+ * @param float $degrees
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function swirlImage ($degrees) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Strips an image of all profiles and comments
+ * @link https://php.net/manual/en/imagick.stripimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function stripImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns formats supported by Imagick
+ * @link https://php.net/manual/en/imagick.queryformats.php
+ * @param string $pattern [optional]
+ * @return array an array containing the formats supported by Imagick.
+ */
+ public static function queryFormats ($pattern = "*") {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the configured fonts
+ * @link https://php.net/manual/en/imagick.queryfonts.php
+ * @param string $pattern [optional] <p>
+ * The query pattern
+ * </p>
+ * @return array an array containing the configured fonts.
+ */
+ public static function queryFonts ($pattern = "*") {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns an array representing the font metrics
+ * @link https://php.net/manual/en/imagick.queryfontmetrics.php
+ * @param ImagickDraw $properties <p>
+ * ImagickDraw object containing font properties
+ * </p>
+ * @param string $text <p>
+ * The text
+ * </p>
+ * @param bool $multiline [optional] <p>
+ * Multiline parameter. If left empty it is autodetected
+ * </p>
+ * @return array a multi-dimensional array representing the font metrics.
+ */
+ public function queryFontMetrics (ImagickDraw $properties, $text, $multiline = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Hides a digital watermark within the image
+ * @link https://php.net/manual/en/imagick.steganoimage.php
+ * @param Imagick $watermark_wand
+ * @param int $offset
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function steganoImage (Imagick $watermark_wand, $offset) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds random noise to the image
+ * @link https://php.net/manual/en/imagick.addnoiseimage.php
+ * @param int $noise_type <p>
+ * The type of the noise. Refer to this list of
+ * noise constants.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function addNoiseImage ($noise_type, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Simulates motion blur
+ * @link https://php.net/manual/en/imagick.motionblurimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel.
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels.
+ * </p>
+ * @param float $angle <p>
+ * Apply the effect along this angle.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * The channel argument affects only if Imagick is compiled against ImageMagick version
+ * 6.4.4 or greater.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function motionBlurImage ($radius, $sigma, $angle, $channel = Imagick::CHANNEL_DEFAULT) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Forms a mosaic from images
+ * @link https://php.net/manual/en/imagick.mosaicimages.php
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function mosaicImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Method morphs a set of images
+ * @link https://php.net/manual/en/imagick.morphimages.php
+ * @param int $number_frames <p>
+ * The number of in-between images to generate.
+ * </p>
+ * @return Imagick This method returns a new Imagick object on success.
+ * Throw an <b>ImagickException</b> on error.
+ * @throws ImagickException on error
+ */
+ public function morphImages ($number_frames) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Scales an image proportionally to half its size
+ * @link https://php.net/manual/en/imagick.minifyimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function minifyImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Transforms an image
+ * @link https://php.net/manual/en/imagick.affinetransformimage.php
+ * @param ImagickDraw $matrix <p>
+ * The affine matrix
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function affineTransformImage (ImagickDraw $matrix) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Average a set of images
+ * @link https://php.net/manual/en/imagick.averageimages.php
+ * @return Imagick a new Imagick object on success.
+ */
+ public function averageImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Surrounds the image with a border
+ * @link https://php.net/manual/en/imagick.borderimage.php
+ * @param mixed $bordercolor <p>
+ * ImagickPixel object or a string containing the border color
+ * </p>
+ * @param int $width <p>
+ * Border width
+ * </p>
+ * @param int $height <p>
+ * Border height
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function borderImage ($bordercolor, $width, $height) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Removes a region of an image and trims
+ * @link https://php.net/manual/en/imagick.chopimage.php
+ * @param int $width <p>
+ * Width of the chopped area
+ * </p>
+ * @param int $height <p>
+ * Height of the chopped area
+ * </p>
+ * @param int $x <p>
+ * X origo of the chopped area
+ * </p>
+ * @param int $y <p>
+ * Y origo of the chopped area
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function chopImage ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clips along the first path from the 8BIM profile
+ * @link https://php.net/manual/en/imagick.clipimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function clipImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clips along the named paths from the 8BIM profile
+ * @link https://php.net/manual/en/imagick.clippathimage.php
+ * @param string $pathname <p>
+ * The name of the path
+ * </p>
+ * @param bool $inside <p>
+ * If <b>TRUE</b> later operations take effect inside clipping path.
+ * Otherwise later operations take effect outside clipping path.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function clipPathImage ($pathname, $inside) {}
+
+ /**
+ * @param $pathname
+ * @param $inside
+ */
+ public function clipImagePath ($pathname, $inside) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Composites a set of images
+ * @link https://php.net/manual/en/imagick.coalesceimages.php
+ * @return Imagick a new Imagick object on success.
+ */
+ public function coalesceImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Changes the color value of any pixel that matches target
+ * @link https://php.net/manual/en/imagick.colorfloodfillimage.php
+ * @param mixed $fill <p>
+ * ImagickPixel object containing the fill color
+ * </p>
+ * @param float $fuzz <p>
+ * The amount of fuzz. For example, set fuzz to 10 and the color red at
+ * intensities of 100 and 102 respectively are now interpreted as the
+ * same color for the purposes of the floodfill.
+ * </p>
+ * @param mixed $bordercolor <p>
+ * ImagickPixel object containing the border color
+ * </p>
+ * @param int $x <p>
+ * X start position of the floodfill
+ * </p>
+ * @param int $y <p>
+ * Y start position of the floodfill
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function colorFloodfillImage ($fill, $fuzz, $bordercolor, $x, $y) {}
+
+ /**
+ * Blends the fill color with each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied.<br>
+ * If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0
+ * @link https://php.net/manual/en/imagick.colorizeimage.php
+ * @param mixed $colorize <p>
+ * ImagickPixel object or a string containing the colorize color
+ * </p>
+ * @param mixed $opacity <p>
+ * ImagickPixel object or an float containing the opacity value.
+ * 1.0 is fully opaque and 0.0 is fully transparent.
+ * </p>
+ * @param bool $legacy [optional] Added since 3.4.0. Default value FALSE
+ * @return bool <b>TRUE</b> on success.
+ * @throws ImagickException Throws ImagickException on error
+ * @since 2.0.0
+ */
+ public function colorizeImage ($colorize, $opacity, $legacy = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the difference in one or more images
+ * @link https://php.net/manual/en/imagick.compareimagechannels.php
+ * @param Imagick $image <p>
+ * Imagick object containing the image to compare.
+ * </p>
+ * @param int $channelType <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @param int $metricType <p>
+ * One of the metric type constants.
+ * </p>
+ * @return array Array consisting of new_wand and
+ * distortion.
+ */
+ public function compareImageChannels (Imagick $image, $channelType, $metricType) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Compares an image to a reconstructed image
+ * @link https://php.net/manual/en/imagick.compareimages.php
+ * @param Imagick $compare <p>
+ * An image to compare to.
+ * </p>
+ * @param int $metric <p>
+ * Provide a valid metric type constant. Refer to this
+ * list of metric constants.
+ * </p>
+ * @return array Array consisting of an Imagick object of the
+ * reconstructed image and a float representing the difference.
+ * @throws ImagickException Throws ImagickException on error.
+ */
+ public function compareImages (Imagick $compare, $metric) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Change the contrast of the image
+ * @link https://php.net/manual/en/imagick.contrastimage.php
+ * @param bool $sharpen <p>
+ * The sharpen value
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function contrastImage ($sharpen) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Combines one or more images into a single image
+ * @link https://php.net/manual/en/imagick.combineimages.php
+ * @param int $channelType <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function combineImages ($channelType) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies a custom convolution kernel to the image
+ * @link https://php.net/manual/en/imagick.convolveimage.php
+ * @param array $kernel <p>
+ * The convolution kernel
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function convolveImage (array $kernel, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Displaces an image's colormap
+ * @link https://php.net/manual/en/imagick.cyclecolormapimage.php
+ * @param int $displace <p>
+ * The amount to displace the colormap.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function cycleColormapImage ($displace) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns certain pixel differences between images
+ * @link https://php.net/manual/en/imagick.deconstructimages.php
+ * @return Imagick a new Imagick object on success.
+ */
+ public function deconstructImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Reduces the speckle noise in an image
+ * @link https://php.net/manual/en/imagick.despeckleimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function despeckleImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Enhance edges within the image
+ * @link https://php.net/manual/en/imagick.edgeimage.php
+ * @param float $radius <p>
+ * The radius of the operation.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function edgeImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a grayscale image with a three-dimensional effect
+ * @link https://php.net/manual/en/imagick.embossimage.php
+ * @param float $radius <p>
+ * The radius of the effect
+ * </p>
+ * @param float $sigma <p>
+ * The sigma of the effect
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function embossImage ($radius, $sigma) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Improves the quality of a noisy image
+ * @link https://php.net/manual/en/imagick.enhanceimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function enhanceImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Equalizes the image histogram
+ * @link https://php.net/manual/en/imagick.equalizeimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function equalizeImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies an expression to an image
+ * @link https://php.net/manual/en/imagick.evaluateimage.php
+ * @param int $op <p>
+ * The evaluation operator
+ * </p>
+ * @param float $constant <p>
+ * The value of the operator
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function evaluateImage ($op, $constant, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * Merges a sequence of images. This is useful for combining Photoshop layers into a single image.
+ * This is replaced by:
+ * <pre>
+ * $im = $im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)
+ * </pre>
+ * @link https://php.net/manual/en/imagick.flattenimages.php
+ * @return Imagick Returns an Imagick object containing the merged image.
+ * @throws ImagickException Throws ImagickException on error.
+ * @since 2.0.0
+ */
+ public function flattenImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a vertical mirror image
+ * @link https://php.net/manual/en/imagick.flipimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function flipImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a horizontal mirror image
+ * @link https://php.net/manual/en/imagick.flopimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function flopImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a simulated three-dimensional border
+ * @link https://php.net/manual/en/imagick.frameimage.php
+ * @param mixed $matte_color <p>
+ * ImagickPixel object or a string representing the matte color
+ * </p>
+ * @param int $width <p>
+ * The width of the border
+ * </p>
+ * @param int $height <p>
+ * The height of the border
+ * </p>
+ * @param int $inner_bevel <p>
+ * The inner bevel width
+ * </p>
+ * @param int $outer_bevel <p>
+ * The outer bevel width
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function frameImage ($matte_color, $width, $height, $inner_bevel, $outer_bevel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Evaluate expression for each pixel in the image
+ * @link https://php.net/manual/en/imagick.fximage.php
+ * @param string $expression <p>
+ * The expression.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return Imagick <b>TRUE</b> on success.
+ */
+ public function fxImage ($expression, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gamma-corrects an image
+ * @link https://php.net/manual/en/imagick.gammaimage.php
+ * @param float $gamma <p>
+ * The amount of gamma-correction.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function gammaImage ($gamma, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Blurs an image
+ * @link https://php.net/manual/en/imagick.gaussianblurimage.php
+ * @param float $radius <p>
+ * The radius of the Gaussian, in pixels, not counting the center pixel.
+ * </p>
+ * @param float $sigma <p>
+ * The standard deviation of the Gaussian, in pixels.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function gaussianBlurImage ($radius, $sigma, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * @param $key
+ */
+ public function getImageAttribute ($key) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image background color
+ * @link https://php.net/manual/en/imagick.getimagebackgroundcolor.php
+ * @return ImagickPixel an ImagickPixel set to the background color of the image.
+ */
+ public function getImageBackgroundColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the chromaticy blue primary point
+ * @link https://php.net/manual/en/imagick.getimageblueprimary.php
+ * @return array Array consisting of "x" and "y" coordinates of point.
+ */
+ public function getImageBluePrimary () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image border color
+ * @link https://php.net/manual/en/imagick.getimagebordercolor.php
+ * @return ImagickPixel <b>TRUE</b> on success.
+ */
+ public function getImageBorderColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the depth for a particular image channel
+ * @link https://php.net/manual/en/imagick.getimagechanneldepth.php
+ * @param int $channel <p>
+ * Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to <b>Imagick::CHANNEL_DEFAULT</b>. Refer to this list of channel constants
+ * </p>
+ * @return int <b>TRUE</b> on success.
+ */
+ public function getImageChannelDepth ($channel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Compares image channels of an image to a reconstructed image
+ * @link https://php.net/manual/en/imagick.getimagechanneldistortion.php
+ * @param Imagick $reference <p>
+ * Imagick object to compare to.
+ * </p>
+ * @param int $channel <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @param int $metric <p>
+ * One of the metric type constants.
+ * </p>
+ * @return float <b>TRUE</b> on success.
+ */
+ public function getImageChannelDistortion (Imagick $reference, $channel, $metric) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the extrema for one or more image channels
+ * @link https://php.net/manual/en/imagick.getimagechannelextrema.php
+ * @param int $channel <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return array <b>TRUE</b> on success.
+ */
+ public function getImageChannelExtrema ($channel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the mean and standard deviation
+ * @link https://php.net/manual/en/imagick.getimagechannelmean.php
+ * @param int $channel <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return array <b>TRUE</b> on success.
+ */
+ public function getImageChannelMean ($channel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns statistics for each channel in the image
+ * @link https://php.net/manual/en/imagick.getimagechannelstatistics.php
+ * @return array <b>TRUE</b> on success.
+ */
+ public function getImageChannelStatistics () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the color of the specified colormap index
+ * @link https://php.net/manual/en/imagick.getimagecolormapcolor.php
+ * @param int $index <p>
+ * The offset into the image colormap.
+ * </p>
+ * @return ImagickPixel <b>TRUE</b> on success.
+ */
+ public function getImageColormapColor ($index) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image colorspace
+ * @link https://php.net/manual/en/imagick.getimagecolorspace.php
+ * @return int <b>TRUE</b> on success.
+ */
+ public function getImageColorspace () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the composite operator associated with the image
+ * @link https://php.net/manual/en/imagick.getimagecompose.php
+ * @return int <b>TRUE</b> on success.
+ */
+ public function getImageCompose () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image delay
+ * @link https://php.net/manual/en/imagick.getimagedelay.php
+ * @return int the image delay.
+ */
+ public function getImageDelay () {}
+
+ /**
+ * (PECL imagick 0.9.1-0.9.9)<br/>
+ * Gets the image depth
+ * @link https://php.net/manual/en/imagick.getimagedepth.php
+ * @return int The image depth.
+ */
+ public function getImageDepth () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Compares an image to a reconstructed image
+ * @link https://php.net/manual/en/imagick.getimagedistortion.php
+ * @param Imagick $reference <p>
+ * Imagick object to compare to.
+ * </p>
+ * @param int $metric <p>
+ * One of the metric type constants.
+ * </p>
+ * @return float the distortion metric used on the image (or the best guess
+ * thereof).
+ */
+ public function getImageDistortion (Imagick $reference, $metric) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the extrema for the image
+ * @link https://php.net/manual/en/imagick.getimageextrema.php
+ * @return array an associative array with the keys "min" and "max".
+ */
+ public function getImageExtrema () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image disposal method
+ * @link https://php.net/manual/en/imagick.getimagedispose.php
+ * @return int the dispose method on success.
+ */
+ public function getImageDispose () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image gamma
+ * @link https://php.net/manual/en/imagick.getimagegamma.php
+ * @return float the image gamma on success.
+ */
+ public function getImageGamma () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the chromaticy green primary point
+ * @link https://php.net/manual/en/imagick.getimagegreenprimary.php
+ * @return array an array with the keys "x" and "y" on success, throws an ImagickException on failure.
+ * @throws ImagickException on failure
+ */
+ public function getImageGreenPrimary () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image height
+ * @link https://php.net/manual/en/imagick.getimageheight.php
+ * @return int the image height in pixels.
+ */
+ public function getImageHeight () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image histogram
+ * @link https://php.net/manual/en/imagick.getimagehistogram.php
+ * @return array the image histogram as an array of ImagickPixel objects.
+ */
+ public function getImageHistogram () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image interlace scheme
+ * @link https://php.net/manual/en/imagick.getimageinterlacescheme.php
+ * @return int the interlace scheme as an integer on success.
+ * Trhow an <b>ImagickException</b> on error.
+ * @throws ImagickException on error
+ */
+ public function getImageInterlaceScheme () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image iterations
+ * @link https://php.net/manual/en/imagick.getimageiterations.php
+ * @return int the image iterations as an integer.
+ */
+ public function getImageIterations () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image matte color
+ * @link https://php.net/manual/en/imagick.getimagemattecolor.php
+ * @return ImagickPixel ImagickPixel object on success.
+ */
+ public function getImageMatteColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the page geometry
+ * @link https://php.net/manual/en/imagick.getimagepage.php
+ * @return array the page geometry associated with the image in an array with the
+ * keys "width", "height", "x", and "y".
+ */
+ public function getImagePage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the color of the specified pixel
+ * @link https://php.net/manual/en/imagick.getimagepixelcolor.php
+ * @param int $x <p>
+ * The x-coordinate of the pixel
+ * </p>
+ * @param int $y <p>
+ * The y-coordinate of the pixel
+ * </p>
+ * @return ImagickPixel an ImagickPixel instance for the color at the coordinates given.
+ */
+ public function getImagePixelColor ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the named image profile
+ * @link https://php.net/manual/en/imagick.getimageprofile.php
+ * @param string $name <p>
+ * The name of the profile to return.
+ * </p>
+ * @return string a string containing the image profile.
+ */
+ public function getImageProfile ($name) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the chromaticity red primary point
+ * @link https://php.net/manual/en/imagick.getimageredprimary.php
+ * @return array the chromaticity red primary point as an array with the keys "x"
+ * and "y".
+ * Throw an <b>ImagickException</b> on error.
+ * @throws ImagickException on error
+ */
+ public function getImageRedPrimary () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image rendering intent
+ * @link https://php.net/manual/en/imagick.getimagerenderingintent.php
+ * @return int the image rendering intent.
+ */
+ public function getImageRenderingIntent () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image X and Y resolution
+ * @link https://php.net/manual/en/imagick.getimageresolution.php
+ * @return array the resolution as an array.
+ */
+ public function getImageResolution () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image scene
+ * @link https://php.net/manual/en/imagick.getimagescene.php
+ * @return int the image scene.
+ */
+ public function getImageScene () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Generates an SHA-256 message digest
+ * @link https://php.net/manual/en/imagick.getimagesignature.php
+ * @return string a string containing the SHA-256 hash of the file.
+ */
+ public function getImageSignature () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image ticks-per-second
+ * @link https://php.net/manual/en/imagick.getimagetickspersecond.php
+ * @return int the image ticks-per-second.
+ */
+ public function getImageTicksPerSecond () {}
+
+ /**
+ * (PECL imagick 0.9.10-0.9.9)<br/>
+ * Gets the potential image type
+ * @link https://php.net/manual/en/imagick.getimagetype.php
+ * @return int the potential image type.
+ * <b>imagick::IMGTYPE_UNDEFINED</b>
+ * <b>imagick::IMGTYPE_BILEVEL</b>
+ * <b>imagick::IMGTYPE_GRAYSCALE</b>
+ * <b>imagick::IMGTYPE_GRAYSCALEMATTE</b>
+ * <b>imagick::IMGTYPE_PALETTE</b>
+ * <b>imagick::IMGTYPE_PALETTEMATTE</b>
+ * <b>imagick::IMGTYPE_TRUECOLOR</b>
+ * <b>imagick::IMGTYPE_TRUECOLORMATTE</b>
+ * <b>imagick::IMGTYPE_COLORSEPARATION</b>
+ * <b>imagick::IMGTYPE_COLORSEPARATIONMATTE</b>
+ * <b>imagick::IMGTYPE_OPTIMIZE</b>
+ */
+ public function getImageType () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image units of resolution
+ * @link https://php.net/manual/en/imagick.getimageunits.php
+ * @return int the image units of resolution.
+ */
+ public function getImageUnits () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the virtual pixel method
+ * @link https://php.net/manual/en/imagick.getimagevirtualpixelmethod.php
+ * @return int the virtual pixel method on success.
+ */
+ public function getImageVirtualPixelMethod () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the chromaticity white point
+ * @link https://php.net/manual/en/imagick.getimagewhitepoint.php
+ * @return array the chromaticity white point as an associative array with the keys
+ * "x" and "y".
+ */
+ public function getImageWhitePoint () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the image width
+ * @link https://php.net/manual/en/imagick.getimagewidth.php
+ * @return int the image width.
+ */
+ public function getImageWidth () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the number of images in the object
+ * @link https://php.net/manual/en/imagick.getnumberimages.php
+ * @return int the number of images associated with Imagick object.
+ */
+ public function getNumberImages () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the image total ink density
+ * @link https://php.net/manual/en/imagick.getimagetotalinkdensity.php
+ * @return float the image total ink density of the image.
+ * Throw an <b>ImagickException</b> on error.
+ * @throws ImagickException on error
+ */
+ public function getImageTotalInkDensity () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Extracts a region of the image
+ * @link https://php.net/manual/en/imagick.getimageregion.php
+ * @param int $width <p>
+ * The width of the extracted region.
+ * </p>
+ * @param int $height <p>
+ * The height of the extracted region.
+ * </p>
+ * @param int $x <p>
+ * X-coordinate of the top-left corner of the extracted region.
+ * </p>
+ * @param int $y <p>
+ * Y-coordinate of the top-left corner of the extracted region.
+ * </p>
+ * @return Imagick Extracts a region of the image and returns it as a new wand.
+ */
+ public function getImageRegion ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a new image as a copy
+ * @link https://php.net/manual/en/imagick.implodeimage.php
+ * @param float $radius <p>
+ * The radius of the implode
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function implodeImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adjusts the levels of an image
+ * @link https://php.net/manual/en/imagick.levelimage.php
+ * @param float $blackPoint <p>
+ * The image black point
+ * </p>
+ * @param float $gamma <p>
+ * The gamma value
+ * </p>
+ * @param float $whitePoint <p>
+ * The image white point
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function levelImage ($blackPoint, $gamma, $whitePoint, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Scales an image proportionally 2x
+ * @link https://php.net/manual/en/imagick.magnifyimage.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function magnifyImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Replaces the colors of an image with the closest color from a reference image.
+ * @link https://php.net/manual/en/imagick.mapimage.php
+ * @param Imagick $map
+ * @param bool $dither
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function mapImage (Imagick $map, $dither) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Changes the transparency value of a color
+ * @link https://php.net/manual/en/imagick.mattefloodfillimage.php
+ * @param float $alpha <p>
+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+ * transparent.
+ * </p>
+ * @param float $fuzz <p>
+ * The fuzz member of image defines how much tolerance is acceptable to
+ * consider two colors as the same.
+ * </p>
+ * @param mixed $bordercolor <p>
+ * An <b>ImagickPixel</b> object or string representing the border color.
+ * </p>
+ * @param int $x <p>
+ * The starting x coordinate of the operation.
+ * </p>
+ * @param int $y <p>
+ * The starting y coordinate of the operation.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function matteFloodfillImage ($alpha, $fuzz, $bordercolor, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies a digital filter
+ * @link https://php.net/manual/en/imagick.medianfilterimage.php
+ * @param float $radius <p>
+ * The radius of the pixel neighborhood.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function medianFilterImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Negates the colors in the reference image
+ * @link https://php.net/manual/en/imagick.negateimage.php
+ * @param bool $gray <p>
+ * Whether to only negate grayscale pixels within the image.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function negateImage ($gray, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Change any pixel that matches color
+ * @link https://php.net/manual/en/imagick.paintopaqueimage.php
+ * @param mixed $target <p>
+ * Change this target color to the fill color within the image. An
+ * ImagickPixel object or a string representing the target color.
+ * </p>
+ * @param mixed $fill <p>
+ * An ImagickPixel object or a string representing the fill color.
+ * </p>
+ * @param float $fuzz <p>
+ * The fuzz member of image defines how much tolerance is acceptable to
+ * consider two colors as the same.
+ * </p>
+ * @param int $channel [optional] <p>
+ * Provide any channel constant that is valid for your channel mode. To
+ * apply to more than one channel, combine channeltype constants using
+ * bitwise operators. Refer to this
+ * list of channel constants.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function paintOpaqueImage ($target, $fill, $fuzz, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Changes any pixel that matches color with the color defined by fill
+ * @link https://php.net/manual/en/imagick.painttransparentimage.php
+ * @param mixed $target <p>
+ * Change this target color to specified opacity value within the image.
+ * </p>
+ * @param float $alpha <p>
+ * The level of transparency: 1.0 is fully opaque and 0.0 is fully
+ * transparent.
+ * </p>
+ * @param float $fuzz <p>
+ * The fuzz member of image defines how much tolerance is acceptable to
+ * consider two colors as the same.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function paintTransparentImage ($target, $alpha, $fuzz) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Quickly pin-point appropriate parameters for image processing
+ * @link https://php.net/manual/en/imagick.previewimages.php
+ * @param int $preview <p>
+ * Preview type. See Preview type constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function previewImages ($preview) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds or removes a profile from an image
+ * @link https://php.net/manual/en/imagick.profileimage.php
+ * @param string $name
+ * @param string $profile
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function profileImage ($name, $profile) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Analyzes the colors within a reference image
+ * @link https://php.net/manual/en/imagick.quantizeimage.php
+ * @param int $numberColors
+ * @param int $colorspace
+ * @param int $treedepth
+ * @param bool $dither
+ * @param bool $measureError
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function quantizeImage ($numberColors, $colorspace, $treedepth, $dither, $measureError) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Analyzes the colors within a sequence of images
+ * @link https://php.net/manual/en/imagick.quantizeimages.php
+ * @param int $numberColors
+ * @param int $colorspace
+ * @param int $treedepth
+ * @param bool $dither
+ * @param bool $measureError
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function quantizeImages ($numberColors, $colorspace, $treedepth, $dither, $measureError) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Smooths the contours of an image
+ * @link https://php.net/manual/en/imagick.reducenoiseimage.php
+ * @param float $radius
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function reduceNoiseImage ($radius) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Removes the named image profile and returns it
+ * @link https://php.net/manual/en/imagick.removeimageprofile.php
+ * @param string $name
+ * @return string a string containing the profile of the image.
+ */
+ public function removeImageProfile ($name) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Separates a channel from the image
+ * @link https://php.net/manual/en/imagick.separateimagechannel.php
+ * @param int $channel
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function separateImageChannel ($channel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sepia tones an image
+ * @link https://php.net/manual/en/imagick.sepiatoneimage.php
+ * @param float $threshold
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sepiaToneImage ($threshold) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image bias for any method that convolves an image
+ * @link https://php.net/manual/en/imagick.setimagebias.php
+ * @param float $bias
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageBias ($bias) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image chromaticity blue primary point
+ * @link https://php.net/manual/en/imagick.setimageblueprimary.php
+ * @param float $x
+ * @param float $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageBluePrimary ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image border color
+ * @link https://php.net/manual/en/imagick.setimagebordercolor.php
+ * @param mixed $border <p>
+ * The border color
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageBorderColor ($border) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the depth of a particular image channel
+ * @link https://php.net/manual/en/imagick.setimagechanneldepth.php
+ * @param int $channel
+ * @param int $depth
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageChannelDepth ($channel, $depth) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the color of the specified colormap index
+ * @link https://php.net/manual/en/imagick.setimagecolormapcolor.php
+ * @param int $index
+ * @param ImagickPixel $color
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageColormapColor ($index, ImagickPixel $color) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image colorspace
+ * @link https://php.net/manual/en/imagick.setimagecolorspace.php
+ * @param int $colorspace <p>
+ * One of the COLORSPACE constants
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageColorspace ($colorspace) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image disposal method
+ * @link https://php.net/manual/en/imagick.setimagedispose.php
+ * @param int $dispose
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageDispose ($dispose) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image size
+ * @link https://php.net/manual/en/imagick.setimageextent.php
+ * @param int $columns
+ * @param int $rows
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageExtent ($columns, $rows) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image chromaticity green primary point
+ * @link https://php.net/manual/en/imagick.setimagegreenprimary.php
+ * @param float $x
+ * @param float $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageGreenPrimary ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image compression
+ * @link https://php.net/manual/en/imagick.setimageinterlacescheme.php
+ * @param int $interlace_scheme
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageInterlaceScheme ($interlace_scheme) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a named profile to the Imagick object
+ * @link https://php.net/manual/en/imagick.setimageprofile.php
+ * @param string $name
+ * @param string $profile
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageProfile ($name, $profile) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image chromaticity red primary point
+ * @link https://php.net/manual/en/imagick.setimageredprimary.php
+ * @param float $x
+ * @param float $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageRedPrimary ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image rendering intent
+ * @link https://php.net/manual/en/imagick.setimagerenderingintent.php
+ * @param int $rendering_intent
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageRenderingIntent ($rendering_intent) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image virtual pixel method
+ * @link https://php.net/manual/en/imagick.setimagevirtualpixelmethod.php
+ * @param int $method
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageVirtualPixelMethod ($method) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image chromaticity white point
+ * @link https://php.net/manual/en/imagick.setimagewhitepoint.php
+ * @param float $x
+ * @param float $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImageWhitePoint ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adjusts the contrast of an image
+ * @link https://php.net/manual/en/imagick.sigmoidalcontrastimage.php
+ * @param bool $sharpen
+ * @param float $alpha
+ * @param float $beta
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function sigmoidalContrastImage ($sharpen, $alpha, $beta, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Composites two images
+ * @link https://php.net/manual/en/imagick.stereoimage.php
+ * @param Imagick $offset_wand
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function stereoImage (Imagick $offset_wand) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Repeatedly tiles the texture image
+ * @link https://php.net/manual/en/imagick.textureimage.php
+ * @param Imagick $texture_wand
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function textureImage (Imagick $texture_wand) {}
+
+ /**
+ * pplies a color vector to each pixel in the image. The 'opacity' color is a per channel strength factor for how strongly the color should be applied.
+ * If legacy is true, the behaviour of this function is incorrect, but consistent with how it behaved before Imagick version 3.4.0
+ * @link https://php.net/manual/en/imagick.tintimage.php
+ * @param mixed $tint
+ * @param mixed $opacity
+ * @param bool $legacy [optional]
+ * @return bool <b>TRUE</b> on success.
+ * @throws ImagickException Throws ImagickException on error
+ * @since 2.0.0
+ */
+ public function tintImage ($tint, $opacity, $legacy = false) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sharpens an image
+ * @link https://php.net/manual/en/imagick.unsharpmaskimage.php
+ * @param float $radius
+ * @param float $sigma
+ * @param float $amount
+ * @param float $threshold
+ * @param int $channel [optional]
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function unsharpMaskImage ($radius, $sigma, $amount, $threshold, $channel = Imagick::CHANNEL_ALL) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a new Imagick object
+ * @link https://php.net/manual/en/imagick.getimage.php
+ * @return Imagick a new Imagick object with the current image sequence.
+ */
+ public function getImage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds new image to Imagick object image list
+ * @link https://php.net/manual/en/imagick.addimage.php
+ * @param Imagick $source <p>
+ * The source Imagick object
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function addImage (Imagick $source) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Replaces image in the object
+ * @link https://php.net/manual/en/imagick.setimage.php
+ * @param Imagick $replace <p>
+ * The replace Imagick object
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setImage (Imagick $replace) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a new image
+ * @link https://php.net/manual/en/imagick.newimage.php
+ * @param int $cols <p>
+ * Columns in the new image
+ * </p>
+ * @param int $rows <p>
+ * Rows in the new image
+ * </p>
+ * @param mixed $background <p>
+ * The background color used for this image
+ * </p>
+ * @param string $format [optional] <p>
+ * Image format. This parameter was added in Imagick version 2.0.1.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function newImage ($cols, $rows, $background, $format = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Creates a new image
+ * @link https://php.net/manual/en/imagick.newpseudoimage.php
+ * @param int $columns <p>
+ * columns in the new image
+ * </p>
+ * @param int $rows <p>
+ * rows in the new image
+ * </p>
+ * @param string $pseudoString <p>
+ * string containing pseudo image definition.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function newPseudoImage ($columns, $rows, $pseudoString) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the object compression type
+ * @link https://php.net/manual/en/imagick.getcompression.php
+ * @return int the compression constant
+ */
+ public function getCompression () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the object compression quality
+ * @link https://php.net/manual/en/imagick.getcompressionquality.php
+ * @return int integer describing the compression quality
+ */
+ public function getCompressionQuality () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the ImageMagick API copyright as a string
+ * @link https://php.net/manual/en/imagick.getcopyright.php
+ * @return string a string containing the copyright notice of Imagemagick and
+ * Magickwand C API.
+ */
+ public static function getCopyright () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * The filename associated with an image sequence
+ * @link https://php.net/manual/en/imagick.getfilename.php
+ * @return string a string on success.
+ */
+ public function getFilename () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the format of the Imagick object
+ * @link https://php.net/manual/en/imagick.getformat.php
+ * @return string the format of the image.
+ */
+ public function getFormat () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the ImageMagick home URL
+ * @link https://php.net/manual/en/imagick.gethomeurl.php
+ * @return string a link to the imagemagick homepage.
+ */
+ public static function getHomeURL () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the object interlace scheme
+ * @link https://php.net/manual/en/imagick.getinterlacescheme.php
+ * @return int Gets the wand interlace
+ * scheme.
+ */
+ public function getInterlaceScheme () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a value associated with the specified key
+ * @link https://php.net/manual/en/imagick.getoption.php
+ * @param string $key <p>
+ * The name of the option
+ * </p>
+ * @return string a value associated with a wand and the specified key.
+ */
+ public function getOption ($key) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the ImageMagick package name
+ * @link https://php.net/manual/en/imagick.getpackagename.php
+ * @return string the ImageMagick package name as a string.
+ */
+ public static function getPackageName () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the page geometry
+ * @link https://php.net/manual/en/imagick.getpage.php
+ * @return array the page geometry associated with the Imagick object in
+ * an associative array with the keys "width", "height", "x", and "y",
+ * throwing ImagickException on error.
+ * @throws ImagickException on error
+ */
+ public function getPage () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the quantum depth
+ * @link https://php.net/manual/en/imagick.getquantumdepth.php
+ * @return array the Imagick quantum depth as a string.
+ */
+ public static function getQuantumDepth () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the Imagick quantum range
+ * @link https://php.net/manual/en/imagick.getquantumrange.php
+ * @return array the Imagick quantum range as a string.
+ */
+ public static function getQuantumRange () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the ImageMagick release date
+ * @link https://php.net/manual/en/imagick.getreleasedate.php
+ * @return string the ImageMagick release date as a string.
+ */
+ public static function getReleaseDate () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the specified resource's memory usage
+ * @link https://php.net/manual/en/imagick.getresource.php
+ * @param int $type <p>
+ * Refer to the list of resourcetype constants.
+ * </p>
+ * @return int the specified resource's memory usage in megabytes.
+ */
+ public static function getResource ($type) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the specified resource limit
+ * @link https://php.net/manual/en/imagick.getresourcelimit.php
+ * @param int $type <p>
+ * Refer to the list of resourcetype constants.
+ * </p>
+ * @return int the specified resource limit in megabytes.
+ */
+ public static function getResourceLimit ($type) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the horizontal and vertical sampling factor
+ * @link https://php.net/manual/en/imagick.getsamplingfactors.php
+ * @return array an associative array with the horizontal and vertical sampling
+ * factors of the image.
+ */
+ public function getSamplingFactors () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the size associated with the Imagick object
+ * @link https://php.net/manual/en/imagick.getsize.php
+ * @return array the size associated with the Imagick object as an array with the
+ * keys "columns" and "rows".
+ */
+ public function getSize () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the ImageMagick API version
+ * @link https://php.net/manual/en/imagick.getversion.php
+ * @return array the ImageMagick API version as a string and as a number.
+ */
+ public static function getVersion () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the object's default background color
+ * @link https://php.net/manual/en/imagick.setbackgroundcolor.php
+ * @param mixed $background
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setBackgroundColor ($background) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the object's default compression type
+ * @link https://php.net/manual/en/imagick.setcompression.php
+ * @param int $compression
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setCompression ($compression) {}
+
+ /**
+ * (PECL imagick 0.9.10-0.9.9)<br/>
+ * Sets the object's default compression quality
+ * @link https://php.net/manual/en/imagick.setcompressionquality.php
+ * @param int $quality
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setCompressionQuality ($quality) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the filename before you read or write the image
+ * @link https://php.net/manual/en/imagick.setfilename.php
+ * @param string $filename
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFilename ($filename) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the format of the Imagick object
+ * @link https://php.net/manual/en/imagick.setformat.php
+ * @param string $format
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFormat ($format) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image compression
+ * @link https://php.net/manual/en/imagick.setinterlacescheme.php
+ * @param int $interlace_scheme
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setInterlaceScheme ($interlace_scheme) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Set an option
+ * @link https://php.net/manual/en/imagick.setoption.php
+ * @param string $key
+ * @param string $value
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setOption ($key, $value) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the page geometry of the Imagick object
+ * @link https://php.net/manual/en/imagick.setpage.php
+ * @param int $width
+ * @param int $height
+ * @param int $x
+ * @param int $y
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setPage ($width, $height, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the limit for a particular resource in megabytes
+ * @link https://php.net/manual/en/imagick.setresourcelimit.php
+ * @param int $type <p>
+ * Refer to the list of resourcetype constants.
+ * </p>
+ * @param int $limit <p>
+ * The resource limit. The unit depends on the type of the resource being limited.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public static function setResourceLimit ($type, $limit) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image resolution
+ * @link https://php.net/manual/en/imagick.setresolution.php
+ * @param float $x_resolution <p>
+ * The horizontal resolution.
+ * </p>
+ * @param float $y_resolution <p>
+ * The vertical resolution.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setResolution ($x_resolution, $y_resolution) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image sampling factors
+ * @link https://php.net/manual/en/imagick.setsamplingfactors.php
+ * @param array $factors
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setSamplingFactors (array $factors) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the size of the Imagick object
+ * @link https://php.net/manual/en/imagick.setsize.php
+ * @param int $columns
+ * @param int $rows
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setSize ($columns, $rows) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the image type attribute
+ * @link https://php.net/manual/en/imagick.settype.php
+ * @param int $image_type
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setType ($image_type) {}
+
+ public function key () {}
+
+ public function next () {}
+
+ public function rewind () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Checks if the current item is valid
+ * @link https://php.net/manual/en/imagick.valid.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function valid () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a reference to the current Imagick object
+ * @link https://php.net/manual/en/imagick.current.php
+ * @return Imagick self on success.
+ */
+ public function current () {}
+
+ /**
+ * Change the brightness and/or contrast of an image. It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.
+ * @link https://php.net/manual/en/imagick.brightnesscontrastimage.php
+ * @param string $brightness
+ * @param string $contrast
+ * @param int $CHANNEL [optional]
+ * @return void
+ * @since 3.3.0
+ */
+ public function brightnessContrastImage ($brightness, $contrast, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Applies a user supplied kernel to the image according to the given morphology method.
+ * @link https://php.net/manual/en/imagick.morphology.php
+ * @param int $morphologyMethod Which morphology method to use one of the \Imagick::MORPHOLOGY_* constants.
+ * @param int $iterations The number of iteration to apply the morphology function. A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.
+ * @param ImagickKernel $ImagickKernel
+ * @param int $CHANNEL [optional]
+ * @return void
+ * @since 3.3.0
+ */
+ public function morphology ($morphologyMethod, $iterations, ImagickKernel $ImagickKernel, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Applies a custom convolution kernel to the image.
+ * @link https://php.net/manual/en/imagick.filter.php
+ * @param ImagickKernel $ImagickKernel An instance of ImagickKernel that represents either a single kernel or a linked series of kernels.
+ * @param int $CHANNEL [optional] Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants
+ * @return void
+ * @since 3.3.0
+ */
+ public function filter (ImagickKernel $ImagickKernel , $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets).
+ * The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255)
+ * @link https://php.net/manual/en/imagick.colormatriximage.php
+ * @param string $color_matrix
+ * @return void
+ * @since 3.3.0
+ */
+ public function colorMatrixImage ($color_matrix = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Deletes an image property.
+ * @link https://php.net/manual/en/imagick.deleteimageproperty.php
+ * @param string $name The name of the property to delete.
+ * @return void
+ * @since 3.3.0
+ */
+ public function deleteImageProperty ($name) { }
+
+ /**
+ * Implements the discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
+ * @link https://php.net/manual/en/imagick.forwardfouriertransformimage.php
+ * @param bool $magnitude If true, return as magnitude / phase pair otherwise a real / imaginary image pair.
+ * @return void
+ * @since 3.3.0
+ */
+ public function forwardFourierTransformimage ($magnitude) { }
+
+ /**
+ * Gets the current image's compression type.
+ * @link https://php.net/manual/en/imagick.getimagecompression.php
+ * @return int
+ * @since 3.3.0
+ */
+ public function getImageCompression () { }
+
+ /**
+ * Get the StringRegistry entry for the named key or false if not set.
+ * @link https://php.net/manual/en/imagick.getregistry.php
+ * @param string $key
+ * @return string|false
+ * @throws Exception Since version >=3.4.3. Throws an exception if the key does not exist, rather than terminating the program.
+ * @since 3.3.0
+ */
+ public static function getRegistry ($key) { }
+
+ /**
+ * Returns the ImageMagick quantum range as an integer.
+ * @link https://php.net/manual/en/imagick.getquantum.php
+ * @return int
+ * @since 3.3.0
+ */
+ public static function getQuantum () { }
+
+ /**
+ * Replaces any embedded formatting characters with the appropriate image property and returns the interpreted text. See https://www.imagemagick.org/script/escape.php for escape sequences.
+ * @link https://php.net/manual/en/imagick.identifyformat.php
+ * @see https://www.imagemagick.org/script/escape.php
+ * @param string $embedText A string containing formatting sequences e.g. "Trim box: %@ number of unique colors: %k".
+ * @return bool
+ * @since 3.3.0
+ */
+ public function identifyFormat ($embedText) { }
+
+ /**
+ * Implements the inverse discrete Fourier transform (DFT) of the image either as a magnitude / phase or real / imaginary image pair.
+ * @link https://php.net/manual/en/imagick.inversefouriertransformimage.php
+ * @param Imagick $complement The second image to combine with this one to form either the magnitude / phase or real / imaginary image pair.
+ * @param bool $magnitude If true, combine as magnitude / phase pair otherwise a real / imaginary image pair.
+ * @return void
+ * @since 3.3.0
+ */
+ public function inverseFourierTransformImage ($complement, $magnitude) { }
+
+ /**
+ * List all the registry settings. Returns an array of all the key/value pairs in the registry
+ * @link https://php.net/manual/en/imagick.listregistry.php
+ * @return array An array containing the key/values from the registry.
+ * @since 3.3.0
+ */
+ public static function listRegistry () { }
+
+ /**
+ * Rotational blurs an image.
+ * @link https://php.net/manual/en/imagick.rotationalblurimage.php
+ * @param string $angle
+ * @param string $CHANNEL
+ * @return void
+ * @since 3.3.0
+ */
+ public function rotationalBlurImage ($angle, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Selectively blur an image within a contrast threshold. It is similar to the unsharpen mask that sharpens everything with contrast above a certain threshold.
+ * @link https://php.net/manual/en/imagick.selectiveblurimage.php
+ * @param float $radius
+ * @param float $sigma
+ * @param float $threshold
+ * @param int $CHANNEL Provide any channel constant that is valid for your channel mode. To apply to more than one channel, combine channel constants using bitwise operators. Defaults to Imagick::CHANNEL_DEFAULT. Refer to this list of channel constants
+ * @return void
+ * @since 3.3.0
+ */
+ public function selectiveBlurImage ($radius, $sigma, $threshold, $CHANNEL = Imagick::CHANNEL_DEFAULT) { }
+
+ /**
+ * Set whether antialiasing should be used for operations. On by default.
+ * @param bool $antialias
+ * @return int
+ * @since 3.3.0
+ */
+ public function setAntiAlias ($antialias) { }
+
+ /**
+ * @link https://php.net/manual/en/imagick.setimagebiasquantum.php
+ * @param string $bias
+ * @return void
+ * @since 3.3.0
+ */
+ public function setImageBiasQuantum ($bias) { }
+
+ /**
+ * Set a callback that will be called during the processing of the Imagick image.
+ * @link https://php.net/manual/en/imagick.setprogressmonitor.php
+ * @param callable $callback The progress function to call. It should return true if image processing should continue, or false if it should be cancelled.
+ * The offset parameter indicates the progress and the span parameter indicates the total amount of work needed to be done.
+ * <pre> bool callback ( mixed $offset , mixed $span ) </pre>
+ * <b>Caution</b>
+ * The values passed to the callback function are not consistent. In particular the span parameter can increase during image processing. Because of this calculating the percentage complete of an image operation is not trivial.
+ * @return void
+ * @since 3.3.0
+ */
+ public function setProgressMonitor ($callback) { }
+
+ /**
+ * Sets the ImageMagick registry entry named key to value. This is most useful for setting "temporary-path" which controls where ImageMagick creates temporary images e.g. while processing PDFs.
+ * @link https://php.net/manual/en/imagick.setregistry.php
+ * @param string $key
+ * @param string $value
+ * @return void
+ * @since 3.3.0
+ */
+ public static function setRegistry ($key, $value) { }
+
+ /**
+ * Replace each pixel with corresponding statistic from the neighborhood of the specified width and height.
+ * @link https://php.net/manual/en/imagick.statisticimage.php
+ * @param int $type
+ * @param int $width
+ * @param int $height
+ * @param int $channel [optional]
+ * @return void
+ * @since 3.3.0
+ */
+ public function statisticImage ($type, $width, $height, $channel = Imagick::CHANNEL_DEFAULT ) { }
+
+ /**
+ * Searches for a subimage in the current image and returns a similarity image such that an exact match location is
+ * completely white and if none of the pixels match, black, otherwise some gray level in-between.
+ * You can also pass in the optional parameters bestMatch and similarity. After calling the function similarity will
+ * be set to the 'score' of the similarity between the subimage and the matching position in the larger image,
+ * bestMatch will contain an associative array with elements x, y, width, height that describe the matching region.
+ *
+ * @link https://php.net/manual/en/imagick.subimagematch.php
+ * @param Imagick $imagick
+ * @param array &$bestMatch [optional]
+ * @param float &$similarity [optional] A new image that displays the amount of similarity at each pixel.
+ * @param float $similarity_threshold [optional] Only used if compiled with ImageMagick (library) > 7
+ * @param int $metric [optional] Only used if compiled with ImageMagick (library) > 7
+ * @return Imagick
+ * @since 3.3.0
+ */
+ public function subImageMatch (Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) { }
+
+ /**
+ * Is an alias of Imagick::subImageMatch
+ *
+ * @param Imagick $imagick
+ * @param array $bestMatch [optional]
+ * @param float $similarity [optional] A new image that displays the amount of similarity at each pixel.
+ * @param float $similarity_threshold [optional]
+ * @param int $metric [optional]
+ * @return Imagick
+ * @see Imagick::subImageMatch() This function is an alias of subImageMatch()
+ * @since 3.4.0
+ */
+ public function similarityImage (Imagick $imagick, array &$bestMatch, &$similarity, $similarity_threshold, $metric) { }
+
+ /**
+ * Returns any ImageMagick configure options that match the specified pattern (e.g. "*" for all). Options include NAME, VERSION, LIB_VERSION, etc.
+ * @return string
+ * @since 3.4.0
+ */
+ public function getConfigureOptions () { }
+
+ /**
+ * GetFeatures() returns the ImageMagick features that have been compiled into the runtime.
+ * @return string
+ * @since 3.4.0
+ */
+ public function getFeatures () { }
+
+ /**
+ * @return int
+ * @since 3.4.0
+ */
+ public function getHDRIEnabled () { }
+
+ /**
+ * Sets the image channel mask. Returns the previous set channel mask.
+ * Only works with Imagick >=7
+ * @param int $channel
+ * @since 3.4.0
+ */
+ public function setImageChannelMask ($channel) {}
+
+ /**
+ * Merge multiple images of the same size together with the selected operator. https://www.imagemagick.org/Usage/layers/#evaluate-sequence
+ * @param int $EVALUATE_CONSTANT
+ * @return bool
+ * @see https://www.imagemagick.org/Usage/layers/#evaluate-sequence
+ * @since 3.4.0
+ */
+ public function evaluateImages ($EVALUATE_CONSTANT) { }
+
+ /**
+ * Extracts the 'mean' from the image and adjust the image to try make set its gamma appropriately.
+ * @param int $channel [optional] Default value Imagick::CHANNEL_ALL
+ * @return bool
+ * @since 3.4.1
+ */
+ public function autoGammaImage ($channel = Imagick::CHANNEL_ALL) { }
+
+ /**
+ * Adjusts an image so that its orientation is suitable $ for viewing (i.e. top-left orientation).
+ * @return bool
+ * @since 3.4.1
+ */
+ public function autoOrient () { }
+
+ /**
+ * Composite one image onto another using the specified gravity.
+ *
+ * @param Imagick $imagick
+ * @param int $COMPOSITE_CONSTANT
+ * @param int $GRAVITY_CONSTANT
+ * @return bool
+ * @since 3.4.1
+ */
+ public function compositeImageGravity(Imagick $imagick, $COMPOSITE_CONSTANT, $GRAVITY_CONSTANT) { }
+
+ /**
+ * Attempts to increase the appearance of large-scale light-dark transitions.
+ *
+ * @param float $radius
+ * @param float $strength
+ * @return bool
+ * @since 3.4.1
+ */
+ public function localContrastImage($radius, $strength) { }
+
+ /**
+ * Identifies the potential image type, returns one of the Imagick::IMGTYPE_* constants
+ * @return int
+ * @since 3.4.3
+ */
+ public function identifyImageType() { }
+
+ /**
+ * Sets the image to the specified alpha level. Will replace ImagickDraw::setOpacity()
+ *
+ * @param float $alpha
+ * @return bool
+ * @since 3.4.3
+ */
+ public function setImageAlpha($alpha) { }
+}
+
+/**
+ * @method ImagickDraw clone() (PECL imagick 2.0.0)<br/>Makes an exact copy of the specified ImagickDraw object
+ * @link https://php.net/manual/en/class.imagickdraw.php
+ */
+class ImagickDraw {
+
+ public function resetVectorGraphics () {}
+
+ public function getTextKerning () {}
+
+ /**
+ * @param $kerning
+ */
+ public function setTextKerning ($kerning) {}
+
+ public function getTextInterWordSpacing () {}
+
+ /**
+ * @param $spacing
+ */
+ public function setTextInterWordSpacing ($spacing) {}
+
+ public function getTextInterLineSpacing () {}
+
+ /**
+ * @param $spacing
+ */
+ public function setTextInterLineSpacing ($spacing) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * The ImagickDraw constructor
+ * @link https://php.net/manual/en/imagickdraw.construct.php
+ */
+ public function __construct () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the fill color to be used for drawing filled objects
+ * @link https://php.net/manual/en/imagickdraw.setfillcolor.php
+ * @param ImagickPixel $fill_pixel <p>
+ * ImagickPixel to use to set the color
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFillColor (ImagickPixel $fill_pixel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the opacity to use when drawing using the fill color or fill texture
+ * @link https://php.net/manual/en/imagickdraw.setfillalpha.php
+ * @param float $opacity <p>
+ * fill alpha
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFillAlpha ($opacity) {}
+
+ /**
+ * @param $x_resolution
+ * @param $y_resolution
+ */
+ public function setResolution ($x_resolution, $y_resolution) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the color used for stroking object outlines
+ * @link https://php.net/manual/en/imagickdraw.setstrokecolor.php
+ * @param ImagickPixel $stroke_pixel <p>
+ * the stroke color
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeColor (ImagickPixel $stroke_pixel) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the opacity of stroked object outlines
+ * @link https://php.net/manual/en/imagickdraw.setstrokealpha.php
+ * @param float $opacity <p>
+ * opacity
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeAlpha ($opacity) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the width of the stroke used to draw object outlines
+ * @link https://php.net/manual/en/imagickdraw.setstrokewidth.php
+ * @param float $stroke_width <p>
+ * stroke width
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeWidth ($stroke_width) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clears the ImagickDraw
+ * @link https://php.net/manual/en/imagickdraw.clear.php
+ * @return bool an ImagickDraw object.
+ */
+ public function clear () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a circle
+ * @link https://php.net/manual/en/imagickdraw.circle.php
+ * @param float $ox <p>
+ * origin x coordinate
+ * </p>
+ * @param float $oy <p>
+ * origin y coordinate
+ * </p>
+ * @param float $px <p>
+ * perimeter x coordinate
+ * </p>
+ * @param float $py <p>
+ * perimeter y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function circle ($ox, $oy, $px, $py) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws text on the image
+ * @link https://php.net/manual/en/imagickdraw.annotation.php
+ * @param float $x <p>
+ * The x coordinate where text is drawn
+ * </p>
+ * @param float $y <p>
+ * The y coordinate where text is drawn
+ * </p>
+ * @param string $text <p>
+ * The text to draw on the image
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function annotation ($x, $y, $text) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Controls whether text is antialiased
+ * @link https://php.net/manual/en/imagickdraw.settextantialias.php
+ * @param bool $antiAlias
+ * @return bool No value is returned.
+ */
+ public function setTextAntialias ($antiAlias) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies specifies the text code set
+ * @link https://php.net/manual/en/imagickdraw.settextencoding.php
+ * @param string $encoding <p>
+ * the encoding name
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setTextEncoding ($encoding) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the fully-specified font to use when annotating with text
+ * @link https://php.net/manual/en/imagickdraw.setfont.php
+ * @param string $font_name
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFont ($font_name) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the font family to use when annotating with text
+ * @link https://php.net/manual/en/imagickdraw.setfontfamily.php
+ * @param string $font_family <p>
+ * the font family
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setFontFamily ($font_family) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the font pointsize to use when annotating with text
+ * @link https://php.net/manual/en/imagickdraw.setfontsize.php
+ * @param float $pointsize <p>
+ * the point size
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFontSize ($pointsize) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the font style to use when annotating with text
+ * @link https://php.net/manual/en/imagickdraw.setfontstyle.php
+ * @param int $style <p>
+ * STYLETYPE_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFontStyle ($style) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the font weight
+ * @link https://php.net/manual/en/imagickdraw.setfontweight.php
+ * @param int $font_weight
+ * @return bool
+ */
+ public function setFontWeight ($font_weight) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the font
+ * @link https://php.net/manual/en/imagickdraw.getfont.php
+ * @return string|false a string on success and false if no font is set.
+ */
+ public function getFont () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the font family
+ * @link https://php.net/manual/en/imagickdraw.getfontfamily.php
+ * @return string|false the font family currently selected or false if font family is not set.
+ */
+ public function getFontFamily () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the font pointsize
+ * @link https://php.net/manual/en/imagickdraw.getfontsize.php
+ * @return float the font size associated with the current ImagickDraw object.
+ */
+ public function getFontSize () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the font style
+ * @link https://php.net/manual/en/imagickdraw.getfontstyle.php
+ * @return int the font style constant (STYLE_) associated with the ImagickDraw object
+ * or 0 if no style is set.
+ */
+ public function getFontStyle () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the font weight
+ * @link https://php.net/manual/en/imagickdraw.getfontweight.php
+ * @return int an int on success and 0 if no weight is set.
+ */
+ public function getFontWeight () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Frees all associated resources
+ * @link https://php.net/manual/en/imagickdraw.destroy.php
+ * @return bool No value is returned.
+ */
+ public function destroy () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a rectangle
+ * @link https://php.net/manual/en/imagickdraw.rectangle.php
+ * @param float $x1 <p>
+ * x coordinate of the top left corner
+ * </p>
+ * @param float $y1 <p>
+ * y coordinate of the top left corner
+ * </p>
+ * @param float $x2 <p>
+ * x coordinate of the bottom right corner
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of the bottom right corner
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function rectangle ($x1, $y1, $x2, $y2) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a rounded rectangle
+ * @link https://php.net/manual/en/imagickdraw.roundrectangle.php
+ * @param float $x1 <p>
+ * x coordinate of the top left corner
+ * </p>
+ * @param float $y1 <p>
+ * y coordinate of the top left corner
+ * </p>
+ * @param float $x2 <p>
+ * x coordinate of the bottom right
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of the bottom right
+ * </p>
+ * @param float $rx <p>
+ * x rounding
+ * </p>
+ * @param float $ry <p>
+ * y rounding
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function roundRectangle ($x1, $y1, $x2, $y2, $rx, $ry) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws an ellipse on the image
+ * @link https://php.net/manual/en/imagickdraw.ellipse.php
+ * @param float $ox
+ * @param float $oy
+ * @param float $rx
+ * @param float $ry
+ * @param float $start
+ * @param float $end
+ * @return bool No value is returned.
+ */
+ public function ellipse ($ox, $oy, $rx, $ry, $start, $end) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Skews the current coordinate system in the horizontal direction
+ * @link https://php.net/manual/en/imagickdraw.skewx.php
+ * @param float $degrees <p>
+ * degrees to skew
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function skewX ($degrees) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Skews the current coordinate system in the vertical direction
+ * @link https://php.net/manual/en/imagickdraw.skewy.php
+ * @param float $degrees <p>
+ * degrees to skew
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function skewY ($degrees) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies a translation to the current coordinate system
+ * @link https://php.net/manual/en/imagickdraw.translate.php
+ * @param float $x <p>
+ * horizontal translation
+ * </p>
+ * @param float $y <p>
+ * vertical translation
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function translate ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a line
+ * @link https://php.net/manual/en/imagickdraw.line.php
+ * @param float $sx <p>
+ * starting x coordinate
+ * </p>
+ * @param float $sy <p>
+ * starting y coordinate
+ * </p>
+ * @param float $ex <p>
+ * ending x coordinate
+ * </p>
+ * @param float $ey <p>
+ * ending y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function line ($sx, $sy, $ex, $ey) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws an arc
+ * @link https://php.net/manual/en/imagickdraw.arc.php
+ * @param float $sx <p>
+ * Starting x ordinate of bounding rectangle
+ * </p>
+ * @param float $sy <p>
+ * starting y ordinate of bounding rectangle
+ * </p>
+ * @param float $ex <p>
+ * ending x ordinate of bounding rectangle
+ * </p>
+ * @param float $ey <p>
+ * ending y ordinate of bounding rectangle
+ * </p>
+ * @param float $sd <p>
+ * starting degrees of rotation
+ * </p>
+ * @param float $ed <p>
+ * ending degrees of rotation
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function arc ($sx, $sy, $ex, $ey, $sd, $ed) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Paints on the image's opacity channel
+ * @link https://php.net/manual/en/imagickdraw.matte.php
+ * @param float $x <p>
+ * x coordinate of the matte
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the matte
+ * </p>
+ * @param int $paintMethod <p>
+ * PAINT_ constant
+ * </p>
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function matte ($x, $y, $paintMethod) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a polygon
+ * @link https://php.net/manual/en/imagickdraw.polygon.php
+ * @param array $coordinates <p>
+ * multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) );
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function polygon (array $coordinates) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a point
+ * @link https://php.net/manual/en/imagickdraw.point.php
+ * @param float $x <p>
+ * point's x coordinate
+ * </p>
+ * @param float $y <p>
+ * point's y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function point ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the text decoration
+ * @link https://php.net/manual/en/imagickdraw.gettextdecoration.php
+ * @return int one of the DECORATION_ constants
+ * and 0 if no decoration is set.
+ */
+ public function getTextDecoration () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the code set used for text annotations
+ * @link https://php.net/manual/en/imagickdraw.gettextencoding.php
+ * @return string a string specifying the code set
+ * or false if text encoding is not set.
+ */
+ public function getTextEncoding () {}
+
+ public function getFontStretch () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the font stretch to use when annotating with text
+ * @link https://php.net/manual/en/imagickdraw.setfontstretch.php
+ * @param int $fontStretch <p>
+ * STRETCH_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFontStretch ($fontStretch) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Controls whether stroked outlines are antialiased
+ * @link https://php.net/manual/en/imagickdraw.setstrokeantialias.php
+ * @param bool $stroke_antialias <p>
+ * the antialias setting
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeAntialias ($stroke_antialias) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies a text alignment
+ * @link https://php.net/manual/en/imagickdraw.settextalignment.php
+ * @param int $alignment <p>
+ * ALIGN_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setTextAlignment ($alignment) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies a decoration
+ * @link https://php.net/manual/en/imagickdraw.settextdecoration.php
+ * @param int $decoration <p>
+ * DECORATION_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setTextDecoration ($decoration) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the color of a background rectangle
+ * @link https://php.net/manual/en/imagickdraw.settextundercolor.php
+ * @param ImagickPixel $under_color <p>
+ * the under color
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setTextUnderColor (ImagickPixel $under_color) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the overall canvas size
+ * @link https://php.net/manual/en/imagickdraw.setviewbox.php
+ * @param int $x1 <p>
+ * left x coordinate
+ * </p>
+ * @param int $y1 <p>
+ * left y coordinate
+ * </p>
+ * @param int $x2 <p>
+ * right x coordinate
+ * </p>
+ * @param int $y2 <p>
+ * right y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setViewbox ($x1, $y1, $x2, $y2) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adjusts the current affine transformation matrix
+ * @link https://php.net/manual/en/imagickdraw.affine.php
+ * @param array $affine <p>
+ * Affine matrix parameters
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function affine (array $affine) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a bezier curve
+ * @link https://php.net/manual/en/imagickdraw.bezier.php
+ * @param array $coordinates <p>
+ * Multidimensional array like array( array( 'x' => 1, 'y' => 2 ),
+ * array( 'x' => 3, 'y' => 4 ) )
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function bezier (array $coordinates) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Composites an image onto the current image
+ * @link https://php.net/manual/en/imagickdraw.composite.php
+ * @param int $compose <p>
+ * composition operator. One of COMPOSITE_ constants
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the top left corner
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the top left corner
+ * </p>
+ * @param float $width <p>
+ * width of the composition image
+ * </p>
+ * @param float $height <p>
+ * height of the composition image
+ * </p>
+ * @param Imagick $compositeWand <p>
+ * the Imagick object where composition image is taken from
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function composite ($compose, $x, $y, $width, $height, Imagick $compositeWand) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws color on image
+ * @link https://php.net/manual/en/imagickdraw.color.php
+ * @param float $x <p>
+ * x coordinate of the paint
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the paint
+ * </p>
+ * @param int $paintMethod <p>
+ * one of the PAINT_ constants
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function color ($x, $y, $paintMethod) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a comment
+ * @link https://php.net/manual/en/imagickdraw.comment.php
+ * @param string $comment <p>
+ * The comment string to add to vector output stream
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function comment ($comment) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Obtains the current clipping path ID
+ * @link https://php.net/manual/en/imagickdraw.getclippath.php
+ * @return string|false a string containing the clip path ID or false if no clip path exists.
+ */
+ public function getClipPath () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the current polygon fill rule
+ * @link https://php.net/manual/en/imagickdraw.getcliprule.php
+ * @return int one of the FILLRULE_ constants.
+ */
+ public function getClipRule () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the interpretation of clip path units
+ * @link https://php.net/manual/en/imagickdraw.getclipunits.php
+ * @return int an int on success.
+ */
+ public function getClipUnits () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the fill color
+ * @link https://php.net/manual/en/imagickdraw.getfillcolor.php
+ * @return ImagickPixel an ImagickPixel object.
+ */
+ public function getFillColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the opacity used when drawing
+ * @link https://php.net/manual/en/imagickdraw.getfillopacity.php
+ * @return float The opacity.
+ */
+ public function getFillOpacity () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the fill rule
+ * @link https://php.net/manual/en/imagickdraw.getfillrule.php
+ * @return int a FILLRULE_ constant
+ */
+ public function getFillRule () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the text placement gravity
+ * @link https://php.net/manual/en/imagickdraw.getgravity.php
+ * @return int a GRAVITY_ constant on success and 0 if no gravity is set.
+ */
+ public function getGravity () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the current stroke antialias setting
+ * @link https://php.net/manual/en/imagickdraw.getstrokeantialias.php
+ * @return bool <b>TRUE</b> if antialiasing is on and false if it is off.
+ */
+ public function getStrokeAntialias () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the color used for stroking object outlines
+ * @link https://php.net/manual/en/imagickdraw.getstrokecolor.php
+ * @return ImagickPixel an ImagickPixel object which describes the color.
+ */
+ public function getStrokeColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns an array representing the pattern of dashes and gaps used to stroke paths
+ * @link https://php.net/manual/en/imagickdraw.getstrokedasharray.php
+ * @return array an array on success and empty array if not set.
+ */
+ public function getStrokeDashArray () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the offset into the dash pattern to start the dash
+ * @link https://php.net/manual/en/imagickdraw.getstrokedashoffset.php
+ * @return float a float representing the offset and 0 if it's not set.
+ */
+ public function getStrokeDashOffset () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the shape to be used at the end of open subpaths when they are stroked
+ * @link https://php.net/manual/en/imagickdraw.getstrokelinecap.php
+ * @return int one of the LINECAP_ constants or 0 if stroke linecap is not set.
+ */
+ public function getStrokeLineCap () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the shape to be used at the corners of paths when they are stroked
+ * @link https://php.net/manual/en/imagickdraw.getstrokelinejoin.php
+ * @return int one of the LINEJOIN_ constants or 0 if stroke line join is not set.
+ */
+ public function getStrokeLineJoin () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the stroke miter limit
+ * @link https://php.net/manual/en/imagickdraw.getstrokemiterlimit.php
+ * @return int an int describing the miter limit
+ * and 0 if no miter limit is set.
+ */
+ public function getStrokeMiterLimit () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the opacity of stroked object outlines
+ * @link https://php.net/manual/en/imagickdraw.getstrokeopacity.php
+ * @return float a float describing the opacity.
+ */
+ public function getStrokeOpacity () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the width of the stroke used to draw object outlines
+ * @link https://php.net/manual/en/imagickdraw.getstrokewidth.php
+ * @return float a float describing the stroke width.
+ */
+ public function getStrokeWidth () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the text alignment
+ * @link https://php.net/manual/en/imagickdraw.gettextalignment.php
+ * @return int one of the ALIGN_ constants and 0 if no align is set.
+ */
+ public function getTextAlignment () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the current text antialias setting
+ * @link https://php.net/manual/en/imagickdraw.gettextantialias.php
+ * @return bool <b>TRUE</b> if text is antialiased and false if not.
+ */
+ public function getTextAntialias () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a string containing vector graphics
+ * @link https://php.net/manual/en/imagickdraw.getvectorgraphics.php
+ * @return string a string containing the vector graphics.
+ */
+ public function getVectorGraphics () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the text under color
+ * @link https://php.net/manual/en/imagickdraw.gettextundercolor.php
+ * @return ImagickPixel an ImagickPixel object describing the color.
+ */
+ public function getTextUnderColor () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adds a path element to the current path
+ * @link https://php.net/manual/en/imagickdraw.pathclose.php
+ * @return bool No value is returned.
+ */
+ public function pathClose () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a cubic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetoabsolute.php
+ * @param float $x1 <p>
+ * x coordinate of the first control point
+ * </p>
+ * @param float $y1 <p>
+ * y coordinate of the first control point
+ * </p>
+ * @param float $x2 <p>
+ * x coordinate of the second control point
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of the first control point
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the curve end
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the curve end
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToAbsolute ($x1, $y1, $x2, $y2, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a cubic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetorelative.php
+ * @param float $x1 <p>
+ * x coordinate of starting control point
+ * </p>
+ * @param float $y1 <p>
+ * y coordinate of starting control point
+ * </p>
+ * @param float $x2 <p>
+ * x coordinate of ending control point
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of ending control point
+ * </p>
+ * @param float $x <p>
+ * ending x coordinate
+ * </p>
+ * @param float $y <p>
+ * ending y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToRelative ($x1, $y1, $x2, $y2, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a quadratic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierabsolute.php
+ * @param float $x1 <p>
+ * x coordinate of the control point
+ * </p>
+ * @param float $y1 <p>
+ * y coordinate of the control point
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the end point
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the end point
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToQuadraticBezierAbsolute ($x1, $y1, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a quadratic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierrelative.php
+ * @param float $x1 <p>
+ * starting x coordinate
+ * </p>
+ * @param float $y1 <p>
+ * starting y coordinate
+ * </p>
+ * @param float $x <p>
+ * ending x coordinate
+ * </p>
+ * @param float $y <p>
+ * ending y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToQuadraticBezierRelative ($x1, $y1, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a quadratic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothabsolute.php
+ * @param float $x <p>
+ * ending x coordinate
+ * </p>
+ * @param float $y <p>
+ * ending y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToQuadraticBezierSmoothAbsolute ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a quadratic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothrelative.php
+ * @param float $x <p>
+ * ending x coordinate
+ * </p>
+ * @param float $y <p>
+ * ending y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToQuadraticBezierSmoothRelative ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a cubic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothabsolute.php
+ * @param float $x2 <p>
+ * x coordinate of the second control point
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of the second control point
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the ending point
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the ending point
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToSmoothAbsolute ($x2, $y2, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a cubic Bezier curve
+ * @link https://php.net/manual/en/imagickdraw.pathcurvetosmoothrelative.php
+ * @param float $x2 <p>
+ * x coordinate of the second control point
+ * </p>
+ * @param float $y2 <p>
+ * y coordinate of the second control point
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the ending point
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the ending point
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathCurveToSmoothRelative ($x2, $y2, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws an elliptical arc
+ * @link https://php.net/manual/en/imagickdraw.pathellipticarcabsolute.php
+ * @param float $rx <p>
+ * x radius
+ * </p>
+ * @param float $ry <p>
+ * y radius
+ * </p>
+ * @param float $x_axis_rotation <p>
+ * x axis rotation
+ * </p>
+ * @param bool $large_arc_flag <p>
+ * large arc flag
+ * </p>
+ * @param bool $sweep_flag <p>
+ * sweep flag
+ * </p>
+ * @param float $x <p>
+ * x coordinate
+ * </p>
+ * @param float $y <p>
+ * y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathEllipticArcAbsolute ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws an elliptical arc
+ * @link https://php.net/manual/en/imagickdraw.pathellipticarcrelative.php
+ * @param float $rx <p>
+ * x radius
+ * </p>
+ * @param float $ry <p>
+ * y radius
+ * </p>
+ * @param float $x_axis_rotation <p>
+ * x axis rotation
+ * </p>
+ * @param bool $large_arc_flag <p>
+ * large arc flag
+ * </p>
+ * @param bool $sweep_flag <p>
+ * sweep flag
+ * </p>
+ * @param float $x <p>
+ * x coordinate
+ * </p>
+ * @param float $y <p>
+ * y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathEllipticArcRelative ($rx, $ry, $x_axis_rotation, $large_arc_flag, $sweep_flag, $x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Terminates the current path
+ * @link https://php.net/manual/en/imagickdraw.pathfinish.php
+ * @return bool No value is returned.
+ */
+ public function pathFinish () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a line path
+ * @link https://php.net/manual/en/imagickdraw.pathlinetoabsolute.php
+ * @param float $x <p>
+ * starting x coordinate
+ * </p>
+ * @param float $y <p>
+ * ending x coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToAbsolute ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a line path
+ * @link https://php.net/manual/en/imagickdraw.pathlinetorelative.php
+ * @param float $x <p>
+ * starting x coordinate
+ * </p>
+ * @param float $y <p>
+ * starting y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToRelative ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a horizontal line path
+ * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalabsolute.php
+ * @param float $x <p>
+ * x coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToHorizontalAbsolute ($x) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a horizontal line
+ * @link https://php.net/manual/en/imagickdraw.pathlinetohorizontalrelative.php
+ * @param float $x <p>
+ * x coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToHorizontalRelative ($x) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a vertical line
+ * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalabsolute.php
+ * @param float $y <p>
+ * y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToVerticalAbsolute ($y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a vertical line path
+ * @link https://php.net/manual/en/imagickdraw.pathlinetoverticalrelative.php
+ * @param float $y <p>
+ * y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathLineToVerticalRelative ($y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Starts a new sub-path
+ * @link https://php.net/manual/en/imagickdraw.pathmovetoabsolute.php
+ * @param float $x <p>
+ * x coordinate of the starting point
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the starting point
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathMoveToAbsolute ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Starts a new sub-path
+ * @link https://php.net/manual/en/imagickdraw.pathmovetorelative.php
+ * @param float $x <p>
+ * target x coordinate
+ * </p>
+ * @param float $y <p>
+ * target y coordinate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pathMoveToRelative ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Declares the start of a path drawing list
+ * @link https://php.net/manual/en/imagickdraw.pathstart.php
+ * @return bool No value is returned.
+ */
+ public function pathStart () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Draws a polyline
+ * @link https://php.net/manual/en/imagickdraw.polyline.php
+ * @param array $coordinates <p>
+ * array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) )
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function polyline (array $coordinates) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Terminates a clip path definition
+ * @link https://php.net/manual/en/imagickdraw.popclippath.php
+ * @return bool No value is returned.
+ */
+ public function popClipPath () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Terminates a definition list
+ * @link https://php.net/manual/en/imagickdraw.popdefs.php
+ * @return bool No value is returned.
+ */
+ public function popDefs () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Terminates a pattern definition
+ * @link https://php.net/manual/en/imagickdraw.poppattern.php
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function popPattern () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Starts a clip path definition
+ * @link https://php.net/manual/en/imagickdraw.pushclippath.php
+ * @param string $clip_mask_id <p>
+ * Clip mask Id
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function pushClipPath ($clip_mask_id) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Indicates that following commands create named elements for early processing
+ * @link https://php.net/manual/en/imagickdraw.pushdefs.php
+ * @return bool No value is returned.
+ */
+ public function pushDefs () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern
+ * @link https://php.net/manual/en/imagickdraw.pushpattern.php
+ * @param string $pattern_id <p>
+ * the pattern Id
+ * </p>
+ * @param float $x <p>
+ * x coordinate of the top-left corner
+ * </p>
+ * @param float $y <p>
+ * y coordinate of the top-left corner
+ * </p>
+ * @param float $width <p>
+ * width of the pattern
+ * </p>
+ * @param float $height <p>
+ * height of the pattern
+ * </p>
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function pushPattern ($pattern_id, $x, $y, $width, $height) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Renders all preceding drawing commands onto the image
+ * @link https://php.net/manual/en/imagickdraw.render.php
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function render () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Applies the specified rotation to the current coordinate space
+ * @link https://php.net/manual/en/imagickdraw.rotate.php
+ * @param float $degrees <p>
+ * degrees to rotate
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function rotate ($degrees) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Adjusts the scaling factor
+ * @link https://php.net/manual/en/imagickdraw.scale.php
+ * @param float $x <p>
+ * horizontal factor
+ * </p>
+ * @param float $y <p>
+ * vertical factor
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function scale ($x, $y) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Associates a named clipping path with the image
+ * @link https://php.net/manual/en/imagickdraw.setclippath.php
+ * @param string $clip_mask <p>
+ * the clipping path name
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setClipPath ($clip_mask) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Set the polygon fill rule to be used by the clipping path
+ * @link https://php.net/manual/en/imagickdraw.setcliprule.php
+ * @param int $fill_rule <p>
+ * FILLRULE_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setClipRule ($fill_rule) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the interpretation of clip path units
+ * @link https://php.net/manual/en/imagickdraw.setclipunits.php
+ * @param int $clip_units <p>
+ * the number of clip units
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setClipUnits ($clip_units) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the opacity to use when drawing using the fill color or fill texture
+ * @link https://php.net/manual/en/imagickdraw.setfillopacity.php
+ * @param float $fillOpacity <p>
+ * the fill opacity
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFillOpacity ($fillOpacity) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the URL to use as a fill pattern for filling objects
+ * @link https://php.net/manual/en/imagickdraw.setfillpatternurl.php
+ * @param string $fill_url <p>
+ * URL to use to obtain fill pattern.
+ * </p>
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function setFillPatternURL ($fill_url) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the fill rule to use while drawing polygons
+ * @link https://php.net/manual/en/imagickdraw.setfillrule.php
+ * @param int $fill_rule <p>
+ * FILLRULE_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setFillRule ($fill_rule) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the text placement gravity
+ * @link https://php.net/manual/en/imagickdraw.setgravity.php
+ * @param int $gravity <p>
+ * GRAVITY_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setGravity ($gravity) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the pattern used for stroking object outlines
+ * @link https://php.net/manual/en/imagickdraw.setstrokepatternurl.php
+ * @param string $stroke_url <p>
+ * stroke URL
+ * </p>
+ * @return bool imagick.imagickdraw.return.success;
+ */
+ public function setStrokePatternURL ($stroke_url) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the offset into the dash pattern to start the dash
+ * @link https://php.net/manual/en/imagickdraw.setstrokedashoffset.php
+ * @param float $dash_offset <p>
+ * dash offset
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeDashOffset ($dash_offset) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the shape to be used at the end of open subpaths when they are stroked
+ * @link https://php.net/manual/en/imagickdraw.setstrokelinecap.php
+ * @param int $linecap <p>
+ * LINECAP_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeLineCap ($linecap) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the shape to be used at the corners of paths when they are stroked
+ * @link https://php.net/manual/en/imagickdraw.setstrokelinejoin.php
+ * @param int $linejoin <p>
+ * LINEJOIN_ constant
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeLineJoin ($linejoin) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the miter limit
+ * @link https://php.net/manual/en/imagickdraw.setstrokemiterlimit.php
+ * @param int $miterlimit <p>
+ * the miter limit
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeMiterLimit ($miterlimit) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the opacity of stroked object outlines
+ * @link https://php.net/manual/en/imagickdraw.setstrokeopacity.php
+ * @param float $stroke_opacity <p>
+ * stroke opacity. 1.0 is fully opaque
+ * </p>
+ * @return bool No value is returned.
+ */
+ public function setStrokeOpacity ($stroke_opacity) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the vector graphics
+ * @link https://php.net/manual/en/imagickdraw.setvectorgraphics.php
+ * @param string $xml <p>
+ * xml containing the vector graphics
+ * </p>
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function setVectorGraphics ($xml) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Destroys the current ImagickDraw in the stack, and returns to the previously pushed ImagickDraw
+ * @link https://php.net/manual/en/imagickdraw.pop.php
+ * @return bool <b>TRUE</b> on success and false on failure.
+ */
+ public function pop () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clones the current ImagickDraw and pushes it to the stack
+ * @link https://php.net/manual/en/imagickdraw.push.php
+ * @return bool <b>TRUE</b> on success or <b>FALSE</b> on failure.
+ */
+ public function push () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Specifies the pattern of dashes and gaps used to stroke paths
+ * @link https://php.net/manual/en/imagickdraw.setstrokedasharray.php
+ * @param array $dashArray <p>
+ * array of floats
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setStrokeDashArray (array $dashArray) {}
+
+ /**
+ * Sets the opacity to use when drawing using the fill or stroke color or texture. Fully opaque is 1.0.
+ *
+ * @param float $opacity
+ * @return void
+ * @since 3.4.1
+ */
+ public function setOpacity($opacity) { }
+
+ /**
+ * Returns the opacity used when drawing with the fill or stroke color or texture. Fully opaque is 1.0.
+ *
+ * @return float
+ * @since 3.4.1
+ */
+ public function getOpacity() { }
+
+ /**
+ * Sets the image font resolution.
+ *
+ * @param float $x
+ * @param float $y
+ * @return bool
+ * @since 3.4.1
+ */
+ public function setFontResolution($x, $y) { }
+
+ /**
+ * Gets the image X and Y resolution.
+ *
+ * @return array
+ * @since 3.4.1
+ */
+ public function getFontResolution() { }
+
+ /**
+ * Returns the direction that will be used when annotating with text.
+ * @return bool
+ * @since 3.4.1
+ */
+ public function getTextDirection() { }
+
+ /**
+ * Sets the font style to use when annotating with text. The AnyStyle enumeration acts as a wild-card "don't care" option.
+ *
+ * @param int $direction
+ * @return bool
+ * @since 3.4.1
+ */
+ public function setTextDirection($direction) { }
+
+ /**
+ * Returns the border color used for drawing bordered objects.
+ *
+ * @return ImagickPixel
+ * @since 3.4.1
+ */
+ public function getBorderColor() { }
+
+ /**
+ * Sets the border color to be used for drawing bordered objects.
+ * @param ImagickPixel $color
+ * @return bool
+ * @since 3.4.1
+ */
+ public function setBorderColor(ImagickPixel $color) { }
+
+ /**
+ * Obtains the vertical and horizontal resolution.
+ *
+ * @return string|null
+ * @since 3.4.1
+ */
+ public function getDensity() { }
+
+ /**
+ * Sets the vertical and horizontal resolution.
+ * @param string $density_string
+ * @return bool
+ * @since 3.4.1
+ */
+ public function setDensity($density_string) { }
+}
+
+/**
+ * @link https://php.net/manual/en/class.imagickpixeliterator.php
+ */
+class ImagickPixelIterator implements Iterator {
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * The ImagickPixelIterator constructor
+ * @link https://php.net/manual/en/imagickpixeliterator.construct.php
+ * @param Imagick $wand
+ */
+ public function __construct (Imagick $wand) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a new pixel iterator
+ * @link https://php.net/manual/en/imagickpixeliterator.newpixeliterator.php
+ * @param Imagick $wand
+ * @return bool <b>TRUE</b> on success. Throwing ImagickPixelIteratorException.
+ * @throws ImagickPixelIteratorException
+ */
+ public function newPixelIterator (Imagick $wand) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns a new pixel iterator
+ * @link https://php.net/manual/en/imagickpixeliterator.newpixelregioniterator.php
+ * @param Imagick $wand
+ * @param int $x
+ * @param int $y
+ * @param int $columns
+ * @param int $rows
+ * @return bool a new ImagickPixelIterator on success; on failure, throws ImagickPixelIteratorException
+ * @throws ImagickPixelIteratorException
+ */
+ public function newPixelRegionIterator (Imagick $wand, $x, $y, $columns, $rows) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the current pixel iterator row
+ * @link https://php.net/manual/en/imagickpixeliterator.getiteratorrow.php
+ * @return int the integer offset of the row, throwing ImagickPixelIteratorException on error.
+ * @throws ImagickPixelIteratorException on error
+ */
+ public function getIteratorRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Set the pixel iterator row
+ * @link https://php.net/manual/en/imagickpixeliterator.setiteratorrow.php
+ * @param int $row
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setIteratorRow ($row) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the pixel iterator to the first pixel row
+ * @link https://php.net/manual/en/imagickpixeliterator.setiteratorfirstrow.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setIteratorFirstRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the pixel iterator to the last pixel row
+ * @link https://php.net/manual/en/imagickpixeliterator.setiteratorlastrow.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setIteratorLastRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the previous row
+ * @link https://php.net/manual/en/imagickpixeliterator.getpreviousiteratorrow.php
+ * @return array the previous row as an array of ImagickPixelWand objects from the
+ * ImagickPixelIterator, throwing ImagickPixelIteratorException on error.
+ * @throws ImagickPixelIteratorException on error
+ */
+ public function getPreviousIteratorRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the current row of ImagickPixel objects
+ * @link https://php.net/manual/en/imagickpixeliterator.getcurrentiteratorrow.php
+ * @return array a row as an array of ImagickPixel objects that can themselves be iterated.
+ */
+ public function getCurrentIteratorRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the next row of the pixel iterator
+ * @link https://php.net/manual/en/imagickpixeliterator.getnextiteratorrow.php
+ * @return array the next row as an array of ImagickPixel objects, throwing
+ * ImagickPixelIteratorException on error.
+ * @throws ImagickPixelIteratorException on error
+ */
+ public function getNextIteratorRow () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Resets the pixel iterator
+ * @link https://php.net/manual/en/imagickpixeliterator.resetiterator.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function resetIterator () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Syncs the pixel iterator
+ * @link https://php.net/manual/en/imagickpixeliterator.synciterator.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function syncIterator () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Deallocates resources associated with a PixelIterator
+ * @link https://php.net/manual/en/imagickpixeliterator.destroy.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function destroy () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clear resources associated with a PixelIterator
+ * @link https://php.net/manual/en/imagickpixeliterator.clear.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function clear () {}
+
+ /**
+ * @param Imagick $Imagick
+ */
+ public static function getpixeliterator (Imagick $Imagick) {}
+
+ /**
+ * @param Imagick $Imagick
+ * @param $x
+ * @param $y
+ * @param $columns
+ * @param $rows
+ */
+ public static function getpixelregioniterator (Imagick $Imagick, $x, $y, $columns, $rows) {}
+
+ public function key () {}
+
+ public function next () {}
+
+ public function rewind () {}
+
+ public function current () {}
+
+ public function valid () {}
+
+}
+
+/**
+ * @method clone()
+ * @link https://php.net/manual/en/class.imagickpixel.php
+ */
+class ImagickPixel {
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the normalized HSL color of the ImagickPixel object
+ * @link https://php.net/manual/en/imagickpixel.gethsl.php
+ * @return array the HSL value in an array with the keys "hue",
+ * "saturation", and "luminosity". Throws ImagickPixelException on failure.
+ * @throws ImagickPixelException on failure
+ */
+ public function getHSL () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the normalized HSL color
+ * @link https://php.net/manual/en/imagickpixel.sethsl.php
+ * @param float $hue <p>
+ * The normalized value for hue, described as a fractional arc
+ * (between 0 and 1) of the hue circle, where the zero value is
+ * red.
+ * </p>
+ * @param float $saturation <p>
+ * The normalized value for saturation, with 1 as full saturation.
+ * </p>
+ * @param float $luminosity <p>
+ * The normalized value for luminosity, on a scale from black at
+ * 0 to white at 1, with the full HS value at 0.5 luminosity.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setHSL ($hue, $saturation, $luminosity) {}
+
+ public function getColorValueQuantum () {}
+
+ /**
+ * @param $color_value
+ */
+ public function setColorValueQuantum ($color_value) {}
+
+ public function getIndex () {}
+
+ /**
+ * @param $index
+ */
+ public function setIndex ($index) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * The ImagickPixel constructor
+ * @link https://php.net/manual/en/imagickpixel.construct.php
+ * @param string $color [optional] <p>
+ * The optional color string to use as the initial value of this object.
+ * </p>
+ */
+ public function __construct ($color = null) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the color
+ * @link https://php.net/manual/en/imagickpixel.setcolor.php
+ * @param string $color <p>
+ * The color definition to use in order to initialise the
+ * ImagickPixel object.
+ * </p>
+ * @return bool <b>TRUE</b> if the specified color was set, <b>FALSE</b> otherwise.
+ */
+ public function setColor ($color) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Sets the normalized value of one of the channels
+ * @link https://php.net/manual/en/imagickpixel.setcolorvalue.php
+ * @param int $color <p>
+ * One of the Imagick color constants e.g. \Imagick::COLOR_GREEN or \Imagick::COLOR_ALPHA.
+ * </p>
+ * @param float $value <p>
+ * The value to set this channel to, ranging from 0 to 1.
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function setColorValue ($color, $value) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Gets the normalized value of the provided color channel
+ * @link https://php.net/manual/en/imagickpixel.getcolorvalue.php
+ * @param int $color <p>
+ * The color to get the value of, specified as one of the Imagick color
+ * constants. This can be one of the RGB colors, CMYK colors, alpha and
+ * opacity e.g (Imagick::COLOR_BLUE, Imagick::COLOR_MAGENTA).
+ * </p>
+ * @return float The value of the channel, as a normalized floating-point number, throwing
+ * ImagickPixelException on error.
+ * @throws ImagickPixelException on error
+ */
+ public function getColorValue ($color) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Clears resources associated with this object
+ * @link https://php.net/manual/en/imagickpixel.clear.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function clear () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Deallocates resources associated with this object
+ * @link https://php.net/manual/en/imagickpixel.destroy.php
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function destroy () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Check the distance between this color and another
+ * @link https://php.net/manual/en/imagickpixel.issimilar.php
+ * @param ImagickPixel $color <p>
+ * The ImagickPixel object to compare this object against.
+ * </p>
+ * @param float $fuzz <p>
+ * The maximum distance within which to consider these colors as similar.
+ * The theoretical maximum for this value is the square root of three
+ * (1.732).
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function isSimilar (ImagickPixel $color, $fuzz) {}
+
+ /**
+ * (No version information available, might only be in SVN)<br/>
+ * Check the distance between this color and another
+ * @link https://php.net/manual/en/imagickpixel.ispixelsimilar.php
+ * @param ImagickPixel $color <p>
+ * The ImagickPixel object to compare this object against.
+ * </p>
+ * @param float $fuzz <p>
+ * The maximum distance within which to consider these colors as similar.
+ * The theoretical maximum for this value is the square root of three
+ * (1.732).
+ * </p>
+ * @return bool <b>TRUE</b> on success.
+ */
+ public function isPixelSimilar (ImagickPixel $color, $fuzz) {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the color
+ * @link https://php.net/manual/en/imagickpixel.getcolor.php
+ * @param bool $normalized [optional] <p>
+ * Normalize the color values
+ * </p>
+ * @return array An array of channel values, each normalized if <b>TRUE</b> is given as param. Throws
+ * ImagickPixelException on error.
+ * @throws ImagickPixelException on error.
+ */
+ public function getColor ($normalized = false) {}
+
+ /**
+ * (PECL imagick 2.1.0)<br/>
+ * Returns the color as a string
+ * @link https://php.net/manual/en/imagickpixel.getcolorasstring.php
+ * @return string the color of the ImagickPixel object as a string.
+ */
+ public function getColorAsString () {}
+
+ /**
+ * (PECL imagick 2.0.0)<br/>
+ * Returns the color count associated with this color
+ * @link https://php.net/manual/en/imagickpixel.getcolorcount.php
+ * @return int the color count as an integer on success, throws
+ * ImagickPixelException on failure.
+ * @throws ImagickPixelException on failure.
+ */
+ public function getColorCount () {}
+
+ /**
+ * @param $colorCount
+ */
+ public function setColorCount ($colorCount) {}
+
+
+ /**
+ * Returns true if the distance between two colors is less than the specified distance. The fuzz value should be in the range 0-QuantumRange.<br>
+ * The maximum value represents the longest possible distance in the colorspace. e.g. from RGB(0, 0, 0) to RGB(255, 255, 255) for the RGB colorspace
+ * @link https://php.net/manual/en/imagickpixel.ispixelsimilarquantum.php
+ * @param string $pixel
+ * @param string $fuzz
+ * @return bool
+ * @since 3.3.0
+ */
+ public function isPixelSimilarQuantum($color, $fuzz) { }
+
+ /**
+ * Returns the color of the pixel in an array as Quantum values. If ImageMagick was compiled as HDRI these will be floats, otherwise they will be integers.
+ * @link https://php.net/manual/en/imagickpixel.getcolorquantum.php
+ * @return mixed The quantum value of the color element. Float if ImageMagick was compiled with HDRI, otherwise an int.
+ * @since 3.3.0
+ */
+ public function getColorQuantum() { }
+
+ /**
+ * Sets the color count associated with this color from another ImagickPixel object.
+ *
+ * @param ImagickPixel $srcPixel
+ * @return bool
+ * @since 3.4.1
+ */
+ public function setColorFromPixel(ImagickPixel $srcPixel) { }
+}
+// End of imagick v.3.2.0RC1
+
+// Start of Imagick v3.3.0RC1
+
+/**
+ * @link https://php.net/manual/en/class.imagickkernel.php
+ */
+class ImagickKernel {
+ /**
+ * Attach another kernel to this kernel to allow them to both be applied in a single morphology or filter function. Returns the new combined kernel.
+ * @link https://php.net/manual/en/imagickkernel.addkernel.php
+ * @param ImagickKernel $imagickKernel
+ * @return void
+ * @since 3.3.0
+ */
+ public function addKernel(ImagickKernel $imagickKernel) { }
+
+ /**
+ * Adds a given amount of the 'Unity' Convolution Kernel to the given pre-scaled and normalized Kernel. This in effect adds that amount of the original image into the resulting convolution kernel. The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.
+ * @link https://php.net/manual/en/imagickkernel.addunitykernel.php
+ * @return void
+ * @since 3.3.0
+ */
+ public function addUnityKernel() { }
+
+ /**
+ * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br>
+ * Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");
+ * @link https://php.net/manual/en/imagickkernel.frombuiltin.php
+ * @param string $kernelType The type of kernel to build e.g. \Imagick::KERNEL_DIAMOND
+ * @param string $kernelString A string that describes the parameters e.g. "4,2.5"
+ * @return void
+ * @since 3.3.0
+ */
+ public static function fromBuiltin($kernelType, $kernelString) { }
+
+ /**
+ * Create a kernel from a builtin in kernel. See https://www.imagemagick.org/Usage/morphology/#kernel for examples.<br>
+ * Currently the 'rotation' symbols are not supported. Example: $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2");
+ * @link https://php.net/manual/en/imagickkernel.frombuiltin.php
+ * @see https://www.imagemagick.org/Usage/morphology/#kernel
+ * @param array $matrix A matrix (i.e. 2d array) of values that define the kernel. Each element should be either a float value, or FALSE if that element shouldn't be used by the kernel.
+ * @param array $origin [optional] Which element of the kernel should be used as the origin pixel. e.g. For a 3x3 matrix specifying the origin as [2, 2] would specify that the bottom right element should be the origin pixel.
+ * @return ImagickKernel
+ * @since 3.3.0
+ */
+ public static function fromMatrix($matrix, $origin) { }
+
+ /**
+ * Get the 2d matrix of values used in this kernel. The elements are either float for elements that are used or 'false' if the element should be skipped.
+ * @link https://php.net/manual/en/imagickkernel.getmatrix.php
+ * @return array A matrix (2d array) of the values that represent the kernel.
+ * @since 3.3.0
+ */
+ public function getMatrix() { }
+
+ /**
+ * ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).<br>
+ * The exact behaviour of this function depends on the normalization type being used please see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo for details.<br>
+ * Flag should be one of Imagick::NORMALIZE_KERNEL_VALUE, Imagick::NORMALIZE_KERNEL_CORRELATE, Imagick::NORMALIZE_KERNEL_PERCENT or not set.
+ * @link https://php.net/manual/en/imagickkernel.scale.php
+ * @see https://www.imagemagick.org/api/morphology.php#ScaleKernelInfo
+ * @return void
+ * @since 3.3.0
+ */
+ public function scale() { }
+
+ /**
+ * Separates a linked set of kernels and returns an array of ImagickKernels.
+ * @link https://php.net/manual/en/imagickkernel.separate.php
+ * @return void
+ * @since 3.3.0
+ */
+ public function seperate() { }
+}
diff --git a/vendor/chillerlan/php-qrcode/.scrutinizer.yml b/vendor/chillerlan/php-qrcode/.scrutinizer.yml
index 7fdd2a4dc..2a7e7028b 100644
--- a/vendor/chillerlan/php-qrcode/.scrutinizer.yml
+++ b/vendor/chillerlan/php-qrcode/.scrutinizer.yml
@@ -1,5 +1,16 @@
+build:
+ nodes:
+ analysis:
+ tests:
+ override:
+ - php-scrutinizer-run
+ environment:
+ php: 8.0.0
+
filter:
excluded_paths:
- examples/*
- tests/*
- vendor/*
+ - .github/*
+ - .phan/*
diff --git a/vendor/chillerlan/php-qrcode/.travis.yml b/vendor/chillerlan/php-qrcode/.travis.yml
deleted file mode 100644
index 7b2377fd8..000000000
--- a/vendor/chillerlan/php-qrcode/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-branches:
- only:
- - main
- - v3.2.x
-
-addons:
- apt:
- packages:
- - imagemagick
-
-language: php
-
-matrix:
- include:
- - php: 7.2
- - php: 7.3
- - php: 7.4
-
-before_install:
- - pecl channel-update pecl.php.net
- - printf "\n" | pecl install imagick
-install: travis_retry composer install --no-interaction --prefer-source
-script: vendor/bin/phpunit --configuration phpunit.xml --coverage-clover clover.xml
-after_script: bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/chillerlan/php-qrcode/README.md b/vendor/chillerlan/php-qrcode/README.md
index 075b2a376..f266e9bd5 100644
--- a/vendor/chillerlan/php-qrcode/README.md
+++ b/vendor/chillerlan/php-qrcode/README.md
@@ -1,77 +1,87 @@
# chillerlan/php-qrcode
-A PHP7.2+ QR Code library based on the [implementation](https://github.com/kazuhikoarase/qrcode-generator) by [Kazuhiko Arase](https://github.com/kazuhikoarase),
+A PHP 7.4+ QR Code library based on the [implementation](https://github.com/kazuhikoarase/qrcode-generator) by [Kazuhiko Arase](https://github.com/kazuhikoarase),
namespaced, cleaned up, improved and other stuff.
+**Attention:** there is now also a javascript port: [chillerlan/js-qrcode](https://github.com/chillerlan/js-qrcode).
+
+[![PHP Version Support][php-badge]][php]
[![Packagist version][packagist-badge]][packagist]
[![License][license-badge]][license]
-[![Travis CI][travis-badge]][travis]
[![CodeCov][coverage-badge]][coverage]
[![Scrunitizer CI][scrutinizer-badge]][scrutinizer]
-[![Packagist downloads][downloads-badge]][downloads]
-[![PayPal donate][donate-badge]][donate]
-
+[![Packagist downloads][downloads-badge]][downloads]<br/>
[![Continuous Integration][gh-action-badge]][gh-action]
-[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-qrcode.svg?style=flat-square
+[php-badge]: https://img.shields.io/packagist/php-v/chillerlan/php-qrcode?logo=php&color=8892BF
+[php]: https://www.php.net/supported-versions.php
+[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-qrcode.svg?logo=packagist
[packagist]: https://packagist.org/packages/chillerlan/php-qrcode
-[license-badge]: https://img.shields.io/github/license/chillerlan/php-qrcode.svg?style=flat-square
+[license-badge]: https://img.shields.io/github/license/chillerlan/php-qrcode.svg
[license]: https://github.com/chillerlan/php-qrcode/blob/main/LICENSE
-[travis-badge]: https://img.shields.io/travis/chillerlan/php-qrcode.svg?style=flat-square
-[travis]: https://travis-ci.org/chillerlan/php-qrcode
-[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-qrcode.svg?style=flat-square
+[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-qrcode.svg?logo=codecov
[coverage]: https://codecov.io/github/chillerlan/php-qrcode
-[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-qrcode.svg?style=flat-square
+[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-qrcode.svg?logo=scrutinizer
[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-qrcode
-[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-qrcode.svg?style=flat-square
+[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-qrcode.svg?logo=packagist
[downloads]: https://packagist.org/packages/chillerlan/php-qrcode/stats
-[donate-badge]: https://img.shields.io/badge/donate-paypal-ff33aa.svg?style=flat-square
-[donate]: https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4
[gh-action-badge]: https://github.com/chillerlan/php-qrcode/workflows/Continuous%20Integration/badge.svg
-[gh-action]: https://github.com/chillerlan/php-qrcode/actions
+[gh-action]: https://github.com/chillerlan/php-qrcode/actions?query=workflow%3A%22Continuous+Integration%22+branch%3Av4.3.x
-## Documentation
+# Documentation
-### Requirements
-- PHP 7.2+
+## Requirements
+- PHP 7.4+
- `ext-mbstring`
- - optional:
- - `ext-json`, `ext-gd`
- - `ext-imagick` with [ImageMagick](https://imagemagick.org) installed
- - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
+ - optional:
+ - `ext-json`, `ext-gd`
+ - `ext-imagick` with [ImageMagick](https://imagemagick.org) installed
+ - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
-### Installation
+## Installation
**requires [composer](https://getcomposer.org)**
via terminal: `composer require chillerlan/php-qrcode`
-*composer.json* (note: replace `dev-master` with a [version boundary](https://getcomposer.org/doc/articles/versions.md), e.g. `^3.2`)
+*composer.json*
```json
{
"require": {
- "php": "^7.2",
- "chillerlan/php-qrcode": "^3.4"
+ "php": "^7.4 || ^8.0",
+ "chillerlan/php-qrcode": "v4.3.x-dev"
}
}
```
-### Usage
+Note: replace `v4.3.x-dev` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^4.3` - see [releases](https://github.com/chillerlan/php-qrcode/releases) for valid versions.
+For PHP version ...
+ - 7.4+ use `^4.3`
+ - 7.2+ use `^3.4.1` (v3.4.1 also supports PHP8)
+ - 7.0+ use `^2.0`
+ - 5.6+ use `^1.0` (please let PHP 5 die!)
+
+In case you want to keep using `v4.3.x-dev`, specify the hash of a commit to avoid running into unforseen issues like so: `v4.3.x-dev#c115f7bc51d466ccb24c544e88329804aad8c2a0`
+
+PSA: [PHP 7.0 - 7.3 are EOL](https://www.php.net/supported-versions.php) and therefore the respective `QRCode` versions are also no longer supported!
+
+## Quickstart
We want to encode this URI for a mobile authenticator into a QRcode image:
```php
$data = 'otpauth://totp/test?secret=B3JX4VCVJDVNXNZ5&issuer=chillerlan.net';
-//quick and simple:
+// quick and simple:
echo '<img src="'.(new QRCode)->render($data).'" alt="QR Code" />';
```
<p align="center">
- <img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/main/examples/example_image.png">
- <img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/main/examples/example_svg.png">
+ <img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/v4.3.x/examples/example_image.png">
+ <img alt="QR codes are awesome!" src="https://raw.githubusercontent.com/chillerlan/php-qrcode/v4.3.x/examples/example_svg.png">
</p>
Wait, what was that? Please again, slower!
-### Advanced usage
+
+## Advanced usage
Ok, step by step. First you'll need a `QRCode` instance, which can be optionally invoked with a `QROptions` (or a [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php), respectively) object as the only parameter.
@@ -92,7 +102,7 @@ $qrcode->render($data);
$qrcode->render($data, '/path/to/file.svg');
```
-In case you just want the raw QR code matrix, call `QRCode::getMatrix()` - this method is also called internally from `QRCode::render()`. See also [Custom output modules](#custom-qroutputinterface).
+In case you just want the raw QR code matrix, call `QRCode::getMatrix()` - this method is also called internally from `QRCode::render()`. See also [[Custom output interface]].
```php
$matrix = $qrcode->getMatrix($data);
@@ -102,6 +112,8 @@ foreach($matrix->matrix() as $y => $row){
// get a module's value
$value = $module;
+
+ // or via the matrix's getter method
$value = $matrix->get($x, $y);
// boolean check a module
@@ -116,88 +128,27 @@ foreach($matrix->matrix() as $y => $row){
}
```
-Have a look [in this folder](https://github.com/chillerlan/php-qrcode/tree/master/examples) for some more usage examples.
-
-#### Custom module values
-Previous versions of `QRCode` held only boolean matrix values that only allowed to determine whether a module was dark or not. Now you can distinguish between different parts of the matrix, namely the several required patterns from the QR Code specification, and use them in different ways.
-
-The dark value is the module (light) value shifted by 8 bits to the left: `$value = $M_TYPE << ($bool ? 8 : 0);`, where `$M_TYPE` is one of the `QRMatrix::M_*` constants.
-You can check the value for a type explicitly like...
-```php
-// for true (dark)
-$value >> 8 === $M_TYPE;
-
-//for false (light)
-$value === $M_TYPE;
-```
-...or you can perform a loose check, ignoring the module value
-```php
-// for true
-$value >> 8 > 0;
-
-// for false
-$value >> 8 === 0
-```
-
-See also `QRMatrix::set()`, `QRMatrix::check()` and [`QRMatrix` constants](#qrmatrix-constants).
+Have a look [in the examples folder](https://github.com/chillerlan/php-qrcode/tree/main/examples) for some more usage examples.
-To map the values and properly render the modules for the given `QROutputInterface`, it's necessary to overwrite the default values:
-```php
-$options = new QROptions;
-
-// for HTML, SVG and ImageMagick
-$options->moduleValues = [
- // finder
- 1536 => '#A71111', // dark (true)
- 6 => '#FFBFBF', // light (false)
- // alignment
- 2560 => '#A70364',
- 10 => '#FFC9C9',
- // timing
- 3072 => '#98005D',
- 12 => '#FFB8E9',
- // format
- 3584 => '#003804',
- 14 => '#00FB12',
- // version
- 4096 => '#650098',
- 16 => '#E0B8FF',
- // data
- 1024 => '#4A6000',
- 4 => '#ECF9BE',
- // darkmodule
- 512 => '#080063',
- // separator
- 8 => '#AFBFBF',
- // quietzone
- 18 => '#FFFFFF',
-];
+### Notes
+The QR encoder, especially the subroutines for mask pattern testing, can cause high CPU load on increased matrix size.
+You can avoid a part of this load by choosing a fast output module, like `OUTPUT_IMAGE_*` and maybe setting the mask pattern manually (which may result in unreadable QR Codes).
+Oh hey and don't forget to sanitize any user input!
-// for the image output types
-$options->moduleValues = [
- 512 => [0, 0, 0],
- // ...
-];
-// for string/text output
-$options->moduleValues = [
- 512 => '#',
- // ...
-];
-```
+## Custom output interface
-#### Custom `QROutputInterface`
-Instead of bloating your code you can simply create your own output interface by extending `QROutputAbstract`. Have a look at the [built-in output modules](https://github.com/chillerlan/php-qrcode/tree/master/src/Output).
+Instead of bloating your code you can simply create your own output interface by creating a `QROutputInterface` (i.e. extending `QROutputAbstract`).
```php
class MyCustomOutput extends QROutputAbstract{
// inherited from QROutputAbstract
- protected $matrix; // QRMatrix
- protected $moduleCount; // modules QRMatrix::size()
- protected $options; // MyCustomOptions or QROptions
- protected $scale; // scale factor from options
- protected $length; // length of the matrix ($moduleCount * $scale)
+ protected QRMatrix $matrix; // QRMatrix
+ protected int $moduleCount; // modules QRMatrix::size()
+ protected QROptions $options; // MyCustomOptions or QROptions
+ protected int $scale; // scale factor from options
+ protected int $length; // length of the matrix ($moduleCount * $scale)
// ...check/set default module values (abstract method, called by the constructor)
protected function setModuleValues():void{
@@ -219,20 +170,21 @@ class MyCustomOutput extends QROutputAbstract{
}
```
+For more examples, have a look at the [built-in output modules](https://github.com/chillerlan/php-qrcode/tree/main/src/Output).
In case you need additional settings for your output module, just extend `QROptions`...
```
class MyCustomOptions extends QROptions{
- protected $myParam = 'defaultValue';
+ protected string $myParam = 'defaultValue';
// ...
}
```
-...or use the [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php), which is the more flexible approach.
+...or use the [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php), which is the more flexible approach.
```php
trait MyCustomOptionsTrait{
- protected $myParam = 'defaultValue';
+ protected string $myParam = 'defaultValue';
// ...
}
@@ -270,20 +222,91 @@ $qrOutputInterface = new MyCustomOutput($myCustomOptions, (new QRCode($myCustomO
$qrOutputInterface->dump();
```
-### API
+### Custom module values
+
+You can distinguish between different parts of the matrix, namely the several required patterns from the QR Code specification, and use them in different ways, i.e. to assign different colors for each part of the matrix (see the [image example](https://github.com/chillerlan/php-qrcode/blob/main/examples/image.php)).
+The dark value is the module value (light) shifted by 8 bits to the left: `$value = $M_TYPE << ($bool ? 8 : 0);`, where `$M_TYPE` is one of the `QRMatrix::M_*` constants.
+You can check the value for a type explicitly like...
+```php
+// for true (dark)
+($value >> 8) === $M_TYPE;
+
+// for false (light)
+$value === $M_TYPE;
+```
+...or you can perform a loose check, ignoring the module value
+```php
+// for true
+($value >> 8) > 0;
+
+// for false
+($value >> 8) === 0;
+```
+
+See also `QRMatrix::set()`, `QRMatrix::check()` and [`QRMatrix` constants](#qrmatrix-constants).
-#### `QRCode` methods
+To map the values and properly render the modules for the given `QROutputInterface`, it's necessary to overwrite the default values:
+```php
+$options = new QROptions;
+
+// for HTML, SVG and ImageMagick
+$options->moduleValues = [
+ // finder
+ 1536 => '#A71111', // dark (true)
+ 6 => '#FFBFBF', // light (false)
+ // alignment
+ 2560 => '#A70364',
+ 10 => '#FFC9C9',
+ // timing
+ 3072 => '#98005D',
+ 12 => '#FFB8E9',
+ // format
+ 3584 => '#003804',
+ 14 => '#00FB12',
+ // version
+ 4096 => '#650098',
+ 16 => '#E0B8FF',
+ // data
+ 1024 => '#4A6000',
+ 4 => '#ECF9BE',
+ // darkmodule
+ 512 => '#080063',
+ // separator
+ 8 => '#AFBFBF',
+ // quietzone
+ 18 => '#FFFFFF',
+];
+
+// for the image output types
+$options->moduleValues = [
+ 512 => [0, 0, 0],
+ // ...
+];
+
+// for string/text output
+$options->moduleValues = [
+ 512 => '#',
+ // ...
+];
+```
+
+
+## Public API
+
+### `QRCode` API
+#### Methods
method | return | description
------ | ------ | -----------
-`__construct(QROptions $options = null)` | - | see [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php)
+`__construct(QROptions $options = null)` | - | see [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php)
`render(string $data, string $file = null)` | mixed, `QROutputInterface::dump()` | renders a QR Code for the given `$data` and `QROptions`, saves `$file` optional
`getMatrix(string $data)` | `QRMatrix` | returns a `QRMatrix` object for the given `$data` and current `QROptions`
`initDataInterface(string $data)` | `QRDataInterface` | returns a fresh `QRDataInterface` for the given `$data`
`isNumber(string $string)` | bool | checks if a string qualifies for `Number`
`isAlphaNum(string $string)` | bool | checks if a string qualifies for `AlphaNum`
`isKanji(string $string)` | bool | checks if a string qualifies for `Kanji`
+`isByte(string $string)` | bool | checks if a string is non-empty
-#### `QRCode` constants
+#### Constants
name | description
---- | -----------
`VERSION_AUTO` | `QROptions::$version`
@@ -297,43 +320,14 @@ name | description
`ECC_L`, `ECC_M`, `ECC_Q`, `ECC_H`, | ECC-Level: 7%, 15%, 25%, 30% in `QROptions::$eccLevel`
`DATA_NUMBER`, `DATA_ALPHANUM`, `DATA_BYTE`, `DATA_KANJI` | `QRDataInterface::$datamode`
-#### `QROptions` properties
-property | type | default | allowed | description
--------- | ---- | ------- | ------- | -----------
-`$version` | int | `QRCode::VERSION_AUTO` | 1...40 | the [QR Code version number](http://www.qrcode.com/en/about/version.html)
-`$versionMin` | int | 1 | 1...40 | Minimum QR version (if `$version = QRCode::VERSION_AUTO`)
-`$versionMax` | int | 40 | 1...40 | Maximum QR version (if `$version = QRCode::VERSION_AUTO`)
-`$eccLevel` | int | `QRCode::ECC_L` | `QRCode::ECC_X` | Error correct level, where X = L (7%), M (15%), Q (25%), H (30%)
-`$maskPattern` | int | `QRCode::MASK_PATTERN_AUTO` | 0...7 | Mask Pattern to use
-`$addQuietzone` | bool | `true` | - | Add a "quiet zone" (margin) according to the QR code spec
-`$quietzoneSize` | int | 4 | clamped to 0 ... `$matrixSize / 2` | Size of the quiet zone
-`$dataMode` | string | `null` | `Number`, `AlphaNum`, `Kanji`, `Byte` | allows overriding the data type detection
-`$outputType` | string | `QRCode::OUTPUT_IMAGE_PNG` | `QRCode::OUTPUT_*` | built-in output type
-`$outputInterface` | string | `null` | * | FQCN of the custom `QROutputInterface` if `QROptions::$outputType` is set to `QRCode::OUTPUT_CUSTOM`
-`$cachefile` | string | `null` | * | optional cache file path
-`$eol` | string | `PHP_EOL` | * | newline string (HTML, SVG, TEXT)
-`$scale` | int | 5 | * | size of a QR code pixel (SVG, IMAGE_*), HTML -> via CSS
-`$cssClass` | string | `null` | * | a common css class
-`$svgOpacity` | float | 1.0 | 0...1 |
-`$svgDefs` | string | * | * | anything between [`<defs>`](https://developer.mozilla.org/docs/Web/SVG/Element/defs)
-`$svgViewBoxSize` | int | `null` | * | a positive integer which defines width/height of the [viewBox attribute](https://css-tricks.com/scale-svg/#article-header-id-3)
-`$textDark` | string | '🔴' | * | string substitute for dark
-`$textLight` | string | '⭕' | * | string substitute for light
-`$markupDark` | string | '#000' | * | markup substitute for dark (CSS value)
-`$markupLight` | string | '#fff' | * | markup substitute for light (CSS value)
-`$imageBase64` | bool | `true` | - | whether to return the image data as base64 or raw like from `file_get_contents()`
-`$imageTransparent` | bool | `true` | - | toggle transparency (no jpeg support)
-`$imageTransparencyBG` | array | `[255, 255, 255]` | `[R, G, B]` | the RGB values for the transparent color, see [`imagecolortransparent()`](http://php.net/manual/function.imagecolortransparent.php)
-`$pngCompression` | int | -1 | -1 ... 9 | `imagepng()` compression level, -1 = auto
-`$jpegQuality` | int | 85 | 0 - 100 | `imagejpeg()` quality
-`$imagickFormat` | string | 'png' | * | ImageMagick output type, see `Imagick::setType()`
-`$imagickBG` | string | `null` | * | ImageMagick background color, see `ImagickPixel::__construct()`
-`$moduleValues` | array | `null` | * | Module values map, see [Custom output modules](#custom-qroutputinterface) and `QROutputInterface::DEFAULT_MODULE_VALUES`
-#### `QRMatrix` methods
+### `QRMatrix` API
+
+#### Methods
method | return | description
------ | ------ | -----------
`__construct(int $version, int $eclevel)` | - | -
+`init(int $maskPattern, bool $test = null)` | `QRMatrix` |
`matrix()` | array | the internal matrix representation as a 2 dimensional array
`version()` | int | the current QR Code version
`eccLevel()` | int | current ECC level
@@ -342,9 +336,8 @@ method | return | description
`get(int $x, int $y)` | int | returns the value of the module
`set(int $x, int $y, bool $value, int $M_TYPE)` | `QRMatrix` | sets the `$M_TYPE` value for the module
`check(int $x, int $y)` | bool | checks whether a module is true (dark) or false (light)
-`setLogoSpace(int $width, int $height, int $startX = null, int $startY = null)` | `QRMatrix` | creates a logo space in the matrix
-#### `QRMatrix` constants
+#### Constants
name | light (false) | dark (true) | description
---- | ------------- | ----------- | -----------
`M_NULL` | 0 | - | module not set (should never appear. if so, there's an error)
@@ -360,33 +353,70 @@ name | light (false) | dark (true) | description
`M_LOGO` | 20 | - | space for a logo image (not used yet)
`M_TEST` | 255 | 65280 | test value
+### `QROptions` API
-### Notes
-The QR encoder, especially the subroutines for mask pattern testing, can cause high CPU load on increased matrix size.
-You can avoid a part of this load by choosing a fast output module, like `OUTPUT_IMAGE_*` and setting the mask pattern manually (which may result in unreadable QR Codes).
-Oh hey and don't forget to sanitize any user input!
-
-### Disclaimer!
-I don't take responsibility for molten CPUs, misled applications, failed log-ins etc.. Use at your own risk!
-
-#### Trademark Notice
-
-The word "QR Code" is registered trademark of *DENSO WAVE INCORPORATED*<br>
-http://www.denso-wave.com/qrcode/faqpatent-e.html
-
-### Framework Integration
-- Drupal [Google Authenticator Login `ga_login`](https://www.drupal.org/project/ga_login)
-- WordPress [`wp-two-factor-auth`](https://github.com/sjinks/wp-two-factor-auth)
-- WordPress [Simple 2FA `simple-2fa`](https://wordpress.org/plugins/simple-2fa/)
-- WoltLab Suite [two-step-verification](http://pluginstore.woltlab.com/file/3007-two-step-verification/)
-- [Cachet](https://github.com/CachetHQ/Cachet)
+#### Properties
+property | type | default | allowed | description
+-------- | ---- | ------- | ------- | -----------
+`$version` | int | `QRCode::VERSION_AUTO` | 1...40 | the [QR Code version number](http://www.qrcode.com/en/about/version.html)
+`$versionMin` | int | 1 | 1...40 | Minimum QR version (if `$version = QRCode::VERSION_AUTO`)
+`$versionMax` | int | 40 | 1...40 | Maximum QR version (if `$version = QRCode::VERSION_AUTO`)
+`$eccLevel` | int | `QRCode::ECC_L` | `QRCode::ECC_X` | Error correct level, where X = L (7%), M (15%), Q (25%), H (30%)
+`$maskPattern` | int | `QRCode::MASK_PATTERN_AUTO` | 0...7 | Mask Pattern to use
+`$addQuietzone` | bool | `true` | - | Add a "quiet zone" (margin) according to the QR code spec
+`$quietzoneSize` | int | 4 | clamped to 0 ... `$matrixSize / 2` | Size of the quiet zone
+`$dataModeOverride` | string | `null` | `Number`, `AlphaNum`, `Kanji`, `Byte` | allows overriding the data type detection
+`$outputType` | string | `QRCode::OUTPUT_IMAGE_PNG` | `QRCode::OUTPUT_*` | built-in output type
+`$outputInterface` | string | `null` | * | FQCN of the custom `QROutputInterface` if `QROptions::$outputType` is set to `QRCode::OUTPUT_CUSTOM`
+`$cachefile` | string | `null` | * | optional cache file path
+`$eol` | string | `PHP_EOL` | * | newline string (HTML, SVG, TEXT)
+`$scale` | int | 5 | * | size of a QR code pixel (SVG, IMAGE_*), HTML -> via CSS
+`$cssClass` | string | `null` | * | a common css class
+`$svgOpacity` | float | 1.0 | 0...1 |
+`$svgDefs` | string | * | * | anything between [`<defs>`](https://developer.mozilla.org/docs/Web/SVG/Element/defs)
+`$svgViewBoxSize` | int | `null` | * | a positive integer which defines width/height of the [viewBox attribute](https://css-tricks.com/scale-svg/#article-header-id-3)
+`$textDark` | string | '🔴' | * | string substitute for dark
+`$textLight` | string | '⭕' | * | string substitute for light
+`$markupDark` | string | '#000' | * | markup substitute for dark (CSS value)
+`$markupLight` | string | '#fff' | * | markup substitute for light (CSS value)
+`$imageBase64` | bool | `true` | - | whether to return the image data as base64 or raw like from `file_get_contents()`
+`$imageTransparent` | bool | `true` | - | toggle transparency (no jpeg support)
+`$imageTransparencyBG` | array | `[255, 255, 255]` | `[R, G, B]` | the RGB values for the transparent color, see [`imagecolortransparent()`](http://php.net/manual/function.imagecolortransparent.php)
+`$pngCompression` | int | -1 | -1 ... 9 | `imagepng()` compression level, -1 = auto
+`$jpegQuality` | int | 85 | 0 - 100 | `imagejpeg()` quality
+`$imagickFormat` | string | 'png' | * | ImageMagick output type, see `Imagick::setType()`
+`$imagickBG` | string | `null` | * | ImageMagick background color, see `ImagickPixel::__construct()`
+`$moduleValues` | array | `null` | * | Module values map, see [[Custom output interface]] and `QROutputInterface::DEFAULT_MODULE_VALUES`
+
+
+## Framework Integration
+- Drupal:
+ - [Google Authenticator Login `ga_login`](https://www.drupal.org/project/ga_login)
+- Symfony
+ - [phpqrcode-bundle](https://github.com/jonasarts/phpqrcode-bundle)
+- WordPress:
+ - [`wp-two-factor-auth`](https://github.com/sjinks/wp-two-factor-auth)
+ - [`simple-2fa`](https://wordpress.org/plugins/simple-2fa/)
+ - [`wordpress-seo`](https://github.com/Yoast/wordpress-seo)
+ - [`floating-share-button`](https://github.com/qriouslad/floating-share-button)
+- WoltLab Suite
+ - [two-step-verification](http://pluginstore.woltlab.com/file/3007-two-step-verification/)
- [Appwrite](https://github.com/appwrite/appwrite)
+- [Cachet](https://github.com/CachetHQ/Cachet)
+- [twill](https://github.com/area17/twill)
- other uses: [dependents](https://github.com/chillerlan/php-qrcode/network/dependents) / [packages](https://github.com/chillerlan/php-qrcode/network/dependents?dependent_type=PACKAGE)
-
+## Shameless advertising
Hi, please check out my other projects that are way cooler than qrcodes!
- [php-oauth-core](https://github.com/chillerlan/php-oauth-core) - an OAuth 1/2 client library along with a bunch of [providers](https://github.com/chillerlan/php-oauth-providers)
- [php-httpinterface](https://github.com/chillerlan/php-httpinterface) - a PSR-7/15/17/18 implemetation
- [php-database](https://github.com/chillerlan/php-database) - a database client & querybuilder for MySQL, Postgres, SQLite, MSSQL, Firebird
+## Disclaimer!
+I don't take responsibility for molten CPUs, misled applications, failed log-ins etc.. Use at your own risk!
+
+### Trademark Notice
+
+The word "QR Code" is a registered trademark of *DENSO WAVE INCORPORATED*<br>
+https://www.qrcode.com/en/faq.html#patentH2Title
diff --git a/vendor/chillerlan/php-qrcode/composer.json b/vendor/chillerlan/php-qrcode/composer.json
index 625149ce7..afe5bf68e 100644
--- a/vendor/chillerlan/php-qrcode/composer.json
+++ b/vendor/chillerlan/php-qrcode/composer.json
@@ -1,6 +1,6 @@
{
"name": "chillerlan/php-qrcode",
- "description": "A QR code generator. PHP 7.2+",
+ "description": "A QR code generator. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-qrcode",
"license": "MIT",
"minimum-stability": "stable",
@@ -24,13 +24,13 @@
}
],
"require": {
- "php": "^7.2 || ^8.0",
+ "php": "^7.4 || ^8.0",
"ext-mbstring": "*",
- "chillerlan/php-settings-container": "^1.2.2"
+ "chillerlan/php-settings-container": "^2.1.4"
},
"require-dev": {
- "phpunit/phpunit": "^8.5",
- "phan/phan": "^3.2.2",
+ "phpunit/phpunit": "^9.5",
+ "phan/phan": "^5.3",
"setasign/fpdf": "^1.8.2"
},
"suggest": {
@@ -48,5 +48,14 @@
"chillerlan\\QRCodeTest\\": "tests/",
"chillerlan\\QRCodeExamples\\": "examples/"
}
+ },
+ "scripts": {
+ "phpunit": "@php vendor/bin/phpunit",
+ "phan": "@php vendor/bin/phan"
+ },
+ "config": {
+ "lock": false,
+ "sort-packages": true,
+ "platform-check": true
}
}
diff --git a/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php b/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php
index 3c01f8646..3664989b8 100644
--- a/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php
+++ b/vendor/chillerlan/php-qrcode/examples/MyCustomOutput.php
@@ -28,6 +28,8 @@ class MyCustomOutput extends QROutputAbstract{
for($col = 0; $col < $this->moduleCount; $col++){
$output .= (int)$this->matrix->check($col, $row);
}
+
+ $output .= \PHP_EOL;
}
return $output;
diff --git a/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php b/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php
index 5ca572f30..fe6b962a9 100644
--- a/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php
+++ b/vendor/chillerlan/php-qrcode/examples/QRImageWithText.php
@@ -19,6 +19,7 @@
namespace chillerlan\QRCodeExamples;
use chillerlan\QRCode\Output\QRImage;
+
use function base64_encode, imagechar, imagecolorallocate, imagecolortransparent, imagecopymerge, imagecreatetruecolor,
imagedestroy, imagefilledrectangle, imagefontwidth, in_array, round, str_split, strlen;
@@ -31,29 +32,24 @@ class QRImageWithText extends QRImage{
* @return string
*/
public function dump(string $file = null, string $text = null):string{
- $this->image = imagecreatetruecolor($this->length, $this->length);
- $background = imagecolorallocate($this->image, ...$this->options->imageTransparencyBG);
-
- if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
- imagecolortransparent($this->image, $background);
- }
+ // set returnResource to true to skip further processing for now
+ $this->options->returnResource = true;
- imagefilledrectangle($this->image, 0, 0, $this->length, $this->length, $background);
-
- foreach($this->matrix->matrix() as $y => $row){
- foreach($row as $x => $M_TYPE){
- $this->setPixel($x, $y, $this->moduleValues[$M_TYPE]);
- }
- }
+ // there's no need to save the result of dump() into $this->image here
+ parent::dump($file);
// render text output if a string is given
if($text !== null){
$this->addText($text);
}
- $imageData = $this->dumpImage($file);
+ $imageData = $this->dumpImage();
+
+ if($file !== null){
+ $this->saveToFile($imageData, $file);
+ }
- if((bool)$this->options->imageBase64){
+ if($this->options->imageBase64){
$imageData = 'data:image/'.$this->options->outputType.';base64,'.base64_encode($imageData);
}
@@ -80,7 +76,7 @@ class QRImageWithText extends QRImage{
$background = imagecolorallocate($this->image, ...$textBG);
// allow transparency
- if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
+ if($this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
imagecolortransparent($this->image, $background);
}
@@ -97,7 +93,7 @@ class QRImageWithText extends QRImage{
// loop through the string and draw the letters
foreach(str_split($text) as $i => $chr){
- imagechar($this->image, $textSize, $i * $w + $x, $this->length, $chr, $fontColor);
+ imagechar($this->image, $textSize, (int)($i * $w + $x), $this->length, $chr, $fontColor);
}
}
diff --git a/vendor/chillerlan/php-qrcode/examples/image.php b/vendor/chillerlan/php-qrcode/examples/image.php
index 89ba2a9a8..54426c68a 100644
--- a/vendor/chillerlan/php-qrcode/examples/image.php
+++ b/vendor/chillerlan/php-qrcode/examples/image.php
@@ -17,15 +17,16 @@ require_once __DIR__.'/../vendor/autoload.php';
$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
$options = new QROptions([
- 'version' => 7,
+ 'version' => 10,
'outputType' => QRCode::OUTPUT_IMAGE_PNG,
- 'eccLevel' => QRCode::ECC_L,
+ 'eccLevel' => QRCode::ECC_H,
'scale' => 5,
'imageBase64' => false,
'moduleValues' => [
// finder
1536 => [0, 63, 255], // dark (true)
6 => [255, 255, 255], // light (false), white is the transparency color and is enabled by default
+ 5632 => [241, 28, 163], // finder dot, dark (true)
// alignment
2560 => [255, 0, 255],
10 => [255, 255, 255],
@@ -33,7 +34,7 @@ $options = new QROptions([
3072 => [255, 0, 0],
12 => [255, 255, 255],
// format
- 3584 => [67, 191, 84],
+ 3584 => [67, 99, 84],
14 => [255, 255, 255],
// version
4096 => [62, 174, 190],
@@ -47,6 +48,8 @@ $options = new QROptions([
8 => [255, 255, 255],
// quietzone
18 => [255, 255, 255],
+ // logo (requires a call to QRMatrix::setLogoSpace())
+ 20 => [255, 255, 255],
],
]);
diff --git a/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php b/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php
index 36f63d503..f93aa8dd1 100644
--- a/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php
+++ b/vendor/chillerlan/php-qrcode/examples/imageWithLogo.php
@@ -23,8 +23,8 @@ $data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s';
*/
class LogoOptions extends QROptions{
// size in QR modules, multiply with QROptions::$scale for pixel size
- protected $logoSpaceWidth;
- protected $logoSpaceHeight;
+ protected int $logoSpaceWidth;
+ protected int $logoSpaceHeight;
}
$options = new LogoOptions;
diff --git a/vendor/chillerlan/php-qrcode/examples/svg.php b/vendor/chillerlan/php-qrcode/examples/svg.php
index a7a159d70..d171cbe07 100644
--- a/vendor/chillerlan/php-qrcode/examples/svg.php
+++ b/vendor/chillerlan/php-qrcode/examples/svg.php
@@ -20,6 +20,7 @@ $gzip = true;
$options = new QROptions([
'version' => 7,
'outputType' => QRCode::OUTPUT_MARKUP_SVG,
+ 'imageBase64' => false,
'eccLevel' => QRCode::ECC_L,
'svgViewBoxSize' => 530,
'addQuietzone' => true,
diff --git a/vendor/chillerlan/php-qrcode/phpdoc.xml b/vendor/chillerlan/php-qrcode/phpdoc.xml
index d191e98ee..d440f1d8a 100644
--- a/vendor/chillerlan/php-qrcode/phpdoc.xml
+++ b/vendor/chillerlan/php-qrcode/phpdoc.xml
@@ -1,15 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<phpdoc>
<parser>
- <target>public/docs</target>
+ <target>docs</target>
+ <encoding>utf8</encoding>
+ <markers>
+ <item>TODO</item>
+ </markers>
</parser>
<transformer>
- <target>public/docs</target>
+ <target>docs</target>
</transformer>
<files>
<directory>src</directory>
+ <directory>tests</directory>
</files>
<transformations>
<template name="responsive-twig"/>
</transformations>
-</phpdoc> \ No newline at end of file
+</phpdoc>
diff --git a/vendor/chillerlan/php-qrcode/phpmd.xml b/vendor/chillerlan/php-qrcode/phpmd.xml
deleted file mode 100644
index a70f7e3a1..000000000
--- a/vendor/chillerlan/php-qrcode/phpmd.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<ruleset name="codemasher/php-qrcode PMD ruleset"
- xmlns="http://pmd.sf.net/ruleset/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
- xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
- <description>codemasher/php-qrcode PMD ruleset</description>
- <exclude-pattern>*/examples/*</exclude-pattern>
- <exclude-pattern>*/tests/*</exclude-pattern>
- <rule ref="rulesets/cleancode.xml">
- <exclude name="BooleanArgumentFlag"/>
- </rule>
- <rule ref="rulesets/codesize.xml/CyclomaticComplexity">
- <priority>1</priority>
- <properties>
- <property name="maximum" value="200" />
- </properties>
- </rule>
- <rule ref="rulesets/controversial.xml">
- <exclude name="CamelCaseMethodName"/>
- <exclude name="CamelCasePropertyName"/>
- <exclude name="CamelCaseParameterName"/>
- <exclude name="CamelCaseVariableName"/>
- </rule>
- <rule ref="rulesets/design.xml">
- </rule>
- <rule ref="rulesets/naming.xml">
- <exclude name="LongVariable"/>
- <exclude name="ShortVariable"/>
- </rule>
- <rule ref="rulesets/unusedcode.xml">
- <exclude name="UnusedFormalParameter"/>
- </rule>
-</ruleset>
diff --git a/vendor/chillerlan/php-qrcode/phpunit.xml b/vendor/chillerlan/php-qrcode/phpunit.xml
index 3a9b678d2..1fea31626 100644
--- a/vendor/chillerlan/php-qrcode/phpunit.xml
+++ b/vendor/chillerlan/php-qrcode/phpunit.xml
@@ -1,23 +1,26 @@
+<?xml version="1.0"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
bootstrap="vendor/autoload.php"
cacheResultFile=".build/phpunit.result.cache"
colors="true"
verbose="true"
>
- <filter>
- <whitelist processUncoveredFilesFromWhitelist="true">
+ <coverage processUncoveredFiles="true">
+ <include>
<directory suffix=".php">./src</directory>
- </whitelist>
- </filter>
+ </include>
+ <report>
+ <clover outputFile=".build/coverage/clover.xml"/>
+ <xml outputDirectory=".build/coverage/coverage-xml"/>
+ </report>
+ </coverage>
<testsuites>
<testsuite name="php-qrcode test suite">
<directory suffix=".php">./tests/</directory>
</testsuite>
</testsuites>
<logging>
- <log type="coverage-clover" target=".build/coverage/clover.xml"/>
- <log type="coverage-xml" target=".build/coverage/coverage-xml"/>
- <log type="junit" target=".build/logs/junit.xml"/>
+ <junit outputFile=".build/logs/junit.xml"/>
</logging>
</phpunit>
diff --git a/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php b/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php
index c6d34e76f..28d9d7563 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/AlphaNum.php
@@ -14,22 +14,19 @@ namespace chillerlan\QRCode\Data;
use chillerlan\QRCode\QRCode;
-use function array_search, ord, sprintf;
+use function ord, sprintf;
/**
* Alphanumeric mode: 0 to 9, A to Z, space, $ % * + - . / :
+ *
+ * ISO/IEC 18004:2000 Section 8.3.3
+ * ISO/IEC 18004:2000 Section 8.4.3
*/
-class AlphaNum extends QRDataAbstract{
+final class AlphaNum extends QRDataAbstract{
- /**
- * @inheritdoc
- */
- protected $datamode = QRCode::DATA_ALPHANUM;
+ protected int $datamode = QRCode::DATA_ALPHANUM;
- /**
- * @inheritdoc
- */
- protected $lengthBits = [9, 11, 13];
+ protected array $lengthBits = [9, 11, 13];
/**
* @inheritdoc
@@ -47,19 +44,17 @@ class AlphaNum extends QRDataAbstract{
}
/**
- * @param string $chr
+ * get the code for the given character
*
- * @return int
- * @throws \chillerlan\QRCode\Data\QRCodeDataException
+ * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
*/
protected function getCharCode(string $chr):int{
- $i = array_search($chr, $this::ALPHANUM_CHAR_MAP);
- if($i !== false){
- return $i;
+ if(!isset($this::CHAR_MAP_ALPHANUM[$chr])){
+ throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $chr, ord($chr)));
}
- throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $chr, ord($chr)));
+ return $this::CHAR_MAP_ALPHANUM[$chr];
}
}
diff --git a/vendor/chillerlan/php-qrcode/src/Data/Byte.php b/vendor/chillerlan/php-qrcode/src/Data/Byte.php
index f1955645a..02e76a639 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/Byte.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/Byte.php
@@ -18,18 +18,15 @@ use function ord;
/**
* Byte mode, ISO-8859-1 or UTF-8
+ *
+ * ISO/IEC 18004:2000 Section 8.3.4
+ * ISO/IEC 18004:2000 Section 8.4.4
*/
-class Byte extends QRDataAbstract{
+final class Byte extends QRDataAbstract{
- /**
- * @inheritdoc
- */
- protected $datamode = QRCode::DATA_BYTE;
+ protected int $datamode = QRCode::DATA_BYTE;
- /**
- * @inheritdoc
- */
- protected $lengthBits = [8, 16, 16];
+ protected array $lengthBits = [8, 16, 16];
/**
* @inheritdoc
diff --git a/vendor/chillerlan/php-qrcode/src/Data/Kanji.php b/vendor/chillerlan/php-qrcode/src/Data/Kanji.php
index ce600d4ff..e106c50f1 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/Kanji.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/Kanji.php
@@ -18,18 +18,15 @@ use function mb_strlen, ord, sprintf, strlen;
/**
* Kanji mode: double-byte characters from the Shift JIS character set
+ *
+ * ISO/IEC 18004:2000 Section 8.3.5
+ * ISO/IEC 18004:2000 Section 8.4.5
*/
-class Kanji extends QRDataAbstract{
+final class Kanji extends QRDataAbstract{
- /**
- * @inheritdoc
- */
- protected $datamode = QRCode::DATA_KANJI;
+ protected int $datamode = QRCode::DATA_KANJI;
- /**
- * @inheritdoc
- */
- protected $lengthBits = [8, 10, 12];
+ protected array $lengthBits = [8, 10, 12];
/**
* @inheritdoc
@@ -40,6 +37,8 @@ class Kanji extends QRDataAbstract{
/**
* @inheritdoc
+ *
+ * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
*/
protected function write(string $data):void{
$len = strlen($data);
@@ -47,17 +46,17 @@ class Kanji extends QRDataAbstract{
for($i = 0; $i + 1 < $len; $i += 2){
$c = ((0xff & ord($data[$i])) << 8) | (0xff & ord($data[$i + 1]));
- if(0x8140 <= $c && $c <= 0x9FFC){
+ if($c >= 0x8140 && $c <= 0x9FFC){
$c -= 0x8140;
}
- elseif(0xE040 <= $c && $c <= 0xEBBF){
+ elseif($c >= 0xE040 && $c <= 0xEBBF){
$c -= 0xC140;
}
else{
throw new QRCodeDataException(sprintf('illegal char at %d [%d]', $i + 1, $c));
}
- $this->bitBuffer->put((($c >> 8) & 0xff) * 0xC0 + ($c & 0xff), 13);
+ $this->bitBuffer->put(((($c >> 8) & 0xff) * 0xC0) + ($c & 0xff), 13);
}
diff --git a/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php b/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php
index 8dfd24180..7874cb53d 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/MaskPatternTester.php
@@ -8,41 +8,51 @@
* @author Smiley <[email protected]>
* @copyright 2017 Smiley
* @license MIT
+ *
+ * @noinspection PhpUnused
*/
namespace chillerlan\QRCode\Data;
-use function abs, call_user_func_array;
+use function abs, array_search, call_user_func_array, min;
/**
- * The sole purpose of this class is to receive a QRMatrix object and run the pattern tests on it.
+ * Receives a QRDataInterface object and runs the mask pattern tests on it.
+ *
+ * ISO/IEC 18004:2000 Section 8.8.2 - Evaluation of masking results
*
- * @link http://www.thonky.com/qr-code-tutorial/data-masking
+ * @see http://www.thonky.com/qr-code-tutorial/data-masking
*/
-class MaskPatternTester{
-
- /**
- * @var \chillerlan\QRCode\Data\QRMatrix
- */
- protected $matrix;
+final class MaskPatternTester{
/**
- * @var int
+ * The data interface that contains the data matrix to test
*/
- protected $moduleCount;
+ protected QRDataInterface $dataInterface;
/**
- * Receives the matrix an sets the module count
+ * Receives the QRDataInterface
*
* @see \chillerlan\QRCode\QROptions::$maskPattern
* @see \chillerlan\QRCode\Data\QRMatrix::$maskPattern
- * @see \chillerlan\QRCode\QRCode::getBestMaskPattern()
+ */
+ public function __construct(QRDataInterface $dataInterface){
+ $this->dataInterface = $dataInterface;
+ }
+
+ /**
+ * shoves a QRMatrix through the MaskPatternTester to find the lowest penalty mask pattern
*
- * @param \chillerlan\QRCode\Data\QRMatrix $matrix
+ * @see \chillerlan\QRCode\Data\MaskPatternTester
*/
- public function __construct(QRMatrix $matrix){
- $this->matrix = $matrix;
- $this->moduleCount = $this->matrix->size();
+ public function getBestMaskPattern():int{
+ $penalties = [];
+
+ for($pattern = 0; $pattern < 8; $pattern++){
+ $penalties[$pattern] = $this->testPattern($pattern);
+ }
+
+ return array_search(min($penalties), $penalties, true);
}
/**
@@ -50,15 +60,13 @@ class MaskPatternTester{
*
* @see \chillerlan\QRCode\QROptions::$maskPattern
* @see \chillerlan\QRCode\Data\QRMatrix::$maskPattern
- * @see \chillerlan\QRCode\QRCode::getBestMaskPattern()
- *
- * @return int
*/
- public function testPattern():int{
- $penalty = 0;
+ public function testPattern(int $pattern):int{
+ $matrix = $this->dataInterface->initMatrix($pattern, true);
+ $penalty = 0;
for($level = 1; $level <= 4; $level++){
- $penalty += call_user_func_array([$this, 'testLevel'.$level], [$this->matrix->matrix(true)]);
+ $penalty += call_user_func_array([$this, 'testLevel'.$level], [$matrix->matrix(true), $matrix->size()]);
}
return (int)$penalty;
@@ -66,10 +74,8 @@ class MaskPatternTester{
/**
* Checks for each group of five or more same-colored modules in a row (or column)
- *
- * @return int
*/
- protected function testLevel1(array $m):int{
+ protected function testLevel1(array $m, int $size):int{
$penalty = 0;
foreach($m as $y => $row){
@@ -78,13 +84,13 @@ class MaskPatternTester{
for($ry = -1; $ry <= 1; $ry++){
- if($y + $ry < 0 || $this->moduleCount <= $y + $ry){
+ if($y + $ry < 0 || $size <= $y + $ry){
continue;
}
for($rx = -1; $rx <= 1; $rx++){
- if(($ry === 0 && $rx === 0) || (($x + $rx) < 0 || $this->moduleCount <= ($x + $rx))){
+ if(($ry === 0 && $rx === 0) || (($x + $rx) < 0 || $size <= ($x + $rx))){
continue;
}
@@ -107,21 +113,19 @@ class MaskPatternTester{
/**
* Checks for each 2x2 area of same-colored modules in the matrix
- *
- * @return int
*/
- protected function testLevel2(array $m):int{
+ protected function testLevel2(array $m, int $size):int{
$penalty = 0;
foreach($m as $y => $row){
- if($y > ($this->moduleCount - 2)){
+ if($y > $size - 2){
break;
}
foreach($row as $x => $val){
- if($x > ($this->moduleCount - 2)){
+ if($x > $size - 2){
break;
}
@@ -140,17 +144,15 @@ class MaskPatternTester{
/**
* Checks if there are patterns that look similar to the finder patterns (1:1:3:1:1 ratio)
- *
- * @return int
*/
- protected function testLevel3(array $m):int{
+ protected function testLevel3(array $m, int $size):int{
$penalties = 0;
foreach($m as $y => $row){
foreach($row as $x => $val){
if(
- ($x + 6) < $this->moduleCount
+ $x + 6 < $size
&& $val
&& !$m[$y][$x + 1]
&& $m[$y][$x + 2]
@@ -163,7 +165,7 @@ class MaskPatternTester{
}
if(
- ($y + 6) < $this->moduleCount
+ $y + 6 < $size
&& $val
&& !$m[$y + 1][$x]
&& $m[$y + 2][$x]
@@ -183,10 +185,8 @@ class MaskPatternTester{
/**
* Checks if more than half of the modules are dark or light, with a larger penalty for a larger difference
- *
- * @return float
*/
- protected function testLevel4(array $m):float{
+ protected function testLevel4(array $m, int $size):float{
$count = 0;
foreach($m as $y => $row){
@@ -197,7 +197,7 @@ class MaskPatternTester{
}
}
- return (abs(100 * $count / $this->moduleCount / $this->moduleCount - 50) / 5) * 10;
+ return (abs(100 * $count / $size / $size - 50) / 5) * 10;
}
}
diff --git a/vendor/chillerlan/php-qrcode/src/Data/Number.php b/vendor/chillerlan/php-qrcode/src/Data/Number.php
index 3936d12c3..0a905b13e 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/Number.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/Number.php
@@ -4,7 +4,7 @@
*
* @filesource Number.php
* @created 26.11.2015
- * @package QRCode
+ * @package chillerlan\QRCode\Data
* @author Smiley <[email protected]>
* @copyright 2015 Smiley
* @license MIT
@@ -14,22 +14,19 @@ namespace chillerlan\QRCode\Data;
use chillerlan\QRCode\QRCode;
-use function ord, sprintf, substr;
+use function ord, sprintf, str_split, substr;
/**
- * Numeric mode: decimal digits 0 through 9
+ * Numeric mode: decimal digits 0 to 9
+ *
+ * ISO/IEC 18004:2000 Section 8.3.2
+ * ISO/IEC 18004:2000 Section 8.4.2
*/
-class Number extends QRDataAbstract{
+final class Number extends QRDataAbstract{
- /**
- * @inheritdoc
- */
- protected $datamode = QRCode::DATA_NUMBER;
+ protected int $datamode = QRCode::DATA_NUMBER;
- /**
- * @inheritdoc
- */
- protected $lengthBits = [10, 12, 14];
+ protected array $lengthBits = [10, 12, 14];
/**
* @inheritdoc
@@ -56,20 +53,18 @@ class Number extends QRDataAbstract{
}
/**
- * @param string $string
+ * get the code for the given numeric string
*
- * @return int
- * @throws \chillerlan\QRCode\Data\QRCodeDataException
+ * @throws \chillerlan\QRCode\Data\QRCodeDataException on an illegal character occurence
*/
protected function parseInt(string $string):int{
$num = 0;
- $len = strlen($string);
- for($i = 0; $i < $len; $i++){
- $c = ord($string[$i]);
+ foreach(str_split($string) as $chr){
+ $c = ord($chr);
- if(!in_array($string[$i], $this::NUMBER_CHAR_MAP, true)){
- throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $string[$i], $c));
+ if(!isset($this::CHAR_MAP_NUMBER[$chr])){
+ throw new QRCodeDataException(sprintf('illegal char: "%s" [%d]', $chr, $c));
}
$c = $c - 48; // ord('0')
diff --git a/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php b/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php
index f52767e38..72b67b7b9 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/QRDataAbstract.php
@@ -12,7 +12,7 @@
namespace chillerlan\QRCode\Data;
-use chillerlan\QRCode\{QRCode, QRCodeException};
+use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\Helpers\{BitBuffer, Polynomial};
use chillerlan\Settings\SettingsContainerInterface;
@@ -25,68 +25,50 @@ abstract class QRDataAbstract implements QRDataInterface{
/**
* the string byte count
- *
- * @var int
*/
- protected $strlen;
+ protected ?int $strlen = null;
/**
* the current data mode: Num, Alphanum, Kanji, Byte
- *
- * @var int
*/
- protected $datamode;
+ protected int $datamode;
/**
* mode length bits for the version breakpoints 1-9, 10-26 and 27-40
*
- * @var array
+ * ISO/IEC 18004:2000 Table 3 - Number of bits in Character Count Indicator
*/
- protected $lengthBits = [0, 0, 0];
+ protected array $lengthBits = [0, 0, 0];
/**
* current QR Code version
- *
- * @var int
*/
- protected $version;
-
- /**
- * the raw data that's being passed to QRMatrix::mapData()
- *
- * @var array
- */
- protected $matrixdata;
+ protected int $version;
/**
* ECC temp data
- *
- * @var array
*/
- protected $ecdata;
+ protected array $ecdata;
/**
* ECC temp data
- *
- * @var array
*/
- protected $dcdata;
+ protected array $dcdata;
/**
- * @var \chillerlan\QRCode\QROptions
+ * the options instance
+ *
+ * @var \chillerlan\Settings\SettingsContainerInterface|\chillerlan\QRCode\QROptions
*/
- protected $options;
+ protected SettingsContainerInterface $options;
/**
- * @var \chillerlan\QRCode\Helpers\BitBuffer
+ * a BitBuffer instance
*/
- protected $bitBuffer;
+ protected BitBuffer $bitBuffer;
/**
* QRDataInterface constructor.
- *
- * @param \chillerlan\Settings\SettingsContainerInterface $options
- * @param string|null $data
*/
public function __construct(SettingsContainerInterface $options, string $data = null){
$this->options = $options;
@@ -110,10 +92,7 @@ abstract class QRDataAbstract implements QRDataInterface{
? $this->getMinimumVersion()
: $this->options->version;
- $this->matrixdata = $this
- ->writeBitBuffer($data)
- ->maskECC()
- ;
+ $this->writeBitBuffer($data);
return $this;
}
@@ -123,21 +102,14 @@ abstract class QRDataAbstract implements QRDataInterface{
*/
public function initMatrix(int $maskPattern, bool $test = null):QRMatrix{
return (new QRMatrix($this->version, $this->options->eccLevel))
- ->setFinderPattern()
- ->setSeparators()
- ->setAlignmentPattern()
- ->setTimingPattern()
- ->setVersionNumber($test)
- ->setFormatInfo($maskPattern, $test)
- ->setDarkModule()
- ->mapData($this->matrixdata, $maskPattern)
+ ->init($maskPattern, $test)
+ ->mapData($this->maskECC(), $maskPattern)
;
}
/**
* returns the length bits for the version breakpoints 1-9, 10-26 and 27-40
*
- * @return int
* @throws \chillerlan\QRCode\Data\QRCodeDataException
* @codeCoverageIgnore
*/
@@ -154,10 +126,6 @@ abstract class QRDataAbstract implements QRDataInterface{
/**
* returns the byte count of the $data string
- *
- * @param string $data
- *
- * @return int
*/
protected function getLength(string $data):int{
return strlen($data);
@@ -166,15 +134,17 @@ abstract class QRDataAbstract implements QRDataInterface{
/**
* returns the minimum version number for the given string
*
- * @return int
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
protected function getMinimumVersion():int{
$maxlength = 0;
// guess the version number within the given range
+ $dataMode = QRCode::DATA_MODES[$this->datamode];
+ $eccMode = QRCode::ECC_MODES[$this->options->eccLevel];
+
foreach(range($this->options->versionMin, $this->options->versionMax) as $version){
- $maxlength = $this::MAX_LENGTH[$version][QRCode::DATA_MODES[$this->datamode]][QRCode::ECC_MODES[$this->options->eccLevel]];
+ $maxlength = $this::MAX_LENGTH[$version][$dataMode][$eccMode];
if($this->strlen <= $maxlength){
return $version;
@@ -188,81 +158,72 @@ abstract class QRDataAbstract implements QRDataInterface{
* writes the actual data string to the BitBuffer
*
* @see \chillerlan\QRCode\Data\QRDataAbstract::writeBitBuffer()
- *
- * @param string $data
- *
- * @return void
*/
abstract protected function write(string $data):void;
/**
* creates a BitBuffer and writes the string data to it
*
- * @param string $data
- *
- * @return \chillerlan\QRCode\Data\QRDataAbstract
- * @throws \chillerlan\QRCode\QRCodeException
+ * @throws \chillerlan\QRCode\QRCodeException on data overflow
*/
- protected function writeBitBuffer(string $data):QRDataInterface{
+ protected function writeBitBuffer(string $data):void{
$this->bitBuffer = new BitBuffer;
$MAX_BITS = $this::MAX_BITS[$this->version][QRCode::ECC_MODES[$this->options->eccLevel]];
$this->bitBuffer
- ->clear()
->put($this->datamode, 4)
->put($this->strlen, $this->getLengthBits())
;
$this->write($data);
- // there was an error writing the BitBuffer data, which is... unlikely.
- if($this->bitBuffer->length > $MAX_BITS){
- throw new QRCodeException(sprintf('code length overflow. (%d > %d bit)', $this->bitBuffer->length, $MAX_BITS)); // @codeCoverageIgnore
+ // overflow, likely caused due to invalid version setting
+ if($this->bitBuffer->getLength() > $MAX_BITS){
+ throw new QRCodeDataException(sprintf('code length overflow. (%d > %d bit)', $this->bitBuffer->getLength(), $MAX_BITS));
}
- // end code.
- if($this->bitBuffer->length + 4 <= $MAX_BITS){
+ // add terminator (ISO/IEC 18004:2000 Table 2)
+ if($this->bitBuffer->getLength() + 4 <= $MAX_BITS){
$this->bitBuffer->put(0, 4);
}
// padding
- while($this->bitBuffer->length % 8 !== 0){
+ while($this->bitBuffer->getLength() % 8 !== 0){
$this->bitBuffer->putBit(false);
}
// padding
while(true){
- if($this->bitBuffer->length >= $MAX_BITS){
+ if($this->bitBuffer->getLength() >= $MAX_BITS){
break;
}
$this->bitBuffer->put(0xEC, 8);
- if($this->bitBuffer->length >= $MAX_BITS){
+ if($this->bitBuffer->getLength() >= $MAX_BITS){
break;
}
$this->bitBuffer->put(0x11, 8);
}
- return $this;
}
/**
* ECC masking
*
- * @link http://www.thonky.com/qr-code-tutorial/error-correction-coding
+ * ISO/IEC 18004:2000 Section 8.5 ff
*
- * @return array
+ * @see http://www.thonky.com/qr-code-tutorial/error-correction-coding
*/
protected function maskECC():array{
[$l1, $l2, $b1, $b2] = $this::RSBLOCKS[$this->version][QRCode::ECC_MODES[$this->options->eccLevel]];
$rsBlocks = array_fill(0, $l1, [$b1, $b2]);
$rsCount = $l1 + $l2;
- $this->ecdata = array_fill(0, $rsCount, null);
+ $this->ecdata = array_fill(0, $rsCount, []);
$this->dcdata = $this->ecdata;
if($l2 > 0){
@@ -274,6 +235,8 @@ abstract class QRDataAbstract implements QRDataInterface{
$maxEcCount = 0;
$offset = 0;
+ $bitBuffer = $this->bitBuffer->getBuffer();
+
foreach($rsBlocks as $key => $block){
[$rsBlockTotal, $dcCount] = $block;
@@ -283,12 +246,12 @@ abstract class QRDataAbstract implements QRDataInterface{
$this->dcdata[$key] = array_fill(0, $dcCount, null);
foreach($this->dcdata[$key] as $a => $_z){
- $this->dcdata[$key][$a] = 0xff & $this->bitBuffer->buffer[$a + $offset];
+ $this->dcdata[$key][$a] = 0xff & $bitBuffer[$a + $offset];
}
[$num, $add] = $this->poly($key, $ecCount);
- foreach($this->ecdata[$key] as $c => $_z){
+ foreach($this->ecdata[$key] as $c => $_){
$modIndex = $c + $add;
$this->ecdata[$key][$c] = $modIndex >= 0 ? $num[$modIndex] : 0;
}
@@ -300,7 +263,7 @@ abstract class QRDataAbstract implements QRDataInterface{
$data = array_fill(0, $totalCodeCount, null);
$index = 0;
- $mask = function($arr, $count) use (&$data, &$index, $rsCount){
+ $mask = function(array $arr, int $count) use (&$data, &$index, $rsCount):void{
for($x = 0; $x < $count; $x++){
for($y = 0; $y < $rsCount; $y++){
if($x < count($arr[$y])){
@@ -318,10 +281,7 @@ abstract class QRDataAbstract implements QRDataInterface{
}
/**
- * @param int $key
- * @param int $count
- *
- * @return int[]
+ * helper method for the polynomial operations
*/
protected function poly(int $key, int $count):array{
$rsPoly = new Polynomial;
diff --git a/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php b/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php
index 653386222..93ad6221d 100644
--- a/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/QRDataInterface.php
@@ -13,23 +13,38 @@
namespace chillerlan\QRCode\Data;
/**
- *
+ * Specifies the methods reqired for the data modules (Number, Alphanum, Byte and Kanji)
+ * and holds version information in several constants
*/
interface QRDataInterface{
- const NUMBER_CHAR_MAP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
+ /**
+ * @var int[]
+ */
+ const CHAR_MAP_NUMBER = [
+ '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9,
+ ];
- const ALPHANUM_CHAR_MAP = [
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
- 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
- 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*',
- '+', '-', '.', '/', ':',
+ /**
+ * ISO/IEC 18004:2000 Table 5
+ *
+ * @var int[]
+ */
+ const CHAR_MAP_ALPHANUM = [
+ '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7,
+ '8' => 8, '9' => 9, 'A' => 10, 'B' => 11, 'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15,
+ 'G' => 16, 'H' => 17, 'I' => 18, 'J' => 19, 'K' => 20, 'L' => 21, 'M' => 22, 'N' => 23,
+ 'O' => 24, 'P' => 25, 'Q' => 26, 'R' => 27, 'S' => 28, 'T' => 29, 'U' => 30, 'V' => 31,
+ 'W' => 32, 'X' => 33, 'Y' => 34, 'Z' => 35, ' ' => 36, '$' => 37, '%' => 38, '*' => 39,
+ '+' => 40, '-' => 41, '.' => 42, '/' => 43, ':' => 44,
];
/**
- * @link http://www.qrcode.com/en/about/version.html
+ * ISO/IEC 18004:2000 Tables 7-11 - Number of symbol characters and input data capacity for versions 1 to 40
+ *
+ * @see http://www.qrcode.com/en/about/version.html
+ *
+ * @var int [][][]
*/
const MAX_LENGTH =[
// v => [NUMERIC => [L, M, Q, H ], ALPHANUM => [L, M, Q, H], BINARY => [L, M, Q, H ], KANJI => [L, M, Q, H ]] // modules
@@ -75,6 +90,11 @@ interface QRDataInterface{
40 => [[7089, 5596, 3993, 3057], [4296, 3391, 2420, 1852], [2953, 2331, 1663, 1273], [1817, 1435, 1024, 784]], // 177
];
+ /**
+ * ISO/IEC 18004:2000 Tables 7-11 - Number of symbol characters and input data capacity for versions 1 to 40
+ *
+ * @var int [][]
+ */
const MAX_BITS = [
// version => [L, M, Q, H ]
1 => [ 152, 128, 104, 72],
@@ -120,7 +140,9 @@ interface QRDataInterface{
];
/**
- * @link http://www.thonky.com/qr-code-tutorial/error-correction-table
+ * @see http://www.thonky.com/qr-code-tutorial/error-correction-table
+ *
+ * @var int [][][]
*/
const RSBLOCKS = [
1 => [[ 1, 0, 26, 19], [ 1, 0, 26, 16], [ 1, 0, 26, 13], [ 1, 0, 26, 9]],
@@ -167,20 +189,11 @@ interface QRDataInterface{
/**
* Sets the data string (internally called by the constructor)
- *
- * @param string $data
- *
- * @return \chillerlan\QRCode\Data\QRDataInterface
*/
public function setData(string $data):QRDataInterface;
/**
* returns a fresh matrix object with the data written for the given $maskPattern
- *
- * @param int $maskPattern
- * @param bool|null $test
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
*/
public function initMatrix(int $maskPattern, bool $test = null):QRMatrix;
diff --git a/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php b/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php
index 5b4487a40..05c8b9069 100644..100755
--- a/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php
+++ b/vendor/chillerlan/php-qrcode/src/Data/QRMatrix.php
@@ -18,29 +18,46 @@ use Closure;
use function array_fill, array_key_exists, array_push, array_unshift, count, floor, in_array, max, min, range;
/**
- * @link http://www.thonky.com/qr-code-tutorial/format-version-information
+ * Holds a numerical representation of the final QR Code;
+ * maps the ECC coded binary data and applies the mask pattern
+ *
+ * @see http://www.thonky.com/qr-code-tutorial/format-version-information
*/
-class QRMatrix{
+final class QRMatrix{
+ /** @var int */
public const M_NULL = 0x00;
+ /** @var int */
public const M_DARKMODULE = 0x02;
+ /** @var int */
public const M_DATA = 0x04;
+ /** @var int */
public const M_FINDER = 0x06;
+ /** @var int */
public const M_SEPARATOR = 0x08;
+ /** @var int */
public const M_ALIGNMENT = 0x0a;
+ /** @var int */
public const M_TIMING = 0x0c;
+ /** @var int */
public const M_FORMAT = 0x0e;
+ /** @var int */
public const M_VERSION = 0x10;
+ /** @var int */
public const M_QUIETZONE = 0x12;
+ /** @var int */
public const M_LOGO = 0x14;
+ /** @var int */
public const M_FINDER_DOT = 0x16;
-
+ /** @var int */
public const M_TEST = 0xff;
/**
- * @link http://www.thonky.com/qr-code-tutorial/alignment-pattern-locations
+ * ISO/IEC 18004:2000 Annex E, Table E.1 - Row/column coordinates of center module of Alignment Patterns
+ *
+ * version -> pattern
*
- * version -> pattern
+ * @var int[][]
*/
protected const alignmentPattern = [
1 => [],
@@ -86,9 +103,11 @@ class QRMatrix{
];
/**
- * @link http://www.thonky.com/qr-code-tutorial/format-version-tables
+ * ISO/IEC 18004:2000 Annex D, Table D.1 - Version information bit stream for each version
*
* no version pattern for QR Codes < 7
+ *
+ * @var int[]
*/
protected const versionPattern = [
7 => 0b000111110010010100,
@@ -127,7 +146,13 @@ class QRMatrix{
40 => 0b101000110001101001,
];
- // ECC level -> mask pattern
+ /**
+ * ISO/IEC 18004:2000 Section 8.9 - Format Information
+ *
+ * ECC level -> mask pattern
+ *
+ * @var int[][]
+ */
protected const formatPattern = [
[ // L
0b111011111000100,
@@ -172,36 +197,35 @@ class QRMatrix{
];
/**
- * @var int
+ * the current QR Code version number
*/
- protected $version;
+ protected int $version;
/**
- * @var int
+ * the current ECC level
*/
- protected $eclevel;
+ protected int $eclevel;
/**
- * @var int
+ * the used mask pattern, set via QRMatrix::mapData()
*/
- protected $maskPattern = QRCode::MASK_PATTERN_AUTO;
+ protected int $maskPattern = QRCode::MASK_PATTERN_AUTO;
/**
- * @var int
+ * the size (side length) of the matrix
*/
- protected $moduleCount;
+ protected int $moduleCount;
/**
- * @var mixed[]
+ * the actual matrix data array
+ *
+ * @var int[][]
*/
- protected $matrix;
+ protected array $matrix;
/**
* QRMatrix constructor.
*
- * @param int $version
- * @param int $eclevel
- *
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
public function __construct(int $version, int $eclevel){
@@ -221,6 +245,21 @@ class QRMatrix{
}
/**
+ * shortcut to initialize the matrix
+ */
+ public function init(int $maskPattern, bool $test = null):QRMatrix{
+ return $this
+ ->setFinderPattern()
+ ->setSeparators()
+ ->setAlignmentPattern()
+ ->setTimingPattern()
+ ->setVersionNumber($test)
+ ->setFormatInfo($maskPattern, $test)
+ ->setDarkModule()
+ ;
+ }
+
+ /**
* Returns the data matrix, returns a pure boolean representation if $boolean is set to true
*
* @return int[][]|bool[][]
@@ -245,21 +284,21 @@ class QRMatrix{
}
/**
- * @return int
+ * Returns the current version number
*/
public function version():int{
return $this->version;
}
/**
- * @return int
+ * Returns the current ECC level
*/
public function eccLevel():int{
return $this->eclevel;
}
/**
- * @return int
+ * Returns the current mask pattern
*/
public function maskPattern():int{
return $this->maskPattern;
@@ -269,8 +308,6 @@ class QRMatrix{
* Returns the absoulute size of the matrix, including quiet zone (after setting it).
*
* size = version * 4 + 17 [ + 2 * quietzone size]
- *
- * @return int
*/
public function size():int{
return $this->moduleCount;
@@ -278,11 +315,6 @@ class QRMatrix{
/**
* Returns the value of the module at position [$x, $y]
- *
- * @param int $x
- * @param int $y
- *
- * @return int
*/
public function get(int $x, int $y):int{
return $this->matrix[$y][$x];
@@ -293,13 +325,6 @@ class QRMatrix{
*
* true => $M_TYPE << 8
* false => $M_TYPE
- *
- * @param int $x
- * @param int $y
- * @param int $M_TYPE
- * @param bool $value
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
*/
public function set(int $x, int $y, bool $value, int $M_TYPE):QRMatrix{
$this->matrix[$y][$x] = $M_TYPE << ($value ? 8 : 0);
@@ -315,21 +340,14 @@ class QRMatrix{
*
* false => $value === $M_TYPE
* $value >> 8 === 0
- *
- * @param int $x
- * @param int $y
- *
- * @return bool
*/
public function check(int $x, int $y):bool{
- return $this->matrix[$y][$x] >> 8 > 0;
+ return ($this->matrix[$y][$x] >> 8) > 0;
}
/**
* Sets the "dark module", that is always on the same position 1x1px away from the bottom left finder
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
*/
public function setDarkModule():QRMatrix{
$this->set(8, 4 * $this->version + 9, true, $this::M_DARKMODULE);
@@ -340,7 +358,7 @@ class QRMatrix{
/**
* Draws the 7x7 finder patterns in the corners top left/right and bottom left
*
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 7.3.2
*/
public function setFinderPattern():QRMatrix{
@@ -375,7 +393,7 @@ class QRMatrix{
/**
* Draws the separator lines around the finder patterns
*
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 7.3.3
*/
public function setSeparators():QRMatrix{
@@ -405,7 +423,7 @@ class QRMatrix{
/**
* Draws the 5x5 alignment patterns
*
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 7.3.5
*/
public function setAlignmentPattern():QRMatrix{
@@ -435,7 +453,7 @@ class QRMatrix{
/**
* Draws the timing pattern (h/v checkered line between the finder patterns)
*
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 7.3.4
*/
public function setTimingPattern():QRMatrix{
@@ -457,9 +475,7 @@ class QRMatrix{
/**
* Draws the version information, 2x 3x6 pixel
*
- * @param bool|null $test
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 8.10
*/
public function setVersionNumber(bool $test = null):QRMatrix{
$bits = $this::versionPattern[$this->version] ?? false;
@@ -483,10 +499,7 @@ class QRMatrix{
/**
* Draws the format info along the finder patterns
*
- * @param int $maskPattern
- * @param bool|null $test
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
+ * ISO/IEC 18004:2000 Section 8.9
*/
public function setFormatInfo(int $maskPattern, bool $test = null):QRMatrix{
$bits = $this::formatPattern[QRCode::ECC_MODES[$this->eclevel]][$maskPattern] ?? 0;
@@ -524,9 +537,8 @@ class QRMatrix{
/**
* Draws the "quiet zone" of $size around the matrix
*
- * @param int|null $size
+ * ISO/IEC 18004:2000 Section 7.3.7
*
- * @return \chillerlan\QRCode\Data\QRMatrix
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
public function setQuietZone(int $size = null):QRMatrix{
@@ -574,18 +586,12 @@ class QRMatrix{
*
* @link https://github.com/chillerlan/php-qrcode/issues/52
*
- * @param int $width
- * @param int $height
- * @param int|null $startX
- * @param int|null $startY
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
public function setLogoSpace(int $width, int $height, int $startX = null, int $startY = null):QRMatrix{
// for logos we operate in ECC H (30%) only
- if($this->eclevel !== 0b10){
+ if($this->eclevel !== QRCode::ECC_H){
throw new QRCodeDataException('ECC level "H" required to add logo space');
}
@@ -635,7 +641,8 @@ class QRMatrix{
}
/**
- * Maps the binary $data array from QRDataInterface::maskECC() on the matrix, using $maskPattern
+ * Maps the binary $data array from QRDataInterface::maskECC() on the matrix,
+ * masking the data using $maskPattern (ISO/IEC 18004:2000 Section 8.8)
*
* @see \chillerlan\QRCode\Data\QRDataAbstract::maskECC()
*
@@ -647,10 +654,13 @@ class QRMatrix{
public function mapData(array $data, int $maskPattern):QRMatrix{
$this->maskPattern = $maskPattern;
$byteCount = count($data);
- $size = $this->moduleCount - 1;
+ $y = $this->moduleCount - 1;
+ $inc = -1;
+ $byteIndex = 0;
+ $bitIndex = 7;
$mask = $this->getMask($this->maskPattern);
- for($i = $size, $y = $size, $inc = -1, $byteIndex = 0, $bitIndex = 7; $i > 0; $i -= 2){
+ for($i = $y; $i > 0; $i -= 2){
if($i === 6){
$i--;
@@ -707,9 +717,6 @@ class QRMatrix{
*
* @internal
*
- * @param int $maskPattern
- *
- * @return \Closure
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
protected function getMask(int $maskPattern):Closure{
@@ -719,14 +726,14 @@ class QRMatrix{
}
return [
- 0b000 => function($x, $y):int{ return ($x + $y) % 2; },
- 0b001 => function($x, $y):int{ return $y % 2; },
- 0b010 => function($x, $y):int{ return $x % 3; },
- 0b011 => function($x, $y):int{ return ($x + $y) % 3; },
- 0b100 => function($x, $y):int{ return ((int)($y / 2) + (int)($x / 3)) % 2; },
- 0b101 => function($x, $y):int{ return (($x * $y) % 2) + (($x * $y) % 3); },
- 0b110 => function($x, $y):int{ return ((($x * $y) % 2) + (($x * $y) % 3)) % 2; },
- 0b111 => function($x, $y):int{ return ((($x * $y) % 3) + (($x + $y) % 2)) % 2; },
+ 0b000 => fn($x, $y):int => ($x + $y) % 2,
+ 0b001 => fn($x, $y):int => $y % 2,
+ 0b010 => fn($x, $y):int => $x % 3,
+ 0b011 => fn($x, $y):int => ($x + $y) % 3,
+ 0b100 => fn($x, $y):int => ((int)($y / 2) + (int)($x / 3)) % 2,
+ 0b101 => fn($x, $y):int => (($x * $y) % 2) + (($x * $y) % 3),
+ 0b110 => fn($x, $y):int => ((($x * $y) % 2) + (($x * $y) % 3)) % 2,
+ 0b111 => fn($x, $y):int => ((($x * $y) % 3) + (($x + $y) % 2)) % 2,
][$maskPattern];
}
diff --git a/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php b/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php
index 0b4ff6a77..de47f20f4 100644
--- a/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php
+++ b/vendor/chillerlan/php-qrcode/src/Helpers/BitBuffer.php
@@ -14,20 +14,25 @@ namespace chillerlan\QRCode\Helpers;
use function count, floor;
-class BitBuffer{
+/**
+ * Holds the raw binary data
+ */
+final class BitBuffer{
/**
- * @var int[]
+ * The buffer content
+ *
+ * @var int[]
*/
- public $buffer = [];
+ protected array $buffer = [];
/**
- * @var int
+ * Length of the content (bits)
*/
- public $length = 0;
+ protected int $length = 0;
/**
- * @return \chillerlan\QRCode\Helpers\BitBuffer
+ * clears the buffer
*/
public function clear():BitBuffer{
$this->buffer = [];
@@ -37,10 +42,7 @@ class BitBuffer{
}
/**
- * @param int $num
- * @param int $length
- *
- * @return \chillerlan\QRCode\Helpers\BitBuffer
+ * appends a sequence of bits
*/
public function put(int $num, int $length):BitBuffer{
@@ -52,9 +54,7 @@ class BitBuffer{
}
/**
- * @param bool $bit
- *
- * @return \chillerlan\QRCode\Helpers\BitBuffer
+ * appends a single bit
*/
public function putBit(bool $bit):BitBuffer{
$bufIndex = floor($this->length / 8);
@@ -72,4 +72,18 @@ class BitBuffer{
return $this;
}
+ /**
+ * returns the current buffer length
+ */
+ public function getLength():int{
+ return $this->length;
+ }
+
+ /**
+ * returns the buffer content
+ */
+ public function getBuffer():array{
+ return $this->buffer;
+ }
+
}
diff --git a/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php b/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php
index abe11d0cc..c42e0831c 100644
--- a/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php
+++ b/vendor/chillerlan/php-qrcode/src/Helpers/Polynomial.php
@@ -17,12 +17,14 @@ use chillerlan\QRCode\QRCodeException;
use function array_fill, count, sprintf;
/**
- * @link http://www.thonky.com/qr-code-tutorial/error-correction-coding
+ * Polynomial long division helpers
+ *
+ * @see http://www.thonky.com/qr-code-tutorial/error-correction-coding
*/
-class Polynomial{
+final class Polynomial{
/**
- * @link http://www.thonky.com/qr-code-tutorial/log-antilog-table
+ * @see http://www.thonky.com/qr-code-tutorial/log-antilog-table
*/
protected const table = [
[ 1, 0], [ 2, 0], [ 4, 1], [ 8, 25], [ 16, 2], [ 32, 50], [ 64, 26], [128, 198],
@@ -60,29 +62,26 @@ class Polynomial{
];
/**
- * @var array
+ * @var int[]
*/
- protected $num = [];
+ protected array $num = [];
/**
* Polynomial constructor.
- *
- * @param array|null $num
- * @param int|null $shift
*/
public function __construct(array $num = null, int $shift = null){
$this->setNum($num ?? [1], $shift);
}
/**
- * @return array
+ *
*/
public function getNum():array{
return $this->num;
}
/**
- * @param array $num
+ * @param int[] $num
* @param int|null $shift
*
* @return \chillerlan\QRCode\Helpers\Polynomial
@@ -105,7 +104,7 @@ class Polynomial{
}
/**
- * @param array $e
+ * @param int[] $e
*
* @return \chillerlan\QRCode\Helpers\Polynomial
*/
@@ -127,7 +126,7 @@ class Polynomial{
}
/**
- * @param array $e
+ * @param int[] $e
*
* @return \chillerlan\QRCode\Helpers\Polynomial
*/
@@ -150,9 +149,6 @@ class Polynomial{
}
/**
- * @param int $n
- *
- * @return int
* @throws \chillerlan\QRCode\QRCodeException
*/
public function glog(int $n):int{
@@ -165,9 +161,7 @@ class Polynomial{
}
/**
- * @param int $n
*
- * @return int
*/
public function gexp(int $n):int{
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php b/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php
index a706685af..a15ae9ff3 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QRFpdf.php
@@ -69,7 +69,7 @@ class QRFpdf extends QROutputAbstract{
* @return string|\FPDF
*/
public function dump(string $file = null){
- $file = $file ?? $this->options->cachefile;
+ $file ??= $this->options->cachefile;
$fpdf = new FPDF('P', $this->options->fpdfMeasureUnit, [$this->length, $this->length]);
$fpdf->AddPage();
@@ -83,6 +83,7 @@ class QRFpdf extends QROutputAbstract{
$color = $this->moduleValues[$M_TYPE];
if($prevColor === null || $prevColor !== $color){
+ /** @phan-suppress-next-line PhanParamTooFewUnpack */
$fpdf->SetFillColor(...$color);
$prevColor = $color;
}
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QRImage.php b/vendor/chillerlan/php-qrcode/src/Output/QRImage.php
index 598948c94..8f533d341 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QRImage.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QRImage.php
@@ -19,30 +19,36 @@ use chillerlan\QRCode\{QRCode, QRCodeException};
use chillerlan\Settings\SettingsContainerInterface;
use Exception;
-use function array_values, base64_encode, call_user_func, count, imagecolorallocate, imagecolortransparent,
+use function array_values, base64_encode, call_user_func, count, extension_loaded, imagecolorallocate, imagecolortransparent,
imagecreatetruecolor, imagedestroy, imagefilledrectangle, imagegif, imagejpeg, imagepng, in_array,
is_array, ob_end_clean, ob_get_contents, ob_start, range, sprintf;
/**
- * Converts the matrix into GD images, raw or base64 output
- * requires ext-gd
- * @link http://php.net/manual/book.image.php
+ * Converts the matrix into GD images, raw or base64 output (requires ext-gd)
+ *
+ * @see http://php.net/manual/book.image.php
*/
class QRImage extends QROutputAbstract{
+ /**
+ * GD image types that support transparency
+ *
+ * @var string[]
+ */
protected const TRANSPARENCY_TYPES = [
QRCode::OUTPUT_IMAGE_PNG,
QRCode::OUTPUT_IMAGE_GIF,
];
- /**
- * @var string
- */
- protected $defaultMode = QRCode::OUTPUT_IMAGE_PNG;
+ protected string $defaultMode = QRCode::OUTPUT_IMAGE_PNG;
/**
+ * The GD image resource
+ *
* @see imagecreatetruecolor()
- * @var resource
+ * @var resource|\GdImage
+ *
+ * @phan-suppress PhanUndeclaredTypeProperty
*/
protected $image;
@@ -84,15 +90,20 @@ class QRImage extends QROutputAbstract{
/**
* @inheritDoc
*
- * @return string|resource
+ * @return string|resource|\GdImage
+ *
+ * @phan-suppress PhanUndeclaredTypeReturnType, PhanTypeMismatchReturn
*/
public function dump(string $file = null){
+ $file ??= $this->options->cachefile;
+
$this->image = imagecreatetruecolor($this->length, $this->length);
// avoid: Indirect modification of overloaded property $imageTransparencyBG has no effect
// https://stackoverflow.com/a/10455217
- $tbg = $this->options->imageTransparencyBG;
- $background = imagecolorallocate($this->image, ...$tbg);
+ $tbg = $this->options->imageTransparencyBG;
+ /** @phan-suppress-next-line PhanParamTooFewInternalUnpack */
+ $background = imagecolorallocate($this->image, ...$tbg);
if((bool)$this->options->imageTransparent && in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){
imagecolortransparent($this->image, $background);
@@ -110,7 +121,11 @@ class QRImage extends QROutputAbstract{
return $this->image;
}
- $imageData = $this->dumpImage($file);
+ $imageData = $this->dumpImage();
+
+ if($file !== null){
+ $this->saveToFile($imageData, $file);
+ }
if($this->options->imageBase64){
$imageData = sprintf('data:image/%s;base64,%s', $this->options->outputType, base64_encode($imageData));
@@ -120,11 +135,7 @@ class QRImage extends QROutputAbstract{
}
/**
- * @param int $x
- * @param int $y
- * @param array $rgb
- *
- * @return void
+ * Creates a single QR pixel with the given settings
*/
protected function setPixel(int $x, int $y, array $rgb):void{
imagefilledrectangle(
@@ -133,20 +144,17 @@ class QRImage extends QROutputAbstract{
$y * $this->scale,
($x + 1) * $this->scale,
($y + 1) * $this->scale,
+ /** @phan-suppress-next-line PhanParamTooFewInternalUnpack */
imagecolorallocate($this->image, ...$rgb)
);
}
/**
- * @param string|null $file
+ * Creates the final image by calling the desired GD output function
*
- * @return string
-
* @throws \chillerlan\QRCode\Output\QRCodeOutputException
*/
- protected function dumpImage(string $file = null):string{
- $file = $file ?? $this->options->cachefile;
-
+ protected function dumpImage():string{
ob_start();
try{
@@ -164,14 +172,12 @@ class QRImage extends QROutputAbstract{
ob_end_clean();
- if($file !== null){
- $this->saveToFile($imageData, $file);
- }
-
return $imageData;
}
/**
+ * PNG output
+ *
* @return void
*/
protected function png():void{
@@ -186,6 +192,7 @@ class QRImage extends QROutputAbstract{
/**
* Jiff - like... JitHub!
+ *
* @return void
*/
protected function gif():void{
@@ -193,6 +200,8 @@ class QRImage extends QROutputAbstract{
}
/**
+ * JPG output
+ *
* @return void
*/
protected function jpg():void{
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php b/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php
index 03886cf3b..49516d30e 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QRImagick.php
@@ -19,24 +19,20 @@ use chillerlan\QRCode\QRCodeException;
use chillerlan\Settings\SettingsContainerInterface;
use Imagick, ImagickDraw, ImagickPixel;
-use function is_string;
+use function extension_loaded, is_string;
/**
- * ImageMagick output module
- * requires ext-imagick
- * @link http://php.net/manual/book.imagick.php
- * @link http://phpimagick.com
+ * ImageMagick output module (requires ext-imagick)
+ *
+ * @see http://php.net/manual/book.imagick.php
+ * @see http://phpimagick.com
*/
class QRImagick extends QROutputAbstract{
- /**
- * @var \Imagick
- */
- protected $imagick;
+ protected Imagick $imagick;
/**
* @inheritDoc
- * @throws \chillerlan\QRCode\QRCodeException
*/
public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
@@ -72,7 +68,7 @@ class QRImagick extends QROutputAbstract{
* @return string|\Imagick
*/
public function dump(string $file = null){
- $file = $file ?? $this->options->cachefile;
+ $file ??= $this->options->cachefile;
$this->imagick = new Imagick;
$this->imagick->newImage(
@@ -98,7 +94,7 @@ class QRImagick extends QROutputAbstract{
}
/**
- * @return void
+ * Creates the QR image via ImagickDraw
*/
protected function drawImage():void{
$draw = new ImagickDraw;
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php b/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php
index 15559dae0..06d6e88cb 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QRMarkup.php
@@ -21,17 +21,13 @@ use function is_string, sprintf, strip_tags, trim;
*/
class QRMarkup extends QROutputAbstract{
- /**
- * @var string
- */
- protected $defaultMode = QRCode::OUTPUT_MARKUP_SVG;
+ protected string $defaultMode = QRCode::OUTPUT_MARKUP_SVG;
/**
* @see \sprintf()
- *
- * @var string
*/
- protected $svgHeader = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="qr-svg %1$s" style="width: 100%%; height: auto;" viewBox="0 0 %2$d %2$d">';
+ protected string $svgHeader = '<svg xmlns="http://www.w3.org/2000/svg" class="qr-svg %1$s" '.
+ 'style="width: 100%%; height: auto;" viewBox="0 0 %2$d %2$d">';
/**
* @inheritDoc
@@ -55,10 +51,15 @@ class QRMarkup extends QROutputAbstract{
}
/**
- * @return string
+ * HTML output
*/
- protected function html():string{
- $html = '<div class="'.$this->options->cssClass.'">'.$this->options->eol;
+ protected function html(string $file = null):string{
+
+ $html = empty($this->options->cssClass)
+ ? '<div>'
+ : '<div class="'.$this->options->cssClass.'">';
+
+ $html .= $this->options->eol;
foreach($this->matrix->matrix() as $row){
$html .= '<div>';
@@ -72,19 +73,21 @@ class QRMarkup extends QROutputAbstract{
$html .= '</div>'.$this->options->eol;
- if($this->options->cachefile){
- return '<!DOCTYPE html><head><meta charset="UTF-8"></head><body>'.$this->options->eol.$html.'</body>';
+ if($file !== null){
+ return '<!DOCTYPE html>'.
+ '<head><meta charset="UTF-8"><title>QR Code</title></head>'.
+ '<body>'.$this->options->eol.$html.'</body>';
}
return $html;
}
/**
- * @link https://github.com/codemasher/php-qrcode/pull/5
+ * SVG output
*
- * @return string
+ * @see https://github.com/codemasher/php-qrcode/pull/5
*/
- protected function svg():string{
+ protected function svg(string $file = null):string{
$matrix = $this->matrix->matrix();
$svg = sprintf($this->svgHeader, $this->options->cssClass, $this->options->svgViewBoxSize ?? $this->moduleCount)
@@ -115,7 +118,9 @@ class QRMarkup extends QROutputAbstract{
}
if($count > 0){
- $len = $count;
+ $len = $count;
+ $start ??= 0; // avoid type coercion in sprintf() - phan happy
+
$path .= sprintf('M%s %s h%s v1 h-%sZ ', $start, $y, $len, $len);
// reset count
@@ -128,7 +133,10 @@ class QRMarkup extends QROutputAbstract{
}
if(!empty($path)){
- $svg .= sprintf('<path class="qr-%s %s" stroke="transparent" fill="%s" fill-opacity="%s" d="%s" />', $M_TYPE, $this->options->cssClass, $value, $this->options->svgOpacity, $path);
+ $svg .= sprintf(
+ '<path class="qr-%s %s" stroke="transparent" fill="%s" fill-opacity="%s" d="%s" />',
+ $M_TYPE, $this->options->cssClass, $value, $this->options->svgOpacity, $path
+ );
}
}
@@ -137,8 +145,9 @@ class QRMarkup extends QROutputAbstract{
$svg .= '</svg>'.$this->options->eol;
// if saving to file, append the correct headers
- if($this->options->cachefile){
- return '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'.$this->options->eol.$svg;
+ if($file !== null){
+ return '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'.
+ $this->options->eol.$svg;
}
if($this->options->imageBase64){
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php b/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php
index 4ec47de24..d4ed3d0c9 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QROutputAbstract.php
@@ -15,7 +15,7 @@ namespace chillerlan\QRCode\Output;
use chillerlan\QRCode\{Data\QRMatrix, QRCode};
use chillerlan\Settings\SettingsContainerInterface;
-use function call_user_func, dirname, file_put_contents, get_called_class, in_array, is_writable, sprintf;
+use function call_user_func_array, dirname, file_put_contents, get_called_class, in_array, is_writable, sprintf;
/**
* common output abstract
@@ -23,50 +23,53 @@ use function call_user_func, dirname, file_put_contents, get_called_class, in_ar
abstract class QROutputAbstract implements QROutputInterface{
/**
- * @var int
+ * the current size of the QR matrix
+ *
+ * @see \chillerlan\QRCode\Data\QRMatrix::size()
*/
- protected $moduleCount;
+ protected int $moduleCount;
/**
- * @param \chillerlan\QRCode\Data\QRMatrix $matrix
+ * the current output mode
+ *
+ * @see \chillerlan\QRCode\QROptions::$outputType
*/
- protected $matrix;
+ protected string $outputMode;
/**
- * @var \chillerlan\QRCode\QROptions
+ * the default output mode of the current output module
*/
- protected $options;
+ protected string $defaultMode;
/**
- * @var string
+ * the current scaling for a QR pixel
+ *
+ * @see \chillerlan\QRCode\QROptions::$scale
*/
- protected $outputMode;
+ protected int $scale;
/**
- * @var string;
+ * the side length of the QR image (modules * scale)
*/
- protected $defaultMode;
+ protected int $length;
/**
- * @var int
+ * an (optional) array of color values for the several QR matrix parts
*/
- protected $scale;
+ protected array $moduleValues;
/**
- * @var int
+ * the (filled) data matrix object
*/
- protected $length;
+ protected QRMatrix $matrix;
/**
- * @var array
+ * @var \chillerlan\Settings\SettingsContainerInterface|\chillerlan\QRCode\QROptions
*/
- protected $moduleValues;
+ protected SettingsContainerInterface $options;
/**
* QROutputAbstract constructor.
- *
- * @param \chillerlan\Settings\SettingsContainerInterface $options
- * @param \chillerlan\QRCode\Data\QRMatrix $matrix
*/
public function __construct(SettingsContainerInterface $options, QRMatrix $matrix){
$this->options = $options;
@@ -86,8 +89,6 @@ abstract class QROutputAbstract implements QROutputInterface{
/**
* Sets the initial module values (clean-up & defaults)
- *
- * @return void
*/
abstract protected function setModuleValues():void;
@@ -97,10 +98,6 @@ abstract class QROutputAbstract implements QROutputInterface{
* @see file_put_contents()
* @see \chillerlan\QRCode\QROptions::cachefile
*
- * @param string $data
- * @param string $file
- *
- * @return bool
* @throws \chillerlan\QRCode\Output\QRCodeOutputException
*/
protected function saveToFile(string $data, string $file):bool{
@@ -116,9 +113,11 @@ abstract class QROutputAbstract implements QROutputInterface{
* @inheritDoc
*/
public function dump(string $file = null){
- // call the built-in output method
- $data = call_user_func([$this, $this->outputMode ?? $this->defaultMode]);
- $file = $file ?? $this->options->cachefile;
+ $file ??= $this->options->cachefile;
+
+ // call the built-in output method with the optional file path as parameter
+ // to make the called method aware if a cache file was given
+ $data = call_user_func_array([$this, $this->outputMode ?? $this->defaultMode], [$file]);
if($file !== null){
$this->saveToFile($data, $file);
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php b/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php
index d9149b0f7..b07b8e7a5 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QROutputInterface.php
@@ -21,6 +21,7 @@ interface QROutputInterface{
const DEFAULT_MODULE_VALUES = [
// light
+ QRMatrix::M_NULL => false, // 0
QRMatrix::M_DATA => false, // 4
QRMatrix::M_FINDER => false, // 6
QRMatrix::M_SEPARATOR => false, // 8
@@ -46,8 +47,6 @@ interface QROutputInterface{
/**
* generates the output, optionally dumps it to a file, and returns it
*
- * @param string|null $file
- *
* @return mixed
*/
public function dump(string $file = null);
diff --git a/vendor/chillerlan/php-qrcode/src/Output/QRString.php b/vendor/chillerlan/php-qrcode/src/Output/QRString.php
index ba8d83675..3ed5153e1 100644
--- a/vendor/chillerlan/php-qrcode/src/Output/QRString.php
+++ b/vendor/chillerlan/php-qrcode/src/Output/QRString.php
@@ -8,6 +8,9 @@
* @author Smiley <[email protected]>
* @copyright 2015 Smiley
* @license MIT
+ *
+ * @noinspection PhpUnusedParameterInspection
+ * @noinspection PhpComposerExtensionStubsInspection
*/
namespace chillerlan\QRCode\Output;
@@ -21,10 +24,7 @@ use function implode, is_string, json_encode;
*/
class QRString extends QROutputAbstract{
- /**
- * @var string
- */
- protected $defaultMode = QRCode::OUTPUT_STRING_TEXT;
+ protected string $defaultMode = QRCode::OUTPUT_STRING_TEXT;
/**
* @inheritDoc
@@ -48,9 +48,9 @@ class QRString extends QROutputAbstract{
}
/**
- * @return string
+ * string output
*/
- protected function text():string{
+ protected function text(string $file = null):string{
$str = [];
foreach($this->matrix->matrix() as $row){
@@ -67,9 +67,9 @@ class QRString extends QROutputAbstract{
}
/**
- * @return string
+ * JSON output
*/
- protected function json():string{
+ protected function json(string $file = null):string{
return json_encode($this->matrix->matrix());
}
diff --git a/vendor/chillerlan/php-qrcode/src/QRCode.php b/vendor/chillerlan/php-qrcode/src/QRCode.php
index 91f7aa0eb..908030feb 100644..100755
--- a/vendor/chillerlan/php-qrcode/src/QRCode.php
+++ b/vendor/chillerlan/php-qrcode/src/QRCode.php
@@ -13,51 +13,76 @@
namespace chillerlan\QRCode;
use chillerlan\QRCode\Data\{
- MaskPatternTester, QRCodeDataException, QRDataInterface, QRMatrix
+ AlphaNum, Byte, Kanji, MaskPatternTester, Number, QRCodeDataException, QRDataInterface, QRMatrix
};
use chillerlan\QRCode\Output\{
QRCodeOutputException, QRFpdf, QRImage, QRImagick, QRMarkup, QROutputInterface, QRString
};
use chillerlan\Settings\SettingsContainerInterface;
-use function array_search, call_user_func_array, class_exists, in_array, min, ord, strlen;
+use function call_user_func_array, class_exists, in_array, ord, strlen, strtolower, str_split;
/**
* Turns a text string into a Model 2 QR Code
*
- * @link https://github.com/kazuhikoarase/qrcode-generator/tree/master/php
- * @link http://www.qrcode.com/en/codes/model12.html
- * @link http://www.thonky.com/qr-code-tutorial/
+ * @see https://github.com/kazuhikoarase/qrcode-generator/tree/master/php
+ * @see http://www.qrcode.com/en/codes/model12.html
+ * @see https://www.swisseduc.ch/informatik/theoretische_informatik/qr_codes/docs/qr_standard.pdf
+ * @see https://en.wikipedia.org/wiki/QR_code
+ * @see http://www.thonky.com/qr-code-tutorial/
*/
class QRCode{
- /**
- * API constants
- */
- public const OUTPUT_MARKUP_HTML = 'html';
- public const OUTPUT_MARKUP_SVG = 'svg';
- public const OUTPUT_IMAGE_PNG = 'png';
- public const OUTPUT_IMAGE_JPG = 'jpg';
- public const OUTPUT_IMAGE_GIF = 'gif';
- public const OUTPUT_STRING_JSON = 'json';
- public const OUTPUT_STRING_TEXT = 'text';
- public const OUTPUT_IMAGICK = 'imagick';
- public const OUTPUT_FPDF = 'fpdf';
- public const OUTPUT_CUSTOM = 'custom';
-
+ /** @var int */
public const VERSION_AUTO = -1;
+ /** @var int */
public const MASK_PATTERN_AUTO = -1;
- public const ECC_L = 0b01; // 7%.
- public const ECC_M = 0b00; // 15%.
- public const ECC_Q = 0b11; // 25%.
- public const ECC_H = 0b10; // 30%.
+ // ISO/IEC 18004:2000 Table 2
+ /** @var int */
public const DATA_NUMBER = 0b0001;
+ /** @var int */
public const DATA_ALPHANUM = 0b0010;
+ /** @var int */
public const DATA_BYTE = 0b0100;
+ /** @var int */
public const DATA_KANJI = 0b1000;
+ /**
+ * References to the keys of the following tables:
+ *
+ * @see \chillerlan\QRCode\Data\QRDataInterface::MAX_LENGTH
+ *
+ * @var int[]
+ */
+ public const DATA_MODES = [
+ self::DATA_NUMBER => 0,
+ self::DATA_ALPHANUM => 1,
+ self::DATA_BYTE => 2,
+ self::DATA_KANJI => 3,
+ ];
+
+ // ISO/IEC 18004:2000 Tables 12, 25
+
+ /** @var int */
+ public const ECC_L = 0b01; // 7%.
+ /** @var int */
+ public const ECC_M = 0b00; // 15%.
+ /** @var int */
+ public const ECC_Q = 0b11; // 25%.
+ /** @var int */
+ public const ECC_H = 0b10; // 30%.
+
+ /**
+ * References to the keys of the following tables:
+ *
+ * @see \chillerlan\QRCode\Data\QRDataInterface::MAX_BITS
+ * @see \chillerlan\QRCode\Data\QRDataInterface::RSBLOCKS
+ * @see \chillerlan\QRCode\Data\QRMatrix::formatPattern
+ *
+ * @var int[]
+ */
public const ECC_MODES = [
self::ECC_L => 0,
self::ECC_M => 1,
@@ -65,13 +90,32 @@ class QRCode{
self::ECC_H => 3,
];
- public const DATA_MODES = [
- self::DATA_NUMBER => 0,
- self::DATA_ALPHANUM => 1,
- self::DATA_BYTE => 2,
- self::DATA_KANJI => 3,
- ];
+ /** @var string */
+ public const OUTPUT_MARKUP_HTML = 'html';
+ /** @var string */
+ public const OUTPUT_MARKUP_SVG = 'svg';
+ /** @var string */
+ public const OUTPUT_IMAGE_PNG = 'png';
+ /** @var string */
+ public const OUTPUT_IMAGE_JPG = 'jpg';
+ /** @var string */
+ public const OUTPUT_IMAGE_GIF = 'gif';
+ /** @var string */
+ public const OUTPUT_STRING_JSON = 'json';
+ /** @var string */
+ public const OUTPUT_STRING_TEXT = 'text';
+ /** @var string */
+ public const OUTPUT_IMAGICK = 'imagick';
+ /** @var string */
+ public const OUTPUT_FPDF = 'fpdf';
+ /** @var string */
+ public const OUTPUT_CUSTOM = 'custom';
+ /**
+ * Map of built-in output modules => capabilities
+ *
+ * @var string[][]
+ */
public const OUTPUT_MODES = [
QRMarkup::class => [
self::OUTPUT_MARKUP_SVG,
@@ -95,19 +139,33 @@ class QRCode{
];
/**
+ * Map of data mode => interface
+ *
+ * @var string[]
+ */
+ protected const DATA_INTERFACES = [
+ 'number' => Number::class,
+ 'alphanum' => AlphaNum::class,
+ 'kanji' => Kanji::class,
+ 'byte' => Byte::class,
+ ];
+
+ /**
+ * The settings container
+ *
* @var \chillerlan\QRCode\QROptions|\chillerlan\Settings\SettingsContainerInterface
*/
- protected $options;
+ protected SettingsContainerInterface $options;
/**
- * @var \chillerlan\QRCode\Data\QRDataInterface
+ * The selected data interface (Number, AlphaNum, Kanji, Byte)
*/
- protected $dataInterface;
+ protected QRDataInterface $dataInterface;
/**
* QRCode constructor.
*
- * @param \chillerlan\Settings\SettingsContainerInterface|null $options
+ * Sets the options instance, determines the current mb-encoding and sets it to UTF-8
*/
public function __construct(SettingsContainerInterface $options = null){
$this->options = $options ?? new QROptions;
@@ -116,9 +174,6 @@ class QRCode{
/**
* Renders a QR Code for the given $data and QROptions
*
- * @param string $data
- * @param string|null $file
- *
* @return mixed
*/
public function render(string $data, string $file = null){
@@ -128,9 +183,6 @@ class QRCode{
/**
* Returns a QRMatrix object for the given $data and current QROptions
*
- * @param string $data
- *
- * @return \chillerlan\QRCode\Data\QRMatrix
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
public function getMatrix(string $data):QRMatrix{
@@ -142,7 +194,7 @@ class QRCode{
$this->dataInterface = $this->initDataInterface($data);
$maskPattern = $this->options->maskPattern === $this::MASK_PATTERN_AUTO
- ? $this->getBestMaskPattern()
+ ? (new MaskPatternTester($this->dataInterface))->getBestMaskPattern()
: $this->options->maskPattern;
$matrix = $this->dataInterface->initMatrix($maskPattern);
@@ -155,48 +207,23 @@ class QRCode{
}
/**
- * shoves a QRMatrix through the MaskPatternTester to find the lowest penalty mask pattern
- *
- * @see \chillerlan\QRCode\Data\MaskPatternTester
- *
- * @return int
- */
- protected function getBestMaskPattern():int{
- $penalties = [];
-
- for($pattern = 0; $pattern < 8; $pattern++){
- $tester = new MaskPatternTester($this->dataInterface->initMatrix($pattern, true));
-
- $penalties[$pattern] = $tester->testPattern();
- }
-
- return array_search(min($penalties), $penalties, true);
- }
-
- /**
* returns a fresh QRDataInterface for the given $data
*
- * @param string $data
- *
- * @return \chillerlan\QRCode\Data\QRDataInterface
* @throws \chillerlan\QRCode\Data\QRCodeDataException
*/
public function initDataInterface(string $data):QRDataInterface{
- $dataModes = ['Number', 'AlphaNum', 'Kanji', 'Byte'];
- $dataNamespace = __NAMESPACE__.'\\Data\\';
// allow forcing the data mode
// see https://github.com/chillerlan/php-qrcode/issues/39
- if(in_array($this->options->dataMode, $dataModes, true)){
- $dataInterface = $dataNamespace.$this->options->dataMode;
+ $interface = $this::DATA_INTERFACES[strtolower($this->options->dataModeOverride)] ?? null;
- return new $dataInterface($this->options, $data);
+ if($interface !== null){
+ return new $interface($this->options, $data);
}
- foreach($dataModes as $mode){
- $dataInterface = $dataNamespace.$mode;
+ foreach($this::DATA_INTERFACES as $mode => $dataInterface){
- if(call_user_func_array([$this, 'is'.$mode], [$data]) && class_exists($dataInterface)){
+ if(call_user_func_array([$this, 'is'.$mode], [$data])){
return new $dataInterface($this->options, $data);
}
@@ -208,14 +235,12 @@ class QRCode{
/**
* returns a fresh (built-in) QROutputInterface
*
- * @param string $data
- *
- * @return \chillerlan\QRCode\Output\QROutputInterface
* @throws \chillerlan\QRCode\Output\QRCodeOutputException
*/
protected function initOutputInterface(string $data):QROutputInterface{
if($this->options->outputType === $this::OUTPUT_CUSTOM && class_exists($this->options->outputInterface)){
+ /** @phan-suppress-next-line PhanTypeExpectedObjectOrClassName */
return new $this->options->outputInterface($this->options, $this->getMatrix($data));
}
@@ -232,39 +257,25 @@ class QRCode{
/**
* checks if a string qualifies as numeric
- *
- * @param string $string
- *
- * @return bool
*/
public function isNumber(string $string):bool{
- return $this->checkString($string, QRDataInterface::NUMBER_CHAR_MAP);
+ return $this->checkString($string, QRDataInterface::CHAR_MAP_NUMBER);
}
/**
* checks if a string qualifies as alphanumeric
- *
- * @param string $string
- *
- * @return bool
*/
public function isAlphaNum(string $string):bool{
- return $this->checkString($string, QRDataInterface::ALPHANUM_CHAR_MAP);
+ return $this->checkString($string, QRDataInterface::CHAR_MAP_ALPHANUM);
}
/**
* checks is a given $string matches the characters of a given $charmap, returns false on the first invalid occurence.
- *
- * @param string $string
- * @param array $charmap
- *
- * @return bool
*/
protected function checkString(string $string, array $charmap):bool{
- $len = strlen($string);
- for($i = 0; $i < $len; $i++){
- if(!in_array($string[$i], $charmap, true)){
+ foreach(str_split($string) as $chr){
+ if(!isset($charmap[$chr])){
return false;
}
}
@@ -274,10 +285,6 @@ class QRCode{
/**
* checks if a string qualifies as Kanji
- *
- * @param string $string
- *
- * @return bool
*/
public function isKanji(string $string):bool{
$i = 0;
@@ -298,13 +305,9 @@ class QRCode{
/**
* a dummy
- *
- * @param $data
- *
- * @return bool
*/
- protected function isByte(string $data):bool{
- return !empty($data);
+ public function isByte(string $data):bool{
+ return $data !== '';
}
}
diff --git a/vendor/chillerlan/php-qrcode/src/QRCodeException.php b/vendor/chillerlan/php-qrcode/src/QRCodeException.php
index 68af380ff..737a0803e 100644
--- a/vendor/chillerlan/php-qrcode/src/QRCodeException.php
+++ b/vendor/chillerlan/php-qrcode/src/QRCodeException.php
@@ -12,4 +12,9 @@
namespace chillerlan\QRCode;
-class QRCodeException extends \Exception{}
+use Exception;
+
+/**
+ * An exception container
+ */
+class QRCodeException extends Exception{}
diff --git a/vendor/chillerlan/php-qrcode/src/QROptions.php b/vendor/chillerlan/php-qrcode/src/QROptions.php
index 778ae0407..e36f6701a 100644
--- a/vendor/chillerlan/php-qrcode/src/QROptions.php
+++ b/vendor/chillerlan/php-qrcode/src/QROptions.php
@@ -15,46 +15,39 @@ namespace chillerlan\QRCode;
use chillerlan\Settings\SettingsContainerAbstract;
/**
- * @property int $version
- * @property int $versionMin
- * @property int $versionMax
- * @property int $eccLevel
- * @property int $maskPattern
- * @property bool $addQuietzone
- * @property bool $quietzoneSize
- *
- * @property string $dataMode
- * @property string $outputType
- * @property string $outputInterface
- * @property string $cachefile
- *
- * @property string $eol
- * @property int $scale
- *
- * @property string $cssClass
- * @property string $svgOpacity
- * @property string $svgDefs
- * @property int $svgViewBoxSize
- *
- * @property string $textDark
- * @property string $textLight
- *
- * @property string $markupDark
- * @property string $markupLight
- *
- * @property bool $returnResource
- * @property bool $imageBase64
- * @property bool $imageTransparent
- * @property array $imageTransparencyBG
- * @property int $pngCompression
- * @property int $jpegQuality
- *
- * @property string $imagickFormat
- * @property string $imagickBG
- *
- * @property string $fpdfMeasureUnit
- *
- * @property array $moduleValues
+ * The QRCode settings container
+ *
+ * @property int $version
+ * @property int $versionMin
+ * @property int $versionMax
+ * @property int $eccLevel
+ * @property int $maskPattern
+ * @property bool $addQuietzone
+ * @property int $quietzoneSize
+ * @property string|null $dataModeOverride
+ * @property string $outputType
+ * @property string|null $outputInterface
+ * @property string|null $cachefile
+ * @property string $eol
+ * @property int $scale
+ * @property string $cssClass
+ * @property float $svgOpacity
+ * @property string $svgDefs
+ * @property int $svgViewBoxSize
+ * @property string $textDark
+ * @property string $textLight
+ * @property string $markupDark
+ * @property string $markupLight
+ * @property bool $returnResource
+ * @property bool $imageBase64
+ * @property bool $imageTransparent
+ * @property array $imageTransparencyBG
+ * @property int $pngCompression
+ * @property int $jpegQuality
+ * @property string $imagickFormat
+ * @property string|null $imagickBG
+ * @property string $fpdfMeasureUnit
+ * @property array|null $moduleValues
*/
class QROptions extends SettingsContainerAbstract{
use QROptionsTrait;
diff --git a/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php b/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php
index 45d4cb415..74c384b13 100644
--- a/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php
+++ b/vendor/chillerlan/php-qrcode/src/QROptionsTrait.php
@@ -8,146 +8,125 @@
* @author smiley <[email protected]>
* @copyright 2018 smiley
* @license MIT
+ *
+ * @noinspection PhpUnused
*/
namespace chillerlan\QRCode;
-use function array_values, count, in_array, is_array, is_numeric, max, min, sprintf, strtolower;
+use function array_values, count, in_array, is_numeric, max, min, sprintf, strtolower;
+/**
+ * The QRCode plug-in settings & setter functionality
+ */
trait QROptionsTrait{
/**
* QR Code version number
*
- * [1 ... 40] or QRCode::VERSION_AUTO
- *
- * @var int
+ * [1 ... 40] or QRCode::VERSION_AUTO
*/
- protected $version = QRCode::VERSION_AUTO;
+ protected int $version = QRCode::VERSION_AUTO;
/**
- * Minimum QR version (if $version = QRCode::VERSION_AUTO)
+ * Minimum QR version
*
- * @var int
+ * if $version = QRCode::VERSION_AUTO
*/
- protected $versionMin = 1;
+ protected int $versionMin = 1;
/**
* Maximum QR version
- *
- * @var int
*/
- protected $versionMax = 40;
+ protected int $versionMax = 40;
/**
* Error correct level
*
- * QRCode::ECC_X where X is
- * L => 7%
- * M => 15%
- * Q => 25%
- * H => 30%
+ * QRCode::ECC_X where X is:
*
- * @var int
+ * - L => 7%
+ * - M => 15%
+ * - Q => 25%
+ * - H => 30%
*/
- protected $eccLevel = QRCode::ECC_L;
+ protected int $eccLevel = QRCode::ECC_L;
/**
* Mask Pattern to use
*
- * [0...7] or QRCode::MASK_PATTERN_AUTO
- *
- * @var int
+ * [0...7] or QRCode::MASK_PATTERN_AUTO
*/
- protected $maskPattern = QRCode::MASK_PATTERN_AUTO;
+ protected int $maskPattern = QRCode::MASK_PATTERN_AUTO;
/**
* Add a "quiet zone" (margin) according to the QR code spec
- *
- * @var bool
*/
- protected $addQuietzone = true;
+ protected bool $addQuietzone = true;
/**
* Size of the quiet zone
*
- * internally clamped to [0 ... $moduleCount / 2], defaults to 4 modules
- *
- * @var int
+ * internally clamped to [0 ... $moduleCount / 2], defaults to 4 modules
*/
- protected $quietzoneSize = 4;
+ protected int $quietzoneSize = 4;
/**
* Use this to circumvent the data mode detection and force the usage of the given mode.
- * valid modes are: Number, AlphaNum, Kanji, Byte
*
- * @see https://github.com/chillerlan/php-qrcode/issues/39
+ * valid modes are: Number, AlphaNum, Kanji, Byte (case insensitive)
*
- * @var string|null
+ * @see https://github.com/chillerlan/php-qrcode/issues/39
+ * @see https://github.com/chillerlan/php-qrcode/issues/97 (changed default value to '')
*/
- protected $dataMode = null;
+ protected string $dataModeOverride = '';
/**
- * QRCode::OUTPUT_MARKUP_XXXX where XXXX = HTML, SVG
- * QRCode::OUTPUT_IMAGE_XXX where XXX = PNG, GIF, JPG
- * QRCode::OUTPUT_STRING_XXXX where XXXX = TEXT, JSON
- * QRCode::OUTPUT_CUSTOM
+ * The output type
*
- * @var string
+ * - QRCode::OUTPUT_MARKUP_XXXX where XXXX = HTML, SVG
+ * - QRCode::OUTPUT_IMAGE_XXX where XXX = PNG, GIF, JPG
+ * - QRCode::OUTPUT_STRING_XXXX where XXXX = TEXT, JSON
+ * - QRCode::OUTPUT_CUSTOM
*/
- protected $outputType = QRCode::OUTPUT_IMAGE_PNG;
+ protected string $outputType = QRCode::OUTPUT_IMAGE_PNG;
/**
* the FQCN of the custom QROutputInterface if $outputType is set to QRCode::OUTPUT_CUSTOM
- *
- * @var string|null
*/
- protected $outputInterface = null;
+ protected ?string $outputInterface = null;
/**
* /path/to/cache.file
- *
- * @var string|null
*/
- protected $cachefile = null;
+ protected ?string $cachefile = null;
/**
* newline string [HTML, SVG, TEXT]
- *
- * @var string
*/
- protected $eol = PHP_EOL;
+ protected string $eol = PHP_EOL;
/**
- * size of a QR code pixel [SVG, IMAGE_*]
- * HTML -> via CSS
- *
- * @var int
+ * size of a QR code pixel [SVG, IMAGE_*], HTML via CSS
*/
- protected $scale = 5;
+ protected int $scale = 5;
/**
* a common css class
- *
- * @var string
*/
- protected $cssClass = '';
+ protected string $cssClass = '';
/**
* SVG opacity
- *
- * @var float
*/
- protected $svgOpacity = 1.0;
+ protected float $svgOpacity = 1.0;
/**
* anything between <defs>
*
* @see https://developer.mozilla.org/docs/Web/SVG/Element/defs
- *
- * @var string
*/
- protected $svgDefs = '<style>rect{shape-rendering:crispEdges}</style>';
+ protected string $svgDefs = '<style>rect{shape-rendering:crispEdges}</style>';
/**
* SVG viewBox size. a single integer number which defines width/height of the viewBox attribute.
@@ -155,38 +134,28 @@ trait QROptionsTrait{
* viewBox="0 0 x x"
*
* @see https://css-tricks.com/scale-svg/#article-header-id-3
- *
- * @var int|null
*/
- protected $svgViewBoxSize = null;
+ protected ?int $svgViewBoxSize = null;
/**
* string substitute for dark
- *
- * @var string
*/
- protected $textDark = '🔴';
+ protected string $textDark = '🔴';
/**
* string substitute for light
- *
- * @var string
*/
- protected $textLight = '⭕';
+ protected string $textLight = '⭕';
/**
* markup substitute for dark (CSS value)
- *
- * @var string
*/
- protected $markupDark = '#000';
+ protected string $markupDark = '#000';
/**
* markup substitute for light (CSS value)
- *
- * @var string
*/
- protected $markupLight = '#fff';
+ protected string $markupLight = '#fff';
/**
* Return the image resource instead of a render if applicable.
@@ -194,7 +163,7 @@ trait QROptionsTrait{
*
* Supported by the following modules:
*
- * - QRImage: resource
+ * - QRImage: resource (PHP < 8), GdImage
* - QRImagick: Imagick
* - QRFpdf: FPDF
*
@@ -202,85 +171,66 @@ trait QROptionsTrait{
*
* @var bool
*/
- protected $returnResource = false;
+ protected bool $returnResource = false;
/**
* toggle base64 or raw image data
- *
- * @var bool
*/
- protected $imageBase64 = true;
+ protected bool $imageBase64 = true;
/**
* toggle transparency, not supported by jpg
- *
- * @var bool
*/
- protected $imageTransparent = true;
+ protected bool $imageTransparent = true;
/**
* @see imagecolortransparent()
*
- * @var array [R, G, B]
+ * [R, G, B]
*/
- protected $imageTransparencyBG = [255, 255, 255];
+ protected array $imageTransparencyBG = [255, 255, 255];
/**
* @see imagepng()
- *
- * @var int
*/
- protected $pngCompression = -1;
+ protected int $pngCompression = -1;
/**
* @see imagejpeg()
- *
- * @var int
*/
- protected $jpegQuality = 85;
+ protected int $jpegQuality = 85;
/**
* Imagick output format
*
- * @see Imagick::setType()
- *
- * @var string
+ * @see \Imagick::setType()
*/
- protected $imagickFormat = 'png';
+ protected string $imagickFormat = 'png';
/**
* Imagick background color (defaults to "transparent")
*
* @see \ImagickPixel::__construct()
- *
- * @var string|null
*/
- protected $imagickBG = null;
+ protected ?string $imagickBG = null;
/**
* Measurement unit for FPDF output: pt, mm, cm, in (defaults to "pt")
*
* @see \FPDF::__construct()
*/
- protected $fpdfMeasureUnit = 'pt';
+ protected string $fpdfMeasureUnit = 'pt';
/**
* Module values map
*
- * HTML, IMAGICK: #ABCDEF, cssname, rgb(), rgba()...
- * IMAGE: [63, 127, 255] // R, G, B
- *
- * @var array|null
+ * - HTML, IMAGICK: #ABCDEF, cssname, rgb(), rgba()...
+ * - IMAGE: [63, 127, 255] // R, G, B
*/
- protected $moduleValues = null;
+ protected ?array $moduleValues = null;
/**
* clamp min/max version number
- *
- * @param int $versionMin
- * @param int $versionMax
- *
- * @return void
*/
protected function setMinMaxVersion(int $versionMin, int $versionMax):void{
$min = max(1, min(40, $versionMin));
@@ -292,10 +242,6 @@ trait QROptionsTrait{
/**
* sets the minimum version number
- *
- * @param int $version
- *
- * @return void
*/
protected function set_versionMin(int $version):void{
$this->setMinMaxVersion($version, $this->versionMax);
@@ -303,10 +249,6 @@ trait QROptionsTrait{
/**
* sets the maximum version number
- *
- * @param int $version
- *
- * @return void
*/
protected function set_versionMax(int $version):void{
$this->setMinMaxVersion($this->versionMin, $version);
@@ -315,9 +257,6 @@ trait QROptionsTrait{
/**
* sets the error correction level
*
- * @param int $eccLevel
- *
- * @return void
* @throws \chillerlan\QRCode\QRCodeException
*/
protected function set_eccLevel(int $eccLevel):void{
@@ -331,10 +270,6 @@ trait QROptionsTrait{
/**
* sets/clamps the mask pattern
- *
- * @param int $maskPattern
- *
- * @return void
*/
protected function set_maskPattern(int $maskPattern):void{
@@ -347,15 +282,12 @@ trait QROptionsTrait{
/**
* sets the transparency background color
*
- * @param mixed $imageTransparencyBG
- *
- * @return void
* @throws \chillerlan\QRCode\QRCodeException
*/
- protected function set_imageTransparencyBG($imageTransparencyBG):void{
+ protected function set_imageTransparencyBG(array $imageTransparencyBG):void{
// invalid value - set to white as default
- if(!is_array($imageTransparencyBG) || count($imageTransparencyBG) < 3){
+ if(count($imageTransparencyBG) < 3){
$this->imageTransparencyBG = [255, 255, 255];
return;
@@ -363,6 +295,11 @@ trait QROptionsTrait{
foreach($imageTransparencyBG as $k => $v){
+ // cut off exceeding items
+ if($k > 2){
+ break;
+ }
+
if(!is_numeric($v)){
throw new QRCodeException('Invalid RGB value.');
}
@@ -377,10 +314,6 @@ trait QROptionsTrait{
/**
* sets/clamps the version number
- *
- * @param int $version
- *
- * @return void
*/
protected function set_version(int $version):void{
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php b/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php
index c29b1f639..10847633c 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/AlphaNumTest.php
@@ -12,13 +12,19 @@
namespace chillerlan\QRCodeTest\Data;
-use chillerlan\QRCode\Data\{AlphaNum, QRCodeDataException};
+use chillerlan\QRCode\Data\{AlphaNum, QRCodeDataException, QRDataInterface};
+use chillerlan\QRCode\QROptions;
-class AlphaNumTest extends DatainterfaceTestAbstract{
+/**
+ * Tests the AlphaNum class
+ */
+final class AlphaNumTest extends DatainterfaceTestAbstract{
+
+ /** @internal */
+ protected string $testdata = '0 $%*+-./:';
- protected $FQCN = AlphaNum::class;
- protected $testdata = '0 $%*+-./:';
- protected $expected = [
+ /** @internal */
+ protected array $expected = [
32, 80, 36, 212, 252, 15, 175, 251,
176, 236, 17, 236, 17, 236, 17, 236,
17, 236, 17, 236, 17, 236, 17, 236,
@@ -34,7 +40,18 @@ class AlphaNumTest extends DatainterfaceTestAbstract{
92, 112, 20, 198, 27
];
- public function testGetCharCodeException(){
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+ return new AlphaNum($options);
+ }
+
+ /**
+ * Tests if an exception is thrown when an invalid character is encountered
+ */
+ public function testGetCharCodeException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('illegal char: "#" [35]');
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php b/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php
index cbfe1fab2..295603200 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/ByteTest.php
@@ -13,12 +13,19 @@
namespace chillerlan\QRCodeTest\Data;
use chillerlan\QRCode\Data\Byte;
+use chillerlan\QRCode\Data\QRDataInterface;
+use chillerlan\QRCode\QROptions;
-class ByteTest extends DatainterfaceTestAbstract{
+/**
+ * Tests the Byte class
+ */
+final class ByteTest extends DatainterfaceTestAbstract{
+
+ /** @internal */
+ protected string $testdata = '[¯\_(ツ)_/¯]';
- protected $FQCN = Byte::class;
- protected $testdata = '[¯\_(ツ)_/¯]';
- protected $expected = [
+ /** @internal */
+ protected array $expected = [
64, 245, 188, 42, 245, 197, 242, 142,
56, 56, 66, 149, 242, 252, 42, 245,
208, 236, 17, 236, 17, 236, 17, 236,
@@ -34,5 +41,12 @@ class ByteTest extends DatainterfaceTestAbstract{
21, 47, 250, 101
];
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+ return new Byte($options);
+ }
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php b/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php
index 19d74617a..d533c3f17 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/DatainterfaceTestAbstract.php
@@ -12,54 +12,116 @@
namespace chillerlan\QRCodeTest\Data;
+use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
+use PHPUnit\Framework\TestCase;
use chillerlan\QRCode\Data\{QRCodeDataException, QRDataInterface, QRMatrix};
-use chillerlan\QRCodeTest\QRTestAbstract;
+use ReflectionClass;
-abstract class DatainterfaceTestAbstract extends QRTestAbstract{
+use function str_repeat;
- /**
- * @var \chillerlan\QRCode\Data\QRDataAbstract
- */
- protected $dataInterface;
+/**
+ * The data interface test abstract
+ */
+abstract class DatainterfaceTestAbstract extends TestCase{
- protected $testdata;
- protected $expected;
+ /** @internal */
+ protected ReflectionClass $reflection;
+ /** @internal */
+ protected QRDataInterface $dataInterface;
+ /** @internal */
+ protected string $testdata;
+ /** @internal */
+ protected array $expected;
+ /**
+ * @internal
+ */
protected function setUp():void{
- parent::setUp();
-
- $this->dataInterface = $this->reflection->newInstanceArgs([new QROptions(['version' => 4])]);
+ $this->dataInterface = $this->getDataInterfaceInstance(new QROptions(['version' => 4]));
+ $this->reflection = new ReflectionClass($this->dataInterface);
}
- public function testInstance(){
- $this->dataInterface = $this->reflection->newInstanceArgs([new QROptions, $this->testdata]);
+ /**
+ * Returns a data interface instance
+ *
+ * @internal
+ */
+ abstract protected function getDataInterfaceInstance(QROptions $options):QRDataInterface;
- $this->assertInstanceOf(QRDataInterface::class, $this->dataInterface);
+ /**
+ * Verifies the data interface instance
+ */
+ public function testInstance():void{
+ $this::assertInstanceOf(QRDataInterface::class, $this->dataInterface);
}
- public function testSetData(){
+ /**
+ * Tests ecc masking and verifies against a sample
+ */
+ public function testMaskEcc():void{
$this->dataInterface->setData($this->testdata);
- $this->assertSame($this->expected, $this->getProperty('matrixdata')->getValue($this->dataInterface));
+ $maskECC = $this->reflection->getMethod('maskECC');
+ $maskECC->setAccessible(true);
+
+ $this::assertSame($this->expected, $maskECC->invoke($this->dataInterface));
}
- public function testInitMatrix(){
- $m = $this->dataInterface->setData($this->testdata)->initMatrix(0);
+ /**
+ * @see testInitMatrix()
+ * @internal
+ * @return int[][]
+ */
+ public function MaskPatternProvider():array{
+ return [[0], [1], [2], [3], [4], [5], [6], [7]];
+ }
- $this->assertInstanceOf(QRMatrix::class, $m);
+ /**
+ * Tests initializing the data matrix
+ *
+ * @dataProvider MaskPatternProvider
+ */
+ public function testInitMatrix(int $maskPattern):void{
+ $this->dataInterface->setData($this->testdata);
+
+ $matrix = $this->dataInterface->initMatrix($maskPattern);
+
+ $this::assertInstanceOf(QRMatrix::class, $matrix);
+ $this::assertSame($maskPattern, $matrix->maskPattern());
}
- public function testGetMinimumVersion(){
- $this->assertSame(1, $this->getMethod('getMinimumVersion')->invoke($this->dataInterface));
+ /**
+ * Tests getting the minimum QR version for the given data
+ */
+ public function testGetMinimumVersion():void{
+ $this->dataInterface->setData($this->testdata);
+
+ $getMinimumVersion = $this->reflection->getMethod('getMinimumVersion');
+ $getMinimumVersion->setAccessible(true);
+
+ $this::assertSame(1, $getMinimumVersion->invoke($this->dataInterface));
}
- public function testGetMinimumVersionException(){
+ /**
+ * Tests if an exception is thrown when the data exceeds the maximum version while auto detecting
+ */
+ public function testGetMinimumVersionException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('data exceeds');
- $this->getProperty('strlen')->setValue($this->dataInterface, 13370);
- $this->getMethod('getMinimumVersion')->invoke($this->dataInterface);
+ $this->dataInterface = $this->getDataInterfaceInstance(new QROptions(['version' => QRCode::VERSION_AUTO]));
+ $this->dataInterface->setData(str_repeat($this->testdata, 1337));
+ }
+
+ /**
+ * Tests if an exception is thrown on data overflow
+ */
+ public function testCodeLengthOverflowException():void{
+ $this->expectException(QRCodeDataException::class);
+ $this->expectExceptionMessage('code length overflow');
+
+ $this->dataInterface->setData(str_repeat($this->testdata, 1337));
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php b/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php
index 108b8fed7..484f388dc 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/KanjiTest.php
@@ -12,13 +12,19 @@
namespace chillerlan\QRCodeTest\Data;
-use chillerlan\QRCode\Data\{Kanji, QRCodeDataException};
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Kanji, QRCodeDataException, QRDataInterface};
-class KanjiTest extends DatainterfaceTestAbstract{
+/**
+ * Tests the Kanji class
+ */
+final class KanjiTest extends DatainterfaceTestAbstract{
+
+ /** @internal */
+ protected string $testdata = '茗荷茗荷茗荷茗荷茗荷';
- protected $FQCN = Kanji::class;
- protected $testdata = '茗荷茗荷茗荷茗荷茗荷';
- protected $expected = [
+ /** @internal */
+ protected array $expected = [
128, 173, 85, 26, 95, 85, 70, 151,
213, 81, 165, 245, 84, 105, 125, 85,
26, 92, 0, 236, 17, 236, 17, 236,
@@ -34,17 +40,32 @@ class KanjiTest extends DatainterfaceTestAbstract{
96, 113, 54, 191
];
- public function testIllegalCharException1(){
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+ return new Kanji($options);
+ }
+
+ /**
+ * Tests if an exception is thrown when an invalid character is encountered
+ */
+ public function testIllegalCharException1():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('illegal char at 1 [16191]');
$this->dataInterface->setData('ÃÃ');
}
- public function testIllegalCharException2(){
+ /**
+ * Tests if an exception is thrown when an invalid character is encountered
+ */
+ public function testIllegalCharException2():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('illegal char at 1');
$this->dataInterface->setData('Ã');
}
+
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php b/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php
index ae4af9f29..d286b41dc 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/MaskPatternTesterTest.php
@@ -12,18 +12,31 @@
namespace chillerlan\QRCodeTest\Data;
-use chillerlan\QRCode\{QROptions, Data\Byte, Data\MaskPatternTester};
-use chillerlan\QRCodeTest\QRTestAbstract;
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Byte, MaskPatternTester};
+use PHPUnit\Framework\TestCase;
-class MaskPatternTesterTest extends QRTestAbstract{
+/**
+ * MaskPatternTester coverage test
+ */
+final class MaskPatternTesterTest extends TestCase{
- protected $FQCN = MaskPatternTester::class;
+ /**
+ * Tests getting the best mask pattern
+ */
+ public function testMaskpattern():void{
+ $dataInterface = new Byte(new QROptions(['version' => 10]), 'test');
+
+ $this::assertSame(3, (new MaskPatternTester($dataInterface))->getBestMaskPattern());
+ }
- // coverage
- public function testMaskpattern(){
- $matrix = (new Byte(new QROptions(['version' => 10]), 'test'))->initMatrix(3, true);
+ /**
+ * Tests getting the penalty value for a given mask pattern
+ */
+ public function testMaskpatternID():void{
+ $dataInterface = new Byte(new QROptions(['version' => 10]), 'test');
- $this->assertSame(4243, (new MaskPatternTester($matrix))->testPattern());
+ $this::assertSame(4243, (new MaskPatternTester($dataInterface))->testPattern(3));
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php b/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php
index 983346a34..dcd9507ab 100644
--- a/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/NumberTest.php
@@ -12,13 +12,19 @@
namespace chillerlan\QRCodeTest\Data;
-use chillerlan\QRCode\Data\{Number, QRCodeDataException};
+use chillerlan\QRCode\QROptions;
+use chillerlan\QRCode\Data\{Number, QRCodeDataException, QRDataInterface};
-class NumberTest extends DatainterfaceTestAbstract{
+/**
+ * Tests the Number class
+ */
+final class NumberTest extends DatainterfaceTestAbstract{
+
+ /** @internal */
+ protected string $testdata = '0123456789';
- protected $FQCN = Number::class;
- protected $testdata = '0123456789';
- protected $expected = [
+ /** @internal */
+ protected array $expected = [
16, 40, 12, 86, 106, 105, 0, 236,
17, 236, 17, 236, 17, 236, 17, 236,
17, 236, 17, 236, 17, 236, 17, 236,
@@ -34,7 +40,18 @@ class NumberTest extends DatainterfaceTestAbstract{
89, 63, 168, 151
];
- public function testGetCharCodeException(){
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getDataInterfaceInstance(QROptions $options):QRDataInterface{
+ return new Number($options);
+ }
+
+ /**
+ * Tests if an exception is thrown when an invalid character is encountered
+ */
+ public function testGetCharCodeException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('illegal char: "#" [35]');
diff --git a/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php b/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php
index 531c82eb2..68b31a5de 100644..100755
--- a/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Data/QRMatrixTest.php
@@ -15,177 +15,294 @@ namespace chillerlan\QRCodeTest\Data;
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
use chillerlan\QRCode\Data\{QRCodeDataException, QRMatrix};
-use chillerlan\QRCodeTest\QRTestAbstract;
+use PHPUnit\Framework\TestCase;
use ReflectionClass;
-class QRMatrixTest extends QRTestAbstract{
-
- protected $FQCN = QRMatrix::class;
+/**
+ * Tests the QRMatix class
+ */
+final class QRMatrixTest extends TestCase{
- protected $version = 7;
+ /** @internal */
+ protected const version = 40;
+ /** @internal */
+ protected QRMatrix $matrix;
/**
- * @var \chillerlan\QRCode\Data\QRMatrix
+ * invokes a QRMatrix object
+ *
+ * @internal
*/
- protected $matrix;
-
protected function setUp():void{
- parent::setUp();
+ $this->matrix = $this->getMatrix($this::version);
+ }
+
+ /**
+ * shortcut
+ *
+ * @internal
+ */
+ protected function getMatrix(int $version):QRMatrix{
+ return new QRMatrix($version, QRCode::ECC_L);
+ }
- $this->matrix = $this->reflection->newInstanceArgs([$this->version, QRCode::ECC_L]);
+ /**
+ * Validates the QRMatrix instance
+ */
+ public function testInstance():void{
+ $this::assertInstanceOf(QRMatrix::class, $this->matrix);
}
- public function testInvalidVersionException(){
+ /**
+ * Tests if an exception is thrown when an invalid QR version was given
+ */
+ public function testInvalidVersionException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('invalid QR Code version');
- $this->reflection->newInstanceArgs([42, 0]);
+ $this->matrix = new QRMatrix(42, 0);
}
- public function testInvalidEccException(){
+ /**
+ * Tests if an exception is thrown when an invalid ECC level was given
+ */
+ public function testInvalidEccException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('invalid ecc level');
- $this->reflection->newInstanceArgs([1, 42]);
+ $this->matrix = new QRMatrix(1, 42);
}
- public function testInstance(){
- $this->assertInstanceOf($this->FQCN, $this->matrix);
+ /**
+ * Tests if size() returns the actual matrix size/count
+ */
+ public function testSize():void{
+ $this::assertCount($this->matrix->size(), $this->matrix->matrix());
}
- public function testSize(){
- $this->assertCount($this->matrix->size(), $this->matrix->matrix());
+ /**
+ * Tests if version() returns the current (given) version
+ */
+ public function testVersion():void{
+ $this::assertSame($this::version, $this->matrix->version());
}
- public function testVersion(){
- $this->assertSame($this->version, $this->matrix->version());
+ /**
+ * Tests if eccLevel() returns the current (given) ECC level
+ */
+ public function testECC():void{
+ $this::assertSame(QRCode::ECC_L, $this->matrix->eccLevel());
}
- public function testECC(){
- $this->assertSame(QRCode::ECC_L, $this->matrix->eccLevel());
- }
+ /**
+ * Tests if maskPattern() returns the current (or default) mask pattern
+ */
+ public function testMaskPattern():void{
+ $this::assertSame(-1, $this->matrix->maskPattern()); // default
- public function testMaskPattern(){
- $this->assertSame(-1, $this->matrix->maskPattern());
+ // @todo: actual mask pattern after mapData()
}
- public function testGetSetCheck(){
+ /**
+ * Tests the set(), get() and check() methods
+ */
+ public function testGetSetCheck():void{
$this->matrix->set(10, 10, true, QRMatrix::M_TEST);
- $this->assertSame(65280, $this->matrix->get(10, 10));
- $this->assertTrue($this->matrix->check(10, 10));
+ $this::assertSame(65280, $this->matrix->get(10, 10));
+ $this::assertTrue($this->matrix->check(10, 10));
$this->matrix->set(20, 20, false, QRMatrix::M_TEST);
- $this->assertSame(255, $this->matrix->get(20, 20));
- $this->assertFalse($this->matrix->check(20, 20));
+ $this::assertSame(255, $this->matrix->get(20, 20));
+ $this::assertFalse($this->matrix->check(20, 20));
}
- public function testSetDarkModule(){
- $this->matrix->setDarkModule();
+ /**
+ * Version data provider for several pattern tests
+ *
+ * @return int[][]
+ * @internal
+ */
+ public function versionProvider():array{
+ $versions = [];
- $this->assertSame(QRMatrix::M_DARKMODULE << 8, $this->matrix->get(8, $this->matrix->size() - 8));
+ for($i = 1; $i <= 40; $i++){
+ $versions[] = [$i];
+ }
+
+ return $versions;
}
- public function testSetFinderPattern(){
- $this->matrix->setFinderPattern();
+ /**
+ * Tests setting the dark module and verifies its position
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetDarkModule(int $version):void{
+ $matrix = $this->getMatrix($version)->setDarkModule();
+
+ $this::assertSame(QRMatrix::M_DARKMODULE << 8, $matrix->get(8, $matrix->size() - 8));
+ }
+
+ /**
+ * Tests setting the finder patterns and verifies their positions
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetFinderPattern(int $version):void{
+ $matrix = $this->getMatrix($version)->setFinderPattern();
- $this->assertSame(QRMatrix::M_FINDER << 8, $this->matrix->get(0, 0));
- $this->assertSame(QRMatrix::M_FINDER << 8, $this->matrix->get(0, $this->matrix->size() - 1));
- $this->assertSame(QRMatrix::M_FINDER << 8, $this->matrix->get($this->matrix->size() - 1, 0));
+ $this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get(0, 0));
+ $this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get(0, $matrix->size() - 1));
+ $this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get($matrix->size() - 1, 0));
}
- public function testSetSeparators(){
- $this->matrix->setSeparators();
+ /**
+ * Tests the separator patterns and verifies their positions
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetSeparators(int $version):void{
+ $matrix = $this->getMatrix($version)->setSeparators();
- $this->assertSame(QRMatrix::M_SEPARATOR, $this->matrix->get(7, 0));
- $this->assertSame(QRMatrix::M_SEPARATOR, $this->matrix->get(0, 7));
- $this->assertSame(QRMatrix::M_SEPARATOR, $this->matrix->get(0, $this->matrix->size() - 8));
- $this->assertSame(QRMatrix::M_SEPARATOR, $this->matrix->get($this->matrix->size() - 8, 0));
+ $this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(7, 0));
+ $this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(0, 7));
+ $this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get(0, $matrix->size() - 8));
+ $this::assertSame(QRMatrix::M_SEPARATOR, $matrix->get($matrix->size() - 8, 0));
}
- public function testSetAlignmentPattern(){
- $this->matrix
+ /**
+ * Tests the alignment patterns and verifies their positions - version 1 (no pattern) skipped
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetAlignmentPattern(int $version):void{
+
+ if($version === 1){
+ $this->markTestSkipped('N/A');
+
+ /** @noinspection PhpUnreachableStatementInspection */
+ return;
+ }
+
+ $matrix = $this
+ ->getMatrix($version)
->setFinderPattern()
->setAlignmentPattern()
;
- $alignmentPattern = (new ReflectionClass(QRMatrix::class))->getConstant('alignmentPattern')[$this->version];
+ $alignmentPattern = (new ReflectionClass(QRMatrix::class))->getConstant('alignmentPattern')[$version];
foreach($alignmentPattern as $py){
foreach($alignmentPattern as $px){
- if($this->matrix->get($px, $py) === QRMatrix::M_FINDER << 8){
- $this->assertSame(QRMatrix::M_FINDER << 8, $this->matrix->get($px, $py), 'skipped finder pattern');
+ if($matrix->get($px, $py) === QRMatrix::M_FINDER << 8){
+ $this::assertSame(QRMatrix::M_FINDER << 8, $matrix->get($px, $py), 'skipped finder pattern');
continue;
}
- $this->assertSame(QRMatrix::M_ALIGNMENT << 8, $this->matrix->get($px, $py));
+ $this::assertSame(QRMatrix::M_ALIGNMENT << 8, $matrix->get($px, $py));
}
}
}
- public function testSetTimingPattern(){
- $this->matrix
+ /**
+ * Tests the timing patterns and verifies their positions
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetTimingPattern(int $version):void{
+
+ $matrix = $this
+ ->getMatrix($version)
->setAlignmentPattern()
->setTimingPattern()
;
- $size = $this->matrix->size();
+ $size = $matrix->size();
for($i = 7; $i < $size - 7; $i++){
if($i % 2 === 0){
- $p1 = $this->matrix->get(6, $i);
+ $p1 = $matrix->get(6, $i);
if($p1 === QRMatrix::M_ALIGNMENT << 8){
- $this->assertSame(QRMatrix::M_ALIGNMENT << 8, $p1, 'skipped alignment pattern');
+ $this::assertSame(QRMatrix::M_ALIGNMENT << 8, $p1, 'skipped alignment pattern');
continue;
}
- $this->assertSame(QRMatrix::M_TIMING << 8, $p1);
- $this->assertSame(QRMatrix::M_TIMING << 8, $this->matrix->get($i, 6));
+ $this::assertSame(QRMatrix::M_TIMING << 8, $p1);
+ $this::assertSame(QRMatrix::M_TIMING << 8, $matrix->get($i, 6));
}
}
}
- public function testSetVersionNumber(){
- $this->matrix->setVersionNumber(true);
+ /**
+ * Tests the version patterns and verifies their positions - version < 7 skipped
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetVersionNumber(int $version):void{
+
+ if($version < 7){
+ $this->markTestSkipped('N/A');
+
+ /** @noinspection PhpUnreachableStatementInspection */
+ return;
+ }
+
+ $matrix = $this->getMatrix($version)->setVersionNumber(true);
- $this->assertSame(QRMatrix::M_VERSION, $this->matrix->get($this->matrix->size() - 9, 0));
- $this->assertSame(QRMatrix::M_VERSION, $this->matrix->get($this->matrix->size() - 11, 5));
- $this->assertSame(QRMatrix::M_VERSION, $this->matrix->get(0, $this->matrix->size() - 9));
- $this->assertSame(QRMatrix::M_VERSION, $this->matrix->get(5, $this->matrix->size() - 11));
+ $this::assertSame(QRMatrix::M_VERSION, $matrix->get($matrix->size() - 9, 0));
+ $this::assertSame(QRMatrix::M_VERSION, $matrix->get($matrix->size() - 11, 5));
+ $this::assertSame(QRMatrix::M_VERSION, $matrix->get(0, $matrix->size() - 9));
+ $this::assertSame(QRMatrix::M_VERSION, $matrix->get(5, $matrix->size() - 11));
}
- public function testSetFormatInfo(){
- $this->matrix->setFormatInfo(0, true);
+ /**
+ * Tests the format patterns and verifies their positions
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetFormatInfo(int $version):void{
+ $matrix = $this->getMatrix($version)->setFormatInfo(0, true);
- $this->assertSame(QRMatrix::M_FORMAT, $this->matrix->get(8, 0));
- $this->assertSame(QRMatrix::M_FORMAT, $this->matrix->get(0, 8));
- $this->assertSame(QRMatrix::M_FORMAT, $this->matrix->get($this->matrix->size() - 1, 8));
- $this->assertSame(QRMatrix::M_FORMAT, $this->matrix->get($this->matrix->size() - 8, 8));
+ $this::assertSame(QRMatrix::M_FORMAT, $matrix->get(8, 0));
+ $this::assertSame(QRMatrix::M_FORMAT, $matrix->get(0, 8));
+ $this::assertSame(QRMatrix::M_FORMAT, $matrix->get($matrix->size() - 1, 8));
+ $this::assertSame(QRMatrix::M_FORMAT, $matrix->get($matrix->size() - 8, 8));
}
- public function testSetQuietZone(){
- $size = $this->matrix->size();
+ /**
+ * Tests the quiet zone pattern and verifies its position
+ *
+ * @dataProvider versionProvider
+ */
+ public function testSetQuietZone(int $version):void{
+ $matrix = $this->getMatrix($version);
+
+ $size = $matrix->size();
$q = 5;
- $this->matrix->set(0, 0, true, QRMatrix::M_TEST);
- $this->matrix->set($size - 1, $size - 1, true, QRMatrix::M_TEST);
+ $matrix->set(0, 0, true, QRMatrix::M_TEST);
+ $matrix->set($size - 1, $size - 1, true, QRMatrix::M_TEST);
- $this->matrix->setQuietZone($q);
+ $matrix->setQuietZone($q);
- $this->assertCount($size + 2 * $q, $this->matrix->matrix());
- $this->assertCount($size + 2 * $q, $this->matrix->matrix()[$size - 1]);
+ $this::assertCount($size + 2 * $q, $matrix->matrix());
+ $this::assertCount($size + 2 * $q, $matrix->matrix()[$size - 1]);
- $size = $this->matrix->size();
- $this->assertSame(QRMatrix::M_QUIETZONE, $this->matrix->get(0, 0));
- $this->assertSame(QRMatrix::M_QUIETZONE, $this->matrix->get($size - 1, $size - 1));
+ $size = $matrix->size();
+ $this::assertSame(QRMatrix::M_QUIETZONE, $matrix->get(0, 0));
+ $this::assertSame(QRMatrix::M_QUIETZONE, $matrix->get($size - 1, $size - 1));
- $this->assertSame(QRMatrix::M_TEST << 8, $this->matrix->get($q, $q));
- $this->assertSame(QRMatrix::M_TEST << 8, $this->matrix->get($size - 1 - $q, $size - 1 - $q));
+ $this::assertSame(QRMatrix::M_TEST << 8, $matrix->get($q, $q));
+ $this::assertSame(QRMatrix::M_TEST << 8, $matrix->get($size - 1 - $q, $size - 1 - $q));
}
- public function testSetQuietZoneException(){
+ /**
+ * Tests if an exception is thrown in an attempt to create it before data was written
+ */
+ public function testSetQuietZoneException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('use only after writing data');
diff --git a/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php b/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php
index 25d1c3504..e9479a5c6 100644
--- a/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Helpers/BitBufferTest.php
@@ -12,21 +12,22 @@
namespace chillerlan\QRCodeTest\Helpers;
-use chillerlan\QRCode\{QRCode, Helpers\BitBuffer};
-use chillerlan\QRCodeTest\QRTestAbstract;
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\Helpers\BitBuffer;
+use PHPUnit\Framework\TestCase;
-class BitBufferTest extends QRTestAbstract{
+/**
+ * BitBuffer coverage test
+ */
+final class BitBufferTest extends TestCase{
- /**
- * @var \chillerlan\QRCode\Helpers\BitBuffer
- */
- protected $bitBuffer;
+ protected BitBuffer $bitBuffer;
protected function setUp():void{
$this->bitBuffer = new BitBuffer;
}
- public function bitProvider(){
+ public function bitProvider():array{
return [
'number' => [QRCode::DATA_NUMBER, 16],
'alphanum' => [QRCode::DATA_ALPHANUM, 32],
@@ -38,16 +39,16 @@ class BitBufferTest extends QRTestAbstract{
/**
* @dataProvider bitProvider
*/
- public function testPut($data, $value){
+ public function testPut(int $data, int $value):void{
$this->bitBuffer->put($data, 4);
- $this->assertSame($value, $this->bitBuffer->buffer[0]);
- $this->assertSame(4, $this->bitBuffer->length);
+ $this::assertSame($value, $this->bitBuffer->getBuffer()[0]);
+ $this::assertSame(4, $this->bitBuffer->getLength());
}
- public function testClear(){
+ public function testClear():void{
$this->bitBuffer->clear();
- $this->assertSame([], $this->bitBuffer->buffer);
- $this->assertSame(0, $this->bitBuffer->length);
+ $this::assertSame([], $this->bitBuffer->getBuffer());
+ $this::assertSame(0, $this->bitBuffer->getLength());
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php b/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php
index 7f6da303c..b0f3f4aa7 100644
--- a/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Helpers/PolynomialTest.php
@@ -14,26 +14,26 @@ namespace chillerlan\QRCodeTest\Helpers;
use chillerlan\QRCode\Helpers\Polynomial;
use chillerlan\QRCode\QRCodeException;
-use chillerlan\QRCodeTest\QRTestAbstract;
+use PHPUnit\Framework\TestCase;
-class PolynomialTest extends QRTestAbstract{
+/**
+ * Polynomial coverage test
+ */
+final class PolynomialTest extends TestCase{
- /**
- * @var \chillerlan\QRCode\Helpers\Polynomial
- */
- protected $polynomial;
+ protected Polynomial $polynomial;
protected function setUp():void{
$this->polynomial = new Polynomial;
}
- public function testGexp(){
- $this->assertSame(142, $this->polynomial->gexp(-1));
- $this->assertSame(133, $this->polynomial->gexp(128));
- $this->assertSame(2, $this->polynomial->gexp(256));
+ public function testGexp():void{
+ $this::assertSame(142, $this->polynomial->gexp(-1));
+ $this::assertSame(133, $this->polynomial->gexp(128));
+ $this::assertSame(2, $this->polynomial->gexp(256));
}
- public function testGlogException(){
+ public function testGlogException():void{
$this->expectException(QRCodeException::class);
$this->expectExceptionMessage('log(0)');
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php b/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php
index 1b49182d2..a3ab0f5b9 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QRFpdfTest.php
@@ -23,8 +23,6 @@ use function class_exists, substr;
*/
class QRFpdfTest extends QROutputTestAbstract{
- protected $FQCN = QRFpdf::class;
-
/**
* @inheritDoc
* @internal
@@ -33,6 +31,8 @@ class QRFpdfTest extends QROutputTestAbstract{
if(!class_exists(FPDF::class)){
$this->markTestSkipped('FPDF not available');
+
+ /** @noinspection PhpUnreachableStatementInspection */
return;
}
@@ -41,6 +41,24 @@ class QRFpdfTest extends QROutputTestAbstract{
/**
* @inheritDoc
+ * @internal
+ */
+ protected function getOutputInterface(QROptions $options):QROutputInterface{
+ return new QRFpdf($options, $this->matrix);
+ }
+
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function types():array{
+ return [
+ 'fpdf' => [QRCode::OUTPUT_FPDF],
+ ];
+ }
+
+ /**
+ * @inheritDoc
*/
public function testSetModuleValues():void{
@@ -50,6 +68,7 @@ class QRFpdfTest extends QROutputTestAbstract{
4 => [255, 255, 255],
];
+ $this->outputInterface = $this->getOutputInterface($this->options);
$this->outputInterface->dump();
$this::assertTrue(true); // tricking the code coverage
@@ -57,25 +76,22 @@ class QRFpdfTest extends QROutputTestAbstract{
/**
* @inheritDoc
+ * @dataProvider types
*/
- public function testRenderImage():void{
- $type = QRCode::OUTPUT_FPDF;
-
+ public function testRenderImage(string $type):void{
$this->options->outputType = $type;
$this->options->imageBase64 = false;
- $this->outputInterface->dump($this::cachefile.$type);
// substr() to avoid CreationDate
- $expected = substr(file_get_contents($this::cachefile.$type), 0, 2000);
- $actual = substr($this->outputInterface->dump(), 0, 2000);
+ $expected = substr(file_get_contents(__DIR__.'/samples/'.$type), 0, 2500);
+ $actual = substr((new QRCode($this->options))->render('test'), 0, 2500);
$this::assertSame($expected, $actual);
}
public function testOutputGetResource():void{
$this->options->returnResource = true;
-
- $this->setOutputInterface();
+ $this->outputInterface = $this->getOutputInterface($this->options);
$this::assertInstanceOf(FPDF::class, $this->outputInterface->dump());
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php b/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php
index c4466a658..4da150b83 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QRImageTest.php
@@ -12,14 +12,41 @@
namespace chillerlan\QRCodeTest\Output;
-use chillerlan\QRCode\{QRCode, Output\QRImage};
-use const PHP_MAJOR_VERSION;
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRImage};
+/**
+ * Tests the QRImage output module
+ */
class QRImageTest extends QROutputTestAbstract{
- protected $FQCN = QRImage::class;
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function setUp():void{
- public function types(){
+ if(!extension_loaded('gd')){
+ $this->markTestSkipped('ext-gd not loaded');
+ return;
+ }
+
+ parent::setUp();
+ }
+
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getOutputInterface(QROptions $options):QROutputInterface{
+ return new QRImage($options, $this->matrix);
+ }
+
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function types():array{
return [
'png' => [QRCode::OUTPUT_IMAGE_PNG],
'gif' => [QRCode::OUTPUT_IMAGE_GIF],
@@ -28,25 +55,9 @@ class QRImageTest extends QROutputTestAbstract{
}
/**
- * @dataProvider types
- * @param $type
+ * @inheritDoc
*/
- public function testImageOutput($type){
- $this->options->outputType = $type;
- $this->options->imageBase64 = false;
-
- $this->setOutputInterface();
- $this->outputInterface->dump($this::cachefile.$type);
- $img = $this->outputInterface->dump();
-
- if($type === QRCode::OUTPUT_IMAGE_JPG){ // jpeg encoding may cause different results
- $this->markAsRisky();
- }
-
- $this->assertSame($img, file_get_contents($this::cachefile.$type));
- }
-
- public function testSetModuleValues(){
+ public function testSetModuleValues():void{
$this->options->moduleValues = [
// data
@@ -54,24 +65,25 @@ class QRImageTest extends QROutputTestAbstract{
4 => [255, 255, 255],
];
- $this->setOutputInterface()->dump();
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ $this->outputInterface->dump();
- $this->assertTrue(true); // tricking the code coverage
+ $this::assertTrue(true); // tricking the code coverage
}
+ /**
+ * @phan-suppress PhanUndeclaredClassReference
+ */
public function testOutputGetResource():void{
$this->options->returnResource = true;
+ $this->outputInterface = $this->getOutputInterface($this->options);
- $this->setOutputInterface();
+ $actual = $this->outputInterface->dump();
- $data = $this->outputInterface->dump();
-
- if(PHP_MAJOR_VERSION >= 8){
- $this::assertInstanceOf('\\GdImage', $data);
- }
- else{
- $this::assertIsResource($data);
- }
+ /** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */
+ \PHP_MAJOR_VERSION >= 8
+ ? $this::assertInstanceOf(\GdImage::class, $actual)
+ : $this::assertIsResource($actual);
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php b/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php
index c927cc64e..aeb5109d5 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QRImagickTest.php
@@ -9,40 +9,59 @@
* @copyright 2018 smiley
* @license MIT
*
+ * @noinspection PhpUndefinedClassInspection
* @noinspection PhpComposerExtensionStubsInspection
*/
namespace chillerlan\QRCodeTest\Output;
use Imagick;
-use chillerlan\QRCode\{QRCode, Output\QRImagick};
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRImagick};
+/**
+ * Tests the QRImagick output module
+ */
class QRImagickTest extends QROutputTestAbstract{
- protected $FQCN = QRImagick::class;
-
+ /**
+ * @inheritDoc
+ * @internal
+ */
public function setUp():void{
if(!extension_loaded('imagick')){
$this->markTestSkipped('ext-imagick not loaded');
+
+ /** @noinspection PhpUnreachableStatementInspection */
return;
}
parent::setUp();
}
- public function testImageOutput(){
- $type = QRCode::OUTPUT_IMAGICK;
-
- $this->options->outputType = $type;
- $this->setOutputInterface();
- $this->outputInterface->dump($this::cachefile.$type);
- $img = $this->outputInterface->dump();
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getOutputInterface(QROptions $options):QROutputInterface{
+ return new QRImagick($options, $this->matrix);
+ }
- $this->assertSame($img, file_get_contents($this::cachefile.$type));
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function types():array{
+ return [
+ 'imagick' => [QRCode::OUTPUT_IMAGICK],
+ ];
}
- public function testSetModuleValues(){
+ /**
+ * @inheritDoc
+ */
+ public function testSetModuleValues():void{
$this->options->moduleValues = [
// data
@@ -50,17 +69,18 @@ class QRImagickTest extends QROutputTestAbstract{
4 => '#ECF9BE',
];
- $this->setOutputInterface()->dump();
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ $this->outputInterface->dump();
- $this->assertTrue(true); // tricking the code coverage
+ $this::assertTrue(true); // tricking the code coverage
}
public function testOutputGetResource():void{
$this->options->returnResource = true;
-
- $this->setOutputInterface();
+ $this->outputInterface = $this->getOutputInterface($this->options);
$this::assertInstanceOf(Imagick::class, $this->outputInterface->dump());
}
+
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php b/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php
index 24fdc3ce6..cc18077d5 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QRMarkupTest.php
@@ -12,13 +12,27 @@
namespace chillerlan\QRCodeTest\Output;
-use chillerlan\QRCode\{QRCode, Output\QRMarkup};
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRMarkup};
+/**
+ * Tests the QRMarkup output module
+ */
class QRMarkupTest extends QROutputTestAbstract{
- protected $FQCN = QRMarkup::class;
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getOutputInterface(QROptions $options):QROutputInterface{
+ return new QRMarkup($options, $this->matrix);
+ }
- public function types(){
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function types():array{
return [
'html' => [QRCode::OUTPUT_MARKUP_HTML],
'svg' => [QRCode::OUTPUT_MARKUP_SVG],
@@ -26,43 +40,9 @@ class QRMarkupTest extends QROutputTestAbstract{
}
/**
- * @dataProvider types
- * @param $type
- */
- public function testMarkupOutputFile($type){
- $this->options->outputType = $type;
- $this->options->cachefile = $this::cachefile.$type;
- $this->setOutputInterface();
- $data = $this->outputInterface->dump();
-
- $this->assertSame($data, file_get_contents($this->options->cachefile));
- }
-
- /**
- * @dataProvider types
- * @param $type
+ * @inheritDoc
*/
- public function testMarkupOutput($type){
- $this->options->imageBase64 = false;
- $this->options->outputType = $type;
- $this->setOutputInterface();
-
- $expected = explode($this->options->eol, file_get_contents($this::cachefile.$type));
- // cut off the doctype & head
- array_shift($expected);
-
- if($type === QRCode::OUTPUT_MARKUP_HTML){
- // cut off the </body> tag
- array_pop($expected);
- }
-
- $expected = implode($this->options->eol, $expected);
-
- $this->assertSame(trim($expected), trim($this->outputInterface->dump()));
- }
-
- public function testSetModuleValues(){
-
+ public function testSetModuleValues():void{
$this->options->imageBase64 = false;
$this->options->moduleValues = [
// data
@@ -70,10 +50,10 @@ class QRMarkupTest extends QROutputTestAbstract{
4 => '#ECF9BE',
];
- $this->setOutputInterface();
+ $this->outputInterface = $this->getOutputInterface($this->options);
$data = $this->outputInterface->dump();
- $this->assertStringContainsString('#4A6000', $data);
- $this->assertStringContainsString('#ECF9BE', $data);
+ $this::assertStringContainsString('#4A6000', $data);
+ $this::assertStringContainsString('#ECF9BE', $data);
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php b/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php
index 6cd95d080..d48468bca 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QROutputTestAbstract.php
@@ -12,60 +12,129 @@
namespace chillerlan\QRCodeTest\Output;
-use chillerlan\QRCode\QROptions;
-use chillerlan\QRCode\Data\Byte;
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Data\{Byte, QRMatrix};
use chillerlan\QRCode\Output\{QRCodeOutputException, QROutputInterface};
-use chillerlan\QRCodeTest\QRTestAbstract;
+use PHPUnit\Framework\TestCase;
-use function dirname, file_exists, mkdir;
+use function file_exists, in_array, mkdir;
-abstract class QROutputTestAbstract extends QRTestAbstract{
+use const PHP_OS_FAMILY, PHP_VERSION_ID;
- const cachefile = __DIR__.'/../../.build/output_test/test.';
+/**
+ * Test abstract for the several (built-in) output modules,
+ * should also be used to test custom output modules
+ */
+abstract class QROutputTestAbstract extends TestCase{
+
+ /** @internal */
+ protected string $builddir = __DIR__.'/../../.build/output_test';
+ /** @internal */
+ protected QROutputInterface $outputInterface;
+ /** @internal */
+ protected QROptions $options;
+ /** @internal */
+ protected QRMatrix $matrix;
/**
- * @var \chillerlan\QRCode\Output\QROutputInterface
+ * Attempts to create a directory under /.build and instances several required objects
+ *
+ * @internal
*/
- protected $outputInterface;
+ protected function setUp():void{
+
+ if(!file_exists($this->builddir)){
+ mkdir($this->builddir, 0777, true);
+ }
+
+ $this->options = new QROptions;
+ $this->matrix = (new Byte($this->options, 'testdata'))->initMatrix(0);
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ }
/**
- * @var \chillerlan\QRCode\QROptions
+ * Returns a QROutputInterface instance with the given options and using $this->matrix
+ *
+ * @internal
*/
- protected $options;
+ abstract protected function getOutputInterface(QROptions $options):QROutputInterface;
/**
- * @var \chillerlan\QRCode\Data\QRMatrix
+ * Validate the instance of the interface
*/
- protected $matrix;
-
- protected function setUp():void{
- parent::setUp();
+ public function testInstance():void{
+ $this::assertInstanceOf(QROutputInterface::class, $this->outputInterface);
+ }
- $buildDir = dirname($this::cachefile);
- if(!file_exists($buildDir)){
- mkdir($buildDir, 0777, true);
- }
+ /**
+ * Tests if an exception is thrown when trying to write a cache file to an invalid destination
+ */
+ public function testSaveException():void{
+ $this->expectException(QRCodeOutputException::class);
+ $this->expectExceptionMessage('Could not write data to cache file: /foo/bar.test');
- $this->options = new QROptions;
- $this->setOutputInterface();
+ $this->options->cachefile = '/foo/bar.test';
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ $this->outputInterface->dump();
}
- protected function setOutputInterface(){
- $this->outputInterface = $this->reflection->newInstanceArgs([$this->options, (new Byte($this->options, 'testdata'))->initMatrix(0)]);
- return $this->outputInterface;
- }
+ /**
+ * covers the module values settings
+ */
+ abstract public function testSetModuleValues():void;
- public function testInstance(){
- $this->assertInstanceOf(QROutputInterface::class, $this->outputInterface);
+ /*
+ * additional, non-essential, potentially inaccurate coverage tests
+ */
+
+ /**
+ * @see testStringOutput()
+ * @return string[][]
+ * @internal
+ */
+ abstract public function types():array;
+
+ /**
+ * coverage of the built-in output modules
+ *
+ * @dataProvider types
+ */
+ public function testStringOutput(string $type):void{
+ $this->options->outputType = $type;
+ $this->options->cachefile = $this->builddir.'/test.'.$type;
+ $this->options->imageBase64 = false;
+
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ $data = $this->outputInterface->dump(); // creates the cache file
+
+ $this::assertSame($data, file_get_contents($this->options->cachefile));
}
- public function testSaveException(){
- $this->expectException(QRCodeOutputException::class);
- $this->expectExceptionMessage('Could not write data to cache file: /foo');
+ /**
+ * covers the built-in output modules, tests against pre-rendered data
+ *
+ * @dataProvider types
+ */
+ public function testRenderImage(string $type):void{
+
+ // may fail on CI, different PHP (platform) versions produce different output
+ // the samples were generated on php-7.4.3-Win32-vc15-x64
+ if(
+ (PHP_OS_FAMILY !== 'Windows' || PHP_VERSION_ID >= 80100)
+ && in_array($type, [QRCode::OUTPUT_IMAGE_JPG, QRCode::OUTPUT_IMAGICK, QRCode::OUTPUT_MARKUP_SVG])
+ ){
+ $this::markTestSkipped('may fail on CI');
+
+ /** @noinspection PhpUnreachableStatementInspection */
+ return;
+ }
- $this->options->cachefile = '/foo';
- $this->setOutputInterface();
- $this->outputInterface->dump();
+ $this->options->outputType = $type;
+
+ $this::assertSame(
+ trim(file_get_contents(__DIR__.'/samples/'.$type)),
+ trim((new QRCode($this->options))->render('test'))
+ );
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php b/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php
index 5dbd34010..c41d109be 100644
--- a/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/Output/QRStringTest.php
@@ -12,13 +12,28 @@
namespace chillerlan\QRCodeTest\Output;
-use chillerlan\QRCode\{QRCode, Output\QRString};
+use chillerlan\QRCodeExamples\MyCustomOutput;
+use chillerlan\QRCode\{QRCode, QROptions};
+use chillerlan\QRCode\Output\{QROutputInterface, QRString};
+/**
+ * Tests the QRString output module
+ */
class QRStringTest extends QROutputTestAbstract{
- protected $FQCN = QRString::class;
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ protected function getOutputInterface(QROptions $options):QROutputInterface{
+ return new QRString($options, $this->matrix);
+ }
- public function types(){
+ /**
+ * @inheritDoc
+ * @internal
+ */
+ public function types():array{
return [
'json' => [QRCode::OUTPUT_STRING_JSON],
'text' => [QRCode::OUTPUT_STRING_TEXT],
@@ -26,19 +41,9 @@ class QRStringTest extends QROutputTestAbstract{
}
/**
- * @dataProvider types
- * @param $type
+ * @inheritDoc
*/
- public function testStringOutput($type){
- $this->options->outputType = $type;
- $this->options->cachefile = $this::cachefile.$type;
- $this->setOutputInterface();
- $data = $this->outputInterface->dump();
-
- $this->assertSame($data, file_get_contents($this->options->cachefile));
- }
-
- public function testSetModuleValues(){
+ public function testSetModuleValues():void{
$this->options->moduleValues = [
// data
@@ -46,11 +51,26 @@ class QRStringTest extends QROutputTestAbstract{
4 => 'B',
];
- $this->setOutputInterface();
- $data = $this->outputInterface->dump();
+ $this->outputInterface = $this->getOutputInterface($this->options);
+ $data = $this->outputInterface->dump();
+
+ $this::assertStringContainsString('A', $data);
+ $this::assertStringContainsString('B', $data);
+ }
+
+ /**
+ * covers the custom output functionality via an example
+ */
+ public function testCustomOutput():void{
+ $this->options->version = 5;
+ $this->options->eccLevel = QRCode::ECC_L;
+ $this->options->outputType = QRCode::OUTPUT_CUSTOM;
+ $this->options->outputInterface = MyCustomOutput::class;
- $this->assertStringContainsString('A', $data);
- $this->assertStringContainsString('B', $data);
+ $this::assertSame(
+ file_get_contents(__DIR__.'/samples/custom'),
+ (new QRCode($this->options))->render('test')
+ );
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/custom b/vendor/chillerlan/php-qrcode/tests/Output/samples/custom
new file mode 100644
index 000000000..e19a64352
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/custom
@@ -0,0 +1,45 @@
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000011111110111010000101111010000011111110000
+000010000010111000001101011000001010000010000
+000010111010101101011000001101011010111010000
+000010111010110100111110010100111010111010000
+000010111010000001101011000001101010111010000
+000010000010100111110010100111110010000010000
+000011111110101010101010101010101011111110000
+000000000000010010100111110010100000000000000
+000011001110000101111010000101111001011110000
+000000000000111010000101111010000111100010000
+000001011010100111110010100111110011001010000
+000010000101111101011000001101011110011110000
+000000011010100011000001101011000101110100000
+000011001100001001101011000001101010011010000
+000010110111110000001101011000001100110100000
+000010000100100010100111110010100001100100000
+000011111110111101111010000101111010100110000
+000011010000111010000101111010000111100100000
+000010101111111111110010100111110011001000000
+000010110001110101011000001101011110011010000
+000001001111100011000001101011000101110010000
+000011000100110001101011000001101010011100000
+000001000011001000001101011000001100110000000
+000011101001011010100111110010100001100000000
+000010111010001101111010000101111010100110000
+000011100000001010000101111010000111100000000
+000000001110110111110010100111110011001000000
+000000011001011101011000001101011110011100000
+000011111110101011000001101011001111110110000
+000000000000110001101011000001101000111100000
+000011111110001000001101011000011010110000000
+000010000010101010100111110010101000100100000
+000010111010111101111010000101111111100110000
+000010111010011010000101111010001101100010000
+000010111010000111110010100111100101101100000
+000010000010101101011000001101001100111100000
+000011111110101011000001101011000110010110000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/fpdf b/vendor/chillerlan/php-qrcode/tests/Output/samples/fpdf
new file mode 100644
index 000000000..15b041b9f
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/fpdf
Binary files differ
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/gif b/vendor/chillerlan/php-qrcode/tests/Output/samples/gif
new file mode 100644
index 000000000..aff9a0fa9
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/gif
@@ -0,0 +1 @@
+data:image/gif;base64,R0lGODlhkQCRAIAAAAQCBP///yH5BAEAAAEALAAAAACRAJEAAAL+jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvOpBEin1Kr1ek1gpY6qdgsOU1niMviL7Y4R5raV7I4D0NmGly13w/Nm+tu+dsDXtjcY5nfHkGhgWFY4x7GoIOlXGRmYQnmhKYg56clZEToyOjF6CuqJURrCGoE6pRaLN7vh+nH7AMsFWMuouglcIklIy9vpG0CcmlyMfJzJLGb5DFlN/dvcZ2wdre3Ija0s3T3+PR2+sgx+nd7+ng1tjg6Psk4fX36vT464JX5i3xl3+WTJE+esoDpyA+vtKodwW72ADP8RnAfxYkT+dgpVCLToUFjHBR/TaDRRsk7IZAAvJsT4yJ/Jlfh0VZw50t5NlTlfGuTHEebCc4dcSoSQ8s9ElDuV9jxqk2jDnBSlgnwa9KdMnkI9iqSQa9VXU2NblX11VkPYXgeZsgz2FsRaRWk9zCVZV2xcUXkv7QXb18LdT39FNKq5b+NhnDoXM05s1DHXqpIh0wRaObDazJaxyuM8WC9ozKQVg4bC1ilqHVNX52jt+gbs2DVm087nM/Lnrw9bh4YbR6vujEur+dacgY/wy8vxBv0tOE/zrlRPGr9KvXHw1Kanb1UNne/flw9bXu6snThu7OWtewaPXLR6jMfH9+PODT3l+eT+ed+naxVRMaVWX1vM4XedgEPtFuBkCK4nx0/hAaZggg4CyKAhEsYHXGn5YTfdYhsWZlaFEF7oXIaDjGggCejlhiFpyhHIYXQNzvedabnot6CMdRXoI4kHvpAUWY81ZaSKMRQpAZA5NvmfC0yideSNSXpIg5Pu0ceef1W22IKWxZ0In31f4tjji14itmaZYD6ipplsyukmml6daR6ZPFqI5W17vtfdbYA+mN2fUBgap5KCFtpmoGMeGiVhig4p5WhvbgmkbZVaeiWLQaIYpqV2VsfndxN2IOqo2T3J56l+jdYpjTe6akuNpL4HI5k2TNheqyB+KKQ3l1IJZlKachn+bHqoNgpsTazOwCuzvjL2rAzGRmqqtEhBtV+2JkpaVIxXHmtYU4hyu6W3w+JiLrbNqpYnuOSWqKKYKYZ777i/DtPut/M+am+os0b6763ITrppvV1aCSWdhnb7bqLwElotreIpjOe7scb4sFsYcyXxud8u2S/CjGYsbro9qtvnySBruyoM1/qLJKbuEllyy1Ma3PGd60b1sR7D9SqsqiEepiPMENc68HM1p+yz0YSKOLTSHksNtZ5Q7QwunJlVvK/BO6QKNrUqvyZq2aBanB5nak/86Nhpa0x31ovejXfeeu/Nd99+/w144IIPTnjhhh+OeOKKL854444/DnnkkhcCXgAAOw==
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/html b/vendor/chillerlan/php-qrcode/tests/Output/samples/html
new file mode 100644
index 000000000..aa154a333
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/html
@@ -0,0 +1,31 @@
+<div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #000;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+<div><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span><span style="background: #fff;"></span></div>
+</div>
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/imagick b/vendor/chillerlan/php-qrcode/tests/Output/samples/imagick
new file mode 100644
index 000000000..377725d85
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/imagick
Binary files differ
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg b/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg
new file mode 100644
index 000000000..dd46e24a9
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/jpg
@@ -0,0 +1 @@
+data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2OTApLCBxdWFsaXR5ID0gODUK/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAkQCRAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+y6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDxn9pr46f8KW/wCEf/4pb+3f7Z+0/wDMQ+zeT5Plf9M33Z832xt7548Z/wCG5/8Aql3/AJX/AP7no/4Kaf8ANPv+4l/7a16n4O8NfBnw1+zv4W8aeNPBnhKO0j8P6bNf382gRXEjPLFEu9tsbOzM7jJwTk5Pc0AeWf8ADc//AFS7/wAr/wD9z0f8Nz/9Uu/8r/8A9z12f/Cy/wBjb/oG+DP/AAjJP/kaum+HF9+zF8RNcm0Twd4Y8GanfwWzXUkX/CKiHbErKpbMkCj7zqMZzz9aAOA8Cftlf8JR440Hwz/wrj7J/a+pW9j9o/tvf5Xmyqm/b5A3Y3ZxkZx1FemftNfHT/hS3/CP/wDFLf27/bP2n/mIfZvJ8nyv+mb7s+b7Y2988fLPxJ0nStD/AG+NL0vRNMstMsIPEmh+Va2cCwxR7ltWO1FAAyxJOB1JNfYHx08S/Brw7/Y//C27bRZvtHn/ANm/2jozX+Nvl+btxE+z70eemeOuOADzL4JftW/8LK+J+keCv+EC/sr+0fO/0v8AtfzvL8uCSX7nkrnOzHUYzn2r6Zr4T+H3gvU/AHx4/wCF5apo8Oj/AAqF9e39nqcLRmNLK7SVLMrbRkzKrefCAnlgqG+YKAcfY3w48e+E/iJoc2t+DtW/tOwguWtZJfs8sO2VVViuJFU/ddTnGOfrQB5N+zj+0h/wuHxxeeGf+EM/sT7Npr332j+0/tG7bLEmzb5SYz5uc57dOeMX42/tW/8ACtfifq/gr/hAv7V/s7yf9L/tfyfM8yCOX7nktjG/HU5xn2rxn/gnF/yW/Wf+xbn/APSm2qH452lrf/t/QWN9bQ3Vpc+INEhngmjDxyo0VoGRlPDKQSCDwQaAO5/4bn/6pd/5X/8A7no/4bn/AOqXf+V//wC569m+JsH7OPw1/s//AITXwj4M0r+0fN+yf8Uuk3meXs3/AOqhbGN6dcZzx3rjP+Fl/sbf9A3wZ/4Rkn/yNQBxn/Dc/wD1S7/yv/8A3PXpv7OP7SH/AAuHxxeeGf8AhDP7E+zaa999o/tP7Ru2yxJs2+UmM+bnOe3TnjpvhxonwA+Imhza34O8FeDNTsILlrWSX/hGo4dsqqrFcSRKfuupzjHP1r5Z/wCCcX/Jb9Z/7Fuf/wBKbagD7/ooooAKKKKACiiigD4z/wCCmn/NPv8AuJf+2tdn8ZP+Uedj/wBi3oX/AKMtK4z/AIKaf80+/wC4l/7a16zqXgrVfiJ+xdoHg7RLiyt7/UPDejeVJeOyxL5Yt5TuKqx+6hxgHnH1oA/Nqvpn/gnF/wAlv1n/ALFuf/0ptqP+GKvin/0H/Bn/AIGXP/yPXsH7Jv7PXjT4TfEXUPEfiPU/D91aXOkSWSJYTzPIHaaFwSHiQbcRt3zkjigDx/4yf8pDLH/sZNC/9F2ldn/wU0/5p9/3Ev8A21rjPjJ/ykMsf+xk0L/0XaV9Aftg/BTxV8Yf+EW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXsAdN4b8FaV8RP2VfCng7W7i9t7DUPDelebJZuqyr5ccEo2llYfeQZyDxn618//Efxrqv7JmuQ/Dn4c29lquk6jbLrc02vo01ws8jNCyq0LRKE226EAqTktzjAHM/8MVfFP/oP+DP/AAMuf/kevqD9k34X6/8ACb4dah4c8R3mmXV3c6vJeo9hI7xhGhhQAl0Q7sxt2xgjmgA+Cn7PXgv4TeKrnxH4c1PxBdXdzYvZOl/PC8YRnjckBIkO7Ma98YJ4r5f+Mn/KQyx/7GTQv/RdpX3/AF8AfGT/AJSGWP8A2Mmhf+i7SgDs/wDgpp/zT7/uJf8AtrXxnX6M/tg/BTxV8Yf+EW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXt8/wD/AAxV8U/+g/4M/wDAy5/+R6APZv8AgnF/yRDWf+xkn/8ASa2rxn/gnF/yW/Wf+xbn/wDSm2r6g/ZN+F+v/Cb4dah4c8R3mmXV3c6vJeo9hI7xhGhhQAl0Q7sxt2xgjmvl/wD4Jxf8lv1n/sW5/wD0ptqAPv8AooooAKKKKACiiigD5N/4KHeE/FXij/hBv+EZ8Na1rf2b+0PtH9nWMtx5W77Nt3bFO3O1sZ64PpXkuheN/wBrrQ9DsNE0vRvGdvYafbR2trF/wh6t5cUahUXLW5JwoAyST619TftNfHT/AIUt/wAI/wD8Ut/bv9s/af8AmIfZvJ8nyv8Apm+7Pm+2NvfPHjP/AA3P/wBUu/8AK/8A/c9AHGf8LL/bJ/6BvjP/AMIyP/5Go/4WX+2T/wBA3xn/AOEZH/8AI1dn/wANz/8AVLv/ACv/AP3PX2ZQB+cHg7w18ZvEv7RHhbxp408GeLZLuTxBps1/fzaBLbxqkUsS722xqiqqIMnAGBk9zX1B+2D4l+Mvh3/hFv8AhUltrU32j7X/AGl/Z2jLf42+T5W7MT7PvSY6Z5644PGX7SH/AAjv7Q0Hwk/4Qz7V5upWFj/aX9p7MfaVhO/yvKP3fN6b+dvUZ42f2mvjp/wpb/hH/wDilv7d/tn7T/zEPs3k+T5X/TN92fN9sbe+eADmfib8an0X9mUX9h470W3+JUGm6eLu0M1s17FeGSFbpHtWB2uuZQyFBsweBjjZ/Yp8e+LPiJ8LNT1vxjq39p38Gty2scv2eKHbEsEDBcRqo+87HOM8/SvnP42/Avzvhhq/7QP/AAlO3+3PJ13+xf7Pz5H2+eNvK8/zPm2efjd5Y3bei549m/4Jxf8AJENZ/wCxkn/9JragCH9k3xf8ftf+IuoWfxUtPEEOippEksDX/h9bKP7QJoQoDiFMtsMny56ZOOOPH/2ofCPxN/4al1nxf4Q8HeJrv7Nc2F1YX9no8txF5sVtAQykIyNtdMEHIyCD3FfWf7R3xX/4U94Hs/E39g/239p1JLH7P9s+z7d0Ur792x848rGMd+vHOz8EvHX/AAsr4YaR41/sv+yv7R87/RPtHneX5c8kX39q5zsz0GM496APjP8A4WX+2T/0DfGf/hGR/wDyNR/wsv8AbJ/6BvjP/wAIyP8A+Rq+mf2mvjp/wpb/AIR//ilv7d/tn7T/AMxD7N5Pk+V/0zfdnzfbG3vnjxn/AIbn/wCqXf8Alf8A/uegDjP+Fl/tk/8AQN8Z/wDhGR//ACNXQfsDeCPGnhr4w6tfeI/CHiDRrSTw/NCk9/ps1vGzm4tyEDOoBbCscdcA+lfSf7OPxX/4XD4HvPE39g/2J9m1J7H7P9s+0btsUT792xMZ83GMduvPHGfs4/tIf8Lh8cXnhn/hDP7E+zaa999o/tP7Ru2yxJs2+UmM+bnOe3TngA9/ooooAKKKKACiiigD4z/4Kaf80+/7iX/trXqfg7w18GfDX7O/hbxp408GeEo7SPw/ps1/fzaBFcSM8sUS722xs7MzuMnBOTk9zXln/BTT/mn3/cS/9ta7P4yf8o87H/sW9C/9GWlAHkHxr+Gq/GTxVbeJ/wBnnwrpl74VtbFLC7ksIoNMjF6rySODFN5TM3lyw/OFIIIGflIHiX/C2Pin/wBFL8Z/+D25/wDi6634KftC+NPhN4VufDnhzTPD91aXN896738EzyB2SNCAUlQbcRr2zknmvp//AIYq+Fn/AEH/ABn/AOBlt/8AI9AHn/ww8efC/Xvgrb6Vqt1Zan8adQtru2sNQu9Nkl1JtReSVLEi+aM7XXNuEkMg8vC8rt49A/Zl+Fvjub/hIP8AhoHQv+Eix9m/sX/hIbuDV/I/1vn+VueTyt37nd03bV67eKWvfsv+Afhrod/8RtC1fxNc6t4VtpNbsYb25ge3kntVM0ayKkKsULIAwVlJGcEHmvJv+G1fin/0APBn/gHc/wDyRQB9J/tl2lrYfsqeJrGxtobW0torCGCCGMJHEi3luFRVHCqAAABwAK5L/gnF/wAkQ1n/ALGSf/0mtq0/2kNbuvEv7Dtx4jvo4Y7vVdI0i9nSEERq8s9q7BQSSFyxxkk47msz/gnF/wAkQ1n/ALGSf/0mtqAPAP2cfinpE3ji8X47+KL3X/DQ01za22vifVbdLzzYtjrEwkCuI/OAfaMBmGfmwfobxd+0J8DrD4TeIPD3gHxTDpN2dIvItJt9N0i6tFiuHjcoYysKrGxkbO7IwTnPevz5r6//AGd/2X/APxE+DuheMdb1fxNb3+ofaPNjs7mBYl8u4liG0NCx+6gzknnP0oA5n9mX4peBJv8AhIP+Ggdd/wCEix9m/sX/AISG0n1fyP8AW+f5W5JPK3fud3TdtXrt45/xZ+zz8TvFPirVvE/gjwXDN4V1e+mv9EkhvbS3jeymcyQFYmkVo1MbJhCqlRwQMYr6G/4Yq+Fn/Qf8Z/8AgZbf/I9Y3wU+NfiqH4/WPwIXT9FPhrRbm80S2ujDL9teCxhlWJnfzNhciBNxCAHJwF4wAH7OPinQv2dvA954K+Md9/wjOv3upPqlvaeU95vtXiiiWTfbCRBl4ZRtJDfLnGCCfMv+CcX/ACW/Wf8AsW5//Sm2o/4KO/8AJb9G/wCxbg/9KbmvqD4Kfs9eC/hN4qufEfhzU/EF1d3Ni9k6X88LxhGeNyQEiQ7sxr3xgnigD1+iiigAooooAKKKKACviD4lfsifEnxL8RfEviOx1vwlHaarq91ewJNdXAkVJZmdQwEBAbDDOCRnua9G/bn+KXjv4a/8Id/whWu/2V/aP277X/okE3meX9n2f61Gxje/TGc89q8TsPit+1/f2NvfWNv4turS5iWaCeHwhE8cqMMq6sLbDKQQQRwQaAPqb9k34X6/8Jvh1qHhzxHeaZdXdzq8l6j2EjvGEaGFACXRDuzG3bGCOa8//ZN/Z68afCb4i6h4j8R6n4furS50iSyRLCeZ5A7TQuCQ8SDbiNu+ckcV4/8A8LL/AGyf+gb4z/8ACMj/APkaj/hZf7ZP/QN8Z/8AhGR//I1AHsHj79nrxpr/AO1RbfFSz1Pw/HosWr6betBLPMLnZbLAHAURFdx8psfNjkZI7ep/HT41+Ffg9/Y//CTafrV3/a/n/Z/7Ohifb5Xl7t2+RMZ81cYz0PTv8meAvjz8fP8Ahc/hjwh4v1+9tPtOt2Nrf2F5ottby+VLLGCrAwq67kfIIwcEEdjX2Z8Tfhb4E+JX9n/8JroX9q/2d5v2T/S54fL8zZv/ANU65zsTrnGOO9AHw18b/gp4qm0DxB8d11DRR4a1q5Gt21qZpftqQX06tErp5ewOBOm4ByBg4LcZ5/4Kfs9eNPiz4VufEfhzU/D9raW189k6X88ySF1SNyQEicbcSL3zkHivrL9pW98I3v7Pet/C3wJqumaprVpFZ6fY+H9OvVu78C2uYd0YhVmlZo0iYtkEgIxPQmuf/Yp1bSvhr8LNT0L4janZeDdWn1uW7hsdfnWwuJIGggRZVjmKsULI6hgMEowzkGgC7/wUd/5Iho3/AGMkH/pNc10H7KOt2vhr9jjSPEd9HNJaaVY6nezpCAZGSK6uXYKCQC2FOMkDPcV5/wDt8+N/BfiX4PaTY+HPF/h/WbuPxBDM8FhqUNxIqC3uAXKoxIXLKM9MketeDfA74peO5NQ8LfCR9dz4K1TUotLvNN+yQfvbW6uMXEfm7PNG4SyfMHDDdwRgYAPZvib/AMZg/wBn/wDCtP8AiUf8Il5v2/8A4SH9x5n2vZ5fleR5ucfZpN27bjK4zk48s/ZR0S68Nftj6R4cvpIZLvSr7U7Kd4STGzxWtyjFSQCVypxkA47Cvbfjp4T8VfBP+x/+Gb/DWtWP9s+f/bv9nWMuq7/J8v7Pu85ZfLx5s+Nu3dk5ztGPka18ZeN/DHxRu/GSXk2neMIr65luZprOMSR3Eu9Zw0TptVvncFSowTwBjgA9s/4KO/8AJb9G/wCxbg/9Kbmvv+vk39nHwtoX7RPge88a/GOx/wCEm1+y1J9Lt7vzXs9lqkUUqx7LYxocPNKdxBb5sZwAB9ZUAFFFFABRRRQAUUUUAfGf/BTT/mn3/cS/9ta9mtvHX/Ctf2QfDXjX+y/7V/s7w3pH+ifaPJ8zzEt4vv7Wxjfnoc4x714z/wAFNP8Amn3/AHEv/bWuz+Mn/KPOx/7FvQv/AEZaUAcZ/wANz/8AVLv/ACv/AP3PXpv7OP7SH/C4fHF54Z/4Qz+xPs2mvffaP7T+0btssSbNvlJjPm5znt054/Oavpn/AIJxf8lv1n/sW5//AEptqAD4yf8AKQyx/wCxk0L/ANF2lff9fAHxk/5SGWP/AGMmhf8Aou0r03/god4s8VeF/wDhBv8AhGfEutaJ9p/tD7R/Z19Lb+bt+zbd2xhuxubGemT60AfP9z46/wCFa/tfeJfGv9l/2r/Z3iTV/wDRPtHk+Z5j3EX39rYxvz0OcY96xv2jviv/AMLh8cWfib+wf7E+zaalj9n+2faN22WV9+7YmM+bjGO3Xnjufg/8N/EXh7xbo3xg+MGgQ3HgCeJ9Q1LUtSlh1BZxdQsIZJIQzyuzSzRHlCQTuOMEj3n/AIWX+xt/0DfBn/hGSf8AyNQBxn/DDH/VUf8Aygf/AHRXjNt4F/4Vr+194a8Ff2p/av8AZ3iTSP8AS/s/k+Z5j28v3NzYxvx1OcZ9q+rP2+fEOv8Ahr4PaTfeHNc1PRruTxBDC89hdvbyMht7glCyEErlVOOmQPSrv7Jvh7QPFPwX8K+N/E+h6ZrniqWWeaTW9RtEub93iu5ViczuDIWRURVO7KhFAxgUAe818NftUfs3/wDCO6R41+Lf/CZ/avN1Jr7+zf7M2Y+03ajZ5vmn7vm9dnO3oM8dn/wUO8WeKvC//CDf8Iz4l1rRPtP9ofaP7Ovpbfzdv2bbu2MN2NzYz0yfWvP/AIV6d8VtLvNF8e/GzUNa1H4Sy2wutQOr6v8A2laTRTQkWrPaeZI7/vpICAYyVbDHG3IAOZ/Zx/aQ/wCFPeB7zwz/AMIZ/bf2nUnvvtH9p/Z9u6KJNm3ynzjys5z36cc/TP7OP7SH/C4fHF54Z/4Qz+xPs2mvffaP7T+0btssSbNvlJjPm5znt0548G+Nfw1X4yeKrbxP+zz4V0y98K2tilhdyWEUGmRi9V5JHBim8pmby5YfnCkEEDPykD7Y8N+CPBfhq+e+8OeEPD+jXckRheew02G3kZCQShZFBK5VTjpkD0oA6CiiigAooooAKKKKAPjP/gpp/wA0+/7iX/trXufhvwVpXxE/ZV8KeDtbuL23sNQ8N6V5slm6rKvlxwSjaWVh95BnIPGfrXM/tg/BTxV8Yf8AhFv+EZ1DRbT+yPtf2j+0ZpU3eb5O3bsjfOPKbOcdR17fP/8AwxV8U/8AoP8Agz/wMuf/AJHoA9m/4Yq+Fn/Qf8Z/+Blt/wDI9d18FP2evBfwm8VXPiPw5qfiC6u7mxeydL+eF4wjPG5ICRId2Y174wTxXy//AMMVfFP/AKD/AIM/8DLn/wCR6P8Ahir4p/8AQf8ABn/gZc//ACPQAfGT/lIZY/8AYyaF/wCi7Suz/wCCmn/NPv8AuJf+2tZnw1/ZE+JPhr4i+GvEd9rfhKS00rV7W9nSG6uDIyRTK7BQYAC2FOMkDPcV7B+2D8FPFXxh/wCEW/4RnUNFtP7I+1/aP7RmlTd5vk7duyN848ps5x1HXsAfI3iX9oXxpr/wai+Fd5pnh+PRYrG0slnigmFzstjGUJYyldx8pc/Ljk4A7eP19s/s7/sv+Pvh38YtC8Y63q/hm4sNP+0ebHZ3M7St5lvLENoaFR95xnJHGfpXQftZfs9eNPiz8RdP8R+HNT8P2tpbaRHZOl/PMkhdZpnJASJxtxIvfOQeKAOF+HHjXVf2s9cm+HPxGt7LStJ062bW4ZtARobhp42WFVZpmlUptuHJAUHIXnGQdTTPihr/AMG/jbov7PXhiz0y88K2mr2NlHd6jG8l+UvHjmlJdHSPcGuHC/u8ABcg8k9N+yb+z140+E3xF1DxH4j1Pw/dWlzpElkiWE8zyB2mhcEh4kG3Ebd85I4r3/4laJdeJfh14l8OWMkMd3qukXVlA8xIjV5YWRSxAJC5YZwCcdjQB8p/8FNP+aff9xL/ANta5P4OfFDX/jIvh39nrxPZ6ZZ+FbuxSyku9OjeO/CWcHnREO7vHuLW6Bv3eCC2AOCPef2Pvgp4q+D3/CU/8JNqGi3f9r/ZPs/9nTSvt8rzt27fGmM+auMZ6Hp39/oA4b4KfC/QPhN4VufDnhy81O6tLm+e9d7+RHkDskaEAoiDbiNe2ck814z+yb+0L40+LPxF1Dw54j0zw/a2ltpEl6j2EEySF1mhQAl5XG3Ejds5A5r6fooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/json b/vendor/chillerlan/php-qrcode/tests/Output/samples/json
new file mode 100644
index 000000000..f8423f75b
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/json
@@ -0,0 +1 @@
+[[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3584,1024,4,4,1024,8,1536,1536,1536,1536,1536,1536,1536,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,1024,4,4,1024,8,1536,6,6,6,6,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,1024,4,1024,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,4,1024,4,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,1024,1024,4,4,8,1536,6,5632,5632,5632,6,1536,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,4,4,4,4,8,1536,6,6,6,6,6,1536,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3072,12,3072,12,3072,8,1536,1536,1536,1536,1536,1536,1536,18,18,18,18],[18,18,18,18,8,8,8,8,8,8,8,8,14,1024,1024,4,4,8,8,8,8,8,8,8,8,18,18,18,18],[18,18,18,18,3584,3584,3584,3584,14,14,3072,14,3584,4,1024,4,4,3584,14,14,3584,3584,3584,14,3584,18,18,18,18],[18,18,18,18,1024,4,4,1024,1024,1024,12,1024,4,4,1024,4,1024,4,4,1024,4,1024,1024,4,1024,18,18,18,18],[18,18,18,18,1024,4,1024,4,1024,1024,3072,4,4,4,1024,4,1024,1024,1024,1024,1024,4,4,1024,1024,18,18,18,18],[18,18,18,18,1024,4,1024,1024,4,4,12,1024,1024,4,1024,4,1024,1024,4,4,4,1024,4,1024,4,18,18,18,18],[18,18,18,18,4,1024,1024,4,1024,4,3072,4,4,1024,1024,1024,4,1024,4,4,1024,1024,4,1024,4,18,18,18,18],[18,18,18,18,8,8,8,8,8,8,8,8,512,4,1024,4,4,1024,4,1024,4,1024,4,1024,4,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,14,4,1024,4,4,1024,1024,4,1024,1024,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,14,1024,4,1024,1024,1024,1024,4,4,1024,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,14,1024,1024,1024,4,4,1024,4,4,4,1024,1024,1024,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,1024,4,4,4,1024,4,4,1024,1024,4,1024,4,18,18,18,18],[18,18,18,18,1536,6,5632,5632,5632,6,1536,8,3584,4,1024,1024,4,1024,4,4,1024,4,1024,4,4,18,18,18,18],[18,18,18,18,1536,6,6,6,6,6,1536,8,3584,1024,1024,1024,1024,4,1024,4,1024,1024,4,4,1024,18,18,18,18],[18,18,18,18,1536,1536,1536,1536,1536,1536,1536,8,3584,1024,4,1024,1024,4,4,1024,4,4,4,4,4,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18]]
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/png b/vendor/chillerlan/php-qrcode/tests/Output/samples/png
new file mode 100644
index 000000000..34148d735
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/png
@@ -0,0 +1 @@
+data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAACRCAIAAABMus10AAAABnRSTlMA/wD/AP83WBt9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACd0lEQVR4nO3dQW7jIABA0fFo7n/ldFnJC0sMBvu3762bJtUXMnUwHJ/P5w8pf5/+AAzTrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEeznn8zLz6O467Pce20aOX6fa9XuJxeO/SbbzSzDMc469GsR7MezXqm5iAnNy5vHZplrJs4bPuLhhhnPZr1aNajWc+dc5CToavu0NV+6F7GU/OIdQ8cGWc9mvVo1qNZz8I5yFO2TUmeYpz1aNajWY9mPT9hDjKzPKTIOOvRrEezHs16Fs5B1l38n5pWvGQ6Y5z1aNajWY9mPXfOQbY9VDKzHmToq5ltf9EQ46xHsx7NejTrOV7yv/0M38Xwdpr1aNajWc9j+4PcuIvHzKO6626LrFsaa5z1aNajWY9mPfv2BzldhGd2AJm5gM9MOp7a0OzEOOvRrEezHs169u0PMnQB3/ZA7Utumgwxzno069GsR7Oefc/mzkwrtq34uHGrtJnffM0469GsR7MezXqm5iAzx7hse3pl3eKRpxhnPZr1aNajWc9j58XM3DXYtle79SDcQ7MezXo060mem7ttecg717AYZz2a9WjWo1lP8tzc6x9ed7fCfRD+k2Y9mvVo1pM8N3fmfbftALJuHa1x1qNZj2Y9mvUkz6y78fJ+4+LXbef1Gmc9mvVo1qNZT3IOcjLzeM6697UehG+a9WjWo1lP8tzck3WLR2Yez5n54WvGWY9mPZr1aNaTPDf32szK0XW3NnwX86tp1qNZj2Y9P+Hc3N/GOOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezHs16NOvRrEezni+wifc/oOyB/wAAAABJRU5ErkJggg==
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/svg b/vendor/chillerlan/php-qrcode/tests/Output/samples/svg
new file mode 100644
index 000000000..54aceb9ec
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/svg
@@ -0,0 +1 @@
+data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJxci1zdmcgIiBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsiIHZpZXdCb3g9IjAgMCAyOSAyOSI+DQo8ZGVmcz48c3R5bGU+cmVjdHtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlc308L3N0eWxlPjwvZGVmcz4NCjxwYXRoIGNsYXNzPSJxci00ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iI2ZmZiIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNMTQgNCBoMiB2MSBoLTJaIE0xNCA1IGgyIHYxIGgtMlogTTEzIDYgaDEgdjEgaC0xWiBNMTUgNiBoMSB2MSBoLTFaIE0xMyA3IGgyIHYxIGgtMlogTTE2IDcgaDEgdjEgaC0xWiBNMTUgOCBoMiB2MSBoLTJaIE0xMyA5IGg0IHYxIGgtNFogTTE1IDExIGgyIHYxIGgtMlogTTEzIDEyIGgxIHYxIGgtMVogTTE1IDEyIGgyIHYxIGgtMlogTTUgMTMgaDIgdjEgaC0yWiBNMTIgMTMgaDIgdjEgaC0yWiBNMTUgMTMgaDEgdjEgaC0xWiBNMTcgMTMgaDIgdjEgaC0yWiBNMjAgMTMgaDEgdjEgaC0xWiBNMjMgMTMgaDEgdjEgaC0xWiBNNSAxNCBoMSB2MSBoLTFaIE03IDE0IGgxIHYxIGgtMVogTTExIDE0IGgzIHYxIGgtM1ogTTE1IDE0IGgxIHYxIGgtMVogTTIxIDE0IGgyIHYxIGgtMlogTTUgMTUgaDEgdjEgaC0xWiBNOCAxNSBoMiB2MSBoLTJaIE0xMyAxNSBoMSB2MSBoLTFaIE0xNSAxNSBoMSB2MSBoLTFaIE0xOCAxNSBoMyB2MSBoLTNaIE0yMiAxNSBoMSB2MSBoLTFaIE0yNCAxNSBoMSB2MSBoLTFaIE00IDE2IGgxIHYxIGgtMVogTTcgMTYgaDEgdjEgaC0xWiBNOSAxNiBoMSB2MSBoLTFaIE0xMSAxNiBoMiB2MSBoLTJaIE0xNiAxNiBoMSB2MSBoLTFaIE0xOCAxNiBoMiB2MSBoLTJaIE0yMiAxNiBoMSB2MSBoLTFaIE0yNCAxNiBoMSB2MSBoLTFaIE0xMyAxNyBoMSB2MSBoLTFaIE0xNSAxNyBoMiB2MSBoLTJaIE0xOCAxNyBoMSB2MSBoLTFaIE0yMCAxNyBoMSB2MSBoLTFaIE0yMiAxNyBoMSB2MSBoLTFaIE0yNCAxNyBoMSB2MSBoLTFaIE0xMyAxOCBoMSB2MSBoLTFaIE0xNSAxOCBoMiB2MSBoLTJaIE0xOSAxOCBoMSB2MSBoLTFaIE0yMyAxOCBoMiB2MSBoLTJaIE0xNCAxOSBoMSB2MSBoLTFaIE0xOSAxOSBoMiB2MSBoLTJaIE0yMyAxOSBoMiB2MSBoLTJaIE0xNiAyMCBoMiB2MSBoLTJaIE0xOSAyMCBoMyB2MSBoLTNaIE0xNCAyMSBoMyB2MSBoLTNaIE0xOCAyMSBoMiB2MSBoLTJaIE0yMiAyMSBoMSB2MSBoLTFaIE0yNCAyMSBoMSB2MSBoLTFaIE0xMyAyMiBoMSB2MSBoLTFaIE0xNiAyMiBoMSB2MSBoLTFaIE0xOCAyMiBoMiB2MSBoLTJaIE0yMSAyMiBoMSB2MSBoLTFaIE0yMyAyMiBoMiB2MSBoLTJaIE0xNyAyMyBoMSB2MSBoLTFaIE0xOSAyMyBoMSB2MSBoLTFaIE0yMiAyMyBoMiB2MSBoLTJaIE0xNCAyNCBoMSB2MSBoLTFaIE0xNyAyNCBoMiB2MSBoLTJaIE0yMCAyNCBoNSB2MSBoLTVaICIgLz48cGF0aCBjbGFzcz0icXItNiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTUgNSBoNSB2MSBoLTVaIE0xOSA1IGg1IHYxIGgtNVogTTUgNiBoMSB2MSBoLTFaIE05IDYgaDEgdjEgaC0xWiBNMTkgNiBoMSB2MSBoLTFaIE0yMyA2IGgxIHYxIGgtMVogTTUgNyBoMSB2MSBoLTFaIE05IDcgaDEgdjEgaC0xWiBNMTkgNyBoMSB2MSBoLTFaIE0yMyA3IGgxIHYxIGgtMVogTTUgOCBoMSB2MSBoLTFaIE05IDggaDEgdjEgaC0xWiBNMTkgOCBoMSB2MSBoLTFaIE0yMyA4IGgxIHYxIGgtMVogTTUgOSBoNSB2MSBoLTVaIE0xOSA5IGg1IHYxIGgtNVogTTUgMTkgaDUgdjEgaC01WiBNNSAyMCBoMSB2MSBoLTFaIE05IDIwIGgxIHYxIGgtMVogTTUgMjEgaDEgdjEgaC0xWiBNOSAyMSBoMSB2MSBoLTFaIE01IDIyIGgxIHYxIGgtMVogTTkgMjIgaDEgdjEgaC0xWiBNNSAyMyBoNSB2MSBoLTVaICIgLz48cGF0aCBjbGFzcz0icXItOCAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTExIDQgaDEgdjEgaC0xWiBNMTcgNCBoMSB2MSBoLTFaIE0xMSA1IGgxIHYxIGgtMVogTTE3IDUgaDEgdjEgaC0xWiBNMTEgNiBoMSB2MSBoLTFaIE0xNyA2IGgxIHYxIGgtMVogTTExIDcgaDEgdjEgaC0xWiBNMTcgNyBoMSB2MSBoLTFaIE0xMSA4IGgxIHYxIGgtMVogTTE3IDggaDEgdjEgaC0xWiBNMTEgOSBoMSB2MSBoLTFaIE0xNyA5IGgxIHYxIGgtMVogTTExIDEwIGgxIHYxIGgtMVogTTE3IDEwIGgxIHYxIGgtMVogTTQgMTEgaDggdjEgaC04WiBNMTcgMTEgaDggdjEgaC04WiBNNCAxNyBoOCB2MSBoLThaIE0xMSAxOCBoMSB2MSBoLTFaIE0xMSAxOSBoMSB2MSBoLTFaIE0xMSAyMCBoMSB2MSBoLTFaIE0xMSAyMSBoMSB2MSBoLTFaIE0xMSAyMiBoMSB2MSBoLTFaIE0xMSAyMyBoMSB2MSBoLTFaIE0xMSAyNCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTIgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMyAxMCBoMSB2MSBoLTFaIE0xNSAxMCBoMSB2MSBoLTFaIE0xMCAxMyBoMSB2MSBoLTFaIE0xMCAxNSBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTQgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMiA1IGgxIHYxIGgtMVogTTEyIDkgaDEgdjEgaC0xWiBNMTIgMTEgaDEgdjEgaC0xWiBNOCAxMiBoMiB2MSBoLTJaIE0xMSAxMiBoMSB2MSBoLTFaIE0xOCAxMiBoMiB2MSBoLTJaIE0yMyAxMiBoMSB2MSBoLTFaIE0xMiAxOCBoMSB2MSBoLTFaIE0xMiAxOSBoMSB2MSBoLTFaIE0xMiAyMCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMTggIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0wIDAgaDI5IHYxIGgtMjlaIE0wIDEgaDI5IHYxIGgtMjlaIE0wIDIgaDI5IHYxIGgtMjlaIE0wIDMgaDI5IHYxIGgtMjlaIE0wIDQgaDQgdjEgaC00WiBNMjUgNCBoNCB2MSBoLTRaIE0wIDUgaDQgdjEgaC00WiBNMjUgNSBoNCB2MSBoLTRaIE0wIDYgaDQgdjEgaC00WiBNMjUgNiBoNCB2MSBoLTRaIE0wIDcgaDQgdjEgaC00WiBNMjUgNyBoNCB2MSBoLTRaIE0wIDggaDQgdjEgaC00WiBNMjUgOCBoNCB2MSBoLTRaIE0wIDkgaDQgdjEgaC00WiBNMjUgOSBoNCB2MSBoLTRaIE0wIDEwIGg0IHYxIGgtNFogTTI1IDEwIGg0IHYxIGgtNFogTTAgMTEgaDQgdjEgaC00WiBNMjUgMTEgaDQgdjEgaC00WiBNMCAxMiBoNCB2MSBoLTRaIE0yNSAxMiBoNCB2MSBoLTRaIE0wIDEzIGg0IHYxIGgtNFogTTI1IDEzIGg0IHYxIGgtNFogTTAgMTQgaDQgdjEgaC00WiBNMjUgMTQgaDQgdjEgaC00WiBNMCAxNSBoNCB2MSBoLTRaIE0yNSAxNSBoNCB2MSBoLTRaIE0wIDE2IGg0IHYxIGgtNFogTTI1IDE2IGg0IHYxIGgtNFogTTAgMTcgaDQgdjEgaC00WiBNMjUgMTcgaDQgdjEgaC00WiBNMCAxOCBoNCB2MSBoLTRaIE0yNSAxOCBoNCB2MSBoLTRaIE0wIDE5IGg0IHYxIGgtNFogTTI1IDE5IGg0IHYxIGgtNFogTTAgMjAgaDQgdjEgaC00WiBNMjUgMjAgaDQgdjEgaC00WiBNMCAyMSBoNCB2MSBoLTRaIE0yNSAyMSBoNCB2MSBoLTRaIE0wIDIyIGg0IHYxIGgtNFogTTI1IDIyIGg0IHYxIGgtNFogTTAgMjMgaDQgdjEgaC00WiBNMjUgMjMgaDQgdjEgaC00WiBNMCAyNCBoNCB2MSBoLTRaIE0yNSAyNCBoNCB2MSBoLTRaIE0wIDI1IGgyOSB2MSBoLTI5WiBNMCAyNiBoMjkgdjEgaC0yOVogTTAgMjcgaDI5IHYxIGgtMjlaIE0wIDI4IGgyOSB2MSBoLTI5WiAiIC8+PHBhdGggY2xhc3M9InFyLTUxMiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTEyIDE3IGgxIHYxIGgtMVogIiAvPjxwYXRoIGNsYXNzPSJxci0xMDI0ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNMTMgNCBoMSB2MSBoLTFaIE0xNiA0IGgxIHYxIGgtMVogTTEzIDUgaDEgdjEgaC0xWiBNMTYgNSBoMSB2MSBoLTFaIE0xNCA2IGgxIHYxIGgtMVogTTE2IDYgaDEgdjEgaC0xWiBNMTUgNyBoMSB2MSBoLTFaIE0xMyA4IGgyIHYxIGgtMlogTTEzIDExIGgyIHYxIGgtMlogTTE0IDEyIGgxIHYxIGgtMVogTTQgMTMgaDEgdjEgaC0xWiBNNyAxMyBoMyB2MSBoLTNaIE0xMSAxMyBoMSB2MSBoLTFaIE0xNCAxMyBoMSB2MSBoLTFaIE0xNiAxMyBoMSB2MSBoLTFaIE0xOSAxMyBoMSB2MSBoLTFaIE0yMSAxMyBoMiB2MSBoLTJaIE0yNCAxMyBoMSB2MSBoLTFaIE00IDE0IGgxIHYxIGgtMVogTTYgMTQgaDEgdjEgaC0xWiBNOCAxNCBoMiB2MSBoLTJaIE0xNCAxNCBoMSB2MSBoLTFaIE0xNiAxNCBoNSB2MSBoLTVaIE0yMyAxNCBoMiB2MSBoLTJaIE00IDE1IGgxIHYxIGgtMVogTTYgMTUgaDIgdjEgaC0yWiBNMTEgMTUgaDIgdjEgaC0yWiBNMTQgMTUgaDEgdjEgaC0xWiBNMTYgMTUgaDIgdjEgaC0yWiBNMjEgMTUgaDEgdjEgaC0xWiBNMjMgMTUgaDEgdjEgaC0xWiBNNSAxNiBoMiB2MSBoLTJaIE04IDE2IGgxIHYxIGgtMVogTTEzIDE2IGgzIHYxIGgtM1ogTTE3IDE2IGgxIHYxIGgtMVogTTIwIDE2IGgyIHYxIGgtMlogTTIzIDE2IGgxIHYxIGgtMVogTTE0IDE3IGgxIHYxIGgtMVogTTE3IDE3IGgxIHYxIGgtMVogTTE5IDE3IGgxIHYxIGgtMVogTTIxIDE3IGgxIHYxIGgtMVogTTIzIDE3IGgxIHYxIGgtMVogTTE0IDE4IGgxIHYxIGgtMVogTTE3IDE4IGgyIHYxIGgtMlogTTIwIDE4IGgzIHYxIGgtM1ogTTEzIDE5IGgxIHYxIGgtMVogTTE1IDE5IGg0IHYxIGgtNFogTTIxIDE5IGgyIHYxIGgtMlogTTEzIDIwIGgzIHYxIGgtM1ogTTE4IDIwIGgxIHYxIGgtMVogTTIyIDIwIGgzIHYxIGgtM1ogTTEzIDIxIGgxIHYxIGgtMVogTTE3IDIxIGgxIHYxIGgtMVogTTIwIDIxIGgyIHYxIGgtMlogTTIzIDIxIGgxIHYxIGgtMVogTTE0IDIyIGgyIHYxIGgtMlogTTE3IDIyIGgxIHYxIGgtMVogTTIwIDIyIGgxIHYxIGgtMVogTTIyIDIyIGgxIHYxIGgtMVogTTEzIDIzIGg0IHYxIGgtNFogTTE4IDIzIGgxIHYxIGgtMVogTTIwIDIzIGgyIHYxIGgtMlogTTI0IDIzIGgxIHYxIGgtMVogTTEzIDI0IGgxIHYxIGgtMVogTTE1IDI0IGgyIHYxIGgtMlogTTE5IDI0IGgxIHYxIGgtMVogIiAvPjxwYXRoIGNsYXNzPSJxci0xNTM2ICIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgZmlsbD0iIzAwMCIgZmlsbC1vcGFjaXR5PSIxIiBkPSJNNCA0IGg3IHYxIGgtN1ogTTE4IDQgaDcgdjEgaC03WiBNNCA1IGgxIHYxIGgtMVogTTEwIDUgaDEgdjEgaC0xWiBNMTggNSBoMSB2MSBoLTFaIE0yNCA1IGgxIHYxIGgtMVogTTQgNiBoMSB2MSBoLTFaIE0xMCA2IGgxIHYxIGgtMVogTTE4IDYgaDEgdjEgaC0xWiBNMjQgNiBoMSB2MSBoLTFaIE00IDcgaDEgdjEgaC0xWiBNMTAgNyBoMSB2MSBoLTFaIE0xOCA3IGgxIHYxIGgtMVogTTI0IDcgaDEgdjEgaC0xWiBNNCA4IGgxIHYxIGgtMVogTTEwIDggaDEgdjEgaC0xWiBNMTggOCBoMSB2MSBoLTFaIE0yNCA4IGgxIHYxIGgtMVogTTQgOSBoMSB2MSBoLTFaIE0xMCA5IGgxIHYxIGgtMVogTTE4IDkgaDEgdjEgaC0xWiBNMjQgOSBoMSB2MSBoLTFaIE00IDEwIGg3IHYxIGgtN1ogTTE4IDEwIGg3IHYxIGgtN1ogTTQgMTggaDcgdjEgaC03WiBNNCAxOSBoMSB2MSBoLTFaIE0xMCAxOSBoMSB2MSBoLTFaIE00IDIwIGgxIHYxIGgtMVogTTEwIDIwIGgxIHYxIGgtMVogTTQgMjEgaDEgdjEgaC0xWiBNMTAgMjEgaDEgdjEgaC0xWiBNNCAyMiBoMSB2MSBoLTFaIE0xMCAyMiBoMSB2MSBoLTFaIE00IDIzIGgxIHYxIGgtMVogTTEwIDIzIGgxIHYxIGgtMVogTTQgMjQgaDcgdjEgaC03WiAiIC8+PHBhdGggY2xhc3M9InFyLTMwNzIgIiBzdHJva2U9InRyYW5zcGFyZW50IiBmaWxsPSIjMDAwIiBmaWxsLW9wYWNpdHk9IjEiIGQ9Ik0xMiAxMCBoMSB2MSBoLTFaIE0xNCAxMCBoMSB2MSBoLTFaIE0xNiAxMCBoMSB2MSBoLTFaIE0xMCAxMiBoMSB2MSBoLTFaIE0xMCAxNCBoMSB2MSBoLTFaIE0xMCAxNiBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItMzU4NCAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTEyIDQgaDEgdjEgaC0xWiBNMTIgNiBoMSB2MSBoLTFaIE0xMiA3IGgxIHYxIGgtMVogTTEyIDggaDEgdjEgaC0xWiBNNCAxMiBoNCB2MSBoLTRaIE0xMiAxMiBoMSB2MSBoLTFaIE0xNyAxMiBoMSB2MSBoLTFaIE0yMCAxMiBoMyB2MSBoLTNaIE0yNCAxMiBoMSB2MSBoLTFaIE0xMiAyMSBoMSB2MSBoLTFaIE0xMiAyMiBoMSB2MSBoLTFaIE0xMiAyMyBoMSB2MSBoLTFaIE0xMiAyNCBoMSB2MSBoLTFaICIgLz48cGF0aCBjbGFzcz0icXItNTYzMiAiIHN0cm9rZT0idHJhbnNwYXJlbnQiIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iMSIgZD0iTTYgNiBoMyB2MSBoLTNaIE0yMCA2IGgzIHYxIGgtM1ogTTYgNyBoMyB2MSBoLTNaIE0yMCA3IGgzIHYxIGgtM1ogTTYgOCBoMyB2MSBoLTNaIE0yMCA4IGgzIHYxIGgtM1ogTTYgMjAgaDMgdjEgaC0zWiBNNiAyMSBoMyB2MSBoLTNaIE02IDIyIGgzIHYxIGgtM1ogIiAvPjwvc3ZnPg0K
diff --git a/vendor/chillerlan/php-qrcode/tests/Output/samples/text b/vendor/chillerlan/php-qrcode/tests/Output/samples/text
new file mode 100644
index 000000000..23a7098f9
--- /dev/null
+++ b/vendor/chillerlan/php-qrcode/tests/Output/samples/text
@@ -0,0 +1,29 @@
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴🔴🔴🔴🔴🔴🔴⭕🔴🔴⭕⭕🔴⭕🔴🔴🔴🔴🔴🔴🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕🔴⭕⭕🔴⭕⭕🔴⭕🔴⭕⭕⭕⭕⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕🔴⭕🔴⭕🔴⭕🔴⭕🔴🔴🔴⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕🔴⭕⭕🔴⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕🔴🔴🔴⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴🔴🔴🔴🔴🔴🔴⭕🔴⭕🔴⭕🔴⭕🔴🔴🔴🔴🔴🔴🔴⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕🔴🔴⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴🔴🔴🔴⭕⭕🔴⭕🔴⭕🔴⭕⭕🔴⭕⭕🔴🔴🔴⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕⭕🔴🔴🔴⭕🔴⭕⭕🔴⭕🔴⭕⭕🔴⭕🔴🔴⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴⭕🔴🔴🔴⭕⭕⭕🔴⭕🔴🔴🔴🔴🔴⭕⭕🔴🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴⭕⭕⭕🔴🔴⭕🔴⭕🔴🔴⭕⭕⭕🔴⭕🔴⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕🔴🔴⭕🔴⭕🔴⭕⭕🔴🔴🔴⭕🔴⭕⭕🔴🔴⭕🔴⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕🔴⭕🔴⭕⭕🔴⭕🔴⭕🔴⭕🔴⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴🔴🔴🔴🔴🔴🔴⭕⭕⭕🔴⭕⭕🔴🔴⭕🔴🔴🔴⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕🔴⭕⭕🔴⭕🔴🔴🔴🔴⭕⭕🔴🔴⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕⭕🔴🔴🔴⭕⭕🔴⭕⭕⭕🔴🔴🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕🔴🔴⭕⭕⭕🔴⭕⭕🔴🔴⭕🔴⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕🔴🔴🔴⭕🔴⭕🔴⭕🔴🔴⭕🔴⭕⭕🔴⭕🔴⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕🔴⭕⭕⭕⭕⭕🔴⭕🔴🔴🔴🔴🔴⭕🔴⭕🔴🔴⭕⭕🔴⭕⭕⭕⭕
+⭕⭕⭕⭕🔴🔴🔴🔴🔴🔴🔴⭕🔴🔴⭕🔴🔴⭕⭕🔴⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
+⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕
diff --git a/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php b/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php
index 8613c961f..56936a745 100644..100755
--- a/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/QRCodeTest.php
@@ -13,128 +13,140 @@
namespace chillerlan\QRCodeTest;
use chillerlan\QRCode\{QROptions, QRCode};
-use chillerlan\QRCode\Data\{AlphaNum, Byte, Number, QRCodeDataException};
+use chillerlan\QRCode\Data\{AlphaNum, Byte, Kanji, Number, QRCodeDataException};
use chillerlan\QRCode\Output\QRCodeOutputException;
-use chillerlan\QRCodeExamples\MyCustomOutput;
+use PHPUnit\Framework\TestCase;
use function random_bytes;
-class QRCodeTest extends QRTestAbstract{
+/**
+ * Tests basic functions of the QRCode class
+ */
+class QRCodeTest extends TestCase{
- protected $FQCN = QRCode::class;
+ /** @internal */
+ protected QRCode $qrcode;
+ /** @internal */
+ protected QROptions $options;
/**
- * @var \chillerlan\QRCode\QRCode
+ * invoke test instances
+ *
+ * @internal
*/
- protected $qrcode;
-
protected function setUp():void{
- parent::setUp();
-
- $this->qrcode = $this->reflection->newInstance();
+ $this->qrcode = new QRCode;
+ $this->options = new QROptions;
}
- public function testIsNumber(){
- $this->assertTrue($this->qrcode->isNumber('0123456789'));
- $this->assertFalse($this->qrcode->isNumber('ABC'));
- }
+ /**
+ * isNumber() should pass on any number and fail on anything else
+ */
+ public function testIsNumber():void{
+ $this::assertTrue($this->qrcode->isNumber('0123456789'));
- public function testIsAlphaNum(){
- $this->assertTrue($this->qrcode->isAlphaNum('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:'));
- $this->assertFalse($this->qrcode->isAlphaNum('abc'));
+ $this::assertFalse($this->qrcode->isNumber('ABC123'));
}
- public function testIsKanji(){
- $this->assertTrue($this->qrcode->isKanji('茗荷'));
- $this->assertFalse($this->qrcode->isKanji('Ã'));
+ /**
+ * isAlphaNum() should pass on the 45 defined characters and fail on anything else (e.g. lowercase)
+ */
+ public function testIsAlphaNum():void{
+ $this::assertTrue($this->qrcode->isAlphaNum('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:'));
+
+ $this::assertFalse($this->qrcode->isAlphaNum('abc'));
}
- // coverage
-
- public function typeDataProvider(){
- return [
- 'png' => [QRCode::OUTPUT_IMAGE_PNG, 'data:image/png;base64,'],
- 'gif' => [QRCode::OUTPUT_IMAGE_GIF, 'data:image/gif;base64,'],
- 'jpg' => [QRCode::OUTPUT_IMAGE_JPG, 'data:image/jpg;base64,'],
- 'svg' => [QRCode::OUTPUT_MARKUP_SVG, 'data:image/svg+xml;base64,'],
- 'html' => [QRCode::OUTPUT_MARKUP_HTML, '<div><span style="background:'],
- 'text' => [QRCode::OUTPUT_STRING_TEXT, '⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕⭕'.PHP_EOL],
- 'json' => [QRCode::OUTPUT_STRING_JSON, '[[18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18],'],
- ];
+ /**
+ * isKanji() should pass on Kanji/SJIS characters and fail on everything else
+ */
+ public function testIsKanji():void{
+ $this::assertTrue($this->qrcode->isKanji('茗荷'));
+
+ $this::assertFalse($this->qrcode->isKanji('Ã'));
+ $this::assertFalse($this->qrcode->isKanji('ABC'));
+ $this::assertFalse($this->qrcode->isKanji('123'));
}
/**
- * @dataProvider typeDataProvider
- * @param $type
+ * isByte() passses any binary string and only fails on empty strings
*/
- public function testRenderImage($type, $expected){
- $this->qrcode = $this->reflection->newInstanceArgs([new QROptions(['outputType' => $type])]);
+ public function testIsByte():void{
+ $this::assertTrue($this->qrcode->isByte("\x01\x02\x03"));
+ $this::assertTrue($this->qrcode->isByte(' ')); // not empty!
+ $this::assertTrue($this->qrcode->isByte('0'));
- $this->assertStringContainsString($expected, $this->qrcode->render('test'));
+ $this::assertFalse($this->qrcode->isByte(''));
}
- public function testInitDataInterfaceException(){
+ /**
+ * tests if an exception is thrown when an invalid (built-in) output type is specified
+ */
+ public function testInitDataInterfaceException():void{
$this->expectException(QRCodeOutputException::class);
$this->expectExceptionMessage('invalid output type');
- (new QRCode(new QROptions(['outputType' => 'foo'])))->render('test');
+ $this->options->outputType = 'foo';
+
+ (new QRCode($this->options))->render('test');
}
- public function testGetMatrixException(){
+ /**
+ * tests if an exception is thrown when trying to call getMatrix() without data (empty string, no data set)
+ */
+ public function testGetMatrixException():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('QRCode::getMatrix() No data given.');
$this->qrcode->getMatrix('');
}
- public function testTrim() {
- $m1 = $this->qrcode->getMatrix('hello');
- $m2 = $this->qrcode->getMatrix('hello '); // added space
-
- $this->assertNotEquals($m1, $m2);
- }
-
- public function testImageTransparencyBGDefault(){
- $this->qrcode = $this->reflection->newInstanceArgs([new QROptions(['imageTransparencyBG' => 'foo'])]);
+ /**
+ * test whether stings are trimmed (they are not) - i'm still torn on that (see isByte)
+ */
+ public function testAvoidTrimming():void{
+ $m1 = $this->qrcode->getMatrix('hello')->matrix();
+ $m2 = $this->qrcode->getMatrix('hello ')->matrix(); // added space
- $this->assertSame([255,255,255], $this->getProperty('options')->getValue($this->qrcode)->imageTransparencyBG);
+ $this::assertNotSame($m1, $m2);
}
- public function testCustomOutput(){
-
- $options = new QROptions([
- 'version' => 5,
- 'eccLevel' => QRCode::ECC_L,
- 'outputType' => QRCode::OUTPUT_CUSTOM,
- 'outputInterface' => MyCustomOutput::class,
- ]);
-
- $expected = '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111110111010000101111010000011111110000000010000010111000001101011000001010000010000000010111010101101011000001101011010111010000000010111010110100111110010100111010111010000000010111010000001101011000001101010111010000000010000010100111110010100111110010000010000000011111110101010101010101010101011111110000000000000000010010100111110010100000000000000000011001110000101111010000101111001011110000000000000000111010000101111010000111100010000000001011010100111110010100111110011001010000000010000101111101011000001101011110011110000000000011010100011000001101011000101110100000000011001100001001101011000001101010011010000000010110111110000001101011000001100110100000000010000100100010100111110010100001100100000000011111110111101111010000101111010100110000000011010000111010000101111010000111100100000000010101111111111110010100111110011001000000000010110001110101011000001101011110011010000000001001111100011000001101011000101110010000000011000100110001101011000001101010011100000000001000011001000001101011000001100110000000000011101001011010100111110010100001100000000000010111010001101111010000101111010100110000000011100000001010000101111010000111100000000000000001110110111110010100111110011001000000000000011001011101011000001101011110011100000000011111110101011000001101011001111110110000000000000000110001101011000001101000111100000000011111110001000001101011000011010110000000000010000010101010100111110010101000100100000000010111010111101111010000101111111100110000000010111010011010000101111010001101100010000000010111010000111110010100111100101101100000000010000010101101011000001101001100111100000000011111110101011000001101011000110010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
-
- $this->assertSame($expected, $this->reflection->newInstanceArgs([$options])->render('test'));
- }
+ /**
+ * tests if the data mode is overriden if QROptions::$dataModeOverride is set to a valid value
+ *
+ * @see https://github.com/chillerlan/php-qrcode/issues/39
+ */
+ public function testDataModeOverride():void{
- public function testDataModeOverride(){
- $this->qrcode = $this->reflection->newInstance();
+ // no (or invalid) value set - auto detection
+ $this->options->dataModeOverride = 'foo';
+ $this->qrcode = new QRCode;
- $this->assertInstanceOf(Number::class, $this->qrcode->initDataInterface('123'));
- $this->assertInstanceOf(AlphaNum::class, $this->qrcode->initDataInterface('ABC123'));
- $this->assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+ $this::assertInstanceOf(Number::class, $this->qrcode->initDataInterface('123'));
+ $this::assertInstanceOf(AlphaNum::class, $this->qrcode->initDataInterface('ABC123'));
+ $this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+ $this::assertInstanceOf(Kanji::class, $this->qrcode->initDataInterface('茗荷'));
- $this->qrcode = $this->reflection->newInstanceArgs([new QROptions(['dataMode' => 'Byte'])]);
+ // data mode set: force the given data mode
+ $this->options->dataModeOverride = 'Byte';
+ $this->qrcode = new QRCode($this->options);
- $this->assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('123'));
- $this->assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('ABC123'));
- $this->assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+ $this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('123'));
+ $this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('ABC123'));
+ $this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface(random_bytes(32)));
+ $this::assertInstanceOf(Byte::class, $this->qrcode->initDataInterface('茗荷'));
}
- public function testDataModeOverrideError(){
+ /**
+ * tests if an exception is thrown when an invalid character occurs when forcing a data mode other than Byte
+ */
+ public function testDataModeOverrideError():void{
$this->expectException(QRCodeDataException::class);
$this->expectExceptionMessage('illegal char:');
- $this->qrcode = $this->reflection->newInstanceArgs([new QROptions(['dataMode' => 'AlphaNum'])]);
+ $this->options->dataModeOverride = 'AlphaNum';
- $this->qrcode->initDataInterface(random_bytes(32));
+ (new QRCode($this->options))->initDataInterface(random_bytes(32));
}
}
diff --git a/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php b/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php
index 41bf69ced..3a0260623 100644
--- a/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php
+++ b/vendor/chillerlan/php-qrcode/tests/QROptionsTest.php
@@ -8,6 +8,8 @@
* @author smiley <[email protected]>
* @copyright 2018 smiley
* @license MIT
+ *
+ * @noinspection PhpUnusedLocalVariableInspection
*/
namespace chillerlan\QRCodeTest;
@@ -15,66 +17,128 @@ namespace chillerlan\QRCodeTest;
use chillerlan\QRCode\{QRCode, QRCodeException, QROptions};
use PHPUnit\Framework\TestCase;
+/**
+ * QROptions test
+ */
class QROptionsTest extends TestCase{
/**
- * @var \chillerlan\QRCode\QROptions
+ * @see testVersionClamp()
+ * @return int[][]
+ * @internal
+ */
+ public function VersionProvider():array{
+ return [
+ 'values > 40 should be clamped to 40' => [42, 40],
+ 'values < 1 should be clamped to 1' => [-42, 1],
+ 'values in between shold not be touched' => [21, 21],
+ 'value -1 should be treated as is (default)' => [QRCode::VERSION_AUTO, -1],
+ ];
+ }
+
+ /**
+ * Tests the $version clamping
+ *
+ * @dataProvider VersionProvider
+ */
+ public function testVersionClamp(int $version, int $expected):void{
+ $o = new QROptions(['version' => $version]);
+
+ $this::assertSame($expected, $o->version);
+ }
+
+ /**
+ * @see testVersionMinMaxClamp()
+ * @return int[][]
+ * @internal
+ */
+ public function VersionMinMaxProvider():array{
+ return [
+ 'normal clamp' => [5, 10, 5, 10],
+ 'exceeding values' => [-42, 42, 1, 40],
+ 'min > max' => [10, 5, 5, 10],
+ 'min > max, exceeding' => [42, -42, 1, 40],
+ ];
+ }
+
+ /**
+ * Tests the $versionMin/$versionMax clamping
+ *
+ * @dataProvider VersionMinMaxProvider
*/
- protected $options;
+ public function testVersionMinMaxClamp(int $versionMin, int $versionMax, int $expectedMin, int $expectedMax):void{
+ $o = new QROptions(['versionMin' => $versionMin, 'versionMax' => $versionMax]);
- public function testVersionClamp(){
- $this->assertSame(40, (new QROptions(['version' => 42]))->version);
- $this->assertSame(1, (new QROptions(['version' => -42]))->version);
- $this->assertSame(21, (new QROptions(['version' => 21]))->version);
- $this->assertSame(QRCode::VERSION_AUTO, (new QROptions)->version); // QRCode::VERSION_AUTO = -1, default
+ $this::assertSame($expectedMin, $o->versionMin);
+ $this::assertSame($expectedMax, $o->versionMax);
}
- public function testVersionMinMaxClamp(){
- // normal clamp
- $o = new QROptions(['versionMin' => 5, 'versionMax' => 10]);
- $this->assertSame(5, $o->versionMin);
- $this->assertSame(10, $o->versionMax);
-
- // exceeding values
- $o = new QROptions(['versionMin' => -42, 'versionMax' => 42]);
- $this->assertSame(1, $o->versionMin);
- $this->assertSame(40, $o->versionMax);
-
- // min > max
- $o = new QROptions(['versionMin' => 10, 'versionMax' => 5]);
- $this->assertSame(5, $o->versionMin);
- $this->assertSame(10, $o->versionMax);
-
- $o = new QROptions(['versionMin' => 42, 'versionMax' => -42]);
- $this->assertSame(1, $o->versionMin);
- $this->assertSame(40, $o->versionMax);
+ /**
+ * @see testMaskPatternClamp()
+ * @return int[][]
+ * @internal
+ */
+ public function MaskPatternProvider():array{
+ return [
+ 'exceed max' => [42, 7,],
+ 'exceed min' => [-42, 0],
+ 'default (-1)' => [QRCode::MASK_PATTERN_AUTO, -1],
+ ];
}
- public function testMaskPatternClamp(){
- $this->assertSame(7, (new QROptions(['maskPattern' => 42]))->maskPattern);
- $this->assertSame(0, (new QROptions(['maskPattern' => -42]))->maskPattern);
- $this->assertSame(QRCode::MASK_PATTERN_AUTO, (new QROptions)->maskPattern); // QRCode::MASK_PATTERN_AUTO = -1, default
+ /**
+ * Tests the $maskPattern clamping
+ *
+ * @dataProvider MaskPatternProvider
+ */
+ public function testMaskPatternClamp(int $maskPattern, int $expected):void{
+ $o = new QROptions(['maskPattern' => $maskPattern]);
+
+ $this::assertSame($expected, $o->maskPattern);
}
- public function testInvalidEccLevelException(){
+ /**
+ * Tests if an exception is thrown on an incorrect ECC level
+ */
+ public function testInvalidEccLevelException():void{
$this->expectException(QRCodeException::class);
$this->expectExceptionMessage('Invalid error correct level: 42');
- new QROptions(['eccLevel' => 42]);
+ $o = new QROptions(['eccLevel' => 42]);
+ }
+
+ /**
+ * @see testClampRGBValues()
+ * @return int[][][]
+ * @internal
+ */
+ public function RGBProvider():array{
+ return [
+ 'exceeding values' => [[-1, 0, 999], [0, 0 ,255]],
+ 'too few values' => [[1, 2], [255, 255, 255]],
+ 'too many values' => [[1, 2, 3, 4, 5], [1, 2, 3]],
+ ];
}
- public function testClampRGBValues(){
- $o = new QROptions(['imageTransparencyBG' => [-1, 0, 999]]);
+ /**
+ * Tests clamping of the RGB values for $imageTransparencyBG
+ *
+ * @dataProvider RGBProvider
+ */
+ public function testClampRGBValues(array $rgb, array $expected):void{
+ $o = new QROptions(['imageTransparencyBG' => $rgb]);
- $this->assertSame(0, $o->imageTransparencyBG[0]);
- $this->assertSame(0, $o->imageTransparencyBG[1]);
- $this->assertSame(255, $o->imageTransparencyBG[2]);
+ $this::assertSame($expected, $o->imageTransparencyBG);
}
- public function testInvalidRGBValueException(){
+ /**
+ * Tests if an exception is thrown when a non-numeric RGB value was encoutered
+ */
+ public function testInvalidRGBValueException():void{
$this->expectException(QRCodeException::class);
$this->expectExceptionMessage('Invalid RGB value.');
- new QROptions(['imageTransparencyBG' => ['r', 'g', 'b']]);
+ $o = new QROptions(['imageTransparencyBG' => ['r', 'g', 'b']]);
}
+
}
diff --git a/vendor/chillerlan/php-qrcode/tests/QRTestAbstract.php b/vendor/chillerlan/php-qrcode/tests/QRTestAbstract.php
deleted file mode 100644
index 7b9eb8049..000000000
--- a/vendor/chillerlan/php-qrcode/tests/QRTestAbstract.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * Class QRTestAbstract
- *
- * @filesource QRTestAbstract.php
- * @created 17.11.2017
- * @package chillerlan\QRCodeTest
- * @author Smiley <[email protected]>
- * @copyright 2017 Smiley
- * @license MIT
- */
-
-namespace chillerlan\QRCodeTest;
-
-use PHPUnit\Framework\TestCase;
-use ReflectionClass, ReflectionMethod, ReflectionProperty;
-
-abstract class QRTestAbstract extends TestCase{
-
- /**
- * @var \ReflectionClass
- */
- protected $reflection;
-
- /**
- * @var string
- */
- protected $FQCN;
-
- protected function setUp():void{
- $this->reflection = new ReflectionClass($this->FQCN);
- }
-
- /**
- * @param string $method
- *
- * @return \ReflectionMethod
- */
- protected function getMethod(string $method):ReflectionMethod {
- $method = $this->reflection->getMethod($method);
- $method->setAccessible(true);
-
- return $method;
- }
-
- /**
- * @param string $property
- *
- * @return \ReflectionProperty
- */
- protected function getProperty(string $property):ReflectionProperty{
- $property = $this->reflection->getProperty($property);
- $property->setAccessible(true);
-
- return $property;
- }
-
- /**
- * @param $object
- * @param string $property
- * @param $value
- *
- * @return void
- */
- protected function setProperty($object, string $property, $value){
- $property = $this->getProperty($property);
- $property->setAccessible(true);
- $property->setValue($object, $value);
- }
-
-
-}
diff --git a/vendor/chillerlan/php-settings-container/.github/FUNDING.yml b/vendor/chillerlan/php-settings-container/.github/FUNDING.yml
new file mode 100644
index 000000000..16a077f52
--- /dev/null
+++ b/vendor/chillerlan/php-settings-container/.github/FUNDING.yml
@@ -0,0 +1,2 @@
+ko_fi: codemasher
+custom: "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4"
diff --git a/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml b/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml
new file mode 100644
index 000000000..8f108f0dd
--- /dev/null
+++ b/vendor/chillerlan/php-settings-container/.github/workflows/tests.yml
@@ -0,0 +1,105 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+# https://github.com/sebastianbergmann/phpunit/blob/master/.github/workflows/ci.yml
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+
+name: "CI"
+
+jobs:
+
+ static-code-analysis:
+ name: "Static Code Analysis"
+
+ runs-on: ubuntu-latest
+
+ env:
+ PHAN_ALLOW_XDEBUG: 0
+ PHAN_DISABLE_XDEBUG_WARN: 1
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v3
+
+ - name: "Install PHP"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: "7.4"
+ tools: pecl
+ coverage: none
+ extensions: ast, json
+
+ - name: "Update dependencies with composer"
+ run: composer update --no-interaction --no-ansi --no-progress --no-suggest
+
+ - name: "Run phan"
+ run: php vendor/bin/phan
+
+ build-docs:
+ name: "Build and publish Docs"
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: "Checkout sources"
+ uses: actions/checkout@v3
+
+ - name: "Install PHP"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: "8.1"
+ coverage: none
+ tools: phpDocumentor
+ extensions: json
+
+ - name: "Build Docs"
+ run: phpdoc --config=phpdoc.xml
+
+ - name: "Publish Docs to gh-pages"
+ uses: JamesIves/[email protected]
+ with:
+ branch: gh-pages
+ folder: docs
+ clean: true
+
+ tests:
+ name: "Unit Tests"
+
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-latest
+ - windows-latest
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v3
+
+ - name: "Install PHP with extensions"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-version }}
+ coverage: pcov
+ extensions: json
+
+ - name: "Install dependencies with composer"
+ run: composer update --no-ansi --no-interaction --no-progress --no-suggest
+
+ - name: "Run tests with phpunit"
+ run: php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml
+
+ - name: "Send code coverage report to Codecov.io"
+ uses: codecov/codecov-action@v3
diff --git a/vendor/chillerlan/php-settings-container/.gitignore b/vendor/chillerlan/php-settings-container/.gitignore
index e313cba45..142dd453a 100644
--- a/vendor/chillerlan/php-settings-container/.gitignore
+++ b/vendor/chillerlan/php-settings-container/.gitignore
@@ -1,4 +1,4 @@
-.idea
-.vendor
+/.build
+/.idea
+/vendor
composer.lock
-*.phpunit.result.cache
diff --git a/vendor/chillerlan/php-settings-container/.phan/config.php b/vendor/chillerlan/php-settings-container/.phan/config.php
new file mode 100644
index 000000000..468bd9983
--- /dev/null
+++ b/vendor/chillerlan/php-settings-container/.phan/config.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * This configuration will be read and overlaid on top of the
+ * default configuration. Command-line arguments will be applied
+ * after this file is read.
+ */
+return [
+ // Supported values: `'5.6'`, `'7.0'`, `'7.1'`, `'7.2'`, `'7.3'`,
+ // `'7.4'`, `null`.
+ // If this is set to `null`,
+ // then Phan assumes the PHP version which is closest to the minor version
+ // of the php executable used to execute Phan.
+ //
+ // Note that the **only** effect of choosing `'5.6'` is to infer
+ // that functions removed in php 7.0 exist.
+ // (See `backward_compatibility_checks` for additional options)
+ 'target_php_version' => '7.4',
+
+ // A list of directories that should be parsed for class and
+ // method information. After excluding the directories
+ // defined in exclude_analysis_directory_list, the remaining
+ // files will be statically analyzed for errors.
+ //
+ // Thus, both first-party and third-party code being used by
+ // your application should be included in this list.
+ 'directory_list' => [
+ 'examples',
+ 'src',
+ 'tests',
+ 'vendor',
+ ],
+
+ // A regex used to match every file name that you want to
+ // exclude from parsing. Actual value will exclude every
+ // "test", "tests", "Test" and "Tests" folders found in
+ // "vendor/" directory.
+ 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
+
+ // A directory list that defines files that will be excluded
+ // from static analysis, but whose class and method
+ // information should be included.
+ //
+ // Generally, you'll want to include the directories for
+ // third-party code (such as "vendor/") in this list.
+ //
+ // n.b.: If you'd like to parse but not analyze 3rd
+ // party code, directories containing that code
+ // should be added to both the `directory_list`
+ // and `exclude_analysis_directory_list` arrays.
+ 'exclude_analysis_directory_list' => [
+ 'tests',
+ 'vendor',
+ ],
+];
diff --git a/vendor/chillerlan/php-settings-container/.scrutinizer.yml b/vendor/chillerlan/php-settings-container/.scrutinizer.yml
index 7fdd2a4dc..daeb475f4 100644
--- a/vendor/chillerlan/php-settings-container/.scrutinizer.yml
+++ b/vendor/chillerlan/php-settings-container/.scrutinizer.yml
@@ -1,3 +1,12 @@
+build:
+ nodes:
+ analysis:
+ tests:
+ override:
+ - php-scrutinizer-run
+ environment:
+ php: 8.0.0
+
filter:
excluded_paths:
- examples/*
diff --git a/vendor/chillerlan/php-settings-container/.travis.yml b/vendor/chillerlan/php-settings-container/.travis.yml
deleted file mode 100644
index c2ad210ed..000000000
--- a/vendor/chillerlan/php-settings-container/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-language: php
-
-matrix:
- include:
- - php: 7.2
- - php: 7.3
- - php: 7.4
- - php: 8.0
- - php: nightly
- allow_failures:
- - php: nightly
-
-
-before_script: travis_retry composer install --no-interaction --prefer-source
-
-script: vendor/bin/phpunit --configuration phpunit.xml --coverage-clover clover.xml
-
-after_script: bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/chillerlan/php-settings-container/README.md b/vendor/chillerlan/php-settings-container/README.md
index f3bb26c5e..579696b6e 100644
--- a/vendor/chillerlan/php-settings-container/README.md
+++ b/vendor/chillerlan/php-settings-container/README.md
@@ -1,52 +1,46 @@
# chillerlan/php-settings-container
-A container class for immutable settings objects. Not a DI container. PHP 7.2+
-- [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerInterface.php) provides immutable properties with magic getter & setter and some fancy
+A container class for immutable settings objects. Not a DI container. PHP 7.4+
+- [`SettingsContainerInterface`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerInterface.php) provides immutable properties with magic getter & setter and some fancy - decouple configuration logic from your application!
+[![PHP Version Support][php-badge]][php]
[![version][packagist-badge]][packagist]
[![license][license-badge]][license]
-[![Travis][travis-badge]][travis]
[![Coverage][coverage-badge]][coverage]
[![Scrunitizer][scrutinizer-badge]][scrutinizer]
[![Packagist downloads][downloads-badge]][downloads]
-[![PayPal donate][donate-badge]][donate]
+[![Continuous Integration][gh-action-badge]][gh-action]
-[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-settings-container.svg?style=flat-square
+[php-badge]: https://img.shields.io/packagist/php-v/chillerlan/php-settings-container?logo=php&color=8892BF
+[php]: https://www.php.net/supported-versions.php
+[packagist-badge]: https://img.shields.io/packagist/v/chillerlan/php-settings-container.svg?logo=packagist
[packagist]: https://packagist.org/packages/chillerlan/php-settings-container
-[license-badge]: https://img.shields.io/github/license/chillerlan/php-settings-container.svg?style=flat-square
-[license]: https://github.com/chillerlan/php-settings-container/blob/master/LICENSE
-[travis-badge]: https://img.shields.io/travis/chillerlan/php-settings-container.svg?style=flat-square
-[travis]: https://travis-ci.org/chillerlan/php-settings-container
-[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-settings-container.svg?style=flat-square
+[license-badge]: https://img.shields.io/github/license/chillerlan/php-settings-container.svg
+[license]: https://github.com/chillerlan/php-settings-container/blob/main/LICENSE
+[coverage-badge]: https://img.shields.io/codecov/c/github/chillerlan/php-settings-container.svg?logo=codecov
[coverage]: https://codecov.io/github/chillerlan/php-settings-container
-[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-settings-container.svg?style=flat-square
+[scrutinizer-badge]: https://img.shields.io/scrutinizer/g/chillerlan/php-settings-container.svg?logo=scrutinizer
[scrutinizer]: https://scrutinizer-ci.com/g/chillerlan/php-settings-container
-[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-settings-container.svg?style=flat-square
+[downloads-badge]: https://img.shields.io/packagist/dt/chillerlan/php-settings-container.svg?logo=packagist
[downloads]: https://packagist.org/packages/chillerlan/php-settings-container/stats
-[donate-badge]: https://img.shields.io/badge/donate-paypal-ff33aa.svg?style=flat-square
-[donate]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=WLYUNAT9ZTJZ4
+[gh-action-badge]: https://github.com/chillerlan/php-settings-container/workflows/CI/badge.svg
+[gh-action]: https://github.com/chillerlan/php-settings-container/actions?query=workflow%3A%22CI%22
## Documentation
### Installation
**requires [composer](https://getcomposer.org)**
-*composer.json* (note: replace `dev-master` with a version boundary)
+*composer.json* (note: replace `dev-main` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^2.1` - see [releases](https://github.com/chillerlan/php-settings-container/releases) for valid versions)
```json
{
"require": {
- "php": "^7.2",
- "chillerlan/php-settings-container": "^1.0"
+ "php": "^7.4 || ^8.0",
+ "chillerlan/php-settings-container": "dev-main"
}
}
```
-### Manual installation
-Download the desired version of the package from [master](https://github.com/chillerlan/php-settings-container/archive/master.zip) or
-[release](https://github.com/chillerlan/php-settings-container/releases) and extract the contents to your project folder. After that:
-- run `composer install` to install the required dependencies and generate `/vendor/autoload.php`.
-- if you use a custom autoloader, point the namespace `chillerlan\Settings` to the folder `src` of the package
-
Profit!
## Usage
@@ -140,7 +134,7 @@ var_dump($container->what); // -> md5 hash of "some value"
### API
-#### [`SettingsContainerAbstract`](https://github.com/chillerlan/php-settings-container/blob/master/src/SettingsContainerAbstract.php)
+#### [`SettingsContainerAbstract`](https://github.com/chillerlan/php-settings-container/blob/main/src/SettingsContainerAbstract.php)
method | return | info
-------- | ---- | -----------
diff --git a/vendor/chillerlan/php-settings-container/composer.json b/vendor/chillerlan/php-settings-container/composer.json
index 4464e6e8a..1d89b6c41 100644
--- a/vendor/chillerlan/php-settings-container/composer.json
+++ b/vendor/chillerlan/php-settings-container/composer.json
@@ -1,12 +1,12 @@
{
"name": "chillerlan/php-settings-container",
- "description": "A container class for immutable settings objects. Not a DI container. PHP 7.2+",
+ "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-settings-container",
"license": "MIT",
"type": "library",
"minimum-stability": "stable",
"keywords": [
- "php7", "helper", "container", "settings"
+ "php7", "helper", "container", "settings", "configuration"
],
"authors": [
{
@@ -20,11 +20,12 @@
"source": "https://github.com/chillerlan/php-settings-container"
},
"require": {
- "php": "^7.2 || ^8.0",
+ "php": "^7.4 || ^8.0",
"ext-json": "*"
},
"require-dev": {
- "phpunit/phpunit": "^8.4"
+ "phan/phan": "^5.3",
+ "phpunit/phpunit": "^9.5"
},
"autoload": {
"psr-4": {
@@ -36,5 +37,14 @@
"chillerlan\\SettingsTest\\": "tests/",
"chillerlan\\SettingsExamples\\": "examples/"
}
+ },
+ "scripts": {
+ "phpunit": "@php vendor/bin/phpunit",
+ "phan": "@php vendor/bin/phan"
+ },
+ "config": {
+ "lock": false,
+ "sort-packages": true,
+ "platform-check": true
}
}
diff --git a/vendor/chillerlan/php-settings-container/docs/Readme.md b/vendor/chillerlan/php-settings-container/docs/Readme.md
new file mode 100644
index 000000000..7749a1e7f
--- /dev/null
+++ b/vendor/chillerlan/php-settings-container/docs/Readme.md
@@ -0,0 +1,13 @@
+# Auto generated API documentation
+
+The API documentation can be auto generated with [phpDocumentor](https://www.phpdoc.org/).
+There is an [online version available](https://chillerlan.github.io/php-settings-container/) via the [gh-pages branch](https://github.com/chillerlan/php-settings-container/tree/gh-pages) that is [automatically deployed](https://github.com/chillerlan/php-settings-container/deployments) on each push to main.
+
+Locally created docs will appear in this directory. If you'd like to create local docs, please follow these steps:
+
+- [download phpDocumentor](https://github.com/phpDocumentor/phpDocumentor/releases) v3+ as .phar archive
+- run it in the repository root directory:
+ - on Windows `c:\path\to\php.exe c:\path\to\phpDocumentor.phar --config=phpdoc.xml`
+ - on Linux just `php /path/to/phpDocumentor.phar --config=phpdoc.xml`
+- open [index.html](./index.html) in a browser
+- profit!
diff --git a/vendor/chillerlan/php-settings-container/examples/advanced.php b/vendor/chillerlan/php-settings-container/examples/advanced.php
index 1030b0a29..f11642c83 100644
--- a/vendor/chillerlan/php-settings-container/examples/advanced.php
+++ b/vendor/chillerlan/php-settings-container/examples/advanced.php
@@ -1,6 +1,5 @@
<?php
/**
- * @filesource advanced.php
* @created 28.08.2018
* @author smiley <[email protected]>
* @copyright 2018 smiley
@@ -15,7 +14,7 @@ require_once __DIR__.'/../vendor/autoload.php';
// from library #1
trait SomeOptions{
- protected $foo;
+ protected string $foo = '';
// this method will be called in SettingsContainerAbstract::__construct() after the properties have been set
protected function SomeOptions(){
@@ -26,7 +25,7 @@ trait SomeOptions{
// from library #2
trait MoreOptions{
- protected $bar = 'whatever'; // provide default values
+ protected string $bar = 'whatever'; // provide default values
}
$commonOptions = [
@@ -37,10 +36,16 @@ $commonOptions = [
];
// now plug the several library options together to a single object
-/** @var \chillerlan\Settings\SettingsContainerInterface $container */
-$container = new class ($commonOptions) extends SettingsContainerAbstract{
+
+/**
+ * @property string $foo
+ * @property string $bar
+ */
+class MySettings extends SettingsContainerAbstract{
use SomeOptions, MoreOptions; // ...
};
+$container = new MySettings($commonOptions);
+
var_dump($container->foo); // -> WHATEVER (constructor ran strtoupper on the value)
var_dump($container->bar); // -> nothing
diff --git a/vendor/chillerlan/php-settings-container/examples/simple.php b/vendor/chillerlan/php-settings-container/examples/simple.php
index d8d81095b..acdbe4cb3 100644
--- a/vendor/chillerlan/php-settings-container/examples/simple.php
+++ b/vendor/chillerlan/php-settings-container/examples/simple.php
@@ -1,6 +1,5 @@
<?php
/**
- * @filesource simple.php
* @created 28.08.2018
* @author smiley <[email protected]>
* @copyright 2018 smiley
diff --git a/vendor/chillerlan/php-settings-container/phpdoc.xml b/vendor/chillerlan/php-settings-container/phpdoc.xml
new file mode 100644
index 000000000..d440f1d8a
--- /dev/null
+++ b/vendor/chillerlan/php-settings-container/phpdoc.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<phpdoc>
+ <parser>
+ <target>docs</target>
+ <encoding>utf8</encoding>
+ <markers>
+ <item>TODO</item>
+ </markers>
+ </parser>
+ <transformer>
+ <target>docs</target>
+ </transformer>
+ <files>
+ <directory>src</directory>
+ <directory>tests</directory>
+ </files>
+ <transformations>
+ <template name="responsive-twig"/>
+ </transformations>
+</phpdoc>
diff --git a/vendor/chillerlan/php-settings-container/phpmd.xml b/vendor/chillerlan/php-settings-container/phpmd.xml
deleted file mode 100644
index 3ba7e11b7..000000000
--- a/vendor/chillerlan/php-settings-container/phpmd.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0"?>
-<ruleset name="codemasher/php-settings-container PMD ruleset"
- xmlns="http://pmd.sf.net/ruleset/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
- xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
- <description>codemasher/php-settings-container PMD ruleset</description>
- <exclude-pattern>*/examples/*</exclude-pattern>
- <exclude-pattern>*/tests/*</exclude-pattern>
- <exclude-pattern>*/vendor/*</exclude-pattern>
- <rule ref="rulesets/cleancode.xml">
- <exclude name="BooleanArgumentFlag"/>
- </rule>
- <rule ref="rulesets/codesize.xml/CyclomaticComplexity">
- <priority>1</priority>
- <properties>
- <property name="maximum" value="150" />
- </properties>
- </rule>
- <rule ref="rulesets/controversial.xml">
- <exclude name="CamelCaseMethodName"/>
- <exclude name="CamelCasePropertyName"/>
- <exclude name="CamelCaseParameterName"/>
- <exclude name="CamelCaseVariableName"/>
- </rule>
- <rule ref="rulesets/design.xml">
- </rule>
- <rule ref="rulesets/naming.xml">
- <exclude name="LongVariable"/>
- <exclude name="ShortVariable"/>
- </rule>
- <rule ref="rulesets/unusedcode.xml">
- <exclude name="UnusedFormalParameter"/>
- </rule>
-</ruleset>
diff --git a/vendor/chillerlan/php-settings-container/phpunit.xml b/vendor/chillerlan/php-settings-container/phpunit.xml
index bb05d1289..9271a1bb1 100644
--- a/vendor/chillerlan/php-settings-container/phpunit.xml
+++ b/vendor/chillerlan/php-settings-container/phpunit.xml
@@ -1,22 +1,26 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
- backupStaticAttributes="false"
- bootstrap="vendor/autoload.php"
- colors="true"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- processIsolation="false"
- stopOnFailure="false"
+<?xml version="1.0"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
+ bootstrap="vendor/autoload.php"
+ cacheResultFile=".build/phpunit.result.cache"
+ colors="true"
+ verbose="true"
>
- <filter>
- <whitelist processUncoveredFilesFromWhitelist="true">
- <directory suffix=".php">./src</directory>
- </whitelist>
- </filter>
- <testsuites>
- <testsuite name="php-settings-container test suite">
- <directory suffix=".php">./tests/</directory>
- </testsuite>
- </testsuites>
+ <coverage processUncoveredFiles="true">
+ <include>
+ <directory suffix=".php">./src</directory>
+ </include>
+ <report>
+ <clover outputFile=".build/coverage/clover.xml"/>
+ <xml outputDirectory=".build/coverage/coverage-xml"/>
+ </report>
+ </coverage>
+ <testsuites>
+ <testsuite name="php-settings-container test suite">
+ <directory suffix=".php">./tests/</directory>
+ </testsuite>
+ </testsuites>
+ <logging>
+ <junit outputFile=".build/logs/junit.xml"/>
+ </logging>
</phpunit>
diff --git a/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php b/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php
index 1ccc1a0e2..6b7a1ecc2 100644
--- a/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php
+++ b/vendor/chillerlan/php-settings-container/src/SettingsContainerAbstract.php
@@ -2,9 +2,7 @@
/**
* Class SettingsContainerAbstract
*
- * @filesource SettingsContainerAbstract.php
* @created 28.08.2018
- * @package chillerlan\Settings
* @author Smiley <[email protected]>
* @copyright 2018 Smiley
* @license MIT
@@ -12,16 +10,15 @@
namespace chillerlan\Settings;
-use Exception, ReflectionClass, ReflectionProperty;
+use ReflectionClass, ReflectionProperty;
-use function call_user_func, call_user_func_array, get_object_vars, json_decode, json_encode, method_exists, property_exists;
+use function get_object_vars, json_decode, json_encode, method_exists, property_exists;
+use const JSON_THROW_ON_ERROR;
abstract class SettingsContainerAbstract implements SettingsContainerInterface{
/**
* SettingsContainerAbstract constructor.
- *
- * @param iterable|null $properties
*/
public function __construct(iterable $properties = null){
@@ -35,8 +32,6 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
/**
* calls a method with trait name as replacement constructor for each used trait
* (remember pre-php5 classname constructors? yeah, basically this.)
- *
- * @return void
*/
protected function construct():void{
$traits = (new ReflectionClass($this))->getTraits();
@@ -45,7 +40,7 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
$method = $trait->getShortName();
if(method_exists($this, $method)){
- call_user_func([$this, $method]);
+ $this->{$method}();
}
}
@@ -56,16 +51,17 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
*/
public function __get(string $property){
- if(property_exists($this, $property) && !$this->isPrivate($property)){
+ if(!property_exists($this, $property) || $this->isPrivate($property)){
+ return null;
+ }
- if(method_exists($this, 'get_'.$property)){
- return call_user_func([$this, 'get_'.$property]);
- }
+ $method = 'get_'.$property;
- return $this->{$property};
+ if(method_exists($this, $method)){
+ return $this->{$method}();
}
- return null;
+ return $this->{$property};
}
/**
@@ -77,8 +73,10 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
return;
}
- if(method_exists($this, 'set_'.$property)){
- call_user_func_array([$this, 'set_'.$property], [$value]);
+ $method = 'set_'.$property;
+
+ if(method_exists($this, $method)){
+ $this->{$method}($value);
return;
}
@@ -95,10 +93,6 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
/**
* @internal Checks if a property is private
- *
- * @param string $property
- *
- * @return bool
*/
protected function isPrivate(string $property):bool{
return (new ReflectionProperty($this, $property))->isPrivate();
@@ -152,12 +146,7 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
* @inheritdoc
*/
public function fromJSON(string $json):SettingsContainerInterface{
-
- $data = json_decode($json, true); // as of PHP 7.3: JSON_THROW_ON_ERROR
-
- if($data === false || $data === null){
- throw new Exception('error while decoding JSON');
- }
+ $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
return $this->fromIterable($data);
}
@@ -165,7 +154,8 @@ abstract class SettingsContainerAbstract implements SettingsContainerInterface{
/**
* @inheritdoc
*/
- public function jsonSerialize(){
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize():array{
return $this->toArray();
}
diff --git a/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php b/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php
index 59cef6232..ddacccd29 100644
--- a/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php
+++ b/vendor/chillerlan/php-settings-container/src/SettingsContainerInterface.php
@@ -2,9 +2,7 @@
/**
* Interface SettingsContainerInterface
*
- * @filesource SettingsContainerInterface.php
* @created 28.08.2018
- * @package chillerlan\Settings
* @author Smiley <[email protected]>
* @copyright 2018 Smiley
* @license MIT
@@ -22,9 +20,7 @@ interface SettingsContainerInterface extends JsonSerializable{
/**
* Retrieve the value of $property
*
- * @param string $property
- *
- * @return mixed
+ * @return mixed|null
*/
public function __get(string $property);
@@ -33,69 +29,43 @@ interface SettingsContainerInterface extends JsonSerializable{
*
* @param string $property
* @param mixed $value
- *
- * @return void
*/
public function __set(string $property, $value):void;
/**
* Checks if $property is set (aka. not null), excluding private properties
- *
- * @param string $property
- *
- * @return bool
*/
public function __isset(string $property):bool;
/**
* Unsets $property while avoiding private and non-existing properties
- *
- * @param string $property
- *
- * @return void
*/
public function __unset(string $property):void;
/**
* @see SettingsContainerInterface::toJSON()
- *
- * @return string
*/
public function __toString():string;
/**
* Returns an array representation of the settings object
- *
- * @return array
*/
public function toArray():array;
/**
* Sets properties from a given iterable
- *
- * @param iterable $properties
- *
- * @return \chillerlan\Settings\SettingsContainerInterface
*/
public function fromIterable(iterable $properties):SettingsContainerInterface;
/**
* Returns a JSON representation of the settings object
* @see \json_encode()
- *
- * @param int|null $jsonOptions
- *
- * @return string
*/
public function toJSON(int $jsonOptions = null):string;
/**
* Sets properties from a given JSON string
*
- * @param string $json
- *
- * @return \chillerlan\Settings\SettingsContainerInterface
- *
* @throws \Exception
* @throws \JsonException
*/
diff --git a/vendor/chillerlan/php-settings-container/tests/ContainerTest.php b/vendor/chillerlan/php-settings-container/tests/ContainerTest.php
index ddae538f3..8fca7c3e8 100644
--- a/vendor/chillerlan/php-settings-container/tests/ContainerTest.php
+++ b/vendor/chillerlan/php-settings-container/tests/ContainerTest.php
@@ -2,9 +2,7 @@
/**
* Class ContainerTraitTest
*
- * @filesource ContainerTraitTest.php
* @created 28.08.2018
- * @package chillerlan\SettingsTest
* @author Smiley <[email protected]>
* @copyright 2018 Smiley
* @license MIT
@@ -13,74 +11,86 @@
namespace chillerlan\SettingsTest;
use PHPUnit\Framework\TestCase;
-use Exception, TypeError;
+use JsonException, TypeError;
+use function sha1;
-class ContainerTraitTest extends TestCase{
+class ContainerTest extends TestCase{
public function testConstruct(){
$container = new TestContainer([
'test1' => 'test1',
- 'test2' => 'test2',
+ 'test2' => true,
'test3' => 'test3',
'test4' => 'test4',
]);
- $this->assertSame('test1', $container->test1);
- $this->assertSame('test2', $container->test2);
- $this->assertNull($container->test3);
- $this->assertSame('test4', $container->test4);
+ $this::assertSame('test1', $container->test1);
+ $this::assertSame(true, $container->test2);
+ $this::assertNull($container->test3);
+ $this::assertSame('test4', $container->test4);
- $this->assertSame('success', $container->testConstruct);
+ $this::assertSame('success', $container->testConstruct);
}
public function testGet(){
$container = new TestContainer;
- $this->assertSame('foo', $container->test1);
- $this->assertNull($container->test2);
- $this->assertNull($container->test3);
- $this->assertNull($container->test4);
- $this->assertNull($container->foo);
+ $this::assertSame('foo', $container->test1);
+ $this::assertNull($container->test2);
+ $this::assertNull($container->test3);
+ $this::assertNull($container->test4);
+ $this::assertNull($container->foo);
// isset test
- $this->assertTrue(isset($container->test1));
- $this->assertFalse(isset($container->test2));
- $this->assertFalse(isset($container->test3));
- $this->assertFalse(isset($container->test4));
- $this->assertFalse(isset($container->foo));
+ $this::assertTrue(isset($container->test1));
+ $this::assertFalse(isset($container->test2));
+ $this::assertFalse(isset($container->test3));
+ $this::assertFalse(isset($container->test4));
+ $this::assertFalse(isset($container->foo));
// custom getter
$container->test6 = 'foo';
- $this->assertSame(sha1('foo'), $container->test6);
+ $this::assertSame(sha1('foo'), $container->test6);
// nullable/isset test
$container->test6 = null;
- $this->assertFalse(isset($container->test6));
- $this->assertSame('null', $container->test6);
+ $this::assertFalse(isset($container->test6));
+ $this::assertSame('null', $container->test6);
}
public function testSet(){
$container = new TestContainer;
$container->test1 = 'bar';
- $container->test2 = 'what';
+ $container->test2 = false;
$container->test3 = 'nope';
- $this->assertSame('bar', $container->test1);
- $this->assertSame('what', $container->test2);
- $this->assertNull($container->test3);
+ $this::assertSame('bar', $container->test1);
+ $this::assertSame(false, $container->test2);
+ $this::assertNull($container->test3);
// unset
unset($container->test1);
- $this->assertFalse(isset($container->test1));
+ $this::assertFalse(isset($container->test1));
// custom setter
$container->test5 = 'bar';
- $this->assertSame('bar_test5', $container->test5);
+ $this::assertSame('bar_test5', $container->test5);
}
public function testToArray(){
- $container = new TestContainer(['test1' => 'no', 'test2' => true, 'testConstruct' => 'success']);
+ $container = new TestContainer([
+ 'test1' => 'no',
+ 'test2' => true,
+ 'testConstruct' => 'success',
+ ]);
- $this->assertSame(['test1' => 'no', 'test2' => true, 'testConstruct' => 'success', 'test4' => null, 'test5' => null, 'test6' => null], $container->toArray());
+ $this::assertSame([
+ 'test1' => 'no',
+ 'test2' => true,
+ 'testConstruct' => 'success',
+ 'test4' => null,
+ 'test5' => null,
+ 'test6' => null
+ ], $container->toArray());
}
public function testToJSON(){
@@ -88,12 +98,12 @@ class ContainerTraitTest extends TestCase{
$expected = '{"test1":"no","test2":true,"testConstruct":"success","test4":null,"test5":null,"test6":null}';
- $this->assertSame($expected, $container->toJSON());
- $this->assertSame($expected, (string)$container);
+ $this::assertSame($expected, $container->toJSON());
+ $this::assertSame($expected, (string)$container);
}
public function testFromJsonException(){
- $this->expectException(Exception::class);
+ $this->expectException(JsonException::class);
(new TestContainer)->fromJSON('-');
}
diff --git a/vendor/chillerlan/php-settings-container/tests/TestContainer.php b/vendor/chillerlan/php-settings-container/tests/TestContainer.php
index a35f75277..a83f4bef3 100644
--- a/vendor/chillerlan/php-settings-container/tests/TestContainer.php
+++ b/vendor/chillerlan/php-settings-container/tests/TestContainer.php
@@ -2,9 +2,7 @@
/**
* Class TestContainer
*
- * @filesource TestContainer.php
* @created 28.08.2018
- * @package chillerlan\SettingsTest
* @author Smiley <[email protected]>
* @copyright 2018 Smiley
* @license MIT
@@ -25,5 +23,5 @@ use chillerlan\Settings\SettingsContainerAbstract;
class TestContainer extends SettingsContainerAbstract{
use TestOptionsTrait;
- private $test3 = 'what';
+ private string $test3 = 'what';
}
diff --git a/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php b/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php
index 261f533ac..c8c628b5b 100644
--- a/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php
+++ b/vendor/chillerlan/php-settings-container/tests/TestOptionsTrait.php
@@ -2,9 +2,7 @@
/**
* Trait TestOptionsTrait
*
- * @filesource TestOptionsTrait.php
* @created 28.08.2018
- * @package chillerlan\SettingsTest
* @author smiley <[email protected]>
* @copyright 2018 smiley
* @license MIT
@@ -12,29 +10,31 @@
namespace chillerlan\SettingsTest;
+use function sha1;
+
trait TestOptionsTrait{
- protected $test1 = 'foo';
+ protected string $test1 = 'foo';
- protected $test2;
+ protected ?bool $test2 = null;
- protected $testConstruct;
+ protected string $testConstruct;
- protected $test4;
+ protected ?string $test4 = null;
- protected $test5;
+ protected ?string $test5 = null;
- protected $test6;
+ protected ?string $test6 = null;
- protected function TestOptionsTrait(){
+ protected function TestOptionsTrait():void{
$this->testConstruct = 'success';
}
- protected function set_test5($value){
+ protected function set_test5($value):void{
$this->test5 = $value.'_test5';
}
- protected function get_test6(){
+ protected function get_test6():string{
return $this->test6 === null
? 'null'
: sha1($this->test6);
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index 0cd6055d1..4d989a212 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -42,75 +42,30 @@ namespace Composer\Autoload;
*/
class ClassLoader
{
- /** @var ?string */
private $vendorDir;
// PSR-4
- /**
- * @var array[]
- * @psalm-var array<string, array<string, int>>
- */
private $prefixLengthsPsr4 = array();
- /**
- * @var array[]
- * @psalm-var array<string, array<int, string>>
- */
private $prefixDirsPsr4 = array();
- /**
- * @var array[]
- * @psalm-var array<string, string>
- */
private $fallbackDirsPsr4 = array();
// PSR-0
- /**
- * @var array[]
- * @psalm-var array<string, array<string, string[]>>
- */
private $prefixesPsr0 = array();
- /**
- * @var array[]
- * @psalm-var array<string, string>
- */
private $fallbackDirsPsr0 = array();
- /** @var bool */
private $useIncludePath = false;
-
- /**
- * @var string[]
- * @psalm-var array<string, string>
- */
private $classMap = array();
-
- /** @var bool */
private $classMapAuthoritative = false;
-
- /**
- * @var bool[]
- * @psalm-var array<string, bool>
- */
private $missingClasses = array();
-
- /** @var ?string */
private $apcuPrefix;
- /**
- * @var self[]
- */
private static $registeredLoaders = array();
- /**
- * @param ?string $vendorDir
- */
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
}
- /**
- * @return string[]
- */
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
@@ -120,47 +75,28 @@ class ClassLoader
return array();
}
- /**
- * @return array[]
- * @psalm-return array<string, array<int, string>>
- */
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
- /**
- * @return array[]
- * @psalm-return array<string, string>
- */
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
- /**
- * @return array[]
- * @psalm-return array<string, string>
- */
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
- /**
- * @return string[] Array of classname => path
- * @psalm-var array<string, string>
- */
public function getClassMap()
{
return $this->classMap;
}
/**
- * @param string[] $classMap Class to filename map
- * @psalm-param array<string, string> $classMap
- *
- * @return void
+ * @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
@@ -175,11 +111,9 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 root directories
- * @param bool $prepend Whether to prepend the directories
- *
- * @return void
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
*/
public function add($prefix, $paths, $prepend = false)
{
@@ -222,13 +156,11 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
- * @param bool $prepend Whether to prepend the directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
- *
- * @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
@@ -272,10 +204,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
- * @param string $prefix The prefix
- * @param string[]|string $paths The PSR-0 base directories
- *
- * @return void
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
@@ -290,12 +220,10 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
- * @param string $prefix The prefix/namespace, with trailing '\\'
- * @param string[]|string $paths The PSR-4 base directories
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
- *
- * @return void
*/
public function setPsr4($prefix, $paths)
{
@@ -315,8 +243,6 @@ class ClassLoader
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
- *
- * @return void
*/
public function setUseIncludePath($useIncludePath)
{
@@ -339,8 +265,6 @@ class ClassLoader
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
- *
- * @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
@@ -361,8 +285,6 @@ class ClassLoader
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
- *
- * @return void
*/
public function setApcuPrefix($apcuPrefix)
{
@@ -383,18 +305,14 @@ class ClassLoader
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
- *
- * @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
- return;
- }
-
- if ($prepend) {
+ //no-op
+ } elseif ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
@@ -404,8 +322,6 @@ class ClassLoader
/**
* Unregisters this instance as an autoloader.
- *
- * @return void
*/
public function unregister()
{
@@ -420,7 +336,7 @@ class ClassLoader
* Loads the given class or interface.
*
* @param string $class The name of the class
- * @return true|null True if loaded, null otherwise
+ * @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
@@ -429,8 +345,6 @@ class ClassLoader
return true;
}
-
- return null;
}
/**
@@ -485,11 +399,6 @@ class ClassLoader
return self::$registeredLoaders;
}
- /**
- * @param string $class
- * @param string $ext
- * @return string|false
- */
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
@@ -561,10 +470,6 @@ class ClassLoader
* Scope isolated include.
*
* Prevents access to $this/self from included files.
- *
- * @param string $file
- * @return void
- * @private
*/
function includeFile($file)
{
diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php
index d50e0c9fc..dfab86653 100644
--- a/vendor/composer/InstalledVersions.php
+++ b/vendor/composer/InstalledVersions.php
@@ -18,27 +18,414 @@ use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
- * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
- *
- * To require its presence, you can require `composer-runtime-api ^2.0`
+ * To require it's presence, you can require `composer-runtime-api ^2.0`
*/
class InstalledVersions
{
- /**
- * @var mixed[]|null
- * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
- */
- private static $installed;
-
- /**
- * @var bool|null
- */
+ private static $installed = array (
+ 'root' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '26c67dba776e1e6f8ac40eed70fe79995325863d',
+ 'name' => '__root__',
+ ),
+ 'versions' =>
+ array (
+ '__root__' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '26c67dba776e1e6f8ac40eed70fe79995325863d',
+ ),
+ 'beberlei/assert' =>
+ array (
+ 'pretty_version' => 'v3.3.2',
+ 'version' => '3.3.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
+ ),
+ 'chillerlan/php-qrcode' =>
+ array (
+ 'pretty_version' => '4.3.4',
+ 'version' => '4.3.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
+ ),
+ 'chillerlan/php-settings-container' =>
+ array (
+ 'pretty_version' => '2.1.4',
+ 'version' => '2.1.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
+ ),
+ 'doctrine/instantiator' =>
+ array (
+ 'pretty_version' => '1.4.1',
+ 'version' => '1.4.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
+ ),
+ 'j4mie/idiorm' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '9999999-dev',
+ ),
+ 'reference' => 'efc8ea06698f53e2c479c7696f2b154c47c3a3cb',
+ ),
+ 'mervick/material-design-icons' =>
+ array (
+ 'pretty_version' => '2.2.0',
+ 'version' => '2.2.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
+ ),
+ 'myclabs/deep-copy' =>
+ array (
+ 'pretty_version' => '1.11.0',
+ 'version' => '1.11.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
+ ),
+ 'nikic/php-parser' =>
+ array (
+ 'pretty_version' => 'v4.14.0',
+ 'version' => '4.14.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1',
+ ),
+ 'paragonie/constant_time_encoding' =>
+ array (
+ 'pretty_version' => 'v2.6.3',
+ 'version' => '2.6.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '58c3f47f650c94ec05a151692652a868995d2938',
+ ),
+ 'phar-io/manifest' =>
+ array (
+ 'pretty_version' => '2.0.3',
+ 'version' => '2.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
+ ),
+ 'phar-io/version' =>
+ array (
+ 'pretty_version' => '3.2.1',
+ 'version' => '3.2.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
+ ),
+ 'phpdocumentor/reflection-common' =>
+ array (
+ 'pretty_version' => '2.2.0',
+ 'version' => '2.2.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
+ ),
+ 'phpdocumentor/reflection-docblock' =>
+ array (
+ 'pretty_version' => '5.3.0',
+ 'version' => '5.3.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
+ ),
+ 'phpdocumentor/type-resolver' =>
+ array (
+ 'pretty_version' => '1.6.1',
+ 'version' => '1.6.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '77a32518733312af16a44300404e945338981de3',
+ ),
+ 'phpspec/prophecy' =>
+ array (
+ 'pretty_version' => 'v1.15.0',
+ 'version' => '1.15.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
+ ),
+ 'phpstan/phpstan' =>
+ array (
+ 'pretty_version' => '1.8.2',
+ 'version' => '1.8.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c53312ecc575caf07b0e90dee43883fdf90ca67c',
+ ),
+ 'phpunit/php-code-coverage' =>
+ array (
+ 'pretty_version' => '9.2.15',
+ 'version' => '9.2.15.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
+ ),
+ 'phpunit/php-file-iterator' =>
+ array (
+ 'pretty_version' => '3.0.6',
+ 'version' => '3.0.6.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
+ ),
+ 'phpunit/php-invoker' =>
+ array (
+ 'pretty_version' => '3.1.1',
+ 'version' => '3.1.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
+ ),
+ 'phpunit/php-text-template' =>
+ array (
+ 'pretty_version' => '2.0.4',
+ 'version' => '2.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
+ ),
+ 'phpunit/php-timer' =>
+ array (
+ 'pretty_version' => '5.0.3',
+ 'version' => '5.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
+ ),
+ 'phpunit/phpunit' =>
+ array (
+ 'pretty_version' => '9.5.16',
+ 'version' => '9.5.16.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
+ ),
+ 'sebastian/cli-parser' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
+ ),
+ 'sebastian/code-unit' =>
+ array (
+ 'pretty_version' => '1.0.8',
+ 'version' => '1.0.8.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
+ ),
+ 'sebastian/code-unit-reverse-lookup' =>
+ array (
+ 'pretty_version' => '2.0.3',
+ 'version' => '2.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
+ ),
+ 'sebastian/comparator' =>
+ array (
+ 'pretty_version' => '4.0.6',
+ 'version' => '4.0.6.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
+ ),
+ 'sebastian/complexity' =>
+ array (
+ 'pretty_version' => '2.0.2',
+ 'version' => '2.0.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
+ ),
+ 'sebastian/diff' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
+ ),
+ 'sebastian/environment' =>
+ array (
+ 'pretty_version' => '5.1.4',
+ 'version' => '5.1.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
+ ),
+ 'sebastian/exporter' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
+ ),
+ 'sebastian/global-state' =>
+ array (
+ 'pretty_version' => '5.0.5',
+ 'version' => '5.0.5.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
+ ),
+ 'sebastian/lines-of-code' =>
+ array (
+ 'pretty_version' => '1.0.3',
+ 'version' => '1.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
+ ),
+ 'sebastian/object-enumerator' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
+ ),
+ 'sebastian/object-reflector' =>
+ array (
+ 'pretty_version' => '2.0.4',
+ 'version' => '2.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
+ ),
+ 'sebastian/recursion-context' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
+ ),
+ 'sebastian/resource-operations' =>
+ array (
+ 'pretty_version' => '3.0.3',
+ 'version' => '3.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
+ ),
+ 'sebastian/type' =>
+ array (
+ 'pretty_version' => '2.3.4',
+ 'version' => '2.3.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
+ ),
+ 'sebastian/version' =>
+ array (
+ 'pretty_version' => '3.0.2',
+ 'version' => '3.0.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
+ ),
+ 'spomky-labs/otphp' =>
+ array (
+ 'pretty_version' => 'v10.0.3',
+ 'version' => '10.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '9784d9f7c790eed26e102d6c78f12c754036c366',
+ ),
+ 'thecodingmachine/safe' =>
+ array (
+ 'pretty_version' => 'v2.2.2',
+ 'version' => '2.2.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '440284f9592c9df402832452a6871a8b3c48d97e',
+ ),
+ 'theseer/tokenizer' =>
+ array (
+ 'pretty_version' => '1.2.1',
+ 'version' => '1.2.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
+ ),
+ 'webmozart/assert' =>
+ array (
+ 'pretty_version' => '1.11.0',
+ 'version' => '1.11.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991',
+ ),
+ ),
+);
private static $canGetVendors;
-
- /**
- * @var array[]
- * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
- */
private static $installedByVendor = array();
/**
@@ -54,6 +441,7 @@ class InstalledVersions
$packages[] = array_keys($installed['versions']);
}
+
if (1 === \count($packages)) {
return $packages[0];
}
@@ -62,41 +450,18 @@ class InstalledVersions
}
/**
- * Returns a list of all package names with a specific type e.g. 'library'
- *
- * @param string $type
- * @return string[]
- * @psalm-return list<string>
- */
- public static function getInstalledPackagesByType($type)
- {
- $packagesByType = array();
-
- foreach (self::getInstalled() as $installed) {
- foreach ($installed['versions'] as $name => $package) {
- if (isset($package['type']) && $package['type'] === $type) {
- $packagesByType[] = $name;
- }
- }
- }
-
- return $packagesByType;
- }
-
- /**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
- * @param bool $includeDevRequirements
* @return bool
*/
- public static function isInstalled($packageName, $includeDevRequirements = true)
+ public static function isInstalled($packageName)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
- return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ return true;
}
}
@@ -110,9 +475,10 @@ class InstalledVersions
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
- * @param VersionParser $parser Install composer/semver to have access to this class and functionality
- * @param string $packageName
- * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
+ * @param string $packageName
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+ *
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
@@ -223,25 +589,8 @@ class InstalledVersions
}
/**
- * @param string $packageName
- * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
- */
- public static function getInstallPath($packageName)
- {
- foreach (self::getInstalled() as $installed) {
- if (!isset($installed['versions'][$packageName])) {
- continue;
- }
-
- return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
- }
-
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
- }
-
- /**
* @return array
- * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+ * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}
*/
public static function getRootPackage()
{
@@ -253,39 +602,15 @@ class InstalledVersions
/**
* Returns the raw installed.php data for custom implementations
*
- * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
- * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>}
*/
public static function getRawData()
{
- @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
-
- if (null === self::$installed) {
- // only require the installed.php file if this file is loaded from its dumped location,
- // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
- if (substr(__DIR__, -8, 1) !== 'C') {
- self::$installed = include __DIR__ . '/installed.php';
- } else {
- self::$installed = array();
- }
- }
-
return self::$installed;
}
/**
- * Returns the raw data of all installed.php which are currently loaded for custom implementations
- *
- * @return array[]
- * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
- */
- public static function getAllRawData()
- {
- return self::getInstalled();
- }
-
- /**
* Lets you reload the static array from another file
*
* This is only useful for complex integrations in which a project needs to use
@@ -301,7 +626,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
- * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+ * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>} $data
*/
public static function reload($data)
{
@@ -311,7 +636,6 @@ class InstalledVersions
/**
* @return array[]
- * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
*/
private static function getInstalled()
{
@@ -322,27 +646,16 @@ class InstalledVersions
$installed = array();
if (self::$canGetVendors) {
+ // @phpstan-ignore-next-line
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
- if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
- self::$installed = $installed[count($installed) - 1];
- }
}
}
}
- if (null === self::$installed) {
- // only require the installed.php file if this file is loaded from its dumped location,
- // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
- if (substr(__DIR__, -8, 1) !== 'C') {
- self::$installed = require __DIR__ . '/installed.php';
- } else {
- self::$installed = array();
- }
- }
$installed[] = self::$installed;
return $installed;
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index f27399a04..62ecfd8d0 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,4 +1,3 @@
-
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -18,4 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index fe7d8c4c5..9e751e17c 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -430,6 +430,93 @@ return array(
'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php',
'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php',
'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php',
+ 'Safe\\DateTime' => $vendorDir . '/thecodingmachine/safe/lib/DateTime.php',
+ 'Safe\\DateTimeImmutable' => $vendorDir . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
+ 'Safe\\Exceptions\\ApacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
+ 'Safe\\Exceptions\\ApcException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/ApcException.php',
+ 'Safe\\Exceptions\\ApcuException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
+ 'Safe\\Exceptions\\ArrayException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
+ 'Safe\\Exceptions\\Bzip2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
+ 'Safe\\Exceptions\\CalendarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
+ 'Safe\\Exceptions\\ClassobjException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
+ 'Safe\\Exceptions\\ComException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
+ 'Safe\\Exceptions\\CubridException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
+ 'Safe\\Exceptions\\CurlException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
+ 'Safe\\Exceptions\\DatetimeException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
+ 'Safe\\Exceptions\\DirException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
+ 'Safe\\Exceptions\\EioException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
+ 'Safe\\Exceptions\\ErrorfuncException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
+ 'Safe\\Exceptions\\ExecException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
+ 'Safe\\Exceptions\\FileinfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
+ 'Safe\\Exceptions\\FilesystemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
+ 'Safe\\Exceptions\\FilterException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
+ 'Safe\\Exceptions\\FpmException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
+ 'Safe\\Exceptions\\FtpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
+ 'Safe\\Exceptions\\FunchandException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
+ 'Safe\\Exceptions\\GettextException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GettextException.php',
+ 'Safe\\Exceptions\\GmpException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
+ 'Safe\\Exceptions\\GnupgException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
+ 'Safe\\Exceptions\\HashException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
+ 'Safe\\Exceptions\\IbaseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
+ 'Safe\\Exceptions\\IbmDb2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
+ 'Safe\\Exceptions\\IconvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
+ 'Safe\\Exceptions\\ImageException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
+ 'Safe\\Exceptions\\ImapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
+ 'Safe\\Exceptions\\InfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
+ 'Safe\\Exceptions\\InotifyException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
+ 'Safe\\Exceptions\\JsonException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
+ 'Safe\\Exceptions\\LdapException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
+ 'Safe\\Exceptions\\LibeventException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/LibeventException.php',
+ 'Safe\\Exceptions\\LibxmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
+ 'Safe\\Exceptions\\LzfException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
+ 'Safe\\Exceptions\\MailparseException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
+ 'Safe\\Exceptions\\MbstringException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
+ 'Safe\\Exceptions\\MiscException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
+ 'Safe\\Exceptions\\MssqlException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/MssqlException.php',
+ 'Safe\\Exceptions\\MysqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
+ 'Safe\\Exceptions\\MysqliException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/MysqliException.php',
+ 'Safe\\Exceptions\\NetworkException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
+ 'Safe\\Exceptions\\Oci8Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
+ 'Safe\\Exceptions\\OpcacheException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
+ 'Safe\\Exceptions\\OpensslException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
+ 'Safe\\Exceptions\\OutcontrolException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
+ 'Safe\\Exceptions\\PasswordException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/PasswordException.php',
+ 'Safe\\Exceptions\\PcntlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
+ 'Safe\\Exceptions\\PcreException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
+ 'Safe\\Exceptions\\PgsqlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
+ 'Safe\\Exceptions\\PosixException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
+ 'Safe\\Exceptions\\PsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
+ 'Safe\\Exceptions\\PspellException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
+ 'Safe\\Exceptions\\ReadlineException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
+ 'Safe\\Exceptions\\RpminfoException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
+ 'Safe\\Exceptions\\RrdException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
+ 'Safe\\Exceptions\\SafeExceptionInterface' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
+ 'Safe\\Exceptions\\SemException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
+ 'Safe\\Exceptions\\SessionException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
+ 'Safe\\Exceptions\\ShmopException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
+ 'Safe\\Exceptions\\SimplexmlException' => $vendorDir . '/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php',
+ 'Safe\\Exceptions\\SocketsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
+ 'Safe\\Exceptions\\SodiumException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
+ 'Safe\\Exceptions\\SolrException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
+ 'Safe\\Exceptions\\SplException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
+ 'Safe\\Exceptions\\SqlsrvException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
+ 'Safe\\Exceptions\\SsdeepException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
+ 'Safe\\Exceptions\\Ssh2Exception' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
+ 'Safe\\Exceptions\\StatsException' => $vendorDir . '/thecodingmachine/safe/deprecated/Exceptions/StatsException.php',
+ 'Safe\\Exceptions\\StreamException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
+ 'Safe\\Exceptions\\StringsException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
+ 'Safe\\Exceptions\\SwooleException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
+ 'Safe\\Exceptions\\UodbcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
+ 'Safe\\Exceptions\\UopzException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
+ 'Safe\\Exceptions\\UrlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
+ 'Safe\\Exceptions\\VarException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
+ 'Safe\\Exceptions\\XdiffException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
+ 'Safe\\Exceptions\\XmlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
+ 'Safe\\Exceptions\\XmlrpcException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
+ 'Safe\\Exceptions\\YamlException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
+ 'Safe\\Exceptions\\YazException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
+ 'Safe\\Exceptions\\ZipException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
+ 'Safe\\Exceptions\\ZlibException' => $vendorDir . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
'SebastianBergmann\\CliParser\\AmbiguousOptionException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php',
'SebastianBergmann\\CliParser\\Exception' => $vendorDir . '/sebastian/cli-parser/src/exceptions/Exception.php',
'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => $vendorDir . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 08a5dedbd..99c5d33ff 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -8,13 +8,18 @@ $baseDir = dirname($vendorDir);
return array(
'9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
- '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'a4ecaeafb8cfb009ad0e052c90355e98' => $vendorDir . '/beberlei/assert/lib/Assert/functions.php',
+ '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'51fcf4e06c07cc00c920b44bcd900e7a' => $vendorDir . '/thecodingmachine/safe/deprecated/apc.php',
+ '288267919fedd3829a7732b5fb202197' => $vendorDir . '/thecodingmachine/safe/deprecated/array.php',
+ 'a88cd08cfbf1600f7d5de6e587eee1fa' => $vendorDir . '/thecodingmachine/safe/deprecated/datetime.php',
'47f619d9197b36cf5ab70738d7743fe2' => $vendorDir . '/thecodingmachine/safe/deprecated/libevent.php',
+ '213c1c2258e2e5aa409a0af3e993b3a9' => $vendorDir . '/thecodingmachine/safe/deprecated/password.php',
'ea6bb8a12ef9b68f6ada99058e530760' => $vendorDir . '/thecodingmachine/safe/deprecated/mssql.php',
'9a29089eb3ce41a446744c68a00f118c' => $vendorDir . '/thecodingmachine/safe/deprecated/stats.php',
+ 'd5947c9df62650029c674c79176af68d' => $vendorDir . '/thecodingmachine/safe/deprecated/strings.php',
'72243e5536b63e298acb6476f01f1aff' => $vendorDir . '/thecodingmachine/safe/lib/special_cases.php',
+ '09f92ed6301edc510574c196c2b7d1af' => $vendorDir . '/thecodingmachine/safe/deprecated/mysqli.php',
'3f648889e687f31c52f949ba8a9d0873' => $vendorDir . '/thecodingmachine/safe/generated/apache.php',
'eeb4581d958421a4244aaa4167c6a575' => $vendorDir . '/thecodingmachine/safe/generated/apcu.php',
'04cb0b3c1dac5b5ddb23c14e3d66dbe9' => $vendorDir . '/thecodingmachine/safe/generated/array.php',
@@ -35,6 +40,7 @@ return array(
'fbd163fc68c5faf73d5ed4002ffd836d' => $vendorDir . '/thecodingmachine/safe/generated/fpm.php',
'21b511999d61411fab0692ff8795bbed' => $vendorDir . '/thecodingmachine/safe/generated/ftp.php',
'85fbd73fc92365cd90526b0ea03cae3a' => $vendorDir . '/thecodingmachine/safe/generated/funchand.php',
+ 'a2e4c6dfdbf36f56f1945ddcbd54e289' => $vendorDir . '/thecodingmachine/safe/generated/gettext.php',
'51df9c146e0b7dcbdf358d8abd24dbdc' => $vendorDir . '/thecodingmachine/safe/generated/gmp.php',
'93bb7fe678d7dcfb1322f8e3475a48b0' => $vendorDir . '/thecodingmachine/safe/generated/gnupg.php',
'c171ba99cf316379ff66468392bf4950' => $vendorDir . '/thecodingmachine/safe/generated/hash.php',
@@ -44,7 +50,6 @@ return array(
'c28a05f498c01b810a714f7214b7a8da' => $vendorDir . '/thecodingmachine/safe/generated/image.php',
'8063cd92acdf00fd978b5599eb7cc142' => $vendorDir . '/thecodingmachine/safe/generated/imap.php',
'8bd26dbe768e9c9599edad7b198e5446' => $vendorDir . '/thecodingmachine/safe/generated/info.php',
- '0c577fe603b029d4b65c84376b15dbd5' => $vendorDir . '/thecodingmachine/safe/generated/ingres-ii.php',
'd4362910bde43c0f956b52527effd7d4' => $vendorDir . '/thecodingmachine/safe/generated/inotify.php',
'696ba49197d9b55f0428a12bb5a818e1' => $vendorDir . '/thecodingmachine/safe/generated/json.php',
'9818aaa99c8647c63f8ef62b7a368160' => $vendorDir . '/thecodingmachine/safe/generated/ldap.php',
@@ -53,20 +58,14 @@ return array(
'bdca804bb0904ea9f53f328dfc0bb8a5' => $vendorDir . '/thecodingmachine/safe/generated/mailparse.php',
'b0a3fcac3eaf55445796d6af26b89366' => $vendorDir . '/thecodingmachine/safe/generated/mbstring.php',
'98de16b8db03eb0cb4d318b4402215a6' => $vendorDir . '/thecodingmachine/safe/generated/misc.php',
- 'c112440003b56e243b192c11fa9d836e' => $vendorDir . '/thecodingmachine/safe/generated/msql.php',
'7cefd81607cd21b8b3a15656eb6465f5' => $vendorDir . '/thecodingmachine/safe/generated/mysql.php',
- 'aaf438b080089c6d0686679cd34aa72e' => $vendorDir . '/thecodingmachine/safe/generated/mysqli.php',
- 'df0ef890e9afbf95f3924feb1c7a89f3' => $vendorDir . '/thecodingmachine/safe/generated/mysqlndMs.php',
- 'db595fee5972867e45c5327010d78735' => $vendorDir . '/thecodingmachine/safe/generated/mysqlndQc.php',
'cbac956836b72483dcff1ac39d5c0a0f' => $vendorDir . '/thecodingmachine/safe/generated/network.php',
'6c8f89dfbdc117d7871f572269363f25' => $vendorDir . '/thecodingmachine/safe/generated/oci8.php',
'169a669966a45c06bf55ed029122729b' => $vendorDir . '/thecodingmachine/safe/generated/opcache.php',
'def61bf4fecd4d4bca7354919cd69302' => $vendorDir . '/thecodingmachine/safe/generated/openssl.php',
'26bb010649a6d32d4120181458aa6ef2' => $vendorDir . '/thecodingmachine/safe/generated/outcontrol.php',
- '1212c201fe43c7492a085b2c71505e0f' => $vendorDir . '/thecodingmachine/safe/generated/password.php',
'002ebcb842e2c0d5b7f67fe64cc93158' => $vendorDir . '/thecodingmachine/safe/generated/pcntl.php',
'86df38612982dade72c7085ce7eca81f' => $vendorDir . '/thecodingmachine/safe/generated/pcre.php',
- '1cacc3e65f82a473fbd5507c7ce4385d' => $vendorDir . '/thecodingmachine/safe/generated/pdf.php',
'1fc22f445c69ea8706e82fce301c0831' => $vendorDir . '/thecodingmachine/safe/generated/pgsql.php',
'c70b42561584f7144bff38cd63c4eef3' => $vendorDir . '/thecodingmachine/safe/generated/posix.php',
'9923214639c32ca5173db03a177d3b63' => $vendorDir . '/thecodingmachine/safe/generated/ps.php',
@@ -77,7 +76,6 @@ return array(
'775b964f72f827a1bf87c65ab5b10800' => $vendorDir . '/thecodingmachine/safe/generated/sem.php',
'816428bd69c29ab5e1ed622af5dca0cd' => $vendorDir . '/thecodingmachine/safe/generated/session.php',
'5093e233bedbefaef0df262bfbab0a5c' => $vendorDir . '/thecodingmachine/safe/generated/shmop.php',
- '01352920b0151f17e671266e44b52536' => $vendorDir . '/thecodingmachine/safe/generated/simplexml.php',
'b080617b1d949683c2e37f8f01dc0e15' => $vendorDir . '/thecodingmachine/safe/generated/sockets.php',
'2708aa182ddcfe6ce27c96acaaa40f69' => $vendorDir . '/thecodingmachine/safe/generated/sodium.php',
'f1b96cb260a5baeea9a7285cda82a1ec' => $vendorDir . '/thecodingmachine/safe/generated/solr.php',
@@ -99,5 +97,4 @@ return array(
'4af1dca6db8c527c6eed27bff85ff0e5' => $vendorDir . '/thecodingmachine/safe/generated/yaz.php',
'fe43ca06499ac37bc2dedd823af71eb5' => $vendorDir . '/thecodingmachine/safe/generated/zip.php',
'356736db98a6834f0a886b8d509b0ecd' => $vendorDir . '/thecodingmachine/safe/generated/zlib.php',
- '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 8df0d9930..330e532d3 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -6,12 +6,10 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
- 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
+ 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
'chillerlan\\Settings\\' => array($vendorDir . '/chillerlan/php-settings-container/src'),
'chillerlan\\QRCode\\' => array($vendorDir . '/chillerlan/php-qrcode/src'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
- 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
- 'Safe\\' => array($vendorDir . '/thecodingmachine/safe/lib', $vendorDir . '/thecodingmachine/safe/deprecated', $vendorDir . '/thecodingmachine/safe/generated'),
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'),
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 34b3b7ad0..51b54d2f0 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -22,8 +22,6 @@ class ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056
return self::$loader;
}
- require __DIR__ . '/platform_check.php';
-
spl_autoload_register(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader'));
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index de23ec4b4..4555210e9 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -9,13 +9,18 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
public static $files = array (
'9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
- '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'a4ecaeafb8cfb009ad0e052c90355e98' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/functions.php',
+ '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'51fcf4e06c07cc00c920b44bcd900e7a' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/apc.php',
+ '288267919fedd3829a7732b5fb202197' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/array.php',
+ 'a88cd08cfbf1600f7d5de6e587eee1fa' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/datetime.php',
'47f619d9197b36cf5ab70738d7743fe2' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/libevent.php',
+ '213c1c2258e2e5aa409a0af3e993b3a9' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/password.php',
'ea6bb8a12ef9b68f6ada99058e530760' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/mssql.php',
'9a29089eb3ce41a446744c68a00f118c' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/stats.php',
+ 'd5947c9df62650029c674c79176af68d' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/strings.php',
'72243e5536b63e298acb6476f01f1aff' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/special_cases.php',
+ '09f92ed6301edc510574c196c2b7d1af' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/mysqli.php',
'3f648889e687f31c52f949ba8a9d0873' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apache.php',
'eeb4581d958421a4244aaa4167c6a575' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/apcu.php',
'04cb0b3c1dac5b5ddb23c14e3d66dbe9' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/array.php',
@@ -36,6 +41,7 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'fbd163fc68c5faf73d5ed4002ffd836d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/fpm.php',
'21b511999d61411fab0692ff8795bbed' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ftp.php',
'85fbd73fc92365cd90526b0ea03cae3a' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/funchand.php',
+ 'a2e4c6dfdbf36f56f1945ddcbd54e289' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gettext.php',
'51df9c146e0b7dcbdf358d8abd24dbdc' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gmp.php',
'93bb7fe678d7dcfb1322f8e3475a48b0' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/gnupg.php',
'c171ba99cf316379ff66468392bf4950' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/hash.php',
@@ -45,7 +51,6 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'c28a05f498c01b810a714f7214b7a8da' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/image.php',
'8063cd92acdf00fd978b5599eb7cc142' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/imap.php',
'8bd26dbe768e9c9599edad7b198e5446' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/info.php',
- '0c577fe603b029d4b65c84376b15dbd5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ingres-ii.php',
'd4362910bde43c0f956b52527effd7d4' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/inotify.php',
'696ba49197d9b55f0428a12bb5a818e1' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/json.php',
'9818aaa99c8647c63f8ef62b7a368160' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ldap.php',
@@ -54,20 +59,14 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'bdca804bb0904ea9f53f328dfc0bb8a5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mailparse.php',
'b0a3fcac3eaf55445796d6af26b89366' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mbstring.php',
'98de16b8db03eb0cb4d318b4402215a6' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/misc.php',
- 'c112440003b56e243b192c11fa9d836e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/msql.php',
'7cefd81607cd21b8b3a15656eb6465f5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysql.php',
- 'aaf438b080089c6d0686679cd34aa72e' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqli.php',
- 'df0ef890e9afbf95f3924feb1c7a89f3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqlndMs.php',
- 'db595fee5972867e45c5327010d78735' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/mysqlndQc.php',
'cbac956836b72483dcff1ac39d5c0a0f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/network.php',
'6c8f89dfbdc117d7871f572269363f25' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/oci8.php',
'169a669966a45c06bf55ed029122729b' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/opcache.php',
'def61bf4fecd4d4bca7354919cd69302' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/openssl.php',
'26bb010649a6d32d4120181458aa6ef2' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/outcontrol.php',
- '1212c201fe43c7492a085b2c71505e0f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/password.php',
'002ebcb842e2c0d5b7f67fe64cc93158' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcntl.php',
'86df38612982dade72c7085ce7eca81f' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pcre.php',
- '1cacc3e65f82a473fbd5507c7ce4385d' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pdf.php',
'1fc22f445c69ea8706e82fce301c0831' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/pgsql.php',
'c70b42561584f7144bff38cd63c4eef3' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/posix.php',
'9923214639c32ca5173db03a177d3b63' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/ps.php',
@@ -78,7 +77,6 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'775b964f72f827a1bf87c65ab5b10800' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sem.php',
'816428bd69c29ab5e1ed622af5dca0cd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/session.php',
'5093e233bedbefaef0df262bfbab0a5c' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/shmop.php',
- '01352920b0151f17e671266e44b52536' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/simplexml.php',
'b080617b1d949683c2e37f8f01dc0e15' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sockets.php',
'2708aa182ddcfe6ce27c96acaaa40f69' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/sodium.php',
'f1b96cb260a5baeea9a7285cda82a1ec' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/solr.php',
@@ -100,7 +98,6 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'4af1dca6db8c527c6eed27bff85ff0e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaz.php',
'fe43ca06499ac37bc2dedd823af71eb5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zip.php',
'356736db98a6834f0a886b8d509b0ecd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zlib.php',
- '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
);
public static $prefixLengthsPsr4 = array (
@@ -117,11 +114,6 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
array (
'Webmozart\\Assert\\' => 17,
),
- 'S' =>
- array (
- 'Symfony\\Polyfill\\Ctype\\' => 23,
- 'Safe\\' => 5,
- ),
'P' =>
array (
'Prophecy\\' => 9,
@@ -147,8 +139,8 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'phpDocumentor\\Reflection\\' =>
array (
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
- 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
- 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
+ 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
+ 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
),
'chillerlan\\Settings\\' =>
array (
@@ -162,16 +154,6 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
array (
0 => __DIR__ . '/..' . '/webmozart/assert/src',
),
- 'Symfony\\Polyfill\\Ctype\\' =>
- array (
- 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
- ),
- 'Safe\\' =>
- array (
- 0 => __DIR__ . '/..' . '/thecodingmachine/safe/lib',
- 1 => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated',
- 2 => __DIR__ . '/..' . '/thecodingmachine/safe/generated',
- ),
'Prophecy\\' =>
array (
0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy',
@@ -627,6 +609,93 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php',
'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php',
'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php',
+ 'Safe\\DateTime' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTime.php',
+ 'Safe\\DateTimeImmutable' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/DateTimeImmutable.php',
+ 'Safe\\Exceptions\\ApacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApacheException.php',
+ 'Safe\\Exceptions\\ApcException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/ApcException.php',
+ 'Safe\\Exceptions\\ApcuException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ApcuException.php',
+ 'Safe\\Exceptions\\ArrayException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ArrayException.php',
+ 'Safe\\Exceptions\\Bzip2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Bzip2Exception.php',
+ 'Safe\\Exceptions\\CalendarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CalendarException.php',
+ 'Safe\\Exceptions\\ClassobjException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ClassobjException.php',
+ 'Safe\\Exceptions\\ComException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ComException.php',
+ 'Safe\\Exceptions\\CubridException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/CubridException.php',
+ 'Safe\\Exceptions\\CurlException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/CurlException.php',
+ 'Safe\\Exceptions\\DatetimeException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DatetimeException.php',
+ 'Safe\\Exceptions\\DirException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/DirException.php',
+ 'Safe\\Exceptions\\EioException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/EioException.php',
+ 'Safe\\Exceptions\\ErrorfuncException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ErrorfuncException.php',
+ 'Safe\\Exceptions\\ExecException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ExecException.php',
+ 'Safe\\Exceptions\\FileinfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FileinfoException.php',
+ 'Safe\\Exceptions\\FilesystemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilesystemException.php',
+ 'Safe\\Exceptions\\FilterException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FilterException.php',
+ 'Safe\\Exceptions\\FpmException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FpmException.php',
+ 'Safe\\Exceptions\\FtpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FtpException.php',
+ 'Safe\\Exceptions\\FunchandException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/FunchandException.php',
+ 'Safe\\Exceptions\\GettextException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GettextException.php',
+ 'Safe\\Exceptions\\GmpException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GmpException.php',
+ 'Safe\\Exceptions\\GnupgException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/GnupgException.php',
+ 'Safe\\Exceptions\\HashException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/HashException.php',
+ 'Safe\\Exceptions\\IbaseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbaseException.php',
+ 'Safe\\Exceptions\\IbmDb2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IbmDb2Exception.php',
+ 'Safe\\Exceptions\\IconvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/IconvException.php',
+ 'Safe\\Exceptions\\ImageException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImageException.php',
+ 'Safe\\Exceptions\\ImapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ImapException.php',
+ 'Safe\\Exceptions\\InfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InfoException.php',
+ 'Safe\\Exceptions\\InotifyException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/InotifyException.php',
+ 'Safe\\Exceptions\\JsonException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/JsonException.php',
+ 'Safe\\Exceptions\\LdapException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LdapException.php',
+ 'Safe\\Exceptions\\LibeventException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/LibeventException.php',
+ 'Safe\\Exceptions\\LibxmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LibxmlException.php',
+ 'Safe\\Exceptions\\LzfException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/LzfException.php',
+ 'Safe\\Exceptions\\MailparseException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MailparseException.php',
+ 'Safe\\Exceptions\\MbstringException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MbstringException.php',
+ 'Safe\\Exceptions\\MiscException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MiscException.php',
+ 'Safe\\Exceptions\\MssqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/MssqlException.php',
+ 'Safe\\Exceptions\\MysqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/MysqlException.php',
+ 'Safe\\Exceptions\\MysqliException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/MysqliException.php',
+ 'Safe\\Exceptions\\NetworkException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/NetworkException.php',
+ 'Safe\\Exceptions\\Oci8Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Oci8Exception.php',
+ 'Safe\\Exceptions\\OpcacheException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OpcacheException.php',
+ 'Safe\\Exceptions\\OpensslException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/OpensslException.php',
+ 'Safe\\Exceptions\\OutcontrolException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/OutcontrolException.php',
+ 'Safe\\Exceptions\\PasswordException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/PasswordException.php',
+ 'Safe\\Exceptions\\PcntlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PcntlException.php',
+ 'Safe\\Exceptions\\PcreException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/PcreException.php',
+ 'Safe\\Exceptions\\PgsqlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PgsqlException.php',
+ 'Safe\\Exceptions\\PosixException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PosixException.php',
+ 'Safe\\Exceptions\\PsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PsException.php',
+ 'Safe\\Exceptions\\PspellException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/PspellException.php',
+ 'Safe\\Exceptions\\ReadlineException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ReadlineException.php',
+ 'Safe\\Exceptions\\RpminfoException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RpminfoException.php',
+ 'Safe\\Exceptions\\RrdException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/RrdException.php',
+ 'Safe\\Exceptions\\SafeExceptionInterface' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/SafeExceptionInterface.php',
+ 'Safe\\Exceptions\\SemException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SemException.php',
+ 'Safe\\Exceptions\\SessionException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SessionException.php',
+ 'Safe\\Exceptions\\ShmopException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ShmopException.php',
+ 'Safe\\Exceptions\\SimplexmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php',
+ 'Safe\\Exceptions\\SocketsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SocketsException.php',
+ 'Safe\\Exceptions\\SodiumException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SodiumException.php',
+ 'Safe\\Exceptions\\SolrException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SolrException.php',
+ 'Safe\\Exceptions\\SplException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SplException.php',
+ 'Safe\\Exceptions\\SqlsrvException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SqlsrvException.php',
+ 'Safe\\Exceptions\\SsdeepException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SsdeepException.php',
+ 'Safe\\Exceptions\\Ssh2Exception' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/Ssh2Exception.php',
+ 'Safe\\Exceptions\\StatsException' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/Exceptions/StatsException.php',
+ 'Safe\\Exceptions\\StreamException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StreamException.php',
+ 'Safe\\Exceptions\\StringsException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/StringsException.php',
+ 'Safe\\Exceptions\\SwooleException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/SwooleException.php',
+ 'Safe\\Exceptions\\UodbcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UodbcException.php',
+ 'Safe\\Exceptions\\UopzException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UopzException.php',
+ 'Safe\\Exceptions\\UrlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/UrlException.php',
+ 'Safe\\Exceptions\\VarException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/VarException.php',
+ 'Safe\\Exceptions\\XdiffException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XdiffException.php',
+ 'Safe\\Exceptions\\XmlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlException.php',
+ 'Safe\\Exceptions\\XmlrpcException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/XmlrpcException.php',
+ 'Safe\\Exceptions\\YamlException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YamlException.php',
+ 'Safe\\Exceptions\\YazException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/YazException.php',
+ 'Safe\\Exceptions\\ZipException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZipException.php',
+ 'Safe\\Exceptions\\ZlibException' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/Exceptions/ZlibException.php',
'SebastianBergmann\\CliParser\\AmbiguousOptionException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php',
'SebastianBergmann\\CliParser\\Exception' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/Exception.php',
'SebastianBergmann\\CliParser\\OptionDoesNotAllowArgumentException' => __DIR__ . '/..' . '/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 3a8cda28e..888e9a438 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -2,37 +2,45 @@
"packages": [
{
"name": "beberlei/assert",
- "version": "v3.2.2",
- "version_normalized": "3.2.2.0",
+ "version": "v3.3.2",
+ "version_normalized": "3.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/beberlei/assert.git",
- "reference": "5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01"
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/beberlei/assert/zipball/5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01",
- "reference": "5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01",
+ "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655",
+ "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655",
"shasum": ""
},
"require": {
- "php": "^7"
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": "^7.0 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "*",
- "phpstan/phpstan-shim": "*",
- "phpunit/phpunit": ">=6.0.0 <8"
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=6.0.0",
+ "yoast/phpunit-polyfills": "^0.1.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
},
- "time": "2019-08-23T16:04:58+00:00",
+ "time": "2021-12-16T21:41:27+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "Assert\\": "lib/Assert"
- },
"files": [
"lib/Assert/functions.php"
- ]
+ ],
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -56,38 +64,42 @@
"assertion",
"validation"
],
+ "support": {
+ "issues": "https://github.com/beberlei/assert/issues",
+ "source": "https://github.com/beberlei/assert/tree/v3.3.2"
+ },
"install-path": "../beberlei/assert"
},
{
"name": "chillerlan/php-qrcode",
- "version": "3.4.1",
- "version_normalized": "3.4.1.0",
+ "version": "4.3.4",
+ "version_normalized": "4.3.4.0",
"source": {
"type": "git",
"url": "https://github.com/chillerlan/php-qrcode.git",
- "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9"
+ "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/468603b687a5fe75c1ff33857a45f1726c7b95a9",
- "reference": "468603b687a5fe75c1ff33857a45f1726c7b95a9",
+ "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
+ "reference": "2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d",
"shasum": ""
},
"require": {
- "chillerlan/php-settings-container": "^1.2.2",
+ "chillerlan/php-settings-container": "^2.1.4",
"ext-mbstring": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
- "phan/phan": "^3.2.2",
- "phpunit/phpunit": "^8.5",
+ "phan/phan": "^5.3",
+ "phpunit/phpunit": "^9.5",
"setasign/fpdf": "^1.8.2"
},
"suggest": {
"chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.",
"setasign/fpdf": "Required to use the QR FPDF output."
},
- "time": "2021-09-03T17:54:45+00:00",
+ "time": "2022-07-25T09:12:45+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -114,7 +126,7 @@
"homepage": "https://github.com/chillerlan/php-qrcode/graphs/contributors"
}
],
- "description": "A QR code generator. PHP 7.2+",
+ "description": "A QR code generator. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-qrcode",
"keywords": [
"phpqrcode",
@@ -123,6 +135,10 @@
"qrcode",
"qrcode-generator"
],
+ "support": {
+ "issues": "https://github.com/chillerlan/php-qrcode/issues",
+ "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.4"
+ },
"funding": [
{
"url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
@@ -137,27 +153,28 @@
},
{
"name": "chillerlan/php-settings-container",
- "version": "1.2.2",
- "version_normalized": "1.2.2.0",
+ "version": "2.1.4",
+ "version_normalized": "2.1.4.0",
"source": {
"type": "git",
"url": "https://github.com/chillerlan/php-settings-container.git",
- "reference": "d1b5284d6eb3a767459738bb0b20073f0cb3eeaf"
+ "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/d1b5284d6eb3a767459738bb0b20073f0cb3eeaf",
- "reference": "d1b5284d6eb3a767459738bb0b20073f0cb3eeaf",
+ "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
+ "reference": "1beb7df3c14346d4344b0b2e12f6f9a74feabd4a",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.4"
+ "phan/phan": "^5.3",
+ "phpunit/phpunit": "^9.5"
},
- "time": "2021-09-03T17:33:25+00:00",
+ "time": "2022-07-05T22:32:14+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -176,14 +193,19 @@
"homepage": "https://github.com/codemasher"
}
],
- "description": "A container class for immutable settings objects. Not a DI container. PHP 7.2+",
+ "description": "A container class for immutable settings objects. Not a DI container. PHP 7.4+",
"homepage": "https://github.com/chillerlan/php-settings-container",
"keywords": [
"PHP7",
"Settings",
+ "configuration",
"container",
"helper"
],
+ "support": {
+ "issues": "https://github.com/chillerlan/php-settings-container/issues",
+ "source": "https://github.com/chillerlan/php-settings-container"
+ },
"funding": [
{
"url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4",
@@ -271,18 +293,12 @@
},
{
"name": "j4mie/idiorm",
- "version": "v1.5.7",
- "version_normalized": "1.5.7.0",
+ "version": "dev-master",
+ "version_normalized": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/j4mie/idiorm.git",
- "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/j4mie/idiorm/zipball/d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
- "reference": "d23f97053ef5d0b988a02c6a71eb5c6118b2f5b4",
- "shasum": ""
+ "url": "https://dev.tt-rss.org/fox/idiorm.git",
+ "reference": "efc8ea06698f53e2c479c7696f2b154c47c3a3cb"
},
"require": {
"php": ">=5.2.0"
@@ -291,15 +307,20 @@
"ext-pdo_sqlite": "*",
"phpunit/phpunit": "^4.8"
},
- "time": "2020-04-29T00:37:09+00:00",
+ "time": "2022-03-26T15:19:01+00:00",
+ "default-branch": true,
"type": "library",
- "installation-source": "dist",
+ "installation-source": "source",
"autoload": {
"classmap": [
"idiorm.php"
]
},
- "notification-url": "https://packagist.org/downloads/",
+ "scripts": {
+ "test": [
+ "phpunit -c ./phpunit.xml"
+ ]
+ },
"license": [
"BSD-2-Clause",
"BSD-3-Clause",
@@ -448,17 +469,17 @@
},
{
"name": "nikic/php-parser",
- "version": "v4.13.2",
- "version_normalized": "4.13.2.0",
+ "version": "v4.14.0",
+ "version_normalized": "4.14.0.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077"
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
"shasum": ""
},
"require": {
@@ -469,7 +490,7 @@
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
- "time": "2021-11-30T19:35:32+00:00",
+ "time": "2022-05-31T20:59:12+00:00",
"bin": [
"bin/php-parse"
],
@@ -501,23 +522,23 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
},
"install-path": "../nikic/php-parser"
},
{
"name": "paragonie/constant_time_encoding",
- "version": "v2.4.0",
- "version_normalized": "2.4.0.0",
+ "version": "v2.6.3",
+ "version_normalized": "2.6.3.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/constant_time_encoding.git",
- "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c"
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
- "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938",
"shasum": ""
},
"require": {
@@ -527,7 +548,7 @@
"phpunit/phpunit": "^6|^7|^8|^9",
"vimeo/psalm": "^1|^2|^3|^4"
},
- "time": "2020-12-06T15:14:20+00:00",
+ "time": "2022-06-14T06:56:20+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -810,17 +831,17 @@
},
{
"name": "phpdocumentor/type-resolver",
- "version": "1.6.0",
- "version_normalized": "1.6.0.0",
+ "version": "1.6.1",
+ "version_normalized": "1.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706"
+ "reference": "77a32518733312af16a44300404e945338981de3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706",
- "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
+ "reference": "77a32518733312af16a44300404e945338981de3",
"shasum": ""
},
"require": {
@@ -831,7 +852,7 @@
"ext-tokenizer": "*",
"psalm/phar": "^4.8"
},
- "time": "2022-01-04T19:58:01+00:00",
+ "time": "2022-03-15T21:29:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -857,7 +878,7 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0"
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
},
"install-path": "../phpdocumentor/type-resolver"
},
@@ -933,36 +954,31 @@
},
{
"name": "phpstan/phpstan",
- "version": "1.1.2",
- "version_normalized": "1.1.2.0",
+ "version": "1.8.2",
+ "version_normalized": "1.8.2.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "bcea0ae85868a89d5789c75f012c93129f842934"
+ "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bcea0ae85868a89d5789c75f012c93129f842934",
- "reference": "bcea0ae85868a89d5789c75f012c93129f842934",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c53312ecc575caf07b0e90dee43883fdf90ca67c",
+ "reference": "c53312ecc575caf07b0e90dee43883fdf90ca67c",
"shasum": ""
},
"require": {
- "php": "^7.1|^8.0"
+ "php": "^7.2|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
- "time": "2021-11-09T12:41:09+00:00",
+ "time": "2022-07-20T09:57:31+00:00",
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
"installation-source": "dist",
"autoload": {
"files": [
@@ -974,6 +990,10 @@
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "source": "https://github.com/phpstan/phpstan/tree/1.8.2"
+ },
"funding": [
{
"url": "https://github.com/ondrejmirtes",
@@ -1817,17 +1837,17 @@
},
{
"name": "sebastian/environment",
- "version": "5.1.3",
- "version_normalized": "5.1.3.0",
+ "version": "5.1.4",
+ "version_normalized": "5.1.4.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
"shasum": ""
},
"require": {
@@ -1839,7 +1859,7 @@
"suggest": {
"ext-posix": "*"
},
- "time": "2020-09-28T05:52:38+00:00",
+ "time": "2022-04-03T09:37:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -1871,7 +1891,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
},
"funding": [
{
@@ -2447,17 +2467,17 @@
},
{
"name": "spomky-labs/otphp",
- "version": "v10.0.1",
- "version_normalized": "10.0.1.0",
+ "version": "v10.0.3",
+ "version_normalized": "10.0.3.0",
"source": {
"type": "git",
"url": "https://github.com/Spomky-Labs/otphp.git",
- "reference": "f44cce5a9db4b8da410215d992110482c931232f"
+ "reference": "9784d9f7c790eed26e102d6c78f12c754036c366"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/f44cce5a9db4b8da410215d992110482c931232f",
- "reference": "f44cce5a9db4b8da410215d992110482c931232f",
+ "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366",
+ "reference": "9784d9f7c790eed26e102d6c78f12c754036c366",
"shasum": ""
},
"require": {
@@ -2465,7 +2485,7 @@
"ext-mbstring": "*",
"paragonie/constant_time_encoding": "^2.0",
"php": "^7.2|^8.0",
- "thecodingmachine/safe": "^0.1.14|^1.0"
+ "thecodingmachine/safe": "^0.1.14|^1.0|^2.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.0",
@@ -2475,9 +2495,9 @@
"phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.12",
"phpunit/phpunit": "^8.0",
- "thecodingmachine/phpstan-safe-rule": "^1.0"
+ "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0"
},
- "time": "2020-01-28T09:24:19+00:00",
+ "time": "2022-03-17T08:00:35+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2519,140 +2539,54 @@
],
"support": {
"issues": "https://github.com/Spomky-Labs/otphp/issues",
- "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.1"
+ "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3"
},
"install-path": "../spomky-labs/otphp"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.25.0",
- "version_normalized": "1.25.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "time": "2021-10-20T20:35:02+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "[email protected]"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "install-path": "../symfony/polyfill-ctype"
- },
- {
"name": "thecodingmachine/safe",
- "version": "v1.3.3",
- "version_normalized": "1.3.3.0",
+ "version": "v2.2.2",
+ "version_normalized": "2.2.2.0",
"source": {
"type": "git",
"url": "https://github.com/thecodingmachine/safe.git",
- "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc"
+ "reference": "440284f9592c9df402832452a6871a8b3c48d97e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
- "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/440284f9592c9df402832452a6871a8b3c48d97e",
+ "reference": "440284f9592c9df402832452a6871a8b3c48d97e",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "php": "^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan": "^1.5",
+ "phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.2",
- "thecodingmachine/phpstan-strict-rules": "^0.12"
+ "thecodingmachine/phpstan-strict-rules": "^1.0"
},
- "time": "2020-10-28T17:51:34+00:00",
+ "time": "2022-07-20T17:46:34+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.1-dev"
+ "dev-master": "2.2.x-dev"
}
},
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "Safe\\": [
- "lib/",
- "deprecated/",
- "generated/"
- ]
- },
"files": [
"deprecated/apc.php",
+ "deprecated/array.php",
+ "deprecated/datetime.php",
"deprecated/libevent.php",
+ "deprecated/password.php",
"deprecated/mssql.php",
"deprecated/stats.php",
+ "deprecated/strings.php",
"lib/special_cases.php",
+ "deprecated/mysqli.php",
"generated/apache.php",
"generated/apcu.php",
"generated/array.php",
@@ -2673,6 +2607,7 @@
"generated/fpm.php",
"generated/ftp.php",
"generated/funchand.php",
+ "generated/gettext.php",
"generated/gmp.php",
"generated/gnupg.php",
"generated/hash.php",
@@ -2682,7 +2617,6 @@
"generated/image.php",
"generated/imap.php",
"generated/info.php",
- "generated/ingres-ii.php",
"generated/inotify.php",
"generated/json.php",
"generated/ldap.php",
@@ -2691,20 +2625,14 @@
"generated/mailparse.php",
"generated/mbstring.php",
"generated/misc.php",
- "generated/msql.php",
"generated/mysql.php",
- "generated/mysqli.php",
- "generated/mysqlndMs.php",
- "generated/mysqlndQc.php",
"generated/network.php",
"generated/oci8.php",
"generated/opcache.php",
"generated/openssl.php",
"generated/outcontrol.php",
- "generated/password.php",
"generated/pcntl.php",
"generated/pcre.php",
- "generated/pdf.php",
"generated/pgsql.php",
"generated/posix.php",
"generated/ps.php",
@@ -2715,7 +2643,6 @@
"generated/sem.php",
"generated/session.php",
"generated/shmop.php",
- "generated/simplexml.php",
"generated/sockets.php",
"generated/sodium.php",
"generated/solr.php",
@@ -2737,6 +2664,13 @@
"generated/yaz.php",
"generated/zip.php",
"generated/zlib.php"
+ ],
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "deprecated/Exceptions/",
+ "generated/Exceptions/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2746,7 +2680,7 @@
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
"support": {
"issues": "https://github.com/thecodingmachine/safe/issues",
- "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3"
+ "source": "https://github.com/thecodingmachine/safe/tree/v2.2.2"
},
"install-path": "../thecodingmachine/safe"
},
@@ -2805,22 +2739,22 @@
},
{
"name": "webmozart/assert",
- "version": "1.10.0",
- "version_normalized": "1.10.0.0",
+ "version": "1.11.0",
+ "version_normalized": "1.11.0.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
@@ -2829,7 +2763,7 @@
"require-dev": {
"phpunit/phpunit": "^8.5.13"
},
- "time": "2021-03-09T10:59:23+00:00",
+ "time": "2022-06-03T18:03:27+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -2860,7 +2794,7 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.10.0"
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
"install-path": "../webmozart/assert"
}
@@ -2899,7 +2833,6 @@
"sebastian/resource-operations",
"sebastian/type",
"sebastian/version",
- "symfony/polyfill-ctype",
"theseer/tokenizer",
"webmozart/assert"
]
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 9441de7c6..e3edefa8a 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -1,410 +1,403 @@
-<?php return array(
- 'root' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../../',
- 'aliases' => array(),
- 'reference' => '711662948768492e8d05b778a7d80eacaec368d2',
- 'name' => '__root__',
- 'dev' => true,
- ),
- 'versions' => array(
- '__root__' => array(
- 'pretty_version' => 'dev-master',
- 'version' => 'dev-master',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../../',
- 'aliases' => array(),
- 'reference' => '711662948768492e8d05b778a7d80eacaec368d2',
- 'dev_requirement' => false,
- ),
- 'beberlei/assert' => array(
- 'pretty_version' => 'v3.2.2',
- 'version' => '3.2.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../beberlei/assert',
- 'aliases' => array(),
- 'reference' => '5547e7d03f8c6be121b8b9db6d6ed5a22ffdcb01',
- 'dev_requirement' => false,
- ),
- 'chillerlan/php-qrcode' => array(
- 'pretty_version' => '3.4.1',
- 'version' => '3.4.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../chillerlan/php-qrcode',
- 'aliases' => array(),
- 'reference' => '468603b687a5fe75c1ff33857a45f1726c7b95a9',
- 'dev_requirement' => false,
- ),
- 'chillerlan/php-settings-container' => array(
- 'pretty_version' => '1.2.2',
- 'version' => '1.2.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../chillerlan/php-settings-container',
- 'aliases' => array(),
- 'reference' => 'd1b5284d6eb3a767459738bb0b20073f0cb3eeaf',
- 'dev_requirement' => false,
- ),
- 'doctrine/instantiator' => array(
- 'pretty_version' => '1.4.1',
- 'version' => '1.4.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../doctrine/instantiator',
- 'aliases' => array(),
- 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
- 'dev_requirement' => true,
- ),
- 'j4mie/idiorm' => array(
- 'pretty_version' => 'v1.5.7',
- 'version' => '1.5.7.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../j4mie/idiorm',
- 'aliases' => array(),
- 'reference' => 'd23f97053ef5d0b988a02c6a71eb5c6118b2f5b4',
- 'dev_requirement' => false,
- ),
- 'mervick/material-design-icons' => array(
- 'pretty_version' => '2.2.0',
- 'version' => '2.2.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../mervick/material-design-icons',
- 'aliases' => array(),
- 'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
- 'dev_requirement' => false,
- ),
- 'myclabs/deep-copy' => array(
- 'pretty_version' => '1.11.0',
- 'version' => '1.11.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../myclabs/deep-copy',
- 'aliases' => array(),
- 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
- 'dev_requirement' => true,
- ),
- 'nikic/php-parser' => array(
- 'pretty_version' => 'v4.13.2',
- 'version' => '4.13.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../nikic/php-parser',
- 'aliases' => array(),
- 'reference' => '210577fe3cf7badcc5814d99455df46564f3c077',
- 'dev_requirement' => true,
- ),
- 'paragonie/constant_time_encoding' => array(
- 'pretty_version' => 'v2.4.0',
- 'version' => '2.4.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding',
- 'aliases' => array(),
- 'reference' => 'f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c',
- 'dev_requirement' => false,
- ),
- 'phar-io/manifest' => array(
- 'pretty_version' => '2.0.3',
- 'version' => '2.0.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phar-io/manifest',
- 'aliases' => array(),
- 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
- 'dev_requirement' => true,
- ),
- 'phar-io/version' => array(
- 'pretty_version' => '3.2.1',
- 'version' => '3.2.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phar-io/version',
- 'aliases' => array(),
- 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
- 'dev_requirement' => true,
- ),
- 'phpdocumentor/reflection-common' => array(
- 'pretty_version' => '2.2.0',
- 'version' => '2.2.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common',
- 'aliases' => array(),
- 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
- 'dev_requirement' => true,
- ),
- 'phpdocumentor/reflection-docblock' => array(
- 'pretty_version' => '5.3.0',
- 'version' => '5.3.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock',
- 'aliases' => array(),
- 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
- 'dev_requirement' => true,
- ),
- 'phpdocumentor/type-resolver' => array(
- 'pretty_version' => '1.6.0',
- 'version' => '1.6.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver',
- 'aliases' => array(),
- 'reference' => '93ebd0014cab80c4ea9f5e297ea48672f1b87706',
- 'dev_requirement' => true,
- ),
- 'phpspec/prophecy' => array(
- 'pretty_version' => 'v1.15.0',
- 'version' => '1.15.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpspec/prophecy',
- 'aliases' => array(),
- 'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
- 'dev_requirement' => true,
- ),
- 'phpstan/phpstan' => array(
- 'pretty_version' => '1.1.2',
- 'version' => '1.1.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpstan/phpstan',
- 'aliases' => array(),
- 'reference' => 'bcea0ae85868a89d5789c75f012c93129f842934',
- 'dev_requirement' => true,
- ),
- 'phpunit/php-code-coverage' => array(
- 'pretty_version' => '9.2.15',
- 'version' => '9.2.15.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
- 'aliases' => array(),
- 'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
- 'dev_requirement' => true,
- ),
- 'phpunit/php-file-iterator' => array(
- 'pretty_version' => '3.0.6',
- 'version' => '3.0.6.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/php-file-iterator',
- 'aliases' => array(),
- 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
- 'dev_requirement' => true,
- ),
- 'phpunit/php-invoker' => array(
- 'pretty_version' => '3.1.1',
- 'version' => '3.1.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/php-invoker',
- 'aliases' => array(),
- 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
- 'dev_requirement' => true,
- ),
- 'phpunit/php-text-template' => array(
- 'pretty_version' => '2.0.4',
- 'version' => '2.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/php-text-template',
- 'aliases' => array(),
- 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
- 'dev_requirement' => true,
- ),
- 'phpunit/php-timer' => array(
- 'pretty_version' => '5.0.3',
- 'version' => '5.0.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/php-timer',
- 'aliases' => array(),
- 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
- 'dev_requirement' => true,
- ),
- 'phpunit/phpunit' => array(
- 'pretty_version' => '9.5.16',
- 'version' => '9.5.16.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../phpunit/phpunit',
- 'aliases' => array(),
- 'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
- 'dev_requirement' => true,
- ),
- 'sebastian/cli-parser' => array(
- 'pretty_version' => '1.0.1',
- 'version' => '1.0.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/cli-parser',
- 'aliases' => array(),
- 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
- 'dev_requirement' => true,
- ),
- 'sebastian/code-unit' => array(
- 'pretty_version' => '1.0.8',
- 'version' => '1.0.8.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/code-unit',
- 'aliases' => array(),
- 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
- 'dev_requirement' => true,
- ),
- 'sebastian/code-unit-reverse-lookup' => array(
- 'pretty_version' => '2.0.3',
- 'version' => '2.0.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup',
- 'aliases' => array(),
- 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
- 'dev_requirement' => true,
- ),
- 'sebastian/comparator' => array(
- 'pretty_version' => '4.0.6',
- 'version' => '4.0.6.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/comparator',
- 'aliases' => array(),
- 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
- 'dev_requirement' => true,
- ),
- 'sebastian/complexity' => array(
- 'pretty_version' => '2.0.2',
- 'version' => '2.0.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/complexity',
- 'aliases' => array(),
- 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
- 'dev_requirement' => true,
- ),
- 'sebastian/diff' => array(
- 'pretty_version' => '4.0.4',
- 'version' => '4.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/diff',
- 'aliases' => array(),
- 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
- 'dev_requirement' => true,
- ),
- 'sebastian/environment' => array(
- 'pretty_version' => '5.1.3',
- 'version' => '5.1.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/environment',
- 'aliases' => array(),
- 'reference' => '388b6ced16caa751030f6a69e588299fa09200ac',
- 'dev_requirement' => true,
- ),
- 'sebastian/exporter' => array(
- 'pretty_version' => '4.0.4',
- 'version' => '4.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/exporter',
- 'aliases' => array(),
- 'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
- 'dev_requirement' => true,
- ),
- 'sebastian/global-state' => array(
- 'pretty_version' => '5.0.5',
- 'version' => '5.0.5.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/global-state',
- 'aliases' => array(),
- 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
- 'dev_requirement' => true,
- ),
- 'sebastian/lines-of-code' => array(
- 'pretty_version' => '1.0.3',
- 'version' => '1.0.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/lines-of-code',
- 'aliases' => array(),
- 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
- 'dev_requirement' => true,
- ),
- 'sebastian/object-enumerator' => array(
- 'pretty_version' => '4.0.4',
- 'version' => '4.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/object-enumerator',
- 'aliases' => array(),
- 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
- 'dev_requirement' => true,
- ),
- 'sebastian/object-reflector' => array(
- 'pretty_version' => '2.0.4',
- 'version' => '2.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/object-reflector',
- 'aliases' => array(),
- 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
- 'dev_requirement' => true,
- ),
- 'sebastian/recursion-context' => array(
- 'pretty_version' => '4.0.4',
- 'version' => '4.0.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/recursion-context',
- 'aliases' => array(),
- 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
- 'dev_requirement' => true,
- ),
- 'sebastian/resource-operations' => array(
- 'pretty_version' => '3.0.3',
- 'version' => '3.0.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/resource-operations',
- 'aliases' => array(),
- 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
- 'dev_requirement' => true,
- ),
- 'sebastian/type' => array(
- 'pretty_version' => '2.3.4',
- 'version' => '2.3.4.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/type',
- 'aliases' => array(),
- 'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
- 'dev_requirement' => true,
- ),
- 'sebastian/version' => array(
- 'pretty_version' => '3.0.2',
- 'version' => '3.0.2.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../sebastian/version',
- 'aliases' => array(),
- 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
- 'dev_requirement' => true,
- ),
- 'spomky-labs/otphp' => array(
- 'pretty_version' => 'v10.0.1',
- 'version' => '10.0.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../spomky-labs/otphp',
- 'aliases' => array(),
- 'reference' => 'f44cce5a9db4b8da410215d992110482c931232f',
- 'dev_requirement' => false,
- ),
- 'symfony/polyfill-ctype' => array(
- 'pretty_version' => 'v1.25.0',
- 'version' => '1.25.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
- 'aliases' => array(),
- 'reference' => '30885182c981ab175d4d034db0f6f469898070ab',
- 'dev_requirement' => true,
- ),
- 'thecodingmachine/safe' => array(
- 'pretty_version' => 'v1.3.3',
- 'version' => '1.3.3.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../thecodingmachine/safe',
- 'aliases' => array(),
- 'reference' => 'a8ab0876305a4cdaef31b2350fcb9811b5608dbc',
- 'dev_requirement' => false,
- ),
- 'theseer/tokenizer' => array(
- 'pretty_version' => '1.2.1',
- 'version' => '1.2.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../theseer/tokenizer',
- 'aliases' => array(),
- 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
- 'dev_requirement' => true,
- ),
- 'webmozart/assert' => array(
- 'pretty_version' => '1.10.0',
- 'version' => '1.10.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../webmozart/assert',
- 'aliases' => array(),
- 'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
- 'dev_requirement' => true,
- ),
+<?php return array (
+ 'root' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
),
+ 'reference' => '26c67dba776e1e6f8ac40eed70fe79995325863d',
+ 'name' => '__root__',
+ ),
+ 'versions' =>
+ array (
+ '__root__' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '26c67dba776e1e6f8ac40eed70fe79995325863d',
+ ),
+ 'beberlei/assert' =>
+ array (
+ 'pretty_version' => 'v3.3.2',
+ 'version' => '3.3.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
+ ),
+ 'chillerlan/php-qrcode' =>
+ array (
+ 'pretty_version' => '4.3.4',
+ 'version' => '4.3.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
+ ),
+ 'chillerlan/php-settings-container' =>
+ array (
+ 'pretty_version' => '2.1.4',
+ 'version' => '2.1.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
+ ),
+ 'doctrine/instantiator' =>
+ array (
+ 'pretty_version' => '1.4.1',
+ 'version' => '1.4.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
+ ),
+ 'j4mie/idiorm' =>
+ array (
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'aliases' =>
+ array (
+ 0 => '9999999-dev',
+ ),
+ 'reference' => 'efc8ea06698f53e2c479c7696f2b154c47c3a3cb',
+ ),
+ 'mervick/material-design-icons' =>
+ array (
+ 'pretty_version' => '2.2.0',
+ 'version' => '2.2.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
+ ),
+ 'myclabs/deep-copy' =>
+ array (
+ 'pretty_version' => '1.11.0',
+ 'version' => '1.11.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
+ ),
+ 'nikic/php-parser' =>
+ array (
+ 'pretty_version' => 'v4.14.0',
+ 'version' => '4.14.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1',
+ ),
+ 'paragonie/constant_time_encoding' =>
+ array (
+ 'pretty_version' => 'v2.6.3',
+ 'version' => '2.6.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '58c3f47f650c94ec05a151692652a868995d2938',
+ ),
+ 'phar-io/manifest' =>
+ array (
+ 'pretty_version' => '2.0.3',
+ 'version' => '2.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
+ ),
+ 'phar-io/version' =>
+ array (
+ 'pretty_version' => '3.2.1',
+ 'version' => '3.2.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
+ ),
+ 'phpdocumentor/reflection-common' =>
+ array (
+ 'pretty_version' => '2.2.0',
+ 'version' => '2.2.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
+ ),
+ 'phpdocumentor/reflection-docblock' =>
+ array (
+ 'pretty_version' => '5.3.0',
+ 'version' => '5.3.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
+ ),
+ 'phpdocumentor/type-resolver' =>
+ array (
+ 'pretty_version' => '1.6.1',
+ 'version' => '1.6.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '77a32518733312af16a44300404e945338981de3',
+ ),
+ 'phpspec/prophecy' =>
+ array (
+ 'pretty_version' => 'v1.15.0',
+ 'version' => '1.15.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
+ ),
+ 'phpstan/phpstan' =>
+ array (
+ 'pretty_version' => '1.8.2',
+ 'version' => '1.8.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c53312ecc575caf07b0e90dee43883fdf90ca67c',
+ ),
+ 'phpunit/php-code-coverage' =>
+ array (
+ 'pretty_version' => '9.2.15',
+ 'version' => '9.2.15.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
+ ),
+ 'phpunit/php-file-iterator' =>
+ array (
+ 'pretty_version' => '3.0.6',
+ 'version' => '3.0.6.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
+ ),
+ 'phpunit/php-invoker' =>
+ array (
+ 'pretty_version' => '3.1.1',
+ 'version' => '3.1.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
+ ),
+ 'phpunit/php-text-template' =>
+ array (
+ 'pretty_version' => '2.0.4',
+ 'version' => '2.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
+ ),
+ 'phpunit/php-timer' =>
+ array (
+ 'pretty_version' => '5.0.3',
+ 'version' => '5.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
+ ),
+ 'phpunit/phpunit' =>
+ array (
+ 'pretty_version' => '9.5.16',
+ 'version' => '9.5.16.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
+ ),
+ 'sebastian/cli-parser' =>
+ array (
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
+ ),
+ 'sebastian/code-unit' =>
+ array (
+ 'pretty_version' => '1.0.8',
+ 'version' => '1.0.8.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
+ ),
+ 'sebastian/code-unit-reverse-lookup' =>
+ array (
+ 'pretty_version' => '2.0.3',
+ 'version' => '2.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
+ ),
+ 'sebastian/comparator' =>
+ array (
+ 'pretty_version' => '4.0.6',
+ 'version' => '4.0.6.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
+ ),
+ 'sebastian/complexity' =>
+ array (
+ 'pretty_version' => '2.0.2',
+ 'version' => '2.0.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
+ ),
+ 'sebastian/diff' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
+ ),
+ 'sebastian/environment' =>
+ array (
+ 'pretty_version' => '5.1.4',
+ 'version' => '5.1.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
+ ),
+ 'sebastian/exporter' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
+ ),
+ 'sebastian/global-state' =>
+ array (
+ 'pretty_version' => '5.0.5',
+ 'version' => '5.0.5.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
+ ),
+ 'sebastian/lines-of-code' =>
+ array (
+ 'pretty_version' => '1.0.3',
+ 'version' => '1.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
+ ),
+ 'sebastian/object-enumerator' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
+ ),
+ 'sebastian/object-reflector' =>
+ array (
+ 'pretty_version' => '2.0.4',
+ 'version' => '2.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
+ ),
+ 'sebastian/recursion-context' =>
+ array (
+ 'pretty_version' => '4.0.4',
+ 'version' => '4.0.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
+ ),
+ 'sebastian/resource-operations' =>
+ array (
+ 'pretty_version' => '3.0.3',
+ 'version' => '3.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
+ ),
+ 'sebastian/type' =>
+ array (
+ 'pretty_version' => '2.3.4',
+ 'version' => '2.3.4.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
+ ),
+ 'sebastian/version' =>
+ array (
+ 'pretty_version' => '3.0.2',
+ 'version' => '3.0.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
+ ),
+ 'spomky-labs/otphp' =>
+ array (
+ 'pretty_version' => 'v10.0.3',
+ 'version' => '10.0.3.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '9784d9f7c790eed26e102d6c78f12c754036c366',
+ ),
+ 'thecodingmachine/safe' =>
+ array (
+ 'pretty_version' => 'v2.2.2',
+ 'version' => '2.2.2.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '440284f9592c9df402832452a6871a8b3c48d97e',
+ ),
+ 'theseer/tokenizer' =>
+ array (
+ 'pretty_version' => '1.2.1',
+ 'version' => '1.2.1.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
+ ),
+ 'webmozart/assert' =>
+ array (
+ 'pretty_version' => '1.11.0',
+ 'version' => '1.11.0.0',
+ 'aliases' =>
+ array (
+ ),
+ 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991',
+ ),
+ ),
);
diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php
deleted file mode 100644
index 589e9e770..000000000
--- a/vendor/composer/platform_check.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-// platform_check.php @generated by Composer
-
-$issues = array();
-
-if (!(PHP_VERSION_ID >= 70200)) {
- $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.';
-}
-
-if ($issues) {
- if (!headers_sent()) {
- header('HTTP/1.1 500 Internal Server Error');
- }
- if (!ini_get('display_errors')) {
- if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
- fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
- } elseif (!headers_sent()) {
- echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
- }
- }
- trigger_error(
- 'Composer detected issues in your platform: ' . implode(' ', $issues),
- E_USER_ERROR
- );
-}
diff --git a/vendor/j4mie/idiorm/.gitattributes b/vendor/j4mie/idiorm/.gitattributes
new file mode 100644
index 000000000..be8c7b340
--- /dev/null
+++ b/vendor/j4mie/idiorm/.gitattributes
@@ -0,0 +1,5 @@
+.gitignore export-ignore
+.gitattributes export-ignore
+/test export-ignore
+.travis.yml export-ignore
+phpunit.xml export-ignore
diff --git a/vendor/j4mie/idiorm/.gitignore b/vendor/j4mie/idiorm/.gitignore
new file mode 100644
index 000000000..34b5c58a7
--- /dev/null
+++ b/vendor/j4mie/idiorm/.gitignore
@@ -0,0 +1,7 @@
+*.swp
+*.sqlite
+docs/_build
+/phpunit.phar
+/vendor
+/composer.lock
+.DS_Store
diff --git a/vendor/j4mie/idiorm/.travis.yml b/vendor/j4mie/idiorm/.travis.yml
new file mode 100644
index 000000000..fee02856e
--- /dev/null
+++ b/vendor/j4mie/idiorm/.travis.yml
@@ -0,0 +1,42 @@
+language: php
+php:
+ - 5.4
+ - 5.6
+ - 7.0
+ - 7.1
+ - hhvm
+env: PHPV=0
+matrix:
+ include:
+ - php: 5.2
+ dist: precise
+ env: PHPV=52
+ - php: 5.3
+ dist: precise
+before_install: |
+ if [ "$PHPV" -eq 52 ]; then
+ pecl install phar
+ fi
+install: |
+ if [ "$PHPV" -ne 52 ]; then
+ composer install
+ else
+ # special handling for PHP 5.2 testing as there is no composer available
+ export X="$HOME/.idiorm/bin"
+ mkdir -p "$X"
+ curl -sSfL https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -o "$X/phpunit"
+ chmod +x "$X/phpunit"
+ fi
+script: |
+ if [ "$PHPV" -ne 52 ]; then
+ composer run-script test -- --colors --coverage-text
+ else
+ # special handling for PHP 5.2 testing as there is no composer available
+ # we need phpunit-3.6.12, but there is no phar file for it so comment out for now
+ $X/phpunit --colors --coverage-text
+ fi
+cache:
+ directories:
+ - $HOME/.composer/cache
+ - $HOME/.idiorm
+ - vendor \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/idiorm.php b/vendor/j4mie/idiorm/idiorm.php
index 2b1f38ca0..06253020c 100644
--- a/vendor/j4mie/idiorm/idiorm.php
+++ b/vendor/j4mie/idiorm/idiorm.php
@@ -2209,14 +2209,17 @@
// --- ArrayAccess --- //
// --------------------- //
+ #[\ReturnTypeWillChange]
public function offsetExists($key) {
return array_key_exists($key, $this->_data);
}
+ #[\ReturnTypeWillChange]
public function offsetGet($key) {
return $this->get($key);
}
+ #[\ReturnTypeWillChange]
public function offsetSet($key, $value) {
if(is_null($key)) {
throw new InvalidArgumentException('You must specify a key/array index.');
@@ -2224,6 +2227,7 @@
$this->set($key, $value);
}
+ #[\ReturnTypeWillChange]
public function offsetUnset($key) {
unset($this->_data[$key]);
unset($this->_dirty_fields[$key]);
@@ -2445,6 +2449,7 @@
* Get the number of records in the result set
* @return int
*/
+ #[\ReturnTypeWillChange]
public function count() {
return count($this->_results);
}
@@ -2454,6 +2459,7 @@
* over the result set.
* @return \ArrayIterator
*/
+ #[\ReturnTypeWillChange]
public function getIterator() {
return new ArrayIterator($this->_results);
}
@@ -2463,6 +2469,7 @@
* @param int|string $offset
* @return bool
*/
+ #[\ReturnTypeWillChange]
public function offsetExists($offset) {
return isset($this->_results[$offset]);
}
@@ -2472,6 +2479,7 @@
* @param int|string $offset
* @return mixed
*/
+ #[\ReturnTypeWillChange]
public function offsetGet($offset) {
return $this->_results[$offset];
}
@@ -2481,6 +2489,7 @@
* @param int|string $offset
* @param mixed $value
*/
+ #[\ReturnTypeWillChange]
public function offsetSet($offset, $value) {
$this->_results[$offset] = $value;
}
@@ -2489,10 +2498,19 @@
* ArrayAccess
* @param int|string $offset
*/
+ #[\ReturnTypeWillChange]
public function offsetUnset($offset) {
unset($this->_results[$offset]);
}
+ public function __serialize() {
+ return $this->serialize();
+ }
+
+ public function __unserialize($data) {
+ $this->unserialize($data);
+ }
+
/**
* Serializable
* @return string
diff --git a/vendor/j4mie/idiorm/phpunit.xml b/vendor/j4mie/idiorm/phpunit.xml
new file mode 100644
index 000000000..efbc81c44
--- /dev/null
+++ b/vendor/j4mie/idiorm/phpunit.xml
@@ -0,0 +1,12 @@
+<phpunit backupGlobals="true"
+ backupStaticAttributes="false"
+ bootstrap="test/bootstrap.php"
+ cacheTokens="false"
+ colors="true">
+ <testsuites>
+ <testsuite name="Idiorm Test Suite">
+ <directory suffix="Test.php">test</directory>
+ <directory suffix="Test53.php" phpVersion="5.3.0" phpVersionOperator=">=">test</directory>
+ </testsuite>
+ </testsuites>
+</phpunit> \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/CacheIntegrationTest.php b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php
new file mode 100644
index 000000000..0a5dc6101
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheIntegrationTest.php
@@ -0,0 +1,43 @@
+<?php
+
+class CacheIntegrationTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ ORM::configure('sqlite::memory:');
+ ORM::configure('logging', true);
+ ORM::configure('caching', true);
+
+ ORM::raw_execute('CREATE TABLE `league` ( `class_id` INTEGER )');
+ // needs to be individually inserted to support SQLite before
+ // version 3.7.11
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (1)');
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (2)');
+ ORM::raw_execute('INSERT INTO `league`(`class_id`) VALUES (3)');
+
+ $x = ORM::for_table('league')->count();
+ $this->assertEquals(3, $x);
+ }
+
+ public function tearDown() {
+ ORM::raw_execute('DROP TABLE `league`');
+ }
+
+ public function testRegressionForPullRequest319() {
+ $rs = ORM::for_table('league')->where('class_id', 1);
+ $total = $rs->count();
+ $this->assertEquals(1, $total);
+ $row = $rs->find_one();
+ $this->assertEquals(array('class_id' => 1), $row->as_array());
+
+ $rs = ORM::for_table('league')->where('class_id', 1);
+ $total = $rs->count();
+ $this->assertEquals(1, $total);
+ try {
+ $row = $rs->find_one();
+ } catch(PDOException $e) {
+ $this->fail("Caching is breaking subsequent queries!\n{$e->getMessage()}");
+ }
+ $this->assertEquals(array('class_id' => 1), $row->as_array());
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/CacheTest.php b/vendor/j4mie/idiorm/test/CacheTest.php
new file mode 100644
index 000000000..a3daa91d0
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheTest.php
@@ -0,0 +1,42 @@
+<?php
+
+class CacheTest extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ ORM::configure('caching', true);
+ ORM::configure('caching', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ // Test caching. This is a bit of a hack.
+ public function testQueryGenerationOnlyOccursOnce() {
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one();
+ ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
+ $expected = ORM::get_last_query();
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 17)->find_one(); // this shouldn't run a query!
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testQueryGenerationOnlyOccursOnceWithMultipleConnections() {
+ // Test caching with multiple connections (also a bit of a hack)
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one();
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Tom')->where('age', 120)->find_one();
+ $expected = ORM::get_last_query();
+ ORM::for_table('widget', self::ALTERNATE)->where('name', 'Steve')->where('age', 80)->find_one(); // this shouldn't run a query!
+ $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/CacheTest53.php b/vendor/j4mie/idiorm/test/CacheTest53.php
new file mode 100644
index 000000000..bc30b0aaf
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/CacheTest53.php
@@ -0,0 +1,82 @@
+<?php
+
+class CacheTest53 extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ ORM::configure('caching', true);
+ ORM::configure('caching', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+
+ public function testCustomCacheCallback() {
+ $phpunit = $this;
+ $my_cache = array();
+ ORM::configure('caching_auto_clear', true);
+
+ ORM::configure('create_cache_key', function ($query, $parameters, $table_name, $connection) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($query));
+ $phpunit->assertEquals(true, is_array($parameters));
+ $phpunit->assertEquals(true, is_string($connection));
+ $phpunit->assertEquals('widget', $table_name);
+ $parameter_string = join(',', $parameters);
+ $key = $query . ':' . $parameter_string;
+ $my_key = 'some-prefix'.crc32($key);
+ return $my_key;
+ });
+ ORM::configure('cache_query_result', function ($cache_key, $value, $table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($cache_key));
+ $phpunit->assertEquals('widget', $table_name);
+ $my_cache[$cache_key] = $value;
+ });
+ ORM::configure('check_query_cache', function ($cache_key, $table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($cache_key));
+ $phpunit->assertEquals(true, is_string($connection_name));
+ $phpunit->assertEquals('widget', $table_name);
+
+ if(isset($my_cache) and isset($my_cache[$cache_key])){
+ $phpunit->assertEquals(true, is_array($my_cache[$cache_key]));
+ return $my_cache[$cache_key];
+ } else {
+ return false;
+ }
+ });
+ ORM::configure('clear_cache', function ($table_name, $connection_name) use ($phpunit, &$my_cache) {
+ $phpunit->assertEquals(true, is_string($table_name));
+ $phpunit->assertEquals(true, is_string($connection_name));
+ $my_cache = array();
+ });
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 21)->find_one();
+ ORM::for_table('widget')->where('name', 'Bob')->where('age', 42)->find_one();
+
+ //our custom cache should be full now
+ $this->assertEquals(true, !empty($my_cache));
+
+ //checking custom cache key
+ foreach($my_cache as $k=>$v){
+ $this->assertEquals('some-prefix', substr($k,0,11));
+ }
+
+ $new = ORM::for_table('widget')->create();
+ $new->name = "Joe";
+ $new->age = 25;
+ $saved = $new->save();
+
+ //our custom cache should be empty now
+ $this->assertEquals(true, empty($my_cache));
+ }
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/ConfigTest.php b/vendor/j4mie/idiorm/test/ConfigTest.php
new file mode 100644
index 000000000..c6f4631ad
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ConfigTest.php
@@ -0,0 +1,125 @@
+<?php
+
+class ConfigTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+
+ ORM::configure('id_column', 'primary_key');
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ protected function setUpIdColumnOverrides() {
+ ORM::configure('id_column_overrides', array(
+ 'widget' => 'widget_id',
+ 'widget_handle' => 'widget_handle_id',
+ ));
+ }
+
+ protected function tearDownIdColumnOverrides() {
+ ORM::configure('id_column_overrides', array());
+ }
+
+ public function testSettingIdColumn() {
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `primary_key` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSettingIdColumnOverridesOne() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `widget_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testSettingIdColumnOverridesTwo() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_handle')->find_one(5);
+ $expected = "SELECT * FROM `widget_handle` WHERE `widget_handle_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testSettingIdColumnOverridesThree() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_nozzle')->find_one(5);
+ $expected = "SELECT * FROM `widget_nozzle` WHERE `primary_key` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnOne() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnTwo() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_handle')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget_handle` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testInstanceIdColumnThree() {
+ $this->setUpIdColumnOverrides();
+
+ ORM::for_table('widget_nozzle')->use_id_column('new_id')->find_one(5);
+ $expected = "SELECT * FROM `widget_nozzle` WHERE `new_id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+
+ $this->tearDownIdColumnOverrides();
+ }
+
+ public function testGetConfig() {
+ $this->assertTrue(ORM::get_config('logging'));
+ ORM::configure('logging', false);
+ $this->assertFalse(ORM::get_config('logging'));
+ ORM::configure('logging', true);
+ }
+
+ public function testGetConfigArray() {
+ $expected = array(
+ 'connection_string' => 'sqlite::memory:',
+ 'id_column' => 'primary_key',
+ 'id_column_overrides' => array(),
+ 'error_mode' => PDO::ERRMODE_EXCEPTION,
+ 'username' => null,
+ 'password' => null,
+ 'driver_options' => null,
+ 'identifier_quote_character' => '`',
+ 'logging' => true,
+ 'logger' => null,
+ 'caching' => false,
+ 'caching_auto_clear' => false,
+ 'return_result_sets' => false,
+ 'limit_clause_style' => 'limit',
+ );
+ $this->assertEquals($expected, ORM::get_config());
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/ConfigTest53.php b/vendor/j4mie/idiorm/test/ConfigTest53.php
new file mode 100644
index 000000000..ef8af778a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ConfigTest53.php
@@ -0,0 +1,36 @@
+<?php
+
+class ConfigTest53 extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+
+ ORM::configure('id_column', 'primary_key');
+ }
+
+ public function tearDown() {
+ ORM::configure('logging', false);
+ ORM::set_db(null);
+
+ ORM::configure('id_column', 'id');
+ }
+
+ public function testLoggerCallback() {
+ ORM::configure('logger', function($log_string) {
+ return $log_string;
+ });
+ $function = ORM::get_config('logger');
+ $this->assertTrue(is_callable($function));
+
+ $log_string = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($log_string, $function($log_string));
+
+ ORM::configure('logger', null);
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/IdiormResultSetTest.php b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php
new file mode 100644
index 000000000..c458d9972
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/IdiormResultSetTest.php
@@ -0,0 +1,81 @@
+<?php
+
+class IdiormResultSetTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testGet() {
+ $IdiormResultSet = new IdiormResultSet();
+ $this->assertInternalType('array', $IdiormResultSet->get_results());
+ }
+
+ public function testConstructor() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertSame($IdiormResultSet->get_results(), $result_set);
+ }
+
+ public function testSetResultsAndGetResults() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet();
+ $IdiormResultSet->set_results($result_set);
+ $this->assertSame($IdiormResultSet->get_results(), $result_set);
+ }
+
+ public function testAsArray() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet();
+ $IdiormResultSet->set_results($result_set);
+ $this->assertSame($IdiormResultSet->as_array(), $result_set);
+ }
+
+ public function testCount() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertSame($IdiormResultSet->count(), 1);
+ $this->assertSame(count($IdiormResultSet), 1);
+ }
+
+ public function testGetIterator() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $this->assertInstanceOf('ArrayIterator', $IdiormResultSet->getIterator());
+ }
+
+ public function testForeach() {
+ $result_set = array('item' => new stdClass);
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $return_array = array();
+ foreach($IdiormResultSet as $key => $record) {
+ $return_array[$key] = $record;
+ }
+ $this->assertSame($result_set, $return_array);
+ }
+
+ public function testCallingMethods() {
+ $result_set = array('item' => ORM::for_table('test'), 'item2' => ORM::for_table('test'));
+ $IdiormResultSet = new IdiormResultSet($result_set);
+ $IdiormResultSet->set('field', 'value')->set('field2', 'value');
+
+ foreach($IdiormResultSet as $record) {
+ $this->assertTrue(isset($record->field));
+ $this->assertSame($record->field, 'value');
+
+ $this->assertTrue(isset($record->field2));
+ $this->assertSame($record->field2, 'value');
+ }
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php
new file mode 100644
index 000000000..a58f3ca83
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/MulitpleConnectionTest.php
@@ -0,0 +1,52 @@
+<?php
+
+class MultipleConnectionTest extends PHPUnit_Framework_TestCase {
+
+ const ALTERNATE = 'alternate'; // Used as name of alternate connection
+
+ public function setUp() {
+ // Set up the dummy database connections
+ ORM::set_db(new MockPDO('sqlite::memory:'));
+ ORM::set_db(new MockDifferentPDO('sqlite::memory:'), self::ALTERNATE);
+
+ // Enable logging
+ ORM::configure('logging', true);
+ ORM::configure('logging', true, self::ALTERNATE);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testMultiplePdoConnections() {
+ $this->assertInstanceOf('MockPDO', ORM::get_db());
+ $this->assertInstanceOf('MockPDO', ORM::get_db(ORM::DEFAULT_CONNECTION));
+ $this->assertInstanceOf('MockDifferentPDO', ORM::get_db(self::ALTERNATE));
+ }
+
+ public function testRawExecuteOverAlternateConnection() {
+ $expected = "SELECT * FROM `foo`";
+ ORM::raw_execute("SELECT * FROM `foo`", array(), self::ALTERNATE);
+
+ $this->assertEquals($expected, ORM::get_last_query(self::ALTERNATE));
+ }
+
+ public function testFindOneOverDifferentConnections() {
+ ORM::for_table('widget')->find_one();
+ $statementOne = ORM::get_last_statement();
+ $this->assertInstanceOf('MockPDOStatement', $statementOne);
+
+ ORM::for_table('person', self::ALTERNATE)->find_one();
+ $statementOne = ORM::get_last_statement(); // get_statement is *not* per connection
+ $this->assertInstanceOf('MockDifferentPDOStatement', $statementOne);
+
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertNotEquals($expected, ORM::get_last_query()); // Because get_last_query() is across *all* connections
+ $this->assertEquals($expected, ORM::get_last_query(ORM::DEFAULT_CONNECTION));
+
+ $expectedToo = "SELECT * FROM `person` LIMIT 1";
+ $this->assertEquals($expectedToo, ORM::get_last_query(self::ALTERNATE));
+ }
+
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/ORMTest.php b/vendor/j4mie/idiorm/test/ORMTest.php
new file mode 100644
index 000000000..b85b0f65a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/ORMTest.php
@@ -0,0 +1,185 @@
+<?php
+
+class ORMTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testStaticAtrributes() {
+ $this->assertEquals('0', ORM::CONDITION_FRAGMENT);
+ $this->assertEquals('1', ORM::CONDITION_VALUES);
+ }
+
+ public function testForTable() {
+ $result = ORM::for_table('test');
+ $this->assertInstanceOf('ORM', $result);
+ }
+
+ public function testCreate() {
+ $model = ORM::for_table('test')->create();
+ $this->assertInstanceOf('ORM', $model);
+ $this->assertTrue($model->is_new());
+ }
+
+ public function testIsNew() {
+ $model = ORM::for_table('test')->create();
+ $this->assertTrue($model->is_new());
+
+ $model = ORM::for_table('test')->create(array('test' => 'test'));
+ $this->assertTrue($model->is_new());
+ }
+
+ public function testIsDirty() {
+ $model = ORM::for_table('test')->create();
+ $this->assertFalse($model->is_dirty('test'));
+
+ $model = ORM::for_table('test')->create(array('test' => 'test'));
+ $this->assertTrue($model->is_dirty('test'));
+
+ $model->test = null;
+ $this->assertTrue($model->is_dirty('test'));
+
+ $model->test = '';
+ $this->assertTrue($model->is_dirty('test'));
+ }
+
+ public function testArrayAccess() {
+ $value = 'test';
+ $model = ORM::for_table('test')->create();
+ $model['test'] = $value;
+ $this->assertTrue(isset($model['test']));
+ $this->assertEquals($model['test'], $value);
+ unset($model['test']);
+ $this->assertFalse(isset($model['test']));
+ }
+
+ public function testFindResultSet() {
+ $result_set = ORM::for_table('test')->find_result_set();
+ $this->assertInstanceOf('IdiormResultSet', $result_set);
+ $this->assertSame(count($result_set), 5);
+ }
+
+ public function testFindResultSetByDefault() {
+ ORM::configure('return_result_sets', true);
+
+ $result_set = ORM::for_table('test')->find_many();
+ $this->assertInstanceOf('IdiormResultSet', $result_set);
+ $this->assertSame(count($result_set), 5);
+
+ ORM::configure('return_result_sets', false);
+
+ $result_set = ORM::for_table('test')->find_many();
+ $this->assertInternalType('array', $result_set);
+ $this->assertSame(count($result_set), 5);
+ }
+
+ public function testGetLastPdoStatement() {
+ ORM::for_table('widget')->where('name', 'Fred')->find_one();
+ $statement = ORM::get_last_statement();
+ $this->assertInstanceOf('MockPDOStatement', $statement);
+ }
+
+ /**
+ * @expectedException IdiormMethodMissingException
+ */
+ public function testInvalidORMFunctionCallShouldCreateException() {
+ $orm = ORM::for_table('test');
+ $orm->invalidFunctionCall();
+ }
+
+ /**
+ * @expectedException IdiormMethodMissingException
+ */
+ public function testInvalidResultsSetFunctionCallShouldCreateException() {
+ $resultSet = ORM::for_table('test')->find_result_set();
+ $resultSet->invalidFunctionCall();
+ }
+
+ /**
+ * These next two tests are needed because if you have select()ed some fields,
+ * but not the primary key, then the primary key is not available for the
+ * update/delete query - see issue #203.
+ * We need to change the primary key here to something other than `id`
+ * becuase MockPDOStatement->fetch() always returns an id.
+ */
+ public function testUpdateNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->foo = 'bar';
+ $widget->save();
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testDeleteNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->delete();
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testNullPrimaryKey() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column('primary')
+ ->select('foo')
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->id(true);
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID missing from row or is null');
+ }
+ }
+
+ public function testNullPrimaryKeyPart() {
+ try {
+ $widget = ORM::for_table('widget')
+ ->use_id_column(array('id', 'primary'))
+ ->select('foo')
+ ->where('id', 1)
+ ->where('primary', 1)
+ ->find_one()
+ ;
+
+ $widget->id(true);
+
+ throw new Exception('Test did not throw expected exception');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getMessage(), 'Primary key ID contains null value(s)');
+ }
+ }
+} \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php
new file mode 100644
index 000000000..be67b3316
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderMssqlTest.php
@@ -0,0 +1,32 @@
+<?php
+
+class QueryBuilderMssqlTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockMsSqlPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testFindOne() {
+ ORM::for_table('widget')->find_one();
+ $expected = 'SELECT TOP 1 * FROM "widget"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimit() {
+ ORM::for_table('widget')->limit(5)->find_many();
+ $expected = 'SELECT TOP 5 * FROM "widget"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+}
+
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php
new file mode 100644
index 000000000..3b267eba6
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderPsr1Test53.php
@@ -0,0 +1,582 @@
+<?php
+
+class QueryBuilderPsr1Test53 extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::setDb($db);
+ }
+
+ public function tearDown() {
+ ORM::configure('logging', false);
+ ORM::setDb(null);
+ }
+
+ public function testFindMany() {
+ ORM::forTable('widget')->findMany();
+ $expected = "SELECT * FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFindOne() {
+ ORM::forTable('widget')->findOne();
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFindOneWithPrimaryKeyFilter() {
+ ORM::forTable('widget')->findOne(5);
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereIdIs() {
+ ORM::forTable('widget')->whereIdIs(5)->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSingleWhereClause() {
+ ORM::forTable('widget')->where('name', 'Fred')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleWhereClauses() {
+ ORM::forTable('widget')->where('name', 'Fred')->where('age', 10)->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotEqual() {
+ ORM::forTable('widget')->whereNotEqual('name', 'Fred')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLike() {
+ ORM::forTable('widget')->whereLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotLike() {
+ ORM::forTable('widget')->whereNotLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereIn() {
+ ORM::forTable('widget')->whereIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotIn() {
+ ORM::forTable('widget')->whereNotIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLimit() {
+ ORM::forTable('widget')->limit(5)->findMany();
+ $expected = "SELECT * FROM `widget` LIMIT 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLimitAndOffset() {
+ ORM::forTable('widget')->limit(5)->offset(5)->findMany();
+ $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByDesc() {
+ ORM::forTable('widget')->orderByDesc('name')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByAsc() {
+ ORM::forTable('widget')->orderByAsc('name')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testOrderByExpression() {
+ ORM::forTable('widget')->orderByExpr('SOUNDEX(`name`)')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleOrderBy() {
+ ORM::forTable('widget')->orderByAsc('name')->orderByDesc('age')->findOne();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testGroupBy() {
+ ORM::forTable('widget')->groupBy('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleGroupBy() {
+ ORM::forTable('widget')->groupBy('name')->groupBy('age')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testGroupByExpression() {
+ ORM::forTable('widget')->groupByExpr("FROM_UNIXTIME(`time`, '%Y-%m')")->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHaving() {
+ ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleHaving() {
+ ORM::forTable('widget')->groupBy('name')->having('name', 'Fred')->having('age', 10)->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotEqual() {
+ ORM::forTable('widget')->groupBy('name')->havingNotEqual('name', 'Fred')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLike() {
+ ORM::forTable('widget')->groupBy('name')->havingLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotLike() {
+ ORM::forTable('widget')->groupBy('name')->havingNotLike('name', '%Fred%')->findOne();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingIn() {
+ ORM::forTable('widget')->groupBy('name')->havingIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotIn() {
+ ORM::forTable('widget')->groupBy('name')->havingNotIn('name', array('Fred', 'Joe'))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLessThan() {
+ ORM::forTable('widget')->groupBy('name')->havingLt('age', 10)->havingGt('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
+ ORM::forTable('widget')->groupBy('name')->havingLte('age', 10)->havingGte('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNull() {
+ ORM::forTable('widget')->groupBy('name')->havingNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testHavingNotNull() {
+ ORM::forTable('widget')->groupBy('name')->havingNotNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawHaving() {
+ ORM::forTable('widget')->groupBy('name')->havingRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testComplexQuery() {
+ ORM::forTable('widget')->where('name', 'Fred')->limit(5)->offset(5)->orderByAsc('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLessThanAndGreaterThan() {
+ ORM::forTable('widget')->whereLt('age', 10)->whereGt('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
+ ORM::forTable('widget')->whereLte('age', 10)->whereGte('age', 5)->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNull() {
+ ORM::forTable('widget')->whereNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testWhereNotNull() {
+ ORM::forTable('widget')->whereNotNull('name')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClause() {
+ ORM::forTable('widget')->whereRaw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseWithPercentSign() {
+ ORM::forTable('widget')->whereRaw('STRFTIME("%Y", "now") = ?', array(2012))->findMany();
+ $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseWithNoParameters() {
+ ORM::forTable('widget')->whereRaw('`name` = "Fred"')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawWhereClauseInMethodChain() {
+ ORM::forTable('widget')->where('age', 18)->whereRaw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->findMany();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQuery() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w')->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQueryWithParameters() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawQueryWithNamedPlaceholders() {
+ ORM::forTable('widget')->rawQuery('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->findMany();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleResultColumn() {
+ ORM::forTable('widget')->select('name')->findMany();
+ $expected = "SELECT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleSimpleResultColumns() {
+ ORM::forTable('widget')->select('name')->select('age')->findMany();
+ $expected = "SELECT `name`, `age` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSpecifyTableNameAndColumnInResultColumns() {
+ ORM::forTable('widget')->select('widget.name')->findMany();
+ $expected = "SELECT `widget`.`name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMainTableAlias() {
+ ORM::forTable('widget')->tableAlias('w')->findMany();
+ $expected = "SELECT * FROM `widget` `w`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAliasesInResultColumns() {
+ ORM::forTable('widget')->select('widget.name', 'widget_name')->findMany();
+ $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAliasesInSelectManyResults() {
+ ORM::forTable('widget')->selectMany(array('widget_name' => 'widget.name'), 'widget_handle')->findMany();
+ $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLiteralExpressionInResultColumn() {
+ ORM::forTable('widget')->selectExpr('COUNT(*)', 'count')->findMany();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLiteralExpressionInSelectManyResultColumns() {
+ ORM::forTable('widget')->selectManyExpr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->findMany();
+ $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleJoin() {
+ ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSimpleJoinWithWhereIdIsMethod() {
+ ORM::forTable('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findOne(5);
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInnerJoin() {
+ ORM::forTable('widget')->innerJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testLeftOuterJoin() {
+ ORM::forTable('widget')->leftOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRightOuterJoin() {
+ ORM::forTable('widget')->rightOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testFullOuterJoin() {
+ ORM::forTable('widget')->fullOuterJoin('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->findMany();
+ $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMultipleJoinSources() {
+ ORM::forTable('widget')
+ ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
+ ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
+ ->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithAliases() {
+ ORM::forTable('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithAliasesAndWhere() {
+ ORM::forTable('widget')->tableAlias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->whereEqual('id', 1)->findMany();
+ $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testJoinWithStringConstraint() {
+ ORM::forTable('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->findMany();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoin() {
+ ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoinWithParameters() {
+ ORM::forTable('widget')->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testRawJoinAndRawWhereWithParameters() {
+ ORM::forTable('widget')
+ ->rawJoin('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
+ ->rawJoin('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
+ ->whereRaw('`id` > ? AND `id` < ?', array(5, 10))
+ ->findMany();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSelectWithDistinct() {
+ ORM::forTable('widget')->distinct()->select('name')->findMany();
+ $expected = "SELECT DISTINCT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertData() {
+ $widget = ORM::forTable('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertDataContainingAnExpression() {
+ $widget = ORM::forTable('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testInsertDataUsingArrayAccess() {
+ $widget = ORM::forTable('widget')->create();
+ $widget['name'] = "Fred";
+ $widget['age'] = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateData() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateDataContainingAnExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFields() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->setExpr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->lat_long = 'unknown';
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testDeleteData() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->delete();
+ $expected = "DELETE FROM `widget` WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testDeleteMany() {
+ ORM::forTable('widget')->whereEqual('age', 10)->delete_many();
+ $expected = "DELETE FROM `widget` WHERE `age` = '10'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testCount() {
+ ORM::forTable('widget')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIgnoreSelectAndCount() {
+ ORM::forTable('widget')->select('test')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMax() {
+ ORM::forTable('person')->max('height');
+ $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testMin() {
+ ORM::forTable('person')->min('height');
+ $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testAvg() {
+ ORM::forTable('person')->avg('height');
+ $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testSum() {
+ ORM::forTable('person')->sum('height');
+ $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ /**
+ * Regression tests
+ */
+ public function testIssue12IncorrectQuotingOfColumnWildcard() {
+ ORM::forTable('widget')->select('widget.*')->findOne();
+ $expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
+ ORM::forTable('widget')->whereRaw('username LIKE "ben%"')->findMany();
+ $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
+ ORM::forTable('widget')->whereRaw('comments LIKE "has been released?%"')->findMany();
+ $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->set('ad`ded', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+
+ public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
+ $widget = ORM::forTable('widget')->findOne(1);
+ $widget->setExpr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::getLastQuery());
+ }
+}
+
diff --git a/vendor/j4mie/idiorm/test/QueryBuilderTest.php b/vendor/j4mie/idiorm/test/QueryBuilderTest.php
new file mode 100644
index 000000000..bbd5831f8
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/QueryBuilderTest.php
@@ -0,0 +1,696 @@
+<?php
+
+class QueryBuilderTest extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ // Enable logging
+ ORM::configure('logging', true);
+
+ // Set up the dummy database connection
+ $db = new MockPDO('sqlite::memory:');
+ ORM::set_db($db);
+ }
+
+ public function tearDown() {
+ ORM::reset_config();
+ ORM::reset_db();
+ }
+
+ public function testFindMany() {
+ ORM::for_table('widget')->find_many();
+ $expected = "SELECT * FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFindOne() {
+ ORM::for_table('widget')->find_one();
+ $expected = "SELECT * FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFindOneWithPrimaryKeyFilter() {
+ ORM::for_table('widget')->find_one(5);
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdIs() {
+ ORM::for_table('widget')->where_id_is(5)->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdIn() {
+ ORM::for_table('widget')->where_id_in(array(4, 5))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `id` IN ('4', '5')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSingleWhereClause() {
+ ORM::for_table('widget')->where('name', 'Fred')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleWhereClauses() {
+ ORM::for_table('widget')->where('name', 'Fred')->where('age', 10)->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotEqual() {
+ ORM::for_table('widget')->where_not_equal('name', 'Fred')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLike() {
+ ORM::for_table('widget')->where_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotLike() {
+ ORM::for_table('widget')->where_not_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIn() {
+ ORM::for_table('widget')->where_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotIn() {
+ ORM::for_table('widget')->where_not_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIs() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('name' => 'Joe', 'age' => 10),
+ array('name' => 'Fred', 'age' => 20)))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` = '10' ) OR ( `name` = 'Fred' AND `age` = '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIsOverrideOneColumn() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('name' => 'Joe', 'age' => 10),
+ array('name' => 'Fred', 'age' => 20)), array('age' => '>'))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `name` = 'Joe' AND `age` > '10' ) OR ( `name` = 'Fred' AND `age` > '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereAnyIsOverrideAllOperators() {
+ ORM::for_table('widget')->where_any_is(array(
+ array('score' => '5', 'age' => 10),
+ array('score' => '15', 'age' => 20)), '>')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `score` > '5' AND `age` > '10' ) OR ( `score` > '15' AND `age` > '20' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimit() {
+ ORM::for_table('widget')->limit(5)->find_many();
+ $expected = "SELECT * FROM `widget` LIMIT 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLimitAndOffset() {
+ ORM::for_table('widget')->limit(5)->offset(5)->find_many();
+ $expected = "SELECT * FROM `widget` LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByDesc() {
+ ORM::for_table('widget')->order_by_desc('name')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByAsc() {
+ ORM::for_table('widget')->order_by_asc('name')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testOrderByExpression() {
+ ORM::for_table('widget')->order_by_expr('SOUNDEX(`name`)')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY SOUNDEX(`name`) LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleOrderBy() {
+ ORM::for_table('widget')->order_by_asc('name')->order_by_desc('age')->find_one();
+ $expected = "SELECT * FROM `widget` ORDER BY `name` ASC, `age` DESC LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testGroupBy() {
+ ORM::for_table('widget')->group_by('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleGroupBy() {
+ ORM::for_table('widget')->group_by('name')->group_by('age')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name`, `age`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testGroupByExpression() {
+ ORM::for_table('widget')->group_by_expr("FROM_UNIXTIME(`time`, '%Y-%m')")->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY FROM_UNIXTIME(`time`, '%Y-%m')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHaving() {
+ ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleHaving() {
+ ORM::for_table('widget')->group_by('name')->having('name', 'Fred')->having('age', 10)->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND `age` = '10' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotEqual() {
+ ORM::for_table('widget')->group_by('name')->having_not_equal('name', 'Fred')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` != 'Fred'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLike() {
+ ORM::for_table('widget')->group_by('name')->having_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotLike() {
+ ORM::for_table('widget')->group_by('name')->having_not_like('name', '%Fred%')->find_one();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT LIKE '%Fred%' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingIn() {
+ ORM::for_table('widget')->group_by('name')->having_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotIn() {
+ ORM::for_table('widget')->group_by('name')->having_not_in('name', array('Fred', 'Joe'))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` NOT IN ('Fred', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLessThan() {
+ ORM::for_table('widget')->group_by('name')->having_lt('age', 10)->having_gt('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingLessThanOrEqualAndGreaterThanOrEqual() {
+ ORM::for_table('widget')->group_by('name')->having_lte('age', 10)->having_gte('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNull() {
+ ORM::for_table('widget')->group_by('name')->having_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testHavingNotNull() {
+ ORM::for_table('widget')->group_by('name')->having_not_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawHaving() {
+ ORM::for_table('widget')->group_by('name')->having_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
+ $expected = "SELECT * FROM `widget` GROUP BY `name` HAVING `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testComplexQuery() {
+ ORM::for_table('widget')->where('name', 'Fred')->limit(5)->offset(5)->order_by_asc('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' ORDER BY `name` ASC LIMIT 5 OFFSET 5";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLessThanAndGreaterThan() {
+ ORM::for_table('widget')->where_lt('age', 10)->where_gt('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` < '10' AND `age` > '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereLessThanAndEqualAndGreaterThanAndEqual() {
+ ORM::for_table('widget')->where_lte('age', 10)->where_gte('age', 5)->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` <= '10' AND `age` >= '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNull() {
+ ORM::for_table('widget')->where_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereNotNull() {
+ ORM::for_table('widget')->where_not_null('name')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` IS NOT NULL";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClause() {
+ ORM::for_table('widget')->where_raw('`name` = ? AND (`age` = ? OR `age` = ?)', array('Fred', 5, 10))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = 'Fred' AND (`age` = '5' OR `age` = '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseWithPercentSign() {
+ ORM::for_table('widget')->where_raw('STRFTIME("%Y", "now") = ?', array(2012))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE STRFTIME(\"%Y\", \"now\") = '2012'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseWithNoParameters() {
+ ORM::for_table('widget')->where_raw('`name` = "Fred"')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `name` = \"Fred\"";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseInMethodChain() {
+ ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where('size', 'large')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawWhereClauseMultiples() {
+ ORM::for_table('widget')->where('age', 18)->where_raw('(`name` = ? OR `name` = ?)', array('Fred', 'Bob'))->where_raw('(`name` = ? OR `name` = ?)', array('Sarah', 'Jane'))->where('size', 'large')->find_many();
+ $expected = "SELECT * FROM `widget` WHERE `age` = '18' AND (`name` = 'Fred' OR `name` = 'Bob') AND (`name` = 'Sarah' OR `name` = 'Jane') AND `size` = 'large'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQuery() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w')->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQueryWithParameters() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = ? AND `age` = ?', array('Fred', 5))->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawQueryWithNamedPlaceholders() {
+ ORM::for_table('widget')->raw_query('SELECT `w`.* FROM `widget` w WHERE `name` = :name AND `age` = :age', array(':name' => 'Fred', ':age' => 5))->find_many();
+ $expected = "SELECT `w`.* FROM `widget` w WHERE `name` = 'Fred' AND `age` = '5'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleResultColumn() {
+ ORM::for_table('widget')->select('name')->find_many();
+ $expected = "SELECT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleSimpleResultColumns() {
+ ORM::for_table('widget')->select('name')->select('age')->find_many();
+ $expected = "SELECT `name`, `age` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSpecifyTableNameAndColumnInResultColumns() {
+ ORM::for_table('widget')->select('widget.name')->find_many();
+ $expected = "SELECT `widget`.`name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMainTableAlias() {
+ ORM::for_table('widget')->table_alias('w')->find_many();
+ $expected = "SELECT * FROM `widget` `w`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAliasesInResultColumns() {
+ ORM::for_table('widget')->select('widget.name', 'widget_name')->find_many();
+ $expected = "SELECT `widget`.`name` AS `widget_name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAliasesInSelectManyResults() {
+ ORM::for_table('widget')->select_many(array('widget_name' => 'widget.name'), 'widget_handle')->find_many();
+ $expected = "SELECT `widget`.`name` AS `widget_name`, `widget_handle` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLiteralExpressionInResultColumn() {
+ ORM::for_table('widget')->select_expr('COUNT(*)', 'count')->find_many();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLiteralExpressionInSelectManyResultColumns() {
+ ORM::for_table('widget')->select_many_expr(array('count' => 'COUNT(*)'), 'SUM(widget_order)')->find_many();
+ $expected = "SELECT COUNT(*) AS `count`, SUM(widget_order) FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleJoin() {
+ ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSimpleJoinWithWhereIdIsMethod() {
+ ORM::for_table('widget')->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_one(5);
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` WHERE `widget`.`id` = '5' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInnerJoin() {
+ ORM::for_table('widget')->inner_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testLeftOuterJoin() {
+ ORM::for_table('widget')->left_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` LEFT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRightOuterJoin() {
+ ORM::for_table('widget')->right_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` RIGHT OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testFullOuterJoin() {
+ ORM::for_table('widget')->full_outer_join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))->find_many();
+ $expected = "SELECT * FROM `widget` FULL OUTER JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMultipleJoinSources() {
+ ORM::for_table('widget')
+ ->join('widget_handle', array('widget_handle.widget_id', '=', 'widget.id'))
+ ->join('widget_nozzle', array('widget_nozzle.widget_id', '=', 'widget.id'))
+ ->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` JOIN `widget_nozzle` ON `widget_nozzle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithAliases() {
+ ORM::for_table('widget')->join('widget_handle', array('wh.widget_id', '=', 'widget.id'), 'wh')->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithAliasesAndWhere() {
+ ORM::for_table('widget')->table_alias('w')->join('widget_handle', array('wh.widget_id', '=', 'w.id'), 'wh')->where_equal('id', 1)->find_many();
+ $expected = "SELECT * FROM `widget` `w` JOIN `widget_handle` `wh` ON `wh`.`widget_id` = `w`.`id` WHERE `w`.`id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testJoinWithStringConstraint() {
+ ORM::for_table('widget')->join('widget_handle', "widget_handle.widget_id = widget.id")->find_many();
+ $expected = "SELECT * FROM `widget` JOIN `widget_handle` ON widget_handle.widget_id = widget.id";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoin() {
+ ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` )', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle')->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` ) `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoinWithParameters() {
+ ORM::for_table('widget')->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testRawJoinAndRawWhereWithParameters() {
+ ORM::for_table('widget')
+ ->raw_join('INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE ? AND `widget_handle`.category = ?)', array('widget_handle.widget_id', '=', 'widget.id'), 'widget_handle', array('%button%', 2))
+ ->raw_join('INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE ?)', array('person.id', '=', 'widget.person_id'), 'person', array('%Fred%'))
+ ->where_raw('`id` > ? AND `id` < ?', array(5, 10))
+ ->find_many();
+ $expected = "SELECT * FROM `widget` INNER JOIN ( SELECT * FROM `widget_handle` WHERE `widget_handle`.name LIKE '%button%' AND `widget_handle`.category = '2') `widget_handle` ON `widget_handle`.`widget_id` = `widget`.`id` INNER JOIN ( SELECT * FROM `person` WHERE `person`.name LIKE '%Fred%') `person` ON `person`.`id` = `widget`.`person_id` WHERE `id` > '5' AND `id` < '10'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSelectWithDistinct() {
+ ORM::for_table('widget')->distinct()->select('name')->find_many();
+ $expected = "SELECT DISTINCT `name` FROM `widget`";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertData() {
+ $widget = ORM::for_table('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertDataContainingAnExpression() {
+ $widget = ORM::for_table('widget')->create();
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`, `added`) VALUES ('Fred', '10', NOW())";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertDataUsingArrayAccess() {
+ $widget = ORM::for_table('widget')->create();
+ $widget['name'] = "Fred";
+ $widget['age'] = 10;
+ $widget->save();
+ $expected = "INSERT INTO `widget` (`name`, `age`) VALUES ('Fred', '10')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateData() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateDataContainingAnExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->name = "Fred";
+ $widget->age = 10;
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFields() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = GeomFromText('POINT(1.2347 2.3436)') WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateMultipleFieldsContainingAnExpressionAndOverridePreviouslySetExpression() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set(array("name" => "Fred", "age" => 10));
+ $widget->set_expr(array("added" => "NOW()", "lat_long" => "GeomFromText('POINT(1.2347 2.3436)')"));
+ $widget->lat_long = 'unknown';
+ $widget->save();
+ $expected = "UPDATE `widget` SET `name` = 'Fred', `age` = '10', `added` = NOW(), `lat_long` = 'unknown' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteData() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->delete();
+ $expected = "DELETE FROM `widget` WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteMany() {
+ ORM::for_table('widget')->where_equal('age', 10)->delete_many();
+ $expected = "DELETE FROM `widget` WHERE `age` = '10'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testCount() {
+ ORM::for_table('widget')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIgnoreSelectAndCount() {
+ ORM::for_table('widget')->select('test')->count();
+ $expected = "SELECT COUNT(*) AS `count` FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMax() {
+ ORM::for_table('person')->max('height');
+ $expected = "SELECT MAX(`height`) AS `max` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testMin() {
+ ORM::for_table('person')->min('height');
+ $expected = "SELECT MIN(`height`) AS `min` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testAvg() {
+ ORM::for_table('person')->avg('height');
+ $expected = "SELECT AVG(`height`) AS `avg` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testSum() {
+ ORM::for_table('person')->sum('height');
+ $expected = "SELECT SUM(`height`) AS `sum` FROM `person` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function test_quote_identifier_part() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set('added', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function test_quote_multiple_identifiers_part() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $expected = "`id1`, `id2`";
+ $this->assertEquals($expected, $record->_quote_identifier($record->_get_id_column_name()));
+ }
+
+ /**
+ * Compound primary key tests
+ */
+ public function testFindOneWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
+ $record->findOne(array('id1' => 10, 'name' => 'Joe', 'id2' => 20));
+ $expected = "SELECT * FROM `widget` WHERE `id1` = '10' AND `id2` = '20' LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testInsertWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $expected = "INSERT INTO `widget` (`id1`, `id2`, `name`) VALUES ('10', '20', 'Joe')";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testUpdateWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $record->set('name', 'John');
+ $record->save();
+ $expected = "UPDATE `widget` SET `name` = 'John' WHERE `id1` = '10' AND `id2` = '20'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testDeleteWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'))->create();
+ $record->set('id1', 10);
+ $record->set('id2', 20);
+ $record->set('name', 'Joe');
+ $record->save();
+ $record->delete();
+ $expected = "DELETE FROM `widget` WHERE `id1` = '10' AND `id2` = '20'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testWhereIdInWithCompoundPrimaryKey() {
+ $record = ORM::for_table('widget')->use_id_column(array('id1', 'id2'));
+ $record->where_id_in(array(
+ array('id1' => 10, 'name' => 'Joe', 'id2' => 20),
+ array('id1' => 20, 'name' => 'Joe', 'id2' => 30)))->find_many();
+ $expected = "SELECT * FROM `widget` WHERE (( `id1` = '10' AND `id2` = '20' ) OR ( `id1` = '20' AND `id2` = '30' ))";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ /**
+ * Regression tests
+ */
+ public function testIssue12IncorrectQuotingOfColumnWildcard() {
+ ORM::for_table('widget')->select('widget.*')->find_one();
+ $expected = "SELECT `widget`.* FROM `widget` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenPercentSymbolSupplied() {
+ ORM::for_table('widget')->where_raw('username LIKE "ben%"')->find_many();
+ $expected = 'SELECT * FROM `widget` WHERE username LIKE "ben%"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue57LogQueryRaisesWarningWhenQuestionMarkSupplied() {
+ ORM::for_table('widget')->where_raw('comments LIKE "has been released?%"')->find_many();
+ $expected = 'SELECT * FROM `widget` WHERE comments LIKE "has been released?%"';
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue74EscapingQuoteMarksIn_quote_identifier_part() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set('ad`ded', '2013-01-04');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `ad``ded` = '2013-01-04' WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue90UsingSetExprAloneDoesTriggerQueryGeneration() {
+ $widget = ORM::for_table('widget')->find_one(1);
+ $widget->set_expr('added', 'NOW()');
+ $widget->save();
+ $expected = "UPDATE `widget` SET `added` = NOW() WHERE `id` = '1'";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+
+ public function testIssue176LimitDoesntWorkFirstTime() {
+ ORM::reset_config();
+ ORM::reset_db();
+
+ ORM::configure('logging', true);
+ ORM::configure('connection_string', 'sqlite::memory:');
+
+ ORM::for_table('sqlite_master')->limit(1)->find_array();
+ $expected = "SELECT * FROM `sqlite_master` LIMIT 1";
+ $this->assertEquals($expected, ORM::get_last_query());
+ }
+}
+
diff --git a/vendor/j4mie/idiorm/test/bootstrap.php b/vendor/j4mie/idiorm/test/bootstrap.php
new file mode 100644
index 000000000..7fa1c48b6
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/bootstrap.php
@@ -0,0 +1,126 @@
+<?php
+
+require_once dirname(__FILE__) . '/../idiorm.php';
+
+/**
+ *
+ * Mock version of the PDOStatement class.
+ *
+ */
+class MockPDOStatement extends PDOStatement {
+ private $current_row = 0;
+ private $statement = NULL;
+ private $bindParams = array();
+
+ /**
+ * Store the statement that gets passed to the constructor
+ */
+ public function __construct($statement) {
+ $this->statement = $statement;
+ }
+
+ /**
+ * Check that the array
+ */
+ public function execute($params = NULL) {
+ $count = 0;
+ $m = array();
+ if (is_null($params)) $params = $this->bindParams;
+ if (preg_match_all('/"[^"\\\\]*(?:\\?)[^"\\\\]*"|\'[^\'\\\\]*(?:\\?)[^\'\\\\]*\'|(\\?)/', $this->statement, $m, PREG_SET_ORDER)) {
+ $count = count($m);
+ for ($v = 0; $v < $count; $v++) {
+ if (count($m[$v]) == 1) unset($m[$v]);
+ }
+ $count = count($m);
+ for ($i = 0; $i < $count; $i++) {
+ if (!isset($params[$i])) {
+ ob_start();
+ var_dump($m, $params);
+ $output = ob_get_clean();
+ throw new Exception('Incorrect parameter count. Expected ' . $count . ' got ' . count($params) . ".\n" . $this->statement . "\n" . $output);
+ }
+ }
+ }
+ }
+
+ /**
+ * Add data to arrays
+ */
+ public function bindParam($paramno, &$param, $type = NULL, $maxlen = NULL, $driverdata = NULL)
+ {
+ // Do check on type
+ if (!is_int($type) || ($type != PDO::PARAM_STR && $type != PDO::PARAM_NULL && $type != PDO::PARAM_BOOL && $type != PDO::PARAM_INT))
+ throw new Exception('Incorrect parameter type. Expected $type to be an integer.');
+
+ // Add param to array
+ $this->bindParams[is_int($paramno) ? --$paramno : $paramno] = $param;
+ }
+
+ /**
+ * Return some dummy data
+ */
+ public function fetch($fetch_style=PDO::FETCH_BOTH, $cursor_orientation=PDO::FETCH_ORI_NEXT, $cursor_offset=0) {
+ if ($this->current_row == 5) {
+ return false;
+ } else {
+ return array('name' => 'Fred', 'age' => 10, 'id' => ++$this->current_row);
+ }
+ }
+}
+
+/**
+ * Another mock PDOStatement class, used for testing multiple connections
+ */
+class MockDifferentPDOStatement extends MockPDOStatement { }
+
+/**
+ *
+ * Mock database class implementing a subset
+ * of the PDO API.
+ *
+ */
+class MockPDO extends PDO {
+
+ /**
+ * Return a dummy PDO statement
+ */
+ public function prepare($statement, $driver_options=array()) {
+ $this->last_query = new MockPDOStatement($statement);
+ return $this->last_query;
+ }
+}
+
+/**
+ * A different mock database class, for testing multiple connections
+ * Mock database class implementing a subset of the PDO API.
+ */
+class MockDifferentPDO extends MockPDO {
+
+ /**
+ * Return a dummy PDO statement
+ */
+ public function prepare($statement, $driver_options = array()) {
+ $this->last_query = new MockDifferentPDOStatement($statement);
+ return $this->last_query;
+ }
+}
+
+class MockMsSqlPDO extends MockPDO {
+
+ public $fake_driver = 'mssql';
+
+ /**
+ * If we are asking for the name of the driver, check if a fake one
+ * has been set.
+ */
+ public function getAttribute($attribute) {
+ if ($attribute == self::ATTR_DRIVER_NAME) {
+ if (!is_null($this->fake_driver)) {
+ return $this->fake_driver;
+ }
+ }
+
+ return parent::getAttribute($attribute);
+ }
+
+}
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile
new file mode 100644
index 000000000..f9640b66a
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/Dockerfile
@@ -0,0 +1,182 @@
+FROM ubuntu:12.04
+
+# configuration mostly copied from https://github.com/kuborgh/docker-php-5.2
+
+RUN mkdir /php && \
+ cd /php && \
+ apt-get update && \
+ apt-get install -y --no-install-recommends \
+ autoconf binutils build-essential bzip2 ca-certificates \
+ comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
+ libapr1-dev libaprutil1-dev libaspell-dev libaspell15 libbz2-dev \
+ libc-client2007e libc-client2007e-dev libc-dev-bin libc6-dev libcurl3 \
+ libcurl4-openssl-dev libdpkg-perl libexpat1-dev libfreetype6 \
+ libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
+ libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
+ libgssapi-krb5-2 libgssrpc4 libice-dev libice6 libidn11 libidn11-dev \
+ libjpeg-dev libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev \
+ libk5crypto3 libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 libkeyutils1 \
+ libkrb5-3 libkrb5-dev libkrb5support0 libldap2-dev libltdl-dev libltdl7 \
+ libmagic-dev libmagic1 libmcrypt-dev libmcrypt4 libmhash-dev libmhash2 \
+ libmpc2 libmpfr4 libncurses5-dev \
+ libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
+ libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
+ libquadmath0 libreadline-dev libreadline6-dev librtmp-dev librtmp0 \
+ libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev libt1-5 \
+ libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev libx11-6 libx11-data \
+ libx11-dev libxau-dev libxau6 libxaw7 libxaw7-dev libxcb1 libxcb1-dev \
+ libxdmcp-dev libxdmcp6 libxext-dev libxext6 libxml2 libxml2-dev libxmu-dev \
+ libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
+ m4 make mlock mysql-common openssl patch pkg-config uuid-dev wget \
+ x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
+ x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
+ && \
+ wget http://museum.php.net/php5/php-5.2.17.tar.bz2 && \
+ tar xfj php-5.2.17.tar.bz2 && \
+ ln -s /usr/lib/x86_64-linux-gnu/libjpeg.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libpng.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libkrb5.* /usr/lib/ && \
+ ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.* /usr/lib/ && \
+ cd php-5.2.17; \
+ wget -c -t 3 -O ./debian_patches_disable_SSLv2_for_openssl_1_0_0.patch https://bugs.php.net/patch-display.php\?bug_id\=54736\&patch\=debian_patches_disable_SSLv2_for_openssl_1_0_0.patch\&revision=1305414559\&download\=1 && \
+ patch -p1 -b < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch && \
+
+ ./configure \
+ --bindir=/usr/bin \
+ --sbindir=/usr/sbin \
+ --prefix=/usr \
+ --build=i686-pc-linux-gnu \
+ --host=i686-pc-linux-gnu \
+ --mandir=/usr/share/man \
+ --infodir=/usr/share/info \
+ --datadir=/usr/share \
+ --sysconfdir=/etc \
+ --localstatedir=/var/lib \
+ --prefix=/usr/lib/php5.2 \
+ --mandir=/usr/lib/php5.2/man \
+ --infodir=/usr/lib/php5.2/info \
+ --libdir=/usr/lib/php5.2/lib \
+ --with-libdir=lib \
+ --with-pear \
+ --disable-maintainer-zts \
+ --enable-bcmath \
+ --with-bz2 \
+ --enable-calendar \
+ --with-curl \
+ --with-curlwrappers \
+ --disable-dbase \
+ --enable-exif \
+ --without-fbsql \
+ --without-fdftk \
+ --enable-ftp \
+ --with-gettext \
+ --without-gmp \
+ --disable-ipv6 \
+ --with-kerberos \
+ --enable-mbstring \
+ --with-mcrypt \
+ --with-mhash \
+ --without-msql \
+ --without-mssql \
+ --with-ncurses \
+ --with-openssl \
+ --with-openssl-dir=/usr \
+ --disable-pcntl \
+ --without-pgsql \
+ --with-pspell \
+ --without-recode \
+ --disable-shmop \
+ --without-snmp \
+ --enable-soap \
+ --enable-sockets \
+ --without-sybase-ct \
+ --disable-sysvmsg \
+ --disable-sysvsem \
+ --disable-sysvshm \
+ --without-tidy \
+ --disable-wddx \
+ --disable-xmlreader \
+ --disable-xmlwriter \
+ --with-xmlrpc \
+ --without-xsl \
+ --enable-zip \
+ --with-zlib \
+ --disable-debug \
+ --enable-dba \
+ --without-cdb \
+ --disable-flatfile \
+ --with-gdbm \
+ --disable-inifile \
+ --without-qdbm \
+ --with-freetype-dir=/usr \
+ --with-t1lib=/usr \
+ --disable-gd-jis-conv \
+ --with-jpeg-dir=/usr \
+ --with-png-dir=/usr \
+ --without-xpm-dir \
+ --with-gd \
+ --with-imap \
+ --with-imap-ssl \
+ --without-interbase \
+ --without-mysql \
+ --without-mysqli \
+ --without-oci8 \
+ --without-pdo-dblib \
+ --without-pdo-mysql \
+ --without-pdo-pgsql \
+ --without-pdo-odbc \
+ --with-readline \
+ --without-libedit \
+ --without-mm \
+ --with-pcre-regex \
+ --with-config-file-path=/etc/php/cli-php5.2 \
+ --with-config-file-scan-dir=/etc/php/cli-php5.2/ext-active \
+ --enable-cli \
+ --disable-cgi \
+ --disable-embed \
+ --with-pic \
+ && \
+ make clean && \
+ make && \
+ make install && \
+
+ pecl install phar && \
+
+ wget https://github.com/treffynnon/php5.2-phpunit3.6.12-phar/releases/download/1.0.2/php52-phpunit.phar -O ~/phpunit && \
+ chmod +x ~/phpunit && \
+
+ cd /php && \
+
+ rm -Rf /php && \
+ rm -Rf /var/cache/* && \
+ rm -Rf /tmp/pear && \
+ apt-get purge -y \
+ apache2-prefork-dev autoconf binutils build-essential bzip2 \
+ comerr-dev cpp cpp-4.6 dpkg-dev g++ g++-4.6 gcc gcc-4.6 krb5-multidev \
+ libapr1-dev libaprutil1-dev libaspell-dev libbz2-dev \
+ libc-client2007e-dev libc-dev-bin libc6-dev \
+ libcurl4-openssl-dev libdpkg-perl libexpat1-dev \
+ libfreetype6-dev libgcrypt11-dev libgdbm-dev libgmp10 libgnutls-dev \
+ libgnutls-openssl27 libgnutlsxx27 libgomp1 libgpg-error-dev \
+ libgssrpc4 libice-dev libice6 libidn11-dev \
+ libjpeg-dev libjpeg-turbo8-dev libjpeg8-dev \
+ libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 \
+ libkrb5-dev libldap2-dev libltdl-dev libltdl7 \
+ libmagic-dev libmcrypt-dev libmhash-dev \
+ libmpc2 libmpfr4 libmysqlclient-dev libncurses5-dev \
+ libp11-kit-dev libpam0g-dev libpcre3-dev libpcrecpp0 libpng12-dev libpopt0 \
+ libpq-dev libpq5 libpspell-dev libpthread-stubs0 libpthread-stubs0-dev \
+ libquadmath0 libreadline-dev libreadline6-dev librtmp-dev \
+ libsm-dev libsm6 libsqlite3-dev libssl-dev libstdc++6-4.6-dev \
+ libt1-dev libtasn1-3-dev libtimedate-perl libtinfo-dev \
+ libx11-dev libxau-dev libxaw7 libxaw7-dev libxcb1-dev \
+ libxdmcp-dev libxext-dev libxext6 libxml2-dev libxmu-dev \
+ libxmu-headers libxmu6 libxpm-dev libxpm4 libxt-dev libxt6 linux-libc-dev \
+ m4 make patch pkg-config uuid-dev wget \
+ x11-common x11proto-core-dev x11proto-input-dev x11proto-kb-dev \
+ x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev \
+ && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
+COPY php.ini /etc/php/cli-php5.2/ \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/README.md b/vendor/j4mie/idiorm/test/docker_for_php52/README.md
new file mode 100644
index 000000000..80a6fb707
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/README.md
@@ -0,0 +1,23 @@
+# Docker for PHP 5.2 testing
+
+Run all the following commands from this diretory.
+
+# Building the image
+
+ docker build . -f Dockerfile -t treffynnon/php5.2cli
+
+# Run the tests
+
+ docker run -t -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli /root/phpunit -c /tmp/idiorm/phpunit.xml
+
+# Running the container interactively
+
+ docker run -it -v $(realpath ../..):/tmp/idiorm --rm treffynnon/php5.2cli
+
+# Running the tests
+
+ ~/phpunit -c tmp/idiorm/phpunit.xml
+
+# Getting out of the interactive container
+
+ exit \ No newline at end of file
diff --git a/vendor/j4mie/idiorm/test/docker_for_php52/php.ini b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini
new file mode 100644
index 000000000..e5395ce30
--- /dev/null
+++ b/vendor/j4mie/idiorm/test/docker_for_php52/php.ini
@@ -0,0 +1,1342 @@
+[PHP]
+
+;;;;;;;;;;;;;;;;;;;
+; About php.ini ;
+;;;;;;;;;;;;;;;;;;;
+; This file controls many aspects of PHP's behavior. In order for PHP to
+; read it, it must be named 'php.ini'. PHP looks for it in the current
+; working directory, in the path designated by the environment variable
+; PHPRC, and in the path that was defined in compile time (in that order).
+; Under Windows, the compile-time path is the Windows directory. The
+; path in which the php.ini file is looked for can be overridden using
+; the -c argument in command line mode.
+;
+; The syntax of the file is extremely simple. Whitespace and Lines
+; beginning with a semicolon are silently ignored (as you probably guessed).
+; Section headers (e.g. [Foo]) are also silently ignored, even though
+; they might mean something in the future.
+;
+; Directives are specified using the following syntax:
+; directive = value
+; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
+;
+; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one
+; of the INI constants (On, Off, True, False, Yes, No and None) or an expression
+; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo").
+;
+; Expressions in the INI file are limited to bitwise operators and parentheses:
+; | bitwise OR
+; & bitwise AND
+; ~ bitwise NOT
+; ! boolean NOT
+;
+; Boolean flags can be turned on using the values 1, On, True or Yes.
+; They can be turned off using the values 0, Off, False or No.
+;
+; An empty string can be denoted by simply not writing anything after the equal
+; sign, or by using the None keyword:
+;
+; foo = ; sets foo to an empty string
+; foo = none ; sets foo to an empty string
+; foo = "none" ; sets foo to the string 'none'
+;
+; If you use constants in your value, and these constants belong to a
+; dynamically loaded extension (either a PHP extension or a Zend extension),
+; you may only use these constants *after* the line that loads the extension.
+;
+;
+;;;;;;;;;;;;;;;;;;;
+; About this file ;
+;;;;;;;;;;;;;;;;;;;
+; This is the recommended, PHP 5-style version of the php.ini-dist file. It
+; sets some non standard settings, that make PHP more efficient, more secure,
+; and encourage cleaner coding.
+;
+; The price is that with these settings, PHP may be incompatible with some
+; applications, and sometimes, more difficult to develop with. Using this
+; file is warmly recommended for production sites. As all of the changes from
+; the standard settings are thoroughly documented, you can go over each one,
+; and decide whether you want to use it or not.
+;
+; For general information about the php.ini file, please consult the php.ini-dist
+; file, included in your PHP distribution.
+;
+; This file is different from the php.ini-dist file in the fact that it features
+; different values for several directives, in order to improve performance, while
+; possibly breaking compatibility with the standard out-of-the-box behavior of
+; PHP. Please make sure you read what's different, and modify your scripts
+; accordingly, if you decide to use this file instead.
+;
+; - register_long_arrays = Off [Performance]
+; Disables registration of the older (and deprecated) long predefined array
+; variables ($HTTP_*_VARS). Instead, use the superglobals that were
+; introduced in PHP 4.1.0
+; - display_errors = Off [Security]
+; With this directive set to off, errors that occur during the execution of
+; scripts will no longer be displayed as a part of the script output, and thus,
+; will no longer be exposed to remote users. With some errors, the error message
+; content may expose information about your script, web server, or database
+; server that may be exploitable for hacking. Production sites should have this
+; directive set to off.
+; - log_errors = On [Security]
+; This directive complements the above one. Any errors that occur during the
+; execution of your script will be logged (typically, to your server's error log,
+; but can be configured in several ways). Along with setting display_errors to off,
+; this setup gives you the ability to fully understand what may have gone wrong,
+; without exposing any sensitive information to remote users.
+; - output_buffering = 4096 [Performance]
+; Set a 4KB output buffer. Enabling output buffering typically results in less
+; writes, and sometimes less packets sent on the wire, which can often lead to
+; better performance. The gain this directive actually yields greatly depends
+; on which Web server you're working with, and what kind of scripts you're using.
+; - register_argc_argv = Off [Performance]
+; Disables registration of the somewhat redundant $argv and $argc global
+; variables.
+; - magic_quotes_gpc = Off [Performance]
+; Input data is no longer escaped with slashes so that it can be sent into
+; SQL databases without further manipulation. Instead, you should use the
+; database vendor specific escape string function on each input element you
+; wish to send to a database.
+; - variables_order = "GPCS" [Performance]
+; The environment variables are not hashed into the $_ENV. To access
+; environment variables, you can use getenv() instead.
+; - error_reporting = E_ALL [Code Cleanliness, Security(?)]
+; By default, PHP suppresses errors of type E_NOTICE. These error messages
+; are emitted for non-critical errors, but that could be a symptom of a bigger
+; problem. Most notably, this will cause error messages about the use
+; of uninitialized variables to be displayed.
+; - allow_call_time_pass_reference = Off [Code cleanliness]
+; It's not possible to decide to force a variable to be passed by reference
+; when calling a function. The PHP 4 style to do this is by making the
+; function require the relevant argument by reference.
+; - short_open_tag = Off [Portability]
+; Using short tags is discouraged when developing code meant for redistribution
+; since short tags may not be supported on the target server.
+
+;;;;;;;;;;;;;;;;;;;;
+; Language Options ;
+;;;;;;;;;;;;;;;;;;;;
+
+; Enable the PHP scripting language engine under Apache.
+engine = On
+
+; Enable compatibility mode with Zend Engine 1 (PHP 4.x)
+zend.ze1_compatibility_mode = Off
+
+; Allow the <? tag. Otherwise, only <?php and <script> tags are recognized.
+; NOTE: Using short tags should be avoided when developing applications or
+; libraries that are meant for redistribution, or deployment on PHP
+; servers which are not under your control, because short tags may not
+; be supported on the target server. For portable, redistributable code,
+; be sure not to use short tags.
+short_open_tag = Off
+
+; Allow ASP-style <% %> tags.
+asp_tags = Off
+
+; The number of significant digits displayed in floating point numbers.
+precision = 14
+
+; Enforce year 2000 compliance (will cause problems with non-compliant browsers)
+y2k_compliance = On
+
+; Output buffering allows you to send header lines (including cookies) even
+; after you send body content, at the price of slowing PHP's output layer a
+; bit. You can enable output buffering during runtime by calling the output
+; buffering functions. You can also enable output buffering for all files by
+; setting this directive to On. If you wish to limit the size of the buffer
+; to a certain size - you can use a maximum number of bytes instead of 'On', as
+; a value for this directive (e.g., output_buffering=4096).
+output_buffering = 4096
+
+; You can redirect all of the output of your scripts to a function. For
+; example, if you set output_handler to "mb_output_handler", character
+; encoding will be transparently converted to the specified encoding.
+; Setting any output handler automatically turns on output buffering.
+; Note: People who wrote portable scripts should not depend on this ini
+; directive. Instead, explicitly set the output handler using ob_start().
+; Using this ini directive may cause problems unless you know what script
+; is doing.
+; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler"
+; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
+; Note: output_handler must be empty if this is set 'On' !!!!
+; Instead you must use zlib.output_handler.
+;output_handler =
+
+; Transparent output compression using the zlib library
+; Valid values for this option are 'off', 'on', or a specific buffer size
+; to be used for compression (default is 4KB)
+; Note: Resulting chunk size may vary due to nature of compression. PHP
+; outputs chunks that are few hundreds bytes each as a result of
+; compression. If you prefer a larger chunk size for better
+; performance, enable output_buffering in addition.
+; Note: You need to use zlib.output_handler instead of the standard
+; output_handler, or otherwise the output will be corrupted.
+zlib.output_compression = Off
+;zlib.output_compression_level = -1
+
+; You cannot specify additional output handlers if zlib.output_compression
+; is activated here. This setting does the same as output_handler but in
+; a different order.
+;zlib.output_handler =
+
+; Implicit flush tells PHP to tell the output layer to flush itself
+; automatically after every output block. This is equivalent to calling the
+; PHP function flush() after each and every call to print() or echo() and each
+; and every HTML block. Turning this option on has serious performance
+; implications and is generally recommended for debugging purposes only.
+implicit_flush = Off
+
+; The unserialize callback function will be called (with the undefined class'
+; name as parameter), if the unserializer finds an undefined class
+; which should be instantiated.
+; A warning appears if the specified function is not defined, or if the
+; function doesn't include/implement the missing class.
+; So only set this entry, if you really want to implement such a
+; callback-function.
+unserialize_callback_func=
+
+; When floats & doubles are serialized store serialize_precision significant
+; digits after the floating point. The default value ensures that when floats
+; are decoded with unserialize, the data will remain the same.
+serialize_precision = 100
+
+; Whether to enable the ability to force arguments to be passed by reference
+; at function call time. This method is deprecated and is likely to be
+; unsupported in future versions of PHP/Zend. The encouraged method of
+; specifying which arguments should be passed by reference is in the function
+; declaration. You're encouraged to try and turn this option Off and make
+; sure your scripts work properly with it in order to ensure they will work
+; with future versions of the language (you will receive a warning each time
+; you use this feature, and the argument will be passed by value instead of by
+; reference).
+allow_call_time_pass_reference = Off
+
+;
+; Safe Mode
+;
+safe_mode = Off
+
+; By default, Safe Mode does a UID compare check when
+; opening files. If you want to relax this to a GID compare,
+; then turn on safe_mode_gid.
+safe_mode_gid = Off
+
+; When safe_mode is on, UID/GID checks are bypassed when
+; including files from this directory and its subdirectories.
+; (directory must also be in include_path or full path must
+; be used when including)
+safe_mode_include_dir =
+
+; When safe_mode is on, only executables located in the safe_mode_exec_dir
+; will be allowed to be executed via the exec family of functions.
+safe_mode_exec_dir =
+
+; Setting certain environment variables may be a potential security breach.
+; This directive contains a comma-delimited list of prefixes. In Safe Mode,
+; the user may only alter environment variables whose names begin with the
+; prefixes supplied here. By default, users will only be able to set
+; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR).
+;
+; Note: If this directive is empty, PHP will let the user modify ANY
+; environment variable!
+safe_mode_allowed_env_vars = PHP_
+
+; This directive contains a comma-delimited list of environment variables that
+; the end user won't be able to change using putenv(). These variables will be
+; protected even if safe_mode_allowed_env_vars is set to allow to change them.
+safe_mode_protected_env_vars = LD_LIBRARY_PATH
+
+; open_basedir, if set, limits all file operations to the defined directory
+; and below. This directive makes most sense if used in a per-directory
+; or per-virtualhost web server configuration file. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+;open_basedir =
+
+; This directive allows you to disable certain functions for security reasons.
+; It receives a comma-delimited list of function names. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+disable_functions =
+
+; This directive allows you to disable certain classes for security reasons.
+; It receives a comma-delimited list of class names. This directive is
+; *NOT* affected by whether Safe Mode is turned On or Off.
+disable_classes =
+
+; Colors for Syntax Highlighting mode. Anything that's acceptable in
+; <span style="color: ???????"> would work.
+;highlight.string = #DD0000
+;highlight.comment = #FF9900
+;highlight.keyword = #007700
+;highlight.bg = #FFFFFF
+;highlight.default = #0000BB
+;highlight.html = #000000
+
+; If enabled, the request will be allowed to complete even if the user aborts
+; the request. Consider enabling it if executing long request, which may end up
+; being interrupted by the user or a browser timing out.
+; ignore_user_abort = On
+
+; Determines the size of the realpath cache to be used by PHP. This value should
+; be increased on systems where PHP opens many files to reflect the quantity of
+; the file operations performed.
+; realpath_cache_size=16k
+
+; Duration of time, in seconds for which to cache realpath information for a given
+; file or directory. For systems with rarely changing files, consider increasing this
+; value.
+; realpath_cache_ttl=120
+
+;
+; Misc
+;
+; Decides whether PHP may expose the fact that it is installed on the server
+; (e.g. by adding its signature to the Web server header). It is no security
+; threat in any way, but it makes it possible to determine whether you use PHP
+; on your server or not.
+expose_php = Off
+
+
+;;;;;;;;;;;;;;;;;;;
+; Resource Limits ;
+;;;;;;;;;;;;;;;;;;;
+
+max_execution_time = 30 ; Maximum execution time of each script, in seconds
+max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
+;max_input_nesting_level = 64 ; Maximum input variable nesting level
+memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Error handling and logging ;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; error_reporting is a bit-field. Or each number up to get desired error
+; reporting level
+; E_ALL - All errors and warnings (doesn't include E_STRICT)
+; E_ERROR - fatal run-time errors
+; E_RECOVERABLE_ERROR - almost fatal run-time errors
+; E_WARNING - run-time warnings (non-fatal errors)
+; E_PARSE - compile-time parse errors
+; E_NOTICE - run-time notices (these are warnings which often result
+; from a bug in your code, but it's possible that it was
+; intentional (e.g., using an uninitialized variable and
+; relying on the fact it's automatically initialized to an
+; empty string)
+; E_STRICT - run-time notices, enable to have PHP suggest changes
+; to your code which will ensure the best interoperability
+; and forward compatibility of your code
+; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
+; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
+; initial startup
+; E_COMPILE_ERROR - fatal compile-time errors
+; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
+; E_USER_ERROR - user-generated error message
+; E_USER_WARNING - user-generated warning message
+; E_USER_NOTICE - user-generated notice message
+;
+; Examples:
+;
+; - Show all errors, except for notices and coding standards warnings
+;
+;error_reporting = E_ALL & ~E_NOTICE
+;
+; - Show all errors, except for notices
+;
+;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
+;
+; - Show only errors
+;
+;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
+;
+; - Show all errors, except coding standards warnings
+;
+;error_reporting = E_ALL
+error_reporting = 6135
+
+; Print out errors (as a part of the output). For production web sites,
+; you're strongly encouraged to turn this feature off, and use error logging
+; instead (see below). Keeping display_errors enabled on a production web site
+; may reveal security information to end users, such as file paths on your Web
+; server, your database schema or other information.
+;
+; possible values for display_errors:
+;
+; Off - Do not display any errors
+; stderr - Display errors to STDERR (affects only CGI/CLI binaries!)
+; On or stdout - Display errors to STDOUT (default)
+;
+; To output errors to STDERR with CGI/CLI:
+;display_errors = "stderr"
+;
+; Default
+;
+display_errors = Off
+
+; Even when display_errors is on, errors that occur during PHP's startup
+; sequence are not displayed. It's strongly recommended to keep
+; display_startup_errors off, except for when debugging.
+display_startup_errors = Off
+
+; Log errors into a log file (server-specific log, stderr, or error_log (below))
+; As stated above, you're strongly advised to use error logging in place of
+; error displaying on production web sites.
+log_errors = On
+
+; Set maximum length of log_errors. In error_log information about the source is
+; added. The default is 1024 and 0 allows to not apply any maximum length at all.
+log_errors_max_len = 1024
+
+; Do not log repeated messages. Repeated errors must occur in same file on same
+; line unless ignore_repeated_source is set true.
+ignore_repeated_errors = Off
+
+; Ignore source of message when ignoring repeated messages. When this setting
+; is On you will not log errors with repeated messages from different files or
+; source lines.
+ignore_repeated_source = Off
+
+; If this parameter is set to Off, then memory leaks will not be shown (on
+; stdout or in the log). This has only effect in a debug compile, and if
+; error reporting includes E_WARNING in the allowed list
+report_memleaks = On
+
+;report_zend_debug = 0
+
+; Store the last error/warning message in $php_errormsg (boolean).
+track_errors = Off
+
+; Turn off normal error reporting and emit XML-RPC error XML
+;xmlrpc_errors = 0
+; An XML-RPC faultCode
+;xmlrpc_error_number = 0
+
+; Disable the inclusion of HTML tags in error messages.
+; Note: Never use this feature for production boxes.
+;html_errors = Off
+
+; If html_errors is set On PHP produces clickable error messages that direct
+; to a page describing the error or function causing the error in detail.
+; You can download a copy of the PHP manual from http://www.php.net/docs.php
+; and change docref_root to the base URL of your local copy including the
+; leading '/'. You must also specify the file extension being used including
+; the dot.
+; Note: Never use this feature for production boxes.
+;docref_root = "/phpmanual/"
+;docref_ext = .html
+
+; String to output before an error message.
+;error_prepend_string = "<font color=#ff0000>"
+
+; String to output after an error message.
+;error_append_string = "</font>"
+
+; Log errors to specified file.
+;error_log = filename
+
+; Log errors to syslog (Event Log on NT, not valid in Windows 95).
+;error_log = syslog
+
+
+;;;;;;;;;;;;;;;;;
+; Data Handling ;
+;;;;;;;;;;;;;;;;;
+;
+; Note - track_vars is ALWAYS enabled as of PHP 4.0.3
+
+; The separator used in PHP generated URLs to separate arguments.
+; Default is "&".
+;arg_separator.output = "&amp;"
+
+; List of separator(s) used by PHP to parse input URLs into variables.
+; Default is "&".
+; NOTE: Every character in this directive is considered as separator!
+;arg_separator.input = ";&"
+
+; This directive describes the order in which PHP registers GET, POST, Cookie,
+; Environment and Built-in variables (G, P, C, E & S respectively, often
+; referred to as EGPCS or GPC). Registration is done from left to right, newer
+; values override older values.
+variables_order = "GPCS"
+
+; Whether or not to register the EGPCS variables as global variables. You may
+; want to turn this off if you don't want to clutter your scripts' global scope
+; with user data. This makes most sense when coupled with track_vars - in which
+; case you can access all of the GPC variables through the $HTTP_*_VARS[],
+; variables.
+;
+; You should do your best to write your scripts so that they do not require
+; register_globals to be on; Using form variables as globals can easily lead
+; to possible security problems, if the code is not very well thought of.
+register_globals = Off
+
+; Whether or not to register the old-style input arrays, HTTP_GET_VARS
+; and friends. If you're not using them, it's recommended to turn them off,
+; for performance reasons.
+register_long_arrays = Off
+
+; This directive tells PHP whether to declare the argv&argc variables (that
+; would contain the GET information). If you don't use these variables, you
+; should turn it off for increased performance.
+register_argc_argv = Off
+
+; When enabled, the SERVER and ENV variables are created when they're first
+; used (Just In Time) instead of when the script starts. If these variables
+; are not used within a script, having this directive on will result in a
+; performance gain. The PHP directives register_globals, register_long_arrays,
+; and register_argc_argv must be disabled for this directive to have any affect.
+auto_globals_jit = On
+
+; Maximum size of POST data that PHP will accept.
+post_max_size = 8M
+
+; Magic quotes
+;
+
+; Magic quotes for incoming GET/POST/Cookie data.
+magic_quotes_gpc = Off
+
+; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
+magic_quotes_runtime = Off
+
+; Use Sybase-style magic quotes (escape ' with '' instead of \').
+magic_quotes_sybase = Off
+
+; Automatically add files before or after any PHP document.
+auto_prepend_file =
+auto_append_file =
+
+; As of 4.0b4, PHP always outputs a character encoding by default in
+; the Content-type: header. To disable sending of the charset, simply
+; set it to be empty.
+;
+; PHP's built-in default is text/html
+default_mimetype = "text/html"
+;default_charset = "iso-8859-1"
+
+; Always populate the $HTTP_RAW_POST_DATA variable.
+;always_populate_raw_post_data = On
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;
+; Paths and Directories ;
+;;;;;;;;;;;;;;;;;;;;;;;;;
+
+; UNIX: "/path1:/path2"
+include_path = ".:/usr/lib/php5.2/lib/php"
+;
+; Windows: "\path1;\path2"
+;include_path = ".;c:\php\includes"
+
+; The root of the PHP pages, used only if nonempty.
+; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
+; if you are running php as a CGI under any web server (other than IIS)
+; see documentation for security issues. The alternate is to use the
+; cgi.force_redirect configuration below
+doc_root =
+
+; The directory under which PHP opens the script using /~username used only
+; if nonempty.
+user_dir =
+
+; Directory in which the loadable extensions (modules) reside.
+extension_dir = "/usr/lib/php5.2/lib/extensions/no-debug-non-zts-20060613/"
+
+; Whether or not to enable the dl() function. The dl() function does NOT work
+; properly in multithreaded servers, such as IIS or Zeus, and is automatically
+; disabled on them.
+enable_dl = On
+
+; cgi.force_redirect is necessary to provide security running PHP as a CGI under
+; most web servers. Left undefined, PHP turns this on by default. You can
+; turn it off here AT YOUR OWN RISK
+; **You CAN safely turn this off for IIS, in fact, you MUST.**
+; cgi.force_redirect = 1
+
+; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
+; every request.
+; cgi.nph = 1
+
+; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
+; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
+; will look for to know it is OK to continue execution. Setting this variable MAY
+; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
+; cgi.redirect_status_env = ;
+
+; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
+; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
+; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
+; this to 1 will cause PHP CGI to fix it's paths to conform to the spec. A setting
+; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
+; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
+; cgi.fix_pathinfo=1
+
+; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate
+; security tokens of the calling client. This allows IIS to define the
+; security context that the request runs under. mod_fastcgi under Apache
+; does not currently support this feature (03/17/2002)
+; Set to 1 if running under IIS. Default is zero.
+; fastcgi.impersonate = 1;
+
+; Disable logging through FastCGI connection
+; fastcgi.logging = 0
+
+; cgi.rfc2616_headers configuration option tells PHP what type of headers to
+; use when sending HTTP response code. If it's set 0 PHP sends Status: header that
+; is supported by Apache. When this option is set to 1 PHP will send
+; RFC2616 compliant header.
+; Default is zero.
+;cgi.rfc2616_headers = 0
+
+
+;;;;;;;;;;;;;;;;
+; File Uploads ;
+;;;;;;;;;;;;;;;;
+
+; Whether to allow HTTP file uploads.
+file_uploads = On
+
+; Temporary directory for HTTP uploaded files (will use system default if not
+; specified).
+;upload_tmp_dir =
+
+; Maximum allowed size for uploaded files.
+upload_max_filesize = 2M
+
+
+; Maximum number of files that can be uploaded via a single request
+max_file_uploads = 20
+
+;;;;;;;;;;;;;;;;;;
+; Fopen wrappers ;
+;;;;;;;;;;;;;;;;;;
+
+; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
+allow_url_fopen = On
+
+; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
+allow_url_include = Off
+
+; Define the anonymous ftp password (your email address)
+
+; Define the User-Agent string
+; user_agent="PHP"
+
+; Default timeout for socket based streams (seconds)
+default_socket_timeout = 60
+
+; If your scripts have to deal with files from Macintosh systems,
+; or you are running on a Mac and need to deal with files from
+; unix or win32 systems, setting this flag will cause PHP to
+; automatically detect the EOL character in those files so that
+; fgets() and file() will work regardless of the source of the file.
+; auto_detect_line_endings = Off
+
+
+;;;;;;;;;;;;;;;;;;;;;;
+; Dynamic Extensions ;
+;;;;;;;;;;;;;;;;;;;;;;
+;
+; If you wish to have an extension loaded automatically, use the following
+; syntax:
+;
+; extension=modulename.extension
+;
+; For example, on Windows:
+;
+; extension=msql.dll
+;
+; ... or under UNIX:
+;
+; extension=msql.so
+;
+; Note that it should be the name of the module only; no directory information
+; needs to go here. Specify the location of the extension with the
+; extension_dir directive above.
+
+
+; Windows Extensions
+; Note that ODBC support is built in, so no dll is needed for it.
+; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)
+; extension folders as well as the separate PECL DLL download (PHP 5).
+; Be sure to appropriately set the extension_dir directive.
+
+;extension=php_bz2.dll
+;extension=php_curl.dll
+;extension=php_dba.dll
+;extension=php_dbase.dll
+;extension=php_fdf.dll
+;extension=php_gd2.dll
+;extension=php_gettext.dll
+;extension=php_gmp.dll
+;extension=php_ifx.dll
+;extension=php_imap.dll
+;extension=php_interbase.dll
+;extension=php_ldap.dll
+;extension=php_mbstring.dll
+;extension=php_exif.dll
+;extension=php_mcrypt.dll
+;extension=php_mhash.dll
+;extension=php_mime_magic.dll
+;extension=php_ming.dll
+;extension=php_msql.dll
+;extension=php_mssql.dll
+;extension=php_mysql.dll
+;extension=php_mysqli.dll
+;extension=php_oci8.dll
+;extension=php_openssl.dll
+;extension=php_pdo.dll
+;extension=php_pdo_firebird.dll
+;extension=php_pdo_mssql.dll
+;extension=php_pdo_mysql.dll
+;extension=php_pdo_oci.dll
+;extension=php_pdo_oci8.dll
+;extension=php_pdo_odbc.dll
+;extension=php_pdo_pgsql.dll
+;extension=php_pdo_sqlite.dll
+;extension=php_pgsql.dll
+;extension=php_pspell.dll
+;extension=php_shmop.dll
+;extension=php_snmp.dll
+;extension=php_soap.dll
+;extension=php_sockets.dll
+;extension=php_sqlite.dll
+;extension=php_sybase_ct.dll
+;extension=php_tidy.dll
+;extension=php_xmlrpc.dll
+;extension=php_xsl.dll
+;extension=php_zip.dll
+extension=phar.so
+
+;;;;;;;;;;;;;;;;;;;
+; Module Settings ;
+;;;;;;;;;;;;;;;;;;;
+
+[Date]
+; Defines the default timezone used by the date functions
+date.timezone = "Europe/Berlin"
+
+;date.default_latitude = 31.7667
+;date.default_longitude = 35.2333
+
+;date.sunrise_zenith = 90.583333
+;date.sunset_zenith = 90.583333
+
+[filter]
+;filter.default = unsafe_raw
+;filter.default_flags =
+
+[iconv]
+;iconv.input_encoding = ISO-8859-1
+;iconv.internal_encoding = ISO-8859-1
+;iconv.output_encoding = ISO-8859-1
+
+[sqlite]
+;sqlite.assoc_case = 0
+
+[Pcre]
+;PCRE library backtracking limit.
+;pcre.backtrack_limit=100000
+
+;PCRE library recursion limit.
+;Please note that if you set this value to a high number you may consume all
+;the available process stack and eventually crash PHP (due to reaching the
+;stack size limit imposed by the Operating System).
+;pcre.recursion_limit=100000
+
+[Syslog]
+; Whether or not to define the various syslog variables (e.g. $LOG_PID,
+; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In
+; runtime, you can define these variables by calling define_syslog_variables().
+define_syslog_variables = Off
+
+[mail function]
+; For Win32 only.
+SMTP = localhost
+smtp_port = 25
+
+; For Win32 only.
+;sendmail_from = [email protected]
+
+; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
+sendmail_path = "/usr/sbin/ssmtp -t"
+
+; Force the addition of the specified parameters to be passed as extra parameters
+; to the sendmail binary. These parameters will always replace the value of
+; the 5th parameter to mail(), even in safe mode.
+;mail.force_extra_parameters =
+
+[SQL]
+sql.safe_mode = Off
+
+[ODBC]
+;odbc.default_db = Not yet implemented
+;odbc.default_user = Not yet implemented
+;odbc.default_pw = Not yet implemented
+
+; Allow or prevent persistent links.
+odbc.allow_persistent = On
+
+; Check that a connection is still valid before reuse.
+odbc.check_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+odbc.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+odbc.max_links = -1
+
+; Handling of LONG fields. Returns number of bytes to variables. 0 means
+; passthru.
+odbc.defaultlrl = 4096
+
+; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
+; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
+; of uodbc.defaultlrl and uodbc.defaultbinmode
+odbc.defaultbinmode = 1
+
+[MySQL]
+; Allow or prevent persistent links.
+mysql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+mysql.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+mysql.max_links = -1
+
+; Default port number for mysql_connect(). If unset, mysql_connect() will use
+; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
+; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
+; at MYSQL_PORT.
+mysql.default_port =
+
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+mysql.default_socket =
+
+; Default host for mysql_connect() (doesn't apply in safe mode).
+mysql.default_host =
+
+; Default user for mysql_connect() (doesn't apply in safe mode).
+mysql.default_user =
+
+; Default password for mysql_connect() (doesn't apply in safe mode).
+; Note that this is generally a *bad* idea to store passwords in this file.
+; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password")
+; and reveal this password! And of course, any users with read access to this
+; file will be able to reveal the password as well.
+mysql.default_password =
+
+; Maximum time (in seconds) for connect timeout. -1 means no limit
+mysql.connect_timeout = 60
+
+; Trace mode. When trace_mode is active (=On), warnings for table/index scans and
+; SQL-Errors will be displayed.
+mysql.trace_mode = Off
+
+[MySQLi]
+
+; Maximum number of links. -1 means no limit.
+mysqli.max_links = -1
+
+; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
+; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
+; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
+; at MYSQL_PORT.
+mysqli.default_port = 3306
+
+; Default socket name for local MySQL connects. If empty, uses the built-in
+; MySQL defaults.
+mysqli.default_socket =
+
+; Default host for mysql_connect() (doesn't apply in safe mode).
+mysqli.default_host =
+
+; Default user for mysql_connect() (doesn't apply in safe mode).
+mysqli.default_user =
+
+; Default password for mysqli_connect() (doesn't apply in safe mode).
+; Note that this is generally a *bad* idea to store passwords in this file.
+; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
+; and reveal this password! And of course, any users with read access to this
+; file will be able to reveal the password as well.
+mysqli.default_pw =
+
+; Allow or prevent reconnect
+mysqli.reconnect = Off
+
+[mSQL]
+; Allow or prevent persistent links.
+msql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+msql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+msql.max_links = -1
+
+[OCI8]
+; enables privileged connections using external credentials (OCI_SYSOPER, OCI_SYSDBA)
+;oci8.privileged_connect = Off
+
+; Connection: The maximum number of persistent OCI8 connections per
+; process. Using -1 means no limit.
+;oci8.max_persistent = -1
+
+; Connection: The maximum number of seconds a process is allowed to
+; maintain an idle persistent connection. Using -1 means idle
+; persistent connections will be maintained forever.
+;oci8.persistent_timeout = -1
+
+; Connection: The number of seconds that must pass before issuing a
+; ping during oci_pconnect() to check the connection validity. When
+; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
+; pings completely.
+;oci8.ping_interval = 60
+
+; Tuning: This option enables statement caching, and specifies how
+; many statements to cache. Using 0 disables statement caching.
+;oci8.statement_cache_size = 20
+
+; Tuning: Enables statement prefetching and sets the default number of
+; rows that will be fetched automatically after statement execution.
+;oci8.default_prefetch = 10
+
+; Compatibility. Using On means oci_close() will not close
+; oci_connect() and oci_new_connect() connections.
+;oci8.old_oci_close_semantics = Off
+
+[PostgresSQL]
+; Allow or prevent persistent links.
+pgsql.allow_persistent = On
+
+; Detect broken persistent links always with pg_pconnect().
+; Auto reset feature requires a little overheads.
+pgsql.auto_reset_persistent = Off
+
+; Maximum number of persistent links. -1 means no limit.
+pgsql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+pgsql.max_links = -1
+
+; Ignore PostgreSQL backends Notice message or not.
+; Notice message logging require a little overheads.
+pgsql.ignore_notice = 0
+
+; Log PostgreSQL backends Notice message or not.
+; Unless pgsql.ignore_notice=0, module cannot log notice message.
+pgsql.log_notice = 0
+
+[Sybase]
+; Allow or prevent persistent links.
+sybase.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+sybase.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+sybase.max_links = -1
+
+;sybase.interface_file = "/usr/sybase/interfaces"
+
+; Minimum error severity to display.
+sybase.min_error_severity = 10
+
+; Minimum message severity to display.
+sybase.min_message_severity = 10
+
+; Compatibility mode with old versions of PHP 3.0.
+; If on, this will cause PHP to automatically assign types to results according
+; to their Sybase type, instead of treating them all as strings. This
+; compatibility mode will probably not stay around forever, so try applying
+; whatever necessary changes to your code, and turn it off.
+sybase.compatability_mode = Off
+
+[Sybase-CT]
+; Allow or prevent persistent links.
+sybct.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+sybct.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+sybct.max_links = -1
+
+; Minimum server message severity to display.
+sybct.min_server_severity = 10
+
+; Minimum client message severity to display.
+sybct.min_client_severity = 10
+
+[bcmath]
+; Number of decimal digits for all bcmath functions.
+bcmath.scale = 0
+
+[browscap]
+;browscap = extra/browscap.ini
+
+[Informix]
+; Default host for ifx_connect() (doesn't apply in safe mode).
+ifx.default_host =
+
+; Default user for ifx_connect() (doesn't apply in safe mode).
+ifx.default_user =
+
+; Default password for ifx_connect() (doesn't apply in safe mode).
+ifx.default_password =
+
+; Allow or prevent persistent links.
+ifx.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+ifx.max_persistent = -1
+
+; Maximum number of links (persistent + non-persistent). -1 means no limit.
+ifx.max_links = -1
+
+; If on, select statements return the contents of a text blob instead of its id.
+ifx.textasvarchar = 0
+
+; If on, select statements return the contents of a byte blob instead of its id.
+ifx.byteasvarchar = 0
+
+; Trailing blanks are stripped from fixed-length char columns. May help the
+; life of Informix SE users.
+ifx.charasvarchar = 0
+
+; If on, the contents of text and byte blobs are dumped to a file instead of
+; keeping them in memory.
+ifx.blobinfile = 0
+
+; NULL's are returned as empty strings, unless this is set to 1. In that case,
+; NULL's are returned as string 'NULL'.
+ifx.nullformat = 0
+
+[Session]
+; Handler used to store/retrieve data.
+session.save_handler = files
+
+; Argument passed to save_handler. In the case of files, this is the path
+; where data files are stored. Note: Windows users have to change this
+; variable in order to use PHP's session functions.
+;
+; As of PHP 4.0.1, you can define the path as:
+;
+; session.save_path = "N;/path"
+;
+; where N is an integer. Instead of storing all the session files in
+; /path, what this will do is use subdirectories N-levels deep, and
+; store the session data in those directories. This is useful if you
+; or your OS have problems with lots of files in one directory, and is
+; a more efficient layout for servers that handle lots of sessions.
+;
+; NOTE 1: PHP will not create this directory structure automatically.
+; You can use the script in the ext/session dir for that purpose.
+; NOTE 2: See the section on garbage collection below if you choose to
+; use subdirectories for session storage
+;
+; The file storage module creates files using mode 600 by default.
+; You can change that by using
+;
+; session.save_path = "N;MODE;/path"
+;
+; where MODE is the octal representation of the mode. Note that this
+; does not overwrite the process's umask.
+;session.save_path = "/tmp"
+
+; Whether to use cookies.
+session.use_cookies = 1
+
+;session.cookie_secure =
+
+; This option enables administrators to make their users invulnerable to
+; attacks which involve passing session ids in URLs; defaults to 0.
+; session.use_only_cookies = 1
+
+; Name of the session (used as cookie name).
+session.name = PHPSESSID
+
+; Initialize session on request startup.
+session.auto_start = 0
+
+; Lifetime in seconds of cookie or, if 0, until browser is restarted.
+session.cookie_lifetime = 28800
+
+; The path for which the cookie is valid.
+session.cookie_path = /
+
+; The domain for which the cookie is valid.
+session.cookie_domain =
+
+; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript.
+session.cookie_httponly =
+
+; Handler used to serialize data. php is the standard serializer of PHP.
+session.serialize_handler = php
+
+; Define the probability that the 'garbage collection' process is started
+; on every session initialization.
+; The probability is calculated by using gc_probability/gc_divisor,
+; e.g. 1/100 means there is a 1% chance that the GC process starts
+; on each request.
+
+session.gc_probability = 1
+session.gc_divisor = 1000
+
+; After this number of seconds, stored data will be seen as 'garbage' and
+; cleaned up by the garbage collection process.
+session.gc_maxlifetime = 1440
+
+; NOTE: If you are using the subdirectory option for storing session files
+; (see session.save_path above), then garbage collection does *not*
+; happen automatically. You will need to do your own garbage
+; collection through a shell script, cron entry, or some other method.
+; For example, the following script would is the equivalent of
+; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
+; cd /path/to/sessions; find -cmin +24 | xargs rm
+
+; PHP 4.2 and less have an undocumented feature/bug that allows you to
+; to initialize a session variable in the global scope, albeit register_globals
+; is disabled. PHP 4.3 and later will warn you, if this feature is used.
+; You can disable the feature and the warning separately. At this time,
+; the warning is only displayed, if bug_compat_42 is enabled.
+
+session.bug_compat_42 = 0
+session.bug_compat_warn = 1
+
+; Check HTTP Referer to invalidate externally stored URLs containing ids.
+; HTTP_REFERER has to contain this substring for the session to be
+; considered as valid.
+session.referer_check =
+
+; How many bytes to read from the file.
+session.entropy_length = 0
+
+; Specified here to create the session id.
+session.entropy_file =
+
+;session.entropy_length = 16
+
+;session.entropy_file = /dev/urandom
+
+; Set to {nocache,private,public,} to determine HTTP caching aspects
+; or leave this empty to avoid sending anti-caching headers.
+session.cache_limiter = nocache
+
+; Document expires after n minutes.
+session.cache_expire = 180
+
+; trans sid support is disabled by default.
+; Use of trans sid may risk your users security.
+; Use this option with caution.
+; - User may send URL contains active session ID
+; to other person via. email/irc/etc.
+; - URL that contains active session ID may be stored
+; in publically accessible computer.
+; - User may access your site with the same session ID
+; always using URL stored in browser's history or bookmarks.
+session.use_trans_sid = 0
+
+; Select a hash function
+; 0: MD5 (128 bits)
+; 1: SHA-1 (160 bits)
+session.hash_function = 0
+
+; Define how many bits are stored in each character when converting
+; the binary hash data to something readable.
+;
+; 4 bits: 0-9, a-f
+; 5 bits: 0-9, a-v
+; 6 bits: 0-9, a-z, A-Z, "-", ","
+session.hash_bits_per_character = 5
+
+; The URL rewriter will look for URLs in a defined set of HTML tags.
+; form/fieldset are special; if you include them here, the rewriter will
+; add a hidden <input> field with the info which is otherwise appended
+; to URLs. If you want XHTML conformity, remove the form entry.
+; Note that all valid entries require a "=", even if no value follows.
+url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
+
+[MSSQL]
+; Allow or prevent persistent links.
+mssql.allow_persistent = On
+
+; Maximum number of persistent links. -1 means no limit.
+mssql.max_persistent = -1
+
+; Maximum number of links (persistent+non persistent). -1 means no limit.
+mssql.max_links = -1
+
+; Minimum error severity to display.
+mssql.min_error_severity = 10
+
+; Minimum message severity to display.
+mssql.min_message_severity = 10
+
+; Compatibility mode with old versions of PHP 3.0.
+mssql.compatability_mode = Off
+
+; Connect timeout
+;mssql.connect_timeout = 5
+
+; Query timeout
+;mssql.timeout = 60
+
+; Valid range 0 - 2147483647. Default = 4096.
+;mssql.textlimit = 4096
+
+; Valid range 0 - 2147483647. Default = 4096.
+;mssql.textsize = 4096
+
+; Limits the number of records in each batch. 0 = all records in one batch.
+;mssql.batchsize = 0
+
+; Specify how datetime and datetim4 columns are returned
+; On => Returns data converted to SQL server settings
+; Off => Returns values as YYYY-MM-DD hh:mm:ss
+;mssql.datetimeconvert = On
+
+; Use NT authentication when connecting to the server
+mssql.secure_connection = Off
+
+; Specify max number of processes. -1 = library default
+; msdlib defaults to 25
+; FreeTDS defaults to 4096
+;mssql.max_procs = -1
+
+; Specify client character set.
+; If empty or not set the client charset from freetds.comf is used
+; This is only used when compiled with FreeTDS
+;mssql.charset = "ISO-8859-1"
+
+[Assertion]
+; Assert(expr); active by default.
+;assert.active = On
+
+; Issue a PHP warning for each failed assertion.
+;assert.warning = On
+
+; Don't bail out by default.
+;assert.bail = Off
+
+; User-function to be called if an assertion fails.
+;assert.callback = 0
+
+; Eval the expression with current error_reporting(). Set to true if you want
+; error_reporting(0) around the eval().
+;assert.quiet_eval = 0
+
+[COM]
+; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
+;com.typelib_file =
+; allow Distributed-COM calls
+;com.allow_dcom = true
+; autoregister constants of a components typlib on com_load()
+;com.autoregister_typelib = true
+; register constants casesensitive
+;com.autoregister_casesensitive = false
+; show warnings on duplicate constant registrations
+;com.autoregister_verbose = true
+
+[mbstring]
+; language for internal character representation.
+;mbstring.language = Japanese
+
+; internal/script encoding.
+; Some encoding cannot work as internal encoding.
+; (e.g. SJIS, BIG5, ISO-2022-*)
+;mbstring.internal_encoding = EUC-JP
+
+; http input encoding.
+;mbstring.http_input = auto
+
+; http output encoding. mb_output_handler must be
+; registered as output buffer to function
+;mbstring.http_output = SJIS
+
+; enable automatic encoding translation according to
+; mbstring.internal_encoding setting. Input chars are
+; converted to internal encoding by setting this to On.
+; Note: Do _not_ use automatic encoding translation for
+; portable libs/applications.
+;mbstring.encoding_translation = Off
+
+; automatic encoding detection order.
+; auto means
+;mbstring.detect_order = auto
+
+; substitute_character used when character cannot be converted
+; one from another
+;mbstring.substitute_character = none;
+
+; overload(replace) single byte functions by mbstring functions.
+; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
+; etc. Possible values are 0,1,2,4 or combination of them.
+; For example, 7 for overload everything.
+; 0: No overload
+; 1: Overload mail() function
+; 2: Overload str*() functions
+; 4: Overload ereg*() functions
+;mbstring.func_overload = 0
+
+; enable strict encoding detection.
+;mbstring.strict_detection = Off
+
+[FrontBase]
+;fbsql.allow_persistent = On
+;fbsql.autocommit = On
+;fbsql.show_timestamp_decimals = Off
+;fbsql.default_database =
+;fbsql.default_database_password =
+;fbsql.default_host =
+;fbsql.default_password =
+;fbsql.default_user = "_SYSTEM"
+;fbsql.generate_warnings = Off
+;fbsql.max_connections = 128
+;fbsql.max_links = 128
+;fbsql.max_persistent = -1
+;fbsql.max_results = 128
+
+[gd]
+; Tell the jpeg decode to libjpeg warnings and try to create
+; a gd image. The warning will then be displayed as notices
+; disabled by default
+;gd.jpeg_ignore_warning = 0
+
+[exif]
+; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS.
+; With mbstring support this will automatically be converted into the encoding
+; given by corresponding encode setting. When empty mbstring.internal_encoding
+; is used. For the decode settings you can distinguish between motorola and
+; intel byte order. A decode setting cannot be empty.
+;exif.encode_unicode = ISO-8859-15
+;exif.decode_unicode_motorola = UCS-2BE
+;exif.decode_unicode_intel = UCS-2LE
+;exif.encode_jis =
+;exif.decode_jis_motorola = JIS
+;exif.decode_jis_intel = JIS
+
+[Tidy]
+; The path to a default tidy configuration file to use when using tidy
+;tidy.default_config = /usr/local/lib/php/default.tcfg
+
+; Should tidy clean and repair output automatically?
+; WARNING: Do not use this option if you are generating non-html content
+; such as dynamic images
+tidy.clean_output = Off
+
+[soap]
+; Enables or disables WSDL caching feature.
+soap.wsdl_cache_enabled=1
+; Sets the directory name where SOAP extension will put cache files.
+soap.wsdl_cache_dir="/tmp"
+; (time to live) Sets the number of second while cached file will be used
+; instead of original one.
+soap.wsdl_cache_ttl=86400
+
+; Local Variables:
+; tab-width: 4
+; End: \ No newline at end of file
diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md
index e5b26bf5c..708cdfcbd 100644
--- a/vendor/nikic/php-parser/README.md
+++ b/vendor/nikic/php-parser/README.md
@@ -3,10 +3,10 @@ PHP Parser
[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)
-This is a PHP 5.2 to PHP 8.0 parser written in PHP. Its purpose is to simplify static code analysis and
+This is a PHP 5.2 to PHP 8.1 parser written in PHP. Its purpose is to simplify static code analysis and
manipulation.
-[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.0).
+[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.1).
[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).
diff --git a/vendor/nikic/php-parser/bin/php-parse b/vendor/nikic/php-parser/bin/php-parse
index bb3e46df4..bb3e46df4 100644..100755
--- a/vendor/nikic/php-parser/bin/php-parse
+++ b/vendor/nikic/php-parser/bin/php-parse
diff --git a/vendor/nikic/php-parser/grammar/php5.y b/vendor/nikic/php-parser/grammar/php5.y
index f9e7e7dd1..a62e9a310 100644
--- a/vendor/nikic/php-parser/grammar/php5.y
+++ b/vendor/nikic/php-parser/grammar/php5.y
@@ -689,9 +689,7 @@ array_expr:
scalar_dereference:
array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
- | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']'
- { $attrs = attributes(); $attrs['kind'] = strKind($1);
- $$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; }
+ | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; }
| constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
| scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
/* alternative array syntax missing intentionally */
@@ -793,10 +791,8 @@ ctor_arguments:
common_scalar:
T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); }
- | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; }
- | T_CONSTANT_ENCAPSED_STRING
- { $attrs = attributes(); $attrs['kind'] = strKind($1);
- $$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); }
+ | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); }
+ | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); }
| T_LINE { $$ = Scalar\MagicConst\Line[]; }
| T_FILE { $$ = Scalar\MagicConst\File[]; }
| T_DIR { $$ = Scalar\MagicConst\Dir[]; }
diff --git a/vendor/nikic/php-parser/grammar/php7.y b/vendor/nikic/php-parser/grammar/php7.y
index eac68d095..087bc7392 100644
--- a/vendor/nikic/php-parser/grammar/php7.y
+++ b/vendor/nikic/php-parser/grammar/php7.y
@@ -382,8 +382,18 @@ enum_case_expr:
class_entry_type:
T_CLASS { $$ = 0; }
- | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
- | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; }
+ | class_modifiers T_CLASS { $$ = $1; }
+;
+
+class_modifiers:
+ class_modifier { $$ = $1; }
+ | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; }
+;
+
+class_modifier:
+ T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
+ | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; }
+ | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; }
;
extends_from:
@@ -1014,9 +1024,7 @@ dereferencable_scalar:
{ $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG;
$$ = new Expr\Array_($3, $attrs); }
| array_short_syntax { $$ = $1; }
- | T_CONSTANT_ENCAPSED_STRING
- { $attrs = attributes(); $attrs['kind'] = strKind($1);
- $$ = new Scalar\String_(Scalar\String_::parse($1), $attrs); }
+ | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); }
| '"' encaps_list '"'
{ $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); }
@@ -1024,7 +1032,7 @@ dereferencable_scalar:
scalar:
T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); }
- | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; }
+ | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); }
| dereferencable_scalar { $$ = $1; }
| constant { $$ = $1; }
| class_constant { $$ = $1; }
diff --git a/vendor/nikic/php-parser/grammar/phpyLang.php b/vendor/nikic/php-parser/grammar/phpyLang.php
index 1a9808dcf..663c2a144 100644
--- a/vendor/nikic/php-parser/grammar/phpyLang.php
+++ b/vendor/nikic/php-parser/grammar/phpyLang.php
@@ -128,14 +128,6 @@ function resolveMacros($code) {
. ' else { ' . $args[0] . ' = null; }';
}
- if ('strKind' === $name) {
- assertArgs(1, $args, $name);
-
- return '(' . $args[0] . '[0] === "\'" || (' . $args[0] . '[1] === "\'" && '
- . '(' . $args[0] . '[0] === \'b\' || ' . $args[0] . '[0] === \'B\')) '
- . '? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED)';
- }
-
if ('prependLeadingComments' === $name) {
assertArgs(1, $args, $name);
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php
index 87e2901a9..35b54d041 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php
@@ -67,7 +67,7 @@ class Class_ extends Declaration
* @return $this The builder instance (for fluid interface)
*/
public function makeAbstract() {
- $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);
+ $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);
return $this;
}
@@ -78,7 +78,13 @@ class Class_ extends Declaration
* @return $this The builder instance (for fluid interface)
*/
public function makeFinal() {
- $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);
+ $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);
+
+ return $this;
+ }
+
+ public function makeReadonly() {
+ $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY);
return $this;
}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php
index 2f0e91273..b8839db32 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php
@@ -310,4 +310,13 @@ final class BuilderHelpers
Stmt\Class_::verifyModifier($modifiers, $modifier);
return $modifiers | $modifier;
}
+
+ /**
+ * Adds a modifier and returns new modifier bitmask.
+ * @return int New modifiers
+ */
+ public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int {
+ Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet);
+ return $existingModifiers | $modifierToSet;
+ }
}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php
index b69eb16fa..07a74df80 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php
@@ -11,7 +11,7 @@ class Const_ extends NodeAbstract
/** @var Expr Value */
public $value;
- /** @var Name Namespaced name (if using NameResolver) */
+ /** @var Name|null Namespaced name (if using NameResolver) */
public $namespacedName;
/**
@@ -30,7 +30,7 @@ class Const_ extends NodeAbstract
public function getSubNodeNames() : array {
return ['name', 'value'];
}
-
+
public function getType() : string {
return 'Const';
}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php
index 29ce0dd40..d4796d65b 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php
@@ -25,6 +25,17 @@ class DNumber extends Scalar
}
/**
+ * @param mixed[] $attributes
+ */
+ public static function fromString(string $str, array $attributes = []): DNumber
+ {
+ $attributes['rawValue'] = $str;
+ $float = self::parse($str);
+
+ return new DNumber($float, $attributes);
+ }
+
+ /**
* @internal
*
* Parses a DNUMBER token like PHP would.
@@ -63,7 +74,7 @@ class DNumber extends Scalar
// dec
return (float) $str;
}
-
+
public function getType() : string {
return 'Scalar_DNumber';
}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php
index f17dd1f8a..2cc2b22c8 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php
@@ -41,6 +41,8 @@ class LNumber extends Scalar
* @return LNumber The constructed LNumber, including kind attribute
*/
public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber {
+ $attributes['rawValue'] = $str;
+
$str = str_replace('_', '', $str);
if ('0' !== $str[0] || '0' === $str) {
@@ -71,7 +73,7 @@ class LNumber extends Scalar
$attributes['kind'] = LNumber::KIND_OCT;
return new LNumber(intval($str, 8), $attributes);
}
-
+
public function getType() : string {
return 'Scalar_LNumber';
}
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php
index 8a6d93a47..6690a16bf 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php
@@ -43,6 +43,22 @@ class String_ extends Scalar
}
/**
+ * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
+ */
+ public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self
+ {
+ $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B')))
+ ? Scalar\String_::KIND_SINGLE_QUOTED
+ : Scalar\String_::KIND_DOUBLE_QUOTED;
+
+ $attributes['rawValue'] = $str;
+
+ $string = self::parse($str, $parseUnicodeEscape);
+
+ return new self($string, $attributes);
+ }
+
+ /**
* @internal
*
* Parses a string token.
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php
index 6c3369172..2fa4e861b 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php
@@ -13,7 +13,7 @@ abstract class ClassLike extends Node\Stmt
/** @var Node\AttributeGroup[] PHP attribute groups */
public $attrGroups;
- /** @var Node\Name Namespaced name (if using NameResolver) */
+ /** @var Node\Name|null Namespaced name (if using NameResolver) */
public $namespacedName;
/**
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php
index b290aaf6d..52ed6c6cd 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php
@@ -68,6 +68,10 @@ class Class_ extends ClassLike
return (bool) ($this->flags & self::MODIFIER_FINAL);
}
+ public function isReadonly() : bool {
+ return (bool) ($this->flags & self::MODIFIER_READONLY);
+ }
+
/**
* Whether the class is anonymous.
*
@@ -80,6 +84,27 @@ class Class_ extends ClassLike
/**
* @internal
*/
+ public static function verifyClassModifier($a, $b) {
+ if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
+ throw new Error('Multiple abstract modifiers are not allowed');
+ }
+
+ if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
+ throw new Error('Multiple final modifiers are not allowed');
+ }
+
+ if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) {
+ throw new Error('Multiple readonly modifiers are not allowed');
+ }
+
+ if ($a & 48 && $b & 48) {
+ throw new Error('Cannot use the final modifier on an abstract class');
+ }
+ }
+
+ /**
+ * @internal
+ */
public static function verifyModifier($a, $b) {
if ($a & self::VISIBILITY_MODIFIER_MASK && $b & self::VISIBILITY_MODIFIER_MASK) {
throw new Error('Multiple access type modifiers are not allowed');
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php
index abb7ee5c8..c2ccae24e 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php
@@ -20,7 +20,7 @@ class Function_ extends Node\Stmt implements FunctionLike
/** @var Node\AttributeGroup[] PHP attribute groups */
public $attrGroups;
- /** @var Node\Name Namespaced name (if using NameResolver) */
+ /** @var Node\Name|null Namespaced name (if using NameResolver) */
public $namespacedName;
/**
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php
index c62adfd2c..d9c8fe049 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php
@@ -2147,8 +2147,7 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
392 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(4-1)][0] === "'" || ($this->semStack[$stackPos-(4-1)][1] === "'" && ($this->semStack[$stackPos-(4-1)][0] === 'b' || $this->semStack[$stackPos-(4-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED);
- $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(4-1)]), $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
393 => function ($stackPos) {
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
@@ -2275,11 +2274,10 @@ class Php5 extends \PhpParser\ParserAbstract
$this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true);
},
434 => function ($stackPos) {
- $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
435 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED);
- $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)], false), $attrs);
+ $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false);
},
436 => function ($stackPos) {
$this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php
index 7a0854b30..71ba0187e 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php
@@ -18,16 +18,16 @@ use PhpParser\Node\Stmt;
class Php7 extends \PhpParser\ParserAbstract
{
protected $tokenToSymbolMapSize = 396;
- protected $actionTableSize = 1196;
- protected $gotoTableSize = 545;
+ protected $actionTableSize = 1189;
+ protected $gotoTableSize = 611;
protected $invalidSymbol = 168;
protected $errorSymbol = 1;
protected $defaultAction = -32766;
protected $unexpectedTokenRule = 32767;
- protected $YY2TBLSTATE = 420;
- protected $numNonLeafStates = 710;
+ protected $YY2TBLSTATE = 421;
+ protected $numNonLeafStates = 709;
protected $symbolToName = array(
"EOF",
@@ -244,153 +244,152 @@ class Php7 extends \PhpParser\ParserAbstract
);
protected $action = array(
- 132, 133, 134, 569, 135, 136, 0, 722, 723, 724,
- 137, 37, 834, 911, 835, 469,-32766,-32766,-32766,-32767,
- -32767,-32767,-32767, 101, 102, 103, 104, 105, 1068, 1069,
- 1070, 1067, 1066, 1065, 1071, 716, 715,-32766,-32766,-32766,
+ 132, 133, 134, 568, 135, 136, 0, 721, 722, 723,
+ 137, 37, 921, 448, 449, 450,-32766,-32766,-32766,-32767,
+ -32767,-32767,-32767, 101, 102, 103, 104, 105, 1071, 1072,
+ 1073, 1070, 1069, 1068, 1074, 715, 714,-32766,-32766,-32766,
-32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767,
- -32767, 545, 546,-32766,-32766, 725,-32766,-32766,-32766, 998,
- 999, 806, 922, 447, 448, 449, 370, 371, 2, 267,
- 138, 396, 729, 730, 731, 732, 414,-32766, 420,-32766,
- -32766,-32766,-32766,-32766, 990, 733, 734, 735, 736, 737,
- 738, 739, 740, 741, 742, 743, 763, 570, 764, 765,
- 766, 767, 755, 756, 336, 337, 758, 759, 744, 745,
- 746, 748, 749, 750, 346, 790, 791, 792, 793, 794,
- 795, 751, 752, 571, 572, 784, 775, 773, 774, 787,
- 770, 771, 283, 420, 573, 574, 769, 575, 576, 577,
- 578, 579, 580, 598, -575, 470, 14, 798, 772, 581,
- 582, -575, 139,-32766,-32766,-32766, 132, 133, 134, 569,
- 135, 136, 1017, 722, 723, 724, 137, 37, 1060,-32766,
- -32766,-32766, 1303, 696,-32766, 1304,-32766,-32766,-32766,-32766,
- -32766,-32766,-32766, 1068, 1069, 1070, 1067, 1066, 1065, 1071,
- -32766, 716, 715, 372, 371, 1258,-32766,-32766,-32766, -572,
- 106, 107, 108, 414, 270, 891, -572, 240, 1193, 1192,
- 1194, 725,-32766,-32766,-32766, 1046, 109,-32766,-32766,-32766,
- -32766, 986, 985, 984, 987, 267, 138, 396, 729, 730,
- 731, 732, 12,-32766, 420,-32766,-32766,-32766,-32766, 998,
- 999, 733, 734, 735, 736, 737, 738, 739, 740, 741,
- 742, 743, 763, 570, 764, 765, 766, 767, 755, 756,
- 336, 337, 758, 759, 744, 745, 746, 748, 749, 750,
- 346, 790, 791, 792, 793, 794, 795, 751, 752, 571,
- 572, 784, 775, 773, 774, 787, 770, 771, 881, 321,
- 573, 574, 769, 575, 576, 577, 578, 579, 580,-32766,
- 82, 83, 84, -575, 772, 581, 582, -575, 148, 747,
- 717, 718, 719, 720, 721, 1278, 722, 723, 724, 760,
- 761, 36, 1277, 85, 86, 87, 88, 89, 90, 91,
+ -32767, 371, 372, 240, 2, 724,-32766,-32766,-32766, 1001,
+ 1002, 415, 956,-32766,-32766,-32766, 373, 372, 12, 267,
+ 138, 397, 728, 729, 730, 731, 415,-32766, 421,-32766,
+ -32766,-32766,-32766,-32766,-32766, 732, 733, 734, 735, 736,
+ 737, 738, 739, 740, 741, 742, 762, 569, 763, 764,
+ 765, 766, 754, 755, 337, 338, 757, 758, 743, 744,
+ 745, 747, 748, 749, 347, 789, 790, 791, 792, 793,
+ 794, 750, 751, 570, 571, 783, 774, 772, 773, 786,
+ 769, 770, 284, 421, 572, 573, 768, 574, 575, 576,
+ 577, 578, 579, 597, -579,-32766,-32766, 797, 771, 580,
+ 581, -579, 139,-32766,-32766,-32766, 132, 133, 134, 568,
+ 135, 136, 1020, 721, 722, 723, 137, 37,-32766,-32766,
+ -32766, 542, 1306, 126,-32766, 1307,-32766,-32766,-32766,-32766,
+ -32766,-32766,-32766, 1071, 1072, 1073, 1070, 1069, 1068, 1074,
+ 957, 715, 714, -318, 993, 1261,-32766,-32766,-32766, -576,
+ 106, 107, 108, -268, 270, 890, -576, 910, 1196, 1195,
+ 1197, 724,-32766,-32766,-32766, 1049, 109,-32766,-32766,-32766,
+ -32766, 989, 988, 987, 990, 267, 138, 397, 728, 729,
+ 730, 731, 1233,-32766, 421,-32766,-32766,-32766,-32766, 1001,
+ 1002, 732, 733, 734, 735, 736, 737, 738, 739, 740,
+ 741, 742, 762, 569, 763, 764, 765, 766, 754, 755,
+ 337, 338, 757, 758, 743, 744, 745, 747, 748, 749,
+ 347, 789, 790, 791, 792, 793, 794, 750, 751, 570,
+ 571, 783, 774, 772, 773, 786, 769, 770, 880, 321,
+ 572, 573, 768, 574, 575, 576, 577, 578, 579,-32766,
+ 82, 83, 84, -579, 771, 580, 581, -579, 148, 746,
+ 716, 717, 718, 719, 720, 1281, 721, 722, 723, 759,
+ 760, 36, 1280, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
- 102, 103, 104, 105, 106, 107, 108, 996, 270, 150,
- -32766,-32766,-32766, 455, 456, 81, 34, -264, -572, 1016,
- 109, 320, -572, 893, 725, 682, 803, 128, 998, 999,
- 592,-32766, 1044,-32766,-32766,-32766, 809, 151, 726, 727,
- 728, 729, 730, 731, 732, -88, 1198, 796, 278, -526,
- 283,-32766,-32766,-32766, 733, 734, 735, 736, 737, 738,
- 739, 740, 741, 742, 743, 763, 786, 764, 765, 766,
- 767, 755, 756, 757, 785, 758, 759, 744, 745, 746,
- 748, 749, 750, 789, 790, 791, 792, 793, 794, 795,
- 751, 752, 753, 754, 784, 775, 773, 774, 787, 770,
- 771, 144, 804, 762, 768, 769, 776, 777, 779, 778,
- 780, 781, -314, -526, -526, -193, -192, 772, 783, 782,
- 49, 50, 51, 500, 52, 53, 239, 807, -526, -86,
- 54, 55, -111, 56, 996, 253,-32766, -111, 800, -111,
- -526, 541, -532, -352, 300, -352, 304, -111, -111, -111,
- -111, -111, -111, -111, -111, 998, 999, 998, 999, 153,
- -32766,-32766,-32766, 1191, 807, 126, 306, 1293, 57, 58,
- 103, 104, 105, -111, 59, 1218, 60, 246, 247, 61,
- 62, 63, 64, 65, 66, 67, 68, -525, 27, 268,
- 69, 436, 501, -328, 808, -86, 1224, 1225, 502, 1189,
- 807, 1198, 1230, 293, 1222, 41, 24, 503, 74, 504,
- 953, 505, 320, 506, 802, 154, 507, 508, 279, 684,
- 280, 43, 44, 437, 367, 366, 891, 45, 509, 35,
- 249, -16, -566, 358, 332, 318, -566, 1198, 1193, 1192,
- 1194, -527, 510, 511, 512, 333, -524, 1274, 48, 716,
- 715, -525, -525, 334, 513, 514, 807, 1212, 1213, 1214,
- 1215, 1209, 1210, 292, 360, 284, -525, 285, -314, 1216,
- 1211, -193, -192, 1193, 1192, 1194, 293, 891, -525, 364,
- -531, 70, 807, 316, 317, 320, 31, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
- -153, -153, -153, 638, 25, -527, -527, 687, 379, 881,
- -524, -524, 296, 297, 891, -153, 432, -153, 807, -153,
- -527, -153, 716, 715, 433, -524, 798, 363, -111, 1105,
- 1107, 365, -527, 434, 891, 140, 435, -524, 954, 127,
- -524, 320, -111, -111, 688, 813, 381, -529, 11, 834,
- 155, 835, 867, -111, -111, -111, -111, 47, 293,-32766,
- 881, 654, 655, 74, 689, 1191, 1045, 320, 708, 149,
- 399, 157,-32766,-32766,-32766, 32,-32766, -79,-32766, 123,
- -32766, 716, 715,-32766, 893, 891, 682, -153,-32766,-32766,
- -32766, 716, 715, 891,-32766,-32766, 124, 881, 129, 74,
- -32766, 411, 130, 320, -524, -524, 143, 141, -75,-32766,
- 158, -529, -529, 320, 27, 691, 159, 881, 160, -524,
- 161, 294, 295, 698, 368, 369, 807, -73,-32766, -72,
- 1222, -524, 373, 374, 1191, 893, -71, 682, -529, 73,
- -70,-32766,-32766,-32766, -69,-32766, -68,-32766, 125,-32766,
- 630, 631,-32766, -67, -66, -47, -51,-32766,-32766,-32766,
- -18, 147, 271,-32766,-32766, 277, 697, 700, 881,-32766,
- 411, 890, 893, 146, 682, 282, 881, 907,-32766, 281,
- 513, 514, 286, 1212, 1213, 1214, 1215, 1209, 1210, 326,
- 131, 145, 939, 287, 682, 1216, 1211, 109, 270,-32766,
- 798, 807,-32766, 662, 639, 1191, 657, 72, 675, 1075,
- 317, 320,-32766,-32766,-32766, 1305,-32766, 301,-32766, 628,
- -32766, 431, 543,-32766,-32766, 923, 555, 924,-32766,-32766,
- -32766, 1229, 549,-32766,-32766,-32766, -4, 891, -490, 1191,
- -32766, 411, 644, 893, 299, 682,-32766,-32766,-32766,-32766,
- -32766, 893,-32766, 682,-32766, 13, 1231,-32766, 452, 480,
- 645, 909,-32766,-32766,-32766,-32766, 658, -480,-32766,-32766,
- 0, 1191, 0, 0,-32766, 411, 0, 298,-32766,-32766,
- -32766, 305,-32766,-32766,-32766, 0,-32766, 0, 806,-32766,
- 0, 0, 0, 475,-32766,-32766,-32766,-32766, 0, 7,
- -32766,-32766, 16, 1191, 561, 596,-32766, 411, 1219, 891,
- -32766,-32766,-32766, 362,-32766,-32766,-32766, 818,-32766, -267,
- 881,-32766, 39, 293, 0, 0,-32766,-32766,-32766, 40,
- 705, 706,-32766,-32766, 872, 963, 940, 947,-32766, 411,
- 937, 948, 365, 870, 427, 891, 935,-32766, 1049, 291,
- 1244, 1052, 1053, -111, -111, 1050, 1051, 1057, -560, 1262,
- 1296, 633, 0, 826, -111, -111, -111, -111, 33, 315,
- -32766, 361, 683, 686, 690, 692, 1191, 693, 694, 695,
- 699, 685, 320,-32766,-32766,-32766, 9,-32766, 702,-32766,
- 868,-32766, 881, 1300,-32766, 893, 1302, 682, -4,-32766,
- -32766,-32766, 829, 828, 837,-32766,-32766, 916, -242, -242,
- -242,-32766, 411, 955, 365, 27, 836, 1301, 915, 917,
- -32766, 914, 1177, 900, 910, -111, -111, 807, 881, 898,
- 945, 1222, 946, 1299, 1256, 867, -111, -111, -111, -111,
- 1245, 1263, 1269, 1272, -241, -241, -241, -558, -532, -531,
- 365, -530, 1, 28, 29, 38, 42, 46, 71, 0,
- 75, -111, -111, 76, 77, 78, 79, 893, 80, 682,
- -242, 867, -111, -111, -111, -111, 142, 152, 156, 245,
- 322, 347, 514, 348, 1212, 1213, 1214, 1215, 1209, 1210,
- 349, 350, 351, 352, 353, 354, 1216, 1211, 355, 356,
- 357, 359, 428, 893, -265, 682, -241, -264, 72, 0,
- 18, 317, 320, 19, 20, 21, 23, 398, 471, 472,
- 479, 482, 483, 484, 485, 489, 490, 491, 498, 669,
- 1202, 1145, 1220, 1019, 1018, 1181, -269, -103, 17, 22,
- 26, 290, 397, 589, 593, 620, 674, 1149, 1197, 1146,
- 1275, 0, -494, 1162, 0, 1223
+ 102, 103, 104, 105, 106, 107, 108, 999, 270, -318,
+ -32766,-32766,-32766, 456, 457, 81, -193, 808, -576, 1019,
+ 109, 320, -576, 892, 724, 681, 802, 695, 1001, 1002,
+ 591,-32766, 1047,-32766,-32766,-32766, 715, 714, 725, 726,
+ 727, 728, 729, 730, 731, -192, -86, 795, 279, -530,
+ 284,-32766,-32766,-32766, 732, 733, 734, 735, 736, 737,
+ 738, 739, 740, 741, 742, 762, 785, 763, 764, 765,
+ 766, 754, 755, 756, 784, 757, 758, 743, 744, 745,
+ 747, 748, 749, 788, 789, 790, 791, 792, 793, 794,
+ 750, 751, 752, 753, 783, 774, 772, 773, 786, 769,
+ 770, 470, 803, 761, 767, 768, 775, 776, 778, 777,
+ 779, 780, -86, -530, -530, 637, 25, 771, 782, 781,
+ 49, 50, 51, 501, 52, 53, 239, 34, -530, 890,
+ 54, 55, -111, 56, 999, 128,-32766, -111, 1201, -111,
+ -530, -570, -536, 890, 300, -570, 144, -111, -111, -111,
+ -111, -111, -111, -111, -111, 1001, 1002, 1001, 1002, 686,
+ 1201, 925, 926, 1194, 806, 890, 927, 1296, 57, 58,
+ 799, 253, -193, 687, 59, 807, 60, 246, 247, 61,
+ 62, 63, 64, 65, 66, 67, 68, 304, 27, 268,
+ 69, 437, 502, -332, 306, 688, 1227, 1228, 503, 1192,
+ 806, -192, 318, 890, 1225, 41, 24, 504, 334, 505,
+ 14, 506, 880, 507, 653, 654, 508, 509, 280, 806,
+ 281, 43, 44, 438, 368, 367, 880, 45, 510, 35,
+ 249, 471, 1063, 359, 333, 103, 104, 105, 1196, 1195,
+ 1197, 806, 511, 512, 513, 335, 801, 1221, 880, 361,
+ 285, 683, 286, 365, 514, 515, 380, 1215, 1216, 1217,
+ 1218, 1212, 1213, 292, 433, -111, 715, 714, 434, 1219,
+ 1214, 149, 400, 1196, 1195, 1197, 293, -153, -153, -153,
+ -356, 70, -356, 316, 317, 320, 880, 892, -531, 681,
+ 435, 1048, -153, 707, -153, 293, -153, 1277, -153, 27,
+ 74, 892, 436, 681, 320, 369, 370, 833, 366, 834,
+ -529, 806, 382, 812, 11, 1225, 833, 150, 834, -111,
+ -111, 151, 74, 942, -111, 681, 320, 153, 806, 866,
+ -111, -111, -111, -111, 31, 110, 111, 112, 113, 114,
+ 115, 116, 117, 118, 119, 120, 121, 122, 715, 714,
+ 374, 375, -531, -531, 890, 154, 805, 155, -4, 890,
+ 157, 892, -88, 681, -153, 514, 515, -531, 1215, 1216,
+ 1217, 1218, 1212, 1213, -529, -529, 797, 1108, 1110, -531,
+ 1219, 1214, 715, 714, 690,-32766, 629, 630, -528, -529,
+ 32, 1194, 72, 123, 124, 317, 320, 129,-32766,-32766,
+ -32766, -529,-32766, -535,-32766, 130,-32766, 140, 143,-32766,
+ 158, 159, 160, 320,-32766,-32766,-32766, 161, -528,-32766,
+ -32766,-32766, -79, 282, -75, 1194,-32766, 412, -73, 27,
+ -72, -71,-32766,-32766,-32766,-32766,-32766, 880,-32766, 287,
+ -32766, 806, 880,-32766, -70, 1225, -69, -68,-32766,-32766,
+ -32766, -67, -528, -528,-32766,-32766, -66, 141, -47, -18,
+ -32766, 412, 147, 320, 366, 73, 428, -528, 271,-32766,
+ 278, 291, -51, 696, 699, -111, -111, 1201, -533, -528,
+ -111, 889, -528, -528, 48, 825, -111, -111, -111, -111,
+ 146, 327, 283, 270, 288, 109, 515, -528, 1215, 1216,
+ 1217, 1218, 1212, 1213, 131, 906, 661, -16, 9, -528,
+ 1219, 1214, 892, 797, 681,-32766, 145, 892, 1308, 681,
+ -4, 1194, 72,-32766, 638, 317, 320, 806,-32766,-32766,
+ -32766, 1078,-32766, 544,-32766, 627,-32766, 13, 656,-32766,
+ 548, 298, -533, -533,-32766,-32766,-32766,-32766, 296, 297,
+ -32766,-32766, 674, 1194, 643, 890,-32766, 412, 806, 453,
+ -32766,-32766,-32766, 364,-32766,-32766,-32766, 481,-32766, -533,
+ -32766,-32766, 47, -494, 890, 127,-32766,-32766,-32766,-32766,
+ 644, 657,-32766,-32766, 305, 1194, 890, 805,-32766, 412,
+ 1222, 301,-32766,-32766,-32766, 0,-32766,-32766,-32766, 432,
+ -32766, 299, 922,-32766, -111, 293, 554, 476,-32766,-32766,
+ -32766,-32766, 1232, -484,-32766,-32766, 697, 1194, 560, 908,
+ -32766, 412, 595, 817,-32766,-32766,-32766, 7,-32766,-32766,
+ -32766, 1234,-32766, 16, 293,-32766, 294, 295, 880, 74,
+ -32766,-32766,-32766, 320, 363, 39,-32766,-32766, 40, 704,
+ 705, 871,-32766, 412, -246, -246, -246, 880, 966, 943,
+ 366,-32766, 950, 125, 1247, 940, 951, 869, 938, 880,
+ 1052, -111, -111, -245, -245, -245, -111, 1055, 1056, 366,
+ 1053, 866, -111, -111, -111, -111, 1054, 1060, 701, 1265,
+ -111, -111, 1299, 632, -564, -111, 33, 315, -271, 362,
+ 866, -111, -111, -111, -111, 682, 685, 689, 691, 692,
+ 693, 694,-32766, 892, 698, 681, -246, 684, 1194, 867,
+ 1303, 1305, 828, 827, 836,-32766,-32766,-32766, 915,-32766,
+ 958,-32766, 892,-32766, 681, -245,-32766, 835, 1304, 914,
+ 916,-32766,-32766,-32766, 892, 913, 681,-32766,-32766, 1180,
+ 899, 909, 897,-32766, 412, 948, 949, 1302, 1259, 1248,
+ 1266, 1272,-32766, 1275, -269, -562, -536, -535, -534, 1,
+ 28, 29, 38, 42, 46, 71, 75, 76, 77, 78,
+ 79, 80, 142, 152, 156, 245, 322, 348, 349, 350,
+ 351, 352, 353, 354, 355, 356, 357, 358, 360, 429,
+ 0, -268, 0, 18, 19, 20, 21, 23, 399, 472,
+ 473, 480, 483, 484, 485, 486, 490, 491, 492, 499,
+ 668, 1205, 1148, 1223, 1022, 1021, 1184, -273, -103, 17,
+ 22, 26, 290, 398, 588, 592, 619, 673, 1152, 1200,
+ 1149, 1278, 0, -498, 1165, 0, 1226, 0, 320
);
protected $actionCheck = array(
2, 3, 4, 5, 6, 7, 0, 9, 10, 11,
- 12, 13, 106, 1, 108, 31, 9, 10, 11, 44,
+ 12, 13, 128, 129, 130, 131, 9, 10, 11, 44,
45, 46, 47, 48, 49, 50, 51, 52, 116, 117,
118, 119, 120, 121, 122, 37, 38, 30, 116, 32,
33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
- 43, 117, 118, 9, 10, 57, 9, 10, 11, 137,
- 138, 155, 128, 129, 130, 131, 106, 107, 8, 71,
+ 43, 106, 107, 14, 8, 57, 9, 10, 11, 137,
+ 138, 116, 31, 9, 10, 11, 106, 107, 8, 71,
72, 73, 74, 75, 76, 77, 116, 30, 80, 32,
- 33, 34, 35, 36, 1, 87, 88, 89, 90, 91,
+ 33, 34, 35, 36, 30, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
132, 133, 30, 80, 136, 137, 138, 139, 140, 141,
- 142, 143, 144, 51, 1, 161, 101, 80, 150, 151,
+ 142, 143, 144, 51, 1, 9, 10, 80, 150, 151,
152, 8, 154, 9, 10, 11, 2, 3, 4, 5,
- 6, 7, 164, 9, 10, 11, 12, 13, 123, 9,
- 10, 11, 80, 161, 30, 83, 32, 33, 34, 35,
+ 6, 7, 164, 9, 10, 11, 12, 13, 9, 10,
+ 11, 85, 80, 14, 30, 83, 32, 33, 34, 35,
36, 37, 38, 116, 117, 118, 119, 120, 121, 122,
- 30, 37, 38, 106, 107, 1, 9, 10, 11, 1,
- 53, 54, 55, 116, 57, 1, 8, 14, 155, 156,
+ 159, 37, 38, 8, 1, 1, 9, 10, 11, 1,
+ 53, 54, 55, 164, 57, 1, 8, 1, 155, 156,
157, 57, 9, 10, 11, 162, 69, 30, 116, 32,
33, 119, 120, 121, 122, 71, 72, 73, 74, 75,
- 76, 77, 8, 30, 80, 32, 33, 34, 35, 137,
+ 76, 77, 146, 30, 80, 32, 33, 34, 35, 137,
138, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
@@ -401,168 +400,167 @@ class Php7 extends \PhpParser\ParserAbstract
3, 4, 5, 6, 7, 1, 9, 10, 11, 12,
13, 30, 8, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
- 49, 50, 51, 52, 53, 54, 55, 116, 57, 14,
- 9, 10, 11, 134, 135, 161, 8, 164, 160, 1,
- 69, 167, 164, 159, 57, 161, 80, 8, 137, 138,
- 1, 30, 1, 32, 33, 34, 1, 14, 71, 72,
- 73, 74, 75, 76, 77, 31, 1, 80, 30, 70,
+ 49, 50, 51, 52, 53, 54, 55, 116, 57, 164,
+ 9, 10, 11, 134, 135, 161, 8, 1, 160, 1,
+ 69, 167, 164, 159, 57, 161, 80, 161, 137, 138,
+ 1, 30, 1, 32, 33, 34, 37, 38, 71, 72,
+ 73, 74, 75, 76, 77, 8, 31, 80, 30, 70,
30, 9, 10, 11, 87, 88, 89, 90, 91, 92,
93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
- 133, 8, 156, 136, 137, 138, 139, 140, 141, 142,
- 143, 144, 8, 134, 135, 8, 8, 150, 151, 152,
- 2, 3, 4, 5, 6, 7, 97, 82, 149, 31,
- 12, 13, 101, 15, 116, 8, 116, 106, 80, 108,
- 161, 85, 163, 106, 113, 108, 8, 116, 117, 118,
- 119, 120, 121, 122, 123, 137, 138, 137, 138, 14,
- 9, 10, 11, 80, 82, 14, 8, 85, 50, 51,
- 50, 51, 52, 128, 56, 1, 58, 59, 60, 61,
- 62, 63, 64, 65, 66, 67, 68, 70, 70, 71,
- 72, 73, 74, 162, 159, 97, 78, 79, 80, 116,
- 82, 1, 146, 158, 86, 87, 88, 89, 163, 91,
- 31, 93, 167, 95, 156, 14, 98, 99, 35, 161,
- 37, 103, 104, 105, 106, 107, 1, 109, 110, 147,
- 148, 31, 160, 115, 116, 8, 164, 1, 155, 156,
- 157, 70, 124, 125, 126, 8, 70, 1, 70, 37,
- 38, 134, 135, 8, 136, 137, 82, 139, 140, 141,
- 142, 143, 144, 145, 8, 35, 149, 37, 164, 151,
- 152, 164, 164, 155, 156, 157, 158, 1, 161, 8,
- 163, 163, 82, 165, 166, 167, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 75, 76, 77, 75, 76, 134, 135, 31, 8, 84,
- 134, 135, 134, 135, 1, 90, 8, 92, 82, 94,
- 149, 96, 37, 38, 8, 149, 80, 149, 128, 59,
- 60, 106, 161, 8, 1, 161, 8, 161, 159, 161,
- 70, 167, 117, 118, 31, 8, 106, 70, 108, 106,
- 14, 108, 127, 128, 129, 130, 131, 70, 158, 74,
- 84, 75, 76, 163, 31, 80, 159, 167, 161, 101,
- 102, 14, 87, 88, 89, 14, 91, 31, 93, 16,
- 95, 37, 38, 98, 159, 1, 161, 162, 103, 104,
- 105, 37, 38, 1, 109, 110, 16, 84, 16, 163,
- 115, 116, 16, 167, 134, 135, 16, 161, 31, 124,
- 16, 134, 135, 167, 70, 31, 16, 84, 16, 149,
- 16, 134, 135, 31, 106, 107, 82, 31, 74, 31,
- 86, 161, 106, 107, 80, 159, 31, 161, 161, 154,
- 31, 87, 88, 89, 31, 91, 31, 93, 161, 95,
- 111, 112, 98, 31, 31, 31, 31, 103, 104, 105,
- 31, 31, 31, 109, 110, 31, 31, 31, 84, 115,
- 116, 31, 159, 31, 161, 37, 84, 38, 124, 35,
- 136, 137, 35, 139, 140, 141, 142, 143, 144, 35,
- 31, 70, 159, 37, 161, 151, 152, 69, 57, 74,
- 80, 82, 85, 77, 90, 80, 94, 163, 92, 82,
- 166, 167, 87, 88, 89, 83, 91, 114, 93, 113,
- 95, 128, 85, 98, 116, 128, 153, 128, 103, 104,
- 105, 146, 89, 74, 109, 110, 0, 1, 149, 80,
- 115, 116, 96, 159, 133, 161, 87, 88, 89, 124,
- 91, 159, 93, 161, 95, 97, 146, 98, 97, 97,
- 100, 154, 103, 104, 105, 74, 100, 149, 109, 110,
- -1, 80, -1, -1, 115, 116, -1, 132, 87, 88,
- 89, 132, 91, 124, 93, -1, 95, -1, 155, 98,
- -1, -1, -1, 102, 103, 104, 105, 74, -1, 149,
- 109, 110, 149, 80, 81, 153, 115, 116, 160, 1,
- 87, 88, 89, 149, 91, 124, 93, 160, 95, 164,
- 84, 98, 159, 158, -1, -1, 103, 104, 105, 159,
- 159, 159, 109, 110, 159, 159, 159, 159, 115, 116,
- 159, 159, 106, 159, 108, 1, 159, 124, 159, 113,
- 160, 159, 159, 117, 118, 159, 159, 159, 163, 160,
- 160, 160, -1, 127, 128, 129, 130, 131, 161, 161,
- 74, 161, 161, 161, 161, 161, 80, 161, 161, 161,
- 161, 161, 167, 87, 88, 89, 150, 91, 162, 93,
- 162, 95, 84, 162, 98, 159, 162, 161, 162, 103,
- 104, 105, 162, 162, 162, 109, 110, 162, 100, 101,
- 102, 115, 116, 162, 106, 70, 162, 162, 162, 162,
- 124, 162, 162, 162, 162, 117, 118, 82, 84, 162,
- 162, 86, 162, 162, 162, 127, 128, 129, 130, 131,
- 162, 162, 162, 162, 100, 101, 102, 163, 163, 163,
- 106, 163, 163, 163, 163, 163, 163, 163, 163, -1,
- 163, 117, 118, 163, 163, 163, 163, 159, 163, 161,
- 162, 127, 128, 129, 130, 131, 163, 163, 163, 163,
- 163, 163, 137, 163, 139, 140, 141, 142, 143, 144,
- 163, 163, 163, 163, 163, 163, 151, 152, 163, 163,
- 163, 163, 163, 159, 164, 161, 162, 164, 163, -1,
- 164, 166, 167, 164, 164, 164, 164, 164, 164, 164,
+ 133, 31, 156, 136, 137, 138, 139, 140, 141, 142,
+ 143, 144, 97, 134, 135, 75, 76, 150, 151, 152,
+ 2, 3, 4, 5, 6, 7, 97, 8, 149, 1,
+ 12, 13, 101, 15, 116, 8, 116, 106, 1, 108,
+ 161, 160, 163, 1, 113, 164, 8, 116, 117, 118,
+ 119, 120, 121, 122, 123, 137, 138, 137, 138, 31,
+ 1, 117, 118, 80, 82, 1, 122, 85, 50, 51,
+ 80, 8, 164, 31, 56, 159, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 8, 70, 71,
+ 72, 73, 74, 162, 8, 31, 78, 79, 80, 116,
+ 82, 164, 8, 1, 86, 87, 88, 89, 8, 91,
+ 101, 93, 84, 95, 75, 76, 98, 99, 35, 82,
+ 37, 103, 104, 105, 106, 107, 84, 109, 110, 147,
+ 148, 161, 123, 115, 116, 50, 51, 52, 155, 156,
+ 157, 82, 124, 125, 126, 8, 156, 1, 84, 8,
+ 35, 161, 37, 8, 136, 137, 8, 139, 140, 141,
+ 142, 143, 144, 145, 8, 128, 37, 38, 8, 151,
+ 152, 101, 102, 155, 156, 157, 158, 75, 76, 77,
+ 106, 163, 108, 165, 166, 167, 84, 159, 70, 161,
+ 8, 159, 90, 161, 92, 158, 94, 1, 96, 70,
+ 163, 159, 8, 161, 167, 106, 107, 106, 106, 108,
+ 70, 82, 106, 8, 108, 86, 106, 14, 108, 117,
+ 118, 14, 163, 159, 122, 161, 167, 14, 82, 127,
+ 128, 129, 130, 131, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 37, 38,
+ 106, 107, 134, 135, 1, 14, 155, 14, 0, 1,
+ 14, 159, 31, 161, 162, 136, 137, 149, 139, 140,
+ 141, 142, 143, 144, 134, 135, 80, 59, 60, 161,
+ 151, 152, 37, 38, 31, 74, 111, 112, 70, 149,
+ 14, 80, 163, 16, 16, 166, 167, 16, 87, 88,
+ 89, 161, 91, 163, 93, 16, 95, 161, 16, 98,
+ 16, 16, 16, 167, 103, 104, 105, 16, 70, 74,
+ 109, 110, 31, 35, 31, 80, 115, 116, 31, 70,
+ 31, 31, 87, 88, 89, 124, 91, 84, 93, 35,
+ 95, 82, 84, 98, 31, 86, 31, 31, 103, 104,
+ 105, 31, 134, 135, 109, 110, 31, 161, 31, 31,
+ 115, 116, 31, 167, 106, 154, 108, 149, 31, 124,
+ 31, 113, 31, 31, 31, 117, 118, 1, 70, 161,
+ 122, 31, 134, 135, 70, 127, 128, 129, 130, 131,
+ 31, 35, 37, 57, 37, 69, 137, 149, 139, 140,
+ 141, 142, 143, 144, 31, 38, 77, 31, 150, 161,
+ 151, 152, 159, 80, 161, 74, 70, 159, 83, 161,
+ 162, 80, 163, 85, 90, 166, 167, 82, 87, 88,
+ 89, 82, 91, 85, 93, 113, 95, 97, 94, 98,
+ 89, 132, 134, 135, 103, 104, 105, 74, 134, 135,
+ 109, 110, 92, 80, 96, 1, 115, 116, 82, 97,
+ 87, 88, 89, 149, 91, 124, 93, 97, 95, 161,
+ 116, 98, 70, 149, 1, 161, 103, 104, 105, 74,
+ 100, 100, 109, 110, 132, 80, 1, 155, 115, 116,
+ 160, 114, 87, 88, 89, -1, 91, 124, 93, 128,
+ 95, 133, 128, 98, 128, 158, 153, 102, 103, 104,
+ 105, 74, 146, 149, 109, 110, 31, 80, 81, 154,
+ 115, 116, 153, 160, 87, 88, 89, 149, 91, 124,
+ 93, 146, 95, 149, 158, 98, 134, 135, 84, 163,
+ 103, 104, 105, 167, 149, 159, 109, 110, 159, 159,
+ 159, 159, 115, 116, 100, 101, 102, 84, 159, 159,
+ 106, 124, 159, 161, 160, 159, 159, 159, 159, 84,
+ 159, 117, 118, 100, 101, 102, 122, 159, 159, 106,
+ 159, 127, 128, 129, 130, 131, 159, 159, 162, 160,
+ 117, 118, 160, 160, 163, 122, 161, 161, 164, 161,
+ 127, 128, 129, 130, 131, 161, 161, 161, 161, 161,
+ 161, 161, 74, 159, 161, 161, 162, 161, 80, 162,
+ 162, 162, 162, 162, 162, 87, 88, 89, 162, 91,
+ 162, 93, 159, 95, 161, 162, 98, 162, 162, 162,
+ 162, 103, 104, 105, 159, 162, 161, 109, 110, 162,
+ 162, 162, 162, 115, 116, 162, 162, 162, 162, 162,
+ 162, 162, 124, 162, 164, 163, 163, 163, 163, 163,
+ 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+ 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+ 163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
+ -1, 164, -1, 164, 164, 164, 164, 164, 164, 164,
164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
164, 164, 164, 164, 164, 164, 164, 164, 164, 164,
- 164, -1, 165, 165, -1, 166
+ 164, 164, -1, 165, 165, -1, 166, -1, 167
);
protected $actionBase = array(
- 0, -2, 154, 565, 876, 948, 984, 514, 53, 398,
- 837, 307, 307, 67, 307, 307, 307, 653, 724, 724,
- 732, 724, 616, 673, 204, 204, 204, 625, 625, 625,
- 625, 694, 694, 831, 831, 863, 799, 765, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 936, 936, 936, 936, 936, 936, 936, 936,
- 936, 936, 375, 519, 369, 701, 1017, 1023, 1019, 1024,
- 1015, 1014, 1018, 1020, 1025, 911, 912, 782, 918, 919,
- 920, 921, 1021, 841, 1016, 1022, 291, 291, 291, 291,
+ 0, -2, 154, 542, 698, 894, 913, 586, 53, 430,
+ 867, 307, 307, 67, 307, 307, 307, 482, 693, 693,
+ 925, 693, 468, 504, 204, 204, 204, 651, 651, 651,
+ 651, 685, 685, 845, 845, 877, 813, 781, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 356, 31, 369, 716, 1008, 1014, 1010, 1015,
+ 1006, 1005, 1009, 1011, 1016, 935, 936, 799, 937, 938,
+ 939, 941, 1012, 873, 1007, 1013, 291, 291, 291, 291,
291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
- 291, 291, 290, 491, 44, 382, 382, 382, 382, 382,
+ 291, 291, 290, 159, 136, 382, 382, 382, 382, 382,
382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
- 382, 382, 382, 382, 382, 160, 160, 160, 187, 684,
- 684, 341, 203, 610, 47, 985, 985, 985, 985, 985,
- 985, 985, 985, 985, 985, 144, 144, 7, 7, 7,
- 7, 7, 371, -25, -25, -25, -25, 540, 385, 102,
- 576, 358, 45, 377, 460, 460, 360, 231, 231, 231,
- 231, 231, 231, -78, -78, -78, -78, -78, -66, 319,
- 457, -94, 396, 423, 586, 586, 586, 586, 423, 423,
- 423, 423, 750, 1029, 423, 423, 423, 511, 516, 516,
- 518, 147, 147, 147, 516, 583, 777, 422, 583, 422,
- 194, 92, 748, -40, 87, 412, 748, 617, 627, 198,
- 143, 773, 658, 773, 1013, 757, 764, 717, 838, 860,
- 1026, 800, 908, 806, 910, 219, 686, 1012, 1012, 1012,
- 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 855, 552,
- 1013, 286, 855, 855, 855, 552, 552, 552, 552, 552,
- 552, 552, 552, 552, 552, 679, 286, 568, 626, 286,
- 794, 552, 375, 758, 375, 375, 375, 375, 958, 375,
- 375, 375, 375, 375, 375, 970, 769, -16, 375, 519,
- 12, 12, 547, 83, 12, 12, 12, 12, 375, 375,
- 375, 658, 781, 713, 666, 792, 448, 781, 781, 781,
- 438, 444, 193, 447, 570, 523, 580, 760, 760, 767,
- 929, 929, 760, 759, 760, 767, 934, 760, 929, 805,
- 359, 648, 577, 611, 656, 929, 478, 760, 760, 760,
- 760, 665, 760, 467, 433, 760, 760, 785, 774, 789,
- 60, 929, 929, 929, 789, 596, 751, 751, 751, 811,
- 812, 746, 771, 567, 498, 677, 348, 779, 771, 771,
- 760, 640, 746, 771, 746, 771, 747, 771, 771, 771,
- 746, 771, 759, 585, 771, 734, 668, 224, 771, 6,
- 935, 937, 354, 940, 932, 941, 979, 942, 943, 851,
- 956, 933, 945, 931, 930, 780, 703, 720, 790, 729,
- 928, 768, 768, 768, 925, 768, 768, 768, 768, 768,
- 768, 768, 768, 703, 788, 804, 733, 783, 960, 722,
- 726, 725, 868, 1027, 1028, 737, 739, 958, 1006, 953,
- 803, 730, 992, 967, 866, 848, 968, 969, 993, 1007,
- 1008, 871, 761, 874, 880, 797, 971, 852, 768, 935,
- 943, 933, 945, 931, 930, 763, 762, 753, 755, 749,
- 745, 736, 738, 770, 1009, 924, 835, 830, 970, 926,
- 703, 839, 986, 847, 994, 995, 850, 801, 772, 840,
- 881, 972, 975, 976, 853, 1010, 810, 989, 795, 996,
- 802, 882, 997, 998, 999, 1000, 885, 854, 856, 857,
- 815, 754, 980, 786, 891, 335, 787, 796, 978, 363,
- 957, 858, 894, 895, 1001, 1002, 1003, 896, 954, 816,
- 990, 752, 991, 983, 817, 818, 485, 784, 778, 541,
- 676, 897, 899, 900, 955, 775, 766, 821, 822, 1011,
- 901, 697, 824, 740, 902, 1005, 742, 744, 756, 859,
- 793, 743, 798, 977, 776, 827, 907, 829, 832, 833,
- 1004, 836, 0, 0, 0, 0, 0, 0, 0, 0,
+ 382, 382, 382, 382, 382, 54, 54, 54, 187, 569,
+ 569, 341, 203, 658, 47, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 144, 144, 7, 7, 7,
+ 7, 7, 371, -25, -25, -25, -25, 816, 477, 102,
+ 499, 358, 449, 514, 525, 525, 360, -116, 231, 231,
+ 231, 231, 231, 231, -78, -78, -78, -78, -78, 319,
+ 580, 541, 86, 423, 636, 636, 636, 636, 423, 423,
+ 423, 423, 825, 1020, 423, 423, 423, 558, 688, 688,
+ 754, 147, 147, 147, 688, 550, 788, 422, 550, 422,
+ 194, 92, 794, -55, -40, 321, 814, 794, 748, 842,
+ 198, 143, 772, 539, 772, 1004, 778, 767, 733, 868,
+ 896, 1017, 820, 933, 821, 934, 219, 731, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1021,
+ 339, 1004, 286, 1021, 1021, 1021, 339, 339, 339, 339,
+ 339, 339, 339, 339, 339, 339, 615, 286, 380, 479,
+ 286, 796, 339, 356, 804, 356, 356, 356, 356, 964,
+ 356, 356, 356, 356, 356, 356, 969, 768, 410, 356,
+ 31, 206, 206, 472, 193, 206, 206, 206, 206, 356,
+ 356, 356, 539, 776, 793, 584, 809, 377, 776, 776,
+ 776, 355, 185, 39, 348, 555, 523, 546, 773, 773,
+ 789, 946, 946, 773, 785, 773, 789, 951, 773, 946,
+ 787, 467, 596, 540, 585, 600, 946, 519, 773, 773,
+ 773, 773, 622, 773, 503, 478, 773, 773, 749, 779,
+ 792, 46, 946, 946, 946, 792, 581, 808, 808, 808,
+ 830, 831, 762, 777, 534, 526, 645, 459, 807, 777,
+ 777, 773, 588, 762, 777, 762, 777, 805, 777, 777,
+ 777, 762, 777, 785, 577, 777, 734, 634, 60, 777,
+ 6, 952, 953, 671, 954, 949, 955, 976, 956, 957,
+ 884, 962, 950, 958, 948, 947, 790, 717, 718, 818,
+ 764, 945, 766, 766, 766, 943, 766, 766, 766, 766,
+ 766, 766, 766, 766, 717, 770, 835, 811, 791, 965,
+ 721, 729, 806, 897, 1018, 1019, 964, 997, 959, 826,
+ 732, 983, 966, 866, 876, 967, 968, 984, 998, 999,
+ 898, 786, 899, 900, 803, 970, 885, 766, 952, 957,
+ 950, 958, 948, 947, 765, 760, 755, 756, 753, 740,
+ 737, 739, 771, 1000, 942, 871, 844, 969, 944, 717,
+ 869, 979, 875, 985, 986, 878, 802, 775, 872, 901,
+ 971, 972, 973, 886, 1001, 829, 980, 874, 987, 810,
+ 902, 988, 989, 990, 991, 906, 887, 888, 889, 832,
+ 774, 940, 798, 908, 643, 744, 797, 975, 647, 963,
+ 890, 915, 916, 992, 993, 994, 917, 960, 839, 981,
+ 784, 982, 977, 840, 843, 653, 728, 795, 681, 683,
+ 918, 923, 927, 961, 782, 769, 846, 847, 1002, 928,
+ 686, 848, 735, 929, 996, 736, 741, 800, 893, 824,
+ 817, 780, 974, 783, 849, 930, 851, 858, 859, 995,
+ 861, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 458, 458, 458, 458, 458, 458, 307, 307, 307,
- 307, 0, 0, 307, 0, 0, 0, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 307, 307, 307, 307,
+ 0, 0, 307, 0, 0, 0, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
@@ -577,41 +575,41 @@ class Php7 extends \PhpParser\ParserAbstract
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
458, 458, 458, 458, 458, 458, 458, 458, 458, 458,
- 458, 458, 291, 291, 291, 291, 291, 291, 291, 291,
+ 458, 291, 291, 291, 291, 291, 291, 291, 291, 291,
291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
- 291, 291, 291, 291, 291, 291, 0, 0, 0, 0,
+ 291, 291, 291, 291, 291, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 291, 291, 291, 291, 291, 291, 291, 291,
+ 0, 291, 291, 291, 291, 291, 291, 291, 291, 291,
291, 291, 291, 291, 291, 291, 291, 291, 291, 291,
- 291, 291, 291, 291, 291, 291, 291, 291, 291, 423,
- 423, 291, 291, 0, 291, 423, 423, 423, 423, 423,
- 423, 423, 423, 423, 423, 291, 291, 291, 291, 291,
- 291, 291, 805, 147, 147, 147, 147, 423, 423, 423,
- 423, 423, -88, -88, 147, 147, 423, 423, 423, 423,
+ 291, 291, 291, 291, 291, 291, 291, 291, 423, 423,
+ 291, 291, 0, 291, 423, 423, 423, 423, 423, 423,
+ 423, 423, 423, 423, 291, 291, 291, 291, 291, 291,
+ 291, 787, 147, 147, 147, 147, 423, 423, 423, 423,
+ 423, -88, -88, 147, 147, 423, 384, 423, 423, 423,
423, 423, 423, 423, 423, 423, 423, 423, 0, 0,
- 0, 286, 422, 0, 759, 759, 759, 759, 0, 0,
- 0, 0, 422, 422, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 286, 422, 0, 286, 0,
- 759, 759, 423, 805, 805, 314, 423, 0, 0, 0,
- 0, 286, 759, 286, 552, 422, 552, 552, 12, 375,
- 314, 608, 608, 608, 608, 0, 658, 805, 805, 805,
- 805, 805, 805, 805, 805, 805, 805, 805, 759, 0,
- 805, 0, 759, 759, 759, 0, 0, 0, 0, 0,
+ 286, 422, 0, 785, 785, 785, 785, 0, 0, 0,
+ 0, 422, 422, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 286, 422, 0, 286, 0, 785,
+ 785, 423, 787, 787, 314, 384, 423, 0, 0, 0,
+ 0, 286, 785, 286, 339, 422, 339, 339, 206, 356,
+ 314, 510, 510, 510, 510, 0, 539, 787, 787, 787,
+ 787, 787, 787, 787, 787, 787, 787, 787, 785, 0,
+ 787, 0, 785, 785, 785, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 759, 0, 0, 929, 0, 0, 0, 0, 760, 0,
- 0, 0, 0, 0, 0, 760, 934, 0, 0, 0,
- 0, 0, 0, 759, 0, 0, 0, 0, 0, 0,
- 0, 0, 768, 801, 0, 801, 0, 768, 768, 768
+ 785, 0, 0, 946, 0, 0, 0, 0, 773, 0,
+ 0, 0, 0, 0, 0, 773, 951, 0, 0, 0,
+ 0, 0, 0, 785, 0, 0, 0, 0, 0, 0,
+ 0, 0, 766, 802, 0, 802, 0, 766, 766, 766
);
protected $actionDefault = array(
3,32767, 103,32767,32767,32767,32767,32767,32767,32767,
32767,32767, 101,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767,32767,32767,32767, 578, 578, 578,
- 578,32767,32767, 246, 103,32767,32767, 454, 372, 372,
- 372,32767,32767, 522, 522, 522, 522, 522, 522,32767,
- 32767,32767,32767,32767,32767, 454,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767, 582, 582, 582,
+ 582,32767,32767, 250, 103,32767,32767, 458, 376, 376,
+ 376,32767,32767, 526, 526, 526, 526, 526, 526,32767,
+ 32767,32767,32767,32767,32767, 458,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
@@ -619,128 +617,135 @@ class Php7 extends \PhpParser\ParserAbstract
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767, 101,32767,
- 32767,32767, 37, 7, 8, 10, 11, 50, 17, 310,
+ 32767,32767, 37, 7, 8, 10, 11, 50, 17, 314,
32767,32767,32767,32767, 103,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767,32767, 571,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767, 575,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767, 462, 441, 442, 444,
+ 445, 375, 527, 581, 317, 578, 374, 146, 329, 319,
+ 238, 320, 254, 463, 255, 464, 467, 468, 211, 283,
+ 371, 150, 405, 459, 407, 457, 461, 406, 381, 386,
+ 387, 388, 389, 390, 391, 392, 393, 394, 395, 396,
+ 397, 398, 379, 380, 460, 438, 437, 436, 403,32767,
+ 32767, 404, 408, 378, 411,32767,32767,32767,32767,32767,
+ 32767,32767,32767, 103,32767, 409, 410, 427, 428, 425,
+ 426, 429,32767, 430, 431, 432, 433,32767,32767, 306,
+ 32767,32767, 355, 353, 418, 419, 306,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767,32767,32767, 520,
+ 435,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+ 32767,32767,32767,32767, 103,32767, 101, 522, 400, 402,
+ 490, 413, 414, 412, 382,32767, 497,32767, 103, 499,
+ 32767,32767,32767, 112,32767,32767,32767,32767, 521,32767,
+ 528, 528,32767, 483, 101, 194,32767, 194, 194,32767,
+ 32767,32767,32767,32767,32767,32767, 589, 483, 111, 111,
+ 111, 111, 111, 111, 111, 111, 111, 111, 111,32767,
+ 194, 111,32767,32767,32767, 101, 194, 194, 194, 194,
+ 194, 194, 194, 194, 194, 194, 189,32767, 264, 266,
+ 103, 543, 194,32767, 502,32767,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767, 495,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767,32767,32767, 458, 437, 438, 440,
- 441, 371, 523, 577, 313, 574, 370, 146, 325, 315,
- 234, 316, 250, 459, 251, 460, 463, 464, 211, 279,
- 367, 150, 401, 455, 403, 453, 457, 402, 377, 382,
- 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
- 393, 394, 375, 376, 456, 434, 433, 432, 399,32767,
- 32767, 400, 404, 374, 407,32767,32767,32767,32767,32767,
- 32767,32767,32767, 103,32767, 405, 406, 423, 424, 421,
- 422, 425,32767, 426, 427, 428, 429,32767,32767, 302,
- 32767,32767, 351, 349, 414, 415, 302,32767,32767,32767,
- 32767,32767,32767,32767,32767,32767,32767,32767,32767, 516,
- 431,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767, 103,32767, 101, 518, 396, 398,
- 486, 409, 410, 408, 378,32767, 493,32767, 103, 495,
- 32767,32767,32767, 112,32767,32767,32767, 517,32767, 524,
- 524,32767, 479, 101, 194,32767, 194, 194,32767,32767,
- 32767,32767,32767,32767,32767, 585, 479, 111, 111, 111,
- 111, 111, 111, 111, 111, 111, 111, 111,32767, 194,
- 111,32767,32767,32767, 101, 194, 194, 194, 194, 194,
- 194, 194, 194, 194, 194, 189,32767, 260, 262, 103,
- 539, 194,32767, 498,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767,32767,32767, 491,32767,32767,32767,
+ 32767,32767, 483, 423, 139,32767, 139, 528, 415, 416,
+ 417, 485, 528, 528, 528, 302, 285,32767,32767,32767,
+ 32767, 500, 500, 101, 101, 101, 101, 495,32767,32767,
+ 112, 100, 100, 100, 100, 100, 104, 102,32767,32767,
+ 32767,32767, 100,32767, 102, 102,32767,32767, 221, 208,
+ 219, 102,32767, 547, 548, 219, 102, 223, 223, 223,
+ 243, 243, 474, 308, 102, 100, 102, 102, 196, 308,
+ 308,32767, 102, 474, 308, 474, 308, 198, 308, 308,
+ 308, 474, 308,32767, 102, 308, 210, 100, 100, 308,
+ 32767,32767,32767, 485,32767,32767,32767,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767,32767, 515,32767,
+ 532, 545, 421, 422, 424, 530, 446, 447, 448, 449,
+ 450, 451, 452, 454, 577,32767, 489,32767,32767,32767,
+ 32767, 328, 587,32767, 587,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767, 479, 419, 139,32767, 139, 524, 411, 412, 413,
- 481, 524, 524, 524, 298, 281,32767,32767,32767,32767,
- 496, 496, 101, 101, 101, 101, 491,32767,32767, 112,
- 100, 100, 100, 100, 100, 104, 102,32767,32767,32767,
- 32767, 100,32767, 102, 102,32767,32767, 217, 208, 215,
- 102,32767, 543, 544, 215, 102, 219, 219, 219, 239,
- 239, 470, 304, 102, 100, 102, 102, 196, 304, 304,
- 32767, 102, 470, 304, 470, 304, 198, 304, 304, 304,
- 470, 304,32767, 102, 304, 210, 100, 100, 304,32767,
- 32767,32767, 481,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767,32767,32767,32767,32767, 511,32767, 528,
- 541, 417, 418, 420, 526, 442, 443, 444, 445, 446,
- 447, 448, 450, 573,32767, 485,32767,32767,32767,32767,
- 324, 583,32767, 583,32767,32767,32767,32767,32767,32767,
+ 588,32767, 528,32767,32767,32767,32767, 420, 9, 76,
+ 43, 44, 52, 58, 506, 507, 508, 509, 503, 504,
+ 510, 505,32767,32767, 511, 553,32767,32767, 529, 580,
+ 32767,32767,32767,32767,32767,32767, 139,32767,32767,32767,
+ 32767,32767,32767,32767,32767,32767,32767, 515,32767, 137,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767, 584,32767, 524,32767,32767,32767,32767, 416, 9,
- 76, 43, 44, 52, 58, 502, 503, 504, 505, 499,
- 500, 506, 501,32767,32767, 507, 549,32767,32767, 525,
- 576,32767,32767,32767,32767,32767,32767, 139,32767,32767,
- 32767,32767,32767,32767,32767,32767,32767,32767, 511,32767,
- 137,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767, 524,32767,32767,32767, 300, 301,32767,32767,
+ 32767, 528,32767,32767,32767, 304, 305,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767, 524,32767,32767,32767, 283, 284,32767,
+ 32767,32767, 528,32767,32767,32767, 287, 288,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767,32767, 278,32767,32767, 366,32767,32767,32767,
- 32767, 345,32767,32767,32767,32767,32767,32767,32767,32767,
- 32767,32767, 152, 152, 3, 3, 327, 152, 152, 152,
- 327, 152, 327, 327, 327, 152, 152, 152, 152, 152,
- 152, 272, 184, 254, 257, 239, 239, 152, 337, 152
+ 32767,32767, 282,32767,32767, 370,32767,32767,32767,32767,
+ 349,32767,32767,32767,32767,32767,32767,32767,32767,32767,
+ 32767, 152, 152, 3, 3, 331, 152, 152, 152, 331,
+ 152, 331, 331, 331, 152, 152, 152, 152, 152, 152,
+ 276, 184, 258, 261, 243, 243, 152, 341, 152
);
protected $goto = array(
- 194, 194, 670, 422, 643, 463, 1264, 1265, 1022, 416,
- 308, 309, 329, 563, 314, 421, 330, 423, 622, 801,
- 678, 637, 586, 651, 652, 653, 165, 165, 165, 165,
+ 194, 194, 669, 423, 642, 883, 839, 884, 1025, 417,
+ 308, 309, 330, 562, 314, 422, 331, 424, 621, 823,
+ 677, 851, 824, 585, 838, 857, 165, 165, 165, 165,
218, 195, 191, 191, 175, 177, 213, 191, 191, 191,
191, 191, 192, 192, 192, 192, 192, 192, 186, 187,
- 188, 189, 190, 215, 213, 216, 521, 522, 412, 523,
- 525, 526, 527, 528, 529, 530, 531, 532, 1091, 166,
+ 188, 189, 190, 215, 213, 216, 522, 523, 413, 524,
+ 526, 527, 528, 529, 530, 531, 532, 533, 1094, 166,
167, 168, 193, 169, 170, 171, 164, 172, 173, 174,
176, 212, 214, 217, 235, 238, 241, 242, 244, 255,
256, 257, 258, 259, 260, 261, 263, 264, 265, 266,
- 274, 275, 311, 312, 313, 417, 418, 419, 568, 219,
+ 274, 275, 311, 312, 313, 418, 419, 420, 567, 219,
220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 178, 234, 179, 196, 197, 198,
- 236, 186, 187, 188, 189, 190, 215, 1091, 199, 180,
+ 236, 186, 187, 188, 189, 190, 215, 1094, 199, 180,
181, 182, 200, 196, 183, 237, 201, 199, 163, 202,
203, 184, 204, 205, 206, 185, 207, 208, 209, 210,
- 211, 323, 323, 323, 323, 827, 608, 608, 824, 547,
- 538, 342, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221,
- 1221, 1221, 1239, 1239, 288, 288, 288, 288, 1239, 1239,
- 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 388, 538,
- 547, 556, 557, 395, 566, 588, 602, 603, 832, 825,
- 880, 875, 876, 889, 15, 833, 877, 830, 878, 879,
- 831, 799, 251, 251, 883, 919, 992, 1000, 1004, 1001,
- 1005, 1237, 1237, 938, 1043, 1039, 1040, 1237, 1237, 1237,
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 858, 248, 248,
- 248, 248, 250, 252, 533, 533, 533, 533, 487, 590,
- 488, 1190, 1190, 997, 1190, 997, 494, 1290, 1290, 560,
- 997, 997, 997, 997, 997, 997, 997, 997, 997, 997,
- 997, 997, 1261, 1261, 1290, 1261, 340, 1190, 930, 402,
- 677, 1279, 1190, 1190, 1190, 1190, 959, 345, 1190, 1190,
- 1190, 1271, 1271, 1271, 1271, 606, 640, 345, 345, 1273,
- 1273, 1273, 1273, 820, 820, 805, 896, 884, 840, 885,
- 897, 345, 345, 5, 345, 6, 1306, 384, 535, 535,
- 559, 535, 415, 852, 597, 1257, 839, 540, 524, 524,
- 345, 1289, 1289, 642, 524, 524, 524, 524, 524, 524,
- 524, 524, 524, 524, 445, 805, 1140, 805, 1289, 932,
- 932, 932, 932, 1063, 1064, 445, 926, 933, 386, 390,
- 548, 587, 591, 1030, 1292, 331, 554, 1259, 1259, 1030,
- 704, 621, 623, 823, 641, 1250, 319, 303, 660, 664,
- 973, 668, 676, 969, 429, 553, 962, 936, 936, 934,
- 936, 703, 601, 537, 971, 966, 343, 344, 663, 817,
- 595, 609, 612, 613, 614, 615, 634, 635, 636, 680,
- 439, 1186, 845, 454, 454, 439, 439, 1266, 1267, 820,
- 901, 1079, 454, 394, 539, 551, 1183, 605, 540, 539,
- 842, 551, 978, 272, 387, 618, 619, 981, 536, 536,
- 844, 707, 646, 957, 567, 457, 458, 459, 838, 850,
- 254, 254, 1297, 1298, 400, 401, 976, 976, 464, 649,
- 1182, 650, 1028, 404, 405, 406, 1187, 661, 424, 1032,
- 407, 564, 600, 815, 338, 424, 854, 848, 853, 841,
- 1027, 1031, 1009, 1002, 1006, 1003, 1007, 1185, 941, 1188,
- 1247, 1248, 943, 0, 1074, 439, 439, 439, 439, 439,
- 439, 439, 439, 439, 439, 439, 0, 468, 439, 585,
- 1056, 931, 681, 667, 667, 0, 495, 673, 1054, 1171,
- 912, 0, 0, 1172, 1175, 913, 1176, 0, 0, 0,
- 0, 0, 0, 1072, 857
+ 211, 323, 323, 323, 323, 826, 607, 607, 800, 546,
+ 539, 1189, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1242, 1242, 343, 464, 1267, 1268, 1242, 1242,
+ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 389, 539,
+ 546, 555, 556, 396, 565, 587, 601, 602, 831, 798,
+ 879, 874, 875, 888, 15, 832, 876, 829, 877, 878,
+ 830, 455, 455, 941, 882, 804, 1190, 251, 251, 559,
+ 455, 1240, 1240, 814, 1046, 1042, 1043, 1240, 1240, 1240,
+ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 605, 639, 1191,
+ 1250, 1251, 341, 248, 248, 248, 248, 250, 252, 819,
+ 819, 1193, 1193, 1000, 1193, 1000, 804, 416, 804, 596,
+ 1000, 1282, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000,
+ 1000, 1000, 1000, 1264, 1264, 962, 1264, 1193, 488, 5,
+ 489, 6, 1193, 1193, 1193, 1193, 495, 385, 1193, 1193,
+ 1193, 1274, 1274, 1274, 1274, 277, 277, 277, 277, 558,
+ 1276, 1276, 1276, 1276, 1066, 1067, 895, 346, 553, 319,
+ 303, 896, 703, 620, 622, 641, 640, 346, 346, 1143,
+ 659, 663, 976, 667, 675, 972, 1260, 430, 1292, 1292,
+ 332, 346, 346, 816, 346, 636, 1309, 650, 651, 652,
+ 844, 536, 536, 924, 536, 1292, 525, 525, 541, 1269,
+ 1270, 346, 525, 525, 525, 525, 525, 525, 525, 525,
+ 525, 525, 1295, 617, 618, 1033, 819, 446, 395, 1262,
+ 1262, 1033, 935, 935, 935, 935, 563, 599, 446, 929,
+ 936, 933, 403, 676, 822, 1186, 552, 534, 534, 534,
+ 534, 841, 589, 600, 984, 1031, 1253, 965, 939, 939,
+ 937, 939, 702, 465, 538, 974, 969, 344, 345, 706,
+ 440, 900, 1082, 853, 946, 440, 440, 1035, 604, 662,
+ 469, 1293, 1293, 981, 1077, 540, 550, 0, 0, 0,
+ 540, 843, 550, 645, 960, 388, 1174, 911, 1293, 837,
+ 1175, 1178, 912, 1179, 0, 566, 458, 459, 460, 541,
+ 849, 1185, 0, 1300, 1301, 254, 254, 401, 402, 0,
+ 0, 0, 648, 0, 649, 0, 405, 406, 407, 0,
+ 660, 0, 0, 408, 0, 0, 0, 339, 847, 594,
+ 608, 611, 612, 613, 614, 633, 634, 635, 679, 918,
+ 995, 1003, 1007, 1004, 1008, 0, 440, 440, 440, 440,
+ 440, 440, 440, 440, 440, 440, 440, 0, 1188, 440,
+ 852, 840, 1030, 1034, 584, 1059, 0, 680, 666, 666,
+ 944, 496, 672, 1057, 387, 391, 547, 586, 590, 425,
+ 0, 0, 0, 0, 0, 0, 425, 0, 0, 0,
+ 0, 0, 0, 934, 1012, 1005, 1009, 1006, 1010, 0,
+ 0, 0, 0, 0, 272, 0, 0, 0, 0, 537,
+ 537, 0, 0, 0, 0, 1075, 856, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 979,
+ 979
);
protected $gotoCheck = array(
- 42, 42, 72, 65, 65, 166, 166, 166, 119, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 7,
- 9, 84, 122, 84, 84, 84, 42, 42, 42, 42,
+ 42, 42, 72, 65, 65, 64, 35, 64, 121, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65, 65, 26,
+ 9, 35, 27, 124, 35, 45, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
@@ -754,87 +759,94 @@ class Php7 extends \PhpParser\ParserAbstract
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 23, 23, 23, 23, 15, 104, 104, 26, 75,
- 75, 93, 104, 104, 104, 104, 104, 104, 104, 104,
- 104, 104, 160, 160, 24, 24, 24, 24, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 160, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75, 15, 27,
+ 42, 23, 23, 23, 23, 15, 106, 106, 7, 75,
+ 75, 20, 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 106, 162, 162, 95, 168, 168, 168, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 15, 6,
15, 15, 15, 15, 75, 15, 15, 15, 15, 15,
- 15, 6, 5, 5, 15, 87, 87, 87, 87, 87,
- 87, 161, 161, 49, 15, 15, 15, 161, 161, 161,
- 161, 161, 161, 161, 161, 161, 161, 45, 5, 5,
- 5, 5, 5, 5, 103, 103, 103, 103, 147, 103,
- 147, 72, 72, 72, 72, 72, 147, 173, 173, 162,
- 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
- 72, 72, 122, 122, 173, 122, 169, 72, 89, 89,
- 89, 171, 72, 72, 72, 72, 99, 14, 72, 72,
- 72, 9, 9, 9, 9, 55, 55, 14, 14, 122,
- 122, 122, 122, 22, 22, 12, 72, 64, 35, 64,
- 72, 14, 14, 46, 14, 46, 14, 61, 19, 19,
- 100, 19, 13, 35, 13, 122, 35, 14, 163, 163,
- 14, 172, 172, 63, 163, 163, 163, 163, 163, 163,
- 163, 163, 163, 163, 19, 12, 143, 12, 172, 19,
- 19, 19, 19, 136, 136, 19, 19, 19, 58, 58,
- 58, 58, 58, 122, 172, 29, 48, 122, 122, 122,
- 48, 48, 48, 25, 48, 14, 159, 159, 48, 48,
- 48, 48, 48, 48, 109, 9, 25, 25, 25, 25,
- 25, 25, 9, 25, 25, 25, 93, 93, 14, 18,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 23, 20, 39, 141, 141, 23, 23, 168, 168, 22,
- 17, 17, 141, 28, 9, 9, 152, 17, 14, 9,
- 37, 9, 17, 24, 9, 83, 83, 106, 24, 24,
- 17, 95, 17, 17, 9, 9, 9, 9, 17, 9,
- 5, 5, 9, 9, 80, 80, 103, 103, 149, 80,
- 17, 80, 121, 80, 80, 80, 20, 80, 113, 124,
- 80, 2, 2, 20, 80, 113, 41, 9, 16, 16,
- 16, 16, 113, 113, 113, 113, 113, 14, 16, 20,
- 20, 20, 92, -1, 139, 23, 23, 23, 23, 23,
- 23, 23, 23, 23, 23, 23, -1, 82, 23, 8,
- 8, 16, 8, 8, 8, -1, 8, 8, 8, 78,
- 78, -1, -1, 78, 78, 78, 78, -1, -1, -1,
- -1, -1, -1, 16, 16
+ 15, 143, 143, 49, 15, 12, 20, 5, 5, 164,
+ 143, 163, 163, 20, 15, 15, 15, 163, 163, 163,
+ 163, 163, 163, 163, 163, 163, 163, 55, 55, 20,
+ 20, 20, 171, 5, 5, 5, 5, 5, 5, 22,
+ 22, 72, 72, 72, 72, 72, 12, 13, 12, 13,
+ 72, 173, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 124, 124, 101, 124, 72, 149, 46,
+ 149, 46, 72, 72, 72, 72, 149, 61, 72, 72,
+ 72, 9, 9, 9, 9, 24, 24, 24, 24, 102,
+ 124, 124, 124, 124, 138, 138, 72, 14, 48, 161,
+ 161, 72, 48, 48, 48, 63, 48, 14, 14, 145,
+ 48, 48, 48, 48, 48, 48, 124, 111, 174, 174,
+ 29, 14, 14, 18, 14, 84, 14, 84, 84, 84,
+ 39, 19, 19, 90, 19, 174, 165, 165, 14, 170,
+ 170, 14, 165, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 174, 83, 83, 124, 22, 19, 28, 124,
+ 124, 124, 19, 19, 19, 19, 2, 2, 19, 19,
+ 19, 91, 91, 91, 25, 154, 9, 105, 105, 105,
+ 105, 37, 105, 9, 108, 123, 14, 25, 25, 25,
+ 25, 25, 25, 151, 25, 25, 25, 95, 95, 97,
+ 23, 17, 17, 41, 94, 23, 23, 126, 17, 14,
+ 82, 175, 175, 17, 141, 9, 9, -1, -1, -1,
+ 9, 17, 9, 17, 17, 9, 78, 78, 175, 17,
+ 78, 78, 78, 78, -1, 9, 9, 9, 9, 14,
+ 9, 17, -1, 9, 9, 5, 5, 80, 80, -1,
+ -1, -1, 80, -1, 80, -1, 80, 80, 80, -1,
+ 80, -1, -1, 80, -1, -1, -1, 80, 9, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 87,
+ 87, 87, 87, 87, 87, -1, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, -1, 14, 23,
+ 16, 16, 16, 16, 8, 8, -1, 8, 8, 8,
+ 16, 8, 8, 8, 58, 58, 58, 58, 58, 115,
+ -1, -1, -1, -1, -1, -1, 115, -1, -1, -1,
+ -1, -1, -1, 16, 115, 115, 115, 115, 115, -1,
+ -1, -1, -1, -1, 24, -1, -1, -1, -1, 24,
+ 24, -1, -1, -1, -1, 16, 16, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 105,
+ 105
);
protected $gotoBase = array(
- 0, 0, -203, 0, 0, 221, 208, 10, 512, 7,
- 0, 0, 24, 1, 5, -174, 47, -23, 105, 61,
- 38, 0, -10, 158, 181, 379, 164, 205, 102, 84,
- 0, 0, 0, 0, 0, -43, 0, 107, 0, 104,
- 0, 54, -1, 0, 0, 235, -384, 0, -307, 210,
- 0, 0, 0, 0, 0, 266, 0, 0, 324, 0,
- 0, 286, 0, 103, 298, -236, 0, 0, 0, 0,
- 0, 0, -6, 0, 0, -167, 0, 0, 129, 62,
- -14, 0, 53, -22, -669, 0, 0, -52, 0, -11,
- 0, 0, 68, -299, 0, 52, 0, 0, 0, 262,
- 288, 0, 0, 227, -73, 0, 87, 0, 0, 118,
- 0, 0, 0, 209, 0, 0, 0, 0, 0, 6,
- 0, 108, 15, 0, 46, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 91, 0, 0, 69,
- 0, 390, 0, 86, 0, 0, 0, -224, 0, 37,
- 0, 0, 77, 0, 0, 0, 0, 0, 0, 70,
- -57, -8, 241, 99, 0, 0, -290, 0, 65, 257,
- 0, 261, 39, -35, 0, 0
+ 0, 0, -297, 0, 0, 226, 196, 159, 517, 7,
+ 0, 0, -66, -65, 25, -175, 78, -33, 39, 84,
+ -213, 0, -64, 158, 302, 390, 15, 18, 46, 49,
+ 0, 0, 0, 0, 0, -356, 0, 67, 0, 32,
+ 0, -10, -1, 0, 0, 13, -417, 0, -364, 200,
+ 0, 0, 0, 0, 0, 208, 0, 0, 490, 0,
+ 0, 256, 0, 85, -14, -236, 0, 0, 0, 0,
+ 0, 0, -6, 0, 0, -168, 0, 0, 45, 140,
+ -12, 0, -35, -95, -344, 0, 0, 221, 0, 0,
+ 27, 92, 0, 0, -11, -287, 0, 19, 0, 0,
+ 0, 251, 267, 0, 0, 370, -73, 0, 43, 0,
+ 0, 61, 0, 0, 0, 270, 0, 0, 0, 0,
+ 0, 6, 0, 40, 16, 0, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 42, 0,
+ 0, -2, 0, 188, 0, 59, 0, 0, 0, -195,
+ 0, -19, 0, 0, 35, 0, 0, 0, 0, 0,
+ 0, 3, -57, -8, 201, 117, 0, 0, -110, 0,
+ -4, 223, 0, 241, 36, 129, 0, 0
);
protected $gotoDefault = array(
- -32768, 499, 711, 4, 712, 905, 788, 797, 583, 515,
- 679, 339, 610, 413, 1255, 882, 1078, 565, 816, 1199,
- 1207, 446, 819, 324, 701, 864, 865, 866, 391, 376,
- 382, 389, 632, 611, 481, 851, 442, 843, 473, 846,
- 441, 855, 162, 410, 497, 859, 3, 861, 542, 892,
- 377, 869, 378, 656, 871, 550, 873, 874, 385, 392,
- 393, 1083, 558, 607, 886, 243, 552, 887, 375, 888,
- 895, 380, 383, 665, 453, 492, 486, 403, 1058, 594,
- 629, 450, 467, 617, 616, 604, 466, 425, 408, 928,
- 474, 451, 942, 341, 950, 709, 1090, 624, 476, 958,
- 625, 965, 968, 516, 517, 465, 980, 269, 983, 477,
- 1015, 647, 648, 995, 626, 627, 1013, 460, 584, 1021,
- 443, 1029, 1243, 444, 1033, 262, 1036, 276, 409, 426,
- 1041, 1042, 8, 1048, 671, 672, 10, 273, 496, 1073,
- 666, 440, 1089, 430, 1159, 1161, 544, 478, 1179, 1178,
- 659, 493, 1184, 1246, 438, 518, 461, 310, 519, 302,
- 327, 307, 534, 289, 328, 520, 462, 1252, 1260, 325,
- 30, 1280, 1291, 335, 562, 599
+ -32768, 500, 710, 4, 711, 904, 787, 796, 582, 516,
+ 678, 340, 609, 414, 1258, 881, 1081, 564, 815, 1202,
+ 1210, 447, 818, 324, 700, 863, 864, 865, 392, 377,
+ 383, 390, 631, 610, 482, 850, 443, 842, 474, 845,
+ 442, 854, 162, 411, 498, 858, 3, 860, 543, 891,
+ 378, 868, 379, 655, 870, 549, 872, 873, 386, 393,
+ 394, 1086, 557, 606, 885, 243, 551, 886, 376, 887,
+ 894, 381, 384, 664, 454, 493, 487, 404, 1061, 593,
+ 628, 451, 468, 616, 615, 603, 467, 426, 409, 326,
+ 923, 931, 475, 452, 945, 342, 953, 708, 1093, 623,
+ 477, 961, 624, 968, 971, 517, 518, 466, 983, 269,
+ 986, 478, 1018, 646, 647, 998, 625, 626, 1016, 461,
+ 583, 1024, 444, 1032, 1246, 445, 1036, 262, 1039, 276,
+ 410, 427, 1044, 1045, 8, 1051, 670, 671, 10, 273,
+ 497, 1076, 665, 441, 1092, 431, 1162, 1164, 545, 479,
+ 1182, 1181, 658, 494, 1187, 1249, 439, 519, 462, 310,
+ 520, 302, 328, 307, 535, 289, 329, 521, 463, 1255,
+ 1263, 325, 30, 1283, 1294, 336, 561, 598
);
protected $ruleToNonTerminal = array(
@@ -859,23 +871,24 @@ class Php7 extends \PhpParser\ParserAbstract
49, 49, 25, 25, 68, 68, 71, 71, 70, 69,
69, 62, 74, 74, 75, 75, 76, 76, 77, 77,
78, 78, 26, 26, 27, 27, 27, 27, 86, 86,
- 88, 88, 81, 81, 81, 82, 82, 85, 85, 83,
- 83, 89, 90, 90, 56, 56, 64, 64, 67, 67,
- 67, 66, 91, 91, 92, 57, 57, 57, 57, 93,
- 93, 94, 94, 95, 95, 96, 97, 97, 98, 98,
- 99, 99, 54, 54, 50, 50, 101, 52, 52, 102,
- 51, 51, 53, 53, 63, 63, 63, 63, 79, 79,
- 105, 105, 107, 107, 108, 108, 108, 108, 106, 106,
- 106, 110, 110, 110, 110, 87, 87, 113, 113, 113,
- 111, 111, 114, 114, 112, 112, 115, 115, 116, 116,
- 116, 116, 109, 109, 80, 80, 80, 20, 20, 20,
- 118, 117, 117, 119, 119, 119, 119, 59, 120, 120,
- 121, 60, 123, 123, 124, 124, 125, 125, 84, 126,
- 126, 126, 126, 126, 126, 131, 131, 132, 132, 133,
- 133, 133, 133, 133, 134, 135, 135, 130, 130, 127,
- 127, 129, 129, 137, 137, 136, 136, 136, 136, 136,
- 136, 136, 128, 138, 138, 140, 139, 139, 61, 100,
- 141, 141, 55, 55, 42, 42, 42, 42, 42, 42,
+ 88, 88, 81, 81, 89, 89, 90, 90, 90, 82,
+ 82, 85, 85, 83, 83, 91, 92, 92, 56, 56,
+ 64, 64, 67, 67, 67, 66, 93, 93, 94, 57,
+ 57, 57, 57, 95, 95, 96, 96, 97, 97, 98,
+ 99, 99, 100, 100, 101, 101, 54, 54, 50, 50,
+ 103, 52, 52, 104, 51, 51, 53, 53, 63, 63,
+ 63, 63, 79, 79, 107, 107, 109, 109, 110, 110,
+ 110, 110, 108, 108, 108, 112, 112, 112, 112, 87,
+ 87, 115, 115, 115, 113, 113, 116, 116, 114, 114,
+ 117, 117, 118, 118, 118, 118, 111, 111, 80, 80,
+ 80, 20, 20, 20, 120, 119, 119, 121, 121, 121,
+ 121, 59, 122, 122, 123, 60, 125, 125, 126, 126,
+ 127, 127, 84, 128, 128, 128, 128, 128, 128, 133,
+ 133, 134, 134, 135, 135, 135, 135, 135, 136, 137,
+ 137, 132, 132, 129, 129, 131, 131, 139, 139, 138,
+ 138, 138, 138, 138, 138, 138, 130, 140, 140, 142,
+ 141, 141, 61, 102, 143, 143, 55, 55, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
@@ -884,20 +897,20 @@ class Php7 extends \PhpParser\ParserAbstract
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 148, 142, 142,
- 147, 147, 150, 151, 151, 152, 153, 153, 153, 19,
- 19, 72, 72, 72, 72, 143, 143, 143, 143, 155,
- 155, 144, 144, 146, 146, 146, 149, 149, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 161, 161, 104,
- 163, 163, 163, 163, 145, 145, 145, 145, 145, 145,
- 145, 145, 58, 58, 158, 158, 158, 158, 164, 164,
- 154, 154, 154, 165, 165, 165, 165, 165, 165, 73,
- 73, 65, 65, 65, 65, 122, 122, 122, 122, 168,
- 167, 157, 157, 157, 157, 157, 157, 157, 156, 156,
- 156, 166, 166, 166, 166, 103, 162, 170, 170, 169,
- 169, 171, 171, 171, 171, 171, 171, 171, 171, 159,
- 159, 159, 159, 173, 174, 172, 172, 172, 172, 172,
- 172, 172, 172, 175, 175, 175, 175
+ 42, 150, 144, 144, 149, 149, 152, 153, 153, 154,
+ 155, 155, 155, 19, 19, 72, 72, 72, 72, 145,
+ 145, 145, 145, 157, 157, 146, 146, 148, 148, 148,
+ 151, 151, 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 163, 163, 106, 165, 165, 165, 165, 147, 147,
+ 147, 147, 147, 147, 147, 147, 58, 58, 160, 160,
+ 160, 160, 166, 166, 156, 156, 156, 167, 167, 167,
+ 167, 167, 167, 73, 73, 65, 65, 65, 65, 124,
+ 124, 124, 124, 170, 169, 159, 159, 159, 159, 159,
+ 159, 159, 158, 158, 158, 168, 168, 168, 168, 105,
+ 164, 172, 172, 171, 171, 173, 173, 173, 173, 173,
+ 173, 173, 173, 161, 161, 161, 161, 175, 176, 174,
+ 174, 174, 174, 174, 174, 174, 174, 177, 177, 177,
+ 177
);
protected $ruleToLength = array(
@@ -922,45 +935,46 @@ class Php7 extends \PhpParser\ParserAbstract
2, 1, 1, 1, 0, 2, 1, 3, 8, 0,
4, 2, 1, 3, 0, 1, 0, 1, 0, 1,
3, 1, 8, 9, 8, 7, 6, 8, 0, 2,
- 0, 2, 1, 2, 2, 0, 2, 0, 2, 0,
- 2, 2, 1, 3, 1, 4, 1, 4, 1, 1,
- 4, 2, 1, 3, 3, 3, 4, 4, 5, 0,
- 2, 4, 3, 1, 1, 7, 0, 2, 1, 3,
- 3, 4, 1, 4, 0, 2, 5, 0, 2, 6,
- 0, 2, 0, 3, 1, 2, 1, 1, 2, 0,
- 1, 3, 0, 2, 1, 1, 1, 1, 6, 8,
- 6, 1, 2, 1, 1, 1, 1, 1, 1, 1,
- 3, 3, 3, 3, 3, 3, 3, 3, 1, 2,
- 1, 1, 0, 1, 0, 2, 2, 2, 4, 3,
- 1, 1, 3, 1, 2, 2, 3, 2, 3, 1,
- 1, 2, 3, 1, 1, 3, 2, 0, 1, 5,
- 5, 10, 3, 5, 1, 1, 3, 0, 2, 4,
- 5, 4, 4, 4, 3, 1, 1, 1, 1, 1,
- 1, 0, 1, 1, 2, 1, 1, 1, 1, 1,
- 1, 1, 2, 1, 3, 1, 1, 3, 2, 2,
- 3, 1, 0, 1, 1, 3, 3, 3, 4, 1,
- 1, 2, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 2, 2, 2, 2, 3,
+ 0, 2, 1, 2, 1, 2, 1, 1, 1, 0,
+ 2, 0, 2, 0, 2, 2, 1, 3, 1, 4,
+ 1, 4, 1, 1, 4, 2, 1, 3, 3, 3,
+ 4, 4, 5, 0, 2, 4, 3, 1, 1, 7,
+ 0, 2, 1, 3, 3, 4, 1, 4, 0, 2,
+ 5, 0, 2, 6, 0, 2, 0, 3, 1, 2,
+ 1, 1, 2, 0, 1, 3, 0, 2, 1, 1,
+ 1, 1, 6, 8, 6, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 2, 1, 1, 0, 1, 0, 2,
+ 2, 2, 4, 3, 1, 1, 3, 1, 2, 2,
+ 3, 2, 3, 1, 1, 2, 3, 1, 1, 3,
+ 2, 0, 1, 5, 5, 10, 3, 5, 1, 1,
+ 3, 0, 2, 4, 5, 4, 4, 4, 3, 1,
+ 1, 1, 1, 1, 1, 0, 1, 1, 2, 1,
+ 1, 1, 1, 1, 1, 1, 2, 1, 3, 1,
+ 1, 3, 2, 2, 3, 1, 0, 1, 1, 3,
+ 3, 3, 4, 1, 1, 2, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
+ 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 5, 4, 3, 4, 4, 2, 2, 4,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 1, 3, 2, 1, 2, 4, 2, 2, 8,
- 9, 8, 9, 9, 10, 9, 10, 8, 3, 2,
- 0, 4, 2, 1, 3, 2, 2, 2, 4, 1,
- 1, 1, 1, 1, 1, 1, 1, 3, 1, 1,
- 1, 0, 3, 0, 1, 1, 0, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 3, 3, 3,
- 4, 1, 1, 3, 1, 1, 1, 1, 1, 3,
- 2, 3, 0, 1, 1, 3, 1, 1, 1, 1,
- 1, 3, 1, 1, 4, 4, 1, 4, 4, 0,
- 1, 1, 1, 3, 3, 1, 4, 2, 2, 1,
- 3, 1, 4, 4, 3, 3, 3, 3, 1, 3,
- 1, 1, 3, 1, 1, 4, 1, 1, 1, 3,
- 1, 1, 2, 1, 3, 4, 3, 2, 0, 2,
- 2, 1, 2, 1, 1, 1, 4, 3, 3, 3,
- 3, 6, 3, 1, 1, 2, 1
+ 3, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 5, 4, 3, 4,
+ 4, 2, 2, 4, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 3, 2, 1, 2,
+ 4, 2, 2, 8, 9, 8, 9, 9, 10, 9,
+ 10, 8, 3, 2, 0, 4, 2, 1, 3, 2,
+ 2, 2, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 1, 1, 1, 0, 3, 0, 1, 1,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 3, 3, 3, 4, 1, 1, 3, 1, 1,
+ 1, 1, 1, 3, 2, 3, 0, 1, 1, 3,
+ 1, 1, 1, 1, 1, 3, 1, 1, 4, 4,
+ 1, 4, 4, 0, 1, 1, 1, 3, 3, 1,
+ 4, 2, 2, 1, 3, 1, 4, 4, 3, 3,
+ 3, 3, 1, 3, 1, 1, 3, 1, 1, 4,
+ 1, 1, 1, 3, 1, 1, 2, 1, 3, 4,
+ 3, 2, 0, 2, 2, 1, 2, 1, 1, 1,
+ 4, 3, 3, 3, 3, 6, 3, 1, 1, 2,
+ 1
);
protected function initReduceCallbacks() {
@@ -1633,249 +1647,249 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = 0;
},
213 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
214 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_FINAL;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
215 => function ($stackPos) {
- $this->semValue = null;
+ $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
},
216 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-2)];
+ $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
},
217 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = Stmt\Class_::MODIFIER_FINAL;
},
218 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-2)];
+ $this->semValue = Stmt\Class_::MODIFIER_READONLY;
},
219 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = null;
},
220 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(2-2)];
},
221 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = array();
},
222 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = $this->semStack[$stackPos-(2-2)];
},
223 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = array();
},
224 => function ($stackPos) {
- $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = $this->semStack[$stackPos-(2-2)];
},
225 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
226 => function ($stackPos) {
- $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
227 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
228 => function ($stackPos) {
$this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
},
229 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
230 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
},
231 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
232 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
},
233 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = null;
},
234 => function ($stackPos) {
- $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
235 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
236 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-3)];
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
237 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
238 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(5-3)];
+ $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
239 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
240 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = $this->semStack[$stackPos-(4-3)];
},
241 => function ($stackPos) {
- $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
242 => function ($stackPos) {
- $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(5-3)];
},
243 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos];
+ $this->semValue = array();
},
244 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos];
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
245 => function ($stackPos) {
- $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
+ $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
246 => function ($stackPos) {
- $this->semValue = [];
+ $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
247 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = $this->semStack[$stackPos];
},
248 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = $this->semStack[$stackPos];
},
249 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes);
},
250 => function ($stackPos) {
- $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = [];
},
251 => function ($stackPos) {
- $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
252 => function ($stackPos) {
- $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
253 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
254 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
255 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
256 => function ($stackPos) {
- $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
+ $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]);
},
257 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
258 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = array();
},
259 => function ($stackPos) {
- $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
260 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
},
261 => function ($stackPos) {
- $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = array();
},
262 => function ($stackPos) {
- $this->semValue = null;
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
263 => function ($stackPos) {
- $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
},
264 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
+ $this->semValue = null;
},
265 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(2-2)], true);
+ $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
266 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
+ $this->semValue = null;
},
267 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
+ $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
268 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
},
269 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = array($this->semStack[$stackPos-(2-2)], true);
},
270 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
},
271 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = array($this->semStack[$stackPos-(1-1)], false);
},
272 => function ($stackPos) {
- $this->semValue = 0;
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
273 => function ($stackPos) {
- $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
+ $this->semValue = array();
},
274 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
275 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
276 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
+ $this->semValue = 0;
},
277 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_READONLY;
+ $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
},
278 => function ($stackPos) {
- $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
- $this->checkParam($this->semValue);
+ $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
},
279 => function ($stackPos) {
- $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]);
- $this->checkParam($this->semValue);
+ $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
},
280 => function ($stackPos) {
- $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
+ $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
},
281 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = Stmt\Class_::MODIFIER_READONLY;
},
282 => function ($stackPos) {
- $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
+ $this->checkParam($this->semValue);
},
283 => function ($stackPos) {
- $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]);
+ $this->checkParam($this->semValue);
},
284 => function ($stackPos) {
- $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]);
},
285 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
286 => function ($stackPos) {
- $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
287 => function ($stackPos) {
- $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
288 => function ($stackPos) {
- $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
289 => function ($stackPos) {
- $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
290 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
+ $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
291 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]);
},
292 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
+ $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
293 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
294 => function ($stackPos) {
$this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
@@ -1890,73 +1904,73 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
298 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
},
299 => function ($stackPos) {
- $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
300 => function ($stackPos) {
- $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
},
301 => function ($stackPos) {
- $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
302 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
303 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
304 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
305 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-2)];
+ $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
306 => function ($stackPos) {
$this->semValue = null;
},
307 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
308 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-2)];
+ $this->semValue = null;
},
309 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(3-2)]);
+ $this->semValue = $this->semStack[$stackPos-(2-2)];
},
310 => function ($stackPos) {
- $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = null;
},
311 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = array();
},
312 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = $this->semStack[$stackPos-(4-2)];
},
313 => function ($stackPos) {
- $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(3-2)]);
},
314 => function ($stackPos) {
- $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
315 => function ($stackPos) {
- $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
316 => function ($stackPos) {
- $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]);
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
317 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
318 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
319 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
320 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]);
},
321 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(2-1)];
@@ -1968,92 +1982,92 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
324 => function ($stackPos) {
- $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
325 => function ($stackPos) {
- $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
326 => function ($stackPos) {
- if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
327 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
328 => function ($stackPos) {
- $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
- if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
329 => function ($stackPos) {
- $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]);
- $this->checkProperty($this->semValue, $stackPos-(5-2));
+ $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
330 => function ($stackPos) {
- $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]);
- $this->checkClassConst($this->semValue, $stackPos-(5-2));
+ if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }
},
331 => function ($stackPos) {
- $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
- $this->checkClassMethod($this->semValue, $stackPos-(10-2));
+ $this->semValue = array();
},
332 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; };
+ if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)];
},
333 => function ($stackPos) {
- $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
+ $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]);
+ $this->checkProperty($this->semValue, $stackPos-(5-2));
},
334 => function ($stackPos) {
- $this->semValue = null; /* will be skipped */
+ $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]);
+ $this->checkClassConst($this->semValue, $stackPos-(5-2));
},
335 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
+ $this->checkClassMethod($this->semValue, $stackPos-(10-2));
},
336 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
337 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
},
338 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = null; /* will be skipped */
},
339 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = array();
},
340 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
341 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = array();
},
342 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
343 => function ($stackPos) {
- $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
344 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
+ $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
},
345 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
346 => function ($stackPos) {
- $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]);
+ $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
347 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
348 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]);
},
349 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
350 => function ($stackPos) {
- $this->semValue = 0;
+ $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]);
},
351 => function ($stackPos) {
- $this->semValue = 0;
+ $this->semValue = null;
},
352 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
@@ -2062,414 +2076,414 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
354 => function ($stackPos) {
- $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
+ $this->semValue = 0;
},
355 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
+ $this->semValue = 0;
},
356 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
357 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
358 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_STATIC;
+ $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)];
},
359 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
+ $this->semValue = Stmt\Class_::MODIFIER_PUBLIC;
},
360 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_FINAL;
+ $this->semValue = Stmt\Class_::MODIFIER_PROTECTED;
},
361 => function ($stackPos) {
- $this->semValue = Stmt\Class_::MODIFIER_READONLY;
+ $this->semValue = Stmt\Class_::MODIFIER_PRIVATE;
},
362 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = Stmt\Class_::MODIFIER_STATIC;
},
363 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT;
},
364 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = Stmt\Class_::MODIFIER_FINAL;
},
365 => function ($stackPos) {
- $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = Stmt\Class_::MODIFIER_READONLY;
},
366 => function ($stackPos) {
- $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
367 => function ($stackPos) {
- $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
368 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
369 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
370 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
371 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
372 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
373 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
374 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
375 => function ($stackPos) {
- $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
376 => function ($stackPos) {
- $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = array();
},
377 => function ($stackPos) {
- $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
378 => function ($stackPos) {
- $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
379 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
380 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
381 => function ($stackPos) {
- $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
382 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
383 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
384 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
385 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
386 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
387 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
388 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
389 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
390 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
391 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
392 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
393 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
394 => function ($stackPos) {
- $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
395 => function ($stackPos) {
- $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
396 => function ($stackPos) {
- $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
397 => function ($stackPos) {
- $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
398 => function ($stackPos) {
- $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
399 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
400 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
401 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
402 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
403 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
404 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
405 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
406 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
407 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
408 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
409 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
410 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
411 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
412 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
413 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
414 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
415 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
416 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
417 => function ($stackPos) {
- $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
418 => function ($stackPos) {
- $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
419 => function ($stackPos) {
- $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
420 => function ($stackPos) {
- $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
421 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
422 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
423 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
424 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
425 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
426 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
427 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
428 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
429 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
430 => function ($stackPos) {
- $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
431 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
432 => function ($stackPos) {
- $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
433 => function ($stackPos) {
- $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
434 => function ($stackPos) {
- $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
435 => function ($stackPos) {
- $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
436 => function ($stackPos) {
- $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes);
},
437 => function ($stackPos) {
- $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
438 => function ($stackPos) {
- $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
439 => function ($stackPos) {
- $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
440 => function ($stackPos) {
- $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
441 => function ($stackPos) {
- $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
442 => function ($stackPos) {
- $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
443 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
- $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]);
- $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs);
+ $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
444 => function ($stackPos) {
- $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
445 => function ($stackPos) {
- $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
446 => function ($stackPos) {
- $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
447 => function ($stackPos) {
- $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
+ $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]);
+ $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs);
},
448 => function ($stackPos) {
- $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
449 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
- $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
- $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs);
+ $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
450 => function ($stackPos) {
- $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
451 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
452 => function ($stackPos) {
- $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
453 => function ($stackPos) {
- $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes;
+ $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE;
+ $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs);
},
454 => function ($stackPos) {
- $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
455 => function ($stackPos) {
- $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
456 => function ($stackPos) {
- $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
457 => function ($stackPos) {
- $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
458 => function ($stackPos) {
- $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
459 => function ($stackPos) {
- $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
460 => function ($stackPos) {
- $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
461 => function ($stackPos) {
- $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
+ $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
462 => function ($stackPos) {
- $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
463 => function ($stackPos) {
- $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
},
464 => function ($stackPos) {
- $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
},
465 => function ($stackPos) {
- $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes);
},
466 => function ($stackPos) {
- $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
},
467 => function ($stackPos) {
- $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]);
- $this->checkClass($this->semValue[0], -1);
+ $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
},
468 => function ($stackPos) {
- $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
},
469 => function ($stackPos) {
- list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes);
},
470 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes);
},
471 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(4-3)];
+ $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]);
+ $this->checkClass($this->semValue[0], -1);
},
472 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
473 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
474 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = array();
},
475 => function ($stackPos) {
- $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(4-3)];
},
476 => function ($stackPos) {
- $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(2-1)];
},
477 => function ($stackPos) {
- $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
478 => function ($stackPos) {
- $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
479 => function ($stackPos) {
- $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
480 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
481 => function ($stackPos) {
- $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
482 => function ($stackPos) {
- $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
483 => function ($stackPos) {
- $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
484 => function ($stackPos) {
- $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
485 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
486 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
487 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
488 => function ($stackPos) {
- $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
+ $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
489 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
@@ -2478,116 +2492,115 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
491 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
492 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
},
493 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
494 => function ($stackPos) {
- $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes));
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
495 => function ($stackPos) {
- foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = null;
},
496 => function ($stackPos) {
- $this->semValue = array();
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
497 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = array();
},
498 => function ($stackPos) {
- $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes));
},
499 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)];
},
500 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = array();
},
501 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
502 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
503 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
504 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
505 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
506 => function ($stackPos) {
- $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
507 => function ($stackPos) {
- $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
508 => function ($stackPos) {
- $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2;
+ $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
509 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT;
- $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs);
+ $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
510 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG;
- $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs);
+ $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
511 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
512 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED);
- $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)]), $attrs);
+ $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2;
},
513 => function ($stackPos) {
- $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
- foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs);
+ $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT;
+ $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs);
},
514 => function ($stackPos) {
- $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG;
+ $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs);
},
515 => function ($stackPos) {
- $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
516 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
517 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
+ foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs);
},
518 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
519 => function ($stackPos) {
- $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
+ $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
520 => function ($stackPos) {
- $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
521 => function ($stackPos) {
- $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
522 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
523 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
},
524 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true);
},
525 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true);
},
526 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = null;
},
527 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
@@ -2596,13 +2609,13 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
529 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
530 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
531 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
532 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
@@ -2611,192 +2624,204 @@ class Php7 extends \PhpParser\ParserAbstract
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
534 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
535 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
536 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
537 => function ($stackPos) {
- $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
538 => function ($stackPos) {
- $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
539 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
540 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
541 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
542 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
543 => function ($stackPos) {
- $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = null;
},
544 => function ($stackPos) {
- $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
545 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
546 => function ($stackPos) {
- $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
547 => function ($stackPos) {
- $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
548 => function ($stackPos) {
- $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2;
+ $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
549 => function ($stackPos) {
- $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
550 => function ($stackPos) {
- $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
551 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
552 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2;
},
553 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var;
},
554 => function ($stackPos) {
- $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
555 => function ($stackPos) {
- $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
556 => function ($stackPos) {
- $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
557 => function ($stackPos) {
- $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
558 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
559 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
560 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
561 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
562 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
563 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
564 => function ($stackPos) {
- $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
565 => function ($stackPos) {
- $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
566 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue);
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
},
567 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos];
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
568 => function ($stackPos) {
- /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */
+ $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2;
},
569 => function ($stackPos) {
- $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
+ $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
570 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue);
},
571 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos];
},
572 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */
},
573 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)];
},
574 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
575 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
576 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
577 => function ($stackPos) {
- $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
578 => function ($stackPos) {
- $this->semValue = null;
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
579 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
580 => function ($stackPos) {
- $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
581 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(1-1)]);
+ $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
},
582 => function ($stackPos) {
- $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]);
+ $this->semValue = null;
},
583 => function ($stackPos) {
- $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
584 => function ($stackPos) {
- $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)];
},
585 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(1-1)];
+ $this->semValue = array($this->semStack[$stackPos-(1-1)]);
},
586 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
+ $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]);
},
587 => function ($stackPos) {
- $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
588 => function ($stackPos) {
- $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
},
589 => function ($stackPos) {
- $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = $this->semStack[$stackPos-(1-1)];
},
590 => function ($stackPos) {
- $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
},
591 => function ($stackPos) {
- $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
+ $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
592 => function ($stackPos) {
- $this->semValue = $this->semStack[$stackPos-(3-2)];
+ $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
593 => function ($stackPos) {
- $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
594 => function ($stackPos) {
- $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes);
},
595 => function ($stackPos) {
- $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes);
},
596 => function ($stackPos) {
+ $this->semValue = $this->semStack[$stackPos-(3-2)];
+ },
+ 597 => function ($stackPos) {
+ $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ },
+ 598 => function ($stackPos) {
+ $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
+ },
+ 599 => function ($stackPos) {
+ $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes);
+ },
+ 600 => function ($stackPos) {
$this->semValue = $this->semStack[$stackPos-(1-1)];
},
];
diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php
index 5ee5a64bb..d485d78de 100644
--- a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php
+++ b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php
@@ -875,6 +875,15 @@ abstract class ParserAbstract implements Parser
return $attributes;
}
+ protected function checkClassModifier($a, $b, $modifierPos) {
+ try {
+ Class_::verifyClassModifier($a, $b);
+ } catch (Error $error) {
+ $error->setAttributes($this->getAttributesAt($modifierPos));
+ $this->emitError($error);
+ }
+ }
+
protected function checkModifier($a, $b, $modifierPos) {
// Jumping through some hoops here because verifyModifier() is also used elsewhere
try {
diff --git a/vendor/paragonie/constant_time_encoding/.gitignore b/vendor/paragonie/constant_time_encoding/.gitignore
deleted file mode 100644
index e0caea8fc..000000000
--- a/vendor/paragonie/constant_time_encoding/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.idea/
-vendor/ \ No newline at end of file
diff --git a/vendor/paragonie/constant_time_encoding/.travis.yml b/vendor/paragonie/constant_time_encoding/.travis.yml
deleted file mode 100644
index 117c114a1..000000000
--- a/vendor/paragonie/constant_time_encoding/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-language: php
-sudo: false
-
-matrix:
- fast_finish: true
- include:
- - php: "7.1"
- - php: "7.2"
- - php: "7.3"
- - php: "7.4"
- - php: "8.0"
- - php: "nightly"
- allow_failures:
- - php: "nightly"
- - php: "7.4"
- - php: "8.0"
-
-install:
- - composer self-update
- - composer update
-
-script:
- - vendor/bin/phpunit
- - vendor/bin/psalm
diff --git a/vendor/paragonie/constant_time_encoding/LICENSE.txt b/vendor/paragonie/constant_time_encoding/LICENSE.txt
index f424f5ecc..91acaca67 100644
--- a/vendor/paragonie/constant_time_encoding/LICENSE.txt
+++ b/vendor/paragonie/constant_time_encoding/LICENSE.txt
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2016 - 2020 Paragon Initiative Enterprises
+Copyright (c) 2016 - 2022 Paragon Initiative Enterprises
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/paragonie/constant_time_encoding/README.md b/vendor/paragonie/constant_time_encoding/README.md
index d7db2a2d0..cedddd863 100644
--- a/vendor/paragonie/constant_time_encoding/README.md
+++ b/vendor/paragonie/constant_time_encoding/README.md
@@ -1,6 +1,6 @@
# Constant-Time Encoding
-[![Build Status](https://travis-ci.org/paragonie/constant_time_encoding.svg?branch=master)](https://travis-ci.org/paragonie/constant_time_encoding)
+[![Build Status](https://github.com/paragonie/constant_time_encoding/actions/workflows/ci.yml/badge.svg)](https://github.com/paragonie/constant_time_encoding/actions)
[![Latest Stable Version](https://poser.pugx.org/paragonie/constant_time_encoding/v/stable)](https://packagist.org/packages/paragonie/constant_time_encoding)
[![Latest Unstable Version](https://poser.pugx.org/paragonie/constant_time_encoding/v/unstable)](https://packagist.org/packages/paragonie/constant_time_encoding)
[![License](https://poser.pugx.org/paragonie/constant_time_encoding/license)](https://packagist.org/packages/paragonie/constant_time_encoding)
@@ -36,7 +36,7 @@ composer require paragonie/constant_time_encoding
## How to Use
```php
-use \ParagonIE\ConstantTime\Encoding;
+use ParagonIE\ConstantTime\Encoding;
// possibly (if applicable):
// require 'vendor/autoload.php';
@@ -63,8 +63,8 @@ If you only need a particular variant, you can just reference the
required class like so:
```php
-use \ParagonIE\ConstantTime\Base64;
-use \ParagonIE\ConstantTime\Base32;
+use ParagonIE\ConstantTime\Base64;
+use ParagonIE\ConstantTime\Base32;
$data = random_bytes(32);
echo Base64::encode($data), "\n";
diff --git a/vendor/paragonie/constant_time_encoding/composer.json b/vendor/paragonie/constant_time_encoding/composer.json
index 583fe366f..2fe9717ad 100644
--- a/vendor/paragonie/constant_time_encoding/composer.json
+++ b/vendor/paragonie/constant_time_encoding/composer.json
@@ -47,5 +47,10 @@
"psr-4": {
"ParagonIE\\ConstantTime\\": "src/"
}
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\Tests\\": "tests/"
+ }
}
}
diff --git a/vendor/paragonie/constant_time_encoding/phpunit.xml.dist b/vendor/paragonie/constant_time_encoding/phpunit.xml.dist
deleted file mode 100644
index 4d090343e..000000000
--- a/vendor/paragonie/constant_time_encoding/phpunit.xml.dist
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" backupGlobals="true" backupStaticAttributes="false" bootstrap="vendor/autoload.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnError="false" stopOnFailure="false" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
- <coverage processUncoveredFiles="true">
- <include>
- <directory suffix=".php">./src</directory>
- </include>
- </coverage>
- <testsuites>
- <testsuite name="Constant Time Encoding Test Suite">
- <directory suffix="Test.php">./tests</directory>
- </testsuite>
- </testsuites>
-</phpunit>
diff --git a/vendor/paragonie/constant_time_encoding/psalm.xml b/vendor/paragonie/constant_time_encoding/psalm.xml
deleted file mode 100644
index 0a17264b0..000000000
--- a/vendor/paragonie/constant_time_encoding/psalm.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<psalm
- useDocblockTypes="true"
- totallyTyped="true"
->
- <projectFiles>
- <directory name="src" />
- </projectFiles>
-</psalm>
diff --git a/vendor/paragonie/constant_time_encoding/src/Base32.php b/vendor/paragonie/constant_time_encoding/src/Base32.php
index 7784bafbf..7508b3df6 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base32.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base32.php
@@ -2,8 +2,12 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use InvalidArgumentException;
+use RangeException;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -60,20 +64,20 @@ abstract class Base32 implements EncoderInterface
/**
* Encode into Base32 (RFC 4648)
*
- * @param string $src
+ * @param string $binString
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
- public static function encode(string $src): string
+ public static function encode(string $binString): string
{
- return static::doEncode($src, false, true);
+ return static::doEncode($binString, false, true);
}
/**
* Encode into Base32 (RFC 4648)
*
* @param string $src
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function encodeUnpadded(string $src): string
{
@@ -85,7 +89,7 @@ abstract class Base32 implements EncoderInterface
*
* @param string $src
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function encodeUpper(string $src): string
{
@@ -97,7 +101,7 @@ abstract class Base32 implements EncoderInterface
*
* @param string $src
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function encodeUpperUnpadded(string $src): string
{
@@ -182,6 +186,32 @@ abstract class Base32 implements EncoderInterface
return \pack('C', $src + $diff);
}
+ /**
+ * @param string $encodedString
+ * @param bool $upper
+ * @return string
+ */
+ public static function decodeNoPadding(string $encodedString, bool $upper = false): string
+ {
+ $srcLen = Binary::safeStrlen($encodedString);
+ if ($srcLen === 0) {
+ return '';
+ }
+ if (($srcLen & 7) === 0) {
+ for ($j = 0; $j < 7 && $j < $srcLen; ++$j) {
+ if ($encodedString[$srcLen - $j - 1] === '=') {
+ throw new InvalidArgumentException(
+ "decodeNoPadding() doesn't tolerate padding"
+ );
+ }
+ }
+ }
+ return static::doDecode(
+ $encodedString,
+ $upper,
+ true
+ );
+ }
/**
* Base32 decoding
@@ -190,11 +220,15 @@ abstract class Base32 implements EncoderInterface
* @param bool $upper
* @param bool $strictPadding
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
* @psalm-suppress RedundantCondition
*/
- protected static function doDecode(string $src, bool $upper = false, bool $strictPadding = false): string
- {
+ protected static function doDecode(
+ string $src,
+ bool $upper = false,
+ bool $strictPadding = false
+ ): string {
// We do this to reduce code duplication:
$method = $upper
? 'decode5BitsUpper'
@@ -216,7 +250,7 @@ abstract class Base32 implements EncoderInterface
}
}
if (($srcLen & 7) === 1) {
- throw new \RangeException(
+ throw new RangeException(
'Incorrect padding'
);
}
@@ -287,6 +321,9 @@ abstract class Base32 implements EncoderInterface
(($c4 << 7) | ($c5 << 2) | ($c6 >> 3)) & 0xff
);
$err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6) >> 8;
+ if ($strictPadding) {
+ $err |= ($c6 << 5) & 0xff;
+ }
} elseif ($i + 5 < $srcLen) {
/** @var int $c1 */
$c1 = static::$method($chunk[2]);
@@ -324,6 +361,9 @@ abstract class Base32 implements EncoderInterface
(($c3 << 4) | ($c4 >> 1) ) & 0xff
);
$err |= ($c0 | $c1 | $c2 | $c3 | $c4) >> 8;
+ if ($strictPadding) {
+ $err |= ($c4 << 7) & 0xff;
+ }
} elseif ($i + 3 < $srcLen) {
/** @var int $c1 */
$c1 = static::$method($chunk[2]);
@@ -338,6 +378,9 @@ abstract class Base32 implements EncoderInterface
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff
);
$err |= ($c0 | $c1 | $c2 | $c3) >> 8;
+ if ($strictPadding) {
+ $err |= ($c3 << 4) & 0xff;
+ }
} elseif ($i + 2 < $srcLen) {
/** @var int $c1 */
$c1 = static::$method($chunk[2]);
@@ -350,6 +393,9 @@ abstract class Base32 implements EncoderInterface
(($c1 << 6) | ($c2 << 1) ) & 0xff
);
$err |= ($c0 | $c1 | $c2) >> 8;
+ if ($strictPadding) {
+ $err |= ($c2 << 6) & 0xff;
+ }
} elseif ($i + 1 < $srcLen) {
/** @var int $c1 */
$c1 = static::$method($chunk[2]);
@@ -359,6 +405,9 @@ abstract class Base32 implements EncoderInterface
(($c0 << 3) | ($c1 >> 2) ) & 0xff
);
$err |= ($c0 | $c1) >> 8;
+ if ($strictPadding) {
+ $err |= ($c1 << 6) & 0xff;
+ }
} else {
$dest .= \pack(
'C',
@@ -367,10 +416,9 @@ abstract class Base32 implements EncoderInterface
$err |= ($c0) >> 8;
}
}
- /** @var bool $check */
$check = ($err === 0);
if (!$check) {
- throw new \RangeException(
+ throw new RangeException(
'Base32::doDecode() only expects characters in the correct base32 alphabet'
);
}
@@ -384,7 +432,7 @@ abstract class Base32 implements EncoderInterface
* @param bool $upper
* @param bool $pad
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
protected static function doEncode(string $src, bool $upper = false, $pad = true): string
{
diff --git a/vendor/paragonie/constant_time_encoding/src/Base32Hex.php b/vendor/paragonie/constant_time_encoding/src/Base32Hex.php
index 68fdad52c..b868dd048 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base32Hex.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base32Hex.php
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace ParagonIE\ConstantTime;
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/vendor/paragonie/constant_time_encoding/src/Base64.php b/vendor/paragonie/constant_time_encoding/src/Base64.php
index 4739e4895..f5716179f 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base64.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base64.php
@@ -2,8 +2,12 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use InvalidArgumentException;
+use RangeException;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -38,13 +42,14 @@ abstract class Base64 implements EncoderInterface
*
* Base64 character set "[A-Z][a-z][0-9]+/"
*
- * @param string $src
+ * @param string $binString
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
- public static function encode(string $src): string
+ public static function encode(string $binString): string
{
- return static::doEncode($src, true);
+ return static::doEncode($binString, true);
}
/**
@@ -54,7 +59,8 @@ abstract class Base64 implements EncoderInterface
*
* @param string $src
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function encodeUnpadded(string $src): string
{
@@ -65,7 +71,8 @@ abstract class Base64 implements EncoderInterface
* @param string $src
* @param bool $pad Include = padding?
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
protected static function doEncode(string $src, bool $pad = true): string
{
@@ -119,8 +126,9 @@ abstract class Base64 implements EncoderInterface
* @param string $encodedString
* @param bool $strictPadding
* @return string
- * @throws \RangeException
- * @throws \TypeError
+ *
+ * @throws RangeException
+ * @throws TypeError
* @psalm-suppress RedundantCondition
*/
public static function decode(string $encodedString, bool $strictPadding = false): string
@@ -141,12 +149,12 @@ abstract class Base64 implements EncoderInterface
}
}
if (($srcLen & 3) === 1) {
- throw new \RangeException(
+ throw new RangeException(
'Incorrect padding'
);
}
if ($encodedString[$srcLen - 1] === '=') {
- throw new \RangeException(
+ throw new RangeException(
'Incorrect padding'
);
}
@@ -189,6 +197,9 @@ abstract class Base64 implements EncoderInterface
((($c1 << 4) | ($c2 >> 2)) & 0xff)
);
$err |= ($c0 | $c1 | $c2) >> 8;
+ if ($strictPadding) {
+ $err |= ($c2 << 6) & 0xff;
+ }
} elseif ($i + 1 < $srcLen) {
$c1 = static::decode6Bits($chunk[2]);
$dest .= \pack(
@@ -196,14 +207,16 @@ abstract class Base64 implements EncoderInterface
((($c0 << 2) | ($c1 >> 4)) & 0xff)
);
$err |= ($c0 | $c1) >> 8;
- } elseif ($i < $srcLen && $strictPadding) {
+ if ($strictPadding) {
+ $err |= ($c1 << 4) & 0xff;
+ }
+ } elseif ($strictPadding) {
$err |= 1;
}
}
- /** @var bool $check */
$check = ($err === 0);
if (!$check) {
- throw new \RangeException(
+ throw new RangeException(
'Base64::decode() only expects characters in the correct base64 alphabet'
);
}
@@ -211,6 +224,36 @@ abstract class Base64 implements EncoderInterface
}
/**
+ * @param string $encodedString
+ * @return string
+ */
+ public static function decodeNoPadding(string $encodedString): string
+ {
+ $srcLen = Binary::safeStrlen($encodedString);
+ if ($srcLen === 0) {
+ return '';
+ }
+ if (($srcLen & 3) === 0) {
+ if ($encodedString[$srcLen - 1] === '=') {
+ throw new InvalidArgumentException(
+ "decodeNoPadding() doesn't tolerate padding"
+ );
+ }
+ if (($srcLen & 3) > 1) {
+ if ($encodedString[$srcLen - 2] === '=') {
+ throw new InvalidArgumentException(
+ "decodeNoPadding() doesn't tolerate padding"
+ );
+ }
+ }
+ }
+ return static::decode(
+ $encodedString,
+ true
+ );
+ }
+
+ /**
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
* into 8-bit integers.
*
diff --git a/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php b/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
index 8ad2e2bf1..5e98a8f79 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace ParagonIE\ConstantTime;
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php b/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
index dd1459e85..9780b14bb 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace ParagonIE\ConstantTime;
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php b/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
index 1a4107527..8192c63d5 100644
--- a/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
+++ b/vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace ParagonIE\ConstantTime;
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/vendor/paragonie/constant_time_encoding/src/Binary.php b/vendor/paragonie/constant_time_encoding/src/Binary.php
index 38dbc4e66..828f3e0f6 100644
--- a/vendor/paragonie/constant_time_encoding/src/Binary.php
+++ b/vendor/paragonie/constant_time_encoding/src/Binary.php
@@ -2,8 +2,10 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -46,6 +48,8 @@ abstract class Binary
public static function safeStrlen(string $str): int
{
if (\function_exists('mb_strlen')) {
+ // mb_strlen in PHP 7.x can return false.
+ /** @psalm-suppress RedundantCast */
return (int) \mb_strlen($str, '8bit');
} else {
return \strlen($str);
@@ -60,9 +64,10 @@ abstract class Binary
* @staticvar boolean $exists
* @param string $str
* @param int $start
- * @param int $length
+ * @param ?int $length
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function safeSubstr(
string $str,
diff --git a/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php b/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
index 7aeee55a8..9cafbf96c 100644
--- a/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
+++ b/vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
@@ -3,7 +3,7 @@ declare(strict_types=1);
namespace ParagonIE\ConstantTime;
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/vendor/paragonie/constant_time_encoding/src/Encoding.php b/vendor/paragonie/constant_time_encoding/src/Encoding.php
index 896a66841..8649f31fc 100644
--- a/vendor/paragonie/constant_time_encoding/src/Encoding.php
+++ b/vendor/paragonie/constant_time_encoding/src/Encoding.php
@@ -2,8 +2,10 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -36,7 +38,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32Encode(string $str): string
{
@@ -48,7 +50,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32EncodeUpper(string $str): string
{
@@ -60,7 +62,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32Decode(string $str): string
{
@@ -72,7 +74,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32DecodeUpper(string $str): string
{
@@ -84,7 +86,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32HexEncode(string $str): string
{
@@ -96,7 +98,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32HexEncodeUpper(string $str): string
{
@@ -108,7 +110,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32HexDecode(string $str): string
{
@@ -120,7 +122,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base32HexDecodeUpper(string $str): string
{
@@ -132,7 +134,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64Encode(string $str): string
{
@@ -144,7 +146,7 @@ abstract class Encoding
*
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64Decode(string $str): string
{
@@ -157,7 +159,7 @@ abstract class Encoding
* Base64 character set "./[A-Z][a-z][0-9]"
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64EncodeDotSlash(string $str): string
{
@@ -172,7 +174,7 @@ abstract class Encoding
* @param string $str
* @return string
* @throws \RangeException
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64DecodeDotSlash(string $str): string
{
@@ -185,7 +187,7 @@ abstract class Encoding
* Base64 character set "[.-9][A-Z][a-z]" or "./[0-9][A-Z][a-z]"
* @param string $str
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64EncodeDotSlashOrdered(string $str): string
{
@@ -200,7 +202,7 @@ abstract class Encoding
* @param string $str
* @return string
* @throws \RangeException
- * @throws \TypeError
+ * @throws TypeError
*/
public static function base64DecodeDotSlashOrdered(string $str): string
{
@@ -213,7 +215,7 @@ abstract class Encoding
*
* @param string $bin_string (raw binary)
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function hexEncode(string $bin_string): string
{
@@ -239,7 +241,7 @@ abstract class Encoding
*
* @param string $bin_string (raw binary)
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function hexEncodeUpper(string $bin_string): string
{
diff --git a/vendor/paragonie/constant_time_encoding/src/Hex.php b/vendor/paragonie/constant_time_encoding/src/Hex.php
index b1b05a098..a9e058cd3 100644
--- a/vendor/paragonie/constant_time_encoding/src/Hex.php
+++ b/vendor/paragonie/constant_time_encoding/src/Hex.php
@@ -2,8 +2,11 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use RangeException;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -37,22 +40,19 @@ abstract class Hex implements EncoderInterface
*
* @param string $binString (raw binary)
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function encode(string $binString): string
{
- /** @var string $hex */
$hex = '';
$len = Binary::safeStrlen($binString);
for ($i = 0; $i < $len; ++$i) {
/** @var array<int, int> $chunk */
- $chunk = \unpack('C', Binary::safeSubstr($binString, $i, 1));
- /** @var int $c */
+ $chunk = \unpack('C', $binString[$i]);
$c = $chunk[1] & 0xf;
- /** @var int $b */
$b = $chunk[1] >> 4;
- $hex .= pack(
+ $hex .= \pack(
'CC',
(87 + $b + ((($b - 10) >> 8) & ~38)),
(87 + $c + ((($c - 10) >> 8) & ~38))
@@ -67,24 +67,20 @@ abstract class Hex implements EncoderInterface
*
* @param string $binString (raw binary)
* @return string
- * @throws \TypeError
+ * @throws TypeError
*/
public static function encodeUpper(string $binString): string
{
- /** @var string $hex */
$hex = '';
- /** @var int $len */
$len = Binary::safeStrlen($binString);
for ($i = 0; $i < $len; ++$i) {
/** @var array<int, int> $chunk */
- $chunk = \unpack('C', Binary::safeSubstr($binString, $i, 2));
- /** @var int $c */
+ $chunk = \unpack('C', $binString[$i]);
$c = $chunk[1] & 0xf;
- /** @var int $b */
$b = $chunk[1] >> 4;
- $hex .= pack(
+ $hex .= \pack(
'CC',
(55 + $b + ((($b - 10) >> 8) & ~6)),
(55 + $c + ((($c - 10) >> 8) & ~6))
@@ -100,23 +96,20 @@ abstract class Hex implements EncoderInterface
* @param string $encodedString
* @param bool $strictPadding
* @return string (raw binary)
- * @throws \RangeException
+ * @throws RangeException
*/
- public static function decode(string $encodedString, bool $strictPadding = false): string
- {
- /** @var int $hex_pos */
+ public static function decode(
+ string $encodedString,
+ bool $strictPadding = false
+ ): string {
$hex_pos = 0;
- /** @var string $bin */
$bin = '';
- /** @var int $c_acc */
$c_acc = 0;
- /** @var int $hex_len */
$hex_len = Binary::safeStrlen($encodedString);
- /** @var int $state */
$state = 0;
if (($hex_len & 1) !== 0) {
if ($strictPadding) {
- throw new \RangeException(
+ throw new RangeException(
'Expected an even number of hexadecimal characters'
);
} else {
@@ -129,23 +122,17 @@ abstract class Hex implements EncoderInterface
$chunk = \unpack('C*', $encodedString);
while ($hex_pos < $hex_len) {
++$hex_pos;
- /** @var int $c */
$c = $chunk[$hex_pos];
- /** @var int $c_num */
$c_num = $c ^ 48;
- /** @var int $c_num0 */
$c_num0 = ($c_num - 10) >> 8;
- /** @var int $c_alpha */
$c_alpha = ($c & ~32) - 55;
- /** @var int $c_alpha0 */
$c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
if (($c_num0 | $c_alpha0) === 0) {
- throw new \RangeException(
+ throw new RangeException(
'Expected hexadecimal character'
);
}
- /** @var int $c_val */
$c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
if ($state === 0) {
$c_acc = $c_val * 16;
diff --git a/vendor/paragonie/constant_time_encoding/src/RFC4648.php b/vendor/paragonie/constant_time_encoding/src/RFC4648.php
index 492cad00e..f124d65bf 100644
--- a/vendor/paragonie/constant_time_encoding/src/RFC4648.php
+++ b/vendor/paragonie/constant_time_encoding/src/RFC4648.php
@@ -2,8 +2,10 @@
declare(strict_types=1);
namespace ParagonIE\ConstantTime;
+use TypeError;
+
/**
- * Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
+ * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -41,7 +43,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base64Encode(string $str): string
{
@@ -55,7 +58,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base64Decode(string $str): string
{
@@ -69,7 +73,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base64UrlSafeEncode(string $str): string
{
@@ -83,7 +88,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base64UrlSafeDecode(string $str): string
{
@@ -97,7 +103,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base32Encode(string $str): string
{
@@ -111,7 +118,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base32Decode(string $str): string
{
@@ -125,7 +133,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base32HexEncode(string $str): string
{
@@ -139,7 +148,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base32HexDecode(string $str): string
{
@@ -153,7 +163,8 @@ abstract class RFC4648
*
* @param string $str
* @return string
- * @throws \TypeError
+ *
+ * @throws TypeError
*/
public static function base16Encode(string $str): string
{
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php b/vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php
deleted file mode 100644
index ed19f336f..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base32HexTest.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base32Hex;
-
-class Base32HexTest extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base32Hex::encode()
- * @covers Base32Hex::decode()
- * @covers Base32Hex::encodeUpper()
- * @covers Base32Hex::decodeUpper()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base32Hex::encode($random);
- $this->assertSame(
- $random,
- Base32Hex::decode($enc)
- );
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $unpadded,
- Base32Hex::encodeUnpadded($random)
- );
- $this->assertSame(
- $random,
- Base32Hex::decode($unpadded)
- );
-
- $enc = Base32Hex::encodeUpper($random);
- $this->assertSame(
- $random,
- Base32Hex::decodeUpper($enc)
- ); $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $unpadded,
- Base32Hex::encodeUpperUnpadded($random)
- );
- $this->assertSame(
- $random,
- Base32Hex::decodeUpper($unpadded)
- );
- }
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base32Test.php b/vendor/paragonie/constant_time_encoding/tests/Base32Test.php
deleted file mode 100644
index 65e8e7c56..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base32Test.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base32;
-
-class Base32Test extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base32::encode()
- * @covers Base32::decode()
- * @covers Base32::encodeUpper()
- * @covers Base32::decodeUpper()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base32::encode($random);
- $this->assertSame(
- $random,
- Base32::decode($enc)
- );
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $unpadded,
- Base32::encodeUnpadded($random)
- );
- $this->assertSame(
- $random,
- Base32::decode($unpadded)
- );
-
- $enc = Base32::encodeUpper($random);
- $this->assertSame(
- $random,
- Base32::decodeUpper($enc)
- );
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $unpadded,
- Base32::encodeUpperUnpadded($random)
- );
- $this->assertSame(
- $random,
- Base32::decodeUpper($unpadded)
- );
- }
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php b/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php
deleted file mode 100644
index f7dc828b1..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashOrderedTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base64DotSlashOrdered;
-
-class Base64DotSlashOrderedTest extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base64DotSlashOrdered::encode()
- * @covers Base64DotSlashOrdered::decode()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base64DotSlashOrdered::encode($random);
- $this->assertSame(
- $random,
- Base64DotSlashOrdered::decode($enc)
- );
-
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $random,
- Base64DotSlashOrdered::decode($unpadded)
- );
- $this->assertSame(
- $random,
- Base64DotSlashOrdered::decode($unpadded)
- );
- }
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php b/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php
deleted file mode 100644
index 257a3d549..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base64DotSlashTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base64DotSlash;
-
-class Base64DotSlashTest extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base64DotSlash::encode()
- * @covers Base64DotSlash::decode()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base64DotSlash::encode($random);
- $this->assertSame(
- $random,
- Base64DotSlash::decode($enc)
- );
-
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $random,
- Base64DotSlash::decode($unpadded)
- );
- $this->assertSame(
- $random,
- Base64DotSlash::decode($unpadded)
- );
- }
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base64Test.php b/vendor/paragonie/constant_time_encoding/tests/Base64Test.php
deleted file mode 100644
index 16ab47da0..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base64Test.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base64;
-
-class Base64Test extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base64::encode()
- * @covers Base64::decode()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base64::encode($random);
- $this->assertSame(
- $random,
- Base64::decode($enc)
- );
- $this->assertSame(
- \base64_encode($random),
- $enc
- );
-
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $random,
- Base64::decode($unpadded)
- );
- $this->assertSame(
- $random,
- Base64::decode($unpadded)
- );
- }
- }
- $str = 'MIIFzzCCBLegAwIBAgIDAfdlMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNVBAYTAlBM' .
- 'MSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMSQwIgYDVQQ' .
- 'DDBtDT1BFIFNaQUZJUiAtIEt3YWxpZmlrb3dhbnkxFDASBgNVBAUTC05yIHdwaXN1Oi' .
- 'A2MB4XDTExMTEwOTA2MDAwMFoXDTEzMTEwOTA2MDAwMFowgdkxCzAJBgNVBAYTAlBMM' .
- 'RwwGgYDVQQKDBNVcnrEhWQgTWlhc3RhIEdkeW5pMRswGQYDVQQFExJQRVNFTDogNjEw' .
- 'NjA2MDMxMTgxGTAXBgNVBAMMEEplcnp5IFByemV3b3Jza2kxTzBNBgNVBBAwRgwiQWw' .
- 'uIE1hcnN6YcWCa2EgUGnFgnN1ZHNraWVnbyA1Mi81NAwNODEtMzgyIEdkeW5pYQwGUG' .
- '9sc2thDAlwb21vcnNraWUxDjAMBgNVBCoMBUplcnp5MRMwEQYDVQQEDApQcnpld29yc' .
- '2tpMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMm5vjGqHPthJCMqKpqssSISRo' .
- 's0PYDTcEQzyyurfX67EJWKtZj6HNwuDMEGJ02iBNZfjUl7r8dIi28bSKhNlsfycXZKY' .
- 'RcIjp0+r5RqtR2auo9GQ6veKb61DEAGIqaR+uLLcJVTHCu0w9oXLGbRlGth5eNoj03C' .
- 'xXVAH2IfhbNwIDAQABo4IChzCCAoMwDAYDVR0TAQH/BAIwADCCAUgGA1UdIAEB/wSCA' .
- 'TwwggE4MIIBNAYJKoRoAYb3IwEBMIIBJTCB3QYIKwYBBQUHAgIwgdAMgc1EZWtsYXJh' .
- 'Y2phIHRhIGplc3Qgb8Wbd2lhZGN6ZW5pZW0gd3lkYXdjeSwgxbxlIHRlbiBjZXJ0eWZ' .
- 'pa2F0IHpvc3RhxYIgd3lkYW55IGpha28gY2VydHlmaWthdCBrd2FsaWZpa293YW55IH' .
- 'pnb2RuaWUgeiB3eW1hZ2FuaWFtaSB1c3Rhd3kgbyBwb2RwaXNpZSBlbGVrdHJvbmlje' .
- 'm55bSBvcmF6IHRvd2FyenlzesSFY3ltaSBqZWogcm96cG9yesSFZHplbmlhbWkuMEMG' .
- 'CCsGAQUFBwIBFjdodHRwOi8vd3d3Lmtpci5jb20ucGwvY2VydHlmaWthY2phX2tsdWN' .
- '6eS9wb2xpdHlrYS5odG1sMAkGA1UdCQQCMAAwIQYDVR0RBBowGIEWai5wcnpld29yc2' .
- 'tpQGdkeW5pYS5wbDAOBgNVHQ8BAf8EBAMCBkAwgZ4GA1UdIwSBljCBk4AU3TGldJXip' .
- 'N4oGS3ZYmnBDMFs8gKhd6R1MHMxCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dh' .
- 'IEl6YmEgUm96bGljemVuaW93YSBTLkEuMSQwIgYDVQQDDBtDT1BFIFNaQUZJUiAtIEt' .
- '3YWxpZmlrb3dhbnkxFDASBgNVBAUTC05yIHdwaXN1OiA2ggJb9jBIBgNVHR8EQTA/MD' .
- '2gO6A5hjdodHRwOi8vd3d3Lmtpci5jb20ucGwvY2VydHlmaWthY2phX2tsdWN6eS9DU' .
- 'kxfT1pLMzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQBYPIqnAreyeql7/opJjcar/qWZ' .
- 'y9ruhB2q0lZFsJOhwgMnbQXzp/4vv93YJqcHGAXdHP6EO8FQX47mjo2ZKQmi+cIHJHL' .
- 'ONdX/3Im+M17V0iNAh7Z1lOSfTRT+iiwe/F8phcEaD5q2RmvYusR7zXZq/cLL0If0hX' .
- 'oPZ/EHQxjN8pxzxiUx6bJAgturnIMEfRNesxwghdr1dkUjOhGLf3kHVzgM6j3VAM7oF' .
- 'mMUb5y5s96Bzl10DodWitjOEH0vvnIcsppSxH1C1dCAi0o9f/1y2XuLNhBNHMAyTqpY' .
- 'PX8Yvav1c+Z50OMaSXHAnTa20zv8UtiHbaAhwlifCelUMj93S';
-
- try {
- Base64::decode($str, true);
- $this->fail('Strict padding not enforced');
- } catch (\Exception $ex) {
-
- $this->assertSame(
- Base64::decode($str),
- \base64_decode($str)
- );
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php b/vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php
deleted file mode 100644
index 136ed611c..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/Base64UrlSafeTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-use ParagonIE\ConstantTime\Base64UrlSafe;
-use ParagonIE\ConstantTime\Binary;
-
-/**
- * Class Base64UrlSafeTest
- */
-class Base64UrlSafeTest extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Base64UrlSafe::encode()
- * @covers Base64UrlSafe::decode()
- *
- * @throws Exception
- * @throws TypeError
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Base64UrlSafe::encode($random);
- $this->assertSame(
- $random,
- Base64UrlSafe::decode($enc)
- );
- $this->assertSame(
- \strtr(\base64_encode($random), '+/', '-_'),
- $enc
- );
-
- $unpadded = \rtrim($enc, '=');
- $this->assertSame(
- $unpadded,
- Base64UrlSafe::encodeUnpadded($random)
- );
- $this->assertSame(
- $random,
- Base64UrlSafe::decode($unpadded)
- );
- }
- }
-
- $random = \random_bytes(1 << 20);
- $enc = Base64UrlSafe::encode($random);
- $this->assertTrue(Binary::safeStrlen($enc) > 65536);
- $this->assertSame(
- $random,
- Base64UrlSafe::decode($enc)
- );
- $this->assertSame(
- \strtr(\base64_encode($random), '+/', '-_'),
- $enc
- );
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/EncodingTest.php b/vendor/paragonie/constant_time_encoding/tests/EncodingTest.php
deleted file mode 100644
index 6f774d8c0..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/EncodingTest.php
+++ /dev/null
@@ -1,307 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base32;
-use \ParagonIE\ConstantTime\Base32Hex;
-use \ParagonIE\ConstantTime\Base64;
-use \ParagonIE\ConstantTime\Base64DotSlash;
-use \ParagonIE\ConstantTime\Base64DotSlashOrdered;
-use \ParagonIE\ConstantTime\Base64UrlSafe;
-use \ParagonIE\ConstantTime\Encoding;
-use \ParagonIE\ConstantTime\Hex;
-
-class EncodingTest extends PHPUnit\Framework\TestCase
-{
- public function testBase32Encode()
- {
- $this->assertSame(
- Encoding::base32Encode("\x00"),
- 'aa======'
- );
- $this->assertSame(
- Encoding::base32Encode("\x00\x00"),
- 'aaaa===='
- );
- $this->assertSame(
- Encoding::base32Encode("\x00\x00\x00"),
- 'aaaaa==='
- );
- $this->assertSame(
- Encoding::base32Encode("\x00\x00\x00\x00"),
- 'aaaaaaa='
- );
- $this->assertSame(
- Encoding::base32Encode("\x00\x00\x00\x00\x00"),
- 'aaaaaaaa'
- );
- $this->assertSame(
- Encoding::base32Encode("\x00\x00\x0F\xFF\xFF"),
- 'aaaa7777'
- );
- $this->assertSame(
- Encoding::base32Encode("\xFF\xFF\xF0\x00\x00"),
- '7777aaaa'
- );
-
- $this->assertSame(
- Encoding::base32Encode("\xce\x73\x9c\xe7\x39"),
- 'zzzzzzzz'
- );
- $this->assertSame(
- Encoding::base32Encode("\xd6\xb5\xad\x6b\x5a"),
- '22222222'
- );
- $this->assertSame(
- Base32::encodeUpper("\x00"),
- 'AA======'
- );
- $this->assertSame(
- Base32::encodeUpper("\x00\x00"),
- 'AAAA===='
- );
- $this->assertSame(
- Base32::encodeUpper("\x00\x00\x00"),
- 'AAAAA==='
- );
- $this->assertSame(
- Base32::encodeUpper("\x00\x00\x00\x00"),
- 'AAAAAAA='
- );
- $this->assertSame(
- Base32::encodeUpper("\x00\x00\x00\x00\x00"),
- 'AAAAAAAA'
- );
- $this->assertSame(
- Base32::encodeUpper("\x00\x00\x0F\xFF\xFF"),
- 'AAAA7777'
- );
- $this->assertSame(
- Base32::encodeUpper("\xFF\xFF\xF0\x00\x00"),
- '7777AAAA'
- );
-
- $this->assertSame(
- Base32::encodeUpper("\xce\x73\x9c\xe7\x39"),
- 'ZZZZZZZZ'
- );
- $this->assertSame(
- Base32::encodeUpper("\xd6\xb5\xad\x6b\x5a"),
- '22222222'
- );
- }
-
- public function testBase32Hex()
- {
- $this->assertSame(
- Base32Hex::encode("\x00"),
- '00======'
- );
- $this->assertSame(
- Base32Hex::encode("\x00\x00"),
- '0000===='
- );
- $this->assertSame(
- Base32Hex::encode("\x00\x00\x00"),
- '00000==='
- );
- $this->assertSame(
- Base32Hex::encode("\x00\x00\x00\x00"),
- '0000000='
- );
- $this->assertSame(
- Base32Hex::encode("\x00\x00\x00\x00\x00"),
- '00000000'
- );
- $this->assertSame(
- Base32Hex::encode("\x00\x00\x0F\xFF\xFF"),
- '0000vvvv'
- );
- $this->assertSame(
- Base32Hex::encode("\xFF\xFF\xF0\x00\x00"),
- 'vvvv0000'
- );
-
-
- }
-
- /**
- * Based on test vectors from RFC 4648
- */
- public function testBase32Decode()
- {
- $this->assertSame(
- "\x00\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaaaa======')
- );
- $this->assertSame(
- "\x00\x00\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaaaaaa====')
- );
- $this->assertSame(
- "\x00\x00\x00\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaaaaaaa===')
- );
- $this->assertSame(
- "\x00\x00\x00\x00\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaaaaaaaaa=')
- );
- $this->assertSame(
- "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaaaaaaaaaa')
- );
- $this->assertSame(
- "\x00",
- Encoding::base32Decode('aa======')
- );
- $this->assertSame(
- "\x00\x00",
- Encoding::base32Decode('aaaa====')
- );
- $this->assertSame(
- "\x00\x00\x00",
- Encoding::base32Decode('aaaaa===')
- );
- $this->assertSame(
- "\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaa=')
- );
- $this->assertSame(
- "\x00\x00\x00\x00\x00",
- Encoding::base32Decode('aaaaaaaa')
- );
- $this->assertSame(
- "\x00\x00\x0F\xFF\xFF",
- Encoding::base32Decode('aaaa7777')
- );
- $this->assertSame(
- "\xFF\xFF\xF0\x00\x00",
- Encoding::base32Decode('7777aaaa')
- );
- $this->assertSame(
- "\xce\x73\x9c\xe7\x39",
- Encoding::base32Decode('zzzzzzzz')
- );
- $this->assertSame(
- "\xd6\xb5\xad\x6b\x5a",
- Encoding::base32Decode('22222222')
- );
- $this->assertSame(
- 'foobar',
- Encoding::base32Decode('mzxw6ytboi======')
- );
-
- $rand = random_bytes(9);
- $enc = Encoding::base32Encode($rand);
-
- $this->assertSame(
- Encoding::base32Encode($rand),
- Encoding::base32Encode(Encoding::base32Decode($enc))
- );
- $this->assertSame(
- $rand,
- Encoding::base32Decode($enc)
- );
- }
-
- /**
- * @covers Encoding::hexDecode()
- * @covers Encoding::hexEncode()
- * @covers Encoding::base32Decode()
- * @covers Encoding::base32Encode()
- * @covers Encoding::base64Decode()
- * @covers Encoding::base64Encode()
- * @covers Encoding::base64DotSlashDecode()
- * @covers Encoding::base64DotSlashEncode()
- * @covers Encoding::base64DotSlashOrderedDecode()
- * @covers Encoding::base64DotSlashOrderedEncode()
- */
- public function testBasicEncoding()
- {
- // Re-run the test at least 3 times for each length
- for ($j = 0; $j < 3; ++$j) {
- for ($i = 1; $i < 84; ++$i) {
- $rand = random_bytes($i);
- $enc = Encoding::hexEncode($rand);
- $this->assertSame(
- \bin2hex($rand),
- $enc,
- "Hex Encoding - Length: " . $i
- );
- $this->assertSame(
- $rand,
- Encoding::hexDecode($enc),
- "Hex Encoding - Length: " . $i
- );
-
- // Uppercase variant:
- $enc = Hex::encodeUpper($rand);
- $this->assertSame(
- \strtoupper(\bin2hex($rand)),
- $enc,
- "Hex Encoding - Length: " . $i
- );
- $this->assertSame(
- $rand,
- Hex::decode($enc),
- "HexUpper Encoding - Length: " . $i
- );
-
- $enc = Encoding::base32Encode($rand);
- $this->assertSame(
- $rand,
- Encoding::base32Decode($enc),
- "Base32 Encoding - Length: " . $i
- );
-
- $enc = Encoding::base32EncodeUpper($rand);
- $this->assertSame(
- $rand,
- Encoding::base32DecodeUpper($enc),
- "Base32Upper Encoding - Length: " . $i
- );
-
- $enc = Encoding::base32HexEncode($rand);
- $this->assertSame(
- bin2hex($rand),
- bin2hex(Encoding::base32HexDecode($enc)),
- "Base32Hex Encoding - Length: " . $i
- );
-
- $enc = Encoding::base32HexEncodeUpper($rand);
- $this->assertSame(
- bin2hex($rand),
- bin2hex(Encoding::base32HexDecodeUpper($enc)),
- "Base32HexUpper Encoding - Length: " . $i
- );
-
- $enc = Encoding::base64Encode($rand);
- $this->assertSame(
- $rand,
- Encoding::base64Decode($enc),
- "Base64 Encoding - Length: " . $i
- );
-
- $enc = Encoding::base64EncodeDotSlash($rand);
- $this->assertSame(
- $rand,
- Encoding::base64DecodeDotSlash($enc),
- "Base64 DotSlash Encoding - Length: " . $i
- );
- $enc = Encoding::base64EncodeDotSlashOrdered($rand);
- $this->assertSame(
- $rand,
- Encoding::base64DecodeDotSlashOrdered($enc),
- "Base64 Ordered DotSlash Encoding - Length: " . $i
- );
-
- $enc = Base64UrlSafe::encode($rand);
- $this->assertSame(
- \strtr(\base64_encode($rand), '+/', '-_'),
- $enc
- );
- $this->assertSame(
- $rand,
- Base64UrlSafe::decode($enc)
- );
- }
- }
- }
-} \ No newline at end of file
diff --git a/vendor/paragonie/constant_time_encoding/tests/HexTest.php b/vendor/paragonie/constant_time_encoding/tests/HexTest.php
deleted file mode 100644
index 5c31f6d15..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/HexTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Hex;
-
-class HexTest extends PHPUnit\Framework\TestCase
-{
- /**
- * @covers Hex::encode()
- * @covers Hex::decode()
- * @covers Hex::encodeUpper()
- */
- public function testRandom()
- {
- for ($i = 1; $i < 32; ++$i) {
- for ($j = 0; $j < 50; ++$j) {
- $random = \random_bytes($i);
-
- $enc = Hex::encode($random);
- $this->assertSame(
- $random,
- Hex::decode($enc)
- );
- $this->assertSame(
- \bin2hex($random),
- $enc
- );
-
- $enc = Hex::encodeUpper($random);
- $this->assertSame(
- $random,
- Hex::decode($enc)
- );
- $this->assertSame(
- \strtoupper(\bin2hex($random)),
- $enc
- );
- }
- }
- }
-}
diff --git a/vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php b/vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php
deleted file mode 100644
index a6653de88..000000000
--- a/vendor/paragonie/constant_time_encoding/tests/RFC4648Test.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-use \ParagonIE\ConstantTime\Base32;
-use \ParagonIE\ConstantTime\Base32Hex;
-use \ParagonIE\ConstantTime\Base64;
-use \ParagonIE\ConstantTime\Base64DotSlash;
-use \ParagonIE\ConstantTime\Base64DotSlashOrdered;
-use \ParagonIE\ConstantTime\Encoding;
-use \ParagonIE\ConstantTime\Hex;
-
-/**
- * Class RFC4648Test
- *
- * @ref https://tools.ietf.org/html/rfc4648#section-10
- */
-class RFC4648Test extends PHPUnit\Framework\TestCase
-{
- public function testVectorBase64()
- {
- $this->assertSame(Base64::encode(''), '');
- $this->assertSame(Base64::encode('f'), 'Zg==');
- $this->assertSame(Base64::encode('fo'), 'Zm8=');
- $this->assertSame(Base64::encode('foo'), 'Zm9v');
- $this->assertSame(Base64::encode('foob'), 'Zm9vYg==');
- $this->assertSame(Base64::encode('fooba'), 'Zm9vYmE=');
- $this->assertSame(Base64::encode('foobar'), 'Zm9vYmFy');
- }
-
- public function testVectorBase32()
- {
- $this->assertSame(Base32::encode(''), '');
- $this->assertSame(Base32::encode('f'), 'my======');
- $this->assertSame(Base32::encode('fo'), 'mzxq====');
- $this->assertSame(Base32::encode('foo'), 'mzxw6===');
- $this->assertSame(Base32::encode('foob'), 'mzxw6yq=');
- $this->assertSame(Base32::encode('fooba'), 'mzxw6ytb');
- $this->assertSame(Base32::encode('foobar'), 'mzxw6ytboi======');
-
- $this->assertSame(Base32::encodeUpper(''), '');
- $this->assertSame(Base32::encodeUpper('f'), 'MY======');
- $this->assertSame(Base32::encodeUpper('fo'), 'MZXQ====');
- $this->assertSame(Base32::encodeUpper('foo'), 'MZXW6===');
- $this->assertSame(Base32::encodeUpper('foob'), 'MZXW6YQ=');
- $this->assertSame(Base32::encodeUpper('fooba'), 'MZXW6YTB');
- $this->assertSame(Base32::encodeUpper('foobar'), 'MZXW6YTBOI======');
- }
-
- public function testVectorBase32Hex()
- {
- $this->assertSame(Base32Hex::encode(''), '');
- $this->assertSame(Base32Hex::encode('f'), 'co======');
- $this->assertSame(Base32Hex::encode('fo'), 'cpng====');
- $this->assertSame(Base32Hex::encode('foo'), 'cpnmu===');
- $this->assertSame(Base32Hex::encode('foob'), 'cpnmuog=');
- $this->assertSame(Base32Hex::encode('fooba'), 'cpnmuoj1');
- $this->assertSame(Base32Hex::encode('foobar'), 'cpnmuoj1e8======');
-
- $this->assertSame(Base32Hex::encodeUpper(''), '');
- $this->assertSame(Base32Hex::encodeUpper('f'), 'CO======');
- $this->assertSame(Base32Hex::encodeUpper('fo'), 'CPNG====');
- $this->assertSame(Base32Hex::encodeUpper('foo'), 'CPNMU===');
- $this->assertSame(Base32Hex::encodeUpper('foob'), 'CPNMUOG=');
- $this->assertSame(Base32Hex::encodeUpper('fooba'), 'CPNMUOJ1');
- $this->assertSame(Base32Hex::encodeUpper('foobar'), 'CPNMUOJ1E8======');
- }
-
- public function testVectorBase16()
- {
- $this->assertSame(Hex::encode(''), '');
- $this->assertSame(Hex::encode('f'), '66');
- $this->assertSame(Hex::encode('fo'), '666f');
- $this->assertSame(Hex::encode('foo'), '666f6f');
- $this->assertSame(Hex::encode('foob'), '666f6f62');
- $this->assertSame(Hex::encode('fooba'), '666f6f6261');
- $this->assertSame(Hex::encode('foobar'), '666f6f626172');
-
- $this->assertSame(Hex::encodeUpper(''), '');
- $this->assertSame(Hex::encodeUpper('f'), '66');
- $this->assertSame(Hex::encodeUpper('fo'), '666F');
- $this->assertSame(Hex::encodeUpper('foo'), '666F6F');
- $this->assertSame(Hex::encodeUpper('foob'), '666F6F62');
- $this->assertSame(Hex::encodeUpper('fooba'), '666F6F6261');
- $this->assertSame(Hex::encodeUpper('foobar'), '666F6F626172');
- }
-}
diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
index 0c9a73cb3..ca360266d 100644
--- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
+++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
@@ -550,7 +550,7 @@ final class TypeResolver
);
}
- if (!$minValue || !$maxValue || $tokenCounter > 4) {
+ if ($minValue === null || $maxValue === null || $tokenCounter > 4) {
throw new RuntimeException(
'int<min,max> has not the correct format'
);
diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md
index e4953b4a4..a1e47fdb9 100644
--- a/vendor/phpstan/phpstan/README.md
+++ b/vendor/phpstan/phpstan/README.md
@@ -5,7 +5,7 @@
</p>
<p align="center">
- <a href="https://github.com/phpstan/phpstan/actions"><img src="https://github.com/phpstan/phpstan/workflows/Build/badge.svg" alt="Build Status"></a>
+ <a href="https://github.com/phpstan/phpstan/actions"><img src="https://github.com/phpstan/phpstan/workflows/Tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/phpstan/phpstan"><img src="https://poser.pugx.org/phpstan/phpstan/v/stable" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/phpstan/phpstan/stats"><img src="https://poser.pugx.org/phpstan/phpstan/downloads" alt="Total Downloads"></a>
<a href="https://choosealicense.com/licenses/mit/"><img src="https://poser.pugx.org/phpstan/phpstan/license" alt="License"></a>
@@ -26,13 +26,13 @@ can be checked before you run the actual line.
<a href="https://coders.thecodingmachine.com/phpstan"><img src="https://i.imgur.com/kQhNOTP.png" alt="TheCodingMachine" width="247" height="64"></a>
&nbsp;&nbsp;&nbsp;
-<a href="https://packagist.com/?utm_source=phpstan&utm_medium=readme&utm_campaign=sponsorlogo"><img src="https://i.imgur.com/PmMC45f.png" alt="Private Packagist" width="326" height="64"></a>
+<a href="https://packagist.com/?utm_source=phpstan&utm_medium=readme&utm_campaign=sponsorlogo"><img src="https://i.imgur.com/B2T63Do.png" alt="Private Packagist" width="283" height="64"></a>
<br>
<a href="https://careers.tuigroup.com/jobs/"><img src="https://i.imgur.com/uw5rAlR.png" alt="Musement" width="247" height="49"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://blackfire.io/docs/introduction?utm_source=phpstan&utm_medium=github_readme&utm_campaign=logo"><img src="https://i.imgur.com/zR8rsqk.png" alt="Blackfire.io" width="254" height="64"></a>
<br>
-<a href="https://www.intracto.com/"><img src="https://i.imgur.com/XRCDGZi.png" alt="Intracto" width="254" height="65"></a>
+<a href="https://www.iodigital.com/"><img src="https://i.imgur.com/fJlw1n9.png" alt="iO" width="254" height="65"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://jobs.ticketswap.com/"><img src="https://i.imgur.com/lhzcutK.png" alt="TicketSwap" width="269" height="64"></a>
<br>
@@ -40,9 +40,9 @@ can be checked before you run the actual line.
&nbsp;&nbsp;&nbsp;
<a href="https://togetter.com/"><img src="https://i.imgur.com/x9n5cj3.png" alt="Togetter" width="283" height="64"></a>
<br>
-<a href="https://join.rightcapital.com/?utm_source=phpstan&utm_medium=github&utm_campaign=sponsorship"><img src="https://i.imgur.com/EuIgI08.png" alt="RightCapital" width="283" height="64"></a>
+<a href="https://join.rightcapital.com/?utm_source=phpstan&utm_medium=github&utm_campaign=sponsorship"><img src="https://i.imgur.com/1AhB5tW.png" alt="RightCapital" width="283" height="64"></a>
&nbsp;&nbsp;&nbsp;
-<a href="https://www.contentkingapp.com/?ref=php-developer&utm_source=phpstan&utm_medium=referral&utm_campaign=sponsorship"><img src="https://i.imgur.com/0blm7ki.png" alt="ContentKing" width="283" height="64"></a>
+<a href="https://www.contentkingapp.com/?ref=php-developer&utm_source=phpstan&utm_medium=referral&utm_campaign=sponsorship"><img src="https://i.imgur.com/HHhbPGN.png" alt="ContentKing" width="283" height="64"></a>
<br>
<a href="https://zol.fr?utm_source=phpstan"><img src="https://i.imgur.com/dzDgd4s.png" alt="ZOL" width="283" height="64"></a>
&nbsp;&nbsp;&nbsp;
@@ -53,6 +53,14 @@ can be checked before you run the actual line.
<a href="https://craftcms.com/"><img src="https://i.imgur.com/xJWThke.png" alt="Craft CMS" width="283" height="64"></a>
<br>
<a href="https://www.worksome.com/"><img src="https://i.imgur.com/TQKSwOl.png" alt="Worksome" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://www.campoint.net/"><img src="https://i.imgur.com/fR6eMUm.png" alt="campoint AG" width="283" height="64"></a>
+<br>
+<a href="https://www.crisp.nl/"><img src="https://i.imgur.com/jRJyPve.png" alt="Crisp.nl" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://inviqa.com/"><img src="https://i.imgur.com/G99rj45.png" alt="Inviqa" width="254" height="65"></a>
+<br>
+<a href="https://www.psyonix.com/"><img src="https://i.imgur.com/p8svxQZ.png" alt="Psyonix" width="254" height="65"></a>
[**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes)
@@ -69,6 +77,7 @@ All the documentation lives on the [phpstan.org website](https://phpstan.org/):
* [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types)
* [Extension Library](https://phpstan.org/user-guide/extension-library)
* [Developing Extensions](https://phpstan.org/developing-extensions/extension-types)
+* [API Reference](https://apiref.phpstan.org/)
## PHPStan Pro
diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json
index 2c9e27962..498cc3816 100644
--- a/vendor/phpstan/phpstan/composer.json
+++ b/vendor/phpstan/phpstan/composer.json
@@ -3,7 +3,7 @@
"description": "PHPStan - PHP Static Analysis Tool",
"license": ["MIT"],
"require": {
- "php": "^7.1|^8.0"
+ "php": "^7.2|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
@@ -12,11 +12,6 @@
"phpstan",
"phpstan.phar"
],
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
"autoload": {
"files": ["bootstrap.php"]
}
diff --git a/vendor/phpstan/phpstan/phpstan b/vendor/phpstan/phpstan/phpstan
index 7a08ef485..7a08ef485 100644..100755
--- a/vendor/phpstan/phpstan/phpstan
+++ b/vendor/phpstan/phpstan/phpstan
diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar
index 306020e3a..d2a91a0d5 100644..100755
--- a/vendor/phpstan/phpstan/phpstan.phar
+++ b/vendor/phpstan/phpstan/phpstan.phar
Binary files differ
diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc
index 9110c4aa3..d6e96fbf5 100644
--- a/vendor/phpstan/phpstan/phpstan.phar.asc
+++ b/vendor/phpstan/phpstan/phpstan.phar.asc
@@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE-----
-iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmGKbGQACgkQzxoQjQ56
-5yAy7BAAgT9+V81RuOMz6F16uqm4gXH1ebioWokEvVb6ZR2fk7p3/m14STmmRkwe
-MIkxzWKtx/wSC6VafqAtkBPNxpo2j5QU0pmfMAvkPHh79d2lWmUaJmF71I/DCNnh
-pcZNJLe5x+YTDKU6NnwMlyZEvdaWmyJ2MCf2apBZIJ7axefEJRVVin2pshhXwbtN
-dHhrT9yFYe/vqOkOLtGDWw+yT1I6he7IpoYZUTyO9b7eadC0ga6Bet7jibNL8JBE
-cGcB2MFg9bvif0PgIOio0jQXAWjf0ZBXPvoOwTRCqq/UOPTL8SRtiflAFiFOAzk/
-FRQVC0+26NsGx7R8kS5FZNOHYTIElY1ElyzFk8HWgqrYIvzDNLtkJ68178rDJ29f
-GyAax4P+gN13biyXQycQHhXDfHN1UytopldiRkitXVFGq92sz6BFgQDLF9yxQOm1
-iL5oxWSVf6rM8AOc3DV9Aa1kCpG6FrZPJ66NBgJLzTpKARzt7CM+M8VQNA/KnHB3
-8Mt0WmAeRORSnBWQksOlnA4VUkxWDGkZGVBWMRist7gghfG7n7HxTAUAk1oo7j2b
-/gTwbeOjv/330uZG31e+hCcaj/EcocHvglegWCPMmIhpXqn25TC+87QkGt2wb6z6
-dpzTdy3Pimr5BK2YrN1+Le33CYeHKlc+6XL34BEVebAQ/A9OB/M=
-=k3NZ
+iQIzBAABCgAdFiEE0yaA1ZV9xxFr4pwUzxoQjQ565yAFAmLX0XwACgkQzxoQjQ56
+5yAmDw/+KPoaY+vsYXrYjbNcYmXyH+9ca8Yl1WkgqMOAAiojQBAdN+PIeXqdM4P1
+ODJq7SGPqhR5j9dK3k4wxvTkmAVlFHWCbOQS0eCueoV2s0w0Sg9xkut7zTMwwBTp
+I+0TbU9W7DdnDk6k6xoNCNhT8OYpMElmwhS9nChoY2+cwdWJNZ0Lr5JeXwvb5R7W
+YnHUqO/zTIAjwJNdKwb27J9szwL3GQ4nB9gSoKXCFQTIONszfMYNwboy3VlD8m/F
+irh9ZZeZsMlCpEO9Rsqx4QyOvbLy0D2jEOKNYzXPQea9dx9gQvDiWJrVETsQBwkc
+iWJ/HJVhs3ng7iyUfMr8VAPn7rf+3fSqYeQUs5Z5/ubqABF2ZI9/4DIPGsXtqH7q
+b5OTOvSucvRpsxudnJElKWhkCjZUyjYzBqGdZ6erCh+GTiM4uFNB/en/QObfHmP2
+z4D41Dk9peLxstqlrwoLL0sJCHR4fQZFvPKrQ6sKlTKliu1zBc0HcEqq3BFalKF+
+XO2PT1QVNXx/9IqOruKm+M5siY63VKDwE/DXJZZTUPz7GN/Cr9j5Jz3pjq8jL0CR
+e4D+sEu7xXzlJa7MFqg2odZhLTRYuM/DHZCj3cOyQGlYUQ+tZMGsAiix9JyO7XhB
+1jzEMugtAglPAsmHr0HR/+oz+YDgwQEmQA4VO4l0swCNmjzLITA=
+=LM6h
-----END PGP SIGNATURE-----
diff --git a/vendor/phpunit/phpunit/phpunit b/vendor/phpunit/phpunit/phpunit
index c80295668..c80295668 100644..100755
--- a/vendor/phpunit/phpunit/phpunit
+++ b/vendor/phpunit/phpunit/phpunit
diff --git a/vendor/sebastian/environment/ChangeLog.md b/vendor/sebastian/environment/ChangeLog.md
index 67daf0356..8943aee4c 100644
--- a/vendor/sebastian/environment/ChangeLog.md
+++ b/vendor/sebastian/environment/ChangeLog.md
@@ -2,6 +2,12 @@
All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
+## [5.1.4] - 2022-04-03
+
+### Fixed
+
+* [#63](https://github.com/sebastianbergmann/environment/pull/63): `Runtime::getCurrentSettings()` does not correctly process INI settings
+
## [5.1.3] - 2020-09-28
### Changed
@@ -145,6 +151,7 @@ All notable changes in `sebastianbergmann/environment` are documented in this fi
* This component is no longer supported on PHP 5.6
+[5.1.4]: https://github.com/sebastianbergmann/environment/compare/5.1.3...5.1.4
[5.1.3]: https://github.com/sebastianbergmann/environment/compare/5.1.2...5.1.3
[5.1.2]: https://github.com/sebastianbergmann/environment/compare/5.1.1...5.1.2
[5.1.1]: https://github.com/sebastianbergmann/environment/compare/5.1.0...5.1.1
diff --git a/vendor/sebastian/environment/LICENSE b/vendor/sebastian/environment/LICENSE
index c58093991..42546339c 100644
--- a/vendor/sebastian/environment/LICENSE
+++ b/vendor/sebastian/environment/LICENSE
@@ -1,6 +1,6 @@
sebastian/environment
-Copyright (c) 2014-2020, Sebastian Bergmann <[email protected]>.
+Copyright (c) 2014-2022, Sebastian Bergmann <[email protected]>.
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/vendor/sebastian/environment/README.md b/vendor/sebastian/environment/README.md
index 24a9831e4..1fead13ef 100644
--- a/vendor/sebastian/environment/README.md
+++ b/vendor/sebastian/environment/README.md
@@ -1,7 +1,6 @@
# sebastian/environment
[![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/environment.svg?style=flat-square)](https://packagist.org/packages/sebastian/environment)
-[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.1-8892BF.svg?style=flat-square)](https://php.net/)
[![CI Status](https://github.com/sebastianbergmann/environment/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/environment/actions)
[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/environment/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/environment)
diff --git a/vendor/sebastian/environment/src/Console.php b/vendor/sebastian/environment/src/Console.php
index c4a2348f0..e7fd1643f 100644
--- a/vendor/sebastian/environment/src/Console.php
+++ b/vendor/sebastian/environment/src/Console.php
@@ -34,7 +34,7 @@ final class Console
/**
* @var int
*/
- public const STDIN = 0;
+ public const STDIN = 0;
/**
* @var int
@@ -60,10 +60,10 @@ final class Console
if ($this->isWindows()) {
// @codeCoverageIgnoreStart
- return (defined('STDOUT') && function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT))
- || false !== getenv('ANSICON')
- || 'ON' === getenv('ConEmuANSI')
- || 'xterm' === getenv('TERM');
+ return (defined('STDOUT') && function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT)) ||
+ false !== getenv('ANSICON') ||
+ 'ON' === getenv('ConEmuANSI') ||
+ 'xterm' === getenv('TERM');
// @codeCoverageIgnoreEnd
}
diff --git a/vendor/sebastian/environment/src/Runtime.php b/vendor/sebastian/environment/src/Runtime.php
index 311aefcb6..d1b92d620 100644
--- a/vendor/sebastian/environment/src/Runtime.php
+++ b/vendor/sebastian/environment/src/Runtime.php
@@ -289,8 +289,12 @@ final class Runtime
foreach ($values as $value) {
$set = ini_get($value);
- if (isset($config[$value]) && $set != $config[$value]) {
- $diff[] = sprintf('%s=%s', $value, $set);
+ if (empty($set)) {
+ continue;
+ }
+
+ if ((!isset($config[$value]) || ($set !== $config[$value]))) {
+ $diff[$value] = sprintf('%s=%s', $value, $set);
}
}
}
diff --git a/vendor/spomky-labs/otphp/.github/CONTRIBUTING.md b/vendor/spomky-labs/otphp/.github/CONTRIBUTING.md
deleted file mode 100644
index 871735ad1..000000000
--- a/vendor/spomky-labs/otphp/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Contributing
-
-First of all, **thank you** for contributing.
-
-Bugs or feature requests can be posted online on the GitHub issues section of the project.
-
-Few rules to ease code reviews and merges:
-
-- You MUST follow the [PSR-1](http://www.php-fig.org/psr/psr-1/), [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/) coding standards.
-- You MUST run the test suite.
-- You MUST write (or update) unit tests when bugs are fixed or features are added.
-- You SHOULD write documentation.
-
-We use [Git-Flow](http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/) to automate our git branching workflow.
-
-To contribute use [Pull Requests](https://help.github.com/articles/using-pull-requests), please, write commit messages that make sense, and rebase your branch before submitting your PR.
-
-May be asked to squash your commits too. This is used to "clean" your Pull Request before merging it, avoiding commits such as fix tests, fix 2, fix 3, etc.
-
-Run test suite
-------------
-
-* install composer: `curl -s http://getcomposer.org/installer | php`
-* install dependencies: `php composer.phar install`
-* run tests: `vendor/bin/phpunit`
diff --git a/vendor/spomky-labs/otphp/.github/ISSUE_TEMPLATE.md b/vendor/spomky-labs/otphp/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 2ceb8da6a..000000000
--- a/vendor/spomky-labs/otphp/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,16 +0,0 @@
-| Q | A
-| -------------------- | -----
-| Bug report? | yes/no
-| Feature request? | yes/no
-| BC Break report? | yes/no
-| RFC? / Specification | yes/no
-| Library version | x.y(.z)
-
-<!--
-Fill in this template according to your issue.
-Otherwise, replace this comment by the description of your issue.
-
-Please consider the following requirements
-* You MUST never send security issues here. If you think that your issue is a security one then contact Spomky in private at https://gitter.im/Spomky/
-* You should not post many lines of source code or console logs. Small inputs (approx 5 lines) are acceptable otherwize you should use a third party service (e.g. Pastebin, Chop...).
--->
diff --git a/vendor/spomky-labs/otphp/.github/PULL_REQUEST_TEMPLATE.md b/vendor/spomky-labs/otphp/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index acd0be9fc..000000000
--- a/vendor/spomky-labs/otphp/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-| Q | A
-| ------------- | ---
-| Branch? | master
-| Bug fix? | yes/no
-| New feature? | yes/no
-| BC breaks? | yes/no
-| Deprecations? | yes/no
-| Tests pass? | yes/no
-| Fixed tickets | #... <!-- #-prefixed issue number(s), if any -->
-| License | MIT
-| Tests added | <!--highly recommended for new features-->
-| Doc PR | <!--highly recommended for new features-->
-
-<!--
-Fill in this template according to the PR you're about to submit.
-Replace this comment by a description of what your PR is solving.
-
-Please consider the following requirement:
-* Modification of existing tests should be avoided unless deemed necessary.
-* You MUST never open a PR related to a security issue. Contact Spomky in private at https://gitter.im/Spomky/
--->
diff --git a/vendor/spomky-labs/otphp/.github/stale.yml b/vendor/spomky-labs/otphp/.github/stale.yml
deleted file mode 100644
index dc90e5a1c..000000000
--- a/vendor/spomky-labs/otphp/.github/stale.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Number of days of inactivity before an issue becomes stale
-daysUntilStale: 60
-# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 7
-# Issues with these labels will never be considered stale
-exemptLabels:
- - pinned
- - security
-# Label to use when marking an issue as stale
-staleLabel: wontfix
-# Comment to post when marking an issue as stale. Set to `false` to disable
-markComment: >
- This issue has been automatically marked as stale because it has not had
- recent activity. It will be closed if no further activity occurs. Thank you
- for your contributions.
-# Comment to post when closing a stale issue. Set to `false` to disable
-closeComment: false
diff --git a/vendor/spomky-labs/otphp/SECURITY.md b/vendor/spomky-labs/otphp/SECURITY.md
new file mode 100644
index 000000000..3c21578c6
--- /dev/null
+++ b/vendor/spomky-labs/otphp/SECURITY.md
@@ -0,0 +1,88 @@
+# Security Policy
+
+## Supported Versions
+
+
+| Version | Supported |
+| ------- | ------------------ |
+| 11.0.x | :white_check_mark: |
+| 10.0.x | :white_check_mark: |
+| < 10.0 | :x: |
+
+## Reporting a Vulnerability
+
+Please send an email to `[email protected]`.
+If deemed necessary, you can encrypt your message using one of the following GPG key
+
+```
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+xjMEXTsJVxYJKwYBBAHaRw8BAQdAZCS93eHRx97V+LQbAWuAaeKIdUZ9YIkn
+QH5pQ7dDU0TNMWNvbnRhY3RAc3BvbWt5LWxhYnMuY29tIDxjb250YWN0QHNw
+b21reS1sYWJzLmNvbT7CdwQQFgoAHwUCXTsJVwYLCQcIAwIEFQgKAgMWAgEC
+GQECGwMCHgEACgkQG6hbCDSDj+1/tgEAoy11uHvDV7kkG/iN2/0ylV72hU8y
+c/xoqGd7qFaKD6ABANcthlg63OrQVTf0dUPOT9Y2BJpOOA88JJWgILtuUPIO
+zjgEXTsJVxIKKwYBBAGXVQEFAQEHQKiX7nldkmICePhzwReZnBPmjpsmNt7V
+Y8xHdICKsr8cAwEIB8JhBBgWCAAJBQJdOwlXAhsMAAoJEBuoWwg0g4/t0KgA
+/31ucb/bL/MGpWFrpSjTs6uQhZWlBmcFoeMhwCYepIpZAQDd65UBqFDKXJWv
+Xy3zoMQQzD9Z6fUATnFrWkzjHwhvDQ==
+=j4dw
+-----END PGP PUBLIC KEY BLOCK-----
+```
+
+
+```
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+xsFNBGILZFoBEADo9pzAMRVxL5typ22Ywifdyi3CMHgg7zptfb8otrQci8IX
+m7B8/NTA0I9EkenzSW/Mf4k2iPNCwXc+qVEHPvPNvr3WazcdiDQJjXqMtkxG
+l2dvdQHdBxN46v+mvWDVGf9anYQxIAmZrj7CDLOfD/cG/8STL4hSbFjRBOKs
+xAP8wgRA/amcrf9WcCDxURGIq8mDPcECR8fca+iukTmMe2NDEc56pJi0KVoF
+pFhOMMfjgP/XvtGjjSNZNGRgHSLTQs8UiK+5BjPh+iWFIPV5+ZPLpbSOcoma
+GyeX5i1DmAh7cWx/FphvFzOun6to3ERuy82+zW54iA9zS8+kIfV4Wjr2qE7l
+Ctc9l8RIv/6dMXoW2Y42CTuywlAMnlP7XaaUgE++CXTIuO7+6Gp0E5NlmqB5
+lb+CZLV/LS27gUcajs23ve5B3UId2bGUflvTtY/J0VPzrJMoEErVnkCsnD7W
+Oiwe8GiSNMJmTGu/A45xf5nuYNcuU7blA5XXwPoHZuALj1zv6eCWVxWz02l9
+Fc/T+gNkOEErlXOcldyXxQ5Qb99TU5NgdqzbibyR9QAqdfwtgg19oFbiSP7t
+8b5P2qAIW2GaOCkX007cBCzTXNrcQNruTwUD59LZQLhdGz5WJo/gefC/3ZvR
+vKoJKCRlk7s43aUjeZzE+Engpr5e1wl63WjAzQARAQABzTNzZWN1cml0eUBz
+cG9ta3ktbGFicy5jb20gPHNlY3VyaXR5QHNwb21reS1sYWJzLmNvbT7CwY0E
+EAEIACAFAmILZFoGCwkHCAMCBBUICgIEFgIBAAIZAQIbAwIeAQAhCRBy14gx
+FHv4aBYhBKgF8zJv89FYVv0RFHLXiDEUe/hoA+YP/ijaePtilKURzNVrPWfc
+gDw/ZNCR+dVAgwGo9VcbOvkyZmyqD6yBjuDWvG96KQs0LRrqWKonAvnewNtp
+wQruuvrlcCuNE6TTfvx0wh2+lwKD7MH5dKutHUCowVNAsZ5uZxHVF9RGLBh+
+JRofklupcGqUx+Jtx4uq2gAGOqV4/QdvneMjkLwqVu8FGIM59LfdNfp/iA3p
+wX2DvfxBO58Gu6hilmf7R+b9nX0U7xYJM6QJb7H89cV3/AoTh2kf1wtFY+Py
+Di6VZTMUBYOoz2iSnvCE8KlBWDu98/A2EJ7kDGQdmnuIgsURsyap3yKioaUr
+LGTaG0OiC/gkXkKisH6eff6Gw06qelBarf5N/GgoeAN/amE8twy3a+Hx1pyw
+ZzkjPsL7uWg3Koy5mPuCtWfPtIBcJaTLS5d8ESlJ8/CfaVaDludzYQZo70Xn
+m4KzjPnptm3djpZNwoFEUxrHVREOEe69/MnEL2PNcEMQkapg16PnH4phajnC
+7bYOPDteMJlHjNmQzz9d25ZwzVBHDDT50mHDijR2D/OgKx3NQr88fiFAWhKG
+lEu1ZuOkKIKV5VIFbocTWSoV7bkzIfrll49xWou+4VOxgRuqjquFC4RV8fea
+lLbHOcJlOR00aFDmoOWQ3/QNvajaWJFzDdocGbgbnEBMDFRoUkuhqOBcnzA+
+apW/zsFNBGILZFoBEADSwiM49wObRpxOyas91M6WvJ4Gt3iXqj+L8dmcw0FW
+UdDpwOxy8tuZx+OfXEBBH3eJHOobC66vN+E9WYobVkJ5zfbGxfQruTuvUZNl
+X9Lo0UwoP+AP21AKUUvsf48iZGWzmlkxgPnhAQS4ECkkWCKPf7nFTk+V+jIN
+nf6ZDZLXaRUnG0nLvzs0raG1eTVrGvPSCC8u3R2zIh9SvoeEgTnT/Re0mhCu
+ah3fwG+4vXc6VIjR1ZtpM9+Y8sl+PFZ/Oiisc+46oU5qXVVLtHfLdxYZ4vl2
+IflHDKKmrfbfGY1hJl/foBLglT3Cd8GTu3FjiAJX9PpkiWbsflc0OUBQf9aC
+73W5FLS4P4clm4nNzVGkNucWHvk+urM6nEUf02bhsfF0TPeos3QcJorfKNUS
+TvuGYccENuK5cVOzEcU+VhN08GT0pr0CpqJnsw+zV8vD4k3aPmMFmSVog+bY
+NhfB7AgwbOjd6MhQJcP7YjYTHaa6YsnKMSg4RhkDjvMa3421hfaWsVvlIb0f
+AZJ8BnXgfE0uI8CKA9dc6I2Posl33zC8HI2sS1MEJ90Am68P+uJt61LdJeD5
+VXSrCkzBhUBds0hbGR6+DF20UD496m7Lw3VBoWOl2bMeLdERDarFMDYsPH47
+rie9wlrnPNR57HUqK4bpkFwqTStRkRFUhFv7LLWZ1QARAQABwsF2BBgBCAAJ
+BQJiC2RaAhsMACEJEHLXiDEUe/hoFiEEqAXzMm/z0VhW/REUcteIMRR7+GhI
+lQ/9GbSwIdGue6Gw0msYAEoER9HhpYB//9/GG7/c4ZW60nLSSYuhNWIo0Akl
+10CzeApezf/O9/1EExqZ9ygj4wtUphcQOdRJVhXPt+gskw7/NHoXUJ+Z1rbb
+EWbKle9YufZ4PAKYhlxdqTlWyQvPVxrRvbuhYeQG4S412VzKjH0/x1Fh2CfV
+hFuyOaRjg89T6rihXL1rCSJ/PDQeQtvtXeJ30yFj+aapCj+VqUl+2D+N0bzS
+LL18kEPQnJw4BOHOXrw349dAKmHN/QkRH8DINlXLyaOlABglnSViDQL3Q1t3
+sBuIeClsl3brQNJRp/RKOdTBMNAX+BhAjqodbwwT+UkJl9xJKw0Cla4wtbs2
+T0yoK/Z1iFfvPdufkK4q6ocAHJUp3+XckFIZxsHQvhQPbm9XoOt1RTO29MOw
+EYo8UjFQCnXJVsj1/6XMgIUe5tPYvS/ZZZNJFF4j+OE8xRKLKqg/DFcpEipC
+LCmzzr/hhWx0XP4CIK2tYsAMk3ieCZuk1Wa+NGLL4WfALWsNHq3wg5Wzv+yJ
+dp14fv711BVYlriI+VKggGFgBdz0dWkgrBk4+thLatJFcjFYr8BLkbtPraa3
+sFI/cGxvOXSIy4GEALdfnozyU3RJtMNtVi3IzGeIFAOb457y/IrMqpWLp1FX
+BUqlX5YJHneD9Q8Sfz/HKDQDCqg=
+=o+4z
+-----END PGP PUBLIC KEY BLOCK-----
+```
diff --git a/vendor/spomky-labs/otphp/composer.json b/vendor/spomky-labs/otphp/composer.json
index 8979e8f06..583fbf9ef 100644
--- a/vendor/spomky-labs/otphp/composer.json
+++ b/vendor/spomky-labs/otphp/composer.json
@@ -20,7 +20,7 @@
"ext-mbstring": "*",
"paragonie/constant_time_encoding": "^2.0",
"beberlei/assert": "^3.0",
- "thecodingmachine/safe": "^0.1.14|^1.0"
+ "thecodingmachine/safe": "^0.1.14|^1.0|^2.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0",
@@ -30,7 +30,7 @@
"phpstan/phpstan-deprecation-rules": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.12",
- "thecodingmachine/phpstan-safe-rule": "^1.0"
+ "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0"
},
"suggest": {
},
diff --git a/vendor/spomky-labs/otphp/src/ParameterTrait.php b/vendor/spomky-labs/otphp/src/ParameterTrait.php
index 69fa774db..326109da3 100644
--- a/vendor/spomky-labs/otphp/src/ParameterTrait.php
+++ b/vendor/spomky-labs/otphp/src/ParameterTrait.php
@@ -59,7 +59,7 @@ trait ParameterTrait
return $this->getParameter('secret');
}
- private function setSecret(?string $secret): void
+ public function setSecret(?string $secret): void
{
$this->setParameter('secret', $secret);
}
diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php
deleted file mode 100644
index ba75a2c95..000000000
--- a/vendor/symfony/polyfill-ctype/Ctype.php
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <[email protected]>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Polyfill\Ctype;
-
-/**
- * Ctype implementation through regex.
- *
- * @internal
- *
- * @author Gert de Pagter <[email protected]>
- */
-final class Ctype
-{
- /**
- * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
- *
- * @see https://php.net/ctype-alnum
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_alnum($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is a letter, FALSE otherwise.
- *
- * @see https://php.net/ctype-alpha
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_alpha($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
- *
- * @see https://php.net/ctype-cntrl
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_cntrl($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
- }
-
- /**
- * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
- *
- * @see https://php.net/ctype-digit
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_digit($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
- *
- * @see https://php.net/ctype-graph
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_graph($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is a lowercase letter.
- *
- * @see https://php.net/ctype-lower
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_lower($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
- *
- * @see https://php.net/ctype-print
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_print($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
- *
- * @see https://php.net/ctype-punct
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_punct($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
- *
- * @see https://php.net/ctype-space
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_space($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is an uppercase letter.
- *
- * @see https://php.net/ctype-upper
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_upper($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
- }
-
- /**
- * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
- *
- * @see https://php.net/ctype-xdigit
- *
- * @param mixed $text
- *
- * @return bool
- */
- public static function ctype_xdigit($text)
- {
- $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__);
-
- return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
- }
-
- /**
- * Converts integers to their char versions according to normal ctype behaviour, if needed.
- *
- * If an integer between -128 and 255 inclusive is provided,
- * it is interpreted as the ASCII value of a single character
- * (negative values have 256 added in order to allow characters in the Extended ASCII range).
- * Any other integer is interpreted as a string containing the decimal digits of the integer.
- *
- * @param mixed $int
- * @param string $function
- *
- * @return mixed
- */
- private static function convert_int_to_char_for_ctype($int, $function)
- {
- if (!\is_int($int)) {
- return $int;
- }
-
- if ($int < -128 || $int > 255) {
- return (string) $int;
- }
-
- if (\PHP_VERSION_ID >= 80100) {
- @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED);
- }
-
- if ($int < 0) {
- $int += 256;
- }
-
- return \chr($int);
- }
-}
diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md
deleted file mode 100644
index 8add1ab00..000000000
--- a/vendor/symfony/polyfill-ctype/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-Symfony Polyfill / Ctype
-========================
-
-This component provides `ctype_*` functions to users who run php versions without the ctype extension.
-
-More information can be found in the
-[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
-
-License
-=======
-
-This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php
deleted file mode 100644
index d54524b31..000000000
--- a/vendor/symfony/polyfill-ctype/bootstrap.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <[email protected]>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-use Symfony\Polyfill\Ctype as p;
-
-if (\PHP_VERSION_ID >= 80000) {
- return require __DIR__.'/bootstrap80.php';
-}
-
-if (!function_exists('ctype_alnum')) {
- function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
-}
-if (!function_exists('ctype_alpha')) {
- function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
-}
-if (!function_exists('ctype_cntrl')) {
- function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
-}
-if (!function_exists('ctype_digit')) {
- function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
-}
-if (!function_exists('ctype_graph')) {
- function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
-}
-if (!function_exists('ctype_lower')) {
- function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
-}
-if (!function_exists('ctype_print')) {
- function ctype_print($text) { return p\Ctype::ctype_print($text); }
-}
-if (!function_exists('ctype_punct')) {
- function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
-}
-if (!function_exists('ctype_space')) {
- function ctype_space($text) { return p\Ctype::ctype_space($text); }
-}
-if (!function_exists('ctype_upper')) {
- function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
-}
-if (!function_exists('ctype_xdigit')) {
- function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
-}
diff --git a/vendor/symfony/polyfill-ctype/bootstrap80.php b/vendor/symfony/polyfill-ctype/bootstrap80.php
deleted file mode 100644
index ab2f8611d..000000000
--- a/vendor/symfony/polyfill-ctype/bootstrap80.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <[email protected]>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-use Symfony\Polyfill\Ctype as p;
-
-if (!function_exists('ctype_alnum')) {
- function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); }
-}
-if (!function_exists('ctype_alpha')) {
- function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); }
-}
-if (!function_exists('ctype_cntrl')) {
- function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); }
-}
-if (!function_exists('ctype_digit')) {
- function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); }
-}
-if (!function_exists('ctype_graph')) {
- function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); }
-}
-if (!function_exists('ctype_lower')) {
- function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); }
-}
-if (!function_exists('ctype_print')) {
- function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); }
-}
-if (!function_exists('ctype_punct')) {
- function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); }
-}
-if (!function_exists('ctype_space')) {
- function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); }
-}
-if (!function_exists('ctype_upper')) {
- function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); }
-}
-if (!function_exists('ctype_xdigit')) {
- function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); }
-}
diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json
deleted file mode 100644
index ccb8e5703..000000000
--- a/vendor/symfony/polyfill-ctype/composer.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "symfony/polyfill-ctype",
- "type": "library",
- "description": "Symfony polyfill for ctype functions",
- "keywords": ["polyfill", "compatibility", "portable", "ctype"],
- "homepage": "https://symfony.com",
- "license": "MIT",
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "[email protected]"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "autoload": {
- "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
- "files": [ "bootstrap.php" ]
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "minimum-stability": "dev",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- }
-}
diff --git a/vendor/thecodingmachine/safe/README.md b/vendor/thecodingmachine/safe/README.md
index 3c2ee624f..f0fbeb2fa 100644
--- a/vendor/thecodingmachine/safe/README.md
+++ b/vendor/thecodingmachine/safe/README.md
@@ -9,8 +9,6 @@
Safe PHP
========
-**Work in progress**
-
A set of core PHP functions rewritten to throw exceptions instead of returning `false` when an error is encountered.
## The problem
@@ -115,7 +113,7 @@ tool that performs instant refactoring of your application.
Run
```bash
-$ composer require --dev rector/rector:^0.7
+$ composer require --dev rector/rector
```
to install `rector/rector`.
@@ -123,7 +121,7 @@ to install `rector/rector`.
Run
```bash
-vendor/bin/rector process src/ --config vendor/thecodingmachine/safe/rector-migrate-0.7.php
+vendor/bin/rector process src/ --config vendor/thecodingmachine/safe/rector-migrate.php
```
to run `rector/rector`.
diff --git a/vendor/thecodingmachine/safe/composer.json b/vendor/thecodingmachine/safe/composer.json
index 2cd03fcc8..920c1776e 100644
--- a/vendor/thecodingmachine/safe/composer.json
+++ b/vendor/thecodingmachine/safe/composer.json
@@ -3,19 +3,24 @@
"description": "PHP core functions that throw exceptions instead of returning FALSE on error",
"license": "MIT",
"autoload": {
- "psr-4": {
- "Safe\\": [
- "lib/",
- "deprecated/",
- "generated/"
- ]
- },
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "deprecated/Exceptions/",
+ "generated/Exceptions/"
+ ],
"files": [
"deprecated/apc.php",
+ "deprecated/array.php",
+ "deprecated/datetime.php",
"deprecated/libevent.php",
+ "deprecated/password.php",
"deprecated/mssql.php",
"deprecated/stats.php",
+ "deprecated/strings.php",
"lib/special_cases.php",
+ "deprecated/mysqli.php",
"generated/apache.php",
"generated/apcu.php",
"generated/array.php",
@@ -36,6 +41,7 @@
"generated/fpm.php",
"generated/ftp.php",
"generated/funchand.php",
+ "generated/gettext.php",
"generated/gmp.php",
"generated/gnupg.php",
"generated/hash.php",
@@ -45,7 +51,6 @@
"generated/image.php",
"generated/imap.php",
"generated/info.php",
- "generated/ingres-ii.php",
"generated/inotify.php",
"generated/json.php",
"generated/ldap.php",
@@ -54,20 +59,14 @@
"generated/mailparse.php",
"generated/mbstring.php",
"generated/misc.php",
- "generated/msql.php",
"generated/mysql.php",
- "generated/mysqli.php",
- "generated/mysqlndMs.php",
- "generated/mysqlndQc.php",
"generated/network.php",
"generated/oci8.php",
"generated/opcache.php",
"generated/openssl.php",
"generated/outcontrol.php",
- "generated/password.php",
"generated/pcntl.php",
"generated/pcre.php",
- "generated/pdf.php",
"generated/pgsql.php",
"generated/posix.php",
"generated/ps.php",
@@ -78,7 +77,6 @@
"generated/sem.php",
"generated/session.php",
"generated/shmop.php",
- "generated/simplexml.php",
"generated/sockets.php",
"generated/sodium.php",
"generated/solr.php",
@@ -103,12 +101,13 @@
]
},
"require": {
- "php": ">=7.2"
+ "php": "^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12",
- "thecodingmachine/phpstan-strict-rules": "^0.12",
- "squizlabs/php_codesniffer": "^3.2"
+ "phpstan/phpstan": "^1.5",
+ "thecodingmachine/phpstan-strict-rules": "^1.0",
+ "squizlabs/php_codesniffer": "^3.2",
+ "phpunit/phpunit": "^9.5"
},
"scripts": {
"phpstan": "phpstan analyse lib -c phpstan.neon --level=max --no-progress -vvv",
@@ -117,7 +116,7 @@
},
"extra": {
"branch-alias": {
- "dev-master": "0.1-dev"
+ "dev-master": "2.2.x-dev"
}
}
} \ No newline at end of file
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/MysqliException.php b/vendor/thecodingmachine/safe/deprecated/Exceptions/MysqliException.php
index 4cadf6ca1..4cadf6ca1 100644
--- a/vendor/thecodingmachine/safe/generated/Exceptions/MysqliException.php
+++ b/vendor/thecodingmachine/safe/deprecated/Exceptions/MysqliException.php
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/PasswordException.php b/vendor/thecodingmachine/safe/deprecated/Exceptions/PasswordException.php
index f0edba123..9c183b8e4 100644
--- a/vendor/thecodingmachine/safe/generated/Exceptions/PasswordException.php
+++ b/vendor/thecodingmachine/safe/deprecated/Exceptions/PasswordException.php
@@ -1,6 +1,10 @@
<?php
+
namespace Safe\Exceptions;
+/**
+ * @deprecated This exception is deprecated
+ */
class PasswordException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
diff --git a/vendor/thecodingmachine/safe/deprecated/array.php b/vendor/thecodingmachine/safe/deprecated/array.php
new file mode 100644
index 000000000..691ea7394
--- /dev/null
+++ b/vendor/thecodingmachine/safe/deprecated/array.php
@@ -0,0 +1,301 @@
+<?php
+
+namespace Safe;
+
+use Safe\Exceptions\ArrayException;
+
+/**
+ * array_replace_recursive replaces the values of
+ * array with the same values from all the following
+ * arrays. If a key from the first array exists in the second array, its value
+ * will be replaced by the value from the second array. If the key exists in the
+ * second array, and not the first, it will be created in the first array.
+ * If a key only exists in the first array, it will be left as is.
+ * If several arrays are passed for replacement, they will be processed
+ * in order, the later array overwriting the previous values.
+ *
+ * array_replace_recursive is recursive : it will recurse into
+ * arrays and apply the same process to the inner value.
+ *
+ * When the value in the first array is scalar, it will be replaced
+ * by the value in the second array, may it be scalar or array.
+ * When the value in the first array and the second array
+ * are both arrays, array_replace_recursive will replace
+ * their respective value recursively.
+ *
+ * @param array $array The array in which elements are replaced.
+ * @param array $replacements Arrays from which elements will be extracted.
+ * @return array Returns an array.
+ * @throws ArrayException
+ *
+ */
+function array_replace_recursive(array $array, array ...$replacements): array
+{
+ error_clear_last();
+ if ($replacements !== []) {
+ $result = \array_replace_recursive($array, ...$replacements);
+ } else {
+ $result = \array_replace_recursive($array);
+ }
+ if ($result === null) {
+ throw ArrayException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * array_replace replaces the values of
+ * array with values having the same keys in each of the following
+ * arrays. If a key from the first array exists in the second array, its value
+ * will be replaced by the value from the second array. If the key exists in the
+ * second array, and not the first, it will be created in the first array.
+ * If a key only exists in the first array, it will be left as is.
+ * If several arrays are passed for replacement, they will be processed
+ * in order, the later arrays overwriting the previous values.
+ *
+ * array_replace is not recursive : it will replace
+ * values in the first array by whatever type is in the second array.
+ *
+ * @param array $array The array in which elements are replaced.
+ * @param array $replacements Arrays from which elements will be extracted.
+ * Values from later arrays overwrite the previous values.
+ * @return array Returns an array.
+ * @throws ArrayException
+ *
+ */
+function array_replace(array $array, array ...$replacements): array
+{
+ error_clear_last();
+ if ($replacements !== []) {
+ $result = \array_replace($array, ...$replacements);
+ } else {
+ $result = \array_replace($array);
+ }
+ if ($result === null) {
+ throw ArrayException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * array_flip returns an array in flip
+ * order, i.e. keys from array become values and values
+ * from array become keys.
+ *
+ * Note that the values of array need to be valid
+ * keys, i.e. they need to be either integer or
+ * string. A warning will be emitted if a value has the wrong
+ * type, and the key/value pair in question will not be included
+ * in the result.
+ *
+ * If a value has several occurrences, the latest key will be
+ * used as its value, and all others will be lost.
+ *
+ * @param array $array An array of key/value pairs to be flipped.
+ * @return array Returns the flipped array on success.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function array_flip(array $array): array
+{
+ error_clear_last();
+ $result = \array_flip($array);
+ if ($result === null) {
+ throw ArrayException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * This function sorts an array such that array indices maintain their
+ * correlation with the array elements they are associated with.
+ *
+ * This is used mainly when sorting associative arrays where the actual
+ * element order is significant.
+ *
+ * @param array $array The input array.
+ * @param int $sort_flags You may modify the behavior of the sort using the optional parameter
+ * sort_flags, for details see
+ * sort.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function arsort(array &$array, int $sort_flags = SORT_REGULAR): void
+{
+ error_clear_last();
+ $result = \arsort($array, $sort_flags);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * This function sorts an array such that array indices maintain
+ * their correlation with the array elements they are associated
+ * with. This is used mainly when sorting associative arrays where
+ * the actual element order is significant.
+ *
+ * @param array $array The input array.
+ * @param int $sort_flags You may modify the behavior of the sort using the optional
+ * parameter sort_flags, for details
+ * see sort.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ */
+function asort(array &$array, int $sort_flags = SORT_REGULAR): void
+{
+ error_clear_last();
+ $result = \asort($array, $sort_flags);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * Sorts an array by key in reverse order, maintaining key to data
+ * correlations. This is useful mainly for associative arrays.
+ *
+ * @param array $array The input array.
+ * @param int $sort_flags You may modify the behavior of the sort using the optional parameter
+ * sort_flags, for details see
+ * sort.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function krsort(array &$array, int $sort_flags = SORT_REGULAR): void
+{
+ error_clear_last();
+ $result = \krsort($array, $sort_flags);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * Sorts an array by key, maintaining key to data correlations. This is
+ * useful mainly for associative arrays.
+ *
+ * @param array $array The input array.
+ * @param int $sort_flags You may modify the behavior of the sort using the optional
+ * parameter sort_flags, for details
+ * see sort.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function ksort(array &$array, int $sort_flags = SORT_REGULAR): void
+{
+ error_clear_last();
+ $result = \ksort($array, $sort_flags);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * This function sorts an array. Elements will be arranged from
+ * lowest to highest when this function has completed.
+ *
+ * @param array $array The input array.
+ * @param int $sort_flags The optional second parameter sort_flags
+ * may be used to modify the sorting behavior using these values:
+ *
+ * Sorting type flags:
+ *
+ *
+ * SORT_REGULAR - compare items normally;
+ * the details are described in the comparison operators section
+ *
+ *
+ * SORT_NUMERIC - compare items numerically
+ *
+ *
+ * SORT_STRING - compare items as strings
+ *
+ *
+ *
+ * SORT_LOCALE_STRING - compare items as
+ * strings, based on the current locale. It uses the locale,
+ * which can be changed using setlocale
+ *
+ *
+ *
+ *
+ * SORT_NATURAL - compare items as strings
+ * using "natural ordering" like natsort
+ *
+ *
+ *
+ *
+ * SORT_FLAG_CASE - can be combined
+ * (bitwise OR) with
+ * SORT_STRING or
+ * SORT_NATURAL to sort strings case-insensitively
+ *
+ *
+ *
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ */
+function sort(array &$array, int $sort_flags = SORT_REGULAR): void
+{
+ error_clear_last();
+ $result = \sort($array, $sort_flags);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * This function will sort an array by its values using a user-supplied
+ * comparison function. If the array you wish to sort needs to be sorted by
+ * some non-trivial criteria, you should use this function.
+ *
+ * @param array $array The input array.
+ * @param callable $value_compare_func The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
+ * Note that before PHP 7.0.0 this integer had to be in the range from -2147483648 to 2147483647.
+ *
+ * Returning non-integer values from the comparison
+ * function, such as float, will result in an internal cast to
+ * integer of the callback's return value. So values such as
+ * 0.99 and 0.1 will both be cast to an integer value of 0, which will
+ * compare such values as equal.
+ * @throws ArrayException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function usort(array &$array, callable $value_compare_func): void
+{
+ error_clear_last();
+ $result = \usort($array, $value_compare_func);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+}
+
+/**
+ * Creates an array by using the values from the
+ * keys array as keys and the values from the
+ * values array as the corresponding values.
+ *
+ * @param array $keys Array of keys to be used. Illegal values for key will be
+ * converted to string.
+ * @param array $values Array of values to be used
+ * @return array Returns the combined array, FALSE if the number of elements
+ * for each array isn't equal.
+ * @throws ArrayException
+ * @deprecated
+ *
+ */
+function array_combine(array $keys, array $values): array
+{
+ error_clear_last();
+ $result = \array_combine($keys, $values);
+ if ($result === false) {
+ throw ArrayException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/deprecated/datetime.php b/vendor/thecodingmachine/safe/deprecated/datetime.php
new file mode 100644
index 000000000..1bcb32275
--- /dev/null
+++ b/vendor/thecodingmachine/safe/deprecated/datetime.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Safe;
+
+use Safe\Exceptions\DatetimeException;
+
+/**
+ * Identical to the date function except that
+ * the time returned is Greenwich Mean Time (GMT).
+ *
+ * @param string $format The format of the outputted date string. See the formatting
+ * options for the date function.
+ * @param int $timestamp The optional timestamp parameter is an
+ * integer Unix timestamp that defaults to the current
+ * local time if a timestamp is not given. In other
+ * words, it defaults to the value of time.
+ * @return string Returns a formatted date string. If a non-numeric value is used for
+ * timestamp, FALSE is returned and an
+ * E_WARNING level error is emitted.
+ * @throws DatetimeException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function gmdate(string $format, int $timestamp = null): string
+{
+ error_clear_last();
+ if ($timestamp !== null) {
+ $result = \gmdate($format, $timestamp);
+ } else {
+ $result = \gmdate($format);
+ }
+ if ($result === false) {
+ throw DatetimeException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/deprecated/functionsList.php b/vendor/thecodingmachine/safe/deprecated/functionsList.php
index e430cd3b9..b75d7abb2 100644
--- a/vendor/thecodingmachine/safe/deprecated/functionsList.php
+++ b/vendor/thecodingmachine/safe/deprecated/functionsList.php
@@ -11,6 +11,12 @@ return [
'apc_inc',
'apc_load_constants',
'apc_sma_info',
+ 'arsort',
+ 'array_replace',
+ 'array_replace_recursive',
+ 'array_combine',
+ 'array_flip',
+ 'asort',
'event_add',
'event_base_loopbreak',
'event_base_loopexit',
@@ -30,10 +36,13 @@ return [
'event_priority_set',
'event_set',
'event_timer_set',
+ 'gmdate',
'imagepsencodefont',
'imagepsextendfont',
'imagepsfreefont',
'imagepsslantfont',
+ 'krsort',
+ 'ksort',
'mssql_bind',
'mssql_close',
'mssql_connect',
@@ -48,9 +57,15 @@ return [
'mssql_pconnect',
'mssql_query',
'mssql_select_db',
+ 'mysqli_get_client_stats',
+ 'password_hash',
+ 'sort',
'stats_covariance',
'stats_standard_deviation',
'stats_stat_correlation',
'stats_stat_innerproduct',
'stats_variance',
+ 'substr',
+ 'usort',
+ 'vsprintf',
];
diff --git a/vendor/thecodingmachine/safe/generated/mysqli.php b/vendor/thecodingmachine/safe/deprecated/mysqli.php
index c8807af4a..13839c6c7 100644
--- a/vendor/thecodingmachine/safe/generated/mysqli.php
+++ b/vendor/thecodingmachine/safe/deprecated/mysqli.php
@@ -5,27 +5,7 @@ namespace Safe;
use Safe\Exceptions\MysqliException;
/**
- * Returns an empty array.
- * Available only with mysqlnd.
- *
- * @return array Returns an empty array on success, FALSE otherwise.
- * @throws MysqliException
- *
- */
-function mysqli_get_cache_stats(): array
-{
- error_clear_last();
- $result = \mysqli_get_cache_stats();
- if ($result === false) {
- throw MysqliException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* Returns client per-process statistics.
- * Available only with mysqlnd.
*
* @return array Returns an array with client stats if success, FALSE otherwise.
* @throws MysqliException
diff --git a/vendor/thecodingmachine/safe/generated/password.php b/vendor/thecodingmachine/safe/deprecated/password.php
index 3808e02b9..87d85a7b7 100644
--- a/vendor/thecodingmachine/safe/generated/password.php
+++ b/vendor/thecodingmachine/safe/deprecated/password.php
@@ -109,6 +109,7 @@ use Safe\Exceptions\PasswordException;
* the password_verify function to verify the hash without
* needing separate storage for the salt or algorithm information.
* @throws PasswordException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
*
*/
function password_hash(string $password, $algo, array $options = null): string
diff --git a/vendor/thecodingmachine/safe/deprecated/strings.php b/vendor/thecodingmachine/safe/deprecated/strings.php
new file mode 100644
index 000000000..de0c2e606
--- /dev/null
+++ b/vendor/thecodingmachine/safe/deprecated/strings.php
@@ -0,0 +1,677 @@
+<?php
+
+namespace Safe;
+
+use Safe\Exceptions\StringsException;
+
+/**
+ * Returns a string produced according to the formatting string
+ * format.
+ *
+ * @param string $format The format string is composed of zero or more directives:
+ * ordinary characters (excluding %) that are
+ * copied directly to the result and conversion
+ * specifications, each of which results in fetching its
+ * own parameter.
+ *
+ * A conversion specification follows this prototype:
+ * %[argnum$][flags][width][.precision]specifier.
+ *
+ * An integer followed by a dollar sign $,
+ * to specify which number argument to treat in the conversion.
+ *
+ *
+ * Flags
+ *
+ *
+ *
+ * Flag
+ * Description
+ *
+ *
+ *
+ *
+ * -
+ *
+ * Left-justify within the given field width;
+ * Right justification is the default
+ *
+ *
+ *
+ * +
+ *
+ * Prefix positive numbers with a plus sign
+ * +; Default only negative
+ * are prefixed with a negative sign.
+ *
+ *
+ *
+ * (space)
+ *
+ * Pads the result with spaces.
+ * This is the default.
+ *
+ *
+ *
+ * 0
+ *
+ * Only left-pads numbers with zeros.
+ * With s specifiers this can
+ * also right-pad with zeros.
+ *
+ *
+ *
+ * '(char)
+ *
+ * Pads the result with the character (char).
+ *
+ *
+ *
+ *
+ *
+ *
+ * An integer that says how many characters (minimum)
+ * this conversion should result in.
+ *
+ * A period . followed by an integer
+ * who's meaning depends on the specifier:
+ *
+ *
+ *
+ * For e, E,
+ * f and F
+ * specifiers: this is the number of digits to be printed
+ * after the decimal point (by default, this is 6).
+ *
+ *
+ *
+ *
+ * For g and G
+ * specifiers: this is the maximum number of significant
+ * digits to be printed.
+ *
+ *
+ *
+ *
+ * For s specifier: it acts as a cutoff point,
+ * setting a maximum character limit to the string.
+ *
+ *
+ *
+ *
+ *
+ * If the period is specified without an explicit value for precision,
+ * 0 is assumed.
+ *
+ *
+ *
+ *
+ * Specifiers
+ *
+ *
+ *
+ * Specifier
+ * Description
+ *
+ *
+ *
+ *
+ * %
+ *
+ * A literal percent character. No argument is required.
+ *
+ *
+ *
+ * b
+ *
+ * The argument is treated as an integer and presented
+ * as a binary number.
+ *
+ *
+ *
+ * c
+ *
+ * The argument is treated as an integer and presented
+ * as the character with that ASCII.
+ *
+ *
+ *
+ * d
+ *
+ * The argument is treated as an integer and presented
+ * as a (signed) decimal number.
+ *
+ *
+ *
+ * e
+ *
+ * The argument is treated as scientific notation (e.g. 1.2e+2).
+ * The precision specifier stands for the number of digits after the
+ * decimal point since PHP 5.2.1. In earlier versions, it was taken as
+ * number of significant digits (one less).
+ *
+ *
+ *
+ * E
+ *
+ * Like the e specifier but uses
+ * uppercase letter (e.g. 1.2E+2).
+ *
+ *
+ *
+ * f
+ *
+ * The argument is treated as a float and presented
+ * as a floating-point number (locale aware).
+ *
+ *
+ *
+ * F
+ *
+ * The argument is treated as a float and presented
+ * as a floating-point number (non-locale aware).
+ * Available as of PHP 5.0.3.
+ *
+ *
+ *
+ * g
+ *
+ *
+ * General format.
+ *
+ *
+ * Let P equal the precision if nonzero, 6 if the precision is omitted,
+ * or 1 if the precision is zero.
+ * Then, if a conversion with style E would have an exponent of X:
+ *
+ *
+ * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
+ * Otherwise, the conversion is with style e and precision P − 1.
+ *
+ *
+ *
+ *
+ * G
+ *
+ * Like the g specifier but uses
+ * E and f.
+ *
+ *
+ *
+ * o
+ *
+ * The argument is treated as an integer and presented
+ * as an octal number.
+ *
+ *
+ *
+ * s
+ *
+ * The argument is treated and presented as a string.
+ *
+ *
+ *
+ * u
+ *
+ * The argument is treated as an integer and presented
+ * as an unsigned decimal number.
+ *
+ *
+ *
+ * x
+ *
+ * The argument is treated as an integer and presented
+ * as a hexadecimal number (with lowercase letters).
+ *
+ *
+ *
+ * X
+ *
+ * The argument is treated as an integer and presented
+ * as a hexadecimal number (with uppercase letters).
+ *
+ *
+ *
+ *
+ *
+ *
+ * General format.
+ *
+ * Let P equal the precision if nonzero, 6 if the precision is omitted,
+ * or 1 if the precision is zero.
+ * Then, if a conversion with style E would have an exponent of X:
+ *
+ * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
+ * Otherwise, the conversion is with style e and precision P − 1.
+ *
+ * The c type specifier ignores padding and width
+ *
+ * Attempting to use a combination of the string and width specifiers with character sets that require more than one byte per character may result in unexpected results
+ *
+ * Variables will be co-erced to a suitable type for the specifier:
+ *
+ * Type Handling
+ *
+ *
+ *
+ * Type
+ * Specifiers
+ *
+ *
+ *
+ *
+ * string
+ * s
+ *
+ *
+ * integer
+ *
+ * d,
+ * u,
+ * c,
+ * o,
+ * x,
+ * X,
+ * b
+ *
+ *
+ *
+ * double
+ *
+ * g,
+ * G,
+ * e,
+ * E,
+ * f,
+ * F
+ *
+ *
+ *
+ *
+ *
+ * @param mixed $params
+ * @return string Returns a string produced according to the formatting string
+ * format.
+ * @throws StringsException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function sprintf(string $format, ...$params): string
+{
+ error_clear_last();
+ if ($params !== []) {
+ $result = \sprintf($format, ...$params);
+ } else {
+ $result = \sprintf($format);
+ }
+ if ($result === false) {
+ throw StringsException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * Returns the portion of string specified by the
+ * start and length parameters.
+ *
+ * @param string $string The input string.
+ * @param int $start If start is non-negative, the returned string
+ * will start at the start'th position in
+ * string, counting from zero. For instance,
+ * in the string 'abcdef', the character at
+ * position 0 is 'a', the
+ * character at position 2 is
+ * 'c', and so forth.
+ *
+ * If start is negative, the returned string
+ * will start at the start'th character
+ * from the end of string.
+ *
+ * If string is less than
+ * start characters long, FALSE will be returned.
+ *
+ *
+ * Using a negative start
+ *
+ *
+ * ]]>
+ *
+ *
+ * @param int $length If length is given and is positive, the string
+ * returned will contain at most length characters
+ * beginning from start (depending on the length of
+ * string).
+ *
+ * If length is given and is negative, then that many
+ * characters will be omitted from the end of string
+ * (after the start position has been calculated when a
+ * start is negative). If
+ * start denotes the position of this truncation or
+ * beyond, FALSE will be returned.
+ *
+ * If length is given and is 0,
+ * FALSE or NULL, an empty string will be returned.
+ *
+ * If length is omitted, the substring starting from
+ * start until the end of the string will be
+ * returned.
+ * @return string Returns the extracted part of string;, or
+ * an empty string.
+ * @throws StringsException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ *
+ */
+function substr(string $string, int $start, int $length = null): string
+{
+ error_clear_last();
+ if ($length !== null) {
+ $result = \substr($string, $start, $length);
+ } else {
+ $result = \substr($string, $start);
+ }
+ if ($result === false) {
+ throw StringsException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * Operates as sprintf but accepts an array of
+ * arguments, rather than a variable number of arguments.
+ *
+ * @param string $format The format string is composed of zero or more directives:
+ * ordinary characters (excluding %) that are
+ * copied directly to the result and conversion
+ * specifications, each of which results in fetching its
+ * own parameter.
+ *
+ * A conversion specification follows this prototype:
+ * %[argnum$][flags][width][.precision]specifier.
+ *
+ * An integer followed by a dollar sign $,
+ * to specify which number argument to treat in the conversion.
+ *
+ *
+ * Flags
+ *
+ *
+ *
+ * Flag
+ * Description
+ *
+ *
+ *
+ *
+ * -
+ *
+ * Left-justify within the given field width;
+ * Right justification is the default
+ *
+ *
+ *
+ * +
+ *
+ * Prefix positive numbers with a plus sign
+ * +; Default only negative
+ * are prefixed with a negative sign.
+ *
+ *
+ *
+ * (space)
+ *
+ * Pads the result with spaces.
+ * This is the default.
+ *
+ *
+ *
+ * 0
+ *
+ * Only left-pads numbers with zeros.
+ * With s specifiers this can
+ * also right-pad with zeros.
+ *
+ *
+ *
+ * '(char)
+ *
+ * Pads the result with the character (char).
+ *
+ *
+ *
+ *
+ *
+ *
+ * An integer that says how many characters (minimum)
+ * this conversion should result in.
+ *
+ * A period . followed by an integer
+ * who's meaning depends on the specifier:
+ *
+ *
+ *
+ * For e, E,
+ * f and F
+ * specifiers: this is the number of digits to be printed
+ * after the decimal point (by default, this is 6).
+ *
+ *
+ *
+ *
+ * For g and G
+ * specifiers: this is the maximum number of significant
+ * digits to be printed.
+ *
+ *
+ *
+ *
+ * For s specifier: it acts as a cutoff point,
+ * setting a maximum character limit to the string.
+ *
+ *
+ *
+ *
+ *
+ * If the period is specified without an explicit value for precision,
+ * 0 is assumed.
+ *
+ *
+ *
+ *
+ * Specifiers
+ *
+ *
+ *
+ * Specifier
+ * Description
+ *
+ *
+ *
+ *
+ * %
+ *
+ * A literal percent character. No argument is required.
+ *
+ *
+ *
+ * b
+ *
+ * The argument is treated as an integer and presented
+ * as a binary number.
+ *
+ *
+ *
+ * c
+ *
+ * The argument is treated as an integer and presented
+ * as the character with that ASCII.
+ *
+ *
+ *
+ * d
+ *
+ * The argument is treated as an integer and presented
+ * as a (signed) decimal number.
+ *
+ *
+ *
+ * e
+ *
+ * The argument is treated as scientific notation (e.g. 1.2e+2).
+ * The precision specifier stands for the number of digits after the
+ * decimal point since PHP 5.2.1. In earlier versions, it was taken as
+ * number of significant digits (one less).
+ *
+ *
+ *
+ * E
+ *
+ * Like the e specifier but uses
+ * uppercase letter (e.g. 1.2E+2).
+ *
+ *
+ *
+ * f
+ *
+ * The argument is treated as a float and presented
+ * as a floating-point number (locale aware).
+ *
+ *
+ *
+ * F
+ *
+ * The argument is treated as a float and presented
+ * as a floating-point number (non-locale aware).
+ * Available as of PHP 5.0.3.
+ *
+ *
+ *
+ * g
+ *
+ *
+ * General format.
+ *
+ *
+ * Let P equal the precision if nonzero, 6 if the precision is omitted,
+ * or 1 if the precision is zero.
+ * Then, if a conversion with style E would have an exponent of X:
+ *
+ *
+ * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
+ * Otherwise, the conversion is with style e and precision P − 1.
+ *
+ *
+ *
+ *
+ * G
+ *
+ * Like the g specifier but uses
+ * E and f.
+ *
+ *
+ *
+ * o
+ *
+ * The argument is treated as an integer and presented
+ * as an octal number.
+ *
+ *
+ *
+ * s
+ *
+ * The argument is treated and presented as a string.
+ *
+ *
+ *
+ * u
+ *
+ * The argument is treated as an integer and presented
+ * as an unsigned decimal number.
+ *
+ *
+ *
+ * x
+ *
+ * The argument is treated as an integer and presented
+ * as a hexadecimal number (with lowercase letters).
+ *
+ *
+ *
+ * X
+ *
+ * The argument is treated as an integer and presented
+ * as a hexadecimal number (with uppercase letters).
+ *
+ *
+ *
+ *
+ *
+ *
+ * General format.
+ *
+ * Let P equal the precision if nonzero, 6 if the precision is omitted,
+ * or 1 if the precision is zero.
+ * Then, if a conversion with style E would have an exponent of X:
+ *
+ * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
+ * Otherwise, the conversion is with style e and precision P − 1.
+ *
+ * The c type specifier ignores padding and width
+ *
+ * Attempting to use a combination of the string and width specifiers with character sets that require more than one byte per character may result in unexpected results
+ *
+ * Variables will be co-erced to a suitable type for the specifier:
+ *
+ * Type Handling
+ *
+ *
+ *
+ * Type
+ * Specifiers
+ *
+ *
+ *
+ *
+ * string
+ * s
+ *
+ *
+ * integer
+ *
+ * d,
+ * u,
+ * c,
+ * o,
+ * x,
+ * X,
+ * b
+ *
+ *
+ *
+ * double
+ *
+ * g,
+ * G,
+ * e,
+ * E,
+ * f,
+ * F
+ *
+ *
+ *
+ *
+ *
+ * @param array $args
+ * @return string Return array values as a formatted string according to
+ * format.
+ * @throws StringsException
+ * @deprecated The Safe version of this function is no longer needed in PHP 8.0+
+ */
+function vsprintf(string $format, array $args): string
+{
+ error_clear_last();
+ $result = \vsprintf($format, $args);
+ if ($result === false) {
+ throw StringsException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/docker-compose.yml b/vendor/thecodingmachine/safe/docker-compose.yml
new file mode 100644
index 000000000..c4a24c466
--- /dev/null
+++ b/vendor/thecodingmachine/safe/docker-compose.yml
@@ -0,0 +1,7 @@
+version: '3.7'
+services:
+
+ app:
+ image: thecodingmachine/php:8.1-v4-apache
+ volumes:
+ - ./:/var/www/html
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/PdfException.php b/vendor/thecodingmachine/safe/generated/Exceptions/GettextException.php
index bcf36b3ce..0228ce234 100644
--- a/vendor/thecodingmachine/safe/generated/Exceptions/PdfException.php
+++ b/vendor/thecodingmachine/safe/generated/Exceptions/GettextException.php
@@ -1,7 +1,7 @@
<?php
namespace Safe\Exceptions;
-class PdfException extends \ErrorException implements SafeExceptionInterface
+class GettextException extends \ErrorException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/IngresiiException.php b/vendor/thecodingmachine/safe/generated/Exceptions/IngresiiException.php
deleted file mode 100644
index ca40822e9..000000000
--- a/vendor/thecodingmachine/safe/generated/Exceptions/IngresiiException.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-namespace Safe\Exceptions;
-
-class IngresiiException extends \ErrorException implements SafeExceptionInterface
-{
- public static function createFromPhpError(): self
- {
- $error = error_get_last();
- return new self($error['message'] ?? 'An error occured', 0, $error['type'] ?? 1);
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/MsqlException.php b/vendor/thecodingmachine/safe/generated/Exceptions/MsqlException.php
deleted file mode 100644
index c67314ea8..000000000
--- a/vendor/thecodingmachine/safe/generated/Exceptions/MsqlException.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-namespace Safe\Exceptions;
-
-class MsqlException extends \ErrorException implements SafeExceptionInterface
-{
- public static function createFromPhpError(): self
- {
- $error = error_get_last();
- return new self($error['message'] ?? 'An error occured', 0, $error['type'] ?? 1);
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php b/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php
deleted file mode 100644
index 5e9b55944..000000000
--- a/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndMsException.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-namespace Safe\Exceptions;
-
-class MysqlndMsException extends \ErrorException implements SafeExceptionInterface
-{
- public static function createFromPhpError(): self
- {
- $error = error_get_last();
- return new self($error['message'] ?? 'An error occured', 0, $error['type'] ?? 1);
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php b/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php
deleted file mode 100644
index 4db9f4911..000000000
--- a/vendor/thecodingmachine/safe/generated/Exceptions/MysqlndQcException.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-namespace Safe\Exceptions;
-
-class MysqlndQcException extends \ErrorException implements SafeExceptionInterface
-{
- public static function createFromPhpError(): self
- {
- $error = error_get_last();
- return new self($error['message'] ?? 'An error occured', 0, $error['type'] ?? 1);
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/apache.php b/vendor/thecodingmachine/safe/generated/apache.php
index e71c32d7b..2bb3632a9 100644
--- a/vendor/thecodingmachine/safe/generated/apache.php
+++ b/vendor/thecodingmachine/safe/generated/apache.php
@@ -26,8 +26,6 @@ function apache_get_version(): string
* Retrieve an Apache environment variable specified by
* variable.
*
- * This function requires Apache 2 otherwise it's undefined.
- *
* @param string $variable The Apache environment variable
* @param bool $walk_to_top Whether to get the top-level variable available to all Apache layers.
* @return string The value of the Apache environment variable on success
@@ -46,18 +44,46 @@ function apache_getenv(string $variable, bool $walk_to_top = false): string
/**
- * Fetches all HTTP request headers from the current request. Works in the
- * Apache, FastCGI, CLI, FPM and NSAPI server module
- * in Netscape/iPlanet/SunONE webservers.
- *
- * @return array An associative array of all the HTTP headers in the current request.
+ * This performs a partial request for a URI. It goes just far
+ * enough to obtain all the important information about the given
+ * resource.
+ *
+ * @param string $filename The filename (URI) that's being requested.
+ * @return object An object of related URI information. The properties of
+ * this object are:
+ *
+ *
+ * status
+ * the_request
+ * status_line
+ * method
+ * content_type
+ * handler
+ * uri
+ * filename
+ * path_info
+ * args
+ * boundary
+ * no_cache
+ * no_local_copy
+ * allowed
+ * send_bodyct
+ * bytes_sent
+ * byterange
+ * clength
+ * unparsed_uri
+ * mtime
+ * request_time
+ *
+ *
+ * Returns FALSE on failure.
* @throws ApacheException
*
*/
-function apache_request_headers(): array
+function apache_lookup_uri(string $filename): object
{
error_clear_last();
- $result = \apache_request_headers();
+ $result = \apache_lookup_uri($filename);
if ($result === false) {
throw ApacheException::createFromPhpError();
}
@@ -66,31 +92,27 @@ function apache_request_headers(): array
/**
- * apache_reset_timeout resets the Apache write timer,
- * which defaults to 300 seconds. With set_time_limit(0);
- * ignore_user_abort(true) and periodic
- * apache_reset_timeout calls, Apache can theoretically
- * run forever.
- *
- * This function requires Apache 1.
+ * Fetches all HTTP request headers from the current request. Works in the
+ * Apache, FastCGI, CLI, and FPM webservers.
*
+ * @return array An associative array of all the HTTP headers in the current request.
* @throws ApacheException
*
*/
-function apache_reset_timeout(): void
+function apache_request_headers(): array
{
error_clear_last();
- $result = \apache_reset_timeout();
+ $result = \apache_request_headers();
if ($result === false) {
throw ApacheException::createFromPhpError();
}
+ return $result;
}
/**
* Fetch all HTTP response headers. Works in the
- * Apache, FastCGI, CLI, FPM and NSAPI server module
- * in Netscape/iPlanet/SunONE webservers.
+ * Apache, FastCGI, CLI, and FPM webservers.
*
* @return array An array of all Apache response headers on success.
* @throws ApacheException
@@ -163,14 +185,14 @@ function getallheaders(): array
* To run the sub-request, all buffers are terminated and flushed to the
* browser, pending headers are sent too.
*
- * @param string $filename The file that the virtual command will be performed on.
+ * @param string $uri The file that the virtual command will be performed on.
* @throws ApacheException
*
*/
-function virtual(string $filename): void
+function virtual(string $uri): void
{
error_clear_last();
- $result = \virtual($filename);
+ $result = \virtual($uri);
if ($result === false) {
throw ApacheException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/array.php b/vendor/thecodingmachine/safe/generated/array.php
index 80c90ff81..39a77b5e4 100644
--- a/vendor/thecodingmachine/safe/generated/array.php
+++ b/vendor/thecodingmachine/safe/generated/array.php
@@ -5,140 +5,11 @@ namespace Safe;
use Safe\Exceptions\ArrayException;
/**
- * Creates an array by using the values from the
- * keys array as keys and the values from the
- * values array as the corresponding values.
- *
- * @param array $keys Array of keys to be used. Illegal values for key will be
- * converted to string.
- * @param array $values Array of values to be used
- * @return array Returns the combined array, FALSE if the number of elements
- * for each array isn't equal.
- * @throws ArrayException
- *
- */
-function array_combine(array $keys, array $values): array
-{
- error_clear_last();
- $result = \array_combine($keys, $values);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * array_flip returns an array in flip
- * order, i.e. keys from array become values and values
- * from array become keys.
- *
- * Note that the values of array need to be valid
- * keys, i.e. they need to be either integer or
- * string. A warning will be emitted if a value has the wrong
- * type, and the key/value pair in question will not be included
- * in the result.
- *
- * If a value has several occurrences, the latest key will be
- * used as its value, and all others will be lost.
- *
- * @param array $array An array of key/value pairs to be flipped.
- * @return array Returns the flipped array on success.
- * @throws ArrayException
- *
- */
-function array_flip(array $array): array
-{
- error_clear_last();
- $result = \array_flip($array);
- if ($result === null) {
- throw ArrayException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * array_replace_recursive replaces the values of
- * array1 with the same values from all the following
- * arrays. If a key from the first array exists in the second array, its value
- * will be replaced by the value from the second array. If the key exists in the
- * second array, and not the first, it will be created in the first array.
- * If a key only exists in the first array, it will be left as is.
- * If several arrays are passed for replacement, they will be processed
- * in order, the later array overwriting the previous values.
- *
- * array_replace_recursive is recursive : it will recurse into
- * arrays and apply the same process to the inner value.
- *
- * When the value in the first array is scalar, it will be replaced
- * by the value in the second array, may it be scalar or array.
- * When the value in the first array and the second array
- * are both arrays, array_replace_recursive will replace
- * their respective value recursively.
- *
- * @param array $array1 The array in which elements are replaced.
- * @param array $params Optional. Arrays from which elements will be extracted.
- * @return array Returns an array.
- * @throws ArrayException
- *
- */
-function array_replace_recursive(array $array1, array ...$params): array
-{
- error_clear_last();
- if ($params !== []) {
- $result = \array_replace_recursive($array1, ...$params);
- } else {
- $result = \array_replace_recursive($array1);
- }
- if ($result === null) {
- throw ArrayException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * array_replace replaces the values of
- * array1 with values having the same keys in each of the following
- * arrays. If a key from the first array exists in the second array, its value
- * will be replaced by the value from the second array. If the key exists in the
- * second array, and not the first, it will be created in the first array.
- * If a key only exists in the first array, it will be left as is.
- * If several arrays are passed for replacement, they will be processed
- * in order, the later arrays overwriting the previous values.
- *
- * array_replace is not recursive : it will replace
- * values in the first array by whatever type is in the second array.
- *
- * @param array $array1 The array in which elements are replaced.
- * @param array $params Arrays from which elements will be extracted.
- * Values from later arrays overwrite the previous values.
- * @return array Returns an array.
- * @throws ArrayException
- *
- */
-function array_replace(array $array1, array ...$params): array
-{
- error_clear_last();
- if ($params !== []) {
- $result = \array_replace($array1, ...$params);
- } else {
- $result = \array_replace($array1);
- }
- if ($result === null) {
- throw ArrayException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* Applies the user-defined callback function to each
* element of the array. This function will recurse
* into deeper arrays.
*
- * @param array $array The input array.
+ * @param array|object $array The input array.
* @param callable $callback Typically, callback takes on two parameters.
* The array parameter's value being the first, and
* the key/index second.
@@ -149,168 +20,20 @@ function array_replace(array $array1, array ...$params): array
* reference. Then,
* any changes made to those elements will be made in the
* original array itself.
- * @param mixed $userdata If the optional userdata parameter is supplied,
+ * @param mixed $arg If the optional arg parameter is supplied,
* it will be passed as the third parameter to the
* callback.
* @throws ArrayException
*
*/
-function array_walk_recursive(array &$array, callable $callback, $userdata = null): void
-{
- error_clear_last();
- $result = \array_walk_recursive($array, $callback, $userdata);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * This function sorts an array such that array indices maintain their
- * correlation with the array elements they are associated with.
- *
- * This is used mainly when sorting associative arrays where the actual
- * element order is significant.
- *
- * @param array $array The input array.
- * @param int $sort_flags You may modify the behavior of the sort using the optional parameter
- * sort_flags, for details see
- * sort.
- * @throws ArrayException
- *
- */
-function arsort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \arsort($array, $sort_flags);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * This function sorts an array such that array indices maintain
- * their correlation with the array elements they are associated
- * with. This is used mainly when sorting associative arrays where
- * the actual element order is significant.
- *
- * @param array $array The input array.
- * @param int $sort_flags You may modify the behavior of the sort using the optional
- * parameter sort_flags, for details
- * see sort.
- * @throws ArrayException
- *
- */
-function asort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \asort($array, $sort_flags);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * Sorts an array by key in reverse order, maintaining key to data
- * correlations. This is useful mainly for associative arrays.
- *
- * @param array $array The input array.
- * @param int $sort_flags You may modify the behavior of the sort using the optional parameter
- * sort_flags, for details see
- * sort.
- * @throws ArrayException
- *
- */
-function krsort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \krsort($array, $sort_flags);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * Sorts an array by key, maintaining key to data correlations. This is
- * useful mainly for associative arrays.
- *
- * @param array $array The input array.
- * @param int $sort_flags You may modify the behavior of the sort using the optional
- * parameter sort_flags, for details
- * see sort.
- * @throws ArrayException
- *
- */
-function ksort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \ksort($array, $sort_flags);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * natcasesort is a case insensitive version of
- * natsort.
- *
- * This function implements a sort algorithm that orders
- * alphanumeric strings in the way a human being would while maintaining
- * key/value associations. This is described as a "natural ordering".
- *
- * @param array $array The input array.
- * @throws ArrayException
- *
- */
-function natcasesort(array &$array): void
+function array_walk_recursive(&$array, callable $callback, $arg = null): void
{
error_clear_last();
- $result = \natcasesort($array);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
+ if ($arg !== null) {
+ $result = \array_walk_recursive($array, $callback, $arg);
+ } else {
+ $result = \array_walk_recursive($array, $callback);
}
-}
-
-
-/**
- * This function implements a sort algorithm that orders alphanumeric strings
- * in the way a human being would while maintaining key/value associations.
- * This is described as a "natural ordering". An example of the difference
- * between this algorithm and the regular computer string sorting algorithms
- * (used in sort) can be seen in the example below.
- *
- * @param array $array The input array.
- * @throws ArrayException
- *
- */
-function natsort(array &$array): void
-{
- error_clear_last();
- $result = \natsort($array);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * This function sorts an array in reverse order (highest to lowest).
- *
- * @param array $array The input array.
- * @param int $sort_flags You may modify the behavior of the sort using the optional
- * parameter sort_flags, for details see
- * sort.
- * @throws ArrayException
- *
- */
-function rsort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \rsort($array, $sort_flags);
if ($result === false) {
throw ArrayException::createFromPhpError();
}
@@ -334,131 +57,3 @@ function shuffle(array &$array): void
throw ArrayException::createFromPhpError();
}
}
-
-
-/**
- * This function sorts an array. Elements will be arranged from
- * lowest to highest when this function has completed.
- *
- * @param array $array The input array.
- * @param int $sort_flags The optional second parameter sort_flags
- * may be used to modify the sorting behavior using these values:
- *
- * Sorting type flags:
- *
- *
- * SORT_REGULAR - compare items normally;
- * the details are described in the comparison operators section
- *
- *
- * SORT_NUMERIC - compare items numerically
- *
- *
- * SORT_STRING - compare items as strings
- *
- *
- *
- * SORT_LOCALE_STRING - compare items as
- * strings, based on the current locale. It uses the locale,
- * which can be changed using setlocale
- *
- *
- *
- *
- * SORT_NATURAL - compare items as strings
- * using "natural ordering" like natsort
- *
- *
- *
- *
- * SORT_FLAG_CASE - can be combined
- * (bitwise OR) with
- * SORT_STRING or
- * SORT_NATURAL to sort strings case-insensitively
- *
- *
- *
- * @throws ArrayException
- *
- */
-function sort(array &$array, int $sort_flags = SORT_REGULAR): void
-{
- error_clear_last();
- $result = \sort($array, $sort_flags);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * This function sorts an array such that array indices maintain their
- * correlation with the array elements they are associated with, using a
- * user-defined comparison function.
- *
- * This is used mainly when sorting associative arrays where the actual
- * element order is significant.
- *
- * @param array $array The input array.
- * @param callable $value_compare_func See usort and uksort for
- * examples of user-defined comparison functions.
- * @throws ArrayException
- *
- */
-function uasort(array &$array, callable $value_compare_func): void
-{
- error_clear_last();
- $result = \uasort($array, $value_compare_func);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * uksort will sort the keys of an array using a
- * user-supplied comparison function. If the array you wish to sort
- * needs to be sorted by some non-trivial criteria, you should use
- * this function.
- *
- * @param array $array The input array.
- * @param callable $key_compare_func The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
- * Note that before PHP 7.0.0 this integer had to be in the range from -2147483648 to 2147483647.
- * @throws ArrayException
- *
- */
-function uksort(array &$array, callable $key_compare_func): void
-{
- error_clear_last();
- $result = \uksort($array, $key_compare_func);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
-
-
-/**
- * This function will sort an array by its values using a user-supplied
- * comparison function. If the array you wish to sort needs to be sorted by
- * some non-trivial criteria, you should use this function.
- *
- * @param array $array The input array.
- * @param callable $value_compare_func The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
- * Note that before PHP 7.0.0 this integer had to be in the range from -2147483648 to 2147483647.
- *
- * Returning non-integer values from the comparison
- * function, such as float, will result in an internal cast to
- * integer of the callback's return value. So values such as
- * 0.99 and 0.1 will both be cast to an integer value of 0, which will
- * compare such values as equal.
- * @throws ArrayException
- *
- */
-function usort(array &$array, callable $value_compare_func): void
-{
- error_clear_last();
- $result = \usort($array, $value_compare_func);
- if ($result === false) {
- throw ArrayException::createFromPhpError();
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/bzip2.php b/vendor/thecodingmachine/safe/generated/bzip2.php
index 77302aa00..8087c748a 100644
--- a/vendor/thecodingmachine/safe/generated/bzip2.php
+++ b/vendor/thecodingmachine/safe/generated/bzip2.php
@@ -23,8 +23,9 @@ function bzclose($bz): void
/**
- * Forces a write of all buffered bzip2 data for the file pointer
- * bz.
+ * This function is supposed to force a write of all buffered bzip2 data for the file pointer
+ * bz,
+ * but is implemented as null function in libbz2, and as such does nothing.
*
* @param resource $bz The file pointer. It must be valid and must point to a file
* successfully opened by bzopen.
diff --git a/vendor/thecodingmachine/safe/generated/calendar.php b/vendor/thecodingmachine/safe/generated/calendar.php
index aae699923..a5b03905e 100644
--- a/vendor/thecodingmachine/safe/generated/calendar.php
+++ b/vendor/thecodingmachine/safe/generated/calendar.php
@@ -5,21 +5,24 @@ namespace Safe;
use Safe\Exceptions\CalendarException;
/**
- * This function will return a Unix timestamp corresponding to the
- * Julian Day given in jday or FALSE if
- * jday is outside of the allowed range. The time returned is
- * UTC.
+ * Return the Julian Day for a Unix timestamp
+ * (seconds since 1.1.1970), or for the current day if no
+ * timestamp is given. Either way, the time is regarded
+ * as local time (not UTC).
*
- * @param int $jday A julian day number between 2440588 and 106751993607888
- * on 64bit systems, or between 2440588 and 2465443 on 32bit systems.
- * @return int The unix timestamp for the start (midnight, not noon) of the given Julian day.
+ * @param int $timestamp A unix timestamp to convert.
+ * @return int A julian day number as integer.
* @throws CalendarException
*
*/
-function jdtounix(int $jday): int
+function unixtojd(int $timestamp = null): int
{
error_clear_last();
- $result = \jdtounix($jday);
+ if ($timestamp !== null) {
+ $result = \unixtojd($timestamp);
+ } else {
+ $result = \unixtojd();
+ }
if ($result === false) {
throw CalendarException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/classobj.php b/vendor/thecodingmachine/safe/generated/classobj.php
index 98147ac26..dd2535aef 100644
--- a/vendor/thecodingmachine/safe/generated/classobj.php
+++ b/vendor/thecodingmachine/safe/generated/classobj.php
@@ -6,19 +6,19 @@ use Safe\Exceptions\ClassobjException;
/**
* Creates an alias named alias
- * based on the user defined class original.
+ * based on the user defined class class.
* The aliased class is exactly the same as the original class.
*
- * @param string $original The original class.
+ * @param string $class The original class.
* @param string $alias The alias name for the class.
* @param bool $autoload Whether to autoload if the original class is not found.
* @throws ClassobjException
*
*/
-function class_alias(string $original, string $alias, bool $autoload = true): void
+function class_alias(string $class, string $alias, bool $autoload = true): void
{
error_clear_last();
- $result = \class_alias($original, $alias, $autoload);
+ $result = \class_alias($class, $alias, $autoload);
if ($result === false) {
throw ClassobjException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/com.php b/vendor/thecodingmachine/safe/generated/com.php
index 53643f9d7..68e058f2d 100644
--- a/vendor/thecodingmachine/safe/generated/com.php
+++ b/vendor/thecodingmachine/safe/generated/com.php
@@ -5,34 +5,55 @@ namespace Safe;
use Safe\Exceptions\ComException;
/**
+ * Generates a Globally Unique Identifier (GUID).
+ *
+ * A GUID is generated in the same way as DCE UUID's, except that the
+ * Microsoft convention is to enclose a GUID in curly braces.
+ *
+ * @return string Returns the GUID as a string.
+ * @throws ComException
+ *
+ */
+function com_create_guid(): string
+{
+ error_clear_last();
+ $result = \com_create_guid();
+ if ($result === false) {
+ throw ComException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Instructs COM to sink events generated by
- * comobject into the PHP object
- * sinkobject.
+ * variant into the PHP object
+ * sink_object.
*
* Be careful how you use this feature; if you are doing something similar
* to the example below, then it doesn't really make sense to run it in a
* web server context.
*
- * @param object $comobject
- * @param object $sinkobject sinkobject should be an instance of a class with
+ * @param object $variant
+ * @param object $sink_object sink_object should be an instance of a class with
* methods named after those of the desired dispinterface; you may use
* com_print_typeinfo to help generate a template class
* for this purpose.
- * @param mixed $sinkinterface PHP will attempt to use the default dispinterface type specified by
- * the typelibrary associated with comobject, but
+ * @param mixed $sink_interface PHP will attempt to use the default dispinterface type specified by
+ * the typelibrary associated with variant, but
* you may override this choice by setting
- * sinkinterface to the name of the dispinterface
+ * sink_interface to the name of the dispinterface
* that you want to use.
* @throws ComException
*
*/
-function com_event_sink(object $comobject, object $sinkobject, $sinkinterface = null): void
+function com_event_sink(object $variant, object $sink_object, $sink_interface = null): void
{
error_clear_last();
- if ($sinkinterface !== null) {
- $result = \com_event_sink($comobject, $sinkobject, $sinkinterface);
+ if ($sink_interface !== null) {
+ $result = \com_event_sink($variant, $sink_object, $sink_interface);
} else {
- $result = \com_event_sink($comobject, $sinkobject);
+ $result = \com_event_sink($variant, $sink_object);
}
if ($result === false) {
throw ComException::createFromPhpError();
@@ -44,15 +65,15 @@ function com_event_sink(object $comobject, object $sinkobject, $sinkinterface =
* Loads a type-library and registers its constants in the engine, as though
* they were defined using define.
*
- * Note that it is much more efficient to use the configuration setting to pre-load and
+ * Note that it is much more efficient to use the com.typelib-file php.ini setting to pre-load and
* register the constants, although not so flexible.
*
- * If you have turned on , then
+ * If com.autoregister-typelib is turned on, then
* PHP will attempt to automatically register the constants associated with a
* COM object when you instantiate it. This depends on the interfaces
* provided by the COM object itself, and may not always be possible.
*
- * @param string $typelib_name typelib_name can be one of the following:
+ * @param string $typelib typelib can be one of the following:
*
*
*
@@ -86,16 +107,16 @@ function com_event_sink(object $comobject, object $sinkobject, $sinkinterface =
*
* The type library name, e.g. Microsoft OLE DB ActiveX Data
* Objects 1.0 Library.
- * @param bool $case_sensitive The case_sensitive behaves inversely to
+ * @param bool $case_insensitive The case_insensitive behaves inversely to
* the parameter $case_insensitive in the define
* function.
* @throws ComException
*
*/
-function com_load_typelib(string $typelib_name, bool $case_sensitive = true): void
+function com_load_typelib(string $typelib, bool $case_insensitive = true): void
{
error_clear_last();
- $result = \com_load_typelib($typelib_name, $case_sensitive);
+ $result = \com_load_typelib($typelib, $case_insensitive);
if ($result === false) {
throw ComException::createFromPhpError();
}
@@ -108,20 +129,68 @@ function com_load_typelib(string $typelib_name, bool $case_sensitive = true): vo
* object, provided that it supports enough of the introspection interfaces,
* and that you know the name of the interface you want to display.
*
- * @param object $comobject comobject should be either an instance of a COM
+ * @param object $variant variant should be either an instance of a COM
* object, or be the name of a typelibrary (which will be resolved according
* to the rules set out in com_load_typelib).
- * @param string $dispinterface The name of an IDispatch descendant interface that you want to display.
- * @param bool $wantsink If set to TRUE, the corresponding sink interface will be displayed
+ * @param string $dispatch_interface The name of an IDispatch descendant interface that you want to display.
+ * @param bool $display_sink If set to TRUE, the corresponding sink interface will be displayed
* instead.
* @throws ComException
*
*/
-function com_print_typeinfo(object $comobject, string $dispinterface = null, bool $wantsink = false): void
+function com_print_typeinfo(object $variant, string $dispatch_interface = null, bool $display_sink = false): void
{
error_clear_last();
- $result = \com_print_typeinfo($comobject, $dispinterface, $wantsink);
+ if ($display_sink !== false) {
+ $result = \com_print_typeinfo($variant, $dispatch_interface, $display_sink);
+ } elseif ($dispatch_interface !== null) {
+ $result = \com_print_typeinfo($variant, $dispatch_interface);
+ } else {
+ $result = \com_print_typeinfo($variant);
+ }
if ($result === false) {
throw ComException::createFromPhpError();
}
}
+
+
+/**
+ * Converts variant from a VT_DATE
+ * (or similar) value into a Unix timestamp. This allows easier
+ * interopability between the Unix-ish parts of PHP and COM.
+ *
+ * @param object $variant The variant.
+ * @return int Returns a unix timestamp.
+ * @throws ComException
+ *
+ */
+function variant_date_to_timestamp(object $variant): int
+{
+ error_clear_last();
+ $result = \variant_date_to_timestamp($variant);
+ if ($result === null) {
+ throw ComException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the value of value rounded to
+ * decimals decimal places.
+ *
+ * @param mixed $value The variant.
+ * @param int $decimals Number of decimal places.
+ * @return mixed Returns the rounded value.
+ * @throws ComException
+ *
+ */
+function variant_round($value, int $decimals)
+{
+ error_clear_last();
+ $result = \variant_round($value, $decimals);
+ if ($result === null) {
+ throw ComException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/generated/cubrid.php b/vendor/thecodingmachine/safe/generated/cubrid.php
index f19f2d56e..559bc9735 100644
--- a/vendor/thecodingmachine/safe/generated/cubrid.php
+++ b/vendor/thecodingmachine/safe/generated/cubrid.php
@@ -5,6 +5,433 @@ namespace Safe;
use Safe\Exceptions\CubridException;
/**
+ * The cubrid_bind function is used to bind values to a
+ * corresponding named or question mark placeholder in the SQL statement that
+ * was passed to cubrid_prepare. If
+ * bind_value_type is not given, string will be the
+ * default.
+ *
+ * The following table shows the types of substitute values.
+ *
+ *
+ * CUBRID Bind Date Types
+ *
+ *
+ *
+ * Support
+ * Bind Type
+ * Corresponding SQL Type
+ *
+ *
+ *
+ *
+ * Supported
+ * STRING
+ * CHAR, VARCHAR
+ *
+ *
+ *
+ * NCHAR
+ * NCHAR, NVARCHAR
+ *
+ *
+ *
+ * BIT
+ * BIT, VARBIT
+ *
+ *
+ *
+ * NUMERIC or NUMBER
+ * SHORT, INT, NUMERIC
+ *
+ *
+ *
+ * FLOAT
+ * FLOAT
+ *
+ *
+ *
+ * DOUBLE
+ * DOUBLE
+ *
+ *
+ *
+ * TIME
+ * TIME
+ *
+ *
+ *
+ * DATE
+ * DATE
+ *
+ *
+ *
+ * TIMESTAMP
+ * TIMESTAMP
+ *
+ *
+ *
+ * OBJECT
+ * OBJECT
+ *
+ *
+ *
+ * ENUM
+ * ENUM
+ *
+ *
+ *
+ * BLOB
+ * BLOB
+ *
+ *
+ *
+ * CLOB
+ * CLOB
+ *
+ *
+ *
+ * NULL
+ * NULL
+ *
+ *
+ * Not supported
+ * SET
+ * SET
+ *
+ *
+ *
+ * MULTISET
+ * MULTISET
+ *
+ *
+ *
+ * SEQUENCE
+ * SEQUENCE
+ *
+ *
+ *
+ *
+ *
+ * @param resource $req_identifier Request identifier as a result of
+ * cubrid_prepare.
+ * @param int $bind_index Location of binding parameters. It starts with 1.
+ * @param mixed $bind_value Actual value for binding.
+ * @param string $bind_value_type A type of the value to bind. (It is omitted by default.
+ * Thus, the system internally uses string by default. However, you need to
+ * specify the exact type of the value as an argument when they are NCHAR,
+ * BIT, or BLOB/CLOB).
+ * @throws CubridException
+ *
+ */
+function cubrid_bind($req_identifier, int $bind_index, $bind_value, string $bind_value_type = null): void
+{
+ error_clear_last();
+ if ($bind_value_type !== null) {
+ $result = \cubrid_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
+ } else {
+ $result = \cubrid_bind($req_identifier, $bind_index, $bind_value);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_col_size function is used to get the
+ * number of elements in a collection type (set, multiset, sequence)
+ * attribute.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID the instance that you want to work with.
+ * @param string $attr_name Name of the attribute that you want to work with.
+ * @return int Number of elements, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_col_size($conn_identifier, string $oid, string $attr_name): int
+{
+ error_clear_last();
+ $result = \cubrid_col_size($conn_identifier, $oid, $attr_name);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_column_names function is used to get the
+ * column names of the query result by using req_identifier.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @return array Array of string values containing the column names, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_column_names($req_identifier): array
+{
+ error_clear_last();
+ $result = \cubrid_column_names($req_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_column_types function gets column types of
+ * query results by using req_identifier.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @return array Array of string values containing the column types, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_column_types($req_identifier): array
+{
+ error_clear_last();
+ $result = \cubrid_column_types($req_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_commit function is used to execute commit
+ * on the transaction pointed by conn_identifier,
+ * currently in progress. Connection to the server is closed after the
+ * cubrid_commit function is called; However,
+ * the connection handle is still valid.
+ *
+ * In CUBRID PHP, auto-commit mode is disabled by default for transaction management.
+ * You can set it by using cubrid_set_autocommit.
+ * You can get its status by using cubrid_get_autocommit. Before you start a transaction,
+ * remember to disable the auto-commit mode.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @throws CubridException
+ *
+ */
+function cubrid_commit($conn_identifier): void
+{
+ error_clear_last();
+ $result = \cubrid_commit($conn_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_connect_with_url function is used to
+ * establish the environment for connecting to your server by using connection
+ * information passed with an url string argument. If the HA feature is
+ * enabled in CUBRID, you must specify the connection information of the
+ * standby server, which is used for failover when failure occurs, in the url
+ * string argument of this function. If the user name and password is not
+ * given, then the "PUBLIC" connection will be made by default.
+ *
+ * &lt;url&gt; ::= CUBRID:&lt;host&gt;:&lt;db_name&gt;:&lt;db_user&gt;:&lt;db_password&gt;:[?&lt;properties&gt;]
+ *
+ * &lt;properties&gt; ::= &lt;property&gt; [&amp;&lt;property&gt;]
+ *
+ * &lt;properties&gt; ::= alhosts=&lt;alternative_hosts&gt;[ &amp;rctime=&lt;time&gt;]
+ *
+ * &lt;properties&gt; ::= login_timeout=&lt;milli_sec&gt;
+ *
+ * &lt;properties&gt; ::= query_timeout=&lt;milli_sec&gt;
+ *
+ * &lt;properties&gt; ::= disconnect_on_query_timeout=true|false
+ *
+ * &lt;alternative_hosts&gt; ::= &lt;standby_broker1_host&gt;:&lt;port&gt; [,&lt;standby_broker2_host&gt;:&lt;port&gt;]
+ *
+ * &lt;host&gt; := HOSTNAME | IP_ADDR
+ *
+ * &lt;time&gt; := SECOND
+ *
+ * &lt;milli_sec&gt; := MILLI SECOND
+ *
+ *
+ * host : A host name or IP address of the master database
+ * db_name : A name of the database
+ * db_user : A name of the database user
+ * db_password : A database user password
+ *
+ * alhosts : Specifies the broker information of the standby server, which is
+ * used for failover when it is impossible to connect to the active server.
+ * You can specify multiple brokers for failover, and the connection to the brokers
+ * is attempted in the order listed in alhosts
+ *
+ * rctime : An interval between the attempts to connect to the active broker in
+ * which failure occurred. After a failure occurs, the system connects to the
+ * broker specified by althosts (failover), terminates the transaction, and then
+ * attempts to connect to the active broker of the master database at every rctime.
+ * The default value is 600 seconds.
+ *
+ * login_timeout : Timeout value (unit: msec.) for database login. The default
+ * value is 0, which means infinite postponement.
+ *
+ *
+ * query_timeout : Timeout value (unit: msec.) for query request. Upon timeout,
+ * a message to cancel requesting a query transferred to server is sent. The return
+ * value can depend on the disconnect_on_query_timeout configuration; even though the
+ * message to cancel a request is sent to server, that request may succeed.
+ *
+ *
+ * disconnect_on_query_timeout : Configures a value whether to immediately return
+ * an error of function being executed upon timeout. The default value is false.
+ *
+ *
+ *
+ * @param string $conn_url A character string that contains server connection information.
+ * @param string $userid User name for the database.
+ * @param string $passwd User password.
+ * @param bool $new_link If a second call is made to
+ * cubrid_connect_with_url with the same arguments,
+ * no new connection will be established, but instead, the connection
+ * identifier of the already opened connection will be returned. The
+ * new_link parameter modifies this behavior and
+ * makes cubrid_connect_with_url always open a new
+ * connection, even if cubrid_connect_with_url was
+ * called before with the same parameters.
+ * @return resource Connection identifier, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_connect_with_url(string $conn_url, string $userid = null, string $passwd = null, bool $new_link = false)
+{
+ error_clear_last();
+ if ($new_link !== false) {
+ $result = \cubrid_connect_with_url($conn_url, $userid, $passwd, $new_link);
+ } elseif ($passwd !== null) {
+ $result = \cubrid_connect_with_url($conn_url, $userid, $passwd);
+ } elseif ($userid !== null) {
+ $result = \cubrid_connect_with_url($conn_url, $userid);
+ } else {
+ $result = \cubrid_connect_with_url($conn_url);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_connect function is used to establish the
+ * environment for connecting to your server by using your server address,
+ * port number, database name, user name, and password. If the user name and
+ * password is not given, then the "PUBLIC" connection will be made by
+ * default.
+ *
+ * @param string $host Host name or IP address of CUBRID CAS server.
+ * @param int $port Port number of CUBRID CAS server (BROKER_PORT configured in $CUBRID/conf/cubrid_broker.conf).
+ * @param string $dbname Name of database.
+ * @param string $userid User name for the database. If not given, the default
+ * value is "public".
+ * @param string $passwd User password. If not given, the default value is "".
+ * @param bool $new_link If a second call is made to
+ * cubrid_connect with the same arguments, no new
+ * connection will be established, but instead, the connection identifier
+ * of the already opened connection will be returned. The
+ * new_link parameter modifies this behavior and
+ * makes cubrid_connect always open a new connection,
+ * even if cubrid_connect was called before with the
+ * same parameters.
+ * @return resource Connection identifier, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_connect(string $host, int $port, string $dbname, string $userid = null, string $passwd = null, bool $new_link = false)
+{
+ error_clear_last();
+ if ($new_link !== false) {
+ $result = \cubrid_connect($host, $port, $dbname, $userid, $passwd, $new_link);
+ } elseif ($passwd !== null) {
+ $result = \cubrid_connect($host, $port, $dbname, $userid, $passwd);
+ } elseif ($userid !== null) {
+ $result = \cubrid_connect($host, $port, $dbname, $userid);
+ } else {
+ $result = \cubrid_connect($host, $port, $dbname);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_current_oid function is used to get the
+ * oid of the current cursor location from the query result. To use
+ * cubrid_current_oid, the query executed must be a
+ * updatable query, and the CUBRID_INCLUDE_OID option must be included during
+ * the query execution.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @return string Oid of current cursor location, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_current_oid($req_identifier): string
+{
+ error_clear_last();
+ $result = \cubrid_current_oid($req_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_disconnect function closes the connection
+ * handle and disconnects from server. If any request handle is not closed at this point,
+ * it will be closed. It is similar to the CUBRID MySQL compatible function cubrid_close.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @throws CubridException
+ *
+ */
+function cubrid_disconnect($conn_identifier = null): void
+{
+ error_clear_last();
+ if ($conn_identifier !== null) {
+ $result = \cubrid_disconnect($conn_identifier);
+ } else {
+ $result = \cubrid_disconnect();
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_drop function is used to delete an
+ * instance from database by using the oid of the instance.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid Oid of the instance that you want to delete.
+ * @throws CubridException
+ *
+ */
+function cubrid_drop($conn_identifier, string $oid): void
+{
+ error_clear_last();
+ $result = \cubrid_drop($conn_identifier, $oid);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
* This function frees the memory occupied by the result data. It returns
* TRUE on success. Note that it can only frees the
* client fetch buffer now, and if you want free all memory, use function
@@ -30,9 +457,7 @@ function cubrid_free_result($req_identifier): void
* cubrid_client_encoding.
*
* @param resource $conn_identifier The CUBRID connection.
- * @return string A string that represents the CUBRID connection charset; on success.
- *
- * FALSE on failure.
+ * @return string A string that represents the CUBRID connection charset on success.
* @throws CubridException
*
*/
@@ -48,11 +473,31 @@ function cubrid_get_charset($conn_identifier): string
/**
- * This function returns a string that represents the client library version.
+ * The cubrid_get_class_name function is used to get the
+ * class name from oid. It doesn't work when selecting data from the system tables,
+ * for example db_class.
*
- * @return string A string that represents the client library version; on success.
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance that you want to check the existence.
+ * @return string Class name when process is successful.
+ * @throws CubridException
*
- * FALSE on failure.
+ */
+function cubrid_get_class_name($conn_identifier, string $oid): string
+{
+ error_clear_last();
+ $result = \cubrid_get_class_name($conn_identifier, $oid);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * This function returns a string that represents the client library version.
+ *
+ * @return string A string that represents the client library version on success.
* @throws CubridException
*
*/
@@ -68,9 +513,8 @@ function cubrid_get_client_info(): string
/**
- * This function returns the CUBRID database parameters or it returns FALSE on
- * failure. It returns an associative array with the values for the following
- * parameters:
+ * This function returns the CUBRID database parameters.
+ * It returns an associative array with the values for the following parameters:
*
*
* PARAM_ISOLATION_LEVEL
@@ -178,8 +622,6 @@ function cubrid_get_client_info(): string
* @param resource $conn_identifier The CUBRID connection. If the connection identifier is not specified,
* the last link opened by cubrid_connect is assumed.
* @return array An associative array with CUBRID database parameters; on success.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -195,12 +637,30 @@ function cubrid_get_db_parameter($conn_identifier): array
/**
+ * The cubrid_get_query_timeout function is used to get
+ * the query timeout of the request.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @return int Returns the query timeout value in milliseconds of the current request on success.
+ * @throws CubridException
+ *
+ */
+function cubrid_get_query_timeout($req_identifier): int
+{
+ error_clear_last();
+ $result = \cubrid_get_query_timeout($req_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* This function returns a string that represents the CUBRID server version.
*
* @param resource $conn_identifier The CUBRID connection.
- * @return string A string that represents the CUBRID server version; on success.
- *
- * FALSE on failure.
+ * @return string A string that represents the CUBRID server version on success.
* @throws CubridException
*
*/
@@ -248,6 +708,199 @@ function cubrid_insert_id($conn_identifier = null): string
/**
+ * cubrid_lob_close is used to close all BLOB/CLOB
+ * returned from cubrid_lob_get.
+ *
+ * @param array $lob_identifier_array LOB identifier array returned from cubrid_lob_get.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob_close(array $lob_identifier_array): void
+{
+ error_clear_last();
+ $result = \cubrid_lob_close($lob_identifier_array);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * cubrid_lob_export is used to get BLOB/CLOB data from CUBRID database, and saves its contents to a file.
+ * To use this function, you must use cubrid_lob_get first to get BLOB/CLOB info from CUBRID.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param resource $lob_identifier LOB identifier.
+ * @param string $path_name Path name of the file.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob_export($conn_identifier, $lob_identifier, string $path_name): void
+{
+ error_clear_last();
+ $result = \cubrid_lob_export($conn_identifier, $lob_identifier, $path_name);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * cubrid_lob_get is used to get BLOB/CLOB meta info from CUBRID database,
+ * CUBRID gets BLOB/CLOB by executing the SQL statement, and returns all LOBs as a resource array.
+ * Be sure that the SQL retrieves only one column and its data type is BLOB or CLOB.
+ *
+ * Remember to use cubrid_lob_close to release the LOBs if you don't need it any more.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $sql SQL statement to be executed.
+ * @return array Return an array of LOB resources, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob_get($conn_identifier, string $sql): array
+{
+ error_clear_last();
+ $result = \cubrid_lob_get($conn_identifier, $sql);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * cubrid_lob_send reads BLOB/CLOB data and passes it straight through to the browser.
+ * To use this function, you must use cubrid_lob_get first to get BLOB/CLOB info from CUBRID.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param resource $lob_identifier LOB identifier.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob_send($conn_identifier, $lob_identifier): void
+{
+ error_clear_last();
+ $result = \cubrid_lob_send($conn_identifier, $lob_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * cubrid_lob_size is used to get BLOB/CLOB data size.
+ *
+ * @param resource $lob_identifier LOB identifier.
+ * @return string A string representing LOB data size, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob_size($lob_identifier): string
+{
+ error_clear_last();
+ $result = \cubrid_lob_size($lob_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_lob2_bind function is used to bind BLOB/CLOB datas
+ * to a corresponding question mark placeholder in the SQL statement that was passed
+ * to cubrid_prepare. If bind_value_type
+ * is not given, string will be "BLOB" as the default. But if you use
+ * cubrid_lob2_new before, bind_value_type
+ * will be consistent with type in cubrid_lob2_new as the default.
+ *
+ * @param resource $req_identifier Request identifier as a result of cubrid_prepare.
+ * @param int $bind_index Location of binding parameters. It starts with 1.
+ * @param mixed $bind_value Actual value for binding.
+ * @param string $bind_value_type It must be "BLOB" or "CLOB" and it won't be case-sensitive. If it not be given, the default value is "BLOB".
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_bind($req_identifier, int $bind_index, $bind_value, string $bind_value_type = null): void
+{
+ error_clear_last();
+ if ($bind_value_type !== null) {
+ $result = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value, $bind_value_type);
+ } else {
+ $result = \cubrid_lob2_bind($req_identifier, $bind_index, $bind_value);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lob2_close function is used to close LOB object
+ * returned from cubrid_lob2_new or got from the result set.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_close($lob_identifier): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_close($lob_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lob2_export function is used to save the
+ * contents of BLOB/CLOB data to a file. To use this function, you must use
+ * cubrid_lob2_new or fetch a lob object from CUBRID
+ * database first. If the file already exists, the operation will fail.
+ * This function will not influence the cursor position of the lob object.
+ * It operates the entire lob object.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param string $file_name File name you want to store BLOB/CLOB data. It also supports the path of the file.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_export($lob_identifier, string $file_name): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_export($lob_identifier, $file_name);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lob2_import function is used to save the
+ * contents of BLOB/CLOB data from a file. To use this function, you must use
+ * cubrid_lob2_new or fetch a lob object from CUBRID database
+ * first. If the file already exists, the operation will fail.
+ * This function will not influence the cursor position of the lob object.
+ * It operates the entire lob object.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param string $file_name File name you want to import BLOB/CLOB data. It also supports the path of the file.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_import($lob_identifier, string $file_name): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_import($lob_identifier, $file_name);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
* The cubrid_lob2_new function is used to create a lob object (both BLOB and CLOB).
* This function should be used before you bind a lob object.
*
@@ -256,8 +909,6 @@ function cubrid_insert_id($conn_identifier = null): string
* cubrid_connect_with_url is assumed.
* @param string $type It may be "BLOB" or "CLOB", it won't be case-sensitive. The default value is "BLOB".
* @return resource Lob identifier when it is successful.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -279,12 +930,108 @@ function cubrid_lob2_new($conn_identifier = null, string $type = "BLOB")
/**
+ * The cubrid_lob2_read function reads len bytes from the
+ * LOB data and returns the bytes read.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param int $len Length from buffer you want to read from the lob data.
+ * @return string Returns the contents as a string, FALSE when there is no more data.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_read($lob_identifier, int $len): string
+{
+ error_clear_last();
+ $result = \cubrid_lob2_read($lob_identifier, $len);
+ if ($result === null) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_lob2_seek function is used to move the cursor
+ * position of a lob object by the value set in the offset
+ * argument, to the direction set in the origin argument.
+ *
+ * To set the origin argument, you can use CUBRID_CURSOR_FIRST
+ * to set the cursor position moving forward offset units from
+ * the first beginning. In this case, offset must be a positive value.
+ *
+ * If you use CUBRID_CURSOR_CURRENT for origin, you can move
+ * forward or backward. and offset can be positive or negative.
+ *
+ * If you use CUBRID_CURSOR_LAST for origin, you can move
+ * backward offset units from the end of LOB object and
+ * offset only can be positive.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param int $offset Number of units you want to move the cursor.
+ * @param int $origin This parameter can be the following values:
+ *
+ * CUBRID_CURSOR_FIRST: move forward from the first beginning.
+ *
+ * CUBRID_CURSOR_CURRENT: move forward or backward from the current position.
+ *
+ * CUBRID_CURSOR_LAST: move backward at the end of LOB object.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_seek($lob_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_seek($lob_identifier, $offset, $origin);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lob2_seek64 function is used to move the cursor
+ * position of a lob object by the value set in the offset
+ * argument, to the direction set in the origin argument.
+ * If the offset you want to move is larger than an integer
+ * data can be stored, you can use this function.
+ *
+ * To set the origin argument, you can use CUBRID_CURSOR_FIRST
+ * to set the cursor position moving forward offset units from
+ * the first beginning. In this case, offset must be a positive value.
+ *
+ * If you use CUBRID_CURSOR_CURRENT for origin, you can move
+ * forward or backward. and offset can be positive or negative.
+ *
+ * If you use CUBRID_CURSOR_LAST for origin, you can move backward
+ * offset units from the end of LOB object and offset only can be positive.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param string $offset Number of units you want to move the cursor.
+ * @param int $origin This parameter can be the following values:
+ *
+ * CUBRID_CURSOR_FIRST: move forward from the first beginning.
+ *
+ * CUBRID_CURSOR_CURRENT: move forward or backward from the current position.
+ *
+ * CUBRID_CURSOR_LAST: move backward at the end of LOB object.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_seek64($lob_identifier, string $offset, int $origin = CUBRID_CURSOR_CURRENT): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_seek64($lob_identifier, $offset, $origin);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
* The cubrid_lob2_size function is used to get the size of a lob object.
*
* @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
* @return int It will return the size of the LOB object when it processes successfully.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -307,8 +1054,6 @@ function cubrid_lob2_size($lob_identifier): int
*
* @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
* @return string It will return the size of the LOB object as a string when it processes successfully.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -328,8 +1073,6 @@ function cubrid_lob2_size64($lob_identifier): string
*
* @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
* @return int It will return the cursor position on the LOB object when it processes successfully.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -352,8 +1095,6 @@ function cubrid_lob2_tell($lob_identifier): int
*
* @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
* @return string It will return the cursor position on the LOB object as a string when it processes successfully.
- *
- * FALSE on failure.
* @throws CubridException
*
*/
@@ -369,6 +1110,867 @@ function cubrid_lob2_tell64($lob_identifier): string
/**
+ * The cubrid_lob2_write function reads as much as data
+ * from buf and stores it to the LOB object. Note that
+ * this function can only append characters now.
+ *
+ * @param resource $lob_identifier Lob identifier as a result of cubrid_lob2_new or get from the result set.
+ * @param string $buf Data that need to be written to the lob object.
+ * @throws CubridException
+ *
+ */
+function cubrid_lob2_write($lob_identifier, string $buf): void
+{
+ error_clear_last();
+ $result = \cubrid_lob2_write($lob_identifier, $buf);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lock_read function is used to put read
+ * lock on the instance pointed by given oid.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance that you want to put read lock on.
+ * @throws CubridException
+ *
+ */
+function cubrid_lock_read($conn_identifier, string $oid): void
+{
+ error_clear_last();
+ $result = \cubrid_lock_read($conn_identifier, $oid);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_lock_write function is used to put write
+ * lock on the instance pointed by the given oid.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance that you want to put write lock on.
+ * @throws CubridException
+ *
+ */
+function cubrid_lock_write($conn_identifier, string $oid): void
+{
+ error_clear_last();
+ $result = \cubrid_lock_write($conn_identifier, $oid);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_move_cursor function is used to move the
+ * current cursor location of req_identifier by the
+ * value set in the offset argument, to the direction
+ * set in the origin argument. To set the
+ * origin argument, you can use CUBRID_CURSOR_FIRST
+ * for the first part of the result, CUBRID_CURSOR_CURRENT for the current
+ * location of the result, or CUBRID_CURSOR_LAST for the last part of the
+ * result. If origin argument is not explicitly
+ * designated, then the function uses CUBRID_CURSOR_CURRENT as its default
+ * value.
+ *
+ * If the value of cursor movement range goes over the valid limit, then the
+ * cursor moves to the next location after the valid range for the cursor.
+ * For example, if you move 20 units in the result with the size of 10, then
+ * the cursor will move to 11th place and return CUBRID_NO_MORE_DATA.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @param int $offset Number of units you want to move the cursor.
+ * @param int $origin Location where you want to move the cursor from CUBRID_CURSOR_FIRST, CUBRID_CURSOR_CURRENT, CUBRID_CURSOR_LAST.
+ * @return int Returns TRUE on success.
+ * @throws CubridException
+ *
+ */
+function cubrid_move_cursor($req_identifier, int $offset, int $origin = CUBRID_CURSOR_CURRENT): int
+{
+ error_clear_last();
+ $result = \cubrid_move_cursor($req_identifier, $offset, $origin);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_next_result function is used to get
+ * results of next query if multiple SQL statements are executed and
+ * CUBRID_EXEC_QUERY_ALL flag is set upon
+ * cubrid_execute.
+ *
+ * @param resource $result result comes from a call to cubrid_execute
+ * @throws CubridException
+ *
+ */
+function cubrid_next_result($result): void
+{
+ error_clear_last();
+ $result = \cubrid_next_result($result);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Establishes a persistent connection to a CUBRID server.
+ *
+ * cubrid_pconnect_with_url acts very much like
+ * cubrid_connect_with_url with two major differences.
+ *
+ * First, when connecting, the function would first try to find a (persistent)
+ * link that's already open with the same host, port, dbname and userid. If
+ * one is found, an identifier for it will be returned instead of opening a
+ * new connection.
+ *
+ * Second, the connection to the SQL server will not be closed when the
+ * execution of the script ends. Instead, the link will remain open for
+ * future use (cubrid_close or
+ * cubrid_disconnect will not close links established by
+ * cubrid_pconnect_with_url).
+ *
+ * This type of link is therefore called 'persistent'.
+ *
+ * &lt;url&gt; ::= CUBRID:&lt;host&gt;:&lt;db_name&gt;:&lt;db_user&gt;:&lt;db_password&gt;:[?&lt;properties&gt;]
+ *
+ * &lt;properties&gt; ::= &lt;property&gt; [&amp;&lt;property&gt;]
+ *
+ * &lt;properties&gt; ::= alhosts=&lt;alternative_hosts&gt;[ &amp;rctime=&lt;time&gt;]
+ *
+ * &lt;properties&gt; ::= login_timeout=&lt;milli_sec&gt;
+ *
+ * &lt;properties&gt; ::= query_timeout=&lt;milli_sec&gt;
+ *
+ * &lt;properties&gt; ::= disconnect_on_query_timeout=true|false
+ *
+ * &lt;alternative_hosts&gt; ::= &lt;standby_broker1_host&gt;:&lt;port&gt; [,&lt;standby_broker2_host&gt;:&lt;port&gt;]
+ *
+ * &lt;host&gt; := HOSTNAME | IP_ADDR
+ *
+ * &lt;time&gt; := SECOND
+ *
+ * &lt;milli_sec&gt; := MILLI SECOND
+ *
+ *
+ * host : A host name or IP address of the master database
+ * db_name : A name of the database
+ * db_user : A name of the database user
+ * db_password : A database user password
+ *
+ * alhosts : Specifies the broker information of the standby server, which is
+ * used for failover when it is impossible to connect to the active server.
+ * You can specify multiple brokers for failover, and the connection to the brokers
+ * is attempted in the order listed in alhosts
+ *
+ * rctime : An interval between the attempts to connect to the active broker in
+ * which failure occurred. After a failure occurs, the system connects to the
+ * broker specified by althosts (failover), terminates the transaction, and then
+ * attempts to connect to the active broker of the master database at every rctime.
+ * The default value is 600 seconds.
+ *
+ * login_timeout : Timeout value (unit: msec.) for database login. The default
+ * value is 0, which means infinite postponement.
+ *
+ *
+ * query_timeout : Timeout value (unit: msec.) for query request. Upon timeout,
+ * a message to cancel requesting a query transferred to server is sent. The return
+ * value can depend on the disconnect_on_query_timeout configuration; even though the
+ * message to cancel a request is sent to server, that request may succeed.
+ *
+ *
+ * disconnect_on_query_timeout : Configures a value whether to immediately return
+ * an error of function being executed upon timeout. The default value is false.
+ *
+ *
+ *
+ * @param string $conn_url A character string that contains server connection information.
+ * @param string $userid User name for the database.
+ * @param string $passwd User password.
+ * @return resource Connection identifier, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_pconnect_with_url(string $conn_url, string $userid = null, string $passwd = null)
+{
+ error_clear_last();
+ if ($passwd !== null) {
+ $result = \cubrid_pconnect_with_url($conn_url, $userid, $passwd);
+ } elseif ($userid !== null) {
+ $result = \cubrid_pconnect_with_url($conn_url, $userid);
+ } else {
+ $result = \cubrid_pconnect_with_url($conn_url);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Establishes a persistent connection to a CUBRID server.
+ *
+ * cubrid_pconnect acts very much like
+ * cubrid_connect with two major differences.
+ *
+ * First, when connecting, the function would first try to find a (persistent)
+ * link that's already open with the same host, port, dbname and userid. If
+ * one is found, an identifier for it will be returned instead of opening a
+ * new connection.
+ *
+ * Second, the connection to the SQL server will not be closed when the
+ * execution of the script ends. Instead, the link will remain open for
+ * future use (cubrid_close or
+ * cubrid_disconnect will not close links established by
+ * cubrid_pconnect).
+ *
+ * This type of link is therefore called 'persistent'.
+ *
+ * @param string $host Host name or IP address of CUBRID CAS server.
+ * @param int $port Port number of CUBRID CAS server (BROKER_PORT configured in $CUBRID/conf/cubrid_broker.conf).
+ * @param string $dbname Name of database.
+ * @param string $userid User name for the database.
+ * @param string $passwd User password.
+ * @return resource Connection identifier, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_pconnect(string $host, int $port, string $dbname, string $userid = null, string $passwd = null)
+{
+ error_clear_last();
+ if ($passwd !== null) {
+ $result = \cubrid_pconnect($host, $port, $dbname, $userid, $passwd);
+ } elseif ($userid !== null) {
+ $result = \cubrid_pconnect($host, $port, $dbname, $userid);
+ } else {
+ $result = \cubrid_pconnect($host, $port, $dbname);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_prepare function is a sort of API which represents SQL statements
+ * compiled previously to a given connection handle. This pre-compiled SQL statement will be included
+ * in the cubrid_prepare.
+ *
+ * Accordingly, you can use this statement effectively to execute several times repeatedly or to
+ * process long data. Only a single statement can be used and a parameter may put a question mark (?)
+ * to appropriate area in the SQL statement. Add a parameter when you bind a value in the VALUES
+ * clause of INSERT statement or in the WHERE clause. Note that it is allowed to bind a value to a
+ * MARK(?) by using the cubrid_bind function only.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $prepare_stmt Prepare query.
+ * @param int $option OID return option CUBRID_INCLUDE_OID.
+ * @return resource Request identifier, if process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_prepare($conn_identifier, string $prepare_stmt, int $option = 0)
+{
+ error_clear_last();
+ $result = \cubrid_prepare($conn_identifier, $prepare_stmt, $option);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_put function is used to update an
+ * attribute of the instance of the given oid.
+ *
+ * You can update single attribute by using string data type to set
+ * attr. In such case, you can use integer,
+ * floating point or string type data for the value
+ * argument. To update multiple number of attributes, you can disregard the
+ * attr argument, and set
+ * value argument with associative array data type.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance that you want to update.
+ * @param string $attr Name of the attribute that you want to update.
+ * @param mixed $value New value that you want to assign to the attribute.
+ * @throws CubridException
+ *
+ */
+function cubrid_put($conn_identifier, string $oid, string $attr = null, $value = null): void
+{
+ error_clear_last();
+ if ($value !== null) {
+ $result = \cubrid_put($conn_identifier, $oid, $attr, $value);
+ } elseif ($attr !== null) {
+ $result = \cubrid_put($conn_identifier, $oid, $attr);
+ } else {
+ $result = \cubrid_put($conn_identifier, $oid);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_rollback function executes rollback on the
+ * transaction pointed by conn_identifier, currently in
+ * progress.
+ *
+ * Connection to server is closed after calling
+ * cubrid_rollback. Connection handle, however, is
+ * still valid.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @throws CubridException
+ *
+ */
+function cubrid_rollback($conn_identifier): void
+{
+ error_clear_last();
+ $result = \cubrid_rollback($conn_identifier);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_schema function is used to get the
+ * requested schema information from database. To get information about specific class,
+ * set the class_name, to get information about specific attribute
+ * (can be used only with CUBRID_SCH_ATTR_PRIVILEGE),
+ * set the attr_name.
+ *
+ * The result of the cubrid_schema function is returned as a two-dimensional
+ * array (column (associative array) * row (numeric array)). The following
+ * tables shows types of schema and the column structure of the result array to
+ * be returned based on the schema type.
+ *
+ *
+ * Result Composition of Each Type
+ *
+ *
+ *
+ * Schema
+ * Column Number
+ * Column Name
+ * Value
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_CLASS
+ * 1
+ * NAME
+ *
+ *
+ *
+ *
+ * 2
+ * TYPE
+ * 0:system class 1:vclass 2:class
+ *
+ *
+ *
+ * CUBRID_SCH_VCLASS
+ * 1
+ * NAME
+ *
+ *
+ *
+ *
+ * 2
+ * TYPE
+ * 1:vclass
+ *
+ *
+ *
+ * CUBRID_SCH_QUERY_SPEC
+ * 1
+ * QUERY_SPEC
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_ATTRIBUTE / CUBRID_SCH_CLASS_ATTRIBUTE
+ * 1
+ * ATTR_NAME
+ *
+ *
+ *
+ *
+ * 2
+ * DOMAIN
+ *
+ *
+ *
+ *
+ * 3
+ * SCALE
+ *
+ *
+ *
+ *
+ * 4
+ * PRECISION
+ *
+ *
+ *
+ *
+ * 5
+ * INDEXED
+ * 1:indexed
+ *
+ *
+ *
+ * 6
+ * NOT NULL
+ * 1:not null
+ *
+ *
+ *
+ * 7
+ * SHARED
+ * 1:shared
+ *
+ *
+ *
+ * 8
+ * UNIQUE
+ * 1:unique
+ *
+ *
+ *
+ * 9
+ * DEFAULT
+ *
+ *
+ *
+ *
+ * 10
+ * ATTR_ORDER
+ * base:1
+ *
+ *
+ *
+ * 11
+ * CLASS_NAME
+ *
+ *
+ *
+ *
+ * 12
+ * SOURCE_CLASS
+ *
+ *
+ *
+ *
+ * 13
+ * IS_KEY
+ * 1:key
+ *
+ *
+ *
+ * CUBRID_SCH_METHOD / CUBRID_SCH_CLASS_METHOD
+ * 1
+ * NAME
+ *
+ *
+ *
+ *
+ * 2
+ * RET_DOMAIN
+ *
+ *
+ *
+ *
+ * 3
+ * ARG_DOMAIN
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_METHOD_FILE
+ * 1
+ * METHOD_FILE
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_SUPERCLASS / CUBRID_SCH_DIRECT_SUPER_CLASS / CUBRID_SCH_SUBCLASS
+ * 1
+ * CLASS_NAME
+ *
+ *
+ *
+ *
+ * 2
+ * TYPE
+ * 0:system class 1:vclass 2:class
+ *
+ *
+ *
+ * CUBRID_SCH_CONSTRAINT
+ * 1
+ * TYPE
+ * 0:unique 1:index 2:reverse unique 3:reverse index
+ *
+ *
+ *
+ * 2
+ * NAME
+ *
+ *
+ *
+ *
+ * 3
+ * ATTR_NAME
+ *
+ *
+ *
+ *
+ * 4
+ * NUM_PAGES
+ *
+ *
+ *
+ *
+ * 5
+ * NUM_KEYS
+ *
+ *
+ *
+ *
+ * 6
+ * PRIMARY_KEY
+ * 1:primary key
+ *
+ *
+ *
+ * 7
+ * KEY_ORDER
+ * base:1
+ *
+ *
+ *
+ * CUBRID_SCH_TRIGGER
+ * 1
+ * NAME
+ *
+ *
+ *
+ *
+ * 2
+ * STATUS
+ *
+ *
+ *
+ *
+ * 3
+ * EVENT
+ *
+ *
+ *
+ *
+ * 4
+ * TARGET_CLASS
+ *
+ *
+ *
+ *
+ * 5
+ * TARGET_ATTR
+ *
+ *
+ *
+ *
+ * 6
+ * ACTION_TIME
+ *
+ *
+ *
+ *
+ * 7
+ * ACTION
+ *
+ *
+ *
+ *
+ * 8
+ * PRIORITY
+ *
+ *
+ *
+ *
+ * 9
+ * CONDITION_TIME
+ *
+ *
+ *
+ *
+ * 10
+ * CONDITION
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_CLASS_PRIVILEGE / CUBRID_SCH_ATTR_PRIVILEGE
+ * 1
+ * CLASS_NAME / ATTR_NAME
+ *
+ *
+ *
+ *
+ * 2
+ * PRIVILEGE
+ *
+ *
+ *
+ *
+ * 3
+ * GRANTABLE
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_PRIMARY_KEY
+ * 1
+ * CLASS_NAME
+ *
+ *
+ *
+ *
+ * 2
+ * ATTR_NAME
+ *
+ *
+ *
+ *
+ * 3
+ * KEY_SEQ
+ * base:1
+ *
+ *
+ *
+ * 4
+ * KEY_NAME
+ *
+ *
+ *
+ *
+ * CUBRID_SCH_IMPORTED_KEYS / CUBRID_SCH_EXPORTED_KEYS / CUBRID_SCH_CROSS_REFERENCE
+ * 1
+ * PKTABLE_NAME
+ *
+ *
+ *
+ *
+ * 2
+ * PKCOLUMN_NAME
+ *
+ *
+ *
+ *
+ * 3
+ * FKTABLE_NAME
+ * base:1
+ *
+ *
+ *
+ * 4
+ * FKCOLUMN_NAME
+ *
+ *
+ *
+ *
+ * 5
+ * KEY_SEQ
+ * base:1
+ *
+ *
+ *
+ * 6
+ * UPDATE_ACTION
+ * 0:cascade 1:restrict 2:no action 3:set null
+ *
+ *
+ *
+ * 7
+ * DELETE_ACTION
+ * 0:cascade 1:restrict 2:no action 3:set null
+ *
+ *
+ *
+ * 8
+ * FK_NAME
+ *
+ *
+ *
+ *
+ * 9
+ * PK_NAME
+ *
+ *
+ *
+ *
+ *
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param int $schema_type Schema data that you want to know.
+ * @param string $class_name Class you want to know the schema of.
+ * @param string $attr_name Attribute you want to know the schema of.
+ * @return array Array containing the schema information, when process is successful.
+ * @throws CubridException
+ *
+ */
+function cubrid_schema($conn_identifier, int $schema_type, string $class_name = null, string $attr_name = null): array
+{
+ error_clear_last();
+ if ($attr_name !== null) {
+ $result = \cubrid_schema($conn_identifier, $schema_type, $class_name, $attr_name);
+ } elseif ($class_name !== null) {
+ $result = \cubrid_schema($conn_identifier, $schema_type, $class_name);
+ } else {
+ $result = \cubrid_schema($conn_identifier, $schema_type);
+ }
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The cubrid_seq_drop function is used to delete an
+ * element you request from the given sequence type attribute in the
+ * database.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance you want to work with.
+ * @param string $attr_name Name of the attribute that you want to delete an element from.
+ * @param int $index Index of the element that you want to delete (1-based).
+ * @throws CubridException
+ *
+ */
+function cubrid_seq_drop($conn_identifier, string $oid, string $attr_name, int $index): void
+{
+ error_clear_last();
+ $result = \cubrid_seq_drop($conn_identifier, $oid, $attr_name, $index);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_col_insert function is used to insert an
+ * element to a sequence type attribute in a requested location.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance you want to work with.
+ * @param string $attr_name Name of the attribute you want to insert an instance to.
+ * @param int $index Location of the element, you want to insert the element to (1-based).
+ * @param string $seq_element Content of the element that you want to insert.
+ * @throws CubridException
+ *
+ */
+function cubrid_seq_insert($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
+{
+ error_clear_last();
+ $result = \cubrid_seq_insert($conn_identifier, $oid, $attr_name, $index, $seq_element);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_seq_put function is used to update the
+ * content of the requested element in a sequent type attribute using OID.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance you want to work with.
+ * @param string $attr_name Name of the attribute that you want to update an element.
+ * @param int $index Index (1-based) of the element that you want to update.
+ * @param string $seq_element New content that you want to use for the update.
+ * @throws CubridException
+ *
+ */
+function cubrid_seq_put($conn_identifier, string $oid, string $attr_name, int $index, string $seq_element): void
+{
+ error_clear_last();
+ $result = \cubrid_seq_put($conn_identifier, $oid, $attr_name, $index, $seq_element);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_set_add function is used to insert a
+ * single element to a set type attribute (set, multiset, sequence) you
+ * requested.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance you want to work with.
+ * @param string $attr_name Name of the attribute you want to insert an element.
+ * @param string $set_element Content of the element you want to insert.
+ * @throws CubridException
+ *
+ */
+function cubrid_set_add($conn_identifier, string $oid, string $attr_name, string $set_element): void
+{
+ error_clear_last();
+ $result = \cubrid_set_add($conn_identifier, $oid, $attr_name, $set_element);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_set_autocommit function is used to set the
+ * CUBRID database auto-commit mode of the current database connection.
+ *
+ * In CUBRID PHP, auto-commit mode is disabled by default for transaction
+ * management. When auto-commit mode is truned from off to on, any pending work is
+ * automatically committed.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param bool $mode Auto-commit mode. The following constants can be used:
+ *
+ *
+ * CUBRID_AUTOCOMMIT_FALSE
+ * CUBRID_AUTOCOMMIT_TRUE
+ *
+ * @throws CubridException
+ *
+ */
+function cubrid_set_autocommit($conn_identifier, bool $mode): void
+{
+ error_clear_last();
+ $result = \cubrid_set_autocommit($conn_identifier, $mode);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
* The cubrid_set_db_parameter function is used to set
* the CUBRID database parameters. It can set the following CUBRID database
* parameters:
@@ -393,3 +1995,44 @@ function cubrid_set_db_parameter($conn_identifier, int $param_type, int $param_v
throw CubridException::createFromPhpError();
}
}
+
+
+/**
+ * The cubrid_set_drop function is used to delete an
+ * element that you request from the given set type (set, multiset) attribute
+ * of the database.
+ *
+ * @param resource $conn_identifier Connection identifier.
+ * @param string $oid OID of the instance you want to work with.
+ * @param string $attr_name Name of the attribute you want to delete an element from.
+ * @param string $set_element Content of the element you want to delete.
+ * @throws CubridException
+ *
+ */
+function cubrid_set_drop($conn_identifier, string $oid, string $attr_name, string $set_element): void
+{
+ error_clear_last();
+ $result = \cubrid_set_drop($conn_identifier, $oid, $attr_name, $set_element);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
+
+
+/**
+ * The cubrid_set_query_timeout function is used to set
+ * the timeout time of query execution.
+ *
+ * @param resource $req_identifier Request identifier.
+ * @param int $timeout Timeout time in milliseconds.
+ * @throws CubridException
+ *
+ */
+function cubrid_set_query_timeout($req_identifier, int $timeout): void
+{
+ error_clear_last();
+ $result = \cubrid_set_query_timeout($req_identifier, $timeout);
+ if ($result === false) {
+ throw CubridException::createFromPhpError();
+ }
+}
diff --git a/vendor/thecodingmachine/safe/generated/curl.php b/vendor/thecodingmachine/safe/generated/curl.php
index 53f925536..3c89871c3 100644
--- a/vendor/thecodingmachine/safe/generated/curl.php
+++ b/vendor/thecodingmachine/safe/generated/curl.php
@@ -5,21 +5,41 @@ namespace Safe;
use Safe\Exceptions\CurlException;
/**
+ * Copies a cURL handle keeping the same preferences.
+ *
+ * @param \CurlHandle $handle A cURL handle returned by
+ * curl_init.
+ * @return \CurlHandle Returns a new cURL handle.
+ * @throws CurlException
+ *
+ */
+function curl_copy_handle(\CurlHandle $handle): \CurlHandle
+{
+ error_clear_last();
+ $result = \curl_copy_handle($handle);
+ if ($result === false) {
+ throw CurlException::createFromPhpError($handle);
+ }
+ return $result;
+}
+
+
+/**
* This function URL encodes the given string according to RFC 3986.
*
- * @param resource $ch A cURL handle returned by
+ * @param \CurlHandle $handle A cURL handle returned by
* curl_init.
- * @param string $str The string to be encoded.
+ * @param string $string The string to be encoded.
* @return string Returns escaped string.
* @throws CurlException
*
*/
-function curl_escape($ch, string $str): string
+function curl_escape(\CurlHandle $handle, string $string): string
{
error_clear_last();
- $result = \curl_escape($ch, $str);
+ $result = \curl_escape($handle, $string);
if ($result === false) {
- throw CurlException::createFromCurlResource($ch);
+ throw CurlException::createFromPhpError($handle);
}
return $result;
}
@@ -31,7 +51,7 @@ function curl_escape($ch, string $str): string
* This function should be called after initializing a cURL session and all
* the options for the session are set.
*
- * @param resource $ch A cURL handle returned by
+ * @param \CurlHandle $handle A cURL handle returned by
* curl_init.
* @return bool|string Returns TRUE on success. However, if the CURLOPT_RETURNTRANSFER
* option is set, it will return
@@ -39,12 +59,12 @@ function curl_escape($ch, string $str): string
* @throws CurlException
*
*/
-function curl_exec($ch)
+function curl_exec(\CurlHandle $handle)
{
error_clear_last();
- $result = \curl_exec($ch);
+ $result = \curl_exec($handle);
if ($result === false) {
- throw CurlException::createFromCurlResource($ch);
+ throw CurlException::createFromPhpError($handle);
}
return $result;
}
@@ -53,9 +73,9 @@ function curl_exec($ch)
/**
* Gets information about the last transfer.
*
- * @param resource $ch A cURL handle returned by
+ * @param \CurlHandle $handle A cURL handle returned by
* curl_init.
- * @param int $opt This may be one of the following constants:
+ * @param int $option This may be one of the following constants:
*
*
*
@@ -65,7 +85,7 @@ function curl_exec($ch)
*
*
* CURLINFO_HTTP_CODE - The last response code.
- * As of PHP 5.5.0 and cURL 7.10.8, this is a legacy alias of
+ * As of cURL 7.10.8, this is a legacy alias of
* CURLINFO_RESPONSE_CODE
*
*
@@ -367,9 +387,9 @@ function curl_exec($ch)
*
*
*
- * @return mixed If opt is given, returns its value.
+ * @return mixed If option is given, returns its value.
* Otherwise, returns an associative array with the following elements
- * (which correspond to opt):
+ * (which correspond to option):
*
*
*
@@ -512,16 +532,16 @@ function curl_exec($ch)
* @throws CurlException
*
*/
-function curl_getinfo($ch, int $opt = null)
+function curl_getinfo(\CurlHandle $handle, int $option = null)
{
error_clear_last();
- if ($opt !== null) {
- $result = \curl_getinfo($ch, $opt);
+ if ($option !== null) {
+ $result = \curl_getinfo($handle, $option);
} else {
- $result = \curl_getinfo($ch);
+ $result = \curl_getinfo($handle);
}
if ($result === false) {
- throw CurlException::createFromCurlResource($ch);
+ throw CurlException::createFromPhpError($handle);
}
return $result;
}
@@ -538,34 +558,18 @@ function curl_getinfo($ch, int $opt = null)
*
* The file protocol is disabled by cURL if
* open_basedir is set.
- * @return resource Returns a cURL handle on success, FALSE on errors.
+ * @return \CurlHandle Returns a cURL handle on success, FALSE on errors.
* @throws CurlException
*
*/
-function curl_init(string $url = null)
+function curl_init(string $url = null): \CurlHandle
{
error_clear_last();
- $result = \curl_init($url);
- if ($result === false) {
- throw CurlException::createFromPhpError();
+ if ($url !== null) {
+ $result = \curl_init($url);
+ } else {
+ $result = \curl_init();
}
- return $result;
-}
-
-
-/**
- * Return an integer containing the last multi curl error number.
- *
- * @param resource $mh A cURL multi handle returned by
- * curl_multi_init.
- * @return int Return an integer containing the last multi curl error number.
- * @throws CurlException
- *
- */
-function curl_multi_errno($mh): int
-{
- error_clear_last();
- $result = \curl_multi_errno($mh);
if ($result === false) {
throw CurlException::createFromPhpError();
}
@@ -580,12 +584,12 @@ function curl_multi_errno($mh): int
*
* Repeated calls to this function will return a new result each time, until a FALSE is returned
* as a signal that there is no more to get at this point. The integer pointed to with
- * msgs_in_queue will contain the number of remaining messages after this
+ * queued_messages will contain the number of remaining messages after this
* function was called.
*
- * @param resource $mh A cURL multi handle returned by
+ * @param \CurlMultiHandle $multi_handle A cURL multi handle returned by
* curl_multi_init.
- * @param int|null $msgs_in_queue Number of messages that are still in the queue
+ * @param int|null $queued_messages Number of messages that are still in the queue
* @return array On success, returns an associative array for the message, FALSE on failure.
*
*
@@ -618,12 +622,12 @@ function curl_multi_errno($mh): int
* @throws CurlException
*
*/
-function curl_multi_info_read($mh, ?int &$msgs_in_queue = null): array
+function curl_multi_info_read(\CurlMultiHandle $multi_handle, ?int &$queued_messages = null): array
{
error_clear_last();
- $result = \curl_multi_info_read($mh, $msgs_in_queue);
+ $result = \curl_multi_info_read($multi_handle, $queued_messages);
if ($result === false) {
- throw CurlException::createFromPhpError();
+ throw CurlException::createFromPhpError($multi_handle);
}
return $result;
}
@@ -632,11 +636,11 @@ function curl_multi_info_read($mh, ?int &$msgs_in_queue = null): array
/**
* Allows the processing of multiple cURL handles asynchronously.
*
- * @return resource Returns a cURL multi handle resource on success, FALSE on failure.
+ * @return \CurlMultiHandle Returns a cURL multi handle on success, FALSE on failure.
* @throws CurlException
*
*/
-function curl_multi_init()
+function curl_multi_init(): \CurlMultiHandle
{
error_clear_last();
$result = \curl_multi_init();
@@ -648,9 +652,154 @@ function curl_multi_init()
/**
+ *
+ *
+ * @param \CurlMultiHandle $multi_handle
+ * @param int $option One of the CURLMOPT_* constants.
+ * @param mixed $value The value to be set on option.
+ *
+ * value should be an int for the
+ * following values of the option parameter:
+ *
+ *
+ *
+ *
+ * Option
+ * Set value to
+ *
+ *
+ *
+ *
+ * CURLMOPT_PIPELINING
+ *
+ * Pass 1 to enable or 0 to disable. Enabling pipelining on a multi
+ * handle will make it attempt to perform HTTP Pipelining as far as
+ * possible for transfers using this handle. This means that if you add
+ * a second request that can use an already existing connection, the
+ * second request will be "piped" on the same connection.
+ * As of cURL 7.43.0, the value is a bitmask, and you can also pass 2 to try to multiplex the new
+ * transfer over an existing HTTP/2 connection if possible.
+ * Passing 3 instructs cURL to ask for pipelining and multiplexing
+ * independently of each other.
+ * As of cURL 7.62.0, setting the pipelining bit has no effect.
+ * Instead of integer literals, you can also use the CURLPIPE_*
+ * constants if available.
+ *
+ *
+ *
+ * CURLMOPT_MAXCONNECTS
+ *
+ * Pass a number that will be used as the maximum amount of
+ * simultaneously open connections that libcurl may cache.
+ * By default the size will be enlarged to fit four times the number
+ * of handles added via curl_multi_add_handle.
+ * When the cache is full, curl closes the oldest one in the cache
+ * to prevent the number of open connections from increasing.
+ *
+ *
+ *
+ * CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE
+ *
+ * Pass a number that specifies the chunk length threshold for pipelining
+ * in bytes.
+ *
+ *
+ *
+ * CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE
+ *
+ * Pass a number that specifies the size threshold for pipelining
+ * penalty in bytes.
+ *
+ *
+ *
+ * CURLMOPT_MAX_HOST_CONNECTIONS
+ *
+ * Pass a number that specifies the maximum number of connections to a
+ * single host.
+ *
+ *
+ *
+ * CURLMOPT_MAX_PIPELINE_LENGTH
+ *
+ * Pass a number that specifies the maximum number of requests in a
+ * pipeline.
+ *
+ *
+ *
+ * CURLMOPT_MAX_TOTAL_CONNECTIONS
+ *
+ * Pass a number that specifies the maximum number of simultaneously
+ * open connections.
+ *
+ *
+ *
+ * CURLMOPT_PUSHFUNCTION
+ *
+ * Pass a callable that will be registered to handle server
+ * pushes and should have the following signature:
+ *
+ * intpushfunction
+ * resourceparent_ch
+ * resourcepushed_ch
+ * arrayheaders
+ *
+ *
+ *
+ * parent_ch
+ *
+ *
+ * The parent cURL handle (the request the client made).
+ *
+ *
+ *
+ *
+ * pushed_ch
+ *
+ *
+ * A new cURL handle for the pushed request.
+ *
+ *
+ *
+ *
+ * headers
+ *
+ *
+ * The push promise headers.
+ *
+ *
+ *
+ *
+ * The push function is supposed to return either
+ * CURL_PUSH_OK if it can handle the push, or
+ * CURL_PUSH_DENY to reject it.
+ *
+ *
+ *
+ *
+ *
+ *
+ * The parent cURL handle (the request the client made).
+ *
+ * A new cURL handle for the pushed request.
+ *
+ * The push promise headers.
+ * @throws CurlException
+ *
+ */
+function curl_multi_setopt(\CurlMultiHandle $multi_handle, int $option, $value): void
+{
+ error_clear_last();
+ $result = \curl_multi_setopt($multi_handle, $option, $value);
+ if ($result === false) {
+ throw CurlException::createFromPhpError($multi_handle);
+ }
+}
+
+
+/**
* Sets an option on the given cURL session handle.
*
- * @param resource $ch A cURL handle returned by
+ * @param \CurlHandle $handle A cURL handle returned by
* curl_init.
* @param int $option The CURLOPT_XXX option to set.
* @param mixed $value The value to be set on option.
@@ -677,18 +826,6 @@ function curl_multi_init()
*
*
*
- * CURLOPT_BINARYTRANSFER
- *
- * TRUE to return the raw output when
- * CURLOPT_RETURNTRANSFER is used.
- *
- *
- * From PHP 5.1.3, this option has no effect: the raw output will
- * always be returned when
- * CURLOPT_RETURNTRANSFER is used.
- *
- *
- *
* CURLOPT_COOKIESESSION
*
* TRUE to mark this as a new cookie "session". It will force libcurl
@@ -709,7 +846,6 @@ function curl_multi_init()
*
*
* Added in cURL 7.19.1.
- * Available since PHP 5.3.2.
* Requires CURLOPT_VERBOSE to be on to have an effect.
*
*
@@ -722,7 +858,6 @@ function curl_multi_init()
*
*
* Added in 7.15.2.
- * Available since PHP 5.5.0.
*
*
*
@@ -819,9 +954,8 @@ function curl_multi_init()
*
* TRUE to follow any
* "Location: " header that the server sends as
- * part of the HTTP header (note this is recursive, PHP will follow as
- * many "Location: " headers that it is sent,
- * unless CURLOPT_MAXREDIRS is set).
+ * part of the HTTP header.
+ * See also CURLOPT_MAXREDIRS.
*
*
*
@@ -889,7 +1023,7 @@ function curl_multi_init()
* the number of small packets on the network.
*
*
- * Available since PHP 5.2.1 for versions compiled with libcurl 7.11.2 or
+ * Available for versions compiled with libcurl 7.11.2 or
* greater.
*
*
@@ -925,7 +1059,7 @@ function curl_multi_init()
* TRUE to track the handle's request string.
*
*
- * Available since PHP 5.1.3. The CURLINFO_
+ * The CURLINFO_
* prefix is intentional.
*
*
@@ -963,7 +1097,7 @@ function curl_multi_init()
* FALSE to get the raw HTTP response body.
*
*
- * Available as of PHP 5.5.0 if built against libcurl &gt;= 7.16.2.
+ * Available if built against libcurl &gt;= 7.16.2.
*
*
*
@@ -1082,21 +1216,6 @@ function curl_multi_init()
*
*
*
- * CURLOPT_SAFE_UPLOAD
- *
- * TRUE to disable support for the @ prefix for
- * uploading files in CURLOPT_POSTFIELDS, which
- * means that values starting with @ can be safely
- * passed as fields. CURLFile may be used for
- * uploads instead.
- *
- *
- * Added in PHP 5.5.0 with FALSE as the default value. PHP 5.6.0
- * changes the default value to TRUE. PHP 7 removes this option;
- * the CURLFile interface must be used to upload files.
- *
- *
- *
* CURLOPT_SASL_IR
*
* TRUE to enable sending the initial response in the first packet.
@@ -1165,6 +1284,18 @@ function curl_multi_init()
*
*
*
+ * CURLOPT_SAFE_UPLOAD
+ *
+ * Always TRUE, what disables support for the @ prefix for
+ * uploading files in CURLOPT_POSTFIELDS, which
+ * means that values starting with @ can be safely
+ * passed as fields. CURLFile may be used for
+ * uploads instead.
+ *
+ *
+ *
+ *
+ *
* CURLOPT_SUPPRESS_CONNECT_HEADERS
*
* TRUE to suppress proxy CONNECT response headers from the user callback functions
@@ -1248,7 +1379,7 @@ function curl_multi_init()
* PHP automatically sets this option to TRUE, this should only be
* changed for debugging purposes.
*
- * value should be an integer for the
+ * value should be an int for the
* following values of the option parameter:
*
*
@@ -1271,21 +1402,6 @@ function curl_multi_init()
*
*
*
- * CURLOPT_CLOSEPOLICY
- *
- * One of the CURLCLOSEPOLICY_* values.
- *
- *
- * This option is deprecated, as it was never implemented in cURL and
- * never had any effect.
- *
- *
- *
- *
- * Removed in PHP 5.6.0.
- *
- *
- *
* CURLOPT_CONNECTTIMEOUT
*
* The number of seconds to wait while trying to connect. Use 0 to
@@ -1305,7 +1421,7 @@ function curl_multi_init()
* timeouts with a minimum timeout allowed of one second.
*
*
- * Added in cURL 7.16.2. Available since PHP 5.2.3.
+ * Added in cURL 7.16.2.
*
*
*
@@ -1472,6 +1588,9 @@ function curl_multi_init()
*
* The maximum amount of HTTP redirections to follow. Use this option
* alongside CURLOPT_FOLLOWLOCATION.
+ * Default value of 20 is set to prevent infinite redirects.
+ * Setting to -1 allows inifinite redirects, and 0
+ * refuses all redirects.
*
*
*
@@ -1493,7 +1612,7 @@ function curl_multi_init()
* specific type of redirect occurs.
*
*
- * Added in cURL 7.19.1. Available since PHP 5.3.2.
+ * Added in cURL 7.19.1.
*
*
*
@@ -1640,10 +1759,11 @@ function curl_multi_init()
*
* CURLOPT_SSL_VERIFYHOST
*
- * 1 to check the existence of a common name in the
- * SSL peer certificate. 2 to check the existence of
- * a common name and also verify that it matches the hostname
- * provided. 0 to not check the names. In production environments the value of this option
+ * 2 to verify that a Common Name field or a Subject Alternate Name
+ * field in the SSL peer certificate matches the provided hostname.
+ * 0 to not check the names.
+ * 1 should not be used.
+ * In production environments the value of this option
* should be kept at 2 (default value).
*
*
@@ -1760,7 +1880,7 @@ function curl_multi_init()
* supports them. If set to 0 (default) keepalive probes are disabled.
*
*
- * Added in cURL 7.25.0. Available since PHP 5.5.0.
+ * Added in cURL 7.25.0.
*
*
*
@@ -1772,7 +1892,7 @@ function curl_multi_init()
* The default is 60.
*
*
- * Added in cURL 7.25.0. Available since PHP 5.5.0.
+ * Added in cURL 7.25.0.
*
*
*
@@ -1784,7 +1904,7 @@ function curl_multi_init()
* The default is 60.
*
*
- * Added in cURL 7.25.0. Available since PHP 5.5.0.
+ * Added in cURL 7.25.0.
*
*
*
@@ -1797,10 +1917,13 @@ function curl_multi_init()
* a "304 Not Modified" header will be returned
* assuming CURLOPT_HEADER is TRUE.
* Use CURL_TIMECOND_IFUNMODSINCE for the reverse
- * effect. CURL_TIMECOND_IFMODSINCE is the
- * default.
+ * effect. Use CURL_TIMECOND_NONE to ignore
+ * CURLOPT_TIMEVALUE and always return the page.
+ * CURL_TIMECOND_NONE is the default.
*
*
+ * Before cURL 7.46.0 the default was
+ * CURL_TIMECOND_IFMODSINCE.
*
*
*
@@ -1822,15 +1945,14 @@ function curl_multi_init()
* timeouts with a minimum timeout allowed of one second.
*
*
- * Added in cURL 7.16.2. Available since PHP 5.2.3.
+ * Added in cURL 7.16.2.
*
*
*
* CURLOPT_TIMEVALUE
*
* The time in seconds since January 1st, 1970. The time will be used
- * by CURLOPT_TIMECONDITION. By default,
- * CURL_TIMECOND_IFMODSINCE is used.
+ * by CURLOPT_TIMECONDITION.
*
*
*
@@ -1857,7 +1979,7 @@ function curl_multi_init()
* Defaults to unlimited speed.
*
*
- * Added in cURL 7.15.5. Available since PHP 5.4.0.
+ * Added in cURL 7.15.5.
*
*
*
@@ -1869,7 +1991,7 @@ function curl_multi_init()
* Defaults to unlimited speed.
*
*
- * Added in cURL 7.15.5. Available since PHP 5.4.0.
+ * Added in cURL 7.15.5.
*
*
*
@@ -1910,15 +2032,12 @@ function curl_multi_init()
* CURLFTPMETHOD_SINGLECWD.
*
*
- * Added in cURL 7.15.1. Available since PHP 5.3.0.
- *
+ * Added in cURL 7.15.1.
*
*
*
*
*
- * This option is deprecated, as it was never implemented in cURL and
- * never had any effect.
*
* The HTTP authentication method(s) to use. The options are:
* CURLAUTH_BASIC,
@@ -2074,7 +2193,7 @@ function curl_multi_init()
* "RELOAD" loads all cookies from the files specified by CURLOPT_COOKIEFILE.
*
*
- * Available since PHP 5.5.0 and cURL 7.14.1.
+ * Available since cURL 7.14.1.
*
*
*
@@ -2239,10 +2358,7 @@ function curl_multi_init()
*
*
* The full data to post in a HTTP "POST" operation.
- * To post a file, prepend a filename with @ and
- * use the full path. The filetype can be explicitly specified by
- * following the filename with the type in the format
- * ';type=mimetype'. This parameter can either be
+ * This parameter can either be
* passed as a urlencoded string like 'para1=val1&amp;para2=val2&amp;...'
* or as an array with the field name as key and field data as value.
* If value is an array, the
@@ -2250,15 +2366,8 @@ function curl_multi_init()
* multipart/form-data.
*
*
- * As of PHP 5.2.0, value must be an array if
- * files are passed to this option with the @ prefix.
- *
- *
- * As of PHP 5.5.0, the @ prefix is deprecated and
- * files can be sent using CURLFile. The
- * @ prefix can be disabled for safe passing of
- * values beginning with @ by setting the
- * CURLOPT_SAFE_UPLOAD option to TRUE.
+ * Files can be sent using CURLFile or CURLStringFile,
+ * in which case value must be an array.
*
*
*
@@ -2479,7 +2588,7 @@ function curl_multi_init()
*
* CURLOPT_PROXY_TLSAUTH_USERNAME
*
- * Tusername to use for the HTTPS proxy TLS authentication method specified with the
+ * The username to use for the HTTPS proxy TLS authentication method specified with the
* CURLOPT_PROXY_TLSAUTH_TYPE option. Requires that the
* CURLOPT_PROXY_TLSAUTH_PASSWORD option to also be set.
*
@@ -2709,7 +2818,16 @@ function curl_multi_init()
* The user name to use in authentication.
*
*
- * Added in cURL 7.19.1. Available since PHP 5.5.0.
+ * Added in cURL 7.19.1.
+ *
+ *
+ *
+ * CURLOPT_PASSWORD
+ *
+ * The password to use in authentication.
+ *
+ *
+ * Added in cURL 7.19.1.
*
*
*
@@ -2864,7 +2982,7 @@ function curl_multi_init()
*
*
*
- * Added in cURL 7.21.3. Available since PHP 5.5.0.
+ * Added in cURL 7.21.3.
*
*
*
@@ -3031,12 +3149,12 @@ function curl_multi_init()
* @throws CurlException
*
*/
-function curl_setopt($ch, int $option, $value): void
+function curl_setopt(\CurlHandle $handle, int $option, $value): void
{
error_clear_last();
- $result = \curl_setopt($ch, $option, $value);
+ $result = \curl_setopt($handle, $option, $value);
if ($result === false) {
- throw CurlException::createFromCurlResource($ch);
+ throw CurlException::createFromPhpError($handle);
}
}
@@ -3044,17 +3162,18 @@ function curl_setopt($ch, int $option, $value): void
/**
* Return an integer containing the last share curl error number.
*
- * @param resource $sh A cURL share handle returned by curl_share_init.
+ * @param \CurlShareHandle $share_handle A cURL share handle returned by
+ * curl_share_init.
* @return int Returns an integer containing the last share curl error number.
* @throws CurlException
*
*/
-function curl_share_errno($sh): int
+function curl_share_errno(\CurlShareHandle $share_handle): int
{
error_clear_last();
- $result = \curl_share_errno($sh);
+ $result = \curl_share_errno($share_handle);
if ($result === false) {
- throw CurlException::createFromPhpError();
+ throw CurlException::createFromPhpError($share_handle);
}
return $result;
}
@@ -3063,7 +3182,8 @@ function curl_share_errno($sh): int
/**
* Sets an option on the given cURL share handle.
*
- * @param resource $sh A cURL share handle returned by curl_share_init.
+ * @param \CurlShareHandle $share_handle A cURL share handle returned by
+ * curl_share_init.
* @param int $option
*
*
@@ -3088,7 +3208,7 @@ function curl_share_errno($sh): int
*
*
*
- * @param string $value
+ * @param mixed $value
*
*
*
@@ -3125,12 +3245,12 @@ function curl_share_errno($sh): int
* @throws CurlException
*
*/
-function curl_share_setopt($sh, int $option, string $value): void
+function curl_share_setopt(\CurlShareHandle $share_handle, int $option, $value): void
{
error_clear_last();
- $result = \curl_share_setopt($sh, $option, $value);
+ $result = \curl_share_setopt($share_handle, $option, $value);
if ($result === false) {
- throw CurlException::createFromPhpError();
+ throw CurlException::createFromPhpError($share_handle);
}
}
@@ -3138,19 +3258,19 @@ function curl_share_setopt($sh, int $option, string $value): void
/**
* This function decodes the given URL encoded string.
*
- * @param resource $ch A cURL handle returned by
+ * @param \CurlHandle $handle A cURL handle returned by
* curl_init.
- * @param string $str The URL encoded string to be decoded.
+ * @param string $string The URL encoded string to be decoded.
* @return string Returns decoded string.
* @throws CurlException
*
*/
-function curl_unescape($ch, string $str): string
+function curl_unescape(\CurlHandle $handle, string $string): string
{
error_clear_last();
- $result = \curl_unescape($ch, $str);
+ $result = \curl_unescape($handle, $string);
if ($result === false) {
- throw CurlException::createFromCurlResource($ch);
+ throw CurlException::createFromPhpError($handle);
}
return $result;
}
diff --git a/vendor/thecodingmachine/safe/generated/datetime.php b/vendor/thecodingmachine/safe/generated/datetime.php
index 01bfa9364..9840ef5c6 100644
--- a/vendor/thecodingmachine/safe/generated/datetime.php
+++ b/vendor/thecodingmachine/safe/generated/datetime.php
@@ -9,11 +9,11 @@ use Safe\Exceptions\DatetimeException;
*
* @param string $format Format accepted by DateTime::createFromFormat.
* @param string $datetime String representing the date/time.
- * @return array Returns associative array with detailed info about given date/time.
+ * @return array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type: int|bool, zone: int|bool, is_dst: bool, tz_abbr: string, tz_id: string, relative: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday: int, weekdays: int, first_day_of_month: bool, last_day_of_month: bool}}|null Returns associative array with detailed info about given date/time.
* @throws DatetimeException
*
*/
-function date_parse_from_format(string $format, string $datetime): array
+function date_parse_from_format(string $format, string $datetime): ?array
{
error_clear_last();
$result = \date_parse_from_format($format, $datetime);
@@ -25,16 +25,30 @@ function date_parse_from_format(string $format, string $datetime): array
/**
- *
+ * date_parse parses the given
+ * datetime string according to the same rules as
+ * strtotime and
+ * DateTimeImmutable::__construct. Instead of returning a
+ * Unix timestamp (with strtotime) or a
+ * DateTimeImmutable object (with
+ * DateTimeImmutable::__construct, it returns an
+ * associative array with the information that it could detect in the given
+ * datetime string.
+ *
+ * If no information about a certain group of elements can be found, these
+ * array elements will be set to FALSE or are missing. If needed for
+ * constructing a timestamp or DateTimeImmutable object from
+ * the same datetime string, more fields can be set to
+ * a non-FALSE value. See the examples for cases where that happens.
*
* @param string $datetime Date/time in format accepted by
* DateTimeImmutable::__construct.
- * @return array Returns array with information about the parsed date/time
+ * @return array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type: int|bool, zone: int|bool, is_dst: bool, tz_abbr: string, tz_id: string, relative: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday: int, weekdays: int, first_day_of_month: bool, last_day_of_month: bool}}|null Returns array with information about the parsed date/time
* on success.
* @throws DatetimeException
*
*/
-function date_parse(string $datetime): array
+function date_parse(string $datetime): ?array
{
error_clear_last();
$result = \date_parse($datetime);
@@ -180,7 +194,7 @@ function date_sun_info(int $timestamp, float $latitude, float $longitude): array
*
*
* SUNFUNCS_RET_TIMESTAMP
- * returns the result as integer (timestamp)
+ * returns the result as int (timestamp)
* 1095034606
*
*
@@ -233,10 +247,10 @@ function date_sun_info(int $timestamp, float $latitude, float $longitude): array
* @throws DatetimeException
*
*/
-function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, float $latitude = null, float $longitude = null, float $zenith = null, float $utcOffset = 0)
+function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, float $latitude = null, float $longitude = null, float $zenith = null, float $utcOffset = null)
{
error_clear_last();
- if ($utcOffset !== 0) {
+ if ($utcOffset !== null) {
$result = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$result = \date_sunrise($timestamp, $returnFormat, $latitude, $longitude, $zenith);
@@ -283,7 +297,7 @@ function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, f
*
*
* SUNFUNCS_RET_TIMESTAMP
- * returns the result as integer (timestamp)
+ * returns the result as int (timestamp)
* 1095034606
*
*
@@ -336,10 +350,10 @@ function date_sunrise(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, f
* @throws DatetimeException
*
*/
-function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, float $latitude = null, float $longitude = null, float $zenith = null, float $utcOffset = 0)
+function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, float $latitude = null, float $longitude = null, float $zenith = null, float $utcOffset = null)
{
error_clear_last();
- if ($utcOffset !== 0) {
+ if ($utcOffset !== null) {
$result = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith, $utcOffset);
} elseif ($zenith !== null) {
$result = \date_sunset($timestamp, $returnFormat, $latitude, $longitude, $zenith);
@@ -359,14 +373,19 @@ function date_sunset(int $timestamp, int $returnFormat = SUNFUNCS_RET_STRING, fl
/**
* Returns a string formatted according to the given format string using the
- * given integer timestamp or the current time
- * if no timestamp is given. In other words, timestamp
+ * given integer timestamp (Unix timestamp) or the current time
+ * if no timestamp is given. In other words, timestamp
* is optional and defaults to the value of time.
*
+ * Unix timestamps do not handle timezones. Use the
+ * DateTimeImmutable class, and its
+ * DateTimeInterface::format formatting method to
+ * format date/time information with a timezone attached.
+ *
* @param string $format Format accepted by DateTimeInterface::format.
* @param int $timestamp The optional timestamp parameter is an
- * integer Unix timestamp that defaults to the current
- * local time if a timestamp is not given. In other
+ * int Unix timestamp that defaults to the current
+ * local time if timestamp is omitted or NULL. In other
* words, it defaults to the value of time.
* @return string Returns a formatted date string. If a non-numeric value is used for
* timestamp, FALSE is returned and an
@@ -390,28 +409,219 @@ function date(string $format, int $timestamp = null): string
/**
- * Identical to the date function except that
- * the time returned is Greenwich Mean Time (GMT).
+ * Identical to mktime except the passed parameters represents a
+ * GMT date. gmmktime internally uses mktime
+ * so only times valid in derived local time can be used.
+ *
+ * Like mktime, arguments may be left out in order
+ * from right to left, with any omitted arguments being set to the
+ * current corresponding GMT value.
+ *
+ * @param int $hour The number of the hour relative to the start of the day determined by
+ * month, day and year.
+ * Negative values reference the hour before midnight of the day in question.
+ * Values greater than 23 reference the appropriate hour in the following day(s).
+ * @param int $minute The number of the minute relative to the start of the hour.
+ * Negative values reference the minute in the previous hour.
+ * Values greater than 59 reference the appropriate minute in the following hour(s).
+ * @param int $second The number of seconds relative to the start of the minute.
+ * Negative values reference the second in the previous minute.
+ * Values greater than 59 reference the appropriate second in the following minute(s).
+ * @param int $month The number of the month relative to the end of the previous year.
+ * Values 1 to 12 reference the normal calendar months of the year in question.
+ * Values less than 1 (including negative values) reference the months in the previous year in reverse order, so 0 is December, -1 is November, etc.
+ * Values greater than 12 reference the appropriate month in the following year(s).
+ * @param int $day The number of the day relative to the end of the previous month.
+ * Values 1 to 28, 29, 30 or 31 (depending upon the month) reference the normal days in the relevant month.
+ * Values less than 1 (including negative values) reference the days in the previous month, so 0 is the last day of the previous month, -1 is the day before that, etc.
+ * Values greater than the number of days in the relevant month reference the appropriate day in the following month(s).
+ * @param int $year The year
+ * @return int Returns a int Unix timestamp on success.
+ * @throws DatetimeException
+ *
+ */
+function gmmktime(int $hour, int $minute = null, int $second = null, int $month = null, int $day = null, int $year = null): int
+{
+ error_clear_last();
+ if ($year !== null) {
+ $result = \gmmktime($hour, $minute, $second, $month, $day, $year);
+ } elseif ($day !== null) {
+ $result = \gmmktime($hour, $minute, $second, $month, $day);
+ } elseif ($month !== null) {
+ $result = \gmmktime($hour, $minute, $second, $month);
+ } elseif ($second !== null) {
+ $result = \gmmktime($hour, $minute, $second);
+ } elseif ($minute !== null) {
+ $result = \gmmktime($hour, $minute);
+ } else {
+ $result = \gmmktime($hour);
+ }
+ if ($result === false) {
+ throw DatetimeException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Behaves the same as strftime except that the
+ * time returned is Greenwich Mean Time (GMT). For example, when run
+ * in Eastern Standard Time (GMT -0500), the first line below prints
+ * "Dec 31 1998 20:00:00", while the second prints "Jan 01 1999
+ * 01:00:00".
*
- * @param string $format The format of the outputted date string. See the formatting
- * options for the date function.
+ * @param string $format See description in strftime.
* @param int $timestamp The optional timestamp parameter is an
- * integer Unix timestamp that defaults to the current
- * local time if a timestamp is not given. In other
+ * int Unix timestamp that defaults to the current
+ * local time if timestamp is omitted or NULL. In other
* words, it defaults to the value of time.
- * @return string Returns a formatted date string. If a non-numeric value is used for
- * timestamp, FALSE is returned and an
- * E_WARNING level error is emitted.
+ * @return string Returns a string formatted according to the given format string
+ * using the given timestamp or the current
+ * local time if no timestamp is given. Month and weekday names and
+ * other language dependent strings respect the current locale set
+ * with setlocale.
+ * On failure, FALSE is returned.
* @throws DatetimeException
*
*/
-function gmdate(string $format, int $timestamp = null): string
+function gmstrftime(string $format, int $timestamp = null): string
{
error_clear_last();
if ($timestamp !== null) {
- $result = \gmdate($format, $timestamp);
+ $result = \gmstrftime($format, $timestamp);
} else {
- $result = \gmdate($format);
+ $result = \gmstrftime($format);
+ }
+ if ($result === false) {
+ throw DatetimeException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns a number formatted according to the given format string using the
+ * given integer timestamp or the current local time
+ * if no timestamp is given. In other words, timestamp
+ * is optional and defaults to the value of time.
+ *
+ * Unlike the function date, idate
+ * accepts just one char in the format parameter.
+ *
+ * @param string $format
+ * The following characters are recognized in the
+ * format parameter string
+ *
+ *
+ *
+ * format character
+ * Description
+ *
+ *
+ *
+ *
+ * B
+ * Swatch Beat/Internet Time
+ *
+ *
+ * d
+ * Day of the month
+ *
+ *
+ * h
+ * Hour (12 hour format)
+ *
+ *
+ * H
+ * Hour (24 hour format)
+ *
+ *
+ * i
+ * Minutes
+ *
+ *
+ * I (uppercase i)
+ * returns 1 if DST is activated,
+ * 0 otherwise
+ *
+ *
+ * L (uppercase l)
+ * returns 1 for leap year,
+ * 0 otherwise
+ *
+ *
+ * m
+ * Month number
+ *
+ *
+ * N
+ * ISO-8601 day of the week (1 for Monday
+ * through 7 for Sunday)
+ *
+ *
+ * o
+ * ISO-8601 year (4 digits)
+ *
+ *
+ * s
+ * Seconds
+ *
+ *
+ * t
+ * Days in current month
+ *
+ *
+ * U
+ * Seconds since the Unix Epoch - January 1 1970 00:00:00 UTC -
+ * this is the same as time
+ *
+ *
+ * w
+ * Day of the week (0 on Sunday)
+ *
+ *
+ * W
+ * ISO-8601 week number of year, weeks starting on
+ * Monday
+ *
+ *
+ * y
+ * Year (1 or 2 digits - check note below)
+ *
+ *
+ * Y
+ * Year (4 digits)
+ *
+ *
+ * z
+ * Day of the year
+ *
+ *
+ * Z
+ * Timezone offset in seconds
+ *
+ *
+ *
+ *
+ * @param int $timestamp The optional timestamp parameter is an
+ * int Unix timestamp that defaults to the current
+ * local time if timestamp is omitted or NULL. In other
+ * words, it defaults to the value of time.
+ * @return int Returns an int on success.
+ *
+ * As idate always returns an int and
+ * as they can't start with a "0", idate may return
+ * fewer digits than you would expect. See the example below.
+ * @throws DatetimeException
+ *
+ */
+function idate(string $format, int $timestamp = null): int
+{
+ error_clear_last();
+ if ($timestamp !== null) {
+ $result = \idate($format, $timestamp);
+ } else {
+ $result = \idate($format);
}
if ($result === false) {
throw DatetimeException::createFromPhpError();
@@ -452,16 +662,14 @@ function gmdate(string $format, int $timestamp = null): string
* with values between 0-69 mapping to 2000-2069 and 70-100 to
* 1970-2000. On systems where time_t is a 32bit signed integer, as
* most common today, the valid range for year
- * is somewhere between 1901 and 2038. However, before PHP 5.1.0 this
- * range was limited from 1970 to 2038 on some systems (e.g. Windows).
+ * is somewhere between 1901 and 2038.
* @return int mktime returns the Unix timestamp of the arguments
* given.
- * If the arguments are invalid, the function returns FALSE (before PHP 5.1
- * it returned -1).
+ * If the arguments are invalid, the function returns FALSE.
* @throws DatetimeException
*
*/
-function mktime(int $hour = null, int $minute = null, int $second = null, int $month = null, int $day = null, int $year = null): int
+function mktime(int $hour, int $minute = null, int $second = null, int $month = null, int $day = null, int $year = null): int
{
error_clear_last();
if ($year !== null) {
@@ -474,10 +682,336 @@ function mktime(int $hour = null, int $minute = null, int $second = null, int $m
$result = \mktime($hour, $minute, $second);
} elseif ($minute !== null) {
$result = \mktime($hour, $minute);
- } elseif ($hour !== null) {
+ } else {
$result = \mktime($hour);
+ }
+ if ($result === false) {
+ throw DatetimeException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Format the time and/or date according to locale settings. Month and weekday
+ * names and other language-dependent strings respect the current locale set
+ * with setlocale.
+ *
+ * Not all conversion specifiers may be supported by your C library, in which
+ * case they will not be supported by PHP's strftime.
+ * Additionally, not all platforms support negative timestamps, so your
+ * date range may be limited to no earlier than the Unix epoch. This means that
+ * %e, %T, %R and, %D (and possibly others) - as well as dates prior to
+ * Jan 1, 1970 - will not work on Windows, some Linux
+ * distributions, and a few other operating systems. For Windows systems, a
+ * complete overview of supported conversion specifiers can be found at
+ * MSDN.
+ *
+ * @param string $format
+ * The following characters are recognized in the
+ * format parameter string
+ *
+ *
+ *
+ * format
+ * Description
+ * Example returned values
+ *
+ *
+ *
+ *
+ * Day
+ * ---
+ * ---
+ *
+ *
+ * %a
+ * An abbreviated textual representation of the day
+ * Sun through Sat
+ *
+ *
+ * %A
+ * A full textual representation of the day
+ * Sunday through Saturday
+ *
+ *
+ * %d
+ * Two-digit day of the month (with leading zeros)
+ * 01 to 31
+ *
+ *
+ * %e
+ *
+ * Day of the month, with a space preceding single digits. Not
+ * implemented as described on Windows. See below for more information.
+ *
+ * 1 to 31
+ *
+ *
+ * %j
+ * Day of the year, 3 digits with leading zeros
+ * 001 to 366
+ *
+ *
+ * %u
+ * ISO-8601 numeric representation of the day of the week
+ * 1 (for Monday) through 7 (for Sunday)
+ *
+ *
+ * %w
+ * Numeric representation of the day of the week
+ * 0 (for Sunday) through 6 (for Saturday)
+ *
+ *
+ * Week
+ * ---
+ * ---
+ *
+ *
+ * %U
+ * Week number of the given year, starting with the first
+ * Sunday as the first week
+ * 13 (for the 13th full week of the year)
+ *
+ *
+ * %V
+ * ISO-8601:1988 week number of the given year, starting with
+ * the first week of the year with at least 4 weekdays, with Monday
+ * being the start of the week
+ * 01 through 53 (where 53
+ * accounts for an overlapping week)
+ *
+ *
+ * %W
+ * A numeric representation of the week of the year, starting
+ * with the first Monday as the first week
+ * 46 (for the 46th week of the year beginning
+ * with a Monday)
+ *
+ *
+ * Month
+ * ---
+ * ---
+ *
+ *
+ * %b
+ * Abbreviated month name, based on the locale
+ * Jan through Dec
+ *
+ *
+ * %B
+ * Full month name, based on the locale
+ * January through December
+ *
+ *
+ * %h
+ * Abbreviated month name, based on the locale (an alias of %b)
+ * Jan through Dec
+ *
+ *
+ * %m
+ * Two digit representation of the month
+ * 01 (for January) through 12 (for December)
+ *
+ *
+ * Year
+ * ---
+ * ---
+ *
+ *
+ * %C
+ * Two digit representation of the century (year divided by 100, truncated to an integer)
+ * 19 for the 20th Century
+ *
+ *
+ * %g
+ * Two digit representation of the year going by ISO-8601:1988 standards (see %V)
+ * Example: 09 for the week of January 6, 2009
+ *
+ *
+ * %G
+ * The full four-digit version of %g
+ * Example: 2008 for the week of January 3, 2009
+ *
+ *
+ * %y
+ * Two digit representation of the year
+ * Example: 09 for 2009, 79 for 1979
+ *
+ *
+ * %Y
+ * Four digit representation for the year
+ * Example: 2038
+ *
+ *
+ * Time
+ * ---
+ * ---
+ *
+ *
+ * %H
+ * Two digit representation of the hour in 24-hour format
+ * 00 through 23
+ *
+ *
+ * %k
+ * Hour in 24-hour format, with a space preceding single digits
+ * 0 through 23
+ *
+ *
+ * %I
+ * Two digit representation of the hour in 12-hour format
+ * 01 through 12
+ *
+ *
+ * %l (lower-case 'L')
+ * Hour in 12-hour format, with a space preceding single digits
+ * 1 through 12
+ *
+ *
+ * %M
+ * Two digit representation of the minute
+ * 00 through 59
+ *
+ *
+ * %p
+ * UPPER-CASE 'AM' or 'PM' based on the given time
+ * Example: AM for 00:31,
+ * PM for 22:23. The exact result depends on the
+ * Operating System, and they can also return lower-case variants, or
+ * variants with dots (such as a.m.).
+ *
+ *
+ * %P
+ * lower-case 'am' or 'pm' based on the given time
+ * Example: am for 00:31,
+ * pm for 22:23. Not supported by all Operating
+ * Systems.
+ *
+ *
+ * %r
+ * Same as "%I:%M:%S %p"
+ * Example: 09:34:17 PM for 21:34:17
+ *
+ *
+ * %R
+ * Same as "%H:%M"
+ * Example: 00:35 for 12:35 AM, 16:44 for 4:44 PM
+ *
+ *
+ * %S
+ * Two digit representation of the second
+ * 00 through 59
+ *
+ *
+ * %T
+ * Same as "%H:%M:%S"
+ * Example: 21:34:17 for 09:34:17 PM
+ *
+ *
+ * %X
+ * Preferred time representation based on locale, without the date
+ * Example: 03:59:16 or 15:59:16
+ *
+ *
+ * %z
+ * The time zone offset. Not implemented as described on
+ * Windows. See below for more information.
+ * Example: -0500 for US Eastern Time
+ *
+ *
+ * %Z
+ * The time zone abbreviation. Not implemented as described on
+ * Windows. See below for more information.
+ * Example: EST for Eastern Time
+ *
+ *
+ * Time and Date Stamps
+ * ---
+ * ---
+ *
+ *
+ * %c
+ * Preferred date and time stamp based on locale
+ * Example: Tue Feb 5 00:45:10 2009 for
+ * February 5, 2009 at 12:45:10 AM
+ *
+ *
+ * %D
+ * Same as "%m/%d/%y"
+ * Example: 02/05/09 for February 5, 2009
+ *
+ *
+ * %F
+ * Same as "%Y-%m-%d" (commonly used in database datestamps)
+ * Example: 2009-02-05 for February 5, 2009
+ *
+ *
+ * %s
+ * Unix Epoch Time timestamp (same as the time
+ * function)
+ * Example: 305815200 for September 10, 1979 08:40:00 AM
+ *
+ *
+ * %x
+ * Preferred date representation based on locale, without the time
+ * Example: 02/05/09 for February 5, 2009
+ *
+ *
+ * Miscellaneous
+ * ---
+ * ---
+ *
+ *
+ * %n
+ * A newline character ("\n")
+ * ---
+ *
+ *
+ * %t
+ * A Tab character ("\t")
+ * ---
+ *
+ *
+ * %%
+ * A literal percentage character ("%")
+ * ---
+ *
+ *
+ *
+ *
+ *
+ * Windows only:
+ *
+ * The %e modifier is not supported in the Windows
+ * implementation of this function. To achieve this value, the
+ * %#d modifier can be used instead. The example below
+ * illustrates how to write a cross platform compatible function.
+ *
+ * The %z and %Z modifiers both
+ * return the time zone name instead of the offset or abbreviation.
+ * @param int $timestamp The optional timestamp parameter is an
+ * int Unix timestamp that defaults to the current
+ * local time if timestamp is omitted or NULL. In other
+ * words, it defaults to the value of time.
+ * @return string Returns a string formatted according format
+ * using the given timestamp or the current
+ * local time if no timestamp is given. Month and weekday names and
+ * other language-dependent strings respect the current locale set
+ * with setlocale.
+ * The function returns FALSE if format is empty, contains unsupported
+ * conversion specifiers, or if the length of the returned string would be greater than
+ * 4095.
+ * @throws DatetimeException
+ *
+ */
+function strftime(string $format, int $timestamp = null): string
+{
+ error_clear_last();
+ if ($timestamp !== null) {
+ $result = \strftime($format, $timestamp);
} else {
- $result = \mktime();
+ $result = \strftime($format);
}
if ($result === false) {
throw DatetimeException::createFromPhpError();
@@ -488,13 +1022,13 @@ function mktime(int $hour = null, int $minute = null, int $second = null, int $m
/**
* strptime returns an array with the
- * date parsed.
+ * timestamp parsed.
*
* Month and weekday names and other language dependent strings respect the
* current locale set with setlocale (LC_TIME).
*
- * @param string $date The string to parse (e.g. returned from strftime).
- * @param string $format The format used in date (e.g. the same as
+ * @param string $timestamp The string to parse (e.g. returned from strftime).
+ * @param string $format The format used in timestamp (e.g. the same as
* used in strftime). Note that some of the format
* options available to strftime may not have any
* effect within strptime; the exact subset that are
@@ -549,7 +1083,7 @@ function mktime(int $hour = null, int $minute = null, int $second = null, int $m
*
*
* "unparsed"
- * the date part which was not
+ * the timestamp part which was not
* recognized using the specified format
*
*
@@ -558,10 +1092,10 @@ function mktime(int $hour = null, int $minute = null, int $second = null, int $m
* @throws DatetimeException
*
*/
-function strptime(string $date, string $format): array
+function strptime(string $timestamp, string $format): array
{
error_clear_last();
- $result = \strptime($date, $format);
+ $result = \strptime($timestamp, $format);
if ($result === false) {
throw DatetimeException::createFromPhpError();
}
@@ -577,18 +1111,17 @@ function strptime(string $date, string $format): array
* ways to define the default time zone.
*
* @param string $datetime A date/time string. Valid formats are explained in Date and Time Formats.
- * @param int $now The timestamp which is used as a base for the calculation of relative
+ * @param int $baseTimestamp The timestamp which is used as a base for the calculation of relative
* dates.
- * @return int Returns a timestamp on success, FALSE otherwise. Previous to PHP 5.1.0,
- * this function would return -1 on failure.
+ * @return int Returns a timestamp on success, FALSE otherwise.
* @throws DatetimeException
*
*/
-function strtotime(string $datetime, int $now = null): int
+function strtotime(string $datetime, int $baseTimestamp = null): int
{
error_clear_last();
- if ($now !== null) {
- $result = \strtotime($datetime, $now);
+ if ($baseTimestamp !== null) {
+ $result = \strtotime($datetime, $baseTimestamp);
} else {
$result = \strtotime($datetime);
}
diff --git a/vendor/thecodingmachine/safe/generated/dir.php b/vendor/thecodingmachine/safe/generated/dir.php
index 628dec537..fe4ea5af5 100644
--- a/vendor/thecodingmachine/safe/generated/dir.php
+++ b/vendor/thecodingmachine/safe/generated/dir.php
@@ -31,6 +31,9 @@ function chdir(string $directory): void
* only when using the CLI, CGI or Embed SAPI. Also, this function
* requires root privileges.
*
+ * Calling this function does not change the values of the __DIR__
+ * and __FILE__ magic constants.
+ *
* @param string $directory The path to change the root directory to.
* @throws DirException
*
@@ -74,7 +77,7 @@ function getcwd(): string
* closedir, readdir, and
* rewinddir calls.
*
- * @param string $path The directory path that is to be opened
+ * @param string $directory The directory path that is to be opened
* @param resource $context For a description of the context parameter,
* refer to the streams section of
* the manual.
@@ -82,13 +85,13 @@ function getcwd(): string
* @throws DirException
*
*/
-function opendir(string $path, $context = null)
+function opendir(string $directory, $context = null)
{
error_clear_last();
if ($context !== null) {
- $result = \opendir($path, $context);
+ $result = \opendir($directory, $context);
} else {
- $result = \opendir($path);
+ $result = \opendir($directory);
}
if ($result === false) {
throw DirException::createFromPhpError();
@@ -98,32 +101,6 @@ function opendir(string $path, $context = null)
/**
- * Resets the directory stream indicated by
- * dir_handle to the beginning of the
- * directory.
- *
- * @param resource $dir_handle The directory handle resource previously opened
- * with opendir. If the directory handle is
- * not specified, the last link opened by opendir
- * is assumed.
- * @throws DirException
- *
- */
-function rewinddir($dir_handle = null): void
-{
- error_clear_last();
- if ($dir_handle !== null) {
- $result = \rewinddir($dir_handle);
- } else {
- $result = \rewinddir();
- }
- if ($result === false) {
- throw DirException::createFromPhpError();
- }
-}
-
-
-/**
* Returns an array of files and directories from the
* directory.
*
diff --git a/vendor/thecodingmachine/safe/generated/eio.php b/vendor/thecodingmachine/safe/generated/eio.php
index 8d2f538e8..1fffa9004 100644
--- a/vendor/thecodingmachine/safe/generated/eio.php
+++ b/vendor/thecodingmachine/safe/generated/eio.php
@@ -414,6 +414,57 @@ function eio_fchmod($fd, int $mode, int $pri = EIO_PRI_DEFAULT, callable $callba
/**
+ * eio_fchown changes ownership of the file specified by
+ * fd file descriptor.
+ *
+ * @param mixed $fd Stream, Socket resource, or numeric file descriptor.
+ * @param int $uid User ID. Is ignored when equal to -1.
+ * @param int $gid Group ID. Is ignored when equal to -1.
+ * @param int $pri The request priority: EIO_PRI_DEFAULT, EIO_PRI_MIN, EIO_PRI_MAX, or NULL.
+ * If NULL passed, pri internally is set to
+ * EIO_PRI_DEFAULT.
+ * @param callable $callback
+ * callback function is called when the request is done.
+ * It should match the following prototype:
+ *
+ *
+ * data
+ * is custom data passed to the request.
+ *
+ *
+ * result
+ * request-specific result value; basically, the value returned by corresponding
+ * system call.
+ *
+ *
+ * req
+ * is optional request resource which can be used with functions like eio_get_last_error
+ *
+ *
+ *
+ * is custom data passed to the request.
+ *
+ * request-specific result value; basically, the value returned by corresponding
+ * system call.
+ *
+ * is optional request resource which can be used with functions like eio_get_last_error
+ * @param mixed $data is custom data passed to the request.
+ * @return resource eio_chmod returns request resource on success.
+ * @throws EioException
+ *
+ */
+function eio_fchown($fd, int $uid, int $gid = -1, int $pri = EIO_PRI_DEFAULT, callable $callback = null, $data = null)
+{
+ error_clear_last();
+ $result = \eio_fchown($fd, $uid, $gid, $pri, $callback, $data);
+ if ($result === false) {
+ throw EioException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* eio_fdatasync synchronizes a file's in-core state with storage device.
*
* @param mixed $fd Stream, Socket resource, or numeric file descriptor, e.g. returned by eio_open.
@@ -1061,7 +1112,8 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
* is optional request resource which can be used with functions like eio_get_last_error
* @param string $data is custom data passed to the request.
- * @return resource eio_readdir returns request resource on success. Sets result argument of
+ * @return resource eio_readdir returns request resource on success.
+ * Sets result argument of
* callback function according to
* flags:
*
@@ -1071,7 +1123,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_READDIR_DENTS
- * (integer)
+ * (int)
*
*
*
@@ -1091,7 +1143,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_READDIR_DIRS_FIRST
- * (integer)
+ * (int)
*
*
*
@@ -1103,7 +1155,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_READDIR_STAT_ORDER
- * (integer)
+ * (int)
*
*
*
@@ -1118,7 +1170,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_READDIR_FOUND_UNKNOWN
- * (integer)
+ * (int)
*
*
*
@@ -1137,7 +1189,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_UNKNOWN
- * (integer)
+ * (int)
*
*
*
@@ -1148,7 +1200,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_FIFO
- * (integer)
+ * (int)
*
*
*
@@ -1159,7 +1211,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_CHR
- * (integer)
+ * (int)
*
*
*
@@ -1170,7 +1222,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_MPC
- * (integer)
+ * (int)
*
*
*
@@ -1181,7 +1233,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_DIR
- * (integer)
+ * (int)
*
*
*
@@ -1192,7 +1244,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_NAM
- * (integer)
+ * (int)
*
*
*
@@ -1203,7 +1255,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_BLK
- * (integer)
+ * (int)
*
*
*
@@ -1214,7 +1266,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_MPB
- * (integer)
+ * (int)
*
*
*
@@ -1225,7 +1277,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_REG
- * (integer)
+ * (int)
*
*
*
@@ -1236,7 +1288,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_NWK
- * (integer)
+ * (int)
*
*
*
@@ -1246,7 +1298,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_CMP
- * (integer)
+ * (int)
*
*
*
@@ -1257,7 +1309,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_LNK
- * (integer)
+ * (int)
*
*
*
@@ -1268,7 +1320,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_SOCK
- * (integer)
+ * (int)
*
*
*
@@ -1279,7 +1331,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_DOOR
- * (integer)
+ * (int)
*
*
*
@@ -1290,7 +1342,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_WHT
- * (integer)
+ * (int)
*
*
*
@@ -1301,7 +1353,7 @@ function eio_readahead($fd, int $offset, int $length, int $pri = EIO_PRI_DEFAULT
*
*
* EIO_DT_MAX
- * (integer)
+ * (int)
*
*
*
@@ -1672,7 +1724,8 @@ function eio_stat(string $path, int $pri, callable $callback, $data = null)
*
* is optional request resource which can be used with functions like eio_get_last_error
* @param mixed $data is custom data passed to the request.
- * @return resource eio_statvfs returns request resource on success. On success assigns result argument of
+ * @return resource eio_statvfs returns request resource on success.
+ * On success assigns result argument of
* callback to an array.
* @throws EioException
*
diff --git a/vendor/thecodingmachine/safe/generated/errorfunc.php b/vendor/thecodingmachine/safe/generated/errorfunc.php
index ac64a7d8b..9d3e98b2c 100644
--- a/vendor/thecodingmachine/safe/generated/errorfunc.php
+++ b/vendor/thecodingmachine/safe/generated/errorfunc.php
@@ -30,7 +30,7 @@ use Safe\Exceptions\ErrorfuncException;
* message is sent by email to the address in
* the destination parameter. This is the only
* message type where the fourth parameter,
- * extra_headers is used.
+ * additional_headers is used.
*
*
*
@@ -59,18 +59,18 @@ use Safe\Exceptions\ErrorfuncException;
*
* @param string $destination The destination. Its meaning depends on the
* message_type parameter as described above.
- * @param string $extra_headers The extra headers. It's used when the message_type
+ * @param string $additional_headers The extra headers. It's used when the message_type
* parameter is set to 1.
* This message type uses the same internal function as
* mail does.
* @throws ErrorfuncException
*
*/
-function error_log(string $message, int $message_type = 0, string $destination = null, string $extra_headers = null): void
+function error_log(string $message, int $message_type = 0, string $destination = null, string $additional_headers = null): void
{
error_clear_last();
- if ($extra_headers !== null) {
- $result = \error_log($message, $message_type, $destination, $extra_headers);
+ if ($additional_headers !== null) {
+ $result = \error_log($message, $message_type, $destination, $additional_headers);
} elseif ($destination !== null) {
$result = \error_log($message, $message_type, $destination);
} else {
diff --git a/vendor/thecodingmachine/safe/generated/exec.php b/vendor/thecodingmachine/safe/generated/exec.php
index e9a40e08b..126438d43 100644
--- a/vendor/thecodingmachine/safe/generated/exec.php
+++ b/vendor/thecodingmachine/safe/generated/exec.php
@@ -5,122 +5,97 @@ namespace Safe;
use Safe\Exceptions\ExecException;
/**
- * proc_get_status fetches data about a
- * process opened using proc_open.
- *
- * @param resource $process The proc_open resource that will
- * be evaluated.
- * @return array An array of collected information on success. The returned array contains the following elements:
- *
- *
- *
- *
- * elementtypedescription
- *
- *
- *
- * command
- * string
- *
- * The command string that was passed to proc_open.
- *
- *
- *
- * pid
- * int
- * process id
- *
- *
- * running
- * bool
- *
- * TRUE if the process is still running, FALSE if it has
- * terminated.
- *
- *
- *
- * signaled
- * bool
- *
- * TRUE if the child process has been terminated by
- * an uncaught signal. Always set to FALSE on Windows.
- *
- *
- *
- * stopped
- * bool
- *
- * TRUE if the child process has been stopped by a
- * signal. Always set to FALSE on Windows.
- *
- *
- *
- * exitcode
- * int
- *
- * The exit code returned by the process (which is only
- * meaningful if running is FALSE).
- * Only first call of this function return real value, next calls return
- * -1.
- *
- *
- *
- * termsig
- * int
- *
- * The number of the signal that caused the child process to terminate
- * its execution (only meaningful if signaled is TRUE).
- *
- *
- *
- * stopsig
- * int
- *
- * The number of the signal that caused the child process to stop its
- * execution (only meaningful if stopped is TRUE).
+ * exec executes the given
+ * command.
*
+ * @param string $command The command that will be executed.
+ * @param array|null $output If the output argument is present, then the
+ * specified array will be filled with every line of output from the
+ * command. Trailing whitespace, such as \n, is not
+ * included in this array. Note that if the array already contains some
+ * elements, exec will append to the end of the array.
+ * If you do not want the function to append elements, call
+ * unset on the array before passing it to
+ * exec.
+ * @param int|null $result_code If the result_code argument is present
+ * along with the output argument, then the
+ * return status of the executed command will be written to this
+ * variable.
+ * @return string The last line from the result of the command. If you need to execute a
+ * command and have all the data from the command passed directly back without
+ * any interference, use the passthru function.
*
+ * Returns FALSE on failure.
*
+ * To get the output of the executed command, be sure to set and use the
+ * output parameter.
+ * @throws ExecException
*
+ */
+function exec(string $command, ?array &$output = null, ?int &$result_code = null): string
+{
+ error_clear_last();
+ $result = \exec($command, $output, $result_code);
+ if ($result === false) {
+ throw ExecException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The passthru function is similar to the
+ * exec function in that it executes a
+ * command. This function
+ * should be used in place of exec or
+ * system when the output from the Unix command
+ * is binary data which needs to be passed directly back to the
+ * browser. A common use for this is to execute something like the
+ * pbmplus utilities that can output an image stream directly. By
+ * setting the Content-type to image/gif and
+ * then calling a pbmplus program to output a gif, you can create
+ * PHP scripts that output images directly.
*
+ * @param string $command The command that will be executed.
+ * @param int|null $result_code If the result_code argument is present, the
+ * return status of the Unix command will be placed here.
* @throws ExecException
*
*/
-function proc_get_status($process): array
+function passthru(string $command, ?int &$result_code = null): void
{
error_clear_last();
- $result = \proc_get_status($process);
+ $result = \passthru($command, $result_code);
if ($result === false) {
throw ExecException::createFromPhpError();
}
- return $result;
}
/**
* proc_nice changes the priority of the current
- * process by the amount specified in increment. A
- * positive increment will lower the priority of the
- * current process, whereas a negative increment
+ * process by the amount specified in priority. A
+ * positive priority will lower the priority of the
+ * current process, whereas a negative priority
* will raise the priority.
*
* proc_nice is not related to
* proc_open and its associated functions in any way.
*
- * @param int $increment The new priority value, the value of this may differ on platforms.
+ * @param int $priority The new priority value, the value of this may differ on platforms.
*
* On Unix, a low value, such as -20 means high priority
- * wheras a positive value have a lower priority.
+ * whereas positive values have a lower priority.
*
- * For Windows the increment parameter have the
- * following meanings:
+ * For Windows the priority parameter has the
+ * following meaning:
* @throws ExecException
*
*/
-function proc_nice(int $increment): void
+function proc_nice(int $priority): void
{
error_clear_last();
- $result = \proc_nice($increment);
+ $result = \proc_nice($priority);
if ($result === false) {
throw ExecException::createFromPhpError();
}
@@ -128,6 +103,26 @@ function proc_nice(int $increment): void
/**
+ * This function is identical to the backtick operator.
+ *
+ * @param string $command The command that will be executed.
+ * @return string A string containing the output from the executed command, FALSE if the pipe
+ * cannot be established or NULL if an error occurs or the command produces no output.
+ * @throws ExecException
+ *
+ */
+function shell_exec(string $command): string
+{
+ error_clear_last();
+ $result = \shell_exec($command);
+ if ($result === null) {
+ throw ExecException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* system is just like the C version of the
* function in that it executes the given
* command and outputs the result.
@@ -141,17 +136,17 @@ function proc_nice(int $increment): void
* passthru function.
*
* @param string $command The command that will be executed.
- * @param int $return_var If the return_var argument is present, then the
+ * @param int|null $result_code If the result_code argument is present, then the
* return status of the executed command will be written to this
* variable.
* @return string Returns the last line of the command output on success.
* @throws ExecException
*
*/
-function system(string $command, int &$return_var = null): string
+function system(string $command, ?int &$result_code = null): string
{
error_clear_last();
- $result = \system($command, $return_var);
+ $result = \system($command, $result_code);
if ($result === false) {
throw ExecException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/fileinfo.php b/vendor/thecodingmachine/safe/generated/fileinfo.php
index 50345b67c..8bbfd3c47 100644
--- a/vendor/thecodingmachine/safe/generated/fileinfo.php
+++ b/vendor/thecodingmachine/safe/generated/fileinfo.php
@@ -5,9 +5,9 @@ namespace Safe;
use Safe\Exceptions\FileinfoException;
/**
- * This function closes the resource opened by finfo_open.
+ * This function closes the instance opened by finfo_open.
*
- * @param resource $finfo Fileinfo resource returned by finfo_open.
+ * @param resource $finfo An finfo instance, returned by finfo_open.
* @throws FileinfoException
*
*/
@@ -24,13 +24,13 @@ function finfo_close($finfo): void
/**
* Procedural style
*
- * Object oriented style (constructor):
+ * Object-oriented style (constructor):
*
- * This function opens a magic database and returns its resource.
+ * This function opens a magic database and returns its instance.
*
- * @param int $options One or disjunction of more Fileinfo
+ * @param int $flags One or disjunction of more Fileinfo
* constants.
- * @param string $magic_file Name of a magic database file, usually something like
+ * @param string $magic_database Name of a magic database file, usually something like
* /path/to/magic.mime. If not specified, the
* MAGIC environment variable is used. If the
* environment variable isn't set, then PHP's bundled magic database will
@@ -39,14 +39,18 @@ function finfo_close($finfo): void
* Passing NULL or an empty string will be equivalent to the default
* value.
* @return resource (Procedural style only)
- * Returns a magic database resource on success.
+ * Returns an finfo instance on success.
* @throws FileinfoException
*
*/
-function finfo_open(int $options = FILEINFO_NONE, string $magic_file = "")
+function finfo_open(int $flags = FILEINFO_NONE, string $magic_database = null)
{
error_clear_last();
- $result = \finfo_open($options, $magic_file);
+ if ($magic_database !== null) {
+ $result = \finfo_open($flags, $magic_database);
+ } else {
+ $result = \finfo_open($flags);
+ }
if ($result === false) {
throw FileinfoException::createFromPhpError();
}
@@ -58,13 +62,13 @@ function finfo_open(int $options = FILEINFO_NONE, string $magic_file = "")
* Returns the MIME content type for a file as determined by using
* information from the magic.mime file.
*
- * @param string $filename Path to the tested file.
+ * @param string|resource $filename Path to the tested file.
* @return string Returns the content type in MIME format, like
* text/plain or application/octet-stream.
* @throws FileinfoException
*
*/
-function mime_content_type(string $filename): string
+function mime_content_type($filename): string
{
error_clear_last();
$result = \mime_content_type($filename);
diff --git a/vendor/thecodingmachine/safe/generated/filesystem.php b/vendor/thecodingmachine/safe/generated/filesystem.php
index ee0a4bdf1..f3e5a2081 100644
--- a/vendor/thecodingmachine/safe/generated/filesystem.php
+++ b/vendor/thecodingmachine/safe/generated/filesystem.php
@@ -28,12 +28,12 @@ function chgrp(string $filename, $group): void
/**
* Attempts to change the mode of the specified file to that given in
- * mode.
+ * permissions.
*
* @param string $filename Path to the file.
- * @param int $mode Note that mode is not automatically
+ * @param int $permissions Note that permissions is not automatically
* assumed to be an octal value, so to ensure the expected operation,
- * you need to prefix mode with a zero (0).
+ * you need to prefix permissions with a zero (0).
* Strings such as "g+w" will not work properly.
*
*
@@ -43,7 +43,7 @@ function chgrp(string $filename, $group): void
*
*
*
- * The mode parameter consists of three octal
+ * The permissions parameter consists of three octal
* number components specifying access restrictions for the owner,
* the user group in which the owner is in, and to everybody else in
* this order. One component can be computed by adding up the needed
@@ -58,10 +58,10 @@ function chgrp(string $filename, $group): void
*
*
*/
-function chmod(string $filename, int $mode): void
+function chmod(string $filename, int $permissions): void
{
error_clear_last();
- $result = \chmod($filename, $mode);
+ $result = \chmod($filename, $permissions);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -89,13 +89,13 @@ function chown(string $filename, $user): void
/**
- * Makes a copy of the file source to
- * dest.
+ * Makes a copy of the file from to
+ * to.
*
* If you wish to move a file, use the rename function.
*
- * @param string $source Path to the source file.
- * @param string $dest The destination path. If dest is a URL, the
+ * @param string $from Path to the source file.
+ * @param string $to The destination path. If to is a URL, the
* copy operation may fail if the wrapper does not support overwriting of
* existing files.
*
@@ -105,13 +105,13 @@ function chown(string $filename, $user): void
* @throws FilesystemException
*
*/
-function copy(string $source, string $dest, $context = null): void
+function copy(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
- $result = \copy($source, $dest, $context);
+ $result = \copy($from, $to, $context);
} else {
- $result = \copy($source, $dest);
+ $result = \copy($from, $to);
}
if ($result === false) {
throw FilesystemException::createFromPhpError();
@@ -165,17 +165,40 @@ function disk_total_space(string $directory): float
/**
- * The file pointed to by handle is closed.
+ * The file pointed to by stream is closed.
*
- * @param resource $handle The file pointer must be valid, and must point to a file successfully
+ * @param resource $stream The file pointer must be valid, and must point to a file successfully
* opened by fopen or fsockopen.
* @throws FilesystemException
*
*/
-function fclose($handle): void
+function fclose($stream): void
{
error_clear_last();
- $result = \fclose($handle);
+ $result = \fclose($stream);
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function synchronizes stream contents to storage media, just like fsync does,
+ * but it does not synchronize file meta-data.
+ * Note that this function is only effectively different in POSIX systems.
+ * In Windows, this function is aliased to fsync.
+ *
+ * @param resource $stream The file pointer must be valid, and must point to
+ * a file successfully opened by fopen or
+ * fsockopen (and not yet closed by
+ * fclose).
+ * @throws FilesystemException
+ *
+ */
+function fdatasync($stream): void
+{
+ error_clear_last();
+ $result = \fdatasync($stream);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -184,19 +207,19 @@ function fclose($handle): void
/**
* This function forces a write of all buffered output to the resource
- * pointed to by the file handle.
+ * pointed to by the file stream.
*
- * @param resource $handle The file pointer must be valid, and must point to
+ * @param resource $stream The file pointer must be valid, and must point to
* a file successfully opened by fopen or
* fsockopen (and not yet closed by
* fclose).
* @throws FilesystemException
*
*/
-function fflush($handle): void
+function fflush($stream): void
{
error_clear_last();
- $result = \fflush($handle);
+ $result = \fflush($stream);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -204,10 +227,56 @@ function fflush($handle): void
/**
+ * Similar to fgets except that
+ * fgetcsv parses the line it reads for fields in
+ * CSV format and returns an array containing the fields
+ * read.
+ *
+ * @param resource $stream A valid file pointer to a file successfully opened by
+ * fopen, popen, or
+ * fsockopen.
+ * @param int $length Must be greater than the longest line (in characters) to be found in
+ * the CSV file (allowing for trailing line-end characters). Otherwise the
+ * line is split in chunks of length characters,
+ * unless the split would occur inside an enclosure.
+ *
+ * Omitting this parameter (or setting it to 0,
+ * or NULL in PHP 8.0.0 or later) the maximum line length is not limited,
+ * which is slightly slower.
+ * @param string $separator The optional separator parameter sets the field separator (one single-byte character only).
+ * @param string $enclosure The optional enclosure parameter sets the field enclosure character (one single-byte character only).
+ * @param string $escape The optional escape parameter sets the escape character (at most one single-byte character).
+ * An empty string ("") disables the proprietary escape mechanism.
+ * @return array|null Returns an indexed array containing the fields read on success.
+ * @throws FilesystemException
+ *
+ */
+function fgetcsv($stream, int $length = null, string $separator = ",", string $enclosure = "\"", string $escape = "\\"): ?array
+{
+ error_clear_last();
+ if ($escape !== "\\") {
+ $result = \fgetcsv($stream, $length, $separator, $enclosure, $escape);
+ } elseif ($enclosure !== "\"") {
+ $result = \fgetcsv($stream, $length, $separator, $enclosure);
+ } elseif ($separator !== ",") {
+ $result = \fgetcsv($stream, $length, $separator);
+ } elseif ($length !== null) {
+ $result = \fgetcsv($stream, $length);
+ } else {
+ $result = \fgetcsv($stream);
+ }
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* This function is similar to file, except that
* file_get_contents returns the file in a
* string, starting at the specified offset
- * up to maxlen bytes. On failure,
+ * up to length bytes. On failure,
* file_get_contents will return FALSE.
*
* file_get_contents is the preferred way to read the
@@ -230,18 +299,18 @@ function fflush($handle): void
* Seeking (offset) is not supported with remote files.
* Attempting to seek on non-local files may work with small offsets, but this
* is unpredictable because it works on the buffered stream.
- * @param int $maxlen Maximum length of data read. The default is to read until end
+ * @param int $length Maximum length of data read. The default is to read until end
* of file is reached. Note that this parameter is applied to the
* stream processed by the filters.
* @return string The function returns the read data.
* @throws FilesystemException
*
*/
-function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, int $maxlen = null): string
+function file_get_contents(string $filename, bool $use_include_path = false, $context = null, int $offset = 0, int $length = null): string
{
error_clear_last();
- if ($maxlen !== null) {
- $result = \file_get_contents($filename, $use_include_path, $context, $offset, $maxlen);
+ if ($length !== null) {
+ $result = \file_get_contents($filename, $use_include_path, $context, $offset, $length);
} elseif ($offset !== 0) {
$result = \file_get_contents($filename, $use_include_path, $context, $offset);
} elseif ($context !== null) {
@@ -324,7 +393,7 @@ function file_get_contents(string $filename, bool $use_include_path = false, $co
*
*
*
- * @param resource $context A valid context resource created with
+ * @param resource|null $context A valid context resource created with
* stream_context_create.
* @return int This function returns the number of bytes that were written to the file.
* @throws FilesystemException
@@ -508,6 +577,39 @@ function fileowner(string $filename): int
/**
+ * Gets permissions for the given file.
+ *
+ * @param string $filename Path to the file.
+ * @return int Returns the file's permissions as a numeric mode. Lower bits of this mode
+ * are the same as the permissions expected by chmod,
+ * however on most platforms the return value will also include information on
+ * the type of file given as filename. The examples
+ * below demonstrate how to test the return value for specific permissions and
+ * file types on POSIX systems, including Linux and macOS.
+ *
+ * For local files, the specific return value is that of the
+ * st_mode member of the structure returned by the C
+ * library's stat function. Exactly which bits are set
+ * can vary from platform to platform, and looking up your specific platform's
+ * documentation is recommended if parsing the non-permission bits of the
+ * return value is required.
+ *
+ * Returns FALSE on failure.
+ * @throws FilesystemException
+ *
+ */
+function fileperms(string $filename): int
+{
+ error_clear_last();
+ $result = \fileperms($filename);
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Gets the size for the given file.
*
* @param string $filename Path to the file.
@@ -532,16 +634,15 @@ function filesize(string $filename): int
* model which can be used on virtually every platform (including most Unix
* derivatives and even Windows).
*
- * On versions of PHP before 5.3.2, the lock is released also by
- * fclose (which is also called automatically when script
- * finished).
+ * The lock is released also by fclose,
+ * or when stream is garbage collected.
*
* PHP supports a portable way of locking complete files in an advisory way
* (which means all accessing programs have to use the same way of locking
* or it will not work). By default, this function will block until the
* requested lock is acquired; this may be controlled with the LOCK_NB option documented below.
*
- * @param resource $handle A file system pointer resource
+ * @param resource $stream A file system pointer resource
* that is typically created using fopen.
* @param int $operation operation is one of the following:
*
@@ -565,15 +666,15 @@ function filesize(string $filename): int
* It is also possible to add LOCK_NB as a bitmask to one
* of the above operations, if flock should not
* block during the locking attempt.
- * @param int|null $wouldblock The optional third argument is set to 1 if the lock would block
+ * @param int|null $would_block The optional third argument is set to 1 if the lock would block
* (EWOULDBLOCK errno condition).
* @throws FilesystemException
*
*/
-function flock($handle, int $operation, ?int &$wouldblock = null): void
+function flock($stream, int $operation, ?int &$would_block = null): void
{
error_clear_last();
- $result = \flock($handle, $operation, $wouldblock);
+ $result = \flock($stream, $operation, $would_block);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -661,9 +762,8 @@ function flock($handle, int $operation, ?int &$wouldblock = null): void
*
* 'w+'
*
- * Open for reading and writing; place the file pointer at
- * the beginning of the file and truncate the file to zero
- * length. If the file does not exist, attempt to create it.
+ * Open for reading and writing; otherwise it has the
+ * same behavior as 'w'.
*
*
*
@@ -774,7 +874,8 @@ function flock($handle, int $operation, ?int &$wouldblock = null): void
* @param bool $use_include_path The optional third use_include_path parameter
* can be set to '1' or TRUE if you want to search for the file in the
* include_path, too.
- * @param resource $context
+ * @param resource|null $context A context stream
+ * resource.
* @return resource Returns a file pointer resource on success
* @throws FilesystemException
*
@@ -795,41 +896,9 @@ function fopen(string $filename, string $mode, bool $use_include_path = false, $
/**
- * fputcsv formats a line (passed as a
- * fields array) as CSV and writes it (terminated by a
- * newline) to the specified file handle.
- *
- * @param resource $handle The file pointer must be valid, and must point to
- * a file successfully opened by fopen or
- * fsockopen (and not yet closed by
- * fclose).
- * @param array $fields An array of strings.
- * @param string $delimiter The optional delimiter parameter sets the field
- * delimiter (one character only).
- * @param string $enclosure The optional enclosure parameter sets the field
- * enclosure (one character only).
- * @param string $escape_char The optional escape_char parameter sets the
- * escape character (at most one character).
- * An empty string ("") disables the proprietary escape mechanism.
- * @return int Returns the length of the written string.
- * @throws FilesystemException
- *
- */
-function fputcsv($handle, array $fields, string $delimiter = ",", string $enclosure = '"', string $escape_char = "\\"): int
-{
- error_clear_last();
- $result = \fputcsv($handle, $fields, $delimiter, $enclosure, $escape_char);
- if ($result === false) {
- throw FilesystemException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* fread reads up to
* length bytes from the file pointer
- * referenced by handle. Reading stops as soon as one
+ * referenced by stream. Reading stops as soon as one
* of the following conditions is met:
*
*
@@ -858,17 +927,42 @@ function fputcsv($handle, array $fields, string $delimiter = ",", string $enclos
*
*
*
- * @param resource $handle A file system pointer resource
+ * @param resource $stream A file system pointer resource
* that is typically created using fopen.
* @param int $length Up to length number of bytes read.
* @return string Returns the read string.
* @throws FilesystemException
*
*/
-function fread($handle, int $length): string
+function fread($stream, int $length): string
+{
+ error_clear_last();
+ $result = \fread($stream, $length);
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gathers the statistics of the file opened by the file
+ * pointer stream. This function is similar to the
+ * stat function except that it operates
+ * on an open file pointer instead of a filename.
+ *
+ * @param resource $stream A file system pointer resource
+ * that is typically created using fopen.
+ * @return array Returns an array with the statistics of the file; the format of the array
+ * is described in detail on the stat manual page.
+ * Returns FALSE on failure.
+ * @throws FilesystemException
+ *
+ */
+function fstat($stream): array
{
error_clear_last();
- $result = \fread($handle, $length);
+ $result = \fstat($stream);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -877,12 +971,33 @@ function fread($handle, int $length): string
/**
- * Takes the filepointer, handle, and truncates the file to
+ * This function synchronizes changes to the file, including its meta-data. This is similar to fflush,
+ * but it also instructs the operating system to write to the storage media.
+ *
+ * @param resource $stream The file pointer must be valid, and must point to
+ * a file successfully opened by fopen or
+ * fsockopen (and not yet closed by
+ * fclose).
+ * @throws FilesystemException
+ *
+ */
+function fsync($stream): void
+{
+ error_clear_last();
+ $result = \fsync($stream);
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Takes the filepointer, stream, and truncates the file to
* length, size.
*
- * @param resource $handle The file pointer.
+ * @param resource $stream The file pointer.
*
- * The handle must be open for writing.
+ * The stream must be open for writing.
* @param int $size The size to truncate to.
*
* If size is larger than the file then the file
@@ -893,10 +1008,10 @@ function fread($handle, int $length): string
* @throws FilesystemException
*
*/
-function ftruncate($handle, int $size): void
+function ftruncate($stream, int $size): void
{
error_clear_last();
- $result = \ftruncate($handle, $size);
+ $result = \ftruncate($stream, $size);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -906,29 +1021,23 @@ function ftruncate($handle, int $size): void
/**
*
*
- * @param resource $handle A file system pointer resource
+ * @param resource $stream A file system pointer resource
* that is typically created using fopen.
- * @param string $string The string that is to be written.
- * @param int $length If the length argument is given, writing will
- * stop after length bytes have been written or
- * the end of string is reached, whichever comes
- * first.
- *
- * Note that if the length argument is given,
- * then the magic_quotes_runtime
- * configuration option will be ignored and no slashes will be
- * stripped from string.
+ * @param string $data The string that is to be written.
+ * @param int $length If length is an integer, writing will stop
+ * after length bytes have been written or the
+ * end of data is reached, whichever comes first.
* @return int
* @throws FilesystemException
*
*/
-function fwrite($handle, string $string, int $length = null): int
+function fwrite($stream, string $data, int $length = null): int
{
error_clear_last();
if ($length !== null) {
- $result = \fwrite($handle, $string, $length);
+ $result = \fwrite($stream, $data, $length);
} else {
- $result = \fwrite($handle, $string);
+ $result = \fwrite($stream, $data);
}
if ($result === false) {
throw FilesystemException::createFromPhpError();
@@ -1016,6 +1125,12 @@ function fwrite($handle, string $string, int $length = null): int
*
*
*
+ *
+ *
+ * The GLOB_BRACE flag is not available on some non GNU
+ * systems, like Solaris or Alpine Linux.
+ *
+ *
* @return array Returns an array containing the matched files/directories, an empty array
* if no file matched.
* @throws FilesystemException
@@ -1095,32 +1210,67 @@ function link(string $target, string $link): void
/**
- * Attempts to create the directory specified by pathname.
+ * Gathers the statistics of the file or symbolic link named by
+ * filename.
+ *
+ * @param string $filename Path to a file or a symbolic link.
+ * @return array See the manual page for stat for information on
+ * the structure of the array that lstat returns.
+ * This function is identical to the stat function
+ * except that if the filename parameter is a symbolic
+ * link, the status of the symbolic link is returned, not the status of the
+ * file pointed to by the symbolic link.
+ *
+ * On failure, FALSE is returned.
+ * @throws FilesystemException
*
- * @param string $pathname The directory path.
- * @param int $mode The mode is 0777 by default, which means the widest possible
- * access. For more information on modes, read the details
+ */
+function lstat(string $filename): array
+{
+ error_clear_last();
+ $result = \lstat($filename);
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Attempts to create the directory specified by directory.
+ *
+ * @param string $directory The directory path.
+ * A URL can be used as a
+ * filename with this function if the fopen wrappers have been enabled.
+ * See fopen for more details on how to specify the
+ * filename. See the for links to information
+ * about what abilities the various wrappers have, notes on their usage,
+ * and information on any predefined variables they may
+ * provide.
+ * @param int $permissions The permissions are 0777 by default, which means the widest possible
+ * access. For more information on permissions, read the details
* on the chmod page.
*
- * mode is ignored on Windows.
+ * permissions is ignored on Windows.
*
- * Note that you probably want to specify the mode as an octal number,
- * which means it should have a leading zero. The mode is also modified
+ * Note that you probably want to specify the permissions as an octal number,
+ * which means it should have a leading zero. The permissions is also modified
* by the current umask, which you can change using
* umask.
- * @param bool $recursive Allows the creation of nested directories specified in the
- * pathname.
- * @param resource $context
+ * @param bool $recursive If TRUE, then any parent directories to the directory specified will
+ * also be created, with the same permissions.
+ * @param resource $context A context stream
+ * resource.
* @throws FilesystemException
*
*/
-function mkdir(string $pathname, int $mode = 0777, bool $recursive = false, $context = null): void
+function mkdir(string $directory, int $permissions = 0777, bool $recursive = false, $context = null): void
{
error_clear_last();
if ($context !== null) {
- $result = \mkdir($pathname, $mode, $recursive, $context);
+ $result = \mkdir($directory, $permissions, $recursive, $context);
} else {
- $result = \mkdir($pathname, $mode, $recursive);
+ $result = \mkdir($directory, $permissions, $recursive);
}
if ($result === false) {
throw FilesystemException::createFromPhpError();
@@ -1170,11 +1320,11 @@ function parse_ini_file(string $filename, bool $process_sections = false, int $s
/**
* parse_ini_string returns the settings in string
- * ini in an associative array.
+ * ini_string in an associative array.
*
* The structure of the ini string is the same as the php.ini's.
*
- * @param string $ini The contents of the ini file being parsed.
+ * @param string $ini_string The contents of the ini file being parsed.
* @param bool $process_sections By setting the process_sections
* parameter to TRUE, you get a multidimensional array, with
* the section names and settings included. The default
@@ -1194,10 +1344,10 @@ function parse_ini_file(string $filename, bool $process_sections = false, int $s
* @throws FilesystemException
*
*/
-function parse_ini_string(string $ini, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
+function parse_ini_string(string $ini_string, bool $process_sections = false, int $scanner_mode = INI_SCANNER_NORMAL): array
{
error_clear_last();
- $result = \parse_ini_string($ini, $process_sections, $scanner_mode);
+ $result = \parse_ini_string($ini_string, $process_sections, $scanner_mode);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -1211,7 +1361,8 @@ function parse_ini_string(string $ini, bool $process_sections = false, int $scan
* @param string $filename The filename being read.
* @param bool $use_include_path You can use the optional second parameter and set it to TRUE, if
* you want to search for the file in the include_path, too.
- * @param resource $context A context stream resource.
+ * @param resource $context A context stream
+ * resource.
* @return int Returns the number of bytes read from the file on success
* @throws FilesystemException
*
@@ -1287,30 +1438,37 @@ function realpath(string $path): string
/**
- * Attempts to rename oldname to
- * newname, moving it between directories if necessary.
- * If renaming a file and newname exists,
+ * Attempts to rename from to
+ * to, moving it between directories if necessary.
+ * If renaming a file and to exists,
* it will be overwritten. If renaming a directory and
- * newname exists,
+ * to exists,
* this function will emit a warning.
*
- * @param string $oldname The old name.
+ * @param string $from The old name.
*
- * The wrapper used in oldname
+ * The wrapper used in from
* must match the wrapper used in
- * newname.
- * @param string $newname The new name.
- * @param resource $context
+ * to.
+ * @param string $to The new name.
+ *
+ *
+ * On Windows, if to already exists, it must be writable.
+ * Otherwise rename fails and issues E_WARNING.
+ *
+ *
+ * @param resource $context A context stream
+ * resource.
* @throws FilesystemException
*
*/
-function rename(string $oldname, string $newname, $context = null): void
+function rename(string $from, string $to, $context = null): void
{
error_clear_last();
if ($context !== null) {
- $result = \rename($oldname, $newname, $context);
+ $result = \rename($from, $to, $context);
} else {
- $result = \rename($oldname, $newname);
+ $result = \rename($from, $to);
}
if ($result === false) {
throw FilesystemException::createFromPhpError();
@@ -1319,18 +1477,18 @@ function rename(string $oldname, string $newname, $context = null): void
/**
- * Sets the file position indicator for handle
+ * Sets the file position indicator for stream
* to the beginning of the file stream.
*
- * @param resource $handle The file pointer must be valid, and must point to a file
+ * @param resource $stream The file pointer must be valid, and must point to a file
* successfully opened by fopen.
* @throws FilesystemException
*
*/
-function rewind($handle): void
+function rewind($stream): void
{
error_clear_last();
- $result = \rewind($handle);
+ $result = \rewind($stream);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -1338,22 +1496,23 @@ function rewind($handle): void
/**
- * Attempts to remove the directory named by dirname.
+ * Attempts to remove the directory named by directory.
* The directory must be empty, and the relevant permissions must permit this.
* A E_WARNING level error will be generated on failure.
*
- * @param string $dirname Path to the directory.
- * @param resource $context
+ * @param string $directory Path to the directory.
+ * @param resource $context A context stream
+ * resource.
* @throws FilesystemException
*
*/
-function rmdir(string $dirname, $context = null): void
+function rmdir(string $directory, $context = null): void
{
error_clear_last();
if ($context !== null) {
- $result = \rmdir($dirname, $context);
+ $result = \rmdir($directory, $context);
} else {
- $result = \rmdir($dirname);
+ $result = \rmdir($directory);
}
if ($result === false) {
throw FilesystemException::createFromPhpError();
@@ -1387,16 +1546,16 @@ function symlink(string $target, string $link): void
* generate a file in the system's temporary directory, and return
* the full path to that file, including its name.
*
- * @param string $dir The directory where the temporary filename will be created.
+ * @param string $directory The directory where the temporary filename will be created.
* @param string $prefix The prefix of the generated temporary filename.
* @return string Returns the new temporary filename (with path).
* @throws FilesystemException
*
*/
-function tempnam(string $dir, string $prefix): string
+function tempnam(string $directory, string $prefix): string
{
error_clear_last();
- $result = \tempnam($dir, $prefix);
+ $result = \tempnam($directory, $prefix);
if ($result === false) {
throw FilesystemException::createFromPhpError();
}
@@ -1432,29 +1591,29 @@ function tmpfile()
/**
* Attempts to set the access and modification times of the file named in the
* filename parameter to the value given in
- * time.
+ * mtime.
* Note that the access time is always modified, regardless of the number
* of parameters.
*
* If the file does not exist, it will be created.
*
* @param string $filename The name of the file being touched.
- * @param int $time The touch time. If time is not supplied,
+ * @param int $mtime The touch time. If mtime is NULL,
* the current system time is used.
- * @param int $atime If present, the access time of the given filename is set to
+ * @param int $atime If not NULL, the access time of the given filename is set to
* the value of atime. Otherwise, it is set to
- * the value passed to the time parameter.
- * If neither are present, the current system time is used.
+ * the value passed to the mtime parameter.
+ * If both are NULL, the current system time is used.
* @throws FilesystemException
*
*/
-function touch(string $filename, int $time = null, int $atime = null): void
+function touch(string $filename, int $mtime = null, int $atime = null): void
{
error_clear_last();
if ($atime !== null) {
- $result = \touch($filename, $time, $atime);
- } elseif ($time !== null) {
- $result = \touch($filename, $time);
+ $result = \touch($filename, $mtime, $atime);
+ } elseif ($mtime !== null) {
+ $result = \touch($filename, $mtime);
} else {
$result = \touch($filename);
}
@@ -1470,7 +1629,11 @@ function touch(string $filename, int $time = null, int $atime = null): void
* failure.
*
* @param string $filename Path to the file.
- * @param resource $context
+ *
+ * If the file is a symlink, the symlink will be deleted. On Windows, to delete
+ * a symlink to a directory, rmdir has to be used instead.
+ * @param resource $context A context stream
+ * resource.
* @throws FilesystemException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/filter.php b/vendor/thecodingmachine/safe/generated/filter.php
index 2d836c6c9..aba02b4d8 100644
--- a/vendor/thecodingmachine/safe/generated/filter.php
+++ b/vendor/thecodingmachine/safe/generated/filter.php
@@ -11,7 +11,7 @@ use Safe\Exceptions\FilterException;
* @param int $type One of INPUT_GET, INPUT_POST,
* INPUT_COOKIE, INPUT_SERVER, or
* INPUT_ENV.
- * @param int|array $definition An array defining the arguments. A valid key is a string
+ * @param int|array $options An array defining the arguments. A valid key is a string
* containing a variable name and a valid value is either a filter type, or an array
* optionally specifying the filter, flags and options. If the value is an
* array, valid keys are filter which specifies the
@@ -23,7 +23,7 @@ use Safe\Exceptions\FilterException;
* This parameter can be also an integer holding a filter constant. Then all values in the
* input array are filtered by this filter.
* @param bool $add_empty Add missing keys as NULL to the return value.
- * @return mixed An array containing the values of the requested variables on success.
+ * @return array|null An array containing the values of the requested variables on success.
* If the input array designated by type is not populated,
* the function returns NULL if the FILTER_NULL_ON_FAILURE
* flag is not given, or FALSE otherwise. For other failures, FALSE is returned.
@@ -36,16 +36,10 @@ use Safe\Exceptions\FilterException;
* @throws FilterException
*
*/
-function filter_input_array(int $type, $definition = null, bool $add_empty = true)
+function filter_input_array(int $type, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
- if ($add_empty !== true) {
- $result = \filter_input_array($type, $definition, $add_empty);
- } elseif ($definition !== null) {
- $result = \filter_input_array($type, $definition);
- } else {
- $result = \filter_input_array($type);
- }
+ $result = \filter_input_array($type, $options, $add_empty);
if ($result === false) {
throw FilterException::createFromPhpError();
}
@@ -57,8 +51,8 @@ function filter_input_array(int $type, $definition = null, bool $add_empty = tru
* This function is useful for retrieving many values without
* repetitively calling filter_var.
*
- * @param array $data An array with string keys containing the data to filter.
- * @param mixed $definition An array defining the arguments. A valid key is a string
+ * @param array $array An array with string keys containing the data to filter.
+ * @param mixed $options An array defining the arguments. A valid key is a string
* containing a variable name and a valid value is either a
* filter type, or an
* array optionally specifying the filter, flags and options.
@@ -71,21 +65,15 @@ function filter_input_array(int $type, $definition = null, bool $add_empty = tru
* This parameter can be also an integer holding a filter constant. Then all values in the
* input array are filtered by this filter.
* @param bool $add_empty Add missing keys as NULL to the return value.
- * @return mixed An array containing the values of the requested variables on success. An array value will be FALSE if the filter fails, or NULL if
+ * @return array|null An array containing the values of the requested variables on success. An array value will be FALSE if the filter fails, or NULL if
* the variable is not set.
* @throws FilterException
*
*/
-function filter_var_array(array $data, $definition = null, bool $add_empty = true)
+function filter_var_array(array $array, $options = FILTER_DEFAULT, bool $add_empty = true): ?array
{
error_clear_last();
- if ($add_empty !== true) {
- $result = \filter_var_array($data, $definition, $add_empty);
- } elseif ($definition !== null) {
- $result = \filter_var_array($data, $definition);
- } else {
- $result = \filter_var_array($data);
- }
+ $result = \filter_var_array($array, $options, $add_empty);
if ($result === false) {
throw FilterException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/ftp.php b/vendor/thecodingmachine/safe/generated/ftp.php
index 174882657..23846bf1f 100644
--- a/vendor/thecodingmachine/safe/generated/ftp.php
+++ b/vendor/thecodingmachine/safe/generated/ftp.php
@@ -8,17 +8,17 @@ use Safe\Exceptions\FtpException;
* Sends an ALLO command to the remote FTP server to
* allocate space for a file to be uploaded.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param int $filesize The number of bytes to allocate.
- * @param string $result A textual representation of the servers response will be returned by
- * reference in result if a variable is provided.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param int $size The number of bytes to allocate.
+ * @param string|null $response A textual representation of the servers response will be returned by
+ * reference in response if a variable is provided.
* @throws FtpException
*
*/
-function ftp_alloc($ftp_stream, int $filesize, string &$result = null): void
+function ftp_alloc($ftp, int $size, ?string &$response = null): void
{
error_clear_last();
- $result = \ftp_alloc($ftp_stream, $filesize, $result);
+ $result = \ftp_alloc($ftp, $size, $response);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -28,17 +28,17 @@ function ftp_alloc($ftp_stream, int $filesize, string &$result = null): void
/**
*
*
- * @param resource $ftp
- * @param string $remote_file
- * @param string $local_file
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $remote_filename
+ * @param string $local_filename
* @param int $mode
* @throws FtpException
*
*/
-function ftp_append($ftp, string $remote_file, string $local_file, int $mode = FTP_BINARY): void
+function ftp_append($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): void
{
error_clear_last();
- $result = \ftp_append($ftp, $remote_file, $local_file, $mode);
+ $result = \ftp_append($ftp, $remote_filename, $local_filename, $mode);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -48,14 +48,14 @@ function ftp_append($ftp, string $remote_file, string $local_file, int $mode = F
/**
* Changes to the parent directory.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @throws FtpException
*
*/
-function ftp_cdup($ftp_stream): void
+function ftp_cdup($ftp): void
{
error_clear_last();
- $result = \ftp_cdup($ftp_stream);
+ $result = \ftp_cdup($ftp);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -65,15 +65,15 @@ function ftp_cdup($ftp_stream): void
/**
* Changes the current directory to the specified one.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $directory The target directory.
* @throws FtpException
*
*/
-function ftp_chdir($ftp_stream, string $directory): void
+function ftp_chdir($ftp, string $directory): void
{
error_clear_last();
- $result = \ftp_chdir($ftp_stream, $directory);
+ $result = \ftp_chdir($ftp, $directory);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -82,19 +82,19 @@ function ftp_chdir($ftp_stream, string $directory): void
/**
* Sets the permissions on the specified remote file to
- * mode.
+ * permissions.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param int $mode The new permissions, given as an octal value.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param int $permissions The new permissions, given as an octal value.
* @param string $filename The remote file.
* @return int Returns the new file permissions on success.
* @throws FtpException
*
*/
-function ftp_chmod($ftp_stream, int $mode, string $filename): int
+function ftp_chmod($ftp, int $permissions, string $filename): int
{
error_clear_last();
- $result = \ftp_chmod($ftp_stream, $mode, $filename);
+ $result = \ftp_chmod($ftp, $permissions, $filename);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -106,14 +106,14 @@ function ftp_chmod($ftp_stream, int $mode, string $filename): int
* ftp_close closes the given link identifier
* and releases the resource.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @throws FtpException
*
*/
-function ftp_close($ftp_stream): void
+function ftp_close($ftp): void
{
error_clear_last();
- $result = \ftp_close($ftp_stream);
+ $result = \ftp_close($ftp);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -122,9 +122,9 @@ function ftp_close($ftp_stream): void
/**
* ftp_connect opens an FTP connection to the
- * specified host.
+ * specified hostname.
*
- * @param string $host The FTP server address. This parameter shouldn't have any trailing
+ * @param string $hostname The FTP server address. This parameter shouldn't have any trailing
* slashes and shouldn't be prefixed with ftp://.
* @param int $port This parameter specifies an alternate port to connect to. If it is
* omitted or set to zero, then the default FTP port, 21, will be used.
@@ -132,14 +132,14 @@ function ftp_close($ftp_stream): void
* If omitted, the default value is 90 seconds. The timeout can be changed and
* queried at any time with ftp_set_option and
* ftp_get_option.
- * @return resource Returns a FTP stream on success.
+ * @return resource Returns an FTP\Connection instance on success.
* @throws FtpException
*
*/
-function ftp_connect(string $host, int $port = 21, int $timeout = 90)
+function ftp_connect(string $hostname, int $port = 21, int $timeout = 90)
{
error_clear_last();
- $result = \ftp_connect($host, $port, $timeout);
+ $result = \ftp_connect($hostname, $port, $timeout);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -149,17 +149,17 @@ function ftp_connect(string $host, int $port = 21, int $timeout = 90)
/**
* ftp_delete deletes the file specified by
- * path from the FTP server.
+ * filename from the FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param string $path The file to delete.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $filename The file to delete.
* @throws FtpException
*
*/
-function ftp_delete($ftp_stream, string $path): void
+function ftp_delete($ftp, string $filename): void
{
error_clear_last();
- $result = \ftp_delete($ftp_stream, $path);
+ $result = \ftp_delete($ftp, $filename);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -167,22 +167,22 @@ function ftp_delete($ftp_stream, string $path): void
/**
- * ftp_fget retrieves remote_file
+ * ftp_fget retrieves remote_filename
* from the FTP server, and writes it to the given file pointer.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param resource $handle An open file pointer in which we store the data.
- * @param string $remote_file The remote file path.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param resource $stream An open file pointer in which we store the data.
+ * @param string $remote_filename The remote file path.
* @param int $mode The transfer mode. Must be either FTP_ASCII or
* FTP_BINARY.
- * @param int $resumepos The position in the remote file to start downloading from.
+ * @param int $offset The position in the remote file to start downloading from.
* @throws FtpException
*
*/
-function ftp_fget($ftp_stream, $handle, string $remote_file, int $mode = FTP_BINARY, int $resumepos = 0): void
+function ftp_fget($ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
- $result = \ftp_fget($ftp_stream, $handle, $remote_file, $mode, $resumepos);
+ $result = \ftp_fget($ftp, $stream, $remote_filename, $mode, $offset);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -193,19 +193,19 @@ function ftp_fget($ftp_stream, $handle, string $remote_file, int $mode = FTP_BIN
* ftp_fput uploads the data from a file pointer
* to a remote file on the FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param string $remote_file The remote file path.
- * @param resource $handle An open file pointer on the local file. Reading stops at end of file.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $remote_filename The remote file path.
+ * @param resource $stream An open file pointer on the local file. Reading stops at end of file.
* @param int $mode The transfer mode. Must be either FTP_ASCII or
* FTP_BINARY.
- * @param int $startpos The position in the remote file to start uploading to.
+ * @param int $offset The position in the remote file to start uploading to.
* @throws FtpException
*
*/
-function ftp_fput($ftp_stream, string $remote_file, $handle, int $mode = FTP_BINARY, int $startpos = 0): void
+function ftp_fput($ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
- $result = \ftp_fput($ftp_stream, $remote_file, $handle, $mode, $startpos);
+ $result = \ftp_fput($ftp, $remote_filename, $stream, $mode, $offset);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -216,19 +216,19 @@ function ftp_fput($ftp_stream, string $remote_file, $handle, int $mode = FTP_BIN
* ftp_get retrieves a remote file from the FTP server,
* and saves it into a local file.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param string $local_file The local file path (will be overwritten if the file already exists).
- * @param string $remote_file The remote file path.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $local_filename The local file path (will be overwritten if the file already exists).
+ * @param string $remote_filename The remote file path.
* @param int $mode The transfer mode. Must be either FTP_ASCII or
* FTP_BINARY.
- * @param int $resumepos The position in the remote file to start downloading from.
+ * @param int $offset The position in the remote file to start downloading from.
* @throws FtpException
*
*/
-function ftp_get($ftp_stream, string $local_file, string $remote_file, int $mode = FTP_BINARY, int $resumepos = 0): void
+function ftp_get($ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
- $result = \ftp_get($ftp_stream, $local_file, $remote_file, $mode, $resumepos);
+ $result = \ftp_get($ftp, $local_filename, $remote_filename, $mode, $offset);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -236,18 +236,18 @@ function ftp_get($ftp_stream, string $local_file, string $remote_file, int $mode
/**
- * Logs in to the given FTP stream.
+ * Logs in to the given FTP connection.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $username The username (USER).
* @param string $password The password (PASS).
* @throws FtpException
*
*/
-function ftp_login($ftp_stream, string $username, string $password): void
+function ftp_login($ftp, string $username, string $password): void
{
error_clear_last();
- $result = \ftp_login($ftp_stream, $username, $password);
+ $result = \ftp_login($ftp, $username, $password);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -257,16 +257,16 @@ function ftp_login($ftp_stream, string $username, string $password): void
/**
* Creates the specified directory on the FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $directory The name of the directory that will be created.
* @return string Returns the newly created directory name on success.
* @throws FtpException
*
*/
-function ftp_mkdir($ftp_stream, string $directory): string
+function ftp_mkdir($ftp, string $directory): string
{
error_clear_last();
- $result = \ftp_mkdir($ftp_stream, $directory);
+ $result = \ftp_mkdir($ftp, $directory);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -277,16 +277,16 @@ function ftp_mkdir($ftp_stream, string $directory): string
/**
*
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $directory The directory to be listed.
* @return array Returns an array of arrays with file infos from the specified directory on success.
* @throws FtpException
*
*/
-function ftp_mlsd($ftp_stream, string $directory): array
+function ftp_mlsd($ftp, string $directory): array
{
error_clear_last();
- $result = \ftp_mlsd($ftp_stream, $directory);
+ $result = \ftp_mlsd($ftp, $directory);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -295,21 +295,50 @@ function ftp_mlsd($ftp_stream, string $directory): array
/**
+ * ftp_nb_put stores a local file on the FTP server.
*
+ * The difference between this function and the ftp_put
+ * is that this function uploads the file asynchronously, so your program can
+ * perform other operations while the file is being uploaded.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $remote_filename The remote file path.
+ * @param string $local_filename The local file path.
+ * @param int $mode The transfer mode. Must be either FTP_ASCII or
+ * FTP_BINARY.
+ * @param int $offset The position in the remote file to start uploading to.
+ * @return int Returns FTP_FAILED or FTP_FINISHED
+ * or FTP_MOREDATA to open the local file.
+ * @throws FtpException
+ *
+ */
+function ftp_nb_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int
+{
+ error_clear_last();
+ $result = \ftp_nb_put($ftp, $remote_filename, $local_filename, $mode, $offset);
+ if ($result === false) {
+ throw FtpException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ *
+ *
+ * @param resource $ftp An FTP\Connection instance.
* @param string $directory The directory to be listed. This parameter can also include arguments, eg.
- * ftp_nlist($conn_id, "-la /your/dir");
+ * ftp_nlist($ftp, "-la /your/dir");.
* Note that this parameter isn't escaped so there may be some issues with
* filenames containing spaces and other characters.
* @return array Returns an array of filenames from the specified directory on success.
* @throws FtpException
*
*/
-function ftp_nlist($ftp_stream, string $directory): array
+function ftp_nlist($ftp, string $directory): array
{
error_clear_last();
- $result = \ftp_nlist($ftp_stream, $directory);
+ $result = \ftp_nlist($ftp, $directory);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -326,15 +355,15 @@ function ftp_nlist($ftp_stream, string $directory): array
* Please note that ftp_pasv can only be called after a
* successful login or otherwise it will fail.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param bool $pasv If TRUE, the passive mode is turned on, else it's turned off.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param bool $enable If TRUE, the passive mode is turned on, else it's turned off.
* @throws FtpException
*
*/
-function ftp_pasv($ftp_stream, bool $pasv): void
+function ftp_pasv($ftp, bool $enable): void
{
error_clear_last();
- $result = \ftp_pasv($ftp_stream, $pasv);
+ $result = \ftp_pasv($ftp, $enable);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -344,19 +373,19 @@ function ftp_pasv($ftp_stream, bool $pasv): void
/**
* ftp_put stores a local file on the FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param string $remote_file The remote file path.
- * @param string $local_file The local file path.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $remote_filename The remote file path.
+ * @param string $local_filename The local file path.
* @param int $mode The transfer mode. Must be either FTP_ASCII or
* FTP_BINARY.
- * @param int $startpos The position in the remote file to start uploading to.
+ * @param int $offset The position in the remote file to start uploading to.
* @throws FtpException
*
*/
-function ftp_put($ftp_stream, string $remote_file, string $local_file, int $mode = FTP_BINARY, int $startpos = 0): void
+function ftp_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): void
{
error_clear_last();
- $result = \ftp_put($ftp_stream, $remote_file, $local_file, $mode, $startpos);
+ $result = \ftp_put($ftp, $remote_filename, $local_filename, $mode, $offset);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -366,15 +395,15 @@ function ftp_put($ftp_stream, string $remote_file, string $local_file, int $mode
/**
*
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @return string Returns the current directory name.
* @throws FtpException
*
*/
-function ftp_pwd($ftp_stream): string
+function ftp_pwd($ftp): string
{
error_clear_last();
- $result = \ftp_pwd($ftp_stream);
+ $result = \ftp_pwd($ftp);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -383,19 +412,41 @@ function ftp_pwd($ftp_stream): string
/**
+ * Sends an arbitrary command to the FTP server.
+ *
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $command The command to execute.
+ * @return array Returns the server's response as an array of strings.
+ * No parsing is performed on the response string, nor does
+ * ftp_raw determine if the command succeeded.
+ * @throws FtpException
+ *
+ */
+function ftp_raw($ftp, string $command): array
+{
+ error_clear_last();
+ $result = \ftp_raw($ftp, $command);
+ if ($result === null) {
+ throw FtpException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* ftp_rename renames a file or a directory on the FTP
* server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
- * @param string $oldname The old file/directory name.
- * @param string $newname The new name.
+ * @param resource $ftp An FTP\Connection instance.
+ * @param string $from The old file/directory name.
+ * @param string $to The new name.
* @throws FtpException
*
*/
-function ftp_rename($ftp_stream, string $oldname, string $newname): void
+function ftp_rename($ftp, string $from, string $to): void
{
error_clear_last();
- $result = \ftp_rename($ftp_stream, $oldname, $newname);
+ $result = \ftp_rename($ftp, $from, $to);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -405,16 +456,16 @@ function ftp_rename($ftp_stream, string $oldname, string $newname): void
/**
* Removes the specified directory on the FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $directory The directory to delete. This must be either an absolute or relative
* path to an empty directory.
* @throws FtpException
*
*/
-function ftp_rmdir($ftp_stream, string $directory): void
+function ftp_rmdir($ftp, string $directory): void
{
error_clear_last();
- $result = \ftp_rmdir($ftp_stream, $directory);
+ $result = \ftp_rmdir($ftp, $directory);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -429,16 +480,16 @@ function ftp_rmdir($ftp_stream, string $directory): void
* to server. They are useful for handling such things as file permissions and
* group membership.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @param string $command The SITE command. Note that this parameter isn't escaped so there may
* be some issues with filenames containing spaces and other characters.
* @throws FtpException
*
*/
-function ftp_site($ftp_stream, string $command): void
+function ftp_site($ftp, string $command): void
{
error_clear_last();
- $result = \ftp_site($ftp_stream, $command);
+ $result = \ftp_site($ftp, $command);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -447,14 +498,14 @@ function ftp_site($ftp_stream, string $command): void
/**
* ftp_ssl_connect opens an explicit SSL-FTP connection to the
- * specified host. That implies that
+ * specified hostname. That implies that
* ftp_ssl_connect will succeed even if the server is not
* configured for SSL-FTP, or its certificate is invalid. Only when
* ftp_login is called, the client will send the
* appropriate AUTH FTP command, so ftp_login will fail in
* the mentioned cases.
*
- * @param string $host The FTP server address. This parameter shouldn't have any trailing
+ * @param string $hostname The FTP server address. This parameter shouldn't have any trailing
* slashes and shouldn't be prefixed with ftp://.
* @param int $port This parameter specifies an alternate port to connect to. If it is
* omitted or set to zero, then the default FTP port, 21, will be used.
@@ -462,14 +513,14 @@ function ftp_site($ftp_stream, string $command): void
* If omitted, the default value is 90 seconds. The timeout can be changed and
* queried at any time with ftp_set_option and
* ftp_get_option.
- * @return resource Returns a SSL-FTP stream on success.
+ * @return resource Returns an FTP\Connection instance on success.
* @throws FtpException
*
*/
-function ftp_ssl_connect(string $host, int $port = 21, int $timeout = 90)
+function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90)
{
error_clear_last();
- $result = \ftp_ssl_connect($host, $port, $timeout);
+ $result = \ftp_ssl_connect($hostname, $port, $timeout);
if ($result === false) {
throw FtpException::createFromPhpError();
}
@@ -480,15 +531,15 @@ function ftp_ssl_connect(string $host, int $port = 21, int $timeout = 90)
/**
* Returns the system type identifier of the remote FTP server.
*
- * @param resource $ftp_stream The link identifier of the FTP connection.
+ * @param resource $ftp An FTP\Connection instance.
* @return string Returns the remote system type.
* @throws FtpException
*
*/
-function ftp_systype($ftp_stream): string
+function ftp_systype($ftp): string
{
error_clear_last();
- $result = \ftp_systype($ftp_stream);
+ $result = \ftp_systype($ftp);
if ($result === false) {
throw FtpException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/funchand.php b/vendor/thecodingmachine/safe/generated/funchand.php
index 64654526e..4b2a7b8ff 100644
--- a/vendor/thecodingmachine/safe/generated/funchand.php
+++ b/vendor/thecodingmachine/safe/generated/funchand.php
@@ -5,12 +5,14 @@ namespace Safe;
use Safe\Exceptions\FunchandException;
/**
- * Creates an anonymous function from the parameters passed, and
- * returns a unique name for it.
+ * Creates a function dynamically from the parameters passed, and returns a unique name for it.
*
- * @param string $args The function arguments.
+ * @param string $args The function arguments, as a single comma-separated string.
* @param string $code The function code.
* @return string Returns a unique function name as a string.
+ * Note that the name contains a non-printable character ("\0"),
+ * so care should be taken when printing the name or incorporating it in any other
+ * string.
* @throws FunchandException
*
*/
@@ -28,18 +30,18 @@ function create_function(string $args, string $code): string
/**
*
*
- * @param callable(): void $function The function to register.
- * @param mixed $params
+ * @param callable(): void $callback The function to register.
+ * @param mixed $args
* @throws FunchandException
*
*/
-function register_tick_function(callable $function, ...$params): void
+function register_tick_function(callable $callback, ...$args): void
{
error_clear_last();
- if ($params !== []) {
- $result = \register_tick_function($function, ...$params);
+ if ($args !== []) {
+ $result = \register_tick_function($callback, ...$args);
} else {
- $result = \register_tick_function($function);
+ $result = \register_tick_function($callback);
}
if ($result === false) {
throw FunchandException::createFromPhpError();
diff --git a/vendor/thecodingmachine/safe/generated/functionsList.php b/vendor/thecodingmachine/safe/generated/functionsList.php
index a43e7efa6..5a590058e 100644
--- a/vendor/thecodingmachine/safe/generated/functionsList.php
+++ b/vendor/thecodingmachine/safe/generated/functionsList.php
@@ -3,8 +3,8 @@
return [
'apache_getenv',
'apache_get_version',
+ 'apache_lookup_uri',
'apache_request_headers',
- 'apache_reset_timeout',
'apache_response_headers',
'apache_setenv',
'apcu_cache_info',
@@ -14,14 +14,10 @@ return [
'apcu_inc',
'apcu_sma_info',
'apc_fetch',
- 'array_combine',
- 'array_flip',
- 'array_replace',
- 'array_replace_recursive',
'array_walk_recursive',
- 'arsort',
- 'asort',
+ 'assert_options',
'base64_decode',
+ 'bindtextdomain',
'bzclose',
'bzflush',
'bzread',
@@ -37,32 +33,75 @@ return [
'class_uses',
'cli_set_process_title',
'closelog',
+ 'com_create_guid',
'com_event_sink',
'com_load_typelib',
'com_print_typeinfo',
'convert_uudecode',
- 'convert_uuencode',
'copy',
'create_function',
+ 'cubrid_bind',
+ 'cubrid_column_names',
+ 'cubrid_column_types',
+ 'cubrid_col_size',
+ 'cubrid_commit',
+ 'cubrid_connect',
+ 'cubrid_connect_with_url',
+ 'cubrid_current_oid',
+ 'cubrid_disconnect',
+ 'cubrid_drop',
'cubrid_free_result',
'cubrid_get_charset',
+ 'cubrid_get_class_name',
'cubrid_get_client_info',
'cubrid_get_db_parameter',
+ 'cubrid_get_query_timeout',
'cubrid_get_server_info',
'cubrid_insert_id',
+ 'cubrid_lob2_bind',
+ 'cubrid_lob2_close',
+ 'cubrid_lob2_export',
+ 'cubrid_lob2_import',
'cubrid_lob2_new',
+ 'cubrid_lob2_read',
+ 'cubrid_lob2_seek',
+ 'cubrid_lob2_seek64',
'cubrid_lob2_size',
'cubrid_lob2_size64',
'cubrid_lob2_tell',
'cubrid_lob2_tell64',
+ 'cubrid_lob2_write',
+ 'cubrid_lob_close',
+ 'cubrid_lob_export',
+ 'cubrid_lob_get',
+ 'cubrid_lob_send',
+ 'cubrid_lob_size',
+ 'cubrid_lock_read',
+ 'cubrid_lock_write',
+ 'cubrid_move_cursor',
+ 'cubrid_next_result',
+ 'cubrid_pconnect',
+ 'cubrid_pconnect_with_url',
+ 'cubrid_prepare',
+ 'cubrid_put',
+ 'cubrid_rollback',
+ 'cubrid_schema',
+ 'cubrid_seq_drop',
+ 'cubrid_seq_insert',
+ 'cubrid_seq_put',
+ 'cubrid_set_add',
+ 'cubrid_set_autocommit',
'cubrid_set_db_parameter',
+ 'cubrid_set_drop',
+ 'cubrid_set_query_timeout',
+ 'curl_copy_handle',
'curl_escape',
'curl_exec',
'curl_getinfo',
'curl_init',
- 'curl_multi_errno',
'curl_multi_info_read',
'curl_multi_init',
+ 'curl_multi_setopt',
'curl_setopt',
'curl_share_errno',
'curl_share_setopt',
@@ -102,6 +141,7 @@ return [
'eio_event_loop',
'eio_fallocate',
'eio_fchmod',
+ 'eio_fchown',
'eio_fdatasync',
'eio_fstat',
'eio_fstatvfs',
@@ -131,16 +171,20 @@ return [
'eio_utime',
'eio_write',
'error_log',
+ 'exec',
'fastcgi_finish_request',
'fbird_blob_cancel',
'fclose',
+ 'fdatasync',
'fflush',
+ 'fgetcsv',
'file',
'fileatime',
'filectime',
'fileinode',
'filemtime',
'fileowner',
+ 'fileperms',
'filesize',
'file_get_contents',
'file_put_contents',
@@ -153,6 +197,8 @@ return [
'fputcsv',
'fread',
'fsockopen',
+ 'fstat',
+ 'fsync',
'ftp_alloc',
'ftp_append',
'ftp_cdup',
@@ -167,10 +213,12 @@ return [
'ftp_login',
'ftp_mkdir',
'ftp_mlsd',
+ 'ftp_nb_put',
'ftp_nlist',
'ftp_pasv',
'ftp_put',
'ftp_pwd',
+ 'ftp_raw',
'ftp_rename',
'ftp_rmdir',
'ftp_site',
@@ -190,19 +238,22 @@ return [
'getopt',
'getprotobyname',
'getprotobynumber',
+ 'getrusage',
+ 'getservbyport',
'get_headers',
+ 'get_include_path',
+ 'get_meta_tags',
'glob',
- 'gmdate',
- 'gmp_binomial',
- 'gmp_export',
- 'gmp_import',
+ 'gmmktime',
'gmp_random_seed',
+ 'gmstrftime',
'gnupg_adddecryptkey',
'gnupg_addencryptkey',
'gnupg_addsignkey',
'gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys',
'gnupg_clearsignkeys',
+ 'gnupg_deletekey',
'gnupg_setarmor',
'gnupg_setsignmode',
'gzclose',
@@ -210,18 +261,23 @@ return [
'gzdecode',
'gzdeflate',
'gzencode',
+ 'gzfile',
'gzgets',
'gzgetss',
'gzinflate',
+ 'gzopen',
'gzpassthru',
+ 'gzread',
'gzrewind',
'gzuncompress',
+ 'gzwrite',
'hash_hkdf',
'hash_update_file',
'header_register_callback',
'hex2bin',
'highlight_file',
'highlight_string',
+ 'hrtime',
'ibase_add_user',
'ibase_backup',
'ibase_blob_cancel',
@@ -248,6 +304,7 @@ return [
'iconv',
'iconv_get_encoding',
'iconv_set_encoding',
+ 'idate',
'image2wbmp',
'imageaffine',
'imageaffinematrixconcat',
@@ -255,12 +312,14 @@ return [
'imagealphablending',
'imageantialias',
'imagearc',
+ 'imageavif',
'imagebmp',
'imagechar',
'imagecharup',
'imagecolorat',
'imagecolordeallocate',
'imagecolormatch',
+ 'imagecolorset',
'imageconvolution',
'imagecopy',
'imagecopymerge',
@@ -268,6 +327,7 @@ return [
'imagecopyresampled',
'imagecopyresized',
'imagecreate',
+ 'imagecreatefromavif',
'imagecreatefrombmp',
'imagecreatefromgd',
'imagecreatefromgd2',
@@ -275,6 +335,8 @@ return [
'imagecreatefromgif',
'imagecreatefromjpeg',
'imagecreatefrompng',
+ 'imagecreatefromstring',
+ 'imagecreatefromtga',
'imagecreatefromwbmp',
'imagecreatefromwebp',
'imagecreatefromxbm',
@@ -288,11 +350,12 @@ return [
'imagefill',
'imagefilledarc',
'imagefilledellipse',
- 'imagefilledpolygon',
'imagefilledrectangle',
'imagefilltoborder',
'imagefilter',
'imageflip',
+ 'imageftbbox',
+ 'imagefttext',
'imagegammacorrect',
'imagegd',
'imagegd2',
@@ -303,10 +366,9 @@ return [
'imagelayereffect',
'imageline',
'imageloadfont',
- 'imageopenpolygon',
'imagepng',
- 'imagepolygon',
'imagerectangle',
+ 'imageresolution',
'imagerotate',
'imagesavealpha',
'imagescale',
@@ -327,29 +389,49 @@ return [
'imagewbmp',
'imagewebp',
'imagexbm',
+ 'image_type_to_extension',
+ 'imap_8bit',
'imap_append',
+ 'imap_base64',
+ 'imap_binary',
+ 'imap_body',
+ 'imap_bodystruct',
'imap_check',
'imap_clearflag_full',
'imap_close',
'imap_createmailbox',
'imap_deletemailbox',
+ 'imap_fetchbody',
+ 'imap_fetchheader',
+ 'imap_fetchmime',
'imap_fetchstructure',
+ 'imap_fetch_overview',
'imap_gc',
+ 'imap_getacl',
+ 'imap_getmailboxes',
+ 'imap_getsubscribed',
'imap_headerinfo',
+ 'imap_headers',
+ 'imap_listscan',
+ 'imap_lsub',
'imap_mail',
'imap_mailboxmsginfo',
'imap_mail_compose',
'imap_mail_copy',
'imap_mail_move',
+ 'imap_mime_header_decode',
'imap_mutf7_to_utf8',
'imap_num_msg',
'imap_open',
+ 'imap_qprint',
'imap_renamemailbox',
+ 'imap_rfc822_write_address',
'imap_savebody',
'imap_setacl',
'imap_setflag_full',
'imap_set_quota',
'imap_sort',
+ 'imap_status',
'imap_subscribe',
'imap_thread',
'imap_timeout',
@@ -361,42 +443,25 @@ return [
'inflate_get_read_len',
'inflate_get_status',
'inflate_init',
- 'ingres_autocommit',
- 'ingres_close',
- 'ingres_commit',
- 'ingres_connect',
- 'ingres_execute',
- 'ingres_field_name',
- 'ingres_field_type',
- 'ingres_free_result',
- 'ingres_pconnect',
- 'ingres_result_seek',
- 'ingres_rollback',
- 'ingres_set_environment',
'ini_get',
'ini_set',
'inotify_init',
'inotify_rm_watch',
'iptcembed',
'iptcparse',
- 'jdtounix',
'jpeg2wbmp',
'json_decode',
'json_encode',
- 'json_last_error_msg',
- 'krsort',
- 'ksort',
'lchgrp',
'lchown',
+ 'ldap_8859_to_t61',
'ldap_add',
- 'ldap_add_ext',
'ldap_bind',
- 'ldap_bind_ext',
'ldap_control_paged_result',
'ldap_control_paged_result_response',
'ldap_count_entries',
'ldap_delete',
- 'ldap_delete_ext',
+ 'ldap_dn2ufn',
'ldap_exop',
'ldap_exop_passwd',
'ldap_exop_whoami',
@@ -410,27 +475,22 @@ return [
'ldap_get_option',
'ldap_get_values',
'ldap_get_values_len',
- 'ldap_list',
'ldap_modify_batch',
'ldap_mod_add',
- 'ldap_mod_add_ext',
'ldap_mod_del',
- 'ldap_mod_del_ext',
'ldap_mod_replace',
- 'ldap_mod_replace_ext',
'ldap_next_attribute',
'ldap_parse_exop',
'ldap_parse_result',
- 'ldap_read',
'ldap_rename',
- 'ldap_rename_ext',
'ldap_sasl_bind',
- 'ldap_search',
'ldap_set_option',
'ldap_unbind',
'libxml_get_last_error',
'libxml_set_external_entity_loader',
'link',
+ 'long2ip',
+ 'lstat',
'lzf_compress',
'lzf_decompress',
'mailparse_msg_extract_part_file',
@@ -439,6 +499,7 @@ return [
'mailparse_msg_parse_file',
'mailparse_stream_encode',
'mb_chr',
+ 'mb_convert_encoding',
'mb_detect_order',
'mb_encoding_aliases',
'mb_eregi_replace',
@@ -448,6 +509,7 @@ return [
'mb_ereg_search_init',
'mb_ereg_search_regs',
'mb_ereg_search_setpos',
+ 'mb_get_info',
'mb_http_output',
'mb_internal_encoding',
'mb_ord',
@@ -455,42 +517,17 @@ return [
'mb_regex_encoding',
'mb_send_mail',
'mb_split',
- 'mb_str_split',
'md5_file',
- 'metaphone',
'mime_content_type',
'mkdir',
'mktime',
+ 'msg_get_queue',
'msg_queue_exists',
'msg_receive',
'msg_remove_queue',
'msg_send',
'msg_set_queue',
- 'msql_affected_rows',
- 'msql_close',
- 'msql_connect',
- 'msql_create_db',
- 'msql_data_seek',
- 'msql_db_query',
- 'msql_drop_db',
- 'msql_field_len',
- 'msql_field_name',
- 'msql_field_seek',
- 'msql_field_table',
- 'msql_field_type',
- 'msql_free_result',
- 'msql_pconnect',
- 'msql_query',
- 'msql_select_db',
- 'mysqli_get_cache_stats',
- 'mysqli_get_client_stats',
- 'mysqlnd_ms_dump_servers',
- 'mysqlnd_ms_fabric_select_global',
- 'mysqlnd_ms_fabric_select_shard',
- 'mysqlnd_ms_get_last_used_connection',
- 'mysqlnd_qc_clear_cache',
- 'mysqlnd_qc_set_is_select',
- 'mysqlnd_qc_set_storage_handler',
+ 'msg_stat_queue',
'mysql_close',
'mysql_connect',
'mysql_create_db',
@@ -522,19 +559,19 @@ return [
'mysql_tablename',
'mysql_thread_id',
'mysql_unbuffered_query',
- 'natcasesort',
- 'natsort',
+ 'net_get_interfaces',
+ 'ob_clean',
'ob_end_clean',
'ob_end_flush',
+ 'ob_flush',
+ 'ob_start',
'oci_bind_array_by_name',
'oci_bind_by_name',
'oci_cancel',
- 'oci_close',
'oci_commit',
'oci_connect',
'oci_define_by_name',
'oci_execute',
- 'oci_fetch_all',
'oci_field_name',
'oci_field_precision',
'oci_field_scale',
@@ -547,10 +584,10 @@ return [
'oci_new_connect',
'oci_new_cursor',
'oci_new_descriptor',
- 'oci_num_fields',
'oci_num_rows',
'oci_parse',
'oci_pconnect',
+ 'oci_register_taf_callback',
'oci_result',
'oci_rollback',
'oci_server_version',
@@ -562,6 +599,7 @@ return [
'oci_set_edition',
'oci_set_module_name',
'oci_set_prefetch',
+ 'oci_set_prefetch_lob',
'oci_statement_type',
'oci_unregister_taf_callback',
'odbc_autocommit',
@@ -569,6 +607,8 @@ return [
'odbc_columnprivileges',
'odbc_columns',
'odbc_commit',
+ 'odbc_connect',
+ 'odbc_cursor',
'odbc_data_source',
'odbc_exec',
'odbc_execute',
@@ -581,8 +621,11 @@ return [
'odbc_foreignkeys',
'odbc_gettypeinfo',
'odbc_longreadlen',
+ 'odbc_pconnect',
'odbc_prepare',
'odbc_primarykeys',
+ 'odbc_procedurecolumns',
+ 'odbc_procedures',
'odbc_result',
'odbc_result_all',
'odbc_rollback',
@@ -596,8 +639,14 @@ return [
'opendir',
'openlog',
'openssl_cipher_iv_length',
+ 'openssl_cms_decrypt',
+ 'openssl_cms_encrypt',
+ 'openssl_cms_read',
+ 'openssl_cms_sign',
+ 'openssl_cms_verify',
'openssl_csr_export',
'openssl_csr_export_to_file',
+ 'openssl_csr_get_public_key',
'openssl_csr_get_subject',
'openssl_csr_new',
'openssl_csr_sign',
@@ -605,6 +654,7 @@ return [
'openssl_dh_compute_key',
'openssl_digest',
'openssl_encrypt',
+ 'openssl_get_curve_names',
'openssl_open',
'openssl_pbkdf2',
'openssl_pkcs7_decrypt',
@@ -614,6 +664,7 @@ return [
'openssl_pkcs12_export',
'openssl_pkcs12_export_to_file',
'openssl_pkcs12_read',
+ 'openssl_pkey_derive',
'openssl_pkey_export',
'openssl_pkey_export_to_file',
'openssl_pkey_get_private',
@@ -626,6 +677,11 @@ return [
'openssl_random_pseudo_bytes',
'openssl_seal',
'openssl_sign',
+ 'openssl_spki_export',
+ 'openssl_spki_export_challenge',
+ 'openssl_spki_new',
+ 'openssl_spki_verify',
+ 'openssl_verify',
'openssl_x509_export',
'openssl_x509_export_to_file',
'openssl_x509_fingerprint',
@@ -636,123 +692,43 @@ return [
'parse_ini_file',
'parse_ini_string',
'parse_url',
- 'password_hash',
- 'pcntl_exec',
+ 'passthru',
'pcntl_getpriority',
'pcntl_setpriority',
+ 'pcntl_signal',
'pcntl_signal_dispatch',
'pcntl_sigprocmask',
- 'pcntl_strerror',
- 'PDF_activate_item',
- 'PDF_add_locallink',
- 'PDF_add_nameddest',
- 'PDF_add_note',
- 'PDF_add_pdflink',
- 'PDF_add_thumbnail',
- 'PDF_add_weblink',
- 'PDF_attach_file',
- 'PDF_begin_layer',
- 'PDF_begin_page',
- 'PDF_begin_page_ext',
- 'PDF_circle',
- 'PDF_clip',
- 'PDF_close',
- 'PDF_closepath',
- 'PDF_closepath_fill_stroke',
- 'PDF_closepath_stroke',
- 'PDF_close_pdi',
- 'PDF_close_pdi_page',
- 'PDF_concat',
- 'PDF_continue_text',
- 'PDF_curveto',
- 'PDF_delete',
- 'PDF_end_layer',
- 'PDF_end_page',
- 'PDF_end_page_ext',
- 'PDF_end_pattern',
- 'PDF_end_template',
- 'PDF_fill',
- 'PDF_fill_stroke',
- 'PDF_fit_image',
- 'PDF_fit_pdi_page',
- 'PDF_fit_textline',
- 'PDF_initgraphics',
- 'PDF_lineto',
- 'PDF_makespotcolor',
- 'PDF_moveto',
- 'PDF_open_file',
- 'PDF_place_image',
- 'PDF_place_pdi_page',
- 'PDF_rect',
- 'PDF_restore',
- 'PDF_rotate',
- 'PDF_save',
- 'PDF_scale',
- 'PDF_setcolor',
- 'PDF_setdash',
- 'PDF_setdashpattern',
- 'PDF_setflat',
- 'PDF_setfont',
- 'PDF_setgray',
- 'PDF_setgray_fill',
- 'PDF_setgray_stroke',
- 'PDF_setlinejoin',
- 'PDF_setlinewidth',
- 'PDF_setmatrix',
- 'PDF_setmiterlimit',
- 'PDF_setrgbcolor',
- 'PDF_setrgbcolor_fill',
- 'PDF_setrgbcolor_stroke',
- 'PDF_set_border_color',
- 'PDF_set_border_dash',
- 'PDF_set_border_style',
- 'PDF_set_info',
- 'PDF_set_layer_dependency',
- 'PDF_set_parameter',
- 'PDF_set_text_pos',
- 'PDF_set_value',
- 'PDF_show',
- 'PDF_show_xy',
- 'PDF_skew',
- 'PDF_stroke',
+ 'pcntl_sigtimedwait',
+ 'pcntl_sigwaitinfo',
+ 'pfsockopen',
'pg_cancel_query',
- 'pg_client_encoding',
- 'pg_close',
'pg_connect',
'pg_connection_reset',
'pg_convert',
'pg_copy_from',
'pg_copy_to',
- 'pg_dbname',
'pg_delete',
'pg_end_copy',
'pg_execute',
- 'pg_field_name',
'pg_field_table',
- 'pg_field_type',
'pg_flush',
'pg_free_result',
'pg_host',
'pg_insert',
- 'pg_last_error',
- 'pg_last_notice',
'pg_last_oid',
'pg_lo_close',
'pg_lo_export',
'pg_lo_import',
'pg_lo_open',
'pg_lo_read',
- 'pg_lo_read_all',
'pg_lo_seek',
'pg_lo_truncate',
'pg_lo_unlink',
'pg_lo_write',
'pg_meta_data',
- 'pg_options',
'pg_parameter_status',
'pg_pconnect',
'pg_ping',
- 'pg_port',
'pg_prepare',
'pg_put_line',
'pg_query',
@@ -760,21 +736,21 @@ return [
'pg_result_error_field',
'pg_result_seek',
'pg_select',
- 'pg_send_execute',
- 'pg_send_prepare',
- 'pg_send_query',
- 'pg_send_query_params',
'pg_socket',
'pg_trace',
- 'pg_tty',
'pg_update',
- 'pg_version',
'phpcredits',
'phpinfo',
+ 'php_sapi_name',
'png2wbmp',
'posix_access',
+ 'posix_getgrgid',
'posix_getgrnam',
- 'posix_getpgid',
+ 'posix_getgroups',
+ 'posix_getlogin',
+ 'posix_getpwuid',
+ 'posix_getrlimit',
+ 'posix_getsid',
'posix_initgroups',
'posix_kill',
'posix_mkfifo',
@@ -785,11 +761,13 @@ return [
'posix_setpgid',
'posix_setrlimit',
'posix_setuid',
+ 'posix_times',
+ 'posix_uname',
+ 'preg_grep',
'preg_match',
'preg_match_all',
'preg_replace',
'preg_split',
- 'proc_get_status',
'proc_nice',
'pspell_add_to_personal',
'pspell_add_to_session',
@@ -805,6 +783,7 @@ return [
'pspell_config_save_repl',
'pspell_new',
'pspell_new_config',
+ 'pspell_new_personal',
'pspell_save_wordlist',
'pspell_store_replacement',
'ps_add_launchlink',
@@ -886,14 +865,21 @@ return [
'register_tick_function',
'rename',
'rewind',
- 'rewinddir',
'rmdir',
'rpmaddtag',
'rrd_create',
- 'rsort',
+ 'rrd_first',
+ 'rrd_graph',
+ 'rrd_info',
+ 'rrd_lastupdate',
+ 'rrd_restore',
+ 'rrd_tune',
+ 'rrd_update',
+ 'rrd_xport',
'sapi_windows_cp_conv',
'sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event',
+ 'sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support',
'scandir',
'sem_acquire',
@@ -901,19 +887,27 @@ return [
'sem_release',
'sem_remove',
'session_abort',
+ 'session_create_id',
'session_decode',
'session_destroy',
+ 'session_encode',
+ 'session_id',
+ 'session_module_name',
+ 'session_name',
'session_regenerate_id',
'session_reset',
+ 'session_save_path',
'session_unset',
'session_write_close',
'settype',
'set_include_path',
'set_time_limit',
'sha1_file',
+ 'shell_exec',
'shmop_delete',
'shmop_read',
- 'shmop_write',
+ 'shm_attach',
+ 'shm_detach',
'shm_put_var',
'shm_remove',
'shm_remove_var',
@@ -925,6 +919,7 @@ return [
'socket_accept',
'socket_addrinfo_bind',
'socket_addrinfo_connect',
+ 'socket_addrinfo_lookup',
'socket_bind',
'socket_connect',
'socket_create',
@@ -948,14 +943,23 @@ return [
'socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release',
- 'sodium_crypto_pwhash',
- 'sodium_crypto_pwhash_str',
+ 'sodium_crypto_aead_aes256gcm_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_encrypt',
+ 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
+ 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
+ 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
+ 'sodium_crypto_auth_verify',
+ 'sodium_crypto_box_open',
+ 'sodium_crypto_box_seal_open',
+ 'sodium_crypto_generichash_update',
+ 'sodium_crypto_secretbox_open',
+ 'sodium_crypto_sign_open',
+ 'sodium_crypto_sign_verify_detached',
'solr_get_version',
- 'sort',
- 'soundex',
'spl_autoload_register',
'spl_autoload_unregister',
- 'sprintf',
'sqlsrv_begin_transaction',
'sqlsrv_cancel',
'sqlsrv_client_info',
@@ -981,11 +985,14 @@ return [
'ssh2_connect',
'ssh2_disconnect',
'ssh2_exec',
+ 'ssh2_forward_accept',
+ 'ssh2_forward_listen',
'ssh2_publickey_add',
'ssh2_publickey_init',
'ssh2_publickey_remove',
'ssh2_scp_recv',
'ssh2_scp_send',
+ 'ssh2_send_eof',
'ssh2_sftp',
'ssh2_sftp_chmod',
'ssh2_sftp_mkdir',
@@ -993,6 +1000,7 @@ return [
'ssh2_sftp_rmdir',
'ssh2_sftp_symlink',
'ssh2_sftp_unlink',
+ 'ssh2_shell',
'stream_context_set_params',
'stream_copy_to_stream',
'stream_filter_append',
@@ -1000,22 +1008,28 @@ return [
'stream_filter_register',
'stream_filter_remove',
'stream_get_contents',
+ 'stream_get_line',
'stream_isatty',
'stream_resolve_include_path',
'stream_set_blocking',
'stream_set_timeout',
'stream_socket_accept',
'stream_socket_client',
+ 'stream_socket_get_name',
'stream_socket_pair',
+ 'stream_socket_recvfrom',
+ 'stream_socket_sendto',
'stream_socket_server',
'stream_socket_shutdown',
'stream_supports_lock',
'stream_wrapper_register',
'stream_wrapper_restore',
'stream_wrapper_unregister',
+ 'strftime',
'strptime',
'strtotime',
- 'substr',
+ 'swoole_async_dns_lookup',
+ 'swoole_async_readfile',
'swoole_async_write',
'swoole_async_writefile',
'swoole_event_defer',
@@ -1030,15 +1044,14 @@ return [
'time_sleep_until',
'tmpfile',
'touch',
- 'uasort',
- 'uksort',
+ 'unixtojd',
'unlink',
'unpack',
'uopz_extend',
'uopz_implement',
- 'usort',
+ 'variant_date_to_timestamp',
+ 'variant_round',
'virtual',
- 'vsprintf',
'xdiff_file_bdiff',
'xdiff_file_bpatch',
'xdiff_file_diff',
@@ -1049,9 +1062,17 @@ return [
'xdiff_string_patch',
'xdiff_string_patch_binary',
'xmlrpc_set_type',
- 'xml_parser_create',
- 'xml_parser_create_ns',
+ 'xml_parser_free',
+ 'xml_set_character_data_handler',
+ 'xml_set_default_handler',
+ 'xml_set_element_handler',
+ 'xml_set_end_namespace_decl_handler',
+ 'xml_set_external_entity_ref_handler',
+ 'xml_set_notation_decl_handler',
'xml_set_object',
+ 'xml_set_processing_instruction_handler',
+ 'xml_set_start_namespace_decl_handler',
+ 'xml_set_unparsed_entity_decl_handler',
'yaml_parse',
'yaml_parse_file',
'yaml_parse_url',
@@ -1064,6 +1085,10 @@ return [
'yaz_search',
'yaz_wait',
'zip_entry_close',
+ 'zip_entry_compressedsize',
+ 'zip_entry_compressionmethod',
+ 'zip_entry_filesize',
+ 'zip_entry_name',
'zip_entry_open',
'zip_entry_read',
'zlib_decode',
diff --git a/vendor/thecodingmachine/safe/generated/gettext.php b/vendor/thecodingmachine/safe/generated/gettext.php
new file mode 100644
index 000000000..f7816e381
--- /dev/null
+++ b/vendor/thecodingmachine/safe/generated/gettext.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Safe;
+
+use Safe\Exceptions\GettextException;
+
+/**
+ * The bindtextdomain function sets or gets the path
+ * for a domain.
+ *
+ * @param string $domain The domain.
+ * @param string $directory The directory path.
+ * An empty string means the current directory.
+ * If NULL, the currently set directory is returned.
+ * @return string The full pathname for the domain currently being set.
+ * @throws GettextException
+ *
+ */
+function bindtextdomain(string $domain, string $directory): string
+{
+ error_clear_last();
+ $result = \bindtextdomain($domain, $directory);
+ if ($result === false) {
+ throw GettextException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/generated/gmp.php b/vendor/thecodingmachine/safe/generated/gmp.php
index dae15975d..b2b88f6e4 100644
--- a/vendor/thecodingmachine/safe/generated/gmp.php
+++ b/vendor/thecodingmachine/safe/generated/gmp.php
@@ -5,75 +5,13 @@ namespace Safe;
use Safe\Exceptions\GmpException;
/**
- * Calculates the binomial coefficient C(n, k).
- *
- * @param \GMP|string|int $n Either a GMP number resource in PHP 5.5 and earlier, a GMP object in PHP 5.6 and later, or a numeric string provided that it is possible to convert the latter to a number.
- * @param int $k
- * @return \GMP Returns the binomial coefficient C(n, k).
- * @throws GmpException
- *
- */
-function gmp_binomial($n, int $k): \GMP
-{
- error_clear_last();
- $result = \gmp_binomial($n, $k);
- if ($result === false) {
- throw GmpException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Export a GMP number to a binary string
- *
- * @param \GMP|string|int $gmpnumber The GMP number being exported
- * @param int $word_size Default value is 1. The number of bytes in each chunk of binary data. This is mainly used in conjunction with the options parameter.
- * @param int $options Default value is GMP_MSW_FIRST | GMP_NATIVE_ENDIAN.
- * @return string Returns a string.
- * @throws GmpException
- *
- */
-function gmp_export($gmpnumber, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): string
-{
- error_clear_last();
- $result = \gmp_export($gmpnumber, $word_size, $options);
- if ($result === false) {
- throw GmpException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Import a GMP number from a binary string
- *
- * @param string $data The binary string being imported
- * @param int $word_size Default value is 1. The number of bytes in each chunk of binary data. This is mainly used in conjunction with the options parameter.
- * @param int $options Default value is GMP_MSW_FIRST | GMP_NATIVE_ENDIAN.
- * @return \GMP Returns a GMP number.
- * @throws GmpException
- *
- */
-function gmp_import(string $data, int $word_size = 1, int $options = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): \GMP
-{
- error_clear_last();
- $result = \gmp_import($data, $word_size, $options);
- if ($result === false) {
- throw GmpException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
*
*
* @param \GMP|string|int $seed The seed to be set for the gmp_random,
* gmp_random_bits, and
* gmp_random_range functions.
*
- * Either a GMP number resource in PHP 5.5 and earlier, a GMP object in PHP 5.6 and later, or a numeric string provided that it is possible to convert the latter to a number.
+ * A GMP object, an integer or a numeric string.
* @throws GmpException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/gnupg.php b/vendor/thecodingmachine/safe/generated/gnupg.php
index b5d85ca3a..0ecb886b7 100644
--- a/vendor/thecodingmachine/safe/generated/gnupg.php
+++ b/vendor/thecodingmachine/safe/generated/gnupg.php
@@ -122,6 +122,26 @@ function gnupg_clearsignkeys($identifier): void
/**
+ *
+ *
+ * @param resource $identifier The gnupg identifier, from a call to
+ * gnupg_init or gnupg.
+ * @param string $key The key to delete.
+ * @param bool $allow_secret It specifies whether to delete secret keys as well.
+ * @throws GnupgException
+ *
+ */
+function gnupg_deletekey($identifier, string $key, bool $allow_secret): void
+{
+ error_clear_last();
+ $result = \gnupg_deletekey($identifier, $key, $allow_secret);
+ if ($result === false) {
+ throw GnupgException::createFromPhpError();
+ }
+}
+
+
+/**
* Toggle the armored output.
*
* @param resource $identifier The gnupg identifier, from a call to
diff --git a/vendor/thecodingmachine/safe/generated/hash.php b/vendor/thecodingmachine/safe/generated/hash.php
index 2c327c0e3..5acbc2670 100644
--- a/vendor/thecodingmachine/safe/generated/hash.php
+++ b/vendor/thecodingmachine/safe/generated/hash.php
@@ -16,7 +16,7 @@ use Safe\Exceptions\HashException;
*
*
* Non-cryptographic hash functions are not allowed.
- * @param string $ikm Input keying material (raw binary). Cannot be empty.
+ * @param string $key Input keying material (raw binary). Cannot be empty.
* @param int $length Desired output length in bytes.
* Cannot be greater than 255 times the chosen hash function size.
*
@@ -31,10 +31,10 @@ use Safe\Exceptions\HashException;
* @throws HashException
*
*/
-function hash_hkdf(string $algo, string $ikm, int $length = 0, string $info = '', string $salt = ''): string
+function hash_hkdf(string $algo, string $key, int $length = 0, string $info = "", string $salt = ""): string
{
error_clear_last();
- $result = \hash_hkdf($algo, $ikm, $length, $info, $salt);
+ $result = \hash_hkdf($algo, $key, $length, $info, $salt);
if ($result === false) {
throw HashException::createFromPhpError();
}
@@ -45,16 +45,20 @@ function hash_hkdf(string $algo, string $ikm, int $length = 0, string $info = ''
/**
*
*
- * @param \HashContext $hcontext Hashing context returned by hash_init.
+ * @param \HashContext $context Hashing context returned by hash_init.
* @param string $filename URL describing location of file to be hashed; Supports fopen wrappers.
- * @param \HashContext|null $scontext Stream context as returned by stream_context_create.
+ * @param \HashContext|null $stream_context Stream context as returned by stream_context_create.
* @throws HashException
*
*/
-function hash_update_file(\HashContext $hcontext, string $filename, ?\HashContext $scontext = null): void
+function hash_update_file(\HashContext $context, string $filename, ?\HashContext $stream_context = null): void
{
error_clear_last();
- $result = \hash_update_file($hcontext, $filename, $scontext);
+ if ($stream_context !== null) {
+ $result = \hash_update_file($context, $filename, $stream_context);
+ } else {
+ $result = \hash_update_file($context, $filename);
+ }
if ($result === false) {
throw HashException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/ibase.php b/vendor/thecodingmachine/safe/generated/ibase.php
index 49697400d..7a6199129 100644
--- a/vendor/thecodingmachine/safe/generated/ibase.php
+++ b/vendor/thecodingmachine/safe/generated/ibase.php
@@ -122,7 +122,11 @@ function ibase_blob_cancel($blob_handle): void
function ibase_blob_create($link_identifier = null)
{
error_clear_last();
- $result = \ibase_blob_create($link_identifier);
+ if ($link_identifier !== null) {
+ $result = \ibase_blob_create($link_identifier);
+ } else {
+ $result = \ibase_blob_create();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -166,7 +170,11 @@ function ibase_blob_get($blob_handle, int $len): string
function ibase_close($connection_id = null): void
{
error_clear_last();
- $result = \ibase_close($connection_id);
+ if ($connection_id !== null) {
+ $result = \ibase_close($connection_id);
+ } else {
+ $result = \ibase_close();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -189,7 +197,11 @@ function ibase_close($connection_id = null): void
function ibase_commit_ret($link_or_trans_identifier = null): void
{
error_clear_last();
- $result = \ibase_commit_ret($link_or_trans_identifier);
+ if ($link_or_trans_identifier !== null) {
+ $result = \ibase_commit_ret($link_or_trans_identifier);
+ } else {
+ $result = \ibase_commit_ret();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -210,7 +222,11 @@ function ibase_commit_ret($link_or_trans_identifier = null): void
function ibase_commit($link_or_trans_identifier = null): void
{
error_clear_last();
- $result = \ibase_commit($link_or_trans_identifier);
+ if ($link_or_trans_identifier !== null) {
+ $result = \ibase_commit($link_or_trans_identifier);
+ } else {
+ $result = \ibase_commit();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -309,7 +325,11 @@ function ibase_delete_user($service_handle, string $user_name): void
function ibase_drop_db($connection = null): void
{
error_clear_last();
- $result = \ibase_drop_db($connection);
+ if ($connection !== null) {
+ $result = \ibase_drop_db($connection);
+ } else {
+ $result = \ibase_drop_db();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -566,7 +586,11 @@ function ibase_restore($service_handle, string $source_file, string $dest_db, in
function ibase_rollback_ret($link_or_trans_identifier = null): void
{
error_clear_last();
- $result = \ibase_rollback_ret($link_or_trans_identifier);
+ if ($link_or_trans_identifier !== null) {
+ $result = \ibase_rollback_ret($link_or_trans_identifier);
+ } else {
+ $result = \ibase_rollback_ret();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
@@ -587,7 +611,11 @@ function ibase_rollback_ret($link_or_trans_identifier = null): void
function ibase_rollback($link_or_trans_identifier = null): void
{
error_clear_last();
- $result = \ibase_rollback($link_or_trans_identifier);
+ if ($link_or_trans_identifier !== null) {
+ $result = \ibase_rollback($link_or_trans_identifier);
+ } else {
+ $result = \ibase_rollback();
+ }
if ($result === false) {
throw IbaseException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/iconv.php b/vendor/thecodingmachine/safe/generated/iconv.php
index 44cf96ab8..7b28b4965 100644
--- a/vendor/thecodingmachine/safe/generated/iconv.php
+++ b/vendor/thecodingmachine/safe/generated/iconv.php
@@ -36,7 +36,7 @@ function iconv_get_encoding(string $type = "all")
/**
* Changes the value of the internal configuration variable specified by
- * type to charset.
+ * type to encoding.
*
* @param string $type The value of type can be any one of these:
*
@@ -44,14 +44,14 @@ function iconv_get_encoding(string $type = "all")
* output_encoding
* internal_encoding
*
- * @param string $charset The character set.
+ * @param string $encoding The character set.
* @throws IconvException
*
*/
-function iconv_set_encoding(string $type, string $charset): void
+function iconv_set_encoding(string $type, string $encoding): void
{
error_clear_last();
- $result = \iconv_set_encoding($type, $charset);
+ $result = \iconv_set_encoding($type, $encoding);
if ($result === false) {
throw IconvException::createFromPhpError();
}
@@ -59,18 +59,17 @@ function iconv_set_encoding(string $type, string $charset): void
/**
- * Performs a character set conversion on the string
- * str from in_charset
- * to out_charset.
+ * Converts string from from_encoding
+ * to to_encoding.
*
- * @param string $in_charset The input charset.
- * @param string $out_charset The output charset.
+ * @param string $from_encoding The current encoding used to interpret string.
+ * @param string $to_encoding The desired encoding of the result.
*
- * If you append the string //TRANSLIT to
- * out_charset transliteration is activated. This
+ * If the string //TRANSLIT is appended to
+ * to_encoding, then transliteration is activated. This
* means that when a character can't be represented in the target charset,
- * it can be approximated through one or several similarly looking
- * characters. If you append the string //IGNORE,
+ * it may be approximated through one or several similarly looking
+ * characters. If the string //IGNORE is appended,
* characters that cannot be represented in the target charset are silently
* discarded. Otherwise, E_NOTICE is generated and the function
* will return FALSE.
@@ -79,16 +78,16 @@ function iconv_set_encoding(string $type, string $charset): void
* system's iconv() implementation (cf. ICONV_IMPL).
* Some implementations are known to ignore //TRANSLIT,
* so the conversion is likely to fail for characters which are illegal for
- * the out_charset.
- * @param string $str The string to be converted.
+ * the to_encoding.
+ * @param string $string The string to be converted.
* @return string Returns the converted string.
* @throws IconvException
*
*/
-function iconv(string $in_charset, string $out_charset, string $str): string
+function iconv(string $from_encoding, string $to_encoding, string $string): string
{
error_clear_last();
- $result = \iconv($in_charset, $out_charset, $str);
+ $result = \iconv($from_encoding, $to_encoding, $string);
if ($result === false) {
throw IconvException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/image.php b/vendor/thecodingmachine/safe/generated/image.php
index f1dc2183c..639cf16c9 100644
--- a/vendor/thecodingmachine/safe/generated/image.php
+++ b/vendor/thecodingmachine/safe/generated/image.php
@@ -12,12 +12,12 @@ use Safe\Exceptions\ImageException;
* correspondent HTTP content type.
*
* getimagesize can also return some more information
- * in imageinfo parameter.
+ * in image_info parameter.
*
* @param string $filename This parameter specifies the file you wish to retrieve information
* about. It can reference a local file or (configuration permitting) a
* remote file using one of the supported streams.
- * @param array $imageinfo This optional parameter allows you to extract some extended
+ * @param array|null $image_info This optional parameter allows you to extract some extended
* information from the image file. Currently, this will return the
* different JPG APP markers as an associative array.
* Some programs use these APP markers to embed text information in
@@ -26,7 +26,7 @@ use Safe\Exceptions\ImageException;
* You can use the iptcparse function to parse the
* binary APP13 marker into something readable.
*
- * The imageinfo only supports
+ * The image_info only supports
* JFIF files.
* @return array Returns an array with up to 7 elements. Not all image types will include
* the channels and bits elements.
@@ -66,10 +66,31 @@ use Safe\Exceptions\ImageException;
* @throws ImageException
*
*/
-function getimagesize(string $filename, array &$imageinfo = null): array
+function getimagesize(string $filename, ?array &$image_info = null): array
{
error_clear_last();
- $result = \getimagesize($filename, $imageinfo);
+ $result = \getimagesize($filename, $image_info);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the extension for the given IMAGETYPE_XXX
+ * constant.
+ *
+ * @param int $image_type One of the IMAGETYPE_XXX constant.
+ * @param bool $include_dot Whether to prepend a dot to the extension or not. Default to TRUE.
+ * @return string A string with the extension corresponding to the given image type.
+ * @throws ImageException
+ *
+ */
+function image_type_to_extension(int $image_type, bool $include_dot = true): string
+{
+ error_clear_last();
+ $result = \image_type_to_extension($image_type, $include_dot);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -110,11 +131,11 @@ function image2wbmp($image, ?string $filename = null, int $foreground = null): v
/**
*
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param array $affine Array with keys 0 to 5.
- * @param array $clip Array with keys "x", "y", "width" and "height".
- * @return resource Return affined image resource on success.
+ * @param array $clip Array with keys "x", "y", "width" and "height"; or NULL.
+ * @return resource Return affined image object on success.
* @throws ImageException
*
*/
@@ -138,19 +159,19 @@ function imageaffine($image, array $affine, array $clip = null)
* what is useful if multiple transformations should be applied to the same
* image in one go.
*
- * @param array $m1 An affine transformation matrix (an array with keys
+ * @param array $matrix1 An affine transformation matrix (an array with keys
* 0 to 5 and float values).
- * @param array $m2 An affine transformation matrix (an array with keys
+ * @param array $matrix2 An affine transformation matrix (an array with keys
* 0 to 5 and float values).
* @return array{0:float,1:float,2:float,3:float,4:float,5:float} An affine transformation matrix (an array with keys
* 0 to 5 and float values).
* @throws ImageException
*
*/
-function imageaffinematrixconcat(array $m1, array $m2): array
+function imageaffinematrixconcat(array $matrix1, array $matrix2): array
{
error_clear_last();
- $result = \imageaffinematrixconcat($m1, $m2);
+ $result = \imageaffinematrixconcat($matrix1, $matrix2);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -175,14 +196,10 @@ function imageaffinematrixconcat(array $m1, array $m2): array
* @throws ImageException
*
*/
-function imageaffinematrixget(int $type, $options = null): array
+function imageaffinematrixget(int $type, $options): array
{
error_clear_last();
- if ($options !== null) {
- $result = \imageaffinematrixget($type, $options);
- } else {
- $result = \imageaffinematrixget($type);
- }
+ $result = \imageaffinematrixget($type, $options);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -202,17 +219,17 @@ function imageaffinematrixget(int $type, $options = null): array
* information, replacing the destination pixel. Blending mode is not available
* when drawing on palette images.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param bool $blendmode Whether to enable the blending mode or not. On true color images
+ * @param bool $enable Whether to enable the blending mode or not. On true color images
* the default value is TRUE otherwise the default value is FALSE
* @throws ImageException
*
*/
-function imagealphablending($image, bool $blendmode): void
+function imagealphablending($image, bool $enable): void
{
error_clear_last();
- $result = \imagealphablending($image, $blendmode);
+ $result = \imagealphablending($image, $enable);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -231,16 +248,16 @@ function imagealphablending($image, bool $blendmode): void
* other colors. The lack of alpha component support does not allow an alpha
* based antialiasing method.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param bool $enabled Whether to enable antialiasing or not.
+ * @param bool $enable Whether to enable antialiasing or not.
* @throws ImageException
*
*/
-function imageantialias($image, bool $enabled): void
+function imageantialias($image, bool $enable): void
{
error_clear_last();
- $result = \imageantialias($image, $enabled);
+ $result = \imageantialias($image, $enable);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -251,24 +268,57 @@ function imageantialias($image, bool $enabled): void
* imagearc draws an arc of circle centered at the given
* coordinates.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $cx x-coordinate of the center.
- * @param int $cy y-coordinate of the center.
+ * @param int $center_x x-coordinate of the center.
+ * @param int $center_y y-coordinate of the center.
* @param int $width The arc width.
* @param int $height The arc height.
- * @param int $start The arc start angle, in degrees.
- * @param int $end The arc end angle, in degrees.
+ * @param int $start_angle The arc start angle, in degrees.
+ * @param int $end_angle The arc end angle, in degrees.
* 0° is located at the three-o'clock position, and the arc is drawn
* clockwise.
* @param int $color A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagearc($image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color): void
+function imagearc($image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): void
{
error_clear_last();
- $result = \imagearc($image, $cx, $cy, $width, $height, $start, $end, $color);
+ $result = \imagearc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Outputs or saves a AVIF Raster image from the given image.
+ *
+ * @param \GdImage $image A GdImage object, returned by one of the image creation functions,
+ * such as imagecreatetruecolor.
+ * @param $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
+ * @param int $quality quality is optional, and ranges from 0 (worst quality, smaller file)
+ * to 100 (best quality, larger file).
+ * If -1 is provided, the default value 30 is used.
+ * @param int $speed speed is optional, and ranges from 0 (slow, smaller file)
+ * to 10 (fast, larger file).
+ * If -1 is provided, the default value 6 is used.
+ * @throws ImageException
+ *
+ */
+function imageavif(\GdImage $image, $file = null, int $quality = -1, int $speed = -1): void
+{
+ error_clear_last();
+ if ($speed !== -1) {
+ $result = \imageavif($image, $file, $quality, $speed);
+ } elseif ($quality !== -1) {
+ $result = \imageavif($image, $file, $quality);
+ } elseif ($file !== null) {
+ $result = \imageavif($image, $file);
+ } else {
+ $result = \imageavif($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -278,9 +328,9 @@ function imagearc($image, int $cx, int $cy, int $width, int $height, int $start,
/**
* Outputs or saves a BMP version of the given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
*
* NULL is invalid if the compressed arguments is
* not used.
@@ -288,10 +338,16 @@ function imagearc($image, int $cx, int $cy, int $width, int $height, int $start,
* @throws ImageException
*
*/
-function imagebmp($image, $to = null, bool $compressed = true): void
+function imagebmp($image, $file = null, bool $compressed = true): void
{
error_clear_last();
- $result = \imagebmp($image, $to, $compressed);
+ if ($compressed !== true) {
+ $result = \imagebmp($image, $file, $compressed);
+ } elseif ($file !== null) {
+ $result = \imagebmp($image, $file);
+ } else {
+ $result = \imagebmp($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -300,27 +356,27 @@ function imagebmp($image, $to = null, bool $compressed = true): void
/**
* imagechar draws the first character of
- * c in the image identified by
+ * char in the image identified by
* image with its upper-left at
* x,y (top left is 0,
* 0) with the color color.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $font Can be 1, 2, 3, 4, 5 for built-in
- * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or any of your
- * own font identifiers registered with imageloadfont.
+ * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or GdFont instance,
+ * returned by imageloadfont.
* @param int $x x-coordinate of the start.
* @param int $y y-coordinate of the start.
- * @param string $c The character to draw.
+ * @param string $char The character to draw.
* @param int $color A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagechar($image, int $font, int $x, int $y, string $c, int $color): void
+function imagechar($image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
- $result = \imagechar($image, $font, $x, $y, $c, $color);
+ $result = \imagechar($image, $font, $x, $y, $char, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -328,25 +384,25 @@ function imagechar($image, int $font, int $x, int $y, string $c, int $color): vo
/**
- * Draws the character c vertically at the specified
+ * Draws the character char vertically at the specified
* coordinate on the given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $font Can be 1, 2, 3, 4, 5 for built-in
- * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or any of your
- * own font identifiers registered with imageloadfont.
+ * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or GdFont instance,
+ * returned by imageloadfont.
* @param int $x x-coordinate of the start.
* @param int $y y-coordinate of the start.
- * @param string $c The character to draw.
+ * @param string $char The character to draw.
* @param int $color A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagecharup($image, int $font, int $x, int $y, string $c, int $color): void
+function imagecharup($image, int $font, int $x, int $y, string $char, int $color): void
{
error_clear_last();
- $result = \imagecharup($image, $font, $x, $y, $c, $color);
+ $result = \imagecharup($image, $font, $x, $y, $char, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -362,7 +418,7 @@ function imagecharup($image, int $font, int $x, int $y, string $c, int $color):
* integer. Use bitshifting and masking to access the distinct red, green and blue
* component values:
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x x-coordinate of the point.
* @param int $y y-coordinate of the point.
@@ -386,7 +442,7 @@ function imagecolorat($image, int $x, int $y): int
* imagecolorallocate or
* imagecolorallocatealpha.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $color The color identifier.
* @throws ImageException
@@ -405,8 +461,8 @@ function imagecolordeallocate($image, int $color): void
/**
* Makes the colors of the palette version of an image more closely match the true color version.
*
- * @param resource $image1 A truecolor image resource.
- * @param resource $image2 A palette image resource pointing to an image that has the same
+ * @param resource $image1 A truecolor image object.
+ * @param resource $image2 A palette image object pointing to an image that has the same
* size as image1.
* @throws ImageException
*
@@ -422,21 +478,47 @@ function imagecolormatch($image1, $image2): void
/**
+ * This sets the specified index in the palette to the specified
+ * color. This is useful for creating flood-fill-like effects in
+ * palleted images without the overhead of performing the actual
+ * flood-fill.
+ *
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
+ * such as imagecreatetruecolor.
+ * @param int $color An index in the palette.
+ * @param int $red Value of red component.
+ * @param int $green Value of green component.
+ * @param int $blue Value of blue component.
+ * @param int $alpha Value of alpha component.
+ * @throws ImageException
+ *
+ */
+function imagecolorset($image, int $color, int $red, int $green, int $blue, int $alpha = 0): void
+{
+ error_clear_last();
+ $result = \imagecolorset($image, $color, $red, $green, $blue, $alpha);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+}
+
+
+/**
* Applies a convolution matrix on the image, using the given coefficient and
* offset.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param array $matrix A 3x3 matrix: an array of three arrays of three floats.
- * @param float $div The divisor of the result of the convolution, used for normalization.
+ * @param float $divisor The divisor of the result of the convolution, used for normalization.
* @param float $offset Color offset.
* @throws ImageException
*
*/
-function imageconvolution($image, array $matrix, float $div, float $offset): void
+function imageconvolution($image, array $matrix, float $divisor, float $offset): void
{
error_clear_last();
- $result = \imageconvolution($image, $matrix, $div, $offset);
+ $result = \imageconvolution($image, $matrix, $divisor, $offset);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -444,29 +526,29 @@ function imageconvolution($image, array $matrix, float $div, float $offset): voi
/**
- * Copy a part of src_im onto
- * dst_im starting at the x,y coordinates
+ * Copy a part of src_image onto
+ * dst_image starting at the x,y coordinates
* src_x, src_y with
- * a width of src_w and a height of
- * src_h. The portion defined will be copied
+ * a width of src_width and a height of
+ * src_height. The portion defined will be copied
* onto the x,y coordinates, dst_x and
* dst_y.
*
- * @param resource $dst_im Destination image resource.
- * @param resource $src_im Source image resource.
+ * @param resource $dst_image Destination image resource.
+ * @param resource $src_image Source image resource.
* @param int $dst_x x-coordinate of destination point.
* @param int $dst_y y-coordinate of destination point.
* @param int $src_x x-coordinate of source point.
* @param int $src_y y-coordinate of source point.
- * @param int $src_w Source width.
- * @param int $src_h Source height.
+ * @param int $src_width Source width.
+ * @param int $src_height Source height.
* @throws ImageException
*
*/
-function imagecopy($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h): void
+function imagecopy($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): void
{
error_clear_last();
- $result = \imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
+ $result = \imagecopy($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -474,22 +556,22 @@ function imagecopy($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $sr
/**
- * Copy a part of src_im onto
- * dst_im starting at the x,y coordinates
+ * Copy a part of src_image onto
+ * dst_image starting at the x,y coordinates
* src_x, src_y with
- * a width of src_w and a height of
- * src_h. The portion defined will be copied
+ * a width of src_width and a height of
+ * src_height. The portion defined will be copied
* onto the x,y coordinates, dst_x and
* dst_y.
*
- * @param resource $dst_im Destination image resource.
- * @param resource $src_im Source image resource.
+ * @param resource $dst_image Destination image resource.
+ * @param resource $src_image Source image resource.
* @param int $dst_x x-coordinate of destination point.
* @param int $dst_y y-coordinate of destination point.
* @param int $src_x x-coordinate of source point.
* @param int $src_y y-coordinate of source point.
- * @param int $src_w Source width.
- * @param int $src_h Source height.
+ * @param int $src_width Source width.
+ * @param int $src_height Source height.
* @param int $pct The two images will be merged according to pct
* which can range from 0 to 100. When pct = 0,
* no action is taken, when 100 this function behaves identically
@@ -499,10 +581,10 @@ function imagecopy($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $sr
* @throws ImageException
*
*/
-function imagecopymerge($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): void
+function imagecopymerge($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
- $result = \imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);
+ $result = \imagecopymerge($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -510,11 +592,11 @@ function imagecopymerge($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, in
/**
- * imagecopymergegray copy a part of src_im onto
- * dst_im starting at the x,y coordinates
+ * imagecopymergegray copy a part of src_image onto
+ * dst_image starting at the x,y coordinates
* src_x, src_y with
- * a width of src_w and a height of
- * src_h. The portion defined will be copied
+ * a width of src_width and a height of
+ * src_height. The portion defined will be copied
* onto the x,y coordinates, dst_x and
* dst_y.
*
@@ -522,15 +604,15 @@ function imagecopymerge($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, in
* that when merging it preserves the hue of the source by converting
* the destination pixels to gray scale before the copy operation.
*
- * @param resource $dst_im Destination image resource.
- * @param resource $src_im Source image resource.
+ * @param resource $dst_image Destination image resource.
+ * @param resource $src_image Source image resource.
* @param int $dst_x x-coordinate of destination point.
* @param int $dst_y y-coordinate of destination point.
* @param int $src_x x-coordinate of source point.
* @param int $src_y y-coordinate of source point.
- * @param int $src_w Source width.
- * @param int $src_h Source height.
- * @param int $pct The src_im will be changed to grayscale according
+ * @param int $src_width Source width.
+ * @param int $src_height Source height.
+ * @param int $pct The src_image will be changed to grayscale according
* to pct where 0 is fully grayscale and 100 is
* unchanged. When pct = 100 this function behaves
* identically to imagecopy for pallete images, except for
@@ -539,10 +621,10 @@ function imagecopymerge($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, in
* @throws ImageException
*
*/
-function imagecopymergegray($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct): void
+function imagecopymergegray($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): void
{
error_clear_last();
- $result = \imagecopymergegray($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);
+ $result = \imagecopymergegray($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $src_width, $src_height, $pct);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -557,10 +639,10 @@ function imagecopymergegray($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x
*
* In other words, imagecopyresampled will take a
* rectangular area from src_image of width
- * src_w and height src_h at
+ * src_width and height src_height at
* position (src_x,src_y)
* and place it in a rectangular area of dst_image
- * of width dst_w and height dst_h
+ * of width dst_width and height dst_height
* at position (dst_x,dst_y).
*
* If the source and destination coordinates and width and heights
@@ -577,17 +659,17 @@ function imagecopymergegray($dst_im, $src_im, int $dst_x, int $dst_y, int $src_x
* @param int $dst_y y-coordinate of destination point.
* @param int $src_x x-coordinate of source point.
* @param int $src_y y-coordinate of source point.
- * @param int $dst_w Destination width.
- * @param int $dst_h Destination height.
- * @param int $src_w Source width.
- * @param int $src_h Source height.
+ * @param int $dst_width Destination width.
+ * @param int $dst_height Destination height.
+ * @param int $src_width Source width.
+ * @param int $src_height Source height.
* @throws ImageException
*
*/
-function imagecopyresampled($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): void
+function imagecopyresampled($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
- $result = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+ $result = \imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -602,10 +684,10 @@ function imagecopyresampled($dst_image, $src_image, int $dst_x, int $dst_y, int
*
* In other words, imagecopyresized will take a
* rectangular area from src_image of width
- * src_w and height src_h at
+ * src_width and height src_height at
* position (src_x,src_y)
* and place it in a rectangular area of dst_image
- * of width dst_w and height dst_h
+ * of width dst_width and height dst_height
* at position (dst_x,dst_y).
*
* If the source and destination coordinates and width and heights
@@ -622,17 +704,17 @@ function imagecopyresampled($dst_image, $src_image, int $dst_x, int $dst_y, int
* @param int $dst_y y-coordinate of destination point.
* @param int $src_x x-coordinate of source point.
* @param int $src_y y-coordinate of source point.
- * @param int $dst_w Destination width.
- * @param int $dst_h Destination height.
- * @param int $src_w Source width.
- * @param int $src_h Source height.
+ * @param int $dst_width Destination width.
+ * @param int $dst_height Destination height.
+ * @param int $src_width Source width.
+ * @param int $src_height Source height.
* @throws ImageException
*
*/
-function imagecopyresized($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h): void
+function imagecopyresized($dst_image, $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): void
{
error_clear_last();
- $result = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+ $result = \imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -653,7 +735,7 @@ function imagecopyresized($dst_image, $src_image, int $dst_x, int $dst_y, int $s
*
* @param int $width The image width.
* @param int $height The image height.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -669,11 +751,31 @@ function imagecreate(int $width, int $height)
/**
+ * imagecreatefromavif returns an image object
+ * representing the image obtained from the given filename.
+ *
+ * @param string $filename Path to the AVIF raster image.
+ * @return Returns an image object on success, FALSE on errors.
+ * @throws ImageException
+ *
+ */
+function imagecreatefromavif(string $filename)
+{
+ error_clear_last();
+ $result = \imagecreatefromavif($filename);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* imagecreatefrombmp returns an image identifier
* representing the image obtained from the given filename.
*
* @param string $filename Path to the BMP image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -692,7 +794,7 @@ function imagecreatefrombmp(string $filename)
* Create a new image from GD file or URL.
*
* @param string $filename Path to the GD file.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -711,7 +813,7 @@ function imagecreatefromgd(string $filename)
* Create a new image from GD2 file or URL.
*
* @param string $filename Path to the GD2 image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -730,18 +832,18 @@ function imagecreatefromgd2(string $filename)
* Create a new image from a given part of GD2 file or URL.
*
* @param string $filename Path to the GD2 image.
- * @param int $srcX x-coordinate of source point.
- * @param int $srcY y-coordinate of source point.
+ * @param int $x x-coordinate of source point.
+ * @param int $y y-coordinate of source point.
* @param int $width Source width.
* @param int $height Source height.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
-function imagecreatefromgd2part(string $filename, int $srcX, int $srcY, int $width, int $height)
+function imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height)
{
error_clear_last();
- $result = \imagecreatefromgd2part($filename, $srcX, $srcY, $width, $height);
+ $result = \imagecreatefromgd2part($filename, $x, $y, $width, $height);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -754,7 +856,7 @@ function imagecreatefromgd2part(string $filename, int $srcX, int $srcY, int $wid
* representing the image obtained from the given filename.
*
* @param string $filename Path to the GIF image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -774,7 +876,7 @@ function imagecreatefromgif(string $filename)
* representing the image obtained from the given filename.
*
* @param string $filename Path to the JPEG image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -794,7 +896,7 @@ function imagecreatefromjpeg(string $filename)
* representing the image obtained from the given filename.
*
* @param string $filename Path to the PNG image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -810,11 +912,55 @@ function imagecreatefrompng(string $filename)
/**
+ * imagecreatefromstring returns an image identifier
+ * representing the image obtained from the given data.
+ * These types will be automatically detected if your build of PHP supports
+ * them: JPEG, PNG, GIF, BMP, WBMP, GD2, and WEBP.
+ *
+ * @param string $data A string containing the image data.
+ * @return resource An image object will be returned on success. FALSE is returned if
+ * the image type is unsupported, the data is not in a recognised format,
+ * or the image is corrupt and cannot be loaded.
+ * @throws ImageException
+ *
+ */
+function imagecreatefromstring(string $data)
+{
+ error_clear_last();
+ $result = \imagecreatefromstring($data);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * imagecreatefromtga returns an image object
+ * representing the image obtained from the given filename.
+ *
+ * @param string $filename Path to the Truevision TGA image.
+ * @return Returns an image object on success, FALSE on errors.
+ * @throws ImageException
+ *
+ */
+function imagecreatefromtga(string $filename)
+{
+ error_clear_last();
+ $result = \imagecreatefromtga($filename);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* imagecreatefromwbmp returns an image identifier
* representing the image obtained from the given filename.
*
* @param string $filename Path to the WBMP image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -832,9 +978,10 @@ function imagecreatefromwbmp(string $filename)
/**
* imagecreatefromwebp returns an image identifier
* representing the image obtained from the given filename.
+ * Note that animated WebP files cannot be read.
*
* @param string $filename Path to the WebP image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -854,7 +1001,7 @@ function imagecreatefromwebp(string $filename)
* representing the image obtained from the given filename.
*
* @param string $filename Path to the XBM image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -874,7 +1021,7 @@ function imagecreatefromxbm(string $filename)
* representing the image obtained from the given filename.
*
* @param string $filename Path to the XPM image.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -890,12 +1037,12 @@ function imagecreatefromxpm(string $filename)
/**
- * imagecreatetruecolor returns an image identifier
+ * imagecreatetruecolor returns an image object
* representing a black image of the specified size.
*
* @param int $width Image width.
* @param int $height Image height.
- * @return resource Returns an image resource identifier on success, FALSE on errors.
+ * @return resource Returns an image object on success, FALSE on errors.
* @throws ImageException
*
*/
@@ -914,19 +1061,19 @@ function imagecreatetruecolor(int $width, int $height)
* Crops an image to the given rectangular area and returns the resulting image.
* The given image is not modified.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param array $rect The cropping rectangle as array with keys
+ * @param array $rectangle The cropping rectangle as array with keys
* x, y, width and
* height.
- * @return resource Return cropped image resource on success.
+ * @return resource Return cropped image object on success.
* @throws ImageException
*
*/
-function imagecrop($image, array $rect)
+function imagecrop($image, array $rectangle)
{
error_clear_last();
- $result = \imagecrop($image, $rect);
+ $result = \imagecrop($image, $rectangle);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -938,17 +1085,17 @@ function imagecrop($image, array $rect)
* Automatically crops an image according to the given
* mode.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $mode One of the following constants:
* @param float $threshold
* @param int $color
- * @return resource Returns a cropped image resource on success.
+ * @return resource Returns a cropped image object on success.
* If the complete image was cropped, imagecrop returns FALSE.
* @throws ImageException
*
*/
-function imagecropauto($image, int $mode = IMG_CROP_DEFAULT, float $threshold = .5, int $color = -1)
+function imagecropauto($image, int $mode = IMG_CROP_DEFAULT, float $threshold = 0.5, int $color = -1)
{
error_clear_last();
$result = \imagecropauto($image, $mode, $threshold, $color);
@@ -964,7 +1111,7 @@ function imagecropauto($image, int $mode = IMG_CROP_DEFAULT, float $threshold =
* imagesetstyle and imageline
* instead.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x1 Upper left x coordinate.
* @param int $y1 Upper left y coordinate 0, 0 is the top left corner of the image.
@@ -985,10 +1132,10 @@ function imagedashedline($image, int $x1, int $y1, int $x2, int $y2, int $color)
/**
- * imagedestroy frees any memory associated
+ * Prior to PHP 8.0.0, imagedestroy freed any memory associated
* with image image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @throws ImageException
*
@@ -1006,20 +1153,20 @@ function imagedestroy($image): void
/**
* Draws an ellipse centered at the specified coordinates.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $cx x-coordinate of the center.
- * @param int $cy y-coordinate of the center.
+ * @param int $center_x x-coordinate of the center.
+ * @param int $center_y y-coordinate of the center.
* @param int $width The ellipse width.
* @param int $height The ellipse height.
* @param int $color The color of the ellipse. A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imageellipse($image, int $cx, int $cy, int $width, int $height, int $color): void
+function imageellipse($image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
- $result = \imageellipse($image, $cx, $cy, $width, $height, $color);
+ $result = \imageellipse($image, $center_x, $center_y, $width, $height, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1031,7 +1178,7 @@ function imageellipse($image, int $cx, int $cy, int $width, int $height, int $co
* with the given color in the
* image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x x-coordinate of start point.
* @param int $y y-coordinate of start point.
@@ -1053,14 +1200,14 @@ function imagefill($image, int $x, int $y, int $color): void
* Draws a partial arc centered at the specified coordinate in the
* given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $cx x-coordinate of the center.
- * @param int $cy y-coordinate of the center.
+ * @param int $center_x x-coordinate of the center.
+ * @param int $center_y y-coordinate of the center.
* @param int $width The arc width.
* @param int $height The arc height.
- * @param int $start The arc start angle, in degrees.
- * @param int $end The arc end angle, in degrees.
+ * @param int $start_angle The arc start angle, in degrees.
+ * @param int $end_angle The arc end angle, in degrees.
* 0° is located at the three-o'clock position, and the arc is drawn
* clockwise.
* @param int $color A color identifier created with imagecolorallocate.
@@ -1083,10 +1230,10 @@ function imagefill($image, int $x, int $y, int $color): void
* @throws ImageException
*
*/
-function imagefilledarc($image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color, int $style): void
+function imagefilledarc($image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): void
{
error_clear_last();
- $result = \imagefilledarc($image, $cx, $cy, $width, $height, $start, $end, $color, $style);
+ $result = \imagefilledarc($image, $center_x, $center_y, $width, $height, $start_angle, $end_angle, $color, $style);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1097,43 +1244,20 @@ function imagefilledarc($image, int $cx, int $cy, int $width, int $height, int $
* Draws an ellipse centered at the specified coordinate on the given
* image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $cx x-coordinate of the center.
- * @param int $cy y-coordinate of the center.
+ * @param int $center_x x-coordinate of the center.
+ * @param int $center_y y-coordinate of the center.
* @param int $width The ellipse width.
* @param int $height The ellipse height.
* @param int $color The fill color. A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagefilledellipse($image, int $cx, int $cy, int $width, int $height, int $color): void
+function imagefilledellipse($image, int $center_x, int $center_y, int $width, int $height, int $color): void
{
error_clear_last();
- $result = \imagefilledellipse($image, $cx, $cy, $width, $height, $color);
- if ($result === false) {
- throw ImageException::createFromPhpError();
- }
-}
-
-
-/**
- * imagefilledpolygon creates a filled polygon
- * in the given image.
- *
- * @param resource $image An image resource, returned by one of the image creation functions,
- * such as imagecreatetruecolor.
- * @param array $points An array containing the x and y
- * coordinates of the polygons vertices consecutively.
- * @param int $num_points Total number of points (vertices), which must be at least 3.
- * @param int $color A color identifier created with imagecolorallocate.
- * @throws ImageException
- *
- */
-function imagefilledpolygon($image, array $points, int $num_points, int $color): void
-{
- error_clear_last();
- $result = \imagefilledpolygon($image, $points, $num_points, $color);
+ $result = \imagefilledellipse($image, $center_x, $center_y, $width, $height, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1145,7 +1269,7 @@ function imagefilledpolygon($image, array $points, int $num_points, int $color):
* image starting at point 1 and ending at point 2.
* 0, 0 is the top left corner of the image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x1 x-coordinate for point 1.
* @param int $y1 y-coordinate for point 1.
@@ -1167,24 +1291,24 @@ function imagefilledrectangle($image, int $x1, int $y1, int $x2, int $y2, int $c
/**
* imagefilltoborder performs a flood fill
- * whose border color is defined by border.
+ * whose border color is defined by border_color.
* The starting point for the fill is x,
* y (top left is 0, 0) and the region is
* filled with color color.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x x-coordinate of start.
* @param int $y y-coordinate of start.
- * @param int $border The border color. A color identifier created with imagecolorallocate.
+ * @param int $border_color The border color. A color identifier created with imagecolorallocate.
* @param int $color The fill color. A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagefilltoborder($image, int $x, int $y, int $border, int $color): void
+function imagefilltoborder($image, int $x, int $y, int $border_color, int $color): void
{
error_clear_last();
- $result = \imagefilltoborder($image, $x, $y, $border, $color);
+ $result = \imagefilltoborder($image, $x, $y, $border_color, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1193,11 +1317,11 @@ function imagefilltoborder($image, int $x, int $y, int $border, int $color): voi
/**
* imagefilter applies the given filter
- * filtertype on the image.
+ * filter on the image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $filtertype filtertype can be one of the following:
+ * @param int $filter filter can be one of the following:
*
*
*
@@ -1217,14 +1341,14 @@ function imagefilltoborder($image, int $x, int $y, int $border, int $color): voi
*
*
* IMG_FILTER_BRIGHTNESS: Changes the brightness
- * of the image. Use arg1 to set the level of
+ * of the image. Use args to set the level of
* brightness. The range for the brightness is -255 to 255.
*
*
*
*
* IMG_FILTER_CONTRAST: Changes the contrast of
- * the image. Use arg1 to set the level of
+ * the image. Use args to set the level of
* contrast.
*
*
@@ -1232,7 +1356,7 @@ function imagefilltoborder($image, int $x, int $y, int $border, int $color): voi
*
* IMG_FILTER_COLORIZE: Like
* IMG_FILTER_GRAYSCALE, except you can specify the
- * color. Use arg1, arg2 and
+ * color. Use args, arg2 and
* arg3 in the form of
* red, green,
* blue and arg4 for the
@@ -1270,27 +1394,27 @@ function imagefilltoborder($image, int $x, int $y, int $border, int $color): voi
*
*
* IMG_FILTER_SMOOTH: Makes the image smoother.
- * Use arg1 to set the level of smoothness.
+ * Use args to set the level of smoothness.
*
*
*
*
* IMG_FILTER_PIXELATE: Applies pixelation effect
- * to the image, use arg1 to set the block size
+ * to the image, use args to set the block size
* and arg2 to set the pixelation effect mode.
*
*
*
*
* IMG_FILTER_SCATTER: Applies scatter effect
- * to the image, use arg1 and
+ * to the image, use args and
* arg2 to define the effect strength and
* additionally arg3 to only apply the
* on select pixel colors.
*
*
*
- * @param int $arg1
+ * @param int $args
*
*
* IMG_FILTER_BRIGHTNESS: Brightness level.
@@ -1324,117 +1448,272 @@ function imagefilltoborder($image, int $x, int $y, int $border, int $color): voi
*
*
*
- * @param int $arg2
+ * @throws ImageException
+ *
+ */
+function imagefilter($image, int $filter, int ...$args): void
+{
+ error_clear_last();
+ if ($args !== []) {
+ $result = \imagefilter($image, $filter, ...$args);
+ } else {
+ $result = \imagefilter($image, $filter);
+ }
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Flips the image image using the given
+ * mode.
+ *
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
+ * such as imagecreatetruecolor.
+ * @param int $mode Flip mode, this can be one of the IMG_FLIP_* constants:
+ *
+ *
*
*
- * IMG_FILTER_COLORIZE: Value of green component.
*
+ * Constant
+ * Meaning
*
*
*
- * IMG_FILTER_PIXELATE: Whether to use advanced pixelation
- * effect or not (defaults to FALSE).
*
+ * IMG_FLIP_HORIZONTAL
*
+ * Flips the image horizontally.
*
*
- * IMG_FILTER_SCATTER: Effect addition level.
*
+ * IMG_FLIP_VERTICAL
*
+ * Flips the image vertically.
*
- * @param int $arg3
*
*
- * IMG_FILTER_COLORIZE: Value of blue component.
+ * IMG_FLIP_BOTH
*
+ * Flips the image both horizontally and vertically.
*
*
*
- * IMG_FILTER_SCATTER: Optional array indexed color values
- * to apply effect at.
*
*
+ * @throws ImageException
*
- * @param int $arg4
+ */
+function imageflip($image, int $mode): void
+{
+ error_clear_last();
+ $result = \imageflip($image, $mode);
+ if ($result === false) {
+ throw ImageException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function calculates and returns the bounding box in pixels
+ * for a FreeType text.
*
+ * @param float $size The font size in points.
+ * @param float $angle Angle in degrees in which string will be
+ * measured.
+ * @param string $font_filename The name of the TrueType font file (can be a URL). Depending on
+ * which version of the GD library that PHP is using, it may attempt to
+ * search for files that do not begin with a leading '/' by appending
+ * '.ttf' to the filename and searching along a library-defined font path.
+ * @param string $string The string to be measured.
+ * @param array $options
+ * Possible array indexes for options
*
- * IMG_FILTER_COLORIZE: Alpha channel, A value
- * between 0 and 127. 0 indicates completely opaque while 127 indicates
- * completely transparent.
*
*
+ * Key
+ * Type
+ * Meaning
+ *
+ *
+ *
+ *
+ * linespacing
+ * float
+ * Defines drawing linespacing
+ *
+ *
+ *
+ *
+ * @return array imageftbbox returns an array with 8
+ * elements representing four points making the bounding box of the
+ * text:
+ *
+ *
+ *
+ *
+ * 0
+ * lower left corner, X position
+ *
+ *
+ * 1
+ * lower left corner, Y position
+ *
+ *
+ * 2
+ * lower right corner, X position
+ *
*
+ * 3
+ * lower right corner, Y position
+ *
+ *
+ * 4
+ * upper right corner, X position
+ *
+ *
+ * 5
+ * upper right corner, Y position
+ *
+ *
+ * 6
+ * upper left corner, X position
+ *
+ *
+ * 7
+ * upper left corner, Y position
+ *
+ *
+ *
+ *
+ *
+ * The points are relative to the text regardless of the
+ * angle, so "upper left" means in the top left-hand
+ * corner seeing the text horizontally.
+ *
+ * On failure, FALSE is returned.
* @throws ImageException
*
*/
-function imagefilter($image, int $filtertype, int $arg1 = null, int $arg2 = null, int $arg3 = null, int $arg4 = null): void
+function imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
- if ($arg4 !== null) {
- $result = \imagefilter($image, $filtertype, $arg1, $arg2, $arg3, $arg4);
- } elseif ($arg3 !== null) {
- $result = \imagefilter($image, $filtertype, $arg1, $arg2, $arg3);
- } elseif ($arg2 !== null) {
- $result = \imagefilter($image, $filtertype, $arg1, $arg2);
- } elseif ($arg1 !== null) {
- $result = \imagefilter($image, $filtertype, $arg1);
- } else {
- $result = \imagefilter($image, $filtertype);
- }
+ $result = \imageftbbox($size, $angle, $font_filename, $string, $options);
if ($result === false) {
throw ImageException::createFromPhpError();
}
+ return $result;
}
/**
- * Flips the image image using the given
- * mode.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ *
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $mode Flip mode, this can be one of the IMG_FLIP_* constants:
+ * @param float $size The font size to use in points.
+ * @param float $angle The angle in degrees, with 0 degrees being left-to-right reading text.
+ * Higher values represent a counter-clockwise rotation. For example, a
+ * value of 90 would result in bottom-to-top reading text.
+ * @param int $x The coordinates given by x and
+ * y will define the basepoint of the first
+ * character (roughly the lower-left corner of the character). This
+ * is different from the imagestring, where
+ * x and y define the
+ * upper-left corner of the first character. For example, "top left"
+ * is 0, 0.
+ * @param int $y The y-ordinate. This sets the position of the fonts baseline, not the
+ * very bottom of the character.
+ * @param int $color The index of the desired color for the text, see
+ * imagecolorexact.
+ * @param string $font_filename The path to the TrueType font you wish to use.
+ *
+ * Depending on which version of the GD library PHP is using, when
+ * font_filename does not begin with a leading
+ * / then .ttf will be appended
+ * to the filename and the library will attempt to search for that
+ * filename along a library-defined font path.
*
+ * In many cases where a font resides in the same directory as the script using it
+ * the following trick will alleviate any include problems.
*
*
+ * ]]>
*
+ * @param string $text Text to be inserted into image.
+ * @param array $options
+ * Possible array indexes for options
*
- * Constant
+ *
+ *
+ * Key
+ * Type
* Meaning
*
*
*
*
- * IMG_FLIP_HORIZONTAL
+ * linespacing
+ * float
+ * Defines drawing linespacing
*
- * Flips the image horizontally.
*
*
*
- * IMG_FLIP_VERTICAL
+ * @return array This function returns an array defining the four points of the box, starting in the lower left and moving counter-clockwise:
*
- * Flips the image vertically.
*
*
*
- * IMG_FLIP_BOTH
+ * 0
+ * lower left x-coordinate
*
- * Flips the image both horizontally and vertically.
*
+ * 1
+ * lower left y-coordinate
*
*
+ * 2
+ * lower right x-coordinate
+ *
+ *
+ * 3
+ * lower right y-coordinate
+ *
+ *
+ * 4
+ * upper right x-coordinate
+ *
+ *
+ * 5
+ * upper right y-coordinate
*
*
+ * 6
+ * upper left x-coordinate
+ *
+ *
+ * 7
+ * upper left y-coordinate
+ *
+ *
+ *
+ *
+ *
+ * On failure, FALSE is returned.
* @throws ImageException
*
*/
-function imageflip($image, int $mode): void
+function imagefttext($image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
- $result = \imageflip($image, $mode);
+ $result = \imagefttext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($result === false) {
throw ImageException::createFromPhpError();
}
+ return $result;
}
@@ -1442,17 +1721,17 @@ function imageflip($image, int $mode): void
* Applies gamma correction to the given gd image
* given an input and an output gamma.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param float $inputgamma The input gamma.
- * @param float $outputgamma The output gamma.
+ * @param float $input_gamma The input gamma.
+ * @param float $output_gamma The output gamma.
* @throws ImageException
*
*/
-function imagegammacorrect($image, float $inputgamma, float $outputgamma): void
+function imagegammacorrect($image, float $input_gamma, float $output_gamma): void
{
error_clear_last();
- $result = \imagegammacorrect($image, $inputgamma, $outputgamma);
+ $result = \imagegammacorrect($image, $input_gamma, $output_gamma);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1460,18 +1739,22 @@ function imagegammacorrect($image, float $inputgamma, float $outputgamma): void
/**
- * Outputs a GD image to the given to.
+ * Outputs a GD image to the given file.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
* @throws ImageException
*
*/
-function imagegd($image, $to = null): void
+function imagegd($image, $file = null): void
{
error_clear_last();
- $result = \imagegd($image, $to);
+ if ($file !== null) {
+ $result = \imagegd($image, $file);
+ } else {
+ $result = \imagegd($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1479,22 +1762,30 @@ function imagegd($image, $to = null): void
/**
- * Outputs a GD2 image to the given to.
+ * Outputs a GD2 image to the given file.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
* @param int $chunk_size Chunk size.
- * @param int $type Either IMG_GD2_RAW or
+ * @param int $mode Either IMG_GD2_RAW or
* IMG_GD2_COMPRESSED. Default is
* IMG_GD2_RAW.
* @throws ImageException
*
*/
-function imagegd2($image, $to = null, int $chunk_size = 128, int $type = IMG_GD2_RAW): void
+function imagegd2($image, $file = null, int $chunk_size = 128, int $mode = IMG_GD2_RAW): void
{
error_clear_last();
- $result = \imagegd2($image, $to, $chunk_size, $type);
+ if ($mode !== IMG_GD2_RAW) {
+ $result = \imagegd2($image, $file, $chunk_size, $mode);
+ } elseif ($chunk_size !== 128) {
+ $result = \imagegd2($image, $file, $chunk_size);
+ } elseif ($file !== null) {
+ $result = \imagegd2($image, $file);
+ } else {
+ $result = \imagegd2($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1503,7 +1794,7 @@ function imagegd2($image, $to = null, int $chunk_size = 128, int $type = IMG_GD2
/**
* imagegif creates the GIF
- * file in to from the image image. The
+ * file in file from the image image. The
* image argument is the return from the
* imagecreate or imagecreatefrom*
* function.
@@ -1513,16 +1804,20 @@ function imagegd2($image, $to = null, int $chunk_size = 128, int $type = IMG_GD2
* imagecolortransparent, in which case the
* image format will be GIF89a.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
* @throws ImageException
*
*/
-function imagegif($image, $to = null): void
+function imagegif($image, $file = null): void
{
error_clear_last();
- $result = \imagegif($image, $to);
+ if ($file !== null) {
+ $result = \imagegif($image, $file);
+ } else {
+ $result = \imagegif($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1532,7 +1827,7 @@ function imagegif($image, $to = null): void
/**
* Grabs a screenshot of the whole screen.
*
- * @return resource Returns an image resource identifier on success, FALSE on failure.
+ * @return resource Returns an image object on success, FALSE on failure.
* @throws ImageException
*
*/
@@ -1550,16 +1845,16 @@ function imagegrabscreen()
/**
* Grabs a window or its client area using a windows handle (HWND property in COM instance)
*
- * @param int $window_handle The HWND window ID.
- * @param int $client_area Include the client area of the application window.
- * @return resource Returns an image resource identifier on success, FALSE on failure.
+ * @param int $handle The HWND window ID.
+ * @param bool $client_area Include the client area of the application window.
+ * @return \GdImage Returns an image object on success, FALSE on failure.
* @throws ImageException
*
*/
-function imagegrabwindow(int $window_handle, int $client_area = 0)
+function imagegrabwindow(int $handle, bool $client_area = false): \GdImage
{
error_clear_last();
- $result = \imagegrabwindow($window_handle, $client_area);
+ $result = \imagegrabwindow($handle, $client_area);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1571,19 +1866,25 @@ function imagegrabwindow(int $window_handle, int $client_area = 0)
* imagejpeg creates a JPEG file from
* the given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
* @param int $quality quality is optional, and ranges from 0 (worst
* quality, smaller file) to 100 (best quality, biggest file). The
* default (-1) uses the default IJG quality value (about 75).
* @throws ImageException
*
*/
-function imagejpeg($image, $to = null, int $quality = -1): void
+function imagejpeg($image, $file = null, int $quality = -1): void
{
error_clear_last();
- $result = \imagejpeg($image, $to, $quality);
+ if ($quality !== -1) {
+ $result = \imagejpeg($image, $file, $quality);
+ } elseif ($file !== null) {
+ $result = \imagejpeg($image, $file);
+ } else {
+ $result = \imagejpeg($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1593,7 +1894,7 @@ function imagejpeg($image, $to = null, int $quality = -1): void
/**
* Set the alpha blending flag to use layering effects.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $effect One of the following constants:
*
@@ -1658,7 +1959,7 @@ function imagelayereffect($image, int $effect): void
/**
* Draws a line between the two given points.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x1 x-coordinate for first point.
* @param int $y1 y-coordinate for first point.
@@ -1682,7 +1983,7 @@ function imageline($image, int $x1, int $y1, int $x2, int $y2, int $color): void
* imageloadfont loads a user-defined bitmap and returns
* its identifier.
*
- * @param string $file The font file format is currently binary and architecture
+ * @param string $filename The font file format is currently binary and architecture
* dependent. This means you should generate the font files on the
* same type of CPU as the machine you are running PHP on.
*
@@ -1730,15 +2031,14 @@ function imageline($image, int $x1, int $y1, int $x2, int $y2, int $color): void
*
*
*
- * @return int The font identifier which is always bigger than 5 to avoid conflicts with
- * built-in fontss.
+ * @return int Returns an GdFont instance.
* @throws ImageException
*
*/
-function imageloadfont(string $file): int
+function imageloadfont(string $filename): int
{
error_clear_last();
- $result = \imageloadfont($file);
+ $result = \imageloadfont($filename);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1747,57 +2047,12 @@ function imageloadfont(string $file): int
/**
- * imageopenpolygon draws an open polygon on the given
- * image. Contrary to imagepolygon,
- * no line is drawn between the last and the first point.
- *
- * @param resource $image An image resource, returned by one of the image creation functions,
- * such as imagecreatetruecolor.
- * @param array $points An array containing the polygon's vertices, e.g.:
- *
- *
- *
- *
- * points[0]
- * = x0
- *
- *
- * points[1]
- * = y0
- *
- *
- * points[2]
- * = x1
- *
- *
- * points[3]
- * = y1
- *
- *
- *
- *
- * @param int $num_points Total number of points (vertices), which must be at least 3.
- * @param int $color A color identifier created with imagecolorallocate.
- * @throws ImageException
- *
- */
-function imageopenpolygon($image, array $points, int $num_points, int $color): void
-{
- error_clear_last();
- $result = \imageopenpolygon($image, $points, $num_points, $color);
- if ($result === false) {
- throw ImageException::createFromPhpError();
- }
-}
-
-
-/**
* Outputs or saves a PNG image from the given
* image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
*
* NULL is invalid if the quality and
* filters arguments are not used.
@@ -1813,10 +2068,18 @@ function imageopenpolygon($image, array $points, int $num_points, int $color): v
* @throws ImageException
*
*/
-function imagepng($image, $to = null, int $quality = -1, int $filters = -1): void
+function imagepng($image, $file = null, int $quality = -1, int $filters = -1): void
{
error_clear_last();
- $result = \imagepng($image, $to, $quality, $filters);
+ if ($filters !== -1) {
+ $result = \imagepng($image, $file, $quality, $filters);
+ } elseif ($quality !== -1) {
+ $result = \imagepng($image, $file, $quality);
+ } elseif ($file !== null) {
+ $result = \imagepng($image, $file);
+ } else {
+ $result = \imagepng($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1824,43 +2087,24 @@ function imagepng($image, $to = null, int $quality = -1, int $filters = -1): voi
/**
- * imagepolygon creates a polygon in the given
- * image.
+ * imagerectangle creates a rectangle starting at
+ * the specified coordinates.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param array $points An array containing the polygon's vertices, e.g.:
- *
- *
- *
- *
- * points[0]
- * = x0
- *
- *
- * points[1]
- * = y0
- *
- *
- * points[2]
- * = x1
- *
- *
- * points[3]
- * = y1
- *
- *
- *
- *
- * @param int $num_points Total number of points (vertices), which must be at least 3.
+ * @param int $x1 Upper left x coordinate.
+ * @param int $y1 Upper left y coordinate
+ * 0, 0 is the top left corner of the image.
+ * @param int $x2 Bottom right x coordinate.
+ * @param int $y2 Bottom right y coordinate.
* @param int $color A color identifier created with imagecolorallocate.
* @throws ImageException
*
*/
-function imagepolygon($image, array $points, int $num_points, int $color): void
+function imagerectangle($image, int $x1, int $y1, int $x2, int $y2, int $color): void
{
error_clear_last();
- $result = \imagepolygon($image, $points, $num_points, $color);
+ $result = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1868,27 +2112,44 @@ function imagepolygon($image, array $points, int $num_points, int $color): void
/**
- * imagerectangle creates a rectangle starting at
- * the specified coordinates.
+ * imageresolution allows to set and get the resolution of
+ * an image in DPI (dots per inch). If the optional parameters are NULL,
+ * the current resolution is returned as an indexed array. If only
+ * resolution_x is not NULL, the horizontal and vertical resolution
+ * are set to this value. If none of the optional parameters are NULL, the horizontal
+ * and vertical resolution are set to these values, respectively.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * The resolution is only used as meta information when images are read from and
+ * written to formats supporting this kind of information (curently PNG and
+ * JPEG). It does not affect any drawing operations. The default resolution
+ * for new images is 96 DPI.
+ *
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $x1 Upper left x coordinate.
- * @param int $y1 Upper left y coordinate
- * 0, 0 is the top left corner of the image.
- * @param int $x2 Bottom right x coordinate.
- * @param int $y2 Bottom right y coordinate.
- * @param int $color A color identifier created with imagecolorallocate.
+ * @param int $resolution_x The horizontal resolution in DPI.
+ * @param int $resolution_y The vertical resolution in DPI.
+ * @return mixed When used as getter,
+ * it returns an indexed array of the horizontal and vertical resolution on
+ * success.
+ * When used as setter, it returns
+ * TRUE on success.
* @throws ImageException
*
*/
-function imagerectangle($image, int $x1, int $y1, int $x2, int $y2, int $color): void
+function imageresolution($image, int $resolution_x = null, int $resolution_y = null)
{
error_clear_last();
- $result = \imagerectangle($image, $x1, $y1, $x2, $y2, $color);
+ if ($resolution_y !== null) {
+ $result = \imageresolution($image, $resolution_x, $resolution_y);
+ } elseif ($resolution_x !== null) {
+ $result = \imageresolution($image, $resolution_x);
+ } else {
+ $result = \imageresolution($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
+ return $result;
}
@@ -1899,20 +2160,20 @@ function imagerectangle($image, int $x1, int $y1, int $x2, int $y2, int $color):
* The center of rotation is the center of the image, and the rotated
* image may have different dimensions than the original image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param float $angle Rotation angle, in degrees. The rotation angle is interpreted as the
* number of degrees to rotate the image anticlockwise.
- * @param int $bgd_color Specifies the color of the uncovered zone after the rotation
- * @param int $dummy This parameter is unused.
- * @return resource Returns an image resource for the rotated image.
+ * @param int $background_color Specifies the color of the uncovered zone after the rotation
+ * @param bool $ignore_transparent This parameter is unused.
+ * @return resource Returns an image object for the rotated image.
* @throws ImageException
*
*/
-function imagerotate($image, float $angle, int $bgd_color, int $dummy = 0)
+function imagerotate($image, float $angle, int $background_color, bool $ignore_transparent = false)
{
error_clear_last();
- $result = \imagerotate($image, $angle, $bgd_color, $dummy);
+ $result = \imagerotate($image, $angle, $background_color, $ignore_transparent);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1928,16 +2189,16 @@ function imagerotate($image, float $angle, int $bgd_color, int $dummy = 0)
* Alphablending has to be disabled (imagealphablending($im, false))
* to retain the alpha-channel in the first place.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param bool $saveflag Whether to save the alpha channel or not. Defaults to FALSE.
+ * @param bool $enable Whether to save the alpha channel or not. Defaults to FALSE.
* @throws ImageException
*
*/
-function imagesavealpha($image, bool $saveflag): void
+function imagesavealpha($image, bool $enable): void
{
error_clear_last();
- $result = \imagesavealpha($image, $saveflag);
+ $result = \imagesavealpha($image, $enable);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1948,10 +2209,10 @@ function imagesavealpha($image, bool $saveflag): void
* imagescale scales an image using the given
* interpolation algorithm.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param int $new_width The width to scale the image to.
- * @param int $new_height The height to scale the image to. If omitted or negative, the aspect
+ * @param int $width The width to scale the image to.
+ * @param int $height The height to scale the image to. If omitted or negative, the aspect
* ratio will be preserved.
* @param int $mode One of IMG_NEAREST_NEIGHBOUR,
* IMG_BILINEAR_FIXED,
@@ -1963,14 +2224,14 @@ function imagesavealpha($image, bool $saveflag): void
* IMG_WEIGHTED4 is not yet supported.
*
*
- * @return resource Return the scaled image resource on success.
+ * @return resource Return the scaled image object on success.
* @throws ImageException
*
*/
-function imagescale($image, int $new_width, int $new_height = -1, int $mode = IMG_BILINEAR_FIXED)
+function imagescale($image, int $width, int $height = -1, int $mode = IMG_BILINEAR_FIXED)
{
error_clear_last();
- $result = \imagescale($image, $new_width, $new_height, $mode);
+ $result = \imagescale($image, $width, $height, $mode);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -1985,9 +2246,9 @@ function imagescale($image, int $new_width, int $new_height = -1, int $mode = IM
* colors IMG_COLOR_BRUSHED or
* IMG_COLOR_STYLEDBRUSHED.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param resource $brush An image resource.
+ * @param resource $brush An image object.
* @throws ImageException
*
*/
@@ -2005,7 +2266,7 @@ function imagesetbrush($image, $brush): void
* imagesetclip sets the current clipping rectangle, i.e.
* the area beyond which no pixels will be drawn.
*
- * @param resource $im An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x1 The x-coordinate of the upper left corner.
* @param int $y1 The y-coordinate of the upper left corner.
@@ -2014,10 +2275,10 @@ function imagesetbrush($image, $brush): void
* @throws ImageException
*
*/
-function imagesetclip($im, int $x1, int $y1, int $x2, int $y2): void
+function imagesetclip($image, int $x1, int $y1, int $x2, int $y2): void
{
error_clear_last();
- $result = \imagesetclip($im, $x1, $y1, $x2, $y2);
+ $result = \imagesetclip($image, $x1, $y1, $x2, $y2);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2028,7 +2289,7 @@ function imagesetclip($im, int $x1, int $y1, int $x2, int $y2): void
* Sets the interpolation method, setting an interpolation method affects the rendering
* of various functions in GD, such as the imagerotate function.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $method The interpolation method, which can be one of the following:
*
@@ -2155,7 +2416,7 @@ function imagesetinterpolation($image, int $method = IMG_BILINEAR_FIXED): void
* imagesetpixel draws a pixel at the specified
* coordinate.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $x x-coordinate.
* @param int $y y-coordinate.
@@ -2180,7 +2441,7 @@ function imagesetpixel($image, int $x, int $y, int $color): void
* color IMG_COLOR_STYLED or lines of images with color
* IMG_COLOR_STYLEDBRUSHED.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param array $style An array of pixel colors. You can use the
* IMG_COLOR_TRANSPARENT constant to add a
@@ -2204,7 +2465,7 @@ function imagesetstyle($image, array $style): void
* drawn when drawing rectangles, polygons, arcs etc. to
* thickness pixels.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $thickness Thickness, in pixels.
* @throws ImageException
@@ -2231,9 +2492,9 @@ function imagesetthickness($image, int $thickness): void
* image with imagecolortransparent, a tile allows certain parts
* of the underlying area to shine through can be created.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param resource $tile The image resource to be used as a tile.
+ * @param resource $tile The image object to be used as a tile.
* @throws ImageException
*
*/
@@ -2250,11 +2511,11 @@ function imagesettile($image, $tile): void
/**
* Draws a string at the given coordinates.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $font Can be 1, 2, 3, 4, 5 for built-in
- * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or any of your
- * own font identifiers registered with imageloadfont.
+ * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or GdFont instance,
+ * returned by imageloadfont.
* @param int $x x-coordinate of the upper left corner.
* @param int $y y-coordinate of the upper left corner.
* @param string $string The string to be written.
@@ -2276,11 +2537,11 @@ function imagestring($image, int $font, int $x, int $y, string $string, int $col
* Draws a string vertically at the given
* coordinates.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param int $font Can be 1, 2, 3, 4, 5 for built-in
- * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or any of your
- * own font identifiers registered with imageloadfont.
+ * fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or GdFont instance,
+ * returned by imageloadfont.
* @param int $x x-coordinate of the bottom left corner.
* @param int $y y-coordinate of the bottom left corner.
* @param string $string The string to be written.
@@ -2299,9 +2560,9 @@ function imagestringup($image, int $font, int $x, int $y, string $string, int $c
/**
- * Returns the width of the given image resource.
+ * Returns the width of the given image object.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @return int Return the width of the images.
* @throws ImageException
@@ -2319,9 +2580,9 @@ function imagesx($image): int
/**
- * Returns the height of the given image resource.
+ * Returns the height of the given image object.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @return int Return the height of the images.
* @throws ImageException
@@ -2348,19 +2609,19 @@ function imagesy($image): int
* usually best to simply produce a truecolor output image instead, which
* guarantees the highest output quality.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param bool $dither Indicates if the image should be dithered - if it is TRUE then
* dithering will be used which will result in a more speckled image but
* with better color approximation.
- * @param int $ncolors Sets the maximum number of colors that should be retained in the palette.
+ * @param int $num_colors Sets the maximum number of colors that should be retained in the palette.
* @throws ImageException
*
*/
-function imagetruecolortopalette($image, bool $dither, int $ncolors): void
+function imagetruecolortopalette($image, bool $dither, int $num_colors): void
{
error_clear_last();
- $result = \imagetruecolortopalette($image, $dither, $ncolors);
+ $result = \imagetruecolortopalette($image, $dither, $num_colors);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2372,8 +2633,8 @@ function imagetruecolortopalette($image, bool $dither, int $ncolors): void
* for a TrueType text.
*
* @param float $size The font size in points.
- * @param float $angle Angle in degrees in which text will be measured.
- * @param string $fontfile The path to the TrueType font you wish to use.
+ * @param float $angle Angle in degrees in which string will be measured.
+ * @param string $font_filename The path to the TrueType font you wish to use.
*
* Depending on which version of the GD library PHP is using, when
* fontfile does not begin with a leading
@@ -2396,7 +2657,8 @@ function imagetruecolortopalette($image, bool $dither, int $ncolors): void
*
* Note that open_basedir does
* not apply to fontfile.
- * @param string $text The string to be measured.
+ * @param string $string The string to be measured.
+ * @param array $options
* @return array imagettfbbox returns an array with 8
* elements representing four points making the bounding box of the
* text on success and FALSE on error.
@@ -2451,10 +2713,10 @@ function imagetruecolortopalette($image, bool $dither, int $ncolors): void
* @throws ImageException
*
*/
-function imagettfbbox(float $size, float $angle, string $fontfile, string $text): array
+function imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array
{
error_clear_last();
- $result = \imagettfbbox($size, $angle, $fontfile, $text);
+ $result = \imagettfbbox($size, $angle, $font_filename, $string, $options);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2466,7 +2728,7 @@ function imagettfbbox(float $size, float $angle, string $fontfile, string $text)
* Writes the given text into the image using TrueType
* fonts.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
* @param float $size The font size in points.
* @param float $angle The angle in degrees, with 0 degrees being left-to-right reading text.
@@ -2483,7 +2745,7 @@ function imagettfbbox(float $size, float $angle, string $fontfile, string $text)
* very bottom of the character.
* @param int $color The color index. Using the negative of a color index has the effect of
* turning off antialiasing. See imagecolorallocate.
- * @param string $fontfile The path to the TrueType font you wish to use.
+ * @param string $font_filename The path to the TrueType font you wish to use.
*
* Depending on which version of the GD library PHP is using, when
* fontfile does not begin with a leading
@@ -2519,6 +2781,7 @@ function imagettfbbox(float $size, float $angle, string $fontfile, string $text)
*
* If a character is used in the string which is not supported by the
* font, a hollow rectangle will replace the character.
+ * @param array $options
* @return array Returns an array with 8 elements representing four points making the
* bounding box of the text. The order of the points is lower left, lower
* right, upper right, upper left. The points are relative to the text
@@ -2527,10 +2790,10 @@ function imagettfbbox(float $size, float $angle, string $fontfile, string $text)
* @throws ImageException
*
*/
-function imagettftext($image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text): array
+function imagettftext($image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array
{
error_clear_last();
- $result = \imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
+ $result = \imagettftext($image, $size, $angle, $x, $y, $color, $font_filename, $text, $options);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2542,22 +2805,24 @@ function imagettftext($image, float $size, float $angle, int $x, int $y, int $co
* imagewbmp outputs or save a WBMP
* version of the given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
- * @param int $foreground You can set the foreground color with this parameter by setting an
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
+ * @param int $foreground_color You can set the foreground color with this parameter by setting an
* identifier obtained from imagecolorallocate.
* The default foreground color is black.
* @throws ImageException
*
*/
-function imagewbmp($image, $to = null, int $foreground = null): void
+function imagewbmp($image, $file = null, int $foreground_color = null): void
{
error_clear_last();
- if ($foreground !== null) {
- $result = \imagewbmp($image, $to, $foreground);
+ if ($foreground_color !== null) {
+ $result = \imagewbmp($image, $file, $foreground_color);
+ } elseif ($file !== null) {
+ $result = \imagewbmp($image, $file);
} else {
- $result = \imagewbmp($image, $to);
+ $result = \imagewbmp($image);
}
if ($result === false) {
throw ImageException::createFromPhpError();
@@ -2568,18 +2833,24 @@ function imagewbmp($image, $to = null, int $foreground = null): void
/**
* Outputs or saves a WebP version of the given image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param mixed $to The path or an open stream resource (which is automatically being closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be outputted directly.
+ * @param string|resource|null $file The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or NULL, the raw image stream will be output directly.
* @param int $quality quality ranges from 0 (worst
* quality, smaller file) to 100 (best quality, biggest file).
* @throws ImageException
*
*/
-function imagewebp($image, $to = null, int $quality = 80): void
+function imagewebp($image, $file = null, int $quality = -1): void
{
error_clear_last();
- $result = \imagewebp($image, $to, $quality);
+ if ($quality !== -1) {
+ $result = \imagewebp($image, $file, $quality);
+ } elseif ($file !== null) {
+ $result = \imagewebp($image, $file);
+ } else {
+ $result = \imagewebp($image);
+ }
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2590,27 +2861,27 @@ function imagewebp($image, $to = null, int $quality = 80): void
* Outputs or save an XBM version of the given
* image.
*
- * @param resource $image An image resource, returned by one of the image creation functions,
+ * @param resource $image A GdImage object, returned by one of the image creation functions,
* such as imagecreatetruecolor.
- * @param string|null $filename The path to save the file to, given as string. If NULL, the raw image stream will be output directly.
+ * @param string|resource|null $filename The path to save the file to, given as string. If NULL, the raw image stream will be output directly.
*
* The filename (without the .xbm extension) is also
* used for the C identifiers of the XBM, whereby non
* alphanumeric characters of the current locale are substituted by
* underscores. If filename is set to NULL,
* image is used to build the C identifiers.
- * @param int $foreground You can set the foreground color with this parameter by setting an
+ * @param int $foreground_color You can set the foreground color with this parameter by setting an
* identifier obtained from imagecolorallocate.
* The default foreground color is black. All other colors are treated as
* background.
* @throws ImageException
*
*/
-function imagexbm($image, ?string $filename, int $foreground = null): void
+function imagexbm($image, $filename, int $foreground_color = null): void
{
error_clear_last();
- if ($foreground !== null) {
- $result = \imagexbm($image, $filename, $foreground);
+ if ($foreground_color !== null) {
+ $result = \imagexbm($image, $filename, $foreground_color);
} else {
$result = \imagexbm($image, $filename);
}
@@ -2623,18 +2894,18 @@ function imagexbm($image, ?string $filename, int $foreground = null): void
/**
* Embeds binary IPTC data into a JPEG image.
*
- * @param string $iptcdata The data to be written.
- * @param string $jpeg_file_name Path to the JPEG image.
+ * @param string $iptc_data The data to be written.
+ * @param string $filename Path to the JPEG image.
* @param int $spool Spool flag. If the spool flag is less than 2 then the JPEG will be
* returned as a string. Otherwise the JPEG will be printed to STDOUT.
* @return string|bool If spool is less than 2, the JPEG will be returned. Otherwise returns TRUE on success.
* @throws ImageException
*
*/
-function iptcembed(string $iptcdata, string $jpeg_file_name, int $spool = 0)
+function iptcembed(string $iptc_data, string $filename, int $spool = 0)
{
error_clear_last();
- $result = \iptcembed($iptcdata, $jpeg_file_name, $spool);
+ $result = \iptcembed($iptc_data, $filename, $spool);
if ($result === false) {
throw ImageException::createFromPhpError();
}
@@ -2645,16 +2916,16 @@ function iptcembed(string $iptcdata, string $jpeg_file_name, int $spool = 0)
/**
* Parses an IPTC block into its single tags.
*
- * @param string $iptcblock A binary IPTC block.
+ * @param string $iptc_block A binary IPTC block.
* @return array Returns an array using the tagmarker as an index and the value as the
* value. It returns FALSE on error or if no IPTC data was found.
* @throws ImageException
*
*/
-function iptcparse(string $iptcblock): array
+function iptcparse(string $iptc_block): array
{
error_clear_last();
- $result = \iptcparse($iptcblock);
+ $result = \iptcparse($iptc_block);
if ($result === false) {
throw ImageException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/imap.php b/vendor/thecodingmachine/safe/generated/imap.php
index acd8672c6..917a8e201 100644
--- a/vendor/thecodingmachine/safe/generated/imap.php
+++ b/vendor/thecodingmachine/safe/generated/imap.php
@@ -5,11 +5,30 @@ namespace Safe;
use Safe\Exceptions\ImapException;
/**
- * Appends a string message to the specified mailbox.
+ * Convert an 8bit string to a quoted-printable string (according to
+ * RFC2045, section 6.7).
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param string $mailbox The mailbox name, see imap_open for more
+ * @param string $string The 8bit string to convert
+ * @return string Returns a quoted-printable string.
+ * @throws ImapException
+ *
+ */
+function imap_8bit(string $string): string
+{
+ error_clear_last();
+ $result = \imap_8bit($string);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Appends a string message to the specified folder.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $folder The mailbox name, see imap_open for more
* information
* @param string $message The message to be append, as a string
*
@@ -17,26 +36,141 @@ use Safe\Exceptions\ImapException;
* your end-of-line terminator instead of "\n" or the operation will
* fail
* @param string $options If provided, the options will also be written
- * to the mailbox
+ * to the folder
* @param string $internal_date If this parameter is set, it will set the INTERNALDATE on the appended message. The parameter should be a date string that conforms to the rfc2060 specifications for a date_time value.
* @throws ImapException
*
*/
-function imap_append($imap_stream, string $mailbox, string $message, string $options = null, string $internal_date = null): void
+function imap_append($imap, string $folder, string $message, string $options = null, string $internal_date = null): void
+{
+ error_clear_last();
+ if ($internal_date !== null) {
+ $result = \imap_append($imap, $folder, $message, $options, $internal_date);
+ } elseif ($options !== null) {
+ $result = \imap_append($imap, $folder, $message, $options);
+ } else {
+ $result = \imap_append($imap, $folder, $message);
+ }
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Decodes the given BASE-64 encoded string.
+ *
+ * @param string $string The encoded text
+ * @return string Returns the decoded message as a string.
+ * @throws ImapException
+ *
+ */
+function imap_base64(string $string): string
+{
+ error_clear_last();
+ $result = \imap_base64($string);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Convert an 8bit string to a base64 string according to RFC2045, Section 6.8.
+ *
+ * @param string $string The 8bit string
+ * @return string Returns a base64 encoded string.
+ * @throws ImapException
+ *
+ */
+function imap_binary(string $string): string
{
error_clear_last();
- $result = \imap_append($imap_stream, $mailbox, $message, $options, $internal_date);
+ $result = \imap_binary($string);
if ($result === false) {
throw ImapException::createFromPhpError();
}
+ return $result;
+}
+
+
+/**
+ * imap_body returns the body of the message,
+ * numbered message_num in the current
+ * mailbox.
+ *
+ * imap_body will only return a verbatim copy of the
+ * message body. To extract single parts of a multipart MIME-encoded
+ * message you have to use imap_fetchstructure to
+ * analyze its structure and imap_fetchbody to
+ * extract a copy of a single body component.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param int $flags The optional flags are a bit mask
+ * with one or more of the following:
+ *
+ *
+ *
+ * FT_UID - The message_num is a UID
+ *
+ *
+ *
+ *
+ * FT_PEEK - Do not set the \Seen flag if not already set
+ *
+ *
+ *
+ *
+ * FT_INTERNAL - The return string is in internal format, will
+ * not canonicalize to CRLF.
+ *
+ *
+ *
+ * @return string Returns the body of the specified message, as a string.
+ * @throws ImapException
+ *
+ */
+function imap_body($imap, int $message_num, int $flags = 0): string
+{
+ error_clear_last();
+ $result = \imap_body($imap, $message_num, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Read the structure of a specified body section of a specific message.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param string $section The body section to read
+ * @return \stdClass Returns the information in an object.
+ * For a detailed description
+ * of the object structure and properties see
+ * imap_fetchstructure.
+ * @throws ImapException
+ *
+ */
+function imap_bodystruct($imap, int $message_num, string $section): \stdClass
+{
+ error_clear_last();
+ $result = \imap_bodystruct($imap, $message_num, $section);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
}
/**
* Checks information about the current mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @return \stdClass Returns the information in an object with following properties:
*
*
@@ -71,10 +205,10 @@ function imap_append($imap_stream, string $mailbox, string $message, string $opt
* @throws ImapException
*
*/
-function imap_check($imap_stream): \stdClass
+function imap_check($imap): \stdClass
{
error_clear_last();
- $result = \imap_check($imap_stream);
+ $result = \imap_check($imap);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -87,8 +221,7 @@ function imap_check($imap_stream): \stdClass
* flag to the flags set for the
* messages in the specified sequence.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $sequence A sequence of message numbers. You can enumerate desired messages
* with the X,Y syntax, or retrieve all messages
* within an interval with the X:Y syntax
@@ -107,10 +240,10 @@ function imap_check($imap_stream): \stdClass
* @throws ImapException
*
*/
-function imap_clearflag_full($imap_stream, string $sequence, string $flag, int $options = 0): void
+function imap_clearflag_full($imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
- $result = \imap_clearflag_full($imap_stream, $sequence, $flag, $options);
+ $result = \imap_clearflag_full($imap, $sequence, $flag, $options);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -120,19 +253,18 @@ function imap_clearflag_full($imap_stream, string $sequence, string $flag, int $
/**
* Closes the imap stream.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $flag If set to CL_EXPUNGE, the function will silently
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $flags If set to CL_EXPUNGE, the function will silently
* expunge the mailbox before closing, removing all messages marked for
* deletion. You can achieve the same thing by using
* imap_expunge
* @throws ImapException
*
*/
-function imap_close($imap_stream, int $flag = 0): void
+function imap_close($imap, int $flags = 0): void
{
error_clear_last();
- $result = \imap_close($imap_stream, $flag);
+ $result = \imap_close($imap, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -142,18 +274,17 @@ function imap_close($imap_stream, int $flag = 0): void
/**
* Creates a new mailbox specified by mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $mailbox The mailbox name, see imap_open for more
* information. Names containing international characters should be
* encoded by imap_utf7_encode
* @throws ImapException
*
*/
-function imap_createmailbox($imap_stream, string $mailbox): void
+function imap_createmailbox($imap, string $mailbox): void
{
error_clear_last();
- $result = \imap_createmailbox($imap_stream, $mailbox);
+ $result = \imap_createmailbox($imap, $mailbox);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -163,17 +294,16 @@ function imap_createmailbox($imap_stream, string $mailbox): void
/**
* Deletes the specified mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $mailbox The mailbox name, see imap_open for more
* information
* @throws ImapException
*
*/
-function imap_deletemailbox($imap_stream, string $mailbox): void
+function imap_deletemailbox($imap, string $mailbox): void
{
error_clear_last();
- $result = \imap_deletemailbox($imap_stream, $mailbox);
+ $result = \imap_deletemailbox($imap, $mailbox);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -181,14 +311,262 @@ function imap_deletemailbox($imap_stream, string $mailbox): void
/**
+ * This function fetches mail headers for the given
+ * sequence and returns an overview of their
+ * contents.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $sequence A message sequence description. You can enumerate desired messages
+ * with the X,Y syntax, or retrieve all messages
+ * within an interval with the X:Y syntax
+ * @param int $flags sequence will contain a sequence of message
+ * indices or UIDs, if this parameter is set to
+ * FT_UID.
+ * @return array Returns an array of objects describing one message header each.
+ * The object will only define a property if it exists. The possible
+ * properties are:
+ *
+ *
+ *
+ * subject - the messages subject
+ *
+ *
+ *
+ *
+ * from - who sent it
+ *
+ *
+ *
+ *
+ * to - recipient
+ *
+ *
+ *
+ *
+ * date - when was it sent
+ *
+ *
+ *
+ *
+ * message_id - Message-ID
+ *
+ *
+ *
+ *
+ * references - is a reference to this message id
+ *
+ *
+ *
+ *
+ * in_reply_to - is a reply to this message id
+ *
+ *
+ *
+ *
+ * size - size in bytes
+ *
+ *
+ *
+ *
+ * uid - UID the message has in the mailbox
+ *
+ *
+ *
+ *
+ * msgno - message sequence number in the mailbox
+ *
+ *
+ *
+ *
+ * recent - this message is flagged as recent
+ *
+ *
+ *
+ *
+ * flagged - this message is flagged
+ *
+ *
+ *
+ *
+ * answered - this message is flagged as answered
+ *
+ *
+ *
+ *
+ * deleted - this message is flagged for deletion
+ *
+ *
+ *
+ *
+ * seen - this message is flagged as already read
+ *
+ *
+ *
+ *
+ * draft - this message is flagged as being a draft
+ *
+ *
+ *
+ *
+ * udate - the UNIX timestamp of the arrival date
+ *
+ *
+ *
+ * The function returns FALSE on failure.
+ * @throws ImapException
+ *
+ */
+function imap_fetch_overview($imap, string $sequence, int $flags = 0): array
+{
+ error_clear_last();
+ $result = \imap_fetch_overview($imap, $sequence, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Fetch of a particular section of the body of the specified messages.
+ * Body parts are not decoded by this function.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param string $section The part number. It is a string of integers delimited by period which
+ * index into a body part list as per the IMAP4 specification
+ * @param int $flags A bitmask with one or more of the following:
+ *
+ *
+ *
+ * FT_UID - The message_num is a UID
+ *
+ *
+ *
+ *
+ * FT_PEEK - Do not set the \Seen flag if
+ * not already set
+ *
+ *
+ *
+ *
+ * FT_INTERNAL - The return string is in
+ * internal format, will not canonicalize to CRLF.
+ *
+ *
+ *
+ * @return string Returns a particular section of the body of the specified messages as a
+ * text string.
+ * @throws ImapException
+ *
+ */
+function imap_fetchbody($imap, int $message_num, string $section, int $flags = 0): string
+{
+ error_clear_last();
+ $result = \imap_fetchbody($imap, $message_num, $section, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * This function causes a fetch of the complete, unfiltered RFC2822 format header of the specified
+ * message.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param int $flags The possible flags are:
+ *
+ *
+ *
+ * FT_UID - The message_num
+ * argument is a UID
+ *
+ *
+ *
+ *
+ * FT_INTERNAL - The return string
+ * is in "internal" format, without any attempt to
+ * canonicalize to CRLF newlines
+ *
+ *
+ *
+ *
+ * FT_PREFETCHTEXT - The RFC822.TEXT
+ * should be pre-fetched at the same time. This avoids an
+ * extra RTT on an IMAP connection if a full message text is
+ * desired (e.g. in a "save to local file" operation)
+ *
+ *
+ *
+ * @return string Returns the header of the specified message as a text string.
+ * @throws ImapException
+ *
+ */
+function imap_fetchheader($imap, int $message_num, int $flags = 0): string
+{
+ error_clear_last();
+ $result = \imap_fetchheader($imap, $message_num, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Fetch the MIME headers of a particular section of the body of the specified messages.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param string $section The part number. It is a string of integers delimited by period which
+ * index into a body part list as per the IMAP4 specification
+ * @param int $flags A bitmask with one or more of the following:
+ *
+ *
+ *
+ * FT_UID - The message_num is a UID
+ *
+ *
+ *
+ *
+ * FT_PEEK - Do not set the \Seen flag if
+ * not already set
+ *
+ *
+ *
+ *
+ * FT_INTERNAL - The return string is in
+ * internal format, will not canonicalize to CRLF.
+ *
+ *
+ *
+ * @return string Returns the MIME headers of a particular section of the body of the specified messages as a
+ * text string.
+ * @throws ImapException
+ *
+ */
+function imap_fetchmime($imap, int $message_num, string $section, int $flags = 0): string
+{
+ error_clear_last();
+ $result = \imap_fetchmime($imap, $message_num, $section, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Fetches all the structured information for a given message.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $msg_number The message number
- * @param int $options This optional parameter only has a single option,
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param int $flags This optional parameter only has a single option,
* FT_UID, which tells the function to treat the
- * msg_number argument as a
+ * message_num argument as a
* UID.
* @return \stdClass Returns an object with properties listed in the table below.
*
@@ -317,10 +695,10 @@ function imap_deletemailbox($imap_stream, string $mailbox): void
* @throws ImapException
*
*/
-function imap_fetchstructure($imap_stream, int $msg_number, int $options = 0): \stdClass
+function imap_fetchstructure($imap, int $message_num, int $flags = 0): \stdClass
{
error_clear_last();
- $result = \imap_fetchstructure($imap_stream, $msg_number, $options);
+ $result = \imap_fetchstructure($imap, $message_num, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -331,9 +709,8 @@ function imap_fetchstructure($imap_stream, int $msg_number, int $options = 0): \
/**
* Purges the cache of entries of a specific type.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $caches Specifies the cache to purge. It may one or a combination
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $flags Specifies the cache to purge. It may one or a combination
* of the following constants:
* IMAP_GC_ELT (message cache elements),
* IMAP_GC_ENV (envelope and bodies),
@@ -341,27 +718,218 @@ function imap_fetchstructure($imap_stream, int $msg_number, int $options = 0): \
* @throws ImapException
*
*/
-function imap_gc($imap_stream, int $caches): void
+function imap_gc($imap, int $flags): void
+{
+ error_clear_last();
+ $result = \imap_gc($imap, $flags);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Gets the ACL for a given mailbox.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $mailbox The mailbox name, see imap_open for more
+ * information
+ * @return array Returns an associative array of "folder" =&gt; "acl" pairs.
+ * @throws ImapException
+ *
+ */
+function imap_getacl($imap, string $mailbox): array
+{
+ error_clear_last();
+ $result = \imap_getacl($imap, $mailbox);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets information on the mailboxes.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $reference reference should normally be just the server
+ * specification as described in imap_open
+ * @param string $pattern Specifies where in the mailbox hierarchy
+ * to start searching.
+ *
+ * There are two special characters you can
+ * pass as part of the pattern:
+ * '*' and '%'.
+ * '*' means to return all mailboxes. If you pass
+ * pattern as '*', you will
+ * get a list of the entire mailbox hierarchy.
+ * '%'
+ * means to return the current level only.
+ * '%' as the pattern
+ * parameter will return only the top level
+ * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.
+ * @return array Returns an array of objects containing mailbox information. Each
+ * object has the attributes name, specifying
+ * the full name of the mailbox; delimiter,
+ * which is the hierarchy delimiter for the part of the hierarchy
+ * this mailbox is in; and
+ * attributes. Attributes
+ * is a bitmask that can be tested against:
+ *
+ *
+ *
+ * LATT_NOINFERIORS - This mailbox not contains, and may not contain any
+ * "children" (there are no mailboxes below this one). Calling
+ * imap_createmailbox will not work on this mailbox.
+ *
+ *
+ *
+ *
+ * LATT_NOSELECT - This is only a container,
+ * not a mailbox - you cannot open it.
+ *
+ *
+ *
+ *
+ * LATT_MARKED - This mailbox is marked. This means that it may
+ * contain new messages since the last time it was checked. Not provided by all IMAP
+ * servers.
+ *
+ *
+ *
+ *
+ * LATT_UNMARKED - This mailbox is not marked, does not contain new
+ * messages. If either MARKED or UNMARKED is
+ * provided, you can assume the IMAP server supports this feature for this mailbox.
+ *
+ *
+ *
+ *
+ * LATT_REFERRAL - This container has a referral to a remote mailbox.
+ *
+ *
+ *
+ *
+ * LATT_HASCHILDREN - This mailbox has selectable inferiors.
+ *
+ *
+ *
+ *
+ * LATT_HASNOCHILDREN - This mailbox has no selectable inferiors.
+ *
+ *
+ *
+ * The function returns FALSE on failure.
+ * @throws ImapException
+ *
+ */
+function imap_getmailboxes($imap, string $reference, string $pattern): array
{
error_clear_last();
- $result = \imap_gc($imap_stream, $caches);
+ $result = \imap_getmailboxes($imap, $reference, $pattern);
if ($result === false) {
throw ImapException::createFromPhpError();
}
+ return $result;
+}
+
+
+/**
+ * Gets information about the subscribed mailboxes.
+ *
+ * Identical to imap_getmailboxes, except that it only
+ * returns mailboxes that the user is subscribed to.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $reference reference should normally be just the server
+ * specification as described in imap_open
+ * @param string $pattern Specifies where in the mailbox hierarchy
+ * to start searching.
+ *
+ * There are two special characters you can
+ * pass as part of the pattern:
+ * '*' and '%'.
+ * '*' means to return all mailboxes. If you pass
+ * pattern as '*', you will
+ * get a list of the entire mailbox hierarchy.
+ * '%'
+ * means to return the current level only.
+ * '%' as the pattern
+ * parameter will return only the top level
+ * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.
+ * @return array Returns an array of objects containing mailbox information. Each
+ * object has the attributes name, specifying
+ * the full name of the mailbox; delimiter,
+ * which is the hierarchy delimiter for the part of the hierarchy
+ * this mailbox is in; and
+ * attributes. Attributes
+ * is a bitmask that can be tested against:
+ *
+ *
+ *
+ * LATT_NOINFERIORS - This mailbox has no
+ * "children" (there are no mailboxes below this one).
+ *
+ *
+ *
+ *
+ * LATT_NOSELECT - This is only a container,
+ * not a mailbox - you cannot open it.
+ *
+ *
+ *
+ *
+ * LATT_MARKED - This mailbox is marked.
+ * Only used by UW-IMAPD.
+ *
+ *
+ *
+ *
+ * LATT_UNMARKED - This mailbox is not marked.
+ * Only used by UW-IMAPD.
+ *
+ *
+ *
+ *
+ * LATT_REFERRAL - This container has a referral to a remote mailbox.
+ *
+ *
+ *
+ *
+ * LATT_HASCHILDREN - This mailbox has selectable inferiors.
+ *
+ *
+ *
+ *
+ * LATT_HASNOCHILDREN - This mailbox has no selectable inferiors.
+ *
+ *
+ *
+ * The function returns FALSE on failure.
+ * @throws ImapException
+ *
+ */
+function imap_getsubscribed($imap, string $reference, string $pattern): array
+{
+ error_clear_last();
+ $result = \imap_getsubscribed($imap, $reference, $pattern);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
}
/**
* Gets information about the given message number by reading its headers.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $msg_number The message number
- * @param int $fromlength Number of characters for the fetchfrom property.
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $message_num The message number
+ * @param int $from_length Number of characters for the fetchfrom property.
* Must be greater than or equal to zero.
- * @param int $subjectlength Number of characters for the fetchsubject property
+ * @param int $subject_length Number of characters for the fetchsubject property
* Must be greater than or equal to zero.
- * @param string $defaulthost
* @return \stdClass Returns FALSE on error or, if successful, the information in an object with following properties:
*
*
@@ -553,24 +1121,122 @@ function imap_gc($imap_stream, int $caches): void
*
*
*
- * fetchfrom - from line formatted to fit fromlength
+ * fetchfrom - from line formatted to fit from_length
* characters
*
*
*
*
* fetchsubject - subject line formatted to fit
- * subjectlength characters
+ * subject_length characters
+ *
+ *
+ *
+ * @throws ImapException
+ *
+ */
+function imap_headerinfo($imap, int $message_num, int $from_length = 0, int $subject_length = 0): \stdClass
+{
+ error_clear_last();
+ $result = \imap_headerinfo($imap, $message_num, $from_length, $subject_length);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns headers for all messages in a mailbox.
*
+ * @param resource $imap An IMAP\Connection instance.
+ * @return array Returns an array of string formatted with header info. One
+ * element per mail message.
+ * Returns FALSE on failure.
+ * @throws ImapException
*
+ */
+function imap_headers($imap): array
+{
+ error_clear_last();
+ $result = \imap_headers($imap);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns an array containing the names of the mailboxes that have
+ * content in the text of the mailbox.
+ *
+ * This function is similar to imap_listmailbox,
+ * but it will additionally check for the presence of the string
+ * content inside the mailbox data.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $reference reference should normally be just the server
+ * specification as described in imap_open
+ * @param string $pattern Specifies where in the mailbox hierarchy
+ * to start searching.
+ *
+ * There are two special characters you can
+ * pass as part of the pattern:
+ * '*' and '%'.
+ * '*' means to return all mailboxes. If you pass
+ * pattern as '*', you will
+ * get a list of the entire mailbox hierarchy.
+ * '%'
+ * means to return the current level only.
+ * '%' as the pattern
+ * parameter will return only the top level
+ * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.
+ * @param string $content The searched string
+ * @return array Returns an array containing the names of the mailboxes that have
+ * content in the text of the mailbox.
+ * @throws ImapException
*
+ */
+function imap_listscan($imap, string $reference, string $pattern, string $content): array
+{
+ error_clear_last();
+ $result = \imap_listscan($imap, $reference, $pattern, $content);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets an array of all the mailboxes that you have subscribed.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $reference reference should normally be just the server
+ * specification as described in imap_open
+ * @param string $pattern Specifies where in the mailbox hierarchy
+ * to start searching.
+ *
+ * There are two special characters you can
+ * pass as part of the pattern:
+ * '*' and '%'.
+ * '*' means to return all mailboxes. If you pass
+ * pattern as '*', you will
+ * get a list of the entire mailbox hierarchy.
+ * '%'
+ * means to return the current level only.
+ * '%' as the pattern
+ * parameter will return only the top level
+ * mailboxes; '~/mail/%' on UW_IMAPD will return every mailbox in the ~/mail directory, but none in subfolders of that directory.
+ * @return array Returns an array of all the subscribed mailboxes.
* @throws ImapException
*
*/
-function imap_headerinfo($imap_stream, int $msg_number, int $fromlength = 0, int $subjectlength = 0, string $defaulthost = null): \stdClass
+function imap_lsub($imap, string $reference, string $pattern): array
{
error_clear_last();
- $result = \imap_headerinfo($imap_stream, $msg_number, $fromlength, $subjectlength, $defaulthost);
+ $result = \imap_lsub($imap, $reference, $pattern);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -580,14 +1246,14 @@ function imap_headerinfo($imap_stream, int $msg_number, int $fromlength = 0, int
/**
* Create a MIME message based on the given envelope
- * and body sections.
+ * and bodies sections.
*
* @param array $envelope An associative array of header fields. Valid keys are: "remail",
* "return_path", "date", "from", "reply_to", "in_reply_to", "subject",
* "to", "cc", "bcc" and "message_id", which set the respective message headers to the given string.
* To set additional headers, the key "custom_headers" is supported, which expects
* an array of those headers, e.g. ["User-Agent: My Mail Client"].
- * @param array $body An indexed array of bodies. The first body is the main body of the message;
+ * @param array $bodies An indexed array of bodies. The first body is the main body of the message;
* only if it has a type of TYPEMULTIPART, further bodies
* are processed; these bodies constitute the bodies of the parts.
*
@@ -685,10 +1351,10 @@ function imap_headerinfo($imap_stream, int $msg_number, int $fromlength = 0, int
* @throws ImapException
*
*/
-function imap_mail_compose(array $envelope, array $body): string
+function imap_mail_compose(array $envelope, array $bodies): string
{
error_clear_last();
- $result = \imap_mail_compose($envelope, $body);
+ $result = \imap_mail_compose($envelope, $bodies);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -697,16 +1363,15 @@ function imap_mail_compose(array $envelope, array $body): string
/**
- * Copies mail messages specified by msglist
+ * Copies mail messages specified by message_nums
* to specified mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param string $msglist msglist is a range not just message
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $message_nums message_nums is a range not just message
* numbers (as described in RFC2060).
* @param string $mailbox The mailbox name, see imap_open for more
* information
- * @param int $options options is a bitmask of one or more of
+ * @param int $flags flags is a bitmask of one or more of
*
*
*
@@ -716,17 +1381,18 @@ function imap_mail_compose(array $envelope, array $body): string
*
*
* CP_MOVE - Delete the messages from
- * the current mailbox after copying
+ * the current mailbox after copying. If this flag is set, the function
+ * behaves identically to imap_mail_move.
*
*
*
* @throws ImapException
*
*/
-function imap_mail_copy($imap_stream, string $msglist, string $mailbox, int $options = 0): void
+function imap_mail_copy($imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
- $result = \imap_mail_copy($imap_stream, $msglist, $mailbox, $options);
+ $result = \imap_mail_copy($imap, $message_nums, $mailbox, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -734,16 +1400,18 @@ function imap_mail_copy($imap_stream, string $msglist, string $mailbox, int $opt
/**
- * Moves mail messages specified by msglist to the
+ * Moves mail messages specified by message_nums to the
* specified mailbox.
+ * Note that the mail messages are actually copied to the
+ * mailbox, and the original messages are flagged for deletion.
+ * That implies that the messages in mailbox are assigned new UIDs.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param string $msglist msglist is a range not just message numbers
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $message_nums message_nums is a range not just message numbers
* (as described in RFC2060).
* @param string $mailbox The mailbox name, see imap_open for more
* information
- * @param int $options options is a bitmask and may contain the single option:
+ * @param int $flags flags is a bitmask and may contain the single option:
*
*
*
@@ -754,10 +1422,10 @@ function imap_mail_copy($imap_stream, string $msglist, string $mailbox, int $opt
* @throws ImapException
*
*/
-function imap_mail_move($imap_stream, string $msglist, string $mailbox, int $options = 0): void
+function imap_mail_move($imap, string $message_nums, string $mailbox, int $flags = 0): void
{
error_clear_last();
- $result = \imap_mail_move($imap_stream, $msglist, $mailbox, $options);
+ $result = \imap_mail_move($imap, $message_nums, $mailbox, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -779,15 +1447,25 @@ function imap_mail_move($imap_stream, string $msglist, string $mailbox, int $opt
* @param string $cc
* @param string $bcc The receivers specified in bcc will get the
* mail, but are excluded from the headers.
- * @param string $rpath Use this parameter to specify return path upon mail delivery failure.
+ * @param string $return_path Use this parameter to specify return path upon mail delivery failure.
* This is useful when using PHP as a mail client for multiple users.
* @throws ImapException
*
*/
-function imap_mail(string $to, string $subject, string $message, string $additional_headers = null, string $cc = null, string $bcc = null, string $rpath = null): void
+function imap_mail(string $to, string $subject, string $message, string $additional_headers = null, string $cc = null, string $bcc = null, string $return_path = null): void
{
error_clear_last();
- $result = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $rpath);
+ if ($return_path !== null) {
+ $result = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc, $return_path);
+ } elseif ($bcc !== null) {
+ $result = \imap_mail($to, $subject, $message, $additional_headers, $cc, $bcc);
+ } elseif ($cc !== null) {
+ $result = \imap_mail($to, $subject, $message, $additional_headers, $cc);
+ } elseif ($additional_headers !== null) {
+ $result = \imap_mail($to, $subject, $message, $additional_headers);
+ } else {
+ $result = \imap_mail($to, $subject, $message);
+ }
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -800,8 +1478,7 @@ function imap_mail(string $to, string $subject, string $message, string $additio
* all messages in the mailbox, which will take some additional time to
* execute.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @return \stdClass Returns the information in an object with following properties:
*
* Mailbox properties
@@ -847,10 +1524,37 @@ function imap_mail(string $to, string $subject, string $message, string $additio
* @throws ImapException
*
*/
-function imap_mailboxmsginfo($imap_stream): \stdClass
+function imap_mailboxmsginfo($imap): \stdClass
{
error_clear_last();
- $result = \imap_mailboxmsginfo($imap_stream);
+ $result = \imap_mailboxmsginfo($imap);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Decodes MIME message header extensions that are non ASCII text (see RFC2047).
+ *
+ * @param string $string The MIME text
+ * @return array The decoded elements are returned in an array of objects, where each
+ * object has two properties, charset and
+ * text.
+ *
+ * If the element hasn't been encoded, and in other words is in
+ * plain US-ASCII, the charset property of that element is
+ * set to default.
+ *
+ * The function returns FALSE on failure.
+ * @throws ImapException
+ *
+ */
+function imap_mime_header_decode(string $string): array
+{
+ error_clear_last();
+ $result = \imap_mime_header_decode($string);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -861,15 +1565,15 @@ function imap_mailboxmsginfo($imap_stream): \stdClass
/**
* Decode a modified UTF-7 (as specified in RFC 2060, section 5.1.3) string to UTF-8.
*
- * @param string $in A string encoded in modified UTF-7.
- * @return string Returns in converted to UTF-8.
+ * @param string $string A string encoded in modified UTF-7.
+ * @return string Returns string converted to UTF-8.
* @throws ImapException
*
*/
-function imap_mutf7_to_utf8(string $in): string
+function imap_mutf7_to_utf8(string $string): string
{
error_clear_last();
- $result = \imap_mutf7_to_utf8($in);
+ $result = \imap_mutf7_to_utf8($string);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -880,16 +1584,15 @@ function imap_mutf7_to_utf8(string $in): string
/**
* Gets the number of messages in the current mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @return int Return the number of messages in the current mailbox, as an integer.
* @throws ImapException
*
*/
-function imap_num_msg($imap_stream): int
+function imap_num_msg($imap): int
{
error_clear_last();
- $result = \imap_num_msg($imap_stream);
+ $result = \imap_num_msg($imap);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1031,9 +1734,9 @@ function imap_num_msg($imap_stream): int
*
*
*
- * @param string $username The user name
- * @param string $password The password associated with the username
- * @param int $options The options are a bit mask with one or more of
+ * @param string $user The user name
+ * @param string $password The password associated with the user
+ * @param int $flags The flags are a bit mask with one or more of
* the following:
*
*
@@ -1087,8 +1790,8 @@ function imap_num_msg($imap_stream): int
*
*
*
- * @param int $n_retries Number of maximum connect attempts
- * @param array|null $params Connection parameters, the following (string) keys maybe used
+ * @param int $retries Number of maximum connect attempts
+ * @param array $options Connection parameters, the following (string) keys maybe used
* to set one or more connection parameters:
*
*
@@ -1097,14 +1800,33 @@ function imap_num_msg($imap_stream): int
*
*
*
- * @return resource Returns an IMAP stream on success.
+ * @return resource Returns an IMAP\Connection instance on success.
+ * @throws ImapException
+ *
+ */
+function imap_open(string $mailbox, string $user, string $password, int $flags = 0, int $retries = 0, array $options = [])
+{
+ error_clear_last();
+ $result = \imap_open($mailbox, $user, $password, $flags, $retries, $options);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Convert a quoted-printable string to an 8 bit string according to RFC2045, section 6.7.
+ *
+ * @param string $string A quoted-printable string
+ * @return string Returns an 8 bits string.
* @throws ImapException
*
*/
-function imap_open(string $mailbox, string $username, string $password, int $options = 0, int $n_retries = 0, ?array $params = null)
+function imap_qprint(string $string): string
{
error_clear_last();
- $result = \imap_open($mailbox, $username, $password, $options, $n_retries, $params);
+ $result = \imap_qprint($string);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1117,40 +1839,60 @@ function imap_open(string $mailbox, string $username, string $password, int $opt
* imap_open for the format of
* mbox names).
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param string $old_mbox The old mailbox name, see imap_open for more
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $from The old mailbox name, see imap_open for more
+ * information
+ * @param string $to The new mailbox name, see imap_open for more
* information
- * @param string $new_mbox The new mailbox name, see imap_open for more
+ * @throws ImapException
+ *
+ */
+function imap_renamemailbox($imap, string $from, string $to): void
+{
+ error_clear_last();
+ $result = \imap_renamemailbox($imap, $from, $to);
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Returns a properly formatted email address as defined in RFC2822 given the needed information.
+ *
+ * @param string|null $mailbox The mailbox name, see imap_open for more
* information
+ * @param string|null $hostname The email host part
+ * @param string|null $personal The name of the account owner
+ * @return string Returns a string properly formatted email address as defined in RFC2822.
* @throws ImapException
*
*/
-function imap_renamemailbox($imap_stream, string $old_mbox, string $new_mbox): void
+function imap_rfc822_write_address(?string $mailbox, ?string $hostname, ?string $personal): string
{
error_clear_last();
- $result = \imap_renamemailbox($imap_stream, $old_mbox, $new_mbox);
+ $result = \imap_rfc822_write_address($mailbox, $hostname, $personal);
if ($result === false) {
throw ImapException::createFromPhpError();
}
+ return $result;
}
/**
* Saves a part or the whole body of the specified message.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string|resource $file The path to the saved file as a string, or a valid file descriptor
* returned by fopen.
- * @param int $msg_number The message number
- * @param string $part_number The part number. It is a string of integers delimited by period which
+ * @param int $message_num The message number
+ * @param string $section The part number. It is a string of integers delimited by period which
* index into a body part list as per the IMAP4 specification
- * @param int $options A bitmask with one or more of the following:
+ * @param int $flags A bitmask with one or more of the following:
*
*
*
- * FT_UID - The msg_number is a UID
+ * FT_UID - The message_num is a UID
*
*
*
@@ -1169,10 +1911,10 @@ function imap_renamemailbox($imap_stream, string $old_mbox, string $new_mbox): v
* @throws ImapException
*
*/
-function imap_savebody($imap_stream, $file, int $msg_number, string $part_number = "", int $options = 0): void
+function imap_savebody($imap, $file, int $message_num, string $section = "", int $flags = 0): void
{
error_clear_last();
- $result = \imap_savebody($imap_stream, $file, $msg_number, $part_number, $options);
+ $result = \imap_savebody($imap, $file, $message_num, $section, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1182,18 +1924,17 @@ function imap_savebody($imap_stream, $file, int $msg_number, string $part_number
/**
* Sets an upper limit quota on a per mailbox basis.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $quota_root The mailbox to have a quota set. This should follow the IMAP standard
* format for a mailbox: user.name.
- * @param int $quota_limit The maximum size (in KB) for the quota_root
+ * @param int $mailbox_size The maximum size (in KB) for the quota_root
* @throws ImapException
*
*/
-function imap_set_quota($imap_stream, string $quota_root, int $quota_limit): void
+function imap_set_quota($imap, string $quota_root, int $mailbox_size): void
{
error_clear_last();
- $result = \imap_set_quota($imap_stream, $quota_root, $quota_limit);
+ $result = \imap_set_quota($imap, $quota_root, $mailbox_size);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1203,20 +1944,19 @@ function imap_set_quota($imap_stream, string $quota_root, int $quota_limit): voi
/**
* Sets the ACL for a giving mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $mailbox The mailbox name, see imap_open for more
* information
- * @param string $id The user to give the rights to.
+ * @param string $user_id The user to give the rights to.
* @param string $rights The rights to give to the user. Passing an empty string will delete
* acl.
* @throws ImapException
*
*/
-function imap_setacl($imap_stream, string $mailbox, string $id, string $rights): void
+function imap_setacl($imap, string $mailbox, string $user_id, string $rights): void
{
error_clear_last();
- $result = \imap_setacl($imap_stream, $mailbox, $id, $rights);
+ $result = \imap_setacl($imap, $mailbox, $user_id, $rights);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1228,8 +1968,7 @@ function imap_setacl($imap_stream, string $mailbox, string $id, string $rights):
* flags set for the messages in the specified
* sequence.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $sequence A sequence of message numbers. You can enumerate desired messages
* with the X,Y syntax, or retrieve all messages
* within an interval with the X:Y syntax
@@ -1249,10 +1988,10 @@ function imap_setacl($imap_stream, string $mailbox, string $id, string $rights):
* @throws ImapException
*
*/
-function imap_setflag_full($imap_stream, string $sequence, string $flag, int $options = NIL): void
+function imap_setflag_full($imap, string $sequence, string $flag, int $options = 0): void
{
error_clear_last();
- $result = \imap_setflag_full($imap_stream, $sequence, $flag, $options);
+ $result = \imap_setflag_full($imap, $sequence, $flag, $options);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1262,8 +2001,7 @@ function imap_setflag_full($imap_stream, string $sequence, string $flag, int $op
/**
* Gets and sorts message numbers by the given parameters.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param int $criteria Criteria can be one (and only one) of the following:
*
*
@@ -1302,8 +2040,8 @@ function imap_setflag_full($imap_stream, string $sequence, string $flag, int $op
*
*
*
- * @param int $reverse Set this to 1 for reverse sorting
- * @param int $options The options are a bitmask of one or more of the
+ * @param int $reverse Whether to sort in reverse order.
+ * @param int $flags The flags are a bitmask of one or more of the
* following:
*
*
@@ -1325,10 +2063,82 @@ function imap_setflag_full($imap_stream, string $sequence, string $flag, int $op
* @throws ImapException
*
*/
-function imap_sort($imap_stream, int $criteria, int $reverse, int $options = 0, string $search_criteria = null, string $charset = null): array
+function imap_sort($imap, int $criteria, int $reverse, int $flags = 0, string $search_criteria = null, string $charset = null): array
{
error_clear_last();
- $result = \imap_sort($imap_stream, $criteria, $reverse, $options, $search_criteria, $charset);
+ if ($charset !== null) {
+ $result = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria, $charset);
+ } elseif ($search_criteria !== null) {
+ $result = \imap_sort($imap, $criteria, $reverse, $flags, $search_criteria);
+ } else {
+ $result = \imap_sort($imap, $criteria, $reverse, $flags);
+ }
+ if ($result === false) {
+ throw ImapException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets status information about the given mailbox.
+ *
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $mailbox The mailbox name, see imap_open for more
+ * information
+ * @param int $flags Valid flags are:
+ *
+ *
+ *
+ * SA_MESSAGES - set $status-&gt;messages to the
+ * number of messages in the mailbox
+ *
+ *
+ *
+ *
+ * SA_RECENT - set $status-&gt;recent to the number
+ * of recent messages in the mailbox
+ *
+ *
+ *
+ *
+ * SA_UNSEEN - set $status-&gt;unseen to the number
+ * of unseen (new) messages in the mailbox
+ *
+ *
+ *
+ *
+ * SA_UIDNEXT - set $status-&gt;uidnext to the next
+ * uid to be used in the mailbox
+ *
+ *
+ *
+ *
+ * SA_UIDVALIDITY - set $status-&gt;uidvalidity to a
+ * constant that changes when uids for the mailbox may no longer be
+ * valid
+ *
+ *
+ *
+ *
+ * SA_ALL - set all of the above
+ *
+ *
+ *
+ * @return \stdClass This function returns an object containing status information.
+ * The object has the following properties: messages,
+ * recent, unseen,
+ * uidnext, and uidvalidity.
+ *
+ * flags is also set, which contains a bitmask which can
+ * be checked against any of the above constants.
+ * @throws ImapException
+ *
+ */
+function imap_status($imap, string $mailbox, int $flags): \stdClass
+{
+ error_clear_last();
+ $result = \imap_status($imap, $mailbox, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1339,17 +2149,16 @@ function imap_sort($imap_stream, int $criteria, int $reverse, int $options = 0,
/**
* Subscribe to a new mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $mailbox The mailbox name, see imap_open for more
* information
* @throws ImapException
*
*/
-function imap_subscribe($imap_stream, string $mailbox): void
+function imap_subscribe($imap, string $mailbox): void
{
error_clear_last();
- $result = \imap_subscribe($imap_stream, $mailbox);
+ $result = \imap_subscribe($imap, $mailbox);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1359,9 +2168,8 @@ function imap_subscribe($imap_stream, string $mailbox): void
/**
* Gets a tree of a threaded message.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $options
+ * @param resource $imap An IMAP\Connection instance.
+ * @param int $flags
* @return array imap_thread returns an associative array containing
* a tree of messages threaded by REFERENCES.
*
@@ -1381,10 +2189,10 @@ function imap_subscribe($imap_stream, string $mailbox): void
* @throws ImapException
*
*/
-function imap_thread($imap_stream, int $options = SE_FREE): array
+function imap_thread($imap, int $flags = SE_FREE): array
{
error_clear_last();
- $result = \imap_thread($imap_stream, $options);
+ $result = \imap_thread($imap, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1425,17 +2233,18 @@ function imap_timeout(int $timeout_type, int $timeout = -1)
* Removes the deletion flag for a specified message, which is set by
* imap_delete or imap_mail_move.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
- * @param int $msg_number The message number
+ * @param resource $imap An IMAP\Connection instance.
+ * @param string $message_nums A string representing one or more messages in IMAP4-style sequence format
+ * ("n", "n:m", or combination of these
+ * delimited by commas).
* @param int $flags
* @throws ImapException
*
*/
-function imap_undelete($imap_stream, int $msg_number, int $flags = 0): void
+function imap_undelete($imap, string $message_nums, int $flags = 0): void
{
error_clear_last();
- $result = \imap_undelete($imap_stream, $msg_number, $flags);
+ $result = \imap_undelete($imap, $message_nums, $flags);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1445,17 +2254,16 @@ function imap_undelete($imap_stream, int $msg_number, int $flags = 0): void
/**
* Unsubscribe from the specified mailbox.
*
- * @param resource $imap_stream An IMAP stream returned by
- * imap_open.
+ * @param resource $imap An IMAP\Connection instance.
* @param string $mailbox The mailbox name, see imap_open for more
* information
* @throws ImapException
*
*/
-function imap_unsubscribe($imap_stream, string $mailbox): void
+function imap_unsubscribe($imap, string $mailbox): void
{
error_clear_last();
- $result = \imap_unsubscribe($imap_stream, $mailbox);
+ $result = \imap_unsubscribe($imap, $mailbox);
if ($result === false) {
throw ImapException::createFromPhpError();
}
@@ -1465,15 +2273,15 @@ function imap_unsubscribe($imap_stream, string $mailbox): void
/**
* Encode a UTF-8 string to modified UTF-7 (as specified in RFC 2060, section 5.1.3).
*
- * @param string $in A UTF-8 encoded string.
- * @return string Returns in converted to modified UTF-7.
+ * @param string $string A UTF-8 encoded string.
+ * @return string Returns string converted to modified UTF-7.
* @throws ImapException
*
*/
-function imap_utf8_to_mutf7(string $in): string
+function imap_utf8_to_mutf7(string $string): string
{
error_clear_last();
- $result = \imap_utf8_to_mutf7($in);
+ $result = \imap_utf8_to_mutf7($string);
if ($result === false) {
throw ImapException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/info.php b/vendor/thecodingmachine/safe/generated/info.php
index 1a76b406e..aefa0819d 100644
--- a/vendor/thecodingmachine/safe/generated/info.php
+++ b/vendor/thecodingmachine/safe/generated/info.php
@@ -5,6 +5,123 @@ namespace Safe;
use Safe\Exceptions\InfoException;
/**
+ * Set the various assert control options or just query
+ * their current settings.
+ *
+ * @param int $what
+ * Assert Options
+ *
+ *
+ *
+ * Option
+ * INI Setting
+ * Default value
+ * Description
+ *
+ *
+ *
+ *
+ * ASSERT_ACTIVE
+ * assert.active
+ * 1
+ * enable assert evaluation
+ *
+ *
+ * ASSERT_WARNING
+ * assert.warning
+ * 1
+ * issue a PHP warning for each failed assertion
+ *
+ *
+ * ASSERT_BAIL
+ * assert.bail
+ * 0
+ * terminate execution on failed assertions
+ *
+ *
+ * ASSERT_QUIET_EVAL
+ * assert.quiet_eval
+ * 0
+ *
+ * disable error_reporting during assertion expression
+ * evaluation
+ *
+ *
+ *
+ * ASSERT_CALLBACK
+ * assert.callback
+ * (NULL)
+ * Callback to call on failed assertions
+ *
+ *
+ *
+ *
+ * @param mixed $value An optional new value for the option.
+ *
+ * The callback function set via ASSERT_CALLBACK or assert.callback should
+ * have the following signature:
+ *
+ * voidassert_callback
+ * stringfile
+ * intline
+ * stringassertion
+ * stringdescription
+ *
+ *
+ *
+ * file
+ *
+ *
+ * The file where assert has been called.
+ *
+ *
+ *
+ *
+ * line
+ *
+ *
+ * The line where assert has been called.
+ *
+ *
+ *
+ *
+ * assertion
+ *
+ *
+ * The assertion that has been passed to assert,
+ * converted to a string.
+ *
+ *
+ *
+ *
+ * description
+ *
+ *
+ * The description that has been passed to assert.
+ *
+ *
+ *
+ *
+ * @return mixed Returns the original setting of any options.
+ * @throws InfoException
+ *
+ */
+function assert_options(int $what, $value = null)
+{
+ error_clear_last();
+ if ($value !== null) {
+ $result = \assert_options($what, $value);
+ } else {
+ $result = \assert_options($what);
+ }
+ if ($result === false) {
+ throw InfoException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Sets the process title visible in tools such as top and
* ps. This function is available only in
* CLI mode.
@@ -25,14 +142,14 @@ function cli_set_process_title(string $title): void
/**
* Loads the PHP extension given by the parameter
- * library.
+ * extension_filename.
*
* Use extension_loaded to test whether a given
* extension is already available or not. This works on both built-in
* extensions and dynamically loaded ones (either through php.ini or
* dl).
*
- * @param string $library This parameter is only the filename of the
+ * @param string $extension_filename This parameter is only the filename of the
* extension to load which also depends on your platform. For example,
* the sockets extension (if compiled
* as a shared module, not the default!) would be called
@@ -77,10 +194,10 @@ function cli_set_process_title(string $title): void
* @throws InfoException
*
*/
-function dl(string $library): void
+function dl(string $extension_filename): void
{
error_clear_last();
- $result = \dl($library);
+ $result = \dl($extension_filename);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -88,6 +205,24 @@ function dl(string $library): void
/**
+ *
+ *
+ * @return string Returns the path, as a string.
+ * @throws InfoException
+ *
+ */
+function get_include_path(): string
+{
+ error_clear_last();
+ $result = \get_include_path();
+ if ($result === false) {
+ throw InfoException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Gets the time of the last modification of the main script of execution.
*
* If you're interested in getting the last modification time
@@ -185,23 +320,40 @@ function getmyuid(): int
/**
* Parses options passed to the script.
*
- * @param string $options
- * @param array $longopts
- * @param int|null $optind
- * @return array|array|array This function will return an array of option / argument pairs.
+ * @param string $short_options
+ * @param array $long_options
+ * @param int|null $rest_index
+ * @return \__benevolent This function will return an array of option / argument pairs.
* @throws InfoException
*
*/
-function getopt(string $options, array $longopts = null, ?int &$optind = null): array
+function getopt(string $short_options, array $long_options = [], ?int &$rest_index = null): array
{
error_clear_last();
- if ($optind !== null) {
- $result = \getopt($options, $longopts, $optind);
- } elseif ($longopts !== null) {
- $result = \getopt($options, $longopts);
- } else {
- $result = \getopt($options);
+ $result = \getopt($short_options, $long_options, $rest_index);
+ if ($result === false) {
+ throw InfoException::createFromPhpError();
}
+ return $result;
+}
+
+
+/**
+ * This is an interface to getrusage(2). It gets data returned
+ * from the system call.
+ *
+ * @param int $mode If mode is 1, getrusage will be called with
+ * RUSAGE_CHILDREN.
+ * @return array Returns an associative array containing the data returned from the system
+ * call. All entries are accessible by using their documented field names.
+ * Returns FALSE on failure.
+ * @throws InfoException
+ *
+ */
+function getrusage(int $mode = 0): array
+{
+ error_clear_last();
+ $result = \getrusage($mode);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -212,17 +364,17 @@ function getopt(string $options, array $longopts = null, ?int &$optind = null):
/**
* Returns the value of the configuration option on success.
*
- * @param string $varname The configuration option name.
+ * @param string $option The configuration option name.
* @return string Returns the value of the configuration option as a string on success, or an
* empty string for null values. Returns FALSE if the
* configuration option doesn't exist.
* @throws InfoException
*
*/
-function ini_get(string $varname): string
+function ini_get(string $option): string
{
error_clear_last();
- $result = \ini_get($varname);
+ $result = \ini_get($option);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -235,18 +387,45 @@ function ini_get(string $varname): string
* will keep this new value during the script's execution, and will be restored
* at the script's ending.
*
- * @param string $varname Not all the available options can be changed using
+ * @param string $option Not all the available options can be changed using
* ini_set. There is a list of all available options
* in the appendix.
- * @param string|int|float|bool $newvalue The new value for the option.
+ * @param string $value The new value for the option.
* @return string Returns the old value on success, FALSE on failure.
* @throws InfoException
*
*/
-function ini_set(string $varname, $newvalue): string
+function ini_set(string $option, string $value): string
+{
+ error_clear_last();
+ $result = \ini_set($option, $value);
+ if ($result === false) {
+ throw InfoException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ *
+ *
+ * @return string Returns the interface type, as a lowercase string.
+ *
+ * Although not exhaustive, the possible return values include
+ * apache,
+ * apache2handler,
+ * cgi (until PHP 5.3),
+ * cgi-fcgi, cli, cli-server,
+ * embed, fpm-fcgi,
+ * litespeed,
+ * phpdbg.
+ * @throws InfoException
+ *
+ */
+function php_sapi_name(): string
{
error_clear_last();
- $result = \ini_set($varname, $newvalue);
+ $result = \php_sapi_name();
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -259,8 +438,8 @@ function ini_set(string $varname, $newvalue): string
* modules, etc. It generates the appropriate HTML codes to insert
* the information in a page.
*
- * @param int $flag To generate a custom credits page, you may want to use the
- * flag parameter.
+ * @param int $flags To generate a custom credits page, you may want to use the
+ * flags parameter.
*
*
* Pre-defined phpcredits flags
@@ -323,10 +502,10 @@ function ini_set(string $varname, $newvalue): string
* @throws InfoException
*
*/
-function phpcredits(int $flag = CREDITS_ALL): void
+function phpcredits(int $flags = CREDITS_ALL): void
{
error_clear_last();
- $result = \phpcredits($flag);
+ $result = \phpcredits($flags);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -348,9 +527,9 @@ function phpcredits(int $flag = CREDITS_ALL): void
* phpinfo is also a valuable debugging tool as it
* contains all EGPCS (Environment, GET, POST, Cookie, Server) data.
*
- * @param int $what The output may be customized by passing one or more of the
+ * @param int $flags The output may be customized by passing one or more of the
* following constants bitwise values summed
- * together in the optional what parameter.
+ * together in the optional flags parameter.
* One can also combine the respective constants or bitwise values
* together with the bitwise or operator.
*
@@ -433,10 +612,10 @@ function phpcredits(int $flag = CREDITS_ALL): void
* @throws InfoException
*
*/
-function phpinfo(int $what = INFO_ALL): void
+function phpinfo(int $flags = INFO_ALL): void
{
error_clear_last();
- $result = \phpinfo($what);
+ $result = \phpinfo($flags);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -444,19 +623,19 @@ function phpinfo(int $what = INFO_ALL): void
/**
- * Adds setting to the server environment. The
+ * Adds assignment to the server environment. The
* environment variable will only exist for the duration of the current
* request. At the end of the request the environment is restored to its
* original state.
*
- * @param string $setting The setting, like "FOO=BAR"
+ * @param string $assignment The setting, like "FOO=BAR"
* @throws InfoException
*
*/
-function putenv(string $setting): void
+function putenv(string $assignment): void
{
error_clear_last();
- $result = \putenv($setting);
+ $result = \putenv($assignment);
if ($result === false) {
throw InfoException::createFromPhpError();
}
@@ -467,16 +646,16 @@ function putenv(string $setting): void
* Sets the include_path
* configuration option for the duration of the script.
*
- * @param string $new_include_path The new value for the include_path
+ * @param string $include_path The new value for the include_path
* @return string Returns the old include_path on
* success.
* @throws InfoException
*
*/
-function set_include_path(string $new_include_path): string
+function set_include_path(string $include_path): string
{
error_clear_last();
- $result = \set_include_path($new_include_path);
+ $result = \set_include_path($include_path);
if ($result === false) {
throw InfoException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/ingres-ii.php b/vendor/thecodingmachine/safe/generated/ingres-ii.php
deleted file mode 100644
index 9ea8b5f35..000000000
--- a/vendor/thecodingmachine/safe/generated/ingres-ii.php
+++ /dev/null
@@ -1,720 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\IngresiiException;
-
-/**
- * ingres_autocommit is called before opening a
- * transaction (before the first call to
- * ingres_query or just after a call to
- * ingres_rollback or
- * ingres_commit) to switch the
- * autocommit mode of the server on or off (when the script begins
- * the autocommit mode is off).
- *
- * When autocommit mode is on, every query is automatically
- * committed by the server, as if ingres_commit
- * was called after every call to ingres_query.
- * To see if autocommit is enabled use,
- * ingres_autocommit_state.
- *
- * By default Ingres will rollback any uncommitted transactions at the end of
- * a request. Use this function or ingres_commit to
- * ensure your data is committed to the database.
- *
- * @param resource $link The connection link identifier
- * @throws IngresiiException
- *
- */
-function ingres_autocommit($link): void
-{
- error_clear_last();
- $result = \ingres_autocommit($link);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_close closes the connection to
- * the Ingres server that is associated with the specified link.
- *
- * ingres_close is usually unnecessary, as it
- * will not close persistent connections and all non-persistent connections
- * are automatically closed at the end of the script.
- *
- * @param resource $link The connection link identifier
- * @throws IngresiiException
- *
- */
-function ingres_close($link): void
-{
- error_clear_last();
- $result = \ingres_close($link);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_commit commits the currently open
- * transaction, making all changes made to the database permanent.
- *
- * This closes the transaction. A new transaction can be opened by sending a
- * query with ingres_query.
- *
- * You can also have the server commit automatically after every
- * query by calling ingres_autocommit before
- * opening the transaction.
- *
- * By default Ingres will roll back any uncommitted transactions at the end of
- * a request. Use this function or ingres_autocommit to
- * ensure your that data is committed to the database.
- *
- * @param resource $link The connection link identifier
- * @throws IngresiiException
- *
- */
-function ingres_commit($link): void
-{
- error_clear_last();
- $result = \ingres_commit($link);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_connect opens a connection with the
- * given Ingres database.
- *
- * The connection is closed when the script ends or when
- * ingres_close is called on this link.
- *
- * @param string $database The database name. Must follow the syntax:
- *
- * [vnode::]dbname[/svr_class]
- * @param string $username The Ingres user name
- * @param string $password The password associated with username
- * @param array $options ingres_connect options
- *
- *
- *
- *
- * Option name
- * Option type
- * Description
- * Example
- *
- *
- *
- *
- * date_century_boundary
- * integer
- * The threshold by which a 2-digit year is determined to be in
- * the current century or in the next century. Equivalent to II_DATE_CENTURY_BOUNDARY.
- * 50
- *
- *
- * group
- * string
- * Specifies the group ID of the user, equivalent to the "-G"
- * flag
- * payroll
- *
- *
- * role
- * string
- * The role ID of the application. If a role password is
- * required, the parameter value should be specified as "role/password"
- *
- *
- * effective_user
- * string
- * The ingres user account being impersonated, equivalent to the "-u" flag
- * another_user
- *
- *
- * dbms_password
- * string
- * The internal database password for the user connecting to Ingres
- * s3cr3t
- *
- *
- * table_structure
- * string
- *
- * The default structure for new tables.
- * Valid values for table_structure are:
- *
- * INGRES_STRUCTURE_BTREE
- * INGRES_STRUCTURE_HASH
- * INGRES_STRUCTURE_HEAP
- * INGRES_STRUCTURE_ISAM
- * INGRES_STRUCTURE_CBTREE
- * INGRES_STRUCTURE_CISAM
- * INGRES_STRUCTURE_CHASH
- * INGRES_STRUCTURE_CHEAP
- *
- *
- *
- * INGRES_STRUCTURE_BTREE
- *
- *
- * index_structure
- * string
- *
- * The default structure for new secondary indexes. Valid values
- * for index_structure are:
- *
- * INGRES_STRUCTURE_CBTREE
- * INGRES_STRUCTURE_CISAM
- * INGRES_STRUCTURE_CHASH
- * INGRES_STRUCTURE_BTREE
- * INGRES_STRUCTURE_HASH
- * INGRES_STRUCTURE_ISAM
- *
- *
- *
- * INGRES_STRUCTURE_HASH
- *
- *
- * login_local
- * boolean
- * Determines how the connection user ID and password are
- * used when a VNODE is included in the target database string.
- * If set to TRUE, the user ID and password are used to locally access
- * the VNODE, and the VNODE login information is used to establish the DBMS
- * connection. If set to FALSE, the process user ID is used to access
- * the VNODE, and the connection user ID and password are used in place
- * of the VNODE login information to establish the DBMS connection.
- * This parameter is ignored if no VNODE is included in the target
- * database string. The default is FALSE.
- * TRUE
- *
- *
- * timezone
- * string
- * Controls the timezone of the session. If not set it will
- * default to the value defined by II_TIMEZONE_NAME. If
- * II_TIMEZONE_NAME is not defined, NA-PACIFIC (GMT-8 with Daylight
- * Savings) is used.
- *
- *
- * date_format
- * integer
- * Sets the allowable input and output format for Ingres dates.
- * Defaults to the value defined by II_DATE_FORMAT. If II_DATE_FORMAT is
- * not set the default date format is US, e.g. mm/dd/yy. Valid values
- * for date_format are:
- *
- * INGRES_DATE_DMY
- * INGRES_DATE_FINISH
- * INGRES_DATE_GERMAN
- * INGRES_DATE_ISO
- * INGRES_DATE_ISO4
- * INGRES_DATE_MDY
- * INGRES_DATE_MULTINATIONAL
- * INGRES_DATE_MULTINATIONAL4
- * INGRES_DATE_YMD
- * INGRES_DATE_US
- *
- *
- *
- * INGRES_DATE_MULTINATIONAL4
- *
- *
- * decimal_separator
- * string
- * The character identifier for decimal data
- * ","
- *
- *
- * money_lort
- * integer
- * Leading or trailing currency sign. Valid values for money_lort
- * are:
- *
- * INGRES_MONEY_LEADING
- * INGRES_MONEY_TRAILING
- *
- *
- *
- * INGRES_MONEY_TRAILING
- *
- *
- * money_sign
- * string
- * The currency symbol to be used with the MONEY datatype
- * €
- *
- *
- * money_precision
- * integer
- * The precision of the MONEY datatype
- * 3
- *
- *
- * float4_precision
- * integer
- * Precision of the FLOAT4 datatype
- * 10
- *
- *
- * float8_precision
- * integer
- * Precision of the FLOAT8 data
- * 10
- *
- *
- * blob_segment_length
- * integer
- * The amount of data in bytes to fetch at a time when retrieving
- * BLOB or CLOB data, defaults to 4096 bytes when not explicitly set
- * 8192
- *
- *
- *
- *
- *
- * The default structure for new tables.
- * Valid values for table_structure are:
- *
- * INGRES_STRUCTURE_BTREE
- * INGRES_STRUCTURE_HASH
- * INGRES_STRUCTURE_HEAP
- * INGRES_STRUCTURE_ISAM
- * INGRES_STRUCTURE_CBTREE
- * INGRES_STRUCTURE_CISAM
- * INGRES_STRUCTURE_CHASH
- * INGRES_STRUCTURE_CHEAP
- *
- *
- * The default structure for new secondary indexes. Valid values
- * for index_structure are:
- *
- * INGRES_STRUCTURE_CBTREE
- * INGRES_STRUCTURE_CISAM
- * INGRES_STRUCTURE_CHASH
- * INGRES_STRUCTURE_BTREE
- * INGRES_STRUCTURE_HASH
- * INGRES_STRUCTURE_ISAM
- *
- *
- * Sets the allowable input and output format for Ingres dates.
- * Defaults to the value defined by II_DATE_FORMAT. If II_DATE_FORMAT is
- * not set the default date format is US, e.g. mm/dd/yy. Valid values
- * for date_format are:
- *
- * INGRES_DATE_DMY
- * INGRES_DATE_FINISH
- * INGRES_DATE_GERMAN
- * INGRES_DATE_ISO
- * INGRES_DATE_ISO4
- * INGRES_DATE_MDY
- * INGRES_DATE_MULTINATIONAL
- * INGRES_DATE_MULTINATIONAL4
- * INGRES_DATE_YMD
- * INGRES_DATE_US
- *
- *
- * Leading or trailing currency sign. Valid values for money_lort
- * are:
- *
- * INGRES_MONEY_LEADING
- * INGRES_MONEY_TRAILING
- *
- * @return resource Returns a Ingres link resource on success
- * @throws IngresiiException
- *
- */
-function ingres_connect(string $database = null, string $username = null, string $password = null, array $options = null)
-{
- error_clear_last();
- if ($options !== null) {
- $result = \ingres_connect($database, $username, $password, $options);
- } elseif ($password !== null) {
- $result = \ingres_connect($database, $username, $password);
- } elseif ($username !== null) {
- $result = \ingres_connect($database, $username);
- } elseif ($database !== null) {
- $result = \ingres_connect($database);
- } else {
- $result = \ingres_connect();
- }
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Execute a query prepared using ingres_prepare.
- *
- * @param resource $result The result query identifier
- * @param array $params An array of parameter values to be used with the query
- * @param string $types A string containing a sequence of types for the parameter values
- * passed. See the types parameter in
- * ingres_query for the list of type codes.
- * @throws IngresiiException
- *
- */
-function ingres_execute($result, array $params = null, string $types = null): void
-{
- error_clear_last();
- if ($types !== null) {
- $result = \ingres_execute($result, $params, $types);
- } elseif ($params !== null) {
- $result = \ingres_execute($result, $params);
- } else {
- $result = \ingres_execute($result);
- }
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_field_name returns the name of a field
- * in a query result.
- *
- * @param resource $result The query result identifier
- * @param int $index index is the field whose name will be
- * retrieved.
- *
- * The possible values of index depend upon
- * the value
- * of ingres.array_index_start.
- * If ingres.array_index_start
- * is 1 (the default)
- * then index must be
- * between 1 and the value returned
- * by ingres_num_fields. If ingres.array_index_start
- * is 0 then index must
- * be between 0
- * and ingres_num_fields -
- * 1.
- * @return string Returns the name of a field
- * in a query result
- * @throws IngresiiException
- *
- */
-function ingres_field_name($result, int $index): string
-{
- error_clear_last();
- $result = \ingres_field_name($result, $index);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Get the type of a field in a query result.
- *
- * @param resource $result The query result identifier
- * @param int $index index is the field whose type will be
- * retrieved.
- *
- * The possible values of index depend upon
- * the value
- * of ingres.array_index_start.
- * If ingres.array_index_start
- * is 1 (the default)
- * then index must be
- * between 1 and the value returned
- * by ingres_num_fields. If ingres.array_index_start
- * is 0 then index must
- * be between 0
- * and ingres_num_fields -
- * 1.
- * @return string ingres_field_type returns the type of a
- * field in a query result. Examples of
- * types returned are IIAPI_BYTE_TYPE,
- * IIAPI_CHA_TYPE, IIAPI_DTE_TYPE,
- * IIAPI_FLT_TYPE, IIAPI_INT_TYPE,
- * IIAPI_VCH_TYPE. Some of these types can map to more
- * than one SQL type depending on the length of the field (see
- * ingres_field_length). For example
- * IIAPI_FLT_TYPE can be a float4 or a float8. For detailed
- * information, see the Ingres OpenAPI User Guide, Appendix
- * "Data Types" in the Ingres documentation.
- * @throws IngresiiException
- *
- */
-function ingres_field_type($result, int $index): string
-{
- error_clear_last();
- $result = \ingres_field_type($result, $index);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- *
- *
- * @param resource $result The query result identifier
- * @throws IngresiiException
- *
- */
-function ingres_free_result($result): void
-{
- error_clear_last();
- $result = \ingres_free_result($result);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * Open a persistent connection to an Ingres database.
- *
- * There are only two differences between this function and
- * ingres_connect: First, when connecting, the
- * function will initially try to find a (persistent) link that is
- * already opened with the same parameters. If one is found, an
- * identifier for it will be returned instead of opening a new
- * connection. Second, the connection to the Ingres server will not
- * be closed when the execution of the script ends. Instead, the
- * link will remain open for future use
- * (ingres_close will not close links
- * established by ingres_pconnect). This type
- * of link is therefore called "persistent".
- *
- * @param string $database The database name. Must follow the syntax:
- *
- * [vnode::]dbname[/svr_class]
- * @param string $username The Ingres user name
- * @param string $password The password associated with username
- * @param array $options See ingres_connect for the list of options that
- * can be passed
- * @return resource Returns an Ingres link resource on success
- * @throws IngresiiException
- *
- */
-function ingres_pconnect(string $database = null, string $username = null, string $password = null, array $options = null)
-{
- error_clear_last();
- if ($options !== null) {
- $result = \ingres_pconnect($database, $username, $password, $options);
- } elseif ($password !== null) {
- $result = \ingres_pconnect($database, $username, $password);
- } elseif ($username !== null) {
- $result = \ingres_pconnect($database, $username);
- } elseif ($database !== null) {
- $result = \ingres_pconnect($database);
- } else {
- $result = \ingres_pconnect();
- }
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * This function is used to position the cursor associated with the result
- * resource before issuing a fetch. If ingres.array_index_start
- * is set to 0 then the first row is 0 else it is 1.
- * ingres_result_seek can be used only with queries that
- * make use of scrollable
- * cursors. It cannot be used with
- * ingres_unbuffered_query.
- *
- * @param resource $result The result identifier for a query
- * @param int $position The row to position the cursor on. If ingres.array_index_start
- * is set to 0, then the first row is 0, else it is 1
- * @throws IngresiiException
- *
- */
-function ingres_result_seek($result, int $position): void
-{
- error_clear_last();
- $result = \ingres_result_seek($result, $position);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_rollback rolls back the currently
- * open transaction, actually cancelling all changes made to the
- * database during the transaction.
- *
- * This closes the transaction. A new transaction can be opened by sending a
- * query with ingres_query.
- *
- * @param resource $link The connection link identifier
- * @throws IngresiiException
- *
- */
-function ingres_rollback($link): void
-{
- error_clear_last();
- $result = \ingres_rollback($link);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
-
-
-/**
- * ingres_set_environment is called to set environmental
- * options that affect the output of certain values from Ingres, such as the
- * timezone, date format, decimal character separator, and float precision.
- *
- * @param resource $link The connection link identifier
- * @param array $options An enumerated array of option name/value pairs. The following table
- * lists the option name and the expected type
- *
- *
- *
- *
- *
- * Option name
- * Option type
- * Description
- * Example
- *
- *
- *
- *
- * date_century_boundary
- * integer
- * The threshold by which a 2-digit year is determined to be in
- * the current century or in the next century. Equivalent to II_DATE_CENTURY_BOUNDARY
- * 50
- *
- *
- * timezone
- * string
- * Controls the timezone of the session. If not set, it will
- * default the value defined by II_TIMEZONE_NAME. If
- * II_TIMEZONE_NAME is not defined, NA-PACIFIC (GMT-8 with Daylight
- * Savings) is used.
- * UNITED-KINGDOM
- *
- *
- * date_format
- * integer
- * Sets the allowable input and output format for Ingres dates.
- * Defaults to the value defined by II_DATE_FORMAT. If II_DATE_FORMAT is
- * not set, the default date format is US, for example mm/dd/yy. Valid values
- * for date_format are:
- *
- * INGRES_DATE_DMY
- * INGRES_DATE_FINISH
- * INGRES_DATE_GERMAN
- * INGRES_DATE_ISO
- * INGRES_DATE_ISO4
- * INGRES_DATE_MDY
- * INGRES_DATE_MULTINATIONAL
- * INGRES_DATE_MULTINATIONAL4
- * INGRES_DATE_YMD
- * INGRES_DATE_US
- *
- *
- *
- * INGRES_DATE_ISO4
- *
- *
- * decimal_separator
- * string
- * The character identifier for decimal data
- * ","
- *
- *
- * money_lort
- * integer
- * Leading or trailing currency sign. Valid values for money_lort
- * are:
- *
- * INGRES_MONEY_LEADING
- * INGRES_MONEY_TRAILING
- *
- *
- *
- * INGRES_MONEY_LEADING
- *
- *
- * money_sign
- * string
- * The currency symbol to be used with the MONEY datatype
- * €
- *
- *
- * money_precision
- * integer
- * The precision of the MONEY datatype
- * 2
- *
- *
- * float4_precision
- * integer
- * Precision of the FLOAT4 datatype
- * 10
- *
- *
- * float8_precision
- * integer
- * Precision of the FLOAT8 data
- * 10
- *
- *
- * blob_segment_length
- * integer
- * The amount of data in bytes to fetch at a time when retrieving
- * BLOB or CLOB data. Defaults to 4096 bytes when not set explicitly
- * 8192
- *
- *
- *
- *
- *
- * Sets the allowable input and output format for Ingres dates.
- * Defaults to the value defined by II_DATE_FORMAT. If II_DATE_FORMAT is
- * not set, the default date format is US, for example mm/dd/yy. Valid values
- * for date_format are:
- *
- * INGRES_DATE_DMY
- * INGRES_DATE_FINISH
- * INGRES_DATE_GERMAN
- * INGRES_DATE_ISO
- * INGRES_DATE_ISO4
- * INGRES_DATE_MDY
- * INGRES_DATE_MULTINATIONAL
- * INGRES_DATE_MULTINATIONAL4
- * INGRES_DATE_YMD
- * INGRES_DATE_US
- *
- *
- * Leading or trailing currency sign. Valid values for money_lort
- * are:
- *
- * INGRES_MONEY_LEADING
- * INGRES_MONEY_TRAILING
- *
- * @throws IngresiiException
- *
- */
-function ingres_set_environment($link, array $options): void
-{
- error_clear_last();
- $result = \ingres_set_environment($link, $options);
- if ($result === false) {
- throw IngresiiException::createFromPhpError();
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/json.php b/vendor/thecodingmachine/safe/generated/json.php
index dad455ccd..e524c6178 100644
--- a/vendor/thecodingmachine/safe/generated/json.php
+++ b/vendor/thecodingmachine/safe/generated/json.php
@@ -6,9 +6,14 @@ use Safe\Exceptions\JsonException;
/**
* Returns a string containing the JSON representation of the supplied
- * value.
+ * value. If the parameter is an array or object,
+ * it will be serialized recursively.
*
- * The encoding is affected by the supplied options
+ * If a value to be serialized is an object, then by default only publicly visible
+ * properties will be included. Alternatively, a class may implement JsonSerializable
+ * to control how its values are serialized to JSON.
+ *
+ * The encoding is affected by the supplied flags
* and additionally the encoding of float values depends on the value of
* serialize_precision.
*
@@ -19,7 +24,7 @@ use Safe\Exceptions\JsonException;
*
* PHP implements a superset of JSON as specified in the original
* RFC 7159.
- * @param int $options Bitmask consisting of
+ * @param int $flags Bitmask consisting of
* JSON_FORCE_OBJECT,
* JSON_HEX_QUOT,
* JSON_HEX_TAG,
@@ -42,30 +47,10 @@ use Safe\Exceptions\JsonException;
* @throws JsonException
*
*/
-function json_encode($value, int $options = 0, int $depth = 512): string
-{
- error_clear_last();
- $result = \json_encode($value, $options, $depth);
- if ($result === false) {
- throw JsonException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Returns the error string of the last json_encode or json_decode
- * call, which did not specify JSON_THROW_ON_ERROR.
- *
- * @return string Returns the error message on success, "No error" if no
- * error has occurred.
- * @throws JsonException
- *
- */
-function json_last_error_msg(): string
+function json_encode($value, int $flags = 0, int $depth = 512): string
{
error_clear_last();
- $result = \json_last_error_msg();
+ $result = \json_encode($value, $flags, $depth);
if ($result === false) {
throw JsonException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/ldap.php b/vendor/thecodingmachine/safe/generated/ldap.php
index 871f29580..0bfaaaf2b 100644
--- a/vendor/thecodingmachine/safe/generated/ldap.php
+++ b/vendor/thecodingmachine/safe/generated/ldap.php
@@ -5,20 +5,22 @@ namespace Safe;
use Safe\Exceptions\LdapException;
/**
- * Does the same thing as ldap_add but returns the LDAP result resource to be parsed with ldap_parse_result.
+ * Translate ISO-8859 characters to t61
+ * characters.
*
- * @param resource $link_identifier
- * @param string $dn
- * @param array $entry
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
+ * This function is useful if you have to talk to a legacy
+ * LDAPv2 server.
+ *
+ * @param string $value The text to be translated.
+ * @return string Return the t61 translation of
+ * value.
* @throws LdapException
*
*/
-function ldap_add_ext($link_identifier, string $dn, array $entry, array $serverctrls = null)
+function ldap_8859_to_t61(string $value): string
{
error_clear_last();
- $result = \ldap_add_ext($link_identifier, $dn, $entry, $serverctrls);
+ $result = \ldap_8859_to_t61($value);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -29,7 +31,7 @@ function ldap_add_ext($link_identifier, string $dn, array $entry, array $serverc
/**
* Add entries in the LDAP directory.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
* @param array $entry An array that specifies the information about the entry. The values in
* the entries are indexed by individual attributes.
@@ -41,55 +43,43 @@ function ldap_add_ext($link_identifier, string $dn, array $entry, array $serverc
* ]]>
*
*
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_add($link_identifier, string $dn, array $entry, array $serverctrls = null): void
+function ldap_add($ldap, string $dn, array $entry, array $controls = null): void
{
error_clear_last();
- $result = \ldap_add($link_identifier, $dn, $entry, $serverctrls);
- if ($result === false) {
- throw LdapException::createFromPhpError();
+ if ($controls !== null) {
+ $result = \ldap_add($ldap, $dn, $entry, $controls);
+ } else {
+ $result = \ldap_add($ldap, $dn, $entry);
}
-}
-
-
-/**
- * Does the same thing as ldap_bind but returns the LDAP result resource to be parsed with ldap_parse_result.
- *
- * @param resource $link_identifier
- * @param string|null $bind_rdn
- * @param string|null $bind_password
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
- * @throws LdapException
- *
- */
-function ldap_bind_ext($link_identifier, ?string $bind_rdn = null, ?string $bind_password = null, array $serverctrls = null)
-{
- error_clear_last();
- $result = \ldap_bind_ext($link_identifier, $bind_rdn, $bind_password, $serverctrls);
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
/**
* Binds to the LDAP directory with specified RDN and password.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param string|null $bind_rdn
- * @param string|null $bind_password
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param string|null $dn
+ * @param string|null $password
* @throws LdapException
*
*/
-function ldap_bind($link_identifier, ?string $bind_rdn = null, ?string $bind_password = null): void
+function ldap_bind($ldap, ?string $dn = null, ?string $password = null): void
{
error_clear_last();
- $result = \ldap_bind($link_identifier, $bind_rdn, $bind_password);
+ if ($password !== null) {
+ $result = \ldap_bind($ldap, $dn, $password);
+ } elseif ($dn !== null) {
+ $result = \ldap_bind($ldap, $dn);
+ } else {
+ $result = \ldap_bind($ldap);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -99,7 +89,7 @@ function ldap_bind($link_identifier, ?string $bind_rdn = null, ?string $bind_pas
/**
* Retrieve the pagination information send by the server.
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
+ * @param resource $link An LDAP resource, returned by ldap_connect.
* @param resource $result
* @param string|null $cookie An opaque structure sent by the server.
* @param int|null $estimated The estimated number of entries to retrieve.
@@ -119,7 +109,7 @@ function ldap_control_paged_result_response($link, $result, ?string &$cookie = n
/**
* Enable LDAP pagination by sending the pagination control (page size, cookie...).
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
+ * @param resource $link An LDAP resource, returned by ldap_connect.
* @param int $pagesize The number of entries by page.
* @param bool $iscritical Indicates whether the pagination is critical or not.
* If true and if the server doesn't support pagination, the search
@@ -143,16 +133,16 @@ function ldap_control_paged_result($link, int $pagesize, bool $iscritical = fals
* Returns the number of entries stored in the result of previous search
* operations.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_identifier The internal LDAP result.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
* @return int Returns number of entries in the result.
* @throws LdapException
*
*/
-function ldap_count_entries($link_identifier, $result_identifier): int
+function ldap_count_entries($ldap, $result): int
{
error_clear_last();
- $result = \ldap_count_entries($link_identifier, $result_identifier);
+ $result = \ldap_count_entries($ldap, $result);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -161,64 +151,67 @@ function ldap_count_entries($link_identifier, $result_identifier): int
/**
- * Does the same thing as ldap_delete but returns the LDAP result resource to be parsed with ldap_parse_result.
+ * Deletes a particular entry in LDAP directory.
*
- * @param resource $link_identifier
- * @param string $dn
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param string $dn The distinguished name of an LDAP entity.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_delete_ext($link_identifier, string $dn, array $serverctrls = null)
+function ldap_delete($ldap, string $dn, array $controls = null): void
{
error_clear_last();
- $result = \ldap_delete_ext($link_identifier, $dn, $serverctrls);
+ if ($controls !== null) {
+ $result = \ldap_delete($ldap, $dn, $controls);
+ } else {
+ $result = \ldap_delete($ldap, $dn);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
/**
- * Deletes a particular entry in LDAP directory.
+ * Turns the specified dn, into a more user-friendly
+ * form, stripping off type names.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @return string Returns the user friendly name.
* @throws LdapException
*
*/
-function ldap_delete($link_identifier, string $dn, array $serverctrls = null): void
+function ldap_dn2ufn(string $dn): string
{
error_clear_last();
- $result = \ldap_delete($link_identifier, $dn, $serverctrls);
+ $result = \ldap_dn2ufn($dn);
if ($result === false) {
throw LdapException::createFromPhpError();
}
+ return $result;
}
/**
* Performs a PASSWD extended operation.
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $user dn of the user to change the password of.
- * @param string $oldpw The old password of this user. May be ommited depending of server configuration.
- * @param string $newpw The new password for this user. May be omitted or empty to have a generated password.
- * @param array $serverctrls If provided, a password policy request control is send with the request and this is
+ * @param string $old_password The old password of this user. May be ommited depending of server configuration.
+ * @param string $new_password The new password for this user. May be omitted or empty to have a generated password.
+ * @param array $controls If provided, a password policy request control is send with the request and this is
* filled with an array of LDAP Controls
* returned with the request.
- * @return mixed Returns the generated password if newpw is empty or omitted.
+ * @return string|bool Returns the generated password if new_password is empty or omitted.
* Otherwise returns TRUE on success.
* @throws LdapException
*
*/
-function ldap_exop_passwd($link, string $user = "", string $oldpw = "", string $newpw = "", array &$serverctrls = null)
+function ldap_exop_passwd($ldap, string $user = "", string $old_password = "", string $new_password = "", array &$controls = null)
{
error_clear_last();
- $result = \ldap_exop_passwd($link, $user, $oldpw, $newpw, $serverctrls);
+ $result = \ldap_exop_passwd($ldap, $user, $old_password, $new_password, $controls);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -229,15 +222,15 @@ function ldap_exop_passwd($link, string $user = "", string $oldpw = "", string $
/**
* Performs a WHOAMI extended operation and returns the data.
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
- * @return string The data returned by the server.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @return string|bool The data returned by the server.
* @throws LdapException
*
*/
-function ldap_exop_whoami($link): string
+function ldap_exop_whoami($ldap)
{
error_clear_last();
- $result = \ldap_exop_whoami($link);
+ $result = \ldap_exop_whoami($ldap);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -246,27 +239,37 @@ function ldap_exop_whoami($link): string
/**
- * Performs an extended operation on the specified link with
- * reqoid the OID of the operation and
- * reqdata the data.
- *
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
- * @param string $reqoid The extended operation request OID. You may use one of LDAP_EXOP_START_TLS, LDAP_EXOP_MODIFY_PASSWD, LDAP_EXOP_REFRESH, LDAP_EXOP_WHO_AM_I, LDAP_EXOP_TURN, or a string with the OID of the operation you want to send.
- * @param string $reqdata The extended operation request data. May be NULL for some operations like LDAP_EXOP_WHO_AM_I, may also need to be BER encoded.
- * @param array|null $serverctrls Array of LDAP Controls to send with the request.
- * @param string|null $retdata Will be filled with the extended operation response data if provided.
+ * Performs an extended operation on the specified ldap with
+ * request_oid the OID of the operation and
+ * request_data the data.
+ *
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param string $request_oid The extended operation request OID. You may use one of LDAP_EXOP_START_TLS, LDAP_EXOP_MODIFY_PASSWD, LDAP_EXOP_REFRESH, LDAP_EXOP_WHO_AM_I, LDAP_EXOP_TURN, or a string with the OID of the operation you want to send.
+ * @param string $request_data The extended operation request data. May be NULL for some operations like LDAP_EXOP_WHO_AM_I, may also need to be BER encoded.
+ * @param array|null $controls Array of LDAP Controls to send with the request.
+ * @param string|null $response_data Will be filled with the extended operation response data if provided.
* If not provided you may use ldap_parse_exop on the result object
* later to get this data.
- * @param string|null $retoid Will be filled with the response OID if provided, usually equal to the request OID.
- * @return mixed When used with retdata, returns TRUE on success.
- * When used without retdata, returns a result identifier.
+ * @param string|null $response_oid Will be filled with the response OID if provided, usually equal to the request OID.
+ * @return resource|bool When used with response_data, returns TRUE on success.
+ * When used without response_data, returns a result identifier.
* @throws LdapException
*
*/
-function ldap_exop($link, string $reqoid, string $reqdata = null, ?array $serverctrls = null, ?string &$retdata = null, ?string &$retoid = null)
+function ldap_exop($ldap, string $request_oid, string $request_data = null, ?array $controls = null, ?string &$response_data = null, ?string &$response_oid = null)
{
error_clear_last();
- $result = \ldap_exop($link, $reqoid, $reqdata, $serverctrls, $retdata, $retoid);
+ if ($response_oid !== null) {
+ $result = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data, $response_oid);
+ } elseif ($response_data !== null) {
+ $result = \ldap_exop($ldap, $request_oid, $request_data, $controls, $response_data);
+ } elseif ($controls !== null) {
+ $result = \ldap_exop($ldap, $request_oid, $request_data, $controls);
+ } elseif ($request_data !== null) {
+ $result = \ldap_exop($ldap, $request_oid, $request_data);
+ } else {
+ $result = \ldap_exop($ldap, $request_oid);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -309,17 +312,17 @@ function ldap_explode_dn(string $dn, int $with_attrib): array
* Similar to reading entries, attributes are also read one by one from a
* particular entry.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @return string Returns the first attribute in the entry on success and FALSE on
* error.
* @throws LdapException
*
*/
-function ldap_first_attribute($link_identifier, $result_entry_identifier): string
+function ldap_first_attribute($ldap, $entry): string
{
error_clear_last();
- $result = \ldap_first_attribute($link_identifier, $result_entry_identifier);
+ $result = \ldap_first_attribute($ldap, $entry);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -336,17 +339,16 @@ function ldap_first_attribute($link_identifier, $result_entry_identifier): strin
* ldap_first_entry and
* ldap_next_entry functions.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_identifier
- * @return resource Returns the result entry identifier for the first entry on success and
- * FALSE on error.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
+ * @return resource Returns an LDAP\ResultEntry instance.
* @throws LdapException
*
*/
-function ldap_first_entry($link_identifier, $result_identifier)
+function ldap_first_entry($ldap, $result)
{
error_clear_last();
- $result = \ldap_first_entry($link_identifier, $result_identifier);
+ $result = \ldap_first_entry($ldap, $result);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -363,14 +365,14 @@ function ldap_first_entry($link_identifier, $result_identifier)
* return large result sets, ldap_free_result could be
* called to keep the runtime memory usage by the script low.
*
- * @param resource $result_identifier
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
* @throws LdapException
*
*/
-function ldap_free_result($result_identifier): void
+function ldap_free_result($result): void
{
error_clear_last();
- $result = \ldap_free_result($result_identifier);
+ $result = \ldap_free_result($result);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -392,17 +394,17 @@ function ldap_free_result($result_identifier): void
*
*
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @return array Returns a complete entry information in a multi-dimensional array
* on success and FALSE on error.
* @throws LdapException
*
*/
-function ldap_get_attributes($link_identifier, $result_entry_identifier): array
+function ldap_get_attributes($ldap, $entry): array
{
error_clear_last();
- $result = \ldap_get_attributes($link_identifier, $result_entry_identifier);
+ $result = \ldap_get_attributes($ldap, $entry);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -413,16 +415,16 @@ function ldap_get_attributes($link_identifier, $result_entry_identifier): array
/**
* Finds out the DN of an entry in the result.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @return string Returns the DN of the result entry and FALSE on error.
* @throws LdapException
*
*/
-function ldap_get_dn($link_identifier, $result_entry_identifier): string
+function ldap_get_dn($ldap, $entry): string
{
error_clear_last();
- $result = \ldap_get_dn($link_identifier, $result_entry_identifier);
+ $result = \ldap_get_dn($ldap, $entry);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -434,10 +436,10 @@ function ldap_get_dn($link_identifier, $result_entry_identifier): string
* Reads multiple entries from the given result, and then reading the
* attributes and multiple values.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
* @return array Returns a complete result information in a multi-dimensional array on
- * success and FALSE on error.
+ * success.
*
* The structure of the array is as follows.
* The attribute index is converted to lowercase. (Attributes are
@@ -451,10 +453,10 @@ function ldap_get_dn($link_identifier, $result_entry_identifier): string
* @throws LdapException
*
*/
-function ldap_get_entries($link_identifier, $result_identifier): array
+function ldap_get_entries($ldap, $result): array
{
error_clear_last();
- $result = \ldap_get_entries($link_identifier, $result_identifier);
+ $result = \ldap_get_entries($ldap, $result);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -463,9 +465,9 @@ function ldap_get_entries($link_identifier, $result_identifier): array
/**
- * Sets retval to the value of the specified option.
+ * Sets value to the value of the specified option.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param int $option The parameter option can be one of:
*
*
@@ -479,47 +481,47 @@ function ldap_get_entries($link_identifier, $result_identifier): array
*
*
* LDAP_OPT_DEREF
- * integer
+ * int
*
*
*
* LDAP_OPT_SIZELIMIT
- * integer
+ * int
*
*
*
* LDAP_OPT_TIMELIMIT
- * integer
+ * int
*
*
*
* LDAP_OPT_NETWORK_TIMEOUT
- * integer
+ * int
*
*
*
* LDAP_OPT_PROTOCOL_VERSION
- * integer
+ * int
*
*
*
* LDAP_OPT_ERROR_NUMBER
- * integer
+ * int
*
*
*
* LDAP_OPT_DIAGNOSTIC_MESSAGE
- * integer
+ * int
*
*
*
* LDAP_OPT_REFERRALS
- * bool
+ * int
*
*
*
* LDAP_OPT_RESTART
- * bool
+ * int
*
*
*
@@ -584,22 +586,22 @@ function ldap_get_entries($link_identifier, $result_identifier): array
*
*
* LDAP_OPT_X_TLS_CRLCHECK
- * integer
+ * int
* 7.1
*
*
* LDAP_OPT_X_TLS_CRL_NONE
- * integer
+ * int
* 7.1
*
*
* LDAP_OPT_X_TLS_CRL_PEER
- * integer
+ * int
* 7.1
*
*
* LDAP_OPT_X_TLS_CRL_ALL
- * integer
+ * int
* 7.1
*
*
@@ -613,7 +615,7 @@ function ldap_get_entries($link_identifier, $result_identifier): array
* 7.1
*
*
- * LDAP_OPT_X_TLS_KEYILE
+ * LDAP_OPT_X_TLS_KEYFILE
* string
* 7.1
*
@@ -624,7 +626,7 @@ function ldap_get_entries($link_identifier, $result_identifier): array
*
*
* LDAP_OPT_X_TLS_PROTOCOL_MIN
- * integer
+ * int
* 7.1
*
*
@@ -634,20 +636,20 @@ function ldap_get_entries($link_identifier, $result_identifier): array
*
*
* LDAP_OPT_X_TLS_REQUIRE_CERT
- * integer
+ * int
*
*
*
*
*
- * @param mixed $retval This will be set to the option value.
+ * @param mixed $value This will be set to the option value.
* @throws LdapException
*
*/
-function ldap_get_option($link_identifier, int $option, &$retval): void
+function ldap_get_option($ldap, int $option, &$value = null): void
{
error_clear_last();
- $result = \ldap_get_option($link_identifier, $option, $retval);
+ $result = \ldap_get_option($ldap, $option, $value);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -660,8 +662,8 @@ function ldap_get_option($link_identifier, int $option, &$retval): void
* This function is used exactly like ldap_get_values
* except that it handles binary data and not string data.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @param string $attribute
* @return array Returns an array of values for the attribute on success and FALSE on
* error. Individual values are accessed by integer index in the array. The
@@ -670,10 +672,10 @@ function ldap_get_option($link_identifier, int $option, &$retval): void
* @throws LdapException
*
*/
-function ldap_get_values_len($link_identifier, $result_entry_identifier, string $attribute): array
+function ldap_get_values_len($ldap, $entry, string $attribute): array
{
error_clear_last();
- $result = \ldap_get_values_len($link_identifier, $result_entry_identifier, $attribute);
+ $result = \ldap_get_values_len($ldap, $entry, $attribute);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -684,7 +686,7 @@ function ldap_get_values_len($link_identifier, $result_entry_identifier, string
/**
* Reads all the values of the attribute in the entry in the result.
*
- * This call needs a result_entry_identifier,
+ * This call needs a entry,
* so needs to be preceded by one of the ldap search calls and one
* of the calls to get an individual entry.
*
@@ -693,8 +695,8 @@ function ldap_get_values_len($link_identifier, $result_entry_identifier, string
* the ldap_get_attributes call to work out
* what attributes exist for a given entry.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @param string $attribute
* @return array Returns an array of values for the attribute on success and FALSE on
* error. The number of values can be found by indexing "count" in the
@@ -714,130 +716,10 @@ function ldap_get_values_len($link_identifier, $result_entry_identifier, string
* @throws LdapException
*
*/
-function ldap_get_values($link_identifier, $result_entry_identifier, string $attribute): array
+function ldap_get_values($ldap, $entry, string $attribute): array
{
error_clear_last();
- $result = \ldap_get_values($link_identifier, $result_entry_identifier, $attribute);
- if ($result === false) {
- throw LdapException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Performs the search for a specified filter on the
- * directory with the scope LDAP_SCOPE_ONELEVEL.
- *
- * LDAP_SCOPE_ONELEVEL means that the search should only
- * return information that is at the level immediately below the
- * base_dn given in the call.
- * (Equivalent to typing "ls" and getting a list of files and folders in the
- * current working directory.)
- *
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param string $base_dn The base DN for the directory.
- * @param string $filter
- * @param array $attributes An array of the required attributes, e.g. array("mail", "sn", "cn").
- * Note that the "dn" is always returned irrespective of which attributes
- * types are requested.
- *
- * Using this parameter is much more efficient than the default action
- * (which is to return all attributes and their associated values).
- * The use of this parameter should therefore be considered good
- * practice.
- * @param int $attrsonly Should be set to 1 if only attribute types are wanted. If set to 0
- * both attributes types and attribute values are fetched which is the
- * default behaviour.
- * @param int $sizelimit Enables you to limit the count of entries fetched. Setting this to 0
- * means no limit.
- *
- * This parameter can NOT override server-side preset sizelimit. You can
- * set it lower though.
- *
- * Some directory server hosts will be configured to return no more than
- * a preset number of entries. If this occurs, the server will indicate
- * that it has only returned a partial results set. This also occurs if
- * you use this parameter to limit the count of fetched entries.
- * @param int $timelimit Sets the number of seconds how long is spend on the search. Setting
- * this to 0 means no limit.
- *
- * This parameter can NOT override server-side preset timelimit. You can
- * set it lower though.
- * @param int $deref Specifies how aliases should be handled during the search. It can be
- * one of the following:
- *
- *
- *
- * LDAP_DEREF_NEVER - (default) aliases are never
- * dereferenced.
- *
- *
- *
- *
- * LDAP_DEREF_SEARCHING - aliases should be
- * dereferenced during the search but not when locating the base object
- * of the search.
- *
- *
- *
- *
- * LDAP_DEREF_FINDING - aliases should be
- * dereferenced when locating the base object but not during the search.
- *
- *
- *
- *
- * LDAP_DEREF_ALWAYS - aliases should be dereferenced
- * always.
- *
- *
- *
- * @param array $serverctrls Array of LDAP Controls to send with the request.
- * @return resource Returns a search result identifier.
- * @throws LdapException
- *
- */
-function ldap_list($link_identifier, string $base_dn, string $filter, array $attributes = null, int $attrsonly = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, array $serverctrls = null)
-{
- error_clear_last();
- if ($serverctrls !== null) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref, $serverctrls);
- } elseif ($deref !== LDAP_DEREF_NEVER) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref);
- } elseif ($timelimit !== -1) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit);
- } elseif ($sizelimit !== -1) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit);
- } elseif ($attrsonly !== 0) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes, $attrsonly);
- } elseif ($attributes !== null) {
- $result = \ldap_list($link_identifier, $base_dn, $filter, $attributes);
- } else {
- $result = \ldap_list($link_identifier, $base_dn, $filter);
- }
- if ($result === false) {
- throw LdapException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Does the same thing as ldap_mod_add but returns the LDAP result resource to be parsed with ldap_parse_result.
- *
- * @param resource $link_identifier
- * @param string $dn
- * @param array $entry
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
- * @throws LdapException
- *
- */
-function ldap_mod_add_ext($link_identifier, string $dn, array $entry, array $serverctrls = null)
-{
- error_clear_last();
- $result = \ldap_mod_add_ext($link_identifier, $dn, $entry, $serverctrls);
+ $result = \ldap_get_values($ldap, $entry, $attribute);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -849,42 +731,24 @@ function ldap_mod_add_ext($link_identifier, string $dn, array $entry, array $ser
* Adds one or more attribute values to the specified dn.
* To add a whole new object see ldap_add function.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
* @param array $entry An associative array listing the attirbute values to add. If an attribute was not existing yet it will be added. If an attribute is existing you can only add values to it if it supports multiple values.
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_mod_add($link_identifier, string $dn, array $entry, array $serverctrls = null): void
+function ldap_mod_add($ldap, string $dn, array $entry, array $controls = null): void
{
error_clear_last();
- $result = \ldap_mod_add($link_identifier, $dn, $entry, $serverctrls);
- if ($result === false) {
- throw LdapException::createFromPhpError();
+ if ($controls !== null) {
+ $result = \ldap_mod_add($ldap, $dn, $entry, $controls);
+ } else {
+ $result = \ldap_mod_add($ldap, $dn, $entry);
}
-}
-
-
-/**
- * Does the same thing as ldap_mod_del but returns the LDAP result resource to be parsed with ldap_parse_result.
- *
- * @param resource $link_identifier
- * @param string $dn
- * @param array $entry
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
- * @throws LdapException
- *
- */
-function ldap_mod_del_ext($link_identifier, string $dn, array $entry, array $serverctrls = null)
-{
- error_clear_last();
- $result = \ldap_mod_del_ext($link_identifier, $dn, $entry, $serverctrls);
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
@@ -893,42 +757,24 @@ function ldap_mod_del_ext($link_identifier, string $dn, array $entry, array $ser
* Object deletions are done by the
* ldap_delete function.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
* @param array $entry
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_mod_del($link_identifier, string $dn, array $entry, array $serverctrls = null): void
+function ldap_mod_del($ldap, string $dn, array $entry, array $controls = null): void
{
error_clear_last();
- $result = \ldap_mod_del($link_identifier, $dn, $entry, $serverctrls);
- if ($result === false) {
- throw LdapException::createFromPhpError();
+ if ($controls !== null) {
+ $result = \ldap_mod_del($ldap, $dn, $entry, $controls);
+ } else {
+ $result = \ldap_mod_del($ldap, $dn, $entry);
}
-}
-
-
-/**
- * Does the same thing as ldap_mod_replace but returns the LDAP result resource to be parsed with ldap_parse_result.
- *
- * @param resource $link_identifier
- * @param string $dn
- * @param array $entry
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
- * @throws LdapException
- *
- */
-function ldap_mod_replace_ext($link_identifier, string $dn, array $entry, array $serverctrls = null)
-{
- error_clear_last();
- $result = \ldap_mod_replace_ext($link_identifier, $dn, $entry, $serverctrls);
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
@@ -936,17 +782,21 @@ function ldap_mod_replace_ext($link_identifier, string $dn, array $entry, array
* Replaces one or more attributes from the specified dn.
* It may also add or remove attributes.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
* @param array $entry An associative array listing the attributes to replace. Sending an empty array as value will remove the attribute, while sending an attribute not existing yet on this entry will add it.
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_mod_replace($link_identifier, string $dn, array $entry, array $serverctrls = null): void
+function ldap_mod_replace($ldap, string $dn, array $entry, array $controls = null): void
{
error_clear_last();
- $result = \ldap_mod_replace($link_identifier, $dn, $entry, $serverctrls);
+ if ($controls !== null) {
+ $result = \ldap_mod_replace($ldap, $dn, $entry, $controls);
+ } else {
+ $result = \ldap_mod_replace($ldap, $dn, $entry);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -957,9 +807,9 @@ function ldap_mod_replace($link_identifier, string $dn, array $entry, array $ser
* Modifies an existing entry in the LDAP directory. Allows detailed
* specification of the modifications to perform.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP resource, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
- * @param array $entry An array that specifies the modifications to make. Each entry in this
+ * @param array $modifications_info An array that specifies the modifications to make. Each entry in this
* array is an associative array with two or three keys:
* attrib maps to the name of the attribute to modify,
* modtype maps to the type of modification to perform,
@@ -1032,16 +882,20 @@ function ldap_mod_replace($link_identifier, string $dn, array $entry, array $ser
* value for values must be an array of strings, and
* any value for modtype must be one of the
* LDAP_MODIFY_BATCH_* constants listed above.
- * @param array $serverctrls Each value specified through values is added (as
+ * @param array $controls Each value specified through values is added (as
* an additional value) to the attribute named by
* attrib.
* @throws LdapException
*
*/
-function ldap_modify_batch($link_identifier, string $dn, array $entry, array $serverctrls = null): void
+function ldap_modify_batch($ldap, string $dn, array $modifications_info, array $controls = null): void
{
error_clear_last();
- $result = \ldap_modify_batch($link_identifier, $dn, $entry, $serverctrls);
+ if ($controls !== null) {
+ $result = \ldap_modify_batch($ldap, $dn, $modifications_info, $controls);
+ } else {
+ $result = \ldap_modify_batch($ldap, $dn, $modifications_info);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -1051,20 +905,20 @@ function ldap_modify_batch($link_identifier, string $dn, array $entry, array $se
/**
* Retrieves the attributes in an entry. The first call to
* ldap_next_attribute is made with the
- * result_entry_identifier returned from
+ * entry returned from
* ldap_first_attribute.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param resource $result_entry_identifier
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $entry An LDAP\ResultEntry instance.
* @return string Returns the next attribute in an entry on success and FALSE on
* error.
* @throws LdapException
*
*/
-function ldap_next_attribute($link_identifier, $result_entry_identifier): string
+function ldap_next_attribute($ldap, $entry): string
{
error_clear_last();
- $result = \ldap_next_attribute($link_identifier, $result_entry_identifier);
+ $result = \ldap_next_attribute($ldap, $entry);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -1075,17 +929,17 @@ function ldap_next_attribute($link_identifier, $result_entry_identifier): string
/**
* Parse LDAP extended operation data from result object result
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
- * @param resource $result An LDAP result resource, returned by ldap_exop.
- * @param string|null $retdata Will be filled by the response data.
- * @param string|null $retoid Will be filled by the response OID.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
+ * @param string|null $response_data Will be filled by the response data.
+ * @param string|null $response_oid Will be filled by the response OID.
* @throws LdapException
*
*/
-function ldap_parse_exop($link, $result, ?string &$retdata = null, ?string &$retoid = null): void
+function ldap_parse_exop($ldap, $result, ?string &$response_data = null, ?string &$response_oid = null): void
{
error_clear_last();
- $result = \ldap_parse_exop($link, $result, $retdata, $retoid);
+ $result = \ldap_parse_exop($ldap, $result, $response_data, $response_oid);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -1095,170 +949,52 @@ function ldap_parse_exop($link, $result, ?string &$retdata = null, ?string &$ret
/**
* Parses an LDAP search result.
*
- * @param resource $link An LDAP link identifier, returned by ldap_connect.
- * @param resource $result An LDAP result resource, returned by ldap_list or
- * ldap_search.
- * @param int|null $errcode A reference to a variable that will be set to the LDAP error code in
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
+ * @param resource $result An LDAP\Result instance, returned by ldap_list or ldap_search.
+ * @param int|null $error_code A reference to a variable that will be set to the LDAP error code in
* the result, or 0 if no error occurred.
- * @param string|null $matcheddn A reference to a variable that will be set to a matched DN if one was
+ * @param string|null $matched_dn A reference to a variable that will be set to a matched DN if one was
* recognised within the request, otherwise it will be set to NULL.
- * @param string|null $errmsg A reference to a variable that will be set to the LDAP error message in
+ * @param string|null $error_message A reference to a variable that will be set to the LDAP error message in
* the result, or an empty string if no error occurred.
* @param array|null $referrals A reference to a variable that will be set to an array set
* to all of the referral strings in the result, or an empty array if no
* referrals were returned.
- * @param array|null $serverctrls An array of LDAP Controls which have been sent with the response.
- * @throws LdapException
- *
- */
-function ldap_parse_result($link, $result, ?int &$errcode, ?string &$matcheddn = null, ?string &$errmsg = null, ?array &$referrals = null, ?array &$serverctrls = null): void
-{
- error_clear_last();
- $result = \ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $serverctrls);
- if ($result === false) {
- throw LdapException::createFromPhpError();
- }
-}
-
-
-/**
- * Performs the search for a specified filter on the
- * directory with the scope LDAP_SCOPE_BASE. So it is
- * equivalent to reading an entry from the directory.
- *
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param string $base_dn The base DN for the directory.
- * @param string $filter An empty filter is not allowed. If you want to retrieve absolutely all
- * information for this entry, use a filter of
- * objectClass=*. If you know which entry types are
- * used on the directory server, you might use an appropriate filter such
- * as objectClass=inetOrgPerson.
- * @param array $attributes An array of the required attributes, e.g. array("mail", "sn", "cn").
- * Note that the "dn" is always returned irrespective of which attributes
- * types are requested.
- *
- * Using this parameter is much more efficient than the default action
- * (which is to return all attributes and their associated values).
- * The use of this parameter should therefore be considered good
- * practice.
- * @param int $attrsonly Should be set to 1 if only attribute types are wanted. If set to 0
- * both attributes types and attribute values are fetched which is the
- * default behaviour.
- * @param int $sizelimit Enables you to limit the count of entries fetched. Setting this to 0
- * means no limit.
- *
- * This parameter can NOT override server-side preset sizelimit. You can
- * set it lower though.
- *
- * Some directory server hosts will be configured to return no more than
- * a preset number of entries. If this occurs, the server will indicate
- * that it has only returned a partial results set. This also occurs if
- * you use this parameter to limit the count of fetched entries.
- * @param int $timelimit Sets the number of seconds how long is spend on the search. Setting
- * this to 0 means no limit.
- *
- * This parameter can NOT override server-side preset timelimit. You can
- * set it lower though.
- * @param int $deref Specifies how aliases should be handled during the search. It can be
- * one of the following:
- *
- *
- *
- * LDAP_DEREF_NEVER - (default) aliases are never
- * dereferenced.
- *
- *
- *
- *
- * LDAP_DEREF_SEARCHING - aliases should be
- * dereferenced during the search but not when locating the base object
- * of the search.
- *
- *
- *
- *
- * LDAP_DEREF_FINDING - aliases should be
- * dereferenced when locating the base object but not during the search.
- *
- *
- *
- *
- * LDAP_DEREF_ALWAYS - aliases should be dereferenced
- * always.
- *
- *
- *
- * @param array $serverctrls Array of LDAP Controls to send with the request.
- * @return resource Returns a search result identifier.
- * @throws LdapException
- *
- */
-function ldap_read($link_identifier, string $base_dn, string $filter, array $attributes = null, int $attrsonly = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, array $serverctrls = null)
-{
- error_clear_last();
- if ($serverctrls !== null) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref, $serverctrls);
- } elseif ($deref !== LDAP_DEREF_NEVER) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref);
- } elseif ($timelimit !== -1) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit);
- } elseif ($sizelimit !== -1) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit);
- } elseif ($attrsonly !== 0) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes, $attrsonly);
- } elseif ($attributes !== null) {
- $result = \ldap_read($link_identifier, $base_dn, $filter, $attributes);
- } else {
- $result = \ldap_read($link_identifier, $base_dn, $filter);
- }
- if ($result === false) {
- throw LdapException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Does the same thing as ldap_rename but returns the LDAP result resource to be parsed with ldap_parse_result.
- *
- * @param resource $link_identifier
- * @param string $dn
- * @param string $newrdn
- * @param string $newparent
- * @param bool $deleteoldrdn
- * @param array $serverctrls
- * @return resource Returns an LDAP result identifier.
+ * @param array|null $controls An array of LDAP Controls which have been sent with the response.
* @throws LdapException
*
*/
-function ldap_rename_ext($link_identifier, string $dn, string $newrdn, string $newparent, bool $deleteoldrdn, array $serverctrls = null)
+function ldap_parse_result($ldap, $result, ?int &$error_code, ?string &$matched_dn = null, ?string &$error_message = null, ?array &$referrals = null, ?array &$controls = null): void
{
error_clear_last();
- $result = \ldap_rename_ext($link_identifier, $dn, $newrdn, $newparent, $deleteoldrdn, $serverctrls);
+ $result = \ldap_parse_result($ldap, $result, $error_code, $matched_dn, $error_message, $referrals, $controls);
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
/**
* The entry specified by dn is renamed/moved.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param string $dn The distinguished name of an LDAP entity.
- * @param string $newrdn The new RDN.
- * @param string $newparent The new parent/superior entry.
- * @param bool $deleteoldrdn If TRUE the old RDN value(s) is removed, else the old RDN value(s)
+ * @param string $new_rdn The new RDN.
+ * @param string $new_parent The new parent/superior entry.
+ * @param bool $delete_old_rdn If TRUE the old RDN value(s) is removed, else the old RDN value(s)
* is retained as non-distinguished values of the entry.
- * @param array $serverctrls Array of LDAP Controls to send with the request.
+ * @param array $controls Array of LDAP Controls to send with the request.
* @throws LdapException
*
*/
-function ldap_rename($link_identifier, string $dn, string $newrdn, string $newparent, bool $deleteoldrdn, array $serverctrls = null): void
+function ldap_rename($ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, array $controls = null): void
{
error_clear_last();
- $result = \ldap_rename($link_identifier, $dn, $newrdn, $newparent, $deleteoldrdn, $serverctrls);
+ if ($controls !== null) {
+ $result = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn, $controls);
+ } else {
+ $result = \ldap_rename($ldap, $dn, $new_rdn, $new_parent, $delete_old_rdn);
+ }
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -1268,142 +1004,47 @@ function ldap_rename($link_identifier, string $dn, string $newrdn, string $newpa
/**
*
*
- * @param resource $link
- * @param string $binddn
+ * @param resource $ldap
+ * @param string $dn
* @param string $password
- * @param string $sasl_mech
- * @param string $sasl_realm
- * @param string $sasl_authc_id
- * @param string $sasl_authz_id
+ * @param string $mech
+ * @param string $realm
+ * @param string $authc_id
+ * @param string $authz_id
* @param string $props
* @throws LdapException
*
*/
-function ldap_sasl_bind($link, string $binddn = null, string $password = null, string $sasl_mech = null, string $sasl_realm = null, string $sasl_authc_id = null, string $sasl_authz_id = null, string $props = null): void
-{
- error_clear_last();
- $result = \ldap_sasl_bind($link, $binddn, $password, $sasl_mech, $sasl_realm, $sasl_authc_id, $sasl_authz_id, $props);
- if ($result === false) {
- throw LdapException::createFromPhpError();
- }
-}
-
-
-/**
- * Performs the search for a specified filter on the directory with the scope
- * of LDAP_SCOPE_SUBTREE. This is equivalent to searching
- * the entire directory.
- *
- * From 4.0.5 on it's also possible to do parallel searches. To do this
- * you use an array of link identifiers, rather than a single identifier,
- * as the first argument. If you don't want the same base DN and the
- * same filter for all the searches, you can also use an array of base DNs
- * and/or an array of filters. Those arrays must be of the same size as
- * the link identifier array since the first entries of the arrays are
- * used for one search, the second entries are used for another, and so
- * on. When doing parallel searches an array of search result
- * identifiers is returned, except in case of error, then the entry
- * corresponding to the search will be FALSE. This is very much like
- * the value normally returned, except that a result identifier is always
- * returned when a search was made. There are some rare cases where the
- * normal search returns FALSE while the parallel search returns an
- * identifier.
- *
- * @param resource|array $link_identifier An LDAP link identifier, returned by ldap_connect.
- * @param string $base_dn The base DN for the directory.
- * @param string $filter The search filter can be simple or advanced, using boolean operators in
- * the format described in the LDAP documentation (see the Netscape Directory SDK or
- * RFC4515 for full
- * information on filters).
- * @param array $attributes An array of the required attributes, e.g. array("mail", "sn", "cn").
- * Note that the "dn" is always returned irrespective of which attributes
- * types are requested.
- *
- * Using this parameter is much more efficient than the default action
- * (which is to return all attributes and their associated values).
- * The use of this parameter should therefore be considered good
- * practice.
- * @param int $attrsonly Should be set to 1 if only attribute types are wanted. If set to 0
- * both attributes types and attribute values are fetched which is the
- * default behaviour.
- * @param int $sizelimit Enables you to limit the count of entries fetched. Setting this to 0
- * means no limit.
- *
- * This parameter can NOT override server-side preset sizelimit. You can
- * set it lower though.
- *
- * Some directory server hosts will be configured to return no more than
- * a preset number of entries. If this occurs, the server will indicate
- * that it has only returned a partial results set. This also occurs if
- * you use this parameter to limit the count of fetched entries.
- * @param int $timelimit Sets the number of seconds how long is spend on the search. Setting
- * this to 0 means no limit.
- *
- * This parameter can NOT override server-side preset timelimit. You can
- * set it lower though.
- * @param int $deref Specifies how aliases should be handled during the search. It can be
- * one of the following:
- *
- *
- *
- * LDAP_DEREF_NEVER - (default) aliases are never
- * dereferenced.
- *
- *
- *
- *
- * LDAP_DEREF_SEARCHING - aliases should be
- * dereferenced during the search but not when locating the base object
- * of the search.
- *
- *
- *
- *
- * LDAP_DEREF_FINDING - aliases should be
- * dereferenced when locating the base object but not during the search.
- *
- *
- *
- *
- * LDAP_DEREF_ALWAYS - aliases should be dereferenced
- * always.
- *
- *
- *
- * @param array $serverctrls Array of LDAP Controls to send with the request.
- * @return resource Returns a search result identifier.
- * @throws LdapException
- *
- */
-function ldap_search($link_identifier, string $base_dn, string $filter, array $attributes = null, int $attrsonly = 0, int $sizelimit = -1, int $timelimit = -1, int $deref = LDAP_DEREF_NEVER, array $serverctrls = null)
+function ldap_sasl_bind($ldap, string $dn = null, string $password = null, string $mech = null, string $realm = null, string $authc_id = null, string $authz_id = null, string $props = null): void
{
error_clear_last();
- if ($serverctrls !== null) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref, $serverctrls);
- } elseif ($deref !== LDAP_DEREF_NEVER) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit, $deref);
- } elseif ($timelimit !== -1) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit, $timelimit);
- } elseif ($sizelimit !== -1) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes, $attrsonly, $sizelimit);
- } elseif ($attrsonly !== 0) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes, $attrsonly);
- } elseif ($attributes !== null) {
- $result = \ldap_search($link_identifier, $base_dn, $filter, $attributes);
+ if ($props !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id, $props);
+ } elseif ($authz_id !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id, $authz_id);
+ } elseif ($authc_id !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm, $authc_id);
+ } elseif ($realm !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password, $mech, $realm);
+ } elseif ($mech !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password, $mech);
+ } elseif ($password !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn, $password);
+ } elseif ($dn !== null) {
+ $result = \ldap_sasl_bind($ldap, $dn);
} else {
- $result = \ldap_search($link_identifier, $base_dn, $filter);
+ $result = \ldap_sasl_bind($ldap);
}
if ($result === false) {
throw LdapException::createFromPhpError();
}
- return $result;
}
/**
- * Sets the value of the specified option to be newval.
+ * Sets the value of the specified option to be value.
*
- * @param resource|null $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource|null $ldap An LDAP\Connection instance, returned by ldap_connect.
* @param int $option The parameter option can be one of:
*
*
@@ -1417,32 +1058,32 @@ function ldap_search($link_identifier, string $base_dn, string $filter, array $a
*
*
* LDAP_OPT_DEREF
- * integer
+ * int
*
*
*
* LDAP_OPT_SIZELIMIT
- * integer
+ * int
*
*
*
* LDAP_OPT_TIMELIMIT
- * integer
+ * int
*
*
*
* LDAP_OPT_NETWORK_TIMEOUT
- * integer
- * PHP 5.3.0
+ * int
+ *
*
*
* LDAP_OPT_PROTOCOL_VERSION
- * integer
+ * int
*
*
*
* LDAP_OPT_ERROR_NUMBER
- * integer
+ * int
*
*
*
@@ -1522,7 +1163,7 @@ function ldap_search($link_identifier, string $base_dn, string $filter, array $a
*
*
* LDAP_OPT_X_TLS_CRLCHECK
- * integer
+ * int
* PHP 7.1.0
*
*
@@ -1542,7 +1183,7 @@ function ldap_search($link_identifier, string $base_dn, string $filter, array $a
*
*
* LDAP_OPT_X_TLS_PROTOCOL_MIN
- * integer
+ * int
* PHP 7.1.0
*
*
@@ -1552,7 +1193,7 @@ function ldap_search($link_identifier, string $base_dn, string $filter, array $a
*
*
* LDAP_OPT_X_TLS_REQUIRE_CERT
- * integer
+ * int
* PHP 7.0.5
*
*
@@ -1572,14 +1213,14 @@ function ldap_search($link_identifier, string $base_dn, string $filter, array $a
* iscritical defaults to FALSE
* if not supplied. See draft-ietf-ldapext-ldap-c-api-xx.txt
* for details. See also the second example below.
- * @param mixed $newval The new value for the specified option.
+ * @param mixed $value The new value for the specified option.
* @throws LdapException
*
*/
-function ldap_set_option($link_identifier, int $option, $newval): void
+function ldap_set_option($ldap, int $option, $value): void
{
error_clear_last();
- $result = \ldap_set_option($link_identifier, $option, $newval);
+ $result = \ldap_set_option($ldap, $option, $value);
if ($result === false) {
throw LdapException::createFromPhpError();
}
@@ -1589,14 +1230,14 @@ function ldap_set_option($link_identifier, int $option, $newval): void
/**
* Unbinds from the LDAP directory.
*
- * @param resource $link_identifier An LDAP link identifier, returned by ldap_connect.
+ * @param resource $ldap An LDAP\Connection instance, returned by ldap_connect.
* @throws LdapException
*
*/
-function ldap_unbind($link_identifier): void
+function ldap_unbind($ldap): void
{
error_clear_last();
- $result = \ldap_unbind($link_identifier);
+ $result = \ldap_unbind($ldap);
if ($result === false) {
throw LdapException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/libxml.php b/vendor/thecodingmachine/safe/generated/libxml.php
index cef784c42..74925c123 100644
--- a/vendor/thecodingmachine/safe/generated/libxml.php
+++ b/vendor/thecodingmachine/safe/generated/libxml.php
@@ -25,11 +25,46 @@ function libxml_get_last_error(): \LibXMLError
/**
* Changes the default external entity loader.
+ * This can be used to suppress the expansion of arbitrary external entities to avoid XXE attacks,
+ * even when LIBXML_NOENT has been set for the respective operation,
+ * and is usually preferable over calling libxml_disable_entity_loader.
*
- * @param callable $resolver_function A callable that takes three arguments. Two strings, a public id
- * and system id, and a context (an array with four keys) as the third argument.
- * This callback should return a resource, a string from which a resource can be
- * opened, or NULL.
+ * @param callable $resolver_function A callable with the following signature:
+ *
+ * resourcestringnullresolver
+ * stringpublic_id
+ * stringsystem_id
+ * arraycontext
+ *
+ *
+ *
+ * public_id
+ *
+ *
+ * The public ID.
+ *
+ *
+ *
+ *
+ * system_id
+ *
+ *
+ * The system ID.
+ *
+ *
+ *
+ *
+ * context
+ *
+ *
+ * An array with the four elements "directory", "intSubName",
+ * "extSubURI" and "extSubSystem".
+ *
+ *
+ *
+ *
+ * This callable should return a resource, a string from which a resource can be
+ * opened. If NULL is returned, the entity reference resolution will fail.
* @throws LibxmlException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/mbstring.php b/vendor/thecodingmachine/safe/generated/mbstring.php
index fa0829438..49622015f 100644
--- a/vendor/thecodingmachine/safe/generated/mbstring.php
+++ b/vendor/thecodingmachine/safe/generated/mbstring.php
@@ -5,21 +5,66 @@ namespace Safe;
use Safe\Exceptions\MbstringException;
/**
+ * Returns a string containing the character specified by the Unicode code point value,
+ * encoded in the specified encoding.
*
+ * This function complements mb_ord.
*
- * @param int $cp
- * @param string $encoding
- * @return string Returns a specific character.
+ * @param int $codepoint A Unicode codepoint value, e.g. 128024 for U+1F418 ELEPHANT
+ * @param string $encoding The encoding
+ * parameter is the character encoding. If it is omitted or NULL, the internal character
+ * encoding value will be used.
+ * @return string A string containing the requested character, if it can be represented in the specified
+ * encoding.
* @throws MbstringException
*
*/
-function mb_chr(int $cp, string $encoding = null): string
+function mb_chr(int $codepoint, string $encoding = null): string
{
error_clear_last();
if ($encoding !== null) {
- $result = \mb_chr($cp, $encoding);
+ $result = \mb_chr($codepoint, $encoding);
+ } else {
+ $result = \mb_chr($codepoint);
+ }
+ if ($result === false) {
+ throw MbstringException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Converts string from from_encoding,
+ * or the current internal encoding, to to_encoding.
+ * If string is an array, all its string values will be
+ * converted recursively.
+ *
+ * @param string|array $string The string or array to be converted.
+ * @param string $to_encoding The desired encoding of the result.
+ * @param mixed $from_encoding The current encoding used to interpret string.
+ * Multiple encodings may be specified as an array or comma separated
+ * list, in which case the correct encoding will be guessed using the
+ * same algorithm as mb_detect_encoding.
+ *
+ * If from_encoding is NULL or not specified, the
+ * mbstring.internal_encoding setting
+ * will be used if set, otherwise the default_charset setting.
+ *
+ * See supported encodings
+ * for valid values of to_encoding
+ * and from_encoding.
+ * @return string|array The encoded string or array on success.
+ * @throws MbstringException
+ *
+ */
+function mb_convert_encoding($string, string $to_encoding, $from_encoding = null)
+{
+ error_clear_last();
+ if ($from_encoding !== null) {
+ $result = \mb_convert_encoding($string, $to_encoding, $from_encoding);
} else {
- $result = \mb_chr($cp);
+ $result = \mb_convert_encoding($string, $to_encoding);
}
if ($result === false) {
throw MbstringException::createFromPhpError();
@@ -30,12 +75,12 @@ function mb_chr(int $cp, string $encoding = null): string
/**
* Sets the automatic character
- * encoding detection order to encoding_list.
+ * encoding detection order to encoding.
*
- * @param mixed $encoding_list encoding_list is an array or
+ * @param mixed $encoding encoding is an array or
* comma separated list of character encoding. See supported encodings.
*
- * If encoding_list is omitted, it returns
+ * If encoding is omitted or NULL, it returns
* the current character encoding detection order as array.
*
* This setting affects mb_detect_encoding and
@@ -57,11 +102,11 @@ function mb_chr(int $cp, string $encoding = null): string
* @throws MbstringException
*
*/
-function mb_detect_order($encoding_list = null)
+function mb_detect_order($encoding = null)
{
error_clear_last();
- if ($encoding_list !== null) {
- $result = \mb_detect_order($encoding_list);
+ if ($encoding !== null) {
+ $result = \mb_detect_order($encoding);
} else {
$result = \mb_detect_order();
}
@@ -118,15 +163,21 @@ function mb_encoding_aliases(string $encoding): array
* clutter the function namespace with a callback function's name
* not used anywhere else.
* @param string $string The string being checked.
- * @param string $option The search option. See mb_regex_set_options for explanation.
- * @return string The resultant string on success.
+ * @param string $options The search option. See mb_regex_set_options for explanation.
+ * @return string|null The resultant string on success.
+ * If string is not valid for the current encoding, NULL
+ * is returned.
* @throws MbstringException
*
*/
-function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, string $option = "msr"): string
+function mb_ereg_replace_callback(string $pattern, callable $callback, string $string, string $options = null): ?string
{
error_clear_last();
- $result = \mb_ereg_replace_callback($pattern, $callback, $string, $option);
+ if ($options !== null) {
+ $result = \mb_ereg_replace_callback($pattern, $callback, $string, $options);
+ } else {
+ $result = \mb_ereg_replace_callback($pattern, $callback, $string);
+ }
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -142,15 +193,21 @@ function mb_ereg_replace_callback(string $pattern, callable $callback, string $s
* Multibyte characters may be used in pattern.
* @param string $replacement The replacement text.
* @param string $string The string being checked.
- * @param string $option
- * @return string The resultant string on success.
+ * @param string $options
+ * @return string|null The resultant string on success.
+ * If string is not valid for the current encoding, NULL
+ * is returned.
* @throws MbstringException
*
*/
-function mb_ereg_replace(string $pattern, string $replacement, string $string, string $option = "msr"): string
+function mb_ereg_replace(string $pattern, string $replacement, string $string, string $options = null): ?string
{
error_clear_last();
- $result = \mb_ereg_replace($pattern, $replacement, $string, $option);
+ if ($options !== null) {
+ $result = \mb_ereg_replace($pattern, $replacement, $string, $options);
+ } else {
+ $result = \mb_ereg_replace($pattern, $replacement, $string);
+ }
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -186,15 +243,15 @@ function mb_ereg_search_getregs(): array
*
* @param string $string The search string.
* @param string $pattern The search pattern.
- * @param string $option The search option. See mb_regex_set_options for explanation.
+ * @param string $options The search option. See mb_regex_set_options for explanation.
* @throws MbstringException
*
*/
-function mb_ereg_search_init(string $string, string $pattern = null, string $option = "msr"): void
+function mb_ereg_search_init(string $string, string $pattern = null, string $options = null): void
{
error_clear_last();
- if ($option !== "msr") {
- $result = \mb_ereg_search_init($string, $pattern, $option);
+ if ($options !== null) {
+ $result = \mb_ereg_search_init($string, $pattern, $options);
} elseif ($pattern !== null) {
$result = \mb_ereg_search_init($string, $pattern);
} else {
@@ -210,16 +267,16 @@ function mb_ereg_search_init(string $string, string $pattern = null, string $opt
* Returns the matched part of a multibyte regular expression.
*
* @param string $pattern The search pattern.
- * @param string $option The search option. See mb_regex_set_options for explanation.
+ * @param string $options The search option. See mb_regex_set_options for explanation.
* @return array
* @throws MbstringException
*
*/
-function mb_ereg_search_regs(string $pattern = null, string $option = "ms"): array
+function mb_ereg_search_regs(string $pattern = null, string $options = null): array
{
error_clear_last();
- if ($option !== "ms") {
- $result = \mb_ereg_search_regs($pattern, $option);
+ if ($options !== null) {
+ $result = \mb_ereg_search_regs($pattern, $options);
} elseif ($pattern !== null) {
$result = \mb_ereg_search_regs($pattern);
} else {
@@ -235,14 +292,14 @@ function mb_ereg_search_regs(string $pattern = null, string $option = "ms"): arr
/**
*
*
- * @param int $position The position to set. If it is negative, it counts from the end of the string.
+ * @param int $offset The position to set. If it is negative, it counts from the end of the string.
* @throws MbstringException
*
*/
-function mb_ereg_search_setpos(int $position): void
+function mb_ereg_search_setpos(int $offset): void
{
error_clear_last();
- $result = \mb_ereg_search_setpos($position);
+ $result = \mb_ereg_search_setpos($offset);
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -253,17 +310,61 @@ function mb_ereg_search_setpos(int $position): void
*
*
* @param string $pattern The regular expression pattern. Multibyte characters may be used. The case will be ignored.
- * @param string $replace The replacement text.
+ * @param string $replacement The replacement text.
* @param string $string The searched string.
- * @param string $option
+ * @param string $options
* @return string The resultant string.
+ * If string is not valid for the current encoding, NULL
+ * is returned.
+ * @throws MbstringException
+ *
+ */
+function mb_eregi_replace(string $pattern, string $replacement, string $string, string $options = null): string
+{
+ error_clear_last();
+ if ($options !== null) {
+ $result = \mb_eregi_replace($pattern, $replacement, $string, $options);
+ } else {
+ $result = \mb_eregi_replace($pattern, $replacement, $string);
+ }
+ if ($result === false) {
+ throw MbstringException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ *
+ *
+ * @param string $type If type is not specified or is specified as "all",
+ * "internal_encoding", "http_input",
+ * "http_output", "http_output_conv_mimetypes",
+ * "mail_charset", "mail_header_encoding",
+ * "mail_body_encoding", "illegal_chars",
+ * "encoding_translation", "language",
+ * "detect_order", "substitute_character"
+ * and "strict_detection"
+ * will be returned.
+ *
+ * If type is specified as
+ * "internal_encoding", "http_input",
+ * "http_output", "http_output_conv_mimetypes",
+ * "mail_charset", "mail_header_encoding",
+ * "mail_body_encoding", "illegal_chars",
+ * "encoding_translation", "language",
+ * "detect_order", "substitute_character"
+ * or "strict_detection"
+ * the specified setting parameter will be returned.
+ * @return mixed An array of type information if type
+ * is not specified, otherwise a specific type.
* @throws MbstringException
*
*/
-function mb_eregi_replace(string $pattern, string $replace, string $string, string $option = "msri"): string
+function mb_get_info(string $type = "all")
{
error_clear_last();
- $result = \mb_eregi_replace($pattern, $replace, $string, $option);
+ $result = \mb_get_info($type);
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -336,21 +437,25 @@ function mb_internal_encoding(string $encoding = null)
/**
+ * Returns the Unicode code point value of the given character.
*
+ * This function complements mb_chr.
*
- * @param string $str
- * @param string $encoding
- * @return int Returns a code point of character.
+ * @param string $string A string
+ * @param string $encoding The encoding
+ * parameter is the character encoding. If it is omitted or NULL, the internal character
+ * encoding value will be used.
+ * @return int The Unicode code point for the first character of string.
* @throws MbstringException
*
*/
-function mb_ord(string $str, string $encoding = null): int
+function mb_ord(string $string, string $encoding = null): int
{
error_clear_last();
if ($encoding !== null) {
- $result = \mb_ord($str, $encoding);
+ $result = \mb_ord($string, $encoding);
} else {
- $result = \mb_ord($str);
+ $result = \mb_ord($string);
}
if ($result === false) {
throw MbstringException::createFromPhpError();
@@ -367,15 +472,15 @@ function mb_ord(string $str, string $encoding = null): int
* encoding and set values to the result array or
* global variables.
*
- * @param string $encoded_string The URL encoded data.
+ * @param string $string The URL encoded data.
* @param array|null $result An array containing decoded and character encoded converted values.
* @throws MbstringException
*
*/
-function mb_parse_str(string $encoded_string, ?array &$result): void
+function mb_parse_str(string $string, ?array &$result): void
{
error_clear_last();
- $result = \mb_parse_str($encoded_string, $result);
+ $result = \mb_parse_str($string, $result);
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -386,7 +491,7 @@ function mb_parse_str(string $encoded_string, ?array &$result): void
* Set/Get character encoding for a multibyte regex.
*
* @param string $encoding The encoding
- * parameter is the character encoding. If it is omitted, the internal character
+ * parameter is the character encoding. If it is omitted or NULL, the internal character
* encoding value will be used.
* @return string|bool
* @throws MbstringException
@@ -444,7 +549,7 @@ function mb_regex_encoding(string $encoding = null)
* automatically (which leads to doubling CR if CRLF is used).
* This should be a last resort, as it does not comply with
* RFC 2822.
- * @param string $additional_parameter additional_parameter is a MTA command line
+ * @param string $additional_params additional_params is a MTA command line
* parameter. It is useful when setting the correct Return-Path
* header when using sendmail.
*
@@ -464,10 +569,14 @@ function mb_regex_encoding(string $encoding = null)
* @throws MbstringException
*
*/
-function mb_send_mail(string $to, string $subject, string $message, $additional_headers = null, string $additional_parameter = null): void
+function mb_send_mail(string $to, string $subject, string $message, $additional_headers = [], string $additional_params = null): void
{
error_clear_last();
- $result = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_parameter);
+ if ($additional_params !== null) {
+ $result = \mb_send_mail($to, $subject, $message, $additional_headers, $additional_params);
+ } else {
+ $result = \mb_send_mail($to, $subject, $message, $additional_headers);
+ }
if ($result === false) {
throw MbstringException::createFromPhpError();
}
@@ -493,34 +602,3 @@ function mb_split(string $pattern, string $string, int $limit = -1): array
}
return $result;
}
-
-
-/**
- * This function will return an array of strings, it is a version of str_split with support for encodings of variable character size as well as fixed-size encodings of 1,2 or 4 byte characters.
- * If the split_length parameter is specified, the string is broken down into chunks of the specified length in characters (not bytes).
- * The encoding parameter can be optionally specified and it is good practice to do so.
- *
- * @param string $string The string to split into characters or chunks.
- * @param int $split_length If specified, each element of the returned array will be composed of multiple characters instead of a single character.
- * @param string $encoding The encoding
- * parameter is the character encoding. If it is omitted, the internal character
- * encoding value will be used.
- *
- * A string specifying one of the supported encodings.
- * @return array mb_str_split returns an array of strings.
- * @throws MbstringException
- *
- */
-function mb_str_split(string $string, int $split_length = 1, string $encoding = null): array
-{
- error_clear_last();
- if ($encoding !== null) {
- $result = \mb_str_split($string, $split_length, $encoding);
- } else {
- $result = \mb_str_split($string, $split_length);
- }
- if ($result === false) {
- throw MbstringException::createFromPhpError();
- }
- return $result;
-}
diff --git a/vendor/thecodingmachine/safe/generated/misc.php b/vendor/thecodingmachine/safe/generated/misc.php
index ff636fd49..31ca61584 100644
--- a/vendor/thecodingmachine/safe/generated/misc.php
+++ b/vendor/thecodingmachine/safe/generated/misc.php
@@ -7,14 +7,14 @@ use Safe\Exceptions\MiscException;
/**
* Defines a named constant at runtime.
*
- * @param string $name The name of the constant.
+ * @param string $constant_name The name of the constant.
*
* It is possible to define constants with reserved or
* even invalid names, whose value can (only) be retrieved with
* constant. However, doing so is not recommended.
* @param mixed $value The value of the constant. In PHP 5, value must
- * be a scalar value (integer,
- * float, string, boolean, or
+ * be a scalar value (int,
+ * float, string, bool, or
* NULL). In PHP 7, array values are also accepted.
*
* While it is possible to define resource constants, it is
@@ -28,10 +28,10 @@ use Safe\Exceptions\MiscException;
* @throws MiscException
*
*/
-function define(string $name, $value, bool $case_insensitive = false): void
+function define(string $constant_name, $value, bool $case_insensitive = false): void
{
error_clear_last();
- $result = \define($name, $value, $case_insensitive);
+ $result = \define($constant_name, $value, $case_insensitive);
if ($result === false) {
throw MiscException::createFromPhpError();
}
@@ -72,7 +72,7 @@ function highlight_file(string $filename, bool $return = false)
/**
*
*
- * @param string $str The PHP code to be highlighted. This should include the opening tag.
+ * @param string $string The PHP code to be highlighted. This should include the opening tag.
* @param bool $return Set this parameter to TRUE to make this function return the
* highlighted code.
* @return string|bool If return is set to TRUE, returns the highlighted
@@ -81,10 +81,34 @@ function highlight_file(string $filename, bool $return = false)
* @throws MiscException
*
*/
-function highlight_string(string $str, bool $return = false)
+function highlight_string(string $string, bool $return = false)
{
error_clear_last();
- $result = \highlight_string($str, $return);
+ $result = \highlight_string($string, $return);
+ if ($result === false) {
+ throw MiscException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ *
+ *
+ * @param bool $as_number Whether the high resolution time should be returned as array
+ * or number.
+ * @return array{0:int,1:int}|int|float Returns an array of integers in the form [seconds, nanoseconds], if the
+ * parameter as_number is false. Otherwise the nanoseconds
+ * are returned as int (64bit platforms) or float
+ * (32bit platforms).
+ * Returns FALSE on failure.
+ * @throws MiscException
+ *
+ */
+function hrtime(bool $as_number = false)
+{
+ error_clear_last();
+ $result = \hrtime($as_number);
if ($result === false) {
throw MiscException::createFromPhpError();
}
@@ -232,7 +256,7 @@ function highlight_string(string $str, bool $return = false)
*
*
* Z
- * NUL-padded string (new in PHP 5.5)
+ * NUL-padded string
*
*
* @
@@ -241,16 +265,16 @@ function highlight_string(string $str, bool $return = false)
*
*
*
- * @param mixed $params
+ * @param mixed $values
* @return string Returns a binary string containing data.
* @throws MiscException
*
*/
-function pack(string $format, ...$params): string
+function pack(string $format, ...$values): string
{
error_clear_last();
- if ($params !== []) {
- $result = \pack($format, ...$params);
+ if ($values !== []) {
+ $result = \pack($format, ...$values);
} else {
$result = \pack($format);
}
@@ -288,14 +312,14 @@ function sapi_windows_cp_conv($in_codepage, $out_codepage, string $subject): str
/**
* Set the codepage of the current process.
*
- * @param int $cp A codepage identifier.
+ * @param int $codepage A codepage identifier.
* @throws MiscException
*
*/
-function sapi_windows_cp_set(int $cp): void
+function sapi_windows_cp_set(int $codepage): void
{
error_clear_last();
- $result = \sapi_windows_cp_set($cp);
+ $result = \sapi_windows_cp_set($codepage);
if ($result === false) {
throw MiscException::createFromPhpError();
}
@@ -324,9 +348,50 @@ function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
/**
- * If enable is omitted, the function returns TRUE if the stream stream has VT100 control codes enabled, FALSE otherwise.
+ * Sets or removes a CTRL event handler, which allows Windows
+ * CLI processes to intercept or ignore CTRL+C and
+ * CTRL+BREAK events. Note that in multithreaded environments,
+ * this is only possible when called from the main thread.
+ *
+ * @param $handler A callback function to set or remove. If set, this function will be called
+ * whenever a CTRL+C or CTRL+BREAK event
+ * occurs. The function is supposed to have the following signature:
+ *
+ * voidhandler
+ * intevent
+ *
+ *
+ *
+ * event
+ *
+ *
+ * The CTRL event which has been received;
+ * either PHP_WINDOWS_EVENT_CTRL_C
+ * or PHP_WINDOWS_EVENT_CTRL_BREAK.
+ *
+ *
+ *
+ *
+ * Setting a NULL handler causes the process to ignore
+ * CTRL+C events, but not CTRL+BREAK events.
+ * @param bool $add
+ * @throws MiscException
+ *
+ */
+function sapi_windows_set_ctrl_handler($handler, bool $add = true): void
+{
+ error_clear_last();
+ $result = \sapi_windows_set_ctrl_handler($handler, $add);
+ if ($result === false) {
+ throw MiscException::createFromPhpError();
+ }
+}
+
+
+/**
+ * If enable is NULL, the function returns TRUE if the stream stream has VT100 control codes enabled, FALSE otherwise.
*
- * If enable is specified, the function will try to enable or disable the VT100 features of the stream stream.
+ * If enable is a bool, the function will try to enable or disable the VT100 features of the stream stream.
* If the feature has been successfully enabled (or disabled).
*
* At startup, PHP tries to enable the VT100 feature of the STDOUT/STDERR streams. By the way, if those streams are redirected to a file, the VT100 features may not be enabled.
@@ -335,7 +400,7 @@ function sapi_windows_generate_ctrl_event(int $event, int $pid = 0): void
* They allow the modification of the terminal's output. On Windows these sequences are called Console Virtual Terminal Sequences.
*
* @param resource $stream The stream on which the function will operate.
- * @param bool $enable If specified, the VT100 feature will be enabled (if TRUE) or disabled (if FALSE).
+ * @param bool $enable If bool, the VT100 feature will be enabled (if TRUE) or disabled (if FALSE).
* @throws MiscException
*
*/
@@ -385,7 +450,7 @@ function sleep(int $seconds): int
*
* @param int $seconds Must be a non-negative integer.
* @param int $nanoseconds Must be a non-negative integer less than 1 billion.
- * @return array{0:int,1:int}|bool Returns TRUE on success.
+ * @return array{0:0|positive-int,1:0|positive-int}|bool Returns TRUE on success.
*
* If the delay was interrupted by a signal, an associative array will be
* returned with the components:
@@ -445,18 +510,33 @@ function time_sleep_until(float $timestamp): void
* then each of the array keys will have a sequence number behind
* the given name.
*
+ * Changes were made to bring this function into line with Perl:
+ *
+ *
+ * The "a" code now retains trailing NULL bytes.
+ *
+ *
+ * The "A" code now strips all trailing ASCII whitespace (spaces, tabs,
+ * newlines, carriage returns, and NULL bytes).
+ *
+ *
+ * The "Z" code was added for NULL-padded strings, and removes trailing
+ * NULL bytes.
+ *
+ *
+ *
* @param string $format See pack for an explanation of the format codes.
- * @param string $data The packed data.
+ * @param string $string The packed data.
* @param int $offset The offset to begin unpacking from.
* @return array Returns an associative array containing unpacked elements of binary
* string.
* @throws MiscException
*
*/
-function unpack(string $format, string $data, int $offset = 0): array
+function unpack(string $format, string $string, int $offset = 0): array
{
error_clear_last();
- $result = \unpack($format, $data, $offset);
+ $result = \unpack($format, $string, $offset);
if ($result === false) {
throw MiscException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/msql.php b/vendor/thecodingmachine/safe/generated/msql.php
deleted file mode 100644
index 331c1b6cd..000000000
--- a/vendor/thecodingmachine/safe/generated/msql.php
+++ /dev/null
@@ -1,443 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\MsqlException;
-
-/**
- * Returns number of affected rows by the last SELECT, UPDATE or DELETE
- * query associated with result.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @return int Returns the number of affected rows on success.
- * @throws MsqlException
- *
- */
-function msql_affected_rows($result): int
-{
- error_clear_last();
- $result = \msql_affected_rows($result);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_close closes the non-persistent connection to
- * the mSQL server that's associated with the specified link identifier.
- *
- * Using msql_close isn't usually necessary, as
- * non-persistent open links are automatically closed at the end of the
- * script's execution. See also freeing resources.
- *
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @throws MsqlException
- *
- */
-function msql_close($link_identifier = null): void
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_close($link_identifier);
- } else {
- $result = \msql_close();
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * msql_connect establishes a connection to a mSQL
- * server.
- *
- * If a second call is made to msql_connect with
- * the same arguments, no new link will be established, but instead, the
- * link identifier of the already opened link will be returned.
- *
- * The link to the server will be closed as soon as the execution of the
- * script ends, unless it's closed earlier by explicitly calling
- * msql_close.
- *
- * @param string $hostname The hostname can also include a port number. e.g.
- * hostname,port.
- *
- * If not specified, the connection is established by the means of a Unix
- * domain socket, being then more efficient then a localhost TCP socket
- * connection.
- *
- * While this function will accept a colon (:) as a
- * host/port separator, a comma (,) is the preferred
- * method.
- * @return resource Returns a positive mSQL link identifier on success.
- * @throws MsqlException
- *
- */
-function msql_connect(string $hostname = null)
-{
- error_clear_last();
- if ($hostname !== null) {
- $result = \msql_connect($hostname);
- } else {
- $result = \msql_connect();
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_create_db attempts to create a new database on
- * the mSQL server.
- *
- * @param string $database_name The name of the mSQL database.
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @throws MsqlException
- *
- */
-function msql_create_db(string $database_name, $link_identifier = null): void
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_create_db($database_name, $link_identifier);
- } else {
- $result = \msql_create_db($database_name);
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * msql_data_seek moves the internal row
- * pointer of the mSQL result associated with the specified query
- * identifier to point to the specified row number. The next call
- * to msql_fetch_row would return that
- * row.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $row_number The seeked row number.
- * @throws MsqlException
- *
- */
-function msql_data_seek($result, int $row_number): void
-{
- error_clear_last();
- $result = \msql_data_seek($result, $row_number);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * msql_db_query selects a database and executes a query
- * on it.
- *
- * @param string $database The name of the mSQL database.
- * @param string $query The SQL query.
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @return resource Returns a positive mSQL query identifier to the query result.
- * @throws MsqlException
- *
- */
-function msql_db_query(string $database, string $query, $link_identifier = null)
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_db_query($database, $query, $link_identifier);
- } else {
- $result = \msql_db_query($database, $query);
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_drop_db attempts to drop (remove) a database
- * from the mSQL server.
- *
- * @param string $database_name The name of the database.
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @throws MsqlException
- *
- */
-function msql_drop_db(string $database_name, $link_identifier = null): void
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_drop_db($database_name, $link_identifier);
- } else {
- $result = \msql_drop_db($database_name);
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * msql_field_len returns the length of the specified
- * field.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $field_offset The numerical field offset. The
- * field_offset starts at 1.
- * @return int Returns the length of the specified field.
- * @throws MsqlException
- *
- */
-function msql_field_len($result, int $field_offset): int
-{
- error_clear_last();
- $result = \msql_field_len($result, $field_offset);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_field_name gets the name of the specified field
- * index.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $field_offset The numerical field offset. The
- * field_offset starts at 1.
- * @return string The name of the field.
- * @throws MsqlException
- *
- */
-function msql_field_name($result, int $field_offset): string
-{
- error_clear_last();
- $result = \msql_field_name($result, $field_offset);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Seeks to the specified field offset. If the next call to
- * msql_fetch_field won't include a field offset, this
- * field would be returned.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $field_offset The numerical field offset. The
- * field_offset starts at 1.
- * @throws MsqlException
- *
- */
-function msql_field_seek($result, int $field_offset): void
-{
- error_clear_last();
- $result = \msql_field_seek($result, $field_offset);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * Returns the name of the table that the specified field is in.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $field_offset The numerical field offset. The
- * field_offset starts at 1.
- * @return int The name of the table on success.
- * @throws MsqlException
- *
- */
-function msql_field_table($result, int $field_offset): int
-{
- error_clear_last();
- $result = \msql_field_table($result, $field_offset);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_field_type gets the type of the specified field
- * index.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @param int $field_offset The numerical field offset. The
- * field_offset starts at 1.
- * @return string The type of the field. One of int,
- * char, real, ident,
- * null or unknown. This functions will
- * return FALSE on failure.
- * @throws MsqlException
- *
- */
-function msql_field_type($result, int $field_offset): string
-{
- error_clear_last();
- $result = \msql_field_type($result, $field_offset);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_free_result frees the memory associated
- * with query_identifier. When PHP completes a
- * request, this memory is freed automatically, so you only need to
- * call this function when you want to make sure you don't use too
- * much memory while the script is running.
- *
- * @param resource $result The result resource that
- * is being evaluated. This result comes from a call to
- * msql_query.
- * @throws MsqlException
- *
- */
-function msql_free_result($result): void
-{
- error_clear_last();
- $result = \msql_free_result($result);
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * msql_pconnect acts very much like
- * msql_connect with two major differences.
- *
- * First, when connecting, the function would first try to find a
- * (persistent) link that's already open with the same host.
- * If one is found, an identifier for it will be returned instead of opening
- * a new connection.
- *
- * Second, the connection to the SQL server will not be closed when the
- * execution of the script ends. Instead, the link will remain open for
- * future use (msql_close will not close links
- * established by this function).
- *
- * @param string $hostname The hostname can also include a port number. e.g.
- * hostname,port.
- *
- * If not specified, the connection is established by the means of a Unix
- * domain socket, being more efficient than a localhost TCP socket
- * connection.
- * @return resource Returns a positive mSQL link identifier on success.
- * @throws MsqlException
- *
- */
-function msql_pconnect(string $hostname = null)
-{
- error_clear_last();
- if ($hostname !== null) {
- $result = \msql_pconnect($hostname);
- } else {
- $result = \msql_pconnect();
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_query sends a query to the currently active
- * database on the server that's associated with the specified link
- * identifier.
- *
- * @param string $query The SQL query.
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @return resource Returns a positive mSQL query identifier on success.
- * @throws MsqlException
- *
- */
-function msql_query(string $query, $link_identifier = null)
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_query($query, $link_identifier);
- } else {
- $result = \msql_query($query);
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * msql_select_db sets the current active database on
- * the server that's associated with the specified
- * link_identifier.
- *
- * Subsequent calls to msql_query will be made on the
- * active database.
- *
- * @param string $database_name The database name.
- * @param resource|null $link_identifier The mSQL connection.
- * If not specified, the last link opened by msql_connect
- * is assumed. If no such link is found, the function will try to establish a
- * link as if msql_connect was called, and use it.
- * @throws MsqlException
- *
- */
-function msql_select_db(string $database_name, $link_identifier = null): void
-{
- error_clear_last();
- if ($link_identifier !== null) {
- $result = \msql_select_db($database_name, $link_identifier);
- } else {
- $result = \msql_select_db($database_name);
- }
- if ($result === false) {
- throw MsqlException::createFromPhpError();
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/mysqlndMs.php b/vendor/thecodingmachine/safe/generated/mysqlndMs.php
deleted file mode 100644
index 2fd4f32a2..000000000
--- a/vendor/thecodingmachine/safe/generated/mysqlndMs.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\MysqlndMsException;
-
-/**
- * Returns a list of currently configured servers.
- *
- * @param mixed $connection A MySQL connection handle obtained from any of the
- * connect functions of the mysqli,
- * mysql or
- * PDO_MYSQL extensions.
- * @return array FALSE on error. Otherwise, returns an array with two entries
- * masters and slaves each of which contains
- * an array listing all corresponding servers.
- *
- * The function can be used to check and debug the list of servers currently
- * used by the plugin. It is mostly useful when the list of servers changes at
- * runtime, for example, when using MySQL Fabric.
- *
- * masters and slaves server entries
- * @throws MysqlndMsException
- *
- */
-function mysqlnd_ms_dump_servers($connection): array
-{
- error_clear_last();
- $result = \mysqlnd_ms_dump_servers($connection);
- if ($result === false) {
- throw MysqlndMsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * MySQL Fabric related.
- *
- * Switch the connection to the nodes handling global sharding queries
- * for the given table name.
- *
- * @param mixed $connection A MySQL connection handle obtained from any of the
- * connect functions of the mysqli,
- * mysql or
- * PDO_MYSQL extensions.
- * @param mixed $table_name The table name to ask Fabric about.
- * @return array FALSE on error. Otherwise, TRUE
- * @throws MysqlndMsException
- *
- */
-function mysqlnd_ms_fabric_select_global($connection, $table_name): array
-{
- error_clear_last();
- $result = \mysqlnd_ms_fabric_select_global($connection, $table_name);
- if ($result === false) {
- throw MysqlndMsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * MySQL Fabric related.
- *
- * Switch the connection to the shards responsible for the
- * given table name and shard key.
- *
- * @param mixed $connection A MySQL connection handle obtained from any of the
- * connect functions of the mysqli,
- * mysql or
- * PDO_MYSQL extensions.
- * @param mixed $table_name The table name to ask Fabric about.
- * @param mixed $shard_key The shard key to ask Fabric about.
- * @return array FALSE on error. Otherwise, TRUE
- * @throws MysqlndMsException
- *
- */
-function mysqlnd_ms_fabric_select_shard($connection, $table_name, $shard_key): array
-{
- error_clear_last();
- $result = \mysqlnd_ms_fabric_select_shard($connection, $table_name, $shard_key);
- if ($result === false) {
- throw MysqlndMsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Returns an array which describes the last used connection from the plugins
- * connection pool currently pointed to by the user connection handle. If using the
- * plugin, a user connection handle represents a pool of database connections.
- * It is not possible to tell from the user connection handles properties to which
- * database server from the pool the user connection handle points.
- *
- * The function can be used to debug or monitor PECL mysqlnd_ms.
- *
- * @param mixed $connection A MySQL connection handle obtained from any of the
- * connect functions of the mysqli,
- * mysql or
- * PDO_MYSQL extensions.
- * @return array FALSE on error. Otherwise, an
- * array which describes the connection used to
- * execute the last statement on.
- *
- * Array which describes the connection.
- * @throws MysqlndMsException
- *
- */
-function mysqlnd_ms_get_last_used_connection($connection): array
-{
- error_clear_last();
- $result = \mysqlnd_ms_get_last_used_connection($connection);
- if ($result === false) {
- throw MysqlndMsException::createFromPhpError();
- }
- return $result;
-}
diff --git a/vendor/thecodingmachine/safe/generated/mysqlndQc.php b/vendor/thecodingmachine/safe/generated/mysqlndQc.php
deleted file mode 100644
index 9a99a379c..000000000
--- a/vendor/thecodingmachine/safe/generated/mysqlndQc.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\MysqlndQcException;
-
-/**
- * Flush all cache contents.
- *
- * Flushing the cache is a storage handler responsibility.
- * All built-in storage handler but the
- * memcache storage
- * handler support flushing the cache. The
- * memcache
- * storage handler cannot flush its cache contents.
- *
- * User-defined storage handler may or may not support the operation.
- *
- * @throws MysqlndQcException
- *
- */
-function mysqlnd_qc_clear_cache(): void
-{
- error_clear_last();
- $result = \mysqlnd_qc_clear_cache();
- if ($result === false) {
- throw MysqlndQcException::createFromPhpError();
- }
-}
-
-
-/**
- * Installs a callback which decides whether a statement is cached.
- *
- * There are several ways of hinting PELC/mysqlnd_qc to cache a query.
- * By default, PECL/mysqlnd_qc attempts to cache a if caching of all statements
- * is enabled or the query string begins with a certain SQL hint.
- * The plugin internally calls a function named is_select()
- * to find out. This internal function can be replaced with a user-defined callback.
- * Then, the user-defined callback is responsible to decide whether the plugin
- * attempts to cache a statement. Because the internal function is replaced
- * with the callback, the callback gains full control. The callback is free
- * to ignore the configuration setting mysqlnd_qc.cache_by_default
- * and SQL hints.
- *
- * The callback is invoked for every statement inspected by the plugin.
- * It is given the statements string as a parameter. The callback returns
- * FALSE if the statement shall not be cached. It returns TRUE to
- * make the plugin attempt to cache the statements result set, if any.
- * A so-created cache entry is given the default TTL set with the
- * PHP configuration directive mysqlnd_qc.ttl.
- * If a different TTL shall be used, the callback returns a numeric
- * value to be used as the TTL.
- *
- * The internal is_select function is part of the internal
- * cache storage handler interface. Thus, a user-defined storage handler
- * offers the same capabilities.
- *
- * @param string $callback
- * @return mixed Returns TRUE on success.
- * @throws MysqlndQcException
- *
- */
-function mysqlnd_qc_set_is_select(string $callback)
-{
- error_clear_last();
- $result = \mysqlnd_qc_set_is_select($callback);
- if ($result === false) {
- throw MysqlndQcException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Sets the storage handler used by the query cache. A list of available
- * storage handler can be obtained from
- * mysqlnd_qc_get_available_handlers.
- * Which storage are available depends on the compile time
- * configuration of the query cache plugin. The
- * default storage handler is always available.
- * All other storage handler must be enabled explicitly when building the
- * extension.
- *
- * @param string $handler Handler can be of type string representing the name of a
- * built-in storage handler or an object of type
- * mysqlnd_qc_handler_default.
- * The names of the built-in storage handler are
- * default,
- * APC,
- * MEMCACHE,
- * sqlite.
- * @throws MysqlndQcException
- *
- */
-function mysqlnd_qc_set_storage_handler(string $handler): void
-{
- error_clear_last();
- $result = \mysqlnd_qc_set_storage_handler($handler);
- if ($result === false) {
- throw MysqlndQcException::createFromPhpError();
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/network.php b/vendor/thecodingmachine/safe/generated/network.php
index 6d46b6ce3..21186d1fa 100644
--- a/vendor/thecodingmachine/safe/generated/network.php
+++ b/vendor/thecodingmachine/safe/generated/network.php
@@ -53,10 +53,11 @@ function closelog(): void
* always return every record, the slower DNS_ALL
* will collect all records more reliably.
*
- * DNS_CAA is not supported on Windows.
- * @param array|null $authns Passed by reference and, if given, will be populated with Resource
+ * Windows: DNS_CAA is not supported.
+ * Support for DNS_A6 is not implemented.
+ * @param array|null $authoritative_name_servers Passed by reference and, if given, will be populated with Resource
* Records for the Authoritative Name Servers.
- * @param array|null $addtl Passed by reference and, if given, will be populated with any
+ * @param array|null $additional_records Passed by reference and, if given, will be populated with any
* Additional Records.
* @param bool $raw The type will be interpreted as a raw DNS type ID
* (the DNS_* constants cannot be used).
@@ -208,7 +209,7 @@ function closelog(): void
*
*
*
- * A6(PHP &gt;= 5.1.0)
+ * A6
*
* masklen: Length (in bits) to inherit from the target
* specified by chain.
@@ -245,10 +246,10 @@ function closelog(): void
* @throws NetworkException
*
*/
-function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authns = null, ?array &$addtl = null, bool $raw = false): array
+function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authoritative_name_servers = null, ?array &$additional_records = null, bool $raw = false): array
{
error_clear_last();
- $result = \dns_get_record($hostname, $type, $authns, $addtl, $raw);
+ $result = \dns_get_record($hostname, $type, $authoritative_name_servers, $additional_records, $raw);
if ($result === false) {
throw NetworkException::createFromPhpError();
}
@@ -280,16 +281,17 @@ function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authns =
* @param int $port The port number. This can be omitted and skipped with
* -1 for transports that do not use ports, such as
* unix://.
- * @param int|null $errno If provided, holds the system level error number that occurred in the
+ * @param int|null $error_code If provided, holds the system level error number that occurred in the
* system-level connect() call.
*
- * If the value returned in errno is
+ * If the value returned in error_code is
* 0 and the function returned FALSE, it is an
* indication that the error occurred before the
* connect() call. This is most likely due to a
* problem initializing the socket.
- * @param string|null $errstr The error message as a string.
- * @param float $timeout The connection timeout, in seconds.
+ * @param string|null $error_message The error message as a string.
+ * @param float $timeout The connection timeout, in seconds. When NULL, the
+ * default_socket_timeout php.ini setting is used.
*
* If you need to set a timeout for reading/writing data over the
* socket, use stream_set_timeout, as the
@@ -304,13 +306,13 @@ function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authns =
* @throws NetworkException
*
*/
-function fsockopen(string $hostname, int $port = -1, ?int &$errno = null, ?string &$errstr = null, float $timeout = null)
+function fsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, float $timeout = null)
{
error_clear_last();
if ($timeout !== null) {
- $result = \fsockopen($hostname, $port, $errno, $errstr, $timeout);
+ $result = \fsockopen($hostname, $port, $error_code, $error_message, $timeout);
} else {
- $result = \fsockopen($hostname, $port, $errno, $errstr);
+ $result = \fsockopen($hostname, $port, $error_code, $error_message);
}
if ($result === false) {
throw NetworkException::createFromPhpError();
@@ -341,18 +343,18 @@ function gethostname(): string
/**
* getprotobyname returns the protocol number
- * associated with the protocol name as per
+ * associated with the protocol protocol as per
* /etc/protocols.
*
- * @param string $name The protocol name.
+ * @param string $protocol The protocol name.
* @return int Returns the protocol number.
* @throws NetworkException
*
*/
-function getprotobyname(string $name): int
+function getprotobyname(string $protocol): int
{
error_clear_last();
- $result = \getprotobyname($name);
+ $result = \getprotobyname($protocol);
if ($result === false) {
throw NetworkException::createFromPhpError();
}
@@ -362,18 +364,41 @@ function getprotobyname(string $name): int
/**
* getprotobynumber returns the protocol name
- * associated with protocol number as per
+ * associated with protocol protocol as per
* /etc/protocols.
*
- * @param int $number The protocol number.
+ * @param int $protocol The protocol number.
* @return string Returns the protocol name as a string.
* @throws NetworkException
*
*/
-function getprotobynumber(int $number): string
+function getprotobynumber(int $protocol): string
{
error_clear_last();
- $result = \getprotobynumber($number);
+ $result = \getprotobynumber($protocol);
+ if ($result === false) {
+ throw NetworkException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * getservbyport returns the Internet service
+ * associated with port for the specified
+ * protocol as per /etc/services.
+ *
+ * @param int $port The port number.
+ * @param string $protocol protocol is either "tcp"
+ * or "udp" (in lowercase).
+ * @return string Returns the Internet service name as a string.
+ * @throws NetworkException
+ *
+ */
+function getservbyport(int $port, string $protocol): string
+{
+ error_clear_last();
+ $result = \getservbyport($port, $protocol);
if ($result === false) {
throw NetworkException::createFromPhpError();
}
@@ -406,15 +431,141 @@ function header_register_callback(callable $callback): void
/**
*
*
- * @param string $in_addr A 32bit IPv4, or 128bit IPv6 address.
+ * @param string $ip A 32bit IPv4, or 128bit IPv6 address.
* @return string Returns a string representation of the address.
* @throws NetworkException
*
*/
-function inet_ntop(string $in_addr): string
+function inet_ntop(string $ip): string
+{
+ error_clear_last();
+ $result = \inet_ntop($ip);
+ if ($result === false) {
+ throw NetworkException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The function long2ip generates an Internet address
+ * in dotted format (i.e.: aaa.bbb.ccc.ddd) from the long integer
+ * representation.
+ *
+ * @param int $ip A proper address representation in long integer.
+ * @return string Returns the Internet IP address as a string.
+ * @throws NetworkException
+ *
+ */
+function long2ip(int $ip): string
+{
+ error_clear_last();
+ $result = \long2ip($ip);
+ if ($result === false) {
+ throw NetworkException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns an enumeration of network interfaces (adapters) on the local machine.
+ *
+ * @return array Returns an associative array where the key is the name of the interface and
+ * the value an associative array of interface attributes.
+ *
+ * Each interface associative array contains:
+ *
+ * Interface attributes
+ *
+ *
+ *
+ * Name
+ * Description
+ *
+ *
+ *
+ *
+ * description
+ *
+ * Optional string value for description of the interface.
+ * Windows only.
+ *
+ *
+ *
+ * mac
+ *
+ * Optional string value for MAC address of the interface.
+ * Windows only.
+ *
+ *
+ *
+ * mtu
+ *
+ * Integer value for Maximum transmission unit (MTU) of the interface.
+ * Windows only.
+ *
+ *
+ *
+ * unicast
+ *
+ * Array of associative arrays, see Unicast attributes below.
+ *
+ *
+ *
+ * up
+ *
+ * Boolean status (on/off) for interface.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * Unicast attributes
+ *
+ *
+ *
+ * Name
+ * Description
+ *
+ *
+ *
+ *
+ * flags
+ *
+ * Integer value.
+ *
+ *
+ *
+ * family
+ *
+ * Integer value.
+ *
+ *
+ *
+ * address
+ *
+ * String value for address in either IPv4 or IPv6.
+ *
+ *
+ *
+ * netmask
+ *
+ * String value for netmask in either IPv4 or IPv6.
+ *
+ *
+ *
+ *
+ *
+ * @throws NetworkException
+ *
+ */
+function net_get_interfaces(): array
{
error_clear_last();
- $result = \inet_ntop($in_addr);
+ $result = \net_get_interfaces();
if ($result === false) {
throw NetworkException::createFromPhpError();
}
@@ -428,11 +579,11 @@ function inet_ntop(string $in_addr): string
*
* The use of openlog is optional. It
* will automatically be called by syslog if
- * necessary, in which case ident will default
+ * necessary, in which case prefix will default
* to FALSE.
*
- * @param string $ident The string ident is added to each message.
- * @param int $option The option argument is used to indicate
+ * @param string $prefix The string prefix is added to each message.
+ * @param int $flags The flags argument is used to indicate
* what logging options will be used when generating a log message.
*
* openlog Options
@@ -554,13 +705,46 @@ function inet_ntop(string $in_addr): string
* @throws NetworkException
*
*/
-function openlog(string $ident, int $option, int $facility): void
+function openlog(string $prefix, int $flags, int $facility): void
+{
+ error_clear_last();
+ $result = \openlog($prefix, $flags, $facility);
+ if ($result === false) {
+ throw NetworkException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function behaves exactly as fsockopen with the
+ * difference that the connection is not closed after the script finishes.
+ * It is the persistent version of fsockopen.
+ *
+ * @param string $hostname
+ * @param int $port
+ * @param int|null $error_code
+ * @param string|null $error_message
+ * @param float $timeout
+ * @return resource pfsockopen returns a file pointer which may be used
+ * together with the other file functions (such as
+ * fgets, fgetss,
+ * fwrite, fclose, and
+ * feof).
+ * @throws NetworkException
+ *
+ */
+function pfsockopen(string $hostname, int $port = -1, ?int &$error_code = null, ?string &$error_message = null, float $timeout = null)
{
error_clear_last();
- $result = \openlog($ident, $option, $facility);
+ if ($timeout !== null) {
+ $result = \pfsockopen($hostname, $port, $error_code, $error_message, $timeout);
+ } else {
+ $result = \pfsockopen($hostname, $port, $error_code, $error_message);
+ }
if ($result === false) {
throw NetworkException::createFromPhpError();
}
+ return $result;
}
@@ -622,10 +806,7 @@ function openlog(string $ident, int $option, int $facility): void
*
*
*
- * @param string $message The message to send, except that the two characters
- * %m will be replaced by the error message string
- * (strerror) corresponding to the present value of
- * errno.
+ * @param string $message The message to send.
* @throws NetworkException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/oci8.php b/vendor/thecodingmachine/safe/generated/oci8.php
index f2bac2781..4a7e38806 100644
--- a/vendor/thecodingmachine/safe/generated/oci8.php
+++ b/vendor/thecodingmachine/safe/generated/oci8.php
@@ -5,15 +5,15 @@ namespace Safe;
use Safe\Exceptions\Oci8Exception;
/**
- * Binds the PHP array var_array to the Oracle
- * placeholder name, which points to an Oracle PL/SQL
+ * Binds the PHP array var to the Oracle
+ * placeholder param, which points to an Oracle PL/SQL
* array. Whether it will be used for input or output will be determined at
* run-time.
*
* @param resource $statement A valid OCI statement identifier.
- * @param string $name The Oracle placeholder.
- * @param array $var_array An array.
- * @param int $max_table_length Sets the maximum length both for incoming and result arrays.
+ * @param string $param The Oracle placeholder.
+ * @param array $var An array.
+ * @param int $max_array_length Sets the maximum length both for incoming and result arrays.
* @param int $max_item_length Sets maximum length for array items. If not specified or equals to -1,
* oci_bind_array_by_name will find the longest
* element in the incoming array and will use it as the maximum length.
@@ -101,10 +101,10 @@ use Safe\Exceptions\Oci8Exception;
* @throws Oci8Exception
*
*/
-function oci_bind_array_by_name($statement, string $name, array &$var_array, int $max_table_length, int $max_item_length = -1, int $type = SQLT_AFC): void
+function oci_bind_array_by_name($statement, string $param, array &$var, int $max_array_length, int $max_item_length = -1, int $type = SQLT_AFC): void
{
error_clear_last();
- $result = \oci_bind_array_by_name($statement, $name, $var_array, $max_table_length, $max_item_length, $type);
+ $result = \oci_bind_array_by_name($statement, $param, $var, $max_array_length, $max_item_length, $type);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -112,8 +112,8 @@ function oci_bind_array_by_name($statement, string $name, array &$var_array, int
/**
- * Binds a PHP variable variable to the Oracle
- * bind variable placeholder bv_name. Binding
+ * Binds a PHP variable var to the Oracle
+ * bind variable placeholder param. Binding
* is important for Oracle database performance and also as a way to
* avoid SQL Injection security issues.
*
@@ -136,12 +136,12 @@ function oci_bind_array_by_name($statement, string $name, array &$var_array, int
* bind variable will be used for input or output is determined at
* run-time.
*
- * You must specify maxlength when using
+ * You must specify max_length when using
* an OUT bind so that PHP allocates enough memory
* to hold the returned value.
*
* For IN binds it is recommended to set
- * the maxlength length if the statement is
+ * the max_length length if the statement is
* re-executed multiple times with different values for the PHP
* variable. Otherwise Oracle may truncate data to the length of the
* initial PHP variable value. If you don't know what the maximum
@@ -168,16 +168,16 @@ function oci_bind_array_by_name($statement, string $name, array &$var_array, int
* SQL statement, as this can be a security risk if unfiltered user
* text is concatenated.
*
- * @param resource $statement A valid OCI8 statement identifer.
- * @param string $bv_name The colon-prefixed bind variable placeholder used in the
+ * @param resource $statement A valid OCI8 statement identifier.
+ * @param string $param The colon-prefixed bind variable placeholder used in the
* statement. The colon is optional
- * in bv_name. Oracle does not use question
+ * in param. Oracle does not use question
* marks for placeholders.
- * @param mixed $variable The PHP variable to be associated with bv_name
- * @param int $maxlength Sets the maximum length for the data. If you set it to -1, this
+ * @param mixed $var The PHP variable to be associated with param
+ * @param int $max_length Sets the maximum length for the data. If you set it to -1, this
* function will use the current length
- * of variable to set the maximum
- * length. In this case the variable must
+ * of var to set the maximum
+ * length. In this case the var must
* exist and contain data
* when oci_bind_by_name is called.
* @param int $type The datatype that Oracle will treat the data as. The
@@ -307,10 +307,10 @@ function oci_bind_array_by_name($statement, string $name, array &$var_array, int
* @throws Oci8Exception
*
*/
-function oci_bind_by_name($statement, string $bv_name, &$variable, int $maxlength = -1, int $type = SQLT_CHR): void
+function oci_bind_by_name($statement, string $param, &$var, int $max_length = -1, int $type = 0): void
{
error_clear_last();
- $result = \oci_bind_by_name($statement, $bv_name, $variable, $maxlength, $type);
+ $result = \oci_bind_by_name($statement, $param, $var, $max_length, $type);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -336,31 +336,6 @@ function oci_cancel($statement): void
/**
- * Unsets connection. The underlying database
- * connection is closed if no other resources are using it and if it
- * was created with oci_connect
- * or oci_new_connect.
- *
- * It is recommended to close connections that are no longer needed
- * because this makes database resources available for other users.
- *
- * @param resource $connection An Oracle connection identifier returned by
- * oci_connect, oci_pconnect,
- * or oci_new_connect.
- * @throws Oci8Exception
- *
- */
-function oci_close($connection): void
-{
- error_clear_last();
- $result = \oci_close($connection);
- if ($result === false) {
- throw Oci8Exception::createFromPhpError();
- }
-}
-
-
-/**
* Commits the outstanding transaction for the
* Oracle connection. A commit ends the
* current transaction and makes permanent all changes. It releases
@@ -395,9 +370,11 @@ function oci_commit($connection): void
/**
* Returns a connection identifier needed for most other OCI8 operations.
*
- * See Connection Handling for
- * general information on connection management and connection
- * pooling.
+ * For performance, most applications should use persistent connections
+ * with oci_pconnect instead
+ * of oci_connect.
+ * See Connection Handling for general
+ * information on connection management and connection pooling.
*
* From PHP 5.1.2 (PECL OCI8 1.1) oci_close can
* be used to close the connection.
@@ -419,7 +396,7 @@ function oci_commit($connection): void
* the tnsnames.ora file, or the name of a local
* Oracle instance.
*
- * If not specified, PHP uses
+ * If not specified or NULL, PHP uses
* environment variables such as TWO_TASK (on Linux)
* or LOCAL (on Windows)
* and ORACLE_SID to determine the
@@ -432,19 +409,19 @@ function oci_commit($connection): void
* [//]host_name[:port][/service_name]. From Oracle
* 11g, the syntax is:
* [//]host_name[:port][/service_name][:server_type][/instance_name].
- * Service names can be found by running the Oracle
- * utility lsnrctl status on the database server
+ * Further options were introduced with Oracle 19c, including timeout and keep-alive
+ * settings. Refer to Oracle documentation. Service names can be found by running
+ * the Oracle utility lsnrctl status on the database server
* machine.
*
*
- * The tnsnames.ora file can be in the Oracle Net
- * search path, which
- * includes $ORACLE_HOME/network/admin
- * and /etc. Alternatively
- * set TNS_ADMIN so
- * that $TNS_ADMIN/tnsnames.ora is read. Make sure
- * the web daemon has read access to the file.
- * @param string $character_set Determines
+ * The tnsnames.ora file can be in the Oracle Net search path,
+ * which
+ * includes /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin
+ * and /etc. Alternatively set TNS_ADMIN
+ * so that $TNS_ADMIN/tnsnames.ora is read. Make sure the web
+ * daemon has read access to the file.
+ * @param string $encoding Determines
* the character set used by the Oracle Client libraries. The character
* set does not need to match the character set used by the database. If
* it doesn't match, Oracle will do its best to convert data to and from
@@ -489,13 +466,13 @@ function oci_commit($connection): void
* @throws Oci8Exception
*
*/
-function oci_connect(string $username, string $password, string $connection_string = null, string $character_set = null, int $session_mode = null)
+function oci_connect(string $username, string $password, string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
- if ($session_mode !== null) {
- $result = \oci_connect($username, $password, $connection_string, $character_set, $session_mode);
- } elseif ($character_set !== null) {
- $result = \oci_connect($username, $password, $connection_string, $character_set);
+ if ($session_mode !== OCI_DEFAULT) {
+ $result = \oci_connect($username, $password, $connection_string, $encoding, $session_mode);
+ } elseif ($encoding !== "") {
+ $result = \oci_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$result = \oci_connect($username, $password, $connection_string);
} else {
@@ -518,12 +495,12 @@ function oci_connect(string $username, string $password, string $connection_stri
* identifier created by oci_parse and executed
* by oci_execute, or a REF
* CURSOR statement identifier.
- * @param string $column_name The column name used in the query.
+ * @param string $column The column name used in the query.
*
* Use uppercase for Oracle's default, non-case sensitive column
* names. Use the exact column name case for case-sensitive
* column names.
- * @param mixed $variable The PHP variable that will contain the returned column value.
+ * @param mixed $var The PHP variable that will contain the returned column value.
* @param int $type The data type to be returned. Generally not needed. Note that
* Oracle-style data conversions are not performed. For example,
* SQLT_INT will be ignored and the returned
@@ -534,10 +511,10 @@ function oci_connect(string $username, string $password, string $connection_stri
* @throws Oci8Exception
*
*/
-function oci_define_by_name($statement, string $column_name, &$variable, int $type = SQLT_CHR): void
+function oci_define_by_name($statement, string $column, &$var, int $type = 0): void
{
error_clear_last();
- $result = \oci_define_by_name($statement, $column_name, $variable, $type);
+ $result = \oci_define_by_name($statement, $column, $var, $type);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -632,121 +609,18 @@ function oci_execute($statement, int $mode = OCI_COMMIT_ON_SUCCESS): void
/**
- * Fetches multiple rows from a query into a two-dimensional array.
- * By default, all rows are returned.
- *
- * This function can be called only once for each query executed
- * with oci_execute.
- *
- * @param resource $statement A valid OCI8 statement
- * identifier created by oci_parse and executed
- * by oci_execute, or a REF
- * CURSOR statement identifier.
- * @param array|null $output The variable to contain the returned rows.
- *
- * LOB columns are returned as strings, where Oracle supports
- * conversion.
- *
- * See oci_fetch_array for more information
- * on how data and types are fetched.
- * @param int $skip The number of initial rows to discard when fetching the
- * result. The default value is 0, so the first row onwards is
- * returned.
- * @param int $maxrows The number of rows to return. The default is -1 meaning return
- * all the rows from skip + 1 onwards.
- * @param int $flags Parameter flags indicates the array
- * structure and whether associative arrays should be used.
- *
- * oci_fetch_all Array Structure Modes
- *
- *
- *
- * Constant
- * Description
- *
- *
- *
- *
- * OCI_FETCHSTATEMENT_BY_ROW
- * The outer array will contain one sub-array per query
- * row.
- *
- *
- * OCI_FETCHSTATEMENT_BY_COLUMN
- * The outer array will contain one sub-array per query
- * column. This is the default.
- *
- *
- *
- *
- *
- * Arrays can be indexed either by column heading or numerically.
- * Only one index mode will be returned.
- *
- * oci_fetch_all Array Index Modes
- *
- *
- *
- * Constant
- * Description
- *
- *
- *
- *
- * OCI_NUM
- * Numeric indexes are used for each column's array.
- *
- *
- * OCI_ASSOC
- * Associative indexes are used for each column's
- * array. This is the default.
- *
- *
- *
- *
- *
- * Use the addition operator "+" to choose a combination
- * of array structure and index modes.
- *
- * Oracle's default, non-case sensitive column names will have
- * uppercase array keys. Case-sensitive column names will have
- * array keys using the exact column case.
- * Use var_dump
- * on output to verify the appropriate case
- * to use for each query.
- *
- * Queries that have more than one column with the same name
- * should use column aliases. Otherwise only one of the columns
- * will appear in an associative array.
- * @return int Returns the number of rows in output, which
- * may be 0 or more.
- * @throws Oci8Exception
- *
- */
-function oci_fetch_all($statement, ?array &$output, int $skip = 0, int $maxrows = -1, int $flags = OCI_FETCHSTATEMENT_BY_COLUMN + OCI_ASSOC): int
-{
- error_clear_last();
- $result = \oci_fetch_all($statement, $output, $skip, $maxrows, $flags);
- if ($result === false) {
- throw Oci8Exception::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Returns the name of the field.
+ * Returns the name of the column.
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return string Returns the name as a strings.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return string Returns the name as a string
* @throws Oci8Exception
*
*/
-function oci_field_name($statement, $field): string
+function oci_field_name($statement, $column): string
{
error_clear_last();
- $result = \oci_field_name($statement, $field);
+ $result = \oci_field_name($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -755,22 +629,22 @@ function oci_field_name($statement, $field): string
/**
- * Returns precision of the field.
+ * Returns precision of the column.
*
* For FLOAT columns, precision is nonzero and scale is -127.
* If precision is 0, then column is NUMBER. Else it's
* NUMBER(precision, scale).
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return int Returns the precision as an integers.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return int Returns the precision as an integer
* @throws Oci8Exception
*
*/
-function oci_field_precision($statement, $field): int
+function oci_field_precision($statement, $column): int
{
error_clear_last();
- $result = \oci_field_precision($statement, $field);
+ $result = \oci_field_precision($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -779,22 +653,22 @@ function oci_field_precision($statement, $field): int
/**
- * Returns the scale of the column with field index.
+ * Returns the scale of the column with column index.
*
* For FLOAT columns, precision is nonzero and scale is -127.
* If precision is 0, then column is NUMBER. Else it's
* NUMBER(precision, scale).
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return int Returns the scale as an integers.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return int Returns the scale as an integer
* @throws Oci8Exception
*
*/
-function oci_field_scale($statement, $field): int
+function oci_field_scale($statement, $column): int
{
error_clear_last();
- $result = \oci_field_scale($statement, $field);
+ $result = \oci_field_scale($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -803,18 +677,18 @@ function oci_field_scale($statement, $field): int
/**
- * Returns the size of a field.
+ * Returns the size of a column.
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return int Returns the size of a field in bytess.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return int Returns the size of a column in bytes
* @throws Oci8Exception
*
*/
-function oci_field_size($statement, $field): int
+function oci_field_size($statement, $column): int
{
error_clear_last();
- $result = \oci_field_size($statement, $field);
+ $result = \oci_field_size($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -823,20 +697,20 @@ function oci_field_size($statement, $field): int
/**
- * Returns Oracle's raw "SQLT" data type of the field.
+ * Returns Oracle's raw "SQLT" data type of the column.
*
* If you want a field's type name, then use oci_field_type instead.
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return int Returns Oracle's raw data type as a numbers.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return int Returns Oracle's raw data type as a number
* @throws Oci8Exception
*
*/
-function oci_field_type_raw($statement, $field): int
+function oci_field_type_raw($statement, $column): int
{
error_clear_last();
- $result = \oci_field_type_raw($statement, $field);
+ $result = \oci_field_type_raw($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -848,15 +722,15 @@ function oci_field_type_raw($statement, $field): int
* Returns a field's data type name.
*
* @param resource $statement A valid OCI statement identifier.
- * @param mixed $field Can be the field's index (1-based) or name.
- * @return mixed Returns the field data type as a strings.
+ * @param mixed $column Can be the field's index (1-based) or name.
+ * @return mixed Returns the field data type as a string or an integer
* @throws Oci8Exception
*
*/
-function oci_field_type($statement, $field)
+function oci_field_type($statement, $column)
{
error_clear_last();
- $result = \oci_field_type($statement, $field);
+ $result = \oci_field_type($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -867,14 +741,14 @@ function oci_field_type($statement, $field)
/**
* Frees a descriptor allocated by oci_new_descriptor.
*
- * @param resource $descriptor
+ * @param \OCILob $lob Descriptor allocated by oci_new_descriptor.
* @throws Oci8Exception
*
*/
-function oci_free_descriptor($descriptor): void
+function oci_free_descriptor(\OCILob $lob): void
{
error_clear_last();
- $result = \oci_free_descriptor($descriptor);
+ $result = \oci_free_descriptor($lob);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -905,17 +779,21 @@ function oci_free_statement($statement): void
*
* @param resource $connection An Oracle connection identifier, returned by
* oci_connect or oci_pconnect.
- * @param string $tdo Should be a valid named type (uppercase).
+ * @param string $type_name Should be a valid named type (uppercase).
* @param string $schema Should point to the scheme, where the named type was created. The name
- * of the current user is the default value.
+ * of the current user is used when NULL is passed.
* @return \OCI-Collection Returns a new OCICollection object.
* @throws Oci8Exception
*
*/
-function oci_new_collection($connection, string $tdo, string $schema = null)
+function oci_new_collection($connection, string $type_name, string $schema = null)
{
error_clear_last();
- $result = \oci_new_collection($connection, $tdo, $schema);
+ if ($schema !== null) {
+ $result = \oci_new_collection($connection, $type_name, $schema);
+ } else {
+ $result = \oci_new_collection($connection, $type_name);
+ }
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -941,7 +819,7 @@ function oci_new_collection($connection, string $tdo, string $schema = null)
* the tnsnames.ora file, or the name of a local
* Oracle instance.
*
- * If not specified, PHP uses
+ * If not specified or NULL, PHP uses
* environment variables such as TWO_TASK (on Linux)
* or LOCAL (on Windows)
* and ORACLE_SID to determine the
@@ -954,19 +832,19 @@ function oci_new_collection($connection, string $tdo, string $schema = null)
* [//]host_name[:port][/service_name]. From Oracle
* 11g, the syntax is:
* [//]host_name[:port][/service_name][:server_type][/instance_name].
- * Service names can be found by running the Oracle
- * utility lsnrctl status on the database server
+ * Further options were introduced with Oracle 19c, including timeout and keep-alive
+ * settings. Refer to Oracle documentation. Service names can be found by running
+ * the Oracle utility lsnrctl status on the database server
* machine.
*
*
- * The tnsnames.ora file can be in the Oracle Net
- * search path, which
- * includes $ORACLE_HOME/network/admin
- * and /etc. Alternatively
- * set TNS_ADMIN so
- * that $TNS_ADMIN/tnsnames.ora is read. Make sure
- * the web daemon has read access to the file.
- * @param string $character_set Determines
+ * The tnsnames.ora file can be in the Oracle Net search path,
+ * which
+ * includes /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin
+ * and /etc. Alternatively set TNS_ADMIN
+ * so that $TNS_ADMIN/tnsnames.ora is read. Make sure the web
+ * daemon has read access to the file.
+ * @param string $encoding Determines
* the character set used by the Oracle Client libraries. The character
* set does not need to match the character set used by the database. If
* it doesn't match, Oracle will do its best to convert data to and from
@@ -1011,13 +889,13 @@ function oci_new_collection($connection, string $tdo, string $schema = null)
* @throws Oci8Exception
*
*/
-function oci_new_connect(string $username, string $password, string $connection_string = null, string $character_set = null, int $session_mode = null)
+function oci_new_connect(string $username, string $password, string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
- if ($session_mode !== null) {
- $result = \oci_new_connect($username, $password, $connection_string, $character_set, $session_mode);
- } elseif ($character_set !== null) {
- $result = \oci_new_connect($username, $password, $connection_string, $character_set);
+ if ($session_mode !== OCI_DEFAULT) {
+ $result = \oci_new_connect($username, $password, $connection_string, $encoding, $session_mode);
+ } elseif ($encoding !== "") {
+ $result = \oci_new_connect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$result = \oci_new_connect($username, $password, $connection_string);
} else {
@@ -1058,7 +936,7 @@ function oci_new_cursor($connection)
* @param int $type Valid values for type are:
* OCI_DTYPE_FILE, OCI_DTYPE_LOB and
* OCI_DTYPE_ROWID.
- * @return \OCI-Lob Returns a new LOB or FILE descriptor on success, FALSE on error.
+ * @return \OCI-Lob|false Returns a new LOB or FILE descriptor on success.
* @throws Oci8Exception
*
*/
@@ -1066,26 +944,7 @@ function oci_new_descriptor($connection, int $type = OCI_DTYPE_LOB)
{
error_clear_last();
$result = \oci_new_descriptor($connection, $type);
- if ($result === false) {
- throw Oci8Exception::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Gets the number of columns in the given statement.
- *
- * @param resource $statement A valid OCI statement identifier.
- * @return int Returns the number of columns as an integers.
- * @throws Oci8Exception
- *
- */
-function oci_num_fields($statement): int
-{
- error_clear_last();
- $result = \oci_num_fields($statement);
- if ($result === false) {
+ if ($result === null) {
throw Oci8Exception::createFromPhpError();
}
return $result;
@@ -1096,7 +955,7 @@ function oci_num_fields($statement): int
* Gets the number of rows affected during statement execution.
*
* @param resource $statement A valid OCI statement identifier.
- * @return int Returns the number of rows affected as an integers.
+ * @return int Returns the number of rows affected as an integer
* @throws Oci8Exception
*
*/
@@ -1112,7 +971,7 @@ function oci_num_rows($statement): int
/**
- * Prepares sql_text using
+ * Prepares sql using
* connection and returns the statement identifier,
* which can be used with oci_bind_by_name,
* oci_execute and other functions.
@@ -1123,7 +982,7 @@ function oci_num_rows($statement): int
*
* @param resource $connection An Oracle connection identifier, returned by
* oci_connect, oci_pconnect, or oci_new_connect.
- * @param string $sql_text The SQL or PL/SQL statement.
+ * @param string $sql The SQL or PL/SQL statement.
*
* SQL statements should not end with a
* semi-colon (";"). PL/SQL
@@ -1133,10 +992,10 @@ function oci_num_rows($statement): int
* @throws Oci8Exception
*
*/
-function oci_parse($connection, string $sql_text)
+function oci_parse($connection, string $sql)
{
error_clear_last();
- $result = \oci_parse($connection, $sql_text);
+ $result = \oci_parse($connection, $sql);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1147,11 +1006,12 @@ function oci_parse($connection, string $sql_text)
/**
* Creates a persistent connection to an Oracle server and logs on.
*
- * Persistent connections are cached and re-used between requests, resulting
- * in reduced overhead on each page load; a typical PHP application will have
- * a single persistent connection open against an Oracle server per Apache
- * child process (or PHP FastCGI/CGI process). See the Persistent Database
- * Connections section for more information.
+ * Persistent connections are cached and re-used between requests, resulting in
+ * reduced overhead on each page load; a typical PHP application will have a
+ * single persistent connection open against an Oracle server per Apache child
+ * process (or PHP FPM process). See the OCI8
+ * Connection Handling and Connection Pooling section for more
+ * information.
*
* @param string $username The Oracle user name.
* @param string $password The password for username.
@@ -1162,7 +1022,7 @@ function oci_parse($connection, string $sql_text)
* the tnsnames.ora file, or the name of a local
* Oracle instance.
*
- * If not specified, PHP uses
+ * If not specified or NULL, PHP uses
* environment variables such as TWO_TASK (on Linux)
* or LOCAL (on Windows)
* and ORACLE_SID to determine the
@@ -1175,19 +1035,19 @@ function oci_parse($connection, string $sql_text)
* [//]host_name[:port][/service_name]. From Oracle
* 11g, the syntax is:
* [//]host_name[:port][/service_name][:server_type][/instance_name].
- * Service names can be found by running the Oracle
- * utility lsnrctl status on the database server
+ * Further options were introduced with Oracle 19c, including timeout and keep-alive
+ * settings. Refer to Oracle documentation. Service names can be found by running
+ * the Oracle utility lsnrctl status on the database server
* machine.
*
*
- * The tnsnames.ora file can be in the Oracle Net
- * search path, which
- * includes $ORACLE_HOME/network/admin
- * and /etc. Alternatively
- * set TNS_ADMIN so
- * that $TNS_ADMIN/tnsnames.ora is read. Make sure
- * the web daemon has read access to the file.
- * @param string $character_set Determines
+ * The tnsnames.ora file can be in the Oracle Net search path,
+ * which
+ * includes /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin
+ * and /etc. Alternatively set TNS_ADMIN
+ * so that $TNS_ADMIN/tnsnames.ora is read. Make sure the web
+ * daemon has read access to the file.
+ * @param string $encoding Determines
* the character set used by the Oracle Client libraries. The character
* set does not need to match the character set used by the database. If
* it doesn't match, Oracle will do its best to convert data to and from
@@ -1232,13 +1092,13 @@ function oci_parse($connection, string $sql_text)
* @throws Oci8Exception
*
*/
-function oci_pconnect(string $username, string $password, string $connection_string = null, string $character_set = null, int $session_mode = null)
+function oci_pconnect(string $username, string $password, string $connection_string = null, string $encoding = "", int $session_mode = OCI_DEFAULT)
{
error_clear_last();
- if ($session_mode !== null) {
- $result = \oci_pconnect($username, $password, $connection_string, $character_set, $session_mode);
- } elseif ($character_set !== null) {
- $result = \oci_pconnect($username, $password, $connection_string, $character_set);
+ if ($session_mode !== OCI_DEFAULT) {
+ $result = \oci_pconnect($username, $password, $connection_string, $encoding, $session_mode);
+ } elseif ($encoding !== "") {
+ $result = \oci_pconnect($username, $password, $connection_string, $encoding);
} elseif ($connection_string !== null) {
$result = \oci_pconnect($username, $password, $connection_string);
} else {
@@ -1252,7 +1112,45 @@ function oci_pconnect(string $username, string $password, string $connection_str
/**
- * Returns the data from field in the current row,
+ * Registers a user-defined callback function to connection.
+ * If connection fails due to instance or network failure,
+ * the registered callback function will be invoked for several times during
+ * failover. See OCI8 Transparent Application Failover
+ * (TAF) Support for information.
+ *
+ * When oci_register_taf_callback is called multiple times,
+ * each registration overwrites the previous one.
+ *
+ * Use oci_unregister_taf_callback to explicitly unregister a
+ * user-defined callback.
+ *
+ * TAF callback registration will NOT be saved across
+ * persistent connections, therefore the callback needs to be re-registered for
+ * a new persistent connection.
+ *
+ * @param resource $connection An Oracle connection identifier.
+ * @param callable $callback A user-defined callback to register for Oracle TAF. It can be a
+ * string of the function name or a Closure (anonymous function).
+ *
+ * The interface of a TAF user-defined callback function is as follows:
+ *
+ * See the parameter description and an example on
+ * OCI8 Transparent Application Failover (TAF) Support page.
+ * @throws Oci8Exception
+ *
+ */
+function oci_register_taf_callback($connection, callable $callback): void
+{
+ error_clear_last();
+ $result = \oci_register_taf_callback($connection, $callback);
+ if ($result === false) {
+ throw Oci8Exception::createFromPhpError();
+ }
+}
+
+
+/**
+ * Returns the data from column in the current row,
* fetched by oci_fetch.
*
* For details on the data type mapping performed by
@@ -1260,7 +1158,7 @@ function oci_pconnect(string $username, string $password, string $connection_str
* supported by the driver
*
* @param resource $statement
- * @param mixed $field Can be either use the column number (1-based) or the column name.
+ * @param mixed $column Can be either use the column number (1-based) or the column name.
* The case of the column name must be the case that Oracle meta data
* describes the column as, which is uppercase for columns created
* case insensitively.
@@ -1269,10 +1167,10 @@ function oci_pconnect(string $username, string $password, string $connection_str
* @throws Oci8Exception
*
*/
-function oci_result($statement, $field): string
+function oci_result($statement, $column): string
{
error_clear_last();
- $result = \oci_result($statement, $field);
+ $result = \oci_result($statement, $column);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1349,14 +1247,14 @@ function oci_server_version($connection): string
* @param resource $connection An Oracle connection identifier,
* returned by oci_connect, oci_pconnect,
* or oci_new_connect.
- * @param string $action_name User chosen string up to 32 bytes long.
+ * @param string $action User chosen string up to 32 bytes long.
* @throws Oci8Exception
*
*/
-function oci_set_action($connection, string $action_name): void
+function oci_set_action($connection, string $action): void
{
error_clear_last();
- $result = \oci_set_action($connection, $action_name);
+ $result = \oci_set_action($connection, $action);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1391,14 +1289,14 @@ function oci_set_action($connection, string $action_name): void
* @param resource $connection An Oracle connection identifier,
* returned by oci_connect, oci_pconnect,
* or oci_new_connect.
- * @param int $time_out The maximum time in milliseconds that any single round-trip between PHP and Oracle Database may take.
+ * @param int $timeout The maximum time in milliseconds that any single round-trip between PHP and Oracle Database may take.
* @throws Oci8Exception
*
*/
-function oci_set_call_timeout($connection, int $time_out): void
+function oci_set_call_timeout($connection, int $timeout): void
{
error_clear_last();
- $result = \oci_set_call_timeout($connection, $time_out);
+ $result = \oci_set_call_timeout($connection, $timeout);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1426,14 +1324,14 @@ function oci_set_call_timeout($connection, int $time_out): void
* @param resource $connection An Oracle connection identifier,
* returned by oci_connect, oci_pconnect,
* or oci_new_connect.
- * @param string $client_identifier User chosen string up to 64 bytes long.
+ * @param string $client_id User chosen string up to 64 bytes long.
* @throws Oci8Exception
*
*/
-function oci_set_client_identifier($connection, string $client_identifier): void
+function oci_set_client_identifier($connection, string $client_id): void
{
error_clear_last();
- $result = \oci_set_client_identifier($connection, $client_identifier);
+ $result = \oci_set_client_identifier($connection, $client_id);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1485,14 +1383,14 @@ function oci_set_client_info($connection, string $client_info): void
* @param resource $connection An Oracle connection identifier,
* returned by oci_connect, oci_pconnect,
* or oci_new_connect.
- * @param string $dbop User chosen string.
+ * @param string $action User chosen string.
* @throws Oci8Exception
*
*/
-function oci_set_db_operation($connection, string $dbop): void
+function oci_set_db_operation($connection, string $action): void
{
error_clear_last();
- $result = \oci_set_db_operation($connection, $dbop);
+ $result = \oci_set_db_operation($connection, $action);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
@@ -1550,14 +1448,50 @@ function oci_set_edition(string $edition): void
* @param resource $connection An Oracle connection identifier,
* returned by oci_connect, oci_pconnect,
* or oci_new_connect.
- * @param string $module_name User chosen string up to 48 bytes long.
+ * @param string $name User chosen string up to 48 bytes long.
+ * @throws Oci8Exception
+ *
+ */
+function oci_set_module_name($connection, string $name): void
+{
+ error_clear_last();
+ $result = \oci_set_module_name($connection, $name);
+ if ($result === false) {
+ throw Oci8Exception::createFromPhpError();
+ }
+}
+
+
+/**
+ * Sets the internal buffer size used to fetch each CLOB or BLOB value when the
+ * implementation gets the internal Oracle LOB locator from the database after
+ * a successful query call to oci_execute and for each
+ * subsequent internal fetch request to the database. Increasing this value
+ * can improve the performance of fetching smaller LOBs by reducing round-trips
+ * between PHP and the database. Memory usage will change.
+ *
+ * The value affects LOBs returned as OCILob instances and also those returned
+ * using OCI_RETURN_LOBS.
+ *
+ * Call oci_set_prefetch_lob before
+ * calling oci_execute. If it is not called, the value
+ * of oci8.prefetch_lob_size
+ * is used.
+ *
+ * The LOB prefetch value should only be set with Oracle Database 12.2 or later.
+ *
+ * @param resource $statement A valid OCI8 statement
+ * identifier created by oci_parse and executed
+ * by oci_execute, or a REF
+ * CURSOR statement identifier.
+ * @param int $prefetch_lob_size The number of bytes of each LOB to be prefetched, &gt;= 0
* @throws Oci8Exception
*
*/
-function oci_set_module_name($connection, string $module_name): void
+function oci_set_prefetch_lob($statement, int $prefetch_lob_size): void
{
error_clear_last();
- $result = \oci_set_module_name($connection, $module_name);
+ $result = \oci_set_prefetch_lob($statement, $prefetch_lob_size);
if ($result === false) {
throw Oci8Exception::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/opcache.php b/vendor/thecodingmachine/safe/generated/opcache.php
index 04a58205f..dcac85493 100644
--- a/vendor/thecodingmachine/safe/generated/opcache.php
+++ b/vendor/thecodingmachine/safe/generated/opcache.php
@@ -9,14 +9,14 @@ use Safe\Exceptions\OpcacheException;
* executing it. This can be used to prime the cache after a Web server
* restart by pre-caching files that will be included in later requests.
*
- * @param string $file The path to the PHP script to be compiled.
+ * @param string $filename The path to the PHP script to be compiled.
* @throws OpcacheException
*
*/
-function opcache_compile_file(string $file): void
+function opcache_compile_file(string $filename): void
{
error_clear_last();
- $result = \opcache_compile_file($file);
+ $result = \opcache_compile_file($filename);
if ($result === false) {
throw OpcacheException::createFromPhpError();
}
@@ -24,17 +24,18 @@ function opcache_compile_file(string $file): void
/**
- * This function returns state information about the cache instance
+ * This function returns state information about the in-memory cache instance. It will not return any
+ * information about the file cache.
*
- * @param bool $get_scripts Include script specific state information
+ * @param bool $include_scripts Include script specific state information
* @return array Returns an array of information, optionally containing script specific state information.
* @throws OpcacheException
*
*/
-function opcache_get_status(bool $get_scripts = true): array
+function opcache_get_status(bool $include_scripts = true): array
{
error_clear_last();
- $result = \opcache_get_status($get_scripts);
+ $result = \opcache_get_status($include_scripts);
if ($result === false) {
throw OpcacheException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/openssl.php b/vendor/thecodingmachine/safe/generated/openssl.php
index 117b53d6a..b201ebc6c 100644
--- a/vendor/thecodingmachine/safe/generated/openssl.php
+++ b/vendor/thecodingmachine/safe/generated/openssl.php
@@ -7,15 +7,15 @@ use Safe\Exceptions\OpensslException;
/**
* Gets the cipher initialization vector (iv) length.
*
- * @param string $method The cipher method, see openssl_get_cipher_methods for a list of potential values.
+ * @param string $cipher_algo The cipher method, see openssl_get_cipher_methods for a list of potential values.
* @return int Returns the cipher length on success.
* @throws OpensslException
*
*/
-function openssl_cipher_iv_length(string $method): int
+function openssl_cipher_iv_length(string $cipher_algo): int
{
error_clear_last();
- $result = \openssl_cipher_iv_length($method);
+ $result = \openssl_cipher_iv_length($cipher_algo);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -24,13 +24,157 @@ function openssl_cipher_iv_length(string $method): int
/**
+ * Decrypts a CMS message.
+ *
+ * @param string $input_filename The name of a file containing encrypted content.
+ * @param string $output_filename The name of the file to deposit the decrypted content.
+ * @param $certificate The name of the file containing a certificate of the recipient.
+ * @param $private_key The name of the file containing a PKCS#8 key.
+ * @param int $encoding The encoding of the input file. One of OPENSSL_ENCODING_SMIME,
+ * OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM.
+ * @throws OpensslException
+ *
+ */
+function openssl_cms_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null, int $encoding = OPENSSL_ENCODING_SMIME): void
+{
+ error_clear_last();
+ if ($encoding !== OPENSSL_ENCODING_SMIME) {
+ $result = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key, $encoding);
+ } elseif ($private_key !== null) {
+ $result = \openssl_cms_decrypt($input_filename, $output_filename, $certificate, $private_key);
+ } else {
+ $result = \openssl_cms_decrypt($input_filename, $output_filename, $certificate);
+ }
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function encrypts content to one or more recipients,
+ * based on the certificates that are passed to it.
+ *
+ * @param string $input_filename The file to be encrypted.
+ * @param string $output_filename The output file.
+ * @param $certificate Recipients to encrypt to.
+ * @param $headers Headers to include when S/MIME is used.
+ * @param int $flags Flags to be passed to CMS_sign.
+ * @param int $encoding An encoding to output. One of OPENSSL_ENCODING_SMIME,
+ * OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM.
+ * @param int $cipher_algo A cypher to use.
+ * @throws OpensslException
+ *
+ */
+function openssl_cms_encrypt(string $input_filename, string $output_filename, $certificate, $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
+{
+ error_clear_last();
+ $result = \openssl_cms_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $encoding, $cipher_algo);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Performs the exact analog to openssl_pkcs7_read.
+ *
+ * @param string $input_filename
+ * @param array $certificates
+ * @throws OpensslException
+ *
+ */
+function openssl_cms_read(string $input_filename, array &$certificates): void
+{
+ error_clear_last();
+ $result = \openssl_cms_read($input_filename, $certificates);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function signs a file with an X.509 certificate and key.
+ *
+ * @param string $input_filename The name of the file to be signed.
+ * @param string $output_filename The name of the file to deposit the results.
+ * @param $certificate The signing certificate.
+ * See Key/Certificate parameters for a list of valid values.
+ * @param $private_key The key associated with certificate.
+ * See Key/Certificate parameters for a list of valid values.
+ * @param $headers An array of headers to be included in S/MIME output.
+ * @param int $flags Flags to be passed to cms_sign.
+ * @param int $encoding The encoding of the output file. One of OPENSSL_ENCODING_SMIME,
+ * OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM.
+ * @param $untrusted_certificates_filename Intermediate certificates to be included in the signature.
+ * @throws OpensslException
+ *
+ */
+function openssl_cms_sign(string $input_filename, string $output_filename, $certificate, $private_key, $headers, int $flags = 0, int $encoding = OPENSSL_ENCODING_SMIME, $untrusted_certificates_filename = null): void
+{
+ error_clear_last();
+ if ($untrusted_certificates_filename !== null) {
+ $result = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding, $untrusted_certificates_filename);
+ } else {
+ $result = \openssl_cms_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $encoding);
+ }
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function verifies a CMS signature, either attached or detached, with the specified encoding.
+ *
+ * @param string $input_filename The input file.
+ * @param int $flags Flags to pass to cms_verify.
+ * @param $certificates A file with the signer certificate and optionally intermediate certificates.
+ * @param array $ca_info An array containing self-signed certificate authority certificates.
+ * @param $untrusted_certificates_filename A file containing additional intermediate certificates.
+ * @param $content A file pointing to the content when signatures are detached.
+ * @param $pk7
+ * @param $sigfile A file to save the signature to.
+ * @param int $encoding The encoding of the input file. One of OPENSSL_ENCODING_SMIME,
+ * OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM.
+ * @throws OpensslException
+ *
+ */
+function openssl_cms_verify(string $input_filename, int $flags = 0, $certificates = null, array $ca_info = [], $untrusted_certificates_filename = null, $content = null, $pk7 = null, $sigfile = null, int $encoding = OPENSSL_ENCODING_SMIME): void
+{
+ error_clear_last();
+ if ($encoding !== OPENSSL_ENCODING_SMIME) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile, $encoding);
+ } elseif ($sigfile !== null) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7, $sigfile);
+ } elseif ($pk7 !== null) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content, $pk7);
+ } elseif ($content !== null) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename, $content);
+ } elseif ($untrusted_certificates_filename !== null) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info, $untrusted_certificates_filename);
+ } elseif ($ca_info !== []) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates, $ca_info);
+ } elseif ($certificates !== null) {
+ $result = \openssl_cms_verify($input_filename, $flags, $certificates);
+ } else {
+ $result = \openssl_cms_verify($input_filename, $flags);
+ }
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
* openssl_csr_export_to_file takes the Certificate
* Signing Request represented by csr and saves it
- * in PEM format into the file named by outfilename.
+ * in PEM format into the file named by output_filename.
*
* @param string|resource $csr See CSR parameters for a list of valid values.
- * @param string $outfilename Path to the output file.
- * @param bool $notext
+ * @param string $output_filename Path to the output file.
+ * @param bool $no_text
* The optional parameter notext affects
* the verbosity of the output; if it is FALSE, then additional human-readable
* information is included in the output. The default value of
@@ -38,10 +182,10 @@ function openssl_cipher_iv_length(string $method): int
* @throws OpensslException
*
*/
-function openssl_csr_export_to_file($csr, string $outfilename, bool $notext = true): void
+function openssl_csr_export_to_file($csr, string $output_filename, bool $no_text = true): void
{
error_clear_last();
- $result = \openssl_csr_export_to_file($csr, $outfilename, $notext);
+ $result = \openssl_csr_export_to_file($csr, $output_filename, $no_text);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -51,12 +195,12 @@ function openssl_csr_export_to_file($csr, string $outfilename, bool $notext = tr
/**
* openssl_csr_export takes the Certificate Signing
* Request represented by csr and stores it in
- * PEM format in out, which is passed by
+ * PEM format in output, which is passed by
* reference.
*
* @param string|resource $csr See CSR parameters for a list of valid values.
- * @param string|null $out on success, this string will contain the PEM encoded CSR
- * @param bool $notext
+ * @param string|null $output on success, this string will contain the PEM encoded CSR
+ * @param bool $no_text
* The optional parameter notext affects
* the verbosity of the output; if it is FALSE, then additional human-readable
* information is included in the output. The default value of
@@ -64,13 +208,34 @@ function openssl_csr_export_to_file($csr, string $outfilename, bool $notext = tr
* @throws OpensslException
*
*/
-function openssl_csr_export($csr, ?string &$out, bool $notext = true): void
+function openssl_csr_export($csr, ?string &$output, bool $no_text = true): void
+{
+ error_clear_last();
+ $result = \openssl_csr_export($csr, $output, $no_text);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * openssl_csr_get_public_key extracts the public key
+ * from csr and prepares it for use by other functions.
+ *
+ * @param string|resource $csr See CSR parameters for a list of valid values.
+ * @param bool $short_names This parameter is ignored
+ * @return resource Returns an OpenSSLAsymmetricKey on success.
+ * @throws OpensslException
+ *
+ */
+function openssl_csr_get_public_key($csr, bool $short_names = true)
{
error_clear_last();
- $result = \openssl_csr_export($csr, $out, $notext);
+ $result = \openssl_csr_get_public_key($csr, $short_names);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
+ return $result;
}
@@ -80,7 +245,7 @@ function openssl_csr_export($csr, ?string &$out, bool $notext = true): void
* including fields commonName (CN), organizationName (O), countryName (C) etc.
*
* @param string|resource $csr See CSR parameters for a list of valid values.
- * @param bool $use_shortnames shortnames controls how the data is indexed in the
+ * @param bool $short_names shortnames controls how the data is indexed in the
* array - if shortnames is TRUE (the default) then
* fields will be indexed with the short name form, otherwise, the long name
* form will be used - e.g.: CN is the shortname form of commonName.
@@ -88,10 +253,10 @@ function openssl_csr_export($csr, ?string &$out, bool $notext = true): void
* @throws OpensslException
*
*/
-function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
+function openssl_csr_get_subject($csr, bool $short_names = true): array
{
error_clear_last();
- $result = \openssl_csr_get_subject($csr, $use_shortnames);
+ $result = \openssl_csr_get_subject($csr, $short_names);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -101,21 +266,21 @@ function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
/**
* openssl_csr_new generates a new CSR (Certificate Signing Request)
- * based on the information provided by dn.
+ * based on the information provided by distinguished_names.
*
- * @param array $dn The Distinguished Name or subject fields to be used in the certificate.
- * @param resource $privkey privkey should be set to a private key that was
+ * @param array $distinguished_names The Distinguished Name or subject fields to be used in the certificate.
+ * @param resource $private_key private_key should be set to a private key that was
* previously generated by openssl_pkey_new (or
* otherwise obtained from the other openssl_pkey family of functions).
* The corresponding public portion of the key will be used to sign the
* CSR.
- * @param array $configargs By default, the information in your system openssl.conf
+ * @param array $options By default, the information in your system openssl.conf
* is used to initialize the request; you can specify a configuration file
* section by setting the config_section_section key of
- * configargs. You can also specify an alternative
+ * options. You can also specify an alternative
* openssl configuration file by setting the value of the
* config key to the path of the file you want to use.
- * The following keys, if present in configargs
+ * The following keys, if present in options
* behave as their equivalents in the openssl.conf, as
* listed in the table below.
*
@@ -123,7 +288,7 @@ function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
*
*
*
- * configargs key
+ * options key
* type
* openssl.conf equivalent
* description
@@ -151,14 +316,14 @@ function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
*
*
* private_key_bits
- * integer
+ * int
* default_bits
* Specifies how many bits should be used to generate a private
* key
*
*
* private_key_type
- * integer
+ * int
* none
* Specifies the type of private key to create. This can be one
* of OPENSSL_KEYTYPE_DSA,
@@ -170,13 +335,13 @@ function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
*
*
* encrypt_key
- * boolean
+ * bool
* encrypt_key
* Should an exported key (with passphrase) be encrypted?
*
*
* encrypt_key_cipher
- * integer
+ * int
* none
*
* One of cipher constants.
@@ -201,23 +366,23 @@ function openssl_csr_get_subject($csr, bool $use_shortnames = true): array
*
*
*
- * @param array $extraattribs extraattribs is used to specify additional
- * configuration options for the CSR. Both dn and
- * extraattribs are associative arrays whose keys are
+ * @param array $extra_attributes extra_attributes is used to specify additional
+ * configuration options for the CSR. Both distinguished_names and
+ * extra_attributes are associative arrays whose keys are
* converted to OIDs and applied to the relevant part of the request.
* @return resource Returns the CSR.
* @throws OpensslException
*
*/
-function openssl_csr_new(array $dn, &$privkey, array $configargs = null, array $extraattribs = null)
+function openssl_csr_new(array $distinguished_names, &$private_key, array $options = null, array $extra_attributes = null)
{
error_clear_last();
- if ($extraattribs !== null) {
- $result = \openssl_csr_new($dn, $privkey, $configargs, $extraattribs);
- } elseif ($configargs !== null) {
- $result = \openssl_csr_new($dn, $privkey, $configargs);
+ if ($extra_attributes !== null) {
+ $result = \openssl_csr_new($distinguished_names, $private_key, $options, $extra_attributes);
+ } elseif ($options !== null) {
+ $result = \openssl_csr_new($distinguished_names, $private_key, $options);
} else {
- $result = \openssl_csr_new($dn, $privkey);
+ $result = \openssl_csr_new($distinguished_names, $private_key);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -227,38 +392,37 @@ function openssl_csr_new(array $dn, &$privkey, array $configargs = null, array $
/**
- * openssl_csr_sign generates an x509 certificate
- * resource from the given CSR.
+ * openssl_csr_sign generates an x509 certificate from the given CSR.
*
* @param string|resource $csr A CSR previously generated by openssl_csr_new.
* It can also be the path to a PEM encoded CSR when specified as
* file://path/to/csr or an exported string generated
* by openssl_csr_export.
- * @param mixed $cacert The generated certificate will be signed by cacert.
- * If cacert is NULL, the generated certificate
+ * @param string|resource|null $ca_certificate The generated certificate will be signed by ca_certificate.
+ * If ca_certificate is NULL, the generated certificate
* will be a self-signed certificate.
- * @param string|resource|array $priv_key priv_key is the private key that corresponds to
- * cacert.
+ * @param string|resource|array $private_key private_key is the private key that corresponds to
+ * ca_certificate.
* @param int $days days specifies the length of time for which the
* generated certificate will be valid, in days.
- * @param array $configargs You can finetune the CSR signing by configargs.
+ * @param array $options You can finetune the CSR signing by options.
* See openssl_csr_new for more information about
- * configargs.
+ * options.
* @param int $serial An optional the serial number of issued certificate. If not specified
* it will default to 0.
- * @return resource Returns an x509 certificate resource on success, FALSE on failure.
+ * @return resource Returns an OpenSSLCertificate on success, FALSE on failure.
* @throws OpensslException
*
*/
-function openssl_csr_sign($csr, $cacert, $priv_key, int $days, array $configargs = null, int $serial = 0)
+function openssl_csr_sign($csr, $ca_certificate, $private_key, int $days, array $options = null, int $serial = 0)
{
error_clear_last();
if ($serial !== 0) {
- $result = \openssl_csr_sign($csr, $cacert, $priv_key, $days, $configargs, $serial);
- } elseif ($configargs !== null) {
- $result = \openssl_csr_sign($csr, $cacert, $priv_key, $days, $configargs);
+ $result = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options, $serial);
+ } elseif ($options !== null) {
+ $result = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days, $options);
} else {
- $result = \openssl_csr_sign($csr, $cacert, $priv_key, $days);
+ $result = \openssl_csr_sign($csr, $ca_certificate, $private_key, $days);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -271,23 +435,29 @@ function openssl_csr_sign($csr, $cacert, $priv_key, int $days, array $configargs
* Takes a raw or base64 encoded string and decrypts it using a given method and key.
*
* @param string $data The encrypted message to be decrypted.
- * @param string $method The cipher method. For a list of available cipher methods, use
+ * @param string $cipher_algo The cipher method. For a list of available cipher methods, use
* openssl_get_cipher_methods.
- * @param string $key The key.
+ * @param string $passphrase The key.
* @param int $options options can be one of
* OPENSSL_RAW_DATA,
* OPENSSL_ZERO_PADDING.
* @param string $iv A non-NULL Initialization Vector.
* @param string $tag The authentication tag in AEAD cipher mode. If it is incorrect, the authentication fails and the function returns FALSE.
- * @param string $aad Additional authentication data.
+ * @param string $aad Additional authenticated data.
* @return string The decrypted string on success.
* @throws OpensslException
*
*/
-function openssl_decrypt(string $data, string $method, string $key, int $options = 0, string $iv = "", string $tag = "", string $aad = ""): string
+function openssl_decrypt(string $data, string $cipher_algo, string $passphrase, int $options = 0, string $iv = "", string $tag = null, string $aad = ""): string
{
error_clear_last();
- $result = \openssl_decrypt($data, $method, $key, $options, $iv, $tag, $aad);
+ if ($aad !== "") {
+ $result = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag, $aad);
+ } elseif ($tag !== null) {
+ $result = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv, $tag);
+ } else {
+ $result = \openssl_decrypt($data, $cipher_algo, $passphrase, $options, $iv);
+ }
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -300,16 +470,16 @@ function openssl_decrypt(string $data, string $method, string $key, int $options
* often used as an encryption key to secretly communicate with a remote party.
* This is known as the Diffie-Hellman key exchange.
*
- * @param string $pub_key DH Public key of the remote party.
- * @param resource $dh_key A local DH private key, corresponding to the public key to be shared with the remote party.
+ * @param string $public_key DH Public key of the remote party.
+ * @param resource $private_key A local DH private key, corresponding to the public key to be shared with the remote party.
* @return string Returns shared secret on success.
* @throws OpensslException
*
*/
-function openssl_dh_compute_key(string $pub_key, $dh_key): string
+function openssl_dh_compute_key(string $public_key, $private_key): string
{
error_clear_last();
- $result = \openssl_dh_compute_key($pub_key, $dh_key);
+ $result = \openssl_dh_compute_key($public_key, $private_key);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -322,17 +492,79 @@ function openssl_dh_compute_key(string $pub_key, $dh_key): string
* and returns a raw or binhex encoded string.
*
* @param string $data The data.
- * @param string $method The digest method to use, e.g. "sha256", see openssl_get_md_methods for a list of available digest methods.
- * @param bool $raw_output Setting to TRUE will return as raw output data, otherwise the return
+ * @param string $digest_algo The digest method to use, e.g. "sha256", see openssl_get_md_methods for a list of available digest methods.
+ * @param bool $binary Setting to TRUE will return as raw output data, otherwise the return
* value is binhex encoded.
* @return string Returns the digested hash value on success.
* @throws OpensslException
*
*/
-function openssl_digest(string $data, string $method, bool $raw_output = false): string
+function openssl_digest(string $data, string $digest_algo, bool $binary = false): string
{
error_clear_last();
- $result = \openssl_digest($data, $method, $raw_output);
+ $result = \openssl_digest($data, $digest_algo, $binary);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets the list of available curve names for use in Elliptic curve
+ * cryptography (ECC) for public/private key operations. The two most widely
+ * standardized/supported curves are prime256v1
+ * (NIST P-256) and secp384r1 (NIST P-384).
+ *
+ * Approximate Equivalancies of AES, RSA, DSA and ECC Keysizes
+ *
+ *
+ *
+ * AES Symmetric Keysize (Bits)
+ * RSA and DSA Keysize (Bits)
+ * ECC Keysize (Bits)
+ *
+ *
+ *
+ *
+ * 80
+ * 1024
+ * 160
+ *
+ *
+ * 112
+ * 2048
+ * 224
+ *
+ *
+ * 128
+ * 3072
+ * 256
+ *
+ *
+ * 192
+ * 7680
+ * 384
+ *
+ *
+ * 256
+ * 15360
+ * 512
+ *
+ *
+ *
+ *
+ * NIST
+ * recommends using ECC curves with at least 256 bits.
+ *
+ * @return array An array of available curve names.
+ * @throws OpensslException
+ *
+ */
+function openssl_get_curve_names(): array
+{
+ error_clear_last();
+ $result = \openssl_get_curve_names();
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -342,31 +574,37 @@ function openssl_digest(string $data, string $method, bool $raw_output = false):
/**
* openssl_open opens (decrypts)
- * sealed_data using the private key associated with
- * the key identifier priv_key_id and the envelope key
- * env_key, and fills
- * open_data with the decrypted data.
+ * data using the private key associated with
+ * the key identifier private_key and the envelope key
+ * encrypted_key, and fills
+ * output with the decrypted data.
* The envelope key is generated when the
* data are sealed and can only be used by one specific private key. See
* openssl_seal for more information.
*
- * @param string $sealed_data
- * @param string|null $open_data If the call is successful the opened data is returned in this
+ * @param string $data
+ * @param string|null $output If the call is successful the opened data is returned in this
* parameter.
- * @param string $env_key
- * @param string|array|resource $priv_key_id
- * @param string $method The cipher method.
+ * @param string $encrypted_key
+ * @param string|array|resource $private_key
+ * @param string $cipher_algo The cipher method.
+ *
+ *
+ * The default value ('RC4') is considered insecure.
+ * It is strongly recommended to explicitly specify a secure cipher method.
+ *
+ *
* @param string $iv The initialization vector.
* @throws OpensslException
*
*/
-function openssl_open(string $sealed_data, ?string &$open_data, string $env_key, $priv_key_id, string $method = "RC4", string $iv = null): void
+function openssl_open(string $data, ?string &$output, string $encrypted_key, $private_key, string $cipher_algo, string $iv = null): void
{
error_clear_last();
if ($iv !== null) {
- $result = \openssl_open($sealed_data, $open_data, $env_key, $priv_key_id, $method, $iv);
+ $result = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo, $iv);
} else {
- $result = \openssl_open($sealed_data, $open_data, $env_key, $priv_key_id, $method);
+ $result = \openssl_open($data, $output, $encrypted_key, $private_key, $cipher_algo);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -383,15 +621,15 @@ function openssl_open(string $sealed_data, ?string &$open_data, string $env_key,
* @param int $key_length Length of desired output key.
* @param int $iterations The number of iterations desired. NIST
* recommends at least 10,000.
- * @param string $digest_algorithm Optional hash or digest algorithm from openssl_get_md_methods. Defaults to SHA-1.
+ * @param string $digest_algo Optional hash or digest algorithm from openssl_get_md_methods. Defaults to SHA-1.
* @return string Returns raw binary string.
* @throws OpensslException
*
*/
-function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algorithm = "sha1"): string
+function openssl_pbkdf2(string $password, string $salt, int $key_length, int $iterations, string $digest_algo = "sha1"): string
{
error_clear_last();
- $result = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algorithm);
+ $result = \openssl_pbkdf2($password, $salt, $key_length, $iterations, $digest_algo);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -401,15 +639,15 @@ function openssl_pbkdf2(string $password, string $salt, int $key_length, int $it
/**
* openssl_pkcs12_export_to_file stores
- * x509 into a file named by
- * filename in a PKCS#12 file format.
+ * certificate into a file named by
+ * output_filename in a PKCS#12 file format.
*
- * @param string|resource $x509 See Key/Certificate parameters for a list of valid values.
- * @param string $filename Path to the output file.
- * @param string|array|resource $priv_key Private key component of PKCS#12 file.
+ * @param string|resource $certificate See Key/Certificate parameters for a list of valid values.
+ * @param string $output_filename Path to the output file.
+ * @param string|array|resource $private_key Private key component of PKCS#12 file.
* See Public/Private Key parameters for a list of valid values.
- * @param string $pass Encryption password for unlocking the PKCS#12 file.
- * @param array $args Optional array, other keys will be ignored.
+ * @param string $passphrase Encryption password for unlocking the PKCS#12 file.
+ * @param array $options Optional array, other keys will be ignored.
*
*
*
@@ -433,14 +671,10 @@ function openssl_pbkdf2(string $password, string $salt, int $key_length, int $it
* @throws OpensslException
*
*/
-function openssl_pkcs12_export_to_file($x509, string $filename, $priv_key, string $pass, array $args = null): void
+function openssl_pkcs12_export_to_file($certificate, string $output_filename, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
- if ($args !== null) {
- $result = \openssl_pkcs12_export_to_file($x509, $filename, $priv_key, $pass, $args);
- } else {
- $result = \openssl_pkcs12_export_to_file($x509, $filename, $priv_key, $pass);
- }
+ $result = \openssl_pkcs12_export_to_file($certificate, $output_filename, $private_key, $passphrase, $options);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -449,15 +683,15 @@ function openssl_pkcs12_export_to_file($x509, string $filename, $priv_key, strin
/**
* openssl_pkcs12_export stores
- * x509 into a string named by
- * out in a PKCS#12 file format.
+ * certificate into a string named by
+ * output in a PKCS#12 file format.
*
- * @param string|resource $x509 See Key/Certificate parameters for a list of valid values.
- * @param string|null $out On success, this will hold the PKCS#12.
- * @param string|array|resource $priv_key Private key component of PKCS#12 file.
+ * @param string|resource $certificate See Key/Certificate parameters for a list of valid values.
+ * @param string|null $output On success, this will hold the PKCS#12.
+ * @param string|array|resource $private_key Private key component of PKCS#12 file.
* See Public/Private Key parameters for a list of valid values.
- * @param string $pass Encryption password for unlocking the PKCS#12 file.
- * @param array $args Optional array, other keys will be ignored.
+ * @param string $passphrase Encryption password for unlocking the PKCS#12 file.
+ * @param array $options Optional array, other keys will be ignored.
*
*
*
@@ -481,14 +715,10 @@ function openssl_pkcs12_export_to_file($x509, string $filename, $priv_key, strin
* @throws OpensslException
*
*/
-function openssl_pkcs12_export($x509, ?string &$out, $priv_key, string $pass, array $args = null): void
+function openssl_pkcs12_export($certificate, ?string &$output, $private_key, string $passphrase, array $options = []): void
{
error_clear_last();
- if ($args !== null) {
- $result = \openssl_pkcs12_export($x509, $out, $priv_key, $pass, $args);
- } else {
- $result = \openssl_pkcs12_export($x509, $out, $priv_key, $pass);
- }
+ $result = \openssl_pkcs12_export($certificate, $output, $private_key, $passphrase, $options);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -498,18 +728,18 @@ function openssl_pkcs12_export($x509, ?string &$out, $priv_key, string $pass, ar
/**
* openssl_pkcs12_read parses the PKCS#12 certificate store supplied by
* pkcs12 into a array named
- * certs.
+ * certificates.
*
* @param string $pkcs12 The certificate store contents, not its file name.
- * @param array|null $certs On success, this will hold the Certificate Store Data.
- * @param string $pass Encryption password for unlocking the PKCS#12 file.
+ * @param array|null $certificates On success, this will hold the Certificate Store Data.
+ * @param string $passphrase Encryption password for unlocking the PKCS#12 file.
* @throws OpensslException
*
*/
-function openssl_pkcs12_read(string $pkcs12, ?array &$certs, string $pass): void
+function openssl_pkcs12_read(string $pkcs12, ?array &$certificates, string $passphrase): void
{
error_clear_last();
- $result = \openssl_pkcs12_read($pkcs12, $certs, $pass);
+ $result = \openssl_pkcs12_read($pkcs12, $certificates, $passphrase);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -518,25 +748,25 @@ function openssl_pkcs12_read(string $pkcs12, ?array &$certs, string $pass): void
/**
* Decrypts the S/MIME encrypted message contained in the file specified by
- * infilename using the certificate and its
- * associated private key specified by recipcert and
- * recipkey.
- *
- * @param string $infilename
- * @param string $outfilename The decrypted message is written to the file specified by
- * outfilename.
- * @param string|resource $recipcert
- * @param string|resource|array $recipkey
+ * input_filename using the certificate and its
+ * associated private key specified by certificate and
+ * private_key.
+ *
+ * @param string $input_filename
+ * @param string $output_filename The decrypted message is written to the file specified by
+ * output_filename.
+ * @param string|resource $certificate
+ * @param string|resource|array $private_key
* @throws OpensslException
*
*/
-function openssl_pkcs7_decrypt(string $infilename, string $outfilename, $recipcert, $recipkey = null): void
+function openssl_pkcs7_decrypt(string $input_filename, string $output_filename, $certificate, $private_key = null): void
{
error_clear_last();
- if ($recipkey !== null) {
- $result = \openssl_pkcs7_decrypt($infilename, $outfilename, $recipcert, $recipkey);
+ if ($private_key !== null) {
+ $result = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate, $private_key);
} else {
- $result = \openssl_pkcs7_decrypt($infilename, $outfilename, $recipcert);
+ $result = \openssl_pkcs7_decrypt($input_filename, $output_filename, $certificate);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -546,13 +776,13 @@ function openssl_pkcs7_decrypt(string $infilename, string $outfilename, $recipce
/**
* openssl_pkcs7_encrypt takes the contents of the
- * file named infile and encrypts them using an RC2
+ * file named input_filename and encrypts them using an RC2
* 40-bit cipher so that they can only be read by the intended recipients
- * specified by recipcerts.
+ * specified by certificate.
*
- * @param string $infile
- * @param string $outfile
- * @param string|resource|array $recipcerts Either a lone X.509 certificate, or an array of X.509 certificates.
+ * @param string $input_filename
+ * @param string $output_filename
+ * @param string|resource|array $certificate Either a lone X.509 certificate, or an array of X.509 certificates.
* @param array $headers headers is an array of headers that
* will be prepended to the data after it has been encrypted.
*
@@ -562,14 +792,14 @@ function openssl_pkcs7_decrypt(string $infilename, string $outfilename, $recipce
* @param int $flags flags can be used to specify options that affect
* the encoding process - see PKCS7
* constants.
- * @param int $cipherid One of cipher constants.
+ * @param int $cipher_algo One of cipher constants.
* @throws OpensslException
*
*/
-function openssl_pkcs7_encrypt(string $infile, string $outfile, $recipcerts, array $headers, int $flags = 0, int $cipherid = OPENSSL_CIPHER_RC2_40): void
+function openssl_pkcs7_encrypt(string $input_filename, string $output_filename, $certificate, array $headers, int $flags = 0, int $cipher_algo = OPENSSL_CIPHER_AES_128_CBC): void
{
error_clear_last();
- $result = \openssl_pkcs7_encrypt($infile, $outfile, $recipcerts, $headers, $flags, $cipherid);
+ $result = \openssl_pkcs7_encrypt($input_filename, $output_filename, $certificate, $headers, $flags, $cipher_algo);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -579,15 +809,15 @@ function openssl_pkcs7_encrypt(string $infile, string $outfile, $recipcerts, arr
/**
*
*
- * @param string $infilename
- * @param array|null $certs
+ * @param string $data The string of data you wish to parse (p7b format).
+ * @param array|null $certificates The array of PEM certificates from the p7b input data.
* @throws OpensslException
*
*/
-function openssl_pkcs7_read(string $infilename, ?array &$certs): void
+function openssl_pkcs7_read(string $data, ?array &$certificates): void
{
error_clear_last();
- $result = \openssl_pkcs7_read($infilename, $certs);
+ $result = \openssl_pkcs7_read($data, $certificates);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -596,35 +826,35 @@ function openssl_pkcs7_read(string $infilename, ?array &$certs): void
/**
* openssl_pkcs7_sign takes the contents of the file
- * named infilename and signs them using the
+ * named input_filename and signs them using the
* certificate and its matching private key specified by
- * signcert and privkey
+ * certificate and private_key
* parameters.
*
- * @param string $infilename The input file you are intending to digitally sign.
- * @param string $outfilename The file which the digital signature will be written to.
- * @param string|resource $signcert The X.509 certificate used to digitally sign infilename.
+ * @param string $input_filename The input file you are intending to digitally sign.
+ * @param string $output_filename The file which the digital signature will be written to.
+ * @param string|resource $certificate The X.509 certificate used to digitally sign input_filename.
* See Key/Certificate parameters for a list of valid values.
- * @param string|resource|array $privkey privkey is the private key corresponding to signcert.
+ * @param string|resource|array $private_key private_key is the private key corresponding to certificate.
* See Public/Private Key parameters for a list of valid values.
* @param array $headers headers is an array of headers that
* will be prepended to the data after it has been signed (see
* openssl_pkcs7_encrypt for more information about
* the format of this parameter).
* @param int $flags flags can be used to alter the output - see PKCS7 constants.
- * @param string $extracerts extracerts specifies the name of a file containing
+ * @param string $untrusted_certificates_filename untrusted_certificates_filename specifies the name of a file containing
* a bunch of extra certificates to include in the signature which can for
* example be used to help the recipient to verify the certificate that you used.
* @throws OpensslException
*
*/
-function openssl_pkcs7_sign(string $infilename, string $outfilename, $signcert, $privkey, array $headers, int $flags = PKCS7_DETACHED, string $extracerts = null): void
+function openssl_pkcs7_sign(string $input_filename, string $output_filename, $certificate, $private_key, array $headers, int $flags = PKCS7_DETACHED, string $untrusted_certificates_filename = null): void
{
error_clear_last();
- if ($extracerts !== null) {
- $result = \openssl_pkcs7_sign($infilename, $outfilename, $signcert, $privkey, $headers, $flags, $extracerts);
+ if ($untrusted_certificates_filename !== null) {
+ $result = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags, $untrusted_certificates_filename);
} else {
- $result = \openssl_pkcs7_sign($infilename, $outfilename, $signcert, $privkey, $headers, $flags);
+ $result = \openssl_pkcs7_sign($input_filename, $output_filename, $certificate, $private_key, $headers, $flags);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -633,30 +863,54 @@ function openssl_pkcs7_sign(string $infilename, string $outfilename, $signcert,
/**
+ * openssl_pkey_derive takes a set of a public_key
+ * and private_key and derives a shared secret, for either DH or EC keys.
+ *
+ * @param resource $public_key public_key is the public key for the derivation.
+ * See Public/Private Key parameters for a list of valid values.
+ * @param resource $private_key private_key is the private key for the derivation.
+ * See Public/Private Key parameters for a list of valid values.
+ * @param int $key_length If not zero, will set the desired length of the derived secret.
+ * @return string The derived secret on success.
+ * @throws OpensslException
+ *
+ */
+function openssl_pkey_derive($public_key, $private_key, int $key_length = 0): string
+{
+ error_clear_last();
+ $result = \openssl_pkey_derive($public_key, $private_key, $key_length);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* openssl_pkey_export_to_file saves an ascii-armoured
* (PEM encoded) rendition of key into the file named
- * by outfilename.
+ * by output_filename.
*
* @param resource|string|array $key
- * @param string $outfilename Path to the output file.
- * @param string $passphrase The key can be optionally protected by a
+ * @param string $output_filename Path to the output file.
+ * @param string|null $passphrase The key can be optionally protected by a
* passphrase.
- * @param array $configargs configargs can be used to fine-tune the export
+ * @param array $options options can be used to fine-tune the export
* process by specifying and/or overriding options for the openssl
* configuration file. See openssl_csr_new for more
- * information about configargs.
+ * information about options.
* @throws OpensslException
*
*/
-function openssl_pkey_export_to_file($key, string $outfilename, string $passphrase = null, array $configargs = null): void
+function openssl_pkey_export_to_file($key, string $output_filename, ?string $passphrase = null, array $options = null): void
{
error_clear_last();
- if ($configargs !== null) {
- $result = \openssl_pkey_export_to_file($key, $outfilename, $passphrase, $configargs);
+ if ($options !== null) {
+ $result = \openssl_pkey_export_to_file($key, $output_filename, $passphrase, $options);
} elseif ($passphrase !== null) {
- $result = \openssl_pkey_export_to_file($key, $outfilename, $passphrase);
+ $result = \openssl_pkey_export_to_file($key, $output_filename, $passphrase);
} else {
- $result = \openssl_pkey_export_to_file($key, $outfilename);
+ $result = \openssl_pkey_export_to_file($key, $output_filename);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -667,27 +921,27 @@ function openssl_pkey_export_to_file($key, string $outfilename, string $passphra
/**
* openssl_pkey_export exports
* key as a PEM encoded string and stores it into
- * out (which is passed by reference).
+ * output (which is passed by reference).
*
* @param resource $key
- * @param string|null $out
- * @param string $passphrase The key is optionally protected by passphrase.
- * @param array $configargs configargs can be used to fine-tune the export
+ * @param string|null $output
+ * @param string|null $passphrase The key is optionally protected by passphrase.
+ * @param array $options options can be used to fine-tune the export
* process by specifying and/or overriding options for the openssl
* configuration file. See openssl_csr_new for more
- * information about configargs.
+ * information about options.
* @throws OpensslException
*
*/
-function openssl_pkey_export($key, ?string &$out, string $passphrase = null, array $configargs = null): void
+function openssl_pkey_export($key, ?string &$output, ?string $passphrase = null, array $options = null): void
{
error_clear_last();
- if ($configargs !== null) {
- $result = \openssl_pkey_export($key, $out, $passphrase, $configargs);
+ if ($options !== null) {
+ $result = \openssl_pkey_export($key, $output, $passphrase, $options);
} elseif ($passphrase !== null) {
- $result = \openssl_pkey_export($key, $out, $passphrase);
+ $result = \openssl_pkey_export($key, $output, $passphrase);
} else {
- $result = \openssl_pkey_export($key, $out);
+ $result = \openssl_pkey_export($key, $output);
}
if ($result === false) {
throw OpensslException::createFromPhpError();
@@ -697,9 +951,9 @@ function openssl_pkey_export($key, ?string &$out, string $passphrase = null, arr
/**
* openssl_pkey_get_private parses
- * key and prepares it for use by other functions.
+ * private_key and prepares it for use by other functions.
*
- * @param string $key key can be one of the following:
+ * @param string $private_key private_key can be one of the following:
*
* a string having the format
* file://path/to/file.pem. The named file must
@@ -710,14 +964,18 @@ function openssl_pkey_export($key, ?string &$out, string $passphrase = null, arr
*
* @param string $passphrase The optional parameter passphrase must be used
* if the specified key is encrypted (protected by a passphrase).
- * @return resource Returns a positive key resource identifier on success.
+ * @return resource Returns an OpenSSLAsymmetricKey instance on success.
* @throws OpensslException
*
*/
-function openssl_pkey_get_private(string $key, string $passphrase = "")
+function openssl_pkey_get_private(string $private_key, string $passphrase = null)
{
error_clear_last();
- $result = \openssl_pkey_get_private($key, $passphrase);
+ if ($passphrase !== null) {
+ $result = \openssl_pkey_get_private($private_key, $passphrase);
+ } else {
+ $result = \openssl_pkey_get_private($private_key);
+ }
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -727,12 +985,12 @@ function openssl_pkey_get_private(string $key, string $passphrase = "")
/**
* openssl_pkey_get_public extracts the public key from
- * certificate and prepares it for use by other
+ * public_key and prepares it for use by other
* functions.
*
- * @param resource|string $certificate certificate can be one of the following:
+ * @param resource|string $public_key public_key can be one of the following:
*
- * an X.509 certificate resource
+ * an OpenSSLAsymmetricKey instance
* a string having the format
* file://path/to/file.pem. The named file must
* contain a PEM encoded certificate/public key (it may contain both).
@@ -740,14 +998,14 @@ function openssl_pkey_get_private(string $key, string $passphrase = "")
*
* A PEM formatted public key.
*
- * @return resource Returns a positive key resource identifier on success.
+ * @return resource Returns an OpenSSLAsymmetricKey instance on success.
* @throws OpensslException
*
*/
-function openssl_pkey_get_public($certificate)
+function openssl_pkey_get_public($public_key)
{
error_clear_last();
- $result = \openssl_pkey_get_public($certificate);
+ $result = \openssl_pkey_get_public($public_key);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -756,23 +1014,23 @@ function openssl_pkey_get_public($certificate)
/**
- * openssl_pkey_new generates a new private and public
- * key pair. The public component of the key can be obtained using
- * openssl_pkey_get_public.
+ * openssl_pkey_new generates a new private
+ * key.
+ * How to obtain the public component of the key is shown in an example below.
*
- * @param array $configargs You can finetune the key generation (such as specifying the number of
- * bits) using configargs. See
+ * @param array $options You can finetune the key generation (such as specifying the number of
+ * bits) using options. See
* openssl_csr_new for more information about
- * configargs.
- * @return resource Returns a resource identifier for the pkey on success.
+ * options.
+ * @return resource Returns an OpenSSLAsymmetricKey instance for the pkey on success.
* @throws OpensslException
*
*/
-function openssl_pkey_new(array $configargs = null)
+function openssl_pkey_new(array $options = null)
{
error_clear_last();
- if ($configargs !== null) {
- $result = \openssl_pkey_new($configargs);
+ if ($options !== null) {
+ $result = \openssl_pkey_new($options);
} else {
$result = \openssl_pkey_new();
}
@@ -787,13 +1045,13 @@ function openssl_pkey_new(array $configargs = null)
* openssl_private_decrypt decrypts
* data that was previously encrypted via
* openssl_public_encrypt and stores the result into
- * decrypted.
+ * decrypted_data.
*
* You can use this function e.g. to decrypt data which is supposed to only be available to you.
*
* @param string $data
- * @param string|null $decrypted
- * @param string|resource|array $key key must be the private key corresponding that
+ * @param string|null $decrypted_data
+ * @param string|resource|array $private_key private_key must be the private key corresponding that
* was used to encrypt the data.
* @param int $padding padding can be one of
* OPENSSL_PKCS1_PADDING,
@@ -803,10 +1061,10 @@ function openssl_pkey_new(array $configargs = null)
* @throws OpensslException
*
*/
-function openssl_private_decrypt(string $data, ?string &$decrypted, $key, int $padding = OPENSSL_PKCS1_PADDING): void
+function openssl_private_decrypt(string $data, ?string &$decrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
- $result = \openssl_private_decrypt($data, $decrypted, $key, $padding);
+ $result = \openssl_private_decrypt($data, $decrypted_data, $private_key, $padding);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -815,26 +1073,26 @@ function openssl_private_decrypt(string $data, ?string &$decrypted, $key, int $p
/**
* openssl_private_encrypt encrypts data
- * with private key and stores the result into
- * crypted. Encrypted data can be decrypted via
+ * with private private_key and stores the result into
+ * encrypted_data. Encrypted data can be decrypted via
* openssl_public_decrypt.
*
* This function can be used e.g. to sign data (or its hash) to prove that it
* is not written by someone else.
*
* @param string $data
- * @param string|null $crypted
- * @param string|resource|array $key
+ * @param string|null $encrypted_data
+ * @param string|resource|array $private_key
* @param int $padding padding can be one of
* OPENSSL_PKCS1_PADDING,
* OPENSSL_NO_PADDING.
* @throws OpensslException
*
*/
-function openssl_private_encrypt(string $data, ?string &$crypted, $key, int $padding = OPENSSL_PKCS1_PADDING): void
+function openssl_private_encrypt(string $data, ?string &$encrypted_data, $private_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
- $result = \openssl_private_encrypt($data, $crypted, $key, $padding);
+ $result = \openssl_private_encrypt($data, $encrypted_data, $private_key, $padding);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -845,14 +1103,14 @@ function openssl_private_encrypt(string $data, ?string &$crypted, $key, int $pad
* openssl_public_decrypt decrypts
* data that was previous encrypted via
* openssl_private_encrypt and stores the result into
- * decrypted.
+ * decrypted_data.
*
* You can use this function e.g. to check if the message was written by the
* owner of the private key.
*
* @param string $data
- * @param string|null $decrypted
- * @param string|resource $key key must be the public key corresponding that
+ * @param string|null $decrypted_data
+ * @param string|resource $public_key public_key must be the public key corresponding that
* was used to encrypt the data.
* @param int $padding padding can be one of
* OPENSSL_PKCS1_PADDING,
@@ -860,10 +1118,10 @@ function openssl_private_encrypt(string $data, ?string &$crypted, $key, int $pad
* @throws OpensslException
*
*/
-function openssl_public_decrypt(string $data, ?string &$decrypted, $key, int $padding = OPENSSL_PKCS1_PADDING): void
+function openssl_public_decrypt(string $data, ?string &$decrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
- $result = \openssl_public_decrypt($data, $decrypted, $key, $padding);
+ $result = \openssl_public_decrypt($data, $decrypted_data, $public_key, $padding);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -872,8 +1130,8 @@ function openssl_public_decrypt(string $data, ?string &$decrypted, $key, int $pa
/**
* openssl_public_encrypt encrypts data
- * with public key and stores the result into
- * crypted. Encrypted data can be decrypted via
+ * with public public_key and stores the result into
+ * encrypted_data. Encrypted data can be decrypted via
* openssl_private_decrypt.
*
* This function can be used e.g. to encrypt message which can be then read
@@ -881,8 +1139,8 @@ function openssl_public_decrypt(string $data, ?string &$decrypted, $key, int $pa
* in database.
*
* @param string $data
- * @param string|null $crypted This will hold the result of the encryption.
- * @param string|resource $key The public key.
+ * @param string|null $encrypted_data This will hold the result of the encryption.
+ * @param string|resource $public_key The public key.
* @param int $padding padding can be one of
* OPENSSL_PKCS1_PADDING,
* OPENSSL_SSLV23_PADDING,
@@ -891,10 +1149,10 @@ function openssl_public_decrypt(string $data, ?string &$decrypted, $key, int $pa
* @throws OpensslException
*
*/
-function openssl_public_encrypt(string $data, ?string &$crypted, $key, int $padding = OPENSSL_PKCS1_PADDING): void
+function openssl_public_encrypt(string $data, ?string &$encrypted_data, $public_key, int $padding = OPENSSL_PKCS1_PADDING): void
{
error_clear_last();
- $result = \openssl_public_encrypt($data, $crypted, $key, $padding);
+ $result = \openssl_public_encrypt($data, $encrypted_data, $public_key, $padding);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -906,22 +1164,22 @@ function openssl_public_encrypt(string $data, ?string &$crypted, $key, int $padd
* determined by the length parameter.
*
* It also indicates if a cryptographically strong algorithm was used to produce the
- * pseudo-random bytes, and does this via the optional crypto_strong
+ * pseudo-random bytes, and does this via the optional strong_result
* parameter. It's rare for this to be FALSE, but some systems may be broken or old.
*
* @param int $length The length of the desired string of bytes. Must be a positive integer. PHP will
* try to cast this parameter to a non-null integer to use it.
- * @param bool|null $crypto_strong If passed into the function, this will hold a boolean value that determines
+ * @param bool|null $strong_result If passed into the function, this will hold a bool value that determines
* if the algorithm used was "cryptographically strong", e.g., safe for usage with GPG,
* passwords, etc. TRUE if it did, otherwise FALSE
* @return string Returns the generated string of bytes on success.
* @throws OpensslException
*
*/
-function openssl_random_pseudo_bytes(int $length, ?bool &$crypto_strong = null): string
+function openssl_random_pseudo_bytes(int $length, ?bool &$strong_result = null): string
{
error_clear_last();
- $result = \openssl_random_pseudo_bytes($length, $crypto_strong);
+ $result = \openssl_random_pseudo_bytes($length, $strong_result);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -931,32 +1189,38 @@ function openssl_random_pseudo_bytes(int $length, ?bool &$crypto_strong = null):
/**
* openssl_seal seals (encrypts)
- * data by using the given method with a randomly generated
+ * data by using the given cipher_algo with a randomly generated
* secret key. The key is encrypted with each of the public keys
- * associated with the identifiers in pub_key_ids
+ * associated with the identifiers in public_key
* and each encrypted key is returned
- * in env_keys. This means that one can send
+ * in encrypted_keys. This means that one can send
* sealed data to multiple recipients (provided one has obtained their
* public keys). Each recipient must receive both the sealed data and
* the envelope key that was encrypted with the recipient's public key.
*
* @param string $data The data to seal.
* @param string|null $sealed_data The sealed data.
- * @param array $env_keys Array of encrypted keys.
- * @param array $pub_key_ids Array of public key resource identifiers.
- * @param string $method The cipher method.
- * @param string $iv The initialization vector.
+ * @param array|null $encrypted_keys Array of encrypted keys.
+ * @param array $public_key Array of OpenSSLAsymmetricKey instances containing public keys.
+ * @param string $cipher_algo The cipher method.
+ *
+ *
+ * The default value ('RC4') is considered insecure.
+ * It is strongly recommended to explicitly specify a secure cipher method.
+ *
+ *
+ * @param string|null $iv The initialization vector.
* @return int Returns the length of the sealed data on success.
* If successful the sealed data is returned in
* sealed_data, and the envelope keys in
- * env_keys.
+ * encrypted_keys.
* @throws OpensslException
*
*/
-function openssl_seal(string $data, ?string &$sealed_data, array &$env_keys, array $pub_key_ids, string $method = "RC4", string &$iv = null): int
+function openssl_seal(string $data, ?string &$sealed_data, ?array &$encrypted_keys, array $public_key, string $cipher_algo, ?string &$iv = null): int
{
error_clear_last();
- $result = \openssl_seal($data, $sealed_data, $env_keys, $pub_key_ids, $method, $iv);
+ $result = \openssl_seal($data, $sealed_data, $encrypted_keys, $public_key, $cipher_algo, $iv);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -968,39 +1232,151 @@ function openssl_seal(string $data, ?string &$sealed_data, array &$env_keys, arr
* openssl_sign computes a signature for the
* specified data by generating a cryptographic
* digital signature using the private key associated with
- * priv_key_id. Note that the data itself is
+ * private_key. Note that the data itself is
* not encrypted.
*
* @param string $data The string of data you wish to sign
* @param string|null $signature If the call was successful the signature is returned in
* signature.
- * @param resource|string $priv_key_id resource - a key, returned by openssl_get_privatekey
+ * @param resource|string $private_key OpenSSLAsymmetricKey - a key, returned by openssl_get_privatekey
*
* string - a PEM formatted key
- * @param int|string $signature_alg int - one of these Signature Algorithms.
+ * @param int|string $algorithm int - one of these Signature Algorithms.
*
* string - a valid string returned by openssl_get_md_methods example, "sha256WithRSAEncryption" or "sha384".
* @throws OpensslException
*
*/
-function openssl_sign(string $data, ?string &$signature, $priv_key_id, $signature_alg = OPENSSL_ALGO_SHA1): void
+function openssl_sign(string $data, ?string &$signature, $private_key, $algorithm = OPENSSL_ALGO_SHA1): void
+{
+ error_clear_last();
+ $result = \openssl_sign($data, $signature, $private_key, $algorithm);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Exports challenge from encoded signed public key and challenge
+ *
+ * @param string $spki Expects a valid signed public key and challenge
+ * @return string|null Returns the associated challenge string.
+ * @throws OpensslException
+ *
+ */
+function openssl_spki_export_challenge(string $spki): ?string
+{
+ error_clear_last();
+ $result = \openssl_spki_export_challenge($spki);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Exports PEM formatted public key from encoded signed public key and challenge
+ *
+ * @param string $spki Expects a valid signed public key and challenge
+ * @return string|null Returns the associated PEM formatted public key.
+ * @throws OpensslException
+ *
+ */
+function openssl_spki_export(string $spki): ?string
+{
+ error_clear_last();
+ $result = \openssl_spki_export($spki);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Generates a signed public key and challenge using specified hashing algorithm
+ *
+ * @param resource $private_key private_key should be set to a private key that was
+ * previously generated by openssl_pkey_new (or
+ * otherwise obtained from the other openssl_pkey family of functions).
+ * The corresponding public portion of the key will be used to sign the
+ * CSR.
+ * @param string $challenge The challenge associated to associate with the SPKAC
+ * @param int $digest_algo The digest algorithm. See openssl_get_md_method().
+ * @return string|null Returns a signed public key and challenge string.
+ * @throws OpensslException
+ *
+ */
+function openssl_spki_new($private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): ?string
+{
+ error_clear_last();
+ $result = \openssl_spki_new($private_key, $challenge, $digest_algo);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Validates the supplied signed public key and challenge
+ *
+ * @param string $spki Expects a valid signed public key and challenge
+ * @throws OpensslException
+ *
+ */
+function openssl_spki_verify(string $spki): void
+{
+ error_clear_last();
+ $result = \openssl_spki_verify($spki);
+ if ($result === false) {
+ throw OpensslException::createFromPhpError();
+ }
+}
+
+
+/**
+ * openssl_verify verifies that the
+ * signature is correct for the specified
+ * data using the public key associated with
+ * public_key. This must be the public key
+ * corresponding to the private key used for signing.
+ *
+ * @param string $data The string of data used to generate the signature previously
+ * @param string $signature A raw binary string, generated by openssl_sign or similar means
+ * @param resource|string $public_key OpenSSLAsymmetricKey - a key, returned by openssl_get_publickey
+ *
+ * string - a PEM formatted key, example, "-----BEGIN PUBLIC KEY-----
+ * MIIBCgK..."
+ * @param int|string $algorithm int - one of these Signature Algorithms.
+ *
+ * string - a valid string returned by openssl_get_md_methods example, "sha1WithRSAEncryption" or "sha512".
+ * @return int Returns 1 if the signature is correct, 0 if it is incorrect, and
+ * -1.
+ * @throws OpensslException
+ *
+ */
+function openssl_verify(string $data, string $signature, $public_key, $algorithm = OPENSSL_ALGO_SHA1): int
{
error_clear_last();
- $result = \openssl_sign($data, $signature, $priv_key_id, $signature_alg);
+ $result = \openssl_verify($data, $signature, $public_key, $algorithm);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
+ return $result;
}
/**
* openssl_x509_export_to_file stores
- * x509 into a file named by
- * outfilename in a PEM encoded format.
+ * certificate into a file named by
+ * output_filename in a PEM encoded format.
*
- * @param string|resource $x509 See Key/Certificate parameters for a list of valid values.
- * @param string $outfilename Path to the output file.
- * @param bool $notext
+ * @param string|resource $certificate See Key/Certificate parameters for a list of valid values.
+ * @param string $output_filename Path to the output file.
+ * @param bool $no_text
* The optional parameter notext affects
* the verbosity of the output; if it is FALSE, then additional human-readable
* information is included in the output. The default value of
@@ -1008,10 +1384,10 @@ function openssl_sign(string $data, ?string &$signature, $priv_key_id, $signatur
* @throws OpensslException
*
*/
-function openssl_x509_export_to_file($x509, string $outfilename, bool $notext = true): void
+function openssl_x509_export_to_file($certificate, string $output_filename, bool $no_text = true): void
{
error_clear_last();
- $result = \openssl_x509_export_to_file($x509, $outfilename, $notext);
+ $result = \openssl_x509_export_to_file($certificate, $output_filename, $no_text);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -1020,12 +1396,12 @@ function openssl_x509_export_to_file($x509, string $outfilename, bool $notext =
/**
* openssl_x509_export stores
- * x509 into a string named by
+ * certificate into a string named by
* output in a PEM encoded format.
*
- * @param string|resource $x509 See Key/Certificate parameters for a list of valid values.
+ * @param string|resource $certificate See Key/Certificate parameters for a list of valid values.
* @param string|null $output On success, this will hold the PEM.
- * @param bool $notext
+ * @param bool $no_text
* The optional parameter notext affects
* the verbosity of the output; if it is FALSE, then additional human-readable
* information is included in the output. The default value of
@@ -1033,10 +1409,10 @@ function openssl_x509_export_to_file($x509, string $outfilename, bool $notext =
* @throws OpensslException
*
*/
-function openssl_x509_export($x509, ?string &$output, bool $notext = true): void
+function openssl_x509_export($certificate, ?string &$output, bool $no_text = true): void
{
error_clear_last();
- $result = \openssl_x509_export($x509, $output, $notext);
+ $result = \openssl_x509_export($certificate, $output, $no_text);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -1045,21 +1421,21 @@ function openssl_x509_export($x509, ?string &$output, bool $notext = true): void
/**
* openssl_x509_fingerprint returns the digest of
- * x509 as a string.
+ * certificate as a string.
*
- * @param string|resource $x509 See Key/Certificate parameters for a list of valid values.
- * @param string $hash_algorithm The digest method or hash algorithm to use, e.g. "sha256", one of openssl_get_md_methods.
- * @param bool $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
- * @return string Returns a string containing the calculated certificate fingerprint as lowercase hexits unless raw_output is set to TRUE in which case the raw binary representation of the message digest is returned.
+ * @param string|resource $certificate See Key/Certificate parameters for a list of valid values.
+ * @param string $digest_algo The digest method or hash algorithm to use, e.g. "sha256", one of openssl_get_md_methods.
+ * @param bool $binary When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
+ * @return string Returns a string containing the calculated certificate fingerprint as lowercase hexits unless binary is set to TRUE in which case the raw binary representation of the message digest is returned.
*
* Returns FALSE on failure.
* @throws OpensslException
*
*/
-function openssl_x509_fingerprint($x509, string $hash_algorithm = "sha1", bool $raw_output = false): string
+function openssl_x509_fingerprint($certificate, string $digest_algo = "sha1", bool $binary = false): string
{
error_clear_last();
- $result = \openssl_x509_fingerprint($x509, $hash_algorithm, $raw_output);
+ $result = \openssl_x509_fingerprint($certificate, $digest_algo, $binary);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
@@ -1069,18 +1445,18 @@ function openssl_x509_fingerprint($x509, string $hash_algorithm = "sha1", bool $
/**
* openssl_x509_read parses the certificate supplied by
- * x509certdata and returns a resource identifier for
+ * certificate and returns an OpenSSLCertificate object for
* it.
*
- * @param string|resource $x509certdata X509 certificate. See Key/Certificate parameters for a list of valid values.
- * @return resource Returns a resource identifier on success.
+ * @param string|resource $certificate X509 certificate. See Key/Certificate parameters for a list of valid values.
+ * @return resource Returns an OpenSSLCertificate on success.
* @throws OpensslException
*
*/
-function openssl_x509_read($x509certdata)
+function openssl_x509_read($certificate)
{
error_clear_last();
- $result = \openssl_x509_read($x509certdata);
+ $result = \openssl_x509_read($certificate);
if ($result === false) {
throw OpensslException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/outcontrol.php b/vendor/thecodingmachine/safe/generated/outcontrol.php
index fce7c6dd8..e52c4a081 100644
--- a/vendor/thecodingmachine/safe/generated/outcontrol.php
+++ b/vendor/thecodingmachine/safe/generated/outcontrol.php
@@ -5,6 +5,29 @@ namespace Safe;
use Safe\Exceptions\OutcontrolException;
/**
+ * This function discards the contents of the output buffer.
+ *
+ * This function does not destroy the output buffer like
+ * ob_end_clean does.
+ *
+ * The output buffer must be started by
+ * ob_start with PHP_OUTPUT_HANDLER_CLEANABLE
+ * flag. Otherwise ob_clean will not work.
+ *
+ * @throws OutcontrolException
+ *
+ */
+function ob_clean(): void
+{
+ error_clear_last();
+ $result = \ob_clean();
+ if ($result === false) {
+ throw OutcontrolException::createFromPhpError();
+ }
+}
+
+
+/**
* This function discards the contents of the topmost output buffer and turns
* off this output buffering. If you want to further process the buffer's
* contents you have to call ob_get_contents before
@@ -56,6 +79,134 @@ function ob_end_flush(): void
/**
+ * This function will send the contents of the output buffer (if any). If you
+ * want to further process the buffer's contents you have to call
+ * ob_get_contents before ob_flush
+ * as the buffer contents are discarded after ob_flush
+ * is called.
+ *
+ * This function does not destroy the output buffer like
+ * ob_end_flush does.
+ *
+ * @throws OutcontrolException
+ *
+ */
+function ob_flush(): void
+{
+ error_clear_last();
+ $result = \ob_flush();
+ if ($result === false) {
+ throw OutcontrolException::createFromPhpError();
+ }
+}
+
+
+/**
+ * This function will turn output buffering on. While output buffering is
+ * active no output is sent from the script (other than headers), instead the
+ * output is stored in an internal buffer.
+ *
+ * The contents of this internal buffer may be copied into a string variable
+ * using ob_get_contents. To output what is stored in
+ * the internal buffer, use ob_end_flush. Alternatively,
+ * ob_end_clean will silently discard the buffer
+ * contents.
+ *
+ * Output buffers are stackable, that is, you may call
+ * ob_start while another
+ * ob_start is active. Just make
+ * sure that you call ob_end_flush
+ * the appropriate number of times. If multiple output callback
+ * functions are active, output is being filtered sequentially
+ * through each of them in nesting order.
+ *
+ * If output buffering is still active when the script ends, PHP outputs the
+ * contents automatically.
+ *
+ * @param string|array|callable|null $callback An optional callback function may be
+ * specified. This function takes a string as a parameter and should
+ * return a string. The function will be called when
+ * the output buffer is flushed (sent) or cleaned (with
+ * ob_flush, ob_clean or similar
+ * function) or when the output buffer
+ * is flushed to the browser at the end of the request. When
+ * callback is called, it will receive the
+ * contents of the output buffer as its parameter and is expected to
+ * return a new output buffer as a result, which will be sent to the
+ * browser. If the callback is not a
+ * callable function, this function will return FALSE.
+ * This is the callback signature:
+ *
+ *
+ * stringhandler
+ * stringbuffer
+ * intphase
+ *
+ *
+ *
+ * buffer
+ *
+ *
+ * Contents of the output buffer.
+ *
+ *
+ *
+ *
+ * phase
+ *
+ *
+ * Bitmask of PHP_OUTPUT_HANDLER_* constants.
+ *
+ *
+ *
+ *
+ *
+ * If callback returns FALSE original
+ * input is sent to the browser.
+ *
+ * The callback parameter may be bypassed
+ * by passing a NULL value.
+ *
+ * ob_end_clean, ob_end_flush,
+ * ob_clean, ob_flush and
+ * ob_start may not be called from a callback
+ * function. If you call them from callback function, the behavior is
+ * undefined. If you would like to delete the contents of a buffer,
+ * return "" (a null string) from callback function.
+ * You can't even call functions using the output buffering functions like
+ * print_r($expression, true) or
+ * highlight_file($filename, true) from a callback
+ * function.
+ *
+ * ob_gzhandler function exists to
+ * facilitate sending gz-encoded data to web browsers that support
+ * compressed web pages. ob_gzhandler determines
+ * what type of content encoding the browser will accept and will return
+ * its output accordingly.
+ * @param int $chunk_size
+ * @param int $flags
+ * @throws OutcontrolException
+ *
+ */
+function ob_start($callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): void
+{
+ error_clear_last();
+ if ($flags !== PHP_OUTPUT_HANDLER_STDFLAGS) {
+ $result = \ob_start($callback, $chunk_size, $flags);
+ } elseif ($chunk_size !== 0) {
+ $result = \ob_start($callback, $chunk_size);
+ } elseif ($callback !== null) {
+ $result = \ob_start($callback);
+ } else {
+ $result = \ob_start();
+ }
+ if ($result === false) {
+ throw OutcontrolException::createFromPhpError();
+ }
+}
+
+
+/**
* This function adds another name/value pair to the URL rewrite mechanism.
* The name and value will be added to URLs (as GET parameter) and forms
* (as hidden input fields) the same way as the session ID when transparent
diff --git a/vendor/thecodingmachine/safe/generated/pcntl.php b/vendor/thecodingmachine/safe/generated/pcntl.php
index 1cb721e22..d05f7ff3d 100644
--- a/vendor/thecodingmachine/safe/generated/pcntl.php
+++ b/vendor/thecodingmachine/safe/generated/pcntl.php
@@ -5,58 +5,27 @@ namespace Safe;
use Safe\Exceptions\PcntlException;
/**
- * Executes the program with the given arguments.
- *
- * @param string $path path must be the path to a binary executable or a
- * script with a valid path pointing to an executable in the shebang (
- * #!/usr/local/bin/perl for example) as the first line. See your system's
- * man execve(2) page for additional information.
- * @param array $args args is an array of argument strings passed to the
- * program.
- * @param array $envs envs is an array of strings which are passed as
- * environment to the program. The array is in the format of name =&gt; value,
- * the key being the name of the environmental variable and the value being
- * the value of that variable.
- * @throws PcntlException
- *
- */
-function pcntl_exec(string $path, array $args = null, array $envs = null): void
-{
- error_clear_last();
- if ($envs !== null) {
- $result = \pcntl_exec($path, $args, $envs);
- } elseif ($args !== null) {
- $result = \pcntl_exec($path, $args);
- } else {
- $result = \pcntl_exec($path);
- }
- if ($result === false) {
- throw PcntlException::createFromPhpError();
- }
-}
-
-
-/**
* pcntl_getpriority gets the priority of
- * pid. Because priority levels can differ between
+ * process_id. Because priority levels can differ between
* system types and kernel versions, please see your system's getpriority(2)
* man page for specific details.
*
- * @param int $pid If not specified, the pid of the current process is used.
- * @param int $process_identifier One of PRIO_PGRP, PRIO_USER
- * or PRIO_PROCESS.
+ * @param int $process_id If NULL, the process id of the current process is used.
+ * @param int $mode One of PRIO_PGRP, PRIO_USER,
+ * PRIO_PROCESS,
+ * PRIO_DARWIN_BG or PRIO_DARWIN_THREAD.
* @return int pcntl_getpriority returns the priority of the process. A lower numerical value causes more favorable
* scheduling.
* @throws PcntlException
*
*/
-function pcntl_getpriority(int $pid = null, int $process_identifier = PRIO_PROCESS): int
+function pcntl_getpriority(int $process_id = null, int $mode = PRIO_PROCESS): int
{
error_clear_last();
- if ($process_identifier !== PRIO_PROCESS) {
- $result = \pcntl_getpriority($pid, $process_identifier);
- } elseif ($pid !== null) {
- $result = \pcntl_getpriority($pid);
+ if ($mode !== PRIO_PROCESS) {
+ $result = \pcntl_getpriority($process_id, $mode);
+ } elseif ($process_id !== null) {
+ $result = \pcntl_getpriority($process_id);
} else {
$result = \pcntl_getpriority();
}
@@ -69,7 +38,7 @@ function pcntl_getpriority(int $pid = null, int $process_identifier = PRIO_PROCE
/**
* pcntl_setpriority sets the priority of
- * pid.
+ * process_id.
*
* @param int $priority priority is generally a value in the range
* -20 to 20. The default priority
@@ -77,19 +46,20 @@ function pcntl_getpriority(int $pid = null, int $process_identifier = PRIO_PROCE
* favorable scheduling. Because priority levels can differ between
* system types and kernel versions, please see your system's setpriority(2)
* man page for specific details.
- * @param int $pid If not specified, the pid of the current process is used.
- * @param int $process_identifier One of PRIO_PGRP, PRIO_USER
- * or PRIO_PROCESS.
+ * @param int $process_id If NULL, the process id of the current process is used.
+ * @param int $mode One of PRIO_PGRP, PRIO_USER,
+ * PRIO_PROCESS,
+ * PRIO_DARWIN_BG or PRIO_DARWIN_THREAD.
* @throws PcntlException
*
*/
-function pcntl_setpriority(int $priority, int $pid = null, int $process_identifier = PRIO_PROCESS): void
+function pcntl_setpriority(int $priority, int $process_id = null, int $mode = PRIO_PROCESS): void
{
error_clear_last();
- if ($process_identifier !== PRIO_PROCESS) {
- $result = \pcntl_setpriority($priority, $pid, $process_identifier);
- } elseif ($pid !== null) {
- $result = \pcntl_setpriority($priority, $pid);
+ if ($mode !== PRIO_PROCESS) {
+ $result = \pcntl_setpriority($priority, $process_id, $mode);
+ } elseif ($process_id !== null) {
+ $result = \pcntl_setpriority($priority, $process_id);
} else {
$result = \pcntl_setpriority($priority);
}
@@ -118,10 +88,65 @@ function pcntl_signal_dispatch(): void
/**
+ * The pcntl_signal function installs a new
+ * signal handler or replaces the current signal handler for the signal indicated by signal.
+ *
+ * @param int $signal The signal number.
+ * @param callable|int $handler The signal handler. This may be either a callable, which
+ * will be invoked to handle the signal, or either of the two global
+ * constants SIG_IGN or SIG_DFL,
+ * which will ignore the signal or restore the default signal handler
+ * respectively.
+ *
+ * If a callable is given, it must implement the following
+ * signature:
+ *
+ *
+ * voidhandler
+ * intsigno
+ * mixedsiginfo
+ *
+ *
+ *
+ * signal
+ *
+ *
+ * The signal being handled.
+ *
+ *
+ *
+ *
+ * siginfo
+ *
+ *
+ * If operating systems supports siginfo_t structures, this will be an array of signal information dependent on the signal.
+ *
+ *
+ *
+ *
+ *
+ * Note that when you set a handler to an object method, that object's
+ * reference count is increased which makes it persist until you either
+ * change the handler to something else, or your script ends.
+ * @param bool $restart_syscalls
+ * @throws PcntlException
+ *
+ */
+function pcntl_signal(int $signal, $handler, bool $restart_syscalls = true): void
+{
+ error_clear_last();
+ $result = \pcntl_signal($signal, $handler, $restart_syscalls);
+ if ($result === false) {
+ throw PcntlException::createFromPhpError();
+ }
+}
+
+
+/**
* The pcntl_sigprocmask function adds, removes or sets blocked
- * signals, depending on the how parameter.
+ * signals, depending on the mode parameter.
*
- * @param int $how Sets the behavior of pcntl_sigprocmask. Possible
+ * @param int $mode Sets the behavior of pcntl_sigprocmask. Possible
* values:
*
* SIG_BLOCK: Add the signals to the
@@ -131,16 +156,16 @@ function pcntl_signal_dispatch(): void
* SIG_SETMASK: Replace the currently
* blocked signals by the given list of signals.
*
- * @param array $set List of signals.
- * @param array|null $oldset The oldset parameter is set to an array
+ * @param array $signals List of signals.
+ * @param array|null $old_signals The old_signals parameter is set to an array
* containing the list of the previously blocked signals.
* @throws PcntlException
*
*/
-function pcntl_sigprocmask(int $how, array $set, ?array &$oldset = null): void
+function pcntl_sigprocmask(int $mode, array $signals, ?array &$old_signals = null): void
{
error_clear_last();
- $result = \pcntl_sigprocmask($how, $set, $oldset);
+ $result = \pcntl_sigprocmask($mode, $signals, $old_signals);
if ($result === false) {
throw PcntlException::createFromPhpError();
}
@@ -148,17 +173,81 @@ function pcntl_sigprocmask(int $how, array $set, ?array &$oldset = null): void
/**
+ * The pcntl_sigtimedwait function operates in exactly
+ * the same way as pcntl_sigwaitinfo except that it takes
+ * two additional parameters, seconds and
+ * nanoseconds, which enable an upper bound to be placed
+ * on the time for which the script is suspended.
+ *
+ * @param array $signals Array of signals to wait for.
+ * @param array|null $info The info is set to an array containing
+ * information about the signal. See
+ * pcntl_sigwaitinfo.
+ * @param int $seconds Timeout in seconds.
+ * @param int $nanoseconds Timeout in nanoseconds.
+ * @return int pcntl_sigtimedwait returns a signal number on success.
+ * @throws PcntlException
+ *
+ */
+function pcntl_sigtimedwait(array $signals, ?array &$info = [], int $seconds = 0, int $nanoseconds = 0): int
+{
+ error_clear_last();
+ $result = \pcntl_sigtimedwait($signals, $info, $seconds, $nanoseconds);
+ if ($result === false) {
+ throw PcntlException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * The pcntl_sigwaitinfo function suspends execution of the
+ * calling script until one of the signals given in signals
+ * are delivered. If one of the signal is already pending (e.g. blocked by
+ * pcntl_sigprocmask),
+ * pcntl_sigwaitinfo will return immediately.
+ *
+ * @param array $signals Array of signals to wait for.
+ * @param array|null $info The info parameter is set to an array containing
+ * information about the signal.
+ *
+ * The following elements are set for all signals:
+ *
+ * signo: Signal number
+ * errno: An error number
+ * code: Signal code
+ *
+ *
+ * The following elements may be set for the SIGCHLD signal:
+ *
+ * status: Exit value or signal
+ * utime: User time consumed
+ * stime: System time consumed
+ * pid: Sending process ID
+ * uid: Real user ID of sending process
+ *
+ *
+ * The following elements may be set for the SIGILL,
+ * SIGFPE, SIGSEGV and
+ * SIGBUS signals:
+ *
+ * addr: Memory location which caused fault
+ *
+ *
+ * The following element may be set for the SIGPOLL
+ * signal:
*
+ * band: Band event
+ * fd: File descriptor number
*
- * @param int $errno
- * @return string Returns error description on success.
+ * @return int Returns a signal number on success.
* @throws PcntlException
*
*/
-function pcntl_strerror(int $errno): string
+function pcntl_sigwaitinfo(array $signals, ?array &$info = []): int
{
error_clear_last();
- $result = \pcntl_strerror($errno);
+ $result = \pcntl_sigwaitinfo($signals, $info);
if ($result === false) {
throw PcntlException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/pcre.php b/vendor/thecodingmachine/safe/generated/pcre.php
index c40f14cc2..4ebb9839e 100644
--- a/vendor/thecodingmachine/safe/generated/pcre.php
+++ b/vendor/thecodingmachine/safe/generated/pcre.php
@@ -5,6 +5,32 @@ namespace Safe;
use Safe\Exceptions\PcreException;
/**
+ * Returns the array consisting of the elements of the
+ * array array that match the given
+ * pattern.
+ *
+ * @param string $pattern The pattern to search for, as a string.
+ * @param array $array The input array.
+ * @param int $flags If set to PREG_GREP_INVERT, this function returns
+ * the elements of the input array that do not match
+ * the given pattern.
+ * @return array Returns an array indexed using the keys from the
+ * array array.
+ * @throws PcreException
+ *
+ */
+function preg_grep(string $pattern, array $array, int $flags = 0): array
+{
+ error_clear_last();
+ $result = \preg_grep($pattern, $array, $flags);
+ if ($result === false) {
+ throw PcreException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Searches subject for all matches to the regular
* expression given in pattern and puts them in
* matches in the order specified by
@@ -15,7 +41,7 @@ use Safe\Exceptions\PcreException;
*
* @param string $pattern The pattern to search for, as a string.
* @param string $subject The input string.
- * @param array $matches Array of all matches in multi-dimensional array ordered according to
+ * @param array|null $matches Array of all matches in multi-dimensional array ordered according to
* flags.
* @param int $flags Can be a combination of the following flags (note that it doesn't make
* sense to use PREG_PATTERN_ORDER together with
@@ -343,11 +369,11 @@ use Safe\Exceptions\PcreException;
*
*
* The above example will output:
- * @return int Returns the number of full pattern matches (which might be zero).
+ * @return int|null Returns the number of full pattern matches (which might be zero).
* @throws PcreException
*
*/
-function preg_match_all(string $pattern, string $subject, array &$matches = null, int $flags = PREG_PATTERN_ORDER, int $offset = 0): int
+function preg_match_all(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0): ?int
{
error_clear_last();
$result = \preg_match_all($pattern, $subject, $matches, $flags, $offset);
@@ -364,7 +390,7 @@ function preg_match_all(string $pattern, string $subject, array &$matches = null
*
* @param string $pattern The pattern to search for, as a string.
* @param string $subject The input string.
- * @param array $matches If matches is provided, then it is filled with
+ * @param string[]|null $matches If matches is provided, then it is filled with
* the results of search. $matches[0] will contain the
* text that matched the full pattern, $matches[1]
* will have the text that matched the first captured parenthesized
@@ -584,7 +610,7 @@ function preg_match_all(string $pattern, string $subject, array &$matches = null
* @throws PcreException
*
*/
-function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
+function preg_match(string $pattern, string $subject, ?iterable &$matches = null, int $flags = 0, int $offset = 0): int
{
error_clear_last();
$result = \preg_match($pattern, $subject, $matches, $flags, $offset);
diff --git a/vendor/thecodingmachine/safe/generated/pdf.php b/vendor/thecodingmachine/safe/generated/pdf.php
deleted file mode 100644
index d039b27a9..000000000
--- a/vendor/thecodingmachine/safe/generated/pdf.php
+++ /dev/null
@@ -1,1553 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\PdfException;
-
-/**
- * Activates a previously created structure element or other content item.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param int $id
- * @throws PdfException
- *
- */
-function PDF_activate_item($pdfdoc, int $id): void
-{
- error_clear_last();
- $result = \PDF_activate_item($pdfdoc, $id);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Add a link annotation to a target within the current PDF file.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_create_action with type=GoTo
- * and PDF_create_annotation with
- * type=Link instead.
- *
- * @param resource $pdfdoc
- * @param float $lowerleftx
- * @param float $lowerlefty
- * @param float $upperrightx
- * @param float $upperrighty
- * @param int $page
- * @param string $dest
- * @throws PdfException
- *
- */
-function PDF_add_locallink($pdfdoc, float $lowerleftx, float $lowerlefty, float $upperrightx, float $upperrighty, int $page, string $dest): void
-{
- error_clear_last();
- $result = \PDF_add_locallink($pdfdoc, $lowerleftx, $lowerlefty, $upperrightx, $upperrighty, $page, $dest);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Creates a named destination on an arbitrary page in the current document.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param string $name
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_add_nameddest($pdfdoc, string $name, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_add_nameddest($pdfdoc, $name, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets an annotation for the current page. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_create_annotation with
- * type=Text instead.
- *
- * @param resource $pdfdoc
- * @param float $llx
- * @param float $lly
- * @param float $urx
- * @param float $ury
- * @param string $contents
- * @param string $title
- * @param string $icon
- * @param int $open
- * @throws PdfException
- *
- */
-function PDF_add_note($pdfdoc, float $llx, float $lly, float $urx, float $ury, string $contents, string $title, string $icon, int $open): void
-{
- error_clear_last();
- $result = \PDF_add_note($pdfdoc, $llx, $lly, $urx, $ury, $contents, $title, $icon, $open);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Add a file link annotation to a PDF target.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_create_action with
- * type=GoToR and
- * PDF_create_annotation with
- * type=Link instead.
- *
- * @param resource $pdfdoc
- * @param float $bottom_left_x
- * @param float $bottom_left_y
- * @param float $up_right_x
- * @param float $up_right_y
- * @param string $filename
- * @param int $page
- * @param string $dest
- * @throws PdfException
- *
- */
-function PDF_add_pdflink($pdfdoc, float $bottom_left_x, float $bottom_left_y, float $up_right_x, float $up_right_y, string $filename, int $page, string $dest): void
-{
- error_clear_last();
- $result = \PDF_add_pdflink($pdfdoc, $bottom_left_x, $bottom_left_y, $up_right_x, $up_right_y, $filename, $page, $dest);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds an existing image as thumbnail for the current page.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param int $image
- * @throws PdfException
- *
- */
-function PDF_add_thumbnail($pdfdoc, int $image): void
-{
- error_clear_last();
- $result = \PDF_add_thumbnail($pdfdoc, $image);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds a weblink annotation to a target url on the Web.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_create_action with type=URI
- * and PDF_create_annotation with
- * type=Link instead.
- *
- * @param resource $pdfdoc
- * @param float $lowerleftx
- * @param float $lowerlefty
- * @param float $upperrightx
- * @param float $upperrighty
- * @param string $url
- * @throws PdfException
- *
- */
-function PDF_add_weblink($pdfdoc, float $lowerleftx, float $lowerlefty, float $upperrightx, float $upperrighty, string $url): void
-{
- error_clear_last();
- $result = \PDF_add_weblink($pdfdoc, $lowerleftx, $lowerlefty, $upperrightx, $upperrighty, $url);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds a file attachment annotation. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_create_annotation with
- * type=FileAttachment instead.
- *
- * @param resource $pdfdoc
- * @param float $llx
- * @param float $lly
- * @param float $urx
- * @param float $ury
- * @param string $filename
- * @param string $description
- * @param string $author
- * @param string $mimetype
- * @param string $icon
- * @throws PdfException
- *
- */
-function PDF_attach_file($pdfdoc, float $llx, float $lly, float $urx, float $ury, string $filename, string $description, string $author, string $mimetype, string $icon): void
-{
- error_clear_last();
- $result = \PDF_attach_file($pdfdoc, $llx, $lly, $urx, $ury, $filename, $description, $author, $mimetype, $icon);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Starts a layer for subsequent output on the page. Returns TRUE on success.
- *
- * This function requires PDF 1.5.
- *
- * @param resource $pdfdoc
- * @param int $layer
- * @throws PdfException
- *
- */
-function PDF_begin_layer($pdfdoc, int $layer): void
-{
- error_clear_last();
- $result = \PDF_begin_layer($pdfdoc, $layer);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds a new page to the document, and specifies various options.
- * The parameters width and height
- * are the dimensions of the new page in points. Returns TRUE on success.
- *
- *
- * Common Page Sizes in Points
- *
- *
- *
- * name
- * size
- *
- *
- *
- *
- * A0
- * 2380 x 3368
- *
- *
- * A1
- * 1684 x 2380
- *
- *
- * A2
- * 1190 x 1684
- *
- *
- * A3
- * 842 x 1190
- *
- *
- * A4
- * 595 x 842
- *
- *
- * A5
- * 421 x 595
- *
- *
- * A6
- * 297 x 421
- *
- *
- * B5
- * 501 x 709
- *
- *
- * letter (8.5" x 11")
- * 612 x 792
- *
- *
- * legal (8.5" x 14")
- * 612 x 1008
- *
- *
- * ledger (17" x 11")
- * 1224 x 792
- *
- *
- * 11" x 17"
- * 792 x 1224
- *
- *
- *
- *
- *
- * @param resource $pdfdoc
- * @param float $width
- * @param float $height
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_begin_page_ext($pdfdoc, float $width, float $height, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_begin_page_ext($pdfdoc, $width, $height, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds a new page to the document. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_begin_page_ext instead.
- *
- * @param resource $pdfdoc
- * @param float $width
- * @param float $height
- * @throws PdfException
- *
- */
-function PDF_begin_page($pdfdoc, float $width, float $height): void
-{
- error_clear_last();
- $result = \PDF_begin_page($pdfdoc, $width, $height);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Adds a circle. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param float $x
- * @param float $y
- * @param float $r
- * @throws PdfException
- *
- */
-function PDF_circle($pdfdoc, float $x, float $y, float $r): void
-{
- error_clear_last();
- $result = \PDF_circle($pdfdoc, $x, $y, $r);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Uses the current path as clipping path, and terminate the path. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_clip($p): void
-{
- error_clear_last();
- $result = \PDF_clip($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes the page handle, and frees all page-related resources. Returns TRUE on success.
- *
- * @param resource $p
- * @param int $page
- * @throws PdfException
- *
- */
-function PDF_close_pdi_page($p, int $page): void
-{
- error_clear_last();
- $result = \PDF_close_pdi_page($p, $page);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes all open page handles, and closes the input PDF document. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 7,
- * use PDF_close_pdi_document instead.
- *
- * @param resource $p
- * @param int $doc
- * @throws PdfException
- *
- */
-function PDF_close_pdi($p, int $doc): void
-{
- error_clear_last();
- $result = \PDF_close_pdi($p, $doc);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes the generated PDF file, and frees all document-related resources.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_end_document instead.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_close($p): void
-{
- error_clear_last();
- $result = \PDF_close($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes the path, fills, and strokes it. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_closepath_fill_stroke($p): void
-{
- error_clear_last();
- $result = \PDF_closepath_fill_stroke($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes the path, and strokes it. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_closepath_stroke($p): void
-{
- error_clear_last();
- $result = \PDF_closepath_stroke($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Closes the current path. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_closepath($p): void
-{
- error_clear_last();
- $result = \PDF_closepath($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Concatenates a matrix to the current transformation matrix (CTM). Returns TRUE on success.
- *
- * @param resource $p
- * @param float $a
- * @param float $b
- * @param float $c
- * @param float $d
- * @param float $e
- * @param float $f
- * @throws PdfException
- *
- */
-function PDF_concat($p, float $a, float $b, float $c, float $d, float $e, float $f): void
-{
- error_clear_last();
- $result = \PDF_concat($p, $a, $b, $c, $d, $e, $f);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Prints text at the next line. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $text
- * @throws PdfException
- *
- */
-function PDF_continue_text($p, string $text): void
-{
- error_clear_last();
- $result = \PDF_continue_text($p, $text);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Draws a Bezier curve from the current point, using 3 more control points.
- * Returns TRUE on success.
- *
- * @param resource $p
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- * @param float $x3
- * @param float $y3
- * @throws PdfException
- *
- */
-function PDF_curveto($p, float $x1, float $y1, float $x2, float $y2, float $x3, float $y3): void
-{
- error_clear_last();
- $result = \PDF_curveto($p, $x1, $y1, $x2, $y2, $x3, $y3);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Deletes a PDFlib object, and frees all internal resources. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @throws PdfException
- *
- */
-function PDF_delete($pdfdoc): void
-{
- error_clear_last();
- $result = \PDF_delete($pdfdoc);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Deactivates all active layers. Returns TRUE on success.
- *
- * This function requires PDF 1.5.
- *
- * @param resource $pdfdoc
- * @throws PdfException
- *
- */
-function PDF_end_layer($pdfdoc): void
-{
- error_clear_last();
- $result = \PDF_end_layer($pdfdoc);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Finishes a page, and applies various options. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_end_page_ext($pdfdoc, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_end_page_ext($pdfdoc, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Finishes the page. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_end_page($p): void
-{
- error_clear_last();
- $result = \PDF_end_page($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Finishes the pattern definition. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_end_pattern($p): void
-{
- error_clear_last();
- $result = \PDF_end_pattern($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Finishes a template definition. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_end_template($p): void
-{
- error_clear_last();
- $result = \PDF_end_template($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Fills and strokes the current path with the current fill and stroke color.
- * Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_fill_stroke($p): void
-{
- error_clear_last();
- $result = \PDF_fill_stroke($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Fills the interior of the current path with the current fill color.
- * Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_fill($p): void
-{
- error_clear_last();
- $result = \PDF_fill($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Places an image or template on the page, subject to various options.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param int $image
- * @param float $x
- * @param float $y
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_fit_image($pdfdoc, int $image, float $x, float $y, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_fit_image($pdfdoc, $image, $x, $y, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Places an imported PDF page on the page, subject to various options.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param int $page
- * @param float $x
- * @param float $y
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_fit_pdi_page($pdfdoc, int $page, float $x, float $y, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_fit_pdi_page($pdfdoc, $page, $x, $y, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Places a single line of text on the page, subject to various options. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param string $text
- * @param float $x
- * @param float $y
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_fit_textline($pdfdoc, string $text, float $x, float $y, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_fit_textline($pdfdoc, $text, $x, $y, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Reset all color and graphics state parameters to their defaults.
- * Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_initgraphics($p): void
-{
- error_clear_last();
- $result = \PDF_initgraphics($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Draws a line from the current point to another point. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $x
- * @param float $y
- * @throws PdfException
- *
- */
-function PDF_lineto($p, float $x, float $y): void
-{
- error_clear_last();
- $result = \PDF_lineto($p, $x, $y);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Finds a built-in spot color name, or makes a named spot color from the
- * current fill color. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $spotname
- * @return int
- * @throws PdfException
- *
- */
-function PDF_makespotcolor($p, string $spotname): int
-{
- error_clear_last();
- $result = \PDF_makespotcolor($p, $spotname);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Sets the current point for graphics output. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $x
- * @param float $y
- * @throws PdfException
- *
- */
-function PDF_moveto($p, float $x, float $y): void
-{
- error_clear_last();
- $result = \PDF_moveto($p, $x, $y);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Creates a new PDF file using the supplied file name.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * PDF_begin_document instead.
- *
- * @param resource $p
- * @param string $filename
- * @throws PdfException
- *
- */
-function PDF_open_file($p, string $filename): void
-{
- error_clear_last();
- $result = \PDF_open_file($p, $filename);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Places an image and scales it. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 5, use
- * PDF_fit_image instead.
- *
- * @param resource $pdfdoc
- * @param int $image
- * @param float $x
- * @param float $y
- * @param float $scale
- * @throws PdfException
- *
- */
-function PDF_place_image($pdfdoc, int $image, float $x, float $y, float $scale): void
-{
- error_clear_last();
- $result = \PDF_place_image($pdfdoc, $image, $x, $y, $scale);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Places a PDF page and scales it. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 5, use
- * PDF_fit_pdi_page instead.
- *
- * @param resource $pdfdoc
- * @param int $page
- * @param float $x
- * @param float $y
- * @param float $sx
- * @param float $sy
- * @throws PdfException
- *
- */
-function PDF_place_pdi_page($pdfdoc, int $page, float $x, float $y, float $sx, float $sy): void
-{
- error_clear_last();
- $result = \PDF_place_pdi_page($pdfdoc, $page, $x, $y, $sx, $sy);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Draws a rectangle. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $x
- * @param float $y
- * @param float $width
- * @param float $height
- * @throws PdfException
- *
- */
-function PDF_rect($p, float $x, float $y, float $width, float $height): void
-{
- error_clear_last();
- $result = \PDF_rect($p, $x, $y, $width, $height);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Restores the most recently saved graphics state. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_restore($p): void
-{
- error_clear_last();
- $result = \PDF_restore($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Rotates the coordinate system. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $phi
- * @throws PdfException
- *
- */
-function PDF_rotate($p, float $phi): void
-{
- error_clear_last();
- $result = \PDF_rotate($p, $phi);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Saves the current graphics state. Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_save($p): void
-{
- error_clear_last();
- $result = \PDF_save($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Scales the coordinate system. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $sx
- * @param float $sy
- * @throws PdfException
- *
- */
-function PDF_scale($p, float $sx, float $sy): void
-{
- error_clear_last();
- $result = \PDF_scale($p, $sx, $sy);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the border color for all kinds of annotations. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * the option annotcolor in
- * PDF_create_annotation instead.
- *
- * @param resource $p
- * @param float $red
- * @param float $green
- * @param float $blue
- * @throws PdfException
- *
- */
-function PDF_set_border_color($p, float $red, float $green, float $blue): void
-{
- error_clear_last();
- $result = \PDF_set_border_color($p, $red, $green, $blue);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the border dash style for all kinds of annotations. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * the option dasharray in
- * PDF_create_annotation instead.
- *
- * @param resource $pdfdoc
- * @param float $black
- * @param float $white
- * @throws PdfException
- *
- */
-function PDF_set_border_dash($pdfdoc, float $black, float $white): void
-{
- error_clear_last();
- $result = \PDF_set_border_dash($pdfdoc, $black, $white);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the border style for all kinds of annotations. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 6, use
- * the options borderstyle and
- * linewidth in
- * PDF_create_annotation instead.
- *
- * @param resource $pdfdoc
- * @param string $style
- * @param float $width
- * @throws PdfException
- *
- */
-function PDF_set_border_style($pdfdoc, string $style, float $width): void
-{
- error_clear_last();
- $result = \PDF_set_border_style($pdfdoc, $style, $width);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Fill document information field key with
- * value. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $key
- * @param string $value
- * @throws PdfException
- *
- */
-function PDF_set_info($p, string $key, string $value): void
-{
- error_clear_last();
- $result = \PDF_set_info($p, $key, $value);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Defines hierarchical and group relationships among layers. Returns TRUE on success.
- *
- * This function requires PDF 1.5.
- *
- * @param resource $pdfdoc
- * @param string $type
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_set_layer_dependency($pdfdoc, string $type, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_set_layer_dependency($pdfdoc, $type, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets some PDFlib parameter with string type. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $key
- * @param string $value
- * @throws PdfException
- *
- */
-function PDF_set_parameter($p, string $key, string $value): void
-{
- error_clear_last();
- $result = \PDF_set_parameter($p, $key, $value);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the position for text output on the page. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $x
- * @param float $y
- * @throws PdfException
- *
- */
-function PDF_set_text_pos($p, float $x, float $y): void
-{
- error_clear_last();
- $result = \PDF_set_text_pos($p, $x, $y);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the value of some PDFlib parameter with numerical type. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $key
- * @param float $value
- * @throws PdfException
- *
- */
-function PDF_set_value($p, string $key, float $value): void
-{
- error_clear_last();
- $result = \PDF_set_value($p, $key, $value);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current color space and color. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $fstype
- * @param string $colorspace
- * @param float $c1
- * @param float $c2
- * @param float $c3
- * @param float $c4
- * @throws PdfException
- *
- */
-function PDF_setcolor($p, string $fstype, string $colorspace, float $c1, float $c2, float $c3, float $c4): void
-{
- error_clear_last();
- $result = \PDF_setcolor($p, $fstype, $colorspace, $c1, $c2, $c3, $c4);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current dash pattern to b black
- * and w white units. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param float $b
- * @param float $w
- * @throws PdfException
- *
- */
-function PDF_setdash($pdfdoc, float $b, float $w): void
-{
- error_clear_last();
- $result = \PDF_setdash($pdfdoc, $b, $w);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets a dash pattern defined by an option list. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param string $optlist
- * @throws PdfException
- *
- */
-function PDF_setdashpattern($pdfdoc, string $optlist): void
-{
- error_clear_last();
- $result = \PDF_setdashpattern($pdfdoc, $optlist);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the flatness parameter. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param float $flatness
- * @throws PdfException
- *
- */
-function PDF_setflat($pdfdoc, float $flatness): void
-{
- error_clear_last();
- $result = \PDF_setflat($pdfdoc, $flatness);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current font in the specified fontsize, using a
- * font handle returned by PDF_load_font.
- * Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param int $font
- * @param float $fontsize
- * @throws PdfException
- *
- */
-function PDF_setfont($pdfdoc, int $font, float $fontsize): void
-{
- error_clear_last();
- $result = \PDF_setfont($pdfdoc, $font, $fontsize);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current fill color to a gray value between 0 and 1 inclusive.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $g
- * @throws PdfException
- *
- */
-function PDF_setgray_fill($p, float $g): void
-{
- error_clear_last();
- $result = \PDF_setgray_fill($p, $g);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current stroke color to a gray value between 0 and 1 inclusive.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $g
- * @throws PdfException
- *
- */
-function PDF_setgray_stroke($p, float $g): void
-{
- error_clear_last();
- $result = \PDF_setgray_stroke($p, $g);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current fill and stroke color to a gray value between 0 and 1 inclusive. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $g
- * @throws PdfException
- *
- */
-function PDF_setgray($p, float $g): void
-{
- error_clear_last();
- $result = \PDF_setgray($p, $g);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the linejoin parameter to specify the shape
- * at the corners of paths that are stroked. Returns TRUE on success.
- *
- * @param resource $p
- * @param int $value
- * @throws PdfException
- *
- */
-function PDF_setlinejoin($p, int $value): void
-{
- error_clear_last();
- $result = \PDF_setlinejoin($p, $value);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current line width. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $width
- * @throws PdfException
- *
- */
-function PDF_setlinewidth($p, float $width): void
-{
- error_clear_last();
- $result = \PDF_setlinewidth($p, $width);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Explicitly sets the current transformation matrix. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $a
- * @param float $b
- * @param float $c
- * @param float $d
- * @param float $e
- * @param float $f
- * @throws PdfException
- *
- */
-function PDF_setmatrix($p, float $a, float $b, float $c, float $d, float $e, float $f): void
-{
- error_clear_last();
- $result = \PDF_setmatrix($p, $a, $b, $c, $d, $e, $f);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the miter limit.Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param float $miter
- * @throws PdfException
- *
- */
-function PDF_setmiterlimit($pdfdoc, float $miter): void
-{
- error_clear_last();
- $result = \PDF_setmiterlimit($pdfdoc, $miter);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current fill color to the supplied RGB values. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $red
- * @param float $green
- * @param float $blue
- * @throws PdfException
- *
- */
-function PDF_setrgbcolor_fill($p, float $red, float $green, float $blue): void
-{
- error_clear_last();
- $result = \PDF_setrgbcolor_fill($p, $red, $green, $blue);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current stroke color to the supplied RGB values. Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $red
- * @param float $green
- * @param float $blue
- * @throws PdfException
- *
- */
-function PDF_setrgbcolor_stroke($p, float $red, float $green, float $blue): void
-{
- error_clear_last();
- $result = \PDF_setrgbcolor_stroke($p, $red, $green, $blue);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Sets the current fill and stroke color to the supplied RGB values.
- * Returns TRUE on success.
- *
- * This function is deprecated since PDFlib version 4, use
- * PDF_setcolor instead.
- *
- * @param resource $p
- * @param float $red
- * @param float $green
- * @param float $blue
- * @throws PdfException
- *
- */
-function PDF_setrgbcolor($p, float $red, float $green, float $blue): void
-{
- error_clear_last();
- $result = \PDF_setrgbcolor($p, $red, $green, $blue);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Prints text in the current font. Returns TRUE on success.
- *
- * @param resource $p
- * @param string $text
- * @param float $x
- * @param float $y
- * @throws PdfException
- *
- */
-function PDF_show_xy($p, string $text, float $x, float $y): void
-{
- error_clear_last();
- $result = \PDF_show_xy($p, $text, $x, $y);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Prints text in the current font and size at
- * the current position. Returns TRUE on success.
- *
- * @param resource $pdfdoc
- * @param string $text
- * @throws PdfException
- *
- */
-function PDF_show($pdfdoc, string $text): void
-{
- error_clear_last();
- $result = \PDF_show($pdfdoc, $text);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Skews the coordinate system in x and y direction by alpha
- * and beta degrees, respectively. Returns TRUE on success.
- *
- * @param resource $p
- * @param float $alpha
- * @param float $beta
- * @throws PdfException
- *
- */
-function PDF_skew($p, float $alpha, float $beta): void
-{
- error_clear_last();
- $result = \PDF_skew($p, $alpha, $beta);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
-
-
-/**
- * Strokes the path with the current color and line width, and clear it.
- * Returns TRUE on success.
- *
- * @param resource $p
- * @throws PdfException
- *
- */
-function PDF_stroke($p): void
-{
- error_clear_last();
- $result = \PDF_stroke($p);
- if ($result === false) {
- throw PdfException::createFromPhpError();
- }
-}
diff --git a/vendor/thecodingmachine/safe/generated/pgsql.php b/vendor/thecodingmachine/safe/generated/pgsql.php
index 007faacbb..14b5548de 100644
--- a/vendor/thecodingmachine/safe/generated/pgsql.php
+++ b/vendor/thecodingmachine/safe/generated/pgsql.php
@@ -10,7 +10,7 @@ use Safe\Exceptions\PgsqlException;
* or pg_send_execute. You cannot cancel a query executed using
* pg_query.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @throws PgsqlException
*
*/
@@ -25,65 +25,6 @@ function pg_cancel_query($connection): void
/**
- * PostgreSQL supports automatic character set conversion between
- * server and client for certain character sets.
- * pg_client_encoding returns the client
- * encoding as a string. The returned string will be one of the
- * standard PostgreSQL encoding identifiers.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return string The client encoding.
- * @throws PgsqlException
- *
- */
-function pg_client_encoding($connection = null): string
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_client_encoding($connection);
- } else {
- $result = \pg_client_encoding();
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_close closes the non-persistent
- * connection to a PostgreSQL database associated with the given
- * connection resource.
- *
- * If there is open large object resource on the connection, do not
- * close the connection before closing all large object resources.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @throws PgsqlException
- *
- */
-function pg_close($connection = null): void
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_close($connection);
- } else {
- $result = \pg_close();
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
* pg_connect opens a connection to a
* PostgreSQL database specified by the
* connection_string.
@@ -92,7 +33,7 @@ function pg_close($connection = null): void
* the same connection_string as an existing connection, the
* existing connection will be returned unless you pass
* PGSQL_CONNECT_FORCE_NEW as
- * connect_type.
+ * flags.
*
* The old syntax with multiple parameters
* $conn = pg_connect("host", "port", "options", "tty", "dbname")
@@ -118,7 +59,7 @@ function pg_close($connection = null): void
*
* The options parameter can be used to set command line parameters
* to be invoked by the server.
- * @param int $connect_type If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection
+ * @param int $flags If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection
* is created, even if the connection_string is identical to
* an existing connection.
*
@@ -126,18 +67,14 @@ function pg_close($connection = null): void
* connection is established asynchronously. The state of the connection
* can then be checked via pg_connect_poll or
* pg_connection_status.
- * @return resource PostgreSQL connection resource on success, FALSE on failure.
+ * @return resource Returns an PgSql\Connection instance on success.
* @throws PgsqlException
*
*/
-function pg_connect(string $connection_string, int $connect_type = null)
+function pg_connect(string $connection_string, int $flags = 0)
{
error_clear_last();
- if ($connect_type !== null) {
- $result = \pg_connect($connection_string, $connect_type);
- } else {
- $result = \pg_connect($connection_string);
- }
+ $result = \pg_connect($connection_string, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -149,7 +86,7 @@ function pg_connect(string $connection_string, int $connect_type = null)
* pg_connection_reset resets the connection.
* It is useful for error recovery.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @throws PgsqlException
*
*/
@@ -165,29 +102,29 @@ function pg_connection_reset($connection): void
/**
* pg_convert checks and converts the values in
- * assoc_array into suitable values for use in an SQL
+ * values into suitable values for use in an SQL
* statement. Precondition for pg_convert is the
* existence of a table table_name which has at least
- * as many columns as assoc_array has elements. The
+ * as many columns as values has elements. The
* fieldnames in table_name must match the indices in
- * assoc_array and the corresponding datatypes must be
+ * values and the corresponding datatypes must be
* compatible. Returns an array with the converted values on success, FALSE
* otherwise.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table against which to convert types.
- * @param array $assoc_array Data to be converted.
- * @param int $options Any number of PGSQL_CONV_IGNORE_DEFAULT,
+ * @param array $values Data to be converted.
+ * @param int $flags Any number of PGSQL_CONV_IGNORE_DEFAULT,
* PGSQL_CONV_FORCE_NULL or
* PGSQL_CONV_IGNORE_NOT_NULL, combined.
* @return array An array of converted values.
* @throws PgsqlException
*
*/
-function pg_convert($connection, string $table_name, array $assoc_array, int $options = 0): array
+function pg_convert($connection, string $table_name, array $values, int $flags = 0): array
{
error_clear_last();
- $result = \pg_convert($connection, $table_name, $assoc_array, $options);
+ $result = \pg_convert($connection, $table_name, $values, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -200,29 +137,23 @@ function pg_convert($connection, string $table_name, array $assoc_array, int $op
* rows. It issues a COPY FROM SQL command
* internally to insert records.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table into which to copy the rows.
* @param array $rows An array of data to be copied into table_name.
* Each value in rows becomes a row in table_name.
* Each value in rows should be a delimited string of the values
* to insert into each field. Values should be linefeed terminated.
- * @param string $delimiter The token that separates values for each field in each element of
- * rows. Default is TAB.
+ * @param string $separator The token that separates values for each field in each element of
+ * rows. Default is \t.
* @param string $null_as How SQL NULL values are represented in the
- * rows. Default is \N ("\\N").
+ * rows. Default is \\N ("\\\\N").
* @throws PgsqlException
*
*/
-function pg_copy_from($connection, string $table_name, array $rows, string $delimiter = null, string $null_as = null): void
+function pg_copy_from($connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): void
{
error_clear_last();
- if ($null_as !== null) {
- $result = \pg_copy_from($connection, $table_name, $rows, $delimiter, $null_as);
- } elseif ($delimiter !== null) {
- $result = \pg_copy_from($connection, $table_name, $rows, $delimiter);
- } else {
- $result = \pg_copy_from($connection, $table_name, $rows);
- }
+ $result = \pg_copy_from($connection, $table_name, $rows, $separator, $null_as);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -234,56 +165,20 @@ function pg_copy_from($connection, string $table_name, array $rows, string $deli
* issues COPY TO SQL command internally to
* retrieve records.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table from which to copy the data into rows.
- * @param string $delimiter The token that separates values for each field in each element of
- * rows. Default is TAB.
+ * @param string $separator The token that separates values for each field in each element of
+ * rows. Default is \t.
* @param string $null_as How SQL NULL values are represented in the
- * rows. Default is \N ("\\N").
+ * rows. Default is \\N ("\\\\N").
* @return array An array with one element for each line of COPY data.
- * It returns FALSE on failure.
* @throws PgsqlException
*
*/
-function pg_copy_to($connection, string $table_name, string $delimiter = null, string $null_as = null): array
+function pg_copy_to($connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array
{
error_clear_last();
- if ($null_as !== null) {
- $result = \pg_copy_to($connection, $table_name, $delimiter, $null_as);
- } elseif ($delimiter !== null) {
- $result = \pg_copy_to($connection, $table_name, $delimiter);
- } else {
- $result = \pg_copy_to($connection, $table_name);
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_dbname returns the name of the database
- * that the given PostgreSQL connection
- * resource.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return string A string containing the name of the database the
- * connection is to.
- * @throws PgsqlException
- *
- */
-function pg_dbname($connection = null): string
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_dbname($connection);
- } else {
- $result = \pg_dbname();
- }
+ $result = \pg_copy_to($connection, $table_name, $separator, $null_as);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -293,46 +188,43 @@ function pg_dbname($connection = null): string
/**
* pg_delete deletes records from a table
- * specified by the keys and values
- * in assoc_array. If options
- * is specified, pg_convert is applied
- * to assoc_array with the specified options.
+ * specified by the keys and values in conditions.
*
- * If options is specified,
+ * If flags is specified,
* pg_convert is applied to
- * assoc_array with the specified flags.
+ * conditions with the specified flags.
*
- * By default pg_delete passes raw values. Values
- * must be escaped or PGSQL_DML_ESCAPE option must be
- * specified. PGSQL_DML_ESCAPE quotes and escapes
- * parameters/identifiers. Therefore, table/column names became case
- * sensitive.
+ * By default pg_delete passes raw values.
+ * Values must be escaped or the PGSQL_DML_ESCAPE flag
+ * must be specified in flags.
+ * PGSQL_DML_ESCAPE quotes and escapes parameters/identifiers.
+ * Therefore, table/column names become case sensitive.
*
* Note that neither escape nor prepared query can protect LIKE query,
* JSON, Array, Regex, etc. These parameters should be handled
* according to their contexts. i.e. Escape/validate values.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table from which to delete rows.
- * @param array $assoc_array An array whose keys are field names in the table table_name,
+ * @param array $conditions An array whose keys are field names in the table table_name,
* and whose values are the values of those fields that are to be deleted.
- * @param int $options Any number of PGSQL_CONV_FORCE_NULL,
+ * @param int $flags Any number of PGSQL_CONV_FORCE_NULL,
* PGSQL_DML_NO_CONV,
* PGSQL_DML_ESCAPE,
* PGSQL_DML_EXEC,
* PGSQL_DML_ASYNC or
* PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the
- * options then query string is returned. When PGSQL_DML_NO_CONV
+ * flags then query string is returned. When PGSQL_DML_NO_CONV
* or PGSQL_DML_ESCAPE is set, it does not call pg_convert internally.
* @return mixed Returns TRUE on success. Returns string if PGSQL_DML_STRING is passed
- * via options.
+ * via flags.
* @throws PgsqlException
*
*/
-function pg_delete($connection, string $table_name, array $assoc_array, int $options = PGSQL_DML_EXEC)
+function pg_delete($connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
- $result = \pg_delete($connection, $table_name, $assoc_array, $options);
+ $result = \pg_delete($connection, $table_name, $conditions, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -348,10 +240,11 @@ function pg_delete($connection, string $table_name, array $assoc_array, int $opt
* must be issued, otherwise the PostgreSQL server may get out of
* sync with the frontend and will report an error.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is NULL, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @throws PgsqlException
*
*/
@@ -385,10 +278,11 @@ function pg_end_copy($connection = null): void
* The parameters are identical to pg_query_params, except that the name of a
* prepared statement is given instead of a query string.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $stmtname The name of the prepared statement to execute. if
* "" is specified, then the unnamed statement is executed. The name must have
* been previously prepared using pg_prepare,
@@ -399,7 +293,7 @@ function pg_end_copy($connection = null): void
* must match the number of placeholders.
*
* Elements are converted to strings by calling this function.
- * @return resource A query result resource on success.
+ * @return resource An PgSql\Result instance on success.
* @throws PgsqlException
*
*/
@@ -423,73 +317,23 @@ function pg_execute($connection = null, string $stmtname = null, array $params =
/**
- * pg_field_name returns the name of the field
- * occupying the given field_number in the
- * given PostgreSQL result resource. Field
- * numbering starts from 0.
- *
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
- * @param int $field_number Field number, starting from 0.
- * @return string The field name.
- * @throws PgsqlException
- *
- */
-function pg_field_name($result, int $field_number): string
-{
- error_clear_last();
- $result = \pg_field_name($result, $field_number);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* pg_field_table returns the name of the table that field
* belongs to, or the table's oid if oid_only is TRUE.
*
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
- * @param int $field_number Field number, starting from 0.
+ * @param resource $result An PgSql\Result instance, returned by pg_query,
+ * pg_query_params or pg_execute(among others).
+ * @param int $field Field number, starting from 0.
* @param bool $oid_only By default the tables name that field belongs to is returned but
* if oid_only is set to TRUE, then the
* oid will instead be returned.
- * @return mixed On success either the fields table name or oid. Or, FALSE on failure.
- * @throws PgsqlException
- *
- */
-function pg_field_table($result, int $field_number, bool $oid_only = false)
-{
- error_clear_last();
- $result = \pg_field_table($result, $field_number, $oid_only);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_field_type returns a string containing the
- * base type name of the given field_number in the
- * given PostgreSQL result resource.
- *
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
- * @param int $field_number Field number, starting from 0.
- * @return string A string containing the base name of the field's type.
+ * @return mixed On success either the fields table name or oid.
* @throws PgsqlException
*
*/
-function pg_field_type($result, int $field_number): string
+function pg_field_table($result, int $field, bool $oid_only = false)
{
error_clear_last();
- $result = \pg_field_type($result, $field_number);
+ $result = \pg_field_table($result, $field, $oid_only);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -501,7 +345,7 @@ function pg_field_type($result, int $field_number): string
* pg_flush flushes any outbound query data waiting to be
* sent on the connection.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @return mixed Returns TRUE if the flush was successful or no data was waiting to be
* flushed, 0 if part of the pending data was flushed but
* more remains.
@@ -521,15 +365,14 @@ function pg_flush($connection)
/**
* pg_free_result frees the memory and data associated with the
- * specified PostgreSQL query result resource.
+ * specified PgSql\Result instance.
*
* This function need only be called if memory
* consumption during script execution is a problem. Otherwise, all result memory will
* be automatically freed when the script ends.
*
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
+ * @param resource $result An PgSql\Result instance, returned by pg_query,
+ * pg_query_params or pg_execute(among others).
* @throws PgsqlException
*
*/
@@ -545,13 +388,14 @@ function pg_free_result($result): void
/**
* pg_host returns the host name of the given
- * PostgreSQL connection resource is
+ * PostgreSQL connection instance is
* connected to.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is NULL, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @return string A string containing the name of the host the
* connection is to.
* @throws PgsqlException
@@ -565,7 +409,7 @@ function pg_host($connection = null): string
} else {
$result = \pg_host();
}
- if ($result === false) {
+ if ($result === '') {
throw PgsqlException::createFromPhpError();
}
return $result;
@@ -574,124 +418,45 @@ function pg_host($connection = null): string
/**
* pg_insert inserts the values
- * of assoc_array into the table specified
- * by table_name. If options
- * is specified, pg_convert is applied
- * to assoc_array with the specified options.
+ * of values into the table specified
+ * by table_name.
*
- * If options is specified,
+ * If flags is specified,
* pg_convert is applied to
- * assoc_array with the specified flags.
+ * values with the specified flags.
*
- * By default pg_insert passes raw values. Values
- * must be escaped or PGSQL_DML_ESCAPE option must be
- * specified. PGSQL_DML_ESCAPE quotes and escapes
- * parameters/identifiers. Therefore, table/column names became case
- * sensitive.
+ * By default pg_insert passes raw values.
+ * Values must be escaped or the PGSQL_DML_ESCAPE flag
+ * must be specified in flags.
+ * PGSQL_DML_ESCAPE quotes and escapes parameters/identifiers.
+ * Therefore, table/column names become case sensitive.
*
* Note that neither escape nor prepared query can protect LIKE query,
* JSON, Array, Regex, etc. These parameters should be handled
* according to their contexts. i.e. Escape/validate values.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table into which to insert rows. The table table_name must at least
- * have as many columns as assoc_array has elements.
- * @param array $assoc_array An array whose keys are field names in the table table_name,
+ * have as many columns as values has elements.
+ * @param array $values An array whose keys are field names in the table table_name,
* and whose values are the values of those fields that are to be inserted.
- * @param int $options Any number of PGSQL_CONV_OPTS,
+ * @param int $flags Any number of PGSQL_CONV_OPTS,
* PGSQL_DML_NO_CONV,
* PGSQL_DML_ESCAPE,
* PGSQL_DML_EXEC,
* PGSQL_DML_ASYNC or
* PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the
- * options then query string is returned. When PGSQL_DML_NO_CONV
+ * flags then query string is returned. When PGSQL_DML_NO_CONV
* or PGSQL_DML_ESCAPE is set, it does not call pg_convert internally.
- * @return mixed Returns the connection resource on success. Returns string if PGSQL_DML_STRING is passed
- * via options.
- * @throws PgsqlException
- *
- */
-function pg_insert($connection, string $table_name, array $assoc_array, int $options = PGSQL_DML_EXEC)
-{
- error_clear_last();
- $result = \pg_insert($connection, $table_name, $assoc_array, $options);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_last_error returns the last error message
- * for a given connection.
- *
- * Error messages may be overwritten by internal PostgreSQL (libpq)
- * function calls. It may not return an appropriate error message if
- * multiple errors occur inside a PostgreSQL module function.
- *
- * Use pg_result_error, pg_result_error_field,
- * pg_result_status and
- * pg_connection_status for better error handling.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return string A string containing the last error message on the
- * given connection.
+ * @return mixed Returns TRUE on success.. Or returns a string on success if PGSQL_DML_STRING is passed
+ * via flags.
* @throws PgsqlException
*
*/
-function pg_last_error($connection = null): string
+function pg_insert($connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
- if ($connection !== null) {
- $result = \pg_last_error($connection);
- } else {
- $result = \pg_last_error();
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_last_notice returns the last notice
- * message from the PostgreSQL server on the specified
- * connection. The PostgreSQL server sends notice
- * messages in several cases, for instance when creating a SERIAL
- * column in a table.
- *
- * With pg_last_notice, you can avoid issuing useless
- * queries by checking whether or not the notice is related to your transaction.
- *
- * Notice message tracking can be set to optional by setting 1 for
- * pgsql.ignore_notice in php.ini.
- *
- * Notice message logging can be set to optional by setting 0 for
- * pgsql.log_notice in php.ini.
- * Unless pgsql.ignore_notice is set
- * to 0, notice message cannot be logged.
- *
- * @param resource $connection PostgreSQL database connection resource.
- * @param int $option One of PGSQL_NOTICE_LAST (to return last notice),
- * PGSQL_NOTICE_ALL (to return all notices),
- * or PGSQL_NOTICE_CLEAR (to clear notices).
- * @return string A string containing the last notice on the
- * given connection with
- * PGSQL_NOTICE_LAST,
- * an array with PGSQL_NOTICE_ALL,
- * a boolean with PGSQL_NOTICE_CLEAR.
- * @throws PgsqlException
- *
- */
-function pg_last_notice($connection, int $option = PGSQL_NOTICE_LAST): string
-{
- error_clear_last();
- $result = \pg_last_notice($connection, $option);
+ $result = \pg_insert($connection, $table_name, $values, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -719,10 +484,9 @@ function pg_last_notice($connection, int $option = PGSQL_NOTICE_LAST): string
* the value of the most recently used sequence in the session. This avoids
* the need for naming the sequence, table or column altogether.
*
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
- * @return string A string containing the OID assigned to the most recently inserted
+ * @param resource $result An PgSql\Result instance, returned by pg_query,
+ * pg_query_params or pg_execute(among others).
+ * @return string An int or string containing the OID assigned to the most recently inserted
* row in the specified connection or
* no available OID.
* @throws PgsqlException
@@ -740,21 +504,19 @@ function pg_last_oid($result): string
/**
- * pg_lo_close closes a large
- * object. large_object is a resource for the
- * large object from pg_lo_open.
+ * pg_lo_close closes a large object.
*
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
+ * @param resource $lob An PgSql\Lob instance, returned by pg_lo_open.
* @throws PgsqlException
*
*/
-function pg_lo_close($large_object): void
+function pg_lo_close($lob): void
{
error_clear_last();
- $result = \pg_lo_close($large_object);
+ $result = \pg_lo_close($lob);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -769,10 +531,11 @@ function pg_lo_close($large_object): void
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param int $oid The OID of the large object in the database.
* @param string $pathname The full path and file name of the file in which to write the
* large object on the client filesystem.
@@ -805,16 +568,17 @@ function pg_lo_export($connection = null, int $oid = null, string $pathname = nu
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $pathname The full path and file name of the file on the client
* filesystem from which to read the large object data.
- * @param mixed $object_id If an object_id is given the function
+ * @param $object_id If an object_id is given the function
* will try to create a large object with this id, else a free
* object id is assigned by the server. The parameter
- * was added in PHP 5.3 and relies on functionality that first
+ * relies on functionality that first
* appeared in PostgreSQL 8.1.
* @return int The OID of the newly created large object.
* @throws PgsqlException
@@ -841,19 +605,20 @@ function pg_lo_import($connection = null, string $pathname = null, $object_id =
/**
* pg_lo_open opens a large object in the database
- * and returns large object resource so that it can be manipulated.
+ * and returns an PgSql\Lob instance so that it can be manipulated.
*
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param int $oid The OID of the large object in the database.
* @param string $mode Can be either "r" for read-only, "w" for write only or "rw" for read and
* write.
- * @return resource A large object resource.
+ * @return resource An PgSql\Lob instance.
* @throws PgsqlException
*
*/
@@ -869,49 +634,24 @@ function pg_lo_open($connection, int $oid, string $mode)
/**
- * pg_lo_read_all reads a large object and passes
- * it straight through to the browser after sending all pending
- * headers. Mainly intended for sending binary data like images or
- * sound.
- *
- * To use the large object interface, it is necessary to
- * enclose it within a transaction block.
- *
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
- * @return int Number of bytes read.
- * @throws PgsqlException
- *
- */
-function pg_lo_read_all($large_object): int
-{
- error_clear_last();
- $result = \pg_lo_read_all($large_object);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* pg_lo_read reads at most
- * len bytes from a large object and
+ * length bytes from a large object and
* returns it as a string.
*
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
- * @param int $len An optional maximum number of bytes to return.
- * @return string A string containing len bytes from the
+ * @param resource $lob An PgSql\Lob instance, returned by pg_lo_open.
+ * @param int $length An optional maximum number of bytes to return.
+ * @return string A string containing length bytes from the
* large object.
* @throws PgsqlException
*
*/
-function pg_lo_read($large_object, int $len = 8192): string
+function pg_lo_read($lob, int $length = 8192): string
{
error_clear_last();
- $result = \pg_lo_read($large_object, $len);
+ $result = \pg_lo_read($lob, $length);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -920,13 +660,12 @@ function pg_lo_read($large_object, int $len = 8192): string
/**
- * pg_lo_seek seeks a position within a large object
- * resource.
+ * pg_lo_seek seeks a position within an PgSql\Lob instance.
*
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
+ * @param resource $lob An PgSql\Lob instance, returned by pg_lo_open.
* @param int $offset The number of bytes to seek.
* @param int $whence One of the constants PGSQL_SEEK_SET (seek from object start),
* PGSQL_SEEK_CUR (seek from current position)
@@ -934,10 +673,10 @@ function pg_lo_read($large_object, int $len = 8192): string
* @throws PgsqlException
*
*/
-function pg_lo_seek($large_object, int $offset, int $whence = PGSQL_SEEK_CUR): void
+function pg_lo_seek($lob, int $offset, int $whence = SEEK_CUR): void
{
error_clear_last();
- $result = \pg_lo_seek($large_object, $offset, $whence);
+ $result = \pg_lo_seek($lob, $offset, $whence);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -945,21 +684,20 @@ function pg_lo_seek($large_object, int $offset, int $whence = PGSQL_SEEK_CUR): v
/**
- * pg_lo_truncate truncates a large object
- * resource.
+ * pg_lo_truncate truncates an PgSql\Lob instance.
*
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
+ * @param resource $lob An PgSql\Lob instance, returned by pg_lo_open.
* @param int $size The number of bytes to truncate.
* @throws PgsqlException
*
*/
-function pg_lo_truncate($large_object, int $size): void
+function pg_lo_truncate($lob, int $size): void
{
error_clear_last();
- $result = \pg_lo_truncate($large_object, $size);
+ $result = \pg_lo_truncate($lob, $size);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -973,10 +711,11 @@ function pg_lo_truncate($large_object, int $size): void
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param int $oid The OID of the large object in the database.
* @throws PgsqlException
*
@@ -998,24 +737,24 @@ function pg_lo_unlink($connection, int $oid): void
* To use the large object interface, it is necessary to
* enclose it within a transaction block.
*
- * @param resource $large_object PostgreSQL large object (LOB) resource, returned by pg_lo_open.
- * @param string $data The data to be written to the large object. If len is
- * specified and is less than the length of data, only
- * len bytes will be written.
- * @param int $len An optional maximum number of bytes to write. Must be greater than zero
+ * @param resource $lob An PgSql\Lob instance, returned by pg_lo_open.
+ * @param string $data The data to be written to the large object. If length is
+ * an int and is less than the length of data, only
+ * length bytes will be written.
+ * @param int $length An optional maximum number of bytes to write. Must be greater than zero
* and no greater than the length of data. Defaults to
* the length of data.
* @return int The number of bytes written to the large object.
* @throws PgsqlException
*
*/
-function pg_lo_write($large_object, string $data, int $len = null): int
+function pg_lo_write($lob, string $data, int $length = null): int
{
error_clear_last();
- if ($len !== null) {
- $result = \pg_lo_write($large_object, $data, $len);
+ if ($length !== null) {
+ $result = \pg_lo_write($lob, $data, $length);
} else {
- $result = \pg_lo_write($large_object, $data);
+ $result = \pg_lo_write($lob, $data);
}
if ($result === false) {
throw PgsqlException::createFromPhpError();
@@ -1028,7 +767,7 @@ function pg_lo_write($large_object, string $data, int $len = null): int
* pg_meta_data returns table definition for
* table_name as an array.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name The name of the table.
* @param bool $extended Flag for returning extended meta data. Default to FALSE.
* @return array An array of the table definition.
@@ -1047,35 +786,6 @@ function pg_meta_data($connection, string $table_name, bool $extended = false):
/**
- * pg_options will return a string containing
- * the options specified on the given PostgreSQL
- * connection resource.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return string A string containing the connection
- * options.
- * @throws PgsqlException
- *
- */
-function pg_options($connection = null): string
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_options($connection);
- } else {
- $result = \pg_options();
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* Looks up a current parameter setting of the server.
*
* Certain parameter values are reported by the server automatically at
@@ -1099,10 +809,11 @@ function pg_options($connection = null): string
* anyway. Applications are encouraged to use pg_parameter_status rather than ad
* hoc code to determine these values.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $param_name Possible param_name values include server_version,
* server_encoding, client_encoding,
* is_superuser, session_authorization,
@@ -1132,14 +843,14 @@ function pg_parameter_status($connection = null, string $param_name = null): str
/**
* pg_pconnect opens a connection to a
- * PostgreSQL database. It returns a connection resource that is
+ * PostgreSQL database. It returns an PgSql\Connection instance that is
* needed by other PostgreSQL functions.
*
* If a second call is made to pg_pconnect with
* the same connection_string as an existing connection, the
* existing connection will be returned unless you pass
* PGSQL_CONNECT_FORCE_NEW as
- * connect_type.
+ * flags.
*
* To enable persistent connection, the pgsql.allow_persistent
* php.ini directive must be set to "On" (which is the default).
@@ -1167,21 +878,17 @@ function pg_parameter_status($connection = null, string $param_name = null): str
* requiressl (deprecated in favor of sslmode), and
* service. Which of these arguments exist depends
* on your PostgreSQL version.
- * @param int $connect_type If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection
+ * @param int $flags If PGSQL_CONNECT_FORCE_NEW is passed, then a new connection
* is created, even if the connection_string is identical to
* an existing connection.
- * @return resource PostgreSQL connection resource on success, FALSE on failure.
+ * @return resource Returns an PgSql\Connection instance on success.
* @throws PgsqlException
*
*/
-function pg_pconnect(string $connection_string, int $connect_type = null)
+function pg_pconnect(string $connection_string, int $flags = 0)
{
error_clear_last();
- if ($connect_type !== null) {
- $result = \pg_pconnect($connection_string, $connect_type);
- } else {
- $result = \pg_pconnect($connection_string);
- }
+ $result = \pg_pconnect($connection_string, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -1193,10 +900,11 @@ function pg_pconnect(string $connection_string, int $connect_type = null)
* pg_ping pings a database connection and tries to
* reconnect it if it is broken.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is NULL, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @throws PgsqlException
*
*/
@@ -1215,35 +923,6 @@ function pg_ping($connection = null): void
/**
- * pg_port returns the port number that the
- * given PostgreSQL connection resource is
- * connected to.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return int An int containing the port number of the database
- * server the connection is to.
- * @throws PgsqlException
- *
- */
-function pg_port($connection = null): int
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_port($connection);
- } else {
- $result = \pg_port();
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
* pg_prepare creates a prepared statement for later execution with
* pg_execute or pg_send_execute.
* This feature allows commands that will be used repeatedly to
@@ -1264,17 +943,18 @@ function pg_port($connection = null): int
* is no PHP function for deleting a prepared statement, the SQL DEALLOCATE
* statement can be used for that purpose.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $stmtname The name to give the prepared statement. Must be unique per-connection. If
* "" is specified, then an unnamed statement is created, overwriting any
* previously defined unnamed statement.
* @param string $query The parameterized SQL statement. Must contain only a single statement.
* (multiple statements separated by semi-colons are not allowed.) If any parameters
* are used, they are referred to as $1, $2, etc.
- * @return resource A query result resource on success.
+ * @return resource An PgSql\Result instance on success.
* @throws PgsqlException
*
*/
@@ -1310,10 +990,11 @@ function pg_prepare($connection = null, string $stmtname = null, string $query =
* is to use pg_copy_from. This is a far simpler
* interface.
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $data A line of text to be sent directly to the PostgreSQL backend. A NULL
* terminator is added automatically.
* @throws PgsqlException
@@ -1360,10 +1041,11 @@ function pg_put_line($connection = null, string $data = null): void
* most one SQL command in the given string. (There can be semicolons in it,
* but not more than one nonempty command.)
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $query The parameterized SQL statement. Must contain only a single statement.
* (multiple statements separated by semi-colons are not allowed.) If any parameters
* are used, they are referred to as $1, $2, etc.
@@ -1381,7 +1063,7 @@ function pg_put_line($connection = null, string $data = null): void
* Values intended for bytea fields are not supported as
* parameters. Use pg_escape_bytea instead, or use the
* large object functions.
- * @return resource A query result resource on success.
+ * @return resource An PgSql\Result instance on success.
* @throws PgsqlException
*
*/
@@ -1422,10 +1104,11 @@ function pg_query_params($connection = null, string $query = null, array $params
*
*
*
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is unspecified, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @param string $query The SQL statement or statements to be executed. When multiple statements are passed to the function,
* they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands
* included in the query string. However, using multiple transactions in one function call is not recommended.
@@ -1439,7 +1122,7 @@ function pg_query_params($connection = null, string $query = null, array $params
*
* Any user-supplied data substituted directly into a query string should
* be properly escaped.
- * @return resource A query result resource on success.
+ * @return resource An PgSql\Result instance on success.
* @throws PgsqlException
*
*/
@@ -1462,9 +1145,9 @@ function pg_query($connection = null, string $query = null)
/**
* pg_result_error_field returns one of the detailed error message
- * fields associated with result resource. It is only available
+ * fields associated with result instance. It is only available
* against a PostgreSQL 7.4 or above server. The error field is specified by
- * the fieldcode.
+ * the field_code.
*
* Because pg_query and pg_query_params return FALSE if the query fails,
* you must use pg_send_query and
@@ -1474,9 +1157,9 @@ function pg_query($connection = null, string $query = null)
* use pg_set_error_verbosity and pg_last_error
* and then parse the result.
*
- * @param resource $result A PostgreSQL query result resource from a previously executed
- * statement.
- * @param int $fieldcode Possible fieldcode values are: PGSQL_DIAG_SEVERITY,
+ * @param resource $result An PgSql\Result instance, returned by pg_query,
+ * pg_query_params or pg_execute(among others).
+ * @param int $field_code Possible field_code values are: PGSQL_DIAG_SEVERITY,
* PGSQL_DIAG_SQLSTATE, PGSQL_DIAG_MESSAGE_PRIMARY,
* PGSQL_DIAG_MESSAGE_DETAIL,
* PGSQL_DIAG_MESSAGE_HINT, PGSQL_DIAG_STATEMENT_POSITION,
@@ -1489,10 +1172,10 @@ function pg_query($connection = null, string $query = null)
* @throws PgsqlException
*
*/
-function pg_result_error_field($result, int $fieldcode): ?string
+function pg_result_error_field($result, int $field_code): ?string
{
error_clear_last();
- $result = \pg_result_error_field($result, $fieldcode);
+ $result = \pg_result_error_field($result, $field_code);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -1502,20 +1185,19 @@ function pg_result_error_field($result, int $fieldcode): ?string
/**
* pg_result_seek sets the internal row offset in
- * a result resource.
+ * the result instance.
*
- * @param resource $result PostgreSQL query result resource, returned by pg_query,
- * pg_query_params or pg_execute
- * (among others).
- * @param int $offset Row to move the internal offset to in the result resource.
+ * @param resource $result An PgSql\Result instance, returned by pg_query,
+ * pg_query_params or pg_execute(among others).
+ * @param int $row Row to move the internal offset to in the PgSql\Result instance.
* Rows are numbered starting from zero.
* @throws PgsqlException
*
*/
-function pg_result_seek($result, int $offset): void
+function pg_result_seek($result, int $row): void
{
error_clear_last();
- $result = \pg_result_seek($result, $offset);
+ $result = \pg_result_seek($result, $row);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -1524,14 +1206,14 @@ function pg_result_seek($result, int $offset): void
/**
* pg_select selects records specified by
- * assoc_array which has
+ * conditions which has
* field=&gt;value. For a successful query, it returns an
* array containing all records and fields that match the condition
- * specified by assoc_array.
+ * specified by conditions.
*
- * If options is specified,
+ * If flags is specified,
* pg_convert is applied to
- * assoc_array with the specified flags.
+ * conditions with the specified flags.
*
* By default pg_select passes raw values. Values
* must be escaped or PGSQL_DML_ESCAPE option must be
@@ -1543,28 +1225,28 @@ function pg_result_seek($result, int $offset): void
* JSON, Array, Regex, etc. These parameters should be handled
* according to their contexts. i.e. Escape/validate values.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table from which to select rows.
- * @param array $assoc_array An array whose keys are field names in the table table_name,
+ * @param array $conditions An array whose keys are field names in the table table_name,
* and whose values are the conditions that a row must meet to be retrieved.
- * @param int $options Any number of PGSQL_CONV_FORCE_NULL,
+ * @param int $flags Any number of PGSQL_CONV_FORCE_NULL,
* PGSQL_DML_NO_CONV,
* PGSQL_DML_ESCAPE,
* PGSQL_DML_EXEC,
* PGSQL_DML_ASYNC or
* PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the
- * options then query string is returned. When PGSQL_DML_NO_CONV
+ * flags then query string is returned. When PGSQL_DML_NO_CONV
* or PGSQL_DML_ESCAPE is set, it does not call pg_convert internally.
- * @param int $result_type
- * @return mixed Returns TRUE on success. Returns string if PGSQL_DML_STRING is passed
- * via options.
+ * @param int $mode
+ * @return mixed Returns string if PGSQL_DML_STRING is passed
+ * via flags, otherwise it returns an array on success.
* @throws PgsqlException
*
*/
-function pg_select($connection, string $table_name, array $assoc_array, int $options = PGSQL_DML_EXEC, int $result_type = PGSQL_ASSOC)
+function pg_select($connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC, int $mode = PGSQL_ASSOC)
{
error_clear_last();
- $result = \pg_select($connection, $table_name, $assoc_array, $options, $result_type);
+ $result = \pg_select($connection, $table_name, $conditions, $flags, $mode);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
@@ -1573,144 +1255,10 @@ function pg_select($connection, string $table_name, array $assoc_array, int $opt
/**
- * Sends a request to execute a prepared statement with given parameters,
- * without waiting for the result(s).
- *
- * This is similar to pg_send_query_params, but the command to be executed is specified
- * by naming a previously-prepared statement, instead of giving a query string. The
- * function's parameters are handled identically to pg_execute.
- * Like pg_execute, it will not work on pre-7.4 versions of
- * PostgreSQL.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @param string $stmtname The name of the prepared statement to execute. if
- * "" is specified, then the unnamed statement is executed. The name must have
- * been previously prepared using pg_prepare,
- * pg_send_prepare or a PREPARE SQL
- * command.
- * @param array $params An array of parameter values to substitute for the $1, $2, etc. placeholders
- * in the original prepared query string. The number of elements in the array
- * must match the number of placeholders.
- * @throws PgsqlException
- *
- */
-function pg_send_execute($connection, string $stmtname, array $params): void
-{
- error_clear_last();
- $result = \pg_send_execute($connection, $stmtname, $params);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * Sends a request to create a prepared statement with the given parameters,
- * without waiting for completion.
- *
- * This is an asynchronous version of pg_prepare: it returns TRUE if it was able to
- * dispatch the request, and FALSE if not. After a successful call, call
- * pg_get_result to determine whether the server successfully created the
- * prepared statement. The function's parameters are handled identically to
- * pg_prepare. Like pg_prepare, it will not work
- * on pre-7.4 versions of PostgreSQL.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @param string $stmtname The name to give the prepared statement. Must be unique per-connection. If
- * "" is specified, then an unnamed statement is created, overwriting any
- * previously defined unnamed statement.
- * @param string $query The parameterized SQL statement. Must contain only a single statement.
- * (multiple statements separated by semi-colons are not allowed.) If any parameters
- * are used, they are referred to as $1, $2, etc.
- * @throws PgsqlException
- *
- */
-function pg_send_prepare($connection, string $stmtname, string $query): void
-{
- error_clear_last();
- $result = \pg_send_prepare($connection, $stmtname, $query);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * Submits a command and separate parameters to the server without
- * waiting for the result(s).
- *
- * This is equivalent to pg_send_query except that query
- * parameters can be specified separately from the
- * query string. The function's parameters are
- * handled identically to pg_query_params. Like
- * pg_query_params, it will not work on pre-7.4 PostgreSQL
- * connections, and it allows only one command in the query string.
- *
- * @param resource $connection PostgreSQL database connection resource.
- * @param string $query The parameterized SQL statement. Must contain only a single statement.
- * (multiple statements separated by semi-colons are not allowed.) If any parameters
- * are used, they are referred to as $1, $2, etc.
- * @param array $params An array of parameter values to substitute for the $1, $2, etc. placeholders
- * in the original prepared query string. The number of elements in the array
- * must match the number of placeholders.
- * @throws PgsqlException
- *
- */
-function pg_send_query_params($connection, string $query, array $params): void
-{
- error_clear_last();
- $result = \pg_send_query_params($connection, $query, $params);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * pg_send_query sends a query or queries asynchronously to the
- * connection. Unlike
- * pg_query, it can send multiple queries at once to
- * PostgreSQL and get the results one by one using
- * pg_get_result.
- *
- * Script execution is not blocked while the queries are executing. Use
- * pg_connection_busy to check if the connection is
- * busy (i.e. the query is executing). Queries may be cancelled using
- * pg_cancel_query.
- *
- * Although the user can send multiple queries at once, multiple queries
- * cannot be sent over a busy connection. If a query is sent while
- * the connection is busy, it waits until the last query is finished and
- * discards all its results.
- *
- * @param resource $connection PostgreSQL database connection resource.
- * @param string $query The SQL statement or statements to be executed.
- *
- * Data inside the query should be properly escaped.
- * @throws PgsqlException
- *
- */
-function pg_send_query($connection, string $query): void
-{
- error_clear_last();
- $result = \pg_send_query($connection, $query);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
* pg_socket returns a read only resource
* corresponding to the socket underlying the given PostgreSQL connection.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @return resource A socket resource on success.
* @throws PgsqlException
*
@@ -1739,138 +1287,72 @@ function pg_socket($connection)
* PostgreSQL server. For more information, refer to the
* PostgreSQL Documentation.
*
- * @param string $pathname The full path and file name of the file in which to write the
+ * @param string $filename The full path and file name of the file in which to write the
* trace log. Same as in fopen.
* @param string $mode An optional file access mode, same as for fopen.
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @throws PgsqlException
- *
- */
-function pg_trace(string $pathname, string $mode = "w", $connection = null): void
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_trace($pathname, $mode, $connection);
- } else {
- $result = \pg_trace($pathname, $mode);
- }
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
-}
-
-
-/**
- * pg_tty returns the TTY name that server
- * side debugging output is sent to on the given PostgreSQL
- * connection resource.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return string A string containing the debug TTY of
- * the connection.
+ * @param resource $connection An PgSql\Connection instance.
+ * When connection is NULL, the default connection is used.
+ * The default connection is the last connection made by pg_connect
+ * or pg_pconnect.
+ * As of PHP 8.1.0, using the default connection is deprecated.
* @throws PgsqlException
*
*/
-function pg_tty($connection = null): string
+function pg_trace(string $filename, string $mode = "w", $connection = null): void
{
error_clear_last();
if ($connection !== null) {
- $result = \pg_tty($connection);
+ $result = \pg_trace($filename, $mode, $connection);
} else {
- $result = \pg_tty();
+ $result = \pg_trace($filename, $mode);
}
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
- return $result;
}
/**
* pg_update updates records that matches
- * condition with data. If
- * options is specified,
- * pg_convert is applied to
- * data with specified options.
+ * conditions with values.
*
- * pg_update updates records specified by
- * assoc_array which has
- * field=&gt;value.
- *
- * If options is specified,
+ * If flags is specified,
* pg_convert is applied to
- * assoc_array with the specified flags.
+ * values with the specified flags.
*
- * By default pg_update passes raw values. Values
- * must be escaped or PGSQL_DML_ESCAPE option must be
- * specified. PGSQL_DML_ESCAPE quotes and escapes
- * parameters/identifiers. Therefore, table/column names became case
- * sensitive.
+ * By default pg_update passes raw values.
+ * Values must be escaped or the PGSQL_DML_ESCAPE flag
+ * must be specified in flags.
+ * PGSQL_DML_ESCAPE quotes and escapes parameters/identifiers.
+ * Therefore, table/column names become case sensitive.
*
* Note that neither escape nor prepared query can protect LIKE query,
* JSON, Array, Regex, etc. These parameters should be handled
* according to their contexts. i.e. Escape/validate values.
*
- * @param resource $connection PostgreSQL database connection resource.
+ * @param resource $connection An PgSql\Connection instance.
* @param string $table_name Name of the table into which to update rows.
- * @param array $data An array whose keys are field names in the table table_name,
+ * @param array $values An array whose keys are field names in the table table_name,
* and whose values are what matched rows are to be updated to.
- * @param array $condition An array whose keys are field names in the table table_name,
+ * @param array $conditions An array whose keys are field names in the table table_name,
* and whose values are the conditions that a row must meet to be updated.
- * @param int $options Any number of PGSQL_CONV_FORCE_NULL,
+ * @param int $flags Any number of PGSQL_CONV_FORCE_NULL,
* PGSQL_DML_NO_CONV,
* PGSQL_DML_ESCAPE,
* PGSQL_DML_EXEC,
* PGSQL_DML_ASYNC or
* PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the
- * options then query string is returned. When PGSQL_DML_NO_CONV
+ * flags then query string is returned. When PGSQL_DML_NO_CONV
* or PGSQL_DML_ESCAPE is set, it does not call pg_convert internally.
* @return mixed Returns TRUE on success. Returns string if PGSQL_DML_STRING is passed
- * via options.
+ * via flags.
* @throws PgsqlException
*
*/
-function pg_update($connection, string $table_name, array $data, array $condition, int $options = PGSQL_DML_EXEC)
+function pg_update($connection, string $table_name, array $values, array $conditions, int $flags = PGSQL_DML_EXEC)
{
error_clear_last();
- $result = \pg_update($connection, $table_name, $data, $condition, $options);
- if ($result === false) {
- throw PgsqlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * pg_version returns an array with the client, protocol
- * and server version. Protocol and server versions are only available if PHP
- * was compiled with PostgreSQL 7.4 or later.
- *
- * For more detailed server information, use pg_parameter_status.
- *
- * @param resource $connection PostgreSQL database connection resource. When
- * connection is not present, the default connection
- * is used. The default connection is the last connection made by
- * pg_connect or pg_pconnect.
- * @return array Returns an array with client, protocol
- * and server keys and values (if available) or invalid connection.
- * @throws PgsqlException
- *
- */
-function pg_version($connection = null): array
-{
- error_clear_last();
- if ($connection !== null) {
- $result = \pg_version($connection);
- } else {
- $result = \pg_version();
- }
+ $result = \pg_update($connection, $table_name, $values, $conditions, $flags);
if ($result === false) {
throw PgsqlException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/posix.php b/vendor/thecodingmachine/safe/generated/posix.php
index 6ae99d88c..26b77eaa9 100644
--- a/vendor/thecodingmachine/safe/generated/posix.php
+++ b/vendor/thecodingmachine/safe/generated/posix.php
@@ -7,8 +7,8 @@ use Safe\Exceptions\PosixException;
/**
* posix_access checks the user's permission of a file.
*
- * @param string $file The name of the file to be tested.
- * @param int $mode A mask consisting of one or more of POSIX_F_OK,
+ * @param string $filename The name of the file to be tested.
+ * @param int $flags A mask consisting of one or more of POSIX_F_OK,
* POSIX_R_OK, POSIX_W_OK and
* POSIX_X_OK.
*
@@ -20,10 +20,10 @@ use Safe\Exceptions\PosixException;
* @throws PosixException
*
*/
-function posix_access(string $file, int $mode = POSIX_F_OK): void
+function posix_access(string $filename, int $flags = 0): void
{
error_clear_last();
- $result = \posix_access($file, $mode);
+ $result = \posix_access($filename, $flags);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -31,6 +31,70 @@ function posix_access(string $file, int $mode = POSIX_F_OK): void
/**
+ * Gets information about a group provided its id.
+ *
+ * @param int $group_id The group id.
+ * @return array The array elements returned are:
+ *
+ * The group information array
+ *
+ *
+ *
+ * Element
+ * Description
+ *
+ *
+ *
+ *
+ * name
+ *
+ * The name element contains the name of the group. This is
+ * a short, usually less than 16 character "handle" of the
+ * group, not the real, full name.
+ *
+ *
+ *
+ * passwd
+ *
+ * The passwd element contains the group's password in an
+ * encrypted format. Often, for example on a system employing
+ * "shadow" passwords, an asterisk is returned instead.
+ *
+ *
+ *
+ * gid
+ *
+ * Group ID, should be the same as the
+ * group_id parameter used when calling the
+ * function, and hence redundant.
+ *
+ *
+ *
+ * members
+ *
+ * This consists of an array of
+ * string's for all the members in the group.
+ *
+ *
+ *
+ *
+ *
+ * The function returns FALSE on failure.
+ * @throws PosixException
+ *
+ */
+function posix_getgrgid(int $group_id): array
+{
+ error_clear_last();
+ $result = \posix_getgrgid($group_id);
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Gets information about a group provided its name.
*
* @param string $name The name of the group
@@ -95,18 +159,260 @@ function posix_getgrnam(string $name): array
/**
- * Returns the process group identifier of the process
- * pid.
+ * Gets the group set of the current process.
+ *
+ * @return array Returns an array of integers containing the numeric group ids of the group
+ * set of the current process.
+ * @throws PosixException
+ *
+ */
+function posix_getgroups(): array
+{
+ error_clear_last();
+ $result = \posix_getgroups();
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the login name of the user owning the current process.
+ *
+ * @return string Returns the login name of the user, as a string.
+ * @throws PosixException
+ *
+ */
+function posix_getlogin(): string
+{
+ error_clear_last();
+ $result = \posix_getlogin();
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns an array of information about the user
+ * referenced by the given user ID.
+ *
+ * @param int $user_id The user identifier.
+ * @return array Returns an associative array with the following elements:
+ *
+ * The user information array
+ *
+ *
+ *
+ * Element
+ * Description
+ *
+ *
+ *
+ *
+ * name
+ *
+ * The name element contains the username of the user. This is
+ * a short, usually less than 16 character "handle" of the
+ * user, not the real, full name.
+ *
+ *
+ *
+ * passwd
+ *
+ * The passwd element contains the user's password in an
+ * encrypted format. Often, for example on a system employing
+ * "shadow" passwords, an asterisk is returned instead.
+ *
+ *
+ *
+ * uid
+ *
+ * User ID, should be the same as the
+ * user_id parameter used when calling the
+ * function, and hence redundant.
*
- * @param int $pid The process id.
- * @return int Returns the identifier, as an integer.
+ *
+ *
+ * gid
+ *
+ * The group ID of the user. Use the function
+ * posix_getgrgid to resolve the group
+ * name and a list of its members.
+ *
+ *
+ *
+ * gecos
+ *
+ * GECOS is an obsolete term that refers to the finger
+ * information field on a Honeywell batch processing system.
+ * The field, however, lives on, and its contents have been
+ * formalized by POSIX. The field contains a comma separated
+ * list containing the user's full name, office phone, office
+ * number, and home phone number. On most systems, only the
+ * user's full name is available.
+ *
+ *
+ *
+ * dir
+ *
+ * This element contains the absolute path to the
+ * home directory of the user.
+ *
+ *
+ *
+ * shell
+ *
+ * The shell element contains the absolute path to the
+ * executable of the user's default shell.
+ *
+ *
+ *
+ *
+ *
+ * The function returns FALSE on failure.
* @throws PosixException
*
*/
-function posix_getpgid(int $pid): int
+function posix_getpwuid(int $user_id): array
{
error_clear_last();
- $result = \posix_getpgid($pid);
+ $result = \posix_getpwuid($user_id);
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * posix_getrlimit returns an array
+ * of information about the current resource's soft and hard limits.
+ *
+ *
+ * Each resource has an associated soft and hard limit. The soft
+ * limit is the value that the kernel enforces for the corresponding
+ * resource. The hard limit acts as a ceiling for the soft limit.
+ * An unprivileged process may only set its soft limit to a value
+ * from 0 to the hard limit, and irreversibly lower its hard limit.
+ *
+ * @return array Returns an associative array of elements for each
+ * limit that is defined. Each limit has a soft and a hard limit.
+ *
+ * List of possible limits returned
+ *
+ *
+ *
+ * Limit name
+ * Limit description
+ *
+ *
+ *
+ *
+ * core
+ *
+ * The maximum size of the core file. When 0, not core files are
+ * created. When core files are larger than this size, they will
+ * be truncated at this size.
+ *
+ *
+ *
+ * totalmem
+ *
+ * The maximum size of the memory of the process, in bytes.
+ *
+ *
+ *
+ * virtualmem
+ *
+ * The maximum size of the virtual memory for the process, in bytes.
+ *
+ *
+ *
+ * data
+ *
+ * The maximum size of the data segment for the process, in bytes.
+ *
+ *
+ *
+ * stack
+ *
+ * The maximum size of the process stack, in bytes.
+ *
+ *
+ *
+ * rss
+ *
+ * The maximum number of virtual pages resident in RAM
+ *
+ *
+ *
+ * maxproc
+ *
+ * The maximum number of processes that can be created for the
+ * real user ID of the calling process.
+ *
+ *
+ *
+ * memlock
+ *
+ * The maximum number of bytes of memory that may be locked into RAM.
+ *
+ *
+ *
+ * cpu
+ *
+ * The amount of time the process is allowed to use the CPU.
+ *
+ *
+ *
+ * filesize
+ *
+ * The maximum size of the data segment for the process, in bytes.
+ *
+ *
+ *
+ * openfiles
+ *
+ * One more than the maximum number of open file descriptors.
+ *
+ *
+ *
+ *
+ *
+ * The function returns FALSE on failure.
+ * @throws PosixException
+ *
+ */
+function posix_getrlimit(): array
+{
+ error_clear_last();
+ $result = \posix_getrlimit();
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Return the session id of the process process_id.
+ * The session id of a process is the process group id of the session leader.
+ *
+ * @param int $process_id The process identifier. If set to 0, the current process is
+ * assumed. If an invalid process_id is
+ * specified, then FALSE is returned and an error is set which
+ * can be checked with posix_get_last_error.
+ * @return int Returns the identifier, as an int.
+ * @throws PosixException
+ *
+ */
+function posix_getsid(int $process_id): int
+{
+ error_clear_last();
+ $result = \posix_getsid($process_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -117,15 +423,15 @@ function posix_getpgid(int $pid): int
/**
* Calculates the group access list for the user specified in name.
*
- * @param string $name The user to calculate the list for.
- * @param int $base_group_id Typically the group number from the password file.
+ * @param string $username The user to calculate the list for.
+ * @param int $group_id Typically the group number from the password file.
* @throws PosixException
*
*/
-function posix_initgroups(string $name, int $base_group_id): void
+function posix_initgroups(string $username, int $group_id): void
{
error_clear_last();
- $result = \posix_initgroups($name, $base_group_id);
+ $result = \posix_initgroups($username, $group_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -133,18 +439,18 @@ function posix_initgroups(string $name, int $base_group_id): void
/**
- * Send the signal sig to the process with
- * the process identifier pid.
+ * Send the signal signal to the process with
+ * the process identifier process_id.
*
- * @param int $pid The process identifier.
- * @param int $sig One of the PCNTL signals constants.
+ * @param int $process_id The process identifier.
+ * @param int $signal One of the PCNTL signals constants.
* @throws PosixException
*
*/
-function posix_kill(int $pid, int $sig): void
+function posix_kill(int $process_id, int $signal): void
{
error_clear_last();
- $result = \posix_kill($pid, $sig);
+ $result = \posix_kill($process_id, $signal);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -156,8 +462,8 @@ function posix_kill(int $pid, int $sig): void
* FIFO file which exists in the file system and acts as
* a bidirectional communication endpoint for processes.
*
- * @param string $pathname Path to the FIFO file.
- * @param int $mode The second parameter mode has to be given in
+ * @param string $filename Path to the FIFO file.
+ * @param int $permissions The second parameter permissions has to be given in
* octal notation (e.g. 0644). The permission of the newly created
* FIFO also depends on the setting of the current
* umask. The permissions of the created file are
@@ -165,10 +471,10 @@ function posix_kill(int $pid, int $sig): void
* @throws PosixException
*
*/
-function posix_mkfifo(string $pathname, int $mode): void
+function posix_mkfifo(string $filename, int $permissions): void
{
error_clear_last();
- $result = \posix_mkfifo($pathname, $mode);
+ $result = \posix_mkfifo($filename, $permissions);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -178,8 +484,8 @@ function posix_mkfifo(string $pathname, int $mode): void
/**
* Creates a special or ordinary file.
*
- * @param string $pathname The file to create
- * @param int $mode This parameter is constructed by a bitwise OR between file type (one of
+ * @param string $filename The file to create
+ * @param int $flags This parameter is constructed by a bitwise OR between file type (one of
* the following constants: POSIX_S_IFREG,
* POSIX_S_IFCHR, POSIX_S_IFBLK,
* POSIX_S_IFIFO or
@@ -190,10 +496,10 @@ function posix_mkfifo(string $pathname, int $mode): void
* @throws PosixException
*
*/
-function posix_mknod(string $pathname, int $mode, int $major = 0, int $minor = 0): void
+function posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): void
{
error_clear_last();
- $result = \posix_mknod($pathname, $mode, $major, $minor);
+ $result = \posix_mknod($filename, $flags, $major, $minor);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -205,14 +511,14 @@ function posix_mknod(string $pathname, int $mode, int $major = 0, int $minor = 0
* privileged function and needs appropriate privileges (usually
* root) on the system to be able to perform this function.
*
- * @param int $gid The group id.
+ * @param int $group_id The group id.
* @throws PosixException
*
*/
-function posix_setegid(int $gid): void
+function posix_setegid(int $group_id): void
{
error_clear_last();
- $result = \posix_setegid($gid);
+ $result = \posix_setegid($group_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -224,14 +530,14 @@ function posix_setegid(int $gid): void
* function and needs appropriate privileges (usually root) on
* the system to be able to perform this function.
*
- * @param int $uid The user id.
+ * @param int $user_id The user id.
* @throws PosixException
*
*/
-function posix_seteuid(int $uid): void
+function posix_seteuid(int $user_id): void
{
error_clear_last();
- $result = \posix_seteuid($uid);
+ $result = \posix_seteuid($user_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -246,14 +552,14 @@ function posix_seteuid(int $uid): void
* posix_setgid first,
* posix_setuid last.
*
- * @param int $gid The group id.
+ * @param int $group_id The group id.
* @throws PosixException
*
*/
-function posix_setgid(int $gid): void
+function posix_setgid(int $group_id): void
{
error_clear_last();
- $result = \posix_setgid($gid);
+ $result = \posix_setgid($group_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -261,18 +567,18 @@ function posix_setgid(int $gid): void
/**
- * Let the process pid join the process group
- * pgid.
+ * Let the process process_id join the process group
+ * process_group_id.
*
- * @param int $pid The process id.
- * @param int $pgid The process group id.
+ * @param int $process_id The process id.
+ * @param int $process_group_id The process group id.
* @throws PosixException
*
*/
-function posix_setpgid(int $pid, int $pgid): void
+function posix_setpgid(int $process_id, int $process_group_id): void
{
error_clear_last();
- $result = \posix_setpgid($pid, $pgid);
+ $result = \posix_setpgid($process_id, $process_group_id);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -293,17 +599,17 @@ function posix_setpgid(int $pid, int $pgid): void
* @param int $resource The
* resource limit constant
* corresponding to the limit that is being set.
- * @param int $softlimit The soft limit, in whatever unit the resource limit requires, or
+ * @param int $soft_limit The soft limit, in whatever unit the resource limit requires, or
* POSIX_RLIMIT_INFINITY.
- * @param int $hardlimit The hard limit, in whatever unit the resource limit requires, or
+ * @param int $hard_limit The hard limit, in whatever unit the resource limit requires, or
* POSIX_RLIMIT_INFINITY.
* @throws PosixException
*
*/
-function posix_setrlimit(int $resource, int $softlimit, int $hardlimit): void
+function posix_setrlimit(int $resource, int $soft_limit, int $hard_limit): void
{
error_clear_last();
- $result = \posix_setrlimit($resource, $softlimit, $hardlimit);
+ $result = \posix_setrlimit($resource, $soft_limit, $hard_limit);
if ($result === false) {
throw PosixException::createFromPhpError();
}
@@ -315,15 +621,113 @@ function posix_setrlimit(int $resource, int $softlimit, int $hardlimit): void
* function that needs appropriate privileges (usually root) on
* the system to be able to perform this function.
*
- * @param int $uid The user id.
+ * @param int $user_id The user id.
+ * @throws PosixException
+ *
+ */
+function posix_setuid(int $user_id): void
+{
+ error_clear_last();
+ $result = \posix_setuid($user_id);
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Gets information about the current CPU usage.
+ *
+ * @return array Returns a hash of strings with information about the current
+ * process CPU usage. The indices of the hash are:
+ *
+ *
+ *
+ * ticks - the number of clock ticks that have elapsed since
+ * reboot.
+ *
+ *
+ *
+ *
+ * utime - user time used by the current process.
+ *
+ *
+ *
+ *
+ * stime - system time used by the current process.
+ *
+ *
+ *
+ *
+ * cutime - user time used by current process and children.
+ *
+ *
+ *
+ *
+ * cstime - system time used by current process and children.
+ *
+ *
+ *
+ * The function returns FALSE on failure.
* @throws PosixException
*
*/
-function posix_setuid(int $uid): void
+function posix_times(): array
{
error_clear_last();
- $result = \posix_setuid($uid);
+ $result = \posix_times();
if ($result === false) {
throw PosixException::createFromPhpError();
}
+ return $result;
+}
+
+
+/**
+ * Gets information about the system.
+ *
+ * Posix requires that assumptions must not be made about the
+ * format of the values, e.g. the assumption that a release may contain
+ * three digits or anything else returned by this function.
+ *
+ * @return array Returns a hash of strings with information about the
+ * system. The indices of the hash are
+ *
+ *
+ * sysname - operating system name (e.g. Linux)
+ *
+ *
+ * nodename - system name (e.g. valiant)
+ *
+ *
+ * release - operating system release (e.g. 2.2.10)
+ *
+ *
+ * version - operating system version (e.g. #4 Tue Jul 20
+ * 17:01:36 MEST 1999)
+ *
+ *
+ * machine - system architecture (e.g. i586)
+ *
+ *
+ * domainname - DNS domainname (e.g. example.com)
+ *
+ *
+ *
+ * domainname is a GNU extension and not part of POSIX.1, so this
+ * field is only available on GNU systems or when using the GNU
+ * libc.
+ *
+ * The function returns FALSE on failure.
+ * @throws PosixException
+ *
+ */
+function posix_uname(): array
+{
+ error_clear_last();
+ $result = \posix_uname();
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
}
diff --git a/vendor/thecodingmachine/safe/generated/ps.php b/vendor/thecodingmachine/safe/generated/ps.php
index a66667aa9..a2dca7976 100644
--- a/vendor/thecodingmachine/safe/generated/ps.php
+++ b/vendor/thecodingmachine/safe/generated/ps.php
@@ -558,7 +558,7 @@ function ps_delete($psdoc): void
* Ends a page which was started with ps_begin_page.
* Ending a page will leave the current drawing context, which e.g. requires
* to reload fonts if they were loading within the page, and to set many
- * other drawing parameters like the line width, or color..
+ * other drawing parameters like the line width, or color.
*
* @param resource $psdoc Resource identifier of the postscript file
* as returned by ps_new.
diff --git a/vendor/thecodingmachine/safe/generated/pspell.php b/vendor/thecodingmachine/safe/generated/pspell.php
index 4cf4c36a6..b1e296d6d 100644
--- a/vendor/thecodingmachine/safe/generated/pspell.php
+++ b/vendor/thecodingmachine/safe/generated/pspell.php
@@ -7,15 +7,15 @@ use Safe\Exceptions\PspellException;
/**
*
*
- * @param int $dictionary_link
+ * @param int $dictionary An PSpell\Dictionary instance.
* @param string $word The added word.
* @throws PspellException
*
*/
-function pspell_add_to_personal(int $dictionary_link, string $word): void
+function pspell_add_to_personal(int $dictionary, string $word): void
{
error_clear_last();
- $result = \pspell_add_to_personal($dictionary_link, $word);
+ $result = \pspell_add_to_personal($dictionary, $word);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -25,15 +25,15 @@ function pspell_add_to_personal(int $dictionary_link, string $word): void
/**
*
*
- * @param int $dictionary_link
+ * @param int $dictionary An PSpell\Dictionary instance.
* @param string $word The added word.
* @throws PspellException
*
*/
-function pspell_add_to_session(int $dictionary_link, string $word): void
+function pspell_add_to_session(int $dictionary, string $word): void
{
error_clear_last();
- $result = \pspell_add_to_session($dictionary_link, $word);
+ $result = \pspell_add_to_session($dictionary, $word);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -43,14 +43,14 @@ function pspell_add_to_session(int $dictionary_link, string $word): void
/**
*
*
- * @param int $dictionary_link
+ * @param int $dictionary An PSpell\Dictionary instance.
* @throws PspellException
*
*/
-function pspell_clear_session(int $dictionary_link): void
+function pspell_clear_session(int $dictionary): void
{
error_clear_last();
- $result = \pspell_clear_session($dictionary_link);
+ $result = \pspell_clear_session($dictionary);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -86,22 +86,14 @@ function pspell_clear_session(int $dictionary_link): void
* 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned
* 32'. This parameter is largely untested, so be careful when
* using.
- * @return int Returns a pspell config identifier.
+ * @return int Returns an PSpell\Config instance on success.
* @throws PspellException
*
*/
-function pspell_config_create(string $language, string $spelling = null, string $jargon = null, string $encoding = null): int
+function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int
{
error_clear_last();
- if ($encoding !== null) {
- $result = \pspell_config_create($language, $spelling, $jargon, $encoding);
- } elseif ($jargon !== null) {
- $result = \pspell_config_create($language, $spelling, $jargon);
- } elseif ($spelling !== null) {
- $result = \pspell_config_create($language, $spelling);
- } else {
- $result = \pspell_config_create($language);
- }
+ $result = \pspell_config_create($language, $spelling, $jargon, $encoding);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -114,15 +106,15 @@ function pspell_config_create(string $language, string $spelling = null, string
* currently not documented; only its argument list is available.
*
*
- * @param int $conf
+ * @param int $config
* @param string $directory
* @throws PspellException
*
*/
-function pspell_config_data_dir(int $conf, string $directory): void
+function pspell_config_data_dir(int $config, string $directory): void
{
error_clear_last();
- $result = \pspell_config_data_dir($conf, $directory);
+ $result = \pspell_config_data_dir($config, $directory);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -134,15 +126,15 @@ function pspell_config_data_dir(int $conf, string $directory): void
* currently not documented; only its argument list is available.
*
*
- * @param int $conf
+ * @param int $config
* @param string $directory
* @throws PspellException
*
*/
-function pspell_config_dict_dir(int $conf, string $directory): void
+function pspell_config_dict_dir(int $config, string $directory): void
{
error_clear_last();
- $result = \pspell_config_dict_dir($conf, $directory);
+ $result = \pspell_config_dict_dir($config, $directory);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -152,15 +144,15 @@ function pspell_config_dict_dir(int $conf, string $directory): void
/**
*
*
- * @param int $dictionary_link
- * @param int $n Words less than n characters will be skipped.
+ * @param int $config An PSpell\Config instance.
+ * @param int $min_length Words less than min_length characters will be skipped.
* @throws PspellException
*
*/
-function pspell_config_ignore(int $dictionary_link, int $n): void
+function pspell_config_ignore(int $config, int $min_length): void
{
error_clear_last();
- $result = \pspell_config_ignore($dictionary_link, $n);
+ $result = \pspell_config_ignore($config, $min_length);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -170,7 +162,7 @@ function pspell_config_ignore(int $dictionary_link, int $n): void
/**
*
*
- * @param int $dictionary_link
+ * @param int $config An PSpell\Config instance.
* @param int $mode The mode parameter is the mode in which spellchecker will work.
* There are several modes available:
*
@@ -195,10 +187,10 @@ function pspell_config_ignore(int $dictionary_link, int $n): void
* @throws PspellException
*
*/
-function pspell_config_mode(int $dictionary_link, int $mode): void
+function pspell_config_mode(int $config, int $mode): void
{
error_clear_last();
- $result = \pspell_config_mode($dictionary_link, $mode);
+ $result = \pspell_config_mode($config, $mode);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -214,16 +206,16 @@ function pspell_config_mode(int $dictionary_link, int $mode): void
* pspell_config_personal should be used on a config
* before calling pspell_new_config.
*
- * @param int $dictionary_link
- * @param string $file The personal wordlist. If the file does not exist, it will be created.
+ * @param int $config An PSpell\Config instance.
+ * @param string $filename The personal wordlist. If the file does not exist, it will be created.
* The file should be writable by whoever PHP runs as (e.g. nobody).
* @throws PspellException
*
*/
-function pspell_config_personal(int $dictionary_link, string $file): void
+function pspell_config_personal(int $config, string $filename): void
{
error_clear_last();
- $result = \pspell_config_personal($dictionary_link, $file);
+ $result = \pspell_config_personal($config, $filename);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -242,15 +234,15 @@ function pspell_config_personal(int $dictionary_link, string $file): void
* pspell_config_repl should be used on a config
* before calling pspell_new_config.
*
- * @param int $dictionary_link
- * @param string $file The file should be writable by whoever PHP runs as (e.g. nobody).
+ * @param int $config An PSpell\Config instance.
+ * @param string $filename The file should be writable by whoever PHP runs as (e.g. nobody).
* @throws PspellException
*
*/
-function pspell_config_repl(int $dictionary_link, string $file): void
+function pspell_config_repl(int $config, string $filename): void
{
error_clear_last();
- $result = \pspell_config_repl($dictionary_link, $file);
+ $result = \pspell_config_repl($config, $filename);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -267,16 +259,16 @@ function pspell_config_repl(int $dictionary_link, string $file): void
* pspell_config_runtogether should be used on a config
* before calling pspell_new_config.
*
- * @param int $dictionary_link
- * @param bool $flag TRUE if run-together words should be treated as legal compounds,
+ * @param int $config An PSpell\Config instance.
+ * @param bool $allow TRUE if run-together words should be treated as legal compounds,
* FALSE otherwise.
* @throws PspellException
*
*/
-function pspell_config_runtogether(int $dictionary_link, bool $flag): void
+function pspell_config_runtogether(int $config, bool $allow): void
{
error_clear_last();
- $result = \pspell_config_runtogether($dictionary_link, $flag);
+ $result = \pspell_config_runtogether($config, $allow);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -295,15 +287,15 @@ function pspell_config_runtogether(int $dictionary_link, bool $flag): void
* pspell_config_save_repl should be used on a config
* before calling pspell_new_config.
*
- * @param int $dictionary_link
- * @param bool $flag TRUE if replacement pairs should be saved, FALSE otherwise.
+ * @param int $config An PSpell\Config instance.
+ * @param bool $save TRUE if replacement pairs should be saved, FALSE otherwise.
* @throws PspellException
*
*/
-function pspell_config_save_repl(int $dictionary_link, bool $flag): void
+function pspell_config_save_repl(int $config, bool $save): void
{
error_clear_last();
- $result = \pspell_config_save_repl($dictionary_link, $flag);
+ $result = \pspell_config_save_repl($config, $save);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -315,7 +307,7 @@ function pspell_config_save_repl(int $dictionary_link, bool $flag): void
*
* @param int $config The config parameter is the one returned by
* pspell_config_create when the config was created.
- * @return int Returns a dictionary link identifier on success.
+ * @return int Returns an PSpell\Dictionary instance on success
* @throws PspellException
*
*/
@@ -331,8 +323,78 @@ function pspell_new_config(int $config): int
/**
+ * For more information and examples, check out inline manual pspell
+ * website:http://aspell.net/.
+ *
+ * @param string $filename The file where words added to the personal list will be stored.
+ * It should be an absolute filename beginning with '/' because otherwise
+ * it will be relative to $HOME, which is "/root" for most systems, and
+ * is probably not what you want.
+ * @param string $language The language code which consists of the two letter ISO 639 language
+ * code and an optional two letter ISO 3166 country code after a dash
+ * or underscore.
+ * @param string $spelling The requested spelling for languages with more than one spelling such
+ * as English. Known values are 'american', 'british', and 'canadian'.
+ * @param string $jargon Extra information to distinguish two different words lists that have
+ * the same language and spelling parameters.
+ * @param string $encoding The encoding that words are expected to be in. Valid values are
+ * utf-8, iso8859-*,
+ * koi8-r, viscii,
+ * cp1252, machine unsigned 16,
+ * machine unsigned 32.
+ * @param int $mode The mode in which spellchecker will work. There are several modes available:
+ *
+ *
+ *
+ * PSPELL_FAST - Fast mode (least number of
+ * suggestions)
+ *
+ *
+ *
+ *
+ * PSPELL_NORMAL - Normal mode (more suggestions)
+ *
+ *
+ *
+ *
+ * PSPELL_BAD_SPELLERS - Slow mode (a lot of
+ * suggestions)
+ *
+ *
+ *
+ *
+ * PSPELL_RUN_TOGETHER - Consider run-together words
+ * as legal compounds. That is, "thecat" will be a legal compound,
+ * although there should be a space between the two words. Changing this
+ * setting only affects the results returned by
+ * pspell_check; pspell_suggest
+ * will still return suggestions.
+ *
+ *
+ *
+ * Mode is a bitmask constructed from different constants listed above.
+ * However, PSPELL_FAST,
+ * PSPELL_NORMAL and
+ * PSPELL_BAD_SPELLERS are mutually exclusive, so you
+ * should select only one of them.
+ * @return int Returns an PSpell\Dictionary instance on success.
+ * @throws PspellException
+ *
+ */
+function pspell_new_personal(string $filename, string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
+{
+ error_clear_last();
+ $result = \pspell_new_personal($filename, $language, $spelling, $jargon, $encoding, $mode);
+ if ($result === false) {
+ throw PspellException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* pspell_new opens up a new dictionary and
- * returns the dictionary link identifier for use in other pspell
+ * returns an PSpell\Dictionary instance for use in other pspell
* functions.
*
* For more information and examples, check out inline manual pspell
@@ -388,24 +450,14 @@ function pspell_new_config(int $config): int
* PSPELL_NORMAL and
* PSPELL_BAD_SPELLERS are mutually exclusive, so you
* should select only one of them.
- * @return int Returns the dictionary link identifier on success.
+ * @return int Returns an PSpell\Dictionary instance on success.
* @throws PspellException
*
*/
-function pspell_new(string $language, string $spelling = null, string $jargon = null, string $encoding = null, int $mode = 0): int
+function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int
{
error_clear_last();
- if ($mode !== 0) {
- $result = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
- } elseif ($encoding !== null) {
- $result = \pspell_new($language, $spelling, $jargon, $encoding);
- } elseif ($jargon !== null) {
- $result = \pspell_new($language, $spelling, $jargon);
- } elseif ($spelling !== null) {
- $result = \pspell_new($language, $spelling);
- } else {
- $result = \pspell_new($language);
- }
+ $result = \pspell_new($language, $spelling, $jargon, $encoding, $mode);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -416,15 +468,14 @@ function pspell_new(string $language, string $spelling = null, string $jargon =
/**
*
*
- * @param int $dictionary_link A dictionary link identifier opened with
- * pspell_new_personal.
+ * @param int $dictionary An PSpell\Dictionary instance.
* @throws PspellException
*
*/
-function pspell_save_wordlist(int $dictionary_link): void
+function pspell_save_wordlist(int $dictionary): void
{
error_clear_last();
- $result = \pspell_save_wordlist($dictionary_link);
+ $result = \pspell_save_wordlist($dictionary);
if ($result === false) {
throw PspellException::createFromPhpError();
}
@@ -434,17 +485,16 @@ function pspell_save_wordlist(int $dictionary_link): void
/**
*
*
- * @param int $dictionary_link A dictionary link identifier, opened with
- * pspell_new_personal
+ * @param int $dictionary An PSpell\Dictionary instance.
* @param string $misspelled The misspelled word.
* @param string $correct The fixed spelling for the misspelled word.
* @throws PspellException
*
*/
-function pspell_store_replacement(int $dictionary_link, string $misspelled, string $correct): void
+function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): void
{
error_clear_last();
- $result = \pspell_store_replacement($dictionary_link, $misspelled, $correct);
+ $result = \pspell_store_replacement($dictionary, $misspelled, $correct);
if ($result === false) {
throw PspellException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/readline.php b/vendor/thecodingmachine/safe/generated/readline.php
index a1c52c755..ddbf5a354 100644
--- a/vendor/thecodingmachine/safe/generated/readline.php
+++ b/vendor/thecodingmachine/safe/generated/readline.php
@@ -7,14 +7,14 @@ use Safe\Exceptions\ReadlineException;
/**
* This function adds a line to the command line history.
*
- * @param string $line The line to be added in the history.
+ * @param string $prompt The line to be added in the history.
* @throws ReadlineException
*
*/
-function readline_add_history(string $line): void
+function readline_add_history(string $prompt): void
{
error_clear_last();
- $result = \readline_add_history($line);
+ $result = \readline_add_history($prompt);
if ($result === false) {
throw ReadlineException::createFromPhpError();
}
@@ -32,38 +32,6 @@ function readline_add_history(string $line): void
* stream_select as it allows interleaving of IO and
* user input, unlike readline.
*
- *
- * Readline Callback Interface Example
- *
- * 10) {
- * $prompting = false;
- * readline_callback_handler_remove();
- * } else {
- * readline_callback_handler_install("[$c] Enter something: ", 'rl_callback');
- * }
- * }
- *
- * $c = 1;
- * $prompting = true;
- *
- * readline_callback_handler_install("[$c] Enter something: ", 'rl_callback');
- *
- * while ($prompting) {
- * $w = NULL;
- * $e = NULL;
- * $n = stream_select($r = array(STDIN), $w, $e, null);
- * if ($n && in_array(STDIN, $r)) {
- * // read a character, will call the callback when a newline is entered
- * readline_callback_read_char();
- * }
- * }
- *
- * echo "Prompting disabled. All done.\n";
- * ?>
- * ]]>
- *
- *
- *
* @param string $prompt The prompt message.
* @param callable $callback The callback function takes one parameter; the
* user input returned.
@@ -100,15 +68,15 @@ function readline_clear_history(): void
* This function registers a completion function. This is the same kind of
* functionality you'd get if you hit your tab key while using Bash.
*
- * @param callable $function You must supply the name of an existing function which accepts a
+ * @param callable $callback You must supply the name of an existing function which accepts a
* partial command line and returns an array of possible matches.
* @throws ReadlineException
*
*/
-function readline_completion_function(callable $function): void
+function readline_completion_function(callable $callback): void
{
error_clear_last();
- $result = \readline_completion_function($function);
+ $result = \readline_completion_function($callback);
if ($result === false) {
throw ReadlineException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/rrd.php b/vendor/thecodingmachine/safe/generated/rrd.php
index 9bb3b5c52..2da227d0e 100644
--- a/vendor/thecodingmachine/safe/generated/rrd.php
+++ b/vendor/thecodingmachine/safe/generated/rrd.php
@@ -21,3 +21,170 @@ function rrd_create(string $filename, array $options): void
throw RrdException::createFromPhpError();
}
}
+
+
+/**
+ * Returns the first data sample from the specified RRA of the RRD file.
+ *
+ * @param string $file RRD database file name.
+ * @param int $raaindex The index number of the RRA that is to be examined. Default value is 0.
+ * @return int Integer number of unix timestamp.
+ * @throws RrdException
+ *
+ */
+function rrd_first(string $file, int $raaindex = 0): int
+{
+ error_clear_last();
+ $result = \rrd_first($file, $raaindex);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Creates image for a particular data from RRD file.
+ *
+ * @param string $filename The filename to output the graph to. This will generally end in either
+ * .png, .svg or
+ * .eps, depending on the format you want to output.
+ * @param array $options Options for generating image. See man page of rrd graph for all
+ * possible options. All options (data definitions, variable definitions, etc.)
+ * are allowed.
+ * @return array Array with information about generated image is returned.
+ * @throws RrdException
+ *
+ */
+function rrd_graph(string $filename, array $options): array
+{
+ error_clear_last();
+ $result = \rrd_graph($filename, $options);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns information about particular RRD database file.
+ *
+ * @param string $filename RRD database file name.
+ * @return array Array with information about requested RRD file.
+ * @throws RrdException
+ *
+ */
+function rrd_info(string $filename): array
+{
+ error_clear_last();
+ $result = \rrd_info($filename);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets array of the UNIX timestamp and the values stored for each date in the
+ * most recent update of the RRD database file.
+ *
+ * @param string $filename RRD database file name.
+ * @return array Array of information about last update.
+ * @throws RrdException
+ *
+ */
+function rrd_lastupdate(string $filename): array
+{
+ error_clear_last();
+ $result = \rrd_lastupdate($filename);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Restores the RRD file from the XML dump.
+ *
+ * @param string $xml_file XML filename with the dump of the original RRD database file.
+ * @param string $rrd_file Restored RRD database file name.
+ * @param array $options Array of options for restoring. See man page for rrd restore.
+ * @throws RrdException
+ *
+ */
+function rrd_restore(string $xml_file, string $rrd_file, array $options = null): void
+{
+ error_clear_last();
+ if ($options !== null) {
+ $result = \rrd_restore($xml_file, $rrd_file, $options);
+ } else {
+ $result = \rrd_restore($xml_file, $rrd_file);
+ }
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Change some options in the RRD dabase header file. E.g. renames the source for
+ * the data etc.
+ *
+ * @param string $filename RRD database file name.
+ * @param array $options Options with RRD database file properties which will be changed. See
+ * rrd tune man page for details.
+ * @throws RrdException
+ *
+ */
+function rrd_tune(string $filename, array $options): void
+{
+ error_clear_last();
+ $result = \rrd_tune($filename, $options);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Updates the RRD database file. The input data is time interpolated according to the
+ * properties of the RRD database file.
+ *
+ * @param string $filename RRD database file name. This database will be updated.
+ * @param array $options Options for updating the RRD database. This is list of strings. See man page of rrd update
+ * for whole list of options.
+ * @throws RrdException
+ *
+ */
+function rrd_update(string $filename, array $options): void
+{
+ error_clear_last();
+ $result = \rrd_update($filename, $options);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Exports the information about RRD database file. This data can be converted
+ * to XML file via user space PHP script and then restored back as RRD database
+ * file.
+ *
+ * @param array $options Array of options for the export, see rrd xport man page.
+ * @return array Array with information about RRD database file.
+ * @throws RrdException
+ *
+ */
+function rrd_xport(array $options): array
+{
+ error_clear_last();
+ $result = \rrd_xport($options);
+ if ($result === false) {
+ throw RrdException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/generated/sem.php b/vendor/thecodingmachine/safe/generated/sem.php
index 739e8b389..020212151 100644
--- a/vendor/thecodingmachine/safe/generated/sem.php
+++ b/vendor/thecodingmachine/safe/generated/sem.php
@@ -5,6 +5,34 @@ namespace Safe;
use Safe\Exceptions\SemException;
/**
+ * msg_get_queue returns an id that can be used to
+ * access the System V message queue with the given
+ * key. The first call creates the message queue with
+ * the optional permissions.
+ * A second call to msg_get_queue for the same
+ * key will return a different message queue
+ * identifier, but both identifiers access the same underlying message
+ * queue.
+ *
+ * @param int $key Message queue numeric ID
+ * @param int $permissions Queue permissions. Default to 0666. If the message queue already
+ * exists, the permissions will be ignored.
+ * @return resource Returns SysvMessageQueue instance that can be used to access the System V message queue.
+ * @throws SemException
+ *
+ */
+function msg_get_queue(int $key, int $permissions = 0666)
+{
+ error_clear_last();
+ $result = \msg_get_queue($key, $permissions);
+ if ($result === false) {
+ throw SemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Checks whether the message queue key exists.
*
* @param int $key Queue key.
@@ -24,23 +52,23 @@ function msg_queue_exists(int $key): void
/**
* msg_receive will receive the first message from the
* specified queue of the type specified by
- * desiredmsgtype.
+ * desired_message_type.
*
- * @param resource $queue Message queue resource handle
- * @param int $desiredmsgtype If desiredmsgtype is 0, the message from the front
- * of the queue is returned. If desiredmsgtype is
+ * @param resource $queue The message queue.
+ * @param int $desired_message_type If desired_message_type is 0, the message from the front
+ * of the queue is returned. If desired_message_type is
* greater than 0, then the first message of that type is returned.
- * If desiredmsgtype is less than 0, the first
+ * If desired_message_type is less than 0, the first
* message on the queue with a type less than or equal to the
- * absolute value of desiredmsgtype will be read.
+ * absolute value of desired_message_type will be read.
* If no messages match the criteria, your script will wait until a suitable
* message arrives on the queue. You can prevent the script from blocking
* by specifying MSG_IPC_NOWAIT in the
* flags parameter.
- * @param int|null $msgtype The type of the message that was received will be stored in this
+ * @param int|null $received_message_type The type of the message that was received will be stored in this
* parameter.
- * @param int $maxsize The maximum size of message to be accepted is specified by the
- * maxsize; if the message in the queue is larger
+ * @param int $max_message_size The maximum size of message to be accepted is specified by the
+ * max_message_size; if the message in the queue is larger
* than this size the function will fail (unless you set
* flags as described below).
* @param mixed $message The received message will be stored in message,
@@ -64,7 +92,7 @@ function msg_queue_exists(int $key): void
*
* MSG_IPC_NOWAIT
* If there are no messages of the
- * desiredmsgtype, return immediately and do not
+ * desired_message_type, return immediately and do not
* wait. The function will fail and return an integer value
* corresponding to MSG_ENOMSG.
*
@@ -72,30 +100,30 @@ function msg_queue_exists(int $key): void
*
* MSG_EXCEPT
* Using this flag in combination with a
- * desiredmsgtype greater than 0 will cause the
+ * desired_message_type greater than 0 will cause the
* function to receive the first message that is not equal to
- * desiredmsgtype.
+ * desired_message_type.
*
*
* MSG_NOERROR
*
- * If the message is longer than maxsize,
+ * If the message is longer than max_message_size,
* setting this flag will truncate the message to
- * maxsize and will not signal an error.
+ * max_message_size and will not signal an error.
*
*
*
*
*
- * @param int|null $errorcode If the function fails, the optional errorcode
+ * @param int|null $error_code If the function fails, the optional error_code
* will be set to the value of the system errno variable.
* @throws SemException
*
*/
-function msg_receive($queue, int $desiredmsgtype, ?int &$msgtype, int $maxsize, &$message, bool $unserialize = true, int $flags = 0, ?int &$errorcode = null): void
+function msg_receive($queue, int $desired_message_type, ?int &$received_message_type, int $max_message_size, &$message, bool $unserialize = true, int $flags = 0, ?int &$error_code = null): void
{
error_clear_last();
- $result = \msg_receive($queue, $desiredmsgtype, $msgtype, $maxsize, $message, $unserialize, $flags, $errorcode);
+ $result = \msg_receive($queue, $desired_message_type, $received_message_type, $max_message_size, $message, $unserialize, $flags, $error_code);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -108,7 +136,7 @@ function msg_receive($queue, int $desiredmsgtype, ?int &$msgtype, int $maxsize,
* processes have finished working with the message queue and you need to
* release the system resources held by it.
*
- * @param resource $queue Message queue resource handle
+ * @param resource $queue The message queue.
* @throws SemException
*
*/
@@ -124,15 +152,15 @@ function msg_remove_queue($queue): void
/**
* msg_send sends a message of type
- * msgtype (which MUST be greater than 0) to
+ * message_type (which MUST be greater than 0) to
* the message queue specified by queue.
*
- * @param resource $queue Message queue resource handle
- * @param int $msgtype The type of the message (MUST be greater than 0)
+ * @param resource $queue The message queue.
+ * @param int $message_type The type of the message (MUST be greater than 0)
* @param mixed $message The body of the message.
*
* If serialize set to FALSE is supplied,
- * MUST be of type: string, integer, float
+ * MUST be of type: string, int, float
* or bool. In other case a warning will be issued.
* @param bool $serialize The optional serialize controls how the
* message is sent. serialize
@@ -148,17 +176,17 @@ function msg_remove_queue($queue): void
* optional blocking parameter to FALSE, in which
* case msg_send will immediately return FALSE if the
* message is too big for the queue, and set the optional
- * errorcode to MSG_EAGAIN,
+ * error_code to MSG_EAGAIN,
* indicating that you should try to send your message again a little
* later on.
- * @param int|null $errorcode If the function fails, the optional errorcode will be set to the value of the system errno variable.
+ * @param int|null $error_code If the function fails, the optional errorcode will be set to the value of the system errno variable.
* @throws SemException
*
*/
-function msg_send($queue, int $msgtype, $message, bool $serialize = true, bool $blocking = true, ?int &$errorcode = null): void
+function msg_send($queue, int $message_type, $message, bool $serialize = true, bool $blocking = true, ?int &$error_code = null): void
{
error_clear_last();
- $result = \msg_send($queue, $msgtype, $message, $serialize, $blocking, $errorcode);
+ $result = \msg_send($queue, $message_type, $message, $serialize, $blocking, $error_code);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -176,7 +204,7 @@ function msg_send($queue, int $msgtype, $message, bool $serialize = true, bool $
* root privileges are required to raise the msg_qbytes values above the
* system defined limit.
*
- * @param resource $queue Message queue resource handle
+ * @param resource $queue The message queue.
* @param array $data You specify the values you require by setting the value of the keys
* that you require in the data array.
* @throws SemException
@@ -193,6 +221,100 @@ function msg_set_queue($queue, array $data): void
/**
+ * msg_stat_queue returns the message queue meta data
+ * for the message queue specified by the queue.
+ * This is useful, for example, to determine which process sent the message
+ * that was just received.
+ *
+ * @param resource $queue The message queue.
+ * @return array On success, the return value is an array whose keys and values have the following
+ * meanings:
+ *
+ * Array structure for msg_stat_queue
+ *
+ *
+ *
+ * msg_perm.uid
+ *
+ * The uid of the owner of the queue.
+ *
+ *
+ *
+ * msg_perm.gid
+ *
+ * The gid of the owner of the queue.
+ *
+ *
+ *
+ * msg_perm.mode
+ *
+ * The file access mode of the queue.
+ *
+ *
+ *
+ * msg_stime
+ *
+ * The time that the last message was sent to the queue.
+ *
+ *
+ *
+ * msg_rtime
+ *
+ * The time that the last message was received from the queue.
+ *
+ *
+ *
+ * msg_ctime
+ *
+ * The time that the queue was last changed.
+ *
+ *
+ *
+ * msg_qnum
+ *
+ * The number of messages waiting to be read from the queue.
+ *
+ *
+ *
+ * msg_qbytes
+ *
+ * The maximum number of bytes allowed in one message queue. On
+ * Linux, this value may be read and modified via
+ * /proc/sys/kernel/msgmnb.
+ *
+ *
+ *
+ * msg_lspid
+ *
+ * The pid of the process that sent the last message to the queue.
+ *
+ *
+ *
+ * msg_lrpid
+ *
+ * The pid of the process that received the last message from the queue.
+ *
+ *
+ *
+ *
+ *
+ *
+ * Returns FALSE on failure.
+ * @throws SemException
+ *
+ */
+function msg_stat_queue($queue): array
+{
+ error_clear_last();
+ $result = \msg_stat_queue($queue);
+ if ($result === false) {
+ throw SemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* sem_acquire by default blocks (if necessary) until the
* semaphore can be acquired. A process attempting to acquire a semaphore which
* it has already acquired will block forever if acquiring the semaphore would
@@ -202,19 +324,19 @@ function msg_set_queue($queue, array $data): void
* explicitly released will be released automatically and a warning will be
* generated.
*
- * @param resource $sem_identifier sem_identifier is a semaphore resource,
+ * @param resource $semaphore semaphore is a semaphore
* obtained from sem_get.
- * @param bool $nowait Specifies if the process shouldn't wait for the semaphore to be acquired.
+ * @param bool $non_blocking Specifies if the process shouldn't wait for the semaphore to be acquired.
* If set to true, the call will return
* false immediately if a semaphore cannot be immediately
* acquired.
* @throws SemException
*
*/
-function sem_acquire($sem_identifier, bool $nowait = false): void
+function sem_acquire($semaphore, bool $non_blocking = false): void
{
error_clear_last();
- $result = \sem_acquire($sem_identifier, $nowait);
+ $result = \sem_acquire($semaphore, $non_blocking);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -235,19 +357,19 @@ function sem_acquire($sem_identifier, bool $nowait = false): void
* @param int $key
* @param int $max_acquire The number of processes that can acquire the semaphore simultaneously
* is set to max_acquire.
- * @param int $perm The semaphore permissions. Actually this value is
+ * @param int $permissions The semaphore permissions. Actually this value is
* set only if the process finds it is the only process currently
* attached to the semaphore.
- * @param int $auto_release Specifies if the semaphore should be automatically released on request
+ * @param bool $auto_release Specifies if the semaphore should be automatically released on request
* shutdown.
* @return resource Returns a positive semaphore identifier on success.
* @throws SemException
*
*/
-function sem_get(int $key, int $max_acquire = 1, int $perm = 0666, int $auto_release = 1)
+function sem_get(int $key, int $max_acquire = 1, int $permissions = 0666, bool $auto_release = true)
{
error_clear_last();
- $result = \sem_get($key, $max_acquire, $perm, $auto_release);
+ $result = \sem_get($key, $max_acquire, $permissions, $auto_release);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -263,15 +385,15 @@ function sem_get(int $key, int $max_acquire = 1, int $perm = 0666, int $auto_rel
* After releasing the semaphore, sem_acquire
* may be called to re-acquire it.
*
- * @param resource $sem_identifier A Semaphore resource handle as returned by
+ * @param resource $semaphore A Semaphore as returned by
* sem_get.
* @throws SemException
*
*/
-function sem_release($sem_identifier): void
+function sem_release($semaphore): void
{
error_clear_last();
- $result = \sem_release($sem_identifier);
+ $result = \sem_release($semaphore);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -283,15 +405,74 @@ function sem_release($sem_identifier): void
*
* After removing the semaphore, it is no longer accessible.
*
- * @param resource $sem_identifier A semaphore resource identifier as returned
+ * @param resource $semaphore A semaphore as returned
* by sem_get.
* @throws SemException
*
*/
-function sem_remove($sem_identifier): void
+function sem_remove($semaphore): void
+{
+ error_clear_last();
+ $result = \sem_remove($semaphore);
+ if ($result === false) {
+ throw SemException::createFromPhpError();
+ }
+}
+
+
+/**
+ * shm_attach returns an id that can be used to access
+ * the System V shared memory with the given key, the
+ * first call creates the shared memory segment with
+ * size and the optional perm-bits
+ * permissions.
+ *
+ * A second call to shm_attach for the same
+ * key will return a different SysvSharedMemory
+ * instance, but both instances access the same underlying
+ * shared memory. size and
+ * permissions will be ignored.
+ *
+ * @param int $key A numeric shared memory segment ID
+ * @param int $size The memory size. If not provided, default to the
+ * sysvshm.init_mem in the php.ini, otherwise 10000
+ * bytes.
+ * @param int $permissions The optional permission bits. Default to 0666.
+ * @return resource Returns a SysvSharedMemory instance on success.
+ * @throws SemException
+ *
+ */
+function shm_attach(int $key, int $size = null, int $permissions = 0666)
+{
+ error_clear_last();
+ if ($permissions !== 0666) {
+ $result = \shm_attach($key, $size, $permissions);
+ } elseif ($size !== null) {
+ $result = \shm_attach($key, $size);
+ } else {
+ $result = \shm_attach($key);
+ }
+ if ($result === false) {
+ throw SemException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * shm_detach disconnects from the shared memory given
+ * by the shm created by
+ * shm_attach. Remember, that shared memory still exist
+ * in the Unix system and the data is still present.
+ *
+ * @param resource $shm A shared memory segment obtained from shm_attach.
+ * @throws SemException
+ *
+ */
+function shm_detach($shm): void
{
error_clear_last();
- $result = \sem_remove($sem_identifier);
+ $result = \shm_detach($shm);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -300,28 +481,27 @@ function sem_remove($sem_identifier): void
/**
* shm_put_var inserts or updates the
- * variable with the given
- * variable_key.
+ * value with the given
+ * key.
*
* Warnings (E_WARNING level) will be issued if
- * shm_identifier is not a valid SysV shared memory
+ * shm is not a valid SysV shared memory
* index or if there was not enough shared memory remaining to complete your
* request.
*
- * @param resource $shm_identifier A shared memory resource handle as returned by
- * shm_attach
- * @param int $variable_key The variable key.
- * @param mixed $variable The variable. All variable types
+ * @param resource $shm A shared memory segment obtained from shm_attach.
+ * @param int $key The variable key.
+ * @param mixed $value The variable. All variable types
* that serialize supports may be used: generally
* this means all types except for resources and some internal objects
* that cannot be serialized.
* @throws SemException
*
*/
-function shm_put_var($shm_identifier, int $variable_key, $variable): void
+function shm_put_var($shm, int $key, $value): void
{
error_clear_last();
- $result = \shm_put_var($shm_identifier, $variable_key, $variable);
+ $result = \shm_put_var($shm, $key, $value);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -329,19 +509,18 @@ function shm_put_var($shm_identifier, int $variable_key, $variable): void
/**
- * Removes a variable with a given variable_key
+ * Removes a variable with a given key
* and frees the occupied memory.
*
- * @param resource $shm_identifier The shared memory identifier as returned by
- * shm_attach
- * @param int $variable_key The variable key.
+ * @param resource $shm A shared memory segment obtained from shm_attach.
+ * @param int $key The variable key.
* @throws SemException
*
*/
-function shm_remove_var($shm_identifier, int $variable_key): void
+function shm_remove_var($shm, int $key): void
{
error_clear_last();
- $result = \shm_remove_var($shm_identifier, $variable_key);
+ $result = \shm_remove_var($shm, $key);
if ($result === false) {
throw SemException::createFromPhpError();
}
@@ -350,17 +529,16 @@ function shm_remove_var($shm_identifier, int $variable_key): void
/**
* shm_remove removes the shared memory
- * shm_identifier. All data will be destroyed.
+ * shm. All data will be destroyed.
*
- * @param resource $shm_identifier The shared memory identifier as returned by
- * shm_attach
+ * @param resource $shm A shared memory segment obtained from shm_attach.
* @throws SemException
*
*/
-function shm_remove($shm_identifier): void
+function shm_remove($shm): void
{
error_clear_last();
- $result = \shm_remove($shm_identifier);
+ $result = \shm_remove($shm);
if ($result === false) {
throw SemException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/session.php b/vendor/thecodingmachine/safe/generated/session.php
index 7b8c9478d..212cf850e 100644
--- a/vendor/thecodingmachine/safe/generated/session.php
+++ b/vendor/thecodingmachine/safe/generated/session.php
@@ -22,6 +22,42 @@ function session_abort(): void
/**
+ * session_create_id is used to create new
+ * session id for the current session. It returns collision free
+ * session id.
+ *
+ * If session is not active, collision check is omitted.
+ *
+ * Session ID is created according to php.ini settings.
+ *
+ * It is important to use the same user ID of your web server for GC
+ * task script. Otherwise, you may have permission problems especially
+ * with files save handler.
+ *
+ * @param string $prefix If prefix is specified, new session id
+ * is prefixed by prefix. Not all
+ * characters are allowed within the session id. Characters in
+ * the range a-z A-Z 0-9 , (comma) and -
+ * (minus) are allowed.
+ * @return string session_create_id returns new collision free
+ * session id for the current session. If it is used without active
+ * session, it omits collision check.
+ * On failure, FALSE is returned.
+ * @throws SessionException
+ *
+ */
+function session_create_id(string $prefix = ""): string
+{
+ error_clear_last();
+ $result = \session_create_id($prefix);
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* session_decode decodes the serialized session data provided in
* $data, and populates the $_SESSION superglobal
* with the result.
@@ -70,6 +106,151 @@ function session_destroy(): void
/**
+ * session_encode returns a serialized string of the
+ * contents of the current session data stored in the $_SESSION superglobal.
+ *
+ * By default, the serialization method used is internal to PHP, and is not the same as serialize.
+ * The serialization method can be set using session.serialize_handler.
+ *
+ * @return string Returns the contents of the current session encoded.
+ * @throws SessionException
+ *
+ */
+function session_encode(): string
+{
+ error_clear_last();
+ $result = \session_encode();
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * session_id is used to get or set the session id for
+ * the current session.
+ *
+ * The constant SID can also be used to
+ * retrieve the current name and session id as a string suitable for
+ * adding to URLs. See also Session
+ * handling.
+ *
+ * @param string $id If id is specified and not NULL, it will replace the current
+ * session id. session_id needs to be called before
+ * session_start for that purpose. Depending on the
+ * session handler, not all characters are allowed within the session id.
+ * For example, the file session handler only allows characters in the
+ * range a-z A-Z 0-9 , (comma) and - (minus)!
+ * @return string session_id returns the session id for the current
+ * session or the empty string ("") if there is no current
+ * session (no current session id exists).
+ * On failure, FALSE is returned.
+ * @throws SessionException
+ *
+ */
+function session_id(string $id = null): string
+{
+ error_clear_last();
+ if ($id !== null) {
+ $result = \session_id($id);
+ } else {
+ $result = \session_id();
+ }
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * session_module_name gets the name of the current
+ * session module, which is also known as
+ * session.save_handler.
+ *
+ * @param string $module If module is specified and not NULL, that module will be
+ * used instead.
+ * Passing "user" to this parameter is forbidden. Instead
+ * session_set_save_handler has to be called to set a user
+ * defined session handler.
+ * @return string Returns the name of the current session module.
+ * @throws SessionException
+ *
+ */
+function session_module_name(string $module = null): string
+{
+ error_clear_last();
+ if ($module !== null) {
+ $result = \session_module_name($module);
+ } else {
+ $result = \session_module_name();
+ }
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * session_name returns the name of the current
+ * session. If name is given,
+ * session_name will update the session name and return
+ * the old session name.
+ *
+ * If a new session name is
+ * supplied, session_name modifies the HTTP cookie
+ * (and output content when session.transid is
+ * enabled). Once the HTTP cookie is
+ * sent, session_name raises error.
+ * session_name must be called
+ * before session_start for the session to work
+ * properly.
+ *
+ * The session name is reset to the default value stored in
+ * session.name at request startup time. Thus, you need to
+ * call session_name for every request (and before
+ * session_start is called).
+ *
+ * @param string $name The session name references the name of the session, which is
+ * used in cookies and URLs (e.g. PHPSESSID). It
+ * should contain only alphanumeric characters; it should be short and
+ * descriptive (i.e. for users with enabled cookie warnings).
+ * If name is specified and not NULL, the name of the current
+ * session is changed to its value.
+ *
+ *
+ *
+ * The session name can't consist of digits only, at least one letter
+ * must be present. Otherwise a new session id is generated every time.
+ *
+ *
+ *
+ * The session name can't consist of digits only, at least one letter
+ * must be present. Otherwise a new session id is generated every time.
+ * @return string Returns the name of the current session. If name is given
+ * and function updates the session name, name of the old session
+ * is returned.
+ * @throws SessionException
+ *
+ */
+function session_name(string $name = null): string
+{
+ error_clear_last();
+ if ($name !== null) {
+ $result = \session_name($name);
+ } else {
+ $result = \session_name();
+ }
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* session_regenerate_id will replace the current
* session id with a new one, and keep the current session information.
*
@@ -113,6 +294,44 @@ function session_reset(): void
/**
+ * session_save_path returns the path of the current
+ * directory used to save session data.
+ *
+ * @param string $path Session data path. If specified and not NULL, the path to which data is saved will
+ * be changed. session_save_path needs to be called
+ * before session_start for that purpose.
+ *
+ *
+ *
+ * On some operating systems, you may want to specify a path on a
+ * filesystem that handles lots of small files efficiently. For example,
+ * on Linux, reiserfs may provide better performance than ext2fs.
+ *
+ *
+ *
+ * On some operating systems, you may want to specify a path on a
+ * filesystem that handles lots of small files efficiently. For example,
+ * on Linux, reiserfs may provide better performance than ext2fs.
+ * @return string Returns the path of the current directory used for data storage.
+ * @throws SessionException
+ *
+ */
+function session_save_path(string $path = null): string
+{
+ error_clear_last();
+ if ($path !== null) {
+ $result = \session_save_path($path);
+ } else {
+ $result = \session_save_path();
+ }
+ if ($result === false) {
+ throw SessionException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* The session_unset function frees all session variables
* currently registered.
*
diff --git a/vendor/thecodingmachine/safe/generated/shmop.php b/vendor/thecodingmachine/safe/generated/shmop.php
index 04ba57cb5..aa5d8f49c 100644
--- a/vendor/thecodingmachine/safe/generated/shmop.php
+++ b/vendor/thecodingmachine/safe/generated/shmop.php
@@ -7,15 +7,15 @@ use Safe\Exceptions\ShmopException;
/**
* shmop_delete is used to delete a shared memory block.
*
- * @param resource $shmid The shared memory block resource created by
+ * @param resource $shmop The shared memory block resource created by
* shmop_open
* @throws ShmopException
*
*/
-function shmop_delete($shmid): void
+function shmop_delete($shmop): void
{
error_clear_last();
- $result = \shmop_delete($shmid);
+ $result = \shmop_delete($shmop);
if ($result === false) {
throw ShmopException::createFromPhpError();
}
@@ -25,42 +25,19 @@ function shmop_delete($shmid): void
/**
* shmop_read will read a string from shared memory block.
*
- * @param resource $shmid The shared memory block identifier created by
+ * @param resource $shmop The shared memory block identifier created by
* shmop_open
- * @param int $start Offset from which to start reading
- * @param int $count The number of bytes to read.
+ * @param int $offset Offset from which to start reading
+ * @param int $size The number of bytes to read.
* 0 reads shmop_size($shmid) - $start bytes.
* @return string Returns the data.
* @throws ShmopException
*
*/
-function shmop_read($shmid, int $start, int $count): string
+function shmop_read($shmop, int $offset, int $size): string
{
error_clear_last();
- $result = \shmop_read($shmid, $start, $count);
- if ($result === false) {
- throw ShmopException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * shmop_write will write a string into shared memory block.
- *
- * @param resource $shmid The shared memory block identifier created by
- * shmop_open
- * @param string $data A string to write into shared memory block
- * @param int $offset Specifies where to start writing data inside the shared memory
- * segment.
- * @return int The size of the written data.
- * @throws ShmopException
- *
- */
-function shmop_write($shmid, string $data, int $offset): int
-{
- error_clear_last();
- $result = \shmop_write($shmid, $data, $offset);
+ $result = \shmop_read($shmop, $offset, $size);
if ($result === false) {
throw ShmopException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/simplexml.php b/vendor/thecodingmachine/safe/generated/simplexml.php
deleted file mode 100644
index 118de4432..000000000
--- a/vendor/thecodingmachine/safe/generated/simplexml.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-
-namespace Safe;
-
-use Safe\Exceptions\SimplexmlException;
-
-/**
- * This function takes a node of a DOM
- * document and makes it into a SimpleXML node. This new object can
- * then be used as a native SimpleXML element.
- *
- * @param \DOMNode $node A DOM Element node
- * @param string $class_name You may use this optional parameter so that
- * simplexml_import_dom will return an object of
- * the specified class. That class should extend the
- * SimpleXMLElement class.
- * @return \SimpleXMLElement Returns a SimpleXMLElement.
- * @throws SimplexmlException
- *
- */
-function simplexml_import_dom(\DOMNode $node, string $class_name = "SimpleXMLElement"): \SimpleXMLElement
-{
- error_clear_last();
- $result = \simplexml_import_dom($node, $class_name);
- if ($result === false) {
- throw SimplexmlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Convert the well-formed XML document in the given file to an object.
- *
- * @param string $filename Path to the XML file
- *
- * Libxml 2 unescapes the URI, so if you want to pass e.g.
- * b&amp;c as the URI parameter a,
- * you have to call
- * simplexml_load_file(rawurlencode('http://example.com/?a=' .
- * urlencode('b&amp;c'))). Since PHP 5.1.0 you don't need to do
- * this because PHP will do it for you.
- * @param string $class_name You may use this optional parameter so that
- * simplexml_load_file will return an object of
- * the specified class. That class should extend the
- * SimpleXMLElement class.
- * @param int $options Since PHP 5.1.0 and Libxml 2.6.0, you may also use the
- * options parameter to specify additional Libxml parameters.
- * @param string $ns Namespace prefix or URI.
- * @param bool $is_prefix TRUE if ns is a prefix, FALSE if it's a URI;
- * defaults to FALSE.
- * @return \SimpleXMLElement Returns an object of class SimpleXMLElement with
- * properties containing the data held within the XML document.
- * @throws SimplexmlException
- *
- */
-function simplexml_load_file(string $filename, string $class_name = "SimpleXMLElement", int $options = 0, string $ns = "", bool $is_prefix = false): \SimpleXMLElement
-{
- error_clear_last();
- $result = \simplexml_load_file($filename, $class_name, $options, $ns, $is_prefix);
- if ($result === false) {
- throw SimplexmlException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Takes a well-formed XML string and returns it as an object.
- *
- * @param string $data A well-formed XML string
- * @param string $class_name You may use this optional parameter so that
- * simplexml_load_string will return an object of
- * the specified class. That class should extend the
- * SimpleXMLElement class.
- * @param int $options Since PHP 5.1.0 and Libxml 2.6.0, you may also use the
- * options parameter to specify additional Libxml parameters.
- * @param string $ns Namespace prefix or URI.
- * @param bool $is_prefix TRUE if ns is a prefix, FALSE if it's a URI;
- * defaults to FALSE.
- * @return \SimpleXMLElement Returns an object of class SimpleXMLElement with
- * properties containing the data held within the xml document.
- * @throws SimplexmlException
- *
- */
-function simplexml_load_string(string $data, string $class_name = "SimpleXMLElement", int $options = 0, string $ns = "", bool $is_prefix = false): \SimpleXMLElement
-{
- error_clear_last();
- $result = \simplexml_load_string($data, $class_name, $options, $ns, $is_prefix);
- if ($result === false) {
- throw SimplexmlException::createFromPhpError();
- }
- return $result;
-}
diff --git a/vendor/thecodingmachine/safe/generated/sockets.php b/vendor/thecodingmachine/safe/generated/sockets.php
index d6cc892b4..bfcd9bac4 100644
--- a/vendor/thecodingmachine/safe/generated/sockets.php
+++ b/vendor/thecodingmachine/safe/generated/sockets.php
@@ -10,23 +10,23 @@ use Safe\Exceptions\SocketsException;
* socket_bind, and told to listen for connections
* with socket_listen, this function will accept
* incoming connections on that socket. Once a successful connection
- * is made, a new socket resource is returned, which may be used
- * for communication. If there are multiple connections queued on
- * the socket, the first will be used. If there are no pending
+ * is made, a new Socket instance is returned,
+ * which may be used for communication. If there are multiple connections
+ * queued on the socket, the first will be used. If there are no pending
* connections, socket_accept will block until
* a connection becomes present. If socket
* has been made non-blocking using
* socket_set_blocking or
* socket_set_nonblock, FALSE will be returned.
*
- * The socket resource returned by
+ * The Socket instance returned by
* socket_accept may not be used to accept new
* connections. The original listening socket
* socket, however, remains open and may be
* reused.
*
- * @param resource $socket A valid socket resource created with socket_create.
- * @return resource Returns a new socket resource on success. The actual
+ * @param resource $socket A Socket instance created with socket_create.
+ * @return resource Returns a new Socket instance on success. The actual
* error code can be retrieved by calling
* socket_last_error. This error code may be passed to
* socket_strerror to get a textual explanation of the
@@ -46,19 +46,19 @@ function socket_accept($socket)
/**
- * Create a Socket resource, and bind it to the provided AddrInfo resource. The return
+ * Create a Socket instance, and bind it to the provided AddressInfo. The return
* value of this function may be used with socket_listen.
*
- * @param resource $addr Resource created from socket_addrinfo_lookup.
- * @return resource Returns a Socket resource on success.
+ * @param resource $address AddressInfo instance created from socket_addrinfo_lookup.
+ * @return resource|null Returns a Socket instance on success.
* @throws SocketsException
*
*/
-function socket_addrinfo_bind($addr)
+function socket_addrinfo_bind($address)
{
error_clear_last();
- $result = \socket_addrinfo_bind($addr);
- if ($result === null) {
+ $result = \socket_addrinfo_bind($address);
+ if ($result === false) {
throw SocketsException::createFromPhpError();
}
return $result;
@@ -66,19 +66,50 @@ function socket_addrinfo_bind($addr)
/**
- * Create a Socket resource, and connect it to the provided AddrInfo resource. The return
+ * Create a Socket instance, and connect it to the provided AddressInfo instance. The return
* value of this function may be used with the rest of the socket functions.
*
- * @param resource $addr Resource created from socket_addrinfo_lookup
- * @return resource Returns a Socket resource on success.
+ * @param resource $address AddressInfo instance created from socket_addrinfo_lookup
+ * @return resource|null Returns a Socket instance on success.
+ * @throws SocketsException
+ *
+ */
+function socket_addrinfo_connect($address)
+{
+ error_clear_last();
+ $result = \socket_addrinfo_connect($address);
+ if ($result === false) {
+ throw SocketsException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Lookup different ways we can connect to host. The returned array contains
+ * a set of AddressInfo instances that we can bind to using socket_addrinfo_bind.
+ *
+ * @param string $host Hostname to search.
+ * @param mixed $service The service to connect to. If service is a name, it is translated to the corresponding
+ * port number.
+ * @param array $hints Hints provide criteria for selecting addresses returned. You may specify the
+ * hints as defined by getadrinfo.
+ * @return resource[] Returns an array of AddressInfo instances that can be used with the other socket_addrinfo functions.
+ * On failure, FALSE is returned.
* @throws SocketsException
*
*/
-function socket_addrinfo_connect($addr)
+function socket_addrinfo_lookup(string $host, $service = null, array $hints = []): iterable
{
error_clear_last();
- $result = \socket_addrinfo_connect($addr);
- if ($result === null) {
+ if ($hints !== []) {
+ $result = \socket_addrinfo_lookup($host, $service, $hints);
+ } elseif ($service !== null) {
+ $result = \socket_addrinfo_lookup($host, $service);
+ } else {
+ $result = \socket_addrinfo_lookup($host);
+ }
+ if ($result === false) {
throw SocketsException::createFromPhpError();
}
return $result;
@@ -91,7 +122,7 @@ function socket_addrinfo_connect($addr)
* a connection is be established using socket_connect
* or socket_listen.
*
- * @param resource $socket A valid socket resource created with socket_create.
+ * @param resource $socket A Socket instance created with socket_create.
* @param string $address If the socket is of the AF_INET family, the
* address is an IP in dotted-quad notation
* (e.g. 127.0.0.1).
@@ -116,11 +147,12 @@ function socket_bind($socket, string $address, int $port = 0): void
/**
- * Initiate a connection to address using the socket resource
- * socket, which must be a valid socket
- * resource created with socket_create.
+ * Initiate a connection to address using the Socket instance
+ * socket, which must be Socket
+ * instance created with socket_create.
*
- * @param resource $socket
+ * @param resource $socket A Socket instance created with
+ * socket_create.
* @param string $address The address parameter is either an IPv4 address
* in dotted-quad notation (e.g. 127.0.0.1) if
* socket is AF_INET, a valid
@@ -135,10 +167,14 @@ function socket_bind($socket, string $address, int $port = 0): void
* @throws SocketsException
*
*/
-function socket_connect($socket, string $address, int $port = 0): void
+function socket_connect($socket, string $address, int $port = null): void
{
error_clear_last();
- $result = \socket_connect($socket, $address, $port);
+ if ($port !== null) {
+ $result = \socket_connect($socket, $address, $port);
+ } else {
+ $result = \socket_connect($socket, $address);
+ }
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -146,7 +182,7 @@ function socket_connect($socket, string $address, int $port = 0): void
/**
- * socket_create_listen creates a new socket resource of
+ * socket_create_listen creates a new Socket instance of
* type AF_INET listening on all
* local interfaces on the given port waiting for new connections.
*
@@ -159,7 +195,7 @@ function socket_connect($socket, string $address, int $port = 0): void
* SOMAXCONN may be passed as
* backlog parameter, see
* socket_listen for more information.
- * @return resource socket_create_listen returns a new socket resource
+ * @return resource socket_create_listen returns a new Socket instance
* on success. The error code can be retrieved with
* socket_last_error. This code may be passed to
* socket_strerror to get a textual explanation of the
@@ -180,7 +216,7 @@ function socket_create_listen(int $port, int $backlog = 128)
/**
* socket_create_pair creates two connected and
- * indistinguishable sockets, and stores them in fd.
+ * indistinguishable sockets, and stores them in pair.
* This function is commonly used in IPC (InterProcess Communication).
*
* @param int $domain The domain parameter specifies the protocol
@@ -199,14 +235,14 @@ function socket_create_listen(int $port, int $backlog = 128)
*
* See socket_create for the full list of supported
* protocols.
- * @param resource[]|null $fd Reference to an array in which the two socket resources will be inserted.
+ * @param resource[]|null $pair Reference to an array in which the two Socket instances will be inserted.
* @throws SocketsException
*
*/
-function socket_create_pair(int $domain, int $type, int $protocol, ?iterable &$fd): void
+function socket_create_pair(int $domain, int $type, int $protocol, ?iterable &$pair): void
{
error_clear_last();
- $result = \socket_create_pair($domain, $type, $protocol, $fd);
+ $result = \socket_create_pair($domain, $type, $protocol, $pair);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -214,7 +250,7 @@ function socket_create_pair(int $domain, int $type, int $protocol, ?iterable &$f
/**
- * Creates and returns a socket resource, also referred to as an endpoint
+ * Creates and returns a Socket instance, also referred to as an endpoint
* of communication. A typical network connection is made up of 2 sockets, one
* performing the role of the client, and another performing the role of the server.
*
@@ -229,7 +265,7 @@ function socket_create_pair(int $domain, int $type, int $protocol, ?iterable &$f
* the desired protocol is TCP, or UDP the corresponding constants
* SOL_TCP, and SOL_UDP
* can also be used.
- * @return resource socket_create returns a socket resource on success. The actual error code can be retrieved by calling
+ * @return resource socket_create returns a Socket instance on success. The actual error code can be retrieved by calling
* socket_last_error. This error code may be passed to
* socket_strerror to get a textual explanation of the
* error.
@@ -268,10 +304,10 @@ function socket_export_stream($socket)
/**
* The socket_get_option function retrieves the value for
- * the option specified by the optname parameter for the
+ * the option specified by the option parameter for the
* specified socket.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
* @param int $level The level parameter specifies the protocol
* level at which the option resides. For example, to retrieve options at
@@ -280,7 +316,7 @@ function socket_export_stream($socket)
* TCP, can be used by
* specifying the protocol number of that level. Protocol numbers can be
* found by using the getprotobyname function.
- * @param int $optname Reports whether the socket lingers on
+ * @param int $option Reports whether the socket lingers on
* socket_close if data is present. By default,
* when the socket is closed, it attempts to send all unsent data.
* In the case of a connection-oriented socket,
@@ -298,14 +334,14 @@ function socket_export_stream($socket)
* is sent or the time specified in l_linger
* elapses. If the socket is non-blocking,
* socket_close will fail and return an error.
- * @return mixed Returns the value of the given options.
+ * @return mixed Returns the value of the given option.
* @throws SocketsException
*
*/
-function socket_get_option($socket, int $level, int $optname)
+function socket_get_option($socket, int $level, int $option)
{
error_clear_last();
- $result = \socket_get_option($socket, $level, $optname);
+ $result = \socket_get_option($socket, $level, $option);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -317,9 +353,9 @@ function socket_get_option($socket, int $level, int $optname)
* Queries the remote side of the given socket which may either result in
* host/port or in a Unix filesystem path, dependent on its type.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
- * @param string $address If the given socket is of type AF_INET or
+ * @param string|null $address If the given socket is of type AF_INET or
* AF_INET6, socket_getpeername
* will return the peers (remote) IP address in
* appropriate notation (e.g. 127.0.0.1 or
@@ -336,7 +372,7 @@ function socket_get_option($socket, int $level, int $optname)
* @throws SocketsException
*
*/
-function socket_getpeername($socket, string &$address, ?int &$port = null): void
+function socket_getpeername($socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
$result = \socket_getpeername($socket, $address, $port);
@@ -349,9 +385,9 @@ function socket_getpeername($socket, string &$address, ?int &$port = null): void
/**
*
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
- * @param string|null $addr If the given socket is of type AF_INET
+ * @param string|null $address If the given socket is of type AF_INET
* or AF_INET6, socket_getsockname
* will return the local IP address in appropriate notation (e.g.
* 127.0.0.1 or fe80::1) in the
@@ -366,10 +402,10 @@ function socket_getpeername($socket, string &$address, ?int &$port = null): void
* @throws SocketsException
*
*/
-function socket_getsockname($socket, ?string &$addr, ?int &$port = null): void
+function socket_getsockname($socket, ?string &$address, ?int &$port = null): void
{
error_clear_last();
- $result = \socket_getsockname($socket, $addr, $port);
+ $result = \socket_getsockname($socket, $address, $port);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -380,7 +416,7 @@ function socket_getsockname($socket, ?string &$addr, ?int &$port = null): void
* Imports a stream that encapsulates a socket into a socket extension resource.
*
* @param resource $stream The stream resource to import.
- * @return resource|false Returns FALSE.
+ * @return resource Returns FALSE on failure.
* @throws SocketsException
*
*/
@@ -388,7 +424,7 @@ function socket_import_stream($stream)
{
error_clear_last();
$result = \socket_import_stream($stream);
- if ($result === null) {
+ if ($result === false) {
throw SocketsException::createFromPhpError();
}
return $result;
@@ -405,7 +441,7 @@ function socket_import_stream($stream)
* type SOCK_STREAM or
* SOCK_SEQPACKET.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_addrinfo_bind
* @param int $backlog A maximum of backlog incoming connections will be
* queued for processing. If a connection request arrives with the queue
@@ -434,19 +470,19 @@ function socket_listen($socket, int $backlog = 0): void
/**
- * The function socket_read reads from the socket
- * resource socket created by the
+ * The function socket_read reads from the Socket instance
+ * socket created by the
* socket_create or
* socket_accept functions.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
* @param int $length The maximum number of bytes read is specified by the
* length parameter. Otherwise you can use
* \r, \n,
- * or \0 to end reading (depending on the type
+ * or \0 to end reading (depending on the mode
* parameter, see below).
- * @param int $type Optional type parameter is a named constant:
+ * @param int $mode Optional mode parameter is a named constant:
*
*
*
@@ -469,10 +505,10 @@ function socket_listen($socket, int $backlog = 0): void
* @throws SocketsException
*
*/
-function socket_read($socket, int $length, int $type = PHP_BINARY_READ): string
+function socket_read($socket, int $length, int $mode = PHP_BINARY_READ): string
{
error_clear_last();
- $result = \socket_read($socket, $length, $type);
+ $result = \socket_read($socket, $length, $mode);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -482,14 +518,14 @@ function socket_read($socket, int $length, int $type = PHP_BINARY_READ): string
/**
* The function socket_send sends
- * len bytes to the socket
- * socket from buf.
+ * length bytes to the socket
+ * socket from data.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
- * @param string $buf A buffer containing the data that will be sent to the remote host.
- * @param int $len The number of bytes that will be sent to the remote host from
- * buf.
+ * @param string $data A buffer containing the data that will be sent to the remote host.
+ * @param int $length The number of bytes that will be sent to the remote host from
+ * data.
* @param int $flags The value of flags can be any combination of
* the following flags, joined with the binary OR (|)
* operator.
@@ -530,10 +566,10 @@ function socket_read($socket, int $length, int $type = PHP_BINARY_READ): string
* @throws SocketsException
*
*/
-function socket_send($socket, string $buf, int $len, int $flags): int
+function socket_send($socket, string $data, int $length, int $flags): int
{
error_clear_last();
- $result = \socket_send($socket, $buf, $len, $flags);
+ $result = \socket_send($socket, $data, $length, $flags);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -564,13 +600,13 @@ function socket_sendmsg($socket, array $message, int $flags = 0): int
/**
* The function socket_sendto sends
- * len bytes from buf
+ * length bytes from data
* through the socket socket to the
- * port at the address addr.
+ * port at the address address.
*
- * @param resource $socket A valid socket resource created using socket_create.
- * @param string $buf The sent data will be taken from buffer buf.
- * @param int $len len bytes from buf will be
+ * @param resource $socket A Socket instance created using socket_create.
+ * @param string $data The sent data will be taken from buffer data.
+ * @param int $length length bytes from data will be
* sent.
* @param int $flags The value of flags can be any combination of
* the following flags, joined with the binary OR (|)
@@ -608,7 +644,7 @@ function socket_sendmsg($socket, array $message, int $flags = 0): int
*
*
*
- * @param string $addr IP address of the remote host.
+ * @param string $address IP address of the remote host.
* @param int $port port is the remote port number at which the data
* will be sent.
* @return int socket_sendto returns the number of bytes sent to the
@@ -616,10 +652,14 @@ function socket_sendmsg($socket, array $message, int $flags = 0): int
* @throws SocketsException
*
*/
-function socket_sendto($socket, string $buf, int $len, int $flags, string $addr, int $port = 0): int
+function socket_sendto($socket, string $data, int $length, int $flags, string $address, int $port = null): int
{
error_clear_last();
- $result = \socket_sendto($socket, $buf, $len, $flags, $addr, $port);
+ if ($port !== null) {
+ $result = \socket_sendto($socket, $data, $length, $flags, $address, $port);
+ } else {
+ $result = \socket_sendto($socket, $data, $length, $flags, $address);
+ }
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -636,7 +676,7 @@ function socket_sendto($socket, string $buf, int $len, int $flags, string $addr,
* a blocking socket, the script will pause its execution until it receives
* a signal or it can perform the operation.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
* @throws SocketsException
*
@@ -661,7 +701,7 @@ function socket_set_block($socket): void
* signal or it can perform the operation. Rather, if the operation would result
* in a block, the called function will fail.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
* @throws SocketsException
*
@@ -678,12 +718,12 @@ function socket_set_nonblock($socket): void
/**
* The socket_set_option function sets the option
- * specified by the optname parameter, at the
+ * specified by the option parameter, at the
* specified protocol level, to the value pointed to
- * by the optval parameter for the
+ * by the value parameter for the
* socket.
*
- * @param resource $socket A valid socket resource created with socket_create
+ * @param resource $socket A Socket instance created with socket_create
* or socket_accept.
* @param int $level The level parameter specifies the protocol
* level at which the option resides. For example, to retrieve options at
@@ -692,16 +732,16 @@ function socket_set_nonblock($socket): void
* TCP, can be used by specifying the protocol number of that level.
* Protocol numbers can be found by using the
* getprotobyname function.
- * @param int $optname The available socket options are the same as those for the
+ * @param int $option The available socket options are the same as those for the
* socket_get_option function.
- * @param int|string|array $optval The option value.
+ * @param int|string|array $value The option value.
* @throws SocketsException
*
*/
-function socket_set_option($socket, int $level, int $optname, $optval): void
+function socket_set_option($socket, int $level, int $option, $value): void
{
error_clear_last();
- $result = \socket_set_option($socket, $level, $optname, $optval);
+ $result = \socket_set_option($socket, $level, $option, $value);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -713,10 +753,10 @@ function socket_set_option($socket, int $level, int $optname, $optval): void
* incoming, outgoing or all data (the default) from being sent through the
* socket
*
- * @param resource $socket A valid socket resource created with socket_create.
- * @param int $how The value of how can be one of the following:
+ * @param resource $socket A Socket instance created with socket_create.
+ * @param int $mode The value of mode can be one of the following:
*
- * possible values for how
+ * possible values for mode
*
*
*
@@ -743,10 +783,10 @@ function socket_set_option($socket, int $level, int $optname, $optval): void
* @throws SocketsException
*
*/
-function socket_shutdown($socket, int $how = 2): void
+function socket_shutdown($socket, int $mode = 2): void
{
error_clear_last();
- $result = \socket_shutdown($socket, $how);
+ $result = \socket_shutdown($socket, $mode);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -756,18 +796,18 @@ function socket_shutdown($socket, int $how = 2): void
/**
* Exports the WSAPROTOCOL_INFO structure into shared memory and returns
* an identifier to be used with socket_wsaprotocol_info_import. The
- * exported ID is only valid for the given target_pid.
+ * exported ID is only valid for the given process_id.
*
- * @param resource $socket A valid socket resource.
- * @param int $target_pid The ID of the process which will import the socket.
+ * @param resource $socket A Socket instance.
+ * @param int $process_id The ID of the process which will import the socket.
* @return string Returns an identifier to be used for the import
* @throws SocketsException
*
*/
-function socket_wsaprotocol_info_export($socket, int $target_pid): string
+function socket_wsaprotocol_info_export($socket, int $process_id): string
{
error_clear_last();
- $result = \socket_wsaprotocol_info_export($socket, $target_pid);
+ $result = \socket_wsaprotocol_info_export($socket, $process_id);
if ($result === false) {
throw SocketsException::createFromPhpError();
}
@@ -780,7 +820,7 @@ function socket_wsaprotocol_info_export($socket, int $target_pid): string
*
* @param string $info_id The ID which has been returned by a former call to
* socket_wsaprotocol_info_export.
- * @return resource Returns the socket resource
+ * @return resource Returns a Socket instance on success
* @throws SocketsException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/sodium.php b/vendor/thecodingmachine/safe/generated/sodium.php
index 6cb378adb..d13da0da9 100644
--- a/vendor/thecodingmachine/safe/generated/sodium.php
+++ b/vendor/thecodingmachine/safe/generated/sodium.php
@@ -5,24 +5,240 @@ namespace Safe;
use Safe\Exceptions\SodiumException;
/**
- * Uses a CPU- and memory-hard hash algorithm along with a randomly-generated salt, and memory and CPU limits to generate an ASCII-encoded hash suitable for password storage.
+ * Verify then decrypt with AES-256-GCM.
+ * Only available if sodium_crypto_aead_aes256gcm_is_available returns TRUE.
*
- * @param string $password string; The password to generate a hash for.
- * @param int $opslimit Represents a maximum amount of computations to perform. Raising this number will make the function require more CPU cycles to compute a key. There are constants available to set the operations limit to appropriate values depending on intended use, in order of strength: SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE and SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE.
- * @param int $memlimit The maximum amount of RAM that the function will use, in bytes. There are constants to help you choose an appropriate value, in order of size: SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE, and SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE. Typically these should be paired with the matching opslimit values.
- * @return string Returns the hashed password.
+ * @param string $ciphertext Must be in the format provided by sodium_crypto_aead_aes256gcm_encrypt
+ * (ciphertext and tag, concatenated).
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 12 bytes long.
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the plaintext on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_aes256gcm_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Verify then decrypt with ChaCha20-Poly1305.
+ *
+ * @param string $ciphertext Must be in the format provided by sodium_crypto_aead_chacha20poly1305_encrypt
+ * (ciphertext and tag, concatenated).
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 8 bytes long.
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the plaintext on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_chacha20poly1305_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Encrypt then authenticate with ChaCha20-Poly1305.
+ *
+ * @param string $message The plaintext message to encrypt.
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 8 bytes long.
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the ciphertext and tag on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_chacha20poly1305_encrypt(string $message, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Verify then decrypt with ChaCha20-Poly1305 (IETF variant).
+ *
+ * The IETF variant uses 96-bit nonces and 32-bit internal counters, instead of 64-bit for both.
+ *
+ * @param string $ciphertext Must be in the format provided by sodium_crypto_aead_chacha20poly1305_ietf_encrypt
+ * (ciphertext and tag, concatenated).
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 12 bytes long.
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the plaintext on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_chacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Encrypt then authenticate with ChaCha20-Poly1305 (IETF variant).
+ *
+ * The IETF variant uses 96-bit nonces and 32-bit internal counters, instead of 64-bit for both.
+ *
+ * @param string $message The plaintext message to encrypt.
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 12 bytes long.
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the ciphertext and tag on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_chacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Verify then decrypt with ChaCha20-Poly1305 (eXtended-nonce variant).
+ *
+ * Generally, XChaCha20-Poly1305 is the best of the provided AEAD modes to use.
+ *
+ * @param string $ciphertext Must be in the format provided by sodium_crypto_aead_chacha20poly1305_ietf_encrypt
+ * (ciphertext and tag, concatenated).
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 24 bytes long.
+ * This is a large enough bound to generate randomly (i.e. random_bytes).
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the plaintext on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt(string $ciphertext, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Encrypt then authenticate with XChaCha20-Poly1305 (eXtended-nonce variant).
+ *
+ * Generally, XChaCha20-Poly1305 is the best of the provided AEAD modes to use.
+ *
+ * @param string $message The plaintext message to encrypt.
+ * @param string $additional_data Additional, authenticated data. This is used in the verification of the authentication tag
+ * appended to the ciphertext, but it is not encrypted or stored in the ciphertext.
+ * @param string $nonce A number that must be only used once, per message. 24 bytes long.
+ * This is a large enough bound to generate randomly (i.e. random_bytes).
+ * @param string $key Encryption key (256-bit).
+ * @return string Returns the ciphertext and tag on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(string $message, string $additional_data, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Verify the authentication tag is valid for a given message and key.
+ *
+ * Unlike with digital signatures (e.g. sodium_crypto_sign_verify_detached),
+ * any party capable of verifying a message is also capable of authenticating
+ * their own messages. (Hence, symmetric authentication.)
+ *
+ * @param string $mac Authentication tag produced by sodium_crypto_auth
+ * @param string $message Message
+ * @param string $key Authentication key
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_auth_verify(string $mac, string $message, string $key): void
+{
+ error_clear_last();
+ $result = \sodium_crypto_auth_verify($mac, $message, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Decrypt a message using asymmetric (public key) cryptography.
+ *
+ * @param string $ciphertext The encrypted message to attempt to decrypt.
+ * @param string $nonce A number that must be only used once, per message. 24 bytes long.
+ * This is a large enough bound to generate randomly (i.e. random_bytes).
+ * @param string $key_pair See sodium_crypto_box_keypair_from_secretkey_and_publickey.
+ * This should include the sender's public key and the recipient's secret key.
+ * @return string Returns the plaintext message on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_box_open(string $ciphertext, string $nonce, string $key_pair): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_box_open($ciphertext, $nonce, $key_pair);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Decrypt a message that was encrypted with sodium_crypto_box_seal
*
- * In order to produce the same password hash from the same password, the same values for opslimit and memlimit must be used. These are embedded within the generated hash, so
- * everything that's needed to verify the hash is included. This allows
- * the sodium_crypto_pwhash_str_verify function to verify the hash without
- * needing separate storage for the other parameters.
+ * @param string $ciphertext The encrypted message
+ * @param string $key_pair The keypair of the recipient. Must include the secret key.
+ * @return string The plaintext on success.
* @throws SodiumException
*
*/
-function sodium_crypto_pwhash_str(string $password, int $opslimit, int $memlimit): string
+function sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string
{
error_clear_last();
- $result = \sodium_crypto_pwhash_str($password, $opslimit, $memlimit);
+ $result = \sodium_crypto_box_seal_open($ciphertext, $key_pair);
if ($result === false) {
throw SodiumException::createFromPhpError();
}
@@ -31,28 +247,80 @@ function sodium_crypto_pwhash_str(string $password, int $opslimit, int $memlimit
/**
- * This function provides low-level access to libsodium's crypto_pwhash key derivation function. Unless you have specific reason to use this function, you should use sodium_crypto_pwhash_str or password_hash functions instead.
+ * Appends a message to the internal hash state.
*
- * @param int $length integer; The length of the password hash to generate, in bytes.
- * @param string $password string; The password to generate a hash for.
- * @param string $salt string A salt to add to the password before hashing. The salt should be unpredictable, ideally generated from a good random mumber source such as random_bytes, and have a length of at least SODIUM_CRYPTO_PWHASH_SALTBYTES bytes.
- * @param int $opslimit Represents a maximum amount of computations to perform. Raising this number will make the function require more CPU cycles to compute a key. There are some constants available to set the operations limit to appropriate values depending on intended use, in order of strength: SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE and SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE.
- * @param int $memlimit The maximum amount of RAM that the function will use, in bytes. There are constants to help you choose an appropriate value, in order of size: SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE, SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE, and SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE. Typically these should be paired with the matching opslimit values.
- * @param int $alg integer A number indicating the hash algorithm to use. By default SODIUM_CRYPTO_PWHASH_ALG_DEFAULT (the currently recommended algorithm, which can change from one version of libsodium to another), or explicitly using SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13, representing the Argon2id algorithm version 1.3.
- * @return string Returns the derived key. The return value is a binary string of the hash, not an ASCII-encoded representation, and does not contain additional information about the parameters used to create the hash, so you will need to keep that information if you are ever going to verify the password in future. Use sodium_crypto_pwhash_str to avoid needing to do all that.
+ * @param string $state The return value of sodium_crypto_generichash_init.
+ * @param string $message Data to append to the hashing state.
* @throws SodiumException
*
*/
-function sodium_crypto_pwhash(int $length, string $password, string $salt, int $opslimit, int $memlimit, int $alg = null): string
+function sodium_crypto_generichash_update(string &$state, string $message): void
{
error_clear_last();
- if ($alg !== null) {
- $result = \sodium_crypto_pwhash($length, $password, $salt, $opslimit, $memlimit, $alg);
- } else {
- $result = \sodium_crypto_pwhash($length, $password, $salt, $opslimit, $memlimit);
+ $result = \sodium_crypto_generichash_update($state, $message);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
}
+}
+
+
+/**
+ * Decrypt an encrypted message with a symmetric (shared) key.
+ *
+ * @param string $ciphertext Must be in the format provided by sodium_crypto_secretbox
+ * (ciphertext and tag, concatenated).
+ * @param string $nonce A number that must be only used once, per message. 24 bytes long.
+ * This is a large enough bound to generate randomly (i.e. random_bytes).
+ * @param string $key Encryption key (256-bit).
+ * @return string The decrypted string on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_secretbox_open(string $ciphertext, string $nonce, string $key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Verify the signature attached to a message and return the message
+ *
+ * @param string $signed_message A message signed with sodium_crypto_sign
+ * @param string $public_key An Ed25519 public key
+ * @return string Returns the original signed message on success.
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_sign_open(string $signed_message, string $public_key): string
+{
+ error_clear_last();
+ $result = \sodium_crypto_sign_open($signed_message, $public_key);
if ($result === false) {
throw SodiumException::createFromPhpError();
}
return $result;
}
+
+
+/**
+ * Verify signature for the message
+ *
+ * @param string $signature The cryptographic signature obtained from sodium_crypto_sign_detached
+ * @param string $message The message being verified
+ * @param string $public_key Ed25519 public key
+ * @throws SodiumException
+ *
+ */
+function sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): void
+{
+ error_clear_last();
+ $result = \sodium_crypto_sign_verify_detached($signature, $message, $public_key);
+ if ($result === false) {
+ throw SodiumException::createFromPhpError();
+ }
+}
diff --git a/vendor/thecodingmachine/safe/generated/spl.php b/vendor/thecodingmachine/safe/generated/spl.php
index 679e68991..08c679dc2 100644
--- a/vendor/thecodingmachine/safe/generated/spl.php
+++ b/vendor/thecodingmachine/safe/generated/spl.php
@@ -6,19 +6,18 @@ use Safe\Exceptions\SplException;
/**
* This function returns an array with the names of the interfaces that the
- * given class and its parents implement.
+ * given object_or_class and its parents implement.
*
- * @param mixed $class An object (class instance) or a string (class or interface name).
- * @param bool $autoload Whether to allow this function to load the class automatically through
- * the __autoload magic method.
- * @return array An array on success.
+ * @param object|string $object_or_class An object (class instance) or a string (class or interface name).
+ * @param bool $autoload Whether to call __autoload by default.
+ * @return array An array on success, or FALSE when the given class doesn't exist.
* @throws SplException
*
*/
-function class_implements($class, bool $autoload = true): array
+function class_implements($object_or_class, bool $autoload = true): array
{
error_clear_last();
- $result = \class_implements($class, $autoload);
+ $result = \class_implements($object_or_class, $autoload);
if ($result === false) {
throw SplException::createFromPhpError();
}
@@ -28,19 +27,18 @@ function class_implements($class, bool $autoload = true): array
/**
* This function returns an array with the name of the parent classes of
- * the given class.
+ * the given object_or_class.
*
- * @param mixed $class An object (class instance) or a string (class name).
- * @param bool $autoload Whether to allow this function to load the class automatically through
- * the __autoload magic method.
- * @return array An array on success.
+ * @param object|string $object_or_class An object (class instance) or a string (class name).
+ * @param bool $autoload Whether to call __autoload by default.
+ * @return array An array on success, or FALSE when the given class doesn't exist.
* @throws SplException
*
*/
-function class_parents($class, bool $autoload = true): array
+function class_parents($object_or_class, bool $autoload = true): array
{
error_clear_last();
- $result = \class_parents($class, $autoload);
+ $result = \class_parents($object_or_class, $autoload);
if ($result === false) {
throw SplException::createFromPhpError();
}
@@ -50,20 +48,19 @@ function class_parents($class, bool $autoload = true): array
/**
* This function returns an array with the names of the traits that the
- * given class uses. This does however not include
+ * given object_or_class uses. This does however not include
* any traits used by a parent class.
*
- * @param mixed $class An object (class instance) or a string (class name).
- * @param bool $autoload Whether to allow this function to load the class automatically through
- * the __autoload magic method.
- * @return array An array on success.
+ * @param object|string $object_or_class An object (class instance) or a string (class name).
+ * @param bool $autoload Whether to call __autoload by default.
+ * @return array An array on success, or FALSE when the given class doesn't exist.
* @throws SplException
*
*/
-function class_uses($class, bool $autoload = true): array
+function class_uses($object_or_class, bool $autoload = true): array
{
error_clear_last();
- $result = \class_uses($class, $autoload);
+ $result = \class_uses($object_or_class, $autoload);
if ($result === false) {
throw SplException::createFromPhpError();
}
@@ -87,27 +84,27 @@ function class_uses($class, bool $autoload = true): array
* runs through each of them in the order they are defined. By contrast,
* __autoload may only be defined once.
*
- * @param callable(string):void $autoload_function The autoload function being registered.
- * If no parameter is provided, then the default implementation of
+ * @param callable(string):void $callback The autoload function being registered.
+ * If NULL, then the default implementation of
* spl_autoload will be registered.
* @param bool $throw This parameter specifies whether
* spl_autoload_register should throw
- * exceptions when the autoload_function
+ * exceptions when the callback
* cannot be registered.
* @param bool $prepend If true, spl_autoload_register will prepend
* the autoloader on the autoload queue instead of appending it.
* @throws SplException
*
*/
-function spl_autoload_register(callable $autoload_function = null, bool $throw = true, bool $prepend = false): void
+function spl_autoload_register(callable $callback = null, bool $throw = true, bool $prepend = false): void
{
error_clear_last();
if ($prepend !== false) {
- $result = \spl_autoload_register($autoload_function, $throw, $prepend);
+ $result = \spl_autoload_register($callback, $throw, $prepend);
} elseif ($throw !== true) {
- $result = \spl_autoload_register($autoload_function, $throw);
- } elseif ($autoload_function !== null) {
- $result = \spl_autoload_register($autoload_function);
+ $result = \spl_autoload_register($callback, $throw);
+ } elseif ($callback !== null) {
+ $result = \spl_autoload_register($callback);
} else {
$result = \spl_autoload_register();
}
@@ -125,14 +122,14 @@ function spl_autoload_register(callable $autoload_function = null, bool $throw =
* When this function results in the queue being deactivated, any
* __autoload function that previously existed will not be reactivated.
*
- * @param mixed $autoload_function The autoload function being unregistered.
+ * @param mixed $callback The autoload function being unregistered.
* @throws SplException
*
*/
-function spl_autoload_unregister($autoload_function): void
+function spl_autoload_unregister($callback): void
{
error_clear_last();
- $result = \spl_autoload_unregister($autoload_function);
+ $result = \spl_autoload_unregister($callback);
if ($result === false) {
throw SplException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/ssh2.php b/vendor/thecodingmachine/safe/generated/ssh2.php
index 96af9df32..fff3ceb6f 100644
--- a/vendor/thecodingmachine/safe/generated/ssh2.php
+++ b/vendor/thecodingmachine/safe/generated/ssh2.php
@@ -381,6 +381,53 @@ function ssh2_exec($session, string $command, string $pty = null, array $env = n
/**
+ * Accepts a connection created by a listener.
+ *
+ * @param resource $listener An SSH2 Listener resource, obtained from a call to ssh2_forward_listen.
+ * @return Returns a stream resource.
+ * @throws Ssh2Exception
+ *
+ */
+function ssh2_forward_accept($listener)
+{
+ error_clear_last();
+ $result = \ssh2_forward_accept($listener);
+ if ($result === false) {
+ throw Ssh2Exception::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Binds a port on the remote server and listen for connections.
+ *
+ * @param resource $session An SSH Session resource, obtained from a call to ssh2_connect.
+ * @param int $port The port of the remote server.
+ * @param string $host
+ * @param int $max_connections
+ * @return Returns an SSH2 Listener.
+ * @throws Ssh2Exception
+ *
+ */
+function ssh2_forward_listen($session, int $port, string $host = null, int $max_connections = 16)
+{
+ error_clear_last();
+ if ($max_connections !== 16) {
+ $result = \ssh2_forward_listen($session, $port, $host, $max_connections);
+ } elseif ($host !== null) {
+ $result = \ssh2_forward_listen($session, $port, $host);
+ } else {
+ $result = \ssh2_forward_listen($session, $port);
+ }
+ if ($result === false) {
+ throw Ssh2Exception::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
*
*
* @param resource $pkey Publickey Subsystem resource created by ssh2_publickey_init.
@@ -497,6 +544,27 @@ function ssh2_scp_send($session, string $local_file, string $remote_file, int $c
/**
+ * Sends an EOF to the stream; this is typically used to close standard input,
+ * while keeping output and error alive. For example, one can send a remote
+ * process some data over standard input, close it to start processing, and
+ * still be able to read out the results without creating additional files.
+ *
+ * @param resource $channel An SSH stream; can be acquired through functions like ssh2_fetch_stream
+ * or ssh2_connect.
+ * @throws Ssh2Exception
+ *
+ */
+function ssh2_send_eof($channel): void
+{
+ error_clear_last();
+ $result = \ssh2_send_eof($channel);
+ if ($result === false) {
+ throw Ssh2Exception::createFromPhpError();
+ }
+}
+
+
+/**
* Attempts to change the mode of the specified file to that given in
* mode.
*
@@ -526,6 +594,7 @@ function ssh2_sftp_chmod($sftp, string $filename, int $mode): void
* @param resource $sftp An SSH2 SFTP resource opened by ssh2_sftp.
* @param string $dirname Path of the new directory.
* @param int $mode Permissions on the new directory.
+ * The actual mode is affected by the current umask.
* @param bool $recursive If recursive is TRUE any parent directories
* required for dirname will be automatically created as well.
* @throws Ssh2Exception
@@ -639,3 +708,42 @@ function ssh2_sftp($session)
}
return $result;
}
+
+
+/**
+ * Open a shell at the remote end and allocate a stream for it.
+ *
+ * @param resource $session An SSH connection link identifier, obtained from a call to
+ * ssh2_connect.
+ * @param string $term_type term_type should correspond to one of the
+ * entries in the target system's /etc/termcap file.
+ * @param array $env env may be passed as an associative array of
+ * name/value pairs to set in the target environment.
+ * @param int $width Width of the virtual terminal.
+ * @param int $height Height of the virtual terminal.
+ * @param int $width_height_type width_height_type should be one of
+ * SSH2_TERM_UNIT_CHARS or
+ * SSH2_TERM_UNIT_PIXELS.
+ * @return resource Returns a stream resource on success.
+ * @throws Ssh2Exception
+ *
+ */
+function ssh2_shell($session, string $term_type = "vanilla", array $env = null, int $width = 80, int $height = 25, int $width_height_type = SSH2_TERM_UNIT_CHARS)
+{
+ error_clear_last();
+ if ($width_height_type !== SSH2_TERM_UNIT_CHARS) {
+ $result = \ssh2_shell($session, $term_type, $env, $width, $height, $width_height_type);
+ } elseif ($height !== 25) {
+ $result = \ssh2_shell($session, $term_type, $env, $width, $height);
+ } elseif ($width !== 80) {
+ $result = \ssh2_shell($session, $term_type, $env, $width);
+ } elseif ($env !== null) {
+ $result = \ssh2_shell($session, $term_type, $env);
+ } else {
+ $result = \ssh2_shell($session, $term_type);
+ }
+ if ($result === false) {
+ throw Ssh2Exception::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/generated/stream.php b/vendor/thecodingmachine/safe/generated/stream.php
index 573d0295a..3d086e149 100644
--- a/vendor/thecodingmachine/safe/generated/stream.php
+++ b/vendor/thecodingmachine/safe/generated/stream.php
@@ -7,18 +7,16 @@ use Safe\Exceptions\StreamException;
/**
* Sets parameters on the specified context.
*
- * @param resource $stream_or_context The stream or context to apply the parameters too.
- * @param array $params An array of parameters to set.
- *
- * params should be an associative array of the structure:
+ * @param resource $context The stream or context to apply the parameters too.
+ * @param array $params An associative array of parameters to be set in the following format:
* $params['paramname'] = "paramvalue";.
* @throws StreamException
*
*/
-function stream_context_set_params($stream_or_context, array $params): void
+function stream_context_set_params($context, array $params): void
{
error_clear_last();
- $result = \stream_context_set_params($stream_or_context, $params);
+ $result = \stream_context_set_params($context, $params);
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -26,25 +24,31 @@ function stream_context_set_params($stream_or_context, array $params): void
/**
- * Makes a copy of up to maxlength bytes
+ * Makes a copy of up to length bytes
* of data from the current position (or from the
* offset position, if specified) in
- * source to dest. If
- * maxlength is not specified, all remaining content in
- * source will be copied.
+ * from to to. If
+ * length is NULL, all remaining content in
+ * from will be copied.
*
- * @param resource $source The source stream
- * @param resource $dest The destination stream
- * @param int $maxlength Maximum bytes to copy
+ * @param resource $from The source stream
+ * @param resource $to The destination stream
+ * @param int $length Maximum bytes to copy. By default all bytes left are copied.
* @param int $offset The offset where to start to copy data
* @return int Returns the total count of bytes copied.
* @throws StreamException
*
*/
-function stream_copy_to_stream($source, $dest, int $maxlength = -1, int $offset = 0): int
+function stream_copy_to_stream($from, $to, int $length = null, int $offset = 0): int
{
error_clear_last();
- $result = \stream_copy_to_stream($source, $dest, $maxlength, $offset);
+ if ($offset !== 0) {
+ $result = \stream_copy_to_stream($from, $to, $length, $offset);
+ } elseif ($length !== null) {
+ $result = \stream_copy_to_stream($from, $to, $length);
+ } else {
+ $result = \stream_copy_to_stream($from, $to);
+ }
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -69,7 +73,7 @@ function stream_copy_to_stream($source, $dest, int $maxlength = -1, int $offset
* STREAM_FILTER_WRITE, and/or
* STREAM_FILTER_ALL can also be passed to the
* read_write parameter to override this behavior.
- * @param mixed $params This filter will be added with the specified
+ * @param array $params This filter will be added with the specified
* params to the end of
* the list and will therefore be called last during stream operations.
* To add a filter to the beginning of the list, use
@@ -83,7 +87,7 @@ function stream_copy_to_stream($source, $dest, int $maxlength = -1, int $offset
* @throws StreamException
*
*/
-function stream_filter_append($stream, string $filtername, int $read_write = null, $params = null)
+function stream_filter_append($stream, string $filtername, int $read_write = null, array $params = null)
{
error_clear_last();
if ($params !== null) {
@@ -119,7 +123,7 @@ function stream_filter_append($stream, string $filtername, int $read_write = nul
* read_write parameter to override this behavior.
* See stream_filter_append for an example of
* using this parameter.
- * @param mixed $params This filter will be added with the specified params
+ * @param array $params This filter will be added with the specified params
* to the beginning of the list and will therefore be
* called first during stream operations. To add a filter to the end of the
* list, use stream_filter_append.
@@ -132,7 +136,7 @@ function stream_filter_append($stream, string $filtername, int $read_write = nul
* @throws StreamException
*
*/
-function stream_filter_prepend($stream, string $filtername, int $read_write = null, $params = null)
+function stream_filter_prepend($stream, string $filtername, int $read_write = null, array $params = null)
{
error_clear_last();
if ($params !== null) {
@@ -155,8 +159,8 @@ function stream_filter_prepend($stream, string $filtername, int $read_write = nu
* filesystem functions (such as fopen,
* fread etc.).
*
- * @param string $filtername The filter name to be registered.
- * @param string $classname To implement a filter, you need to define a class as an extension of
+ * @param string $filter_name The filter name to be registered.
+ * @param string $class To implement a filter, you need to define a class as an extension of
* php_user_filter with a number of member
* functions. When performing read/write operations on the stream
* to which your filter is attached, PHP will pass the data through your
@@ -167,10 +171,10 @@ function stream_filter_prepend($stream, string $filtername, int $read_write = nu
* @throws StreamException
*
*/
-function stream_filter_register(string $filtername, string $classname): void
+function stream_filter_register(string $filter_name, string $class): void
{
error_clear_last();
- $result = \stream_filter_register($filtername, $classname);
+ $result = \stream_filter_register($filter_name, $class);
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -202,11 +206,11 @@ function stream_filter_remove($stream_filter): void
* Identical to file_get_contents, except that
* stream_get_contents operates on an already open
* stream resource and returns the remaining contents in a string, up to
- * maxlength bytes and starting at the specified
+ * length bytes and starting at the specified
* offset.
*
- * @param resource $handle A stream resource (e.g. returned from fopen)
- * @param int $maxlength The maximum bytes to read. Defaults to -1 (read all the remaining
+ * @param resource $stream A stream resource (e.g. returned from fopen)
+ * @param int $length The maximum bytes to read. Defaults to NULL (read all the remaining
* buffer).
* @param int $offset Seek to the specified offset before reading. If this number is negative,
* no seeking will occur and reading will start from the current position.
@@ -214,10 +218,50 @@ function stream_filter_remove($stream_filter): void
* @throws StreamException
*
*/
-function stream_get_contents($handle, int $maxlength = -1, int $offset = -1): string
+function stream_get_contents($stream, int $length = null, int $offset = -1): string
+{
+ error_clear_last();
+ if ($offset !== -1) {
+ $result = \stream_get_contents($stream, $length, $offset);
+ } elseif ($length !== null) {
+ $result = \stream_get_contents($stream, $length);
+ } else {
+ $result = \stream_get_contents($stream);
+ }
+ if ($result === false) {
+ throw StreamException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets a line from the given handle.
+ *
+ * Reading ends when length bytes have been read, when
+ * the non-empty string specified by ending is found (which is
+ * not included in the return value), or on EOF
+ * (whichever comes first).
+ *
+ * This function is nearly identical to fgets except in
+ * that it allows end of line delimiters other than the standard \n, \r, and
+ * \r\n, and does not return the delimiter itself.
+ *
+ * @param resource $stream A valid file handle.
+ * @param int $length The maximum number of bytes to read from the handle.
+ * Negative values are not supported.
+ * Zero (0) means the default socket chunk size,
+ * i.e. 8192 bytes.
+ * @param string $ending An optional string delimiter.
+ * @return string Returns a string of up to length bytes read from the file
+ * pointed to by stream.
+ * @throws StreamException
+ *
+ */
+function stream_get_line($stream, int $length, string $ending = ""): string
{
error_clear_last();
- $result = \stream_get_contents($handle, $maxlength, $offset);
+ $result = \stream_get_line($stream, $length, $ending);
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -269,7 +313,7 @@ function stream_resolve_include_path(string $filename): string
* (currently, regular files and socket streams).
*
* @param resource $stream The stream.
- * @param bool $mode If mode is FALSE, the given stream
+ * @param bool $enable If enable is FALSE, the given stream
* will be switched to non-blocking mode, and if TRUE, it
* will be switched to blocking mode. This affects calls like
* fgets and fread
@@ -280,10 +324,10 @@ function stream_resolve_include_path(string $filename): string
* @throws StreamException
*
*/
-function stream_set_blocking($stream, bool $mode): void
+function stream_set_blocking($stream, bool $enable): void
{
error_clear_last();
- $result = \stream_set_blocking($stream, $mode);
+ $result = \stream_set_blocking($stream, $enable);
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -319,10 +363,11 @@ function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
* Accept a connection on a socket previously created by
* stream_socket_server.
*
- * @param resource $server_socket The server socket to accept a connection from.
+ * @param resource $socket The server socket to accept a connection from.
* @param float $timeout Override the default socket accept timeout. Time should be given in
- * seconds.
- * @param string|null $peername Will be set to the name (address) of the client which connected, if
+ * seconds. By default, default_socket_timeout
+ * is used.
+ * @param string|null $peer_name Will be set to the name (address) of the client which connected, if
* included and available from the selected transport.
*
* Can also be determined later using
@@ -331,15 +376,15 @@ function stream_set_timeout($stream, int $seconds, int $microseconds = 0): void
* @throws StreamException
*
*/
-function stream_socket_accept($server_socket, float $timeout = null, ?string &$peername = null)
+function stream_socket_accept($socket, float $timeout = null, ?string &$peer_name = null)
{
error_clear_last();
- if ($peername !== null) {
- $result = \stream_socket_accept($server_socket, $timeout, $peername);
+ if ($peer_name !== null) {
+ $result = \stream_socket_accept($socket, $timeout, $peer_name);
} elseif ($timeout !== null) {
- $result = \stream_socket_accept($server_socket, $timeout);
+ $result = \stream_socket_accept($socket, $timeout);
} else {
- $result = \stream_socket_accept($server_socket);
+ $result = \stream_socket_accept($socket);
}
if ($result === false) {
throw StreamException::createFromPhpError();
@@ -350,20 +395,21 @@ function stream_socket_accept($server_socket, float $timeout = null, ?string &$p
/**
* Initiates a stream or datagram connection to the destination specified
- * by remote_socket. The type of socket created
+ * by address. The type of socket created
* is determined by the transport specified using standard URL formatting:
* transport://target. For Internet Domain sockets
* (AF_INET) such as TCP and UDP, the target portion
- * of the remote_socket parameter should consist of
+ * of the address parameter should consist of
* a hostname or IP address followed by a colon and a port number. For Unix
* domain sockets, the target portion should point
* to the socket file on the filesystem.
*
- * @param string $remote_socket Address to the socket to connect to.
- * @param int $errno Will be set to the system level error number if connection fails.
- * @param string $errstr Will be set to the system level error message if the connection fails.
+ * @param string $address Address to the socket to connect to.
+ * @param int|null $error_code Will be set to the system level error number if connection fails.
+ * @param string|null $error_message Will be set to the system level error message if the connection fails.
* @param float $timeout Number of seconds until the connect() system call
- * should timeout.
+ * should timeout. By default, default_socket_timeout
+ * is used.
*
*
* This parameter only applies when not making asynchronous
@@ -397,17 +443,17 @@ function stream_socket_accept($server_socket, float $timeout = null, ?string &$p
* @throws StreamException
*
*/
-function stream_socket_client(string $remote_socket, int &$errno = null, string &$errstr = null, float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
+function stream_socket_client(string $address, ?int &$error_code = null, ?string &$error_message = null, float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)
{
error_clear_last();
if ($context !== null) {
- $result = \stream_socket_client($remote_socket, $errno, $errstr, $timeout, $flags, $context);
+ $result = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags, $context);
} elseif ($flags !== STREAM_CLIENT_CONNECT) {
- $result = \stream_socket_client($remote_socket, $errno, $errstr, $timeout, $flags);
+ $result = \stream_socket_client($address, $error_code, $error_message, $timeout, $flags);
} elseif ($timeout !== null) {
- $result = \stream_socket_client($remote_socket, $errno, $errstr, $timeout);
+ $result = \stream_socket_client($address, $error_code, $error_message, $timeout);
} else {
- $result = \stream_socket_client($remote_socket, $errno, $errstr);
+ $result = \stream_socket_client($address, $error_code, $error_message);
}
if ($result === false) {
throw StreamException::createFromPhpError();
@@ -417,6 +463,27 @@ function stream_socket_client(string $remote_socket, int &$errno = null, string
/**
+ * Returns the local or remote name of a given socket connection.
+ *
+ * @param resource $socket The socket to get the name of.
+ * @param bool $remote If set to TRUE the remote socket name will be returned, if set
+ * to FALSE the local socket name will be returned.
+ * @return string The name of the socket.
+ * @throws StreamException
+ *
+ */
+function stream_socket_get_name($socket, bool $remote): string
+{
+ error_clear_last();
+ $result = \stream_socket_get_name($socket, $remote);
+ if ($result === false) {
+ throw StreamException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* stream_socket_pair creates a pair of connected,
* indistinguishable socket streams. This function is commonly used in IPC
* (Inter-Process Communication).
@@ -451,13 +518,100 @@ function stream_socket_pair(int $domain, int $type, int $protocol): iterable
/**
+ * stream_socket_recvfrom accepts
+ * data from a remote socket up to length bytes.
+ *
+ * @param resource $socket The remote socket.
+ * @param int $length The number of bytes to receive from the socket.
+ * @param int $flags The value of flags can be any combination
+ * of the following:
+ *
+ * Possible values for flags
+ *
+ *
+ *
+ * STREAM_OOB
+ *
+ * Process OOB (out-of-band) data.
+ *
+ *
+ *
+ * STREAM_PEEK
+ *
+ * Retrieve data from the socket, but do not consume the buffer.
+ * Subsequent calls to fread or
+ * stream_socket_recvfrom will see
+ * the same data.
+ *
+ *
+ *
+ *
+ *
+ * @param string|null $address If address is provided it will be populated with
+ * the address of the remote socket.
+ * @return string Returns the read data, as a string.
+ * @throws StreamException
+ *
+ */
+function stream_socket_recvfrom($socket, int $length, int $flags = 0, ?string &$address = null): string
+{
+ error_clear_last();
+ $result = \stream_socket_recvfrom($socket, $length, $flags, $address);
+ if ($result === false) {
+ throw StreamException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Sends the specified data through the
+ * socket.
+ *
+ * @param resource $socket The socket to send data to.
+ * @param string $data The data to be sent.
+ * @param int $flags The value of flags can be any combination
+ * of the following:
+ *
+ * possible values for flags
+ *
+ *
+ *
+ * STREAM_OOB
+ *
+ * Process OOB (out-of-band) data.
+ *
+ *
+ *
+ *
+ *
+ * @param string $address The address specified when the socket stream was created will be used
+ * unless an alternate address is specified in address.
+ *
+ * If specified, it must be in dotted quad (or [ipv6]) format.
+ * @return int Returns a result code, as an integer.
+ * @throws StreamException
+ *
+ */
+function stream_socket_sendto($socket, string $data, int $flags = 0, string $address = ""): int
+{
+ error_clear_last();
+ $result = \stream_socket_sendto($socket, $data, $flags, $address);
+ if ($result === false) {
+ throw StreamException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Creates a stream or datagram socket on the specified
- * local_socket.
+ * address.
*
* This function only creates a socket, to begin accepting connections
* use stream_socket_accept.
*
- * @param string $local_socket The type of socket created is determined by the transport specified
+ * @param string $address The type of socket created is determined by the transport specified
* using standard URL formatting: transport://target.
*
* For Internet Domain sockets (AF_INET) such as TCP and UDP, the
@@ -471,17 +625,17 @@ function stream_socket_pair(int $domain, int $type, int $protocol): iterable
* A list of available transports can be retrieved using
* stream_get_transports. See
* for a list of bulitin transports.
- * @param int $errno If the optional errno and errstr
+ * @param int|null $error_code If the optional error_code and error_message
* arguments are present they will be set to indicate the actual system
* level error that occurred in the system-level socket(),
* bind(), and listen() calls. If
- * the value returned in errno is
+ * the value returned in error_code is
* 0 and the function returned FALSE, it is an
* indication that the error occurred before the bind()
* call. This is most likely due to a problem initializing the socket.
- * Note that the errno and
- * errstr arguments will always be passed by reference.
- * @param string $errstr See errno description.
+ * Note that the error_code and
+ * error_message arguments will always be passed by reference.
+ * @param string|null $error_message See error_code description.
* @param int $flags A bitmask field which may be set to any combination of socket creation
* flags.
*
@@ -492,13 +646,13 @@ function stream_socket_pair(int $domain, int $type, int $protocol): iterable
* @throws StreamException
*
*/
-function stream_socket_server(string $local_socket, int &$errno = null, string &$errstr = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
+function stream_socket_server(string $address, ?int &$error_code = null, ?string &$error_message = null, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context = null)
{
error_clear_last();
if ($context !== null) {
- $result = \stream_socket_server($local_socket, $errno, $errstr, $flags, $context);
+ $result = \stream_socket_server($address, $error_code, $error_message, $flags, $context);
} else {
- $result = \stream_socket_server($local_socket, $errno, $errstr, $flags);
+ $result = \stream_socket_server($address, $error_code, $error_message, $flags);
}
if ($result === false) {
throw StreamException::createFromPhpError();
@@ -512,7 +666,7 @@ function stream_socket_server(string $local_socket, int &$errno = null, string &
*
* @param resource $stream An open stream (opened with stream_socket_client,
* for example)
- * @param int $how One of the following constants: STREAM_SHUT_RD
+ * @param int $mode One of the following constants: STREAM_SHUT_RD
* (disable further receptions), STREAM_SHUT_WR
* (disable further transmissions) or
* STREAM_SHUT_RDWR (disable further receptions and
@@ -520,10 +674,10 @@ function stream_socket_server(string $local_socket, int &$errno = null, string &
* @throws StreamException
*
*/
-function stream_socket_shutdown($stream, int $how): void
+function stream_socket_shutdown($stream, int $mode): void
{
error_clear_last();
- $result = \stream_socket_shutdown($stream, $how);
+ $result = \stream_socket_shutdown($stream, $mode);
if ($result === false) {
throw StreamException::createFromPhpError();
}
@@ -554,17 +708,18 @@ function stream_supports_lock($stream): void
* fread etc.).
*
* @param string $protocol The wrapper name to be registered.
- * @param string $classname The classname which implements the protocol.
+ * Valid protocol names must contain alphanumerics, dots (.), plusses (+), or hyphens (-) only.
+ * @param string $class The classname which implements the protocol.
* @param int $flags Should be set to STREAM_IS_URL if
* protocol is a URL protocol. Default is 0, local
* stream.
* @throws StreamException
*
*/
-function stream_wrapper_register(string $protocol, string $classname, int $flags = 0): void
+function stream_wrapper_register(string $protocol, string $class, int $flags = 0): void
{
error_clear_last();
- $result = \stream_wrapper_register($protocol, $classname, $flags);
+ $result = \stream_wrapper_register($protocol, $class, $flags);
if ($result === false) {
throw StreamException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/strings.php b/vendor/thecodingmachine/safe/generated/strings.php
index 9bc728415..2aa72339c 100644
--- a/vendor/thecodingmachine/safe/generated/strings.php
+++ b/vendor/thecodingmachine/safe/generated/strings.php
@@ -7,39 +7,15 @@ use Safe\Exceptions\StringsException;
/**
* convert_uudecode decodes a uuencoded string.
*
- * @param string $data The uuencoded data.
+ * @param string $string The uuencoded data.
* @return string Returns the decoded data as a string.
* @throws StringsException
*
*/
-function convert_uudecode(string $data): string
+function convert_uudecode(string $string): string
{
error_clear_last();
- $result = \convert_uudecode($data);
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * convert_uuencode encodes a string using the uuencode
- * algorithm.
- *
- * Uuencode translates all strings (including binary data) into printable
- * characters, making them safe for network transmissions. Uuencoded data is
- * about 35% larger than the original.
- *
- * @param string $data The data to be encoded.
- * @return string Returns the uuencoded data.
- * @throws StringsException
- *
- */
-function convert_uuencode(string $data): string
-{
- error_clear_last();
- $result = \convert_uuencode($data);
+ $result = \convert_uudecode($string);
if ($result === false) {
throw StringsException::createFromPhpError();
}
@@ -50,15 +26,15 @@ function convert_uuencode(string $data): string
/**
* Decodes a hexadecimally encoded binary string.
*
- * @param string $data Hexadecimal representation of data.
+ * @param string $string Hexadecimal representation of data.
* @return string Returns the binary representation of the given data.
* @throws StringsException
*
*/
-function hex2bin(string $data): string
+function hex2bin(string $string): string
{
error_clear_last();
- $result = \hex2bin($data);
+ $result = \hex2bin($string);
if ($result === false) {
throw StringsException::createFromPhpError();
}
@@ -74,48 +50,16 @@ function hex2bin(string $data): string
* The hash is a 32-character hexadecimal number.
*
* @param string $filename The filename
- * @param bool $raw_output When TRUE, returns the digest in raw binary format with a length of
+ * @param bool $binary When TRUE, returns the digest in raw binary format with a length of
* 16.
* @return string Returns a string on success, FALSE otherwise.
* @throws StringsException
*
*/
-function md5_file(string $filename, bool $raw_output = false): string
-{
- error_clear_last();
- $result = \md5_file($filename, $raw_output);
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Calculates the metaphone key of str.
- *
- * Similar to soundex metaphone creates the same key for
- * similar sounding words. It's more accurate than
- * soundex as it knows the basic rules of English
- * pronunciation. The metaphone generated keys are of variable length.
- *
- * Metaphone was developed by Lawrence Philips
- * &lt;lphilips at verity dot com&gt;. It is described in ["Practical
- * Algorithms for Programmers", Binstock &amp; Rex, Addison Wesley,
- * 1995].
- *
- * @param string $str The input string.
- * @param int $phonemes This parameter restricts the returned metaphone key to
- * phonemes characters in length.
- * The default value of 0 means no restriction.
- * @return string Returns the metaphone key as a string.
- * @throws StringsException
- *
- */
-function metaphone(string $str, int $phonemes = 0): string
+function md5_file(string $filename, bool $binary = false): string
{
error_clear_last();
- $result = \metaphone($str, $phonemes);
+ $result = \md5_file($filename, $binary);
if ($result === false) {
throw StringsException::createFromPhpError();
}
@@ -127,718 +71,16 @@ function metaphone(string $str, int $phonemes = 0): string
*
*
* @param string $filename The filename of the file to hash.
- * @param bool $raw_output When TRUE, returns the digest in raw binary format with a length of
+ * @param bool $binary When TRUE, returns the digest in raw binary format with a length of
* 20.
* @return string Returns a string on success, FALSE otherwise.
* @throws StringsException
*
*/
-function sha1_file(string $filename, bool $raw_output = false): string
-{
- error_clear_last();
- $result = \sha1_file($filename, $raw_output);
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Calculates the soundex key of str.
- *
- * Soundex keys have the property that words pronounced similarly
- * produce the same soundex key, and can thus be used to simplify
- * searches in databases where you know the pronunciation but not
- * the spelling. This soundex function returns a string 4 characters
- * long, starting with a letter.
- *
- * This particular soundex function is one described by Donald Knuth
- * in "The Art Of Computer Programming, vol. 3: Sorting And
- * Searching", Addison-Wesley (1973), pp. 391-392.
- *
- * @param string $str The input string.
- * @return string Returns the soundex key as a string.
- * @throws StringsException
- *
- */
-function soundex(string $str): string
-{
- error_clear_last();
- $result = \soundex($str);
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Returns a string produced according to the formatting string
- * format.
- *
- * @param string $format The format string is composed of zero or more directives:
- * ordinary characters (excluding %) that are
- * copied directly to the result and conversion
- * specifications, each of which results in fetching its
- * own parameter.
- *
- * A conversion specification follows this prototype:
- * %[argnum$][flags][width][.precision]specifier.
- *
- * An integer followed by a dollar sign $,
- * to specify which number argument to treat in the conversion.
- *
- *
- * Flags
- *
- *
- *
- * Flag
- * Description
- *
- *
- *
- *
- * -
- *
- * Left-justify within the given field width;
- * Right justification is the default
- *
- *
- *
- * +
- *
- * Prefix positive numbers with a plus sign
- * +; Default only negative
- * are prefixed with a negative sign.
- *
- *
- *
- * (space)
- *
- * Pads the result with spaces.
- * This is the default.
- *
- *
- *
- * 0
- *
- * Only left-pads numbers with zeros.
- * With s specifiers this can
- * also right-pad with zeros.
- *
- *
- *
- * '(char)
- *
- * Pads the result with the character (char).
- *
- *
- *
- *
- *
- *
- * An integer that says how many characters (minimum)
- * this conversion should result in.
- *
- * A period . followed by an integer
- * who's meaning depends on the specifier:
- *
- *
- *
- * For e, E,
- * f and F
- * specifiers: this is the number of digits to be printed
- * after the decimal point (by default, this is 6).
- *
- *
- *
- *
- * For g and G
- * specifiers: this is the maximum number of significant
- * digits to be printed.
- *
- *
- *
- *
- * For s specifier: it acts as a cutoff point,
- * setting a maximum character limit to the string.
- *
- *
- *
- *
- *
- * If the period is specified without an explicit value for precision,
- * 0 is assumed.
- *
- *
- *
- *
- * Specifiers
- *
- *
- *
- * Specifier
- * Description
- *
- *
- *
- *
- * %
- *
- * A literal percent character. No argument is required.
- *
- *
- *
- * b
- *
- * The argument is treated as an integer and presented
- * as a binary number.
- *
- *
- *
- * c
- *
- * The argument is treated as an integer and presented
- * as the character with that ASCII.
- *
- *
- *
- * d
- *
- * The argument is treated as an integer and presented
- * as a (signed) decimal number.
- *
- *
- *
- * e
- *
- * The argument is treated as scientific notation (e.g. 1.2e+2).
- * The precision specifier stands for the number of digits after the
- * decimal point since PHP 5.2.1. In earlier versions, it was taken as
- * number of significant digits (one less).
- *
- *
- *
- * E
- *
- * Like the e specifier but uses
- * uppercase letter (e.g. 1.2E+2).
- *
- *
- *
- * f
- *
- * The argument is treated as a float and presented
- * as a floating-point number (locale aware).
- *
- *
- *
- * F
- *
- * The argument is treated as a float and presented
- * as a floating-point number (non-locale aware).
- * Available as of PHP 5.0.3.
- *
- *
- *
- * g
- *
- *
- * General format.
- *
- *
- * Let P equal the precision if nonzero, 6 if the precision is omitted,
- * or 1 if the precision is zero.
- * Then, if a conversion with style E would have an exponent of X:
- *
- *
- * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
- * Otherwise, the conversion is with style e and precision P − 1.
- *
- *
- *
- *
- * G
- *
- * Like the g specifier but uses
- * E and f.
- *
- *
- *
- * o
- *
- * The argument is treated as an integer and presented
- * as an octal number.
- *
- *
- *
- * s
- *
- * The argument is treated and presented as a string.
- *
- *
- *
- * u
- *
- * The argument is treated as an integer and presented
- * as an unsigned decimal number.
- *
- *
- *
- * x
- *
- * The argument is treated as an integer and presented
- * as a hexadecimal number (with lowercase letters).
- *
- *
- *
- * X
- *
- * The argument is treated as an integer and presented
- * as a hexadecimal number (with uppercase letters).
- *
- *
- *
- *
- *
- *
- * General format.
- *
- * Let P equal the precision if nonzero, 6 if the precision is omitted,
- * or 1 if the precision is zero.
- * Then, if a conversion with style E would have an exponent of X:
- *
- * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
- * Otherwise, the conversion is with style e and precision P − 1.
- *
- * The c type specifier ignores padding and width
- *
- * Attempting to use a combination of the string and width specifiers with character sets that require more than one byte per character may result in unexpected results
- *
- * Variables will be co-erced to a suitable type for the specifier:
- *
- * Type Handling
- *
- *
- *
- * Type
- * Specifiers
- *
- *
- *
- *
- * string
- * s
- *
- *
- * integer
- *
- * d,
- * u,
- * c,
- * o,
- * x,
- * X,
- * b
- *
- *
- *
- * double
- *
- * g,
- * G,
- * e,
- * E,
- * f,
- * F
- *
- *
- *
- *
- *
- * @param mixed $params
- * @return string Returns a string produced according to the formatting string
- * format.
- * @throws StringsException
- *
- */
-function sprintf(string $format, ...$params): string
-{
- error_clear_last();
- if ($params !== []) {
- $result = \sprintf($format, ...$params);
- } else {
- $result = \sprintf($format);
- }
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Returns the portion of string specified by the
- * start and length parameters.
- *
- * @param string $string The input string.
- * @param int $start If start is non-negative, the returned string
- * will start at the start'th position in
- * string, counting from zero. For instance,
- * in the string 'abcdef', the character at
- * position 0 is 'a', the
- * character at position 2 is
- * 'c', and so forth.
- *
- * If start is negative, the returned string
- * will start at the start'th character
- * from the end of string.
- *
- * If string is less than
- * start characters long, FALSE will be returned.
- *
- *
- * Using a negative start
- *
- *
- * ]]>
- *
- *
- * @param int $length If length is given and is positive, the string
- * returned will contain at most length characters
- * beginning from start (depending on the length of
- * string).
- *
- * If length is given and is negative, then that many
- * characters will be omitted from the end of string
- * (after the start position has been calculated when a
- * start is negative). If
- * start denotes the position of this truncation or
- * beyond, FALSE will be returned.
- *
- * If length is given and is 0,
- * FALSE or NULL, an empty string will be returned.
- *
- * If length is omitted, the substring starting from
- * start until the end of the string will be
- * returned.
- * @return string Returns the extracted part of string;, or
- * an empty string.
- * @throws StringsException
- *
- */
-function substr(string $string, int $start, int $length = null): string
-{
- error_clear_last();
- if ($length !== null) {
- $result = \substr($string, $start, $length);
- } else {
- $result = \substr($string, $start);
- }
- if ($result === false) {
- throw StringsException::createFromPhpError();
- }
- return $result;
-}
-
-
-/**
- * Operates as sprintf but accepts an array of
- * arguments, rather than a variable number of arguments.
- *
- * @param string $format The format string is composed of zero or more directives:
- * ordinary characters (excluding %) that are
- * copied directly to the result and conversion
- * specifications, each of which results in fetching its
- * own parameter.
- *
- * A conversion specification follows this prototype:
- * %[argnum$][flags][width][.precision]specifier.
- *
- * An integer followed by a dollar sign $,
- * to specify which number argument to treat in the conversion.
- *
- *
- * Flags
- *
- *
- *
- * Flag
- * Description
- *
- *
- *
- *
- * -
- *
- * Left-justify within the given field width;
- * Right justification is the default
- *
- *
- *
- * +
- *
- * Prefix positive numbers with a plus sign
- * +; Default only negative
- * are prefixed with a negative sign.
- *
- *
- *
- * (space)
- *
- * Pads the result with spaces.
- * This is the default.
- *
- *
- *
- * 0
- *
- * Only left-pads numbers with zeros.
- * With s specifiers this can
- * also right-pad with zeros.
- *
- *
- *
- * '(char)
- *
- * Pads the result with the character (char).
- *
- *
- *
- *
- *
- *
- * An integer that says how many characters (minimum)
- * this conversion should result in.
- *
- * A period . followed by an integer
- * who's meaning depends on the specifier:
- *
- *
- *
- * For e, E,
- * f and F
- * specifiers: this is the number of digits to be printed
- * after the decimal point (by default, this is 6).
- *
- *
- *
- *
- * For g and G
- * specifiers: this is the maximum number of significant
- * digits to be printed.
- *
- *
- *
- *
- * For s specifier: it acts as a cutoff point,
- * setting a maximum character limit to the string.
- *
- *
- *
- *
- *
- * If the period is specified without an explicit value for precision,
- * 0 is assumed.
- *
- *
- *
- *
- * Specifiers
- *
- *
- *
- * Specifier
- * Description
- *
- *
- *
- *
- * %
- *
- * A literal percent character. No argument is required.
- *
- *
- *
- * b
- *
- * The argument is treated as an integer and presented
- * as a binary number.
- *
- *
- *
- * c
- *
- * The argument is treated as an integer and presented
- * as the character with that ASCII.
- *
- *
- *
- * d
- *
- * The argument is treated as an integer and presented
- * as a (signed) decimal number.
- *
- *
- *
- * e
- *
- * The argument is treated as scientific notation (e.g. 1.2e+2).
- * The precision specifier stands for the number of digits after the
- * decimal point since PHP 5.2.1. In earlier versions, it was taken as
- * number of significant digits (one less).
- *
- *
- *
- * E
- *
- * Like the e specifier but uses
- * uppercase letter (e.g. 1.2E+2).
- *
- *
- *
- * f
- *
- * The argument is treated as a float and presented
- * as a floating-point number (locale aware).
- *
- *
- *
- * F
- *
- * The argument is treated as a float and presented
- * as a floating-point number (non-locale aware).
- * Available as of PHP 5.0.3.
- *
- *
- *
- * g
- *
- *
- * General format.
- *
- *
- * Let P equal the precision if nonzero, 6 if the precision is omitted,
- * or 1 if the precision is zero.
- * Then, if a conversion with style E would have an exponent of X:
- *
- *
- * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
- * Otherwise, the conversion is with style e and precision P − 1.
- *
- *
- *
- *
- * G
- *
- * Like the g specifier but uses
- * E and f.
- *
- *
- *
- * o
- *
- * The argument is treated as an integer and presented
- * as an octal number.
- *
- *
- *
- * s
- *
- * The argument is treated and presented as a string.
- *
- *
- *
- * u
- *
- * The argument is treated as an integer and presented
- * as an unsigned decimal number.
- *
- *
- *
- * x
- *
- * The argument is treated as an integer and presented
- * as a hexadecimal number (with lowercase letters).
- *
- *
- *
- * X
- *
- * The argument is treated as an integer and presented
- * as a hexadecimal number (with uppercase letters).
- *
- *
- *
- *
- *
- *
- * General format.
- *
- * Let P equal the precision if nonzero, 6 if the precision is omitted,
- * or 1 if the precision is zero.
- * Then, if a conversion with style E would have an exponent of X:
- *
- * If P &gt; X ≥ −4, the conversion is with style f and precision P − (X + 1).
- * Otherwise, the conversion is with style e and precision P − 1.
- *
- * The c type specifier ignores padding and width
- *
- * Attempting to use a combination of the string and width specifiers with character sets that require more than one byte per character may result in unexpected results
- *
- * Variables will be co-erced to a suitable type for the specifier:
- *
- * Type Handling
- *
- *
- *
- * Type
- * Specifiers
- *
- *
- *
- *
- * string
- * s
- *
- *
- * integer
- *
- * d,
- * u,
- * c,
- * o,
- * x,
- * X,
- * b
- *
- *
- *
- * double
- *
- * g,
- * G,
- * e,
- * E,
- * f,
- * F
- *
- *
- *
- *
- *
- * @param array $args
- * @return string Return array values as a formatted string according to
- * format.
- * @throws StringsException
- *
- */
-function vsprintf(string $format, array $args): string
+function sha1_file(string $filename, bool $binary = false): string
{
error_clear_last();
- $result = \vsprintf($format, $args);
+ $result = \sha1_file($filename, $binary);
if ($result === false) {
throw StringsException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/swoole.php b/vendor/thecodingmachine/safe/generated/swoole.php
index 334d96bd9..a9c3ff3e6 100644
--- a/vendor/thecodingmachine/safe/generated/swoole.php
+++ b/vendor/thecodingmachine/safe/generated/swoole.php
@@ -7,6 +7,46 @@ use Safe\Exceptions\SwooleException;
/**
*
*
+ * @param string $hostname The host name.
+ * @param callable $callback The host name.
+ *
+ * The IP address.
+ * @throws SwooleException
+ *
+ */
+function swoole_async_dns_lookup(string $hostname, callable $callback): void
+{
+ error_clear_last();
+ $result = \swoole_async_dns_lookup($hostname, $callback);
+ if ($result === false) {
+ throw SwooleException::createFromPhpError();
+ }
+}
+
+
+/**
+ *
+ *
+ * @param string $filename The filename of the file being read.
+ * @param string $callback The name of the file.
+ *
+ * The content read from the file.
+ * @throws SwooleException
+ *
+ */
+function swoole_async_readfile(string $filename, string $callback): void
+{
+ error_clear_last();
+ $result = \swoole_async_readfile($filename, $callback);
+ if ($result === false) {
+ throw SwooleException::createFromPhpError();
+ }
+}
+
+
+/**
+ *
+ *
* @param string $filename The filename being written.
* @param string $content The content writing to the file.
* @param int $offset The offset.
diff --git a/vendor/thecodingmachine/safe/generated/uodbc.php b/vendor/thecodingmachine/safe/generated/uodbc.php
index 89775c825..6ac914bdf 100644
--- a/vendor/thecodingmachine/safe/generated/uodbc.php
+++ b/vendor/thecodingmachine/safe/generated/uodbc.php
@@ -10,24 +10,24 @@ use Safe\Exceptions\UodbcException;
* By default, auto-commit is on for a connection. Disabling
* auto-commit is equivalent with starting a transaction.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
- * @param bool $OnOff If OnOff is TRUE, auto-commit is enabled, if
+ * @param bool $enable If enable is TRUE, auto-commit is enabled, if
* it is FALSE auto-commit is disabled.
- * @return mixed Without the OnOff parameter, this function returns
- * auto-commit status for connection_id. Non-zero is
+ * @return mixed Without the enable parameter, this function returns
+ * auto-commit status for odbc. Non-zero is
* returned if auto-commit is on, 0 if it is off, or FALSE if an error
* occurs.
*
- * If OnOff is set, this function returns TRUE on
+ * If enable is set, this function returns TRUE on
* success.
* @throws UodbcException
*
*/
-function odbc_autocommit($connection_id, bool $OnOff = false)
+function odbc_autocommit($odbc, bool $enable = false)
{
error_clear_last();
- $result = \odbc_autocommit($connection_id, $OnOff);
+ $result = \odbc_autocommit($odbc, $enable);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -103,9 +103,9 @@ function odbc_autocommit($connection_id, bool $OnOff = false)
* If odbc_result is used, passthru means that the data are
* sent directly to the client (i.e. printed).
*
- * @param int $result_id The result identifier.
+ * @param int $statement The result identifier.
*
- * If result_id is 0, the
+ * If statement is 0, the
* settings apply as default for new results.
* @param int $mode Possible values for mode are:
*
@@ -134,10 +134,10 @@ function odbc_autocommit($connection_id, bool $OnOff = false)
* @throws UodbcException
*
*/
-function odbc_binmode(int $result_id, int $mode): void
+function odbc_binmode(int $statement, int $mode): void
{
error_clear_last();
- $result = \odbc_binmode($result_id, $mode);
+ $result = \odbc_binmode($statement, $mode);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -147,18 +147,18 @@ function odbc_binmode(int $result_id, int $mode): void
/**
* Lists columns and associated privileges for the given table.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $table_name The table name.
+ * @param string $table The table name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $column_name The column name.
+ * @param string $column The column name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
@@ -181,10 +181,10 @@ function odbc_binmode(int $result_id, int $mode): void
* @throws UodbcException
*
*/
-function odbc_columnprivileges($connection_id, string $catalog, string $schema, string $table_name, string $column_name)
+function odbc_columnprivileges($odbc, string $catalog, string $schema, string $table, string $column)
{
error_clear_last();
- $result = \odbc_columnprivileges($connection_id, $catalog, $schema, $table_name, $column_name);
+ $result = \odbc_columnprivileges($odbc, $catalog, $schema, $table, $column);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -195,18 +195,18 @@ function odbc_columnprivileges($connection_id, string $catalog, string $schema,
/**
* Lists all columns in the requested range.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $table_name The table name.
+ * @param string $table The table name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $column_name The column name.
+ * @param string $column The column name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
@@ -237,19 +237,19 @@ function odbc_columnprivileges($connection_id, string $catalog, string $schema,
* @throws UodbcException
*
*/
-function odbc_columns($connection_id, string $catalog = null, string $schema = null, string $table_name = null, string $column_name = null)
+function odbc_columns($odbc, string $catalog = null, string $schema = null, string $table = null, string $column = null)
{
error_clear_last();
- if ($column_name !== null) {
- $result = \odbc_columns($connection_id, $catalog, $schema, $table_name, $column_name);
- } elseif ($table_name !== null) {
- $result = \odbc_columns($connection_id, $catalog, $schema, $table_name);
+ if ($column !== null) {
+ $result = \odbc_columns($odbc, $catalog, $schema, $table, $column);
+ } elseif ($table !== null) {
+ $result = \odbc_columns($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
- $result = \odbc_columns($connection_id, $catalog, $schema);
+ $result = \odbc_columns($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
- $result = \odbc_columns($connection_id, $catalog);
+ $result = \odbc_columns($odbc, $catalog);
} else {
- $result = \odbc_columns($connection_id);
+ $result = \odbc_columns($odbc);
}
if ($result === false) {
throw UodbcException::createFromPhpError();
@@ -261,15 +261,15 @@ function odbc_columns($connection_id, string $catalog = null, string $schema = n
/**
* Commits all pending transactions on the connection.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @throws UodbcException
*
*/
-function odbc_commit($connection_id): void
+function odbc_commit($odbc): void
{
error_clear_last();
- $result = \odbc_commit($connection_id);
+ $result = \odbc_commit($odbc);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -277,10 +277,72 @@ function odbc_commit($connection_id): void
/**
+ *
+ *
+ * @param string $dsn The database source name for the connection. Alternatively, a
+ * DSN-less connection string can be used.
+ * @param string $user The username.
+ * @param string $password The password.
+ * @param int $cursor_option This sets the type of cursor to be used
+ * for this connection. This parameter is not normally needed, but
+ * can be useful for working around problems with some ODBC drivers.
+ *
+ *
+ *
+ *
+ * SQL_CUR_USE_IF_NEEDED
+ *
+ *
+ *
+ *
+ * SQL_CUR_USE_ODBC
+ *
+ *
+ *
+ *
+ * SQL_CUR_USE_DRIVER
+ *
+ *
+ *
+ * @return resource Returns an ODBC connection.
+ * @throws UodbcException
+ *
+ */
+function odbc_connect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
+{
+ error_clear_last();
+ $result = \odbc_connect($dsn, $user, $password, $cursor_option);
+ if ($result === false) {
+ throw UodbcException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Gets the cursorname for the given result_id.
+ *
+ * @param resource $statement The result identifier.
+ * @return string Returns the cursor name, as a string.
+ * @throws UodbcException
+ *
+ */
+function odbc_cursor($statement): string
+{
+ error_clear_last();
+ $result = \odbc_cursor($statement);
+ if ($result === false) {
+ throw UodbcException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* This function will return the list of available DSN (after calling it
* several times).
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param int $fetch_type The fetch_type can be one of two constant types:
* SQL_FETCH_FIRST, SQL_FETCH_NEXT.
@@ -291,10 +353,10 @@ function odbc_commit($connection_id): void
* @throws UodbcException
*
*/
-function odbc_data_source($connection_id, int $fetch_type): array
+function odbc_data_source($odbc, int $fetch_type): array
{
error_clear_last();
- $result = \odbc_data_source($connection_id, $fetch_type);
+ $result = \odbc_data_source($odbc, $fetch_type);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -305,23 +367,18 @@ function odbc_data_source($connection_id, int $fetch_type): array
/**
* Sends an SQL statement to the database server.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
- * @param string $query_string The SQL statement.
- * @param int $flags This parameter is currently not used.
+ * @param string $query The SQL statement.
* @return resource Returns an ODBC result identifier if the SQL command was executed
* successfully.
* @throws UodbcException
*
*/
-function odbc_exec($connection_id, string $query_string, int $flags = null)
+function odbc_exec($odbc, string $query)
{
error_clear_last();
- if ($flags !== null) {
- $result = \odbc_exec($connection_id, $query_string, $flags);
- } else {
- $result = \odbc_exec($connection_id, $query_string);
- }
+ $result = \odbc_exec($odbc, $query);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -332,27 +389,23 @@ function odbc_exec($connection_id, string $query_string, int $flags = null)
/**
* Executes a statement prepared with odbc_prepare.
*
- * @param resource $result_id The result id resource, from odbc_prepare.
- * @param array $parameters_array Parameters in parameter_array will be
+ * @param resource $statement The result id resource, from odbc_prepare.
+ * @param array $params Parameters in params will be
* substituted for placeholders in the prepared statement in order.
* Elements of this array will be converted to strings by calling this
* function.
*
- * Any parameters in parameter_array which
+ * Any parameters in params which
* start and end with single quotes will be taken as the name of a
* file to read and send to the database server as the data for the
* appropriate placeholder.
* @throws UodbcException
*
*/
-function odbc_execute($result_id, array $parameters_array = null): void
+function odbc_execute($statement, array $params = []): void
{
error_clear_last();
- if ($parameters_array !== null) {
- $result = \odbc_execute($result_id, $parameters_array);
- } else {
- $result = \odbc_execute($result_id);
- }
+ $result = \odbc_execute($statement, $params);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -362,25 +415,21 @@ function odbc_execute($result_id, array $parameters_array = null): void
/**
* Fetch one result row into array.
*
- * @param resource $result_id The result resource.
- * @param array|null $result_array The result array
+ * @param resource $statement The result resource.
+ * @param array|null $array The result array
* that can be of any type since it will be converted to type
* array. The array will contain the column values starting at array
* index 0.
- * @param int $rownumber The row number.
+ * @param int $row The row number.
* @return int Returns the number of columns in the result;
* FALSE on error.
* @throws UodbcException
*
*/
-function odbc_fetch_into($result_id, ?array &$result_array, int $rownumber = null): int
+function odbc_fetch_into($statement, ?array &$array, int $row = 0): int
{
error_clear_last();
- if ($rownumber !== null) {
- $result = \odbc_fetch_into($result_id, $result_array, $rownumber);
- } else {
- $result = \odbc_fetch_into($result_id, $result_array);
- }
+ $result = \odbc_fetch_into($statement, $array, $row);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -392,16 +441,16 @@ function odbc_fetch_into($result_id, ?array &$result_array, int $rownumber = nul
* Gets the length of the field referenced by number in the given result
* identifier.
*
- * @param resource $result_id The result identifier.
- * @param int $field_number The field number. Field numbering starts at 1.
+ * @param resource $statement The result identifier.
+ * @param int $field The field number. Field numbering starts at 1.
* @return int Returns the field length.
* @throws UodbcException
*
*/
-function odbc_field_len($result_id, int $field_number): int
+function odbc_field_len($statement, int $field): int
{
error_clear_last();
- $result = \odbc_field_len($result_id, $field_number);
+ $result = \odbc_field_len($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -413,16 +462,16 @@ function odbc_field_len($result_id, int $field_number): int
* Gets the name of the field occupying the given column number in the given
* result identifier.
*
- * @param resource $result_id The result identifier.
- * @param int $field_number The field number. Field numbering starts at 1.
+ * @param resource $statement The result identifier.
+ * @param int $field The field number. Field numbering starts at 1.
* @return string Returns the field name as a string.
* @throws UodbcException
*
*/
-function odbc_field_name($result_id, int $field_number): string
+function odbc_field_name($statement, int $field): string
{
error_clear_last();
- $result = \odbc_field_name($result_id, $field_number);
+ $result = \odbc_field_name($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -434,17 +483,17 @@ function odbc_field_name($result_id, int $field_number): string
* Gets the number of the column slot that corresponds to the named field in
* the given result identifier.
*
- * @param resource $result_id The result identifier.
- * @param string $field_name The field name.
+ * @param resource $statement The result identifier.
+ * @param string $field The field name.
* @return int Returns the field number as a integer.
* Field numbering starts at 1.
* @throws UodbcException
*
*/
-function odbc_field_num($result_id, string $field_name): int
+function odbc_field_num($statement, string $field): int
{
error_clear_last();
- $result = \odbc_field_num($result_id, $field_name);
+ $result = \odbc_field_num($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -456,16 +505,16 @@ function odbc_field_num($result_id, string $field_name): int
* Gets the scale of the field referenced by number in the given result
* identifier.
*
- * @param resource $result_id The result identifier.
- * @param int $field_number The field number. Field numbering starts at 1.
+ * @param resource $statement The result identifier.
+ * @param int $field The field number. Field numbering starts at 1.
* @return int Returns the field scale as a integer.
* @throws UodbcException
*
*/
-function odbc_field_scale($result_id, int $field_number): int
+function odbc_field_scale($statement, int $field): int
{
error_clear_last();
- $result = \odbc_field_scale($result_id, $field_number);
+ $result = \odbc_field_scale($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -477,16 +526,16 @@ function odbc_field_scale($result_id, int $field_number): int
* Gets the SQL type of the field referenced by number in the given result
* identifier.
*
- * @param resource $result_id The result identifier.
- * @param int $field_number The field number. Field numbering starts at 1.
+ * @param resource $statement The result identifier.
+ * @param int $field The field number. Field numbering starts at 1.
* @return string Returns the field type as a string.
* @throws UodbcException
*
*/
-function odbc_field_type($result_id, int $field_number): string
+function odbc_field_type($statement, int $field): string
{
error_clear_last();
- $result = \odbc_field_type($result_id, $field_number);
+ $result = \odbc_field_type($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -499,7 +548,7 @@ function odbc_field_type($result_id, int $field_number): string
* foreign keys in other tables that refer to the primary key in the
* specified table
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $pk_catalog The catalog ('qualifier' in ODBC 2 parlance) of the primary key table.
* @param string $pk_schema The schema ('owner' in ODBC 2 parlance) of the primary key table.
@@ -530,10 +579,10 @@ function odbc_field_type($result_id, int $field_number): string
* @throws UodbcException
*
*/
-function odbc_foreignkeys($connection_id, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
+function odbc_foreignkeys($odbc, string $pk_catalog, string $pk_schema, string $pk_table, string $fk_catalog, string $fk_schema, string $fk_table)
{
error_clear_last();
- $result = \odbc_foreignkeys($connection_id, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
+ $result = \odbc_foreignkeys($odbc, $pk_catalog, $pk_schema, $pk_table, $fk_catalog, $fk_schema, $fk_table);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -544,7 +593,7 @@ function odbc_foreignkeys($connection_id, string $pk_catalog, string $pk_schema,
/**
* Retrieves information about data types supported by the data source.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param int $data_type The data type, which can be used to restrict the information to a
* single data type.
@@ -573,14 +622,10 @@ function odbc_foreignkeys($connection_id, string $pk_catalog, string $pk_schema,
* @throws UodbcException
*
*/
-function odbc_gettypeinfo($connection_id, int $data_type = null)
+function odbc_gettypeinfo($odbc, int $data_type = 0)
{
error_clear_last();
- if ($data_type !== null) {
- $result = \odbc_gettypeinfo($connection_id, $data_type);
- } else {
- $result = \odbc_gettypeinfo($connection_id);
- }
+ $result = \odbc_gettypeinfo($odbc, $data_type);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -593,17 +638,17 @@ function odbc_gettypeinfo($connection_id, int $data_type = null)
* The default length can be set using the
* uodbc.defaultlrl php.ini directive.
*
- * @param resource $result_id The result identifier.
+ * @param resource $statement The result identifier.
* @param int $length The number of bytes returned to PHP is controlled by the parameter
* length. If it is set to 0, long column data is passed through to the
* client (i.e. printed) when retrieved with odbc_result.
* @throws UodbcException
*
*/
-function odbc_longreadlen($result_id, int $length): void
+function odbc_longreadlen($statement, int $length): void
{
error_clear_last();
- $result = \odbc_longreadlen($result_id, $length);
+ $result = \odbc_longreadlen($statement, $length);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -611,6 +656,38 @@ function odbc_longreadlen($result_id, int $length): void
/**
+ * Opens a persistent database connection.
+ *
+ * This function is much like
+ * odbc_connect, except that the connection is
+ * not really closed when the script has finished. Future requests
+ * for a connection with the same dsn,
+ * user, password
+ * combination (via odbc_connect and
+ * odbc_pconnect) can reuse the persistent
+ * connection.
+ *
+ * @param string $dsn
+ * @param string $user
+ * @param string $password
+ * @param int $cursor_option
+ * @return resource Returns an ODBC connection.
+ * error.
+ * @throws UodbcException
+ *
+ */
+function odbc_pconnect(string $dsn, string $user, string $password, int $cursor_option = SQL_CUR_USE_DRIVER)
+{
+ error_clear_last();
+ $result = \odbc_pconnect($dsn, $user, $password, $cursor_option);
+ if ($result === false) {
+ throw UodbcException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Prepares a statement for execution. The result identifier can be used
* later to execute the statement with odbc_execute.
*
@@ -619,18 +696,18 @@ function odbc_longreadlen($result_id, int $length): void
* defined by the ODBC specification. However, the Unified ODBC driver
* currently only supports parameters of type IN to stored procedures.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
- * @param string $query_string The query string statement being prepared.
+ * @param string $query The query string statement being prepared.
* @return resource Returns an ODBC result identifier if the SQL command was prepared
* successfully.
* @throws UodbcException
*
*/
-function odbc_prepare($connection_id, string $query_string)
+function odbc_prepare($odbc, string $query)
{
error_clear_last();
- $result = \odbc_prepare($connection_id, $query_string);
+ $result = \odbc_prepare($odbc, $query);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -642,7 +719,7 @@ function odbc_prepare($connection_id, string $query_string)
* Returns a result identifier that can be used to fetch the column names
* that comprise the primary key for a table.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
@@ -662,10 +739,130 @@ function odbc_prepare($connection_id, string $query_string)
* @throws UodbcException
*
*/
-function odbc_primarykeys($connection_id, string $catalog, string $schema, string $table)
+function odbc_primarykeys($odbc, string $catalog, string $schema, string $table)
+{
+ error_clear_last();
+ $result = \odbc_primarykeys($odbc, $catalog, $schema, $table);
+ if ($result === false) {
+ throw UodbcException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Retrieve information about parameters to procedures.
+ *
+ * @param $odbc The ODBC connection identifier,
+ * see odbc_connect for details.
+ * @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
+ * @param string $schema The schema ('owner' in ODBC 2 parlance).
+ * This parameter accepts the following search patterns:
+ * % to match zero or more characters,
+ * and _ to match a single character.
+ * @param string $procedure The proc.
+ * This parameter accepts the following search patterns:
+ * % to match zero or more characters,
+ * and _ to match a single character.
+ * @param string $column The column.
+ * This parameter accepts the following search patterns:
+ * % to match zero or more characters,
+ * and _ to match a single character.
+ * @return resource Returns the list of input and output parameters, as well as the
+ * columns that make up the result set for the specified procedures.
+ * Returns an ODBC result identifier.
+ *
+ * The result set has the following columns:
+ *
+ * PROCEDURE_CAT
+ * PROCEDURE_SCHEM
+ * PROCEDURE_NAME
+ * COLUMN_NAME
+ * COLUMN_TYPE
+ * DATA_TYPE
+ * TYPE_NAME
+ * COLUMN_SIZE
+ * BUFFER_LENGTH
+ * DECIMAL_DIGITS
+ * NUM_PREC_RADIX
+ * NULLABLE
+ * REMARKS
+ * COLUMN_DEF
+ * SQL_DATA_TYPE
+ * SQL_DATETIME_SUB
+ * CHAR_OCTET_LENGTH
+ * ORDINAL_POSITION
+ * IS_NULLABLE
+ *
+ * Drivers can report additional columns.
+ * @throws UodbcException
+ *
+ */
+function odbc_procedurecolumns($odbc, string $catalog = null, string $schema = null, string $procedure = null, string $column = null)
{
error_clear_last();
- $result = \odbc_primarykeys($connection_id, $catalog, $schema, $table);
+ if ($column !== null) {
+ $result = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure, $column);
+ } elseif ($procedure !== null) {
+ $result = \odbc_procedurecolumns($odbc, $catalog, $schema, $procedure);
+ } elseif ($schema !== null) {
+ $result = \odbc_procedurecolumns($odbc, $catalog, $schema);
+ } elseif ($catalog !== null) {
+ $result = \odbc_procedurecolumns($odbc, $catalog);
+ } else {
+ $result = \odbc_procedurecolumns($odbc);
+ }
+ if ($result === false) {
+ throw UodbcException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Lists all procedures in the requested range.
+ *
+ * @param $odbc The ODBC connection identifier,
+ * see odbc_connect for details.
+ * @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
+ * @param string $schema The schema ('owner' in ODBC 2 parlance).
+ * This parameter accepts the following search patterns:
+ * % to match zero or more characters,
+ * and _ to match a single character.
+ * @param string $procedure The name.
+ * This parameter accepts the following search patterns:
+ * % to match zero or more characters,
+ * and _ to match a single character.
+ * @return resource Returns an ODBC
+ * result identifier containing the information.
+ *
+ * The result set has the following columns:
+ *
+ * PROCEDURE_CAT
+ * PROCEDURE_SCHEM
+ * PROCEDURE_NAME
+ * NUM_INPUT_PARAMS
+ * NUM_OUTPUT_PARAMS
+ * NUM_RESULT_SETS
+ * REMARKS
+ * PROCEDURE_TYPE
+ *
+ * Drivers can report additional columns.
+ * @throws UodbcException
+ *
+ */
+function odbc_procedures($odbc, string $catalog = null, string $schema = null, string $procedure = null)
+{
+ error_clear_last();
+ if ($procedure !== null) {
+ $result = \odbc_procedures($odbc, $catalog, $schema, $procedure);
+ } elseif ($schema !== null) {
+ $result = \odbc_procedures($odbc, $catalog, $schema);
+ } elseif ($catalog !== null) {
+ $result = \odbc_procedures($odbc, $catalog);
+ } else {
+ $result = \odbc_procedures($odbc);
+ }
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -681,20 +878,16 @@ function odbc_primarykeys($connection_id, string $catalog, string $schema, strin
* This function is not supposed to be used in production environments; it is
* merely meant for development purposes, to get a result set quickly rendered.
*
- * @param resource $result_id The result identifier.
+ * @param resource $statement The result identifier.
* @param string $format Additional overall table formatting.
* @return int Returns the number of rows in the result.
* @throws UodbcException
*
*/
-function odbc_result_all($result_id, string $format = null): int
+function odbc_result_all($statement, string $format = ""): int
{
error_clear_last();
- if ($format !== null) {
- $result = \odbc_result_all($result_id, $format);
- } else {
- $result = \odbc_result_all($result_id);
- }
+ $result = \odbc_result_all($statement, $format);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -705,7 +898,7 @@ function odbc_result_all($result_id, string $format = null): int
/**
* Get result data
*
- * @param resource $result_id The ODBC resource.
+ * @param resource $statement The ODBC resource.
* @param mixed $field The field name being retrieved. It can either be an integer containing
* the column number of the field you want; or it can be a string
* containing the name of the field.
@@ -714,10 +907,10 @@ function odbc_result_all($result_id, string $format = null): int
* @throws UodbcException
*
*/
-function odbc_result($result_id, $field)
+function odbc_result($statement, $field)
{
error_clear_last();
- $result = \odbc_result($result_id, $field);
+ $result = \odbc_result($statement, $field);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -728,15 +921,15 @@ function odbc_result($result_id, $field)
/**
* Rolls back all pending statements on the connection.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @throws UodbcException
*
*/
-function odbc_rollback($connection_id): void
+function odbc_rollback($odbc): void
{
error_clear_last();
- $result = \odbc_rollback($connection_id);
+ $result = \odbc_rollback($odbc);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -762,21 +955,21 @@ function odbc_rollback($connection_id): void
* to use a commercial product, that's all that really
* matters.
*
- * @param resource $id Is a connection id or result id on which to change the settings.
+ * @param resource $odbc Is a connection id or result id on which to change the settings.
* For SQLSetConnectOption(), this is a connection id.
* For SQLSetStmtOption(), this is a result id.
- * @param int $function Is the ODBC function to use. The value should be
+ * @param int $which Is the ODBC function to use. The value should be
* 1 for SQLSetConnectOption() and
* 2 for SQLSetStmtOption().
* @param int $option The option to set.
- * @param int $param The value for the given option.
+ * @param int $value The value for the given option.
* @throws UodbcException
*
*/
-function odbc_setoption($id, int $function, int $option, int $param): void
+function odbc_setoption($odbc, int $which, int $option, int $value): void
{
error_clear_last();
- $result = \odbc_setoption($id, $function, $option, $param);
+ $result = \odbc_setoption($odbc, $which, $option, $value);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -788,7 +981,7 @@ function odbc_setoption($id, int $function, int $option, int $param): void
* row in the table, or columns that are automatically updated when any
* value in the row is updated by a transaction.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param int $type
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
@@ -816,10 +1009,10 @@ function odbc_setoption($id, int $function, int $option, int $param): void
* @throws UodbcException
*
*/
-function odbc_specialcolumns($connection_id, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
+function odbc_specialcolumns($odbc, int $type, string $catalog, string $schema, string $table, int $scope, int $nullable)
{
error_clear_last();
- $result = \odbc_specialcolumns($connection_id, $type, $catalog, $schema, $table, $scope, $nullable);
+ $result = \odbc_specialcolumns($odbc, $type, $catalog, $schema, $table, $scope, $nullable);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -830,11 +1023,11 @@ function odbc_specialcolumns($connection_id, int $type, string $catalog, string
/**
* Get statistics about a table and its indexes.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
- * @param string $table_name The table name.
+ * @param string $table The table name.
* @param int $unique The type of the index.
* One of SQL_INDEX_UNIQUE or SQL_INDEX_ALL.
* @param int $accuracy One of SQL_ENSURE or SQL_QUICK.
@@ -862,10 +1055,10 @@ function odbc_specialcolumns($connection_id, int $type, string $catalog, string
* @throws UodbcException
*
*/
-function odbc_statistics($connection_id, string $catalog, string $schema, string $table_name, int $unique, int $accuracy)
+function odbc_statistics($odbc, string $catalog, string $schema, string $table, int $unique, int $accuracy)
{
error_clear_last();
- $result = \odbc_statistics($connection_id, $catalog, $schema, $table_name, $unique, $accuracy);
+ $result = \odbc_statistics($odbc, $catalog, $schema, $table, $unique, $accuracy);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -877,14 +1070,14 @@ function odbc_statistics($connection_id, string $catalog, string $schema, string
* Lists tables in the requested range and the privileges associated
* with each table.
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $name The name.
+ * @param string $table The name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
@@ -904,10 +1097,10 @@ function odbc_statistics($connection_id, string $catalog, string $schema, string
* @throws UodbcException
*
*/
-function odbc_tableprivileges($connection_id, string $catalog, string $schema, string $name)
+function odbc_tableprivileges($odbc, string $catalog, string $schema, string $table)
{
error_clear_last();
- $result = \odbc_tableprivileges($connection_id, $catalog, $schema, $name);
+ $result = \odbc_tableprivileges($odbc, $catalog, $schema, $table);
if ($result === false) {
throw UodbcException::createFromPhpError();
}
@@ -921,14 +1114,14 @@ function odbc_tableprivileges($connection_id, string $catalog, string $schema, s
* To support enumeration of qualifiers, owners, and table types,
* the following special semantics for the
* catalog, schema,
- * name, and
+ * table, and
* table_type are available:
*
*
*
* If catalog is a single percent
* character (%) and schema and
- * name are empty strings, then the result
+ * table are empty strings, then the result
* set contains a list of valid qualifiers for the data
* source. (All columns except the TABLE_QUALIFIER column contain
* NULLs.)
@@ -938,7 +1131,7 @@ function odbc_tableprivileges($connection_id, string $catalog, string $schema, s
*
* If schema is a single percent character
* (%) and catalog and
- * name are empty strings, then the result
+ * table are empty strings, then the result
* set contains a list of valid owners for the data source. (All
* columns except the TABLE_OWNER column contain
* NULLs.)
@@ -948,7 +1141,7 @@ function odbc_tableprivileges($connection_id, string $catalog, string $schema, s
*
* If table_type is a single percent
* character (%) and catalog,
- * schema and name
+ * schema and table
* are empty strings, then the result set contains a list of
* valid table types for the data source. (All columns except the
* TABLE_TYPE column contain NULLs.)
@@ -956,14 +1149,14 @@ function odbc_tableprivileges($connection_id, string $catalog, string $schema, s
*
*
*
- * @param resource $connection_id The ODBC connection identifier,
+ * @param resource $odbc The ODBC connection identifier,
* see odbc_connect for details.
* @param string $catalog The catalog ('qualifier' in ODBC 2 parlance).
* @param string $schema The schema ('owner' in ODBC 2 parlance).
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
- * @param string $name The name.
+ * @param string $table The name.
* This parameter accepts the following search patterns:
* % to match zero or more characters,
* and _ to match a single character.
@@ -988,19 +1181,19 @@ function odbc_tableprivileges($connection_id, string $catalog, string $schema, s
* @throws UodbcException
*
*/
-function odbc_tables($connection_id, string $catalog = null, string $schema = null, string $name = null, string $types = null)
+function odbc_tables($odbc, string $catalog = null, string $schema = null, string $table = null, string $types = null)
{
error_clear_last();
if ($types !== null) {
- $result = \odbc_tables($connection_id, $catalog, $schema, $name, $types);
- } elseif ($name !== null) {
- $result = \odbc_tables($connection_id, $catalog, $schema, $name);
+ $result = \odbc_tables($odbc, $catalog, $schema, $table, $types);
+ } elseif ($table !== null) {
+ $result = \odbc_tables($odbc, $catalog, $schema, $table);
} elseif ($schema !== null) {
- $result = \odbc_tables($connection_id, $catalog, $schema);
+ $result = \odbc_tables($odbc, $catalog, $schema);
} elseif ($catalog !== null) {
- $result = \odbc_tables($connection_id, $catalog);
+ $result = \odbc_tables($odbc, $catalog);
} else {
- $result = \odbc_tables($connection_id);
+ $result = \odbc_tables($odbc);
}
if ($result === false) {
throw UodbcException::createFromPhpError();
diff --git a/vendor/thecodingmachine/safe/generated/url.php b/vendor/thecodingmachine/safe/generated/url.php
index 56c08b551..5871e6dc6 100644
--- a/vendor/thecodingmachine/safe/generated/url.php
+++ b/vendor/thecodingmachine/safe/generated/url.php
@@ -5,9 +5,9 @@ namespace Safe;
use Safe\Exceptions\UrlException;
/**
- * Decodes a base64 encoded data.
+ * Decodes a base64 encoded string.
*
- * @param string $data The encoded data.
+ * @param string $string The encoded data.
* @param bool $strict If the strict parameter is set to TRUE
* then the base64_decode function will return
* FALSE if the input contains character from outside the base64
@@ -17,10 +17,10 @@ use Safe\Exceptions\UrlException;
* @throws UrlException
*
*/
-function base64_decode(string $data, bool $strict = false): string
+function base64_decode(string $string, bool $strict = false): string
{
error_clear_last();
- $result = \base64_decode($data, $strict);
+ $result = \base64_decode($string, $strict);
if ($result === false) {
throw UrlException::createFromPhpError();
}
@@ -33,22 +33,23 @@ function base64_decode(string $data, bool $strict = false): string
* by the server in response to a HTTP request.
*
* @param string $url The target URL.
- * @param int $format If the optional format parameter is set to non-zero,
+ * @param bool $associative If the optional associative parameter is set to true,
* get_headers parses the response and sets the
* array's keys.
* @param resource $context A valid context resource created with
- * stream_context_create.
+ * stream_context_create, or NULL to use the
+ * default context.
* @return array Returns an indexed or associative array with the headers.
* @throws UrlException
*
*/
-function get_headers(string $url, int $format = 0, $context = null): array
+function get_headers(string $url, bool $associative = false, $context = null): array
{
error_clear_last();
if ($context !== null) {
- $result = \get_headers($url, $format, $context);
+ $result = \get_headers($url, $associative, $context);
} else {
- $result = \get_headers($url, $format);
+ $result = \get_headers($url, $associative);
}
if ($result === false) {
throw UrlException::createFromPhpError();
@@ -58,17 +59,63 @@ function get_headers(string $url, int $format = 0, $context = null): array
/**
+ * Opens filename and parses it line by line for
+ * &lt;meta&gt; tags in the file. The parsing stops at
+ * &lt;/head&gt;.
+ *
+ * @param string $filename The path to the HTML file, as a string. This can be a local file or an
+ * URL.
+ *
+ *
+ * What get_meta_tags parses
+ *
+ *
+ *
+ *
+ *
+ *
+ * ]]>
+ *
+ *
+ * @param bool $use_include_path Setting use_include_path to TRUE will result
+ * in PHP trying to open the file along the standard include path as per
+ * the include_path directive.
+ * This is used for local files, not URLs.
+ * @return array Returns an array with all the parsed meta tags.
+ *
+ * The value of the name property becomes the key, the value of the content
+ * property becomes the value of the returned array, so you can easily use
+ * standard array functions to traverse it or access single values.
+ * Special characters in the value of the name property are substituted with
+ * '_', the rest is converted to lower case. If two meta tags have the same
+ * name, only the last one is returned.
+ *
+ * Returns FALSE on failure.
+ * @throws UrlException
+ *
+ */
+function get_meta_tags(string $filename, bool $use_include_path = false): array
+{
+ error_clear_last();
+ $result = \get_meta_tags($filename, $use_include_path);
+ if ($result === false) {
+ throw UrlException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* This function parses a URL and returns an associative array containing any
* of the various components of the URL that are present.
* The values of the array elements are not URL decoded.
*
* This function is not meant to validate
- * the given URL, it only breaks it up into the above listed parts. Partial
+ * the given URL, it only breaks it up into the parts listed below. Partial and invalid
* URLs are also accepted, parse_url tries its best to
* parse them correctly.
*
- * @param string $url The URL to parse. Invalid characters are replaced by
- * _.
+ * @param string $url The URL to parse.
* @param int $component Specify one of PHP_URL_SCHEME,
* PHP_URL_HOST, PHP_URL_PORT,
* PHP_URL_USER, PHP_URL_PASS,
@@ -76,8 +123,8 @@ function get_headers(string $url, int $format = 0, $context = null): array
* or PHP_URL_FRAGMENT to retrieve just a specific
* URL component as a string (except when
* PHP_URL_PORT is given, in which case the return
- * value will be an integer).
- * @return mixed On seriously malformed URLs, parse_url.
+ * value will be an int).
+ * @return array|int|string|null On seriously malformed URLs, parse_url.
*
* If the component parameter is omitted, an
* associative array is returned. At least one element will be
@@ -127,9 +174,22 @@ function get_headers(string $url, int $format = 0, $context = null): array
*
* If the component parameter is specified,
* parse_url returns a string (or an
- * integer, in the case of PHP_URL_PORT)
+ * int, in the case of PHP_URL_PORT)
* instead of an array. If the requested component doesn't exist
* within the given URL, NULL will be returned.
+ * As of PHP 8.0.0, parse_url distinguishes absent and empty
+ * queries and fragments:
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * Previously all cases resulted in query and fragment being NULL.
+ *
+ * Note that control characters (cf. ctype_cntrl) in the
+ * components are replaced with underscores (_).
* @throws UrlException
*
*/
diff --git a/vendor/thecodingmachine/safe/generated/xml.php b/vendor/thecodingmachine/safe/generated/xml.php
index 4f9f6606c..6f2679dd6 100644
--- a/vendor/thecodingmachine/safe/generated/xml.php
+++ b/vendor/thecodingmachine/safe/generated/xml.php
@@ -5,72 +5,449 @@ namespace Safe;
use Safe\Exceptions\XmlException;
/**
- * xml_parser_create_ns creates a new XML parser
- * with XML namespace support and returns a resource handle referencing
- * it to be used by the other XML functions.
- *
- * @param string $encoding The input encoding is automatically detected, so that the
- * encoding parameter specifies only the output
- * encoding. In PHP 5.0.0 and 5.0.1, the default output charset is
- * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported
- * encodings are ISO-8859-1, UTF-8 and
- * US-ASCII.
- * @param string $separator With a namespace aware parser tag parameters passed to the various
- * handler functions will consist of namespace and tag name separated by
- * the string specified in separator.
- * @return resource Returns a resource handle for the new XML parser.
+ * Frees the given XML parser.
+ *
+ * @param resource $parser
* @throws XmlException
*
*/
-function xml_parser_create_ns(string $encoding = null, string $separator = ":")
+function xml_parser_free($parser): void
{
error_clear_last();
- if ($separator !== ":") {
- $result = \xml_parser_create_ns($encoding, $separator);
- } elseif ($encoding !== null) {
- $result = \xml_parser_create_ns($encoding);
- } else {
- $result = \xml_parser_create_ns();
+ $result = \xml_parser_free($parser);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
}
+}
+
+
+/**
+ * Sets the character data handler function for the XML parser
+ * parser.
+ *
+ * @param resource $parser A reference to the XML parser to set up character data handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * two parameters:
+ *
+ * handler
+ * XMLParserparser
+ * stringdata
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * data
+ *
+ *
+ * The second parameter, data, contains
+ * the character data as a string.
+ *
+ *
+ *
+ *
+ *
+ * Character data handler is called for every piece of a text in the XML
+ * document. It can be called multiple times inside each fragment (e.g.
+ * for non-ASCII strings).
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_character_data_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_character_data_handler($parser, $handler);
if ($result === false) {
throw XmlException::createFromPhpError();
}
- return $result;
}
/**
- * xml_parser_create creates a new XML parser
- * and returns a resource handle referencing it to be used by the
- * other XML functions.
- *
- * @param string $encoding The optional encoding specifies the character
- * encoding for the input/output in PHP 4. Starting from PHP 5, the input
- * encoding is automatically detected, so that the
- * encoding parameter specifies only the output
- * encoding. In PHP 4, the default output encoding is the same as the
- * input charset. If empty string is passed, the parser attempts to identify
- * which encoding the document is encoded in by looking at the heading 3 or
- * 4 bytes. In PHP 5.0.0 and 5.0.1, the default output charset is
- * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported
- * encodings are ISO-8859-1, UTF-8 and
- * US-ASCII.
- * @return resource Returns a resource handle for the new XML parser.
+ * Sets the default handler function for the XML parser
+ * parser.
+ *
+ * @param resource $parser A reference to the XML parser to set up default handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * two parameters:
+ *
+ * handler
+ * XMLParserparser
+ * stringdata
+ *
+ *
+ *
+ *
+ * parser
+ *
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ *
+ * data
+ *
+ *
+ *
+ * The second parameter, data, contains
+ * the character data.This may be the XML declaration,
+ * document type declaration, entities or other data for which
+ * no other handler exists.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
* @throws XmlException
*
*/
-function xml_parser_create(string $encoding = null)
+function xml_set_default_handler($parser, callable $handler): void
{
error_clear_last();
- if ($encoding !== null) {
- $result = \xml_parser_create($encoding);
- } else {
- $result = \xml_parser_create();
+ $result = \xml_set_default_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
}
+}
+
+
+/**
+ * Sets the element handler functions for the XML parser.
+ * start_handler and
+ * end_handler are strings containing
+ * the names of functions that must exist when xml_parse
+ * is called for parser.
+ *
+ * @param resource $parser A reference to the XML parser to set up start and end element handler functions.
+ * @param callable $start_handler The function named by start_handler
+ * must accept three parameters:
+ *
+ * start_element_handler
+ * XMLParserparser
+ * stringname
+ * arrayattribs
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * name
+ *
+ *
+ * The second parameter, name, contains the name
+ * of the element for which this handler is called.If case-folding is in effect for this
+ * parser, the element name will be in uppercase letters.
+ *
+ *
+ *
+ *
+ * attribs
+ *
+ *
+ * The third parameter, attribs, contains an
+ * associative array with the element's attributes (if any).The keys
+ * of this array are the attribute names, the values are the attribute
+ * values.Attribute names are case-folded on the same criteria as
+ * element names.Attribute values are not
+ * case-folded.
+ *
+ *
+ * The original order of the attributes can be retrieved by walking
+ * through attribs the normal way, using
+ * each.The first key in the array was the first
+ * attribute, and so on.
+ *
+ *
+ *
+ *
+ * @param callable $end_handler
+ * @throws XmlException
+ *
+ */
+function xml_set_element_handler($parser, callable $start_handler, callable $end_handler): void
+{
+ error_clear_last();
+ $result = \xml_set_element_handler($parser, $start_handler, $end_handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Set a handler to be called when leaving the scope of a namespace
+ * declaration. This will be called, for each namespace declaration, after
+ * the handler for the end tag of the element in which the namespace was
+ * declared.
+ *
+ * @param resource $parser A reference to the XML parser.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * two parameters, and should return an integer value. If the
+ * value returned from the handler is FALSE (which it will be if no
+ * value is returned), the XML parser will stop parsing and
+ * xml_get_error_code will return
+ * XML_ERROR_EXTERNAL_ENTITY_HANDLING.
+ *
+ * handler
+ * XMLParserparser
+ * stringprefix
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * prefix
+ *
+ *
+ * The prefix is a string used to reference the namespace within an XML object.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_end_namespace_decl_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_end_namespace_decl_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Sets the external entity reference handler function for the XML parser
+ * parser.
+ *
+ * @param resource $parser A reference to the XML parser to set up external entity reference handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * five parameters, and should return an integer value.If the
+ * value returned from the handler is FALSE (which it will be if no
+ * value is returned), the XML parser will stop parsing and
+ * xml_get_error_code will return
+ * XML_ERROR_EXTERNAL_ENTITY_HANDLING.
+ *
+ * handler
+ * XMLParserparser
+ * stringopen_entity_names
+ * stringbase
+ * stringsystem_id
+ * stringpublic_id
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * open_entity_names
+ *
+ *
+ * The second parameter, open_entity_names, is a
+ * space-separated list of the names of the entities that are open for
+ * the parse of this entity (including the name of the referenced
+ * entity).
+ *
+ *
+ *
+ *
+ * base
+ *
+ *
+ * This is the base for resolving the system identifier
+ * (system_id) of the external entity.Currently
+ * this parameter will always be set to an empty string.
+ *
+ *
+ *
+ *
+ * system_id
+ *
+ *
+ * The fourth parameter, system_id, is the
+ * system identifier as specified in the entity declaration.
+ *
+ *
+ *
+ *
+ * public_id
+ *
+ *
+ * The fifth parameter, public_id, is the
+ * public identifier as specified in the entity declaration, or
+ * an empty string if none was specified; the whitespace in the
+ * public identifier will have been normalized as required by
+ * the XML spec.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_external_entity_ref_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_external_entity_ref_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Sets the notation declaration handler function for the XML parser
+ * parser.
+ *
+ * A notation declaration is part of the document's DTD and has the
+ * following format:
+ *
+ * name
+ * { systemId | publicId?>
+ * ]]>
+ *
+ * See section 4.7 of the XML 1.0
+ * spec for the definition of notation declarations.
+ *
+ * @param resource $parser A reference to the XML parser to set up notation declaration handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * five parameters:
+ *
+ * handler
+ * XMLParserparser
+ * stringnotation_name
+ * stringbase
+ * stringsystem_id
+ * stringpublic_id
+ *
+ *
+ *
+ *
+ * parser
+ *
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * notation_name
+ *
+ *
+ * This is the notation's name, as per
+ * the notation format described above.
+ *
+ *
+ *
+ *
+ *
+ * base
+ *
+ *
+ *
+ * This is the base for resolving the system identifier
+ * (system_id) of the notation declaration.
+ * Currently this parameter will always be set to an empty string.
+ *
+ *
+ *
+ *
+ * system_id
+ *
+ *
+ * System identifier of the external notation declaration.
+ *
+ *
+ *
+ *
+ *
+ * public_id
+ *
+ *
+ *
+ * Public identifier of the external notation declaration.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_notation_decl_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_notation_decl_handler($parser, $handler);
if ($result === false) {
throw XmlException::createFromPhpError();
}
- return $result;
}
@@ -85,7 +462,7 @@ function xml_parser_create(string $encoding = null)
* @throws XmlException
*
*/
-function xml_set_object($parser, object &$object): void
+function xml_set_object($parser, object $object): void
{
error_clear_last();
$result = \xml_set_object($parser, $object);
@@ -93,3 +470,247 @@ function xml_set_object($parser, object &$object): void
throw XmlException::createFromPhpError();
}
}
+
+
+/**
+ * Sets the processing instruction (PI) handler function for the XML parser
+ * parser.
+ *
+ * A processing instruction has the following format:
+ *
+ * &lt;?target
+ * data?&gt;
+ *
+ *
+ * You can put PHP code into such a tag, but be aware of one limitation: in
+ * an XML PI, the PI end tag (?&gt;) can not be quoted,
+ * so this character sequence should not appear in the PHP code you embed
+ * with PIs in XML documents.If it does, the rest of the PHP code, as well
+ * as the "real" PI end tag, will be treated as character data.
+ *
+ * @param resource $parser A reference to the XML parser to set up processing instruction (PI) handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * three parameters:
+ *
+ * handler
+ * XMLParserparser
+ * stringtarget
+ * stringdata
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * target
+ *
+ *
+ * The second parameter, target, contains the PI
+ * target.
+ *
+ *
+ *
+ *
+ * data
+ *
+ *
+ * The third parameter, data, contains the PI
+ * data.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_processing_instruction_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_processing_instruction_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Set a handler to be called when a namespace is declared. Namespace
+ * declarations occur inside start tags. But the namespace declaration start
+ * handler is called before the start tag handler for each namespace declared
+ * in that start tag.
+ *
+ * @param resource $parser A reference to the XML parser.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept
+ * three parameters, and should return an integer value. If the
+ * value returned from the handler is FALSE (which it will be if no
+ * value is returned), the XML parser will stop parsing and
+ * xml_get_error_code will return
+ * XML_ERROR_EXTERNAL_ENTITY_HANDLING.
+ *
+ * handler
+ * XMLParserparser
+ * stringprefix
+ * stringuri
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the handler.
+ *
+ *
+ *
+ *
+ * prefix
+ *
+ *
+ * The prefix is a string used to reference the namespace within an XML object.
+ *
+ *
+ *
+ *
+ * uri
+ *
+ *
+ * Uniform Resource Identifier (URI) of namespace.
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_start_namespace_decl_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_start_namespace_decl_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
+
+
+/**
+ * Sets the unparsed entity declaration handler function for the XML parser
+ * parser.
+ *
+ * The handler will be called if the XML parser
+ * encounters an external entity declaration with an NDATA declaration, like
+ * the following:
+ *
+ * name {publicId | systemId}
+ * NDATA notationName
+ * ]]>
+ *
+ *
+ * See section 4.2.2 of
+ * the XML 1.0 spec for the definition of notation declared
+ * external entities.
+ *
+ * @param resource $parser A reference to the XML parser to set up unparsed entity declaration handler function.
+ * @param callable $handler handler is a string containing the name of a
+ * function that must exist when xml_parse is called
+ * for parser.
+ *
+ * The function named by handler must accept six
+ * parameters:
+ *
+ * handler
+ * XMLParserparser
+ * stringentity_name
+ * stringbase
+ * stringsystem_id
+ * stringpublic_id
+ * stringnotation_name
+ *
+ *
+ *
+ * parser
+ *
+ *
+ * The first parameter, parser, is a
+ * reference to the XML parser calling the
+ * handler.
+ *
+ *
+ *
+ *
+ * entity_name
+ *
+ *
+ * The name of the entity that is about to be defined.
+ *
+ *
+ *
+ *
+ * base
+ *
+ *
+ * This is the base for resolving the system identifier
+ * (systemId) of the external entity.Currently
+ * this parameter will always be set to an empty string.
+ *
+ *
+ *
+ *
+ * system_id
+ *
+ *
+ * System identifier for the external entity.
+ *
+ *
+ *
+ *
+ * public_id
+ *
+ *
+ * Public identifier for the external entity.
+ *
+ *
+ *
+ *
+ * notation_name
+ *
+ *
+ * Name of the notation of this entity (see
+ * xml_set_notation_decl_handler).
+ *
+ *
+ *
+ *
+ *
+ * If a handler function is set to an empty string, or FALSE, the handler
+ * in question is disabled.
+ * @throws XmlException
+ *
+ */
+function xml_set_unparsed_entity_decl_handler($parser, callable $handler): void
+{
+ error_clear_last();
+ $result = \xml_set_unparsed_entity_decl_handler($parser, $handler);
+ if ($result === false) {
+ throw XmlException::createFromPhpError();
+ }
+}
diff --git a/vendor/thecodingmachine/safe/generated/yaml.php b/vendor/thecodingmachine/safe/generated/yaml.php
index 38daaf759..fd297aad5 100644
--- a/vendor/thecodingmachine/safe/generated/yaml.php
+++ b/vendor/thecodingmachine/safe/generated/yaml.php
@@ -26,7 +26,11 @@ use Safe\Exceptions\YamlException;
function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, array $callbacks = null)
{
error_clear_last();
- $result = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
+ if ($callbacks !== null) {
+ $result = \yaml_parse_file($filename, $pos, $ndocs, $callbacks);
+ } else {
+ $result = \yaml_parse_file($filename, $pos, $ndocs);
+ }
if ($result === false) {
throw YamlException::createFromPhpError();
}
@@ -59,7 +63,11 @@ function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ar
function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, array $callbacks = null)
{
error_clear_last();
- $result = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
+ if ($callbacks !== null) {
+ $result = \yaml_parse_url($url, $pos, $ndocs, $callbacks);
+ } else {
+ $result = \yaml_parse_url($url, $pos, $ndocs);
+ }
if ($result === false) {
throw YamlException::createFromPhpError();
}
@@ -89,7 +97,11 @@ function yaml_parse_url(string $url, int $pos = 0, ?int &$ndocs = null, array $c
function yaml_parse(string $input, int $pos = 0, ?int &$ndocs = null, array $callbacks = null)
{
error_clear_last();
- $result = \yaml_parse($input, $pos, $ndocs, $callbacks);
+ if ($callbacks !== null) {
+ $result = \yaml_parse($input, $pos, $ndocs, $callbacks);
+ } else {
+ $result = \yaml_parse($input, $pos, $ndocs);
+ }
if ($result === false) {
throw YamlException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/zip.php b/vendor/thecodingmachine/safe/generated/zip.php
index 8fd22bb9a..d4097eb16 100644
--- a/vendor/thecodingmachine/safe/generated/zip.php
+++ b/vendor/thecodingmachine/safe/generated/zip.php
@@ -22,9 +22,86 @@ function zip_entry_close($zip_entry): void
/**
+ * Returns the compressed size of the specified directory entry.
+ *
+ * @param resource $zip_entry A directory entry returned by zip_read.
+ * @return int The compressed size.
+ * @throws ZipException
+ *
+ */
+function zip_entry_compressedsize($zip_entry): int
+{
+ error_clear_last();
+ $result = \zip_entry_compressedsize($zip_entry);
+ if ($result === false) {
+ throw ZipException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the compression method of the directory entry specified
+ * by zip_entry.
+ *
+ * @param resource $zip_entry A directory entry returned by zip_read.
+ * @return string The compression method.
+ * @throws ZipException
+ *
+ */
+function zip_entry_compressionmethod($zip_entry): string
+{
+ error_clear_last();
+ $result = \zip_entry_compressionmethod($zip_entry);
+ if ($result === false) {
+ throw ZipException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the actual size of the specified directory entry.
+ *
+ * @param resource $zip_entry A directory entry returned by zip_read.
+ * @return int The size of the directory entry.
+ * @throws ZipException
+ *
+ */
+function zip_entry_filesize($zip_entry): int
+{
+ error_clear_last();
+ $result = \zip_entry_filesize($zip_entry);
+ if ($result === false) {
+ throw ZipException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Returns the name of the specified directory entry.
+ *
+ * @param resource $zip_entry A directory entry returned by zip_read.
+ * @return string The name of the directory entry.
+ * @throws ZipException
+ *
+ */
+function zip_entry_name($zip_entry): string
+{
+ error_clear_last();
+ $result = \zip_entry_name($zip_entry);
+ if ($result === false) {
+ throw ZipException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
* Opens a directory entry in a zip file for reading.
*
- * @param resource $zip A valid resource handle returned by zip_open.
+ * @param resource $zip_dp A valid resource handle returned by zip_open.
* @param resource $zip_entry A directory entry returned by zip_read.
* @param string $mode Any of the modes specified in the documentation of
* fopen.
@@ -35,14 +112,10 @@ function zip_entry_close($zip_entry): void
* @throws ZipException
*
*/
-function zip_entry_open($zip, $zip_entry, string $mode = null): void
+function zip_entry_open($zip_dp, $zip_entry, string $mode = "rb"): void
{
error_clear_last();
- if ($mode !== null) {
- $result = \zip_entry_open($zip, $zip_entry, $mode);
- } else {
- $result = \zip_entry_open($zip, $zip_entry);
- }
+ $result = \zip_entry_open($zip_dp, $zip_entry, $mode);
if ($result === false) {
throw ZipException::createFromPhpError();
}
@@ -53,17 +126,17 @@ function zip_entry_open($zip, $zip_entry, string $mode = null): void
* Reads from an open directory entry.
*
* @param resource $zip_entry A directory entry returned by zip_read.
- * @param int $length The number of bytes to return.
+ * @param int $len The number of bytes to return.
*
* This should be the uncompressed length you wish to read.
* @return string Returns the data read, empty string on end of a file.
* @throws ZipException
*
*/
-function zip_entry_read($zip_entry, int $length = 1024): string
+function zip_entry_read($zip_entry, int $len = 1024): string
{
error_clear_last();
- $result = \zip_entry_read($zip_entry, $length);
+ $result = \zip_entry_read($zip_entry, $len);
if ($result === false) {
throw ZipException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/generated/zlib.php b/vendor/thecodingmachine/safe/generated/zlib.php
index 4dc3ca94f..c365525e8 100644
--- a/vendor/thecodingmachine/safe/generated/zlib.php
+++ b/vendor/thecodingmachine/safe/generated/zlib.php
@@ -71,7 +71,11 @@ function deflate_add($context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH):
* window
*
*
- * The zlib window size (logarithmic) in range 8..15; defaults to 15.
+ * The zlib window size (logarithmic) in range 8..15;
+ * defaults to 15.
+ * zlib changes a window size of 8 to 9,
+ * and as of zlib 1.2.8 fails with a warning, if a window size of 8
+ * is requested for ZLIB_ENCODING_RAW or ZLIB_ENCODING_GZIP.
*
*
*
@@ -101,7 +105,11 @@ function deflate_add($context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH):
*
* The compression memory level in range 1..9; defaults to 8.
*
- * The zlib window size (logarithmic) in range 8..15; defaults to 15.
+ * The zlib window size (logarithmic) in range 8..15;
+ * defaults to 15.
+ * zlib changes a window size of 8 to 9,
+ * and as of zlib 1.2.8 fails with a warning, if a window size of 8
+ * is requested for ZLIB_ENCODING_RAW or ZLIB_ENCODING_GZIP.
*
* One of ZLIB_FILTERED,
* ZLIB_HUFFMAN_ONLY, ZLIB_RLE,
@@ -115,7 +123,7 @@ function deflate_add($context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH):
* @throws ZlibException
*
*/
-function deflate_init(int $encoding, array $options = null)
+function deflate_init(int $encoding, array $options = [])
{
error_clear_last();
$result = \deflate_init($encoding, $options);
@@ -129,15 +137,15 @@ function deflate_init(int $encoding, array $options = null)
/**
* Closes the given gz-file pointer.
*
- * @param resource $zp The gz-file pointer. It must be valid, and must point to a file
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
* successfully opened by gzopen.
* @throws ZlibException
*
*/
-function gzclose($zp): void
+function gzclose($stream): void
{
error_clear_last();
- $result = \gzclose($zp);
+ $result = \gzclose($stream);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -178,19 +186,15 @@ function gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING
* data.
*
* @param string $data The data to decode, encoded by gzencode.
- * @param int $length The maximum length of data to decode.
- * @return string The decoded string.
+ * @param int $max_length The maximum length of data to decode.
+ * @return string The decoded string, or.
* @throws ZlibException
*
*/
-function gzdecode(string $data, int $length = null): string
+function gzdecode(string $data, int $max_length = 0): string
{
error_clear_last();
- if ($length !== null) {
- $result = \gzdecode($data, $length);
- } else {
- $result = \gzdecode($data);
- }
+ $result = \gzdecode($data, $max_length);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -239,24 +243,42 @@ function gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_
* @param int $level The level of compression. Can be given as 0 for no compression up to 9
* for maximum compression. If not given, the default compression level will
* be the default compression level of the zlib library.
- * @param int $encoding_mode The encoding mode. Can be FORCE_GZIP (the default)
+ * @param int $encoding The encoding mode. Can be FORCE_GZIP (the default)
* or FORCE_DEFLATE.
*
- * Prior to PHP 5.4.0, using FORCE_DEFLATE results in
- * a standard zlib deflated string (inclusive zlib headers) after a gzip
- * file header but without the trailing crc32 checksum.
- *
- * In PHP 5.4.0 and later, FORCE_DEFLATE generates
+ * FORCE_DEFLATE generates
* RFC 1950 compliant output, consisting of a zlib header, the deflated
* data, and an Adler checksum.
* @return string The encoded string.
* @throws ZlibException
*
*/
-function gzencode(string $data, int $level = -1, int $encoding_mode = FORCE_GZIP): string
+function gzencode(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_GZIP): string
{
error_clear_last();
- $result = \gzencode($data, $level, $encoding_mode);
+ $result = \gzencode($data, $level, $encoding);
+ if ($result === false) {
+ throw ZlibException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * This function is identical to readgzfile, except that
+ * it returns the file in an array.
+ *
+ * @param string $filename The file name.
+ * @param int $use_include_path You can set this optional parameter to 1, if you
+ * want to search for the file in the include_path too.
+ * @return array An array containing the file, one line per cell, empty lines included, and with newlines still attached.
+ * @throws ZlibException
+ *
+ */
+function gzfile(string $filename, int $use_include_path = 0): array
+{
+ error_clear_last();
+ $result = \gzfile($filename, $use_include_path);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -269,20 +291,20 @@ function gzencode(string $data, int $level = -1, int $encoding_mode = FORCE_GZIP
* file pointer. Reading ends when length - 1 bytes have been read, on a
* newline, or on EOF (whichever comes first).
*
- * @param resource $zp The gz-file pointer. It must be valid, and must point to a file
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
* successfully opened by gzopen.
* @param int $length The length of data to get.
* @return string The uncompressed string.
* @throws ZlibException
*
*/
-function gzgets($zp, int $length = null): string
+function gzgets($stream, int $length = null): string
{
error_clear_last();
if ($length !== null) {
- $result = \gzgets($zp, $length);
+ $result = \gzgets($stream, $length);
} else {
- $result = \gzgets($zp);
+ $result = \gzgets($stream);
}
if ($result === false) {
throw ZlibException::createFromPhpError();
@@ -324,19 +346,56 @@ function gzgetss($zp, int $length, string $allowable_tags = null): string
* This function inflates a deflated string.
*
* @param string $data The data compressed by gzdeflate.
- * @param int $length The maximum length of data to decode.
+ * @param int $max_length The maximum length of decoded data.
* @return string The original uncompressed data.
*
* The function will return an error if the uncompressed data is more than
* 32768 times the length of the compressed input data
- * or more than the optional parameter length.
+ * or, unless max_length is 0, more than the optional parameter max_length.
* @throws ZlibException
*
*/
-function gzinflate(string $data, int $length = 0): string
+function gzinflate(string $data, int $max_length = 0): string
{
error_clear_last();
- $result = \gzinflate($data, $length);
+ $result = \gzinflate($data, $max_length);
+ if ($result === false) {
+ throw ZlibException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Opens a gzip (.gz) file for reading or writing.
+ *
+ * gzopen can be used to read a file which is
+ * not in gzip format; in this case gzread will
+ * directly read from the file without decompression.
+ *
+ * @param string $filename The file name.
+ * @param string $mode As in fopen (rb or
+ * wb) but can also include a compression level
+ * (wb9) or a strategy: f for
+ * filtered data as in wb6f, h for
+ * Huffman only compression as in wb1h.
+ * (See the description of deflateInit2
+ * in zlib.h for
+ * more information about the strategy parameter.)
+ * @param int $use_include_path You can set this optional parameter to 1, if you
+ * want to search for the file in the include_path too.
+ * @return resource Returns a file pointer to the file opened, after that, everything you read
+ * from this file descriptor will be transparently decompressed and what you
+ * write gets compressed.
+ *
+ * If the open fails, the function returns FALSE.
+ * @throws ZlibException
+ *
+ */
+function gzopen(string $filename, string $mode, int $use_include_path = 0)
+{
+ error_clear_last();
+ $result = \gzopen($filename, $mode, $use_include_path);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -348,17 +407,41 @@ function gzinflate(string $data, int $length = 0): string
* Reads to EOF on the given gz-file pointer from the current position and
* writes the (uncompressed) results to standard output.
*
- * @param resource $zp The gz-file pointer. It must be valid, and must point to a file
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
* successfully opened by gzopen.
* @return int The number of uncompressed characters read from gz
* and passed through to the input.
* @throws ZlibException
*
*/
-function gzpassthru($zp): int
+function gzpassthru($stream): int
{
error_clear_last();
- $result = \gzpassthru($zp);
+ $result = \gzpassthru($stream);
+ if ($result === false) {
+ throw ZlibException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * gzread reads up to length bytes
+ * from the given gz-file pointer. Reading stops when
+ * length (uncompressed) bytes have been read
+ * or EOF is reached, whichever comes first.
+ *
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
+ * successfully opened by gzopen.
+ * @param int $length The number of bytes to read.
+ * @return string The data that have been read.
+ * @throws ZlibException
+ *
+ */
+function gzread($stream, int $length): string
+{
+ error_clear_last();
+ $result = \gzread($stream, $length);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -370,15 +453,15 @@ function gzpassthru($zp): int
* Sets the file position indicator of the given gz-file pointer to the
* beginning of the file stream.
*
- * @param resource $zp The gz-file pointer. It must be valid, and must point to a file
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
* successfully opened by gzopen.
* @throws ZlibException
*
*/
-function gzrewind($zp): void
+function gzrewind($stream): void
{
error_clear_last();
- $result = \gzrewind($zp);
+ $result = \gzrewind($stream);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -389,19 +472,50 @@ function gzrewind($zp): void
* This function uncompress a compressed string.
*
* @param string $data The data compressed by gzcompress.
- * @param int $length The maximum length of data to decode.
+ * @param int $max_length The maximum length of data to decode.
* @return string The original uncompressed data.
*
* The function will return an error if the uncompressed data is more than
* 32768 times the length of the compressed input data
- * or more than the optional parameter length.
+ * or more than the optional parameter max_length.
+ * @throws ZlibException
+ *
+ */
+function gzuncompress(string $data, int $max_length = 0): string
+{
+ error_clear_last();
+ $result = \gzuncompress($data, $max_length);
+ if ($result === false) {
+ throw ZlibException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * gzwrite writes the contents of
+ * data to the given gz-file.
+ *
+ * @param resource $stream The gz-file pointer. It must be valid, and must point to a file
+ * successfully opened by gzopen.
+ * @param string $data The string to write.
+ * @param int $length The number of uncompressed bytes to write. If supplied, writing will
+ * stop after length (uncompressed) bytes have been
+ * written or the end of data is reached,
+ * whichever comes first.
+ * @return int Returns the number of (uncompressed) bytes written to the given gz-file
+ * stream.
* @throws ZlibException
*
*/
-function gzuncompress(string $data, int $length = 0): string
+function gzwrite($stream, string $data, int $length = null): int
{
error_clear_last();
- $result = \gzuncompress($data, $length);
+ if ($length !== null) {
+ $result = \gzwrite($stream, $data, $length);
+ } else {
+ $result = \gzwrite($stream, $data);
+ }
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -412,15 +526,15 @@ function gzuncompress(string $data, int $length = 0): string
/**
*
*
- * @param resource $resource
+ * @param resource $context
* @return int Returns number of bytes read so far.
* @throws ZlibException
*
*/
-function inflate_get_read_len($resource): int
+function inflate_get_read_len($context): int
{
error_clear_last();
- $result = \inflate_get_read_len($resource);
+ $result = \inflate_get_read_len($context);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -431,15 +545,15 @@ function inflate_get_read_len($resource): int
/**
* Usually returns either ZLIB_OK or ZLIB_STREAM_END.
*
- * @param resource $resource
+ * @param resource $context
* @return int Returns decompression status.
* @throws ZlibException
*
*/
-function inflate_get_status($resource): int
+function inflate_get_status($context): int
{
error_clear_last();
- $result = \inflate_get_status($resource);
+ $result = \inflate_get_status($context);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -454,7 +568,7 @@ function inflate_get_status($resource): int
* available.
*
* @param resource $context A context created with inflate_init.
- * @param string $encoded_data A chunk of compressed data.
+ * @param string $data A chunk of compressed data.
* @param int $flush_mode One of ZLIB_BLOCK,
* ZLIB_NO_FLUSH,
* ZLIB_PARTIAL_FLUSH,
@@ -468,10 +582,10 @@ function inflate_get_status($resource): int
* @throws ZlibException
*
*/
-function inflate_add($context, string $encoded_data, int $flush_mode = ZLIB_SYNC_FLUSH): string
+function inflate_add($context, string $data, int $flush_mode = ZLIB_SYNC_FLUSH): string
{
error_clear_last();
- $result = \inflate_add($context, $encoded_data, $flush_mode);
+ $result = \inflate_add($context, $data, $flush_mode);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
@@ -550,7 +664,7 @@ function inflate_add($context, string $encoded_data, int $flush_mode = ZLIB_SYNC
* @throws ZlibException
*
*/
-function inflate_init(int $encoding, array $options = null)
+function inflate_init(int $encoding, array $options = [])
{
error_clear_last();
$result = \inflate_init($encoding, $options);
@@ -591,19 +705,15 @@ function readgzfile(string $filename, int $use_include_path = 0): int
* Uncompress any raw/gzip/zlib encoded data.
*
* @param string $data
- * @param int $max_decoded_len
+ * @param int $max_length
* @return string Returns the uncompressed data.
* @throws ZlibException
*
*/
-function zlib_decode(string $data, int $max_decoded_len = null): string
+function zlib_decode(string $data, int $max_length = 0): string
{
error_clear_last();
- if ($max_decoded_len !== null) {
- $result = \zlib_decode($data, $max_decoded_len);
- } else {
- $result = \zlib_decode($data);
- }
+ $result = \zlib_decode($data, $max_length);
if ($result === false) {
throw ZlibException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/lib/DateTime.php b/vendor/thecodingmachine/safe/lib/DateTime.php
index 581ef35c0..56eb809f8 100644
--- a/vendor/thecodingmachine/safe/lib/DateTime.php
+++ b/vendor/thecodingmachine/safe/lib/DateTime.php
@@ -24,7 +24,7 @@ class DateTime extends \DateTime
*/
public static function createFromFormat($format, $time, $timezone = null): self
{
- $datetime = parent::createFromFormat($format, $time, $timezone);
+ $datetime = \DateTime::createFromFormat($format, $time, $timezone);
if ($datetime === false) {
throw DatetimeException::createFromPhpError();
}
diff --git a/vendor/thecodingmachine/safe/lib/DateTimeImmutable.php b/vendor/thecodingmachine/safe/lib/DateTimeImmutable.php
index 114ec3a3d..5cedd24a0 100644
--- a/vendor/thecodingmachine/safe/lib/DateTimeImmutable.php
+++ b/vendor/thecodingmachine/safe/lib/DateTimeImmutable.php
@@ -2,10 +2,6 @@
namespace Safe;
-use DateInterval;
-use DateTime;
-use DateTimeInterface;
-use DateTimeZone;
use Safe\Exceptions\DatetimeException;
/**
@@ -23,7 +19,7 @@ class DateTimeImmutable extends \DateTimeImmutable
/**
* DateTimeImmutable constructor.
* @param string $time
- * @param DateTimeZone|null $timezone
+ * @param \DateTimeZone|null $timezone
* @throws \Exception
*/
public function __construct($time = 'now', $timezone = null)
@@ -52,12 +48,12 @@ class DateTimeImmutable extends \DateTimeImmutable
/**
* @param string $format
* @param string $time
- * @param DateTimeZone|null $timezone
+ * @param \DateTimeZone|null $timezone
* @throws DatetimeException
*/
public static function createFromFormat($format, $time, $timezone = null): self
{
- $datetime = parent::createFromFormat($format, $time, $timezone);
+ $datetime = \DateTimeImmutable::createFromFormat($format, $time, $timezone);
if ($datetime === false) {
throw DatetimeException::createFromPhpError();
}
@@ -80,12 +76,12 @@ class DateTimeImmutable extends \DateTimeImmutable
}
/**
- * @param DateTimeInterface $datetime2
+ * @param \DateTimeInterface $datetime2
* @param bool $absolute
- * @return DateInterval
+ * @return \DateInterval
* @throws DatetimeException
*/
- public function diff($datetime2, $absolute = false): DateInterval
+ public function diff($datetime2, $absolute = false): \DateInterval
{
/** @var \DateInterval|false $result */
$result = $this->innerDateTime->diff($datetime2, $absolute);
@@ -178,7 +174,7 @@ class DateTimeImmutable extends \DateTimeImmutable
}
/**
- * @param DateTimeZone $timezone
+ * @param \DateTimeZone $timezone
* @return DateTimeImmutable
* @throws DatetimeException
*/
@@ -193,7 +189,7 @@ class DateTimeImmutable extends \DateTimeImmutable
}
/**
- * @param DateInterval $interval
+ * @param \DateInterval $interval
* @return DateTimeImmutable
* @throws DatetimeException
*/
@@ -224,7 +220,7 @@ class DateTimeImmutable extends \DateTimeImmutable
//overload getters to use the inner datetime immutable instead of itself
/**
- * @param DateInterval $interval
+ * @param \DateInterval $interval
* @return DateTimeImmutable
*/
public function add($interval): self
@@ -233,12 +229,14 @@ class DateTimeImmutable extends \DateTimeImmutable
}
/**
- * @param DateTime $dateTime
+ * @param \DateTime $dateTime
* @return DateTimeImmutable
*/
public static function createFromMutable($dateTime): self
{
- return self::createFromRegular(parent::createFromMutable($dateTime));
+ $date = \DateTimeImmutable::createFromMutable($dateTime);
+
+ return self::createFromRegular($date);
}
/**
@@ -250,7 +248,7 @@ class DateTimeImmutable extends \DateTimeImmutable
return self::createFromRegular(parent::__set_state($array));
}
- public function getTimezone(): DateTimeZone
+ public function getTimezone(): \DateTimeZone
{
return $this->innerDateTime->getTimezone();
}
diff --git a/vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php b/vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php
index 2814066b0..3401b57b8 100644
--- a/vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php
+++ b/vendor/thecodingmachine/safe/lib/Exceptions/CurlException.php
@@ -6,10 +6,10 @@ namespace Safe\Exceptions;
class CurlException extends \Exception implements SafeExceptionInterface
{
/**
- * @param resource $ch
+ * @param \CurlHandle $ch
*/
- public static function createFromCurlResource($ch): self
+ public static function createFromPhpError($ch = null): self
{
- return new self(\curl_error($ch), \curl_errno($ch));
+ return new self($ch ? \curl_error($ch) : '', $ch ? \curl_errno($ch) : 0);
}
}
diff --git a/vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php b/vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php
index 4300d29e9..d7d5a010d 100644
--- a/vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php
+++ b/vendor/thecodingmachine/safe/lib/Exceptions/JsonException.php
@@ -3,7 +3,7 @@
namespace Safe\Exceptions;
-class JsonException extends \Exception implements SafeExceptionInterface
+class JsonException extends \JsonException implements SafeExceptionInterface
{
public static function createFromPhpError(): self
{
diff --git a/vendor/thecodingmachine/safe/generated/Exceptions/SimplexmlException.php b/vendor/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php
index 67804e133..477a9151c 100644
--- a/vendor/thecodingmachine/safe/generated/Exceptions/SimplexmlException.php
+++ b/vendor/thecodingmachine/safe/lib/Exceptions/SimplexmlException.php
@@ -5,7 +5,7 @@ class SimplexmlException extends \ErrorException implements SafeExceptionInterfa
{
public static function createFromPhpError(): self
{
- $error = error_get_last();
+ $error = \error_get_last();
return new self($error['message'] ?? 'An error occured', 0, $error['type'] ?? 1);
}
}
diff --git a/vendor/thecodingmachine/safe/lib/special_cases.php b/vendor/thecodingmachine/safe/lib/special_cases.php
index d18e2118b..b95fe0b77 100644
--- a/vendor/thecodingmachine/safe/lib/special_cases.php
+++ b/vendor/thecodingmachine/safe/lib/special_cases.php
@@ -7,13 +7,18 @@
namespace Safe;
-use Safe\Exceptions\SocketsException;
+use Safe\Exceptions\FilesystemException;
use const PREG_NO_ERROR;
+
+use Safe\Exceptions\MiscException;
+use Safe\Exceptions\PosixException;
+use Safe\Exceptions\SocketsException;
use Safe\Exceptions\ApcException;
use Safe\Exceptions\ApcuException;
use Safe\Exceptions\JsonException;
use Safe\Exceptions\OpensslException;
use Safe\Exceptions\PcreException;
+use Safe\Exceptions\SimplexmlException;
/**
* Wrapper for json_decode that throws when an error occurs.
@@ -21,7 +26,7 @@ use Safe\Exceptions\PcreException;
* @param string $json JSON data to parse
* @param bool $assoc When true, returned objects will be converted
* into associative arrays.
- * @param int $depth User specified recursion depth.
+ * @param int<1, max> $depth User specified recursion depth.
* @param int $options Bitmask of JSON decode options.
*
* @return mixed
@@ -83,12 +88,12 @@ function apcu_fetch($key)
* pattern and replaces them with
* replacement.
*
- * @param mixed $pattern The pattern to search for. It can be either a string or an array with
+ * @param string[]|string $pattern The pattern to search for. It can be either a string or an array with
* strings.
*
* Several PCRE modifiers
* are also available.
- * @param mixed $replacement The string or an array with strings to replace. If this parameter is a
+ * @param string[]|string $replacement The string or an array with strings to replace. If this parameter is a
* string and the pattern parameter is an array,
* all patterns will be replaced by that string. If both
* pattern and replacement
@@ -216,7 +221,7 @@ function openssl_encrypt(string $data, string $method, string $key, int $options
* socket from the given
* buffer.
*
- * @param resource $socket
+ * @param \Socket $socket
* @param string $buffer The buffer to be written.
* @param int $length The optional parameter length can specify an
* alternate length of bytes written to the socket. If this length is
@@ -230,7 +235,7 @@ function openssl_encrypt(string $data, string $method, string $key, int $options
* @throws SocketsException
*
*/
-function socket_write($socket, string $buffer, int $length = 0): int
+function socket_write(\Socket $socket, string $buffer, int $length = 0): int
{
error_clear_last();
$result = $length === 0 ? \socket_write($socket, $buffer) : \socket_write($socket, $buffer, $length);
@@ -239,3 +244,164 @@ function socket_write($socket, string $buffer, int $length = 0): int
}
return $result;
}
+
+/**
+ * This function takes a node of a DOM
+ * document and makes it into a SimpleXML node. This new object can
+ * then be used as a native SimpleXML element.
+ *
+ * @param \DOMNode $node A DOM Element node
+ * @param string $class_name You may use this optional parameter so that
+ * simplexml_import_dom will return an object of
+ * the specified class. That class should extend the
+ * SimpleXMLElement class.
+ * @return \SimpleXMLElement Returns a SimpleXMLElement.
+ * @throws SimplexmlException
+ *
+ */
+function simplexml_import_dom(\DOMNode $node, string $class_name = \SimpleXMLElement::class): \SimpleXMLElement
+{
+ error_clear_last();
+ $result = \simplexml_import_dom($node, $class_name);
+ if ($result === null) {
+ throw SimplexmlException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * Convert the well-formed XML document in the given file to an object.
+ *
+ * @param string $filename Path to the XML file
+ * @param string $class_name You may use this optional parameter so that
+ * simplexml_load_file will return an object of
+ * the specified class. That class should extend the
+ * SimpleXMLElement class.
+ * @param int $options Since Libxml 2.6.0, you may also use the
+ * options parameter to specify additional Libxml parameters.
+ * @param string $namespace_or_prefix Namespace prefix or URI.
+ * @param bool $is_prefix TRUE if namespace_or_prefix is a prefix, FALSE if it's a URI;
+ * defaults to FALSE.
+ * @return \SimpleXMLElement Returns an object of class SimpleXMLElement with
+ * properties containing the data held within the XML document.
+ * @throws SimplexmlException
+ *
+ */
+function simplexml_load_file(string $filename, string $class_name = \SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): \SimpleXMLElement
+{
+ error_clear_last();
+ $result = \simplexml_load_file($filename, $class_name, $options, $namespace_or_prefix, $is_prefix);
+ if ($result === false) {
+ throw SimplexmlException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * Takes a well-formed XML string and returns it as an object.
+ *
+ * @param string $data A well-formed XML string
+ * @param string $class_name You may use this optional parameter so that
+ * simplexml_load_string will return an object of
+ * the specified class. That class should extend the
+ * SimpleXMLElement class.
+ * @param int $options Since Libxml 2.6.0, you may also use the
+ * options parameter to specify additional Libxml parameters.
+ * @param string $namespace_or_prefix Namespace prefix or URI.
+ * @param bool $is_prefix TRUE if namespace_or_prefix is a prefix, FALSE if it's a URI;
+ * defaults to FALSE.
+ * @return \SimpleXMLElement Returns an object of class SimpleXMLElement with
+ * properties containing the data held within the xml document.
+ * @throws SimplexmlException
+ *
+ */
+function simplexml_load_string(string $data, string $class_name = \SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): \SimpleXMLElement
+{
+ error_clear_last();
+ $result = \simplexml_load_string($data, $class_name, $options, $namespace_or_prefix, $is_prefix);
+ if ($result === false) {
+ throw SimplexmlException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * Returns three samples representing the average system load
+ * (the number of processes in the system run queue) over the last 1, 5 and 15
+ * minutes, respectively. Returns FALSE on failure.
+ *
+ * @return array<int,float> Returns an array with three samples (last 1, 5 and 15
+ * minutes).
+ * @throws MiscException
+ *
+ */
+function sys_getloadavg(): array
+{
+ error_clear_last();
+ $result = \sys_getloadavg();
+ if ($result === false) {
+ throw MiscException::createFromPhpError();
+ }
+ return $result;
+}
+
+/**
+ * Returns the process group identifier of the process
+ * process_id.
+ *
+ * @param int $process_id The process id.
+ * @return int Returns the identifier, as an int.
+ * @throws PosixException
+ *
+ */
+function posix_getpgid(int $process_id): int
+{
+ error_clear_last();
+ $result = \posix_getpgid($process_id);
+ if ($result === false) {
+ throw PosixException::createFromPhpError();
+ }
+ return $result;
+}
+
+
+/**
+ * fputcsv formats a line (passed as a
+ * fields array) as CSV and writes it (terminated by a
+ * newline) to the specified file stream.
+ *
+ * @param resource $stream The file pointer must be valid, and must point to
+ * a file successfully opened by fopen or
+ * fsockopen (and not yet closed by
+ * fclose).
+ * @phpstan-param (scalar|\Stringable|null)[] $fields
+ * @param array $fields An array of strings.
+ * @param string $separator The optional separator parameter sets the field
+ * delimiter (one single-byte character only).
+ * @param string $enclosure The optional enclosure parameter sets the field
+ * enclosure (one single-byte character only).
+ * @param string $escape The optional escape parameter sets the
+ * escape character (at most one single-byte character).
+ * An empty string ("") disables the proprietary escape mechanism.
+ * @param string $eol The optional eol parameter sets
+ * a custom End of Line sequence.
+ * @return int Returns the length of the written string.
+ * @throws FilesystemException
+ *
+ */
+function fputcsv($stream, array $fields, string $separator = ",", string $enclosure = "\"", string $escape = "\\", string $eol = "\n"): int
+{
+ error_clear_last();
+ if (PHP_VERSION_ID >= 80100) {
+ /** @phpstan-ignore-next-line */
+ $result = \fputcsv($stream, $fields, $separator, $enclosure, $escape, $eol);
+ } else {
+ $result = \fputcsv($stream, $fields, $separator, $enclosure, $escape);
+ }
+
+ if ($result === false) {
+ throw FilesystemException::createFromPhpError();
+ }
+ return $result;
+}
diff --git a/vendor/thecodingmachine/safe/phpunit.xml.dist b/vendor/thecodingmachine/safe/phpunit.xml.dist
new file mode 100644
index 000000000..ca32f3b38
--- /dev/null
+++ b/vendor/thecodingmachine/safe/phpunit.xml.dist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
+ colors="true"
+ bootstrap="vendor/autoload.php"
+>
+ <testsuites>
+ <testsuite name="Main test Suite">
+ <directory>./tests/</directory>
+ </testsuite>
+ </testsuites>
+</phpunit>
diff --git a/vendor/thecodingmachine/safe/rector-migrate-0.7.php b/vendor/thecodingmachine/safe/rector-migrate.php
index d1c599700..4f17de5e6 100644
--- a/vendor/thecodingmachine/safe/rector-migrate-0.7.php
+++ b/vendor/thecodingmachine/safe/rector-migrate.php
@@ -5,7 +5,7 @@ declare(strict_types=1);
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
-# This file configures rector/rector:~0.7.0 to replace all PHP functions with their equivalent "safe" functions
+// This file configures rector/rector to replace all PHP functions with their equivalent "safe" functions.
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
@@ -13,8 +13,8 @@ return static function (ContainerConfigurator $containerConfigurator): void {
->call('configure', [[ RenameFunctionRector::OLD_FUNCTION_TO_NEW_FUNCTION => [
'apache_getenv' => 'Safe\apache_getenv',
'apache_get_version' => 'Safe\apache_get_version',
+ 'apache_lookup_uri' => 'Safe\apache_lookup_uri',
'apache_request_headers' => 'Safe\apache_request_headers',
- 'apache_reset_timeout' => 'Safe\apache_reset_timeout',
'apache_response_headers' => 'Safe\apache_response_headers',
'apache_setenv' => 'Safe\apache_setenv',
'apcu_cache_info' => 'Safe\apcu_cache_info',
@@ -24,14 +24,10 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'apcu_inc' => 'Safe\apcu_inc',
'apcu_sma_info' => 'Safe\apcu_sma_info',
'apc_fetch' => 'Safe\apc_fetch',
- 'array_combine' => 'Safe\array_combine',
- 'array_flip' => 'Safe\array_flip',
- 'array_replace' => 'Safe\array_replace',
- 'array_replace_recursive' => 'Safe\array_replace_recursive',
'array_walk_recursive' => 'Safe\array_walk_recursive',
- 'arsort' => 'Safe\arsort',
- 'asort' => 'Safe\asort',
+ 'assert_options' => 'Safe\assert_options',
'base64_decode' => 'Safe\base64_decode',
+ 'bindtextdomain' => 'Safe\bindtextdomain',
'bzclose' => 'Safe\bzclose',
'bzflush' => 'Safe\bzflush',
'bzread' => 'Safe\bzread',
@@ -47,32 +43,75 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'class_uses' => 'Safe\class_uses',
'cli_set_process_title' => 'Safe\cli_set_process_title',
'closelog' => 'Safe\closelog',
+ 'com_create_guid' => 'Safe\com_create_guid',
'com_event_sink' => 'Safe\com_event_sink',
'com_load_typelib' => 'Safe\com_load_typelib',
'com_print_typeinfo' => 'Safe\com_print_typeinfo',
'convert_uudecode' => 'Safe\convert_uudecode',
- 'convert_uuencode' => 'Safe\convert_uuencode',
'copy' => 'Safe\copy',
'create_function' => 'Safe\create_function',
+ 'cubrid_bind' => 'Safe\cubrid_bind',
+ 'cubrid_column_names' => 'Safe\cubrid_column_names',
+ 'cubrid_column_types' => 'Safe\cubrid_column_types',
+ 'cubrid_col_size' => 'Safe\cubrid_col_size',
+ 'cubrid_commit' => 'Safe\cubrid_commit',
+ 'cubrid_connect' => 'Safe\cubrid_connect',
+ 'cubrid_connect_with_url' => 'Safe\cubrid_connect_with_url',
+ 'cubrid_current_oid' => 'Safe\cubrid_current_oid',
+ 'cubrid_disconnect' => 'Safe\cubrid_disconnect',
+ 'cubrid_drop' => 'Safe\cubrid_drop',
'cubrid_free_result' => 'Safe\cubrid_free_result',
'cubrid_get_charset' => 'Safe\cubrid_get_charset',
+ 'cubrid_get_class_name' => 'Safe\cubrid_get_class_name',
'cubrid_get_client_info' => 'Safe\cubrid_get_client_info',
'cubrid_get_db_parameter' => 'Safe\cubrid_get_db_parameter',
+ 'cubrid_get_query_timeout' => 'Safe\cubrid_get_query_timeout',
'cubrid_get_server_info' => 'Safe\cubrid_get_server_info',
'cubrid_insert_id' => 'Safe\cubrid_insert_id',
+ 'cubrid_lob2_bind' => 'Safe\cubrid_lob2_bind',
+ 'cubrid_lob2_close' => 'Safe\cubrid_lob2_close',
+ 'cubrid_lob2_export' => 'Safe\cubrid_lob2_export',
+ 'cubrid_lob2_import' => 'Safe\cubrid_lob2_import',
'cubrid_lob2_new' => 'Safe\cubrid_lob2_new',
+ 'cubrid_lob2_read' => 'Safe\cubrid_lob2_read',
+ 'cubrid_lob2_seek' => 'Safe\cubrid_lob2_seek',
+ 'cubrid_lob2_seek64' => 'Safe\cubrid_lob2_seek64',
'cubrid_lob2_size' => 'Safe\cubrid_lob2_size',
'cubrid_lob2_size64' => 'Safe\cubrid_lob2_size64',
'cubrid_lob2_tell' => 'Safe\cubrid_lob2_tell',
'cubrid_lob2_tell64' => 'Safe\cubrid_lob2_tell64',
+ 'cubrid_lob2_write' => 'Safe\cubrid_lob2_write',
+ 'cubrid_lob_close' => 'Safe\cubrid_lob_close',
+ 'cubrid_lob_export' => 'Safe\cubrid_lob_export',
+ 'cubrid_lob_get' => 'Safe\cubrid_lob_get',
+ 'cubrid_lob_send' => 'Safe\cubrid_lob_send',
+ 'cubrid_lob_size' => 'Safe\cubrid_lob_size',
+ 'cubrid_lock_read' => 'Safe\cubrid_lock_read',
+ 'cubrid_lock_write' => 'Safe\cubrid_lock_write',
+ 'cubrid_move_cursor' => 'Safe\cubrid_move_cursor',
+ 'cubrid_next_result' => 'Safe\cubrid_next_result',
+ 'cubrid_pconnect' => 'Safe\cubrid_pconnect',
+ 'cubrid_pconnect_with_url' => 'Safe\cubrid_pconnect_with_url',
+ 'cubrid_prepare' => 'Safe\cubrid_prepare',
+ 'cubrid_put' => 'Safe\cubrid_put',
+ 'cubrid_rollback' => 'Safe\cubrid_rollback',
+ 'cubrid_schema' => 'Safe\cubrid_schema',
+ 'cubrid_seq_drop' => 'Safe\cubrid_seq_drop',
+ 'cubrid_seq_insert' => 'Safe\cubrid_seq_insert',
+ 'cubrid_seq_put' => 'Safe\cubrid_seq_put',
+ 'cubrid_set_add' => 'Safe\cubrid_set_add',
+ 'cubrid_set_autocommit' => 'Safe\cubrid_set_autocommit',
'cubrid_set_db_parameter' => 'Safe\cubrid_set_db_parameter',
+ 'cubrid_set_drop' => 'Safe\cubrid_set_drop',
+ 'cubrid_set_query_timeout' => 'Safe\cubrid_set_query_timeout',
+ 'curl_copy_handle' => 'Safe\curl_copy_handle',
'curl_escape' => 'Safe\curl_escape',
'curl_exec' => 'Safe\curl_exec',
'curl_getinfo' => 'Safe\curl_getinfo',
'curl_init' => 'Safe\curl_init',
- 'curl_multi_errno' => 'Safe\curl_multi_errno',
'curl_multi_info_read' => 'Safe\curl_multi_info_read',
'curl_multi_init' => 'Safe\curl_multi_init',
+ 'curl_multi_setopt' => 'Safe\curl_multi_setopt',
'curl_setopt' => 'Safe\curl_setopt',
'curl_share_errno' => 'Safe\curl_share_errno',
'curl_share_setopt' => 'Safe\curl_share_setopt',
@@ -112,6 +151,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'eio_event_loop' => 'Safe\eio_event_loop',
'eio_fallocate' => 'Safe\eio_fallocate',
'eio_fchmod' => 'Safe\eio_fchmod',
+ 'eio_fchown' => 'Safe\eio_fchown',
'eio_fdatasync' => 'Safe\eio_fdatasync',
'eio_fstat' => 'Safe\eio_fstat',
'eio_fstatvfs' => 'Safe\eio_fstatvfs',
@@ -141,16 +181,20 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'eio_utime' => 'Safe\eio_utime',
'eio_write' => 'Safe\eio_write',
'error_log' => 'Safe\error_log',
+ 'exec' => 'Safe\exec',
'fastcgi_finish_request' => 'Safe\fastcgi_finish_request',
'fbird_blob_cancel' => 'Safe\fbird_blob_cancel',
'fclose' => 'Safe\fclose',
+ 'fdatasync' => 'Safe\fdatasync',
'fflush' => 'Safe\fflush',
+ 'fgetcsv' => 'Safe\fgetcsv',
'file' => 'Safe\file',
'fileatime' => 'Safe\fileatime',
'filectime' => 'Safe\filectime',
'fileinode' => 'Safe\fileinode',
'filemtime' => 'Safe\filemtime',
'fileowner' => 'Safe\fileowner',
+ 'fileperms' => 'Safe\fileperms',
'filesize' => 'Safe\filesize',
'file_get_contents' => 'Safe\file_get_contents',
'file_put_contents' => 'Safe\file_put_contents',
@@ -163,6 +207,8 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'fputcsv' => 'Safe\fputcsv',
'fread' => 'Safe\fread',
'fsockopen' => 'Safe\fsockopen',
+ 'fstat' => 'Safe\fstat',
+ 'fsync' => 'Safe\fsync',
'ftp_alloc' => 'Safe\ftp_alloc',
'ftp_append' => 'Safe\ftp_append',
'ftp_cdup' => 'Safe\ftp_cdup',
@@ -177,10 +223,12 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'ftp_login' => 'Safe\ftp_login',
'ftp_mkdir' => 'Safe\ftp_mkdir',
'ftp_mlsd' => 'Safe\ftp_mlsd',
+ 'ftp_nb_put' => 'Safe\ftp_nb_put',
'ftp_nlist' => 'Safe\ftp_nlist',
'ftp_pasv' => 'Safe\ftp_pasv',
'ftp_put' => 'Safe\ftp_put',
'ftp_pwd' => 'Safe\ftp_pwd',
+ 'ftp_raw' => 'Safe\ftp_raw',
'ftp_rename' => 'Safe\ftp_rename',
'ftp_rmdir' => 'Safe\ftp_rmdir',
'ftp_site' => 'Safe\ftp_site',
@@ -200,19 +248,22 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'getopt' => 'Safe\getopt',
'getprotobyname' => 'Safe\getprotobyname',
'getprotobynumber' => 'Safe\getprotobynumber',
+ 'getrusage' => 'Safe\getrusage',
+ 'getservbyport' => 'Safe\getservbyport',
'get_headers' => 'Safe\get_headers',
+ 'get_include_path' => 'Safe\get_include_path',
+ 'get_meta_tags' => 'Safe\get_meta_tags',
'glob' => 'Safe\glob',
- 'gmdate' => 'Safe\gmdate',
- 'gmp_binomial' => 'Safe\gmp_binomial',
- 'gmp_export' => 'Safe\gmp_export',
- 'gmp_import' => 'Safe\gmp_import',
+ 'gmmktime' => 'Safe\gmmktime',
'gmp_random_seed' => 'Safe\gmp_random_seed',
+ 'gmstrftime' => 'Safe\gmstrftime',
'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey',
'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey',
'gnupg_addsignkey' => 'Safe\gnupg_addsignkey',
'gnupg_cleardecryptkeys' => 'Safe\gnupg_cleardecryptkeys',
'gnupg_clearencryptkeys' => 'Safe\gnupg_clearencryptkeys',
'gnupg_clearsignkeys' => 'Safe\gnupg_clearsignkeys',
+ 'gnupg_deletekey' => 'Safe\gnupg_deletekey',
'gnupg_setarmor' => 'Safe\gnupg_setarmor',
'gnupg_setsignmode' => 'Safe\gnupg_setsignmode',
'gzclose' => 'Safe\gzclose',
@@ -220,18 +271,23 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'gzdecode' => 'Safe\gzdecode',
'gzdeflate' => 'Safe\gzdeflate',
'gzencode' => 'Safe\gzencode',
+ 'gzfile' => 'Safe\gzfile',
'gzgets' => 'Safe\gzgets',
'gzgetss' => 'Safe\gzgetss',
'gzinflate' => 'Safe\gzinflate',
+ 'gzopen' => 'Safe\gzopen',
'gzpassthru' => 'Safe\gzpassthru',
+ 'gzread' => 'Safe\gzread',
'gzrewind' => 'Safe\gzrewind',
'gzuncompress' => 'Safe\gzuncompress',
+ 'gzwrite' => 'Safe\gzwrite',
'hash_hkdf' => 'Safe\hash_hkdf',
'hash_update_file' => 'Safe\hash_update_file',
'header_register_callback' => 'Safe\header_register_callback',
'hex2bin' => 'Safe\hex2bin',
'highlight_file' => 'Safe\highlight_file',
'highlight_string' => 'Safe\highlight_string',
+ 'hrtime' => 'Safe\hrtime',
'ibase_add_user' => 'Safe\ibase_add_user',
'ibase_backup' => 'Safe\ibase_backup',
'ibase_blob_cancel' => 'Safe\ibase_blob_cancel',
@@ -258,6 +314,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'iconv' => 'Safe\iconv',
'iconv_get_encoding' => 'Safe\iconv_get_encoding',
'iconv_set_encoding' => 'Safe\iconv_set_encoding',
+ 'idate' => 'Safe\idate',
'image2wbmp' => 'Safe\image2wbmp',
'imageaffine' => 'Safe\imageaffine',
'imageaffinematrixconcat' => 'Safe\imageaffinematrixconcat',
@@ -265,12 +322,14 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagealphablending' => 'Safe\imagealphablending',
'imageantialias' => 'Safe\imageantialias',
'imagearc' => 'Safe\imagearc',
+ 'imageavif' => 'Safe\imageavif',
'imagebmp' => 'Safe\imagebmp',
'imagechar' => 'Safe\imagechar',
'imagecharup' => 'Safe\imagecharup',
'imagecolorat' => 'Safe\imagecolorat',
'imagecolordeallocate' => 'Safe\imagecolordeallocate',
'imagecolormatch' => 'Safe\imagecolormatch',
+ 'imagecolorset' => 'Safe\imagecolorset',
'imageconvolution' => 'Safe\imageconvolution',
'imagecopy' => 'Safe\imagecopy',
'imagecopymerge' => 'Safe\imagecopymerge',
@@ -278,6 +337,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagecopyresampled' => 'Safe\imagecopyresampled',
'imagecopyresized' => 'Safe\imagecopyresized',
'imagecreate' => 'Safe\imagecreate',
+ 'imagecreatefromavif' => 'Safe\imagecreatefromavif',
'imagecreatefrombmp' => 'Safe\imagecreatefrombmp',
'imagecreatefromgd' => 'Safe\imagecreatefromgd',
'imagecreatefromgd2' => 'Safe\imagecreatefromgd2',
@@ -285,6 +345,8 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagecreatefromgif' => 'Safe\imagecreatefromgif',
'imagecreatefromjpeg' => 'Safe\imagecreatefromjpeg',
'imagecreatefrompng' => 'Safe\imagecreatefrompng',
+ 'imagecreatefromstring' => 'Safe\imagecreatefromstring',
+ 'imagecreatefromtga' => 'Safe\imagecreatefromtga',
'imagecreatefromwbmp' => 'Safe\imagecreatefromwbmp',
'imagecreatefromwebp' => 'Safe\imagecreatefromwebp',
'imagecreatefromxbm' => 'Safe\imagecreatefromxbm',
@@ -298,11 +360,12 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagefill' => 'Safe\imagefill',
'imagefilledarc' => 'Safe\imagefilledarc',
'imagefilledellipse' => 'Safe\imagefilledellipse',
- 'imagefilledpolygon' => 'Safe\imagefilledpolygon',
'imagefilledrectangle' => 'Safe\imagefilledrectangle',
'imagefilltoborder' => 'Safe\imagefilltoborder',
'imagefilter' => 'Safe\imagefilter',
'imageflip' => 'Safe\imageflip',
+ 'imageftbbox' => 'Safe\imageftbbox',
+ 'imagefttext' => 'Safe\imagefttext',
'imagegammacorrect' => 'Safe\imagegammacorrect',
'imagegd' => 'Safe\imagegd',
'imagegd2' => 'Safe\imagegd2',
@@ -313,10 +376,9 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagelayereffect' => 'Safe\imagelayereffect',
'imageline' => 'Safe\imageline',
'imageloadfont' => 'Safe\imageloadfont',
- 'imageopenpolygon' => 'Safe\imageopenpolygon',
'imagepng' => 'Safe\imagepng',
- 'imagepolygon' => 'Safe\imagepolygon',
'imagerectangle' => 'Safe\imagerectangle',
+ 'imageresolution' => 'Safe\imageresolution',
'imagerotate' => 'Safe\imagerotate',
'imagesavealpha' => 'Safe\imagesavealpha',
'imagescale' => 'Safe\imagescale',
@@ -337,29 +399,49 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'imagewbmp' => 'Safe\imagewbmp',
'imagewebp' => 'Safe\imagewebp',
'imagexbm' => 'Safe\imagexbm',
+ 'image_type_to_extension' => 'Safe\image_type_to_extension',
+ 'imap_8bit' => 'Safe\imap_8bit',
'imap_append' => 'Safe\imap_append',
+ 'imap_base64' => 'Safe\imap_base64',
+ 'imap_binary' => 'Safe\imap_binary',
+ 'imap_body' => 'Safe\imap_body',
+ 'imap_bodystruct' => 'Safe\imap_bodystruct',
'imap_check' => 'Safe\imap_check',
'imap_clearflag_full' => 'Safe\imap_clearflag_full',
'imap_close' => 'Safe\imap_close',
'imap_createmailbox' => 'Safe\imap_createmailbox',
'imap_deletemailbox' => 'Safe\imap_deletemailbox',
+ 'imap_fetchbody' => 'Safe\imap_fetchbody',
+ 'imap_fetchheader' => 'Safe\imap_fetchheader',
+ 'imap_fetchmime' => 'Safe\imap_fetchmime',
'imap_fetchstructure' => 'Safe\imap_fetchstructure',
+ 'imap_fetch_overview' => 'Safe\imap_fetch_overview',
'imap_gc' => 'Safe\imap_gc',
+ 'imap_getacl' => 'Safe\imap_getacl',
+ 'imap_getmailboxes' => 'Safe\imap_getmailboxes',
+ 'imap_getsubscribed' => 'Safe\imap_getsubscribed',
'imap_headerinfo' => 'Safe\imap_headerinfo',
+ 'imap_headers' => 'Safe\imap_headers',
+ 'imap_listscan' => 'Safe\imap_listscan',
+ 'imap_lsub' => 'Safe\imap_lsub',
'imap_mail' => 'Safe\imap_mail',
'imap_mailboxmsginfo' => 'Safe\imap_mailboxmsginfo',
'imap_mail_compose' => 'Safe\imap_mail_compose',
'imap_mail_copy' => 'Safe\imap_mail_copy',
'imap_mail_move' => 'Safe\imap_mail_move',
+ 'imap_mime_header_decode' => 'Safe\imap_mime_header_decode',
'imap_mutf7_to_utf8' => 'Safe\imap_mutf7_to_utf8',
'imap_num_msg' => 'Safe\imap_num_msg',
'imap_open' => 'Safe\imap_open',
+ 'imap_qprint' => 'Safe\imap_qprint',
'imap_renamemailbox' => 'Safe\imap_renamemailbox',
+ 'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address',
'imap_savebody' => 'Safe\imap_savebody',
'imap_setacl' => 'Safe\imap_setacl',
'imap_setflag_full' => 'Safe\imap_setflag_full',
'imap_set_quota' => 'Safe\imap_set_quota',
'imap_sort' => 'Safe\imap_sort',
+ 'imap_status' => 'Safe\imap_status',
'imap_subscribe' => 'Safe\imap_subscribe',
'imap_thread' => 'Safe\imap_thread',
'imap_timeout' => 'Safe\imap_timeout',
@@ -371,42 +453,25 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'inflate_get_read_len' => 'Safe\inflate_get_read_len',
'inflate_get_status' => 'Safe\inflate_get_status',
'inflate_init' => 'Safe\inflate_init',
- 'ingres_autocommit' => 'Safe\ingres_autocommit',
- 'ingres_close' => 'Safe\ingres_close',
- 'ingres_commit' => 'Safe\ingres_commit',
- 'ingres_connect' => 'Safe\ingres_connect',
- 'ingres_execute' => 'Safe\ingres_execute',
- 'ingres_field_name' => 'Safe\ingres_field_name',
- 'ingres_field_type' => 'Safe\ingres_field_type',
- 'ingres_free_result' => 'Safe\ingres_free_result',
- 'ingres_pconnect' => 'Safe\ingres_pconnect',
- 'ingres_result_seek' => 'Safe\ingres_result_seek',
- 'ingres_rollback' => 'Safe\ingres_rollback',
- 'ingres_set_environment' => 'Safe\ingres_set_environment',
'ini_get' => 'Safe\ini_get',
'ini_set' => 'Safe\ini_set',
'inotify_init' => 'Safe\inotify_init',
'inotify_rm_watch' => 'Safe\inotify_rm_watch',
'iptcembed' => 'Safe\iptcembed',
'iptcparse' => 'Safe\iptcparse',
- 'jdtounix' => 'Safe\jdtounix',
'jpeg2wbmp' => 'Safe\jpeg2wbmp',
'json_decode' => 'Safe\json_decode',
'json_encode' => 'Safe\json_encode',
- 'json_last_error_msg' => 'Safe\json_last_error_msg',
- 'krsort' => 'Safe\krsort',
- 'ksort' => 'Safe\ksort',
'lchgrp' => 'Safe\lchgrp',
'lchown' => 'Safe\lchown',
+ 'ldap_8859_to_t61' => 'Safe\ldap_8859_to_t61',
'ldap_add' => 'Safe\ldap_add',
- 'ldap_add_ext' => 'Safe\ldap_add_ext',
'ldap_bind' => 'Safe\ldap_bind',
- 'ldap_bind_ext' => 'Safe\ldap_bind_ext',
'ldap_control_paged_result' => 'Safe\ldap_control_paged_result',
'ldap_control_paged_result_response' => 'Safe\ldap_control_paged_result_response',
'ldap_count_entries' => 'Safe\ldap_count_entries',
'ldap_delete' => 'Safe\ldap_delete',
- 'ldap_delete_ext' => 'Safe\ldap_delete_ext',
+ 'ldap_dn2ufn' => 'Safe\ldap_dn2ufn',
'ldap_exop' => 'Safe\ldap_exop',
'ldap_exop_passwd' => 'Safe\ldap_exop_passwd',
'ldap_exop_whoami' => 'Safe\ldap_exop_whoami',
@@ -420,27 +485,22 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'ldap_get_option' => 'Safe\ldap_get_option',
'ldap_get_values' => 'Safe\ldap_get_values',
'ldap_get_values_len' => 'Safe\ldap_get_values_len',
- 'ldap_list' => 'Safe\ldap_list',
'ldap_modify_batch' => 'Safe\ldap_modify_batch',
'ldap_mod_add' => 'Safe\ldap_mod_add',
- 'ldap_mod_add_ext' => 'Safe\ldap_mod_add_ext',
'ldap_mod_del' => 'Safe\ldap_mod_del',
- 'ldap_mod_del_ext' => 'Safe\ldap_mod_del_ext',
'ldap_mod_replace' => 'Safe\ldap_mod_replace',
- 'ldap_mod_replace_ext' => 'Safe\ldap_mod_replace_ext',
'ldap_next_attribute' => 'Safe\ldap_next_attribute',
'ldap_parse_exop' => 'Safe\ldap_parse_exop',
'ldap_parse_result' => 'Safe\ldap_parse_result',
- 'ldap_read' => 'Safe\ldap_read',
'ldap_rename' => 'Safe\ldap_rename',
- 'ldap_rename_ext' => 'Safe\ldap_rename_ext',
'ldap_sasl_bind' => 'Safe\ldap_sasl_bind',
- 'ldap_search' => 'Safe\ldap_search',
'ldap_set_option' => 'Safe\ldap_set_option',
'ldap_unbind' => 'Safe\ldap_unbind',
'libxml_get_last_error' => 'Safe\libxml_get_last_error',
'libxml_set_external_entity_loader' => 'Safe\libxml_set_external_entity_loader',
'link' => 'Safe\link',
+ 'long2ip' => 'Safe\long2ip',
+ 'lstat' => 'Safe\lstat',
'lzf_compress' => 'Safe\lzf_compress',
'lzf_decompress' => 'Safe\lzf_decompress',
'mailparse_msg_extract_part_file' => 'Safe\mailparse_msg_extract_part_file',
@@ -449,6 +509,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'mailparse_msg_parse_file' => 'Safe\mailparse_msg_parse_file',
'mailparse_stream_encode' => 'Safe\mailparse_stream_encode',
'mb_chr' => 'Safe\mb_chr',
+ 'mb_convert_encoding' => 'Safe\mb_convert_encoding',
'mb_detect_order' => 'Safe\mb_detect_order',
'mb_encoding_aliases' => 'Safe\mb_encoding_aliases',
'mb_eregi_replace' => 'Safe\mb_eregi_replace',
@@ -458,6 +519,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'mb_ereg_search_init' => 'Safe\mb_ereg_search_init',
'mb_ereg_search_regs' => 'Safe\mb_ereg_search_regs',
'mb_ereg_search_setpos' => 'Safe\mb_ereg_search_setpos',
+ 'mb_get_info' => 'Safe\mb_get_info',
'mb_http_output' => 'Safe\mb_http_output',
'mb_internal_encoding' => 'Safe\mb_internal_encoding',
'mb_ord' => 'Safe\mb_ord',
@@ -465,42 +527,17 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'mb_regex_encoding' => 'Safe\mb_regex_encoding',
'mb_send_mail' => 'Safe\mb_send_mail',
'mb_split' => 'Safe\mb_split',
- 'mb_str_split' => 'Safe\mb_str_split',
'md5_file' => 'Safe\md5_file',
- 'metaphone' => 'Safe\metaphone',
'mime_content_type' => 'Safe\mime_content_type',
'mkdir' => 'Safe\mkdir',
'mktime' => 'Safe\mktime',
+ 'msg_get_queue' => 'Safe\msg_get_queue',
'msg_queue_exists' => 'Safe\msg_queue_exists',
'msg_receive' => 'Safe\msg_receive',
'msg_remove_queue' => 'Safe\msg_remove_queue',
'msg_send' => 'Safe\msg_send',
'msg_set_queue' => 'Safe\msg_set_queue',
- 'msql_affected_rows' => 'Safe\msql_affected_rows',
- 'msql_close' => 'Safe\msql_close',
- 'msql_connect' => 'Safe\msql_connect',
- 'msql_create_db' => 'Safe\msql_create_db',
- 'msql_data_seek' => 'Safe\msql_data_seek',
- 'msql_db_query' => 'Safe\msql_db_query',
- 'msql_drop_db' => 'Safe\msql_drop_db',
- 'msql_field_len' => 'Safe\msql_field_len',
- 'msql_field_name' => 'Safe\msql_field_name',
- 'msql_field_seek' => 'Safe\msql_field_seek',
- 'msql_field_table' => 'Safe\msql_field_table',
- 'msql_field_type' => 'Safe\msql_field_type',
- 'msql_free_result' => 'Safe\msql_free_result',
- 'msql_pconnect' => 'Safe\msql_pconnect',
- 'msql_query' => 'Safe\msql_query',
- 'msql_select_db' => 'Safe\msql_select_db',
- 'mysqli_get_cache_stats' => 'Safe\mysqli_get_cache_stats',
- 'mysqli_get_client_stats' => 'Safe\mysqli_get_client_stats',
- 'mysqlnd_ms_dump_servers' => 'Safe\mysqlnd_ms_dump_servers',
- 'mysqlnd_ms_fabric_select_global' => 'Safe\mysqlnd_ms_fabric_select_global',
- 'mysqlnd_ms_fabric_select_shard' => 'Safe\mysqlnd_ms_fabric_select_shard',
- 'mysqlnd_ms_get_last_used_connection' => 'Safe\mysqlnd_ms_get_last_used_connection',
- 'mysqlnd_qc_clear_cache' => 'Safe\mysqlnd_qc_clear_cache',
- 'mysqlnd_qc_set_is_select' => 'Safe\mysqlnd_qc_set_is_select',
- 'mysqlnd_qc_set_storage_handler' => 'Safe\mysqlnd_qc_set_storage_handler',
+ 'msg_stat_queue' => 'Safe\msg_stat_queue',
'mysql_close' => 'Safe\mysql_close',
'mysql_connect' => 'Safe\mysql_connect',
'mysql_create_db' => 'Safe\mysql_create_db',
@@ -532,19 +569,19 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'mysql_tablename' => 'Safe\mysql_tablename',
'mysql_thread_id' => 'Safe\mysql_thread_id',
'mysql_unbuffered_query' => 'Safe\mysql_unbuffered_query',
- 'natcasesort' => 'Safe\natcasesort',
- 'natsort' => 'Safe\natsort',
+ 'net_get_interfaces' => 'Safe\net_get_interfaces',
+ 'ob_clean' => 'Safe\ob_clean',
'ob_end_clean' => 'Safe\ob_end_clean',
'ob_end_flush' => 'Safe\ob_end_flush',
+ 'ob_flush' => 'Safe\ob_flush',
+ 'ob_start' => 'Safe\ob_start',
'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name',
'oci_bind_by_name' => 'Safe\oci_bind_by_name',
'oci_cancel' => 'Safe\oci_cancel',
- 'oci_close' => 'Safe\oci_close',
'oci_commit' => 'Safe\oci_commit',
'oci_connect' => 'Safe\oci_connect',
'oci_define_by_name' => 'Safe\oci_define_by_name',
'oci_execute' => 'Safe\oci_execute',
- 'oci_fetch_all' => 'Safe\oci_fetch_all',
'oci_field_name' => 'Safe\oci_field_name',
'oci_field_precision' => 'Safe\oci_field_precision',
'oci_field_scale' => 'Safe\oci_field_scale',
@@ -557,10 +594,10 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'oci_new_connect' => 'Safe\oci_new_connect',
'oci_new_cursor' => 'Safe\oci_new_cursor',
'oci_new_descriptor' => 'Safe\oci_new_descriptor',
- 'oci_num_fields' => 'Safe\oci_num_fields',
'oci_num_rows' => 'Safe\oci_num_rows',
'oci_parse' => 'Safe\oci_parse',
'oci_pconnect' => 'Safe\oci_pconnect',
+ 'oci_register_taf_callback' => 'Safe\oci_register_taf_callback',
'oci_result' => 'Safe\oci_result',
'oci_rollback' => 'Safe\oci_rollback',
'oci_server_version' => 'Safe\oci_server_version',
@@ -572,6 +609,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'oci_set_edition' => 'Safe\oci_set_edition',
'oci_set_module_name' => 'Safe\oci_set_module_name',
'oci_set_prefetch' => 'Safe\oci_set_prefetch',
+ 'oci_set_prefetch_lob' => 'Safe\oci_set_prefetch_lob',
'oci_statement_type' => 'Safe\oci_statement_type',
'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback',
'odbc_autocommit' => 'Safe\odbc_autocommit',
@@ -579,6 +617,8 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'odbc_columnprivileges' => 'Safe\odbc_columnprivileges',
'odbc_columns' => 'Safe\odbc_columns',
'odbc_commit' => 'Safe\odbc_commit',
+ 'odbc_connect' => 'Safe\odbc_connect',
+ 'odbc_cursor' => 'Safe\odbc_cursor',
'odbc_data_source' => 'Safe\odbc_data_source',
'odbc_exec' => 'Safe\odbc_exec',
'odbc_execute' => 'Safe\odbc_execute',
@@ -591,8 +631,11 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'odbc_foreignkeys' => 'Safe\odbc_foreignkeys',
'odbc_gettypeinfo' => 'Safe\odbc_gettypeinfo',
'odbc_longreadlen' => 'Safe\odbc_longreadlen',
+ 'odbc_pconnect' => 'Safe\odbc_pconnect',
'odbc_prepare' => 'Safe\odbc_prepare',
'odbc_primarykeys' => 'Safe\odbc_primarykeys',
+ 'odbc_procedurecolumns' => 'Safe\odbc_procedurecolumns',
+ 'odbc_procedures' => 'Safe\odbc_procedures',
'odbc_result' => 'Safe\odbc_result',
'odbc_result_all' => 'Safe\odbc_result_all',
'odbc_rollback' => 'Safe\odbc_rollback',
@@ -606,8 +649,14 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'opendir' => 'Safe\opendir',
'openlog' => 'Safe\openlog',
'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length',
+ 'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt',
+ 'openssl_cms_encrypt' => 'Safe\openssl_cms_encrypt',
+ 'openssl_cms_read' => 'Safe\openssl_cms_read',
+ 'openssl_cms_sign' => 'Safe\openssl_cms_sign',
+ 'openssl_cms_verify' => 'Safe\openssl_cms_verify',
'openssl_csr_export' => 'Safe\openssl_csr_export',
'openssl_csr_export_to_file' => 'Safe\openssl_csr_export_to_file',
+ 'openssl_csr_get_public_key' => 'Safe\openssl_csr_get_public_key',
'openssl_csr_get_subject' => 'Safe\openssl_csr_get_subject',
'openssl_csr_new' => 'Safe\openssl_csr_new',
'openssl_csr_sign' => 'Safe\openssl_csr_sign',
@@ -615,6 +664,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'openssl_dh_compute_key' => 'Safe\openssl_dh_compute_key',
'openssl_digest' => 'Safe\openssl_digest',
'openssl_encrypt' => 'Safe\openssl_encrypt',
+ 'openssl_get_curve_names' => 'Safe\openssl_get_curve_names',
'openssl_open' => 'Safe\openssl_open',
'openssl_pbkdf2' => 'Safe\openssl_pbkdf2',
'openssl_pkcs7_decrypt' => 'Safe\openssl_pkcs7_decrypt',
@@ -624,6 +674,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'openssl_pkcs12_export' => 'Safe\openssl_pkcs12_export',
'openssl_pkcs12_export_to_file' => 'Safe\openssl_pkcs12_export_to_file',
'openssl_pkcs12_read' => 'Safe\openssl_pkcs12_read',
+ 'openssl_pkey_derive' => 'Safe\openssl_pkey_derive',
'openssl_pkey_export' => 'Safe\openssl_pkey_export',
'openssl_pkey_export_to_file' => 'Safe\openssl_pkey_export_to_file',
'openssl_pkey_get_private' => 'Safe\openssl_pkey_get_private',
@@ -636,6 +687,11 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'openssl_random_pseudo_bytes' => 'Safe\openssl_random_pseudo_bytes',
'openssl_seal' => 'Safe\openssl_seal',
'openssl_sign' => 'Safe\openssl_sign',
+ 'openssl_spki_export' => 'Safe\openssl_spki_export',
+ 'openssl_spki_export_challenge' => 'Safe\openssl_spki_export_challenge',
+ 'openssl_spki_new' => 'Safe\openssl_spki_new',
+ 'openssl_spki_verify' => 'Safe\openssl_spki_verify',
+ 'openssl_verify' => 'Safe\openssl_verify',
'openssl_x509_export' => 'Safe\openssl_x509_export',
'openssl_x509_export_to_file' => 'Safe\openssl_x509_export_to_file',
'openssl_x509_fingerprint' => 'Safe\openssl_x509_fingerprint',
@@ -646,123 +702,43 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'parse_ini_file' => 'Safe\parse_ini_file',
'parse_ini_string' => 'Safe\parse_ini_string',
'parse_url' => 'Safe\parse_url',
- 'password_hash' => 'Safe\password_hash',
- 'pcntl_exec' => 'Safe\pcntl_exec',
+ 'passthru' => 'Safe\passthru',
'pcntl_getpriority' => 'Safe\pcntl_getpriority',
'pcntl_setpriority' => 'Safe\pcntl_setpriority',
+ 'pcntl_signal' => 'Safe\pcntl_signal',
'pcntl_signal_dispatch' => 'Safe\pcntl_signal_dispatch',
'pcntl_sigprocmask' => 'Safe\pcntl_sigprocmask',
- 'pcntl_strerror' => 'Safe\pcntl_strerror',
- 'PDF_activate_item' => 'Safe\PDF_activate_item',
- 'PDF_add_locallink' => 'Safe\PDF_add_locallink',
- 'PDF_add_nameddest' => 'Safe\PDF_add_nameddest',
- 'PDF_add_note' => 'Safe\PDF_add_note',
- 'PDF_add_pdflink' => 'Safe\PDF_add_pdflink',
- 'PDF_add_thumbnail' => 'Safe\PDF_add_thumbnail',
- 'PDF_add_weblink' => 'Safe\PDF_add_weblink',
- 'PDF_attach_file' => 'Safe\PDF_attach_file',
- 'PDF_begin_layer' => 'Safe\PDF_begin_layer',
- 'PDF_begin_page' => 'Safe\PDF_begin_page',
- 'PDF_begin_page_ext' => 'Safe\PDF_begin_page_ext',
- 'PDF_circle' => 'Safe\PDF_circle',
- 'PDF_clip' => 'Safe\PDF_clip',
- 'PDF_close' => 'Safe\PDF_close',
- 'PDF_closepath' => 'Safe\PDF_closepath',
- 'PDF_closepath_fill_stroke' => 'Safe\PDF_closepath_fill_stroke',
- 'PDF_closepath_stroke' => 'Safe\PDF_closepath_stroke',
- 'PDF_close_pdi' => 'Safe\PDF_close_pdi',
- 'PDF_close_pdi_page' => 'Safe\PDF_close_pdi_page',
- 'PDF_concat' => 'Safe\PDF_concat',
- 'PDF_continue_text' => 'Safe\PDF_continue_text',
- 'PDF_curveto' => 'Safe\PDF_curveto',
- 'PDF_delete' => 'Safe\PDF_delete',
- 'PDF_end_layer' => 'Safe\PDF_end_layer',
- 'PDF_end_page' => 'Safe\PDF_end_page',
- 'PDF_end_page_ext' => 'Safe\PDF_end_page_ext',
- 'PDF_end_pattern' => 'Safe\PDF_end_pattern',
- 'PDF_end_template' => 'Safe\PDF_end_template',
- 'PDF_fill' => 'Safe\PDF_fill',
- 'PDF_fill_stroke' => 'Safe\PDF_fill_stroke',
- 'PDF_fit_image' => 'Safe\PDF_fit_image',
- 'PDF_fit_pdi_page' => 'Safe\PDF_fit_pdi_page',
- 'PDF_fit_textline' => 'Safe\PDF_fit_textline',
- 'PDF_initgraphics' => 'Safe\PDF_initgraphics',
- 'PDF_lineto' => 'Safe\PDF_lineto',
- 'PDF_makespotcolor' => 'Safe\PDF_makespotcolor',
- 'PDF_moveto' => 'Safe\PDF_moveto',
- 'PDF_open_file' => 'Safe\PDF_open_file',
- 'PDF_place_image' => 'Safe\PDF_place_image',
- 'PDF_place_pdi_page' => 'Safe\PDF_place_pdi_page',
- 'PDF_rect' => 'Safe\PDF_rect',
- 'PDF_restore' => 'Safe\PDF_restore',
- 'PDF_rotate' => 'Safe\PDF_rotate',
- 'PDF_save' => 'Safe\PDF_save',
- 'PDF_scale' => 'Safe\PDF_scale',
- 'PDF_setcolor' => 'Safe\PDF_setcolor',
- 'PDF_setdash' => 'Safe\PDF_setdash',
- 'PDF_setdashpattern' => 'Safe\PDF_setdashpattern',
- 'PDF_setflat' => 'Safe\PDF_setflat',
- 'PDF_setfont' => 'Safe\PDF_setfont',
- 'PDF_setgray' => 'Safe\PDF_setgray',
- 'PDF_setgray_fill' => 'Safe\PDF_setgray_fill',
- 'PDF_setgray_stroke' => 'Safe\PDF_setgray_stroke',
- 'PDF_setlinejoin' => 'Safe\PDF_setlinejoin',
- 'PDF_setlinewidth' => 'Safe\PDF_setlinewidth',
- 'PDF_setmatrix' => 'Safe\PDF_setmatrix',
- 'PDF_setmiterlimit' => 'Safe\PDF_setmiterlimit',
- 'PDF_setrgbcolor' => 'Safe\PDF_setrgbcolor',
- 'PDF_setrgbcolor_fill' => 'Safe\PDF_setrgbcolor_fill',
- 'PDF_setrgbcolor_stroke' => 'Safe\PDF_setrgbcolor_stroke',
- 'PDF_set_border_color' => 'Safe\PDF_set_border_color',
- 'PDF_set_border_dash' => 'Safe\PDF_set_border_dash',
- 'PDF_set_border_style' => 'Safe\PDF_set_border_style',
- 'PDF_set_info' => 'Safe\PDF_set_info',
- 'PDF_set_layer_dependency' => 'Safe\PDF_set_layer_dependency',
- 'PDF_set_parameter' => 'Safe\PDF_set_parameter',
- 'PDF_set_text_pos' => 'Safe\PDF_set_text_pos',
- 'PDF_set_value' => 'Safe\PDF_set_value',
- 'PDF_show' => 'Safe\PDF_show',
- 'PDF_show_xy' => 'Safe\PDF_show_xy',
- 'PDF_skew' => 'Safe\PDF_skew',
- 'PDF_stroke' => 'Safe\PDF_stroke',
+ 'pcntl_sigtimedwait' => 'Safe\pcntl_sigtimedwait',
+ 'pcntl_sigwaitinfo' => 'Safe\pcntl_sigwaitinfo',
+ 'pfsockopen' => 'Safe\pfsockopen',
'pg_cancel_query' => 'Safe\pg_cancel_query',
- 'pg_client_encoding' => 'Safe\pg_client_encoding',
- 'pg_close' => 'Safe\pg_close',
'pg_connect' => 'Safe\pg_connect',
'pg_connection_reset' => 'Safe\pg_connection_reset',
'pg_convert' => 'Safe\pg_convert',
'pg_copy_from' => 'Safe\pg_copy_from',
'pg_copy_to' => 'Safe\pg_copy_to',
- 'pg_dbname' => 'Safe\pg_dbname',
'pg_delete' => 'Safe\pg_delete',
'pg_end_copy' => 'Safe\pg_end_copy',
'pg_execute' => 'Safe\pg_execute',
- 'pg_field_name' => 'Safe\pg_field_name',
'pg_field_table' => 'Safe\pg_field_table',
- 'pg_field_type' => 'Safe\pg_field_type',
'pg_flush' => 'Safe\pg_flush',
'pg_free_result' => 'Safe\pg_free_result',
'pg_host' => 'Safe\pg_host',
'pg_insert' => 'Safe\pg_insert',
- 'pg_last_error' => 'Safe\pg_last_error',
- 'pg_last_notice' => 'Safe\pg_last_notice',
'pg_last_oid' => 'Safe\pg_last_oid',
'pg_lo_close' => 'Safe\pg_lo_close',
'pg_lo_export' => 'Safe\pg_lo_export',
'pg_lo_import' => 'Safe\pg_lo_import',
'pg_lo_open' => 'Safe\pg_lo_open',
'pg_lo_read' => 'Safe\pg_lo_read',
- 'pg_lo_read_all' => 'Safe\pg_lo_read_all',
'pg_lo_seek' => 'Safe\pg_lo_seek',
'pg_lo_truncate' => 'Safe\pg_lo_truncate',
'pg_lo_unlink' => 'Safe\pg_lo_unlink',
'pg_lo_write' => 'Safe\pg_lo_write',
'pg_meta_data' => 'Safe\pg_meta_data',
- 'pg_options' => 'Safe\pg_options',
'pg_parameter_status' => 'Safe\pg_parameter_status',
'pg_pconnect' => 'Safe\pg_pconnect',
'pg_ping' => 'Safe\pg_ping',
- 'pg_port' => 'Safe\pg_port',
'pg_prepare' => 'Safe\pg_prepare',
'pg_put_line' => 'Safe\pg_put_line',
'pg_query' => 'Safe\pg_query',
@@ -770,21 +746,21 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'pg_result_error_field' => 'Safe\pg_result_error_field',
'pg_result_seek' => 'Safe\pg_result_seek',
'pg_select' => 'Safe\pg_select',
- 'pg_send_execute' => 'Safe\pg_send_execute',
- 'pg_send_prepare' => 'Safe\pg_send_prepare',
- 'pg_send_query' => 'Safe\pg_send_query',
- 'pg_send_query_params' => 'Safe\pg_send_query_params',
'pg_socket' => 'Safe\pg_socket',
'pg_trace' => 'Safe\pg_trace',
- 'pg_tty' => 'Safe\pg_tty',
'pg_update' => 'Safe\pg_update',
- 'pg_version' => 'Safe\pg_version',
'phpcredits' => 'Safe\phpcredits',
'phpinfo' => 'Safe\phpinfo',
+ 'php_sapi_name' => 'Safe\php_sapi_name',
'png2wbmp' => 'Safe\png2wbmp',
'posix_access' => 'Safe\posix_access',
+ 'posix_getgrgid' => 'Safe\posix_getgrgid',
'posix_getgrnam' => 'Safe\posix_getgrnam',
- 'posix_getpgid' => 'Safe\posix_getpgid',
+ 'posix_getgroups' => 'Safe\posix_getgroups',
+ 'posix_getlogin' => 'Safe\posix_getlogin',
+ 'posix_getpwuid' => 'Safe\posix_getpwuid',
+ 'posix_getrlimit' => 'Safe\posix_getrlimit',
+ 'posix_getsid' => 'Safe\posix_getsid',
'posix_initgroups' => 'Safe\posix_initgroups',
'posix_kill' => 'Safe\posix_kill',
'posix_mkfifo' => 'Safe\posix_mkfifo',
@@ -795,11 +771,13 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'posix_setpgid' => 'Safe\posix_setpgid',
'posix_setrlimit' => 'Safe\posix_setrlimit',
'posix_setuid' => 'Safe\posix_setuid',
+ 'posix_times' => 'Safe\posix_times',
+ 'posix_uname' => 'Safe\posix_uname',
+ 'preg_grep' => 'Safe\preg_grep',
'preg_match' => 'Safe\preg_match',
'preg_match_all' => 'Safe\preg_match_all',
'preg_replace' => 'Safe\preg_replace',
'preg_split' => 'Safe\preg_split',
- 'proc_get_status' => 'Safe\proc_get_status',
'proc_nice' => 'Safe\proc_nice',
'pspell_add_to_personal' => 'Safe\pspell_add_to_personal',
'pspell_add_to_session' => 'Safe\pspell_add_to_session',
@@ -815,6 +793,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'pspell_config_save_repl' => 'Safe\pspell_config_save_repl',
'pspell_new' => 'Safe\pspell_new',
'pspell_new_config' => 'Safe\pspell_new_config',
+ 'pspell_new_personal' => 'Safe\pspell_new_personal',
'pspell_save_wordlist' => 'Safe\pspell_save_wordlist',
'pspell_store_replacement' => 'Safe\pspell_store_replacement',
'ps_add_launchlink' => 'Safe\ps_add_launchlink',
@@ -896,14 +875,21 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'register_tick_function' => 'Safe\register_tick_function',
'rename' => 'Safe\rename',
'rewind' => 'Safe\rewind',
- 'rewinddir' => 'Safe\rewinddir',
'rmdir' => 'Safe\rmdir',
'rpmaddtag' => 'Safe\rpmaddtag',
'rrd_create' => 'Safe\rrd_create',
- 'rsort' => 'Safe\rsort',
+ 'rrd_first' => 'Safe\rrd_first',
+ 'rrd_graph' => 'Safe\rrd_graph',
+ 'rrd_info' => 'Safe\rrd_info',
+ 'rrd_lastupdate' => 'Safe\rrd_lastupdate',
+ 'rrd_restore' => 'Safe\rrd_restore',
+ 'rrd_tune' => 'Safe\rrd_tune',
+ 'rrd_update' => 'Safe\rrd_update',
+ 'rrd_xport' => 'Safe\rrd_xport',
'sapi_windows_cp_conv' => 'Safe\sapi_windows_cp_conv',
'sapi_windows_cp_set' => 'Safe\sapi_windows_cp_set',
'sapi_windows_generate_ctrl_event' => 'Safe\sapi_windows_generate_ctrl_event',
+ 'sapi_windows_set_ctrl_handler' => 'Safe\sapi_windows_set_ctrl_handler',
'sapi_windows_vt100_support' => 'Safe\sapi_windows_vt100_support',
'scandir' => 'Safe\scandir',
'sem_acquire' => 'Safe\sem_acquire',
@@ -911,19 +897,27 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'sem_release' => 'Safe\sem_release',
'sem_remove' => 'Safe\sem_remove',
'session_abort' => 'Safe\session_abort',
+ 'session_create_id' => 'Safe\session_create_id',
'session_decode' => 'Safe\session_decode',
'session_destroy' => 'Safe\session_destroy',
+ 'session_encode' => 'Safe\session_encode',
+ 'session_id' => 'Safe\session_id',
+ 'session_module_name' => 'Safe\session_module_name',
+ 'session_name' => 'Safe\session_name',
'session_regenerate_id' => 'Safe\session_regenerate_id',
'session_reset' => 'Safe\session_reset',
+ 'session_save_path' => 'Safe\session_save_path',
'session_unset' => 'Safe\session_unset',
'session_write_close' => 'Safe\session_write_close',
'settype' => 'Safe\settype',
'set_include_path' => 'Safe\set_include_path',
'set_time_limit' => 'Safe\set_time_limit',
'sha1_file' => 'Safe\sha1_file',
+ 'shell_exec' => 'Safe\shell_exec',
'shmop_delete' => 'Safe\shmop_delete',
'shmop_read' => 'Safe\shmop_read',
- 'shmop_write' => 'Safe\shmop_write',
+ 'shm_attach' => 'Safe\shm_attach',
+ 'shm_detach' => 'Safe\shm_detach',
'shm_put_var' => 'Safe\shm_put_var',
'shm_remove' => 'Safe\shm_remove',
'shm_remove_var' => 'Safe\shm_remove_var',
@@ -935,6 +929,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'socket_accept' => 'Safe\socket_accept',
'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind',
'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect',
+ 'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup',
'socket_bind' => 'Safe\socket_bind',
'socket_connect' => 'Safe\socket_connect',
'socket_create' => 'Safe\socket_create',
@@ -958,14 +953,23 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'socket_wsaprotocol_info_export' => 'Safe\socket_wsaprotocol_info_export',
'socket_wsaprotocol_info_import' => 'Safe\socket_wsaprotocol_info_import',
'socket_wsaprotocol_info_release' => 'Safe\socket_wsaprotocol_info_release',
- 'sodium_crypto_pwhash' => 'Safe\sodium_crypto_pwhash',
- 'sodium_crypto_pwhash_str' => 'Safe\sodium_crypto_pwhash_str',
+ 'sodium_crypto_aead_aes256gcm_decrypt' => 'Safe\sodium_crypto_aead_aes256gcm_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_encrypt',
+ 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_decrypt',
+ 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_chacha20poly1305_ietf_encrypt',
+ 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_decrypt',
+ 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => 'Safe\sodium_crypto_aead_xchacha20poly1305_ietf_encrypt',
+ 'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify',
+ 'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open',
+ 'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open',
+ 'sodium_crypto_generichash_update' => 'Safe\sodium_crypto_generichash_update',
+ 'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open',
+ 'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open',
+ 'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached',
'solr_get_version' => 'Safe\solr_get_version',
- 'sort' => 'Safe\sort',
- 'soundex' => 'Safe\soundex',
'spl_autoload_register' => 'Safe\spl_autoload_register',
'spl_autoload_unregister' => 'Safe\spl_autoload_unregister',
- 'sprintf' => 'Safe\sprintf',
'sqlsrv_begin_transaction' => 'Safe\sqlsrv_begin_transaction',
'sqlsrv_cancel' => 'Safe\sqlsrv_cancel',
'sqlsrv_client_info' => 'Safe\sqlsrv_client_info',
@@ -991,11 +995,14 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'ssh2_connect' => 'Safe\ssh2_connect',
'ssh2_disconnect' => 'Safe\ssh2_disconnect',
'ssh2_exec' => 'Safe\ssh2_exec',
+ 'ssh2_forward_accept' => 'Safe\ssh2_forward_accept',
+ 'ssh2_forward_listen' => 'Safe\ssh2_forward_listen',
'ssh2_publickey_add' => 'Safe\ssh2_publickey_add',
'ssh2_publickey_init' => 'Safe\ssh2_publickey_init',
'ssh2_publickey_remove' => 'Safe\ssh2_publickey_remove',
'ssh2_scp_recv' => 'Safe\ssh2_scp_recv',
'ssh2_scp_send' => 'Safe\ssh2_scp_send',
+ 'ssh2_send_eof' => 'Safe\ssh2_send_eof',
'ssh2_sftp' => 'Safe\ssh2_sftp',
'ssh2_sftp_chmod' => 'Safe\ssh2_sftp_chmod',
'ssh2_sftp_mkdir' => 'Safe\ssh2_sftp_mkdir',
@@ -1003,6 +1010,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'ssh2_sftp_rmdir' => 'Safe\ssh2_sftp_rmdir',
'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink',
'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink',
+ 'ssh2_shell' => 'Safe\ssh2_shell',
'stream_context_set_params' => 'Safe\stream_context_set_params',
'stream_copy_to_stream' => 'Safe\stream_copy_to_stream',
'stream_filter_append' => 'Safe\stream_filter_append',
@@ -1010,22 +1018,28 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'stream_filter_register' => 'Safe\stream_filter_register',
'stream_filter_remove' => 'Safe\stream_filter_remove',
'stream_get_contents' => 'Safe\stream_get_contents',
+ 'stream_get_line' => 'Safe\stream_get_line',
'stream_isatty' => 'Safe\stream_isatty',
'stream_resolve_include_path' => 'Safe\stream_resolve_include_path',
'stream_set_blocking' => 'Safe\stream_set_blocking',
'stream_set_timeout' => 'Safe\stream_set_timeout',
'stream_socket_accept' => 'Safe\stream_socket_accept',
'stream_socket_client' => 'Safe\stream_socket_client',
+ 'stream_socket_get_name' => 'Safe\stream_socket_get_name',
'stream_socket_pair' => 'Safe\stream_socket_pair',
+ 'stream_socket_recvfrom' => 'Safe\stream_socket_recvfrom',
+ 'stream_socket_sendto' => 'Safe\stream_socket_sendto',
'stream_socket_server' => 'Safe\stream_socket_server',
'stream_socket_shutdown' => 'Safe\stream_socket_shutdown',
'stream_supports_lock' => 'Safe\stream_supports_lock',
'stream_wrapper_register' => 'Safe\stream_wrapper_register',
'stream_wrapper_restore' => 'Safe\stream_wrapper_restore',
'stream_wrapper_unregister' => 'Safe\stream_wrapper_unregister',
+ 'strftime' => 'Safe\strftime',
'strptime' => 'Safe\strptime',
'strtotime' => 'Safe\strtotime',
- 'substr' => 'Safe\substr',
+ 'swoole_async_dns_lookup' => 'Safe\swoole_async_dns_lookup',
+ 'swoole_async_readfile' => 'Safe\swoole_async_readfile',
'swoole_async_write' => 'Safe\swoole_async_write',
'swoole_async_writefile' => 'Safe\swoole_async_writefile',
'swoole_event_defer' => 'Safe\swoole_event_defer',
@@ -1040,15 +1054,14 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'time_sleep_until' => 'Safe\time_sleep_until',
'tmpfile' => 'Safe\tmpfile',
'touch' => 'Safe\touch',
- 'uasort' => 'Safe\uasort',
- 'uksort' => 'Safe\uksort',
+ 'unixtojd' => 'Safe\unixtojd',
'unlink' => 'Safe\unlink',
'unpack' => 'Safe\unpack',
'uopz_extend' => 'Safe\uopz_extend',
'uopz_implement' => 'Safe\uopz_implement',
- 'usort' => 'Safe\usort',
+ 'variant_date_to_timestamp' => 'Safe\variant_date_to_timestamp',
+ 'variant_round' => 'Safe\variant_round',
'virtual' => 'Safe\virtual',
- 'vsprintf' => 'Safe\vsprintf',
'xdiff_file_bdiff' => 'Safe\xdiff_file_bdiff',
'xdiff_file_bpatch' => 'Safe\xdiff_file_bpatch',
'xdiff_file_diff' => 'Safe\xdiff_file_diff',
@@ -1059,9 +1072,17 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'xdiff_string_patch' => 'Safe\xdiff_string_patch',
'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary',
'xmlrpc_set_type' => 'Safe\xmlrpc_set_type',
- 'xml_parser_create' => 'Safe\xml_parser_create',
- 'xml_parser_create_ns' => 'Safe\xml_parser_create_ns',
+ 'xml_parser_free' => 'Safe\xml_parser_free',
+ 'xml_set_character_data_handler' => 'Safe\xml_set_character_data_handler',
+ 'xml_set_default_handler' => 'Safe\xml_set_default_handler',
+ 'xml_set_element_handler' => 'Safe\xml_set_element_handler',
+ 'xml_set_end_namespace_decl_handler' => 'Safe\xml_set_end_namespace_decl_handler',
+ 'xml_set_external_entity_ref_handler' => 'Safe\xml_set_external_entity_ref_handler',
+ 'xml_set_notation_decl_handler' => 'Safe\xml_set_notation_decl_handler',
'xml_set_object' => 'Safe\xml_set_object',
+ 'xml_set_processing_instruction_handler' => 'Safe\xml_set_processing_instruction_handler',
+ 'xml_set_start_namespace_decl_handler' => 'Safe\xml_set_start_namespace_decl_handler',
+ 'xml_set_unparsed_entity_decl_handler' => 'Safe\xml_set_unparsed_entity_decl_handler',
'yaml_parse' => 'Safe\yaml_parse',
'yaml_parse_file' => 'Safe\yaml_parse_file',
'yaml_parse_url' => 'Safe\yaml_parse_url',
@@ -1074,8 +1095,12 @@ return static function (ContainerConfigurator $containerConfigurator): void {
'yaz_search' => 'Safe\yaz_search',
'yaz_wait' => 'Safe\yaz_wait',
'zip_entry_close' => 'Safe\zip_entry_close',
+ 'zip_entry_compressedsize' => 'Safe\zip_entry_compressedsize',
+ 'zip_entry_compressionmethod' => 'Safe\zip_entry_compressionmethod',
+ 'zip_entry_filesize' => 'Safe\zip_entry_filesize',
+ 'zip_entry_name' => 'Safe\zip_entry_name',
'zip_entry_open' => 'Safe\zip_entry_open',
'zip_entry_read' => 'Safe\zip_entry_read',
'zlib_decode' => 'Safe\zlib_decode',
-]]]);
+ ]]]);
};
diff --git a/vendor/thecodingmachine/safe/tests/DateTimeImmutableTest.php b/vendor/thecodingmachine/safe/tests/DateTimeImmutableTest.php
new file mode 100644
index 000000000..83bdd1e8f
--- /dev/null
+++ b/vendor/thecodingmachine/safe/tests/DateTimeImmutableTest.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+use PHPUnit\Framework\TestCase;
+
+final class DateTimeImmutableTest extends TestCase
+{
+ public function testCreateFromMutable(): void
+ {
+ $unsafeDate = new \DateTime('2021-10-16T12:30:16+00:00');
+ $safeImmutableDate = \Safe\DateTimeImmutable::createFromMutable($unsafeDate);
+
+ self::assertSame($unsafeDate->format(\DateTimeInterface::ATOM), $safeImmutableDate->format(\DateTimeInterface::ATOM));
+
+ $safeDate = new \Safe\DateTime('2021-10-16T12:30:16+00:00');
+ $safeImmutableDate = \Safe\DateTimeImmutable::createFromMutable($safeDate);
+
+ self::assertSame($safeDate->format(\DateTimeInterface::ATOM), $safeImmutableDate->format(\DateTimeInterface::ATOM));
+ }
+}
diff --git a/vendor/webmozart/assert/.editorconfig b/vendor/webmozart/assert/.editorconfig
deleted file mode 100644
index 384453bfb..000000000
--- a/vendor/webmozart/assert/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-root = true
-
-[*]
-charset=utf-8
-end_of_line=lf
-trim_trailing_whitespace=true
-insert_final_newline=true
-indent_style=space
-indent_size=4
-
-[*.yml]
-indent_size=2
diff --git a/vendor/webmozart/assert/.github/workflows/ci.yaml b/vendor/webmozart/assert/.github/workflows/ci.yaml
deleted file mode 100644
index 636fc5ab5..000000000
--- a/vendor/webmozart/assert/.github/workflows/ci.yaml
+++ /dev/null
@@ -1,120 +0,0 @@
-# https://docs.github.com/en/actions
-
-name: "CI"
-
-on:
- pull_request: ~
- push:
- branches:
- - "master"
-
-env:
- COMPOSER_ROOT_VERSION: 1.99
-
-jobs:
- coding-standards:
- name: "Coding Standards"
-
- runs-on: "ubuntu-latest"
-
- steps:
- - name: "Checkout"
- uses: "actions/[email protected]"
-
- - name: "Install PHP"
- uses: "shivammathur/[email protected]"
- with:
- coverage: "none"
- extensions: "mbstring"
- php-version: "7.4"
- tools: "composer-normalize"
-
- - name: "Validate composer.json"
- run: "composer validate --strict"
-
- - name: "Normalize composer.json"
- run: "composer-normalize --dry-run"
-
- - name: "PHP-CS-Fixer"
- uses: "docker://oskarstark/php-cs-fixer-ga:2.18.0"
- with:
- args: "--dry-run --diff-format udiff"
-
- static-code-analysis:
- name: "Static Code Analysis"
-
- runs-on: "ubuntu-latest"
-
- steps:
- - name: "Checkout"
- uses: "actions/[email protected]"
-
- - name: "Install PHP"
- uses: "shivammathur/[email protected]"
- with:
- coverage: "none"
- extensions: "mbstring"
- php-version: "7.4"
-
- - name: "Install dependencies with composer"
- run: "composer update --no-interaction --no-progress && composer i --working-dir=ci"
-
- - name: "Run vimeo/psalm"
- run: "ci/vendor/bin/psalm --threads=4"
-
- tests:
- name: "Tests"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.2"
- - "7.3"
- - "7.4"
- - "8.0"
-
- steps:
- - name: "Checkout"
- uses: "actions/[email protected]"
-
- - name: "Install PHP"
- uses: "shivammathur/[email protected]"
- with:
- coverage: "none"
- extensions: "mbstring"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Install dependencies with composer"
- run: "composer update --no-interaction --no-progress"
-
- - name: "Run unit tests"
- run: "vendor/bin/phpunit"
-
- windows-tests:
- name: "Windows tests"
-
- runs-on: "windows-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.4"
-
- steps:
- - name: "Checkout"
- uses: "actions/[email protected]"
-
- - name: "Install PHP"
- uses: "shivammathur/[email protected]"
- with:
- coverage: "none"
- extensions: "mbstring"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Install dependencies with composer"
- run: "composer update --no-interaction --no-progress"
-
- - name: "Run unit tests"
- run: "vendor/bin/phpunit tests/AssertTest.php"
diff --git a/vendor/webmozart/assert/.php_cs b/vendor/webmozart/assert/.php_cs
deleted file mode 100644
index f7afd3ed7..000000000
--- a/vendor/webmozart/assert/.php_cs
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-$finder = PhpCsFixer\Finder::create()
- ->in(__DIR__.'/src')
- ->in(__DIR__.'/tests')
-;
-
-return PhpCsFixer\Config::create()
- ->setRiskyAllowed(true)
- ->setRules([
- '@PSR2' => true,
- '@Symfony' => true,
- 'ordered_imports' => true,
- 'array_syntax' => ['syntax' => 'long'],
- 'no_superfluous_phpdoc_tags' => false,
- 'phpdoc_annotation_without_dot' => false,
- 'phpdoc_types_order' => false,
- 'phpdoc_summary' => false,
- 'phpdoc_to_comment' => false,
- 'phpdoc_align' => false,
- 'yoda_style' => false,
- ])
- ->setFinder($finder)
-;
diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md
index 8629248bb..56c8011de 100644
--- a/vendor/webmozart/assert/CHANGELOG.md
+++ b/vendor/webmozart/assert/CHANGELOG.md
@@ -3,6 +3,23 @@ Changelog
## UNRELEASED
+## 1.11.0
+
+### Added
+
+* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support.
+
+### Changed
+
+* Trait methods will now check the assertion themselves, instead of using `__callStatic`
+* `isList` will now deal correctly with (modified) lists that contain `NaN`
+* `reportInvalidArgument` now has a return type of `never`.
+
+### Removed
+
+* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead.
+ * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype`
+
## 1.10.0
### Added
diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md
index b85d59817..3b2397a1a 100644
--- a/vendor/webmozart/assert/README.md
+++ b/vendor/webmozart/assert/README.md
@@ -43,8 +43,8 @@ Installation
Use [Composer] to install the package:
-```
-$ composer require webmozart/assert
+```bash
+composer require webmozart/assert
```
Example
diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json
index cfae60e5c..b340452c7 100644
--- a/vendor/webmozart/assert/composer.json
+++ b/vendor/webmozart/assert/composer.json
@@ -1,12 +1,12 @@
{
"name": "webmozart/assert",
"description": "Assertions to validate method input/output with nice error messages.",
+ "license": "MIT",
"keywords": [
"assert",
"check",
"validate"
],
- "license": "MIT",
"authors": [
{
"name": "Bernhard Schussek",
@@ -15,19 +15,14 @@
],
"require": {
"php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<4.6.1 || 4.6.2"
+ "ext-ctype": "*"
},
"require-dev": {
"phpunit/phpunit": "^8.5.13"
},
- "extra": {
- "branch-alias": {
- "dev-master": "1.10-dev"
- }
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
},
"autoload": {
"psr-4": {
@@ -39,5 +34,10 @@
"Webmozart\\Assert\\Tests\\": "tests/",
"Webmozart\\Assert\\Bin\\": "bin/src"
}
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
}
}
diff --git a/vendor/webmozart/assert/psalm.xml b/vendor/webmozart/assert/psalm.xml
deleted file mode 100644
index 9a4300819..000000000
--- a/vendor/webmozart/assert/psalm.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<psalm
- totallyTyped="true"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="https://getpsalm.org/schema/config"
- xsi:schemaLocation="https://getpsalm.org/schema/config ci/vendor/vimeo/psalm/config.xsd"
- phpVersion="7.3"
->
- <projectFiles>
- <directory name="bin" />
- <directory name="tests/static-analysis" />
- </projectFiles>
-
-</psalm>
diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php
index e0fbabc86..db1f3a51a 100644
--- a/vendor/webmozart/assert/src/Assert.php
+++ b/vendor/webmozart/assert/src/Assert.php
@@ -463,7 +463,7 @@ class Assert
static::reportInvalidArgument(\sprintf(
$message ?: 'Expected an instance of any of %2$s. Got: %s',
static::typeToString($value),
- \implode(', ', \array_map(array('static', 'valueToString'), $classes))
+ \implode(', ', \array_map(array(static::class, 'valueToString'), $classes))
));
}
@@ -485,8 +485,8 @@ class Assert
if (!\is_a($value, $class, \is_string($value))) {
static::reportInvalidArgument(sprintf(
- $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s',
- static::typeToString($value),
+ $message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s',
+ static::valueToString($value),
$class
));
}
@@ -511,8 +511,8 @@ class Assert
if (\is_a($value, $class, \is_string($value))) {
static::reportInvalidArgument(sprintf(
- $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s',
- static::typeToString($value),
+ $message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s',
+ static::valueToString($value),
$class
));
}
@@ -539,9 +539,9 @@ class Assert
}
static::reportInvalidArgument(sprintf(
- $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s',
- static::typeToString($value),
- \implode(', ', \array_map(array('static', 'valueToString'), $classes))
+ $message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s',
+ static::valueToString($value),
+ \implode(', ', $classes)
));
}
@@ -975,7 +975,7 @@ class Assert
static::reportInvalidArgument(\sprintf(
$message ?: 'Expected one of: %2$s. Got: %s',
static::valueToString($value),
- \implode(', ', \array_map(array('static', 'valueToString'), $values))
+ \implode(', ', \array_map(array(static::class, 'valueToString'), $values))
));
}
}
@@ -1822,11 +1822,24 @@ class Assert
*/
public static function isList($array, $message = '')
{
- if (!\is_array($array) || $array !== \array_values($array)) {
+ if (!\is_array($array)) {
static::reportInvalidArgument(
$message ?: 'Expected list - non-associative array.'
);
}
+
+ if ($array === \array_values($array)) {
+ return;
+ }
+
+ $nextKey = -1;
+ foreach ($array as $k => $v) {
+ if ($k !== ++$nextKey) {
+ static::reportInvalidArgument(
+ $message ?: 'Expected list - non-associative array.'
+ );
+ }
+ }
}
/**
@@ -1955,7 +1968,7 @@ class Assert
if ('nullOr' === \substr($name, 0, 6)) {
if (null !== $arguments[0]) {
$method = \lcfirst(\substr($name, 6));
- \call_user_func_array(array('static', $method), $arguments);
+ \call_user_func_array(array(static::class, $method), $arguments);
}
return;
@@ -1970,7 +1983,7 @@ class Assert
foreach ($arguments[0] as $entry) {
$args[0] = $entry;
- \call_user_func_array(array('static', $method), $args);
+ \call_user_func_array(array(static::class, $method), $args);
}
return;
@@ -2054,6 +2067,7 @@ class Assert
* @throws InvalidArgumentException
*
* @psalm-pure this method is not supposed to perform side-effects
+ * @psalm-return never
*/
protected static function reportInvalidArgument($message)
{
diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php
index 5e98823d4..0f0a75e33 100644
--- a/vendor/webmozart/assert/src/Mixin.php
+++ b/vendor/webmozart/assert/src/Mixin.php
@@ -1,9 +1,5 @@
<?php
-/**
- * provides type inference and auto-completion for magic static methods of Assert.
- */
-
namespace Webmozart\Assert;
use ArrayAccess;
@@ -12,7 +8,7 @@ use Countable;
use Throwable;
/**
- * This trait aids static analysis tooling in introspecting assertion magic methods.
+ * This trait provides nurllOr*, all* and allNullOr* variants of assertion base methods.
* Do not use this trait directly: it will change, and is not designed for reuse.
*/
trait Mixin
@@ -30,7 +26,7 @@ trait Mixin
*/
public static function nullOrString($value, $message = '')
{
- static::__callStatic('nullOrString', array($value, $message));
+ null === $value || static::string($value, $message);
}
/**
@@ -46,7 +42,31 @@ trait Mixin
*/
public static function allString($value, $message = '')
{
- static::__callStatic('allString', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::string($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<string|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrString($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::string($entry, $message);
+ }
}
/**
@@ -62,7 +82,7 @@ trait Mixin
*/
public static function nullOrStringNotEmpty($value, $message = '')
{
- static::__callStatic('nullOrStringNotEmpty', array($value, $message));
+ null === $value || static::stringNotEmpty($value, $message);
}
/**
@@ -78,7 +98,31 @@ trait Mixin
*/
public static function allStringNotEmpty($value, $message = '')
{
- static::__callStatic('allStringNotEmpty', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::stringNotEmpty($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<non-empty-string|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrStringNotEmpty($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::stringNotEmpty($entry, $message);
+ }
}
/**
@@ -94,7 +138,7 @@ trait Mixin
*/
public static function nullOrInteger($value, $message = '')
{
- static::__callStatic('nullOrInteger', array($value, $message));
+ null === $value || static::integer($value, $message);
}
/**
@@ -110,7 +154,31 @@ trait Mixin
*/
public static function allInteger($value, $message = '')
{
- static::__callStatic('allInteger', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::integer($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<int|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrInteger($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::integer($entry, $message);
+ }
}
/**
@@ -126,7 +194,7 @@ trait Mixin
*/
public static function nullOrIntegerish($value, $message = '')
{
- static::__callStatic('nullOrIntegerish', array($value, $message));
+ null === $value || static::integerish($value, $message);
}
/**
@@ -142,7 +210,31 @@ trait Mixin
*/
public static function allIntegerish($value, $message = '')
{
- static::__callStatic('allIntegerish', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::integerish($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<numeric|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIntegerish($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::integerish($entry, $message);
+ }
}
/**
@@ -158,7 +250,7 @@ trait Mixin
*/
public static function nullOrPositiveInteger($value, $message = '')
{
- static::__callStatic('nullOrPositiveInteger', array($value, $message));
+ null === $value || static::positiveInteger($value, $message);
}
/**
@@ -174,7 +266,31 @@ trait Mixin
*/
public static function allPositiveInteger($value, $message = '')
{
- static::__callStatic('allPositiveInteger', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::positiveInteger($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<positive-int|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrPositiveInteger($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::positiveInteger($entry, $message);
+ }
}
/**
@@ -190,7 +306,7 @@ trait Mixin
*/
public static function nullOrFloat($value, $message = '')
{
- static::__callStatic('nullOrFloat', array($value, $message));
+ null === $value || static::float($value, $message);
}
/**
@@ -206,7 +322,31 @@ trait Mixin
*/
public static function allFloat($value, $message = '')
{
- static::__callStatic('allFloat', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::float($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<float|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrFloat($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::float($entry, $message);
+ }
}
/**
@@ -222,7 +362,7 @@ trait Mixin
*/
public static function nullOrNumeric($value, $message = '')
{
- static::__callStatic('nullOrNumeric', array($value, $message));
+ null === $value || static::numeric($value, $message);
}
/**
@@ -238,7 +378,31 @@ trait Mixin
*/
public static function allNumeric($value, $message = '')
{
- static::__callStatic('allNumeric', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::numeric($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<numeric|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNumeric($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::numeric($entry, $message);
+ }
}
/**
@@ -254,7 +418,7 @@ trait Mixin
*/
public static function nullOrNatural($value, $message = '')
{
- static::__callStatic('nullOrNatural', array($value, $message));
+ null === $value || static::natural($value, $message);
}
/**
@@ -270,7 +434,31 @@ trait Mixin
*/
public static function allNatural($value, $message = '')
{
- static::__callStatic('allNatural', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::natural($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<positive-int|0|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNatural($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::natural($entry, $message);
+ }
}
/**
@@ -286,7 +474,7 @@ trait Mixin
*/
public static function nullOrBoolean($value, $message = '')
{
- static::__callStatic('nullOrBoolean', array($value, $message));
+ null === $value || static::boolean($value, $message);
}
/**
@@ -302,7 +490,31 @@ trait Mixin
*/
public static function allBoolean($value, $message = '')
{
- static::__callStatic('allBoolean', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::boolean($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<bool|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrBoolean($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::boolean($entry, $message);
+ }
}
/**
@@ -318,7 +530,7 @@ trait Mixin
*/
public static function nullOrScalar($value, $message = '')
{
- static::__callStatic('nullOrScalar', array($value, $message));
+ null === $value || static::scalar($value, $message);
}
/**
@@ -334,7 +546,31 @@ trait Mixin
*/
public static function allScalar($value, $message = '')
{
- static::__callStatic('allScalar', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::scalar($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<scalar|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrScalar($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::scalar($entry, $message);
+ }
}
/**
@@ -350,7 +586,7 @@ trait Mixin
*/
public static function nullOrObject($value, $message = '')
{
- static::__callStatic('nullOrObject', array($value, $message));
+ null === $value || static::object($value, $message);
}
/**
@@ -366,7 +602,31 @@ trait Mixin
*/
public static function allObject($value, $message = '')
{
- static::__callStatic('allObject', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::object($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<object|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrObject($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::object($entry, $message);
+ }
}
/**
@@ -383,7 +643,7 @@ trait Mixin
*/
public static function nullOrResource($value, $type = null, $message = '')
{
- static::__callStatic('nullOrResource', array($value, $type, $message));
+ null === $value || static::resource($value, $type, $message);
}
/**
@@ -400,7 +660,32 @@ trait Mixin
*/
public static function allResource($value, $type = null, $message = '')
{
- static::__callStatic('allResource', array($value, $type, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::resource($entry, $type, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<resource|null> $value
+ *
+ * @param mixed $value
+ * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrResource($value, $type = null, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::resource($entry, $type, $message);
+ }
}
/**
@@ -416,7 +701,7 @@ trait Mixin
*/
public static function nullOrIsCallable($value, $message = '')
{
- static::__callStatic('nullOrIsCallable', array($value, $message));
+ null === $value || static::isCallable($value, $message);
}
/**
@@ -432,7 +717,31 @@ trait Mixin
*/
public static function allIsCallable($value, $message = '')
{
- static::__callStatic('allIsCallable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isCallable($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<callable|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsCallable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isCallable($entry, $message);
+ }
}
/**
@@ -448,7 +757,7 @@ trait Mixin
*/
public static function nullOrIsArray($value, $message = '')
{
- static::__callStatic('nullOrIsArray', array($value, $message));
+ null === $value || static::isArray($value, $message);
}
/**
@@ -464,7 +773,31 @@ trait Mixin
*/
public static function allIsArray($value, $message = '')
{
- static::__callStatic('allIsArray', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isArray($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<array|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsArray($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isArray($entry, $message);
+ }
}
/**
@@ -482,7 +815,7 @@ trait Mixin
*/
public static function nullOrIsTraversable($value, $message = '')
{
- static::__callStatic('nullOrIsTraversable', array($value, $message));
+ null === $value || static::isTraversable($value, $message);
}
/**
@@ -500,7 +833,33 @@ trait Mixin
*/
public static function allIsTraversable($value, $message = '')
{
- static::__callStatic('allIsTraversable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isTraversable($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<iterable|null> $value
+ *
+ * @deprecated use "isIterable" or "isInstanceOf" instead
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsTraversable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isTraversable($entry, $message);
+ }
}
/**
@@ -516,7 +875,7 @@ trait Mixin
*/
public static function nullOrIsArrayAccessible($value, $message = '')
{
- static::__callStatic('nullOrIsArrayAccessible', array($value, $message));
+ null === $value || static::isArrayAccessible($value, $message);
}
/**
@@ -532,7 +891,31 @@ trait Mixin
*/
public static function allIsArrayAccessible($value, $message = '')
{
- static::__callStatic('allIsArrayAccessible', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isArrayAccessible($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<array|ArrayAccess|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsArrayAccessible($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isArrayAccessible($entry, $message);
+ }
}
/**
@@ -548,7 +931,7 @@ trait Mixin
*/
public static function nullOrIsCountable($value, $message = '')
{
- static::__callStatic('nullOrIsCountable', array($value, $message));
+ null === $value || static::isCountable($value, $message);
}
/**
@@ -564,7 +947,31 @@ trait Mixin
*/
public static function allIsCountable($value, $message = '')
{
- static::__callStatic('allIsCountable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isCountable($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<countable|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsCountable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isCountable($entry, $message);
+ }
}
/**
@@ -580,7 +987,7 @@ trait Mixin
*/
public static function nullOrIsIterable($value, $message = '')
{
- static::__callStatic('nullOrIsIterable', array($value, $message));
+ null === $value || static::isIterable($value, $message);
}
/**
@@ -596,7 +1003,31 @@ trait Mixin
*/
public static function allIsIterable($value, $message = '')
{
- static::__callStatic('allIsIterable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isIterable($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<iterable|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsIterable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isIterable($entry, $message);
+ }
}
/**
@@ -615,7 +1046,7 @@ trait Mixin
*/
public static function nullOrIsInstanceOf($value, $class, $message = '')
{
- static::__callStatic('nullOrIsInstanceOf', array($value, $class, $message));
+ null === $value || static::isInstanceOf($value, $class, $message);
}
/**
@@ -634,7 +1065,34 @@ trait Mixin
*/
public static function allIsInstanceOf($value, $class, $message = '')
{
- static::__callStatic('allIsInstanceOf', array($value, $class, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isInstanceOf($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $class
+ * @psalm-assert iterable<ExpectedType|null> $value
+ *
+ * @param mixed $value
+ * @param string|object $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsInstanceOf($value, $class, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isInstanceOf($entry, $class, $message);
+ }
}
/**
@@ -652,7 +1110,7 @@ trait Mixin
*/
public static function nullOrNotInstanceOf($value, $class, $message = '')
{
- static::__callStatic('nullOrNotInstanceOf', array($value, $class, $message));
+ null === $value || static::notInstanceOf($value, $class, $message);
}
/**
@@ -670,7 +1128,34 @@ trait Mixin
*/
public static function allNotInstanceOf($value, $class, $message = '')
{
- static::__callStatic('allNotInstanceOf', array($value, $class, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notInstanceOf($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $class
+ * @psalm-assert iterable<!ExpectedType|null> $value
+ *
+ * @param mixed $value
+ * @param string|object $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotInstanceOf($value, $class, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notInstanceOf($entry, $class, $message);
+ }
}
/**
@@ -687,7 +1172,7 @@ trait Mixin
*/
public static function nullOrIsInstanceOfAny($value, $classes, $message = '')
{
- static::__callStatic('nullOrIsInstanceOfAny', array($value, $classes, $message));
+ null === $value || static::isInstanceOfAny($value, $classes, $message);
}
/**
@@ -704,7 +1189,32 @@ trait Mixin
*/
public static function allIsInstanceOfAny($value, $classes, $message = '')
{
- static::__callStatic('allIsInstanceOfAny', array($value, $classes, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isInstanceOfAny($entry, $classes, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param array<class-string> $classes
+ *
+ * @param mixed $value
+ * @param array<object|string> $classes
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsInstanceOfAny($value, $classes, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isInstanceOfAny($entry, $classes, $message);
+ }
}
/**
@@ -723,7 +1233,7 @@ trait Mixin
*/
public static function nullOrIsAOf($value, $class, $message = '')
{
- static::__callStatic('nullOrIsAOf', array($value, $class, $message));
+ null === $value || static::isAOf($value, $class, $message);
}
/**
@@ -742,7 +1252,34 @@ trait Mixin
*/
public static function allIsAOf($value, $class, $message = '')
{
- static::__callStatic('allIsAOf', array($value, $class, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isAOf($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $class
+ * @psalm-assert iterable<ExpectedType|class-string<ExpectedType>|null> $value
+ *
+ * @param iterable<object|string|null> $value
+ * @param string $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsAOf($value, $class, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isAOf($entry, $class, $message);
+ }
}
/**
@@ -760,7 +1297,7 @@ trait Mixin
*/
public static function nullOrIsNotA($value, $class, $message = '')
{
- static::__callStatic('nullOrIsNotA', array($value, $class, $message));
+ null === $value || static::isNotA($value, $class, $message);
}
/**
@@ -778,7 +1315,35 @@ trait Mixin
*/
public static function allIsNotA($value, $class, $message = '')
{
- static::__callStatic('allIsNotA', array($value, $class, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isNotA($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template UnexpectedType of object
+ * @psalm-param class-string<UnexpectedType> $class
+ * @psalm-assert iterable<!UnexpectedType|null> $value
+ * @psalm-assert iterable<!class-string<UnexpectedType>|null> $value
+ *
+ * @param iterable<object|string|null> $value
+ * @param string $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsNotA($value, $class, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isNotA($entry, $class, $message);
+ }
}
/**
@@ -795,7 +1360,7 @@ trait Mixin
*/
public static function nullOrIsAnyOf($value, $classes, $message = '')
{
- static::__callStatic('nullOrIsAnyOf', array($value, $classes, $message));
+ null === $value || static::isAnyOf($value, $classes, $message);
}
/**
@@ -812,7 +1377,32 @@ trait Mixin
*/
public static function allIsAnyOf($value, $classes, $message = '')
{
- static::__callStatic('allIsAnyOf', array($value, $classes, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isAnyOf($entry, $classes, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param array<class-string> $classes
+ *
+ * @param iterable<object|string|null> $value
+ * @param string[] $classes
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsAnyOf($value, $classes, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isAnyOf($entry, $classes, $message);
+ }
}
/**
@@ -828,7 +1418,7 @@ trait Mixin
*/
public static function nullOrIsEmpty($value, $message = '')
{
- static::__callStatic('nullOrIsEmpty', array($value, $message));
+ null === $value || static::isEmpty($value, $message);
}
/**
@@ -844,7 +1434,31 @@ trait Mixin
*/
public static function allIsEmpty($value, $message = '')
{
- static::__callStatic('allIsEmpty', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::isEmpty($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<empty|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsEmpty($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::isEmpty($entry, $message);
+ }
}
/**
@@ -859,7 +1473,7 @@ trait Mixin
*/
public static function nullOrNotEmpty($value, $message = '')
{
- static::__callStatic('nullOrNotEmpty', array($value, $message));
+ null === $value || static::notEmpty($value, $message);
}
/**
@@ -874,7 +1488,31 @@ trait Mixin
*/
public static function allNotEmpty($value, $message = '')
{
- static::__callStatic('allNotEmpty', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notEmpty($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<!empty|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotEmpty($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notEmpty($entry, $message);
+ }
}
/**
@@ -890,7 +1528,11 @@ trait Mixin
*/
public static function allNull($value, $message = '')
{
- static::__callStatic('allNull', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::null($entry, $message);
+ }
}
/**
@@ -905,7 +1547,11 @@ trait Mixin
*/
public static function allNotNull($value, $message = '')
{
- static::__callStatic('allNotNull', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notNull($entry, $message);
+ }
}
/**
@@ -921,7 +1567,7 @@ trait Mixin
*/
public static function nullOrTrue($value, $message = '')
{
- static::__callStatic('nullOrTrue', array($value, $message));
+ null === $value || static::true($value, $message);
}
/**
@@ -937,7 +1583,31 @@ trait Mixin
*/
public static function allTrue($value, $message = '')
{
- static::__callStatic('allTrue', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::true($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<true|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrTrue($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::true($entry, $message);
+ }
}
/**
@@ -953,7 +1623,7 @@ trait Mixin
*/
public static function nullOrFalse($value, $message = '')
{
- static::__callStatic('nullOrFalse', array($value, $message));
+ null === $value || static::false($value, $message);
}
/**
@@ -969,7 +1639,31 @@ trait Mixin
*/
public static function allFalse($value, $message = '')
{
- static::__callStatic('allFalse', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::false($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<false|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrFalse($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::false($entry, $message);
+ }
}
/**
@@ -984,7 +1678,7 @@ trait Mixin
*/
public static function nullOrNotFalse($value, $message = '')
{
- static::__callStatic('nullOrNotFalse', array($value, $message));
+ null === $value || static::notFalse($value, $message);
}
/**
@@ -999,7 +1693,31 @@ trait Mixin
*/
public static function allNotFalse($value, $message = '')
{
- static::__callStatic('allNotFalse', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notFalse($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<!false|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotFalse($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notFalse($entry, $message);
+ }
}
/**
@@ -1012,7 +1730,7 @@ trait Mixin
*/
public static function nullOrIp($value, $message = '')
{
- static::__callStatic('nullOrIp', array($value, $message));
+ null === $value || static::ip($value, $message);
}
/**
@@ -1025,7 +1743,28 @@ trait Mixin
*/
public static function allIp($value, $message = '')
{
- static::__callStatic('allIp', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::ip($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIp($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::ip($entry, $message);
+ }
}
/**
@@ -1038,7 +1777,7 @@ trait Mixin
*/
public static function nullOrIpv4($value, $message = '')
{
- static::__callStatic('nullOrIpv4', array($value, $message));
+ null === $value || static::ipv4($value, $message);
}
/**
@@ -1051,7 +1790,28 @@ trait Mixin
*/
public static function allIpv4($value, $message = '')
{
- static::__callStatic('allIpv4', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::ipv4($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIpv4($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::ipv4($entry, $message);
+ }
}
/**
@@ -1064,7 +1824,7 @@ trait Mixin
*/
public static function nullOrIpv6($value, $message = '')
{
- static::__callStatic('nullOrIpv6', array($value, $message));
+ null === $value || static::ipv6($value, $message);
}
/**
@@ -1077,7 +1837,28 @@ trait Mixin
*/
public static function allIpv6($value, $message = '')
{
- static::__callStatic('allIpv6', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::ipv6($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIpv6($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::ipv6($entry, $message);
+ }
}
/**
@@ -1090,7 +1871,7 @@ trait Mixin
*/
public static function nullOrEmail($value, $message = '')
{
- static::__callStatic('nullOrEmail', array($value, $message));
+ null === $value || static::email($value, $message);
}
/**
@@ -1103,7 +1884,28 @@ trait Mixin
*/
public static function allEmail($value, $message = '')
{
- static::__callStatic('allEmail', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::email($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrEmail($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::email($entry, $message);
+ }
}
/**
@@ -1116,7 +1918,7 @@ trait Mixin
*/
public static function nullOrUniqueValues($values, $message = '')
{
- static::__callStatic('nullOrUniqueValues', array($values, $message));
+ null === $values || static::uniqueValues($values, $message);
}
/**
@@ -1129,7 +1931,28 @@ trait Mixin
*/
public static function allUniqueValues($values, $message = '')
{
- static::__callStatic('allUniqueValues', array($values, $message));
+ static::isIterable($values);
+
+ foreach ($values as $entry) {
+ static::uniqueValues($entry, $message);
+ }
+ }
+
+ /**
+ * @param iterable<array|null> $values
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrUniqueValues($values, $message = '')
+ {
+ static::isIterable($values);
+
+ foreach ($values as $entry) {
+ null === $entry || static::uniqueValues($entry, $message);
+ }
}
/**
@@ -1143,7 +1966,7 @@ trait Mixin
*/
public static function nullOrEq($value, $expect, $message = '')
{
- static::__callStatic('nullOrEq', array($value, $expect, $message));
+ null === $value || static::eq($value, $expect, $message);
}
/**
@@ -1157,7 +1980,29 @@ trait Mixin
*/
public static function allEq($value, $expect, $message = '')
{
- static::__callStatic('allEq', array($value, $expect, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::eq($entry, $expect, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param mixed $expect
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrEq($value, $expect, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::eq($entry, $expect, $message);
+ }
}
/**
@@ -1171,7 +2016,7 @@ trait Mixin
*/
public static function nullOrNotEq($value, $expect, $message = '')
{
- static::__callStatic('nullOrNotEq', array($value, $expect, $message));
+ null === $value || static::notEq($value, $expect, $message);
}
/**
@@ -1185,7 +2030,29 @@ trait Mixin
*/
public static function allNotEq($value, $expect, $message = '')
{
- static::__callStatic('allNotEq', array($value, $expect, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notEq($entry, $expect, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param mixed $expect
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotEq($value, $expect, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notEq($entry, $expect, $message);
+ }
}
/**
@@ -1201,7 +2068,7 @@ trait Mixin
*/
public static function nullOrSame($value, $expect, $message = '')
{
- static::__callStatic('nullOrSame', array($value, $expect, $message));
+ null === $value || static::same($value, $expect, $message);
}
/**
@@ -1217,7 +2084,31 @@ trait Mixin
*/
public static function allSame($value, $expect, $message = '')
{
- static::__callStatic('allSame', array($value, $expect, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::same($entry, $expect, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $expect
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrSame($value, $expect, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::same($entry, $expect, $message);
+ }
}
/**
@@ -1233,7 +2124,7 @@ trait Mixin
*/
public static function nullOrNotSame($value, $expect, $message = '')
{
- static::__callStatic('nullOrNotSame', array($value, $expect, $message));
+ null === $value || static::notSame($value, $expect, $message);
}
/**
@@ -1249,7 +2140,31 @@ trait Mixin
*/
public static function allNotSame($value, $expect, $message = '')
{
- static::__callStatic('allNotSame', array($value, $expect, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notSame($entry, $expect, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $expect
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotSame($value, $expect, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notSame($entry, $expect, $message);
+ }
}
/**
@@ -1265,7 +2180,7 @@ trait Mixin
*/
public static function nullOrGreaterThan($value, $limit, $message = '')
{
- static::__callStatic('nullOrGreaterThan', array($value, $limit, $message));
+ null === $value || static::greaterThan($value, $limit, $message);
}
/**
@@ -1281,7 +2196,31 @@ trait Mixin
*/
public static function allGreaterThan($value, $limit, $message = '')
{
- static::__callStatic('allGreaterThan', array($value, $limit, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::greaterThan($entry, $limit, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrGreaterThan($value, $limit, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::greaterThan($entry, $limit, $message);
+ }
}
/**
@@ -1297,7 +2236,7 @@ trait Mixin
*/
public static function nullOrGreaterThanEq($value, $limit, $message = '')
{
- static::__callStatic('nullOrGreaterThanEq', array($value, $limit, $message));
+ null === $value || static::greaterThanEq($value, $limit, $message);
}
/**
@@ -1313,7 +2252,31 @@ trait Mixin
*/
public static function allGreaterThanEq($value, $limit, $message = '')
{
- static::__callStatic('allGreaterThanEq', array($value, $limit, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::greaterThanEq($entry, $limit, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrGreaterThanEq($value, $limit, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::greaterThanEq($entry, $limit, $message);
+ }
}
/**
@@ -1329,7 +2292,7 @@ trait Mixin
*/
public static function nullOrLessThan($value, $limit, $message = '')
{
- static::__callStatic('nullOrLessThan', array($value, $limit, $message));
+ null === $value || static::lessThan($value, $limit, $message);
}
/**
@@ -1345,7 +2308,31 @@ trait Mixin
*/
public static function allLessThan($value, $limit, $message = '')
{
- static::__callStatic('allLessThan', array($value, $limit, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::lessThan($entry, $limit, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrLessThan($value, $limit, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::lessThan($entry, $limit, $message);
+ }
}
/**
@@ -1361,7 +2348,7 @@ trait Mixin
*/
public static function nullOrLessThanEq($value, $limit, $message = '')
{
- static::__callStatic('nullOrLessThanEq', array($value, $limit, $message));
+ null === $value || static::lessThanEq($value, $limit, $message);
}
/**
@@ -1377,7 +2364,31 @@ trait Mixin
*/
public static function allLessThanEq($value, $limit, $message = '')
{
- static::__callStatic('allLessThanEq', array($value, $limit, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::lessThanEq($entry, $limit, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $limit
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrLessThanEq($value, $limit, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::lessThanEq($entry, $limit, $message);
+ }
}
/**
@@ -1394,7 +2405,7 @@ trait Mixin
*/
public static function nullOrRange($value, $min, $max, $message = '')
{
- static::__callStatic('nullOrRange', array($value, $min, $max, $message));
+ null === $value || static::range($value, $min, $max, $message);
}
/**
@@ -1411,7 +2422,32 @@ trait Mixin
*/
public static function allRange($value, $min, $max, $message = '')
{
- static::__callStatic('allRange', array($value, $min, $max, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::range($entry, $min, $max, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param mixed $min
+ * @param mixed $max
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrRange($value, $min, $max, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::range($entry, $min, $max, $message);
+ }
}
/**
@@ -1427,7 +2463,7 @@ trait Mixin
*/
public static function nullOrOneOf($value, $values, $message = '')
{
- static::__callStatic('nullOrOneOf', array($value, $values, $message));
+ null === $value || static::oneOf($value, $values, $message);
}
/**
@@ -1443,7 +2479,31 @@ trait Mixin
*/
public static function allOneOf($value, $values, $message = '')
{
- static::__callStatic('allOneOf', array($value, $values, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::oneOf($entry, $values, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param array $values
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrOneOf($value, $values, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::oneOf($entry, $values, $message);
+ }
}
/**
@@ -1459,7 +2519,7 @@ trait Mixin
*/
public static function nullOrInArray($value, $values, $message = '')
{
- static::__callStatic('nullOrInArray', array($value, $values, $message));
+ null === $value || static::inArray($value, $values, $message);
}
/**
@@ -1475,7 +2535,31 @@ trait Mixin
*/
public static function allInArray($value, $values, $message = '')
{
- static::__callStatic('allInArray', array($value, $values, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::inArray($entry, $values, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param array $values
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrInArray($value, $values, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::inArray($entry, $values, $message);
+ }
}
/**
@@ -1491,7 +2575,7 @@ trait Mixin
*/
public static function nullOrContains($value, $subString, $message = '')
{
- static::__callStatic('nullOrContains', array($value, $subString, $message));
+ null === $value || static::contains($value, $subString, $message);
}
/**
@@ -1507,7 +2591,31 @@ trait Mixin
*/
public static function allContains($value, $subString, $message = '')
{
- static::__callStatic('allContains', array($value, $subString, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::contains($entry, $subString, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $subString
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrContains($value, $subString, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::contains($entry, $subString, $message);
+ }
}
/**
@@ -1523,7 +2631,7 @@ trait Mixin
*/
public static function nullOrNotContains($value, $subString, $message = '')
{
- static::__callStatic('nullOrNotContains', array($value, $subString, $message));
+ null === $value || static::notContains($value, $subString, $message);
}
/**
@@ -1539,7 +2647,31 @@ trait Mixin
*/
public static function allNotContains($value, $subString, $message = '')
{
- static::__callStatic('allNotContains', array($value, $subString, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notContains($entry, $subString, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $subString
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotContains($value, $subString, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notContains($entry, $subString, $message);
+ }
}
/**
@@ -1554,7 +2686,7 @@ trait Mixin
*/
public static function nullOrNotWhitespaceOnly($value, $message = '')
{
- static::__callStatic('nullOrNotWhitespaceOnly', array($value, $message));
+ null === $value || static::notWhitespaceOnly($value, $message);
}
/**
@@ -1569,7 +2701,30 @@ trait Mixin
*/
public static function allNotWhitespaceOnly($value, $message = '')
{
- static::__callStatic('allNotWhitespaceOnly', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notWhitespaceOnly($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotWhitespaceOnly($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notWhitespaceOnly($entry, $message);
+ }
}
/**
@@ -1585,7 +2740,7 @@ trait Mixin
*/
public static function nullOrStartsWith($value, $prefix, $message = '')
{
- static::__callStatic('nullOrStartsWith', array($value, $prefix, $message));
+ null === $value || static::startsWith($value, $prefix, $message);
}
/**
@@ -1601,7 +2756,31 @@ trait Mixin
*/
public static function allStartsWith($value, $prefix, $message = '')
{
- static::__callStatic('allStartsWith', array($value, $prefix, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::startsWith($entry, $prefix, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $prefix
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrStartsWith($value, $prefix, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::startsWith($entry, $prefix, $message);
+ }
}
/**
@@ -1617,7 +2796,7 @@ trait Mixin
*/
public static function nullOrNotStartsWith($value, $prefix, $message = '')
{
- static::__callStatic('nullOrNotStartsWith', array($value, $prefix, $message));
+ null === $value || static::notStartsWith($value, $prefix, $message);
}
/**
@@ -1633,7 +2812,31 @@ trait Mixin
*/
public static function allNotStartsWith($value, $prefix, $message = '')
{
- static::__callStatic('allNotStartsWith', array($value, $prefix, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notStartsWith($entry, $prefix, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $prefix
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotStartsWith($value, $prefix, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notStartsWith($entry, $prefix, $message);
+ }
}
/**
@@ -1648,7 +2851,7 @@ trait Mixin
*/
public static function nullOrStartsWithLetter($value, $message = '')
{
- static::__callStatic('nullOrStartsWithLetter', array($value, $message));
+ null === $value || static::startsWithLetter($value, $message);
}
/**
@@ -1663,7 +2866,30 @@ trait Mixin
*/
public static function allStartsWithLetter($value, $message = '')
{
- static::__callStatic('allStartsWithLetter', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::startsWithLetter($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrStartsWithLetter($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::startsWithLetter($entry, $message);
+ }
}
/**
@@ -1679,7 +2905,7 @@ trait Mixin
*/
public static function nullOrEndsWith($value, $suffix, $message = '')
{
- static::__callStatic('nullOrEndsWith', array($value, $suffix, $message));
+ null === $value || static::endsWith($value, $suffix, $message);
}
/**
@@ -1695,7 +2921,31 @@ trait Mixin
*/
public static function allEndsWith($value, $suffix, $message = '')
{
- static::__callStatic('allEndsWith', array($value, $suffix, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::endsWith($entry, $suffix, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $suffix
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrEndsWith($value, $suffix, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::endsWith($entry, $suffix, $message);
+ }
}
/**
@@ -1711,7 +2961,7 @@ trait Mixin
*/
public static function nullOrNotEndsWith($value, $suffix, $message = '')
{
- static::__callStatic('nullOrNotEndsWith', array($value, $suffix, $message));
+ null === $value || static::notEndsWith($value, $suffix, $message);
}
/**
@@ -1727,7 +2977,31 @@ trait Mixin
*/
public static function allNotEndsWith($value, $suffix, $message = '')
{
- static::__callStatic('allNotEndsWith', array($value, $suffix, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notEndsWith($entry, $suffix, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $suffix
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotEndsWith($value, $suffix, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notEndsWith($entry, $suffix, $message);
+ }
}
/**
@@ -1743,7 +3017,7 @@ trait Mixin
*/
public static function nullOrRegex($value, $pattern, $message = '')
{
- static::__callStatic('nullOrRegex', array($value, $pattern, $message));
+ null === $value || static::regex($value, $pattern, $message);
}
/**
@@ -1759,7 +3033,31 @@ trait Mixin
*/
public static function allRegex($value, $pattern, $message = '')
{
- static::__callStatic('allRegex', array($value, $pattern, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::regex($entry, $pattern, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $pattern
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrRegex($value, $pattern, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::regex($entry, $pattern, $message);
+ }
}
/**
@@ -1775,7 +3073,7 @@ trait Mixin
*/
public static function nullOrNotRegex($value, $pattern, $message = '')
{
- static::__callStatic('nullOrNotRegex', array($value, $pattern, $message));
+ null === $value || static::notRegex($value, $pattern, $message);
}
/**
@@ -1791,7 +3089,31 @@ trait Mixin
*/
public static function allNotRegex($value, $pattern, $message = '')
{
- static::__callStatic('allNotRegex', array($value, $pattern, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::notRegex($entry, $pattern, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $pattern
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrNotRegex($value, $pattern, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::notRegex($entry, $pattern, $message);
+ }
}
/**
@@ -1806,7 +3128,7 @@ trait Mixin
*/
public static function nullOrUnicodeLetters($value, $message = '')
{
- static::__callStatic('nullOrUnicodeLetters', array($value, $message));
+ null === $value || static::unicodeLetters($value, $message);
}
/**
@@ -1821,7 +3143,30 @@ trait Mixin
*/
public static function allUnicodeLetters($value, $message = '')
{
- static::__callStatic('allUnicodeLetters', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::unicodeLetters($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrUnicodeLetters($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::unicodeLetters($entry, $message);
+ }
}
/**
@@ -1836,7 +3181,7 @@ trait Mixin
*/
public static function nullOrAlpha($value, $message = '')
{
- static::__callStatic('nullOrAlpha', array($value, $message));
+ null === $value || static::alpha($value, $message);
}
/**
@@ -1851,7 +3196,30 @@ trait Mixin
*/
public static function allAlpha($value, $message = '')
{
- static::__callStatic('allAlpha', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::alpha($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrAlpha($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::alpha($entry, $message);
+ }
}
/**
@@ -1866,7 +3234,7 @@ trait Mixin
*/
public static function nullOrDigits($value, $message = '')
{
- static::__callStatic('nullOrDigits', array($value, $message));
+ null === $value || static::digits($value, $message);
}
/**
@@ -1881,7 +3249,30 @@ trait Mixin
*/
public static function allDigits($value, $message = '')
{
- static::__callStatic('allDigits', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::digits($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrDigits($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::digits($entry, $message);
+ }
}
/**
@@ -1896,7 +3287,7 @@ trait Mixin
*/
public static function nullOrAlnum($value, $message = '')
{
- static::__callStatic('nullOrAlnum', array($value, $message));
+ null === $value || static::alnum($value, $message);
}
/**
@@ -1911,7 +3302,30 @@ trait Mixin
*/
public static function allAlnum($value, $message = '')
{
- static::__callStatic('allAlnum', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::alnum($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrAlnum($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::alnum($entry, $message);
+ }
}
/**
@@ -1927,7 +3341,7 @@ trait Mixin
*/
public static function nullOrLower($value, $message = '')
{
- static::__callStatic('nullOrLower', array($value, $message));
+ null === $value || static::lower($value, $message);
}
/**
@@ -1943,7 +3357,31 @@ trait Mixin
*/
public static function allLower($value, $message = '')
{
- static::__callStatic('allLower', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::lower($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<lowercase-string|null> $value
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrLower($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::lower($entry, $message);
+ }
}
/**
@@ -1958,7 +3396,7 @@ trait Mixin
*/
public static function nullOrUpper($value, $message = '')
{
- static::__callStatic('nullOrUpper', array($value, $message));
+ null === $value || static::upper($value, $message);
}
/**
@@ -1973,7 +3411,31 @@ trait Mixin
*/
public static function allUpper($value, $message = '')
{
- static::__callStatic('allUpper', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::upper($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<!lowercase-string|null> $value
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrUpper($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::upper($entry, $message);
+ }
}
/**
@@ -1989,7 +3451,7 @@ trait Mixin
*/
public static function nullOrLength($value, $length, $message = '')
{
- static::__callStatic('nullOrLength', array($value, $length, $message));
+ null === $value || static::length($value, $length, $message);
}
/**
@@ -2005,7 +3467,31 @@ trait Mixin
*/
public static function allLength($value, $length, $message = '')
{
- static::__callStatic('allLength', array($value, $length, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::length($entry, $length, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param int $length
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrLength($value, $length, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::length($entry, $length, $message);
+ }
}
/**
@@ -2021,7 +3507,7 @@ trait Mixin
*/
public static function nullOrMinLength($value, $min, $message = '')
{
- static::__callStatic('nullOrMinLength', array($value, $min, $message));
+ null === $value || static::minLength($value, $min, $message);
}
/**
@@ -2037,7 +3523,31 @@ trait Mixin
*/
public static function allMinLength($value, $min, $message = '')
{
- static::__callStatic('allMinLength', array($value, $min, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::minLength($entry, $min, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param int|float $min
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMinLength($value, $min, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::minLength($entry, $min, $message);
+ }
}
/**
@@ -2053,7 +3563,7 @@ trait Mixin
*/
public static function nullOrMaxLength($value, $max, $message = '')
{
- static::__callStatic('nullOrMaxLength', array($value, $max, $message));
+ null === $value || static::maxLength($value, $max, $message);
}
/**
@@ -2069,7 +3579,31 @@ trait Mixin
*/
public static function allMaxLength($value, $max, $message = '')
{
- static::__callStatic('allMaxLength', array($value, $max, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::maxLength($entry, $max, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param int|float $max
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMaxLength($value, $max, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::maxLength($entry, $max, $message);
+ }
}
/**
@@ -2086,7 +3620,7 @@ trait Mixin
*/
public static function nullOrLengthBetween($value, $min, $max, $message = '')
{
- static::__callStatic('nullOrLengthBetween', array($value, $min, $max, $message));
+ null === $value || static::lengthBetween($value, $min, $max, $message);
}
/**
@@ -2103,7 +3637,32 @@ trait Mixin
*/
public static function allLengthBetween($value, $min, $max, $message = '')
{
- static::__callStatic('allLengthBetween', array($value, $min, $max, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::lengthBetween($entry, $min, $max, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param int|float $min
+ * @param int|float $max
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrLengthBetween($value, $min, $max, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::lengthBetween($entry, $min, $max, $message);
+ }
}
/**
@@ -2116,7 +3675,7 @@ trait Mixin
*/
public static function nullOrFileExists($value, $message = '')
{
- static::__callStatic('nullOrFileExists', array($value, $message));
+ null === $value || static::fileExists($value, $message);
}
/**
@@ -2129,7 +3688,28 @@ trait Mixin
*/
public static function allFileExists($value, $message = '')
{
- static::__callStatic('allFileExists', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::fileExists($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrFileExists($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::fileExists($entry, $message);
+ }
}
/**
@@ -2142,7 +3722,7 @@ trait Mixin
*/
public static function nullOrFile($value, $message = '')
{
- static::__callStatic('nullOrFile', array($value, $message));
+ null === $value || static::file($value, $message);
}
/**
@@ -2155,7 +3735,28 @@ trait Mixin
*/
public static function allFile($value, $message = '')
{
- static::__callStatic('allFile', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::file($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrFile($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::file($entry, $message);
+ }
}
/**
@@ -2168,7 +3769,7 @@ trait Mixin
*/
public static function nullOrDirectory($value, $message = '')
{
- static::__callStatic('nullOrDirectory', array($value, $message));
+ null === $value || static::directory($value, $message);
}
/**
@@ -2181,7 +3782,28 @@ trait Mixin
*/
public static function allDirectory($value, $message = '')
{
- static::__callStatic('allDirectory', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::directory($entry, $message);
+ }
+ }
+
+ /**
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrDirectory($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::directory($entry, $message);
+ }
}
/**
@@ -2194,7 +3816,7 @@ trait Mixin
*/
public static function nullOrReadable($value, $message = '')
{
- static::__callStatic('nullOrReadable', array($value, $message));
+ null === $value || static::readable($value, $message);
}
/**
@@ -2207,7 +3829,28 @@ trait Mixin
*/
public static function allReadable($value, $message = '')
{
- static::__callStatic('allReadable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::readable($entry, $message);
+ }
+ }
+
+ /**
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrReadable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::readable($entry, $message);
+ }
}
/**
@@ -2220,7 +3863,7 @@ trait Mixin
*/
public static function nullOrWritable($value, $message = '')
{
- static::__callStatic('nullOrWritable', array($value, $message));
+ null === $value || static::writable($value, $message);
}
/**
@@ -2233,7 +3876,28 @@ trait Mixin
*/
public static function allWritable($value, $message = '')
{
- static::__callStatic('allWritable', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::writable($entry, $message);
+ }
+ }
+
+ /**
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrWritable($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::writable($entry, $message);
+ }
}
/**
@@ -2248,7 +3912,7 @@ trait Mixin
*/
public static function nullOrClassExists($value, $message = '')
{
- static::__callStatic('nullOrClassExists', array($value, $message));
+ null === $value || static::classExists($value, $message);
}
/**
@@ -2263,7 +3927,30 @@ trait Mixin
*/
public static function allClassExists($value, $message = '')
{
- static::__callStatic('allClassExists', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::classExists($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-assert iterable<class-string|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrClassExists($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::classExists($entry, $message);
+ }
}
/**
@@ -2282,7 +3969,7 @@ trait Mixin
*/
public static function nullOrSubclassOf($value, $class, $message = '')
{
- static::__callStatic('nullOrSubclassOf', array($value, $class, $message));
+ null === $value || static::subclassOf($value, $class, $message);
}
/**
@@ -2301,7 +3988,34 @@ trait Mixin
*/
public static function allSubclassOf($value, $class, $message = '')
{
- static::__callStatic('allSubclassOf', array($value, $class, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::subclassOf($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $class
+ * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType|null> $value
+ *
+ * @param mixed $value
+ * @param string|object $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrSubclassOf($value, $class, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::subclassOf($entry, $class, $message);
+ }
}
/**
@@ -2316,7 +4030,7 @@ trait Mixin
*/
public static function nullOrInterfaceExists($value, $message = '')
{
- static::__callStatic('nullOrInterfaceExists', array($value, $message));
+ null === $value || static::interfaceExists($value, $message);
}
/**
@@ -2331,7 +4045,30 @@ trait Mixin
*/
public static function allInterfaceExists($value, $message = '')
{
- static::__callStatic('allInterfaceExists', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::interfaceExists($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-assert iterable<class-string|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrInterfaceExists($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::interfaceExists($entry, $message);
+ }
}
/**
@@ -2350,7 +4087,7 @@ trait Mixin
*/
public static function nullOrImplementsInterface($value, $interface, $message = '')
{
- static::__callStatic('nullOrImplementsInterface', array($value, $interface, $message));
+ null === $value || static::implementsInterface($value, $interface, $message);
}
/**
@@ -2369,7 +4106,34 @@ trait Mixin
*/
public static function allImplementsInterface($value, $interface, $message = '')
{
- static::__callStatic('allImplementsInterface', array($value, $interface, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::implementsInterface($entry, $interface, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template ExpectedType of object
+ * @psalm-param class-string<ExpectedType> $interface
+ * @psalm-assert iterable<class-string<ExpectedType>|null> $value
+ *
+ * @param mixed $value
+ * @param mixed $interface
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrImplementsInterface($value, $interface, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::implementsInterface($entry, $interface, $message);
+ }
}
/**
@@ -2386,7 +4150,7 @@ trait Mixin
*/
public static function nullOrPropertyExists($classOrObject, $property, $message = '')
{
- static::__callStatic('nullOrPropertyExists', array($classOrObject, $property, $message));
+ null === $classOrObject || static::propertyExists($classOrObject, $property, $message);
}
/**
@@ -2403,7 +4167,32 @@ trait Mixin
*/
public static function allPropertyExists($classOrObject, $property, $message = '')
{
- static::__callStatic('allPropertyExists', array($classOrObject, $property, $message));
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ static::propertyExists($entry, $property, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param iterable<class-string|object|null> $classOrObject
+ *
+ * @param iterable<string|object|null> $classOrObject
+ * @param mixed $property
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrPropertyExists($classOrObject, $property, $message = '')
+ {
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ null === $entry || static::propertyExists($entry, $property, $message);
+ }
}
/**
@@ -2420,7 +4209,7 @@ trait Mixin
*/
public static function nullOrPropertyNotExists($classOrObject, $property, $message = '')
{
- static::__callStatic('nullOrPropertyNotExists', array($classOrObject, $property, $message));
+ null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message);
}
/**
@@ -2437,7 +4226,32 @@ trait Mixin
*/
public static function allPropertyNotExists($classOrObject, $property, $message = '')
{
- static::__callStatic('allPropertyNotExists', array($classOrObject, $property, $message));
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ static::propertyNotExists($entry, $property, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param iterable<class-string|object|null> $classOrObject
+ *
+ * @param iterable<string|object|null> $classOrObject
+ * @param mixed $property
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '')
+ {
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ null === $entry || static::propertyNotExists($entry, $property, $message);
+ }
}
/**
@@ -2454,7 +4268,7 @@ trait Mixin
*/
public static function nullOrMethodExists($classOrObject, $method, $message = '')
{
- static::__callStatic('nullOrMethodExists', array($classOrObject, $method, $message));
+ null === $classOrObject || static::methodExists($classOrObject, $method, $message);
}
/**
@@ -2471,7 +4285,32 @@ trait Mixin
*/
public static function allMethodExists($classOrObject, $method, $message = '')
{
- static::__callStatic('allMethodExists', array($classOrObject, $method, $message));
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ static::methodExists($entry, $method, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param iterable<class-string|object|null> $classOrObject
+ *
+ * @param iterable<string|object|null> $classOrObject
+ * @param mixed $method
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMethodExists($classOrObject, $method, $message = '')
+ {
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ null === $entry || static::methodExists($entry, $method, $message);
+ }
}
/**
@@ -2488,7 +4327,7 @@ trait Mixin
*/
public static function nullOrMethodNotExists($classOrObject, $method, $message = '')
{
- static::__callStatic('nullOrMethodNotExists', array($classOrObject, $method, $message));
+ null === $classOrObject || static::methodNotExists($classOrObject, $method, $message);
}
/**
@@ -2505,7 +4344,32 @@ trait Mixin
*/
public static function allMethodNotExists($classOrObject, $method, $message = '')
{
- static::__callStatic('allMethodNotExists', array($classOrObject, $method, $message));
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ static::methodNotExists($entry, $method, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-param iterable<class-string|object|null> $classOrObject
+ *
+ * @param iterable<string|object|null> $classOrObject
+ * @param mixed $method
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMethodNotExists($classOrObject, $method, $message = '')
+ {
+ static::isIterable($classOrObject);
+
+ foreach ($classOrObject as $entry) {
+ null === $entry || static::methodNotExists($entry, $method, $message);
+ }
}
/**
@@ -2521,7 +4385,7 @@ trait Mixin
*/
public static function nullOrKeyExists($array, $key, $message = '')
{
- static::__callStatic('nullOrKeyExists', array($array, $key, $message));
+ null === $array || static::keyExists($array, $key, $message);
}
/**
@@ -2537,7 +4401,31 @@ trait Mixin
*/
public static function allKeyExists($array, $key, $message = '')
{
- static::__callStatic('allKeyExists', array($array, $key, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::keyExists($entry, $key, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<array|null> $array
+ * @param string|int $key
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrKeyExists($array, $key, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::keyExists($entry, $key, $message);
+ }
}
/**
@@ -2553,7 +4441,7 @@ trait Mixin
*/
public static function nullOrKeyNotExists($array, $key, $message = '')
{
- static::__callStatic('nullOrKeyNotExists', array($array, $key, $message));
+ null === $array || static::keyNotExists($array, $key, $message);
}
/**
@@ -2569,7 +4457,31 @@ trait Mixin
*/
public static function allKeyNotExists($array, $key, $message = '')
{
- static::__callStatic('allKeyNotExists', array($array, $key, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::keyNotExists($entry, $key, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<array|null> $array
+ * @param string|int $key
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrKeyNotExists($array, $key, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::keyNotExists($entry, $key, $message);
+ }
}
/**
@@ -2585,7 +4497,7 @@ trait Mixin
*/
public static function nullOrValidArrayKey($value, $message = '')
{
- static::__callStatic('nullOrValidArrayKey', array($value, $message));
+ null === $value || static::validArrayKey($value, $message);
}
/**
@@ -2601,7 +4513,31 @@ trait Mixin
*/
public static function allValidArrayKey($value, $message = '')
{
- static::__callStatic('allValidArrayKey', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::validArrayKey($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<array-key|null> $value
+ *
+ * @param mixed $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrValidArrayKey($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::validArrayKey($entry, $message);
+ }
}
/**
@@ -2615,7 +4551,7 @@ trait Mixin
*/
public static function nullOrCount($array, $number, $message = '')
{
- static::__callStatic('nullOrCount', array($array, $number, $message));
+ null === $array || static::count($array, $number, $message);
}
/**
@@ -2629,7 +4565,29 @@ trait Mixin
*/
public static function allCount($array, $number, $message = '')
{
- static::__callStatic('allCount', array($array, $number, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::count($entry, $number, $message);
+ }
+ }
+
+ /**
+ * @param iterable<Countable|array|null> $array
+ * @param int $number
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrCount($array, $number, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::count($entry, $number, $message);
+ }
}
/**
@@ -2643,7 +4601,7 @@ trait Mixin
*/
public static function nullOrMinCount($array, $min, $message = '')
{
- static::__callStatic('nullOrMinCount', array($array, $min, $message));
+ null === $array || static::minCount($array, $min, $message);
}
/**
@@ -2657,7 +4615,29 @@ trait Mixin
*/
public static function allMinCount($array, $min, $message = '')
{
- static::__callStatic('allMinCount', array($array, $min, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::minCount($entry, $min, $message);
+ }
+ }
+
+ /**
+ * @param iterable<Countable|array|null> $array
+ * @param int|float $min
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMinCount($array, $min, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::minCount($entry, $min, $message);
+ }
}
/**
@@ -2671,7 +4651,7 @@ trait Mixin
*/
public static function nullOrMaxCount($array, $max, $message = '')
{
- static::__callStatic('nullOrMaxCount', array($array, $max, $message));
+ null === $array || static::maxCount($array, $max, $message);
}
/**
@@ -2685,7 +4665,29 @@ trait Mixin
*/
public static function allMaxCount($array, $max, $message = '')
{
- static::__callStatic('allMaxCount', array($array, $max, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::maxCount($entry, $max, $message);
+ }
+ }
+
+ /**
+ * @param iterable<Countable|array|null> $array
+ * @param int|float $max
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrMaxCount($array, $max, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::maxCount($entry, $max, $message);
+ }
}
/**
@@ -2700,7 +4702,7 @@ trait Mixin
*/
public static function nullOrCountBetween($array, $min, $max, $message = '')
{
- static::__callStatic('nullOrCountBetween', array($array, $min, $max, $message));
+ null === $array || static::countBetween($array, $min, $max, $message);
}
/**
@@ -2715,7 +4717,30 @@ trait Mixin
*/
public static function allCountBetween($array, $min, $max, $message = '')
{
- static::__callStatic('allCountBetween', array($array, $min, $max, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::countBetween($entry, $min, $max, $message);
+ }
+ }
+
+ /**
+ * @param iterable<Countable|array|null> $array
+ * @param int|float $min
+ * @param int|float $max
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrCountBetween($array, $min, $max, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::countBetween($entry, $min, $max, $message);
+ }
}
/**
@@ -2731,7 +4756,7 @@ trait Mixin
*/
public static function nullOrIsList($array, $message = '')
{
- static::__callStatic('nullOrIsList', array($array, $message));
+ null === $array || static::isList($array, $message);
}
/**
@@ -2747,7 +4772,31 @@ trait Mixin
*/
public static function allIsList($array, $message = '')
{
- static::__callStatic('allIsList', array($array, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::isList($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<list|null> $array
+ *
+ * @param mixed $array
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsList($array, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::isList($entry, $message);
+ }
}
/**
@@ -2763,7 +4812,7 @@ trait Mixin
*/
public static function nullOrIsNonEmptyList($array, $message = '')
{
- static::__callStatic('nullOrIsNonEmptyList', array($array, $message));
+ null === $array || static::isNonEmptyList($array, $message);
}
/**
@@ -2779,7 +4828,31 @@ trait Mixin
*/
public static function allIsNonEmptyList($array, $message = '')
{
- static::__callStatic('allIsNonEmptyList', array($array, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::isNonEmptyList($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-assert iterable<non-empty-list|null> $array
+ *
+ * @param mixed $array
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsNonEmptyList($array, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::isNonEmptyList($entry, $message);
+ }
}
/**
@@ -2797,7 +4870,7 @@ trait Mixin
*/
public static function nullOrIsMap($array, $message = '')
{
- static::__callStatic('nullOrIsMap', array($array, $message));
+ null === $array || static::isMap($array, $message);
}
/**
@@ -2815,7 +4888,33 @@ trait Mixin
*/
public static function allIsMap($array, $message = '')
{
- static::__callStatic('allIsMap', array($array, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::isMap($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template T
+ * @psalm-param iterable<mixed|array<T>|null> $array
+ * @psalm-assert iterable<array<string, T>|null> $array
+ *
+ * @param mixed $array
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsMap($array, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::isMap($entry, $message);
+ }
}
/**
@@ -2832,7 +4931,7 @@ trait Mixin
*/
public static function nullOrIsNonEmptyMap($array, $message = '')
{
- static::__callStatic('nullOrIsNonEmptyMap', array($array, $message));
+ null === $array || static::isNonEmptyMap($array, $message);
}
/**
@@ -2849,7 +4948,34 @@ trait Mixin
*/
public static function allIsNonEmptyMap($array, $message = '')
{
- static::__callStatic('allIsNonEmptyMap', array($array, $message));
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ static::isNonEmptyMap($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ * @psalm-template T
+ * @psalm-param iterable<mixed|array<T>|null> $array
+ * @psalm-assert iterable<array<string, T>|null> $array
+ * @psalm-assert iterable<!empty|null> $array
+ *
+ * @param mixed $array
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrIsNonEmptyMap($array, $message = '')
+ {
+ static::isIterable($array);
+
+ foreach ($array as $entry) {
+ null === $entry || static::isNonEmptyMap($entry, $message);
+ }
}
/**
@@ -2864,7 +4990,7 @@ trait Mixin
*/
public static function nullOrUuid($value, $message = '')
{
- static::__callStatic('nullOrUuid', array($value, $message));
+ null === $value || static::uuid($value, $message);
}
/**
@@ -2879,7 +5005,30 @@ trait Mixin
*/
public static function allUuid($value, $message = '')
{
- static::__callStatic('allUuid', array($value, $message));
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ static::uuid($entry, $message);
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @param iterable<string|null> $value
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrUuid($value, $message = '')
+ {
+ static::isIterable($value);
+
+ foreach ($value as $entry) {
+ null === $entry || static::uuid($entry, $message);
+ }
}
/**
@@ -2895,7 +5044,7 @@ trait Mixin
*/
public static function nullOrThrows($expression, $class = 'Exception', $message = '')
{
- static::__callStatic('nullOrThrows', array($expression, $class, $message));
+ null === $expression || static::throws($expression, $class, $message);
}
/**
@@ -2911,6 +5060,30 @@ trait Mixin
*/
public static function allThrows($expression, $class = 'Exception', $message = '')
{
- static::__callStatic('allThrows', array($expression, $class, $message));
+ static::isIterable($expression);
+
+ foreach ($expression as $entry) {
+ static::throws($entry, $class, $message);
+ }
+ }
+
+ /**
+ * @psalm-param class-string<Throwable> $class
+ *
+ * @param iterable<Closure|null> $expression
+ * @param string $class
+ * @param string $message
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return void
+ */
+ public static function allNullOrThrows($expression, $class = 'Exception', $message = '')
+ {
+ static::isIterable($expression);
+
+ foreach ($expression as $entry) {
+ null === $entry || static::throws($entry, $class, $message);
+ }
}
}